REDROOM
PHP 8.2.30
Path:
Logout
Edit File
Size: 2.98 MB
Close
//opt/alt/php81/usr/bin/composer.phar
Text
Base64
IyEvdXNyL2Jpbi9lbnYgcGhwCjw/cGhwCi8qCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENvbXBvc2VyLgogKgogKiAoYykgTmlscyBBZGVybWFubiA8bmFkZXJtYW5AbmFkZXJtYW4uZGU+CiAqICAgICBKb3JkaSBCb2dnaWFubyA8ai5ib2dnaWFub0BzZWxkLmJlPgogKgogKiBGb3IgdGhlIGZ1bGwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIGluZm9ybWF0aW9uLCBwbGVhc2UgdmlldwogKiB0aGUgbGljZW5zZSB0aGF0IGlzIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUuCiAqLwoKLy8gQXZvaWQgQVBDIGNhdXNpbmcgcmFuZG9tIGZhdGFsIGVycm9ycyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy8yNjQKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ2FwYycpICYmIGZpbHRlcl92YXIoaW5pX2dldCgnYXBjLmVuYWJsZV9jbGknKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pICYmIGZpbHRlcl92YXIoaW5pX2dldCgnYXBjLmNhY2hlX2J5X2RlZmF1bHQnKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pKSB7CiAgICBpZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oJ2FwYycpLCAnMy4wLjEyJywgJz49JykpIHsKICAgICAgICBpbmlfc2V0KCdhcGMuY2FjaGVfYnlfZGVmYXVsdCcsIDApOwogICAgfSBlbHNlIHsKICAgICAgICBmd3JpdGUoU1RERVJSLCAnV2FybmluZzogQVBDIDw9IDMuMC4xMiBtYXkgY2F1c2UgZmF0YWwgZXJyb3JzIHdoZW4gcnVubmluZyBjb21wb3NlciBjb21tYW5kcy4nLlBIUF9FT0wpOwogICAgICAgIGZ3cml0ZShTVERFUlIsICdVcGRhdGUgQVBDLCBvciBzZXQgYXBjLmVuYWJsZV9jbGkgb3IgYXBjLmNhY2hlX2J5X2RlZmF1bHQgdG8gMCBpbiB5b3VyIHBocC5pbmkuJy5QSFBfRU9MKTsKICAgIH0KfQoKaWYgKCFjbGFzc19leGlzdHMoJ1BoYXInKSkgewogICAgZWNobyAnUEhQXCdzIHBoYXIgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuIENvbXBvc2VyIHJlcXVpcmVzIGl0IHRvIHJ1bi4gRW5hYmxlIHRoZSBleHRlbnNpb24gb3IgcmVjb21waWxlIHBocCB3aXRob3V0IC0tZGlzYWJsZS1waGFyIHRoZW4gdHJ5IGFnYWluLicgLiBQSFBfRU9MOwogICAgZXhpdCgxKTsKfQoKUGhhcjo6bWFwUGhhcignY29tcG9zZXIucGhhcicpOwpyZXF1aXJlICdwaGFyOi8vY29tcG9zZXIucGhhci9iaW4vY29tcG9zZXInOwoKX19IQUxUX0NPTVBJTEVSKCk7ID8+DQrsyAAAnwIAABEAAAABAA0AAABjb21wb3Nlci5waGFyAAAAACEAAABzcmMvQ29tcG9zZXIvQWR2aXNvcnkvQXVkaXRvci5waHDmJwAAoTQjaOYnAACPkdV0pAEAAAAAAAAxAAAAc3JjL0NvbXBvc2VyL0Fkdmlzb3J5L0lnbm9yZWRTZWN1cml0eUFkdmlzb3J5LnBocFQDAAChNCNoVAMAAA4ivO+kAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvQWR2aXNvcnkvUGFydGlhbFNlY3VyaXR5QWR2aXNvcnkucGhwCAUAAKE0I2gIBQAAlfTjFqQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9BZHZpc29yeS9TZWN1cml0eUFkdmlzb3J5LnBocPwEAAChNCNo/AQAALU1dDCkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvQXV0b2xvYWQvQXV0b2xvYWRHZW5lcmF0b3IucGhwEIoAAKE0I2gQigAAEkEAAKQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9BdXRvbG9hZC9DbGFzc01hcEdlbmVyYXRvci5waHCSBgAAoTQjaJIGAACPqHxTpAEAAAAAAAAWAAAAc3JjL0NvbXBvc2VyL0NhY2hlLnBocHgbAAChNCNoeBsAANCAJXqkAQAAAAAAACUAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9BYm91dENvbW1hbmQucGhwVwMAAKE0I2hXAwAA4jqGIaQBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0FyY2hpdmVDb21tYW5kLnBocEcbAAChNCNoRxsAADPtMuGkAQAAAAAAACUAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9BdWRpdENvbW1hbmQucGhwjg0AAKE0I2iODQAAEYfQ3KQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0Jhc2VDb21tYW5kLnBocF8rAAChNCNoXysAAIgpmdukAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9CYXNlRGVwZW5kZW5jeUNvbW1hbmQucGhw8iMAAKE0I2jyIwAAI6hyZKQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0J1bXBDb21tYW5kLnBocIEcAAChNCNogRwAAOgQDSKkAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9DaGVja1BsYXRmb3JtUmVxc0NvbW1hbmQucGhwYBYAAKE0I2hgFgAAH/k8dKQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0NsZWFyQ2FjaGVDb21tYW5kLnBocHwJAAChNCNofAkAAA3mTKCkAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9Db21wbGV0aW9uVHJhaXQucGhwVhYAAKE0I2hWFgAAEmM39aQBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0NvbmZpZ0NvbW1hbmQucGhwk3EAAKE0I2iTcQAAROzu2qQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0NyZWF0ZVByb2plY3RDb21tYW5kLnBocBxLAAChNCNoHEsAAAah446kAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9EZXBlbmRzQ29tbWFuZC5waHBFBQAAoTQjaEUFAACBFHoSpAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvRGlhZ25vc2VDb21tYW5kLnBocEpoAAChNCNoSmgAANMPJTqkAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9EdW1wQXV0b2xvYWRDb21tYW5kLnBocPkWAAChNCNo+RYAAEmq6IKkAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9FeGVjQ29tbWFuZC5waHATDAAAoTQjaBMMAABP7KEwpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvRnVuZENvbW1hbmQucGhwwQ4AAKE0I2jBDgAANWDIR6QBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0dsb2JhbENvbW1hbmQucGhwxA8AAKE0I2jEDwAAUSO9eaQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0hvbWVDb21tYW5kLnBocEcPAAChNCNoRw8AAKFnBIikAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9Jbml0Q29tbWFuZC5waHBbRQAAoTQjaFtFAABmjN2bpAEAAAAAAAAnAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvSW5zdGFsbENvbW1hbmQucGhwYRoAAKE0I2hhGgAA2+HFo6QBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0xpY2Vuc2VzQ29tbWFuZC5waHC9DwAAoTQjaL0PAADGg2ldpAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvT3V0ZGF0ZWRDb21tYW5kLnBocJITAAChNCNokhMAAEBjBI2kAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9QYWNrYWdlRGlzY292ZXJ5VHJhaXQucGhwnTYAAKE0I2idNgAAnPDzuqQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1Byb2hpYml0c0NvbW1hbmQucGhw5QUAAKE0I2jlBQAAykRy+KQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1JlaW5zdGFsbENvbW1hbmQucGhwfR0AAKE0I2h9HQAASQfo16QBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1JlbW92ZUNvbW1hbmQucGhw1S4AAKE0I2jVLgAAxqAgbaQBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1JlcXVpcmVDb21tYW5kLnBocJpaAAChNCNomloAAOgyTFikAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9SdW5TY3JpcHRDb21tYW5kLnBocBISAAChNCNoEhIAAB9mvwSkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9TY3JpcHRBbGlhc0NvbW1hbmQucGhw8gcAAKE0I2jyBwAAc+QqLaQBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1NlYXJjaENvbW1hbmQucGhwWQ8AAKE0I2hZDwAA8+yV/KQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1NlbGZVcGRhdGVDb21tYW5kLnBocGJMAAChNCNoYkwAAAQhmYGkAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9TaG93Q29tbWFuZC5waHDZvAAAoTQjaNm8AADULYP6pAEAAAAAAAAmAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvU3RhdHVzQ29tbWFuZC5waHC3FgAAoTQjaLcWAADpQpi+pAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvU3VnZ2VzdHNDb21tYW5kLnBocMkLAAChNCNoyQsAAPnPZmukAQAAAAAAACYAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9VcGRhdGVDb21tYW5kLnBocLVDAAChNCNotUMAAN5Q/PikAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9WYWxpZGF0ZUNvbW1hbmQucGhwJxsAAKE0I2gnGwAAjOnUyaQBAAAAAAAAGQAAAHNyYy9Db21wb3Nlci9Db21wb3Nlci5waHCdBwAAoTQjaJ0HAACIXEuipAEAAAAAAAAXAAAAc3JjL0NvbXBvc2VyL0NvbmZpZy5waHAMOgAAoTQjaAw6AAC9C1vCpAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL0NvbmZpZy9Db25maWdTb3VyY2VJbnRlcmZhY2UucGhwugIAAKE0I2i6AgAAf70Y06QBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9Db25maWcvSnNvbkNvbmZpZ1NvdXJjZS5waHDCGgAAoTQjaMIaAACOP3oCpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL0NvbnNvbGUvQXBwbGljYXRpb24ucGhwX1sAAKE0I2hfWwAAEGxrRqQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Db25zb2xlL0dpdGh1YkFjdGlvbkVycm9yLnBocA8FAAChNCNoDwUAAGCxieakAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvQ29uc29sZS9IdG1sT3V0cHV0Rm9ybWF0dGVyLnBocD4HAAChNCNoPgcAANIM71KkAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvQ29uc29sZS9JbnB1dC9JbnB1dEFyZ3VtZW50LnBocLYEAAChNCNotgQAAKoPvEukAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvQ29uc29sZS9JbnB1dC9JbnB1dE9wdGlvbi5waHBnBQAAoTQjaGcFAACINyc0pAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9EZWNpc2lvbnMucGhw6REAAKE0I2jpEQAAOyRAC6QBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvRGVmYXVsdFBvbGljeS5waHCyFwAAoTQjaLIXAADoTUoXpAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9HZW5lcmljUnVsZS5waHA2BAAAoTQjaDYEAAClsmx8pAEAAAAAAAA4AAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Mb2NhbFJlcG9UcmFuc2FjdGlvbi5waHC9AQAAoTQjaL0BAADfmkiapAEAAAAAAAAzAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Mb2NrVHJhbnNhY3Rpb24ucGhwQQ4AAKE0I2hBDgAAZrErcaQBAAAAAAAANQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvTXVsdGlDb25mbGljdFJ1bGUucGhwywUAAKE0I2jLBQAAtDkNjaQBAAAAAAAAPgAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvT3BlcmF0aW9uL0luc3RhbGxPcGVyYXRpb24ucGhw/wIAAKE0I2j/AgAAPfqnp6QBAAAAAAAASQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvT3BlcmF0aW9uL01hcmtBbGlhc0luc3RhbGxlZE9wZXJhdGlvbi5waHAWAwAAoTQjaBYDAAAAMU5KpAEAAAAAAABLAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9PcGVyYXRpb24vTWFya0FsaWFzVW5pbnN0YWxsZWRPcGVyYXRpb24ucGhwHAMAAKE0I2gcAwAAdHcNDaQBAAAAAAAAQAAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvT3BlcmF0aW9uL09wZXJhdGlvbkludGVyZmFjZS5waHD4AAAAoTQjaPgAAAAW91f9pAEAAAAAAAA9AAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9PcGVyYXRpb24vU29sdmVyT3BlcmF0aW9uLnBocEgBAAChNCNoSAEAAAQaFaekAQAAAAAAAEAAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL09wZXJhdGlvbi9Vbmluc3RhbGxPcGVyYXRpb24ucGhw5wIAAKE0I2jnAgAAfMFSE6QBAAAAAAAAPQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvT3BlcmF0aW9uL1VwZGF0ZU9wZXJhdGlvbi5waHCfBwAAoTQjaJ8HAADcN+akpAEAAAAAAAAzAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Qb2xpY3lJbnRlcmZhY2UucGhwngEAAKE0I2ieAQAA+AHO4aQBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUG9vbC5waHCgEgAAoTQjaKASAAB4RiEXpAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Qb29sQnVpbGRlci5waHDLSgAAoTQjaMtKAACSQPhJpAEAAAAAAAAxAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Qb29sT3B0aW1pemVyLnBocPUpAAChNCNo9SkAAEtZlQakAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1Byb2JsZW0ucGhwtV0AAKE0I2i1XQAAC+HHeaQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUmVxdWVzdC5waHCYEAAAoTQjaJgQAAAkoxiUpAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlLnBocLUwAAChNCNotTAAAMp7oFGkAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1J1bGUyTGl0ZXJhbHMucGhwAQUAAKE0I2gBBQAADzN2/qQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUnVsZVNldC5waHC+CwAAoTQjaL4LAAC5HnWopAEAAAAAAAA0AAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlU2V0R2VuZXJhdG9yLnBocEMbAAChNCNoQxsAAC9dWp6kAQAAAAAAADMAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1J1bGVTZXRJdGVyYXRvci5waHD1BQAAoTQjaPUFAACcDHkTpAEAAAAAAAAyAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlV2F0Y2hDaGFpbi5waHB7AQAAoTQjaHsBAACCaPNEpAEAAAAAAAAyAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlV2F0Y2hHcmFwaC5waHCcCQAAoTQjaJwJAABanHt8pAEAAAAAAAAxAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlV2F0Y2hOb2RlLnBocHYEAAChNCNodgQAAHCZCLekAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1NvbHZlci5waHBMOAAAoTQjaEw4AADTAFqypAEAAAAAAAA2AAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Tb2x2ZXJCdWdFeGNlcHRpb24ucGhwuQEAAKE0I2i5AQAAeq0WPaQBAAAAAAAAOwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvU29sdmVyUHJvYmxlbXNFeGNlcHRpb24ucGhwyxAAAKE0I2jLEAAAEqN/P6QBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvVHJhbnNhY3Rpb24ucGhwQxsAAKE0I2hDGwAAuQNdCqQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL0FyY2hpdmVEb3dubG9hZGVyLnBocO8RAAChNCNo7xEAAD/E/k6kAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9DaGFuZ2VSZXBvcnRJbnRlcmZhY2UucGhw9QAAAKE0I2j1AAAArcPCQqQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL0Rvd25sb2FkTWFuYWdlci5waHCqHwAAoTQjaKofAACynD9npAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvRG93bmxvYWRlckludGVyZmFjZS5waHDTAwAAoTQjaNMDAABibVvIpAEAAAAAAAAzAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvRHZjc0Rvd25sb2FkZXJJbnRlcmZhY2UucGhw+gAAAKE0I2j6AAAA4BElJ6QBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL0ZpbGVEb3dubG9hZGVyLnBocGg0AAChNCNoaDQAACReErCkAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9GaWxlc3lzdGVtRXhjZXB0aW9uLnBocC8BAAChNCNoLwEAACGL5SakAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9Gb3NzaWxEb3dubG9hZGVyLnBocFALAAChNCNoUAsAAITwOuCkAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9HaXREb3dubG9hZGVyLnBocJJDAAChNCNokkMAAPnuxhmkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9HemlwRG93bmxvYWRlci5waHCcBQAAoTQjaJwFAAAeMJX/pAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvSGdEb3dubG9hZGVyLnBocAELAAChNCNoAQsAAN0XkZukAQAAAAAAADgAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9NYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uLnBocIwAAAChNCNojAAAANq6HdSkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9QYXRoRG93bmxvYWRlci5waHBBIgAAoTQjaEEiAADS4L2lpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvUGVyZm9yY2VEb3dubG9hZGVyLnBocIsJAAChNCNoiwkAAJA8rZ2kAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9QaGFyRG93bmxvYWRlci5waHCqAQAAoTQjaKoBAABYyMgSpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvUmFyRG93bmxvYWRlci5waHBkBgAAoTQjaGQGAABHJxewpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvU3ZuRG93bmxvYWRlci5waHB+GAAAoTQjaH4YAAAOyEMSpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvVGFyRG93bmxvYWRlci5waHCoAQAAoTQjaKgBAADXct+CpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvVHJhbnNwb3J0RXhjZXB0aW9uLnBocAoEAAChNCNoCgQAAN7pOoekAQAAAAAAADkAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9WY3NDYXBhYmxlRG93bmxvYWRlckludGVyZmFjZS5waHD9AAAAoTQjaP0AAAAd5DakpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvVmNzRG93bmxvYWRlci5waHBBHQAAoTQjaEEdAADGM160pAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvWHpEb3dubG9hZGVyLnBocIgCAAChNCNoiAIAAEUnp8GkAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9aaXBEb3dubG9hZGVyLnBocP8mAAChNCNo/yYAAFzqttOkAQAAAAAAACYAAABzcmMvQ29tcG9zZXIvRXZlbnREaXNwYXRjaGVyL0V2ZW50LnBocNgCAAChNCNo2AIAAIX3ofCkAQAAAAAAADAAAABzcmMvQ29tcG9zZXIvRXZlbnREaXNwYXRjaGVyL0V2ZW50RGlzcGF0Y2hlci5waHAxSQAAoTQjaDFJAABjiQNepAEAAAAAAAA5AAAAc3JjL0NvbXBvc2VyL0V2ZW50RGlzcGF0Y2hlci9FdmVudFN1YnNjcmliZXJJbnRlcmZhY2UucGhwwgAAAKE0I2jCAAAAfT3pCKQBAAAAAAAAOQAAAHNyYy9Db21wb3Nlci9FdmVudERpc3BhdGNoZXIvU2NyaXB0RXhlY3V0aW9uRXhjZXB0aW9uLnBocJEAAAChNCNokQAAAFh26M+kAQAAAAAAADkAAABzcmMvQ29tcG9zZXIvRXhjZXB0aW9uL0lycmVjb3ZlcmFibGVEb3dubG9hZEV4Y2VwdGlvbi5waHCPAAAAoTQjaI8AAAAw3jQNpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0V4Y2VwdGlvbi9Ob1NzbEV4Y2VwdGlvbi5waHCBAAAAoTQjaIEAAADYVabSpAEAAAAAAAAYAAAAc3JjL0NvbXBvc2VyL0ZhY3RvcnkucGhw3VIAAKE0I2jdUgAAq8V/46QBAAAAAAAAVAAAAHNyYy9Db21wb3Nlci9GaWx0ZXIvUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci9JZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLnBocK4BAAChNCNorgEAABhaa6qkAQAAAAAAAFUAAABzcmMvQ29tcG9zZXIvRmlsdGVyL1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIvSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIucGhwLggAAKE0I2guCAAAITseGKQBAAAAAAAAWAAAAHNyYy9Db21wb3Nlci9GaWx0ZXIvUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci9JZ25vcmVOb3RoaW5nUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci5waHBUAQAAoTQjaFQBAADH4NkPpAEAAAAAAABSAAAAc3JjL0NvbXBvc2VyL0ZpbHRlci9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyL1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5LnBocHcDAAChNCNodwMAANFUA7+kAQAAAAAAAFQAAABzcmMvQ29tcG9zZXIvRmlsdGVyL1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIvUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZS5waHD4AAAAoTQjaPgAAACJtdJnpAEAAAAAAAAaAAAAc3JjL0NvbXBvc2VyL0lPL0Jhc2VJTy5waHDVFwAAoTQjaNUXAACnelDipAEAAAAAAAAcAAAAc3JjL0NvbXBvc2VyL0lPL0J1ZmZlcklPLnBocI8IAAChNCNojwgAAMfFow+kAQAAAAAAAB0AAABzcmMvQ29tcG9zZXIvSU8vQ29uc29sZUlPLnBocOsZAAChNCNo6xkAAAar/eKkAQAAAAAAAB8AAABzcmMvQ29tcG9zZXIvSU8vSU9JbnRlcmZhY2UucGhw0AcAAKE0I2jQBwAAfv9oraQBAAAAAAAAGgAAAHNyYy9Db21wb3Nlci9JTy9OdWxsSU8ucGhwTwUAAKE0I2hPBQAAYoioc6QBAAAAAAAAGgAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIucGhw1I8AAKE0I2jUjwAAzC1a3qQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvQmluYXJ5SW5zdGFsbGVyLnBocAQqAAChNCNoBCoAALCGWaWkAQAAAAAAADIAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL0JpbmFyeVByZXNlbmNlSW50ZXJmYWNlLnBocOYAAAChNCNo5gAAAK4zl4ykAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL0luc3RhbGxhdGlvbk1hbmFnZXIucGhwAzYAAKE0I2gDNgAA0f4uqaQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvSW5zdGFsbGVyRXZlbnQucGhwKgQAAKE0I2gqBAAARlrk2aQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvSW5zdGFsbGVyRXZlbnRzLnBocKUAAAChNCNopQAAAD6V7cekAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL0luc3RhbGxlckludGVyZmFjZS5waHB+BAAAoTQjaH4EAAAAzZTVpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9MaWJyYXJ5SW5zdGFsbGVyLnBocA8eAAChNCNoDx4AALodYzKkAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL01ldGFwYWNrYWdlSW5zdGFsbGVyLnBocNYIAAChNCNo1ggAAPsK9SKkAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL05vb3BJbnN0YWxsZXIucGhwYQcAAKE0I2hhBwAA6nhRbqQBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvUGFja2FnZUV2ZW50LnBocPQEAAChNCNo9AQAAGKRXEGkAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL1BhY2thZ2VFdmVudHMucGhw+wEAAKE0I2j7AQAA8qt/S6QBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvUGx1Z2luSW5zdGFsbGVyLnBocI0NAAChNCNojQ0AAPKUPRmkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL1Byb2plY3RJbnN0YWxsZXIucGhwOQkAAKE0I2g5CQAAAVXRhqQBAAAAAAAANAAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlci5waHCxEQAAoTQjaLERAACNAlhppAEAAAAAAAAeAAAAc3JjL0NvbXBvc2VyL0pzb24vSnNvbkZpbGUucGhwVx0AAKE0I2hXHQAAkWImlKQBAAAAAAAAIwAAAHNyYy9Db21wb3Nlci9Kc29uL0pzb25Gb3JtYXR0ZXIucGhwjAYAAKE0I2iMBgAAMNv5ZKQBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9Kc29uL0pzb25NYW5pcHVsYXRvci5waHCROAAAoTQjaJE4AAAUbrcUpAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL0pzb24vSnNvblZhbGlkYXRpb25FeGNlcHRpb24ucGhwlwEAAKE0I2iXAQAAnV5etKQBAAAAAAAAMgAAAHNyYy9Db21wb3Nlci9QSFBTdGFuL0NvbmZpZ1JldHVyblR5cGVFeHRlbnNpb24ucGhwChQAAKE0I2gKFAAAhkPrUKQBAAAAAAAAOgAAAHNyYy9Db21wb3Nlci9QSFBTdGFuL1J1bGVSZWFzb25EYXRhUmV0dXJuVHlwZUV4dGVuc2lvbi5waHB+CAAAoTQjaH4IAACm56xIpAEAAAAAAAAlAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQWxpYXNQYWNrYWdlLnBocLgYAAChNCNouBgAAAjdQjGkAQAAAAAAADcAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9BcmNoaXZhYmxlRmlsZXNGaWx0ZXIucGhwUwIAAKE0I2hTAgAAJzI1ZqQBAAAAAAAANwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0FyY2hpdmVyL0FyY2hpdmFibGVGaWxlc0ZpbmRlci5waHDVBgAAoTQjaNUGAAAz5E4epAEAAAAAAAAwAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQXJjaGl2ZXIvQXJjaGl2ZU1hbmFnZXIucGhwfhQAAKE0I2h+FAAAtiZPu6QBAAAAAAAAMwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0FyY2hpdmVyL0FyY2hpdmVySW50ZXJmYWNlLnBocFMBAAChNCNoUwEAAP/sP+6kAQAAAAAAADMAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9CYXNlRXhjbHVkZUZpbHRlci5waHAQBwAAoTQjaBAHAAB4xjbIpAEAAAAAAAA3AAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQXJjaGl2ZXIvQ29tcG9zZXJFeGNsdWRlRmlsdGVyLnBocD8BAAChNCNoPwEAAD+PYF6kAQAAAAAAADIAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9HaXRFeGNsdWRlRmlsdGVyLnBocCQDAAChNCNoJAMAAHSPOE6kAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9QaGFyQXJjaGl2ZXIucGhw6gkAAKE0I2jqCQAArAYHkqQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0FyY2hpdmVyL1ppcEFyY2hpdmVyLnBocBIHAAChNCNoEgcAAIxxAQ6kAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9CYXNlUGFja2FnZS5waHApEgAAoTQjaCkSAACi9S8CpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQ29tcGFyZXIvQ29tcGFyZXIucGhw0gkAAKE0I2jSCQAA+9qwiKQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0NvbXBsZXRlQWxpYXNQYWNrYWdlLnBocHEKAAChNCNocQoAAPogI7ekAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Db21wbGV0ZVBhY2thZ2UucGhwBQoAAKE0I2gFCgAAhqBKsaQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0NvbXBsZXRlUGFja2FnZUludGVyZmFjZS5waHCdBQAAoTQjaJ0FAACJkZQXpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvRHVtcGVyL0FycmF5RHVtcGVyLnBocLgNAAChNCNouA0AAJbalXWkAQAAAAAAAB0AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9MaW5rLnBocPYHAAChNCNo9gcAAKAiaqWkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Mb2FkZXIvQXJyYXlMb2FkZXIucGhwKC4AAKE0I2goLgAAwYN3eaQBAAAAAAAANwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0xvYWRlci9JbnZhbGlkUGFja2FnZUV4Y2VwdGlvbi5waHCEAgAAoTQjaIQCAADoTfyVpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvTG9hZGVyL0pzb25Mb2FkZXIucGhwkwMAAKE0I2iTAwAA6KSiNKQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0xvYWRlci9Mb2FkZXJJbnRlcmZhY2UucGhwngEAAKE0I2ieAQAAF0ZCpKQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0xvYWRlci9Sb290UGFja2FnZUxvYWRlci5waHDMHQAAoTQjaMwdAAB8G7OSpAEAAAAAAAA1AAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvTG9hZGVyL1ZhbGlkYXRpbmdBcnJheUxvYWRlci5waHA3UgAAoTQjaDdSAABokjWvpAEAAAAAAAAfAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvTG9ja2VyLnBocHU0AAChNCNodTQAANmcjJ2kAQAAAAAAACAAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9QYWNrYWdlLnBocBUlAAChNCNoFSUAAM5i9v6kAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9QYWNrYWdlSW50ZXJmYWNlLnBocAMMAAChNCNoAwwAAKEZRaSkAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Sb290QWxpYXNQYWNrYWdlLnBocOcLAAChNCNo5wsAAEE6lkSkAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Sb290UGFja2FnZS5waHCpBQAAoTQjaKkFAAAdGwm6pAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvUm9vdFBhY2thZ2VJbnRlcmZhY2UucGhwPQUAAKE0I2g9BQAAttldxKQBAAAAAAAAMAAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL1ZlcnNpb24vU3RhYmlsaXR5RmlsdGVyLnBocBQCAAChNCNoFAIAAB3daGqkAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9WZXJzaW9uL1ZlcnNpb25CdW1wZXIucGhw/wsAAKE0I2j/CwAA8VMOQaQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL1ZlcnNpb24vVmVyc2lvbkd1ZXNzZXIucGhwKCsAAKE0I2goKwAA0rM4YaQBAAAAAAAALgAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL1ZlcnNpb24vVmVyc2lvblBhcnNlci5waHDUBwAAoTQjaNQHAADY4JLmpAEAAAAAAAAwAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvVmVyc2lvbi9WZXJzaW9uU2VsZWN0b3IucGhwbhoAAKE0I2huGgAAhE5VjKQBAAAAAAAAIAAAAHNyYy9Db21wb3Nlci9QYXJ0aWFsQ29tcG9zZXIucGhwlAYAAKE0I2iUBgAArDGwxqQBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9QbGF0Zm9ybS9IaHZtRGV0ZWN0b3IucGhwEQUAAKE0I2gRBQAAjbHz6KQBAAAAAAAAIQAAAHNyYy9Db21wb3Nlci9QbGF0Zm9ybS9SdW50aW1lLnBocPIEAAChNCNo8gQAACdWoDWkAQAAAAAAACEAAABzcmMvQ29tcG9zZXIvUGxhdGZvcm0vVmVyc2lvbi5waHCqBwAAoTQjaKoHAADLXa/fpAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9DYXBhYmlsaXR5L0NhcGFiaWxpdHkucGhwcAAAAKE0I2hwAAAAmiNjO6QBAAAAAAAAMgAAAHNyYy9Db21wb3Nlci9QbHVnaW4vQ2FwYWJpbGl0eS9Db21tYW5kUHJvdmlkZXIucGhwsAAAAKE0I2iwAAAARvzZpKQBAAAAAAAAHwAAAHNyYy9Db21wb3Nlci9QbHVnaW4vQ2FwYWJsZS5waHCYAAAAoTQjaJgAAAD7sGiqpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9Db21tYW5kRXZlbnQucGhwPwMAAKE0I2g/AwAAfFVgHqQBAAAAAAAALgAAAHNyYy9Db21wb3Nlci9QbHVnaW4vUGx1Z2luQmxvY2tlZEV4Y2VwdGlvbi5waHCnAAAAoTQjaKcAAAAR9vlypAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9QbHVnaW5FdmVudHMucGhwqAEAAKE0I2ioAQAAXEuT1qQBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9QbHVnaW4vUGx1Z2luSW50ZXJmYWNlLnBocKsBAAChNCNoqwEAAPUxaQ2kAQAAAAAAACUAAABzcmMvQ29tcG9zZXIvUGx1Z2luL1BsdWdpbk1hbmFnZXIucGhw+FIAAKE0I2j4UgAAQbce7KQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9QbHVnaW4vUG9zdEZpbGVEb3dubG9hZEV2ZW50LnBocL8FAAChNCNovwUAAOBAPomkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvUGx1Z2luL1ByZUNvbW1hbmRSdW5FdmVudC5waHAvAgAAoTQjaC8CAAAzCbEUpAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9QcmVGaWxlRG93bmxvYWRFdmVudC5waHCgBQAAoTQjaKAFAAC0cYpspAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9QcmVQb29sQ3JlYXRlRXZlbnQucGhwsQcAAKE0I2ixBwAABfO826QBAAAAAAAANAAAAHNyYy9Db21wb3Nlci9RdWVzdGlvbi9TdHJpY3RDb25maXJtYXRpb25RdWVzdGlvbi5waHCOBQAAoTQjaI4FAAAHDtFypAEAAAAAAAA1AAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvQWR2aXNvcnlQcm92aWRlckludGVyZmFjZS5waHCpAQAAoTQjaKkBAAAQldCwpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvQXJyYXlSZXBvc2l0b3J5LnBocDQaAAChNCNoNBoAALqN0tWkAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9BcnRpZmFjdFJlcG9zaXRvcnkucGhwfAwAAKE0I2h8DAAArPF+M6QBAAAAAAAAMgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0Nhbm9uaWNhbFBhY2thZ2VzVHJhaXQucGhwxAIAAKE0I2jEAgAAG6Z766QBAAAAAAAALgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0NvbXBvc2VyUmVwb3NpdG9yeS5waHBVtwAAoTQjaFW3AAC8lMiWpAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvQ29tcG9zaXRlUmVwb3NpdG9yeS5waHCFDAAAoTQjaIUMAAD7qxrfpAEAAAAAAAA7AAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvQ29uZmlndXJhYmxlUmVwb3NpdG9yeUludGVyZmFjZS5waHChAAAAoTQjaKEAAABjZSoypAEAAAAAAAAwAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvRmlsZXN5c3RlbVJlcG9zaXRvcnkucGhwmyoAAKE0I2ibKgAApqps9aQBAAAAAAAALAAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0ZpbHRlclJlcG9zaXRvcnkucGhwZxAAAKE0I2hnEAAAK69GvqQBAAAAAAAANAAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0luc3RhbGxlZEFycmF5UmVwb3NpdG9yeS5waHBYAQAAoTQjaFgBAAC8LFt/pAEAAAAAAAA5AAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvSW5zdGFsbGVkRmlsZXN5c3RlbVJlcG9zaXRvcnkucGhwSgEAAKE0I2hKAQAAJ2tD6KQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0luc3RhbGxlZFJlcG9zaXRvcnkucGhwbRgAAKE0I2htGAAA+jrUEqQBAAAAAAAAOAAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0luc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UucGhw4AAAAKE0I2jgAAAAvrL/Z6QBAAAAAAAANgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0ludmFsaWRSZXBvc2l0b3J5RXhjZXB0aW9uLnBocIcAAAChNCNohwAAAA1XPF+kAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9Mb2NrQXJyYXlSZXBvc2l0b3J5LnBocOIAAAChNCNo4gAAAABehvqkAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9QYWNrYWdlUmVwb3NpdG9yeS5waHAMBAAAoTQjaAwEAABcLyr+pAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUGF0aFJlcG9zaXRvcnkucGhw5hIAAKE0I2jmEgAA2plNuqQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1BlYXJSZXBvc2l0b3J5LnBocAcBAAChNCNoBwEAAFF1z2qkAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9QbGF0Zm9ybVJlcG9zaXRvcnkucGhwsVoAAKE0I2ixWgAArGhgUqQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1JlcG9zaXRvcnlGYWN0b3J5LnBocFcXAAChNCNoVxcAAOgRESikAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9SZXBvc2l0b3J5SW50ZXJmYWNlLnBocKUDAAChNCNopQMAADEi7wCkAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9SZXBvc2l0b3J5TWFuYWdlci5waHCiCwAAoTQjaKILAAAHLH1+pAEAAAAAAAA3AAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUmVwb3NpdG9yeVNlY3VyaXR5RXhjZXB0aW9uLnBocIgAAAChNCNoiAAAAHGc13SkAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9SZXBvc2l0b3J5U2V0LnBocAAjAAChNCNoACMAAJODeuWkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9SZXBvc2l0b3J5VXRpbHMucGhwmQQAAKE0I2iZBAAAKVuN3aQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Jvb3RQYWNrYWdlUmVwb3NpdG9yeS5waHBcAQAAoTQjaFwBAAC+YDn8pAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL0Zvc3NpbERyaXZlci5waHACFAAAoTQjaAIUAAAsWdNVpAEAAAAAAAAyAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL0dpdEJpdGJ1Y2tldERyaXZlci5waHDWJgAAoTQjaNYmAADreSGGpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL0dpdERyaXZlci5waHBFFwAAoTQjaEUXAAD6DXXIpAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL0dpdEh1YkRyaXZlci5waHDDOwAAoTQjaMM7AADcLq5zpAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL0dpdExhYkRyaXZlci5waHCOMgAAoTQjaI4yAAC1Jr9npAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL0hnRHJpdmVyLnBocI0TAAChNCNojRMAAHno98ekAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvUGVyZm9yY2VEcml2ZXIucGhwEQsAAKE0I2gRCwAAziX/2qQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Zjcy9Tdm5Ecml2ZXIucGhw/R4AAKE0I2j9HgAATxVdqaQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Zjcy9WY3NEcml2ZXIucGhwDQsAAKE0I2gNCwAAzib+OqQBAAAAAAAAMgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Zjcy9WY3NEcml2ZXJJbnRlcmZhY2UucGhwsQMAAKE0I2ixAwAAVIqE+KQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Zjc1JlcG9zaXRvcnkucGhwdzUAAKE0I2h3NQAAhYyjPqQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1ZlcnNpb25DYWNoZUludGVyZmFjZS5waHC5AAAAoTQjaLkAAACCaAiHpAEAAAAAAAAzAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvV3JpdGFibGVBcnJheVJlcG9zaXRvcnkucGhw2QIAAKE0I2jZAgAAbCa0I6QBAAAAAAAANwAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1dyaXRhYmxlUmVwb3NpdG9yeUludGVyZmFjZS5waHB3AgAAoTQjaHcCAADVfrwwpAEAAAAAAAAdAAAAc3JjL0NvbXBvc2VyL1NjcmlwdC9FdmVudC5waHDlBAAAoTQjaOUEAACKvKB5pAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1NjcmlwdC9TY3JpcHRFdmVudHMucGhwSQMAAKE0I2hJAwAApKNENKQBAAAAAAAAIAAAAHNyYy9Db21wb3Nlci9TZWxmVXBkYXRlL0tleXMucGhw2QEAAKE0I2jZAQAAyQyoc6QBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9TZWxmVXBkYXRlL1ZlcnNpb25zLnBocF0JAAChNCNoXQkAAAfYFY6kAQAAAAAAACAAAABzcmMvQ29tcG9zZXIvVXRpbC9BdXRoSGVscGVyLnBocHYjAAChNCNodiMAADPMHrGkAQAAAAAAAB8AAABzcmMvQ29tcG9zZXIvVXRpbC9CaXRidWNrZXQucGhwThoAAKE0I2hOGgAAagtqFaQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9VdGlsL0NvbXBvc2VyTWlycm9yLnBocBwGAAChNCNoHAYAAAWjNMukAQAAAAAAACUAAABzcmMvQ29tcG9zZXIvVXRpbC9Db25maWdWYWxpZGF0b3IucGhwcxgAAKE0I2hzGAAA1Uih/KQBAAAAAAAAIgAAAHNyYy9Db21wb3Nlci9VdGlsL0Vycm9ySGFuZGxlci5waHCACQAAoTQjaIAJAAB6ChSopAEAAAAAAAAgAAAAc3JjL0NvbXBvc2VyL1V0aWwvRmlsZXN5c3RlbS5waHDhQQAAoTQjaOFBAADy7iG2pAEAAAAAAAAZAAAAc3JjL0NvbXBvc2VyL1V0aWwvR2l0LnBocF9CAAChNCNoX0IAACrWpwmkAQAAAAAAABwAAABzcmMvQ29tcG9zZXIvVXRpbC9HaXRIdWIucGhwPxQAAKE0I2g/FAAAocWybqQBAAAAAAAAHAAAAHNyYy9Db21wb3Nlci9VdGlsL0dpdExhYi5waHDmHQAAoTQjaOYdAADYLHAMpAEAAAAAAAAYAAAAc3JjL0NvbXBvc2VyL1V0aWwvSGcucGhwhQkAAKE0I2iFCQAAuBeS+KQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9VdGlsL0h0dHAvQ3VybERvd25sb2FkZXIucGhwRFAAAKE0I2hEUAAAXqEwm6QBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9VdGlsL0h0dHAvQ3VybFJlc3BvbnNlLnBocJUBAAChNCNolQEAAJI7qbmkAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvVXRpbC9IdHRwL1Byb3h5SXRlbS5waHBFCAAAoTQjaEUIAAB5n93VpAEAAAAAAAAnAAAAc3JjL0NvbXBvc2VyL1V0aWwvSHR0cC9Qcm94eU1hbmFnZXIucGhwugkAAKE0I2i6CQAAp0lJL6QBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9VdGlsL0h0dHAvUmVxdWVzdFByb3h5LnBocIYIAAChNCNohggAAFlEPx2kAQAAAAAAACMAAABzcmMvQ29tcG9zZXIvVXRpbC9IdHRwL1Jlc3BvbnNlLnBocN4FAAChNCNo3gUAANyFC6OkAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvVXRpbC9IdHRwRG93bmxvYWRlci5waHDvKQAAoTQjaO8pAADzJ2v2pAEAAAAAAAAfAAAAc3JjL0NvbXBvc2VyL1V0aWwvSW5pSGVscGVyLnBocI4CAAChNCNojgIAAJltrkKkAQAAAAAAABoAAABzcmMvQ29tcG9zZXIvVXRpbC9Mb29wLnBocP0HAAChNCNo/QcAAJ/7DqOkAQAAAAAAACYAAABzcmMvQ29tcG9zZXIvVXRpbC9NZXRhZGF0YU1pbmlmaWVyLnBocEMBAAChNCNoQwEAAGQYDJikAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvVXRpbC9Ob1Byb3h5UGF0dGVybi5waHAoFwAAoTQjaCgXAABN+w2hpAEAAAAAAAAhAAAAc3JjL0NvbXBvc2VyL1V0aWwvUGFja2FnZUluZm8ucGhw4AIAAKE0I2jgAgAAj1IYWKQBAAAAAAAAIwAAAHNyYy9Db21wb3Nlci9VdGlsL1BhY2thZ2VTb3J0ZXIucGhwxQgAAKE0I2jFCAAA9rWbnqQBAAAAAAAAHgAAAHNyYy9Db21wb3Nlci9VdGlsL1BlcmZvcmNlLnBocE41AAChNCNoTjUAAKrRezSkAQAAAAAAAB4AAABzcmMvQ29tcG9zZXIvVXRpbC9QbGF0Zm9ybS5waHDLFQAAoTQjaMsVAAAg8+D4pAEAAAAAAAAlAAAAc3JjL0NvbXBvc2VyL1V0aWwvUHJvY2Vzc0V4ZWN1dG9yLnBocJkqAAChNCNomSoAAFZRc3ekAQAAAAAAACYAAABzcmMvQ29tcG9zZXIvVXRpbC9SZW1vdGVGaWxlc3lzdGVtLnBocLVBAAChNCNotUEAAKlsZgOkAQAAAAAAAB4AAABzcmMvQ29tcG9zZXIvVXRpbC9TaWxlbmNlci5waHDxAgAAoTQjaPECAABHnc9FpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL1V0aWwvU3RyZWFtQ29udGV4dEZhY3RvcnkucGhwmBQAAKE0I2iYFAAAe65U36QBAAAAAAAAGQAAAHNyYy9Db21wb3Nlci9VdGlsL1N2bi5waHCbFAAAoTQjaJsUAACDdFSipAEAAAAAAAAgAAAAc3JjL0NvbXBvc2VyL1V0aWwvU3luY0hlbHBlci5waHD/BAAAoTQjaP8EAADQehtBpAEAAAAAAAAZAAAAc3JjL0NvbXBvc2VyL1V0aWwvVGFyLnBocJEEAAChNCNokQQAAA1oxvSkAQAAAAAAAB8AAABzcmMvQ29tcG9zZXIvVXRpbC9UbHNIZWxwZXIucGhwpwsAAKE0I2inCwAAJf54LaQBAAAAAAAAGQAAAHNyYy9Db21wb3Nlci9VdGlsL1VybC5waHDLDAAAoTQjaMsMAAAWNGYGpAEAAAAAAAAZAAAAc3JjL0NvbXBvc2VyL1V0aWwvWmlwLnBocA8IAAChNCNoDwgAAKNE2ZGkAQAAAAAAABEAAABzcmMvYm9vdHN0cmFwLnBocAoCAAChNCNoCgIAANHELcikAQAAAAAAACUAAABzcmMvQ29tcG9zZXIvQXV0b2xvYWQvQ2xhc3NMb2FkZXIucGhw+j8AAKE0I2j6PwAAMkAcdaQBAAAAAAAAIgAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZWRWZXJzaW9ucy5waHDzQwAAoTQjaPNDAAAPPG53pAEAAAAAAAAdAAAAcmVzL2NvbXBvc2VyLWxvY2stc2NoZW1hLmpzb26vDQAAoTQjaK8NAAC3xnJmpAEAAAAAAAAjAAAAcmVzL2NvbXBvc2VyLXJlcG9zaXRvcnktc2NoZW1hLmpzb274IAAAoTQjaPggAADX67iCpAEAAAAAAAAYAAAAcmVzL2NvbXBvc2VyLXNjaGVtYS5qc29uW+EAAKE0I2hb4QAAeye32qQBAAAAAAAAEwAAAHZlbmRvci9hdXRvbG9hZC5waHBsAgAAoTQjaGwCAAB4mxQ4pAEAAAAAAAAfAAAAdmVuZG9yL2NvbXBvc2VyL0NsYXNzTG9hZGVyLnBocC8cAAChNCNoLxwAAJjV4pKkAQAAAAAAACUAAAB2ZW5kb3IvY29tcG9zZXIvSW5zdGFsbGVkVmVyc2lvbnMucGhw5xgAAKE0I2jnGAAAoEXOSqQBAAAAAAAAJQAAAHZlbmRvci9jb21wb3Nlci9hdXRvbG9hZF9jbGFzc21hcC5waHDkAwAAoTQjaOQDAAAiKQIWpAEAAAAAAAAiAAAAdmVuZG9yL2NvbXBvc2VyL2F1dG9sb2FkX2ZpbGVzLnBocBIEAAChNCNoEgQAAItlYmSkAQAAAAAAACcAAAB2ZW5kb3IvY29tcG9zZXIvYXV0b2xvYWRfbmFtZXNwYWNlcy5waHBaAAAAoTQjaFoAAADrpuGWpAEAAAAAAAAhAAAAdmVuZG9yL2NvbXBvc2VyL2F1dG9sb2FkX3BzcjQucGhw7QgAAKE0I2jtCAAA17UOi6QBAAAAAAAAIQAAAHZlbmRvci9jb21wb3Nlci9hdXRvbG9hZF9yZWFsLnBocMYEAAChNCNoxgQAAAHOd3OkAQAAAAAAACMAAAB2ZW5kb3IvY29tcG9zZXIvYXV0b2xvYWRfc3RhdGljLnBocJYYAAChNCNolhgAAErdaD+kAQAAAAAAACEAAAB2ZW5kb3IvY29tcG9zZXIvY2EtYnVuZGxlL0xJQ0VOU0UeBAAAoTQjaB4EAABHCQdfpAEAAAAAAAAoAAAAdmVuZG9yL2NvbXBvc2VyL2NhLWJ1bmRsZS9yZXMvY2FjZXJ0LnBlbS+PAwChNCNoL48DAJzEXHukAQAAAAAAACoAAAB2ZW5kb3IvY29tcG9zZXIvY2EtYnVuZGxlL3NyYy9DYUJ1bmRsZS5waHAIEwAAoTQjaAgTAABuqhS/pAEAAAAAAAArAAAAdmVuZG9yL2NvbXBvc2VyL2NsYXNzLW1hcC1nZW5lcmF0b3IvTElDRU5TRR4EAAChNCNoHgQAAD35vvWkAQAAAAAAADQAAAB2ZW5kb3IvY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci9zcmMvQ2xhc3NNYXAucGhwBwoAAKE0I2gHCgAA2dpxj6QBAAAAAAAAPQAAAHZlbmRvci9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3NyYy9DbGFzc01hcEdlbmVyYXRvci5waHBZGwAAoTQjaFkbAABfI6FopAEAAAAAAAA0AAAAdmVuZG9yL2NvbXBvc2VyL2NsYXNzLW1hcC1nZW5lcmF0b3Ivc3JjL0ZpbGVMaXN0LnBocCQBAAChNCNoJAEAAGj0U3GkAQAAAAAAADoAAAB2ZW5kb3IvY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci9zcmMvUGhwRmlsZUNsZWFuZXIucGhwIBAAAKE0I2ggEAAALzw7KqQBAAAAAAAAOQAAAHZlbmRvci9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3NyYy9QaHBGaWxlUGFyc2VyLnBocJgMAAChNCNomAwAAPTvzKOkAQAAAAAAAB4AAAB2ZW5kb3IvY29tcG9zZXIvaW5zdGFsbGVkLmpzb26HMAEAoTQjaIcwAQAz3f4OpAEAAAAAAAAdAAAAdmVuZG9yL2NvbXBvc2VyL2luc3RhbGxlZC5waHCaIQAAoTQjaJohAAAoaccLpAEAAAAAAAApAAAAdmVuZG9yL2NvbXBvc2VyL21ldGFkYXRhLW1pbmlmaWVyL0xJQ0VOU0UeBAAAoTQjaB4EAAC9o+vHpAEAAAAAAAA6AAAAdmVuZG9yL2NvbXBvc2VyL21ldGFkYXRhLW1pbmlmaWVyL3NyYy9NZXRhZGF0YU1pbmlmaWVyLnBocNAEAAChNCNo0AQAAMIwJsCkAQAAAAAAABwAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9MSUNFTlNFHgQAAKE0I2geBAAAvaPrx6QBAAAAAAAAKwAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9NYXRjaEFsbFJlc3VsdC5waHAdAQAAoTQjaB0BAAAJXDn/pAEAAAAAAAA3AAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL01hdGNoQWxsU3RyaWN0R3JvdXBzUmVzdWx0LnBocCkBAAChNCNoKQEAAGhJn4WkAQAAAAAAADYAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvTWF0Y2hBbGxXaXRoT2Zmc2V0c1Jlc3VsdC5waHAqAQAAoTQjaCoBAAD4QQngpAEAAAAAAAAoAAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL01hdGNoUmVzdWx0LnBocO8AAAChNCNo7wAAADwG5MCkAQAAAAAAADQAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvTWF0Y2hTdHJpY3RHcm91cHNSZXN1bHQucGhw+wAAAKE0I2j7AAAAp8swUaQBAAAAAAAAMwAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9NYXRjaFdpdGhPZmZzZXRzUmVzdWx0LnBocPwAAAChNCNo/AAAAHsqLG+kAQAAAAAAADwAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvUEhQU3Rhbi9JbnZhbGlkUmVnZXhQYXR0ZXJuUnVsZS5waHDiCwAAoTQjaOILAAD82O7XpAEAAAAAAAAzAAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL1BIUFN0YW4vUHJlZ01hdGNoRmxhZ3MucGhwcAcAAKE0I2hwBwAAWcoYTaQBAAAAAAAARwAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9QSFBTdGFuL1ByZWdNYXRjaFBhcmFtZXRlck91dFR5cGVFeHRlbnNpb24ucGhwMQcAAKE0I2gxBwAAwn3M0qQBAAAAAAAARQAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9QSFBTdGFuL1ByZWdNYXRjaFR5cGVTcGVjaWZ5aW5nRXh0ZW5zaW9uLnBocNkLAAChNCNo2QsAAEMSusekAQAAAAAAAEwAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvUEhQU3Rhbi9QcmVnUmVwbGFjZUNhbGxiYWNrQ2xvc3VyZVR5cGVFeHRlbnNpb24ucGhwiAcAAKE0I2iIBwAA2AT4L6QBAAAAAAAAPwAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9QSFBTdGFuL1Vuc2FmZVN0cmljdEdyb3Vwc0NhbGxSdWxlLnBocGsKAAChNCNoawoAABszRb2kAQAAAAAAACoAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvUGNyZUV4Y2VwdGlvbi5waHBqAwAAoTQjaGoDAAAqu6pcpAEAAAAAAAAhAAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL1ByZWcucGhwMCIAAKE0I2gwIgAA0bmUe6QBAAAAAAAAIgAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9SZWdleC5waHAEDQAAoTQjaAQNAACj+euHpAEAAAAAAAAqAAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL1JlcGxhY2VSZXN1bHQucGhwFgEAAKE0I2gWAQAAJ7HI8KQBAAAAAAAAOQAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9VbmV4cGVjdGVkTnVsbE1hdGNoRXhjZXB0aW9uLnBocBIBAAChNCNoEgEAAKDuwPKkAQAAAAAAAB4AAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL0xJQ0VOU0UeBAAAoTQjaB4EAADHU1JtpAEAAAAAAAApAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvQ29tcGFyYXRvci5waHAQBAAAoTQjaBAEAABeX0WTpAEAAAAAAAAvAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvQ29tcGlsaW5nTWF0Y2hlci5waHBjBgAAoTQjaGMGAACEgA+mpAEAAAAAAAAvAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvQ29uc3RyYWludC9Cb3VuZC5waHB3BQAAoTQjaHcFAABXNF1XpAEAAAAAAAA0AAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvQ29uc3RyYWludC9Db25zdHJhaW50LnBocPgdAAChNCNo+B0AAJKLiL2kAQAAAAAAAD0AAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9Db25zdHJhaW50L0NvbnN0cmFpbnRJbnRlcmZhY2UucGhwoQEAAKE0I2ihAQAAjjW0eaQBAAAAAAAAPAAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbnN0cmFpbnQvTWF0Y2hBbGxDb25zdHJhaW50LnBocK8CAAChNCNorwIAALJFF/qkAQAAAAAAAD0AAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9Db25zdHJhaW50L01hdGNoTm9uZUNvbnN0cmFpbnQucGhwyQIAAKE0I2jJAgAA1q/YrqQBAAAAAAAAOQAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbnN0cmFpbnQvTXVsdGlDb25zdHJhaW50LnBocIoTAAChNCNoihMAAM3VG8SkAQAAAAAAACcAAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9JbnRlcnZhbC5waHDmAwAAoTQjaOYDAAA9WxRppAEAAAAAAAAoAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvSW50ZXJ2YWxzLnBocKQrAAChNCNopCsAAEAxuqukAQAAAAAAACUAAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9TZW12ZXIucGhw+QYAAKE0I2j5BgAA4RMtaaQBAAAAAAAALAAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL1ZlcnNpb25QYXJzZXIucGhw1y0AAKE0I2jXLQAAGCqbcKQBAAAAAAAAJQAAAHZlbmRvci9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL0xJQ0VOU0UeBAAAoTQjaB4EAADHU1JtpAEAAAAAAAA2AAAAdmVuZG9yL2NvbXBvc2VyL3NwZHgtbGljZW5zZXMvcmVzL3NwZHgtZXhjZXB0aW9ucy5qc29unxYAAKE0I2ifFgAAB89MKKQBAAAAAAAANAAAAHZlbmRvci9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3Jlcy9zcGR4LWxpY2Vuc2VzLmpzb24hEgEAoTQjaCESAQDtggHupAEAAAAAAAAyAAAAdmVuZG9yL2NvbXBvc2VyL3NwZHgtbGljZW5zZXMvc3JjL1NwZHhMaWNlbnNlcy5waHB7FQAAoTQjaHsVAAAIY0WdpAEAAAAAAAAmAAAAdmVuZG9yL2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyL0xJQ0VOU0UrBAAAoTQjaCsEAADW40BUpAEAAAAAAAAwAAAAdmVuZG9yL2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyL3NyYy9QaHBDb25maWcucGhwiQMAAKE0I2iJAwAAZ9SPdqQBAAAAAAAALgAAAHZlbmRvci9jb21wb3Nlci94ZGVidWctaGFuZGxlci9zcmMvUHJvY2Vzcy5waHDyBQAAoTQjaPIFAABmnloupAEAAAAAAAAtAAAAdmVuZG9yL2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyL3NyYy9TdGF0dXMucGhw0g0AAKE0I2jSDQAAsQHNdKQBAAAAAAAANAAAAHZlbmRvci9jb21wb3Nlci94ZGVidWctaGFuZGxlci9zcmMvWGRlYnVnSGFuZGxlci5waHDTLAAAoTQjaNMsAAA6QNPjpAEAAAAAAAAoAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvTElDRU5TRSIEAAChNCNoIgQAAAx8u5mkAQAAAAAAAEMAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50RXJyb3IucGhwehMAAKE0I2h6EwAAgTbBEKQBAAAAAAAATgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0Jhc2VDb25zdHJhaW50LnBocHEMAAChNCNocQwAALWpskWkAQAAAAAAAFQAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9Db2xsZWN0aW9uQ29uc3RyYWludC5waHB3CgAAoTQjaHcKAAAlujEqpAEAAAAAAABPAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvQ29uc3RDb25zdHJhaW50LnBocEgDAAChNCNoSAMAAN4T952kAQAAAAAAAEoAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9Db25zdHJhaW50LnBocJMOAAChNCNokw4AAN4W7qikAQAAAAAAAFMAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9Db25zdHJhaW50SW50ZXJmYWNlLnBocA8CAAChNCNoDwIAAK1W8eOkAQAAAAAAAE4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9FbnVtQ29uc3RyYWludC5waHDTAwAAoTQjaNMDAABwcWeLpAEAAAAAAABHAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRmFjdG9yeS5waHC7DQAAoTQjaLsNAADc47KVpAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRm9ybWF0Q29uc3RyYWludC5waHBzEgAAoTQjaHMSAACYqQaspAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvTnVtYmVyQ29uc3RyYWludC5waHBFCAAAoTQjaEUIAADPlEU8pAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvT2JqZWN0Q29uc3RyYWludC5waHCtEAAAoTQjaK0QAAD02aGTpAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvU2NoZW1hQ29uc3RyYWludC5waHBxCQAAoTQjaHEJAACnq6+cpAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvU3RyaW5nQ29uc3RyYWludC5waHAjBAAAoTQjaCMEAAD87DW6pAEAAAAAAABYAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvVHlwZUNoZWNrL0xvb3NlVHlwZUNoZWNrLnBocI8EAAChNCNojwQAANBqACakAQAAAAAAAFkAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9UeXBlQ2hlY2svU3RyaWN0VHlwZUNoZWNrLnBocLECAAChNCNosQIAAAk5mmikAQAAAAAAAFwAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9UeXBlQ2hlY2svVHlwZUNoZWNrSW50ZXJmYWNlLnBocKMBAAChNCNoowEAALhBDRekAQAAAAAAAE4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9UeXBlQ29uc3RyYWludC5waHCtFQAAoTQjaK0VAAASzBQPpAEAAAAAAABTAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvVW5kZWZpbmVkQ29uc3RyYWludC5waHBUJAAAoTQjaFQkAACXnYq0pAEAAAAAAABGAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRW50aXR5L0pzb25Qb2ludGVyLnBocCMHAAChNCNoIwcAAGHmSe2kAQAAAAAAADgAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FbnVtLnBocGcAAAChNCNoZwAAAL0vygekAQAAAAAAAFAAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vRXhjZXB0aW9uSW50ZXJmYWNlLnBocGMAAAChNCNoYwAAAFdmop6kAQAAAAAAAFYAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLnBocK8AAAChNCNorwAAAEZ0KiCkAQAAAAAAAFQAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vSW52YWxpZENvbmZpZ0V4Y2VwdGlvbi5waHCGAAAAoTQjaIYAAAApKZxapAEAAAAAAABUAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL0ludmFsaWRTY2hlbWFFeGNlcHRpb24ucGhwhgAAAKE0I2iGAAAAgDonc6QBAAAAAAAAXQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9JbnZhbGlkU2NoZW1hTWVkaWFUeXBlRXhjZXB0aW9uLnBocI8AAAChNCNojwAAAHdUVDqkAQAAAAAAAFcAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vSW52YWxpZFNvdXJjZVVyaUV4Y2VwdGlvbi5waHCRAAAAoTQjaJEAAAD1ywt+pAEAAAAAAABTAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL0pzb25EZWNvZGluZ0V4Y2VwdGlvbi5waHD5AgAAoTQjaPkCAADxUTM8pAEAAAAAAABXAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL1Jlc291cmNlTm90Rm91bmRFeGNlcHRpb24ucGhwiQAAAKE0I2iJAAAAuS8V8aQBAAAAAAAATgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9SdW50aW1lRXhjZXB0aW9uLnBocJ8AAAChNCNonwAAADdii9CkAQAAAAAAAF4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vVW5yZXNvbHZhYmxlSnNvblBvaW50ZXJFeGNlcHRpb24ucGhwmgAAAKE0I2iaAAAAXLQqGKQBAAAAAAAAUgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9VcmlSZXNvbHZlckV4Y2VwdGlvbi5waHCEAAAAoTQjaIQAAABN34iHpAEAAAAAAABRAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL1ZhbGlkYXRpb25FeGNlcHRpb24ucGhwgAAAAKE0I2iAAAAAHmwW46QBAAAAAAAASwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0l0ZXJhdG9yL09iamVjdEl0ZXJhdG9yLnBocD4GAAChNCNoPgYAAOxUmSikAQAAAAAAADsAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9SZmMzMzM5LnBocMICAAChNCNowgIAALWtQ4ykAQAAAAAAAEEAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9TY2hlbWFTdG9yYWdlLnBocGwOAAChNCNobA4AANJX5cqkAQAAAAAAAEoAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9TY2hlbWFTdG9yYWdlSW50ZXJmYWNlLnBocBsBAAChNCNoGwEAAExj1fCkAQAAAAAAAEUAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Ub29sL0RlZXBDb21wYXJlci5waHBiBAAAoTQjaGIEAACaRdqBpAEAAAAAAABBAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVG9vbC9EZWVwQ29weS5waHCXAgAAoTQjaJcCAAB4LxczpAEAAAAAAABdAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVG9vbC9WYWxpZGF0b3IvUmVsYXRpdmVSZWZlcmVuY2VWYWxpZGF0b3IucGhw9wIAAKE0I2j3AgAAgGz2z6QBAAAAAAAATwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1Rvb2wvVmFsaWRhdG9yL1VyaVZhbGlkYXRvci5waHBaBgAAoTQjaFoGAABih30zpAEAAAAAAABUAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpL1JldHJpZXZlcnMvQWJzdHJhY3RSZXRyaWV2ZXIucGhw/AAAAKE0I2j8AAAA42CMPKQBAAAAAAAARwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaS9SZXRyaWV2ZXJzL0N1cmwucGhwuAQAAKE0I2i4BAAAdsZnl6QBAAAAAAAAUgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaS9SZXRyaWV2ZXJzL0ZpbGVHZXRDb250ZW50cy5waHBJBQAAoTQjaEkFAADVSyespAEAAAAAAABSAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpL1JldHJpZXZlcnMvUHJlZGVmaW5lZEFycmF5LnBocEYCAAChNCNoRgIAAI9y2CukAQAAAAAAAFgAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9VcmkvUmV0cmlldmVycy9VcmlSZXRyaWV2ZXJJbnRlcmZhY2UucGhwyAAAAKE0I2jIAAAANQSAhaQBAAAAAAAAQwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaS9VcmlSZXNvbHZlci5waHAADAAAoTQjaAAMAABsrKaBpAEAAAAAAABEAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpL1VyaVJldHJpZXZlci5waHBPFAAAoTQjaE8UAADWYttTpAEAAAAAAABIAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpUmVzb2x2ZXJJbnRlcmZhY2UucGhwnQAAAKE0I2idAAAAo75D8aQBAAAAAAAASQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaVJldHJpZXZlckludGVyZmFjZS5waHCfAAAAoTQjaJ8AAADSoRUipAEAAAAAAAA9AAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVmFsaWRhdG9yLnBocL0FAAChNCNovQUAAK/3yOukAQAAAAAAACUAAAB2ZW5kb3IvbWFyYy1tYWJlL3BocC1lbnVtL0xJQ0VOU0UudHh0+AUAAKE0I2j4BQAAj5dD0aQBAAAAAAAAJgAAAHZlbmRvci9tYXJjLW1hYmUvcGhwLWVudW0vc3JjL0VudW0ucGhwIhcAAKE0I2giFwAAxEUJL6QBAAAAAAAAKQAAAHZlbmRvci9tYXJjLW1hYmUvcGhwLWVudW0vc3JjL0VudW1NYXAucGhwQxAAAKE0I2hDEAAAe34ZyqQBAAAAAAAANwAAAHZlbmRvci9tYXJjLW1hYmUvcGhwLWVudW0vc3JjL0VudW1TZXJpYWxpemFibGVUcmFpdC5waHB/BQAAoTQjaH8FAACzO+ifpAEAAAAAAAApAAAAdmVuZG9yL21hcmMtbWFiZS9waHAtZW51bS9zcmMvRW51bVNldC5waHCmNgAAoTQjaKY2AAAEnKZfpAEAAAAAAAAuAAAAdmVuZG9yL21hcmMtbWFiZS9waHAtZW51bS9zdHVicy9TdHJpbmdhYmxlLnBocGIAAAChNCNoYgAAAMPRmzykAQAAAAAAABwAAAB2ZW5kb3IvcHNyL2NvbnRhaW5lci9MSUNFTlNFewQAAKE0I2h7BAAA1dMAZaQBAAAAAAAAOAAAAHZlbmRvci9wc3IvY29udGFpbmVyL3NyYy9Db250YWluZXJFeGNlcHRpb25JbnRlcmZhY2UucGhwTgAAAKE0I2hOAAAA/EwYg6QBAAAAAAAALwAAAHZlbmRvci9wc3IvY29udGFpbmVyL3NyYy9Db250YWluZXJJbnRlcmZhY2UucGhwtwAAAKE0I2i3AAAAiuMBvKQBAAAAAAAANwAAAHZlbmRvci9wc3IvY29udGFpbmVyL3NyYy9Ob3RGb3VuZEV4Y2VwdGlvbkludGVyZmFjZS5waHBxAAAAoTQjaHEAAABSf/r1pAEAAAAAAAAWAAAAdmVuZG9yL3Bzci9sb2cvTElDRU5TRT8EAAChNCNoPwQAAIT5CQikAQAAAAAAACkAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL0Fic3RyYWN0TG9nZ2VyLnBocDsEAAChNCNoOwQAAPE+M1ukAQAAAAAAADMAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5waHBgAAAAoTQjaGAAAAAgiFgxpAEAAAAAAAAjAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9Mb2dMZXZlbC5waHD7AAAAoTQjaPsAAABq8PE4pAEAAAAAAAAvAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9Mb2dnZXJBd2FyZUludGVyZmFjZS5waHB8AAAAoTQjaHwAAAAkE6OIpAEAAAAAAAArAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9Mb2dnZXJBd2FyZVRyYWl0LnBocKcAAAChNCNopwAAAFS9+kKkAQAAAAAAACoAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL0xvZ2dlckludGVyZmFjZS5waHDIAgAAoTQjaMgCAACaH3gdpAEAAAAAAAAmAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9Mb2dnZXJUcmFpdC5waHBrBAAAoTQjaGsEAACjfYmSpAEAAAAAAAAlAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9OdWxsTG9nZ2VyLnBocJ8AAAChNCNonwAAAIFY86qkAQAAAAAAACkAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL1Rlc3QvRHVtbXlUZXN0LnBocHAAAAChNCNocAAAABoVzgWkAQAAAAAAADMAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL1Rlc3QvTG9nZ2VySW50ZXJmYWNlVGVzdC5waHAgDQAAoTQjaCANAAAdJC/SpAEAAAAAAAAqAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9UZXN0L1Rlc3RMb2dnZXIucGhwPAgAAKE0I2g8CAAA/ijlSaQBAAAAAAAAHAAAAHZlbmRvci9yZWFjdC9wcm9taXNlL0xJQ0VOU0VpBAAAoTQjaGkEAAAQM32LpAEAAAAAAAAlAAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL0RlZmVycmVkLnBocFMCAAChNCNoUwIAAL3214akAQAAAAAAADkAAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9zcmMvRXhjZXB0aW9uL0NvbXBvc2l0ZUV4Y2VwdGlvbi5waHCMAQAAoTQjaIwBAAAhjM/ipAEAAAAAAAA2AAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL0V4Y2VwdGlvbi9MZW5ndGhFeGNlcHRpb24ucGhwXgAAAKE0I2heAAAABD9xBKQBAAAAAAAANwAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9JbnRlcm5hbC9DYW5jZWxsYXRpb25RdWV1ZS5waHByAwAAoTQjaHIDAACBeF+xpAEAAAAAAAA2AAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL0ludGVybmFsL0Z1bGZpbGxlZFByb21pc2UucGhwdwUAAKE0I2h3BQAA/1b3r6QBAAAAAAAANQAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9JbnRlcm5hbC9SZWplY3RlZFByb21pc2UucGhw9QcAAKE0I2j1BwAAn4cT+qQBAAAAAAAAJAAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9Qcm9taXNlLnBocI8TAAChNCNojxMAALJlqtKkAQAAAAAAAC0AAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9zcmMvUHJvbWlzZUludGVyZmFjZS5waHBpAgAAoTQjaGkCAAAmHV0opAEAAAAAAAAmAAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL2Z1bmN0aW9ucy5waHDHFAAAoTQjaMcUAAA87sJgpAEAAAAAAAAuAAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL2Z1bmN0aW9uc19pbmNsdWRlLnBocF0AAAChNCNoXQAAAFHRPKGkAQAAAAAAABwAAAB2ZW5kb3Ivc2VsZC9qc29ubGludC9MSUNFTlNFJAQAAKE0I2gkBAAANDqHfqQBAAAAAAAAQAAAAHZlbmRvci9zZWxkL2pzb25saW50L3NyYy9TZWxkL0pzb25MaW50L0R1cGxpY2F0ZUtleUV4Y2VwdGlvbi5waHB8AQAAoTQjaHwBAACaygnspAEAAAAAAAA1AAAAdmVuZG9yL3NlbGQvanNvbmxpbnQvc3JjL1NlbGQvSnNvbkxpbnQvSnNvblBhcnNlci5waHBNOQAAoTQjaE05AAB8wRBupAEAAAAAAAAwAAAAdmVuZG9yL3NlbGQvanNvbmxpbnQvc3JjL1NlbGQvSnNvbkxpbnQvTGV4ZXIucGhwpRQAAKE0I2ilFAAAyLtfpKQBAAAAAAAAOwAAAHZlbmRvci9zZWxkL2pzb25saW50L3NyYy9TZWxkL0pzb25MaW50L1BhcnNpbmdFeGNlcHRpb24ucGhwKAEAAKE0I2goAQAAPtt2faQBAAAAAAAANAAAAHZlbmRvci9zZWxkL2pzb25saW50L3NyYy9TZWxkL0pzb25MaW50L1VuZGVmaW5lZC5waHA+AAAAoTQjaD4AAAD/cZ+fpAEAAAAAAAAeAAAAdmVuZG9yL3NlbGQvcGhhci11dGlscy9MSUNFTlNFJAQAAKE0I2gkBAAAmixNp6QBAAAAAAAAJQAAAHZlbmRvci9zZWxkL3BoYXItdXRpbHMvc3JjL0xpbnRlci5waHBpBwAAoTQjaGkHAACgG43epAEAAAAAAAApAAAAdmVuZG9yL3NlbGQvcGhhci11dGlscy9zcmMvVGltZXN0YW1wcy5waHBeDQAAoTQjaF4NAACd5cNEpAEAAAAAAAAiAAAAdmVuZG9yL3NlbGQvc2lnbmFsLWhhbmRsZXIvTElDRU5TRSQEAAChNCNoJAQAAJosTaekAQAAAAAAADAAAAB2ZW5kb3Ivc2VsZC9zaWduYWwtaGFuZGxlci9zcmMvU2lnbmFsSGFuZGxlci5waHCwHQAAoTQjaLAdAACBABYKpAEAAAAAAAAmAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9BcHBsaWNhdGlvbi5waHAGcQAAoTQjaAZxAAD9bSGEpAEAAAAAAAAuAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9BdHRyaWJ1dGUvQXNDb21tYW5kLnBocNQBAAChNCNo1AEAAL0z3P6kAQAAAAAAADIAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NJL0dpdGh1YkFjdGlvblJlcG9ydGVyLnBocPUFAAChNCNo9QUAAL7bImekAQAAAAAAACAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbG9yLnBocGgOAAChNCNoaA4AAEdi55ekAQAAAAAAACoAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmQvQ29tbWFuZC5waHBKJwAAoTQjaEonAAAAC9p3pAEAAAAAAAAyAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kL0NvbXBsZXRlQ29tbWFuZC5waHCLFgAAoTQjaIsWAAC+D30bpAEAAAAAAAA4AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kL0R1bXBDb21wbGV0aW9uQ29tbWFuZC5waHCQDwAAoTQjaJAPAAA5mwY5pAEAAAAAAAAuAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kL0hlbHBDb21tYW5kLnBocBUJAAChNCNoFQkAAAh9l6WkAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmQvTGF6eUNvbW1hbmQucGhwmw8AAKE0I2ibDwAAB55t5aQBAAAAAAAALgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZC9MaXN0Q29tbWFuZC5waHAxCQAAoTQjaDEJAAAkRLt8pAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kL0xvY2thYmxlVHJhaXQucGhwDwQAAKE0I2gPBAAAcTVnaqQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZC9TaWduYWxhYmxlQ29tbWFuZEludGVyZmFjZS5waHDTAAAAoTQjaNMAAAC7QmC+pAEAAAAAAAA/AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kTG9hZGVyL0NvbW1hbmRMb2FkZXJJbnRlcmZhY2UucGhwUQEAAKE0I2hRAQAAmxCeSKQBAAAAAAAAPwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZExvYWRlci9Db250YWluZXJDb21tYW5kTG9hZGVyLnBocFUDAAChNCNoVQMAABvLX/ykAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmRMb2FkZXIvRmFjdG9yeUNvbW1hbmRMb2FkZXIucGhwrwIAAKE0I2ivAgAAZLwieqQBAAAAAAAANQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tcGxldGlvbi9Db21wbGV0aW9uSW5wdXQucGhwFhMAAKE0I2gWEwAAlCSEa6QBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tcGxldGlvbi9Db21wbGV0aW9uU3VnZ2VzdGlvbnMucGhwwgMAAKE0I2jCAwAAEkGhH6QBAAAAAAAAQQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tcGxldGlvbi9PdXRwdXQvQmFzaENvbXBsZXRpb25PdXRwdXQucGhwZwIAAKE0I2hnAgAAh+z5V6QBAAAAAAAARgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tcGxldGlvbi9PdXRwdXQvQ29tcGxldGlvbk91dHB1dEludGVyZmFjZS5waHBGAQAAoTQjaEYBAADUMm5NpAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21wbGV0aW9uL1N1Z2dlc3Rpb24ucGhwMwEAAKE0I2gzAQAAzIYgHaQBAAAAAAAAKAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29uc29sZUV2ZW50cy5waHDVAgAAoTQjaNUCAACBZ3ddpAEAAAAAAAAhAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9DdXJzb3IucGhwjwkAAKE0I2iPCQAAxqunjqQBAAAAAAAARAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRGVwZW5kZW5jeUluamVjdGlvbi9BZGRDb25zb2xlQ29tbWFuZFBhc3MucGhwZhEAAKE0I2hmEQAAI9QgJKQBAAAAAAAAPAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRGVzY3JpcHRvci9BcHBsaWNhdGlvbkRlc2NyaXB0aW9uLnBocNkJAAChNCNo2QkAAOdwQ16kAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Rlc2NyaXB0b3IvRGVzY3JpcHRvci5waHB9BwAAoTQjaH0HAACx6jNepAEAAAAAAAA5AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9EZXNjcmlwdG9yL0Rlc2NyaXB0b3JJbnRlcmZhY2UucGhw9wAAAKE0I2j3AAAAteVA4KQBAAAAAAAANAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRGVzY3JpcHRvci9Kc29uRGVzY3JpcHRvci5waHDrEAAAoTQjaOsQAAAxJeiPpAEAAAAAAAA4AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9EZXNjcmlwdG9yL01hcmtkb3duRGVzY3JpcHRvci5waHBRFAAAoTQjaFEUAAB0oIh2pAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9EZXNjcmlwdG9yL1RleHREZXNjcmlwdG9yLnBocOciAAChNCNo5yIAAMi4zMukAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Rlc2NyaXB0b3IvWG1sRGVzY3JpcHRvci5waHAIHwAAoTQjaAgfAAB1SUCapAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FdmVudC9Db25zb2xlQ29tbWFuZEV2ZW50LnBocMkBAAChNCNoyQEAALDW4Q6kAQAAAAAAADIAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V2ZW50L0NvbnNvbGVFcnJvckV2ZW50LnBocP0DAAChNCNo/QMAABjpJZikAQAAAAAAAC0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V2ZW50L0NvbnNvbGVFdmVudC5waHDGAgAAoTQjaMYCAADFb9vZpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FdmVudC9Db25zb2xlU2lnbmFsRXZlbnQucGhwRwIAAKE0I2hHAgAAjvsbC6QBAAAAAAAANgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXZlbnQvQ29uc29sZVRlcm1pbmF0ZUV2ZW50LnBocH4CAAChNCNofgIAAGhyvdakAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V2ZW50TGlzdGVuZXIvRXJyb3JMaXN0ZW5lci5waHAnCAAAoTQjaCcIAADwoqGJpAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FeGNlcHRpb24vQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uLnBocNsBAAChNCNo2wEAAEt9nhekAQAAAAAAADcAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V4Y2VwdGlvbi9FeGNlcHRpb25JbnRlcmZhY2UucGhweQAAAKE0I2h5AAAA2TlbJqQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXhjZXB0aW9uL0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5waHCmAAAAoTQjaKYAAADWzL1apAEAAAAAAAA7AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FeGNlcHRpb24vSW52YWxpZE9wdGlvbkV4Y2VwdGlvbi5waHCmAAAAoTQjaKYAAAATy9dIpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FeGNlcHRpb24vTG9naWNFeGNlcHRpb24ucGhwkgAAAKE0I2iSAAAAzU9cZaQBAAAAAAAAOgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXhjZXB0aW9uL01pc3NpbmdJbnB1dEV4Y2VwdGlvbi5waHCcAAAAoTQjaJwAAADmUwr+pAEAAAAAAAA/AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FeGNlcHRpb24vTmFtZXNwYWNlTm90Rm91bmRFeGNlcHRpb24ucGhwiwAAAKE0I2iLAAAAgvNuqaQBAAAAAAAANQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXhjZXB0aW9uL1J1bnRpbWVFeGNlcHRpb24ucGhwlgAAAKE0I2iWAAAA2e0sNqQBAAAAAAAAOAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRm9ybWF0dGVyL051bGxPdXRwdXRGb3JtYXR0ZXIucGhwjQIAAKE0I2iNAgAAISYNdaQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRm9ybWF0dGVyL051bGxPdXRwdXRGb3JtYXR0ZXJTdHlsZS5waHAMAgAAoTQjaAwCAADKMIfYpAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Gb3JtYXR0ZXIvT3V0cHV0Rm9ybWF0dGVyLnBocH8VAAChNCNofxUAANzmpRKkAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Zvcm1hdHRlci9PdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UucGhwowEAAKE0I2ijAQAAWSCn36QBAAAAAAAAOQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRm9ybWF0dGVyL091dHB1dEZvcm1hdHRlclN0eWxlLnBocHoHAAChNCNoegcAAP9qYa2kAQAAAAAAAEIAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Zvcm1hdHRlci9PdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZS5waHCfAQAAoTQjaJ8BAAD4gMR3pAEAAAAAAAA+AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Gb3JtYXR0ZXIvT3V0cHV0Rm9ybWF0dGVyU3R5bGVTdGFjay5waHCFBQAAoTQjaIUFAABM2eGKpAEAAAAAAABGAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Gb3JtYXR0ZXIvV3JhcHBhYmxlT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlLnBocNYAAAChNCNo1gAAAKFaAbekAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9EZWJ1Z0Zvcm1hdHRlckhlbHBlci5waHC4CAAAoTQjaLgIAACk8DagpAEAAAAAAAAyAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvRGVzY3JpcHRvckhlbHBlci5waHDABQAAoTQjaMAFAACmZ8yEpAEAAAAAAAAoAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvRHVtcGVyLnBocBQFAAChNCNoFAUAAJ88y9+kAQAAAAAAADEAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9Gb3JtYXR0ZXJIZWxwZXIucGhwaQUAAKE0I2hpBQAApLaAd6QBAAAAAAAAKAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL0hlbHBlci5waHCNDAAAoTQjaI0MAADBlDFUpAEAAAAAAAAxAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvSGVscGVySW50ZXJmYWNlLnBocOYAAAChNCNo5gAAAGBSwlykAQAAAAAAACsAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9IZWxwZXJTZXQucGhwSQUAAKE0I2hJBQAAPYfiRKQBAAAAAAAAMgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL0lucHV0QXdhcmVIZWxwZXIucGhwYwEAAKE0I2hjAQAABsz4g6QBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1Byb2Nlc3NIZWxwZXIucGhwXAwAAKE0I2hcDAAAEMR6QaQBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1Byb2dyZXNzQmFyLnBocFgvAAChNCNoWC8AADJwkuSkAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9Qcm9ncmVzc0luZGljYXRvci5waHDAEgAAoTQjaMASAACHy2X1pAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvUXVlc3Rpb25IZWxwZXIucGhwUi0AAKE0I2hSLQAA5qcxaaQBAAAAAAAANwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1N5bWZvbnlRdWVzdGlvbkhlbHBlci5waHAZCQAAoTQjaBkJAADgnWT/pAEAAAAAAAAnAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvVGFibGUucGhwtEoAAKE0I2i0SgAAU9fBraQBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1RhYmxlQ2VsbC5waHBBBAAAoTQjaEEEAADo06B/pAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvVGFibGVDZWxsU3R5bGUucGhw7gUAAKE0I2juBQAA0Y25X6QBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1RhYmxlUm93cy5waHApAQAAoTQjaCkBAABXijN6pAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvVGFibGVTZXBhcmF0b3IucGhwxQAAAKE0I2jFAAAAvPXL/KQBAAAAAAAALAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1RhYmxlU3R5bGUucGhwjRQAAKE0I2iNFAAAVxi6CKQBAAAAAAAAKgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvQXJndklucHV0LnBocCscAAChNCNoKxwAAEaxttGkAQAAAAAAACsAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0lucHV0L0FycmF5SW5wdXQucGhwCA0AAKE0I2gIDQAA8aafLqQBAAAAAAAAJgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvSW5wdXQucGhwpA0AAKE0I2ikDQAA2txvsaQBAAAAAAAALgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvSW5wdXRBcmd1bWVudC5waHAXBgAAoTQjaBcGAADOoMD6pAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9JbnB1dEF3YXJlSW50ZXJmYWNlLnBocJgAAAChNCNomAAAAK0PT7CkAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0lucHV0L0lucHV0RGVmaW5pdGlvbi5waHAjGgAAoTQjaCMaAAAJjCEzpAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9JbnB1dEludGVyZmFjZS5waHD8AwAAoTQjaPwDAABHtvSopAEAAAAAAAAsAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9JbnB1dE9wdGlvbi5waHAdDgAAoTQjaB0OAABJqp4vpAEAAAAAAAA5AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9TdHJlYW1hYmxlSW5wdXRJbnRlcmZhY2UucGhwzgAAAKE0I2jOAAAA1tVCm6QBAAAAAAAALAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvU3RyaW5nSW5wdXQucGhwPwYAAKE0I2g/BgAAsZIUy6QBAAAAAAAAHgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvTElDRU5TRS4EAAChNCNoLgQAAPe6AmukAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0xvZ2dlci9Db25zb2xlTG9nZ2VyLnBocAQLAAChNCNoBAsAAMcMDlGkAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL091dHB1dC9CdWZmZXJlZE91dHB1dC5waHBsAQAAoTQjaGwBAAB5OrgQpAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvQ29uc29sZU91dHB1dC5waHCRCQAAoTQjaJEJAABc3e9ipAEAAAAAAAA4AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvQ29uc29sZU91dHB1dEludGVyZmFjZS5waHASAQAAoTQjaBIBAACJ6ve0pAEAAAAAAAA2AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvQ29uc29sZVNlY3Rpb25PdXRwdXQucGhwlAkAAKE0I2iUCQAAwGdvQKQBAAAAAAAALAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvT3V0cHV0L051bGxPdXRwdXQucGhwQgQAAKE0I2hCBAAAJSNSxqQBAAAAAAAAKAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvT3V0cHV0L091dHB1dC5waHDICQAAoTQjaMgJAACfyzh4pAEAAAAAAAAxAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvT3V0cHV0SW50ZXJmYWNlLnBocO0DAAChNCNo7QMAAPCOvgWkAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL091dHB1dC9TdHJlYW1PdXRwdXQucGhwogYAAKE0I2iiBgAALL4i/KQBAAAAAAAANQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvT3V0cHV0L1RyaW1tZWRCdWZmZXJPdXRwdXQucGhw2wMAAKE0I2jbAwAAbGuDfqQBAAAAAAAAMgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvUXVlc3Rpb24vQ2hvaWNlUXVlc3Rpb24ucGhw3QoAAKE0I2jdCgAACWPkpqQBAAAAAAAAOAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvUXVlc3Rpb24vQ29uZmlybWF0aW9uUXVlc3Rpb24ucGhwAgMAAKE0I2gCAwAA7nnFhKQBAAAAAAAALAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvUXVlc3Rpb24vUXVlc3Rpb24ucGhwIg0AAKE0I2giDQAAyt6526QBAAAAAAAANAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvUmVzb3VyY2VzL2Jpbi9oaWRkZW5pbnB1dC5leGUAJAAAoTQjaAAkAACVjaV2pAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9SZXNvdXJjZXMvY29tcGxldGlvbi5iYXNozwoAAKE0I2jPCgAAmxgncqQBAAAAAAAAOAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvU2lnbmFsUmVnaXN0cnkvU2lnbmFsUmVnaXN0cnkucGhwIQQAAKE0I2ghBAAAfi46r6QBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvU2luZ2xlQ29tbWFuZEFwcGxpY2F0aW9uLnBocDcEAAChNCNoNwQAAM0xvh+kAQAAAAAAACwAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1N0eWxlL091dHB1dFN0eWxlLnBocHQHAAChNCNodAcAAE8WO8akAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1N0eWxlL1N0eWxlSW50ZXJmYWNlLnBocBAEAAChNCNoEAQAAFwbng6kAQAAAAAAAC0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1N0eWxlL1N5bWZvbnlTdHlsZS5waHA1JwAAoTQjaDUnAAB5bPf0pAEAAAAAAAAjAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9UZXJtaW5hbC5waHBtCwAAoTQjaG0LAACHpVB2pAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9UZXN0ZXIvQXBwbGljYXRpb25UZXN0ZXIucGhwjAQAAKE0I2iMBAAAHh9J+6QBAAAAAAAAOQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvVGVzdGVyL0NvbW1hbmRDb21wbGV0aW9uVGVzdGVyLnBocNoDAAChNCNo2gMAAMqbO7CkAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1Rlc3Rlci9Db21tYW5kVGVzdGVyLnBocNkDAAChNCNo2QMAAEQItgekAQAAAAAAAEAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1Rlc3Rlci9Db25zdHJhaW50L0NvbW1hbmRJc1N1Y2Nlc3NmdWwucGhw1gIAAKE0I2jWAgAAHsaDgqQBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvVGVzdGVyL1Rlc3RlclRyYWl0LnBocKwNAAChNCNorA0AADInTLKkAQAAAAAAACwAAAB2ZW5kb3Ivc3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMvTElDRU5TRS4EAAChNCNoLgQAAAfk9IikAQAAAAAAADEAAAB2ZW5kb3Ivc3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMvZnVuY3Rpb24ucGhwPQEAAKE0I2g9AQAAnsG0DaQBAAAAAAAAOgAAAHZlbmRvci9zeW1mb255L2ZpbGVzeXN0ZW0vRXhjZXB0aW9uL0V4Y2VwdGlvbkludGVyZmFjZS5waHB8AAAAoTQjaHwAAACNBelEpAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9FeGNlcHRpb24vRmlsZU5vdEZvdW5kRXhjZXB0aW9uLnBocNEBAAChNCNo0QEAAGLmfbSkAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9maWxlc3lzdGVtL0V4Y2VwdGlvbi9JT0V4Y2VwdGlvbi5waHCbAQAAoTQjaJsBAAAzX8PqpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9FeGNlcHRpb24vSU9FeGNlcHRpb25JbnRlcmZhY2UucGhwpgAAAKE0I2imAAAAatl3TaQBAAAAAAAAQAAAAHZlbmRvci9zeW1mb255L2ZpbGVzeXN0ZW0vRXhjZXB0aW9uL0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5waHCpAAAAoTQjaKkAAACNIQ7HpAEAAAAAAAA4AAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9FeGNlcHRpb24vUnVudGltZUV4Y2VwdGlvbi5waHCZAAAAoTQjaJkAAADdVVVIpAEAAAAAAAAoAAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9GaWxlc3lzdGVtLnBocCRCAAChNCNoJEIAAJLAdzukAQAAAAAAACEAAAB2ZW5kb3Ivc3ltZm9ueS9maWxlc3lzdGVtL0xJQ0VOU0UuBAAAoTQjaC4EAAD3ugJrpAEAAAAAAAAiAAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9QYXRoLnBocGInAAChNCNoYicAAAbfoxmkAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvQ29tcGFyYXRvci9Db21wYXJhdG9yLnBocDQHAAChNCNoNAcAACLsvNWkAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvQ29tcGFyYXRvci9EYXRlQ29tcGFyYXRvci5waHAFAwAAoTQjaAUDAADPJfplpAEAAAAAAAA1AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0NvbXBhcmF0b3IvTnVtYmVyQ29tcGFyYXRvci5waHB6AwAAoTQjaHoDAAArvABopAEAAAAAAAA5AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0V4Y2VwdGlvbi9BY2Nlc3NEZW5pZWRFeGNlcHRpb24ucGhwhAAAAKE0I2iEAAAAvb5znKQBAAAAAAAAPgAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9FeGNlcHRpb24vRGlyZWN0b3J5Tm90Rm91bmRFeGNlcHRpb24ucGhwiQAAAKE0I2iJAAAAYSn/G6QBAAAAAAAAIAAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9GaW5kZXIucGhw1icAAKE0I2jWJwAAjgU/5KQBAAAAAAAAIwAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9HaXRpZ25vcmUucGhwswcAAKE0I2izBwAAHHMJNKQBAAAAAAAAHgAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9HbG9iLnBocMcGAAChNCNoxwYAAERih7OkAQAAAAAAADcAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvQ3VzdG9tRmlsdGVySXRlcmF0b3IucGhwYwIAAKE0I2hjAgAAEzfwmaQBAAAAAAAAOgAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9EYXRlUmFuZ2VGaWx0ZXJJdGVyYXRvci5waHCPAgAAoTQjaI8CAABQmn9zpAEAAAAAAAA7AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL0RlcHRoUmFuZ2VGaWx0ZXJJdGVyYXRvci5waHAXAgAAoTQjaBcCAACnjgMSpAEAAAAAAABBAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL0V4Y2x1ZGVEaXJlY3RvcnlGaWx0ZXJJdGVyYXRvci5waHAwBgAAoTQjaDAGAAADLnd2pAEAAAAAAAA5AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL0ZpbGVUeXBlRmlsdGVySXRlcmF0b3IucGhwiAIAAKE0I2iIAgAAXrYi+6QBAAAAAAAAPAAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9GaWxlY29udGVudEZpbHRlckl0ZXJhdG9yLnBocFcCAAChNCNoVwIAAMLFEtmkAQAAAAAAADkAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvRmlsZW5hbWVGaWx0ZXJJdGVyYXRvci5waHCUAQAAoTQjaJQBAAA9mdz0pAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL0xhenlJdGVyYXRvci5waHBRAQAAoTQjaFEBAABuXb+8pAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL011bHRpcGxlUGNyZUZpbHRlckl0ZXJhdG9yLnBocI0FAAChNCNojQUAAKKA1xekAQAAAAAAADUAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvUGF0aEZpbHRlckl0ZXJhdG9yLnBocPIBAAChNCNo8gEAAGcUIl+kAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IucGhwSwkAAKE0I2hLCQAA6YZGDaQBAAAAAAAAOgAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9TaXplUmFuZ2VGaWx0ZXJJdGVyYXRvci5waHB8AgAAoTQjaHwCAAAGM9mfpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL1NvcnRhYmxlSXRlcmF0b3IucGhwKAoAAKE0I2goCgAA0+KuD6QBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9WY3NJZ25vcmVkRmlsdGVySXRlcmF0b3IucGhwdwoAAKE0I2h3CgAAxbUdM6QBAAAAAAAAHQAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9MSUNFTlNFLgQAAKE0I2guBAAA97oCa6QBAAAAAAAAJQAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9TcGxGaWxlSW5mby5waHC9AwAAoTQjaL0DAAAHeQUbpAEAAAAAAAAnAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvQ3R5cGUucGhwhwoAAKE0I2iHCgAAfrZkuKQBAAAAAAAAJQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWN0eXBlL0xJQ0VOU0UuBAAAoTQjaC4EAACmuKlYpAEAAAAAAAArAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvYm9vdHN0cmFwLnBocDIFAAChNCNoMgUAAMhhrTikAQAAAAAAAC0AAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZS9ib290c3RyYXA4MC5waHBoBQAAoTQjaGgFAABLv3m4pAEAAAAAAAAyAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZS9HcmFwaGVtZS5waHDaGAAAoTQjaNoYAACNDZsWpAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZS9MSUNFTlNFLgQAAKE0I2guBAAAyxwfa6QBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUvYm9vdHN0cmFwLnBocM8HAAChNCNozwcAAP05wHykAQAAAAAAADUAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lL2Jvb3RzdHJhcDgwLnBocFkJAAChNCNoWQkAAKgBIaCkAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvTElDRU5TRS4EAAChNCNoLgQAAMscH2ukAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvTm9ybWFsaXplci5waHD2FgAAoTQjaPYWAADqad1lpAEAAAAAAABGAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL1Jlc291cmNlcy9zdHVicy9Ob3JtYWxpemVyLnBocC4BAAChNCNoLgEAAFFzJJekAQAAAAAAAFIAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvUmVzb3VyY2VzL3VuaWRhdGEvY2Fub25pY2FsQ29tcG9zaXRpb24ucGhwiT0AAKE0I2iJPQAAKu9vP6QBAAAAAAAAVAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9SZXNvdXJjZXMvdW5pZGF0YS9jYW5vbmljYWxEZWNvbXBvc2l0aW9uLnBocGGIAAChNCNoYYgAAOdSvX2kAQAAAAAAAEwAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvUmVzb3VyY2VzL3VuaWRhdGEvY29tYmluaW5nQ2xhc3MucGhwdC4AAKE0I2h0LgAAC3GQ3KQBAAAAAAAAWAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9SZXNvdXJjZXMvdW5pZGF0YS9jb21wYXRpYmlsaXR5RGVjb21wb3NpdGlvbi5waHCZ6AAAoTQjaJnoAABvlGUppAEAAAAAAAA1AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL2Jvb3RzdHJhcC5waHDrAQAAoTQjaOsBAABQ+qNEpAEAAAAAAAA3AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL2Jvb3RzdHJhcDgwLnBocOkBAAChNCNo6QEAAD3lcrSkAQAAAAAAACgAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9MSUNFTlNFLgQAAKE0I2guBAAAyxwfa6QBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL01ic3RyaW5nLnBocPVeAAChNCNo9V4AACTdnS2kAQAAAAAAAEIAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9SZXNvdXJjZXMvdW5pZGF0YS9jYXNlRm9sZGluZy5waHCVBwAAoTQjaJUHAAD0trPjpAEAAAAAAABAAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvUmVzb3VyY2VzL3VuaWRhdGEvbG93ZXJDYXNlLnBocPlUAAChNCNo+VQAAAOVsSukAQAAAAAAAEYAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9SZXNvdXJjZXMvdW5pZGF0YS90aXRsZUNhc2VSZWdleHAucGhw4xcAAKE0I2jjFwAA9nlflaQBAAAAAAAAQAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL1Jlc291cmNlcy91bmlkYXRhL3VwcGVyQ2FzZS5waHA4WwAAoTQjaDhbAAArUtgqpAEAAAAAAAAuAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvYm9vdHN0cmFwLnBocG0fAAChNCNobR8AAE/pOwukAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9ib290c3RyYXA4MC5waHCAJQAAoTQjaIAlAAAVbwIgpAEAAAAAAAAlAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMvTElDRU5TRS4EAAChNCNoLgQAAKa4qVikAQAAAAAAACcAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA3My9QaHA3My5waHBuAQAAoTQjaG4BAABDc6VspAEAAAAAAAA/AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMvUmVzb3VyY2VzL3N0dWJzL0pzb25FeGNlcHRpb24ucGhwWwAAAKE0I2hbAAAATRiy3KQBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDczL2Jvb3RzdHJhcC5waHD5AgAAoTQjaPkCAABBWTjGpAEAAAAAAAAlAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvTElDRU5TRS4EAAChNCNoLgQAAAfk9IikAQAAAAAAACcAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9QaHA4MC5waHChCQAAoTQjaKEJAABbwmsLpAEAAAAAAAAqAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUGhwVG9rZW4ucGhwFgUAAKE0I2gWBQAAeILAy6QBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9BdHRyaWJ1dGUucGhwxwEAAKE0I2jHAQAA3d7t+6QBAAAAAAAAOgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9QaHBUb2tlbi5waHCNAAAAoTQjaI0AAADalAXdpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1N0cmluZ2FibGUucGhwawAAAKE0I2hrAAAAHtD9K6QBAAAAAAAARQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9VbmhhbmRsZWRNYXRjaEVycm9yLnBocF0AAAChNCNoXQAAALpnwxakAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvVmFsdWVFcnJvci5waHBUAAAAoTQjaFQAAACR1neXpAEAAAAAAAArAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvYm9vdHN0cmFwLnBocPoEAAChNCNo+gQAANfu5QKkAQAAAAAAACUAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9MSUNFTlNFLgQAAKE0I2guBAAAO2Opp6QBAAAAAAAAJwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgxL1BocDgxLnBocDsBAAChNCNoOwEAABb5q2SkAQAAAAAAAEAAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9SZXNvdXJjZXMvc3R1YnMvQ1VSTFN0cmluZ0ZpbGUucGhwggMAAKE0I2iCAwAA4cE/7KQBAAAAAAAARgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgxL1Jlc291cmNlcy9zdHVicy9SZXR1cm5UeXBlV2lsbENoYW5nZS5waHCfAAAAoTQjaJ8AAADOwL78pAEAAAAAAAArAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvYm9vdHN0cmFwLnBocPQBAAChNCNo9AEAAIjT0FykAQAAAAAAADcAAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL0V4Y2VwdGlvbi9FeGNlcHRpb25JbnRlcmZhY2UucGhweQAAAKE0I2h5AAAAcVZYSqQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvRXhjZXB0aW9uL0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5waHCoAAAAoTQjaKgAAADQwCtfpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9FeGNlcHRpb24vTG9naWNFeGNlcHRpb24ucGhwlAAAAKE0I2iUAAAAILPj8aQBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvRXhjZXB0aW9uL1Byb2Nlc3NGYWlsZWRFeGNlcHRpb24ucGhweAMAAKE0I2h4AwAAqMx6eaQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvRXhjZXB0aW9uL1Byb2Nlc3NTaWduYWxlZEV4Y2VwdGlvbi5waHARAgAAoTQjaBECAABZ16nipAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9FeGNlcHRpb24vUHJvY2Vzc1RpbWVkT3V0RXhjZXB0aW9uLnBocDEEAAChNCNoMQQAAIInWhWkAQAAAAAAADUAAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL0V4Y2VwdGlvbi9SdW50aW1lRXhjZXB0aW9uLnBocJgAAAChNCNomAAAAKIb2DqkAQAAAAAAACsAAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL0V4ZWN1dGFibGVGaW5kZXIucGhw+AcAAKE0I2j4BwAAAb9bqqQBAAAAAAAAJgAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvSW5wdXRTdHJlYW0ucGhwMAQAAKE0I2gwBAAAjIQ+h6QBAAAAAAAAHgAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvTElDRU5TRS4EAAChNCNoLgQAAPe6AmukAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL1BocEV4ZWN1dGFibGVGaW5kZXIucGhw/wQAAKE0I2j/BAAA6q7FjKQBAAAAAAAAJQAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvUGhwUHJvY2Vzcy5waHD4BAAAoTQjaPgEAABwxFgZpAEAAAAAAAAuAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9QaXBlcy9BYnN0cmFjdFBpcGVzLnBocB4LAAChNCNoHgsAAAJrU1GkAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL1BpcGVzL1BpcGVzSW50ZXJmYWNlLnBocJkBAAChNCNomQEAAGZR2gykAQAAAAAAACoAAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL1BpcGVzL1VuaXhQaXBlcy5waHCACAAAoTQjaIAIAAC+lFZ2pAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9QaXBlcy9XaW5kb3dzUGlwZXMucGhwNA0AAKE0I2g0DQAAC1bE4KQBAAAAAAAAIgAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvUHJvY2Vzcy5waHBCaAAAoTQjaEJoAAAESCLOpAEAAAAAAAAnAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9Qcm9jZXNzVXRpbHMucGhwFAMAAKE0I2gUAwAA0w9Y7KQBAAAAAAAANwAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL0F0dHJpYnV0ZS9SZXF1aXJlZC5waHCoAAAAoTQjaKgAAAB4auuEpAEAAAAAAABAAAAAdmVuZG9yL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMvQXR0cmlidXRlL1N1YnNjcmliZWRTZXJ2aWNlLnBocAoBAAChNCNoCgEAADFJrlSkAQAAAAAAACgAAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9MSUNFTlNFLgQAAKE0I2guBAAApripWKQBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL1Jlc2V0SW50ZXJmYWNlLnBocHkAAAChNCNoeQAAALC3auWkAQAAAAAAADgAAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9TZXJ2aWNlTG9jYXRvclRyYWl0LnBocOMJAAChNCNo4wkAACKPNemkAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9TZXJ2aWNlUHJvdmlkZXJJbnRlcmZhY2UucGhw3gAAAKE0I2jeAAAA+lLoa6QBAAAAAAAAPwAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL1NlcnZpY2VTdWJzY3JpYmVySW50ZXJmYWNlLnBocLMAAAChNCNoswAAAJf2ZAykAQAAAAAAADsAAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9TZXJ2aWNlU3Vic2NyaWJlclRyYWl0LnBocGAKAAChNCNoYAoAAMgzCHWkAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9UZXN0L1NlcnZpY2VMb2NhdG9yVGVzdC5waHCyAAAAoTQjaLIAAABt+arUpAEAAAAAAABAAAAAdmVuZG9yL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMvVGVzdC9TZXJ2aWNlTG9jYXRvclRlc3RDYXNlLnBocJwIAAChNCNonAgAAMWajL2kAQAAAAAAACgAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvQWJzdHJhY3RTdHJpbmcucGhwKjQAAKE0I2gqNAAAsEoN+6QBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L3N0cmluZy9BYnN0cmFjdFVuaWNvZGVTdHJpbmcucGhwuFIAAKE0I2i4UgAAAiO3B6QBAAAAAAAAJAAAAHZlbmRvci9zeW1mb255L3N0cmluZy9CeXRlU3RyaW5nLnBocP8rAAChNCNo/ysAAEur016kAQAAAAAAACkAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvQ29kZVBvaW50U3RyaW5nLnBocPUXAAChNCNo9RcAAELCjwOkAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvRXhjZXB0aW9uL0V4Y2VwdGlvbkludGVyZmFjZS5waHBzAAAAoTQjaHMAAABxSFaRpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0V4Y2VwdGlvbi9JbnZhbGlkQXJndW1lbnRFeGNlcHRpb24ucGhwogAAAKE0I2iiAAAAHwWlQaQBAAAAAAAANAAAAHZlbmRvci9zeW1mb255L3N0cmluZy9FeGNlcHRpb24vUnVudGltZUV4Y2VwdGlvbi5waHCSAAAAoTQjaJIAAAB1kRJnpAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0luZmxlY3Rvci9FbmdsaXNoSW5mbGVjdG9yLnBocEoaAAChNCNoShoAAAiz2DOkAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvSW5mbGVjdG9yL0ZyZW5jaEluZmxlY3Rvci5waHCICgAAoTQjaIgKAAC3ihJIpAEAAAAAAAA2AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0luZmxlY3Rvci9JbmZsZWN0b3JJbnRlcmZhY2UucGhw1wAAAKE0I2jXAAAAaESjF6QBAAAAAAAAHQAAAHZlbmRvci9zeW1mb255L3N0cmluZy9MSUNFTlNFLgQAAKE0I2guBAAAmj/0d6QBAAAAAAAAJAAAAHZlbmRvci9zeW1mb255L3N0cmluZy9MYXp5U3RyaW5nLnBocEMMAAChNCNoQwwAAKfhrGKkAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvUmVzb3VyY2VzL2RhdGEvd2Nzd2lkdGhfdGFibGVfd2lkZS5waHAkFgAAoTQjaCQWAAClwJZLpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL1Jlc291cmNlcy9kYXRhL3djc3dpZHRoX3RhYmxlX3plcm8ucGhw1BkAAKE0I2jUGQAA0gP+JKQBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L3N0cmluZy9SZXNvdXJjZXMvZnVuY3Rpb25zLnBocAYCAAChNCNoBgIAAGPaqiKkAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvU2x1Z2dlci9Bc2NpaVNsdWdnZXIucGhw7A8AAKE0I2jsDwAAfSYOyqQBAAAAAAAAMgAAAHZlbmRvci9zeW1mb255L3N0cmluZy9TbHVnZ2VyL1NsdWdnZXJJbnRlcmZhY2UucGhwBwEAAKE0I2gHAQAAj2vxqKQBAAAAAAAAJwAAAHZlbmRvci9zeW1mb255L3N0cmluZy9Vbmljb2RlU3RyaW5nLnBocO0lAAChNCNo7SUAAP3BmDWkAQAAAAAAAAwAAABiaW4vY29tcG9zZXKmDQAAoTQjaKYNAACYdMg/pAEAAAAAAAAHAAAATElDRU5TRS4EAAChNCNoLgQAACDVCAOkAQAAAAAAADw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBZHZpc29yeTsKCnVzZSBDb21wb3NlclxJT1xDb25zb2xlSU87CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFV0aWxcUGFja2FnZUluZm87CnVzZSBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CgoKCgpjbGFzcyBBdWRpdG9yCnsKcHVibGljIGNvbnN0IEZPUk1BVF9UQUJMRSA9ICd0YWJsZSc7CgpwdWJsaWMgY29uc3QgRk9STUFUX1BMQUlOID0gJ3BsYWluJzsKCnB1YmxpYyBjb25zdCBGT1JNQVRfSlNPTiA9ICdqc29uJzsKCnB1YmxpYyBjb25zdCBGT1JNQVRfU1VNTUFSWSA9ICdzdW1tYXJ5JzsKCnB1YmxpYyBjb25zdCBGT1JNQVRTID0gWwpzZWxmOjpGT1JNQVRfVEFCTEUsCnNlbGY6OkZPUk1BVF9QTEFJTiwKc2VsZjo6Rk9STUFUX0pTT04sCnNlbGY6OkZPUk1BVF9TVU1NQVJZLApdOwoKcHVibGljIGNvbnN0IEFCQU5ET05FRF9JR05PUkUgPSAnaWdub3JlJzsKcHVibGljIGNvbnN0IEFCQU5ET05FRF9SRVBPUlQgPSAncmVwb3J0JzsKcHVibGljIGNvbnN0IEFCQU5ET05FRF9GQUlMID0gJ2ZhaWwnOwoKCnB1YmxpYyBjb25zdCBBQkFORE9ORURTID0gWwpzZWxmOjpBQkFORE9ORURfSUdOT1JFLApzZWxmOjpBQkFORE9ORURfUkVQT1JULApzZWxmOjpBQkFORE9ORURfRkFJTCwKXTsKCgpwdWJsaWMgY29uc3QgU1RBVFVTX09LID0gMDsKcHVibGljIGNvbnN0IFNUQVRVU19WVUxORVJBQkxFID0gMTsKcHVibGljIGNvbnN0IFNUQVRVU19BQkFORE9ORUQgPSAyOwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXVkaXQoSU9JbnRlcmZhY2UgJGlvLCBSZXBvc2l0b3J5U2V0ICRyZXBvU2V0LCBhcnJheSAkcGFja2FnZXMsIHN0cmluZyAkZm9ybWF0LCBib29sICR3YXJuaW5nT25seSA9IHRydWUsIGFycmF5ICRpZ25vcmVMaXN0ID0gW10sIHN0cmluZyAkYWJhbmRvbmVkID0gc2VsZjo6QUJBTkRPTkVEX0ZBSUwsIGFycmF5ICRpZ25vcmVkU2V2ZXJpdGllcyA9IFtdKTogaW50CnsKJGFsbEFkdmlzb3JpZXMgPSAkcmVwb1NldC0+Z2V0TWF0Y2hpbmdTZWN1cml0eUFkdmlzb3JpZXMoJHBhY2thZ2VzLCAkZm9ybWF0ID09PSBzZWxmOjpGT1JNQVRfU1VNTUFSWSk7CgoKaWYgKGNvdW50KCRhbGxBZHZpc29yaWVzKSA+IDAgJiYgJGlnbm9yZUxpc3QgIT09IFtdICYmICRmb3JtYXQgPT09IHNlbGY6OkZPUk1BVF9TVU1NQVJZKSB7CiRhbGxBZHZpc29yaWVzID0gJHJlcG9TZXQtPmdldE1hdGNoaW5nU2VjdXJpdHlBZHZpc29yaWVzKCRwYWNrYWdlcywgZmFsc2UpOwp9ClsnYWR2aXNvcmllcycgPT4gJGFkdmlzb3JpZXMsICdpZ25vcmVkQWR2aXNvcmllcycgPT4gJGlnbm9yZWRBZHZpc29yaWVzXSA9ICR0aGlzLT5wcm9jZXNzQWR2aXNvcmllcygkYWxsQWR2aXNvcmllcywgJGlnbm9yZUxpc3QsICRpZ25vcmVkU2V2ZXJpdGllcyk7CgokYWJhbmRvbmVkQ291bnQgPSAwOwokYWZmZWN0ZWRQYWNrYWdlc0NvdW50ID0gY291bnQoJGFkdmlzb3JpZXMpOwppZiAoJGFiYW5kb25lZCA9PT0gc2VsZjo6QUJBTkRPTkVEX0lHTk9SRSkgewokYWJhbmRvbmVkUGFja2FnZXMgPSBbXTsKfSBlbHNlIHsKJGFiYW5kb25lZFBhY2thZ2VzID0gJHRoaXMtPmZpbHRlckFiYW5kb25lZFBhY2thZ2VzKCRwYWNrYWdlcyk7CmlmICgkYWJhbmRvbmVkID09PSBzZWxmOjpBQkFORE9ORURfRkFJTCkgewokYWJhbmRvbmVkQ291bnQgPSBjb3VudCgkYWJhbmRvbmVkUGFja2FnZXMpOwp9Cn0KCiRhdWRpdEJpdG1hc2sgPSAkdGhpcy0+Y2FsY3VsYXRlQml0bWFzaygwIDwgJGFmZmVjdGVkUGFja2FnZXNDb3VudCwgMCA8ICRhYmFuZG9uZWRDb3VudCk7CgppZiAoc2VsZjo6Rk9STUFUX0pTT04gPT09ICRmb3JtYXQpIHsKJGpzb24gPSBbJ2Fkdmlzb3JpZXMnID0+ICRhZHZpc29yaWVzXTsKaWYgKCRpZ25vcmVkQWR2aXNvcmllcyAhPT0gW10pIHsKJGpzb25bJ2lnbm9yZWQtYWR2aXNvcmllcyddID0gJGlnbm9yZWRBZHZpc29yaWVzOwp9CiRqc29uWydhYmFuZG9uZWQnXSA9IGFycmF5X3JlZHVjZSgkYWJhbmRvbmVkUGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJGNhcnJ5LCBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBhcnJheSB7CiRjYXJyeVskcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpXSA9ICRwYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKTsKCnJldHVybiAkY2Fycnk7Cn0sIFtdKTsKCiRpby0+d3JpdGUoSnNvbkZpbGU6OmVuY29kZSgkanNvbikpOwoKcmV0dXJuICRhdWRpdEJpdG1hc2s7Cn0KCiRlcnJvck9yV2FybiA9ICR3YXJuaW5nT25seSA/ICd3YXJuaW5nJyA6ICdlcnJvcic7CmlmICgkYWZmZWN0ZWRQYWNrYWdlc0NvdW50ID4gMCB8fCBjb3VudCgkaWdub3JlZEFkdmlzb3JpZXMpID4gMCkgewokcGFzc2VzID0gWwpbJGlnbm9yZWRBZHZpc29yaWVzLCAiPGluZm8+Rm91bmQgJWQgaWdub3JlZCBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGFkdmlzb3IlcyBhZmZlY3RpbmcgJWQgcGFja2FnZSVzJXM8L2luZm8+Il0sClskYWR2aXNvcmllcywgIjwkZXJyb3JPcldhcm4+Rm91bmQgJWQgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBhZHZpc29yJXMgYWZmZWN0aW5nICVkIHBhY2thZ2UlcyVzPC8kZXJyb3JPcldhcm4+Il0sCl07CmZvcmVhY2ggKCRwYXNzZXMgYXMgWyRhZHZpc29yaWVzVG9PdXRwdXQsICRtZXNzYWdlXSkgewpbJHBrZ0NvdW50LCAkdG90YWxBZHZpc29yeUNvdW50XSA9ICR0aGlzLT5jb3VudEFkdmlzb3JpZXMoJGFkdmlzb3JpZXNUb091dHB1dCk7CmlmICgkcGtnQ291bnQgPiAwKSB7CiRwbHVyYWxpdHkgPSAkdG90YWxBZHZpc29yeUNvdW50ID09PSAxID8gJ3knIDogJ2llcyc7CiRwa2dQbHVyYWxpdHkgPSAkcGtnQ291bnQgPT09IDEgPyAnJyA6ICdzJzsKJHB1bmN0dWF0aW9uID0gJGZvcm1hdCA9PT0gJ3N1bW1hcnknID8gJy4nIDogJzonOwokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigkbWVzc2FnZSwgJHRvdGFsQWR2aXNvcnlDb3VudCwgJHBsdXJhbGl0eSwgJHBrZ0NvdW50LCAkcGtnUGx1cmFsaXR5LCAkcHVuY3R1YXRpb24pKTsKJHRoaXMtPm91dHB1dEFkdmlzb3JpZXMoJGlvLCAkYWR2aXNvcmllc1RvT3V0cHV0LCAkZm9ybWF0KTsKfQp9CgppZiAoJGZvcm1hdCA9PT0gc2VsZjo6Rk9STUFUX1NVTU1BUlkpIHsKJGlvLT53cml0ZUVycm9yKCdSdW4gImNvbXBvc2VyIGF1ZGl0IiBmb3IgYSBmdWxsIGxpc3Qgb2YgYWR2aXNvcmllcy4nKTsKfQp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPk5vIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgYWR2aXNvcmllcyBmb3VuZC48L2luZm8+Jyk7Cn0KCmlmIChjb3VudCgkYWJhbmRvbmVkUGFja2FnZXMpID4gMCAmJiAkZm9ybWF0ICE9PSBzZWxmOjpGT1JNQVRfU1VNTUFSWSkgewokdGhpcy0+b3V0cHV0QWJhbmRvbmVkUGFja2FnZXMoJGlvLCAkYWJhbmRvbmVkUGFja2FnZXMsICRmb3JtYXQpOwp9CgpyZXR1cm4gJGF1ZGl0Qml0bWFzazsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsdGVyQWJhbmRvbmVkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzKTogYXJyYXkKewpyZXR1cm4gYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwa2cpOiBib29sIHsKcmV0dXJuICRwa2cgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJHBrZy0+aXNBYmFuZG9uZWQoKTsKfSk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcHJvY2Vzc0Fkdmlzb3JpZXMoYXJyYXkgJGFsbEFkdmlzb3JpZXMsIGFycmF5ICRpZ25vcmVMaXN0LCBhcnJheSAkaWdub3JlZFNldmVyaXRpZXMpOiBhcnJheQp7CmlmICgkaWdub3JlTGlzdCA9PT0gW10gJiYgJGlnbm9yZWRTZXZlcml0aWVzID09PSBbXSkgewpyZXR1cm4gWydhZHZpc29yaWVzJyA9PiAkYWxsQWR2aXNvcmllcywgJ2lnbm9yZWRBZHZpc29yaWVzJyA9PiBbXV07Cn0KCmlmIChcY291bnQoJGlnbm9yZUxpc3QpID4gMCAmJiAhXGFycmF5X2lzX2xpc3QoJGlnbm9yZUxpc3QpKSB7CiRpZ25vcmVkSWRzID0gYXJyYXlfa2V5cygkaWdub3JlTGlzdCk7Cn0gZWxzZSB7CiRpZ25vcmVkSWRzID0gJGlnbm9yZUxpc3Q7Cn0KCiRhZHZpc29yaWVzID0gW107CiRpZ25vcmVkID0gW107CiRpZ25vcmVSZWFzb24gPSBudWxsOwoKZm9yZWFjaCAoJGFsbEFkdmlzb3JpZXMgYXMgJHBhY2thZ2UgPT4gJHBrZ0Fkdmlzb3JpZXMpIHsKZm9yZWFjaCAoJHBrZ0Fkdmlzb3JpZXMgYXMgJGFkdmlzb3J5KSB7CiRpc0FjdGl2ZSA9IHRydWU7CgppZiAoaW5fYXJyYXkoJGFkdmlzb3J5LT5hZHZpc29yeUlkLCAkaWdub3JlZElkcywgdHJ1ZSkpIHsKJGlzQWN0aXZlID0gZmFsc2U7CiRpZ25vcmVSZWFzb24gPSAkaWdub3JlTGlzdFskYWR2aXNvcnktPmFkdmlzb3J5SWRdID8/IG51bGw7Cn0KCmlmICgkYWR2aXNvcnkgaW5zdGFuY2VvZiBTZWN1cml0eUFkdmlzb3J5KSB7CmlmIChpbl9hcnJheSgkYWR2aXNvcnktPnNldmVyaXR5LCAkaWdub3JlZFNldmVyaXRpZXMsIHRydWUpKSB7CiRpc0FjdGl2ZSA9IGZhbHNlOwokaWdub3JlUmVhc29uID0gIklnbm9yZWQgdmlhIC0taWdub3JlLXNldmVyaXR5PXskYWR2aXNvcnktPnNldmVyaXR5fSI7Cn0KCmlmIChpbl9hcnJheSgkYWR2aXNvcnktPmN2ZSwgJGlnbm9yZWRJZHMsIHRydWUpKSB7CiRpc0FjdGl2ZSA9IGZhbHNlOwokaWdub3JlUmVhc29uID0gJGlnbm9yZUxpc3RbJGFkdmlzb3J5LT5jdmVdID8/IG51bGw7Cn0KCmZvcmVhY2ggKCRhZHZpc29yeS0+c291cmNlcyBhcyAkc291cmNlKSB7CmlmIChpbl9hcnJheSgkc291cmNlWydyZW1vdGVJZCddLCAkaWdub3JlZElkcywgdHJ1ZSkpIHsKJGlzQWN0aXZlID0gZmFsc2U7CiRpZ25vcmVSZWFzb24gPSAkaWdub3JlTGlzdFskc291cmNlWydyZW1vdGVJZCddXSA/PyBudWxsOwpicmVhazsKfQp9Cn0KCmlmICgkaXNBY3RpdmUpIHsKJGFkdmlzb3JpZXNbJHBhY2thZ2VdW10gPSAkYWR2aXNvcnk7CmNvbnRpbnVlOwp9CgoKCmlmICgkYWR2aXNvcnkgaW5zdGFuY2VvZiBTZWN1cml0eUFkdmlzb3J5KSB7CiRhZHZpc29yeSA9ICRhZHZpc29yeS0+dG9JZ25vcmVkQWR2aXNvcnkoJGlnbm9yZVJlYXNvbik7Cn0KCiRpZ25vcmVkWyRwYWNrYWdlXVtdID0gJGFkdmlzb3J5Owp9Cn0KCnJldHVybiBbJ2Fkdmlzb3JpZXMnID0+ICRhZHZpc29yaWVzLCAnaWdub3JlZEFkdmlzb3JpZXMnID0+ICRpZ25vcmVkXTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY291bnRBZHZpc29yaWVzKGFycmF5ICRhZHZpc29yaWVzKTogYXJyYXkKewokY291bnQgPSAwOwpmb3JlYWNoICgkYWR2aXNvcmllcyBhcyAkcGFja2FnZUFkdmlzb3JpZXMpIHsKJGNvdW50ICs9IGNvdW50KCRwYWNrYWdlQWR2aXNvcmllcyk7Cn0KCnJldHVybiBbY291bnQoJGFkdmlzb3JpZXMpLCAkY291bnRdOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdXRwdXRBZHZpc29yaWVzKElPSW50ZXJmYWNlICRpbywgYXJyYXkgJGFkdmlzb3JpZXMsIHN0cmluZyAkZm9ybWF0KTogdm9pZAp7CnN3aXRjaCAoJGZvcm1hdCkgewpjYXNlIHNlbGY6OkZPUk1BVF9UQUJMRToKaWYgKCEoJGlvIGluc3RhbmNlb2YgQ29uc29sZUlPKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdDYW5ub3QgdXNlIHRhYmxlIGZvcm1hdCB3aXRoICcgLiBnZXRfY2xhc3MoJGlvKSk7Cn0KJHRoaXMtPm91dHB1dEFkdmlzb3JpZXNUYWJsZSgkaW8sICRhZHZpc29yaWVzKTsKCnJldHVybjsKY2FzZSBzZWxmOjpGT1JNQVRfUExBSU46CiR0aGlzLT5vdXRwdXRBZHZpc29yaWVzUGxhaW4oJGlvLCAkYWR2aXNvcmllcyk7CgpyZXR1cm47CmNhc2Ugc2VsZjo6Rk9STUFUX1NVTU1BUlk6CgpyZXR1cm47CmRlZmF1bHQ6CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgZm9ybWF0ICInLiRmb3JtYXQuJyIuJyk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdXRwdXRBZHZpc29yaWVzVGFibGUoQ29uc29sZUlPICRpbywgYXJyYXkgJGFkdmlzb3JpZXMpOiB2b2lkCnsKZm9yZWFjaCAoJGFkdmlzb3JpZXMgYXMgJHBhY2thZ2VBZHZpc29yaWVzKSB7CmZvcmVhY2ggKCRwYWNrYWdlQWR2aXNvcmllcyBhcyAkYWR2aXNvcnkpIHsKJGhlYWRlcnMgPSBbCidQYWNrYWdlJywKJ1NldmVyaXR5JywKJ0NWRScsCidUaXRsZScsCidVUkwnLAonQWZmZWN0ZWQgdmVyc2lvbnMnLAonUmVwb3J0ZWQgYXQnLApdOwokcm93ID0gWwokYWR2aXNvcnktPnBhY2thZ2VOYW1lLAokdGhpcy0+Z2V0U2V2ZXJpdHkoJGFkdmlzb3J5KSwKJHRoaXMtPmdldENWRSgkYWR2aXNvcnkpLAokYWR2aXNvcnktPnRpdGxlLAokdGhpcy0+Z2V0VVJMKCRhZHZpc29yeSksCiRhZHZpc29yeS0+YWZmZWN0ZWRWZXJzaW9ucy0+Z2V0UHJldHR5U3RyaW5nKCksCiRhZHZpc29yeS0+cmVwb3J0ZWRBdC0+Zm9ybWF0KERBVEVfQVRPTSksCl07CmlmICgkYWR2aXNvcnktPmN2ZSA9PT0gbnVsbCkgewokaGVhZGVyc1tdID0gJ0Fkdmlzb3J5IElEJzsKJHJvd1tdID0gJGFkdmlzb3J5LT5hZHZpc29yeUlkOwp9CmlmICgkYWR2aXNvcnkgaW5zdGFuY2VvZiBJZ25vcmVkU2VjdXJpdHlBZHZpc29yeSkgewokaGVhZGVyc1tdID0gJ0lnbm9yZSByZWFzb24nOwokcm93W10gPSAkYWR2aXNvcnktPmlnbm9yZVJlYXNvbiA/PyAnTm9uZSBzcGVjaWZpZWQnOwp9CiRpby0+Z2V0VGFibGUoKQotPnNldEhvcml6b250YWwoKQotPnNldEhlYWRlcnMoJGhlYWRlcnMpCi0+YWRkUm93KCRyb3cpCi0+c2V0Q29sdW1uV2lkdGgoMSwgODApCi0+c2V0Q29sdW1uTWF4V2lkdGgoMSwgODApCi0+cmVuZGVyKCk7Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG91dHB1dEFkdmlzb3JpZXNQbGFpbihJT0ludGVyZmFjZSAkaW8sIGFycmF5ICRhZHZpc29yaWVzKTogdm9pZAp7CiRlcnJvciA9IFtdOwokZmlyc3RBZHZpc29yeSA9IHRydWU7CmZvcmVhY2ggKCRhZHZpc29yaWVzIGFzICRwYWNrYWdlQWR2aXNvcmllcykgewpmb3JlYWNoICgkcGFja2FnZUFkdmlzb3JpZXMgYXMgJGFkdmlzb3J5KSB7CmlmICghJGZpcnN0QWR2aXNvcnkpIHsKJGVycm9yW10gPSAnLS0tLS0tLS0nOwp9CiRlcnJvcltdID0gIlBhY2thZ2U6ICIuJGFkdmlzb3J5LT5wYWNrYWdlTmFtZTsKJGVycm9yW10gPSAiU2V2ZXJpdHk6ICIuJHRoaXMtPmdldFNldmVyaXR5KCRhZHZpc29yeSk7CiRlcnJvcltdID0gIkNWRTogIi4kdGhpcy0+Z2V0Q1ZFKCRhZHZpc29yeSk7CmlmICgkYWR2aXNvcnktPmN2ZSA9PT0gbnVsbCkgewokZXJyb3JbXSA9ICJBZHZpc29yeSBJRDogIi4kYWR2aXNvcnktPmFkdmlzb3J5SWQ7Cn0KJGVycm9yW10gPSAiVGl0bGU6ICIuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGFkdmlzb3J5LT50aXRsZSk7CiRlcnJvcltdID0gIlVSTDogIi4kdGhpcy0+Z2V0VVJMKCRhZHZpc29yeSk7CiRlcnJvcltdID0gIkFmZmVjdGVkIHZlcnNpb25zOiAiLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRhZHZpc29yeS0+YWZmZWN0ZWRWZXJzaW9ucy0+Z2V0UHJldHR5U3RyaW5nKCkpOwokZXJyb3JbXSA9ICJSZXBvcnRlZCBhdDogIi4kYWR2aXNvcnktPnJlcG9ydGVkQXQtPmZvcm1hdChEQVRFX0FUT00pOwppZiAoJGFkdmlzb3J5IGluc3RhbmNlb2YgSWdub3JlZFNlY3VyaXR5QWR2aXNvcnkpIHsKJGVycm9yW10gPSAiSWdub3JlIHJlYXNvbjogIi4oJGFkdmlzb3J5LT5pZ25vcmVSZWFzb24gPz8gJ05vbmUgc3BlY2lmaWVkJyk7Cn0KJGZpcnN0QWR2aXNvcnkgPSBmYWxzZTsKfQp9CiRpby0+d3JpdGVFcnJvcigkZXJyb3IpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdXRwdXRBYmFuZG9uZWRQYWNrYWdlcyhJT0ludGVyZmFjZSAkaW8sIGFycmF5ICRwYWNrYWdlcywgc3RyaW5nICRmb3JtYXQpOiB2b2lkCnsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJzxlcnJvcj5Gb3VuZCAlZCBhYmFuZG9uZWQgcGFja2FnZSVzOjwvZXJyb3I+JywgY291bnQoJHBhY2thZ2VzKSwgY291bnQoJHBhY2thZ2VzKSA+IDEgPyAncycgOiAnJykpOwoKaWYgKCRmb3JtYXQgPT09IHNlbGY6OkZPUk1BVF9QTEFJTikgewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBrZykgewokcmVwbGFjZW1lbnQgPSAkcGtnLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKSAhPT0gbnVsbAo/ICdVc2UgJy4kcGtnLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKS4nIGluc3RlYWQnCjogJ05vIHJlcGxhY2VtZW50IHdhcyBzdWdnZXN0ZWQnOwokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKJyVzIGlzIGFiYW5kb25lZC4gJXMuJywKJHRoaXMtPmdldFBhY2thZ2VOYW1lV2l0aExpbmsoJHBrZyksCiRyZXBsYWNlbWVudAopKTsKfQoKcmV0dXJuOwp9CgppZiAoISgkaW8gaW5zdGFuY2VvZiBDb25zb2xlSU8pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0Nhbm5vdCB1c2UgdGFibGUgZm9ybWF0IHdpdGggJyAuIGdldF9jbGFzcygkaW8pKTsKfQoKJHRhYmxlID0gJGlvLT5nZXRUYWJsZSgpCi0+c2V0SGVhZGVycyhbJ0FiYW5kb25lZCBQYWNrYWdlJywgJ1N1Z2dlc3RlZCBSZXBsYWNlbWVudCddKQotPnNldENvbHVtbldpZHRoKDEsIDgwKQotPnNldENvbHVtbk1heFdpZHRoKDEsIDgwKTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGtnKSB7CiRyZXBsYWNlbWVudCA9ICRwa2ctPmdldFJlcGxhY2VtZW50UGFja2FnZSgpICE9PSBudWxsID8gJHBrZy0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkgOiAnbm9uZSc7CiR0YWJsZS0+YWRkUm93KFskdGhpcy0+Z2V0UGFja2FnZU5hbWVXaXRoTGluaygkcGtnKSwgJHJlcGxhY2VtZW50XSk7Cn0KCiR0YWJsZS0+cmVuZGVyKCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGFja2FnZU5hbWVXaXRoTGluayhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogc3RyaW5nCnsKJHBhY2thZ2VVcmwgPSBQYWNrYWdlSW5mbzo6Z2V0Vmlld1NvdXJjZU9ySG9tZXBhZ2VVcmwoJHBhY2thZ2UpOwoKcmV0dXJuICRwYWNrYWdlVXJsICE9PSBudWxsID8gJzxocmVmPScgLiBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkcGFja2FnZVVybCkgLiAnPicgLiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpIC4gJzwvPicgOiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFNldmVyaXR5KFNlY3VyaXR5QWR2aXNvcnkgJGFkdmlzb3J5KTogc3RyaW5nCnsKaWYgKCRhZHZpc29yeS0+c2V2ZXJpdHkgPT09IG51bGwpIHsKcmV0dXJuICcnOwp9CgpyZXR1cm4gJGFkdmlzb3J5LT5zZXZlcml0eTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDVkUoU2VjdXJpdHlBZHZpc29yeSAkYWR2aXNvcnkpOiBzdHJpbmcKewppZiAoJGFkdmlzb3J5LT5jdmUgPT09IG51bGwpIHsKcmV0dXJuICdOTyBDVkUnOwp9CgpyZXR1cm4gJzxocmVmPWh0dHBzOi8vY3ZlLm1pdHJlLm9yZy9jZ2ktYmluL2N2ZW5hbWUuY2dpP25hbWU9Jy4kYWR2aXNvcnktPmN2ZS4nPicuJGFkdmlzb3J5LT5jdmUuJzwvPic7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0VVJMKFNlY3VyaXR5QWR2aXNvcnkgJGFkdmlzb3J5KTogc3RyaW5nCnsKaWYgKCRhZHZpc29yeS0+bGluayA9PT0gbnVsbCkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAnPGhyZWY9Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkYWR2aXNvcnktPmxpbmspLic+Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkYWR2aXNvcnktPmxpbmspLic8Lz4nOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNhbGN1bGF0ZUJpdG1hc2soYm9vbCAkaGFzVnVsbmVyYWJsZVBhY2thZ2VzLCBib29sICRoYXNBYmFuZG9uZWRQYWNrYWdlcyk6IGludAp7CiRiaXRtYXNrID0gc2VsZjo6U1RBVFVTX09LOwoKaWYgKCRoYXNWdWxuZXJhYmxlUGFja2FnZXMpIHsKJGJpdG1hc2sgfD0gc2VsZjo6U1RBVFVTX1ZVTE5FUkFCTEU7Cn0KCmlmICgkaGFzQWJhbmRvbmVkUGFja2FnZXMpIHsKJGJpdG1hc2sgfD0gc2VsZjo6U1RBVFVTX0FCQU5ET05FRDsKfQoKcmV0dXJuICRiaXRtYXNrOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEFkdmlzb3J5OwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBEYXRlVGltZUltbXV0YWJsZTsKCmNsYXNzIElnbm9yZWRTZWN1cml0eUFkdmlzb3J5IGV4dGVuZHMgU2VjdXJpdHlBZHZpc29yeQp7CgoKCgpwdWJsaWMgJGlnbm9yZVJlYXNvbjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHBhY2thZ2VOYW1lLCBzdHJpbmcgJGFkdmlzb3J5SWQsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGFmZmVjdGVkVmVyc2lvbnMsIHN0cmluZyAkdGl0bGUsIGFycmF5ICRzb3VyY2VzLCBEYXRlVGltZUltbXV0YWJsZSAkcmVwb3J0ZWRBdCwgP3N0cmluZyAkY3ZlID0gbnVsbCwgP3N0cmluZyAkbGluayA9IG51bGwsID9zdHJpbmcgJGlnbm9yZVJlYXNvbiA9IG51bGwsID9zdHJpbmcgJHNldmVyaXR5ID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYWNrYWdlTmFtZSwgJGFkdmlzb3J5SWQsICRhZmZlY3RlZFZlcnNpb25zLCAkdGl0bGUsICRzb3VyY2VzLCAkcmVwb3J0ZWRBdCwgJGN2ZSwgJGxpbmssICRzZXZlcml0eSk7CgokdGhpcy0+aWdub3JlUmVhc29uID0gJGlnbm9yZVJlYXNvbjsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCkKewokZGF0YSA9IHBhcmVudDo6anNvblNlcmlhbGl6ZSgpOwppZiAoJHRoaXMtPmlnbm9yZVJlYXNvbiA9PT0gTlVMTCkgewp1bnNldCgkZGF0YVsnaWdub3JlUmVhc29uJ10pOwp9CgpyZXR1cm4gJGRhdGE7Cn0KCn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEFkdmlzb3J5OwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcVmVyc2lvblBhcnNlcjsKdXNlIEpzb25TZXJpYWxpemFibGU7CgpjbGFzcyBQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeSBpbXBsZW1lbnRzIEpzb25TZXJpYWxpemFibGUKewoKCgoKcHVibGljICRhZHZpc29yeUlkOwoKCgoKCnB1YmxpYyAkcGFja2FnZU5hbWU7CgoKCgoKcHVibGljICRhZmZlY3RlZFZlcnNpb25zOwoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKHN0cmluZyAkcGFja2FnZU5hbWUsIGFycmF5ICRkYXRhLCBWZXJzaW9uUGFyc2VyICRwYXJzZXIpOiBzZWxmCnsKJGNvbnN0cmFpbnQgPSAkcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRkYXRhWydhZmZlY3RlZFZlcnNpb25zJ10pOwppZiAoaXNzZXQoJGRhdGFbJ3RpdGxlJ10sICRkYXRhWydzb3VyY2VzJ10sICRkYXRhWydyZXBvcnRlZEF0J10pKSB7CnJldHVybiBuZXcgU2VjdXJpdHlBZHZpc29yeSgkcGFja2FnZU5hbWUsICRkYXRhWydhZHZpc29yeUlkJ10sICRjb25zdHJhaW50LCAkZGF0YVsndGl0bGUnXSwgJGRhdGFbJ3NvdXJjZXMnXSwgbmV3IFxEYXRlVGltZUltbXV0YWJsZSgkZGF0YVsncmVwb3J0ZWRBdCddLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpLCAkZGF0YVsnY3ZlJ10gPz8gbnVsbCwgJGRhdGFbJ2xpbmsnXSA/PyBudWxsLCAkZGF0YVsnc2V2ZXJpdHknXSA/PyBudWxsKTsKfQoKcmV0dXJuIG5ldyBzZWxmKCRwYWNrYWdlTmFtZSwgJGRhdGFbJ2Fkdmlzb3J5SWQnXSwgJGNvbnN0cmFpbnQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRwYWNrYWdlTmFtZSwgc3RyaW5nICRhZHZpc29yeUlkLCBDb25zdHJhaW50SW50ZXJmYWNlICRhZmZlY3RlZFZlcnNpb25zKQp7CiR0aGlzLT5hZHZpc29yeUlkID0gJGFkdmlzb3J5SWQ7CiR0aGlzLT5wYWNrYWdlTmFtZSA9ICRwYWNrYWdlTmFtZTsKJHRoaXMtPmFmZmVjdGVkVmVyc2lvbnMgPSAkYWZmZWN0ZWRWZXJzaW9uczsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCkKewokZGF0YSA9IChhcnJheSkgJHRoaXM7CiRkYXRhWydhZmZlY3RlZFZlcnNpb25zJ10gPSAkZGF0YVsnYWZmZWN0ZWRWZXJzaW9ucyddLT5nZXRQcmV0dHlTdHJpbmcoKTsKCnJldHVybiAkZGF0YTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBZHZpc29yeTsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgRGF0ZVRpbWVJbW11dGFibGU7CgpjbGFzcyBTZWN1cml0eUFkdmlzb3J5IGV4dGVuZHMgUGFydGlhbFNlY3VyaXR5QWR2aXNvcnkKewoKCgoKcHVibGljICR0aXRsZTsKCgoKCgpwdWJsaWMgJGN2ZTsKCgoKCgpwdWJsaWMgJGxpbms7CgoKCgoKcHVibGljICRyZXBvcnRlZEF0OwoKCgoKCnB1YmxpYyAkc291cmNlczsKCgoKCgpwdWJsaWMgJHNldmVyaXR5OwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcGFja2FnZU5hbWUsIHN0cmluZyAkYWR2aXNvcnlJZCwgQ29uc3RyYWludEludGVyZmFjZSAkYWZmZWN0ZWRWZXJzaW9ucywgc3RyaW5nICR0aXRsZSwgYXJyYXkgJHNvdXJjZXMsIERhdGVUaW1lSW1tdXRhYmxlICRyZXBvcnRlZEF0LCA/c3RyaW5nICRjdmUgPSBudWxsLCA/c3RyaW5nICRsaW5rID0gbnVsbCwgP3N0cmluZyAkc2V2ZXJpdHkgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHBhY2thZ2VOYW1lLCAkYWR2aXNvcnlJZCwgJGFmZmVjdGVkVmVyc2lvbnMpOwoKJHRoaXMtPnRpdGxlID0gJHRpdGxlOwokdGhpcy0+c291cmNlcyA9ICRzb3VyY2VzOwokdGhpcy0+cmVwb3J0ZWRBdCA9ICRyZXBvcnRlZEF0OwokdGhpcy0+Y3ZlID0gJGN2ZTsKJHRoaXMtPmxpbmsgPSAkbGluazsKJHRoaXMtPnNldmVyaXR5ID0gJHNldmVyaXR5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdG9JZ25vcmVkQWR2aXNvcnkoP3N0cmluZyAkaWdub3JlUmVhc29uKTogSWdub3JlZFNlY3VyaXR5QWR2aXNvcnkKewpyZXR1cm4gbmV3IElnbm9yZWRTZWN1cml0eUFkdmlzb3J5KAokdGhpcy0+cGFja2FnZU5hbWUsCiR0aGlzLT5hZHZpc29yeUlkLAokdGhpcy0+YWZmZWN0ZWRWZXJzaW9ucywKJHRoaXMtPnRpdGxlLAokdGhpcy0+c291cmNlcywKJHRoaXMtPnJlcG9ydGVkQXQsCiR0aGlzLT5jdmUsCiR0aGlzLT5saW5rLAokaWdub3JlUmVhc29uLAokdGhpcy0+c2V2ZXJpdHkKKTsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCkKewokZGF0YSA9IHBhcmVudDo6anNvblNlcmlhbGl6ZSgpOwokZGF0YVsncmVwb3J0ZWRBdCddID0gJGRhdGFbJ3JlcG9ydGVkQXQnXS0+Zm9ybWF0KERBVEVfUkZDMzMzOSk7CgpyZXR1cm4gJGRhdGE7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQXV0b2xvYWQ7Cgp1c2UgQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3JcQ2xhc3NNYXA7CnVzZSBDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvclxDbGFzc01hcEdlbmVyYXRvcjsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXE51bGxJTzsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XEJvdW5kOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VTb3J0ZXI7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2NrZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CgoKCgoKY2xhc3MgQXV0b2xvYWRHZW5lcmF0b3IKewoKCgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7CgoKCgpwcml2YXRlICRpbzsKCgoKCnByaXZhdGUgJGRldk1vZGUgPSBudWxsOwoKCgoKcHJpdmF0ZSAkY2xhc3NNYXBBdXRob3JpdGF0aXZlID0gZmFsc2U7CgoKCgpwcml2YXRlICRhcGN1ID0gZmFsc2U7CgoKCgpwcml2YXRlICRhcGN1UHJlZml4OwoKCgoKcHJpdmF0ZSAkZHJ5UnVuID0gZmFsc2U7CgoKCgpwcml2YXRlICRydW5TY3JpcHRzID0gZmFsc2U7CgoKCgpwcml2YXRlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEV2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKJHRoaXMtPmlvID0gJGlvID8/IG5ldyBOdWxsSU8oKTsKCiR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZU5vdGhpbmcoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldk1vZGUoYm9vbCAkZGV2TW9kZSA9IHRydWUpCnsKJHRoaXMtPmRldk1vZGUgPSAkZGV2TW9kZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKGJvb2wgJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZSkKewokdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlID0gJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXBjdShib29sICRhcGN1LCA/c3RyaW5nICRhcGN1UHJlZml4ID0gbnVsbCkKewokdGhpcy0+YXBjdSA9ICRhcGN1OwokdGhpcy0+YXBjdVByZWZpeCA9ICRhcGN1UHJlZml4Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSdW5TY3JpcHRzKGJvb2wgJHJ1blNjcmlwdHMgPSB0cnVlKQp7CiR0aGlzLT5ydW5TY3JpcHRzID0gJHJ1blNjcmlwdHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREcnlSdW4oYm9vbCAkZHJ5UnVuID0gdHJ1ZSk6IHZvaWQKewokdGhpcy0+ZHJ5UnVuID0gJGRyeVJ1bjsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElnbm9yZVBsYXRmb3JtUmVxdWlyZW1lbnRzKCRpZ25vcmVQbGF0Zm9ybVJlcXMpCnsKdHJpZ2dlcl9lcnJvcignQXV0b2xvYWRHZW5lcmF0b3I6OnNldElnbm9yZVBsYXRmb3JtUmVxdWlyZW1lbnRzIGlzIGRlcHJlY2F0ZWQgc2luY2UgQ29tcG9zZXIgMi4yLCB1c2Ugc2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiR0aGlzLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Ojpmcm9tQm9vbE9yTGlzdCgkaWdub3JlUGxhdGZvcm1SZXFzKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpCnsKJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZHVtcChDb25maWcgJGNvbmZpZywgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkbG9jYWxSZXBvLCBSb290UGFja2FnZUludGVyZmFjZSAkcm9vdFBhY2thZ2UsIEluc3RhbGxhdGlvbk1hbmFnZXIgJGluc3RhbGxhdGlvbk1hbmFnZXIsIHN0cmluZyAkdGFyZ2V0RGlyLCBib29sICRzY2FuUHNyUGFja2FnZXMgPSBmYWxzZSwgP3N0cmluZyAkc3VmZml4ID0gbnVsbCwgP0xvY2tlciAkbG9ja2VyID0gbnVsbCwgYm9vbCAkc3RyaWN0QW1iaWd1b3VzID0gZmFsc2UpCnsKaWYgKCR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUpIHsKCiRzY2FuUHNyUGFja2FnZXMgPSB0cnVlOwp9CgoKaWYgKG51bGwgPT09ICR0aGlzLT5kZXZNb2RlKSB7CgokdGhpcy0+ZGV2TW9kZSA9IGZhbHNlOwoKJGluc3RhbGxlZEpzb24gPSBuZXcgSnNvbkZpbGUoJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJykuJy9jb21wb3Nlci9pbnN0YWxsZWQuanNvbicpOwppZiAoJGluc3RhbGxlZEpzb24tPmV4aXN0cygpKSB7CiRpbnN0YWxsZWRKc29uID0gJGluc3RhbGxlZEpzb24tPnJlYWQoKTsKaWYgKGlzc2V0KCRpbnN0YWxsZWRKc29uWydkZXYnXSkpIHsKJHRoaXMtPmRldk1vZGUgPSAkaW5zdGFsbGVkSnNvblsnZGV2J107Cn0KfQp9CgppZiAoJHRoaXMtPnJ1blNjcmlwdHMpIHsKCmlmICghaXNzZXQoJF9TRVJWRVJbJ0NPTVBPU0VSX0RFVl9NT0RFJ10pKSB7ClBsYXRmb3JtOjpwdXRFbnYoJ0NPTVBPU0VSX0RFVl9NT0RFJywgJHRoaXMtPmRldk1vZGUgPyAnMScgOiAnMCcpOwp9CgokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBSRV9BVVRPTE9BRF9EVU1QLCAkdGhpcy0+ZGV2TW9kZSwgW10sIFsKJ29wdGltaXplJyA9PiAkc2NhblBzclBhY2thZ2VzLApdKTsKfQoKJGNsYXNzTWFwR2VuZXJhdG9yID0gbmV3IENsYXNzTWFwR2VuZXJhdG9yKFsncGhwJywgJ2luYycsICdoaCddKTsKJGNsYXNzTWFwR2VuZXJhdG9yLT5hdm9pZER1cGxpY2F0ZVNjYW5zKCk7CgokZmlsZXN5c3RlbSA9IG5ldyBGaWxlc3lzdGVtKCk7CiRmaWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJykpOwoKCgokYmFzZVBhdGggPSAkZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aChyZWFscGF0aChyZWFscGF0aChQbGF0Zm9ybTo6Z2V0Q3dkKCkpKSk7CiR2ZW5kb3JQYXRoID0gJGZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgocmVhbHBhdGgocmVhbHBhdGgoJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJykpKSk7CiR1c2VHbG9iYWxJbmNsdWRlUGF0aCA9ICRjb25maWctPmdldCgndXNlLWluY2x1ZGUtcGF0aCcpOwokcHJlcGVuZEF1dG9sb2FkZXIgPSAkY29uZmlnLT5nZXQoJ3ByZXBlbmQtYXV0b2xvYWRlcicpID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSc7CiR0YXJnZXREaXIgPSAkdmVuZG9yUGF0aC4nLycuJHRhcmdldERpcjsKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGFyZ2V0RGlyKTsKCiR2ZW5kb3JQYXRoQ29kZSA9ICRmaWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZShyZWFscGF0aCgkdGFyZ2V0RGlyKSwgJHZlbmRvclBhdGgsIHRydWUpOwokdmVuZG9yUGF0aFRvVGFyZ2V0RGlyQ29kZSA9ICRmaWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZSgkdmVuZG9yUGF0aCwgcmVhbHBhdGgoJHRhcmdldERpciksIHRydWUpOwoKJGFwcEJhc2VEaXJDb2RlID0gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKCR2ZW5kb3JQYXRoLCAkYmFzZVBhdGgsIHRydWUpOwokYXBwQmFzZURpckNvZGUgPSBzdHJfcmVwbGFjZSgnX19ESVJfXycsICckdmVuZG9yRGlyJywgJGFwcEJhc2VEaXJDb2RlKTsKCiRuYW1lc3BhY2VzRmlsZSA9IDw8PEVPRgo8P3BocAoKLy8gYXV0b2xvYWRfbmFtZXNwYWNlcy5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKXCR2ZW5kb3JEaXIgPSAkdmVuZG9yUGF0aENvZGU7ClwkYmFzZURpciA9ICRhcHBCYXNlRGlyQ29kZTsKCnJldHVybiBhcnJheSgKCkVPRjsKCiRwc3I0RmlsZSA9IDw8PEVPRgo8P3BocAoKLy8gYXV0b2xvYWRfcHNyNC5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKXCR2ZW5kb3JEaXIgPSAkdmVuZG9yUGF0aENvZGU7ClwkYmFzZURpciA9ICRhcHBCYXNlRGlyQ29kZTsKCnJldHVybiBhcnJheSgKCkVPRjsKCgokZGV2UGFja2FnZU5hbWVzID0gJGxvY2FsUmVwby0+Z2V0RGV2UGFja2FnZU5hbWVzKCk7CiRwYWNrYWdlTWFwID0gJHRoaXMtPmJ1aWxkUGFja2FnZU1hcCgkaW5zdGFsbGF0aW9uTWFuYWdlciwgJHJvb3RQYWNrYWdlLCAkbG9jYWxSZXBvLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpKTsKaWYgKCR0aGlzLT5kZXZNb2RlKSB7CgokZmlsdGVyZWREZXZQYWNrYWdlcyA9IGZhbHNlOwp9IGVsc2UgewoKJGZpbHRlcmVkRGV2UGFja2FnZXMgPSAkZGV2UGFja2FnZU5hbWVzID86IHRydWU7Cn0KJGF1dG9sb2FkcyA9ICR0aGlzLT5wYXJzZUF1dG9sb2FkcygkcGFja2FnZU1hcCwgJHJvb3RQYWNrYWdlLCAkZmlsdGVyZWREZXZQYWNrYWdlcyk7CgoKZm9yZWFjaCAoJGF1dG9sb2Fkc1sncHNyLTAnXSBhcyAkbmFtZXNwYWNlID0+ICRwYXRocykgewokZXhwb3J0ZWRQYXRocyA9IFtdOwpmb3JlYWNoICgkcGF0aHMgYXMgJHBhdGgpIHsKJGV4cG9ydGVkUGF0aHNbXSA9ICR0aGlzLT5nZXRQYXRoQ29kZSgkZmlsZXN5c3RlbSwgJGJhc2VQYXRoLCAkdmVuZG9yUGF0aCwgJHBhdGgpOwp9CiRleHBvcnRlZFByZWZpeCA9IHZhcl9leHBvcnQoJG5hbWVzcGFjZSwgdHJ1ZSk7CiRuYW1lc3BhY2VzRmlsZSAuPSAiICAgICRleHBvcnRlZFByZWZpeCA9PiAiOwokbmFtZXNwYWNlc0ZpbGUgLj0gImFycmF5KCIuaW1wbG9kZSgnLCAnLCAkZXhwb3J0ZWRQYXRocykuIiksXG4iOwp9CiRuYW1lc3BhY2VzRmlsZSAuPSAiKTtcbiI7CgoKZm9yZWFjaCAoJGF1dG9sb2Fkc1sncHNyLTQnXSBhcyAkbmFtZXNwYWNlID0+ICRwYXRocykgewokZXhwb3J0ZWRQYXRocyA9IFtdOwpmb3JlYWNoICgkcGF0aHMgYXMgJHBhdGgpIHsKJGV4cG9ydGVkUGF0aHNbXSA9ICR0aGlzLT5nZXRQYXRoQ29kZSgkZmlsZXN5c3RlbSwgJGJhc2VQYXRoLCAkdmVuZG9yUGF0aCwgJHBhdGgpOwp9CiRleHBvcnRlZFByZWZpeCA9IHZhcl9leHBvcnQoJG5hbWVzcGFjZSwgdHJ1ZSk7CiRwc3I0RmlsZSAuPSAiICAgICRleHBvcnRlZFByZWZpeCA9PiAiOwokcHNyNEZpbGUgLj0gImFycmF5KCIuaW1wbG9kZSgnLCAnLCAkZXhwb3J0ZWRQYXRocykuIiksXG4iOwp9CiRwc3I0RmlsZSAuPSAiKTtcbiI7CgoKJHRhcmdldERpckxvYWRlciA9IG51bGw7CiRtYWluQXV0b2xvYWQgPSAkcm9vdFBhY2thZ2UtPmdldEF1dG9sb2FkKCk7CmlmICgkcm9vdFBhY2thZ2UtPmdldFRhcmdldERpcigpICYmICFlbXB0eSgkbWFpbkF1dG9sb2FkWydwc3ItMCddKSkgewokbGV2ZWxzID0gc3Vic3RyX2NvdW50KCRmaWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCRyb290UGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkpLCAnLycpICsgMTsKJHByZWZpeGVzID0gaW1wbG9kZSgnLCAnLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkcHJlZml4KTogc3RyaW5nIHsKcmV0dXJuIHZhcl9leHBvcnQoJHByZWZpeCwgdHJ1ZSk7Cn0sIGFycmF5X2tleXMoJG1haW5BdXRvbG9hZFsncHNyLTAnXSkpKTsKJGJhc2VEaXJGcm9tVGFyZ2V0RGlyQ29kZSA9ICRmaWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZSgkdGFyZ2V0RGlyLCAkYmFzZVBhdGgsIHRydWUpOwoKJHRhcmdldERpckxvYWRlciA9IDw8PEVPRgoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXV0b2xvYWQoXCRjbGFzcykKICAgIHsKICAgICAgICBcJGRpciA9ICRiYXNlRGlyRnJvbVRhcmdldERpckNvZGUgLiAnLyc7CiAgICAgICAgXCRwcmVmaXhlcyA9IGFycmF5KCRwcmVmaXhlcyk7CiAgICAgICAgZm9yZWFjaCAoXCRwcmVmaXhlcyBhcyBcJHByZWZpeCkgewogICAgICAgICAgICBpZiAoMCAhPT0gc3RycG9zKFwkY2xhc3MsIFwkcHJlZml4KSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgXCRwYXRoID0gXCRkaXIgLiBpbXBsb2RlKCcvJywgYXJyYXlfc2xpY2UoZXhwbG9kZSgnXFxcXCcsIFwkY2xhc3MpLCAkbGV2ZWxzKSkuJy5waHAnOwogICAgICAgICAgICBpZiAoIVwkcGF0aCA9IHN0cmVhbV9yZXNvbHZlX2luY2x1ZGVfcGF0aChcJHBhdGgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVxdWlyZSBcJHBhdGg7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CgpFT0Y7Cn0KCiRleGNsdWRlZCA9IFtdOwppZiAoIWVtcHR5KCRhdXRvbG9hZHNbJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCddKSkgewokZXhjbHVkZWQgPSAkYXV0b2xvYWRzWydleGNsdWRlLWZyb20tY2xhc3NtYXAnXTsKfQoKZm9yZWFjaCAoJGF1dG9sb2Fkc1snY2xhc3NtYXAnXSBhcyAkZGlyKSB7CiRjbGFzc01hcEdlbmVyYXRvci0+c2NhblBhdGhzKCRkaXIsICR0aGlzLT5idWlsZEV4Y2x1c2lvblJlZ2V4KCRkaXIsICRleGNsdWRlZCkpOwp9CgppZiAoJHNjYW5Qc3JQYWNrYWdlcykgewokbmFtZXNwYWNlc1RvU2NhbiA9IFtdOwoKCmZvcmVhY2ggKFsncHNyLTQnLCAncHNyLTAnXSBhcyAkcHNyVHlwZSkgewpmb3JlYWNoICgkYXV0b2xvYWRzWyRwc3JUeXBlXSBhcyAkbmFtZXNwYWNlID0+ICRwYXRocykgewokbmFtZXNwYWNlc1RvU2NhblskbmFtZXNwYWNlXVtdID0gWydwYXRocycgPT4gJHBhdGhzLCAndHlwZScgPT4gJHBzclR5cGVdOwp9Cn0KCmtyc29ydCgkbmFtZXNwYWNlc1RvU2Nhbik7Cgpmb3JlYWNoICgkbmFtZXNwYWNlc1RvU2NhbiBhcyAkbmFtZXNwYWNlID0+ICRncm91cHMpIHsKZm9yZWFjaCAoJGdyb3VwcyBhcyAkZ3JvdXApIHsKZm9yZWFjaCAoJGdyb3VwWydwYXRocyddIGFzICRkaXIpIHsKJGRpciA9ICRmaWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCRmaWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkZGlyKSA/ICRkaXIgOiAkYmFzZVBhdGguJy8nLiRkaXIpOwppZiAoIWlzX2RpcigkZGlyKSkgewpjb250aW51ZTsKfQoKCmlmIChzdHJfY29udGFpbnMoJHZlbmRvclBhdGgsICRkaXIuJy8nKSkgewokZXhjbHVzaW9uUmVnZXggPSAkdGhpcy0+YnVpbGRFeGNsdXNpb25SZWdleCgkZGlyLCBhcnJheV9tZXJnZSgkZXhjbHVkZWQsIFskdmVuZG9yUGF0aC4nLyddKSk7Cn0gZWxzZSB7CiRleGNsdXNpb25SZWdleCA9ICR0aGlzLT5idWlsZEV4Y2x1c2lvblJlZ2V4KCRkaXIsICRleGNsdWRlZCk7Cn0KCiRjbGFzc01hcEdlbmVyYXRvci0+c2NhblBhdGhzKCRkaXIsICRleGNsdXNpb25SZWdleCwgJGdyb3VwWyd0eXBlJ10sICRuYW1lc3BhY2UpOwp9Cn0KfQp9CgokY2xhc3NNYXAgPSAkY2xhc3NNYXBHZW5lcmF0b3ItPmdldENsYXNzTWFwKCk7CmlmICgkc3RyaWN0QW1iaWd1b3VzKSB7CiRhbWJpZ3VvdXNDbGFzc2VzID0gJGNsYXNzTWFwLT5nZXRBbWJpZ3VvdXNDbGFzc2VzKGZhbHNlKTsKfSBlbHNlIHsKJGFtYmlndW91c0NsYXNzZXMgPSAkY2xhc3NNYXAtPmdldEFtYmlndW91c0NsYXNzZXMoKTsKfQpmb3JlYWNoICgkYW1iaWd1b3VzQ2xhc3NlcyBhcyAkY2xhc3NOYW1lID0+ICRhbWJpZ3VvdXNQYXRocykgewppZiAoY291bnQoJGFtYmlndW91c1BhdGhzKSA+IDEpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKAonPHdhcm5pbmc+V2FybmluZzogQW1iaWd1b3VzIGNsYXNzIHJlc29sdXRpb24sICInLiRjbGFzc05hbWUuJyInLgonIHdhcyBmb3VuZCAnLiAoY291bnQoJGFtYmlndW91c1BhdGhzKSArIDEpIC4neDogaW4gIicuJGNsYXNzTWFwLT5nZXRDbGFzc1BhdGgoJGNsYXNzTmFtZSkuJyIgYW5kICInLiBpbXBsb2RlKCciLCAiJywgJGFtYmlndW91c1BhdGhzKSAuJyIsIHRoZSBmaXJzdCB3aWxsIGJlIHVzZWQuPC93YXJuaW5nPicKKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKAonPHdhcm5pbmc+V2FybmluZzogQW1iaWd1b3VzIGNsYXNzIHJlc29sdXRpb24sICInLiRjbGFzc05hbWUuJyInLgonIHdhcyBmb3VuZCBpbiBib3RoICInLiRjbGFzc01hcC0+Z2V0Q2xhc3NQYXRoKCRjbGFzc05hbWUpLiciIGFuZCAiJy4gaW1wbG9kZSgnIiwgIicsICRhbWJpZ3VvdXNQYXRocykgLiciLCB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkLjwvd2FybmluZz4nCik7Cn0KfQppZiAoXGNvdW50KCRhbWJpZ3VvdXNDbGFzc2VzKSA+IDApIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5UbyByZXNvbHZlIGFtYmlndWl0eSBpbiBjbGFzc2VzIG5vdCB1bmRlciB5b3VyIGNvbnRyb2wgeW91IGNhbiBpZ25vcmUgdGhlbSBieSBwYXRoIHVzaW5nIDxocmVmPScuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJ2h0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNC1zY2hlbWEubWQjZXhjbHVkZS1maWxlcy1mcm9tLWNsYXNzbWFwcycpLic+ZXhjbHVkZS1maWxlcy1mcm9tLWNsYXNzbWFwPC8+Jyk7Cn0KCgokY2xhc3NNYXAtPmNsZWFyUHNyVmlvbGF0aW9uc0J5UGF0aCgkdmVuZG9yUGF0aCk7CmZvcmVhY2ggKCRjbGFzc01hcC0+Z2V0UHNyVmlvbGF0aW9ucygpIGFzICRtc2cpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCI8d2FybmluZz4kbXNnPC93YXJuaW5nPiIpOwp9CgokY2xhc3NNYXAtPmFkZENsYXNzKCdDb21wb3NlclxJbnN0YWxsZWRWZXJzaW9ucycsICR2ZW5kb3JQYXRoIC4gJy9jb21wb3Nlci9JbnN0YWxsZWRWZXJzaW9ucy5waHAnKTsKJGNsYXNzTWFwLT5zb3J0KCk7CgokY2xhc3NtYXBGaWxlID0gPDw8RU9GCjw/cGhwCgovLyBhdXRvbG9hZF9jbGFzc21hcC5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKXCR2ZW5kb3JEaXIgPSAkdmVuZG9yUGF0aENvZGU7ClwkYmFzZURpciA9ICRhcHBCYXNlRGlyQ29kZTsKCnJldHVybiBhcnJheSgKCkVPRjsKZm9yZWFjaCAoJGNsYXNzTWFwLT5nZXRNYXAoKSBhcyAkY2xhc3NOYW1lID0+ICRwYXRoKSB7CiRwYXRoQ29kZSA9ICR0aGlzLT5nZXRQYXRoQ29kZSgkZmlsZXN5c3RlbSwgJGJhc2VQYXRoLCAkdmVuZG9yUGF0aCwgJHBhdGgpLiIsXG4iOwokY2xhc3NtYXBGaWxlIC49ICcgICAgJy52YXJfZXhwb3J0KCRjbGFzc05hbWUsIHRydWUpLicgPT4gJy4kcGF0aENvZGU7Cn0KJGNsYXNzbWFwRmlsZSAuPSAiKTtcbiI7CgppZiAoJycgPT09ICRzdWZmaXgpIHsKJHN1ZmZpeCA9IG51bGw7Cn0KaWYgKG51bGwgPT09ICRzdWZmaXgpIHsKJHN1ZmZpeCA9ICRjb25maWctPmdldCgnYXV0b2xvYWRlci1zdWZmaXgnKTsKCgppZiAobnVsbCA9PT0gJHN1ZmZpeCAmJiBGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCR2ZW5kb3JQYXRoLicvYXV0b2xvYWQucGhwJykpIHsKJGNvbnRlbnQgPSAoc3RyaW5nKSBmaWxlX2dldF9jb250ZW50cygkdmVuZG9yUGF0aC4nL2F1dG9sb2FkLnBocCcpOwppZiAoUHJlZzo6aXNNYXRjaCgne0NvbXBvc2VyQXV0b2xvYWRlckluaXQoW146XHNdKyk6On0nLCAkY29udGVudCwgJG1hdGNoKSkgewokc3VmZml4ID0gJG1hdGNoWzFdOwp9Cn0KCmlmIChudWxsID09PSAkc3VmZml4KSB7CiRzdWZmaXggPSAkbG9ja2VyICE9PSBudWxsICYmICRsb2NrZXItPmlzTG9ja2VkKCkgPyAkbG9ja2VyLT5nZXRMb2NrRGF0YSgpWydjb250ZW50LWhhc2gnXSA6IGJpbjJoZXgocmFuZG9tX2J5dGVzKDE2KSk7Cn0KfQoKaWYgKCR0aGlzLT5kcnlSdW4pIHsKcmV0dXJuICRjbGFzc01hcDsKfQoKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX25hbWVzcGFjZXMucGhwJywgJG5hbWVzcGFjZXNGaWxlKTsKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX3BzcjQucGhwJywgJHBzcjRGaWxlKTsKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX2NsYXNzbWFwLnBocCcsICRjbGFzc21hcEZpbGUpOwokaW5jbHVkZVBhdGhGaWxlUGF0aCA9ICR0YXJnZXREaXIuJy9pbmNsdWRlX3BhdGhzLnBocCc7CmlmICgkaW5jbHVkZVBhdGhGaWxlQ29udGVudHMgPSAkdGhpcy0+Z2V0SW5jbHVkZVBhdGhzRmlsZSgkcGFja2FnZU1hcCwgJGZpbGVzeXN0ZW0sICRiYXNlUGF0aCwgJHZlbmRvclBhdGgsICR2ZW5kb3JQYXRoQ29kZSwgJGFwcEJhc2VEaXJDb2RlKSkgewokZmlsZXN5c3RlbS0+ZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZCgkaW5jbHVkZVBhdGhGaWxlUGF0aCwgJGluY2x1ZGVQYXRoRmlsZUNvbnRlbnRzKTsKfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCRpbmNsdWRlUGF0aEZpbGVQYXRoKSkgewp1bmxpbmsoJGluY2x1ZGVQYXRoRmlsZVBhdGgpOwp9CiRpbmNsdWRlRmlsZXNGaWxlUGF0aCA9ICR0YXJnZXREaXIuJy9hdXRvbG9hZF9maWxlcy5waHAnOwppZiAoJGluY2x1ZGVGaWxlc0ZpbGVDb250ZW50cyA9ICR0aGlzLT5nZXRJbmNsdWRlRmlsZXNGaWxlKCRhdXRvbG9hZHNbJ2ZpbGVzJ10sICRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoLCAkdmVuZG9yUGF0aENvZGUsICRhcHBCYXNlRGlyQ29kZSkpIHsKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJGluY2x1ZGVGaWxlc0ZpbGVQYXRoLCAkaW5jbHVkZUZpbGVzRmlsZUNvbnRlbnRzKTsKfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCRpbmNsdWRlRmlsZXNGaWxlUGF0aCkpIHsKdW5saW5rKCRpbmNsdWRlRmlsZXNGaWxlUGF0aCk7Cn0KJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX3N0YXRpYy5waHAnLCAkdGhpcy0+Z2V0U3RhdGljRmlsZSgkc3VmZml4LCAkdGFyZ2V0RGlyLCAkdmVuZG9yUGF0aCwgJGJhc2VQYXRoKSk7CiRjaGVja1BsYXRmb3JtID0gJGNvbmZpZy0+Z2V0KCdwbGF0Zm9ybS1jaGVjaycpICE9PSBmYWxzZSAmJiAhKCR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CiRwbGF0Zm9ybUNoZWNrQ29udGVudCA9IG51bGw7CmlmICgkY2hlY2tQbGF0Zm9ybSkgewokcGxhdGZvcm1DaGVja0NvbnRlbnQgPSAkdGhpcy0+Z2V0UGxhdGZvcm1DaGVjaygkcGFja2FnZU1hcCwgJGNvbmZpZy0+Z2V0KCdwbGF0Zm9ybS1jaGVjaycpLCAkZGV2UGFja2FnZU5hbWVzKTsKaWYgKG51bGwgPT09ICRwbGF0Zm9ybUNoZWNrQ29udGVudCkgewokY2hlY2tQbGF0Zm9ybSA9IGZhbHNlOwp9Cn0KaWYgKCRjaGVja1BsYXRmb3JtKSB7CiRmaWxlc3lzdGVtLT5maWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKCR0YXJnZXREaXIuJy9wbGF0Zm9ybV9jaGVjay5waHAnLCAkcGxhdGZvcm1DaGVja0NvbnRlbnQpOwp9IGVsc2VpZiAoZmlsZV9leGlzdHMoJHRhcmdldERpci4nL3BsYXRmb3JtX2NoZWNrLnBocCcpKSB7CnVubGluaygkdGFyZ2V0RGlyLicvcGxhdGZvcm1fY2hlY2sucGhwJyk7Cn0KJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHZlbmRvclBhdGguJy9hdXRvbG9hZC5waHAnLCAkdGhpcy0+Z2V0QXV0b2xvYWRGaWxlKCR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlLCAkc3VmZml4KSk7CiRmaWxlc3lzdGVtLT5maWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKCR0YXJnZXREaXIuJy9hdXRvbG9hZF9yZWFsLnBocCcsICR0aGlzLT5nZXRBdXRvbG9hZFJlYWxGaWxlKHRydWUsIChib29sKSAkaW5jbHVkZVBhdGhGaWxlQ29udGVudHMsICR0YXJnZXREaXJMb2FkZXIsIChib29sKSAkaW5jbHVkZUZpbGVzRmlsZUNvbnRlbnRzLCAkdmVuZG9yUGF0aENvZGUsICRhcHBCYXNlRGlyQ29kZSwgJHN1ZmZpeCwgJHVzZUdsb2JhbEluY2x1ZGVQYXRoLCAkcHJlcGVuZEF1dG9sb2FkZXIsICRjaGVja1BsYXRmb3JtKSk7CgokZmlsZXN5c3RlbS0+c2FmZUNvcHkoX19ESVJfXy4nL0NsYXNzTG9hZGVyLnBocCcsICR0YXJnZXREaXIuJy9DbGFzc0xvYWRlci5waHAnKTsKJGZpbGVzeXN0ZW0tPnNhZmVDb3B5KF9fRElSX18uJy8uLi8uLi8uLi9MSUNFTlNFJywgJHRhcmdldERpci4nL0xJQ0VOU0UnKTsKCmlmICgkdGhpcy0+cnVuU2NyaXB0cykgewokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBPU1RfQVVUT0xPQURfRFVNUCwgJHRoaXMtPmRldk1vZGUsIFtdLCBbCidvcHRpbWl6ZScgPT4gJHNjYW5Qc3JQYWNrYWdlcywKXSk7Cn0KCnJldHVybiAkY2xhc3NNYXA7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkRXhjbHVzaW9uUmVnZXgoc3RyaW5nICRkaXIsIGFycmF5ICRleGNsdWRlZCk6ID9zdHJpbmcKewppZiAoW10gPT09ICRleGNsdWRlZCkgewpyZXR1cm4gbnVsbDsKfQoKCgoKaWYgKGZpbGVfZXhpc3RzKCRkaXIpKSB7CgokZGlyTWF0Y2ggPSBwcmVnX3F1b3RlKHN0cnRyKHJlYWxwYXRoKCRkaXIpLCAnXFwnLCAnLycpKTsKZm9yZWFjaCAoJGV4Y2x1ZGVkIGFzICRpbmRleCA9PiAkcGF0dGVybikgewoKJHBhdHRlcm4gPSBQcmVnOjpyZXBsYWNlKCd7XigoW14uKyo/XFteXF0kKCl7fT0hPD58OlxcXFwjLV0rfFxcXFxbLisqP1xbXlxdJCgpe309ITw+fDojLV0pKikuKn0nLCAnJDEnLCAkcGF0dGVybik7CgppZiAoMCAhPT0gc3RycG9zKCRwYXR0ZXJuLCAkZGlyTWF0Y2gpICYmIDAgIT09IHN0cnBvcygkZGlyTWF0Y2gsICRwYXR0ZXJuKSkgewp1bnNldCgkZXhjbHVkZWRbJGluZGV4XSk7Cn0KfQp9CgpyZXR1cm4gXGNvdW50KCRleGNsdWRlZCkgPiAwID8gJ3soJyAuIGltcGxvZGUoJ3wnLCAkZXhjbHVkZWQpIC4gJyl9JyA6IG51bGw7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gYnVpbGRQYWNrYWdlTWFwKEluc3RhbGxhdGlvbk1hbmFnZXIgJGluc3RhbGxhdGlvbk1hbmFnZXIsIFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlLCBhcnJheSAkcGFja2FnZXMpCnsKCiRwYWNrYWdlTWFwID0gW1skcm9vdFBhY2thZ2UsICcnXV07Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CiR0aGlzLT52YWxpZGF0ZVBhY2thZ2UoJHBhY2thZ2UpOwokcGFja2FnZU1hcFtdID0gWwokcGFja2FnZSwKJGluc3RhbGxhdGlvbk1hbmFnZXItPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKSwKXTsKfQoKcmV0dXJuICRwYWNrYWdlTWFwOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiRhdXRvbG9hZCA9ICRwYWNrYWdlLT5nZXRBdXRvbG9hZCgpOwppZiAoIWVtcHR5KCRhdXRvbG9hZFsncHNyLTQnXSkgJiYgbnVsbCAhPT0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpKSB7CiRuYW1lID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKJHBhY2thZ2UtPmdldFRhcmdldERpcigpOwp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUFNSLTQgYXV0b2xvYWRpbmcgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldC1kaXIgcHJvcGVydHksIHJlbW92ZSB0aGUgdGFyZ2V0LWRpciBpbiBwYWNrYWdlICckbmFtZScuIik7Cn0KaWYgKCFlbXB0eSgkYXV0b2xvYWRbJ3Bzci00J10pKSB7CmZvcmVhY2ggKCRhdXRvbG9hZFsncHNyLTQnXSBhcyAkbmFtZXNwYWNlID0+ICRkaXJzKSB7CmlmICgkbmFtZXNwYWNlICE9PSAnJyAmJiAnXFwnICE9PSBzdWJzdHIoJG5hbWVzcGFjZSwgLTEpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJwc3ItNCBuYW1lc3BhY2VzIG11c3QgZW5kIHdpdGggYSBuYW1lc3BhY2Ugc2VwYXJhdG9yLCAnJG5hbWVzcGFjZScgZG9lcyBub3QsIHVzZSAnJG5hbWVzcGFjZVxcJy4iKTsKfQp9Cn0KfQoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlQXV0b2xvYWRzKGFycmF5ICRwYWNrYWdlTWFwLCBQYWNrYWdlSW50ZXJmYWNlICRyb290UGFja2FnZSwgJGZpbHRlcmVkRGV2UGFja2FnZXMgPSBmYWxzZSkKewokcm9vdFBhY2thZ2VNYXAgPSBhcnJheV9zaGlmdCgkcGFja2FnZU1hcCk7CmlmIChpc19hcnJheSgkZmlsdGVyZWREZXZQYWNrYWdlcykpIHsKJHBhY2thZ2VNYXAgPSBhcnJheV9maWx0ZXIoJHBhY2thZ2VNYXAsIHN0YXRpYyBmdW5jdGlvbiAoJGl0ZW0pIHVzZSAoJGZpbHRlcmVkRGV2UGFja2FnZXMpOiBib29sIHsKcmV0dXJuICFpbl9hcnJheSgkaXRlbVswXS0+Z2V0TmFtZSgpLCAkZmlsdGVyZWREZXZQYWNrYWdlcywgdHJ1ZSk7Cn0pOwp9IGVsc2VpZiAoJGZpbHRlcmVkRGV2UGFja2FnZXMpIHsKJHBhY2thZ2VNYXAgPSAkdGhpcy0+ZmlsdGVyUGFja2FnZU1hcCgkcGFja2FnZU1hcCwgJHJvb3RQYWNrYWdlKTsKfQokc29ydGVkUGFja2FnZU1hcCA9ICR0aGlzLT5zb3J0UGFja2FnZU1hcCgkcGFja2FnZU1hcCk7CiRzb3J0ZWRQYWNrYWdlTWFwW10gPSAkcm9vdFBhY2thZ2VNYXA7CiRyZXZlcnNlU29ydGVkTWFwID0gYXJyYXlfcmV2ZXJzZSgkc29ydGVkUGFja2FnZU1hcCk7CgoKCiRwc3IwID0gJHRoaXMtPnBhcnNlQXV0b2xvYWRzVHlwZSgkcmV2ZXJzZVNvcnRlZE1hcCwgJ3Bzci0wJywgJHJvb3RQYWNrYWdlKTsKJHBzcjQgPSAkdGhpcy0+cGFyc2VBdXRvbG9hZHNUeXBlKCRyZXZlcnNlU29ydGVkTWFwLCAncHNyLTQnLCAkcm9vdFBhY2thZ2UpOwokY2xhc3NtYXAgPSAkdGhpcy0+cGFyc2VBdXRvbG9hZHNUeXBlKCRyZXZlcnNlU29ydGVkTWFwLCAnY2xhc3NtYXAnLCAkcm9vdFBhY2thZ2UpOwoKCiRmaWxlcyA9ICR0aGlzLT5wYXJzZUF1dG9sb2Fkc1R5cGUoJHNvcnRlZFBhY2thZ2VNYXAsICdmaWxlcycsICRyb290UGFja2FnZSk7CgokZXhjbHVkZSA9ICR0aGlzLT5wYXJzZUF1dG9sb2Fkc1R5cGUoJHNvcnRlZFBhY2thZ2VNYXAsICdleGNsdWRlLWZyb20tY2xhc3NtYXAnLCAkcm9vdFBhY2thZ2UpOwoKa3Jzb3J0KCRwc3IwKTsKa3Jzb3J0KCRwc3I0KTsKCnJldHVybiBbCidwc3ItMCcgPT4gJHBzcjAsCidwc3ItNCcgPT4gJHBzcjQsCidjbGFzc21hcCcgPT4gJGNsYXNzbWFwLAonZmlsZXMnID0+ICRmaWxlcywKJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCcgPT4gJGV4Y2x1ZGUsCl07Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVMb2FkZXIoYXJyYXkgJGF1dG9sb2FkcywgP3N0cmluZyAkdmVuZG9yRGlyID0gbnVsbCkKewokbG9hZGVyID0gbmV3IENsYXNzTG9hZGVyKCR2ZW5kb3JEaXIpOwoKaWYgKGlzc2V0KCRhdXRvbG9hZHNbJ3Bzci0wJ10pKSB7CmZvcmVhY2ggKCRhdXRvbG9hZHNbJ3Bzci0wJ10gYXMgJG5hbWVzcGFjZSA9PiAkcGF0aCkgewokbG9hZGVyLT5hZGQoJG5hbWVzcGFjZSwgJHBhdGgpOwp9Cn0KCmlmIChpc3NldCgkYXV0b2xvYWRzWydwc3ItNCddKSkgewpmb3JlYWNoICgkYXV0b2xvYWRzWydwc3ItNCddIGFzICRuYW1lc3BhY2UgPT4gJHBhdGgpIHsKJGxvYWRlci0+YWRkUHNyNCgkbmFtZXNwYWNlLCAkcGF0aCk7Cn0KfQoKaWYgKGlzc2V0KCRhdXRvbG9hZHNbJ2NsYXNzbWFwJ10pKSB7CiRleGNsdWRlZCA9IFtdOwppZiAoIWVtcHR5KCRhdXRvbG9hZHNbJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCddKSkgewokZXhjbHVkZWQgPSAkYXV0b2xvYWRzWydleGNsdWRlLWZyb20tY2xhc3NtYXAnXTsKfQoKJGNsYXNzTWFwR2VuZXJhdG9yID0gbmV3IENsYXNzTWFwR2VuZXJhdG9yKFsncGhwJywgJ2luYycsICdoaCddKTsKJGNsYXNzTWFwR2VuZXJhdG9yLT5hdm9pZER1cGxpY2F0ZVNjYW5zKCk7Cgpmb3JlYWNoICgkYXV0b2xvYWRzWydjbGFzc21hcCddIGFzICRkaXIpIHsKdHJ5IHsKJGNsYXNzTWFwR2VuZXJhdG9yLT5zY2FuUGF0aHMoJGRpciwgJHRoaXMtPmJ1aWxkRXhjbHVzaW9uUmVnZXgoJGRpciwgJGV4Y2x1ZGVkKSk7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kZS0+Z2V0TWVzc2FnZSgpLic8L3dhcm5pbmc+Jyk7Cn0KfQoKJGxvYWRlci0+YWRkQ2xhc3NNYXAoJGNsYXNzTWFwR2VuZXJhdG9yLT5nZXRDbGFzc01hcCgpLT5nZXRNYXAoKSk7Cn0KCnJldHVybiAkbG9hZGVyOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEluY2x1ZGVQYXRoc0ZpbGUoYXJyYXkgJHBhY2thZ2VNYXAsIEZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0sIHN0cmluZyAkYmFzZVBhdGgsIHN0cmluZyAkdmVuZG9yUGF0aCwgc3RyaW5nICR2ZW5kb3JQYXRoQ29kZSwgc3RyaW5nICRhcHBCYXNlRGlyQ29kZSkKewokaW5jbHVkZVBhdGhzID0gW107Cgpmb3JlYWNoICgkcGFja2FnZU1hcCBhcyAkaXRlbSkgewpbJHBhY2thZ2UsICRpbnN0YWxsUGF0aF0gPSAkaXRlbTsKCgppZiAobnVsbCA9PT0gJGluc3RhbGxQYXRoKSB7CmNvbnRpbnVlOwp9CgppZiAobnVsbCAhPT0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpICYmIHN0cmxlbigkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkpID4gMCkgewokaW5zdGFsbFBhdGggPSBzdWJzdHIoJGluc3RhbGxQYXRoLCAwLCAtc3RybGVuKCcvJy4kcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkpKTsKfQoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldEluY2x1ZGVQYXRocygpIGFzICRpbmNsdWRlUGF0aCkgewokaW5jbHVkZVBhdGggPSB0cmltKCRpbmNsdWRlUGF0aCwgJy8nKTsKJGluY2x1ZGVQYXRoc1tdID0gJGluc3RhbGxQYXRoID09PSAnJyA/ICRpbmNsdWRlUGF0aCA6ICRpbnN0YWxsUGF0aC4nLycuJGluY2x1ZGVQYXRoOwp9Cn0KCmlmIChcY291bnQoJGluY2x1ZGVQYXRocykgPT09IDApIHsKcmV0dXJuIG51bGw7Cn0KCiRpbmNsdWRlUGF0aHNDb2RlID0gJyc7CmZvcmVhY2ggKCRpbmNsdWRlUGF0aHMgYXMgJHBhdGgpIHsKJGluY2x1ZGVQYXRoc0NvZGUgLj0gIiAgICAiIC4gJHRoaXMtPmdldFBhdGhDb2RlKCRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoLCAkcGF0aCkgLiAiLFxuIjsKfQoKcmV0dXJuIDw8PEVPRgo8P3BocAoKLy8gaW5jbHVkZV9wYXRocy5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKXCR2ZW5kb3JEaXIgPSAkdmVuZG9yUGF0aENvZGU7ClwkYmFzZURpciA9ICRhcHBCYXNlRGlyQ29kZTsKCnJldHVybiBhcnJheSgKJGluY2x1ZGVQYXRoc0NvZGUpOwoKRU9GOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEluY2x1ZGVGaWxlc0ZpbGUoYXJyYXkgJGZpbGVzLCBGaWxlc3lzdGVtICRmaWxlc3lzdGVtLCBzdHJpbmcgJGJhc2VQYXRoLCBzdHJpbmcgJHZlbmRvclBhdGgsIHN0cmluZyAkdmVuZG9yUGF0aENvZGUsIHN0cmluZyAkYXBwQmFzZURpckNvZGUpCnsKCiRmaWxlcyA9IGFycmF5X21hcCgKZnVuY3Rpb24gKHN0cmluZyAkZnVuY3Rpb25GaWxlKSB1c2UgKCRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoKTogc3RyaW5nIHsKcmV0dXJuICR0aGlzLT5nZXRQYXRoQ29kZSgkZmlsZXN5c3RlbSwgJGJhc2VQYXRoLCAkdmVuZG9yUGF0aCwgJGZ1bmN0aW9uRmlsZSk7Cn0sCiRmaWxlcwopOwokdW5pcXVlRmlsZXMgPSBhcnJheV91bmlxdWUoJGZpbGVzKTsKaWYgKGNvdW50KCR1bmlxdWVGaWxlcykgPCBjb3VudCgkZmlsZXMpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+VGhlIGZvbGxvd2luZyAiZmlsZXMiIGF1dG9sb2FkIHJ1bGVzIGFyZSBpbmNsdWRlZCBtdWx0aXBsZSB0aW1lcywgdGhpcyBtYXkgY2F1c2UgaXNzdWVzIGFuZCBzaG91bGQgYmUgcmVzb2x2ZWQ6PC93YXJuaW5nPicpOwpmb3JlYWNoIChhcnJheV91bmlxdWUoYXJyYXlfZGlmZl9hc3NvYygkZmlsZXMsICR1bmlxdWVGaWxlcykpIGFzICRkdXBsaWNhdGVGaWxlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+IC0gJy4kZHVwbGljYXRlRmlsZS4nPC93YXJuaW5nPicpOwp9Cn0KdW5zZXQoJHVuaXF1ZUZpbGVzKTsKCiRmaWxlc0NvZGUgPSAnJzsKCmZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZUlkZW50aWZpZXIgPT4gJGZ1bmN0aW9uRmlsZSkgewokZmlsZXNDb2RlIC49ICcgICAgJyAuIHZhcl9leHBvcnQoJGZpbGVJZGVudGlmaWVyLCB0cnVlKSAuICcgPT4gJyAuICRmdW5jdGlvbkZpbGUgLiAiLFxuIjsKfQoKaWYgKCEkZmlsZXNDb2RlKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gPDw8RU9GCjw/cGhwCgovLyBhdXRvbG9hZF9maWxlcy5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKXCR2ZW5kb3JEaXIgPSAkdmVuZG9yUGF0aENvZGU7ClwkYmFzZURpciA9ICRhcHBCYXNlRGlyQ29kZTsKCnJldHVybiBhcnJheSgKJGZpbGVzQ29kZSk7CgpFT0Y7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQYXRoQ29kZShGaWxlc3lzdGVtICRmaWxlc3lzdGVtLCBzdHJpbmcgJGJhc2VQYXRoLCBzdHJpbmcgJHZlbmRvclBhdGgsIHN0cmluZyAkcGF0aCkKewppZiAoISRmaWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkcGF0aCkpIHsKJHBhdGggPSAkYmFzZVBhdGggLiAnLycgLiAkcGF0aDsKfQokcGF0aCA9ICRmaWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKCiRiYXNlRGlyID0gJyc7CmlmIChzdHJwb3MoJHBhdGguJy8nLCAkdmVuZG9yUGF0aC4nLycpID09PSAwKSB7CiRwYXRoID0gKHN0cmluZykgc3Vic3RyKCRwYXRoLCBzdHJsZW4oJHZlbmRvclBhdGgpKTsKJGJhc2VEaXIgPSAnJHZlbmRvckRpciAuICc7Cn0gZWxzZSB7CiRwYXRoID0gJGZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGgoJGJhc2VQYXRoLCAkcGF0aCwgdHJ1ZSkpOwppZiAoISRmaWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkcGF0aCkpIHsKJGJhc2VEaXIgPSAnJGJhc2VEaXIgLiAnOwokcGF0aCA9ICcvJyAuICRwYXRoOwp9Cn0KCmlmIChQcmVnOjppc01hdGNoKCd7XC5waGFyKFtcXFxcL118JCl9JywgJHBhdGgpKSB7CiRiYXNlRGlyID0gIidwaGFyOi8vJyAuICIgLiAkYmFzZURpcjsKfQoKcmV0dXJuICRiYXNlRGlyIC4gdmFyX2V4cG9ydCgkcGF0aCwgdHJ1ZSk7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQbGF0Zm9ybUNoZWNrKGFycmF5ICRwYWNrYWdlTWFwLCAkY2hlY2tQbGF0Zm9ybSwgYXJyYXkgJGRldlBhY2thZ2VOYW1lcykKewokbG93ZXN0UGhwVmVyc2lvbiA9IEJvdW5kOjp6ZXJvKCk7CiRyZXF1aXJlZFBocDY0Yml0ID0gZmFsc2U7CiRyZXF1aXJlZEV4dGVuc2lvbnMgPSBbXTsKJGV4dGVuc2lvblByb3ZpZGVycyA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VNYXAgYXMgJGl0ZW0pIHsKJHBhY2thZ2UgPSAkaXRlbVswXTsKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCksICRwYWNrYWdlLT5nZXRQcm92aWRlcygpKSBhcyAkbGluaykgewppZiAoUHJlZzo6aXNNYXRjaCgne15leHQtKC4rKSR9aUQnLCAkbGluay0+Z2V0VGFyZ2V0KCksICRtYXRjaCkpIHsKJGV4dGVuc2lvblByb3ZpZGVyc1skbWF0Y2hbMV1dW10gPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwp9Cn0KfQoKZm9yZWFjaCAoJHBhY2thZ2VNYXAgYXMgJGl0ZW0pIHsKJHBhY2thZ2UgPSAkaXRlbVswXTsKCmlmIChpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkZGV2UGFja2FnZU5hbWVzLCB0cnVlKSkgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKaWYgKCR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJGxpbmstPmdldFRhcmdldCgpKSkgewpjb250aW51ZTsKfQoKaWYgKGluX2FycmF5KCRsaW5rLT5nZXRUYXJnZXQoKSwgWydwaHAnLCAncGhwLTY0Yml0J10sIHRydWUpKSB7CiRjb25zdHJhaW50ID0gJGxpbmstPmdldENvbnN0cmFpbnQoKTsKaWYgKCRjb25zdHJhaW50LT5nZXRMb3dlckJvdW5kKCktPmNvbXBhcmVUbygkbG93ZXN0UGhwVmVyc2lvbiwgJz4nKSkgewokbG93ZXN0UGhwVmVyc2lvbiA9ICRjb25zdHJhaW50LT5nZXRMb3dlckJvdW5kKCk7Cn0KfQoKaWYgKCdwaHAtNjRiaXQnID09PSAkbGluay0+Z2V0VGFyZ2V0KCkpIHsKJHJlcXVpcmVkUGhwNjRiaXQgPSB0cnVlOwp9CgppZiAoJGNoZWNrUGxhdGZvcm0gPT09IHRydWUgJiYgUHJlZzo6aXNNYXRjaCgne15leHQtKC4rKSR9aUQnLCAkbGluay0+Z2V0VGFyZ2V0KCksICRtYXRjaCkpIHsKCmlmIChpc3NldCgkZXh0ZW5zaW9uUHJvdmlkZXJzWyRtYXRjaFsxXV0pKSB7CmZvcmVhY2ggKCRleHRlbnNpb25Qcm92aWRlcnNbJG1hdGNoWzFdXSBhcyAkcHJvdmlkZWQpIHsKaWYgKCRwcm92aWRlZC0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkgewpjb250aW51ZSAyOwp9Cn0KfQoKaWYgKCRtYXRjaFsxXSA9PT0gJ3plbmQtb3BjYWNoZScpIHsKJG1hdGNoWzFdID0gJ3plbmQgb3BjYWNoZSc7Cn0KCiRleHRlbnNpb24gPSB2YXJfZXhwb3J0KCRtYXRjaFsxXSwgdHJ1ZSk7CmlmICgkbWF0Y2hbMV0gPT09ICdwY250bCcgfHwgJG1hdGNoWzFdID09PSAncmVhZGxpbmUnKSB7CiRyZXF1aXJlZEV4dGVuc2lvbnNbJGV4dGVuc2lvbl0gPSAiUEhQX1NBUEkgIT09ICdjbGknIHx8IGV4dGVuc2lvbl9sb2FkZWQoJGV4dGVuc2lvbikgfHwgXCRtaXNzaW5nRXh0ZW5zaW9uc1tdID0gJGV4dGVuc2lvbjtcbiI7Cn0gZWxzZSB7CiRyZXF1aXJlZEV4dGVuc2lvbnNbJGV4dGVuc2lvbl0gPSAiZXh0ZW5zaW9uX2xvYWRlZCgkZXh0ZW5zaW9uKSB8fCBcJG1pc3NpbmdFeHRlbnNpb25zW10gPSAkZXh0ZW5zaW9uO1xuIjsKfQp9Cn0KfQoKa3NvcnQoJHJlcXVpcmVkRXh0ZW5zaW9ucyk7CgokZm9ybWF0VG9QaHBWZXJzaW9uSWQgPSBzdGF0aWMgZnVuY3Rpb24gKEJvdW5kICRib3VuZCk6IGludCB7CmlmICgkYm91bmQtPmlzWmVybygpKSB7CnJldHVybiAwOwp9CgppZiAoJGJvdW5kLT5pc1Bvc2l0aXZlSW5maW5pdHkoKSkgewpyZXR1cm4gOTk5OTk7Cn0KCiR2ZXJzaW9uID0gc3RyX3JlcGxhY2UoJy0nLCAnLicsICRib3VuZC0+Z2V0VmVyc2lvbigpKTsKJGNodW5rcyA9IGFycmF5X21hcCgnaW50dmFsJywgZXhwbG9kZSgnLicsICR2ZXJzaW9uKSk7CgpyZXR1cm4gJGNodW5rc1swXSAqIDEwMDAwICsgJGNodW5rc1sxXSAqIDEwMCArICRjaHVua3NbMl07Cn07CgokZm9ybWF0VG9IdW1hblJlYWRhYmxlID0gc3RhdGljIGZ1bmN0aW9uIChCb3VuZCAkYm91bmQpIHsKaWYgKCRib3VuZC0+aXNaZXJvKCkpIHsKcmV0dXJuIDA7Cn0KCmlmICgkYm91bmQtPmlzUG9zaXRpdmVJbmZpbml0eSgpKSB7CnJldHVybiA5OTk5OTsKfQoKJHZlcnNpb24gPSBzdHJfcmVwbGFjZSgnLScsICcuJywgJGJvdW5kLT5nZXRWZXJzaW9uKCkpOwokY2h1bmtzID0gZXhwbG9kZSgnLicsICR2ZXJzaW9uKTsKJGNodW5rcyA9IGFycmF5X3NsaWNlKCRjaHVua3MsIDAsIDMpOwoKcmV0dXJuIGltcGxvZGUoJy4nLCAkY2h1bmtzKTsKfTsKCiRyZXF1aXJlZFBocCA9ICcnOwokcmVxdWlyZWRQaHBFcnJvciA9ICcnOwppZiAoISRsb3dlc3RQaHBWZXJzaW9uLT5pc1plcm8oKSkgewokb3BlcmF0b3IgPSAkbG93ZXN0UGhwVmVyc2lvbi0+aXNJbmNsdXNpdmUoKSA/ICc+PScgOiAnPic7CiRyZXF1aXJlZFBocCA9ICdQSFBfVkVSU0lPTl9JRCAnLiRvcGVyYXRvci4nICcuJGZvcm1hdFRvUGhwVmVyc2lvbklkKCRsb3dlc3RQaHBWZXJzaW9uKTsKJHJlcXVpcmVkUGhwRXJyb3IgPSAnIicuJG9wZXJhdG9yLicgJy4kZm9ybWF0VG9IdW1hblJlYWRhYmxlKCRsb3dlc3RQaHBWZXJzaW9uKS4nIic7Cn0KCmlmICgkcmVxdWlyZWRQaHApIHsKJHJlcXVpcmVkUGhwID0gPDw8UEhQX0NIRUNLCgppZiAoISgkcmVxdWlyZWRQaHApKSB7CiAgICBcJGlzc3Vlc1tdID0gJ1lvdXIgQ29tcG9zZXIgZGVwZW5kZW5jaWVzIHJlcXVpcmUgYSBQSFAgdmVyc2lvbiAkcmVxdWlyZWRQaHBFcnJvci4gWW91IGFyZSBydW5uaW5nICcgLiBQSFBfVkVSU0lPTiAuICcuJzsKfQoKUEhQX0NIRUNLOwp9CgppZiAoJHJlcXVpcmVkUGhwNjRiaXQpIHsKJHJlcXVpcmVkUGhwIC49IDw8PFBIUF9DSEVDSwoKaWYgKFBIUF9JTlRfU0laRSAhPT0gOCkgewogICAgXCRpc3N1ZXNbXSA9ICdZb3VyIENvbXBvc2VyIGRlcGVuZGVuY2llcyByZXF1aXJlIGEgNjQtYml0IGJ1aWxkIG9mIFBIUC4nOwp9CgpQSFBfQ0hFQ0s7Cn0KCiRyZXF1aXJlZEV4dGVuc2lvbnMgPSBpbXBsb2RlKCcnLCAkcmVxdWlyZWRFeHRlbnNpb25zKTsKaWYgKCcnICE9PSAkcmVxdWlyZWRFeHRlbnNpb25zKSB7CiRyZXF1aXJlZEV4dGVuc2lvbnMgPSA8PDxFWFRfQ0hFQ0tTCgpcJG1pc3NpbmdFeHRlbnNpb25zID0gYXJyYXkoKTsKJHJlcXVpcmVkRXh0ZW5zaW9ucwppZiAoXCRtaXNzaW5nRXh0ZW5zaW9ucykgewogICAgXCRpc3N1ZXNbXSA9ICdZb3VyIENvbXBvc2VyIGRlcGVuZGVuY2llcyByZXF1aXJlIHRoZSBmb2xsb3dpbmcgUEhQIGV4dGVuc2lvbnMgdG8gYmUgaW5zdGFsbGVkOiAnIC4gaW1wbG9kZSgnLCAnLCBcJG1pc3NpbmdFeHRlbnNpb25zKSAuICcuJzsKfQoKRVhUX0NIRUNLUzsKfQoKaWYgKCEkcmVxdWlyZWRQaHAgJiYgISRyZXF1aXJlZEV4dGVuc2lvbnMpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiA8PDxQTEFURk9STV9DSEVDSwo8P3BocAoKLy8gcGxhdGZvcm1fY2hlY2sucGhwIEBnZW5lcmF0ZWQgYnkgQ29tcG9zZXIKClwkaXNzdWVzID0gYXJyYXkoKTsKeyRyZXF1aXJlZFBocH17JHJlcXVpcmVkRXh0ZW5zaW9uc30KaWYgKFwkaXNzdWVzKSB7CiAgICBpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgaGVhZGVyKCdIVFRQLzEuMSA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yJyk7CiAgICB9CiAgICBpZiAoIWluaV9nZXQoJ2Rpc3BsYXlfZXJyb3JzJykpIHsKICAgICAgICBpZiAoUEhQX1NBUEkgPT09ICdjbGknIHx8IFBIUF9TQVBJID09PSAncGhwZGJnJykgewogICAgICAgICAgICBmd3JpdGUoU1RERVJSLCAnQ29tcG9zZXIgZGV0ZWN0ZWQgaXNzdWVzIGluIHlvdXIgcGxhdGZvcm06JyAuIFBIUF9FT0wuUEhQX0VPTCAuIGltcGxvZGUoUEhQX0VPTCwgXCRpc3N1ZXMpIC4gUEhQX0VPTC5QSFBfRU9MKTsKICAgICAgICB9IGVsc2VpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgICAgIGVjaG8gJ0NvbXBvc2VyIGRldGVjdGVkIGlzc3VlcyBpbiB5b3VyIHBsYXRmb3JtOicgLiBQSFBfRU9MLlBIUF9FT0wgLiBzdHJfcmVwbGFjZSgnWW91IGFyZSBydW5uaW5nICcuUEhQX1ZFUlNJT04uJy4nLCAnJywgaW1wbG9kZShQSFBfRU9MLCBcJGlzc3VlcykpIC4gUEhQX0VPTC5QSFBfRU9MOwogICAgICAgIH0KICAgIH0KICAgIHRyaWdnZXJfZXJyb3IoCiAgICAgICAgJ0NvbXBvc2VyIGRldGVjdGVkIGlzc3VlcyBpbiB5b3VyIHBsYXRmb3JtOiAnIC4gaW1wbG9kZSgnICcsIFwkaXNzdWVzKSwKICAgICAgICBFX1VTRVJfRVJST1IKICAgICk7Cn0KClBMQVRGT1JNX0NIRUNLOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QXV0b2xvYWRGaWxlKHN0cmluZyAkdmVuZG9yUGF0aFRvVGFyZ2V0RGlyQ29kZSwgc3RyaW5nICRzdWZmaXgpCnsKJGxhc3RDaGFyID0gJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGVbc3RybGVuKCR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlKSAtIDFdOwppZiAoIiciID09PSAkbGFzdENoYXIgfHwgJyInID09PSAkbGFzdENoYXIpIHsKJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGUgPSBzdWJzdHIoJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGUsIDAsIC0xKS4nL2F1dG9sb2FkX3JlYWwucGhwJy4kbGFzdENoYXI7Cn0gZWxzZSB7CiR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlIC49ICIgLiAnL2F1dG9sb2FkX3JlYWwucGhwJyI7Cn0KCnJldHVybiA8PDxBVVRPTE9BRAo8P3BocAoKLy8gYXV0b2xvYWQucGhwIEBnZW5lcmF0ZWQgYnkgQ29tcG9zZXIKCmlmIChQSFBfVkVSU0lPTl9JRCA8IDUwNjAwKSB7CiAgICBpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgaGVhZGVyKCdIVFRQLzEuMSA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yJyk7CiAgICB9CiAgICBcJGVyciA9ICdDb21wb3NlciAyLjMuMCBkcm9wcGVkIHN1cHBvcnQgZm9yIGF1dG9sb2FkaW5nIG9uIFBIUCA8NS42IGFuZCB5b3UgYXJlIHJ1bm5pbmcgJy5QSFBfVkVSU0lPTi4nLCBwbGVhc2UgdXBncmFkZSBQSFAgb3IgdXNlIENvbXBvc2VyIDIuMiBMVFMgdmlhICJjb21wb3NlciBzZWxmLXVwZGF0ZSAtLTIuMiIuIEFib3J0aW5nLicuUEhQX0VPTDsKICAgIGlmICghaW5pX2dldCgnZGlzcGxheV9lcnJvcnMnKSkgewogICAgICAgIGlmIChQSFBfU0FQSSA9PT0gJ2NsaScgfHwgUEhQX1NBUEkgPT09ICdwaHBkYmcnKSB7CiAgICAgICAgICAgIGZ3cml0ZShTVERFUlIsIFwkZXJyKTsKICAgICAgICB9IGVsc2VpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgICAgIGVjaG8gXCRlcnI7CiAgICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCRlcnIpOwp9CgpyZXF1aXJlX29uY2UgJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGU7CgpyZXR1cm4gQ29tcG9zZXJBdXRvbG9hZGVySW5pdCRzdWZmaXg6OmdldExvYWRlcigpOwoKQVVUT0xPQUQ7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRBdXRvbG9hZFJlYWxGaWxlKGJvb2wgJHVzZUNsYXNzTWFwLCBib29sICR1c2VJbmNsdWRlUGF0aCwgP3N0cmluZyAkdGFyZ2V0RGlyTG9hZGVyLCBib29sICR1c2VJbmNsdWRlRmlsZXMsIHN0cmluZyAkdmVuZG9yUGF0aENvZGUsIHN0cmluZyAkYXBwQmFzZURpckNvZGUsIHN0cmluZyAkc3VmZml4LCBib29sICR1c2VHbG9iYWxJbmNsdWRlUGF0aCwgc3RyaW5nICRwcmVwZW5kQXV0b2xvYWRlciwgYm9vbCAkY2hlY2tQbGF0Zm9ybSkKewokZmlsZSA9IDw8PEhFQURFUgo8P3BocAoKLy8gYXV0b2xvYWRfcmVhbC5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKY2xhc3MgQ29tcG9zZXJBdXRvbG9hZGVySW5pdCRzdWZmaXgKewogICAgcHJpdmF0ZSBzdGF0aWMgXCRsb2FkZXI7CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsb2FkQ2xhc3NMb2FkZXIoXCRjbGFzcykKICAgIHsKICAgICAgICBpZiAoJ0NvbXBvc2VyXFxBdXRvbG9hZFxcQ2xhc3NMb2FkZXInID09PSBcJGNsYXNzKSB7CiAgICAgICAgICAgIHJlcXVpcmUgX19ESVJfXyAuICcvQ2xhc3NMb2FkZXIucGhwJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldExvYWRlcigpCiAgICB7CiAgICAgICAgaWYgKG51bGwgIT09IHNlbGY6OlwkbG9hZGVyKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjpcJGxvYWRlcjsKICAgICAgICB9CgoKSEVBREVSOwoKaWYgKCRjaGVja1BsYXRmb3JtKSB7CiRmaWxlIC49IDw8PCdQTEFURk9STV9DSEVDSycKICAgICAgICByZXF1aXJlIF9fRElSX18gLiAnL3BsYXRmb3JtX2NoZWNrLnBocCc7CgoKUExBVEZPUk1fQ0hFQ0s7Cn0KCiRmaWxlIC49IDw8PENMQVNTTE9BREVSX0lOSVQKICAgICAgICBzcGxfYXV0b2xvYWRfcmVnaXN0ZXIoYXJyYXkoJ0NvbXBvc2VyQXV0b2xvYWRlckluaXQkc3VmZml4JywgJ2xvYWRDbGFzc0xvYWRlcicpLCB0cnVlLCAkcHJlcGVuZEF1dG9sb2FkZXIpOwogICAgICAgIHNlbGY6OlwkbG9hZGVyID0gXCRsb2FkZXIgPSBuZXcgXFxDb21wb3NlclxcQXV0b2xvYWRcXENsYXNzTG9hZGVyKFxcZGlybmFtZShfX0RJUl9fKSk7CiAgICAgICAgc3BsX2F1dG9sb2FkX3VucmVnaXN0ZXIoYXJyYXkoJ0NvbXBvc2VyQXV0b2xvYWRlckluaXQkc3VmZml4JywgJ2xvYWRDbGFzc0xvYWRlcicpKTsKCgpDTEFTU0xPQURFUl9JTklUOwoKaWYgKCR1c2VJbmNsdWRlUGF0aCkgewokZmlsZSAuPSA8PDwnSU5DTFVERV9QQVRIJwogICAgICAgICRpbmNsdWRlUGF0aHMgPSByZXF1aXJlIF9fRElSX18gLiAnL2luY2x1ZGVfcGF0aHMucGhwJzsKICAgICAgICAkaW5jbHVkZVBhdGhzW10gPSBnZXRfaW5jbHVkZV9wYXRoKCk7CiAgICAgICAgc2V0X2luY2x1ZGVfcGF0aChpbXBsb2RlKFBBVEhfU0VQQVJBVE9SLCAkaW5jbHVkZVBhdGhzKSk7CgoKSU5DTFVERV9QQVRIOwp9CgoKJGZpbGUgLj0gPDw8U1RBVElDX0lOSVQKICAgICAgICByZXF1aXJlIF9fRElSX18gLiAnL2F1dG9sb2FkX3N0YXRpYy5waHAnOwogICAgICAgIGNhbGxfdXNlcl9mdW5jKFxDb21wb3NlclxBdXRvbG9hZFxDb21wb3NlclN0YXRpY0luaXQkc3VmZml4OjpnZXRJbml0aWFsaXplcihcJGxvYWRlcikpOwoKClNUQVRJQ19JTklUOwoKaWYgKCR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUpIHsKJGZpbGUgLj0gPDw8J0NMQVNTTUFQQVVUSE9SSVRBVElWRScKICAgICAgICAkbG9hZGVyLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUodHJ1ZSk7CgpDTEFTU01BUEFVVEhPUklUQVRJVkU7Cn0KCmlmICgkdGhpcy0+YXBjdSkgewokYXBjdVByZWZpeCA9IHZhcl9leHBvcnQoKCR0aGlzLT5hcGN1UHJlZml4ICE9PSBudWxsID8gJHRoaXMtPmFwY3VQcmVmaXggOiBiaW4yaGV4KHJhbmRvbV9ieXRlcygxMCkpKSwgdHJ1ZSk7CiRmaWxlIC49IDw8PEFQQ1UKICAgICAgICBcJGxvYWRlci0+c2V0QXBjdVByZWZpeCgkYXBjdVByZWZpeCk7CgpBUENVOwp9CgppZiAoJHVzZUdsb2JhbEluY2x1ZGVQYXRoKSB7CiRmaWxlIC49IDw8PCdJTkNMVURFUEFUSCcKICAgICAgICAkbG9hZGVyLT5zZXRVc2VJbmNsdWRlUGF0aCh0cnVlKTsKCklOQ0xVREVQQVRIOwp9CgppZiAoJHRhcmdldERpckxvYWRlcikgewokZmlsZSAuPSA8PDxSRUdJU1RFUl9UQVJHRVRfRElSX0FVVE9MT0FECiAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCdDb21wb3NlckF1dG9sb2FkZXJJbml0JHN1ZmZpeCcsICdhdXRvbG9hZCcpLCB0cnVlLCB0cnVlKTsKCgpSRUdJU1RFUl9UQVJHRVRfRElSX0FVVE9MT0FEOwp9CgokZmlsZSAuPSA8PDxSRUdJU1RFUl9MT0FERVIKICAgICAgICBcJGxvYWRlci0+cmVnaXN0ZXIoJHByZXBlbmRBdXRvbG9hZGVyKTsKCgpSRUdJU1RFUl9MT0FERVI7CgppZiAoJHVzZUluY2x1ZGVGaWxlcykgewokZmlsZSAuPSA8PDxJTkNMVURFX0ZJTEVTCiAgICAgICAgXCRmaWxlc1RvTG9hZCA9IFxDb21wb3NlclxBdXRvbG9hZFxDb21wb3NlclN0YXRpY0luaXQkc3VmZml4OjpcJGZpbGVzOwogICAgICAgIFwkcmVxdWlyZUZpbGUgPSBcQ2xvc3VyZTo6YmluZChzdGF0aWMgZnVuY3Rpb24gKFwkZmlsZUlkZW50aWZpZXIsIFwkZmlsZSkgewogICAgICAgICAgICBpZiAoZW1wdHkoXCRHTE9CQUxTWydfX2NvbXBvc2VyX2F1dG9sb2FkX2ZpbGVzJ11bXCRmaWxlSWRlbnRpZmllcl0pKSB7CiAgICAgICAgICAgICAgICBcJEdMT0JBTFNbJ19fY29tcG9zZXJfYXV0b2xvYWRfZmlsZXMnXVtcJGZpbGVJZGVudGlmaWVyXSA9IHRydWU7CgogICAgICAgICAgICAgICAgcmVxdWlyZSBcJGZpbGU7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBudWxsLCBudWxsKTsKICAgICAgICBmb3JlYWNoIChcJGZpbGVzVG9Mb2FkIGFzIFwkZmlsZUlkZW50aWZpZXIgPT4gXCRmaWxlKSB7CiAgICAgICAgICAgIFwkcmVxdWlyZUZpbGUoXCRmaWxlSWRlbnRpZmllciwgXCRmaWxlKTsKICAgICAgICB9CgoKSU5DTFVERV9GSUxFUzsKfQoKJGZpbGUgLj0gPDw8TUVUSE9EX0ZPT1RFUgogICAgICAgIHJldHVybiBcJGxvYWRlcjsKICAgIH0KCk1FVEhPRF9GT09URVI7CgokZmlsZSAuPSAkdGFyZ2V0RGlyTG9hZGVyOwoKcmV0dXJuICRmaWxlIC4gPDw8Rk9PVEVSCn0KCkZPT1RFUjsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0U3RhdGljRmlsZShzdHJpbmcgJHN1ZmZpeCwgc3RyaW5nICR0YXJnZXREaXIsIHN0cmluZyAkdmVuZG9yUGF0aCwgc3RyaW5nICRiYXNlUGF0aCkKewokZmlsZSA9IDw8PEhFQURFUgo8P3BocAoKLy8gYXV0b2xvYWRfc3RhdGljLnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgpuYW1lc3BhY2UgQ29tcG9zZXJcQXV0b2xvYWQ7CgpjbGFzcyBDb21wb3NlclN0YXRpY0luaXQkc3VmZml4CnsKCkhFQURFUjsKCiRsb2FkZXIgPSBuZXcgQ2xhc3NMb2FkZXIoKTsKCiRtYXAgPSByZXF1aXJlICR0YXJnZXREaXIgLiAnL2F1dG9sb2FkX25hbWVzcGFjZXMucGhwJzsKZm9yZWFjaCAoJG1hcCBhcyAkbmFtZXNwYWNlID0+ICRwYXRoKSB7CiRsb2FkZXItPnNldCgkbmFtZXNwYWNlLCAkcGF0aCk7Cn0KCiRtYXAgPSByZXF1aXJlICR0YXJnZXREaXIgLiAnL2F1dG9sb2FkX3BzcjQucGhwJzsKZm9yZWFjaCAoJG1hcCBhcyAkbmFtZXNwYWNlID0+ICRwYXRoKSB7CiRsb2FkZXItPnNldFBzcjQoJG5hbWVzcGFjZSwgJHBhdGgpOwp9CgoKCgoKJGNsYXNzTWFwID0gcmVxdWlyZSAkdGFyZ2V0RGlyIC4gJy9hdXRvbG9hZF9jbGFzc21hcC5waHAnOwppZiAoJGNsYXNzTWFwKSB7CiRsb2FkZXItPmFkZENsYXNzTWFwKCRjbGFzc01hcCk7Cn0KCiRmaWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oKTsKCiR2ZW5kb3JQYXRoQ29kZSA9ICcgPT4gJyAuICRmaWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZShyZWFscGF0aCgkdGFyZ2V0RGlyKSwgJHZlbmRvclBhdGgsIHRydWUsIHRydWUpIC4gIiAuICcvIjsKJHZlbmRvclBoYXJQYXRoQ29kZSA9ICcgPT4gXCdwaGFyOi8vXCcgLiAnIC4gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKHJlYWxwYXRoKCR0YXJnZXREaXIpLCAkdmVuZG9yUGF0aCwgdHJ1ZSwgdHJ1ZSkgLiAiIC4gJy8iOwokYXBwQmFzZURpckNvZGUgPSAnID0+ICcgLiAkZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aENvZGUocmVhbHBhdGgoJHRhcmdldERpciksICRiYXNlUGF0aCwgdHJ1ZSwgdHJ1ZSkgLiAiIC4gJy8iOwokYXBwQmFzZURpclBoYXJDb2RlID0gJyA9PiBcJ3BoYXI6Ly9cJyAuICcgLiAkZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aENvZGUocmVhbHBhdGgoJHRhcmdldERpciksICRiYXNlUGF0aCwgdHJ1ZSwgdHJ1ZSkgLiAiIC4gJy8iOwoKJGFic29sdXRlVmVuZG9yUGF0aENvZGUgPSAnID0+ICcgLiBzdWJzdHIodmFyX2V4cG9ydChydHJpbSgkdmVuZG9yRGlyLCAnXFwvJykgLiAnLycsIHRydWUpLCAwLCAtMSk7CiRhYnNvbHV0ZVZlbmRvclBoYXJQYXRoQ29kZSA9ICcgPT4gJyAuIHN1YnN0cih2YXJfZXhwb3J0KHJ0cmltKCdwaGFyOi8vJyAuICR2ZW5kb3JEaXIsICdcXC8nKSAuICcvJywgdHJ1ZSksIDAsIC0xKTsKJGFic29sdXRlQXBwQmFzZURpckNvZGUgPSAnID0+ICcgLiBzdWJzdHIodmFyX2V4cG9ydChydHJpbSgkYmFzZURpciwgJ1xcLycpIC4gJy8nLCB0cnVlKSwgMCwgLTEpOwokYWJzb2x1dGVBcHBCYXNlRGlyUGhhckNvZGUgPSAnID0+ICcgLiBzdWJzdHIodmFyX2V4cG9ydChydHJpbSgncGhhcjovLycgLiAkYmFzZURpciwgJ1xcLycpIC4gJy8nLCB0cnVlKSwgMCwgLTEpOwoKJGluaXRpYWxpemVyID0gJyc7CiRwcmVmaXggPSAiXDBDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlclwwIjsKJHByZWZpeExlbiA9IHN0cmxlbigkcHJlZml4KTsKaWYgKGZpbGVfZXhpc3RzKCR0YXJnZXREaXIgLiAnL2F1dG9sb2FkX2ZpbGVzLnBocCcpKSB7CiRtYXBzID0gWydmaWxlcycgPT4gcmVxdWlyZSAkdGFyZ2V0RGlyIC4gJy9hdXRvbG9hZF9maWxlcy5waHAnXTsKfSBlbHNlIHsKJG1hcHMgPSBbXTsKfQoKZm9yZWFjaCAoKGFycmF5KSAkbG9hZGVyIGFzICRwcm9wID0+ICR2YWx1ZSkgewppZiAoIWlzX2FycmF5KCR2YWx1ZSkgfHwgXGNvdW50KCR2YWx1ZSkgPT09IDAgfHwgIXN0cl9zdGFydHNfd2l0aCgkcHJvcCwgJHByZWZpeCkpIHsKY29udGludWU7Cn0KJG1hcHNbc3Vic3RyKCRwcm9wLCAkcHJlZml4TGVuKV0gPSAkdmFsdWU7Cn0KCmZvcmVhY2ggKCRtYXBzIGFzICRwcm9wID0+ICR2YWx1ZSkgewokdmFsdWUgPSBzdHJ0cigKdmFyX2V4cG9ydCgkdmFsdWUsIHRydWUpLApbCiRhYnNvbHV0ZVZlbmRvclBhdGhDb2RlID0+ICR2ZW5kb3JQYXRoQ29kZSwKJGFic29sdXRlVmVuZG9yUGhhclBhdGhDb2RlID0+ICR2ZW5kb3JQaGFyUGF0aENvZGUsCiRhYnNvbHV0ZUFwcEJhc2VEaXJDb2RlID0+ICRhcHBCYXNlRGlyQ29kZSwKJGFic29sdXRlQXBwQmFzZURpclBoYXJDb2RlID0+ICRhcHBCYXNlRGlyUGhhckNvZGUsCl0KKTsKJHZhbHVlID0gbHRyaW0oUHJlZzo6cmVwbGFjZSgnL14gKi9tJywgJyAgICAkMCQwJywgJHZhbHVlKSk7CgokZmlsZSAuPSBzcHJpbnRmKCIgICAgcHVibGljIHN0YXRpYyAkJXMgPSAlcztcblxuIiwgJHByb3AsICR2YWx1ZSk7CmlmICgnZmlsZXMnICE9PSAkcHJvcCkgewokaW5pdGlhbGl6ZXIgLj0gIiAgICAgICAgICAgIFwkbG9hZGVyLT4kcHJvcCA9IENvbXBvc2VyU3RhdGljSW5pdCRzdWZmaXg6OlwkJHByb3A7XG4iOwp9Cn0KCnJldHVybiAkZmlsZSAuIDw8PElOSVRJQUxJWkVSCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluaXRpYWxpemVyKENsYXNzTG9hZGVyIFwkbG9hZGVyKQogICAgewogICAgICAgIHJldHVybiBcQ2xvc3VyZTo6YmluZChmdW5jdGlvbiAoKSB1c2UgKFwkbG9hZGVyKSB7CiRpbml0aWFsaXplcgogICAgICAgIH0sIG51bGwsIENsYXNzTG9hZGVyOjpjbGFzcyk7CiAgICB9Cn0KCklOSVRJQUxJWkVSOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZUF1dG9sb2Fkc1R5cGUoYXJyYXkgJHBhY2thZ2VNYXAsIHN0cmluZyAkdHlwZSwgUm9vdFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlKQp7CiRhdXRvbG9hZHMgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlTWFwIGFzICRpdGVtKSB7ClskcGFja2FnZSwgJGluc3RhbGxQYXRoXSA9ICRpdGVtOwoKCmlmIChudWxsID09PSAkaW5zdGFsbFBhdGgpIHsKY29udGludWU7Cn0KCiRhdXRvbG9hZCA9ICRwYWNrYWdlLT5nZXRBdXRvbG9hZCgpOwppZiAoJHRoaXMtPmRldk1vZGUgJiYgJHBhY2thZ2UgPT09ICRyb290UGFja2FnZSkgewokYXV0b2xvYWQgPSBhcnJheV9tZXJnZV9yZWN1cnNpdmUoJGF1dG9sb2FkLCAkcGFja2FnZS0+Z2V0RGV2QXV0b2xvYWQoKSk7Cn0KCgppZiAoIWlzc2V0KCRhdXRvbG9hZFskdHlwZV0pIHx8ICFpc19hcnJheSgkYXV0b2xvYWRbJHR5cGVdKSkgewpjb250aW51ZTsKfQppZiAobnVsbCAhPT0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpICYmICRwYWNrYWdlICE9PSAkcm9vdFBhY2thZ2UpIHsKJGluc3RhbGxQYXRoID0gc3Vic3RyKCRpbnN0YWxsUGF0aCwgMCwgLXN0cmxlbignLycuJHBhY2thZ2UtPmdldFRhcmdldERpcigpKSk7Cn0KCmZvcmVhY2ggKCRhdXRvbG9hZFskdHlwZV0gYXMgJG5hbWVzcGFjZSA9PiAkcGF0aHMpIHsKaWYgKGluX2FycmF5KCR0eXBlLCBbJ3Bzci00JywgJ3Bzci0wJ10sIHRydWUpKSB7CgokbmFtZXNwYWNlID0gbHRyaW0oJG5hbWVzcGFjZSwgJ1xcJyk7Cn0KZm9yZWFjaCAoKGFycmF5KSAkcGF0aHMgYXMgJHBhdGgpIHsKaWYgKCgkdHlwZSA9PT0gJ2ZpbGVzJyB8fCAkdHlwZSA9PT0gJ2NsYXNzbWFwJyB8fCAkdHlwZSA9PT0gJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCcpICYmICRwYWNrYWdlLT5nZXRUYXJnZXREaXIoKSAmJiAhRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkaW5zdGFsbFBhdGguJy8nLiRwYXRoKSkgewoKaWYgKCRwYWNrYWdlID09PSAkcm9vdFBhY2thZ2UpIHsKJHRhcmdldERpciA9IHN0cl9yZXBsYWNlKCdcXDxkaXJzZXBcXD4nLCAnW1xcXFwvXScsIHByZWdfcXVvdGUoc3RyX3JlcGxhY2UoWycvJywgJ1xcJ10sICc8ZGlyc2VwPicsICRwYWNrYWdlLT5nZXRUYXJnZXREaXIoKSkpKTsKJHBhdGggPSBsdHJpbShQcmVnOjpyZXBsYWNlKCd7XicuJHRhcmdldERpci4nfScsICcnLCBsdHJpbSgkcGF0aCwgJ1xcLycpKSwgJ1xcLycpOwp9IGVsc2UgewoKJHBhdGggPSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkgLiAnLycgLiAkcGF0aDsKfQp9CgppZiAoJHR5cGUgPT09ICdleGNsdWRlLWZyb20tY2xhc3NtYXAnKSB7CgokcGF0aCA9IFByZWc6OnJlcGxhY2UoJ3svK30nLCAnLycsIHByZWdfcXVvdGUodHJpbShzdHJ0cigkcGF0aCwgJ1xcJywgJy8nKSwgJy8nKSkpOwoKCiRwYXRoID0gc3RydHIoJHBhdGgsIFsnXFwqXFwqJyA9PiAnLis/JywgJ1xcKicgPT4gJ1teL10rPyddKTsKCgokdXBkaXIgPSBudWxsOwokcGF0aCA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygKJ3teKCg/Oig/OlxcXFxcXC4pezEsMn0rLykrKX0nLApzdGF0aWMgZnVuY3Rpb24gKCRtYXRjaGVzKSB1c2UgKCYkdXBkaXIpOiBzdHJpbmcgewoKJHVwZGlyID0gc3RyX3JlcGxhY2UoJ1xcLicsICcuJywgJG1hdGNoZXNbMV0pOwoKcmV0dXJuICcnOwp9LAokcGF0aAopOwppZiAoZW1wdHkoJGluc3RhbGxQYXRoKSkgewokaW5zdGFsbFBhdGggPSBzdHJ0cihQbGF0Zm9ybTo6Z2V0Q3dkKCksICdcXCcsICcvJyk7Cn0KCiRyZXNvbHZlZFBhdGggPSByZWFscGF0aCgkaW5zdGFsbFBhdGggLiAnLycgLiAkdXBkaXIpOwppZiAoZmFsc2UgPT09ICRyZXNvbHZlZFBhdGgpIHsKY29udGludWU7Cn0KJGF1dG9sb2Fkc1tdID0gcHJlZ19xdW90ZShzdHJ0cigkcmVzb2x2ZWRQYXRoLCAnXFwnLCAnLycpKSAuICcvJyAuICRwYXRoIC4gJygkfC8pJzsKY29udGludWU7Cn0KCiRyZWxhdGl2ZVBhdGggPSBlbXB0eSgkaW5zdGFsbFBhdGgpID8gKGVtcHR5KCRwYXRoKSA/ICcuJyA6ICRwYXRoKSA6ICRpbnN0YWxsUGF0aC4nLycuJHBhdGg7CgppZiAoJHR5cGUgPT09ICdmaWxlcycpIHsKJGF1dG9sb2Fkc1skdGhpcy0+Z2V0RmlsZUlkZW50aWZpZXIoJHBhY2thZ2UsICRwYXRoKV0gPSAkcmVsYXRpdmVQYXRoOwpjb250aW51ZTsKfQppZiAoJHR5cGUgPT09ICdjbGFzc21hcCcpIHsKJGF1dG9sb2Fkc1tdID0gJHJlbGF0aXZlUGF0aDsKY29udGludWU7Cn0KCiRhdXRvbG9hZHNbJG5hbWVzcGFjZV1bXSA9ICRyZWxhdGl2ZVBhdGg7Cn0KfQp9CgpyZXR1cm4gJGF1dG9sb2FkczsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEZpbGVJZGVudGlmaWVyKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCkKewoKcmV0dXJuIGhhc2goJ21kNScsICRwYWNrYWdlLT5nZXROYW1lKCkgLiAnOicgLiAkcGF0aCk7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBmaWx0ZXJQYWNrYWdlTWFwKGFycmF5ICRwYWNrYWdlTWFwLCBSb290UGFja2FnZUludGVyZmFjZSAkcm9vdFBhY2thZ2UpCnsKJHBhY2thZ2VzID0gW107CiRpbmNsdWRlID0gW107CiRyZXBsYWNlZEJ5ID0gW107Cgpmb3JlYWNoICgkcGFja2FnZU1hcCBhcyAkaXRlbSkgewokcGFja2FnZSA9ICRpdGVtWzBdOwokbmFtZSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7CiRwYWNrYWdlc1skbmFtZV0gPSAkcGFja2FnZTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJHJlcGxhY2UpIHsKJHJlcGxhY2VkQnlbJHJlcGxhY2UtPmdldFRhcmdldCgpXSA9ICRuYW1lOwp9Cn0KCiRhZGQgPSBzdGF0aWMgZnVuY3Rpb24gKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpIHVzZSAoJiRhZGQsICRwYWNrYWdlcywgJiRpbmNsdWRlLCAkcmVwbGFjZWRCeSk6IHZvaWQgewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgewokdGFyZ2V0ID0gJGxpbmstPmdldFRhcmdldCgpOwppZiAoaXNzZXQoJHJlcGxhY2VkQnlbJHRhcmdldF0pKSB7CiR0YXJnZXQgPSAkcmVwbGFjZWRCeVskdGFyZ2V0XTsKfQppZiAoIWlzc2V0KCRpbmNsdWRlWyR0YXJnZXRdKSkgewokaW5jbHVkZVskdGFyZ2V0XSA9IHRydWU7CmlmIChpc3NldCgkcGFja2FnZXNbJHRhcmdldF0pKSB7CiRhZGQoJHBhY2thZ2VzWyR0YXJnZXRdKTsKfQp9Cn0KfTsKJGFkZCgkcm9vdFBhY2thZ2UpOwoKcmV0dXJuIGFycmF5X2ZpbHRlcigKJHBhY2thZ2VNYXAsCnN0YXRpYyBmdW5jdGlvbiAoJGl0ZW0pIHVzZSAoJGluY2x1ZGUpOiBib29sIHsKJHBhY2thZ2UgPSAkaXRlbVswXTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKCkgYXMgJG5hbWUpIHsKaWYgKGlzc2V0KCRpbmNsdWRlWyRuYW1lXSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9Cik7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNvcnRQYWNrYWdlTWFwKGFycmF5ICRwYWNrYWdlTWFwKQp7CiRwYWNrYWdlcyA9IFtdOwokcGF0aHMgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlTWFwIGFzICRpdGVtKSB7ClskcGFja2FnZSwgJHBhdGhdID0gJGl0ZW07CiRuYW1lID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKJHBhY2thZ2VzWyRuYW1lXSA9ICRwYWNrYWdlOwokcGF0aHNbJG5hbWVdID0gJHBhdGg7Cn0KCiRzb3J0ZWRQYWNrYWdlcyA9IFBhY2thZ2VTb3J0ZXI6OnNvcnRQYWNrYWdlcygkcGFja2FnZXMpOwoKJHNvcnRlZFBhY2thZ2VNYXAgPSBbXTsKCmZvcmVhY2ggKCRzb3J0ZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewokbmFtZSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7CiRzb3J0ZWRQYWNrYWdlTWFwW10gPSBbJHBhY2thZ2VzWyRuYW1lXSwgJHBhdGhzWyRuYW1lXV07Cn0KCnJldHVybiAkc29ydGVkUGFja2FnZU1hcDsKfQp9CgpmdW5jdGlvbiBjb21wb3NlclJlcXVpcmUoc3RyaW5nICRmaWxlSWRlbnRpZmllciwgc3RyaW5nICRmaWxlKTogdm9pZAp7CmlmIChlbXB0eSgkR0xPQkFMU1snX19jb21wb3Nlcl9hdXRvbG9hZF9maWxlcyddWyRmaWxlSWRlbnRpZmllcl0pKSB7CiRHTE9CQUxTWydfX2NvbXBvc2VyX2F1dG9sb2FkX2ZpbGVzJ11bJGZpbGVJZGVudGlmaWVyXSA9IHRydWU7CgpyZXF1aXJlICRmaWxlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEF1dG9sb2FkOwoKdXNlIENvbXBvc2VyXENsYXNzTWFwR2VuZXJhdG9yXEZpbGVMaXN0Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CgoKCgoKCgoKCmNsYXNzIENsYXNzTWFwR2VuZXJhdG9yCnsKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkdW1wKGl0ZXJhYmxlICRkaXJzLCBzdHJpbmcgJGZpbGUpOiB2b2lkCnsKJG1hcHMgPSBbXTsKCmZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKJG1hcHMgPSBhcnJheV9tZXJnZSgkbWFwcywgc3RhdGljOjpjcmVhdGVNYXAoJGRpcikpOwp9CgpmaWxlX3B1dF9jb250ZW50cygkZmlsZSwgc3ByaW50ZignPD9waHAgcmV0dXJuICVzOycsIHZhcl9leHBvcnQoJG1hcHMsIHRydWUpKSk7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlTWFwKCRwYXRoLCA/c3RyaW5nICRleGNsdWRlZCA9IG51bGwsID9JT0ludGVyZmFjZSAkaW8gPSBudWxsLCA/c3RyaW5nICRuYW1lc3BhY2UgPSBudWxsLCA/c3RyaW5nICRhdXRvbG9hZFR5cGUgPSBudWxsLCBhcnJheSAmJHNjYW5uZWRGaWxlcyA9IFtdKTogYXJyYXkKewokZ2VuZXJhdG9yID0gbmV3IFxDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvclxDbGFzc01hcEdlbmVyYXRvcihbJ3BocCcsICdpbmMnLCAnaGgnXSk7CiRmaWxlTGlzdCA9IG5ldyBGaWxlTGlzdCgpOwokZmlsZUxpc3QtPmZpbGVzID0gJHNjYW5uZWRGaWxlczsKJGdlbmVyYXRvci0+YXZvaWREdXBsaWNhdGVTY2FucygkZmlsZUxpc3QpOwoKJGdlbmVyYXRvci0+c2NhblBhdGhzKCRwYXRoLCAkZXhjbHVkZWQsICRhdXRvbG9hZFR5cGUgPz8gJ2NsYXNzbWFwJywgJG5hbWVzcGFjZSk7CgokY2xhc3NNYXAgPSAkZ2VuZXJhdG9yLT5nZXRDbGFzc01hcCgpOwoKJHNjYW5uZWRGaWxlcyA9ICRmaWxlTGlzdC0+ZmlsZXM7CgppZiAoJGlvICE9PSBudWxsKSB7CmZvcmVhY2ggKCRjbGFzc01hcC0+Z2V0UHNyVmlvbGF0aW9ucygpIGFzICRtc2cpIHsKJGlvLT53cml0ZUVycm9yKCI8d2FybmluZz4kbXNnPC93YXJuaW5nPiIpOwp9Cgpmb3JlYWNoICgkY2xhc3NNYXAtPmdldEFtYmlndW91c0NsYXNzZXMoKSBhcyAkY2xhc3MgPT4gJHBhdGhzKSB7CmlmIChjb3VudCgkcGF0aHMpID4gMSkgewokaW8tPndyaXRlRXJyb3IoCic8d2FybmluZz5XYXJuaW5nOiBBbWJpZ3VvdXMgY2xhc3MgcmVzb2x1dGlvbiwgIicuJGNsYXNzLiciJy4KJyB3YXMgZm91bmQgJy4gKGNvdW50KCRwYXRocykgKyAxKSAuJ3g6IGluICInLiRjbGFzc01hcC0+Z2V0Q2xhc3NQYXRoKCRjbGFzcykuJyIgYW5kICInLiBpbXBsb2RlKCciLCAiJywgJHBhdGhzKSAuJyIsIHRoZSBmaXJzdCB3aWxsIGJlIHVzZWQuPC93YXJuaW5nPicKKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKAonPHdhcm5pbmc+V2FybmluZzogQW1iaWd1b3VzIGNsYXNzIHJlc29sdXRpb24sICInLiRjbGFzcy4nIicuCicgd2FzIGZvdW5kIGluIGJvdGggIicuJGNsYXNzTWFwLT5nZXRDbGFzc1BhdGgoJGNsYXNzKS4nIiBhbmQgIicuIGltcGxvZGUoJyIsICInLCAkcGF0aHMpIC4nIiwgdGhlIGZpcnN0IHdpbGwgYmUgdXNlZC48L3dhcm5pbmc+JwopOwp9Cn0KfQoKcmV0dXJuICRjbGFzc01hcC0+Z2V0TWFwKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXI7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxGaW5kZXI7CgoKCgoKCmNsYXNzIENhY2hlCnsKCnByaXZhdGUgc3RhdGljICRjYWNoZUNvbGxlY3RlZCA9IG51bGw7Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJHJvb3Q7Cgpwcml2YXRlICRlbmFibGVkID0gbnVsbDsKCnByaXZhdGUgJGFsbG93bGlzdDsKCnByaXZhdGUgJGZpbGVzeXN0ZW07Cgpwcml2YXRlICRyZWFkT25seTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIHN0cmluZyAkY2FjaGVEaXIsIHN0cmluZyAkYWxsb3dsaXN0ID0gJ2EtejAtOS5fJywgP0ZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0gPSBudWxsLCBib29sICRyZWFkT25seSA9IGZhbHNlKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPnJvb3QgPSBydHJpbSgkY2FjaGVEaXIsICcvXFwnKSAuICcvJzsKJHRoaXMtPmFsbG93bGlzdCA9ICRhbGxvd2xpc3Q7CiR0aGlzLT5maWxlc3lzdGVtID0gJGZpbGVzeXN0ZW0gPzogbmV3IEZpbGVzeXN0ZW0oKTsKJHRoaXMtPnJlYWRPbmx5ID0gJHJlYWRPbmx5OwoKaWYgKCFzZWxmOjppc1VzYWJsZSgkY2FjaGVEaXIpKSB7CiR0aGlzLT5lbmFibGVkID0gZmFsc2U7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlYWRPbmx5KGJvb2wgJHJlYWRPbmx5KQp7CiR0aGlzLT5yZWFkT25seSA9ICRyZWFkT25seTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUmVhZE9ubHkoKQp7CnJldHVybiAkdGhpcy0+cmVhZE9ubHk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNVc2FibGUoc3RyaW5nICRwYXRoKQp7CnJldHVybiAhUHJlZzo6aXNNYXRjaCgneyhefFtcXFxcL10pKFwkbnVsbHxudWx8TlVMfC9kZXYvbnVsbCkoW1xcXFwvXXwkKX0nLCAkcGF0aCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0VuYWJsZWQoKQp7CmlmICgkdGhpcy0+ZW5hYmxlZCA9PT0gbnVsbCkgewokdGhpcy0+ZW5hYmxlZCA9IHRydWU7CgppZiAoCiEkdGhpcy0+cmVhZE9ubHkKJiYgKAooIWlzX2RpcigkdGhpcy0+cm9vdCkgJiYgIVNpbGVuY2VyOjpjYWxsKCdta2RpcicsICR0aGlzLT5yb290LCAwNzc3LCB0cnVlKSkKfHwgIWlzX3dyaXRhYmxlKCR0aGlzLT5yb290KQopCikgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNhbm5vdCBjcmVhdGUgY2FjaGUgZGlyZWN0b3J5ICcgLiAkdGhpcy0+cm9vdCAuICcsIG9yIGRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUuIFByb2NlZWRpbmcgd2l0aG91dCBjYWNoZS4gU2VlIGFsc28gY2FjaGUtcmVhZC1vbmx5IGNvbmZpZyBpZiB5b3VyIGZpbGVzeXN0ZW0gaXMgcmVhZC1vbmx5Ljwvd2FybmluZz4nKTsKJHRoaXMtPmVuYWJsZWQgPSBmYWxzZTsKfQp9CgpyZXR1cm4gJHRoaXMtPmVuYWJsZWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290KCkKewpyZXR1cm4gJHRoaXMtPnJvb3Q7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZWFkKHN0cmluZyAkZmlsZSkKewppZiAoJHRoaXMtPmlzRW5hYmxlZCgpKSB7CiRmaWxlID0gUHJlZzo6cmVwbGFjZSgne1teJy4kdGhpcy0+YWxsb3dsaXN0LiddfWknLCAnLScsICRmaWxlKTsKaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5yb290IC4gJGZpbGUpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmVhZGluZyAnLiR0aGlzLT5yb290IC4gJGZpbGUuJyBmcm9tIGNhY2hlJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCnJldHVybiBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+cm9vdCAuICRmaWxlKTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZShzdHJpbmcgJGZpbGUsIHN0cmluZyAkY29udGVudHMpCnsKJHdhc0VuYWJsZWQgPSAkdGhpcy0+ZW5hYmxlZCA9PT0gdHJ1ZTsKCmlmICgkdGhpcy0+aXNFbmFibGVkKCkgJiYgISR0aGlzLT5yZWFkT25seSkgewokZmlsZSA9IFByZWc6OnJlcGxhY2UoJ3tbXicuJHRoaXMtPmFsbG93bGlzdC4nXX1pJywgJy0nLCAkZmlsZSk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1dyaXRpbmcgJy4kdGhpcy0+cm9vdCAuICRmaWxlLicgaW50byBjYWNoZScsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CgokdGVtcEZpbGVOYW1lID0gJHRoaXMtPnJvb3QgLiAkZmlsZSAuIGJpbjJoZXgocmFuZG9tX2J5dGVzKDUpKSAuICcudG1wJzsKdHJ5IHsKcmV0dXJuIGZpbGVfcHV0X2NvbnRlbnRzKCR0ZW1wRmlsZU5hbWUsICRjb250ZW50cykgIT09IGZhbHNlICYmIHJlbmFtZSgkdGVtcEZpbGVOYW1lLCAkdGhpcy0+cm9vdCAuICRmaWxlKTsKfSBjYXRjaCAoXEVycm9yRXhjZXB0aW9uICRlKSB7CgoKaWYgKCR3YXNFbmFibGVkKSB7CmNsZWFyc3RhdGNhY2hlKCk7CiR0aGlzLT5lbmFibGVkID0gbnVsbDsKcmV0dXJuICR0aGlzLT53cml0ZSgkZmlsZSwgJGNvbnRlbnRzKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5GYWlsZWQgdG8gd3JpdGUgaW50byBjYWNoZTogJy4kZS0+Z2V0TWVzc2FnZSgpLic8L3dhcm5pbmc+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKaWYgKFByZWc6OmlzTWF0Y2goJ3teZmlsZV9wdXRfY29udGVudHNcKFwpOiBPbmx5IChbMC05XSspIG9mIChbMC05XSspIGJ5dGVzIHdyaXR0ZW59JywgJGUtPmdldE1lc3NhZ2UoKSwgJG0pKSB7Cgp1bmxpbmsoJHRlbXBGaWxlTmFtZSk7CgokbWVzc2FnZSA9IHNwcmludGYoCic8d2FybmluZz5Xcml0aW5nICUxJHMgaW50byBjYWNoZSBmYWlsZWQgYWZ0ZXIgJTIkdSBvZiAlMyR1IGJ5dGVzIHdyaXR0ZW4sIG9ubHkgJTQkcyBieXRlcyBvZiBmcmVlIHNwYWNlIGF2YWlsYWJsZTwvd2FybmluZz4nLAokdGVtcEZpbGVOYW1lLAokbVsxXSwKJG1bMl0sCmZ1bmN0aW9uX2V4aXN0cygnZGlza19mcmVlX3NwYWNlJykgPyBAZGlza19mcmVlX3NwYWNlKGRpcm5hbWUoJHRlbXBGaWxlTmFtZSkpIDogJ3Vua25vd24nCik7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1lc3NhZ2UpOwoKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyAkZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvcHlGcm9tKHN0cmluZyAkZmlsZSwgc3RyaW5nICRzb3VyY2UpCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSAmJiAhJHRoaXMtPnJlYWRPbmx5KSB7CiRmaWxlID0gUHJlZzo6cmVwbGFjZSgne1teJy4kdGhpcy0+YWxsb3dsaXN0LiddfWknLCAnLScsICRmaWxlKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cyhkaXJuYW1lKCR0aGlzLT5yb290IC4gJGZpbGUpKTsKCmlmICghZmlsZV9leGlzdHMoJHNvdXJjZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kc291cmNlLicgZG9lcyBub3QgZXhpc3QsIGNhbiBub3Qgd3JpdGUgaW50byBjYWNoZTwvZXJyb3I+Jyk7Cn0gZWxzZWlmICgkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1dyaXRpbmcgJy4kdGhpcy0+cm9vdCAuICRmaWxlLicgaW50byBjYWNoZSBmcm9tICcuJHNvdXJjZSk7Cn0KCnJldHVybiAkdGhpcy0+ZmlsZXN5c3RlbS0+Y29weSgkc291cmNlLCAkdGhpcy0+cm9vdCAuICRmaWxlKTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3B5VG8oc3RyaW5nICRmaWxlLCBzdHJpbmcgJHRhcmdldCkKewppZiAoJHRoaXMtPmlzRW5hYmxlZCgpKSB7CiRmaWxlID0gUHJlZzo6cmVwbGFjZSgne1teJy4kdGhpcy0+YWxsb3dsaXN0LiddfWknLCAnLScsICRmaWxlKTsKaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5yb290IC4gJGZpbGUpKSB7CnRyeSB7CnRvdWNoKCR0aGlzLT5yb290IC4gJGZpbGUsIChpbnQpIGZpbGVtdGltZSgkdGhpcy0+cm9vdCAuICRmaWxlKSwgdGltZSgpKTsKfSBjYXRjaCAoXEVycm9yRXhjZXB0aW9uICRlKSB7CgoKU2lsZW5jZXI6OmNhbGwoJ3RvdWNoJywgJHRoaXMtPnJvb3QgLiAkZmlsZSk7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmVhZGluZyAnLiR0aGlzLT5yb290IC4gJGZpbGUuJyBmcm9tIGNhY2hlJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCnJldHVybiAkdGhpcy0+ZmlsZXN5c3RlbS0+Y29weSgkdGhpcy0+cm9vdCAuICRmaWxlLCAkdGFyZ2V0KTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnY0lzTmVjZXNzYXJ5KCkKewppZiAoc2VsZjo6JGNhY2hlQ29sbGVjdGVkKSB7CnJldHVybiBmYWxzZTsKfQoKc2VsZjo6JGNhY2hlQ29sbGVjdGVkID0gdHJ1ZTsKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX1RFU1RfU1VJVEUnKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChQbGF0Zm9ybTo6aXNJbnB1dENvbXBsZXRpb25Qcm9jZXNzKCkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gIXJhbmRvbV9pbnQoMCwgNTApOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKHN0cmluZyAkZmlsZSkKewppZiAoJHRoaXMtPmlzRW5hYmxlZCgpICYmICEkdGhpcy0+cmVhZE9ubHkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPnJvb3QgLiAkZmlsZSkpIHsKcmV0dXJuICR0aGlzLT5maWxlc3lzdGVtLT51bmxpbmsoJHRoaXMtPnJvb3QgLiAkZmlsZSk7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkgJiYgISR0aGlzLT5yZWFkT25seSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+ZW1wdHlEaXJlY3RvcnkoJHRoaXMtPnJvb3QpOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBZ2Uoc3RyaW5nICRmaWxlKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPnJvb3QgLiAkZmlsZSkgJiYgKCRtdGltZSA9IGZpbGVtdGltZSgkdGhpcy0+cm9vdCAuICRmaWxlKSkgIT09IGZhbHNlKSB7CnJldHVybiBhYnModGltZSgpIC0gJG10aW1lKTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnYyhpbnQgJHR0bCwgaW50ICRtYXhTaXplKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkgJiYgISR0aGlzLT5yZWFkT25seSkgewokZXhwaXJlID0gbmV3IFxEYXRlVGltZSgpOwokZXhwaXJlLT5tb2RpZnkoJy0nLiR0dGwuJyBzZWNvbmRzJyk7CgokZmluZGVyID0gJHRoaXMtPmdldEZpbmRlcigpLT5kYXRlKCd1bnRpbCAnLiRleHBpcmUtPmZvcm1hdCgnWS1tLWQgSDppOnMnKSk7CmZvcmVhY2ggKCRmaW5kZXIgYXMgJGZpbGUpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnVubGluaygkZmlsZS0+Z2V0UGF0aG5hbWUoKSk7Cn0KCiR0b3RhbFNpemUgPSAkdGhpcy0+ZmlsZXN5c3RlbS0+c2l6ZSgkdGhpcy0+cm9vdCk7CmlmICgkdG90YWxTaXplID4gJG1heFNpemUpIHsKJGl0ZXJhdG9yID0gJHRoaXMtPmdldEZpbmRlcigpLT5zb3J0QnlBY2Nlc3NlZFRpbWUoKS0+Z2V0SXRlcmF0b3IoKTsKd2hpbGUgKCR0b3RhbFNpemUgPiAkbWF4U2l6ZSAmJiAkaXRlcmF0b3ItPnZhbGlkKCkpIHsKJGZpbGVwYXRoID0gJGl0ZXJhdG9yLT5jdXJyZW50KCktPmdldFBhdGhuYW1lKCk7CiR0b3RhbFNpemUgLT0gJHRoaXMtPmZpbGVzeXN0ZW0tPnNpemUoJGZpbGVwYXRoKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPnVubGluaygkZmlsZXBhdGgpOwokaXRlcmF0b3ItPm5leHQoKTsKfQp9CgpzZWxmOjokY2FjaGVDb2xsZWN0ZWQgPSB0cnVlOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdjVmNzQ2FjaGUoaW50ICR0dGwpOiBib29sCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSkgewokZXhwaXJlID0gbmV3IFxEYXRlVGltZSgpOwokZXhwaXJlLT5tb2RpZnkoJy0nLiR0dGwuJyBzZWNvbmRzJyk7CgokZmluZGVyID0gRmluZGVyOjpjcmVhdGUoKS0+aW4oJHRoaXMtPnJvb3QpLT5kaXJlY3RvcmllcygpLT5kZXB0aCgwKS0+ZGF0ZSgndW50aWwgJy4kZXhwaXJlLT5mb3JtYXQoJ1ktbS1kIEg6aTpzJykpOwpmb3JlYWNoICgkZmluZGVyIGFzICRmaWxlKSB7CiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJGZpbGUtPmdldFBhdGhuYW1lKCkpOwp9CgpzZWxmOjokY2FjaGVDb2xsZWN0ZWQgPSB0cnVlOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNoYTEoc3RyaW5nICRmaWxlKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPnJvb3QgLiAkZmlsZSkpIHsKcmV0dXJuIGhhc2hfZmlsZSgnc2hhMScsICR0aGlzLT5yb290IC4gJGZpbGUpOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNoYTI1NihzdHJpbmcgJGZpbGUpCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSkgewokZmlsZSA9IFByZWc6OnJlcGxhY2UoJ3tbXicuJHRoaXMtPmFsbG93bGlzdC4nXX1pJywgJy0nLCAkZmlsZSk7CmlmIChmaWxlX2V4aXN0cygkdGhpcy0+cm9vdCAuICRmaWxlKSkgewpyZXR1cm4gaGFzaF9maWxlKCdzaGEyNTYnLCAkdGhpcy0+cm9vdCAuICRmaWxlKTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRGaW5kZXIoKQp7CnJldHVybiBGaW5kZXI6OmNyZWF0ZSgpLT5pbigkdGhpcy0+cm9vdCktPmZpbGVzKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBBYm91dENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnYWJvdXQnKQotPnNldERlc2NyaXB0aW9uKCdTaG93cyBhIHNob3J0IGluZm9ybWF0aW9uIGFib3V0IENvbXBvc2VyJykKLT5zZXRIZWxwKAo8PDxFT1QKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgYWJvdXQ8L2luZm8+CkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlclZlcnNpb24gPSBDb21wb3Nlcjo6Z2V0VmVyc2lvbigpOwoKJHRoaXMtPmdldElPKCktPndyaXRlKAo8PDxFT1QKPGluZm8+Q29tcG9zZXIgLSBEZXBlbmRlbmN5IE1hbmFnZXIgZm9yIFBIUCAtIHZlcnNpb24gJGNvbXBvc2VyVmVyc2lvbjwvaW5mbz4KPGNvbW1lbnQ+Q29tcG9zZXIgaXMgYSBkZXBlbmRlbmN5IG1hbmFnZXIgdHJhY2tpbmcgbG9jYWwgZGVwZW5kZW5jaWVzIG9mIHlvdXIgcHJvamVjdHMgYW5kIGxpYnJhcmllcy4KU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L2NvbW1lbnQ+CkVPVAopOwoKcmV0dXJuIDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25TZWxlY3RvcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUZhY3Rvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXExvb3A7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKY2xhc3MgQXJjaGl2ZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7Cgpwcml2YXRlIGNvbnN0IEZPUk1BVFMgPSBbJ3RhcicsICd0YXIuZ3onLCAndGFyLmJ6MicsICd6aXAnXTsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnYXJjaGl2ZScpCi0+c2V0RGVzY3JpcHRpb24oJ0NyZWF0ZXMgYW4gYXJjaGl2ZSBvZiB0aGlzIGNvbXBvc2VyIHBhY2thZ2UnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnVGhlIHBhY2thZ2UgdG8gYXJjaGl2ZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHByb2plY3QnLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEF2YWlsYWJsZVBhY2thZ2UoKSksCm5ldyBJbnB1dEFyZ3VtZW50KCd2ZXJzaW9uJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdBIHZlcnNpb24gY29uc3RyYWludCB0byBmaW5kIHRoZSBwYWNrYWdlIHRvIGFyY2hpdmUnKSwKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0Zvcm1hdCBvZiB0aGUgcmVzdWx0aW5nIGFyY2hpdmU6IHRhciwgdGFyLmd6LCB0YXIuYnoyIG9yIHppcCAoZGVmYXVsdCB0YXIpJywgbnVsbCwgc2VsZjo6Rk9STUFUUyksCm5ldyBJbnB1dE9wdGlvbignZGlyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnV3JpdGUgdGhlIGFyY2hpdmUgdG8gdGhpcyBkaXJlY3RvcnknKSwKbmV3IElucHV0T3B0aW9uKCdmaWxlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnV3JpdGUgdGhlIGFyY2hpdmUgd2l0aCB0aGUgZ2l2ZW4gZmlsZSBuYW1lLicKLicgTm90ZSB0aGF0IHRoZSBmb3JtYXQgd2lsbCBiZSBhcHBlbmRlZC4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtZmlsdGVycycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGZpbHRlcnMgd2hlbiBzYXZpbmcgcGFja2FnZScpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+YXJjaGl2ZTwvaW5mbz4gY29tbWFuZCBjcmVhdGVzIGFuIGFyY2hpdmUgb2YgdGhlIHNwZWNpZmllZCBmb3JtYXQKY29udGFpbmluZyB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIG9mIHRoZSBDb21wb3NlciBwcm9qZWN0IG9yIHRoZSBzcGVjaWZpZWQKcGFja2FnZSBpbiB0aGUgc3BlY2lmaWVkIHZlcnNpb24gYW5kIHdyaXRlcyBpdCB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIGFyY2hpdmUgWy0tZm9ybWF0PXppcF0gWy0tZGlyPS9mb29dIFstLWZpbGU9ZmlsZW5hbWVdIFtwYWNrYWdlIFt2ZXJzaW9uXV08L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNhcmNoaXZlCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT50cnlDb21wb3NlcigpOwokY29uZmlnID0gbnVsbDsKCmlmICgkY29tcG9zZXIpIHsKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7CiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ2FyY2hpdmUnLCAkaW5wdXQsICRvdXRwdXQpOwokZXZlbnREaXNwYXRjaGVyID0gJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKTsKJGV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKJGV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2hTY3JpcHQoU2NyaXB0RXZlbnRzOjpQUkVfQVJDSElWRV9DTUQpOwp9CgppZiAoISRjb25maWcpIHsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygpOwp9CgokZm9ybWF0ID0gJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpID8/ICRjb25maWctPmdldCgnYXJjaGl2ZS1mb3JtYXQnKTsKJGRpciA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdkaXInKSA/PyAkY29uZmlnLT5nZXQoJ2FyY2hpdmUtZGlyJyk7CgokcmV0dXJuQ29kZSA9ICR0aGlzLT5hcmNoaXZlKAokdGhpcy0+Z2V0SU8oKSwKJGNvbmZpZywKJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZScpLAokaW5wdXQtPmdldEFyZ3VtZW50KCd2ZXJzaW9uJyksCiRmb3JtYXQsCiRkaXIsCiRpbnB1dC0+Z2V0T3B0aW9uKCdmaWxlJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtZmlsdGVycycpLAokY29tcG9zZXIKKTsKCmlmICgwID09PSAkcmV0dXJuQ29kZSAmJiAkY29tcG9zZXIpIHsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2hTY3JpcHQoU2NyaXB0RXZlbnRzOjpQT1NUX0FSQ0hJVkVfQ01EKTsKfQoKcmV0dXJuICRyZXR1cm5Db2RlOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYXJjaGl2ZShJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCA/c3RyaW5nICRwYWNrYWdlTmFtZSwgP3N0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRmb3JtYXQsIHN0cmluZyAkZGVzdCwgP3N0cmluZyAkZmlsZU5hbWUsIGJvb2wgJGlnbm9yZUZpbHRlcnMsID9Db21wb3NlciAkY29tcG9zZXIpOiBpbnQKewppZiAoJGNvbXBvc2VyKSB7CiRhcmNoaXZlTWFuYWdlciA9ICRjb21wb3Nlci0+Z2V0QXJjaGl2ZU1hbmFnZXIoKTsKfSBlbHNlIHsKJGZhY3RvcnkgPSBuZXcgRmFjdG9yeTsKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCk7CiRodHRwRG93bmxvYWRlciA9IEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZyk7CiRkb3dubG9hZE1hbmFnZXIgPSAkZmFjdG9yeS0+Y3JlYXRlRG93bmxvYWRNYW5hZ2VyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkcHJvY2Vzcyk7CiRhcmNoaXZlTWFuYWdlciA9ICRmYWN0b3J5LT5jcmVhdGVBcmNoaXZlTWFuYWdlcigkY29uZmlnLCAkZG93bmxvYWRNYW5hZ2VyLCBuZXcgTG9vcCgkaHR0cERvd25sb2FkZXIsICRwcm9jZXNzKSk7Cn0KCmlmICgkcGFja2FnZU5hbWUpIHsKJHBhY2thZ2UgPSAkdGhpcy0+c2VsZWN0UGFja2FnZSgkaW8sICRwYWNrYWdlTmFtZSwgJHZlcnNpb24pOwoKaWYgKCEkcGFja2FnZSkgewpyZXR1cm4gMTsKfQp9IGVsc2UgewokcGFja2FnZSA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKS0+Z2V0UGFja2FnZSgpOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkNyZWF0aW5nIHRoZSBhcmNoaXZlIGludG8gIicuJGRlc3QuJyIuPC9pbmZvPicpOwokcGFja2FnZVBhdGggPSAkYXJjaGl2ZU1hbmFnZXItPmFyY2hpdmUoJHBhY2thZ2UsICRmb3JtYXQsICRkZXN0LCAkZmlsZU5hbWUsICRpZ25vcmVGaWx0ZXJzKTsKJGZzID0gbmV3IEZpbGVzeXN0ZW07CiRzaG9ydFBhdGggPSAkZnMtPmZpbmRTaG9ydGVzdFBhdGgoUGxhdGZvcm06OmdldEN3ZCgpLCAkcGFja2FnZVBhdGgsIHRydWUpOwoKJGlvLT53cml0ZUVycm9yKCdDcmVhdGVkOiAnLCBmYWxzZSk7CiRpby0+d3JpdGUoc3RybGVuKCRzaG9ydFBhdGgpIDwgc3RybGVuKCRwYWNrYWdlUGF0aCkgPyAkc2hvcnRQYXRoIDogJHBhY2thZ2VQYXRoKTsKCnJldHVybiAwOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2VsZWN0UGFja2FnZShJT0ludGVyZmFjZSAkaW8sIHN0cmluZyAkcGFja2FnZU5hbWUsID9zdHJpbmcgJHZlcnNpb24gPSBudWxsKQp7CiRpby0+d3JpdGVFcnJvcignPGluZm8+U2VhcmNoaW5nIGZvciB0aGUgc3BlY2lmaWVkIHBhY2thZ2UuPC9pbmZvPicpOwoKaWYgKCRjb21wb3NlciA9ICR0aGlzLT50cnlDb21wb3NlcigpKSB7CiRsb2NhbFJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwokcmVwbyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KGFycmF5X21lcmdlKFskbG9jYWxSZXBvXSwgJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSkpOwokbWluU3RhYmlsaXR5ID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldE1pbmltdW1TdGFiaWxpdHkoKTsKfSBlbHNlIHsKJGRlZmF1bHRSZXBvcyA9IFJlcG9zaXRvcnlGYWN0b3J5OjpkZWZhdWx0UmVwb3NXaXRoRGVmYXVsdE1hbmFnZXIoJGlvKTsKJGlvLT53cml0ZUVycm9yKCdObyBjb21wb3Nlci5qc29uIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgc2VhcmNoaW5nIHBhY2thZ2VzIGZyb20gJyAuIGltcGxvZGUoJywgJywgYXJyYXlfa2V5cygkZGVmYXVsdFJlcG9zKSkpOwokcmVwbyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KCRkZWZhdWx0UmVwb3MpOwokbWluU3RhYmlsaXR5ID0gJ3N0YWJsZSc7Cn0KCmlmICgkdmVyc2lvbiAhPT0gbnVsbCAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7QChzdGFibGV8UkN8YmV0YXxhbHBoYXxkZXYpJH1pJywgJHZlcnNpb24sICRtYXRjaCkpIHsKJG1pblN0YWJpbGl0eSA9IFZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkbWF0Y2hbMV0pOwokdmVyc2lvbiA9IChzdHJpbmcpIHN1YnN0cigkdmVyc2lvbiwgMCwgLXN0cmxlbigkbWF0Y2hbMF0pKTsKfQoKJHJlcG9TZXQgPSBuZXcgUmVwb3NpdG9yeVNldCgkbWluU3RhYmlsaXR5KTsKJHJlcG9TZXQtPmFkZFJlcG9zaXRvcnkoJHJlcG8pOwokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJGNvbnN0cmFpbnQgPSAkdmVyc2lvbiAhPT0gbnVsbCA/ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJHZlcnNpb24pIDogbnVsbDsKJHBhY2thZ2VzID0gJHJlcG9TZXQtPmZpbmRQYWNrYWdlcyhzdHJ0b2xvd2VyKCRwYWNrYWdlTmFtZSksICRjb25zdHJhaW50KTsKCmlmIChjb3VudCgkcGFja2FnZXMpID4gMSkgewokdmVyc2lvblNlbGVjdG9yID0gbmV3IFZlcnNpb25TZWxlY3RvcigkcmVwb1NldCk7CiRwYWNrYWdlID0gJHZlcnNpb25TZWxlY3Rvci0+ZmluZEJlc3RDYW5kaWRhdGUoc3RydG9sb3dlcigkcGFja2FnZU5hbWUpLCAkdmVyc2lvbiwgJG1pblN0YWJpbGl0eSk7CmlmICgkcGFja2FnZSA9PT0gZmFsc2UpIHsKJHBhY2thZ2UgPSByZXNldCgkcGFja2FnZXMpOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkZvdW5kIG11bHRpcGxlIG1hdGNoZXMsIHNlbGVjdGVkICcuJHBhY2thZ2UtPmdldFByZXR0eVN0cmluZygpLicuPC9pbmZvPicpOwokaW8tPndyaXRlRXJyb3IoJ0FsdGVybmF0aXZlcyB3ZXJlICcuaW1wbG9kZSgnLCAnLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkcCk6IHN0cmluZyB7CnJldHVybiAkcC0+Z2V0UHJldHR5U3RyaW5nKCk7Cn0sICRwYWNrYWdlcykpLicuJyk7CiRpby0+d3JpdGVFcnJvcignPGNvbW1lbnQ+UGxlYXNlIHVzZSBhIG1vcmUgc3BlY2lmaWMgY29uc3RyYWludCB0byBwaWNrIGEgZGlmZmVyZW50IHBhY2thZ2UuPC9jb21tZW50PicpOwp9IGVsc2VpZiAoY291bnQoJHBhY2thZ2VzKSA9PT0gMSkgewokcGFja2FnZSA9IHJlc2V0KCRwYWNrYWdlcyk7CiRpby0+d3JpdGVFcnJvcignPGluZm8+Rm91bmQgYW4gZXhhY3QgbWF0Y2ggJy4kcGFja2FnZS0+Z2V0UHJldHR5U3RyaW5nKCkuJy48L2luZm8+Jyk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkNvdWxkIG5vdCBmaW5kIGEgcGFja2FnZSBtYXRjaGluZyAnLiRwYWNrYWdlTmFtZS4nLjwvZXJyb3I+Jyk7CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICghJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRXhwZWN0ZWQgYSBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgaW5zdGFuY2UgYnV0IGZvdW5kICcuZ2V0X2NsYXNzKCRwYWNrYWdlKSk7Cn0KaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIEJhc2VQYWNrYWdlKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0V4cGVjdGVkIGEgQmFzZVBhY2thZ2UgaW5zdGFuY2UgYnV0IGZvdW5kICcuZ2V0X2NsYXNzKCRwYWNrYWdlKSk7Cn0KCnJldHVybiAkcGFja2FnZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5VXRpbHM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CgpjbGFzcyBBdWRpdENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnYXVkaXQnKQotPnNldERlc2NyaXB0aW9uKCdDaGVja3MgZm9yIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgYWR2aXNvcmllcyBmb3IgaW5zdGFsbGVkIHBhY2thZ2VzJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIGF1ZGl0aW5nIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2Zvcm1hdCcsICdmJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnT3V0cHV0IGZvcm1hdC4gTXVzdCBiZSAidGFibGUiLCAicGxhaW4iLCAianNvbiIsIG9yICJzdW1tYXJ5Ii4nLCBBdWRpdG9yOjpGT1JNQVRfVEFCTEUsIEF1ZGl0b3I6OkZPUk1BVFMpLApuZXcgSW5wdXRPcHRpb24oJ2xvY2tlZCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXVkaXQgYmFzZWQgb24gdGhlIGxvY2sgZmlsZSBpbnN0ZWFkIG9mIHRoZSBpbnN0YWxsZWQgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignYWJhbmRvbmVkJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnQmVoYXZpb3Igb24gYWJhbmRvbmVkIHBhY2thZ2VzLiBNdXN0IGJlICJpZ25vcmUiLCAicmVwb3J0Iiwgb3IgImZhaWwiLicsIG51bGwsIEF1ZGl0b3I6OkFCQU5ET05FRFMpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1zZXZlcml0eScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSB8IElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0lnbm9yZSBhZHZpc29yaWVzIG9mIGEgY2VydGFpbiBzZXZlcml0eSBsZXZlbC4nLCBbXSwgWydsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnLCAnY3JpdGljYWwnXSksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5hdWRpdDwvaW5mbz4gY29tbWFuZCBjaGVja3MgZm9yIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgYWR2aXNvcmllcyBmb3IgaW5zdGFsbGVkIHBhY2thZ2VzLgoKSWYgeW91IGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgZGV2IGRlcGVuZGVuY2llcyBpbiB0aGUgYXVkaXQgeW91IGNhbiBvbWl0IHRoZW0gd2l0aCAtLW5vLWRldgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjYXVkaXQKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokcGFja2FnZXMgPSAkdGhpcy0+Z2V0UGFja2FnZXMoJGNvbXBvc2VyLCAkaW5wdXQpOwoKaWYgKGNvdW50KCRwYWNrYWdlcykgPT09IDApIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJ05vIHBhY2thZ2VzIC0gc2tpcHBpbmcgYXVkaXQuJyk7CgpyZXR1cm4gMDsKfQoKJGF1ZGl0b3IgPSBuZXcgQXVkaXRvcigpOwokcmVwb1NldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCk7CmZvcmVhY2ggKCRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJHJlcG8pIHsKJHJlcG9TZXQtPmFkZFJlcG9zaXRvcnkoJHJlcG8pOwp9CgokYXVkaXRDb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2F1ZGl0Jyk7CgokYWJhbmRvbmVkID0gJGlucHV0LT5nZXRPcHRpb24oJ2FiYW5kb25lZCcpOwppZiAoJGFiYW5kb25lZCAhPT0gbnVsbCAmJiAhaW5fYXJyYXkoJGFiYW5kb25lZCwgQXVkaXRvcjo6QUJBTkRPTkVEUywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJy0tYXVkaXQgbXVzdCBiZSBvbmUgb2YgJy5pbXBsb2RlKCcsICcsIEF1ZGl0b3I6OkFCQU5ET05FRFMpLicuJyk7Cn0KCiRhYmFuZG9uZWQgPSAkYWJhbmRvbmVkID8/ICRhdWRpdENvbmZpZ1snYWJhbmRvbmVkJ10gPz8gQXVkaXRvcjo6QUJBTkRPTkVEX0ZBSUw7CgokaWdub3JlU2V2ZXJpdGllcyA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtc2V2ZXJpdHknKSA/PyBbXTsKCnJldHVybiBtaW4oMjU1LCAkYXVkaXRvci0+YXVkaXQoCiR0aGlzLT5nZXRJTygpLAokcmVwb1NldCwKJHBhY2thZ2VzLAokdGhpcy0+Z2V0QXVkaXRGb3JtYXQoJGlucHV0LCAnZm9ybWF0JyksCmZhbHNlLAokYXVkaXRDb25maWdbJ2lnbm9yZSddID8/IFtdLAokYWJhbmRvbmVkLAokaWdub3JlU2V2ZXJpdGllcwopKTsKCn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGFja2FnZXMoQ29tcG9zZXIgJGNvbXBvc2VyLCBJbnB1dEludGVyZmFjZSAkaW5wdXQpOiBhcnJheQp7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbG9ja2VkJykpIHsKaWYgKCEkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdWYWxpZCBjb21wb3Nlci5qc29uIGFuZCBjb21wb3Nlci5sb2NrIGZpbGVzIGFyZSByZXF1aXJlZCB0byBydW4gdGhpcyBjb21tYW5kIHdpdGggLS1sb2NrZWQnKTsKfQokbG9ja2VyID0gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKTsKCnJldHVybiAkbG9ja2VyLT5nZXRMb2NrZWRSZXBvc2l0b3J5KCEkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpLT5nZXRQYWNrYWdlcygpOwp9Cgokcm9vdFBrZyA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpXSk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKSB7CnJldHVybiBSZXBvc2l0b3J5VXRpbHM6OmZpbHRlclJlcXVpcmVkUGFja2FnZXMoJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCksICRyb290UGtnKTsKfQoKcmV0dXJuICRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXE51bGxJTzsKdXNlIENvbXBvc2VyXFBsdWdpblxQcmVDb21tYW5kUnVuRXZlbnQ7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcVGFibGU7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxUYWJsZVNlcGFyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVybWluYWw7CgoKCgoKCgphYnN0cmFjdCBjbGFzcyBCYXNlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQKewoKCgpwcml2YXRlICRjb21wb3NlcjsKCgoKCnByaXZhdGUgJGlvOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFwcGxpY2F0aW9uKCk6IEFwcGxpY2F0aW9uCnsKJGFwcGxpY2F0aW9uID0gcGFyZW50OjpnZXRBcHBsaWNhdGlvbigpOwppZiAoISRhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ29tcG9zZXIgY29tbWFuZHMgY2FuIG9ubHkgd29yayB3aXRoIGFuICcuQXBwbGljYXRpb246OmNsYXNzLicgaW5zdGFuY2Ugc2V0Jyk7Cn0KCnJldHVybiAkYXBwbGljYXRpb247Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VyKGJvb2wgJHJlcXVpcmVkID0gdHJ1ZSwgP2Jvb2wgJGRpc2FibGVQbHVnaW5zID0gbnVsbCwgP2Jvb2wgJGRpc2FibGVTY3JpcHRzID0gbnVsbCkKewppZiAoJHJlcXVpcmVkKSB7CnJldHVybiAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKfQoKcmV0dXJuICR0aGlzLT50cnlDb21wb3NlcigkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXF1aXJlQ29tcG9zZXIoP2Jvb2wgJGRpc2FibGVQbHVnaW5zID0gbnVsbCwgP2Jvb2wgJGRpc2FibGVTY3JpcHRzID0gbnVsbCk6IENvbXBvc2VyCnsKaWYgKG51bGwgPT09ICR0aGlzLT5jb21wb3NlcikgewokYXBwbGljYXRpb24gPSBwYXJlbnQ6OmdldEFwcGxpY2F0aW9uKCk7CmlmICgkYXBwbGljYXRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbikgewokdGhpcy0+Y29tcG9zZXIgPSAkYXBwbGljYXRpb24tPmdldENvbXBvc2VyKHRydWUsICRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKYXNzZXJ0KCR0aGlzLT5jb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAonQ291bGQgbm90IGNyZWF0ZSBhIENvbXBvc2VyXENvbXBvc2VyIGluc3RhbmNlLCB5b3UgbXVzdCBpbmplY3QgJy4KJ29uZSBpZiB0aGlzIGNvbW1hbmQgaXMgbm90IHVzZWQgd2l0aCBhIENvbXBvc2VyXENvbnNvbGVcQXBwbGljYXRpb24gaW5zdGFuY2UnCik7Cn0KfQoKcmV0dXJuICR0aGlzLT5jb21wb3NlcjsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdHJ5Q29tcG9zZXIoP2Jvb2wgJGRpc2FibGVQbHVnaW5zID0gbnVsbCwgP2Jvb2wgJGRpc2FibGVTY3JpcHRzID0gbnVsbCk6ID9Db21wb3Nlcgp7CmlmIChudWxsID09PSAkdGhpcy0+Y29tcG9zZXIpIHsKJGFwcGxpY2F0aW9uID0gcGFyZW50OjpnZXRBcHBsaWNhdGlvbigpOwppZiAoJGFwcGxpY2F0aW9uIGluc3RhbmNlb2YgQXBwbGljYXRpb24pIHsKJHRoaXMtPmNvbXBvc2VyID0gJGFwcGxpY2F0aW9uLT5nZXRDb21wb3NlcihmYWxzZSwgJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwp9Cn0KCnJldHVybiAkdGhpcy0+Y29tcG9zZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb21wb3NlcihDb21wb3NlciAkY29tcG9zZXIpCnsKJHRoaXMtPmNvbXBvc2VyID0gJGNvbXBvc2VyOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNldENvbXBvc2VyKCkKewokdGhpcy0+Y29tcG9zZXIgPSBudWxsOwokdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+cmVzZXRDb21wb3NlcigpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUHJveHlDb21tYW5kKCkKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJTygpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5pbykgewokYXBwbGljYXRpb24gPSBwYXJlbnQ6OmdldEFwcGxpY2F0aW9uKCk7CmlmICgkYXBwbGljYXRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbikgewokdGhpcy0+aW8gPSAkYXBwbGljYXRpb24tPmdldElPKCk7Cn0gZWxzZSB7CiR0aGlzLT5pbyA9IG5ldyBOdWxsSU8oKTsKfQp9CgpyZXR1cm4gJHRoaXMtPmlvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SU8oSU9JbnRlcmZhY2UgJGlvKQp7CiR0aGlzLT5pbyA9ICRpbzsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShDb21wbGV0aW9uSW5wdXQgJGlucHV0LCBDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zKTogdm9pZAp7CiRkZWZpbml0aW9uID0gJHRoaXMtPmdldERlZmluaXRpb24oKTsKJG5hbWUgPSAoc3RyaW5nKSAkaW5wdXQtPmdldENvbXBsZXRpb25OYW1lKCk7CmlmIChDb21wbGV0aW9uSW5wdXQ6OlRZUEVfT1BUSU9OX1ZBTFVFID09PSAkaW5wdXQtPmdldENvbXBsZXRpb25UeXBlKCkKJiYgJGRlZmluaXRpb24tPmhhc09wdGlvbigkbmFtZSkKJiYgKCRvcHRpb24gPSAkZGVmaW5pdGlvbi0+Z2V0T3B0aW9uKCRuYW1lKSkgaW5zdGFuY2VvZiBJbnB1dE9wdGlvbgopIHsKJG9wdGlvbi0+Y29tcGxldGUoJGlucHV0LCAkc3VnZ2VzdGlvbnMpOwp9IGVsc2VpZiAoQ29tcGxldGlvbklucHV0OjpUWVBFX0FSR1VNRU5UX1ZBTFVFID09PSAkaW5wdXQtPmdldENvbXBsZXRpb25UeXBlKCkKJiYgJGRlZmluaXRpb24tPmhhc0FyZ3VtZW50KCRuYW1lKQomJiAoJGFyZ3VtZW50ID0gJGRlZmluaXRpb24tPmdldEFyZ3VtZW50KCRuYW1lKSkgaW5zdGFuY2VvZiBJbnB1dEFyZ3VtZW50CikgewokYXJndW1lbnQtPmNvbXBsZXRlKCRpbnB1dCwgJHN1Z2dlc3Rpb25zKTsKfSBlbHNlIHsKcGFyZW50Ojpjb21wbGV0ZSgkaW5wdXQsICRzdWdnZXN0aW9ucyk7Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CgokZGlzYWJsZVBsdWdpbnMgPSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS1uby1wbHVnaW5zJyk7CiRkaXNhYmxlU2NyaXB0cyA9ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLW5vLXNjcmlwdHMnKTsKCiRhcHBsaWNhdGlvbiA9IHBhcmVudDo6Z2V0QXBwbGljYXRpb24oKTsKaWYgKCRhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uICYmICRhcHBsaWNhdGlvbi0+Z2V0RGlzYWJsZVBsdWdpbnNCeURlZmF1bHQoKSkgewokZGlzYWJsZVBsdWdpbnMgPSB0cnVlOwp9CmlmICgkYXBwbGljYXRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbiAmJiAkYXBwbGljYXRpb24tPmdldERpc2FibGVTY3JpcHRzQnlEZWZhdWx0KCkpIHsKJGRpc2FibGVTY3JpcHRzID0gdHJ1ZTsKfQoKaWYgKCR0aGlzIGluc3RhbmNlb2YgU2VsZlVwZGF0ZUNvbW1hbmQpIHsKJGRpc2FibGVQbHVnaW5zID0gdHJ1ZTsKJGRpc2FibGVTY3JpcHRzID0gdHJ1ZTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAobnVsbCA9PT0gJGNvbXBvc2VyKSB7CiRjb21wb3NlciA9IEZhY3Rvcnk6OmNyZWF0ZUdsb2JhbCgkdGhpcy0+Z2V0SU8oKSwgJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwp9CmlmICgkY29tcG9zZXIpIHsKJHByZUNvbW1hbmRSdW5FdmVudCA9IG5ldyBQcmVDb21tYW5kUnVuRXZlbnQoUGx1Z2luRXZlbnRzOjpQUkVfQ09NTUFORF9SVU4sICRpbnB1dCwgJHRoaXMtPmdldE5hbWUoKSk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRwcmVDb21tYW5kUnVuRXZlbnQtPmdldE5hbWUoKSwgJHByZUNvbW1hbmRSdW5FdmVudCk7Cn0KCmlmICh0cnVlID09PSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbihbJy0tbm8tYW5zaSddKSAmJiAkaW5wdXQtPmhhc09wdGlvbignbm8tcHJvZ3Jlc3MnKSkgewokaW5wdXQtPnNldE9wdGlvbignbm8tcHJvZ3Jlc3MnLCB0cnVlKTsKfQoKJGVudk9wdGlvbnMgPSBbCidDT01QT1NFUl9OT19BVURJVCcgPT4gWyduby1hdWRpdCddLAonQ09NUE9TRVJfTk9fREVWJyA9PiBbJ25vLWRldicsICd1cGRhdGUtbm8tZGV2J10sCidDT01QT1NFUl9QUkVGRVJfU1RBQkxFJyA9PiBbJ3ByZWZlci1zdGFibGUnXSwKJ0NPTVBPU0VSX1BSRUZFUl9MT1dFU1QnID0+IFsncHJlZmVyLWxvd2VzdCddLAonQ09NUE9TRVJfTUlOSU1BTF9DSEFOR0VTJyA9PiBbJ21pbmltYWwtY2hhbmdlcyddLAonQ09NUE9TRVJfV0lUSF9ERVBFTkRFTkNJRVMnID0+IFsnd2l0aC1kZXBlbmRlbmNpZXMnXSwKJ0NPTVBPU0VSX1dJVEhfQUxMX0RFUEVOREVOQ0lFUycgPT4gWyd3aXRoLWFsbC1kZXBlbmRlbmNpZXMnXSwKXTsKZm9yZWFjaCAoJGVudk9wdGlvbnMgYXMgJGVudk5hbWUgPT4gJG9wdGlvbk5hbWVzKSB7CmZvcmVhY2ggKCRvcHRpb25OYW1lcyBhcyAkb3B0aW9uTmFtZSkgewppZiAodHJ1ZSA9PT0gJGlucHV0LT5oYXNPcHRpb24oJG9wdGlvbk5hbWUpKSB7CmlmIChmYWxzZSA9PT0gJGlucHV0LT5nZXRPcHRpb24oJG9wdGlvbk5hbWUpICYmIChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCRlbnZOYW1lKSkgewokaW5wdXQtPnNldE9wdGlvbigkb3B0aW9uTmFtZSwgdHJ1ZSk7Cn0KfQp9Cn0KCmlmICh0cnVlID09PSAkaW5wdXQtPmhhc09wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnKSkgewppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycpICYmIChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9JR05PUkVfUExBVEZPUk1fUkVRUycpKSB7CiRpbnB1dC0+c2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIHRydWUpOwoKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5DT01QT1NFUl9JR05PUkVfUExBVEZPUk1fUkVRUyBpcyBzZXQuIFlvdSBtYXkgZXhwZXJpZW5jZSB1bmV4cGVjdGVkIGVycm9ycy48L3dhcm5pbmc+Jyk7Cn0KfQoKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzT3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJykgJiYgKCEkaW5wdXQtPmhhc09wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnKSB8fCAhJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJykpKSB7CiRpZ25vcmVQbGF0Zm9ybVJlcUVudiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0lHTk9SRV9QTEFURk9STV9SRVEnKTsKaWYgKDAgPT09IGNvdW50KCRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJykpICYmIGlzX3N0cmluZygkaWdub3JlUGxhdGZvcm1SZXFFbnYpICYmICcnICE9PSAkaWdub3JlUGxhdGZvcm1SZXFFbnYpIHsKJGlucHV0LT5zZXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBleHBsb2RlKCcsJywgJGlnbm9yZVBsYXRmb3JtUmVxRW52KSk7CgokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNPTVBPU0VSX0lHTk9SRV9QTEFURk9STV9SRVEgaXMgc2V0IHRvIGlnbm9yZSAnLiRpZ25vcmVQbGF0Zm9ybVJlcUVudi4nLiBZb3UgbWF5IGV4cGVyaWVuY2UgdW5leHBlY3RlZCBlcnJvcnMuPC93YXJuaW5nPicpOwp9Cn0KCnBhcmVudDo6aW5pdGlhbGl6ZSgkaW5wdXQsICRvdXRwdXQpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvc2VySW5zdGFuY2UoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBJT0ludGVyZmFjZSAkaW8sICRjb25maWcgPSBudWxsLCA/Ym9vbCAkZGlzYWJsZVBsdWdpbnMgPSBudWxsLCA/Ym9vbCAkZGlzYWJsZVNjcmlwdHMgPSBudWxsKTogQ29tcG9zZXIKewokZGlzYWJsZVBsdWdpbnMgPSAkZGlzYWJsZVBsdWdpbnMgPT09IHRydWUgfHwgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tbm8tcGx1Z2lucycpOwokZGlzYWJsZVNjcmlwdHMgPSAkZGlzYWJsZVNjcmlwdHMgPT09IHRydWUgfHwgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tbm8tc2NyaXB0cycpOwoKJGFwcGxpY2F0aW9uID0gcGFyZW50OjpnZXRBcHBsaWNhdGlvbigpOwppZiAoJGFwcGxpY2F0aW9uIGluc3RhbmNlb2YgQXBwbGljYXRpb24gJiYgJGFwcGxpY2F0aW9uLT5nZXREaXNhYmxlUGx1Z2luc0J5RGVmYXVsdCgpKSB7CiRkaXNhYmxlUGx1Z2lucyA9IHRydWU7Cn0KaWYgKCRhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uICYmICRhcHBsaWNhdGlvbi0+Z2V0RGlzYWJsZVNjcmlwdHNCeURlZmF1bHQoKSkgewokZGlzYWJsZVNjcmlwdHMgPSB0cnVlOwp9CgpyZXR1cm4gRmFjdG9yeTo6Y3JlYXRlKCRpbywgJGNvbmZpZywgJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQcmVmZXJyZWRJbnN0YWxsT3B0aW9ucyhDb25maWcgJGNvbmZpZywgSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBib29sICRrZWVwVmNzUmVxdWlyZXNQcmVmZXJTb3VyY2UgPSBmYWxzZSkKewokcHJlZmVyU291cmNlID0gZmFsc2U7CiRwcmVmZXJEaXN0ID0gZmFsc2U7Cgpzd2l0Y2ggKCRjb25maWctPmdldCgncHJlZmVycmVkLWluc3RhbGwnKSkgewpjYXNlICdzb3VyY2UnOgokcHJlZmVyU291cmNlID0gdHJ1ZTsKYnJlYWs7CmNhc2UgJ2Rpc3QnOgokcHJlZmVyRGlzdCA9IHRydWU7CmJyZWFrOwpjYXNlICdhdXRvJzoKZGVmYXVsdDoKCmJyZWFrOwp9CgppZiAoISRpbnB1dC0+aGFzT3B0aW9uKCdwcmVmZXItZGlzdCcpIHx8ICEkaW5wdXQtPmhhc09wdGlvbigncHJlZmVyLXNvdXJjZScpKSB7CnJldHVybiBbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdOwp9CgppZiAoJGlucHV0LT5oYXNPcHRpb24oJ3ByZWZlci1pbnN0YWxsJykgJiYgaXNfc3RyaW5nKCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItaW5zdGFsbCcpKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignLS1wcmVmZXItc291cmNlIGNhbiBub3QgYmUgdXNlZCB0b2dldGhlciB3aXRoIC0tcHJlZmVyLWluc3RhbGwnKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1kaXN0JykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJy0tcHJlZmVyLWRpc3QgY2FuIG5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggLS1wcmVmZXItaW5zdGFsbCcpOwp9CnN3aXRjaCAoJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1pbnN0YWxsJykpIHsKY2FzZSAnZGlzdCc6CiRpbnB1dC0+c2V0T3B0aW9uKCdwcmVmZXItZGlzdCcsIHRydWUpOwpicmVhazsKY2FzZSAnc291cmNlJzoKJGlucHV0LT5zZXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnLCB0cnVlKTsKYnJlYWs7CmNhc2UgJ2F1dG8nOgokcHJlZmVyRGlzdCA9IGZhbHNlOwokcHJlZmVyU291cmNlID0gZmFsc2U7CmJyZWFrOwpkZWZhdWx0Ogp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignLS1wcmVmZXItaW5zdGFsbCBhY2NlcHRzIG9uZSBvZiAiZGlzdCIsICJzb3VyY2UiIG9yICJhdXRvIiwgZ290ICcuJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1pbnN0YWxsJykpOwp9Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLXNvdXJjZScpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItZGlzdCcpIHx8ICgka2VlcFZjc1JlcXVpcmVzUHJlZmVyU291cmNlICYmICRpbnB1dC0+aGFzT3B0aW9uKCdrZWVwLXZjcycpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCdrZWVwLXZjcycpKSkgewokcHJlZmVyU291cmNlID0gJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnKSB8fCAoJGtlZXBWY3NSZXF1aXJlc1ByZWZlclNvdXJjZSAmJiAkaW5wdXQtPmhhc09wdGlvbigna2VlcC12Y3MnKSAmJiAkaW5wdXQtPmdldE9wdGlvbigna2VlcC12Y3MnKSk7CiRwcmVmZXJEaXN0ID0gJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1kaXN0Jyk7Cn0KCnJldHVybiBbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcihJbnB1dEludGVyZmFjZSAkaW5wdXQpOiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlCnsKaWYgKCEkaW5wdXQtPmhhc09wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnKSB8fCAhJGlucHV0LT5oYXNPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdDYWxsaW5nIGdldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgZnJvbSBhIGNvbW1hbmQgd2hpY2ggZG9lcyBub3QgZGVmaW5lIHRoZSAtLWlnbm9yZS1wbGF0Zm9ybS1yZXFbc10gZmxhZ3MgaXMgbm90IHBlcm1pdHRlZC4nKTsKfQoKaWYgKHRydWUgPT09ICRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycpKSB7CnJldHVybiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlQWxsKCk7Cn0KCiRpZ25vcmVzID0gJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnKTsKaWYgKGNvdW50KCRpZ25vcmVzKSA+IDApIHsKcmV0dXJuIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Ojpmcm9tQm9vbE9yTGlzdCgkaWdub3Jlcyk7Cn0KCnJldHVybiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlTm90aGluZygpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBmb3JtYXRSZXF1aXJlbWVudHMoYXJyYXkgJHJlcXVpcmVtZW50cykKewokcmVxdWlyZXMgPSBbXTsKJHJlcXVpcmVtZW50cyA9ICR0aGlzLT5ub3JtYWxpemVSZXF1aXJlbWVudHMoJHJlcXVpcmVtZW50cyk7CmZvcmVhY2ggKCRyZXF1aXJlbWVudHMgYXMgJHJlcXVpcmVtZW50KSB7CmlmICghaXNzZXQoJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdPcHRpb24gJy4kcmVxdWlyZW1lbnRbJ25hbWUnXSAuJyBpcyBtaXNzaW5nIGEgdmVyc2lvbiBjb25zdHJhaW50LCB1c2UgZS5nLiAnLiRyZXF1aXJlbWVudFsnbmFtZSddLic6XjEuMCcpOwp9CiRyZXF1aXJlc1skcmVxdWlyZW1lbnRbJ25hbWUnXV0gPSAkcmVxdWlyZW1lbnRbJ3ZlcnNpb24nXTsKfQoKcmV0dXJuICRyZXF1aXJlczsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbm9ybWFsaXplUmVxdWlyZW1lbnRzKGFycmF5ICRyZXF1aXJlbWVudHMpCnsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CgpyZXR1cm4gJHBhcnNlci0+cGFyc2VOYW1lVmVyc2lvblBhaXJzKCRyZXF1aXJlbWVudHMpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZW5kZXJUYWJsZShhcnJheSAkdGFibGUsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiRyZW5kZXJlciA9IG5ldyBUYWJsZSgkb3V0cHV0KTsKJHJlbmRlcmVyLT5zZXRTdHlsZSgnY29tcGFjdCcpOwokcmVuZGVyZXItPnNldFJvd3MoJHRhYmxlKS0+cmVuZGVyKCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRUZXJtaW5hbFdpZHRoKCkKewokdGVybWluYWwgPSBuZXcgVGVybWluYWwoKTsKJHdpZHRoID0gJHRlcm1pbmFsLT5nZXRXaWR0aCgpOwoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokd2lkdGgtLTsKfSBlbHNlIHsKJHdpZHRoID0gbWF4KDgwLCAkd2lkdGgpOwp9CgpyZXR1cm4gJHdpZHRoOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRBdWRpdEZvcm1hdChJbnB1dEludGVyZmFjZSAkaW5wdXQsIHN0cmluZyAkb3B0TmFtZSA9ICdhdWRpdC1mb3JtYXQnKTogc3RyaW5nCnsKaWYgKCEkaW5wdXQtPmhhc09wdGlvbigkb3B0TmFtZSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBhIENvbW1hbmQgd2hpY2ggaGFzIG5vICcuJG9wdE5hbWUuJyBvcHRpb24gZGVmaW5lZC4nKTsKfQoKJHZhbCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCRvcHROYW1lKTsKaWYgKCFpbl9hcnJheSgkdmFsLCBBdWRpdG9yOjpGT1JNQVRTLCB0cnVlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignLS0nLiRvcHROYW1lLicgbXVzdCBiZSBvbmUgb2YgJy5pbXBsb2RlKCcsICcsIEF1ZGl0b3I6OkZPUk1BVFMpLicuJyk7Cn0KCnJldHVybiAkdmFsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJvb3RQYWNrYWdlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQm91bmQ7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyU3R5bGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VJbmZvOwoKCgoKCgphYnN0cmFjdCBjbGFzcyBCYXNlRGVwZW5kZW5jeUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByb3RlY3RlZCBjb25zdCBBUkdVTUVOVF9QQUNLQUdFID0gJ3BhY2thZ2UnOwpwcm90ZWN0ZWQgY29uc3QgQVJHVU1FTlRfQ09OU1RSQUlOVCA9ICd2ZXJzaW9uJzsKcHJvdGVjdGVkIGNvbnN0IE9QVElPTl9SRUNVUlNJVkUgPSAncmVjdXJzaXZlJzsKcHJvdGVjdGVkIGNvbnN0IE9QVElPTl9UUkVFID0gJ3RyZWUnOwoKCnByb3RlY3RlZCAkY29sb3JzOwoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBib29sICRpbnZlcnRlZCA9IGZhbHNlKTogaW50CnsKCiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAkdGhpcy0+Z2V0TmFtZSgpLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJHJlcG9zID0gW107CgokcmVwb3NbXSA9IG5ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoY2xvbmUgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCkpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsb2NrZWQnKSkgewokbG9ja2VyID0gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKTsKCmlmICghJGxvY2tlci0+aXNMb2NrZWQoKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignQSB2YWxpZCBjb21wb3Nlci5sb2NrIGZpbGUgaXMgcmVxdWlyZWQgdG8gcnVuIHRoaXMgY29tbWFuZCB3aXRoIC0tbG9ja2VkJyk7Cn0KCiRyZXBvc1tdID0gJGxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSh0cnVlKTsKJHJlcG9zW10gPSBuZXcgUGxhdGZvcm1SZXBvc2l0b3J5KFtdLCAkbG9ja2VyLT5nZXRQbGF0Zm9ybU92ZXJyaWRlcygpKTsKfSBlbHNlIHsKJGxvY2FsUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiRyb290UGtnID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CgppZiAoY291bnQoJGxvY2FsUmVwby0+Z2V0UGFja2FnZXMoKSkgPT09IDAgJiYgKGNvdW50KCRyb290UGtnLT5nZXRSZXF1aXJlcygpKSA+IDAgfHwgY291bnQoJHJvb3RQa2ctPmdldERldlJlcXVpcmVzKCkpID4gMCkpIHsKJG91dHB1dC0+d3JpdGVsbignPHdhcm5pbmc+Tm8gZGVwZW5kZW5jaWVzIGluc3RhbGxlZC4gVHJ5IHJ1bm5pbmcgY29tcG9zZXIgaW5zdGFsbCBvciB1cGRhdGUsIG9yIHVzZSAtLWxvY2tlZC48L3dhcm5pbmc+Jyk7CgpyZXR1cm4gMTsKfQoKJHJlcG9zW10gPSAkbG9jYWxSZXBvOwoKJHBsYXRmb3JtT3ZlcnJpZGVzID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdwbGF0Zm9ybScpID86IFtdOwokcmVwb3NbXSA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRwbGF0Zm9ybU92ZXJyaWRlcyk7Cn0KCiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoJHJlcG9zKTsKCgokbmVlZGxlID0gJGlucHV0LT5nZXRBcmd1bWVudChzZWxmOjpBUkdVTUVOVF9QQUNLQUdFKTsKJHRleHRDb25zdHJhaW50ID0gJGlucHV0LT5oYXNBcmd1bWVudChzZWxmOjpBUkdVTUVOVF9DT05TVFJBSU5UKSA/ICRpbnB1dC0+Z2V0QXJndW1lbnQoc2VsZjo6QVJHVU1FTlRfQ09OU1RSQUlOVCkgOiAnKic7CgoKJHBhY2thZ2VzID0gJGluc3RhbGxlZFJlcG8tPmZpbmRQYWNrYWdlc1dpdGhSZXBsYWNlcnNBbmRQcm92aWRlcnMoJG5lZWRsZSk7CmlmIChlbXB0eSgkcGFja2FnZXMpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0NvdWxkIG5vdCBmaW5kIHBhY2thZ2UgIiVzIiBpbiB5b3VyIHByb2plY3QnLCAkbmVlZGxlKSk7Cn0KCgoKJG1hdGNoZWRQYWNrYWdlID0gJGluc3RhbGxlZFJlcG8tPmZpbmRQYWNrYWdlKCRuZWVkbGUsICR0ZXh0Q29uc3RyYWludCk7CmlmICghJG1hdGNoZWRQYWNrYWdlKSB7CiRkZWZhdWx0UmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeShSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zKCR0aGlzLT5nZXRJTygpLCAkY29tcG9zZXItPmdldENvbmZpZygpLCAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCkpKTsKaWYgKCRtYXRjaCA9ICRkZWZhdWx0UmVwb3MtPmZpbmRQYWNrYWdlKCRuZWVkbGUsICR0ZXh0Q29uc3RyYWludCkpIHsKJGluc3RhbGxlZFJlcG8tPmFkZFJlcG9zaXRvcnkobmV3IEluc3RhbGxlZEFycmF5UmVwb3NpdG9yeShbY2xvbmUgJG1hdGNoXSkpOwp9IGVsc2VpZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmVlZGxlKSkgewokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJGNvbnN0cmFpbnQgPSAkcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCR0ZXh0Q29uc3RyYWludCk7CmlmICgkY29uc3RyYWludC0+Z2V0TG93ZXJCb3VuZCgpICE9PSBCb3VuZDo6emVybygpKSB7CiR0ZW1wUGxhdGZvcm1Qa2cgPSBuZXcgUGFja2FnZSgkbmVlZGxlLCAkY29uc3RyYWludC0+Z2V0TG93ZXJCb3VuZCgpLT5nZXRWZXJzaW9uKCksICRjb25zdHJhaW50LT5nZXRMb3dlckJvdW5kKCktPmdldFZlcnNpb24oKSk7CiRpbnN0YWxsZWRSZXBvLT5hZGRSZXBvc2l0b3J5KG5ldyBJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnkoWyR0ZW1wUGxhdGZvcm1Qa2ddKSk7Cn0KfSBlbHNlIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzxlcnJvcj5QYWNrYWdlICInLiRuZWVkbGUuJyIgY291bGQgbm90IGJlIGZvdW5kIHdpdGggY29uc3RyYWludCAiJy4kdGV4dENvbnN0cmFpbnQuJyIsIHJlc3VsdHMgYmVsb3cgd2lsbCBtb3N0IGxpa2VseSBiZSBpbmNvbXBsZXRlLjwvZXJyb3I+Jyk7Cn0KfSBlbHNlaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5lZWRsZSkpIHsKJGV4dHJhTm90aWNlID0gJyc7CmlmICgoJG1hdGNoZWRQYWNrYWdlLT5nZXRFeHRyYSgpWydjb25maWcucGxhdGZvcm0nXSA/PyBmYWxzZSkgPT09IHRydWUpIHsKJGV4dHJhTm90aWNlID0gJyAodmVyc2lvbiBwcm92aWRlZCBieSBjb25maWcucGxhdGZvcm0pJzsKfQokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignPGluZm8+UGFja2FnZSAiJy4kbmVlZGxlLicgJy4kdGV4dENvbnN0cmFpbnQuJyIgZm91bmQgaW4gdmVyc2lvbiAiJy4kbWF0Y2hlZFBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4nIicuJGV4dHJhTm90aWNlLicuPC9pbmZvPicpOwp9IGVsc2VpZiAoJGludmVydGVkKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZSgnPGNvbW1lbnQ+UGFja2FnZSAiJy4kbmVlZGxlLiciICcuJG1hdGNoZWRQYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyBpcyBhbHJlYWR5IGluc3RhbGxlZCEgVG8gZmluZCBvdXQgd2h5LCBydW4gYGNvbXBvc2VyIHdoeSAnLiRuZWVkbGUuJ2A8L2NvbW1lbnQ+Jyk7CnJldHVybiAwOwp9CgoKJG5lZWRsZXMgPSBbJG5lZWRsZV07CmlmICgkaW52ZXJ0ZWQpIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRuZWVkbGVzID0gYXJyYXlfbWVyZ2UoJG5lZWRsZXMsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKExpbmsgJGxpbmspOiBzdHJpbmcgewpyZXR1cm4gJGxpbmstPmdldFRhcmdldCgpOwp9LCAkcGFja2FnZS0+Z2V0UmVwbGFjZXMoKSkpOwp9Cn0KCgppZiAoJyonICE9PSAkdGV4dENvbnN0cmFpbnQpIHsKJHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokY29uc3RyYWludCA9ICR2ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCR0ZXh0Q29uc3RyYWludCk7Cn0gZWxzZSB7CiRjb25zdHJhaW50ID0gbnVsbDsKfQoKCiRyZW5kZXJUcmVlID0gJGlucHV0LT5nZXRPcHRpb24oc2VsZjo6T1BUSU9OX1RSRUUpOwokcmVjdXJzaXZlID0gJHJlbmRlclRyZWUgfHwgJGlucHV0LT5nZXRPcHRpb24oc2VsZjo6T1BUSU9OX1JFQ1VSU0lWRSk7CgokcmV0dXJuID0gJGludmVydGVkID8gMSA6IDA7CgoKJHJlc3VsdHMgPSAkaW5zdGFsbGVkUmVwby0+Z2V0RGVwZW5kZW50cygkbmVlZGxlcywgJGNvbnN0cmFpbnQsICRpbnZlcnRlZCwgJHJlY3Vyc2l2ZSk7CmlmIChlbXB0eSgkcmVzdWx0cykpIHsKJGV4dHJhID0gKG51bGwgIT09ICRjb25zdHJhaW50KSA/IHNwcmludGYoJyBpbiB2ZXJzaW9ucyAlc21hdGNoaW5nICVzJywgJGludmVydGVkID8gJ25vdCAnIDogJycsICR0ZXh0Q29uc3RyYWludCkgOiAnJzsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3Ioc3ByaW50ZigKJzxpbmZvPlRoZXJlIGlzIG5vIGluc3RhbGxlZCBwYWNrYWdlIGRlcGVuZGluZyBvbiAiJXMiJXM8L2luZm8+JywKJG5lZWRsZSwKJGV4dHJhCikpOwokcmV0dXJuID0gJGludmVydGVkID8gMCA6IDE7Cn0gZWxzZWlmICgkcmVuZGVyVHJlZSkgewokdGhpcy0+aW5pdFN0eWxlcygkb3V0cHV0KTsKJHJvb3QgPSAkcGFja2FnZXNbMF07CiR0aGlzLT5nZXRJTygpLT53cml0ZShzcHJpbnRmKCc8aW5mbz4lczwvaW5mbz4gJXMgJXMnLCAkcm9vdC0+Z2V0UHJldHR5TmFtZSgpLCAkcm9vdC0+Z2V0UHJldHR5VmVyc2lvbigpLCAkcm9vdCBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSA/ICRyb290LT5nZXREZXNjcmlwdGlvbigpIDogJycpKTsKJHRoaXMtPnByaW50VHJlZSgkcmVzdWx0cyk7Cn0gZWxzZSB7CiR0aGlzLT5wcmludFRhYmxlKCRvdXRwdXQsICRyZXN1bHRzKTsKfQoKaWYgKCRpbnZlcnRlZCAmJiAkaW5wdXQtPmhhc0FyZ3VtZW50KHNlbGY6OkFSR1VNRU5UX0NPTlNUUkFJTlQpICYmICFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRuZWVkbGUpKSB7CiRjb21wb3NlckNvbW1hbmQgPSAndXBkYXRlJzsKCmZvcmVhY2ggKCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRSZXF1aXJlcygpIGFzICRyb290UmVxdWlyZW1lbnQpIHsKaWYgKCRyb290UmVxdWlyZW1lbnQtPmdldFRhcmdldCgpID09PSAkbmVlZGxlKSB7CiRjb21wb3NlckNvbW1hbmQgPSAncmVxdWlyZSc7CmJyZWFrOwp9Cn0KCmZvcmVhY2ggKCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXREZXZSZXF1aXJlcygpIGFzICRyb290UmVxdWlyZW1lbnQpIHsKaWYgKCRyb290UmVxdWlyZW1lbnQtPmdldFRhcmdldCgpID09PSAkbmVlZGxlKSB7CiRjb21wb3NlckNvbW1hbmQgPSAncmVxdWlyZSAtLWRldic7CmJyZWFrOwp9Cn0KCiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCdOb3QgZmluZGluZyB3aGF0IHlvdSB3ZXJlIGxvb2tpbmcgZm9yPyBUcnkgY2FsbGluZyBgY29tcG9zZXIgJy4kY29tcG9zZXJDb21tYW5kLicgIicuJG5lZWRsZS4nOicuJHRleHRDb25zdHJhaW50LiciIC0tZHJ5LXJ1bmAgdG8gZ2V0IGFub3RoZXIgdmlldyBvbiB0aGUgcHJvYmxlbS4nKTsKfQoKcmV0dXJuICRyZXR1cm47Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByaW50VGFibGUoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIGFycmF5ICRyZXN1bHRzKTogdm9pZAp7CiR0YWJsZSA9IFtdOwokZG91YmxlcyA9IFtdOwpkbyB7CiRxdWV1ZSA9IFtdOwokcm93cyA9IFtdOwpmb3JlYWNoICgkcmVzdWx0cyBhcyAkcmVzdWx0KSB7CgoKCgpbJHBhY2thZ2UsICRsaW5rLCAkY2hpbGRyZW5dID0gJHJlc3VsdDsKJHVuaXF1ZSA9IChzdHJpbmcpICRsaW5rOwppZiAoaXNzZXQoJGRvdWJsZXNbJHVuaXF1ZV0pKSB7CmNvbnRpbnVlOwp9CiRkb3VibGVzWyR1bmlxdWVdID0gdHJ1ZTsKJHZlcnNpb24gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpID09PSBSb290UGFja2FnZTo6REVGQVVMVF9QUkVUVFlfVkVSU0lPTiA/ICctJyA6ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7CiRwYWNrYWdlVXJsID0gUGFja2FnZUluZm86OmdldFZpZXdTb3VyY2VPckhvbWVwYWdlVXJsKCRwYWNrYWdlKTsKJG5hbWVXaXRoTGluayA9ICRwYWNrYWdlVXJsICE9PSBudWxsID8gJzxocmVmPScgLiBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkcGFja2FnZVVybCkgLiAnPicgLiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpIC4gJzwvPicgOiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwokcm93c1tdID0gWyRuYW1lV2l0aExpbmssICR2ZXJzaW9uLCAkbGluay0+Z2V0RGVzY3JpcHRpb24oKSwgc3ByaW50ZignJXMgKCVzKScsICRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSldOwppZiAoaXNfYXJyYXkoJGNoaWxkcmVuKSkgewokcXVldWUgPSBhcnJheV9tZXJnZSgkcXVldWUsICRjaGlsZHJlbik7Cn0KfQokcmVzdWx0cyA9ICRxdWV1ZTsKJHRhYmxlID0gYXJyYXlfbWVyZ2UoJHJvd3MsICR0YWJsZSk7Cn0gd2hpbGUgKFxjb3VudCgkcmVzdWx0cykgPiAwKTsKCiR0aGlzLT5yZW5kZXJUYWJsZSgkdGFibGUsICRvdXRwdXQpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdFN0eWxlcyhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewokdGhpcy0+Y29sb3JzID0gWwonZ3JlZW4nLAoneWVsbG93JywKJ2N5YW4nLAonbWFnZW50YScsCidibHVlJywKXTsKCmZvcmVhY2ggKCR0aGlzLT5jb2xvcnMgYXMgJGNvbG9yKSB7CiRzdHlsZSA9IG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgkY29sb3IpOwokb3V0cHV0LT5nZXRGb3JtYXR0ZXIoKS0+c2V0U3R5bGUoJGNvbG9yLCAkc3R5bGUpOwp9Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRUcmVlKGFycmF5ICRyZXN1bHRzLCBzdHJpbmcgJHByZWZpeCA9ICcnLCBpbnQgJGxldmVsID0gMSk6IHZvaWQKewokY291bnQgPSBjb3VudCgkcmVzdWx0cyk7CiRpZHggPSAwOwpmb3JlYWNoICgkcmVzdWx0cyBhcyAkcmVzdWx0KSB7ClskcGFja2FnZSwgJGxpbmssICRjaGlsZHJlbl0gPSAkcmVzdWx0OwoKJGNvbG9yID0gJHRoaXMtPmNvbG9yc1skbGV2ZWwgJSBjb3VudCgkdGhpcy0+Y29sb3JzKV07CiRwcmV2Q29sb3IgPSAkdGhpcy0+Y29sb3JzWygkbGV2ZWwgLSAxKSAlIGNvdW50KCR0aGlzLT5jb2xvcnMpXTsKJGlzTGFzdCA9ICgrKyRpZHggPT09ICRjb3VudCk7CiR2ZXJzaW9uVGV4dCA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgPT09IFJvb3RQYWNrYWdlOjpERUZBVUxUX1BSRVRUWV9WRVJTSU9OID8gJycgOiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwokcGFja2FnZVVybCA9IFBhY2thZ2VJbmZvOjpnZXRWaWV3U291cmNlT3JIb21lcGFnZVVybCgkcGFja2FnZSk7CiRuYW1lV2l0aExpbmsgPSAkcGFja2FnZVVybCAhPT0gbnVsbCA/ICc8aHJlZj0nIC4gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJHBhY2thZ2VVcmwpIC4gJz4nIC4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSAuICc8Lz4nIDogJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKJHBhY2thZ2VUZXh0ID0gcnRyaW0oc3ByaW50ZignPCVzPiVzPC8lMSRzPiAlcycsICRjb2xvciwgJG5hbWVXaXRoTGluaywgJHZlcnNpb25UZXh0KSk7CiRsaW5rVGV4dCA9IHNwcmludGYoJyVzIDwlcz4lczwvJTIkcz4gJXMnLCAkbGluay0+Z2V0RGVzY3JpcHRpb24oKSwgJHByZXZDb2xvciwgJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpKTsKJGNpcmN1bGFyV2FybiA9ICRjaGlsZHJlbiA9PT0gZmFsc2UgPyAnKGNpcmN1bGFyIGRlcGVuZGVuY3kgYWJvcnRlZCBoZXJlKScgOiAnJzsKJHRoaXMtPndyaXRlVHJlZUxpbmUocnRyaW0oc3ByaW50ZigiJXMlcyVzICglcykgJXMiLCAkcHJlZml4LCAkaXNMYXN0ID8gJ+KUlOKUgOKUgCcgOiAn4pSc4pSA4pSAJywgJHBhY2thZ2VUZXh0LCAkbGlua1RleHQsICRjaXJjdWxhcldhcm4pKSk7CmlmIChpc19hcnJheSgkY2hpbGRyZW4pKSB7CiR0aGlzLT5wcmludFRyZWUoJGNoaWxkcmVuLCAkcHJlZml4IC4gKCRpc0xhc3QgPyAnICAgJyA6ICfilIIgICcpLCAkbGV2ZWwgKyAxKTsKfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gd3JpdGVUcmVlTGluZShzdHJpbmcgJGxpbmUpOiB2b2lkCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CmlmICghJGlvLT5pc0RlY29yYXRlZCgpKSB7CiRsaW5lID0gc3RyX3JlcGxhY2UoWyfilJQnLCAn4pScJywgJ+KUgOKUgCcsICfilIInXSwgWydgLScsICd8LScsICctJywgJ3wnXSwgJGxpbmUpOwp9CgokaW8tPndyaXRlKCRsaW5lKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2NrZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvbkJ1bXBlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxKc29uXEpzb25NYW5pcHVsYXRvcjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKCgoKCmZpbmFsIGNsYXNzIEJ1bXBDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcml2YXRlIGNvbnN0IEVSUk9SX0dFTkVSSUMgPSAxOwpwcml2YXRlIGNvbnN0IEVSUk9SX0xPQ0tfT1VUREFURUQgPSAyOwoKdXNlIENvbXBsZXRpb25UcmFpdDsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnYnVtcCcpCi0+c2V0RGVzY3JpcHRpb24oJ0luY3JlYXNlcyB0aGUgbG93ZXIgbGltaXQgb2YgeW91ciBjb21wb3Nlci5qc29uIHJlcXVpcmVtZW50cyB0byB0aGUgY3VycmVudGx5IGluc3RhbGxlZCB2ZXJzaW9ucycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlcycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdPcHRpb25hbCBwYWNrYWdlIG5hbWUocykgdG8gcmVzdHJpY3Qgd2hpY2ggcGFja2FnZXMgYXJlIGJ1bXBlZC4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFJvb3RSZXF1aXJlbWVudCgpKSwKbmV3IElucHV0T3B0aW9uKCdkZXYtb25seScsICdEJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPbmx5IGJ1bXAgcmVxdWlyZW1lbnRzIGluICJyZXF1aXJlLWRldiIuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2LW9ubHknLCAnUicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT25seSBidW1wIHJlcXVpcmVtZW50cyBpbiAicmVxdWlyZSIuJyksCm5ldyBJbnB1dE9wdGlvbignZHJ5LXJ1bicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3V0cHV0cyB0aGUgcGFja2FnZXMgdG8gYnVtcCwgYnV0IHdpbGwgbm90IGV4ZWN1dGUgYW55dGhpbmcuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5idW1wPC9pbmZvPiBjb21tYW5kIGluY3JlYXNlcyB0aGUgbG93ZXIgbGltaXQgb2YgeW91ciBjb21wb3Nlci5qc29uIHJlcXVpcmVtZW50cwp0byB0aGUgY3VycmVudGx5IGluc3RhbGxlZCB2ZXJzaW9ucy4gVGhpcyBoZWxwcyB0byBlbnN1cmUgeW91ciBkZXBlbmRlbmNpZXMgZG8gbm90CmFjY2lkZW50YWxseSBnZXQgZG93bmdyYWRlZCBkdWUgdG8gc29tZSBvdGhlciBjb25mbGljdCwgYW5kIGNhbiBzbGlnaHRseSBpbXByb3ZlCmRlcGVuZGVuY3kgcmVzb2x1dGlvbiBwZXJmb3JtYW5jZSBhcyBpdCBsaW1pdHMgdGhlIGFtb3VudCBvZiBwYWNrYWdlIHZlcnNpb25zCkNvbXBvc2VyIGhhcyB0byBsb29rIGF0LgoKUnVubmluZyB0aGlzIGJsaW5kbHkgb24gbGlicmFyaWVzIGlzICoqTk9UKiogcmVjb21tZW5kZWQgYXMgaXQgd2lsbCBuYXJyb3cgZG93bgp5b3VyIGFsbG93ZWQgZGVwZW5kZW5jaWVzLCB3aGljaCBtYXkgY2F1c2UgZGVwZW5kZW5jeSBoZWxsIGZvciB5b3VyIHVzZXJzLgpSdW5uaW5nIGl0IHdpdGggPGluZm8+LS1kZXYtb25seTwvaW5mbz4gb24gbGlicmFyaWVzIG1heSBiZSBmaW5lIGhvd2V2ZXIgYXMgZGV2IHJlcXVpcmVtZW50cwphcmUgbG9jYWwgdG8gdGhlIGxpYnJhcnkgYW5kIGRvIG5vdCBhZmZlY3QgY29uc3VtZXJzIG9mIHRoZSBwYWNrYWdlLgoKRU9UCikKOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKcmV0dXJuICR0aGlzLT5kb0J1bXAoCiR0aGlzLT5nZXRJTygpLAokaW5wdXQtPmdldE9wdGlvbignZGV2LW9ubHknKSwKJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldi1vbmx5JyksCiRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJyksCiRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJykKKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkb0J1bXAoCklPSW50ZXJmYWNlICRpbywKYm9vbCAkZGV2T25seSwKYm9vbCAkbm9EZXZPbmx5LApib29sICRkcnlSdW4sCmFycmF5ICRwYWNrYWdlc0ZpbHRlcgopOiBpbnQgewoKJGNvbXBvc2VySnNvblBhdGggPSBGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKTsKCmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkY29tcG9zZXJKc29uUGF0aCkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kY29tcG9zZXJKc29uUGF0aC4nIGlzIG5vdCByZWFkYWJsZS48L2Vycm9yPicpOwoKcmV0dXJuIHNlbGY6OkVSUk9SX0dFTkVSSUM7Cn0KCiRjb21wb3Nlckpzb24gPSBuZXcgSnNvbkZpbGUoJGNvbXBvc2VySnNvblBhdGgpOwokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkY29tcG9zZXJKc29uLT5nZXRQYXRoKCkpOwppZiAoZmFsc2UgPT09ICRjb250ZW50cykgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLiRjb21wb3Nlckpzb25QYXRoLicgaXMgbm90IHJlYWRhYmxlLjwvZXJyb3I+Jyk7CgpyZXR1cm4gc2VsZjo6RVJST1JfR0VORVJJQzsKfQoKCgppZiAoIWlzX3dyaXRhYmxlKCRjb21wb3Nlckpzb25QYXRoKSAmJiBmYWxzZSA9PT0gU2lsZW5jZXI6OmNhbGwoJ2ZpbGVfcHV0X2NvbnRlbnRzJywgJGNvbXBvc2VySnNvblBhdGgsICRjb250ZW50cykpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kY29tcG9zZXJKc29uUGF0aC4nIGlzIG5vdCB3cml0YWJsZS48L2Vycm9yPicpOwoKcmV0dXJuIHNlbGY6OkVSUk9SX0dFTkVSSUM7Cn0KdW5zZXQoJGNvbnRlbnRzKTsKCiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKaWYgKCRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKaWYgKCEkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0ZyZXNoKCkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGxvY2sgZmlsZSBpcyBub3QgdXAgdG8gZGF0ZSB3aXRoIHRoZSBsYXRlc3QgY2hhbmdlcyBpbiBjb21wb3Nlci5qc29uLiBSdW4gdGhlIGFwcHJvcHJpYXRlIGB1cGRhdGVgIHRvIGZpeCB0aGF0IGJlZm9yZSB5b3UgdXNlIHRoZSBgYnVtcGAgY29tbWFuZC48L2Vycm9yPicpOwoKcmV0dXJuIHNlbGY6OkVSUk9SX0xPQ0tfT1VUREFURUQ7Cn0KCiRyZXBvID0gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+Z2V0TG9ja2VkUmVwb3NpdG9yeSh0cnVlKTsKfSBlbHNlIHsKJHJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwp9CgppZiAoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFR5cGUoKSAhPT0gJ3Byb2plY3QnICYmICEkZGV2T25seSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPldhcm5pbmc6IEJ1bXBpbmcgZGVwZW5kZW5jeSBjb25zdHJhaW50cyBpcyBub3QgcmVjb21tZW5kZWQgZm9yIGxpYnJhcmllcyBhcyBpdCB3aWxsIG5hcnJvdyBkb3duIHlvdXIgZGVwZW5kZW5jaWVzIGFuZCBtYXkgY2F1c2UgcHJvYmxlbXMgZm9yIHlvdXIgdXNlcnMuPC93YXJuaW5nPicpOwoKJGNvbnRlbnRzID0gJGNvbXBvc2VySnNvbi0+cmVhZCgpOwppZiAoIWlzc2V0KCRjb250ZW50c1sndHlwZSddKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPklmIHlvdXIgcGFja2FnZSBpcyBub3QgYSBsaWJyYXJ5LCB5b3UgY2FuIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgInR5cGUiIGJ5IHVzaW5nICJjb21wb3NlciBjb25maWcgdHlwZSBwcm9qZWN0Ii48L3dhcm5pbmc+Jyk7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+QWx0ZXJuYXRpdmVseSB5b3UgY2FuIHVzZSAtLWRldi1vbmx5IHRvIG9ubHkgYnVtcCBkZXBlbmRlbmNpZXMgd2l0aGluICJyZXF1aXJlLWRldiIuPC93YXJuaW5nPicpOwp9CnVuc2V0KCRjb250ZW50cyk7Cn0KCiRidW1wZXIgPSBuZXcgVmVyc2lvbkJ1bXBlcigpOwokdGFza3MgPSBbXTsKaWYgKCEkZGV2T25seSkgewokdGFza3NbJ3JlcXVpcmUnXSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRSZXF1aXJlcygpOwp9CmlmICghJG5vRGV2T25seSkgewokdGFza3NbJ3JlcXVpcmUtZGV2J10gPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0RGV2UmVxdWlyZXMoKTsKfQoKaWYgKGNvdW50KCRwYWNrYWdlc0ZpbHRlcikgPiAwKSB7CgokcGFja2FnZXNGaWx0ZXIgPSBhcnJheV9tYXAoZnVuY3Rpb24gKCRjb25zdHJhaW50KSB7CnJldHVybiBQcmVnOjpyZXBsYWNlKCd7Wzo9IF0uK30nLCAnJywgJGNvbnN0cmFpbnQpOwp9LCAkcGFja2FnZXNGaWx0ZXIpOwokcGF0dGVybiA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZXNUb1JlZ2V4cChhcnJheV91bmlxdWUoYXJyYXlfbWFwKCdzdHJ0b2xvd2VyJywgJHBhY2thZ2VzRmlsdGVyKSkpOwpmb3JlYWNoICgkdGFza3MgYXMgJGtleSA9PiAkcmVxcykgewpmb3JlYWNoICgkcmVxcyBhcyAkcGtnTmFtZSA9PiAkbGluaykgewppZiAoIVByZWc6OmlzTWF0Y2goJHBhdHRlcm4sICRwa2dOYW1lKSkgewp1bnNldCgkdGFza3NbJGtleV1bJHBrZ05hbWVdKTsKfQp9Cn0KfQoKJHVwZGF0ZXMgPSBbXTsKZm9yZWFjaCAoJHRhc2tzIGFzICRrZXkgPT4gJHJlcXMpIHsKZm9yZWFjaCAoJHJlcXMgYXMgJHBrZ05hbWUgPT4gJGxpbmspIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHBrZ05hbWUpKSB7CmNvbnRpbnVlOwp9CiRjdXJyZW50Q29uc3RyYWludCA9ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7CgokcGFja2FnZSA9ICRyZXBvLT5maW5kUGFja2FnZSgkcGtnTmFtZSwgJyonKTsKCmlmIChudWxsID09PSAkcGFja2FnZSkgewpjb250aW51ZTsKfQp3aGlsZSAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgokYnVtcGVkID0gJGJ1bXBlci0+YnVtcFJlcXVpcmVtZW50KCRsaW5rLT5nZXRDb25zdHJhaW50KCksICRwYWNrYWdlKTsKCmlmICgkYnVtcGVkID09PSAkY3VycmVudENvbnN0cmFpbnQpIHsKY29udGludWU7Cn0KCiR1cGRhdGVzWyRrZXldWyRwa2dOYW1lXSA9ICRidW1wZWQ7Cn0KfQoKaWYgKCEkZHJ5UnVuICYmICEkdGhpcy0+dXBkYXRlRmlsZUNsZWFubHkoJGNvbXBvc2VySnNvbiwgJHVwZGF0ZXMpKSB7CiRjb21wb3NlckRlZmluaXRpb24gPSAkY29tcG9zZXJKc29uLT5yZWFkKCk7CmZvcmVhY2ggKCR1cGRhdGVzIGFzICRrZXkgPT4gJHBhY2thZ2VzKSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSA9PiAkdmVyc2lvbikgewokY29tcG9zZXJEZWZpbml0aW9uWyRrZXldWyRwYWNrYWdlXSA9ICR2ZXJzaW9uOwp9Cn0KJGNvbXBvc2VySnNvbi0+d3JpdGUoJGNvbXBvc2VyRGVmaW5pdGlvbik7Cn0KCiRjaGFuZ2VDb3VudCA9IGFycmF5X3N1bShhcnJheV9tYXAoJ2NvdW50JywgJHVwZGF0ZXMpKTsKaWYgKCRjaGFuZ2VDb3VudCA+IDApIHsKaWYgKCRkcnlSdW4pIHsKJGlvLT53cml0ZSgnPGluZm8+JyAuICRjb21wb3Nlckpzb25QYXRoIC4gJyB3b3VsZCBiZSB1cGRhdGVkIHdpdGg6PC9pbmZvPicpOwpmb3JlYWNoICgkdXBkYXRlcyBhcyAkcmVxdWlyZVR5cGUgPT4gJHBhY2thZ2VzKSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSA9PiAkdmVyc2lvbikgewokaW8tPndyaXRlKHNwcmludGYoJzxpbmZvPiAtICVzLiVzOiAlczwvaW5mbz4nLCAkcmVxdWlyZVR5cGUsICRwYWNrYWdlLCAkdmVyc2lvbikpOwp9Cn0KfSBlbHNlIHsKJGlvLT53cml0ZSgnPGluZm8+JyAuICRjb21wb3Nlckpzb25QYXRoIC4gJyBoYXMgYmVlbiB1cGRhdGVkICgnIC4gJGNoYW5nZUNvdW50IC4gJyBjaGFuZ2VzKS48L2luZm8+Jyk7Cn0KfSBlbHNlIHsKJGlvLT53cml0ZSgnPGluZm8+Tm8gcmVxdWlyZW1lbnRzIHRvIHVwZGF0ZSBpbiAnLiRjb21wb3Nlckpzb25QYXRoLicuPC9pbmZvPicpOwp9CgppZiAoISRkcnlSdW4gJiYgJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+aXNMb2NrZWQoKSAmJiAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2xvY2snKSAmJiAkY2hhbmdlQ291bnQgPiAwKSB7CiRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPnVwZGF0ZUhhc2goJGNvbXBvc2VySnNvbik7Cn0KCmlmICgkZHJ5UnVuICYmICRjaGFuZ2VDb3VudCA+IDApIHsKcmV0dXJuIHNlbGY6OkVSUk9SX0dFTkVSSUM7Cn0KCnJldHVybiAwOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZUZpbGVDbGVhbmx5KEpzb25GaWxlICRqc29uLCBhcnJheSAkdXBkYXRlcyk6IGJvb2wKewokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkanNvbi0+Z2V0UGF0aCgpKTsKaWYgKGZhbHNlID09PSAkY29udGVudHMpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gcmVhZCAnLiRqc29uLT5nZXRQYXRoKCkuJyBjb250ZW50cy4nKTsKfQoKJG1hbmlwdWxhdG9yID0gbmV3IEpzb25NYW5pcHVsYXRvcigkY29udGVudHMpOwoKZm9yZWFjaCAoJHVwZGF0ZXMgYXMgJGtleSA9PiAkcGFja2FnZXMpIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlID0+ICR2ZXJzaW9uKSB7CmlmICghJG1hbmlwdWxhdG9yLT5hZGRMaW5rKCRrZXksICRwYWNrYWdlLCAkdmVyc2lvbikpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KfQoKaWYgKGZhbHNlID09PSBmaWxlX3B1dF9jb250ZW50cygkanNvbi0+Z2V0UGF0aCgpLCAkbWFuaXB1bGF0b3ItPmdldENvbnRlbnRzKCkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIHdyaXRlIG5ldyAnLiRqc29uLT5nZXRQYXRoKCkuJyBjb250ZW50cy4nKTsKfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKCmNsYXNzIENoZWNrUGxhdGZvcm1SZXFzQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMtPnNldE5hbWUoJ2NoZWNrLXBsYXRmb3JtLXJlcXMnKQotPnNldERlc2NyaXB0aW9uKCdDaGVjayB0aGF0IHBsYXRmb3JtIHJlcXVpcmVtZW50cyBhcmUgc2F0aXNmaWVkJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIGNoZWNraW5nIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzIHJlcXVpcmVtZW50cy4nKSwKbmV3IElucHV0T3B0aW9uKCdsb2NrJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdDaGVja3MgcmVxdWlyZW1lbnRzIG9ubHkgZnJvbSB0aGUgbG9jayBmaWxlLCBub3QgZnJvbSBpbnN0YWxsZWQgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JtYXQgb2YgdGhlIG91dHB1dDogdGV4dCBvciBqc29uJywgJ3RleHQnLCBbJ2pzb24nLCAndGV4dCddKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKQ2hlY2tzIHRoYXQgeW91ciBQSFAgYW5kIGV4dGVuc2lvbnMgdmVyc2lvbnMgbWF0Y2ggdGhlIHBsYXRmb3JtIHJlcXVpcmVtZW50cyBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2VzLgoKVW5saWtlIHVwZGF0ZS9pbnN0YWxsLCB0aGlzIGNvbW1hbmQgd2lsbCBpZ25vcmUgY29uZmlnLnBsYXRmb3JtIHNldHRpbmdzIGFuZCBjaGVjayB0aGUgcmVhbCBwbGF0Zm9ybSBwYWNrYWdlcyBzbyB5b3UgY2FuIGJlIGNlcnRhaW4geW91IGhhdmUgdGhlIHJlcXVpcmVkIHBsYXRmb3JtIGRlcGVuZGVuY2llcy4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIGNoZWNrLXBsYXRmb3JtLXJlcXM8L2luZm8+CgpFT1QKKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiRyZXF1aXJlcyA9IFtdOwokcmVtb3ZlUGFja2FnZXMgPSBbXTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsb2NrJykpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzxpbmZvPkNoZWNraW5nICcuKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSA/ICdub24tZGV2ICcgOiAnJykuJ3BsYXRmb3JtIHJlcXVpcmVtZW50cyB1c2luZyB0aGUgbG9jayBmaWxlPC9pbmZvPicpOwokaW5zdGFsbGVkUmVwbyA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmdldExvY2tlZFJlcG9zaXRvcnkoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSk7Cn0gZWxzZSB7CiRpbnN0YWxsZWRSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKCmlmICghJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCkpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzx3YXJuaW5nPk5vIHZlbmRvciBkaXIgcHJlc2VudCwgY2hlY2tpbmcgJy4oJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpID8gJ25vbi1kZXYgJyA6ICcnKS4ncGxhdGZvcm0gcmVxdWlyZW1lbnRzIGZyb20gdGhlIGxvY2sgZmlsZTwvd2FybmluZz4nKTsKJGluc3RhbGxlZFJlcG8gPSAkY29tcG9zZXItPmdldExvY2tlcigpLT5nZXRMb2NrZWRSZXBvc2l0b3J5KCEkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpOwp9IGVsc2UgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKSB7CiRyZW1vdmVQYWNrYWdlcyA9ICRpbnN0YWxsZWRSZXBvLT5nZXREZXZQYWNrYWdlTmFtZXMoKTsKfQoKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzxpbmZvPkNoZWNraW5nICcuKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSA/ICdub24tZGV2ICcgOiAnJykuJ3BsYXRmb3JtIHJlcXVpcmVtZW50cyBmb3IgcGFja2FnZXMgaW4gdGhlIHZlbmRvciBkaXI8L2luZm8+Jyk7Cn0KfQppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewpmb3JlYWNoICgkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0RGV2UmVxdWlyZXMoKSBhcyAkcmVxdWlyZSA9PiAkbGluaykgewokcmVxdWlyZXNbJHJlcXVpcmVdID0gWyRsaW5rXTsKfQp9CgokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskaW5zdGFsbGVkUmVwbywgbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeShjbG9uZSAkY29tcG9zZXItPmdldFBhY2thZ2UoKSldKTsKZm9yZWFjaCAoJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKGluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICRyZW1vdmVQYWNrYWdlcywgdHJ1ZSkpIHsKY29udGludWU7Cn0KZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJHJlcXVpcmUgPT4gJGxpbmspIHsKJHJlcXVpcmVzWyRyZXF1aXJlXVtdID0gJGxpbms7Cn0KfQoKa3NvcnQoJHJlcXVpcmVzKTsKCiRpbnN0YWxsZWRSZXBvLT5hZGRSZXBvc2l0b3J5KG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sIFtdKSk7CgokcmVzdWx0cyA9IFtdOwokZXhpdENvZGUgPSAwOwoKCgoKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXF1aXJlID0+ICRsaW5rcykgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVxdWlyZSkpIHsKJGNhbmRpZGF0ZXMgPSAkaW5zdGFsbGVkUmVwby0+ZmluZFBhY2thZ2VzV2l0aFJlcGxhY2Vyc0FuZFByb3ZpZGVycygkcmVxdWlyZSk7CmlmICgkY2FuZGlkYXRlcykgewokcmVxUmVzdWx0cyA9IFtdOwpmb3JlYWNoICgkY2FuZGlkYXRlcyBhcyAkY2FuZGlkYXRlKSB7CiRjYW5kaWRhdGVDb25zdHJhaW50ID0gbnVsbDsKaWYgKCRjYW5kaWRhdGUtPmdldE5hbWUoKSA9PT0gJHJlcXVpcmUpIHsKJGNhbmRpZGF0ZUNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPScsICRjYW5kaWRhdGUtPmdldFZlcnNpb24oKSk7CiRjYW5kaWRhdGVDb25zdHJhaW50LT5zZXRQcmV0dHlTdHJpbmcoJGNhbmRpZGF0ZS0+Z2V0UHJldHR5VmVyc2lvbigpKTsKfSBlbHNlIHsKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGNhbmRpZGF0ZS0+Z2V0UHJvdmlkZXMoKSwgJGNhbmRpZGF0ZS0+Z2V0UmVwbGFjZXMoKSkgYXMgJGxpbmspIHsKaWYgKCRsaW5rLT5nZXRUYXJnZXQoKSA9PT0gJHJlcXVpcmUpIHsKJGNhbmRpZGF0ZUNvbnN0cmFpbnQgPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwpicmVhazsKfQp9Cn0KCgppZiAoISRjYW5kaWRhdGVDb25zdHJhaW50KSB7CmNvbnRpbnVlOwp9Cgpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKaWYgKCEkbGluay0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKCRjYW5kaWRhdGVDb25zdHJhaW50KSkgewokcmVxUmVzdWx0c1tdID0gWwokY2FuZGlkYXRlLT5nZXROYW1lKCkgPT09ICRyZXF1aXJlID8gJGNhbmRpZGF0ZS0+Z2V0UHJldHR5TmFtZSgpIDogJHJlcXVpcmUsCiRjYW5kaWRhdGVDb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSwKJGxpbmssCic8ZXJyb3I+ZmFpbGVkPC9lcnJvcj4nLAokY2FuZGlkYXRlLT5nZXROYW1lKCkgPT09ICRyZXF1aXJlID8gJycgOiAnPGNvbW1lbnQ+cHJvdmlkZWQgYnkgJy4kY2FuZGlkYXRlLT5nZXRQcmV0dHlOYW1lKCkuJzwvY29tbWVudD4nLApdOwoKCmNvbnRpbnVlIDI7Cn0KfQoKJHJlc3VsdHNbXSA9IFsKJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpID09PSAkcmVxdWlyZSA/ICRjYW5kaWRhdGUtPmdldFByZXR0eU5hbWUoKSA6ICRyZXF1aXJlLAokY2FuZGlkYXRlQ29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCksCm51bGwsCic8aW5mbz5zdWNjZXNzPC9pbmZvPicsCiRjYW5kaWRhdGUtPmdldE5hbWUoKSA9PT0gJHJlcXVpcmUgPyAnJyA6ICc8Y29tbWVudD5wcm92aWRlZCBieSAnLiRjYW5kaWRhdGUtPmdldFByZXR0eU5hbWUoKS4nPC9jb21tZW50PicsCl07CgoKY29udGludWUgMjsKfQoKCiRyZXN1bHRzID0gYXJyYXlfbWVyZ2UoJHJlc3VsdHMsICRyZXFSZXN1bHRzKTsKJGV4aXRDb2RlID0gbWF4KCRleGl0Q29kZSwgMSk7Cgpjb250aW51ZTsKfQoKJHJlc3VsdHNbXSA9IFsKJHJlcXVpcmUsCiduL2EnLAokbGlua3NbMF0sCic8ZXJyb3I+bWlzc2luZzwvZXJyb3I+JywKJycsCl07CgokZXhpdENvZGUgPSBtYXgoJGV4aXRDb2RlLCAyKTsKfQp9CgokdGhpcy0+cHJpbnRUYWJsZSgkb3V0cHV0LCAkcmVzdWx0cywgJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpKTsKCnJldHVybiAkZXhpdENvZGU7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcmludFRhYmxlKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBhcnJheSAkcmVzdWx0cywgc3RyaW5nICRmb3JtYXQpOiB2b2lkCnsKJHJvd3MgPSBbXTsKZm9yZWFjaCAoJHJlc3VsdHMgYXMgJHJlc3VsdCkgewoKCgpbJHBsYXRmb3JtUGFja2FnZSwgJHZlcnNpb24sICRsaW5rLCAkc3RhdHVzLCAkcHJvdmlkZXJdID0gJHJlc3VsdDsKCmlmICgnanNvbicgPT09ICRmb3JtYXQpIHsKJHJvd3NbXSA9IFsKIm5hbWUiID0+ICRwbGF0Zm9ybVBhY2thZ2UsCiJ2ZXJzaW9uIiA9PiAkdmVyc2lvbiwKInN0YXR1cyIgPT4gc3RyaXBfdGFncygkc3RhdHVzKSwKImZhaWxlZF9yZXF1aXJlbWVudCIgPT4gJGxpbmsgaW5zdGFuY2VvZiBMaW5rID8gWwonc291cmNlJyA9PiAkbGluay0+Z2V0U291cmNlKCksCid0eXBlJyA9PiAkbGluay0+Z2V0RGVzY3JpcHRpb24oKSwKJ3RhcmdldCcgPT4gJGxpbmstPmdldFRhcmdldCgpLAonY29uc3RyYWludCcgPT4gJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSwKXSA6IG51bGwsCiJwcm92aWRlciIgPT4gJHByb3ZpZGVyID09PSAnJyA/IG51bGwgOiBzdHJpcF90YWdzKCRwcm92aWRlciksCl07Cn0gZWxzZSB7CiRyb3dzW10gPSBbCiRwbGF0Zm9ybVBhY2thZ2UsCiR2ZXJzaW9uLAokbGluaywKJGxpbmsgPyBzcHJpbnRmKCclcyAlcyAlcyAoJXMpJywgJGxpbmstPmdldFNvdXJjZSgpLCAkbGluay0+Z2V0RGVzY3JpcHRpb24oKSwgJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpKSA6ICcnLApydHJpbSgkc3RhdHVzLicgJy4kcHJvdmlkZXIpLApdOwp9Cn0KCmlmICgnanNvbicgPT09ICRmb3JtYXQpIHsKJHRoaXMtPmdldElPKCktPndyaXRlKEpzb25GaWxlOjplbmNvZGUoJHJvd3MpKTsKfSBlbHNlIHsKJHRoaXMtPnJlbmRlclRhYmxlKCRyb3dzLCAkb3V0cHV0KTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBDbGVhckNhY2hlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdjbGVhci1jYWNoZScpCi0+c2V0QWxpYXNlcyhbJ2NsZWFyY2FjaGUnLCAnY2MnXSkKLT5zZXREZXNjcmlwdGlvbignQ2xlYXJzIGNvbXBvc2VyXCdzIGludGVybmFsIHBhY2thZ2UgY2FjaGUnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ2djJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPbmx5IHJ1biBnYXJiYWdlIGNvbGxlY3Rpb24sIG5vdCBhIGZ1bGwgY2FjaGUgY2xlYXInKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPmNsZWFyLWNhY2hlPC9pbmZvPiBkZWxldGVzIGFsbCBjYWNoZWQgcGFja2FnZXMgZnJvbSBjb21wb3NlcidzCmNhY2hlIGRpcmVjdG9yeS4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2NsZWFyLWNhY2hlLWNsZWFyY2FjaGUtY2MKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCk7CmlmICgkY29tcG9zZXIgIT09IG51bGwpIHsKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7Cn0gZWxzZSB7CiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoKTsKfQoKJGlvID0gJHRoaXMtPmdldElPKCk7CgokY2FjaGVQYXRocyA9IFsKJ2NhY2hlLXZjcy1kaXInID0+ICRjb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpLAonY2FjaGUtcmVwby1kaXInID0+ICRjb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKSwKJ2NhY2hlLWZpbGVzLWRpcicgPT4gJGNvbmZpZy0+Z2V0KCdjYWNoZS1maWxlcy1kaXInKSwKJ2NhY2hlLWRpcicgPT4gJGNvbmZpZy0+Z2V0KCdjYWNoZS1kaXInKSwKXTsKCmZvcmVhY2ggKCRjYWNoZVBhdGhzIGFzICRrZXkgPT4gJGNhY2hlUGF0aCkgewoKaWYgKCRrZXkgPT09ICdjYWNoZS1kaXInICYmICRpbnB1dC0+Z2V0T3B0aW9uKCdnYycpKSB7CmNvbnRpbnVlOwp9CgokY2FjaGVQYXRoID0gcmVhbHBhdGgoJGNhY2hlUGF0aCk7CmlmICghJGNhY2hlUGF0aCkgewokaW8tPndyaXRlRXJyb3IoIjxpbmZvPkNhY2hlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCAoJGtleSk6ICRjYWNoZVBhdGg8L2luZm8+Iik7Cgpjb250aW51ZTsKfQokY2FjaGUgPSBuZXcgQ2FjaGUoJGlvLCAkY2FjaGVQYXRoKTsKJGNhY2hlLT5zZXRSZWFkT25seSgkY29uZmlnLT5nZXQoJ2NhY2hlLXJlYWQtb25seScpKTsKaWYgKCEkY2FjaGUtPmlzRW5hYmxlZCgpKSB7CiRpby0+d3JpdGVFcnJvcigiPGluZm8+Q2FjaGUgaXMgbm90IGVuYWJsZWQgKCRrZXkpOiAkY2FjaGVQYXRoPC9pbmZvPiIpOwoKY29udGludWU7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignZ2MnKSkgewokaW8tPndyaXRlRXJyb3IoIjxpbmZvPkdhcmJhZ2UtY29sbGVjdGluZyBjYWNoZSAoJGtleSk6ICRjYWNoZVBhdGg8L2luZm8+Iik7CmlmICgka2V5ID09PSAnY2FjaGUtZmlsZXMtZGlyJykgewokY2FjaGUtPmdjKCRjb25maWctPmdldCgnY2FjaGUtZmlsZXMtdHRsJyksICRjb25maWctPmdldCgnY2FjaGUtZmlsZXMtbWF4c2l6ZScpKTsKfSBlbHNlaWYgKCRrZXkgPT09ICdjYWNoZS1yZXBvLWRpcicpIHsKJGNhY2hlLT5nYygkY29uZmlnLT5nZXQoJ2NhY2hlLXR0bCcpLCAxMDI0ICogMTAyNCAqIDEwMjQgKTsKfSBlbHNlaWYgKCRrZXkgPT09ICdjYWNoZS12Y3MtZGlyJykgewokY2FjaGUtPmdjVmNzQ2FjaGUoJGNvbmZpZy0+Z2V0KCdjYWNoZS10dGwnKSk7Cn0KfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCI8aW5mbz5DbGVhcmluZyBjYWNoZSAoJGtleSk6ICRjYWNoZVBhdGg8L2luZm8+Iik7CiRjYWNoZS0+Y2xlYXIoKTsKfQp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2djJykpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5BbGwgY2FjaGVzIGdhcmJhZ2UtY29sbGVjdGVkLjwvaW5mbz4nKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5BbGwgY2FjaGVzIGNsZWFyZWQuPC9pbmZvPicpOwp9CgpyZXR1cm4gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0OwoKCgoKCgp0cmFpdCBDb21wbGV0aW9uVHJhaXQKewoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVxdWlyZUNvbXBvc2VyKD9ib29sICRkaXNhYmxlUGx1Z2lucyA9IG51bGwsID9ib29sICRkaXNhYmxlU2NyaXB0cyA9IG51bGwpOiBDb21wb3NlcjsKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0UHJlZmVySW5zdGFsbCgpOiBhcnJheQp7CnJldHVybiBbJ2Rpc3QnLCAnc291cmNlJywgJ2F1dG8nXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0Um9vdFJlcXVpcmVtZW50KCk6IFxDbG9zdXJlCnsKcmV0dXJuIGZ1bmN0aW9uIChDb21wbGV0aW9uSW5wdXQgJGlucHV0KTogYXJyYXkgewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgpyZXR1cm4gYXJyYXlfbWVyZ2UoYXJyYXlfa2V5cygkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0UmVxdWlyZXMoKSksIGFycmF5X2tleXMoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldERldlJlcXVpcmVzKCkpKTsKfTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0SW5zdGFsbGVkUGFja2FnZShib29sICRpbmNsdWRlUm9vdFBhY2thZ2UgPSB0cnVlLCBib29sICRpbmNsdWRlUGxhdGZvcm1QYWNrYWdlcyA9IGZhbHNlKTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpIHVzZSAoJGluY2x1ZGVSb290UGFja2FnZSwgJGluY2x1ZGVQbGF0Zm9ybVBhY2thZ2VzKTogYXJyYXkgewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CiRpbnN0YWxsZWRSZXBvcyA9IFtdOwoKaWYgKCRpbmNsdWRlUm9vdFBhY2thZ2UpIHsKJGluc3RhbGxlZFJlcG9zW10gPSBuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KGNsb25lICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpKTsKfQoKJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CmlmICgkbG9ja2VyLT5pc0xvY2tlZCgpKSB7CiRpbnN0YWxsZWRSZXBvc1tdID0gJGxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSh0cnVlKTsKfSBlbHNlIHsKJGluc3RhbGxlZFJlcG9zW10gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwp9CgokcGxhdGZvcm1IaW50ID0gW107CmlmICgkaW5jbHVkZVBsYXRmb3JtUGFja2FnZXMpIHsKaWYgKCRsb2NrZXItPmlzTG9ja2VkKCkpIHsKJHBsYXRmb3JtUmVwbyA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRsb2NrZXItPmdldFBsYXRmb3JtT3ZlcnJpZGVzKCkpOwp9IGVsc2UgewokcGxhdGZvcm1SZXBvID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdwbGF0Zm9ybScpKTsKfQppZiAoJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSA9PT0gJycpIHsKCiRoaW50c1RvRmluZCA9IFsnZXh0LScgPT4gMCwgJ2xpYi0nID0+IDAsICdwaHAnID0+IDk5LCAnY29tcG9zZXInID0+IDk5XTsKZm9yZWFjaCAoJHBsYXRmb3JtUmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGtnKSB7CmZvcmVhY2ggKCRoaW50c1RvRmluZCBhcyAkaGludFByZWZpeCA9PiAkaGludENvdW50KSB7CmlmIChzdHJfc3RhcnRzX3dpdGgoJHBrZy0+Z2V0TmFtZSgpLCAkaGludFByZWZpeCkpIHsKaWYgKCRoaW50Q291bnQgPT09IDAgfHwgJGhpbnRDb3VudCA+PSA5OSkgewokcGxhdGZvcm1IaW50W10gPSAkcGtnLT5nZXROYW1lKCk7CiRoaW50c1RvRmluZFskaGludFByZWZpeF0rKzsKfSBlbHNlaWYgKCRoaW50Q291bnQgPT09IDEpIHsKdW5zZXQoJGhpbnRzVG9GaW5kWyRoaW50UHJlZml4XSk7CiRwbGF0Zm9ybUhpbnRbXSA9IHN1YnN0cigkcGtnLT5nZXROYW1lKCksIDAsIG1heChzdHJsZW4oJHBrZy0+Z2V0TmFtZSgpKSAtIDMsIHN0cmxlbigkaGludFByZWZpeCkgKyAxKSkuJy4uLic7Cn0KY29udGludWUgMjsKfQp9Cn0KfSBlbHNlIHsKJGluc3RhbGxlZFJlcG9zW10gPSAkcGxhdGZvcm1SZXBvOwp9Cn0KCiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoJGluc3RhbGxlZFJlcG9zKTsKCnJldHVybiBhcnJheV9tZXJnZSgKYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkgewpyZXR1cm4gJHBhY2thZ2UtPmdldE5hbWUoKTsKfSwgJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCkpLAokcGxhdGZvcm1IaW50Cik7Cn07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc3VnZ2VzdEluc3RhbGxlZFBhY2thZ2VUeXBlcyhib29sICRpbmNsdWRlUm9vdFBhY2thZ2UgPSB0cnVlKTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpIHVzZSAoJGluY2x1ZGVSb290UGFja2FnZSk6IGFycmF5IHsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokaW5zdGFsbGVkUmVwb3MgPSBbXTsKCmlmICgkaW5jbHVkZVJvb3RQYWNrYWdlKSB7CiRpbnN0YWxsZWRSZXBvc1tdID0gbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeShjbG9uZSAkY29tcG9zZXItPmdldFBhY2thZ2UoKSk7Cn0KCiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSkgewokaW5zdGFsbGVkUmVwb3NbXSA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSk7Cn0gZWxzZSB7CiRpbnN0YWxsZWRSZXBvc1tdID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKfQoKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeSgkaW5zdGFsbGVkUmVwb3MpOwoKcmV0dXJuIGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoCmFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpIHsKcmV0dXJuICRwYWNrYWdlLT5nZXRUeXBlKCk7Cn0sICRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpKQopKTsKfTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0QXZhaWxhYmxlUGFja2FnZShpbnQgJG1heCA9IDk5KTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpIHVzZSAoJG1heCk6IGFycmF5IHsKaWYgKCRtYXggPCAxKSB7CnJldHVybiBbXTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokcmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpKTsKCiRyZXN1bHRzID0gW107CiRzaG93VmVuZG9ycyA9IGZhbHNlOwppZiAoIXN0cl9jb250YWlucygkaW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpLCAnLycpKSB7CiRyZXN1bHRzID0gJHJlcG9zLT5zZWFyY2goJ14nIC4gcHJlZ19xdW90ZSgkaW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpKSwgUmVwb3NpdG9yeUludGVyZmFjZTo6U0VBUkNIX1ZFTkRPUik7CiRzaG93VmVuZG9ycyA9IHRydWU7Cn0KCgppZiAoXGNvdW50KCRyZXN1bHRzKSA8PSAxKSB7CiRyZXN1bHRzID0gJHJlcG9zLT5zZWFyY2goJ14nLnByZWdfcXVvdGUoJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSksIFJlcG9zaXRvcnlJbnRlcmZhY2U6OlNFQVJDSF9OQU1FKTsKJHNob3dWZW5kb3JzID0gZmFsc2U7Cn0KCiRyZXN1bHRzID0gYXJyYXlfY29sdW1uKCRyZXN1bHRzLCAnbmFtZScpOwoKaWYgKCRzaG93VmVuZG9ycykgewokcmVzdWx0cyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkbmFtZSk6IHN0cmluZyB7CnJldHVybiAkbmFtZS4nLyc7Cn0sICRyZXN1bHRzKTsKCgp1c29ydCgkcmVzdWx0cywgc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJGEsIHN0cmluZyAkYikgewokbGVuQSA9IFxzdHJsZW4oJGEpOwokbGVuQiA9IFxzdHJsZW4oJGIpOwppZiAoJGxlbkEgPT09ICRsZW5CKSB7CnJldHVybiAkYSA8PT4gJGI7Cn0KCnJldHVybiAkbGVuQSAtICRsZW5COwp9KTsKCiRwaW5uZWQgPSBbXTsKCgokY29tcGxldGlvbklucHV0ID0gJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKS4nLyc7CmlmIChmYWxzZSAhPT0gKCRleGFjdEluZGV4ID0gYXJyYXlfc2VhcmNoKCRjb21wbGV0aW9uSW5wdXQsICRyZXN1bHRzLCB0cnVlKSkpIHsKJHBpbm5lZFtdID0gJGNvbXBsZXRpb25JbnB1dDsKYXJyYXlfc3BsaWNlKCRyZXN1bHRzLCAkZXhhY3RJbmRleCwgMSk7Cn0KCnJldHVybiBhcnJheV9tZXJnZSgkcGlubmVkLCBhcnJheV9zbGljZSgkcmVzdWx0cywgMCwgJG1heCAtIFxjb3VudCgkcGlubmVkKSkpOwp9CgpyZXR1cm4gYXJyYXlfc2xpY2UoJHJlc3VsdHMsIDAsICRtYXgpOwp9Owp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0QXZhaWxhYmxlUGFja2FnZUluY2xQbGF0Zm9ybSgpOiBcQ2xvc3VyZQp7CnJldHVybiBmdW5jdGlvbiAoQ29tcGxldGlvbklucHV0ICRpbnB1dCk6IGFycmF5IHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teKGV4dHxsaWJ8cGhwKSgtfCQpfF5jb219JywgJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSkpIHsKJG1hdGNoZXMgPSAkdGhpcy0+c3VnZ2VzdFBsYXRmb3JtUGFja2FnZSgpKCRpbnB1dCk7Cn0gZWxzZSB7CiRtYXRjaGVzID0gW107Cn0KCnJldHVybiBhcnJheV9tZXJnZSgkbWF0Y2hlcywgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlKDk5IC0gXGNvdW50KCRtYXRjaGVzKSkoJGlucHV0KSk7Cn07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc3VnZ2VzdFBsYXRmb3JtUGFja2FnZSgpOiBcQ2xvc3VyZQp7CnJldHVybiBmdW5jdGlvbiAoQ29tcGxldGlvbklucHV0ICRpbnB1dCk6IGFycmF5IHsKJHJlcG9zID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpLT5nZXRDb25maWcoKS0+Z2V0KCdwbGF0Zm9ybScpKTsKCiRwYXR0ZXJuID0gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKS4nKicpOwoKcmV0dXJuIGFycmF5X2ZpbHRlcihhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKSB7CnJldHVybiAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9LCAkcmVwb3MtPmdldFBhY2thZ2VzKCkpLCBzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkbmFtZSkgdXNlICgkcGF0dGVybik6IGJvb2wgewpyZXR1cm4gUHJlZzo6aXNNYXRjaCgkcGF0dGVybiwgJG5hbWUpOwp9KTsKfTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXENvbmZpZ1xKc29uQ29uZmlnU291cmNlOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKCgoKCgpjbGFzcyBDb25maWdDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewoKCgoKCnByb3RlY3RlZCBjb25zdCBDT05GSUdVUkFCTEVfUEFDS0FHRV9QUk9QRVJUSUVTID0gWwonbmFtZScsCid0eXBlJywKJ2Rlc2NyaXB0aW9uJywKJ2hvbWVwYWdlJywKJ3ZlcnNpb24nLAonbWluaW11bS1zdGFiaWxpdHknLAoncHJlZmVyLXN0YWJsZScsCidrZXl3b3JkcycsCidsaWNlbnNlJywKJ3JlcG9zaXRvcmllcycsCidzdWdnZXN0JywKJ2V4dHJhJywKXTsKCgoKCnByb3RlY3RlZCAkY29uZmlnOwoKCgoKcHJvdGVjdGVkICRjb25maWdGaWxlOwoKCgoKcHJvdGVjdGVkICRjb25maWdTb3VyY2U7CgoKCgpwcm90ZWN0ZWQgJGF1dGhDb25maWdGaWxlOwoKCgoKcHJvdGVjdGVkICRhdXRoQ29uZmlnU291cmNlOwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdjb25maWcnKQotPnNldERlc2NyaXB0aW9uKCdTZXRzIGNvbmZpZyBvcHRpb25zJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdnbG9iYWwnLCAnZycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXBwbHkgY29tbWFuZCB0byB0aGUgZ2xvYmFsIGNvbmZpZyBmaWxlJyksCm5ldyBJbnB1dE9wdGlvbignZWRpdG9yJywgJ2UnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wZW4gZWRpdG9yJyksCm5ldyBJbnB1dE9wdGlvbignYXV0aCcsICdhJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBZmZlY3QgYXV0aCBjb25maWcgZmlsZSAob25seSB1c2VkIGZvciAtLWVkaXRvciknKSwKbmV3IElucHV0T3B0aW9uKCd1bnNldCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVW5zZXQgdGhlIGdpdmVuIHNldHRpbmcta2V5JyksCm5ldyBJbnB1dE9wdGlvbignbGlzdCcsICdsJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MnKSwKbmV3IElucHV0T3B0aW9uKCdmaWxlJywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdJZiB5b3Ugd2FudCB0byBjaG9vc2UgYSBkaWZmZXJlbnQgY29tcG9zZXIuanNvbiBvciBjb25maWcuanNvbicpLApuZXcgSW5wdXRPcHRpb24oJ2Fic29sdXRlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXR1cm5zIGFic29sdXRlIHBhdGhzIHdoZW4gZmV0Y2hpbmcgKi1kaXIgY29uZmlnIHZhbHVlcyBpbnN0ZWFkIG9mIHJlbGF0aXZlJyksCm5ldyBJbnB1dE9wdGlvbignanNvbicsICdqJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdKU09OIGRlY29kZSB0aGUgc2V0dGluZyB2YWx1ZSwgdG8gYmUgdXNlZCB3aXRoIGV4dHJhLioga2V5cycpLApuZXcgSW5wdXRPcHRpb24oJ21lcmdlJywgJ20nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ01lcmdlIHRoZSBzZXR0aW5nIHZhbHVlIHdpdGggdGhlIGN1cnJlbnQgdmFsdWUsIHRvIGJlIHVzZWQgd2l0aCBleHRyYS4qIGtleXMgaW4gY29tYmluYXRpb24gd2l0aCAtLWpzb24nKSwKbmV3IElucHV0T3B0aW9uKCdhcHBlbmQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1doZW4gYWRkaW5nIGEgcmVwb3NpdG9yeSwgYXBwZW5kIGl0IChsb3dlc3QgcHJpb3JpdHkpIHRvIHRoZSBleGlzdGluZyBvbmVzIGluc3RlYWQgb2YgcHJlcGVuZGluZyBpdCAoaGlnaGVzdCBwcmlvcml0eSknKSwKbmV3IElucHV0T3B0aW9uKCdzb3VyY2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc3BsYXkgd2hlcmUgdGhlIGNvbmZpZyB2YWx1ZSBpcyBsb2FkZWQgZnJvbScpLApuZXcgSW5wdXRBcmd1bWVudCgnc2V0dGluZy1rZXknLCBudWxsLCAnU2V0dGluZyBrZXknLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFNldHRpbmdLZXlzKCkpLApuZXcgSW5wdXRBcmd1bWVudCgnc2V0dGluZy12YWx1ZScsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZLCAnU2V0dGluZyB2YWx1ZScpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGlzIGNvbW1hbmQgYWxsb3dzIHlvdSB0byBlZGl0IGNvbXBvc2VyIGNvbmZpZyBzZXR0aW5ncyBhbmQgcmVwb3NpdG9yaWVzCmluIGVpdGhlciB0aGUgbG9jYWwgY29tcG9zZXIuanNvbiBmaWxlIG9yIHRoZSBnbG9iYWwgY29uZmlnLmpzb24gZmlsZS4KCkFkZGl0aW9uYWxseSBpdCBsZXRzIHlvdSBlZGl0IG1vc3QgcHJvcGVydGllcyBpbiB0aGUgbG9jYWwgY29tcG9zZXIuanNvbi4KClRvIHNldCBhIGNvbmZpZyBzZXR0aW5nOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgYmluLWRpciBiaW4vPC9jb21tZW50PgoKVG8gcmVhZCBhIGNvbmZpZyBzZXR0aW5nOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgYmluLWRpcjwvY29tbWVudD4KICAgIE91dHB1dHM6IDxpbmZvPmJpbjwvaW5mbz4KClRvIGVkaXQgdGhlIGdsb2JhbCBjb25maWcuanNvbiBmaWxlOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgLS1nbG9iYWw8L2NvbW1lbnQ+CgpUbyBhZGQgYSByZXBvc2l0b3J5OgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgcmVwb3NpdG9yaWVzLmZvbyB2Y3MgaHR0cHM6Ly9iYXIuY29tPC9jb21tZW50PgoKVG8gcmVtb3ZlIGEgcmVwb3NpdG9yeSAocmVwbyBpcyBhIHNob3J0IGFsaWFzIGZvciByZXBvc2l0b3JpZXMpOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgLS11bnNldCByZXBvLmZvbzwvY29tbWVudD4KClRvIGRpc2FibGUgcGFja2FnaXN0OgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgcmVwby5wYWNrYWdpc3QgZmFsc2U8L2NvbW1lbnQ+CgpZb3UgY2FuIGFsdGVyIHJlcG9zaXRvcmllcyBpbiB0aGUgZ2xvYmFsIGNvbmZpZy5qc29uIGZpbGUgYnkgcGFzc2luZyBpbiB0aGUKPGluZm8+LS1nbG9iYWw8L2luZm8+IG9wdGlvbi4KClRvIGFkZCBvciBlZGl0IHN1Z2dlc3RlZCBwYWNrYWdlcyB5b3UgY2FuIHVzZToKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIHN1Z2dlc3QucGFja2FnZSByZWFzb24gZm9yIHRoZSBzdWdnZXN0aW9uPC9jb21tZW50PgoKVG8gYWRkIG9yIGVkaXQgZXh0cmEgcHJvcGVydGllcyB5b3UgY2FuIHVzZToKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIGV4dHJhLnByb3BlcnR5IHZhbHVlPC9jb21tZW50PgoKT3IgdG8gYWRkIGEgY29tcGxleCB2YWx1ZSB5b3UgY2FuIHVzZSBqc29uIHdpdGg6CgogICAgPGNvbW1lbnQ+JWNvbW1hbmQuZnVsbF9uYW1lJSBleHRyYS5wcm9wZXJ0eSAtLWpzb24gJ3siZm9vIjp0cnVlLCAiYmFyIjogW119JzwvY29tbWVudD4KClRvIGVkaXQgdGhlIGZpbGUgaW4gYW4gZXh0ZXJuYWwgZWRpdG9yOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgLS1lZGl0b3I8L2NvbW1lbnQ+CgpUbyBjaG9vc2UgeW91ciBlZGl0b3IgeW91IGNhbiBzZXQgdGhlICJFRElUT1IiIGVudiB2YXJpYWJsZS4KClRvIGdldCBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiB2YWx1ZXMgaW4gdGhlIGZpbGU6CgogICAgPGNvbW1lbnQ+JWNvbW1hbmQuZnVsbF9uYW1lJSAtLWxpc3Q8L2NvbW1lbnQ+CgpZb3UgY2FuIGFsd2F5cyBwYXNzIG1vcmUgdGhhbiBvbmUgb3B0aW9uLiBBcyBhbiBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBlZGl0IHRoZQpnbG9iYWwgY29uZmlnLmpzb24gZmlsZS4KCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIC0tZWRpdG9yIC0tZ2xvYmFsPC9jb21tZW50PgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjY29uZmlnCkVPVAopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewpwYXJlbnQ6OmluaXRpYWxpemUoJGlucHV0LCAkb3V0cHV0KTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignZ2xvYmFsJykgJiYgbnVsbCAhPT0gJGlucHV0LT5nZXRPcHRpb24oJ2ZpbGUnKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJy0tZmlsZSBhbmQgLS1nbG9iYWwgY2FuIG5vdCBiZSBjb21iaW5lZCcpOwp9CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJHRoaXMtPmNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygkaW8pOwoKJGNvbmZpZ0ZpbGUgPSAkdGhpcy0+Z2V0Q29tcG9zZXJDb25maWdGaWxlKCRpbnB1dCwgJHRoaXMtPmNvbmZpZyk7CgoKaWYgKAooJGNvbmZpZ0ZpbGUgPT09ICdjb21wb3Nlci5qc29uJyB8fCAkY29uZmlnRmlsZSA9PT0gJy4vY29tcG9zZXIuanNvbicpCiYmICFmaWxlX2V4aXN0cygkY29uZmlnRmlsZSkKJiYgcmVhbHBhdGgoUGxhdGZvcm06OmdldEN3ZCgpKSA9PT0gcmVhbHBhdGgoJHRoaXMtPmNvbmZpZy0+Z2V0KCdob21lJykpCikgewpmaWxlX3B1dF9jb250ZW50cygkY29uZmlnRmlsZSwgIntcbn1cbiIpOwp9CgokdGhpcy0+Y29uZmlnRmlsZSA9IG5ldyBKc29uRmlsZSgkY29uZmlnRmlsZSwgbnVsbCwgJGlvKTsKJHRoaXMtPmNvbmZpZ1NvdXJjZSA9IG5ldyBKc29uQ29uZmlnU291cmNlKCR0aGlzLT5jb25maWdGaWxlKTsKCiRhdXRoQ29uZmlnRmlsZSA9ICR0aGlzLT5nZXRBdXRoQ29uZmlnRmlsZSgkaW5wdXQsICR0aGlzLT5jb25maWcpOwoKJHRoaXMtPmF1dGhDb25maWdGaWxlID0gbmV3IEpzb25GaWxlKCRhdXRoQ29uZmlnRmlsZSwgbnVsbCwgJGlvKTsKJHRoaXMtPmF1dGhDb25maWdTb3VyY2UgPSBuZXcgSnNvbkNvbmZpZ1NvdXJjZSgkdGhpcy0+YXV0aENvbmZpZ0ZpbGUsIHRydWUpOwoKCmlmICgkaW5wdXQtPmdldE9wdGlvbignZ2xvYmFsJykgJiYgISR0aGlzLT5jb25maWdGaWxlLT5leGlzdHMoKSkgewp0b3VjaCgkdGhpcy0+Y29uZmlnRmlsZS0+Z2V0UGF0aCgpKTsKJHRoaXMtPmNvbmZpZ0ZpbGUtPndyaXRlKFsnY29uZmlnJyA9PiBuZXcgXEFycmF5T2JqZWN0XSk7ClNpbGVuY2VyOjpjYWxsKCdjaG1vZCcsICR0aGlzLT5jb25maWdGaWxlLT5nZXRQYXRoKCksIDA2MDApOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignZ2xvYmFsJykgJiYgISR0aGlzLT5hdXRoQ29uZmlnRmlsZS0+ZXhpc3RzKCkpIHsKdG91Y2goJHRoaXMtPmF1dGhDb25maWdGaWxlLT5nZXRQYXRoKCkpOwokdGhpcy0+YXV0aENvbmZpZ0ZpbGUtPndyaXRlKFsnYml0YnVja2V0LW9hdXRoJyA9PiBuZXcgXEFycmF5T2JqZWN0LCAnZ2l0aHViLW9hdXRoJyA9PiBuZXcgXEFycmF5T2JqZWN0LCAnZ2l0bGFiLW9hdXRoJyA9PiBuZXcgXEFycmF5T2JqZWN0LCAnZ2l0bGFiLXRva2VuJyA9PiBuZXcgXEFycmF5T2JqZWN0LCAnaHR0cC1iYXNpYycgPT4gbmV3IFxBcnJheU9iamVjdCwgJ2JlYXJlcicgPT4gbmV3IFxBcnJheU9iamVjdF0pOwpTaWxlbmNlcjo6Y2FsbCgnY2htb2QnLCAkdGhpcy0+YXV0aENvbmZpZ0ZpbGUtPmdldFBhdGgoKSwgMDYwMCk7Cn0KCmlmICghJHRoaXMtPmNvbmZpZ0ZpbGUtPmV4aXN0cygpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdGaWxlICIlcyIgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeScsICRjb25maWdGaWxlKSk7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CgppZiAodHJ1ZSA9PT0gJGlucHV0LT5nZXRPcHRpb24oJ2VkaXRvcicpKSB7CiRlZGl0b3IgPSBQbGF0Zm9ybTo6Z2V0RW52KCdFRElUT1InKTsKaWYgKGZhbHNlID09PSAkZWRpdG9yIHx8ICcnID09PSAkZWRpdG9yKSB7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJGVkaXRvciA9ICdub3RlcGFkJzsKfSBlbHNlIHsKZm9yZWFjaCAoWydlZGl0b3InLCAndmltJywgJ3ZpJywgJ25hbm8nLCAncGljbycsICdlZCddIGFzICRjYW5kaWRhdGUpIHsKaWYgKGV4ZWMoJ3doaWNoICcuJGNhbmRpZGF0ZSkpIHsKJGVkaXRvciA9ICRjYW5kaWRhdGU7CmJyZWFrOwp9Cn0KfQp9IGVsc2UgewokZWRpdG9yID0gZXNjYXBlc2hlbGxjbWQoJGVkaXRvcik7Cn0KCiRmaWxlID0gJGlucHV0LT5nZXRPcHRpb24oJ2F1dGgnKSA/ICR0aGlzLT5hdXRoQ29uZmlnRmlsZS0+Z2V0UGF0aCgpIDogJHRoaXMtPmNvbmZpZ0ZpbGUtPmdldFBhdGgoKTsKc3lzdGVtKCRlZGl0b3IgLiAnICcgLiAkZmlsZSAuIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgPyAnJyA6ICcgPiBgdHR5YCcpKTsKCnJldHVybiAwOwp9CgppZiAoZmFsc2UgPT09ICRpbnB1dC0+Z2V0T3B0aW9uKCdnbG9iYWwnKSkgewokdGhpcy0+Y29uZmlnLT5tZXJnZSgkdGhpcy0+Y29uZmlnRmlsZS0+cmVhZCgpLCAkdGhpcy0+Y29uZmlnRmlsZS0+Z2V0UGF0aCgpKTsKJHRoaXMtPmNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+ICR0aGlzLT5hdXRoQ29uZmlnRmlsZS0+ZXhpc3RzKCkgPyAkdGhpcy0+YXV0aENvbmZpZ0ZpbGUtPnJlYWQoKSA6IFtdXSwgJHRoaXMtPmF1dGhDb25maWdGaWxlLT5nZXRQYXRoKCkpOwp9CgokdGhpcy0+Z2V0SU8oKS0+bG9hZENvbmZpZ3VyYXRpb24oJHRoaXMtPmNvbmZpZyk7CgoKaWYgKHRydWUgPT09ICRpbnB1dC0+Z2V0T3B0aW9uKCdsaXN0JykpIHsKJHRoaXMtPmxpc3RDb25maWd1cmF0aW9uKCR0aGlzLT5jb25maWctPmFsbCgpLCAkdGhpcy0+Y29uZmlnLT5yYXcoKSwgJG91dHB1dCwgbnVsbCwgJGlucHV0LT5nZXRPcHRpb24oJ3NvdXJjZScpKTsKCnJldHVybiAwOwp9Cgokc2V0dGluZ0tleSA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3NldHRpbmcta2V5Jyk7CmlmICghaXNfc3RyaW5nKCRzZXR0aW5nS2V5KSkgewpyZXR1cm4gMDsKfQoKCmlmIChbXSAhPT0gJGlucHV0LT5nZXRBcmd1bWVudCgnc2V0dGluZy12YWx1ZScpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91IGNhbiBub3QgY29tYmluZSBhIHNldHRpbmcgdmFsdWUgd2l0aCAtLXVuc2V0Jyk7Cn0KCgppZiAoW10gPT09ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3NldHRpbmctdmFsdWUnKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHByb3BlcnRpZXMgPSBzZWxmOjpDT05GSUdVUkFCTEVfUEFDS0FHRV9QUk9QRVJUSUVTOwokcHJvcGVydGllc0RlZmF1bHRzID0gWwondHlwZScgPT4gJ2xpYnJhcnknLAonZGVzY3JpcHRpb24nID0+ICcnLAonaG9tZXBhZ2UnID0+ICcnLAonbWluaW11bS1zdGFiaWxpdHknID0+ICdzdGFibGUnLAoncHJlZmVyLXN0YWJsZScgPT4gZmFsc2UsCidrZXl3b3JkcycgPT4gW10sCidsaWNlbnNlJyA9PiBbXSwKJ3N1Z2dlc3QnID0+IFtdLAonZXh0cmEnID0+IFtdLApdOwokcmF3RGF0YSA9ICR0aGlzLT5jb25maWdGaWxlLT5yZWFkKCk7CiRkYXRhID0gJHRoaXMtPmNvbmZpZy0+YWxsKCk7CiRzb3VyY2UgPSAkdGhpcy0+Y29uZmlnLT5nZXRTb3VyY2VPZlZhbHVlKCRzZXR0aW5nS2V5KTsKCmlmIChQcmVnOjppc01hdGNoKCcvXnJlcG9zPyg/Oml0b3JpZXMpPyg/OlwuKC4rKSk/LycsICRzZXR0aW5nS2V5LCAkbWF0Y2hlcykpIHsKaWYgKCFpc3NldCgkbWF0Y2hlc1sxXSkpIHsKJHZhbHVlID0gJGRhdGFbJ3JlcG9zaXRvcmllcyddID8/IFtdOwp9IGVsc2UgewppZiAoIWlzc2V0KCRkYXRhWydyZXBvc2l0b3JpZXMnXVskbWF0Y2hlc1sxXV0pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGVyZSBpcyBubyAnLiRtYXRjaGVzWzFdLicgcmVwb3NpdG9yeSBkZWZpbmVkJyk7Cn0KCiR2YWx1ZSA9ICRkYXRhWydyZXBvc2l0b3JpZXMnXVskbWF0Y2hlc1sxXV07Cn0KfSBlbHNlaWYgKHN0cnBvcygkc2V0dGluZ0tleSwgJy4nKSkgewokYml0cyA9IGV4cGxvZGUoJy4nLCAkc2V0dGluZ0tleSk7CmlmICgkYml0c1swXSA9PT0gJ2V4dHJhJyB8fCAkYml0c1swXSA9PT0gJ3N1Z2dlc3QnKSB7CiRkYXRhID0gJHJhd0RhdGE7Cn0gZWxzZSB7CiRkYXRhID0gJGRhdGFbJ2NvbmZpZyddOwp9CiRtYXRjaCA9IGZhbHNlOwpmb3JlYWNoICgkYml0cyBhcyAkYml0KSB7CiRrZXkgPSBpc3NldCgka2V5KSA/ICRrZXkuJy4nLiRiaXQgOiAkYml0OwokbWF0Y2ggPSBmYWxzZTsKaWYgKGlzc2V0KCRkYXRhWyRrZXldKSkgewokbWF0Y2ggPSB0cnVlOwokZGF0YSA9ICRkYXRhWyRrZXldOwp1bnNldCgka2V5KTsKfQp9CgppZiAoISRtYXRjaCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJHNldHRpbmdLZXkuJyBpcyBub3QgZGVmaW5lZC4nKTsKfQoKJHZhbHVlID0gJGRhdGE7Cn0gZWxzZWlmIChpc3NldCgkZGF0YVsnY29uZmlnJ11bJHNldHRpbmdLZXldKSkgewokdmFsdWUgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJHNldHRpbmdLZXksICRpbnB1dC0+Z2V0T3B0aW9uKCdhYnNvbHV0ZScpID8gMCA6IENvbmZpZzo6UkVMQVRJVkVfUEFUSFMpOwoKaWYgKCR2YWx1ZSA9PT0gW10pIHsKJHNjaGVtYSA9IEpzb25GaWxlOjpwYXJzZUpzb24oKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoSnNvbkZpbGU6OkNPTVBPU0VSX1NDSEVNQV9QQVRIKSk7CmlmICgKaXNzZXQoJHNjaGVtYVsncHJvcGVydGllcyddWydjb25maWcnXVsncHJvcGVydGllcyddWyRzZXR0aW5nS2V5XVsndHlwZSddKQomJiBpbl9hcnJheSgnb2JqZWN0JywgKGFycmF5KSAkc2NoZW1hWydwcm9wZXJ0aWVzJ11bJ2NvbmZpZyddWydwcm9wZXJ0aWVzJ11bJHNldHRpbmdLZXldWyd0eXBlJ10sIHRydWUpCikgewokdmFsdWUgPSBuZXcgXHN0ZENsYXNzOwp9Cn0KfSBlbHNlaWYgKGlzc2V0KCRyYXdEYXRhWyRzZXR0aW5nS2V5XSkgJiYgaW5fYXJyYXkoJHNldHRpbmdLZXksICRwcm9wZXJ0aWVzLCB0cnVlKSkgewokdmFsdWUgPSAkcmF3RGF0YVskc2V0dGluZ0tleV07CiRzb3VyY2UgPSAkdGhpcy0+Y29uZmlnRmlsZS0+Z2V0UGF0aCgpOwp9IGVsc2VpZiAoaXNzZXQoJHByb3BlcnRpZXNEZWZhdWx0c1skc2V0dGluZ0tleV0pKSB7CiR2YWx1ZSA9ICRwcm9wZXJ0aWVzRGVmYXVsdHNbJHNldHRpbmdLZXldOwokc291cmNlID0gJ2RlZmF1bHRzJzsKfSBlbHNlIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRzZXR0aW5nS2V5LicgaXMgbm90IGRlZmluZWQnKTsKfQoKaWYgKGlzX2FycmF5KCR2YWx1ZSkgfHwgaXNfb2JqZWN0KCR2YWx1ZSkgfHwgaXNfYm9vbCgkdmFsdWUpKSB7CiR2YWx1ZSA9IEpzb25GaWxlOjplbmNvZGUoJHZhbHVlLCBKU09OX1VORVNDQVBFRF9TTEFTSEVTIHwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7Cn0KCiRzb3VyY2VPZkNvbmZpZ1ZhbHVlID0gJyc7CmlmICgkaW5wdXQtPmdldE9wdGlvbignc291cmNlJykpIHsKJHNvdXJjZU9mQ29uZmlnVmFsdWUgPSAnICgnIC4gJHNvdXJjZSAuICcpJzsKfQoKJHRoaXMtPmdldElPKCktPndyaXRlKCR2YWx1ZSAuICRzb3VyY2VPZkNvbmZpZ1ZhbHVlLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwoKcmV0dXJuIDA7Cn0KCiR2YWx1ZXMgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdzZXR0aW5nLXZhbHVlJyk7IAoKJGJvb2xlYW5WYWxpZGF0b3IgPSBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsndHJ1ZScsICdmYWxzZScsICcxJywgJzAnXSwgdHJ1ZSk7Cn07CiRib29sZWFuTm9ybWFsaXplciA9IHN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gJHZhbCAhPT0gJ2ZhbHNlJyAmJiAoYm9vbCkgJHZhbDsKfTsKCgokdW5pcXVlQ29uZmlnVmFsdWVzID0gWwoncHJvY2Vzcy10aW1lb3V0JyA9PiBbJ2lzX251bWVyaWMnLCAnaW50dmFsJ10sCid1c2UtaW5jbHVkZS1wYXRoJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCid1c2UtZ2l0aHViLWFwaScgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAoncHJlZmVycmVkLWluc3RhbGwnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ2F1dG8nLCAnc291cmNlJywgJ2Rpc3QnXSwgdHJ1ZSk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfSwKXSwKJ2dpdGxhYi1wcm90b2NvbCcgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsnZ2l0JywgJ2h0dHAnLCAnaHR0cHMnXSwgdHJ1ZSk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfSwKXSwKJ3N0b3JlLWF1dGhzJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaW5fYXJyYXkoJHZhbCwgWyd0cnVlJywgJ2ZhbHNlJywgJ3Byb21wdCddLCB0cnVlKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CmlmICgncHJvbXB0JyA9PT0gJHZhbCkgewpyZXR1cm4gJ3Byb21wdCc7Cn0KCnJldHVybiAkdmFsICE9PSAnZmFsc2UnICYmIChib29sKSAkdmFsOwp9LApdLAonbm90aWZ5LW9uLWluc3RhbGwnID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ3ZlbmRvci1kaXInID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2Jpbi1kaXInID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2FyY2hpdmUtZGlyJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidhcmNoaXZlLWZvcm1hdCcgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonZGF0YS1kaXInID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2NhY2hlLWRpcicgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonY2FjaGUtZmlsZXMtZGlyJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidjYWNoZS1yZXBvLWRpcicgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonY2FjaGUtdmNzLWRpcicgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonY2FjaGUtdHRsJyA9PiBbJ2lzX251bWVyaWMnLCAnaW50dmFsJ10sCidjYWNoZS1maWxlcy10dGwnID0+IFsnaXNfbnVtZXJpYycsICdpbnR2YWwnXSwKJ2NhY2hlLWZpbGVzLW1heHNpemUnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBQcmVnOjppc01hdGNoKCcvXlxzKihbMC05Ll0rKVxzKig/Oihba21nXSkoPzppP2IpPyk/XHMqJC9pJywgJHZhbCk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfSwKXSwKJ2Jpbi1jb21wYXQnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ2F1dG8nLCAnZnVsbCcsICdwcm94eScsICdzeW1saW5rJ10pOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn0sCl0sCidkaXNjYXJkLWNoYW5nZXMnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ3N0YXNoJywgJ3RydWUnLCAnZmFsc2UnLCAnMScsICcwJ10sIHRydWUpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKaWYgKCdzdGFzaCcgPT09ICR2YWwpIHsKcmV0dXJuICdzdGFzaCc7Cn0KCnJldHVybiAkdmFsICE9PSAnZmFsc2UnICYmIChib29sKSAkdmFsOwp9LApdLAonYXV0b2xvYWRlci1zdWZmaXgnID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsID09PSAnbnVsbCcgPyBudWxsIDogJHZhbDsKfV0sCidzb3J0LXBhY2thZ2VzJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidvcHRpbWl6ZS1hdXRvbG9hZGVyJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidjbGFzc21hcC1hdXRob3JpdGF0aXZlJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidhcGN1LWF1dG9sb2FkZXInID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ3ByZXBlbmQtYXV0b2xvYWRlcicgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonZGlzYWJsZS10bHMnID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ3NlY3VyZS1odHRwJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCididW1wLWFmdGVyLXVwZGF0ZScgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsnZGV2JywgJ25vLWRldicsICd0cnVlJywgJ2ZhbHNlJywgJzEnLCAnMCddLCB0cnVlKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CmlmICgnZGV2JyA9PT0gJHZhbCB8fCAnbm8tZGV2JyA9PT0gJHZhbCkgewpyZXR1cm4gJHZhbDsKfQoKcmV0dXJuICR2YWwgIT09ICdmYWxzZScgJiYgKGJvb2wpICR2YWw7Cn0sCl0sCidjYWZpbGUnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBmaWxlX2V4aXN0cygkdmFsKSAmJiBGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCR2YWwpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWwgPT09ICdudWxsJyA/IG51bGwgOiAkdmFsOwp9LApdLAonY2FwYXRoJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaXNfZGlyKCR2YWwpICYmIEZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJHZhbCk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbCA9PT0gJ251bGwnID8gbnVsbCA6ICR2YWw7Cn0sCl0sCidnaXRodWItZXhwb3NlLWhvc3RuYW1lJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidodGFjY2Vzcy1wcm90ZWN0JyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidsb2NrJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidhbGxvdy1wbHVnaW5zJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidwbGF0Zm9ybS1jaGVjaycgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsncGhwLW9ubHknLCAndHJ1ZScsICdmYWxzZScsICcxJywgJzAnXSwgdHJ1ZSk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewppZiAoJ3BocC1vbmx5JyA9PT0gJHZhbCkgewpyZXR1cm4gJ3BocC1vbmx5JzsKfQoKcmV0dXJuICR2YWwgIT09ICdmYWxzZScgJiYgKGJvb2wpICR2YWw7Cn0sCl0sCid1c2UtcGFyZW50LWRpcicgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsndHJ1ZScsICdmYWxzZScsICdwcm9tcHQnXSwgdHJ1ZSk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewppZiAoJ3Byb21wdCcgPT09ICR2YWwpIHsKcmV0dXJuICdwcm9tcHQnOwp9CgpyZXR1cm4gJHZhbCAhPT0gJ2ZhbHNlJyAmJiAoYm9vbCkgJHZhbDsKfSwKXSwKJ2F1ZGl0LmFiYW5kb25lZCcgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFtBdWRpdG9yOjpBQkFORE9ORURfSUdOT1JFLCBBdWRpdG9yOjpBQkFORE9ORURfUkVQT1JULCBBdWRpdG9yOjpBQkFORE9ORURfRkFJTF0sIHRydWUpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn0sCl0sCl07CiRtdWx0aUNvbmZpZ1ZhbHVlcyA9IFsKJ2dpdGh1Yi1wcm90b2NvbHMnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewppZiAoIWlzX2FycmF5KCR2YWxzKSkgewpyZXR1cm4gJ2FycmF5IGV4cGVjdGVkJzsKfQoKZm9yZWFjaCAoJHZhbHMgYXMgJHZhbCkgewppZiAoIWluX2FycmF5KCR2YWwsIFsnZ2l0JywgJ2h0dHBzJywgJ3NzaCddKSkgewpyZXR1cm4gJ3ZhbGlkIHByb3RvY29scyBpbmNsdWRlOiBnaXQsIGh0dHBzLCBzc2gnOwp9Cn0KCnJldHVybiB0cnVlOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CnJldHVybiAkdmFsczsKfSwKXSwKJ2dpdGh1Yi1kb21haW5zJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKaWYgKCFpc19hcnJheSgkdmFscykpIHsKcmV0dXJuICdhcnJheSBleHBlY3RlZCc7Cn0KCnJldHVybiB0cnVlOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CnJldHVybiAkdmFsczsKfSwKXSwKJ2dpdGxhYi1kb21haW5zJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKaWYgKCFpc19hcnJheSgkdmFscykpIHsKcmV0dXJuICdhcnJheSBleHBlY3RlZCc7Cn0KCnJldHVybiB0cnVlOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CnJldHVybiAkdmFsczsKfSwKXSwKJ2F1ZGl0Lmlnbm9yZScgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CmlmICghaXNfYXJyYXkoJHZhbHMpKSB7CnJldHVybiAnYXJyYXkgZXhwZWN0ZWQnOwp9CgpyZXR1cm4gdHJ1ZTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewpyZXR1cm4gJHZhbHM7Cn0sCl0sCl07CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpICYmICRzZXR0aW5nS2V5ID09PSAnYXVkaXQnKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZUNvbmZpZ1NldHRpbmcoJHNldHRpbmdLZXkpOwoKcmV0dXJuIDA7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSAmJiAoaXNzZXQoJHVuaXF1ZUNvbmZpZ1ZhbHVlc1skc2V0dGluZ0tleV0pIHx8IGlzc2V0KCRtdWx0aUNvbmZpZ1ZhbHVlc1skc2V0dGluZ0tleV0pKSkgewppZiAoJHNldHRpbmdLZXkgPT09ICdkaXNhYmxlLXRscycgJiYgJHRoaXMtPmNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCc8aW5mbz5Zb3UgYXJlIG5vdyBydW5uaW5nIENvbXBvc2VyIHdpdGggU1NML1RMUyBwcm90ZWN0aW9uIGVuYWJsZWQuPC9pbmZvPicpOwp9CgokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CmlmIChpc3NldCgkdW5pcXVlQ29uZmlnVmFsdWVzWyRzZXR0aW5nS2V5XSkpIHsKJHRoaXMtPmhhbmRsZVNpbmdsZVZhbHVlKCRzZXR0aW5nS2V5LCAkdW5pcXVlQ29uZmlnVmFsdWVzWyRzZXR0aW5nS2V5XSwgJHZhbHVlcywgJ2FkZENvbmZpZ1NldHRpbmcnKTsKCnJldHVybiAwOwp9CmlmIChpc3NldCgkbXVsdGlDb25maWdWYWx1ZXNbJHNldHRpbmdLZXldKSkgewokdGhpcy0+aGFuZGxlTXVsdGlWYWx1ZSgkc2V0dGluZ0tleSwgJG11bHRpQ29uZmlnVmFsdWVzWyRzZXR0aW5nS2V5XSwgJHZhbHVlcywgJ2FkZENvbmZpZ1NldHRpbmcnKTsKCnJldHVybiAwOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgnL15wcmVmZXJyZWQtaW5zdGFsbFwuKC4rKS8nLCAkc2V0dGluZ0tleSwgJG1hdGNoZXMpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CgpbJHZhbGlkYXRvcl0gPSAkdW5pcXVlQ29uZmlnVmFsdWVzWydwcmVmZXJyZWQtaW5zdGFsbCddOwppZiAoISR2YWxpZGF0b3IoJHZhbHVlc1swXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdJbnZhbGlkIHZhbHVlIGZvciAnLiRzZXR0aW5nS2V5LicuIFNob3VsZCBiZSBvbmUgb2Y6IGF1dG8sIHNvdXJjZSwgb3IgZGlzdCcpOwp9CgokdGhpcy0+Y29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5LCAkdmFsdWVzWzBdKTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJ3teYWxsb3ctcGx1Z2luc1wuKFthLXpBLVowLTkvKi1dKyl9JywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKaWYgKHRydWUgIT09ICRib29sZWFuVmFsaWRhdG9yKCR2YWx1ZXNbMF0pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKAonIiVzIiBpcyBhbiBpbnZhbGlkIHZhbHVlJywKJHZhbHVlc1swXQopKTsKfQoKJG5vcm1hbGl6ZWRWYWx1ZSA9ICRib29sZWFuTm9ybWFsaXplcigkdmFsdWVzWzBdKTsKCiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoJHNldHRpbmdLZXksICRub3JtYWxpemVkVmFsdWUpOwoKcmV0dXJuIDA7Cn0KCgokdW5pcXVlUHJvcHMgPSBbCiduYW1lJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCid0eXBlJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidkZXNjcmlwdGlvbicgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonaG9tZXBhZ2UnID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ3ZlcnNpb24nID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ21pbmltdW0tc3RhYmlsaXR5JyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaXNzZXQoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTW1ZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkdmFsKV0pOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBzdHJpbmcgewpyZXR1cm4gVmVyc2lvblBhcnNlcjo6bm9ybWFsaXplU3RhYmlsaXR5KCR2YWwpOwp9LApdLAoncHJlZmVyLXN0YWJsZScgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLApdOwokbXVsdGlQcm9wcyA9IFsKJ2tleXdvcmRzJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKaWYgKCFpc19hcnJheSgkdmFscykpIHsKcmV0dXJuICdhcnJheSBleHBlY3RlZCc7Cn0KCnJldHVybiB0cnVlOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CnJldHVybiAkdmFsczsKfSwKXSwKJ2xpY2Vuc2UnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewppZiAoIWlzX2FycmF5KCR2YWxzKSkgewpyZXR1cm4gJ2FycmF5IGV4cGVjdGVkJzsKfQoKcmV0dXJuIHRydWU7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKcmV0dXJuICR2YWxzOwp9LApdLApdOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdnbG9iYWwnKSAmJiAoaXNzZXQoJHVuaXF1ZVByb3BzWyRzZXR0aW5nS2V5XSkgfHwgaXNzZXQoJG11bHRpUHJvcHNbJHNldHRpbmdLZXldKSB8fCBzdHJwb3MoJHNldHRpbmdLZXksICdleHRyYS4nKSA9PT0gMCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSAnIC4gJHNldHRpbmdLZXkgLiAnIHByb3BlcnR5IGNhbiBub3QgYmUgc2V0IGluIHRoZSBnbG9iYWwgY29uZmlnLmpzb24gZmlsZS4gVXNlIGBjb21wb3NlciBnbG9iYWwgY29uZmlnYCB0byBhcHBseSBjaGFuZ2VzIHRvIHRoZSBnbG9iYWwgY29tcG9zZXIuanNvbicpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSAmJiAoaXNzZXQoJHVuaXF1ZVByb3BzWyRzZXR0aW5nS2V5XSkgfHwgaXNzZXQoJG11bHRpUHJvcHNbJHNldHRpbmdLZXldKSkpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlUHJvcGVydHkoJHNldHRpbmdLZXkpOwoKcmV0dXJuIDA7Cn0KaWYgKGlzc2V0KCR1bmlxdWVQcm9wc1skc2V0dGluZ0tleV0pKSB7CiR0aGlzLT5oYW5kbGVTaW5nbGVWYWx1ZSgkc2V0dGluZ0tleSwgJHVuaXF1ZVByb3BzWyRzZXR0aW5nS2V5XSwgJHZhbHVlcywgJ2FkZFByb3BlcnR5Jyk7CgpyZXR1cm4gMDsKfQppZiAoaXNzZXQoJG11bHRpUHJvcHNbJHNldHRpbmdLZXldKSkgewokdGhpcy0+aGFuZGxlTXVsdGlWYWx1ZSgkc2V0dGluZ0tleSwgJG11bHRpUHJvcHNbJHNldHRpbmdLZXldLCAkdmFsdWVzLCAnYWRkUHJvcGVydHknKTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9ecmVwb3M/KD86aXRvcmllcyk/XC4oLispLycsICRzZXR0aW5nS2V5LCAkbWF0Y2hlcykpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZVJlcG9zaXRvcnkoJG1hdGNoZXNbMV0pOwoKcmV0dXJuIDA7Cn0KCmlmICgyID09PSBjb3VudCgkdmFsdWVzKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5hZGRSZXBvc2l0b3J5KCRtYXRjaGVzWzFdLCBbCid0eXBlJyA9PiAkdmFsdWVzWzBdLAondXJsJyA9PiAkdmFsdWVzWzFdLApdLCAkaW5wdXQtPmdldE9wdGlvbignYXBwZW5kJykpOwoKcmV0dXJuIDA7Cn0KCmlmICgxID09PSBjb3VudCgkdmFsdWVzKSkgewokdmFsdWUgPSBzdHJ0b2xvd2VyKCR2YWx1ZXNbMF0pOwppZiAodHJ1ZSA9PT0gJGJvb2xlYW5WYWxpZGF0b3IoJHZhbHVlKSkgewppZiAoZmFsc2UgPT09ICRib29sZWFuTm9ybWFsaXplcigkdmFsdWUpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZFJlcG9zaXRvcnkoJG1hdGNoZXNbMV0sIGZhbHNlLCAkaW5wdXQtPmdldE9wdGlvbignYXBwZW5kJykpOwoKcmV0dXJuIDA7Cn0KfSBlbHNlIHsKJHZhbHVlID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdmFsdWVzWzBdKTsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUmVwb3NpdG9yeSgkbWF0Y2hlc1sxXSwgJHZhbHVlLCAkaW5wdXQtPmdldE9wdGlvbignYXBwZW5kJykpOwoKcmV0dXJuIDA7Cn0KfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgbXVzdCBwYXNzIHRoZSB0eXBlIGFuZCBhIHVybC4gRXhhbXBsZTogcGhwIGNvbXBvc2VyLnBoYXIgY29uZmlnIHJlcG9zaXRvcmllcy5mb28gdmNzIGh0dHBzOi8vYmFyLmNvbScpOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9eZXh0cmFcLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlUHJvcGVydHkoJHNldHRpbmdLZXkpOwoKcmV0dXJuIDA7Cn0KCiR2YWx1ZSA9ICR2YWx1ZXNbMF07CmlmICgkaW5wdXQtPmdldE9wdGlvbignanNvbicpKSB7CiR2YWx1ZSA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHZhbHVlKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdtZXJnZScpKSB7CiRjdXJyZW50VmFsdWUgPSAkdGhpcy0+Y29uZmlnRmlsZS0+cmVhZCgpOwokYml0cyA9IGV4cGxvZGUoJy4nLCAkc2V0dGluZ0tleSk7CmZvcmVhY2ggKCRiaXRzIGFzICRiaXQpIHsKJGN1cnJlbnRWYWx1ZSA9ICRjdXJyZW50VmFsdWVbJGJpdF0gPz8gbnVsbDsKfQppZiAoaXNfYXJyYXkoJGN1cnJlbnRWYWx1ZSkgJiYgaXNfYXJyYXkoJHZhbHVlKSkgewppZiAoYXJyYXlfaXNfbGlzdCgkY3VycmVudFZhbHVlKSAmJiBhcnJheV9pc19saXN0KCR2YWx1ZSkpIHsKJHZhbHVlID0gYXJyYXlfbWVyZ2UoJGN1cnJlbnRWYWx1ZSwgJHZhbHVlKTsKfSBlbHNlIHsKJHZhbHVlID0gJHZhbHVlICsgJGN1cnJlbnRWYWx1ZTsKfQp9Cn0KfQokdGhpcy0+Y29uZmlnU291cmNlLT5hZGRQcm9wZXJ0eSgkc2V0dGluZ0tleSwgJHZhbHVlKTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ec3VnZ2VzdFwuKC4rKS8nLCAkc2V0dGluZ0tleSwgJG1hdGNoZXMpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVQcm9wZXJ0eSgkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUHJvcGVydHkoJHNldHRpbmdLZXksIGltcGxvZGUoJyAnLCAkdmFsdWVzKSk7CgpyZXR1cm4gMDsKfQoKCmlmIChpbl9hcnJheSgkc2V0dGluZ0tleSwgWydzdWdnZXN0JywgJ2V4dHJhJ10sIHRydWUpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZVByb3BlcnR5KCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ecGxhdGZvcm1cLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSwgJHZhbHVlc1swXSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogJHZhbHVlc1swXSk7CgpyZXR1cm4gMDsKfQoKCmlmICgkc2V0dGluZ0tleSA9PT0gJ3BsYXRmb3JtJyAmJiAkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9eKGJpdGJ1Y2tldC1vYXV0aHxnaXRodWItb2F1dGh8Z2l0bGFiLW9hdXRofGdpdGxhYi10b2tlbnxodHRwLWJhc2ljfGJlYXJlcilcLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmF1dGhDb25maWdTb3VyY2UtPnJlbW92ZUNvbmZpZ1NldHRpbmcoJG1hdGNoZXNbMV0uJy4nLiRtYXRjaGVzWzJdKTsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0pOwoKcmV0dXJuIDA7Cn0KCmlmICgkbWF0Y2hlc1sxXSA9PT0gJ2JpdGJ1Y2tldC1vYXV0aCcpIHsKaWYgKDIgIT09IGNvdW50KCR2YWx1ZXMpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRXhwZWN0ZWQgdHdvIGFyZ3VtZW50cyAoY29uc3VtZXIta2V5LCBjb25zdW1lci1zZWNyZXQpLCBnb3QgJy5jb3VudCgkdmFsdWVzKSk7Cn0KJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0pOwokdGhpcy0+YXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0sIFsnY29uc3VtZXIta2V5JyA9PiAkdmFsdWVzWzBdLCAnY29uc3VtZXItc2VjcmV0JyA9PiAkdmFsdWVzWzFdXSk7Cn0gZWxzZWlmICgkbWF0Y2hlc1sxXSA9PT0gJ2dpdGxhYi10b2tlbicgJiYgMiA9PT0gY291bnQoJHZhbHVlcykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0pOwokdGhpcy0+YXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0sIFsndXNlcm5hbWUnID0+ICR2YWx1ZXNbMF0sICd0b2tlbicgPT4gJHZhbHVlc1sxXV0pOwp9IGVsc2VpZiAoaW5fYXJyYXkoJG1hdGNoZXNbMV0sIFsnZ2l0aHViLW9hdXRoJywgJ2dpdGxhYi1vYXV0aCcsICdnaXRsYWItdG9rZW4nLCAnYmVhcmVyJ10sIHRydWUpKSB7CmlmICgxICE9PSBjb3VudCgkdmFsdWVzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RvbyBtYW55IGFyZ3VtZW50cywgZXhwZWN0ZWQgb25seSBvbmUgdG9rZW4nKTsKfQokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSk7CiR0aGlzLT5hdXRoQ29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSwgJHZhbHVlc1swXSk7Cn0gZWxzZWlmICgkbWF0Y2hlc1sxXSA9PT0gJ2h0dHAtYmFzaWMnKSB7CmlmICgyICE9PSBjb3VudCgkdmFsdWVzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0V4cGVjdGVkIHR3byBhcmd1bWVudHMgKHVzZXJuYW1lLCBwYXNzd29yZCksIGdvdCAnLmNvdW50KCR2YWx1ZXMpKTsKfQokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSk7CiR0aGlzLT5hdXRoQ29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSwgWyd1c2VybmFtZScgPT4gJHZhbHVlc1swXSwgJ3Bhc3N3b3JkJyA9PiAkdmFsdWVzWzFdXSk7Cn0KCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ec2NyaXB0c1wuKC4rKS8nLCAkc2V0dGluZ0tleSwgJG1hdGNoZXMpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVQcm9wZXJ0eSgkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUHJvcGVydHkoJHNldHRpbmdLZXksIGNvdW50KCR2YWx1ZXMpID4gMSA/ICR2YWx1ZXMgOiAkdmFsdWVzWzBdKTsKCnJldHVybiAwOwp9CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZVByb3BlcnR5KCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU2V0dGluZyAnLiRzZXR0aW5nS2V5LicgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvbW1hbmQnKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYW5kbGVTaW5nbGVWYWx1ZShzdHJpbmcgJGtleSwgYXJyYXkgJGNhbGxiYWNrcywgYXJyYXkgJHZhbHVlcywgc3RyaW5nICRtZXRob2QpOiB2b2lkCnsKWyR2YWxpZGF0b3IsICRub3JtYWxpemVyXSA9ICRjYWxsYmFja3M7CmlmICgxICE9PSBjb3VudCgkdmFsdWVzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdSBjYW4gb25seSBwYXNzIG9uZSB2YWx1ZS4gRXhhbXBsZTogcGhwIGNvbXBvc2VyLnBoYXIgY29uZmlnIHByb2Nlc3MtdGltZW91dCAzMDAnKTsKfQoKaWYgKHRydWUgIT09ICR2YWxpZGF0aW9uID0gJHZhbGlkYXRvcigkdmFsdWVzWzBdKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZigKJyIlcyIgaXMgYW4gaW52YWxpZCB2YWx1ZScuKCR2YWxpZGF0aW9uID8gJyAoJy4kdmFsaWRhdGlvbi4nKScgOiAnJyksCiR2YWx1ZXNbMF0KKSk7Cn0KCiRub3JtYWxpemVkVmFsdWUgPSAkbm9ybWFsaXplcigkdmFsdWVzWzBdKTsKCmlmICgka2V5ID09PSAnZGlzYWJsZS10bHMnKSB7CmlmICghJG5vcm1hbGl6ZWRWYWx1ZSAmJiAkdGhpcy0+Y29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzxpbmZvPllvdSBhcmUgbm93IHJ1bm5pbmcgQ29tcG9zZXIgd2l0aCBTU0wvVExTIHByb3RlY3Rpb24gZW5hYmxlZC48L2luZm8+Jyk7Cn0gZWxzZWlmICgkbm9ybWFsaXplZFZhbHVlICYmICEkdGhpcy0+Y29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgbm93IHJ1bm5pbmcgQ29tcG9zZXIgd2l0aCBTU0wvVExTIHByb3RlY3Rpb24gZGlzYWJsZWQuPC93YXJuaW5nPicpOwp9Cn0KCmNhbGxfdXNlcl9mdW5jKFskdGhpcy0+Y29uZmlnU291cmNlLCAkbWV0aG9kXSwgJGtleSwgJG5vcm1hbGl6ZWRWYWx1ZSk7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFuZGxlTXVsdGlWYWx1ZShzdHJpbmcgJGtleSwgYXJyYXkgJGNhbGxiYWNrcywgYXJyYXkgJHZhbHVlcywgc3RyaW5nICRtZXRob2QpOiB2b2lkCnsKWyR2YWxpZGF0b3IsICRub3JtYWxpemVyXSA9ICRjYWxsYmFja3M7CmlmICh0cnVlICE9PSAkdmFsaWRhdGlvbiA9ICR2YWxpZGF0b3IoJHZhbHVlcykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoCiclcyBpcyBhbiBpbnZhbGlkIHZhbHVlJy4oJHZhbGlkYXRpb24gPyAnICgnLiR2YWxpZGF0aW9uLicpJyA6ICcnKSwKanNvbl9lbmNvZGUoJHZhbHVlcykKKSk7Cn0KCmNhbGxfdXNlcl9mdW5jKFskdGhpcy0+Y29uZmlnU291cmNlLCAkbWV0aG9kXSwgJGtleSwgJG5vcm1hbGl6ZXIoJHZhbHVlcykpOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbGlzdENvbmZpZ3VyYXRpb24oYXJyYXkgJGNvbnRlbnRzLCBhcnJheSAkcmF3Q29udGVudHMsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCA/c3RyaW5nICRrID0gbnVsbCwgYm9vbCAkc2hvd1NvdXJjZSA9IGZhbHNlKTogdm9pZAp7CiRvcmlnSyA9ICRrOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKZm9yZWFjaCAoJGNvbnRlbnRzIGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmICgkayA9PT0gbnVsbCAmJiAhaW5fYXJyYXkoJGtleSwgWydjb25maWcnLCAncmVwb3NpdG9yaWVzJ10pKSB7CmNvbnRpbnVlOwp9CgokcmF3VmFsID0gJHJhd0NvbnRlbnRzWyRrZXldID8/IG51bGw7CgppZiAoaXNfYXJyYXkoJHZhbHVlKSAmJiAoIWlzX251bWVyaWMoa2V5KCR2YWx1ZSkpIHx8ICgka2V5ID09PSAncmVwb3NpdG9yaWVzJyAmJiBudWxsID09PSAkaykpKSB7CiRrIC49IFByZWc6OnJlcGxhY2UoJ3teY29uZmlnXC59JywgJycsICRrZXkgLiAnLicpOwokdGhpcy0+bGlzdENvbmZpZ3VyYXRpb24oJHZhbHVlLCAkcmF3VmFsLCAkb3V0cHV0LCAkaywgJHNob3dTb3VyY2UpOwokayA9ICRvcmlnSzsKCmNvbnRpbnVlOwp9CgppZiAoaXNfYXJyYXkoJHZhbHVlKSkgewokdmFsdWUgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiBpc19hcnJheSgkdmFsKSA/IGpzb25fZW5jb2RlKCR2YWwpIDogJHZhbDsKfSwgJHZhbHVlKTsKCiR2YWx1ZSA9ICdbJy5pbXBsb2RlKCcsICcsICR2YWx1ZSkuJ10nOwp9CgppZiAoaXNfYm9vbCgkdmFsdWUpKSB7CiR2YWx1ZSA9IHZhcl9leHBvcnQoJHZhbHVlLCB0cnVlKTsKfQoKJHNvdXJjZSA9ICcnOwppZiAoJHNob3dTb3VyY2UpIHsKJHNvdXJjZSA9ICcgKCcgLiAkdGhpcy0+Y29uZmlnLT5nZXRTb3VyY2VPZlZhbHVlKCRrIC4gJGtleSkgLiAnKSc7Cn0KCmlmIChudWxsICE9PSAkayAmJiAwID09PSBzdHJwb3MoJGssICdyZXBvc2l0b3JpZXMnKSkgewokbGluayA9ICdodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDUtcmVwb3NpdG9yaWVzLm1kJzsKfSBlbHNlIHsKJGlkID0gUHJlZzo6cmVwbGFjZSgne1wuLiokfScsICcnLCAkayA9PT0gJycgfHwgJGsgPT09IG51bGwgPyAoc3RyaW5nKSAka2V5IDogJGspOwokaWQgPSBQcmVnOjpyZXBsYWNlKCd7W15hLXowLTldfWknLCAnLScsIHN0cnRvbG93ZXIodHJpbSgkaWQpKSk7CiRpZCA9IFByZWc6OnJlcGxhY2UoJ3stK30nLCAnLScsICRpZCk7CiRsaW5rID0gJ2h0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNi1jb25maWcubWQjJyAuICRpZDsKfQppZiAoaXNfc3RyaW5nKCRyYXdWYWwpICYmICRyYXdWYWwgIT09ICR2YWx1ZSkgewokaW8tPndyaXRlKCdbPGZnPXllbGxvdztocmVmPScgLiAkbGluayAuJz4nIC4gJGsgLiAka2V5IC4gJzwvPl0gPGluZm8+JyAuICRyYXdWYWwgLiAnICgnIC4gJHZhbHVlIC4gJyk8L2luZm8+JyAuICRzb3VyY2UsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJ1s8Zmc9eWVsbG93O2hyZWY9JyAuICRsaW5rIC4nPicgLiAkayAuICRrZXkgLiAnPC8+XSA8aW5mbz4nIC4gJHZhbHVlIC4gJzwvaW5mbz4nIC4gJHNvdXJjZSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tcG9zZXJDb25maWdGaWxlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgQ29uZmlnICRjb25maWcpOiBzdHJpbmcKewpyZXR1cm4gJGlucHV0LT5nZXRPcHRpb24oJ2dsb2JhbCcpCj8gKCRjb25maWctPmdldCgnaG9tZScpIC4gJy9jb25maWcuanNvbicpCjogKCRpbnB1dC0+Z2V0T3B0aW9uKCdmaWxlJykgPzogRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCkpCjsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0QXV0aENvbmZpZ0ZpbGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBDb25maWcgJGNvbmZpZyk6IHN0cmluZwp7CnJldHVybiAkaW5wdXQtPmdldE9wdGlvbignZ2xvYmFsJykKPyAoJGNvbmZpZy0+Z2V0KCdob21lJykgLiAnL2F1dGguanNvbicpCjogZGlybmFtZSgkdGhpcy0+Z2V0Q29tcG9zZXJDb25maWdGaWxlKCRpbnB1dCwgJGNvbmZpZykpIC4gJy9hdXRoLmpzb24nCjsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0U2V0dGluZ0tleXMoKTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpOiBhcnJheSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbGlzdCcpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdlZGl0b3InKSB8fCAkaW5wdXQtPmdldE9wdGlvbignYXV0aCcpKSB7CnJldHVybiBbXTsKfQoKCiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoKTsKCgokY29uZmlnRmlsZSA9IG5ldyBKc29uRmlsZSgkdGhpcy0+Z2V0Q29tcG9zZXJDb25maWdGaWxlKCRpbnB1dCwgJGNvbmZpZykpOwppZiAoJGNvbmZpZ0ZpbGUtPmV4aXN0cygpKSB7CiRjb25maWctPm1lcmdlKCRjb25maWdGaWxlLT5yZWFkKCksICRjb25maWdGaWxlLT5nZXRQYXRoKCkpOwp9CgoKJGF1dGhDb25maWdGaWxlID0gbmV3IEpzb25GaWxlKCR0aGlzLT5nZXRBdXRoQ29uZmlnRmlsZSgkaW5wdXQsICRjb25maWcpKTsKaWYgKCRhdXRoQ29uZmlnRmlsZS0+ZXhpc3RzKCkpIHsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+ICRhdXRoQ29uZmlnRmlsZS0+cmVhZCgpXSwgJGF1dGhDb25maWdGaWxlLT5nZXRQYXRoKCkpOwp9CgoKJHJhd0NvbmZpZyA9ICRjb25maWctPnJhdygpOwoka2V5cyA9IGFycmF5X21lcmdlKAokdGhpcy0+ZmxhdHRlblNldHRpbmdLZXlzKCRyYXdDb25maWdbJ2NvbmZpZyddKSwKJHRoaXMtPmZsYXR0ZW5TZXR0aW5nS2V5cygkcmF3Q29uZmlnWydyZXBvc2l0b3JpZXMnXSwgJ3JlcG9zaXRvcmllcy4nKQopOwoKCmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewoKJHNvdXJjZXMgPSBbJGNvbmZpZ0ZpbGUtPmdldFBhdGgoKSwgJGF1dGhDb25maWdGaWxlLT5nZXRQYXRoKCldOwoka2V5cyA9IGFycmF5X2ZpbHRlcigKJGtleXMsCnN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICRrZXkpIHVzZSAoJGNvbmZpZywgJHNvdXJjZXMpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCRjb25maWctPmdldFNvdXJjZU9mVmFsdWUoJGtleSksICRzb3VyY2VzLCB0cnVlKTsKfQopOwoKCn0gZWxzZSB7Cgoka2V5cyA9IGFycmF5X21lcmdlKCRrZXlzLCBzZWxmOjpDT05GSUdVUkFCTEVfUEFDS0FHRV9QUk9QRVJUSUVTKTsKCgoKCgp9CgoKaWYgKCRjb25maWdGaWxlLT5leGlzdHMoKSkgewokcHJvcGVydGllcyA9IGFycmF5X2ZpbHRlcigKJGNvbmZpZ0ZpbGUtPnJlYWQoKSwKc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJGtleSk6IGJvb2wgewpyZXR1cm4gaW5fYXJyYXkoJGtleSwgc2VsZjo6Q09ORklHVVJBQkxFX1BBQ0tBR0VfUFJPUEVSVElFUywgdHJ1ZSk7Cn0sCkFSUkFZX0ZJTFRFUl9VU0VfS0VZCik7Cgoka2V5cyA9IGFycmF5X21lcmdlKAoka2V5cywKJHRoaXMtPmZsYXR0ZW5TZXR0aW5nS2V5cygkcHJvcGVydGllcykKKTsKfQoKCiRjb21wbGV0aW9uVmFsdWUgPSAkaW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpOwoKaWYgKCRjb21wbGV0aW9uVmFsdWUgIT09ICcnKSB7CiRrZXlzID0gYXJyYXlfZmlsdGVyKAoka2V5cywKc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJGtleSkgdXNlICgkY29tcGxldGlvblZhbHVlKTogYm9vbCB7CnJldHVybiBzdHJfc3RhcnRzX3dpdGgoJGtleSwgJGNvbXBsZXRpb25WYWx1ZSk7Cn0KKTsKfQoKc29ydCgka2V5cyk7CgpyZXR1cm4gYXJyYXlfdW5pcXVlKCRrZXlzKTsKfTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmbGF0dGVuU2V0dGluZ0tleXMoYXJyYXkgJGNvbmZpZywgc3RyaW5nICRwcmVmaXggPSAnJyk6IGFycmF5CnsKJGtleXMgPSBbXTsKZm9yZWFjaCAoJGNvbmZpZyBhcyAka2V5ID0+ICR2YWx1ZSkgewoka2V5c1tdID0gWyRwcmVmaXggLiAka2V5XTsKCgppZiAoaXNfYXJyYXkoJHZhbHVlKSAmJiAhYXJyYXlfaXNfbGlzdCgkdmFsdWUpICYmICRwcmVmaXggIT09ICdyZXBvc2l0b3JpZXMuJykgewoka2V5c1tdID0gJHRoaXMtPmZsYXR0ZW5TZXR0aW5nS2V5cygkdmFsdWUsICRwcmVmaXggLiAka2V5IC4gJy4nKTsKfQp9CgpyZXR1cm4gYXJyYXlfbWVyZ2UoLi4uJGtleXMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXElnbm9yZUFsbFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJbnN0YWxsZXI7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcUHJvamVjdEluc3RhbGxlcjsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25TZWxlY3RvcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkJsb2NrZWRFeGNlcHRpb247CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZEFycmF5UmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU2VsZFxTaWduYWxcU2lnbmFsSGFuZGxlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEZpbmRlcjsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxDb25maWdcSnNvbkNvbmZpZ1NvdXJjZTsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKCgoKCgoKCgoKY2xhc3MgQ3JlYXRlUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CgoKCgpwcm90ZWN0ZWQgJHN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2NyZWF0ZS1wcm9qZWN0JykKLT5zZXREZXNjcmlwdGlvbignQ3JlYXRlcyBuZXcgcHJvamVjdCBmcm9tIGEgcGFja2FnZSBpbnRvIGdpdmVuIGRpcmVjdG9yeScpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdQYWNrYWdlIG5hbWUgdG8gYmUgaW5zdGFsbGVkJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlKCkpLApuZXcgSW5wdXRBcmd1bWVudCgnZGlyZWN0b3J5JywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdEaXJlY3Rvcnkgd2hlcmUgdGhlIGZpbGVzIHNob3VsZCBiZSBjcmVhdGVkJyksCm5ldyBJbnB1dEFyZ3VtZW50KCd2ZXJzaW9uJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdWZXJzaW9uLCB3aWxsIGRlZmF1bHQgdG8gbGF0ZXN0JyksCm5ldyBJbnB1dE9wdGlvbignc3RhYmlsaXR5JywgJ3MnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdNaW5pbXVtLXN0YWJpbGl0eSBhbGxvd2VkICh1bmxlc3MgYSB2ZXJzaW9uIGlzIHNwZWNpZmllZCkuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLXNvdXJjZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2Ugc291cmNlcyB3aGVuIHBvc3NpYmxlLCBpbmNsdWRpbmcgVkNTIGluZm9ybWF0aW9uLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1kaXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0IChkZWZhdWx0IGJlaGF2aW9yKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItaW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIGRpc3R8c291cmNlfGF1dG8gKGF1dG8gY2hvb3NlcyBzb3VyY2UgZm9yIGRldiB2ZXJzaW9ucywgZGlzdCBmb3IgdGhlIHJlc3QpLicsIG51bGwsICR0aGlzLT5zdWdnZXN0UHJlZmVySW5zdGFsbCgpKSwKbmV3IElucHV0T3B0aW9uKCdyZXBvc2l0b3J5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnQWRkIGN1c3RvbSByZXBvc2l0b3JpZXMgdG8gbG9vayB0aGUgcGFja2FnZSB1cCwgZWl0aGVyIGJ5IFVSTCBvciB1c2luZyBKU09OIGFycmF5cycpLApuZXcgSW5wdXRPcHRpb24oJ3JlcG9zaXRvcnktdXJsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnREVQUkVDQVRFRDogVXNlIC0tcmVwb3NpdG9yeSBpbnN0ZWFkLicpLApuZXcgSW5wdXRPcHRpb24oJ2FkZC1yZXBvc2l0b3J5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBZGQgdGhlIGN1c3RvbSByZXBvc2l0b3J5IGluIHRoZSBjb21wb3Nlci5qc29uLiBJZiBhIGxvY2sgZmlsZSBpcyBwcmVzZW50IGl0IHdpbGwgYmUgZGVsZXRlZCBhbmQgYW4gdXBkYXRlIHdpbGwgYmUgcnVuIGluc3RlYWQgb2YgaW5zdGFsbC4nKSwKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0VuYWJsZXMgaW5zdGFsbGF0aW9uIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzIChlbmFibGVkIGJ5IGRlZmF1bHQsIG9ubHkgcHJlc2VudCBmb3IgQkMpLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgaW5zdGFsbGF0aW9uIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWN1c3RvbS1pbnN0YWxsZXJzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdERVBSRUNBVEVEOiBVc2Ugbm8tcGx1Z2lucyBpbnN0ZWFkLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXNjcmlwdHMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1doZXRoZXIgdG8gcHJldmVudCBleGVjdXRpb24gb2YgYWxsIGRlZmluZWQgc2NyaXB0cyBpbiB0aGUgcm9vdCBwYWNrYWdlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXByb2dyZXNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3Qgb3V0cHV0IGRvd25sb2FkIHByb2dyZXNzLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXNlY3VyZS1odHRwJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlIHRoZSBzZWN1cmUtaHR0cCBjb25maWcgb3B0aW9uIHRlbXBvcmFyaWx5IHdoaWxlIGluc3RhbGxpbmcgdGhlIHJvb3QgcGFja2FnZS4gVXNlIGF0IHlvdXIgb3duIHJpc2suIFVzaW5nIHRoaXMgZmxhZyBpcyBhIGJhZCBpZGVhLicpLApuZXcgSW5wdXRPcHRpb24oJ2tlZXAtdmNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGV0aGVyIHRvIHByZXZlbnQgZGVsZXRpbmcgdGhlIHZjcyBmb2xkZXIuJyksCm5ldyBJbnB1dE9wdGlvbigncmVtb3ZlLXZjcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnV2hldGhlciB0byBmb3JjZSBkZWxldGlvbiBvZiB0aGUgdmNzIGZvbGRlciB3aXRob3V0IHByb21wdGluZy4nKSwKbmV3IElucHV0T3B0aW9uKCduby1pbnN0YWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGV0aGVyIHRvIHNraXAgaW5zdGFsbGF0aW9uIG9mIHRoZSBwYWNrYWdlIGRlcGVuZGVuY2llcy4nKSwKbmV3IElucHV0T3B0aW9uKCduby1hdWRpdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnV2hldGhlciB0byBza2lwIGF1ZGl0aW5nIG9mIHRoZSBpbnN0YWxsZWQgcGFja2FnZSBkZXBlbmRlbmNpZXMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX05PX0FVRElUPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignYXVkaXQtZm9ybWF0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnQXVkaXQgb3V0cHV0IGZvcm1hdC4gTXVzdCBiZSAidGFibGUiLCAicGxhaW4iLCAianNvbiIgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZLCBBdWRpdG9yOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignYXNrJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGV0aGVyIHRvIGFzayBmb3IgcHJvamVjdCBkaXJlY3RvcnkuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5jcmVhdGUtcHJvamVjdDwvaW5mbz4gY29tbWFuZCBjcmVhdGVzIGEgbmV3IHByb2plY3QgZnJvbSBhIGdpdmVuCnBhY2thZ2UgaW50byBhIG5ldyBkaXJlY3RvcnkuIElmIGV4ZWN1dGVkIHdpdGhvdXQgcGFyYW1zIGFuZCBpbiBhIGRpcmVjdG9yeQp3aXRoIGEgY29tcG9zZXIuanNvbiBmaWxlIGl0IGluc3RhbGxzIHRoZSBwYWNrYWdlcyBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdC4KCllvdSBjYW4gdXNlIHRoaXMgY29tbWFuZCB0byBib290c3RyYXAgbmV3IHByb2plY3RzIG9yIHNldHVwIGEgY2xlYW4KdmVyc2lvbi1jb250cm9sbGVkIGluc3RhbGxhdGlvbiBmb3IgZGV2ZWxvcGVycyBvZiB5b3VyIHByb2plY3QuCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBjcmVhdGUtcHJvamVjdCB2ZW5kb3IvcHJvamVjdCB0YXJnZXQtZGlyZWN0b3J5IFt2ZXJzaW9uXTwvaW5mbz4KCllvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSB2ZXJzaW9uIHdpdGggdGhlIHBhY2thZ2UgbmFtZSB1c2luZyA9IG9yIDogYXMgc2VwYXJhdG9yLgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgY3JlYXRlLXByb2plY3QgdmVuZG9yL3Byb2plY3Q6dmVyc2lvbiB0YXJnZXQtZGlyZWN0b3J5PC9pbmZvPgoKVG8gaW5zdGFsbCB1bnN0YWJsZSBwYWNrYWdlcywgZWl0aGVyIHNwZWNpZnkgdGhlIHZlcnNpb24geW91IHdhbnQsIG9yIHVzZSB0aGUKLS1zdGFiaWxpdHk9ZGV2ICh3aGVyZSBkZXYgY2FuIGJlIG9uZSBvZiBSQywgYmV0YSwgYWxwaGEgb3IgZGV2KS4KClRvIHNldHVwIGEgZGV2ZWxvcGVyIHdvcmthYmxlIHZlcnNpb24geW91IHNob3VsZCBjcmVhdGUgdGhlIHByb2plY3QgdXNpbmcgdGhlIHNvdXJjZQpjb250cm9sbGVkIGNvZGUgYnkgYXBwZW5kaW5nIHRoZSA8aW5mbz4nLS1wcmVmZXItc291cmNlJzwvaW5mbz4gZmxhZy4KClRvIGluc3RhbGwgYSBwYWNrYWdlIGZyb20gYW5vdGhlciByZXBvc2l0b3J5IHRoYW4gdGhlIGRlZmF1bHQgb25lIHlvdQpjYW4gcGFzcyB0aGUgPGluZm8+Jy0tcmVwb3NpdG9yeT1odHRwczovL215cmVwb3NpdG9yeS5vcmcnPC9pbmZvPiBmbGFnLgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjY3JlYXRlLXByb2plY3QKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKClskcHJlZmVyU291cmNlLCAkcHJlZmVyRGlzdF0gPSAkdGhpcy0+Z2V0UHJlZmVycmVkSW5zdGFsbE9wdGlvbnMoJGNvbmZpZywgJGlucHV0LCB0cnVlKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignZGV2JykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9wdGlvbiAiZGV2Ii4gRGV2IHBhY2thZ2VzIGFyZSBpbnN0YWxsZWQgYnkgZGVmYXVsdCBub3cuPC93YXJuaW5nPicpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tY3VzdG9tLWluc3RhbGxlcnMnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICJuby1jdXN0b20taW5zdGFsbGVycyIuIFVzZSAibm8tcGx1Z2lucyIgaW5zdGVhZC48L3dhcm5pbmc+Jyk7CiRpbnB1dC0+c2V0T3B0aW9uKCduby1wbHVnaW5zJywgdHJ1ZSk7Cn0KCmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSAmJiAkaW5wdXQtPmdldE9wdGlvbignYXNrJykpIHsKJHBhY2thZ2UgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJyk7CmlmIChudWxsID09PSAkcGFja2FnZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ05vdCBlbm91Z2ggYXJndW1lbnRzIChtaXNzaW5nOiAicGFja2FnZSIpLicpOwp9CiRwYXJ0cyA9IGV4cGxvZGUoIi8iLCBzdHJ0b2xvd2VyKCRwYWNrYWdlKSwgMik7CiRpbnB1dC0+c2V0QXJndW1lbnQoJ2RpcmVjdG9yeScsICRpby0+YXNrKCdOZXcgcHJvamVjdCBkaXJlY3RvcnkgWzxjb21tZW50PicuYXJyYXlfcG9wKCRwYXJ0cykuJzwvY29tbWVudD5dOiAnKSk7Cn0KCnJldHVybiAkdGhpcy0+aW5zdGFsbFByb2plY3QoCiRpbywKJGNvbmZpZywKJGlucHV0LAokaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJyksCiRpbnB1dC0+Z2V0QXJndW1lbnQoJ2RpcmVjdG9yeScpLAokaW5wdXQtPmdldEFyZ3VtZW50KCd2ZXJzaW9uJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCdzdGFiaWxpdHknKSwKJHByZWZlclNvdXJjZSwKJHByZWZlckRpc3QsCiEkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JyksClxjb3VudCgkaW5wdXQtPmdldE9wdGlvbigncmVwb3NpdG9yeScpKSA+IDAgPyAkaW5wdXQtPmdldE9wdGlvbigncmVwb3NpdG9yeScpIDogJGlucHV0LT5nZXRPcHRpb24oJ3JlcG9zaXRvcnktdXJsJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCduby1wbHVnaW5zJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCduby1zY3JpcHRzJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCduby1wcm9ncmVzcycpLAokaW5wdXQtPmdldE9wdGlvbignbm8taW5zdGFsbCcpLAokdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpLAohJGlucHV0LT5nZXRPcHRpb24oJ25vLXNlY3VyZS1odHRwJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCdhZGQtcmVwb3NpdG9yeScpCik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGxQcm9qZWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgP3N0cmluZyAkcGFja2FnZU5hbWUgPSBudWxsLCA/c3RyaW5nICRkaXJlY3RvcnkgPSBudWxsLCA/c3RyaW5nICRwYWNrYWdlVmVyc2lvbiA9IG51bGwsID9zdHJpbmcgJHN0YWJpbGl0eSA9ICdzdGFibGUnLCBib29sICRwcmVmZXJTb3VyY2UgPSBmYWxzZSwgYm9vbCAkcHJlZmVyRGlzdCA9IGZhbHNlLCBib29sICRpbnN0YWxsRGV2UGFja2FnZXMgPSBmYWxzZSwgJHJlcG9zaXRvcmllcyA9IG51bGwsIGJvb2wgJGRpc2FibGVQbHVnaW5zID0gZmFsc2UsIGJvb2wgJGRpc2FibGVTY3JpcHRzID0gZmFsc2UsIGJvb2wgJG5vUHJvZ3Jlc3MgPSBmYWxzZSwgYm9vbCAkbm9JbnN0YWxsID0gZmFsc2UsID9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gbnVsbCwgYm9vbCAkc2VjdXJlSHR0cCA9IHRydWUsIGJvb2wgJGFkZFJlcG9zaXRvcnkgPSBmYWxzZSk6IGludAp7CiRvbGRDd2QgPSBQbGF0Zm9ybTo6Z2V0Q3dkKCk7CgppZiAoJHJlcG9zaXRvcmllcyAhPT0gbnVsbCAmJiAhaXNfYXJyYXkoJHJlcG9zaXRvcmllcykpIHsKJHJlcG9zaXRvcmllcyA9IChhcnJheSkgJHJlcG9zaXRvcmllczsKfQoKJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA/PyBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlTm90aGluZygpOwoKCiRpby0+bG9hZENvbmZpZ3VyYXRpb24oJGNvbmZpZyk7CgokdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlciA9IG5ldyBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKCRpbyk7CgppZiAoJHBhY2thZ2VOYW1lICE9PSBudWxsKSB7CiRpbnN0YWxsZWRGcm9tVmNzID0gJHRoaXMtPmluc3RhbGxSb290UGFja2FnZSgkaW5wdXQsICRpbywgJGNvbmZpZywgJHBhY2thZ2VOYW1lLCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciwgJGRpcmVjdG9yeSwgJHBhY2thZ2VWZXJzaW9uLCAkc3RhYmlsaXR5LCAkcHJlZmVyU291cmNlLCAkcHJlZmVyRGlzdCwgJGluc3RhbGxEZXZQYWNrYWdlcywgJHJlcG9zaXRvcmllcywgJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMsICRub1Byb2dyZXNzLCAkc2VjdXJlSHR0cCk7Cn0gZWxzZSB7CiRpbnN0YWxsZWRGcm9tVmNzID0gZmFsc2U7Cn0KCmlmICgkcmVwb3NpdG9yaWVzICE9PSBudWxsICYmICRhZGRSZXBvc2l0b3J5ICYmIGlzX2ZpbGUoJ2NvbXBvc2VyLmxvY2snKSkgewp1bmxpbmsoJ2NvbXBvc2VyLmxvY2snKTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPmNyZWF0ZUNvbXBvc2VySW5zdGFuY2UoJGlucHV0LCAkaW8sIG51bGwsICRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKCgppZiAoJHJlcG9zaXRvcmllcyAhPT0gbnVsbCAmJiAkYWRkUmVwb3NpdG9yeSkgewpmb3JlYWNoICgkcmVwb3NpdG9yaWVzIGFzICRpbmRleCA9PiAkcmVwbykgewokcmVwb0NvbmZpZyA9IFJlcG9zaXRvcnlGYWN0b3J5Ojpjb25maWdGcm9tU3RyaW5nKCRpbywgJGNvbXBvc2VyLT5nZXRDb25maWcoKSwgJHJlcG8sIHRydWUpOwokY29tcG9zZXJKc29uUmVwb3NpdG9yaWVzQ29uZmlnID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0UmVwb3NpdG9yaWVzKCk7CiRuYW1lID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmdlbmVyYXRlUmVwb3NpdG9yeU5hbWUoJGluZGV4LCAkcmVwb0NvbmZpZywgJGNvbXBvc2VySnNvblJlcG9zaXRvcmllc0NvbmZpZyk7CiRjb25maWdTb3VyY2UgPSBuZXcgSnNvbkNvbmZpZ1NvdXJjZShuZXcgSnNvbkZpbGUoJ2NvbXBvc2VyLmpzb24nKSk7CgppZiAoCihpc3NldCgkcmVwb0NvbmZpZ1sncGFja2FnaXN0J10pICYmICRyZXBvQ29uZmlnID09PSBbJ3BhY2thZ2lzdCcgPT4gZmFsc2VdKQp8fCAoaXNzZXQoJHJlcG9Db25maWdbJ3BhY2thZ2lzdC5vcmcnXSkgJiYgJHJlcG9Db25maWcgPT09IFsncGFja2FnaXN0Lm9yZycgPT4gZmFsc2VdKQopIHsKJGNvbmZpZ1NvdXJjZS0+YWRkUmVwb3NpdG9yeSgncGFja2FnaXN0Lm9yZycsIGZhbHNlKTsKfSBlbHNlIHsKJGNvbmZpZ1NvdXJjZS0+YWRkUmVwb3NpdG9yeSgkbmFtZSwgJHJlcG9Db25maWcsIGZhbHNlKTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPmNyZWF0ZUNvbXBvc2VySW5zdGFuY2UoJGlucHV0LCAkaW8sIG51bGwsICRkaXNhYmxlUGx1Z2lucyk7Cn0KfQoKJHByb2Nlc3MgPSAkY29tcG9zZXItPmdldExvb3AoKS0+Z2V0UHJvY2Vzc0V4ZWN1dG9yKCk7CiRmcyA9IG5ldyBGaWxlc3lzdGVtKCRwcm9jZXNzKTsKCgokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBPU1RfUk9PVF9QQUNLQUdFX0lOU1RBTEwsICRpbnN0YWxsRGV2UGFja2FnZXMpOwoKCiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwpbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdID0gJHRoaXMtPmdldFByZWZlcnJlZEluc3RhbGxPcHRpb25zKCRjb25maWcsICRpbnB1dCk7CgoKaWYgKCRub0luc3RhbGwgPT09IGZhbHNlKSB7CiRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5zZXRPdXRwdXRQcm9ncmVzcyghJG5vUHJvZ3Jlc3MpOwoKJGluc3RhbGxlciA9IEluc3RhbGxlcjo6Y3JlYXRlKCRpbywgJGNvbXBvc2VyKTsKJGluc3RhbGxlci0+c2V0UHJlZmVyU291cmNlKCRwcmVmZXJTb3VyY2UpCi0+c2V0UHJlZmVyRGlzdCgkcHJlZmVyRGlzdCkKLT5zZXREZXZNb2RlKCRpbnN0YWxsRGV2UGFja2FnZXMpCi0+c2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikKLT5zZXRTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKCR0aGlzLT5zdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKQotPnNldE9wdGltaXplQXV0b2xvYWRlcigkY29uZmlnLT5nZXQoJ29wdGltaXplLWF1dG9sb2FkZXInKSkKLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoJGNvbmZpZy0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykpCi0+c2V0QXBjdUF1dG9sb2FkZXIoJGNvbmZpZy0+Z2V0KCdhcGN1LWF1dG9sb2FkZXInKSkKLT5zZXRBdWRpdCghJGlucHV0LT5nZXRPcHRpb24oJ25vLWF1ZGl0JykpCi0+c2V0QXVkaXRGb3JtYXQoJHRoaXMtPmdldEF1ZGl0Rm9ybWF0KCRpbnB1dCkpOwoKaWYgKCEkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpKSB7CiRpbnN0YWxsZXItPnNldFVwZGF0ZSh0cnVlKTsKfQoKaWYgKCRkaXNhYmxlUGx1Z2lucykgewokaW5zdGFsbGVyLT5kaXNhYmxlUGx1Z2lucygpOwp9Cgp0cnkgewokc3RhdHVzID0gJGluc3RhbGxlci0+cnVuKCk7CmlmICgwICE9PSAkc3RhdHVzKSB7CnJldHVybiAkc3RhdHVzOwp9Cn0gY2F0Y2ggKFBsdWdpbkJsb2NrZWRFeGNlcHRpb24gJGUpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SGludDogVG8gYWxsb3cgcnVubmluZyB0aGUgY29uZmlnIGNvbW1hbmQgcmVjb21tZW5kZWQgYmVsb3cgYmVmb3JlIGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbGVkLCBydW4gY3JlYXRlLXByb2plY3Qgd2l0aCAtLW5vLWluc3RhbGwuPC9lcnJvcj4nKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+WW91IGNhbiB0aGVuIGNkIGludG8gJy5nZXRjd2QoKS4nLCBjb25maWd1cmUgYWxsb3ctcGx1Z2lucywgYW5kIGZpbmFsbHkgcnVuIGEgY29tcG9zZXIgaW5zdGFsbCB0byBjb21wbGV0ZSB0aGUgcHJvY2Vzcy48L2Vycm9yPicpOwp0aHJvdyAkZTsKfQp9CgokaGFzVmNzID0gJGluc3RhbGxlZEZyb21WY3M7CmlmICgKISRpbnB1dC0+Z2V0T3B0aW9uKCdrZWVwLXZjcycpCiYmICRpbnN0YWxsZWRGcm9tVmNzCiYmICgKJGlucHV0LT5nZXRPcHRpb24oJ3JlbW92ZS12Y3MnKQp8fCAhJGlvLT5pc0ludGVyYWN0aXZlKCkKfHwgJGlvLT5hc2tDb25maXJtYXRpb24oJzxpbmZvPkRvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgZXhpc3RpbmcgVkNTICguZ2l0LCAuc3ZuLi4pIGhpc3Rvcnk/PC9pbmZvPiBbPGNvbW1lbnQ+WSxuPC9jb21tZW50Pl0/ICcpCikKKSB7CiRmaW5kZXIgPSBuZXcgRmluZGVyKCk7CiRmaW5kZXItPmRlcHRoKDApLT5kaXJlY3RvcmllcygpLT5pbihQbGF0Zm9ybTo6Z2V0Q3dkKCkpLT5pZ25vcmVWQ1MoZmFsc2UpLT5pZ25vcmVEb3RGaWxlcyhmYWxzZSk7CmZvcmVhY2ggKFsnLnN2bicsICdfc3ZuJywgJ0NWUycsICdfZGFyY3MnLCAnLmFyY2gtcGFyYW1zJywgJy5tb25vdG9uZScsICcuYnpyJywgJy5naXQnLCAnLmhnJywgJy5mc2xja291dCcsICdfRk9TU0lMXyddIGFzICR2Y3NOYW1lKSB7CiRmaW5kZXItPm5hbWUoJHZjc05hbWUpOwp9Cgp0cnkgewokZGlycyA9IGl0ZXJhdG9yX3RvX2FycmF5KCRmaW5kZXIpOwp1bnNldCgkZmluZGVyKTsKZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgewppZiAoISRmcy0+cmVtb3ZlRGlyZWN0b3J5KChzdHJpbmcpICRkaXIpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHJlbW92ZSAnLiRkaXIpOwp9Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5BbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZW1vdmluZyB0aGUgVkNTIG1ldGFkYXRhOiAnLiRlLT5nZXRNZXNzYWdlKCkuJzwvZXJyb3I+Jyk7Cn0KCiRoYXNWY3MgPSBmYWxzZTsKfQoKCmlmICghJGhhc1ZjcykgewokcGFja2FnZSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwokY29uZmlnU291cmNlID0gbmV3IEpzb25Db25maWdTb3VyY2UobmV3IEpzb25GaWxlKCdjb21wb3Nlci5qc29uJykpOwpmb3JlYWNoIChCYXNlUGFja2FnZTo6JHN1cHBvcnRlZExpbmtUeXBlcyBhcyAkdHlwZSA9PiAkbWV0YSkgewpmb3JlYWNoICgkcGFja2FnZS0+eydnZXQnLiRtZXRhWydtZXRob2QnXX0oKSBhcyAkbGluaykgewppZiAoJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSA9PT0gJ3NlbGYudmVyc2lvbicpIHsKJGNvbmZpZ1NvdXJjZS0+YWRkTGluaygkdHlwZSwgJGxpbmstPmdldFRhcmdldCgpLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKTsKfQp9Cn0KfQoKCiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UE9TVF9DUkVBVEVfUFJPSkVDVF9DTUQsICRpbnN0YWxsRGV2UGFja2FnZXMpOwoKY2hkaXIoJG9sZEN3ZCk7CgpyZXR1cm4gMDsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5zdGFsbFJvb3RQYWNrYWdlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICRwYWNrYWdlTmFtZSwgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciwgP3N0cmluZyAkZGlyZWN0b3J5ID0gbnVsbCwgP3N0cmluZyAkcGFja2FnZVZlcnNpb24gPSBudWxsLCA/c3RyaW5nICRzdGFiaWxpdHkgPSAnc3RhYmxlJywgYm9vbCAkcHJlZmVyU291cmNlID0gZmFsc2UsIGJvb2wgJHByZWZlckRpc3QgPSBmYWxzZSwgYm9vbCAkaW5zdGFsbERldlBhY2thZ2VzID0gZmFsc2UsID9hcnJheSAkcmVwb3NpdG9yaWVzID0gbnVsbCwgYm9vbCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZSwgYm9vbCAkZGlzYWJsZVNjcmlwdHMgPSBmYWxzZSwgYm9vbCAkbm9Qcm9ncmVzcyA9IGZhbHNlLCBib29sICRzZWN1cmVIdHRwID0gdHJ1ZSk6IGJvb2wKewokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJHJlcXVpcmVtZW50cyA9ICRwYXJzZXItPnBhcnNlTmFtZVZlcnNpb25QYWlycyhbJHBhY2thZ2VOYW1lXSk7CiRuYW1lID0gc3RydG9sb3dlcigkcmVxdWlyZW1lbnRzWzBdWyduYW1lJ10pOwppZiAoISRwYWNrYWdlVmVyc2lvbiAmJiBpc3NldCgkcmVxdWlyZW1lbnRzWzBdWyd2ZXJzaW9uJ10pKSB7CiRwYWNrYWdlVmVyc2lvbiA9ICRyZXF1aXJlbWVudHNbMF1bJ3ZlcnNpb24nXTsKfQoKCmlmIChudWxsID09PSAkZGlyZWN0b3J5KSB7CiRwYXJ0cyA9IGV4cGxvZGUoIi8iLCAkbmFtZSwgMik7CiRkaXJlY3RvcnkgPSBQbGF0Zm9ybTo6Z2V0Q3dkKCkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gYXJyYXlfcG9wKCRwYXJ0cyk7Cn0KJGRpcmVjdG9yeSA9IHJ0cmltKCRkaXJlY3RvcnksICcvXFwnKTsKCiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokZnMgPSBuZXcgRmlsZXN5c3RlbSgkcHJvY2Vzcyk7CmlmICghJGZzLT5pc0Fic29sdXRlUGF0aCgkZGlyZWN0b3J5KSkgewokZGlyZWN0b3J5ID0gUGxhdGZvcm06OmdldEN3ZCgpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRkaXJlY3Rvcnk7Cn0KaWYgKCcnID09PSAkZGlyZWN0b3J5KSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdHb3QgYW4gZW1wdHkgdGFyZ2V0IGRpcmVjdG9yeSwgc29tZXRoaW5nIHdlbnQgd3JvbmcnKTsKfQoKCiRjb25maWctPnNldEJhc2VEaXIoJGRpcmVjdG9yeSk7CmlmICghJHNlY3VyZUh0dHApIHsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+IFsnc2VjdXJlLWh0dHAnID0+IGZhbHNlXV0sIENvbmZpZzo6U09VUkNFX0NPTU1BTkQpOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkNyZWF0aW5nIGEgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBwcm9qZWN0IGF0ICInIC4gJGZzLT5maW5kU2hvcnRlc3RQYXRoKFBsYXRmb3JtOjpnZXRDd2QoKSwgJGRpcmVjdG9yeSwgdHJ1ZSkgLiAnIjwvaW5mbz4nKTsKCmlmIChmaWxlX2V4aXN0cygkZGlyZWN0b3J5KSkgewppZiAoIWlzX2RpcigkZGlyZWN0b3J5KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignQ2Fubm90IGNyZWF0ZSBwcm9qZWN0IGRpcmVjdG9yeSBhdCAiJy4kZGlyZWN0b3J5LiciLCBpdCBleGlzdHMgYXMgYSBmaWxlLicpOwp9CmlmICghJGZzLT5pc0RpckVtcHR5KCRkaXJlY3RvcnkpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQcm9qZWN0IGRpcmVjdG9yeSAiJy4kZGlyZWN0b3J5LiciIGlzIG5vdCBlbXB0eS4nKTsKfQp9CgppZiAobnVsbCA9PT0gJHN0YWJpbGl0eSkgewppZiAobnVsbCA9PT0gJHBhY2thZ2VWZXJzaW9uKSB7CiRzdGFiaWxpdHkgPSAnc3RhYmxlJzsKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teW14sXHNdKj9AKCcuaW1wbG9kZSgnfCcsIGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTKSkuJykkfWknLCAkcGFja2FnZVZlcnNpb24sICRtYXRjaCkpIHsKJHN0YWJpbGl0eSA9ICRtYXRjaFsxXTsKfSBlbHNlIHsKJHN0YWJpbGl0eSA9IFZlcnNpb25QYXJzZXI6OnBhcnNlU3RhYmlsaXR5KCRwYWNrYWdlVmVyc2lvbik7Cn0KfQoKJHN0YWJpbGl0eSA9IFZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkc3RhYmlsaXR5KTsKCmlmICghaXNzZXQoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTWyRzdGFiaWxpdHldKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBzdGFiaWxpdHkgcHJvdmlkZWQgKCcuJHN0YWJpbGl0eS4nKSwgbXVzdCBiZSBvbmUgb2Y6ICcuaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFUykpKTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPmNyZWF0ZUNvbXBvc2VySW5zdGFuY2UoJGlucHV0LCAkaW8sICRjb25maWctPmFsbCgpLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7CiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwoKJGNvbmZpZy0+c2V0QmFzZURpcigkZGlyZWN0b3J5KTsKJHJtID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpOwoKJHJlcG9zaXRvcnlTZXQgPSBuZXcgUmVwb3NpdG9yeVNldCgkc3RhYmlsaXR5KTsKaWYgKG51bGwgPT09ICRyZXBvc2l0b3JpZXMpIHsKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkobmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoUmVwb3NpdG9yeUZhY3Rvcnk6OmRlZmF1bHRSZXBvcygkaW8sICRjb25maWcsICRybSkpKTsKfSBlbHNlIHsKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkcmVwbykgewokcmVwb0NvbmZpZyA9IFJlcG9zaXRvcnlGYWN0b3J5Ojpjb25maWdGcm9tU3RyaW5nKCRpbywgJGNvbmZpZywgJHJlcG8sIHRydWUpOwppZiAoCihpc3NldCgkcmVwb0NvbmZpZ1sncGFja2FnaXN0J10pICYmICRyZXBvQ29uZmlnID09PSBbJ3BhY2thZ2lzdCcgPT4gZmFsc2VdKQp8fCAoaXNzZXQoJHJlcG9Db25maWdbJ3BhY2thZ2lzdC5vcmcnXSkgJiYgJHJlcG9Db25maWcgPT09IFsncGFja2FnaXN0Lm9yZycgPT4gZmFsc2VdKQopIHsKY29udGludWU7Cn0KCgppZiAoKCRyZXBvQ29uZmlnWyd0eXBlJ10gPz8gbnVsbCkgPT09ICdwYXRoJyAmJiAhaXNzZXQoJHJlcG9Db25maWdbJ29wdGlvbnMnXVsnc3ltbGluayddKSkgewokcmVwb0NvbmZpZ1snb3B0aW9ucyddWydzeW1saW5rJ10gPSBmYWxzZTsKfQoKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUZhY3Rvcnk6OmNyZWF0ZVJlcG8oJGlvLCAkY29uZmlnLCAkcmVwb0NvbmZpZywgJHJtKSk7Cn0KfQoKJHBsYXRmb3JtT3ZlcnJpZGVzID0gJGNvbmZpZy0+Z2V0KCdwbGF0Zm9ybScpOwokcGxhdGZvcm1SZXBvID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJHBsYXRmb3JtT3ZlcnJpZGVzKTsKCgokdmVyc2lvblNlbGVjdG9yID0gbmV3IFZlcnNpb25TZWxlY3RvcigkcmVwb3NpdG9yeVNldCwgJHBsYXRmb3JtUmVwbyk7CiRwYWNrYWdlID0gJHZlcnNpb25TZWxlY3Rvci0+ZmluZEJlc3RDYW5kaWRhdGUoJG5hbWUsICRwYWNrYWdlVmVyc2lvbiwgJHN0YWJpbGl0eSwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIsIDAsICRpbyk7CgppZiAoISRwYWNrYWdlKSB7CiRlcnJvck1lc3NhZ2UgPSAiQ291bGQgbm90IGZpbmQgcGFja2FnZSAkbmFtZSB3aXRoICIgLiAoJHBhY2thZ2VWZXJzaW9uID8gInZlcnNpb24gJHBhY2thZ2VWZXJzaW9uIiA6ICJzdGFiaWxpdHkgJHN0YWJpbGl0eSIpOwppZiAoISgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIElnbm9yZUFsbFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpICYmICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRCZXN0Q2FuZGlkYXRlKCRuYW1lLCAkcGFja2FnZVZlcnNpb24sICRzdGFiaWxpdHksIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVBbGwoKSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJGVycm9yTWVzc2FnZSAuJyBpbiBhIHZlcnNpb24gaW5zdGFsbGFibGUgdXNpbmcgeW91ciBQSFAgdmVyc2lvbiwgUEhQIGV4dGVuc2lvbnMgYW5kIENvbXBvc2VyIHZlcnNpb24uJyk7Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRlcnJvck1lc3NhZ2UgLicuJyk7Cn0KCgpAbWtkaXIoJGRpcmVjdG9yeSwgMDc3NywgdHJ1ZSk7CmlmIChmYWxzZSAhPT0gKCRyZWFsRGlyID0gcmVhbHBhdGgoJGRpcmVjdG9yeSkpKSB7CiRzaWduYWxIYW5kbGVyID0gU2lnbmFsSGFuZGxlcjo6Y3JlYXRlKFtTaWduYWxIYW5kbGVyOjpTSUdJTlQsIFNpZ25hbEhhbmRsZXI6OlNJR1RFUk0sIFNpZ25hbEhhbmRsZXI6OlNJR0hVUF0sIGZ1bmN0aW9uIChzdHJpbmcgJHNpZ25hbCwgU2lnbmFsSGFuZGxlciAkaGFuZGxlcikgdXNlICgkcmVhbERpcikgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignUmVjZWl2ZWQgJy4kc2lnbmFsLicsIGFib3J0aW5nJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZzLT5yZW1vdmVEaXJlY3RvcnkoJHJlYWxEaXIpOwokaGFuZGxlci0+ZXhpdFdpdGhMYXN0U2lnbmFsKCk7Cn0pOwp9CgoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQoKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5JbnN0YWxsaW5nICcgLiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4gJyAoJyAuICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbihmYWxzZSkgLiAnKTwvaW5mbz4nKTsKCmlmICgkZGlzYWJsZVBsdWdpbnMpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5QbHVnaW5zIGhhdmUgYmVlbiBkaXNhYmxlZC48L2luZm8+Jyk7Cn0KCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCiRkbSA9ICRjb21wb3Nlci0+Z2V0RG93bmxvYWRNYW5hZ2VyKCk7CiRkbS0+c2V0UHJlZmVyU291cmNlKCRwcmVmZXJTb3VyY2UpCi0+c2V0UHJlZmVyRGlzdCgkcHJlZmVyRGlzdCk7CgokcHJvamVjdEluc3RhbGxlciA9IG5ldyBQcm9qZWN0SW5zdGFsbGVyKCRkaXJlY3RvcnksICRkbSwgJGZzKTsKJGltID0gJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCk7CiRpbS0+c2V0T3V0cHV0UHJvZ3Jlc3MoISRub1Byb2dyZXNzKTsKJGltLT5hZGRJbnN0YWxsZXIoJHByb2plY3RJbnN0YWxsZXIpOwokaW0tPmV4ZWN1dGUobmV3IEluc3RhbGxlZEFycmF5UmVwb3NpdG9yeSgpLCBbbmV3IEluc3RhbGxPcGVyYXRpb24oJHBhY2thZ2UpXSk7CiRpbS0+bm90aWZ5SW5zdGFsbHMoJGlvKTsKCgokdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlci0+YWRkU3VnZ2VzdGlvbnNGcm9tUGFja2FnZSgkcGFja2FnZSk7CgokaW5zdGFsbGVkRnJvbVZjcyA9ICdzb3VyY2UnID09PSAkcGFja2FnZS0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCk7CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkNyZWF0ZWQgcHJvamVjdCBpbiAnIC4gJGRpcmVjdG9yeSAuICc8L2luZm8+Jyk7CmNoZGlyKCRkaXJlY3RvcnkpOwoKCgoKaWYgKGZpbGVfZXhpc3RzKCRkaXJlY3RvcnkuJy9jb21wb3Nlci5qc29uJykgJiYgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVInKSAhPT0gZmFsc2UpIHsKUGxhdGZvcm06OmNsZWFyRW52KCdDT01QT1NFUicpOwp9CgpQbGF0Zm9ybTo6cHV0RW52KCdDT01QT1NFUl9ST09UX1ZFUlNJT04nLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKTsKCgppZiAoaXNzZXQoJHNpZ25hbEhhbmRsZXIpKSB7CiRzaWduYWxIYW5kbGVyLT51bnJlZ2lzdGVyKCk7Cn0KCnJldHVybiAkaW5zdGFsbGVkRnJvbVZjczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwoKCgoKY2xhc3MgRGVwZW5kc0NvbW1hbmQgZXh0ZW5kcyBCYXNlRGVwZW5kZW5jeUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdkZXBlbmRzJykKLT5zZXRBbGlhc2VzKFsnd2h5J10pCi0+c2V0RGVzY3JpcHRpb24oJ1Nob3dzIHdoaWNoIHBhY2thZ2VzIGNhdXNlIHRoZSBnaXZlbiBwYWNrYWdlIHRvIGJlIGluc3RhbGxlZCcpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KHNlbGY6OkFSR1VNRU5UX1BBQ0tBR0UsIElucHV0QXJndW1lbnQ6OlJFUVVJUkVELCAnUGFja2FnZSB0byBpbnNwZWN0JywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlKHRydWUsIHRydWUpKSwKbmV3IElucHV0T3B0aW9uKHNlbGY6Ok9QVElPTl9SRUNVUlNJVkUsICdyJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZWN1cnNpdmVseSByZXNvbHZlcyB1cCB0byB0aGUgcm9vdCBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbihzZWxmOjpPUFRJT05fVFJFRSwgJ3QnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1ByaW50cyB0aGUgcmVzdWx0cyBhcyBhIG5lc3RlZCB0cmVlJyksCm5ldyBJbnB1dE9wdGlvbignbG9ja2VkJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZWFkIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZnJvbSBjb21wb3Nlci5sb2NrJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UCkRpc3BsYXlzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIGEgcGFja2FnZSBpcyByZWZlcmVuY2VkLgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgZGVwZW5kcyBjb21wb3Nlci9jb21wb3NlcjwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2RlcGVuZHMtd2h5CkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CnJldHVybiBwYXJlbnQ6OmRvRXhlY3V0ZSgkaW5wdXQsICRvdXRwdXQpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cQnVmZmVySU87CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9ja2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NlclJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEZpbGVzeXN0ZW1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxDb25maWdWYWxpZGF0b3I7CnVzZSBDb21wb3NlclxVdGlsXEdpdDsKdXNlIENvbXBvc2VyXFV0aWxcSW5pSGVscGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxTdHJlYW1Db250ZXh0RmFjdG9yeTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxTZWxmVXBkYXRlXEtleXM7CnVzZSBDb21wb3NlclxTZWxmVXBkYXRlXFZlcnNpb25zOwp1c2UgQ29tcG9zZXJcSU9cTnVsbElPOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxYZGVidWdIYW5kbGVyXFhkZWJ1Z0hhbmRsZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGVjdXRhYmxlRmluZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFByb3h5TWFuYWdlcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXF1ZXN0UHJveHk7CgoKCgpjbGFzcyBEaWFnbm9zZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7Cgpwcm90ZWN0ZWQgJGh0dHBEb3dubG9hZGVyOwoKCnByb3RlY3RlZCAkcHJvY2VzczsKCgpwcm90ZWN0ZWQgJGV4aXRDb2RlID0gMDsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnZGlhZ25vc2UnKQotPnNldERlc2NyaXB0aW9uKCdEaWFnbm9zZXMgdGhlIHN5c3RlbSB0byBpZGVudGlmeSBjb21tb24gZXJyb3JzJykKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPmRpYWdub3NlPC9pbmZvPiBjb21tYW5kIGNoZWNrcyBjb21tb24gZXJyb3JzIHRvIGhlbHAgZGVidWdnaW5nIHByb2JsZW1zLgoKVGhlIHByb2Nlc3MgZXhpdCBjb2RlIHdpbGwgYmUgMSBpbiBjYXNlIG9mIHdhcm5pbmdzIGFuZCAyIGZvciBlcnJvcnMuCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNkaWFnbm9zZQpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoJGNvbXBvc2VyKSB7CiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ2RpYWdub3NlJywgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRpby0+d3JpdGUoJ0NoZWNraW5nIGNvbXBvc2VyLmpzb246ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tDb21wb3NlclNjaGVtYSgpKTsKCmlmICgkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpKSB7CiRpby0+d3JpdGUoJ0NoZWNraW5nIGNvbXBvc2VyLmxvY2s6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tDb21wb3NlckxvY2tTY2hlbWEoJGNvbXBvc2VyLT5nZXRMb2NrZXIoKSkpOwp9CgokdGhpcy0+cHJvY2VzcyA9ICRjb21wb3Nlci0+Z2V0TG9vcCgpLT5nZXRQcm9jZXNzRXhlY3V0b3IoKSA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7Cn0gZWxzZSB7CiR0aGlzLT5wcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwp9CgppZiAoJGNvbXBvc2VyKSB7CiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwp9IGVsc2UgewokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCk7Cn0KCiRjb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiBbJ3NlY3VyZS1odHRwJyA9PiBmYWxzZV1dLCBDb25maWc6OlNPVVJDRV9DT01NQU5EKTsKJGNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygnaHR0cDovL3JlcG8ucGFja2FnaXN0Lm9yZycsIG5ldyBOdWxsSU8pOwoKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gRmFjdG9yeTo6Y3JlYXRlSHR0cERvd25sb2FkZXIoJGlvLCAkY29uZmlnKTsKCiRpby0+d3JpdGUoJ0NoZWNraW5nIHBsYXRmb3JtIHNldHRpbmdzOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrUGxhdGZvcm0oKSk7CgokaW8tPndyaXRlKCdDaGVja2luZyBnaXQgc2V0dGluZ3M6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tHaXQoKSk7CgokaW8tPndyaXRlKCdDaGVja2luZyBodHRwIGNvbm5lY3Rpdml0eSB0byBwYWNrYWdpc3Q6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tIdHRwKCdodHRwJywgJGNvbmZpZykpOwoKJGlvLT53cml0ZSgnQ2hlY2tpbmcgaHR0cHMgY29ubmVjdGl2aXR5IHRvIHBhY2thZ2lzdDogJywgZmFsc2UpOwokdGhpcy0+b3V0cHV0UmVzdWx0KCR0aGlzLT5jaGVja0h0dHAoJ2h0dHBzJywgJGNvbmZpZykpOwoKZm9yZWFjaCAoJGNvbmZpZy0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJHJlcG8pIHsKaWYgKCgkcmVwb1sndHlwZSddID8/IG51bGwpID09PSAnY29tcG9zZXInICYmIGlzc2V0KCRyZXBvWyd1cmwnXSkpIHsKJGNvbXBvc2VyUmVwbyA9IG5ldyBDb21wb3NlclJlcG9zaXRvcnkoJHJlcG8sICR0aGlzLT5nZXRJTygpLCAkY29uZmlnLCAkdGhpcy0+aHR0cERvd25sb2FkZXIpOwokcmVmbE1ldGhvZCA9IG5ldyBcUmVmbGVjdGlvbk1ldGhvZCgkY29tcG9zZXJSZXBvLCAnZ2V0UGFja2FnZXNKc29uVXJsJyk7CmlmIChQSFBfVkVSU0lPTl9JRCA8IDgwMTAwKSB7CiRyZWZsTWV0aG9kLT5zZXRBY2Nlc3NpYmxlKHRydWUpOwp9CiR1cmwgPSAkcmVmbE1ldGhvZC0+aW52b2tlKCRjb21wb3NlclJlcG8pOwppZiAoIXN0cl9zdGFydHNfd2l0aCgkdXJsLCAnaHR0cCcpKSB7CmNvbnRpbnVlOwp9CmlmIChzdHJfc3RhcnRzX3dpdGgoJHVybCwgJ2h0dHBzOi8vcmVwby5wYWNrYWdpc3Qub3JnJykpIHsKY29udGludWU7Cn0KJGlvLT53cml0ZSgnQ2hlY2tpbmcgY29ubmVjdGl2aXR5IHRvICcgLiAkcmVwb1sndXJsJ10uJzogJywgZmFsc2UpOwokdGhpcy0+b3V0cHV0UmVzdWx0KCR0aGlzLT5jaGVja0NvbXBvc2VyUmVwbygkdXJsLCAkY29uZmlnKSk7Cn0KfQoKJHByb3h5TWFuYWdlciA9IFByb3h5TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKJHByb3RvcyA9ICRjb25maWctPmdldCgnZGlzYWJsZS10bHMnKSA9PT0gdHJ1ZSA/IFsnaHR0cCddIDogWydodHRwJywgJ2h0dHBzJ107CnRyeSB7CmZvcmVhY2ggKCRwcm90b3MgYXMgJHByb3RvKSB7CiRwcm94eSA9ICRwcm94eU1hbmFnZXItPmdldFByb3h5Rm9yUmVxdWVzdCgkcHJvdG8uJzovL3JlcG8ucGFja2FnaXN0Lm9yZycpOwppZiAoJHByb3h5LT5nZXRTdGF0dXMoKSAhPT0gJycpIHsKJHR5cGUgPSAkcHJveHktPmlzU2VjdXJlKCkgPyAnSFRUUFMnIDogJ0hUVFAnOwokaW8tPndyaXRlKCdDaGVja2luZyAnLiR0eXBlLicgcHJveHkgd2l0aCAnLiRwcm90by4nOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrSHR0cFByb3h5KCRwcm94eSwgJHByb3RvKSk7Cn0KfQp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJGlvLT53cml0ZSgnQ2hlY2tpbmcgSFRUUCBwcm94eTogJywgZmFsc2UpOwokc3RhdHVzID0gJHRoaXMtPmNoZWNrQ29ubmVjdGl2aXR5QW5kQ29tcG9zZXJOZXR3b3JrSHR0cEVuYWJsZW1lbnQoKTsKJHRoaXMtPm91dHB1dFJlc3VsdChpc19zdHJpbmcoJHN0YXR1cykgPyAkc3RhdHVzIDogJGUpOwp9CgppZiAoY291bnQoJG9hdXRoID0gJGNvbmZpZy0+Z2V0KCdnaXRodWItb2F1dGgnKSkgPiAwKSB7CmZvcmVhY2ggKCRvYXV0aCBhcyAkZG9tYWluID0+ICR0b2tlbikgewokaW8tPndyaXRlKCdDaGVja2luZyAnLiRkb21haW4uJyBvYXV0aCBhY2Nlc3M6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tHaXRodWJPYXV0aCgkZG9tYWluLCAkdG9rZW4pKTsKfQp9IGVsc2UgewokaW8tPndyaXRlKCdDaGVja2luZyBnaXRodWIuY29tIHJhdGUgbGltaXQ6ICcsIGZhbHNlKTsKdHJ5IHsKJHJhdGUgPSAkdGhpcy0+Z2V0R2l0aHViUmF0ZUxpbWl0KCdnaXRodWIuY29tJyk7CmlmICghaXNfYXJyYXkoJHJhdGUpKSB7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHJhdGUpOwp9IGVsc2VpZiAoMTAgPiAkcmF0ZVsncmVtYWluaW5nJ10pIHsKJGlvLT53cml0ZSgnPHdhcm5pbmc+V0FSTklORzwvd2FybmluZz4nKTsKJGlvLT53cml0ZShzcHJpbnRmKAonPGNvbW1lbnQ+R2l0SHViIGhhcyBhIHJhdGUgbGltaXQgb24gdGhlaXIgQVBJLiAnCi4gJ1lvdSBjdXJyZW50bHkgaGF2ZSA8b3B0aW9ucz1ib2xkPiV1PC9vcHRpb25zPWJvbGQ+ICcKLiAnb3V0IG9mIDxvcHRpb25zPWJvbGQ+JXU8L29wdGlvbnM9Ym9sZD4gcmVxdWVzdHMgbGVmdC4nIC4gUEhQX0VPTAouICdTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My8jcmF0ZS1saW1pdGluZyBhbmQgYWxzbycgLiBQSFBfRU9MCi4gJyAgICBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kI2FwaS1yYXRlLWxpbWl0LWFuZC1vYXV0aC10b2tlbnM8L2NvbW1lbnQ+JywKJHJhdGVbJ3JlbWFpbmluZyddLAokcmF0ZVsnbGltaXQnXQopKTsKfSBlbHNlIHsKJHRoaXMtPm91dHB1dFJlc3VsdCh0cnVlKTsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkZS0+Z2V0Q29kZSgpID09PSA0MDEpIHsKJHRoaXMtPm91dHB1dFJlc3VsdCgnPGNvbW1lbnQ+VGhlIG9hdXRoIHRva2VuIGZvciBnaXRodWIuY29tIHNlZW1zIGludmFsaWQsIHJ1biAiY29tcG9zZXIgY29uZmlnIC0tZ2xvYmFsIC0tdW5zZXQgZ2l0aHViLW9hdXRoLmdpdGh1Yi5jb20iIHRvIHJlbW92ZSBpdDwvY29tbWVudD4nKTsKfSBlbHNlIHsKJHRoaXMtPm91dHB1dFJlc3VsdCgkZSk7Cn0KfQp9CgokaW8tPndyaXRlKCdDaGVja2luZyBkaXNrIGZyZWUgc3BhY2U6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tEaXNrU3BhY2UoJGNvbmZpZykpOwoKaWYgKHN0cnBvcyhfX0ZJTEVfXywgJ3BoYXI6JykgPT09IDApIHsKJGlvLT53cml0ZSgnQ2hlY2tpbmcgcHVia2V5czogJywgZmFsc2UpOwokdGhpcy0+b3V0cHV0UmVzdWx0KCR0aGlzLT5jaGVja1B1YktleXMoJGNvbmZpZykpOwoKJGlvLT53cml0ZSgnQ2hlY2tpbmcgQ29tcG9zZXIgdmVyc2lvbjogJywgZmFsc2UpOwokdGhpcy0+b3V0cHV0UmVzdWx0KCR0aGlzLT5jaGVja1ZlcnNpb24oJGNvbmZpZykpOwp9CgokaW8tPndyaXRlKCdDaGVja2luZyBDb21wb3NlciBhbmQgaXRzIGRlcGVuZGVuY2llcyBmb3IgdnVsbmVyYWJpbGl0aWVzOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrQ29tcG9zZXJBdWRpdCgkY29uZmlnKSk7CgokaW8tPndyaXRlKHNwcmludGYoJ0NvbXBvc2VyIHZlcnNpb246IDxjb21tZW50PiVzPC9jb21tZW50PicsIENvbXBvc2VyOjpnZXRWZXJzaW9uKCkpKTsKCiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICRjb25maWctPmdldCgncGxhdGZvcm0nKSA/OiBbXTsKJHBsYXRmb3JtUmVwbyA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRwbGF0Zm9ybU92ZXJyaWRlcyk7CiRwaHBQa2cgPSAkcGxhdGZvcm1SZXBvLT5maW5kUGFja2FnZSgncGhwJywgJyonKTsKJHBocFZlcnNpb24gPSAkcGhwUGtnLT5nZXRQcmV0dHlWZXJzaW9uKCk7CmlmICgkcGhwUGtnIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmIHN0cl9jb250YWlucygoc3RyaW5nKSAkcGhwUGtnLT5nZXREZXNjcmlwdGlvbigpLCAnb3ZlcnJpZGRlbicpKSB7CiRwaHBWZXJzaW9uIC49ICcgLSAnIC4gJHBocFBrZy0+Z2V0RGVzY3JpcHRpb24oKTsKfQoKJGlvLT53cml0ZShzcHJpbnRmKCdQSFAgdmVyc2lvbjogPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+JywgJHBocFZlcnNpb24pKTsKCmlmIChkZWZpbmVkKCdQSFBfQklOQVJZJykpIHsKJGlvLT53cml0ZShzcHJpbnRmKCdQSFAgYmluYXJ5IHBhdGg6IDxjb21tZW50PiVzPC9jb21tZW50PicsIFBIUF9CSU5BUlkpKTsKfQoKJGlvLT53cml0ZSgnT3BlblNTTCB2ZXJzaW9uOiAnIC4gKGRlZmluZWQoJ09QRU5TU0xfVkVSU0lPTl9URVhUJykgPyAnPGNvbW1lbnQ+Jy5PUEVOU1NMX1ZFUlNJT05fVEVYVC4nPC9jb21tZW50PicgOiAnPGVycm9yPm1pc3Npbmc8L2Vycm9yPicpKTsKJGlvLT53cml0ZSgnY3VybCB2ZXJzaW9uOiAnIC4gJHRoaXMtPmdldEN1cmxWZXJzaW9uKCkpOwoKJGZpbmRlciA9IG5ldyBFeGVjdXRhYmxlRmluZGVyOwokaGFzU3lzdGVtVW56aXAgPSAoYm9vbCkgJGZpbmRlci0+ZmluZCgndW56aXAnKTsKJGJpbjd6aXAgPSAnJzsKaWYgKCRoYXNTeXN0ZW03emlwID0gKGJvb2wpICRmaW5kZXItPmZpbmQoJzd6JywgbnVsbCwgWydDOlxQcm9ncmFtIEZpbGVzXDctWmlwJ10pKSB7CiRiaW43emlwID0gJzd6JzsKfQppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAhJGhhc1N5c3RlbTd6aXAgJiYgJGhhc1N5c3RlbTd6aXAgPSAoYm9vbCkgJGZpbmRlci0+ZmluZCgnN3p6JykpIHsKJGJpbjd6aXAgPSAnN3p6JzsKfQoKJGlvLT53cml0ZSgKJ3ppcDogJyAuIChleHRlbnNpb25fbG9hZGVkKCd6aXAnKSA/ICc8Y29tbWVudD5leHRlbnNpb24gcHJlc2VudDwvY29tbWVudD4nIDogJzxjb21tZW50PmV4dGVuc2lvbiBub3QgbG9hZGVkPC9jb21tZW50PicpCi4gJywgJyAuICgkaGFzU3lzdGVtVW56aXAgPyAnPGNvbW1lbnQ+dW56aXAgcHJlc2VudDwvY29tbWVudD4nIDogJzxjb21tZW50PnVuemlwIG5vdCBhdmFpbGFibGU8L2NvbW1lbnQ+JykKLiAnLCAnIC4gKCRoYXNTeXN0ZW03emlwID8gJzxjb21tZW50PjctWmlwIHByZXNlbnQgKCcuJGJpbjd6aXAuJyk8L2NvbW1lbnQ+JyA6ICc8Y29tbWVudD43LVppcCBub3QgYXZhaWxhYmxlPC9jb21tZW50PicpCi4gKCgkaGFzU3lzdGVtN3ppcCB8fCAkaGFzU3lzdGVtVW56aXApICYmICFmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpID8gJywgPHdhcm5pbmc+cHJvY19vcGVuIGlzIGRpc2FibGVkIG9yIG5vdCBwcmVzZW50LCB1bnppcC83LXogd2lsbCBub3QgYmUgdXNhYmxlPC93YXJuaW5nPicgOiAnJykKKTsKCnJldHVybiAkdGhpcy0+ZXhpdENvZGU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tDb21wb3NlclNjaGVtYSgpCnsKJHZhbGlkYXRvciA9IG5ldyBDb25maWdWYWxpZGF0b3IoJHRoaXMtPmdldElPKCkpOwpbJGVycm9ycywgLCAkd2FybmluZ3NdID0gJHZhbGlkYXRvci0+dmFsaWRhdGUoRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCkpOwoKaWYgKCRlcnJvcnMgfHwgJHdhcm5pbmdzKSB7CiRtZXNzYWdlcyA9IFsKJ2Vycm9yJyA9PiAkZXJyb3JzLAond2FybmluZycgPT4gJHdhcm5pbmdzLApdOwoKJG91dHB1dCA9ICcnOwpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJHN0eWxlID0+ICRtc2dzKSB7CmZvcmVhY2ggKCRtc2dzIGFzICRtc2cpIHsKJG91dHB1dCAuPSAnPCcgLiAkc3R5bGUgLiAnPicgLiAkbXNnIC4gJzwvJyAuICRzdHlsZSAuICc+JyAuIFBIUF9FT0w7Cn0KfQoKcmV0dXJuIHJ0cmltKCRvdXRwdXQpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0NvbXBvc2VyTG9ja1NjaGVtYShMb2NrZXIgJGxvY2tlcikKewokanNvbiA9ICRsb2NrZXItPmdldEpzb25GaWxlKCk7Cgp0cnkgewokanNvbi0+dmFsaWRhdGVTY2hlbWEoSnNvbkZpbGU6OkxPQ0tfU0NIRU1BKTsKfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKJG91dHB1dCA9ICcnOwpmb3JlYWNoICgkZS0+Z2V0RXJyb3JzKCkgYXMgJGVycm9yKSB7CiRvdXRwdXQgLj0gJzxlcnJvcj4nLiRlcnJvci4nPC9lcnJvcj4nLlBIUF9FT0w7Cn0KCnJldHVybiB0cmltKCRvdXRwdXQpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0dpdCgpOiBzdHJpbmcKewppZiAoIWZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpIHsKcmV0dXJuICc8Y29tbWVudD5wcm9jX29wZW4gaXMgbm90IGF2YWlsYWJsZSwgZ2l0IGNhbm5vdCBiZSB1c2VkPC9jb21tZW50Pic7Cn0KCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2NvbmZpZycsICdjb2xvci51aSddLCAkb3V0cHV0KTsKaWYgKHN0cnRvbG93ZXIodHJpbSgkb3V0cHV0KSkgPT09ICdhbHdheXMnKSB7CnJldHVybiAnPGNvbW1lbnQ+WW91ciBnaXQgY29sb3IudWkgc2V0dGluZyBpcyBzZXQgdG8gYWx3YXlzLCB0aGlzIGlzIGtub3duIHRvIGNyZWF0ZSBpc3N1ZXMuIFVzZSAiZ2l0IGNvbmZpZyAtLWdsb2JhbCBjb2xvci51aSB0cnVlIiB0byBzZXQgaXQgY29ycmVjdGx5LjwvY29tbWVudD4nOwp9CgokZ2l0VmVyc2lvbiA9IEdpdDo6Z2V0VmVyc2lvbigkdGhpcy0+cHJvY2Vzcyk7CmlmIChudWxsID09PSAkZ2l0VmVyc2lvbikgewpyZXR1cm4gJzxjb21tZW50Pk5vIGdpdCBwcm9jZXNzIGZvdW5kPC8+JzsKfQoKaWYgKHZlcnNpb25fY29tcGFyZSgnMi4yNC4wJywgJGdpdFZlcnNpb24sICc+JykpIHsKcmV0dXJuICc8d2FybmluZz5Zb3VyIGdpdCB2ZXJzaW9uICgnLiRnaXRWZXJzaW9uLicpIGlzIHRvbyBvbGQgYW5kIHBvc3NpYmx5IHdpbGwgY2F1c2UgaXNzdWVzLiBQbGVhc2UgdXBncmFkZSB0byBnaXQgMi4yNCBvciBhYm92ZTwvPic7Cn0KCnJldHVybiAnPGluZm8+T0s8Lz4gPGNvbW1lbnQ+Z2l0IHZlcnNpb24gJy4kZ2l0VmVyc2lvbi4nPC8+JzsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0h0dHAoc3RyaW5nICRwcm90bywgQ29uZmlnICRjb25maWcpCnsKJHJlc3VsdCA9ICR0aGlzLT5jaGVja0Nvbm5lY3Rpdml0eUFuZENvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCk7CmlmICgkcmVzdWx0ICE9PSB0cnVlKSB7CnJldHVybiAkcmVzdWx0Owp9CgokcmVzdWx0ID0gW107CmlmICgkcHJvdG8gPT09ICdodHRwcycgJiYgJGNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpID09PSB0cnVlKSB7CiR0bHNXYXJuaW5nID0gJzx3YXJuaW5nPkNvbXBvc2VyIGlzIGNvbmZpZ3VyZWQgdG8gZGlzYWJsZSBTU0wvVExTIHByb3RlY3Rpb24uIFRoaXMgd2lsbCBsZWF2ZSByZW1vdGUgSFRUUFMgcmVxdWVzdHMgdnVsbmVyYWJsZSB0byBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLjwvd2FybmluZz4nOwp9Cgp0cnkgewokdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkcHJvdG8gLiAnOi8vcmVwby5wYWNrYWdpc3Qub3JnL3BhY2thZ2VzLmpzb24nKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CiRoaW50cyA9IEh0dHBEb3dubG9hZGVyOjpnZXRFeGNlcHRpb25IaW50cygkZSk7CmlmIChudWxsICE9PSAkaGludHMgJiYgY291bnQoJGhpbnRzKSA+IDApIHsKZm9yZWFjaCAoJGhpbnRzIGFzICRoaW50KSB7CiRyZXN1bHRbXSA9ICRoaW50Owp9Cn0KCiRyZXN1bHRbXSA9ICc8ZXJyb3I+WycgLiBnZXRfY2xhc3MoJGUpIC4gJ10gJyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnPC9lcnJvcj4nOwp9CgppZiAoaXNzZXQoJHRsc1dhcm5pbmcpKSB7CiRyZXN1bHRbXSA9ICR0bHNXYXJuaW5nOwp9CgppZiAoY291bnQoJHJlc3VsdCkgPiAwKSB7CnJldHVybiAkcmVzdWx0Owp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0NvbXBvc2VyUmVwbyhzdHJpbmcgJHVybCwgQ29uZmlnICRjb25maWcpCnsKJHJlc3VsdCA9ICR0aGlzLT5jaGVja0Nvbm5lY3Rpdml0eUFuZENvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCk7CmlmICgkcmVzdWx0ICE9PSB0cnVlKSB7CnJldHVybiAkcmVzdWx0Owp9CgokcmVzdWx0ID0gW107CmlmIChzdHJfc3RhcnRzX3dpdGgoJHVybCwgJ2h0dHBzOi8vJykgJiYgJGNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpID09PSB0cnVlKSB7CiR0bHNXYXJuaW5nID0gJzx3YXJuaW5nPkNvbXBvc2VyIGlzIGNvbmZpZ3VyZWQgdG8gZGlzYWJsZSBTU0wvVExTIHByb3RlY3Rpb24uIFRoaXMgd2lsbCBsZWF2ZSByZW1vdGUgSFRUUFMgcmVxdWVzdHMgdnVsbmVyYWJsZSB0byBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLjwvd2FybmluZz4nOwp9Cgp0cnkgewokdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkdXJsKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CiRoaW50cyA9IEh0dHBEb3dubG9hZGVyOjpnZXRFeGNlcHRpb25IaW50cygkZSk7CmlmIChudWxsICE9PSAkaGludHMgJiYgY291bnQoJGhpbnRzKSA+IDApIHsKZm9yZWFjaCAoJGhpbnRzIGFzICRoaW50KSB7CiRyZXN1bHRbXSA9ICRoaW50Owp9Cn0KCiRyZXN1bHRbXSA9ICc8ZXJyb3I+WycgLiBnZXRfY2xhc3MoJGUpIC4gJ10gJyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnPC9lcnJvcj4nOwp9CgppZiAoaXNzZXQoJHRsc1dhcm5pbmcpKSB7CiRyZXN1bHRbXSA9ICR0bHNXYXJuaW5nOwp9CgppZiAoY291bnQoJHJlc3VsdCkgPiAwKSB7CnJldHVybiAkcmVzdWx0Owp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0h0dHBQcm94eShSZXF1ZXN0UHJveHkgJHByb3h5LCBzdHJpbmcgJHByb3RvY29sKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHlBbmRDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKdHJ5IHsKJHByb3h5U3RhdHVzID0gJHByb3h5LT5nZXRTdGF0dXMoKTsKCmlmICgkcHJveHktPmlzRXhjbHVkZWRCeU5vUHJveHkoKSkgewpyZXR1cm4gJzxpbmZvPlNLSVA8Lz4gPGNvbW1lbnQ+QmVjYXVzZSByZXBvLnBhY2thZ2lzdC5vcmcgaXMgJy4kcHJveHlTdGF0dXMuJzwvPic7Cn0KCiRqc29uID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHByb3RvY29sLic6Ly9yZXBvLnBhY2thZ2lzdC5vcmcvcGFja2FnZXMuanNvbicpLT5kZWNvZGVKc29uKCk7CmlmIChpc3NldCgkanNvblsncHJvdmlkZXItaW5jbHVkZXMnXSkpIHsKJGhhc2ggPSByZXNldCgkanNvblsncHJvdmlkZXItaW5jbHVkZXMnXSk7CiRoYXNoID0gJGhhc2hbJ3NoYTI1NiddOwokcGF0aCA9IHN0cl9yZXBsYWNlKCclaGFzaCUnLCAkaGFzaCwga2V5KCRqc29uWydwcm92aWRlci1pbmNsdWRlcyddKSk7CiRwcm92aWRlciA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCRwcm90b2NvbC4nOi8vcmVwby5wYWNrYWdpc3Qub3JnLycuJHBhdGgpLT5nZXRCb2R5KCk7CgppZiAoaGFzaCgnc2hhMjU2JywgJHByb3ZpZGVyKSAhPT0gJGhhc2gpIHsKcmV0dXJuICc8d2FybmluZz5JdCBzZWVtcyB0aGF0IHlvdXIgcHJveHkgKCcuJHByb3h5U3RhdHVzLicpIGlzIG1vZGlmeWluZyAnLiRwcm90b2NvbC4nIHRyYWZmaWMgb24gdGhlIGZseTwvPic7Cn0KfQoKcmV0dXJuICc8aW5mbz5PSzwvPiA8Y29tbWVudD4nLiRwcm94eVN0YXR1cy4nPC8+JzsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewpyZXR1cm4gJGU7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0dpdGh1Yk9hdXRoKHN0cmluZyAkZG9tYWluLCBzdHJpbmcgJHRva2VuKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHlBbmRDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKJHRoaXMtPmdldElPKCktPnNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sICR0b2tlbiwgJ3gtb2F1dGgtYmFzaWMnKTsKdHJ5IHsKJHVybCA9ICRkb21haW4gPT09ICdnaXRodWIuY29tJyA/ICdodHRwczovL2FwaS4nLiRkb21haW4uJy8nIDogJ2h0dHBzOi8vJy4kZG9tYWluLicvYXBpL3YzLyc7CgokcmVzcG9uc2UgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkdXJsLCBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLApdKTsKCiRleHBpcmF0aW9uID0gJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2dpdGh1Yi1hdXRoZW50aWNhdGlvbi10b2tlbi1leHBpcmF0aW9uJyk7CgppZiAoJGV4cGlyYXRpb24gPT09IG51bGwpIHsKcmV0dXJuICc8aW5mbz5PSzwvPiA8Y29tbWVudD5kb2VzIG5vdCBleHBpcmU8Lz4nOwp9CgpyZXR1cm4gJzxpbmZvPk9LPC8+IDxjb21tZW50PmV4cGlyZXMgb24gJy4gJGV4cGlyYXRpb24gLic8Lz4nOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkZS0+Z2V0Q29kZSgpID09PSA0MDEpIHsKcmV0dXJuICc8Y29tbWVudD5UaGUgb2F1dGggdG9rZW4gZm9yICcuJGRvbWFpbi4nIHNlZW1zIGludmFsaWQsIHJ1biAiY29tcG9zZXIgY29uZmlnIC0tZ2xvYmFsIC0tdW5zZXQgZ2l0aHViLW9hdXRoLicuJGRvbWFpbi4nIiB0byByZW1vdmUgaXQ8L2NvbW1lbnQ+JzsKfQoKcmV0dXJuICRlOwp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRHaXRodWJSYXRlTGltaXQoc3RyaW5nICRkb21haW4sID9zdHJpbmcgJHRva2VuID0gbnVsbCkKewokcmVzdWx0ID0gJHRoaXMtPmNoZWNrQ29ubmVjdGl2aXR5QW5kQ29tcG9zZXJOZXR3b3JrSHR0cEVuYWJsZW1lbnQoKTsKaWYgKCRyZXN1bHQgIT09IHRydWUpIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCmlmICgkdG9rZW4pIHsKJHRoaXMtPmdldElPKCktPnNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sICR0b2tlbiwgJ3gtb2F1dGgtYmFzaWMnKTsKfQoKJHVybCA9ICRkb21haW4gPT09ICdnaXRodWIuY29tJyA/ICdodHRwczovL2FwaS4nLiRkb21haW4uJy9yYXRlX2xpbWl0JyA6ICdodHRwczovLycuJGRvbWFpbi4nL2FwaS9yYXRlX2xpbWl0JzsKJGRhdGEgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkdXJsLCBbJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2VdKS0+ZGVjb2RlSnNvbigpOwoKcmV0dXJuICRkYXRhWydyZXNvdXJjZXMnXVsnY29yZSddOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrRGlza1NwYWNlKENvbmZpZyAkY29uZmlnKQp7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdkaXNrX2ZyZWVfc3BhY2UnKSkgewpyZXR1cm4gdHJ1ZTsKfQoKJG1pblNwYWNlRnJlZSA9IDEwMjQgKiAxMDI0OwppZiAoKCgkZGYgPSBAZGlza19mcmVlX3NwYWNlKCRkaXIgPSAkY29uZmlnLT5nZXQoJ2hvbWUnKSkpICE9PSBmYWxzZSAmJiAkZGYgPCAkbWluU3BhY2VGcmVlKQp8fCAoKCRkZiA9IEBkaXNrX2ZyZWVfc3BhY2UoJGRpciA9ICRjb25maWctPmdldCgndmVuZG9yLWRpcicpKSkgIT09IGZhbHNlICYmICRkZiA8ICRtaW5TcGFjZUZyZWUpCikgewpyZXR1cm4gJzxlcnJvcj5UaGUgZGlzayBob3N0aW5nICcuJGRpci4nIGlzIGZ1bGw8L2Vycm9yPic7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrUHViS2V5cyhDb25maWcgJGNvbmZpZykKewokaG9tZSA9ICRjb25maWctPmdldCgnaG9tZScpOwokZXJyb3JzID0gW107CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKaWYgKGZpbGVfZXhpc3RzKCRob21lLicva2V5cy50YWdzLnB1YicpICYmIGZpbGVfZXhpc3RzKCRob21lLicva2V5cy5kZXYucHViJykpIHsKJGlvLT53cml0ZSgnJyk7Cn0KCmlmIChmaWxlX2V4aXN0cygkaG9tZS4nL2tleXMudGFncy5wdWInKSkgewokaW8tPndyaXRlKCdUYWdzIFB1YmxpYyBLZXkgRmluZ2VycHJpbnQ6ICcgLiBLZXlzOjpmaW5nZXJwcmludCgkaG9tZS4nL2tleXMudGFncy5wdWInKSk7Cn0gZWxzZSB7CiRlcnJvcnNbXSA9ICc8ZXJyb3I+TWlzc2luZyBwdWJrZXkgZm9yIHRhZ3MgdmVyaWZpY2F0aW9uPC9lcnJvcj4nOwp9CgppZiAoZmlsZV9leGlzdHMoJGhvbWUuJy9rZXlzLmRldi5wdWInKSkgewokaW8tPndyaXRlKCdEZXYgUHVibGljIEtleSBGaW5nZXJwcmludDogJyAuIEtleXM6OmZpbmdlcnByaW50KCRob21lLicva2V5cy5kZXYucHViJykpOwp9IGVsc2UgewokZXJyb3JzW10gPSAnPGVycm9yPk1pc3NpbmcgcHVia2V5IGZvciBkZXYgdmVyaWZpY2F0aW9uPC9lcnJvcj4nOwp9CgppZiAoJGVycm9ycykgewokZXJyb3JzW10gPSAnPGVycm9yPlJ1biBjb21wb3NlciBzZWxmLXVwZGF0ZSAtLXVwZGF0ZS1rZXlzIHRvIHNldCB0aGVtIHVwPC9lcnJvcj4nOwp9CgpyZXR1cm4gJGVycm9ycyA/OiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrVmVyc2lvbihDb25maWcgJGNvbmZpZykKewokcmVzdWx0ID0gJHRoaXMtPmNoZWNrQ29ubmVjdGl2aXR5QW5kQ29tcG9zZXJOZXR3b3JrSHR0cEVuYWJsZW1lbnQoKTsKaWYgKCRyZXN1bHQgIT09IHRydWUpIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCiR2ZXJzaW9uc1V0aWwgPSBuZXcgVmVyc2lvbnMoJGNvbmZpZywgJHRoaXMtPmh0dHBEb3dubG9hZGVyKTsKdHJ5IHsKJGxhdGVzdCA9ICR2ZXJzaW9uc1V0aWwtPmdldExhdGVzdCgpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnJldHVybiAkZTsKfQoKaWYgKENvbXBvc2VyOjpWRVJTSU9OICE9PSAkbGF0ZXN0Wyd2ZXJzaW9uJ10gJiYgQ29tcG9zZXI6OlZFUlNJT04gIT09ICdAcGFja2FnZV92ZXJzaW9uQCcpIHsKcmV0dXJuICc8Y29tbWVudD5Zb3UgYXJlIG5vdCBydW5uaW5nIHRoZSBsYXRlc3QgJy4kdmVyc2lvbnNVdGlsLT5nZXRDaGFubmVsKCkuJyB2ZXJzaW9uLCBydW4gYGNvbXBvc2VyIHNlbGYtdXBkYXRlYCB0byB1cGRhdGUgKCcuQ29tcG9zZXI6OlZFUlNJT04uJyA9PiAnLiRsYXRlc3RbJ3ZlcnNpb24nXS4nKTwvY29tbWVudD4nOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0NvbXBvc2VyQXVkaXQoQ29uZmlnICRjb25maWcpCnsKJHJlc3VsdCA9ICR0aGlzLT5jaGVja0Nvbm5lY3Rpdml0eUFuZENvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCk7CmlmICgkcmVzdWx0ICE9PSB0cnVlKSB7CnJldHVybiAkcmVzdWx0Owp9CgokYXVkaXRvciA9IG5ldyBBdWRpdG9yKCk7CiRyZXBvU2V0ID0gbmV3IFJlcG9zaXRvcnlTZXQoKTsKJGluc3RhbGxlZEpzb24gPSBuZXcgSnNvbkZpbGUoX19ESVJfXyAuICcvLi4vLi4vLi4vdmVuZG9yL2NvbXBvc2VyL2luc3RhbGxlZC5qc29uJyk7CmlmICghJGluc3RhbGxlZEpzb24tPmV4aXN0cygpKSB7CnJldHVybiAnPHdhcm5pbmc+Q291bGQgbm90IGZpbmQgQ29tcG9zZXJcJ3MgaW5zdGFsbGVkLmpzb24sIHRoaXMgbXVzdCBiZSBhIG5vbi1zdGFuZGFyZCBDb21wb3NlciBpbnN0YWxsYXRpb24uPC8+JzsKfQoKJGxvY2FsUmVwbyA9IG5ldyBGaWxlc3lzdGVtUmVwb3NpdG9yeSgkaW5zdGFsbGVkSnNvbik7CiR2ZXJzaW9uID0gQ29tcG9zZXI6OmdldFZlcnNpb24oKTsKJHBhY2thZ2VzID0gJGxvY2FsUmVwby0+Z2V0Q2Fub25pY2FsUGFja2FnZXMoKTsKaWYgKCR2ZXJzaW9uICE9PSAnQHBhY2thZ2VfdmVyc2lvbkAnKSB7CiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJG5vcm1hbGl6ZWRWZXJzaW9uID0gJHZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkdmVyc2lvbik7CiRyb290UGtnID0gbmV3IFJvb3RQYWNrYWdlKCdjb21wb3Nlci9jb21wb3NlcicsICRub3JtYWxpemVkVmVyc2lvbiwgJHZlcnNpb24pOwokcGFja2FnZXNbXSA9ICRyb290UGtnOwp9CiRyZXBvU2V0LT5hZGRSZXBvc2l0b3J5KG5ldyBDb21wb3NlclJlcG9zaXRvcnkoWyd0eXBlJyA9PiAnY29tcG9zZXInLCAndXJsJyA9PiAnaHR0cHM6Ly9wYWNrYWdpc3Qub3JnJ10sIG5ldyBOdWxsSU8oKSwgJGNvbmZpZywgJHRoaXMtPmh0dHBEb3dubG9hZGVyKSk7Cgp0cnkgewokaW8gPSBuZXcgQnVmZmVySU8oKTsKJHJlc3VsdCA9ICRhdWRpdG9yLT5hdWRpdCgkaW8sICRyZXBvU2V0LCAkcGFja2FnZXMsIEF1ZGl0b3I6OkZPUk1BVF9UQUJMRSwgdHJ1ZSwgW10sIEF1ZGl0b3I6OkFCQU5ET05FRF9JR05PUkUpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CnJldHVybiAnPGhpZ2hsaWdodD5GYWlsZWQgcGVyZm9ybWluZyBhdWRpdDogJy4kZS0+Z2V0TWVzc2FnZSgpLic8Lz4nOwp9CgppZiAoJHJlc3VsdCA+IDApIHsKcmV0dXJuICc8aGlnaGxpZ2h0PkF1ZGl0IGZvdW5kIHNvbWUgaXNzdWVzOjwvPicgLiBQSFBfRU9MIC4gJGlvLT5nZXRPdXRwdXQoKTsKfQoKcmV0dXJuIHRydWU7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q3VybFZlcnNpb24oKTogc3RyaW5nCnsKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ2N1cmwnKSkgewppZiAoIUh0dHBEb3dubG9hZGVyOjppc0N1cmxFbmFibGVkKCkpIHsKcmV0dXJuICc8ZXJyb3I+ZGlzYWJsZWQgdmlhIGRpc2FibGVfZnVuY3Rpb25zLCB1c2luZyBwaHAgc3RyZWFtcyBmYWxsYmFjaywgd2hpY2ggcmVkdWNlcyBwZXJmb3JtYW5jZTwvZXJyb3I+JzsKfQoKJHZlcnNpb24gPSBjdXJsX3ZlcnNpb24oKTsKJGhhc1pzdGQgPSBpc3NldCgkdmVyc2lvblsnZmVhdHVyZXMnXSkgJiYgZGVmaW5lZCgnQ1VSTF9WRVJTSU9OX1pTVEQnKSAmJiAwICE9PSAoJHZlcnNpb25bJ2ZlYXR1cmVzJ10gJiBDVVJMX1ZFUlNJT05fWlNURCk7CgpyZXR1cm4gJzxjb21tZW50PicuJHZlcnNpb25bJ3ZlcnNpb24nXS4nPC9jb21tZW50PiAnLgonbGlieiA8Y29tbWVudD4nLigkdmVyc2lvblsnbGliel92ZXJzaW9uJ10gPz8gJ21pc3NpbmcnKS4nPC9jb21tZW50PiAnLgonYnJvdGxpIDxjb21tZW50PicuKCR2ZXJzaW9uWydicm90bGlfdmVyc2lvbiddID8/ICdtaXNzaW5nJykuJzwvY29tbWVudD4gJy4KJ3pzdGQgPGNvbW1lbnQ+Jy4oJGhhc1pzdGQgPyAnc3VwcG9ydGVkJyA6ICdtaXNzaW5nJykuJzwvY29tbWVudD4gJy4KJ3NzbCA8Y29tbWVudD4nLigkdmVyc2lvblsnc3NsX3ZlcnNpb24nXSA/PyAnbWlzc2luZycpLic8L2NvbW1lbnQ+JzsKfQoKcmV0dXJuICc8ZXJyb3I+bWlzc2luZywgdXNpbmcgcGhwIHN0cmVhbXMgZmFsbGJhY2ssIHdoaWNoIHJlZHVjZXMgcGVyZm9ybWFuY2U8L2Vycm9yPic7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0UmVzdWx0KCRyZXN1bHQpOiB2b2lkCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CmlmICh0cnVlID09PSAkcmVzdWx0KSB7CiRpby0+d3JpdGUoJzxpbmZvPk9LPC9pbmZvPicpOwoKcmV0dXJuOwp9CgokaGFkRXJyb3IgPSBmYWxzZTsKJGhhZFdhcm5pbmcgPSBmYWxzZTsKaWYgKCRyZXN1bHQgaW5zdGFuY2VvZiBcRXhjZXB0aW9uKSB7CiRyZXN1bHQgPSAnPGVycm9yPlsnLmdldF9jbGFzcygkcmVzdWx0KS4nXSAnLiRyZXN1bHQtPmdldE1lc3NhZ2UoKS4nPC9lcnJvcj4nOwp9CgppZiAoISRyZXN1bHQpIHsKCiRoYWRFcnJvciA9IHRydWU7Cn0gZWxzZSB7CmlmICghaXNfYXJyYXkoJHJlc3VsdCkpIHsKJHJlc3VsdCA9IFskcmVzdWx0XTsKfQpmb3JlYWNoICgkcmVzdWx0IGFzICRtZXNzYWdlKSB7CmlmIChmYWxzZSAhPT0gc3RycG9zKCRtZXNzYWdlLCAnPGVycm9yPicpKSB7CiRoYWRFcnJvciA9IHRydWU7Cn0gZWxzZWlmIChmYWxzZSAhPT0gc3RycG9zKCRtZXNzYWdlLCAnPHdhcm5pbmc+JykpIHsKJGhhZFdhcm5pbmcgPSB0cnVlOwp9Cn0KfQoKaWYgKCRoYWRFcnJvcikgewokaW8tPndyaXRlKCc8ZXJyb3I+RkFJTDwvZXJyb3I+Jyk7CiR0aGlzLT5leGl0Q29kZSA9IG1heCgkdGhpcy0+ZXhpdENvZGUsIDIpOwp9IGVsc2VpZiAoJGhhZFdhcm5pbmcpIHsKJGlvLT53cml0ZSgnPHdhcm5pbmc+V0FSTklORzwvd2FybmluZz4nKTsKJHRoaXMtPmV4aXRDb2RlID0gbWF4KCR0aGlzLT5leGl0Q29kZSwgMSk7Cn0KCmlmICgkcmVzdWx0KSB7CmZvcmVhY2ggKCRyZXN1bHQgYXMgJG1lc3NhZ2UpIHsKJGlvLT53cml0ZSh0cmltKCRtZXNzYWdlKSk7Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrUGxhdGZvcm0oKQp7CiRvdXRwdXQgPSAnJzsKJG91dCA9IHN0YXRpYyBmdW5jdGlvbiAoJG1zZywgJHN0eWxlKSB1c2UgKCYkb3V0cHV0KTogdm9pZCB7CiRvdXRwdXQgLj0gJzwnLiRzdHlsZS4nPicuJG1zZy4nPC8nLiRzdHlsZS4nPicuUEhQX0VPTDsKfTsKCgokZXJyb3JzID0gW107CiR3YXJuaW5ncyA9IFtdOwokZGlzcGxheUluaU1lc3NhZ2UgPSBmYWxzZTsKCiRpbmlNZXNzYWdlID0gUEhQX0VPTC5QSFBfRU9MLkluaUhlbHBlcjo6Z2V0TWVzc2FnZSgpOwokaW5pTWVzc2FnZSAuPSBQSFBfRU9MLidJZiB5b3UgY2FuIG5vdCBtb2RpZnkgdGhlIGluaSBmaWxlLCB5b3UgY2FuIGFsc28gcnVuIGBwaHAgLWQgb3B0aW9uPXZhbHVlYCB0byBtb2RpZnkgaW5pIHZhbHVlcyBvbiB0aGUgZmx5LiBZb3UgY2FuIHVzZSAtZCBtdWx0aXBsZSB0aW1lcy4nOwoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2pzb25fZGVjb2RlJykpIHsKJGVycm9yc1snanNvbiddID0gdHJ1ZTsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdQaGFyJykpIHsKJGVycm9yc1sncGhhciddID0gdHJ1ZTsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdmaWx0ZXInKSkgewokZXJyb3JzWydmaWx0ZXInXSA9IHRydWU7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnaGFzaCcpKSB7CiRlcnJvcnNbJ2hhc2gnXSA9IHRydWU7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnaWNvbnYnKSAmJiAhZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSkgewokZXJyb3JzWydpY29udl9tYnN0cmluZyddID0gdHJ1ZTsKfQoKaWYgKCFmaWx0ZXJfdmFyKGluaV9nZXQoJ2FsbG93X3VybF9mb3BlbicpLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTikpIHsKJGVycm9yc1snYWxsb3dfdXJsX2ZvcGVuJ10gPSB0cnVlOwp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnaW9uQ3ViZSBMb2FkZXInKSAmJiBpb25jdWJlX2xvYWRlcl9pdmVyc2lvbigpIDwgNDAwMDkpIHsKJGVycm9yc1snaW9uY3ViZSddID0gaW9uY3ViZV9sb2FkZXJfdmVyc2lvbigpOwp9CgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgNzAyMDUpIHsKJGVycm9yc1sncGhwJ10gPSBQSFBfVkVSU0lPTjsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpIHsKJGVycm9yc1snb3BlbnNzbCddID0gdHJ1ZTsKfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSAmJiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgxMDAwMTAwZikgewokd2FybmluZ3NbJ29wZW5zc2xfdmVyc2lvbiddID0gdHJ1ZTsKfQoKaWYgKCFkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSAmJiAhZXh0ZW5zaW9uX2xvYWRlZCgnYXBjdScpICYmIGZpbHRlcl92YXIoaW5pX2dldCgnYXBjLmVuYWJsZV9jbGknKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pKSB7CiR3YXJuaW5nc1snYXBjX2NsaSddID0gdHJ1ZTsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCd6bGliJykpIHsKJHdhcm5pbmdzWyd6bGliJ10gPSB0cnVlOwp9CgpvYl9zdGFydCgpOwpwaHBpbmZvKElORk9fR0VORVJBTCk7CiRwaHBpbmZvID0gb2JfZ2V0X2NsZWFuKCk7CmlmIChpc19zdHJpbmcoJHBocGluZm8pICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3tDb25maWd1cmUgQ29tbWFuZCg/OiAqPC90ZD48dGQgY2xhc3M9InYiPnwgKj0+ICopKC4qPykoPzo8L3RkPnwkKX1tJywgJHBocGluZm8sICRtYXRjaCkpIHsKJGNvbmZpZ3VyZSA9ICRtYXRjaFsxXTsKCmlmIChzdHJfY29udGFpbnMoJGNvbmZpZ3VyZSwgJy0tZW5hYmxlLXNpZ2NoaWxkJykpIHsKJHdhcm5pbmdzWydzaWdjaGlsZCddID0gdHJ1ZTsKfQoKaWYgKHN0cl9jb250YWlucygkY29uZmlndXJlLCAnLS13aXRoLWN1cmx3cmFwcGVycycpKSB7CiR3YXJuaW5nc1snY3VybHdyYXBwZXJzJ10gPSB0cnVlOwp9Cn0KCmlmIChmaWx0ZXJfdmFyKGluaV9nZXQoJ3hkZWJ1Zy5wcm9maWxlcl9lbmFibGVkJyksIEZJTFRFUl9WQUxJREFURV9CT09MRUFOKSkgewokd2FybmluZ3NbJ3hkZWJ1Z19wcm9maWxlJ10gPSB0cnVlOwp9IGVsc2VpZiAoWGRlYnVnSGFuZGxlcjo6aXNYZGVidWdBY3RpdmUoKSkgewokd2FybmluZ3NbJ3hkZWJ1Z19sb2FkZWQnXSA9IHRydWU7Cn0KCmlmIChkZWZpbmVkKCdQSFBfV0lORE9XU19WRVJTSU9OX0JVSUxEJykKJiYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzcuMi4yMycsICc8JykKfHwgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzcuMy4wJywgJz49JykKJiYgdmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNy4zLjEwJywgJzwnKSkpKSB7CiR3YXJuaW5nc1snb25lZHJpdmUnXSA9IFBIUF9WRVJTSU9OOwp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgndW9weicpCiYmICEoZmlsdGVyX3ZhcihpbmlfZ2V0KCd1b3B6LmRpc2FibGUnKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pCnx8IGZpbHRlcl92YXIoaW5pX2dldCgndW9wei5leGl0JyksIEZJTFRFUl9WQUxJREFURV9CT09MRUFOKSkpIHsKJHdhcm5pbmdzWyd1b3B6J10gPSB0cnVlOwp9CgppZiAoIWVtcHR5KCRlcnJvcnMpKSB7CmZvcmVhY2ggKCRlcnJvcnMgYXMgJGVycm9yID0+ICRjdXJyZW50KSB7CnN3aXRjaCAoJGVycm9yKSB7CmNhc2UgJ2pzb24nOgokdGV4dCA9IFBIUF9FT0wuIlRoZSBqc29uIGV4dGVuc2lvbiBpcyBtaXNzaW5nLiIuUEhQX0VPTDsKJHRleHQgLj0gIkluc3RhbGwgaXQgb3IgcmVjb21waWxlIHBocCB3aXRob3V0IC0tZGlzYWJsZS1qc29uIjsKYnJlYWs7CgpjYXNlICdwaGFyJzoKJHRleHQgPSBQSFBfRU9MLiJUaGUgcGhhciBleHRlbnNpb24gaXMgbWlzc2luZy4iLlBIUF9FT0w7CiR0ZXh0IC49ICJJbnN0YWxsIGl0IG9yIHJlY29tcGlsZSBwaHAgd2l0aG91dCAtLWRpc2FibGUtcGhhciI7CmJyZWFrOwoKY2FzZSAnZmlsdGVyJzoKJHRleHQgPSBQSFBfRU9MLiJUaGUgZmlsdGVyIGV4dGVuc2lvbiBpcyBtaXNzaW5nLiIuUEhQX0VPTDsKJHRleHQgLj0gIkluc3RhbGwgaXQgb3IgcmVjb21waWxlIHBocCB3aXRob3V0IC0tZGlzYWJsZS1maWx0ZXIiOwpicmVhazsKCmNhc2UgJ2hhc2gnOgokdGV4dCA9IFBIUF9FT0wuIlRoZSBoYXNoIGV4dGVuc2lvbiBpcyBtaXNzaW5nLiIuUEhQX0VPTDsKJHRleHQgLj0gIkluc3RhbGwgaXQgb3IgcmVjb21waWxlIHBocCB3aXRob3V0IC0tZGlzYWJsZS1oYXNoIjsKYnJlYWs7CgpjYXNlICdpY29udl9tYnN0cmluZyc6CiR0ZXh0ID0gUEhQX0VPTC4iVGhlIGljb252IE9SIG1ic3RyaW5nIGV4dGVuc2lvbiBpcyByZXF1aXJlZCBhbmQgYm90aCBhcmUgbWlzc2luZy4iLlBIUF9FT0w7CiR0ZXh0IC49ICJJbnN0YWxsIGVpdGhlciBvZiB0aGVtIG9yIHJlY29tcGlsZSBwaHAgd2l0aG91dCAtLWRpc2FibGUtaWNvbnYiOwpicmVhazsKCmNhc2UgJ3BocCc6CiR0ZXh0ID0gUEhQX0VPTC4iWW91ciBQSFAgKHskY3VycmVudH0pIGlzIHRvbyBvbGQsIHlvdSBtdXN0IHVwZ3JhZGUgdG8gUEhQIDcuMi41IG9yIGhpZ2hlci4iOwpicmVhazsKCmNhc2UgJ2FsbG93X3VybF9mb3Blbic6CiR0ZXh0ID0gUEhQX0VPTC4iVGhlIGFsbG93X3VybF9mb3BlbiBzZXR0aW5nIGlzIGluY29ycmVjdC4iLlBIUF9FT0w7CiR0ZXh0IC49ICJBZGQgdGhlIGZvbGxvd2luZyB0byB0aGUgZW5kIG9mIHlvdXIgYHBocC5pbmlgOiIuUEhQX0VPTDsKJHRleHQgLj0gIiAgICBhbGxvd191cmxfZm9wZW4gPSBPbiI7CiRkaXNwbGF5SW5pTWVzc2FnZSA9IHRydWU7CmJyZWFrOwoKY2FzZSAnaW9uY3ViZSc6CiR0ZXh0ID0gUEhQX0VPTC4iWW91ciBpb25DdWJlIExvYWRlciBleHRlbnNpb24gKCRjdXJyZW50KSBpcyBpbmNvbXBhdGlibGUgd2l0aCBQaGFyIGZpbGVzLiIuUEhQX0VPTDsKJHRleHQgLj0gIlVwZ3JhZGUgdG8gaW9uQ3ViZSA0LjAuOSBvciBoaWdoZXIgb3IgcmVtb3ZlIHRoaXMgbGluZSAocGF0aCBtYXkgYmUgZGlmZmVyZW50KSBmcm9tIHlvdXIgYHBocC5pbmlgIHRvIGRpc2FibGUgaXQ6Ii5QSFBfRU9MOwokdGV4dCAuPSAiICAgIHplbmRfZXh0ZW5zaW9uID0gL3Vzci9saWIvcGhwNS8yMDA5MDYyNitsZnMvaW9uY3ViZV9sb2FkZXJfbGluXzUuMy5zbyI7CiRkaXNwbGF5SW5pTWVzc2FnZSA9IHRydWU7CmJyZWFrOwoKY2FzZSAnb3BlbnNzbCc6CiR0ZXh0ID0gUEhQX0VPTC4iVGhlIG9wZW5zc2wgZXh0ZW5zaW9uIGlzIG1pc3NpbmcsIHdoaWNoIG1lYW5zIHRoYXQgc2VjdXJlIEhUVFBTIHRyYW5zZmVycyBhcmUgaW1wb3NzaWJsZS4iLlBIUF9FT0w7CiR0ZXh0IC49ICJJZiBwb3NzaWJsZSB5b3Ugc2hvdWxkIGVuYWJsZSBpdCBvciByZWNvbXBpbGUgcGhwIHdpdGggLS13aXRoLW9wZW5zc2wiOwpicmVhazsKCmRlZmF1bHQ6CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoIkRpYWdub3NlQ29tbWFuZDogVW5rbm93biBlcnJvciB0eXBlIFwiJXNcIi4gUGxlYXNlIHJlcG9ydCBhdCBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY29tcG9zZXIvaXNzdWVzL25ldy4iLCAkZXJyb3IpKTsKfQokb3V0KCR0ZXh0LCAnZXJyb3InKTsKfQoKJG91dHB1dCAuPSBQSFBfRU9MOwp9CgppZiAoIWVtcHR5KCR3YXJuaW5ncykpIHsKZm9yZWFjaCAoJHdhcm5pbmdzIGFzICR3YXJuaW5nID0+ICRjdXJyZW50KSB7CnN3aXRjaCAoJHdhcm5pbmcpIHsKY2FzZSAnYXBjX2NsaSc6CiR0ZXh0ID0gIlRoZSBhcGMuZW5hYmxlX2NsaSBzZXR0aW5nIGlzIGluY29ycmVjdC4iLlBIUF9FT0w7CiR0ZXh0IC49ICJBZGQgdGhlIGZvbGxvd2luZyB0byB0aGUgZW5kIG9mIHlvdXIgYHBocC5pbmlgOiIuUEhQX0VPTDsKJHRleHQgLj0gIiAgYXBjLmVuYWJsZV9jbGkgPSBPZmYiOwokZGlzcGxheUluaU1lc3NhZ2UgPSB0cnVlOwpicmVhazsKCmNhc2UgJ3psaWInOgokdGV4dCA9ICdUaGUgemxpYiBleHRlbnNpb24gaXMgbm90IGxvYWRlZCwgdGhpcyBjYW4gc2xvdyBkb3duIENvbXBvc2VyIGEgbG90LicuUEhQX0VPTDsKJHRleHQgLj0gJ0lmIHBvc3NpYmxlLCBlbmFibGUgaXQgb3IgcmVjb21waWxlIHBocCB3aXRoIC0td2l0aC16bGliJy5QSFBfRU9MOwokZGlzcGxheUluaU1lc3NhZ2UgPSB0cnVlOwpicmVhazsKCmNhc2UgJ3NpZ2NoaWxkJzoKJHRleHQgPSAiUEhQIHdhcyBjb21waWxlZCB3aXRoIC0tZW5hYmxlLXNpZ2NoaWxkIHdoaWNoIGNhbiBjYXVzZSBpc3N1ZXMgb24gc29tZSBwbGF0Zm9ybXMuIi5QSFBfRU9MOwokdGV4dCAuPSAiUmVjb21waWxlIGl0IHdpdGhvdXQgdGhpcyBmbGFnIGlmIHBvc3NpYmxlLCBzZWUgYWxzbzoiLlBIUF9FT0w7CiR0ZXh0IC49ICIgIGh0dHBzOi8vYnVncy5waHAubmV0L2J1Zy5waHA/aWQ9MjI5OTkiOwpicmVhazsKCmNhc2UgJ2N1cmx3cmFwcGVycyc6CiR0ZXh0ID0gIlBIUCB3YXMgY29tcGlsZWQgd2l0aCAtLXdpdGgtY3VybHdyYXBwZXJzIHdoaWNoIHdpbGwgY2F1c2UgaXNzdWVzIHdpdGggSFRUUCBhdXRoZW50aWNhdGlvbiBhbmQgR2l0SHViLiIuUEhQX0VPTDsKJHRleHQgLj0gIiBSZWNvbXBpbGUgaXQgd2l0aG91dCB0aGlzIGZsYWcgaWYgcG9zc2libGUiOwpicmVhazsKCmNhc2UgJ29wZW5zc2xfdmVyc2lvbic6Cgokb3BlbnNzbFZlcnNpb24gPSBzdHJzdHIodHJpbShzdHJzdHIoT1BFTlNTTF9WRVJTSU9OX1RFWFQsICcgJykpLCAnICcsIHRydWUpOwokb3BlbnNzbFZlcnNpb24gPSAkb3BlbnNzbFZlcnNpb24gPzogT1BFTlNTTF9WRVJTSU9OX1RFWFQ7CgokdGV4dCA9ICJUaGUgT3BlblNTTCBsaWJyYXJ5ICh7JG9wZW5zc2xWZXJzaW9ufSkgdXNlZCBieSBQSFAgZG9lcyBub3Qgc3VwcG9ydCBUTFN2MS4yIG9yIFRMU3YxLjEuIi5QSFBfRU9MOwokdGV4dCAuPSAiSWYgcG9zc2libGUgeW91IHNob3VsZCB1cGdyYWRlIE9wZW5TU0wgdG8gdmVyc2lvbiAxLjAuMSBvciBhYm92ZS4iOwpicmVhazsKCmNhc2UgJ3hkZWJ1Z19sb2FkZWQnOgokdGV4dCA9ICJUaGUgeGRlYnVnIGV4dGVuc2lvbiBpcyBsb2FkZWQsIHRoaXMgY2FuIHNsb3cgZG93biBDb21wb3NlciBhIGxpdHRsZS4iLlBIUF9FT0w7CiR0ZXh0IC49ICIgRGlzYWJsaW5nIGl0IHdoZW4gdXNpbmcgQ29tcG9zZXIgaXMgcmVjb21tZW5kZWQuIjsKYnJlYWs7CgpjYXNlICd4ZGVidWdfcHJvZmlsZSc6CiR0ZXh0ID0gIlRoZSB4ZGVidWcucHJvZmlsZXJfZW5hYmxlZCBzZXR0aW5nIGlzIGVuYWJsZWQsIHRoaXMgY2FuIHNsb3cgZG93biBDb21wb3NlciBhIGxvdC4iLlBIUF9FT0w7CiR0ZXh0IC49ICJBZGQgdGhlIGZvbGxvd2luZyB0byB0aGUgZW5kIG9mIHlvdXIgYHBocC5pbmlgIHRvIGRpc2FibGUgaXQ6Ii5QSFBfRU9MOwokdGV4dCAuPSAiICB4ZGVidWcucHJvZmlsZXJfZW5hYmxlZCA9IDAiOwokZGlzcGxheUluaU1lc3NhZ2UgPSB0cnVlOwpicmVhazsKCmNhc2UgJ29uZWRyaXZlJzoKJHRleHQgPSAiVGhlIFdpbmRvd3MgT25lRHJpdmUgZm9sZGVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gUEhQIHZlcnNpb25zIGJlbG93IDcuMi4yMyBhbmQgNy4zLjEwLiIuUEhQX0VPTDsKJHRleHQgLj0gIlVwZ3JhZGUgeW91ciBQSFAgKHskY3VycmVudH0pIHRvIHVzZSB0aGlzIGxvY2F0aW9uIHdpdGggQ29tcG9zZXIuIi5QSFBfRU9MOwpicmVhazsKCmNhc2UgJ3VvcHonOgokdGV4dCA9ICJUaGUgdW9weiBleHRlbnNpb24gaWdub3JlcyBleGl0IGNhbGxzIGFuZCBtYXkgbm90IHdvcmsgd2l0aCBhbGwgQ29tcG9zZXIgY29tbWFuZHMuIi5QSFBfRU9MOwokdGV4dCAuPSAiRGlzYWJsaW5nIGl0IHdoZW4gdXNpbmcgQ29tcG9zZXIgaXMgcmVjb21tZW5kZWQuIjsKYnJlYWs7CgpkZWZhdWx0Ogp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCJEaWFnbm9zZUNvbW1hbmQ6IFVua25vd24gd2FybmluZyB0eXBlIFwiJXNcIi4gUGxlYXNlIHJlcG9ydCBhdCBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY29tcG9zZXIvaXNzdWVzL25ldy4iLCAkd2FybmluZykpOwp9CiRvdXQoJHRleHQsICdjb21tZW50Jyk7Cn0KfQoKaWYgKCRkaXNwbGF5SW5pTWVzc2FnZSkgewokb3V0KCRpbmlNZXNzYWdlLCAnY29tbWVudCcpOwp9CgppZiAoaW5fYXJyYXkoUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfSVBSRVNPTFZFJyksIFsnNCcsICc2J10sIHRydWUpKSB7CiR3YXJuaW5nc1snaXByZXNvbHZlJ10gPSB0cnVlOwokb3V0KCdUaGUgQ09NUE9TRVJfSVBSRVNPTFZFIGVudiB2YXIgaXMgc2V0IHRvICcgLiBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9JUFJFU09MVkUnKSAuJyB3aGljaCBtYXkgcmVzdWx0IGluIG5ldHdvcmsgZmFpbHVyZXMgYmVsb3cuJywgJ2NvbW1lbnQnKTsKfQoKcmV0dXJuIGNvdW50KCR3YXJuaW5ncykgPT09IDAgJiYgY291bnQoJGVycm9ycykgPT09IDAgPyB0cnVlIDogJG91dHB1dDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrQ29ubmVjdGl2aXR5KCkKewppZiAoIWluaV9nZXQoJ2FsbG93X3VybF9mb3BlbicpKSB7CnJldHVybiAnPGluZm8+U0tJUDwvPiA8Y29tbWVudD5CZWNhdXNlIGFsbG93X3VybF9mb3BlbiBpcyBtaXNzaW5nLjwvPic7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrQ29ubmVjdGl2aXR5QW5kQ29tcG9zZXJOZXR3b3JrSHR0cEVuYWJsZW1lbnQoKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHkoKTsKaWYgKCRyZXN1bHQgIT09IHRydWUpIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0NvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCkKewppZiAoKGJvb2wpIFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0RJU0FCTEVfTkVUV09SSycpKSB7CnJldHVybiAnPGluZm8+U0tJUDwvPiA8Y29tbWVudD5OZXR3b3JrIGlzIGRpc2FibGVkIGJ5IENPTVBPU0VSX0RJU0FCTEVfTkVUV09SSy48Lz4nOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIER1bXBBdXRvbG9hZENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKQp7CiR0aGlzCi0+c2V0TmFtZSgnZHVtcC1hdXRvbG9hZCcpCi0+c2V0QWxpYXNlcyhbJ2R1bXBhdXRvbG9hZCddKQotPnNldERlc2NyaXB0aW9uKCdEdW1wcyB0aGUgYXV0b2xvYWRlcicpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignb3B0aW1pemUnLCAnbycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3B0aW1pemVzIFBTUjAgYW5kIFBTUjQgcGFja2FnZXMgdG8gYmUgbG9hZGVkIHdpdGggY2xhc3NtYXBzIHRvbywgZ29vZCBmb3IgcHJvZHVjdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0F1dG9sb2FkIGNsYXNzZXMgZnJvbSB0aGUgY2xhc3NtYXAgb25seS4gSW1wbGljaXRseSBlbmFibGVzIGAtLW9wdGltaXplYC4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVc2UgQVBDdSB0byBjYWNoZSBmb3VuZC9ub3QtZm91bmQgY2xhc3Nlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LXByZWZpeCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1VzZSBhIGN1c3RvbSBwcmVmaXggZm9yIHRoZSBBUEN1IGF1dG9sb2FkZXIgY2FjaGUuIEltcGxpY2l0bHkgZW5hYmxlcyAtLWFwY3UnKSwKbmV3IElucHV0T3B0aW9uKCdkcnktcnVuJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPdXRwdXRzIHRoZSBvcGVyYXRpb25zIGJ1dCB3aWxsIG5vdCBleGVjdXRlIGFueXRoaW5nLicpLApuZXcgSW5wdXRPcHRpb24oJ2RldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRW5hYmxlcyBhdXRvbG9hZC1kZXYgcnVsZXMuIENvbXBvc2VyIHdpbGwgYnkgZGVmYXVsdCBpbmZlciB0aGlzIGF1dG9tYXRpY2FsbHkgYWNjb3JkaW5nIHRvIHRoZSBsYXN0IGluc3RhbGwgb3IgdXBkYXRlIC0tbm8tZGV2IHN0YXRlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgYXV0b2xvYWQtZGV2IHJ1bGVzLiBDb21wb3NlciB3aWxsIGJ5IGRlZmF1bHQgaW5mZXIgdGhpcyBhdXRvbWF0aWNhbGx5IGFjY29yZGluZyB0byB0aGUgbGFzdCBpbnN0YWxsIG9yIHVwZGF0ZSAtLW5vLWRldiBzdGF0ZS4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignc3RyaWN0LXBzcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmV0dXJuIGEgZmFpbGVkIHN0YXR1cyBjb2RlICgxKSBpZiBQU1ItNCBvciBQU1ItMCBtYXBwaW5nIGVycm9ycyBhcmUgcHJlc2VudC4gUmVxdWlyZXMgLS1vcHRpbWl6ZSB0byB3b3JrLicpLApuZXcgSW5wdXRPcHRpb24oJ3N0cmljdC1hbWJpZ3VvdXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JldHVybiBhIGZhaWxlZCBzdGF0dXMgY29kZSAoMikgaWYgdGhlIHNhbWUgY2xhc3MgaXMgZm91bmQgaW4gbXVsdGlwbGUgZmlsZXMuIFJlcXVpcmVzIC0tb3B0aW1pemUgdG8gd29yay4nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgZHVtcC1hdXRvbG9hZDwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2R1bXAtYXV0b2xvYWQtZHVtcGF1dG9sb2FkCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ2R1bXAtYXV0b2xvYWQnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJGluc3RhbGxhdGlvbk1hbmFnZXIgPSAkY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKTsKJGxvY2FsUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiRwYWNrYWdlID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwoKJG1pc3NpbmdEZXBlbmRlbmNpZXMgPSBmYWxzZTsKZm9yZWFjaCAoJGxvY2FsUmVwby0+Z2V0Q2Fub25pY2FsUGFja2FnZXMoKSBhcyAkbG9jYWxQa2cpIHsKJGluc3RhbGxQYXRoID0gJGluc3RhbGxhdGlvbk1hbmFnZXItPmdldEluc3RhbGxQYXRoKCRsb2NhbFBrZyk7CmlmICgkaW5zdGFsbFBhdGggIT09IG51bGwgJiYgZmlsZV9leGlzdHMoJGluc3RhbGxQYXRoKSA9PT0gZmFsc2UpIHsKJG1pc3NpbmdEZXBlbmRlbmNpZXMgPSB0cnVlOwokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJzx3YXJuaW5nPk5vdCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsZWQuIE1ha2Ugc3VyZSB0byBydW4gYSAiY29tcG9zZXIgaW5zdGFsbCIgdG8gaW5zdGFsbCBtaXNzaW5nIGRlcGVuZGVuY2llczwvd2FybmluZz4nKTsKCmJyZWFrOwp9Cn0KCiRvcHRpbWl6ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdvcHRpbWl6ZScpIHx8ICRjb25maWctPmdldCgnb3B0aW1pemUtYXV0b2xvYWRlcicpOwokYXV0aG9yaXRhdGl2ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykgfHwgJGNvbmZpZy0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJyk7CiRhcGN1UHJlZml4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtcHJlZml4Jyk7CiRhcGN1ID0gJGFwY3VQcmVmaXggIT09IG51bGwgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UnKSB8fCAkY29uZmlnLT5nZXQoJ2FwY3UtYXV0b2xvYWRlcicpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QtcHNyJykgJiYgISRvcHRpbWl6ZSAmJiAhJGF1dGhvcml0YXRpdmUpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJy0tc3RyaWN0LXBzciBtb2RlIG9ubHkgd29ya3Mgd2l0aCBvcHRpbWl6ZWQgYXV0b2xvYWRlciwgdXNlIC0tb3B0aW1pemUgb3IgLS1jbGFzc21hcC1hdXRob3JpdGF0aXZlIGlmIHlvdSB3YW50IGEgc3RyaWN0IHJldHVybiB2YWx1ZS4nKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdC1hbWJpZ3VvdXMnKSAmJiAhJG9wdGltaXplICYmICEkYXV0aG9yaXRhdGl2ZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignLS1zdHJpY3QtYW1iaWd1b3VzIG1vZGUgb25seSB3b3JrcyB3aXRoIG9wdGltaXplZCBhdXRvbG9hZGVyLCB1c2UgLS1vcHRpbWl6ZSBvciAtLWNsYXNzbWFwLWF1dGhvcml0YXRpdmUgaWYgeW91IHdhbnQgYSBzdHJpY3QgcmV0dXJuIHZhbHVlLicpOwp9CgppZiAoJGF1dGhvcml0YXRpdmUpIHsKJHRoaXMtPmdldElPKCktPndyaXRlKCc8aW5mbz5HZW5lcmF0aW5nIG9wdGltaXplZCBhdXRvbG9hZCBmaWxlcyAoYXV0aG9yaXRhdGl2ZSk8L2luZm8+Jyk7Cn0gZWxzZWlmICgkb3B0aW1pemUpIHsKJHRoaXMtPmdldElPKCktPndyaXRlKCc8aW5mbz5HZW5lcmF0aW5nIG9wdGltaXplZCBhdXRvbG9hZCBmaWxlczwvaW5mbz4nKTsKfSBlbHNlIHsKJHRoaXMtPmdldElPKCktPndyaXRlKCc8aW5mbz5HZW5lcmF0aW5nIGF1dG9sb2FkIGZpbGVzPC9pbmZvPicpOwp9CgokZ2VuZXJhdG9yID0gJGNvbXBvc2VyLT5nZXRBdXRvbG9hZEdlbmVyYXRvcigpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2RyeS1ydW4nKSkgewokZ2VuZXJhdG9yLT5zZXREcnlSdW4odHJ1ZSk7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewokZ2VuZXJhdG9yLT5zZXREZXZNb2RlKGZhbHNlKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2RldicpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1lvdSBjYW4gbm90IHVzZSBib3RoIC0tbm8tZGV2IGFuZCAtLWRldiBhcyB0aGV5IGNvbmZsaWN0IHdpdGggZWFjaCBvdGhlci4nKTsKfQokZ2VuZXJhdG9yLT5zZXREZXZNb2RlKHRydWUpOwp9CiRnZW5lcmF0b3ItPnNldENsYXNzTWFwQXV0aG9yaXRhdGl2ZSgkYXV0aG9yaXRhdGl2ZSk7CiRnZW5lcmF0b3ItPnNldFJ1blNjcmlwdHModHJ1ZSk7CiRnZW5lcmF0b3ItPnNldEFwY3UoJGFwY3UsICRhcGN1UHJlZml4KTsKJGdlbmVyYXRvci0+c2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpKTsKJGNsYXNzTWFwID0gJGdlbmVyYXRvci0+ZHVtcCgKJGNvbmZpZywKJGxvY2FsUmVwbywKJHBhY2thZ2UsCiRpbnN0YWxsYXRpb25NYW5hZ2VyLAonY29tcG9zZXInLAokb3B0aW1pemUsCm51bGwsCiRjb21wb3Nlci0+Z2V0TG9ja2VyKCksCiRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QtYW1iaWd1b3VzJykKKTsKJG51bWJlck9mQ2xhc3NlcyA9IGNvdW50KCRjbGFzc01hcCk7CgppZiAoJGF1dGhvcml0YXRpdmUpIHsKJHRoaXMtPmdldElPKCktPndyaXRlKCc8aW5mbz5HZW5lcmF0ZWQgb3B0aW1pemVkIGF1dG9sb2FkIGZpbGVzIChhdXRob3JpdGF0aXZlKSBjb250YWluaW5nICcuICRudW1iZXJPZkNsYXNzZXMgLicgY2xhc3NlczwvaW5mbz4nKTsKfSBlbHNlaWYgKCRvcHRpbWl6ZSkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJzxpbmZvPkdlbmVyYXRlZCBvcHRpbWl6ZWQgYXV0b2xvYWQgZmlsZXMgY29udGFpbmluZyAnLiAkbnVtYmVyT2ZDbGFzc2VzIC4nIGNsYXNzZXM8L2luZm8+Jyk7Cn0gZWxzZSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZSgnPGluZm8+R2VuZXJhdGVkIGF1dG9sb2FkIGZpbGVzPC9pbmZvPicpOwp9CgppZiAoJG1pc3NpbmdEZXBlbmRlbmNpZXMgfHwgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QtcHNyJykgJiYgY291bnQoJGNsYXNzTWFwLT5nZXRQc3JWaW9sYXRpb25zKCkpID4gMCkpIHsKcmV0dXJuIDE7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignc3RyaWN0LWFtYmlndW91cycpICYmIGNvdW50KCRjbGFzc01hcC0+Z2V0QW1iaWd1b3VzQ2xhc3NlcyhmYWxzZSkpID4gMCkgewpyZXR1cm4gMjsKfQoKcmV0dXJuIDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKCgoKCmNsYXNzIEV4ZWNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCkKewokdGhpcwotPnNldE5hbWUoJ2V4ZWMnKQotPnNldERlc2NyaXB0aW9uKCdFeGVjdXRlcyBhIHZlbmRvcmVkIGJpbmFyeS9zY3JpcHQnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ2xpc3QnLCAnbCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FKSwKbmV3IElucHV0QXJndW1lbnQoJ2JpbmFyeScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnVGhlIGJpbmFyeSB0byBydW4sIGUuZy4gcGhwdW5pdCcsIG51bGwsIGZ1bmN0aW9uICgpIHsKcmV0dXJuICR0aGlzLT5nZXRCaW5hcmllcyhmYWxzZSk7Cn0pLApuZXcgSW5wdXRBcmd1bWVudCgKJ2FyZ3MnLApJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLAonQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGJpbmFyeS4gVXNlIDxpbmZvPi0tPC9pbmZvPiB0byBzZXBhcmF0ZSBmcm9tIGNvbXBvc2VyIGFyZ3VtZW50cycKKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKRXhlY3V0ZXMgYSB2ZW5kb3JlZCBiaW5hcnkvc2NyaXB0LgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjZXhlYwpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbnRlcmFjdChJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiRiaW5hcmllcyA9ICR0aGlzLT5nZXRCaW5hcmllcyhmYWxzZSk7CmlmIChjb3VudCgkYmluYXJpZXMpID09PSAwKSB7CnJldHVybjsKfQoKaWYgKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ2JpbmFyeScpICE9PSBudWxsIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdsaXN0JykpIHsKcmV0dXJuOwp9CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRiaW5hcnkgPSAkaW8tPnNlbGVjdCgKJ0JpbmFyeSB0byBydW46ICcsCiRiaW5hcmllcywKJycsCjEsCidJbnZhbGlkIGJpbmFyeSBuYW1lICIlcyInCik7CgokaW5wdXQtPnNldEFyZ3VtZW50KCdiaW5hcnknLCAkYmluYXJpZXNbJGJpbmFyeV0pOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xpc3QnKSB8fCBudWxsID09PSAkaW5wdXQtPmdldEFyZ3VtZW50KCdiaW5hcnknKSkgewokYmlucyA9ICR0aGlzLT5nZXRCaW5hcmllcyh0cnVlKTsKaWYgKFtdID09PSAkYmlucykgewokYmluRGlyID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdiaW4tZGlyJyk7Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIk5vIGJpbmFyaWVzIGZvdW5kIGluIGNvbXBvc2VyLmpzb24gb3IgaW4gYmluLWRpciAoJGJpbkRpcikiKTsKfQoKJHRoaXMtPmdldElPKCktPndyaXRlKAo8PDxFT1QKPGNvbW1lbnQ+QXZhaWxhYmxlIGJpbmFyaWVzOjwvY29tbWVudD4KRU9UCik7Cgpmb3JlYWNoICgkYmlucyBhcyAkYmluKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZSgKPDw8RU9UCjxpbmZvPi0gJGJpbjwvaW5mbz4KRU9UCik7Cn0KCnJldHVybiAwOwp9CgokYmluYXJ5ID0gJGlucHV0LT5nZXRBcmd1bWVudCgnYmluYXJ5Jyk7CgokZGlzcGF0Y2hlciA9ICRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCk7CiRkaXNwYXRjaGVyLT5hZGRMaXN0ZW5lcignX19leGVjX2NvbW1hbmQnLCAkYmluYXJ5KTsKCgoKCmlmIChnZXRjd2QoKSAhPT0gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmdldEluaXRpYWxXb3JraW5nRGlyZWN0b3J5KCkgJiYgJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmdldEluaXRpYWxXb3JraW5nRGlyZWN0b3J5KCkgIT09IGZhbHNlKSB7CnRyeSB7CmNoZGlyKCR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5nZXRJbml0aWFsV29ya2luZ0RpcmVjdG9yeSgpKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBzd2l0Y2ggYmFjayB0byB3b3JraW5nIGRpcmVjdG9yeSAiJy4kdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+Z2V0SW5pdGlhbFdvcmtpbmdEaXJlY3RvcnkoKS4nIicsIDAsICRlKTsKfQp9CgpyZXR1cm4gJGRpc3BhdGNoZXItPmRpc3BhdGNoU2NyaXB0KCdfX2V4ZWNfY29tbWFuZCcsIHRydWUsICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2FyZ3MnKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0QmluYXJpZXMoYm9vbCAkZm9yRGlzcGxheSk6IGFycmF5CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokYmluRGlyID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdiaW4tZGlyJyk7CiRiaW5zID0gZ2xvYigkYmluRGlyIC4gJy8qJyk7CiRsb2NhbEJpbnMgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0QmluYXJpZXMoKTsKaWYgKCRmb3JEaXNwbGF5KSB7CiRsb2NhbEJpbnMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkZSkgewpyZXR1cm4gIiRlIChsb2NhbCkiOwp9LCAkbG9jYWxCaW5zKTsKfQoKJGJpbmFyaWVzID0gW107CmZvcmVhY2ggKGFycmF5X21lcmdlKCRiaW5zLCAkbG9jYWxCaW5zKSBhcyAkYmluKSB7CgppZiAoaXNzZXQoJHByZXZpb3VzQmluKSAmJiAkYmluID09PSAkcHJldmlvdXNCaW4uJy5iYXQnKSB7CmNvbnRpbnVlOwp9CgokcHJldmlvdXNCaW4gPSAkYmluOwokYmluYXJpZXNbXSA9IGJhc2VuYW1lKCRiaW4pOwp9CgpyZXR1cm4gJGJpbmFyaWVzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKY2xhc3MgRnVuZENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzLT5zZXROYW1lKCdmdW5kJykKLT5zZXREZXNjcmlwdGlvbignRGlzY292ZXIgaG93IHRvIGhlbHAgZnVuZCB0aGUgbWFpbnRlbmFuY2Ugb2YgeW91ciBkZXBlbmRlbmNpZXMnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ2Zvcm1hdCcsICdmJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRm9ybWF0IG9mIHRoZSBvdXRwdXQ6IHRleHQgb3IganNvbicsICd0ZXh0JywgWyd0ZXh0JywgJ2pzb24nXSksCl0pCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiRyZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJHJlbW90ZVJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSk7CiRmdW5kaW5ncyA9IFtdOwoKJHBhY2thZ2VzVG9Mb2FkID0gW107CmZvcmVhY2ggKCRyZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpjb250aW51ZTsKfQokcGFja2FnZXNUb0xvYWRbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSBuZXcgTWF0Y2hBbGxDb25zdHJhaW50KCk7Cn0KCgokcmVzdWx0ID0gJHJlbW90ZVJlcG9zLT5sb2FkUGFja2FnZXMoJHBhY2thZ2VzVG9Mb2FkLCBbJ2RldicgPT4gQmFzZVBhY2thZ2U6OlNUQUJJTElUWV9ERVZdLCBbXSk7CgoKZm9yZWFjaCAoJHJlc3VsdFsncGFja2FnZXMnXSBhcyAkcGFja2FnZSkgewppZiAoCiEkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZQomJiAkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZQomJiAkcGFja2FnZS0+aXNEZWZhdWx0QnJhbmNoKCkKJiYgJHBhY2thZ2UtPmdldEZ1bmRpbmcoKQomJiBpc3NldCgkcGFja2FnZXNUb0xvYWRbJHBhY2thZ2UtPmdldE5hbWUoKV0pCikgewokZnVuZGluZ3MgPSAkdGhpcy0+aW5zZXJ0RnVuZGluZ0RhdGEoJGZ1bmRpbmdzLCAkcGFja2FnZSk7CnVuc2V0KCRwYWNrYWdlc1RvTG9hZFskcGFja2FnZS0+Z2V0TmFtZSgpXSk7Cn0KfQoKCmZvcmVhY2ggKCRyZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSB8fCAhaXNzZXQoJHBhY2thZ2VzVG9Mb2FkWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewpjb250aW51ZTsKfQoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmICRwYWNrYWdlLT5nZXRGdW5kaW5nKCkpIHsKJGZ1bmRpbmdzID0gJHRoaXMtPmluc2VydEZ1bmRpbmdEYXRhKCRmdW5kaW5ncywgJHBhY2thZ2UpOwp9Cn0KCmtzb3J0KCRmdW5kaW5ncyk7CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRmb3JtYXQgPSAkaW5wdXQtPmdldE9wdGlvbignZm9ybWF0Jyk7CmlmICghaW5fYXJyYXkoJGZvcm1hdCwgWyd0ZXh0JywgJ2pzb24nXSkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJ1Vuc3VwcG9ydGVkIGZvcm1hdCAiJXMiLiBTZWUgaGVscCBmb3Igc3VwcG9ydGVkIGZvcm1hdHMuJywgJGZvcm1hdCkpOwoKcmV0dXJuIDE7Cn0KCmlmICgkZnVuZGluZ3MgJiYgJGZvcm1hdCA9PT0gJ3RleHQnKSB7CiRwcmV2ID0gbnVsbDsKCiRpby0+d3JpdGUoJ1RoZSBmb2xsb3dpbmcgcGFja2FnZXMgd2VyZSBmb3VuZCBpbiB5b3VyIGRlcGVuZGVuY2llcyB3aGljaCBwdWJsaXNoIGZ1bmRpbmcgaW5mb3JtYXRpb246Jyk7Cgpmb3JlYWNoICgkZnVuZGluZ3MgYXMgJHZlbmRvciA9PiAkbGlua3MpIHsKJGlvLT53cml0ZSgnJyk7CiRpby0+d3JpdGUoc3ByaW50ZigiPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+IiwgJHZlbmRvcikpOwpmb3JlYWNoICgkbGlua3MgYXMgJHVybCA9PiAkcGFja2FnZXMpIHsKJGxpbmUgPSBzcHJpbnRmKCcgIDxpbmZvPiVzPC9pbmZvPicsIGltcGxvZGUoJywgJywgJHBhY2thZ2VzKSk7CgppZiAoJHByZXYgIT09ICRsaW5lKSB7CiRpby0+d3JpdGUoJGxpbmUpOwokcHJldiA9ICRsaW5lOwp9CgokaW8tPndyaXRlKHNwcmludGYoJyAgICA8aHJlZj0lcz4lczwvPicsIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCR1cmwpLCAkdXJsKSk7Cn0KfQoKJGlvLT53cml0ZSgiIik7CiRpby0+d3JpdGUoIlBsZWFzZSBjb25zaWRlciBmb2xsb3dpbmcgdGhlc2UgbGlua3MgYW5kIHNwb25zb3JpbmcgdGhlIHdvcmsgb2YgcGFja2FnZSBhdXRob3JzISIpOwokaW8tPndyaXRlKCJUaGFuayB5b3UhIik7Cn0gZWxzZWlmICgkZm9ybWF0ID09PSAnanNvbicpIHsKJGlvLT53cml0ZShKc29uRmlsZTo6ZW5jb2RlKCRmdW5kaW5ncykpOwp9IGVsc2UgewokaW8tPndyaXRlKCJObyBmdW5kaW5nIGxpbmtzIHdlcmUgZm91bmQgaW4geW91ciBwYWNrYWdlIGRlcGVuZGVuY2llcy4gVGhpcyBkb2Vzbid0IG1lYW4gdGhleSBkb24ndCBuZWVkIHlvdXIgc3VwcG9ydCEiKTsKfQoKcmV0dXJuIDA7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGluc2VydEZ1bmRpbmdEYXRhKGFycmF5ICRmdW5kaW5ncywgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkKewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0RnVuZGluZygpIGFzICRmdW5kaW5nT3B0aW9uKSB7ClskdmVuZG9yLCAkcGFja2FnZU5hbWVdID0gZXhwbG9kZSgnLycsICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkpOwoKaWYgKGVtcHR5KCRmdW5kaW5nT3B0aW9uWyd1cmwnXSkpIHsKY29udGludWU7Cn0KJHVybCA9ICRmdW5kaW5nT3B0aW9uWyd1cmwnXTsKaWYgKCFlbXB0eSgkZnVuZGluZ09wdGlvblsndHlwZSddKSAmJiAkZnVuZGluZ09wdGlvblsndHlwZSddID09PSAnZ2l0aHViJyAmJiBQcmVnOjppc01hdGNoKCd7Xmh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSspJH0nLCAkdXJsLCAkbWF0Y2gpKSB7CiR1cmwgPSAnaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzLycuJG1hdGNoWzFdOwp9CiRmdW5kaW5nc1skdmVuZG9yXVskdXJsXVtdID0gJHBhY2thZ2VOYW1lOwp9CgpyZXR1cm4gJGZ1bmRpbmdzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcU3RyaW5nSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBHbG9iYWxDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewokYXBwbGljYXRpb24gPSAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKTsKaWYgKCRpbnB1dC0+bXVzdFN1Z2dlc3RBcmd1bWVudFZhbHVlc0ZvcignY29tbWFuZC1uYW1lJykpIHsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoCmFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKENvbW1hbmQgJGNvbW1hbmQpIHsKcmV0dXJuICRjb21tYW5kLT5pc0hpZGRlbigpID8gbnVsbCA6ICRjb21tYW5kLT5nZXROYW1lKCk7Cn0sICRhcHBsaWNhdGlvbi0+YWxsKCkpLCBmdW5jdGlvbiAoP3N0cmluZyAkY21kKSB7CnJldHVybiAkY21kICE9PSBudWxsOwp9CikpKTsKCnJldHVybjsKfQoKaWYgKCRhcHBsaWNhdGlvbi0+aGFzKCRjb21tYW5kTmFtZSA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2NvbW1hbmQtbmFtZScpKSkgewokaW5wdXQgPSAkdGhpcy0+cHJlcGFyZVN1YmNvbW1hbmRJbnB1dCgkaW5wdXQsIHRydWUpOwokaW5wdXQgPSBDb21wbGV0aW9uSW5wdXQ6OmZyb21TdHJpbmcoJGlucHV0LT5fX3RvU3RyaW5nKCksIDIpOwokY29tbWFuZCA9ICRhcHBsaWNhdGlvbi0+ZmluZCgkY29tbWFuZE5hbWUpOwokY29tbWFuZC0+bWVyZ2VBcHBsaWNhdGlvbkRlZmluaXRpb24oKTsKCiRpbnB1dC0+YmluZCgkY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpKTsKJGNvbW1hbmQtPmNvbXBsZXRlKCRpbnB1dCwgJHN1Z2dlc3Rpb25zKTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2dsb2JhbCcpCi0+c2V0RGVzY3JpcHRpb24oJ0FsbG93cyBydW5uaW5nIGNvbW1hbmRzIGluIHRoZSBnbG9iYWwgY29tcG9zZXIgZGlyICgkQ09NUE9TRVJfSE9NRSknKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgnY29tbWFuZC1uYW1lJywgSW5wdXRBcmd1bWVudDo6UkVRVUlSRUQsICcnKSwKbmV3IElucHV0QXJndW1lbnQoJ2FyZ3MnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClVzZSB0aGlzIGNvbW1hbmQgYXMgYSB3cmFwcGVyIHRvIHJ1biBvdGhlciBDb21wb3NlciBjb21tYW5kcwp3aXRoaW4gdGhlIGdsb2JhbCBjb250ZXh0IG9mIENPTVBPU0VSX0hPTUUuCgpZb3UgY2FuIHVzZSB0aGlzIHRvIGluc3RhbGwgQ0xJIHV0aWxpdGllcyBnbG9iYWxseSwgYWxsIHlvdSBuZWVkCmlzIHRvIGFkZCB0aGUgQ09NUE9TRVJfSE9NRS92ZW5kb3IvYmluIGRpciB0byB5b3VyIFBBVEggZW52IHZhci4KCkNPTVBPU0VSX0hPTUUgaXMgYzpcVXNlcnNcPHVzZXI+XEFwcERhdGFcUm9hbWluZ1xDb21wb3NlciBvbiBXaW5kb3dzCmFuZCAvaG9tZS88dXNlcj4vLmNvbXBvc2VyIG9uIHVuaXggc3lzdGVtcy4KCklmIHlvdXIgc3lzdGVtIHVzZXMgZnJlZWRlc2t0b3Aub3JnIHN0YW5kYXJkcywgdGhlbiBpdCB3aWxsIGZpcnN0IGNoZWNrClhER19DT05GSUdfSE9NRSBvciBkZWZhdWx0IHRvIC9ob21lLzx1c2VyPi8uY29uZmlnL2NvbXBvc2VyCgpOb3RlOiBUaGlzIHBhdGggbWF5IHZhcnkgZGVwZW5kaW5nIG9uIGN1c3RvbWl6YXRpb25zIHRvIGJpbi1kaXIgaW4KY29tcG9zZXIuanNvbiBvciB0aGUgZW52aXJvbm1lbnRhbCB2YXJpYWJsZSBDT01QT1NFUl9CSU5fRElSLgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjZ2xvYmFsCkVPVAopCjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJ1bihJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKCmlmICghbWV0aG9kX2V4aXN0cygkaW5wdXQsICdfX3RvU3RyaW5nJykpIHsgCnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0V4cGVjdGVkIGFuIElucHV0IGluc3RhbmNlIHRoYXQgaXMgc3RyaW5nYWJsZSwgZ290ICcuZ2V0X2NsYXNzKCRpbnB1dCkpOwp9CgoKJHRva2VucyA9IFByZWc6OnNwbGl0KCd7XHMrfScsICRpbnB1dC0+X190b1N0cmluZygpKTsKJGFyZ3MgPSBbXTsKZm9yZWFjaCAoJHRva2VucyBhcyAkdG9rZW4pIHsKaWYgKCR0b2tlbiAmJiAkdG9rZW5bMF0gIT09ICctJykgewokYXJnc1tdID0gJHRva2VuOwppZiAoY291bnQoJGFyZ3MpID49IDIpIHsKYnJlYWs7Cn0KfQp9CgoKaWYgKGNvdW50KCRhcmdzKSA8IDIpIHsKcmV0dXJuIHBhcmVudDo6cnVuKCRpbnB1dCwgJG91dHB1dCk7Cn0KCiRpbnB1dCA9ICR0aGlzLT5wcmVwYXJlU3ViY29tbWFuZElucHV0KCRpbnB1dCk7CgpyZXR1cm4gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPnJ1bigkaW5wdXQsICRvdXRwdXQpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHByZXBhcmVTdWJjb21tYW5kSW5wdXQoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBib29sICRxdWlldCA9IGZhbHNlKTogU3RyaW5nSW5wdXQKewoKaWYgKCFtZXRob2RfZXhpc3RzKCRpbnB1dCwgJ19fdG9TdHJpbmcnKSkgeyAKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRXhwZWN0ZWQgYW4gSW5wdXQgaW5zdGFuY2UgdGhhdCBpcyBzdHJpbmdhYmxlLCBnb3QgJy5nZXRfY2xhc3MoJGlucHV0KSk7Cn0KCgppZiAoUGxhdGZvcm06OmdldEVudignQ09NUE9TRVInKSkgewpQbGF0Zm9ybTo6Y2xlYXJFbnYoJ0NPTVBPU0VSJyk7Cn0KCgokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCk7CiRob21lID0gJGNvbmZpZy0+Z2V0KCdob21lJyk7CgppZiAoIWlzX2RpcigkaG9tZSkpIHsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJGhvbWUpOwppZiAoIWlzX2RpcigkaG9tZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgY3JlYXRlIGhvbWUgZGlyZWN0b3J5Jyk7Cn0KfQoKdHJ5IHsKY2hkaXIoJGhvbWUpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHN3aXRjaCB0byBob21lIGRpcmVjdG9yeSAiJy4kaG9tZS4nIicsIDAsICRlKTsKfQppZiAoISRxdWlldCkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignPGluZm8+Q2hhbmdlZCBjdXJyZW50IGRpcmVjdG9yeSB0byAnLiRob21lLic8L2luZm8+Jyk7Cn0KCgokaW5wdXQgPSBuZXcgU3RyaW5nSW5wdXQoUHJlZzo6cmVwbGFjZSgne1xiZyg/OmwoPzpvKD86Yig/OmEoPzpsKT8pPyk/KT8pP1xifScsICcnLCAkaW5wdXQtPl9fdG9TdHJpbmcoKSwgMSkpOwokdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+cmVzZXRDb21wb3NlcigpOwoKcmV0dXJuICRpbnB1dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUHJveHlDb21tYW5kKCk6IGJvb2wKewpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBIb21lQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnYnJvd3NlJykKLT5zZXRBbGlhc2VzKFsnaG9tZSddKQotPnNldERlc2NyaXB0aW9uKCdPcGVucyB0aGUgcGFja2FnZVwncyByZXBvc2l0b3J5IFVSTCBvciBob21lcGFnZSBpbiB5b3VyIGJyb3dzZXInKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZXMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSwgJ1BhY2thZ2UocykgdG8gYnJvd3NlIHRvLicsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZSgpKSwKbmV3IElucHV0T3B0aW9uKCdob21lcGFnZScsICdIJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPcGVuIHRoZSBob21lcGFnZSBpbnN0ZWFkIG9mIHRoZSByZXBvc2l0b3J5IFVSTC4nKSwKbmV3IElucHV0T3B0aW9uKCdzaG93JywgJ3MnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09ubHkgc2hvdyB0aGUgaG9tZXBhZ2Ugb3IgcmVwb3NpdG9yeSBVUkwuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSBob21lIGNvbW1hbmQgb3BlbnMgb3Igc2hvd3MgYSBwYWNrYWdlJ3MgcmVwb3NpdG9yeSBVUkwgb3IKaG9tZXBhZ2UgaW4geW91ciBkZWZhdWx0IGJyb3dzZXIuCgpUbyBvcGVuIHRoZSBob21lcGFnZSBieSBkZWZhdWx0LCB1c2UgLUggb3IgLS1ob21lcGFnZS4KVG8gc2hvdyBpbnN0ZWFkIG9mIG9wZW4gdGhlIHJlcG9zaXRvcnkgb3IgaG9tZXBhZ2UgVVJMLCB1c2UgLXMgb3IgLS1zaG93LgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjYnJvd3NlLWhvbWUKRU9UCik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokcmVwb3MgPSAkdGhpcy0+aW5pdGlhbGl6ZVJlcG9zKCk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwokcmV0dXJuID0gMDsKCiRwYWNrYWdlcyA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJyk7CmlmIChjb3VudCgkcGFja2FnZXMpID09PSAwKSB7CiRpby0+d3JpdGVFcnJvcignTm8gcGFja2FnZSBzcGVjaWZpZWQsIG9wZW5pbmcgaG9tZXBhZ2UgZm9yIHRoZSByb290IHBhY2thZ2UnKTsKJHBhY2thZ2VzID0gWyR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKS0+Z2V0UGFja2FnZSgpLT5nZXROYW1lKCldOwp9Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2VOYW1lKSB7CiRoYW5kbGVkID0gZmFsc2U7CiRwYWNrYWdlRXhpc3RzID0gZmFsc2U7CmZvcmVhY2ggKCRyZXBvcyBhcyAkcmVwbykgewpmb3JlYWNoICgkcmVwby0+ZmluZFBhY2thZ2VzKCRwYWNrYWdlTmFtZSkgYXMgJHBhY2thZ2UpIHsKJHBhY2thZ2VFeGlzdHMgPSB0cnVlOwppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJHRoaXMtPmhhbmRsZVBhY2thZ2UoJHBhY2thZ2UsICRpbnB1dC0+Z2V0T3B0aW9uKCdob21lcGFnZScpLCAkaW5wdXQtPmdldE9wdGlvbignc2hvdycpKSkgewokaGFuZGxlZCA9IHRydWU7CmJyZWFrIDI7Cn0KfQp9CgppZiAoISRwYWNrYWdlRXhpc3RzKSB7CiRyZXR1cm4gPSAxOwokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlBhY2thZ2UgJy4kcGFja2FnZU5hbWUuJyBub3QgZm91bmQ8L3dhcm5pbmc+Jyk7Cn0KCmlmICghJGhhbmRsZWQpIHsKJHJldHVybiA9IDE7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4oJGlucHV0LT5nZXRPcHRpb24oJ2hvbWVwYWdlJykgPyAnSW52YWxpZCBvciBtaXNzaW5nIGhvbWVwYWdlJyA6ICdJbnZhbGlkIG9yIG1pc3NpbmcgcmVwb3NpdG9yeSBVUkwnKS4nIGZvciAnLiRwYWNrYWdlTmFtZS4nPC93YXJuaW5nPicpOwp9Cn0KCnJldHVybiAkcmV0dXJuOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZVBhY2thZ2UoQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBib29sICRzaG93SG9tZXBhZ2UsIGJvb2wgJHNob3dPbmx5KTogYm9vbAp7CiRzdXBwb3J0ID0gJHBhY2thZ2UtPmdldFN1cHBvcnQoKTsKJHVybCA9ICRzdXBwb3J0Wydzb3VyY2UnXSA/PyAkcGFja2FnZS0+Z2V0U291cmNlVXJsKCk7CmlmICghJHVybCB8fCAkc2hvd0hvbWVwYWdlKSB7CiR1cmwgPSAkcGFja2FnZS0+Z2V0SG9tZXBhZ2UoKTsKfQoKaWYgKCEkdXJsIHx8ICFmaWx0ZXJfdmFyKCR1cmwsIEZJTFRFUl9WQUxJREFURV9VUkwpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCRzaG93T25seSkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoc3ByaW50ZignPGluZm8+JXM8L2luZm8+JywgJHVybCkpOwp9IGVsc2UgewokdGhpcy0+b3BlbkJyb3dzZXIoJHVybCk7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG9wZW5Ccm93c2VyKHN0cmluZyAkdXJsKTogdm9pZAp7CiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkdGhpcy0+Z2V0SU8oKSk7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJHByb2Nlc3MtPmV4ZWN1dGUoWydzdGFydCcsICcid2ViIicsICdleHBsb3JlcicsICR1cmxdLCAkb3V0cHV0KTsKCnJldHVybjsKfQoKJGxpbnV4ID0gJHByb2Nlc3MtPmV4ZWN1dGUoWyd3aGljaCcsICd4ZGctb3BlbiddLCAkb3V0cHV0KTsKJG9zeCA9ICRwcm9jZXNzLT5leGVjdXRlKFsnd2hpY2gnLCAnb3BlbiddLCAkb3V0cHV0KTsKCmlmICgwID09PSAkbGludXgpIHsKJHByb2Nlc3MtPmV4ZWN1dGUoWyd4ZGctb3BlbicsICR1cmxdLCAkb3V0cHV0KTsKfSBlbHNlaWYgKDAgPT09ICRvc3gpIHsKJHByb2Nlc3MtPmV4ZWN1dGUoWydvcGVuJywgJHVybF0sICRvdXRwdXQpOwp9IGVsc2UgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignTm8gc3VpdGFibGUgYnJvd3NlciBvcGVuaW5nIGNvbW1hbmQgZm91bmQsIG9wZW4geW91cnNlbGY6ICcgLiAkdXJsKTsKfQp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpbml0aWFsaXplUmVwb3MoKTogYXJyYXkKewokY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKTsKCmlmICgkY29tcG9zZXIpIHsKcmV0dXJuIGFycmF5X21lcmdlKApbbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeShjbG9uZSAkY29tcG9zZXItPmdldFBhY2thZ2UoKSldLCAKWyRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCldLCAKJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSAKKTsKfQoKcmV0dXJuIFJlcG9zaXRvcnlGYWN0b3J5OjpkZWZhdWx0UmVwb3NXaXRoRGVmYXVsdE1hbmFnZXIoJHRoaXMtPmdldElPKCkpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxKc29uXEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFNwZHhcU3BkeExpY2Vuc2VzOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcQXJyYXlJbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4ZWN1dGFibGVGaW5kZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxGb3JtYXR0ZXJIZWxwZXI7CgoKCgoKY2xhc3MgSW5pdENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CnVzZSBQYWNrYWdlRGlzY292ZXJ5VHJhaXQ7CgoKcHJpdmF0ZSAkZ2l0Q29uZmlnOwoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCkKewokdGhpcwotPnNldE5hbWUoJ2luaXQnKQotPnNldERlc2NyaXB0aW9uKCdDcmVhdGVzIGEgYmFzaWMgY29tcG9zZXIuanNvbiBmaWxlIGluIGN1cnJlbnQgZGlyZWN0b3J5JykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCduYW1lJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnTmFtZSBvZiB0aGUgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oJ2Rlc2NyaXB0aW9uJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRGVzY3JpcHRpb24gb2YgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oJ2F1dGhvcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0F1dGhvciBuYW1lIG9mIHBhY2thZ2UnKSwKbmV3IElucHV0T3B0aW9uKCd0eXBlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVHlwZSBvZiBwYWNrYWdlIChlLmcuIGxpYnJhcnksIHByb2plY3QsIG1ldGFwYWNrYWdlLCBjb21wb3Nlci1wbHVnaW4pJyksCm5ldyBJbnB1dE9wdGlvbignaG9tZXBhZ2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdIb21lcGFnZSBvZiBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbigncmVxdWlyZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSB8IElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1BhY2thZ2UgdG8gcmVxdWlyZSB3aXRoIGEgdmVyc2lvbiBjb25zdHJhaW50LCBlLmcuIGZvby9iYXI6MS4wLjAgb3IgZm9vL2Jhcj0xLjAuMCBvciAiZm9vL2JhciAxLjAuMCInLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEF2YWlsYWJsZVBhY2thZ2VJbmNsUGxhdGZvcm0oKSksCm5ldyBJbnB1dE9wdGlvbigncmVxdWlyZS1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVkgfCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdQYWNrYWdlIHRvIHJlcXVpcmUgZm9yIGRldmVsb3BtZW50IHdpdGggYSB2ZXJzaW9uIGNvbnN0cmFpbnQsIGUuZy4gZm9vL2JhcjoxLjAuMCBvciBmb28vYmFyPTEuMC4wIG9yICJmb28vYmFyIDEuMC4wIicsIG51bGwsICR0aGlzLT5zdWdnZXN0QXZhaWxhYmxlUGFja2FnZUluY2xQbGF0Zm9ybSgpKSwKbmV3IElucHV0T3B0aW9uKCdzdGFiaWxpdHknLCAncycsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ01pbmltdW0gc3RhYmlsaXR5IChlbXB0eSBvciBvbmUgb2Y6ICcuaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFUykpLicpJyksCm5ldyBJbnB1dE9wdGlvbignbGljZW5zZScsICdsJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnTGljZW5zZSBvZiBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbigncmVwb3NpdG9yeScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0FkZCBjdXN0b20gcmVwb3NpdG9yaWVzLCBlaXRoZXIgYnkgVVJMIG9yIHVzaW5nIEpTT04gYXJyYXlzJyksCm5ldyBJbnB1dE9wdGlvbignYXV0b2xvYWQnLCAnYScsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0FkZCBQU1ItNCBhdXRvbG9hZCBtYXBwaW5nLiBNYXBzIHlvdXIgcGFja2FnZVwncyBuYW1lc3BhY2UgdG8gdGhlIHByb3ZpZGVkIGRpcmVjdG9yeS4gKEV4cGVjdHMgYSByZWxhdGl2ZSBwYXRoLCBlLmcuIHNyYy8pJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5pbml0PC9pbmZvPiBjb21tYW5kIGNyZWF0ZXMgYSBiYXNpYyBjb21wb3Nlci5qc29uIGZpbGUKaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgaW5pdDwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2luaXQKRU9UCikKOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGlvID0gJHRoaXMtPmdldElPKCk7CgokYWxsb3dsaXN0ID0gWyduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ2F1dGhvcicsICd0eXBlJywgJ2hvbWVwYWdlJywgJ3JlcXVpcmUnLCAncmVxdWlyZS1kZXYnLCAnc3RhYmlsaXR5JywgJ2xpY2Vuc2UnLCAnYXV0b2xvYWQnXTsKJG9wdGlvbnMgPSBhcnJheV9maWx0ZXIoYXJyYXlfaW50ZXJzZWN0X2tleSgkaW5wdXQtPmdldE9wdGlvbnMoKSwgYXJyYXlfZmxpcCgkYWxsb3dsaXN0KSksIGZ1bmN0aW9uICgkdmFsKSB7IHJldHVybiAkdmFsICE9PSBudWxsICYmICR2YWwgIT09IFtdOyB9KTsKCmlmIChpc3NldCgkb3B0aW9uc1snbmFtZSddKSAmJiAhUHJlZzo6aXNNYXRjaCgne15bYS16MC05XShbXy4tXT9bYS16MC05XSspKlwvW2EtejAtOV0oKFtfLl18LXsxLDJ9KT9bYS16MC05XSspKiR9RCcsICRvcHRpb25zWyduYW1lJ10pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonVGhlIHBhY2thZ2UgbmFtZSAnLiRvcHRpb25zWyduYW1lJ10uJyBpcyBpbnZhbGlkLCBpdCBzaG91bGQgYmUgbG93ZXJjYXNlIGFuZCBoYXZlIGEgdmVuZG9yIG5hbWUsIGEgZm9yd2FyZCBzbGFzaCwgYW5kIGEgcGFja2FnZSBuYW1lLCBtYXRjaGluZzogW2EtejAtOV8uLV0rL1thLXowLTlfLi1dKycKKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydhdXRob3InXSkpIHsKJG9wdGlvbnNbJ2F1dGhvcnMnXSA9ICR0aGlzLT5mb3JtYXRBdXRob3JzKCRvcHRpb25zWydhdXRob3InXSk7CnVuc2V0KCRvcHRpb25zWydhdXRob3InXSk7Cn0KCiRyZXBvc2l0b3JpZXMgPSAkaW5wdXQtPmdldE9wdGlvbigncmVwb3NpdG9yeScpOwppZiAoY291bnQoJHJlcG9zaXRvcmllcykgPiAwKSB7CiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoJGlvKTsKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkcmVwbykgewokb3B0aW9uc1sncmVwb3NpdG9yaWVzJ11bXSA9IFJlcG9zaXRvcnlGYWN0b3J5Ojpjb25maWdGcm9tU3RyaW5nKCRpbywgJGNvbmZpZywgJHJlcG8sIHRydWUpOwp9Cn0KCmlmIChpc3NldCgkb3B0aW9uc1snc3RhYmlsaXR5J10pKSB7CiRvcHRpb25zWydtaW5pbXVtLXN0YWJpbGl0eSddID0gJG9wdGlvbnNbJ3N0YWJpbGl0eSddOwp1bnNldCgkb3B0aW9uc1snc3RhYmlsaXR5J10pOwp9Cgokb3B0aW9uc1sncmVxdWlyZSddID0gaXNzZXQoJG9wdGlvbnNbJ3JlcXVpcmUnXSkgPyAkdGhpcy0+Zm9ybWF0UmVxdWlyZW1lbnRzKCRvcHRpb25zWydyZXF1aXJlJ10pIDogbmV3IFxzdGRDbGFzczsKaWYgKFtdID09PSAkb3B0aW9uc1sncmVxdWlyZSddKSB7CiRvcHRpb25zWydyZXF1aXJlJ10gPSBuZXcgXHN0ZENsYXNzOwp9CgppZiAoaXNzZXQoJG9wdGlvbnNbJ3JlcXVpcmUtZGV2J10pKSB7CiRvcHRpb25zWydyZXF1aXJlLWRldiddID0gJHRoaXMtPmZvcm1hdFJlcXVpcmVtZW50cygkb3B0aW9uc1sncmVxdWlyZS1kZXYnXSk7CmlmIChbXSA9PT0gJG9wdGlvbnNbJ3JlcXVpcmUtZGV2J10pIHsKJG9wdGlvbnNbJ3JlcXVpcmUtZGV2J10gPSBuZXcgXHN0ZENsYXNzOwp9Cn0KCgokYXV0b2xvYWRQYXRoID0gbnVsbDsKaWYgKGlzc2V0KCRvcHRpb25zWydhdXRvbG9hZCddKSkgewokYXV0b2xvYWRQYXRoID0gJG9wdGlvbnNbJ2F1dG9sb2FkJ107CiRuYW1lc3BhY2UgPSAkdGhpcy0+bmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKChzdHJpbmcpICRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lJykpOwokb3B0aW9uc1snYXV0b2xvYWQnXSA9IChvYmplY3QpIFsKJ3Bzci00JyA9PiBbCiRuYW1lc3BhY2UgLiAnXFwnID0+ICRhdXRvbG9hZFBhdGgsCl0sCl07Cn0KCiRmaWxlID0gbmV3IEpzb25GaWxlKEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpKTsKJGpzb24gPSBKc29uRmlsZTo6ZW5jb2RlKCRvcHRpb25zKTsKCmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewokaW8tPndyaXRlRXJyb3IoWycnLCAkanNvbiwgJyddKTsKaWYgKCEkaW8tPmFza0NvbmZpcm1hdGlvbignRG8geW91IGNvbmZpcm0gZ2VuZXJhdGlvbiBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkNvbW1hbmQgYWJvcnRlZDwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQp9IGVsc2UgewppZiAoanNvbl9lbmNvZGUoJG9wdGlvbnMpID09PSAneyJyZXF1aXJlIjp7fX0nKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91IGhhdmUgdG8gcnVuIHRoaXMgY29tbWFuZCBpbiBpbnRlcmFjdGl2ZSBtb2RlLCBvciBzcGVjaWZ5IGF0IGxlYXN0IHNvbWUgZGF0YSB1c2luZyAtLW5hbWUsIC0tcmVxdWlyZSwgZXRjLicpOwp9CgokaW8tPndyaXRlRXJyb3IoJ1dyaXRpbmcgJy4kZmlsZS0+Z2V0UGF0aCgpKTsKfQoKJGZpbGUtPndyaXRlKCRvcHRpb25zKTsKdHJ5IHsKJGZpbGUtPnZhbGlkYXRlU2NoZW1hKEpzb25GaWxlOjpMQVhfU0NIRU1BKTsKfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+U2NoZW1hIHZhbGlkYXRpb24gZXJyb3IsIGFib3J0aW5nPC9lcnJvcj4nKTsKJGVycm9ycyA9ICcgLSAnIC4gaW1wbG9kZShQSFBfRU9MIC4gJyAtICcsICRlLT5nZXRFcnJvcnMoKSk7CiRpby0+d3JpdGVFcnJvcigkZS0+Z2V0TWVzc2FnZSgpIC4gJzonIC4gUEhQX0VPTCAuICRlcnJvcnMpOwpTaWxlbmNlcjo6Y2FsbCgndW5saW5rJywgJGZpbGUtPmdldFBhdGgoKSk7CgpyZXR1cm4gMTsKfQoKCmlmICgkYXV0b2xvYWRQYXRoKSB7CiRmaWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkYXV0b2xvYWRQYXRoKTsKCgppZiAoISR0aGlzLT5oYXNEZXBlbmRlbmNpZXMoJG9wdGlvbnMpKSB7CiR0aGlzLT5ydW5EdW1wQXV0b2xvYWRDb21tYW5kKCRvdXRwdXQpOwp9Cn0KCmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSAmJiBpc19kaXIoJy5naXQnKSkgewokaWdub3JlRmlsZSA9IHJlYWxwYXRoKCcuZ2l0aWdub3JlJyk7CgppZiAoZmFsc2UgPT09ICRpZ25vcmVGaWxlKSB7CiRpZ25vcmVGaWxlID0gcmVhbHBhdGgoJy4nKSAuICcvLmdpdGlnbm9yZSc7Cn0KCmlmICghJHRoaXMtPmhhc1ZlbmRvcklnbm9yZSgkaWdub3JlRmlsZSkpIHsKJHF1ZXN0aW9uID0gJ1dvdWxkIHlvdSBsaWtlIHRoZSA8aW5mbz52ZW5kb3I8L2luZm8+IGRpcmVjdG9yeSBhZGRlZCB0byB5b3VyIDxpbmZvPi5naXRpZ25vcmU8L2luZm8+IFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJzsKCmlmICgkaW8tPmFza0NvbmZpcm1hdGlvbigkcXVlc3Rpb24pKSB7CiR0aGlzLT5hZGRWZW5kb3JJZ25vcmUoJGlnbm9yZUZpbGUpOwp9Cn0KfQoKJHF1ZXN0aW9uID0gJ1dvdWxkIHlvdSBsaWtlIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzIG5vdyBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICc7CmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSAmJiAkdGhpcy0+aGFzRGVwZW5kZW5jaWVzKCRvcHRpb25zKSAmJiAkaW8tPmFza0NvbmZpcm1hdGlvbigkcXVlc3Rpb24pKSB7CiR0aGlzLT51cGRhdGVEZXBlbmRlbmNpZXMoJG91dHB1dCk7Cn0KCgppZiAoJGF1dG9sb2FkUGF0aCkgewokbmFtZXNwYWNlID0gJHRoaXMtPm5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZSgoc3RyaW5nKSAkaW5wdXQtPmdldE9wdGlvbignbmFtZScpKTsKCiRpby0+d3JpdGVFcnJvcignUFNSLTQgYXV0b2xvYWRpbmcgY29uZmlndXJlZC4gVXNlICI8Y29tbWVudD5uYW1lc3BhY2UgJy4kbmFtZXNwYWNlLic7PC9jb21tZW50PiIgaW4gJy4kYXV0b2xvYWRQYXRoKTsKJGlvLT53cml0ZUVycm9yKCdJbmNsdWRlIHRoZSBDb21wb3NlciBhdXRvbG9hZGVyIHdpdGg6IDxjb21tZW50PnJlcXVpcmUgXCd2ZW5kb3IvYXV0b2xvYWQucGhwXCc7PC9jb21tZW50PicpOwp9CgpyZXR1cm4gMDsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW50ZXJhY3QoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokZ2l0ID0gJHRoaXMtPmdldEdpdENvbmZpZygpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRmb3JtYXR0ZXIgPSAkdGhpcy0+Z2V0SGVscGVyU2V0KCktPmdldCgnZm9ybWF0dGVyJyk7CgoKJHJlcG9zaXRvcmllcyA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdyZXBvc2l0b3J5Jyk7CmlmIChjb3VudCgkcmVwb3NpdG9yaWVzKSA+IDApIHsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygkaW8pOwokaW8tPmxvYWRDb25maWd1cmF0aW9uKCRjb25maWcpOwokcmVwb01hbmFnZXIgPSBSZXBvc2l0b3J5RmFjdG9yeTo6bWFuYWdlcigkaW8sICRjb25maWcpOwoKJHJlcG9zID0gW25ldyBQbGF0Zm9ybVJlcG9zaXRvcnldOwokY3JlYXRlRGVmYXVsdFBhY2thZ2lzdFJlcG8gPSB0cnVlOwpmb3JlYWNoICgkcmVwb3NpdG9yaWVzIGFzICRyZXBvKSB7CiRyZXBvQ29uZmlnID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmNvbmZpZ0Zyb21TdHJpbmcoJGlvLCAkY29uZmlnLCAkcmVwbywgdHJ1ZSk7CmlmICgKKGlzc2V0KCRyZXBvQ29uZmlnWydwYWNrYWdpc3QnXSkgJiYgJHJlcG9Db25maWcgPT09IFsncGFja2FnaXN0JyA9PiBmYWxzZV0pCnx8IChpc3NldCgkcmVwb0NvbmZpZ1sncGFja2FnaXN0Lm9yZyddKSAmJiAkcmVwb0NvbmZpZyA9PT0gWydwYWNrYWdpc3Qub3JnJyA9PiBmYWxzZV0pCikgewokY3JlYXRlRGVmYXVsdFBhY2thZ2lzdFJlcG8gPSBmYWxzZTsKY29udGludWU7Cn0KJHJlcG9zW10gPSBSZXBvc2l0b3J5RmFjdG9yeTo6Y3JlYXRlUmVwbygkaW8sICRjb25maWcsICRyZXBvQ29uZmlnLCAkcmVwb01hbmFnZXIpOwp9CgppZiAoJGNyZWF0ZURlZmF1bHRQYWNrYWdpc3RSZXBvKSB7CiRyZXBvc1tdID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmNyZWF0ZVJlcG8oJGlvLCAkY29uZmlnLCBbCid0eXBlJyA9PiAnY29tcG9zZXInLAondXJsJyA9PiAnaHR0cHM6Ly9yZXBvLnBhY2thZ2lzdC5vcmcnLApdLCAkcmVwb01hbmFnZXIpOwp9CgokdGhpcy0+cmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkcmVwb3MpOwp1bnNldCgkcmVwb3MsICRjb25maWcsICRyZXBvc2l0b3JpZXMpOwp9CgokaW8tPndyaXRlRXJyb3IoWwonJywKJGZvcm1hdHRlci0+Zm9ybWF0QmxvY2soJ1dlbGNvbWUgdG8gdGhlIENvbXBvc2VyIGNvbmZpZyBnZW5lcmF0b3InLCAnYmc9Ymx1ZTtmZz13aGl0ZScsIHRydWUpLAonJywKXSk7CgoKJGlvLT53cml0ZUVycm9yKFsKJycsCidUaGlzIGNvbW1hbmQgd2lsbCBndWlkZSB5b3UgdGhyb3VnaCBjcmVhdGluZyB5b3VyIGNvbXBvc2VyLmpzb24gY29uZmlnLicsCicnLApdKTsKCiRjd2QgPSByZWFscGF0aCgiLiIpOwoKJG5hbWUgPSAkaW5wdXQtPmdldE9wdGlvbignbmFtZScpOwppZiAobnVsbCA9PT0gJG5hbWUpIHsKJG5hbWUgPSBiYXNlbmFtZSgkY3dkKTsKJG5hbWUgPSAkdGhpcy0+c2FuaXRpemVQYWNrYWdlTmFtZUNvbXBvbmVudCgkbmFtZSk7CgokdmVuZG9yID0gJG5hbWU7CmlmICghZW1wdHkoJF9TRVJWRVJbJ0NPTVBPU0VSX0RFRkFVTFRfVkVORE9SJ10pKSB7CiR2ZW5kb3IgPSAkX1NFUlZFUlsnQ09NUE9TRVJfREVGQVVMVF9WRU5ET1InXTsKfSBlbHNlaWYgKGlzc2V0KCRnaXRbJ2dpdGh1Yi51c2VyJ10pKSB7CiR2ZW5kb3IgPSAkZ2l0WydnaXRodWIudXNlciddOwp9IGVsc2VpZiAoIWVtcHR5KCRfU0VSVkVSWydVU0VSTkFNRSddKSkgewokdmVuZG9yID0gJF9TRVJWRVJbJ1VTRVJOQU1FJ107Cn0gZWxzZWlmICghZW1wdHkoJF9TRVJWRVJbJ1VTRVInXSkpIHsKJHZlbmRvciA9ICRfU0VSVkVSWydVU0VSJ107Cn0gZWxzZWlmIChnZXRfY3VycmVudF91c2VyKCkpIHsKJHZlbmRvciA9IGdldF9jdXJyZW50X3VzZXIoKTsKfQoKJHZlbmRvciA9ICR0aGlzLT5zYW5pdGl6ZVBhY2thZ2VOYW1lQ29tcG9uZW50KCR2ZW5kb3IpOwoKJG5hbWUgPSAkdmVuZG9yIC4gJy8nIC4gJG5hbWU7Cn0KCiRuYW1lID0gJGlvLT5hc2tBbmRWYWxpZGF0ZSgKJ1BhY2thZ2UgbmFtZSAoPHZlbmRvcj4vPG5hbWU+KSBbPGNvbW1lbnQ+Jy4kbmFtZS4nPC9jb21tZW50Pl06ICcsCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCRuYW1lKSB7CmlmIChudWxsID09PSAkdmFsdWUpIHsKcmV0dXJuICRuYW1lOwp9CgppZiAoIVByZWc6OmlzTWF0Y2goJ3teW2EtejAtOV0oW18uLV0/W2EtejAtOV0rKSpcL1thLXowLTldKChbXy5dfC17MSwyfSk/W2EtejAtOV0rKSokfUQnLCAkdmFsdWUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonVGhlIHBhY2thZ2UgbmFtZSAnLiR2YWx1ZS4nIGlzIGludmFsaWQsIGl0IHNob3VsZCBiZSBsb3dlcmNhc2UgYW5kIGhhdmUgYSB2ZW5kb3IgbmFtZSwgYSBmb3J3YXJkIHNsYXNoLCBhbmQgYSBwYWNrYWdlIG5hbWUsIG1hdGNoaW5nOiBbYS16MC05Xy4tXSsvW2EtejAtOV8uLV0rJwopOwp9CgpyZXR1cm4gJHZhbHVlOwp9LApudWxsLAokbmFtZQopOwokaW5wdXQtPnNldE9wdGlvbignbmFtZScsICRuYW1lKTsKCiRkZXNjcmlwdGlvbiA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdkZXNjcmlwdGlvbicpID86IG51bGw7CiRkZXNjcmlwdGlvbiA9ICRpby0+YXNrKAonRGVzY3JpcHRpb24gWzxjb21tZW50PicuJGRlc2NyaXB0aW9uLic8L2NvbW1lbnQ+XTogJywKJGRlc2NyaXB0aW9uCik7CiRpbnB1dC0+c2V0T3B0aW9uKCdkZXNjcmlwdGlvbicsICRkZXNjcmlwdGlvbik7CgppZiAobnVsbCA9PT0gJGF1dGhvciA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdhdXRob3InKSkgewppZiAoIWVtcHR5KCRfU0VSVkVSWydDT01QT1NFUl9ERUZBVUxUX0FVVEhPUiddKSkgewokYXV0aG9yX25hbWUgPSAkX1NFUlZFUlsnQ09NUE9TRVJfREVGQVVMVF9BVVRIT1InXTsKfSBlbHNlaWYgKGlzc2V0KCRnaXRbJ3VzZXIubmFtZSddKSkgewokYXV0aG9yX25hbWUgPSAkZ2l0Wyd1c2VyLm5hbWUnXTsKfQoKaWYgKCFlbXB0eSgkX1NFUlZFUlsnQ09NUE9TRVJfREVGQVVMVF9FTUFJTCddKSkgewokYXV0aG9yX2VtYWlsID0gJF9TRVJWRVJbJ0NPTVBPU0VSX0RFRkFVTFRfRU1BSUwnXTsKfSBlbHNlaWYgKGlzc2V0KCRnaXRbJ3VzZXIuZW1haWwnXSkpIHsKJGF1dGhvcl9lbWFpbCA9ICRnaXRbJ3VzZXIuZW1haWwnXTsKfQoKaWYgKGlzc2V0KCRhdXRob3JfbmFtZSwgJGF1dGhvcl9lbWFpbCkpIHsKJGF1dGhvciA9IHNwcmludGYoJyVzIDwlcz4nLCAkYXV0aG9yX25hbWUsICRhdXRob3JfZW1haWwpOwp9Cn0KCiRhdXRob3IgPSAkaW8tPmFza0FuZFZhbGlkYXRlKAonQXV0aG9yIFsnLihpc19zdHJpbmcoJGF1dGhvcikgPyAnPGNvbW1lbnQ+Jy4kYXV0aG9yLic8L2NvbW1lbnQ+LCAnIDogJycpIC4gJ24gdG8gc2tpcF06ICcsCmZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJGF1dGhvcikgewppZiAoJHZhbHVlID09PSAnbicgfHwgJHZhbHVlID09PSAnbm8nKSB7CnJldHVybjsKfQokdmFsdWUgPSAkdmFsdWUgPzogJGF1dGhvcjsKJGF1dGhvciA9ICR0aGlzLT5wYXJzZUF1dGhvclN0cmluZygkdmFsdWUgPz8gJycpOwoKaWYgKCRhdXRob3JbJ2VtYWlsJ10gPT09IG51bGwpIHsKcmV0dXJuICRhdXRob3JbJ25hbWUnXTsKfQoKcmV0dXJuIHNwcmludGYoJyVzIDwlcz4nLCAkYXV0aG9yWyduYW1lJ10sICRhdXRob3JbJ2VtYWlsJ10pOwp9LApudWxsLAokYXV0aG9yCik7CiRpbnB1dC0+c2V0T3B0aW9uKCdhdXRob3InLCAkYXV0aG9yKTsKCiRtaW5pbXVtU3RhYmlsaXR5ID0gJGlucHV0LT5nZXRPcHRpb24oJ3N0YWJpbGl0eScpID86IG51bGw7CiRtaW5pbXVtU3RhYmlsaXR5ID0gJGlvLT5hc2tBbmRWYWxpZGF0ZSgKJ01pbmltdW0gU3RhYmlsaXR5IFs8Y29tbWVudD4nLiRtaW5pbXVtU3RhYmlsaXR5Lic8L2NvbW1lbnQ+XTogJywKc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJG1pbmltdW1TdGFiaWxpdHkpIHsKaWYgKG51bGwgPT09ICR2YWx1ZSkgewpyZXR1cm4gJG1pbmltdW1TdGFiaWxpdHk7Cn0KCmlmICghaXNzZXQoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTWyR2YWx1ZV0pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonSW52YWxpZCBtaW5pbXVtIHN0YWJpbGl0eSAiJy4kdmFsdWUuJyIuIE11c3QgYmUgZW1wdHkgb3Igb25lIG9mOiAnLgppbXBsb2RlKCcsICcsIGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTKSkKKTsKfQoKcmV0dXJuICR2YWx1ZTsKfSwKbnVsbCwKJG1pbmltdW1TdGFiaWxpdHkKKTsKJGlucHV0LT5zZXRPcHRpb24oJ3N0YWJpbGl0eScsICRtaW5pbXVtU3RhYmlsaXR5KTsKCiR0eXBlID0gJGlucHV0LT5nZXRPcHRpb24oJ3R5cGUnKTsKJHR5cGUgPSAkaW8tPmFzaygKJ1BhY2thZ2UgVHlwZSAoZS5nLiBsaWJyYXJ5LCBwcm9qZWN0LCBtZXRhcGFja2FnZSwgY29tcG9zZXItcGx1Z2luKSBbPGNvbW1lbnQ+Jy4kdHlwZS4nPC9jb21tZW50Pl06ICcsCiR0eXBlCik7CmlmICgkdHlwZSA9PT0gJycgfHwgJHR5cGUgPT09IGZhbHNlKSB7CiR0eXBlID0gbnVsbDsKfQokaW5wdXQtPnNldE9wdGlvbigndHlwZScsICR0eXBlKTsKCmlmIChudWxsID09PSAkbGljZW5zZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdsaWNlbnNlJykpIHsKaWYgKCFlbXB0eSgkX1NFUlZFUlsnQ09NUE9TRVJfREVGQVVMVF9MSUNFTlNFJ10pKSB7CiRsaWNlbnNlID0gJF9TRVJWRVJbJ0NPTVBPU0VSX0RFRkFVTFRfTElDRU5TRSddOwp9Cn0KCiRsaWNlbnNlID0gJGlvLT5hc2soCidMaWNlbnNlIFs8Y29tbWVudD4nLiRsaWNlbnNlLic8L2NvbW1lbnQ+XTogJywKJGxpY2Vuc2UKKTsKJHNwZHggPSBuZXcgU3BkeExpY2Vuc2VzKCk7CmlmIChudWxsICE9PSAkbGljZW5zZSAmJiAhJHNwZHgtPnZhbGlkYXRlKCRsaWNlbnNlKSAmJiAkbGljZW5zZSAhPT0gJ3Byb3ByaWV0YXJ5Jykgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBsaWNlbnNlIHByb3ZpZGVkOiAnLiRsaWNlbnNlLicuIE9ubHkgU1BEWCBsaWNlbnNlIGlkZW50aWZpZXJzIChodHRwczovL3NwZHgub3JnL2xpY2Vuc2VzLykgb3IgInByb3ByaWV0YXJ5IiBhcmUgYWNjZXB0ZWQuJyk7Cn0KJGlucHV0LT5zZXRPcHRpb24oJ2xpY2Vuc2UnLCAkbGljZW5zZSk7CgokaW8tPndyaXRlRXJyb3IoWycnLCAnRGVmaW5lIHlvdXIgZGVwZW5kZW5jaWVzLicsICcnXSk7CgoKJHJlcG9zID0gJHRoaXMtPmdldFJlcG9zKCk7CiRwcmVmZXJyZWRTdGFiaWxpdHkgPSAkbWluaW11bVN0YWJpbGl0eSA/OiAnc3RhYmxlJzsKJHBsYXRmb3JtUmVwbyA9IG51bGw7CmlmICgkcmVwb3MgaW5zdGFuY2VvZiBDb21wb3NpdGVSZXBvc2l0b3J5KSB7CmZvcmVhY2ggKCRyZXBvcy0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJGNhbmRpZGF0ZVJlcG8pIHsKaWYgKCRjYW5kaWRhdGVSZXBvIGluc3RhbmNlb2YgUGxhdGZvcm1SZXBvc2l0b3J5KSB7CiRwbGF0Zm9ybVJlcG8gPSAkY2FuZGlkYXRlUmVwbzsKYnJlYWs7Cn0KfQp9CgokcXVlc3Rpb24gPSAnV291bGQgeW91IGxpa2UgdG8gZGVmaW5lIHlvdXIgZGVwZW5kZW5jaWVzIChyZXF1aXJlKSBpbnRlcmFjdGl2ZWx5IFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJzsKJHJlcXVpcmUgPSAkaW5wdXQtPmdldE9wdGlvbigncmVxdWlyZScpOwokcmVxdWlyZW1lbnRzID0gW107CmlmIChjb3VudCgkcmVxdWlyZSkgPiAwIHx8ICRpby0+YXNrQ29uZmlybWF0aW9uKCRxdWVzdGlvbikpIHsKJHJlcXVpcmVtZW50cyA9ICR0aGlzLT5kZXRlcm1pbmVSZXF1aXJlbWVudHMoJGlucHV0LCAkb3V0cHV0LCAkcmVxdWlyZSwgJHBsYXRmb3JtUmVwbywgJHByZWZlcnJlZFN0YWJpbGl0eSk7Cn0KJGlucHV0LT5zZXRPcHRpb24oJ3JlcXVpcmUnLCAkcmVxdWlyZW1lbnRzKTsKCiRxdWVzdGlvbiA9ICdXb3VsZCB5b3UgbGlrZSB0byBkZWZpbmUgeW91ciBkZXYgZGVwZW5kZW5jaWVzIChyZXF1aXJlLWRldikgaW50ZXJhY3RpdmVseSBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICc7CiRyZXF1aXJlRGV2ID0gJGlucHV0LT5nZXRPcHRpb24oJ3JlcXVpcmUtZGV2Jyk7CiRkZXZSZXF1aXJlbWVudHMgPSBbXTsKaWYgKGNvdW50KCRyZXF1aXJlRGV2KSA+IDAgfHwgJGlvLT5hc2tDb25maXJtYXRpb24oJHF1ZXN0aW9uKSkgewokZGV2UmVxdWlyZW1lbnRzID0gJHRoaXMtPmRldGVybWluZVJlcXVpcmVtZW50cygkaW5wdXQsICRvdXRwdXQsICRyZXF1aXJlRGV2LCAkcGxhdGZvcm1SZXBvLCAkcHJlZmVycmVkU3RhYmlsaXR5KTsKfQokaW5wdXQtPnNldE9wdGlvbigncmVxdWlyZS1kZXYnLCAkZGV2UmVxdWlyZW1lbnRzKTsKCgokYXV0b2xvYWQgPSAkaW5wdXQtPmdldE9wdGlvbignYXV0b2xvYWQnKSA/OiAnc3JjLyc7CiRuYW1lc3BhY2UgPSAkdGhpcy0+bmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKChzdHJpbmcpICRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lJykpOwokYXV0b2xvYWQgPSAkaW8tPmFza0FuZFZhbGlkYXRlKAonQWRkIFBTUi00IGF1dG9sb2FkIG1hcHBpbmc/IE1hcHMgbmFtZXNwYWNlICInLiRuYW1lc3BhY2UuJyIgdG8gdGhlIGVudGVyZWQgcmVsYXRpdmUgcGF0aC4gWzxjb21tZW50PicuJGF1dG9sb2FkLic8L2NvbW1lbnQ+LCBuIHRvIHNraXBdOiAnLApzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkYXV0b2xvYWQpIHsKaWYgKG51bGwgPT09ICR2YWx1ZSkgewpyZXR1cm4gJGF1dG9sb2FkOwp9CgppZiAoJHZhbHVlID09PSAnbicgfHwgJHZhbHVlID09PSAnbm8nKSB7CnJldHVybjsKfQoKJHZhbHVlID0gJHZhbHVlID86ICRhdXRvbG9hZDsKCmlmICghUHJlZzo6aXNNYXRjaCgne15bXi9dW0EtWmEtejAtOVwtXy9dKy8kfScsICR2YWx1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKJ1RoZSBzcmMgZm9sZGVyIG5hbWUgIiVzIiBpcyBpbnZhbGlkLiBQbGVhc2UgYWRkIGEgcmVsYXRpdmUgcGF0aCB3aXRoIHRhaWxpbmcgZm9yd2FyZCBzbGFzaC4gW0EtWmEtejAtOV8tL10rLycsCiR2YWx1ZQopKTsKfQoKcmV0dXJuICR2YWx1ZTsKfSwKbnVsbCwKJGF1dG9sb2FkCik7CiRpbnB1dC0+c2V0T3B0aW9uKCdhdXRvbG9hZCcsICRhdXRvbG9hZCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcGFyc2VBdXRob3JTdHJpbmcoc3RyaW5nICRhdXRob3IpOiBhcnJheQp7CmlmIChQcmVnOjppc01hdGNoKCcvXig/UDxuYW1lPlstIC4sXHB7TH1ccHtOfVxwe01ufVwn4oCZIigpXSspKD86XHMrPCg/UDxlbWFpbD4uKz8pPik/JC91JywgJGF1dGhvciwgJG1hdGNoKSkgewppZiAobnVsbCAhPT0gJG1hdGNoWydlbWFpbCddICYmICEkdGhpcy0+aXNWYWxpZEVtYWlsKCRtYXRjaFsnZW1haWwnXSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgZW1haWwgIicuJG1hdGNoWydlbWFpbCddLiciJyk7Cn0KCnJldHVybiBbCiduYW1lJyA9PiB0cmltKCRtYXRjaFsnbmFtZSddKSwKJ2VtYWlsJyA9PiAkbWF0Y2hbJ2VtYWlsJ10sCl07Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonSW52YWxpZCBhdXRob3Igc3RyaW5nLiAgTXVzdCBiZSBpbiB0aGUgZm9ybWF0czogJy4KJ0phbmUgRG9lIG9yIEpvaG4gU21pdGggPGpvaG5AZXhhbXBsZS5jb20+JwopOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZm9ybWF0QXV0aG9ycyhzdHJpbmcgJGF1dGhvcik6IGFycmF5CnsKJGF1dGhvciA9ICR0aGlzLT5wYXJzZUF1dGhvclN0cmluZygkYXV0aG9yKTsKaWYgKG51bGwgPT09ICRhdXRob3JbJ2VtYWlsJ10pIHsKdW5zZXQoJGF1dGhvclsnZW1haWwnXSk7Cn0KCnJldHVybiBbJGF1dGhvcl07Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShzdHJpbmcgJHBhY2thZ2VOYW1lKTogP3N0cmluZwp7CmlmICghJHBhY2thZ2VOYW1lIHx8IHN0cnBvcygkcGFja2FnZU5hbWUsICcvJykgPT09IGZhbHNlKSB7CnJldHVybiBudWxsOwp9CgokbmFtZXNwYWNlID0gYXJyYXlfbWFwKApzdGF0aWMgZnVuY3Rpb24gKCRwYXJ0KTogc3RyaW5nIHsKJHBhcnQgPSBQcmVnOjpyZXBsYWNlKCcvW15hLXowLTldL2knLCAnICcsICRwYXJ0KTsKJHBhcnQgPSB1Y3dvcmRzKCRwYXJ0KTsKCnJldHVybiBzdHJfcmVwbGFjZSgnICcsICcnLCAkcGFydCk7Cn0sCmV4cGxvZGUoJy8nLCAkcGFja2FnZU5hbWUpCik7CgpyZXR1cm4gaW1wbG9kZSgnXFwnLCAkbmFtZXNwYWNlKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEdpdENvbmZpZygpOiBhcnJheQp7CmlmIChudWxsICE9PSAkdGhpcy0+Z2l0Q29uZmlnKSB7CnJldHVybiAkdGhpcy0+Z2l0Q29uZmlnOwp9CgokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJHRoaXMtPmdldElPKCkpOwoKaWYgKDAgPT09ICRwcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2NvbmZpZycsICctbCddLCAkb3V0cHV0KSkgewokdGhpcy0+Z2l0Q29uZmlnID0gW107ClByZWc6Om1hdGNoQWxsU3RyaWN0R3JvdXBzKCd7XihbXj1dKyk9KC4qKSR9bScsICRvdXRwdXQsICRtYXRjaGVzKTsKZm9yZWFjaCAoJG1hdGNoZXNbMV0gYXMgJGtleSA9PiAkbWF0Y2gpIHsKJHRoaXMtPmdpdENvbmZpZ1skbWF0Y2hdID0gJG1hdGNoZXNbMl1bJGtleV07Cn0KCnJldHVybiAkdGhpcy0+Z2l0Q29uZmlnOwp9CgpyZXR1cm4gJHRoaXMtPmdpdENvbmZpZyA9IFtdOwp9CgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNWZW5kb3JJZ25vcmUoc3RyaW5nICRpZ25vcmVGaWxlLCBzdHJpbmcgJHZlbmRvciA9ICd2ZW5kb3InKTogYm9vbAp7CmlmICghZmlsZV9leGlzdHMoJGlnbm9yZUZpbGUpKSB7CnJldHVybiBmYWxzZTsKfQoKJHBhdHRlcm4gPSBzcHJpbnRmKCd7Xi8/JXMoL1wqPyk/JH0nLCBwcmVnX3F1b3RlKCR2ZW5kb3IpKTsKCiRsaW5lcyA9IGZpbGUoJGlnbm9yZUZpbGUsIEZJTEVfSUdOT1JFX05FV19MSU5FUyk7CmZvcmVhY2ggKCRsaW5lcyBhcyAkbGluZSkgewppZiAoUHJlZzo6aXNNYXRjaCgkcGF0dGVybiwgJGxpbmUpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZFZlbmRvcklnbm9yZShzdHJpbmcgJGlnbm9yZUZpbGUsIHN0cmluZyAkdmVuZG9yID0gJy92ZW5kb3IvJyk6IHZvaWQKewokY29udGVudHMgPSAiIjsKaWYgKGZpbGVfZXhpc3RzKCRpZ25vcmVGaWxlKSkgewokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkaWdub3JlRmlsZSk7CgppZiAoc3RycG9zKCRjb250ZW50cywgIlxuIikgIT09IDApIHsKJGNvbnRlbnRzIC49ICJcbiI7Cn0KfQoKZmlsZV9wdXRfY29udGVudHMoJGlnbm9yZUZpbGUsICRjb250ZW50cyAuICR2ZW5kb3IuICJcbiIpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaXNWYWxpZEVtYWlsKHN0cmluZyAkZW1haWwpOiBib29sCnsKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdmaWx0ZXJfdmFyJykpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZSAhPT0gZmlsdGVyX3ZhcigkZW1haWwsIEZJTFRFUl9WQUxJREFURV9FTUFJTCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdXBkYXRlRGVwZW5kZW5jaWVzKE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CnRyeSB7CiR1cGRhdGVDb21tYW5kID0gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmZpbmQoJ3VwZGF0ZScpOwokdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+cmVzZXRDb21wb3NlcigpOwokdXBkYXRlQ29tbWFuZC0+cnVuKG5ldyBBcnJheUlucHV0KFtdKSwgJG91dHB1dCk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJ0NvdWxkIG5vdCB1cGRhdGUgZGVwZW5kZW5jaWVzLiBSdW4gYGNvbXBvc2VyIHVwZGF0ZWAgdG8gc2VlIG1vcmUgaW5mb3JtYXRpb24uJyk7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBydW5EdW1wQXV0b2xvYWRDb21tYW5kKE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CnRyeSB7CiRjb21tYW5kID0gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmZpbmQoJ2R1bXAtYXV0b2xvYWQnKTsKJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPnJlc2V0Q29tcG9zZXIoKTsKJGNvbW1hbmQtPnJ1bihuZXcgQXJyYXlJbnB1dChbXSksICRvdXRwdXQpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCdDb3VsZCBub3QgcnVuIGR1bXAtYXV0b2xvYWQuJyk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBoYXNEZXBlbmRlbmNpZXMoYXJyYXkgJG9wdGlvbnMpOiBib29sCnsKJHJlcXVpcmVzID0gKGFycmF5KSAkb3B0aW9uc1sncmVxdWlyZSddOwokZGV2UmVxdWlyZXMgPSBpc3NldCgkb3B0aW9uc1sncmVxdWlyZS1kZXYnXSkgPyAoYXJyYXkpICRvcHRpb25zWydyZXF1aXJlLWRldiddIDogW107CgpyZXR1cm4gIWVtcHR5KCRyZXF1aXJlcykgfHwgIWVtcHR5KCRkZXZSZXF1aXJlcyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2FuaXRpemVQYWNrYWdlTmFtZUNvbXBvbmVudChzdHJpbmcgJG5hbWUpOiBzdHJpbmcKewokbmFtZSA9IFByZWc6OnJlcGxhY2UoJ3soPzooW2Etel0pKFtBLVpdKXwoW0EtWl0pKFtBLVpdW2Etel0pKX0nLCAnXFwxXFwzLVxcMlxcNCcsICRuYW1lKTsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKJG5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7XltfLi1dK3xbXy4tXSskfFteYS16MC05Xy4tXX11JywgJycsICRuYW1lKTsKJG5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7KFtfLi1dKXsyLH19dScsICckMScsICRuYW1lKTsKCnJldHVybiAkbmFtZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEluc3RhbGxlcjsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKCmNsYXNzIEluc3RhbGxDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpCnsKJHRoaXMKLT5zZXROYW1lKCdpbnN0YWxsJykKLT5zZXRBbGlhc2VzKFsnaSddKQotPnNldERlc2NyaXB0aW9uKCdJbnN0YWxscyB0aGUgcHJvamVjdCBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgY29tcG9zZXIubG9jayBmaWxlIGlmIHByZXNlbnQsIG9yIGZhbGxzIGJhY2sgb24gdGhlIGNvbXBvc2VyLmpzb24nKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIHNvdXJjZXMgd2hlbiBwb3NzaWJsZSwgaW5jbHVkaW5nIFZDUyBpbmZvcm1hdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItZGlzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdCAoZGVmYXVsdCBiZWhhdmlvcikuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0fHNvdXJjZXxhdXRvIChhdXRvIGNob29zZXMgc291cmNlIGZvciBkZXYgdmVyc2lvbnMsIGRpc3QgZm9yIHRoZSByZXN0KS4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFByZWZlckluc3RhbGwoKSksCm5ldyBJbnB1dE9wdGlvbignZHJ5LXJ1bicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3V0cHV0cyB0aGUgb3BlcmF0aW9ucyBidXQgd2lsbCBub3QgZXhlY3V0ZSBhbnl0aGluZyAoaW1wbGljaXRseSBlbmFibGVzIC0tdmVyYm9zZSkuJyksCm5ldyBJbnB1dE9wdGlvbignZG93bmxvYWQtb25seScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG93bmxvYWQgb25seSwgZG8gbm90IGluc3RhbGwgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdERVBSRUNBVEVEOiBFbmFibGVzIGluc3RhbGxhdGlvbiBvZiByZXF1aXJlLWRldiBwYWNrYWdlcyAoZW5hYmxlZCBieSBkZWZhdWx0LCBvbmx5IHByZXNlbnQgZm9yIEJDKS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1zdWdnZXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdERVBSRUNBVEVEOiBUaGlzIGZsYWcgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIGluc3RhbGxhdGlvbiBvZiByZXF1aXJlLWRldiBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCduby1hdXRvbG9hZGVyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTa2lwcyBhdXRvbG9hZGVyIGdlbmVyYXRpb24nKSwKbmV3IElucHV0T3B0aW9uKCduby1wcm9ncmVzcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IG91dHB1dCBkb3dubG9hZCBwcm9ncmVzcy4nKSwKbmV3IElucHV0T3B0aW9uKCduby1pbnN0YWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3QgdXNlLCBvbmx5IGRlZmluZWQgaGVyZSB0byBjYXRjaCBtaXN1c2Ugb2YgdGhlIGluc3RhbGwgY29tbWFuZC4nKSwKbmV3IElucHV0T3B0aW9uKCdhdWRpdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUnVuIGFuIGF1ZGl0IGFmdGVyIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZS4nKSwKbmV3IElucHV0T3B0aW9uKCdhdWRpdC1mb3JtYXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdBdWRpdCBvdXRwdXQgZm9ybWF0LiBNdXN0IGJlICJ0YWJsZSIsICJwbGFpbiIsICJqc29uIiwgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZLCBBdWRpdG9yOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCd2ZXJib3NlJywgJ3Z8dnZ8dnZ2JywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93cyBtb3JlIGRldGFpbHMgaW5jbHVkaW5nIG5ldyBjb21taXRzIHB1bGxlZCBpbiB3aGVuIHVwZGF0aW5nIHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInLCAnbycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3B0aW1pemUgYXV0b2xvYWRlciBkdXJpbmcgYXV0b2xvYWRlciBkdW1wJyksCm5ldyBJbnB1dE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScsICdhJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBdXRvbG9hZCBjbGFzc2VzIGZyb20gdGhlIGNsYXNzbWFwIG9ubHkuIEltcGxpY2l0bHkgZW5hYmxlcyBgLS1vcHRpbWl6ZS1hdXRvbG9hZGVyYC4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1VzZSBBUEN1IHRvIGNhY2hlIGZvdW5kL25vdC1mb3VuZCBjbGFzc2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdVc2UgYSBjdXN0b20gcHJlZml4IGZvciB0aGUgQVBDdSBhdXRvbG9hZGVyIGNhY2hlLiBJbXBsaWNpdGx5IGVuYWJsZXMgLS1hcGN1LWF1dG9sb2FkZXInKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlcycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdTaG91bGQgbm90IGJlIHByb3ZpZGVkLCB1c2UgY29tcG9zZXIgcmVxdWlyZSBpbnN0ZWFkIHRvIGFkZCBhIGdpdmVuIHBhY2thZ2UgdG8gY29tcG9zZXIuanNvbi4nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPmluc3RhbGw8L2luZm8+IGNvbW1hbmQgcmVhZHMgdGhlIGNvbXBvc2VyLmxvY2sgZmlsZSBmcm9tCnRoZSBjdXJyZW50IGRpcmVjdG9yeSwgcHJvY2Vzc2VzIGl0LCBhbmQgZG93bmxvYWRzIGFuZCBpbnN0YWxscyBhbGwgdGhlCmxpYnJhcmllcyBhbmQgZGVwZW5kZW5jaWVzIG91dGxpbmVkIGluIHRoYXQgZmlsZS4gSWYgdGhlIGZpbGUgZG9lcyBub3QKZXhpc3QgaXQgd2lsbCBsb29rIGZvciBjb21wb3Nlci5qc29uIGFuZCBkbyB0aGUgc2FtZS4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIGluc3RhbGw8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNpbnN0YWxsLWkKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGlvID0gJHRoaXMtPmdldElPKCk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignZGV2JykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9wdGlvbiAiLS1kZXYiLiBJdCBoYXMgbm8gZWZmZWN0IGFuZCB3aWxsIGJyZWFrIGluIENvbXBvc2VyIDMuPC93YXJuaW5nPicpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tc3VnZ2VzdCcpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSB1c2luZyB0aGUgZGVwcmVjYXRlZCBvcHRpb24gIi0tbm8tc3VnZ2VzdCIuIEl0IGhhcyBubyBlZmZlY3QgYW5kIHdpbGwgYnJlYWsgaW4gQ29tcG9zZXIgMy48L3dhcm5pbmc+Jyk7Cn0KCiRhcmdzID0gJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKTsKaWYgKGNvdW50KCRhcmdzKSA+IDApIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SW52YWxpZCBhcmd1bWVudCAnLmltcGxvZGUoJyAnLCAkYXJncykuJy4gVXNlICJjb21wb3NlciByZXF1aXJlICcuaW1wbG9kZSgnICcsICRhcmdzKS4nIiBpbnN0ZWFkIHRvIGFkZCBwYWNrYWdlcyB0byB5b3VyIGNvbXBvc2VyLmpzb24uPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWluc3RhbGwnKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5JbnZhbGlkIG9wdGlvbiAiLS1uby1pbnN0YWxsIi4gVXNlICJjb21wb3NlciB1cGRhdGUgLS1uby1pbnN0YWxsIiBpbnN0ZWFkIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgY29tcG9zZXIubG9jayBmaWxlLjwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKaWYgKCEkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpICYmICFIdHRwRG93bmxvYWRlcjo6aXNDdXJsRW5hYmxlZCgpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q29tcG9zZXIgaXMgb3BlcmF0aW5nIHNpZ25pZmljYW50bHkgc2xvd2VyIHRoYW4gbm9ybWFsIGJlY2F1c2UgeW91IGRvIG5vdCBoYXZlIHRoZSBQSFAgY3VybCBleHRlbnNpb24gZW5hYmxlZC48L3dhcm5pbmc+Jyk7Cn0KCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ2luc3RhbGwnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJGluc3RhbGwgPSBJbnN0YWxsZXI6OmNyZWF0ZSgkaW8sICRjb21wb3Nlcik7CgokY29uZmlnID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKTsKWyRwcmVmZXJTb3VyY2UsICRwcmVmZXJEaXN0XSA9ICR0aGlzLT5nZXRQcmVmZXJyZWRJbnN0YWxsT3B0aW9ucygkY29uZmlnLCAkaW5wdXQpOwoKJG9wdGltaXplID0gJGlucHV0LT5nZXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInKSB8fCAkY29uZmlnLT5nZXQoJ29wdGltaXplLWF1dG9sb2FkZXInKTsKJGF1dGhvcml0YXRpdmUgPSAkaW5wdXQtPmdldE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpIHx8ICRjb25maWctPmdldCgnY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpOwokYXBjdVByZWZpeCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4Jyk7CiRhcGN1ID0gJGFwY3VQcmVmaXggIT09IG51bGwgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicpIHx8ICRjb25maWctPmdldCgnYXBjdS1hdXRvbG9hZGVyJyk7CgokY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+c2V0T3V0cHV0UHJvZ3Jlc3MoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1wcm9ncmVzcycpKTsKCiRpbnN0YWxsCi0+c2V0RHJ5UnVuKCRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykpCi0+c2V0RG93bmxvYWRPbmx5KCRpbnB1dC0+Z2V0T3B0aW9uKCdkb3dubG9hZC1vbmx5JykpCi0+c2V0VmVyYm9zZSgkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKQotPnNldFByZWZlclNvdXJjZSgkcHJlZmVyU291cmNlKQotPnNldFByZWZlckRpc3QoJHByZWZlckRpc3QpCi0+c2V0RGV2TW9kZSghJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKQotPnNldER1bXBBdXRvbG9hZGVyKCEkaW5wdXQtPmdldE9wdGlvbignbm8tYXV0b2xvYWRlcicpKQotPnNldE9wdGltaXplQXV0b2xvYWRlcigkb3B0aW1pemUpCi0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRhdXRob3JpdGF0aXZlKQotPnNldEFwY3VBdXRvbG9hZGVyKCRhcGN1LCAkYXBjdVByZWZpeCkKLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCkpCi0+c2V0QXVkaXQoJGlucHV0LT5nZXRPcHRpb24oJ2F1ZGl0JykpCi0+c2V0RXJyb3JPbkF1ZGl0KCRpbnB1dC0+Z2V0T3B0aW9uKCdhdWRpdCcpKQotPnNldEF1ZGl0Rm9ybWF0KCR0aGlzLT5nZXRBdWRpdEZvcm1hdCgkaW5wdXQpKQo7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXBsdWdpbnMnKSkgewokaW5zdGFsbC0+ZGlzYWJsZVBsdWdpbnMoKTsKfQoKcmV0dXJuICRpbnN0YWxsLT5ydW4oKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVV0aWxzOwp1c2UgQ29tcG9zZXJcVXRpbFxQYWNrYWdlSW5mbzsKdXNlIENvbXBvc2VyXFV0aWxcUGFja2FnZVNvcnRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcU3R5bGVcU3ltZm9ueVN0eWxlOwoKCgoKY2xhc3MgTGljZW5zZXNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2xpY2Vuc2VzJykKLT5zZXREZXNjcmlwdGlvbignU2hvd3MgaW5mb3JtYXRpb24gYWJvdXQgbGljZW5zZXMgb2YgZGVwZW5kZW5jaWVzJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0Zvcm1hdCBvZiB0aGUgb3V0cHV0OiB0ZXh0LCBqc29uIG9yIHN1bW1hcnknLCAndGV4dCcsIFsndGV4dCcsICdqc29uJywgJ3N1bW1hcnknXSksCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyBzZWFyY2ggaW4gcmVxdWlyZS1kZXYgcGFja2FnZXMuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSBsaWNlbnNlIGNvbW1hbmQgZGlzcGxheXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpY2Vuc2VzIG9mCnRoZSBpbnN0YWxsZWQgZGVwZW5kZW5jaWVzLgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjbGljZW5zZXMKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAnbGljZW5zZXMnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJHJvb3QgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKJHJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewokcGFja2FnZXMgPSBSZXBvc2l0b3J5VXRpbHM6OmZpbHRlclJlcXVpcmVkUGFja2FnZXMoJHJlcG8tPmdldFBhY2thZ2VzKCksICRyb290KTsKfSBlbHNlIHsKJHBhY2thZ2VzID0gJHJlcG8tPmdldFBhY2thZ2VzKCk7Cn0KCiRwYWNrYWdlcyA9IFBhY2thZ2VTb3J0ZXI6OnNvcnRQYWNrYWdlc0FscGhhYmV0aWNhbGx5KCRwYWNrYWdlcyk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKc3dpdGNoICgkZm9ybWF0ID0gJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpKSB7CmNhc2UgJ3RleHQnOgokaW8tPndyaXRlKCdOYW1lOiA8Y29tbWVudD4nLiRyb290LT5nZXRQcmV0dHlOYW1lKCkuJzwvY29tbWVudD4nKTsKJGlvLT53cml0ZSgnVmVyc2lvbjogPGNvbW1lbnQ+Jy4kcm9vdC0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKS4nPC9jb21tZW50PicpOwokaW8tPndyaXRlKCdMaWNlbnNlczogPGNvbW1lbnQ+Jy4oaW1wbG9kZSgnLCAnLCAkcm9vdC0+Z2V0TGljZW5zZSgpKSA/OiAnbm9uZScpLic8L2NvbW1lbnQ+Jyk7CiRpby0+d3JpdGUoJ0RlcGVuZGVuY2llczonKTsKJGlvLT53cml0ZSgnJyk7CgokdGFibGUgPSBuZXcgVGFibGUoJG91dHB1dCk7CiR0YWJsZS0+c2V0U3R5bGUoJ2NvbXBhY3QnKTsKJHRhYmxlLT5zZXRIZWFkZXJzKFsnTmFtZScsICdWZXJzaW9uJywgJ0xpY2Vuc2VzJ10pOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJGxpbmsgPSBQYWNrYWdlSW5mbzo6Z2V0Vmlld1NvdXJjZU9ySG9tZXBhZ2VVcmwoJHBhY2thZ2UpOwppZiAoJGxpbmsgIT09IG51bGwpIHsKJG5hbWUgPSAnPGhyZWY9Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkbGluaykuJz4nLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJzwvPic7Cn0gZWxzZSB7CiRuYW1lID0gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKfQoKJHRhYmxlLT5hZGRSb3coWwokbmFtZSwKJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCksCmltcGxvZGUoJywgJywgJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgPyAkcGFja2FnZS0+Z2V0TGljZW5zZSgpIDogW10pID86ICdub25lJywKXSk7Cn0KJHRhYmxlLT5yZW5kZXIoKTsKYnJlYWs7CgpjYXNlICdqc29uJzoKJGRlcGVuZGVuY2llcyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJGRlcGVuZGVuY2llc1skcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpXSA9IFsKJ3ZlcnNpb24nID0+ICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLAonbGljZW5zZScgPT4gJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgPyAkcGFja2FnZS0+Z2V0TGljZW5zZSgpIDogW10sCl07Cn0KCiRpby0+d3JpdGUoSnNvbkZpbGU6OmVuY29kZShbCiduYW1lJyA9PiAkcm9vdC0+Z2V0UHJldHR5TmFtZSgpLAondmVyc2lvbicgPT4gJHJvb3QtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCksCidsaWNlbnNlJyA9PiAkcm9vdC0+Z2V0TGljZW5zZSgpLAonZGVwZW5kZW5jaWVzJyA9PiAkZGVwZW5kZW5jaWVzLApdKSk7CmJyZWFrOwoKY2FzZSAnc3VtbWFyeSc6CiR1c2VkTGljZW5zZXMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRsaWNlbnNlcyA9ICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJHBhY2thZ2UtPmdldExpY2Vuc2UoKSA6IFtdOwppZiAoY291bnQoJGxpY2Vuc2VzKSA9PT0gMCkgewokbGljZW5zZXNbXSA9ICdub25lJzsKfQpmb3JlYWNoICgkbGljZW5zZXMgYXMgJGxpY2Vuc2VOYW1lKSB7CmlmICghaXNzZXQoJHVzZWRMaWNlbnNlc1skbGljZW5zZU5hbWVdKSkgewokdXNlZExpY2Vuc2VzWyRsaWNlbnNlTmFtZV0gPSAwOwp9CiR1c2VkTGljZW5zZXNbJGxpY2Vuc2VOYW1lXSsrOwp9Cn0KCgphcnNvcnQoJHVzZWRMaWNlbnNlcywgU09SVF9OVU1FUklDKTsKCiRyb3dzID0gW107CmZvcmVhY2ggKCR1c2VkTGljZW5zZXMgYXMgJHVzZWRMaWNlbnNlID0+ICRudW1iZXJPZkRlcGVuZGVuY2llcykgewokcm93c1tdID0gWyR1c2VkTGljZW5zZSwgJG51bWJlck9mRGVwZW5kZW5jaWVzXTsKfQoKJHN5bWZvbnlJbyA9IG5ldyBTeW1mb255U3R5bGUoJGlucHV0LCAkb3V0cHV0KTsKJHN5bWZvbnlJby0+dGFibGUoClsnTGljZW5zZScsICdOdW1iZXIgb2YgZGVwZW5kZW5jaWVzJ10sCiRyb3dzCik7CmJyZWFrOwpkZWZhdWx0Ogp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVW5zdXBwb3J0ZWQgZm9ybWF0ICIlcyIuICBTZWUgaGVscCBmb3Igc3VwcG9ydGVkIGZvcm1hdHMuJywgJGZvcm1hdCkpOwp9CgpyZXR1cm4gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XEFycmF5SW5wdXQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgT3V0ZGF0ZWRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdvdXRkYXRlZCcpCi0+c2V0RGVzY3JpcHRpb24oJ1Nob3dzIGEgbGlzdCBvZiBpbnN0YWxsZWQgcGFja2FnZXMgdGhhdCBoYXZlIHVwZGF0ZXMgYXZhaWxhYmxlLCBpbmNsdWRpbmcgdGhlaXIgbGF0ZXN0IHZlcnNpb24nKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnUGFja2FnZSB0byBpbnNwZWN0LiBPciBhIG5hbWUgaW5jbHVkaW5nIGEgd2lsZGNhcmQgKCopIHRvIGZpbHRlciBsaXN0cyBvZiBwYWNrYWdlcyBpbnN0ZWFkLicsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZShmYWxzZSkpLApuZXcgSW5wdXRPcHRpb24oJ291dGRhdGVkJywgJ28nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgb25seSBwYWNrYWdlcyB0aGF0IGFyZSBvdXRkYXRlZCAodGhpcyBpcyB0aGUgZGVmYXVsdCwgYnV0IHByZXNlbnQgaGVyZSBmb3IgY29tcGF0IHdpdGggYHNob3dgJyksCm5ldyBJbnB1dE9wdGlvbignYWxsJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgYWxsIGluc3RhbGxlZCBwYWNrYWdlcyB3aXRoIHRoZWlyIGxhdGVzdCB2ZXJzaW9ucycpLApuZXcgSW5wdXRPcHRpb24oJ2xvY2tlZCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvd3MgdXBkYXRlcyBmb3IgcGFja2FnZXMgZnJvbSB0aGUgbG9jayBmaWxlLCByZWdhcmRsZXNzIG9mIHdoYXQgaXMgY3VycmVudGx5IGluIHZlbmRvciBkaXInKSwKbmV3IElucHV0T3B0aW9uKCdkaXJlY3QnLCAnRCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvd3Mgb25seSBwYWNrYWdlcyB0aGF0IGFyZSBkaXJlY3RseSByZXF1aXJlZCBieSB0aGUgcm9vdCBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbignc3RyaWN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgd2hlbiB0aGVyZSBhcmUgb3V0ZGF0ZWQgcGFja2FnZXMnKSwKbmV3IElucHV0T3B0aW9uKCdtYWpvci1vbmx5JywgJ00nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgb25seSBwYWNrYWdlcyB0aGF0IGhhdmUgbWFqb3IgU2VtVmVyLWNvbXBhdGlibGUgdXBkYXRlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdtaW5vci1vbmx5JywgJ20nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgb25seSBwYWNrYWdlcyB0aGF0IGhhdmUgbWlub3IgU2VtVmVyLWNvbXBhdGlibGUgdXBkYXRlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdwYXRjaC1vbmx5JywgJ3AnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgb25seSBwYWNrYWdlcyB0aGF0IGhhdmUgcGF0Y2ggU2VtVmVyLWNvbXBhdGlibGUgdXBkYXRlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdzb3J0LWJ5LWFnZScsICdBJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNwbGF5cyB0aGUgaW5zdGFsbGVkIHZlcnNpb25cJ3MgYWdlLCBhbmQgc29ydHMgcGFja2FnZXMgb2xkZXN0IGZpcnN0LicpLApuZXcgSW5wdXRPcHRpb24oJ2Zvcm1hdCcsICdmJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRm9ybWF0IG9mIHRoZSBvdXRwdXQ6IHRleHQgb3IganNvbicsICd0ZXh0JywgWydqc29uJywgJ3RleHQnXSksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIHNwZWNpZmllZCBwYWNrYWdlKHMpLiBDYW4gY29udGFpbiB3aWxkY2FyZHMgKCopLiBVc2UgaXQgaWYgeW91IGRvblwndCB3YW50IHRvIGJlIGluZm9ybWVkIGFib3V0IG5ldyB2ZXJzaW9ucyBvZiBzb21lIHBhY2thZ2VzLicsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZShmYWxzZSkpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgc2VhcmNoIGluIHJlcXVpcmUtZGV2IHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgYSBzcGVjaWZpYyBwbGF0Zm9ybSByZXF1aXJlbWVudCAocGhwICYgZXh0LSBwYWNrYWdlcykuIFVzZSB3aXRoIHRoZSAtLW91dGRhdGVkIG9wdGlvbicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuIFVzZSB3aXRoIHRoZSAtLW91dGRhdGVkIG9wdGlvbicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgb3V0ZGF0ZWQgY29tbWFuZCBpcyBqdXN0IGEgcHJveHkgZm9yIGBjb21wb3NlciBzaG93IC1sYAoKVGhlIGNvbG9yIGNvZGluZyAob3Igc2lnbmFnZSBpZiB5b3UgaGF2ZSBBTlNJIGNvbG9ycyBkaXNhYmxlZCkgZm9yIGRlcGVuZGVuY3kgdmVyc2lvbnMgaXMgYXMgc3VjaDoKCi0gPGluZm8+Z3JlZW48L2luZm8+ICg9KTogRGVwZW5kZW5jeSBpcyBpbiB0aGUgbGF0ZXN0IHZlcnNpb24gYW5kIGlzIHVwIHRvIGRhdGUuCi0gPGNvbW1lbnQ+eWVsbG93PC9jb21tZW50PiAofik6IERlcGVuZGVuY3kgaGFzIGEgbmV3IHZlcnNpb24gYXZhaWxhYmxlIHRoYXQgaW5jbHVkZXMgYmFja3dhcmRzCiAgY29tcGF0aWJpbGl0eSBicmVha3MgYWNjb3JkaW5nIHRvIHNlbXZlciwgc28gdXBncmFkZSB3aGVuIHlvdSBjYW4gYnV0IGl0CiAgbWF5IGludm9sdmUgd29yay4KLSA8aGlnaGxpZ2h0PnJlZDwvaGlnaGxpZ2h0PiAoISk6IERlcGVuZGVuY3kgaGFzIGEgbmV3IHZlcnNpb24gdGhhdCBpcyBzZW12ZXItY29tcGF0aWJsZSBhbmQgeW91IHNob3VsZCB1cGdyYWRlIGl0LgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjb3V0ZGF0ZWQKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGFyZ3MgPSBbCidjb21tYW5kJyA9PiAnc2hvdycsCictLWxhdGVzdCcgPT4gdHJ1ZSwKXTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1pbnRlcmFjdGlvbicpKSB7CiRhcmdzWyctLW5vLWludGVyYWN0aW9uJ10gPSB0cnVlOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tcGx1Z2lucycpKSB7CiRhcmdzWyctLW5vLXBsdWdpbnMnXSA9IHRydWU7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1zY3JpcHRzJykpIHsKJGFyZ3NbJy0tbm8tc2NyaXB0cyddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWNhY2hlJykpIHsKJGFyZ3NbJy0tbm8tY2FjaGUnXSA9IHRydWU7Cn0KaWYgKCEkaW5wdXQtPmdldE9wdGlvbignYWxsJykpIHsKJGFyZ3NbJy0tb3V0ZGF0ZWQnXSA9IHRydWU7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkaXJlY3QnKSkgewokYXJnc1snLS1kaXJlY3QnXSA9IHRydWU7Cn0KaWYgKG51bGwgIT09ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2UnKSkgewokYXJnc1sncGFja2FnZSddID0gJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZScpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignc3RyaWN0JykpIHsKJGFyZ3NbJy0tc3RyaWN0J10gPSB0cnVlOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbWFqb3Itb25seScpKSB7CiRhcmdzWyctLW1ham9yLW9ubHknXSA9IHRydWU7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdtaW5vci1vbmx5JykpIHsKJGFyZ3NbJy0tbWlub3Itb25seSddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3BhdGNoLW9ubHknKSkgewokYXJnc1snLS1wYXRjaC1vbmx5J10gPSB0cnVlOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbG9ja2VkJykpIHsKJGFyZ3NbJy0tbG9ja2VkJ10gPSB0cnVlOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpIHsKJGFyZ3NbJy0tbm8tZGV2J10gPSB0cnVlOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignc29ydC1ieS1hZ2UnKSkgewokYXJnc1snLS1zb3J0LWJ5LWFnZSddID0gdHJ1ZTsKfQokYXJnc1snLS1pZ25vcmUtcGxhdGZvcm0tcmVxJ10gPSAkaW5wdXQtPmdldE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJykpIHsKJGFyZ3NbJy0taWdub3JlLXBsYXRmb3JtLXJlcXMnXSA9IHRydWU7Cn0KJGFyZ3NbJy0tZm9ybWF0J10gPSAkaW5wdXQtPmdldE9wdGlvbignZm9ybWF0Jyk7CiRhcmdzWyctLWlnbm9yZSddID0gJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZScpOwoKJGlucHV0ID0gbmV3IEFycmF5SW5wdXQoJGFyZ3MpOwoKcmV0dXJuICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5ydW4oJGlucHV0LCAkb3V0cHV0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUHJveHlDb21tYW5kKCk6IGJvb2wKewpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25TZWxlY3RvcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKdHJhaXQgUGFja2FnZURpc2NvdmVyeVRyYWl0CnsKCnByaXZhdGUgJHJlcG9zOwoKcHJpdmF0ZSAkcmVwb3NpdG9yeVNldHM7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UmVwb3MoKTogQ29tcG9zaXRlUmVwb3NpdG9yeQp7CmlmIChudWxsID09PSAkdGhpcy0+cmVwb3MpIHsKJHRoaXMtPnJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoYXJyYXlfbWVyZ2UoCltuZXcgUGxhdGZvcm1SZXBvc2l0b3J5XSwKUmVwb3NpdG9yeUZhY3Rvcnk6OmRlZmF1bHRSZXBvc1dpdGhEZWZhdWx0TWFuYWdlcigkdGhpcy0+Z2V0SU8oKSkKKSk7Cn0KCnJldHVybiAkdGhpcy0+cmVwb3M7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeVNldChJbnB1dEludGVyZmFjZSAkaW5wdXQsID9zdHJpbmcgJG1pbmltdW1TdGFiaWxpdHkgPSBudWxsKTogUmVwb3NpdG9yeVNldAp7CiRrZXkgPSAkbWluaW11bVN0YWJpbGl0eSA/PyAnZGVmYXVsdCc7CgppZiAoIWlzc2V0KCR0aGlzLT5yZXBvc2l0b3J5U2V0c1ska2V5XSkpIHsKJHRoaXMtPnJlcG9zaXRvcnlTZXRzWyRrZXldID0gJHJlcG9zaXRvcnlTZXQgPSBuZXcgUmVwb3NpdG9yeVNldCgkbWluaW11bVN0YWJpbGl0eSA/PyAkdGhpcy0+Z2V0TWluaW11bVN0YWJpbGl0eSgkaW5wdXQpKTsKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkoJHRoaXMtPmdldFJlcG9zKCkpOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG9zaXRvcnlTZXRzWyRrZXldOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldE1pbmltdW1TdGFiaWxpdHkoSW5wdXRJbnRlcmZhY2UgJGlucHV0KTogc3RyaW5nCnsKaWYgKCRpbnB1dC0+aGFzT3B0aW9uKCdzdGFiaWxpdHknKSkgeyAKcmV0dXJuIFZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkaW5wdXQtPmdldE9wdGlvbignc3RhYmlsaXR5JykgPz8gJ3N0YWJsZScpOwp9CgoKJGZpbGUgPSBGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKTsKaWYgKGlzX2ZpbGUoJGZpbGUpICYmIEZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGZpbGUpICYmIGlzX2FycmF5KCRjb21wb3NlciA9IGpzb25fZGVjb2RlKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSwgdHJ1ZSkpKSB7CmlmIChpc3NldCgkY29tcG9zZXJbJ21pbmltdW0tc3RhYmlsaXR5J10pKSB7CnJldHVybiBWZXJzaW9uUGFyc2VyOjpub3JtYWxpemVTdGFiaWxpdHkoJGNvbXBvc2VyWydtaW5pbXVtLXN0YWJpbGl0eSddKTsKfQp9CgpyZXR1cm4gJ3N0YWJsZSc7Cn0KCgoKCgoKCmZpbmFsIHByb3RlY3RlZCBmdW5jdGlvbiBkZXRlcm1pbmVSZXF1aXJlbWVudHMoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgYXJyYXkgJHJlcXVpcmVzID0gW10sID9QbGF0Zm9ybVJlcG9zaXRvcnkgJHBsYXRmb3JtUmVwbyA9IG51bGwsIHN0cmluZyAkcHJlZmVycmVkU3RhYmlsaXR5ID0gJ3N0YWJsZScsIGJvb2wgJHVzZUJlc3RWZXJzaW9uQ29uc3RyYWludCA9IHRydWUsIGJvb2wgJGZpeGVkID0gZmFsc2UpOiBhcnJheQp7CmlmIChjb3VudCgkcmVxdWlyZXMpID4gMCkgewokcmVxdWlyZXMgPSAkdGhpcy0+bm9ybWFsaXplUmVxdWlyZW1lbnRzKCRyZXF1aXJlcyk7CiRyZXN1bHQgPSBbXTsKJGlvID0gJHRoaXMtPmdldElPKCk7Cgpmb3JlYWNoICgkcmVxdWlyZXMgYXMgJHJlcXVpcmVtZW50KSB7CmlmIChpc3NldCgkcmVxdWlyZW1lbnRbJ3ZlcnNpb24nXSkgJiYgUHJlZzo6aXNNYXRjaCgne15cZCsoXC5cZCspPyR9JywgJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ10pKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+VGhlICInLiRyZXF1aXJlbWVudFsndmVyc2lvbiddLiciIGNvbnN0cmFpbnQgZm9yICInLiRyZXF1aXJlbWVudFsnbmFtZSddLiciIGFwcGVhcnMgdG9vIHN0cmljdCBhbmQgd2lsbCBsaWtlbHkgbm90IG1hdGNoIHdoYXQgeW91IHdhbnQuIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9jb25zdHJhaW50czwvd2FybmluZz4nKTsKfQoKaWYgKCFpc3NldCgkcmVxdWlyZW1lbnRbJ3ZlcnNpb24nXSkpIHsKClskbmFtZSwgJHZlcnNpb25dID0gJHRoaXMtPmZpbmRCZXN0VmVyc2lvbkFuZE5hbWVGb3JQYWNrYWdlKCR0aGlzLT5nZXRJTygpLCAkaW5wdXQsICRyZXF1aXJlbWVudFsnbmFtZSddLCAkcGxhdGZvcm1SZXBvLCAkcHJlZmVycmVkU3RhYmlsaXR5LCAkZml4ZWQpOwoKCiRyZXF1aXJlbWVudFsnbmFtZSddID0gJG5hbWU7CgppZiAoJHVzZUJlc3RWZXJzaW9uQ29uc3RyYWludCkgewokcmVxdWlyZW1lbnRbJ3ZlcnNpb24nXSA9ICR2ZXJzaW9uOwokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKJ1VzaW5nIHZlcnNpb24gPGluZm8+JXM8L2luZm8+IGZvciA8aW5mbz4lczwvaW5mbz4nLAokcmVxdWlyZW1lbnRbJ3ZlcnNpb24nXSwKJHJlcXVpcmVtZW50WyduYW1lJ10KKSk7Cn0gZWxzZSB7CiRyZXF1aXJlbWVudFsndmVyc2lvbiddID0gJ2d1ZXNzJzsKfQp9CgokcmVzdWx0W10gPSAkcmVxdWlyZW1lbnRbJ25hbWUnXSAuICcgJyAuICRyZXF1aXJlbWVudFsndmVyc2lvbiddOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKJHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwoKCiRjb21wb3NlciA9ICR0aGlzLT50cnlDb21wb3NlcigpOwokaW5zdGFsbGVkUmVwbyA9IG51bGw7CmlmIChudWxsICE9PSAkY29tcG9zZXIpIHsKJGluc3RhbGxlZFJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwp9CiRleGlzdGluZ1BhY2thZ2VzID0gW107CmlmIChudWxsICE9PSAkaW5zdGFsbGVkUmVwbykgewpmb3JlYWNoICgkaW5zdGFsbGVkUmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokZXhpc3RpbmdQYWNrYWdlc1tdID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKfQp9CnVuc2V0KCRjb21wb3NlciwgJGluc3RhbGxlZFJlcG8pOwoKJGlvID0gJHRoaXMtPmdldElPKCk7CndoaWxlIChudWxsICE9PSAkcGFja2FnZSA9ICRpby0+YXNrKCdTZWFyY2ggZm9yIGEgcGFja2FnZTogJykpIHsKJG1hdGNoZXMgPSAkdGhpcy0+Z2V0UmVwb3MoKS0+c2VhcmNoKCRwYWNrYWdlKTsKCmlmIChjb3VudCgkbWF0Y2hlcykgPiAwKSB7Cgpmb3JlYWNoICgkbWF0Y2hlcyBhcyAkcG9zaXRpb24gPT4gJGZvdW5kUGFja2FnZSkgewppZiAoaW5fYXJyYXkoJGZvdW5kUGFja2FnZVsnbmFtZSddLCAkZXhpc3RpbmdQYWNrYWdlcywgdHJ1ZSkpIHsKdW5zZXQoJG1hdGNoZXNbJHBvc2l0aW9uXSk7Cn0KfQokbWF0Y2hlcyA9IGFycmF5X3ZhbHVlcygkbWF0Y2hlcyk7CgokZXhhY3RNYXRjaCA9IGZhbHNlOwpmb3JlYWNoICgkbWF0Y2hlcyBhcyAkbWF0Y2gpIHsKaWYgKCRtYXRjaFsnbmFtZSddID09PSAkcGFja2FnZSkgewokZXhhY3RNYXRjaCA9IHRydWU7CmJyZWFrOwp9Cn0KCgppZiAoISRleGFjdE1hdGNoKSB7CiRwcm92aWRlcnMgPSAkdGhpcy0+Z2V0UmVwb3MoKS0+Z2V0UHJvdmlkZXJzKCRwYWNrYWdlKTsKaWYgKGNvdW50KCRwcm92aWRlcnMpID4gMCkgewphcnJheV91bnNoaWZ0KCRtYXRjaGVzLCBbJ25hbWUnID0+ICRwYWNrYWdlLCAnZGVzY3JpcHRpb24nID0+ICcnXSk7Cn0KCiRjaG9pY2VzID0gW107CmZvcmVhY2ggKCRtYXRjaGVzIGFzICRwb3NpdGlvbiA9PiAkZm91bmRQYWNrYWdlKSB7CiRhYmFuZG9uZWQgPSAnJzsKaWYgKGlzc2V0KCRmb3VuZFBhY2thZ2VbJ2FiYW5kb25lZCddKSkgewppZiAoaXNfc3RyaW5nKCRmb3VuZFBhY2thZ2VbJ2FiYW5kb25lZCddKSkgewokcmVwbGFjZW1lbnQgPSBzcHJpbnRmKCdVc2UgJXMgaW5zdGVhZCcsICRmb3VuZFBhY2thZ2VbJ2FiYW5kb25lZCddKTsKfSBlbHNlIHsKJHJlcGxhY2VtZW50ID0gJ05vIHJlcGxhY2VtZW50IHdhcyBzdWdnZXN0ZWQnOwp9CiRhYmFuZG9uZWQgPSBzcHJpbnRmKCc8d2FybmluZz5BYmFuZG9uZWQuICVzLjwvd2FybmluZz4nLCAkcmVwbGFjZW1lbnQpOwp9CgokY2hvaWNlc1tdID0gc3ByaW50ZignIDxpbmZvPiU1czwvaW5mbz4gJXMgJXMnLCAiWyRwb3NpdGlvbl0iLCAkZm91bmRQYWNrYWdlWyduYW1lJ10sICRhYmFuZG9uZWQpOwp9CgokaW8tPndyaXRlRXJyb3IoWwonJywKc3ByaW50ZignRm91bmQgPGluZm8+JXM8L2luZm8+IHBhY2thZ2VzIG1hdGNoaW5nIDxpbmZvPiVzPC9pbmZvPicsIGNvdW50KCRtYXRjaGVzKSwgJHBhY2thZ2UpLAonJywKXSk7CgokaW8tPndyaXRlRXJyb3IoJGNob2ljZXMpOwokaW8tPndyaXRlRXJyb3IoJycpOwoKJHZhbGlkYXRvciA9IHN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICRzZWxlY3Rpb24pIHVzZSAoJG1hdGNoZXMsICR2ZXJzaW9uUGFyc2VyKSB7CmlmICgnJyA9PT0gJHNlbGVjdGlvbikgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChpc19udW1lcmljKCRzZWxlY3Rpb24pICYmIGlzc2V0KCRtYXRjaGVzWyhpbnQpICRzZWxlY3Rpb25dKSkgewokcGFja2FnZSA9ICRtYXRjaGVzWyhpbnQpICRzZWxlY3Rpb25dOwoKcmV0dXJuICRwYWNrYWdlWyduYW1lJ107Cn0KCmlmIChQcmVnOjppc01hdGNoKCd7XlxzKig/UDxuYW1lPltcUy9dKykoPzpccysoP1A8dmVyc2lvbj5cUyspKT9ccyokfScsICRzZWxlY3Rpb24sICRwYWNrYWdlTWF0Y2hlcykpIHsKaWYgKGlzc2V0KCRwYWNrYWdlTWF0Y2hlc1sndmVyc2lvbiddKSkgewoKCgokdmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkcGFja2FnZU1hdGNoZXNbJ3ZlcnNpb24nXSk7CgpyZXR1cm4gJHBhY2thZ2VNYXRjaGVzWyduYW1lJ10uJyAnLiRwYWNrYWdlTWF0Y2hlc1sndmVyc2lvbiddOwp9CgoKcmV0dXJuICRwYWNrYWdlTWF0Y2hlc1snbmFtZSddOwp9Cgp0aHJvdyBuZXcgXEV4Y2VwdGlvbignTm90IGEgdmFsaWQgc2VsZWN0aW9uJyk7Cn07CgokcGFja2FnZSA9ICRpby0+YXNrQW5kVmFsaWRhdGUoCidFbnRlciBwYWNrYWdlICMgdG8gYWRkLCBvciB0aGUgY29tcGxldGUgcGFja2FnZSBuYW1lIGlmIGl0IGlzIG5vdCBsaXN0ZWQ6ICcsCiR2YWxpZGF0b3IsCjMsCicnCik7Cn0KCgppZiAoZmFsc2UgIT09ICRwYWNrYWdlICYmIGZhbHNlID09PSBzdHJwb3MoJHBhY2thZ2UsICcgJykpIHsKJHZhbGlkYXRvciA9IHN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICRpbnB1dCkgewokaW5wdXQgPSB0cmltKCRpbnB1dCk7CgpyZXR1cm4gc3RybGVuKCRpbnB1dCkgPiAwID8gJGlucHV0IDogZmFsc2U7Cn07CgokY29uc3RyYWludCA9ICRpby0+YXNrQW5kVmFsaWRhdGUoCidFbnRlciB0aGUgdmVyc2lvbiBjb25zdHJhaW50IHRvIHJlcXVpcmUgKG9yIGxlYXZlIGJsYW5rIHRvIHVzZSB0aGUgbGF0ZXN0IHZlcnNpb24pOiAnLAokdmFsaWRhdG9yLAozLAonJwopOwoKaWYgKGZhbHNlID09PSAkY29uc3RyYWludCkgewpbLCAkY29uc3RyYWludF0gPSAkdGhpcy0+ZmluZEJlc3RWZXJzaW9uQW5kTmFtZUZvclBhY2thZ2UoJHRoaXMtPmdldElPKCksICRpbnB1dCwgJHBhY2thZ2UsICRwbGF0Zm9ybVJlcG8sICRwcmVmZXJyZWRTdGFiaWxpdHkpOwoKJGlvLT53cml0ZUVycm9yKHNwcmludGYoCidVc2luZyB2ZXJzaW9uIDxpbmZvPiVzPC9pbmZvPiBmb3IgPGluZm8+JXM8L2luZm8+JywKJGNvbnN0cmFpbnQsCiRwYWNrYWdlCikpOwp9CgokcGFja2FnZSAuPSAnICcuJGNvbnN0cmFpbnQ7Cn0KCmlmIChmYWxzZSAhPT0gJHBhY2thZ2UpIHsKJHJlcXVpcmVzW10gPSAkcGFja2FnZTsKJGV4aXN0aW5nUGFja2FnZXNbXSA9IGV4cGxvZGUoJyAnLCAkcGFja2FnZSlbMF07Cn0KfQp9CgpyZXR1cm4gJHJlcXVpcmVzOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmluZEJlc3RWZXJzaW9uQW5kTmFtZUZvclBhY2thZ2UoSU9JbnRlcmZhY2UgJGlvLCBJbnB1dEludGVyZmFjZSAkaW5wdXQsIHN0cmluZyAkbmFtZSwgP1BsYXRmb3JtUmVwb3NpdG9yeSAkcGxhdGZvcm1SZXBvID0gbnVsbCwgc3RyaW5nICRwcmVmZXJyZWRTdGFiaWxpdHkgPSAnc3RhYmxlJywgYm9vbCAkZml4ZWQgPSBmYWxzZSk6IGFycmF5CnsKCmlmICgkaW5wdXQtPmhhc09wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnKSAmJiAkaW5wdXQtPmhhc09wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScpKSB7CiRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gJHRoaXMtPmdldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJGlucHV0KTsKfSBlbHNlIHsKJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlTm90aGluZygpOwp9CgoKJHJlcG9TZXQgPSAkdGhpcy0+Z2V0UmVwb3NpdG9yeVNldCgkaW5wdXQpOwokdmVyc2lvblNlbGVjdG9yID0gbmV3IFZlcnNpb25TZWxlY3RvcigkcmVwb1NldCwgJHBsYXRmb3JtUmVwbyk7CiRlZmZlY3RpdmVNaW5pbXVtU3RhYmlsaXR5ID0gJHRoaXMtPmdldE1pbmltdW1TdGFiaWxpdHkoJGlucHV0KTsKCiRwYWNrYWdlID0gJHZlcnNpb25TZWxlY3Rvci0+ZmluZEJlc3RDYW5kaWRhdGUoJG5hbWUsIG51bGwsICRwcmVmZXJyZWRTdGFiaWxpdHksICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLCAwLCAkdGhpcy0+Z2V0SU8oKSk7CgppZiAoZmFsc2UgPT09ICRwYWNrYWdlKSB7CgoKaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJG5hbWUpKSB7CnJldHVybiBbJG5hbWUsICcqJ107Cn0KCgokcHJvdmlkZXJzID0gJHJlcG9TZXQtPmdldFByb3ZpZGVycygkbmFtZSk7CmlmIChjb3VudCgkcHJvdmlkZXJzKSA+IDApIHsKJGNvbnN0cmFpbnQgPSAnKic7CmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewokY29uc3RyYWludCA9ICR0aGlzLT5nZXRJTygpLT5hc2tBbmRWYWxpZGF0ZSgnUGFja2FnZSAiPGluZm8+Jy4kbmFtZS4nPC9pbmZvPiIgZG9lcyBub3QgZXhpc3QgYnV0IGlzIHByb3ZpZGVkIGJ5ICcuY291bnQoJHByb3ZpZGVycykuJyBwYWNrYWdlcy4gV2hpY2ggdmVyc2lvbiBjb25zdHJhaW50IHdvdWxkIHlvdSBsaWtlIHRvIHVzZT8gWzxpbmZvPio8L2luZm8+XSAnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSkgewokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkdmFsdWUpOwoKcmV0dXJuICR2YWx1ZTsKfSwgMywgJyonKTsKfQoKcmV0dXJuIFskbmFtZSwgJGNvbnN0cmFpbnRdOwp9CgoKaWYgKCEoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKSAmJiBmYWxzZSAhPT0gKCRjYW5kaWRhdGUgPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZSgkbmFtZSwgbnVsbCwgJHByZWZlcnJlZFN0YWJpbGl0eSwgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZUFsbCgpKSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKJ1BhY2thZ2UgJXMgaGFzIHJlcXVpcmVtZW50cyBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFBIUCB2ZXJzaW9uLCBQSFAgZXh0ZW5zaW9ucyBhbmQgQ29tcG9zZXIgdmVyc2lvbicgLiAkdGhpcy0+Z2V0UGxhdGZvcm1FeGNlcHRpb25EZXRhaWxzKCRjYW5kaWRhdGUsICRwbGF0Zm9ybVJlcG8pLAokbmFtZQopKTsKfQoKaWYgKGZhbHNlICE9PSAoJHBhY2thZ2UgPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZSgkbmFtZSwgbnVsbCwgJHByZWZlcnJlZFN0YWJpbGl0eSwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIsIFJlcG9zaXRvcnlTZXQ6OkFMTE9XX1VOQUNDRVBUQUJMRV9TVEFCSUxJVElFUykpKSB7CgppZiAoZmFsc2UgIT09ICgkYWxsUmVwb3NQYWNrYWdlID0gJHZlcnNpb25TZWxlY3Rvci0+ZmluZEJlc3RDYW5kaWRhdGUoJG5hbWUsIG51bGwsICRwcmVmZXJyZWRTdGFiaWxpdHksICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLCBSZXBvc2l0b3J5U2V0OjpBTExPV19TSEFET1dFRF9SRVBPU0lUT1JJRVMpKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigKJ1BhY2thZ2UgJy4kbmFtZS4nIGV4aXN0cyBpbiAnLiRhbGxSZXBvc1BhY2thZ2UtPmdldFJlcG9zaXRvcnkoKS0+Z2V0UmVwb05hbWUoKS4nIGFuZCAnLiRwYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCktPmdldFJlcG9OYW1lKCkuJyB3aGljaCBoYXMgYSBoaWdoZXIgcmVwb3NpdG9yeSBwcmlvcml0eS4gVGhlIHBhY2thZ2VzIGZyb20gdGhlIGhpZ2hlciBwcmlvcml0eSByZXBvc2l0b3J5IGRvIG5vdCBtYXRjaCB5b3VyIG1pbmltdW0tc3RhYmlsaXR5IGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBpbnN0YWxsYWJsZS4gVGhhdCByZXBvc2l0b3J5IGlzIGNhbm9uaWNhbCBzbyB0aGUgbG93ZXIgcHJpb3JpdHkgcmVwb1wncyBwYWNrYWdlcyBhcmUgbm90IGluc3RhbGxhYmxlLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvcmVwb3ByaW8gZm9yIGRldGFpbHMgYW5kIGFzc2lzdGFuY2UuJwopOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAonQ291bGQgbm90IGZpbmQgYSB2ZXJzaW9uIG9mIHBhY2thZ2UgJXMgbWF0Y2hpbmcgeW91ciBtaW5pbXVtLXN0YWJpbGl0eSAoJXMpLiBSZXF1aXJlIGl0IHdpdGggYW4gZXhwbGljaXQgdmVyc2lvbiBjb25zdHJhaW50IGFsbG93aW5nIGl0cyBkZXNpcmVkIHN0YWJpbGl0eS4nLAokbmFtZSwKJGVmZmVjdGl2ZU1pbmltdW1TdGFiaWxpdHkKKSk7Cn0KCmlmICghJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyICYmIGZhbHNlICE9PSAoJGNhbmRpZGF0ZSA9ICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRCZXN0Q2FuZGlkYXRlKCRuYW1lLCBudWxsLCAkcHJlZmVycmVkU3RhYmlsaXR5LCBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlQWxsKCksIFJlcG9zaXRvcnlTZXQ6OkFMTE9XX1VOQUNDRVBUQUJMRV9TVEFCSUxJVElFUykpKSB7CiRhZGRpdGlvbmFsID0gJyc7CmlmIChmYWxzZSA9PT0gJHZlcnNpb25TZWxlY3Rvci0+ZmluZEJlc3RDYW5kaWRhdGUoJG5hbWUsIG51bGwsICRwcmVmZXJyZWRTdGFiaWxpdHksIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVBbGwoKSkpIHsKJGFkZGl0aW9uYWwgPSBQSFBfRU9MLlBIUF9FT0wuJ0FkZGl0aW9uYWxseSwgdGhlIHBhY2thZ2Ugd2FzIG9ubHkgZm91bmQgd2l0aCBhIHN0YWJpbGl0eSBvZiAiJy4kY2FuZGlkYXRlLT5nZXRTdGFiaWxpdHkoKS4nIiB3aGlsZSB5b3VyIG1pbmltdW0gc3RhYmlsaXR5IGlzICInLiRlZmZlY3RpdmVNaW5pbXVtU3RhYmlsaXR5LiciLic7Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCidDb3VsZCBub3QgZmluZCBwYWNrYWdlICVzIGluIGFueSB2ZXJzaW9uIG1hdGNoaW5nIHlvdXIgUEhQIHZlcnNpb24sIFBIUCBleHRlbnNpb25zIGFuZCBDb21wb3NlciB2ZXJzaW9uJyAuICR0aGlzLT5nZXRQbGF0Zm9ybUV4Y2VwdGlvbkRldGFpbHMoJGNhbmRpZGF0ZSwgJHBsYXRmb3JtUmVwbykgLiAnJXMnLAokbmFtZSwKJGFkZGl0aW9uYWwKKSk7Cn0KCgokc2ltaWxhciA9ICR0aGlzLT5maW5kU2ltaWxhcigkbmFtZSk7CmlmIChjb3VudCgkc2ltaWxhcikgPiAwKSB7CmlmIChpbl9hcnJheSgkbmFtZSwgJHNpbWlsYXIsIHRydWUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCiJDb3VsZCBub3QgZmluZCBwYWNrYWdlICVzLiBJdCB3YXMgaG93ZXZlciBmb3VuZCB2aWEgcmVwb3NpdG9yeSBzZWFyY2gsIHdoaWNoIGluZGljYXRlcyBhIGNvbnNpc3RlbmN5IGlzc3VlIHdpdGggdGhlIHJlcG9zaXRvcnkuIiwKJG5hbWUKKSk7Cn0KCmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewokcmVzdWx0ID0gJGlvLT5zZWxlY3QoIjxlcnJvcj5Db3VsZCBub3QgZmluZCBwYWNrYWdlICRuYW1lLjwvZXJyb3I+XG5QaWNrIG9uZSBvZiB0aGVzZSBvciBsZWF2ZSBlbXB0eSB0byBhYm9ydDoiLCAkc2ltaWxhciwgZmFsc2UsIDEpOwppZiAoJHJlc3VsdCAhPT0gZmFsc2UpIHsKcmV0dXJuICR0aGlzLT5maW5kQmVzdFZlcnNpb25BbmROYW1lRm9yUGFja2FnZSgkaW8sICRpbnB1dCwgJHNpbWlsYXJbJHJlc3VsdF0sICRwbGF0Zm9ybVJlcG8sICRwcmVmZXJyZWRTdGFiaWxpdHksICRmaXhlZCk7Cn0KfQoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKIkNvdWxkIG5vdCBmaW5kIHBhY2thZ2UgJXMuXG5cbkRpZCB5b3UgbWVhbiAiIC4gKGNvdW50KCRzaW1pbGFyKSA+IDEgPyAnb25lIG9mIHRoZXNlJyA6ICd0aGlzJykgLiAiP1xuICAgICVzIiwKJG5hbWUsCmltcGxvZGUoIlxuICAgICIsICRzaW1pbGFyKQopKTsKfQoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKJ0NvdWxkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgdmVyc2lvbiBvZiBwYWNrYWdlICVzLiBDaGVjayB0aGUgcGFja2FnZSBzcGVsbGluZywgeW91ciB2ZXJzaW9uIGNvbnN0cmFpbnQgYW5kIHRoYXQgdGhlIHBhY2thZ2UgaXMgYXZhaWxhYmxlIGluIGEgc3RhYmlsaXR5IHdoaWNoIG1hdGNoZXMgeW91ciBtaW5pbXVtLXN0YWJpbGl0eSAoJXMpLicsCiRuYW1lLAokZWZmZWN0aXZlTWluaW11bVN0YWJpbGl0eQopKTsKfQoKcmV0dXJuIFsKJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSwKJGZpeGVkID8gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSA6ICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRSZWNvbW1lbmRlZFJlcXVpcmVWZXJzaW9uKCRwYWNrYWdlKSwKXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaW5kU2ltaWxhcihzdHJpbmcgJHBhY2thZ2UpOiBhcnJheQp7CnRyeSB7CmlmIChudWxsID09PSAkdGhpcy0+cmVwb3MpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignZmluZFNpbWlsYXIgd2FzIGNhbGxlZCBiZWZvcmUgJHRoaXMtPnJlcG9zIHdhcyBpbml0aWFsaXplZCcpOwp9CiRyZXN1bHRzID0gJHRoaXMtPnJlcG9zLT5zZWFyY2goJHBhY2thZ2UpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFxMb2dpY0V4Y2VwdGlvbikgewp0aHJvdyAkZTsKfQoKCnJldHVybiBbXTsKfQokc2ltaWxhclBhY2thZ2VzID0gW107CgokaW5zdGFsbGVkUmVwbyA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKS0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7Cgpmb3JlYWNoICgkcmVzdWx0cyBhcyAkcmVzdWx0KSB7CmlmIChudWxsICE9PSAkaW5zdGFsbGVkUmVwby0+ZmluZFBhY2thZ2UoJHJlc3VsdFsnbmFtZSddLCAnKicpKSB7Cgpjb250aW51ZTsKfQokc2ltaWxhclBhY2thZ2VzWyRyZXN1bHRbJ25hbWUnXV0gPSBsZXZlbnNodGVpbigkcGFja2FnZSwgJHJlc3VsdFsnbmFtZSddKTsKfQphc29ydCgkc2ltaWxhclBhY2thZ2VzKTsKCnJldHVybiBhcnJheV9rZXlzKGFycmF5X3NsaWNlKCRzaW1pbGFyUGFja2FnZXMsIDAsIDUpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQbGF0Zm9ybUV4Y2VwdGlvbkRldGFpbHMoUGFja2FnZUludGVyZmFjZSAkY2FuZGlkYXRlLCA/UGxhdGZvcm1SZXBvc2l0b3J5ICRwbGF0Zm9ybVJlcG8gPSBudWxsKTogc3RyaW5nCnsKJGRldGFpbHMgPSBbXTsKaWYgKG51bGwgPT09ICRwbGF0Zm9ybVJlcG8pIHsKcmV0dXJuICcnOwp9Cgpmb3JlYWNoICgkY2FuZGlkYXRlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CmlmICghUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CmNvbnRpbnVlOwp9CiRwbGF0Zm9ybVBrZyA9ICRwbGF0Zm9ybVJlcG8tPmZpbmRQYWNrYWdlKCRsaW5rLT5nZXRUYXJnZXQoKSwgJyonKTsKaWYgKG51bGwgPT09ICRwbGF0Zm9ybVBrZykgewppZiAoJHBsYXRmb3JtUmVwby0+aXNQbGF0Zm9ybVBhY2thZ2VEaXNhYmxlZCgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CiRkZXRhaWxzW10gPSAkY2FuZGlkYXRlLT5nZXRQcmV0dHlOYW1lKCkuJyAnLiRjYW5kaWRhdGUtPmdldFByZXR0eVZlcnNpb24oKS4nIHJlcXVpcmVzICcuJGxpbmstPmdldFRhcmdldCgpLicgJy4kbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLicgYnV0IGl0IGlzIGRpc2FibGVkIGJ5IHlvdXIgcGxhdGZvcm0gY29uZmlnLiBFbmFibGUgaXQgYWdhaW4gd2l0aCAiY29tcG9zZXIgY29uZmlnIHBsYXRmb3JtLicuJGxpbmstPmdldFRhcmdldCgpLicgLS11bnNldCIuJzsKfSBlbHNlIHsKJGRldGFpbHNbXSA9ICRjYW5kaWRhdGUtPmdldFByZXR0eU5hbWUoKS4nICcuJGNhbmRpZGF0ZS0+Z2V0UHJldHR5VmVyc2lvbigpLicgcmVxdWlyZXMgJy4kbGluay0+Z2V0VGFyZ2V0KCkuJyAnLiRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCkuJyBidXQgaXQgaXMgbm90IHByZXNlbnQuJzsKfQpjb250aW51ZTsKfQppZiAoISRsaW5rLT5nZXRDb25zdHJhaW50KCktPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHBsYXRmb3JtUGtnLT5nZXRWZXJzaW9uKCkpKSkgewokcGxhdGZvcm1Qa2dWZXJzaW9uID0gJHBsYXRmb3JtUGtnLT5nZXRQcmV0dHlWZXJzaW9uKCk7CiRwbGF0Zm9ybUV4dHJhID0gJHBsYXRmb3JtUGtnLT5nZXRFeHRyYSgpOwppZiAoaXNzZXQoJHBsYXRmb3JtRXh0cmFbJ2NvbmZpZy5wbGF0Zm9ybSddKSAmJiAkcGxhdGZvcm1Qa2cgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UpIHsKJHBsYXRmb3JtUGtnVmVyc2lvbiAuPSAnICgnLiRwbGF0Zm9ybVBrZy0+Z2V0RGVzY3JpcHRpb24oKS4nKSc7Cn0KJGRldGFpbHNbXSA9ICRjYW5kaWRhdGUtPmdldFByZXR0eU5hbWUoKS4nICcuJGNhbmRpZGF0ZS0+Z2V0UHJldHR5VmVyc2lvbigpLicgcmVxdWlyZXMgJy4kbGluay0+Z2V0VGFyZ2V0KCkuJyAnLiRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCkuJyB3aGljaCBkb2VzIG5vdCBtYXRjaCB5b3VyIGluc3RhbGxlZCB2ZXJzaW9uICcuJHBsYXRmb3JtUGtnVmVyc2lvbi4nLic7Cn0KfQoKaWYgKGNvdW50KCRkZXRhaWxzKSA9PT0gMCkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAnOicuUEhQX0VPTC4nICAtICcgLiBpbXBsb2RlKFBIUF9FT0wuJyAgLSAnLCAkZGV0YWlscyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKCgoKCmNsYXNzIFByb2hpYml0c0NvbW1hbmQgZXh0ZW5kcyBCYXNlRGVwZW5kZW5jeUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdwcm9oaWJpdHMnKQotPnNldEFsaWFzZXMoWyd3aHktbm90J10pCi0+c2V0RGVzY3JpcHRpb24oJ1Nob3dzIHdoaWNoIHBhY2thZ2VzIHByZXZlbnQgdGhlIGdpdmVuIHBhY2thZ2UgZnJvbSBiZWluZyBpbnN0YWxsZWQnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudChzZWxmOjpBUkdVTUVOVF9QQUNLQUdFLCBJbnB1dEFyZ3VtZW50OjpSRVFVSVJFRCwgJ1BhY2thZ2UgdG8gaW5zcGVjdCcsIG51bGwsICR0aGlzLT5zdWdnZXN0QXZhaWxhYmxlUGFja2FnZSgpKSwKbmV3IElucHV0QXJndW1lbnQoc2VsZjo6QVJHVU1FTlRfQ09OU1RSQUlOVCwgSW5wdXRBcmd1bWVudDo6UkVRVUlSRUQsICdWZXJzaW9uIGNvbnN0cmFpbnQsIHdoaWNoIHZlcnNpb24geW91IGV4cGVjdGVkIHRvIGJlIGluc3RhbGxlZCcpLApuZXcgSW5wdXRPcHRpb24oc2VsZjo6T1BUSU9OX1JFQ1VSU0lWRSwgJ3InLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JlY3Vyc2l2ZWx5IHJlc29sdmVzIHVwIHRvIHRoZSByb290IHBhY2thZ2UnKSwKbmV3IElucHV0T3B0aW9uKHNlbGY6Ok9QVElPTl9UUkVFLCAndCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUHJpbnRzIHRoZSByZXN1bHRzIGFzIGEgbmVzdGVkIHRyZWUnKSwKbmV3IElucHV0T3B0aW9uKCdsb2NrZWQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JlYWQgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBmcm9tIGNvbXBvc2VyLmxvY2snKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKRGlzcGxheXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgd2h5IGEgcGFja2FnZSBjYW5ub3QgYmUgaW5zdGFsbGVkLgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgcHJvaGliaXRzIGNvbXBvc2VyL2NvbXBvc2VyPC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjcHJvaGliaXRzLXdoeS1ub3QKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKcmV0dXJuIHBhcmVudDo6ZG9FeGVjdXRlKCRpbnB1dCwgJG91dHB1dCwgdHJ1ZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVuaW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxUcmFuc2FjdGlvbjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcU2NyaXB0XFNjcmlwdEV2ZW50czsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIFJlaW5zdGFsbENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ3JlaW5zdGFsbCcpCi0+c2V0RGVzY3JpcHRpb24oJ1VuaW5zdGFsbHMgYW5kIHJlaW5zdGFsbHMgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZXMnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIHNvdXJjZXMgd2hlbiBwb3NzaWJsZSwgaW5jbHVkaW5nIFZDUyBpbmZvcm1hdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItZGlzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdCAoZGVmYXVsdCBiZWhhdmlvcikuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0fHNvdXJjZXxhdXRvIChhdXRvIGNob29zZXMgc291cmNlIGZvciBkZXYgdmVyc2lvbnMsIGRpc3QgZm9yIHRoZSByZXN0KS4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFByZWZlckluc3RhbGwoKSksCm5ldyBJbnB1dE9wdGlvbignbm8tYXV0b2xvYWRlcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcHMgYXV0b2xvYWRlciBnZW5lcmF0aW9uJyksCm5ldyBJbnB1dE9wdGlvbignbm8tcHJvZ3Jlc3MnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBvdXRwdXQgZG93bmxvYWQgcHJvZ3Jlc3MuJyksCm5ldyBJbnB1dE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicsICdvJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPcHRpbWl6ZSBhdXRvbG9hZGVyIGR1cmluZyBhdXRvbG9hZGVyIGR1bXAnKSwKbmV3IElucHV0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0F1dG9sb2FkIGNsYXNzZXMgZnJvbSB0aGUgY2xhc3NtYXAgb25seS4gSW1wbGljaXRseSBlbmFibGVzIGAtLW9wdGltaXplLWF1dG9sb2FkZXJgLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVXNlIEFQQ3UgdG8gY2FjaGUgZm91bmQvbm90LWZvdW5kIGNsYXNzZXMuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyLXByZWZpeCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1VzZSBhIGN1c3RvbSBwcmVmaXggZm9yIHRoZSBBUEN1IGF1dG9sb2FkZXIgY2FjaGUuIEltcGxpY2l0bHkgZW5hYmxlcyAtLWFwY3UtYXV0b2xvYWRlcicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgYSBzcGVjaWZpYyBwbGF0Zm9ybSByZXF1aXJlbWVudCAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0lnbm9yZSBhbGwgcGxhdGZvcm0gcmVxdWlyZW1lbnRzIChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCd0eXBlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnRmlsdGVyIHBhY2thZ2VzIHRvIHJlaW5zdGFsbCBieSB0eXBlKHMpJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlVHlwZXMoZmFsc2UpKSwKbmV3IElucHV0QXJndW1lbnQoJ3BhY2thZ2VzJywgSW5wdXRBcmd1bWVudDo6SVNfQVJSQVksICdMaXN0IG9mIHBhY2thZ2UgbmFtZXMgdG8gcmVpbnN0YWxsLCBjYW4gaW5jbHVkZSBhIHdpbGRjYXJkICgqKSB0byBtYXRjaCBhbnkgc3Vic3RyaW5nLicsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZShmYWxzZSkpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+cmVpbnN0YWxsPC9pbmZvPiBjb21tYW5kIGxvb2tzIHVwIGluc3RhbGxlZCBwYWNrYWdlcyBieSBuYW1lLAp1bmluc3RhbGxzIHRoZW0gYW5kIHJlaW5zdGFsbHMgdGhlbS4gVGhpcyBsZXRzIHlvdSBkbyBhIGNsZWFuIGluc3RhbGwKb2YgYSBwYWNrYWdlIGlmIHlvdSBtZXNzZWQgd2l0aCBpdHMgZmlsZXMsIG9yIGlmIHlvdSB3aXNoIHRvIGNoYW5nZQp0aGUgaW5zdGFsbGF0aW9uIHR5cGUgdXNpbmcgLS1wcmVmZXItaW5zdGFsbC4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHJlaW5zdGFsbCBhY21lL2ZvbyAiYWNtZS9iYXItKiI8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNyZWluc3RhbGwKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGlvID0gJHRoaXMtPmdldElPKCk7CgokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokbG9jYWxSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJHBhY2thZ2VzVG9SZWluc3RhbGwgPSBbXTsKJHBhY2thZ2VOYW1lc1RvUmVpbnN0YWxsID0gW107CmlmIChcY291bnQoJGlucHV0LT5nZXRPcHRpb24oJ3R5cGUnKSkgPiAwKSB7CmlmIChcY291bnQoJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKSkgPiAwKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdZb3UgY2Fubm90IHNwZWNpZnkgcGFja2FnZSBuYW1lcyBhbmQgZmlsdGVyIGJ5IHR5cGUgYXQgdGhlIHNhbWUgdGltZS4nKTsKfQpmb3JlYWNoICgkbG9jYWxSZXBvLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmIChpbl9hcnJheSgkcGFja2FnZS0+Z2V0VHlwZSgpLCAkaW5wdXQtPmdldE9wdGlvbigndHlwZScpLCB0cnVlKSkgewokcGFja2FnZXNUb1JlaW5zdGFsbFtdID0gJHBhY2thZ2U7CiRwYWNrYWdlTmFtZXNUb1JlaW5zdGFsbFtdID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKfQp9Cn0gZWxzZSB7CmlmIChcY291bnQoJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKSkgPT09IDApIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1lvdSBtdXN0IHBhc3Mgb25lIG9yIG1vcmUgcGFja2FnZSBuYW1lcyB0byBiZSByZWluc3RhbGxlZC4nKTsKfQpmb3JlYWNoICgkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpIGFzICRwYXR0ZXJuKSB7CiRwYXR0ZXJuUmVnZXhwID0gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJHBhdHRlcm4pOwokbWF0Y2hlZCA9IGZhbHNlOwpmb3JlYWNoICgkbG9jYWxSZXBvLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmIChQcmVnOjppc01hdGNoKCRwYXR0ZXJuUmVnZXhwLCAkcGFja2FnZS0+Z2V0TmFtZSgpKSkgewokbWF0Y2hlZCA9IHRydWU7CiRwYWNrYWdlc1RvUmVpbnN0YWxsW10gPSAkcGFja2FnZTsKJHBhY2thZ2VOYW1lc1RvUmVpbnN0YWxsW10gPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9Cn0KCmlmICghJG1hdGNoZWQpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5QYXR0ZXJuICInIC4gJHBhdHRlcm4gLiAnIiBkb2VzIG5vdCBtYXRjaCBhbnkgY3VycmVudGx5IGluc3RhbGxlZCBwYWNrYWdlcy48L3dhcm5pbmc+Jyk7Cn0KfQp9CgppZiAoMCA9PT0gXGNvdW50KCRwYWNrYWdlc1RvUmVpbnN0YWxsKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkZvdW5kIG5vIHBhY2thZ2VzIHRvIHJlaW5zdGFsbCwgYWJvcnRpbmcuPC93YXJuaW5nPicpOwoKcmV0dXJuIDE7Cn0KCiR1bmluc3RhbGxPcGVyYXRpb25zID0gW107CmZvcmVhY2ggKCRwYWNrYWdlc1RvUmVpbnN0YWxsIGFzICRwYWNrYWdlKSB7CiR1bmluc3RhbGxPcGVyYXRpb25zW10gPSBuZXcgVW5pbnN0YWxsT3BlcmF0aW9uKCRwYWNrYWdlKTsKfQoKCiRwcmVzZW50UGFja2FnZXMgPSAkbG9jYWxSZXBvLT5nZXRQYWNrYWdlcygpOwokcmVzdWx0UGFja2FnZXMgPSAkcHJlc2VudFBhY2thZ2VzOwpmb3JlYWNoICgkcHJlc2VudFBhY2thZ2VzIGFzICRpbmRleCA9PiAkcGFja2FnZSkgewppZiAoaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJHBhY2thZ2VOYW1lc1RvUmVpbnN0YWxsLCB0cnVlKSkgewp1bnNldCgkcHJlc2VudFBhY2thZ2VzWyRpbmRleF0pOwp9Cn0KJHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCRwcmVzZW50UGFja2FnZXMsICRyZXN1bHRQYWNrYWdlcyk7CiRpbnN0YWxsT3BlcmF0aW9ucyA9ICR0cmFuc2FjdGlvbi0+Z2V0T3BlcmF0aW9ucygpOwoKCiRpbnN0YWxsT3JkZXIgPSBbXTsKZm9yZWFjaCAoJGluc3RhbGxPcGVyYXRpb25zIGFzICRpbmRleCA9PiAkb3ApIHsKaWYgKCRvcCBpbnN0YW5jZW9mIEluc3RhbGxPcGVyYXRpb24gJiYgISRvcC0+Z2V0UGFja2FnZSgpIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRpbnN0YWxsT3JkZXJbJG9wLT5nZXRQYWNrYWdlKCktPmdldE5hbWUoKV0gPSAkaW5kZXg7Cn0KfQp1c29ydCgkdW5pbnN0YWxsT3BlcmF0aW9ucywgc3RhdGljIGZ1bmN0aW9uICgkYSwgJGIpIHVzZSAoJGluc3RhbGxPcmRlcik6IGludCB7CnJldHVybiAkaW5zdGFsbE9yZGVyWyRiLT5nZXRQYWNrYWdlKCktPmdldE5hbWUoKV0gLSAkaW5zdGFsbE9yZGVyWyRhLT5nZXRQYWNrYWdlKCktPmdldE5hbWUoKV07Cn0pOwoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAncmVpbnN0YWxsJywgJGlucHV0LCAkb3V0cHV0KTsKJGV2ZW50RGlzcGF0Y2hlciA9ICRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCk7CiRldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7CgokY29uZmlnID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKTsKWyRwcmVmZXJTb3VyY2UsICRwcmVmZXJEaXN0XSA9ICR0aGlzLT5nZXRQcmVmZXJyZWRJbnN0YWxsT3B0aW9ucygkY29uZmlnLCAkaW5wdXQpOwoKJGluc3RhbGxhdGlvbk1hbmFnZXIgPSAkY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKTsKJGRvd25sb2FkTWFuYWdlciA9ICRjb21wb3Nlci0+Z2V0RG93bmxvYWRNYW5hZ2VyKCk7CiRwYWNrYWdlID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CgokaW5zdGFsbGF0aW9uTWFuYWdlci0+c2V0T3V0cHV0UHJvZ3Jlc3MoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1wcm9ncmVzcycpKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1wbHVnaW5zJykpIHsKJGluc3RhbGxhdGlvbk1hbmFnZXItPmRpc2FibGVQbHVnaW5zKCk7Cn0KCiRkb3dubG9hZE1hbmFnZXItPnNldFByZWZlclNvdXJjZSgkcHJlZmVyU291cmNlKTsKJGRvd25sb2FkTWFuYWdlci0+c2V0UHJlZmVyRGlzdCgkcHJlZmVyRGlzdCk7CgokZGV2TW9kZSA9ICRsb2NhbFJlcG8tPmdldERldk1vZGUoKSAhPT0gbnVsbCA/ICRsb2NhbFJlcG8tPmdldERldk1vZGUoKSA6IHRydWU7CgpQbGF0Zm9ybTo6cHV0RW52KCdDT01QT1NFUl9ERVZfTU9ERScsICRkZXZNb2RlID8gJzEnIDogJzAnKTsKJGV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2hTY3JpcHQoU2NyaXB0RXZlbnRzOjpQUkVfSU5TVEFMTF9DTUQsICRkZXZNb2RlKTsKCiRpbnN0YWxsYXRpb25NYW5hZ2VyLT5leGVjdXRlKCRsb2NhbFJlcG8sICR1bmluc3RhbGxPcGVyYXRpb25zLCAkZGV2TW9kZSk7CiRpbnN0YWxsYXRpb25NYW5hZ2VyLT5leGVjdXRlKCRsb2NhbFJlcG8sICRpbnN0YWxsT3BlcmF0aW9ucywgJGRldk1vZGUpOwoKaWYgKCEkaW5wdXQtPmdldE9wdGlvbignbm8tYXV0b2xvYWRlcicpKSB7CiRvcHRpbWl6ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJykgfHwgJGNvbmZpZy0+Z2V0KCdvcHRpbWl6ZS1hdXRvbG9hZGVyJyk7CiRhdXRob3JpdGF0aXZlID0gJGlucHV0LT5nZXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKSB8fCAkY29uZmlnLT5nZXQoJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKTsKJGFwY3VQcmVmaXggPSAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyLXByZWZpeCcpOwokYXBjdSA9ICRhcGN1UHJlZml4ICE9PSBudWxsIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXInKSB8fCAkY29uZmlnLT5nZXQoJ2FwY3UtYXV0b2xvYWRlcicpOwoKJGdlbmVyYXRvciA9ICRjb21wb3Nlci0+Z2V0QXV0b2xvYWRHZW5lcmF0b3IoKTsKJGdlbmVyYXRvci0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRhdXRob3JpdGF0aXZlKTsKJGdlbmVyYXRvci0+c2V0QXBjdSgkYXBjdSwgJGFwY3VQcmVmaXgpOwokZ2VuZXJhdG9yLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCkpOwokZ2VuZXJhdG9yLT5kdW1wKAokY29uZmlnLAokbG9jYWxSZXBvLAokcGFja2FnZSwKJGluc3RhbGxhdGlvbk1hbmFnZXIsCidjb21wb3NlcicsCiRvcHRpbWl6ZSwKbnVsbCwKJGNvbXBvc2VyLT5nZXRMb2NrZXIoKQopOwp9CgokZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBPU1RfSU5TVEFMTF9DTUQsICRkZXZNb2RlKTsKCnJldHVybiAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnXEpzb25Db25maWdTb3VyY2U7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUmVxdWVzdDsKdXNlIENvbXBvc2VyXEluc3RhbGxlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwoKCgoKCmNsYXNzIFJlbW92ZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCkKewokdGhpcwotPnNldE5hbWUoJ3JlbW92ZScpCi0+c2V0QWxpYXNlcyhbJ3JtJywgJ3VuaW5zdGFsbCddKQotPnNldERlc2NyaXB0aW9uKCdSZW1vdmVzIGEgcGFja2FnZSBmcm9tIHRoZSByZXF1aXJlIG9yIHJlcXVpcmUtZGV2JykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ3BhY2thZ2VzJywgSW5wdXRBcmd1bWVudDo6SVNfQVJSQVksICdQYWNrYWdlcyB0aGF0IHNob3VsZCBiZSByZW1vdmVkLicsIG51bGwsICR0aGlzLT5zdWdnZXN0Um9vdFJlcXVpcmVtZW50KCkpLApuZXcgSW5wdXRPcHRpb24oJ2RldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmVtb3ZlcyBhIHBhY2thZ2UgZnJvbSB0aGUgcmVxdWlyZS1kZXYgc2VjdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdkcnktcnVuJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPdXRwdXRzIHRoZSBvcGVyYXRpb25zIGJ1dCB3aWxsIG5vdCBleGVjdXRlIGFueXRoaW5nIChpbXBsaWNpdGx5IGVuYWJsZXMgLS12ZXJib3NlKS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1wcm9ncmVzcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IG91dHB1dCBkb3dubG9hZCBwcm9ncmVzcy4nKSwKbmV3IElucHV0T3B0aW9uKCduby11cGRhdGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIHRoZSBhdXRvbWF0aWMgdXBkYXRlIG9mIHRoZSBkZXBlbmRlbmNpZXMgKGltcGxpZXMgLS1uby1pbnN0YWxsKS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1pbnN0YWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTa2lwIHRoZSBpbnN0YWxsIHN0ZXAgYWZ0ZXIgdXBkYXRpbmcgdGhlIGNvbXBvc2VyLmxvY2sgZmlsZS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1hdWRpdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcCB0aGUgYXVkaXQgc3RlcCBhZnRlciB1cGRhdGluZyB0aGUgY29tcG9zZXIubG9jayBmaWxlIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9OT19BVURJVD0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ2F1ZGl0LWZvcm1hdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0F1ZGl0IG91dHB1dCBmb3JtYXQuIE11c3QgYmUgInRhYmxlIiwgInBsYWluIiwgImpzb24iLCBvciAic3VtbWFyeSIuJywgQXVkaXRvcjo6Rk9STUFUX1NVTU1BUlksIEF1ZGl0b3I6OkZPUk1BVFMpLApuZXcgSW5wdXRPcHRpb24oJ3VwZGF0ZS1uby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1J1biB0aGUgZGVwZW5kZW5jeSB1cGRhdGUgd2l0aCB0aGUgLS1uby1kZXYgb3B0aW9uLicpLApuZXcgSW5wdXRPcHRpb24oJ3VwZGF0ZS13aXRoLWRlcGVuZGVuY2llcycsICd3JywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBbGxvd3MgaW5oZXJpdGVkIGRlcGVuZGVuY2llcyB0byBiZSB1cGRhdGVkIHdpdGggZXhwbGljaXQgZGVwZW5kZW5jaWVzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9XSVRIX0RFUEVOREVOQ0lFUz0xIGVudiB2YXIpLiAoRGVwcmVjYXRlZCwgaXMgbm93IGRlZmF1bHQgYmVoYXZpb3IpJyksCm5ldyBJbnB1dE9wdGlvbigndXBkYXRlLXdpdGgtYWxsLWRlcGVuZGVuY2llcycsICdXJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBbGxvd3MgYWxsIGluaGVyaXRlZCBkZXBlbmRlbmNpZXMgdG8gYmUgdXBkYXRlZCwgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlIHJvb3QgcmVxdWlyZW1lbnRzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9XSVRIX0FMTF9ERVBFTkRFTkNJRVM9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCd3aXRoLWFsbC1kZXBlbmRlbmNpZXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsaWFzIGZvciAtLXVwZGF0ZS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnKSwKbmV3IElucHV0T3B0aW9uKCduby11cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvZXMgbm90IGFsbG93IGluaGVyaXRlZCBkZXBlbmRlbmNpZXMgdG8gYmUgdXBkYXRlZCB3aXRoIGV4cGxpY2l0IGRlcGVuZGVuY2llcy4nKSwKbmV3IElucHV0T3B0aW9uKCdtaW5pbWFsLWNoYW5nZXMnLCAnbScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRHVyaW5nIGFuIHVwZGF0ZSB3aXRoIC13Ly1XLCBvbmx5IHBlcmZvcm0gYWJzb2x1dGVseSBuZWNlc3NhcnkgY2hhbmdlcyB0byB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfTUlOSU1BTF9DSEFOR0VTPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbigndW51c2VkJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZW1vdmUgYWxsIHBhY2thZ2VzIHdoaWNoIGFyZSBsb2NrZWQgYnV0IG5vdCByZXF1aXJlZCBieSBhbnkgb3RoZXIgcGFja2FnZS4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicsICdvJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPcHRpbWl6ZSBhdXRvbG9hZGVyIGR1cmluZyBhdXRvbG9hZGVyIGR1bXAnKSwKbmV3IElucHV0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0F1dG9sb2FkIGNsYXNzZXMgZnJvbSB0aGUgY2xhc3NtYXAgb25seS4gSW1wbGljaXRseSBlbmFibGVzIGAtLW9wdGltaXplLWF1dG9sb2FkZXJgLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVXNlIEFQQ3UgdG8gY2FjaGUgZm91bmQvbm90LWZvdW5kIGNsYXNzZXMuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyLXByZWZpeCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1VzZSBhIGN1c3RvbSBwcmVmaXggZm9yIHRoZSBBUEN1IGF1dG9sb2FkZXIgY2FjaGUuIEltcGxpY2l0bHkgZW5hYmxlcyAtLWFwY3UtYXV0b2xvYWRlcicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+cmVtb3ZlPC9pbmZvPiBjb21tYW5kIHJlbW92ZXMgYSBwYWNrYWdlIGZyb20gdGhlIGN1cnJlbnQKbGlzdCBvZiBpbnN0YWxsZWQgcGFja2FnZXMKCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHJlbW92ZTwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3JlbW92ZS1ybQpFT1QKKQo7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewppZiAoJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKSA9PT0gW10gJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCd1bnVzZWQnKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyAobWlzc2luZzogInBhY2thZ2VzIikuJyk7Cn0KCiRwYWNrYWdlcyA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJyk7CiRwYWNrYWdlcyA9IGFycmF5X21hcCgnc3RydG9sb3dlcicsICRwYWNrYWdlcyk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3VudXNlZCcpKSB7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CmlmICghJGxvY2tlci0+aXNMb2NrZWQoKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignQSB2YWxpZCBjb21wb3Nlci5sb2NrIGZpbGUgaXMgcmVxdWlyZWQgdG8gcnVuIHRoaXMgY29tbWFuZCB3aXRoIC0tdW51c2VkJyk7Cn0KCiRsb2NrZWRQYWNrYWdlcyA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkoKS0+Z2V0UGFja2FnZXMoKTsKCiRyZXF1aXJlZCA9IFtdOwpmb3JlYWNoIChhcnJheV9tZXJnZSgkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0UmVxdWlyZXMoKSwgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldERldlJlcXVpcmVzKCkpIGFzICRsaW5rKSB7CiRyZXF1aXJlZFskbGluay0+Z2V0VGFyZ2V0KCldID0gdHJ1ZTsKfQoKZG8gewokZm91bmQgPSBmYWxzZTsKZm9yZWFjaCAoJGxvY2tlZFBhY2thZ2VzIGFzICRpbmRleCA9PiAkcGFja2FnZSkgewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0TmFtZXMoKSBhcyAkbmFtZSkgewppZiAoaXNzZXQoJHJlcXVpcmVkWyRuYW1lXSkpIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKJHJlcXVpcmVkWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSB0cnVlOwp9CiRmb3VuZCA9IHRydWU7CnVuc2V0KCRsb2NrZWRQYWNrYWdlc1skaW5kZXhdKTsKYnJlYWs7Cn0KfQp9Cn0gd2hpbGUgKCRmb3VuZCk7CgokdW51c2VkID0gW107CmZvcmVhY2ggKCRsb2NrZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewokdW51c2VkW10gPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9CiRwYWNrYWdlcyA9IGFycmF5X21lcmdlKCRwYWNrYWdlcywgJHVudXNlZCk7CgppZiAoY291bnQoJHBhY2thZ2VzKSA9PT0gMCkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignPGluZm8+Tm8gdW51c2VkIHBhY2thZ2VzIHRvIHJlbW92ZTwvaW5mbz4nKTsKCnJldHVybiAwOwp9Cn0KCiRmaWxlID0gRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCk7CgokanNvbkZpbGUgPSBuZXcgSnNvbkZpbGUoJGZpbGUpOwoKJGNvbXBvc2VyID0gJGpzb25GaWxlLT5yZWFkKCk7CiRjb21wb3NlckJhY2t1cCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRqc29uRmlsZS0+Z2V0UGF0aCgpKTsKCiRqc29uID0gbmV3IEpzb25Db25maWdTb3VyY2UoJGpzb25GaWxlKTsKCiR0eXBlID0gJGlucHV0LT5nZXRPcHRpb24oJ2RldicpID8gJ3JlcXVpcmUtZGV2JyA6ICdyZXF1aXJlJzsKJGFsdFR5cGUgPSAhJGlucHV0LT5nZXRPcHRpb24oJ2RldicpID8gJ3JlcXVpcmUtZGV2JyA6ICdyZXF1aXJlJzsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3VwZGF0ZS13aXRoLWRlcGVuZGVuY2llcycpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSB1c2luZyB0aGUgZGVwcmVjYXRlZCBvcHRpb24gInVwZGF0ZS13aXRoLWRlcGVuZGVuY2llcyIuIFRoaXMgaXMgbm93IGRlZmF1bHQgYmVoYXZpb3VyLiBUaGUgLS1uby11cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSBhIHBhY2thZ2Ugd2l0aG91dCBpdHMgZGVwZW5kZW5jaWVzLjwvd2FybmluZz4nKTsKfQoKCmZvcmVhY2ggKFsncmVxdWlyZScsICdyZXF1aXJlLWRldiddIGFzICRsaW5rVHlwZSkgewppZiAoaXNzZXQoJGNvbXBvc2VyWyRsaW5rVHlwZV0pKSB7CmZvcmVhY2ggKCRjb21wb3NlclskbGlua1R5cGVdIGFzICRuYW1lID0+ICR2ZXJzaW9uKSB7CiRjb21wb3NlclskbGlua1R5cGVdW3N0cnRvbG93ZXIoJG5hbWUpXSA9ICRuYW1lOwp9Cn0KfQoKJGRyeVJ1biA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJyk7CiR0b1JlbW92ZSA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKGlzc2V0KCRjb21wb3NlclskdHlwZV1bJHBhY2thZ2VdKSkgewppZiAoJGRyeVJ1bikgewokdG9SZW1vdmVbJHR5cGVdW10gPSAkY29tcG9zZXJbJHR5cGVdWyRwYWNrYWdlXTsKfSBlbHNlIHsKJGpzb24tPnJlbW92ZUxpbmsoJHR5cGUsICRjb21wb3NlclskdHlwZV1bJHBhY2thZ2VdKTsKfQp9IGVsc2VpZiAoaXNzZXQoJGNvbXBvc2VyWyRhbHRUeXBlXVskcGFja2FnZV0pKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+JyAuICRjb21wb3NlclskYWx0VHlwZV1bJHBhY2thZ2VdIC4gJyBjb3VsZCBub3QgYmUgZm91bmQgaW4gJyAuICR0eXBlIC4gJyBidXQgaXQgaXMgcHJlc2VudCBpbiAnIC4gJGFsdFR5cGUgLiAnPC93YXJuaW5nPicpOwppZiAoJGlvLT5pc0ludGVyYWN0aXZlKCkpIHsKaWYgKCRpby0+YXNrQ29uZmlybWF0aW9uKCdEbyB5b3Ugd2FudCB0byByZW1vdmUgaXQgZnJvbSAnIC4gJGFsdFR5cGUgLiAnIFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJykpIHsKaWYgKCRkcnlSdW4pIHsKJHRvUmVtb3ZlWyRhbHRUeXBlXVtdID0gJGNvbXBvc2VyWyRhbHRUeXBlXVskcGFja2FnZV07Cn0gZWxzZSB7CiRqc29uLT5yZW1vdmVMaW5rKCRhbHRUeXBlLCAkY29tcG9zZXJbJGFsdFR5cGVdWyRwYWNrYWdlXSk7Cn0KfQp9Cn0gZWxzZWlmIChpc3NldCgkY29tcG9zZXJbJHR5cGVdKSAmJiBjb3VudCgkbWF0Y2hlcyA9IFByZWc6OmdyZXAoQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJHBhY2thZ2UpLCBhcnJheV9rZXlzKCRjb21wb3NlclskdHlwZV0pKSkgPiAwKSB7CmZvcmVhY2ggKCRtYXRjaGVzIGFzICRtYXRjaGVkUGFja2FnZSkgewppZiAoJGRyeVJ1bikgewokdG9SZW1vdmVbJHR5cGVdW10gPSAkbWF0Y2hlZFBhY2thZ2U7Cn0gZWxzZSB7CiRqc29uLT5yZW1vdmVMaW5rKCR0eXBlLCAkbWF0Y2hlZFBhY2thZ2UpOwp9Cn0KfSBlbHNlaWYgKGlzc2V0KCRjb21wb3NlclskYWx0VHlwZV0pICYmIGNvdW50KCRtYXRjaGVzID0gUHJlZzo6Z3JlcChCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGFja2FnZSksIGFycmF5X2tleXMoJGNvbXBvc2VyWyRhbHRUeXBlXSkpKSA+IDApIHsKZm9yZWFjaCAoJG1hdGNoZXMgYXMgJG1hdGNoZWRQYWNrYWdlKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+JyAuICRtYXRjaGVkUGFja2FnZSAuICcgY291bGQgbm90IGJlIGZvdW5kIGluICcgLiAkdHlwZSAuICcgYnV0IGl0IGlzIHByZXNlbnQgaW4gJyAuICRhbHRUeXBlIC4gJzwvd2FybmluZz4nKTsKaWYgKCRpby0+aXNJbnRlcmFjdGl2ZSgpKSB7CmlmICgkaW8tPmFza0NvbmZpcm1hdGlvbignRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZyb20gJyAuICRhbHRUeXBlIC4gJyBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcpKSB7CmlmICgkZHJ5UnVuKSB7CiR0b1JlbW92ZVskYWx0VHlwZV1bXSA9ICRtYXRjaGVkUGFja2FnZTsKfSBlbHNlIHsKJGpzb24tPnJlbW92ZUxpbmsoJGFsdFR5cGUsICRtYXRjaGVkUGFja2FnZSk7Cn0KfQp9Cn0KfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiRwYWNrYWdlLicgaXMgbm90IHJlcXVpcmVkIGluIHlvdXIgY29tcG9zZXIuanNvbiBhbmQgaGFzIG5vdCBiZWVuIHJlbW92ZWQ8L3dhcm5pbmc+Jyk7Cn0KfQoKJGlvLT53cml0ZUVycm9yKCc8aW5mbz4nLiRmaWxlLicgaGFzIGJlZW4gdXBkYXRlZDwvaW5mbz4nKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tdXBkYXRlJykpIHsKcmV0dXJuIDA7Cn0KCmlmICgkY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKSkgewokY29tcG9zZXItPmdldFBsdWdpbk1hbmFnZXIoKS0+ZGVhY3RpdmF0ZUluc3RhbGxlZFBsdWdpbnMoKTsKfQoKCiR0aGlzLT5yZXNldENvbXBvc2VyKCk7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCmlmICgkZHJ5UnVuKSB7CiRyb290UGFja2FnZSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwokbGlua3MgPSBbCidyZXF1aXJlJyA9PiAkcm9vdFBhY2thZ2UtPmdldFJlcXVpcmVzKCksCidyZXF1aXJlLWRldicgPT4gJHJvb3RQYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpLApdOwpmb3JlYWNoICgkdG9SZW1vdmUgYXMgJHR5cGUgPT4gJG5hbWVzKSB7CmZvcmVhY2ggKCRuYW1lcyBhcyAkbmFtZSkgewp1bnNldCgkbGlua3NbJHR5cGVdWyRuYW1lXSk7Cn0KfQokcm9vdFBhY2thZ2UtPnNldFJlcXVpcmVzKCRsaW5rc1sncmVxdWlyZSddKTsKJHJvb3RQYWNrYWdlLT5zZXREZXZSZXF1aXJlcygkbGlua3NbJ3JlcXVpcmUtZGV2J10pOwp9CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdyZW1vdmUnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJGFsbG93UGx1Z2lucyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYWxsb3ctcGx1Z2lucycpOwokcmVtb3ZlZFBsdWdpbnMgPSBpc19hcnJheSgkYWxsb3dQbHVnaW5zKSA/IGFycmF5X2ludGVyc2VjdChhcnJheV9rZXlzKCRhbGxvd1BsdWdpbnMpLCAkcGFja2FnZXMpIDogW107CmlmICghJGRyeVJ1biAmJiBpc19hcnJheSgkYWxsb3dQbHVnaW5zKSAmJiBjb3VudCgkcmVtb3ZlZFBsdWdpbnMpID4gMCkgewppZiAoY291bnQoJGFsbG93UGx1Z2lucykgPT09IGNvdW50KCRyZW1vdmVkUGx1Z2lucykpIHsKJGpzb24tPnJlbW92ZUNvbmZpZ1NldHRpbmcoJ2FsbG93LXBsdWdpbnMnKTsKfSBlbHNlIHsKZm9yZWFjaCAoJHJlbW92ZWRQbHVnaW5zIGFzICRwbHVnaW4pIHsKJGpzb24tPnJlbW92ZUNvbmZpZ1NldHRpbmcoJ2FsbG93LXBsdWdpbnMuJy4kcGx1Z2luKTsKfQp9Cn0KCiRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5zZXRPdXRwdXRQcm9ncmVzcyghJGlucHV0LT5nZXRPcHRpb24oJ25vLXByb2dyZXNzJykpOwoKJGluc3RhbGwgPSBJbnN0YWxsZXI6OmNyZWF0ZSgkaW8sICRjb21wb3Nlcik7CgokdXBkYXRlRGV2TW9kZSA9ICEkaW5wdXQtPmdldE9wdGlvbigndXBkYXRlLW5vLWRldicpOwokb3B0aW1pemUgPSAkaW5wdXQtPmdldE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicpIHx8ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnb3B0aW1pemUtYXV0b2xvYWRlcicpOwokYXV0aG9yaXRhdGl2ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJyk7CiRhcGN1UHJlZml4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnKTsKJGFwY3UgPSAkYXBjdVByZWZpeCAhPT0gbnVsbCB8fCAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdhcGN1LWF1dG9sb2FkZXInKTsKCiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTX05PX1JPT1RfUkVRVUlSRTsKJGZsYWdzID0gJyc7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndXBkYXRlLXdpdGgtYWxsLWRlcGVuZGVuY2llcycpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCd3aXRoLWFsbC1kZXBlbmRlbmNpZXMnKSkgewokdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQUzsKJGZsYWdzIC49ICcgLS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXVwZGF0ZS13aXRoLWRlcGVuZGVuY2llcycpKSB7CiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfT05MWV9MSVNURUQ7CiRmbGFncyAuPSAnIC0td2l0aC1kZXBlbmRlbmNpZXMnOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPlJ1bm5pbmcgY29tcG9zZXIgdXBkYXRlICcuaW1wbG9kZSgnICcsICRwYWNrYWdlcykuJGZsYWdzLic8L2luZm8+Jyk7CgokaW5zdGFsbAotPnNldFZlcmJvc2UoJGlucHV0LT5nZXRPcHRpb24oJ3ZlcmJvc2UnKSkKLT5zZXREZXZNb2RlKCR1cGRhdGVEZXZNb2RlKQotPnNldE9wdGltaXplQXV0b2xvYWRlcigkb3B0aW1pemUpCi0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRhdXRob3JpdGF0aXZlKQotPnNldEFwY3VBdXRvbG9hZGVyKCRhcGN1LCAkYXBjdVByZWZpeCkKLT5zZXRVcGRhdGUodHJ1ZSkKLT5zZXRJbnN0YWxsKCEkaW5wdXQtPmdldE9wdGlvbignbm8taW5zdGFsbCcpKQotPnNldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcygkdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKQotPnNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJHRoaXMtPmdldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJGlucHV0KSkKLT5zZXREcnlSdW4oJGRyeVJ1bikKLT5zZXRBdWRpdCghJGlucHV0LT5nZXRPcHRpb24oJ25vLWF1ZGl0JykpCi0+c2V0QXVkaXRGb3JtYXQoJHRoaXMtPmdldEF1ZGl0Rm9ybWF0KCRpbnB1dCkpCi0+c2V0TWluaW1hbFVwZGF0ZSgkaW5wdXQtPmdldE9wdGlvbignbWluaW1hbC1jaGFuZ2VzJykpCjsKCgoKaWYgKCRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKJGluc3RhbGwtPnNldFVwZGF0ZUFsbG93TGlzdCgkcGFja2FnZXMpOwp9Cgokc3RhdHVzID0gJGluc3RhbGwtPnJ1bigpOwppZiAoJHN0YXR1cyAhPT0gMCkgewokaW8tPndyaXRlRXJyb3IoIlxuIi4nPGVycm9yPlJlbW92YWwgZmFpbGVkLCByZXZlcnRpbmcgJy4kZmlsZS4nIHRvIGl0cyBvcmlnaW5hbCBjb250ZW50LjwvZXJyb3I+Jyk7CmZpbGVfcHV0X2NvbnRlbnRzKCRqc29uRmlsZS0+Z2V0UGF0aCgpLCAkY29tcG9zZXJCYWNrdXApOwp9CgppZiAoISRkcnlSdW4pIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpLT5maW5kUGFja2FnZXMoJHBhY2thZ2UpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlJlbW92YWwgZmFpbGVkLCAnLiRwYWNrYWdlLicgaXMgc3RpbGwgcHJlc2VudCwgaXQgbWF5IGJlIHJlcXVpcmVkIGJ5IGFub3RoZXIgcGFja2FnZS4gU2VlIGBjb21wb3NlciB3aHkgJy4kcGFja2FnZS4nYC48L2Vycm9yPicpOwoKcmV0dXJuIDI7Cn0KfQp9CgpyZXR1cm4gJHN0YXR1czsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxSZXF1ZXN0Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXFJvb3RQYWNrYWdlTG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2NrZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvbkJ1bXBlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uU2VsZWN0b3I7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VTb3J0ZXI7CnVzZSBTZWxkXFNpZ25hbFxTaWduYWxIYW5kbGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxlckV2ZW50czsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxKc29uXEpzb25NYW5pcHVsYXRvcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CgoKCgoKY2xhc3MgUmVxdWlyZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CnVzZSBQYWNrYWdlRGlzY292ZXJ5VHJhaXQ7CgoKcHJpdmF0ZSAkbmV3bHlDcmVhdGVkOwoKcHJpdmF0ZSAkZmlyc3RSZXF1aXJlOwoKcHJpdmF0ZSAkanNvbjsKCnByaXZhdGUgJGZpbGU7Cgpwcml2YXRlICRjb21wb3NlckJhY2t1cDsKCnByaXZhdGUgJGxvY2s7Cgpwcml2YXRlICRsb2NrQmFja3VwOwoKcHJpdmF0ZSAkZGVwZW5kZW5jeVJlc29sdXRpb25Db21wbGV0ZWQgPSBmYWxzZTsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKQp7CiR0aGlzCi0+c2V0TmFtZSgncmVxdWlyZScpCi0+c2V0QWxpYXNlcyhbJ3InXSkKLT5zZXREZXNjcmlwdGlvbignQWRkcyByZXF1aXJlZCBwYWNrYWdlcyB0byB5b3VyIGNvbXBvc2VyLmpzb24gYW5kIGluc3RhbGxzIHRoZW0nKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZXMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnT3B0aW9uYWwgcGFja2FnZSBuYW1lIGNhbiBhbHNvIGluY2x1ZGUgYSB2ZXJzaW9uIGNvbnN0cmFpbnQsIGUuZy4gZm9vL2JhciBvciBmb28vYmFyOjEuMC4wIG9yIGZvby9iYXI9MS4wLjAgb3IgImZvby9iYXIgMS4wLjAiJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlSW5jbFBsYXRmb3JtKCkpLApuZXcgSW5wdXRPcHRpb24oJ2RldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWRkIHJlcXVpcmVtZW50IHRvIHJlcXVpcmUtZGV2LicpLApuZXcgSW5wdXRPcHRpb24oJ2RyeS1ydW4nLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ091dHB1dHMgdGhlIG9wZXJhdGlvbnMgYnV0IHdpbGwgbm90IGV4ZWN1dGUgYW55dGhpbmcgKGltcGxpY2l0bHkgZW5hYmxlcyAtLXZlcmJvc2UpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIHNvdXJjZXMgd2hlbiBwb3NzaWJsZSwgaW5jbHVkaW5nIFZDUyBpbmZvcm1hdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItZGlzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdCAoZGVmYXVsdCBiZWhhdmlvcikuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0fHNvdXJjZXxhdXRvIChhdXRvIGNob29zZXMgc291cmNlIGZvciBkZXYgdmVyc2lvbnMsIGRpc3QgZm9yIHRoZSByZXN0KS4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFByZWZlckluc3RhbGwoKSksCm5ldyBJbnB1dE9wdGlvbignZml4ZWQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1dyaXRlIGZpeGVkIHZlcnNpb24gdG8gdGhlIGNvbXBvc2VyLmpzb24uJyksCm5ldyBJbnB1dE9wdGlvbignbm8tc3VnZ2VzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnREVQUkVDQVRFRDogVGhpcyBmbGFnIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tcHJvZ3Jlc3MnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBvdXRwdXQgZG93bmxvYWQgcHJvZ3Jlc3MuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tdXBkYXRlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyB0aGUgYXV0b21hdGljIHVwZGF0ZSBvZiB0aGUgZGVwZW5kZW5jaWVzIChpbXBsaWVzIC0tbm8taW5zdGFsbCkuJyksCm5ldyBJbnB1dE9wdGlvbignbm8taW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcCB0aGUgaW5zdGFsbCBzdGVwIGFmdGVyIHVwZGF0aW5nIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tYXVkaXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXAgdGhlIGF1ZGl0IHN0ZXAgYWZ0ZXIgdXBkYXRpbmcgdGhlIGNvbXBvc2VyLmxvY2sgZmlsZSAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfTk9fQVVESVQ9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdhdWRpdC1mb3JtYXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdBdWRpdCBvdXRwdXQgZm9ybWF0LiBNdXN0IGJlICJ0YWJsZSIsICJwbGFpbiIsICJqc29uIiwgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZLCBBdWRpdG9yOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUtbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSdW4gdGhlIGRlcGVuZGVuY3kgdXBkYXRlIHdpdGggdGhlIC0tbm8tZGV2IG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMnLCAndycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGluaGVyaXRlZCBkZXBlbmRlbmNpZXMgdG8gYmUgdXBkYXRlZCwgZXhjZXB0IHRob3NlIHRoYXQgYXJlIHJvb3QgcmVxdWlyZW1lbnRzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9XSVRIX0RFUEVOREVOQ0lFUz0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3VwZGF0ZS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnLCAnVycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGFsbCBpbmhlcml0ZWQgZGVwZW5kZW5jaWVzIHRvIGJlIHVwZGF0ZWQsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSByb290IHJlcXVpcmVtZW50cyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfV0lUSF9BTExfREVQRU5ERU5DSUVTPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignd2l0aC1kZXBlbmRlbmNpZXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsaWFzIGZvciAtLXVwZGF0ZS13aXRoLWRlcGVuZGVuY2llcycpLApuZXcgSW5wdXRPcHRpb24oJ3dpdGgtYWxsLWRlcGVuZGVuY2llcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxpYXMgZm9yIC0tdXBkYXRlLXdpdGgtYWxsLWRlcGVuZGVuY2llcycpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgYSBzcGVjaWZpYyBwbGF0Zm9ybSByZXF1aXJlbWVudCAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0lnbm9yZSBhbGwgcGxhdGZvcm0gcmVxdWlyZW1lbnRzIChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItc3RhYmxlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdQcmVmZXIgc3RhYmxlIHZlcnNpb25zIG9mIGRlcGVuZGVuY2llcyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfUFJFRkVSX1NUQUJMRT0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1sb3dlc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1ByZWZlciBsb3dlc3QgdmVyc2lvbnMgb2YgZGVwZW5kZW5jaWVzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9QUkVGRVJfTE9XRVNUPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignbWluaW1hbC1jaGFuZ2VzJywgJ20nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0R1cmluZyBhbiB1cGRhdGUgd2l0aCAtdy8tVywgb25seSBwZXJmb3JtIGFic29sdXRlbHkgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX01JTklNQUxfQ0hBTkdFUz0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3NvcnQtcGFja2FnZXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NvcnRzIHBhY2thZ2VzIHdoZW4gYWRkaW5nL3VwZGF0aW5nIGEgbmV3IGRlcGVuZGVuY3knKSwKbmV3IElucHV0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJywgJ28nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wdGltaXplIGF1dG9sb2FkZXIgZHVyaW5nIGF1dG9sb2FkZXIgZHVtcCcpLApuZXcgSW5wdXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnLCAnYScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXV0b2xvYWQgY2xhc3NlcyBmcm9tIHRoZSBjbGFzc21hcCBvbmx5LiBJbXBsaWNpdGx5IGVuYWJsZXMgYC0tb3B0aW1pemUtYXV0b2xvYWRlcmAuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVc2UgQVBDdSB0byBjYWNoZSBmb3VuZC9ub3QtZm91bmQgY2xhc3Nlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVXNlIGEgY3VzdG9tIHByZWZpeCBmb3IgdGhlIEFQQ3UgYXV0b2xvYWRlciBjYWNoZS4gSW1wbGljaXRseSBlbmFibGVzIC0tYXBjdS1hdXRvbG9hZGVyJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSByZXF1aXJlIGNvbW1hbmQgYWRkcyByZXF1aXJlZCBwYWNrYWdlcyB0byB5b3VyIGNvbXBvc2VyLmpzb24gYW5kIGluc3RhbGxzIHRoZW0uCgpJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBwYWNrYWdlLCBjb21wb3NlciB3aWxsIHByb21wdCB5b3UgdG8gc2VhcmNoIGZvciBhIHBhY2thZ2UsIGFuZCBnaXZlbiByZXN1bHRzLCBwcm92aWRlIGEgbGlzdCBvZgptYXRjaGVzIHRvIHJlcXVpcmUuCgpJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSB2ZXJzaW9uIGNvbnN0cmFpbnQsIGNvbXBvc2VyIHdpbGwgY2hvb3NlIGEgc3VpdGFibGUgb25lIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgcGFja2FnZSB2ZXJzaW9ucy4KCklmIHlvdSBkbyBub3Qgd2FudCB0byBpbnN0YWxsIHRoZSBuZXcgZGVwZW5kZW5jaWVzIGltbWVkaWF0ZWx5IHlvdSBjYW4gY2FsbCBpdCB3aXRoIC0tbm8tdXBkYXRlCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNyZXF1aXJlLXIKRU9UCikKOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJHRoaXMtPmZpbGUgPSBGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXN1Z2dlc3QnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICItLW5vLXN1Z2dlc3QiLiBJdCBoYXMgbm8gZWZmZWN0IGFuZCB3aWxsIGJyZWFrIGluIENvbXBvc2VyIDMuPC93YXJuaW5nPicpOwp9CgokdGhpcy0+bmV3bHlDcmVhdGVkID0gIWZpbGVfZXhpc3RzKCR0aGlzLT5maWxlKTsKaWYgKCR0aGlzLT5uZXdseUNyZWF0ZWQgJiYgIWZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5maWxlLCAie1xufVxuIikpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kdGhpcy0+ZmlsZS4nIGNvdWxkIG5vdCBiZSBjcmVhdGVkLjwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQppZiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJHRoaXMtPmZpbGUpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPicuJHRoaXMtPmZpbGUuJyBpcyBub3QgcmVhZGFibGUuPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9CgppZiAoZmlsZXNpemUoJHRoaXMtPmZpbGUpID09PSAwKSB7CmZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5maWxlLCAie1xufVxuIik7Cn0KCiR0aGlzLT5qc29uID0gbmV3IEpzb25GaWxlKCR0aGlzLT5maWxlKTsKJHRoaXMtPmxvY2sgPSBGYWN0b3J5OjpnZXRMb2NrRmlsZSgkdGhpcy0+ZmlsZSk7CiR0aGlzLT5jb21wb3NlckJhY2t1cCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5qc29uLT5nZXRQYXRoKCkpOwokdGhpcy0+bG9ja0JhY2t1cCA9IGZpbGVfZXhpc3RzKCR0aGlzLT5sb2NrKSA/IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5sb2NrKSA6IG51bGw7Cgokc2lnbmFsSGFuZGxlciA9IFNpZ25hbEhhbmRsZXI6OmNyZWF0ZShbU2lnbmFsSGFuZGxlcjo6U0lHSU5ULCBTaWduYWxIYW5kbGVyOjpTSUdURVJNLCBTaWduYWxIYW5kbGVyOjpTSUdIVVBdLCBmdW5jdGlvbiAoc3RyaW5nICRzaWduYWwsIFNpZ25hbEhhbmRsZXIgJGhhbmRsZXIpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJ1JlY2VpdmVkICcuJHNpZ25hbC4nLCBhYm9ydGluZycsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5yZXZlcnRDb21wb3NlckZpbGUoKTsKJGhhbmRsZXItPmV4aXRXaXRoTGFzdFNpZ25hbCgpOwp9KTsKCgoKaWYgKCFpc193cml0YWJsZSgkdGhpcy0+ZmlsZSkgJiYgZmFsc2UgPT09IFNpbGVuY2VyOjpjYWxsKCdmaWxlX3B1dF9jb250ZW50cycsICR0aGlzLT5maWxlLCAkdGhpcy0+Y29tcG9zZXJCYWNrdXApKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPicuJHRoaXMtPmZpbGUuJyBpcyBub3Qgd3JpdGFibGUuPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2ZpeGVkJykgPT09IHRydWUpIHsKJGNvbmZpZyA9ICR0aGlzLT5qc29uLT5yZWFkKCk7CgokcGFja2FnZVR5cGUgPSBlbXB0eSgkY29uZmlnWyd0eXBlJ10pID8gJ2xpYnJhcnknIDogJGNvbmZpZ1sndHlwZSddOwoKCgoKaWYgKCRwYWNrYWdlVHlwZSAhPT0gJ3Byb2plY3QnICYmICEkaW5wdXQtPmdldE9wdGlvbignZGV2JykpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlICItLWZpeGVkIiBvcHRpb24gaXMgb25seSBhbGxvd2VkIGZvciBwYWNrYWdlcyB3aXRoIGEgInByb2plY3QiIHR5cGUgb3IgZm9yIGRldiBkZXBlbmRlbmNpZXMgdG8gcHJldmVudCBwb3NzaWJsZSBtaXN1c2VzLjwvZXJyb3I+Jyk7CgppZiAoIWlzc2V0KCRjb25maWdbJ3R5cGUnXSkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SWYgeW91ciBwYWNrYWdlIGlzIG5vdCBhIGxpYnJhcnksIHlvdSBjYW4gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSAidHlwZSIgYnkgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyB0eXBlIHByb2plY3QiLjwvZXJyb3I+Jyk7Cn0KCnJldHVybiAxOwp9Cn0KCiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKJHJlcG9zID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKTsKCiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgncGxhdGZvcm0nKTsKCiR0aGlzLT5yZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KGFycmF5X21lcmdlKApbJHBsYXRmb3JtUmVwbyA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRwbGF0Zm9ybU92ZXJyaWRlcyldLAokcmVwb3MKKSk7CgppZiAoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFByZWZlclN0YWJsZSgpKSB7CiRwcmVmZXJyZWRTdGFiaWxpdHkgPSAnc3RhYmxlJzsKfSBlbHNlIHsKJHByZWZlcnJlZFN0YWJpbGl0eSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCk7Cn0KCnRyeSB7CiRyZXF1aXJlbWVudHMgPSAkdGhpcy0+ZGV0ZXJtaW5lUmVxdWlyZW1lbnRzKAokaW5wdXQsCiRvdXRwdXQsCiRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJyksCiRwbGF0Zm9ybVJlcG8sCiRwcmVmZXJyZWRTdGFiaWxpdHksCiRpbnB1dC0+Z2V0T3B0aW9uKCduby11cGRhdGUnKSwgCiRpbnB1dC0+Z2V0T3B0aW9uKCdmaXhlZCcpCik7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCR0aGlzLT5uZXdseUNyZWF0ZWQpIHsKJHRoaXMtPnJldmVydENvbXBvc2VyRmlsZSgpOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdObyBjb21wb3Nlci5qc29uIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5ICgnLiR0aGlzLT5maWxlLicpLCB0aGlzIG1heSBiZSB0aGUgY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb24uJywgMCwgJGUpOwp9Cgp0aHJvdyAkZTsKfQoKJHJlcXVpcmVtZW50cyA9ICR0aGlzLT5mb3JtYXRSZXF1aXJlbWVudHMoJHJlcXVpcmVtZW50cyk7CgppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSAmJiAkaW8tPmlzSW50ZXJhY3RpdmUoKSAmJiAhJGNvbXBvc2VyLT5pc0dsb2JhbCgpKSB7CiRkZXZQYWNrYWdlcyA9IFtdOwokZGV2VGFncyA9IFsnZGV2JywgJ3Rlc3RpbmcnLCAnc3RhdGljIGFuYWx5c2lzJ107CiRjdXJyZW50UmVxdWlyZXNCeUtleSA9ICR0aGlzLT5nZXRQYWNrYWdlc0J5UmVxdWlyZUtleSgpOwpmb3JlYWNoICgkcmVxdWlyZW1lbnRzIGFzICRuYW1lID0+ICR2ZXJzaW9uKSB7CgppZiAoaXNzZXQoJGN1cnJlbnRSZXF1aXJlc0J5S2V5WyRuYW1lXSkpIHsKY29udGludWU7Cn0KCiRwa2cgPSBQYWNrYWdlU29ydGVyOjpnZXRNb3N0Q3VycmVudFZlcnNpb24oJHRoaXMtPmdldFJlcG9zKCktPmZpbmRQYWNrYWdlcygkbmFtZSkpOwppZiAoJHBrZyBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSkgewokcGtnRGV2VGFncyA9IGFycmF5X2ludGVyc2VjdCgkZGV2VGFncywgYXJyYXlfbWFwKCdzdHJ0b2xvd2VyJywgJHBrZy0+Z2V0S2V5d29yZHMoKSkpOwppZiAoY291bnQoJHBrZ0RldlRhZ3MpID4gMCkgewokZGV2UGFja2FnZXNbXSA9ICRwa2dEZXZUYWdzOwp9Cn0KfQoKaWYgKGNvdW50KCRkZXZQYWNrYWdlcykgPT09IGNvdW50KCRyZXF1aXJlbWVudHMpKSB7CiRwbHVyYWwgPSBjb3VudCgkcmVxdWlyZW1lbnRzKSA+IDEgPyAncycgOiAnJzsKJHBsdXJhbDIgPSBjb3VudCgkcmVxdWlyZW1lbnRzKSA+IDEgPyAnYXJlJyA6ICdpcyc7CiRwbHVyYWwzID0gY291bnQoJHJlcXVpcmVtZW50cykgPiAxID8gJ3RoZXkgYXJlJyA6ICdpdCBpcyc7CiRwa2dEZXZUYWdzID0gYXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKC4uLiRkZXZQYWNrYWdlcykpOwokaW8tPndhcm5pbmcoJ1RoZSBwYWNrYWdlJy4kcGx1cmFsLicgeW91IHJlcXVpcmVkICcuJHBsdXJhbDIuJyByZWNvbW1lbmRlZCB0byBiZSBwbGFjZWQgaW4gcmVxdWlyZS1kZXYgKGJlY2F1c2UgJy4kcGx1cmFsMy4nIHRhZ2dlZCBhcyAiJy5pbXBsb2RlKCciLCAiJywgJHBrZ0RldlRhZ3MpLiciKSBidXQgeW91IGRpZCBub3QgdXNlIC0tZGV2LicpOwppZiAoJGlvLT5hc2tDb25maXJtYXRpb24oJzxpbmZvPkRvIHlvdSB3YW50IHRvIHJlLXJ1biB0aGUgY29tbWFuZCB3aXRoIC0tZGV2PzwvPiBbPGNvbW1lbnQ+eWVzPC8+XT8gJykpIHsKJGlucHV0LT5zZXRPcHRpb24oJ2RldicsIHRydWUpOwp9Cn0KCnVuc2V0KCRkZXZQYWNrYWdlcywgJHBrZ0RldlRhZ3MpOwp9CgokcmVxdWlyZUtleSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSA/ICdyZXF1aXJlLWRldicgOiAncmVxdWlyZSc7CiRyZW1vdmVLZXkgPSAkaW5wdXQtPmdldE9wdGlvbignZGV2JykgPyAncmVxdWlyZScgOiAncmVxdWlyZS1kZXYnOwoKCiRyZXF1aXJlbWVudHNUb0d1ZXNzID0gW107CmZvcmVhY2ggKCRyZXF1aXJlbWVudHMgYXMgJHBhY2thZ2UgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCRjb25zdHJhaW50ID09PSAnZ3Vlc3MnKSB7CiRyZXF1aXJlbWVudHNbJHBhY2thZ2VdID0gJyonOwokcmVxdWlyZW1lbnRzVG9HdWVzc1tdID0gJHBhY2thZ2U7Cn0KfQoKCiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKZm9yZWFjaCAoJHJlcXVpcmVtZW50cyBhcyAkcGFja2FnZSA9PiAkY29uc3RyYWludCkgewppZiAoc3RydG9sb3dlcigkcGFja2FnZSkgPT09ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXROYW1lKCkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJzxlcnJvcj5Sb290IHBhY2thZ2UgXCclc1wnIGNhbm5vdCByZXF1aXJlIGl0c2VsZiBpbiBpdHMgY29tcG9zZXIuanNvbjwvZXJyb3I+JywgJHBhY2thZ2UpKTsKCnJldHVybiAxOwp9CmlmICgkY29uc3RyYWludCA9PT0gJ3NlbGYudmVyc2lvbicpIHsKY29udGludWU7Cn0KJHZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpOwp9CgokaW5jb25zaXN0ZW50UmVxdWlyZUtleXMgPSAkdGhpcy0+Z2V0SW5jb25zaXN0ZW50UmVxdWlyZUtleXMoJHJlcXVpcmVtZW50cywgJHJlcXVpcmVLZXkpOwppZiAoY291bnQoJGluY29uc2lzdGVudFJlcXVpcmVLZXlzKSA+IDApIHsKZm9yZWFjaCAoJGluY29uc2lzdGVudFJlcXVpcmVLZXlzIGFzICRwYWNrYWdlKSB7CiRpby0+d2FybmluZyhzcHJpbnRmKAonJXMgaXMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlICVzIGtleSBhbmQgeW91IHJhbiB0aGUgY29tbWFuZCAlcyB0aGUgLS1kZXYgZmxhZywgd2hpY2ggd2lsbCBtb3ZlIGl0IHRvIHRoZSAlcyBrZXkuJywKJHBhY2thZ2UsCiRyZW1vdmVLZXksCiRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSA/ICd3aXRoJyA6ICd3aXRob3V0JywKJHJlcXVpcmVLZXkKKSk7Cn0KCmlmICgkaW8tPmlzSW50ZXJhY3RpdmUoKSkgewppZiAoISRpby0+YXNrQ29uZmlybWF0aW9uKHNwcmludGYoJzxpbmZvPkRvIHlvdSB3YW50IHRvIG1vdmUgJXM/PC9pbmZvPiBbPGNvbW1lbnQ+bm88L2NvbW1lbnQ+XT8gJywgY291bnQoJGluY29uc2lzdGVudFJlcXVpcmVLZXlzKSA+IDEgPyAndGhlc2UgcmVxdWlyZW1lbnRzJyA6ICd0aGlzIHJlcXVpcmVtZW50JyksIGZhbHNlKSkgewppZiAoISRpby0+YXNrQ29uZmlybWF0aW9uKHNwcmludGYoJzxpbmZvPkRvIHlvdSB3YW50IHRvIHJlLXJ1biB0aGUgY29tbWFuZCAlcyAtLWRldj88L2luZm8+IFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJywgJGlucHV0LT5nZXRPcHRpb24oJ2RldicpID8gJ3dpdGhvdXQnIDogJ3dpdGgnKSwgdHJ1ZSkpIHsKcmV0dXJuIDA7Cn0KCiRpbnB1dC0+c2V0T3B0aW9uKCdkZXYnLCB0cnVlKTsKWyRyZXF1aXJlS2V5LCAkcmVtb3ZlS2V5XSA9IFskcmVtb3ZlS2V5LCAkcmVxdWlyZUtleV07Cn0KfQp9Cgokc29ydFBhY2thZ2VzID0gJGlucHV0LT5nZXRPcHRpb24oJ3NvcnQtcGFja2FnZXMnKSB8fCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ3NvcnQtcGFja2FnZXMnKTsKCiR0aGlzLT5maXJzdFJlcXVpcmUgPSAkdGhpcy0+bmV3bHlDcmVhdGVkOwppZiAoISR0aGlzLT5maXJzdFJlcXVpcmUpIHsKJGNvbXBvc2VyRGVmaW5pdGlvbiA9ICR0aGlzLT5qc29uLT5yZWFkKCk7CmlmIChjb3VudCgkY29tcG9zZXJEZWZpbml0aW9uWydyZXF1aXJlJ10gPz8gW10pID09PSAwICYmIGNvdW50KCRjb21wb3NlckRlZmluaXRpb25bJ3JlcXVpcmUtZGV2J10gPz8gW10pID09PSAwKSB7CiR0aGlzLT5maXJzdFJlcXVpcmUgPSB0cnVlOwp9Cn0KCmlmICghJGlucHV0LT5nZXRPcHRpb24oJ2RyeS1ydW4nKSkgewokdGhpcy0+dXBkYXRlRmlsZSgkdGhpcy0+anNvbiwgJHJlcXVpcmVtZW50cywgJHJlcXVpcmVLZXksICRyZW1vdmVLZXksICRzb3J0UGFja2FnZXMpOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPicuJHRoaXMtPmZpbGUuJyBoYXMgYmVlbiAnLigkdGhpcy0+bmV3bHlDcmVhdGVkID8gJ2NyZWF0ZWQnIDogJ3VwZGF0ZWQnKS4nPC9pbmZvPicpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby11cGRhdGUnKSkgewpyZXR1cm4gMDsKfQoKJGNvbXBvc2VyLT5nZXRQbHVnaW5NYW5hZ2VyKCktPmRlYWN0aXZhdGVJbnN0YWxsZWRQbHVnaW5zKCk7Cgp0cnkgewokcmVzdWx0ID0gJHRoaXMtPmRvVXBkYXRlKCRpbnB1dCwgJG91dHB1dCwgJGlvLCAkcmVxdWlyZW1lbnRzLCAkcmVxdWlyZUtleSwgJHJlbW92ZUtleSk7CmlmICgkcmVzdWx0ID09PSAwICYmIGNvdW50KCRyZXF1aXJlbWVudHNUb0d1ZXNzKSA+IDApIHsKJHJlc3VsdCA9ICR0aGlzLT51cGRhdGVSZXF1aXJlbWVudHNBZnRlclJlc29sdXRpb24oJHJlcXVpcmVtZW50c1RvR3Vlc3MsICRyZXF1aXJlS2V5LCAkcmVtb3ZlS2V5LCAkc29ydFBhY2thZ2VzLCAkaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpLCAkaW5wdXQtPmdldE9wdGlvbignZml4ZWQnKSk7Cn0KCnJldHVybiAkcmVzdWx0Owp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICghJHRoaXMtPmRlcGVuZGVuY3lSZXNvbHV0aW9uQ29tcGxldGVkKSB7CiR0aGlzLT5yZXZlcnRDb21wb3NlckZpbGUoKTsKfQp0aHJvdyAkZTsKfSBmaW5hbGx5IHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykgJiYgJHRoaXMtPm5ld2x5Q3JlYXRlZCkgewpAdW5saW5rKCR0aGlzLT5qc29uLT5nZXRQYXRoKCkpOwp9Cgokc2lnbmFsSGFuZGxlci0+dW5yZWdpc3RlcigpOwp9Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEluY29uc2lzdGVudFJlcXVpcmVLZXlzKGFycmF5ICRuZXdSZXF1aXJlbWVudHMsIHN0cmluZyAkcmVxdWlyZUtleSk6IGFycmF5CnsKJHJlcXVpcmVLZXlzID0gJHRoaXMtPmdldFBhY2thZ2VzQnlSZXF1aXJlS2V5KCk7CiRpbmNvbnNpc3RlbnRSZXF1aXJlbWVudHMgPSBbXTsKZm9yZWFjaCAoJHJlcXVpcmVLZXlzIGFzICRwYWNrYWdlID0+ICRwYWNrYWdlUmVxdWlyZUtleSkgewppZiAoIWlzc2V0KCRuZXdSZXF1aXJlbWVudHNbJHBhY2thZ2VdKSkgewpjb250aW51ZTsKfQppZiAoJHJlcXVpcmVLZXkgIT09ICRwYWNrYWdlUmVxdWlyZUtleSkgewokaW5jb25zaXN0ZW50UmVxdWlyZW1lbnRzW10gPSAkcGFja2FnZTsKfQp9CgpyZXR1cm4gJGluY29uc2lzdGVudFJlcXVpcmVtZW50czsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQYWNrYWdlc0J5UmVxdWlyZUtleSgpOiBhcnJheQp7CiRjb21wb3NlckRlZmluaXRpb24gPSAkdGhpcy0+anNvbi0+cmVhZCgpOwokcmVxdWlyZSA9IFtdOwokcmVxdWlyZURldiA9IFtdOwoKaWYgKGlzc2V0KCRjb21wb3NlckRlZmluaXRpb25bJ3JlcXVpcmUnXSkpIHsKJHJlcXVpcmUgPSAkY29tcG9zZXJEZWZpbml0aW9uWydyZXF1aXJlJ107Cn0KCmlmIChpc3NldCgkY29tcG9zZXJEZWZpbml0aW9uWydyZXF1aXJlLWRldiddKSkgewokcmVxdWlyZURldiA9ICRjb21wb3NlckRlZmluaXRpb25bJ3JlcXVpcmUtZGV2J107Cn0KCnJldHVybiBhcnJheV9tZXJnZSgKYXJyYXlfZmlsbF9rZXlzKGFycmF5X2tleXMoJHJlcXVpcmUpLCAncmVxdWlyZScpLAphcnJheV9maWxsX2tleXMoYXJyYXlfa2V5cygkcmVxdWlyZURldiksICdyZXF1aXJlLWRldicpCik7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9VcGRhdGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgSU9JbnRlcmZhY2UgJGlvLCBhcnJheSAkcmVxdWlyZW1lbnRzLCBzdHJpbmcgJHJlcXVpcmVLZXksIHN0cmluZyAkcmVtb3ZlS2V5KTogaW50CnsKCiR0aGlzLT5yZXNldENvbXBvc2VyKCk7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiR0aGlzLT5kZXBlbmRlbmN5UmVzb2x1dGlvbkNvbXBsZXRlZCA9IGZhbHNlOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5hZGRMaXN0ZW5lcihJbnN0YWxsZXJFdmVudHM6OlBSRV9PUEVSQVRJT05TX0VYRUMsIGZ1bmN0aW9uICgpOiB2b2lkIHsKJHRoaXMtPmRlcGVuZGVuY3lSZXNvbHV0aW9uQ29tcGxldGVkID0gdHJ1ZTsKfSwgMTAwMDApOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykpIHsKJHJvb3RQYWNrYWdlID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRsaW5rcyA9IFsKJ3JlcXVpcmUnID0+ICRyb290UGFja2FnZS0+Z2V0UmVxdWlyZXMoKSwKJ3JlcXVpcmUtZGV2JyA9PiAkcm9vdFBhY2thZ2UtPmdldERldlJlcXVpcmVzKCksCl07CiRsb2FkZXIgPSBuZXcgQXJyYXlMb2FkZXIoKTsKJG5ld0xpbmtzID0gJGxvYWRlci0+cGFyc2VMaW5rcygkcm9vdFBhY2thZ2UtPmdldE5hbWUoKSwgJHJvb3RQYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCksIEJhc2VQYWNrYWdlOjokc3VwcG9ydGVkTGlua1R5cGVzWyRyZXF1aXJlS2V5XVsnbWV0aG9kJ10sICRyZXF1aXJlbWVudHMpOwokbGlua3NbJHJlcXVpcmVLZXldID0gYXJyYXlfbWVyZ2UoJGxpbmtzWyRyZXF1aXJlS2V5XSwgJG5ld0xpbmtzKTsKZm9yZWFjaCAoJHJlcXVpcmVtZW50cyBhcyAkcGFja2FnZSA9PiAkY29uc3RyYWludCkgewp1bnNldCgkbGlua3NbJHJlbW92ZUtleV1bJHBhY2thZ2VdKTsKfQokcm9vdFBhY2thZ2UtPnNldFJlcXVpcmVzKCRsaW5rc1sncmVxdWlyZSddKTsKJHJvb3RQYWNrYWdlLT5zZXREZXZSZXF1aXJlcygkbGlua3NbJ3JlcXVpcmUtZGV2J10pOwoKCiRyZWZlcmVuY2VzID0gJHJvb3RQYWNrYWdlLT5nZXRSZWZlcmVuY2VzKCk7CiRyZWZlcmVuY2VzID0gUm9vdFBhY2thZ2VMb2FkZXI6OmV4dHJhY3RSZWZlcmVuY2VzKCRyZXF1aXJlbWVudHMsICRyZWZlcmVuY2VzKTsKJHJvb3RQYWNrYWdlLT5zZXRSZWZlcmVuY2VzKCRyZWZlcmVuY2VzKTsKJHN0YWJpbGl0eUZsYWdzID0gJHJvb3RQYWNrYWdlLT5nZXRTdGFiaWxpdHlGbGFncygpOwokc3RhYmlsaXR5RmxhZ3MgPSBSb290UGFja2FnZUxvYWRlcjo6ZXh0cmFjdFN0YWJpbGl0eUZsYWdzKCRyZXF1aXJlbWVudHMsICRyb290UGFja2FnZS0+Z2V0TWluaW11bVN0YWJpbGl0eSgpLCAkc3RhYmlsaXR5RmxhZ3MpOwokcm9vdFBhY2thZ2UtPnNldFN0YWJpbGl0eUZsYWdzKCRzdGFiaWxpdHlGbGFncyk7CnVuc2V0KCRzdGFiaWxpdHlGbGFncywgJHJlZmVyZW5jZXMpOwp9CgokdXBkYXRlRGV2TW9kZSA9ICEkaW5wdXQtPmdldE9wdGlvbigndXBkYXRlLW5vLWRldicpOwokb3B0aW1pemUgPSAkaW5wdXQtPmdldE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicpIHx8ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnb3B0aW1pemUtYXV0b2xvYWRlcicpOwokYXV0aG9yaXRhdGl2ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJyk7CiRhcGN1UHJlZml4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnKTsKJGFwY3UgPSAkYXBjdVByZWZpeCAhPT0gbnVsbCB8fCAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdhcGN1LWF1dG9sb2FkZXInKTsKCiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfT05MWV9MSVNURUQ7CiRmbGFncyA9ICcnOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3VwZGF0ZS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnKSB8fCAkaW5wdXQtPmdldE9wdGlvbignd2l0aC1hbGwtZGVwZW5kZW5jaWVzJykpIHsKJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9IFJlcXVlc3Q6OlVQREFURV9MSVNURURfV0lUSF9UUkFOU0lUSVZFX0RFUFM7CiRmbGFncyAuPSAnIC0td2l0aC1hbGwtZGVwZW5kZW5jaWVzJzsKfSBlbHNlaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMnKSB8fCAkaW5wdXQtPmdldE9wdGlvbignd2l0aC1kZXBlbmRlbmNpZXMnKSkgewokdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQU19OT19ST09UX1JFUVVJUkU7CiRmbGFncyAuPSAnIC0td2l0aC1kZXBlbmRlbmNpZXMnOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPlJ1bm5pbmcgY29tcG9zZXIgdXBkYXRlICcuaW1wbG9kZSgnICcsIGFycmF5X2tleXMoJHJlcXVpcmVtZW50cykpLiRmbGFncy4nPC9pbmZvPicpOwoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAncmVxdWlyZScsICRpbnB1dCwgJG91dHB1dCk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7CgokY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+c2V0T3V0cHV0UHJvZ3Jlc3MoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1wcm9ncmVzcycpKTsKCiRpbnN0YWxsID0gSW5zdGFsbGVyOjpjcmVhdGUoJGlvLCAkY29tcG9zZXIpOwoKWyRwcmVmZXJTb3VyY2UsICRwcmVmZXJEaXN0XSA9ICR0aGlzLT5nZXRQcmVmZXJyZWRJbnN0YWxsT3B0aW9ucygkY29tcG9zZXItPmdldENvbmZpZygpLCAkaW5wdXQpOwoKJGluc3RhbGwKLT5zZXREcnlSdW4oJGlucHV0LT5nZXRPcHRpb24oJ2RyeS1ydW4nKSkKLT5zZXRWZXJib3NlKCRpbnB1dC0+Z2V0T3B0aW9uKCd2ZXJib3NlJykpCi0+c2V0UHJlZmVyU291cmNlKCRwcmVmZXJTb3VyY2UpCi0+c2V0UHJlZmVyRGlzdCgkcHJlZmVyRGlzdCkKLT5zZXREZXZNb2RlKCR1cGRhdGVEZXZNb2RlKQotPnNldE9wdGltaXplQXV0b2xvYWRlcigkb3B0aW1pemUpCi0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRhdXRob3JpdGF0aXZlKQotPnNldEFwY3VBdXRvbG9hZGVyKCRhcGN1LCAkYXBjdVByZWZpeCkKLT5zZXRVcGRhdGUodHJ1ZSkKLT5zZXRJbnN0YWxsKCEkaW5wdXQtPmdldE9wdGlvbignbm8taW5zdGFsbCcpKQotPnNldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcygkdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKQotPnNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJHRoaXMtPmdldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJGlucHV0KSkKLT5zZXRQcmVmZXJTdGFibGUoJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1zdGFibGUnKSkKLT5zZXRQcmVmZXJMb3dlc3QoJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1sb3dlc3QnKSkKLT5zZXRBdWRpdCghJGlucHV0LT5nZXRPcHRpb24oJ25vLWF1ZGl0JykpCi0+c2V0QXVkaXRGb3JtYXQoJHRoaXMtPmdldEF1ZGl0Rm9ybWF0KCRpbnB1dCkpCi0+c2V0TWluaW1hbFVwZGF0ZSgkaW5wdXQtPmdldE9wdGlvbignbWluaW1hbC1jaGFuZ2VzJykpCjsKCgoKaWYgKCEkdGhpcy0+Zmlyc3RSZXF1aXJlICYmICRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKJGluc3RhbGwtPnNldFVwZGF0ZUFsbG93TGlzdChhcnJheV9rZXlzKCRyZXF1aXJlbWVudHMpKTsKfQoKJHN0YXR1cyA9ICRpbnN0YWxsLT5ydW4oKTsKaWYgKCRzdGF0dXMgIT09IDAgJiYgJHN0YXR1cyAhPT0gSW5zdGFsbGVyOjpFUlJPUl9BVURJVF9GQUlMRUQpIHsKaWYgKCRzdGF0dXMgPT09IEluc3RhbGxlcjo6RVJST1JfREVQRU5ERU5DWV9SRVNPTFVUSU9OX0ZBSUxFRCkgewpmb3JlYWNoICgkdGhpcy0+bm9ybWFsaXplUmVxdWlyZW1lbnRzKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJykpIGFzICRyZXEpIHsKaWYgKCFpc3NldCgkcmVxWyd2ZXJzaW9uJ10pKSB7CiRpby0+d3JpdGVFcnJvcignWW91IGNhbiBhbHNvIHRyeSByZS1ydW5uaW5nIGNvbXBvc2VyIHJlcXVpcmUgd2l0aCBhbiBleHBsaWNpdCB2ZXJzaW9uIGNvbnN0cmFpbnQsIGUuZy4gImNvbXBvc2VyIHJlcXVpcmUgJy4kcmVxWyduYW1lJ10uJzoqIiB0byBmaWd1cmUgb3V0IGlmIGFueSB2ZXJzaW9uIGlzIGluc3RhbGxhYmxlLCBvciAiY29tcG9zZXIgcmVxdWlyZSAnLiRyZXFbJ25hbWUnXS4nOl4yLjEiIGlmIHlvdSBrbm93IHdoaWNoIHlvdSBuZWVkLicpOwpicmVhazsKfQp9Cn0KJHRoaXMtPnJldmVydENvbXBvc2VyRmlsZSgpOwp9CgpyZXR1cm4gJHN0YXR1czsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVSZXF1aXJlbWVudHNBZnRlclJlc29sdXRpb24oYXJyYXkgJHJlcXVpcmVtZW50c1RvVXBkYXRlLCBzdHJpbmcgJHJlcXVpcmVLZXksIHN0cmluZyAkcmVtb3ZlS2V5LCBib29sICRzb3J0UGFja2FnZXMsIGJvb2wgJGRyeVJ1biwgYm9vbCAkZml4ZWQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwokcmVxdWlyZW1lbnRzID0gW107CiR2ZXJzaW9uU2VsZWN0b3IgPSBuZXcgVmVyc2lvblNlbGVjdG9yKG5ldyBSZXBvc2l0b3J5U2V0KCkpOwokcmVwbyA9ICRsb2NrZXItPmlzTG9ja2VkKCkgPyAkY29tcG9zZXItPmdldExvY2tlcigpLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpIDogJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKZm9yZWFjaCAoJHJlcXVpcmVtZW50c1RvVXBkYXRlIGFzICRwYWNrYWdlTmFtZSkgewokcGFja2FnZSA9ICRyZXBvLT5maW5kUGFja2FnZSgkcGFja2FnZU5hbWUsICcqJyk7CndoaWxlICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCmlmICghJHBhY2thZ2UgaW5zdGFuY2VvZiBQYWNrYWdlSW50ZXJmYWNlKSB7CmNvbnRpbnVlOwp9CgppZiAoJGZpeGVkKSB7CiRyZXF1aXJlbWVudHNbJHBhY2thZ2VOYW1lXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0gZWxzZSB7CiRyZXF1aXJlbWVudHNbJHBhY2thZ2VOYW1lXSA9ICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRSZWNvbW1lbmRlZFJlcXVpcmVWZXJzaW9uKCRwYWNrYWdlKTsKfQokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcihzcHJpbnRmKAonVXNpbmcgdmVyc2lvbiA8aW5mbz4lczwvaW5mbz4gZm9yIDxpbmZvPiVzPC9pbmZvPicsCiRyZXF1aXJlbWVudHNbJHBhY2thZ2VOYW1lXSwKJHBhY2thZ2VOYW1lCikpOwoKaWYgKFByZWc6OmlzTWF0Y2goJ3teZGV2LSg/IW1haW4kfG1hc3RlciR8dHJ1bmskfGxhdGVzdCQpfScsICRyZXF1aXJlbWVudHNbJHBhY2thZ2VOYW1lXSkpIHsKJHRoaXMtPmdldElPKCktPndhcm5pbmcoJ1ZlcnNpb24gJy4kcmVxdWlyZW1lbnRzWyRwYWNrYWdlTmFtZV0uJyBsb29rcyBsaWtlIGl0IG1heSBiZSBhIGZlYXR1cmUgYnJhbmNoIHdoaWNoIGlzIHVubGlrZWx5IHRvIGtlZXAgd29ya2luZyBpbiB0aGUgbG9uZyBydW4gYW5kIG1heSBiZSBpbiBhbiB1bnN0YWJsZSBzdGF0ZScpOwppZiAoJHRoaXMtPmdldElPKCktPmlzSW50ZXJhY3RpdmUoKSAmJiAhJHRoaXMtPmdldElPKCktPmFza0NvbmZpcm1hdGlvbignQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVzZSB0aGlzIGNvbnN0cmFpbnQgKDxjb21tZW50Plk8L2NvbW1lbnQ+KSBvciB3b3VsZCB5b3UgcmF0aGVyIGFib3J0ICg8Y29tbWVudD5uPC9jb21tZW50PikgdGhlIHdob2xlIG9wZXJhdGlvbiBbPGNvbW1lbnQ+WSxuPC9jb21tZW50Pl0/ICcpKSB7CiR0aGlzLT5yZXZlcnRDb21wb3NlckZpbGUoKTsKCnJldHVybiAxOwp9Cn0KfQoKaWYgKCEkZHJ5UnVuKSB7CiR0aGlzLT51cGRhdGVGaWxlKCR0aGlzLT5qc29uLCAkcmVxdWlyZW1lbnRzLCAkcmVxdWlyZUtleSwgJHJlbW92ZUtleSwgJHNvcnRQYWNrYWdlcyk7CmlmICgkbG9ja2VyLT5pc0xvY2tlZCgpICYmICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnbG9jaycpKSB7CiRzdGFiaWxpdHlGbGFncyA9IFJvb3RQYWNrYWdlTG9hZGVyOjpleHRyYWN0U3RhYmlsaXR5RmxhZ3MoJHJlcXVpcmVtZW50cywgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldE1pbmltdW1TdGFiaWxpdHkoKSwgW10pOwokbG9ja2VyLT51cGRhdGVIYXNoKCR0aGlzLT5qc29uLCBmdW5jdGlvbiAoYXJyYXkgJGxvY2tEYXRhKSB1c2UgKCRzdGFiaWxpdHlGbGFncykgewpmb3JlYWNoICgkc3RhYmlsaXR5RmxhZ3MgYXMgJHBhY2thZ2VOYW1lID0+ICRmbGFnKSB7CiRsb2NrRGF0YVsnc3RhYmlsaXR5LWZsYWdzJ11bJHBhY2thZ2VOYW1lXSA9ICRmbGFnOwp9CgpyZXR1cm4gJGxvY2tEYXRhOwp9KTsKfQp9CgpyZXR1cm4gMDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVGaWxlKEpzb25GaWxlICRqc29uLCBhcnJheSAkbmV3LCBzdHJpbmcgJHJlcXVpcmVLZXksIHN0cmluZyAkcmVtb3ZlS2V5LCBib29sICRzb3J0UGFja2FnZXMpOiB2b2lkCnsKaWYgKCR0aGlzLT51cGRhdGVGaWxlQ2xlYW5seSgkanNvbiwgJG5ldywgJHJlcXVpcmVLZXksICRyZW1vdmVLZXksICRzb3J0UGFja2FnZXMpKSB7CnJldHVybjsKfQoKJGNvbXBvc2VyRGVmaW5pdGlvbiA9ICR0aGlzLT5qc29uLT5yZWFkKCk7CmZvcmVhY2ggKCRuZXcgYXMgJHBhY2thZ2UgPT4gJHZlcnNpb24pIHsKJGNvbXBvc2VyRGVmaW5pdGlvblskcmVxdWlyZUtleV1bJHBhY2thZ2VdID0gJHZlcnNpb247CnVuc2V0KCRjb21wb3NlckRlZmluaXRpb25bJHJlbW92ZUtleV1bJHBhY2thZ2VdKTsKaWYgKGlzc2V0KCRjb21wb3NlckRlZmluaXRpb25bJHJlbW92ZUtleV0pICYmIGNvdW50KCRjb21wb3NlckRlZmluaXRpb25bJHJlbW92ZUtleV0pID09PSAwKSB7CnVuc2V0KCRjb21wb3NlckRlZmluaXRpb25bJHJlbW92ZUtleV0pOwp9Cn0KJHRoaXMtPmpzb24tPndyaXRlKCRjb21wb3NlckRlZmluaXRpb24pOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZUZpbGVDbGVhbmx5KEpzb25GaWxlICRqc29uLCBhcnJheSAkbmV3LCBzdHJpbmcgJHJlcXVpcmVLZXksIHN0cmluZyAkcmVtb3ZlS2V5LCBib29sICRzb3J0UGFja2FnZXMpOiBib29sCnsKJGNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJGpzb24tPmdldFBhdGgoKSk7CgokbWFuaXB1bGF0b3IgPSBuZXcgSnNvbk1hbmlwdWxhdG9yKCRjb250ZW50cyk7Cgpmb3JlYWNoICgkbmV3IGFzICRwYWNrYWdlID0+ICRjb25zdHJhaW50KSB7CmlmICghJG1hbmlwdWxhdG9yLT5hZGRMaW5rKCRyZXF1aXJlS2V5LCAkcGFja2FnZSwgJGNvbnN0cmFpbnQsICRzb3J0UGFja2FnZXMpKSB7CnJldHVybiBmYWxzZTsKfQppZiAoISRtYW5pcHVsYXRvci0+cmVtb3ZlU3ViTm9kZSgkcmVtb3ZlS2V5LCAkcGFja2FnZSkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCiRtYW5pcHVsYXRvci0+cmVtb3ZlTWFpbktleUlmRW1wdHkoJHJlbW92ZUtleSk7CgpmaWxlX3B1dF9jb250ZW50cygkanNvbi0+Z2V0UGF0aCgpLCAkbWFuaXB1bGF0b3ItPmdldENvbnRlbnRzKCkpOwoKcmV0dXJuIHRydWU7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbnRlcmFjdChJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcmV2ZXJ0Q29tcG9zZXJGaWxlKCk6IHZvaWQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCmlmICgkdGhpcy0+bmV3bHlDcmVhdGVkKSB7CiRpby0+d3JpdGVFcnJvcigiXG4iLic8ZXJyb3I+SW5zdGFsbGF0aW9uIGZhaWxlZCwgZGVsZXRpbmcgJy4kdGhpcy0+ZmlsZS4nLjwvZXJyb3I+Jyk7CnVubGluaygkdGhpcy0+anNvbi0+Z2V0UGF0aCgpKTsKaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5sb2NrKSkgewp1bmxpbmsoJHRoaXMtPmxvY2spOwp9Cn0gZWxzZSB7CiRtc2cgPSAnIHRvIGl0cyAnOwppZiAoJHRoaXMtPmxvY2tCYWNrdXApIHsKJG1zZyA9ICcgYW5kICcuJHRoaXMtPmxvY2suJyB0byB0aGVpciAnOwp9CiRpby0+d3JpdGVFcnJvcigiXG4iLic8ZXJyb3I+SW5zdGFsbGF0aW9uIGZhaWxlZCwgcmV2ZXJ0aW5nICcuJHRoaXMtPmZpbGUuJG1zZy4nb3JpZ2luYWwgY29udGVudC48L2Vycm9yPicpOwpmaWxlX3B1dF9jb250ZW50cygkdGhpcy0+anNvbi0+Z2V0UGF0aCgpLCAkdGhpcy0+Y29tcG9zZXJCYWNrdXApOwppZiAoJHRoaXMtPmxvY2tCYWNrdXApIHsKZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPmxvY2ssICR0aGlzLT5sb2NrQmFja3VwKTsKfQp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxTY3JpcHRcRXZlbnQgYXMgU2NyaXB0RXZlbnQ7CnVzZSBDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBSdW5TY3JpcHRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewoKCgpwcm90ZWN0ZWQgJHNjcmlwdEV2ZW50cyA9IFsKU2NyaXB0RXZlbnRzOjpQUkVfSU5TVEFMTF9DTUQsClNjcmlwdEV2ZW50czo6UE9TVF9JTlNUQUxMX0NNRCwKU2NyaXB0RXZlbnRzOjpQUkVfVVBEQVRFX0NNRCwKU2NyaXB0RXZlbnRzOjpQT1NUX1VQREFURV9DTUQsClNjcmlwdEV2ZW50czo6UFJFX1NUQVRVU19DTUQsClNjcmlwdEV2ZW50czo6UE9TVF9TVEFUVVNfQ01ELApTY3JpcHRFdmVudHM6OlBPU1RfUk9PVF9QQUNLQUdFX0lOU1RBTEwsClNjcmlwdEV2ZW50czo6UE9TVF9DUkVBVEVfUFJPSkVDVF9DTUQsClNjcmlwdEV2ZW50czo6UFJFX0FSQ0hJVkVfQ01ELApTY3JpcHRFdmVudHM6OlBPU1RfQVJDSElWRV9DTUQsClNjcmlwdEV2ZW50czo6UFJFX0FVVE9MT0FEX0RVTVAsClNjcmlwdEV2ZW50czo6UE9TVF9BVVRPTE9BRF9EVU1QLApdOwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdydW4tc2NyaXB0JykKLT5zZXRBbGlhc2VzKFsncnVuJ10pCi0+c2V0RGVzY3JpcHRpb24oJ1J1bnMgdGhlIHNjcmlwdHMgZGVmaW5lZCBpbiBjb21wb3Nlci5qc29uJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ3NjcmlwdCcsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnU2NyaXB0IG5hbWUgdG8gcnVuLicsIG51bGwsIGZ1bmN0aW9uICgpIHsKcmV0dXJuIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRzY3JpcHQpIHsgcmV0dXJuICRzY3JpcHRbJ25hbWUnXTsgfSwgJHRoaXMtPmdldFNjcmlwdHMoKSk7Cn0pLApuZXcgSW5wdXRBcmd1bWVudCgnYXJncycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICcnKSwKbmV3IElucHV0T3B0aW9uKCd0aW1lb3V0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnU2V0cyBzY3JpcHQgdGltZW91dCBpbiBzZWNvbmRzLCBvciAwIGZvciBuZXZlci4nKSwKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NldHMgdGhlIGRldiBtb2RlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgdGhlIGRldiBtb2RlLicpLApuZXcgSW5wdXRPcHRpb24oJ2xpc3QnLCAnbCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnTGlzdCBzY3JpcHRzLicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+cnVuLXNjcmlwdDwvaW5mbz4gY29tbWFuZCBydW5zIHNjcmlwdHMgZGVmaW5lZCBpbiBjb21wb3Nlci5qc29uOgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgcnVuLXNjcmlwdCBwb3N0LXVwZGF0ZS1jbWQ8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNydW4tc2NyaXB0LXJ1bgpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbnRlcmFjdChJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiRzY3JpcHRzID0gJHRoaXMtPmdldFNjcmlwdHMoKTsKaWYgKGNvdW50KCRzY3JpcHRzKSA9PT0gMCkgewpyZXR1cm47Cn0KCmlmICgkaW5wdXQtPmdldEFyZ3VtZW50KCdzY3JpcHQnKSAhPT0gbnVsbCB8fCAkaW5wdXQtPmdldE9wdGlvbignbGlzdCcpKSB7CnJldHVybjsKfQoKJG9wdGlvbnMgPSBbXTsKZm9yZWFjaCAoJHNjcmlwdHMgYXMgJHNjcmlwdCkgewokb3B0aW9uc1skc2NyaXB0WyduYW1lJ11dID0gJHNjcmlwdFsnZGVzY3JpcHRpb24nXTsKfQokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJHNjcmlwdCA9ICRpby0+c2VsZWN0KAonU2NyaXB0IHRvIHJ1bjogJywKJG9wdGlvbnMsCicnLAoxLAonSW52YWxpZCBzY3JpcHQgbmFtZSAiJXMiJwopOwoKJGlucHV0LT5zZXRBcmd1bWVudCgnc2NyaXB0JywgJHNjcmlwdCk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xpc3QnKSkgewpyZXR1cm4gJHRoaXMtPmxpc3RTY3JpcHRzKCRvdXRwdXQpOwp9Cgokc2NyaXB0ID0gJGlucHV0LT5nZXRBcmd1bWVudCgnc2NyaXB0Jyk7CmlmICgkc2NyaXB0ID09PSBudWxsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCAic2NyaXB0IicpOwp9CgppZiAoIWluX2FycmF5KCRzY3JpcHQsICR0aGlzLT5zY3JpcHRFdmVudHMpKSB7CmlmIChkZWZpbmVkKCdDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOjonLnN0cl9yZXBsYWNlKCctJywgJ18nLCBzdHJ0b3VwcGVyKCRzY3JpcHQpKSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignU2NyaXB0ICIlcyIgY2Fubm90IGJlIHJ1biB3aXRoIHRoaXMgY29tbWFuZCcsICRzY3JpcHQpKTsKfQp9CgokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CiRkZXZNb2RlID0gJGlucHV0LT5nZXRPcHRpb24oJ2RldicpIHx8ICEkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2Jyk7CiRldmVudCA9IG5ldyBTY3JpcHRFdmVudCgkc2NyaXB0LCAkY29tcG9zZXIsICR0aGlzLT5nZXRJTygpLCAkZGV2TW9kZSk7CiRoYXNMaXN0ZW5lcnMgPSAkY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5oYXNFdmVudExpc3RlbmVycygkZXZlbnQpOwppZiAoISRoYXNMaXN0ZW5lcnMpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignU2NyaXB0ICIlcyIgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBwYWNrYWdlJywgJHNjcmlwdCkpOwp9CgokYXJncyA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2FyZ3MnKTsKCmlmIChudWxsICE9PSAkdGltZW91dCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCd0aW1lb3V0JykpIHsKaWYgKCFjdHlwZV9kaWdpdCgkdGltZW91dCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaW1lb3V0IHZhbHVlIG11c3QgYmUgbnVtZXJpYyBhbmQgcG9zaXRpdmUgaWYgZGVmaW5lZCwgb3IgMCBmb3IgZm9yZXZlcicpOwp9CgpQcm9jZXNzRXhlY3V0b3I6OnNldFRpbWVvdXQoKGludCkgJHRpbWVvdXQpOwp9CgpQbGF0Zm9ybTo6cHV0RW52KCdDT01QT1NFUl9ERVZfTU9ERScsICRkZXZNb2RlID8gJzEnIDogJzAnKTsKCnJldHVybiAkY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaFNjcmlwdCgkc2NyaXB0LCAkZGV2TW9kZSwgJGFyZ3MpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gbGlzdFNjcmlwdHMoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokc2NyaXB0cyA9ICR0aGlzLT5nZXRTY3JpcHRzKCk7CmlmIChjb3VudCgkc2NyaXB0cykgPT09IDApIHsKcmV0dXJuIDA7Cn0KCiRpbyA9ICR0aGlzLT5nZXRJTygpOwokaW8tPndyaXRlRXJyb3IoJzxpbmZvPnNjcmlwdHM6PC9pbmZvPicpOwokdGFibGUgPSBbXTsKZm9yZWFjaCAoJHNjcmlwdHMgYXMgJHNjcmlwdCkgewokdGFibGVbXSA9IFsnICAnLiRzY3JpcHRbJ25hbWUnXSwgJHNjcmlwdFsnZGVzY3JpcHRpb24nXV07Cn0KCiR0aGlzLT5yZW5kZXJUYWJsZSgkdGFibGUsICRvdXRwdXQpOwoKcmV0dXJuIDA7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0U2NyaXB0cygpOiBhcnJheQp7CiRzY3JpcHRzID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpLT5nZXRQYWNrYWdlKCktPmdldFNjcmlwdHMoKTsKaWYgKGNvdW50KCRzY3JpcHRzKSA9PT0gMCkgewpyZXR1cm4gW107Cn0KCiRyZXN1bHQgPSBbXTsKZm9yZWFjaCAoJHNjcmlwdHMgYXMgJG5hbWUgPT4gJHNjcmlwdCkgewokZGVzY3JpcHRpb24gPSAnJzsKdHJ5IHsKJGNtZCA9ICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5maW5kKCRuYW1lKTsKaWYgKCRjbWQgaW5zdGFuY2VvZiBTY3JpcHRBbGlhc0NvbW1hbmQpIHsKJGRlc2NyaXB0aW9uID0gJGNtZC0+Z2V0RGVzY3JpcHRpb24oKTsKfQp9IGNhdGNoIChcU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uICRlKSB7Cgp9CiRyZXN1bHRbXSA9IFsnbmFtZScgPT4gJG5hbWUsICdkZXNjcmlwdGlvbicgPT4gJGRlc2NyaXB0aW9uXTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIFNjcmlwdEFsaWFzQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKCnByaXZhdGUgJHNjcmlwdDsKCnByaXZhdGUgJGRlc2NyaXB0aW9uOwoKcHJpdmF0ZSAkYWxpYXNlczsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHNjcmlwdCwgP3N0cmluZyAkZGVzY3JpcHRpb24sIGFycmF5ICRhbGlhc2VzID0gW10pCnsKJHRoaXMtPnNjcmlwdCA9ICRzY3JpcHQ7CiR0aGlzLT5kZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbiA/PyAnUnVucyB0aGUgJy4kc2NyaXB0Licgc2NyaXB0IGFzIGRlZmluZWQgaW4gY29tcG9zZXIuanNvbic7CiR0aGlzLT5hbGlhc2VzID0gJGFsaWFzZXM7Cgpmb3JlYWNoICgkdGhpcy0+YWxpYXNlcyBhcyAkYWxpYXMpIHsKaWYgKCFpc19zdHJpbmcoJGFsaWFzKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignInNjcmlwdHMtYWxpYXNlcyIgZWxlbWVudCBhcnJheSB2YWx1ZXMgc2hvdWxkIGNvbnRhaW4gb25seSBzdHJpbmdzJyk7Cn0KfQoKJHRoaXMtPmlnbm9yZVZhbGlkYXRpb25FcnJvcnMoKTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCR0aGlzLT5zY3JpcHQpCi0+c2V0RGVzY3JpcHRpb24oJHRoaXMtPmRlc2NyaXB0aW9uKQotPnNldEFsaWFzZXMoJHRoaXMtPmFsaWFzZXMpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTZXRzIHRoZSBkZXYgbW9kZS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIHRoZSBkZXYgbW9kZS4nKSwKbmV3IElucHV0QXJndW1lbnQoJ2FyZ3MnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5ydW4tc2NyaXB0PC9pbmZvPiBjb21tYW5kIHJ1bnMgc2NyaXB0cyBkZWZpbmVkIGluIGNvbXBvc2VyLmpzb246Cgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBydW4tc2NyaXB0IHBvc3QtdXBkYXRlLWNtZDwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3J1bi1zY3JpcHQtcnVuCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiRhcmdzID0gJGlucHV0LT5nZXRBcmd1bWVudHMoKTsKCgppZiAoIW1ldGhvZF9leGlzdHMoJGlucHV0LCAnX190b1N0cmluZycpKSB7IAp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFeHBlY3RlZCBhbiBJbnB1dCBpbnN0YW5jZSB0aGF0IGlzIHN0cmluZ2FibGUsIGdvdCAnLmdldF9jbGFzcygkaW5wdXQpKTsKfQoKcmV0dXJuICRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoU2NyaXB0KCR0aGlzLT5zY3JpcHQsICRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSB8fCAhJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpLCAkYXJnc1snYXJncyddLCBbJ3NjcmlwdC1hbGlhcy1pbnB1dCcgPT4gUHJlZzo6cmVwbGFjZSgne15cUysgP30nLCAnJywgJGlucHV0LT5fX3RvU3RyaW5nKCksIDEpXSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKCgoKCmNsYXNzIFNlYXJjaENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnc2VhcmNoJykKLT5zZXREZXNjcmlwdGlvbignU2VhcmNoZXMgZm9yIHBhY2thZ2VzJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdvbmx5LW5hbWUnLCAnTicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2VhcmNoIG9ubHkgaW4gcGFja2FnZSBuYW1lcycpLApuZXcgSW5wdXRPcHRpb24oJ29ubHktdmVuZG9yJywgJ08nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NlYXJjaCBvbmx5IGZvciB2ZW5kb3IgLyBvcmdhbml6YXRpb24gbmFtZXMsIHJldHVybnMgb25seSAidmVuZG9yIiBhcyByZXN1bHQnKSwKbmV3IElucHV0T3B0aW9uKCd0eXBlJywgJ3QnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdTZWFyY2ggZm9yIGEgc3BlY2lmaWMgcGFja2FnZSB0eXBlJyksCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JtYXQgb2YgdGhlIG91dHB1dDogdGV4dCBvciBqc29uJywgJ3RleHQnLCBbJ2pzb24nLCAndGV4dCddKSwKbmV3IElucHV0QXJndW1lbnQoJ3Rva2VucycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6UkVRVUlSRUQsICd0b2tlbnMgdG8gc2VhcmNoIGZvcicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgc2VhcmNoIGNvbW1hbmQgc2VhcmNoZXMgZm9yIHBhY2thZ2VzIGJ5IGl0cyBuYW1lCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHNlYXJjaCBzeW1mb255IGNvbXBvc2VyPC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjc2VhcmNoCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CgokcGxhdGZvcm1SZXBvID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgokZm9ybWF0ID0gJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpOwppZiAoIWluX2FycmF5KCRmb3JtYXQsIFsndGV4dCcsICdqc29uJ10pKSB7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKCdVbnN1cHBvcnRlZCBmb3JtYXQgIiVzIi4gU2VlIGhlbHAgZm9yIHN1cHBvcnRlZCBmb3JtYXRzLicsICRmb3JtYXQpKTsKCnJldHVybiAxOwp9CgppZiAoISgkY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKSkpIHsKJGNvbXBvc2VyID0gJHRoaXMtPmNyZWF0ZUNvbXBvc2VySW5zdGFuY2UoJGlucHV0LCAkdGhpcy0+Z2V0SU8oKSwgW10pOwp9CiRsb2NhbFJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwokaW5zdGFsbGVkUmVwbyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KFskbG9jYWxSZXBvLCAkcGxhdGZvcm1SZXBvXSk7CiRyZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KGFycmF5X21lcmdlKFskaW5zdGFsbGVkUmVwb10sICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0UmVwb3NpdG9yaWVzKCkpKTsKCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ3NlYXJjaCcsICRpbnB1dCwgJG91dHB1dCk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7CgokbW9kZSA9IFJlcG9zaXRvcnlJbnRlcmZhY2U6OlNFQVJDSF9GVUxMVEVYVDsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdvbmx5LW5hbWUnKSA9PT0gdHJ1ZSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ29ubHktdmVuZG9yJykgPT09IHRydWUpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJy0tb25seS1uYW1lIGFuZCAtLW9ubHktdmVuZG9yIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyJyk7Cn0KJG1vZGUgPSBSZXBvc2l0b3J5SW50ZXJmYWNlOjpTRUFSQ0hfTkFNRTsKfSBlbHNlaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdvbmx5LXZlbmRvcicpID09PSB0cnVlKSB7CiRtb2RlID0gUmVwb3NpdG9yeUludGVyZmFjZTo6U0VBUkNIX1ZFTkRPUjsKfQoKJHR5cGUgPSAkaW5wdXQtPmdldE9wdGlvbigndHlwZScpOwoKJHF1ZXJ5ID0gaW1wbG9kZSgnICcsICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3Rva2VucycpKTsKaWYgKCRtb2RlICE9PSBSZXBvc2l0b3J5SW50ZXJmYWNlOjpTRUFSQ0hfRlVMTFRFWFQpIHsKJHF1ZXJ5ID0gcHJlZ19xdW90ZSgkcXVlcnkpOwp9CgokcmVzdWx0cyA9ICRyZXBvcy0+c2VhcmNoKCRxdWVyeSwgJG1vZGUsICR0eXBlKTsKCmlmIChcY291bnQoJHJlc3VsdHMpID4gMCAmJiAkZm9ybWF0ID09PSAndGV4dCcpIHsKJHdpZHRoID0gJHRoaXMtPmdldFRlcm1pbmFsV2lkdGgoKTsKCiRuYW1lTGVuZ3RoID0gMDsKZm9yZWFjaCAoJHJlc3VsdHMgYXMgJHJlc3VsdCkgewokbmFtZUxlbmd0aCA9IG1heChzdHJsZW4oJHJlc3VsdFsnbmFtZSddKSwgJG5hbWVMZW5ndGgpOwp9CiRuYW1lTGVuZ3RoICs9IDE7CmZvcmVhY2ggKCRyZXN1bHRzIGFzICRyZXN1bHQpIHsKJGRlc2NyaXB0aW9uID0gJHJlc3VsdFsnZGVzY3JpcHRpb24nXSA/PyAnJzsKJHdhcm5pbmcgPSAhZW1wdHkoJHJlc3VsdFsnYWJhbmRvbmVkJ10pID8gJzx3YXJuaW5nPiEgQWJhbmRvbmVkICE8L3dhcm5pbmc+ICcgOiAnJzsKJHJlbWFpbmluZyA9ICR3aWR0aCAtICRuYW1lTGVuZ3RoIC0gc3RybGVuKCR3YXJuaW5nKSAtIDI7CmlmIChzdHJsZW4oJGRlc2NyaXB0aW9uKSA+ICRyZW1haW5pbmcpIHsKJGRlc2NyaXB0aW9uID0gc3Vic3RyKCRkZXNjcmlwdGlvbiwgMCwgJHJlbWFpbmluZyAtIDMpIC4gJy4uLic7Cn0KCiRsaW5rID0gJHJlc3VsdFsndXJsJ10gPz8gbnVsbDsKaWYgKCRsaW5rICE9PSBudWxsKSB7CiRpby0+d3JpdGUoJzxocmVmPScuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGxpbmspLic+Jy4kcmVzdWx0WyduYW1lJ10uJzwvPicuIHN0cl9yZXBlYXQoJyAnLCAkbmFtZUxlbmd0aCAtIHN0cmxlbigkcmVzdWx0WyduYW1lJ10pKSAuICR3YXJuaW5nIC4gJGRlc2NyaXB0aW9uKTsKfSBlbHNlIHsKJGlvLT53cml0ZShzdHJfcGFkKCRyZXN1bHRbJ25hbWUnXSwgJG5hbWVMZW5ndGgsICcgJykgLiAkd2FybmluZyAuICRkZXNjcmlwdGlvbik7Cn0KfQp9IGVsc2VpZiAoJGZvcm1hdCA9PT0gJ2pzb24nKSB7CiRpby0+d3JpdGUoSnNvbkZpbGU6OmVuY29kZSgkcmVzdWx0cykpOwp9CgpyZXR1cm4gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxTZWxmVXBkYXRlXEtleXM7CnVzZSBDb21wb3NlclxTZWxmVXBkYXRlXFZlcnNpb25zOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXEZpbGVzeXN0ZW1FeGNlcHRpb247CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIFBoYXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxGaW5kZXI7CgoKCgoKCmNsYXNzIFNlbGZVcGRhdGVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcml2YXRlIGNvbnN0IEhPTUVQQUdFID0gJ2dldGNvbXBvc2VyLm9yZyc7CnByaXZhdGUgY29uc3QgT0xEX0lOU1RBTExfRVhUID0gJy1vbGQucGhhcic7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ3NlbGYtdXBkYXRlJykKLT5zZXRBbGlhc2VzKFsnc2VsZnVwZGF0ZSddKQotPnNldERlc2NyaXB0aW9uKCdVcGRhdGVzIGNvbXBvc2VyLnBoYXIgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdyb2xsYmFjaycsICdyJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXZlcnQgdG8gYW4gb2xkZXIgaW5zdGFsbGF0aW9uIG9mIGNvbXBvc2VyJyksCm5ldyBJbnB1dE9wdGlvbignY2xlYW4tYmFja3VwcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGVsZXRlIG9sZCBiYWNrdXBzIGR1cmluZyBhbiB1cGRhdGUuIFRoaXMgbWFrZXMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBjb21wb3NlciB0aGUgb25seSBiYWNrdXAgYXZhaWxhYmxlIGFmdGVyIHRoZSB1cGRhdGUnKSwKbmV3IElucHV0QXJndW1lbnQoJ3ZlcnNpb24nLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1RoZSB2ZXJzaW9uIHRvIHVwZGF0ZSB0bycpLApuZXcgSW5wdXRPcHRpb24oJ25vLXByb2dyZXNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3Qgb3V0cHV0IGRvd25sb2FkIHByb2dyZXNzLicpLApuZXcgSW5wdXRPcHRpb24oJ3VwZGF0ZS1rZXlzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdQcm9tcHQgdXNlciBmb3IgYSBrZXkgdXBkYXRlJyksCm5ldyBJbnB1dE9wdGlvbignc3RhYmxlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZSBhbiB1cGRhdGUgdG8gdGhlIHN0YWJsZSBjaGFubmVsJyksCm5ldyBJbnB1dE9wdGlvbigncHJldmlldycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2UgYW4gdXBkYXRlIHRvIHRoZSBwcmV2aWV3IGNoYW5uZWwnKSwKbmV3IElucHV0T3B0aW9uKCdzbmFwc2hvdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2UgYW4gdXBkYXRlIHRvIHRoZSBzbmFwc2hvdCBjaGFubmVsJyksCm5ldyBJbnB1dE9wdGlvbignMScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2UgYW4gdXBkYXRlIHRvIHRoZSBzdGFibGUgY2hhbm5lbCwgYnV0IG9ubHkgdXNlIDEueCB2ZXJzaW9ucycpLApuZXcgSW5wdXRPcHRpb24oJzInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgc3RhYmxlIGNoYW5uZWwsIGJ1dCBvbmx5IHVzZSAyLnggdmVyc2lvbnMnKSwKbmV3IElucHV0T3B0aW9uKCcyLjInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgc3RhYmxlIGNoYW5uZWwsIGJ1dCBvbmx5IHVzZSAyLjIueCBMVFMgdmVyc2lvbnMnKSwKbmV3IElucHV0T3B0aW9uKCdzZXQtY2hhbm5lbC1vbmx5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPbmx5IHN0b3JlIHRoZSBjaGFubmVsIGFzIHRoZSBkZWZhdWx0IG9uZSBhbmQgdGhlbiBleGl0JyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5zZWxmLXVwZGF0ZTwvaW5mbz4gY29tbWFuZCBjaGVja3MgZ2V0Y29tcG9zZXIub3JnIGZvciBuZXdlcgp2ZXJzaW9ucyBvZiBjb21wb3NlciBhbmQgaWYgZm91bmQsIGluc3RhbGxzIHRoZSBsYXRlc3QuCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBzZWxmLXVwZGF0ZTwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3NlbGYtdXBkYXRlLXNlbGZ1cGRhdGUKRU9UCikKOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKaWYgKCRfU0VSVkVSWydhcmd2J11bMF0gPT09ICdTdGFuZGFyZCBpbnB1dCBjb2RlJykgewpyZXR1cm4gMTsKfQoKCgpjbGFzc19leGlzdHMoJ0NvbXBvc2VyXFV0aWxcUGxhdGZvcm0nKTsKY2xhc3NfZXhpc3RzKCdDb21wb3NlclxEb3dubG9hZGVyXEZpbGVzeXN0ZW1FeGNlcHRpb24nKTsKCiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoKTsKCmlmICgkY29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykgPT09IHRydWUpIHsKJGJhc2VVcmwgPSAnaHR0cDovLycgLiBzZWxmOjpIT01FUEFHRTsKfSBlbHNlIHsKJGJhc2VVcmwgPSAnaHR0cHM6Ly8nIC4gc2VsZjo6SE9NRVBBR0U7Cn0KCiRpbyA9ICR0aGlzLT5nZXRJTygpOwokaHR0cERvd25sb2FkZXIgPSBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkaW8sICRjb25maWcpOwoKJHZlcnNpb25zVXRpbCA9IG5ldyBWZXJzaW9ucygkY29uZmlnLCAkaHR0cERvd25sb2FkZXIpOwoKCiRyZXF1ZXN0ZWRDaGFubmVsID0gbnVsbDsKZm9yZWFjaCAoVmVyc2lvbnM6OkNIQU5ORUxTIGFzICRjaGFubmVsKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigkY2hhbm5lbCkpIHsKJHJlcXVlc3RlZENoYW5uZWwgPSAkY2hhbm5lbDsKJHZlcnNpb25zVXRpbC0+c2V0Q2hhbm5lbCgkY2hhbm5lbCwgJGlvKTsKYnJlYWs7Cn0KfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzZXQtY2hhbm5lbC1vbmx5JykpIHsKcmV0dXJuIDA7Cn0KCiRjYWNoZURpciA9ICRjb25maWctPmdldCgnY2FjaGUtZGlyJyk7CiRyb2xsYmFja0RpciA9ICRjb25maWctPmdldCgnZGF0YS1kaXInKTsKJGhvbWUgPSAkY29uZmlnLT5nZXQoJ2hvbWUnKTsKJGxvY2FsRmlsZW5hbWUgPSBQaGFyOjpydW5uaW5nKGZhbHNlKTsKaWYgKCcnID09PSAkbG9jYWxGaWxlbmFtZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21wb3Nlci5waGFyIGZpbGUgYXMgaXQgYXBwZWFycyB5b3UgYXJlIG5vdCBydW5uaW5nIHRoaXMgY29kZSBmcm9tIGEgcGhhciBhcmNoaXZlLicpOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3VwZGF0ZS1rZXlzJykpIHsKJHRoaXMtPmZldGNoS2V5cygkaW8sICRjb25maWcpOwoKcmV0dXJuIDA7Cn0KCgppZiAoIWZpbGVfZXhpc3RzKCRsb2NhbEZpbGVuYW1lKSkgewp0aHJvdyBuZXcgRmlsZXN5c3RlbUV4Y2VwdGlvbignQ29tcG9zZXIgdXBkYXRlIGZhaWxlZDogdGhlICInLiRsb2NhbEZpbGVuYW1lLiciIGlzIG5vdCBhY2Nlc3NpYmxlJyk7Cn0KCgokdG1wRGlyID0gaXNfd3JpdGFibGUoZGlybmFtZSgkbG9jYWxGaWxlbmFtZSkpID8gZGlybmFtZSgkbG9jYWxGaWxlbmFtZSkgOiAkY2FjaGVEaXI7CgoKaWYgKCFpc193cml0YWJsZSgkdG1wRGlyKSkgewp0aHJvdyBuZXcgRmlsZXN5c3RlbUV4Y2VwdGlvbignQ29tcG9zZXIgdXBkYXRlIGZhaWxlZDogdGhlICInLiR0bXBEaXIuJyIgZGlyZWN0b3J5IHVzZWQgdG8gZG93bmxvYWQgdGhlIHRlbXAgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbicpOwp9CgoKaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGV1aWQnKSkgewokY29tcG9zZXJVc2VyID0gcG9zaXhfZ2V0cHd1aWQocG9zaXhfZ2V0ZXVpZCgpKTsKJGhvbWVEaXJPd25lcklkID0gZmlsZW93bmVyKCRob21lKTsKaWYgKGlzX2FycmF5KCRjb21wb3NlclVzZXIpICYmICRob21lRGlyT3duZXJJZCAhPT0gZmFsc2UpIHsKJGhvbWVPd25lciA9IHBvc2l4X2dldHB3dWlkKCRob21lRGlyT3duZXJJZCk7CmlmIChpc19hcnJheSgkaG9tZU93bmVyKSAmJiAkY29tcG9zZXJVc2VyWyduYW1lJ10gIT09ICRob21lT3duZXJbJ25hbWUnXSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgcnVubmluZyBDb21wb3NlciBhcyAiJy4kY29tcG9zZXJVc2VyWyduYW1lJ10uJyIsIHdoaWxlICInLiRob21lLiciIGlzIG93bmVkIGJ5ICInLiRob21lT3duZXJbJ25hbWUnXS4nIjwvd2FybmluZz4nKTsKfQp9Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigncm9sbGJhY2snKSkgewpyZXR1cm4gJHRoaXMtPnJvbGxiYWNrKCRvdXRwdXQsICRyb2xsYmFja0RpciwgJGxvY2FsRmlsZW5hbWUpOwp9CgppZiAoJGlucHV0LT5nZXRBcmd1bWVudCgnY29tbWFuZCcpID09PSAnc2VsZicgJiYgJGlucHV0LT5nZXRBcmd1bWVudCgndmVyc2lvbicpID09PSAndXBkYXRlJykgewokaW5wdXQtPnNldEFyZ3VtZW50KCd2ZXJzaW9uJywgbnVsbCk7Cn0KCiRsYXRlc3QgPSAkdmVyc2lvbnNVdGlsLT5nZXRMYXRlc3QoKTsKJGxhdGVzdFN0YWJsZSA9ICR2ZXJzaW9uc1V0aWwtPmdldExhdGVzdCgnc3RhYmxlJyk7CnRyeSB7CiRsYXRlc3RQcmV2aWV3ID0gJHZlcnNpb25zVXRpbC0+Z2V0TGF0ZXN0KCdwcmV2aWV3Jyk7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKJGxhdGVzdFByZXZpZXcgPSAkbGF0ZXN0U3RhYmxlOwp9CiRsYXRlc3RWZXJzaW9uID0gJGxhdGVzdFsndmVyc2lvbiddOwokdXBkYXRlVmVyc2lvbiA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3ZlcnNpb24nKSA/PyAkbGF0ZXN0VmVyc2lvbjsKJGN1cnJlbnRNYWpvclZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCd7XihcZCspLip9JywgJyQxJywgQ29tcG9zZXI6OmdldFZlcnNpb24oKSk7CiR1cGRhdGVNYWpvclZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCd7XihcZCspLip9JywgJyQxJywgJHVwZGF0ZVZlcnNpb24pOwokcHJldmlld01ham9yVmVyc2lvbiA9IFByZWc6OnJlcGxhY2UoJ3teKFxkKykuKn0nLCAnJDEnLCAkbGF0ZXN0UHJldmlld1sndmVyc2lvbiddKTsKCmlmICgkdmVyc2lvbnNVdGlsLT5nZXRDaGFubmVsKCkgPT09ICdzdGFibGUnICYmIG51bGwgPT09ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3ZlcnNpb24nKSkgewoKCmlmICgkY3VycmVudE1ham9yVmVyc2lvbiA8ICR1cGRhdGVNYWpvclZlcnNpb24pIHsKJHNraXBwZWRWZXJzaW9uID0gJHVwZGF0ZVZlcnNpb247CgokdmVyc2lvbnNVdGlsLT5zZXRDaGFubmVsKCRjdXJyZW50TWFqb3JWZXJzaW9uKTsKCiRsYXRlc3QgPSAkdmVyc2lvbnNVdGlsLT5nZXRMYXRlc3QoKTsKJGxhdGVzdFN0YWJsZSA9ICR2ZXJzaW9uc1V0aWwtPmdldExhdGVzdCgnc3RhYmxlJyk7CiRsYXRlc3RWZXJzaW9uID0gJGxhdGVzdFsndmVyc2lvbiddOwokdXBkYXRlVmVyc2lvbiA9ICRsYXRlc3RWZXJzaW9uOwoKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5BIG5ldyBzdGFibGUgbWFqb3IgdmVyc2lvbiBvZiBDb21wb3NlciBpcyBhdmFpbGFibGUgKCcuJHNraXBwZWRWZXJzaW9uLicpLCBydW4gImNvbXBvc2VyIHNlbGYtdXBkYXRlIC0tJy4kdXBkYXRlTWFqb3JWZXJzaW9uLiciIHRvIHVwZGF0ZSB0byBpdC4gU2VlIGFsc28gaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvJy4kdXBkYXRlTWFqb3JWZXJzaW9uLic8L3dhcm5pbmc+Jyk7Cn0gZWxzZWlmICgkY3VycmVudE1ham9yVmVyc2lvbiA8ICRwcmV2aWV3TWFqb3JWZXJzaW9uKSB7CgokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkEgcHJldmlldyByZWxlYXNlIG9mIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgQ29tcG9zZXIgaXMgYXZhaWxhYmxlICgnLiRsYXRlc3RQcmV2aWV3Wyd2ZXJzaW9uJ10uJyksIHJ1biAiY29tcG9zZXIgc2VsZi11cGRhdGUgLS1wcmV2aWV3IiB0byBnaXZlIGl0IGEgdHJ5LiBTZWUgYWxzbyBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY29tcG9zZXIvcmVsZWFzZXMgZm9yIGNoYW5nZWxvZ3MuPC93YXJuaW5nPicpOwp9Cn0KCiRlZmZlY3RpdmVDaGFubmVsID0gJHJlcXVlc3RlZENoYW5uZWwgPT09IG51bGwgPyAkdmVyc2lvbnNVdGlsLT5nZXRDaGFubmVsKCkgOiAkcmVxdWVzdGVkQ2hhbm5lbDsKaWYgKGlzX251bWVyaWMoJGVmZmVjdGl2ZUNoYW5uZWwpICYmIHN0cnBvcygkbGF0ZXN0U3RhYmxlWyd2ZXJzaW9uJ10sICRlZmZlY3RpdmVDaGFubmVsKSAhPT0gMCkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPldhcm5pbmc6IFlvdSBmb3JjZWQgdGhlIGluc3RhbGwgb2YgJy4kbGF0ZXN0VmVyc2lvbi4nIHZpYSAtLScuJGVmZmVjdGl2ZUNoYW5uZWwuJywgYnV0ICcuJGxhdGVzdFN0YWJsZVsndmVyc2lvbiddLicgaXMgdGhlIGxhdGVzdCBzdGFibGUgdmVyc2lvbi4gVXBkYXRpbmcgdG8gaXQgdmlhIGNvbXBvc2VyIHNlbGYtdXBkYXRlIC0tc3RhYmxlIGlzIHJlY29tbWVuZGVkLjwvd2FybmluZz4nKTsKfQppZiAoaXNzZXQoJGxhdGVzdFsnZW9sJ10pKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+V2FybmluZzogVmVyc2lvbiAnLiRsYXRlc3RWZXJzaW9uLicgaXMgRU9MIC8gRW5kIG9mIExpZmUuICcuJGxhdGVzdFN0YWJsZVsndmVyc2lvbiddLicgaXMgdGhlIGxhdGVzdCBzdGFibGUgdmVyc2lvbi4gVXBkYXRpbmcgdG8gaXQgdmlhIGNvbXBvc2VyIHNlbGYtdXBkYXRlIC0tc3RhYmxlIGlzIHJlY29tbWVuZGVkLjwvd2FybmluZz4nKTsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJ3teWzAtOWEtZl17NDB9JH0nLCAkdXBkYXRlVmVyc2lvbikgJiYgJHVwZGF0ZVZlcnNpb24gIT09ICRsYXRlc3RWZXJzaW9uKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPllvdSBjYW4gbm90IHVwZGF0ZSB0byBhIHNwZWNpZmljIFNIQS0xIGFzIHRob3NlIHBoYXJzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBkb3dubG9hZDwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQoKJGNoYW5uZWxTdHJpbmcgPSAkdmVyc2lvbnNVdGlsLT5nZXRDaGFubmVsKCk7CmlmIChpc19udW1lcmljKCRjaGFubmVsU3RyaW5nKSkgewokY2hhbm5lbFN0cmluZyAuPSAnLngnOwp9CgppZiAoQ29tcG9zZXI6OlZFUlNJT04gPT09ICR1cGRhdGVWZXJzaW9uKSB7CiRpby0+d3JpdGVFcnJvcigKc3ByaW50ZigKJzxpbmZvPllvdSBhcmUgYWxyZWFkeSB1c2luZyB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBDb21wb3NlciB2ZXJzaW9uICVzICglcyBjaGFubmVsKS48L2luZm8+JywKJHVwZGF0ZVZlcnNpb24sCiRjaGFubmVsU3RyaW5nCikKKTsKCgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2NsZWFuLWJhY2t1cHMnKSkgewokdGhpcy0+Y2xlYW5CYWNrdXBzKCRyb2xsYmFja0RpciwgJHRoaXMtPmdldExhc3RCYWNrdXBWZXJzaW9uKCRyb2xsYmFja0RpcikpOwp9CgpyZXR1cm4gMDsKfQoKJHRlbXBGaWxlbmFtZSA9ICR0bXBEaXIgLiAnLycgLiBiYXNlbmFtZSgkbG9jYWxGaWxlbmFtZSwgJy5waGFyJykuJy10ZW1wJy5yYW5kb21faW50KDAsIDEwMDAwMDAwKS4nLnBoYXInOwokYmFja3VwRmlsZSA9IHNwcmludGYoCiclcy8lcy0lcyVzJywKJHJvbGxiYWNrRGlyLApzdHJ0cihDb21wb3Nlcjo6UkVMRUFTRV9EQVRFLCAnIDonLCAnXy0nKSwKUHJlZzo6cmVwbGFjZSgne14oWzAtOWEtZl17N30pWzAtOWEtZl17MzN9JH0nLCAnJDEnLCBDb21wb3Nlcjo6VkVSU0lPTiksCnNlbGY6Ok9MRF9JTlNUQUxMX0VYVAopOwoKJHVwZGF0aW5nVG9UYWcgPSAhUHJlZzo6aXNNYXRjaCgne15bMC05YS1mXXs0MH0kfScsICR1cGRhdGVWZXJzaW9uKTsKCiRpby0+d3JpdGUoc3ByaW50ZigiVXBncmFkaW5nIHRvIHZlcnNpb24gPGluZm8+JXM8L2luZm8+ICglcyBjaGFubmVsKS4iLCAkdXBkYXRlVmVyc2lvbiwgJGNoYW5uZWxTdHJpbmcpKTsKJHJlbW90ZUZpbGVuYW1lID0gJGJhc2VVcmwgLiAoJHVwZGF0aW5nVG9UYWcgPyAiL2Rvd25sb2FkL3skdXBkYXRlVmVyc2lvbn0vY29tcG9zZXIucGhhciIgOiAnL2NvbXBvc2VyLnBoYXInKTsKdHJ5IHsKJHNpZ25hdHVyZSA9ICRodHRwRG93bmxvYWRlci0+Z2V0KCRyZW1vdGVGaWxlbmFtZS4nLnNpZycpLT5nZXRCb2R5KCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldFN0YXR1c0NvZGUoKSA9PT0gNDA0KSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdWZXJzaW9uICInLiR1cGRhdGVWZXJzaW9uLiciIGNvdWxkIG5vdCBiZSBmb3VuZC4nLCAwLCAkZSk7Cn0KdGhyb3cgJGU7Cn0KJGlvLT53cml0ZUVycm9yKCcgICAnLCBmYWxzZSk7CiRodHRwRG93bmxvYWRlci0+Y29weSgkcmVtb3RlRmlsZW5hbWUsICR0ZW1wRmlsZW5hbWUpOwokaW8tPndyaXRlRXJyb3IoJycpOwoKaWYgKCFmaWxlX2V4aXN0cygkdGVtcEZpbGVuYW1lKSB8fCBudWxsID09PSAkc2lnbmF0dXJlIHx8ICcnID09PSAkc2lnbmF0dXJlKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBkb3dubG9hZCBvZiB0aGUgbmV3IGNvbXBvc2VyIHZlcnNpb24gZmFpbGVkIGZvciBhbiB1bmV4cGVjdGVkIHJlYXNvbjwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQoKCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpICYmICRjb25maWctPmdldCgnZGlzYWJsZS10bHMnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNraXBwaW5nIHBoYXIgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBhcyB5b3UgaGF2ZSBkaXNhYmxlZCBPcGVuU1NMIHZpYSBjb25maWcuZGlzYWJsZS10bHM8L3dhcm5pbmc+Jyk7Cn0gZWxzZSB7CmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIG9wZW5zc2wgZXh0ZW5zaW9uIGlzIHJlcXVpcmVkIGZvciBwaGFyIHNpZ25hdHVyZXMgdG8gYmUgdmVyaWZpZWQgYnV0IGl0IGlzIG5vdCBhdmFpbGFibGUuICcKLiAnSWYgeW91IGNhbiBub3QgZW5hYmxlIHRoZSBvcGVuc3NsIGV4dGVuc2lvbiwgeW91IGNhbiBkaXNhYmxlIHRoaXMgZXJyb3IsIGF0IHlvdXIgb3duIHJpc2ssIGJ5IHNldHRpbmcgdGhlIFwnZGlzYWJsZS10bHNcJyBvcHRpb24gdG8gdHJ1ZS4nKTsKfQoKJHNpZ0ZpbGUgPSAnZmlsZTovLycuJGhvbWUuJy8nIC4gKCR1cGRhdGluZ1RvVGFnID8gJ2tleXMudGFncy5wdWInIDogJ2tleXMuZGV2LnB1YicpOwppZiAoIWZpbGVfZXhpc3RzKCRzaWdGaWxlKSkgewpmaWxlX3B1dF9jb250ZW50cygKJGhvbWUuJy9rZXlzLmRldi5wdWInLAo8PDxERVZQVUJLRVkKLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFuQkRIalpTNmUwWk1vSzN4VEQ3ZgpGTkN6bFhqWC9BaWUyZGl0OFFYQTAzcFNyT1RiYU1ueE9OM2hVTDQ3THozZzFTQzZZSkVNVkhyMHpZcTRlbFdpCmkzZWNGRWd6TGNqK3BaTTVYNnFXdTJPeno0dld4M0pZbzEvYS9IWWRPdVc5ZTNsd1M4VnRTMEFWSkErVThYMEEKaFpuQm1HcGx0SGhPOGhQS0hna0p0a1RVeENoZVRjYnFuNHdHSGw4WjJTZWRpRGNQVEx3cWV6V0tVZnJZenUxZgpvL2ozV0Z3RnM2R3RLNHdkWXRpWHIreXNwQlpITzN5MXVkZjhlRkZHY2IyVjNFYUxPcnRmdXI2WFFWaXpqT3VrCjhsdzV6enNlMVFwL2tsSHFiRFJzalN6SjZpTDZGNGF5bkJjNkV1cXQvOGNjTkFJejByTGpMaE9yYWV5ajRlTm4KOGlva3dNS2lYcGNyUUxUS0grUkgxSkN1T1Z4UTQzNmJKd2JTc3AxVndpcWZ0UFFpZU4rdHpxeStFaUhKSm1HZgpUQkFiV2NuY2ljQ2s5cTJtZCtBbWhOYnZITzRQV2JiejlUekM3SEpiNDYwanlXZXVNRXZ3M2dOSXBFbzJqWWE5CnBNVjZjVnFuU2Erd09jMEQ3cEM5YTZibmUwYnZMY20zUyt3Nkk1aURCM2xac2IzQTlVdFJpU1A3YUdTbzdENzIKOHRDOCtjSWdaY0k3azl2anZPcUgrZDdzZE9VMnlQQ25SWTZ3Rmg2Mi9nOGJEblVwcjU2blpOMUc4OUd3TTRkNApyL1RVN0JRUUl6c1pnQWlxT0dYdlZrbElnQU1pVjBpdWNnZjNyTkJMamplTkV3TlNUVEc5RjBDdFErN0pMd2FFCndTRXVBdVJtK3BScWk4QlJuUS9HS1VjQ0F3RUFBUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQpERVZQVUJLRVkKKTsKCmZpbGVfcHV0X2NvbnRlbnRzKAokaG9tZS4nL2tleXMudGFncy5wdWInLAo8PDxUQUdTUFVCS0VZCi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBMFZpLzJLNmFwQ1ZqNzZuQ25DbDIKTVFVUGRLK0E5ZXFrWUJhY1hvMndRQllteVZsWG0yL24vWnNYNnBDTFlQUVRIeXI1alhia1F6Qnc4U0txUGRsaAp2QTdOcGJNZU5Dejd3UC9Bb2J2VVhNOHhRdVhLYk1EVFkydVo0TzdzTStQZkdicHRLUEJHTGU4WjhkMnNVblRPCmJYdFg2THJqMTN3a1J0bzdzdC93L1lwMzNSSGU5U2xxa2lpUzRNc0gxakJrY0lrRUhzUmF2ZVp6ZWRVYXhZME0KbWJhMHVQaEdVSW5wUHpFSHdyWXFCQkV0V3ZQOTd0MnZ0Zng4STVxdjI4a2gwWTZ0K2puakwxVXJpZDJpdVFaZgpub0NNRklPdTR2a3NLNUh4Snh4ck4wR09tR213VlFqT090eGt3aWtOaW90WkdQUjRLc1ZqOE5uQnJMWDdvR3VNCm5RdkdjaWl1K0tvQzJyM0hEQnJwRGVCVmRPV3hEelQ1UjRpSTBLb0x6RmgycEtxd2JZK29iTlBTMmJqKzJkZ0oKclYzVjVKanJ5NDJRT0NCTjNjODh3VTFQS2Z0T0xqMkVDcGV3WTZ2bkU0NzhJaXBpRXU3RUFkSzhad2oyTG1UcgpSS1FVU2E5azdnZ0JrWVpXQWVPLzJBZzBleTNnMmJnN2VxaytzSEVxNXluSVhkNWxodjZ0QzVQQmRIbFdpcERLCnRsMkl4aUVuZWpuT21BekdWaXZFMVlHZHVZQmpOK21qeERWeThLR0Jyam56MUpQZ0F2Z2R3SjJkWXc0UnNjL2UKVHpDRldHay9ITTZhNGYwSXpCV2JKNW90MFBJaTRhbWswN0lvdEJYRFd3cURpUVR3eXVHQ3ltNUVxV1EyQkQ5NQpSR3Y4OUJQRCsyRExuSnlzbmdzdlZhVUNBd0VBQVE9PQotLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0KVEFHU1BVQktFWQopOwp9CgokcHVia2V5aWQgPSBvcGVuc3NsX3BrZXlfZ2V0X3B1YmxpYygkc2lnRmlsZSk7CmlmIChmYWxzZSA9PT0gJHB1YmtleWlkKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIGxvYWRpbmcgdGhlIHB1YmxpYyBrZXkgZnJvbSAnLiRzaWdGaWxlKTsKfQokYWxnbyA9IGRlZmluZWQoJ09QRU5TU0xfQUxHT19TSEEzODQnKSA/IE9QRU5TU0xfQUxHT19TSEEzODQgOiAnU0hBMzg0JzsKaWYgKCFpbl9hcnJheSgnc2hhMzg0JywgYXJyYXlfbWFwKCdzdHJ0b2xvd2VyJywgb3BlbnNzbF9nZXRfbWRfbWV0aG9kcygpKSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdTSEEzODQgaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIG9wZW5zc2wgZXh0ZW5zaW9uLCBjb3VsZCBub3QgdmVyaWZ5IHRoZSBwaGFyIGZpbGUgaW50ZWdyaXR5Jyk7Cn0KJHNpZ25hdHVyZURhdGEgPSBqc29uX2RlY29kZSgkc2lnbmF0dXJlLCB0cnVlKTsKJHNpZ25hdHVyZVNoYTM4NCA9IGJhc2U2NF9kZWNvZGUoJHNpZ25hdHVyZURhdGFbJ3NoYTM4NCddLCB0cnVlKTsKaWYgKGZhbHNlID09PSAkc2lnbmF0dXJlU2hhMzg0KSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIGxvYWRpbmcgdGhlIHBoYXIgc2lnbmF0dXJlIGZyb20gJy4kcmVtb3RlRmlsZW5hbWUuJy5zaWcsIGdvdCAnLiRzaWduYXR1cmUpOwp9CiR2ZXJpZmllZCA9IDEgPT09IG9wZW5zc2xfdmVyaWZ5KChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKCR0ZW1wRmlsZW5hbWUpLCAkc2lnbmF0dXJlU2hhMzg0LCAkcHVia2V5aWQsICRhbGdvKTsKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAwMDApIHsKCm9wZW5zc2xfZnJlZV9rZXkoJHB1YmtleWlkKTsKfQoKaWYgKCEkdmVyaWZpZWQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgcGhhciBzaWduYXR1cmUgZGlkIG5vdCBtYXRjaCB0aGUgZmlsZSB5b3UgZG93bmxvYWRlZCwgdGhpcyBtZWFucyB5b3VyIHB1YmxpYyBrZXlzIGFyZSBvdXRkYXRlZCBvciB0aGF0IHRoZSBwaGFyIGZpbGUgaXMgY29ycnVwdC9oYXMgYmVlbiBtb2RpZmllZCcpOwp9Cn0KCgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2NsZWFuLWJhY2t1cHMnKSkgewokdGhpcy0+Y2xlYW5CYWNrdXBzKCRyb2xsYmFja0Rpcik7Cn0KCmlmICghJHRoaXMtPnNldExvY2FsUGhhcigkbG9jYWxGaWxlbmFtZSwgJHRlbXBGaWxlbmFtZSwgJGJhY2t1cEZpbGUpKSB7CkB1bmxpbmsoJHRlbXBGaWxlbmFtZSk7CgpyZXR1cm4gMTsKfQoKaWYgKGZpbGVfZXhpc3RzKCRiYWNrdXBGaWxlKSkgewokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKJ1VzZSA8aW5mbz5jb21wb3NlciBzZWxmLXVwZGF0ZSAtLXJvbGxiYWNrPC9pbmZvPiB0byByZXR1cm4gdG8gdmVyc2lvbiA8Y29tbWVudD4lczwvY29tbWVudD4nLApDb21wb3Nlcjo6VkVSU0lPTgopKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5BIGJhY2t1cCBvZiB0aGUgY3VycmVudCB2ZXJzaW9uIGNvdWxkIG5vdCBiZSB3cml0dGVuIHRvICcuJGJhY2t1cEZpbGUuJywgbm8gcm9sbGJhY2sgcG9zc2libGU8L3dhcm5pbmc+Jyk7Cn0KCnJldHVybiAwOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZmV0Y2hLZXlzKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcpOiB2b2lkCnsKaWYgKCEkaW8tPmlzSW50ZXJhY3RpdmUoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1B1YmxpYyBrZXlzIGNhbiBub3QgYmUgZmV0Y2hlZCBpbiBub24taW50ZXJhY3RpdmUgbW9kZSwgcGxlYXNlIHJ1biBDb21wb3NlciBpbnRlcmFjdGl2ZWx5Jyk7Cn0KCiRpby0+d3JpdGUoJ09wZW4gPGluZm8+aHR0cHM6Ly9jb21wb3Nlci5naXRodWIuaW8vcHVia2V5cy5odG1sPC9pbmZvPiB0byBmaW5kIHRoZSBsYXRlc3Qga2V5cycpOwoKJHZhbGlkYXRvciA9IHN0YXRpYyBmdW5jdGlvbiAoJHZhbHVlKTogc3RyaW5nIHsKJHZhbHVlID0gKHN0cmluZykgJHZhbHVlOwppZiAoIVByZWc6OmlzTWF0Y2goJ3teLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0kfScsIHRyaW0oJHZhbHVlKSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0ludmFsaWQgaW5wdXQnKTsKfQoKcmV0dXJuIHRyaW0oJHZhbHVlKS4iXG4iOwp9OwoKJGRldktleSA9ICcnOwp3aGlsZSAoIVByZWc6OmlzTWF0Y2goJ3soLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0uKz8tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0pfXMnLCAkZGV2S2V5LCAkbWF0Y2gpKSB7CiRkZXZLZXkgPSAkaW8tPmFza0FuZFZhbGlkYXRlKCdFbnRlciBEZXYgLyBTbmFwc2hvdCBQdWJsaWMgS2V5IChpbmNsdWRpbmcgbGluZXMgd2l0aCAtLS0tLSk6ICcsICR2YWxpZGF0b3IpOwp3aGlsZSAoJGxpbmUgPSAkaW8tPmFzaygnJywgJycpKSB7CiRkZXZLZXkgLj0gdHJpbSgkbGluZSkuIlxuIjsKaWYgKHRyaW0oJGxpbmUpID09PSAnLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tJykgewpicmVhazsKfQp9Cn0KZmlsZV9wdXRfY29udGVudHMoJGtleVBhdGggPSAkY29uZmlnLT5nZXQoJ2hvbWUnKS4nL2tleXMuZGV2LnB1YicsICRtYXRjaFswXSk7CiRpby0+d3JpdGUoJ1N0b3JlZCBrZXkgd2l0aCBmaW5nZXJwcmludDogJyAuIEtleXM6OmZpbmdlcnByaW50KCRrZXlQYXRoKSk7CgokdGFnc0tleSA9ICcnOwp3aGlsZSAoIVByZWc6OmlzTWF0Y2goJ3soLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0uKz8tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0pfXMnLCAkdGFnc0tleSwgJG1hdGNoKSkgewokdGFnc0tleSA9ICRpby0+YXNrQW5kVmFsaWRhdGUoJ0VudGVyIFRhZ3MgUHVibGljIEtleSAoaW5jbHVkaW5nIGxpbmVzIHdpdGggLS0tLS0pOiAnLCAkdmFsaWRhdG9yKTsKd2hpbGUgKCRsaW5lID0gJGlvLT5hc2soJycsICcnKSkgewokdGFnc0tleSAuPSB0cmltKCRsaW5lKS4iXG4iOwppZiAodHJpbSgkbGluZSkgPT09ICctLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0nKSB7CmJyZWFrOwp9Cn0KfQpmaWxlX3B1dF9jb250ZW50cygka2V5UGF0aCA9ICRjb25maWctPmdldCgnaG9tZScpLicva2V5cy50YWdzLnB1YicsICRtYXRjaFswXSk7CiRpby0+d3JpdGUoJ1N0b3JlZCBrZXkgd2l0aCBmaW5nZXJwcmludDogJyAuIEtleXM6OmZpbmdlcnByaW50KCRrZXlQYXRoKSk7CgokaW8tPndyaXRlKCdQdWJsaWMga2V5cyBzdG9yZWQgaW4gJy4kY29uZmlnLT5nZXQoJ2hvbWUnKSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByb2xsYmFjayhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgc3RyaW5nICRyb2xsYmFja0Rpciwgc3RyaW5nICRsb2NhbEZpbGVuYW1lKTogaW50CnsKJHJvbGxiYWNrVmVyc2lvbiA9ICR0aGlzLT5nZXRMYXN0QmFja3VwVmVyc2lvbigkcm9sbGJhY2tEaXIpOwppZiAobnVsbCA9PT0gJHJvbGxiYWNrVmVyc2lvbikgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignQ29tcG9zZXIgcm9sbGJhY2sgZmFpbGVkOiBubyBpbnN0YWxsYXRpb24gdG8gcm9sbCBiYWNrIHRvIGluICInLiRyb2xsYmFja0Rpci4nIicpOwp9Cgokb2xkRmlsZSA9ICRyb2xsYmFja0RpciAuICcvJyAuICRyb2xsYmFja1ZlcnNpb24gLiBzZWxmOjpPTERfSU5TVEFMTF9FWFQ7CgppZiAoIWlzX2ZpbGUoJG9sZEZpbGUpKSB7CnRocm93IG5ldyBGaWxlc3lzdGVtRXhjZXB0aW9uKCdDb21wb3NlciByb2xsYmFjayBmYWlsZWQ6ICInLiRvbGRGaWxlLiciIGNvdWxkIG5vdCBiZSBmb3VuZCcpOwp9CmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkb2xkRmlsZSkpIHsKdGhyb3cgbmV3IEZpbGVzeXN0ZW1FeGNlcHRpb24oJ0NvbXBvc2VyIHJvbGxiYWNrIGZhaWxlZDogIicuJG9sZEZpbGUuJyIgY291bGQgbm90IGJlIHJlYWQnKTsKfQoKJGlvID0gJHRoaXMtPmdldElPKCk7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKCJSb2xsaW5nIGJhY2sgdG8gdmVyc2lvbiA8aW5mbz4lczwvaW5mbz4uIiwgJHJvbGxiYWNrVmVyc2lvbikpOwppZiAoISR0aGlzLT5zZXRMb2NhbFBoYXIoJGxvY2FsRmlsZW5hbWUsICRvbGRGaWxlKSkgewpyZXR1cm4gMTsKfQoKcmV0dXJuIDA7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBzZXRMb2NhbFBoYXIoc3RyaW5nICRsb2NhbEZpbGVuYW1lLCBzdHJpbmcgJG5ld0ZpbGVuYW1lLCA/c3RyaW5nICRiYWNrdXBUYXJnZXQgPSBudWxsKTogYm9vbAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwokcGVybXMgPSBAZmlsZXBlcm1zKCRsb2NhbEZpbGVuYW1lKTsKaWYgKCRwZXJtcyAhPT0gZmFsc2UpIHsKQGNobW9kKCRuZXdGaWxlbmFtZSwgJHBlcm1zKTsKfQoKCmlmICghJHRoaXMtPnZhbGlkYXRlUGhhcigkbmV3RmlsZW5hbWUsICRlcnJvcikpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlICcuKCRiYWNrdXBUYXJnZXQgIT09IG51bGwgPyAndXBkYXRlJyA6ICdiYWNrdXAnKS4nIGZpbGUgaXMgY29ycnVwdGVkICgnLiRlcnJvci4nKTwvZXJyb3I+Jyk7CgppZiAoJGJhY2t1cFRhcmdldCAhPT0gbnVsbCkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5QbGVhc2UgcmUtcnVuIHRoZSBzZWxmLXVwZGF0ZSBjb21tYW5kIHRvIHRyeSBhZ2Fpbi48L2Vycm9yPicpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoJGJhY2t1cFRhcmdldCAhPT0gbnVsbCkgewpAY29weSgkbG9jYWxGaWxlbmFtZSwgJGJhY2t1cFRhcmdldCk7Cn0KCnRyeSB7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKCgpjb3B5KCRuZXdGaWxlbmFtZSwgJGxvY2FsRmlsZW5hbWUpOwpAdW5saW5rKCRuZXdGaWxlbmFtZSk7Cn0gZWxzZSB7CnJlbmFtZSgkbmV3RmlsZW5hbWUsICRsb2NhbEZpbGVuYW1lKTsKfQoKcmV0dXJuIHRydWU7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKCmlmICghaXNfd3JpdGFibGUoZGlybmFtZSgkbG9jYWxGaWxlbmFtZSkpCiYmICRpby0+aXNJbnRlcmFjdGl2ZSgpCiYmICR0aGlzLT5pc1dpbmRvd3NOb25BZG1pblVzZXIoKSkgewpyZXR1cm4gJHRoaXMtPnRyeUFzV2luZG93c0FkbWluKCRsb2NhbEZpbGVuYW1lLCAkbmV3RmlsZW5hbWUpOwp9CgpAdW5saW5rKCRuZXdGaWxlbmFtZSk7CiRhY3Rpb24gPSAnQ29tcG9zZXIgJy4oJGJhY2t1cFRhcmdldCAhPT0gbnVsbCA/ICd1cGRhdGUnIDogJ3JvbGxiYWNrJyk7CnRocm93IG5ldyBGaWxlc3lzdGVtRXhjZXB0aW9uKCRhY3Rpb24uJyBmYWlsZWQ6ICInLiRsb2NhbEZpbGVuYW1lLiciIGNvdWxkIG5vdCBiZSB3cml0dGVuLicuUEhQX0VPTC4kZS0+Z2V0TWVzc2FnZSgpKTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2xlYW5CYWNrdXBzKHN0cmluZyAkcm9sbGJhY2tEaXIsID9zdHJpbmcgJGV4Y2VwdCA9IG51bGwpOiB2b2lkCnsKJGZpbmRlciA9ICR0aGlzLT5nZXRPbGRJbnN0YWxsYXRpb25GaW5kZXIoJHJvbGxiYWNrRGlyKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CiRmcyA9IG5ldyBGaWxlc3lzdGVtOwoKZm9yZWFjaCAoJGZpbmRlciBhcyAkZmlsZSkgewppZiAoJGZpbGUtPmdldEJhc2VuYW1lKHNlbGY6Ok9MRF9JTlNUQUxMX0VYVCkgPT09ICRleGNlcHQpIHsKY29udGludWU7Cn0KJGZpbGUgPSAoc3RyaW5nKSAkZmlsZTsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5SZW1vdmluZzogJy4kZmlsZS4nPC9pbmZvPicpOwokZnMtPnJlbW92ZSgkZmlsZSk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldExhc3RCYWNrdXBWZXJzaW9uKHN0cmluZyAkcm9sbGJhY2tEaXIpOiA/c3RyaW5nCnsKJGZpbmRlciA9ICR0aGlzLT5nZXRPbGRJbnN0YWxsYXRpb25GaW5kZXIoJHJvbGxiYWNrRGlyKTsKJGZpbmRlci0+c29ydEJ5TmFtZSgpOwokZmlsZXMgPSBpdGVyYXRvcl90b19hcnJheSgkZmluZGVyKTsKCmlmIChjb3VudCgkZmlsZXMpID4gMCkgewpyZXR1cm4gZW5kKCRmaWxlcyktPmdldEJhc2VuYW1lKHNlbGY6Ok9MRF9JTlNUQUxMX0VYVCk7Cn0KCnJldHVybiBudWxsOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0T2xkSW5zdGFsbGF0aW9uRmluZGVyKHN0cmluZyAkcm9sbGJhY2tEaXIpOiBGaW5kZXIKewpyZXR1cm4gRmluZGVyOjpjcmVhdGUoKQotPmRlcHRoKDApCi0+ZmlsZXMoKQotPm5hbWUoJyonIC4gc2VsZjo6T0xEX0lOU1RBTExfRVhUKQotPmluKCRyb2xsYmFja0Rpcik7Cn0KCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZVBoYXIoc3RyaW5nICRwaGFyRmlsZSwgP3N0cmluZyAmJGVycm9yKTogYm9vbAp7CmlmICgoYm9vbCkgaW5pX2dldCgncGhhci5yZWFkb25seScpKSB7CnJldHVybiB0cnVlOwp9Cgp0cnkgewoKJHBoYXIgPSBuZXcgXFBoYXIoJHBoYXJGaWxlKTsKCnVuc2V0KCRwaGFyKTsKJHJlc3VsdCA9IHRydWU7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCEkZSBpbnN0YW5jZW9mIFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJiYgISRlIGluc3RhbmNlb2YgXFBoYXJFeGNlcHRpb24pIHsKdGhyb3cgJGU7Cn0KJGVycm9yID0gJGUtPmdldE1lc3NhZ2UoKTsKJHJlc3VsdCA9IGZhbHNlOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGlzV2luZG93c05vbkFkbWluVXNlcigpOiBib29sCnsKaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKcmV0dXJuIGZhbHNlOwp9CgoKZXhlYygnZmx0bWMuZXhlIGZpbHRlcnMnLCAkb3V0cHV0LCAkZXhpdENvZGUpOwoKcmV0dXJuICRleGl0Q29kZSAhPT0gMDsKfQoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHRyeUFzV2luZG93c0FkbWluKHN0cmluZyAkbG9jYWxGaWxlbmFtZSwgc3RyaW5nICRuZXdGaWxlbmFtZSk6IGJvb2wKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRpby0+d3JpdGVFcnJvcignPGVycm9yPlVuYWJsZSB0byB3cml0ZSAiJy4kbG9jYWxGaWxlbmFtZS4nIi4gQWNjZXNzIGlzIGRlbmllZC48L2Vycm9yPicpOwokaGVscE1lc3NhZ2UgPSAnUGxlYXNlIHJ1biB0aGUgc2VsZi11cGRhdGUgY29tbWFuZCBhcyBhbiBBZG1pbmlzdHJhdG9yLic7CiRxdWVzdGlvbiA9ICdDb21wbGV0ZSB0aGlzIG9wZXJhdGlvbiB3aXRoIEFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcyBbPGNvbW1lbnQ+WSxuPC9jb21tZW50Pl0/ICc7CgppZiAoISRpby0+YXNrQ29uZmlybWF0aW9uKCRxdWVzdGlvbiwgdHJ1ZSkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5PcGVyYXRpb24gY2FuY2VsbGVkLiAnLiRoZWxwTWVzc2FnZS4nPC93YXJuaW5nPicpOwoKcmV0dXJuIGZhbHNlOwp9CgokdG1wRmlsZSA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnJyk7CmlmIChmYWxzZSA9PT0gJHRtcEZpbGUpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+T3BlcmF0aW9uIGZhaWxlZC4nLiRoZWxwTWVzc2FnZS4nPC9lcnJvcj4nKTsKCnJldHVybiBmYWxzZTsKfQokc2NyaXB0ID0gJHRtcEZpbGUuJy52YnMnOwpyZW5hbWUoJHRtcEZpbGUsICRzY3JpcHQpOwoKJGNoZWNrc3VtID0gaGFzaF9maWxlKCdzaGEyNTYnLCAkbmV3RmlsZW5hbWUpOwoKCiRzb3VyY2UgPSBzdHJfcmVwbGFjZSgnLycsICdcXCcsICRuZXdGaWxlbmFtZSk7CiRkZXN0aW5hdGlvbiA9IHN0cl9yZXBsYWNlKCcvJywgJ1xcJywgJGxvY2FsRmlsZW5hbWUpOwoKJHZicyA9IDw8PEVPVApTZXQgVUFDID0gQ3JlYXRlT2JqZWN0KCJTaGVsbC5BcHBsaWNhdGlvbiIpClVBQy5TaGVsbEV4ZWN1dGUgImNtZC5leGUiLCAiL2MgY29weSAvYiAveSAiIiRzb3VyY2UiIiAiIiRkZXN0aW5hdGlvbiIiIiwgIiIsICJydW5hcyIsIDAKV3NjcmlwdC5TbGVlcCgzMDApCkVPVDsKCmZpbGVfcHV0X2NvbnRlbnRzKCRzY3JpcHQsICR2YnMpOwpleGVjKCciJy4kc2NyaXB0LiciJyk7CkB1bmxpbmsoJHNjcmlwdCk7CgoKaWYgKCRyZXN1bHQgPSBGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRsb2NhbEZpbGVuYW1lKSAmJiAoaGFzaF9maWxlKCdzaGEyNTYnLCAkbG9jYWxGaWxlbmFtZSkgPT09ICRjaGVja3N1bSkpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5PcGVyYXRpb24gc3VjY2VlZGVkLjwvaW5mbz4nKTsKQHVubGluaygkbmV3RmlsZW5hbWUpOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5PcGVyYXRpb24gZmFpbGVkLicuJGhlbHBNZXNzYWdlLic8L2Vycm9yPicpOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXERlZmF1bHRQb2xpY3k7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uU2VsZWN0b3I7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2VyUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcRmlsdGVyUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVV0aWxzOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXFNlbXZlcjsKdXNlIENvbXBvc2VyXFNwZHhcU3BkeExpY2Vuc2VzOwp1c2UgQ29tcG9zZXJcVXRpbFxQYWNrYWdlSW5mbzsKdXNlIERhdGVUaW1lSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlclN0eWxlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCgoKCgpjbGFzcyBTaG93Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCgpwcm90ZWN0ZWQgJHZlcnNpb25QYXJzZXI7Cgpwcm90ZWN0ZWQgJGNvbG9yczsKCgpwcml2YXRlICRyZXBvc2l0b3J5U2V0OwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpCnsKJHRoaXMKLT5zZXROYW1lKCdzaG93JykKLT5zZXRBbGlhc2VzKFsnaW5mbyddKQotPnNldERlc2NyaXB0aW9uKCdTaG93cyBpbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdlcycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdQYWNrYWdlIHRvIGluc3BlY3QuIE9yIGEgbmFtZSBpbmNsdWRpbmcgYSB3aWxkY2FyZCAoKikgdG8gZmlsdGVyIGxpc3RzIG9mIHBhY2thZ2VzIGluc3RlYWQuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RQYWNrYWdlQmFzZWRPbk1vZGUoKSksCm5ldyBJbnB1dEFyZ3VtZW50KCd2ZXJzaW9uJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdWZXJzaW9uIG9yIHZlcnNpb24gY29uc3RyYWludCB0byBpbnNwZWN0JyksCm5ldyBJbnB1dE9wdGlvbignYWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IGFsbCBwYWNrYWdlcycpLApuZXcgSW5wdXRPcHRpb24oJ2xvY2tlZCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnTGlzdCBhbGwgbG9ja2VkIHBhY2thZ2VzJyksCm5ldyBJbnB1dE9wdGlvbignaW5zdGFsbGVkJywgJ2knLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0xpc3QgaW5zdGFsbGVkIHBhY2thZ2VzIG9ubHkgKGVuYWJsZWQgYnkgZGVmYXVsdCwgb25seSBwcmVzZW50IGZvciBCQykuJyksCm5ldyBJbnB1dE9wdGlvbigncGxhdGZvcm0nLCAncCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnTGlzdCBwbGF0Zm9ybSBwYWNrYWdlcyBvbmx5JyksCm5ldyBJbnB1dE9wdGlvbignYXZhaWxhYmxlJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0xpc3QgYXZhaWxhYmxlIHBhY2thZ2VzIG9ubHknKSwKbmV3IElucHV0T3B0aW9uKCdzZWxmJywgJ3MnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgdGhlIHJvb3QgcGFja2FnZSBpbmZvcm1hdGlvbicpLApuZXcgSW5wdXRPcHRpb24oJ25hbWUtb25seScsICdOJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IHBhY2thZ2UgbmFtZXMgb25seScpLApuZXcgSW5wdXRPcHRpb24oJ3BhdGgnLCAnUCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBwYWNrYWdlIHBhdGhzJyksCm5ldyBJbnB1dE9wdGlvbigndHJlZScsICd0JywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IHRoZSBkZXBlbmRlbmNpZXMgYXMgYSB0cmVlJyksCm5ldyBJbnB1dE9wdGlvbignbGF0ZXN0JywgJ2wnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgdGhlIGxhdGVzdCB2ZXJzaW9uJyksCm5ldyBJbnB1dE9wdGlvbignb3V0ZGF0ZWQnLCAnbycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyB0aGUgbGF0ZXN0IHZlcnNpb24gYnV0IG9ubHkgZm9yIHBhY2thZ2VzIHRoYXQgYXJlIG91dGRhdGVkJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIHNwZWNpZmllZCBwYWNrYWdlKHMpLiBDYW4gY29udGFpbiB3aWxkY2FyZHMgKCopLiBVc2UgaXQgd2l0aCB0aGUgLS1vdXRkYXRlZCBvcHRpb24gaWYgeW91IGRvblwndCB3YW50IHRvIGJlIGluZm9ybWVkIGFib3V0IG5ldyB2ZXJzaW9ucyBvZiBzb21lIHBhY2thZ2VzLicsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZShmYWxzZSkpLApuZXcgSW5wdXRPcHRpb24oJ21ham9yLW9ubHknLCAnTScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBvbmx5IHBhY2thZ2VzIHRoYXQgaGF2ZSBtYWpvciBTZW1WZXItY29tcGF0aWJsZSB1cGRhdGVzLiBVc2Ugd2l0aCB0aGUgLS1sYXRlc3Qgb3IgLS1vdXRkYXRlZCBvcHRpb24uJyksCm5ldyBJbnB1dE9wdGlvbignbWlub3Itb25seScsICdtJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG9ubHkgcGFja2FnZXMgdGhhdCBoYXZlIG1pbm9yIFNlbVZlci1jb21wYXRpYmxlIHVwZGF0ZXMuIFVzZSB3aXRoIHRoZSAtLWxhdGVzdCBvciAtLW91dGRhdGVkIG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdwYXRjaC1vbmx5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG9ubHkgcGFja2FnZXMgdGhhdCBoYXZlIHBhdGNoIFNlbVZlci1jb21wYXRpYmxlIHVwZGF0ZXMuIFVzZSB3aXRoIHRoZSAtLWxhdGVzdCBvciAtLW91dGRhdGVkIG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdzb3J0LWJ5LWFnZScsICdBJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNwbGF5cyB0aGUgaW5zdGFsbGVkIHZlcnNpb25cJ3MgYWdlLCBhbmQgc29ydHMgcGFja2FnZXMgb2xkZXN0IGZpcnN0LiBVc2Ugd2l0aCB0aGUgLS1sYXRlc3Qgb3IgLS1vdXRkYXRlZCBvcHRpb24uJyksCm5ldyBJbnB1dE9wdGlvbignZGlyZWN0JywgJ0QnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3dzIG9ubHkgcGFja2FnZXMgdGhhdCBhcmUgZGlyZWN0bHkgcmVxdWlyZWQgYnkgdGhlIHJvb3QgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oJ3N0cmljdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmV0dXJuIGEgbm9uLXplcm8gZXhpdCBjb2RlIHdoZW4gdGhlcmUgYXJlIG91dGRhdGVkIHBhY2thZ2VzJyksCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JtYXQgb2YgdGhlIG91dHB1dDogdGV4dCBvciBqc29uJywgJ3RleHQnLCBbJ2pzb24nLCAndGV4dCddKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIHNlYXJjaCBpbiByZXF1aXJlLWRldiBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLiBVc2Ugd2l0aCB0aGUgLS1vdXRkYXRlZCBvcHRpb24nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGFsbCBwbGF0Zm9ybSByZXF1aXJlbWVudHMgKHBocCAmIGV4dC0gcGFja2FnZXMpLiBVc2Ugd2l0aCB0aGUgLS1vdXRkYXRlZCBvcHRpb24nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIHNob3cgY29tbWFuZCBkaXNwbGF5cyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHBhY2thZ2UsIG9yCmxpc3RzIGFsbCBwYWNrYWdlcyBhdmFpbGFibGUuCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNzaG93LWluZm8KRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gc3VnZ2VzdFBhY2thZ2VCYXNlZE9uTW9kZSgpOiBcQ2xvc3VyZQp7CnJldHVybiBmdW5jdGlvbiAoQ29tcGxldGlvbklucHV0ICRpbnB1dCkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2F2YWlsYWJsZScpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdhbGwnKSkgewpyZXR1cm4gJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlSW5jbFBsYXRmb3JtKCkoJGlucHV0KTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdwbGF0Zm9ybScpKSB7CnJldHVybiAkdGhpcy0+c3VnZ2VzdFBsYXRmb3JtUGFja2FnZSgpKCRpbnB1dCk7Cn0KCnJldHVybiAkdGhpcy0+c3VnZ2VzdEluc3RhbGxlZFBhY2thZ2UoZmFsc2UpKCRpbnB1dCk7Cn07Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3RyZWUnKSkgewokdGhpcy0+aW5pdFN0eWxlcygkb3V0cHV0KTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdpbnN0YWxsZWQnKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ3NlbGYnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICJpbnN0YWxsZWQiLiBPbmx5IGluc3RhbGxlZCBwYWNrYWdlcyBhcmUgc2hvd24gYnkgZGVmYXVsdCBub3cuIFRoZSAtLWFsbCBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc2hvdyBhbGwgcGFja2FnZXMuPC93YXJuaW5nPicpOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ291dGRhdGVkJykpIHsKJGlucHV0LT5zZXRPcHRpb24oJ2xhdGVzdCcsIHRydWUpOwp9IGVsc2VpZiAoY291bnQoJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZScpKSA+IDApIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBvcHRpb24gImlnbm9yZSIgZm9yIGFjdGlvbiBvdGhlciB0aGFuICJvdXRkYXRlZCIsIGl0IHdpbGwgYmUgaWdub3JlZC48L3dhcm5pbmc+Jyk7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignZGlyZWN0JykgJiYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdhbGwnKSB8fCAkaW5wdXQtPmdldE9wdGlvbignYXZhaWxhYmxlJykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ3BsYXRmb3JtJykpKSB7CiRpby0+d3JpdGVFcnJvcignVGhlIC0tZGlyZWN0ICgtRCkgb3B0aW9uIGlzIG5vdCB1c2FibGUgaW4gY29tYmluYXRpb24gd2l0aCAtLWFsbCwgLS1wbGF0Zm9ybSAoLXApIG9yIC0tYXZhaWxhYmxlICgtYSknKTsKCnJldHVybiAxOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3RyZWUnKSAmJiAoJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdhdmFpbGFibGUnKSkpIHsKJGlvLT53cml0ZUVycm9yKCdUaGUgLS10cmVlICgtdCkgb3B0aW9uIGlzIG5vdCB1c2FibGUgaW4gY29tYmluYXRpb24gd2l0aCAtLWFsbCBvciAtLWF2YWlsYWJsZSAoLWEpJyk7CgpyZXR1cm4gMTsKfQoKaWYgKGNvdW50KGFycmF5X2ZpbHRlcihbJGlucHV0LT5nZXRPcHRpb24oJ3BhdGNoLW9ubHknKSwgJGlucHV0LT5nZXRPcHRpb24oJ21pbm9yLW9ubHknKSwgJGlucHV0LT5nZXRPcHRpb24oJ21ham9yLW9ubHknKV0pKSA+IDEpIHsKJGlvLT53cml0ZUVycm9yKCdPbmx5IG9uZSBvZiAtLW1ham9yLW9ubHksIC0tbWlub3Itb25seSBvciAtLXBhdGNoLW9ubHkgY2FuIGJlIHVzZWQgYXQgb25jZScpOwoKcmV0dXJuIDE7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigndHJlZScpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCdsYXRlc3QnKSkgewokaW8tPndyaXRlRXJyb3IoJ1RoZSAtLXRyZWUgKC10KSBvcHRpb24gaXMgbm90IHVzYWJsZSBpbiBjb21iaW5hdGlvbiB3aXRoIC0tbGF0ZXN0ICgtbCknKTsKCnJldHVybiAxOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3RyZWUnKSAmJiAkaW5wdXQtPmdldE9wdGlvbigncGF0aCcpKSB7CiRpby0+d3JpdGVFcnJvcignVGhlIC0tdHJlZSAoLXQpIG9wdGlvbiBpcyBub3QgdXNhYmxlIGluIGNvbWJpbmF0aW9uIHdpdGggLS1wYXRoICgtUCknKTsKCnJldHVybiAxOwp9CgokZm9ybWF0ID0gJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpOwppZiAoIWluX2FycmF5KCRmb3JtYXQsIFsndGV4dCcsICdqc29uJ10pKSB7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKCdVbnN1cHBvcnRlZCBmb3JtYXQgIiVzIi4gU2VlIGhlbHAgZm9yIHN1cHBvcnRlZCBmb3JtYXRzLicsICRmb3JtYXQpKTsKCnJldHVybiAxOwp9CgokcGxhdGZvcm1SZXFGaWx0ZXIgPSAkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpOwoKCiRwbGF0Zm9ybU92ZXJyaWRlcyA9IFtdOwppZiAoJGNvbXBvc2VyKSB7CiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgncGxhdGZvcm0nKTsKfQokcGxhdGZvcm1SZXBvID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJHBsYXRmb3JtT3ZlcnJpZGVzKTsKJGxvY2tlZFJlcG8gPSBudWxsOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzZWxmJykgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdpbnN0YWxsZWQnKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ2xvY2tlZCcpKSB7CiRwYWNrYWdlID0gY2xvbmUgJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpLT5nZXRQYWNrYWdlKCk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbmFtZS1vbmx5JykpIHsKJGlvLT53cml0ZSgkcGFja2FnZS0+Z2V0TmFtZSgpKTsKCnJldHVybiAwOwp9CmlmICgkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1lvdSBjYW5ub3QgdXNlIC0tc2VsZiB0b2dldGhlciB3aXRoIGEgcGFja2FnZSBuYW1lJyk7Cn0KJHJlcG9zID0gJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeSgkcGFja2FnZSldKTsKfSBlbHNlaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdwbGF0Zm9ybScpKSB7CiRyZXBvcyA9ICRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRwbGF0Zm9ybVJlcG9dKTsKfSBlbHNlaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdhdmFpbGFibGUnKSkgewokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskcGxhdGZvcm1SZXBvXSk7CmlmICgkY29tcG9zZXIpIHsKJHJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSk7CiRpbnN0YWxsZWRSZXBvLT5hZGRSZXBvc2l0b3J5KCRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCkpOwp9IGVsc2UgewokZGVmYXVsdFJlcG9zID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmRlZmF1bHRSZXBvc1dpdGhEZWZhdWx0TWFuYWdlcigkaW8pOwokcmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkZGVmYXVsdFJlcG9zKTsKJGlvLT53cml0ZUVycm9yKCdObyBjb21wb3Nlci5qc29uIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgc2hvd2luZyBhdmFpbGFibGUgcGFja2FnZXMgZnJvbSAnIC4gaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKCRkZWZhdWx0UmVwb3MpKSk7Cn0KfSBlbHNlaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdhbGwnKSAmJiAkY29tcG9zZXIpIHsKJGxvY2FsUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSkgewokbG9ja2VkUmVwbyA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSk7CiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRsb2NrZWRSZXBvLCAkbG9jYWxSZXBvLCAkcGxhdGZvcm1SZXBvXSk7Cn0gZWxzZSB7CiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRsb2NhbFJlcG8sICRwbGF0Zm9ybVJlcG9dKTsKfQokcmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeShhcnJheV9tZXJnZShbbmV3IEZpbHRlclJlcG9zaXRvcnkoJGluc3RhbGxlZFJlcG8sIFsnY2Fub25pY2FsJyA9PiBmYWxzZV0pXSwgJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSkpOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpKSB7CiRkZWZhdWx0UmVwb3MgPSBSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zV2l0aERlZmF1bHRNYW5hZ2VyKCRpbyk7CiRpby0+d3JpdGVFcnJvcignTm8gY29tcG9zZXIuanNvbiBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIHNob3dpbmcgYXZhaWxhYmxlIHBhY2thZ2VzIGZyb20gJyAuIGltcGxvZGUoJywgJywgYXJyYXlfa2V5cygkZGVmYXVsdFJlcG9zKSkpOwokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskcGxhdGZvcm1SZXBvXSk7CiRyZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KGFycmF5X21lcmdlKFskaW5zdGFsbGVkUmVwb10sICRkZWZhdWx0UmVwb3MpKTsKfSBlbHNlaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsb2NrZWQnKSkgewppZiAoISRjb21wb3NlciB8fCAhJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+aXNMb2NrZWQoKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignQSB2YWxpZCBjb21wb3Nlci5qc29uIGFuZCBjb21wb3Nlci5sb2NrIGZpbGVzIGlzIHJlcXVpcmVkIHRvIHJ1biB0aGlzIGNvbW1hbmQgd2l0aCAtLWxvY2tlZCcpOwp9CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwokbG9ja2VkUmVwbyA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignc2VsZicpKSB7CiRsb2NrZWRSZXBvLT5hZGRQYWNrYWdlKGNsb25lICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpKTsKfQokcmVwb3MgPSAkaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskbG9ja2VkUmVwb10pOwp9IGVsc2UgewoKaWYgKCEkY29tcG9zZXIpIHsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwp9CiRyb290UGtnID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7Cgokcm9vdFJlcG8gPSBuZXcgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5KCk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignc2VsZicpKSB7CiRyb290UmVwbyA9IG5ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoY2xvbmUgJHJvb3RQa2cpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpIHsKJHBhY2thZ2VzID0gUmVwb3NpdG9yeVV0aWxzOjpmaWx0ZXJSZXF1aXJlZFBhY2thZ2VzKCRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCktPmdldFBhY2thZ2VzKCksICRyb290UGtnKTsKJHJlcG9zID0gJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJHJvb3RSZXBvLCBuZXcgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5KGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRwa2cpOiBQYWNrYWdlSW50ZXJmYWNlIHsKcmV0dXJuIGNsb25lICRwa2c7Cn0sICRwYWNrYWdlcykpXSk7Cn0gZWxzZSB7CiRyZXBvcyA9ICRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRyb290UmVwbywgJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKV0pOwp9CgppZiAoISRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpKSB7CiRoYXNOb25QbGF0Zm9ybVJlcXMgPSBzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRyZXFzKTogYm9vbCB7CnJldHVybiAoYm9vbCkgYXJyYXlfZmlsdGVyKGFycmF5X2tleXMoJHJlcXMpLCBmdW5jdGlvbiAoc3RyaW5nICRuYW1lKSB7CnJldHVybiAhUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmFtZSk7Cn0pOwp9OwoKaWYgKCRoYXNOb25QbGF0Zm9ybVJlcXMoJHJvb3RQa2ctPmdldFJlcXVpcmVzKCkpIHx8ICRoYXNOb25QbGF0Zm9ybVJlcXMoJHJvb3RQa2ctPmdldERldlJlcXVpcmVzKCkpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Tm8gZGVwZW5kZW5jaWVzIGluc3RhbGxlZC4gVHJ5IHJ1bm5pbmcgY29tcG9zZXIgaW5zdGFsbCBvciB1cGRhdGUuPC93YXJuaW5nPicpOwp9Cn0KfQoKaWYgKCRjb21wb3NlcikgewokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdzaG93JywgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsYXRlc3QnKSAmJiBudWxsID09PSAkY29tcG9zZXIpIHsKJGlvLT53cml0ZUVycm9yKCdObyBjb21wb3Nlci5qc29uIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgZGlzYWJsaW5nICJsYXRlc3QiIG9wdGlvbicpOwokaW5wdXQtPnNldE9wdGlvbignbGF0ZXN0JywgZmFsc2UpOwp9CgokcGFja2FnZUZpbHRlciA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2UnKTsKCgppZiAoaXNzZXQoJHBhY2thZ2UpKSB7CiR2ZXJzaW9ucyA9IFskcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpID0+ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCldOwp9IGVsc2VpZiAobnVsbCAhPT0gJHBhY2thZ2VGaWx0ZXIgJiYgIXN0cl9jb250YWlucygkcGFja2FnZUZpbHRlciwgJyonKSkgewpbJHBhY2thZ2UsICR2ZXJzaW9uc10gPSAkdGhpcy0+Z2V0UGFja2FnZSgkaW5zdGFsbGVkUmVwbywgJHJlcG9zLCAkcGFja2FnZUZpbHRlciwgJGlucHV0LT5nZXRBcmd1bWVudCgndmVyc2lvbicpKTsKCmlmIChpc3NldCgkcGFja2FnZSkgJiYgJGlucHV0LT5nZXRPcHRpb24oJ2RpcmVjdCcpKSB7CmlmICghaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJHRoaXMtPmdldFJvb3RSZXF1aXJlcygpLCB0cnVlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlLT5nZXROYW1lKCkgLiAnIiBpcyBpbnN0YWxsZWQgYnV0IG5vdCBhIGRpcmVjdCBkZXBlbmRlbnQgb2YgdGhlIHJvb3QgcGFja2FnZS4nKTsKfQp9CgppZiAoIWlzc2V0KCRwYWNrYWdlKSkgewokb3B0aW9ucyA9ICRpbnB1dC0+Z2V0T3B0aW9ucygpOwokaGludCA9ICcnOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xvY2tlZCcpKSB7CiRoaW50IC49ICcgaW4gbG9jayBmaWxlJzsKfQppZiAoaXNzZXQoJG9wdGlvbnNbJ3dvcmtpbmctZGlyJ10pKSB7CiRoaW50IC49ICcgaW4gJyAuICRvcHRpb25zWyd3b3JraW5nLWRpciddIC4gJy9jb21wb3Nlci5qc29uJzsKfQppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZUZpbHRlcikgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdwbGF0Zm9ybScpKSB7CiRoaW50IC49ICcsIHRyeSB1c2luZyAtLXBsYXRmb3JtICgtcCkgdG8gc2hvdyBwbGF0Zm9ybSBwYWNrYWdlcyc7Cn0KaWYgKCEkaW5wdXQtPmdldE9wdGlvbignYWxsJykgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdhdmFpbGFibGUnKSkgewokaGludCAuPSAnLCB0cnkgdXNpbmcgLS1hdmFpbGFibGUgKC1hKSB0byBzaG93IGFsbCBhdmFpbGFibGUgcGFja2FnZXMnOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlRmlsdGVyIC4gJyIgbm90IGZvdW5kJy4kaGludC4nLicpOwp9Cn0KCmlmIChpc3NldCgkcGFja2FnZSkpIHsKYXNzZXJ0KGlzc2V0KCR2ZXJzaW9ucykpOwoKJGV4aXRDb2RlID0gMDsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd0cmVlJykpIHsKJGFycmF5VHJlZSA9ICR0aGlzLT5nZW5lcmF0ZVBhY2thZ2VUcmVlKCRwYWNrYWdlLCAkaW5zdGFsbGVkUmVwbywgJHJlcG9zKTsKCmlmICgnanNvbicgPT09ICRmb3JtYXQpIHsKJGlvLT53cml0ZShKc29uRmlsZTo6ZW5jb2RlKFsnaW5zdGFsbGVkJyA9PiBbJGFycmF5VHJlZV1dKSk7Cn0gZWxzZSB7CiR0aGlzLT5kaXNwbGF5UGFja2FnZVRyZWUoWyRhcnJheVRyZWVdKTsKfQoKcmV0dXJuICRleGl0Q29kZTsKfQoKJGxhdGVzdFBhY2thZ2UgPSBudWxsOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xhdGVzdCcpKSB7CiRsYXRlc3RQYWNrYWdlID0gJHRoaXMtPmZpbmRMYXRlc3RQYWNrYWdlKCRwYWNrYWdlLCAkY29tcG9zZXIsICRwbGF0Zm9ybVJlcG8sICRpbnB1dC0+Z2V0T3B0aW9uKCdtYWpvci1vbmx5JyksICRpbnB1dC0+Z2V0T3B0aW9uKCdtaW5vci1vbmx5JyksICRpbnB1dC0+Z2V0T3B0aW9uKCdwYXRjaC1vbmx5JyksICRwbGF0Zm9ybVJlcUZpbHRlcik7Cn0KaWYgKAokaW5wdXQtPmdldE9wdGlvbignb3V0ZGF0ZWQnKQomJiAkaW5wdXQtPmdldE9wdGlvbignc3RyaWN0JykKJiYgbnVsbCAhPT0gJGxhdGVzdFBhY2thZ2UKJiYgJGxhdGVzdFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgIT09ICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpCiYmICghJGxhdGVzdFBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgfHwgISRsYXRlc3RQYWNrYWdlLT5pc0FiYW5kb25lZCgpKQopIHsKJGV4aXRDb2RlID0gMTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3BhdGgnKSkgewokaW8tPndyaXRlKCRwYWNrYWdlLT5nZXROYW1lKCksIGZhbHNlKTsKJHBhdGggPSAkY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwppZiAoaXNfc3RyaW5nKCRwYXRoKSkgewokaW8tPndyaXRlKCcgJyAuIHN0cnRvayhyZWFscGF0aCgkcGF0aCksICJcclxuIikpOwp9IGVsc2UgewokaW8tPndyaXRlKCcgbnVsbCcpOwp9CgpyZXR1cm4gJGV4aXRDb2RlOwp9CgppZiAoJ2pzb24nID09PSAkZm9ybWF0KSB7CiR0aGlzLT5wcmludFBhY2thZ2VJbmZvQXNKc29uKCRwYWNrYWdlLCAkdmVyc2lvbnMsICRpbnN0YWxsZWRSZXBvLCAkbGF0ZXN0UGFja2FnZSA/OiBudWxsKTsKfSBlbHNlIHsKJHRoaXMtPnByaW50UGFja2FnZUluZm8oJHBhY2thZ2UsICR2ZXJzaW9ucywgJGluc3RhbGxlZFJlcG8sICRsYXRlc3RQYWNrYWdlID86IG51bGwpOwp9CgpyZXR1cm4gJGV4aXRDb2RlOwp9CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd0cmVlJykpIHsKJHJvb3RSZXF1aXJlcyA9ICR0aGlzLT5nZXRSb290UmVxdWlyZXMoKTsKJHBhY2thZ2VzID0gJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCk7CnVzb3J0KCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uIChCYXNlUGFja2FnZSAkYSwgQmFzZVBhY2thZ2UgJGIpOiBpbnQgewpyZXR1cm4gc3RyY21wKChzdHJpbmcpICRhLCAoc3RyaW5nKSAkYik7Cn0pOwokYXJyYXlUcmVlID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJHJvb3RSZXF1aXJlcywgdHJ1ZSkpIHsKJGFycmF5VHJlZVtdID0gJHRoaXMtPmdlbmVyYXRlUGFja2FnZVRyZWUoJHBhY2thZ2UsICRpbnN0YWxsZWRSZXBvLCAkcmVwb3MpOwp9Cn0KCmlmICgnanNvbicgPT09ICRmb3JtYXQpIHsKJGlvLT53cml0ZShKc29uRmlsZTo6ZW5jb2RlKFsnaW5zdGFsbGVkJyA9PiAkYXJyYXlUcmVlXSkpOwp9IGVsc2UgewokdGhpcy0+ZGlzcGxheVBhY2thZ2VUcmVlKCRhcnJheVRyZWUpOwp9CgpyZXR1cm4gMDsKfQoKCgokcGFja2FnZXMgPSBbXTsKJHBhY2thZ2VGaWx0ZXJSZWdleCA9IG51bGw7CmlmIChudWxsICE9PSAkcGFja2FnZUZpbHRlcikgewokcGFja2FnZUZpbHRlclJlZ2V4ID0gJ3teJy5zdHJfcmVwbGFjZSgnXFwqJywgJy4qPycsIHByZWdfcXVvdGUoJHBhY2thZ2VGaWx0ZXIpKS4nJH1pJzsKfQoKJHBhY2thZ2VMaXN0RmlsdGVyID0gbnVsbDsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkaXJlY3QnKSkgewokcGFja2FnZUxpc3RGaWx0ZXIgPSAkdGhpcy0+Z2V0Um9vdFJlcXVpcmVzKCk7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigncGF0aCcpICYmIG51bGwgPT09ICRjb21wb3NlcikgewokaW8tPndyaXRlRXJyb3IoJ05vIGNvbXBvc2VyLmpzb24gZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBkaXNhYmxpbmcgInBhdGgiIG9wdGlvbicpOwokaW5wdXQtPnNldE9wdGlvbigncGF0aCcsIGZhbHNlKTsKfQoKZm9yZWFjaCAoUmVwb3NpdG9yeVV0aWxzOjpmbGF0dGVuUmVwb3NpdG9yaWVzKCRyZXBvcykgYXMgJHJlcG8pIHsKaWYgKCRyZXBvID09PSAkcGxhdGZvcm1SZXBvKSB7CiR0eXBlID0gJ3BsYXRmb3JtJzsKfSBlbHNlaWYgKCRsb2NrZWRSZXBvICE9PSBudWxsICYmICRyZXBvID09PSAkbG9ja2VkUmVwbykgewokdHlwZSA9ICdsb2NrZWQnOwp9IGVsc2VpZiAoJHJlcG8gPT09ICRpbnN0YWxsZWRSZXBvIHx8IGluX2FycmF5KCRyZXBvLCAkaW5zdGFsbGVkUmVwby0+Z2V0UmVwb3NpdG9yaWVzKCksIHRydWUpKSB7CiR0eXBlID0gJ2luc3RhbGxlZCc7Cn0gZWxzZSB7CiR0eXBlID0gJ2F2YWlsYWJsZSc7Cn0KaWYgKCRyZXBvIGluc3RhbmNlb2YgQ29tcG9zZXJSZXBvc2l0b3J5KSB7CmZvcmVhY2ggKCRyZXBvLT5nZXRQYWNrYWdlTmFtZXMoJHBhY2thZ2VGaWx0ZXIpIGFzICRuYW1lKSB7CiRwYWNrYWdlc1skdHlwZV1bJG5hbWVdID0gJG5hbWU7Cn0KfSBlbHNlIHsKZm9yZWFjaCAoJHJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCFpc3NldCgkcGFja2FnZXNbJHR5cGVdWyRwYWNrYWdlLT5nZXROYW1lKCldKQp8fCAhaXNfb2JqZWN0KCRwYWNrYWdlc1skdHlwZV1bJHBhY2thZ2UtPmdldE5hbWUoKV0pCnx8IHZlcnNpb25fY29tcGFyZSgkcGFja2FnZXNbJHR5cGVdWyRwYWNrYWdlLT5nZXROYW1lKCldLT5nZXRWZXJzaW9uKCksICRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICc8JykKKSB7CndoaWxlICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KaWYgKCEkcGFja2FnZUZpbHRlclJlZ2V4IHx8IFByZWc6OmlzTWF0Y2goJHBhY2thZ2VGaWx0ZXJSZWdleCwgJHBhY2thZ2UtPmdldE5hbWUoKSkpIHsKaWYgKG51bGwgPT09ICRwYWNrYWdlTGlzdEZpbHRlciB8fCBpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkcGFja2FnZUxpc3RGaWx0ZXIsIHRydWUpKSB7CiRwYWNrYWdlc1skdHlwZV1bJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkcGFja2FnZTsKfQp9Cn0KfQppZiAoJHJlcG8gPT09ICRwbGF0Zm9ybVJlcG8pIHsKZm9yZWFjaCAoJHBsYXRmb3JtUmVwby0+Z2V0RGlzYWJsZWRQYWNrYWdlcygpIGFzICRuYW1lID0+ICRwYWNrYWdlKSB7CiRwYWNrYWdlc1skdHlwZV1bJG5hbWVdID0gJHBhY2thZ2U7Cn0KfQp9Cn0KCiRzaG93QWxsVHlwZXMgPSAkaW5wdXQtPmdldE9wdGlvbignYWxsJyk7CiRzaG93TGF0ZXN0ID0gJGlucHV0LT5nZXRPcHRpb24oJ2xhdGVzdCcpOwokc2hvd01ham9yT25seSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdtYWpvci1vbmx5Jyk7CiRzaG93TWlub3JPbmx5ID0gJGlucHV0LT5nZXRPcHRpb24oJ21pbm9yLW9ubHknKTsKJHNob3dQYXRjaE9ubHkgPSAkaW5wdXQtPmdldE9wdGlvbigncGF0Y2gtb25seScpOwokaWdub3JlZFBhY2thZ2VzUmVnZXggPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoYXJyYXlfbWFwKCdzdHJ0b2xvd2VyJywgJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZScpKSk7CiRpbmRlbnQgPSAkc2hvd0FsbFR5cGVzID8gJyAgJyA6ICcnOwoKJGxhdGVzdFBhY2thZ2VzID0gW107CiRleGl0Q29kZSA9IDA7CiR2aWV3RGF0YSA9IFtdOwokdmlld01ldGFEYXRhID0gW107Cgokd3JpdGVWZXJzaW9uID0gZmFsc2U7CiR3cml0ZURlc2NyaXB0aW9uID0gZmFsc2U7Cgpmb3JlYWNoIChbJ3BsYXRmb3JtJyA9PiB0cnVlLCAnbG9ja2VkJyA9PiB0cnVlLCAnYXZhaWxhYmxlJyA9PiBmYWxzZSwgJ2luc3RhbGxlZCcgPT4gdHJ1ZV0gYXMgJHR5cGUgPT4gJHNob3dWZXJzaW9uKSB7CmlmIChpc3NldCgkcGFja2FnZXNbJHR5cGVdKSkgewprc29ydCgkcGFja2FnZXNbJHR5cGVdKTsKCiRuYW1lTGVuZ3RoID0gJHZlcnNpb25MZW5ndGggPSAkbGF0ZXN0TGVuZ3RoID0gJHJlbGVhc2VEYXRlTGVuZ3RoID0gMDsKCmlmICgkc2hvd0xhdGVzdCAmJiAkc2hvd1ZlcnNpb24pIHsKZm9yZWFjaCAoJHBhY2thZ2VzWyR0eXBlXSBhcyAkcGFja2FnZSkgewppZiAoaXNfb2JqZWN0KCRwYWNrYWdlKSAmJiAhUHJlZzo6aXNNYXRjaCgkaWdub3JlZFBhY2thZ2VzUmVnZXgsICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkpKSB7CiRsYXRlc3RQYWNrYWdlID0gJHRoaXMtPmZpbmRMYXRlc3RQYWNrYWdlKCRwYWNrYWdlLCAkY29tcG9zZXIsICRwbGF0Zm9ybVJlcG8sICRzaG93TWFqb3JPbmx5LCAkc2hvd01pbm9yT25seSwgJHNob3dQYXRjaE9ubHksICRwbGF0Zm9ybVJlcUZpbHRlcik7CmlmICgkbGF0ZXN0UGFja2FnZSA9PT0gbnVsbCkgewpjb250aW51ZTsKfQoKJGxhdGVzdFBhY2thZ2VzWyRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCldID0gJGxhdGVzdFBhY2thZ2U7Cn0KfQp9Cgokd3JpdGVQYXRoID0gISRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lLW9ubHknKSAmJiAkaW5wdXQtPmdldE9wdGlvbigncGF0aCcpOwokd3JpdGVWZXJzaW9uID0gISRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lLW9ubHknKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ3BhdGgnKSAmJiAkc2hvd1ZlcnNpb247CiR3cml0ZUxhdGVzdCA9ICR3cml0ZVZlcnNpb24gJiYgJHNob3dMYXRlc3Q7CiR3cml0ZURlc2NyaXB0aW9uID0gISRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lLW9ubHknKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ3BhdGgnKTsKJHdyaXRlUmVsZWFzZURhdGUgPSAkd3JpdGVMYXRlc3QgJiYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzb3J0LWJ5LWFnZScpIHx8ICRmb3JtYXQgPT09ICdqc29uJyk7CgokaGFzT3V0ZGF0ZWRQYWNrYWdlcyA9IGZhbHNlOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzb3J0LWJ5LWFnZScpKSB7CnVzb3J0KCRwYWNrYWdlc1skdHlwZV0sIGZ1bmN0aW9uICgkYSwgJGIpIHsKaWYgKGlzX29iamVjdCgkYSkgJiYgaXNfb2JqZWN0KCRiKSkgewpyZXR1cm4gJGEtPmdldFJlbGVhc2VEYXRlKCkgPD0+ICRiLT5nZXRSZWxlYXNlRGF0ZSgpOwp9CgpyZXR1cm4gMDsKfSk7Cn0KCiR2aWV3RGF0YVskdHlwZV0gPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzWyR0eXBlXSBhcyAkcGFja2FnZSkgewokcGFja2FnZVZpZXdEYXRhID0gW107CmlmIChpc19vYmplY3QoJHBhY2thZ2UpKSB7CiRsYXRlc3RQYWNrYWdlID0gbnVsbDsKaWYgKCRzaG93TGF0ZXN0ICYmIGlzc2V0KCRsYXRlc3RQYWNrYWdlc1skcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpXSkpIHsKJGxhdGVzdFBhY2thZ2UgPSAkbGF0ZXN0UGFja2FnZXNbJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKV07Cn0KCgokcGFja2FnZUlzVXBUb0RhdGUgPSAkbGF0ZXN0UGFja2FnZSAmJiAkbGF0ZXN0UGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKSA9PT0gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgJiYgKCEkbGF0ZXN0UGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSB8fCAhJGxhdGVzdFBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpOwoKJHBhY2thZ2VJc1VwVG9EYXRlID0gJHBhY2thZ2VJc1VwVG9EYXRlIHx8ICgkbGF0ZXN0UGFja2FnZSA9PT0gbnVsbCAmJiAkc2hvd01ham9yT25seSk7CiRwYWNrYWdlSXNJZ25vcmVkID0gUHJlZzo6aXNNYXRjaCgkaWdub3JlZFBhY2thZ2VzUmVnZXgsICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ291dGRhdGVkJykgJiYgKCRwYWNrYWdlSXNVcFRvRGF0ZSB8fCAkcGFja2FnZUlzSWdub3JlZCkpIHsKY29udGludWU7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignb3V0ZGF0ZWQnKSB8fCAkaW5wdXQtPmdldE9wdGlvbignc3RyaWN0JykpIHsKJGhhc091dGRhdGVkUGFja2FnZXMgPSB0cnVlOwp9CgokcGFja2FnZVZpZXdEYXRhWyduYW1lJ10gPSAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwokcGFja2FnZVZpZXdEYXRhWydkaXJlY3QtZGVwZW5kZW5jeSddID0gaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJHRoaXMtPmdldFJvb3RSZXF1aXJlcygpLCB0cnVlKTsKaWYgKCRmb3JtYXQgIT09ICdqc29uJyB8fCB0cnVlICE9PSAkaW5wdXQtPmdldE9wdGlvbignbmFtZS1vbmx5JykpIHsKJHBhY2thZ2VWaWV3RGF0YVsnaG9tZXBhZ2UnXSA9ICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJHBhY2thZ2UtPmdldEhvbWVwYWdlKCkgOiBudWxsOwokcGFja2FnZVZpZXdEYXRhWydzb3VyY2UnXSA9IFBhY2thZ2VJbmZvOjpnZXRWaWV3U291cmNlVXJsKCRwYWNrYWdlKTsKfQokbmFtZUxlbmd0aCA9IG1heCgkbmFtZUxlbmd0aCwgc3RybGVuKCRwYWNrYWdlVmlld0RhdGFbJ25hbWUnXSkpOwppZiAoJHdyaXRlVmVyc2lvbikgewokcGFja2FnZVZpZXdEYXRhWyd2ZXJzaW9uJ10gPSAkcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKTsKaWYgKCRmb3JtYXQgPT09ICd0ZXh0JykgewokcGFja2FnZVZpZXdEYXRhWyd2ZXJzaW9uJ10gPSBsdHJpbSgkcGFja2FnZVZpZXdEYXRhWyd2ZXJzaW9uJ10sICd2Jyk7Cn0KJHZlcnNpb25MZW5ndGggPSBtYXgoJHZlcnNpb25MZW5ndGgsIHN0cmxlbigkcGFja2FnZVZpZXdEYXRhWyd2ZXJzaW9uJ10pKTsKfQppZiAoJHdyaXRlUmVsZWFzZURhdGUpIHsKaWYgKCRwYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpICE9PSBudWxsKSB7CiRwYWNrYWdlVmlld0RhdGFbJ3JlbGVhc2UtYWdlJ10gPSBzdHJfcmVwbGFjZSgnIGFnbycsICcgb2xkJywgJHRoaXMtPmdldFJlbGF0aXZlVGltZSgkcGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSkpOwppZiAoIXN0cl9jb250YWlucygkcGFja2FnZVZpZXdEYXRhWydyZWxlYXNlLWFnZSddLCAnIG9sZCcpKSB7CiRwYWNrYWdlVmlld0RhdGFbJ3JlbGVhc2UtYWdlJ10gPSAnZnJvbSAnLiRwYWNrYWdlVmlld0RhdGFbJ3JlbGVhc2UtYWdlJ107Cn0KJHJlbGVhc2VEYXRlTGVuZ3RoID0gbWF4KCRyZWxlYXNlRGF0ZUxlbmd0aCwgc3RybGVuKCRwYWNrYWdlVmlld0RhdGFbJ3JlbGVhc2UtYWdlJ10pKTsKJHBhY2thZ2VWaWV3RGF0YVsncmVsZWFzZS1kYXRlJ10gPSAkcGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKS0+Zm9ybWF0KERhdGVUaW1lSW50ZXJmYWNlOjpBVE9NKTsKfSBlbHNlIHsKJHBhY2thZ2VWaWV3RGF0YVsncmVsZWFzZS1hZ2UnXSA9ICcnOwokcGFja2FnZVZpZXdEYXRhWydyZWxlYXNlLWRhdGUnXSA9ICcnOwp9Cn0KaWYgKCR3cml0ZUxhdGVzdCAmJiAkbGF0ZXN0UGFja2FnZSkgewokcGFja2FnZVZpZXdEYXRhWydsYXRlc3QnXSA9ICRsYXRlc3RQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpOwppZiAoJGZvcm1hdCA9PT0gJ3RleHQnKSB7CiRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdCddID0gbHRyaW0oJHBhY2thZ2VWaWV3RGF0YVsnbGF0ZXN0J10sICd2Jyk7Cn0KJHBhY2thZ2VWaWV3RGF0YVsnbGF0ZXN0LXN0YXR1cyddID0gJHRoaXMtPmdldFVwZGF0ZVN0YXR1cygkbGF0ZXN0UGFja2FnZSwgJHBhY2thZ2UpOwokbGF0ZXN0TGVuZ3RoID0gbWF4KCRsYXRlc3RMZW5ndGgsIHN0cmxlbigkcGFja2FnZVZpZXdEYXRhWydsYXRlc3QnXSkpOwoKaWYgKCRsYXRlc3RQYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpICE9PSBudWxsKSB7CiRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdC1yZWxlYXNlLWRhdGUnXSA9ICRsYXRlc3RQYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpLT5mb3JtYXQoRGF0ZVRpbWVJbnRlcmZhY2U6OkFUT00pOwp9IGVsc2UgewokcGFja2FnZVZpZXdEYXRhWydsYXRlc3QtcmVsZWFzZS1kYXRlJ10gPSAnJzsKfQp9IGVsc2VpZiAoJHdyaXRlTGF0ZXN0KSB7CiRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdCddID0gJ1tub25lIG1hdGNoZWRdJzsKJHBhY2thZ2VWaWV3RGF0YVsnbGF0ZXN0LXN0YXR1cyddID0gJ3VwLXRvLWRhdGUnOwokbGF0ZXN0TGVuZ3RoID0gbWF4KCRsYXRlc3RMZW5ndGgsIHN0cmxlbigkcGFja2FnZVZpZXdEYXRhWydsYXRlc3QnXSkpOwp9CmlmICgkd3JpdGVEZXNjcmlwdGlvbiAmJiAkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSkgewokcGFja2FnZVZpZXdEYXRhWydkZXNjcmlwdGlvbiddID0gJHBhY2thZ2UtPmdldERlc2NyaXB0aW9uKCk7Cn0KaWYgKCR3cml0ZVBhdGgpIHsKJHBhdGggPSAkY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwppZiAoaXNfc3RyaW5nKCRwYXRoKSkgewokcGFja2FnZVZpZXdEYXRhWydwYXRoJ10gPSBzdHJ0b2socmVhbHBhdGgoJHBhdGgpLCAiXHJcbiIpOwp9IGVsc2UgewokcGFja2FnZVZpZXdEYXRhWydwYXRoJ10gPSBudWxsOwp9Cn0KCiRwYWNrYWdlSXNBYmFuZG9uZWQgPSBmYWxzZTsKaWYgKCRsYXRlc3RQYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmICRsYXRlc3RQYWNrYWdlLT5pc0FiYW5kb25lZCgpKSB7CiRyZXBsYWNlbWVudFBhY2thZ2VOYW1lID0gJGxhdGVzdFBhY2thZ2UtPmdldFJlcGxhY2VtZW50UGFja2FnZSgpOwokcmVwbGFjZW1lbnQgPSAkcmVwbGFjZW1lbnRQYWNrYWdlTmFtZSAhPT0gbnVsbAo/ICdVc2UgJyAuICRsYXRlc3RQYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKSAuICcgaW5zdGVhZCcKOiAnTm8gcmVwbGFjZW1lbnQgd2FzIHN1Z2dlc3RlZCc7CiRwYWNrYWdlV2FybmluZyA9IHNwcmludGYoCidQYWNrYWdlICVzIGlzIGFiYW5kb25lZCwgeW91IHNob3VsZCBhdm9pZCB1c2luZyBpdC4gJXMuJywKJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSwKJHJlcGxhY2VtZW50Cik7CiRwYWNrYWdlVmlld0RhdGFbJ3dhcm5pbmcnXSA9ICRwYWNrYWdlV2FybmluZzsKJHBhY2thZ2VJc0FiYW5kb25lZCA9ICRyZXBsYWNlbWVudFBhY2thZ2VOYW1lID8/IHRydWU7Cn0KCiRwYWNrYWdlVmlld0RhdGFbJ2FiYW5kb25lZCddID0gJHBhY2thZ2VJc0FiYW5kb25lZDsKfSBlbHNlIHsKJHBhY2thZ2VWaWV3RGF0YVsnbmFtZSddID0gJHBhY2thZ2U7CiRuYW1lTGVuZ3RoID0gbWF4KCRuYW1lTGVuZ3RoLCBzdHJsZW4oJHBhY2thZ2UpKTsKfQokdmlld0RhdGFbJHR5cGVdW10gPSAkcGFja2FnZVZpZXdEYXRhOwp9CiR2aWV3TWV0YURhdGFbJHR5cGVdID0gWwonbmFtZUxlbmd0aCcgPT4gJG5hbWVMZW5ndGgsCid2ZXJzaW9uTGVuZ3RoJyA9PiAkdmVyc2lvbkxlbmd0aCwKJ2xhdGVzdExlbmd0aCcgPT4gJGxhdGVzdExlbmd0aCwKJ3JlbGVhc2VEYXRlTGVuZ3RoJyA9PiAkcmVsZWFzZURhdGVMZW5ndGgsCid3cml0ZUxhdGVzdCcgPT4gJHdyaXRlTGF0ZXN0LAond3JpdGVSZWxlYXNlRGF0ZScgPT4gJHdyaXRlUmVsZWFzZURhdGUsCl07CmlmICgkaW5wdXQtPmdldE9wdGlvbignc3RyaWN0JykgJiYgJGhhc091dGRhdGVkUGFja2FnZXMpIHsKJGV4aXRDb2RlID0gMTsKYnJlYWs7Cn0KfQp9CgppZiAoJ2pzb24nID09PSAkZm9ybWF0KSB7CiRpby0+d3JpdGUoSnNvbkZpbGU6OmVuY29kZSgkdmlld0RhdGEpKTsKfSBlbHNlIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsYXRlc3QnKSAmJiBhcnJheV9maWx0ZXIoJHZpZXdEYXRhKSkgewppZiAoISRpby0+aXNEZWNvcmF0ZWQoKSkgewokaW8tPndyaXRlRXJyb3IoJ0xlZ2VuZDonKTsKJGlvLT53cml0ZUVycm9yKCchIHBhdGNoIG9yIG1pbm9yIHJlbGVhc2UgYXZhaWxhYmxlIC0gdXBkYXRlIHJlY29tbWVuZGVkJyk7CiRpby0+d3JpdGVFcnJvcignfiBtYWpvciByZWxlYXNlIGF2YWlsYWJsZSAtIHVwZGF0ZSBwb3NzaWJsZScpOwppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCdvdXRkYXRlZCcpKSB7CiRpby0+d3JpdGVFcnJvcignPSB1cCB0byBkYXRlIHZlcnNpb24nKTsKfQp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkNvbG9yIGxlZ2VuZDo8L2luZm8+Jyk7CiRpby0+d3JpdGVFcnJvcignLSA8aGlnaGxpZ2h0PnBhdGNoIG9yIG1pbm9yPC9oaWdobGlnaHQ+IHJlbGVhc2UgYXZhaWxhYmxlIC0gdXBkYXRlIHJlY29tbWVuZGVkJyk7CiRpby0+d3JpdGVFcnJvcignLSA8Y29tbWVudD5tYWpvcjwvY29tbWVudD4gcmVsZWFzZSBhdmFpbGFibGUgLSB1cGRhdGUgcG9zc2libGUnKTsKaWYgKCEkaW5wdXQtPmdldE9wdGlvbignb3V0ZGF0ZWQnKSkgewokaW8tPndyaXRlRXJyb3IoJy0gPGluZm8+dXAgdG8gZGF0ZTwvaW5mbz4gdmVyc2lvbicpOwp9Cn0KfQoKJHdpZHRoID0gJHRoaXMtPmdldFRlcm1pbmFsV2lkdGgoKTsKCmZvcmVhY2ggKCR2aWV3RGF0YSBhcyAkdHlwZSA9PiAkcGFja2FnZXMpIHsKJG5hbWVMZW5ndGggPSAkdmlld01ldGFEYXRhWyR0eXBlXVsnbmFtZUxlbmd0aCddOwokdmVyc2lvbkxlbmd0aCA9ICR2aWV3TWV0YURhdGFbJHR5cGVdWyd2ZXJzaW9uTGVuZ3RoJ107CiRsYXRlc3RMZW5ndGggPSAkdmlld01ldGFEYXRhWyR0eXBlXVsnbGF0ZXN0TGVuZ3RoJ107CiRyZWxlYXNlRGF0ZUxlbmd0aCA9ICR2aWV3TWV0YURhdGFbJHR5cGVdWydyZWxlYXNlRGF0ZUxlbmd0aCddOwokd3JpdGVMYXRlc3QgPSAkdmlld01ldGFEYXRhWyR0eXBlXVsnd3JpdGVMYXRlc3QnXTsKJHdyaXRlUmVsZWFzZURhdGUgPSAkdmlld01ldGFEYXRhWyR0eXBlXVsnd3JpdGVSZWxlYXNlRGF0ZSddOwoKJHZlcnNpb25GaXRzID0gJG5hbWVMZW5ndGggKyAkdmVyc2lvbkxlbmd0aCArIDMgPD0gJHdpZHRoOwokbGF0ZXN0Rml0cyA9ICRuYW1lTGVuZ3RoICsgJHZlcnNpb25MZW5ndGggKyAkbGF0ZXN0TGVuZ3RoICsgMyA8PSAkd2lkdGg7CiRyZWxlYXNlRGF0ZUZpdHMgPSAkbmFtZUxlbmd0aCArICR2ZXJzaW9uTGVuZ3RoICsgJGxhdGVzdExlbmd0aCArICRyZWxlYXNlRGF0ZUxlbmd0aCArIDMgPD0gJHdpZHRoOwokZGVzY3JpcHRpb25GaXRzID0gJG5hbWVMZW5ndGggKyAkdmVyc2lvbkxlbmd0aCArICRsYXRlc3RMZW5ndGggKyAkcmVsZWFzZURhdGVMZW5ndGggKyAyNCA8PSAkd2lkdGg7CgppZiAoJGxhdGVzdEZpdHMgJiYgISRpby0+aXNEZWNvcmF0ZWQoKSkgewokbGF0ZXN0TGVuZ3RoICs9IDI7Cn0KCmlmICgkc2hvd0FsbFR5cGVzKSB7CmlmICgnYXZhaWxhYmxlJyA9PT0gJHR5cGUpIHsKJGlvLT53cml0ZSgnPGNvbW1lbnQ+JyAuICR0eXBlIC4gJzwvY29tbWVudD46Jyk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJzxpbmZvPicgLiAkdHlwZSAuICc8L2luZm8+OicpOwp9Cn0KCmlmICgkd3JpdGVMYXRlc3QgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdkaXJlY3QnKSkgewokZGlyZWN0RGVwcyA9IFtdOwokdHJhbnNpdGl2ZURlcHMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwa2cpIHsKaWYgKCRwa2dbJ2RpcmVjdC1kZXBlbmRlbmN5J10gPz8gZmFsc2UpIHsKJGRpcmVjdERlcHNbXSA9ICRwa2c7Cn0gZWxzZSB7CiR0cmFuc2l0aXZlRGVwc1tdID0gJHBrZzsKfQp9CgokaW8tPndyaXRlRXJyb3IoJycpOwokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkRpcmVjdCBkZXBlbmRlbmNpZXMgcmVxdWlyZWQgaW4gY29tcG9zZXIuanNvbjo8Lz4nKTsKaWYgKFxjb3VudCgkZGlyZWN0RGVwcykgPiAwKSB7CiR0aGlzLT5wcmludFBhY2thZ2VzKCRpbywgJGRpcmVjdERlcHMsICRpbmRlbnQsICR3cml0ZVZlcnNpb24gJiYgJHZlcnNpb25GaXRzLCAkbGF0ZXN0Rml0cywgJHdyaXRlRGVzY3JpcHRpb24gJiYgJGRlc2NyaXB0aW9uRml0cywgJHdpZHRoLCAkdmVyc2lvbkxlbmd0aCwgJG5hbWVMZW5ndGgsICRsYXRlc3RMZW5ndGgsICR3cml0ZVJlbGVhc2VEYXRlICYmICRyZWxlYXNlRGF0ZUZpdHMsICRyZWxlYXNlRGF0ZUxlbmd0aCk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignRXZlcnl0aGluZyB1cCB0byBkYXRlJyk7Cn0KJGlvLT53cml0ZUVycm9yKCcnKTsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5UcmFuc2l0aXZlIGRlcGVuZGVuY2llcyBub3QgcmVxdWlyZWQgaW4gY29tcG9zZXIuanNvbjo8Lz4nKTsKaWYgKFxjb3VudCgkdHJhbnNpdGl2ZURlcHMpID4gMCkgewokdGhpcy0+cHJpbnRQYWNrYWdlcygkaW8sICR0cmFuc2l0aXZlRGVwcywgJGluZGVudCwgJHdyaXRlVmVyc2lvbiAmJiAkdmVyc2lvbkZpdHMsICRsYXRlc3RGaXRzLCAkd3JpdGVEZXNjcmlwdGlvbiAmJiAkZGVzY3JpcHRpb25GaXRzLCAkd2lkdGgsICR2ZXJzaW9uTGVuZ3RoLCAkbmFtZUxlbmd0aCwgJGxhdGVzdExlbmd0aCwgJHdyaXRlUmVsZWFzZURhdGUgJiYgJHJlbGVhc2VEYXRlRml0cywgJHJlbGVhc2VEYXRlTGVuZ3RoKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCdFdmVyeXRoaW5nIHVwIHRvIGRhdGUnKTsKfQp9IGVsc2UgewppZiAoJHdyaXRlTGF0ZXN0ICYmIFxjb3VudCgkcGFja2FnZXMpID09PSAwKSB7CiRpby0+d3JpdGVFcnJvcignQWxsIHlvdXIgZGlyZWN0IGRlcGVuZGVuY2llcyBhcmUgdXAgdG8gZGF0ZScpOwp9IGVsc2UgewokdGhpcy0+cHJpbnRQYWNrYWdlcygkaW8sICRwYWNrYWdlcywgJGluZGVudCwgJHdyaXRlVmVyc2lvbiAmJiAkdmVyc2lvbkZpdHMsICR3cml0ZUxhdGVzdCAmJiAkbGF0ZXN0Rml0cywgJHdyaXRlRGVzY3JpcHRpb24gJiYgJGRlc2NyaXB0aW9uRml0cywgJHdpZHRoLCAkdmVyc2lvbkxlbmd0aCwgJG5hbWVMZW5ndGgsICRsYXRlc3RMZW5ndGgsICR3cml0ZVJlbGVhc2VEYXRlICYmICRyZWxlYXNlRGF0ZUZpdHMsICRyZWxlYXNlRGF0ZUxlbmd0aCk7Cn0KfQoKaWYgKCRzaG93QWxsVHlwZXMpIHsKJGlvLT53cml0ZSgnJyk7Cn0KfQp9CgpyZXR1cm4gJGV4aXRDb2RlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHByaW50UGFja2FnZXMoSU9JbnRlcmZhY2UgJGlvLCBhcnJheSAkcGFja2FnZXMsIHN0cmluZyAkaW5kZW50LCBib29sICR3cml0ZVZlcnNpb24sIGJvb2wgJHdyaXRlTGF0ZXN0LCBib29sICR3cml0ZURlc2NyaXB0aW9uLCBpbnQgJHdpZHRoLCBpbnQgJHZlcnNpb25MZW5ndGgsIGludCAkbmFtZUxlbmd0aCwgaW50ICRsYXRlc3RMZW5ndGgsIGJvb2wgJHdyaXRlUmVsZWFzZURhdGUsIGludCAkcmVsZWFzZURhdGVMZW5ndGgpOiB2b2lkCnsKJHBhZE5hbWUgPSAkd3JpdGVWZXJzaW9uIHx8ICR3cml0ZUxhdGVzdCB8fCAkd3JpdGVSZWxlYXNlRGF0ZSB8fCAkd3JpdGVEZXNjcmlwdGlvbjsKJHBhZFZlcnNpb24gPSAkd3JpdGVMYXRlc3QgfHwgJHdyaXRlUmVsZWFzZURhdGUgfHwgJHdyaXRlRGVzY3JpcHRpb247CiRwYWRMYXRlc3QgPSAkd3JpdGVEZXNjcmlwdGlvbiB8fCAkd3JpdGVSZWxlYXNlRGF0ZTsKJHBhZFJlbGVhc2VEYXRlID0gJHdyaXRlRGVzY3JpcHRpb247CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokbGluayA9ICRwYWNrYWdlWydzb3VyY2UnXSA/PyAkcGFja2FnZVsnaG9tZXBhZ2UnXSA/PyAnJzsKaWYgKCRsaW5rICE9PSAnJykgewokaW8tPndyaXRlKCRpbmRlbnQgLiAnPGhyZWY9Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkbGluaykuJz4nLiRwYWNrYWdlWyduYW1lJ10uJzwvPicuIHN0cl9yZXBlYXQoJyAnLCAoJHBhZE5hbWUgPyAkbmFtZUxlbmd0aCAtIHN0cmxlbigkcGFja2FnZVsnbmFtZSddKSA6IDApKSwgZmFsc2UpOwp9IGVsc2UgewokaW8tPndyaXRlKCRpbmRlbnQgLiBzdHJfcGFkKCRwYWNrYWdlWyduYW1lJ10sICgkcGFkTmFtZSA/ICRuYW1lTGVuZ3RoIDogMCksICcgJyksIGZhbHNlKTsKfQppZiAoaXNzZXQoJHBhY2thZ2VbJ3ZlcnNpb24nXSkgJiYgJHdyaXRlVmVyc2lvbikgewokaW8tPndyaXRlKCcgJyAuIHN0cl9wYWQoJHBhY2thZ2VbJ3ZlcnNpb24nXSwgKCRwYWRWZXJzaW9uID8gJHZlcnNpb25MZW5ndGggOiAwKSwgJyAnKSwgZmFsc2UpOwp9CmlmIChpc3NldCgkcGFja2FnZVsnbGF0ZXN0J10pICYmIGlzc2V0KCRwYWNrYWdlWydsYXRlc3Qtc3RhdHVzJ10pICYmICR3cml0ZUxhdGVzdCkgewokbGF0ZXN0VmVyc2lvbiA9ICRwYWNrYWdlWydsYXRlc3QnXTsKJHVwZGF0ZVN0YXR1cyA9ICRwYWNrYWdlWydsYXRlc3Qtc3RhdHVzJ107CiRzdHlsZSA9ICR0aGlzLT51cGRhdGVTdGF0dXNUb1ZlcnNpb25TdHlsZSgkdXBkYXRlU3RhdHVzKTsKaWYgKCEkaW8tPmlzRGVjb3JhdGVkKCkpIHsKJGxhdGVzdFZlcnNpb24gPSBzdHJfcmVwbGFjZShbJ3VwLXRvLWRhdGUnLCAnc2VtdmVyLXNhZmUtdXBkYXRlJywgJ3VwZGF0ZS1wb3NzaWJsZSddLCBbJz0nLCAnIScsICd+J10sICR1cGRhdGVTdGF0dXMpIC4gJyAnIC4gJGxhdGVzdFZlcnNpb247Cn0KJGlvLT53cml0ZSgnIDwnIC4gJHN0eWxlIC4gJz4nIC4gc3RyX3BhZCgkbGF0ZXN0VmVyc2lvbiwgKCRwYWRMYXRlc3QgPyAkbGF0ZXN0TGVuZ3RoIDogMCksICcgJykgLiAnPC8nIC4gJHN0eWxlIC4gJz4nLCBmYWxzZSk7CmlmICgkd3JpdGVSZWxlYXNlRGF0ZSAmJiBpc3NldCgkcGFja2FnZVsncmVsZWFzZS1hZ2UnXSkpIHsKJGlvLT53cml0ZSgnICcuc3RyX3BhZCgkcGFja2FnZVsncmVsZWFzZS1hZ2UnXSwgKCRwYWRSZWxlYXNlRGF0ZSA/ICRyZWxlYXNlRGF0ZUxlbmd0aCA6IDApLCAnICcpLCBmYWxzZSk7Cn0KfQppZiAoaXNzZXQoJHBhY2thZ2VbJ2Rlc2NyaXB0aW9uJ10pICYmICR3cml0ZURlc2NyaXB0aW9uKSB7CiRkZXNjcmlwdGlvbiA9IHN0cnRvaygkcGFja2FnZVsnZGVzY3JpcHRpb24nXSwgIlxyXG4iKTsKJHJlbWFpbmluZyA9ICR3aWR0aCAtICRuYW1lTGVuZ3RoIC0gJHZlcnNpb25MZW5ndGggLSAkcmVsZWFzZURhdGVMZW5ndGggLSA0OwppZiAoJHdyaXRlTGF0ZXN0KSB7CiRyZW1haW5pbmcgLT0gJGxhdGVzdExlbmd0aDsKfQppZiAoc3RybGVuKCRkZXNjcmlwdGlvbikgPiAkcmVtYWluaW5nKSB7CiRkZXNjcmlwdGlvbiA9IHN1YnN0cigkZGVzY3JpcHRpb24sIDAsICRyZW1haW5pbmcgLSAzKSAuICcuLi4nOwp9CiRpby0+d3JpdGUoJyAnIC4gJGRlc2NyaXB0aW9uLCBmYWxzZSk7Cn0KaWYgKGFycmF5X2tleV9leGlzdHMoJ3BhdGgnLCAkcGFja2FnZSkpIHsKJGlvLT53cml0ZSgnICcuKGlzX3N0cmluZygkcGFja2FnZVsncGF0aCddKSA/ICRwYWNrYWdlWydwYXRoJ10gOiAnbnVsbCcpLCBmYWxzZSk7Cn0KJGlvLT53cml0ZSgnJyk7CmlmIChpc3NldCgkcGFja2FnZVsnd2FybmluZyddKSkgewokaW8tPndyaXRlKCc8d2FybmluZz4nIC4gJHBhY2thZ2VbJ3dhcm5pbmcnXSAuICc8L3dhcm5pbmc+Jyk7Cn0KfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Um9vdFJlcXVpcmVzKCk6IGFycmF5CnsKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCk7CmlmICgkY29tcG9zZXIgPT09IG51bGwpIHsKcmV0dXJuIFtdOwp9Cgokcm9vdFBhY2thZ2UgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKCnJldHVybiBhcnJheV9tYXAoCidzdHJ0b2xvd2VyJywKYXJyYXlfa2V5cyhhcnJheV9tZXJnZSgkcm9vdFBhY2thZ2UtPmdldFJlcXVpcmVzKCksICRyb290UGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSkpCik7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRWZXJzaW9uU3R5bGUoUGFja2FnZUludGVyZmFjZSAkbGF0ZXN0UGFja2FnZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewpyZXR1cm4gJHRoaXMtPnVwZGF0ZVN0YXR1c1RvVmVyc2lvblN0eWxlKCR0aGlzLT5nZXRVcGRhdGVTdGF0dXMoJGxhdGVzdFBhY2thZ2UsICRwYWNrYWdlKSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGFja2FnZShJbnN0YWxsZWRSZXBvc2l0b3J5ICRpbnN0YWxsZWRSZXBvLCBSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvcywgc3RyaW5nICRuYW1lLCAkdmVyc2lvbiA9IG51bGwpOiBhcnJheQp7CiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CiRjb25zdHJhaW50ID0gaXNfc3RyaW5nKCR2ZXJzaW9uKSA/ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCR2ZXJzaW9uKSA6ICR2ZXJzaW9uOwoKJHBvbGljeSA9IG5ldyBEZWZhdWx0UG9saWN5KCk7CiRyZXBvc2l0b3J5U2V0ID0gbmV3IFJlcG9zaXRvcnlTZXQoJ2RldicpOwokcmVwb3NpdG9yeVNldC0+YWxsb3dJbnN0YWxsZWRSZXBvc2l0b3JpZXMoKTsKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkoJHJlcG9zKTsKCiRtYXRjaGVkUGFja2FnZSA9IG51bGw7CiR2ZXJzaW9ucyA9IFtdOwppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmFtZSkpIHsKJHBvb2wgPSAkcmVwb3NpdG9yeVNldC0+Y3JlYXRlUG9vbFdpdGhBbGxQYWNrYWdlcygpOwp9IGVsc2UgewokcG9vbCA9ICRyZXBvc2l0b3J5U2V0LT5jcmVhdGVQb29sRm9yUGFja2FnZSgkbmFtZSk7Cn0KJG1hdGNoZXMgPSAkcG9vbC0+d2hhdFByb3ZpZGVzKCRuYW1lLCAkY29uc3RyYWludCk7CiRsaXRlcmFscyA9IFtdOwpmb3JlYWNoICgkbWF0Y2hlcyBhcyAkcGFja2FnZSkgewoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQoKCmlmIChudWxsID09PSAkdmVyc2lvbiAmJiAkaW5zdGFsbGVkUmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKJG1hdGNoZWRQYWNrYWdlID0gJHBhY2thZ2U7Cn0KCiR2ZXJzaW9uc1skcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpXSA9ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCk7CiRsaXRlcmFsc1tdID0gJHBhY2thZ2UtPmdldElkKCk7Cn0KCgppZiAobnVsbCA9PT0gJG1hdGNoZWRQYWNrYWdlICYmIFxjb3VudCgkbGl0ZXJhbHMpID4gMCkgewokcHJlZmVycmVkID0gJHBvbGljeS0+c2VsZWN0UHJlZmVycmVkUGFja2FnZXMoJHBvb2wsICRsaXRlcmFscyk7CiRtYXRjaGVkUGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRwcmVmZXJyZWRbMF0pOwp9CgppZiAoJG1hdGNoZWRQYWNrYWdlICE9PSBudWxsICYmICEkbWF0Y2hlZFBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignU2hvd0NvbW1hbmQ6OmdldFBhY2thZ2UgY2FuIG9ubHkgd29yayB3aXRoIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSwgYnV0IGdvdCAnLmdldF9jbGFzcygkbWF0Y2hlZFBhY2thZ2UpKTsKfQoKcmV0dXJuIFskbWF0Y2hlZFBhY2thZ2UsICR2ZXJzaW9uc107Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByaW50UGFja2FnZUluZm8oQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkdmVyc2lvbnMsIEluc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8sID9QYWNrYWdlSW50ZXJmYWNlICRsYXRlc3RQYWNrYWdlID0gbnVsbCk6IHZvaWQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiR0aGlzLT5wcmludE1ldGEoJHBhY2thZ2UsICR2ZXJzaW9ucywgJGluc3RhbGxlZFJlcG8sICRsYXRlc3RQYWNrYWdlID86IG51bGwpOwokdGhpcy0+cHJpbnRMaW5rcygkcGFja2FnZSwgTGluazo6VFlQRV9SRVFVSVJFKTsKJHRoaXMtPnByaW50TGlua3MoJHBhY2thZ2UsIExpbms6OlRZUEVfREVWX1JFUVVJUkUsICdyZXF1aXJlcyAoZGV2KScpOwoKaWYgKCRwYWNrYWdlLT5nZXRTdWdnZXN0cygpKSB7CiRpby0+d3JpdGUoIlxuPGluZm8+c3VnZ2VzdHM8L2luZm8+Iik7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRTdWdnZXN0cygpIGFzICRzdWdnZXN0ZWQgPT4gJHJlYXNvbikgewokaW8tPndyaXRlKCRzdWdnZXN0ZWQgLiAnIDxjb21tZW50PicgLiAkcmVhc29uIC4gJzwvY29tbWVudD4nKTsKfQp9CgokdGhpcy0+cHJpbnRMaW5rcygkcGFja2FnZSwgTGluazo6VFlQRV9QUk9WSURFKTsKJHRoaXMtPnByaW50TGlua3MoJHBhY2thZ2UsIExpbms6OlRZUEVfQ09ORkxJQ1QpOwokdGhpcy0+cHJpbnRMaW5rcygkcGFja2FnZSwgTGluazo6VFlQRV9SRVBMQUNFKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRNZXRhKENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYXJyYXkgJHZlcnNpb25zLCBJbnN0YWxsZWRSZXBvc2l0b3J5ICRpbnN0YWxsZWRSZXBvLCA/UGFja2FnZUludGVyZmFjZSAkbGF0ZXN0UGFja2FnZSA9IG51bGwpOiB2b2lkCnsKJGlzSW5zdGFsbGVkUGFja2FnZSA9ICFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWNrYWdlLT5nZXROYW1lKCkpICYmICRpbnN0YWxsZWRSZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKTsKCiRpbyA9ICR0aGlzLT5nZXRJTygpOwokaW8tPndyaXRlKCc8aW5mbz5uYW1lPC9pbmZvPiAgICAgOiAnIC4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSk7CiRpby0+d3JpdGUoJzxpbmZvPmRlc2NyaXAuPC9pbmZvPiA6ICcgLiAkcGFja2FnZS0+Z2V0RGVzY3JpcHRpb24oKSk7CiRpby0+d3JpdGUoJzxpbmZvPmtleXdvcmRzPC9pbmZvPiA6ICcgLiBpbXBsb2RlKCcsICcsICRwYWNrYWdlLT5nZXRLZXl3b3JkcygpID86IFtdKSk7CiR0aGlzLT5wcmludFZlcnNpb25zKCRwYWNrYWdlLCAkdmVyc2lvbnMsICRpbnN0YWxsZWRSZXBvKTsKaWYgKCRpc0luc3RhbGxlZFBhY2thZ2UgJiYgJHBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCkgIT09IG51bGwpIHsKJGlvLT53cml0ZSgnPGluZm8+cmVsZWFzZWQ8L2luZm8+IDogJyAuICRwYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpLT5mb3JtYXQoJ1ktbS1kJykgLiAnLCAnIC4gJHRoaXMtPmdldFJlbGF0aXZlVGltZSgkcGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSkpOwp9CmlmICgkbGF0ZXN0UGFja2FnZSkgewokc3R5bGUgPSAkdGhpcy0+Z2V0VmVyc2lvblN0eWxlKCRsYXRlc3RQYWNrYWdlLCAkcGFja2FnZSk7CiRyZWxlYXNlZFRpbWUgPSAkbGF0ZXN0UGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSA9PT0gbnVsbCA/ICcnIDogJyByZWxlYXNlZCAnIC4gJGxhdGVzdFBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCktPmZvcm1hdCgnWS1tLWQnKSAuICcsICcgLiAkdGhpcy0+Z2V0UmVsYXRpdmVUaW1lKCRsYXRlc3RQYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpKTsKJGlvLT53cml0ZSgnPGluZm8+bGF0ZXN0PC9pbmZvPiAgIDogPCcuJHN0eWxlLic+JyAuICRsYXRlc3RQYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgLiAnPC8nLiRzdHlsZS4nPicgLiAkcmVsZWFzZWRUaW1lKTsKfSBlbHNlIHsKJGxhdGVzdFBhY2thZ2UgPSAkcGFja2FnZTsKfQokaW8tPndyaXRlKCc8aW5mbz50eXBlPC9pbmZvPiAgICAgOiAnIC4gJHBhY2thZ2UtPmdldFR5cGUoKSk7CiR0aGlzLT5wcmludExpY2Vuc2VzKCRwYWNrYWdlKTsKJGlvLT53cml0ZSgnPGluZm8+aG9tZXBhZ2U8L2luZm8+IDogJyAuICRwYWNrYWdlLT5nZXRIb21lcGFnZSgpKTsKJGlvLT53cml0ZSgnPGluZm8+c291cmNlPC9pbmZvPiAgIDogJyAuIHNwcmludGYoJ1slc10gPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+ICVzJywgJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSwgJHBhY2thZ2UtPmdldFNvdXJjZVVybCgpLCAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpKTsKJGlvLT53cml0ZSgnPGluZm8+ZGlzdDwvaW5mbz4gICAgIDogJyAuIHNwcmludGYoJ1slc10gPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+ICVzJywgJHBhY2thZ2UtPmdldERpc3RUeXBlKCksICRwYWNrYWdlLT5nZXREaXN0VXJsKCksICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkpKTsKaWYgKCRpc0luc3RhbGxlZFBhY2thZ2UpIHsKJHBhdGggPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCktPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwppZiAoaXNfc3RyaW5nKCRwYXRoKSkgewokaW8tPndyaXRlKCc8aW5mbz5wYXRoPC9pbmZvPiAgICAgOiAnIC4gcmVhbHBhdGgoJHBhdGgpKTsKfSBlbHNlIHsKJGlvLT53cml0ZSgnPGluZm8+cGF0aDwvaW5mbz4gICAgIDogbnVsbCcpOwp9Cn0KJGlvLT53cml0ZSgnPGluZm8+bmFtZXM8L2luZm8+ICAgIDogJyAuIGltcGxvZGUoJywgJywgJHBhY2thZ2UtPmdldE5hbWVzKCkpKTsKCmlmICgkbGF0ZXN0UGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiAkbGF0ZXN0UGFja2FnZS0+aXNBYmFuZG9uZWQoKSkgewokcmVwbGFjZW1lbnQgPSAoJGxhdGVzdFBhY2thZ2UtPmdldFJlcGxhY2VtZW50UGFja2FnZSgpICE9PSBudWxsKQo/ICcgVGhlIGF1dGhvciBzdWdnZXN0cyB1c2luZyB0aGUgJyAuICRsYXRlc3RQYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKS4gJyBwYWNrYWdlIGluc3RlYWQuJwo6IG51bGw7CgokaW8tPndyaXRlRXJyb3IoCnNwcmludGYoJzx3YXJuaW5nPkF0dGVudGlvbjogVGhpcyBwYWNrYWdlIGlzIGFiYW5kb25lZCBhbmQgbm8gbG9uZ2VyIG1haW50YWluZWQuJXM8L3dhcm5pbmc+JywgJHJlcGxhY2VtZW50KQopOwp9CgppZiAoJHBhY2thZ2UtPmdldFN1cHBvcnQoKSkgewokaW8tPndyaXRlKCJcbjxpbmZvPnN1cHBvcnQ8L2luZm8+Iik7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRTdXBwb3J0KCkgYXMgJHR5cGUgPT4gJHZhbHVlKSB7CiRpby0+d3JpdGUoJzxjb21tZW50PicgLiAkdHlwZSAuICc8L2NvbW1lbnQ+IDogJy4kdmFsdWUpOwp9Cn0KCmlmIChcY291bnQoJHBhY2thZ2UtPmdldEF1dG9sb2FkKCkpID4gMCkgewokaW8tPndyaXRlKCJcbjxpbmZvPmF1dG9sb2FkPC9pbmZvPiIpOwokYXV0b2xvYWRDb25maWcgPSAkcGFja2FnZS0+Z2V0QXV0b2xvYWQoKTsKZm9yZWFjaCAoJGF1dG9sb2FkQ29uZmlnIGFzICR0eXBlID0+ICRhdXRvbG9hZHMpIHsKJGlvLT53cml0ZSgnPGNvbW1lbnQ+JyAuICR0eXBlIC4gJzwvY29tbWVudD4nKTsKCmlmICgkdHlwZSA9PT0gJ3Bzci0wJyB8fCAkdHlwZSA9PT0gJ3Bzci00Jykgewpmb3JlYWNoICgkYXV0b2xvYWRzIGFzICRuYW1lID0+ICRwYXRoKSB7CiRpby0+d3JpdGUoKCRuYW1lID86ICcqJykgLiAnID0+ICcgLiAoaXNfYXJyYXkoJHBhdGgpID8gaW1wbG9kZSgnLCAnLCAkcGF0aCkgOiAoJHBhdGggPzogJy4nKSkpOwp9Cn0gZWxzZWlmICgkdHlwZSA9PT0gJ2NsYXNzbWFwJykgewokaW8tPndyaXRlKGltcGxvZGUoJywgJywgJGF1dG9sb2FkQ29uZmlnWyR0eXBlXSkpOwp9Cn0KaWYgKCRwYWNrYWdlLT5nZXRJbmNsdWRlUGF0aHMoKSkgewokaW8tPndyaXRlKCc8Y29tbWVudD5pbmNsdWRlLXBhdGg8L2NvbW1lbnQ+Jyk7CiRpby0+d3JpdGUoaW1wbG9kZSgnLCAnLCAkcGFja2FnZS0+Z2V0SW5jbHVkZVBhdGhzKCkpKTsKfQp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByaW50VmVyc2lvbnMoQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkdmVyc2lvbnMsIEluc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8pOiB2b2lkCnsKJHZlcnNpb25zID0gYXJyYXlfa2V5cygkdmVyc2lvbnMpOwokdmVyc2lvbnMgPSBTZW12ZXI6OnJzb3J0KCR2ZXJzaW9ucyk7CgoKaWYgKCRpbnN0YWxsZWRQYWNrYWdlcyA9ICRpbnN0YWxsZWRSZXBvLT5maW5kUGFja2FnZXMoJHBhY2thZ2UtPmdldE5hbWUoKSkpIHsKZm9yZWFjaCAoJGluc3RhbGxlZFBhY2thZ2VzIGFzICRpbnN0YWxsZWRQYWNrYWdlKSB7CiRpbnN0YWxsZWRWZXJzaW9uID0gJGluc3RhbGxlZFBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKJGtleSA9IGFycmF5X3NlYXJjaCgkaW5zdGFsbGVkVmVyc2lvbiwgJHZlcnNpb25zKTsKaWYgKGZhbHNlICE9PSAka2V5KSB7CiR2ZXJzaW9uc1ska2V5XSA9ICc8aW5mbz4qICcgLiAkaW5zdGFsbGVkVmVyc2lvbiAuICc8L2luZm8+JzsKfQp9Cn0KCiR2ZXJzaW9ucyA9IGltcGxvZGUoJywgJywgJHZlcnNpb25zKTsKCiR0aGlzLT5nZXRJTygpLT53cml0ZSgnPGluZm8+dmVyc2lvbnM8L2luZm8+IDogJyAuICR2ZXJzaW9ucyk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByaW50TGlua3MoQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGxpbmtUeXBlLCA/c3RyaW5nICR0aXRsZSA9IG51bGwpOiB2b2lkCnsKJHRpdGxlID0gJHRpdGxlID86ICRsaW5rVHlwZTsKJGlvID0gJHRoaXMtPmdldElPKCk7CmlmICgkbGlua3MgPSAkcGFja2FnZS0+eydnZXQnLnVjZmlyc3QoJGxpbmtUeXBlKX0oKSkgewokaW8tPndyaXRlKCJcbjxpbmZvPiIgLiAkdGl0bGUgLiAiPC9pbmZvPiIpOwoKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CiRpby0+d3JpdGUoJGxpbmstPmdldFRhcmdldCgpIC4gJyA8Y29tbWVudD4nIC4gJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSAuICc8L2NvbW1lbnQ+Jyk7Cn0KfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRMaWNlbnNlcyhDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKJHNwZHhMaWNlbnNlcyA9IG5ldyBTcGR4TGljZW5zZXMoKTsKCiRsaWNlbnNlcyA9ICRwYWNrYWdlLT5nZXRMaWNlbnNlKCk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKZm9yZWFjaCAoJGxpY2Vuc2VzIGFzICRsaWNlbnNlSWQpIHsKJGxpY2Vuc2UgPSAkc3BkeExpY2Vuc2VzLT5nZXRMaWNlbnNlQnlJZGVudGlmaWVyKCRsaWNlbnNlSWQpOyAKCmlmICghJGxpY2Vuc2UpIHsKJG91dCA9ICRsaWNlbnNlSWQ7Cn0gZWxzZSB7CgppZiAoJGxpY2Vuc2VbMV0gPT09IHRydWUpIHsKJG91dCA9IHNwcmludGYoJyVzICglcykgKE9TSSBhcHByb3ZlZCkgJXMnLCAkbGljZW5zZVswXSwgJGxpY2Vuc2VJZCwgJGxpY2Vuc2VbMl0pOwp9IGVsc2Ugewokb3V0ID0gc3ByaW50ZignJXMgKCVzKSAlcycsICRsaWNlbnNlWzBdLCAkbGljZW5zZUlkLCAkbGljZW5zZVsyXSk7Cn0KfQoKJGlvLT53cml0ZSgnPGluZm8+bGljZW5zZTwvaW5mbz4gIDogJyAuICRvdXQpOwp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByaW50UGFja2FnZUluZm9Bc0pzb24oQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkdmVyc2lvbnMsIEluc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8sID9QYWNrYWdlSW50ZXJmYWNlICRsYXRlc3RQYWNrYWdlID0gbnVsbCk6IHZvaWQKewokanNvbiA9IFsKJ25hbWUnID0+ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksCidkZXNjcmlwdGlvbicgPT4gJHBhY2thZ2UtPmdldERlc2NyaXB0aW9uKCksCidrZXl3b3JkcycgPT4gJHBhY2thZ2UtPmdldEtleXdvcmRzKCkgPzogW10sCid0eXBlJyA9PiAkcGFja2FnZS0+Z2V0VHlwZSgpLAonaG9tZXBhZ2UnID0+ICRwYWNrYWdlLT5nZXRIb21lcGFnZSgpLAonbmFtZXMnID0+ICRwYWNrYWdlLT5nZXROYW1lcygpLApdOwoKJGpzb24gPSAkdGhpcy0+YXBwZW5kVmVyc2lvbnMoJGpzb24sICR2ZXJzaW9ucyk7CiRqc29uID0gJHRoaXMtPmFwcGVuZExpY2Vuc2VzKCRqc29uLCAkcGFja2FnZSk7CgppZiAoJGxhdGVzdFBhY2thZ2UpIHsKJGpzb25bJ2xhdGVzdCddID0gJGxhdGVzdFBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfSBlbHNlIHsKJGxhdGVzdFBhY2thZ2UgPSAkcGFja2FnZTsKfQoKaWYgKG51bGwgIT09ICRwYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCkpIHsKJGpzb25bJ3NvdXJjZSddID0gWwondHlwZScgPT4gJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSwKJ3VybCcgPT4gJHBhY2thZ2UtPmdldFNvdXJjZVVybCgpLAoncmVmZXJlbmNlJyA9PiAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCksCl07Cn0KCmlmIChudWxsICE9PSAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKSkgewokanNvblsnZGlzdCddID0gWwondHlwZScgPT4gJHBhY2thZ2UtPmdldERpc3RUeXBlKCksCid1cmwnID0+ICRwYWNrYWdlLT5nZXREaXN0VXJsKCksCidyZWZlcmVuY2UnID0+ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCksCl07Cn0KCmlmICghUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZS0+Z2V0TmFtZSgpKSAmJiAkaW5zdGFsbGVkUmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKJHBhdGggPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCktPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwppZiAoaXNfc3RyaW5nKCRwYXRoKSkgewokcGF0aCA9IHJlYWxwYXRoKCRwYXRoKTsKaWYgKCRwYXRoICE9PSBmYWxzZSkgewokanNvblsncGF0aCddID0gJHBhdGg7Cn0KfSBlbHNlIHsKJGpzb25bJ3BhdGgnXSA9IG51bGw7Cn0KCmlmICgkcGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSAhPT0gbnVsbCkgewokanNvblsncmVsZWFzZWQnXSA9ICRwYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpLT5mb3JtYXQoREFURV9BVE9NKTsKfQp9CgppZiAoJGxhdGVzdFBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJGxhdGVzdFBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpIHsKJGpzb25bJ3JlcGxhY2VtZW50J10gPSAkbGF0ZXN0UGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCk7Cn0KCmlmICgkcGFja2FnZS0+Z2V0U3VnZ2VzdHMoKSkgewokanNvblsnc3VnZ2VzdHMnXSA9ICRwYWNrYWdlLT5nZXRTdWdnZXN0cygpOwp9CgppZiAoJHBhY2thZ2UtPmdldFN1cHBvcnQoKSkgewokanNvblsnc3VwcG9ydCddID0gJHBhY2thZ2UtPmdldFN1cHBvcnQoKTsKfQoKJGpzb24gPSAkdGhpcy0+YXBwZW5kQXV0b2xvYWQoJGpzb24sICRwYWNrYWdlKTsKCmlmICgkcGFja2FnZS0+Z2V0SW5jbHVkZVBhdGhzKCkpIHsKJGpzb25bJ2luY2x1ZGVfcGF0aCddID0gJHBhY2thZ2UtPmdldEluY2x1ZGVQYXRocygpOwp9CgokanNvbiA9ICR0aGlzLT5hcHBlbmRMaW5rcygkanNvbiwgJHBhY2thZ2UpOwoKJHRoaXMtPmdldElPKCktPndyaXRlKEpzb25GaWxlOjplbmNvZGUoJGpzb24pKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGVuZFZlcnNpb25zKGFycmF5ICRqc29uLCBhcnJheSAkdmVyc2lvbnMpOiBhcnJheQp7CnVhc29ydCgkdmVyc2lvbnMsICd2ZXJzaW9uX2NvbXBhcmUnKTsKJHZlcnNpb25zID0gYXJyYXlfa2V5cyhhcnJheV9yZXZlcnNlKCR2ZXJzaW9ucykpOwokanNvblsndmVyc2lvbnMnXSA9ICR2ZXJzaW9uczsKCnJldHVybiAkanNvbjsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYXBwZW5kTGljZW5zZXMoYXJyYXkgJGpzb24sIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5CnsKaWYgKCRsaWNlbnNlcyA9ICRwYWNrYWdlLT5nZXRMaWNlbnNlKCkpIHsKJHNwZHhMaWNlbnNlcyA9IG5ldyBTcGR4TGljZW5zZXMoKTsKCiRqc29uWydsaWNlbnNlcyddID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGxpY2Vuc2VJZCkgdXNlICgkc3BkeExpY2Vuc2VzKSB7CiRsaWNlbnNlID0gJHNwZHhMaWNlbnNlcy0+Z2V0TGljZW5zZUJ5SWRlbnRpZmllcigkbGljZW5zZUlkKTsgCgppZiAoISRsaWNlbnNlKSB7CnJldHVybiAkbGljZW5zZUlkOwp9CgpyZXR1cm4gWwonbmFtZScgPT4gJGxpY2Vuc2VbMF0sCidvc2knID0+ICRsaWNlbnNlSWQsCid1cmwnID0+ICRsaWNlbnNlWzJdLApdOwp9LCAkbGljZW5zZXMpOwp9CgpyZXR1cm4gJGpzb247Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGVuZEF1dG9sb2FkKGFycmF5ICRqc29uLCBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBhcnJheQp7CmlmIChcY291bnQoJHBhY2thZ2UtPmdldEF1dG9sb2FkKCkpID4gMCkgewokYXV0b2xvYWQgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRBdXRvbG9hZCgpIGFzICR0eXBlID0+ICRhdXRvbG9hZHMpIHsKaWYgKCR0eXBlID09PSAncHNyLTAnIHx8ICR0eXBlID09PSAncHNyLTQnKSB7CiRwc3IgPSBbXTsKCmZvcmVhY2ggKCRhdXRvbG9hZHMgYXMgJG5hbWUgPT4gJHBhdGgpIHsKaWYgKCEkcGF0aCkgewokcGF0aCA9ICcuJzsKfQoKJHBzclskbmFtZSA/OiAnKiddID0gJHBhdGg7Cn0KCiRhdXRvbG9hZFskdHlwZV0gPSAkcHNyOwp9IGVsc2VpZiAoJHR5cGUgPT09ICdjbGFzc21hcCcpIHsKJGF1dG9sb2FkWydjbGFzc21hcCddID0gJGF1dG9sb2FkczsKfQp9CgokanNvblsnYXV0b2xvYWQnXSA9ICRhdXRvbG9hZDsKfQoKcmV0dXJuICRqc29uOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhcHBlbmRMaW5rcyhhcnJheSAkanNvbiwgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkKewpmb3JlYWNoIChMaW5rOjokVFlQRVMgYXMgJGxpbmtUeXBlKSB7CiRqc29uID0gJHRoaXMtPmFwcGVuZExpbmsoJGpzb24sICRwYWNrYWdlLCAkbGlua1R5cGUpOwp9CgpyZXR1cm4gJGpzb247Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGVuZExpbmsoYXJyYXkgJGpzb24sIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRsaW5rVHlwZSk6IGFycmF5CnsKJGxpbmtzID0gJHBhY2thZ2UtPnsnZ2V0JyAuIHVjZmlyc3QoJGxpbmtUeXBlKX0oKTsKCmlmICgkbGlua3MpIHsKJGpzb25bJGxpbmtUeXBlXSA9IFtdOwoKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CiRqc29uWyRsaW5rVHlwZV1bJGxpbmstPmdldFRhcmdldCgpXSA9ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7Cn0KfQoKcmV0dXJuICRqc29uOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdFN0eWxlcyhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewokdGhpcy0+Y29sb3JzID0gWwonZ3JlZW4nLAoneWVsbG93JywKJ2N5YW4nLAonbWFnZW50YScsCidibHVlJywKXTsKCmZvcmVhY2ggKCR0aGlzLT5jb2xvcnMgYXMgJGNvbG9yKSB7CiRzdHlsZSA9IG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgkY29sb3IpOwokb3V0cHV0LT5nZXRGb3JtYXR0ZXIoKS0+c2V0U3R5bGUoJGNvbG9yLCAkc3R5bGUpOwp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc3BsYXlQYWNrYWdlVHJlZShhcnJheSAkYXJyYXlUcmVlKTogdm9pZAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwpmb3JlYWNoICgkYXJyYXlUcmVlIGFzICRwYWNrYWdlKSB7CiRpby0+d3JpdGUoc3ByaW50ZignPGluZm8+JXM8L2luZm8+JywgJHBhY2thZ2VbJ25hbWUnXSksIGZhbHNlKTsKJGlvLT53cml0ZSgnICcgLiAkcGFja2FnZVsndmVyc2lvbiddLCBmYWxzZSk7CmlmIChpc3NldCgkcGFja2FnZVsnZGVzY3JpcHRpb24nXSkpIHsKJGlvLT53cml0ZSgnICcgLiBzdHJ0b2soJHBhY2thZ2VbJ2Rlc2NyaXB0aW9uJ10sICJcclxuIikpOwp9IGVsc2UgewoKJGlvLT53cml0ZSgnJyk7Cn0KCmlmIChpc3NldCgkcGFja2FnZVsncmVxdWlyZXMnXSkpIHsKJHJlcXVpcmVzID0gJHBhY2thZ2VbJ3JlcXVpcmVzJ107CiR0cmVlQmFyID0gJ+KUnCc7CiRqID0gMDsKJHRvdGFsID0gY291bnQoJHJlcXVpcmVzKTsKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXF1aXJlKSB7CiRyZXF1aXJlTmFtZSA9ICRyZXF1aXJlWyduYW1lJ107CiRqKys7CmlmICgkaiA9PT0gJHRvdGFsKSB7CiR0cmVlQmFyID0gJ+KUlCc7Cn0KJGxldmVsID0gMTsKJGNvbG9yID0gJHRoaXMtPmNvbG9yc1skbGV2ZWxdOwokaW5mbyA9IHNwcmludGYoCiclc+KUgOKUgDwlcz4lczwvJXM+ICVzJywKJHRyZWVCYXIsCiRjb2xvciwKJHJlcXVpcmVOYW1lLAokY29sb3IsCiRyZXF1aXJlWyd2ZXJzaW9uJ10KKTsKJHRoaXMtPndyaXRlVHJlZUxpbmUoJGluZm8pOwoKJHRyZWVCYXIgPSBzdHJfcmVwbGFjZSgn4pSUJywgJyAnLCAkdHJlZUJhcik7CiRwYWNrYWdlc0luVHJlZSA9IFskcGFja2FnZVsnbmFtZSddLCAkcmVxdWlyZU5hbWVdOwoKJHRoaXMtPmRpc3BsYXlUcmVlKCRyZXF1aXJlLCAkcGFja2FnZXNJblRyZWUsICR0cmVlQmFyLCAkbGV2ZWwgKyAxKTsKfQp9Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlVHJlZSgKUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwKSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywKUmVwb3NpdG9yeUludGVyZmFjZSAkcmVtb3RlUmVwb3MKKTogYXJyYXkgewokcmVxdWlyZXMgPSAkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKTsKa3NvcnQoJHJlcXVpcmVzKTsKJGNoaWxkcmVuID0gW107CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxdWlyZU5hbWUgPT4gJHJlcXVpcmUpIHsKJHBhY2thZ2VzSW5UcmVlID0gWyRwYWNrYWdlLT5nZXROYW1lKCksICRyZXF1aXJlTmFtZV07CgokdHJlZUNoaWxkRGVzYyA9IFsKJ25hbWUnID0+ICRyZXF1aXJlTmFtZSwKJ3ZlcnNpb24nID0+ICRyZXF1aXJlLT5nZXRQcmV0dHlDb25zdHJhaW50KCksCl07CgokZGVlcENoaWxkcmVuID0gJHRoaXMtPmFkZFRyZWUoJHJlcXVpcmVOYW1lLCAkcmVxdWlyZSwgJGluc3RhbGxlZFJlcG8sICRyZW1vdGVSZXBvcywgJHBhY2thZ2VzSW5UcmVlKTsKCmlmICgkZGVlcENoaWxkcmVuKSB7CiR0cmVlQ2hpbGREZXNjWydyZXF1aXJlcyddID0gJGRlZXBDaGlsZHJlbjsKfQoKJGNoaWxkcmVuW10gPSAkdHJlZUNoaWxkRGVzYzsKfQokdHJlZSA9IFsKJ25hbWUnID0+ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksCid2ZXJzaW9uJyA9PiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLAonZGVzY3JpcHRpb24nID0+ICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJHBhY2thZ2UtPmdldERlc2NyaXB0aW9uKCkgOiAnJywKXTsKCmlmICgkY2hpbGRyZW4pIHsKJHRyZWVbJ3JlcXVpcmVzJ10gPSAkY2hpbGRyZW47Cn0KCnJldHVybiAkdHJlZTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc3BsYXlUcmVlKAokcGFja2FnZSwKYXJyYXkgJHBhY2thZ2VzSW5UcmVlLApzdHJpbmcgJHByZXZpb3VzVHJlZUJhciA9ICfilJwnLAppbnQgJGxldmVsID0gMQopOiB2b2lkIHsKJHByZXZpb3VzVHJlZUJhciA9IHN0cl9yZXBsYWNlKCfilJwnLCAn4pSCJywgJHByZXZpb3VzVHJlZUJhcik7CmlmIChpc19hcnJheSgkcGFja2FnZSkgJiYgaXNzZXQoJHBhY2thZ2VbJ3JlcXVpcmVzJ10pKSB7CiRyZXF1aXJlcyA9ICRwYWNrYWdlWydyZXF1aXJlcyddOwokdHJlZUJhciA9ICRwcmV2aW91c1RyZWVCYXIgLiAnICDilJwnOwokaSA9IDA7CiR0b3RhbCA9IGNvdW50KCRyZXF1aXJlcyk7CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxdWlyZSkgewokY3VycmVudFRyZWUgPSAkcGFja2FnZXNJblRyZWU7CiRpKys7CmlmICgkaSA9PT0gJHRvdGFsKSB7CiR0cmVlQmFyID0gJHByZXZpb3VzVHJlZUJhciAuICcgIOKUlCc7Cn0KJGNvbG9ySWRlbnQgPSAkbGV2ZWwgJSBjb3VudCgkdGhpcy0+Y29sb3JzKTsKJGNvbG9yID0gJHRoaXMtPmNvbG9yc1skY29sb3JJZGVudF07Cgphc3NlcnQoaXNfc3RyaW5nKCRyZXF1aXJlWyduYW1lJ10pKTsKYXNzZXJ0KGlzX3N0cmluZygkcmVxdWlyZVsndmVyc2lvbiddKSk7CgokY2lyY3VsYXJXYXJuID0gaW5fYXJyYXkoCiRyZXF1aXJlWyduYW1lJ10sCiRjdXJyZW50VHJlZSwKdHJ1ZQopID8gJyhjaXJjdWxhciBkZXBlbmRlbmN5IGFib3J0ZWQgaGVyZSknIDogJyc7CiRpbmZvID0gcnRyaW0oc3ByaW50ZigKJyVz4pSA4pSAPCVzPiVzPC8lcz4gJXMgJXMnLAokdHJlZUJhciwKJGNvbG9yLAokcmVxdWlyZVsnbmFtZSddLAokY29sb3IsCiRyZXF1aXJlWyd2ZXJzaW9uJ10sCiRjaXJjdWxhcldhcm4KKSk7CiR0aGlzLT53cml0ZVRyZWVMaW5lKCRpbmZvKTsKCiR0cmVlQmFyID0gc3RyX3JlcGxhY2UoJ+KUlCcsICcgJywgJHRyZWVCYXIpOwoKJGN1cnJlbnRUcmVlW10gPSAkcmVxdWlyZVsnbmFtZSddOwokdGhpcy0+ZGlzcGxheVRyZWUoJHJlcXVpcmUsICRjdXJyZW50VHJlZSwgJHRyZWVCYXIsICRsZXZlbCArIDEpOwp9Cn0KfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZFRyZWUoCnN0cmluZyAkbmFtZSwKTGluayAkbGluaywKSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywKUmVwb3NpdG9yeUludGVyZmFjZSAkcmVtb3RlUmVwb3MsCmFycmF5ICRwYWNrYWdlc0luVHJlZQopOiBhcnJheSB7CiRjaGlsZHJlbiA9IFtdOwpbJHBhY2thZ2VdID0gJHRoaXMtPmdldFBhY2thZ2UoCiRpbnN0YWxsZWRSZXBvLAokcmVtb3RlUmVwb3MsCiRuYW1lLAokbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpID09PSAnc2VsZi52ZXJzaW9uJyA/ICRsaW5rLT5nZXRDb25zdHJhaW50KCkgOiAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpCik7CmlmIChpc19vYmplY3QoJHBhY2thZ2UpKSB7CiRyZXF1aXJlcyA9ICRwYWNrYWdlLT5nZXRSZXF1aXJlcygpOwprc29ydCgkcmVxdWlyZXMpOwpmb3JlYWNoICgkcmVxdWlyZXMgYXMgJHJlcXVpcmVOYW1lID0+ICRyZXF1aXJlKSB7CiRjdXJyZW50VHJlZSA9ICRwYWNrYWdlc0luVHJlZTsKCiR0cmVlQ2hpbGREZXNjID0gWwonbmFtZScgPT4gJHJlcXVpcmVOYW1lLAondmVyc2lvbicgPT4gJHJlcXVpcmUtPmdldFByZXR0eUNvbnN0cmFpbnQoKSwKXTsKCmlmICghaW5fYXJyYXkoJHJlcXVpcmVOYW1lLCAkY3VycmVudFRyZWUsIHRydWUpKSB7CiRjdXJyZW50VHJlZVtdID0gJHJlcXVpcmVOYW1lOwokZGVlcENoaWxkcmVuID0gJHRoaXMtPmFkZFRyZWUoJHJlcXVpcmVOYW1lLCAkcmVxdWlyZSwgJGluc3RhbGxlZFJlcG8sICRyZW1vdGVSZXBvcywgJGN1cnJlbnRUcmVlKTsKaWYgKCRkZWVwQ2hpbGRyZW4pIHsKJHRyZWVDaGlsZERlc2NbJ3JlcXVpcmVzJ10gPSAkZGVlcENoaWxkcmVuOwp9Cn0KCiRjaGlsZHJlbltdID0gJHRyZWVDaGlsZERlc2M7Cn0KfQoKcmV0dXJuICRjaGlsZHJlbjsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVTdGF0dXNUb1ZlcnNpb25TdHlsZShzdHJpbmcgJHVwZGF0ZVN0YXR1cyk6IHN0cmluZwp7CgoKCnJldHVybiBzdHJfcmVwbGFjZShbJ3VwLXRvLWRhdGUnLCAnc2VtdmVyLXNhZmUtdXBkYXRlJywgJ3VwZGF0ZS1wb3NzaWJsZSddLCBbJ2luZm8nLCAnaGlnaGxpZ2h0JywgJ2NvbW1lbnQnXSwgJHVwZGF0ZVN0YXR1cyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0VXBkYXRlU3RhdHVzKFBhY2thZ2VJbnRlcmZhY2UgJGxhdGVzdFBhY2thZ2UsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBzdHJpbmcKewppZiAoJGxhdGVzdFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgPT09ICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpKSB7CnJldHVybiAndXAtdG8tZGF0ZSc7Cn0KCiRjb25zdHJhaW50ID0gJHBhY2thZ2UtPmdldFZlcnNpb24oKTsKaWYgKDAgIT09IHN0cnBvcygkY29uc3RyYWludCwgJ2Rldi0nKSkgewokY29uc3RyYWludCA9ICdeJy4kY29uc3RyYWludDsKfQppZiAoJGxhdGVzdFBhY2thZ2UtPmdldFZlcnNpb24oKSAmJiBTZW12ZXI6OnNhdGlzZmllcygkbGF0ZXN0UGFja2FnZS0+Z2V0VmVyc2lvbigpLCAkY29uc3RyYWludCkpIHsKCnJldHVybiAnc2VtdmVyLXNhZmUtdXBkYXRlJzsKfQoKCnJldHVybiAndXBkYXRlLXBvc3NpYmxlJzsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZVRyZWVMaW5lKHN0cmluZyAkbGluZSk6IHZvaWQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKaWYgKCEkaW8tPmlzRGVjb3JhdGVkKCkpIHsKJGxpbmUgPSBzdHJfcmVwbGFjZShbJ+KUlCcsICfilJwnLCAn4pSA4pSAJywgJ+KUgiddLCBbJ2AtJywgJ3wtJywgJy0nLCAnfCddLCAkbGluZSk7Cn0KCiRpby0+d3JpdGUoJGxpbmUpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbmRMYXRlc3RQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIENvbXBvc2VyICRjb21wb3NlciwgUGxhdGZvcm1SZXBvc2l0b3J5ICRwbGF0Zm9ybVJlcG8sIGJvb2wgJG1ham9yT25seSwgYm9vbCAkbWlub3JPbmx5LCBib29sICRwYXRjaE9ubHksIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxRmlsdGVyKTogP1BhY2thZ2VJbnRlcmZhY2UKewoKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwokdmVyc2lvblNlbGVjdG9yID0gbmV3IFZlcnNpb25TZWxlY3RvcigkdGhpcy0+Z2V0UmVwb3NpdG9yeVNldCgkY29tcG9zZXIpLCAkcGxhdGZvcm1SZXBvKTsKJHN0YWJpbGl0eSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCk7CiRmbGFncyA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRTdGFiaWxpdHlGbGFncygpOwppZiAoaXNzZXQoJGZsYWdzWyRuYW1lXSkpIHsKJHN0YWJpbGl0eSA9IGFycmF5X3NlYXJjaCgkZmxhZ3NbJG5hbWVdLCBCYXNlUGFja2FnZTo6U1RBQklMSVRJRVMsIHRydWUpOwp9CgokYmVzdFN0YWJpbGl0eSA9ICRzdGFiaWxpdHk7CmlmICgkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0UHJlZmVyU3RhYmxlKCkpIHsKJGJlc3RTdGFiaWxpdHkgPSAkcGFja2FnZS0+Z2V0U3RhYmlsaXR5KCk7Cn0KCiR0YXJnZXRWZXJzaW9uID0gbnVsbDsKaWYgKDAgPT09IHN0cnBvcygkcGFja2FnZS0+Z2V0VmVyc2lvbigpLCAnZGV2LScpKSB7CiR0YXJnZXRWZXJzaW9uID0gJHBhY2thZ2UtPmdldFZlcnNpb24oKTsKCgppZiAoJG1ham9yT25seSkgewpyZXR1cm4gbnVsbDsKfQp9CgppZiAoJHRhcmdldFZlcnNpb24gPT09IG51bGwpIHsKaWYgKCRtYWpvck9ubHkgJiYgUHJlZzo6aXNNYXRjaCgne14oP1A8emVyb19tYWpvcj4oPzowXC4pKyk/KD9QPGZpcnN0X21lYW5pbmdmdWw+XGQrKVwufScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICRtYXRjaCkpIHsKJHRhcmdldFZlcnNpb24gPSAnPj0nLiRtYXRjaFsnemVyb19tYWpvciddLigoKGludCkgJG1hdGNoWydmaXJzdF9tZWFuaW5nZnVsJ10pICsgMSkuJyw8OTk5OTk5OS1kZXYnOwp9CgppZiAoJG1pbm9yT25seSkgewokdGFyZ2V0VmVyc2lvbiA9ICdeJy4kcGFja2FnZS0+Z2V0VmVyc2lvbigpOwp9CgppZiAoJHBhdGNoT25seSkgewokdHJpbW1lZFZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCd7KFwuMCkrJH1EJywgJycsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpOwokcGFydHNOZWVkZWQgPSBzdWJzdHIoJHRyaW1tZWRWZXJzaW9uLCAwLCAxKSA9PT0gJzAnID8gNCA6IDM7CndoaWxlIChzdWJzdHJfY291bnQoJHRyaW1tZWRWZXJzaW9uLCAnLicpICsgMSA8ICRwYXJ0c05lZWRlZCkgewokdHJpbW1lZFZlcnNpb24gLj0gJy4wJzsKfQokdGFyZ2V0VmVyc2lvbiA9ICd+Jy4kdHJpbW1lZFZlcnNpb247Cn0KfQoKaWYgKCR0aGlzLT5nZXRJTygpLT5pc1ZlcmJvc2UoKSkgewokc2hvd1dhcm5pbmdzID0gdHJ1ZTsKfSBlbHNlIHsKJHNob3dXYXJuaW5ncyA9IHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkY2FuZGlkYXRlKSB1c2UgKCRwYWNrYWdlKTogYm9vbCB7CmlmIChzdHJfc3RhcnRzX3dpdGgoJGNhbmRpZGF0ZS0+Z2V0VmVyc2lvbigpLCAnZGV2LScpIHx8IHN0cl9zdGFydHNfd2l0aCgkcGFja2FnZS0+Z2V0VmVyc2lvbigpLCAnZGV2LScpKSB7CnJldHVybiBmYWxzZTsKfQpyZXR1cm4gdmVyc2lvbl9jb21wYXJlKCRjYW5kaWRhdGUtPmdldFZlcnNpb24oKSwgJHBhY2thZ2UtPmdldFZlcnNpb24oKSwgJzw9Jyk7Cn07Cn0KJGNhbmRpZGF0ZSA9ICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRCZXN0Q2FuZGlkYXRlKCRuYW1lLCAkdGFyZ2V0VmVyc2lvbiwgJGJlc3RTdGFiaWxpdHksICRwbGF0Zm9ybVJlcUZpbHRlciwgMCwgJHRoaXMtPmdldElPKCksICRzaG93V2FybmluZ3MpOwp3aGlsZSAoJGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokY2FuZGlkYXRlID0gJGNhbmRpZGF0ZS0+Z2V0QWxpYXNPZigpOwp9CgpyZXR1cm4gJGNhbmRpZGF0ZSAhPT0gZmFsc2UgPyAkY2FuZGlkYXRlIDogbnVsbDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSZXBvc2l0b3J5U2V0KENvbXBvc2VyICRjb21wb3Nlcik6IFJlcG9zaXRvcnlTZXQKewppZiAoISR0aGlzLT5yZXBvc2l0b3J5U2V0KSB7CiR0aGlzLT5yZXBvc2l0b3J5U2V0ID0gbmV3IFJlcG9zaXRvcnlTZXQoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldE1pbmltdW1TdGFiaWxpdHkoKSwgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFN0YWJpbGl0eUZsYWdzKCkpOwokdGhpcy0+cmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeShuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpKSk7Cn0KCnJldHVybiAkdGhpcy0+cmVwb3NpdG9yeVNldDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSZWxhdGl2ZVRpbWUoXERhdGVUaW1lSW50ZXJmYWNlICRyZWxlYXNlRGF0ZSk6IHN0cmluZwp7CmlmICgkcmVsZWFzZURhdGUtPmZvcm1hdCgnWW1kJykgPT09IGRhdGUoJ1ltZCcpKSB7CnJldHVybiAndG9kYXknOwp9CgokZGlmZiA9ICRyZWxlYXNlRGF0ZS0+ZGlmZihuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCkpOwppZiAoJGRpZmYtPmRheXMgPCA3KSB7CnJldHVybiAndGhpcyB3ZWVrJzsKfQoKaWYgKCRkaWZmLT5kYXlzIDwgMTQpIHsKcmV0dXJuICdsYXN0IHdlZWsnOwp9CgppZiAoJGRpZmYtPm0gPCAxICYmICRkaWZmLT5kYXlzIDwgMzEpIHsKcmV0dXJuIGZsb29yKCRkaWZmLT5kYXlzIC8gNykgLiAnIHdlZWtzIGFnbyc7Cn0KCmlmICgkZGlmZi0+eSA8IDEpIHsKcmV0dXJuICRkaWZmLT5tIC4gJyBtb250aCcgLiAoJGRpZmYtPm0gPiAxID8gJ3MnIDogJycpIC4gJyBhZ28nOwp9CgpyZXR1cm4gJGRpZmYtPnkgLiAnIHllYXInIC4gKCRkaWZmLT55ID4gMSA/ICdzJyA6ICcnKSAuICcgYWdvJzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxDaGFuZ2VSZXBvcnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXER2Y3NEb3dubG9hZGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxWY3NDYXBhYmxlRG93bmxvYWRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25HdWVzc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKCgoKCgpjbGFzcyBTdGF0dXNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcml2YXRlIGNvbnN0IEVYSVRfQ09ERV9FUlJPUlMgPSAxOwpwcml2YXRlIGNvbnN0IEVYSVRfQ09ERV9VTlBVU0hFRF9DSEFOR0VTID0gMjsKcHJpdmF0ZSBjb25zdCBFWElUX0NPREVfVkVSU0lPTl9DSEFOR0VTID0gNDsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnc3RhdHVzJykKLT5zZXREZXNjcmlwdGlvbignU2hvd3MgYSBsaXN0IG9mIGxvY2FsbHkgbW9kaWZpZWQgcGFja2FnZXMnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ3ZlcmJvc2UnLCAndnx2dnx2dnYnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgbW9kaWZpZWQgZmlsZXMgZm9yIGVhY2ggZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgY2hhbmdlcy4nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIHN0YXR1cyBjb21tYW5kIGRpc3BsYXlzIGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlCmJlZW4gbW9kaWZpZWQgbG9jYWxseS4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3N0YXR1cwpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdzdGF0dXMnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKCiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UFJFX1NUQVRVU19DTUQsIHRydWUpOwoKJGV4aXRDb2RlID0gJHRoaXMtPmRvRXhlY3V0ZSgkaW5wdXQpOwoKCiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UE9TVF9TVEFUVVNfQ01ELCB0cnVlKTsKCnJldHVybiAkZXhpdENvZGU7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZG9FeGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCk6IGludAp7CgokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokaW5zdGFsbGVkUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CgokZG0gPSAkY29tcG9zZXItPmdldERvd25sb2FkTWFuYWdlcigpOwokaW0gPSAkY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKTsKCiRlcnJvcnMgPSBbXTsKJGlvID0gJHRoaXMtPmdldElPKCk7CiR1bnB1c2hlZENoYW5nZXMgPSBbXTsKJHZjc1ZlcnNpb25DaGFuZ2VzID0gW107CgokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXI7CiRndWVzc2VyID0gbmV3IFZlcnNpb25HdWVzc2VyKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCksICRjb21wb3Nlci0+Z2V0TG9vcCgpLT5nZXRQcm9jZXNzRXhlY3V0b3IoKSA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyksICRwYXJzZXIsICRpbyk7CiRkdW1wZXIgPSBuZXcgQXJyYXlEdW1wZXI7CgoKZm9yZWFjaCAoJGluc3RhbGxlZFJlcG8tPmdldENhbm9uaWNhbFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJGRvd25sb2FkZXIgPSAkZG0tPmdldERvd25sb2FkZXJGb3JQYWNrYWdlKCRwYWNrYWdlKTsKJHRhcmdldERpciA9ICRpbS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwppZiAoJHRhcmdldERpciA9PT0gbnVsbCkgewpjb250aW51ZTsKfQoKaWYgKCRkb3dubG9hZGVyIGluc3RhbmNlb2YgQ2hhbmdlUmVwb3J0SW50ZXJmYWNlKSB7CmlmIChpc19saW5rKCR0YXJnZXREaXIpKSB7CiRlcnJvcnNbJHRhcmdldERpcl0gPSAkdGFyZ2V0RGlyIC4gJyBpcyBhIHN5bWJvbGljIGxpbmsuJzsKfQoKaWYgKG51bGwgIT09ICgkY2hhbmdlcyA9ICRkb3dubG9hZGVyLT5nZXRMb2NhbENoYW5nZXMoJHBhY2thZ2UsICR0YXJnZXREaXIpKSkgewokZXJyb3JzWyR0YXJnZXREaXJdID0gJGNoYW5nZXM7Cn0KfQoKaWYgKCRkb3dubG9hZGVyIGluc3RhbmNlb2YgVmNzQ2FwYWJsZURvd25sb2FkZXJJbnRlcmZhY2UpIHsKaWYgKCRkb3dubG9hZGVyLT5nZXRWY3NSZWZlcmVuY2UoJHBhY2thZ2UsICR0YXJnZXREaXIpKSB7CnN3aXRjaCAoJHBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpKSB7CmNhc2UgJ3NvdXJjZSc6CiRwcmV2aW91c1JlZiA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKYnJlYWs7CmNhc2UgJ2Rpc3QnOgokcHJldmlvdXNSZWYgPSAkcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpOwpicmVhazsKZGVmYXVsdDoKJHByZXZpb3VzUmVmID0gbnVsbDsKfQoKJGN1cnJlbnRWZXJzaW9uID0gJGd1ZXNzZXItPmd1ZXNzVmVyc2lvbigkZHVtcGVyLT5kdW1wKCRwYWNrYWdlKSwgJHRhcmdldERpcik7CgppZiAoJHByZXZpb3VzUmVmICYmICRjdXJyZW50VmVyc2lvbiAmJiAkY3VycmVudFZlcnNpb25bJ2NvbW1pdCddICE9PSAkcHJldmlvdXNSZWYgJiYgJGN1cnJlbnRWZXJzaW9uWydwcmV0dHlfdmVyc2lvbiddICE9PSAkcHJldmlvdXNSZWYpIHsKJHZjc1ZlcnNpb25DaGFuZ2VzWyR0YXJnZXREaXJdID0gWwoncHJldmlvdXMnID0+IFsKJ3ZlcnNpb24nID0+ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCksCidyZWYnID0+ICRwcmV2aW91c1JlZiwKXSwKJ2N1cnJlbnQnID0+IFsKJ3ZlcnNpb24nID0+ICRjdXJyZW50VmVyc2lvblsncHJldHR5X3ZlcnNpb24nXSwKJ3JlZicgPT4gJGN1cnJlbnRWZXJzaW9uWydjb21taXQnXSwKXSwKXTsKfQp9Cn0KCmlmICgkZG93bmxvYWRlciBpbnN0YW5jZW9mIER2Y3NEb3dubG9hZGVySW50ZXJmYWNlKSB7CmlmICgkdW5wdXNoZWQgPSAkZG93bmxvYWRlci0+Z2V0VW5wdXNoZWRDaGFuZ2VzKCRwYWNrYWdlLCAkdGFyZ2V0RGlyKSkgewokdW5wdXNoZWRDaGFuZ2VzWyR0YXJnZXREaXJdID0gJHVucHVzaGVkOwp9Cn0KfQoKCmlmICghJGVycm9ycyAmJiAhJHVucHVzaGVkQ2hhbmdlcyAmJiAhJHZjc1ZlcnNpb25DaGFuZ2VzKSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+Tm8gbG9jYWwgY2hhbmdlczwvaW5mbz4nKTsKCnJldHVybiAwOwp9CgppZiAoJGVycm9ycykgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Zb3UgaGF2ZSBjaGFuZ2VzIGluIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzOjwvZXJyb3I+Jyk7Cgpmb3JlYWNoICgkZXJyb3JzIGFzICRwYXRoID0+ICRjaGFuZ2VzKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKSB7CiRpbmRlbnRlZENoYW5nZXMgPSBpbXBsb2RlKCJcbiIsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRsaW5lKTogc3RyaW5nIHsKcmV0dXJuICcgICAgJyAuIGx0cmltKCRsaW5lKTsKfSwgZXhwbG9kZSgiXG4iLCAkY2hhbmdlcykpKTsKJGlvLT53cml0ZSgnPGluZm8+Jy4kcGF0aC4nPC9pbmZvPjonKTsKJGlvLT53cml0ZSgkaW5kZW50ZWRDaGFuZ2VzKTsKfSBlbHNlIHsKJGlvLT53cml0ZSgkcGF0aCk7Cn0KfQp9CgppZiAoJHVucHVzaGVkQ2hhbmdlcykgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBoYXZlIHVucHVzaGVkIGNoYW5nZXMgb24gdGhlIGN1cnJlbnQgYnJhbmNoIGluIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzOjwvd2FybmluZz4nKTsKCmZvcmVhY2ggKCR1bnB1c2hlZENoYW5nZXMgYXMgJHBhdGggPT4gJGNoYW5nZXMpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd2ZXJib3NlJykpIHsKJGluZGVudGVkQ2hhbmdlcyA9IGltcGxvZGUoIlxuIiwgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGxpbmUpOiBzdHJpbmcgewpyZXR1cm4gJyAgICAnIC4gbHRyaW0oJGxpbmUpOwp9LCBleHBsb2RlKCJcbiIsICRjaGFuZ2VzKSkpOwokaW8tPndyaXRlKCc8aW5mbz4nLiRwYXRoLic8L2luZm8+OicpOwokaW8tPndyaXRlKCRpbmRlbnRlZENoYW5nZXMpOwp9IGVsc2UgewokaW8tPndyaXRlKCRwYXRoKTsKfQp9Cn0KCmlmICgkdmNzVmVyc2lvbkNoYW5nZXMpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgaGF2ZSB2ZXJzaW9uIHZhcmlhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXM6PC93YXJuaW5nPicpOwoKZm9yZWFjaCAoJHZjc1ZlcnNpb25DaGFuZ2VzIGFzICRwYXRoID0+ICRjaGFuZ2VzKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKSB7CgokY3VycmVudFZlcnNpb24gPSAkY2hhbmdlc1snY3VycmVudCddWyd2ZXJzaW9uJ10gPzogJGNoYW5nZXNbJ2N1cnJlbnQnXVsncmVmJ107CiRwcmV2aW91c1ZlcnNpb24gPSAkY2hhbmdlc1sncHJldmlvdXMnXVsndmVyc2lvbiddID86ICRjaGFuZ2VzWydwcmV2aW91cyddWydyZWYnXTsKCmlmICgkaW8tPmlzVmVyeVZlcmJvc2UoKSkgewoKJGN1cnJlbnRWZXJzaW9uIC49IHNwcmludGYoJyAoJXMpJywgJGNoYW5nZXNbJ2N1cnJlbnQnXVsncmVmJ10pOwokcHJldmlvdXNWZXJzaW9uIC49IHNwcmludGYoJyAoJXMpJywgJGNoYW5nZXNbJ3ByZXZpb3VzJ11bJ3JlZiddKTsKfQoKJGlvLT53cml0ZSgnPGluZm8+Jy4kcGF0aC4nPC9pbmZvPjonKTsKJGlvLT53cml0ZShzcHJpbnRmKCcgICAgRnJvbSA8Y29tbWVudD4lczwvY29tbWVudD4gdG8gPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+JywgJHByZXZpb3VzVmVyc2lvbiwgJGN1cnJlbnRWZXJzaW9uKSk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJHBhdGgpOwp9Cn0KfQoKaWYgKCgkZXJyb3JzIHx8ICR1bnB1c2hlZENoYW5nZXMgfHwgJHZjc1ZlcnNpb25DaGFuZ2VzKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ3ZlcmJvc2UnKSkgewokaW8tPndyaXRlRXJyb3IoJ1VzZSAtLXZlcmJvc2UgKC12KSB0byBzZWUgYSBsaXN0IG9mIGZpbGVzJyk7Cn0KCnJldHVybiAoJGVycm9ycyA/IHNlbGY6OkVYSVRfQ09ERV9FUlJPUlMgOiAwKSArICgkdW5wdXNoZWRDaGFuZ2VzID8gc2VsZjo6RVhJVF9DT0RFX1VOUFVTSEVEX0NIQU5HRVMgOiAwKSArICgkdmNzVmVyc2lvbkNoYW5nZXMgPyBzZWxmOjpFWElUX0NPREVfVkVSU0lPTl9DSEFOR0VTIDogMCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCmNsYXNzIFN1Z2dlc3RzQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnc3VnZ2VzdHMnKQotPnNldERlc2NyaXB0aW9uKCdTaG93cyBwYWNrYWdlIHN1Z2dlc3Rpb25zJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdieS1wYWNrYWdlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdHcm91cHMgb3V0cHV0IGJ5IHN1Z2dlc3RpbmcgcGFja2FnZSAoZGVmYXVsdCknKSwKbmV3IElucHV0T3B0aW9uKCdieS1zdWdnZXN0aW9uJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdHcm91cHMgb3V0cHV0IGJ5IHN1Z2dlc3RlZCBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbignYWxsJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgc3VnZ2VzdGlvbnMgZnJvbSBhbGwgZGVwZW5kZW5jaWVzLCBpbmNsdWRpbmcgdHJhbnNpdGl2ZSBvbmVzJyksCm5ldyBJbnB1dE9wdGlvbignbGlzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBvbmx5IGxpc3Qgb2Ygc3VnZ2VzdGVkIHBhY2thZ2UgbmFtZXMnKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0V4Y2x1ZGUgc3VnZ2VzdGlvbnMgZnJvbSByZXF1aXJlLWRldiBwYWNrYWdlcycpLApuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZXMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnUGFja2FnZXMgdGhhdCB5b3Ugd2FudCB0byBsaXN0IHN1Z2dlc3Rpb25zIGZyb20uJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlKCkpLApdKQotPnNldEhlbHAoCjw8PEVPVAoKVGhlIDxpbmZvPiVjb21tYW5kLm5hbWUlPC9pbmZvPiBjb21tYW5kIHNob3dzIGEgc29ydGVkIGxpc3Qgb2Ygc3VnZ2VzdGVkIHBhY2thZ2VzLgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjc3VnZ2VzdHMKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKJGluc3RhbGxlZFJlcG9zID0gWwpuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KGNsb25lICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpKSwKXTsKCiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSkgewokaW5zdGFsbGVkUmVwb3NbXSA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRsb2NrZXItPmdldFBsYXRmb3JtT3ZlcnJpZGVzKCkpOwokaW5zdGFsbGVkUmVwb3NbXSA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSk7Cn0gZWxzZSB7CiRpbnN0YWxsZWRSZXBvc1tdID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdwbGF0Zm9ybScpKTsKJGluc3RhbGxlZFJlcG9zW10gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwp9CgokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KCRpbnN0YWxsZWRSZXBvcyk7CiRyZXBvcnRlciA9IG5ldyBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKCR0aGlzLT5nZXRJTygpKTsKCiRmaWx0ZXIgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpOwokcGFja2FnZXMgPSAkaW5zdGFsbGVkUmVwby0+Z2V0UGFja2FnZXMoKTsKJHBhY2thZ2VzW10gPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICghZW1wdHkoJGZpbHRlcikgJiYgIWluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICRmaWx0ZXIpKSB7CmNvbnRpbnVlOwp9CgokcmVwb3J0ZXItPmFkZFN1Z2dlc3Rpb25zRnJvbVBhY2thZ2UoJHBhY2thZ2UpOwp9CgoKJG1vZGUgPSBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyOjpNT0RFX0JZX1BBQ0tBR0U7CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdieS1zdWdnZXN0aW9uJykpIHsKJG1vZGUgPSBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyOjpNT0RFX0JZX1NVR0dFU1RJT047Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignYnktcGFja2FnZScpKSB7CiRtb2RlIHw9IFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI6Ok1PREVfQllfUEFDS0FHRTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsaXN0JykpIHsKJG1vZGUgPSBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyOjpNT0RFX0xJU1Q7Cn0KCiRyZXBvcnRlci0+b3V0cHV0KCRtb2RlLCAkaW5zdGFsbGVkUmVwbywgZW1wdHkoJGZpbHRlcikgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdhbGwnKSA/ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpIDogbnVsbCk7CgpyZXR1cm4gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFJlcXVlc3Q7CnVzZSBDb21wb3NlclxJbnN0YWxsZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxSb290UGFja2FnZUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uU2VsZWN0b3I7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNdWx0aUNvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcSW50ZXJ2YWxzOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcVGFibGU7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgpjbGFzcyBVcGRhdGVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpCnsKJHRoaXMKLT5zZXROYW1lKCd1cGRhdGUnKQotPnNldEFsaWFzZXMoWyd1JywgJ3VwZ3JhZGUnXSkKLT5zZXREZXNjcmlwdGlvbignVXBkYXRlcyB5b3VyIGRlcGVuZGVuY2llcyB0byB0aGUgbGF0ZXN0IHZlcnNpb24gYWNjb3JkaW5nIHRvIGNvbXBvc2VyLmpzb24sIGFuZCB1cGRhdGVzIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZXMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnUGFja2FnZXMgdGhhdCBzaG91bGQgYmUgdXBkYXRlZCwgaWYgbm90IHByb3ZpZGVkIGFsbCBwYWNrYWdlcyBhcmUuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlKGZhbHNlKSksCm5ldyBJbnB1dE9wdGlvbignd2l0aCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSB8IElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1RlbXBvcmFyeSB2ZXJzaW9uIGNvbnN0cmFpbnQgdG8gYWRkLCBlLmcuIGZvby9iYXI6MS4wLjAgb3IgZm9vL2Jhcj0xLjAuMCcpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIHNvdXJjZXMgd2hlbiBwb3NzaWJsZSwgaW5jbHVkaW5nIFZDUyBpbmZvcm1hdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItZGlzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdCAoZGVmYXVsdCBiZWhhdmlvcikuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0fHNvdXJjZXxhdXRvIChhdXRvIGNob29zZXMgc291cmNlIGZvciBkZXYgdmVyc2lvbnMsIGRpc3QgZm9yIHRoZSByZXN0KS4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFByZWZlckluc3RhbGwoKSksCm5ldyBJbnB1dE9wdGlvbignZHJ5LXJ1bicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3V0cHV0cyB0aGUgb3BlcmF0aW9ucyBidXQgd2lsbCBub3QgZXhlY3V0ZSBhbnl0aGluZyAoaW1wbGljaXRseSBlbmFibGVzIC0tdmVyYm9zZSkuJyksCm5ldyBJbnB1dE9wdGlvbignZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdERVBSRUNBVEVEOiBFbmFibGVzIGluc3RhbGxhdGlvbiBvZiByZXF1aXJlLWRldiBwYWNrYWdlcyAoZW5hYmxlZCBieSBkZWZhdWx0LCBvbmx5IHByZXNlbnQgZm9yIEJDKS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIGluc3RhbGxhdGlvbiBvZiByZXF1aXJlLWRldiBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdsb2NrJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPdmVyd3JpdGVzIHRoZSBsb2NrIGZpbGUgaGFzaCB0byBzdXBwcmVzcyB3YXJuaW5nIGFib3V0IHRoZSBsb2NrIGZpbGUgYmVpbmcgb3V0IG9mIGRhdGUgd2l0aG91dCB1cGRhdGluZyBwYWNrYWdlIHZlcnNpb25zLiBQYWNrYWdlIG1ldGFkYXRhIGxpa2UgbWlycm9ycyBhbmQgVVJMcyBhcmUgdXBkYXRlZCBpZiB0aGV5IGNoYW5nZWQuJyksCm5ldyBJbnB1dE9wdGlvbignbm8taW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcCB0aGUgaW5zdGFsbCBzdGVwIGFmdGVyIHVwZGF0aW5nIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tYXVkaXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXAgdGhlIGF1ZGl0IHN0ZXAgYWZ0ZXIgdXBkYXRpbmcgdGhlIGNvbXBvc2VyLmxvY2sgZmlsZSAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfTk9fQVVESVQ9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdhdWRpdC1mb3JtYXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdBdWRpdCBvdXRwdXQgZm9ybWF0LiBNdXN0IGJlICJ0YWJsZSIsICJwbGFpbiIsICJqc29uIiwgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZLCBBdWRpdG9yOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCduby1hdXRvbG9hZGVyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTa2lwcyBhdXRvbG9hZGVyIGdlbmVyYXRpb24nKSwKbmV3IElucHV0T3B0aW9uKCduby1zdWdnZXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdERVBSRUNBVEVEOiBUaGlzIGZsYWcgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1wcm9ncmVzcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IG91dHB1dCBkb3dubG9hZCBwcm9ncmVzcy4nKSwKbmV3IElucHV0T3B0aW9uKCd3aXRoLWRlcGVuZGVuY2llcycsICd3JywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVcGRhdGUgYWxzbyBkZXBlbmRlbmNpZXMgb2YgcGFja2FnZXMgaW4gdGhlIGFyZ3VtZW50IGxpc3QsIGV4Y2VwdCB0aG9zZSB3aGljaCBhcmUgcm9vdCByZXF1aXJlbWVudHMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX1dJVEhfREVQRU5ERU5DSUVTPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignd2l0aC1hbGwtZGVwZW5kZW5jaWVzJywgJ1cnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1VwZGF0ZSBhbHNvIGRlcGVuZGVuY2llcyBvZiBwYWNrYWdlcyBpbiB0aGUgYXJndW1lbnQgbGlzdCwgaW5jbHVkaW5nIHRob3NlIHdoaWNoIGFyZSByb290IHJlcXVpcmVtZW50cyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfV0lUSF9BTExfREVQRU5ERU5DSUVTPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbigndmVyYm9zZScsICd2fHZ2fHZ2dicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvd3MgbW9yZSBkZXRhaWxzIGluY2x1ZGluZyBuZXcgY29tbWl0cyBwdWxsZWQgaW4gd2hlbiB1cGRhdGluZyBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJywgJ28nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wdGltaXplIGF1dG9sb2FkZXIgZHVyaW5nIGF1dG9sb2FkZXIgZHVtcC4nKSwKbmV3IElucHV0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0F1dG9sb2FkIGNsYXNzZXMgZnJvbSB0aGUgY2xhc3NtYXAgb25seS4gSW1wbGljaXRseSBlbmFibGVzIGAtLW9wdGltaXplLWF1dG9sb2FkZXJgLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVXNlIEFQQ3UgdG8gY2FjaGUgZm91bmQvbm90LWZvdW5kIGNsYXNzZXMuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyLXByZWZpeCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1VzZSBhIGN1c3RvbSBwcmVmaXggZm9yIHRoZSBBUEN1IGF1dG9sb2FkZXIgY2FjaGUuIEltcGxpY2l0bHkgZW5hYmxlcyAtLWFwY3UtYXV0b2xvYWRlcicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgYSBzcGVjaWZpYyBwbGF0Zm9ybSByZXF1aXJlbWVudCAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0lnbm9yZSBhbGwgcGxhdGZvcm0gcmVxdWlyZW1lbnRzIChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItc3RhYmxlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdQcmVmZXIgc3RhYmxlIHZlcnNpb25zIG9mIGRlcGVuZGVuY2llcyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfUFJFRkVSX1NUQUJMRT0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1sb3dlc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1ByZWZlciBsb3dlc3QgdmVyc2lvbnMgb2YgZGVwZW5kZW5jaWVzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9QUkVGRVJfTE9XRVNUPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignbWluaW1hbC1jaGFuZ2VzJywgJ20nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0R1cmluZyBhIHBhcnRpYWwgdXBkYXRlIHdpdGggLXcvLVcsIG9ubHkgcGVyZm9ybSBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9NSU5JTUFMX0NIQU5HRVM9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwYXRjaC1vbmx5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPbmx5IGFsbG93IHBhdGNoIHZlcnNpb24gdXBkYXRlcyBmb3IgY3VycmVudGx5IGluc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyksCm5ldyBJbnB1dE9wdGlvbignaW50ZXJhY3RpdmUnLCAnaScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSW50ZXJhY3RpdmUgaW50ZXJmYWNlIHdpdGggYXV0b2NvbXBsZXRpb24gdG8gc2VsZWN0IHRoZSBwYWNrYWdlcyB0byB1cGRhdGUuJyksCm5ldyBJbnB1dE9wdGlvbigncm9vdC1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXN0cmljdHMgdGhlIHVwZGF0ZSB0byB5b3VyIGZpcnN0IGRlZ3JlZSBkZXBlbmRlbmNpZXMuJyksCm5ldyBJbnB1dE9wdGlvbignYnVtcC1hZnRlci11cGRhdGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfT1BUSU9OQUwsICdSdW5zIGJ1bXAgYWZ0ZXIgcGVyZm9ybWluZyB0aGUgdXBkYXRlLicsIGZhbHNlLCBbJ2RldicsICduby1kZXYnLCAnYWxsJ10pLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+dXBkYXRlPC9pbmZvPiBjb21tYW5kIHJlYWRzIHRoZSBjb21wb3Nlci5qc29uIGZpbGUgZnJvbSB0aGUKY3VycmVudCBkaXJlY3RvcnksIHByb2Nlc3NlcyBpdCwgYW5kIHVwZGF0ZXMsIHJlbW92ZXMgb3IgaW5zdGFsbHMgYWxsIHRoZQpkZXBlbmRlbmNpZXMuCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciB1cGRhdGU8L2luZm8+CgpUbyBsaW1pdCB0aGUgdXBkYXRlIG9wZXJhdGlvbiB0byBhIGZldyBwYWNrYWdlcywgeW91IGNhbiBsaXN0IHRoZSBwYWNrYWdlKHMpCnlvdSB3YW50IHRvIHVwZGF0ZSBhcyBzdWNoOgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgdXBkYXRlIHZlbmRvci9wYWNrYWdlMSBmb28vbXlwYWNrYWdlIFsuLi5dPC9pbmZvPgoKWW91IG1heSBhbHNvIHVzZSBhbiBhc3RlcmlzayAoKikgcGF0dGVybiB0byBsaW1pdCB0aGUgdXBkYXRlIG9wZXJhdGlvbiB0byBwYWNrYWdlKHMpCmZyb20gYSBzcGVjaWZpYyB2ZW5kb3I6Cgo8aW5mbz5waHAgY29tcG9zZXIucGhhciB1cGRhdGUgdmVuZG9yL3BhY2thZ2UxIGZvby8qIFsuLi5dPC9pbmZvPgoKVG8gcnVuIGFuIHVwZGF0ZSB3aXRoIG1vcmUgcmVzdHJpY3RpdmUgY29uc3RyYWludHMgeW91IGNhbiB1c2U6Cgo8aW5mbz5waHAgY29tcG9zZXIucGhhciB1cGRhdGUgLS13aXRoIHZlbmRvci9wYWNrYWdlOjEuMC4qPC9pbmZvPgoKVG8gcnVuIGEgcGFydGlhbCB1cGRhdGUgd2l0aCBtb3JlIHJlc3RyaWN0aXZlIGNvbnN0cmFpbnRzIHlvdSBjYW4gdXNlIHRoZSBzaG9ydGhhbmQ6Cgo8aW5mbz5waHAgY29tcG9zZXIucGhhciB1cGRhdGUgdmVuZG9yL3BhY2thZ2U6MS4wLio8L2luZm8+CgpUbyBzZWxlY3QgcGFja2FnZXMgbmFtZXMgaW50ZXJhY3RpdmVseSB3aXRoIGF1dG8tY29tcGxldGlvbiB1c2UgPGluZm8+LWk8L2luZm8+LgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjdXBkYXRlLXUtdXBncmFkZQpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICItLWRldiIuIEl0IGhhcyBubyBlZmZlY3QgYW5kIHdpbGwgYnJlYWsgaW4gQ29tcG9zZXIgMy48L3dhcm5pbmc+Jyk7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1zdWdnZXN0JykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9wdGlvbiAiLS1uby1zdWdnZXN0Ii4gSXQgaGFzIG5vIGVmZmVjdCBhbmQgd2lsbCBicmVhayBpbiBDb21wb3NlciAzLjwvd2FybmluZz4nKTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKaWYgKCFIdHRwRG93bmxvYWRlcjo6aXNDdXJsRW5hYmxlZCgpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q29tcG9zZXIgaXMgb3BlcmF0aW5nIHNpZ25pZmljYW50bHkgc2xvd2VyIHRoYW4gbm9ybWFsIGJlY2F1c2UgeW91IGRvIG5vdCBoYXZlIHRoZSBQSFAgY3VybCBleHRlbnNpb24gZW5hYmxlZC48L3dhcm5pbmc+Jyk7Cn0KCiRwYWNrYWdlcyA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJyk7CiRyZXFzID0gJHRoaXMtPmZvcm1hdFJlcXVpcmVtZW50cygkaW5wdXQtPmdldE9wdGlvbignd2l0aCcpKTsKCgppZiAoY291bnQoJHBhY2thZ2VzKSA+IDApIHsKJGFsbG93bGlzdFBhY2thZ2VzV2l0aFJlcXVpcmVtZW50cyA9IGFycmF5X2ZpbHRlcigkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoJHBrZyk6IGJvb2wgewpyZXR1cm4gUHJlZzo6aXNNYXRjaCgne1xTK1sgPTpdXFMrfScsICRwa2cpOwp9KTsKZm9yZWFjaCAoJHRoaXMtPmZvcm1hdFJlcXVpcmVtZW50cygkYWxsb3dsaXN0UGFja2FnZXNXaXRoUmVxdWlyZW1lbnRzKSBhcyAkcGFja2FnZSA9PiAkY29uc3RyYWludCkgewokcmVxc1skcGFja2FnZV0gPSAkY29uc3RyYWludDsKfQoKCmZvcmVhY2ggKCRhbGxvd2xpc3RQYWNrYWdlc1dpdGhSZXF1aXJlbWVudHMgYXMgJHBhY2thZ2UpIHsKJHBhY2thZ2VOYW1lID0gUHJlZzo6cmVwbGFjZSgne14oW14gPTpdKylbID06XS4qJH0nLCAnJDEnLCAkcGFja2FnZSk7CiRpbmRleCA9IGFycmF5X3NlYXJjaCgkcGFja2FnZSwgJHBhY2thZ2VzKTsKJHBhY2thZ2VzWyRpbmRleF0gPSAkcGFja2FnZU5hbWU7Cn0KfQoKJHJvb3RQYWNrYWdlID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRyb290UGFja2FnZS0+c2V0UmVmZXJlbmNlcyhSb290UGFja2FnZUxvYWRlcjo6ZXh0cmFjdFJlZmVyZW5jZXMoJHJlcXMsICRyb290UGFja2FnZS0+Z2V0UmVmZXJlbmNlcygpKSk7CiRyb290UGFja2FnZS0+c2V0U3RhYmlsaXR5RmxhZ3MoUm9vdFBhY2thZ2VMb2FkZXI6OmV4dHJhY3RTdGFiaWxpdHlGbGFncygkcmVxcywgJHJvb3RQYWNrYWdlLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCksICRyb290UGFja2FnZS0+Z2V0U3RhYmlsaXR5RmxhZ3MoKSkpOwoKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokdGVtcG9yYXJ5Q29uc3RyYWludHMgPSBbXTsKJHJvb3RSZXF1aXJlbWVudHMgPSBhcnJheV9tZXJnZSgkcm9vdFBhY2thZ2UtPmdldFJlcXVpcmVzKCksICRyb290UGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSk7CmZvcmVhY2ggKCRyZXFzIGFzICRwYWNrYWdlID0+ICRjb25zdHJhaW50KSB7CiRwYWNrYWdlID0gc3RydG9sb3dlcigkcGFja2FnZSk7CiRwYXJzZWRDb25zdHJhaW50ID0gJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludCk7CiR0ZW1wb3JhcnlDb25zdHJhaW50c1skcGFja2FnZV0gPSAkcGFyc2VkQ29uc3RyYWludDsKaWYgKGlzc2V0KCRyb290UmVxdWlyZW1lbnRzWyRwYWNrYWdlXSkgJiYgIUludGVydmFsczo6aGF2ZUludGVyc2VjdGlvbnMoJHBhcnNlZENvbnN0cmFpbnQsICRyb290UmVxdWlyZW1lbnRzWyRwYWNrYWdlXS0+Z2V0Q29uc3RyYWludCgpKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5UaGUgdGVtcG9yYXJ5IGNvbnN0cmFpbnQgIicuJGNvbnN0cmFpbnQuJyIgZm9yICInLiRwYWNrYWdlLiciIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIGNvbnN0cmFpbnQgaW4geW91ciBjb21wb3Nlci5qc29uICgnLiRyb290UmVxdWlyZW1lbnRzWyRwYWNrYWdlXS0+Z2V0UHJldHR5Q29uc3RyYWludCgpLicpPC9lcnJvcj4nKTsKJGlvLT53cml0ZSgnPGluZm8+UnVuIGBjb21wb3NlciByZXF1aXJlICcuJHBhY2thZ2UuJ2Agb3IgYGNvbXBvc2VyIHJlcXVpcmUgJy4kcGFja2FnZS4nOicuJGNvbnN0cmFpbnQuJ2AgaW5zdGVhZCB0byByZXBsYWNlIHRoZSBjb25zdHJhaW50PC9pbmZvPicpOwpyZXR1cm4gc2VsZjo6RkFJTFVSRTsKfQp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3BhdGNoLW9ubHknKSkgewppZiAoISRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ3BhdGNoLW9ubHkgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgbG9jayBmaWxlIHByZXNlbnQnKTsKfQpmb3JlYWNoICgkY29tcG9zZXItPmdldExvY2tlcigpLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZS0+aXNEZXYoKSkgewpjb250aW51ZTsKfQppZiAoIVByZWc6OmlzTWF0Y2goJ3teKFxkK1wuXGQrXC5cZCspfScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICRtYXRjaCkpIHsKY29udGludWU7Cn0KJGNvbnN0cmFpbnQgPSAkcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCd+Jy4kbWF0Y2hbMV0pOwppZiAoaXNzZXQoJHRlbXBvcmFyeUNvbnN0cmFpbnRzWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewokdGVtcG9yYXJ5Q29uc3RyYWludHNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSBNdWx0aUNvbnN0cmFpbnQ6OmNyZWF0ZShbJHRlbXBvcmFyeUNvbnN0cmFpbnRzWyRwYWNrYWdlLT5nZXROYW1lKCldLCAkY29uc3RyYWludF0sIHRydWUpOwp9IGVsc2UgewokdGVtcG9yYXJ5Q29uc3RyYWludHNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkY29uc3RyYWludDsKfQp9Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignaW50ZXJhY3RpdmUnKSkgewokcGFja2FnZXMgPSAkdGhpcy0+Z2V0UGFja2FnZXNJbnRlcmFjdGl2ZWx5KCRpbywgJGlucHV0LCAkb3V0cHV0LCAkY29tcG9zZXIsICRwYWNrYWdlcyk7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigncm9vdC1yZXFzJykpIHsKJHJlcXVpcmVzID0gYXJyYXlfa2V5cygkcm9vdFBhY2thZ2UtPmdldFJlcXVpcmVzKCkpOwppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewokcmVxdWlyZXMgPSBhcnJheV9tZXJnZSgkcmVxdWlyZXMsIGFycmF5X2tleXMoJHJvb3RQYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKSk7Cn0KCmlmICghZW1wdHkoJHBhY2thZ2VzKSkgewokcGFja2FnZXMgPSBhcnJheV9pbnRlcnNlY3QoJHBhY2thZ2VzLCAkcmVxdWlyZXMpOwp9IGVsc2UgewokcGFja2FnZXMgPSAkcmVxdWlyZXM7Cn0KfQoKCgokZmlsdGVyZWRQYWNrYWdlcyA9IGFycmF5X2ZpbHRlcigkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoJHBhY2thZ2UpOiBib29sIHsKcmV0dXJuICFpbl9hcnJheSgkcGFja2FnZSwgWydsb2NrJywgJ25vdGhpbmcnLCAnbWlycm9ycyddLCB0cnVlKTsKfSk7CiR1cGRhdGVNaXJyb3JzID0gJGlucHV0LT5nZXRPcHRpb24oJ2xvY2snKSB8fCBjb3VudCgkZmlsdGVyZWRQYWNrYWdlcykgIT09IGNvdW50KCRwYWNrYWdlcyk7CiRwYWNrYWdlcyA9ICRmaWx0ZXJlZFBhY2thZ2VzOwoKaWYgKCR1cGRhdGVNaXJyb3JzICYmICFlbXB0eSgkcGFja2FnZXMpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPllvdSBjYW5ub3Qgc2ltdWx0YW5lb3VzbHkgdXBkYXRlIG9ubHkgYSBzZWxlY3Rpb24gb2YgcGFja2FnZXMgYW5kIHJlZ2VuZXJhdGUgdGhlIGxvY2sgZmlsZSBtZXRhZGF0YS48L2Vycm9yPicpOwoKcmV0dXJuIC0xOwp9CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICd1cGRhdGUnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPnNldE91dHB1dFByb2dyZXNzKCEkaW5wdXQtPmdldE9wdGlvbignbm8tcHJvZ3Jlc3MnKSk7CgokaW5zdGFsbCA9IEluc3RhbGxlcjo6Y3JlYXRlKCRpbywgJGNvbXBvc2VyKTsKCiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwpbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdID0gJHRoaXMtPmdldFByZWZlcnJlZEluc3RhbGxPcHRpb25zKCRjb25maWcsICRpbnB1dCk7Cgokb3B0aW1pemUgPSAkaW5wdXQtPmdldE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicpIHx8ICRjb25maWctPmdldCgnb3B0aW1pemUtYXV0b2xvYWRlcicpOwokYXV0aG9yaXRhdGl2ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykgfHwgJGNvbmZpZy0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJyk7CiRhcGN1UHJlZml4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnKTsKJGFwY3UgPSAkYXBjdVByZWZpeCAhPT0gbnVsbCB8fCAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJykgfHwgJGNvbmZpZy0+Z2V0KCdhcGN1LWF1dG9sb2FkZXInKTsKCiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfT05MWV9MSVNURUQ7CmlmICgkaW5wdXQtPmdldE9wdGlvbignd2l0aC1hbGwtZGVwZW5kZW5jaWVzJykpIHsKJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9IFJlcXVlc3Q6OlVQREFURV9MSVNURURfV0lUSF9UUkFOU0lUSVZFX0RFUFM7Cn0gZWxzZWlmICgkaW5wdXQtPmdldE9wdGlvbignd2l0aC1kZXBlbmRlbmNpZXMnKSkgewokdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQU19OT19ST09UX1JFUVVJUkU7Cn0KCiRpbnN0YWxsCi0+c2V0RHJ5UnVuKCRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykpCi0+c2V0VmVyYm9zZSgkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKQotPnNldFByZWZlclNvdXJjZSgkcHJlZmVyU291cmNlKQotPnNldFByZWZlckRpc3QoJHByZWZlckRpc3QpCi0+c2V0RGV2TW9kZSghJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKQotPnNldER1bXBBdXRvbG9hZGVyKCEkaW5wdXQtPmdldE9wdGlvbignbm8tYXV0b2xvYWRlcicpKQotPnNldE9wdGltaXplQXV0b2xvYWRlcigkb3B0aW1pemUpCi0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRhdXRob3JpdGF0aXZlKQotPnNldEFwY3VBdXRvbG9hZGVyKCRhcGN1LCAkYXBjdVByZWZpeCkKLT5zZXRVcGRhdGUodHJ1ZSkKLT5zZXRJbnN0YWxsKCEkaW5wdXQtPmdldE9wdGlvbignbm8taW5zdGFsbCcpKQotPnNldFVwZGF0ZU1pcnJvcnMoJHVwZGF0ZU1pcnJvcnMpCi0+c2V0VXBkYXRlQWxsb3dMaXN0KCRwYWNrYWdlcykKLT5zZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMoJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcykKLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCkpCi0+c2V0UHJlZmVyU3RhYmxlKCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItc3RhYmxlJykpCi0+c2V0UHJlZmVyTG93ZXN0KCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItbG93ZXN0JykpCi0+c2V0VGVtcG9yYXJ5Q29uc3RyYWludHMoJHRlbXBvcmFyeUNvbnN0cmFpbnRzKQotPnNldEF1ZGl0KCEkaW5wdXQtPmdldE9wdGlvbignbm8tYXVkaXQnKSkKLT5zZXRBdWRpdEZvcm1hdCgkdGhpcy0+Z2V0QXVkaXRGb3JtYXQoJGlucHV0KSkKLT5zZXRNaW5pbWFsVXBkYXRlKCRpbnB1dC0+Z2V0T3B0aW9uKCdtaW5pbWFsLWNoYW5nZXMnKSkKOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1wbHVnaW5zJykpIHsKJGluc3RhbGwtPmRpc2FibGVQbHVnaW5zKCk7Cn0KCiRyZXN1bHQgPSAkaW5zdGFsbC0+cnVuKCk7CgppZiAoJHJlc3VsdCA9PT0gMCAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ2xvY2snKSkgewokYnVtcEFmdGVyVXBkYXRlID0gJGlucHV0LT5nZXRPcHRpb24oJ2J1bXAtYWZ0ZXItdXBkYXRlJyk7CmlmIChmYWxzZSA9PT0gJGJ1bXBBZnRlclVwZGF0ZSkgewokYnVtcEFmdGVyVXBkYXRlID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdidW1wLWFmdGVyLXVwZGF0ZScpOwp9CgppZiAoZmFsc2UgIT09ICRidW1wQWZ0ZXJVcGRhdGUpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5CdW1waW5nIGRlcGVuZGVuY2llczwvaW5mbz4nKTsKJGJ1bXBDb21tYW5kID0gbmV3IEJ1bXBDb21tYW5kKCk7CiRidW1wQ29tbWFuZC0+c2V0Q29tcG9zZXIoJGNvbXBvc2VyKTsKJHJlc3VsdCA9ICRidW1wQ29tbWFuZC0+ZG9CdW1wKAokaW8sCiRidW1wQWZ0ZXJVcGRhdGUgPT09ICdkZXYnLAokYnVtcEFmdGVyVXBkYXRlID09PSAnbm8tZGV2JywKJGlucHV0LT5nZXRPcHRpb24oJ2RyeS1ydW4nKSwKJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKQopOwp9Cn0KcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFBhY2thZ2VzSW50ZXJhY3RpdmVseShJT0ludGVyZmFjZSAkaW8sIElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIENvbXBvc2VyICRjb21wb3NlciwgYXJyYXkgJHBhY2thZ2VzKTogYXJyYXkKewppZiAoISRpbnB1dC0+aXNJbnRlcmFjdGl2ZSgpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCctLWludGVyYWN0aXZlIGNhbm5vdCBiZSB1c2VkIGluIG5vbi1pbnRlcmFjdGl2ZSB0ZXJtaW5hbHMuJyk7Cn0KCiRwbGF0Zm9ybVJlcUZpbHRlciA9ICR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCk7CiRzdGFiaWxpdHlGbGFncyA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRTdGFiaWxpdHlGbGFncygpOwokcmVxdWlyZXMgPSBhcnJheV9tZXJnZSgKJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFJlcXVpcmVzKCksCiRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXREZXZSZXF1aXJlcygpCik7CgokZmlsdGVyID0gXGNvdW50KCRwYWNrYWdlcykgPiAwID8gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lc1RvUmVnZXhwKCRwYWNrYWdlcykgOiBudWxsOwoKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5Mb2FkaW5nIHBhY2thZ2VzIHRoYXQgY2FuIGJlIHVwZGF0ZWQuLi48L2luZm8+Jyk7CiRhdXRvY29tcGxldGVyVmFsdWVzID0gW107CiRpbnN0YWxsZWRQYWNrYWdlcyA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkgPyAkY29tcG9zZXItPmdldExvY2tlcigpLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpLT5nZXRQYWNrYWdlcygpIDogJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKS0+Z2V0UGFja2FnZXMoKTsKJHZlcnNpb25TZWxlY3RvciA9ICR0aGlzLT5jcmVhdGVWZXJzaW9uU2VsZWN0b3IoJGNvbXBvc2VyKTsKZm9yZWFjaCAoJGluc3RhbGxlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkZmlsdGVyICE9PSBudWxsICYmICFQcmVnOjppc01hdGNoKCRmaWx0ZXIsICRwYWNrYWdlLT5nZXROYW1lKCkpKSB7CmNvbnRpbnVlOwp9CiRjdXJyZW50VmVyc2lvbiA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7CiRjb25zdHJhaW50ID0gaXNzZXQoJHJlcXVpcmVzWyRwYWNrYWdlLT5nZXROYW1lKCldKSA/ICRyZXF1aXJlc1skcGFja2FnZS0+Z2V0TmFtZSgpXS0+Z2V0UHJldHR5Q29uc3RyYWludCgpIDogbnVsbDsKJHN0YWJpbGl0eSA9IGlzc2V0KCRzdGFiaWxpdHlGbGFnc1skcGFja2FnZS0+Z2V0TmFtZSgpXSkgPyAoc3RyaW5nKSBhcnJheV9zZWFyY2goJHN0YWJpbGl0eUZsYWdzWyRwYWNrYWdlLT5nZXROYW1lKCldLCBCYXNlUGFja2FnZTo6U1RBQklMSVRJRVMsIHRydWUpIDogJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldE1pbmltdW1TdGFiaWxpdHkoKTsKJGxhdGVzdFZlcnNpb24gPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkY29uc3RyYWludCwgJHN0YWJpbGl0eSwgJHBsYXRmb3JtUmVxRmlsdGVyKTsKaWYgKCRsYXRlc3RWZXJzaW9uICE9PSBmYWxzZSAmJiAoJHBhY2thZ2UtPmdldFZlcnNpb24oKSAhPT0gJGxhdGVzdFZlcnNpb24tPmdldFZlcnNpb24oKSB8fCAkbGF0ZXN0VmVyc2lvbi0+aXNEZXYoKSkpIHsKJGF1dG9jb21wbGV0ZXJWYWx1ZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAnPGNvbW1lbnQ+JyAuICRjdXJyZW50VmVyc2lvbiAuICc8L2NvbW1lbnQ+ID0+IDxjb21tZW50PicgLiAkbGF0ZXN0VmVyc2lvbi0+Z2V0UHJldHR5VmVyc2lvbigpIC4gJzwvY29tbWVudD4nOwp9Cn0KaWYgKDAgPT09IFxjb3VudCgkaW5zdGFsbGVkUGFja2FnZXMpKSB7CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxID0+ICRjb25zdHJhaW50KSB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXEpKSB7CmNvbnRpbnVlOwp9CiRhdXRvY29tcGxldGVyVmFsdWVzWyRyZXFdID0gJyc7Cn0KfQoKaWYgKDAgPT09IFxjb3VudCgkYXV0b2NvbXBsZXRlclZhbHVlcykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZmluZCBhbnkgcGFja2FnZSB3aXRoIG5ldyB2ZXJzaW9ucyBhdmFpbGFibGUnKTsKfQoKJHBhY2thZ2VzID0gJGlvLT5zZWxlY3QoCidTZWxlY3QgcGFja2FnZXM6IChTZWxlY3QgbW9yZSB0aGFuIG9uZSB2YWx1ZSBzZXBhcmF0ZWQgYnkgY29tbWEpICcsCiRhdXRvY29tcGxldGVyVmFsdWVzLApmYWxzZSwKMSwKJ05vIHBhY2thZ2UgbmFtZWQgIiVzIiBpcyBpbnN0YWxsZWQuJywKdHJ1ZQopOwoKJHRhYmxlID0gbmV3IFRhYmxlKCRvdXRwdXQpOwokdGFibGUtPnNldEhlYWRlcnMoWydTZWxlY3RlZCBwYWNrYWdlcyddKTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiR0YWJsZS0+YWRkUm93KFskcGFja2FnZV0pOwp9CiR0YWJsZS0+cmVuZGVyKCk7CgppZiAoJGlvLT5hc2tDb25maXJtYXRpb24oc3ByaW50ZigKJ1dvdWxkIHlvdSBsaWtlIHRvIGNvbnRpbnVlIGFuZCB1cGRhdGUgdGhlIGFib3ZlIHBhY2thZ2UlcyBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcsCjEgPT09IGNvdW50KCRwYWNrYWdlcykgPyAnJyA6ICdzJwopKSkgewpyZXR1cm4gJHBhY2thZ2VzOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0luc3RhbGxhdGlvbiBhYm9ydGVkLicpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVZlcnNpb25TZWxlY3RvcihDb21wb3NlciAkY29tcG9zZXIpOiBWZXJzaW9uU2VsZWN0b3IKewokcmVwb3NpdG9yeVNldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCk7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KGFycmF5X2ZpbHRlcigkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpLCBmdW5jdGlvbiAoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwb3NpdG9yeSkgewpyZXR1cm4gISRyZXBvc2l0b3J5IGluc3RhbmNlb2YgUGxhdGZvcm1SZXBvc2l0b3J5Owp9KSkpOwoKcmV0dXJuIG5ldyBWZXJzaW9uU2VsZWN0b3IoJHJlcG9zaXRvcnlTZXQpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcVmFsaWRhdGluZ0FycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFV0aWxcQ29uZmlnVmFsaWRhdG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCgpjbGFzcyBWYWxpZGF0ZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgndmFsaWRhdGUnKQotPnNldERlc2NyaXB0aW9uKCdWYWxpZGF0ZXMgYSBjb21wb3Nlci5qc29uIGFuZCBjb21wb3Nlci5sb2NrJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCduby1jaGVjay1hbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCB2YWxpZGF0ZSByZXF1aXJlcyBmb3Igb3Zlcmx5IHN0cmljdC9sb29zZSBjb25zdHJhaW50cycpLApuZXcgSW5wdXRPcHRpb24oJ2NoZWNrLWxvY2snLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0NoZWNrIGlmIGxvY2sgZmlsZSBpcyB1cCB0byBkYXRlIChldmVuIHdoZW4gY29uZmlnLmxvY2sgaXMgZmFsc2UpJyksCm5ldyBJbnB1dE9wdGlvbignbm8tY2hlY2stbG9jaycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IGNoZWNrIGlmIGxvY2sgZmlsZSBpcyB1cCB0byBkYXRlJyksCm5ldyBJbnB1dE9wdGlvbignbm8tY2hlY2stcHVibGlzaCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IGNoZWNrIGZvciBwdWJsaXNoIGVycm9ycycpLApuZXcgSW5wdXRPcHRpb24oJ25vLWNoZWNrLXZlcnNpb24nLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCByZXBvcnQgYSB3YXJuaW5nIGlmIHRoZSB2ZXJzaW9uIGZpZWxkIGlzIHByZXNlbnQnKSwKbmV3IElucHV0T3B0aW9uKCd3aXRoLWRlcGVuZGVuY2llcycsICdBJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBbHNvIHZhbGlkYXRlIHRoZSBjb21wb3Nlci5qc29uIG9mIGFsbCBpbnN0YWxsZWQgZGVwZW5kZW5jaWVzJyksCm5ldyBJbnB1dE9wdGlvbignc3RyaWN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgZm9yIHdhcm5pbmdzIGFzIHdlbGwgYXMgZXJyb3JzJyksCm5ldyBJbnB1dEFyZ3VtZW50KCdmaWxlJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdwYXRoIHRvIGNvbXBvc2VyLmpzb24gZmlsZScpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgdmFsaWRhdGUgY29tbWFuZCB2YWxpZGF0ZXMgYSBnaXZlbiBjb21wb3Nlci5qc29uIGFuZCBjb21wb3Nlci5sb2NrCgpFeGl0IGNvZGVzIGluIGNhc2Ugb2YgZXJyb3JzIGFyZToKMSB2YWxpZGF0aW9uIHdhcm5pbmcocyksIG9ubHkgd2hlbiAtLXN0cmljdCBpcyBnaXZlbgoyIHZhbGlkYXRpb24gZXJyb3IocykKMyBmaWxlIHVucmVhZGFibGUgb3IgbWlzc2luZwoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjdmFsaWRhdGUKRU9UCik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokZmlsZSA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2ZpbGUnKSA/PyBGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoIWZpbGVfZXhpc3RzKCRmaWxlKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nIC4gJGZpbGUgLiAnIG5vdCBmb3VuZC48L2Vycm9yPicpOwoKcmV0dXJuIDM7Cn0KaWYgKCFGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRmaWxlKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nIC4gJGZpbGUgLiAnIGlzIG5vdCByZWFkYWJsZS48L2Vycm9yPicpOwoKcmV0dXJuIDM7Cn0KCiR2YWxpZGF0b3IgPSBuZXcgQ29uZmlnVmFsaWRhdG9yKCRpbyk7CiRjaGVja0FsbCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCduby1jaGVjay1hbGwnKSA/IDAgOiBWYWxpZGF0aW5nQXJyYXlMb2FkZXI6OkNIRUNLX0FMTDsKJGNoZWNrUHVibGlzaCA9ICEkaW5wdXQtPmdldE9wdGlvbignbm8tY2hlY2stcHVibGlzaCcpOwokY2hlY2tMb2NrID0gISRpbnB1dC0+Z2V0T3B0aW9uKCduby1jaGVjay1sb2NrJyk7CiRjaGVja1ZlcnNpb24gPSAkaW5wdXQtPmdldE9wdGlvbignbm8tY2hlY2stdmVyc2lvbicpID8gMCA6IENvbmZpZ1ZhbGlkYXRvcjo6Q0hFQ0tfVkVSU0lPTjsKJGlzU3RyaWN0ID0gJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdCcpOwpbJGVycm9ycywgJHB1Ymxpc2hFcnJvcnMsICR3YXJuaW5nc10gPSAkdmFsaWRhdG9yLT52YWxpZGF0ZSgkZmlsZSwgJGNoZWNrQWxsLCAkY2hlY2tWZXJzaW9uKTsKCiRsb2NrRXJyb3JzID0gW107CiRjb21wb3NlciA9ICR0aGlzLT5jcmVhdGVDb21wb3Nlckluc3RhbmNlKCRpbnB1dCwgJGlvLCAkZmlsZSk7CgokY2hlY2tMb2NrID0gKCRjaGVja0xvY2sgJiYgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdsb2NrJykpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdjaGVjay1sb2NrJyk7CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSAmJiAhJGxvY2tlci0+aXNGcmVzaCgpKSB7CiRsb2NrRXJyb3JzW10gPSAnLSBUaGUgbG9jayBmaWxlIGlzIG5vdCB1cCB0byBkYXRlIHdpdGggdGhlIGxhdGVzdCBjaGFuZ2VzIGluIGNvbXBvc2VyLmpzb24sIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHJ1biBgY29tcG9zZXIgdXBkYXRlYCBvciBgY29tcG9zZXIgdXBkYXRlIDxwYWNrYWdlIG5hbWU+YC4nOwp9CgppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSkgewokbG9ja0Vycm9ycyA9IGFycmF5X21lcmdlKCRsb2NrRXJyb3JzLCAkbG9ja2VyLT5nZXRNaXNzaW5nUmVxdWlyZW1lbnRJbmZvKCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLCB0cnVlKSk7Cn0KCiR0aGlzLT5vdXRwdXRSZXN1bHQoJGlvLCAkZmlsZSwgJGVycm9ycywgJHdhcm5pbmdzLCAkY2hlY2tQdWJsaXNoLCAkcHVibGlzaEVycm9ycywgJGNoZWNrTG9jaywgJGxvY2tFcnJvcnMsIHRydWUpOwoKCiRleGl0Q29kZSA9IGNvdW50KCRlcnJvcnMpID4gMCA/IDIgOiAoKCRpc1N0cmljdCAmJiBjb3VudCgkd2FybmluZ3MpID4gMCkgPyAxIDogMCk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3dpdGgtZGVwZW5kZW5jaWVzJykpIHsKJGxvY2FsUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CmZvcmVhY2ggKCRsb2NhbFJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJHBhdGggPSAkY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwppZiAobnVsbCA9PT0gJHBhdGgpIHsKY29udGludWU7Cn0KJGZpbGUgPSAkcGF0aCAuICcvY29tcG9zZXIuanNvbic7CmlmIChpc19kaXIoJHBhdGgpICYmIGZpbGVfZXhpc3RzKCRmaWxlKSkgewpbJGVycm9ycywgJHB1Ymxpc2hFcnJvcnMsICR3YXJuaW5nc10gPSAkdmFsaWRhdG9yLT52YWxpZGF0ZSgkZmlsZSwgJGNoZWNrQWxsLCAkY2hlY2tWZXJzaW9uKTsKCiR0aGlzLT5vdXRwdXRSZXN1bHQoJGlvLCAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLCAkZXJyb3JzLCAkd2FybmluZ3MsICRjaGVja1B1Ymxpc2gsICRwdWJsaXNoRXJyb3JzKTsKCgokZGVwQ29kZSA9IGNvdW50KCRlcnJvcnMpID4gMCA/IDIgOiAoKCRpc1N0cmljdCAmJiBjb3VudCgkd2FybmluZ3MpID4gMCkgPyAxIDogMCk7CiRleGl0Q29kZSA9IG1heCgkZGVwQ29kZSwgJGV4aXRDb2RlKTsKfQp9Cn0KCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ3ZhbGlkYXRlJywgJGlucHV0LCAkb3V0cHV0KTsKJGV2ZW50Q29kZSA9ICRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7CgpyZXR1cm4gbWF4KCRldmVudENvZGUsICRleGl0Q29kZSk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0UmVzdWx0KElPSW50ZXJmYWNlICRpbywgc3RyaW5nICRuYW1lLCBhcnJheSAmJGVycm9ycywgYXJyYXkgJiR3YXJuaW5ncywgYm9vbCAkY2hlY2tQdWJsaXNoID0gZmFsc2UsIGFycmF5ICRwdWJsaXNoRXJyb3JzID0gW10sIGJvb2wgJGNoZWNrTG9jayA9IGZhbHNlLCBhcnJheSAkbG9ja0Vycm9ycyA9IFtdLCBib29sICRwcmludFNjaGVtYVVybCA9IGZhbHNlKTogdm9pZAp7CiRkb1ByaW50U2NoZW1hVXJsID0gZmFsc2U7CgppZiAoXGNvdW50KCRlcnJvcnMpID4gMCkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nIC4gJG5hbWUgLiAnIGlzIGludmFsaWQsIHRoZSBmb2xsb3dpbmcgZXJyb3JzL3dhcm5pbmdzIHdlcmUgZm91bmQ6PC9lcnJvcj4nKTsKfSBlbHNlaWYgKFxjb3VudCgkcHVibGlzaEVycm9ycykgPiAwICYmICRjaGVja1B1Ymxpc2gpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz4nIC4gJG5hbWUgLiAnIGlzIHZhbGlkIGZvciBzaW1wbGUgdXNhZ2Ugd2l0aCBDb21wb3NlciBidXQgaGFzPC9pbmZvPicpOwokaW8tPndyaXRlRXJyb3IoJzxpbmZvPnN0cmljdCBlcnJvcnMgdGhhdCBtYWtlIGl0IHVuYWJsZSB0byBiZSBwdWJsaXNoZWQgYXMgYSBwYWNrYWdlPC9pbmZvPicpOwokZG9QcmludFNjaGVtYVVybCA9ICRwcmludFNjaGVtYVVybDsKfSBlbHNlaWYgKFxjb3VudCgkd2FybmluZ3MpID4gMCkgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPicgLiAkbmFtZSAuICcgaXMgdmFsaWQsIGJ1dCB3aXRoIGEgZmV3IHdhcm5pbmdzPC9pbmZvPicpOwokZG9QcmludFNjaGVtYVVybCA9ICRwcmludFNjaGVtYVVybDsKfSBlbHNlaWYgKFxjb3VudCgkbG9ja0Vycm9ycykgPiAwKSB7CiRpby0+d3JpdGUoJzxpbmZvPicgLiAkbmFtZSAuICcgaXMgdmFsaWQgYnV0IHlvdXIgY29tcG9zZXIubG9jayBoYXMgc29tZSAnLigkY2hlY2tMb2NrID8gJ2Vycm9ycycgOiAnd2FybmluZ3MnKS4nPC9pbmZvPicpOwp9IGVsc2UgewokaW8tPndyaXRlKCc8aW5mbz4nIC4gJG5hbWUgLiAnIGlzIHZhbGlkPC9pbmZvPicpOwp9CgppZiAoJGRvUHJpbnRTY2hlbWFVcmwpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5TZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA0LXNjaGVtYS5tZCBmb3IgZGV0YWlscyBvbiB0aGUgc2NoZW1hPC93YXJuaW5nPicpOwp9CgppZiAoXGNvdW50KCRlcnJvcnMpID4gMCkgewokZXJyb3JzID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGVycik6IHN0cmluZyB7CnJldHVybiAnLSAnIC4gJGVycjsKfSwgJGVycm9ycyk7CmFycmF5X3Vuc2hpZnQoJGVycm9ycywgJyMgR2VuZXJhbCBlcnJvcnMnKTsKfQppZiAoXGNvdW50KCR3YXJuaW5ncykgPiAwKSB7CiR3YXJuaW5ncyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRlcnIpOiBzdHJpbmcgewpyZXR1cm4gJy0gJyAuICRlcnI7Cn0sICR3YXJuaW5ncyk7CmFycmF5X3Vuc2hpZnQoJHdhcm5pbmdzLCAnIyBHZW5lcmFsIHdhcm5pbmdzJyk7Cn0KCgokZXh0cmFXYXJuaW5ncyA9IFtdOwoKCmlmIChcY291bnQoJHB1Ymxpc2hFcnJvcnMpID4gMCAmJiAkY2hlY2tQdWJsaXNoKSB7CiRwdWJsaXNoRXJyb3JzID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGVycik6IHN0cmluZyB7CnJldHVybiAnLSAnIC4gJGVycjsKfSwgJHB1Ymxpc2hFcnJvcnMpOwoKYXJyYXlfdW5zaGlmdCgkcHVibGlzaEVycm9ycywgJyMgUHVibGlzaCBlcnJvcnMnKTsKJGVycm9ycyA9IGFycmF5X21lcmdlKCRlcnJvcnMsICRwdWJsaXNoRXJyb3JzKTsKfQoKCmlmIChcY291bnQoJGxvY2tFcnJvcnMpID4gMCkgewppZiAoJGNoZWNrTG9jaykgewphcnJheV91bnNoaWZ0KCRsb2NrRXJyb3JzLCAnIyBMb2NrIGZpbGUgZXJyb3JzJyk7CiRlcnJvcnMgPSBhcnJheV9tZXJnZSgkZXJyb3JzLCAkbG9ja0Vycm9ycyk7Cn0gZWxzZSB7CmFycmF5X3Vuc2hpZnQoJGxvY2tFcnJvcnMsICcjIExvY2sgZmlsZSB3YXJuaW5ncycpOwokZXh0cmFXYXJuaW5ncyA9IGFycmF5X21lcmdlKCRleHRyYVdhcm5pbmdzLCAkbG9ja0Vycm9ycyk7Cn0KfQoKJG1lc3NhZ2VzID0gWwonZXJyb3InID0+ICRlcnJvcnMsCid3YXJuaW5nJyA9PiBhcnJheV9tZXJnZSgkd2FybmluZ3MsICRleHRyYVdhcm5pbmdzKSwKXTsKCmZvcmVhY2ggKCRtZXNzYWdlcyBhcyAkc3R5bGUgPT4gJG1zZ3MpIHsKZm9yZWFjaCAoJG1zZ3MgYXMgJG1zZykgewppZiAoc3RycG9zKCRtc2csICcjJykgPT09IDApIHsKJGlvLT53cml0ZUVycm9yKCc8JyAuICRzdHlsZSAuICc+JyAuICRtc2cgLiAnPC8nIC4gJHN0eWxlIC4gJz4nKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCRtc2cpOwp9Cn0KfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9ja2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbk1hbmFnZXI7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXERvd25sb2FkTWFuYWdlcjsKdXNlIENvbXBvc2VyXEF1dG9sb2FkXEF1dG9sb2FkR2VuZXJhdG9yOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlclxBcmNoaXZlTWFuYWdlcjsKCgoKCgoKY2xhc3MgQ29tcG9zZXIgZXh0ZW5kcyBQYXJ0aWFsQ29tcG9zZXIKewoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGNvbnN0IFZFUlNJT04gPSAnMi44LjknOwpwdWJsaWMgY29uc3QgQlJBTkNIX0FMSUFTX1ZFUlNJT04gPSAnJzsKcHVibGljIGNvbnN0IFJFTEVBU0VfREFURSA9ICcyMDI1LTA1LTEzIDE0OjAxOjM3JzsKcHVibGljIGNvbnN0IFNPVVJDRV9WRVJTSU9OID0gJyc7CgoKCgoKCgoKCgpwdWJsaWMgY29uc3QgUlVOVElNRV9BUElfVkVSU0lPTiA9ICcyLjIuMic7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nCnsKCmlmIChzZWxmOjpWRVJTSU9OID09PSAnQHBhY2thZ2VfdmVyc2lvbicuJ0AnKSB7CnJldHVybiBzZWxmOjpTT1VSQ0VfVkVSU0lPTjsKfQoKCmlmIChzZWxmOjpCUkFOQ0hfQUxJQVNfVkVSU0lPTiAhPT0gJycgJiYgUHJlZzo6aXNNYXRjaCgne15bYS1mMC05XXs0MH0kfScsIHNlbGY6OlZFUlNJT04pKSB7CnJldHVybiBzZWxmOjpCUkFOQ0hfQUxJQVNfVkVSU0lPTi4nKycuc2VsZjo6VkVSU0lPTjsKfQoKcmV0dXJuIHNlbGY6OlZFUlNJT047Cn0KCgoKCnByaXZhdGUgJGxvY2tlcjsKCgoKCnByaXZhdGUgJGRvd25sb2FkTWFuYWdlcjsKCgoKCnByaXZhdGUgJHBsdWdpbk1hbmFnZXI7CgoKCgpwcml2YXRlICRhdXRvbG9hZEdlbmVyYXRvcjsKCgoKCnByaXZhdGUgJGFyY2hpdmVNYW5hZ2VyOwoKcHVibGljIGZ1bmN0aW9uIHNldExvY2tlcihMb2NrZXIgJGxvY2tlcik6IHZvaWQKewokdGhpcy0+bG9ja2VyID0gJGxvY2tlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldExvY2tlcigpOiBMb2NrZXIKewpyZXR1cm4gJHRoaXMtPmxvY2tlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldERvd25sb2FkTWFuYWdlcihEb3dubG9hZE1hbmFnZXIgJG1hbmFnZXIpOiB2b2lkCnsKJHRoaXMtPmRvd25sb2FkTWFuYWdlciA9ICRtYW5hZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RG93bmxvYWRNYW5hZ2VyKCk6IERvd25sb2FkTWFuYWdlcgp7CnJldHVybiAkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QXJjaGl2ZU1hbmFnZXIoQXJjaGl2ZU1hbmFnZXIgJG1hbmFnZXIpOiB2b2lkCnsKJHRoaXMtPmFyY2hpdmVNYW5hZ2VyID0gJG1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmNoaXZlTWFuYWdlcigpOiBBcmNoaXZlTWFuYWdlcgp7CnJldHVybiAkdGhpcy0+YXJjaGl2ZU1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRQbHVnaW5NYW5hZ2VyKFBsdWdpbk1hbmFnZXIgJG1hbmFnZXIpOiB2b2lkCnsKJHRoaXMtPnBsdWdpbk1hbmFnZXIgPSAkbWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFBsdWdpbk1hbmFnZXIoKTogUGx1Z2luTWFuYWdlcgp7CnJldHVybiAkdGhpcy0+cGx1Z2luTWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9sb2FkR2VuZXJhdG9yKEF1dG9sb2FkR2VuZXJhdG9yICRhdXRvbG9hZEdlbmVyYXRvcik6IHZvaWQKewokdGhpcy0+YXV0b2xvYWRHZW5lcmF0b3IgPSAkYXV0b2xvYWRHZW5lcmF0b3I7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRvbG9hZEdlbmVyYXRvcigpOiBBdXRvbG9hZEdlbmVyYXRvcgp7CnJldHVybiAkdGhpcy0+YXV0b2xvYWRHZW5lcmF0b3I7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXI7Cgp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKdXNlIENvbXBvc2VyXENvbmZpZ1xDb25maWdTb3VyY2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwoKCgoKY2xhc3MgQ29uZmlnCnsKcHVibGljIGNvbnN0IFNPVVJDRV9ERUZBVUxUID0gJ2RlZmF1bHQnOwpwdWJsaWMgY29uc3QgU09VUkNFX0NPTU1BTkQgPSAnY29tbWFuZCc7CnB1YmxpYyBjb25zdCBTT1VSQ0VfVU5LTk9XTiA9ICd1bmtub3duJzsKCnB1YmxpYyBjb25zdCBSRUxBVElWRV9QQVRIUyA9IDE7CgoKcHVibGljIHN0YXRpYyAkZGVmYXVsdENvbmZpZyA9IFsKJ3Byb2Nlc3MtdGltZW91dCcgPT4gMzAwLAondXNlLWluY2x1ZGUtcGF0aCcgPT4gZmFsc2UsCidhbGxvdy1wbHVnaW5zJyA9PiBbXSwKJ3VzZS1wYXJlbnQtZGlyJyA9PiAncHJvbXB0JywKJ3ByZWZlcnJlZC1pbnN0YWxsJyA9PiAnZGlzdCcsCidhdWRpdCcgPT4gWydpZ25vcmUnID0+IFtdLCAnYWJhbmRvbmVkJyA9PiBBdWRpdG9yOjpBQkFORE9ORURfRkFJTF0sCidub3RpZnktb24taW5zdGFsbCcgPT4gdHJ1ZSwKJ2dpdGh1Yi1wcm90b2NvbHMnID0+IFsnaHR0cHMnLCAnc3NoJywgJ2dpdCddLAonZ2l0bGFiLXByb3RvY29sJyA9PiBudWxsLAondmVuZG9yLWRpcicgPT4gJ3ZlbmRvcicsCidiaW4tZGlyJyA9PiAneyR2ZW5kb3ItZGlyfS9iaW4nLAonY2FjaGUtZGlyJyA9PiAneyRob21lfS9jYWNoZScsCidkYXRhLWRpcicgPT4gJ3skaG9tZX0nLAonY2FjaGUtZmlsZXMtZGlyJyA9PiAneyRjYWNoZS1kaXJ9L2ZpbGVzJywKJ2NhY2hlLXJlcG8tZGlyJyA9PiAneyRjYWNoZS1kaXJ9L3JlcG8nLAonY2FjaGUtdmNzLWRpcicgPT4gJ3skY2FjaGUtZGlyfS92Y3MnLAonY2FjaGUtdHRsJyA9PiAxNTU1MjAwMCwgCidjYWNoZS1maWxlcy10dGwnID0+IG51bGwsIAonY2FjaGUtZmlsZXMtbWF4c2l6ZScgPT4gJzMwME1pQicsCidjYWNoZS1yZWFkLW9ubHknID0+IGZhbHNlLAonYmluLWNvbXBhdCcgPT4gJ2F1dG8nLAonZGlzY2FyZC1jaGFuZ2VzJyA9PiBmYWxzZSwKJ2F1dG9sb2FkZXItc3VmZml4JyA9PiBudWxsLAonc29ydC1wYWNrYWdlcycgPT4gZmFsc2UsCidvcHRpbWl6ZS1hdXRvbG9hZGVyJyA9PiBmYWxzZSwKJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnID0+IGZhbHNlLAonYXBjdS1hdXRvbG9hZGVyJyA9PiBmYWxzZSwKJ3ByZXBlbmQtYXV0b2xvYWRlcicgPT4gdHJ1ZSwKJ2dpdGh1Yi1kb21haW5zJyA9PiBbJ2dpdGh1Yi5jb20nXSwKJ2JpdGJ1Y2tldC1leHBvc2UtaG9zdG5hbWUnID0+IHRydWUsCidkaXNhYmxlLXRscycgPT4gZmFsc2UsCidzZWN1cmUtaHR0cCcgPT4gdHJ1ZSwKJ3NlY3VyZS1zdm4tZG9tYWlucycgPT4gW10sCidjYWZpbGUnID0+IG51bGwsCidjYXBhdGgnID0+IG51bGwsCidnaXRodWItZXhwb3NlLWhvc3RuYW1lJyA9PiB0cnVlLAonZ2l0bGFiLWRvbWFpbnMnID0+IFsnZ2l0bGFiLmNvbSddLAonc3RvcmUtYXV0aHMnID0+ICdwcm9tcHQnLAoncGxhdGZvcm0nID0+IFtdLAonYXJjaGl2ZS1mb3JtYXQnID0+ICd0YXInLAonYXJjaGl2ZS1kaXInID0+ICcuJywKJ2h0YWNjZXNzLXByb3RlY3QnID0+IHRydWUsCid1c2UtZ2l0aHViLWFwaScgPT4gdHJ1ZSwKJ2xvY2snID0+IHRydWUsCidwbGF0Zm9ybS1jaGVjaycgPT4gJ3BocC1vbmx5JywKJ2JpdGJ1Y2tldC1vYXV0aCcgPT4gW10sCidnaXRodWItb2F1dGgnID0+IFtdLAonZ2l0bGFiLW9hdXRoJyA9PiBbXSwKJ2dpdGxhYi10b2tlbicgPT4gW10sCidodHRwLWJhc2ljJyA9PiBbXSwKJ2JlYXJlcicgPT4gW10sCididW1wLWFmdGVyLXVwZGF0ZScgPT4gZmFsc2UsCidhbGxvdy1taXNzaW5nLXJlcXVpcmVtZW50cycgPT4gZmFsc2UsCl07CgoKcHVibGljIHN0YXRpYyAkZGVmYXVsdFJlcG9zaXRvcmllcyA9IFsKJ3BhY2thZ2lzdC5vcmcnID0+IFsKJ3R5cGUnID0+ICdjb21wb3NlcicsCid1cmwnID0+ICdodHRwczovL3JlcG8ucGFja2FnaXN0Lm9yZycsCl0sCl07CgoKcHJpdmF0ZSAkY29uZmlnOwoKcHJpdmF0ZSAkYmFzZURpcjsKCnByaXZhdGUgJHJlcG9zaXRvcmllczsKCnByaXZhdGUgJGNvbmZpZ1NvdXJjZTsKCnByaXZhdGUgJGF1dGhDb25maWdTb3VyY2U7Cgpwcml2YXRlICRsb2NhbEF1dGhDb25maWdTb3VyY2UgPSBudWxsOwoKcHJpdmF0ZSAkdXNlRW52aXJvbm1lbnQ7Cgpwcml2YXRlICR3YXJuZWRIb3N0cyA9IFtdOwoKcHJpdmF0ZSAkc3NsVmVyaWZ5V2FybmVkSG9zdHMgPSBbXTsKCnByaXZhdGUgJHNvdXJjZU9mQ29uZmlnVmFsdWUgPSBbXTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYm9vbCAkdXNlRW52aXJvbm1lbnQgPSB0cnVlLCA/c3RyaW5nICRiYXNlRGlyID0gbnVsbCkKewoKJHRoaXMtPmNvbmZpZyA9IHN0YXRpYzo6JGRlZmF1bHRDb25maWc7CgokdGhpcy0+cmVwb3NpdG9yaWVzID0gc3RhdGljOjokZGVmYXVsdFJlcG9zaXRvcmllczsKJHRoaXMtPnVzZUVudmlyb25tZW50ID0gJHVzZUVudmlyb25tZW50OwokdGhpcy0+YmFzZURpciA9IGlzX3N0cmluZygkYmFzZURpcikgJiYgJycgIT09ICRiYXNlRGlyID8gJGJhc2VEaXIgOiBudWxsOwoKZm9yZWFjaCAoJHRoaXMtPmNvbmZpZyBhcyAkY29uZmlnS2V5ID0+ICRjb25maWdWYWx1ZSkgewokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkY29uZmlnVmFsdWUsICRjb25maWdLZXksIHNlbGY6OlNPVVJDRV9ERUZBVUxUKTsKfQoKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkY29uZmlnS2V5ID0+ICRjb25maWdWYWx1ZSkgewokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkY29uZmlnVmFsdWUsICdyZXBvc2l0b3JpZXMuJyAuICRjb25maWdLZXksIHNlbGY6OlNPVVJDRV9ERUZBVUxUKTsKfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJhc2VEaXIoP3N0cmluZyAkYmFzZURpcik6IHZvaWQKewokdGhpcy0+YmFzZURpciA9ICRiYXNlRGlyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmlnU291cmNlKENvbmZpZ1NvdXJjZUludGVyZmFjZSAkc291cmNlKTogdm9pZAp7CiR0aGlzLT5jb25maWdTb3VyY2UgPSAkc291cmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmlnU291cmNlKCk6IENvbmZpZ1NvdXJjZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+Y29uZmlnU291cmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0aENvbmZpZ1NvdXJjZShDb25maWdTb3VyY2VJbnRlcmZhY2UgJHNvdXJjZSk6IHZvaWQKewokdGhpcy0+YXV0aENvbmZpZ1NvdXJjZSA9ICRzb3VyY2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRoQ29uZmlnU291cmNlKCk6IENvbmZpZ1NvdXJjZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+YXV0aENvbmZpZ1NvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldExvY2FsQXV0aENvbmZpZ1NvdXJjZShDb25maWdTb3VyY2VJbnRlcmZhY2UgJHNvdXJjZSk6IHZvaWQKewokdGhpcy0+bG9jYWxBdXRoQ29uZmlnU291cmNlID0gJHNvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQXV0aENvbmZpZ1NvdXJjZSgpOiA/Q29uZmlnU291cmNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5sb2NhbEF1dGhDb25maWdTb3VyY2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1lcmdlKGFycmF5ICRjb25maWcsIHN0cmluZyAkc291cmNlID0gc2VsZjo6U09VUkNFX1VOS05PV04pOiB2b2lkCnsKCmlmICghZW1wdHkoJGNvbmZpZ1snY29uZmlnJ10pICYmIGlzX2FycmF5KCRjb25maWdbJ2NvbmZpZyddKSkgewpmb3JlYWNoICgkY29uZmlnWydjb25maWcnXSBhcyAka2V5ID0+ICR2YWwpIHsKaWYgKGluX2FycmF5KCRrZXksIFsnYml0YnVja2V0LW9hdXRoJywgJ2dpdGh1Yi1vYXV0aCcsICdnaXRsYWItb2F1dGgnLCAnZ2l0bGFiLXRva2VuJywgJ2h0dHAtYmFzaWMnLCAnYmVhcmVyJ10sIHRydWUpICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJGtleV0pKSB7CiR0aGlzLT5jb25maWdbJGtleV0gPSBhcnJheV9tZXJnZSgkdGhpcy0+Y29uZmlnWyRrZXldLCAkdmFsKTsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJHZhbCwgJGtleSwgJHNvdXJjZSk7Cn0gZWxzZWlmIChpbl9hcnJheSgka2V5LCBbJ2FsbG93LXBsdWdpbnMnXSwgdHJ1ZSkgJiYgaXNzZXQoJHRoaXMtPmNvbmZpZ1ska2V5XSkgJiYgaXNfYXJyYXkoJHRoaXMtPmNvbmZpZ1ska2V5XSkgJiYgaXNfYXJyYXkoJHZhbCkpIHsKCgokdGhpcy0+Y29uZmlnWyRrZXldID0gYXJyYXlfbWVyZ2UoJHZhbCwgJHRoaXMtPmNvbmZpZ1ska2V5XSwgJHZhbCk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwp9IGVsc2VpZiAoaW5fYXJyYXkoJGtleSwgWydnaXRsYWItZG9tYWlucycsICdnaXRodWItZG9tYWlucyddLCB0cnVlKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWyRrZXldKSkgewokdGhpcy0+Y29uZmlnWyRrZXldID0gYXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKCR0aGlzLT5jb25maWdbJGtleV0sICR2YWwpKTsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJHZhbCwgJGtleSwgJHNvdXJjZSk7Cn0gZWxzZWlmICgncHJlZmVycmVkLWluc3RhbGwnID09PSAka2V5ICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJGtleV0pKSB7CmlmIChpc19hcnJheSgkdmFsKSB8fCBpc19hcnJheSgkdGhpcy0+Y29uZmlnWyRrZXldKSkgewppZiAoaXNfc3RyaW5nKCR2YWwpKSB7CiR2YWwgPSBbJyonID0+ICR2YWxdOwp9CmlmIChpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1ska2V5XSkpIHsKJHRoaXMtPmNvbmZpZ1ska2V5XSA9IFsnKicgPT4gJHRoaXMtPmNvbmZpZ1ska2V5XV07CiR0aGlzLT5zb3VyY2VPZkNvbmZpZ1ZhbHVlWyRrZXkgLiAnKiddID0gJHNvdXJjZTsKfQokdGhpcy0+Y29uZmlnWyRrZXldID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmNvbmZpZ1ska2V5XSwgJHZhbCk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwoKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJGtleV1bJyonXSkpIHsKJHdpbGRjYXJkID0gJHRoaXMtPmNvbmZpZ1ska2V5XVsnKiddOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRrZXldWycqJ10pOwokdGhpcy0+Y29uZmlnWyRrZXldWycqJ10gPSAkd2lsZGNhcmQ7Cn0KfSBlbHNlIHsKJHRoaXMtPmNvbmZpZ1ska2V5XSA9ICR2YWw7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwp9Cn0gZWxzZWlmICgnYXVkaXQnID09PSAka2V5KSB7CiRjdXJyZW50SWdub3JlcyA9ICR0aGlzLT5jb25maWdbJ2F1ZGl0J11bJ2lnbm9yZSddOwokdGhpcy0+Y29uZmlnWyRrZXldID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmNvbmZpZ1snYXVkaXQnXSwgJHZhbCk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwokdGhpcy0+Y29uZmlnWydhdWRpdCddWydpZ25vcmUnXSA9IGFycmF5X21lcmdlKCRjdXJyZW50SWdub3JlcywgJHZhbFsnaWdub3JlJ10gPz8gW10pOwp9IGVsc2UgewokdGhpcy0+Y29uZmlnWyRrZXldID0gJHZhbDsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJHZhbCwgJGtleSwgJHNvdXJjZSk7Cn0KfQp9CgppZiAoIWVtcHR5KCRjb25maWdbJ3JlcG9zaXRvcmllcyddKSAmJiBpc19hcnJheSgkY29uZmlnWydyZXBvc2l0b3JpZXMnXSkpIHsKJHRoaXMtPnJlcG9zaXRvcmllcyA9IGFycmF5X3JldmVyc2UoJHRoaXMtPnJlcG9zaXRvcmllcywgdHJ1ZSk7CiRuZXdSZXBvcyA9IGFycmF5X3JldmVyc2UoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10sIHRydWUpOwpmb3JlYWNoICgkbmV3UmVwb3MgYXMgJG5hbWUgPT4gJHJlcG9zaXRvcnkpIHsKCmlmIChmYWxzZSA9PT0gJHJlcG9zaXRvcnkpIHsKJHRoaXMtPmRpc2FibGVSZXBvQnlOYW1lKChzdHJpbmcpICRuYW1lKTsKY29udGludWU7Cn0KCgppZiAoaXNfYXJyYXkoJHJlcG9zaXRvcnkpICYmIDEgPT09IGNvdW50KCRyZXBvc2l0b3J5KSAmJiBmYWxzZSA9PT0gY3VycmVudCgkcmVwb3NpdG9yeSkpIHsKJHRoaXMtPmRpc2FibGVSZXBvQnlOYW1lKChzdHJpbmcpIGtleSgkcmVwb3NpdG9yeSkpOwpjb250aW51ZTsKfQoKCmlmIChpc3NldCgkcmVwb3NpdG9yeVsndHlwZSddLCAkcmVwb3NpdG9yeVsndXJsJ10pICYmICRyZXBvc2l0b3J5Wyd0eXBlJ10gPT09ICdjb21wb3NlcicgJiYgUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly8oPzpbYS16MC05LS5dK1wuKT9wYWNrYWdpc3Qub3JnKC98JCl9JywgJHJlcG9zaXRvcnlbJ3VybCddKSkgewokdGhpcy0+ZGlzYWJsZVJlcG9CeU5hbWUoJ3BhY2thZ2lzdC5vcmcnKTsKfQoKCmlmIChpc19pbnQoJG5hbWUpKSB7CiR0aGlzLT5yZXBvc2l0b3JpZXNbXSA9ICRyZXBvc2l0b3J5OwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkcmVwb3NpdG9yeSwgJ3JlcG9zaXRvcmllcy4nIC4gYXJyYXlfc2VhcmNoKCRyZXBvc2l0b3J5LCAkdGhpcy0+cmVwb3NpdG9yaWVzLCB0cnVlKSwgJHNvdXJjZSk7Cn0gZWxzZSB7CmlmICgkbmFtZSA9PT0gJ3BhY2thZ2lzdCcpIHsgCiR0aGlzLT5yZXBvc2l0b3JpZXNbJG5hbWUgLiAnLm9yZyddID0gJHJlcG9zaXRvcnk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCRyZXBvc2l0b3J5LCAncmVwb3NpdG9yaWVzLicgLiAkbmFtZSAuICcub3JnJywgJHNvdXJjZSk7Cn0gZWxzZSB7CiR0aGlzLT5yZXBvc2l0b3JpZXNbJG5hbWVdID0gJHJlcG9zaXRvcnk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCRyZXBvc2l0b3J5LCAncmVwb3NpdG9yaWVzLicgLiAkbmFtZSwgJHNvdXJjZSk7Cn0KfQp9CiR0aGlzLT5yZXBvc2l0b3JpZXMgPSBhcnJheV9yZXZlcnNlKCR0aGlzLT5yZXBvc2l0b3JpZXMsIHRydWUpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3JpZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcG9zaXRvcmllczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAka2V5LCBpbnQgJGZsYWdzID0gMCkKewpzd2l0Y2ggKCRrZXkpIHsKCmNhc2UgJ3ZlbmRvci1kaXInOgpjYXNlICdiaW4tZGlyJzoKY2FzZSAncHJvY2Vzcy10aW1lb3V0JzoKY2FzZSAnZGF0YS1kaXInOgpjYXNlICdjYWNoZS1kaXInOgpjYXNlICdjYWNoZS1maWxlcy1kaXInOgpjYXNlICdjYWNoZS1yZXBvLWRpcic6CmNhc2UgJ2NhY2hlLXZjcy1kaXInOgpjYXNlICdjYWZpbGUnOgpjYXNlICdjYXBhdGgnOgoKJGVudiA9ICdDT01QT1NFUl8nIC4gc3RydG91cHBlcihzdHJ0cigka2V5LCAnLScsICdfJykpOwoKJHZhbCA9ICR0aGlzLT5nZXRDb21wb3NlckVudigkZW52KTsKaWYgKCR2YWwgIT09IGZhbHNlKSB7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRlbnYpOwp9CgppZiAoJGtleSA9PT0gJ3Byb2Nlc3MtdGltZW91dCcpIHsKcmV0dXJuIG1heCgwLCBmYWxzZSAhPT0gJHZhbCA/IChpbnQpICR2YWwgOiAkdGhpcy0+Y29uZmlnWyRrZXldKTsKfQoKJHZhbCA9IHJ0cmltKChzdHJpbmcpICR0aGlzLT5wcm9jZXNzKGZhbHNlICE9PSAkdmFsID8gJHZhbCA6ICR0aGlzLT5jb25maWdbJGtleV0sICRmbGFncyksICcvXFwnKTsKJHZhbCA9IFBsYXRmb3JtOjpleHBhbmRQYXRoKCR2YWwpOwoKaWYgKHN1YnN0cigka2V5LCAtNCkgIT09ICctZGlyJykgewpyZXR1cm4gJHZhbDsKfQoKcmV0dXJuICgoJGZsYWdzICYgc2VsZjo6UkVMQVRJVkVfUEFUSFMpID09PSBzZWxmOjpSRUxBVElWRV9QQVRIUykgPyAkdmFsIDogJHRoaXMtPnJlYWxwYXRoKCR2YWwpOwoKCmNhc2UgJ2NhY2hlLXJlYWQtb25seSc6CmNhc2UgJ2h0YWNjZXNzLXByb3RlY3QnOgoKJGVudiA9ICdDT01QT1NFUl8nIC4gc3RydG91cHBlcihzdHJ0cigka2V5LCAnLScsICdfJykpOwoKJHZhbCA9ICR0aGlzLT5nZXRDb21wb3NlckVudigkZW52KTsKaWYgKGZhbHNlID09PSAkdmFsKSB7CiR2YWwgPSAkdGhpcy0+Y29uZmlnWyRrZXldOwp9IGVsc2UgewokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsLCAka2V5LCAkZW52KTsKfQoKcmV0dXJuICR2YWwgIT09ICdmYWxzZScgJiYgKGJvb2wpICR2YWw7CgoKY2FzZSAnZGlzYWJsZS10bHMnOgpjYXNlICdzZWN1cmUtaHR0cCc6CmNhc2UgJ3VzZS1naXRodWItYXBpJzoKY2FzZSAnbG9jayc6CgppZiAoJGtleSA9PT0gJ3NlY3VyZS1odHRwJyAmJiAkdGhpcy0+Z2V0KCdkaXNhYmxlLXRscycpID09PSB0cnVlKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuICR0aGlzLT5jb25maWdbJGtleV0gIT09ICdmYWxzZScgJiYgKGJvb2wpICR0aGlzLT5jb25maWdbJGtleV07CgoKY2FzZSAnY2FjaGUtdHRsJzoKcmV0dXJuIG1heCgwLCAoaW50KSAkdGhpcy0+Y29uZmlnWyRrZXldKTsKCgpjYXNlICdjYWNoZS1maWxlcy1tYXhzaXplJzoKaWYgKCFQcmVnOjppc01hdGNoKCcvXlxzKihbMC05Ll0rKVxzKig/Oihba21nXSkoPzppP2IpPyk/XHMqJC9pJywgKHN0cmluZykgJHRoaXMtPmNvbmZpZ1ska2V5XSwgJG1hdGNoZXMpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKIkNvdWxkIG5vdCBwYXJzZSB0aGUgdmFsdWUgb2YgJyRrZXknOiB7JHRoaXMtPmNvbmZpZ1ska2V5XX0iCik7Cn0KJHNpemUgPSAoZmxvYXQpICRtYXRjaGVzWzFdOwppZiAoaXNzZXQoJG1hdGNoZXNbMl0pKSB7CnN3aXRjaCAoc3RydG9sb3dlcigkbWF0Y2hlc1syXSkpIHsKY2FzZSAnZyc6CiRzaXplICo9IDEwMjQ7CgoKY2FzZSAnbSc6CiRzaXplICo9IDEwMjQ7CgoKY2FzZSAnayc6CiRzaXplICo9IDEwMjQ7CmJyZWFrOwp9Cn0KCnJldHVybiBtYXgoMCwgKGludCkgJHNpemUpOwoKCmNhc2UgJ2NhY2hlLWZpbGVzLXR0bCc6CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyRrZXldKSkgewpyZXR1cm4gbWF4KDAsIChpbnQpICR0aGlzLT5jb25maWdbJGtleV0pOwp9CgpyZXR1cm4gJHRoaXMtPmdldCgnY2FjaGUtdHRsJyk7CgpjYXNlICdob21lJzoKcmV0dXJuIHJ0cmltKCR0aGlzLT5wcm9jZXNzKFBsYXRmb3JtOjpleHBhbmRQYXRoKCR0aGlzLT5jb25maWdbJGtleV0pLCAkZmxhZ3MpLCAnL1xcJyk7CgpjYXNlICdiaW4tY29tcGF0JzoKJHZhbHVlID0gJHRoaXMtPmdldENvbXBvc2VyRW52KCdDT01QT1NFUl9CSU5fQ09NUEFUJykgPzogJHRoaXMtPmNvbmZpZ1ska2V5XTsKCmlmICghaW5fYXJyYXkoJHZhbHVlLCBbJ2F1dG8nLCAnZnVsbCcsICdwcm94eScsICdzeW1saW5rJ10pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKIkludmFsaWQgdmFsdWUgZm9yICdiaW4tY29tcGF0JzogeyR2YWx1ZX0uIEV4cGVjdGVkIGF1dG8sIGZ1bGwgb3IgcHJveHkiCik7Cn0KCmlmICgkdmFsdWUgPT09ICdzeW1saW5rJykgewp0cmlnZ2VyX2Vycm9yKCdjb25maWcuYmluLWNvbXBhdCAic3ltbGluayIgaXMgZGVwcmVjYXRlZCBzaW5jZSBDb21wb3NlciAyLjIsIHVzZSBhdXRvLCBmdWxsIChmb3IgV2luZG93cyBjb21wYXRpYmlsaXR5KSBvciBwcm94eSBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKfQoKcmV0dXJuICR2YWx1ZTsKCmNhc2UgJ2Rpc2NhcmQtY2hhbmdlcyc6CiRlbnYgPSAkdGhpcy0+Z2V0Q29tcG9zZXJFbnYoJ0NPTVBPU0VSX0RJU0NBUkRfQ0hBTkdFUycpOwppZiAoJGVudiAhPT0gZmFsc2UpIHsKaWYgKCFpbl9hcnJheSgkZW52LCBbJ3N0YXNoJywgJ3RydWUnLCAnZmFsc2UnLCAnMScsICcwJ10sIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKIkludmFsaWQgdmFsdWUgZm9yIENPTVBPU0VSX0RJU0NBUkRfQ0hBTkdFUzogeyRlbnZ9LiBFeHBlY3RlZCAxLCAwLCB0cnVlLCBmYWxzZSBvciBzdGFzaCIKKTsKfQppZiAoJ3N0YXNoJyA9PT0gJGVudikgewpyZXR1cm4gJ3N0YXNoJzsKfQoKCnJldHVybiAkZW52ICE9PSAnZmFsc2UnICYmIChib29sKSAkZW52Owp9CgppZiAoIWluX2FycmF5KCR0aGlzLT5jb25maWdbJGtleV0sIFt0cnVlLCBmYWxzZSwgJ3N0YXNoJ10sIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKIkludmFsaWQgdmFsdWUgZm9yICdkaXNjYXJkLWNoYW5nZXMnOiB7JHRoaXMtPmNvbmZpZ1ska2V5XX0uIEV4cGVjdGVkIHRydWUsIGZhbHNlIG9yIHN0YXNoIgopOwp9CgpyZXR1cm4gJHRoaXMtPmNvbmZpZ1ska2V5XTsKCmNhc2UgJ2dpdGh1Yi1wcm90b2NvbHMnOgokcHJvdG9zID0gJHRoaXMtPmNvbmZpZ1snZ2l0aHViLXByb3RvY29scyddOwppZiAoJHRoaXMtPmNvbmZpZ1snc2VjdXJlLWh0dHAnXSAmJiBmYWxzZSAhPT0gKCRpbmRleCA9IGFycmF5X3NlYXJjaCgnZ2l0JywgJHByb3RvcykpKSB7CnVuc2V0KCRwcm90b3NbJGluZGV4XSk7Cn0KaWYgKHJlc2V0KCRwcm90b3MpID09PSAnaHR0cCcpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgaHR0cCBwcm90b2NvbCBmb3IgZ2l0aHViIGlzIG5vdCBhdmFpbGFibGUgYW55bW9yZSwgdXBkYXRlIHlvdXIgY29uZmlnXCdzIGdpdGh1Yi1wcm90b2NvbHMgdG8gdXNlICJodHRwcyIsICJnaXQiIG9yICJzc2giJyk7Cn0KCnJldHVybiAkcHJvdG9zOwoKY2FzZSAnYXV0b2xvYWRlci1zdWZmaXgnOgppZiAoJHRoaXMtPmNvbmZpZ1ska2V5XSA9PT0gJycpIHsgCnJldHVybiBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPnByb2Nlc3MoJHRoaXMtPmNvbmZpZ1ska2V5XSwgJGZsYWdzKTsKCmNhc2UgJ2F1ZGl0JzoKJHJlc3VsdCA9ICR0aGlzLT5jb25maWdbJGtleV07CiRhYmFuZG9uZWRFbnYgPSAkdGhpcy0+Z2V0Q29tcG9zZXJFbnYoJ0NPTVBPU0VSX0FVRElUX0FCQU5ET05FRCcpOwppZiAoZmFsc2UgIT09ICRhYmFuZG9uZWRFbnYpIHsKaWYgKCFpbl9hcnJheSgkYWJhbmRvbmVkRW52LCAkdmFsaWRDaG9pY2VzID0gQXVkaXRvcjo6QUJBTkRPTkVEUywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAoiSW52YWxpZCB2YWx1ZSBmb3IgQ09NUE9TRVJfQVVESVRfQUJBTkRPTkVEOiB7JGFiYW5kb25lZEVudn0uIEV4cGVjdGVkIG9uZSBvZiAiLmltcGxvZGUoJywgJywgQXVkaXRvcjo6QUJBTkRPTkVEUykuIi4iCik7Cn0KJHJlc3VsdFsnYWJhbmRvbmVkJ10gPSAkYWJhbmRvbmVkRW52Owp9CgpyZXR1cm4gJHJlc3VsdDsKCmRlZmF1bHQ6CmlmICghaXNzZXQoJHRoaXMtPmNvbmZpZ1ska2V5XSkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkdGhpcy0+cHJvY2VzcygkdGhpcy0+Y29uZmlnWyRrZXldLCAkZmxhZ3MpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhbGwoaW50ICRmbGFncyA9IDApOiBhcnJheQp7CiRhbGwgPSBbCidyZXBvc2l0b3JpZXMnID0+ICR0aGlzLT5nZXRSZXBvc2l0b3JpZXMoKSwKXTsKZm9yZWFjaCAoYXJyYXlfa2V5cygkdGhpcy0+Y29uZmlnKSBhcyAka2V5KSB7CiRhbGxbJ2NvbmZpZyddWyRrZXldID0gJHRoaXMtPmdldCgka2V5LCAkZmxhZ3MpOwp9CgpyZXR1cm4gJGFsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZU9mVmFsdWUoc3RyaW5nICRrZXkpOiBzdHJpbmcKewokdGhpcy0+Z2V0KCRrZXkpOwoKcmV0dXJuICR0aGlzLT5zb3VyY2VPZkNvbmZpZ1ZhbHVlWyRrZXldID8/IHNlbGY6OlNPVVJDRV9VTktOT1dOOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJGNvbmZpZ1ZhbHVlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkc291cmNlKTogdm9pZAp7CiR0aGlzLT5zb3VyY2VPZkNvbmZpZ1ZhbHVlWyRwYXRoXSA9ICRzb3VyY2U7CgppZiAoaXNfYXJyYXkoJGNvbmZpZ1ZhbHVlKSkgewpmb3JlYWNoICgkY29uZmlnVmFsdWUgYXMgJGtleSA9PiAkdmFsdWUpIHsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJHZhbHVlLCAkcGF0aCAuICcuJyAuICRrZXksICRzb3VyY2UpOwp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJhdygpOiBhcnJheQp7CnJldHVybiBbCidyZXBvc2l0b3JpZXMnID0+ICR0aGlzLT5nZXRSZXBvc2l0b3JpZXMoKSwKJ2NvbmZpZycgPT4gJHRoaXMtPmNvbmZpZywKXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcyhzdHJpbmcgJGtleSk6IGJvb2wKewpyZXR1cm4gYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkdGhpcy0+Y29uZmlnKTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHByb2Nlc3MoJHZhbHVlLCBpbnQgJGZsYWdzKQp7CmlmICghaXNfc3RyaW5nKCR2YWx1ZSkpIHsKcmV0dXJuICR2YWx1ZTsKfQoKcmV0dXJuIFByZWc6OnJlcGxhY2VDYWxsYmFjaygnI1x7XCQoLispXH0jJywgZnVuY3Rpb24gKCRtYXRjaCkgdXNlICgkZmxhZ3MpIHsKcmV0dXJuICR0aGlzLT5nZXQoJG1hdGNoWzFdLCAkZmxhZ3MpOwp9LCAkdmFsdWUpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVhbHBhdGgoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKaWYgKFByZWc6OmlzTWF0Y2goJ3teKD86L3xbYS16XTp8W2EtejAtOS5dKzovL3xcXFxcXFxcXCl9aScsICRwYXRoKSkgewpyZXR1cm4gJHBhdGg7Cn0KCnJldHVybiAkdGhpcy0+YmFzZURpciAhPT0gbnVsbCA/ICR0aGlzLT5iYXNlRGlyIC4gJy8nIC4gJHBhdGggOiAkcGF0aDsKfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tcG9zZXJFbnYoc3RyaW5nICR2YXIpCnsKaWYgKCR0aGlzLT51c2VFbnZpcm9ubWVudCkgewpyZXR1cm4gUGxhdGZvcm06OmdldEVudigkdmFyKTsKfQoKcmV0dXJuIGZhbHNlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRpc2FibGVSZXBvQnlOYW1lKHN0cmluZyAkbmFtZSk6IHZvaWQKewppZiAoaXNzZXQoJHRoaXMtPnJlcG9zaXRvcmllc1skbmFtZV0pKSB7CnVuc2V0KCR0aGlzLT5yZXBvc2l0b3JpZXNbJG5hbWVdKTsKfSBlbHNlaWYgKCRuYW1lID09PSAncGFja2FnaXN0JykgeyAKdW5zZXQoJHRoaXMtPnJlcG9zaXRvcmllc1sncGFja2FnaXN0Lm9yZyddKTsKfQp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvaGliaXRVcmxCeUNvbmZpZyhzdHJpbmcgJHVybCwgP0lPSW50ZXJmYWNlICRpbyA9IG51bGwsIGFycmF5ICRyZXBvT3B0aW9ucyA9IFtdKTogdm9pZAp7CgppZiAoZmFsc2UgPT09IGZpbHRlcl92YXIoJHVybCwgRklMVEVSX1ZBTElEQVRFX1VSTCkgJiYgIVByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vfScsICR1cmwpKSB7CnJldHVybjsKfQoKCiRzY2hlbWUgPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9TQ0hFTUUpOwokaG9zdG5hbWUgPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9IT1NUKTsKaWYgKGluX2FycmF5KCRzY2hlbWUsIFsnaHR0cCcsICdnaXQnLCAnZnRwJywgJ3N2biddKSkgewppZiAoJHRoaXMtPmdldCgnc2VjdXJlLWh0dHAnKSkgewppZiAoJHNjaGVtZSA9PT0gJ3N2bicpIHsKaWYgKGluX2FycmF5KCRob3N0bmFtZSwgJHRoaXMtPmdldCgnc2VjdXJlLXN2bi1kb21haW5zJyksIHRydWUpKSB7CnJldHVybjsKfQoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbigiWW91ciBjb25maWd1cmF0aW9uIGRvZXMgbm90IGFsbG93IGNvbm5lY3Rpb25zIHRvICR1cmwuIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDYtY29uZmlnLm1kI3NlY3VyZS1zdm4tZG9tYWlucyBmb3IgZGV0YWlscy4iKTsKfQoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbigiWW91ciBjb25maWd1cmF0aW9uIGRvZXMgbm90IGFsbG93IGNvbm5lY3Rpb25zIHRvICR1cmwuIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDYtY29uZmlnLm1kI3NlY3VyZS1odHRwIGZvciBkZXRhaWxzLiIpOwp9CmlmICgkaW8gIT09IG51bGwpIHsKaWYgKGlzX3N0cmluZygkaG9zdG5hbWUpKSB7CmlmICghaXNzZXQoJHRoaXMtPndhcm5lZEhvc3RzWyRob3N0bmFtZV0pKSB7CiRpby0+d3JpdGVFcnJvcigiPHdhcm5pbmc+V2FybmluZzogQWNjZXNzaW5nICRob3N0bmFtZSBvdmVyICRzY2hlbWUgd2hpY2ggaXMgYW4gaW5zZWN1cmUgcHJvdG9jb2wuPC93YXJuaW5nPiIpOwp9CiR0aGlzLT53YXJuZWRIb3N0c1skaG9zdG5hbWVdID0gdHJ1ZTsKfQp9Cn0KCmlmICgkaW8gIT09IG51bGwgJiYgaXNfc3RyaW5nKCRob3N0bmFtZSkgJiYgIWlzc2V0KCR0aGlzLT5zc2xWZXJpZnlXYXJuZWRIb3N0c1skaG9zdG5hbWVdKSkgewokd2FybmluZyA9IG51bGw7CmlmIChpc3NldCgkcmVwb09wdGlvbnNbJ3NzbCddWyd2ZXJpZnlfcGVlciddKSAmJiAhKGJvb2wpICRyZXBvT3B0aW9uc1snc3NsJ11bJ3ZlcmlmeV9wZWVyJ10pIHsKJHdhcm5pbmcgPSAndmVyaWZ5X3BlZXInOwp9CgppZiAoaXNzZXQoJHJlcG9PcHRpb25zWydzc2wnXVsndmVyaWZ5X3BlZXJfbmFtZSddKSAmJiAhKGJvb2wpICRyZXBvT3B0aW9uc1snc3NsJ11bJ3ZlcmlmeV9wZWVyX25hbWUnXSkgewokd2FybmluZyA9ICR3YXJuaW5nID09PSBudWxsID8gJ3ZlcmlmeV9wZWVyX25hbWUnIDogJHdhcm5pbmcgLiAnIGFuZCB2ZXJpZnlfcGVlcl9uYW1lJzsKfQoKaWYgKCR3YXJuaW5nICE9PSBudWxsKSB7CiRpby0+d3JpdGVFcnJvcigiPHdhcm5pbmc+V2FybmluZzogQWNjZXNzaW5nICRob3N0bmFtZSB3aXRoICR3YXJuaW5nIGRpc2FibGVkLjwvd2FybmluZz4iKTsKJHRoaXMtPnNzbFZlcmlmeVdhcm5lZEhvc3RzWyRob3N0bmFtZV0gPSB0cnVlOwp9Cn0KfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGlzYWJsZVByb2Nlc3NUaW1lb3V0KCk6IHZvaWQKewoKUHJvY2Vzc0V4ZWN1dG9yOjpzZXRUaW1lb3V0KDApOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbmZpZzsKCgoKCgoKCmludGVyZmFjZSBDb25maWdTb3VyY2VJbnRlcmZhY2UKewoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJlcG9zaXRvcnkoc3RyaW5nICRuYW1lLCAkY29uZmlnLCBib29sICRhcHBlbmQgPSB0cnVlKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVSZXBvc2l0b3J5KHN0cmluZyAkbmFtZSk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQ29uZmlnU2V0dGluZyhzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQ29uZmlnU2V0dGluZyhzdHJpbmcgJG5hbWUpOiB2b2lkOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFByb3BlcnR5KHN0cmluZyAkbmFtZSwgJHZhbHVlKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVQcm9wZXJ0eShzdHJpbmcgJG5hbWUpOiB2b2lkOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRMaW5rKHN0cmluZyAkdHlwZSwgc3RyaW5nICRuYW1lLCBzdHJpbmcgJHZhbHVlKTogdm9pZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVMaW5rKHN0cmluZyAkdHlwZSwgc3RyaW5nICRuYW1lKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IHN0cmluZzsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uZmlnOwoKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxKc29uXEpzb25NYW5pcHVsYXRvcjsKdXNlIENvbXBvc2VyXEpzb25cSnNvblZhbGlkYXRpb25FeGNlcHRpb247CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwoKCgoKCgoKY2xhc3MgSnNvbkNvbmZpZ1NvdXJjZSBpbXBsZW1lbnRzIENvbmZpZ1NvdXJjZUludGVyZmFjZQp7CgoKCnByaXZhdGUgJGZpbGU7CgoKCgpwcml2YXRlICRhdXRoQ29uZmlnOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEpzb25GaWxlICRmaWxlLCBib29sICRhdXRoQ29uZmlnID0gZmFsc2UpCnsKJHRoaXMtPmZpbGUgPSAkZmlsZTsKJHRoaXMtPmF1dGhDb25maWcgPSAkYXV0aENvbmZpZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5maWxlLT5nZXRQYXRoKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSZXBvc2l0b3J5KHN0cmluZyAkbmFtZSwgJGNvbmZpZywgYm9vbCAkYXBwZW5kID0gdHJ1ZSk6IHZvaWQKewokdGhpcy0+bWFuaXB1bGF0ZUpzb24oJ2FkZFJlcG9zaXRvcnknLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAkcmVwbywgJHJlcG9Db25maWcpIHVzZSAoJGFwcGVuZCk6IHZvaWQgewoKCmlmIChpc3NldCgkY29uZmlnWydyZXBvc2l0b3JpZXMnXSkpIHsKZm9yZWFjaCAoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gYXMgJGluZGV4ID0+ICR2YWwpIHsKaWYgKCRpbmRleCA9PT0gJHJlcG8pIHsKY29udGludWU7Cn0KaWYgKGlzX251bWVyaWMoJGluZGV4KSAmJiAoJHZhbCA9PT0gWydwYWNrYWdpc3QnID0+IGZhbHNlXSB8fCAkdmFsID09PSBbJ3BhY2thZ2lzdC5vcmcnID0+IGZhbHNlXSkpIHsKdW5zZXQoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ11bJGluZGV4XSk7CiRjb25maWdbJ3JlcG9zaXRvcmllcyddWydwYWNrYWdpc3Qub3JnJ10gPSBmYWxzZTsKYnJlYWs7Cn0KfQp9CgppZiAoJGFwcGVuZCkgewokY29uZmlnWydyZXBvc2l0b3JpZXMnXVskcmVwb10gPSAkcmVwb0NvbmZpZzsKfSBlbHNlIHsKJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gPSBbJHJlcG8gPT4gJHJlcG9Db25maWddICsgJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ107Cn0KfSwgJG5hbWUsICRjb25maWcsICRhcHBlbmQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUmVwb3NpdG9yeShzdHJpbmcgJG5hbWUpOiB2b2lkCnsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdyZW1vdmVSZXBvc2l0b3J5Jywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJHJlcG8pOiB2b2lkIHsKdW5zZXQoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ11bJHJlcG9dKTsKfSwgJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQ29uZmlnU2V0dGluZyhzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IHZvaWQKewokYXV0aENvbmZpZyA9ICR0aGlzLT5hdXRoQ29uZmlnOwokdGhpcy0+bWFuaXB1bGF0ZUpzb24oJ2FkZENvbmZpZ1NldHRpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAka2V5LCAkdmFsKSB1c2UgKCRhdXRoQ29uZmlnKTogdm9pZCB7CmlmIChQcmVnOjppc01hdGNoKCd7XihiaXRidWNrZXQtb2F1dGh8Z2l0aHViLW9hdXRofGdpdGxhYi1vYXV0aHxnaXRsYWItdG9rZW58YmVhcmVyfGh0dHAtYmFzaWN8cGxhdGZvcm0pXC59JywgJGtleSkpIHsKWyRrZXksICRob3N0XSA9IGV4cGxvZGUoJy4nLCAka2V5LCAyKTsKaWYgKCRhdXRoQ29uZmlnKSB7CiRjb25maWdbJGtleV1bJGhvc3RdID0gJHZhbDsKfSBlbHNlIHsKJGNvbmZpZ1snY29uZmlnJ11bJGtleV1bJGhvc3RdID0gJHZhbDsKfQp9IGVsc2UgewokY29uZmlnWydjb25maWcnXVska2V5XSA9ICR2YWw7Cn0KfSwgJG5hbWUsICR2YWx1ZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVDb25maWdTZXR0aW5nKHN0cmluZyAkbmFtZSk6IHZvaWQKewokYXV0aENvbmZpZyA9ICR0aGlzLT5hdXRoQ29uZmlnOwokdGhpcy0+bWFuaXB1bGF0ZUpzb24oJ3JlbW92ZUNvbmZpZ1NldHRpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAka2V5KSB1c2UgKCRhdXRoQ29uZmlnKTogdm9pZCB7CmlmIChQcmVnOjppc01hdGNoKCd7XihiaXRidWNrZXQtb2F1dGh8Z2l0aHViLW9hdXRofGdpdGxhYi1vYXV0aHxnaXRsYWItdG9rZW58YmVhcmVyfGh0dHAtYmFzaWN8cGxhdGZvcm0pXC59JywgJGtleSkpIHsKWyRrZXksICRob3N0XSA9IGV4cGxvZGUoJy4nLCAka2V5LCAyKTsKaWYgKCRhdXRoQ29uZmlnKSB7CnVuc2V0KCRjb25maWdbJGtleV1bJGhvc3RdKTsKfSBlbHNlIHsKdW5zZXQoJGNvbmZpZ1snY29uZmlnJ11bJGtleV1bJGhvc3RdKTsKfQp9IGVsc2Ugewp1bnNldCgkY29uZmlnWydjb25maWcnXVska2V5XSk7Cn0KfSwgJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUHJvcGVydHkoc3RyaW5nICRuYW1lLCAkdmFsdWUpOiB2b2lkCnsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdhZGRQcm9wZXJ0eScsIHN0YXRpYyBmdW5jdGlvbiAoJiRjb25maWcsICRrZXksICR2YWwpOiB2b2lkIHsKaWYgKHN0cnBvcygka2V5LCAnZXh0cmEuJykgPT09IDAgfHwgc3RycG9zKCRrZXksICdzY3JpcHRzLicpID09PSAwKSB7CiRiaXRzID0gZXhwbG9kZSgnLicsICRrZXkpOwokbGFzdCA9IGFycmF5X3BvcCgkYml0cyk7CiRhcnIgPSAmJGNvbmZpZ1tyZXNldCgkYml0cyldOwpmb3JlYWNoICgkYml0cyBhcyAkYml0KSB7CmlmICghaXNzZXQoJGFyclskYml0XSkpIHsKJGFyclskYml0XSA9IFtdOwp9CiRhcnIgPSAmJGFyclskYml0XTsKfQokYXJyWyRsYXN0XSA9ICR2YWw7Cn0gZWxzZSB7CiRjb25maWdbJGtleV0gPSAkdmFsOwp9Cn0sICRuYW1lLCAkdmFsdWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUHJvcGVydHkoc3RyaW5nICRuYW1lKTogdm9pZAp7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbigncmVtb3ZlUHJvcGVydHknLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAka2V5KTogdm9pZCB7CmlmIChzdHJwb3MoJGtleSwgJ2V4dHJhLicpID09PSAwIHx8IHN0cnBvcygka2V5LCAnc2NyaXB0cy4nKSA9PT0gMCB8fCBzdHJpcG9zKCRrZXksICdhdXRvbG9hZC4nKSA9PT0gMCB8fCBzdHJpcG9zKCRrZXksICdhdXRvbG9hZC1kZXYuJykgPT09IDApIHsKJGJpdHMgPSBleHBsb2RlKCcuJywgJGtleSk7CiRsYXN0ID0gYXJyYXlfcG9wKCRiaXRzKTsKJGFyciA9ICYkY29uZmlnW3Jlc2V0KCRiaXRzKV07CmZvcmVhY2ggKCRiaXRzIGFzICRiaXQpIHsKaWYgKCFpc3NldCgkYXJyWyRiaXRdKSkgewpyZXR1cm47Cn0KJGFyciA9ICYkYXJyWyRiaXRdOwp9CnVuc2V0KCRhcnJbJGxhc3RdKTsKfSBlbHNlIHsKdW5zZXQoJGNvbmZpZ1ska2V5XSk7Cn0KfSwgJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkTGluayhzdHJpbmcgJHR5cGUsIHN0cmluZyAkbmFtZSwgc3RyaW5nICR2YWx1ZSk6IHZvaWQKewokdGhpcy0+bWFuaXB1bGF0ZUpzb24oJ2FkZExpbmsnLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAkdHlwZSwgJG5hbWUsICR2YWx1ZSk6IHZvaWQgewokY29uZmlnWyR0eXBlXVskbmFtZV0gPSAkdmFsdWU7Cn0sICR0eXBlLCAkbmFtZSwgJHZhbHVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUxpbmsoc3RyaW5nICR0eXBlLCBzdHJpbmcgJG5hbWUpOiB2b2lkCnsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdyZW1vdmVTdWJOb2RlJywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJHR5cGUsICRuYW1lKTogdm9pZCB7CnVuc2V0KCRjb25maWdbJHR5cGVdWyRuYW1lXSk7Cn0sICR0eXBlLCAkbmFtZSk7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbigncmVtb3ZlTWFpbktleUlmRW1wdHknLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAkdHlwZSk6IHZvaWQgewppZiAoMCA9PT0gY291bnQoJGNvbmZpZ1skdHlwZV0pKSB7CnVuc2V0KCRjb25maWdbJHR5cGVdKTsKfQp9LCAkdHlwZSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbWFuaXB1bGF0ZUpzb24oc3RyaW5nICRtZXRob2QsIGNhbGxhYmxlICRmYWxsYmFjaywgLi4uJGFyZ3MpOiB2b2lkCnsKaWYgKCR0aGlzLT5maWxlLT5leGlzdHMoKSkgewppZiAoIWlzX3dyaXRhYmxlKCR0aGlzLT5maWxlLT5nZXRQYXRoKCkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgZmlsZSAiJXMiIGlzIG5vdCB3cml0YWJsZS4nLCAkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpKSk7Cn0KCmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVGhlIGZpbGUgIiVzIiBpcyBub3QgcmVhZGFibGUuJywgJHRoaXMtPmZpbGUtPmdldFBhdGgoKSkpOwp9CgokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpKTsKfSBlbHNlaWYgKCR0aGlzLT5hdXRoQ29uZmlnKSB7CiRjb250ZW50cyA9ICJ7XG59XG4iOwp9IGVsc2UgewokY29udGVudHMgPSAie1xuICAgIFwiY29uZmlnXCI6IHtcbiAgICB9XG59XG4iOwp9CgokbWFuaXB1bGF0b3IgPSBuZXcgSnNvbk1hbmlwdWxhdG9yKCRjb250ZW50cyk7CgokbmV3RmlsZSA9ICEkdGhpcy0+ZmlsZS0+ZXhpc3RzKCk7CgoKaWYgKCR0aGlzLT5hdXRoQ29uZmlnICYmICRtZXRob2QgPT09ICdhZGRDb25maWdTZXR0aW5nJykgewokbWV0aG9kID0gJ2FkZFN1Yk5vZGUnOwpbJG1haW5Ob2RlLCAkbmFtZV0gPSBleHBsb2RlKCcuJywgJGFyZ3NbMF0sIDIpOwokYXJncyA9IFskbWFpbk5vZGUsICRuYW1lLCAkYXJnc1sxXV07Cn0gZWxzZWlmICgkdGhpcy0+YXV0aENvbmZpZyAmJiAkbWV0aG9kID09PSAncmVtb3ZlQ29uZmlnU2V0dGluZycpIHsKJG1ldGhvZCA9ICdyZW1vdmVTdWJOb2RlJzsKWyRtYWluTm9kZSwgJG5hbWVdID0gZXhwbG9kZSgnLicsICRhcmdzWzBdLCAyKTsKJGFyZ3MgPSBbJG1haW5Ob2RlLCAkbmFtZV07Cn0KCgppZiAoY2FsbF91c2VyX2Z1bmNfYXJyYXkoWyRtYW5pcHVsYXRvciwgJG1ldGhvZF0sICRhcmdzKSkgewpmaWxlX3B1dF9jb250ZW50cygkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpLCAkbWFuaXB1bGF0b3ItPmdldENvbnRlbnRzKCkpOwp9IGVsc2UgewoKJGNvbmZpZyA9ICR0aGlzLT5maWxlLT5yZWFkKCk7CiR0aGlzLT5hcnJheVVuc2hpZnRSZWYoJGFyZ3MsICRjb25maWcpOwokZmFsbGJhY2soLi4uJGFyZ3MpOwoKZm9yZWFjaCAoWydyZXF1aXJlJywgJ3JlcXVpcmUtZGV2JywgJ2NvbmZsaWN0JywgJ3Byb3ZpZGUnLCAncmVwbGFjZScsICdzdWdnZXN0JywgJ2NvbmZpZycsICdhdXRvbG9hZCcsICdhdXRvbG9hZC1kZXYnLCAnc2NyaXB0cycsICdzY3JpcHRzLWRlc2NyaXB0aW9ucycsICdzY3JpcHRzLWFsaWFzZXMnLCAnc3VwcG9ydCddIGFzICRwcm9wKSB7CmlmIChpc3NldCgkY29uZmlnWyRwcm9wXSkgJiYgJGNvbmZpZ1skcHJvcF0gPT09IFtdKSB7CiRjb25maWdbJHByb3BdID0gbmV3IFxzdGRDbGFzczsKfQp9CmZvcmVhY2ggKFsncHNyLTAnLCAncHNyLTQnXSBhcyAkcHJvcCkgewppZiAoaXNzZXQoJGNvbmZpZ1snYXV0b2xvYWQnXVskcHJvcF0pICYmICRjb25maWdbJ2F1dG9sb2FkJ11bJHByb3BdID09PSBbXSkgewokY29uZmlnWydhdXRvbG9hZCddWyRwcm9wXSA9IG5ldyBcc3RkQ2xhc3M7Cn0KaWYgKGlzc2V0KCRjb25maWdbJ2F1dG9sb2FkLWRldiddWyRwcm9wXSkgJiYgJGNvbmZpZ1snYXV0b2xvYWQtZGV2J11bJHByb3BdID09PSBbXSkgewokY29uZmlnWydhdXRvbG9hZC1kZXYnXVskcHJvcF0gPSBuZXcgXHN0ZENsYXNzOwp9Cn0KZm9yZWFjaCAoWydwbGF0Zm9ybScsICdodHRwLWJhc2ljJywgJ2JlYXJlcicsICdnaXRsYWItdG9rZW4nLCAnZ2l0bGFiLW9hdXRoJywgJ2dpdGh1Yi1vYXV0aCcsICdwcmVmZXJyZWQtaW5zdGFsbCddIGFzICRwcm9wKSB7CmlmIChpc3NldCgkY29uZmlnWydjb25maWcnXVskcHJvcF0pICYmICRjb25maWdbJ2NvbmZpZyddWyRwcm9wXSA9PT0gW10pIHsKJGNvbmZpZ1snY29uZmlnJ11bJHByb3BdID0gbmV3IFxzdGRDbGFzczsKfQp9CiR0aGlzLT5maWxlLT53cml0ZSgkY29uZmlnKTsKfQoKdHJ5IHsKJHRoaXMtPmZpbGUtPnZhbGlkYXRlU2NoZW1hKEpzb25GaWxlOjpMQVhfU0NIRU1BKTsKfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKCmZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5maWxlLT5nZXRQYXRoKCksICRjb250ZW50cyk7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIHVwZGF0ZSBjb21wb3Nlci5qc29uIHdpdGggYSB2YWxpZCBmb3JtYXQsIHJldmVydGluZyB0byB0aGUgb3JpZ2luYWwgY29udGVudC4gUGxlYXNlIHJlcG9ydCBhbiBpc3N1ZSB0byB1cyB3aXRoIGRldGFpbHMgKGNvbW1hbmQgeW91IHJ1biBhbmQgYSBjb3B5IG9mIHlvdXIgY29tcG9zZXIuanNvbikuICcuUEhQX0VPTC5pbXBsb2RlKFBIUF9FT0wsICRlLT5nZXRFcnJvcnMoKSksIDAsICRlKTsKfQoKaWYgKCRuZXdGaWxlKSB7ClNpbGVuY2VyOjpjYWxsKCdjaG1vZCcsICR0aGlzLT5maWxlLT5nZXRQYXRoKCksIDA2MDApOwp9Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYXJyYXlVbnNoaWZ0UmVmKGFycmF5ICYkYXJyYXksICYkdmFsdWUpOiBpbnQKewokcmV0dXJuID0gYXJyYXlfdW5zaGlmdCgkYXJyYXksICcnKTsKJGFycmF5WzBdID0gJiR2YWx1ZTsKCnJldHVybiAkcmV0dXJuOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbnNvbGU7Cgp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcSU9cTnVsbElPOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBMb2dpY0V4Y2VwdGlvbjsKdXNlIFJ1bnRpbWVFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uIGFzIEJhc2VBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEV4Y2VwdGlvbkludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlclNldDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFF1ZXN0aW9uSGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTZWxkXEpzb25MaW50XFBhcnNpbmdFeGNlcHRpb247CnVzZSBDb21wb3NlclxDb21tYW5kOwp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXENvbnNvbGVJTzsKdXNlIENvbXBvc2VyXEpzb25cSnNvblZhbGlkYXRpb25FeGNlcHRpb247CnVzZSBDb21wb3NlclxVdGlsXEVycm9ySGFuZGxlcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcU2NyaXB0RXhlY3V0aW9uRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcRXhjZXB0aW9uXE5vU3NsRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcWGRlYnVnSGFuZGxlclxYZGVidWdIYW5kbGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUHJvY2Vzc1RpbWVkT3V0RXhjZXB0aW9uOwoKCgoKCgoKCmNsYXNzIEFwcGxpY2F0aW9uIGV4dGVuZHMgQmFzZUFwcGxpY2F0aW9uCnsKCgoKcHJvdGVjdGVkICRjb21wb3NlcjsKCgoKCnByb3RlY3RlZCAkaW87CgoKcHJpdmF0ZSBzdGF0aWMgJGxvZ28gPSAnICAgX19fX19fCiAgLyBfX19fL19fXyAgX19fXyBfX18gIF9fX18gIF9fX18gIF9fX19fX19fICBfX19fXwogLyAvICAgLyBfXyBcLyBfXyBgX18gXC8gX18gXC8gX18gXC8gX19fLyBfIFwvIF9fXy8KLyAvX19fLyAvXy8gLyAvIC8gLyAvIC8gL18vIC8gL18vIChfXyAgKSAgX18vIC8KXF9fX18vXF9fX18vXy8gL18vIC9fLyAuX19fL1xfX19fL19fX18vXF9fXy9fLwogICAgICAgICAgICAgICAgICAgIC9fLwonOwoKCnByaXZhdGUgJGhhc1BsdWdpbkNvbW1hbmRzID0gZmFsc2U7Cgpwcml2YXRlICRkaXNhYmxlUGx1Z2luc0J5RGVmYXVsdCA9IGZhbHNlOwoKcHJpdmF0ZSAkZGlzYWJsZVNjcmlwdHNCeURlZmF1bHQgPSBmYWxzZTsKCgoKCnByaXZhdGUgJGluaXRpYWxXb3JraW5nRGlyZWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSA9ICdDb21wb3NlcicsIHN0cmluZyAkdmVyc2lvbiA9ICcnKQp7CmlmIChtZXRob2RfZXhpc3RzKCR0aGlzLCAnc2V0Q2F0Y2hFcnJvcnMnKSkgewokdGhpcy0+c2V0Q2F0Y2hFcnJvcnModHJ1ZSk7Cn0KCnN0YXRpYyAkc2h1dGRvd25SZWdpc3RlcmVkID0gZmFsc2U7CmlmICgkdmVyc2lvbiA9PT0gJycpIHsKJHZlcnNpb24gPSBDb21wb3Nlcjo6Z2V0VmVyc2lvbigpOwp9CmlmIChmdW5jdGlvbl9leGlzdHMoJ2luaV9zZXQnKSAmJiBleHRlbnNpb25fbG9hZGVkKCd4ZGVidWcnKSkgewppbmlfc2V0KCd4ZGVidWcuc2hvd19leGNlcHRpb25fdHJhY2UnLCAnMCcpOwppbmlfc2V0KCd4ZGVidWcuc2NyZWFtJywgJzAnKTsKfQoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldCcpICYmIGZ1bmN0aW9uX2V4aXN0cygnZGF0ZV9kZWZhdWx0X3RpbWV6b25lX2dldCcpKSB7CmRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoU2lsZW5jZXI6OmNhbGwoJ2RhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQnKSk7Cn0KCiR0aGlzLT5pbyA9IG5ldyBOdWxsSU8oKTsKCmlmICghJHNodXRkb3duUmVnaXN0ZXJlZCkgewokc2h1dGRvd25SZWdpc3RlcmVkID0gdHJ1ZTsKCnJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKHN0YXRpYyBmdW5jdGlvbiAoKTogdm9pZCB7CiRsYXN0RXJyb3IgPSBlcnJvcl9nZXRfbGFzdCgpOwoKaWYgKCRsYXN0RXJyb3IgJiYgJGxhc3RFcnJvclsnbWVzc2FnZSddICYmCihzdHJwb3MoJGxhc3RFcnJvclsnbWVzc2FnZSddLCAnQWxsb3dlZCBtZW1vcnknKSAhPT0gZmFsc2UgIHx8CnN0cnBvcygkbGFzdEVycm9yWydtZXNzYWdlJ10sICdleGNlZWRlZCBtZW1vcnknKSAhPT0gZmFsc2UgKSkgewplY2hvICJcbiIuICdDaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kI21lbW9yeS1saW1pdC1lcnJvcnMgZm9yIG1vcmUgaW5mbyBvbiBob3cgdG8gaGFuZGxlIG91dCBvZiBtZW1vcnkgZXJyb3JzLic7Cn0KfSk7Cn0KCiR0aGlzLT5pbml0aWFsV29ya2luZ0RpcmVjdG9yeSA9IGdldGN3ZCgpOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkbmFtZSwgJHZlcnNpb24pOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpCnsKfQoKcHVibGljIGZ1bmN0aW9uIHJ1big/SW5wdXRJbnRlcmZhY2UgJGlucHV0ID0gbnVsbCwgP091dHB1dEludGVyZmFjZSAkb3V0cHV0ID0gbnVsbCk6IGludAp7CmlmIChudWxsID09PSAkb3V0cHV0KSB7CiRvdXRwdXQgPSBGYWN0b3J5OjpjcmVhdGVPdXRwdXQoKTsKfQoKcmV0dXJuIHBhcmVudDo6cnVuKCRpbnB1dCwgJG91dHB1dCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBkb1J1bihJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJHRoaXMtPmRpc2FibGVQbHVnaW5zQnlEZWZhdWx0ID0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tbm8tcGx1Z2lucycpOwokdGhpcy0+ZGlzYWJsZVNjcmlwdHNCeURlZmF1bHQgPSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS1uby1zY3JpcHRzJyk7CgpzdGF0aWMgJHN0ZGluID0gbnVsbDsKaWYgKG51bGwgPT09ICRzdGRpbikgewokc3RkaW4gPSBkZWZpbmVkKCdTVERJTicpID8gU1RESU4gOiBmb3BlbigncGhwOi8vc3RkaW4nLCAncicpOwp9CmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9URVNUU19BUkVfUlVOTklORycpICE9PSAnMScgJiYgKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX05PX0lOVEVSQUNUSU9OJykgfHwgJHN0ZGluID09PSBmYWxzZSB8fCAhUGxhdGZvcm06OmlzVHR5KCRzdGRpbikpKSB7CiRpbnB1dC0+c2V0SW50ZXJhY3RpdmUoZmFsc2UpOwp9CgokaW8gPSAkdGhpcy0+aW8gPSBuZXcgQ29uc29sZUlPKCRpbnB1dCwgJG91dHB1dCwgbmV3IEhlbHBlclNldChbCm5ldyBRdWVzdGlvbkhlbHBlcigpLApdKSk7CgoKRXJyb3JIYW5kbGVyOjpyZWdpc3RlcigkaW8pOwoKaWYgKCRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLW5vLWNhY2hlJykpIHsKJGlvLT53cml0ZUVycm9yKCdEaXNhYmxpbmcgY2FjaGUgdXNhZ2UnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwpQbGF0Zm9ybTo6cHV0RW52KCdDT01QT1NFUl9DQUNIRV9ESVInLCBQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgPyAnbnVsJyA6ICcvZGV2L251bGwnKTsKfQoKCiRuZXdXb3JrRGlyID0gJHRoaXMtPmdldE5ld1dvcmtpbmdEaXIoJGlucHV0KTsKaWYgKG51bGwgIT09ICRuZXdXb3JrRGlyKSB7CiRvbGRXb3JraW5nRGlyID0gUGxhdGZvcm06OmdldEN3ZCh0cnVlKTsKY2hkaXIoJG5ld1dvcmtEaXIpOwokdGhpcy0+aW5pdGlhbFdvcmtpbmdEaXJlY3RvcnkgPSAkbmV3V29ya0RpcjsKJGN3ZCA9IFBsYXRmb3JtOjpnZXRDd2QodHJ1ZSk7CiRpby0+d3JpdGVFcnJvcignQ2hhbmdlZCBDV0QgdG8gJyAuICgkY3dkICE9PSAnJyA/ICRjd2QgOiAkbmV3V29ya0RpciksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0KCgokY29tbWFuZE5hbWUgPSAnJzsKaWYgKCRuYW1lID0gJHRoaXMtPmdldENvbW1hbmROYW1lQmVmb3JlQmluZGluZygkaW5wdXQpKSB7CnRyeSB7CiRjb21tYW5kTmFtZSA9ICR0aGlzLT5maW5kKCRuYW1lKS0+Z2V0TmFtZSgpOwp9IGNhdGNoIChDb21tYW5kTm90Rm91bmRFeGNlcHRpb24gJGUpIHsKCiRjb21tYW5kTmFtZSA9IGZhbHNlOwp9IGNhdGNoIChcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uICRlKSB7Cn0KfQoKCmlmICgKbnVsbCA9PT0gJG5ld1dvcmtEaXIKCiYmICFpbl9hcnJheSgkY29tbWFuZE5hbWUsIFsnJywgJ2xpc3QnLCAnaW5pdCcsICdhYm91dCcsICdoZWxwJywgJ2RpYWdub3NlJywgJ3NlbGYtdXBkYXRlJywgJ2dsb2JhbCcsICdjcmVhdGUtcHJvamVjdCcsICdvdXRkYXRlZCddLCB0cnVlKQomJiAhZmlsZV9leGlzdHMoRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCkpCgomJiAoJHVzZVBhcmVudERpcklmTm9Kc29uQXZhaWxhYmxlID0gJHRoaXMtPmdldFVzZVBhcmVudERpckNvbmZpZ1ZhbHVlKCkpICE9PSBmYWxzZQoKJiYgKCRjb21tYW5kTmFtZSAhPT0gJ2NvbmZpZycgfHwgKCRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLWZpbGUnLCB0cnVlKSA9PT0gZmFsc2UgJiYgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy1mJywgdHJ1ZSkgPT09IGZhbHNlKSkKCiYmICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLWhlbHAnLCB0cnVlKSA9PT0gZmFsc2UKJiYgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy1oJywgdHJ1ZSkgPT09IGZhbHNlCikgewokZGlyID0gZGlybmFtZShQbGF0Zm9ybTo6Z2V0Q3dkKHRydWUpKTsKJGhvbWUgPSByZWFscGF0aChQbGF0Zm9ybTo6Z2V0RW52KCdIT01FJykgPzogUGxhdGZvcm06OmdldEVudignVVNFUlBST0ZJTEUnKSA/OiAnLycpOwoKCndoaWxlIChkaXJuYW1lKCRkaXIpICE9PSAkZGlyICYmICRkaXIgIT09ICRob21lKSB7CmlmIChmaWxlX2V4aXN0cygkZGlyLicvJy5GYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKSkpIHsKaWYgKCR1c2VQYXJlbnREaXJJZk5vSnNvbkF2YWlsYWJsZSAhPT0gdHJ1ZSAmJiAhJGlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5ObyBjb21wb3Nlci5qc29uIGluIGN1cnJlbnQgZGlyZWN0b3J5LCB0byB1c2UgdGhlIG9uZSBhdCAnLiRkaXIuJyBydW4gaW50ZXJhY3RpdmVseSBvciBzZXQgY29uZmlnLnVzZS1wYXJlbnQtZGlyIHRvIHRydWU8L2luZm8+Jyk7CmJyZWFrOwp9CmlmICgkdXNlUGFyZW50RGlySWZOb0pzb25BdmFpbGFibGUgPT09IHRydWUgfHwgJGlvLT5hc2tDb25maXJtYXRpb24oJzxpbmZvPk5vIGNvbXBvc2VyLmpzb24gaW4gY3VycmVudCBkaXJlY3RvcnksIGRvIHlvdSB3YW50IHRvIHVzZSB0aGUgb25lIGF0ICcuJGRpci4nPzwvaW5mbz4gWzxjb21tZW50PlksbjwvY29tbWVudD5dPyAnKSkgewppZiAoJHVzZVBhcmVudERpcklmTm9Kc29uQXZhaWxhYmxlID09PSB0cnVlKSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+Tm8gY29tcG9zZXIuanNvbiBpbiBjdXJyZW50IGRpcmVjdG9yeSwgY2hhbmdpbmcgd29ya2luZyBkaXJlY3RvcnkgdG8gJy4kZGlyLic8L2luZm8+Jyk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+QWx3YXlzIHdhbnQgdG8gdXNlIHRoZSBwYXJlbnQgZGlyPyBVc2UgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCB1c2UtcGFyZW50LWRpciB0cnVlIiB0byBjaGFuZ2UgdGhlIGRlZmF1bHQuPC9pbmZvPicpOwp9CiRvbGRXb3JraW5nRGlyID0gUGxhdGZvcm06OmdldEN3ZCh0cnVlKTsKY2hkaXIoJGRpcik7Cn0KYnJlYWs7Cn0KJGRpciA9IGRpcm5hbWUoJGRpcik7Cn0KdW5zZXQoJGRpciwgJGhvbWUpOwp9CgokbmVlZHNTdWRvQ2hlY2sgPSAhUGxhdGZvcm06OmlzV2luZG93cygpCiYmIGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpCiYmICFQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9BTExPV19TVVBFUlVTRVInKQomJiAhUGxhdGZvcm06OmlzRG9ja2VyKCk7CiRpc05vbkFsbG93ZWRSb290ID0gZmFsc2U7CgoKaWYgKCRuZWVkc1N1ZG9DaGVjaykgewokaXNOb25BbGxvd2VkUm9vdCA9ICR0aGlzLT5pc1J1bm5pbmdBc1Jvb3QoKTsKCmlmICgkaXNOb25BbGxvd2VkUm9vdCkgewppZiAoJHVpZCA9IChpbnQpIFBsYXRmb3JtOjpnZXRFbnYoJ1NVRE9fVUlEJykpIHsKCgpTaWxlbmNlcjo6Y2FsbCgnZXhlYycsICJzdWRvIC11IFxcI3skdWlkfSBzdWRvIC1LID4gL2Rldi9udWxsIDI+JjEiKTsKfQp9CgoKU2lsZW5jZXI6OmNhbGwoJ2V4ZWMnLCAnc3VkbyAtSyA+IC9kZXYvbnVsbCAyPiYxJyk7Cn0KCgoKJG1heU5lZWRQbHVnaW5Db21tYW5kID0gZmFsc2UgPT09ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKFsnLS12ZXJzaW9uJywgJy1WJ10pCiYmICgKCmZhbHNlID09PSAkY29tbWFuZE5hbWUKCnx8IGluX2FycmF5KCRjb21tYW5kTmFtZSwgWycnLCAnbGlzdCcsICdoZWxwJ10sIHRydWUpCgoKfHwgKCRjb21tYW5kTmFtZSA9PT0gJ19jb21wbGV0ZScgJiYgISRpc05vbkFsbG93ZWRSb290KQopOwoKaWYgKCRtYXlOZWVkUGx1Z2luQ29tbWFuZCAmJiAhJHRoaXMtPmRpc2FibGVQbHVnaW5zQnlEZWZhdWx0ICYmICEkdGhpcy0+aGFzUGx1Z2luQ29tbWFuZHMpIHsKCgppZiAoJGlzTm9uQWxsb3dlZFJvb3QpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5EbyBub3QgcnVuIENvbXBvc2VyIGFzIHJvb3Qvc3VwZXIgdXNlciEgU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL3Jvb3QgZm9yIGRldGFpbHM8L3dhcm5pbmc+Jyk7CgppZiAoJGlvLT5pc0ludGVyYWN0aXZlKCkgJiYgJGlvLT5hc2tDb25maXJtYXRpb24oJzxpbmZvPkNvbnRpbnVlIGFzIHJvb3Qvc3VwZXIgdXNlcjwvaW5mbz4gWzxjb21tZW50PnllczwvY29tbWVudD5dPyAnKSkgewoKJGlzTm9uQWxsb3dlZFJvb3QgPSBmYWxzZTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5BYm9ydGluZyBhcyBubyBwbHVnaW4gc2hvdWxkIGJlIGxvYWRlZCBpZiBydW5uaW5nIGFzIHN1cGVyIHVzZXIgaXMgbm90IGV4cGxpY2l0bHkgYWxsb3dlZDwvd2FybmluZz4nKTsKCnJldHVybiAxOwp9Cn0KCnRyeSB7CmZvcmVhY2ggKCR0aGlzLT5nZXRQbHVnaW5Db21tYW5kcygpIGFzICRjb21tYW5kKSB7CmlmICgkdGhpcy0+aGFzKCRjb21tYW5kLT5nZXROYW1lKCkpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+UGx1Z2luIGNvbW1hbmQgJy4kY29tbWFuZC0+Z2V0TmFtZSgpLicgKCcuZ2V0X2NsYXNzKCRjb21tYW5kKS4nKSB3b3VsZCBvdmVycmlkZSBhIENvbXBvc2VyIGNvbW1hbmQgYW5kIGhhcyBiZWVuIHNraXBwZWQ8L3dhcm5pbmc+Jyk7Cn0gZWxzZSB7CiR0aGlzLT5hZGQoJGNvbW1hbmQpOwp9Cn0KfSBjYXRjaCAoTm9Tc2xFeGNlcHRpb24gJGUpIHsKCn0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gJGUpIHsKJGRldGFpbHMgPSAkZS0+Z2V0RGV0YWlscygpOwoKJGZpbGUgPSByZWFscGF0aChGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKSk7CgokbGluZSA9IG51bGw7CmlmICgkZGV0YWlscyAmJiBpc3NldCgkZGV0YWlsc1snbGluZSddKSkgewokbGluZSA9ICRkZXRhaWxzWydsaW5lJ107Cn0KCiRnaGUgPSBuZXcgR2l0aHViQWN0aW9uRXJyb3IoJHRoaXMtPmlvKTsKJGdoZS0+ZW1pdCgkZS0+Z2V0TWVzc2FnZSgpLCAkZmlsZSwgJGxpbmUpOwoKdGhyb3cgJGU7Cn0KCiR0aGlzLT5oYXNQbHVnaW5Db21tYW5kcyA9IHRydWU7Cn0KCmlmICghJHRoaXMtPmRpc2FibGVQbHVnaW5zQnlEZWZhdWx0ICYmICRpc05vbkFsbG93ZWRSb290ICYmICEkaW8tPmlzSW50ZXJhY3RpdmUoKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Db21wb3NlciBwbHVnaW5zIGhhdmUgYmVlbiBkaXNhYmxlZCBmb3Igc2FmZXR5IGluIHRoaXMgbm9uLWludGVyYWN0aXZlIHNlc3Npb24uPC9lcnJvcj4nKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+U2V0IENPTVBPU0VSX0FMTE9XX1NVUEVSVVNFUj0xIGlmIHlvdSB3YW50IHRvIGFsbG93IHBsdWdpbnMgdG8gcnVuIGFzIHJvb3Qvc3VwZXIgdXNlci48L2Vycm9yPicpOwokdGhpcy0+ZGlzYWJsZVBsdWdpbnNCeURlZmF1bHQgPSB0cnVlOwp9CgoKJGlzUHJveHlDb21tYW5kID0gZmFsc2U7CmlmICgkbmFtZSA9ICR0aGlzLT5nZXRDb21tYW5kTmFtZUJlZm9yZUJpbmRpbmcoJGlucHV0KSkgewp0cnkgewokY29tbWFuZCA9ICR0aGlzLT5maW5kKCRuYW1lKTsKJGNvbW1hbmROYW1lID0gJGNvbW1hbmQtPmdldE5hbWUoKTsKJGlzUHJveHlDb21tYW5kID0gKCRjb21tYW5kIGluc3RhbmNlb2YgQ29tbWFuZFxCYXNlQ29tbWFuZCAmJiAkY29tbWFuZC0+aXNQcm94eUNvbW1hbmQoKSk7Cn0gY2F0Y2ggKFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gJGUpIHsKfQp9CgppZiAoISRpc1Byb3h5Q29tbWFuZCkgewokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKJ1J1bm5pbmcgJXMgKCVzKSB3aXRoICVzIG9uICVzJywKQ29tcG9zZXI6OmdldFZlcnNpb24oKSwKQ29tcG9zZXI6OlJFTEVBU0VfREFURSwKZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykgPyAnSEhWTSAnLkhIVk1fVkVSU0lPTiA6ICdQSFAgJy5QSFBfVkVSU0lPTiwKZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKSA/IHBocF91bmFtZSgncycpIC4gJyAvICcgLiBwaHBfdW5hbWUoJ3InKSA6ICdVbmtub3duIE9TJwopLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDcwMjA1KSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q29tcG9zZXIgc3VwcG9ydHMgUEhQIDcuMi41IGFuZCBhYm92ZSwgeW91IHdpbGwgbW9zdCBsaWtlbHkgZW5jb3VudGVyIHByb2JsZW1zIHdpdGggeW91ciBQSFAgJy5QSFBfVkVSU0lPTi4nLiBVcGdyYWRpbmcgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgYnV0IHlvdSBjYW4gdXNlIENvbXBvc2VyIDIuMi54IExUUyBhcyBhIGZhbGxiYWNrLjwvd2FybmluZz4nKTsKfQoKaWYgKFhkZWJ1Z0hhbmRsZXI6OmlzWGRlYnVnQWN0aXZlKCkgJiYgIVBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0RJU0FCTEVfWERFQlVHX1dBUk4nKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNvbXBvc2VyIGlzIG9wZXJhdGluZyBzbG93ZXIgdGhhbiBub3JtYWwgYmVjYXVzZSB5b3UgaGF2ZSBYZGVidWcgZW5hYmxlZC4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL3hkZWJ1Zzwvd2FybmluZz4nKTsKfQoKaWYgKGRlZmluZWQoJ0NPTVBPU0VSX0RFVl9XQVJOSU5HX1RJTUUnKSAmJiAkY29tbWFuZE5hbWUgIT09ICdzZWxmLXVwZGF0ZScgJiYgJGNvbW1hbmROYW1lICE9PSAnc2VsZnVwZGF0ZScgJiYgdGltZSgpID4gQ09NUE9TRVJfREVWX1dBUk5JTkdfVElNRSkgewokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPHdhcm5pbmc+V2FybmluZzogVGhpcyBkZXZlbG9wbWVudCBidWlsZCBvZiBDb21wb3NlciBpcyBvdmVyIDYwIGRheXMgb2xkLiBJdCBpcyByZWNvbW1lbmRlZCB0byB1cGRhdGUgaXQgYnkgcnVubmluZyAiJXMgc2VsZi11cGRhdGUiIHRvIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24uPC93YXJuaW5nPicsICRfU0VSVkVSWydQSFBfU0VMRiddKSk7Cn0KCmlmICgkaXNOb25BbGxvd2VkUm9vdCkgewppZiAoJGNvbW1hbmROYW1lICE9PSAnc2VsZi11cGRhdGUnICYmICRjb21tYW5kTmFtZSAhPT0gJ3NlbGZ1cGRhdGUnICYmICRjb21tYW5kTmFtZSAhPT0gJ19jb21wbGV0ZScpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5EbyBub3QgcnVuIENvbXBvc2VyIGFzIHJvb3Qvc3VwZXIgdXNlciEgU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL3Jvb3QgZm9yIGRldGFpbHM8L3dhcm5pbmc+Jyk7CgppZiAoJGlvLT5pc0ludGVyYWN0aXZlKCkpIHsKaWYgKCEkaW8tPmFza0NvbmZpcm1hdGlvbignPGluZm8+Q29udGludWUgYXMgcm9vdC9zdXBlciB1c2VyPC9pbmZvPiBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcpKSB7CnJldHVybiAxOwp9Cn0KfQp9CgoKU2lsZW5jZXI6OmNhbGwoc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJGlvKTogdm9pZCB7CiRwaWQgPSBmdW5jdGlvbl9leGlzdHMoJ2dldG15cGlkJykgPyBnZXRteXBpZCgpIC4gJy0nIDogJyc7CiR0ZW1wZmlsZSA9IHN5c19nZXRfdGVtcF9kaXIoKSAuICcvdGVtcC0nIC4gJHBpZCAuIGJpbjJoZXgocmFuZG9tX2J5dGVzKDUpKTsKaWYgKCEoZmlsZV9wdXRfY29udGVudHMoJHRlbXBmaWxlLCBfX0ZJTEVfXykgJiYgKGZpbGVfZ2V0X2NvbnRlbnRzKCR0ZW1wZmlsZSkgPT09IF9fRklMRV9fKSAmJiB1bmxpbmsoJHRlbXBmaWxlKSAmJiAhZmlsZV9leGlzdHMoJHRlbXBmaWxlKSkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJzxlcnJvcj5QSFAgdGVtcCBkaXJlY3RvcnkgKCVzKSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3Qgd3JpdGFibGUgdG8gQ29tcG9zZXIuIFNldCBzeXNfdGVtcF9kaXIgaW4geW91ciBwaHAuaW5pPC9lcnJvcj4nLCBzeXNfZ2V0X3RlbXBfZGlyKCkpKTsKfQp9KTsKCgokZmlsZSA9IEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpOwppZiAoaXNfZmlsZSgkZmlsZSkgJiYgRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkZmlsZSkgJiYgaXNfYXJyYXkoJGNvbXBvc2VyID0ganNvbl9kZWNvZGUoZmlsZV9nZXRfY29udGVudHMoJGZpbGUpLCB0cnVlKSkpIHsKaWYgKGlzc2V0KCRjb21wb3Nlclsnc2NyaXB0cyddKSAmJiBpc19hcnJheSgkY29tcG9zZXJbJ3NjcmlwdHMnXSkpIHsKZm9yZWFjaCAoJGNvbXBvc2VyWydzY3JpcHRzJ10gYXMgJHNjcmlwdCA9PiAkZHVtbXkpIHsKaWYgKCFkZWZpbmVkKCdDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOjonLnN0cl9yZXBsYWNlKCctJywgJ18nLCBzdHJ0b3VwcGVyKCRzY3JpcHQpKSkpIHsKaWYgKCR0aGlzLT5oYXMoJHNjcmlwdCkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5BIHNjcmlwdCBuYW1lZCAnLiRzY3JpcHQuJyB3b3VsZCBvdmVycmlkZSBhIENvbXBvc2VyIGNvbW1hbmQgYW5kIGhhcyBiZWVuIHNraXBwZWQ8L3dhcm5pbmc+Jyk7Cn0gZWxzZSB7CiRkZXNjcmlwdGlvbiA9IG51bGw7CgppZiAoaXNzZXQoJGNvbXBvc2VyWydzY3JpcHRzLWRlc2NyaXB0aW9ucyddWyRzY3JpcHRdKSkgewokZGVzY3JpcHRpb24gPSAkY29tcG9zZXJbJ3NjcmlwdHMtZGVzY3JpcHRpb25zJ11bJHNjcmlwdF07Cn0KCiRhbGlhc2VzID0gJGNvbXBvc2VyWydzY3JpcHRzLWFsaWFzZXMnXVskc2NyaXB0XSA/PyBbXTsKCiR0aGlzLT5hZGQobmV3IENvbW1hbmRcU2NyaXB0QWxpYXNDb21tYW5kKCRzY3JpcHQsICRkZXNjcmlwdGlvbiwgJGFsaWFzZXMpKTsKfQp9Cn0KfQp9Cn0KCnRyeSB7CmlmICgkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS1wcm9maWxlJykpIHsKJHN0YXJ0VGltZSA9IG1pY3JvdGltZSh0cnVlKTsKJHRoaXMtPmlvLT5lbmFibGVEZWJ1Z2dpbmcoJHN0YXJ0VGltZSk7Cn0KCiRyZXN1bHQgPSBwYXJlbnQ6OmRvUnVuKCRpbnB1dCwgJG91dHB1dCk7CgppZiAodHJ1ZSA9PT0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oWyctLXZlcnNpb24nLCAnLVYnXSwgdHJ1ZSkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJzxpbmZvPlBIUDwvaW5mbz4gdmVyc2lvbiA8Y29tbWVudD4lczwvY29tbWVudD4gKCVzKScsIFxQSFBfVkVSU0lPTiwgXFBIUF9CSU5BUlkpKTsKJGlvLT53cml0ZUVycm9yKCdSdW4gdGhlICJkaWFnbm9zZSIgY29tbWFuZCB0byBnZXQgbW9yZSBkZXRhaWxlZCBkaWFnbm9zdGljcyBvdXRwdXQuJyk7Cn0KCgppZiAoaXNzZXQoJG9sZFdvcmtpbmdEaXIpICYmICcnICE9PSAkb2xkV29ya2luZ0RpcikgewpTaWxlbmNlcjo6Y2FsbCgnY2hkaXInLCAkb2xkV29ya2luZ0Rpcik7Cn0KCmlmIChpc3NldCgkc3RhcnRUaW1lKSkgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPk1lbW9yeSB1c2FnZTogJy5yb3VuZChtZW1vcnlfZ2V0X3VzYWdlKCkgLyAxMDI0IC8gMTAyNCwgMikuJ01pQiAocGVhazogJy5yb3VuZChtZW1vcnlfZ2V0X3BlYWtfdXNhZ2UoKSAvIDEwMjQgLyAxMDI0LCAyKS4nTWlCKSwgdGltZTogJy5yb3VuZChtaWNyb3RpbWUodHJ1ZSkgLSAkc3RhcnRUaW1lLCAyKS4nczwvaW5mbz4nKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0gY2F0Y2ggKFNjcmlwdEV4ZWN1dGlvbkV4Y2VwdGlvbiAkZSkgewppZiAoJHRoaXMtPmdldERpc2FibGVQbHVnaW5zQnlEZWZhdWx0KCkgJiYgJHRoaXMtPmlzUnVubmluZ0FzUm9vdCgpICYmICEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5QbHVnaW5zIGhhdmUgYmVlbiBkaXNhYmxlZCBhdXRvbWF0aWNhbGx5IGFzIHlvdSBhcmUgcnVubmluZyBhcyByb290LCB0aGlzIG1heSBiZSB0aGUgY2F1c2Ugb2YgdGhlIHNjcmlwdCBmYWlsdXJlLjwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+U2VlIGFsc28gaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvcm9vdDwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKcmV0dXJuICRlLT5nZXRDb2RlKCk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKJGdoZSA9IG5ldyBHaXRodWJBY3Rpb25FcnJvcigkdGhpcy0+aW8pOwokZ2hlLT5lbWl0KCRlLT5nZXRNZXNzYWdlKCkpOwoKJHRoaXMtPmhpbnRDb21tb25FcnJvcnMoJGUsICRvdXRwdXQpOwoKCgoKaWYgKCFtZXRob2RfZXhpc3RzKCR0aGlzLCAnc2V0Q2F0Y2hFcnJvcnMnKSAmJiAhJGUgaW5zdGFuY2VvZiBcRXhjZXB0aW9uKSB7CmlmICgkb3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewokdGhpcy0+cmVuZGVyVGhyb3dhYmxlKCRlLCAkb3V0cHV0LT5nZXRFcnJvck91dHB1dCgpKTsKfSBlbHNlIHsKJHRoaXMtPnJlbmRlclRocm93YWJsZSgkZSwgJG91dHB1dCk7Cn0KCnJldHVybiBtYXgoMSwgJGUtPmdldENvZGUoKSk7Cn0KCgoKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uKSB7CiRyZWZsUHJvcCA9IG5ldyBcUmVmbGVjdGlvblByb3BlcnR5KCRlLCAnY29kZScpOwokcmVmbFByb3AtPnNldEFjY2Vzc2libGUodHJ1ZSk7CiRyZWZsUHJvcC0+c2V0VmFsdWUoJGUsIEluc3RhbGxlcjo6RVJST1JfVFJBTlNQT1JUX0VYQ0VQVElPTik7Cn0KCnRocm93ICRlOwp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXROZXdXb3JraW5nRGlyKElucHV0SW50ZXJmYWNlICRpbnB1dCk6ID9zdHJpbmcKewoKJHdvcmtpbmdEaXIgPSAkaW5wdXQtPmdldFBhcmFtZXRlck9wdGlvbihbJy0td29ya2luZy1kaXInLCAnLWQnXSwgbnVsbCwgdHJ1ZSk7CmlmIChudWxsICE9PSAkd29ya2luZ0RpciAmJiAhaXNfZGlyKCR3b3JraW5nRGlyKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ludmFsaWQgd29ya2luZyBkaXJlY3Rvcnkgc3BlY2lmaWVkLCAnLiR3b3JraW5nRGlyLicgZG9lcyBub3QgZXhpc3QuJyk7Cn0KCnJldHVybiAkd29ya2luZ0RpcjsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBoaW50Q29tbW9uRXJyb3JzKFxUaHJvd2FibGUgJGV4Y2VwdGlvbiwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoKGdldF9jbGFzcygkZXhjZXB0aW9uKSA9PT0gTG9naWNFeGNlcHRpb246OmNsYXNzIHx8ICRleGNlcHRpb24gaW5zdGFuY2VvZiBcRXJyb3IpICYmICRvdXRwdXQtPmdldFZlcmJvc2l0eSgpIDwgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRSkgewokb3V0cHV0LT5zZXRWZXJib3NpdHkoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRSk7Cn0KClNpbGVuY2VyOjpzdXBwcmVzcygpOwp0cnkgewokY29tcG9zZXIgPSAkdGhpcy0+Z2V0Q29tcG9zZXIoZmFsc2UsIHRydWUpOwppZiAobnVsbCAhPT0gJGNvbXBvc2VyICYmIGZ1bmN0aW9uX2V4aXN0cygnZGlza19mcmVlX3NwYWNlJykpIHsKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7CgokbWluU3BhY2VGcmVlID0gMTAwICogMTAyNCAqIDEwMjQ7CmlmICgoKCRkZiA9IGRpc2tfZnJlZV9zcGFjZSgkZGlyID0gJGNvbmZpZy0+Z2V0KCdob21lJykpKSAhPT0gZmFsc2UgJiYgJGRmIDwgJG1pblNwYWNlRnJlZSkKfHwgKCgkZGYgPSBkaXNrX2ZyZWVfc3BhY2UoJGRpciA9ICRjb25maWctPmdldCgndmVuZG9yLWRpcicpKSkgIT09IGZhbHNlICYmICRkZiA8ICRtaW5TcGFjZUZyZWUpCnx8ICgoJGRmID0gZGlza19mcmVlX3NwYWNlKCRkaXIgPSBzeXNfZ2V0X3RlbXBfZGlyKCkpKSAhPT0gZmFsc2UgJiYgJGRmIDwgJG1pblNwYWNlRnJlZSkKKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBkaXNrIGhvc3RpbmcgJy4kZGlyLicgaGFzIGxlc3MgdGhhbiAxMDBNaUIgb2YgZnJlZSBzcGFjZSwgdGhpcyBtYXkgYmUgdGhlIGNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp9ClNpbGVuY2VyOjpyZXN0b3JlKCk7CgppZiAoJGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiBzdHJfY29udGFpbnMoJGV4Y2VwdGlvbi0+Z2V0TWVzc2FnZSgpLCAnVW5hYmxlIHRvIHVzZSBhIHByb3h5JykpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGZvbGxvd2luZyBleGNlcHRpb24gaW5kaWNhdGVzIHlvdXIgcHJveHkgaXMgbWlzY29uZmlndXJlZDwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2ZhcXMvaG93LXRvLXVzZS1jb21wb3Nlci1iZWhpbmQtYS1wcm94eS5tZCBmb3IgZGV0YWlsczwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAkZXhjZXB0aW9uIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmIHN0cl9jb250YWlucygkZXhjZXB0aW9uLT5nZXRNZXNzYWdlKCksICd1bmFibGUgdG8gZ2V0IGxvY2FsIGlzc3VlciBjZXJ0aWZpY2F0ZScpKSB7CiRhdmFzdERldGVjdCA9IGdsb2IoJ0M6XFByb2dyYW0gRmlsZXNcQXZhc3QqJyk7CmlmIChpc19hcnJheSgkYXZhc3REZXRlY3QpICYmIGNvdW50KCRhdmFzdERldGVjdCkgIT09IDApIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGZvbGxvd2luZyBleGNlcHRpb24gaW5kaWNhdGVzIGEgcG9zc2libGUgaXNzdWUgd2l0aCB0aGUgQXZhc3QgRmlyZXdhbGw8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkNoZWNrIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2xvY2FsLWlzc3VlciBmb3IgZGV0YWlsczwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGZvbGxvd2luZyBleGNlcHRpb24gaW5kaWNhdGVzIGEgcG9zc2libGUgaXNzdWUgd2l0aCBhIEZpcmV3YWxsL0FudGl2aXJ1czwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvbG9jYWwtaXNzdWVyIGZvciBkZXRhaWxzPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgZmFsc2UgIT09IHN0cnBvcygkZXhjZXB0aW9uLT5nZXRNZXNzYWdlKCksICdUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBwYXRoIHNwZWNpZmllZCcpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIG1heSBiZSBjYXVzZWQgYnkgYSBzdGFsZSBlbnRyeSBpbiB5b3VyIGNtZC5leGUgQXV0b1J1bjwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL3Ryb3VibGVzaG9vdGluZy5tZCMtdGhlLXN5c3RlbS1jYW5ub3QtZmluZC10aGUtcGF0aC1zcGVjaWZpZWQtd2luZG93cy0gZm9yIGRldGFpbHM8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KCmlmIChmYWxzZSAhPT0gc3RycG9zKCRleGNlcHRpb24tPmdldE1lc3NhZ2UoKSwgJ2ZvcmsgZmFpbGVkIC0gQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGlzIGNhdXNlZCBieSBhIGxhY2sgb2YgbWVtb3J5IG9yIHN3YXAsIG9yIG5vdCBoYXZpbmcgc3dhcCBjb25maWd1cmVkPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5DaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kI3Byb2Mtb3Blbi1mb3JrLWZhaWxlZC1lcnJvcnMgZm9yIGRldGFpbHM8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KCmlmICgkZXhjZXB0aW9uIGluc3RhbmNlb2YgUHJvY2Vzc1RpbWVkT3V0RXhjZXB0aW9uKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGlzIGNhdXNlZCBieSBhIHByb2Nlc3MgdGltZW91dDwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA2LWNvbmZpZy5tZCNwcm9jZXNzLXRpbWVvdXQgZm9yIGRldGFpbHM8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KCmlmICgkdGhpcy0+Z2V0RGlzYWJsZVBsdWdpbnNCeURlZmF1bHQoKSAmJiAkdGhpcy0+aXNSdW5uaW5nQXNSb290KCkgJiYgISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlBsdWdpbnMgaGF2ZSBiZWVuIGRpc2FibGVkIGF1dG9tYXRpY2FsbHkgYXMgeW91IGFyZSBydW5uaW5nIGFzIHJvb3QsIHRoaXMgbWF5IGJlIHRoZSBjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbi4gU2VlIGFsc28gaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvcm9vdDwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfSBlbHNlaWYgKCRleGNlcHRpb24gaW5zdGFuY2VvZiBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24gJiYgJHRoaXMtPmdldERpc2FibGVQbHVnaW5zQnlEZWZhdWx0KCkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+UGx1Z2lucyBoYXZlIGJlZW4gZGlzYWJsZWQsIHdoaWNoIG1heSBiZSB3aHkgc29tZSBjb21tYW5kcyBhcmUgbWlzc2luZywgdW5sZXNzIHlvdSBtYWRlIGEgdHlwbzwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKJGhpbnRzID0gSHR0cERvd25sb2FkZXI6OmdldEV4Y2VwdGlvbkhpbnRzKCRleGNlcHRpb24pOwppZiAobnVsbCAhPT0gJGhpbnRzICYmIGNvdW50KCRoaW50cykgPiAwKSB7CmZvcmVhY2ggKCRoaW50cyBhcyAkaGludCkgewokaW8tPndyaXRlRXJyb3IoJGhpbnQsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3Nlcihib29sICRyZXF1aXJlZCA9IHRydWUsID9ib29sICRkaXNhYmxlUGx1Z2lucyA9IG51bGwsID9ib29sICRkaXNhYmxlU2NyaXB0cyA9IG51bGwpOiA/Q29tcG9zZXIKewppZiAobnVsbCA9PT0gJGRpc2FibGVQbHVnaW5zKSB7CiRkaXNhYmxlUGx1Z2lucyA9ICR0aGlzLT5kaXNhYmxlUGx1Z2luc0J5RGVmYXVsdDsKfQppZiAobnVsbCA9PT0gJGRpc2FibGVTY3JpcHRzKSB7CiRkaXNhYmxlU2NyaXB0cyA9ICR0aGlzLT5kaXNhYmxlU2NyaXB0c0J5RGVmYXVsdDsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5jb21wb3Nlcikgewp0cnkgewokdGhpcy0+Y29tcG9zZXIgPSBGYWN0b3J5OjpjcmVhdGUoUGxhdGZvcm06OmlzSW5wdXRDb21wbGV0aW9uUHJvY2VzcygpID8gbmV3IE51bGxJTygpIDogJHRoaXMtPmlvLCBudWxsLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7Cn0gY2F0Y2ggKFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gJGUpIHsKaWYgKCRyZXF1aXJlZCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJGUtPmdldE1lc3NhZ2UoKSk7CmlmICgkdGhpcy0+YXJlRXhjZXB0aW9uc0NhdWdodCgpKSB7CmV4aXQoMSk7Cn0KdGhyb3cgJGU7Cn0KfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKaWYgKCRyZXF1aXJlZCkgewp0aHJvdyAkZTsKfQp9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uICRlKSB7CmlmICgkcmVxdWlyZWQpIHsKdGhyb3cgJGU7Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXRDb21wb3NlcigpOiB2b2lkCnsKJHRoaXMtPmNvbXBvc2VyID0gbnVsbDsKaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMtPmdldElPKCksICdyZXNldEF1dGhlbnRpY2F0aW9ucycpKSB7CiR0aGlzLT5nZXRJTygpLT5yZXNldEF1dGhlbnRpY2F0aW9ucygpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJTygpOiBJT0ludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+aW87Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwKCk6IHN0cmluZwp7CnJldHVybiBzZWxmOjokbG9nbyAuIHBhcmVudDo6Z2V0SGVscCgpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldERlZmF1bHRDb21tYW5kcygpOiBhcnJheQp7CiRjb21tYW5kcyA9IGFycmF5X21lcmdlKHBhcmVudDo6Z2V0RGVmYXVsdENvbW1hbmRzKCksIFsKbmV3IENvbW1hbmRcQWJvdXRDb21tYW5kKCksCm5ldyBDb21tYW5kXENvbmZpZ0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcRGVwZW5kc0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcUHJvaGliaXRzQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxJbml0Q29tbWFuZCgpLApuZXcgQ29tbWFuZFxJbnN0YWxsQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxDcmVhdGVQcm9qZWN0Q29tbWFuZCgpLApuZXcgQ29tbWFuZFxVcGRhdGVDb21tYW5kKCksCm5ldyBDb21tYW5kXFNlYXJjaENvbW1hbmQoKSwKbmV3IENvbW1hbmRcVmFsaWRhdGVDb21tYW5kKCksCm5ldyBDb21tYW5kXEF1ZGl0Q29tbWFuZCgpLApuZXcgQ29tbWFuZFxTaG93Q29tbWFuZCgpLApuZXcgQ29tbWFuZFxTdWdnZXN0c0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcUmVxdWlyZUNvbW1hbmQoKSwKbmV3IENvbW1hbmRcRHVtcEF1dG9sb2FkQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxTdGF0dXNDb21tYW5kKCksCm5ldyBDb21tYW5kXEFyY2hpdmVDb21tYW5kKCksCm5ldyBDb21tYW5kXERpYWdub3NlQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxSdW5TY3JpcHRDb21tYW5kKCksCm5ldyBDb21tYW5kXExpY2Vuc2VzQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxHbG9iYWxDb21tYW5kKCksCm5ldyBDb21tYW5kXENsZWFyQ2FjaGVDb21tYW5kKCksCm5ldyBDb21tYW5kXFJlbW92ZUNvbW1hbmQoKSwKbmV3IENvbW1hbmRcSG9tZUNvbW1hbmQoKSwKbmV3IENvbW1hbmRcRXhlY0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcT3V0ZGF0ZWRDb21tYW5kKCksCm5ldyBDb21tYW5kXENoZWNrUGxhdGZvcm1SZXFzQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxGdW5kQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxSZWluc3RhbGxDb21tYW5kKCksCm5ldyBDb21tYW5kXEJ1bXBDb21tYW5kKCksCl0pOwoKaWYgKHN0cnBvcyhfX0ZJTEVfXywgJ3BoYXI6JykgPT09IDAgfHwgJzEnID09PSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9URVNUU19BUkVfUlVOTklORycpKSB7CiRjb21tYW5kc1tdID0gbmV3IENvbW1hbmRcU2VsZlVwZGF0ZUNvbW1hbmQoKTsKfQoKcmV0dXJuICRjb21tYW5kczsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldENvbW1hbmROYW1lQmVmb3JlQmluZGluZyhJbnB1dEludGVyZmFjZSAkaW5wdXQpOiA/c3RyaW5nCnsKJGlucHV0ID0gY2xvbmUgJGlucHV0Owp0cnkgewoKJGlucHV0LT5iaW5kKCR0aGlzLT5nZXREZWZpbml0aW9uKCkpOwp9IGNhdGNoIChFeGNlcHRpb25JbnRlcmZhY2UgJGUpIHsKCn0KCnJldHVybiAkaW5wdXQtPmdldEZpcnN0QXJndW1lbnQoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldExvbmdWZXJzaW9uKCk6IHN0cmluZwp7CiRicmFuY2hBbGlhc1N0cmluZyA9ICcnOwppZiAoQ29tcG9zZXI6OkJSQU5DSF9BTElBU19WRVJTSU9OICYmIENvbXBvc2VyOjpCUkFOQ0hfQUxJQVNfVkVSU0lPTiAhPT0gJ0BwYWNrYWdlX2JyYW5jaF9hbGlhc192ZXJzaW9uJy4nQCcpIHsKJGJyYW5jaEFsaWFzU3RyaW5nID0gc3ByaW50ZignICglcyknLCBDb21wb3Nlcjo6QlJBTkNIX0FMSUFTX1ZFUlNJT04pOwp9CgpyZXR1cm4gc3ByaW50ZigKJzxpbmZvPiVzPC9pbmZvPiB2ZXJzaW9uIDxjb21tZW50PiVzJXM8L2NvbW1lbnQ+ICVzJywKJHRoaXMtPmdldE5hbWUoKSwKJHRoaXMtPmdldFZlcnNpb24oKSwKJGJyYW5jaEFsaWFzU3RyaW5nLApDb21wb3Nlcjo6UkVMRUFTRV9EQVRFCik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXREZWZhdWx0SW5wdXREZWZpbml0aW9uKCk6IElucHV0RGVmaW5pdGlvbgp7CiRkZWZpbml0aW9uID0gcGFyZW50OjpnZXREZWZhdWx0SW5wdXREZWZpbml0aW9uKCk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLXByb2ZpbGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc3BsYXkgdGltaW5nIGFuZCBtZW1vcnkgdXNhZ2UgaW5mb3JtYXRpb24nKSk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLW5vLXBsdWdpbnMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1doZXRoZXIgdG8gZGlzYWJsZSBwbHVnaW5zLicpKTsKJGRlZmluaXRpb24tPmFkZE9wdGlvbihuZXcgSW5wdXRPcHRpb24oJy0tbm8tc2NyaXB0cycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcHMgdGhlIGV4ZWN1dGlvbiBvZiBhbGwgc2NyaXB0cyBkZWZpbmVkIGluIGNvbXBvc2VyLmpzb24gZmlsZS4nKSk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLXdvcmtpbmctZGlyJywgJy1kJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnSWYgc3BlY2lmaWVkLCB1c2UgdGhlIGdpdmVuIGRpcmVjdG9yeSBhcyB3b3JraW5nIGRpcmVjdG9yeS4nKSk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLW5vLWNhY2hlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdQcmV2ZW50IHVzZSBvZiB0aGUgY2FjaGUnKSk7CgpyZXR1cm4gJGRlZmluaXRpb247Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGx1Z2luQ29tbWFuZHMoKTogYXJyYXkKewokY29tbWFuZHMgPSBbXTsKCiRjb21wb3NlciA9ICR0aGlzLT5nZXRDb21wb3NlcihmYWxzZSwgZmFsc2UpOwppZiAobnVsbCA9PT0gJGNvbXBvc2VyKSB7CiRjb21wb3NlciA9IEZhY3Rvcnk6OmNyZWF0ZUdsb2JhbCgkdGhpcy0+aW8sICR0aGlzLT5kaXNhYmxlUGx1Z2luc0J5RGVmYXVsdCwgJHRoaXMtPmRpc2FibGVTY3JpcHRzQnlEZWZhdWx0KTsKfQoKaWYgKG51bGwgIT09ICRjb21wb3NlcikgewokcG0gPSAkY29tcG9zZXItPmdldFBsdWdpbk1hbmFnZXIoKTsKZm9yZWFjaCAoJHBtLT5nZXRQbHVnaW5DYXBhYmlsaXRpZXMoJ0NvbXBvc2VyXFBsdWdpblxDYXBhYmlsaXR5XENvbW1hbmRQcm92aWRlcicsIFsnY29tcG9zZXInID0+ICRjb21wb3NlciwgJ2lvJyA9PiAkdGhpcy0+aW9dKSBhcyAkY2FwYWJpbGl0eSkgewokbmV3Q29tbWFuZHMgPSAkY2FwYWJpbGl0eS0+Z2V0Q29tbWFuZHMoKTsKaWYgKCFpc19hcnJheSgkbmV3Q29tbWFuZHMpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdQbHVnaW4gY2FwYWJpbGl0eSAnLmdldF9jbGFzcygkY2FwYWJpbGl0eSkuJyBmYWlsZWQgdG8gcmV0dXJuIGFuIGFycmF5IGZyb20gZ2V0Q29tbWFuZHMnKTsKfQpmb3JlYWNoICgkbmV3Q29tbWFuZHMgYXMgJGNvbW1hbmQpIHsKaWYgKCEkY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRcQmFzZUNvbW1hbmQpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1BsdWdpbiBjYXBhYmlsaXR5ICcuZ2V0X2NsYXNzKCRjYXBhYmlsaXR5KS4nIHJldHVybmVkIGFuIGludmFsaWQgdmFsdWUsIHdlIGV4cGVjdGVkIGFuIGFycmF5IG9mIENvbXBvc2VyXENvbW1hbmRcQmFzZUNvbW1hbmQgb2JqZWN0cycpOwp9Cn0KJGNvbW1hbmRzID0gYXJyYXlfbWVyZ2UoJGNvbW1hbmRzLCAkbmV3Q29tbWFuZHMpOwp9Cn0KCnJldHVybiAkY29tbWFuZHM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluaXRpYWxXb3JraW5nRGlyZWN0b3J5KCkKewpyZXR1cm4gJHRoaXMtPmluaXRpYWxXb3JraW5nRGlyZWN0b3J5Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzYWJsZVBsdWdpbnNCeURlZmF1bHQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZGlzYWJsZVBsdWdpbnNCeURlZmF1bHQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXNhYmxlU2NyaXB0c0J5RGVmYXVsdCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5kaXNhYmxlU2NyaXB0c0J5RGVmYXVsdDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRVc2VQYXJlbnREaXJDb25maWdWYWx1ZSgpCnsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygkdGhpcy0+aW8pOwoKcmV0dXJuICRjb25maWctPmdldCgndXNlLXBhcmVudC1kaXInKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBpc1J1bm5pbmdBc1Jvb3QoKTogYm9vbAp7CnJldHVybiBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHVpZCcpICYmIHBvc2l4X2dldHVpZCgpID09PSAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbnNvbGU7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKZmluYWwgY2xhc3MgR2l0aHViQWN0aW9uRXJyb3IKewoKCgpwcm90ZWN0ZWQgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+aW8gPSAkaW87Cn0KCnB1YmxpYyBmdW5jdGlvbiBlbWl0KHN0cmluZyAkbWVzc2FnZSwgP3N0cmluZyAkZmlsZSA9IG51bGwsID9pbnQgJGxpbmUgPSBudWxsKTogdm9pZAp7CmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdHSVRIVUJfQUNUSU9OUycpICYmICFQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9URVNUU19BUkVfUlVOTklORycpKSB7CiRtZXNzYWdlID0gJHRoaXMtPmVzY2FwZURhdGEoJG1lc3NhZ2UpOwoKaWYgKCRmaWxlICYmICRsaW5lKSB7CiRmaWxlID0gJHRoaXMtPmVzY2FwZVByb3BlcnR5KCRmaWxlKTsKJHRoaXMtPmlvLT53cml0ZSgiOjplcnJvciBmaWxlPSIuICRmaWxlIC4iLGxpbmU9Ii4gJGxpbmUgLiI6OiIuICRtZXNzYWdlKTsKfSBlbHNlaWYgKCRmaWxlKSB7CiRmaWxlID0gJHRoaXMtPmVzY2FwZVByb3BlcnR5KCRmaWxlKTsKJHRoaXMtPmlvLT53cml0ZSgiOjplcnJvciBmaWxlPSIuICRmaWxlIC4iOjoiLiAkbWVzc2FnZSk7Cn0gZWxzZSB7CiR0aGlzLT5pby0+d3JpdGUoIjo6ZXJyb3IgOjoiLiAkbWVzc2FnZSk7Cn0KfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGVzY2FwZURhdGEoc3RyaW5nICRkYXRhKTogc3RyaW5nCnsKCiRkYXRhID0gc3RyX3JlcGxhY2UoIiUiLCAnJTI1JywgJGRhdGEpOwokZGF0YSA9IHN0cl9yZXBsYWNlKCJcciIsICclMEQnLCAkZGF0YSk7CiRkYXRhID0gc3RyX3JlcGxhY2UoIlxuIiwgJyUwQScsICRkYXRhKTsKCnJldHVybiAkZGF0YTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBlc2NhcGVQcm9wZXJ0eShzdHJpbmcgJHByb3BlcnR5KTogc3RyaW5nCnsKCiRwcm9wZXJ0eSA9IHN0cl9yZXBsYWNlKCIlIiwgJyUyNScsICRwcm9wZXJ0eSk7CiRwcm9wZXJ0eSA9IHN0cl9yZXBsYWNlKCJcciIsICclMEQnLCAkcHJvcGVydHkpOwokcHJvcGVydHkgPSBzdHJfcmVwbGFjZSgiXG4iLCAnJTBBJywgJHByb3BlcnR5KTsKJHByb3BlcnR5ID0gc3RyX3JlcGxhY2UoIjoiLCAnJTNBJywgJHByb3BlcnR5KTsKJHByb3BlcnR5ID0gc3RyX3JlcGxhY2UoIiwiLCAnJTJDJywgJHByb3BlcnR5KTsKCnJldHVybiAkcHJvcGVydHk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uc29sZTsKCnVzZSBDbG9zdXJlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyU3R5bGU7CgoKCgpjbGFzcyBIdG1sT3V0cHV0Rm9ybWF0dGVyIGV4dGVuZHMgT3V0cHV0Rm9ybWF0dGVyCnsKCnByaXZhdGUgc3RhdGljICRhdmFpbGFibGVGb3JlZ3JvdW5kQ29sb3JzID0gWwozMCA9PiAnYmxhY2snLAozMSA9PiAncmVkJywKMzIgPT4gJ2dyZWVuJywKMzMgPT4gJ3llbGxvdycsCjM0ID0+ICdibHVlJywKMzUgPT4gJ21hZ2VudGEnLAozNiA9PiAnY3lhbicsCjM3ID0+ICd3aGl0ZScsCl07Cgpwcml2YXRlIHN0YXRpYyAkYXZhaWxhYmxlQmFja2dyb3VuZENvbG9ycyA9IFsKNDAgPT4gJ2JsYWNrJywKNDEgPT4gJ3JlZCcsCjQyID0+ICdncmVlbicsCjQzID0+ICd5ZWxsb3cnLAo0NCA9PiAnYmx1ZScsCjQ1ID0+ICdtYWdlbnRhJywKNDYgPT4gJ2N5YW4nLAo0NyA9PiAnd2hpdGUnLApdOwoKcHJpdmF0ZSBzdGF0aWMgJGF2YWlsYWJsZU9wdGlvbnMgPSBbCjEgPT4gJ2JvbGQnLAo0ID0+ICd1bmRlcnNjb3JlJywKCgoKXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkc3R5bGVzID0gW10pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCh0cnVlLCAkc3R5bGVzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGZvcm1hdCg/c3RyaW5nICRtZXNzYWdlKTogP3N0cmluZwp7CiRmb3JtYXR0ZWQgPSBwYXJlbnQ6OmZvcm1hdCgkbWVzc2FnZSk7CgppZiAoJGZvcm1hdHRlZCA9PT0gbnVsbCkgewpyZXR1cm4gbnVsbDsKfQoKJGNsZWFyRXNjYXBlQ29kZXMgPSAnKD86Mzl8NDl8MHwyMnwyNHwyNXwyN3wyOCknOwoKcmV0dXJuIFByZWc6OnJlcGxhY2VDYWxsYmFjaygie1wwMzNcWyhbMC05O10rKW0oLio/KVwwMzNcWyg/OiIuJGNsZWFyRXNjYXBlQ29kZXMuIjspKj8iLiRjbGVhckVzY2FwZUNvZGVzLiJtfXMiLCBDbG9zdXJlOjpmcm9tQ2FsbGFibGUoWyR0aGlzLCAnZm9ybWF0SHRtbCddKSwgJGZvcm1hdHRlZCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZm9ybWF0SHRtbChhcnJheSAkbWF0Y2hlcyk6IHN0cmluZwp7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbMV0pKTsKJG91dCA9ICc8c3BhbiBzdHlsZT0iJzsKZm9yZWFjaCAoZXhwbG9kZSgnOycsICRtYXRjaGVzWzFdKSBhcyAkY29kZSkgewppZiAoaXNzZXQoc2VsZjo6JGF2YWlsYWJsZUZvcmVncm91bmRDb2xvcnNbKGludCkgJGNvZGVdKSkgewokb3V0IC49ICdjb2xvcjonLnNlbGY6OiRhdmFpbGFibGVGb3JlZ3JvdW5kQ29sb3JzWyhpbnQpICRjb2RlXS4nOyc7Cn0gZWxzZWlmIChpc3NldChzZWxmOjokYXZhaWxhYmxlQmFja2dyb3VuZENvbG9yc1soaW50KSAkY29kZV0pKSB7CiRvdXQgLj0gJ2JhY2tncm91bmQtY29sb3I6Jy5zZWxmOjokYXZhaWxhYmxlQmFja2dyb3VuZENvbG9yc1soaW50KSAkY29kZV0uJzsnOwp9IGVsc2VpZiAoaXNzZXQoc2VsZjo6JGF2YWlsYWJsZU9wdGlvbnNbKGludCkgJGNvZGVdKSkgewpzd2l0Y2ggKHNlbGY6OiRhdmFpbGFibGVPcHRpb25zWyhpbnQpICRjb2RlXSkgewpjYXNlICdib2xkJzoKJG91dCAuPSAnZm9udC13ZWlnaHQ6Ym9sZDsnOwpicmVhazsKCmNhc2UgJ3VuZGVyc2NvcmUnOgokb3V0IC49ICd0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyc7CmJyZWFrOwp9Cn0KfQoKcmV0dXJuICRvdXQuJyI+Jy4kbWF0Y2hlc1syXS4nPC9zcGFuPic7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxTdWdnZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQgYXMgQmFzZUlucHV0QXJndW1lbnQ7CgoKCgoKCgoKCgpjbGFzcyBJbnB1dEFyZ3VtZW50IGV4dGVuZHMgQmFzZUlucHV0QXJndW1lbnQKewoKCgpwcml2YXRlICRzdWdnZXN0ZWRWYWx1ZXM7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCA/aW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwsICRzdWdnZXN0ZWRWYWx1ZXMgPSBbXSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lLCAkbW9kZSwgJGRlc2NyaXB0aW9uLCAkZGVmYXVsdCk7CgokdGhpcy0+c3VnZ2VzdGVkVmFsdWVzID0gJHN1Z2dlc3RlZFZhbHVlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewokdmFsdWVzID0gJHRoaXMtPnN1Z2dlc3RlZFZhbHVlczsKaWYgKCR2YWx1ZXMgaW5zdGFuY2VvZiBcQ2xvc3VyZSAmJiAhXGlzX2FycmF5KCR2YWx1ZXMgPSAkdmFsdWVzKCRpbnB1dCwgJHN1Z2dlc3Rpb25zKSkpIHsgCnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdDbG9zdXJlIGZvciBvcHRpb24gIiVzIiBtdXN0IHJldHVybiBhbiBhcnJheS4gR290ICIlcyIuJywgJHRoaXMtPmdldE5hbWUoKSwgZ2V0X2RlYnVnX3R5cGUoJHZhbHVlcykpKTsKfQppZiAoW10gIT09ICR2YWx1ZXMpIHsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKCR2YWx1ZXMpOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxTdWdnZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uIGFzIEJhc2VJbnB1dE9wdGlvbjsKCgoKCgoKCgoKCmNsYXNzIElucHV0T3B0aW9uIGV4dGVuZHMgQmFzZUlucHV0T3B0aW9uCnsKCgoKcHJpdmF0ZSAkc3VnZ2VzdGVkVmFsdWVzOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCAkc2hvcnRjdXQgPSBudWxsLCA/aW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwsICRzdWdnZXN0ZWRWYWx1ZXMgPSBbXSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lLCAkc2hvcnRjdXQsICRtb2RlLCAkZGVzY3JpcHRpb24sICRkZWZhdWx0KTsKCiR0aGlzLT5zdWdnZXN0ZWRWYWx1ZXMgPSAkc3VnZ2VzdGVkVmFsdWVzOwoKaWYgKFtdICE9PSAkc3VnZ2VzdGVkVmFsdWVzICYmICEkdGhpcy0+YWNjZXB0VmFsdWUoKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0Nhbm5vdCBzZXQgc3VnZ2VzdGVkIHZhbHVlcyBpZiB0aGUgb3B0aW9uIGRvZXMgbm90IGFjY2VwdCBhIHZhbHVlLicpOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKJHZhbHVlcyA9ICR0aGlzLT5zdWdnZXN0ZWRWYWx1ZXM7CmlmICgkdmFsdWVzIGluc3RhbmNlb2YgXENsb3N1cmUgJiYgIVxpc19hcnJheSgkdmFsdWVzID0gJHZhbHVlcygkaW5wdXQsICRzdWdnZXN0aW9ucykpKSB7IAp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQ2xvc3VyZSBmb3IgYXJndW1lbnQgIiVzIiBtdXN0IHJldHVybiBhbiBhcnJheS4gR290ICIlcyIuJywgJHRoaXMtPmdldE5hbWUoKSwgZ2V0X2RlYnVnX3R5cGUoJHZhbHVlcykpKTsKfQppZiAoW10gIT09ICR2YWx1ZXMpIHsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKCR2YWx1ZXMpOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKCgoKCgoKY2xhc3MgRGVjaXNpb25zIGltcGxlbWVudHMgXEl0ZXJhdG9yLCBcQ291bnRhYmxlCnsKcHVibGljIGNvbnN0IERFQ0lTSU9OX0xJVEVSQUwgPSAwOwpwdWJsaWMgY29uc3QgREVDSVNJT05fUkVBU09OID0gMTsKCgpwcm90ZWN0ZWQgJHBvb2w7Cgpwcm90ZWN0ZWQgJGRlY2lzaW9uTWFwOwoKCgpwcm90ZWN0ZWQgJGRlY2lzaW9uUXVldWUgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQb29sICRwb29sKQp7CiR0aGlzLT5wb29sID0gJHBvb2w7CiR0aGlzLT5kZWNpc2lvbk1hcCA9IFtdOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGVjaWRlKGludCAkbGl0ZXJhbCwgaW50ICRsZXZlbCwgUnVsZSAkd2h5KTogdm9pZAp7CiR0aGlzLT5hZGREZWNpc2lvbigkbGl0ZXJhbCwgJGxldmVsKTsKJHRoaXMtPmRlY2lzaW9uUXVldWVbXSA9IFsKc2VsZjo6REVDSVNJT05fTElURVJBTCA9PiAkbGl0ZXJhbCwKc2VsZjo6REVDSVNJT05fUkVBU09OID0+ICR3aHksCl07Cn0KCnB1YmxpYyBmdW5jdGlvbiBzYXRpc2Z5KGludCAkbGl0ZXJhbCk6IGJvb2wKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsKTsKCnJldHVybiAoCiRsaXRlcmFsID4gMCAmJiBpc3NldCgkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0pICYmICR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSA+IDAgfHwKJGxpdGVyYWwgPCAwICYmIGlzc2V0KCR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSkgJiYgJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdIDwgMAopOwp9CgpwdWJsaWMgZnVuY3Rpb24gY29uZmxpY3QoaW50ICRsaXRlcmFsKTogYm9vbAp7CiRwYWNrYWdlSWQgPSBhYnMoJGxpdGVyYWwpOwoKcmV0dXJuICgKKGlzc2V0KCR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSkgJiYgJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdID4gMCAmJiAkbGl0ZXJhbCA8IDApIHx8Cihpc3NldCgkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0pICYmICR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSA8IDAgJiYgJGxpdGVyYWwgPiAwKQopOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGVjaWRlZChpbnQgJGxpdGVyYWxPclBhY2thZ2VJZCk6IGJvb2wKewpyZXR1cm4gKCR0aGlzLT5kZWNpc2lvbk1hcFthYnMoJGxpdGVyYWxPclBhY2thZ2VJZCldID8/IDApICE9PSAwOwp9CgpwdWJsaWMgZnVuY3Rpb24gdW5kZWNpZGVkKGludCAkbGl0ZXJhbE9yUGFja2FnZUlkKTogYm9vbAp7CnJldHVybiAoJHRoaXMtPmRlY2lzaW9uTWFwW2FicygkbGl0ZXJhbE9yUGFja2FnZUlkKV0gPz8gMCkgPT09IDA7Cn0KCnB1YmxpYyBmdW5jdGlvbiBkZWNpZGVkSW5zdGFsbChpbnQgJGxpdGVyYWxPclBhY2thZ2VJZCk6IGJvb2wKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsT3JQYWNrYWdlSWQpOwoKcmV0dXJuIGlzc2V0KCR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSkgJiYgJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdID4gMDsKfQoKcHVibGljIGZ1bmN0aW9uIGRlY2lzaW9uTGV2ZWwoaW50ICRsaXRlcmFsT3JQYWNrYWdlSWQpOiBpbnQKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsT3JQYWNrYWdlSWQpOwppZiAoaXNzZXQoJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdKSkgewpyZXR1cm4gYWJzKCR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSk7Cn0KCnJldHVybiAwOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGVjaXNpb25SdWxlKGludCAkbGl0ZXJhbE9yUGFja2FnZUlkKTogUnVsZQp7CiRwYWNrYWdlSWQgPSBhYnMoJGxpdGVyYWxPclBhY2thZ2VJZCk7Cgpmb3JlYWNoICgkdGhpcy0+ZGVjaXNpb25RdWV1ZSBhcyAkZGVjaXNpb24pIHsKaWYgKCRwYWNrYWdlSWQgPT09IGFicygkZGVjaXNpb25bc2VsZjo6REVDSVNJT05fTElURVJBTF0pKSB7CnJldHVybiAkZGVjaXNpb25bc2VsZjo6REVDSVNJT05fUkVBU09OXTsKfQp9Cgp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdEaWQgbm90IGZpbmQgYSBkZWNpc2lvbiBydWxlIHVzaW5nICcuJGxpdGVyYWxPclBhY2thZ2VJZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhdE9mZnNldChpbnQgJHF1ZXVlT2Zmc2V0KTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmRlY2lzaW9uUXVldWVbJHF1ZXVlT2Zmc2V0XTsKfQoKcHVibGljIGZ1bmN0aW9uIHZhbGlkT2Zmc2V0KGludCAkcXVldWVPZmZzZXQpOiBib29sCnsKcmV0dXJuICRxdWV1ZU9mZnNldCA+PSAwICYmICRxdWV1ZU9mZnNldCA8IFxjb3VudCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBsYXN0UmVhc29uKCk6IFJ1bGUKewpyZXR1cm4gJHRoaXMtPmRlY2lzaW9uUXVldWVbXGNvdW50KCR0aGlzLT5kZWNpc2lvblF1ZXVlKSAtIDFdW3NlbGY6OkRFQ0lTSU9OX1JFQVNPTl07Cn0KCnB1YmxpYyBmdW5jdGlvbiBsYXN0TGl0ZXJhbCgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmRlY2lzaW9uUXVldWVbXGNvdW50KCR0aGlzLT5kZWNpc2lvblF1ZXVlKSAtIDFdW3NlbGY6OkRFQ0lTSU9OX0xJVEVSQUxdOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKTogdm9pZAp7CndoaWxlICgkZGVjaXNpb24gPSBhcnJheV9wb3AoJHRoaXMtPmRlY2lzaW9uUXVldWUpKSB7CiR0aGlzLT5kZWNpc2lvbk1hcFthYnMoJGRlY2lzaW9uW3NlbGY6OkRFQ0lTSU9OX0xJVEVSQUxdKV0gPSAwOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNldFRvT2Zmc2V0KGludCAkb2Zmc2V0KTogdm9pZAp7CndoaWxlIChcY291bnQoJHRoaXMtPmRlY2lzaW9uUXVldWUpID4gJG9mZnNldCArIDEpIHsKJGRlY2lzaW9uID0gYXJyYXlfcG9wKCR0aGlzLT5kZWNpc2lvblF1ZXVlKTsKJHRoaXMtPmRlY2lzaW9uTWFwW2FicygkZGVjaXNpb25bc2VsZjo6REVDSVNJT05fTElURVJBTF0pXSA9IDA7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHJldmVydExhc3QoKTogdm9pZAp7CiR0aGlzLT5kZWNpc2lvbk1hcFthYnMoJHRoaXMtPmxhc3RMaXRlcmFsKCkpXSA9IDA7CmFycmF5X3BvcCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewpyZXR1cm4gXGNvdW50KCR0aGlzLT5kZWNpc2lvblF1ZXVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHJld2luZCgpOiB2b2lkCnsKZW5kKCR0aGlzLT5kZWNpc2lvblF1ZXVlKTsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBjdXJyZW50KCkKewpyZXR1cm4gY3VycmVudCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBrZXkoKTogP2ludAp7CnJldHVybiBrZXkoJHRoaXMtPmRlY2lzaW9uUXVldWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gbmV4dCgpOiB2b2lkCnsKcHJldigkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB2YWxpZCgpOiBib29sCnsKcmV0dXJuIGZhbHNlICE9PSBjdXJyZW50KCR0aGlzLT5kZWNpc2lvblF1ZXVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRW1wdHkoKTogYm9vbAp7CnJldHVybiBcY291bnQoJHRoaXMtPmRlY2lzaW9uUXVldWUpID09PSAwOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkRGVjaXNpb24oaW50ICRsaXRlcmFsLCBpbnQgJGxldmVsKTogdm9pZAp7CiRwYWNrYWdlSWQgPSBhYnMoJGxpdGVyYWwpOwoKJHByZXZpb3VzRGVjaXNpb24gPSAkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0gPz8gMDsKaWYgKCRwcmV2aW91c0RlY2lzaW9uICE9PSAwKSB7CiRsaXRlcmFsU3RyaW5nID0gJHRoaXMtPnBvb2wtPmxpdGVyYWxUb1ByZXR0eVN0cmluZygkbGl0ZXJhbCwgW10pOwokcGFja2FnZSA9ICR0aGlzLT5wb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKdGhyb3cgbmV3IFNvbHZlckJ1Z0V4Y2VwdGlvbigKIlRyeWluZyB0byBkZWNpZGUgJGxpdGVyYWxTdHJpbmcgb24gbGV2ZWwgJGxldmVsLCBldmVuIHRob3VnaCAkcGFja2FnZSB3YXMgcHJldmlvdXNseSBkZWNpZGVkIGFzICIuJHByZXZpb3VzRGVjaXNpb24uIi4iCik7Cn0KCmlmICgkbGl0ZXJhbCA+IDApIHsKJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdID0gJGxldmVsOwp9IGVsc2UgewokdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0gPSAtJGxldmVsOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZyg/UG9vbCAkcG9vbCA9IG51bGwpOiBzdHJpbmcKewokZGVjaXNpb25NYXAgPSAkdGhpcy0+ZGVjaXNpb25NYXA7Cmtzb3J0KCRkZWNpc2lvbk1hcCk7CiRzdHIgPSAnWyc7CmZvcmVhY2ggKCRkZWNpc2lvbk1hcCBhcyAkcGFja2FnZUlkID0+ICRsZXZlbCkgewokc3RyIC49ICgkcG9vbCAhPT0gbnVsbCA/ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRwYWNrYWdlSWQpIDogJHBhY2thZ2VJZCkuJzonLiRsZXZlbC4nLCc7Cn0KJHN0ciAuPSAnXSc7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT50b1N0cmluZygpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29tcGlsaW5nTWF0Y2hlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CgoKCgoKY2xhc3MgRGVmYXVsdFBvbGljeSBpbXBsZW1lbnRzIFBvbGljeUludGVyZmFjZQp7Cgpwcml2YXRlICRwcmVmZXJTdGFibGU7Cgpwcml2YXRlICRwcmVmZXJMb3dlc3Q7Cgpwcml2YXRlICRwcmVmZXJyZWRWZXJzaW9uczsKCnByaXZhdGUgJHByZWZlcnJlZFBhY2thZ2VSZXN1bHRDYWNoZVBlclBvb2w7Cgpwcml2YXRlICRzb3J0aW5nQ2FjaGVQZXJQb29sOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGJvb2wgJHByZWZlclN0YWJsZSA9IGZhbHNlLCBib29sICRwcmVmZXJMb3dlc3QgPSBmYWxzZSwgP2FycmF5ICRwcmVmZXJyZWRWZXJzaW9ucyA9IG51bGwpCnsKJHRoaXMtPnByZWZlclN0YWJsZSA9ICRwcmVmZXJTdGFibGU7CiR0aGlzLT5wcmVmZXJMb3dlc3QgPSAkcHJlZmVyTG93ZXN0OwokdGhpcy0+cHJlZmVycmVkVmVyc2lvbnMgPSAkcHJlZmVycmVkVmVyc2lvbnM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHZlcnNpb25Db21wYXJlKFBhY2thZ2VJbnRlcmZhY2UgJGEsIFBhY2thZ2VJbnRlcmZhY2UgJGIsIHN0cmluZyAkb3BlcmF0b3IpOiBib29sCnsKaWYgKCR0aGlzLT5wcmVmZXJTdGFibGUgJiYgKCRzdGFiQSA9ICRhLT5nZXRTdGFiaWxpdHkoKSkgIT09ICgkc3RhYkIgPSAkYi0+Z2V0U3RhYmlsaXR5KCkpKSB7CnJldHVybiBCYXNlUGFja2FnZTo6U1RBQklMSVRJRVNbJHN0YWJBXSA8IEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFU1skc3RhYkJdOwp9CgoKaWYgKCgkYS0+aXNEZXYoKSAmJiBzdHJfc3RhcnRzX3dpdGgoJGEtPmdldFZlcnNpb24oKSwgJ2Rldi0nKSkgfHwgKCRiLT5pc0RldigpICYmIHN0cl9zdGFydHNfd2l0aCgkYi0+Z2V0VmVyc2lvbigpLCAnZGV2LScpKSkgewokY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCRvcGVyYXRvciwgJGItPmdldFZlcnNpb24oKSk7CiR2ZXJzaW9uID0gbmV3IENvbnN0cmFpbnQoJz09JywgJGEtPmdldFZlcnNpb24oKSk7CgpyZXR1cm4gJGNvbnN0cmFpbnQtPm1hdGNoU3BlY2lmaWMoJHZlcnNpb24sIHRydWUpOwp9CgpyZXR1cm4gQ29tcGlsaW5nTWF0Y2hlcjo6bWF0Y2gobmV3IENvbnN0cmFpbnQoJG9wZXJhdG9yLCAkYi0+Z2V0VmVyc2lvbigpKSwgQ29uc3RyYWludDo6T1BfRVEsICRhLT5nZXRWZXJzaW9uKCkpOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIHNlbGVjdFByZWZlcnJlZFBhY2thZ2VzKFBvb2wgJHBvb2wsIGFycmF5ICRsaXRlcmFscywgP3N0cmluZyAkcmVxdWlyZWRQYWNrYWdlID0gbnVsbCk6IGFycmF5CnsKc29ydCgkbGl0ZXJhbHMpOwokcmVzdWx0Q2FjaGVLZXkgPSBpbXBsb2RlKCcsJywgJGxpdGVyYWxzKS4kcmVxdWlyZWRQYWNrYWdlOwokcG9vbElkID0gc3BsX29iamVjdF9pZCgkcG9vbCk7CgppZiAoaXNzZXQoJHRoaXMtPnByZWZlcnJlZFBhY2thZ2VSZXN1bHRDYWNoZVBlclBvb2xbJHBvb2xJZF1bJHJlc3VsdENhY2hlS2V5XSkpIHsKcmV0dXJuICR0aGlzLT5wcmVmZXJyZWRQYWNrYWdlUmVzdWx0Q2FjaGVQZXJQb29sWyRwb29sSWRdWyRyZXN1bHRDYWNoZUtleV07Cn0KCiRwYWNrYWdlcyA9ICR0aGlzLT5ncm91cExpdGVyYWxzQnlOYW1lKCRwb29sLCAkbGl0ZXJhbHMpOwoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICYkbmFtZUxpdGVyYWxzKSB7CnVzb3J0KCRuYW1lTGl0ZXJhbHMsIGZ1bmN0aW9uICgkYSwgJGIpIHVzZSAoJHBvb2wsICRyZXF1aXJlZFBhY2thZ2UsICRwb29sSWQpOiBpbnQgewokY2FjaGVLZXkgPSAnaScuJGEuJy4nLiRiLiRyZXF1aXJlZFBhY2thZ2U7IAoKaWYgKGlzc2V0KCR0aGlzLT5zb3J0aW5nQ2FjaGVQZXJQb29sWyRwb29sSWRdWyRjYWNoZUtleV0pKSB7CnJldHVybiAkdGhpcy0+c29ydGluZ0NhY2hlUGVyUG9vbFskcG9vbElkXVskY2FjaGVLZXldOwp9CgpyZXR1cm4gJHRoaXMtPnNvcnRpbmdDYWNoZVBlclBvb2xbJHBvb2xJZF1bJGNhY2hlS2V5XSA9ICR0aGlzLT5jb21wYXJlQnlQcmlvcml0eSgkcG9vbCwgJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGEpLCAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkYiksICRyZXF1aXJlZFBhY2thZ2UsIHRydWUpOwp9KTsKfQoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICYkc29ydGVkTGl0ZXJhbHMpIHsKJHNvcnRlZExpdGVyYWxzID0gJHRoaXMtPnBydW5lVG9CZXN0VmVyc2lvbigkcG9vbCwgJHNvcnRlZExpdGVyYWxzKTsKJHNvcnRlZExpdGVyYWxzID0gJHRoaXMtPnBydW5lUmVtb3RlQWxpYXNlcygkcG9vbCwgJHNvcnRlZExpdGVyYWxzKTsKfQoKJHNlbGVjdGVkID0gYXJyYXlfbWVyZ2UoLi4uYXJyYXlfdmFsdWVzKCRwYWNrYWdlcykpOwoKCnVzb3J0KCRzZWxlY3RlZCwgZnVuY3Rpb24gKCRhLCAkYikgdXNlICgkcG9vbCwgJHJlcXVpcmVkUGFja2FnZSwgJHBvb2xJZCk6IGludCB7CiRjYWNoZUtleSA9ICRhLicuJy4kYi4kcmVxdWlyZWRQYWNrYWdlOyAKCmlmIChpc3NldCgkdGhpcy0+c29ydGluZ0NhY2hlUGVyUG9vbFskcG9vbElkXVskY2FjaGVLZXldKSkgewpyZXR1cm4gJHRoaXMtPnNvcnRpbmdDYWNoZVBlclBvb2xbJHBvb2xJZF1bJGNhY2hlS2V5XTsKfQoKcmV0dXJuICR0aGlzLT5zb3J0aW5nQ2FjaGVQZXJQb29sWyRwb29sSWRdWyRjYWNoZUtleV0gPSAkdGhpcy0+Y29tcGFyZUJ5UHJpb3JpdHkoJHBvb2wsICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRhKSwgJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGIpLCAkcmVxdWlyZWRQYWNrYWdlKTsKfSk7CgpyZXR1cm4gJHRoaXMtPnByZWZlcnJlZFBhY2thZ2VSZXN1bHRDYWNoZVBlclBvb2xbJHBvb2xJZF1bJHJlc3VsdENhY2hlS2V5XSA9ICRzZWxlY3RlZDsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBncm91cExpdGVyYWxzQnlOYW1lKFBvb2wgJHBvb2wsIGFycmF5ICRsaXRlcmFscyk6IGFycmF5CnsKJHBhY2thZ2VzID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewokcGFja2FnZU5hbWUgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCktPmdldE5hbWUoKTsKCmlmICghaXNzZXQoJHBhY2thZ2VzWyRwYWNrYWdlTmFtZV0pKSB7CiRwYWNrYWdlc1skcGFja2FnZU5hbWVdID0gW107Cn0KJHBhY2thZ2VzWyRwYWNrYWdlTmFtZV1bXSA9ICRsaXRlcmFsOwp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGFyZUJ5UHJpb3JpdHkoUG9vbCAkcG9vbCwgQmFzZVBhY2thZ2UgJGEsIEJhc2VQYWNrYWdlICRiLCA/c3RyaW5nICRyZXF1aXJlZFBhY2thZ2UgPSBudWxsLCBib29sICRpZ25vcmVSZXBsYWNlID0gZmFsc2UpOiBpbnQKewoKaWYgKCRhLT5nZXROYW1lKCkgPT09ICRiLT5nZXROYW1lKCkpIHsKJGFBbGlhc2VkID0gJGEgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2U7CiRiQWxpYXNlZCA9ICRiIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlOwppZiAoJGFBbGlhc2VkICYmICEkYkFsaWFzZWQpIHsKcmV0dXJuIC0xOyAKfQppZiAoISRhQWxpYXNlZCAmJiAkYkFsaWFzZWQpIHsKcmV0dXJuIDE7IAp9Cn0KCmlmICghJGlnbm9yZVJlcGxhY2UpIHsKCmlmICgkdGhpcy0+cmVwbGFjZXMoJGEsICRiKSkgewpyZXR1cm4gMTsgCn0KaWYgKCR0aGlzLT5yZXBsYWNlcygkYiwgJGEpKSB7CnJldHVybiAtMTsgCn0KCgoKaWYgKCRyZXF1aXJlZFBhY2thZ2UgIT09IG51bGwgJiYgZmFsc2UgIT09ICgkcG9zID0gc3RycG9zKCRyZXF1aXJlZFBhY2thZ2UsICcvJykpKSB7CiRyZXF1aXJlZFZlbmRvciA9IHN1YnN0cigkcmVxdWlyZWRQYWNrYWdlLCAwLCAkcG9zKTsKCiRhSXNTYW1lVmVuZG9yID0gc3RycG9zKCRhLT5nZXROYW1lKCksICRyZXF1aXJlZFZlbmRvcikgPT09IDA7CiRiSXNTYW1lVmVuZG9yID0gc3RycG9zKCRiLT5nZXROYW1lKCksICRyZXF1aXJlZFZlbmRvcikgPT09IDA7CgppZiAoJGJJc1NhbWVWZW5kb3IgIT09ICRhSXNTYW1lVmVuZG9yKSB7CnJldHVybiAkYUlzU2FtZVZlbmRvciA/IC0xIDogMTsKfQp9Cn0KCgppZiAoJGEtPmlkID09PSAkYi0+aWQpIHsKcmV0dXJuIDA7Cn0KCnJldHVybiAoJGEtPmlkIDwgJGItPmlkKSA/IC0xIDogMTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlcGxhY2VzKEJhc2VQYWNrYWdlICRzb3VyY2UsIEJhc2VQYWNrYWdlICR0YXJnZXQpOiBib29sCnsKZm9yZWFjaCAoJHNvdXJjZS0+Z2V0UmVwbGFjZXMoKSBhcyAkbGluaykgewppZiAoJGxpbmstPmdldFRhcmdldCgpID09PSAkdGFyZ2V0LT5nZXROYW1lKCkKCgopIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBydW5lVG9CZXN0VmVyc2lvbihQb29sICRwb29sLCBhcnJheSAkbGl0ZXJhbHMpOiBhcnJheQp7CmlmICgkdGhpcy0+cHJlZmVycmVkVmVyc2lvbnMgIT09IG51bGwpIHsKJG5hbWUgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMF0pLT5nZXROYW1lKCk7CmlmIChpc3NldCgkdGhpcy0+cHJlZmVycmVkVmVyc2lvbnNbJG5hbWVdKSkgewokcHJlZmVycmVkVmVyc2lvbiA9ICR0aGlzLT5wcmVmZXJyZWRWZXJzaW9uc1skbmFtZV07CiRiZXN0TGl0ZXJhbHMgPSBbXTsKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CmlmICgkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCktPmdldFZlcnNpb24oKSA9PT0gJHByZWZlcnJlZFZlcnNpb24pIHsKJGJlc3RMaXRlcmFsc1tdID0gJGxpdGVyYWw7Cn0KfQppZiAoXGNvdW50KCRiZXN0TGl0ZXJhbHMpID4gMCkgewpyZXR1cm4gJGJlc3RMaXRlcmFsczsKfQp9Cn0KCiRvcGVyYXRvciA9ICR0aGlzLT5wcmVmZXJMb3dlc3QgPyAnPCcgOiAnPic7CiRiZXN0TGl0ZXJhbHMgPSBbJGxpdGVyYWxzWzBdXTsKJGJlc3RQYWNrYWdlID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWxzWzBdKTsKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRpID0+ICRsaXRlcmFsKSB7CmlmICgwID09PSAkaSkgewpjb250aW51ZTsKfQoKJHBhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CgppZiAoJHRoaXMtPnZlcnNpb25Db21wYXJlKCRwYWNrYWdlLCAkYmVzdFBhY2thZ2UsICRvcGVyYXRvcikpIHsKJGJlc3RQYWNrYWdlID0gJHBhY2thZ2U7CiRiZXN0TGl0ZXJhbHMgPSBbJGxpdGVyYWxdOwp9IGVsc2VpZiAoJHRoaXMtPnZlcnNpb25Db21wYXJlKCRwYWNrYWdlLCAkYmVzdFBhY2thZ2UsICc9PScpKSB7CiRiZXN0TGl0ZXJhbHNbXSA9ICRsaXRlcmFsOwp9Cn0KCnJldHVybiAkYmVzdExpdGVyYWxzOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcnVuZVJlbW90ZUFsaWFzZXMoUG9vbCAkcG9vbCwgYXJyYXkgJGxpdGVyYWxzKTogYXJyYXkKewokaGFzTG9jYWxBbGlhcyA9IGZhbHNlOwoKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CiRwYWNrYWdlID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwYWNrYWdlLT5pc1Jvb3RQYWNrYWdlQWxpYXMoKSkgewokaGFzTG9jYWxBbGlhcyA9IHRydWU7CmJyZWFrOwp9Cn0KCmlmICghJGhhc0xvY2FsQWxpYXMpIHsKcmV0dXJuICRsaXRlcmFsczsKfQoKJHNlbGVjdGVkID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewokcGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGFja2FnZS0+aXNSb290UGFja2FnZUFsaWFzKCkpIHsKJHNlbGVjdGVkW10gPSAkbGl0ZXJhbDsKfQp9CgpyZXR1cm4gJHNlbGVjdGVkOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCgoKCmNsYXNzIEdlbmVyaWNSdWxlIGV4dGVuZHMgUnVsZQp7Cgpwcm90ZWN0ZWQgJGxpdGVyYWxzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRsaXRlcmFscywgJHJlYXNvbiwgJHJlYXNvbkRhdGEpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkcmVhc29uLCAkcmVhc29uRGF0YSk7CgoKc29ydCgkbGl0ZXJhbHMpOwoKJHRoaXMtPmxpdGVyYWxzID0gJGxpdGVyYWxzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGl0ZXJhbHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmxpdGVyYWxzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaCgpCnsKJGRhdGEgPSB1bnBhY2soJ2loYXNoJywgKHN0cmluZykgaGFzaChcUEhQX1ZFUlNJT05fSUQgPiA4MDEwMCA/ICd4eGgzJyA6ICdzaGExJywgaW1wbG9kZSgnLCcsICR0aGlzLT5saXRlcmFscyksIHRydWUpKTsKaWYgKGZhbHNlID09PSAkZGF0YSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB1bnBhY2tpbmc6ICcuaW1wbG9kZSgnLCAnLCAkdGhpcy0+bGl0ZXJhbHMpKTsKfQoKcmV0dXJuICRkYXRhWydoYXNoJ107Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVxdWFscyhSdWxlICRydWxlKTogYm9vbAp7CnJldHVybiAkdGhpcy0+bGl0ZXJhbHMgPT09ICRydWxlLT5nZXRMaXRlcmFscygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNBc3NlcnRpb24oKTogYm9vbAp7CnJldHVybiAxID09PSBcY291bnQoJHRoaXMtPmxpdGVyYWxzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKJHJlc3VsdCA9ICR0aGlzLT5pc0Rpc2FibGVkKCkgPyAnZGlzYWJsZWQoJyA6ICcoJzsKCmZvcmVhY2ggKCR0aGlzLT5saXRlcmFscyBhcyAkaSA9PiAkbGl0ZXJhbCkgewppZiAoJGkgIT09IDApIHsKJHJlc3VsdCAuPSAnfCc7Cn0KJHJlc3VsdCAuPSAkbGl0ZXJhbDsKfQoKJHJlc3VsdCAuPSAnKSc7CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwoKCgoKCmNsYXNzIExvY2FsUmVwb1RyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb24KewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUmVwb3NpdG9yeUludGVyZmFjZSAkbG9ja2VkUmVwb3NpdG9yeSwgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkbG9jYWxSZXBvc2l0b3J5KQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoCiRsb2NhbFJlcG9zaXRvcnktPmdldFBhY2thZ2VzKCksCiRsb2NrZWRSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpCik7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgpjbGFzcyBMb2NrVHJhbnNhY3Rpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbgp7CgoKCgoKCgpwcm90ZWN0ZWQgJHByZXNlbnRNYXA7CgoKCgoKCgoKcHJvdGVjdGVkICR1bmxvY2thYmxlTWFwOwoKCgoKcHJvdGVjdGVkICRyZXN1bHRQYWNrYWdlczsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUG9vbCAkcG9vbCwgYXJyYXkgJHByZXNlbnRNYXAsIGFycmF5ICR1bmxvY2thYmxlTWFwLCBEZWNpc2lvbnMgJGRlY2lzaW9ucykKewokdGhpcy0+cHJlc2VudE1hcCA9ICRwcmVzZW50TWFwOwokdGhpcy0+dW5sb2NrYWJsZU1hcCA9ICR1bmxvY2thYmxlTWFwOwoKJHRoaXMtPnNldFJlc3VsdFBhY2thZ2VzKCRwb29sLCAkZGVjaXNpb25zKTsKcGFyZW50OjpfX2NvbnN0cnVjdCgkdGhpcy0+cHJlc2VudE1hcCwgJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydhbGwnXSk7Cn0KCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlc3VsdFBhY2thZ2VzKFBvb2wgJHBvb2wsIERlY2lzaW9ucyAkZGVjaXNpb25zKTogdm9pZAp7CiR0aGlzLT5yZXN1bHRQYWNrYWdlcyA9IFsnYWxsJyA9PiBbXSwgJ25vbi1kZXYnID0+IFtdLCAnZGV2JyA9PiBbXV07CmZvcmVhY2ggKCRkZWNpc2lvbnMgYXMgJGkgPT4gJGRlY2lzaW9uKSB7CiRsaXRlcmFsID0gJGRlY2lzaW9uW0RlY2lzaW9uczo6REVDSVNJT05fTElURVJBTF07CgppZiAoJGxpdGVyYWwgPiAwKSB7CiRwYWNrYWdlID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwoKJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydhbGwnXVtdID0gJHBhY2thZ2U7CmlmICghaXNzZXQoJHRoaXMtPnVubG9ja2FibGVNYXBbJHBhY2thZ2UtPmlkXSkpIHsKJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydub24tZGV2J11bXSA9ICRwYWNrYWdlOwp9Cn0KfQp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0Tm9uRGV2UGFja2FnZXMoTG9ja1RyYW5zYWN0aW9uICRleHRyYWN0aW9uUmVzdWx0KTogdm9pZAp7CiRwYWNrYWdlcyA9ICRleHRyYWN0aW9uUmVzdWx0LT5nZXROZXdMb2NrUGFja2FnZXMoZmFsc2UpOwoKJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydkZXYnXSA9ICR0aGlzLT5yZXN1bHRQYWNrYWdlc1snbm9uLWRldiddOwokdGhpcy0+cmVzdWx0UGFja2FnZXNbJ25vbi1kZXYnXSA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmZvcmVhY2ggKCR0aGlzLT5yZXN1bHRQYWNrYWdlc1snZGV2J10gYXMgJGkgPT4gJHJlc3VsdFBhY2thZ2UpIHsKCmlmICgkcGFja2FnZS0+Z2V0TmFtZSgpID09PSAkcmVzdWx0UGFja2FnZS0+Z2V0TmFtZSgpKSB7CiR0aGlzLT5yZXN1bHRQYWNrYWdlc1snbm9uLWRldiddW10gPSAkcmVzdWx0UGFja2FnZTsKdW5zZXQoJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydkZXYnXVskaV0pOwp9Cn0KfQp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5ld0xvY2tQYWNrYWdlcyhib29sICRkZXZNb2RlLCBib29sICR1cGRhdGVNaXJyb3JzID0gZmFsc2UpOiBhcnJheQp7CiRwYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVzdWx0UGFja2FnZXNbJGRldk1vZGUgPyAnZGV2JyA6ICdub24tZGV2J10gYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CgoKaWYgKCR1cGRhdGVNaXJyb3JzID09PSB0cnVlICYmICFhcnJheV9rZXlfZXhpc3RzKHNwbF9vYmplY3RfaGFzaCgkcGFja2FnZSksICR0aGlzLT5wcmVzZW50TWFwKSkgewokcGFja2FnZSA9ICR0aGlzLT51cGRhdGVNaXJyb3JBbmRVcmxzKCRwYWNrYWdlKTsKfQoKJHBhY2thZ2VzW10gPSAkcGFja2FnZTsKfQoKcmV0dXJuICRwYWNrYWdlczsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZU1pcnJvckFuZFVybHMoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiBCYXNlUGFja2FnZQp7CmZvcmVhY2ggKCR0aGlzLT5wcmVzZW50TWFwIGFzICRwcmVzZW50UGFja2FnZSkgewppZiAoJHBhY2thZ2UtPmdldE5hbWUoKSAhPT0gJHByZXNlbnRQYWNrYWdlLT5nZXROYW1lKCkpIHsKY29udGludWU7Cn0KCmlmICgkcGFja2FnZS0+Z2V0VmVyc2lvbigpICE9PSAkcHJlc2VudFBhY2thZ2UtPmdldFZlcnNpb24oKSkgewpjb250aW51ZTsKfQoKaWYgKCRwcmVzZW50UGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkgPT09IG51bGwpIHsKY29udGludWU7Cn0KCmlmICgkcHJlc2VudFBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSAhPT0gJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSkgewpjb250aW51ZTsKfQoKaWYgKCRwcmVzZW50UGFja2FnZSBpbnN0YW5jZW9mIFBhY2thZ2UpIHsKJHByZXNlbnRQYWNrYWdlLT5zZXRTb3VyY2VVcmwoJHBhY2thZ2UtPmdldFNvdXJjZVVybCgpKTsKJHByZXNlbnRQYWNrYWdlLT5zZXRTb3VyY2VNaXJyb3JzKCRwYWNrYWdlLT5nZXRTb3VyY2VNaXJyb3JzKCkpOwp9CgoKaWYgKCRwcmVzZW50UGFja2FnZS0+Z2V0RGlzdFR5cGUoKSAhPT0gJHBhY2thZ2UtPmdldERpc3RUeXBlKCkpIHsKcmV0dXJuICRwcmVzZW50UGFja2FnZTsKfQoKCmlmICgKJHBhY2thZ2UtPmdldERpc3RVcmwoKSAhPT0gbnVsbAomJiAkcHJlc2VudFBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSAhPT0gbnVsbAomJiBQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovLyg/Oig/Ond3d1wuKT9iaXRidWNrZXRcLm9yZ3woYXBpXC4pP2dpdGh1YlwuY29tfCg/Ond3d1wuKT9naXRsYWJcLmNvbSkvfWknLCAkcGFja2FnZS0+Z2V0RGlzdFVybCgpKQopIHsKJHByZXNlbnRQYWNrYWdlLT5zZXREaXN0VXJsKFByZWc6OnJlcGxhY2UoJ3soPzw9L3xzaGE9KVthLWYwLTldezQwfSg/PS98JCl9aScsICRwcmVzZW50UGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpLCAkcGFja2FnZS0+Z2V0RGlzdFVybCgpKSk7Cn0KJHByZXNlbnRQYWNrYWdlLT5zZXREaXN0TWlycm9ycygkcGFja2FnZS0+Z2V0RGlzdE1pcnJvcnMoKSk7CgpyZXR1cm4gJHByZXNlbnRQYWNrYWdlOwp9CgpyZXR1cm4gJHBhY2thZ2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsaWFzZXMoYXJyYXkgJGFsaWFzZXMpOiBhcnJheQp7CiR1c2VkQWxpYXNlcyA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydhbGwnXSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKZm9yZWFjaCAoJGFsaWFzZXMgYXMgJGluZGV4ID0+ICRhbGlhcykgewppZiAoJGFsaWFzWydwYWNrYWdlJ10gPT09ICRwYWNrYWdlLT5nZXROYW1lKCkpIHsKJHVzZWRBbGlhc2VzW10gPSAkYWxpYXM7CnVuc2V0KCRhbGlhc2VzWyRpbmRleF0pOwp9Cn0KfQp9Cgp1c29ydCgkdXNlZEFsaWFzZXMsIHN0YXRpYyBmdW5jdGlvbiAoJGEsICRiKTogaW50IHsKcmV0dXJuIHN0cmNtcCgkYVsncGFja2FnZSddLCAkYlsncGFja2FnZSddKTsKfSk7CgpyZXR1cm4gJHVzZWRBbGlhc2VzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCgoKCgoKY2xhc3MgTXVsdGlDb25mbGljdFJ1bGUgZXh0ZW5kcyBSdWxlCnsKCnByb3RlY3RlZCAkbGl0ZXJhbHM7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGxpdGVyYWxzLCAkcmVhc29uLCAkcmVhc29uRGF0YSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRyZWFzb24sICRyZWFzb25EYXRhKTsKCmlmIChcY291bnQoJGxpdGVyYWxzKSA8IDMpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJtdWx0aSBjb25mbGljdCBydWxlIHJlcXVpcmVzIGF0IGxlYXN0IDMgbGl0ZXJhbHMiKTsKfQoKCnNvcnQoJGxpdGVyYWxzKTsKCiR0aGlzLT5saXRlcmFscyA9ICRsaXRlcmFsczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExpdGVyYWxzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5saXRlcmFsczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhhc2goKQp7CiRkYXRhID0gdW5wYWNrKCdpaGFzaCcsIChzdHJpbmcpIGhhc2goXFBIUF9WRVJTSU9OX0lEID4gODAxMDAgPyAneHhoMycgOiAnc2hhMScsICdjOicuaW1wbG9kZSgnLCcsICR0aGlzLT5saXRlcmFscyksIHRydWUpKTsKaWYgKGZhbHNlID09PSAkZGF0YSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB1bnBhY2tpbmc6ICcuaW1wbG9kZSgnLCAnLCAkdGhpcy0+bGl0ZXJhbHMpKTsKfQoKcmV0dXJuICRkYXRhWydoYXNoJ107Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVxdWFscyhSdWxlICRydWxlKTogYm9vbAp7CmlmICgkcnVsZSBpbnN0YW5jZW9mIE11bHRpQ29uZmxpY3RSdWxlKSB7CnJldHVybiAkdGhpcy0+bGl0ZXJhbHMgPT09ICRydWxlLT5nZXRMaXRlcmFscygpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0Fzc2VydGlvbigpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGRpc2FibGUoKTogdm9pZAp7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiRGlzYWJsaW5nIG11bHRpIGNvbmZsaWN0IHJ1bGVzIGlzIG5vdCBwb3NzaWJsZS4gUGxlYXNlIGNvbnRhY3QgY29tcG9zZXIgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyIHRvIGxldCB1cyBkZWJ1ZyB3aGF0IGxlYWQgdG8gdGhpcyBzaXR1YXRpb24uIik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CgokcmVzdWx0ID0gJHRoaXMtPmlzRGlzYWJsZWQoKSA/ICdkaXNhYmxlZChtdWx0aSgnIDogJyhtdWx0aSgnOwoKZm9yZWFjaCAoJHRoaXMtPmxpdGVyYWxzIGFzICRpID0+ICRsaXRlcmFsKSB7CmlmICgkaSAhPT0gMCkgewokcmVzdWx0IC49ICd8JzsKfQokcmVzdWx0IC49ICRsaXRlcmFsOwp9CgokcmVzdWx0IC49ICcpKSc7CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgSW5zdGFsbE9wZXJhdGlvbiBleHRlbmRzIFNvbHZlck9wZXJhdGlvbiBpbXBsZW1lbnRzIE9wZXJhdGlvbkludGVyZmFjZQp7CnByb3RlY3RlZCBjb25zdCBUWVBFID0gJ2luc3RhbGwnOwoKCgoKcHJvdGVjdGVkICRwYWNrYWdlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJHRoaXMtPnBhY2thZ2UgPSAkcGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2UoKTogUGFja2FnZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+cGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNob3coJGxvY2spOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6Zm9ybWF0KCR0aGlzLT5wYWNrYWdlLCAkbG9jayk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZm9ybWF0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGJvb2wgJGxvY2sgPSBmYWxzZSk6IHN0cmluZwp7CnJldHVybiAoJGxvY2sgPyAnTG9ja2luZyAnIDogJ0luc3RhbGxpbmcgJykuJzxpbmZvPicuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nPC9pbmZvPiAoPGNvbW1lbnQ+Jy4kcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKS4nPC9jb21tZW50PiknOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb247Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CgoKCgoKCmNsYXNzIE1hcmtBbGlhc0luc3RhbGxlZE9wZXJhdGlvbiBleHRlbmRzIFNvbHZlck9wZXJhdGlvbiBpbXBsZW1lbnRzIE9wZXJhdGlvbkludGVyZmFjZQp7CnByb3RlY3RlZCBjb25zdCBUWVBFID0gJ21hcmtBbGlhc0luc3RhbGxlZCc7CgoKCgpwcm90ZWN0ZWQgJHBhY2thZ2U7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQWxpYXNQYWNrYWdlICRwYWNrYWdlKQp7CiR0aGlzLT5wYWNrYWdlID0gJHBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlKCk6IEFsaWFzUGFja2FnZQp7CnJldHVybiAkdGhpcy0+cGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNob3coJGxvY2spOiBzdHJpbmcKewpyZXR1cm4gJ01hcmtpbmcgPGluZm8+Jy4kdGhpcy0+cGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLic8L2luZm8+ICg8Y29tbWVudD4nLiR0aGlzLT5wYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLic8L2NvbW1lbnQ+KSBhcyBpbnN0YWxsZWQsIGFsaWFzIG9mIDxpbmZvPicuJHRoaXMtPnBhY2thZ2UtPmdldEFsaWFzT2YoKS0+Z2V0UHJldHR5TmFtZSgpLic8L2luZm8+ICg8Y29tbWVudD4nLiR0aGlzLT5wYWNrYWdlLT5nZXRBbGlhc09mKCktPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkuJzwvY29tbWVudD4pJzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwoKCgoKCgpjbGFzcyBNYXJrQWxpYXNVbmluc3RhbGxlZE9wZXJhdGlvbiBleHRlbmRzIFNvbHZlck9wZXJhdGlvbiBpbXBsZW1lbnRzIE9wZXJhdGlvbkludGVyZmFjZQp7CnByb3RlY3RlZCBjb25zdCBUWVBFID0gJ21hcmtBbGlhc1VuaW5zdGFsbGVkJzsKCgoKCnByb3RlY3RlZCAkcGFja2FnZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChBbGlhc1BhY2thZ2UgJHBhY2thZ2UpCnsKJHRoaXMtPnBhY2thZ2UgPSAkcGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2UoKTogQWxpYXNQYWNrYWdlCnsKcmV0dXJuICR0aGlzLT5wYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hvdygkbG9jayk6IHN0cmluZwp7CnJldHVybiAnTWFya2luZyA8aW5mbz4nLiR0aGlzLT5wYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJzwvaW5mbz4gKDxjb21tZW50PicuJHRoaXMtPnBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkuJzwvY29tbWVudD4pIGFzIHVuaW5zdGFsbGVkLCBhbGlhcyBvZiA8aW5mbz4nLiR0aGlzLT5wYWNrYWdlLT5nZXRBbGlhc09mKCktPmdldFByZXR0eU5hbWUoKS4nPC9pbmZvPiAoPGNvbW1lbnQ+Jy4kdGhpcy0+cGFja2FnZS0+Z2V0QWxpYXNPZigpLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLic8L2NvbW1lbnQ+KSc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvbjsKCgoKCgoKaW50ZXJmYWNlIE9wZXJhdGlvbkludGVyZmFjZQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdGlvblR5cGUoKTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzaG93KGJvb2wgJGxvY2spOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uOwoKCgoKCgphYnN0cmFjdCBjbGFzcyBTb2x2ZXJPcGVyYXRpb24gaW1wbGVtZW50cyBPcGVyYXRpb25JbnRlcmZhY2UKewoKCgpwcm90ZWN0ZWQgY29uc3QgVFlQRSA9ICcnOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdGlvblR5cGUoKTogc3RyaW5nCnsKcmV0dXJuIHN0YXRpYzo6VFlQRTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CnJldHVybiAkdGhpcy0+c2hvdyhmYWxzZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvbjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIFVuaW5zdGFsbE9wZXJhdGlvbiBleHRlbmRzIFNvbHZlck9wZXJhdGlvbiBpbXBsZW1lbnRzIE9wZXJhdGlvbkludGVyZmFjZQp7CnByb3RlY3RlZCBjb25zdCBUWVBFID0gJ3VuaW5zdGFsbCc7CgoKCgpwcm90ZWN0ZWQgJHBhY2thZ2U7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokdGhpcy0+cGFja2FnZSA9ICRwYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZSgpOiBQYWNrYWdlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5wYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hvdygkbG9jayk6IHN0cmluZwp7CnJldHVybiBzZWxmOjpmb3JtYXQoJHRoaXMtPnBhY2thZ2UsICRsb2NrKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JtYXQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYm9vbCAkbG9jayA9IGZhbHNlKTogc3RyaW5nCnsKcmV0dXJuICdSZW1vdmluZyA8aW5mbz4nLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJzwvaW5mbz4gKDxjb21tZW50PicuJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkuJzwvY29tbWVudD4pJzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwoKCgoKCgpjbGFzcyBVcGRhdGVPcGVyYXRpb24gZXh0ZW5kcyBTb2x2ZXJPcGVyYXRpb24gaW1wbGVtZW50cyBPcGVyYXRpb25JbnRlcmZhY2UKewpwcm90ZWN0ZWQgY29uc3QgVFlQRSA9ICd1cGRhdGUnOwoKCgoKcHJvdGVjdGVkICRpbml0aWFsUGFja2FnZTsKCgoKCnByb3RlY3RlZCAkdGFyZ2V0UGFja2FnZTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KQp7CiR0aGlzLT5pbml0aWFsUGFja2FnZSA9ICRpbml0aWFsOwokdGhpcy0+dGFyZ2V0UGFja2FnZSA9ICR0YXJnZXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbml0aWFsUGFja2FnZSgpOiBQYWNrYWdlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5pbml0aWFsUGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhcmdldFBhY2thZ2UoKTogUGFja2FnZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+dGFyZ2V0UGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNob3coJGxvY2spOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6Zm9ybWF0KCR0aGlzLT5pbml0aWFsUGFja2FnZSwgJHRoaXMtPnRhcmdldFBhY2thZ2UsICRsb2NrKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JtYXQoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbFBhY2thZ2UsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldFBhY2thZ2UsIGJvb2wgJGxvY2sgPSBmYWxzZSk6IHN0cmluZwp7CiRmcm9tVmVyc2lvbiA9ICRpbml0aWFsUGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKTsKJHRvVmVyc2lvbiA9ICR0YXJnZXRQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpOwoKaWYgKCRmcm9tVmVyc2lvbiA9PT0gJHRvVmVyc2lvbiAmJiAkaW5pdGlhbFBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpICE9PSAkdGFyZ2V0UGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpIHsKJGZyb21WZXJzaW9uID0gJGluaXRpYWxQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbih0cnVlLCBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX1NPVVJDRV9SRUYpOwokdG9WZXJzaW9uID0gJHRhcmdldFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKHRydWUsIFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfU09VUkNFX1JFRik7Cn0gZWxzZWlmICgkZnJvbVZlcnNpb24gPT09ICR0b1ZlcnNpb24gJiYgJGluaXRpYWxQYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkgIT09ICR0YXJnZXRQYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkpIHsKJGZyb21WZXJzaW9uID0gJGluaXRpYWxQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbih0cnVlLCBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX0RJU1RfUkVGKTsKJHRvVmVyc2lvbiA9ICR0YXJnZXRQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbih0cnVlLCBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX0RJU1RfUkVGKTsKfQoKJGFjdGlvbk5hbWUgPSBWZXJzaW9uUGFyc2VyOjppc1VwZ3JhZGUoJGluaXRpYWxQYWNrYWdlLT5nZXRWZXJzaW9uKCksICR0YXJnZXRQYWNrYWdlLT5nZXRWZXJzaW9uKCkpID8gJ1VwZ3JhZGluZycgOiAnRG93bmdyYWRpbmcnOwoKcmV0dXJuICRhY3Rpb25OYW1lLicgPGluZm8+Jy4kaW5pdGlhbFBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nPC9pbmZvPiAoPGNvbW1lbnQ+Jy4kZnJvbVZlcnNpb24uJzwvY29tbWVudD4gPT4gPGNvbW1lbnQ+Jy4kdG9WZXJzaW9uLic8L2NvbW1lbnQ+KSc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CgoKCgppbnRlcmZhY2UgUG9saWN5SW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIHZlcnNpb25Db21wYXJlKFBhY2thZ2VJbnRlcmZhY2UgJGEsIFBhY2thZ2VJbnRlcmZhY2UgJGIsIHN0cmluZyAkb3BlcmF0b3IpOiBib29sOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWxlY3RQcmVmZXJyZWRQYWNrYWdlcyhQb29sICRwb29sLCBhcnJheSAkbGl0ZXJhbHMsID9zdHJpbmcgJHJlcXVpcmVkUGFja2FnZSA9IG51bGwpOiBhcnJheTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb21waWxpbmdNYXRjaGVyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CgoKCgoKCgpjbGFzcyBQb29sIGltcGxlbWVudHMgXENvdW50YWJsZQp7Cgpwcm90ZWN0ZWQgJHBhY2thZ2VzID0gW107Cgpwcm90ZWN0ZWQgJHBhY2thZ2VCeU5hbWUgPSBbXTsKCnByb3RlY3RlZCAkdmVyc2lvblBhcnNlcjsKCnByb3RlY3RlZCAkcHJvdmlkZXJDYWNoZSA9IFtdOwoKcHJvdGVjdGVkICR1bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXM7Cgpwcm90ZWN0ZWQgJHJlbW92ZWRWZXJzaW9ucyA9IFtdOwoKcHJvdGVjdGVkICRyZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2UgPSBbXTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcGFja2FnZXMgPSBbXSwgYXJyYXkgJHVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcyA9IFtdLCBhcnJheSAkcmVtb3ZlZFZlcnNpb25zID0gW10sIGFycmF5ICRyZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2UgPSBbXSkKewokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokdGhpcy0+c2V0UGFja2FnZXMoJHBhY2thZ2VzKTsKJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcyA9ICR1bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXM7CiR0aGlzLT5yZW1vdmVkVmVyc2lvbnMgPSAkcmVtb3ZlZFZlcnNpb25zOwokdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlID0gJHJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlbW92ZWRWZXJzaW9ucyhzdHJpbmcgJG5hbWUsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpOiBhcnJheQp7CmlmICghaXNzZXQoJHRoaXMtPnJlbW92ZWRWZXJzaW9uc1skbmFtZV0pKSB7CnJldHVybiBbXTsKfQoKJHJlc3VsdCA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVtb3ZlZFZlcnNpb25zWyRuYW1lXSBhcyAkdmVyc2lvbiA9PiAkcHJldHR5VmVyc2lvbikgewppZiAoJGNvbnN0cmFpbnQtPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHZlcnNpb24pKSkgewokcmVzdWx0WyR2ZXJzaW9uXSA9ICRwcmV0dHlWZXJzaW9uOwp9Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlKHN0cmluZyAkb2JqZWN0SGFzaCk6IGFycmF5CnsKaWYgKCFpc3NldCgkdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlWyRvYmplY3RIYXNoXSkpIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gJHRoaXMtPnJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZVskb2JqZWN0SGFzaF07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc2V0UGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzKTogdm9pZAp7CiRpZCA9IDE7Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHRoaXMtPnBhY2thZ2VzW10gPSAkcGFja2FnZTsKCiRwYWNrYWdlLT5pZCA9ICRpZCsrOwoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKCkgYXMgJHByb3ZpZGVkKSB7CiR0aGlzLT5wYWNrYWdlQnlOYW1lWyRwcm92aWRlZF1bXSA9ICRwYWNrYWdlOwp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wYWNrYWdlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHBhY2thZ2VCeUlkKGludCAkaWQpOiBCYXNlUGFja2FnZQp7CnJldHVybiAkdGhpcy0+cGFja2FnZXNbJGlkIC0gMV07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewpyZXR1cm4gXGNvdW50KCR0aGlzLT5wYWNrYWdlcyk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdoYXRQcm92aWRlcyhzdHJpbmcgJG5hbWUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCk6IGFycmF5CnsKJGtleSA9IChzdHJpbmcpICRjb25zdHJhaW50OwppZiAoaXNzZXQoJHRoaXMtPnByb3ZpZGVyQ2FjaGVbJG5hbWVdWyRrZXldKSkgewpyZXR1cm4gJHRoaXMtPnByb3ZpZGVyQ2FjaGVbJG5hbWVdWyRrZXldOwp9CgpyZXR1cm4gJHRoaXMtPnByb3ZpZGVyQ2FjaGVbJG5hbWVdWyRrZXldID0gJHRoaXMtPmNvbXB1dGVXaGF0UHJvdmlkZXMoJG5hbWUsICRjb25zdHJhaW50KTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjb21wdXRlV2hhdFByb3ZpZGVzKHN0cmluZyAkbmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsKTogYXJyYXkKewppZiAoIWlzc2V0KCR0aGlzLT5wYWNrYWdlQnlOYW1lWyRuYW1lXSkpIHsKcmV0dXJuIFtdOwp9CgokbWF0Y2hlcyA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VCeU5hbWVbJG5hbWVdIGFzICRjYW5kaWRhdGUpIHsKaWYgKCR0aGlzLT5tYXRjaCgkY2FuZGlkYXRlLCAkbmFtZSwgJGNvbnN0cmFpbnQpKSB7CiRtYXRjaGVzW10gPSAkY2FuZGlkYXRlOwp9Cn0KCnJldHVybiAkbWF0Y2hlczsKfQoKcHVibGljIGZ1bmN0aW9uIGxpdGVyYWxUb1BhY2thZ2UoaW50ICRsaXRlcmFsKTogQmFzZVBhY2thZ2UKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsKTsKCnJldHVybiAkdGhpcy0+cGFja2FnZUJ5SWQoJHBhY2thZ2VJZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsaXRlcmFsVG9QcmV0dHlTdHJpbmcoaW50ICRsaXRlcmFsLCBhcnJheSAkaW5zdGFsbGVkTWFwKTogc3RyaW5nCnsKJHBhY2thZ2UgPSAkdGhpcy0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CgppZiAoaXNzZXQoJGluc3RhbGxlZE1hcFskcGFja2FnZS0+aWRdKSkgewokcHJlZml4ID0gKCRsaXRlcmFsID4gMCA/ICdrZWVwJyA6ICdyZW1vdmUnKTsKfSBlbHNlIHsKJHByZWZpeCA9ICgkbGl0ZXJhbCA+IDAgPyAnaW5zdGFsbCcgOiAnZG9uXCd0IGluc3RhbGwnKTsKfQoKcmV0dXJuICRwcmVmaXguJyAnLiRwYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hdGNoKEJhc2VQYWNrYWdlICRjYW5kaWRhdGUsIHN0cmluZyAkbmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsKTogYm9vbAp7CiRjYW5kaWRhdGVOYW1lID0gJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpOwokY2FuZGlkYXRlVmVyc2lvbiA9ICRjYW5kaWRhdGUtPmdldFZlcnNpb24oKTsKCmlmICgkY2FuZGlkYXRlTmFtZSA9PT0gJG5hbWUpIHsKcmV0dXJuICRjb25zdHJhaW50ID09PSBudWxsIHx8IENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRjb25zdHJhaW50LCBDb25zdHJhaW50OjpPUF9FUSwgJGNhbmRpZGF0ZVZlcnNpb24pOwp9CgokcHJvdmlkZXMgPSAkY2FuZGlkYXRlLT5nZXRQcm92aWRlcygpOwokcmVwbGFjZXMgPSAkY2FuZGlkYXRlLT5nZXRSZXBsYWNlcygpOwoKCmlmIChpc3NldCgkcmVwbGFjZXNbMF0pIHx8IGlzc2V0KCRwcm92aWRlc1swXSkpIHsKZm9yZWFjaCAoJHByb3ZpZGVzIGFzICRsaW5rKSB7CmlmICgkbGluay0+Z2V0VGFyZ2V0KCkgPT09ICRuYW1lICYmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKZm9yZWFjaCAoJHJlcGxhY2VzIGFzICRsaW5rKSB7CmlmICgkbGluay0+Z2V0VGFyZ2V0KCkgPT09ICRuYW1lICYmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgppZiAoaXNzZXQoJHByb3ZpZGVzWyRuYW1lXSkgJiYgKCRjb25zdHJhaW50ID09PSBudWxsIHx8ICRjb25zdHJhaW50LT5tYXRjaGVzKCRwcm92aWRlc1skbmFtZV0tPmdldENvbnN0cmFpbnQoKSkpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoaXNzZXQoJHJlcGxhY2VzWyRuYW1lXSkgJiYgKCRjb25zdHJhaW50ID09PSBudWxsIHx8ICRjb25zdHJhaW50LT5tYXRjaGVzKCRyZXBsYWNlc1skbmFtZV0tPmdldENvbnN0cmFpbnQoKSkpKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1VuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogYm9vbAp7CnJldHVybiBcaW5fYXJyYXkoJHBhY2thZ2UsICR0aGlzLT51bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMsIHRydWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT51bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CiRzdHIgPSAiUG9vbDpcbiI7Cgpmb3JlYWNoICgkdGhpcy0+cGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHN0ciAuPSAnLSAnLnN0cl9wYWQoKHN0cmluZykgJHBhY2thZ2UtPmlkLCA2LCAnICcsIFNUUl9QQURfTEVGVCkuJzogJy4kcGFja2FnZS0+Z2V0TmFtZSgpLiJcbiI7Cn0KCnJldHVybiAkc3RyOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cU3RhYmlsaXR5RmlsdGVyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFBsdWdpblxQcmVQb29sQ3JlYXRlRXZlbnQ7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbXBpbGluZ01hdGNoZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE11bHRpQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxJbnRlcnZhbHM7CgoKCgpjbGFzcyBQb29sQnVpbGRlcgp7CgoKCgpwcml2YXRlICRhY2NlcHRhYmxlU3RhYmlsaXRpZXM7CgoKCgpwcml2YXRlICRzdGFiaWxpdHlGbGFnczsKCgoKCnByaXZhdGUgJHJvb3RBbGlhc2VzOwoKCgoKcHJpdmF0ZSAkcm9vdFJlZmVyZW5jZXM7CgoKCnByaXZhdGUgJHRlbXBvcmFyeUNvbnN0cmFpbnRzOwoKCgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7CgoKCnByaXZhdGUgJHBvb2xPcHRpbWl6ZXI7CgoKCnByaXZhdGUgJGlvOwoKCgoKcHJpdmF0ZSAkYWxpYXNNYXAgPSBbXTsKCgoKCnByaXZhdGUgJHBhY2thZ2VzVG9Mb2FkID0gW107CgoKCgpwcml2YXRlICRsb2FkZWRQYWNrYWdlcyA9IFtdOwoKCgoKcHJpdmF0ZSAkbG9hZGVkUGVyUmVwbyA9IFtdOwoKCgpwcml2YXRlICRwYWNrYWdlcyA9IFtdOwoKCgpwcml2YXRlICR1bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMgPSBbXTsKCnByaXZhdGUgJHVwZGF0ZUFsbG93TGlzdCA9IFtdOwoKcHJpdmF0ZSAkc2tpcHBlZExvYWQgPSBbXTsKCnByaXZhdGUgJGlnbm9yZWRUeXBlcyA9IFtdOwoKcHJpdmF0ZSAkYWxsb3dlZFR5cGVzID0gbnVsbDsKCgoKCgoKCgoKcHJpdmF0ZSAkcmVzdHJpY3RlZFBhY2thZ2VzTGlzdCA9IG51bGw7CgoKCgoKCgoKCnByaXZhdGUgJHBhdGhSZXBvVW5sb2NrZWQgPSBbXTsKCgoKCgoKCgoKCgpwcml2YXRlICRtYXhFeHRlbmRlZFJlcXMgPSBbXTsKCgoKCnByaXZhdGUgJHVwZGF0ZUFsbG93V2FybmVkID0gW107CgoKcHJpdmF0ZSAkaW5kZXhDb3VudGVyID0gMDsKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsIGFycmF5ICRzdGFiaWxpdHlGbGFncywgYXJyYXkgJHJvb3RBbGlhc2VzLCBhcnJheSAkcm9vdFJlZmVyZW5jZXMsIElPSW50ZXJmYWNlICRpbywgP0V2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyID0gbnVsbCwgP1Bvb2xPcHRpbWl6ZXIgJHBvb2xPcHRpbWl6ZXIgPSBudWxsLCBhcnJheSAkdGVtcG9yYXJ5Q29uc3RyYWludHMgPSBbXSkKewokdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzID0gJGFjY2VwdGFibGVTdGFiaWxpdGllczsKJHRoaXMtPnN0YWJpbGl0eUZsYWdzID0gJHN0YWJpbGl0eUZsYWdzOwokdGhpcy0+cm9vdEFsaWFzZXMgPSAkcm9vdEFsaWFzZXM7CiR0aGlzLT5yb290UmVmZXJlbmNlcyA9ICRyb290UmVmZXJlbmNlczsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciA9ICRldmVudERpc3BhdGNoZXI7CiR0aGlzLT5wb29sT3B0aW1pemVyID0gJHBvb2xPcHRpbWl6ZXI7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzID0gJHRlbXBvcmFyeUNvbnN0cmFpbnRzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJZ25vcmVkVHlwZXMoYXJyYXkgJHR5cGVzKTogdm9pZAp7CiR0aGlzLT5pZ25vcmVkVHlwZXMgPSAkdHlwZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFsbG93ZWRUeXBlcyg/YXJyYXkgJHR5cGVzKTogdm9pZAp7CiR0aGlzLT5hbGxvd2VkVHlwZXMgPSAkdHlwZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBidWlsZFBvb2woYXJyYXkgJHJlcG9zaXRvcmllcywgUmVxdWVzdCAkcmVxdWVzdCk6IFBvb2wKewokdGhpcy0+cmVzdHJpY3RlZFBhY2thZ2VzTGlzdCA9ICRyZXF1ZXN0LT5nZXRSZXN0cmljdGVkUGFja2FnZXMoKSAhPT0gbnVsbCA/IGFycmF5X2ZsaXAoJHJlcXVlc3QtPmdldFJlc3RyaWN0ZWRQYWNrYWdlcygpKSA6IG51bGw7CgppZiAoXGNvdW50KCRyZXF1ZXN0LT5nZXRVcGRhdGVBbGxvd0xpc3QoKSkgPiAwKSB7CiR0aGlzLT51cGRhdGVBbGxvd0xpc3QgPSAkcmVxdWVzdC0+Z2V0VXBkYXRlQWxsb3dMaXN0KCk7CiR0aGlzLT53YXJuQWJvdXROb25NYXRjaGluZ1VwZGF0ZUFsbG93TGlzdCgkcmVxdWVzdCk7CgppZiAobnVsbCA9PT0gJHJlcXVlc3QtPmdldExvY2tlZFJlcG9zaXRvcnkoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdObyBsb2NrIHJlcG8gcHJlc2VudCBhbmQgeWV0IGEgcGFydGlhbCB1cGRhdGUgd2FzIHJlcXVlc3RlZC4nKTsKfQoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldExvY2tlZFJlcG9zaXRvcnkoKS0+Z2V0UGFja2FnZXMoKSBhcyAkbG9ja2VkUGFja2FnZSkgewppZiAoISR0aGlzLT5pc1VwZGF0ZUFsbG93ZWQoJGxvY2tlZFBhY2thZ2UpKSB7CgokdGhpcy0+c2tpcHBlZExvYWRbJGxvY2tlZFBhY2thZ2UtPmdldE5hbWUoKV1bXSA9ICRsb2NrZWRQYWNrYWdlOwpmb3JlYWNoICgkbG9ja2VkUGFja2FnZS0+Z2V0UmVwbGFjZXMoKSBhcyAkbGluaykgewokdGhpcy0+c2tpcHBlZExvYWRbJGxpbmstPmdldFRhcmdldCgpXVtdID0gJGxvY2tlZFBhY2thZ2U7Cn0KCgoKCgppZiAoJGxvY2tlZFBhY2thZ2UtPmdldERpc3RUeXBlKCkgPT09ICdwYXRoJykgewokdHJhbnNwb3J0T3B0aW9ucyA9ICRsb2NrZWRQYWNrYWdlLT5nZXRUcmFuc3BvcnRPcHRpb25zKCk7CmlmICghaXNzZXQoJHRyYW5zcG9ydE9wdGlvbnNbJ3N5bWxpbmsnXSkgfHwgJHRyYW5zcG9ydE9wdGlvbnNbJ3N5bWxpbmsnXSAhPT0gZmFsc2UpIHsKJHRoaXMtPnBhdGhSZXBvVW5sb2NrZWRbJGxvY2tlZFBhY2thZ2UtPmdldE5hbWUoKV0gPSB0cnVlOwpjb250aW51ZTsKfQp9CgokcmVxdWVzdC0+bG9ja1BhY2thZ2UoJGxvY2tlZFBhY2thZ2UpOwp9Cn0KfQoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldEZpeGVkT3JMb2NrZWRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CgoKJHRoaXMtPmxvYWRlZFBhY2thZ2VzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gbmV3IE1hdGNoQWxsQ29uc3RyYWludCgpOwoKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXBsYWNlcygpIGFzICRsaW5rKSB7CiR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbGluay0+Z2V0VGFyZ2V0KCldID0gbmV3IE1hdGNoQWxsQ29uc3RyYWludCgpOwp9CgoKCgppZiAoCiRwYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCkgaW5zdGFuY2VvZiBSb290UGFja2FnZVJlcG9zaXRvcnkKfHwgJHBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKSBpbnN0YW5jZW9mIFBsYXRmb3JtUmVwb3NpdG9yeQp8fCBTdGFiaWxpdHlGaWx0ZXI6OmlzUGFja2FnZUFjY2VwdGFibGUoJHRoaXMtPmFjY2VwdGFibGVTdGFiaWxpdGllcywgJHRoaXMtPnN0YWJpbGl0eUZsYWdzLCAkcGFja2FnZS0+Z2V0TmFtZXMoKSwgJHBhY2thZ2UtPmdldFN0YWJpbGl0eSgpKQopIHsKJHRoaXMtPmxvYWRQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkcGFja2FnZSwgZmFsc2UpOwp9IGVsc2UgewokdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzW10gPSAkcGFja2FnZTsKfQp9Cgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0UmVxdWlyZXMoKSBhcyAkcGFja2FnZU5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKCmlmIChpc3NldCgkdGhpcy0+bG9hZGVkUGFja2FnZXNbJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5wYWNrYWdlc1RvTG9hZFskcGFja2FnZU5hbWVdID0gJGNvbnN0cmFpbnQ7CiR0aGlzLT5tYXhFeHRlbmRlZFJlcXNbJHBhY2thZ2VOYW1lXSA9IHRydWU7Cn0KCgpmb3JlYWNoICgkdGhpcy0+cGFja2FnZXNUb0xvYWQgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKGlzc2V0KCR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0pKSB7CnVuc2V0KCR0aGlzLT5wYWNrYWdlc1RvTG9hZFskbmFtZV0pOwp9Cn0KCndoaWxlIChcY291bnQoJHRoaXMtPnBhY2thZ2VzVG9Mb2FkKSA+IDApIHsKJHRoaXMtPmxvYWRQYWNrYWdlc01hcmtlZEZvckxvYWRpbmcoJHJlcXVlc3QsICRyZXBvc2l0b3JpZXMpOwp9CgppZiAoXGNvdW50KCR0aGlzLT50ZW1wb3JhcnlDb25zdHJhaW50cykgPiAwKSB7CmZvcmVhY2ggKCR0aGlzLT5wYWNrYWdlcyBhcyAkaSA9PiAkcGFja2FnZSkgewoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmNvbnRpbnVlOwp9Cgpmb3JlYWNoICgkcGFja2FnZS0+Z2V0TmFtZXMoKSBhcyAkcGFja2FnZU5hbWUpIHsKaWYgKCFpc3NldCgkdGhpcy0+dGVtcG9yYXJ5Q29uc3RyYWludHNbJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCiRjb25zdHJhaW50ID0gJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzWyRwYWNrYWdlTmFtZV07CiRwYWNrYWdlQW5kQWxpYXNlcyA9IFskaSA9PiAkcGFja2FnZV07CmlmIChpc3NldCgkdGhpcy0+YWxpYXNNYXBbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0pKSB7CiRwYWNrYWdlQW5kQWxpYXNlcyArPSAkdGhpcy0+YWxpYXNNYXBbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV07Cn0KCiRmb3VuZCA9IGZhbHNlOwpmb3JlYWNoICgkcGFja2FnZUFuZEFsaWFzZXMgYXMgJHBhY2thZ2VPckFsaWFzKSB7CmlmIChDb21waWxpbmdNYXRjaGVyOjptYXRjaCgkY29uc3RyYWludCwgQ29uc3RyYWludDo6T1BfRVEsICRwYWNrYWdlT3JBbGlhcy0+Z2V0VmVyc2lvbigpKSkgewokZm91bmQgPSB0cnVlOwp9Cn0KCmlmICghJGZvdW5kKSB7CmZvcmVhY2ggKCRwYWNrYWdlQW5kQWxpYXNlcyBhcyAkaW5kZXggPT4gJHBhY2thZ2VPckFsaWFzKSB7CnVuc2V0KCR0aGlzLT5wYWNrYWdlc1skaW5kZXhdKTsKfQp9Cn0KfQp9CgppZiAoJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciAhPT0gbnVsbCkgewokcHJlUG9vbENyZWF0ZUV2ZW50ID0gbmV3IFByZVBvb2xDcmVhdGVFdmVudCgKUGx1Z2luRXZlbnRzOjpQUkVfUE9PTF9DUkVBVEUsCiRyZXBvc2l0b3JpZXMsCiRyZXF1ZXN0LAokdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzLAokdGhpcy0+c3RhYmlsaXR5RmxhZ3MsCiR0aGlzLT5yb290QWxpYXNlcywKJHRoaXMtPnJvb3RSZWZlcmVuY2VzLAokdGhpcy0+cGFja2FnZXMsCiR0aGlzLT51bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMKKTsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHByZVBvb2xDcmVhdGVFdmVudC0+Z2V0TmFtZSgpLCAkcHJlUG9vbENyZWF0ZUV2ZW50KTsKJHRoaXMtPnBhY2thZ2VzID0gJHByZVBvb2xDcmVhdGVFdmVudC0+Z2V0UGFja2FnZXMoKTsKJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcyA9ICRwcmVQb29sQ3JlYXRlRXZlbnQtPmdldFVuYWNjZXB0YWJsZUZpeGVkUGFja2FnZXMoKTsKfQoKJHBvb2wgPSBuZXcgUG9vbCgkdGhpcy0+cGFja2FnZXMsICR0aGlzLT51bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMpOwoKJHRoaXMtPmFsaWFzTWFwID0gW107CiR0aGlzLT5wYWNrYWdlc1RvTG9hZCA9IFtdOwokdGhpcy0+bG9hZGVkUGFja2FnZXMgPSBbXTsKJHRoaXMtPmxvYWRlZFBlclJlcG8gPSBbXTsKJHRoaXMtPnBhY2thZ2VzID0gW107CiR0aGlzLT51bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMgPSBbXTsKJHRoaXMtPm1heEV4dGVuZGVkUmVxcyA9IFtdOwokdGhpcy0+c2tpcHBlZExvYWQgPSBbXTsKJHRoaXMtPmluZGV4Q291bnRlciA9IDA7CgokdGhpcy0+aW8tPmRlYnVnKCdCdWlsdCBwb29sLicpOwoKJHBvb2wgPSAkdGhpcy0+cnVuT3B0aW1pemVyKCRyZXF1ZXN0LCAkcG9vbCk7CgpJbnRlcnZhbHM6OmNsZWFyKCk7CgpyZXR1cm4gJHBvb2w7Cn0KCnByaXZhdGUgZnVuY3Rpb24gbWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZyhSZXF1ZXN0ICRyZXF1ZXN0LCBzdHJpbmcgJG5hbWUsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpOiB2b2lkCnsKCmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRuYW1lKSkgewpyZXR1cm47Cn0KCgoKaWYgKGlzc2V0KCR0aGlzLT5tYXhFeHRlbmRlZFJlcXNbJG5hbWVdKSkgewpyZXR1cm47Cn0KCgoKCgokcm9vdFJlcXVpcmVzID0gJHJlcXVlc3QtPmdldFJlcXVpcmVzKCk7CmlmIChpc3NldCgkcm9vdFJlcXVpcmVzWyRuYW1lXSkgJiYgIUludGVydmFsczo6aXNTdWJzZXRPZigkY29uc3RyYWludCwgJHJvb3RSZXF1aXJlc1skbmFtZV0pKSB7CiRjb25zdHJhaW50ID0gJHJvb3RSZXF1aXJlc1skbmFtZV07Cn0KCgppZiAoIWlzc2V0KCR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0pKSB7CgoKCmlmIChpc3NldCgkdGhpcy0+cGFja2FnZXNUb0xvYWRbJG5hbWVdKSkgewoKaWYgKEludGVydmFsczo6aXNTdWJzZXRPZigkY29uc3RyYWludCwgJHRoaXMtPnBhY2thZ2VzVG9Mb2FkWyRuYW1lXSkpIHsKcmV0dXJuOwp9CgoKJGNvbnN0cmFpbnQgPSBJbnRlcnZhbHM6OmNvbXBhY3RDb25zdHJhaW50KE11bHRpQ29uc3RyYWludDo6Y3JlYXRlKFskdGhpcy0+cGFja2FnZXNUb0xvYWRbJG5hbWVdLCAkY29uc3RyYWludF0sIGZhbHNlKSk7Cn0KCiR0aGlzLT5wYWNrYWdlc1RvTG9hZFskbmFtZV0gPSAkY29uc3RyYWludDsKCnJldHVybjsKfQoKCgppZiAoSW50ZXJ2YWxzOjppc1N1YnNldE9mKCRjb25zdHJhaW50LCAkdGhpcy0+bG9hZGVkUGFja2FnZXNbJG5hbWVdKSkgewpyZXR1cm47Cn0KCgoKCiR0aGlzLT5wYWNrYWdlc1RvTG9hZFskbmFtZV0gPSBJbnRlcnZhbHM6OmNvbXBhY3RDb25zdHJhaW50KE11bHRpQ29uc3RyYWludDo6Y3JlYXRlKFskdGhpcy0+bG9hZGVkUGFja2FnZXNbJG5hbWVdLCAkY29uc3RyYWludF0sIGZhbHNlKSk7CnVuc2V0KCR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0pOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRQYWNrYWdlc01hcmtlZEZvckxvYWRpbmcoUmVxdWVzdCAkcmVxdWVzdCwgYXJyYXkgJHJlcG9zaXRvcmllcyk6IHZvaWQKewpmb3JlYWNoICgkdGhpcy0+cGFja2FnZXNUb0xvYWQgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCR0aGlzLT5yZXN0cmljdGVkUGFja2FnZXNMaXN0ICE9PSBudWxsICYmICFpc3NldCgkdGhpcy0+cmVzdHJpY3RlZFBhY2thZ2VzTGlzdFskbmFtZV0pKSB7CnVuc2V0KCR0aGlzLT5wYWNrYWdlc1RvTG9hZFskbmFtZV0pOwpjb250aW51ZTsKfQokdGhpcy0+bG9hZGVkUGFja2FnZXNbJG5hbWVdID0gJGNvbnN0cmFpbnQ7Cn0KCiRwYWNrYWdlQmF0Y2ggPSAkdGhpcy0+cGFja2FnZXNUb0xvYWQ7CiR0aGlzLT5wYWNrYWdlc1RvTG9hZCA9IFtdOwoKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkcmVwb0luZGV4ID0+ICRyZXBvc2l0b3J5KSB7CmlmICgwID09PSBcY291bnQoJHBhY2thZ2VCYXRjaCkpIHsKYnJlYWs7Cn0KCgoKaWYgKCRyZXBvc2l0b3J5IGluc3RhbmNlb2YgUGxhdGZvcm1SZXBvc2l0b3J5IHx8ICRyZXBvc2l0b3J5ID09PSAkcmVxdWVzdC0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpKSB7CmNvbnRpbnVlOwp9CiRyZXN1bHQgPSAkcmVwb3NpdG9yeS0+bG9hZFBhY2thZ2VzKCRwYWNrYWdlQmF0Y2gsICR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXMsICR0aGlzLT5zdGFiaWxpdHlGbGFncywgJHRoaXMtPmxvYWRlZFBlclJlcG9bJHJlcG9JbmRleF0gPz8gW10pOwoKZm9yZWFjaCAoJHJlc3VsdFsnbmFtZXNGb3VuZCddIGFzICRuYW1lKSB7Cgp1bnNldCgkcGFja2FnZUJhdGNoWyRuYW1lXSk7Cn0KZm9yZWFjaCAoJHJlc3VsdFsncGFja2FnZXMnXSBhcyAkcGFja2FnZSkgewokdGhpcy0+bG9hZGVkUGVyUmVwb1skcmVwb0luZGV4XVskcGFja2FnZS0+Z2V0TmFtZSgpXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXSA9ICRwYWNrYWdlOwoKaWYgKGluX2FycmF5KCRwYWNrYWdlLT5nZXRUeXBlKCksICR0aGlzLT5pZ25vcmVkVHlwZXMsIHRydWUpIHx8ICgkdGhpcy0+YWxsb3dlZFR5cGVzICE9PSBudWxsICYmICFpbl9hcnJheSgkcGFja2FnZS0+Z2V0VHlwZSgpLCAkdGhpcy0+YWxsb3dlZFR5cGVzLCB0cnVlKSkpIHsKY29udGludWU7Cn0KJHRoaXMtPmxvYWRQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkcGFja2FnZSwgIWlzc2V0KCR0aGlzLT5wYXRoUmVwb1VubG9ja2VkWyRwYWNrYWdlLT5nZXROYW1lKCldKSk7Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRQYWNrYWdlKFJlcXVlc3QgJHJlcXVlc3QsIGFycmF5ICRyZXBvc2l0b3JpZXMsIEJhc2VQYWNrYWdlICRwYWNrYWdlLCBib29sICRwcm9wYWdhdGVVcGRhdGUpOiB2b2lkCnsKJGluZGV4ID0gJHRoaXMtPmluZGV4Q291bnRlcisrOwokdGhpcy0+cGFja2FnZXNbJGluZGV4XSA9ICRwYWNrYWdlOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiR0aGlzLT5hbGlhc01hcFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UtPmdldEFsaWFzT2YoKSldWyRpbmRleF0gPSAkcGFja2FnZTsKfQoKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwoKCgoKaWYgKGlzc2V0KCR0aGlzLT5yb290UmVmZXJlbmNlc1skbmFtZV0pKSB7CgppZiAoISRyZXF1ZXN0LT5pc0xvY2tlZFBhY2thZ2UoJHBhY2thZ2UpICYmICEkcmVxdWVzdC0+aXNGaXhlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CiRwYWNrYWdlLT5zZXRTb3VyY2VEaXN0UmVmZXJlbmNlcygkdGhpcy0+cm9vdFJlZmVyZW5jZXNbJG5hbWVdKTsKfQp9CgoKCgoKCmlmICgoJHByb3BhZ2F0ZVVwZGF0ZSB8fCBpc3NldCgkdGhpcy0+cGF0aFJlcG9VbmxvY2tlZFskcGFja2FnZS0+Z2V0TmFtZSgpXSkpICYmIGlzc2V0KCR0aGlzLT5yb290QWxpYXNlc1skbmFtZV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV0pKSB7CiRhbGlhcyA9ICR0aGlzLT5yb290QWxpYXNlc1skbmFtZV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV07CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokYmFzZVBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9IGVsc2UgewokYmFzZVBhY2thZ2UgPSAkcGFja2FnZTsKfQppZiAoJGJhc2VQYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlKSB7CiRhbGlhc1BhY2thZ2UgPSBuZXcgQ29tcGxldGVBbGlhc1BhY2thZ2UoJGJhc2VQYWNrYWdlLCAkYWxpYXNbJ2FsaWFzX25vcm1hbGl6ZWQnXSwgJGFsaWFzWydhbGlhcyddKTsKfSBlbHNlIHsKJGFsaWFzUGFja2FnZSA9IG5ldyBBbGlhc1BhY2thZ2UoJGJhc2VQYWNrYWdlLCAkYWxpYXNbJ2FsaWFzX25vcm1hbGl6ZWQnXSwgJGFsaWFzWydhbGlhcyddKTsKfQokYWxpYXNQYWNrYWdlLT5zZXRSb290UGFja2FnZUFsaWFzKHRydWUpOwoKJG5ld0luZGV4ID0gJHRoaXMtPmluZGV4Q291bnRlcisrOwokdGhpcy0+cGFja2FnZXNbJG5ld0luZGV4XSA9ICRhbGlhc1BhY2thZ2U7CiR0aGlzLT5hbGlhc01hcFtzcGxfb2JqZWN0X2hhc2goJGFsaWFzUGFja2FnZS0+Z2V0QWxpYXNPZigpKV1bJG5ld0luZGV4XSA9ICRhbGlhc1BhY2thZ2U7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiRyZXF1aXJlID0gJGxpbmstPmdldFRhcmdldCgpOwokbGlua0NvbnN0cmFpbnQgPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwoKCmlmIChpc3NldCgkdGhpcy0+c2tpcHBlZExvYWRbJHJlcXVpcmVdKSkgewoKCgppZiAoJHByb3BhZ2F0ZVVwZGF0ZSAmJiAkcmVxdWVzdC0+Z2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKCkpIHsKJHNraXBwZWRSb290UmVxdWlyZXMgPSAkdGhpcy0+Z2V0U2tpcHBlZFJvb3RSZXF1aXJlcygkcmVxdWVzdCwgJHJlcXVpcmUpOwoKaWYgKCRyZXF1ZXN0LT5nZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVSb290RGVwZW5kZW5jaWVzKCkgfHwgMCA9PT0gXGNvdW50KCRza2lwcGVkUm9vdFJlcXVpcmVzKSkgewokdGhpcy0+dW5sb2NrUGFja2FnZSgkcmVxdWVzdCwgJHJlcG9zaXRvcmllcywgJHJlcXVpcmUpOwokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZygkcmVxdWVzdCwgJHJlcXVpcmUsICRsaW5rQ29uc3RyYWludCk7Cn0gZWxzZSB7CmZvcmVhY2ggKCRza2lwcGVkUm9vdFJlcXVpcmVzIGFzICRyb290UmVxdWlyZSkgewppZiAoIWlzc2V0KCR0aGlzLT51cGRhdGVBbGxvd1dhcm5lZFskcm9vdFJlcXVpcmVdKSkgewokdGhpcy0+dXBkYXRlQWxsb3dXYXJuZWRbJHJvb3RSZXF1aXJlXSA9IHRydWU7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+RGVwZW5kZW5jeSAnLiRyb290UmVxdWlyZS4nIGlzIGFsc28gYSByb290IHJlcXVpcmVtZW50LiBQYWNrYWdlIGhhcyBub3QgYmVlbiBsaXN0ZWQgYXMgYW4gdXBkYXRlIGFyZ3VtZW50LCBzbyBrZWVwaW5nIGxvY2tlZCBhdCBvbGQgdmVyc2lvbi4gVXNlIC0td2l0aC1hbGwtZGVwZW5kZW5jaWVzICgtVykgdG8gaW5jbHVkZSByb290IGRlcGVuZGVuY2llcy48L3dhcm5pbmc+Jyk7Cn0KfQp9Cn0gZWxzZWlmIChpc3NldCgkdGhpcy0+cGF0aFJlcG9VbmxvY2tlZFskcmVxdWlyZV0pICYmICFpc3NldCgkdGhpcy0+bG9hZGVkUGFja2FnZXNbJHJlcXVpcmVdKSkgewoKCiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkcmVxdWlyZSwgJGxpbmtDb25zdHJhaW50KTsKfQp9IGVsc2UgewokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZygkcmVxdWVzdCwgJHJlcXVpcmUsICRsaW5rQ29uc3RyYWludCk7Cn0KfQoKCgppZiAoJHByb3BhZ2F0ZVVwZGF0ZSAmJiAkcmVxdWVzdC0+Z2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKCkpIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKJHJlcGxhY2UgPSAkbGluay0+Z2V0VGFyZ2V0KCk7CmlmIChpc3NldCgkdGhpcy0+bG9hZGVkUGFja2FnZXNbJHJlcGxhY2VdLCAkdGhpcy0+c2tpcHBlZExvYWRbJHJlcGxhY2VdKSkgewokc2tpcHBlZFJvb3RSZXF1aXJlcyA9ICR0aGlzLT5nZXRTa2lwcGVkUm9vdFJlcXVpcmVzKCRyZXF1ZXN0LCAkcmVwbGFjZSk7CgppZiAoJHJlcXVlc3QtPmdldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZVJvb3REZXBlbmRlbmNpZXMoKSB8fCAwID09PSBcY291bnQoJHNraXBwZWRSb290UmVxdWlyZXMpKSB7CiR0aGlzLT51bmxvY2tQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkcmVwbGFjZSk7CgokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZ0lmUmVxdWlyZWQoJHJlcXVlc3QsICRyZXBsYWNlKTsKfSBlbHNlIHsKZm9yZWFjaCAoJHNraXBwZWRSb290UmVxdWlyZXMgYXMgJHJvb3RSZXF1aXJlKSB7CmlmICghaXNzZXQoJHRoaXMtPnVwZGF0ZUFsbG93V2FybmVkWyRyb290UmVxdWlyZV0pKSB7CiR0aGlzLT51cGRhdGVBbGxvd1dhcm5lZFskcm9vdFJlcXVpcmVdID0gdHJ1ZTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5EZXBlbmRlbmN5ICcuJHJvb3RSZXF1aXJlLicgaXMgYWxzbyBhIHJvb3QgcmVxdWlyZW1lbnQuIFBhY2thZ2UgaGFzIG5vdCBiZWVuIGxpc3RlZCBhcyBhbiB1cGRhdGUgYXJndW1lbnQsIHNvIGtlZXBpbmcgbG9ja2VkIGF0IG9sZCB2ZXJzaW9uLiBVc2UgLS13aXRoLWFsbC1kZXBlbmRlbmNpZXMgKC1XKSB0byBpbmNsdWRlIHJvb3QgZGVwZW5kZW5jaWVzLjwvd2FybmluZz4nKTsKfQp9Cn0KfQp9Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzUm9vdFJlcXVpcmUoUmVxdWVzdCAkcmVxdWVzdCwgc3RyaW5nICRuYW1lKTogYm9vbAp7CiRyb290UmVxdWlyZXMgPSAkcmVxdWVzdC0+Z2V0UmVxdWlyZXMoKTsKCnJldHVybiBpc3NldCgkcm9vdFJlcXVpcmVzWyRuYW1lXSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0U2tpcHBlZFJvb3RSZXF1aXJlcyhSZXF1ZXN0ICRyZXF1ZXN0LCBzdHJpbmcgJG5hbWUpOiBhcnJheQp7CmlmICghaXNzZXQoJHRoaXMtPnNraXBwZWRMb2FkWyRuYW1lXSkpIHsKcmV0dXJuIFtdOwp9Cgokcm9vdFJlcXVpcmVzID0gJHJlcXVlc3QtPmdldFJlcXVpcmVzKCk7CiRtYXRjaGVzID0gW107CgppZiAoaXNzZXQoJHJvb3RSZXF1aXJlc1skbmFtZV0pKSB7CnJldHVybiBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKSB1c2UgKCRuYW1lKTogc3RyaW5nIHsKaWYgKCRuYW1lICE9PSAkcGFja2FnZS0+Z2V0TmFtZSgpKSB7CnJldHVybiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4nICh2aWEgcmVwbGFjZSBvZiAnLiRuYW1lLicpJzsKfQoKcmV0dXJuICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0sICR0aGlzLT5za2lwcGVkTG9hZFskbmFtZV0pOwp9Cgpmb3JlYWNoICgkdGhpcy0+c2tpcHBlZExvYWRbJG5hbWVdIGFzICRwYWNrYWdlT3JSZXBsYWNlcikgewppZiAoaXNzZXQoJHJvb3RSZXF1aXJlc1skcGFja2FnZU9yUmVwbGFjZXItPmdldE5hbWUoKV0pKSB7CiRtYXRjaGVzW10gPSAkcGFja2FnZU9yUmVwbGFjZXItPmdldE5hbWUoKTsKfQpmb3JlYWNoICgkcGFja2FnZU9yUmVwbGFjZXItPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKaWYgKGlzc2V0KCRyb290UmVxdWlyZXNbJGxpbmstPmdldFRhcmdldCgpXSkpIHsKaWYgKCRuYW1lICE9PSAkcGFja2FnZU9yUmVwbGFjZXItPmdldE5hbWUoKSkgewokbWF0Y2hlc1tdID0gJHBhY2thZ2VPclJlcGxhY2VyLT5nZXROYW1lKCkgLicgKHZpYSByZXBsYWNlIG9mICcuJG5hbWUuJyknOwp9IGVsc2UgewokbWF0Y2hlc1tdID0gJHBhY2thZ2VPclJlcGxhY2VyLT5nZXROYW1lKCk7Cn0KYnJlYWs7Cn0KfQp9CgpyZXR1cm4gJG1hdGNoZXM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gaXNVcGRhdGVBbGxvd2VkKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogYm9vbAp7CmZvcmVhY2ggKCR0aGlzLT51cGRhdGVBbGxvd0xpc3QgYXMgJHBhdHRlcm4pIHsKJHBhdHRlcm5SZWdleHAgPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGF0dGVybik7CmlmIChQcmVnOjppc01hdGNoKCRwYXR0ZXJuUmVnZXhwLCAkcGFja2FnZS0+Z2V0TmFtZSgpKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCnByaXZhdGUgZnVuY3Rpb24gd2FybkFib3V0Tm9uTWF0Y2hpbmdVcGRhdGVBbGxvd0xpc3QoUmVxdWVzdCAkcmVxdWVzdCk6IHZvaWQKewppZiAobnVsbCA9PT0gJHJlcXVlc3QtPmdldExvY2tlZFJlcG9zaXRvcnkoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdObyBsb2NrIHJlcG8gcHJlc2VudCBhbmQgeWV0IGEgcGFydGlhbCB1cGRhdGUgd2FzIHJlcXVlc3RlZC4nKTsKfQoKZm9yZWFjaCAoJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCBhcyAkcGF0dGVybikgewokbWF0Y2hlZFBsYXRmb3JtUGFja2FnZSA9IGZhbHNlOwoKJHBhdHRlcm5SZWdleHAgPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGF0dGVybik7Cgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmIChQcmVnOjppc01hdGNoKCRwYXR0ZXJuUmVnZXhwLCAkcGFja2FnZS0+Z2V0TmFtZSgpKSkgewpjb250aW51ZSAyOwp9Cn0KCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRSZXF1aXJlcygpIGFzICRwYWNrYWdlTmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoUHJlZzo6aXNNYXRjaCgkcGF0dGVyblJlZ2V4cCwgJHBhY2thZ2VOYW1lKSkgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZU5hbWUpKSB7CiRtYXRjaGVkUGxhdGZvcm1QYWNrYWdlID0gdHJ1ZTsKY29udGludWU7Cn0KY29udGludWUgMjsKfQp9CmlmICgkbWF0Y2hlZFBsYXRmb3JtUGFja2FnZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlBhdHRlcm4gIicgLiAkcGF0dGVybiAuICciIGxpc3RlZCBmb3IgdXBkYXRlIG1hdGNoZXMgcGxhdGZvcm0gcGFja2FnZXMsIGJ1dCB0aGVzZSBjYW5ub3QgYmUgdXBkYXRlZCBieSBDb21wb3Nlci48L3dhcm5pbmc+Jyk7Cn0gZWxzZWlmIChzdHJwb3MoJHBhdHRlcm4sICcqJykgIT09IGZhbHNlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+UGF0dGVybiAiJyAuICRwYXR0ZXJuIC4gJyIgbGlzdGVkIGZvciB1cGRhdGUgZG9lcyBub3QgbWF0Y2ggYW55IGxvY2tlZCBwYWNrYWdlcy48L3dhcm5pbmc+Jyk7Cn0gZWxzZSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+UGFja2FnZSAiJyAuICRwYXR0ZXJuIC4gJyIgbGlzdGVkIGZvciB1cGRhdGUgaXMgbm90IGxvY2tlZC48L3dhcm5pbmc+Jyk7Cn0KfQp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHVubG9ja1BhY2thZ2UoUmVxdWVzdCAkcmVxdWVzdCwgYXJyYXkgJHJlcG9zaXRvcmllcywgc3RyaW5nICRuYW1lKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5za2lwcGVkTG9hZFskbmFtZV0gYXMgJHBhY2thZ2VPclJlcGxhY2VyKSB7CgoKaWYgKCRwYWNrYWdlT3JSZXBsYWNlci0+Z2V0TmFtZSgpICE9PSAkbmFtZSAmJiBpc3NldCgkdGhpcy0+c2tpcHBlZExvYWRbJHBhY2thZ2VPclJlcGxhY2VyLT5nZXROYW1lKCldKSkgewokcmVwbGFjZXJOYW1lID0gJHBhY2thZ2VPclJlcGxhY2VyLT5nZXROYW1lKCk7CmlmICgkcmVxdWVzdC0+Z2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlUm9vdERlcGVuZGVuY2llcygpIHx8ICghJHRoaXMtPmlzUm9vdFJlcXVpcmUoJHJlcXVlc3QsICRuYW1lKSAmJiAhJHRoaXMtPmlzUm9vdFJlcXVpcmUoJHJlcXVlc3QsICRyZXBsYWNlck5hbWUpKSkgewokdGhpcy0+dW5sb2NrUGFja2FnZSgkcmVxdWVzdCwgJHJlcG9zaXRvcmllcywgJHJlcGxhY2VyTmFtZSk7CgppZiAoJHRoaXMtPmlzUm9vdFJlcXVpcmUoJHJlcXVlc3QsICRyZXBsYWNlck5hbWUpKSB7CiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkcmVwbGFjZXJOYW1lLCBuZXcgTWF0Y2hBbGxDb25zdHJhaW50KTsKfSBlbHNlIHsKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VzIGFzICRsb2FkZWRQYWNrYWdlKSB7CiRyZXF1aXJlcyA9ICRsb2FkZWRQYWNrYWdlLT5nZXRSZXF1aXJlcygpOwppZiAoaXNzZXQoJHJlcXVpcmVzWyRyZXBsYWNlck5hbWVdKSkgewokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZygkcmVxdWVzdCwgJHJlcGxhY2VyTmFtZSwgJHJlcXVpcmVzWyRyZXBsYWNlck5hbWVdLT5nZXRDb25zdHJhaW50KCkpOwp9Cn0KfQp9Cn0KfQoKaWYgKGlzc2V0KCR0aGlzLT5wYXRoUmVwb1VubG9ja2VkWyRuYW1lXSkpIHsKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VzIGFzICRpbmRleCA9PiAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UtPmdldE5hbWUoKSA9PT0gJG5hbWUpIHsKJHRoaXMtPnJlbW92ZUxvYWRlZFBhY2thZ2UoJHJlcXVlc3QsICRyZXBvc2l0b3JpZXMsICRwYWNrYWdlLCAkaW5kZXgpOwp9Cn0KfQoKdW5zZXQoJHRoaXMtPnNraXBwZWRMb2FkWyRuYW1lXSwgJHRoaXMtPmxvYWRlZFBhY2thZ2VzWyRuYW1lXSwgJHRoaXMtPm1heEV4dGVuZGVkUmVxc1skbmFtZV0sICR0aGlzLT5wYXRoUmVwb1VubG9ja2VkWyRuYW1lXSk7CgoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldExvY2tlZFBhY2thZ2VzKCkgYXMgJGxvY2tlZFBhY2thZ2UpIHsKaWYgKCEoJGxvY2tlZFBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpICYmICRsb2NrZWRQYWNrYWdlLT5nZXROYW1lKCkgPT09ICRuYW1lKSB7CmlmIChmYWxzZSAhPT0gJGluZGV4ID0gYXJyYXlfc2VhcmNoKCRsb2NrZWRQYWNrYWdlLCAkdGhpcy0+cGFja2FnZXMsIHRydWUpKSB7CiRyZXF1ZXN0LT51bmxvY2tQYWNrYWdlKCRsb2NrZWRQYWNrYWdlKTsKJHRoaXMtPnJlbW92ZUxvYWRlZFBhY2thZ2UoJHJlcXVlc3QsICRyZXBvc2l0b3JpZXMsICRsb2NrZWRQYWNrYWdlLCAkaW5kZXgpOwoKCgoKCgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0Rml4ZWRPckxvY2tlZFBhY2thZ2VzKCkgYXMgJGZpeGVkT3JMb2NrZWRQYWNrYWdlKSB7CmlmICgkZml4ZWRPckxvY2tlZFBhY2thZ2UgPT09ICRsb2NrZWRQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CgppZiAoaXNzZXQoJHRoaXMtPnNraXBwZWRMb2FkWyRmaXhlZE9yTG9ja2VkUGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKJHJlcXVpcmVzID0gJGZpeGVkT3JMb2NrZWRQYWNrYWdlLT5nZXRSZXF1aXJlcygpOwppZiAoaXNzZXQoJHJlcXVpcmVzWyRsb2NrZWRQYWNrYWdlLT5nZXROYW1lKCldKSkgewokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZygkcmVxdWVzdCwgJGxvY2tlZFBhY2thZ2UtPmdldE5hbWUoKSwgJHJlcXVpcmVzWyRsb2NrZWRQYWNrYWdlLT5nZXROYW1lKCldLT5nZXRDb25zdHJhaW50KCkpOwp9Cgpmb3JlYWNoICgkbG9ja2VkUGFja2FnZS0+Z2V0UmVwbGFjZXMoKSBhcyAkcmVwbGFjZSkgewppZiAoaXNzZXQoJHJlcXVpcmVzWyRyZXBsYWNlLT5nZXRUYXJnZXQoKV0sICR0aGlzLT5za2lwcGVkTG9hZFskcmVwbGFjZS0+Z2V0VGFyZ2V0KCldKSkgewokdGhpcy0+dW5sb2NrUGFja2FnZSgkcmVxdWVzdCwgJHJlcG9zaXRvcmllcywgJHJlcGxhY2UtPmdldFRhcmdldCgpKTsKCiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkcmVwbGFjZS0+Z2V0VGFyZ2V0KCksICRyZXBsYWNlLT5nZXRDb25zdHJhaW50KCkpOwp9Cn0KfQp9Cn0KfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gbWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZ0lmUmVxdWlyZWQoUmVxdWVzdCAkcmVxdWVzdCwgc3RyaW5nICRuYW1lKTogdm9pZAp7CmlmICgkdGhpcy0+aXNSb290UmVxdWlyZSgkcmVxdWVzdCwgJG5hbWUpKSB7CiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkbmFtZSwgJHJlcXVlc3QtPmdldFJlcXVpcmVzKClbJG5hbWVdKTsKfQoKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CmlmICgkbmFtZSA9PT0gJGxpbmstPmdldFRhcmdldCgpKSB7CiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkbGluay0+Z2V0VGFyZ2V0KCksICRsaW5rLT5nZXRDb25zdHJhaW50KCkpOwp9Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlbW92ZUxvYWRlZFBhY2thZ2UoUmVxdWVzdCAkcmVxdWVzdCwgYXJyYXkgJHJlcG9zaXRvcmllcywgQmFzZVBhY2thZ2UgJHBhY2thZ2UsIGludCAkaW5kZXgpOiB2b2lkCnsKJHJlcG9JbmRleCA9IGFycmF5X3NlYXJjaCgkcGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpLCAkcmVwb3NpdG9yaWVzLCB0cnVlKTsKCnVuc2V0KCR0aGlzLT5sb2FkZWRQZXJSZXBvWyRyZXBvSW5kZXhdWyRwYWNrYWdlLT5nZXROYW1lKCldWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldKTsKdW5zZXQoJHRoaXMtPnBhY2thZ2VzWyRpbmRleF0pOwppZiAoaXNzZXQoJHRoaXMtPmFsaWFzTWFwW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKSkgewpmb3JlYWNoICgkdGhpcy0+YWxpYXNNYXBbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gYXMgJGFsaWFzSW5kZXggPT4gJGFsaWFzUGFja2FnZSkgewp1bnNldCgkdGhpcy0+bG9hZGVkUGVyUmVwb1skcmVwb0luZGV4XVskYWxpYXNQYWNrYWdlLT5nZXROYW1lKCldWyRhbGlhc1BhY2thZ2UtPmdldFZlcnNpb24oKV0pOwp1bnNldCgkdGhpcy0+cGFja2FnZXNbJGFsaWFzSW5kZXhdKTsKfQp1bnNldCgkdGhpcy0+YWxpYXNNYXBbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0pOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gcnVuT3B0aW1pemVyKFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wpOiBQb29sCnsKaWYgKG51bGwgPT09ICR0aGlzLT5wb29sT3B0aW1pemVyKSB7CnJldHVybiAkcG9vbDsKfQoKJHRoaXMtPmlvLT5kZWJ1ZygnUnVubmluZyBwb29sIG9wdGltaXplci4nKTsKCiRiZWZvcmUgPSBtaWNyb3RpbWUodHJ1ZSk7CiR0b3RhbCA9IFxjb3VudCgkcG9vbC0+Z2V0UGFja2FnZXMoKSk7CgokcG9vbCA9ICR0aGlzLT5wb29sT3B0aW1pemVyLT5vcHRpbWl6ZSgkcmVxdWVzdCwgJHBvb2wpOwoKJGZpbHRlcmVkID0gJHRvdGFsIC0gXGNvdW50KCRwb29sLT5nZXRQYWNrYWdlcygpKTsKCmlmICgwID09PSAkZmlsdGVyZWQpIHsKcmV0dXJuICRwb29sOwp9CgokdGhpcy0+aW8tPndyaXRlKHNwcmludGYoJ1Bvb2wgb3B0aW1pemVyIGNvbXBsZXRlZCBpbiAlLjNmIHNlY29uZHMnLCBtaWNyb3RpbWUodHJ1ZSkgLSAkYmVmb3JlKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7CiR0aGlzLT5pby0+d3JpdGUoc3ByaW50ZigKJzxpbmZvPkZvdW5kICVzIHBhY2thZ2UgdmVyc2lvbnMgcmVmZXJlbmNlZCBpbiB5b3VyIGRlcGVuZGVuY3kgZ3JhcGguICVzICglZCUlKSB3ZXJlIG9wdGltaXplZCBhd2F5LjwvaW5mbz4nLApudW1iZXJfZm9ybWF0KCR0b3RhbCksCm51bWJlcl9mb3JtYXQoJGZpbHRlcmVkKSwKcm91bmQoMTAwIC8gJHRvdGFsICogJGZpbHRlcmVkKQopLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSWV9WRVJCT1NFKTsKCnJldHVybiAkcG9vbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29tcGlsaW5nTWF0Y2hlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTXVsdGlDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXEludGVydmFsczsKCgoKCgoKY2xhc3MgUG9vbE9wdGltaXplcgp7CgoKCnByaXZhdGUgJHBvbGljeTsKCgoKCnByaXZhdGUgJGlycmVtb3ZhYmxlUGFja2FnZXMgPSBbXTsKCgoKCnByaXZhdGUgJHJlcXVpcmVDb25zdHJhaW50c1BlclBhY2thZ2UgPSBbXTsKCgoKCnByaXZhdGUgJGNvbmZsaWN0Q29uc3RyYWludHNQZXJQYWNrYWdlID0gW107CgoKCgpwcml2YXRlICRwYWNrYWdlc1RvUmVtb3ZlID0gW107CgoKCgpwcml2YXRlICRhbGlhc2VzUGVyUGFja2FnZSA9IFtdOwoKCgoKcHJpdmF0ZSAkcmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUG9saWN5SW50ZXJmYWNlICRwb2xpY3kpCnsKJHRoaXMtPnBvbGljeSA9ICRwb2xpY3k7Cn0KCnB1YmxpYyBmdW5jdGlvbiBvcHRpbWl6ZShSZXF1ZXN0ICRyZXF1ZXN0LCBQb29sICRwb29sKTogUG9vbAp7CiR0aGlzLT5wcmVwYXJlKCRyZXF1ZXN0LCAkcG9vbCk7CgokdGhpcy0+b3B0aW1pemVCeUlkZW50aWNhbERlcGVuZGVuY2llcygkcmVxdWVzdCwgJHBvb2wpOwoKJHRoaXMtPm9wdGltaXplSW1wb3NzaWJsZVBhY2thZ2VzQXdheSgkcmVxdWVzdCwgJHBvb2wpOwoKJG9wdGltaXplZFBvb2wgPSAkdGhpcy0+YXBwbHlSZW1vdmFsc1RvUG9vbCgkcG9vbCk7CgoKCgoKCiR0aGlzLT5pcnJlbW92YWJsZVBhY2thZ2VzID0gW107CiR0aGlzLT5yZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlID0gW107CiR0aGlzLT5jb25mbGljdENvbnN0cmFpbnRzUGVyUGFja2FnZSA9IFtdOwokdGhpcy0+cGFja2FnZXNUb1JlbW92ZSA9IFtdOwokdGhpcy0+YWxpYXNlc1BlclBhY2thZ2UgPSBbXTsKJHRoaXMtPnJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZSA9IFtdOwoKcmV0dXJuICRvcHRpbWl6ZWRQb29sOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHByZXBhcmUoUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IHZvaWQKewokaXJyZW1vdmFibGVQYWNrYWdlQ29uc3RyYWludEdyb3VwcyA9IFtdOwoKCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRGaXhlZE9yTG9ja2VkUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokaXJyZW1vdmFibGVQYWNrYWdlQ29uc3RyYWludEdyb3Vwc1skcGFja2FnZS0+Z2V0TmFtZSgpXVtdID0gbmV3IENvbnN0cmFpbnQoJz09JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSk7Cn0KCgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0UmVxdWlyZXMoKSBhcyAkcmVxdWlyZSA9PiAkY29uc3RyYWludCkgewokdGhpcy0+ZXh0cmFjdFJlcXVpcmVDb25zdHJhaW50c1BlclBhY2thZ2UoJHJlcXVpcmUsICRjb25zdHJhaW50KTsKfQoKCmZvcmVhY2ggKCRwb29sLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7Cgpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgewokdGhpcy0+ZXh0cmFjdFJlcXVpcmVDb25zdHJhaW50c1BlclBhY2thZ2UoJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0Q29uc3RyYWludCgpKTsKfQoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldENvbmZsaWN0cygpIGFzICRsaW5rKSB7CiR0aGlzLT5leHRyYWN0Q29uZmxpY3RDb25zdHJhaW50c1BlclBhY2thZ2UoJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0Q29uc3RyYWludCgpKTsKfQoKCgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHRoaXMtPmFsaWFzZXNQZXJQYWNrYWdlWyRwYWNrYWdlLT5nZXRBbGlhc09mKCktPmlkXVtdID0gJHBhY2thZ2U7Cn0KfQoKJGlycmVtb3ZhYmxlUGFja2FnZUNvbnN0cmFpbnRzID0gW107CmZvcmVhY2ggKCRpcnJlbW92YWJsZVBhY2thZ2VDb25zdHJhaW50R3JvdXBzIGFzICRwYWNrYWdlTmFtZSA9PiAkY29uc3RyYWludHMpIHsKJGlycmVtb3ZhYmxlUGFja2FnZUNvbnN0cmFpbnRzWyRwYWNrYWdlTmFtZV0gPSAxID09PSBcY291bnQoJGNvbnN0cmFpbnRzKSA/ICRjb25zdHJhaW50c1swXSA6IG5ldyBNdWx0aUNvbnN0cmFpbnQoJGNvbnN0cmFpbnRzLCBmYWxzZSk7Cn0KdW5zZXQoJGlycmVtb3ZhYmxlUGFja2FnZUNvbnN0cmFpbnRHcm91cHMpOwoKCmZvcmVhY2ggKCRwb29sLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICghaXNzZXQoJGlycmVtb3ZhYmxlUGFja2FnZUNvbnN0cmFpbnRzWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewpjb250aW51ZTsKfQoKaWYgKENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRpcnJlbW92YWJsZVBhY2thZ2VDb25zdHJhaW50c1skcGFja2FnZS0+Z2V0TmFtZSgpXSwgQ29uc3RyYWludDo6T1BfRVEsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSB7CiR0aGlzLT5tYXJrUGFja2FnZUlycmVtb3ZhYmxlKCRwYWNrYWdlKTsKfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gbWFya1BhY2thZ2VJcnJlbW92YWJsZShCYXNlUGFja2FnZSAkcGFja2FnZSk6IHZvaWQKewokdGhpcy0+aXJyZW1vdmFibGVQYWNrYWdlc1skcGFja2FnZS0+aWRdID0gdHJ1ZTsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CgoKJHRoaXMtPm1hcmtQYWNrYWdlSXJyZW1vdmFibGUoJHBhY2thZ2UtPmdldEFsaWFzT2YoKSk7Cn0KaWYgKGlzc2V0KCR0aGlzLT5hbGlhc2VzUGVyUGFja2FnZVskcGFja2FnZS0+aWRdKSkgewpmb3JlYWNoICgkdGhpcy0+YWxpYXNlc1BlclBhY2thZ2VbJHBhY2thZ2UtPmlkXSBhcyAkYWxpYXNQYWNrYWdlKSB7CiR0aGlzLT5pcnJlbW92YWJsZVBhY2thZ2VzWyRhbGlhc1BhY2thZ2UtPmlkXSA9IHRydWU7Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGx5UmVtb3ZhbHNUb1Bvb2woUG9vbCAkcG9vbCk6IFBvb2wKewokcGFja2FnZXMgPSBbXTsKJHJlbW92ZWRWZXJzaW9ucyA9IFtdOwpmb3JlYWNoICgkcG9vbC0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoIWlzc2V0KCR0aGlzLT5wYWNrYWdlc1RvUmVtb3ZlWyRwYWNrYWdlLT5pZF0pKSB7CiRwYWNrYWdlc1tdID0gJHBhY2thZ2U7Cn0gZWxzZSB7CiRyZW1vdmVkVmVyc2lvbnNbJHBhY2thZ2UtPmdldE5hbWUoKV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV0gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9Cn0KCiRvcHRpbWl6ZWRQb29sID0gbmV3IFBvb2woJHBhY2thZ2VzLCAkcG9vbC0+Z2V0VW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzKCksICRyZW1vdmVkVmVyc2lvbnMsICR0aGlzLT5yZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2UpOwoKcmV0dXJuICRvcHRpbWl6ZWRQb29sOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIG9wdGltaXplQnlJZGVudGljYWxEZXBlbmRlbmNpZXMoUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IHZvaWQKewokaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlID0gW107CiRwYWNrYWdlSWRlbnRpY2FsRGVmaW5pdGlvbkxvb2t1cCA9IFtdOwoKZm9yZWFjaCAoJHBvb2wtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKCgoKaWYgKGlzc2V0KCR0aGlzLT5pcnJlbW92YWJsZVBhY2thZ2VzWyRwYWNrYWdlLT5pZF0pKSB7CmNvbnRpbnVlOwp9CgokdGhpcy0+bWFya1BhY2thZ2VGb3JSZW1vdmFsKCRwYWNrYWdlLT5pZCk7CgokZGVwZW5kZW5jeUhhc2ggPSAkdGhpcy0+Y2FsY3VsYXRlRGVwZW5kZW5jeUhhc2goJHBhY2thZ2UpOwoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkcGFja2FnZU5hbWUpIHsKaWYgKCFpc3NldCgkdGhpcy0+cmVxdWlyZUNvbnN0cmFpbnRzUGVyUGFja2FnZVskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJHRoaXMtPnJlcXVpcmVDb25zdHJhaW50c1BlclBhY2thZ2VbJHBhY2thZ2VOYW1lXSBhcyAkcmVxdWlyZUNvbnN0cmFpbnQpIHsKJGdyb3VwSGFzaFBhcnRzID0gW107CgppZiAoQ29tcGlsaW5nTWF0Y2hlcjo6bWF0Y2goJHJlcXVpcmVDb25zdHJhaW50LCBDb25zdHJhaW50OjpPUF9FUSwgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpIHsKJGdyb3VwSGFzaFBhcnRzW10gPSAncmVxdWlyZTonIC4gKHN0cmluZykgJHJlcXVpcmVDb25zdHJhaW50Owp9CgppZiAoXGNvdW50KCRwYWNrYWdlLT5nZXRSZXBsYWNlcygpKSA+IDApIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKaWYgKENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRsaW5rLT5nZXRDb25zdHJhaW50KCksIENvbnN0cmFpbnQ6Ok9QX0VRLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSkgewoKJGdyb3VwSGFzaFBhcnRzW10gPSAncmVxdWlyZTonIC4gKHN0cmluZykgJGxpbmstPmdldENvbnN0cmFpbnQoKTsKfQp9Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29uZmxpY3RDb25zdHJhaW50c1BlclBhY2thZ2VbJHBhY2thZ2VOYW1lXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmNvbmZsaWN0Q29uc3RyYWludHNQZXJQYWNrYWdlWyRwYWNrYWdlTmFtZV0gYXMgJGNvbmZsaWN0Q29uc3RyYWludCkgewppZiAoQ29tcGlsaW5nTWF0Y2hlcjo6bWF0Y2goJGNvbmZsaWN0Q29uc3RyYWludCwgQ29uc3RyYWludDo6T1BfRVEsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSB7CiRncm91cEhhc2hQYXJ0c1tdID0gJ2NvbmZsaWN0OicgLiAoc3RyaW5nKSAkY29uZmxpY3RDb25zdHJhaW50Owp9Cn0KfQoKaWYgKDAgPT09IFxjb3VudCgkZ3JvdXBIYXNoUGFydHMpKSB7CmNvbnRpbnVlOwp9CgokZ3JvdXBIYXNoID0gaW1wbG9kZSgnJywgJGdyb3VwSGFzaFBhcnRzKTsKJGlkZW50aWNhbERlZmluaXRpb25zUGVyUGFja2FnZVskcGFja2FnZU5hbWVdWyRncm91cEhhc2hdWyRkZXBlbmRlbmN5SGFzaF1bXSA9ICRwYWNrYWdlOwokcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXBbJHBhY2thZ2UtPmlkXVskcGFja2FnZU5hbWVdID0gWydncm91cEhhc2gnID0+ICRncm91cEhhc2gsICdkZXBlbmRlbmN5SGFzaCcgPT4gJGRlcGVuZGVuY3lIYXNoXTsKfQp9Cn0KCmZvcmVhY2ggKCRpZGVudGljYWxEZWZpbml0aW9uc1BlclBhY2thZ2UgYXMgJGNvbnN0cmFpbnRHcm91cHMpIHsKZm9yZWFjaCAoJGNvbnN0cmFpbnRHcm91cHMgYXMgJGNvbnN0cmFpbnRHcm91cCkgewpmb3JlYWNoICgkY29uc3RyYWludEdyb3VwIGFzICRwYWNrYWdlcykgewoKaWYgKDEgPT09IFxjb3VudCgkcGFja2FnZXMpKSB7CiR0aGlzLT5rZWVwUGFja2FnZSgkcGFja2FnZXNbMF0sICRpZGVudGljYWxEZWZpbml0aW9uc1BlclBhY2thZ2UsICRwYWNrYWdlSWRlbnRpY2FsRGVmaW5pdGlvbkxvb2t1cCk7CmNvbnRpbnVlOwp9CgoKCiRsaXRlcmFscyA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRsaXRlcmFsc1tdID0gJHBhY2thZ2UtPmlkOwp9Cgpmb3JlYWNoICgkdGhpcy0+cG9saWN5LT5zZWxlY3RQcmVmZXJyZWRQYWNrYWdlcygkcG9vbCwgJGxpdGVyYWxzKSBhcyAkcHJlZmVycmVkTGl0ZXJhbCkgewokdGhpcy0+a2VlcFBhY2thZ2UoJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJHByZWZlcnJlZExpdGVyYWwpLCAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlLCAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXApOwp9Cn0KfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gY2FsY3VsYXRlRGVwZW5kZW5jeUhhc2goQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiBzdHJpbmcKewokaGFzaCA9ICcnOwoKJGhhc2hSZWxldmFudExpbmtzID0gWwoncmVxdWlyZXMnID0+ICRwYWNrYWdlLT5nZXRSZXF1aXJlcygpLAonY29uZmxpY3RzJyA9PiAkcGFja2FnZS0+Z2V0Q29uZmxpY3RzKCksCidyZXBsYWNlcycgPT4gJHBhY2thZ2UtPmdldFJlcGxhY2VzKCksCidwcm92aWRlcycgPT4gJHBhY2thZ2UtPmdldFByb3ZpZGVzKCksCl07Cgpmb3JlYWNoICgkaGFzaFJlbGV2YW50TGlua3MgYXMgJGtleSA9PiAkbGlua3MpIHsKaWYgKDAgPT09IFxjb3VudCgkbGlua3MpKSB7CmNvbnRpbnVlOwp9CgoKJGhhc2ggLj0gJGtleSAuICc6JzsKCiRzdWJoYXNoID0gW107Cgpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKCgoKCiRzdWJoYXNoWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSAoc3RyaW5nKSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwp9CgoKa3NvcnQoJHN1Ymhhc2gpOwoKZm9yZWFjaCAoJHN1Ymhhc2ggYXMgJHRhcmdldCA9PiAkY29uc3RyYWludCkgewokaGFzaCAuPSAkdGFyZ2V0IC4gJ0AnIC4gJGNvbnN0cmFpbnQ7Cn0KfQoKcmV0dXJuICRoYXNoOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIG1hcmtQYWNrYWdlRm9yUmVtb3ZhbChpbnQgJGlkKTogdm9pZAp7CgppZiAoaXNzZXQoJHRoaXMtPmlycmVtb3ZhYmxlUGFja2FnZXNbJGlkXSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQXR0ZW1wdGVkIHJlbW92aW5nIGEgcGFja2FnZSB3aGljaCB3YXMgcHJldmlvdXNseSBtYXJrZWQgaXJyZW1vdmFibGUnKTsKfQoKJHRoaXMtPnBhY2thZ2VzVG9SZW1vdmVbJGlkXSA9IHRydWU7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGtlZXBQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlLCBhcnJheSAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlLCBhcnJheSAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXApOiB2b2lkCnsKCmlmICghaXNzZXQoJHRoaXMtPnBhY2thZ2VzVG9SZW1vdmVbJHBhY2thZ2UtPmlkXSkpIHsKcmV0dXJuOwp9Cgp1bnNldCgkdGhpcy0+cGFja2FnZXNUb1JlbW92ZVskcGFja2FnZS0+aWRdKTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewoKCiR0aGlzLT5rZWVwUGFja2FnZSgkcGFja2FnZS0+Z2V0QWxpYXNPZigpLCAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlLCAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXApOwp9CgoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkbmFtZSkgewppZiAoaXNzZXQoJHBhY2thZ2VJZGVudGljYWxEZWZpbml0aW9uTG9va3VwWyRwYWNrYWdlLT5pZF1bJG5hbWVdKSkgewokcGFja2FnZUdyb3VwUG9pbnRlcnMgPSAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXBbJHBhY2thZ2UtPmlkXVskbmFtZV07CiRwYWNrYWdlR3JvdXAgPSAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlWyRuYW1lXVskcGFja2FnZUdyb3VwUG9pbnRlcnNbJ2dyb3VwSGFzaCddXVskcGFja2FnZUdyb3VwUG9pbnRlcnNbJ2RlcGVuZGVuY3lIYXNoJ11dOwpmb3JlYWNoICgkcGFja2FnZUdyb3VwIGFzICRwa2cpIHsKaWYgKCRwa2cgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgJHBrZy0+Z2V0UHJldHR5VmVyc2lvbigpID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokcGtnID0gJHBrZy0+Z2V0QWxpYXNPZigpOwp9CiR0aGlzLT5yZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2Vbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV1bJHBrZy0+Z2V0VmVyc2lvbigpXSA9ICRwa2ctPmdldFByZXR0eVZlcnNpb24oKTsKfQp9Cn0KCmlmIChpc3NldCgkdGhpcy0+YWxpYXNlc1BlclBhY2thZ2VbJHBhY2thZ2UtPmlkXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmFsaWFzZXNQZXJQYWNrYWdlWyRwYWNrYWdlLT5pZF0gYXMgJGFsaWFzUGFja2FnZSkgewp1bnNldCgkdGhpcy0+cGFja2FnZXNUb1JlbW92ZVskYWxpYXNQYWNrYWdlLT5pZF0pOwoKCmZvcmVhY2ggKCRhbGlhc1BhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkbmFtZSkgewppZiAoaXNzZXQoJHBhY2thZ2VJZGVudGljYWxEZWZpbml0aW9uTG9va3VwWyRhbGlhc1BhY2thZ2UtPmlkXVskbmFtZV0pKSB7CiRwYWNrYWdlR3JvdXBQb2ludGVycyA9ICRwYWNrYWdlSWRlbnRpY2FsRGVmaW5pdGlvbkxvb2t1cFskYWxpYXNQYWNrYWdlLT5pZF1bJG5hbWVdOwokcGFja2FnZUdyb3VwID0gJGlkZW50aWNhbERlZmluaXRpb25zUGVyUGFja2FnZVskbmFtZV1bJHBhY2thZ2VHcm91cFBvaW50ZXJzWydncm91cEhhc2gnXV1bJHBhY2thZ2VHcm91cFBvaW50ZXJzWydkZXBlbmRlbmN5SGFzaCddXTsKZm9yZWFjaCAoJHBhY2thZ2VHcm91cCBhcyAkcGtnKSB7CmlmICgkcGtnIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwa2ctPmdldFByZXR0eVZlcnNpb24oKSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHBrZyA9ICRwa2ctPmdldEFsaWFzT2YoKTsKfQokdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlW3NwbF9vYmplY3RfaGFzaCgkYWxpYXNQYWNrYWdlKV1bJHBrZy0+Z2V0VmVyc2lvbigpXSA9ICRwa2ctPmdldFByZXR0eVZlcnNpb24oKTsKfQp9Cn0KfQp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvcHRpbWl6ZUltcG9zc2libGVQYWNrYWdlc0F3YXkoUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IHZvaWQKewppZiAoXGNvdW50KCRyZXF1ZXN0LT5nZXRMb2NrZWRQYWNrYWdlcygpKSA9PT0gMCkgewpyZXR1cm47Cn0KCiRwYWNrYWdlSW5kZXggPSBbXTsKCmZvcmVhY2ggKCRwb29sLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRpZCA9ICRwYWNrYWdlLT5pZDsKCgppZiAoaXNzZXQoJHRoaXMtPmlycmVtb3ZhYmxlUGFja2FnZXNbJGlkXSkpIHsKY29udGludWU7Cn0KCmlmIChpc3NldCgkdGhpcy0+YWxpYXNlc1BlclBhY2thZ2VbJGlkXSkgfHwgJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKY29udGludWU7Cn0KCmlmICgkcmVxdWVzdC0+aXNGaXhlZFBhY2thZ2UoJHBhY2thZ2UpIHx8ICRyZXF1ZXN0LT5pc0xvY2tlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CmNvbnRpbnVlOwp9CgokcGFja2FnZUluZGV4WyRwYWNrYWdlLT5nZXROYW1lKCldWyRwYWNrYWdlLT5pZF0gPSAkcGFja2FnZTsKfQoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldExvY2tlZFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKCgokaXNVbnVzZWRQYWNrYWdlID0gdHJ1ZTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkcGFja2FnZU5hbWUpIHsKaWYgKGlzc2V0KCR0aGlzLT5yZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlWyRwYWNrYWdlTmFtZV0pKSB7CiRpc1VudXNlZFBhY2thZ2UgPSBmYWxzZTsKYnJlYWs7Cn0KfQoKaWYgKCRpc1VudXNlZFBhY2thZ2UpIHsKY29udGludWU7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiRyZXF1aXJlID0gJGxpbmstPmdldFRhcmdldCgpOwppZiAoIWlzc2V0KCRwYWNrYWdlSW5kZXhbJHJlcXVpcmVdKSkgewpjb250aW51ZTsKfQoKJGxpbmtDb25zdHJhaW50ID0gJGxpbmstPmdldENvbnN0cmFpbnQoKTsKZm9yZWFjaCAoJHBhY2thZ2VJbmRleFskcmVxdWlyZV0gYXMgJGlkID0+ICRyZXF1aXJlZFBrZykgewppZiAoZmFsc2UgPT09IENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRsaW5rQ29uc3RyYWludCwgQ29uc3RyYWludDo6T1BfRVEsICRyZXF1aXJlZFBrZy0+Z2V0VmVyc2lvbigpKSkgewokdGhpcy0+bWFya1BhY2thZ2VGb3JSZW1vdmFsKCRpZCk7CnVuc2V0KCRwYWNrYWdlSW5kZXhbJHJlcXVpcmVdWyRpZF0pOwp9Cn0KfQp9Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4dHJhY3RSZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlKHN0cmluZyAkcGFja2FnZSwgQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCkKewpmb3JlYWNoICgkdGhpcy0+ZXhwYW5kRGlzanVuY3RpdmVNdWx0aUNvbnN0cmFpbnRzKCRjb25zdHJhaW50KSBhcyAkZXhwYW5kZWQpIHsKJHRoaXMtPnJlcXVpcmVDb25zdHJhaW50c1BlclBhY2thZ2VbJHBhY2thZ2VdWyhzdHJpbmcpICRleHBhbmRlZF0gPSAkZXhwYW5kZWQ7Cn0KfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdENvbmZsaWN0Q29uc3RyYWludHNQZXJQYWNrYWdlKHN0cmluZyAkcGFja2FnZSwgQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCkKewpmb3JlYWNoICgkdGhpcy0+ZXhwYW5kRGlzanVuY3RpdmVNdWx0aUNvbnN0cmFpbnRzKCRjb25zdHJhaW50KSBhcyAkZXhwYW5kZWQpIHsKJHRoaXMtPmNvbmZsaWN0Q29uc3RyYWludHNQZXJQYWNrYWdlWyRwYWNrYWdlXVsoc3RyaW5nKSAkZXhwYW5kZWRdID0gJGV4cGFuZGVkOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZXhwYW5kRGlzanVuY3RpdmVNdWx0aUNvbnN0cmFpbnRzKENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpCnsKJGNvbnN0cmFpbnQgPSBJbnRlcnZhbHM6OmNvbXBhY3RDb25zdHJhaW50KCRjb25zdHJhaW50KTsKCmlmICgkY29uc3RyYWludCBpbnN0YW5jZW9mIE11bHRpQ29uc3RyYWludCAmJiAkY29uc3RyYWludC0+aXNEaXNqdW5jdGl2ZSgpKSB7CgoKcmV0dXJuICRjb25zdHJhaW50LT5nZXRDb25zdHJhaW50cygpOwp9CgoKcmV0dXJuIFskY29uc3RyYWludF07Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcTG9ja0FycmF5UmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE11bHRpQ29uc3RyYWludDsKCgoKCgoKY2xhc3MgUHJvYmxlbQp7CgoKCgpwcm90ZWN0ZWQgJHJlYXNvblNlZW47CgoKCgoKcHJvdGVjdGVkICRyZWFzb25zID0gW107CgoKcHJvdGVjdGVkICRzZWN0aW9uID0gMDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJ1bGUoUnVsZSAkcnVsZSk6IHZvaWQKewokdGhpcy0+YWRkUmVhc29uKHNwbF9vYmplY3RfaGFzaCgkcnVsZSksICRydWxlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVhc29ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVhc29uczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZyhSZXBvc2l0b3J5U2V0ICRyZXBvc2l0b3J5U2V0LCBSZXF1ZXN0ICRyZXF1ZXN0LCBQb29sICRwb29sLCBib29sICRpc1ZlcmJvc2UsIGFycmF5ICRpbnN0YWxsZWRNYXAgPSBbXSwgYXJyYXkgJGxlYXJuZWRQb29sID0gW10pOiBzdHJpbmcKewoKJHJlYXNvbnMgPSBhcnJheV9tZXJnZSguLi5hcnJheV9yZXZlcnNlKCR0aGlzLT5yZWFzb25zKSk7CgppZiAoXGNvdW50KCRyZWFzb25zKSA9PT0gMSkgewpyZXNldCgkcmVhc29ucyk7CiRydWxlID0gY3VycmVudCgkcmVhc29ucyk7CgppZiAoJHJ1bGUtPmdldFJlYXNvbigpICE9PSBSdWxlOjpSVUxFX1JPT1RfUkVRVUlSRSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCJTaW5nbGUgcmVhc29uIHByb2JsZW1zIG11c3QgY29udGFpbiBhIHJvb3QgcmVxdWlyZSBydWxlLiIpOwp9CgokcmVhc29uRGF0YSA9ICRydWxlLT5nZXRSZWFzb25EYXRhKCk7CiRwYWNrYWdlTmFtZSA9ICRyZWFzb25EYXRhWydwYWNrYWdlTmFtZSddOwokY29uc3RyYWludCA9ICRyZWFzb25EYXRhWydjb25zdHJhaW50J107CgokcGFja2FnZXMgPSAkcG9vbC0+d2hhdFByb3ZpZGVzKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpOwppZiAoXGNvdW50KCRwYWNrYWdlcykgPT09IDApIHsKcmV0dXJuICJcbiAgICAiLmltcGxvZGUoc2VsZjo6Z2V0TWlzc2luZ1BhY2thZ2VSZWFzb24oJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCwgJGlzVmVyYm9zZSwgJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCkpOwp9Cn0KCnVzb3J0KCRyZWFzb25zLCBmdW5jdGlvbiAoUnVsZSAkcnVsZTEsIFJ1bGUgJHJ1bGUyKSB1c2UgKCRwb29sKSB7CiRydWxlMVByaW8gPSAkdGhpcy0+Z2V0UnVsZVByaW9yaXR5KCRydWxlMSk7CiRydWxlMlByaW8gPSAkdGhpcy0+Z2V0UnVsZVByaW9yaXR5KCRydWxlMik7CmlmICgkcnVsZTFQcmlvICE9PSAkcnVsZTJQcmlvKSB7CnJldHVybiAkcnVsZTJQcmlvIC0gJHJ1bGUxUHJpbzsKfQoKcmV0dXJuICR0aGlzLT5nZXRTb3J0YWJsZVN0cmluZygkcG9vbCwgJHJ1bGUxKSA8PT4gJHRoaXMtPmdldFNvcnRhYmxlU3RyaW5nKCRwb29sLCAkcnVsZTIpOwp9KTsKCnJldHVybiBzZWxmOjpmb3JtYXREZWR1cGxpY2F0ZWRSdWxlcygkcmVhc29ucywgJyAgICAnLCAkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sLCAkaXNWZXJib3NlLCAkaW5zdGFsbGVkTWFwLCAkbGVhcm5lZFBvb2wpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFNvcnRhYmxlU3RyaW5nKFBvb2wgJHBvb2wsIFJ1bGUgJHJ1bGUpOiBzdHJpbmcKewpzd2l0Y2ggKCRydWxlLT5nZXRSZWFzb24oKSkgewpjYXNlIFJ1bGU6OlJVTEVfUk9PVF9SRVFVSVJFOgpyZXR1cm4gJHJ1bGUtPmdldFJlYXNvbkRhdGEoKVsncGFja2FnZU5hbWUnXTsKY2FzZSBSdWxlOjpSVUxFX0ZJWEVEOgpyZXR1cm4gKHN0cmluZykgJHJ1bGUtPmdldFJlYXNvbkRhdGEoKVsncGFja2FnZSddOwpjYXNlIFJ1bGU6OlJVTEVfUEFDS0FHRV9DT05GTElDVDoKY2FzZSBSdWxlOjpSVUxFX1BBQ0tBR0VfUkVRVUlSRVM6CnJldHVybiAkcnVsZS0+Z2V0U291cmNlUGFja2FnZSgkcG9vbCkgLiAnLy8nIC4gJHJ1bGUtPmdldFJlYXNvbkRhdGEoKS0+Z2V0UHJldHR5U3RyaW5nKCRydWxlLT5nZXRTb3VyY2VQYWNrYWdlKCRwb29sKSk7CmNhc2UgUnVsZTo6UlVMRV9QQUNLQUdFX1NBTUVfTkFNRToKY2FzZSBSdWxlOjpSVUxFX1BBQ0tBR0VfQUxJQVM6CmNhc2UgUnVsZTo6UlVMRV9QQUNLQUdFX0lOVkVSU0VfQUxJQVM6CnJldHVybiAoc3RyaW5nKSAkcnVsZS0+Z2V0UmVhc29uRGF0YSgpOwpjYXNlIFJ1bGU6OlJVTEVfTEVBUk5FRDoKcmV0dXJuIGltcGxvZGUoJy0nLCAkcnVsZS0+Z2V0TGl0ZXJhbHMoKSk7Cn0KCgp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdVbmtub3duIHJ1bGUgdHlwZTogJy4kcnVsZS0+Z2V0UmVhc29uKCkpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFJ1bGVQcmlvcml0eShSdWxlICRydWxlKTogaW50CnsKc3dpdGNoICgkcnVsZS0+Z2V0UmVhc29uKCkpIHsKY2FzZSBSdWxlOjpSVUxFX0ZJWEVEOgpyZXR1cm4gMzsKY2FzZSBSdWxlOjpSVUxFX1JPT1RfUkVRVUlSRToKcmV0dXJuIDI7CmNhc2UgUnVsZTo6UlVMRV9QQUNLQUdFX0NPTkZMSUNUOgpjYXNlIFJ1bGU6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUzoKcmV0dXJuIDE7CmNhc2UgUnVsZTo6UlVMRV9QQUNLQUdFX1NBTUVfTkFNRToKY2FzZSBSdWxlOjpSVUxFX0xFQVJORUQ6CmNhc2UgUnVsZTo6UlVMRV9QQUNLQUdFX0FMSUFTOgpjYXNlIFJ1bGU6OlJVTEVfUEFDS0FHRV9JTlZFUlNFX0FMSUFTOgpyZXR1cm4gMDsKfQoKCnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1Vua25vd24gcnVsZSB0eXBlOiAnLiRydWxlLT5nZXRSZWFzb24oKSk7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZm9ybWF0RGVkdXBsaWNhdGVkUnVsZXMoYXJyYXkgJHJ1bGVzLCBzdHJpbmcgJGluZGVudCwgUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCwgYm9vbCAkaXNWZXJib3NlLCBhcnJheSAkaW5zdGFsbGVkTWFwID0gW10sIGFycmF5ICRsZWFybmVkUG9vbCA9IFtdKTogc3RyaW5nCnsKJG1lc3NhZ2VzID0gW107CiR0ZW1wbGF0ZXMgPSBbXTsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokZGVkdXBsaWNhdGFibGVSdWxlVHlwZXMgPSBbUnVsZTo6UlVMRV9QQUNLQUdFX1JFUVVJUkVTLCBSdWxlOjpSVUxFX1BBQ0tBR0VfQ09ORkxJQ1RdOwpmb3JlYWNoICgkcnVsZXMgYXMgJHJ1bGUpIHsKJG1lc3NhZ2UgPSAkcnVsZS0+Z2V0UHJldHR5U3RyaW5nKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICRpc1ZlcmJvc2UsICRpbnN0YWxsZWRNYXAsICRsZWFybmVkUG9vbCk7CmlmIChpbl9hcnJheSgkcnVsZS0+Z2V0UmVhc29uKCksICRkZWR1cGxpY2F0YWJsZVJ1bGVUeXBlcywgdHJ1ZSkgJiYgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oP1A8cGFja2FnZT5cUyspICg/UDx2ZXJzaW9uPlxTKykgKD9QPHR5cGU+cmVxdWlyZXN8Y29uZmxpY3RzKX0nLCAkbWVzc2FnZSwgJG0pKSB7CiRtZXNzYWdlID0gc3RyX3JlcGxhY2UoJyUnLCAnJSUnLCAkbWVzc2FnZSk7CiR0ZW1wbGF0ZSA9IFByZWc6OnJlcGxhY2UoJ3teXFMrIFxTKyB9JywgJyVzJXMgJywgJG1lc3NhZ2UpOwokbWVzc2FnZXNbXSA9ICR0ZW1wbGF0ZTsKJHRlbXBsYXRlc1skdGVtcGxhdGVdWyRtWzFdXVskcGFyc2VyLT5ub3JtYWxpemUoJG1bMl0pXSA9ICRtWzJdOwokc291cmNlUGFja2FnZSA9ICRydWxlLT5nZXRTb3VyY2VQYWNrYWdlKCRwb29sKTsKZm9yZWFjaCAoJHBvb2wtPmdldFJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZShzcGxfb2JqZWN0X2hhc2goJHNvdXJjZVBhY2thZ2UpKSBhcyAkdmVyc2lvbiA9PiAkcHJldHR5VmVyc2lvbikgewokdGVtcGxhdGVzWyR0ZW1wbGF0ZV1bJG1bMV1dWyR2ZXJzaW9uXSA9ICRwcmV0dHlWZXJzaW9uOwp9Cn0gZWxzZWlmICgkbWVzc2FnZSAhPT0gJycpIHsKJG1lc3NhZ2VzW10gPSAkbWVzc2FnZTsKfQp9CgokcmVzdWx0ID0gW107CmZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkbWVzc2FnZXMpIGFzICRtZXNzYWdlKSB7CmlmIChpc3NldCgkdGVtcGxhdGVzWyRtZXNzYWdlXSkpIHsKZm9yZWFjaCAoJHRlbXBsYXRlc1skbWVzc2FnZV0gYXMgJHBhY2thZ2UgPT4gJHZlcnNpb25zKSB7CnVrc29ydCgkdmVyc2lvbnMsICd2ZXJzaW9uX2NvbXBhcmUnKTsKaWYgKCEkaXNWZXJib3NlKSB7CiR2ZXJzaW9ucyA9IHNlbGY6OmNvbmRlbnNlVmVyc2lvbkxpc3QoJHZlcnNpb25zLCAxKTsKfQppZiAoXGNvdW50KCR2ZXJzaW9ucykgPiAxKSB7CgokbWVzc2FnZSA9IFByZWc6OnJlcGxhY2UoJ3teKCVzJXMgKD86cmVxdWlyZXxjb25mbGljdCkpc30nLCAnJDEnLCAkbWVzc2FnZSk7CiRyZXN1bHRbXSA9IHNwcmludGYoJG1lc3NhZ2UsICRwYWNrYWdlLCAnWycuaW1wbG9kZSgnLCAnLCAkdmVyc2lvbnMpLiddJyk7Cn0gZWxzZSB7CiRyZXN1bHRbXSA9IHNwcmludGYoJG1lc3NhZ2UsICRwYWNrYWdlLCAnICcucmVzZXQoJHZlcnNpb25zKSk7Cn0KfQp9IGVsc2UgewokcmVzdWx0W10gPSAkbWVzc2FnZTsKfQp9CgpyZXR1cm4gIlxuJGluZGVudC0gIi5pbXBsb2RlKCJcbiRpbmRlbnQtICIsICRyZXN1bHQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNDYXVzZWRCeUxvY2soUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IGJvb2wKewpmb3JlYWNoICgkdGhpcy0+cmVhc29ucyBhcyAkc2VjdGlvblJ1bGVzKSB7CmZvcmVhY2ggKCRzZWN0aW9uUnVsZXMgYXMgJHJ1bGUpIHsKaWYgKCRydWxlLT5pc0NhdXNlZEJ5TG9jaygkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sKSkgewpyZXR1cm4gdHJ1ZTsKfQp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZFJlYXNvbihzdHJpbmcgJGlkLCBSdWxlICRyZWFzb24pOiB2b2lkCnsKCgoKaWYgKCFpc3NldCgkdGhpcy0+cmVhc29uU2VlblskaWRdKSkgewokdGhpcy0+cmVhc29uU2VlblskaWRdID0gdHJ1ZTsKJHRoaXMtPnJlYXNvbnNbJHRoaXMtPnNlY3Rpb25dW10gPSAkcmVhc29uOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBuZXh0U2VjdGlvbigpOiB2b2lkCnsKJHRoaXMtPnNlY3Rpb24rKzsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TWlzc2luZ1BhY2thZ2VSZWFzb24oUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCwgYm9vbCAkaXNWZXJib3NlLCBzdHJpbmcgJHBhY2thZ2VOYW1lLCA/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwpOiBhcnJheQp7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWNrYWdlTmFtZSkpIHsKCmlmICgwID09PSBzdHJpcG9zKCRwYWNrYWdlTmFtZSwgJ3BocCcpIHx8ICRwYWNrYWdlTmFtZSA9PT0gJ2hodm0nKSB7CiR2ZXJzaW9uID0gc2VsZjo6Z2V0UGxhdGZvcm1QYWNrYWdlVmVyc2lvbigkcG9vbCwgJHBhY2thZ2VOYW1lLCBwaHB2ZXJzaW9uKCkpOwoKJG1zZyA9ICItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAiLiRwYWNrYWdlTmFtZS5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KS4nIGJ1dCAnOwoKaWYgKGRlZmluZWQoJ0hIVk1fVkVSU0lPTicpIHx8ICgkcGFja2FnZU5hbWUgPT09ICdoaHZtJyAmJiBjb3VudCgkcG9vbC0+d2hhdFByb3ZpZGVzKCRwYWNrYWdlTmFtZSkpID4gMCkpIHsKcmV0dXJuIFskbXNnLCAneW91ciBISFZNIHZlcnNpb24gZG9lcyBub3Qgc2F0aXNmeSB0aGF0IHJlcXVpcmVtZW50LiddOwp9CgppZiAoJHBhY2thZ2VOYW1lID09PSAnaGh2bScpIHsKcmV0dXJuIFskbXNnLCAnSEhWTSB3YXMgbm90IGRldGVjdGVkIG9uIHRoaXMgbWFjaGluZSwgbWFrZSBzdXJlIGl0IGlzIGluIHlvdXIgUEFUSC4nXTsKfQoKaWYgKG51bGwgPT09ICR2ZXJzaW9uKSB7CnJldHVybiBbJG1zZywgJ3RoZSAnLiRwYWNrYWdlTmFtZS4nIHBhY2thZ2UgaXMgZGlzYWJsZWQgYnkgeW91ciBwbGF0Zm9ybSBjb25maWcuIEVuYWJsZSBpdCBhZ2FpbiB3aXRoICJjb21wb3NlciBjb25maWcgcGxhdGZvcm0uJy4kcGFja2FnZU5hbWUuJyAtLXVuc2V0Ii4nXTsKfQoKcmV0dXJuIFskbXNnLCAneW91ciAnLiRwYWNrYWdlTmFtZS4nIHZlcnNpb24gKCcuICR2ZXJzaW9uIC4nKSBkb2VzIG5vdCBzYXRpc2Z5IHRoYXQgcmVxdWlyZW1lbnQuJ107Cn0KCgppZiAoMCA9PT0gc3RyaXBvcygkcGFja2FnZU5hbWUsICdleHQtJykpIHsKaWYgKGZhbHNlICE9PSBzdHJwb3MoJHBhY2thZ2VOYW1lLCAnICcpKSB7CnJldHVybiBbJy0gJywgIlBIUCBleHRlbnNpb24gIi4kcGFja2FnZU5hbWUuJyBzaG91bGQgYmUgcmVxdWlyZWQgYXMgJy5zdHJfcmVwbGFjZSgnICcsICctJywgJHBhY2thZ2VOYW1lKS4nLiddOwp9CgokZXh0ID0gc3Vic3RyKCRwYWNrYWdlTmFtZSwgNCk7CiRtc2cgPSAiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgUEhQIGV4dGVuc2lvbiAiLiRwYWNrYWdlTmFtZS5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KS4nIGJ1dCAnOwoKJHZlcnNpb24gPSBzZWxmOjpnZXRQbGF0Zm9ybVBhY2thZ2VWZXJzaW9uKCRwb29sLCAkcGFja2FnZU5hbWUsIHBocHZlcnNpb24oJGV4dCkgPT09IGZhbHNlID8gJzAnIDogcGhwdmVyc2lvbigkZXh0KSk7CmlmIChudWxsID09PSAkdmVyc2lvbikgewokcHJvdmlkZXJzU3RyID0gc2VsZjo6Z2V0UHJvdmlkZXJzTGlzdCgkcmVwb3NpdG9yeVNldCwgJHBhY2thZ2VOYW1lLCA1KTsKaWYgKCRwcm92aWRlcnNTdHIgIT09IG51bGwpIHsKJHByb3ZpZGVyc1N0ciA9ICJcblxuICAgICAgQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHJlcXVpcmUgb25lIG9mIHRoZXNlIHBhY2thZ2VzIHRoYXQgcHJvdmlkZSB0aGUgZXh0ZW5zaW9uIChvciBwYXJ0cyBvZiBpdCk6XG4iLgoiICAgICAgPHdhcm5pbmc+S2VlcCBpbiBtaW5kIHRoYXQgdGhlIHN1Z2dlc3Rpb25zIGFyZSBhdXRvbWF0ZWQgYW5kIG1heSBub3QgYmUgdmFsaWQgb3Igc2FmZSB0byB1c2U8L3dhcm5pbmc+XG4kcHJvdmlkZXJzU3RyIjsKfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJGV4dCkpIHsKcmV0dXJuIFsKJG1zZywKJ3RoZSAnLiRwYWNrYWdlTmFtZS4nIHBhY2thZ2UgaXMgZGlzYWJsZWQgYnkgeW91ciBwbGF0Zm9ybSBjb25maWcuIEVuYWJsZSBpdCBhZ2FpbiB3aXRoICJjb21wb3NlciBjb25maWcgcGxhdGZvcm0uJy4kcGFja2FnZU5hbWUuJyAtLXVuc2V0Ii4nIC4gJHByb3ZpZGVyc1N0ciwKXTsKfQoKcmV0dXJuIFskbXNnLCAnaXQgaXMgbWlzc2luZyBmcm9tIHlvdXIgc3lzdGVtLiBJbnN0YWxsIG9yIGVuYWJsZSBQSFBcJ3MgJy4kZXh0LicgZXh0ZW5zaW9uLicgLiAkcHJvdmlkZXJzU3RyXTsKfQoKcmV0dXJuIFskbXNnLCAnaXQgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uIGluc3RhbGxlZCAoJy4kdmVyc2lvbi4nKS4nXTsKfQoKCmlmICgwID09PSBzdHJpcG9zKCRwYWNrYWdlTmFtZSwgJ2xpYi0nKSkgewppZiAoc3RydG9sb3dlcigkcGFja2FnZU5hbWUpID09PSAnbGliLWljdScpIHsKJGVycm9yID0gZXh0ZW5zaW9uX2xvYWRlZCgnaW50bCcpID8gJ2l0IGhhcyB0aGUgd3JvbmcgdmVyc2lvbiBpbnN0YWxsZWQsIHRyeSB1cGdyYWRpbmcgdGhlIGludGwgZXh0ZW5zaW9uLicgOiAnaXQgaXMgbWlzc2luZyBmcm9tIHlvdXIgc3lzdGVtLCBtYWtlIHN1cmUgdGhlIGludGwgZXh0ZW5zaW9uIGlzIGxvYWRlZC4nOwoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgbGlua2VkIGxpYnJhcnkgIi4kcGFja2FnZU5hbWUuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkuJyBidXQgJywgJGVycm9yXTsKfQoKJHByb3ZpZGVyc1N0ciA9IHNlbGY6OmdldFByb3ZpZGVyc0xpc3QoJHJlcG9zaXRvcnlTZXQsICRwYWNrYWdlTmFtZSwgNSk7CmlmICgkcHJvdmlkZXJzU3RyICE9PSBudWxsKSB7CiRwcm92aWRlcnNTdHIgPSAiXG5cbiAgICAgIEFsdGVybmF0aXZlbHkgeW91IGNhbiByZXF1aXJlIG9uZSBvZiB0aGVzZSBwYWNrYWdlcyB0aGF0IHByb3ZpZGUgdGhlIGxpYnJhcnkgKG9yIHBhcnRzIG9mIGl0KTpcbiIuCiIgICAgICA8d2FybmluZz5LZWVwIGluIG1pbmQgdGhhdCB0aGUgc3VnZ2VzdGlvbnMgYXJlIGF1dG9tYXRlZCBhbmQgbWF5IG5vdCBiZSB2YWxpZCBvciBzYWZlIHRvIHVzZTwvd2FybmluZz5cbiRwcm92aWRlcnNTdHIiOwp9CgpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyBsaW5rZWQgbGlicmFyeSAiLiRwYWNrYWdlTmFtZS5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KS4nIGJ1dCAnLCAnaXQgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uIGluc3RhbGxlZCBvciBpcyBtaXNzaW5nIGZyb20geW91ciBzeXN0ZW0sIG1ha2Ugc3VyZSB0byBsb2FkIHRoZSBleHRlbnNpb24gcHJvdmlkaW5nIGl0LicuJHByb3ZpZGVyc1N0cl07Cn0KfQoKJGxvY2tlZFBhY2thZ2UgPSBudWxsOwpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0TG9ja2VkUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UtPmdldE5hbWUoKSA9PT0gJHBhY2thZ2VOYW1lKSB7CiRsb2NrZWRQYWNrYWdlID0gJHBhY2thZ2U7CmlmICgkcG9vbC0+aXNVbmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZSgkcGFja2FnZSkpIHsKcmV0dXJuIFsiLSAiLCAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaXMgZml4ZWQgdG8gJy4kcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLicgKGxvY2sgZmlsZSB2ZXJzaW9uKSBieSBhIHBhcnRpYWwgdXBkYXRlIGJ1dCB0aGF0IHZlcnNpb24gaXMgcmVqZWN0ZWQgYnkgeW91ciBtaW5pbXVtLXN0YWJpbGl0eS4gTWFrZSBzdXJlIHlvdSBsaXN0IGl0IGFzIGFuIGFyZ3VtZW50IGZvciB0aGUgdXBkYXRlIGNvbW1hbmQuJ107Cn0KYnJlYWs7Cn0KfQoKaWYgKCRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludCAmJiAkY29uc3RyYWludC0+Z2V0T3BlcmF0b3IoKSA9PT0gQ29uc3RyYWludDo6U1RSX09QX0VRICYmIFByZWc6OmlzTWF0Y2goJ3teZGV2LS4qIy4qfScsICRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSkpIHsKJG5ld0NvbnN0cmFpbnQgPSBQcmVnOjpyZXBsYWNlKCd7ICthcyArKFteLFxzfF0rKSR9JywgJycsICRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSk7CiRwYWNrYWdlcyA9ICRyZXBvc2l0b3J5U2V0LT5maW5kUGFja2FnZXMoJHBhY2thZ2VOYW1lLCBuZXcgTXVsdGlDb25zdHJhaW50KFsKbmV3IENvbnN0cmFpbnQoQ29uc3RyYWludDo6U1RSX09QX0VRLCAkbmV3Q29uc3RyYWludCksCm5ldyBDb25zdHJhaW50KENvbnN0cmFpbnQ6OlNUUl9PUF9FUSwgc3RyX3JlcGxhY2UoJyMnLCAnKycsICRuZXdDb25zdHJhaW50KSkKXSwgZmFsc2UpKTsKaWYgKFxjb3VudCgkcGFja2FnZXMpID4gMCkgewpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpIC4gJywgJywgJ2ZvdW5kICcuc2VsZjo6Z2V0UGFja2FnZUxpc3QoJHBhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicuIFRoZSAjIGNoYXJhY3RlciBpbiBicmFuY2ggbmFtZXMgaXMgcmVwbGFjZWQgYnkgYSArIGNoYXJhY3Rlci4gTWFrZSBzdXJlIHRvIHJlcXVpcmUgaXQgYXMgIicuc3RyX3JlcGxhY2UoJyMnLCAnKycsICRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSkuJyIuJ107Cn0KfQoKCgokcGFja2FnZXMgPSAkcmVwb3NpdG9yeVNldC0+ZmluZFBhY2thZ2VzKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpOwppZiAoXGNvdW50KCRwYWNrYWdlcykgPiAwKSB7CiRyb290UmVxcyA9ICRyZXBvc2l0b3J5U2V0LT5nZXRSb290UmVxdWlyZXMoKTsKaWYgKGlzc2V0KCRyb290UmVxc1skcGFja2FnZU5hbWVdKSkgewokZmlsdGVyZWQgPSBhcnJheV9maWx0ZXIoJHBhY2thZ2VzLCBzdGF0aWMgZnVuY3Rpb24gKCRwKSB1c2UgKCRyb290UmVxcywgJHBhY2thZ2VOYW1lKTogYm9vbCB7CnJldHVybiAkcm9vdFJlcXNbJHBhY2thZ2VOYW1lXS0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkcC0+Z2V0VmVyc2lvbigpKSk7Cn0pOwppZiAoMCA9PT0gY291bnQoJGZpbHRlcmVkKSkgewpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpIC4gJywgJywgJ2ZvdW5kICcuc2VsZjo6Z2V0UGFja2FnZUxpc3QoJHBhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgYnV0ICcuKHNlbGY6Omhhc011bHRpcGxlTmFtZXMoJHBhY2thZ2VzKSA/ICd0aGVzZSBjb25mbGljdCcgOiAnaXQgY29uZmxpY3RzJykuJyB3aXRoIHlvdXIgcm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmUgKCcuJHJvb3RSZXFzWyRwYWNrYWdlTmFtZV0tPmdldFByZXR0eVN0cmluZygpLicpLiddOwp9Cn0KCiR0ZW1wUmVxcyA9ICRyZXBvc2l0b3J5U2V0LT5nZXRUZW1wb3JhcnlDb25zdHJhaW50cygpOwpmb3JlYWNoIChyZXNldCgkcGFja2FnZXMpLT5nZXROYW1lcygpIGFzICRuYW1lKSB7CmlmIChpc3NldCgkdGVtcFJlcXNbJG5hbWVdKSkgewokZmlsdGVyZWQgPSBhcnJheV9maWx0ZXIoJHBhY2thZ2VzLCBzdGF0aWMgZnVuY3Rpb24gKCRwKSB1c2UgKCR0ZW1wUmVxcywgJG5hbWUpOiBib29sIHsKcmV0dXJuICR0ZW1wUmVxc1skbmFtZV0tPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHAtPmdldFZlcnNpb24oKSkpOwp9KTsKaWYgKDAgPT09IGNvdW50KCRmaWx0ZXJlZCkpIHsKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJG5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpIC4gJywgJywgJ2ZvdW5kICcuc2VsZjo6Z2V0UGFja2FnZUxpc3QoJHBhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgYnV0ICcuKHNlbGY6Omhhc011bHRpcGxlTmFtZXMoJHBhY2thZ2VzKSA/ICd0aGVzZSBjb25mbGljdCcgOiAnaXQgY29uZmxpY3RzJykuJyB3aXRoIHlvdXIgdGVtcG9yYXJ5IHVwZGF0ZSBjb25zdHJhaW50ICgnLiRuYW1lLic6Jy4kdGVtcFJlcXNbJG5hbWVdLT5nZXRQcmV0dHlTdHJpbmcoKS4nKS4nXTsKfQp9Cn0KCmlmICgkbG9ja2VkUGFja2FnZSAhPT0gbnVsbCkgewokZml4ZWRDb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoJz09JywgJGxvY2tlZFBhY2thZ2UtPmdldFZlcnNpb24oKSk7CiRmaWx0ZXJlZCA9IGFycmF5X2ZpbHRlcigkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoJHApIHVzZSAoJGZpeGVkQ29uc3RyYWludCk6IGJvb2wgewpyZXR1cm4gJGZpeGVkQ29uc3RyYWludC0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkcC0+Z2V0VmVyc2lvbigpKSk7Cn0pOwppZiAoMCA9PT0gY291bnQoJGZpbHRlcmVkKSkgewpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpIC4gJywgJywgJ2ZvdW5kICcuc2VsZjo6Z2V0UGFja2FnZUxpc3QoJHBhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgYnV0IHRoZSBwYWNrYWdlIGlzIGZpeGVkIHRvICcuJGxvY2tlZFBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4nIChsb2NrIGZpbGUgdmVyc2lvbikgYnkgYSBwYXJ0aWFsIHVwZGF0ZSBhbmQgdGhhdCB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoLiBNYWtlIHN1cmUgeW91IGxpc3QgaXQgYXMgYW4gYXJndW1lbnQgZm9yIHRoZSB1cGRhdGUgY29tbWFuZC4nXTsKfQp9Cgokbm9uTG9ja2VkUGFja2FnZXMgPSBhcnJheV9maWx0ZXIoJHBhY2thZ2VzLCBzdGF0aWMgZnVuY3Rpb24gKCRwKTogYm9vbCB7CnJldHVybiAhJHAtPmdldFJlcG9zaXRvcnkoKSBpbnN0YW5jZW9mIExvY2tBcnJheVJlcG9zaXRvcnk7Cn0pOwoKaWYgKDAgPT09IFxjb3VudCgkbm9uTG9ja2VkUGFja2FnZXMpKSB7CnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLCAnZm91bmQgJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBpbiB0aGUgbG9jayBmaWxlIGJ1dCBub3QgaW4gcmVtb3RlIHJlcG9zaXRvcmllcywgbWFrZSBzdXJlIHlvdSBhdm9pZCB1cGRhdGluZyB0aGlzIHBhY2thZ2UgdG8ga2VlcCB0aGUgb25lIGZyb20gdGhlIGxvY2sgZmlsZS4nXTsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCB0aGVzZSB3ZXJlIG5vdCBsb2FkZWQsIGxpa2VseSBiZWNhdXNlICcuKHNlbGY6Omhhc011bHRpcGxlTmFtZXMoJHBhY2thZ2VzKSA/ICd0aGV5IGNvbmZsaWN0JyA6ICdpdCBjb25mbGljdHMnKS4nIHdpdGggYW5vdGhlciByZXF1aXJlLiddOwp9CgoKJHBhY2thZ2VzID0gJHJlcG9zaXRvcnlTZXQtPmZpbmRQYWNrYWdlcygkcGFja2FnZU5hbWUsICRjb25zdHJhaW50LCBSZXBvc2l0b3J5U2V0OjpBTExPV19VTkFDQ0VQVEFCTEVfU1RBQklMSVRJRVMpOwppZiAoXGNvdW50KCRwYWNrYWdlcykgPiAwKSB7CgokYWxsUmVwb3NQYWNrYWdlcyA9ICRyZXBvc2l0b3J5U2V0LT5maW5kUGFja2FnZXMoJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCwgUmVwb3NpdG9yeVNldDo6QUxMT1dfU0hBRE9XRURfUkVQT1NJVE9SSUVTKTsKaWYgKFxjb3VudCgkYWxsUmVwb3NQYWNrYWdlcykgPiAwKSB7CnJldHVybiBzZWxmOjpjb21wdXRlQ2hlY2tGb3JMb3dlclByaW9SZXBvKCRwb29sLCAkaXNWZXJib3NlLCAkcGFja2FnZU5hbWUsICRwYWNrYWdlcywgJGFsbFJlcG9zUGFja2FnZXMsICdtaW5pbXVtLXN0YWJpbGl0eScsICRjb25zdHJhaW50KTsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCAnLihzZWxmOjpoYXNNdWx0aXBsZU5hbWVzKCRwYWNrYWdlcykgPyAndGhlc2UgZG8nIDogJ2l0IGRvZXMnKS4nIG5vdCBtYXRjaCB5b3VyIG1pbmltdW0tc3RhYmlsaXR5LiddOwp9CgoKJHBhY2thZ2VzID0gJHJlcG9zaXRvcnlTZXQtPmZpbmRQYWNrYWdlcygkcGFja2FnZU5hbWUsIG51bGwsIFJlcG9zaXRvcnlTZXQ6OkFMTE9XX1VOQUNDRVBUQUJMRV9TVEFCSUxJVElFUyk7CmlmIChcY291bnQoJHBhY2thZ2VzKSA+IDApIHsKCiRhbGxSZXBvc1BhY2thZ2VzID0gJHJlcG9zaXRvcnlTZXQtPmZpbmRQYWNrYWdlcygkcGFja2FnZU5hbWUsICRjb25zdHJhaW50LCBSZXBvc2l0b3J5U2V0OjpBTExPV19TSEFET1dFRF9SRVBPU0lUT1JJRVMpOwppZiAoXGNvdW50KCRhbGxSZXBvc1BhY2thZ2VzKSA+IDApIHsKcmV0dXJuIHNlbGY6OmNvbXB1dGVDaGVja0Zvckxvd2VyUHJpb1JlcG8oJHBvb2wsICRpc1ZlcmJvc2UsICRwYWNrYWdlTmFtZSwgJHBhY2thZ2VzLCAkYWxsUmVwb3NQYWNrYWdlcywgJ2NvbnN0cmFpbnQnLCAkY29uc3RyYWludCk7Cn0KCiRzdWZmaXggPSAnJzsKaWYgKCRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludCAmJiAkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpID09PSAnZGV2LW1hc3RlcicpIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRjYW5kaWRhdGUpIHsKaWYgKGluX2FycmF5KCRjYW5kaWRhdGUtPmdldFZlcnNpb24oKSwgWydkZXYtZGVmYXVsdCcsICdkZXYtbWFpbiddLCB0cnVlKSkgewokc3VmZml4ID0gJyBQZXJoYXBzIGRldi1tYXN0ZXIgd2FzIHJlbmFtZWQgdG8gJy4kY2FuZGlkYXRlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJz8nOwpicmVhazsKfQp9Cn0KCgokYWxsUmVwb3NQYWNrYWdlcyA9ICRwYWNrYWdlczsKJHRvcFBhY2thZ2UgPSByZXNldCgkYWxsUmVwb3NQYWNrYWdlcyk7CmlmICgkdG9wUGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlSW50ZXJmYWNlKSB7CiRzdWZmaXggPSAnIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kZXAtb24tcm9vdCBmb3IgZGV0YWlscyBhbmQgYXNzaXN0YW5jZS4nOwp9CgpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpIC4gJywgJywgJ2ZvdW5kICcuc2VsZjo6Z2V0UGFja2FnZUxpc3QoJHBhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgYnV0ICcuKHNlbGY6Omhhc011bHRpcGxlTmFtZXMoJHBhY2thZ2VzKSA/ICd0aGVzZSBkbycgOiAnaXQgZG9lcycpLicgbm90IG1hdGNoIHRoZSBjb25zdHJhaW50LicgLiAkc3VmZml4XTsKfQoKaWYgKCFQcmVnOjppc01hdGNoKCd7XltBLVphLXowLTlfLi8tXSskfScsICRwYWNrYWdlTmFtZSkpIHsKJGlsbGVnYWxDaGFycyA9IFByZWc6OnJlcGxhY2UoJ3tbQS1aYS16MC05Xy4vLV0rfScsICcnLCAkcGFja2FnZU5hbWUpOwoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lLCBpdCAiLCAnY291bGQgbm90IGJlIGZvdW5kLCBpdCBsb29rcyBsaWtlIGl0cyBuYW1lIGlzIGludmFsaWQsICInLiRpbGxlZ2FsQ2hhcnMuJyIgaXMgbm90IGFsbG93ZWQgaW4gcGFja2FnZSBuYW1lcy4nXTsKfQoKJHByb3ZpZGVyc1N0ciA9IHNlbGY6OmdldFByb3ZpZGVyc0xpc3QoJHJlcG9zaXRvcnlTZXQsICRwYWNrYWdlTmFtZSwgMTUpOwppZiAoJHByb3ZpZGVyc1N0ciAhPT0gbnVsbCkgewpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpLiIsIGl0ICIsICJjb3VsZCBub3QgYmUgZm91bmQgaW4gYW55IHZlcnNpb24sIGJ1dCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIHByb3ZpZGUgaXQ6XG4iLiRwcm92aWRlcnNTdHIuIiAgICAgIENvbnNpZGVyIHJlcXVpcmluZyBvbmUgb2YgdGhlc2UgdG8gc2F0aXNmeSB0aGUgJHBhY2thZ2VOYW1lIHJlcXVpcmVtZW50LiJdOwp9CgpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUsIGl0ICIsICJjb3VsZCBub3QgYmUgZm91bmQgaW4gYW55IHZlcnNpb24sIHRoZXJlIG1heSBiZSBhIHR5cG8gaW4gdGhlIHBhY2thZ2UgbmFtZS4iXTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGFja2FnZUxpc3QoYXJyYXkgJHBhY2thZ2VzLCBib29sICRpc1ZlcmJvc2UsID9Qb29sICRwb29sID0gbnVsbCwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsLCBib29sICR1c2VSZW1vdmVkVmVyc2lvbkdyb3VwID0gZmFsc2UpOiBzdHJpbmcKewokcHJlcGFyZWQgPSBbXTsKJGhhc0RlZmF1bHRCcmFuY2ggPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRwcmVwYXJlZFskcGFja2FnZS0+Z2V0TmFtZSgpXVsnbmFtZSddID0gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKJHByZXBhcmVkWyRwYWNrYWdlLT5nZXROYW1lKCldWyd2ZXJzaW9ucyddWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4oJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgPyAnIChhbGlhcyBvZiAnLiRwYWNrYWdlLT5nZXRBbGlhc09mKCktPmdldFByZXR0eVZlcnNpb24oKS4nKScgOiAnJyk7CmlmICgkcG9vbCAhPT0gbnVsbCAmJiAkY29uc3RyYWludCAhPT0gbnVsbCkgewpmb3JlYWNoICgkcG9vbC0+Z2V0UmVtb3ZlZFZlcnNpb25zKCRwYWNrYWdlLT5nZXROYW1lKCksICRjb25zdHJhaW50KSBhcyAkdmVyc2lvbiA9PiAkcHJldHR5VmVyc2lvbikgewokcHJlcGFyZWRbJHBhY2thZ2UtPmdldE5hbWUoKV1bJ3ZlcnNpb25zJ11bJHZlcnNpb25dID0gJHByZXR0eVZlcnNpb247Cn0KfQppZiAoJHBvb2wgIT09IG51bGwgJiYgJHVzZVJlbW92ZWRWZXJzaW9uR3JvdXApIHsKZm9yZWFjaCAoJHBvb2wtPmdldFJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZShzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpKSBhcyAkdmVyc2lvbiA9PiAkcHJldHR5VmVyc2lvbikgewokcHJlcGFyZWRbJHBhY2thZ2UtPmdldE5hbWUoKV1bJ3ZlcnNpb25zJ11bJHZlcnNpb25dID0gJHByZXR0eVZlcnNpb247Cn0KfQppZiAoJHBhY2thZ2UtPmlzRGVmYXVsdEJyYW5jaCgpKSB7CiRoYXNEZWZhdWx0QnJhbmNoWyRwYWNrYWdlLT5nZXROYW1lKCldID0gdHJ1ZTsKfQp9CgokcHJlcGFyZWRTdHJpbmdzID0gW107CmZvcmVhY2ggKCRwcmVwYXJlZCBhcyAkbmFtZSA9PiAkcGFja2FnZSkgewoKaWYgKGlzc2V0KCRwYWNrYWdlWyd2ZXJzaW9ucyddW1ZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTXSwgJGhhc0RlZmF1bHRCcmFuY2hbJG5hbWVdKSkgewp1bnNldCgkcGFja2FnZVsndmVyc2lvbnMnXVtWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBU10pOwp9Cgp1a3NvcnQoJHBhY2thZ2VbJ3ZlcnNpb25zJ10sICd2ZXJzaW9uX2NvbXBhcmUnKTsKCmlmICghJGlzVmVyYm9zZSkgewokcGFja2FnZVsndmVyc2lvbnMnXSA9IHNlbGY6OmNvbmRlbnNlVmVyc2lvbkxpc3QoJHBhY2thZ2VbJ3ZlcnNpb25zJ10sIDQpOwp9CiRwcmVwYXJlZFN0cmluZ3NbXSA9ICRwYWNrYWdlWyduYW1lJ10uJ1snLmltcGxvZGUoJywgJywgJHBhY2thZ2VbJ3ZlcnNpb25zJ10pLiddJzsKfQoKcmV0dXJuIGltcGxvZGUoJywgJywgJHByZXBhcmVkU3RyaW5ncyk7Cn0KCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybVBhY2thZ2VWZXJzaW9uKFBvb2wgJHBvb2wsIHN0cmluZyAkcGFja2FnZU5hbWUsIHN0cmluZyAkdmVyc2lvbik6ID9zdHJpbmcKewokYXZhaWxhYmxlID0gJHBvb2wtPndoYXRQcm92aWRlcygkcGFja2FnZU5hbWUpOwoKaWYgKFxjb3VudCgkYXZhaWxhYmxlKSA+IDApIHsKJHNlbGVjdGVkID0gbnVsbDsKZm9yZWFjaCAoJGF2YWlsYWJsZSBhcyAkcGtnKSB7CmlmICgkcGtnLT5nZXRSZXBvc2l0b3J5KCkgaW5zdGFuY2VvZiBQbGF0Zm9ybVJlcG9zaXRvcnkpIHsKJHNlbGVjdGVkID0gJHBrZzsKYnJlYWs7Cn0KfQppZiAoJHNlbGVjdGVkID09PSBudWxsKSB7CiRzZWxlY3RlZCA9IHJlc2V0KCRhdmFpbGFibGUpOwp9CgoKaWYgKCRzZWxlY3RlZC0+Z2V0TmFtZSgpICE9PSAkcGFja2FnZU5hbWUpIHsKCmZvcmVhY2ggKGFycmF5X21lcmdlKGFycmF5X3ZhbHVlcygkc2VsZWN0ZWQtPmdldFByb3ZpZGVzKCkpLCBhcnJheV92YWx1ZXMoJHNlbGVjdGVkLT5nZXRSZXBsYWNlcygpKSkgYXMgJGxpbmspIHsKaWYgKCRsaW5rLT5nZXRUYXJnZXQoKSA9PT0gJHBhY2thZ2VOYW1lKSB7CnJldHVybiAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLicgJy5zdWJzdHIoJGxpbmstPmdldERlc2NyaXB0aW9uKCksIDAsIC0xKS4nZCBieSAnLiRzZWxlY3RlZC0+Z2V0UHJldHR5U3RyaW5nKCk7Cn0KfQp9CgokdmVyc2lvbiA9ICRzZWxlY3RlZC0+Z2V0UHJldHR5VmVyc2lvbigpOwokZXh0cmEgPSAkc2VsZWN0ZWQtPmdldEV4dHJhKCk7CmlmICgkc2VsZWN0ZWQgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgaXNzZXQoJGV4dHJhWydjb25maWcucGxhdGZvcm0nXSkgJiYgJGV4dHJhWydjb25maWcucGxhdGZvcm0nXSA9PT0gdHJ1ZSkgewokdmVyc2lvbiAuPSAnOyAnIC4gc3RyX3JlcGxhY2UoJ1BhY2thZ2UgJywgJycsIChzdHJpbmcpICRzZWxlY3RlZC0+Z2V0RGVzY3JpcHRpb24oKSk7Cn0KfSBlbHNlIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkdmVyc2lvbjsKfQoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvbmRlbnNlVmVyc2lvbkxpc3QoYXJyYXkgJHZlcnNpb25zLCBpbnQgJG1heCwgaW50ICRtYXhEZXYgPSAxNik6IGFycmF5CnsKaWYgKGNvdW50KCR2ZXJzaW9ucykgPD0gJG1heCkgewpyZXR1cm4gYXJyYXlfdmFsdWVzKCR2ZXJzaW9ucyk7Cn0KCiRmaWx0ZXJlZCA9IFtdOwokYnlNYWpvciA9IFtdOwpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb24gPT4gJHByZXR0eSkgewppZiAoMCA9PT0gc3RyaXBvcygoc3RyaW5nKSAkdmVyc2lvbiwgJ2Rldi0nKSkgewokYnlNYWpvclsnZGV2J11bXSA9ICRwcmV0dHk7Cn0gZWxzZSB7CiRieU1ham9yW1ByZWc6OnJlcGxhY2UoJ3teKFxkKylcLi4qfScsICckMScsIChzdHJpbmcpICR2ZXJzaW9uKV1bXSA9ICRwcmV0dHk7Cn0KfQpmb3JlYWNoICgkYnlNYWpvciBhcyAkbWFqb3JWZXJzaW9uID0+ICR2ZXJzaW9uc0Zvck1ham9yKSB7CiRtYXhWZXJzaW9ucyA9ICRtYWpvclZlcnNpb24gPT09ICdkZXYnID8gJG1heERldiA6ICRtYXg7CmlmIChjb3VudCgkdmVyc2lvbnNGb3JNYWpvcikgPiAkbWF4VmVyc2lvbnMpIHsKCiRmaWx0ZXJlZFtdID0gJHZlcnNpb25zRm9yTWFqb3JbMF07CiRmaWx0ZXJlZFtdID0gJy4uLic7CiRmaWx0ZXJlZFtdID0gJHZlcnNpb25zRm9yTWFqb3JbY291bnQoJHZlcnNpb25zRm9yTWFqb3IpIC0gMV07Cn0gZWxzZSB7CiRmaWx0ZXJlZCA9IGFycmF5X21lcmdlKCRmaWx0ZXJlZCwgJHZlcnNpb25zRm9yTWFqb3IpOwp9Cn0KCnJldHVybiAkZmlsdGVyZWQ7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhc011bHRpcGxlTmFtZXMoYXJyYXkgJHBhY2thZ2VzKTogYm9vbAp7CiRuYW1lID0gbnVsbDsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkbmFtZSA9PT0gbnVsbCB8fCAkbmFtZSA9PT0gJHBhY2thZ2UtPmdldE5hbWUoKSkgewokbmFtZSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0gZWxzZSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb21wdXRlQ2hlY2tGb3JMb3dlclByaW9SZXBvKFBvb2wgJHBvb2wsIGJvb2wgJGlzVmVyYm9zZSwgc3RyaW5nICRwYWNrYWdlTmFtZSwgYXJyYXkgJGhpZ2hlclJlcG9QYWNrYWdlcywgYXJyYXkgJGFsbFJlcG9zUGFja2FnZXMsIHN0cmluZyAkcmVhc29uLCA/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwpOiBhcnJheQp7CiRuZXh0UmVwb1BhY2thZ2VzID0gW107CiRuZXh0UmVwbyA9IG51bGw7Cgpmb3JlYWNoICgkYWxsUmVwb3NQYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJG5leHRSZXBvID09PSBudWxsIHx8ICRuZXh0UmVwbyA9PT0gJHBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKSkgewokbmV4dFJlcG9QYWNrYWdlc1tdID0gJHBhY2thZ2U7CiRuZXh0UmVwbyA9ICRwYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCk7Cn0gZWxzZSB7CmJyZWFrOwp9Cn0KCmFzc2VydChudWxsICE9PSAkbmV4dFJlcG8pOwoKaWYgKFxjb3VudCgkaGlnaGVyUmVwb1BhY2thZ2VzKSA+IDApIHsKJHRvcFBhY2thZ2UgPSByZXNldCgkaGlnaGVyUmVwb1BhY2thZ2VzKTsKaWYgKCR0b3BQYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKcmV0dXJuIFsKIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkuJywgaXQgaXMgJywKJ3NhdGlzZmlhYmxlIGJ5ICcuc2VsZjo6Z2V0UGFja2FnZUxpc3QoJG5leHRSZXBvUGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBmcm9tICcuJG5leHRSZXBvLT5nZXRSZXBvTmFtZSgpLicgYnV0ICcuJHRvcFBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nICcuJHRvcFBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4nIGlzIHRoZSByb290IHBhY2thZ2UgYW5kIGNhbm5vdCBiZSBtb2RpZmllZC4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RlcC1vbi1yb290IGZvciBkZXRhaWxzIGFuZCBhc3Npc3RhbmNlLicsCl07Cn0KfQoKaWYgKCRuZXh0UmVwbyBpbnN0YW5jZW9mIExvY2tBcnJheVJlcG9zaXRvcnkpIHsKJHNpbmd1bGFyID0gY291bnQoJGhpZ2hlclJlcG9QYWNrYWdlcykgPT09IDE7Cgokc3VnZ2VzdGlvbiA9ICdNYWtlIHN1cmUgeW91IGVpdGhlciBmaXggdGhlICcuJHJlYXNvbi4nIG9yIGF2b2lkIHVwZGF0aW5nIHRoaXMgcGFja2FnZSB0byBrZWVwIHRoZSBvbmUgcHJlc2VudCBpbiB0aGUgbG9jayBmaWxlICgnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRuZXh0UmVwb1BhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicpLic7CgppZiAoJG5leHRSZXBvUGFja2FnZXNbMF0tPmdldERpc3RUeXBlKCkgPT09ICdwYXRoJykgewokdHJhbnNwb3J0T3B0aW9ucyA9ICRuZXh0UmVwb1BhY2thZ2VzWzBdLT5nZXRUcmFuc3BvcnRPcHRpb25zKCk7CmlmICghaXNzZXQoJHRyYW5zcG9ydE9wdGlvbnNbJ3N5bWxpbmsnXSkgfHwgJHRyYW5zcG9ydE9wdGlvbnNbJ3N5bWxpbmsnXSAhPT0gZmFsc2UpIHsKJHN1Z2dlc3Rpb24gPSAnTWFrZSBzdXJlIHlvdSBmaXggdGhlICcuJHJlYXNvbi4nIGFzIHBhY2thZ2VzIGluc3RhbGxlZCBmcm9tIHN5bWxpbmtlZCBwYXRoIHJlcG9zIGFyZSB1cGRhdGVkIGV2ZW4gaW4gcGFydGlhbCB1cGRhdGVzIGFuZCB0aGUgb25lIGZyb20gdGhlIGxvY2sgZmlsZSBjYW4gdGh1cyBub3QgYmUgdXNlZC4nOwp9Cn0KCnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLAonZm91bmQgJyAuIHNlbGY6OmdldFBhY2thZ2VMaXN0KCRoaWdoZXJSZXBvUGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBidXQgJyAuICgkc2luZ3VsYXIgPyAnaXQgZG9lcycgOiAndGhlc2UgZG8nKSAuICcgbm90IG1hdGNoIHlvdXIgJy4kcmVhc29uLicgYW5kICcgLiAoJHNpbmd1bGFyID8gJ2lzJyA6ICdhcmUnKSAuICcgdGhlcmVmb3JlIG5vdCBpbnN0YWxsYWJsZS4gJy4kc3VnZ2VzdGlvbiwKXTsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsIGl0IGlzICcsICdzYXRpc2ZpYWJsZSBieSAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRuZXh0UmVwb1BhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgZnJvbSAnLiRuZXh0UmVwby0+Z2V0UmVwb05hbWUoKS4nIGJ1dCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRoaWdoZXJSZXBvUGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBmcm9tICcucmVzZXQoJGhpZ2hlclJlcG9QYWNrYWdlcyktPmdldFJlcG9zaXRvcnkoKS0+Z2V0UmVwb05hbWUoKS4nIGhhcyBoaWdoZXIgcmVwb3NpdG9yeSBwcmlvcml0eS4gVGhlIHBhY2thZ2VzIGZyb20gdGhlIGhpZ2hlciBwcmlvcml0eSByZXBvc2l0b3J5IGRvIG5vdCBtYXRjaCB5b3VyICcuJHJlYXNvbi4nIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBpbnN0YWxsYWJsZS4gVGhhdCByZXBvc2l0b3J5IGlzIGNhbm9uaWNhbCBzbyB0aGUgbG93ZXIgcHJpb3JpdHkgcmVwb1wncyBwYWNrYWdlcyBhcmUgbm90IGluc3RhbGxhYmxlLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvcmVwb3ByaW8gZm9yIGRldGFpbHMgYW5kIGFzc2lzdGFuY2UuJ107Cn0KCgoKCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gY29uc3RyYWludFRvVGV4dCg/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwpOiBzdHJpbmcKewppZiAoJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50ICYmICRjb25zdHJhaW50LT5nZXRPcGVyYXRvcigpID09PSBDb25zdHJhaW50OjpTVFJfT1BfRVEgJiYgIXN0cl9zdGFydHNfd2l0aCgkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpLCAnZGV2LScpKSB7CmlmICghUHJlZzo6aXNNYXRjaCgne15cZCsoPzpcLlxkKykqJH0nLCAkY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCkpKSB7CnJldHVybiAnICcuJGNvbnN0cmFpbnQtPmdldFByZXR0eVN0cmluZygpIC4nIChleGFjdCB2ZXJzaW9uIG1hdGNoKSc7Cn0KCiR2ZXJzaW9ucyA9IFskY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCldOwpmb3IgKCRpID0gMyAtIHN1YnN0cl9jb3VudCgkdmVyc2lvbnNbMF0sICcuJyk7ICRpID4gMDsgJGktLSkgewokdmVyc2lvbnNbXSA9IGVuZCgkdmVyc2lvbnMpIC4gJy4wJzsKfQoKcmV0dXJuICcgJyAuICRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSAuICcgKGV4YWN0IHZlcnNpb24gbWF0Y2g6ICcgLiAoY291bnQoJHZlcnNpb25zKSA+IDEgPyBpbXBsb2RlKCcsICcsIGFycmF5X3NsaWNlKCR2ZXJzaW9ucywgMCwgLTEpKSAuICcgb3IgJyAuIGVuZCgkdmVyc2lvbnMpIDogJHZlcnNpb25zWzBdKSAuICcpJzsKfQoKcmV0dXJuICRjb25zdHJhaW50ICE9PSBudWxsID8gJyAnLiRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSA6ICcnOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRQcm92aWRlcnNMaXN0KFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsIHN0cmluZyAkcGFja2FnZU5hbWUsIGludCAkbWF4UHJvdmlkZXJzKTogP3N0cmluZwp7CiRwcm92aWRlcnMgPSAkcmVwb3NpdG9yeVNldC0+Z2V0UHJvdmlkZXJzKCRwYWNrYWdlTmFtZSk7CmlmIChcY291bnQoJHByb3ZpZGVycykgPiAwKSB7CiRwcm92aWRlcnNTdHIgPSBpbXBsb2RlKGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRwKTogc3RyaW5nIHsKJGRlc2NyaXB0aW9uID0gJHBbJ2Rlc2NyaXB0aW9uJ10gIT09ICcnICYmICRwWydkZXNjcmlwdGlvbiddICE9PSBudWxsID8gJyAnLnN1YnN0cigkcFsnZGVzY3JpcHRpb24nXSwgMCwgMTAwKSA6ICcnOwoKcmV0dXJuICcgICAgICAtICcuJHBbJ25hbWUnXS4kZGVzY3JpcHRpb24uIlxuIjsKfSwgY291bnQoJHByb3ZpZGVycykgPiAkbWF4UHJvdmlkZXJzICsgMSA/IGFycmF5X3NsaWNlKCRwcm92aWRlcnMsIDAsICRtYXhQcm92aWRlcnMpIDogJHByb3ZpZGVycykpOwppZiAoY291bnQoJHByb3ZpZGVycykgPiAkbWF4UHJvdmlkZXJzICsgMSkgewokcHJvdmlkZXJzU3RyIC49ICcgICAgICAuLi4gYW5kICcuKGNvdW50KCRwcm92aWRlcnMpIC0gJG1heFByb3ZpZGVycykuJyBtb3JlLicuIlxuIjsKfQoKcmV0dXJuICRwcm92aWRlcnNTdHI7Cn0KCnJldHVybiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxMb2NrQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKCgoKCmNsYXNzIFJlcXVlc3QKewoKCgpwdWJsaWMgY29uc3QgVVBEQVRFX09OTFlfTElTVEVEID0gMDsKCgoKCgpwdWJsaWMgY29uc3QgVVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQU19OT19ST09UX1JFUVVJUkUgPSAxOwoKCgoKCnB1YmxpYyBjb25zdCBVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTID0gMjsKCgpwcm90ZWN0ZWQgJGxvY2tlZFJlcG9zaXRvcnk7Cgpwcm90ZWN0ZWQgJHJlcXVpcmVzID0gW107Cgpwcm90ZWN0ZWQgJGZpeGVkUGFja2FnZXMgPSBbXTsKCnByb3RlY3RlZCAkbG9ja2VkUGFja2FnZXMgPSBbXTsKCnByb3RlY3RlZCAkZml4ZWRMb2NrZWRQYWNrYWdlcyA9IFtdOwoKcHJvdGVjdGVkICR1cGRhdGVBbGxvd0xpc3QgPSBbXTsKCnByb3RlY3RlZCAkdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gZmFsc2U7Cgpwcml2YXRlICRyZXN0cmljdGVkUGFja2FnZXMgPSBudWxsOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9Mb2NrQXJyYXlSZXBvc2l0b3J5ICRsb2NrZWRSZXBvc2l0b3J5ID0gbnVsbCkKewokdGhpcy0+bG9ja2VkUmVwb3NpdG9yeSA9ICRsb2NrZWRSZXBvc2l0b3J5Owp9CgpwdWJsaWMgZnVuY3Rpb24gcmVxdWlyZU5hbWUoc3RyaW5nICRwYWNrYWdlTmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsKTogdm9pZAp7CiRwYWNrYWdlTmFtZSA9IHN0cnRvbG93ZXIoJHBhY2thZ2VOYW1lKTsKCmlmICgkY29uc3RyYWludCA9PT0gbnVsbCkgewokY29uc3RyYWludCA9IG5ldyBNYXRjaEFsbENvbnN0cmFpbnQoKTsKfQppZiAoaXNzZXQoJHRoaXMtPnJlcXVpcmVzWyRwYWNrYWdlTmFtZV0pKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ092ZXJ3cml0aW5nIHJlcXVpcmVzIHNlZW1zIGxpa2UgYSBidWcgKCcuJHBhY2thZ2VOYW1lLicgJy4kdGhpcy0+cmVxdWlyZXNbJHBhY2thZ2VOYW1lXS0+Z2V0UHJldHR5U3RyaW5nKCkuJyA9PiAnLiRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKS4nLCBjaGVjayB3aHkgaXQgaXMgaGFwcGVuaW5nLCBtaWdodCBiZSBhIHJvb3QgYWxpYXMnKTsKfQokdGhpcy0+cmVxdWlyZXNbJHBhY2thZ2VOYW1lXSA9ICRjb25zdHJhaW50Owp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZml4UGFja2FnZShCYXNlUGFja2FnZSAkcGFja2FnZSk6IHZvaWQKewokdGhpcy0+Zml4ZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvY2tQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogdm9pZAp7CiR0aGlzLT5sb2NrZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpeExvY2tlZFBhY2thZ2UoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiB2b2lkCnsKJHRoaXMtPmZpeGVkUGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKJHRoaXMtPmZpeGVkTG9ja2VkUGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKfQoKcHVibGljIGZ1bmN0aW9uIHVubG9ja1BhY2thZ2UoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiB2b2lkCnsKdW5zZXQoJHRoaXMtPmxvY2tlZFBhY2thZ2VzW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVcGRhdGVBbGxvd0xpc3QoYXJyYXkgJHVwZGF0ZUFsbG93TGlzdCwgJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyk6IHZvaWQKewokdGhpcy0+dXBkYXRlQWxsb3dMaXN0ID0gJHVwZGF0ZUFsbG93TGlzdDsKJHRoaXMtPnVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9ICR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcGRhdGVBbGxvd0xpc3QoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnVwZGF0ZUFsbG93TGlzdDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcygpOiBib29sCnsKcmV0dXJuICR0aGlzLT51cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgIT09IHNlbGY6OlVQREFURV9PTkxZX0xJU1RFRDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZVJvb3REZXBlbmRlbmNpZXMoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+dXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID09PSBzZWxmOjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVxdWlyZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcXVpcmVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rml4ZWRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Zml4ZWRQYWNrYWdlczsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRml4ZWRQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogYm9vbAp7CnJldHVybiBpc3NldCgkdGhpcy0+Zml4ZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NrZWRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+bG9ja2VkUGFja2FnZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0xvY2tlZFBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGJvb2wKewpyZXR1cm4gaXNzZXQoJHRoaXMtPmxvY2tlZFBhY2thZ2VzW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKSB8fCBpc3NldCgkdGhpcy0+Zml4ZWRMb2NrZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaXhlZE9yTG9ja2VkUGFja2FnZXMoKTogYXJyYXkKewpyZXR1cm4gYXJyYXlfbWVyZ2UoJHRoaXMtPmZpeGVkUGFja2FnZXMsICR0aGlzLT5sb2NrZWRQYWNrYWdlcyk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXNlbnRNYXAoYm9vbCAkcGFja2FnZUlkcyA9IGZhbHNlKTogYXJyYXkKewokcHJlc2VudE1hcCA9IFtdOwoKaWYgKCR0aGlzLT5sb2NrZWRSZXBvc2l0b3J5ICE9PSBudWxsKSB7CmZvcmVhY2ggKCR0aGlzLT5sb2NrZWRSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRwcmVzZW50TWFwWyRwYWNrYWdlSWRzID8gJHBhY2thZ2UtPmdldElkKCkgOiBzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9Cn0KCmZvcmVhY2ggKCR0aGlzLT5maXhlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRwcmVzZW50TWFwWyRwYWNrYWdlSWRzID8gJHBhY2thZ2UtPmdldElkKCkgOiBzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9CgpyZXR1cm4gJHByZXNlbnRNYXA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaXhlZFBhY2thZ2VzTWFwKCk6IGFycmF5CnsKJGZpeGVkUGFja2FnZXNNYXAgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5maXhlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRmaXhlZFBhY2thZ2VzTWFwWyRwYWNrYWdlLT5nZXRJZCgpXSA9ICRwYWNrYWdlOwp9CgpyZXR1cm4gJGZpeGVkUGFja2FnZXNNYXA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NrZWRSZXBvc2l0b3J5KCk6ID9Mb2NrQXJyYXlSZXBvc2l0b3J5CnsKcmV0dXJuICR0aGlzLT5sb2NrZWRSZXBvc2l0b3J5Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXN0cmljdFBhY2thZ2VzKGFycmF5ICRuYW1lcyk6IHZvaWQKewokdGhpcy0+cmVzdHJpY3RlZFBhY2thZ2VzID0gJG5hbWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzdHJpY3RlZFBhY2thZ2VzKCk6ID9hcnJheQp7CnJldHVybiAkdGhpcy0+cmVzdHJpY3RlZFBhY2thZ2VzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CgoKCgoKCmFic3RyYWN0IGNsYXNzIFJ1bGUKewoKcHVibGljIGNvbnN0IFJVTEVfUk9PVF9SRVFVSVJFID0gMjsgCnB1YmxpYyBjb25zdCBSVUxFX0ZJWEVEID0gMzsgCnB1YmxpYyBjb25zdCBSVUxFX1BBQ0tBR0VfQ09ORkxJQ1QgPSA2OyAKcHVibGljIGNvbnN0IFJVTEVfUEFDS0FHRV9SRVFVSVJFUyA9IDc7IApwdWJsaWMgY29uc3QgUlVMRV9QQUNLQUdFX1NBTUVfTkFNRSA9IDEwOyAKcHVibGljIGNvbnN0IFJVTEVfTEVBUk5FRCA9IDEyOyAKcHVibGljIGNvbnN0IFJVTEVfUEFDS0FHRV9BTElBUyA9IDEzOyAKcHVibGljIGNvbnN0IFJVTEVfUEFDS0FHRV9JTlZFUlNFX0FMSUFTID0gMTQ7IAoKCnByaXZhdGUgY29uc3QgQklURklFTERfVFlQRSA9IDA7CnByaXZhdGUgY29uc3QgQklURklFTERfUkVBU09OID0gODsKcHJpdmF0ZSBjb25zdCBCSVRGSUVMRF9ESVNBQkxFRCA9IDE2OwoKCnByb3RlY3RlZCAkYml0ZmllbGQ7Cgpwcm90ZWN0ZWQgJHJlcXVlc3Q7CgoKCgpwcm90ZWN0ZWQgJHJlYXNvbkRhdGE7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHJlYXNvbiwgJHJlYXNvbkRhdGEpCnsKJHRoaXMtPnJlYXNvbkRhdGEgPSAkcmVhc29uRGF0YTsKCiR0aGlzLT5iaXRmaWVsZCA9ICgwIDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKSB8CigkcmVhc29uIDw8IHNlbGY6OkJJVEZJRUxEX1JFQVNPTikgfAooMjU1IDw8IHNlbGY6OkJJVEZJRUxEX1RZUEUpOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0TGl0ZXJhbHMoKTogYXJyYXk7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaCgpOwoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nOwoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhSdWxlICRydWxlKTogYm9vbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWFzb24oKTogaW50CnsKcmV0dXJuICgkdGhpcy0+Yml0ZmllbGQgJiAoMjU1IDw8IHNlbGY6OkJJVEZJRUxEX1JFQVNPTikpID4+IHNlbGY6OkJJVEZJRUxEX1JFQVNPTjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlYXNvbkRhdGEoKQp7CnJldHVybiAkdGhpcy0+cmVhc29uRGF0YTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcXVpcmVkUGFja2FnZSgpOiA/c3RyaW5nCnsKc3dpdGNoICgkdGhpcy0+Z2V0UmVhc29uKCkpIHsKY2FzZSBzZWxmOjpSVUxFX1JPT1RfUkVRVUlSRToKcmV0dXJuICR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2VOYW1lJ107CmNhc2Ugc2VsZjo6UlVMRV9GSVhFRDoKcmV0dXJuICR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2UnXS0+Z2V0TmFtZSgpOwpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUzoKcmV0dXJuICR0aGlzLT5nZXRSZWFzb25EYXRhKCktPmdldFRhcmdldCgpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFR5cGUoJHR5cGUpOiB2b2lkCnsKJHRoaXMtPmJpdGZpZWxkID0gKCR0aGlzLT5iaXRmaWVsZCAmIH4oMjU1IDw8IHNlbGY6OkJJVEZJRUxEX1RZUEUpKSB8ICgoMjU1ICYgJHR5cGUpIDw8IHNlbGY6OkJJVEZJRUxEX1RZUEUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpOiBpbnQKewpyZXR1cm4gKCR0aGlzLT5iaXRmaWVsZCAmICgyNTUgPDwgc2VsZjo6QklURklFTERfVFlQRSkpID4+IHNlbGY6OkJJVEZJRUxEX1RZUEU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBkaXNhYmxlKCk6IHZvaWQKewokdGhpcy0+Yml0ZmllbGQgPSAoJHRoaXMtPmJpdGZpZWxkICYgfigyNTUgPDwgc2VsZjo6QklURklFTERfRElTQUJMRUQpKSB8ICgxIDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKTsKfQoKcHVibGljIGZ1bmN0aW9uIGVuYWJsZSgpOiB2b2lkCnsKJHRoaXMtPmJpdGZpZWxkICY9IH4oMjU1IDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRGlzYWJsZWQoKTogYm9vbAp7CnJldHVybiAwICE9PSAoKCR0aGlzLT5iaXRmaWVsZCAmICgyNTUgPDwgc2VsZjo6QklURklFTERfRElTQUJMRUQpKSA+PiBzZWxmOjpCSVRGSUVMRF9ESVNBQkxFRCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0VuYWJsZWQoKTogYm9vbAp7CnJldHVybiAwID09PSAoKCR0aGlzLT5iaXRmaWVsZCAmICgyNTUgPDwgc2VsZjo6QklURklFTERfRElTQUJMRUQpKSA+PiBzZWxmOjpCSVRGSUVMRF9ESVNBQkxFRCk7Cn0KCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBpc0Fzc2VydGlvbigpOiBib29sOwoKcHVibGljIGZ1bmN0aW9uIGlzQ2F1c2VkQnlMb2NrKFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsIFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wpOiBib29sCnsKaWYgKCR0aGlzLT5nZXRSZWFzb24oKSA9PT0gc2VsZjo6UlVMRV9QQUNLQUdFX1JFUVVJUkVTKSB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCR0aGlzLT5nZXRSZWFzb25EYXRhKCktPmdldFRhcmdldCgpKSkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCRyZXF1ZXN0LT5nZXRMb2NrZWRSZXBvc2l0b3J5KCkgIT09IG51bGwpIHsKZm9yZWFjaCAoJHJlcXVlc3QtPmdldExvY2tlZFJlcG9zaXRvcnkoKS0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UtPmdldE5hbWUoKSA9PT0gJHRoaXMtPmdldFJlYXNvbkRhdGEoKS0+Z2V0VGFyZ2V0KCkpIHsKaWYgKCRwb29sLT5pc1VuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gdHJ1ZTsKfQppZiAoISR0aGlzLT5nZXRSZWFzb25EYXRhKCktPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCEkcmVxdWVzdC0+aXNMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gdHJ1ZTsKfQpicmVhazsKfQp9Cn0KfQoKaWYgKCR0aGlzLT5nZXRSZWFzb24oKSA9PT0gc2VsZjo6UlVMRV9ST09UX1JFUVVJUkUpIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHRoaXMtPmdldFJlYXNvbkRhdGEoKVsncGFja2FnZU5hbWUnXSkpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgkcmVxdWVzdC0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpICE9PSBudWxsKSB7CmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRMb2NrZWRSZXBvc2l0b3J5KCktPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgPT09ICR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2VOYW1lJ10pIHsKaWYgKCRwb29sLT5pc1VuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gdHJ1ZTsKfQppZiAoISR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ2NvbnN0cmFpbnQnXS0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSkgewpyZXR1cm4gdHJ1ZTsKfQpicmVhazsKfQp9Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlUGFja2FnZShQb29sICRwb29sKTogQmFzZVBhY2thZ2UKewokbGl0ZXJhbHMgPSAkdGhpcy0+Z2V0TGl0ZXJhbHMoKTsKCnN3aXRjaCAoJHRoaXMtPmdldFJlYXNvbigpKSB7CmNhc2Ugc2VsZjo6UlVMRV9QQUNLQUdFX0NPTkZMSUNUOgokcGFja2FnZTEgPSAkdGhpcy0+ZGVkdXBsaWNhdGVEZWZhdWx0QnJhbmNoQWxpYXMoJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWxzWzBdKSk7CiRwYWNrYWdlMiA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMV0pKTsKCiRyZWFzb25EYXRhID0gJHRoaXMtPmdldFJlYXNvbkRhdGEoKTsKCmlmICgkcmVhc29uRGF0YS0+Z2V0U291cmNlKCkgPT09ICRwYWNrYWdlMS0+Z2V0TmFtZSgpKSB7ClskcGFja2FnZTIsICRwYWNrYWdlMV0gPSBbJHBhY2thZ2UxLCAkcGFja2FnZTJdOwp9CgpyZXR1cm4gJHBhY2thZ2UyOwoKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfUkVRVUlSRVM6CiRzb3VyY2VMaXRlcmFsID0gJGxpdGVyYWxzWzBdOwokc291cmNlUGFja2FnZSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkc291cmNlTGl0ZXJhbCkpOwoKcmV0dXJuICRzb3VyY2VQYWNrYWdlOwoKZGVmYXVsdDoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignTm90IGltcGxlbWVudGVkJyk7Cn0KfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCwgYm9vbCAkaXNWZXJib3NlLCBhcnJheSAkaW5zdGFsbGVkTWFwID0gW10sIGFycmF5ICRsZWFybmVkUG9vbCA9IFtdKTogc3RyaW5nCnsKJGxpdGVyYWxzID0gJHRoaXMtPmdldExpdGVyYWxzKCk7Cgpzd2l0Y2ggKCR0aGlzLT5nZXRSZWFzb24oKSkgewpjYXNlIHNlbGY6OlJVTEVfUk9PVF9SRVFVSVJFOgokcmVhc29uRGF0YSA9ICR0aGlzLT5nZXRSZWFzb25EYXRhKCk7CiRwYWNrYWdlTmFtZSA9ICRyZWFzb25EYXRhWydwYWNrYWdlTmFtZSddOwokY29uc3RyYWludCA9ICRyZWFzb25EYXRhWydjb25zdHJhaW50J107CgokcGFja2FnZXMgPSAkcG9vbC0+d2hhdFByb3ZpZGVzKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpOwppZiAoMCA9PT0gXGNvdW50KCRwYWNrYWdlcykpIHsKcmV0dXJuICdObyBwYWNrYWdlIGZvdW5kIHRvIHNhdGlzZnkgcm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmUgJy4kcGFja2FnZU5hbWUuJyAnLiRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKTsKfQoKJHBhY2thZ2VzTm9uQWxpYXMgPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkcCk6IGJvb2wgewpyZXR1cm4gISgkcCBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSk7Cn0pKTsKaWYgKFxjb3VudCgkcGFja2FnZXNOb25BbGlhcykgPT09IDEpIHsKJHBhY2thZ2UgPSAkcGFja2FnZXNOb25BbGlhc1swXTsKaWYgKCRyZXF1ZXN0LT5pc0xvY2tlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CnJldHVybiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaXMgbG9ja2VkIHRvIHZlcnNpb24gJy4kcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLiIgYW5kIGFuIHVwZGF0ZSBvZiB0aGlzIHBhY2thZ2Ugd2FzIG5vdCByZXF1ZXN0ZWQuIjsKfQp9CgpyZXR1cm4gJ1Jvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAnLiRwYWNrYWdlTmFtZS4nICcuJGNvbnN0cmFpbnQtPmdldFByZXR0eVN0cmluZygpLicgLT4gc2F0aXNmaWFibGUgYnkgJy4kdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJGNvbnN0cmFpbnQpLicuJzsKCmNhc2Ugc2VsZjo6UlVMRV9GSVhFRDoKJHBhY2thZ2UgPSAkdGhpcy0+ZGVkdXBsaWNhdGVEZWZhdWx0QnJhbmNoQWxpYXMoJHRoaXMtPmdldFJlYXNvbkRhdGEoKVsncGFja2FnZSddKTsKCmlmICgkcmVxdWVzdC0+aXNMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGlzIGxvY2tlZCB0byB2ZXJzaW9uICcuJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4nIGFuZCBhbiB1cGRhdGUgb2YgdGhpcyBwYWNrYWdlIHdhcyBub3QgcmVxdWVzdGVkLic7Cn0KCnJldHVybiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaXMgcHJlc2VudCBhdCB2ZXJzaW9uICcuJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSAuICcgYW5kIGNhbm5vdCBiZSBtb2RpZmllZCBieSBDb21wb3Nlcic7CgpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9DT05GTElDVDoKJHBhY2thZ2UxID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1swXSkpOwokcGFja2FnZTIgPSAkdGhpcy0+ZGVkdXBsaWNhdGVEZWZhdWx0QnJhbmNoQWxpYXMoJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWxzWzFdKSk7CgokY29uZmxpY3RUYXJnZXQgPSAkcGFja2FnZTEtPmdldFByZXR0eVN0cmluZygpOwokcmVhc29uRGF0YSA9ICR0aGlzLT5nZXRSZWFzb25EYXRhKCk7CgoKaWYgKCRyZWFzb25EYXRhLT5nZXRTb3VyY2UoKSA9PT0gJHBhY2thZ2UxLT5nZXROYW1lKCkpIHsKWyRwYWNrYWdlMiwgJHBhY2thZ2UxXSA9IFskcGFja2FnZTEsICRwYWNrYWdlMl07CiRjb25mbGljdFRhcmdldCA9ICRwYWNrYWdlMS0+Z2V0UHJldHR5TmFtZSgpLicgJy4kcmVhc29uRGF0YS0+Z2V0UHJldHR5Q29uc3RyYWludCgpOwp9CgoKCmlmICgkcmVhc29uRGF0YS0+Z2V0VGFyZ2V0KCkgIT09ICRwYWNrYWdlMS0+Z2V0TmFtZSgpKSB7CiRwcm92aWRlVHlwZSA9IG51bGw7CiRwcm92aWRlZCA9IG51bGw7CmZvcmVhY2ggKCRwYWNrYWdlMS0+Z2V0UHJvdmlkZXMoKSBhcyAkcHJvdmlkZSkgewppZiAoJHByb3ZpZGUtPmdldFRhcmdldCgpID09PSAkcmVhc29uRGF0YS0+Z2V0VGFyZ2V0KCkpIHsKJHByb3ZpZGVUeXBlID0gJ3Byb3ZpZGVzJzsKJHByb3ZpZGVkID0gJHByb3ZpZGUtPmdldFByZXR0eUNvbnN0cmFpbnQoKTsKYnJlYWs7Cn0KfQpmb3JlYWNoICgkcGFja2FnZTEtPmdldFJlcGxhY2VzKCkgYXMgJHJlcGxhY2UpIHsKaWYgKCRyZXBsYWNlLT5nZXRUYXJnZXQoKSA9PT0gJHJlYXNvbkRhdGEtPmdldFRhcmdldCgpKSB7CiRwcm92aWRlVHlwZSA9ICdyZXBsYWNlcyc7CiRwcm92aWRlZCA9ICRyZXBsYWNlLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7CmJyZWFrOwp9Cn0KaWYgKG51bGwgIT09ICRwcm92aWRlVHlwZSkgewokY29uZmxpY3RUYXJnZXQgPSAkcmVhc29uRGF0YS0+Z2V0VGFyZ2V0KCkuJyAnLiRyZWFzb25EYXRhLT5nZXRQcmV0dHlDb25zdHJhaW50KCkuJyAoJy4kcGFja2FnZTEtPmdldFByZXR0eVN0cmluZygpLicgJy4kcHJvdmlkZVR5cGUuJyAnLiRyZWFzb25EYXRhLT5nZXRUYXJnZXQoKS4nICcuJHByb3ZpZGVkLicpJzsKfQp9CgpyZXR1cm4gJHBhY2thZ2UyLT5nZXRQcmV0dHlTdHJpbmcoKS4nIGNvbmZsaWN0cyB3aXRoICcuJGNvbmZsaWN0VGFyZ2V0LicuJzsKCmNhc2Ugc2VsZjo6UlVMRV9QQUNLQUdFX1JFUVVJUkVTOgphc3NlcnQoXGNvdW50KCRsaXRlcmFscykgPiAwKTsKJHNvdXJjZUxpdGVyYWwgPSBhcnJheV9zaGlmdCgkbGl0ZXJhbHMpOwokc291cmNlUGFja2FnZSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkc291cmNlTGl0ZXJhbCkpOwokcmVhc29uRGF0YSA9ICR0aGlzLT5nZXRSZWFzb25EYXRhKCk7CgokcmVxdWlyZXMgPSBbXTsKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CiRyZXF1aXJlc1tdID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwp9CgokdGV4dCA9ICRyZWFzb25EYXRhLT5nZXRQcmV0dHlTdHJpbmcoJHNvdXJjZVBhY2thZ2UpOwppZiAoXGNvdW50KCRyZXF1aXJlcykgPiAwKSB7CiR0ZXh0IC49ICcgLT4gc2F0aXNmaWFibGUgYnkgJyAuICR0aGlzLT5mb3JtYXRQYWNrYWdlc1VuaXF1ZSgkcG9vbCwgJHJlcXVpcmVzLCAkaXNWZXJib3NlLCAkcmVhc29uRGF0YS0+Z2V0Q29uc3RyYWludCgpKSAuICcuJzsKfSBlbHNlIHsKJHRhcmdldE5hbWUgPSAkcmVhc29uRGF0YS0+Z2V0VGFyZ2V0KCk7CgokcmVhc29uID0gUHJvYmxlbTo6Z2V0TWlzc2luZ1BhY2thZ2VSZWFzb24oJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCwgJGlzVmVyYm9zZSwgJHRhcmdldE5hbWUsICRyZWFzb25EYXRhLT5nZXRDb25zdHJhaW50KCkpOwoKcmV0dXJuICR0ZXh0IC4gJyAtPiAnIC4gJHJlYXNvblsxXTsKfQoKcmV0dXJuICR0ZXh0OwoKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfU0FNRV9OQU1FOgokcGFja2FnZU5hbWVzID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewokcGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKJHBhY2thZ2VOYW1lc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9IHRydWU7Cn0KdW5zZXQoJGxpdGVyYWwpOwokcmVwbGFjZWROYW1lID0gJHRoaXMtPmdldFJlYXNvbkRhdGEoKTsKCmlmIChcY291bnQoJHBhY2thZ2VOYW1lcykgPiAxKSB7CmlmICghaXNzZXQoJHBhY2thZ2VOYW1lc1skcmVwbGFjZWROYW1lXSkpIHsKJHJlYXNvbiA9ICdUaGV5ICcuKFxjb3VudCgkbGl0ZXJhbHMpID09PSAyID8gJ2JvdGgnIDogJ2FsbCcpLicgcmVwbGFjZSAnLiRyZXBsYWNlZE5hbWUuJyBhbmQgdGh1cyBjYW5ub3QgY29leGlzdC4nOwp9IGVsc2UgewokcmVwbGFjZXJOYW1lcyA9ICRwYWNrYWdlTmFtZXM7CnVuc2V0KCRyZXBsYWNlck5hbWVzWyRyZXBsYWNlZE5hbWVdKTsKJHJlcGxhY2VyTmFtZXMgPSBhcnJheV9rZXlzKCRyZXBsYWNlck5hbWVzKTsKCmlmIChcY291bnQoJHJlcGxhY2VyTmFtZXMpID09PSAxKSB7CiRyZWFzb24gPSAkcmVwbGFjZXJOYW1lc1swXSAuICcgcmVwbGFjZXMgJzsKfSBlbHNlIHsKJHJlYXNvbiA9ICdbJy5pbXBsb2RlKCcsICcsICRyZXBsYWNlck5hbWVzKS4nXSByZXBsYWNlICc7Cn0KJHJlYXNvbiAuPSAkcmVwbGFjZWROYW1lLicgYW5kIHRodXMgY2Fubm90IGNvZXhpc3Qgd2l0aCBpdC4nOwp9CgokaW5zdGFsbGVkUGFja2FnZXMgPSBbXTsKJHJlbW92YWJsZVBhY2thZ2VzID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewppZiAoaXNzZXQoJGluc3RhbGxlZE1hcFthYnMoJGxpdGVyYWwpXSkpIHsKJGluc3RhbGxlZFBhY2thZ2VzW10gPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7Cn0gZWxzZSB7CiRyZW1vdmFibGVQYWNrYWdlc1tdID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwp9Cn0KCmlmIChcY291bnQoJGluc3RhbGxlZFBhY2thZ2VzKSA+IDAgJiYgXGNvdW50KCRyZW1vdmFibGVQYWNrYWdlcykgPiAwKSB7CnJldHVybiAkdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRyZW1vdmFibGVQYWNrYWdlcywgJGlzVmVyYm9zZSwgbnVsbCwgdHJ1ZSkuJyBjYW5ub3QgYmUgaW5zdGFsbGVkIGFzIHRoYXQgd291bGQgcmVxdWlyZSByZW1vdmluZyAnLiR0aGlzLT5mb3JtYXRQYWNrYWdlc1VuaXF1ZSgkcG9vbCwgJGluc3RhbGxlZFBhY2thZ2VzLCAkaXNWZXJib3NlLCBudWxsLCB0cnVlKS4nLiAnLiRyZWFzb247Cn0KCnJldHVybiAnT25seSBvbmUgb2YgdGhlc2UgY2FuIGJlIGluc3RhbGxlZDogJy4kdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRsaXRlcmFscywgJGlzVmVyYm9zZSwgbnVsbCwgdHJ1ZSkuJy4gJy4kcmVhc29uOwp9CgpyZXR1cm4gJ1lvdSBjYW4gb25seSBpbnN0YWxsIG9uZSB2ZXJzaW9uIG9mIGEgcGFja2FnZSwgc28gb25seSBvbmUgb2YgdGhlc2UgY2FuIGJlIGluc3RhbGxlZDogJyAuICR0aGlzLT5mb3JtYXRQYWNrYWdlc1VuaXF1ZSgkcG9vbCwgJGxpdGVyYWxzLCAkaXNWZXJib3NlLCBudWxsLCB0cnVlKSAuICcuJzsKY2FzZSBzZWxmOjpSVUxFX0xFQVJORUQ6CgoKCgoKCgokbGVhcm5lZFN0cmluZyA9ICcgKGNvbmZsaWN0IGFuYWx5c2lzIHJlc3VsdCknOwoKaWYgKFxjb3VudCgkbGl0ZXJhbHMpID09PSAxKSB7CiRydWxlVGV4dCA9ICRwb29sLT5saXRlcmFsVG9QcmV0dHlTdHJpbmcoJGxpdGVyYWxzWzBdLCAkaW5zdGFsbGVkTWFwKTsKfSBlbHNlIHsKJGdyb3VwcyA9IFtdOwpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKJHBhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CmlmIChpc3NldCgkaW5zdGFsbGVkTWFwWyRwYWNrYWdlLT5pZF0pKSB7CiRncm91cCA9ICRsaXRlcmFsID4gMCA/ICdrZWVwJyA6ICdyZW1vdmUnOwp9IGVsc2UgewokZ3JvdXAgPSAkbGl0ZXJhbCA+IDAgPyAnaW5zdGFsbCcgOiAnZG9uXCd0IGluc3RhbGwnOwp9CgokZ3JvdXBzWyRncm91cF1bXSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcGFja2FnZSk7Cn0KJHJ1bGVUZXh0cyA9IFtdOwpmb3JlYWNoICgkZ3JvdXBzIGFzICRncm91cCA9PiAkcGFja2FnZXMpIHsKJHJ1bGVUZXh0c1tdID0gJGdyb3VwIC4gKFxjb3VudCgkcGFja2FnZXMpID4gMSA/ICcgb25lIG9mJyA6ICcnKS4nICcgLiAkdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRwYWNrYWdlcywgJGlzVmVyYm9zZSk7Cn0KCiRydWxlVGV4dCA9IGltcGxvZGUoJyB8ICcsICRydWxlVGV4dHMpOwp9CgpyZXR1cm4gJ0NvbmNsdXNpb246ICcuJHJ1bGVUZXh0LiRsZWFybmVkU3RyaW5nOwpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9BTElBUzoKJGFsaWFzUGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1swXSk7CgoKaWYgKCRhbGlhc1BhY2thZ2UtPmdldFZlcnNpb24oKSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKcmV0dXJuICcnOwp9CiRwYWNrYWdlID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1sxXSkpOwoKcmV0dXJuICRhbGlhc1BhY2thZ2UtPmdldFByZXR0eVN0cmluZygpIC4nIGlzIGFuIGFsaWFzIG9mICcuJHBhY2thZ2UtPmdldFByZXR0eVN0cmluZygpLicgYW5kIHRodXMgcmVxdWlyZXMgaXQgdG8gYmUgaW5zdGFsbGVkIHRvby4nOwpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9JTlZFUlNFX0FMSUFTOgoKJGFsaWFzUGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1sxXSk7CgoKaWYgKCRhbGlhc1BhY2thZ2UtPmdldFZlcnNpb24oKSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKcmV0dXJuICcnOwp9CiRwYWNrYWdlID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1swXSkpOwoKcmV0dXJuICRhbGlhc1BhY2thZ2UtPmdldFByZXR0eVN0cmluZygpIC4nIGlzIGFuIGFsaWFzIG9mICcuJHBhY2thZ2UtPmdldFByZXR0eVN0cmluZygpLicgYW5kIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggaXQuJzsKZGVmYXVsdDoKJHJ1bGVUZXh0ID0gJyc7CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkaSA9PiAkbGl0ZXJhbCkgewppZiAoJGkgIT09IDApIHsKJHJ1bGVUZXh0IC49ICd8JzsKfQokcnVsZVRleHQgLj0gJHBvb2wtPmxpdGVyYWxUb1ByZXR0eVN0cmluZygkbGl0ZXJhbCwgJGluc3RhbGxlZE1hcCk7Cn0KCnJldHVybiAnKCcuJHJ1bGVUZXh0LicpJzsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZm9ybWF0UGFja2FnZXNVbmlxdWUoUG9vbCAkcG9vbCwgYXJyYXkgJGxpdGVyYWxzT3JQYWNrYWdlcywgYm9vbCAkaXNWZXJib3NlLCA/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwsIGJvb2wgJHVzZVJlbW92ZWRWZXJzaW9uR3JvdXAgPSBmYWxzZSk6IHN0cmluZwp7CiRwYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkbGl0ZXJhbHNPclBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRwYWNrYWdlc1tdID0gXGlzX29iamVjdCgkcGFja2FnZSkgPyAkcGFja2FnZSA6ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRwYWNrYWdlKTsKfQoKcmV0dXJuIFByb2JsZW06OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50LCAkdXNlUmVtb3ZlZFZlcnNpb25Hcm91cCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZGVkdXBsaWNhdGVEZWZhdWx0QnJhbmNoQWxpYXMoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiBCYXNlUGFja2FnZQp7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCnJldHVybiAkcGFja2FnZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7CgoKCgoKY2xhc3MgUnVsZTJMaXRlcmFscyBleHRlbmRzIFJ1bGUKewoKcHJvdGVjdGVkICRsaXRlcmFsMTsKCnByb3RlY3RlZCAkbGl0ZXJhbDI7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRsaXRlcmFsMSwgaW50ICRsaXRlcmFsMiwgJHJlYXNvbiwgJHJlYXNvbkRhdGEpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkcmVhc29uLCAkcmVhc29uRGF0YSk7CgppZiAoJGxpdGVyYWwxIDwgJGxpdGVyYWwyKSB7CiR0aGlzLT5saXRlcmFsMSA9ICRsaXRlcmFsMTsKJHRoaXMtPmxpdGVyYWwyID0gJGxpdGVyYWwyOwp9IGVsc2UgewokdGhpcy0+bGl0ZXJhbDEgPSAkbGl0ZXJhbDI7CiR0aGlzLT5saXRlcmFsMiA9ICRsaXRlcmFsMTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGl0ZXJhbHMoKTogYXJyYXkKewpyZXR1cm4gWyR0aGlzLT5saXRlcmFsMSwgJHRoaXMtPmxpdGVyYWwyXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhhc2goKQp7CnJldHVybiAkdGhpcy0+bGl0ZXJhbDEuJywnLiR0aGlzLT5saXRlcmFsMjsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKFJ1bGUgJHJ1bGUpOiBib29sCnsKCmlmICgkcnVsZSBpbnN0YW5jZW9mIHNlbGYpIHsKaWYgKCR0aGlzLT5saXRlcmFsMSAhPT0gJHJ1bGUtPmxpdGVyYWwxKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5saXRlcmFsMiAhPT0gJHJ1bGUtPmxpdGVyYWwyKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCiRsaXRlcmFscyA9ICRydWxlLT5nZXRMaXRlcmFscygpOwppZiAoMiAhPT0gXGNvdW50KCRsaXRlcmFscykpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmxpdGVyYWwxICE9PSAkbGl0ZXJhbHNbMF0pIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmxpdGVyYWwyICE9PSAkbGl0ZXJhbHNbMV0pIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCnB1YmxpYyBmdW5jdGlvbiBpc0Fzc2VydGlvbigpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewokcmVzdWx0ID0gJHRoaXMtPmlzRGlzYWJsZWQoKSA/ICdkaXNhYmxlZCgnIDogJygnOwoKJHJlc3VsdCAuPSAkdGhpcy0+bGl0ZXJhbDEgLiAnfCcgLiAkdGhpcy0+bGl0ZXJhbDIgLiAnKSc7CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0OwoKCgoKCgoKY2xhc3MgUnVsZVNldCBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZSwgXENvdW50YWJsZQp7CgpwdWJsaWMgY29uc3QgVFlQRV9QQUNLQUdFID0gMDsKcHVibGljIGNvbnN0IFRZUEVfUkVRVUVTVCA9IDE7CnB1YmxpYyBjb25zdCBUWVBFX0xFQVJORUQgPSA0OwoKCgoKCgpwdWJsaWMgJHJ1bGVCeUlkID0gW107Cgpjb25zdCBUWVBFUyA9IFsKc2VsZjo6VFlQRV9QQUNLQUdFID0+ICdQQUNLQUdFJywKc2VsZjo6VFlQRV9SRVFVRVNUID0+ICdSRVFVRVNUJywKc2VsZjo6VFlQRV9MRUFSTkVEID0+ICdMRUFSTkVEJywKXTsKCgpwcm90ZWN0ZWQgJHJ1bGVzOwoKCnByb3RlY3RlZCAkbmV4dFJ1bGVJZCA9IDA7CgoKcHJvdGVjdGVkICRydWxlc0J5SGFzaCA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKewpmb3JlYWNoICgkdGhpcy0+Z2V0VHlwZXMoKSBhcyAkdHlwZSkgewokdGhpcy0+cnVsZXNbJHR5cGVdID0gW107Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZChSdWxlICRydWxlLCAkdHlwZSk6IHZvaWQKewppZiAoIWlzc2V0KHNlbGY6OlRZUEVTWyR0eXBlXSkpIHsKdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignVW5rbm93biBydWxlIHR5cGU6ICcgLiAkdHlwZSk7Cn0KCiRoYXNoID0gJHJ1bGUtPmdldEhhc2goKTsKCgppZiAoaXNzZXQoJHRoaXMtPnJ1bGVzQnlIYXNoWyRoYXNoXSkpIHsKJHBvdGVudGlhbER1cGxpY2F0ZXMgPSAkdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdOwppZiAoXGlzX2FycmF5KCRwb3RlbnRpYWxEdXBsaWNhdGVzKSkgewpmb3JlYWNoICgkcG90ZW50aWFsRHVwbGljYXRlcyBhcyAkcG90ZW50aWFsRHVwbGljYXRlKSB7CmlmICgkcnVsZS0+ZXF1YWxzKCRwb3RlbnRpYWxEdXBsaWNhdGUpKSB7CnJldHVybjsKfQp9Cn0gZWxzZSB7CmlmICgkcnVsZS0+ZXF1YWxzKCRwb3RlbnRpYWxEdXBsaWNhdGVzKSkgewpyZXR1cm47Cn0KfQp9CgppZiAoIWlzc2V0KCR0aGlzLT5ydWxlc1skdHlwZV0pKSB7CiR0aGlzLT5ydWxlc1skdHlwZV0gPSBbXTsKfQoKJHRoaXMtPnJ1bGVzWyR0eXBlXVtdID0gJHJ1bGU7CiR0aGlzLT5ydWxlQnlJZFskdGhpcy0+bmV4dFJ1bGVJZF0gPSAkcnVsZTsKJHJ1bGUtPnNldFR5cGUoJHR5cGUpOwoKJHRoaXMtPm5leHRSdWxlSWQrKzsKCmlmICghaXNzZXQoJHRoaXMtPnJ1bGVzQnlIYXNoWyRoYXNoXSkpIHsKJHRoaXMtPnJ1bGVzQnlIYXNoWyRoYXNoXSA9ICRydWxlOwp9IGVsc2VpZiAoXGlzX2FycmF5KCR0aGlzLT5ydWxlc0J5SGFzaFskaGFzaF0pKSB7CiR0aGlzLT5ydWxlc0J5SGFzaFskaGFzaF1bXSA9ICRydWxlOwp9IGVsc2Ugewokb3JpZ2luYWxSdWxlID0gJHRoaXMtPnJ1bGVzQnlIYXNoWyRoYXNoXTsKJHRoaXMtPnJ1bGVzQnlIYXNoWyRoYXNoXSA9IFskb3JpZ2luYWxSdWxlLCAkcnVsZV07Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAp7CnJldHVybiAkdGhpcy0+bmV4dFJ1bGVJZDsKfQoKcHVibGljIGZ1bmN0aW9uIHJ1bGVCeUlkKGludCAkaWQpOiBSdWxlCnsKcmV0dXJuICR0aGlzLT5ydWxlQnlJZFskaWRdOwp9CgoKcHVibGljIGZ1bmN0aW9uIGdldFJ1bGVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5ydWxlczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKCk6IFJ1bGVTZXRJdGVyYXRvcgp7CnJldHVybiBuZXcgUnVsZVNldEl0ZXJhdG9yKCR0aGlzLT5nZXRSdWxlcygpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yRm9yKCR0eXBlcyk6IFJ1bGVTZXRJdGVyYXRvcgp7CmlmICghXGlzX2FycmF5KCR0eXBlcykpIHsKJHR5cGVzID0gWyR0eXBlc107Cn0KCiRhbGxSdWxlcyA9ICR0aGlzLT5nZXRSdWxlcygpOwoKCiRydWxlcyA9IFtdOwoKZm9yZWFjaCAoJHR5cGVzIGFzICR0eXBlKSB7CiRydWxlc1skdHlwZV0gPSAkYWxsUnVsZXNbJHR5cGVdOwp9CgpyZXR1cm4gbmV3IFJ1bGVTZXRJdGVyYXRvcigkcnVsZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3JXaXRob3V0KCR0eXBlcyk6IFJ1bGVTZXRJdGVyYXRvcgp7CmlmICghXGlzX2FycmF5KCR0eXBlcykpIHsKJHR5cGVzID0gWyR0eXBlc107Cn0KCiRydWxlcyA9ICR0aGlzLT5nZXRSdWxlcygpOwoKZm9yZWFjaCAoJHR5cGVzIGFzICR0eXBlKSB7CnVuc2V0KCRydWxlc1skdHlwZV0pOwp9CgpyZXR1cm4gbmV3IFJ1bGVTZXRJdGVyYXRvcigkcnVsZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZXMoKTogYXJyYXkKewokdHlwZXMgPSBzZWxmOjpUWVBFUzsKCnJldHVybiBhcnJheV9rZXlzKCR0eXBlcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoP1JlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQgPSBudWxsLCA/UmVxdWVzdCAkcmVxdWVzdCA9IG51bGwsID9Qb29sICRwb29sID0gbnVsbCwgYm9vbCAkaXNWZXJib3NlID0gZmFsc2UpOiBzdHJpbmcKewokc3RyaW5nID0gIlxuIjsKZm9yZWFjaCAoJHRoaXMtPnJ1bGVzIGFzICR0eXBlID0+ICRydWxlcykgewokc3RyaW5nIC49IHN0cl9wYWQoc2VsZjo6VFlQRVNbJHR5cGVdLCA4LCAnICcpIC4gIjogIjsKZm9yZWFjaCAoJHJ1bGVzIGFzICRydWxlKSB7CiRzdHJpbmcgLj0gKCRyZXBvc2l0b3J5U2V0ICE9PSBudWxsICYmICRyZXF1ZXN0ICE9PSBudWxsICYmICRwb29sICE9PSBudWxsID8gJHJ1bGUtPmdldFByZXR0eVN0cmluZygkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sLCAkaXNWZXJib3NlKSA6ICRydWxlKS4iXG4iOwp9CiRzdHJpbmcgLj0gIlxuXG4iOwp9CgpyZXR1cm4gJHN0cmluZzsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5nZXRQcmV0dHlTdHJpbmcoKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CgoKCgoKY2xhc3MgUnVsZVNldEdlbmVyYXRvcgp7Cgpwcm90ZWN0ZWQgJHBvbGljeTsKCnByb3RlY3RlZCAkcG9vbDsKCnByb3RlY3RlZCAkcnVsZXM7Cgpwcm90ZWN0ZWQgJGFkZGVkTWFwID0gW107Cgpwcm90ZWN0ZWQgJGFkZGVkUGFja2FnZXNCeU5hbWVzID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUG9saWN5SW50ZXJmYWNlICRwb2xpY3ksIFBvb2wgJHBvb2wpCnsKJHRoaXMtPnBvbGljeSA9ICRwb2xpY3k7CiR0aGlzLT5wb29sID0gJHBvb2w7CiR0aGlzLT5ydWxlcyA9IG5ldyBSdWxlU2V0Owp9CgoKCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVSZXF1aXJlUnVsZShCYXNlUGFja2FnZSAkcGFja2FnZSwgYXJyYXkgJHByb3ZpZGVycywgJHJlYXNvbiwgJHJlYXNvbkRhdGEpOiA/UnVsZQp7CiRsaXRlcmFscyA9IFstJHBhY2thZ2UtPmlkXTsKCmZvcmVhY2ggKCRwcm92aWRlcnMgYXMgJHByb3ZpZGVyKSB7CgppZiAoJHByb3ZpZGVyID09PSAkcGFja2FnZSkgewpyZXR1cm4gbnVsbDsKfQokbGl0ZXJhbHNbXSA9ICRwcm92aWRlci0+aWQ7Cn0KCnJldHVybiBuZXcgR2VuZXJpY1J1bGUoJGxpdGVyYWxzLCAkcmVhc29uLCAkcmVhc29uRGF0YSk7Cn0KCgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbGxPbmVPZlJ1bGUoYXJyYXkgJHBhY2thZ2VzLCAkcmVhc29uLCAkcmVhc29uRGF0YSk6IFJ1bGUKewokbGl0ZXJhbHMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRsaXRlcmFsc1tdID0gJHBhY2thZ2UtPmlkOwp9CgpyZXR1cm4gbmV3IEdlbmVyaWNSdWxlKCRsaXRlcmFscywgJHJlYXNvbiwgJHJlYXNvbkRhdGEpOwp9CgoKCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVSdWxlMkxpdGVyYWxzKEJhc2VQYWNrYWdlICRpc3N1ZXIsIEJhc2VQYWNrYWdlICRwcm92aWRlciwgJHJlYXNvbiwgJHJlYXNvbkRhdGEpOiA/UnVsZQp7CgppZiAoJGlzc3VlciA9PT0gJHByb3ZpZGVyKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gbmV3IFJ1bGUyTGl0ZXJhbHMoLSRpc3N1ZXItPmlkLCAtJHByb3ZpZGVyLT5pZCwgJHJlYXNvbiwgJHJlYXNvbkRhdGEpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZU11bHRpQ29uZmxpY3RSdWxlKGFycmF5ICRwYWNrYWdlcywgJHJlYXNvbiwgJHJlYXNvbkRhdGEpOiBSdWxlCnsKJGxpdGVyYWxzID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokbGl0ZXJhbHNbXSA9IC0kcGFja2FnZS0+aWQ7Cn0KCmlmIChcY291bnQoJGxpdGVyYWxzKSA9PT0gMikgewpyZXR1cm4gbmV3IFJ1bGUyTGl0ZXJhbHMoJGxpdGVyYWxzWzBdLCAkbGl0ZXJhbHNbMV0sICRyZWFzb24sICRyZWFzb25EYXRhKTsKfQoKcmV0dXJuIG5ldyBNdWx0aUNvbmZsaWN0UnVsZSgkbGl0ZXJhbHMsICRyZWFzb24sICRyZWFzb25EYXRhKTsKfQoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhZGRSdWxlKCR0eXBlLCA/UnVsZSAkbmV3UnVsZSA9IG51bGwpOiB2b2lkCnsKaWYgKG51bGwgPT09ICRuZXdSdWxlKSB7CnJldHVybjsKfQoKJHRoaXMtPnJ1bGVzLT5hZGQoJG5ld1J1bGUsICR0eXBlKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZFJ1bGVzRm9yUGFja2FnZShCYXNlUGFja2FnZSAkcGFja2FnZSwgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik6IHZvaWQKewoKJHdvcmtRdWV1ZSA9IG5ldyBcU3BsUXVldWU7CiR3b3JrUXVldWUtPmVucXVldWUoJHBhY2thZ2UpOwoKd2hpbGUgKCEkd29ya1F1ZXVlLT5pc0VtcHR5KCkpIHsKJHBhY2thZ2UgPSAkd29ya1F1ZXVlLT5kZXF1ZXVlKCk7CmlmIChpc3NldCgkdGhpcy0+YWRkZWRNYXBbJHBhY2thZ2UtPmlkXSkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5hZGRlZE1hcFskcGFja2FnZS0+aWRdID0gJHBhY2thZ2U7CgppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcyhmYWxzZSkgYXMgJG5hbWUpIHsKJHRoaXMtPmFkZGVkUGFja2FnZXNCeU5hbWVzWyRuYW1lXVtdID0gJHBhY2thZ2U7Cn0KfSBlbHNlIHsKJHdvcmtRdWV1ZS0+ZW5xdWV1ZSgkcGFja2FnZS0+Z2V0QWxpYXNPZigpKTsKJHRoaXMtPmFkZFJ1bGUoUnVsZVNldDo6VFlQRV9QQUNLQUdFLCAkdGhpcy0+Y3JlYXRlUmVxdWlyZVJ1bGUoJHBhY2thZ2UsIFskcGFja2FnZS0+Z2V0QWxpYXNPZigpXSwgUnVsZTo6UlVMRV9QQUNLQUdFX0FMSUFTLCAkcGFja2FnZSkpOwoKCiR0aGlzLT5hZGRSdWxlKFJ1bGVTZXQ6OlRZUEVfUEFDS0FHRSwgJHRoaXMtPmNyZWF0ZVJlcXVpcmVSdWxlKCRwYWNrYWdlLT5nZXRBbGlhc09mKCksIFskcGFja2FnZV0sIFJ1bGU6OlJVTEVfUEFDS0FHRV9JTlZFUlNFX0FMSUFTLCAkcGFja2FnZS0+Z2V0QWxpYXNPZigpKSk7CgoKCmlmICghJHBhY2thZ2UtPmhhc1NlbGZWZXJzaW9uUmVxdWlyZXMoKSkgewpjb250aW51ZTsKfQp9Cgpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgewokY29uc3RyYWludCA9ICRsaW5rLT5nZXRDb25zdHJhaW50KCk7CmlmICgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+aXNJZ25vcmVkKCRsaW5rLT5nZXRUYXJnZXQoKSkpIHsKY29udGludWU7Cn0gZWxzZWlmICgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKSB7CiRjb25zdHJhaW50ID0gJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmZpbHRlckNvbnN0cmFpbnQoJGxpbmstPmdldFRhcmdldCgpLCAkY29uc3RyYWludCk7Cn0KCiRwb3NzaWJsZVJlcXVpcmVzID0gJHRoaXMtPnBvb2wtPndoYXRQcm92aWRlcygkbGluay0+Z2V0VGFyZ2V0KCksICRjb25zdHJhaW50KTsKCiR0aGlzLT5hZGRSdWxlKFJ1bGVTZXQ6OlRZUEVfUEFDS0FHRSwgJHRoaXMtPmNyZWF0ZVJlcXVpcmVSdWxlKCRwYWNrYWdlLCAkcG9zc2libGVSZXF1aXJlcywgUnVsZTo6UlVMRV9QQUNLQUdFX1JFUVVJUkVTLCAkbGluaykpOwoKZm9yZWFjaCAoJHBvc3NpYmxlUmVxdWlyZXMgYXMgJHJlcXVpcmUpIHsKJHdvcmtRdWV1ZS0+ZW5xdWV1ZSgkcmVxdWlyZSk7Cn0KfQp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBhZGRDb25mbGljdFJ1bGVzKFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOiB2b2lkCnsKCmZvcmVhY2ggKCR0aGlzLT5hZGRlZE1hcCBhcyAkcGFja2FnZSkgewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0Q29uZmxpY3RzKCkgYXMgJGxpbmspIHsKCmlmICghaXNzZXQoJHRoaXMtPmFkZGVkUGFja2FnZXNCeU5hbWVzWyRsaW5rLT5nZXRUYXJnZXQoKV0pKSB7CmNvbnRpbnVlOwp9CgokY29uc3RyYWludCA9ICRsaW5rLT5nZXRDb25zdHJhaW50KCk7CmlmICgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+aXNJZ25vcmVkKCRsaW5rLT5nZXRUYXJnZXQoKSkpIHsKY29udGludWU7Cn0gZWxzZWlmICgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKSB7CiRjb25zdHJhaW50ID0gJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmZpbHRlckNvbnN0cmFpbnQoJGxpbmstPmdldFRhcmdldCgpLCAkY29uc3RyYWludCwgZmFsc2UpOwp9CgokY29uZmxpY3RzID0gJHRoaXMtPnBvb2wtPndoYXRQcm92aWRlcygkbGluay0+Z2V0VGFyZ2V0KCksICRjb25zdHJhaW50KTsKCmZvcmVhY2ggKCRjb25mbGljdHMgYXMgJGNvbmZsaWN0KSB7CgoKCmlmICghJGNvbmZsaWN0IGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlIHx8ICRjb25mbGljdC0+Z2V0TmFtZSgpID09PSAkbGluay0+Z2V0VGFyZ2V0KCkpIHsKJHRoaXMtPmFkZFJ1bGUoUnVsZVNldDo6VFlQRV9QQUNLQUdFLCAkdGhpcy0+Y3JlYXRlUnVsZTJMaXRlcmFscygkcGFja2FnZSwgJGNvbmZsaWN0LCBSdWxlOjpSVUxFX1BBQ0tBR0VfQ09ORkxJQ1QsICRsaW5rKSk7Cn0KfQp9Cn0KCmZvcmVhY2ggKCR0aGlzLT5hZGRlZFBhY2thZ2VzQnlOYW1lcyBhcyAkbmFtZSA9PiAkcGFja2FnZXMpIHsKaWYgKFxjb3VudCgkcGFja2FnZXMpID4gMSkgewokcmVhc29uID0gUnVsZTo6UlVMRV9QQUNLQUdFX1NBTUVfTkFNRTsKJHRoaXMtPmFkZFJ1bGUoUnVsZVNldDo6VFlQRV9QQUNLQUdFLCAkdGhpcy0+Y3JlYXRlTXVsdGlDb25mbGljdFJ1bGUoJHBhY2thZ2VzLCAkcmVhc29uLCAkbmFtZSkpOwp9Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZFJ1bGVzRm9yUmVxdWVzdChSZXF1ZXN0ICRyZXF1ZXN0LCBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTogdm9pZAp7CmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRGaXhlZFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlLT5pZCA9PT0gLTEpIHsKCmlmICgkdGhpcy0+cG9vbC0+aXNVbmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZSgkcGFja2FnZSkpIHsKY29udGludWU7Cn0KCgp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCJGaXhlZCBwYWNrYWdlICIuJHBhY2thZ2UtPmdldFByZXR0eVN0cmluZygpLiIgd2FzIG5vdCBhZGRlZCB0byBzb2x2ZXIgcG9vbC4iKTsKfQoKJHRoaXMtPmFkZFJ1bGVzRm9yUGFja2FnZSgkcGFja2FnZSwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwoKJHJ1bGUgPSAkdGhpcy0+Y3JlYXRlSW5zdGFsbE9uZU9mUnVsZShbJHBhY2thZ2VdLCBSdWxlOjpSVUxFX0ZJWEVELCBbCidwYWNrYWdlJyA9PiAkcGFja2FnZSwKXSk7CiR0aGlzLT5hZGRSdWxlKFJ1bGVTZXQ6OlRZUEVfUkVRVUVTVCwgJHJ1bGUpOwp9Cgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0UmVxdWlyZXMoKSBhcyAkcGFja2FnZU5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJHBhY2thZ2VOYW1lKSkgewpjb250aW51ZTsKfSBlbHNlaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpIHsKJGNvbnN0cmFpbnQgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+ZmlsdGVyQ29uc3RyYWludCgkcGFja2FnZU5hbWUsICRjb25zdHJhaW50KTsKfQoKJHBhY2thZ2VzID0gJHRoaXMtPnBvb2wtPndoYXRQcm92aWRlcygkcGFja2FnZU5hbWUsICRjb25zdHJhaW50KTsKaWYgKFxjb3VudCgkcGFja2FnZXMpID4gMCkgewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHRoaXMtPmFkZFJ1bGVzRm9yUGFja2FnZSgkcGFja2FnZSwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwp9CgokcnVsZSA9ICR0aGlzLT5jcmVhdGVJbnN0YWxsT25lT2ZSdWxlKCRwYWNrYWdlcywgUnVsZTo6UlVMRV9ST09UX1JFUVVJUkUsIFsKJ3BhY2thZ2VOYW1lJyA9PiAkcGFja2FnZU5hbWUsCidjb25zdHJhaW50JyA9PiAkY29uc3RyYWludCwKXSk7CiR0aGlzLT5hZGRSdWxlKFJ1bGVTZXQ6OlRZUEVfUkVRVUVTVCwgJHJ1bGUpOwp9Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZFJ1bGVzRm9yUm9vdEFsaWFzZXMoUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik6IHZvaWQKewpmb3JlYWNoICgkdGhpcy0+cG9vbC0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewoKCgppZiAoIWlzc2V0KCR0aGlzLT5hZGRlZE1hcFskcGFja2FnZS0+aWRdKSAmJgokcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJgooJHBhY2thZ2UtPmlzUm9vdFBhY2thZ2VBbGlhcygpIHx8IGlzc2V0KCR0aGlzLT5hZGRlZE1hcFskcGFja2FnZS0+Z2V0QWxpYXNPZigpLT5pZF0pKQopIHsKJHRoaXMtPmFkZFJ1bGVzRm9yUGFja2FnZSgkcGFja2FnZSwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwp9Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGdldFJ1bGVzRm9yKFJlcXVlc3QgJHJlcXVlc3QsID9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gbnVsbCk6IFJ1bGVTZXQKewokcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID8/IFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVOb3RoaW5nKCk7CgokdGhpcy0+YWRkUnVsZXNGb3JSZXF1ZXN0KCRyZXF1ZXN0LCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CgokdGhpcy0+YWRkUnVsZXNGb3JSb290QWxpYXNlcygkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CgokdGhpcy0+YWRkQ29uZmxpY3RSdWxlcygkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CgoKJHRoaXMtPmFkZGVkTWFwID0gJHRoaXMtPmFkZGVkUGFja2FnZXNCeU5hbWVzID0gW107CgokcnVsZXMgPSAkdGhpcy0+cnVsZXM7CgokdGhpcy0+cnVsZXMgPSBuZXcgUnVsZVNldDsKCnJldHVybiAkcnVsZXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKCgoKCmNsYXNzIFJ1bGVTZXRJdGVyYXRvciBpbXBsZW1lbnRzIFxJdGVyYXRvcgp7Cgpwcm90ZWN0ZWQgJHJ1bGVzOwoKcHJvdGVjdGVkICR0eXBlczsKCgpwcm90ZWN0ZWQgJGN1cnJlbnRPZmZzZXQ7Cgpwcm90ZWN0ZWQgJGN1cnJlbnRUeXBlOwoKcHJvdGVjdGVkICRjdXJyZW50VHlwZU9mZnNldDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcnVsZXMpCnsKJHRoaXMtPnJ1bGVzID0gJHJ1bGVzOwokdGhpcy0+dHlwZXMgPSBhcnJheV9rZXlzKCRydWxlcyk7CnNvcnQoJHRoaXMtPnR5cGVzKTsKCiR0aGlzLT5yZXdpbmQoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGN1cnJlbnQoKTogUnVsZQp7CnJldHVybiAkdGhpcy0+cnVsZXNbJHRoaXMtPmN1cnJlbnRUeXBlXVskdGhpcy0+Y3VycmVudE9mZnNldF07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBrZXkoKTogaW50CnsKcmV0dXJuICR0aGlzLT5jdXJyZW50VHlwZTsKfQoKcHVibGljIGZ1bmN0aW9uIG5leHQoKTogdm9pZAp7CiR0aGlzLT5jdXJyZW50T2Zmc2V0Kys7CgppZiAoIWlzc2V0KCR0aGlzLT5ydWxlc1skdGhpcy0+Y3VycmVudFR5cGVdKSkgewpyZXR1cm47Cn0KCmlmICgkdGhpcy0+Y3VycmVudE9mZnNldCA+PSBcY291bnQoJHRoaXMtPnJ1bGVzWyR0aGlzLT5jdXJyZW50VHlwZV0pKSB7CiR0aGlzLT5jdXJyZW50T2Zmc2V0ID0gMDsKCmRvIHsKJHRoaXMtPmN1cnJlbnRUeXBlT2Zmc2V0Kys7CgppZiAoIWlzc2V0KCR0aGlzLT50eXBlc1skdGhpcy0+Y3VycmVudFR5cGVPZmZzZXRdKSkgewokdGhpcy0+Y3VycmVudFR5cGUgPSAtMTsKYnJlYWs7Cn0KCiR0aGlzLT5jdXJyZW50VHlwZSA9ICR0aGlzLT50eXBlc1skdGhpcy0+Y3VycmVudFR5cGVPZmZzZXRdOwp9IHdoaWxlICgwID09PSBcY291bnQoJHRoaXMtPnJ1bGVzWyR0aGlzLT5jdXJyZW50VHlwZV0pKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gcmV3aW5kKCk6IHZvaWQKewokdGhpcy0+Y3VycmVudE9mZnNldCA9IDA7CgokdGhpcy0+Y3VycmVudFR5cGVPZmZzZXQgPSAtMTsKJHRoaXMtPmN1cnJlbnRUeXBlID0gLTE7CgpkbyB7CiR0aGlzLT5jdXJyZW50VHlwZU9mZnNldCsrOwoKaWYgKCFpc3NldCgkdGhpcy0+dHlwZXNbJHRoaXMtPmN1cnJlbnRUeXBlT2Zmc2V0XSkpIHsKJHRoaXMtPmN1cnJlbnRUeXBlID0gLTE7CmJyZWFrOwp9CgokdGhpcy0+Y3VycmVudFR5cGUgPSAkdGhpcy0+dHlwZXNbJHRoaXMtPmN1cnJlbnRUeXBlT2Zmc2V0XTsKfSB3aGlsZSAoMCA9PT0gXGNvdW50KCR0aGlzLT5ydWxlc1skdGhpcy0+Y3VycmVudFR5cGVdKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB2YWxpZCgpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5ydWxlc1skdGhpcy0+Y3VycmVudFR5cGVdLCAkdGhpcy0+cnVsZXNbJHRoaXMtPmN1cnJlbnRUeXBlXVskdGhpcy0+Y3VycmVudE9mZnNldF0pOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCgoKCgoKCgoKCmNsYXNzIFJ1bGVXYXRjaENoYWluIGV4dGVuZHMgXFNwbERvdWJseUxpbmtlZExpc3QKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWVrKGludCAkb2Zmc2V0KTogdm9pZAp7CiR0aGlzLT5yZXdpbmQoKTsKZm9yICgkaSA9IDA7ICRpIDwgJG9mZnNldDsgJGkrKywgJHRoaXMtPm5leHQoKSk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZSgpOiB2b2lkCnsKJG9mZnNldCA9ICR0aGlzLT5rZXkoKTsKJHRoaXMtPm9mZnNldFVuc2V0KCRvZmZzZXQpOwokdGhpcy0+c2Vlaygkb2Zmc2V0KTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7CgoKCgoKCgoKCgoKY2xhc3MgUnVsZVdhdGNoR3JhcGgKewoKcHJvdGVjdGVkICR3YXRjaENoYWlucyA9IFtdOwoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluc2VydChSdWxlV2F0Y2hOb2RlICRub2RlKTogdm9pZAp7CmlmICgkbm9kZS0+Z2V0UnVsZSgpLT5pc0Fzc2VydGlvbigpKSB7CnJldHVybjsKfQoKaWYgKCEkbm9kZS0+Z2V0UnVsZSgpIGluc3RhbmNlb2YgTXVsdGlDb25mbGljdFJ1bGUpIHsKZm9yZWFjaCAoWyRub2RlLT53YXRjaDEsICRub2RlLT53YXRjaDJdIGFzICRsaXRlcmFsKSB7CmlmICghaXNzZXQoJHRoaXMtPndhdGNoQ2hhaW5zWyRsaXRlcmFsXSkpIHsKJHRoaXMtPndhdGNoQ2hhaW5zWyRsaXRlcmFsXSA9IG5ldyBSdWxlV2F0Y2hDaGFpbjsKfQoKJHRoaXMtPndhdGNoQ2hhaW5zWyRsaXRlcmFsXS0+dW5zaGlmdCgkbm9kZSk7Cn0KfSBlbHNlIHsKZm9yZWFjaCAoJG5vZGUtPmdldFJ1bGUoKS0+Z2V0TGl0ZXJhbHMoKSBhcyAkbGl0ZXJhbCkgewppZiAoIWlzc2V0KCR0aGlzLT53YXRjaENoYWluc1skbGl0ZXJhbF0pKSB7CiR0aGlzLT53YXRjaENoYWluc1skbGl0ZXJhbF0gPSBuZXcgUnVsZVdhdGNoQ2hhaW47Cn0KCiR0aGlzLT53YXRjaENoYWluc1skbGl0ZXJhbF0tPnVuc2hpZnQoJG5vZGUpOwp9Cn0KfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvcGFnYXRlTGl0ZXJhbChpbnQgJGRlY2lkZWRMaXRlcmFsLCBpbnQgJGxldmVsLCBEZWNpc2lvbnMgJGRlY2lzaW9ucyk6ID9SdWxlCnsKCgoKJGxpdGVyYWwgPSAtJGRlY2lkZWRMaXRlcmFsOwoKaWYgKCFpc3NldCgkdGhpcy0+d2F0Y2hDaGFpbnNbJGxpdGVyYWxdKSkgewpyZXR1cm4gbnVsbDsKfQoKJGNoYWluID0gJHRoaXMtPndhdGNoQ2hhaW5zWyRsaXRlcmFsXTsKCiRjaGFpbi0+cmV3aW5kKCk7CndoaWxlICgkY2hhaW4tPnZhbGlkKCkpIHsKJG5vZGUgPSAkY2hhaW4tPmN1cnJlbnQoKTsKaWYgKCEkbm9kZS0+Z2V0UnVsZSgpIGluc3RhbmNlb2YgTXVsdGlDb25mbGljdFJ1bGUpIHsKJG90aGVyV2F0Y2ggPSAkbm9kZS0+Z2V0T3RoZXJXYXRjaCgkbGl0ZXJhbCk7CgppZiAoISRub2RlLT5nZXRSdWxlKCktPmlzRGlzYWJsZWQoKSAmJiAhJGRlY2lzaW9ucy0+c2F0aXNmeSgkb3RoZXJXYXRjaCkpIHsKJHJ1bGVMaXRlcmFscyA9ICRub2RlLT5nZXRSdWxlKCktPmdldExpdGVyYWxzKCk7CgokYWx0ZXJuYXRpdmVMaXRlcmFscyA9IGFycmF5X2ZpbHRlcigkcnVsZUxpdGVyYWxzLCBzdGF0aWMgZnVuY3Rpb24gKCRydWxlTGl0ZXJhbCkgdXNlICgkbGl0ZXJhbCwgJG90aGVyV2F0Y2gsICRkZWNpc2lvbnMpOiBib29sIHsKcmV0dXJuICRsaXRlcmFsICE9PSAkcnVsZUxpdGVyYWwgJiYKJG90aGVyV2F0Y2ggIT09ICRydWxlTGl0ZXJhbCAmJgohJGRlY2lzaW9ucy0+Y29uZmxpY3QoJHJ1bGVMaXRlcmFsKTsKfSk7CgppZiAoXGNvdW50KCRhbHRlcm5hdGl2ZUxpdGVyYWxzKSA+IDApIHsKcmVzZXQoJGFsdGVybmF0aXZlTGl0ZXJhbHMpOwokdGhpcy0+bW92ZVdhdGNoKCRsaXRlcmFsLCBjdXJyZW50KCRhbHRlcm5hdGl2ZUxpdGVyYWxzKSwgJG5vZGUpOwpjb250aW51ZTsKfQoKaWYgKCRkZWNpc2lvbnMtPmNvbmZsaWN0KCRvdGhlcldhdGNoKSkgewpyZXR1cm4gJG5vZGUtPmdldFJ1bGUoKTsKfQoKJGRlY2lzaW9ucy0+ZGVjaWRlKCRvdGhlcldhdGNoLCAkbGV2ZWwsICRub2RlLT5nZXRSdWxlKCkpOwp9Cn0gZWxzZSB7CmZvcmVhY2ggKCRub2RlLT5nZXRSdWxlKCktPmdldExpdGVyYWxzKCkgYXMgJG90aGVyTGl0ZXJhbCkgewppZiAoJGxpdGVyYWwgIT09ICRvdGhlckxpdGVyYWwgJiYgISRkZWNpc2lvbnMtPnNhdGlzZnkoJG90aGVyTGl0ZXJhbCkpIHsKaWYgKCRkZWNpc2lvbnMtPmNvbmZsaWN0KCRvdGhlckxpdGVyYWwpKSB7CnJldHVybiAkbm9kZS0+Z2V0UnVsZSgpOwp9CgokZGVjaXNpb25zLT5kZWNpZGUoJG90aGVyTGl0ZXJhbCwgJGxldmVsLCAkbm9kZS0+Z2V0UnVsZSgpKTsKfQp9Cn0KCiRjaGFpbi0+bmV4dCgpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIG1vdmVXYXRjaChpbnQgJGZyb21MaXRlcmFsLCBpbnQgJHRvTGl0ZXJhbCwgUnVsZVdhdGNoTm9kZSAkbm9kZSk6IHZvaWQKewppZiAoIWlzc2V0KCR0aGlzLT53YXRjaENoYWluc1skdG9MaXRlcmFsXSkpIHsKJHRoaXMtPndhdGNoQ2hhaW5zWyR0b0xpdGVyYWxdID0gbmV3IFJ1bGVXYXRjaENoYWluOwp9Cgokbm9kZS0+bW92ZVdhdGNoKCRmcm9tTGl0ZXJhbCwgJHRvTGl0ZXJhbCk7CiR0aGlzLT53YXRjaENoYWluc1skZnJvbUxpdGVyYWxdLT5yZW1vdmUoKTsKJHRoaXMtPndhdGNoQ2hhaW5zWyR0b0xpdGVyYWxdLT51bnNoaWZ0KCRub2RlKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7CgoKCgoKCgoKY2xhc3MgUnVsZVdhdGNoTm9kZQp7CgpwdWJsaWMgJHdhdGNoMTsKCnB1YmxpYyAkd2F0Y2gyOwoKCnByb3RlY3RlZCAkcnVsZTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJ1bGUgJHJ1bGUpCnsKJHRoaXMtPnJ1bGUgPSAkcnVsZTsKCiRsaXRlcmFscyA9ICRydWxlLT5nZXRMaXRlcmFscygpOwoKJGxpdGVyYWxDb3VudCA9IFxjb3VudCgkbGl0ZXJhbHMpOwokdGhpcy0+d2F0Y2gxID0gJGxpdGVyYWxDb3VudCA+IDAgPyAkbGl0ZXJhbHNbMF0gOiAwOwokdGhpcy0+d2F0Y2gyID0gJGxpdGVyYWxDb3VudCA+IDEgPyAkbGl0ZXJhbHNbMV0gOiAwOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YXRjaDJPbkhpZ2hlc3QoRGVjaXNpb25zICRkZWNpc2lvbnMpOiB2b2lkCnsKJGxpdGVyYWxzID0gJHRoaXMtPnJ1bGUtPmdldExpdGVyYWxzKCk7CgoKaWYgKFxjb3VudCgkbGl0ZXJhbHMpIDwgMyB8fCAkdGhpcy0+cnVsZSBpbnN0YW5jZW9mIE11bHRpQ29uZmxpY3RSdWxlKSB7CnJldHVybjsKfQoKJHdhdGNoTGV2ZWwgPSAwOwoKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CiRsZXZlbCA9ICRkZWNpc2lvbnMtPmRlY2lzaW9uTGV2ZWwoJGxpdGVyYWwpOwoKaWYgKCRsZXZlbCA+ICR3YXRjaExldmVsKSB7CiR0aGlzLT53YXRjaDIgPSAkbGl0ZXJhbDsKJHdhdGNoTGV2ZWwgPSAkbGV2ZWw7Cn0KfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UnVsZSgpOiBSdWxlCnsKcmV0dXJuICR0aGlzLT5ydWxlOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3RoZXJXYXRjaChpbnQgJGxpdGVyYWwpOiBpbnQKewppZiAoJHRoaXMtPndhdGNoMSA9PT0gJGxpdGVyYWwpIHsKcmV0dXJuICR0aGlzLT53YXRjaDI7Cn0KCnJldHVybiAkdGhpcy0+d2F0Y2gxOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbW92ZVdhdGNoKGludCAkZnJvbSwgaW50ICR0byk6IHZvaWQKewppZiAoJHRoaXMtPndhdGNoMSA9PT0gJGZyb20pIHsKJHRoaXMtPndhdGNoMSA9ICR0bzsKfSBlbHNlIHsKJHRoaXMtPndhdGNoMiA9ICR0bzsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Owp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKCgoKCmNsYXNzIFNvbHZlcgp7CnByaXZhdGUgY29uc3QgQlJBTkNIX0xJVEVSQUxTID0gMDsKcHJpdmF0ZSBjb25zdCBCUkFOQ0hfTEVWRUwgPSAxOwoKCnByb3RlY3RlZCAkcG9saWN5OwoKcHJvdGVjdGVkICRwb29sOwoKCnByb3RlY3RlZCAkcnVsZXM7CgoKcHJvdGVjdGVkICR3YXRjaEdyYXBoOwoKcHJvdGVjdGVkICRkZWNpc2lvbnM7Cgpwcm90ZWN0ZWQgJGZpeGVkTWFwOwoKCnByb3RlY3RlZCAkcHJvcGFnYXRlSW5kZXg7Cgpwcm90ZWN0ZWQgJGJyYW5jaGVzID0gW107Cgpwcm90ZWN0ZWQgJHByb2JsZW1zID0gW107Cgpwcm90ZWN0ZWQgJGxlYXJuZWRQb29sID0gW107Cgpwcm90ZWN0ZWQgJGxlYXJuZWRXaHkgPSBbXTsKCgpwdWJsaWMgJHRlc3RGbGFnTGVhcm5lZFBvc2l0aXZlTGl0ZXJhbCA9IGZhbHNlOwoKCnByb3RlY3RlZCAkaW87CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUG9saWN5SW50ZXJmYWNlICRwb2xpY3ksIFBvb2wgJHBvb2wsIElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5wb2xpY3kgPSAkcG9saWN5OwokdGhpcy0+cG9vbCA9ICRwb29sOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UnVsZVNldFNpemUoKTogaW50CnsKcmV0dXJuIFxjb3VudCgkdGhpcy0+cnVsZXMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UG9vbCgpOiBQb29sCnsKcmV0dXJuICR0aGlzLT5wb29sOwp9CgoKCnByaXZhdGUgZnVuY3Rpb24gbWFrZUFzc2VydGlvblJ1bGVEZWNpc2lvbnMoKTogdm9pZAp7CiRkZWNpc2lvblN0YXJ0ID0gXGNvdW50KCR0aGlzLT5kZWNpc2lvbnMpIC0gMTsKCiRydWxlc0NvdW50ID0gXGNvdW50KCR0aGlzLT5ydWxlcyk7CmZvciAoJHJ1bGVJbmRleCA9IDA7ICRydWxlSW5kZXggPCAkcnVsZXNDb3VudDsgJHJ1bGVJbmRleCsrKSB7CiRydWxlID0gJHRoaXMtPnJ1bGVzLT5ydWxlQnlJZFskcnVsZUluZGV4XTsKCmlmICghJHJ1bGUtPmlzQXNzZXJ0aW9uKCkgfHwgJHJ1bGUtPmlzRGlzYWJsZWQoKSkgewpjb250aW51ZTsKfQoKJGxpdGVyYWxzID0gJHJ1bGUtPmdldExpdGVyYWxzKCk7CiRsaXRlcmFsID0gJGxpdGVyYWxzWzBdOwoKaWYgKCEkdGhpcy0+ZGVjaXNpb25zLT5kZWNpZGVkKCRsaXRlcmFsKSkgewokdGhpcy0+ZGVjaXNpb25zLT5kZWNpZGUoJGxpdGVyYWwsIDEsICRydWxlKTsKY29udGludWU7Cn0KCmlmICgkdGhpcy0+ZGVjaXNpb25zLT5zYXRpc2Z5KCRsaXRlcmFsKSkgewpjb250aW51ZTsKfQoKCmlmIChSdWxlU2V0OjpUWVBFX0xFQVJORUQgPT09ICRydWxlLT5nZXRUeXBlKCkpIHsKJHJ1bGUtPmRpc2FibGUoKTsKY29udGludWU7Cn0KCiRjb25mbGljdCA9ICR0aGlzLT5kZWNpc2lvbnMtPmRlY2lzaW9uUnVsZSgkbGl0ZXJhbCk7CgppZiAoUnVsZVNldDo6VFlQRV9QQUNLQUdFID09PSAkY29uZmxpY3QtPmdldFR5cGUoKSkgewokcHJvYmxlbSA9IG5ldyBQcm9ibGVtKCk7CgokcHJvYmxlbS0+YWRkUnVsZSgkcnVsZSk7CiRwcm9ibGVtLT5hZGRSdWxlKCRjb25mbGljdCk7CiRydWxlLT5kaXNhYmxlKCk7CiR0aGlzLT5wcm9ibGVtc1tdID0gJHByb2JsZW07CmNvbnRpbnVlOwp9CgoKJHByb2JsZW0gPSBuZXcgUHJvYmxlbSgpOwokcHJvYmxlbS0+YWRkUnVsZSgkcnVsZSk7CiRwcm9ibGVtLT5hZGRSdWxlKCRjb25mbGljdCk7CgoKCmZvcmVhY2ggKCR0aGlzLT5ydWxlcy0+Z2V0SXRlcmF0b3JGb3IoUnVsZVNldDo6VFlQRV9SRVFVRVNUKSBhcyAkYXNzZXJ0UnVsZSkgewppZiAoJGFzc2VydFJ1bGUtPmlzRGlzYWJsZWQoKSB8fCAhJGFzc2VydFJ1bGUtPmlzQXNzZXJ0aW9uKCkpIHsKY29udGludWU7Cn0KCiRhc3NlcnRSdWxlTGl0ZXJhbHMgPSAkYXNzZXJ0UnVsZS0+Z2V0TGl0ZXJhbHMoKTsKJGFzc2VydFJ1bGVMaXRlcmFsID0gJGFzc2VydFJ1bGVMaXRlcmFsc1swXTsKCmlmIChhYnMoJGxpdGVyYWwpICE9PSBhYnMoJGFzc2VydFJ1bGVMaXRlcmFsKSkgewpjb250aW51ZTsKfQokcHJvYmxlbS0+YWRkUnVsZSgkYXNzZXJ0UnVsZSk7CiRhc3NlcnRSdWxlLT5kaXNhYmxlKCk7Cn0KJHRoaXMtPnByb2JsZW1zW10gPSAkcHJvYmxlbTsKCiR0aGlzLT5kZWNpc2lvbnMtPnJlc2V0VG9PZmZzZXQoJGRlY2lzaW9uU3RhcnQpOwokcnVsZUluZGV4ID0gLTE7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNldHVwRml4ZWRNYXAoUmVxdWVzdCAkcmVxdWVzdCk6IHZvaWQKewokdGhpcy0+Zml4ZWRNYXAgPSBbXTsKZm9yZWFjaCAoJHJlcXVlc3QtPmdldEZpeGVkUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokdGhpcy0+Zml4ZWRNYXBbJHBhY2thZ2UtPmlkXSA9ICRwYWNrYWdlOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja0ZvclJvb3RSZXF1aXJlUHJvYmxlbXMoUmVxdWVzdCAkcmVxdWVzdCwgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik6IHZvaWQKewpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0UmVxdWlyZXMoKSBhcyAkcGFja2FnZU5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJHBhY2thZ2VOYW1lKSkgewpjb250aW51ZTsKfSBlbHNlaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpIHsKJGNvbnN0cmFpbnQgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+ZmlsdGVyQ29uc3RyYWludCgkcGFja2FnZU5hbWUsICRjb25zdHJhaW50KTsKfQoKaWYgKDAgPT09IFxjb3VudCgkdGhpcy0+cG9vbC0+d2hhdFByb3ZpZGVzKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpKSkgewokcHJvYmxlbSA9IG5ldyBQcm9ibGVtKCk7CiRwcm9ibGVtLT5hZGRSdWxlKG5ldyBHZW5lcmljUnVsZShbXSwgUnVsZTo6UlVMRV9ST09UX1JFUVVJUkUsIFsncGFja2FnZU5hbWUnID0+ICRwYWNrYWdlTmFtZSwgJ2NvbnN0cmFpbnQnID0+ICRjb25zdHJhaW50XSkpOwokdGhpcy0+cHJvYmxlbXNbXSA9ICRwcm9ibGVtOwp9Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHNvbHZlKFJlcXVlc3QgJHJlcXVlc3QsID9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gbnVsbCk6IExvY2tUcmFuc2FjdGlvbgp7CiRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPz8gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZU5vdGhpbmcoKTsKCiR0aGlzLT5zZXR1cEZpeGVkTWFwKCRyZXF1ZXN0KTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignR2VuZXJhdGluZyBydWxlcycsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiRydWxlU2V0R2VuZXJhdG9yID0gbmV3IFJ1bGVTZXRHZW5lcmF0b3IoJHRoaXMtPnBvbGljeSwgJHRoaXMtPnBvb2wpOwokdGhpcy0+cnVsZXMgPSAkcnVsZVNldEdlbmVyYXRvci0+Z2V0UnVsZXNGb3IoJHJlcXVlc3QsICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKdW5zZXQoJHJ1bGVTZXRHZW5lcmF0b3IpOwokdGhpcy0+Y2hlY2tGb3JSb290UmVxdWlyZVByb2JsZW1zKCRyZXF1ZXN0LCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CiR0aGlzLT5kZWNpc2lvbnMgPSBuZXcgRGVjaXNpb25zKCR0aGlzLT5wb29sKTsKJHRoaXMtPndhdGNoR3JhcGggPSBuZXcgUnVsZVdhdGNoR3JhcGg7Cgpmb3JlYWNoICgkdGhpcy0+cnVsZXMgYXMgJHJ1bGUpIHsKJHRoaXMtPndhdGNoR3JhcGgtPmluc2VydChuZXcgUnVsZVdhdGNoTm9kZSgkcnVsZSkpOwp9CgoKJHRoaXMtPm1ha2VBc3NlcnRpb25SdWxlRGVjaXNpb25zKCk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1Jlc29sdmluZyBkZXBlbmRlbmNpZXMgdGhyb3VnaCBTQVQnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokYmVmb3JlID0gbWljcm90aW1lKHRydWUpOwokdGhpcy0+cnVuU2F0KCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJ0RlcGVuZGVuY3kgcmVzb2x1dGlvbiBjb21wbGV0ZWQgaW4gJS4zZiBzZWNvbmRzJywgbWljcm90aW1lKHRydWUpIC0gJGJlZm9yZSksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKCmlmIChcY291bnQoJHRoaXMtPnByb2JsZW1zKSA+IDApIHsKdGhyb3cgbmV3IFNvbHZlclByb2JsZW1zRXhjZXB0aW9uKCR0aGlzLT5wcm9ibGVtcywgJHRoaXMtPmxlYXJuZWRQb29sKTsKfQoKcmV0dXJuIG5ldyBMb2NrVHJhbnNhY3Rpb24oJHRoaXMtPnBvb2wsICRyZXF1ZXN0LT5nZXRQcmVzZW50TWFwKCksICRyZXF1ZXN0LT5nZXRGaXhlZFBhY2thZ2VzTWFwKCksICR0aGlzLT5kZWNpc2lvbnMpOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcm9wYWdhdGUoaW50ICRsZXZlbCk6ID9SdWxlCnsKd2hpbGUgKCR0aGlzLT5kZWNpc2lvbnMtPnZhbGlkT2Zmc2V0KCR0aGlzLT5wcm9wYWdhdGVJbmRleCkpIHsKJGRlY2lzaW9uID0gJHRoaXMtPmRlY2lzaW9ucy0+YXRPZmZzZXQoJHRoaXMtPnByb3BhZ2F0ZUluZGV4KTsKCiRjb25mbGljdCA9ICR0aGlzLT53YXRjaEdyYXBoLT5wcm9wYWdhdGVMaXRlcmFsKAokZGVjaXNpb25bRGVjaXNpb25zOjpERUNJU0lPTl9MSVRFUkFMXSwKJGxldmVsLAokdGhpcy0+ZGVjaXNpb25zCik7CgokdGhpcy0+cHJvcGFnYXRlSW5kZXgrKzsKCmlmICgkY29uZmxpY3QgIT09IG51bGwpIHsKcmV0dXJuICRjb25mbGljdDsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXZlcnQoaW50ICRsZXZlbCk6IHZvaWQKewp3aGlsZSAoISR0aGlzLT5kZWNpc2lvbnMtPmlzRW1wdHkoKSkgewokbGl0ZXJhbCA9ICR0aGlzLT5kZWNpc2lvbnMtPmxhc3RMaXRlcmFsKCk7CgppZiAoJHRoaXMtPmRlY2lzaW9ucy0+dW5kZWNpZGVkKCRsaXRlcmFsKSkgewpicmVhazsKfQoKJGRlY2lzaW9uTGV2ZWwgPSAkdGhpcy0+ZGVjaXNpb25zLT5kZWNpc2lvbkxldmVsKCRsaXRlcmFsKTsKCmlmICgkZGVjaXNpb25MZXZlbCA8PSAkbGV2ZWwpIHsKYnJlYWs7Cn0KCiR0aGlzLT5kZWNpc2lvbnMtPnJldmVydExhc3QoKTsKJHRoaXMtPnByb3BhZ2F0ZUluZGV4ID0gXGNvdW50KCR0aGlzLT5kZWNpc2lvbnMpOwp9Cgp3aGlsZSAoXGNvdW50KCR0aGlzLT5icmFuY2hlcykgPiAwICYmICR0aGlzLT5icmFuY2hlc1tcY291bnQoJHRoaXMtPmJyYW5jaGVzKSAtIDFdW3NlbGY6OkJSQU5DSF9MRVZFTF0gPj0gJGxldmVsKSB7CmFycmF5X3BvcCgkdGhpcy0+YnJhbmNoZXMpOwp9Cn0KCgoKCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldFByb3BhZ2F0ZUxlYXJuKGludCAkbGV2ZWwsIGludCAkbGl0ZXJhbCwgUnVsZSAkcnVsZSk6IGludAp7CiRsZXZlbCsrOwoKJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaWRlKCRsaXRlcmFsLCAkbGV2ZWwsICRydWxlKTsKCndoaWxlICh0cnVlKSB7CiRydWxlID0gJHRoaXMtPnByb3BhZ2F0ZSgkbGV2ZWwpOwoKaWYgKG51bGwgPT09ICRydWxlKSB7CmJyZWFrOwp9CgppZiAoJGxldmVsID09PSAxKSB7CiR0aGlzLT5hbmFseXplVW5zb2x2YWJsZSgkcnVsZSk7CgpyZXR1cm4gMDsKfQoKClskbGVhcm5MaXRlcmFsLCAkbmV3TGV2ZWwsICRuZXdSdWxlLCAkd2h5XSA9ICR0aGlzLT5hbmFseXplKCRsZXZlbCwgJHJ1bGUpOwoKaWYgKCRuZXdMZXZlbCA8PSAwIHx8ICRuZXdMZXZlbCA+PSAkbGV2ZWwpIHsKdGhyb3cgbmV3IFNvbHZlckJ1Z0V4Y2VwdGlvbigKIlRyeWluZyB0byByZXZlcnQgdG8gaW52YWxpZCBsZXZlbCAiLiRuZXdMZXZlbC4iIGZyb20gbGV2ZWwgIi4kbGV2ZWwuIi4iCik7Cn0KCiRsZXZlbCA9ICRuZXdMZXZlbDsKCiR0aGlzLT5yZXZlcnQoJGxldmVsKTsKCiR0aGlzLT5ydWxlcy0+YWRkKCRuZXdSdWxlLCBSdWxlU2V0OjpUWVBFX0xFQVJORUQpOwoKJHRoaXMtPmxlYXJuZWRXaHlbc3BsX29iamVjdF9oYXNoKCRuZXdSdWxlKV0gPSAkd2h5OwoKJHJ1bGVOb2RlID0gbmV3IFJ1bGVXYXRjaE5vZGUoJG5ld1J1bGUpOwokcnVsZU5vZGUtPndhdGNoMk9uSGlnaGVzdCgkdGhpcy0+ZGVjaXNpb25zKTsKJHRoaXMtPndhdGNoR3JhcGgtPmluc2VydCgkcnVsZU5vZGUpOwoKJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaWRlKCRsZWFybkxpdGVyYWwsICRsZXZlbCwgJG5ld1J1bGUpOwp9CgpyZXR1cm4gJGxldmVsOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNlbGVjdEFuZEluc3RhbGwoaW50ICRsZXZlbCwgYXJyYXkgJGRlY2lzaW9uUXVldWUsIFJ1bGUgJHJ1bGUpOiBpbnQKewoKJGxpdGVyYWxzID0gJHRoaXMtPnBvbGljeS0+c2VsZWN0UHJlZmVycmVkUGFja2FnZXMoJHRoaXMtPnBvb2wsICRkZWNpc2lvblF1ZXVlLCAkcnVsZS0+Z2V0UmVxdWlyZWRQYWNrYWdlKCkpOwoKJHNlbGVjdGVkTGl0ZXJhbCA9IGFycmF5X3NoaWZ0KCRsaXRlcmFscyk7CgoKaWYgKFxjb3VudCgkbGl0ZXJhbHMpID4gMCkgewokdGhpcy0+YnJhbmNoZXNbXSA9IFskbGl0ZXJhbHMsICRsZXZlbF07Cn0KCnJldHVybiAkdGhpcy0+c2V0UHJvcGFnYXRlTGVhcm4oJGxldmVsLCAkc2VsZWN0ZWRMaXRlcmFsLCAkcnVsZSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhbmFseXplKGludCAkbGV2ZWwsIFJ1bGUgJHJ1bGUpOiBhcnJheQp7CiRhbmFseXplZFJ1bGUgPSAkcnVsZTsKJHJ1bGVMZXZlbCA9IDE7CiRudW0gPSAwOwokbDFudW0gPSAwOwokc2VlbiA9IFtdOwokbGVhcm5lZExpdGVyYWwgPSBudWxsOwokb3RoZXJMZWFybmVkTGl0ZXJhbHMgPSBbXTsKCiRkZWNpc2lvbklkID0gXGNvdW50KCR0aGlzLT5kZWNpc2lvbnMpOwoKJHRoaXMtPmxlYXJuZWRQb29sW10gPSBbXTsKCndoaWxlICh0cnVlKSB7CiR0aGlzLT5sZWFybmVkUG9vbFtcY291bnQoJHRoaXMtPmxlYXJuZWRQb29sKSAtIDFdW10gPSAkcnVsZTsKCmZvcmVhY2ggKCRydWxlLT5nZXRMaXRlcmFscygpIGFzICRsaXRlcmFsKSB7CgppZiAoJHJ1bGUgaW5zdGFuY2VvZiBNdWx0aUNvbmZsaWN0UnVsZSAmJiAhJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaWRlZCgkbGl0ZXJhbCkpIHsKY29udGludWU7Cn0KCgppZiAoJHRoaXMtPmRlY2lzaW9ucy0+c2F0aXNmeSgkbGl0ZXJhbCkpIHsKY29udGludWU7Cn0KCmlmIChpc3NldCgkc2VlblthYnMoJGxpdGVyYWwpXSkpIHsKY29udGludWU7Cn0KJHNlZW5bYWJzKCRsaXRlcmFsKV0gPSB0cnVlOwoKJGwgPSAkdGhpcy0+ZGVjaXNpb25zLT5kZWNpc2lvbkxldmVsKCRsaXRlcmFsKTsKCmlmICgxID09PSAkbCkgewokbDFudW0rKzsKfSBlbHNlaWYgKCRsZXZlbCA9PT0gJGwpIHsKJG51bSsrOwp9IGVsc2UgewoKJG90aGVyTGVhcm5lZExpdGVyYWxzW10gPSAkbGl0ZXJhbDsKCmlmICgkbCA+ICRydWxlTGV2ZWwpIHsKJHJ1bGVMZXZlbCA9ICRsOwp9Cn0KfQp1bnNldCgkbGl0ZXJhbCk7CgokbDFyZXRyeSA9IHRydWU7CndoaWxlICgkbDFyZXRyeSkgewokbDFyZXRyeSA9IGZhbHNlOwoKaWYgKDAgPT09ICRudW0gJiYgMCA9PT0gLS0kbDFudW0pIHsKCmJyZWFrIDI7Cn0KCndoaWxlICh0cnVlKSB7CmlmICgkZGVjaXNpb25JZCA8PSAwKSB7CnRocm93IG5ldyBTb2x2ZXJCdWdFeGNlcHRpb24oCiJSZWFjaGVkIGludmFsaWQgZGVjaXNpb24gaWQgJGRlY2lzaW9uSWQgd2hpbGUgbG9va2luZyB0aHJvdWdoICRydWxlIGZvciBhIGxpdGVyYWwgcHJlc2VudCBpbiB0aGUgYW5hbHl6ZWQgcnVsZSAkYW5hbHl6ZWRSdWxlLiIKKTsKfQoKJGRlY2lzaW9uSWQtLTsKCiRkZWNpc2lvbiA9ICR0aGlzLT5kZWNpc2lvbnMtPmF0T2Zmc2V0KCRkZWNpc2lvbklkKTsKJGxpdGVyYWwgPSAkZGVjaXNpb25bRGVjaXNpb25zOjpERUNJU0lPTl9MSVRFUkFMXTsKCmlmIChpc3NldCgkc2VlblthYnMoJGxpdGVyYWwpXSkpIHsKYnJlYWs7Cn0KfQoKdW5zZXQoJHNlZW5bYWJzKCRsaXRlcmFsKV0pOwoKaWYgKDAgIT09ICRudW0gJiYgMCA9PT0gLS0kbnVtKSB7CmlmICgkbGl0ZXJhbCA8IDApIHsKJHRoaXMtPnRlc3RGbGFnTGVhcm5lZFBvc2l0aXZlTGl0ZXJhbCA9IHRydWU7Cn0KJGxlYXJuZWRMaXRlcmFsID0gLSRsaXRlcmFsOwoKaWYgKDAgPT09ICRsMW51bSkgewpicmVhayAyOwp9Cgpmb3JlYWNoICgkb3RoZXJMZWFybmVkTGl0ZXJhbHMgYXMgJG90aGVyTGl0ZXJhbCkgewp1bnNldCgkc2VlblthYnMoJG90aGVyTGl0ZXJhbCldKTsKfQoKJGwxbnVtKys7CiRsMXJldHJ5ID0gdHJ1ZTsKfSBlbHNlIHsKJGRlY2lzaW9uID0gJHRoaXMtPmRlY2lzaW9ucy0+YXRPZmZzZXQoJGRlY2lzaW9uSWQpOwokcnVsZSA9ICRkZWNpc2lvbltEZWNpc2lvbnM6OkRFQ0lTSU9OX1JFQVNPTl07CgppZiAoJHJ1bGUgaW5zdGFuY2VvZiBNdWx0aUNvbmZsaWN0UnVsZSkgewoKZm9yZWFjaCAoJHJ1bGUtPmdldExpdGVyYWxzKCkgYXMgJHJ1bGVMaXRlcmFsKSB7CmlmICghaXNzZXQoJHNlZW5bYWJzKCRydWxlTGl0ZXJhbCldKSAmJiAkdGhpcy0+ZGVjaXNpb25zLT5zYXRpc2Z5KC0kcnVsZUxpdGVyYWwpKSB7CiR0aGlzLT5sZWFybmVkUG9vbFtcY291bnQoJHRoaXMtPmxlYXJuZWRQb29sKSAtIDFdW10gPSAkcnVsZTsKJGwgPSAkdGhpcy0+ZGVjaXNpb25zLT5kZWNpc2lvbkxldmVsKCRydWxlTGl0ZXJhbCk7CmlmICgxID09PSAkbCkgewokbDFudW0rKzsKfSBlbHNlaWYgKCRsZXZlbCA9PT0gJGwpIHsKJG51bSsrOwp9IGVsc2UgewoKJG90aGVyTGVhcm5lZExpdGVyYWxzW10gPSAkcnVsZUxpdGVyYWw7CgppZiAoJGwgPiAkcnVsZUxldmVsKSB7CiRydWxlTGV2ZWwgPSAkbDsKfQp9CiRzZWVuW2FicygkcnVsZUxpdGVyYWwpXSA9IHRydWU7CmJyZWFrOwp9Cn0KCiRsMXJldHJ5ID0gdHJ1ZTsKfQp9Cn0KCiRkZWNpc2lvbiA9ICR0aGlzLT5kZWNpc2lvbnMtPmF0T2Zmc2V0KCRkZWNpc2lvbklkKTsKJHJ1bGUgPSAkZGVjaXNpb25bRGVjaXNpb25zOjpERUNJU0lPTl9SRUFTT05dOwp9Cgokd2h5ID0gXGNvdW50KCR0aGlzLT5sZWFybmVkUG9vbCkgLSAxOwoKaWYgKG51bGwgPT09ICRsZWFybmVkTGl0ZXJhbCkgewp0aHJvdyBuZXcgU29sdmVyQnVnRXhjZXB0aW9uKAoiRGlkIG5vdCBmaW5kIGEgbGVhcm5hYmxlIGxpdGVyYWwgaW4gYW5hbHl6ZWQgcnVsZSAkYW5hbHl6ZWRSdWxlLiIKKTsKfQoKYXJyYXlfdW5zaGlmdCgkb3RoZXJMZWFybmVkTGl0ZXJhbHMsICRsZWFybmVkTGl0ZXJhbCk7CiRuZXdSdWxlID0gbmV3IEdlbmVyaWNSdWxlKCRvdGhlckxlYXJuZWRMaXRlcmFscywgUnVsZTo6UlVMRV9MRUFSTkVELCAkd2h5KTsKCnJldHVybiBbJGxlYXJuZWRMaXRlcmFsLCAkcnVsZUxldmVsLCAkbmV3UnVsZSwgJHdoeV07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gYW5hbHl6ZVVuc29sdmFibGVSdWxlKFByb2JsZW0gJHByb2JsZW0sIFJ1bGUgJGNvbmZsaWN0UnVsZSwgYXJyYXkgJiRydWxlU2Vlbik6IHZvaWQKewokd2h5ID0gc3BsX29iamVjdF9oYXNoKCRjb25mbGljdFJ1bGUpOwokcnVsZVNlZW5bJHdoeV0gPSB0cnVlOwoKaWYgKCRjb25mbGljdFJ1bGUtPmdldFR5cGUoKSA9PT0gUnVsZVNldDo6VFlQRV9MRUFSTkVEKSB7CiRsZWFybmVkV2h5ID0gJHRoaXMtPmxlYXJuZWRXaHlbJHdoeV07CiRwcm9ibGVtUnVsZXMgPSAkdGhpcy0+bGVhcm5lZFBvb2xbJGxlYXJuZWRXaHldOwoKZm9yZWFjaCAoJHByb2JsZW1SdWxlcyBhcyAkcHJvYmxlbVJ1bGUpIHsKaWYgKCFpc3NldCgkcnVsZVNlZW5bc3BsX29iamVjdF9oYXNoKCRwcm9ibGVtUnVsZSldKSkgewokdGhpcy0+YW5hbHl6ZVVuc29sdmFibGVSdWxlKCRwcm9ibGVtLCAkcHJvYmxlbVJ1bGUsICRydWxlU2Vlbik7Cn0KfQoKcmV0dXJuOwp9CgppZiAoJGNvbmZsaWN0UnVsZS0+Z2V0VHlwZSgpID09PSBSdWxlU2V0OjpUWVBFX1BBQ0tBR0UpIHsKCnJldHVybjsKfQoKJHByb2JsZW0tPm5leHRTZWN0aW9uKCk7CiRwcm9ibGVtLT5hZGRSdWxlKCRjb25mbGljdFJ1bGUpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGFuYWx5emVVbnNvbHZhYmxlKFJ1bGUgJGNvbmZsaWN0UnVsZSk6IHZvaWQKewokcHJvYmxlbSA9IG5ldyBQcm9ibGVtKCk7CiRwcm9ibGVtLT5hZGRSdWxlKCRjb25mbGljdFJ1bGUpOwoKJHJ1bGVTZWVuID0gW107CgokdGhpcy0+YW5hbHl6ZVVuc29sdmFibGVSdWxlKCRwcm9ibGVtLCAkY29uZmxpY3RSdWxlLCAkcnVsZVNlZW4pOwoKJHRoaXMtPnByb2JsZW1zW10gPSAkcHJvYmxlbTsKCiRzZWVuID0gW107CiRsaXRlcmFscyA9ICRjb25mbGljdFJ1bGUtPmdldExpdGVyYWxzKCk7Cgpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKCmlmICgkdGhpcy0+ZGVjaXNpb25zLT5zYXRpc2Z5KCRsaXRlcmFsKSkgewpjb250aW51ZTsKfQokc2VlblthYnMoJGxpdGVyYWwpXSA9IHRydWU7Cn0KCmZvcmVhY2ggKCR0aGlzLT5kZWNpc2lvbnMgYXMgJGRlY2lzaW9uKSB7CiRkZWNpc2lvbkxpdGVyYWwgPSAkZGVjaXNpb25bRGVjaXNpb25zOjpERUNJU0lPTl9MSVRFUkFMXTsKCgppZiAoIWlzc2V0KCRzZWVuW2FicygkZGVjaXNpb25MaXRlcmFsKV0pKSB7CmNvbnRpbnVlOwp9Cgokd2h5ID0gJGRlY2lzaW9uW0RlY2lzaW9uczo6REVDSVNJT05fUkVBU09OXTsKCiRwcm9ibGVtLT5hZGRSdWxlKCR3aHkpOwokdGhpcy0+YW5hbHl6ZVVuc29sdmFibGVSdWxlKCRwcm9ibGVtLCAkd2h5LCAkcnVsZVNlZW4pOwoKJGxpdGVyYWxzID0gJHdoeS0+Z2V0TGl0ZXJhbHMoKTsKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CgppZiAoJHRoaXMtPmRlY2lzaW9ucy0+c2F0aXNmeSgkbGl0ZXJhbCkpIHsKY29udGludWU7Cn0KJHNlZW5bYWJzKCRsaXRlcmFsKV0gPSB0cnVlOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBydW5TYXQoKTogdm9pZAp7CiR0aGlzLT5wcm9wYWdhdGVJbmRleCA9IDA7CgoKCgoKCgoKCgoKJGxldmVsID0gMTsKJHN5c3RlbUxldmVsID0gJGxldmVsICsgMTsKCndoaWxlICh0cnVlKSB7CmlmICgxID09PSAkbGV2ZWwpIHsKJGNvbmZsaWN0UnVsZSA9ICR0aGlzLT5wcm9wYWdhdGUoJGxldmVsKTsKaWYgKG51bGwgIT09ICRjb25mbGljdFJ1bGUpIHsKJHRoaXMtPmFuYWx5emVVbnNvbHZhYmxlKCRjb25mbGljdFJ1bGUpOwoKcmV0dXJuOwp9Cn0KCgppZiAoJGxldmVsIDwgJHN5c3RlbUxldmVsKSB7CiRpdGVyYXRvciA9ICR0aGlzLT5ydWxlcy0+Z2V0SXRlcmF0b3JGb3IoUnVsZVNldDo6VFlQRV9SRVFVRVNUKTsKZm9yZWFjaCAoJGl0ZXJhdG9yIGFzICRydWxlKSB7CmlmICgkcnVsZS0+aXNFbmFibGVkKCkpIHsKJGRlY2lzaW9uUXVldWUgPSBbXTsKJG5vbmVTYXRpc2ZpZWQgPSB0cnVlOwoKZm9yZWFjaCAoJHJ1bGUtPmdldExpdGVyYWxzKCkgYXMgJGxpdGVyYWwpIHsKaWYgKCR0aGlzLT5kZWNpc2lvbnMtPnNhdGlzZnkoJGxpdGVyYWwpKSB7CiRub25lU2F0aXNmaWVkID0gZmFsc2U7CmJyZWFrOwp9CmlmICgkbGl0ZXJhbCA+IDAgJiYgJHRoaXMtPmRlY2lzaW9ucy0+dW5kZWNpZGVkKCRsaXRlcmFsKSkgewokZGVjaXNpb25RdWV1ZVtdID0gJGxpdGVyYWw7Cn0KfQoKaWYgKCRub25lU2F0aXNmaWVkICYmIFxjb3VudCgkZGVjaXNpb25RdWV1ZSkgPiAwKSB7CgokcHJ1bmVkUXVldWUgPSBbXTsKZm9yZWFjaCAoJGRlY2lzaW9uUXVldWUgYXMgJGxpdGVyYWwpIHsKaWYgKGlzc2V0KCR0aGlzLT5maXhlZE1hcFthYnMoJGxpdGVyYWwpXSkpIHsKJHBydW5lZFF1ZXVlW10gPSAkbGl0ZXJhbDsKfQp9CmlmIChcY291bnQoJHBydW5lZFF1ZXVlKSA+IDApIHsKJGRlY2lzaW9uUXVldWUgPSAkcHJ1bmVkUXVldWU7Cn0KfQoKaWYgKCRub25lU2F0aXNmaWVkICYmIFxjb3VudCgkZGVjaXNpb25RdWV1ZSkgPiAwKSB7CiRvTGV2ZWwgPSAkbGV2ZWw7CiRsZXZlbCA9ICR0aGlzLT5zZWxlY3RBbmRJbnN0YWxsKCRsZXZlbCwgJGRlY2lzaW9uUXVldWUsICRydWxlKTsKCmlmICgwID09PSAkbGV2ZWwpIHsKcmV0dXJuOwp9CmlmICgkbGV2ZWwgPD0gJG9MZXZlbCkgewpicmVhazsKfQp9Cn0KfQoKJHN5c3RlbUxldmVsID0gJGxldmVsICsgMTsKCgokaXRlcmF0b3ItPm5leHQoKTsKaWYgKCRpdGVyYXRvci0+dmFsaWQoKSkgewpjb250aW51ZTsKfQp9CgppZiAoJGxldmVsIDwgJHN5c3RlbUxldmVsKSB7CiRzeXN0ZW1MZXZlbCA9ICRsZXZlbDsKfQoKJHJ1bGVzQ291bnQgPSBcY291bnQoJHRoaXMtPnJ1bGVzKTsKJHBhc3MgPSAxOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdMb29raW5nIGF0IGFsbCBydWxlcy4nLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwpmb3IgKCRpID0gMCwgJG4gPSAwOyAkbiA8ICRydWxlc0NvdW50OyAkaSsrLCAkbisrKSB7CmlmICgkaSA9PT0gJHJ1bGVzQ291bnQpIHsKaWYgKDEgPT09ICRwYXNzKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiU29tZXRoaW5nJ3MgY2hhbmdlZCwgbG9va2luZyBhdCBhbGwgcnVsZXMgYWdhaW4gKHBhc3MgIyRwYXNzKSIsIGZhbHNlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9IGVsc2UgewokdGhpcy0+aW8tPm92ZXJ3cml0ZUVycm9yKCJTb21ldGhpbmcncyBjaGFuZ2VkLCBsb29raW5nIGF0IGFsbCBydWxlcyBhZ2FpbiAocGFzcyAjJHBhc3MpIiwgZmFsc2UsIG51bGwsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0KCiRpID0gMDsKJHBhc3MrKzsKfQoKJHJ1bGUgPSAkdGhpcy0+cnVsZXMtPnJ1bGVCeUlkWyRpXTsKJGxpdGVyYWxzID0gJHJ1bGUtPmdldExpdGVyYWxzKCk7CgppZiAoJHJ1bGUtPmlzRGlzYWJsZWQoKSkgewpjb250aW51ZTsKfQoKJGRlY2lzaW9uUXVldWUgPSBbXTsKCgoKCgoKCmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewppZiAoJGxpdGVyYWwgPD0gMCkgewppZiAoISR0aGlzLT5kZWNpc2lvbnMtPmRlY2lkZWRJbnN0YWxsKCRsaXRlcmFsKSkgewpjb250aW51ZSAyOyAKfQp9IGVsc2UgewppZiAoJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaWRlZEluc3RhbGwoJGxpdGVyYWwpKSB7CmNvbnRpbnVlIDI7IAp9CmlmICgkdGhpcy0+ZGVjaXNpb25zLT51bmRlY2lkZWQoJGxpdGVyYWwpKSB7CiRkZWNpc2lvblF1ZXVlW10gPSAkbGl0ZXJhbDsKfQp9Cn0KCgppZiAoXGNvdW50KCRkZWNpc2lvblF1ZXVlKSA8IDIpIHsKY29udGludWU7Cn0KCiRsZXZlbCA9ICR0aGlzLT5zZWxlY3RBbmRJbnN0YWxsKCRsZXZlbCwgJGRlY2lzaW9uUXVldWUsICRydWxlKTsKCmlmICgwID09PSAkbGV2ZWwpIHsKcmV0dXJuOwp9CgoKJHJ1bGVzQ291bnQgPSBcY291bnQoJHRoaXMtPnJ1bGVzKTsKJG4gPSAtMTsKfQoKaWYgKCRsZXZlbCA8ICRzeXN0ZW1MZXZlbCkgewpjb250aW51ZTsKfQoKCmlmIChcY291bnQoJHRoaXMtPmJyYW5jaGVzKSA+IDApIHsKJGxhc3RMaXRlcmFsID0gbnVsbDsKJGxhc3RMZXZlbCA9IG51bGw7CiRsYXN0QnJhbmNoSW5kZXggPSAwOwokbGFzdEJyYW5jaE9mZnNldCA9IDA7Cgpmb3IgKCRpID0gXGNvdW50KCR0aGlzLT5icmFuY2hlcykgLSAxOyAkaSA+PSAwOyAkaS0tKSB7ClskbGl0ZXJhbHMsICRsXSA9ICR0aGlzLT5icmFuY2hlc1skaV07Cgpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJG9mZnNldCA9PiAkbGl0ZXJhbCkgewppZiAoJGxpdGVyYWwgPiAwICYmICR0aGlzLT5kZWNpc2lvbnMtPmRlY2lzaW9uTGV2ZWwoJGxpdGVyYWwpID4gJGwgKyAxKSB7CiRsYXN0TGl0ZXJhbCA9ICRsaXRlcmFsOwokbGFzdEJyYW5jaEluZGV4ID0gJGk7CiRsYXN0QnJhbmNoT2Zmc2V0ID0gJG9mZnNldDsKJGxhc3RMZXZlbCA9ICRsOwp9Cn0KfQoKaWYgKCRsYXN0TGl0ZXJhbCAhPT0gbnVsbCkgewphc3NlcnQoJGxhc3RMZXZlbCAhPT0gbnVsbCk7CnVuc2V0KCR0aGlzLT5icmFuY2hlc1skbGFzdEJyYW5jaEluZGV4XVtzZWxmOjpCUkFOQ0hfTElURVJBTFNdWyRsYXN0QnJhbmNoT2Zmc2V0XSk7CgokbGV2ZWwgPSAkbGFzdExldmVsOwokdGhpcy0+cmV2ZXJ0KCRsZXZlbCk7Cgokd2h5ID0gJHRoaXMtPmRlY2lzaW9ucy0+bGFzdFJlYXNvbigpOwoKJGxldmVsID0gJHRoaXMtPnNldFByb3BhZ2F0ZUxlYXJuKCRsZXZlbCwgJGxhc3RMaXRlcmFsLCAkd2h5KTsKCmlmICgkbGV2ZWwgPT09IDApIHsKcmV0dXJuOwp9Cgpjb250aW51ZTsKfQp9CgpicmVhazsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCgoKCmNsYXNzIFNvbHZlckJ1Z0V4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KAokbWVzc2FnZS4iXG5UaGlzIGV4Y2VwdGlvbiB3YXMgbW9zdCBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIENvbXBvc2VyLlxuIi4KIlBsZWFzZSByZXBvcnQgdGhlIGNvbW1hbmQgeW91IHJhbiwgdGhlIGV4YWN0IGVycm9yIHlvdSByZWNlaXZlZCwgYW5kIHlvdXIgY29tcG9zZXIuanNvbiBvbiBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY29tcG9zZXIvaXNzdWVzIC0gdGhhbmsgeW91IVxuIgopOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxVdGlsXEluaUhlbHBlcjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKCgoKCgoKY2xhc3MgU29sdmVyUHJvYmxlbXNFeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbgp7CnB1YmxpYyBjb25zdCBFUlJPUl9ERVBFTkRFTkNZX1JFU09MVVRJT05fRkFJTEVEID0gMjsKCgpwcm90ZWN0ZWQgJHByb2JsZW1zOwoKcHJvdGVjdGVkICRsZWFybmVkUG9vbDsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHByb2JsZW1zLCBhcnJheSAkbGVhcm5lZFBvb2wpCnsKJHRoaXMtPnByb2JsZW1zID0gJHByb2JsZW1zOwokdGhpcy0+bGVhcm5lZFBvb2wgPSAkbGVhcm5lZFBvb2w7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCdGYWlsZWQgcmVzb2x2aW5nIGRlcGVuZGVuY2llcyB3aXRoICcuXGNvdW50KCRwcm9ibGVtcykuJyBwcm9ibGVtcywgY2FsbCBnZXRQcmV0dHlTdHJpbmcgdG8gZ2V0IGZvcm1hdHRlZCBkZXRhaWxzJywgc2VsZjo6RVJST1JfREVQRU5ERU5DWV9SRVNPTFVUSU9OX0ZBSUxFRCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCwgYm9vbCAkaXNWZXJib3NlLCBib29sICRpc0RldkV4dHJhY3Rpb24gPSBmYWxzZSk6IHN0cmluZwp7CiRpbnN0YWxsZWRNYXAgPSAkcmVxdWVzdC0+Z2V0UHJlc2VudE1hcCh0cnVlKTsKJG1pc3NpbmdFeHRlbnNpb25zID0gW107CiRpc0NhdXNlZEJ5TG9jayA9IGZhbHNlOwoKJHByb2JsZW1zID0gW107CmZvcmVhY2ggKCR0aGlzLT5wcm9ibGVtcyBhcyAkcHJvYmxlbSkgewokcHJvYmxlbXNbXSA9ICRwcm9ibGVtLT5nZXRQcmV0dHlTdHJpbmcoJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCwgJGlzVmVyYm9zZSwgJGluc3RhbGxlZE1hcCwgJHRoaXMtPmxlYXJuZWRQb29sKS4iXG4iOwoKJG1pc3NpbmdFeHRlbnNpb25zID0gYXJyYXlfbWVyZ2UoJG1pc3NpbmdFeHRlbnNpb25zLCAkdGhpcy0+Z2V0RXh0ZW5zaW9uUHJvYmxlbXMoJHByb2JsZW0tPmdldFJlYXNvbnMoKSkpOwoKJGlzQ2F1c2VkQnlMb2NrID0gJGlzQ2F1c2VkQnlMb2NrIHx8ICRwcm9ibGVtLT5pc0NhdXNlZEJ5TG9jaygkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sKTsKfQoKJGkgPSAxOwokdGV4dCA9ICJcbiI7CmZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkcHJvYmxlbXMpIGFzICRwcm9ibGVtKSB7CiR0ZXh0IC49ICIgIFByb2JsZW0gIi4oJGkrKykuJHByb2JsZW07Cn0KCiRoaW50cyA9IFtdOwppZiAoISRpc0RldkV4dHJhY3Rpb24gJiYgKHN0cl9jb250YWlucygkdGV4dCwgJ2NvdWxkIG5vdCBiZSBmb3VuZCcpIHx8IHN0cl9jb250YWlucygkdGV4dCwgJ25vIG1hdGNoaW5nIHBhY2thZ2UgZm91bmQnKSkpIHsKJGhpbnRzW10gPSAiUG90ZW50aWFsIGNhdXNlczpcbiAtIEEgdHlwbyBpbiB0aGUgcGFja2FnZSBuYW1lXG4gLSBUaGUgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIGEgc3RhYmxlLWVub3VnaCB2ZXJzaW9uIGFjY29yZGluZyB0byB5b3VyIG1pbmltdW0tc3RhYmlsaXR5IHNldHRpbmdcbiAgIHNlZSA8aHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA0LXNjaGVtYS5tZCNtaW5pbXVtLXN0YWJpbGl0eT4gZm9yIG1vcmUgZGV0YWlscy5cbiAtIEl0J3MgYSBwcml2YXRlIHBhY2thZ2UgYW5kIHlvdSBmb3Jnb3QgdG8gYWRkIGEgY3VzdG9tIHJlcG9zaXRvcnkgdG8gZmluZCBpdFxuXG5SZWFkIDxodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kPiBmb3IgZnVydGhlciBjb21tb24gcHJvYmxlbXMuIjsKfQoKaWYgKFxjb3VudCgkbWlzc2luZ0V4dGVuc2lvbnMpID4gMCkgewokaGludHNbXSA9ICR0aGlzLT5jcmVhdGVFeHRlbnNpb25IaW50KCRtaXNzaW5nRXh0ZW5zaW9ucyk7Cn0KCmlmICgkaXNDYXVzZWRCeUxvY2sgJiYgISRpc0RldkV4dHJhY3Rpb24gJiYgISRyZXF1ZXN0LT5nZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVSb290RGVwZW5kZW5jaWVzKCkpIHsKJGhpbnRzW10gPSAiVXNlIHRoZSBvcHRpb24gLS13aXRoLWFsbC1kZXBlbmRlbmNpZXMgKC1XKSB0byBhbGxvdyB1cGdyYWRlcywgZG93bmdyYWRlcyBhbmQgcmVtb3ZhbHMgZm9yIHBhY2thZ2VzIGN1cnJlbnRseSBsb2NrZWQgdG8gc3BlY2lmaWMgdmVyc2lvbnMuIjsKfQoKaWYgKHN0cl9jb250YWlucygkdGV4dCwgJ2ZvdW5kIGNvbXBvc2VyLXBsdWdpbi1hcGlbMi4wLjBdIGJ1dCBpdCBkb2VzIG5vdCBtYXRjaCcpICYmIHN0cl9jb250YWlucygkdGV4dCwgJy0gb2NyYW1pdXMvcGFja2FnZS12ZXJzaW9ucycpKSB7CiRoaW50c1tdID0gIjx3YXJuaW5nPm9jcmFtaXVzL3BhY2thZ2UtdmVyc2lvbnMgb25seSBwcm92aWRlcyBzdXBwb3J0IGZvciBDb21wb3NlciAyIGluIDEuOCssIHdoaWNoIHJlcXVpcmVzIFBIUCA3LjQuPC93YXJuaW5nPlxuSWYgeW91IGNhbiBub3QgdXBncmFkZSBQSFAgeW91IGNhbiByZXF1aXJlIDxpbmZvPmNvbXBvc2VyL3BhY2thZ2UtdmVyc2lvbnMtZGVwcmVjYXRlZDwvaW5mbz4gdG8gcmVzb2x2ZSB0aGlzIHdpdGggUEhQIDcuMCsuIjsKfQoKaWYgKCFjbGFzc19leGlzdHMoJ1BIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlJywgZmFsc2UpKSB7CmlmIChzdHJfY29udGFpbnMoJHRleHQsICdmb3VuZCBjb21wb3Nlci1wbHVnaW4tYXBpWzIuMC4wXSBidXQgaXQgZG9lcyBub3QgbWF0Y2gnKSkgewokaGludHNbXSA9ICJZb3UgYXJlIHVzaW5nIENvbXBvc2VyIDIsIHdoaWNoIHNvbWUgb2YgeW91ciBwbHVnaW5zIHNlZW0gdG8gYmUgaW5jb21wYXRpYmxlIHdpdGguIE1ha2Ugc3VyZSB5b3UgdXBkYXRlIHlvdXIgcGx1Z2lucyBvciByZXBvcnQgYSBwbHVnaW4taXNzdWUgdG8gYXNrIHRoZW0gdG8gc3VwcG9ydCBDb21wb3NlciAyLiI7Cn0KfQoKaWYgKFxjb3VudCgkaGludHMpID4gMCkgewokdGV4dCAuPSAiXG4iIC4gaW1wbG9kZSgiXG5cbiIsICRoaW50cyk7Cn0KCnJldHVybiAkdGV4dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb2JsZW1zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wcm9ibGVtczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVFeHRlbnNpb25IaW50KGFycmF5ICRtaXNzaW5nRXh0ZW5zaW9ucyk6IHN0cmluZwp7CiRwYXRocyA9IEluaUhlbHBlcjo6Z2V0QWxsKCk7CgppZiAoJycgPT09ICRwYXRoc1swXSkgewppZiAoY291bnQoJHBhdGhzKSA9PT0gMSkgewpyZXR1cm4gJyc7Cn0KCmFycmF5X3NoaWZ0KCRwYXRocyk7Cn0KCiRpZ25vcmVFeHRlbnNpb25zQXJndW1lbnRzID0gaW1wbG9kZSgiICIsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRleHRlbnNpb24pIHsKcmV0dXJuICItLWlnbm9yZS1wbGF0Zm9ybS1yZXE9JGV4dGVuc2lvbiI7Cn0sIGFycmF5X3VuaXF1ZSgkbWlzc2luZ0V4dGVuc2lvbnMpKSk7CgokdGV4dCA9ICJUbyBlbmFibGUgZXh0ZW5zaW9ucywgdmVyaWZ5IHRoYXQgdGhleSBhcmUgZW5hYmxlZCBpbiB5b3VyIC5pbmkgZmlsZXM6XG4gICAgLSAiOwokdGV4dCAuPSBpbXBsb2RlKCJcbiAgICAtICIsICRwYXRocyk7CiR0ZXh0IC49ICJcbllvdSBjYW4gYWxzbyBydW4gYHBocCAtLWluaWAgaW4gYSB0ZXJtaW5hbCB0byBzZWUgd2hpY2ggZmlsZXMgYXJlIHVzZWQgYnkgUEhQIGluIENMSSBtb2RlLiI7CiR0ZXh0IC49ICJcbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gcnVuIENvbXBvc2VyIHdpdGggYCRpZ25vcmVFeHRlbnNpb25zQXJndW1lbnRzYCB0byB0ZW1wb3JhcmlseSBpZ25vcmUgdGhlc2UgcmVxdWlyZWQgZXh0ZW5zaW9ucy4iOwoKcmV0dXJuICR0ZXh0Owp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRFeHRlbnNpb25Qcm9ibGVtcyhhcnJheSAkcmVhc29uU2V0cyk6IGFycmF5CnsKJG1pc3NpbmdFeHRlbnNpb25zID0gW107CmZvcmVhY2ggKCRyZWFzb25TZXRzIGFzICRyZWFzb25TZXQpIHsKZm9yZWFjaCAoJHJlYXNvblNldCBhcyAkcnVsZSkgewokcmVxdWlyZWQgPSAkcnVsZS0+Z2V0UmVxdWlyZWRQYWNrYWdlKCk7CmlmIChudWxsICE9PSAkcmVxdWlyZWQgJiYgMCA9PT0gc3RycG9zKCRyZXF1aXJlZCwgJ2V4dC0nKSkgewokbWlzc2luZ0V4dGVuc2lvbnNbJHJlcXVpcmVkXSA9IDE7Cn0KfQp9CgpyZXR1cm4gYXJyYXlfa2V5cygkbWlzc2luZ0V4dGVuc2lvbnMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxPcGVyYXRpb25JbnRlcmZhY2U7CgoKCgoKY2xhc3MgVHJhbnNhY3Rpb24KewoKCgpwcm90ZWN0ZWQgJG9wZXJhdGlvbnM7CgoKCgoKcHJvdGVjdGVkICRwcmVzZW50UGFja2FnZXM7CgoKCgoKcHJvdGVjdGVkICRyZXN1bHRQYWNrYWdlTWFwOwoKCgoKcHJvdGVjdGVkICRyZXN1bHRQYWNrYWdlc0J5TmFtZSA9IFtdOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcHJlc2VudFBhY2thZ2VzLCBhcnJheSAkcmVzdWx0UGFja2FnZXMpCnsKJHRoaXMtPnByZXNlbnRQYWNrYWdlcyA9ICRwcmVzZW50UGFja2FnZXM7CiR0aGlzLT5zZXRSZXN1bHRQYWNrYWdlTWFwcygkcmVzdWx0UGFja2FnZXMpOwokdGhpcy0+b3BlcmF0aW9ucyA9ICR0aGlzLT5jYWxjdWxhdGVPcGVyYXRpb25zKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcGVyYXRpb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5vcGVyYXRpb25zOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldFJlc3VsdFBhY2thZ2VNYXBzKGFycmF5ICRyZXN1bHRQYWNrYWdlcyk6IHZvaWQKewokcGFja2FnZVNvcnQgPSBzdGF0aWMgZnVuY3Rpb24gKFBhY2thZ2VJbnRlcmZhY2UgJGEsIFBhY2thZ2VJbnRlcmZhY2UgJGIpOiBpbnQgewoKaWYgKCRhLT5nZXROYW1lKCkgPT09ICRiLT5nZXROYW1lKCkpIHsKaWYgKCRhIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICE9PSAkYiBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpyZXR1cm4gJGEgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgPyAtMSA6IDE7Cn0KCnJldHVybiBzdHJjbXAoJGItPmdldFZlcnNpb24oKSwgJGEtPmdldFZlcnNpb24oKSk7Cn0KCnJldHVybiBzdHJjbXAoJGItPmdldE5hbWUoKSwgJGEtPmdldE5hbWUoKSk7Cn07CgokdGhpcy0+cmVzdWx0UGFja2FnZU1hcCA9IFtdOwpmb3JlYWNoICgkcmVzdWx0UGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHRoaXMtPnJlc3VsdFBhY2thZ2VNYXBbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKCkgYXMgJG5hbWUpIHsKJHRoaXMtPnJlc3VsdFBhY2thZ2VzQnlOYW1lWyRuYW1lXVtdID0gJHBhY2thZ2U7Cn0KfQoKdWFzb3J0KCR0aGlzLT5yZXN1bHRQYWNrYWdlTWFwLCAkcGFja2FnZVNvcnQpOwpmb3JlYWNoICgkdGhpcy0+cmVzdWx0UGFja2FnZXNCeU5hbWUgYXMgJG5hbWUgPT4gJHBhY2thZ2VzKSB7CnVhc29ydCgkdGhpcy0+cmVzdWx0UGFja2FnZXNCeU5hbWVbJG5hbWVdLCAkcGFja2FnZVNvcnQpOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjYWxjdWxhdGVPcGVyYXRpb25zKCk6IGFycmF5CnsKJG9wZXJhdGlvbnMgPSBbXTsKCiRwcmVzZW50UGFja2FnZU1hcCA9IFtdOwokcmVtb3ZlTWFwID0gW107CiRwcmVzZW50QWxpYXNNYXAgPSBbXTsKJHJlbW92ZUFsaWFzTWFwID0gW107CmZvcmVhY2ggKCR0aGlzLT5wcmVzZW50UGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRwcmVzZW50QWxpYXNNYXBbJHBhY2thZ2UtPmdldE5hbWUoKS4nOjonLiRwYWNrYWdlLT5nZXRWZXJzaW9uKCldID0gJHBhY2thZ2U7CiRyZW1vdmVBbGlhc01hcFskcGFja2FnZS0+Z2V0TmFtZSgpLic6OicuJHBhY2thZ2UtPmdldFZlcnNpb24oKV0gPSAkcGFja2FnZTsKfSBlbHNlIHsKJHByZXNlbnRQYWNrYWdlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHBhY2thZ2U7CiRyZW1vdmVNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkcGFja2FnZTsKfQp9Cgokc3RhY2sgPSAkdGhpcy0+Z2V0Um9vdFBhY2thZ2VzKCk7CgokdmlzaXRlZCA9IFtdOwokcHJvY2Vzc2VkID0gW107Cgp3aGlsZSAoXGNvdW50KCRzdGFjaykgPiAwKSB7CiRwYWNrYWdlID0gYXJyYXlfcG9wKCRzdGFjayk7CgppZiAoaXNzZXQoJHByb2Nlc3NlZFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSkpIHsKY29udGludWU7Cn0KCmlmICghaXNzZXQoJHZpc2l0ZWRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0pKSB7CiR2aXNpdGVkW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldID0gdHJ1ZTsKCiRzdGFja1tdID0gJHBhY2thZ2U7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokc3RhY2tbXSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0gZWxzZSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiRwb3NzaWJsZVJlcXVpcmVzID0gJHRoaXMtPmdldFByb3ZpZGVyc0luUmVzdWx0KCRsaW5rKTsKCmZvcmVhY2ggKCRwb3NzaWJsZVJlcXVpcmVzIGFzICRyZXF1aXJlKSB7CiRzdGFja1tdID0gJHJlcXVpcmU7Cn0KfQp9Cn0gZWxzZWlmICghaXNzZXQoJHByb2Nlc3NlZFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSkpIHsKJHByb2Nlc3NlZFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9IHRydWU7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJGFsaWFzS2V5ID0gJHBhY2thZ2UtPmdldE5hbWUoKS4nOjonLiRwYWNrYWdlLT5nZXRWZXJzaW9uKCk7CmlmIChpc3NldCgkcHJlc2VudEFsaWFzTWFwWyRhbGlhc0tleV0pKSB7CnVuc2V0KCRyZW1vdmVBbGlhc01hcFskYWxpYXNLZXldKTsKfSBlbHNlIHsKJG9wZXJhdGlvbnNbXSA9IG5ldyBPcGVyYXRpb25cTWFya0FsaWFzSW5zdGFsbGVkT3BlcmF0aW9uKCRwYWNrYWdlKTsKfQp9IGVsc2UgewppZiAoaXNzZXQoJHByZXNlbnRQYWNrYWdlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewokc291cmNlID0gJHByZXNlbnRQYWNrYWdlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldOwoKCgppZiAoJHBhY2thZ2UtPmdldFZlcnNpb24oKSAhPT0gJHByZXNlbnRQYWNrYWdlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldLT5nZXRWZXJzaW9uKCkgfHwKJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSAhPT0gJHByZXNlbnRQYWNrYWdlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldLT5nZXREaXN0UmVmZXJlbmNlKCkgfHwKJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpICE9PSAkcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0tPmdldFNvdXJjZVJlZmVyZW5jZSgpCikgewokb3BlcmF0aW9uc1tdID0gbmV3IE9wZXJhdGlvblxVcGRhdGVPcGVyYXRpb24oJHNvdXJjZSwgJHBhY2thZ2UpOwp9CnVuc2V0KCRyZW1vdmVNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0pOwp9IGVsc2Ugewokb3BlcmF0aW9uc1tdID0gbmV3IE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uKCRwYWNrYWdlKTsKdW5zZXQoJHJlbW92ZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXSk7Cn0KfQp9Cn0KCmZvcmVhY2ggKCRyZW1vdmVNYXAgYXMgJG5hbWUgPT4gJHBhY2thZ2UpIHsKYXJyYXlfdW5zaGlmdCgkb3BlcmF0aW9ucywgbmV3IE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb24oJHBhY2thZ2UpKTsKfQpmb3JlYWNoICgkcmVtb3ZlQWxpYXNNYXAgYXMgJG5hbWVWZXJzaW9uID0+ICRwYWNrYWdlKSB7CiRvcGVyYXRpb25zW10gPSBuZXcgT3BlcmF0aW9uXE1hcmtBbGlhc1VuaW5zdGFsbGVkT3BlcmF0aW9uKCRwYWNrYWdlKTsKfQoKJG9wZXJhdGlvbnMgPSAkdGhpcy0+bW92ZVBsdWdpbnNUb0Zyb250KCRvcGVyYXRpb25zKTsKCgokb3BlcmF0aW9ucyA9ICR0aGlzLT5tb3ZlVW5pbnN0YWxsc1RvRnJvbnQoJG9wZXJhdGlvbnMpOwoKCgoKCgoKCgoKCgoKCgoKCgoKcmV0dXJuICR0aGlzLT5vcGVyYXRpb25zID0gJG9wZXJhdGlvbnM7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFJvb3RQYWNrYWdlcygpOiBhcnJheQp7CiRyb290cyA9ICR0aGlzLT5yZXN1bHRQYWNrYWdlTWFwOwoKZm9yZWFjaCAoJHRoaXMtPnJlc3VsdFBhY2thZ2VNYXAgYXMgJHBhY2thZ2VIYXNoID0+ICRwYWNrYWdlKSB7CmlmICghaXNzZXQoJHJvb3RzWyRwYWNrYWdlSGFzaF0pKSB7CmNvbnRpbnVlOwp9Cgpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgewokcG9zc2libGVSZXF1aXJlcyA9ICR0aGlzLT5nZXRQcm92aWRlcnNJblJlc3VsdCgkbGluayk7Cgpmb3JlYWNoICgkcG9zc2libGVSZXF1aXJlcyBhcyAkcmVxdWlyZSkgewppZiAoJHJlcXVpcmUgIT09ICRwYWNrYWdlKSB7CnVuc2V0KCRyb290c1tzcGxfb2JqZWN0X2hhc2goJHJlcXVpcmUpXSk7Cn0KfQp9Cn0KCnJldHVybiAkcm9vdHM7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQcm92aWRlcnNJblJlc3VsdChMaW5rICRsaW5rKTogYXJyYXkKewppZiAoIWlzc2V0KCR0aGlzLT5yZXN1bHRQYWNrYWdlc0J5TmFtZVskbGluay0+Z2V0VGFyZ2V0KCldKSkgewpyZXR1cm4gW107Cn0KCnJldHVybiAkdGhpcy0+cmVzdWx0UGFja2FnZXNCeU5hbWVbJGxpbmstPmdldFRhcmdldCgpXTsKfQoKCgoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbW92ZVBsdWdpbnNUb0Zyb250KGFycmF5ICRvcGVyYXRpb25zKTogYXJyYXkKewokZGxNb2RpZnlpbmdQbHVnaW5zTm9EZXBzID0gW107CiRkbE1vZGlmeWluZ1BsdWdpbnNXaXRoRGVwcyA9IFtdOwokZGxNb2RpZnlpbmdQbHVnaW5SZXF1aXJlcyA9IFtdOwokcGx1Z2luc05vRGVwcyA9IFtdOwokcGx1Z2luc1dpdGhEZXBzID0gW107CiRwbHVnaW5SZXF1aXJlcyA9IFtdOwoKZm9yZWFjaCAoYXJyYXlfcmV2ZXJzZSgkb3BlcmF0aW9ucywgdHJ1ZSkgYXMgJGlkeCA9PiAkb3ApIHsKaWYgKCRvcCBpbnN0YW5jZW9mIE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uKSB7CiRwYWNrYWdlID0gJG9wLT5nZXRQYWNrYWdlKCk7Cn0gZWxzZWlmICgkb3AgaW5zdGFuY2VvZiBPcGVyYXRpb25cVXBkYXRlT3BlcmF0aW9uKSB7CiRwYWNrYWdlID0gJG9wLT5nZXRUYXJnZXRQYWNrYWdlKCk7Cn0gZWxzZSB7CmNvbnRpbnVlOwp9CgokZXh0cmEgPSAkcGFja2FnZS0+Z2V0RXh0cmEoKTsKJGlzRG93bmxvYWRzTW9kaWZ5aW5nUGx1Z2luID0gJHBhY2thZ2UtPmdldFR5cGUoKSA9PT0gJ2NvbXBvc2VyLXBsdWdpbicgJiYgaXNzZXQoJGV4dHJhWydwbHVnaW4tbW9kaWZpZXMtZG93bmxvYWRzJ10pICYmICRleHRyYVsncGx1Z2luLW1vZGlmaWVzLWRvd25sb2FkcyddID09PSB0cnVlOwoKCmlmICgkaXNEb3dubG9hZHNNb2RpZnlpbmdQbHVnaW4gfHwgXGNvdW50KGFycmF5X2ludGVyc2VjdCgkcGFja2FnZS0+Z2V0TmFtZXMoKSwgJGRsTW9kaWZ5aW5nUGx1Z2luUmVxdWlyZXMpKSA+IDApIHsKCiRyZXF1aXJlcyA9IGFycmF5X2ZpbHRlcihhcnJheV9rZXlzKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpKSwgc3RhdGljIGZ1bmN0aW9uICgkcmVxKTogYm9vbCB7CnJldHVybiAhUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVxKTsKfSk7CgoKaWYgKCRpc0Rvd25sb2Fkc01vZGlmeWluZ1BsdWdpbiAmJiAwID09PSBcY291bnQoJHJlcXVpcmVzKSkgewoKYXJyYXlfdW5zaGlmdCgkZGxNb2RpZnlpbmdQbHVnaW5zTm9EZXBzLCAkb3ApOwp9IGVsc2UgewoKJGRsTW9kaWZ5aW5nUGx1Z2luUmVxdWlyZXMgPSBhcnJheV9tZXJnZSgkZGxNb2RpZnlpbmdQbHVnaW5SZXF1aXJlcywgJHJlcXVpcmVzKTsKCmFycmF5X3Vuc2hpZnQoJGRsTW9kaWZ5aW5nUGx1Z2luc1dpdGhEZXBzLCAkb3ApOwp9Cgp1bnNldCgkb3BlcmF0aW9uc1skaWR4XSk7CmNvbnRpbnVlOwp9CgoKJGlzUGx1Z2luID0gJHBhY2thZ2UtPmdldFR5cGUoKSA9PT0gJ2NvbXBvc2VyLXBsdWdpbicgfHwgJHBhY2thZ2UtPmdldFR5cGUoKSA9PT0gJ2NvbXBvc2VyLWluc3RhbGxlcic7CgoKaWYgKCRpc1BsdWdpbiB8fCBcY291bnQoYXJyYXlfaW50ZXJzZWN0KCRwYWNrYWdlLT5nZXROYW1lcygpLCAkcGx1Z2luUmVxdWlyZXMpKSA+IDApIHsKCiRyZXF1aXJlcyA9IGFycmF5X2ZpbHRlcihhcnJheV9rZXlzKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpKSwgc3RhdGljIGZ1bmN0aW9uICgkcmVxKTogYm9vbCB7CnJldHVybiAhUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVxKTsKfSk7CgoKaWYgKCRpc1BsdWdpbiAmJiAwID09PSBcY291bnQoJHJlcXVpcmVzKSkgewoKYXJyYXlfdW5zaGlmdCgkcGx1Z2luc05vRGVwcywgJG9wKTsKfSBlbHNlIHsKCiRwbHVnaW5SZXF1aXJlcyA9IGFycmF5X21lcmdlKCRwbHVnaW5SZXF1aXJlcywgJHJlcXVpcmVzKTsKCmFycmF5X3Vuc2hpZnQoJHBsdWdpbnNXaXRoRGVwcywgJG9wKTsKfQoKdW5zZXQoJG9wZXJhdGlvbnNbJGlkeF0pOwp9Cn0KCnJldHVybiBhcnJheV9tZXJnZSgkZGxNb2RpZnlpbmdQbHVnaW5zTm9EZXBzLCAkZGxNb2RpZnlpbmdQbHVnaW5zV2l0aERlcHMsICRwbHVnaW5zTm9EZXBzLCAkcGx1Z2luc1dpdGhEZXBzLCAkb3BlcmF0aW9ucyk7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1vdmVVbmluc3RhbGxzVG9Gcm9udChhcnJheSAkb3BlcmF0aW9ucyk6IGFycmF5CnsKJHVuaW5zdE9wcyA9IFtdOwpmb3JlYWNoICgkb3BlcmF0aW9ucyBhcyAkaWR4ID0+ICRvcCkgewppZiAoJG9wIGluc3RhbmNlb2YgT3BlcmF0aW9uXFVuaW5zdGFsbE9wZXJhdGlvbiB8fCAkb3AgaW5zdGFuY2VvZiBPcGVyYXRpb25cTWFya0FsaWFzVW5pbnN0YWxsZWRPcGVyYXRpb24pIHsKJHVuaW5zdE9wc1tdID0gJG9wOwp1bnNldCgkb3BlcmF0aW9uc1skaWR4XSk7Cn0KfQoKcmV0dXJuIGFycmF5X21lcmdlKCR1bmluc3RPcHMsICRvcGVyYXRpb25zKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRmluZGVyOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwoKCgoKCgoKCmFic3RyYWN0IGNsYXNzIEFyY2hpdmVEb3dubG9hZGVyIGV4dGVuZHMgRmlsZURvd25sb2FkZXIKewoKCgpwcm90ZWN0ZWQgJGNsZWFudXBFeGVjdXRlZCA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoc3RyaW5nICR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKdW5zZXQoJHRoaXMtPmNsZWFudXBFeGVjdXRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXSk7CgpyZXR1cm4gcGFyZW50OjpwcmVwYXJlKCR0eXBlLCAkcGFja2FnZSwgJHBhdGgsICRwcmV2UGFja2FnZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjbGVhbnVwKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CiR0aGlzLT5jbGVhbnVwRXhlY3V0ZWRbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSB0cnVlOwoKcmV0dXJuIHBhcmVudDo6Y2xlYW51cCgkdHlwZSwgJHBhY2thZ2UsICRwYXRoLCAkcHJldlBhY2thZ2UpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIGJvb2wgJG91dHB1dCA9IHRydWUpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIEluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkgLiAkdGhpcy0+Z2V0SW5zdGFsbE9wZXJhdGlvbkFwcGVuZGl4KCRwYWNrYWdlLCAkcGF0aCkpOwp9CgokdmVuZG9yRGlyID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJyk7CgoKCgppZiAoZmFsc2UgPT09IHN0cnBvcygkdGhpcy0+ZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkdmVuZG9yRGlyKSwgJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJHBhdGguRElSRUNUT1JZX1NFUEFSQVRPUikpKSB7CiR0aGlzLT5maWxlc3lzdGVtLT5lbXB0eURpcmVjdG9yeSgkcGF0aCk7Cn0KCmRvIHsKJHRlbXBvcmFyeURpciA9ICR2ZW5kb3JEaXIuJy9jb21wb3Nlci8nLmJpbjJoZXgocmFuZG9tX2J5dGVzKDQpKTsKfSB3aGlsZSAoaXNfZGlyKCR0ZW1wb3JhcnlEaXIpKTsKCiR0aGlzLT5hZGRDbGVhbnVwUGF0aCgkcGFja2FnZSwgJHRlbXBvcmFyeURpcik7CgoKaWYgKCFpc19kaXIoJHBhdGgpIHx8IHJlYWxwYXRoKCRwYXRoKSAhPT0gUGxhdGZvcm06OmdldEN3ZCgpKSB7CiR0aGlzLT5hZGRDbGVhbnVwUGF0aCgkcGFja2FnZSwgJHBhdGgpOwp9CgokdGhpcy0+ZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCR0ZW1wb3JhcnlEaXIpOwokZmlsZU5hbWUgPSAkdGhpcy0+Z2V0RmlsZU5hbWUoJHBhY2thZ2UsICRwYXRoKTsKCiRmaWxlc3lzdGVtID0gJHRoaXMtPmZpbGVzeXN0ZW07CgokY2xlYW51cCA9IGZ1bmN0aW9uICgpIHVzZSAoJHBhdGgsICRmaWxlc3lzdGVtLCAkdGVtcG9yYXJ5RGlyLCAkcGFja2FnZSkgewoKJHRoaXMtPmNsZWFyTGFzdENhY2hlV3JpdGUoJHBhY2thZ2UpOwoKCiRmaWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJHRlbXBvcmFyeURpcik7CmlmIChpc19kaXIoJHBhdGgpICYmIHJlYWxwYXRoKCRwYXRoKSAhPT0gUGxhdGZvcm06OmdldEN3ZCgpKSB7CiRmaWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJHBhdGgpOwp9CiR0aGlzLT5yZW1vdmVDbGVhbnVwUGF0aCgkcGFja2FnZSwgJHRlbXBvcmFyeURpcik7CiRyZWFscGF0aCA9IHJlYWxwYXRoKCRwYXRoKTsKaWYgKCRyZWFscGF0aCAhPT0gZmFsc2UpIHsKJHRoaXMtPnJlbW92ZUNsZWFudXBQYXRoKCRwYWNrYWdlLCAkcmVhbHBhdGgpOwp9Cn07Cgp0cnkgewokcHJvbWlzZSA9ICR0aGlzLT5leHRyYWN0KCRwYWNrYWdlLCAkZmlsZU5hbWUsICR0ZW1wb3JhcnlEaXIpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiRjbGVhbnVwKCk7CnRocm93ICRlOwp9CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkcGFja2FnZSwgJGZpbGVzeXN0ZW0sICRmaWxlTmFtZSwgJHRlbXBvcmFyeURpciwgJHBhdGgpOiBcUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlIHsKaWYgKGZpbGVfZXhpc3RzKCRmaWxlTmFtZSkpIHsKJGZpbGVzeXN0ZW0tPnVubGluaygkZmlsZU5hbWUpOwp9CgoKCgoKCgokZ2V0Rm9sZGVyQ29udGVudCA9IHN0YXRpYyBmdW5jdGlvbiAoJGRpcik6IGFycmF5IHsKJGZpbmRlciA9IEZpbmRlcjo6Y3JlYXRlKCkKLT5pZ25vcmVWQ1MoZmFsc2UpCi0+aWdub3JlRG90RmlsZXMoZmFsc2UpCi0+bm90TmFtZSgnLkRTX1N0b3JlJykKLT5kZXB0aCgwKQotPmluKCRkaXIpOwoKcmV0dXJuIGl0ZXJhdG9yX3RvX2FycmF5KCRmaW5kZXIpOwp9OwokcmVuYW1lUmVjdXJzaXZlbHkgPSBudWxsOwoKCgoKCgoKCgoKCiRyZW5hbWVSZWN1cnNpdmVseSA9IHN0YXRpYyBmdW5jdGlvbiAoJGZyb20sICR0bykgdXNlICgkZmlsZXN5c3RlbSwgJGdldEZvbGRlckNvbnRlbnQsICRwYWNrYWdlLCAmJHJlbmFtZVJlY3Vyc2l2ZWx5KSB7CiRjb250ZW50RGlyID0gJGdldEZvbGRlckNvbnRlbnQoJGZyb20pOwoKCmZvcmVhY2ggKCRjb250ZW50RGlyIGFzICRmaWxlKSB7CiRmaWxlID0gKHN0cmluZykgJGZpbGU7CmlmIChpc19kaXIoJHRvIC4gJy8nIC4gYmFzZW5hbWUoJGZpbGUpKSkgewppZiAoIWlzX2RpcigkZmlsZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdJbnN0YWxsaW5nICcuJHBhY2thZ2UuJyB3b3VsZCBsZWFkIHRvIG92ZXJ3cml0aW5nIHRoZSAnLiR0by4nLycuYmFzZW5hbWUoJGZpbGUpLicgZGlyZWN0b3J5IHdpdGggYSBmaWxlIGZyb20gdGhlIHBhY2thZ2UsIGludmFsaWQgb3BlcmF0aW9uLicpOwp9CiRyZW5hbWVSZWN1cnNpdmVseSgkZmlsZSwgJHRvIC4gJy8nIC4gYmFzZW5hbWUoJGZpbGUpKTsKfSBlbHNlIHsKJGZpbGVzeXN0ZW0tPnJlbmFtZSgkZmlsZSwgJHRvIC4gJy8nIC4gYmFzZW5hbWUoJGZpbGUpKTsKfQp9Cn07CgokcmVuYW1lQXNPbmUgPSBmYWxzZTsKaWYgKCFmaWxlX2V4aXN0cygkcGF0aCkpIHsKJHJlbmFtZUFzT25lID0gdHJ1ZTsKfSBlbHNlaWYgKCRmaWxlc3lzdGVtLT5pc0RpckVtcHR5KCRwYXRoKSkgewp0cnkgewppZiAoJGZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeVBocCgkcGF0aCkpIHsKJHJlbmFtZUFzT25lID0gdHJ1ZTsKfQp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewoKfQp9CgokY29udGVudERpciA9ICRnZXRGb2xkZXJDb250ZW50KCR0ZW1wb3JhcnlEaXIpOwokc2luZ2xlRGlyQXRUb3BMZXZlbCA9IDEgPT09IGNvdW50KCRjb250ZW50RGlyKSAmJiBpc19kaXIoKHN0cmluZykgcmVzZXQoJGNvbnRlbnREaXIpKTsKCmlmICgkcmVuYW1lQXNPbmUpIHsKCmlmICgkc2luZ2xlRGlyQXRUb3BMZXZlbCkgewokZXh0cmFjdGVkRGlyID0gKHN0cmluZykgcmVzZXQoJGNvbnRlbnREaXIpOwp9IGVsc2UgewokZXh0cmFjdGVkRGlyID0gJHRlbXBvcmFyeURpcjsKfQokZmlsZXN5c3RlbS0+cmVuYW1lKCRleHRyYWN0ZWREaXIsICRwYXRoKTsKfSBlbHNlIHsKCiRmcm9tID0gJHRlbXBvcmFyeURpcjsKaWYgKCRzaW5nbGVEaXJBdFRvcExldmVsKSB7CiRmcm9tID0gKHN0cmluZykgcmVzZXQoJGNvbnRlbnREaXIpOwp9CgokcmVuYW1lUmVjdXJzaXZlbHkoJGZyb20sICRwYXRoKTsKfQoKJHByb21pc2UgPSAkZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5QXN5bmMoJHRlbXBvcmFyeURpcik7CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkcGFja2FnZSwgJHBhdGgsICR0ZW1wb3JhcnlEaXIpIHsKJHRoaXMtPnJlbW92ZUNsZWFudXBQYXRoKCRwYWNrYWdlLCAkdGVtcG9yYXJ5RGlyKTsKJHRoaXMtPnJlbW92ZUNsZWFudXBQYXRoKCRwYWNrYWdlLCAkcGF0aCk7Cn0pOwp9LCBzdGF0aWMgZnVuY3Rpb24gKCRlKSB1c2UgKCRjbGVhbnVwKSB7CiRjbGVhbnVwKCk7Cgp0aHJvdyAkZTsKfSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRJbnN0YWxsT3BlcmF0aW9uQXBwZW5kaXgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKcmV0dXJuICc6IEV4dHJhY3RpbmcgYXJjaGl2ZSc7Cn0KCgoKCgoKCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZmlsZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmludGVyZmFjZSBDaGFuZ2VSZXBvcnRJbnRlcmZhY2UKewoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcRXhjZXB0aW9uXElycmVjb3ZlcmFibGVEb3dubG9hZEV4Y2VwdGlvbjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgRG93bmxvYWRNYW5hZ2VyCnsKCnByaXZhdGUgJGlvOwoKcHJpdmF0ZSAkcHJlZmVyRGlzdCA9IGZhbHNlOwoKcHJpdmF0ZSAkcHJlZmVyU291cmNlOwoKcHJpdmF0ZSAkcGFja2FnZVByZWZlcmVuY2VzID0gW107Cgpwcml2YXRlICRmaWxlc3lzdGVtOwoKcHJpdmF0ZSAkZG93bmxvYWRlcnMgPSBbXTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBib29sICRwcmVmZXJTb3VyY2UgPSBmYWxzZSwgP0ZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0gPSBudWxsKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPnByZWZlclNvdXJjZSA9ICRwcmVmZXJTb3VyY2U7CiR0aGlzLT5maWxlc3lzdGVtID0gJGZpbGVzeXN0ZW0gPzogbmV3IEZpbGVzeXN0ZW0oKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlclNvdXJjZShib29sICRwcmVmZXJTb3VyY2UpOiBzZWxmCnsKJHRoaXMtPnByZWZlclNvdXJjZSA9ICRwcmVmZXJTb3VyY2U7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmVmZXJEaXN0KGJvb2wgJHByZWZlckRpc3QpOiBzZWxmCnsKJHRoaXMtPnByZWZlckRpc3QgPSAkcHJlZmVyRGlzdDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmVmZXJlbmNlcyhhcnJheSAkcHJlZmVyZW5jZXMpOiBzZWxmCnsKJHRoaXMtPnBhY2thZ2VQcmVmZXJlbmNlcyA9ICRwcmVmZXJlbmNlczsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREb3dubG9hZGVyKHN0cmluZyAkdHlwZSwgRG93bmxvYWRlckludGVyZmFjZSAkZG93bmxvYWRlcik6IHNlbGYKewokdHlwZSA9IHN0cnRvbG93ZXIoJHR5cGUpOwokdGhpcy0+ZG93bmxvYWRlcnNbJHR5cGVdID0gJGRvd25sb2FkZXI7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREb3dubG9hZGVyKHN0cmluZyAkdHlwZSk6IERvd25sb2FkZXJJbnRlcmZhY2UKewokdHlwZSA9IHN0cnRvbG93ZXIoJHR5cGUpOwppZiAoIWlzc2V0KCR0aGlzLT5kb3dubG9hZGVyc1skdHlwZV0pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1Vua25vd24gZG93bmxvYWRlciB0eXBlOiAlcy4gQXZhaWxhYmxlIHR5cGVzOiAlcy4nLCAkdHlwZSwgaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKCR0aGlzLT5kb3dubG9hZGVycykpKSk7Cn0KCnJldHVybiAkdGhpcy0+ZG93bmxvYWRlcnNbJHR5cGVdOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREb3dubG9hZGVyRm9yUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogP0Rvd25sb2FkZXJJbnRlcmZhY2UKewokaW5zdGFsbGF0aW9uU291cmNlID0gJHBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpOwoKaWYgKCdtZXRhcGFja2FnZScgPT09ICRwYWNrYWdlLT5nZXRUeXBlKCkpIHsKcmV0dXJuIG51bGw7Cn0KCmlmICgnZGlzdCcgPT09ICRpbnN0YWxsYXRpb25Tb3VyY2UpIHsKJGRvd25sb2FkZXIgPSAkdGhpcy0+Z2V0RG93bmxvYWRlcigkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKSk7Cn0gZWxzZWlmICgnc291cmNlJyA9PT0gJGluc3RhbGxhdGlvblNvdXJjZSkgewokZG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyKCRwYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCkpOwp9IGVsc2Ugewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigKJ1BhY2thZ2UgJy4kcGFja2FnZS4nIGRvZXMgbm90IGhhdmUgYW4gaW5zdGFsbGF0aW9uIHNvdXJjZSBzZXQnCik7Cn0KCmlmICgkaW5zdGFsbGF0aW9uU291cmNlICE9PSAkZG93bmxvYWRlci0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKAonRG93bmxvYWRlciAiJXMiIGlzIGEgJXMgdHlwZSBkb3dubG9hZGVyIGFuZCBjYW4gbm90IGJlIHVzZWQgdG8gZG93bmxvYWQgJXMgZm9yIHBhY2thZ2UgJXMnLApnZXRfY2xhc3MoJGRvd25sb2FkZXIpLAokZG93bmxvYWRlci0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCksCiRpbnN0YWxsYXRpb25Tb3VyY2UsCiRwYWNrYWdlCikpOwp9CgpyZXR1cm4gJGRvd25sb2FkZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREb3dubG9hZGVyVHlwZShEb3dubG9hZGVySW50ZXJmYWNlICRkb3dubG9hZGVyKTogc3RyaW5nCnsKcmV0dXJuIGFycmF5X3NlYXJjaCgkZG93bmxvYWRlciwgJHRoaXMtPmRvd25sb2FkZXJzKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICR0YXJnZXREaXIsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRhcmdldERpciA9ICR0aGlzLT5ub3JtYWxpemVUYXJnZXREaXIoJHRhcmdldERpcik7CiR0aGlzLT5maWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoZGlybmFtZSgkdGFyZ2V0RGlyKSk7Cgokc291cmNlcyA9ICR0aGlzLT5nZXRBdmFpbGFibGVTb3VyY2VzKCRwYWNrYWdlLCAkcHJldlBhY2thZ2UpOwoKJGlvID0gJHRoaXMtPmlvOwoKJGRvd25sb2FkID0gZnVuY3Rpb24gKCRyZXRyeSA9IGZhbHNlKSB1c2UgKCYkc291cmNlcywgJGlvLCAkcGFja2FnZSwgJHRhcmdldERpciwgJiRkb3dubG9hZCwgJHByZXZQYWNrYWdlKSB7CiRzb3VyY2UgPSBhcnJheV9zaGlmdCgkc291cmNlcyk7CmlmICgkcmV0cnkpIHsKJGlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+Tm93IHRyeWluZyB0byBkb3dubG9hZCBmcm9tICcgLiAkc291cmNlIC4gJzwvd2FybmluZz4nKTsKfQokcGFja2FnZS0+c2V0SW5zdGFsbGF0aW9uU291cmNlKCRzb3VyY2UpOwoKJGRvd25sb2FkZXIgPSAkdGhpcy0+Z2V0RG93bmxvYWRlckZvclBhY2thZ2UoJHBhY2thZ2UpOwppZiAoISRkb3dubG9hZGVyKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgokaGFuZGxlRXJyb3IgPSBzdGF0aWMgZnVuY3Rpb24gKCRlKSB1c2UgKCRzb3VyY2VzLCAkc291cmNlLCAkcGFja2FnZSwgJGlvLCAkZG93bmxvYWQpIHsKaWYgKCRlIGluc3RhbmNlb2YgXFJ1bnRpbWVFeGNlcHRpb24gJiYgISRlIGluc3RhbmNlb2YgSXJyZWNvdmVyYWJsZURvd25sb2FkRXhjZXB0aW9uKSB7CmlmICghJHNvdXJjZXMpIHsKdGhyb3cgJGU7Cn0KCiRpby0+d3JpdGVFcnJvcigKJyAgICA8d2FybmluZz5GYWlsZWQgdG8gZG93bmxvYWQgJy4KJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4KJyBmcm9tICcgLiAkc291cmNlIC4gJzogJy4KJGUtPmdldE1lc3NhZ2UoKS4nPC93YXJuaW5nPicKKTsKCnJldHVybiAkZG93bmxvYWQodHJ1ZSk7Cn0KCnRocm93ICRlOwp9OwoKdHJ5IHsKJHJlc3VsdCA9ICRkb3dubG9hZGVyLT5kb3dubG9hZCgkcGFja2FnZSwgJHRhcmdldERpciwgJHByZXZQYWNrYWdlKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewpyZXR1cm4gJGhhbmRsZUVycm9yKCRlKTsKfQoKJHJlcyA9ICRyZXN1bHQtPnRoZW4oc3RhdGljIGZ1bmN0aW9uICgkcmVzKSB7CnJldHVybiAkcmVzOwp9LCAkaGFuZGxlRXJyb3IpOwoKcmV0dXJuICRyZXM7Cn07CgpyZXR1cm4gJGRvd25sb2FkKCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICR0YXJnZXREaXIsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRhcmdldERpciA9ICR0aGlzLT5ub3JtYWxpemVUYXJnZXREaXIoJHRhcmdldERpcik7CiRkb3dubG9hZGVyID0gJHRoaXMtPmdldERvd25sb2FkZXJGb3JQYWNrYWdlKCRwYWNrYWdlKTsKaWYgKCRkb3dubG9hZGVyKSB7CnJldHVybiAkZG93bmxvYWRlci0+cHJlcGFyZSgkdHlwZSwgJHBhY2thZ2UsICR0YXJnZXREaXIsICRwcmV2UGFja2FnZSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICR0YXJnZXREaXIpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRhcmdldERpciA9ICR0aGlzLT5ub3JtYWxpemVUYXJnZXREaXIoJHRhcmdldERpcik7CiRkb3dubG9hZGVyID0gJHRoaXMtPmdldERvd25sb2FkZXJGb3JQYWNrYWdlKCRwYWNrYWdlKTsKaWYgKCRkb3dubG9hZGVyKSB7CnJldHVybiAkZG93bmxvYWRlci0+aW5zdGFsbCgkcGFja2FnZSwgJHRhcmdldERpcik7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkdGFyZ2V0RGlyKTogUHJvbWlzZUludGVyZmFjZQp7CiR0YXJnZXREaXIgPSAkdGhpcy0+bm9ybWFsaXplVGFyZ2V0RGlyKCR0YXJnZXREaXIpOwokZG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyRm9yUGFja2FnZSgkdGFyZ2V0KTsKJGluaXRpYWxEb3dubG9hZGVyID0gJHRoaXMtPmdldERvd25sb2FkZXJGb3JQYWNrYWdlKCRpbml0aWFsKTsKCgppZiAoISRpbml0aWFsRG93bmxvYWRlciAmJiAhJGRvd25sb2FkZXIpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgppZiAoISRkb3dubG9hZGVyKSB7CnJldHVybiAkaW5pdGlhbERvd25sb2FkZXItPnJlbW92ZSgkaW5pdGlhbCwgJHRhcmdldERpcik7Cn0KCiRpbml0aWFsVHlwZSA9ICR0aGlzLT5nZXREb3dubG9hZGVyVHlwZSgkaW5pdGlhbERvd25sb2FkZXIpOwokdGFyZ2V0VHlwZSA9ICR0aGlzLT5nZXREb3dubG9hZGVyVHlwZSgkZG93bmxvYWRlcik7CmlmICgkaW5pdGlhbFR5cGUgPT09ICR0YXJnZXRUeXBlKSB7CnRyeSB7CnJldHVybiAkZG93bmxvYWRlci0+dXBkYXRlKCRpbml0aWFsLCAkdGFyZ2V0LCAkdGFyZ2V0RGlyKTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewp0aHJvdyAkZTsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj4gICAgVXBkYXRlIGZhaWxlZCAoJy4kZS0+Z2V0TWVzc2FnZSgpLicpPC9lcnJvcj4nKTsKaWYgKCEkdGhpcy0+aW8tPmFza0NvbmZpcm1hdGlvbignICAgIFdvdWxkIHlvdSBsaWtlIHRvIHRyeSByZWluc3RhbGxpbmcgdGhlIHBhY2thZ2UgaW5zdGVhZCBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcpKSB7CnRocm93ICRlOwp9Cn0KfQoKCgokcHJvbWlzZSA9ICRpbml0aWFsRG93bmxvYWRlci0+cmVtb3ZlKCRpbml0aWFsLCAkdGFyZ2V0RGlyKTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoJHJlcykgdXNlICgkdGFyZ2V0LCAkdGFyZ2V0RGlyKTogUHJvbWlzZUludGVyZmFjZSB7CnJldHVybiAkdGhpcy0+aW5zdGFsbCgkdGFyZ2V0LCAkdGFyZ2V0RGlyKTsKfSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkdGFyZ2V0RGlyKTogUHJvbWlzZUludGVyZmFjZQp7CiR0YXJnZXREaXIgPSAkdGhpcy0+bm9ybWFsaXplVGFyZ2V0RGlyKCR0YXJnZXREaXIpOwokZG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyRm9yUGFja2FnZSgkcGFja2FnZSk7CmlmICgkZG93bmxvYWRlcikgewpyZXR1cm4gJGRvd25sb2FkZXItPnJlbW92ZSgkcGFja2FnZSwgJHRhcmdldERpcik7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cChzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkdGFyZ2V0RGlyLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CiR0YXJnZXREaXIgPSAkdGhpcy0+bm9ybWFsaXplVGFyZ2V0RGlyKCR0YXJnZXREaXIpOwokZG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyRm9yUGFja2FnZSgkcGFja2FnZSk7CmlmICgkZG93bmxvYWRlcikgewpyZXR1cm4gJGRvd25sb2FkZXItPmNsZWFudXAoJHR5cGUsICRwYWNrYWdlLCAkdGFyZ2V0RGlyLCAkcHJldlBhY2thZ2UpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VJbnN0YWxsUHJlZmVyZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogc3RyaW5nCnsKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VQcmVmZXJlbmNlcyBhcyAkcGF0dGVybiA9PiAkcHJlZmVyZW5jZSkgewokcGF0dGVybiA9ICd7Xicuc3RyX3JlcGxhY2UoJ1xcKicsICcuKicsIHByZWdfcXVvdGUoJHBhdHRlcm4pKS4nJH1pJzsKaWYgKFByZWc6OmlzTWF0Y2goJHBhdHRlcm4sICRwYWNrYWdlLT5nZXROYW1lKCkpKSB7CmlmICgnZGlzdCcgPT09ICRwcmVmZXJlbmNlIHx8ICghJHBhY2thZ2UtPmlzRGV2KCkgJiYgJ2F1dG8nID09PSAkcHJlZmVyZW5jZSkpIHsKcmV0dXJuICdkaXN0JzsKfQoKcmV0dXJuICdzb3VyY2UnOwp9Cn0KCnJldHVybiAkcGFja2FnZS0+aXNEZXYoKSA/ICdzb3VyY2UnIDogJ2Rpc3QnOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRBdmFpbGFibGVTb3VyY2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBhcnJheQp7CiRzb3VyY2VUeXBlID0gJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKTsKJGRpc3RUeXBlID0gJHBhY2thZ2UtPmdldERpc3RUeXBlKCk7CgoKJHNvdXJjZXMgPSBbXTsKaWYgKCRzb3VyY2VUeXBlKSB7CiRzb3VyY2VzW10gPSAnc291cmNlJzsKfQppZiAoJGRpc3RUeXBlKSB7CiRzb3VyY2VzW10gPSAnZGlzdCc7Cn0KCmlmIChlbXB0eSgkc291cmNlcykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgJy4kcGFja2FnZS4nIG11c3QgaGF2ZSBhIHNvdXJjZSBvciBkaXN0IHNwZWNpZmllZCcpOwp9CgppZiAoCiRwcmV2UGFja2FnZQoKJiYgaW5fYXJyYXkoJHByZXZQYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSwgJHNvdXJjZXMsIHRydWUpCgomJiAhKCEkcHJldlBhY2thZ2UtPmlzRGV2KCkgJiYgJHByZXZQYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSA9PT0gJ2Rpc3QnICYmICRwYWNrYWdlLT5pc0RldigpKQopIHsKJHByZXZTb3VyY2UgPSAkcHJldlBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpOwp1c29ydCgkc291cmNlcywgc3RhdGljIGZ1bmN0aW9uICgkYSwgJGIpIHVzZSAoJHByZXZTb3VyY2UpOiBpbnQgewpyZXR1cm4gJGEgPT09ICRwcmV2U291cmNlID8gLTEgOiAxOwp9KTsKCnJldHVybiAkc291cmNlczsKfQoKCmlmICghJHRoaXMtPnByZWZlclNvdXJjZSAmJiAoJHRoaXMtPnByZWZlckRpc3QgfHwgJ2Rpc3QnID09PSAkdGhpcy0+cmVzb2x2ZVBhY2thZ2VJbnN0YWxsUHJlZmVyZW5jZSgkcGFja2FnZSkpKSB7CiRzb3VyY2VzID0gYXJyYXlfcmV2ZXJzZSgkc291cmNlcyk7Cn0KCnJldHVybiAkc291cmNlczsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG5vcm1hbGl6ZVRhcmdldERpcihzdHJpbmcgJGRpcik6IHN0cmluZwp7CmlmICgkZGlyID09PSAnXFwnIHx8ICRkaXIgPT09ICcvJykgewpyZXR1cm4gJGRpcjsKfQoKcmV0dXJuIHJ0cmltKCRkaXIsICdcXC8nKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCmludGVyZmFjZSBEb3dubG9hZGVySW50ZXJmYWNlCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGF0aW9uU291cmNlKCk6IHN0cmluZzsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZShzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhbnVwKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmludGVyZmFjZSBEdmNzRG93bmxvYWRlckludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VW5wdXNoZWRDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmc7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXE51bGxJTzsKdXNlIENvbXBvc2VyXEV4Y2VwdGlvblxJcnJlY292ZXJhYmxlRG93bmxvYWRFeGNlcHRpb247CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBhcmVyXENvbXBhcmVyOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVcGRhdGVPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVuaW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxQbHVnaW5cUG9zdEZpbGVEb3dubG9hZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFByZUZpbGVEb3dubG9hZEV2ZW50Owp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcVXJsIGFzIFVybFV0aWw7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgoKY2xhc3MgRmlsZURvd25sb2FkZXIgaW1wbGVtZW50cyBEb3dubG9hZGVySW50ZXJmYWNlLCBDaGFuZ2VSZXBvcnRJbnRlcmZhY2UKewoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkY29uZmlnOwoKcHJvdGVjdGVkICRodHRwRG93bmxvYWRlcjsKCnByb3RlY3RlZCAkZmlsZXN5c3RlbTsKCnByb3RlY3RlZCAkY2FjaGU7Cgpwcm90ZWN0ZWQgJGV2ZW50RGlzcGF0Y2hlcjsKCnByb3RlY3RlZCAkcHJvY2VzczsKCgoKCgpwdWJsaWMgc3RhdGljICRkb3dubG9hZE1ldGFkYXRhID0gW107CgoKCgoKCgoKcHVibGljIHN0YXRpYyAkcmVzcG9uc2VIZWFkZXJzID0gW107CgoKCgpwcml2YXRlICRsYXN0Q2FjaGVXcml0ZXMgPSBbXTsKCnByaXZhdGUgJGFkZGl0aW9uYWxDbGVhbnVwUGF0aHMgPSBbXTsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyLCA/RXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIgPSBudWxsLCA/Q2FjaGUgJGNhY2hlID0gbnVsbCwgP0ZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0gPSBudWxsLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+Y2FjaGUgPSAkY2FjaGU7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3MgPz8gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokdGhpcy0+ZmlsZXN5c3RlbSA9ICRmaWxlc3lzdGVtID8/IG5ldyBGaWxlc3lzdGVtKCR0aGlzLT5wcm9jZXNzKTsKCmlmICgkdGhpcy0+Y2FjaGUgIT09IG51bGwgJiYgJHRoaXMtPmNhY2hlLT5nY0lzTmVjZXNzYXJ5KCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSdW5uaW5nIGNhY2hlIGdhcmJhZ2UgY29sbGVjdGlvbicsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJZX1ZFUkJPU0UpOwokdGhpcy0+Y2FjaGUtPmdjKCRjb25maWctPmdldCgnY2FjaGUtZmlsZXMtdHRsJyksICRjb25maWctPmdldCgnY2FjaGUtZmlsZXMtbWF4c2l6ZScpKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGF0aW9uU291cmNlKCk6IHN0cmluZwp7CnJldHVybiAnZGlzdCc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwsIGJvb2wgJG91dHB1dCA9IHRydWUpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKG51bGwgPT09ICRwYWNrYWdlLT5nZXREaXN0VXJsKCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBnaXZlbiBwYWNrYWdlIGlzIG1pc3NpbmcgdXJsIGluZm9ybWF0aW9uJyk7Cn0KCiRjYWNoZUtleUdlbmVyYXRvciA9IHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgJGtleSk6IHN0cmluZyB7CiRjYWNoZUtleSA9IGhhc2goJ3NoYTEnLCAka2V5KTsKCnJldHVybiAkcGFja2FnZS0+Z2V0TmFtZSgpLicvJy4kY2FjaGVLZXkuJy4nLiRwYWNrYWdlLT5nZXREaXN0VHlwZSgpOwp9OwoKJHJldHJpZXMgPSAzOwokZGlzdFVybHMgPSAkcGFja2FnZS0+Z2V0RGlzdFVybHMoKTsKCiR1cmxzID0gW107CmZvcmVhY2ggKCRkaXN0VXJscyBhcyAkaW5kZXggPT4gJHVybCkgewokcHJvY2Vzc2VkVXJsID0gJHRoaXMtPnByb2Nlc3NVcmwoJHBhY2thZ2UsICR1cmwpOwokdXJsc1skaW5kZXhdID0gWwonYmFzZScgPT4gJHVybCwKJ3Byb2Nlc3NlZCcgPT4gJHByb2Nlc3NlZFVybCwKCgoKCidjYWNoZUtleScgPT4gJGNhY2hlS2V5R2VuZXJhdG9yKCRwYWNrYWdlLCAkcHJvY2Vzc2VkVXJsKSwKXTsKfQphc3NlcnQoY291bnQoJHVybHMpID4gMCk7CgokZmlsZU5hbWUgPSAkdGhpcy0+Z2V0RmlsZU5hbWUoJHBhY2thZ2UsICRwYXRoKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkcGF0aCk7CiR0aGlzLT5maWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoZGlybmFtZSgkZmlsZU5hbWUpKTsKCiRhY2NlcHQgPSBudWxsOwokcmVqZWN0ID0gbnVsbDsKJGRvd25sb2FkID0gZnVuY3Rpb24gKCkgdXNlICgkb3V0cHV0LCAkY2FjaGVLZXlHZW5lcmF0b3IsICRwYWNrYWdlLCAkZmlsZU5hbWUsICYkdXJscywgJiRhY2NlcHQsICYkcmVqZWN0KSB7CiR1cmwgPSByZXNldCgkdXJscyk7CiRpbmRleCA9IGtleSgkdXJscyk7CgppZiAoJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciAhPT0gbnVsbCkgewokcHJlRmlsZURvd25sb2FkRXZlbnQgPSBuZXcgUHJlRmlsZURvd25sb2FkRXZlbnQoUGx1Z2luRXZlbnRzOjpQUkVfRklMRV9ET1dOTE9BRCwgJHRoaXMtPmh0dHBEb3dubG9hZGVyLCAkdXJsWydwcm9jZXNzZWQnXSwgJ3BhY2thZ2UnLCAkcGFja2FnZSk7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcHJlRmlsZURvd25sb2FkRXZlbnQpOwppZiAoJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRDdXN0b21DYWNoZUtleSgpICE9PSBudWxsKSB7CiR1cmxbJ2NhY2hlS2V5J10gPSAkY2FjaGVLZXlHZW5lcmF0b3IoJHBhY2thZ2UsICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0Q3VzdG9tQ2FjaGVLZXkoKSk7Cn0gZWxzZWlmICgkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldFByb2Nlc3NlZFVybCgpICE9PSAkdXJsWydwcm9jZXNzZWQnXSkgewokdXJsWydjYWNoZUtleSddID0gJGNhY2hlS2V5R2VuZXJhdG9yKCRwYWNrYWdlLCAkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldFByb2Nlc3NlZFVybCgpKTsKfQokdXJsWydwcm9jZXNzZWQnXSA9ICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0UHJvY2Vzc2VkVXJsKCk7Cn0KCiR1cmxzWyRpbmRleF0gPSAkdXJsOwoKJGNoZWNrc3VtID0gJHBhY2thZ2UtPmdldERpc3RTaGExQ2hlY2tzdW0oKTsKJGNhY2hlS2V5ID0gJHVybFsnY2FjaGVLZXknXTsKCgppZiAoJHRoaXMtPmNhY2hlICE9PSBudWxsICYmICgkY2hlY2tzdW0gPT09IG51bGwgfHwgJGNoZWNrc3VtID09PSAnJyB8fCAkY2hlY2tzdW0gPT09ICR0aGlzLT5jYWNoZS0+c2hhMSgkY2FjaGVLZXkpKSAmJiAkdGhpcy0+Y2FjaGUtPmNvcHlUbygkY2FjaGVLZXksICRmaWxlTmFtZSkpIHsKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gTG9hZGluZyA8aW5mbz4iIC4gJHBhY2thZ2UtPmdldE5hbWUoKSAuICI8L2luZm8+ICg8Y29tbWVudD4iIC4gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgLiAiPC9jb21tZW50PikgZnJvbSBjYWNoZSIsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJZX1ZFUkJPU0UpOwp9CgoKCmlmICghJHRoaXMtPmNhY2hlLT5pc1JlYWRPbmx5KCkpIHsKJHRoaXMtPmxhc3RDYWNoZVdyaXRlc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRjYWNoZUtleTsKfQokcmVzdWx0ID0gXFJlYWN0XFByb21pc2VccmVzb2x2ZSgkZmlsZU5hbWUpOwp9IGVsc2UgewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSBEb3dubG9hZGluZyA8aW5mbz4iIC4gJHBhY2thZ2UtPmdldE5hbWUoKSAuICI8L2luZm8+ICg8Y29tbWVudD4iIC4gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgLiAiPC9jb21tZW50PikiKTsKfQoKJHJlc3VsdCA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+YWRkQ29weSgkdXJsWydwcm9jZXNzZWQnXSwgJGZpbGVOYW1lLCAkcGFja2FnZS0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpKQotPnRoZW4oJGFjY2VwdCwgJHJlamVjdCk7Cn0KCnJldHVybiAkcmVzdWx0LT50aGVuKGZ1bmN0aW9uICgkcmVzdWx0KSB1c2UgKCRmaWxlTmFtZSwgJGNoZWNrc3VtLCAkdXJsLCAkcGFja2FnZSk6IHN0cmluZyB7CgoKCmlmIChudWxsID09PSAkcmVzdWx0KSB7CnJldHVybiAkZmlsZU5hbWU7Cn0KCmlmICghZmlsZV9leGlzdHMoJGZpbGVOYW1lKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbigkdXJsWydiYXNlJ10uJyBjb3VsZCBub3QgYmUgc2F2ZWQgdG8gJy4kZmlsZU5hbWUuJywgbWFrZSBzdXJlIHRoZScKLicgZGlyZWN0b3J5IGlzIHdyaXRhYmxlIGFuZCB5b3UgaGF2ZSBpbnRlcm5ldCBjb25uZWN0aXZpdHknKTsKfQoKaWYgKCRjaGVja3N1bSAhPT0gbnVsbCAmJiAkY2hlY2tzdW0gIT09ICcnICYmIGhhc2hfZmlsZSgnc2hhMScsICRmaWxlTmFtZSkgIT09ICRjaGVja3N1bSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignVGhlIGNoZWNrc3VtIHZlcmlmaWNhdGlvbiBvZiB0aGUgZmlsZSBmYWlsZWQgKGRvd25sb2FkZWQgZnJvbSAnLiR1cmxbJ2Jhc2UnXS4nKScpOwp9CgppZiAoJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciAhPT0gbnVsbCkgewokcG9zdEZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFBvc3RGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBPU1RfRklMRV9ET1dOTE9BRCwgJGZpbGVOYW1lLCAkY2hlY2tzdW0sICR1cmxbJ3Byb2Nlc3NlZCddLCAncGFja2FnZScsICRwYWNrYWdlKTsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHBvc3RGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcG9zdEZpbGVEb3dubG9hZEV2ZW50KTsKfQoKcmV0dXJuICRmaWxlTmFtZTsKfSk7Cn07CgokYWNjZXB0ID0gZnVuY3Rpb24gKFJlc3BvbnNlICRyZXNwb25zZSkgdXNlICgkcGFja2FnZSwgJGZpbGVOYW1lLCAmJHVybHMpOiBzdHJpbmcgewokdXJsID0gcmVzZXQoJHVybHMpOwokY2FjaGVLZXkgPSAkdXJsWydjYWNoZUtleSddOwokZmlsZVNpemUgPSBAZmlsZXNpemUoJGZpbGVOYW1lKTsKaWYgKGZhbHNlID09PSAkZmlsZVNpemUpIHsKJGZpbGVTaXplID0gJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJykgPz8gJz8nOwp9CkZpbGVEb3dubG9hZGVyOjokZG93bmxvYWRNZXRhZGF0YVskcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRmaWxlU2l6ZTsKCmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdHSVRIVUJfQUNUSU9OUycpICE9PSBmYWxzZSAmJiBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9URVNUU19BUkVfUlVOTklORycpID09PSBmYWxzZSkgewpGaWxlRG93bmxvYWRlcjo6JHJlc3BvbnNlSGVhZGVyc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRyZXNwb25zZS0+Z2V0SGVhZGVycygpOwp9CgppZiAoJHRoaXMtPmNhY2hlICE9PSBudWxsICYmICEkdGhpcy0+Y2FjaGUtPmlzUmVhZE9ubHkoKSkgewokdGhpcy0+bGFzdENhY2hlV3JpdGVzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJGNhY2hlS2V5OwokdGhpcy0+Y2FjaGUtPmNvcHlGcm9tKCRjYWNoZUtleSwgJGZpbGVOYW1lKTsKfQoKJHJlc3BvbnNlLT5jb2xsZWN0KCk7CgpyZXR1cm4gJGZpbGVOYW1lOwp9OwoKJHJlamVjdCA9IGZ1bmN0aW9uICgkZSkgdXNlICgmJHVybHMsICRkb3dubG9hZCwgJGZpbGVOYW1lLCAkcGFja2FnZSwgJiRyZXRyaWVzKSB7CgppZiAoZmlsZV9leGlzdHMoJGZpbGVOYW1lKSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+dW5saW5rKCRmaWxlTmFtZSk7Cn0KJHRoaXMtPmNsZWFyTGFzdENhY2hlV3JpdGUoJHBhY2thZ2UpOwoKaWYgKCRlIGluc3RhbmNlb2YgSXJyZWNvdmVyYWJsZURvd25sb2FkRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CgppZiAoJGUgaW5zdGFuY2VvZiBNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CgppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24pIHsKCmlmICgwICE9PSAkZS0+Z2V0Q29kZSgpICYmICFpbl9hcnJheSgkZS0+Z2V0Q29kZSgpLCBbNTAwLCA1MDIsIDUwMywgNTA0XSwgdHJ1ZSkpIHsKJHJldHJpZXMgPSAwOwp9Cn0KCgppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gJiYgJGUtPmdldFN0YXR1c0NvZGUoKSA9PT0gNDk5KSB7CiRyZXRyaWVzID0gMDsKJHVybHMgPSBbXTsKfQoKaWYgKCRyZXRyaWVzID4gMCkgewp1c2xlZXAoNTAwMDAwKTsKJHJldHJpZXMtLTsKCnJldHVybiAkZG93bmxvYWQoKTsKfQoKYXJyYXlfc2hpZnQoJHVybHMpOwppZiAoXGNvdW50KCR1cmxzKSA+IDApIHsKaWYgKCR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIEZhaWxlZCBkb3dubG9hZGluZyAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJzogWycuZ2V0X2NsYXNzKCRlKS4nXSAnLiRlLT5nZXRDb2RlKCkuJzogJy4kZS0+Z2V0TWVzc2FnZSgpKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgVHJ5aW5nIHRoZSBuZXh0IFVSTCBmb3IgJy4kcGFja2FnZS0+Z2V0TmFtZSgpKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgRmFpbGVkIGRvd25sb2FkaW5nICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nLCB0cnlpbmcgdGhlIG5leHQgVVJMICgnLiRlLT5nZXRDb2RlKCkuJzogJy4kZS0+Z2V0TWVzc2FnZSgpLicpJyk7Cn0KCiRyZXRyaWVzID0gMzsKdXNsZWVwKDEwMDAwMCk7CgpyZXR1cm4gJGRvd25sb2FkKCk7Cn0KCnRocm93ICRlOwp9OwoKcmV0dXJuICRkb3dubG9hZCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZShzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoc3RyaW5nICR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGZpbGVOYW1lID0gJHRoaXMtPmdldEZpbGVOYW1lKCRwYWNrYWdlLCAkcGF0aCk7CmlmIChmaWxlX2V4aXN0cygkZmlsZU5hbWUpKSB7CiR0aGlzLT5maWxlc3lzdGVtLT51bmxpbmsoJGZpbGVOYW1lKTsKfQoKJGRpcnNUb0NsZWFuVXAgPSBbCiRwYXRoLAokdGhpcy0+Y29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKS4nLycuZXhwbG9kZSgnLycsICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkpWzBdLAokdGhpcy0+Y29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKS4nL2NvbXBvc2VyLycsCiR0aGlzLT5jb25maWctPmdldCgndmVuZG9yLWRpcicpLApdOwoKaWYgKGlzc2V0KCR0aGlzLT5hZGRpdGlvbmFsQ2xlYW51cFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewpmb3JlYWNoICgkdGhpcy0+YWRkaXRpb25hbENsZWFudXBQYXRoc1skcGFja2FnZS0+Z2V0TmFtZSgpXSBhcyAkcGF0aFRvQ2xlYW4pIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZSgkcGF0aFRvQ2xlYW4pOwp9Cn0KCmZvcmVhY2ggKCRkaXJzVG9DbGVhblVwIGFzICRkaXIpIHsKaWYgKGlzX2RpcigkZGlyKSAmJiAkdGhpcy0+ZmlsZXN5c3RlbS0+aXNEaXJFbXB0eSgkZGlyKSAmJiByZWFscGF0aCgkZGlyKSAhPT0gUGxhdGZvcm06OmdldEN3ZCgpKSB7CiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnlQaHAoJGRpcik7Cn0KfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gSW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKSk7Cn0KCiR2ZW5kb3JEaXIgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKTsKCgoKCmlmIChmYWxzZSA9PT0gc3RycG9zKCR0aGlzLT5maWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCR2ZW5kb3JEaXIpLCAkdGhpcy0+ZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkcGF0aC5ESVJFQ1RPUllfU0VQQVJBVE9SKSkpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVtcHR5RGlyZWN0b3J5KCRwYXRoKTsKfQokdGhpcy0+ZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRwYXRoKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbmFtZSgkdGhpcy0+Z2V0RmlsZU5hbWUoJHBhY2thZ2UsICRwYXRoKSwgJHBhdGggLiAnLycgLiAkdGhpcy0+Z2V0RGlzdFBhdGgoJHBhY2thZ2UsIFBBVEhJTkZPX0JBU0VOQU1FKSk7CgoKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRCaW5hcmllcygpIGFzICRiaW4pIHsKaWYgKGZpbGVfZXhpc3RzKCRwYXRoIC4gJy8nIC4gJGJpbikgJiYgIWlzX2V4ZWN1dGFibGUoJHBhdGggLiAnLycgLiAkYmluKSkgewpTaWxlbmNlcjo6Y2FsbCgnY2htb2QnLCAkcGF0aCAuICcvJyAuICRiaW4sIDA3NzcgJiB+dW1hc2soKSk7Cn0KfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXREaXN0UGF0aChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBpbnQgJGNvbXBvbmVudCk6IHN0cmluZwp7CnJldHVybiBwYXRoaW5mbygoc3RyaW5nKSBwYXJzZV91cmwoc3RydHIoKHN0cmluZykgJHBhY2thZ2UtPmdldERpc3RVcmwoKSwgJ1xcJywgJy8nKSwgUEhQX1VSTF9QQVRIKSwgJGNvbXBvbmVudCk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjbGVhckxhc3RDYWNoZVdyaXRlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKaWYgKCR0aGlzLT5jYWNoZSAhPT0gbnVsbCAmJiBpc3NldCgkdGhpcy0+bGFzdENhY2hlV3JpdGVzWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewokdGhpcy0+Y2FjaGUtPnJlbW92ZSgkdGhpcy0+bGFzdENhY2hlV3JpdGVzWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKdW5zZXQoJHRoaXMtPmxhc3RDYWNoZVdyaXRlc1skcGFja2FnZS0+Z2V0TmFtZSgpXSk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZENsZWFudXBQYXRoKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IHZvaWQKewokdGhpcy0+YWRkaXRpb25hbENsZWFudXBQYXRoc1skcGFja2FnZS0+Z2V0TmFtZSgpXVtdID0gJHBhdGg7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiByZW1vdmVDbGVhbnVwUGF0aChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiB2b2lkCnsKaWYgKGlzc2V0KCR0aGlzLT5hZGRpdGlvbmFsQ2xlYW51cFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewokaWR4ID0gYXJyYXlfc2VhcmNoKCRwYXRoLCAkdGhpcy0+YWRkaXRpb25hbENsZWFudXBQYXRoc1skcGFja2FnZS0+Z2V0TmFtZSgpXSwgdHJ1ZSk7CmlmIChmYWxzZSAhPT0gJGlkeCkgewp1bnNldCgkdGhpcy0+YWRkaXRpb25hbENsZWFudXBQYXRoc1skcGFja2FnZS0+Z2V0TmFtZSgpXVskaWR4XSk7Cn0KfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBVcGRhdGVPcGVyYXRpb246OmZvcm1hdCgkaW5pdGlhbCwgJHRhcmdldCkgLiAkdGhpcy0+Z2V0SW5zdGFsbE9wZXJhdGlvbkFwcGVuZGl4KCR0YXJnZXQsICRwYXRoKSk7CgokcHJvbWlzZSA9ICR0aGlzLT5yZW1vdmUoJGluaXRpYWwsICRwYXRoLCBmYWxzZSk7CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkdGFyZ2V0LCAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UgewpyZXR1cm4gJHRoaXMtPmluc3RhbGwoJHRhcmdldCwgJHBhdGgsIGZhbHNlKTsKfSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBib29sICRvdXRwdXQgPSB0cnVlKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBVbmluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkpOwp9CiRwcm9taXNlID0gJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeUFzeW5jKCRwYXRoKTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKCRyZXN1bHQpIHVzZSAoJHBhdGgpOiB2b2lkIHsKaWYgKCEkcmVzdWx0KSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGNvbXBsZXRlbHkgZGVsZXRlICcuJHBhdGguJywgYWJvcnRpbmcuJyk7Cn0KfSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RmlsZU5hbWUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKJGV4dGVuc2lvbiA9ICR0aGlzLT5nZXREaXN0UGF0aCgkcGFja2FnZSwgUEFUSElORk9fRVhURU5TSU9OKTsKaWYgKCRleHRlbnNpb24gPT09ICcnKSB7CiRleHRlbnNpb24gPSAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKTsKfQoKcmV0dXJuIHJ0cmltKCR0aGlzLT5jb25maWctPmdldCgndmVuZG9yLWRpcicpIC4gJy9jb21wb3Nlci90bXAtJyAuIGhhc2goJ21kNScsICRwYWNrYWdlIC4gc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKSkgLiAnLicgLiAkZXh0ZW5zaW9uLCAnLicpOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0SW5zdGFsbE9wZXJhdGlvbkFwcGVuZGl4KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CnJldHVybiAnJzsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvY2Vzc1VybChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHVybCk6IHN0cmluZwp7CmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpICYmIDAgPT09IHN0cnBvcygkdXJsLCAnaHR0cHM6JykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgbXVzdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uIHRvIGRvd25sb2FkIGZpbGVzIHZpYSBodHRwcycpOwp9CgppZiAoJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSAhPT0gbnVsbCkgewokdXJsID0gVXJsVXRpbDo6dXBkYXRlRGlzdFJlZmVyZW5jZSgkdGhpcy0+Y29uZmlnLCAkdXJsLCAkcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpKTsKfQoKcmV0dXJuICR1cmw7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewokcHJldklPID0gJHRoaXMtPmlvOwoKJHRoaXMtPmlvID0gbmV3IE51bGxJTzsKJHRoaXMtPmlvLT5sb2FkQ29uZmlndXJhdGlvbigkdGhpcy0+Y29uZmlnKTsKJGUgPSBudWxsOwokb3V0cHV0ID0gJyc7CgokdGFyZ2V0RGlyID0gRmlsZXN5c3RlbTo6dHJpbVRyYWlsaW5nU2xhc2goJHBhdGgpOwp0cnkgewppZiAoaXNfZGlyKCR0YXJnZXREaXIuJ19jb21wYXJlJykpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkdGFyZ2V0RGlyLidfY29tcGFyZScpOwp9CgokcHJvbWlzZSA9ICR0aGlzLT5kb3dubG9hZCgkcGFja2FnZSwgJHRhcmdldERpci4nX2NvbXBhcmUnLCBudWxsLCBmYWxzZSk7CiRwcm9taXNlLT50aGVuKG51bGwsIGZ1bmN0aW9uICgkZXgpIHVzZSAoJiRlKSB7CiRlID0gJGV4Owp9KTsKJHRoaXMtPmh0dHBEb3dubG9hZGVyLT53YWl0KCk7CmlmICgkZSAhPT0gbnVsbCkgewp0aHJvdyAkZTsKfQokcHJvbWlzZSA9ICR0aGlzLT5pbnN0YWxsKCRwYWNrYWdlLCAkdGFyZ2V0RGlyLidfY29tcGFyZScsIGZhbHNlKTsKJHByb21pc2UtPnRoZW4obnVsbCwgZnVuY3Rpb24gKCRleCkgdXNlICgmJGUpIHsKJGUgPSAkZXg7Cn0pOwokdGhpcy0+cHJvY2Vzcy0+d2FpdCgpOwppZiAoJGUgIT09IG51bGwpIHsKdGhyb3cgJGU7Cn0KCiRjb21wYXJlciA9IG5ldyBDb21wYXJlcigpOwokY29tcGFyZXItPnNldFNvdXJjZSgkdGFyZ2V0RGlyLidfY29tcGFyZScpOwokY29tcGFyZXItPnNldFVwZGF0ZSgkdGFyZ2V0RGlyKTsKJGNvbXBhcmVyLT5kb0NvbXBhcmUoKTsKJG91dHB1dCA9ICRjb21wYXJlci0+Z2V0Q2hhbmdlZEFzU3RyaW5nKHRydWUpOwokdGhpcy0+ZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCR0YXJnZXREaXIuJ19jb21wYXJlJyk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKfQoKJHRoaXMtPmlvID0gJHByZXZJTzsKCmlmICgkZSAhPT0gbnVsbCkgewppZiAoJHRoaXMtPmlvLT5pc0RlYnVnKCkpIHsKdGhyb3cgJGU7Cn0KCnJldHVybiAnRmFpbGVkIHRvIGRldGVjdCBjaGFuZ2VzOiBbJy5nZXRfY2xhc3MoJGUpLiddICcuJGUtPmdldE1lc3NhZ2UoKTsKfQoKJG91dHB1dCA9IHRyaW0oJG91dHB1dCk7CgpyZXR1cm4gc3RybGVuKCRvdXRwdXQpID4gMCA/ICRvdXRwdXQgOiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7CgoKCgoKCmNsYXNzIEZpbGVzeXN0ZW1FeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSA9ICcnLCBpbnQgJGNvZGUgPSAwLCA/XEV4Y2VwdGlvbiAkcHJldmlvdXMgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoIkZpbGVzeXN0ZW0gZXhjZXB0aW9uOiBcbiIuJG1lc3NhZ2UsICRjb2RlLCAkcHJldmlvdXMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgUnVudGltZUV4Y2VwdGlvbjsKCgoKCmNsYXNzIEZvc3NpbERvd25sb2FkZXIgZXh0ZW5kcyBWY3NEb3dubG9hZGVyCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvSW5zdGFsbChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7CgokdGhpcy0+Y29uZmlnLT5wcm9oaWJpdFVybEJ5Q29uZmlnKCR1cmwsICR0aGlzLT5pbyk7CgokcmVwb0ZpbGUgPSAkcGF0aCAuICcuZm9zc2lsJzsKJHJlYWxQYXRoID0gUGxhdGZvcm06OnJlYWxwYXRoKCRwYXRoKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiQ2xvbmluZyAiLiRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSk7CiR0aGlzLT5leGVjdXRlKFsnZm9zc2lsJywgJ2Nsb25lJywgJy0tJywgJHVybCwgJHJlcG9GaWxlXSk7CiR0aGlzLT5leGVjdXRlKFsnZm9zc2lsJywgJ29wZW4nLCAnLS1uZXN0ZWQnLCAnLS0nLCAkcmVwb0ZpbGVdLCAkcmVhbFBhdGgpOwokdGhpcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICd1cGRhdGUnLCAnLS0nLCAoc3RyaW5nKSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCldLCAkcmVhbFBhdGgpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1VwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKCiR0aGlzLT5jb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJHVybCwgJHRoaXMtPmlvKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiIFVwZGF0aW5nIHRvICIuJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCkpOwoKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSAuZnNsY2tvdXQgZmlsZSBpcyBtaXNzaW5nIGZyb20gJy4kcGF0aC4nLCBzZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvY29tbWl0LWRlcHMgZm9yIG1vcmUgaW5mb3JtYXRpb24nKTsKfQoKJHJlYWxQYXRoID0gUGxhdGZvcm06OnJlYWxwYXRoKCRwYXRoKTsKJHRoaXMtPmV4ZWN1dGUoWydmb3NzaWwnLCAncHVsbCddLCAkcmVhbFBhdGgpOwokdGhpcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICd1cCcsIChzdHJpbmcpICR0YXJnZXQtPmdldFNvdXJjZVJlZmVyZW5jZSgpXSwgJHJlYWxQYXRoKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnJldHVybiBudWxsOwp9CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICdjaGFuZ2VzJ10sICRvdXRwdXQsIFBsYXRmb3JtOjpyZWFscGF0aCgkcGF0aCkpOwoKJG91dHB1dCA9IHRyaW0oJG91dHB1dCk7CgpyZXR1cm4gc3RybGVuKCRvdXRwdXQpID4gMCA/ICRvdXRwdXQgOiBudWxsOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWl0TG9ncyhzdHJpbmcgJGZyb21SZWZlcmVuY2UsIHN0cmluZyAkdG9SZWZlcmVuY2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CiR0aGlzLT5leGVjdXRlKFsnZm9zc2lsJywgJ3RpbWVsaW5lJywgJy10JywgJ2NpJywgJy1XJywgJzAnLCAnLW4nLCAnMCcsICdiZWZvcmUnLCAkdG9SZWZlcmVuY2VdLCBQbGF0Zm9ybTo6cmVhbHBhdGgoJHBhdGgpLCAkb3V0cHV0KTsKCiRsb2cgPSAnJzsKJG1hdGNoID0gJy9cZFxkOlxkXGQ6XGRcZFxzK1xbJyAuICR0b1JlZmVyZW5jZSAuICdcXS8nOwoKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGxpbmUpIHsKaWYgKFByZWc6OmlzTWF0Y2goJG1hdGNoLCAkbGluZSkpIHsKYnJlYWs7Cn0KJGxvZyAuPSAkbGluZTsKfQoKcmV0dXJuICRsb2c7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4ZWN1dGUoYXJyYXkgJGNvbW1hbmQsID9zdHJpbmcgJGN3ZCA9IG51bGwsID9zdHJpbmcgJiRvdXRwdXQgPSBudWxsKTogdm9pZAp7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJGN3ZCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzTWV0YWRhdGFSZXBvc2l0b3J5KHN0cmluZyAkcGF0aCk6IGJvb2wKewpyZXR1cm4gaXNfZmlsZSgkcGF0aCAuICcvLmZzbGNrb3V0JykgfHwgaXNfZmlsZSgkcGF0aCAuICcvX0ZPU1NJTF8nKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxHaXQgYXMgR2l0VXRpbDsKdXNlIENvbXBvc2VyXFV0aWxcVXJsOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CgoKCgpjbGFzcyBHaXREb3dubG9hZGVyIGV4dGVuZHMgVmNzRG93bmxvYWRlciBpbXBsZW1lbnRzIER2Y3NEb3dubG9hZGVySW50ZXJmYWNlCnsKCgoKCnByaXZhdGUgJGhhc1N0YXNoZWRDaGFuZ2VzID0gW107CgoKCgpwcml2YXRlICRoYXNEaXNjYXJkZWRDaGFuZ2VzID0gW107CgoKCnByaXZhdGUgJGdpdFV0aWw7CgoKCgpwcml2YXRlICRjYWNoZWRQYWNrYWdlcyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsLCA/RmlsZXN5c3RlbSAkZnMgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGlvLCAkY29uZmlnLCAkcHJvY2VzcywgJGZzKTsKJHRoaXMtPmdpdFV0aWwgPSBuZXcgR2l0VXRpbCgkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzLCAkdGhpcy0+ZmlsZXN5c3RlbSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0Rvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKCmlmIChGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdXJsKSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKR2l0VXRpbDo6Y2xlYW5FbnYoKTsKCiRjYWNoZVBhdGggPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKS4nLycuUHJlZzo6cmVwbGFjZSgne1teYS16MC05Ll19aScsICctJywgVXJsOjpzYW5pdGl6ZSgkdXJsKSkuJy8nOwokZ2l0VmVyc2lvbiA9IEdpdFV0aWw6OmdldFZlcnNpb24oJHRoaXMtPnByb2Nlc3MpOwoKCmlmICgkZ2l0VmVyc2lvbiAmJiB2ZXJzaW9uX2NvbXBhcmUoJGdpdFZlcnNpb24sICcyLjMuMC1yYzAnLCAnPj0nKSAmJiBDYWNoZTo6aXNVc2FibGUoJGNhY2hlUGF0aCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gU3luY2luZyA8aW5mbz4iIC4gJHBhY2thZ2UtPmdldE5hbWUoKSAuICI8L2luZm8+ICg8Y29tbWVudD4iIC4gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgLiAiPC9jb21tZW50PikgaW50byBjYWNoZSIpOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignICAgIENsb25pbmcgdG8gY2FjaGUgYXQgJXMnLCAkY2FjaGVQYXRoKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHJlZiA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKaWYgKCR0aGlzLT5naXRVdGlsLT5mZXRjaFJlZk9yU3luY01pcnJvcigkdXJsLCAkY2FjaGVQYXRoLCAkcmVmLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKSAmJiBpc19kaXIoJGNhY2hlUGF0aCkpIHsKJHRoaXMtPmNhY2hlZFBhY2thZ2VzWyRwYWNrYWdlLT5nZXRJZCgpXVskcmVmXSA9IHRydWU7Cn0KfSBlbHNlaWYgKG51bGwgPT09ICRnaXRWZXJzaW9uKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignZ2l0IHdhcyBub3QgZm91bmQgaW4geW91ciBQQVRILCBza2lwcGluZyBzb3VyY2UgZG93bmxvYWQnKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0luc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2UKewpHaXRVdGlsOjpjbGVhbkVudigpOwokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKJGNhY2hlUGF0aCA9ICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpLicvJy5QcmVnOjpyZXBsYWNlKCd7W15hLXowLTkuXX1pJywgJy0nLCBVcmw6OnNhbml0aXplKCR1cmwpKS4nLyc7CiRyZWYgPSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCk7CgppZiAoIWVtcHR5KCR0aGlzLT5jYWNoZWRQYWNrYWdlc1skcGFja2FnZS0+Z2V0SWQoKV1bJHJlZl0pKSB7CiRtc2cgPSAiQ2xvbmluZyAiLiR0aGlzLT5nZXRTaG9ydEhhc2goJHJlZikuJyBmcm9tIGNhY2hlJzsKCiRjbG9uZUZsYWdzID0gWyctLWRpc3NvY2lhdGUnLCAnLS1yZWZlcmVuY2UnLCAkY2FjaGVQYXRoXTsKJHRyYW5zcG9ydE9wdGlvbnMgPSAkcGFja2FnZS0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpOwppZiAoaXNzZXQoJHRyYW5zcG9ydE9wdGlvbnNbJ2dpdCddWydzaW5nbGVfdXNlX2Nsb25lJ10pICYmICR0cmFuc3BvcnRPcHRpb25zWydnaXQnXVsnc2luZ2xlX3VzZV9jbG9uZSddKSB7CiRjbG9uZUZsYWdzID0gW107Cn0KCiRjb21tYW5kcyA9IFsKYXJyYXlfbWVyZ2UoWydnaXQnLCAnY2xvbmUnLCAnLS1uby1jaGVja291dCcsICRjYWNoZVBhdGgsICRwYXRoXSwgJGNsb25lRmxhZ3MpLApbJ2dpdCcsICdyZW1vdGUnLCAnc2V0LXVybCcsICdvcmlnaW4nLCAnLS0nLCAnJXNhbml0aXplZFVybCUnXSwKWydnaXQnLCAncmVtb3RlJywgJ2FkZCcsICdjb21wb3NlcicsICctLScsICclc2FuaXRpemVkVXJsJSddLApdOwp9IGVsc2UgewokbXNnID0gIkNsb25pbmcgIi4kdGhpcy0+Z2V0U2hvcnRIYXNoKCRyZWYpOwokY29tbWFuZHMgPSBbCmFycmF5X21lcmdlKFsnZ2l0JywgJ2Nsb25lJywgJy0tbm8tY2hlY2tvdXQnLCAnLS0nLCAnJXVybCUnLCAkcGF0aF0pLApbJ2dpdCcsICdyZW1vdGUnLCAnYWRkJywgJ2NvbXBvc2VyJywgJy0tJywgJyV1cmwlJ10sClsnZ2l0JywgJ2ZldGNoJywgJ2NvbXBvc2VyJ10sClsnZ2l0JywgJ3JlbW90ZScsICdzZXQtdXJsJywgJ29yaWdpbicsICctLScsICclc2FuaXRpemVkVXJsJSddLApbJ2dpdCcsICdyZW1vdGUnLCAnc2V0LXVybCcsICdjb21wb3NlcicsICctLScsICclc2FuaXRpemVkVXJsJSddLApdOwppZiAoUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfRElTQUJMRV9ORVRXT1JLJykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgcmVxdWlyZWQgZ2l0IHJlZmVyZW5jZSBmb3IgJy4kcGFja2FnZS0+Z2V0TmFtZSgpLicgaXMgbm90IGluIGNhY2hlIGFuZCBuZXR3b3JrIGlzIGRpc2FibGVkLCBhYm9ydGluZycpOwp9Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbXNnKTsKCiR0aGlzLT5naXRVdGlsLT5ydW5Db21tYW5kcygkY29tbWFuZHMsICR1cmwsICRwYXRoLCB0cnVlKTsKCiRzb3VyY2VVcmwgPSAkcGFja2FnZS0+Z2V0U291cmNlVXJsKCk7CmlmICgkdXJsICE9PSAkc291cmNlVXJsICYmICRzb3VyY2VVcmwgIT09IG51bGwpIHsKJHRoaXMtPnVwZGF0ZU9yaWdpblVybCgkcGF0aCwgJHNvdXJjZVVybCk7Cn0gZWxzZSB7CiR0aGlzLT5zZXRQdXNoVXJsKCRwYXRoLCAkdXJsKTsKfQoKaWYgKCRuZXdSZWYgPSAkdGhpcy0+dXBkYXRlVG9Db21taXQoJHBhY2thZ2UsICRwYXRoLCAoc3RyaW5nKSAkcmVmLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKSkgewppZiAoJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSA9PT0gJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpKSB7CiRwYWNrYWdlLT5zZXREaXN0UmVmZXJlbmNlKCRuZXdSZWYpOwp9CiRwYWNrYWdlLT5zZXRTb3VyY2VSZWZlcmVuY2UoJG5ld1JlZik7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9VcGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7CkdpdFV0aWw6OmNsZWFuRW52KCk7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIC5naXQgZGlyZWN0b3J5IGlzIG1pc3NpbmcgZnJvbSAnLiRwYXRoLicsIHNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9jb21taXQtZGVwcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOwp9CgokY2FjaGVQYXRoID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykuJy8nLlByZWc6OnJlcGxhY2UoJ3tbXmEtejAtOS5dfWknLCAnLScsIFVybDo6c2FuaXRpemUoJHVybCkpLicvJzsKJHJlZiA9ICR0YXJnZXQtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwoKaWYgKCFlbXB0eSgkdGhpcy0+Y2FjaGVkUGFja2FnZXNbJHRhcmdldC0+Z2V0SWQoKV1bJHJlZl0pKSB7CiRtc2cgPSAiQ2hlY2tpbmcgb3V0ICIuJHRoaXMtPmdldFNob3J0SGFzaCgkcmVmKS4nIGZyb20gY2FjaGUnOwokcmVtb3RlVXJsID0gJGNhY2hlUGF0aDsKfSBlbHNlIHsKJG1zZyA9ICJDaGVja2luZyBvdXQgIi4kdGhpcy0+Z2V0U2hvcnRIYXNoKCRyZWYpOwokcmVtb3RlVXJsID0gJyV1cmwlJzsKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0RJU0FCTEVfTkVUV09SSycpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIHJlcXVpcmVkIGdpdCByZWZlcmVuY2UgZm9yICcuJHRhcmdldC0+Z2V0TmFtZSgpLicgaXMgbm90IGluIGNhY2hlIGFuZCBuZXR3b3JrIGlzIGRpc2FibGVkLCBhYm9ydGluZycpOwp9Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbXNnKTsKCmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1xdWlldCcsICctLXZlcmlmeScsICRyZWYuJ157Y29tbWl0fSddLCAkb3V0cHV0LCAkcGF0aCkpIHsKJGNvbW1hbmRzID0gWwpbJ2dpdCcsICdyZW1vdGUnLCAnc2V0LXVybCcsICdjb21wb3NlcicsICctLScsICRyZW1vdGVVcmxdLApbJ2dpdCcsICdmZXRjaCcsICdjb21wb3NlciddLApbJ2dpdCcsICdmZXRjaCcsICctLXRhZ3MnLCAnY29tcG9zZXInXSwKXTsKCiR0aGlzLT5naXRVdGlsLT5ydW5Db21tYW5kcygkY29tbWFuZHMsICR1cmwsICRwYXRoKTsKfQoKJGNvbW1hbmQgPSBbJ2dpdCcsICdyZW1vdGUnLCAnc2V0LXVybCcsICdjb21wb3NlcicsICctLScsICclc2FuaXRpemVkVXJsJSddOwokdGhpcy0+Z2l0VXRpbC0+cnVuQ29tbWFuZHMoWyRjb21tYW5kXSwgJHVybCwgJHBhdGgpOwoKaWYgKCRuZXdSZWYgPSAkdGhpcy0+dXBkYXRlVG9Db21taXQoJHRhcmdldCwgJHBhdGgsIChzdHJpbmcpICRyZWYsICR0YXJnZXQtPmdldFByZXR0eVZlcnNpb24oKSkpIHsKaWYgKCR0YXJnZXQtPmdldERpc3RSZWZlcmVuY2UoKSA9PT0gJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCkpIHsKJHRhcmdldC0+c2V0RGlzdFJlZmVyZW5jZSgkbmV3UmVmKTsKfQokdGFyZ2V0LT5zZXRTb3VyY2VSZWZlcmVuY2UoJG5ld1JlZik7Cn0KCiR1cGRhdGVPcmlnaW5VcmwgPSBmYWxzZTsKaWYgKAowID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZW1vdGUnLCAnLXYnXSwgJG91dHB1dCwgJHBhdGgpCiYmIFByZWc6OmlzTWF0Y2goJ3teb3JpZ2luXHMrKD9QPHVybD5cUyspfW0nLCAkb3V0cHV0LCAkb3JpZ2luTWF0Y2gpCiYmIFByZWc6OmlzTWF0Y2goJ3teY29tcG9zZXJccysoP1A8dXJsPlxTKyl9bScsICRvdXRwdXQsICRjb21wb3Nlck1hdGNoKQopIHsKaWYgKCRvcmlnaW5NYXRjaFsndXJsJ10gPT09ICRjb21wb3Nlck1hdGNoWyd1cmwnXSAmJiAkY29tcG9zZXJNYXRjaFsndXJsJ10gIT09ICR0YXJnZXQtPmdldFNvdXJjZVVybCgpKSB7CiR1cGRhdGVPcmlnaW5VcmwgPSB0cnVlOwp9Cn0KaWYgKCR1cGRhdGVPcmlnaW5VcmwgJiYgJHRhcmdldC0+Z2V0U291cmNlVXJsKCkgIT09IG51bGwpIHsKJHRoaXMtPnVwZGF0ZU9yaWdpblVybCgkcGF0aCwgJHRhcmdldC0+Z2V0U291cmNlVXJsKCkpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKR2l0VXRpbDo6Y2xlYW5FbnYoKTsKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewpyZXR1cm4gbnVsbDsKfQoKJGNvbW1hbmQgPSBbJ2dpdCcsICdzdGF0dXMnLCAnLS1wb3JjZWxhaW4nLCAnLS11bnRyYWNrZWQtZmlsZXM9bm8nXTsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQoKJG91dHB1dCA9IHRyaW0oJG91dHB1dCk7CgpyZXR1cm4gc3RybGVuKCRvdXRwdXQpID4gMCA/ICRvdXRwdXQgOiBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VW5wdXNoZWRDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewpHaXRVdGlsOjpjbGVhbkVudigpOwokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewpyZXR1cm4gbnVsbDsKfQoKJGNvbW1hbmQgPSBbJ2dpdCcsICdzaG93LXJlZicsICctLWhlYWQnLCAnLWQnXTsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQoKJHJlZnMgPSB0cmltKCRvdXRwdXQpOwppZiAoIVByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKFthLWYwLTldKykgSEVBRCR9bWknLCAkcmVmcywgJG1hdGNoKSkgewoKcmV0dXJuIG51bGw7Cn0KCiRoZWFkUmVmID0gJG1hdGNoWzFdOwppZiAoIVByZWc6OmlzTWF0Y2hBbGxTdHJpY3RHcm91cHMoJ3teJy5wcmVnX3F1b3RlKCRoZWFkUmVmKS4nIHJlZnMvaGVhZHMvKC4rKSR9bWknLCAkcmVmcywgJG1hdGNoZXMpKSB7CgpyZXR1cm4gbnVsbDsKfQoKJGNhbmRpZGF0ZUJyYW5jaGVzID0gJG1hdGNoZXNbMV07CgokYnJhbmNoID0gJGNhbmRpZGF0ZUJyYW5jaGVzWzBdOwokdW5wdXNoZWRDaGFuZ2VzID0gbnVsbDsKJGJyYW5jaE5vdEZvdW5kRXJyb3IgPSBmYWxzZTsKCgpmb3IgKCRpID0gMDsgJGkgPD0gMTsgJGkrKykgewokcmVtb3RlQnJhbmNoZXMgPSBbXTsKCgpmb3JlYWNoICgkY2FuZGlkYXRlQnJhbmNoZXMgYXMgJGNhbmRpZGF0ZSkgewppZiAoUHJlZzo6aXNNYXRjaEFsbFN0cmljdEdyb3Vwcygne15bYS1mMC05XSsgcmVmcy9yZW1vdGVzLygoPzpbXi9dKykvJy5wcmVnX3F1b3RlKCRjYW5kaWRhdGUpLicpJH1taScsICRyZWZzLCAkbWF0Y2hlcykpIHsKZm9yZWFjaCAoJG1hdGNoZXNbMV0gYXMgJG1hdGNoKSB7CiRicmFuY2ggPSAkY2FuZGlkYXRlOwokcmVtb3RlQnJhbmNoZXNbXSA9ICRtYXRjaDsKfQpicmVhazsKfQp9CgoKCgppZiAoY291bnQoJHJlbW90ZUJyYW5jaGVzKSA9PT0gMCkgewokdW5wdXNoZWRDaGFuZ2VzID0gJ0JyYW5jaCAnIC4gJGJyYW5jaCAuICcgY291bGQgbm90IGJlIGZvdW5kIG9uIGFueSByZW1vdGUgYW5kIGFwcGVhcnMgdG8gYmUgdW5wdXNoZWQnOwokYnJhbmNoTm90Rm91bmRFcnJvciA9IHRydWU7Cn0gZWxzZSB7CgoKaWYgKCRicmFuY2hOb3RGb3VuZEVycm9yKSB7CiR1bnB1c2hlZENoYW5nZXMgPSBudWxsOwp9CmZvcmVhY2ggKCRyZW1vdGVCcmFuY2hlcyBhcyAkcmVtb3RlQnJhbmNoKSB7CiRjb21tYW5kID0gWydnaXQnLCAnZGlmZicsICctLW5hbWUtc3RhdHVzJywgJHJlbW90ZUJyYW5jaC4nLi4uJy4kYnJhbmNoLCAnLS0nXTsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQoKJG91dHB1dCA9IHRyaW0oJG91dHB1dCk7CgppZiAoJHVucHVzaGVkQ2hhbmdlcyA9PT0gbnVsbCB8fCBzdHJsZW4oJG91dHB1dCkgPCBzdHJsZW4oJHVucHVzaGVkQ2hhbmdlcykpIHsKJHVucHVzaGVkQ2hhbmdlcyA9ICRvdXRwdXQ7Cn0KfQp9CgoKCmlmICgkdW5wdXNoZWRDaGFuZ2VzICYmICRpID09PSAwKSB7CiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2ZldGNoJywgJy0tYWxsJ10sICRvdXRwdXQsICRwYXRoKTsKCgokY29tbWFuZCA9IFsnZ2l0JywgJ3Nob3ctcmVmJywgJy0taGVhZCcsICctZCddOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBleGVjdXRlICcgLiBpbXBsb2RlKCcgJywgJGNvbW1hbmQpIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9CiRyZWZzID0gdHJpbSgkb3V0cHV0KTsKfQoKCmlmICghJHVucHVzaGVkQ2hhbmdlcykgewpicmVhazsKfQp9CgpyZXR1cm4gJHVucHVzaGVkQ2hhbmdlczsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNsZWFuQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIGJvb2wgJHVwZGF0ZSk6IFByb21pc2VJbnRlcmZhY2UKewpHaXRVdGlsOjpjbGVhbkVudigpOwokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKCiR1bnB1c2hlZCA9ICR0aGlzLT5nZXRVbnB1c2hlZENoYW5nZXMoJHBhY2thZ2UsICRwYXRoKTsKaWYgKCR1bnB1c2hlZCAmJiAoJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkgfHwgJHRoaXMtPmNvbmZpZy0+Z2V0KCdkaXNjYXJkLWNoYW5nZXMnKSAhPT0gdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdTb3VyY2UgZGlyZWN0b3J5ICcgLiAkcGF0aCAuICcgaGFzIHVucHVzaGVkIGNoYW5nZXMgb24gdGhlIGN1cnJlbnQgYnJhbmNoOiAnLiJcbiIuJHVucHVzaGVkKTsKfQoKaWYgKG51bGwgPT09ICgkY2hhbmdlcyA9ICR0aGlzLT5nZXRMb2NhbENoYW5nZXMoJHBhY2thZ2UsICRwYXRoKSkpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGRpc2NhcmRDaGFuZ2VzID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdkaXNjYXJkLWNoYW5nZXMnKTsKaWYgKHRydWUgPT09ICRkaXNjYXJkQ2hhbmdlcykgewpyZXR1cm4gJHRoaXMtPmRpc2NhcmRDaGFuZ2VzKCRwYXRoKTsKfQppZiAoJ3N0YXNoJyA9PT0gJGRpc2NhcmRDaGFuZ2VzKSB7CmlmICghJHVwZGF0ZSkgewpyZXR1cm4gcGFyZW50OjpjbGVhbkNoYW5nZXMoJHBhY2thZ2UsICRwYXRoLCAkdXBkYXRlKTsKfQoKcmV0dXJuICR0aGlzLT5zdGFzaENoYW5nZXMoJHBhdGgpOwp9CgpyZXR1cm4gcGFyZW50OjpjbGVhbkNoYW5nZXMoJHBhY2thZ2UsICRwYXRoLCAkdXBkYXRlKTsKfQoKJGNoYW5nZXMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkZWxlbSk6IHN0cmluZyB7CnJldHVybiAnICAgICcuJGVsZW07Cn0sIFByZWc6OnNwbGl0KCd7XHMqXHI/XG5ccyp9JywgJGNoYW5nZXMpKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPGVycm9yPicuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGhhcyBtb2RpZmllZCBmaWxlczo8L2Vycm9yPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoYXJyYXlfc2xpY2UoJGNoYW5nZXMsIDAsIDEwKSk7CmlmIChjb3VudCgkY2hhbmdlcykgPiAxMCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICA8aW5mbz4nIC4gKGNvdW50KCRjaGFuZ2VzKSAtIDEwKSAuICcgbW9yZSBmaWxlcyBtb2RpZmllZCwgY2hvb3NlICJ2IiB0byB2aWV3IHRoZSBmdWxsIGxpc3Q8L2luZm8+Jyk7Cn0KCndoaWxlICh0cnVlKSB7CnN3aXRjaCAoJHRoaXMtPmlvLT5hc2soJyAgICA8aW5mbz5EaXNjYXJkIGNoYW5nZXMgW3ksbix2LGQsJy4oJHVwZGF0ZSA/ICdzLCcgOiAnJykuJz9dPzwvaW5mbz4gJywgJz8nKSkgewpjYXNlICd5JzoKJHRoaXMtPmRpc2NhcmRDaGFuZ2VzKCRwYXRoKTsKYnJlYWsgMjsKCmNhc2UgJ3MnOgppZiAoISR1cGRhdGUpIHsKZ290byBoZWxwOwp9CgokdGhpcy0+c3Rhc2hDaGFuZ2VzKCRwYXRoKTsKYnJlYWsgMjsKCmNhc2UgJ24nOgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VwZGF0ZSBhYm9ydGVkJyk7CgpjYXNlICd2JzoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRjaGFuZ2VzKTsKYnJlYWs7CgpjYXNlICdkJzoKJHRoaXMtPnZpZXdEaWZmKCRwYXRoKTsKYnJlYWs7CgpjYXNlICc/JzoKZGVmYXVsdDoKaGVscCA6CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCicgICAgeSAtIGRpc2NhcmQgY2hhbmdlcyBhbmQgYXBwbHkgdGhlICcuKCR1cGRhdGUgPyAndXBkYXRlJyA6ICd1bmluc3RhbGwnKSwKJyAgICBuIC0gYWJvcnQgdGhlICcuKCR1cGRhdGUgPyAndXBkYXRlJyA6ICd1bmluc3RhbGwnKS4nIGFuZCBsZXQgeW91IG1hbnVhbGx5IGNsZWFuIHRoaW5ncyB1cCcsCicgICAgdiAtIHZpZXcgbW9kaWZpZWQgZmlsZXMnLAonICAgIGQgLSB2aWV3IGxvY2FsIG1vZGlmaWNhdGlvbnMgKGRpZmYpJywKXSk7CmlmICgkdXBkYXRlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIHMgLSBzdGFzaCBjaGFuZ2VzIGFuZCB0cnkgdG8gcmVhcHBseSB0aGVtIGFmdGVyIHRoZSB1cGRhdGUnKTsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICA/IC0gcHJpbnQgaGVscCcpOwpicmVhazsKfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlYXBwbHlDaGFuZ2VzKHN0cmluZyAkcGF0aCk6IHZvaWQKewokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKaWYgKCFlbXB0eSgkdGhpcy0+aGFzU3Rhc2hlZENoYW5nZXNbJHBhdGhdKSkgewp1bnNldCgkdGhpcy0+aGFzU3Rhc2hlZENoYW5nZXNbJHBhdGhdKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPGluZm8+UmUtYXBwbHlpbmcgc3Rhc2hlZCBjaGFuZ2VzPC9pbmZvPicpOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnc3Rhc2gnLCAncG9wJ10sICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBhcHBseSBzdGFzaGVkIGNoYW5nZXM6XG5cbiIuJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9Cn0KCnVuc2V0KCR0aGlzLT5oYXNEaXNjYXJkZWRDaGFuZ2VzWyRwYXRoXSk7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB1cGRhdGVUb0NvbW1pdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkcmVmZXJlbmNlLCBzdHJpbmcgJHByZXR0eVZlcnNpb24pOiA/c3RyaW5nCnsKJGZvcmNlID0gIWVtcHR5KCR0aGlzLT5oYXNEaXNjYXJkZWRDaGFuZ2VzWyRwYXRoXSkgfHwgIWVtcHR5KCR0aGlzLT5oYXNTdGFzaGVkQ2hhbmdlc1skcGF0aF0pID8gWyctZiddIDogW107CgoKCgoKCgokYnJhbmNoID0gUHJlZzo6cmVwbGFjZSgneyg/Ol5kZXYtfCg/OlwueCk/LWRldiQpfWknLCAnJywgJHByZXR0eVZlcnNpb24pOwoKCgoKCiRleGVjdXRlID0gZnVuY3Rpb24gKGFycmF5ICRjb21tYW5kKSB1c2UgKCYkb3V0cHV0LCAkcGF0aCkgewoKJG91dHB1dCA9ICcnOwoKcmV0dXJuIDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCAkcGF0aCk7Cn07CgokYnJhbmNoZXMgPSBudWxsOwppZiAoJGV4ZWN1dGUoWydnaXQnLCAnYnJhbmNoJywgJy1yJ10pKSB7CiRicmFuY2hlcyA9ICRvdXRwdXQ7Cn0KCgokZ2l0UmVmID0gJHJlZmVyZW5jZTsKaWYgKCFQcmVnOjppc01hdGNoKCd7XlthLWYwLTldezQwfSR9JywgJHJlZmVyZW5jZSkKJiYgbnVsbCAhPT0gJGJyYW5jaGVzCiYmIFByZWc6OmlzTWF0Y2goJ3teXHMrY29tcG9zZXIvJy5wcmVnX3F1b3RlKCRyZWZlcmVuY2UpLickfW0nLCAkYnJhbmNoZXMpCikgewokY29tbWFuZDEgPSBhcnJheV9tZXJnZShbJ2dpdCcsICdjaGVja291dCddLCAkZm9yY2UsIFsnLUInLCAkYnJhbmNoLCAnY29tcG9zZXIvJy4kcmVmZXJlbmNlLCAnLS0nXSk7CiRjb21tYW5kMiA9IFsnZ2l0JywgJ3Jlc2V0JywgJy0taGFyZCcsICdjb21wb3Nlci8nLiRyZWZlcmVuY2UsICctLSddOwoKaWYgKCRleGVjdXRlKCRjb21tYW5kMSkgJiYgJGV4ZWN1dGUoJGNvbW1hbmQyKSkgewpyZXR1cm4gbnVsbDsKfQp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17NDB9JH0nLCAkcmVmZXJlbmNlKSkgewoKaWYgKG51bGwgIT09ICRicmFuY2hlcyAmJiAhUHJlZzo6aXNNYXRjaCgne15ccytjb21wb3Nlci8nLnByZWdfcXVvdGUoJGJyYW5jaCkuJyR9bScsICRicmFuY2hlcykgJiYgUHJlZzo6aXNNYXRjaCgne15ccytjb21wb3Nlci92Jy5wcmVnX3F1b3RlKCRicmFuY2gpLickfW0nLCAkYnJhbmNoZXMpKSB7CiRicmFuY2ggPSAndicgLiAkYnJhbmNoOwp9CgokY29tbWFuZCA9IFsnZ2l0JywgJ2NoZWNrb3V0JywgJGJyYW5jaCwgJy0tJ107CiRmYWxsYmFja0NvbW1hbmQgPSBhcnJheV9tZXJnZShbJ2dpdCcsICdjaGVja291dCddLCAkZm9yY2UsIFsnLUInLCAkYnJhbmNoLCAnY29tcG9zZXIvJy4kYnJhbmNoLCAnLS0nXSk7CiRyZXNldENvbW1hbmQgPSBbJ2dpdCcsICdyZXNldCcsICctLWhhcmQnLCAkcmVmZXJlbmNlLCAnLS0nXTsKCmlmICgoJGV4ZWN1dGUoJGNvbW1hbmQpIHx8ICRleGVjdXRlKCRmYWxsYmFja0NvbW1hbmQpKSAmJiAkZXhlY3V0ZSgkcmVzZXRDb21tYW5kKSkgewpyZXR1cm4gbnVsbDsKfQp9CgokY29tbWFuZDEgPSBhcnJheV9tZXJnZShbJ2dpdCcsICdjaGVja291dCddLCAkZm9yY2UsIFskZ2l0UmVmLCAnLS0nXSk7CiRjb21tYW5kMiA9IFsnZ2l0JywgJ3Jlc2V0JywgJy0taGFyZCcsICRnaXRSZWYsICctLSddOwppZiAoJGV4ZWN1dGUoJGNvbW1hbmQxKSAmJiAkZXhlY3V0ZSgkY29tbWFuZDIpKSB7CnJldHVybiBudWxsOwp9CgokZXhjZXB0aW9uRXh0cmEgPSAnJzsKCgppZiAoZmFsc2UgIT09IHN0cnBvcygkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJHJlZmVyZW5jZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+Jy4kcmVmZXJlbmNlLicgaXMgZ29uZSAoaGlzdG9yeSB3YXMgcmV3cml0dGVuPyk8L3dhcm5pbmc+Jyk7CiRleGNlcHRpb25FeHRyYSA9ICJcbkl0IGxvb2tzIGxpa2UgdGhlIGNvbW1pdCBoYXNoIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIHJlcG9zaXRvcnksIG1heWJlICIuKCRwYWNrYWdlLT5pc0RldigpID8gJ3RoZSBjb21taXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgYnJhbmNoJyA6ICd0aGUgdGFnIHdhcyByZWNyZWF0ZWQnKS4nPyBSdW4gImNvbXBvc2VyIHVwZGF0ZSAnLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyIgdG8gcmVzb2x2ZSB0aGlzLic7Cn0KCiRjb21tYW5kID0gaW1wbG9kZSgnICcsICRjb21tYW5kMSkuICcgJiYgJy5pbXBsb2RlKCcgJywgJGNvbW1hbmQyKTsKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihVcmw6OnNhbml0aXplKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gJGNvbW1hbmQgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSAuICRleGNlcHRpb25FeHRyYSkpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gdXBkYXRlT3JpZ2luVXJsKHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAncmVtb3RlJywgJ3NldC11cmwnLCAnb3JpZ2luJywgJy0tJywgJHVybF0sICRvdXRwdXQsICRwYXRoKTsKJHRoaXMtPnNldFB1c2hVcmwoJHBhdGgsICR1cmwpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0UHVzaFVybChzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogdm9pZAp7CgppZiAoUHJlZzo6aXNNYXRjaCgne14oPzpodHRwcz98Z2l0KTovLycuR2l0VXRpbDo6Z2V0R2l0SHViRG9tYWluc1JlZ2V4KCR0aGlzLT5jb25maWcpLicvKFteL10rKS8oW14vXSs/KSg/OlwuZ2l0KT8kfScsICR1cmwsICRtYXRjaCkpIHsKJHByb3RvY29scyA9ICR0aGlzLT5jb25maWctPmdldCgnZ2l0aHViLXByb3RvY29scycpOwokcHVzaFVybCA9ICdnaXRAJy4kbWF0Y2hbMV0uJzonLiRtYXRjaFsyXS4nLycuJG1hdGNoWzNdLicuZ2l0JzsKaWYgKCFpbl9hcnJheSgnc3NoJywgJHByb3RvY29scywgdHJ1ZSkpIHsKJHB1c2hVcmwgPSAnaHR0cHM6Ly8nIC4gJG1hdGNoWzFdIC4gJy8nLiRtYXRjaFsyXS4nLycuJG1hdGNoWzNdLicuZ2l0JzsKfQokY21kID0gWydnaXQnLCAncmVtb3RlJywgJ3NldC11cmwnLCAnLS1wdXNoJywgJ29yaWdpbicsICctLScsICRwdXNoVXJsXTsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNtZCwgJGlnbm9yZWRPdXRwdXQsICRwYXRoKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWl0TG9ncyhzdHJpbmcgJGZyb21SZWZlcmVuY2UsIHN0cmluZyAkdG9SZWZlcmVuY2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwokY29tbWFuZCA9IGFycmF5X21lcmdlKFsnZ2l0JywgJ2xvZycsICRmcm9tUmVmZXJlbmNlLicuLicuJHRvUmVmZXJlbmNlLCAnLS1wcmV0dHk9Zm9ybWF0OiVoIC0gJWFuOiAlcyddLCBHaXRVdGlsOjpnZXROb1Nob3dTaWduYXR1cmVGbGFncygkdGhpcy0+cHJvY2VzcykpOwoKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQoKcmV0dXJuICRvdXRwdXQ7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGlzY2FyZENoYW5nZXMoc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnY2xlYW4nLCAnLWRmJ10sICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCByZXNldCBjaGFuZ2VzXG5cbjoiLiRvdXRwdXQpOwp9CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZXNldCcsICctLWhhcmQnXSwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHJlc2V0IGNoYW5nZXNcblxuOiIuJG91dHB1dCk7Cn0KCiR0aGlzLT5oYXNEaXNjYXJkZWRDaGFuZ2VzWyRwYXRoXSA9IHRydWU7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBzdGFzaENoYW5nZXMoc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnc3Rhc2gnLCAnLS1pbmNsdWRlLXVudHJhY2tlZCddLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3Qgc3Rhc2ggY2hhbmdlc1xuXG46Ii4kb3V0cHV0KTsKfQoKJHRoaXMtPmhhc1N0YXNoZWRDaGFuZ2VzWyRwYXRoXSA9IHRydWU7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZpZXdEaWZmKHN0cmluZyAkcGF0aCk6IHZvaWQKewokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2RpZmYnLCAnSEVBRCddLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgdmlldyBkaWZmXG5cbjoiLiRvdXRwdXQpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG91dHB1dCk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgc3RybGVuKCRwYXRoKSA+IDApIHsKJGJhc2VQYXRoID0gJHBhdGg7CiRyZW1vdmVkID0gW107Cgp3aGlsZSAoIWlzX2RpcigkYmFzZVBhdGgpICYmICRiYXNlUGF0aCAhPT0gJ1xcJykgewphcnJheV91bnNoaWZ0KCRyZW1vdmVkLCBiYXNlbmFtZSgkYmFzZVBhdGgpKTsKJGJhc2VQYXRoID0gZGlybmFtZSgkYmFzZVBhdGgpOwp9CgppZiAoJGJhc2VQYXRoID09PSAnXFwnKSB7CnJldHVybiAkcGF0aDsKfQoKJHBhdGggPSBydHJpbShyZWFscGF0aCgkYmFzZVBhdGgpIC4gJy8nIC4gaW1wbG9kZSgnLycsICRyZW1vdmVkKSwgJy8nKTsKfQoKcmV0dXJuICRwYXRoOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzTWV0YWRhdGFSZXBvc2l0b3J5KHN0cmluZyAkcGF0aCk6IGJvb2wKewokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKCnJldHVybiBpc19kaXIoJHBhdGguJy8uZ2l0Jyk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRTaG9ydEhhc2goc3RyaW5nICRyZWZlcmVuY2UpOiBzdHJpbmcKewppZiAoISR0aGlzLT5pby0+aXNWZXJib3NlKCkgJiYgUHJlZzo6aXNNYXRjaCgne15bMC05YS1mXXs0MH0kfScsICRyZWZlcmVuY2UpKSB7CnJldHVybiBzdWJzdHIoJHJlZmVyZW5jZSwgMCwgMTApOwp9CgpyZXR1cm4gJHJlZmVyZW5jZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKCgoKCgoKY2xhc3MgR3ppcERvd25sb2FkZXIgZXh0ZW5kcyBBcmNoaXZlRG93bmxvYWRlcgp7CnByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZmlsZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiRmaWxlbmFtZSA9IHBhdGhpbmZvKHBhcnNlX3VybChzdHJ0cigoc3RyaW5nKSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpLCAnXFwnLCAnLycpLCBQSFBfVVJMX1BBVEgpLCBQQVRISU5GT19GSUxFTkFNRSk7CiR0YXJnZXRGaWxlcGF0aCA9ICRwYXRoIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRmaWxlbmFtZTsKCgppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokY29tbWFuZCA9IFsnc2gnLCAnLWMnLCAnZ3ppcCAtY2QgLS0gIiQwIiA+ICIkMSInLCAkZmlsZSwgJHRhcmdldEZpbGVwYXRoXTsKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJGlnbm9yZWRPdXRwdXQpKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnemxpYicpKSB7CgokdGhpcy0+ZXh0cmFjdFVzaW5nRXh0KCRmaWxlLCAkdGFyZ2V0RmlsZXBhdGgpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRwcm9jZXNzRXJyb3IgPSAnRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRwcm9jZXNzRXJyb3IpOwp9CgoKJHRoaXMtPmV4dHJhY3RVc2luZ0V4dCgkZmlsZSwgJHRhcmdldEZpbGVwYXRoKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGV4dHJhY3RVc2luZ0V4dChzdHJpbmcgJGZpbGUsIHN0cmluZyAkdGFyZ2V0RmlsZXBhdGgpOiB2b2lkCnsKJGFyY2hpdmVGaWxlID0gZ3pvcGVuKCRmaWxlLCAncmInKTsKJHRhcmdldEZpbGUgPSBmb3BlbigkdGFyZ2V0RmlsZXBhdGgsICd3YicpOwp3aGlsZSAoJHN0cmluZyA9IGd6cmVhZCgkYXJjaGl2ZUZpbGUsIDQwOTYpKSB7CmZ3cml0ZSgkdGFyZ2V0RmlsZSwgJHN0cmluZywgUGxhdGZvcm06OnN0cmxlbigkc3RyaW5nKSk7Cn0KZ3pjbG9zZSgkYXJjaGl2ZUZpbGUpOwpmY2xvc2UoJHRhcmdldEZpbGUpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEhnIGFzIEhnVXRpbHM7CgoKCgpjbGFzcyBIZ0Rvd25sb2FkZXIgZXh0ZW5kcyBWY3NEb3dubG9hZGVyCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAobnVsbCA9PT0gSGdVdGlsczo6Z2V0VmVyc2lvbigkdGhpcy0+cHJvY2VzcykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdoZyB3YXMgbm90IGZvdW5kIGluIHlvdXIgUEFUSCwgc2tpcHBpbmcgc291cmNlIGRvd25sb2FkJyk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9JbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGhnVXRpbHMgPSBuZXcgSGdVdGlscygkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKCiRjbG9uZUNvbW1hbmQgPSBzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkdXJsKSB1c2UgKCRwYXRoKTogYXJyYXkgewpyZXR1cm4gWydoZycsICdjbG9uZScsICctLScsICR1cmwsICRwYXRoXTsKfTsKCiRoZ1V0aWxzLT5ydW5Db21tYW5kKCRjbG9uZUNvbW1hbmQsICR1cmwsICRwYXRoKTsKCiRjb21tYW5kID0gWydoZycsICd1cCcsICctLScsIChzdHJpbmcpICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKV07CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJGlnbm9yZWRPdXRwdXQsIHJlYWxwYXRoKCRwYXRoKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1VwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGhnVXRpbHMgPSBuZXcgSGdVdGlscygkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKCiRyZWYgPSAkdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgVXBkYXRpbmcgdG8gIi4kdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKSk7CgppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIC5oZyBkaXJlY3RvcnkgaXMgbWlzc2luZyBmcm9tICcuJHBhdGguJywgc2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2NvbW1pdC1kZXBzIGZvciBtb3JlIGluZm9ybWF0aW9uJyk7Cn0KCiRjb21tYW5kID0gc3RhdGljIGZ1bmN0aW9uICgkdXJsKTogYXJyYXkgewpyZXR1cm4gWydoZycsICdwdWxsJywgJy0tJywgJHVybF07Cn07CiRoZ1V0aWxzLT5ydW5Db21tYW5kKCRjb21tYW5kLCAkdXJsLCAkcGF0aCk7CgokY29tbWFuZCA9IHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRyZWYpOiBhcnJheSB7CnJldHVybiBbJ2hnJywgJ3VwJywgJy0tJywgJHJlZl07Cn07CiRoZ1V0aWxzLT5ydW5Db21tYW5kKCRjb21tYW5kLCAkdXJsLCAkcGF0aCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKaWYgKCFpc19kaXIoJHBhdGguJy8uaGcnKSkgewpyZXR1cm4gbnVsbDsKfQoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydoZycsICdzdCddLCAkb3V0cHV0LCByZWFscGF0aCgkcGF0aCkpOwoKJG91dHB1dCA9IHRyaW0oJG91dHB1dCk7CgpyZXR1cm4gc3RybGVuKCRvdXRwdXQpID4gMCA/ICRvdXRwdXQgOiBudWxsOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWl0TG9ncyhzdHJpbmcgJGZyb21SZWZlcmVuY2UsIHN0cmluZyAkdG9SZWZlcmVuY2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CiRjb21tYW5kID0gWydoZycsICdsb2cnLCAnLXInLCAkZnJvbVJlZmVyZW5jZS4nOicuJHRvUmVmZXJlbmNlLCAnLS1zdHlsZScsICdjb21wYWN0J107CgppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsIHJlYWxwYXRoKCRwYXRoKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQoKcmV0dXJuICRvdXRwdXQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNNZXRhZGF0YVJlcG9zaXRvcnkoc3RyaW5nICRwYXRoKTogYm9vbAp7CnJldHVybiBpc19kaXIoJHBhdGggLiAnLy5oZycpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7CgpjbGFzcyBNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uIGV4dGVuZHMgVHJhbnNwb3J0RXhjZXB0aW9uCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyXEFyY2hpdmFibGVGaWxlc0ZpbmRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25HdWVzc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb25cSU9FeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEZpbGVzeXN0ZW0gYXMgU3ltZm9ueUZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVuaW5zdGFsbE9wZXJhdGlvbjsKCgoKCgoKCmNsYXNzIFBhdGhEb3dubG9hZGVyIGV4dGVuZHMgRmlsZURvd25sb2FkZXIgaW1wbGVtZW50cyBWY3NDYXBhYmxlRG93bmxvYWRlckludGVyZmFjZQp7CnByaXZhdGUgY29uc3QgU1RSQVRFR1lfU1lNTElOSyA9IDEwOwpwcml2YXRlIGNvbnN0IFNUUkFURUdZX01JUlJPUiA9IDIwOwoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewokcGF0aCA9IEZpbGVzeXN0ZW06OnRyaW1UcmFpbGluZ1NsYXNoKCRwYXRoKTsKJHVybCA9ICRwYWNrYWdlLT5nZXREaXN0VXJsKCk7CmlmIChudWxsID09PSAkdXJsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIHBhY2thZ2UgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaGFzIG5vIGRpc3QgdXJsIGNvbmZpZ3VyZWQsIGNhbm5vdCBkb3dubG9hZC4nKTsKfQokcmVhbFVybCA9IHJlYWxwYXRoKCR1cmwpOwppZiAoZmFsc2UgPT09ICRyZWFsVXJsIHx8ICFmaWxlX2V4aXN0cygkcmVhbFVybCkgfHwgIWlzX2RpcigkcmVhbFVybCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoCidTb3VyY2UgcGF0aCAiJXMiIGlzIG5vdCBmb3VuZCBmb3IgcGFja2FnZSAlcycsCiR1cmwsCiRwYWNrYWdlLT5nZXROYW1lKCkKKSk7Cn0KCmlmIChyZWFscGF0aCgkcGF0aCkgPT09ICRyZWFsVXJsKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgppZiAoc3RycG9zKHJlYWxwYXRoKCRwYXRoKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IsICRyZWFsVXJsIC4gRElSRUNUT1JZX1NFUEFSQVRPUikgPT09IDApIHsKCgoKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKAonUGFja2FnZSAlcyBjYW5ub3QgaW5zdGFsbCB0byAiJXMiIGluc2lkZSBpdHMgc291cmNlIGF0ICIlcyInLAokcGFja2FnZS0+Z2V0TmFtZSgpLApyZWFscGF0aCgkcGF0aCksCiRyZWFsVXJsCikpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBib29sICRvdXRwdXQgPSB0cnVlKTogUHJvbWlzZUludGVyZmFjZQp7CiRwYXRoID0gRmlsZXN5c3RlbTo6dHJpbVRyYWlsaW5nU2xhc2goJHBhdGgpOwokdXJsID0gJHBhY2thZ2UtPmdldERpc3RVcmwoKTsKaWYgKG51bGwgPT09ICR1cmwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgcGFja2FnZSAnLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyBoYXMgbm8gZGlzdCB1cmwgY29uZmlndXJlZCwgY2Fubm90IGluc3RhbGwuJyk7Cn0KJHJlYWxVcmwgPSByZWFscGF0aCgkdXJsKTsKaWYgKGZhbHNlID09PSAkcmVhbFVybCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFscGF0aCAnLiR1cmwpOwp9CgppZiAocmVhbHBhdGgoJHBhdGgpID09PSAkcmVhbFVybCkgewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gSW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKSAuICR0aGlzLT5nZXRJbnN0YWxsT3BlcmF0aW9uQXBwZW5kaXgoJHBhY2thZ2UsICRwYXRoKSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKJHRyYW5zcG9ydE9wdGlvbnMgPSAkcGFja2FnZS0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpICsgWydyZWxhdGl2ZScgPT4gdHJ1ZV07CgpbJGN1cnJlbnRTdHJhdGVneSwgJGFsbG93ZWRTdHJhdGVnaWVzXSA9ICR0aGlzLT5jb21wdXRlQWxsb3dlZFN0cmF0ZWdpZXMoJHRyYW5zcG9ydE9wdGlvbnMpOwoKJHN5bWZvbnlGaWxlc3lzdGVtID0gbmV3IFN5bWZvbnlGaWxlc3lzdGVtKCk7CiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJHBhdGgpOwoKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIEluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkuJzogJywgZmFsc2UpOwp9CgokaXNGYWxsYmFjayA9IGZhbHNlOwppZiAoc2VsZjo6U1RSQVRFR1lfU1lNTElOSyA9PT0gJGN1cnJlbnRTdHJhdGVneSkgewp0cnkgewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CgppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignSnVuY3Rpb25pbmcgZnJvbSAlcycsICR1cmwpLCBmYWxzZSk7Cn0KJHRoaXMtPmZpbGVzeXN0ZW0tPmp1bmN0aW9uKCRyZWFsVXJsLCAkcGF0aCk7Cn0gZWxzZSB7CiRwYXRoID0gcnRyaW0oJHBhdGgsICIvIik7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdTeW1saW5raW5nIGZyb20gJXMnLCAkdXJsKSwgZmFsc2UpOwp9CmlmICgkdHJhbnNwb3J0T3B0aW9uc1sncmVsYXRpdmUnXSA9PT0gdHJ1ZSkgewokYWJzb2x1dGVQYXRoID0gJHBhdGg7CmlmICghJHRoaXMtPmZpbGVzeXN0ZW0tPmlzQWJzb2x1dGVQYXRoKCRhYnNvbHV0ZVBhdGgpKSB7CiRhYnNvbHV0ZVBhdGggPSBQbGF0Zm9ybTo6Z2V0Q3dkKCkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHBhdGg7Cn0KJHNob3J0ZXN0UGF0aCA9ICR0aGlzLT5maWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoKCRhYnNvbHV0ZVBhdGgsICRyZWFsVXJsLCBmYWxzZSwgdHJ1ZSk7CiRzeW1mb255RmlsZXN5c3RlbS0+c3ltbGluaygkc2hvcnRlc3RQYXRoLicvJywgJHBhdGgpOwp9IGVsc2Ugewokc3ltZm9ueUZpbGVzeXN0ZW0tPnN5bWxpbmsoJHJlYWxVcmwuJy8nLCAkcGF0aCk7Cn0KfQp9IGNhdGNoIChJT0V4Y2VwdGlvbiAkZSkgewppZiAoaW5fYXJyYXkoc2VsZjo6U1RSQVRFR1lfTUlSUk9SLCAkYWxsb3dlZFN0cmF0ZWdpZXMsIHRydWUpKSB7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIDxlcnJvcj5TeW1saW5rIGZhaWxlZCwgZmFsbGJhY2sgdG8gdXNlIG1pcnJvcmluZyE8L2Vycm9yPicpOwp9CiRjdXJyZW50U3RyYXRlZ3kgPSBzZWxmOjpTVFJBVEVHWV9NSVJST1I7CiRpc0ZhbGxiYWNrID0gdHJ1ZTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1N5bWxpbmsgZnJvbSAiJXMiIHRvICIlcyIgZmFpbGVkIScsICRyZWFsVXJsLCAkcGF0aCkpOwp9Cn0KfQoKCmlmIChzZWxmOjpTVFJBVEVHWV9NSVJST1IgPT09ICRjdXJyZW50U3RyYXRlZ3kpIHsKJHJlYWxVcmwgPSAkdGhpcy0+ZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkcmVhbFVybCk7CgppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignJXNNaXJyb3JpbmcgZnJvbSAlcycsICRpc0ZhbGxiYWNrID8gJyAgICAnIDogJycsICR1cmwpLCBmYWxzZSk7Cn0KJGl0ZXJhdG9yID0gbmV3IEFyY2hpdmFibGVGaWxlc0ZpbmRlcigkcmVhbFVybCwgW10pOwokc3ltZm9ueUZpbGVzeXN0ZW0tPm1pcnJvcigkcmVhbFVybCwgJHBhdGgsICRpdGVyYXRvcik7Cn0KCmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewokcGF0aCA9IEZpbGVzeXN0ZW06OnRyaW1UcmFpbGluZ1NsYXNoKCRwYXRoKTsKCgoKCgoKCgoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAkdGhpcy0+ZmlsZXN5c3RlbS0+aXNKdW5jdGlvbigkcGF0aCkpIHsKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIFVuaW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKS4iLCBzb3VyY2UgaXMgc3RpbGwgcHJlc2VudCBpbiAkcGF0aCIpOwp9CmlmICghJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZUp1bmN0aW9uKCRwYXRoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgICA8d2FybmluZz5Db3VsZCBub3QgcmVtb3ZlIGp1bmN0aW9uIGF0ICIgLiAkcGF0aCAuICIgLSBpcyBhbm90aGVyIHByb2Nlc3MgbG9ja2luZyBpdD88L3dhcm5pbmc+Iik7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHJlbGlhYmx5IHJlbW92ZSBqdW5jdGlvbiBmb3IgcGFja2FnZSAnIC4gJHBhY2thZ2UtPmdldE5hbWUoKSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgokdXJsID0gJHBhY2thZ2UtPmdldERpc3RVcmwoKTsKaWYgKG51bGwgPT09ICR1cmwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgcGFja2FnZSAnLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyBoYXMgbm8gZGlzdCB1cmwgY29uZmlndXJlZCwgY2Fubm90IHJlbW92ZS4nKTsKfQoKCgoKCiRmcyA9IG5ldyBGaWxlc3lzdGVtOwokYWJzUGF0aCA9ICRmcy0+aXNBYnNvbHV0ZVBhdGgoJHBhdGgpID8gJHBhdGggOiBQbGF0Zm9ybTo6Z2V0Q3dkKCkgLiAnLycgLiAkcGF0aDsKJGFic0Rpc3RVcmwgPSAkZnMtPmlzQWJzb2x1dGVQYXRoKCR1cmwpID8gJHVybCA6IFBsYXRmb3JtOjpnZXRDd2QoKSAuICcvJyAuICR1cmw7CmlmICgkZnMtPm5vcm1hbGl6ZVBhdGgoJGFic1BhdGgpID09PSAkZnMtPm5vcm1hbGl6ZVBhdGgoJGFic0Rpc3RVcmwpKSB7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBVbmluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkuIiwgc291cmNlIGlzIHN0aWxsIHByZXNlbnQgaW4gJHBhdGgiKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCnJldHVybiBwYXJlbnQ6OnJlbW92ZSgkcGFja2FnZSwgJHBhdGgsICRvdXRwdXQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmNzUmVmZXJlbmNlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewokcGF0aCA9IEZpbGVzeXN0ZW06OnRyaW1UcmFpbGluZ1NsYXNoKCRwYXRoKTsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokZ3Vlc3NlciA9IG5ldyBWZXJzaW9uR3Vlc3NlcigkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHBhcnNlciwgJHRoaXMtPmlvKTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcjsKCiRwYWNrYWdlQ29uZmlnID0gJGR1bXBlci0+ZHVtcCgkcGFja2FnZSk7CiRwYWNrYWdlVmVyc2lvbiA9ICRndWVzc2VyLT5ndWVzc1ZlcnNpb24oJHBhY2thZ2VDb25maWcsICRwYXRoKTsKaWYgKCRwYWNrYWdlVmVyc2lvbiAhPT0gbnVsbCkgewpyZXR1cm4gJHBhY2thZ2VWZXJzaW9uWydjb21taXQnXTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRJbnN0YWxsT3BlcmF0aW9uQXBwZW5kaXgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKJHVybCA9ICRwYWNrYWdlLT5nZXREaXN0VXJsKCk7CmlmIChudWxsID09PSAkdXJsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIHBhY2thZ2UgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaGFzIG5vIGRpc3QgdXJsIGNvbmZpZ3VyZWQsIGNhbm5vdCBpbnN0YWxsLicpOwp9CiRyZWFsVXJsID0gcmVhbHBhdGgoJHVybCk7CmlmIChmYWxzZSA9PT0gJHJlYWxVcmwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gcmVhbHBhdGggJy4kdXJsKTsKfQoKaWYgKHJlYWxwYXRoKCRwYXRoKSA9PT0gJHJlYWxVcmwpIHsKcmV0dXJuICc6IFNvdXJjZSBhbHJlYWR5IHByZXNlbnQnOwp9CgpbJGN1cnJlbnRTdHJhdGVneV0gPSAkdGhpcy0+Y29tcHV0ZUFsbG93ZWRTdHJhdGVnaWVzKCRwYWNrYWdlLT5nZXRUcmFuc3BvcnRPcHRpb25zKCkpOwoKaWYgKCRjdXJyZW50U3RyYXRlZ3kgPT09IHNlbGY6OlNUUkFURUdZX1NZTUxJTkspIHsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gJzogSnVuY3Rpb25pbmcgZnJvbSAnLiRwYWNrYWdlLT5nZXREaXN0VXJsKCk7Cn0KCnJldHVybiAnOiBTeW1saW5raW5nIGZyb20gJy4kcGFja2FnZS0+Z2V0RGlzdFVybCgpOwp9CgpyZXR1cm4gJzogTWlycm9yaW5nIGZyb20gJy4kcGFja2FnZS0+Z2V0RGlzdFVybCgpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY29tcHV0ZUFsbG93ZWRTdHJhdGVnaWVzKGFycmF5ICR0cmFuc3BvcnRPcHRpb25zKTogYXJyYXkKewoKJGN1cnJlbnRTdHJhdGVneSA9IHNlbGY6OlNUUkFURUdZX1NZTUxJTks7CiRhbGxvd2VkU3RyYXRlZ2llcyA9IFtzZWxmOjpTVFJBVEVHWV9TWU1MSU5LLCBzZWxmOjpTVFJBVEVHWV9NSVJST1JdOwoKJG1pcnJvclBhdGhSZXBvcyA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX01JUlJPUl9QQVRIX1JFUE9TJyk7CmlmICgoYm9vbCkgJG1pcnJvclBhdGhSZXBvcykgewokY3VycmVudFN0cmF0ZWd5ID0gc2VsZjo6U1RSQVRFR1lfTUlSUk9SOwp9Cgokc3ltbGlua09wdGlvbiA9ICR0cmFuc3BvcnRPcHRpb25zWydzeW1saW5rJ10gPz8gbnVsbDsKCmlmICh0cnVlID09PSAkc3ltbGlua09wdGlvbikgewokY3VycmVudFN0cmF0ZWd5ID0gc2VsZjo6U1RSQVRFR1lfU1lNTElOSzsKJGFsbG93ZWRTdHJhdGVnaWVzID0gW3NlbGY6OlNUUkFURUdZX1NZTUxJTktdOwp9IGVsc2VpZiAoZmFsc2UgPT09ICRzeW1saW5rT3B0aW9uKSB7CiRjdXJyZW50U3RyYXRlZ3kgPSBzZWxmOjpTVFJBVEVHWV9NSVJST1I7CiRhbGxvd2VkU3RyYXRlZ2llcyA9IFtzZWxmOjpTVFJBVEVHWV9NSVJST1JdOwp9CgoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBzZWxmOjpTVFJBVEVHWV9TWU1MSU5LID09PSAkY3VycmVudFN0cmF0ZWd5ICYmICEkdGhpcy0+c2FmZUp1bmN0aW9ucygpKSB7CmlmICghaW5fYXJyYXkoc2VsZjo6U1RSQVRFR1lfTUlSUk9SLCAkYWxsb3dlZFN0cmF0ZWdpZXMsIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91IGFyZSBvbiBhbiBvbGQgV2luZG93cyAvIG9sZCBQSFAgY29tYm8gd2hpY2ggZG9lcyBub3QgYWxsb3cgQ29tcG9zZXIgdG8gdXNlIGp1bmN0aW9ucy9zeW1saW5rcyBhbmQgdGhpcyBwYXRoIHJlcG9zaXRvcnkgaGFzIHN5bWxpbms6dHJ1ZSBpbiBpdHMgb3B0aW9ucyBzbyBjb3B5aW5nIGlzIG5vdCBhbGxvd2VkJyk7Cn0KJGN1cnJlbnRTdHJhdGVneSA9IHNlbGY6OlNUUkFURUdZX01JUlJPUjsKJGFsbG93ZWRTdHJhdGVnaWVzID0gW3NlbGY6OlNUUkFURUdZX01JUlJPUl07Cn0KCgppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBzZWxmOjpTVFJBVEVHWV9TWU1MSU5LID09PSAkY3VycmVudFN0cmF0ZWd5ICYmICFmdW5jdGlvbl9leGlzdHMoJ3N5bWxpbmsnKSkgewppZiAoIWluX2FycmF5KHNlbGY6OlNUUkFURUdZX01JUlJPUiwgJGFsbG93ZWRTdHJhdGVnaWVzLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdXIgUEhQIGhhcyB0aGUgc3ltbGluaygpIGZ1bmN0aW9uIGRpc2FibGVkIHdoaWNoIGRvZXMgbm90IGFsbG93IENvbXBvc2VyIHRvIHVzZSBzeW1saW5rcyBhbmQgdGhpcyBwYXRoIHJlcG9zaXRvcnkgaGFzIHN5bWxpbms6dHJ1ZSBpbiBpdHMgb3B0aW9ucyBzbyBjb3B5aW5nIGlzIG5vdCBhbGxvd2VkJyk7Cn0KJGN1cnJlbnRTdHJhdGVneSA9IHNlbGY6OlNUUkFURUdZX01JUlJPUjsKJGFsbG93ZWRTdHJhdGVnaWVzID0gW3NlbGY6OlNUUkFURUdZX01JUlJPUl07Cn0KCnJldHVybiBbJGN1cnJlbnRTdHJhdGVneSwgJGFsbG93ZWRTdHJhdGVnaWVzXTsKfQoKCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNhZmVKdW5jdGlvbnMoKTogYm9vbAp7CgpyZXR1cm4gZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSAmJgooUEhQX1dJTkRPV1NfVkVSU0lPTl9NQUpPUiA+IDYgfHwKKFBIUF9XSU5ET1dTX1ZFUlNJT05fTUFKT1IgPT09IDYgJiYgUEhQX1dJTkRPV1NfVkVSU0lPTl9NSU5PUiA+PSAxKSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxVdGlsXFBlcmZvcmNlOwoKCgoKY2xhc3MgUGVyZm9yY2VEb3dubG9hZGVyIGV4dGVuZHMgVmNzRG93bmxvYWRlcgp7Cgpwcm90ZWN0ZWQgJHBlcmZvcmNlOwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRvSW5zdGFsbChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7CiRyZWYgPSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCk7CiRsYWJlbCA9ICR0aGlzLT5nZXRMYWJlbEZyb21Tb3VyY2VSZWZlcmVuY2UoKHN0cmluZykgJHJlZik7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0Nsb25pbmcgJyAuICRyZWYpOwokdGhpcy0+aW5pdFBlcmZvcmNlKCRwYWNrYWdlLCAkcGF0aCwgJHVybCk7CiR0aGlzLT5wZXJmb3JjZS0+c2V0U3RyZWFtKCRyZWYpOwokdGhpcy0+cGVyZm9yY2UtPnA0TG9naW4oKTsKJHRoaXMtPnBlcmZvcmNlLT53cml0ZVA0Q2xpZW50U3BlYygpOwokdGhpcy0+cGVyZm9yY2UtPmNvbm5lY3RDbGllbnQoKTsKJHRoaXMtPnBlcmZvcmNlLT5zeW5jQ29kZUJhc2UoJGxhYmVsKTsKJHRoaXMtPnBlcmZvcmNlLT5jbGVhbnVwQ2xpZW50U3BlYygpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0TGFiZWxGcm9tU291cmNlUmVmZXJlbmNlKHN0cmluZyAkcmVmKTogP3N0cmluZwp7CiRwb3MgPSBzdHJwb3MoJHJlZiwgJ0AnKTsKaWYgKGZhbHNlICE9PSAkcG9zKSB7CnJldHVybiBzdWJzdHIoJHJlZiwgJHBvcyArIDEpOwp9CgpyZXR1cm4gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGluaXRQZXJmb3JjZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogdm9pZAp7CmlmICghZW1wdHkoJHRoaXMtPnBlcmZvcmNlKSkgewokdGhpcy0+cGVyZm9yY2UtPmluaXRpYWxpemVQYXRoKCRwYXRoKTsKCnJldHVybjsKfQoKJHJlcG9zaXRvcnkgPSAkcGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpOwokcmVwb0NvbmZpZyA9IG51bGw7CmlmICgkcmVwb3NpdG9yeSBpbnN0YW5jZW9mIFZjc1JlcG9zaXRvcnkpIHsKJHJlcG9Db25maWcgPSAkdGhpcy0+Z2V0UmVwb0NvbmZpZygkcmVwb3NpdG9yeSk7Cn0KJHRoaXMtPnBlcmZvcmNlID0gUGVyZm9yY2U6OmNyZWF0ZSgkcmVwb0NvbmZpZywgJHVybCwgJHBhdGgsICR0aGlzLT5wcm9jZXNzLCAkdGhpcy0+aW8pOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFJlcG9Db25maWcoVmNzUmVwb3NpdG9yeSAkcmVwb3NpdG9yeSk6IGFycmF5CnsKcmV0dXJuICRyZXBvc2l0b3J5LT5nZXRSZXBvQ29uZmlnKCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1VwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5kb0luc3RhbGwoJHRhcmdldCwgJHBhdGgsICR1cmwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1BlcmZvcmNlIGRyaXZlciBkb2VzIG5vdCBjaGVjayBmb3IgbG9jYWwgY2hhbmdlcyBiZWZvcmUgb3ZlcnJpZGluZycpOwoKcmV0dXJuIG51bGw7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb21taXRMb2dzKHN0cmluZyAkZnJvbVJlZmVyZW5jZSwgc3RyaW5nICR0b1JlZmVyZW5jZSwgc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wZXJmb3JjZS0+Z2V0Q29tbWl0TG9ncygkZnJvbVJlZmVyZW5jZSwgJHRvUmVmZXJlbmNlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFBlcmZvcmNlKFBlcmZvcmNlICRwZXJmb3JjZSk6IHZvaWQKewokdGhpcy0+cGVyZm9yY2UgPSAkcGVyZm9yY2U7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNNZXRhZGF0YVJlcG9zaXRvcnkoc3RyaW5nICRwYXRoKTogYm9vbAp7CnJldHVybiB0cnVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBQaGFyRG93bmxvYWRlciBleHRlbmRzIEFyY2hpdmVEb3dubG9hZGVyCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKCiRhcmNoaXZlID0gbmV3IFxQaGFyKCRmaWxlKTsKJGFyY2hpdmUtPmV4dHJhY3RUbygkcGF0aCwgbnVsbCwgdHJ1ZSk7CgoKCgoKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxJbmlIZWxwZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBSYXJBcmNoaXZlOwoKCgoKCgoKCmNsYXNzIFJhckRvd25sb2FkZXIgZXh0ZW5kcyBBcmNoaXZlRG93bmxvYWRlcgp7CnByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZmlsZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiRwcm9jZXNzRXJyb3IgPSBudWxsOwoKCmlmICghUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRjb21tYW5kID0gWydzaCcsICctYycsICd1bnJhciB4IC0tICIkMCIgIiQxIiA+L2Rldi9udWxsICYmIGNobW9kIC1SIHUrdyAiJDEiJywgJGZpbGUsICRwYXRoXTsKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJGlnbm9yZWRPdXRwdXQpKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgokcHJvY2Vzc0Vycm9yID0gJ0ZhaWxlZCB0byBleGVjdXRlICcgLiBpbXBsb2RlKCcgJywgJGNvbW1hbmQpIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cn0KCmlmICghY2xhc3NfZXhpc3RzKCdSYXJBcmNoaXZlJykpIHsKCiRpbmlNZXNzYWdlID0gSW5pSGVscGVyOjpnZXRNZXNzYWdlKCk7CgokZXJyb3IgPSAiQ291bGQgbm90IGRlY29tcHJlc3MgdGhlIGFyY2hpdmUsIGVuYWJsZSB0aGUgUEhQIHJhciBleHRlbnNpb24gb3IgaW5zdGFsbCB1bnJhci5cbiIKLiAkaW5pTWVzc2FnZSAuICJcbiIgLiAkcHJvY2Vzc0Vycm9yOwoKaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJGVycm9yID0gIkNvdWxkIG5vdCBkZWNvbXByZXNzIHRoZSBhcmNoaXZlLCBlbmFibGUgdGhlIFBIUCByYXIgZXh0ZW5zaW9uLlxuIiAuICRpbmlNZXNzYWdlOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJGVycm9yKTsKfQoKJHJhckFyY2hpdmUgPSBSYXJBcmNoaXZlOjpvcGVuKCRmaWxlKTsKCmlmIChmYWxzZSA9PT0gJHJhckFyY2hpdmUpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBvcGVuIFJBUiBhcmNoaXZlOiAnIC4gJGZpbGUpOwp9CgokZW50cmllcyA9ICRyYXJBcmNoaXZlLT5nZXRFbnRyaWVzKCk7CgppZiAoZmFsc2UgPT09ICRlbnRyaWVzKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHJldHJpZXZlIFJBUiBhcmNoaXZlIGVudHJpZXMnKTsKfQoKZm9yZWFjaCAoJGVudHJpZXMgYXMgJGVudHJ5KSB7CmlmIChmYWxzZSA9PT0gJGVudHJ5LT5leHRyYWN0KCRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBleHRyYWN0IGVudHJ5Jyk7Cn0KfQoKJHJhckFyY2hpdmUtPmNsb3NlKCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcU3ZuIGFzIFN2blV0aWw7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgpjbGFzcyBTdm5Eb3dubG9hZGVyIGV4dGVuZHMgVmNzRG93bmxvYWRlcgp7Cgpwcm90ZWN0ZWQgJGNhY2hlQ3JlZGVudGlhbHMgPSB0cnVlOwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewpTdm5VdGlsOjpjbGVhbkVudigpOwokdXRpbCA9IG5ldyBTdm5VdGlsKCR1cmwsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwppZiAobnVsbCA9PT0gJHV0aWwtPmJpbmFyeVZlcnNpb24oKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ3N2biB3YXMgbm90IGZvdW5kIGluIHlvdXIgUEFUSCwgc2tpcHBpbmcgc291cmNlIGRvd25sb2FkJyk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9JbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKU3ZuVXRpbDo6Y2xlYW5FbnYoKTsKJHJlZiA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKCiRyZXBvID0gJHBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKTsKaWYgKCRyZXBvIGluc3RhbmNlb2YgVmNzUmVwb3NpdG9yeSkgewokcmVwb0NvbmZpZyA9ICRyZXBvLT5nZXRSZXBvQ29uZmlnKCk7CmlmIChhcnJheV9rZXlfZXhpc3RzKCdzdm4tY2FjaGUtY3JlZGVudGlhbHMnLCAkcmVwb0NvbmZpZykpIHsKJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMgPSAoYm9vbCkgJHJlcG9Db25maWdbJ3N2bi1jYWNoZS1jcmVkZW50aWFscyddOwp9Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiIENoZWNraW5nIG91dCAiLiRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSk7CiR0aGlzLT5leGVjdXRlKCRwYWNrYWdlLCAkdXJsLCBbJ3N2bicsICdjbyddLCBzcHJpbnRmKCIlcy8lcyIsICR1cmwsICRyZWYpLCBudWxsLCAkcGF0aCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvVXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2UKewpTdm5VdGlsOjpjbGVhbkVudigpOwokcmVmID0gJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCk7CgppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIC5zdm4gZGlyZWN0b3J5IGlzIG1pc3NpbmcgZnJvbSAnLiRwYXRoLicsIHNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9jb21taXQtZGVwcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOwp9CgokdXRpbCA9IG5ldyBTdm5VdGlsKCR1cmwsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwokZmxhZ3MgPSBbXTsKaWYgKHZlcnNpb25fY29tcGFyZSgkdXRpbC0+YmluYXJ5VmVyc2lvbigpLCAnMS43LjAnLCAnPj0nKSkgewokZmxhZ3NbXSA9ICctLWlnbm9yZS1hbmNlc3RyeSc7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiIENoZWNraW5nIG91dCAiIC4gJHJlZik7CiR0aGlzLT5leGVjdXRlKCR0YXJnZXQsICR1cmwsIGFycmF5X21lcmdlKFsnc3ZuJywgJ3N3aXRjaCddLCAkZmxhZ3MpLCBzcHJpbnRmKCIlcy8lcyIsICR1cmwsICRyZWYpLCAkcGF0aCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewpyZXR1cm4gbnVsbDsKfQoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydzdm4nLCAnc3RhdHVzJywgJy0taWdub3JlLWV4dGVybmFscyddLCAkb3V0cHV0LCAkcGF0aCk7CgpyZXR1cm4gUHJlZzo6aXNNYXRjaCgne14gKlteWCBdICt9bScsICRvdXRwdXQpID8gJG91dHB1dCA6IG51bGw7Cn0KCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRiYXNlVXJsLCBhcnJheSAkY29tbWFuZCwgc3RyaW5nICR1cmwsID9zdHJpbmcgJGN3ZCA9IG51bGwsID9zdHJpbmcgJHBhdGggPSBudWxsKTogc3RyaW5nCnsKJHV0aWwgPSBuZXcgU3ZuVXRpbCgkYmFzZVVybCwgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CiR1dGlsLT5zZXRDYWNoZUNyZWRlbnRpYWxzKCR0aGlzLT5jYWNoZUNyZWRlbnRpYWxzKTsKdHJ5IHsKcmV0dXJuICR1dGlsLT5leGVjdXRlKCRjb21tYW5kLCAkdXJsLCAkY3dkLCAkcGF0aCwgJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSk7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkLCAnLiRlLT5nZXRNZXNzYWdlKCkKKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2xlYW5DaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkdXBkYXRlKTogUHJvbWlzZUludGVyZmFjZQp7CmlmIChudWxsID09PSAoJGNoYW5nZXMgPSAkdGhpcy0+Z2V0TG9jYWxDaGFuZ2VzKCRwYWNrYWdlLCAkcGF0aCkpKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CmlmICh0cnVlID09PSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2Rpc2NhcmQtY2hhbmdlcycpKSB7CnJldHVybiAkdGhpcy0+ZGlzY2FyZENoYW5nZXMoJHBhdGgpOwp9CgpyZXR1cm4gcGFyZW50OjpjbGVhbkNoYW5nZXMoJHBhY2thZ2UsICRwYXRoLCAkdXBkYXRlKTsKfQoKJGNoYW5nZXMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkZWxlbSk6IHN0cmluZyB7CnJldHVybiAnICAgICcuJGVsZW07Cn0sIFByZWc6OnNwbGl0KCd7XHMqXHI/XG5ccyp9JywgJGNoYW5nZXMpKTsKJGNvdW50Q2hhbmdlcyA9IGNvdW50KCRjaGFuZ2VzKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJyAgICA8ZXJyb3I+Jy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaGFzIG1vZGlmaWVkIGZpbGUlczo8L2Vycm9yPicsICRjb3VudENoYW5nZXMgPT09IDEgPyAnJyA6ICdzJykpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoYXJyYXlfc2xpY2UoJGNoYW5nZXMsIDAsIDEwKSk7CmlmICgkY291bnRDaGFuZ2VzID4gMTApIHsKJHJlbWFpbmluZ0NoYW5nZXMgPSAkY291bnRDaGFuZ2VzIC0gMTA7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigKc3ByaW50ZigKJyAgICA8aW5mbz4nLiRyZW1haW5pbmdDaGFuZ2VzLicgbW9yZSBmaWxlJXMgbW9kaWZpZWQsIGNob29zZSAidiIgdG8gdmlldyB0aGUgZnVsbCBsaXN0PC9pbmZvPicsCiRyZW1haW5pbmdDaGFuZ2VzID09PSAxID8gJycgOiAncycKKQopOwp9Cgp3aGlsZSAodHJ1ZSkgewpzd2l0Y2ggKCR0aGlzLT5pby0+YXNrKCcgICAgPGluZm8+RGlzY2FyZCBjaGFuZ2VzIFt5LG4sdiw/XT88L2luZm8+ICcsICc/JykpIHsKY2FzZSAneSc6CiR0aGlzLT5kaXNjYXJkQ2hhbmdlcygkcGF0aCk7CmJyZWFrIDI7CgpjYXNlICduJzoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVcGRhdGUgYWJvcnRlZCcpOwoKY2FzZSAndic6CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkY2hhbmdlcyk7CmJyZWFrOwoKY2FzZSAnPyc6CmRlZmF1bHQ6CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCicgICAgeSAtIGRpc2NhcmQgY2hhbmdlcyBhbmQgYXBwbHkgdGhlICcuKCR1cGRhdGUgPyAndXBkYXRlJyA6ICd1bmluc3RhbGwnKSwKJyAgICBuIC0gYWJvcnQgdGhlICcuKCR1cGRhdGUgPyAndXBkYXRlJyA6ICd1bmluc3RhbGwnKS4nIGFuZCBsZXQgeW91IG1hbnVhbGx5IGNsZWFuIHRoaW5ncyB1cCcsCicgICAgdiAtIHZpZXcgbW9kaWZpZWQgZmlsZXMnLAonICAgID8gLSBwcmludCBoZWxwJywKXSk7CmJyZWFrOwp9Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWl0TG9ncyhzdHJpbmcgJGZyb21SZWZlcmVuY2UsIHN0cmluZyAkdG9SZWZlcmVuY2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CmlmIChQcmVnOjppc01hdGNoKCd7QChcZCspJH0nLCAkZnJvbVJlZmVyZW5jZSkgJiYgUHJlZzo6aXNNYXRjaCgne0AoXGQrKSR9JywgJHRvUmVmZXJlbmNlKSkgewoKJGNvbW1hbmQgPSBbJ3N2bicsICdpbmZvJywgJy0tbm9uLWludGVyYWN0aXZlJywgJy0teG1sJywgJy0tJywgJHBhdGhdOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpCik7Cn0KCiR1cmxQYXR0ZXJuID0gJyM8dXJsPiguKik8L3VybD4jJzsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJHVybFBhdHRlcm4sICRvdXRwdXQsICRtYXRjaGVzKSkgewokYmFzZVVybCA9ICRtYXRjaGVzWzFdOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidVbmFibGUgdG8gZGV0ZXJtaW5lIHN2biB1cmwgZm9yIHBhdGggJy4gJHBhdGgKKTsKfQoKCiRmcm9tUmV2aXNpb24gPSBQcmVnOjpyZXBsYWNlKCd7LipAKFxkKykkfScsICckMScsICRmcm9tUmVmZXJlbmNlKTsKJHRvUmV2aXNpb24gPSBQcmVnOjpyZXBsYWNlKCd7LipAKFxkKykkfScsICckMScsICR0b1JlZmVyZW5jZSk7CgokY29tbWFuZCA9IFsnc3ZuJywgJ2xvZycsICctcicsICRmcm9tUmV2aXNpb24uJzonLiR0b1JldmlzaW9uLCAnLS1pbmNyZW1lbnRhbCddOwoKJHV0aWwgPSBuZXcgU3ZuVXRpbCgkYmFzZVVybCwgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CiR1dGlsLT5zZXRDYWNoZUNyZWRlbnRpYWxzKCR0aGlzLT5jYWNoZUNyZWRlbnRpYWxzKTsKdHJ5IHsKcmV0dXJuICR1dGlsLT5leGVjdXRlTG9jYWwoJGNvbW1hbmQsICRwYXRoLCBudWxsLCAkdGhpcy0+aW8tPmlzVmVyYm9zZSgpKTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAonRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIuJGUtPmdldE1lc3NhZ2UoKQopOwp9Cn0KCnJldHVybiAiQ291bGQgbm90IHJldHJpZXZlIGNoYW5nZXMgYmV0d2VlbiAkZnJvbVJlZmVyZW5jZSBhbmQgJHRvUmVmZXJlbmNlIGR1ZSB0byBtaXNzaW5nIHJldmlzaW9uIGluZm9ybWF0aW9uIjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc2NhcmRDaGFuZ2VzKHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydzdm4nLCAncmV2ZXJ0JywgJy1SJywgJy4nXSwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHJlc2V0IGNoYW5nZXNcblxuOiIuJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc01ldGFkYXRhUmVwb3NpdG9yeShzdHJpbmcgJHBhdGgpOiBib29sCnsKcmV0dXJuIGlzX2RpcigkcGF0aC4nLy5zdm4nKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgVGFyRG93bmxvYWRlciBleHRlbmRzIEFyY2hpdmVEb3dubG9hZGVyCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKCiRhcmNoaXZlID0gbmV3IFxQaGFyRGF0YSgkZmlsZSk7CiRhcmNoaXZlLT5leHRyYWN0VG8oJHBhdGgsIG51bGwsIHRydWUpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCgoKCmNsYXNzIFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uCnsKCnByb3RlY3RlZCAkaGVhZGVyczsKCnByb3RlY3RlZCAkcmVzcG9uc2U7Cgpwcm90ZWN0ZWQgJHN0YXR1c0NvZGU7Cgpwcm90ZWN0ZWQgJHJlc3BvbnNlSW5mbyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSA9ICIiLCBpbnQgJGNvZGUgPSA0MDAsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUsICRwcmV2aW91cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWFkZXJzKGFycmF5ICRoZWFkZXJzKTogdm9pZAp7CiR0aGlzLT5oZWFkZXJzID0gJGhlYWRlcnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWFkZXJzKCk6ID9hcnJheQp7CnJldHVybiAkdGhpcy0+aGVhZGVyczsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFJlc3BvbnNlKD9zdHJpbmcgJHJlc3BvbnNlKTogdm9pZAp7CiR0aGlzLT5yZXNwb25zZSA9ICRyZXNwb25zZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlc3BvbnNlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPnJlc3BvbnNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3RhdHVzQ29kZSgkc3RhdHVzQ29kZSk6IHZvaWQKewokdGhpcy0+c3RhdHVzQ29kZSA9ICRzdGF0dXNDb2RlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdHVzQ29kZSgpOiA/aW50CnsKcmV0dXJuICR0aGlzLT5zdGF0dXNDb2RlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzcG9uc2VJbmZvKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXNwb25zZUluZm87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXNwb25zZUluZm8oYXJyYXkgJHJlc3BvbnNlSW5mbyk6IHZvaWQKewokdGhpcy0+cmVzcG9uc2VJbmZvID0gJHJlc3BvbnNlSW5mbzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIFZjc0NhcGFibGVEb3dubG9hZGVySW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWY3NSZWZlcmVuY2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZzsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxQYWNrYWdlXER1bXBlclxBcnJheUR1bXBlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uR3Vlc3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVXBkYXRlT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CgoKCgphYnN0cmFjdCBjbGFzcyBWY3NEb3dubG9hZGVyIGltcGxlbWVudHMgRG93bmxvYWRlckludGVyZmFjZSwgQ2hhbmdlUmVwb3J0SW50ZXJmYWNlLCBWY3NDYXBhYmxlRG93bmxvYWRlckludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRjb25maWc7Cgpwcm90ZWN0ZWQgJHByb2Nlc3M7Cgpwcm90ZWN0ZWQgJGZpbGVzeXN0ZW07Cgpwcm90ZWN0ZWQgJGhhc0NsZWFuZWRDaGFuZ2VzID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwsID9GaWxlc3lzdGVtICRmcyA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiR0aGlzLT5maWxlc3lzdGVtID0gJGZzID8/IG5ldyBGaWxlc3lzdGVtKCR0aGlzLT5wcm9jZXNzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxhdGlvblNvdXJjZSgpOiBzdHJpbmcKewpyZXR1cm4gJ3NvdXJjZSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCEkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaXMgbWlzc2luZyByZWZlcmVuY2UgaW5mb3JtYXRpb24nKTsKfQoKJHVybHMgPSAkdGhpcy0+cHJlcGFyZVVybHMoJHBhY2thZ2UtPmdldFNvdXJjZVVybHMoKSk7Cgp3aGlsZSAoJHVybCA9IGFycmF5X3NoaWZ0KCR1cmxzKSkgewp0cnkgewpyZXR1cm4gJHRoaXMtPmRvRG93bmxvYWQoJHBhY2thZ2UsICRwYXRoLCAkdXJsLCAkcHJldlBhY2thZ2UpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CgppZiAoJGUgaW5zdGFuY2VvZiBcUEhQVW5pdFxGcmFtZXdvcmtcRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CmlmICgkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0ZhaWxlZDogWycuZ2V0X2NsYXNzKCRlKS4nXSAnLiRlLT5nZXRNZXNzYWdlKCkpOwp9IGVsc2VpZiAoY291bnQoJHVybHMpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIEZhaWxlZCwgdHJ5aW5nIHRoZSBuZXh0IFVSTCcpOwp9CmlmICghY291bnQoJHVybHMpKSB7CnRocm93ICRlOwp9Cn0KfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICgkdHlwZSA9PT0gJ3VwZGF0ZScpIHsKJHRoaXMtPmNsZWFuQ2hhbmdlcygkcHJldlBhY2thZ2UsICRwYXRoLCB0cnVlKTsKJHRoaXMtPmhhc0NsZWFuZWRDaGFuZ2VzWyRwcmV2UGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpXSA9IHRydWU7Cn0gZWxzZWlmICgkdHlwZSA9PT0gJ2luc3RhbGwnKSB7CiR0aGlzLT5maWxlc3lzdGVtLT5lbXB0eURpcmVjdG9yeSgkcGF0aCk7Cn0gZWxzZWlmICgkdHlwZSA9PT0gJ3VuaW5zdGFsbCcpIHsKJHRoaXMtPmNsZWFuQ2hhbmdlcygkcGFja2FnZSwgJHBhdGgsIGZhbHNlKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhbnVwKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICgkdHlwZSA9PT0gJ3VwZGF0ZScgJiYgaXNzZXQoJHRoaXMtPmhhc0NsZWFuZWRDaGFuZ2VzWyRwcmV2UGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpXSkpIHsKJHRoaXMtPnJlYXBwbHlDaGFuZ2VzKCRwYXRoKTsKdW5zZXQoJHRoaXMtPmhhc0NsZWFuZWRDaGFuZ2VzWyRwcmV2UGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpXSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCEkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaXMgbWlzc2luZyByZWZlcmVuY2UgaW5mb3JtYXRpb24nKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIEluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkuJzogJywgZmFsc2UpOwoKJHVybHMgPSAkdGhpcy0+cHJlcGFyZVVybHMoJHBhY2thZ2UtPmdldFNvdXJjZVVybHMoKSk7CndoaWxlICgkdXJsID0gYXJyYXlfc2hpZnQoJHVybHMpKSB7CnRyeSB7CiR0aGlzLT5kb0luc3RhbGwoJHBhY2thZ2UsICRwYXRoLCAkdXJsKTsKYnJlYWs7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKCmlmICgkZSBpbnN0YW5jZW9mIFxQSFBVbml0XEZyYW1ld29ya1xFeGNlcHRpb24pIHsKdGhyb3cgJGU7Cn0KaWYgKCR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRmFpbGVkOiBbJy5nZXRfY2xhc3MoJGUpLiddICcuJGUtPmdldE1lc3NhZ2UoKSk7Cn0gZWxzZWlmIChjb3VudCgkdXJscykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgRmFpbGVkLCB0cnlpbmcgdGhlIG5leHQgVVJMJyk7Cn0KaWYgKCFjb3VudCgkdXJscykpIHsKdGhyb3cgJGU7Cn0KfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoISR0YXJnZXQtPmdldFNvdXJjZVJlZmVyZW5jZSgpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlICcuJHRhcmdldC0+Z2V0UHJldHR5TmFtZSgpLicgaXMgbWlzc2luZyByZWZlcmVuY2UgaW5mb3JtYXRpb24nKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIFVwZGF0ZU9wZXJhdGlvbjo6Zm9ybWF0KCRpbml0aWFsLCAkdGFyZ2V0KS4nOiAnLCBmYWxzZSk7CgokdXJscyA9ICR0aGlzLT5wcmVwYXJlVXJscygkdGFyZ2V0LT5nZXRTb3VyY2VVcmxzKCkpOwoKJGV4Y2VwdGlvbiA9IG51bGw7CndoaWxlICgkdXJsID0gYXJyYXlfc2hpZnQoJHVybHMpKSB7CnRyeSB7CiR0aGlzLT5kb1VwZGF0ZSgkaW5pdGlhbCwgJHRhcmdldCwgJHBhdGgsICR1cmwpOwoKJGV4Y2VwdGlvbiA9IG51bGw7CmJyZWFrOwp9IGNhdGNoIChcRXhjZXB0aW9uICRleGNlcHRpb24pIHsKCmlmICgkZXhjZXB0aW9uIGluc3RhbmNlb2YgXFBIUFVuaXRcRnJhbWV3b3JrXEV4Y2VwdGlvbikgewp0aHJvdyAkZXhjZXB0aW9uOwp9CmlmICgkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0ZhaWxlZDogWycuZ2V0X2NsYXNzKCRleGNlcHRpb24pLiddICcuJGV4Y2VwdGlvbi0+Z2V0TWVzc2FnZSgpKTsKfSBlbHNlaWYgKGNvdW50KCR1cmxzKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBGYWlsZWQsIHRyeWluZyB0aGUgbmV4dCBVUkwnKTsKfQp9Cn0KCgoKaWYgKCEkZXhjZXB0aW9uICYmICR0aGlzLT5pby0+aXNWZXJib3NlKCkgJiYgJHRoaXMtPmhhc01ldGFkYXRhUmVwb3NpdG9yeSgkcGF0aCkpIHsKJG1lc3NhZ2UgPSAnUHVsbGluZyBpbiBjaGFuZ2VzOic7CiRsb2dzID0gJHRoaXMtPmdldENvbW1pdExvZ3MoJGluaXRpYWwtPmdldFNvdXJjZVJlZmVyZW5jZSgpLCAkdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKSwgJHBhdGgpOwoKaWYgKCcnID09PSB0cmltKCRsb2dzKSkgewokbWVzc2FnZSA9ICdSb2xsaW5nIGJhY2sgY2hhbmdlczonOwokbG9ncyA9ICR0aGlzLT5nZXRDb21taXRMb2dzKCR0YXJnZXQtPmdldFNvdXJjZVJlZmVyZW5jZSgpLCAkaW5pdGlhbC0+Z2V0U291cmNlUmVmZXJlbmNlKCksICRwYXRoKTsKfQoKaWYgKCcnICE9PSB0cmltKCRsb2dzKSkgewokbG9ncyA9IGltcGxvZGUoIlxuIiwgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGxpbmUpOiBzdHJpbmcgewpyZXR1cm4gJyAgICAgICcgLiAkbGluZTsKfSwgZXhwbG9kZSgiXG4iLCAkbG9ncykpKTsKCgokbG9ncyA9IHN0cl9yZXBsYWNlKCc8JywgJ1w8JywgJGxvZ3MpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgJy4kbWVzc2FnZSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbG9ncyk7Cn0KfQoKaWYgKCEkdXJscyAmJiAkZXhjZXB0aW9uKSB7CnRocm93ICRleGNlcHRpb247Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gVW5pbnN0YWxsT3BlcmF0aW9uOjpmb3JtYXQoJHBhY2thZ2UpKTsKCiRwcm9taXNlID0gJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeUFzeW5jKCRwYXRoKTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKGJvb2wgJHJlc3VsdCkgdXNlICgkcGF0aCkgewppZiAoISRyZXN1bHQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgY29tcGxldGVseSBkZWxldGUgJy4kcGF0aC4nLCBhYm9ydGluZy4nKTsKfQp9KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZjc1JlZmVyZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokZ3Vlc3NlciA9IG5ldyBWZXJzaW9uR3Vlc3NlcigkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHBhcnNlciwgJHRoaXMtPmlvKTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcjsKCiRwYWNrYWdlQ29uZmlnID0gJGR1bXBlci0+ZHVtcCgkcGFja2FnZSk7CmlmICgkcGFja2FnZVZlcnNpb24gPSAkZ3Vlc3Nlci0+Z3Vlc3NWZXJzaW9uKCRwYWNrYWdlQ29uZmlnLCAkcGF0aCkpIHsKcmV0dXJuICRwYWNrYWdlVmVyc2lvblsnY29tbWl0J107Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2xlYW5DaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkdXBkYXRlKTogUHJvbWlzZUludGVyZmFjZQp7CgppZiAobnVsbCAhPT0gJHRoaXMtPmdldExvY2FsQ2hhbmdlcygkcGFja2FnZSwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignU291cmNlIGRpcmVjdG9yeSAnIC4gJHBhdGggLiAnIGhhcyB1bmNvbW1pdHRlZCBjaGFuZ2VzLicpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcmVhcHBseUNoYW5nZXMoc3RyaW5nICRwYXRoKTogdm9pZAp7Cn0KCgoKCgoKCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkb0Rvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9JbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGRvVXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbW1pdExvZ3Moc3RyaW5nICRmcm9tUmVmZXJlbmNlLCBzdHJpbmcgJHRvUmVmZXJlbmNlLCBzdHJpbmcgJHBhdGgpOiBzdHJpbmc7CgoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc01ldGFkYXRhUmVwb3NpdG9yeShzdHJpbmcgJHBhdGgpOiBib29sOwoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHByZXBhcmVVcmxzKGFycmF5ICR1cmxzKTogYXJyYXkKewpmb3JlYWNoICgkdXJscyBhcyAkaW5kZXggPT4gJHVybCkgewppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHVybCkpIHsKCgokZmlsZVByb3RvY29sID0gJ2ZpbGU6Ly8nOwokaXNGaWxlUHJvdG9jb2wgPSBmYWxzZTsKaWYgKDAgPT09IHN0cnBvcygkdXJsLCAkZmlsZVByb3RvY29sKSkgewokdXJsID0gc3Vic3RyKCR1cmwsIHN0cmxlbigkZmlsZVByb3RvY29sKSk7CiRpc0ZpbGVQcm90b2NvbCA9IHRydWU7Cn0KCgppZiAoZmFsc2UgIT09IHN0cnBvcygkdXJsLCAnJScpKSB7CiR1cmwgPSByYXd1cmxkZWNvZGUoJHVybCk7Cn0KCiR1cmxzWyRpbmRleF0gPSByZWFscGF0aCgkdXJsKTsKCmlmICgkaXNGaWxlUHJvdG9jb2wpIHsKJHVybHNbJGluZGV4XSA9ICRmaWxlUHJvdG9jb2wgLiAkdXJsc1skaW5kZXhdOwp9Cn0KfQoKcmV0dXJuICR1cmxzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CgoKCgoKCgpjbGFzcyBYekRvd25sb2FkZXIgZXh0ZW5kcyBBcmNoaXZlRG93bmxvYWRlcgp7CnByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZmlsZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiRjb21tYW5kID0gWyd0YXInLCAnLXhKZicsICRmaWxlLCAnLUMnLCAkcGF0aF07CgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0KSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJHByb2Nlc3NFcnJvciA9ICdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRwcm9jZXNzRXJyb3IpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxJbmlIZWxwZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4ZWN1dGFibGVGaW5kZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBaaXBBcmNoaXZlOwoKCgoKY2xhc3MgWmlwRG93bmxvYWRlciBleHRlbmRzIEFyY2hpdmVEb3dubG9hZGVyCnsKCnByaXZhdGUgc3RhdGljICR1bnppcENvbW1hbmRzOwoKcHJpdmF0ZSBzdGF0aWMgJGhhc1ppcEFyY2hpdmU7Cgpwcml2YXRlIHN0YXRpYyAkaXNXaW5kb3dzOwoKCnByaXZhdGUgJHppcEFyY2hpdmVPYmplY3Q7IAoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewppZiAobnVsbCA9PT0gc2VsZjo6JHVuemlwQ29tbWFuZHMpIHsKc2VsZjo6JHVuemlwQ29tbWFuZHMgPSBbXTsKJGZpbmRlciA9IG5ldyBFeGVjdXRhYmxlRmluZGVyOwppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmICgkY21kID0gJGZpbmRlci0+ZmluZCgnN3onLCBudWxsLCBbJ0M6XFByb2dyYW0gRmlsZXNcNy1aaXAnXSkpKSB7CnNlbGY6OiR1bnppcENvbW1hbmRzW10gPSBbJzd6JywgJGNtZCwgJ3gnLCAnLWJiMCcsICcteScsICclZmlsZSUnLCAnLW8lcGF0aCUnXTsKfQppZiAoJGNtZCA9ICRmaW5kZXItPmZpbmQoJ3VuemlwJykpIHsKc2VsZjo6JHVuemlwQ29tbWFuZHNbXSA9IFsndW56aXAnLCAkY21kLCAnLXFxJywgJyVmaWxlJScsICctZCcsICclcGF0aCUnXTsKfQppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAoJGNtZCA9ICRmaW5kZXItPmZpbmQoJzd6JykpKSB7IApzZWxmOjokdW56aXBDb21tYW5kc1tdID0gWyc3eicsICRjbWQsICd4JywgJy1iYjAnLCAnLXknLCAnJWZpbGUlJywgJy1vJXBhdGglJ107Cn0KaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgKCRjbWQgPSAkZmluZGVyLT5maW5kKCc3enonKSkpIHsgCnNlbGY6OiR1bnppcENvbW1hbmRzW10gPSBbJzd6eicsICRjbWQsICd4JywgJy1iYjAnLCAnLXknLCAnJWZpbGUlJywgJy1vJXBhdGglJ107Cn0KfQoKJHByb2NPcGVuTWlzc2luZyA9IGZhbHNlOwppZiAoIWZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpIHsKc2VsZjo6JHVuemlwQ29tbWFuZHMgPSBbXTsKJHByb2NPcGVuTWlzc2luZyA9IHRydWU7Cn0KCmlmIChudWxsID09PSBzZWxmOjokaGFzWmlwQXJjaGl2ZSkgewpzZWxmOjokaGFzWmlwQXJjaGl2ZSA9IGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpOwp9CgppZiAoIXNlbGY6OiRoYXNaaXBBcmNoaXZlICYmICFzZWxmOjokdW56aXBDb21tYW5kcykgewoKJGluaU1lc3NhZ2UgPSBJbmlIZWxwZXI6OmdldE1lc3NhZ2UoKTsKaWYgKCRwcm9jT3Blbk1pc3NpbmcpIHsKJGVycm9yID0gIlRoZSB6aXAgZXh0ZW5zaW9uIGlzIG1pc3NpbmcgYW5kIHVuemlwLzd6IGNvbW1hbmRzIGNhbm5vdCBiZSBjYWxsZWQgYXMgcHJvY19vcGVuIGlzIGRpc2FibGVkLCBza2lwcGluZy5cbiIgLiAkaW5pTWVzc2FnZTsKfSBlbHNlIHsKJGVycm9yID0gIlRoZSB6aXAgZXh0ZW5zaW9uIGFuZCB1bnppcC83eiBjb21tYW5kcyBhcmUgYm90aCBtaXNzaW5nLCBza2lwcGluZy5cbiIgLiAkaW5pTWVzc2FnZTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRlcnJvcik7Cn0KCmlmIChudWxsID09PSBzZWxmOjokaXNXaW5kb3dzKSB7CnNlbGY6OiRpc1dpbmRvd3MgPSBQbGF0Zm9ybTo6aXNXaW5kb3dzKCk7CgppZiAoIXNlbGY6OiRpc1dpbmRvd3MgJiYgIXNlbGY6OiR1bnppcENvbW1hbmRzKSB7CmlmICgkcHJvY09wZW5NaXNzaW5nKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiPHdhcm5pbmc+cHJvY19vcGVuIGlzIGRpc2FibGVkIHNvICd1bnppcCcgYW5kICc3eicgY29tbWFuZHMgY2Fubm90IGJlIHVzZWQsIHppcCBmaWxlcyBhcmUgYmVpbmcgdW5wYWNrZWQgdXNpbmcgdGhlIFBIUCB6aXAgZXh0ZW5zaW9uLjwvd2FybmluZz4iKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCI8d2FybmluZz5UaGlzIG1heSBjYXVzZSBpbnZhbGlkIHJlcG9ydHMgb2YgY29ycnVwdGVkIGFyY2hpdmVzLiBCZXNpZGVzLCBhbnkgVU5JWCBwZXJtaXNzaW9ucyAoZS5nLiBleGVjdXRhYmxlKSBkZWZpbmVkIGluIHRoZSBhcmNoaXZlcyB3aWxsIGJlIGxvc3QuPC93YXJuaW5nPiIpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPkVuYWJsaW5nIHByb2Nfb3BlbiBhbmQgaW5zdGFsbGluZyAndW56aXAnIG9yICc3eicgKDIxLjAxKykgbWF5IHJlbWVkaWF0ZSB0aGVtLjwvd2FybmluZz4iKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCI8d2FybmluZz5BcyB0aGVyZSBpcyBubyAndW56aXAnIG5vciAnN3onIGNvbW1hbmQgaW5zdGFsbGVkIHppcCBmaWxlcyBhcmUgYmVpbmcgdW5wYWNrZWQgdXNpbmcgdGhlIFBIUCB6aXAgZXh0ZW5zaW9uLjwvd2FybmluZz4iKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCI8d2FybmluZz5UaGlzIG1heSBjYXVzZSBpbnZhbGlkIHJlcG9ydHMgb2YgY29ycnVwdGVkIGFyY2hpdmVzLiBCZXNpZGVzLCBhbnkgVU5JWCBwZXJtaXNzaW9ucyAoZS5nLiBleGVjdXRhYmxlKSBkZWZpbmVkIGluIHRoZSBhcmNoaXZlcyB3aWxsIGJlIGxvc3QuPC93YXJuaW5nPiIpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPkluc3RhbGxpbmcgJ3VuemlwJyBvciAnN3onICgyMS4wMSspIG1heSByZW1lZGlhdGUgdGhlbS48L3dhcm5pbmc+Iik7Cn0KfQp9CgpyZXR1cm4gcGFyZW50Ojpkb3dubG9hZCgkcGFja2FnZSwgJHBhdGgsICRwcmV2UGFja2FnZSwgJG91dHB1dCk7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4dHJhY3RXaXRoU3lzdGVtVW56aXAoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKc3RhdGljICR3YXJuZWQ3WmlwTGludXggPSBmYWxzZTsKCgokaXNMYXN0Q2hhbmNlID0gIXNlbGY6OiRoYXNaaXBBcmNoaXZlOwoKaWYgKDAgPT09IFxjb3VudChzZWxmOjokdW56aXBDb21tYW5kcykpIHsKCgpyZXR1cm4gJHRoaXMtPmV4dHJhY3RXaXRoWmlwQXJjaGl2ZSgkcGFja2FnZSwgJGZpbGUsICRwYXRoKTsKfQoKJGNvbW1hbmRTcGVjID0gcmVzZXQoc2VsZjo6JHVuemlwQ29tbWFuZHMpOwokZXhlY3V0YWJsZSA9ICRjb21tYW5kU3BlY1swXTsKJGNvbW1hbmQgPSBhcnJheV9zbGljZSgkY29tbWFuZFNwZWMsIDEpOwokbWFwID0gWwoKCiclZmlsZSUnID0+IHN0cnRyKCRmaWxlLCAnLycsIERJUkVDVE9SWV9TRVBBUkFUT1IpLAonJXBhdGglJyA9PiBzdHJ0cigkcGF0aCwgJy8nLCBESVJFQ1RPUllfU0VQQVJBVE9SKSwKXTsKJGNvbW1hbmQgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJG1hcCkgewpyZXR1cm4gc3RydHIoJHZhbHVlLCAkbWFwKTsKfSwgJGNvbW1hbmQpOwoKaWYgKCEkd2FybmVkN1ppcExpbnV4ICYmICFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgaW5fYXJyYXkoJGV4ZWN1dGFibGUsIFsnN3onLCAnN3p6J10sIHRydWUpKSB7CiR3YXJuZWQ3WmlwTGludXggPSB0cnVlOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWyRjb21tYW5kU3BlY1sxXV0sICRvdXRwdXQpKSB7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlxzKjctWmlwKD86IFxbNjRcXSk/IChbMC05Ll0rKX0nLCAkb3V0cHV0LCAkbWF0Y2gpICYmIHZlcnNpb25fY29tcGFyZSgkbWF0Y2hbMV0sICcyMS4wMScsICc8JykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+VW56aXBwaW5nIHVzaW5nICcuJGV4ZWN1dGFibGUuJyAnLiRtYXRjaFsxXS4nIG1heSByZXN1bHQgaW4gaW5jb3JyZWN0IGZpbGUgcGVybWlzc2lvbnMuIEluc3RhbGwgJy4kZXhlY3V0YWJsZS4nIDIxLjAxKyBvciB1bnppcCB0byBlbnN1cmUgeW91IGdldCBjb3JyZWN0IHBlcm1pc3Npb25zLjwvd2FybmluZz4nKTsKfQp9Cn0KCiRpbyA9ICR0aGlzLT5pbzsKJHRyeUZhbGxiYWNrID0gZnVuY3Rpb24gKFxUaHJvd2FibGUgJHByb2Nlc3NFcnJvcikgdXNlICgkaXNMYXN0Q2hhbmNlLCAkaW8sICRmaWxlLCAkcGF0aCwgJHBhY2thZ2UsICRleGVjdXRhYmxlKTogXFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZSB7CmlmICgkaXNMYXN0Q2hhbmNlKSB7CnRocm93ICRwcm9jZXNzRXJyb3I7Cn0KCmlmIChzdHJfY29udGFpbnMoJHByb2Nlc3NFcnJvci0+Z2V0TWVzc2FnZSgpLCAnemlwIGJvbWInKSkgewp0aHJvdyAkcHJvY2Vzc0Vycm9yOwp9CgppZiAoIWlzX2ZpbGUoJGZpbGUpKSB7CiRpby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPicuJHByb2Nlc3NFcnJvci0+Z2V0TWVzc2FnZSgpLic8L3dhcm5pbmc+Jyk7CiRpby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPlRoaXMgbW9zdCBsaWtlbHkgaXMgZHVlIHRvIGEgY3VzdG9tIGluc3RhbGxlciBwbHVnaW4gbm90IGhhbmRsaW5nIHRoZSByZXR1cm5lZCBQcm9taXNlIGZyb20gdGhlIGRvd25sb2FkZXI8L3dhcm5pbmc+Jyk7CiRpby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPlNlZSBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvaW5zdGFsbGVycy9jb21taXQvNTAwNmQwYzI4NzMwYWRlMjMzYThmNDJlYzMxYWM2OGZiMWM1YzliYiBmb3IgYW4gZXhhbXBsZSBmaXg8L3dhcm5pbmc+Jyk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPicuJHByb2Nlc3NFcnJvci0+Z2V0TWVzc2FnZSgpLic8L3dhcm5pbmc+Jyk7CiRpby0+d3JpdGVFcnJvcignICAgIFRoZSBhcmNoaXZlIG1heSBjb250YWluIGlkZW50aWNhbCBmaWxlIG5hbWVzIHdpdGggZGlmZmVyZW50IGNhcGl0YWxpemF0aW9uICh3aGljaCBmYWlscyBvbiBjYXNlIGluc2Vuc2l0aXZlIGZpbGVzeXN0ZW1zKScpOwokaW8tPndyaXRlRXJyb3IoJyAgICBVbnppcCB3aXRoICcuJGV4ZWN1dGFibGUuJyBjb21tYW5kIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIFppcEFyY2hpdmUgY2xhc3MnKTsKCgppZiAoUGxhdGZvcm06OmdldEVudignR0lUSFVCX0FDVElPTlMnKSAhPT0gZmFsc2UgJiYgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfVEVTVFNfQVJFX1JVTk5JTkcnKSA9PT0gZmFsc2UpIHsKJGlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+QWRkaXRpb25hbCBkZWJ1ZyBpbmZvLCBwbGVhc2UgcmVwb3J0IHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMvMTExNDggaWYgeW91IHNlZSB0aGlzOjwvd2FybmluZz4nKTsKJGlvLT53cml0ZUVycm9yKCdGaWxlIHNpemU6ICcuQGZpbGVzaXplKCRmaWxlKSk7CiRpby0+d3JpdGVFcnJvcignRmlsZSBTSEExOiAnLmhhc2hfZmlsZSgnc2hhMScsICRmaWxlKSk7CiRpby0+d3JpdGVFcnJvcignRmlyc3QgMTAwIGJ5dGVzIChoZXgpOiAnLmJpbjJoZXgoc3Vic3RyKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSwgMCwgMTAwKSkpOwokaW8tPndyaXRlRXJyb3IoJ0xhc3QgMTAwIGJ5dGVzIChoZXgpOiAnLmJpbjJoZXgoc3Vic3RyKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSwgLTEwMCkpKTsKaWYgKHN0cmxlbigoc3RyaW5nKSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpKSA+IDApIHsKJGlvLT53cml0ZUVycm9yKCdPcmlnaW4gVVJMOiAnLiR0aGlzLT5wcm9jZXNzVXJsKCRwYWNrYWdlLCAoc3RyaW5nKSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpKSk7CiRpby0+d3JpdGVFcnJvcignUmVzcG9uc2UgSGVhZGVyczogJy5qc29uX2VuY29kZShGaWxlRG93bmxvYWRlcjo6JHJlc3BvbnNlSGVhZGVyc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA/PyBbXSkpOwp9Cn0KfQoKcmV0dXJuICR0aGlzLT5leHRyYWN0V2l0aFppcEFyY2hpdmUoJHBhY2thZ2UsICRmaWxlLCAkcGF0aCk7Cn07Cgp0cnkgewokcHJvbWlzZSA9ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlQXN5bmMoJGNvbW1hbmQpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uIChQcm9jZXNzICRwcm9jZXNzKSB1c2UgKCR0cnlGYWxsYmFjaywgJGNvbW1hbmQsICRwYWNrYWdlLCAkZmlsZSkgewppZiAoISRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkgewppZiAoaXNzZXQoJHRoaXMtPmNsZWFudXBFeGVjdXRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXh0cmFjdCAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJyBhcyB0aGUgaW5zdGFsbGF0aW9uIHdhcyBhYm9ydGVkIGJ5IGFub3RoZXIgcGFja2FnZSBvcGVyYXRpb24uJyk7Cn0KCiRvdXRwdXQgPSAkcHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKJG91dHB1dCA9IHN0cl9yZXBsYWNlKCcsICcuJGZpbGUuJy56aXAgb3IgJy4kZmlsZS4nLlpJUCcsICcnLCAkb3V0cHV0KTsKCnJldHVybiAkdHJ5RmFsbGJhY2sobmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXh0cmFjdCAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJzogKCcuJHByb2Nlc3MtPmdldEV4aXRDb2RlKCkuJykgJy5pbXBsb2RlKCcgJywgJGNvbW1hbmQpLiJcblxuIi4kb3V0cHV0KSk7Cn0KfSk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKcmV0dXJuICR0cnlGYWxsYmFjaygkZSk7Cn0KfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdFdpdGhaaXBBcmNoaXZlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZmlsZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiRwcm9jZXNzRXJyb3IgPSBudWxsOwokemlwQXJjaGl2ZSA9ICR0aGlzLT56aXBBcmNoaXZlT2JqZWN0ID86IG5ldyBaaXBBcmNoaXZlKCk7Cgp0cnkgewppZiAoIWZpbGVfZXhpc3RzKCRmaWxlKSB8fCAoJGZpbGVzaXplID0gZmlsZXNpemUoJGZpbGUpKSA9PT0gZmFsc2UgfHwgJGZpbGVzaXplID09PSAwKSB7CiRyZXR2YWwgPSAtMTsKfSBlbHNlIHsKJHJldHZhbCA9ICR6aXBBcmNoaXZlLT5vcGVuKCRmaWxlKTsKfQoKaWYgKHRydWUgPT09ICRyZXR2YWwpIHsKJHRvdGFsU2l6ZSA9IDA7CiRhcmNoaXZlU2l6ZSA9IGZpbGVzaXplKCRmaWxlKTsKJHRvdGFsRmlsZXMgPSAkemlwQXJjaGl2ZS0+Y291bnQoKTsKaWYgKCR0b3RhbEZpbGVzID4gMCkgewokaW5zcGVjdEFsbCA9IGZhbHNlOwokZmlsZXNUb0luc3BlY3QgPSBtaW4oJHRvdGFsRmlsZXMsIDUpOwpmb3IgKCRpID0gMDsgJGkgPCAkZmlsZXNUb0luc3BlY3Q7ICRpKyspIHsKJHN0YXQgPSAkemlwQXJjaGl2ZS0+c3RhdEluZGV4KCRpbnNwZWN0QWxsID8gJGkgOiByYW5kb21faW50KDAsICR0b3RhbEZpbGVzIC0gMSkpOwppZiAoJHN0YXQgPT09IGZhbHNlKSB7CmNvbnRpbnVlOwp9CiR0b3RhbFNpemUgKz0gJHN0YXRbJ3NpemUnXTsKaWYgKCEkaW5zcGVjdEFsbCAmJiAkc3RhdFsnc2l6ZSddID4gJHN0YXRbJ2NvbXBfc2l6ZSddICogMjAwKSB7CiR0b3RhbFNpemUgPSAwOwokaW5zcGVjdEFsbCA9IHRydWU7CiRpID0gLTE7CiRmaWxlc1RvSW5zcGVjdCA9ICR0b3RhbEZpbGVzOwp9Cn0KaWYgKCRhcmNoaXZlU2l6ZSAhPT0gZmFsc2UgJiYgJHRvdGFsU2l6ZSA+ICRhcmNoaXZlU2l6ZSAqIDEwMCAmJiAkdG90YWxTaXplID4gNTAqMTAyNCoxMDI0KSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCB6aXAgZmlsZSBmb3IgIicuJHBhY2thZ2UtPmdldE5hbWUoKS4nIiB3aXRoIGNvbXByZXNzaW9uIHJhdGlvID45OSUgKHBvc3NpYmxlIHppcCBib21iKScpOwp9Cn0KCiRleHRyYWN0UmVzdWx0ID0gJHppcEFyY2hpdmUtPmV4dHJhY3RUbygkcGF0aCk7CgppZiAodHJ1ZSA9PT0gJGV4dHJhY3RSZXN1bHQpIHsKJHppcEFyY2hpdmUtPmNsb3NlKCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJHByb2Nlc3NFcnJvciA9IG5ldyBcUnVudGltZUV4Y2VwdGlvbihydHJpbSgiVGhlcmUgd2FzIGFuIGVycm9yIGV4dHJhY3RpbmcgdGhlIFpJUCBmaWxlIGZvciBcInskcGFja2FnZS0+Z2V0TmFtZSgpfVwiLCBpdCBpcyBlaXRoZXIgY29ycnVwdGVkIG9yIHVzaW5nIGFuIGludmFsaWQgZm9ybWF0LlxuIikpOwp9IGVsc2UgewokcHJvY2Vzc0Vycm9yID0gbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24ocnRyaW0oJHRoaXMtPmdldEVycm9yTWVzc2FnZSgkcmV0dmFsLCAkZmlsZSkuIlxuIiksICRyZXR2YWwpOwp9Cn0gY2F0Y2ggKFxFcnJvckV4Y2VwdGlvbiAkZSkgewokcHJvY2Vzc0Vycm9yID0gbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgYXJjaGl2ZSBmb3IgIicuJHBhY2thZ2UtPmdldE5hbWUoKS4nIiBtYXkgY29udGFpbiBpZGVudGljYWwgZmlsZSBuYW1lcyB3aXRoIGRpZmZlcmVudCBjYXBpdGFsaXphdGlvbiAod2hpY2ggZmFpbHMgb24gY2FzZSBpbnNlbnNpdGl2ZSBmaWxlc3lzdGVtcyk6ICcuJGUtPmdldE1lc3NhZ2UoKSwgMCwgJGUpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiRwcm9jZXNzRXJyb3IgPSAkZTsKfQoKdGhyb3cgJHByb2Nlc3NFcnJvcjsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5leHRyYWN0V2l0aFN5c3RlbVVuemlwKCRwYWNrYWdlLCAkZmlsZSwgJHBhdGgpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGludCAkcmV0dmFsLCBzdHJpbmcgJGZpbGUpOiBzdHJpbmcKewpzd2l0Y2ggKCRyZXR2YWwpIHsKY2FzZSBaaXBBcmNoaXZlOjpFUl9FWElTVFM6CnJldHVybiBzcHJpbnRmKCJGaWxlICclcycgYWxyZWFkeSBleGlzdHMuIiwgJGZpbGUpOwpjYXNlIFppcEFyY2hpdmU6OkVSX0lOQ09OUzoKcmV0dXJuIHNwcmludGYoIlppcCBhcmNoaXZlICclcycgaXMgaW5jb25zaXN0ZW50LiIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9JTlZBTDoKcmV0dXJuIHNwcmludGYoIkludmFsaWQgYXJndW1lbnQgKCVzKSIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9NRU1PUlk6CnJldHVybiBzcHJpbnRmKCJNYWxsb2MgZmFpbHVyZSAoJXMpIiwgJGZpbGUpOwpjYXNlIFppcEFyY2hpdmU6OkVSX05PRU5UOgpyZXR1cm4gc3ByaW50ZigiTm8gc3VjaCB6aXAgZmlsZTogJyVzJyIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9OT1pJUDoKcmV0dXJuIHNwcmludGYoIiclcycgaXMgbm90IGEgemlwIGFyY2hpdmUuIiwgJGZpbGUpOwpjYXNlIFppcEFyY2hpdmU6OkVSX09QRU46CnJldHVybiBzcHJpbnRmKCJDYW4ndCBvcGVuIHppcCBmaWxlOiAlcyIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9SRUFEOgpyZXR1cm4gc3ByaW50ZigiWmlwIHJlYWQgZXJyb3IgKCVzKSIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9TRUVLOgpyZXR1cm4gc3ByaW50ZigiWmlwIHNlZWsgZXJyb3IgKCVzKSIsICRmaWxlKTsKY2FzZSAtMToKcmV0dXJuIHNwcmludGYoIiclcycgaXMgYSBjb3JydXB0ZWQgemlwIGFyY2hpdmUgKDAgYnl0ZXMpLCB0cnkgYWdhaW4uIiwgJGZpbGUpOwpkZWZhdWx0OgpyZXR1cm4gc3ByaW50ZigiJyVzJyBpcyBub3QgYSB2YWxpZCB6aXAgYXJjaGl2ZSwgZ290IGVycm9yIGNvZGU6ICVzIiwgJGZpbGUsICRyZXR2YWwpOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyOwoKCgoKCgpjbGFzcyBFdmVudAp7CgoKCnByb3RlY3RlZCAkbmFtZTsKCgoKCnByb3RlY3RlZCAkYXJnczsKCgoKCnByb3RlY3RlZCAkZmxhZ3M7CgoKCgpwcml2YXRlICRwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBhcnJheSAkYXJncyA9IFtdLCBhcnJheSAkZmxhZ3MgPSBbXSkKewokdGhpcy0+bmFtZSA9ICRuYW1lOwokdGhpcy0+YXJncyA9ICRhcmdzOwokdGhpcy0+ZmxhZ3MgPSAkZmxhZ3M7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5uYW1lOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFyZ3M7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZsYWdzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5mbGFnczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQcm9wYWdhdGlvblN0b3BwZWQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+cHJvcGFnYXRpb25TdG9wcGVkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKCk6IHZvaWQKewokdGhpcy0+cHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXI7Cgp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFRyYW5zYWN0aW9uOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxlckV2ZW50Owp1c2UgQ29tcG9zZXJcSU9cQnVmZmVySU87CnVzZSBDb21wb3NlclxJT1xDb25zb2xlSU87CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGFydGlhbENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQcmVDb21tYW5kUnVuRXZlbnQ7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxPcGVyYXRpb25JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTY3JpcHQ7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcUGFja2FnZUV2ZW50Owp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEJpbmFyeUluc3RhbGxlcjsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcU2NyaXB0XEV2ZW50IGFzIFNjcmlwdEV2ZW50Owp1c2UgQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XFN0cmluZ0lucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUGhwRXhlY3V0YWJsZUZpbmRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhlY3V0YWJsZUZpbmRlcjsKCgoKCgoKCgoKCgoKCgpjbGFzcyBFdmVudERpc3BhdGNoZXIKewoKcHJvdGVjdGVkICRjb21wb3NlcjsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGxvYWRlcjsKCnByb3RlY3RlZCAkcHJvY2VzczsKCnByb3RlY3RlZCAkbGlzdGVuZXJzID0gW107Cgpwcm90ZWN0ZWQgJHJ1blNjcmlwdHMgPSB0cnVlOwoKcHJpdmF0ZSAkZXZlbnRTdGFjazsKCnByaXZhdGUgJHNraXBTY3JpcHRzOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQYXJ0aWFsQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8sID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKQp7CiR0aGlzLT5jb21wb3NlciA9ICRjb21wb3NlcjsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHRoaXMtPmV2ZW50U3RhY2sgPSBbXTsKJHRoaXMtPnNraXBTY3JpcHRzID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcigKYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgnLCcsIChzdHJpbmcpIFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX1NLSVBfU0NSSVBUUycpKSksCmZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsICE9PSAnJzsKfQopKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UnVuU2NyaXB0cyhib29sICRydW5TY3JpcHRzID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+cnVuU2NyaXB0cyA9ICRydW5TY3JpcHRzOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXNwYXRjaCg/c3RyaW5nICRldmVudE5hbWUsID9FdmVudCAkZXZlbnQgPSBudWxsKTogaW50CnsKaWYgKG51bGwgPT09ICRldmVudCkgewppZiAobnVsbCA9PT0gJGV2ZW50TmFtZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSWYgbm8gJGV2ZW50IGlzIHBhc3NlZCBpbiB0byAnLl9fTUVUSE9EX18uJyB5b3UgaGF2ZSB0byBwYXNzIGluIGFuICRldmVudE5hbWUsIGdvdCBudWxsLicpOwp9CiRldmVudCA9IG5ldyBFdmVudCgkZXZlbnROYW1lKTsKfQoKcmV0dXJuICR0aGlzLT5kb0Rpc3BhdGNoKCRldmVudCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXNwYXRjaFNjcmlwdChzdHJpbmcgJGV2ZW50TmFtZSwgYm9vbCAkZGV2TW9kZSA9IGZhbHNlLCBhcnJheSAkYWRkaXRpb25hbEFyZ3MgPSBbXSwgYXJyYXkgJGZsYWdzID0gW10pOiBpbnQKewphc3NlcnQoJHRoaXMtPmNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIsIG5ldyBcTG9naWNFeGNlcHRpb24oJ1RoaXMgc2hvdWxkIG9ubHkgYmUgcmVhY2hlZCB3aXRoIGEgZnVsbHkgbG9hZGVkIENvbXBvc2VyJykpOwoKcmV0dXJuICR0aGlzLT5kb0Rpc3BhdGNoKG5ldyBTY3JpcHRcRXZlbnQoJGV2ZW50TmFtZSwgJHRoaXMtPmNvbXBvc2VyLCAkdGhpcy0+aW8sICRkZXZNb2RlLCAkYWRkaXRpb25hbEFyZ3MsICRmbGFncykpOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzcGF0Y2hQYWNrYWdlRXZlbnQoc3RyaW5nICRldmVudE5hbWUsIGJvb2wgJGRldk1vZGUsIFJlcG9zaXRvcnlJbnRlcmZhY2UgJGxvY2FsUmVwbywgYXJyYXkgJG9wZXJhdGlvbnMsIE9wZXJhdGlvbkludGVyZmFjZSAkb3BlcmF0aW9uKTogaW50CnsKYXNzZXJ0KCR0aGlzLT5jb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyLCBuZXcgXExvZ2ljRXhjZXB0aW9uKCdUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoZWQgd2l0aCBhIGZ1bGx5IGxvYWRlZCBDb21wb3NlcicpKTsKCnJldHVybiAkdGhpcy0+ZG9EaXNwYXRjaChuZXcgUGFja2FnZUV2ZW50KCRldmVudE5hbWUsICR0aGlzLT5jb21wb3NlciwgJHRoaXMtPmlvLCAkZGV2TW9kZSwgJGxvY2FsUmVwbywgJG9wZXJhdGlvbnMsICRvcGVyYXRpb24pKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzcGF0Y2hJbnN0YWxsZXJFdmVudChzdHJpbmcgJGV2ZW50TmFtZSwgYm9vbCAkZGV2TW9kZSwgYm9vbCAkZXhlY3V0ZU9wZXJhdGlvbnMsIFRyYW5zYWN0aW9uICR0cmFuc2FjdGlvbik6IGludAp7CmFzc2VydCgkdGhpcy0+Y29tcG9zZXIgaW5zdGFuY2VvZiBDb21wb3NlciwgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhpcyBzaG91bGQgb25seSBiZSByZWFjaGVkIHdpdGggYSBmdWxseSBsb2FkZWQgQ29tcG9zZXInKSk7CgpyZXR1cm4gJHRoaXMtPmRvRGlzcGF0Y2gobmV3IEluc3RhbGxlckV2ZW50KCRldmVudE5hbWUsICR0aGlzLT5jb21wb3NlciwgJHRoaXMtPmlvLCAkZGV2TW9kZSwgJGV4ZWN1dGVPcGVyYXRpb25zLCAkdHJhbnNhY3Rpb24pKTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9EaXNwYXRjaChFdmVudCAkZXZlbnQpCnsKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0RFQlVHX0VWRU5UUycpKSB7CiRkZXRhaWxzID0gbnVsbDsKaWYgKCRldmVudCBpbnN0YW5jZW9mIFBhY2thZ2VFdmVudCkgewokZGV0YWlscyA9IChzdHJpbmcpICRldmVudC0+Z2V0T3BlcmF0aW9uKCk7Cn0gZWxzZWlmICgkZXZlbnQgaW5zdGFuY2VvZiBDb21tYW5kRXZlbnQpIHsKJGRldGFpbHMgPSAkZXZlbnQtPmdldENvbW1hbmROYW1lKCk7Cn0gZWxzZWlmICgkZXZlbnQgaW5zdGFuY2VvZiBQcmVDb21tYW5kUnVuRXZlbnQpIHsKJGRldGFpbHMgPSAkZXZlbnQtPmdldENvbW1hbmQoKTsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0Rpc3BhdGNoaW5nIDxpbmZvPicuJGV2ZW50LT5nZXROYW1lKCkuJzwvaW5mbz4nLigkZGV0YWlscyA/ICcgKCcuJGRldGFpbHMuJyknIDogJycpLicgZXZlbnQnKTsKfQoKJGxpc3RlbmVycyA9ICR0aGlzLT5nZXRMaXN0ZW5lcnMoJGV2ZW50KTsKCiR0aGlzLT5wdXNoRXZlbnQoJGV2ZW50KTsKCiRhdXRvbG9hZGVyc0JlZm9yZSA9IHNwbF9hdXRvbG9hZF9mdW5jdGlvbnMoKTsKCnRyeSB7CiRyZXR1cm5NYXggPSAwOwpmb3JlYWNoICgkbGlzdGVuZXJzIGFzICRjYWxsYWJsZSkgewokcmV0dXJuID0gMDsKJHRoaXMtPmVuc3VyZUJpbkRpcklzSW5QYXRoKCk7CgokYWRkaXRpb25hbEFyZ3MgPSAkZXZlbnQtPmdldEFyZ3VtZW50cygpOwppZiAoaXNfc3RyaW5nKCRjYWxsYWJsZSkgJiYgc3RyX2NvbnRhaW5zKCRjYWxsYWJsZSwgJ0Bub19hZGRpdGlvbmFsX2FyZ3MnKSkgewokY2FsbGFibGUgPSBQcmVnOjpyZXBsYWNlKCd7ID9Abm9fYWRkaXRpb25hbF9hcmdzfScsICcnLCAkY2FsbGFibGUpOwokYWRkaXRpb25hbEFyZ3MgPSBbXTsKfQokZm9ybWF0dGVkRXZlbnROYW1lV2l0aEFyZ3MgPSAkZXZlbnQtPmdldE5hbWUoKSAuICgkYWRkaXRpb25hbEFyZ3MgIT09IFtdID8gJyAoJyAuIGltcGxvZGUoJywgJywgJGFkZGl0aW9uYWxBcmdzKSAuICcpJyA6ICcnKTsKaWYgKCFpc19zdHJpbmcoJGNhbGxhYmxlKSkgewppZiAoIWlzX2NhbGxhYmxlKCRjYWxsYWJsZSkpIHsKJGNsYXNzTmFtZSA9IGlzX29iamVjdCgkY2FsbGFibGVbMF0pID8gZ2V0X2NsYXNzKCRjYWxsYWJsZVswXSkgOiAkY2FsbGFibGVbMF07Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1N1YnNjcmliZXIgJy4kY2xhc3NOYW1lLic6OicuJGNhbGxhYmxlWzFdLicgZm9yIGV2ZW50ICcuJGV2ZW50LT5nZXROYW1lKCkuJyBpcyBub3QgY2FsbGFibGUsIG1ha2Ugc3VyZSB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCBhbmQgcHVibGljJyk7Cn0KaWYgKGlzX2FycmF5KCRjYWxsYWJsZSkgJiYgKGlzX3N0cmluZygkY2FsbGFibGVbMF0pIHx8IGlzX29iamVjdCgkY2FsbGFibGVbMF0pKSAmJiBpc19zdHJpbmcoJGNhbGxhYmxlWzFdKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPiAlczogJXMnLCAkZm9ybWF0dGVkRXZlbnROYW1lV2l0aEFyZ3MsIChpc19vYmplY3QoJGNhbGxhYmxlWzBdKSA/IGdldF9jbGFzcygkY2FsbGFibGVbMF0pIDogJGNhbGxhYmxlWzBdKS4nLT4nLiRjYWxsYWJsZVsxXSksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKfQokcmV0dXJuID0gZmFsc2UgPT09ICRjYWxsYWJsZSgkZXZlbnQpID8gMSA6IDA7Cn0gZWxzZWlmICgkdGhpcy0+aXNDb21wb3NlclNjcmlwdCgkY2FsbGFibGUpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc+ICVzOiAlcycsICRmb3JtYXR0ZWRFdmVudE5hbWVXaXRoQXJncywgJGNhbGxhYmxlKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKJHNjcmlwdCA9IGV4cGxvZGUoJyAnLCBzdWJzdHIoJGNhbGxhYmxlLCAxKSk7CiRzY3JpcHROYW1lID0gJHNjcmlwdFswXTsKdW5zZXQoJHNjcmlwdFswXSk7CgokaW5kZXggPSBhcnJheV9zZWFyY2goJ0BhZGRpdGlvbmFsX2FyZ3MnLCAkc2NyaXB0LCB0cnVlKTsKaWYgKCRpbmRleCAhPT0gZmFsc2UpIHsKJGFyZ3MgPSBhcnJheV9zcGxpY2UoJHNjcmlwdCwgJGluZGV4LCAwLCAkYWRkaXRpb25hbEFyZ3MpOwp9IGVsc2UgewokYXJncyA9IGFycmF5X21lcmdlKCRzY3JpcHQsICRhZGRpdGlvbmFsQXJncyk7Cn0KJGZsYWdzID0gJGV2ZW50LT5nZXRGbGFncygpOwppZiAoaXNzZXQoJGZsYWdzWydzY3JpcHQtYWxpYXMtaW5wdXQnXSkpIHsKJGFyZ3NTdHJpbmcgPSBpbXBsb2RlKCcgJywgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGFyZykgeyByZXR1cm4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGFyZyk7IH0sICRzY3JpcHQpKTsKJGZsYWdzWydzY3JpcHQtYWxpYXMtaW5wdXQnXSA9ICRhcmdzU3RyaW5nIC4gJyAnIC4gJGZsYWdzWydzY3JpcHQtYWxpYXMtaW5wdXQnXTsKdW5zZXQoJGFyZ3NTdHJpbmcpOwp9CmlmIChzdHJwb3MoJGNhbGxhYmxlLCAnQGNvbXBvc2VyICcpID09PSAwKSB7CiRleGVjID0gJHRoaXMtPmdldFBocEV4ZWNDb21tYW5kKCkgLiAnICcgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9CSU5BUlknKSkgLiAnICcgLiBpbXBsb2RlKCcgJywgJGFyZ3MpOwppZiAoMCAhPT0gKCRleGl0Q29kZSA9ICR0aGlzLT5leGVjdXRlVHR5KCRleGVjKSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJzxlcnJvcj5TY3JpcHQgJXMgaGFuZGxpbmcgdGhlICVzIGV2ZW50IHJldHVybmVkIHdpdGggZXJyb3IgY29kZSAnLiRleGl0Q29kZS4nPC9lcnJvcj4nLCAkY2FsbGFibGUsICRldmVudC0+Z2V0TmFtZSgpKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKCnRocm93IG5ldyBTY3JpcHRFeGVjdXRpb25FeGNlcHRpb24oJ0Vycm9yIE91dHB1dDogJy4kdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJGV4aXRDb2RlKTsKfQp9IGVsc2UgewppZiAoISR0aGlzLT5nZXRMaXN0ZW5lcnMobmV3IEV2ZW50KCRzY3JpcHROYW1lKSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJzx3YXJuaW5nPllvdSBtYWRlIGEgcmVmZXJlbmNlIHRvIGEgbm9uLWV4aXN0ZW50IHNjcmlwdCAlczwvd2FybmluZz4nLCAkY2FsbGFibGUpLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9Cgp0cnkgewoKJHNjcmlwdEV2ZW50ID0gbmV3IFNjcmlwdFxFdmVudCgkc2NyaXB0TmFtZSwgJGV2ZW50LT5nZXRDb21wb3NlcigpLCAkZXZlbnQtPmdldElPKCksICRldmVudC0+aXNEZXZNb2RlKCksICRhcmdzLCAkZmxhZ3MpOwokc2NyaXB0RXZlbnQtPnNldE9yaWdpbmF0aW5nRXZlbnQoJGV2ZW50KTsKJHJldHVybiA9ICR0aGlzLT5kaXNwYXRjaCgkc2NyaXB0TmFtZSwgJHNjcmlwdEV2ZW50KTsKfSBjYXRjaCAoU2NyaXB0RXhlY3V0aW9uRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc8ZXJyb3I+U2NyaXB0ICVzIHdhcyBjYWxsZWQgdmlhICVzPC9lcnJvcj4nLCAkY2FsbGFibGUsICRldmVudC0+Z2V0TmFtZSgpKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKdGhyb3cgJGU7Cn0KfQp9IGVsc2VpZiAoJHRoaXMtPmlzUGhwU2NyaXB0KCRjYWxsYWJsZSkpIHsKJGNsYXNzTmFtZSA9IHN1YnN0cigkY2FsbGFibGUsIDAsIHN0cnBvcygkY2FsbGFibGUsICc6OicpKTsKJG1ldGhvZE5hbWUgPSBzdWJzdHIoJGNhbGxhYmxlLCBzdHJwb3MoJGNhbGxhYmxlLCAnOjonKSArIDIpOwoKaWYgKCFjbGFzc19leGlzdHMoJGNsYXNzTmFtZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5DbGFzcyAnLiRjbGFzc05hbWUuJyBpcyBub3QgYXV0b2xvYWRhYmxlLCBjYW4gbm90IGNhbGwgJy4kZXZlbnQtPmdldE5hbWUoKS4nIHNjcmlwdDwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwpjb250aW51ZTsKfQppZiAoIWlzX2NhbGxhYmxlKCRjYWxsYWJsZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5NZXRob2QgJy4kY2FsbGFibGUuJyBpcyBub3QgY2FsbGFibGUsIGNhbiBub3QgY2FsbCAnLiRldmVudC0+Z2V0TmFtZSgpLicgc2NyaXB0PC93YXJuaW5nPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CmNvbnRpbnVlOwp9Cgp0cnkgewokcmV0dXJuID0gZmFsc2UgPT09ICR0aGlzLT5leGVjdXRlRXZlbnRQaHBTY3JpcHQoJGNsYXNzTmFtZSwgJG1ldGhvZE5hbWUsICRldmVudCkgPyAxIDogMDsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokbWVzc2FnZSA9ICJTY3JpcHQgJXMgaGFuZGxpbmcgdGhlICVzIGV2ZW50IHRlcm1pbmF0ZWQgd2l0aCBhbiBleGNlcHRpb24iOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLnNwcmludGYoJG1lc3NhZ2UsICRjYWxsYWJsZSwgJGV2ZW50LT5nZXROYW1lKCkpLic8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CnRocm93ICRlOwp9Cn0gZWxzZWlmICgkdGhpcy0+aXNDb21tYW5kQ2xhc3MoJGNhbGxhYmxlKSkgewokY2xhc3NOYW1lID0gJGNhbGxhYmxlOwppZiAoIWNsYXNzX2V4aXN0cygkY2xhc3NOYW1lKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNsYXNzICcuJGNsYXNzTmFtZS4nIGlzIG5vdCBhdXRvbG9hZGFibGUsIGNhbiBub3QgY2FsbCAnLiRldmVudC0+Z2V0TmFtZSgpLicgc2NyaXB0PC93YXJuaW5nPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CmNvbnRpbnVlOwp9CmlmICghaXNfYSgkY2xhc3NOYW1lLCBDb21tYW5kOjpjbGFzcywgdHJ1ZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5DbGFzcyAnLiRjbGFzc05hbWUuJyBkb2VzIG5vdCBleHRlbmQgJy5Db21tYW5kOjpjbGFzcy4nLCBjYW4gbm90IGNhbGwgJy4kZXZlbnQtPmdldE5hbWUoKS4nIHNjcmlwdDwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwpjb250aW51ZTsKfQppZiAoZGVmaW5lZCgnQ29tcG9zZXJcU2NyaXB0XFNjcmlwdEV2ZW50czo6Jy5zdHJfcmVwbGFjZSgnLScsICdfJywgc3RydG91cHBlcigkZXZlbnQtPmdldE5hbWUoKSkpKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBjYW5ub3QgYmluZCAnLiRldmVudC0+Z2V0TmFtZSgpLicgdG8gYSBDb21tYW5kIGNsYXNzLCB1c2UgYSBub24tcmVzZXJ2ZWQgbmFtZTwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwpjb250aW51ZTsKfQoKJGFwcCA9IG5ldyBBcHBsaWNhdGlvbigpOwokYXBwLT5zZXRDYXRjaEV4Y2VwdGlvbnMoZmFsc2UpOwppZiAobWV0aG9kX2V4aXN0cygkYXBwLCAnc2V0Q2F0Y2hFcnJvcnMnKSkgewokYXBwLT5zZXRDYXRjaEVycm9ycyhmYWxzZSk7Cn0KJGFwcC0+c2V0QXV0b0V4aXQoZmFsc2UpOwokY21kID0gbmV3ICRjbGFzc05hbWUoJGV2ZW50LT5nZXROYW1lKCkpOwokYXBwLT5hZGQoJGNtZCk7CiRhcHAtPnNldERlZmF1bHRDb21tYW5kKChzdHJpbmcpICRjbWQtPmdldE5hbWUoKSwgdHJ1ZSk7CnRyeSB7CiRhcmdzID0gaW1wbG9kZSgnICcsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRhcmcpIHsgcmV0dXJuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRhcmcpOyB9LCAkYWRkaXRpb25hbEFyZ3MpKTsKCgppZiAoJHRoaXMtPmlvIGluc3RhbmNlb2YgQ29uc29sZUlPKSB7CiRyZWZsUHJvcCA9IG5ldyBcUmVmbGVjdGlvblByb3BlcnR5KCR0aGlzLT5pbywgJ291dHB1dCcpOwppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAxMDApIHsKJHJlZmxQcm9wLT5zZXRBY2Nlc3NpYmxlKHRydWUpOwp9CiRvdXRwdXQgPSAkcmVmbFByb3AtPmdldFZhbHVlKCR0aGlzLT5pbyk7Cn0gZWxzZSB7CiRvdXRwdXQgPSBuZXcgQ29uc29sZU91dHB1dCgpOwp9CiRyZXR1cm4gPSAkYXBwLT5ydW4obmV3IFN0cmluZ0lucHV0KCRldmVudC0+Z2V0RmxhZ3MoKVsnc2NyaXB0LWFsaWFzLWlucHV0J10gPz8gJGFyZ3MpLCAkb3V0cHV0KTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokbWVzc2FnZSA9ICJTY3JpcHQgJXMgaGFuZGxpbmcgdGhlICVzIGV2ZW50IHRlcm1pbmF0ZWQgd2l0aCBhbiBleGNlcHRpb24iOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLnNwcmludGYoJG1lc3NhZ2UsICRjYWxsYWJsZSwgJGV2ZW50LT5nZXROYW1lKCkpLic8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CnRocm93ICRlOwp9Cn0gZWxzZSB7CiRhcmdzID0gaW1wbG9kZSgnICcsIGFycmF5X21hcChbJ0NvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yJywgJ2VzY2FwZSddLCAkYWRkaXRpb25hbEFyZ3MpKTsKCgppZiAoc3RycG9zKCRjYWxsYWJsZSwgJ0BwdXRlbnYgJykgPT09IDApIHsKJGV4ZWMgPSAkY2FsbGFibGU7Cn0gZWxzZSB7CmlmIChzdHJfY29udGFpbnMoJGNhbGxhYmxlLCAnQGFkZGl0aW9uYWxfYXJncycpKSB7CiRleGVjID0gc3RyX3JlcGxhY2UoJ0BhZGRpdGlvbmFsX2FyZ3MnLCAkYXJncywgJGNhbGxhYmxlKTsKfSBlbHNlIHsKJGV4ZWMgPSAkY2FsbGFibGUgLiAoJGFyZ3MgPT09ICcnID8gJycgOiAnICcuJGFyZ3MpOwp9Cn0KCmlmICgkdGhpcy0+aW8tPmlzVmVyYm9zZSgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc+ICVzOiAlcycsICRldmVudC0+Z2V0TmFtZSgpLCAkZXhlYykpOwp9IGVsc2VpZiAoCgokZXZlbnQtPmdldE5hbWUoKSAhPT0gJ19fZXhlY19jb21tYW5kJwoKJiYgKCRldmVudC0+Z2V0RmxhZ3MoKVsnc2NyaXB0LWFsaWFzLWlucHV0J10gPz8gbnVsbCkgPT09IG51bGwKKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc+ICVzJywgJGV4ZWMpKTsKfQoKJHBvc3NpYmxlTG9jYWxCaW5hcmllcyA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRCaW5hcmllcygpOwppZiAoY291bnQoJHBvc3NpYmxlTG9jYWxCaW5hcmllcykgPiAwKSB7CmZvcmVhY2ggKCRwb3NzaWJsZUxvY2FsQmluYXJpZXMgYXMgJGxvY2FsRXhlYykgewppZiAoUHJlZzo6aXNNYXRjaCgne1xiJy5wcmVnX3F1b3RlKCRjYWxsYWJsZSkuJyR9JywgJGxvY2FsRXhlYykpIHsKJGNhbGxlciA9IEJpbmFyeUluc3RhbGxlcjo6ZGV0ZXJtaW5lQmluYXJ5Q2FsbGVyKCRsb2NhbEV4ZWMpOwokZXhlYyA9IFByZWc6OnJlcGxhY2UoJ3teJy5wcmVnX3F1b3RlKCRjYWxsYWJsZSkuJ30nLCAkY2FsbGVyIC4gJyAnIC4gJGxvY2FsRXhlYywgJGV4ZWMpOwpicmVhazsKfQp9Cn0KCmlmIChzdHJwb3MoJGV4ZWMsICdAcHV0ZW52ICcpID09PSAwKSB7CmlmIChmYWxzZSA9PT0gc3RycG9zKCRleGVjLCAnPScpKSB7ClBsYXRmb3JtOjpjbGVhckVudihzdWJzdHIoJGV4ZWMsIDgpKTsKfSBlbHNlIHsKWyR2YXIsICR2YWx1ZV0gPSBleHBsb2RlKCc9Jywgc3Vic3RyKCRleGVjLCA4KSwgMik7ClBsYXRmb3JtOjpwdXRFbnYoJHZhciwgJHZhbHVlKTsKfQoKY29udGludWU7Cn0KaWYgKHN0cnBvcygkZXhlYywgJ0BwaHAgJykgPT09IDApIHsKJHBhdGhBbmRBcmdzID0gc3Vic3RyKCRleGVjLCA1KTsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokcGF0aEFuZEFyZ3MgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3teXFMrfScsIHN0YXRpYyBmdW5jdGlvbiAoJHBhdGgpIHsKcmV0dXJuIHN0cl9yZXBsYWNlKCcvJywgJ1xcJywgJHBhdGhbMF0pOwp9LCAkcGF0aEFuZEFyZ3MpOwp9CgoKJG1hdGNoZWQgPSBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlteXCciXHMvXFxcXF0rfScsICRwYXRoQW5kQXJncywgJG1hdGNoKTsKaWYgKCRtYXRjaGVkICYmICFmaWxlX2V4aXN0cygkbWF0Y2hbMF0pKSB7CiRmaW5kZXIgPSBuZXcgRXhlY3V0YWJsZUZpbmRlcjsKaWYgKCRwYXRoVG9FeGVjID0gJGZpbmRlci0+ZmluZCgkbWF0Y2hbMF0pKSB7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJGV4ZWNXaXRob3V0RXh0ID0gUHJlZzo6cmVwbGFjZSgne1wuKGV4ZXxiYXR8Y21kfGNvbSkkfWknLCAnJywgJHBhdGhUb0V4ZWMpOwoKaWYgKGZpbGVfZXhpc3RzKCRleGVjV2l0aG91dEV4dCkpIHsKJHBhdGhUb0V4ZWMgPSAkZXhlY1dpdGhvdXRFeHQ7Cn0KdW5zZXQoJGV4ZWNXaXRob3V0RXh0KTsKfQokcGF0aEFuZEFyZ3MgPSAkcGF0aFRvRXhlYyAuIHN1YnN0cigkcGF0aEFuZEFyZ3MsIHN0cmxlbigkbWF0Y2hbMF0pKTsKfQp9CiRleGVjID0gJHRoaXMtPmdldFBocEV4ZWNDb21tYW5kKCkgLiAnICcgLiAkcGF0aEFuZEFyZ3M7Cn0gZWxzZSB7CiRmaW5kZXIgPSBuZXcgUGhwRXhlY3V0YWJsZUZpbmRlcigpOwokcGhwUGF0aCA9ICRmaW5kZXItPmZpbmQoZmFsc2UpOwppZiAoJHBocFBhdGgpIHsKUGxhdGZvcm06OnB1dEVudignUEhQX0JJTkFSWScsICRwaHBQYXRoKTsKfQoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokZXhlYyA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygne15cUyt9Jywgc3RhdGljIGZ1bmN0aW9uICgkcGF0aCkgewpyZXR1cm4gc3RyX3JlcGxhY2UoJy8nLCAnXFwnLCAkcGF0aFswXSk7Cn0sICRleGVjKTsKfQp9CgoKCgppZiAoc3RycG9zKCRleGVjLCAnY29tcG9zZXIgJykgPT09IDApIHsKJGV4ZWMgPSAkdGhpcy0+Z2V0UGhwRXhlY0NvbW1hbmQoKSAuICcgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0JJTkFSWScpKSAuIHN1YnN0cigkZXhlYywgOCk7Cn0KCmlmICgwICE9PSAoJGV4aXRDb2RlID0gJHRoaXMtPmV4ZWN1dGVUdHkoJGV4ZWMpKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPGVycm9yPlNjcmlwdCAlcyBoYW5kbGluZyB0aGUgJXMgZXZlbnQgcmV0dXJuZWQgd2l0aCBlcnJvciBjb2RlICcuJGV4aXRDb2RlLic8L2Vycm9yPicsICRjYWxsYWJsZSwgJGV2ZW50LT5nZXROYW1lKCkpLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwoKdGhyb3cgbmV3IFNjcmlwdEV4ZWN1dGlvbkV4Y2VwdGlvbignRXJyb3IgT3V0cHV0OiAnLiR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLCAkZXhpdENvZGUpOwp9Cn0KCiRyZXR1cm5NYXggPSBtYXgoJHJldHVybk1heCwgJHJldHVybik7CgppZiAoJGV2ZW50LT5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7CmJyZWFrOwp9Cn0KfSBmaW5hbGx5IHsKJHRoaXMtPnBvcEV2ZW50KCk7Cgoka25vd25JZGVudGlmaWVycyA9IFtdOwpmb3JlYWNoICgkYXV0b2xvYWRlcnNCZWZvcmUgYXMgJGtleSA9PiAkY2IpIHsKJGtub3duSWRlbnRpZmllcnNbJHRoaXMtPmdldENhbGxiYWNrSWRlbnRpZmllcigkY2IpXSA9IFsna2V5JyA9PiAka2V5LCAnY2FsbGJhY2snID0+ICRjYl07Cn0KZm9yZWFjaCAoc3BsX2F1dG9sb2FkX2Z1bmN0aW9ucygpIGFzICRjYikgewoKaWYgKGlzc2V0KCRrbm93bklkZW50aWZpZXJzWyR0aGlzLT5nZXRDYWxsYmFja0lkZW50aWZpZXIoJGNiKV0pICYmICRrbm93bklkZW50aWZpZXJzWyR0aGlzLT5nZXRDYWxsYmFja0lkZW50aWZpZXIoJGNiKV1bJ2tleSddID09PSAwKSB7CmJyZWFrOwp9CgoKaWYgKCRjYiBpbnN0YW5jZW9mIENsYXNzTG9hZGVyKSB7CiRjYi0+dW5yZWdpc3RlcigpOwokY2ItPnJlZ2lzdGVyKGZhbHNlKTsKfSBlbHNlIHsKc3BsX2F1dG9sb2FkX3VucmVnaXN0ZXIoJGNiKTsKc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKCRjYik7Cn0KfQp9CgpyZXR1cm4gJHJldHVybk1heDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGVUdHkoc3RyaW5nICRleGVjKTogaW50CnsKaWYgKCR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CnJldHVybiAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZVR0eSgkZXhlYyk7Cn0KCnJldHVybiAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkZXhlYyk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQaHBFeGVjQ29tbWFuZCgpOiBzdHJpbmcKewokZmluZGVyID0gbmV3IFBocEV4ZWN1dGFibGVGaW5kZXIoKTsKJHBocFBhdGggPSAkZmluZGVyLT5maW5kKGZhbHNlKTsKaWYgKCEkcGhwUGF0aCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBsb2NhdGUgUEhQIGJpbmFyeSB0byBleGVjdXRlICcuJHBocFBhdGgpOwp9CiRwaHBBcmdzID0gJGZpbmRlci0+ZmluZEFyZ3VtZW50cygpOwokcGhwQXJncyA9ICRwaHBBcmdzID8gJyAnIC4gaW1wbG9kZSgnICcsICRwaHBBcmdzKSA6ICcnOwokYWxsb3dVcmxGT3BlbkZsYWcgPSAnIC1kIGFsbG93X3VybF9mb3Blbj0nIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoaW5pX2dldCgnYWxsb3dfdXJsX2ZvcGVuJykpOwokZGlzYWJsZUZ1bmN0aW9uc0ZsYWcgPSAnIC1kIGRpc2FibGVfZnVuY3Rpb25zPScgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKTsKJG1lbW9yeUxpbWl0RmxhZyA9ICcgLWQgbWVtb3J5X2xpbWl0PScgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKSk7CgpyZXR1cm4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHBocFBhdGgpIC4gJHBocEFyZ3MgLiAkYWxsb3dVcmxGT3BlbkZsYWcgLiAkZGlzYWJsZUZ1bmN0aW9uc0ZsYWcgLiAkbWVtb3J5TGltaXRGbGFnOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlRXZlbnRQaHBTY3JpcHQoc3RyaW5nICRjbGFzc05hbWUsIHN0cmluZyAkbWV0aG9kTmFtZSwgRXZlbnQgJGV2ZW50KQp7CmlmICgkdGhpcy0+aW8tPmlzVmVyYm9zZSgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc+ICVzOiAlczo6JXMnLCAkZXZlbnQtPmdldE5hbWUoKSwgJGNsYXNzTmFtZSwgJG1ldGhvZE5hbWUpKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJz4gJXM6OiVzJywgJGNsYXNzTmFtZSwgJG1ldGhvZE5hbWUpKTsKfQoKcmV0dXJuICRjbGFzc05hbWU6OiRtZXRob2ROYW1lKCRldmVudCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkTGlzdGVuZXIoc3RyaW5nICRldmVudE5hbWUsICRsaXN0ZW5lciwgaW50ICRwcmlvcml0eSA9IDApOiB2b2lkCnsKJHRoaXMtPmxpc3RlbmVyc1skZXZlbnROYW1lXVskcHJpb3JpdHldW10gPSAkbGlzdGVuZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcigkbGlzdGVuZXIpOiB2b2lkCnsKZm9yZWFjaCAoJHRoaXMtPmxpc3RlbmVycyBhcyAkZXZlbnROYW1lID0+ICRwcmlvcml0aWVzKSB7CmZvcmVhY2ggKCRwcmlvcml0aWVzIGFzICRwcmlvcml0eSA9PiAkbGlzdGVuZXJzKSB7CmZvcmVhY2ggKCRsaXN0ZW5lcnMgYXMgJGluZGV4ID0+ICRjYW5kaWRhdGUpIHsKaWYgKCRsaXN0ZW5lciA9PT0gJGNhbmRpZGF0ZSB8fCAoaXNfYXJyYXkoJGNhbmRpZGF0ZSkgJiYgaXNfb2JqZWN0KCRsaXN0ZW5lcikgJiYgJGNhbmRpZGF0ZVswXSA9PT0gJGxpc3RlbmVyKSkgewp1bnNldCgkdGhpcy0+bGlzdGVuZXJzWyRldmVudE5hbWVdWyRwcmlvcml0eV1bJGluZGV4XSk7Cn0KfQp9Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkU3Vic2NyaWJlcihFdmVudFN1YnNjcmliZXJJbnRlcmZhY2UgJHN1YnNjcmliZXIpOiB2b2lkCnsKZm9yZWFjaCAoJHN1YnNjcmliZXItPmdldFN1YnNjcmliZWRFdmVudHMoKSBhcyAkZXZlbnROYW1lID0+ICRwYXJhbXMpIHsKaWYgKGlzX3N0cmluZygkcGFyYW1zKSkgewokdGhpcy0+YWRkTGlzdGVuZXIoJGV2ZW50TmFtZSwgWyRzdWJzY3JpYmVyLCAkcGFyYW1zXSk7Cn0gZWxzZWlmIChpc19zdHJpbmcoJHBhcmFtc1swXSkpIHsKJHRoaXMtPmFkZExpc3RlbmVyKCRldmVudE5hbWUsIFskc3Vic2NyaWJlciwgJHBhcmFtc1swXV0sICRwYXJhbXNbMV0gPz8gMCk7Cn0gZWxzZSB7CmZvcmVhY2ggKCRwYXJhbXMgYXMgJGxpc3RlbmVyKSB7CiR0aGlzLT5hZGRMaXN0ZW5lcigkZXZlbnROYW1lLCBbJHN1YnNjcmliZXIsICRsaXN0ZW5lclswXV0sICRsaXN0ZW5lclsxXSA/PyAwKTsKfQp9Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0TGlzdGVuZXJzKEV2ZW50ICRldmVudCk6IGFycmF5CnsKJHNjcmlwdExpc3RlbmVycyA9ICR0aGlzLT5ydW5TY3JpcHRzID8gJHRoaXMtPmdldFNjcmlwdExpc3RlbmVycygkZXZlbnQpIDogW107CgppZiAoIWlzc2V0KCR0aGlzLT5saXN0ZW5lcnNbJGV2ZW50LT5nZXROYW1lKCldWzBdKSkgewokdGhpcy0+bGlzdGVuZXJzWyRldmVudC0+Z2V0TmFtZSgpXVswXSA9IFtdOwp9Cmtyc29ydCgkdGhpcy0+bGlzdGVuZXJzWyRldmVudC0+Z2V0TmFtZSgpXSk7CgokbGlzdGVuZXJzID0gJHRoaXMtPmxpc3RlbmVyczsKJGxpc3RlbmVyc1skZXZlbnQtPmdldE5hbWUoKV1bMF0gPSBhcnJheV9tZXJnZSgkbGlzdGVuZXJzWyRldmVudC0+Z2V0TmFtZSgpXVswXSwgJHNjcmlwdExpc3RlbmVycyk7CgpyZXR1cm4gYXJyYXlfbWVyZ2UoLi4uJGxpc3RlbmVyc1skZXZlbnQtPmdldE5hbWUoKV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzRXZlbnRMaXN0ZW5lcnMoRXZlbnQgJGV2ZW50KTogYm9vbAp7CiRsaXN0ZW5lcnMgPSAkdGhpcy0+Z2V0TGlzdGVuZXJzKCRldmVudCk7CgpyZXR1cm4gY291bnQoJGxpc3RlbmVycykgPiAwOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0U2NyaXB0TGlzdGVuZXJzKEV2ZW50ICRldmVudCk6IGFycmF5CnsKJHBhY2thZ2UgPSAkdGhpcy0+Y29tcG9zZXItPmdldFBhY2thZ2UoKTsKJHNjcmlwdHMgPSAkcGFja2FnZS0+Z2V0U2NyaXB0cygpOwoKaWYgKGVtcHR5KCRzY3JpcHRzWyRldmVudC0+Z2V0TmFtZSgpXSkpIHsKcmV0dXJuIFtdOwp9CgppZiAoaW5fYXJyYXkoJGV2ZW50LT5nZXROYW1lKCksICR0aGlzLT5za2lwU2NyaXB0cywgdHJ1ZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdTa2lwcGVkIHNjcmlwdCBsaXN0ZW5lcnMgZm9yIDxpbmZvPicuJGV2ZW50LT5nZXROYW1lKCkuJzwvaW5mbz4gYmVjYXVzZSBvZiBDT01QT1NFUl9TS0lQX1NDUklQVFMnLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CgpyZXR1cm4gW107Cn0KCmFzc2VydCgkdGhpcy0+Y29tcG9zZXIgaW5zdGFuY2VvZiBDb21wb3NlciwgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhpcyBzaG91bGQgb25seSBiZSByZWFjaGVkIHdpdGggYSBmdWxseSBsb2FkZWQgQ29tcG9zZXInKSk7CgppZiAoJHRoaXMtPmxvYWRlcikgewokdGhpcy0+bG9hZGVyLT51bnJlZ2lzdGVyKCk7Cn0KCiRnZW5lcmF0b3IgPSAkdGhpcy0+Y29tcG9zZXItPmdldEF1dG9sb2FkR2VuZXJhdG9yKCk7CmlmICgkZXZlbnQgaW5zdGFuY2VvZiBTY3JpcHRFdmVudCkgewokZ2VuZXJhdG9yLT5zZXREZXZNb2RlKCRldmVudC0+aXNEZXZNb2RlKCkpOwp9CgokcGFja2FnZXMgPSAkdGhpcy0+Y29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpOwokcGFja2FnZU1hcCA9ICRnZW5lcmF0b3ItPmJ1aWxkUGFja2FnZU1hcCgkdGhpcy0+Y29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKSwgJHBhY2thZ2UsICRwYWNrYWdlcyk7CiRtYXAgPSAkZ2VuZXJhdG9yLT5wYXJzZUF1dG9sb2FkcygkcGFja2FnZU1hcCwgJHBhY2thZ2UpOwokdGhpcy0+bG9hZGVyID0gJGdlbmVyYXRvci0+Y3JlYXRlTG9hZGVyKCRtYXAsICR0aGlzLT5jb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgndmVuZG9yLWRpcicpKTsKJHRoaXMtPmxvYWRlci0+cmVnaXN0ZXIoZmFsc2UpOwoKcmV0dXJuICRzY3JpcHRzWyRldmVudC0+Z2V0TmFtZSgpXTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGlzUGhwU2NyaXB0KHN0cmluZyAkY2FsbGFibGUpOiBib29sCnsKcmV0dXJuIGZhbHNlID09PSBzdHJwb3MoJGNhbGxhYmxlLCAnICcpICYmIGZhbHNlICE9PSBzdHJwb3MoJGNhbGxhYmxlLCAnOjonKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGlzQ29tbWFuZENsYXNzKHN0cmluZyAkY2FsbGFibGUpOiBib29sCnsKcmV0dXJuIHN0cl9jb250YWlucygkY2FsbGFibGUsICdcXCcpICYmICFzdHJfY29udGFpbnMoJGNhbGxhYmxlLCAnICcpICYmIHN0cl9lbmRzX3dpdGgoJGNhbGxhYmxlLCAnQ29tbWFuZCcpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaXNDb21wb3NlclNjcmlwdChzdHJpbmcgJGNhbGxhYmxlKTogYm9vbAp7CnJldHVybiBzdHJwb3MoJGNhbGxhYmxlLCAnQCcpID09PSAwICYmIHN0cnBvcygkY2FsbGFibGUsICdAcGhwICcpICE9PSAwICYmIHN0cnBvcygkY2FsbGFibGUsICdAcHV0ZW52ICcpICE9PSAwOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwdXNoRXZlbnQoRXZlbnQgJGV2ZW50KTogaW50CnsKJGV2ZW50TmFtZSA9ICRldmVudC0+Z2V0TmFtZSgpOwppZiAoaW5fYXJyYXkoJGV2ZW50TmFtZSwgJHRoaXMtPmV2ZW50U3RhY2spKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCJDaXJjdWxhciBjYWxsIHRvIHNjcmlwdCBoYW5kbGVyICclcycgZGV0ZWN0ZWQiLCAkZXZlbnROYW1lKSk7Cn0KCnJldHVybiBhcnJheV9wdXNoKCR0aGlzLT5ldmVudFN0YWNrLCAkZXZlbnROYW1lKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBvcEV2ZW50KCk6ID9zdHJpbmcKewpyZXR1cm4gYXJyYXlfcG9wKCR0aGlzLT5ldmVudFN0YWNrKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBlbnN1cmVCaW5EaXJJc0luUGF0aCgpOiB2b2lkCnsKJHBhdGhFbnYgPSAnUEFUSCc7CgoKCgppZiAoIWlzc2V0KCRfU0VSVkVSWyRwYXRoRW52XSkgJiYgaXNzZXQoJF9TRVJWRVJbJ1BhdGgnXSkpIHsKJHBhdGhFbnYgPSAnUGF0aCc7Cn0KCgokYmluRGlyID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdiaW4tZGlyJyk7CmlmIChpc19kaXIoJGJpbkRpcikpIHsKJGJpbkRpciA9IHJlYWxwYXRoKCRiaW5EaXIpOwokcGF0aFZhbHVlID0gKHN0cmluZykgUGxhdGZvcm06OmdldEVudigkcGF0aEVudik7CmlmICghUHJlZzo6aXNNYXRjaCgneyhefCcuUEFUSF9TRVBBUkFUT1IuJyknLnByZWdfcXVvdGUoJGJpbkRpcikuJygkfCcuUEFUSF9TRVBBUkFUT1IuJyl9JywgJHBhdGhWYWx1ZSkpIHsKUGxhdGZvcm06OnB1dEVudigkcGF0aEVudiwgJGJpbkRpci5QQVRIX1NFUEFSQVRPUi4kcGF0aFZhbHVlKTsKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q2FsbGJhY2tJZGVudGlmaWVyKCRjYik6IHN0cmluZwp7CmlmIChpc19zdHJpbmcoJGNiKSkgewpyZXR1cm4gJ2ZuOicuJGNiOwp9CmlmIChpc19vYmplY3QoJGNiKSkgewpyZXR1cm4gJ29iajonLnNwbF9vYmplY3RfaGFzaCgkY2IpOwp9CmlmIChpc19hcnJheSgkY2IpKSB7CnJldHVybiAnYXJyYXk6Jy4oaXNfc3RyaW5nKCRjYlswXSkgPyAkY2JbMF0gOiBnZXRfY2xhc3MoJGNiWzBdKSAuJyMnLnNwbF9vYmplY3RfaGFzaCgkY2JbMF0pKS4nOjonLiRjYlsxXTsKfQoKCnJldHVybiAndW5zdXBwb3J0ZWQnOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlcjsKCgoKCgoKCgoKCgoKCmludGVyZmFjZSBFdmVudFN1YnNjcmliZXJJbnRlcmZhY2UKewoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFN1YnNjcmliZWRFdmVudHMoKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyOwoKCgoKCgpjbGFzcyBTY3JpcHRFeGVjdXRpb25FeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbgp7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIElycmVjb3ZlcmFibGVEb3dubG9hZEV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBOb1NzbEV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXI7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnXEpzb25Db25maWdTb3VyY2U7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25HdWVzc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcRmlsZXN5c3RlbVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXExvb3A7CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKdXNlIFBoYXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJTdHlsZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXQ7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcQXV0b2xvYWRcQXV0b2xvYWRHZW5lcmF0b3I7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbjsKdXNlIFppcEFyY2hpdmU7CgoKCgoKCgoKCmNsYXNzIEZhY3RvcnkKewoKCgpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGdldEhvbWVEaXIoKTogc3RyaW5nCnsKJGhvbWUgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9IT01FJyk7CmlmICgkaG9tZSkgewpyZXR1cm4gJGhvbWU7Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKaWYgKCFQbGF0Zm9ybTo6Z2V0RW52KCdBUFBEQVRBJykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgQVBQREFUQSBvciBDT01QT1NFUl9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIG11c3QgYmUgc2V0IGZvciBjb21wb3NlciB0byBydW4gY29ycmVjdGx5Jyk7Cn0KCnJldHVybiBydHJpbShzdHJ0cihQbGF0Zm9ybTo6Z2V0RW52KCdBUFBEQVRBJyksICdcXCcsICcvJyksICcvJykgLiAnL0NvbXBvc2VyJzsKfQoKJHVzZXJEaXIgPSBzZWxmOjpnZXRVc2VyRGlyKCk7CiRkaXJzID0gW107CgppZiAoc2VsZjo6dXNlWGRnKCkpIHsKCiR4ZGdDb25maWcgPSBQbGF0Zm9ybTo6Z2V0RW52KCdYREdfQ09ORklHX0hPTUUnKTsKaWYgKCEkeGRnQ29uZmlnKSB7CiR4ZGdDb25maWcgPSAkdXNlckRpciAuICcvLmNvbmZpZyc7Cn0KCiRkaXJzW10gPSAkeGRnQ29uZmlnIC4gJy9jb21wb3Nlcic7Cn0KCiRkaXJzW10gPSAkdXNlckRpciAuICcvLmNvbXBvc2VyJzsKCgpmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CmlmIChTaWxlbmNlcjo6Y2FsbCgnaXNfZGlyJywgJGRpcikpIHsKcmV0dXJuICRkaXI7Cn0KfQoKCnJldHVybiAkZGlyc1swXTsKfQoKcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBnZXRDYWNoZURpcihzdHJpbmcgJGhvbWUpOiBzdHJpbmcKewokY2FjaGVEaXIgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9DQUNIRV9ESVInKTsKaWYgKCRjYWNoZURpcikgewpyZXR1cm4gJGNhY2hlRGlyOwp9CgokaG9tZUVudiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0hPTUUnKTsKaWYgKCRob21lRW52KSB7CnJldHVybiAkaG9tZUVudiAuICcvY2FjaGUnOwp9CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CmlmICgkY2FjaGVEaXIgPSBQbGF0Zm9ybTo6Z2V0RW52KCdMT0NBTEFQUERBVEEnKSkgewokY2FjaGVEaXIgLj0gJy9Db21wb3Nlcic7Cn0gZWxzZSB7CiRjYWNoZURpciA9ICRob21lIC4gJy9jYWNoZSc7Cn0KCnJldHVybiBydHJpbShzdHJ0cigkY2FjaGVEaXIsICdcXCcsICcvJyksICcvJyk7Cn0KCiR1c2VyRGlyID0gc2VsZjo6Z2V0VXNlckRpcigpOwppZiAoUEhQX09TID09PSAnRGFyd2luJykgewoKaWYgKGlzX2RpcigkaG9tZSAuICcvY2FjaGUnKSAmJiAhaXNfZGlyKCR1c2VyRGlyIC4gJy9MaWJyYXJ5L0NhY2hlcy9jb21wb3NlcicpKSB7ClNpbGVuY2VyOjpjYWxsKCdyZW5hbWUnLCAkaG9tZSAuICcvY2FjaGUnLCAkdXNlckRpciAuICcvTGlicmFyeS9DYWNoZXMvY29tcG9zZXInKTsKfQoKcmV0dXJuICR1c2VyRGlyIC4gJy9MaWJyYXJ5L0NhY2hlcy9jb21wb3Nlcic7Cn0KCmlmICgkaG9tZSA9PT0gJHVzZXJEaXIgLiAnLy5jb21wb3NlcicgJiYgaXNfZGlyKCRob21lIC4gJy9jYWNoZScpKSB7CnJldHVybiAkaG9tZSAuICcvY2FjaGUnOwp9CgppZiAoc2VsZjo6dXNlWGRnKCkpIHsKJHhkZ0NhY2hlID0gUGxhdGZvcm06OmdldEVudignWERHX0NBQ0hFX0hPTUUnKSA/OiAkdXNlckRpciAuICcvLmNhY2hlJzsKCnJldHVybiAkeGRnQ2FjaGUgLiAnL2NvbXBvc2VyJzsKfQoKcmV0dXJuICRob21lIC4gJy9jYWNoZSc7Cn0KCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gZ2V0RGF0YURpcihzdHJpbmcgJGhvbWUpOiBzdHJpbmcKewokaG9tZUVudiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0hPTUUnKTsKaWYgKCRob21lRW52KSB7CnJldHVybiAkaG9tZUVudjsKfQoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gc3RydHIoJGhvbWUsICdcXCcsICcvJyk7Cn0KCiR1c2VyRGlyID0gc2VsZjo6Z2V0VXNlckRpcigpOwppZiAoJGhvbWUgIT09ICR1c2VyRGlyIC4gJy8uY29tcG9zZXInICYmIHNlbGY6OnVzZVhkZygpKSB7CiR4ZGdEYXRhID0gUGxhdGZvcm06OmdldEVudignWERHX0RBVEFfSE9NRScpID86ICR1c2VyRGlyIC4gJy8ubG9jYWwvc2hhcmUnOwoKcmV0dXJuICR4ZGdEYXRhIC4gJy9jb21wb3Nlcic7Cn0KCnJldHVybiAkaG9tZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVDb25maWcoP0lPSW50ZXJmYWNlICRpbyA9IG51bGwsID9zdHJpbmcgJGN3ZCA9IG51bGwpOiBDb25maWcKewokY3dkID0gJGN3ZCA/PyBQbGF0Zm9ybTo6Z2V0Q3dkKHRydWUpOwoKJGNvbmZpZyA9IG5ldyBDb25maWcodHJ1ZSwgJGN3ZCk7CgoKJGhvbWUgPSBzZWxmOjpnZXRIb21lRGlyKCk7CiRjb25maWctPm1lcmdlKFsKJ2NvbmZpZycgPT4gWwonaG9tZScgPT4gJGhvbWUsCidjYWNoZS1kaXInID0+IHNlbGY6OmdldENhY2hlRGlyKCRob21lKSwKJ2RhdGEtZGlyJyA9PiBzZWxmOjpnZXREYXRhRGlyKCRob21lKSwKXSwKXSwgQ29uZmlnOjpTT1VSQ0VfREVGQVVMVCk7CgoKJGZpbGUgPSBuZXcgSnNvbkZpbGUoJGNvbmZpZy0+Z2V0KCdob21lJykuJy9jb25maWcuanNvbicpOwppZiAoJGZpbGUtPmV4aXN0cygpKSB7CmlmICgkaW8gaW5zdGFuY2VvZiBJT0ludGVyZmFjZSkgewokaW8tPndyaXRlRXJyb3IoJ0xvYWRpbmcgY29uZmlnIGZpbGUgJyAuICRmaWxlLT5nZXRQYXRoKCksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0Kc2VsZjo6dmFsaWRhdGVKc29uU2NoZW1hKCRpbywgJGZpbGUpOwokY29uZmlnLT5tZXJnZSgkZmlsZS0+cmVhZCgpLCAkZmlsZS0+Z2V0UGF0aCgpKTsKfQokY29uZmlnLT5zZXRDb25maWdTb3VyY2UobmV3IEpzb25Db25maWdTb3VyY2UoJGZpbGUpKTsKCiRodGFjY2Vzc1Byb3RlY3QgPSAkY29uZmlnLT5nZXQoJ2h0YWNjZXNzLXByb3RlY3QnKTsKaWYgKCRodGFjY2Vzc1Byb3RlY3QpIHsKCgoKJGRpcnMgPSBbJGNvbmZpZy0+Z2V0KCdob21lJyksICRjb25maWctPmdldCgnY2FjaGUtZGlyJyksICRjb25maWctPmdldCgnZGF0YS1kaXInKV07CmZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKaWYgKCFmaWxlX2V4aXN0cygkZGlyIC4gJy8uaHRhY2Nlc3MnKSkgewppZiAoIWlzX2RpcigkZGlyKSkgewpTaWxlbmNlcjo6Y2FsbCgnbWtkaXInLCAkZGlyLCAwNzc3LCB0cnVlKTsKfQpTaWxlbmNlcjo6Y2FsbCgnZmlsZV9wdXRfY29udGVudHMnLCAkZGlyIC4gJy8uaHRhY2Nlc3MnLCAnRGVueSBmcm9tIGFsbCcpOwp9Cn0KfQoKCiRmaWxlID0gbmV3IEpzb25GaWxlKCRjb25maWctPmdldCgnaG9tZScpLicvYXV0aC5qc29uJyk7CmlmICgkZmlsZS0+ZXhpc3RzKCkpIHsKaWYgKCRpbyBpbnN0YW5jZW9mIElPSW50ZXJmYWNlKSB7CiRpby0+d3JpdGVFcnJvcignTG9hZGluZyBjb25maWcgZmlsZSAnIC4gJGZpbGUtPmdldFBhdGgoKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfQpzZWxmOjp2YWxpZGF0ZUpzb25TY2hlbWEoJGlvLCAkZmlsZSwgSnNvbkZpbGU6OkFVVEhfU0NIRU1BKTsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+ICRmaWxlLT5yZWFkKCldLCAkZmlsZS0+Z2V0UGF0aCgpKTsKfQokY29uZmlnLT5zZXRBdXRoQ29uZmlnU291cmNlKG5ldyBKc29uQ29uZmlnU291cmNlKCRmaWxlLCB0cnVlKSk7CgpzZWxmOjpsb2FkQ29tcG9zZXJBdXRoRW52KCRjb25maWcsICRpbyk7CgpyZXR1cm4gJGNvbmZpZzsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb21wb3NlckZpbGUoKTogc3RyaW5nCnsKJGVudiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSJyk7CmlmIChpc19zdHJpbmcoJGVudikpIHsKJGVudiA9IHRyaW0oJGVudik7CmlmICgnJyAhPT0gJGVudikgewppZiAoaXNfZGlyKCRlbnYpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIENPTVBPU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0byAnLiRlbnYuJyB3aGljaCBpcyBhIGRpcmVjdG9yeSwgdGhpcyB2YXJpYWJsZSBzaG91bGQgcG9pbnQgdG8gYSBjb21wb3Nlci5qc29uIG9yIGJlIGxlZnQgdW5zZXQuJyk7Cn0KCnJldHVybiAkZW52Owp9Cn0KCnJldHVybiAnLi9jb21wb3Nlci5qc29uJzsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRMb2NrRmlsZShzdHJpbmcgJGNvbXBvc2VyRmlsZSk6IHN0cmluZwp7CnJldHVybiAianNvbiIgPT09IHBhdGhpbmZvKCRjb21wb3NlckZpbGUsIFBBVEhJTkZPX0VYVEVOU0lPTikKPyBzdWJzdHIoJGNvbXBvc2VyRmlsZSwgMCwgLTQpLidsb2NrJwo6ICRjb21wb3NlckZpbGUgLiAnLmxvY2snOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUFkZGl0aW9uYWxTdHlsZXMoKTogYXJyYXkKewpyZXR1cm4gWwonaGlnaGxpZ2h0JyA9PiBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ3JlZCcpLAond2FybmluZycgPT4gbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCdibGFjaycsICd5ZWxsb3cnKSwKXTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVPdXRwdXQoKTogQ29uc29sZU91dHB1dAp7CiRzdHlsZXMgPSBzZWxmOjpjcmVhdGVBZGRpdGlvbmFsU3R5bGVzKCk7CiRmb3JtYXR0ZXIgPSBuZXcgT3V0cHV0Rm9ybWF0dGVyKGZhbHNlLCAkc3R5bGVzKTsKCnJldHVybiBuZXcgQ29uc29sZU91dHB1dChDb25zb2xlT3V0cHV0OjpWRVJCT1NJVFlfTk9STUFMLCBudWxsLCAkZm9ybWF0dGVyKTsKfQoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQ29tcG9zZXIoSU9JbnRlcmZhY2UgJGlvLCAkbG9jYWxDb25maWcgPSBudWxsLCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZSwgP3N0cmluZyAkY3dkID0gbnVsbCwgYm9vbCAkZnVsbExvYWQgPSB0cnVlLCBib29sICRkaXNhYmxlU2NyaXB0cyA9IGZhbHNlKQp7CgppZiAoaXNfc3RyaW5nKCRsb2NhbENvbmZpZykgJiYgaXNfZmlsZSgkbG9jYWxDb25maWcpICYmIG51bGwgPT09ICRjd2QpIHsKJGN3ZCA9IGRpcm5hbWUoJGxvY2FsQ29uZmlnKTsKfQoKJGN3ZCA9ICRjd2QgPz8gUGxhdGZvcm06OmdldEN3ZCh0cnVlKTsKCgppZiAobnVsbCA9PT0gJGxvY2FsQ29uZmlnKSB7CiRsb2NhbENvbmZpZyA9IHN0YXRpYzo6Z2V0Q29tcG9zZXJGaWxlKCk7Cn0KCiRsb2NhbENvbmZpZ1NvdXJjZSA9IENvbmZpZzo6U09VUkNFX1VOS05PV047CmlmIChpc19zdHJpbmcoJGxvY2FsQ29uZmlnKSkgewokY29tcG9zZXJGaWxlID0gJGxvY2FsQ29uZmlnOwoKJGZpbGUgPSBuZXcgSnNvbkZpbGUoJGxvY2FsQ29uZmlnLCBudWxsLCAkaW8pOwoKaWYgKCEkZmlsZS0+ZXhpc3RzKCkpIHsKaWYgKCRsb2NhbENvbmZpZyA9PT0gJy4vY29tcG9zZXIuanNvbicgfHwgJGxvY2FsQ29uZmlnID09PSAnY29tcG9zZXIuanNvbicpIHsKJG1lc3NhZ2UgPSAnQ29tcG9zZXIgY291bGQgbm90IGZpbmQgYSBjb21wb3Nlci5qc29uIGZpbGUgaW4gJy4kY3dkOwp9IGVsc2UgewokbWVzc2FnZSA9ICdDb21wb3NlciBjb3VsZCBub3QgZmluZCB0aGUgY29uZmlnIGZpbGU6ICcuJGxvY2FsQ29uZmlnOwp9CiRpbnN0cnVjdGlvbnMgPSAkZnVsbExvYWQgPyAnVG8gaW5pdGlhbGl6ZSBhIHByb2plY3QsIHBsZWFzZSBjcmVhdGUgYSBjb21wb3Nlci5qc29uIGZpbGUuIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9iYXNpYy11c2FnZScgOiAnJzsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG1lc3NhZ2UuUEhQX0VPTC4kaW5zdHJ1Y3Rpb25zKTsKfQoKaWYgKCFQbGF0Zm9ybTo6aXNJbnB1dENvbXBsZXRpb25Qcm9jZXNzKCkpIHsKdHJ5IHsKJGZpbGUtPnZhbGlkYXRlU2NoZW1hKEpzb25GaWxlOjpMQVhfU0NIRU1BKTsKfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKJGVycm9ycyA9ICcgLSAnIC4gaW1wbG9kZShQSFBfRU9MIC4gJyAtICcsICRlLT5nZXRFcnJvcnMoKSk7CiRtZXNzYWdlID0gJGUtPmdldE1lc3NhZ2UoKSAuICc6JyAuIFBIUF9FT0wgLiAkZXJyb3JzOwp0aHJvdyBuZXcgSnNvblZhbGlkYXRpb25FeGNlcHRpb24oJG1lc3NhZ2UpOwp9Cn0KCiRsb2NhbENvbmZpZyA9ICRmaWxlLT5yZWFkKCk7CiRsb2NhbENvbmZpZ1NvdXJjZSA9ICRmaWxlLT5nZXRQYXRoKCk7Cn0KCgokY29uZmlnID0gc3RhdGljOjpjcmVhdGVDb25maWcoJGlvLCAkY3dkKTsKJGlzR2xvYmFsID0gJGxvY2FsQ29uZmlnU291cmNlICE9PSBDb25maWc6OlNPVVJDRV9VTktOT1dOICYmIHJlYWxwYXRoKCRjb25maWctPmdldCgnaG9tZScpKSA9PT0gcmVhbHBhdGgoZGlybmFtZSgkbG9jYWxDb25maWdTb3VyY2UpKTsKJGNvbmZpZy0+bWVyZ2UoJGxvY2FsQ29uZmlnLCAkbG9jYWxDb25maWdTb3VyY2UpOwoKaWYgKGlzc2V0KCRjb21wb3NlckZpbGUpKSB7CiRpby0+d3JpdGVFcnJvcignTG9hZGluZyBjb25maWcgZmlsZSAnIC4gJGNvbXBvc2VyRmlsZSAuJyAoJy5yZWFscGF0aCgkY29tcG9zZXJGaWxlKS4nKScsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiRjb25maWctPnNldENvbmZpZ1NvdXJjZShuZXcgSnNvbkNvbmZpZ1NvdXJjZShuZXcgSnNvbkZpbGUocmVhbHBhdGgoJGNvbXBvc2VyRmlsZSksIG51bGwsICRpbykpKTsKCiRsb2NhbEF1dGhGaWxlID0gbmV3IEpzb25GaWxlKGRpcm5hbWUocmVhbHBhdGgoJGNvbXBvc2VyRmlsZSkpIC4gJy9hdXRoLmpzb24nLCBudWxsLCAkaW8pOwppZiAoJGxvY2FsQXV0aEZpbGUtPmV4aXN0cygpKSB7CiRpby0+d3JpdGVFcnJvcignTG9hZGluZyBjb25maWcgZmlsZSAnIC4gJGxvY2FsQXV0aEZpbGUtPmdldFBhdGgoKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKc2VsZjo6dmFsaWRhdGVKc29uU2NoZW1hKCRpbywgJGxvY2FsQXV0aEZpbGUsIEpzb25GaWxlOjpBVVRIX1NDSEVNQSk7CiRjb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiAkbG9jYWxBdXRoRmlsZS0+cmVhZCgpXSwgJGxvY2FsQXV0aEZpbGUtPmdldFBhdGgoKSk7CiRjb25maWctPnNldExvY2FsQXV0aENvbmZpZ1NvdXJjZShuZXcgSnNvbkNvbmZpZ1NvdXJjZSgkbG9jYWxBdXRoRmlsZSwgdHJ1ZSkpOwp9Cn0KCgpzZWxmOjpsb2FkQ29tcG9zZXJBdXRoRW52KCRjb25maWcsICRpbyk7CgokdmVuZG9yRGlyID0gJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJyk7CgoKJGNvbXBvc2VyID0gJGZ1bGxMb2FkID8gbmV3IENvbXBvc2VyKCkgOiBuZXcgUGFydGlhbENvbXBvc2VyKCk7CiRjb21wb3Nlci0+c2V0Q29uZmlnKCRjb25maWcpOwppZiAoJGlzR2xvYmFsKSB7CiRjb21wb3Nlci0+c2V0R2xvYmFsKCk7Cn0KCmlmICgkZnVsbExvYWQpIHsKCiRpby0+bG9hZENvbmZpZ3VyYXRpb24oJGNvbmZpZyk7CgoKCmlmIChmYWxzZSA9PT0gJGRpc2FibGVQbHVnaW5zICYmIGZhbHNlID09PSAkZGlzYWJsZVNjcmlwdHMgJiYgIWNsYXNzX2V4aXN0cygnQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnMnLCBmYWxzZSkgJiYgZmlsZV9leGlzdHMoJGluc3RhbGxlZFZlcnNpb25zUGF0aCA9ICRjb25maWctPmdldCgndmVuZG9yLWRpcicpLicvY29tcG9zZXIvaW5zdGFsbGVkLnBocCcpKSB7CgoKaWYgKGNsYXNzX2V4aXN0cygnQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnMnKSkgewpGaWxlc3lzdGVtUmVwb3NpdG9yeTo6c2FmZWx5TG9hZEluc3RhbGxlZFZlcnNpb25zKCRpbnN0YWxsZWRWZXJzaW9uc1BhdGgpOwp9Cn0KfQoKJGh0dHBEb3dubG9hZGVyID0gc2VsZjo6Y3JlYXRlSHR0cERvd25sb2FkZXIoJGlvLCAkY29uZmlnKTsKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiRsb29wID0gbmV3IExvb3AoJGh0dHBEb3dubG9hZGVyLCAkcHJvY2Vzcyk7CiRjb21wb3Nlci0+c2V0TG9vcCgkbG9vcCk7CgoKJGRpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCRjb21wb3NlciwgJGlvLCAkcHJvY2Vzcyk7CiRkaXNwYXRjaGVyLT5zZXRSdW5TY3JpcHRzKCEkZGlzYWJsZVNjcmlwdHMpOwokY29tcG9zZXItPnNldEV2ZW50RGlzcGF0Y2hlcigkZGlzcGF0Y2hlcik7CgoKJHJtID0gUmVwb3NpdG9yeUZhY3Rvcnk6Om1hbmFnZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRkaXNwYXRjaGVyLCAkcHJvY2Vzcyk7CiRjb21wb3Nlci0+c2V0UmVwb3NpdG9yeU1hbmFnZXIoJHJtKTsKCgoKaWYgKCEkZnVsbExvYWQgJiYgIWlzc2V0KCRsb2NhbENvbmZpZ1sndmVyc2lvbiddKSkgewokbG9jYWxDb25maWdbJ3ZlcnNpb24nXSA9ICcxLjAuMCc7Cn0KCgokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXI7CiRndWVzc2VyID0gbmV3IFZlcnNpb25HdWVzc2VyKCRjb25maWcsICRwcm9jZXNzLCAkcGFyc2VyLCAkaW8pOwokbG9hZGVyID0gJHRoaXMtPmxvYWRSb290UGFja2FnZSgkcm0sICRjb25maWcsICRwYXJzZXIsICRndWVzc2VyLCAkaW8pOwokcGFja2FnZSA9ICRsb2FkZXItPmxvYWQoJGxvY2FsQ29uZmlnLCAnQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZScsICRjd2QpOwokY29tcG9zZXItPnNldFBhY2thZ2UoJHBhY2thZ2UpOwoKCiR0aGlzLT5hZGRMb2NhbFJlcG9zaXRvcnkoJGlvLCAkcm0sICR2ZW5kb3JEaXIsICRwYWNrYWdlLCAkcHJvY2Vzcyk7CgoKJGltID0gJHRoaXMtPmNyZWF0ZUluc3RhbGxhdGlvbk1hbmFnZXIoJGxvb3AsICRpbywgJGRpc3BhdGNoZXIpOwokY29tcG9zZXItPnNldEluc3RhbGxhdGlvbk1hbmFnZXIoJGltKTsKCmlmICgkY29tcG9zZXIgaW5zdGFuY2VvZiBDb21wb3NlcikgewoKJGRtID0gJHRoaXMtPmNyZWF0ZURvd25sb2FkTWFuYWdlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJHByb2Nlc3MsICRkaXNwYXRjaGVyKTsKJGNvbXBvc2VyLT5zZXREb3dubG9hZE1hbmFnZXIoJGRtKTsKCgokZ2VuZXJhdG9yID0gbmV3IEF1dG9sb2FkR2VuZXJhdG9yKCRkaXNwYXRjaGVyLCAkaW8pOwokY29tcG9zZXItPnNldEF1dG9sb2FkR2VuZXJhdG9yKCRnZW5lcmF0b3IpOwoKCiRhbSA9ICR0aGlzLT5jcmVhdGVBcmNoaXZlTWFuYWdlcigkY29uZmlnLCAkZG0sICRsb29wKTsKJGNvbXBvc2VyLT5zZXRBcmNoaXZlTWFuYWdlcigkYW0pOwp9CgoKJHRoaXMtPmNyZWF0ZURlZmF1bHRJbnN0YWxsZXJzKCRpbSwgJGNvbXBvc2VyLCAkaW8sICRwcm9jZXNzKTsKCgppZiAoJGNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIgJiYgaXNzZXQoJGNvbXBvc2VyRmlsZSkpIHsKJGxvY2tGaWxlID0gc2VsZjo6Z2V0TG9ja0ZpbGUoJGNvbXBvc2VyRmlsZSk7CmlmICghJGNvbmZpZy0+Z2V0KCdsb2NrJykgJiYgZmlsZV9leGlzdHMoJGxvY2tGaWxlKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJGxvY2tGaWxlLicgaXMgcHJlc2VudCBidXQgaWdub3JlZCBhcyB0aGUgImxvY2siIGNvbmZpZyBvcHRpb24gaXMgZGlzYWJsZWQuPC93YXJuaW5nPicpOwp9CgokbG9ja2VyID0gbmV3IFBhY2thZ2VcTG9ja2VyKCRpbywgbmV3IEpzb25GaWxlKCRjb25maWctPmdldCgnbG9jaycpID8gJGxvY2tGaWxlIDogUGxhdGZvcm06OmdldERldk51bGwoKSwgbnVsbCwgJGlvKSwgJGltLCBmaWxlX2dldF9jb250ZW50cygkY29tcG9zZXJGaWxlKSwgJHByb2Nlc3MpOwokY29tcG9zZXItPnNldExvY2tlcigkbG9ja2VyKTsKfSBlbHNlaWYgKCRjb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyKSB7CiRsb2NrZXIgPSBuZXcgUGFja2FnZVxMb2NrZXIoJGlvLCBuZXcgSnNvbkZpbGUoUGxhdGZvcm06OmdldERldk51bGwoKSwgbnVsbCwgJGlvKSwgJGltLCBKc29uRmlsZTo6ZW5jb2RlKCRsb2NhbENvbmZpZyksICRwcm9jZXNzKTsKJGNvbXBvc2VyLT5zZXRMb2NrZXIoJGxvY2tlcik7Cn0KCmlmICgkY29tcG9zZXIgaW5zdGFuY2VvZiBDb21wb3NlcikgewokZ2xvYmFsQ29tcG9zZXIgPSBudWxsOwppZiAoISRjb21wb3Nlci0+aXNHbG9iYWwoKSkgewokZ2xvYmFsQ29tcG9zZXIgPSAkdGhpcy0+Y3JlYXRlR2xvYmFsQ29tcG9zZXIoJGlvLCAkY29uZmlnLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7Cn0KCiRwbSA9ICR0aGlzLT5jcmVhdGVQbHVnaW5NYW5hZ2VyKCRpbywgJGNvbXBvc2VyLCAkZ2xvYmFsQ29tcG9zZXIsICRkaXNhYmxlUGx1Z2lucyk7CiRjb21wb3Nlci0+c2V0UGx1Z2luTWFuYWdlcigkcG0pOwoKaWYgKCRjb21wb3Nlci0+aXNHbG9iYWwoKSkgewokcG0tPnNldFJ1bm5pbmdJbkdsb2JhbERpcih0cnVlKTsKfQoKJHBtLT5sb2FkSW5zdGFsbGVkUGx1Z2lucygpOwp9CgppZiAoJGZ1bGxMb2FkKSB7CiRpbml0RXZlbnQgPSBuZXcgRXZlbnQoUGx1Z2luRXZlbnRzOjpJTklUKTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGluaXRFdmVudC0+Z2V0TmFtZSgpLCAkaW5pdEV2ZW50KTsKCgoKJHRoaXMtPnB1cmdlUGFja2FnZXMoJHJtLT5nZXRMb2NhbFJlcG9zaXRvcnkoKSwgJGltKTsKfQoKcmV0dXJuICRjb21wb3NlcjsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlR2xvYmFsKElPSW50ZXJmYWNlICRpbywgYm9vbCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZSwgYm9vbCAkZGlzYWJsZVNjcmlwdHMgPSBmYWxzZSk6ID9Db21wb3Nlcgp7CiRmYWN0b3J5ID0gbmV3IHN0YXRpYygpOwoKcmV0dXJuICRmYWN0b3J5LT5jcmVhdGVHbG9iYWxDb21wb3NlcigkaW8sIHN0YXRpYzo6Y3JlYXRlQ29uZmlnKCRpbyksICRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzLCB0cnVlKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZExvY2FsUmVwb3NpdG9yeShJT0ludGVyZmFjZSAkaW8sIFJlcG9zaXRvcnlNYW5hZ2VyICRybSwgc3RyaW5nICR2ZW5kb3JEaXIsIFJvb3RQYWNrYWdlSW50ZXJmYWNlICRyb290UGFja2FnZSwgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpOiB2b2lkCnsKJGZzID0gbnVsbDsKaWYgKCRwcm9jZXNzKSB7CiRmcyA9IG5ldyBGaWxlc3lzdGVtKCRwcm9jZXNzKTsKfQoKJHJtLT5zZXRMb2NhbFJlcG9zaXRvcnkobmV3IFJlcG9zaXRvcnlcSW5zdGFsbGVkRmlsZXN5c3RlbVJlcG9zaXRvcnkobmV3IEpzb25GaWxlKCR2ZW5kb3JEaXIuJy9jb21wb3Nlci9pbnN0YWxsZWQuanNvbicsIG51bGwsICRpbyksIHRydWUsICRyb290UGFja2FnZSwgJGZzKSk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZUdsb2JhbENvbXBvc2VyKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsICRkaXNhYmxlUGx1Z2lucywgYm9vbCAkZGlzYWJsZVNjcmlwdHMsIGJvb2wgJGZ1bGxMb2FkID0gZmFsc2UpOiA/UGFydGlhbENvbXBvc2VyCnsKCiRkaXNhYmxlUGx1Z2lucyA9ICRkaXNhYmxlUGx1Z2lucyA9PT0gJ2dsb2JhbCcgfHwgJGRpc2FibGVQbHVnaW5zID09PSB0cnVlOwoKJGNvbXBvc2VyID0gbnVsbDsKdHJ5IHsKJGNvbXBvc2VyID0gJHRoaXMtPmNyZWF0ZUNvbXBvc2VyKCRpbywgJGNvbmZpZy0+Z2V0KCdob21lJykgLiAnL2NvbXBvc2VyLmpzb24nLCAkZGlzYWJsZVBsdWdpbnMsICRjb25maWctPmdldCgnaG9tZScpLCAkZnVsbExvYWQsICRkaXNhYmxlU2NyaXB0cyk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJGlvLT53cml0ZUVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBnbG9iYWwgY29tcG9zZXI6ICcuJGUtPmdldE1lc3NhZ2UoKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfQoKcmV0dXJuICRjb21wb3NlcjsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVEb3dubG9hZE1hbmFnZXIoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyLCBQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MsID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwpOiBEb3dubG9hZGVyXERvd25sb2FkTWFuYWdlcgp7CiRjYWNoZSA9IG51bGw7CmlmICgkY29uZmlnLT5nZXQoJ2NhY2hlLWZpbGVzLXR0bCcpID4gMCkgewokY2FjaGUgPSBuZXcgQ2FjaGUoJGlvLCAkY29uZmlnLT5nZXQoJ2NhY2hlLWZpbGVzLWRpcicpLCAnYS16MC05Xy4vJyk7CiRjYWNoZS0+c2V0UmVhZE9ubHkoJGNvbmZpZy0+Z2V0KCdjYWNoZS1yZWFkLW9ubHknKSk7Cn0KCiRmcyA9IG5ldyBGaWxlc3lzdGVtKCRwcm9jZXNzKTsKCiRkbSA9IG5ldyBEb3dubG9hZGVyXERvd25sb2FkTWFuYWdlcigkaW8sIGZhbHNlLCAkZnMpOwpzd2l0Y2ggKCRwcmVmZXJyZWQgPSAkY29uZmlnLT5nZXQoJ3ByZWZlcnJlZC1pbnN0YWxsJykpIHsKY2FzZSAnZGlzdCc6CiRkbS0+c2V0UHJlZmVyRGlzdCh0cnVlKTsKYnJlYWs7CmNhc2UgJ3NvdXJjZSc6CiRkbS0+c2V0UHJlZmVyU291cmNlKHRydWUpOwpicmVhazsKY2FzZSAnYXV0byc6CmRlZmF1bHQ6CgpicmVhazsKfQoKaWYgKGlzX2FycmF5KCRwcmVmZXJyZWQpKSB7CiRkbS0+c2V0UHJlZmVyZW5jZXMoJHByZWZlcnJlZCk7Cn0KCiRkbS0+c2V0RG93bmxvYWRlcignZ2l0JywgbmV3IERvd25sb2FkZXJcR2l0RG93bmxvYWRlcigkaW8sICRjb25maWcsICRwcm9jZXNzLCAkZnMpKTsKJGRtLT5zZXREb3dubG9hZGVyKCdzdm4nLCBuZXcgRG93bmxvYWRlclxTdm5Eb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJHByb2Nlc3MsICRmcykpOwokZG0tPnNldERvd25sb2FkZXIoJ2Zvc3NpbCcsIG5ldyBEb3dubG9hZGVyXEZvc3NpbERvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkcHJvY2VzcywgJGZzKSk7CiRkbS0+c2V0RG93bmxvYWRlcignaGcnLCBuZXcgRG93bmxvYWRlclxIZ0Rvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkcHJvY2VzcywgJGZzKSk7CiRkbS0+c2V0RG93bmxvYWRlcigncGVyZm9yY2UnLCBuZXcgRG93bmxvYWRlclxQZXJmb3JjZURvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkcHJvY2VzcywgJGZzKSk7CiRkbS0+c2V0RG93bmxvYWRlcignemlwJywgbmV3IERvd25sb2FkZXJcWmlwRG93bmxvYWRlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJGV2ZW50RGlzcGF0Y2hlciwgJGNhY2hlLCAkZnMsICRwcm9jZXNzKSk7CiRkbS0+c2V0RG93bmxvYWRlcigncmFyJywgbmV3IERvd25sb2FkZXJcUmFyRG93bmxvYWRlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJGV2ZW50RGlzcGF0Y2hlciwgJGNhY2hlLCAkZnMsICRwcm9jZXNzKSk7CiRkbS0+c2V0RG93bmxvYWRlcigndGFyJywgbmV3IERvd25sb2FkZXJcVGFyRG93bmxvYWRlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJGV2ZW50RGlzcGF0Y2hlciwgJGNhY2hlLCAkZnMsICRwcm9jZXNzKSk7CiRkbS0+c2V0RG93bmxvYWRlcignZ3ppcCcsIG5ldyBEb3dubG9hZGVyXEd6aXBEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkZXZlbnREaXNwYXRjaGVyLCAkY2FjaGUsICRmcywgJHByb2Nlc3MpKTsKJGRtLT5zZXREb3dubG9hZGVyKCd4eicsIG5ldyBEb3dubG9hZGVyXFh6RG93bmxvYWRlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJGV2ZW50RGlzcGF0Y2hlciwgJGNhY2hlLCAkZnMsICRwcm9jZXNzKSk7CiRkbS0+c2V0RG93bmxvYWRlcigncGhhcicsIG5ldyBEb3dubG9hZGVyXFBoYXJEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkZXZlbnREaXNwYXRjaGVyLCAkY2FjaGUsICRmcywgJHByb2Nlc3MpKTsKJGRtLT5zZXREb3dubG9hZGVyKCdmaWxlJywgbmV3IERvd25sb2FkZXJcRmlsZURvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3BhdGgnLCBuZXcgRG93bmxvYWRlclxQYXRoRG93bmxvYWRlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJGV2ZW50RGlzcGF0Y2hlciwgJGNhY2hlLCAkZnMsICRwcm9jZXNzKSk7CgpyZXR1cm4gJGRtOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVBcmNoaXZlTWFuYWdlcihDb25maWcgJGNvbmZpZywgRG93bmxvYWRlclxEb3dubG9hZE1hbmFnZXIgJGRtLCBMb29wICRsb29wKQp7CiRhbSA9IG5ldyBBcmNoaXZlclxBcmNoaXZlTWFuYWdlcigkZG0sICRsb29wKTsKaWYgKGNsYXNzX2V4aXN0cyhaaXBBcmNoaXZlOjpjbGFzcykpIHsKJGFtLT5hZGRBcmNoaXZlcihuZXcgQXJjaGl2ZXJcWmlwQXJjaGl2ZXIpOwp9CmlmIChjbGFzc19leGlzdHMoUGhhcjo6Y2xhc3MpKSB7CiRhbS0+YWRkQXJjaGl2ZXIobmV3IEFyY2hpdmVyXFBoYXJBcmNoaXZlcik7Cn0KCnJldHVybiAkYW07Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVQbHVnaW5NYW5hZ2VyKElPSW50ZXJmYWNlICRpbywgQ29tcG9zZXIgJGNvbXBvc2VyLCA/UGFydGlhbENvbXBvc2VyICRnbG9iYWxDb21wb3NlciA9IG51bGwsICRkaXNhYmxlUGx1Z2lucyA9IGZhbHNlKTogUGx1Z2luXFBsdWdpbk1hbmFnZXIKewpyZXR1cm4gbmV3IFBsdWdpblxQbHVnaW5NYW5hZ2VyKCRpbywgJGNvbXBvc2VyLCAkZ2xvYmFsQ29tcG9zZXIsICRkaXNhYmxlUGx1Z2lucyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVJbnN0YWxsYXRpb25NYW5hZ2VyKExvb3AgJGxvb3AsIElPSW50ZXJmYWNlICRpbywgP0V2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyID0gbnVsbCk6IEluc3RhbGxlclxJbnN0YWxsYXRpb25NYW5hZ2VyCnsKcmV0dXJuIG5ldyBJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcigkbG9vcCwgJGlvLCAkZXZlbnREaXNwYXRjaGVyKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRJbnN0YWxsZXJzKEluc3RhbGxlclxJbnN0YWxsYXRpb25NYW5hZ2VyICRpbSwgUGFydGlhbENvbXBvc2VyICRjb21wb3NlciwgSU9JbnRlcmZhY2UgJGlvLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCk6IHZvaWQKewokZnMgPSBuZXcgRmlsZXN5c3RlbSgkcHJvY2Vzcyk7CiRiaW5hcnlJbnN0YWxsZXIgPSBuZXcgSW5zdGFsbGVyXEJpbmFyeUluc3RhbGxlcigkaW8sIHJ0cmltKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYmluLWRpcicpLCAnLycpLCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2Jpbi1jb21wYXQnKSwgJGZzLCBydHJpbSgkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ3ZlbmRvci1kaXInKSwgJy8nKSk7CgokaW0tPmFkZEluc3RhbGxlcihuZXcgSW5zdGFsbGVyXExpYnJhcnlJbnN0YWxsZXIoJGlvLCAkY29tcG9zZXIsIG51bGwsICRmcywgJGJpbmFyeUluc3RhbGxlcikpOwokaW0tPmFkZEluc3RhbGxlcihuZXcgSW5zdGFsbGVyXFBsdWdpbkluc3RhbGxlcigkaW8sICRjb21wb3NlciwgJGZzLCAkYmluYXJ5SW5zdGFsbGVyKSk7CiRpbS0+YWRkSW5zdGFsbGVyKG5ldyBJbnN0YWxsZXJcTWV0YXBhY2thZ2VJbnN0YWxsZXIoJGlvKSk7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHVyZ2VQYWNrYWdlcyhJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlciAkaW0pOiB2b2lkCnsKZm9yZWFjaCAoJHJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCEkaW0tPmlzUGFja2FnZUluc3RhbGxlZCgkcmVwbywgJHBhY2thZ2UpKSB7CiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRwYWNrYWdlKTsKfQp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBsb2FkUm9vdFBhY2thZ2UoUmVwb3NpdG9yeU1hbmFnZXIgJHJtLCBDb25maWcgJGNvbmZpZywgVmVyc2lvblBhcnNlciAkcGFyc2VyLCBWZXJzaW9uR3Vlc3NlciAkZ3Vlc3NlciwgSU9JbnRlcmZhY2UgJGlvKTogUGFja2FnZVxMb2FkZXJcUm9vdFBhY2thZ2VMb2FkZXIKewpyZXR1cm4gbmV3IFBhY2thZ2VcTG9hZGVyXFJvb3RQYWNrYWdlTG9hZGVyKCRybSwgJGNvbmZpZywgJHBhcnNlciwgJGd1ZXNzZXIsICRpbyk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZShJT0ludGVyZmFjZSAkaW8sICRjb25maWcgPSBudWxsLCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZSwgYm9vbCAkZGlzYWJsZVNjcmlwdHMgPSBmYWxzZSk6IENvbXBvc2VyCnsKJGZhY3RvcnkgPSBuZXcgc3RhdGljKCk7CgoKCgoKaWYgKCRjb25maWcgIT09IG51bGwgJiYgJGNvbmZpZyAhPT0gc2VsZjo6Z2V0Q29tcG9zZXJGaWxlKCkgJiYgJGRpc2FibGVQbHVnaW5zID09PSBmYWxzZSkgewokZGlzYWJsZVBsdWdpbnMgPSAnbG9jYWwnOwp9CgpyZXR1cm4gJGZhY3RvcnktPmNyZWF0ZUNvbXBvc2VyKCRpbywgJGNvbmZpZywgJGRpc2FibGVQbHVnaW5zLCBudWxsLCB0cnVlLCAkZGlzYWJsZVNjcmlwdHMpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVIdHRwRG93bmxvYWRlcihJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBhcnJheSAkb3B0aW9ucyA9IFtdKTogSHR0cERvd25sb2FkZXIKewpzdGF0aWMgJHdhcm5lZCA9IGZhbHNlOwokZGlzYWJsZVRscyA9IGZhbHNlOwoKaWYgKGlzc2V0KCRfU0VSVkVSWydhcmd2J10pICYmIGluX2FycmF5KCdkaXNhYmxlLXRscycsICRfU0VSVkVSWydhcmd2J10pICYmIChpbl9hcnJheSgnY29uZicsICRfU0VSVkVSWydhcmd2J10pIHx8IGluX2FycmF5KCdjb25maWcnLCAkX1NFUlZFUlsnYXJndiddKSkpIHsKJHdhcm5lZCA9IHRydWU7CiRkaXNhYmxlVGxzID0gIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKTsKfSBlbHNlaWYgKCRjb25maWctPmdldCgnZGlzYWJsZS10bHMnKSA9PT0gdHJ1ZSkgewppZiAoISR3YXJuZWQpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHJ1bm5pbmcgQ29tcG9zZXIgd2l0aCBTU0wvVExTIHByb3RlY3Rpb24gZGlzYWJsZWQuPC93YXJuaW5nPicpOwp9CiR3YXJuZWQgPSB0cnVlOwokZGlzYWJsZVRscyA9IHRydWU7Cn0gZWxzZWlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSB7CnRocm93IG5ldyBFeGNlcHRpb25cTm9Tc2xFeGNlcHRpb24oJ1RoZSBvcGVuc3NsIGV4dGVuc2lvbiBpcyByZXF1aXJlZCBmb3IgU1NML1RMUyBwcm90ZWN0aW9uIGJ1dCBpcyBub3QgYXZhaWxhYmxlLiAnCi4gJ0lmIHlvdSBjYW4gbm90IGVuYWJsZSB0aGUgb3BlbnNzbCBleHRlbnNpb24sIHlvdSBjYW4gZGlzYWJsZSB0aGlzIGVycm9yLCBhdCB5b3VyIG93biByaXNrLCBieSBzZXR0aW5nIHRoZSBcJ2Rpc2FibGUtdGxzXCcgb3B0aW9uIHRvIHRydWUuJyk7Cn0KJGh0dHBEb3dubG9hZGVyT3B0aW9ucyA9IFtdOwppZiAoJGRpc2FibGVUbHMgPT09IGZhbHNlKSB7CmlmICgnJyAhPT0gJGNvbmZpZy0+Z2V0KCdjYWZpbGUnKSkgewokaHR0cERvd25sb2FkZXJPcHRpb25zWydzc2wnXVsnY2FmaWxlJ10gPSAkY29uZmlnLT5nZXQoJ2NhZmlsZScpOwp9CmlmICgnJyAhPT0gJGNvbmZpZy0+Z2V0KCdjYXBhdGgnKSkgewokaHR0cERvd25sb2FkZXJPcHRpb25zWydzc2wnXVsnY2FwYXRoJ10gPSAkY29uZmlnLT5nZXQoJ2NhcGF0aCcpOwp9CiRodHRwRG93bmxvYWRlck9wdGlvbnMgPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkaHR0cERvd25sb2FkZXJPcHRpb25zLCAkb3B0aW9ucyk7Cn0KdHJ5IHsKJGh0dHBEb3dubG9hZGVyID0gbmV3IEh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyT3B0aW9ucywgJGRpc2FibGVUbHMpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKGZhbHNlICE9PSBzdHJwb3MoJGUtPmdldE1lc3NhZ2UoKSwgJ2NhZmlsZScpKSB7CiRpby0+d3JpdGUoJzxlcnJvcj5VbmFibGUgdG8gbG9jYXRlIGEgdmFsaWQgQ0EgY2VydGlmaWNhdGUgZmlsZS4gWW91IG11c3Qgc2V0IGEgdmFsaWQgXCdjYWZpbGVcJyBvcHRpb24uPC9lcnJvcj4nKTsKJGlvLT53cml0ZSgnPGVycm9yPkEgdmFsaWQgQ0EgY2VydGlmaWNhdGUgZmlsZSBpcyByZXF1aXJlZCBmb3IgU1NML1RMUyBwcm90ZWN0aW9uLjwvZXJyb3I+Jyk7CiRpby0+d3JpdGUoJzxlcnJvcj5Zb3UgY2FuIGRpc2FibGUgdGhpcyBlcnJvciwgYXQgeW91ciBvd24gcmlzaywgYnkgc2V0dGluZyB0aGUgXCdkaXNhYmxlLXRsc1wnIG9wdGlvbiB0byB0cnVlLjwvZXJyb3I+Jyk7Cn0KdGhyb3cgJGU7Cn0KCnJldHVybiAkaHR0cERvd25sb2FkZXI7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGxvYWRDb21wb3NlckF1dGhFbnYoQ29uZmlnICRjb25maWcsID9JT0ludGVyZmFjZSAkaW8pOiB2b2lkCnsKJGNvbXBvc2VyQXV0aEVudiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0FVVEgnKTsKaWYgKGZhbHNlID09PSAkY29tcG9zZXJBdXRoRW52IHx8ICcnID09PSAkY29tcG9zZXJBdXRoRW52KSB7CnJldHVybjsKfQoKJGF1dGhEYXRhID0ganNvbl9kZWNvZGUoJGNvbXBvc2VyQXV0aEVudik7CmlmIChudWxsID09PSAkYXV0aERhdGEpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0NPTVBPU0VSX0FVVEggZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbWFsZm9ybWVkLCBzaG91bGQgYmUgYSB2YWxpZCBKU09OIG9iamVjdCcpOwp9CgppZiAoJGlvIGluc3RhbmNlb2YgSU9JbnRlcmZhY2UpIHsKJGlvLT53cml0ZUVycm9yKCdMb2FkaW5nIGF1dGggY29uZmlnIGZyb20gQ09NUE9TRVJfQVVUSCcsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0Kc2VsZjo6dmFsaWRhdGVKc29uU2NoZW1hKCRpbywgJGF1dGhEYXRhLCBKc29uRmlsZTo6QVVUSF9TQ0hFTUEsICdDT01QT1NFUl9BVVRIJyk7CiRhdXRoRGF0YSA9IGpzb25fZGVjb2RlKCRjb21wb3NlckF1dGhFbnYsIHRydWUpOwppZiAobnVsbCAhPT0gJGF1dGhEYXRhKSB7CiRjb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiAkYXV0aERhdGFdLCAnQ09NUE9TRVJfQVVUSCcpOwp9Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHVzZVhkZygpOiBib29sCnsKZm9yZWFjaCAoYXJyYXlfa2V5cygkX1NFUlZFUikgYXMgJGtleSkgewppZiAoc3RycG9zKChzdHJpbmcpICRrZXksICdYREdfJykgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KfQoKaWYgKFNpbGVuY2VyOjpjYWxsKCdpc19kaXInLCAnL2V0Yy94ZGcnKSkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRVc2VyRGlyKCk6IHN0cmluZwp7CiRob21lID0gUGxhdGZvcm06OmdldEVudignSE9NRScpOwppZiAoISRob21lKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIEhPTUUgb3IgQ09NUE9TRVJfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGJlIHNldCBmb3IgY29tcG9zZXIgdG8gcnVuIGNvcnJlY3RseScpOwp9CgpyZXR1cm4gcnRyaW0oc3RydHIoJGhvbWUsICdcXCcsICcvJyksICcvJyk7Cn0KCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUpzb25TY2hlbWEoP0lPSW50ZXJmYWNlICRpbywgJGZpbGVPckRhdGEsIGludCAkc2NoZW1hID0gSnNvbkZpbGU6OkxBWF9TQ0hFTUEsID9zdHJpbmcgJHNvdXJjZSA9IG51bGwpOiB2b2lkCnsKaWYgKFBsYXRmb3JtOjppc0lucHV0Q29tcGxldGlvblByb2Nlc3MoKSkgewpyZXR1cm47Cn0KCnRyeSB7CmlmICgkZmlsZU9yRGF0YSBpbnN0YW5jZW9mIEpzb25GaWxlKSB7CiRmaWxlT3JEYXRhLT52YWxpZGF0ZVNjaGVtYSgkc2NoZW1hKTsKfSBlbHNlIHsKaWYgKG51bGwgPT09ICRzb3VyY2UpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRzb3VyY2UgaXMgcmVxdWlyZWQgdG8gYmUgcHJvdmlkZWQgaWYgJGZpbGVPckRhdGEgaXMgYXJiaXRyYXJ5IGRhdGEnKTsKfQpKc29uRmlsZTo6dmFsaWRhdGVKc29uU2NoZW1hKCRzb3VyY2UsICRmaWxlT3JEYXRhLCAkc2NoZW1hKTsKfQp9IGNhdGNoIChKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewokbXNnID0gJGUtPmdldE1lc3NhZ2UoKS4nLCB0aGlzIG1heSByZXN1bHQgaW4gZXJyb3JzIGFuZCBzaG91bGQgYmUgcmVzb2x2ZWQ6Jy5QSFBfRU9MLicgLSAnLmltcGxvZGUoUEhQX0VPTC4nIC0gJywgJGUtPmdldEVycm9ycygpKTsKaWYgKCRpbyBpbnN0YW5jZW9mIElPSW50ZXJmYWNlKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kbXNnLic8Lz4nKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbigkbXNnKTsKfQp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7Cgp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CgpmaW5hbCBjbGFzcyBJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGltcGxlbWVudHMgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZQp7CnB1YmxpYyBmdW5jdGlvbiBpc0lnbm9yZWQoc3RyaW5nICRyZXEpOiBib29sCnsKcmV0dXJuIFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHJlcSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1VwcGVyQm91bmRJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbAp7CnJldHVybiAkdGhpcy0+aXNJZ25vcmVkKCRyZXEpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTXVsdGlDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXEludGVydmFsOwp1c2UgQ29tcG9zZXJcU2VtdmVyXEludGVydmFsczsKCmZpbmFsIGNsYXNzIElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGltcGxlbWVudHMgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZQp7CgoKCnByaXZhdGUgJGlnbm9yZVJlZ2V4OwoKCgoKcHJpdmF0ZSAkaWdub3JlVXBwZXJCb3VuZFJlZ2V4OwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXFMaXN0KQp7CiRpZ25vcmVBbGwgPSAkaWdub3JlVXBwZXJCb3VuZCA9IFtdOwpmb3JlYWNoICgkcmVxTGlzdCBhcyAkcmVxKSB7CmlmIChzdWJzdHIoJHJlcSwgLTEpID09PSAnKycpIHsKJGlnbm9yZVVwcGVyQm91bmRbXSA9IHN1YnN0cigkcmVxLCAwLCAtMSk7Cn0gZWxzZSB7CiRpZ25vcmVBbGxbXSA9ICRyZXE7Cn0KfQokdGhpcy0+aWdub3JlUmVnZXggPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoJGlnbm9yZUFsbCk7CiR0aGlzLT5pZ25vcmVVcHBlckJvdW5kUmVnZXggPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoJGlnbm9yZVVwcGVyQm91bmQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbAp7CmlmICghUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVxKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiBQcmVnOjppc01hdGNoKCR0aGlzLT5pZ25vcmVSZWdleCwgJHJlcSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1VwcGVyQm91bmRJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbAp7CmlmICghUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVxKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiAkdGhpcy0+aXNJZ25vcmVkKCRyZXEpIHx8IFByZWc6OmlzTWF0Y2goJHRoaXMtPmlnbm9yZVVwcGVyQm91bmRSZWdleCwgJHJlcSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaWx0ZXJDb25zdHJhaW50KHN0cmluZyAkcmVxLCBDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50LCBib29sICRhbGxvd1VwcGVyQm91bmRPdmVycmlkZSA9IHRydWUpOiBDb25zdHJhaW50SW50ZXJmYWNlCnsKaWYgKCFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXEpKSB7CnJldHVybiAkY29uc3RyYWludDsKfQoKaWYgKCEkYWxsb3dVcHBlckJvdW5kT3ZlcnJpZGUgfHwgIVByZWc6OmlzTWF0Y2goJHRoaXMtPmlnbm9yZVVwcGVyQm91bmRSZWdleCwgJHJlcSkpIHsKcmV0dXJuICRjb25zdHJhaW50Owp9CgppZiAoUHJlZzo6aXNNYXRjaCgkdGhpcy0+aWdub3JlUmVnZXgsICRyZXEpKSB7CnJldHVybiBuZXcgTWF0Y2hBbGxDb25zdHJhaW50Owp9CgokaW50ZXJ2YWxzID0gSW50ZXJ2YWxzOjpnZXQoJGNvbnN0cmFpbnQpOwokbGFzdCA9IGVuZCgkaW50ZXJ2YWxzWydudW1lcmljJ10pOwppZiAoJGxhc3QgIT09IGZhbHNlICYmIChzdHJpbmcpICRsYXN0LT5nZXRFbmQoKSAhPT0gKHN0cmluZykgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKSB7CiRjb25zdHJhaW50ID0gbmV3IE11bHRpQ29uc3RyYWludChbJGNvbnN0cmFpbnQsIG5ldyBDb25zdHJhaW50KCc+PScsICRsYXN0LT5nZXRFbmQoKS0+Z2V0VmVyc2lvbigpKV0sIGZhbHNlKTsKfQoKcmV0dXJuICRjb25zdHJhaW50Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKZmluYWwgY2xhc3MgSWdub3JlTm90aGluZ1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW1wbGVtZW50cyBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGlzSWdub3JlZChzdHJpbmcgJHJlcSk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1VwcGVyQm91bmRJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbAp7CnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKCmZpbmFsIGNsYXNzIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5CnsKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tQm9vbE9yTGlzdCgkYm9vbE9yTGlzdCk6IFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UKewppZiAoaXNfYm9vbCgkYm9vbE9yTGlzdCkpIHsKcmV0dXJuICRib29sT3JMaXN0ID8gc2VsZjo6aWdub3JlQWxsKCkgOiBzZWxmOjppZ25vcmVOb3RoaW5nKCk7Cn0KCmlmIChpc19hcnJheSgkYm9vbE9yTGlzdCkpIHsKcmV0dXJuIG5ldyBJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkYm9vbE9yTGlzdCk7Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKApzcHJpbnRmKAonUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjogVW5rbm93biAkYm9vbE9yTGlzdCBwYXJhbWV0ZXIgJXMuIFBsZWFzZSByZXBvcnQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy9uZXcuJywKZ2V0dHlwZSgkYm9vbE9yTGlzdCkKKQopOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlnbm9yZUFsbCgpOiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlCnsKcmV0dXJuIG5ldyBJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaWdub3JlTm90aGluZygpOiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlCnsKcmV0dXJuIG5ldyBJZ25vcmVOb3RoaW5nUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKaW50ZXJmYWNlIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gaXNJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbDsKCnB1YmxpYyBmdW5jdGlvbiBpc1VwcGVyQm91bmRJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbDsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSU87Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwp1c2UgUHNyXExvZ1xMb2dMZXZlbDsKCmFic3RyYWN0IGNsYXNzIEJhc2VJTyBpbXBsZW1lbnRzIElPSW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkYXV0aGVudGljYXRpb25zID0gW107CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0aGVudGljYXRpb25zKCkKewpyZXR1cm4gJHRoaXMtPmF1dGhlbnRpY2F0aW9uczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc2V0QXV0aGVudGljYXRpb25zKCkKewokdGhpcy0+YXV0aGVudGljYXRpb25zID0gW107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNBdXRoZW50aWNhdGlvbigkcmVwb3NpdG9yeU5hbWUpCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5hdXRoZW50aWNhdGlvbnNbJHJlcG9zaXRvcnlOYW1lXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRoZW50aWNhdGlvbigkcmVwb3NpdG9yeU5hbWUpCnsKaWYgKGlzc2V0KCR0aGlzLT5hdXRoZW50aWNhdGlvbnNbJHJlcG9zaXRvcnlOYW1lXSkpIHsKcmV0dXJuICR0aGlzLT5hdXRoZW50aWNhdGlvbnNbJHJlcG9zaXRvcnlOYW1lXTsKfQoKcmV0dXJuIFsndXNlcm5hbWUnID0+IG51bGwsICdwYXNzd29yZCcgPT4gbnVsbF07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRoZW50aWNhdGlvbigkcmVwb3NpdG9yeU5hbWUsICR1c2VybmFtZSwgJHBhc3N3b3JkID0gbnVsbCkKewokdGhpcy0+YXV0aGVudGljYXRpb25zWyRyZXBvc2l0b3J5TmFtZV0gPSBbJ3VzZXJuYW1lJyA9PiAkdXNlcm5hbWUsICdwYXNzd29yZCcgPT4gJHBhc3N3b3JkXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlUmF3KCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKQp7CiR0aGlzLT53cml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCAkdmVyYm9zaXR5KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlRXJyb3JSYXcoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJHRoaXMtPndyaXRlRXJyb3IoJG1lc3NhZ2VzLCAkbmV3bGluZSwgJHZlcmJvc2l0eSk7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja0FuZFNldEF1dGhlbnRpY2F0aW9uKHN0cmluZyAkcmVwb3NpdG9yeU5hbWUsIHN0cmluZyAkdXNlcm5hbWUsID9zdHJpbmcgJHBhc3N3b3JkID0gbnVsbCkKewppZiAoJHRoaXMtPmhhc0F1dGhlbnRpY2F0aW9uKCRyZXBvc2l0b3J5TmFtZSkpIHsKJGF1dGggPSAkdGhpcy0+Z2V0QXV0aGVudGljYXRpb24oJHJlcG9zaXRvcnlOYW1lKTsKaWYgKCRhdXRoWyd1c2VybmFtZSddID09PSAkdXNlcm5hbWUgJiYgJGF1dGhbJ3Bhc3N3b3JkJ10gPT09ICRwYXNzd29yZCkgewpyZXR1cm47Cn0KCiR0aGlzLT53cml0ZUVycm9yKApzcHJpbnRmKAoiPHdhcm5pbmc+V2FybmluZzogWW91IHNob3VsZCBhdm9pZCBvdmVyd3JpdGluZyBhbHJlYWR5IGRlZmluZWQgYXV0aCBzZXR0aW5ncyBmb3IgJXMuPC93YXJuaW5nPiIsCiRyZXBvc2l0b3J5TmFtZQopCik7Cn0KJHRoaXMtPnNldEF1dGhlbnRpY2F0aW9uKCRyZXBvc2l0b3J5TmFtZSwgJHVzZXJuYW1lLCAkcGFzc3dvcmQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZENvbmZpZ3VyYXRpb24oQ29uZmlnICRjb25maWcpCnsKJGJpdGJ1Y2tldE9hdXRoID0gJGNvbmZpZy0+Z2V0KCdiaXRidWNrZXQtb2F1dGgnKTsKJGdpdGh1Yk9hdXRoID0gJGNvbmZpZy0+Z2V0KCdnaXRodWItb2F1dGgnKTsKJGdpdGxhYk9hdXRoID0gJGNvbmZpZy0+Z2V0KCdnaXRsYWItb2F1dGgnKTsKJGdpdGxhYlRva2VuID0gJGNvbmZpZy0+Z2V0KCdnaXRsYWItdG9rZW4nKTsKJGh0dHBCYXNpYyA9ICRjb25maWctPmdldCgnaHR0cC1iYXNpYycpOwokYmVhcmVyVG9rZW4gPSAkY29uZmlnLT5nZXQoJ2JlYXJlcicpOwoKCgpmb3JlYWNoICgkYml0YnVja2V0T2F1dGggYXMgJGRvbWFpbiA9PiAkY3JlZCkgewokdGhpcy0+Y2hlY2tBbmRTZXRBdXRoZW50aWNhdGlvbigkZG9tYWluLCAkY3JlZFsnY29uc3VtZXIta2V5J10sICRjcmVkWydjb25zdW1lci1zZWNyZXQnXSk7Cn0KCmZvcmVhY2ggKCRnaXRodWJPYXV0aCBhcyAkZG9tYWluID0+ICR0b2tlbikgewppZiAoJGRvbWFpbiAhPT0gJ2dpdGh1Yi5jb20nICYmICFpbl9hcnJheSgkZG9tYWluLCAkY29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJyksIHRydWUpKSB7CiR0aGlzLT5kZWJ1ZygkZG9tYWluLicgaXMgbm90IGluIHRoZSBjb25maWd1cmVkIGdpdGh1Yi1kb21haW5zLCBhZGRpbmcgaXQgaW1wbGljaXRseSBhcyBhdXRoZW50aWNhdGlvbiBpcyBjb25maWd1cmVkIGZvciB0aGlzIGRvbWFpbicpOwokY29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gWydnaXRodWItZG9tYWlucycgPT4gYXJyYXlfbWVyZ2UoJGNvbmZpZy0+Z2V0KCdnaXRodWItZG9tYWlucycpLCBbJGRvbWFpbl0pXV0sICdpbXBsaWNpdC1kdWUtdG8tYXV0aCcpOwp9CgoKCmlmICghUHJlZzo6aXNNYXRjaCgne15bLkEtWmEtejAtOV9dKyR9JywgJHRva2VuKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignWW91ciBnaXRodWIgb2F1dGggdG9rZW4gZm9yICcuJGRvbWFpbi4nIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyczogIicuJHRva2VuLiciJyk7Cn0KJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJHRva2VuLCAneC1vYXV0aC1iYXNpYycpOwp9Cgpmb3JlYWNoICgkZ2l0bGFiT2F1dGggYXMgJGRvbWFpbiA9PiAkdG9rZW4pIHsKaWYgKCRkb21haW4gIT09ICdnaXRsYWIuY29tJyAmJiAhaW5fYXJyYXkoJGRvbWFpbiwgJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKSkgewokdGhpcy0+ZGVidWcoJGRvbWFpbi4nIGlzIG5vdCBpbiB0aGUgY29uZmlndXJlZCBnaXRsYWItZG9tYWlucywgYWRkaW5nIGl0IGltcGxpY2l0bHkgYXMgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCBmb3IgdGhpcyBkb21haW4nKTsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+IFsnZ2l0bGFiLWRvbWFpbnMnID0+IGFycmF5X21lcmdlKCRjb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgWyRkb21haW5dKV1dLCAnaW1wbGljaXQtZHVlLXRvLWF1dGgnKTsKfQoKJHRva2VuID0gaXNfYXJyYXkoJHRva2VuKSA/ICR0b2tlblsidG9rZW4iXSA6ICR0b2tlbjsKJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJHRva2VuLCAnb2F1dGgyJyk7Cn0KCmZvcmVhY2ggKCRnaXRsYWJUb2tlbiBhcyAkZG9tYWluID0+ICR0b2tlbikgewppZiAoJGRvbWFpbiAhPT0gJ2dpdGxhYi5jb20nICYmICFpbl9hcnJheSgkZG9tYWluLCAkY29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksIHRydWUpKSB7CiR0aGlzLT5kZWJ1ZygkZG9tYWluLicgaXMgbm90IGluIHRoZSBjb25maWd1cmVkIGdpdGxhYi1kb21haW5zLCBhZGRpbmcgaXQgaW1wbGljaXRseSBhcyBhdXRoZW50aWNhdGlvbiBpcyBjb25maWd1cmVkIGZvciB0aGlzIGRvbWFpbicpOwokY29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gWydnaXRsYWItZG9tYWlucycgPT4gYXJyYXlfbWVyZ2UoJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCBbJGRvbWFpbl0pXV0sICdpbXBsaWNpdC1kdWUtdG8tYXV0aCcpOwp9CgokdXNlcm5hbWUgPSBpc19hcnJheSgkdG9rZW4pID8gJHRva2VuWyJ1c2VybmFtZSJdIDogJHRva2VuOwokcGFzc3dvcmQgPSBpc19hcnJheSgkdG9rZW4pID8gJHRva2VuWyJ0b2tlbiJdIDogJ3ByaXZhdGUtdG9rZW4nOwokdGhpcy0+Y2hlY2tBbmRTZXRBdXRoZW50aWNhdGlvbigkZG9tYWluLCAkdXNlcm5hbWUsICRwYXNzd29yZCk7Cn0KCgpmb3JlYWNoICgkaHR0cEJhc2ljIGFzICRkb21haW4gPT4gJGNyZWQpIHsKJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJGNyZWRbJ3VzZXJuYW1lJ10sICRjcmVkWydwYXNzd29yZCddKTsKfQoKZm9yZWFjaCAoJGJlYXJlclRva2VuIGFzICRkb21haW4gPT4gJHRva2VuKSB7CiR0aGlzLT5jaGVja0FuZFNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sICR0b2tlbiwgJ2JlYXJlcicpOwp9CgoKUHJvY2Vzc0V4ZWN1dG9yOjpzZXRUaW1lb3V0KCRjb25maWctPmdldCgncHJvY2Vzcy10aW1lb3V0JykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZW1lcmdlbmN5KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkVNRVJHRU5DWSwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFsZXJ0KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkFMRVJULCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JpdGljYWwoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gW10pOiB2b2lkCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6Q1JJVElDQUwsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlcnJvcigkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokdGhpcy0+bG9nKExvZ0xldmVsOjpFUlJPUiwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdhcm5pbmcoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gW10pOiB2b2lkCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6V0FSTklORywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdGljZSgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokdGhpcy0+bG9nKExvZ0xldmVsOjpOT1RJQ0UsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbmZvKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OklORk8sICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWJ1ZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokdGhpcy0+bG9nKExvZ0xldmVsOjpERUJVRywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2coJGxldmVsLCAkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokbWVzc2FnZSA9IChzdHJpbmcpICRtZXNzYWdlOwoKaWYgKCRjb250ZXh0ICE9PSBbXSkgewokanNvbiA9IFNpbGVuY2VyOjpjYWxsKCdqc29uX2VuY29kZScsICRjb250ZXh0LCBKU09OX0lOVkFMSURfVVRGOF9JR05PUkV8SlNPTl9VTkVTQ0FQRURfU0xBU0hFU3xKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKaWYgKCRqc29uICE9PSBmYWxzZSkgewokbWVzc2FnZSAuPSAnICcgLiAkanNvbjsKfQp9CgppZiAoaW5fYXJyYXkoJGxldmVsLCBbTG9nTGV2ZWw6OkVNRVJHRU5DWSwgTG9nTGV2ZWw6OkFMRVJULCBMb2dMZXZlbDo6Q1JJVElDQUwsIExvZ0xldmVsOjpFUlJPUl0pKSB7CiR0aGlzLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kbWVzc2FnZS4nPC9lcnJvcj4nKTsKfSBlbHNlaWYgKCRsZXZlbCA9PT0gTG9nTGV2ZWw6OldBUk5JTkcpIHsKJHRoaXMtPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJG1lc3NhZ2UuJzwvd2FybmluZz4nKTsKfSBlbHNlaWYgKCRsZXZlbCA9PT0gTG9nTGV2ZWw6Ok5PVElDRSkgewokdGhpcy0+d3JpdGVFcnJvcignPGluZm8+Jy4kbWVzc2FnZS4nPC9pbmZvPicsIHRydWUsIHNlbGY6OlZFUkJPU0UpOwp9IGVsc2VpZiAoJGxldmVsID09PSBMb2dMZXZlbDo6SU5GTykgewokdGhpcy0+d3JpdGVFcnJvcignPGluZm8+Jy4kbWVzc2FnZS4nPC9pbmZvPicsIHRydWUsIHNlbGY6OlZFUllfVkVSQk9TRSk7Cn0gZWxzZSB7CiR0aGlzLT53cml0ZUVycm9yKCRtZXNzYWdlLCB0cnVlLCBzZWxmOjpERUJVRyk7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJTzsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxRdWVzdGlvbkhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxTdHJlYW1PdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XFN0cmVhbWFibGVJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcU3RyaW5nSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXJTZXQ7CgoKCgpjbGFzcyBCdWZmZXJJTyBleHRlbmRzIENvbnNvbGVJTwp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGlucHV0ID0gJycsIGludCAkdmVyYm9zaXR5ID0gU3RyZWFtT3V0cHV0OjpWRVJCT1NJVFlfTk9STUFMLCA/T3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIgPSBudWxsKQp7CiRpbnB1dCA9IG5ldyBTdHJpbmdJbnB1dCgkaW5wdXQpOwokaW5wdXQtPnNldEludGVyYWN0aXZlKGZhbHNlKTsKCiRzdHJlYW0gPSBmb3BlbigncGhwOi8vbWVtb3J5JywgJ3J3Jyk7CmlmICgkc3RyZWFtID09PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VuYWJsZSB0byBvcGVuIG1lbW9yeSBvdXRwdXQgc3RyZWFtJyk7Cn0KJG91dHB1dCA9IG5ldyBTdHJlYW1PdXRwdXQoJHN0cmVhbSwgJHZlcmJvc2l0eSwgJGZvcm1hdHRlciAhPT0gbnVsbCA/ICRmb3JtYXR0ZXItPmlzRGVjb3JhdGVkKCkgOiBmYWxzZSwgJGZvcm1hdHRlcik7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCwgbmV3IEhlbHBlclNldChbCm5ldyBRdWVzdGlvbkhlbHBlcigpLApdKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXQoKTogc3RyaW5nCnsKYXNzZXJ0KCR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBTdHJlYW1PdXRwdXQpOwpmc2VlaygkdGhpcy0+b3V0cHV0LT5nZXRTdHJlYW0oKSwgMCk7Cgokb3V0cHV0ID0gKHN0cmluZykgc3RyZWFtX2dldF9jb250ZW50cygkdGhpcy0+b3V0cHV0LT5nZXRTdHJlYW0oKSk7Cgokb3V0cHV0ID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCJ7KD88PV58XG58XHgwOCkoLis/KShceDA4Kyl9Iiwgc3RhdGljIGZ1bmN0aW9uICgkbWF0Y2hlcyk6IHN0cmluZyB7CiRwcmUgPSBzdHJpcF90YWdzKCRtYXRjaGVzWzFdKTsKCmlmIChzdHJsZW4oJHByZSkgPT09IHN0cmxlbigkbWF0Y2hlc1syXSkpIHsKcmV0dXJuICcnOwp9CgoKcmV0dXJuIHJ0cmltKCRtYXRjaGVzWzFdKS4iXG4iOwp9LCAkb3V0cHV0KTsKCnJldHVybiAkb3V0cHV0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVc2VySW5wdXRzKGFycmF5ICRpbnB1dHMpOiB2b2lkCnsKaWYgKCEkdGhpcy0+aW5wdXQgaW5zdGFuY2VvZiBTdHJlYW1hYmxlSW5wdXRJbnRlcmZhY2UpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdTZXR0aW5nIHRoZSB1c2VyIGlucHV0cyByZXF1aXJlcyBhdCBsZWFzdCB0aGUgdmVyc2lvbiAzLjIgb2YgdGhlIHN5bWZvbnkvY29uc29sZSBjb21wb25lbnQuJyk7Cn0KCiR0aGlzLT5pbnB1dC0+c2V0U3RyZWFtKCR0aGlzLT5jcmVhdGVTdHJlYW0oJGlucHV0cykpOwokdGhpcy0+aW5wdXQtPnNldEludGVyYWN0aXZlKHRydWUpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlU3RyZWFtKGFycmF5ICRpbnB1dHMpCnsKJHN0cmVhbSA9IGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAncisnKTsKaWYgKCRzdHJlYW0gPT09IGZhbHNlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIG9wZW4gbWVtb3J5IG91dHB1dCBzdHJlYW0nKTsKfQoKZm9yZWFjaCAoJGlucHV0cyBhcyAkaW5wdXQpIHsKZndyaXRlKCRzdHJlYW0sICRpbnB1dC5QSFBfRU9MKTsKfQoKcmV3aW5kKCRzdHJlYW0pOwoKcmV0dXJuICRzdHJlYW07Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSU87Cgp1c2UgQ29tcG9zZXJcUXVlc3Rpb25cU3RyaWN0Q29uZmlybWF0aW9uUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXJTZXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxQcm9ncmVzc0JhcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXENob2ljZVF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxRdWVzdGlvbjsKCgoKCgoKCmNsYXNzIENvbnNvbGVJTyBleHRlbmRzIEJhc2VJTwp7Cgpwcm90ZWN0ZWQgJGlucHV0OwoKcHJvdGVjdGVkICRvdXRwdXQ7Cgpwcm90ZWN0ZWQgJGhlbHBlclNldDsKCnByb3RlY3RlZCAkbGFzdE1lc3NhZ2UgPSAnJzsKCnByb3RlY3RlZCAkbGFzdE1lc3NhZ2VFcnIgPSAnJzsKCgpwcml2YXRlICRzdGFydFRpbWU7Cgpwcml2YXRlICR2ZXJib3NpdHlNYXA7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIEhlbHBlclNldCAkaGVscGVyU2V0KQp7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7CiR0aGlzLT5oZWxwZXJTZXQgPSAkaGVscGVyU2V0OwokdGhpcy0+dmVyYm9zaXR5TWFwID0gWwpzZWxmOjpRVUlFVCA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCwKc2VsZjo6Tk9STUFMID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX05PUk1BTCwKc2VsZjo6VkVSQk9TRSA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJCT1NFLApzZWxmOjpWRVJZX1ZFUkJPU0UgPT4gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFLApzZWxmOjpERUJVRyA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9ERUJVRywKXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVuYWJsZURlYnVnZ2luZyhmbG9hdCAkc3RhcnRUaW1lKQp7CiR0aGlzLT5zdGFydFRpbWUgPSAkc3RhcnRUaW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSgpCnsKcmV0dXJuICR0aGlzLT5pbnB1dC0+aXNJbnRlcmFjdGl2ZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNWZXJib3NlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcnlWZXJib3NlKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNWZXJ5VmVyYm9zZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWJ1ZygpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzRGVidWcoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKQp7CiR0aGlzLT5kb1dyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsIGZhbHNlLCAkdmVyYm9zaXR5KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlRXJyb3IoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJHRoaXMtPmRvV3JpdGUoJG1lc3NhZ2VzLCAkbmV3bGluZSwgdHJ1ZSwgJHZlcmJvc2l0eSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZVJhdygkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCkKewokdGhpcy0+ZG9Xcml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCBmYWxzZSwgJHZlcmJvc2l0eSwgdHJ1ZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZUVycm9yUmF3KCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKQp7CiR0aGlzLT5kb1dyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsIHRydWUsICR2ZXJib3NpdHksIHRydWUpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvV3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lLCBib29sICRzdGRlcnIsIGludCAkdmVyYm9zaXR5LCBib29sICRyYXcgPSBmYWxzZSk6IHZvaWQKewokc2ZWZXJib3NpdHkgPSAkdGhpcy0+dmVyYm9zaXR5TWFwWyR2ZXJib3NpdHldOwppZiAoJHNmVmVyYm9zaXR5ID4gJHRoaXMtPm91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKcmV0dXJuOwp9CgppZiAoJHJhdykgewokc2ZWZXJib3NpdHkgfD0gT3V0cHV0SW50ZXJmYWNlOjpPVVRQVVRfUkFXOwp9CgppZiAobnVsbCAhPT0gJHRoaXMtPnN0YXJ0VGltZSkgewokbWVtb3J5VXNhZ2UgPSBtZW1vcnlfZ2V0X3VzYWdlKCkgLyAxMDI0IC8gMTAyNDsKJHRpbWVTcGVudCA9IG1pY3JvdGltZSh0cnVlKSAtICR0aGlzLT5zdGFydFRpbWU7CiRtZXNzYWdlcyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRtZXNzYWdlKSB1c2UgKCRtZW1vcnlVc2FnZSwgJHRpbWVTcGVudCk6IHN0cmluZyB7CnJldHVybiBzcHJpbnRmKCdbJS4xZk1pQi8lLjJmc10gJXMnLCAkbWVtb3J5VXNhZ2UsICR0aW1lU3BlbnQsICRtZXNzYWdlKTsKfSwgKGFycmF5KSAkbWVzc2FnZXMpOwp9CgppZiAodHJ1ZSA9PT0gJHN0ZGVyciAmJiAkdGhpcy0+b3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewokdGhpcy0+b3V0cHV0LT5nZXRFcnJvck91dHB1dCgpLT53cml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCAkc2ZWZXJib3NpdHkpOwokdGhpcy0+bGFzdE1lc3NhZ2VFcnIgPSBpbXBsb2RlKCRuZXdsaW5lID8gIlxuIiA6ICcnLCAoYXJyYXkpICRtZXNzYWdlcyk7CgpyZXR1cm47Cn0KCiR0aGlzLT5vdXRwdXQtPndyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsICRzZlZlcmJvc2l0eSk7CiR0aGlzLT5sYXN0TWVzc2FnZSA9IGltcGxvZGUoJG5ld2xpbmUgPyAiXG4iIDogJycsIChhcnJheSkgJG1lc3NhZ2VzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG92ZXJ3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCA/aW50ICRzaXplID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJHRoaXMtPmRvT3ZlcndyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsICRzaXplLCBmYWxzZSwgJHZlcmJvc2l0eSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBvdmVyd3JpdGVFcnJvcigkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCA/aW50ICRzaXplID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJHRoaXMtPmRvT3ZlcndyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsICRzaXplLCB0cnVlLCAkdmVyYm9zaXR5KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb092ZXJ3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUsID9pbnQgJHNpemUsIGJvb2wgJHN0ZGVyciwgaW50ICR2ZXJib3NpdHkpOiB2b2lkCnsKCiRtZXNzYWdlcyA9IGltcGxvZGUoJG5ld2xpbmUgPyAiXG4iIDogJycsIChhcnJheSkgJG1lc3NhZ2VzKTsKCgppZiAoIWlzc2V0KCRzaXplKSkgewoKJHNpemUgPSBzdHJsZW4oc3RyaXBfdGFncygkc3RkZXJyID8gJHRoaXMtPmxhc3RNZXNzYWdlRXJyIDogJHRoaXMtPmxhc3RNZXNzYWdlKSk7Cn0KCiR0aGlzLT5kb1dyaXRlKHN0cl9yZXBlYXQoIlx4MDgiLCAkc2l6ZSksIGZhbHNlLCAkc3RkZXJyLCAkdmVyYm9zaXR5KTsKCgokdGhpcy0+ZG9Xcml0ZSgkbWVzc2FnZXMsIGZhbHNlLCAkc3RkZXJyLCAkdmVyYm9zaXR5KTsKCgoKCiRmaWxsID0gJHNpemUgLSBzdHJsZW4oc3RyaXBfdGFncygkbWVzc2FnZXMpKTsKaWYgKCRmaWxsID4gMCkgewoKJHRoaXMtPmRvV3JpdGUoc3RyX3JlcGVhdCgnICcsICRmaWxsKSwgZmFsc2UsICRzdGRlcnIsICR2ZXJib3NpdHkpOwoKJHRoaXMtPmRvV3JpdGUoc3RyX3JlcGVhdCgiXHgwOCIsICRmaWxsKSwgZmFsc2UsICRzdGRlcnIsICR2ZXJib3NpdHkpOwp9CgppZiAoJG5ld2xpbmUpIHsKJHRoaXMtPmRvV3JpdGUoJycsIHRydWUsICRzdGRlcnIsICR2ZXJib3NpdHkpOwp9CgppZiAoJHN0ZGVycikgewokdGhpcy0+bGFzdE1lc3NhZ2VFcnIgPSAkbWVzc2FnZXM7Cn0gZWxzZSB7CiR0aGlzLT5sYXN0TWVzc2FnZSA9ICRtZXNzYWdlczsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NCYXIoaW50ICRtYXggPSAwKQp7CnJldHVybiBuZXcgUHJvZ3Jlc3NCYXIoJHRoaXMtPmdldEVycm9yT3V0cHV0KCksICRtYXgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrKCRxdWVzdGlvbiwgJGRlZmF1bHQgPSBudWxsKQp7CgokaGVscGVyID0gJHRoaXMtPmhlbHBlclNldC0+Z2V0KCdxdWVzdGlvbicpOwokcXVlc3Rpb24gPSBuZXcgUXVlc3Rpb24oJHF1ZXN0aW9uLCAkZGVmYXVsdCk7CgpyZXR1cm4gJGhlbHBlci0+YXNrKCR0aGlzLT5pbnB1dCwgJHRoaXMtPmdldEVycm9yT3V0cHV0KCksICRxdWVzdGlvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tDb25maXJtYXRpb24oJHF1ZXN0aW9uLCAkZGVmYXVsdCA9IHRydWUpCnsKCiRoZWxwZXIgPSAkdGhpcy0+aGVscGVyU2V0LT5nZXQoJ3F1ZXN0aW9uJyk7CiRxdWVzdGlvbiA9IG5ldyBTdHJpY3RDb25maXJtYXRpb25RdWVzdGlvbigkcXVlc3Rpb24sICRkZWZhdWx0KTsKCnJldHVybiAkaGVscGVyLT5hc2soJHRoaXMtPmlucHV0LCAkdGhpcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJHF1ZXN0aW9uKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0FuZFZhbGlkYXRlKCRxdWVzdGlvbiwgJHZhbGlkYXRvciwgJGF0dGVtcHRzID0gbnVsbCwgJGRlZmF1bHQgPSBudWxsKQp7CgokaGVscGVyID0gJHRoaXMtPmhlbHBlclNldC0+Z2V0KCdxdWVzdGlvbicpOwokcXVlc3Rpb24gPSBuZXcgUXVlc3Rpb24oJHF1ZXN0aW9uLCAkZGVmYXVsdCk7CiRxdWVzdGlvbi0+c2V0VmFsaWRhdG9yKCR2YWxpZGF0b3IpOwokcXVlc3Rpb24tPnNldE1heEF0dGVtcHRzKCRhdHRlbXB0cyk7CgpyZXR1cm4gJGhlbHBlci0+YXNrKCR0aGlzLT5pbnB1dCwgJHRoaXMtPmdldEVycm9yT3V0cHV0KCksICRxdWVzdGlvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tBbmRIaWRlQW5zd2VyKCRxdWVzdGlvbikKewoKJGhlbHBlciA9ICR0aGlzLT5oZWxwZXJTZXQtPmdldCgncXVlc3Rpb24nKTsKJHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uKCRxdWVzdGlvbik7CiRxdWVzdGlvbi0+c2V0SGlkZGVuKHRydWUpOwoKcmV0dXJuICRoZWxwZXItPmFzaygkdGhpcy0+aW5wdXQsICR0aGlzLT5nZXRFcnJvck91dHB1dCgpLCAkcXVlc3Rpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VsZWN0KCRxdWVzdGlvbiwgJGNob2ljZXMsICRkZWZhdWx0LCAkYXR0ZW1wdHMgPSBmYWxzZSwgJGVycm9yTWVzc2FnZSA9ICdWYWx1ZSAiJXMiIGlzIGludmFsaWQnLCAkbXVsdGlzZWxlY3QgPSBmYWxzZSkKewoKJGhlbHBlciA9ICR0aGlzLT5oZWxwZXJTZXQtPmdldCgncXVlc3Rpb24nKTsKJHF1ZXN0aW9uID0gbmV3IENob2ljZVF1ZXN0aW9uKCRxdWVzdGlvbiwgJGNob2ljZXMsICRkZWZhdWx0KTsKJHF1ZXN0aW9uLT5zZXRNYXhBdHRlbXB0cygkYXR0ZW1wdHMgPzogbnVsbCk7IAokcXVlc3Rpb24tPnNldEVycm9yTWVzc2FnZSgkZXJyb3JNZXNzYWdlKTsKJHF1ZXN0aW9uLT5zZXRNdWx0aXNlbGVjdCgkbXVsdGlzZWxlY3QpOwoKJHJlc3VsdCA9ICRoZWxwZXItPmFzaygkdGhpcy0+aW5wdXQsICR0aGlzLT5nZXRFcnJvck91dHB1dCgpLCAkcXVlc3Rpb24pOwoKJGlzQXNzb2MgPSAoYm9vbCkgXGNvdW50KGFycmF5X2ZpbHRlcihhcnJheV9rZXlzKCRjaG9pY2VzKSwgJ2lzX3N0cmluZycpKTsKaWYgKCRpc0Fzc29jKSB7CnJldHVybiAkcmVzdWx0Owp9CgppZiAoIWlzX2FycmF5KCRyZXN1bHQpKSB7CnJldHVybiAoc3RyaW5nKSBhcnJheV9zZWFyY2goJHJlc3VsdCwgJGNob2ljZXMsIHRydWUpOwp9CgokcmVzdWx0cyA9IFtdOwpmb3JlYWNoICgkY2hvaWNlcyBhcyAkaW5kZXggPT4gJGNob2ljZSkgewppZiAoaW5fYXJyYXkoJGNob2ljZSwgJHJlc3VsdCwgdHJ1ZSkpIHsKJHJlc3VsdHNbXSA9IChzdHJpbmcpICRpbmRleDsKfQp9CgpyZXR1cm4gJHJlc3VsdHM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWJsZSgpOiBUYWJsZQp7CnJldHVybiBuZXcgVGFibGUoJHRoaXMtPm91dHB1dCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0RXJyb3JPdXRwdXQoKTogT3V0cHV0SW50ZXJmYWNlCnsKaWYgKCR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9CgpyZXR1cm4gJHRoaXMtPm91dHB1dDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJTzsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBQc3JcTG9nXExvZ2dlckludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIElPSW50ZXJmYWNlIGV4dGVuZHMgTG9nZ2VySW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IFFVSUVUID0gMTsKcHVibGljIGNvbnN0IE5PUk1BTCA9IDI7CnB1YmxpYyBjb25zdCBWRVJCT1NFID0gNDsKcHVibGljIGNvbnN0IFZFUllfVkVSQk9TRSA9IDg7CnB1YmxpYyBjb25zdCBERUJVRyA9IDE2OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcnlWZXJib3NlKCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlYnVnKCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZUVycm9yKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZVJhdygkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVFcnJvclJhdygkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG92ZXJ3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCA/aW50ICRzaXplID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvdmVyd3JpdGVFcnJvcigkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCA/aW50ICRzaXplID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFzayhzdHJpbmcgJHF1ZXN0aW9uLCAkZGVmYXVsdCA9IG51bGwpOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tDb25maXJtYXRpb24oc3RyaW5nICRxdWVzdGlvbiwgYm9vbCAkZGVmYXVsdCA9IHRydWUpOwoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0FuZFZhbGlkYXRlKHN0cmluZyAkcXVlc3Rpb24sIGNhbGxhYmxlICR2YWxpZGF0b3IsID9pbnQgJGF0dGVtcHRzID0gbnVsbCwgJGRlZmF1bHQgPSBudWxsKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrQW5kSGlkZUFuc3dlcihzdHJpbmcgJHF1ZXN0aW9uKTsKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWxlY3Qoc3RyaW5nICRxdWVzdGlvbiwgYXJyYXkgJGNob2ljZXMsICRkZWZhdWx0LCAkYXR0ZW1wdHMgPSBmYWxzZSwgc3RyaW5nICRlcnJvck1lc3NhZ2UgPSAnVmFsdWUgIiVzIiBpcyBpbnZhbGlkJywgYm9vbCAkbXVsdGlzZWxlY3QgPSBmYWxzZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRoZW50aWNhdGlvbnMoKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQXV0aGVudGljYXRpb24oc3RyaW5nICRyZXBvc2l0b3J5TmFtZSk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dGhlbnRpY2F0aW9uKHN0cmluZyAkcmVwb3NpdG9yeU5hbWUpOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dGhlbnRpY2F0aW9uKHN0cmluZyAkcmVwb3NpdG9yeU5hbWUsIHN0cmluZyAkdXNlcm5hbWUsID9zdHJpbmcgJHBhc3N3b3JkID0gbnVsbCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkQ29uZmlndXJhdGlvbihDb25maWcgJGNvbmZpZyk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXElPOwoKCgoKCgpjbGFzcyBOdWxsSU8gZXh0ZW5kcyBCYXNlSU8KewoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSgpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcnlWZXJib3NlKCk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlYnVnKCk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOiB2b2lkCnsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlRXJyb3IoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOiB2b2lkCnsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG92ZXJ3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCA/aW50ICRzaXplID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOiB2b2lkCnsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG92ZXJ3cml0ZUVycm9yKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsID9pbnQgJHNpemUgPSBudWxsLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk6IHZvaWQKewp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrKCRxdWVzdGlvbiwgJGRlZmF1bHQgPSBudWxsKQp7CnJldHVybiAkZGVmYXVsdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0NvbmZpcm1hdGlvbigkcXVlc3Rpb24sICRkZWZhdWx0ID0gdHJ1ZSk6IGJvb2wKewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tBbmRWYWxpZGF0ZSgkcXVlc3Rpb24sICR2YWxpZGF0b3IsICRhdHRlbXB0cyA9IG51bGwsICRkZWZhdWx0ID0gbnVsbCkKewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tBbmRIaWRlQW5zd2VyKCRxdWVzdGlvbik6ID9zdHJpbmcKewpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNlbGVjdCgkcXVlc3Rpb24sICRjaG9pY2VzLCAkZGVmYXVsdCwgJGF0dGVtcHRzID0gZmFsc2UsICRlcnJvck1lc3NhZ2UgPSAnVmFsdWUgIiVzIiBpcyBpbnZhbGlkJywgJG11bHRpc2VsZWN0ID0gZmFsc2UpCnsKcmV0dXJuICRkZWZhdWx0Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXEF1dG9sb2FkXEF1dG9sb2FkR2VuZXJhdG9yOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxHaXRodWJBY3Rpb25FcnJvcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxEZWZhdWx0UG9saWN5Owp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXExvY2FsUmVwb1RyYW5zYWN0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXExvY2tUcmFuc2FjdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVXBkYXRlT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUG9vbE9wdGltaXplcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxQb29sOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFJlcXVlc3Q7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcU29sdmVyOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFNvbHZlclByb2JsZW1zRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFBvbGljeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRG93bmxvYWRNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcjsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsZXJFdmVudHM7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxEdW1wZXJcQXJyYXlEdW1wZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9ja2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeU1hbmFnZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XExvY2tBcnJheVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKCgoKCgoKY2xhc3MgSW5zdGFsbGVyCnsKcHVibGljIGNvbnN0IEVSUk9SX05PTkUgPSAwOyAKcHVibGljIGNvbnN0IEVSUk9SX0dFTkVSSUNfRkFJTFVSRSA9IDE7CnB1YmxpYyBjb25zdCBFUlJPUl9OT19MT0NLX0ZJTEVfRk9SX1BBUlRJQUxfVVBEQVRFID0gMzsKcHVibGljIGNvbnN0IEVSUk9SX0xPQ0tfRklMRV9JTlZBTElEID0gNDsKCnB1YmxpYyBjb25zdCBFUlJPUl9ERVBFTkRFTkNZX1JFU09MVVRJT05fRkFJTEVEID0gMjsKcHVibGljIGNvbnN0IEVSUk9SX0FVRElUX0ZBSUxFRCA9IDU7CgpwdWJsaWMgY29uc3QgRVJST1JfVFJBTlNQT1JUX0VYQ0VQVElPTiA9IDEwMDsKCgoKCnByb3RlY3RlZCAkaW87CgoKCgpwcm90ZWN0ZWQgJGNvbmZpZzsKCgoKCnByb3RlY3RlZCAkcGFja2FnZTsKCgoKCgpwcm90ZWN0ZWQgJGZpeGVkUm9vdFBhY2thZ2U7CgoKCgpwcm90ZWN0ZWQgJGRvd25sb2FkTWFuYWdlcjsKCgoKCnByb3RlY3RlZCAkcmVwb3NpdG9yeU1hbmFnZXI7CgoKCgpwcm90ZWN0ZWQgJGxvY2tlcjsKCgoKCnByb3RlY3RlZCAkaW5zdGFsbGF0aW9uTWFuYWdlcjsKCgoKCnByb3RlY3RlZCAkZXZlbnREaXNwYXRjaGVyOwoKCgoKcHJvdGVjdGVkICRhdXRvbG9hZEdlbmVyYXRvcjsKCgpwcm90ZWN0ZWQgJHByZWZlclNvdXJjZSA9IGZhbHNlOwoKcHJvdGVjdGVkICRwcmVmZXJEaXN0ID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJG9wdGltaXplQXV0b2xvYWRlciA9IGZhbHNlOwoKcHJvdGVjdGVkICRjbGFzc01hcEF1dGhvcml0YXRpdmUgPSBmYWxzZTsKCnByb3RlY3RlZCAkYXBjdUF1dG9sb2FkZXIgPSBmYWxzZTsKCnByb3RlY3RlZCAkYXBjdUF1dG9sb2FkZXJQcmVmaXggPSBudWxsOwoKcHJvdGVjdGVkICRkZXZNb2RlID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGRyeVJ1biA9IGZhbHNlOwoKcHJvdGVjdGVkICRkb3dubG9hZE9ubHkgPSBmYWxzZTsKCnByb3RlY3RlZCAkdmVyYm9zZSA9IGZhbHNlOwoKcHJvdGVjdGVkICR1cGRhdGUgPSBmYWxzZTsKCnByb3RlY3RlZCAkaW5zdGFsbCA9IHRydWU7Cgpwcm90ZWN0ZWQgJGR1bXBBdXRvbG9hZGVyID0gdHJ1ZTsKCnByb3RlY3RlZCAkcnVuU2NyaXB0cyA9IHRydWU7Cgpwcm90ZWN0ZWQgJHByZWZlclN0YWJsZSA9IGZhbHNlOwoKcHJvdGVjdGVkICRwcmVmZXJMb3dlc3QgPSBmYWxzZTsKCnByb3RlY3RlZCAkbWluaW1hbFVwZGF0ZSA9IGZhbHNlOwoKcHJvdGVjdGVkICR3cml0ZUxvY2s7Cgpwcm90ZWN0ZWQgJGV4ZWN1dGVPcGVyYXRpb25zID0gdHJ1ZTsKCnByb3RlY3RlZCAkYXVkaXQgPSB0cnVlOwoKcHJvdGVjdGVkICRlcnJvck9uQXVkaXQgPSBmYWxzZTsKCnByb3RlY3RlZCAkYXVkaXRGb3JtYXQgPSBBdWRpdG9yOjpGT1JNQVRfU1VNTUFSWTsKCnByaXZhdGUgJGlnbm9yZWRUeXBlcyA9IFsncGhwLWV4dCcsICdwaHAtZXh0LXplbmQnXTsKCnByaXZhdGUgJGFsbG93ZWRUeXBlcyA9IG51bGw7CgoKcHJvdGVjdGVkICR1cGRhdGVNaXJyb3JzID0gZmFsc2U7CgoKCgoKcHJvdGVjdGVkICR1cGRhdGVBbGxvd0xpc3QgPSBudWxsOwoKcHJvdGVjdGVkICR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfT05MWV9MSVNURUQ7CgoKCgpwcm90ZWN0ZWQgJHN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI7CgoKCgpwcm90ZWN0ZWQgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CgoKCgpwcm90ZWN0ZWQgJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnk7CgoKcHJvdGVjdGVkICR0ZW1wb3JhcnlDb25zdHJhaW50cyA9IFtdOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgUm9vdFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIERvd25sb2FkTWFuYWdlciAkZG93bmxvYWRNYW5hZ2VyLCBSZXBvc2l0b3J5TWFuYWdlciAkcmVwb3NpdG9yeU1hbmFnZXIsIExvY2tlciAkbG9ja2VyLCBJbnN0YWxsYXRpb25NYW5hZ2VyICRpbnN0YWxsYXRpb25NYW5hZ2VyLCBFdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciwgQXV0b2xvYWRHZW5lcmF0b3IgJGF1dG9sb2FkR2VuZXJhdG9yKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5wYWNrYWdlID0gJHBhY2thZ2U7CiR0aGlzLT5kb3dubG9hZE1hbmFnZXIgPSAkZG93bmxvYWRNYW5hZ2VyOwokdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXIgPSAkcmVwb3NpdG9yeU1hbmFnZXI7CiR0aGlzLT5sb2NrZXIgPSAkbG9ja2VyOwokdGhpcy0+aW5zdGFsbGF0aW9uTWFuYWdlciA9ICRpbnN0YWxsYXRpb25NYW5hZ2VyOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKJHRoaXMtPmF1dG9sb2FkR2VuZXJhdG9yID0gJGF1dG9sb2FkR2VuZXJhdG9yOwokdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlciA9IG5ldyBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKCR0aGlzLT5pbyk7CiR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZU5vdGhpbmcoKTsKCiR0aGlzLT53cml0ZUxvY2sgPSAkY29uZmlnLT5nZXQoJ2xvY2snKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBydW4oKTogaW50CnsKCgoKCmdjX2NvbGxlY3RfY3ljbGVzKCk7CmdjX2Rpc2FibGUoKTsKCmlmICgkdGhpcy0+dXBkYXRlQWxsb3dMaXN0ICE9PSBudWxsICYmICR0aGlzLT51cGRhdGVNaXJyb3JzKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiVGhlIGluc3RhbGxlciBvcHRpb25zIHVwZGF0ZU1pcnJvcnMgYW5kIHVwZGF0ZUFsbG93TGlzdCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiIpOwp9CgokaXNGcmVzaEluc3RhbGwgPSAkdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXItPmdldExvY2FsUmVwb3NpdG9yeSgpLT5pc0ZyZXNoKCk7CgoKaWYgKCEkdGhpcy0+dXBkYXRlICYmICEkdGhpcy0+bG9ja2VyLT5pc0xvY2tlZCgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Tm8gY29tcG9zZXIubG9jayBmaWxlIHByZXNlbnQuIFVwZGF0aW5nIGRlcGVuZGVuY2llcyB0byBsYXRlc3QgaW5zdGVhZCBvZiBpbnN0YWxsaW5nIGZyb20gbG9jayBmaWxlLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvaW5zdGFsbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3dhcm5pbmc+Jyk7CiR0aGlzLT51cGRhdGUgPSB0cnVlOwp9CgppZiAoJHRoaXMtPmRyeVJ1bikgewokdGhpcy0+dmVyYm9zZSA9IHRydWU7CiR0aGlzLT5ydW5TY3JpcHRzID0gZmFsc2U7CiR0aGlzLT5leGVjdXRlT3BlcmF0aW9ucyA9IGZhbHNlOwokdGhpcy0+d3JpdGVMb2NrID0gZmFsc2U7CiR0aGlzLT5kdW1wQXV0b2xvYWRlciA9IGZhbHNlOwokdGhpcy0+bW9ja0xvY2FsUmVwb3NpdG9yaWVzKCR0aGlzLT5yZXBvc2l0b3J5TWFuYWdlcik7Cn0KCmlmICgkdGhpcy0+ZG93bmxvYWRPbmx5KSB7CiR0aGlzLT5kdW1wQXV0b2xvYWRlciA9IGZhbHNlOwp9CgppZiAoJHRoaXMtPnVwZGF0ZSAmJiAhJHRoaXMtPmluc3RhbGwpIHsKJHRoaXMtPmR1bXBBdXRvbG9hZGVyID0gZmFsc2U7Cn0KCmlmICgkdGhpcy0+cnVuU2NyaXB0cykgewpQbGF0Zm9ybTo6cHV0RW52KCdDT01QT1NFUl9ERVZfTU9ERScsICR0aGlzLT5kZXZNb2RlID8gJzEnIDogJzAnKTsKCgoKJGV2ZW50TmFtZSA9ICR0aGlzLT51cGRhdGUgPyBTY3JpcHRFdmVudHM6OlBSRV9VUERBVEVfQ01EIDogU2NyaXB0RXZlbnRzOjpQUkVfSU5TVEFMTF9DTUQ7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoU2NyaXB0KCRldmVudE5hbWUsICR0aGlzLT5kZXZNb2RlKTsKfQoKJHRoaXMtPmRvd25sb2FkTWFuYWdlci0+c2V0UHJlZmVyU291cmNlKCR0aGlzLT5wcmVmZXJTb3VyY2UpOwokdGhpcy0+ZG93bmxvYWRNYW5hZ2VyLT5zZXRQcmVmZXJEaXN0KCR0aGlzLT5wcmVmZXJEaXN0KTsKCiRsb2NhbFJlcG8gPSAkdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXItPmdldExvY2FsUmVwb3NpdG9yeSgpOwoKdHJ5IHsKaWYgKCR0aGlzLT51cGRhdGUpIHsKJHJlcyA9ICR0aGlzLT5kb1VwZGF0ZSgkbG9jYWxSZXBvLCAkdGhpcy0+aW5zdGFsbCk7Cn0gZWxzZSB7CiRyZXMgPSAkdGhpcy0+ZG9JbnN0YWxsKCRsb2NhbFJlcG8pOwp9CmlmICgkcmVzICE9PSAwKSB7CnJldHVybiAkcmVzOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCR0aGlzLT5leGVjdXRlT3BlcmF0aW9ucyAmJiAkdGhpcy0+aW5zdGFsbCAmJiAkdGhpcy0+Y29uZmlnLT5nZXQoJ25vdGlmeS1vbi1pbnN0YWxsJykpIHsKJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXItPm5vdGlmeUluc3RhbGxzKCR0aGlzLT5pbyk7Cn0KCnRocm93ICRlOwp9CmlmICgkdGhpcy0+ZXhlY3V0ZU9wZXJhdGlvbnMgJiYgJHRoaXMtPmluc3RhbGwgJiYgJHRoaXMtPmNvbmZpZy0+Z2V0KCdub3RpZnktb24taW5zdGFsbCcpKSB7CiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLT5ub3RpZnlJbnN0YWxscygkdGhpcy0+aW8pOwp9CgppZiAoJHRoaXMtPnVwZGF0ZSkgewokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFsKJHRoaXMtPmxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgkdGhpcy0+ZGV2TW9kZSksCiR0aGlzLT5jcmVhdGVQbGF0Zm9ybVJlcG8oZmFsc2UpLApuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KGNsb25lICR0aGlzLT5wYWNrYWdlKSwKXSk7CmlmICgkaXNGcmVzaEluc3RhbGwpIHsKJHRoaXMtPnN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXItPmFkZFN1Z2dlc3Rpb25zRnJvbVBhY2thZ2UoJHRoaXMtPnBhY2thZ2UpOwp9CiR0aGlzLT5zdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyLT5vdXRwdXRNaW5pbWFsaXN0aWMoJGluc3RhbGxlZFJlcG8pOwp9CgoKJGxvY2tlZFJlcG9zaXRvcnkgPSAkdGhpcy0+bG9ja2VyLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpOwpmb3JlYWNoICgkbG9ja2VkUmVwb3NpdG9yeS0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlIHx8ICEkcGFja2FnZS0+aXNBYmFuZG9uZWQoKSkgewpjb250aW51ZTsKfQoKJHJlcGxhY2VtZW50ID0gaXNfc3RyaW5nKCRwYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKSkKPyAnVXNlICcgLiAkcGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkgLiAnIGluc3RlYWQnCjogJ05vIHJlcGxhY2VtZW50IHdhcyBzdWdnZXN0ZWQnOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKApzcHJpbnRmKAoiPHdhcm5pbmc+UGFja2FnZSAlcyBpcyBhYmFuZG9uZWQsIHlvdSBzaG91bGQgYXZvaWQgdXNpbmcgaXQuICVzLjwvd2FybmluZz4iLAokcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLAokcmVwbGFjZW1lbnQKKQopOwp9CgppZiAoJHRoaXMtPmR1bXBBdXRvbG9hZGVyKSB7CgppZiAoJHRoaXMtPm9wdGltaXplQXV0b2xvYWRlcikgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPkdlbmVyYXRpbmcgb3B0aW1pemVkIGF1dG9sb2FkIGZpbGVzPC9pbmZvPicpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPkdlbmVyYXRpbmcgYXV0b2xvYWQgZmlsZXM8L2luZm8+Jyk7Cn0KCiR0aGlzLT5hdXRvbG9hZEdlbmVyYXRvci0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUpOwokdGhpcy0+YXV0b2xvYWRHZW5lcmF0b3ItPnNldEFwY3UoJHRoaXMtPmFwY3VBdXRvbG9hZGVyLCAkdGhpcy0+YXBjdUF1dG9sb2FkZXJQcmVmaXgpOwokdGhpcy0+YXV0b2xvYWRHZW5lcmF0b3ItPnNldFJ1blNjcmlwdHMoJHRoaXMtPnJ1blNjcmlwdHMpOwokdGhpcy0+YXV0b2xvYWRHZW5lcmF0b3ItPnNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwokdGhpcwotPmF1dG9sb2FkR2VuZXJhdG9yCi0+ZHVtcCgKJHRoaXMtPmNvbmZpZywKJGxvY2FsUmVwbywKJHRoaXMtPnBhY2thZ2UsCiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLAonY29tcG9zZXInLAokdGhpcy0+b3B0aW1pemVBdXRvbG9hZGVyLApudWxsLAokdGhpcy0+bG9ja2VyCik7Cn0KCmlmICgkdGhpcy0+aW5zdGFsbCAmJiAkdGhpcy0+ZXhlY3V0ZU9wZXJhdGlvbnMpIHsKCmZvcmVhY2ggKCRsb2NhbFJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXItPmVuc3VyZUJpbmFyaWVzUHJlc2VuY2UoJHBhY2thZ2UpOwp9Cn0KCiRmdW5kRW52ID0gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfRlVORCcpOwokc2hvd0Z1bmRpbmcgPSB0cnVlOwppZiAoaXNfbnVtZXJpYygkZnVuZEVudikpIHsKJHNob3dGdW5kaW5nID0gaW50dmFsKCRmdW5kRW52KSAhPT0gMDsKfQoKaWYgKCRzaG93RnVuZGluZykgewokZnVuZGluZ0NvdW50ID0gMDsKZm9yZWFjaCAoJGxvY2FsUmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgISRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwYWNrYWdlLT5nZXRGdW5kaW5nKCkpIHsKJGZ1bmRpbmdDb3VudCsrOwp9Cn0KaWYgKCRmdW5kaW5nQ291bnQgPiAwKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCnNwcmludGYoCiI8aW5mbz4lZCBwYWNrYWdlJXMgeW91IGFyZSB1c2luZyAlcyBsb29raW5nIGZvciBmdW5kaW5nLjwvaW5mbz4iLAokZnVuZGluZ0NvdW50LAoxID09PSAkZnVuZGluZ0NvdW50ID8gJycgOiAncycsCjEgPT09ICRmdW5kaW5nQ291bnQgPyAnaXMnIDogJ2FyZScKKSwKJzxpbmZvPlVzZSB0aGUgYGNvbXBvc2VyIGZ1bmRgIGNvbW1hbmQgdG8gZmluZCBvdXQgbW9yZSE8L2luZm8+JywKXSk7Cn0KfQoKaWYgKCR0aGlzLT5ydW5TY3JpcHRzKSB7CgokZXZlbnROYW1lID0gJHRoaXMtPnVwZGF0ZSA/IFNjcmlwdEV2ZW50czo6UE9TVF9VUERBVEVfQ01EIDogU2NyaXB0RXZlbnRzOjpQT1NUX0lOU1RBTExfQ01EOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdCgkZXZlbnROYW1lLCAkdGhpcy0+ZGV2TW9kZSk7Cn0KCgppZiAoIWRlZmluZWQoJ0hIVk1fVkVSU0lPTicpKSB7CmdjX2VuYWJsZSgpOwp9CgppZiAoJHRoaXMtPmF1ZGl0KSB7CmlmICgkdGhpcy0+dXBkYXRlICYmICEkdGhpcy0+aW5zdGFsbCkgewokcGFja2FnZXMgPSAkbG9ja2VkUmVwb3NpdG9yeS0+Z2V0Q2Fub25pY2FsUGFja2FnZXMoKTsKJHRhcmdldCA9ICdsb2NrZWQnOwp9IGVsc2UgewokcGFja2FnZXMgPSAkbG9jYWxSZXBvLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpOwokdGFyZ2V0ID0gJ2luc3RhbGxlZCc7Cn0KaWYgKGNvdW50KCRwYWNrYWdlcykgPiAwKSB7CnRyeSB7CiRhdWRpdG9yID0gbmV3IEF1ZGl0b3IoKTsKJHJlcG9TZXQgPSBuZXcgUmVwb3NpdG9yeVNldCgpOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXItPmdldFJlcG9zaXRvcmllcygpIGFzICRyZXBvKSB7CiRyZXBvU2V0LT5hZGRSZXBvc2l0b3J5KCRyZXBvKTsKfQoKJGF1ZGl0Q29uZmlnID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdhdWRpdCcpOwoKcmV0dXJuICRhdWRpdG9yLT5hdWRpdCgkdGhpcy0+aW8sICRyZXBvU2V0LCAkcGFja2FnZXMsICR0aGlzLT5hdWRpdEZvcm1hdCwgdHJ1ZSwgJGF1ZGl0Q29uZmlnWydpZ25vcmUnXSA/PyBbXSwgJGF1ZGl0Q29uZmlnWydhYmFuZG9uZWQnXSA/PyBBdWRpdG9yOjpBQkFORE9ORURfRkFJTCkgPiAwICYmICR0aGlzLT5lcnJvck9uQXVkaXQgPyBzZWxmOjpFUlJPUl9BVURJVF9GQUlMRUQgOiAwOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmlvLT5lcnJvcignRmFpbGVkIHRvIGF1ZGl0ICcuJHRhcmdldC4nIHBhY2thZ2VzLicpOwppZiAoJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSkgewokdGhpcy0+aW8tPmVycm9yKCdbJy5nZXRfY2xhc3MoJGUpLiddICcuJGUtPmdldE1lc3NhZ2UoKSk7Cn0KfQp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ05vICcuJHRhcmdldC4nIHBhY2thZ2VzIC0gc2tpcHBpbmcgYXVkaXQuJyk7Cn0KfQoKcmV0dXJuIDA7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1VwZGF0ZShJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRsb2NhbFJlcG8sIGJvb2wgJGRvSW5zdGFsbCk6IGludAp7CiRwbGF0Zm9ybVJlcG8gPSAkdGhpcy0+Y3JlYXRlUGxhdGZvcm1SZXBvKHRydWUpOwokYWxpYXNlcyA9ICR0aGlzLT5nZXRSb290QWxpYXNlcyh0cnVlKTsKCiRsb2NrZWRSZXBvc2l0b3J5ID0gbnVsbDsKCnRyeSB7CmlmICgkdGhpcy0+bG9ja2VyLT5pc0xvY2tlZCgpKSB7CiRsb2NrZWRSZXBvc2l0b3J5ID0gJHRoaXMtPmxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSh0cnVlKTsKfQp9IGNhdGNoIChcU2VsZFxKc29uTGludFxQYXJzaW5nRXhjZXB0aW9uICRlKSB7CmlmICgkdGhpcy0+dXBkYXRlQWxsb3dMaXN0ICE9PSBudWxsIHx8ICR0aGlzLT51cGRhdGVNaXJyb3JzKSB7Cgp0aHJvdyAkZTsKfQoKCn0KCmlmICgoJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCAhPT0gbnVsbCB8fCAkdGhpcy0+dXBkYXRlTWlycm9ycykgJiYgISRsb2NrZWRSZXBvc2l0b3J5KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkNhbm5vdCB1cGRhdGUgJyAuICgkdGhpcy0+dXBkYXRlTWlycm9ycyA/ICdsb2NrIGZpbGUgaW5mb3JtYXRpb24nIDogJ29ubHkgYSBwYXJ0aWFsIHNldCBvZiBwYWNrYWdlcycpIC4gJyB3aXRob3V0IGEgbG9jayBmaWxlIHByZXNlbnQuIFJ1biBgY29tcG9zZXIgdXBkYXRlYCB0byBnZW5lcmF0ZSBhIGxvY2sgZmlsZS48L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CgpyZXR1cm4gc2VsZjo6RVJST1JfTk9fTE9DS19GSUxFX0ZPUl9QQVJUSUFMX1VQREFURTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5Mb2FkaW5nIGNvbXBvc2VyIHJlcG9zaXRvcmllcyB3aXRoIHBhY2thZ2UgaW5mb3JtYXRpb248L2luZm8+Jyk7CgoKJHBvbGljeSA9ICR0aGlzLT5jcmVhdGVQb2xpY3kodHJ1ZSwgJGxvY2tlZFJlcG9zaXRvcnkpOwokcmVwb3NpdG9yeVNldCA9ICR0aGlzLT5jcmVhdGVSZXBvc2l0b3J5U2V0KHRydWUsICRwbGF0Zm9ybVJlcG8sICRhbGlhc2VzKTsKJHJlcG9zaXRvcmllcyA9ICR0aGlzLT5yZXBvc2l0b3J5TWFuYWdlci0+Z2V0UmVwb3NpdG9yaWVzKCk7CmZvcmVhY2ggKCRyZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkoJHJlcG9zaXRvcnkpOwp9CmlmICgkbG9ja2VkUmVwb3NpdG9yeSkgewokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeSgkbG9ja2VkUmVwb3NpdG9yeSk7Cn0KCiRyZXF1ZXN0ID0gJHRoaXMtPmNyZWF0ZVJlcXVlc3QoJHRoaXMtPmZpeGVkUm9vdFBhY2thZ2UsICRwbGF0Zm9ybVJlcG8sICRsb2NrZWRSZXBvc2l0b3J5KTsKJHRoaXMtPnJlcXVpcmVQYWNrYWdlc0ZvclVwZGF0ZSgkcmVxdWVzdCwgJGxvY2tlZFJlcG9zaXRvcnksIHRydWUpOwoKCmlmICgkdGhpcy0+dXBkYXRlQWxsb3dMaXN0ICE9PSBudWxsKSB7CiRyZXF1ZXN0LT5zZXRVcGRhdGVBbGxvd0xpc3QoJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCwgJHRoaXMtPnVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyk7Cn0KCiRwb29sID0gJHJlcG9zaXRvcnlTZXQtPmNyZWF0ZVBvb2woJHJlcXVlc3QsICR0aGlzLT5pbywgJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciwgJHRoaXMtPmNyZWF0ZVBvb2xPcHRpbWl6ZXIoJHBvbGljeSksICR0aGlzLT5pZ25vcmVkVHlwZXMsICR0aGlzLT5hbGxvd2VkVHlwZXMpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5VcGRhdGluZyBkZXBlbmRlbmNpZXM8L2luZm8+Jyk7CgoKJHNvbHZlciA9IG5ldyBTb2x2ZXIoJHBvbGljeSwgJHBvb2wsICR0aGlzLT5pbyk7CnRyeSB7CiRsb2NrVHJhbnNhY3Rpb24gPSAkc29sdmVyLT5zb2x2ZSgkcmVxdWVzdCwgJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwokcnVsZVNldFNpemUgPSAkc29sdmVyLT5nZXRSdWxlU2V0U2l6ZSgpOwokc29sdmVyID0gbnVsbDsKfSBjYXRjaCAoU29sdmVyUHJvYmxlbXNFeGNlcHRpb24gJGUpIHsKJGVyciA9ICdZb3VyIHJlcXVpcmVtZW50cyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdG8gYW4gaW5zdGFsbGFibGUgc2V0IG9mIHBhY2thZ2VzLic7CiRwcmV0dHlQcm9ibGVtID0gJGUtPmdldFByZXR0eVN0cmluZygkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sLCAkdGhpcy0+aW8tPmlzVmVyYm9zZSgpKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPicuICRlcnIgLic8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkcHJldHR5UHJvYmxlbSk7CmlmICghJHRoaXMtPmRldk1vZGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5SdW5uaW5nIHVwZGF0ZSB3aXRoIC0tbm8tZGV2IGRvZXMgbm90IG1lYW4gcmVxdWlyZS1kZXYgaXMgaWdub3JlZCwgaXQganVzdCBtZWFucyB0aGUgcGFja2FnZXMgd2lsbCBub3QgYmUgaW5zdGFsbGVkLiBJZiBkZXYgcmVxdWlyZW1lbnRzIGFyZSBibG9ja2luZyB0aGUgdXBkYXRlIHlvdSBoYXZlIHRvIHJlc29sdmUgdGhvc2UgcHJvYmxlbXMuPC93YXJuaW5nPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KCiRnaGUgPSBuZXcgR2l0aHViQWN0aW9uRXJyb3IoJHRoaXMtPmlvKTsKJGdoZS0+ZW1pdCgkZXJyLiJcbiIuJHByZXR0eVByb2JsZW0pOwoKcmV0dXJuIG1heChzZWxmOjpFUlJPUl9HRU5FUklDX0ZBSUxVUkUsICRlLT5nZXRDb2RlKCkpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIkFuYWx5emVkICIuY291bnQoJHBvb2wpLiIgcGFja2FnZXMgdG8gcmVzb2x2ZSBkZXBlbmRlbmNpZXMiLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiQW5hbHl6ZWQgIi4kcnVsZVNldFNpemUuIiBydWxlcyB0byByZXNvbHZlIGRlcGVuZGVuY2llcyIsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKCiRwb29sID0gbnVsbDsKCmlmICghJGxvY2tUcmFuc2FjdGlvbi0+Z2V0T3BlcmF0aW9ucygpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignTm90aGluZyB0byBtb2RpZnkgaW4gbG9jayBmaWxlJyk7Cn0KCiRleGl0Q29kZSA9ICR0aGlzLT5leHRyYWN0RGV2UGFja2FnZXMoJGxvY2tUcmFuc2FjdGlvbiwgJHBsYXRmb3JtUmVwbywgJGFsaWFzZXMsICRwb2xpY3ksICRsb2NrZWRSZXBvc2l0b3J5KTsKaWYgKCRleGl0Q29kZSAhPT0gMCkgewpyZXR1cm4gJGV4aXRDb2RlOwp9CgpcQ29tcG9zZXJcU2VtdmVyXENvbXBpbGluZ01hdGNoZXI6OmNsZWFyKCk7CgoKJHBsYXRmb3JtUmVxcyA9ICR0aGlzLT5leHRyYWN0UGxhdGZvcm1SZXF1aXJlbWVudHMoJHRoaXMtPnBhY2thZ2UtPmdldFJlcXVpcmVzKCkpOwokcGxhdGZvcm1EZXZSZXFzID0gJHRoaXMtPmV4dHJhY3RQbGF0Zm9ybVJlcXVpcmVtZW50cygkdGhpcy0+cGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSk7CgokaW5zdGFsbHNVcGRhdGVzID0gJHVuaW5zdGFsbHMgPSBbXTsKaWYgKCRsb2NrVHJhbnNhY3Rpb24tPmdldE9wZXJhdGlvbnMoKSkgewokaW5zdGFsbE5hbWVzID0gJHVwZGF0ZU5hbWVzID0gJHVuaW5zdGFsbE5hbWVzID0gW107CmZvcmVhY2ggKCRsb2NrVHJhbnNhY3Rpb24tPmdldE9wZXJhdGlvbnMoKSBhcyAkb3BlcmF0aW9uKSB7CmlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zdGFsbE9wZXJhdGlvbikgewokaW5zdGFsbHNVcGRhdGVzW10gPSAkb3BlcmF0aW9uOwokaW5zdGFsbE5hbWVzW10gPSAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCktPmdldFByZXR0eU5hbWUoKS4nOicuJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpOwp9IGVsc2VpZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbikgewoKCmlmICgkdGhpcy0+dXBkYXRlTWlycm9ycwomJiAkb3BlcmF0aW9uLT5nZXRJbml0aWFsUGFja2FnZSgpLT5nZXROYW1lKCkgPT09ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpCiYmICRvcGVyYXRpb24tPmdldEluaXRpYWxQYWNrYWdlKCktPmdldFZlcnNpb24oKSA9PT0gJG9wZXJhdGlvbi0+Z2V0VGFyZ2V0UGFja2FnZSgpLT5nZXRWZXJzaW9uKCkKKSB7CmNvbnRpbnVlOwp9CgokaW5zdGFsbHNVcGRhdGVzW10gPSAkb3BlcmF0aW9uOwokdXBkYXRlTmFtZXNbXSA9ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKS0+Z2V0UHJldHR5TmFtZSgpLic6Jy4kb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCktPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCk7Cn0gZWxzZWlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgVW5pbnN0YWxsT3BlcmF0aW9uKSB7CiR1bmluc3RhbGxzW10gPSAkb3BlcmF0aW9uOwokdW5pbnN0YWxsTmFtZXNbXSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKS0+Z2V0UHJldHR5TmFtZSgpOwp9Cn0KCmlmICgkdGhpcy0+Y29uZmlnLT5nZXQoJ2xvY2snKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKIjxpbmZvPkxvY2sgZmlsZSBvcGVyYXRpb25zOiAlZCBpbnN0YWxsJXMsICVkIHVwZGF0ZSVzLCAlZCByZW1vdmFsJXM8L2luZm8+IiwKY291bnQoJGluc3RhbGxOYW1lcyksCjEgPT09IGNvdW50KCRpbnN0YWxsTmFtZXMpID8gJycgOiAncycsCmNvdW50KCR1cGRhdGVOYW1lcyksCjEgPT09IGNvdW50KCR1cGRhdGVOYW1lcykgPyAnJyA6ICdzJywKY291bnQoJHVuaW5zdGFsbHMpLAoxID09PSBjb3VudCgkdW5pbnN0YWxscykgPyAnJyA6ICdzJwopKTsKaWYgKCRpbnN0YWxsTmFtZXMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJJbnN0YWxsczogIi5pbXBsb2RlKCcsICcsICRpbnN0YWxsTmFtZXMpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cn0KaWYgKCR1cGRhdGVOYW1lcykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIlVwZGF0ZXM6ICIuaW1wbG9kZSgnLCAnLCAkdXBkYXRlTmFtZXMpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cn0KaWYgKCR1bmluc3RhbGxzKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiUmVtb3ZhbHM6ICIuaW1wbG9kZSgnLCAnLCAkdW5pbnN0YWxsTmFtZXMpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cn0KfQp9Cgokc29ydEJ5TmFtZSA9IHN0YXRpYyBmdW5jdGlvbiAoJGEsICRiKTogaW50IHsKaWYgKCRhIGluc3RhbmNlb2YgVXBkYXRlT3BlcmF0aW9uKSB7CiRhID0gJGEtPmdldFRhcmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpOwp9IGVsc2UgewokYSA9ICRhLT5nZXRQYWNrYWdlKCktPmdldE5hbWUoKTsKfQppZiAoJGIgaW5zdGFuY2VvZiBVcGRhdGVPcGVyYXRpb24pIHsKJGIgPSAkYi0+Z2V0VGFyZ2V0UGFja2FnZSgpLT5nZXROYW1lKCk7Cn0gZWxzZSB7CiRiID0gJGItPmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpOwp9CgpyZXR1cm4gc3RyY21wKCRhLCAkYik7Cn07CnVzb3J0KCR1bmluc3RhbGxzLCAkc29ydEJ5TmFtZSk7CnVzb3J0KCRpbnN0YWxsc1VwZGF0ZXMsICRzb3J0QnlOYW1lKTsKCmZvcmVhY2ggKGFycmF5X21lcmdlKCR1bmluc3RhbGxzLCAkaW5zdGFsbHNVcGRhdGVzKSBhcyAkb3BlcmF0aW9uKSB7CgppZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc3RhbGxPcGVyYXRpb24pIHsKJHRoaXMtPnN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXItPmFkZFN1Z2dlc3Rpb25zRnJvbVBhY2thZ2UoJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpKTsKfQoKCmlmICgkdGhpcy0+Y29uZmlnLT5nZXQoJ2xvY2snKSAmJiAoZmFsc2UgPT09IHN0cnBvcygkb3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCksICdBbGlhcycpIHx8ICR0aGlzLT5pby0+aXNEZWJ1ZygpKSkgewokc291cmNlUmVwbyA9ICcnOwppZiAoJHRoaXMtPmlvLT5pc1ZlcnlWZXJib3NlKCkgJiYgZmFsc2UgPT09IHN0cnBvcygkb3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCksICdBbGlhcycpKSB7CiRvcGVyYXRpb25Qa2cgPSAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbiA/ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKSA6ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKSk7CmlmICgkb3BlcmF0aW9uUGtnLT5nZXRSZXBvc2l0b3J5KCkgIT09IG51bGwpIHsKJHNvdXJjZVJlcG8gPSAnIGZyb20gJyAuICRvcGVyYXRpb25Qa2ctPmdldFJlcG9zaXRvcnkoKS0+Z2V0UmVwb05hbWUoKTsKfQp9CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAtICcgLiAkb3BlcmF0aW9uLT5zaG93KHRydWUpIC4gJHNvdXJjZVJlcG8pOwp9Cn0KCiR1cGRhdGVkTG9jayA9ICR0aGlzLT5sb2NrZXItPnNldExvY2tEYXRhKAokbG9ja1RyYW5zYWN0aW9uLT5nZXROZXdMb2NrUGFja2FnZXMoZmFsc2UsICR0aGlzLT51cGRhdGVNaXJyb3JzKSwKJGxvY2tUcmFuc2FjdGlvbi0+Z2V0TmV3TG9ja1BhY2thZ2VzKHRydWUsICR0aGlzLT51cGRhdGVNaXJyb3JzKSwKJHBsYXRmb3JtUmVxcywKJHBsYXRmb3JtRGV2UmVxcywKJGxvY2tUcmFuc2FjdGlvbi0+Z2V0QWxpYXNlcygkYWxpYXNlcyksCiR0aGlzLT5wYWNrYWdlLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCksCiR0aGlzLT5wYWNrYWdlLT5nZXRTdGFiaWxpdHlGbGFncygpLAokdGhpcy0+cHJlZmVyU3RhYmxlIHx8ICR0aGlzLT5wYWNrYWdlLT5nZXRQcmVmZXJTdGFibGUoKSwKJHRoaXMtPnByZWZlckxvd2VzdCwKJHRoaXMtPmNvbmZpZy0+Z2V0KCdwbGF0Zm9ybScpID86IFtdLAokdGhpcy0+d3JpdGVMb2NrICYmICR0aGlzLT5leGVjdXRlT3BlcmF0aW9ucwopOwppZiAoJHVwZGF0ZWRMb2NrICYmICR0aGlzLT53cml0ZUxvY2sgJiYgJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGluZm8+V3JpdGluZyBsb2NrIGZpbGU8L2luZm8+Jyk7Cn0KCmlmICgkZG9JbnN0YWxsKSB7CgpyZXR1cm4gJHRoaXMtPmRvSW5zdGFsbCgkbG9jYWxSZXBvLCB0cnVlKTsKfQoKcmV0dXJuIDA7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0RGV2UGFja2FnZXMoTG9ja1RyYW5zYWN0aW9uICRsb2NrVHJhbnNhY3Rpb24sIFBsYXRmb3JtUmVwb3NpdG9yeSAkcGxhdGZvcm1SZXBvLCBhcnJheSAkYWxpYXNlcywgUG9saWN5SW50ZXJmYWNlICRwb2xpY3ksID9Mb2NrQXJyYXlSZXBvc2l0b3J5ICRsb2NrZWRSZXBvc2l0b3J5ID0gbnVsbCk6IGludAp7CmlmICghJHRoaXMtPnBhY2thZ2UtPmdldERldlJlcXVpcmVzKCkpIHsKcmV0dXJuIDA7Cn0KCiRyZXN1bHRSZXBvID0gbmV3IEFycmF5UmVwb3NpdG9yeShbXSk7CiRsb2FkZXIgPSBuZXcgQXJyYXlMb2FkZXIobnVsbCwgdHJ1ZSk7CiRkdW1wZXIgPSBuZXcgQXJyYXlEdW1wZXIoKTsKZm9yZWFjaCAoJGxvY2tUcmFuc2FjdGlvbi0+Z2V0TmV3TG9ja1BhY2thZ2VzKGZhbHNlKSBhcyAkcGtnKSB7CiRyZXN1bHRSZXBvLT5hZGRQYWNrYWdlKCRsb2FkZXItPmxvYWQoJGR1bXBlci0+ZHVtcCgkcGtnKSkpOwp9CgokcmVwb3NpdG9yeVNldCA9ICR0aGlzLT5jcmVhdGVSZXBvc2l0b3J5U2V0KHRydWUsICRwbGF0Zm9ybVJlcG8sICRhbGlhc2VzKTsKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkoJHJlc3VsdFJlcG8pOwoKJHJlcXVlc3QgPSAkdGhpcy0+Y3JlYXRlUmVxdWVzdCgkdGhpcy0+Zml4ZWRSb290UGFja2FnZSwgJHBsYXRmb3JtUmVwbyk7CiR0aGlzLT5yZXF1aXJlUGFja2FnZXNGb3JVcGRhdGUoJHJlcXVlc3QsICRsb2NrZWRSZXBvc2l0b3J5LCBmYWxzZSk7CgokcG9vbCA9ICRyZXBvc2l0b3J5U2V0LT5jcmVhdGVQb29sV2l0aEFsbFBhY2thZ2VzKCk7Cgokc29sdmVyID0gbmV3IFNvbHZlcigkcG9saWN5LCAkcG9vbCwgJHRoaXMtPmlvKTsKdHJ5IHsKJG5vbkRldkxvY2tUcmFuc2FjdGlvbiA9ICRzb2x2ZXItPnNvbHZlKCRyZXF1ZXN0LCAkdGhpcy0+cGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CiRzb2x2ZXIgPSBudWxsOwp9IGNhdGNoIChTb2x2ZXJQcm9ibGVtc0V4Y2VwdGlvbiAkZSkgewokZXJyID0gJ1VuYWJsZSB0byBmaW5kIGEgY29tcGF0aWJsZSBzZXQgb2YgcGFja2FnZXMgYmFzZWQgb24geW91ciBub24tZGV2IHJlcXVpcmVtZW50cyBhbG9uZS4nOwokcHJldHR5UHJvYmxlbSA9ICRlLT5nZXRQcmV0dHlTdHJpbmcoJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCwgJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSwgdHJ1ZSk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLiAkZXJyIC4nPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdXIgcmVxdWlyZW1lbnRzIGNhbiBiZSByZXNvbHZlZCBzdWNjZXNzZnVsbHkgd2hlbiByZXF1aXJlLWRldiBwYWNrYWdlcyBhcmUgcHJlc2VudC4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdZb3UgbWF5IG5lZWQgdG8gbW92ZSBwYWNrYWdlcyBmcm9tIHJlcXVpcmUtZGV2IG9yIHNvbWUgb2YgdGhlaXIgZGVwZW5kZW5jaWVzIHRvIHJlcXVpcmUuJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkcHJldHR5UHJvYmxlbSk7CgokZ2hlID0gbmV3IEdpdGh1YkFjdGlvbkVycm9yKCR0aGlzLT5pbyk7CiRnaGUtPmVtaXQoJGVyci4iXG4iLiRwcmV0dHlQcm9ibGVtKTsKCnJldHVybiAkZS0+Z2V0Q29kZSgpOwp9CgokbG9ja1RyYW5zYWN0aW9uLT5zZXROb25EZXZQYWNrYWdlcygkbm9uRGV2TG9ja1RyYW5zYWN0aW9uKTsKCnJldHVybiAwOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0luc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkbG9jYWxSZXBvLCBib29sICRhbHJlYWR5U29sdmVkID0gZmFsc2UpOiBpbnQKewppZiAoJHRoaXMtPmNvbmZpZy0+Z2V0KCdsb2NrJykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5JbnN0YWxsaW5nIGRlcGVuZGVuY2llcyBmcm9tIGxvY2sgZmlsZScuKCR0aGlzLT5kZXZNb2RlID8gJyAoaW5jbHVkaW5nIHJlcXVpcmUtZGV2KScgOiAnJykuJzwvaW5mbz4nKTsKfQoKJGxvY2tlZFJlcG9zaXRvcnkgPSAkdGhpcy0+bG9ja2VyLT5nZXRMb2NrZWRSZXBvc2l0b3J5KCR0aGlzLT5kZXZNb2RlKTsKCgoKaWYgKCEkYWxyZWFkeVNvbHZlZCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPlZlcmlmeWluZyBsb2NrIGZpbGUgY29udGVudHMgY2FuIGJlIGluc3RhbGxlZCBvbiBjdXJyZW50IHBsYXRmb3JtLjwvaW5mbz4nKTsKCiRwbGF0Zm9ybVJlcG8gPSAkdGhpcy0+Y3JlYXRlUGxhdGZvcm1SZXBvKGZhbHNlKTsKCiRwb2xpY3kgPSAkdGhpcy0+Y3JlYXRlUG9saWN5KGZhbHNlKTsKCiRyZXBvc2l0b3J5U2V0ID0gJHRoaXMtPmNyZWF0ZVJlcG9zaXRvcnlTZXQoZmFsc2UsICRwbGF0Zm9ybVJlcG8sIFtdLCAkbG9ja2VkUmVwb3NpdG9yeSk7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KCRsb2NrZWRSZXBvc2l0b3J5KTsKCgokcmVxdWVzdCA9ICR0aGlzLT5jcmVhdGVSZXF1ZXN0KCR0aGlzLT5maXhlZFJvb3RQYWNrYWdlLCAkcGxhdGZvcm1SZXBvLCAkbG9ja2VkUmVwb3NpdG9yeSk7CgppZiAoISR0aGlzLT5sb2NrZXItPmlzRnJlc2goKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPldhcm5pbmc6IFRoZSBsb2NrIGZpbGUgaXMgbm90IHVwIHRvIGRhdGUgd2l0aCB0aGUgbGF0ZXN0IGNoYW5nZXMgaW4gY29tcG9zZXIuanNvbi4gWW91IG1heSBiZSBnZXR0aW5nIG91dGRhdGVkIGRlcGVuZGVuY2llcy4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgcnVuIGBjb21wb3NlciB1cGRhdGVgIG9yIGBjb21wb3NlciB1cGRhdGUgPHBhY2thZ2UgbmFtZT5gLjwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9CgokbWlzc2luZ1JlcXVpcmVtZW50SW5mbyA9ICR0aGlzLT5sb2NrZXItPmdldE1pc3NpbmdSZXF1aXJlbWVudEluZm8oJHRoaXMtPnBhY2thZ2UsICR0aGlzLT5kZXZNb2RlKTsKaWYgKCRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvICE9PSBbXSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1pc3NpbmdSZXF1aXJlbWVudEluZm8pOwoKaWYgKCEkdGhpcy0+Y29uZmlnLT5nZXQoJ2FsbG93LW1pc3NpbmctcmVxdWlyZW1lbnRzJykpIHsKcmV0dXJuIHNlbGY6OkVSUk9SX0xPQ0tfRklMRV9JTlZBTElEOwp9Cn0KCmZvcmVhY2ggKCRsb2NrZWRSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRyZXF1ZXN0LT5maXhMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKTsKfQoKJHJvb3RSZXF1aXJlcyA9ICR0aGlzLT5wYWNrYWdlLT5nZXRSZXF1aXJlcygpOwppZiAoJHRoaXMtPmRldk1vZGUpIHsKJHJvb3RSZXF1aXJlcyA9IGFycmF5X21lcmdlKCRyb290UmVxdWlyZXMsICR0aGlzLT5wYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKTsKfQpmb3JlYWNoICgkcm9vdFJlcXVpcmVzIGFzICRsaW5rKSB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRsaW5rLT5nZXRUYXJnZXQoKSkpIHsKJHJlcXVlc3QtPnJlcXVpcmVOYW1lKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSk7Cn0KfQoKZm9yZWFjaCAoJHRoaXMtPmxvY2tlci0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudHMoJHRoaXMtPmRldk1vZGUpIGFzICRsaW5rKSB7CmlmICghaXNzZXQoJHJvb3RSZXF1aXJlc1skbGluay0+Z2V0VGFyZ2V0KCldKSkgewokcmVxdWVzdC0+cmVxdWlyZU5hbWUoJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0Q29uc3RyYWludCgpKTsKfQp9CnVuc2V0KCRyb290UmVxdWlyZXMsICRsaW5rKTsKCiRwb29sID0gJHJlcG9zaXRvcnlTZXQtPmNyZWF0ZVBvb2woJHJlcXVlc3QsICR0aGlzLT5pbywgJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciwgbnVsbCwgJHRoaXMtPmlnbm9yZWRUeXBlcywgJHRoaXMtPmFsbG93ZWRUeXBlcyk7CgoKJHNvbHZlciA9IG5ldyBTb2x2ZXIoJHBvbGljeSwgJHBvb2wsICR0aGlzLT5pbyk7CnRyeSB7CiRsb2NrVHJhbnNhY3Rpb24gPSAkc29sdmVyLT5zb2x2ZSgkcmVxdWVzdCwgJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwokc29sdmVyID0gbnVsbDsKCgppZiAoMCAhPT0gY291bnQoJGxvY2tUcmFuc2FjdGlvbi0+Z2V0T3BlcmF0aW9ucygpKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Zb3VyIGxvY2sgZmlsZSBjYW5ub3QgYmUgaW5zdGFsbGVkIG9uIHRoaXMgc3lzdGVtIHdpdGhvdXQgY2hhbmdlcy4gUGxlYXNlIHJ1biBjb21wb3NlciB1cGRhdGUuPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwoKcmV0dXJuIHNlbGY6OkVSUk9SX0xPQ0tfRklMRV9JTlZBTElEOwp9Cn0gY2F0Y2ggKFNvbHZlclByb2JsZW1zRXhjZXB0aW9uICRlKSB7CiRlcnIgPSAnWW91ciBsb2NrIGZpbGUgZG9lcyBub3QgY29udGFpbiBhIGNvbXBhdGlibGUgc2V0IG9mIHBhY2thZ2VzLiBQbGVhc2UgcnVuIGNvbXBvc2VyIHVwZGF0ZS4nOwokcHJldHR5UHJvYmxlbSA9ICRlLT5nZXRQcmV0dHlTdHJpbmcoJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCwgJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLiAkZXJyIC4nPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJHByZXR0eVByb2JsZW0pOwoKJGdoZSA9IG5ldyBHaXRodWJBY3Rpb25FcnJvcigkdGhpcy0+aW8pOwokZ2hlLT5lbWl0KCRlcnIuIlxuIi4kcHJldHR5UHJvYmxlbSk7CgpyZXR1cm4gbWF4KHNlbGY6OkVSUk9SX0dFTkVSSUNfRkFJTFVSRSwgJGUtPmdldENvZGUoKSk7Cn0KfQoKCiRsb2NhbFJlcG9UcmFuc2FjdGlvbiA9IG5ldyBMb2NhbFJlcG9UcmFuc2FjdGlvbigkbG9ja2VkUmVwb3NpdG9yeSwgJGxvY2FsUmVwbyk7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoSW5zdGFsbGVyRXZlbnQoSW5zdGFsbGVyRXZlbnRzOjpQUkVfT1BFUkFUSU9OU19FWEVDLCAkdGhpcy0+ZGV2TW9kZSwgJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zLCAkbG9jYWxSZXBvVHJhbnNhY3Rpb24pOwoKJGluc3RhbGxzID0gJHVwZGF0ZXMgPSAkdW5pbnN0YWxscyA9IFtdOwpmb3JlYWNoICgkbG9jYWxSZXBvVHJhbnNhY3Rpb24tPmdldE9wZXJhdGlvbnMoKSBhcyAkb3BlcmF0aW9uKSB7CmlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zdGFsbE9wZXJhdGlvbikgewokaW5zdGFsbHNbXSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKS0+Z2V0UHJldHR5TmFtZSgpLic6Jy4kb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCktPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCk7Cn0gZWxzZWlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgVXBkYXRlT3BlcmF0aW9uKSB7CiR1cGRhdGVzW10gPSAkb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCktPmdldFByZXR0eU5hbWUoKS4nOicuJG9wZXJhdGlvbi0+Z2V0VGFyZ2V0UGFja2FnZSgpLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpOwp9IGVsc2VpZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVuaW5zdGFsbE9wZXJhdGlvbikgewokdW5pbnN0YWxsc1tdID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpLT5nZXRQcmV0dHlOYW1lKCk7Cn0KfQoKaWYgKCRpbnN0YWxscyA9PT0gW10gJiYgJHVwZGF0ZXMgPT09IFtdICYmICR1bmluc3RhbGxzID09PSBbXSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ05vdGhpbmcgdG8gaW5zdGFsbCwgdXBkYXRlIG9yIHJlbW92ZScpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKIjxpbmZvPlBhY2thZ2Ugb3BlcmF0aW9uczogJWQgaW5zdGFsbCVzLCAlZCB1cGRhdGUlcywgJWQgcmVtb3ZhbCVzPC9pbmZvPiIsCmNvdW50KCRpbnN0YWxscyksCjEgPT09IGNvdW50KCRpbnN0YWxscykgPyAnJyA6ICdzJywKY291bnQoJHVwZGF0ZXMpLAoxID09PSBjb3VudCgkdXBkYXRlcykgPyAnJyA6ICdzJywKY291bnQoJHVuaW5zdGFsbHMpLAoxID09PSBjb3VudCgkdW5pbnN0YWxscykgPyAnJyA6ICdzJwopKTsKaWYgKCRpbnN0YWxscykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIkluc3RhbGxzOiAiLmltcGxvZGUoJywgJywgJGluc3RhbGxzKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwp9CmlmICgkdXBkYXRlcykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIlVwZGF0ZXM6ICIuaW1wbG9kZSgnLCAnLCAkdXBkYXRlcyksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKfQppZiAoJHVuaW5zdGFsbHMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJSZW1vdmFsczogIi5pbXBsb2RlKCcsICcsICR1bmluc3RhbGxzKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwp9Cn0KCmlmICgkdGhpcy0+ZXhlY3V0ZU9wZXJhdGlvbnMpIHsKJGxvY2FsUmVwby0+c2V0RGV2UGFja2FnZU5hbWVzKCR0aGlzLT5sb2NrZXItPmdldERldlBhY2thZ2VOYW1lcygpKTsKJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXItPmV4ZWN1dGUoJGxvY2FsUmVwbywgJGxvY2FsUmVwb1RyYW5zYWN0aW9uLT5nZXRPcGVyYXRpb25zKCksICR0aGlzLT5kZXZNb2RlLCAkdGhpcy0+cnVuU2NyaXB0cywgJHRoaXMtPmRvd25sb2FkT25seSk7CgoKaWYgKGNvdW50KCRsb2NhbFJlcG9UcmFuc2FjdGlvbi0+Z2V0T3BlcmF0aW9ucygpKSA+IDApIHsKJHZlbmRvckRpciA9ICR0aGlzLT5jb25maWctPmdldCgndmVuZG9yLWRpcicpOwppZiAoaXNfZGlyKCR2ZW5kb3JEaXIpKSB7CgoKQHRvdWNoKCR2ZW5kb3JEaXIpOwp9Cn0KfSBlbHNlIHsKZm9yZWFjaCAoJGxvY2FsUmVwb1RyYW5zYWN0aW9uLT5nZXRPcGVyYXRpb25zKCkgYXMgJG9wZXJhdGlvbikgewoKaWYgKGZhbHNlID09PSBzdHJwb3MoJG9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpLCAnQWxpYXMnKSB8fCAkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgLSAnIC4gJG9wZXJhdGlvbi0+c2hvdyhmYWxzZSkpOwp9Cn0KfQoKcmV0dXJuIDA7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVQbGF0Zm9ybVJlcG8oYm9vbCAkZm9yVXBkYXRlKTogUGxhdGZvcm1SZXBvc2l0b3J5CnsKaWYgKCRmb3JVcGRhdGUpIHsKJHBsYXRmb3JtT3ZlcnJpZGVzID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdwbGF0Zm9ybScpID86IFtdOwp9IGVsc2UgewokcGxhdGZvcm1PdmVycmlkZXMgPSAkdGhpcy0+bG9ja2VyLT5nZXRQbGF0Zm9ybU92ZXJyaWRlcygpOwp9CgpyZXR1cm4gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJHBsYXRmb3JtT3ZlcnJpZGVzKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVJlcG9zaXRvcnlTZXQoYm9vbCAkZm9yVXBkYXRlLCBQbGF0Zm9ybVJlcG9zaXRvcnkgJHBsYXRmb3JtUmVwbywgYXJyYXkgJHJvb3RBbGlhc2VzID0gW10sID9SZXBvc2l0b3J5SW50ZXJmYWNlICRsb2NrZWRSZXBvc2l0b3J5ID0gbnVsbCk6IFJlcG9zaXRvcnlTZXQKewppZiAoJGZvclVwZGF0ZSkgewokbWluaW11bVN0YWJpbGl0eSA9ICR0aGlzLT5wYWNrYWdlLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCk7CiRzdGFiaWxpdHlGbGFncyA9ICR0aGlzLT5wYWNrYWdlLT5nZXRTdGFiaWxpdHlGbGFncygpOwoKJHJlcXVpcmVzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPnBhY2thZ2UtPmdldFJlcXVpcmVzKCksICR0aGlzLT5wYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKTsKfSBlbHNlIHsKJG1pbmltdW1TdGFiaWxpdHkgPSAkdGhpcy0+bG9ja2VyLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCk7CiRzdGFiaWxpdHlGbGFncyA9ICR0aGlzLT5sb2NrZXItPmdldFN0YWJpbGl0eUZsYWdzKCk7CgokcmVxdWlyZXMgPSBbXTsKZm9yZWFjaCAoJGxvY2tlZFJlcG9zaXRvcnktPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJGNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpOwokY29uc3RyYWludC0+c2V0UHJldHR5U3RyaW5nKCRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkpOwokcmVxdWlyZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkY29uc3RyYWludDsKfQp9Cgokcm9vdFJlcXVpcmVzID0gW107CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxID0+ICRjb25zdHJhaW50KSB7CmlmICgkY29uc3RyYWludCBpbnN0YW5jZW9mIExpbmspIHsKJGNvbnN0cmFpbnQgPSAkY29uc3RyYWludC0+Z2V0Q29uc3RyYWludCgpOwp9CgppZiAoJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmlzSWdub3JlZCgkcmVxKSkgewpjb250aW51ZTsKfSBlbHNlaWYgKCR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpIHsKJGNvbnN0cmFpbnQgPSAkdGhpcy0+cGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+ZmlsdGVyQ29uc3RyYWludCgkcmVxLCAkY29uc3RyYWludCk7Cn0KJHJvb3RSZXF1aXJlc1skcmVxXSA9ICRjb25zdHJhaW50Owp9CgokdGhpcy0+Zml4ZWRSb290UGFja2FnZSA9IGNsb25lICR0aGlzLT5wYWNrYWdlOwokdGhpcy0+Zml4ZWRSb290UGFja2FnZS0+c2V0UmVxdWlyZXMoW10pOwokdGhpcy0+Zml4ZWRSb290UGFja2FnZS0+c2V0RGV2UmVxdWlyZXMoW10pOwoKJHN0YWJpbGl0eUZsYWdzWyR0aGlzLT5wYWNrYWdlLT5nZXROYW1lKCldID0gQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTW1ZlcnNpb25QYXJzZXI6OnBhcnNlU3RhYmlsaXR5KCR0aGlzLT5wYWNrYWdlLT5nZXRWZXJzaW9uKCkpXTsKCiRyZXBvc2l0b3J5U2V0ID0gbmV3IFJlcG9zaXRvcnlTZXQoJG1pbmltdW1TdGFiaWxpdHksICRzdGFiaWxpdHlGbGFncywgJHJvb3RBbGlhc2VzLCAkdGhpcy0+cGFja2FnZS0+Z2V0UmVmZXJlbmNlcygpLCAkcm9vdFJlcXVpcmVzLCAkdGhpcy0+dGVtcG9yYXJ5Q29uc3RyYWludHMpOwokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeShuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KCR0aGlzLT5maXhlZFJvb3RQYWNrYWdlKSk7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KCRwbGF0Zm9ybVJlcG8pOwppZiAoJHRoaXMtPmFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnkpIHsKCgokYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yaWVzID0gJHRoaXMtPmFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnk7CmlmICgkYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yaWVzIGluc3RhbmNlb2YgQ29tcG9zaXRlUmVwb3NpdG9yeSkgewokYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yaWVzID0gJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcmllcy0+Z2V0UmVwb3NpdG9yaWVzKCk7Cn0gZWxzZSB7CiRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3JpZXMgPSBbJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcmllc107Cn0KZm9yZWFjaCAoJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcmllcyBhcyAkYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSkgewppZiAoJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnkgaW5zdGFuY2VvZiBJbnN0YWxsZWRSZXBvc2l0b3J5IHx8ICRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5IGluc3RhbmNlb2YgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSkgewokcmVwb3NpdG9yeVNldC0+YWxsb3dJbnN0YWxsZWRSZXBvc2l0b3JpZXMoKTsKYnJlYWs7Cn0KfQoKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkoJHRoaXMtPmFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnkpOwp9CgpyZXR1cm4gJHJlcG9zaXRvcnlTZXQ7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlUG9saWN5KGJvb2wgJGZvclVwZGF0ZSwgP0xvY2tBcnJheVJlcG9zaXRvcnkgJGxvY2tlZFJlcG8gPSBudWxsKTogRGVmYXVsdFBvbGljeQp7CiRwcmVmZXJTdGFibGUgPSBudWxsOwokcHJlZmVyTG93ZXN0ID0gbnVsbDsKaWYgKCEkZm9yVXBkYXRlKSB7CiRwcmVmZXJTdGFibGUgPSAkdGhpcy0+bG9ja2VyLT5nZXRQcmVmZXJTdGFibGUoKTsKJHByZWZlckxvd2VzdCA9ICR0aGlzLT5sb2NrZXItPmdldFByZWZlckxvd2VzdCgpOwp9CgoKaWYgKG51bGwgPT09ICRwcmVmZXJTdGFibGUpIHsKJHByZWZlclN0YWJsZSA9ICR0aGlzLT5wcmVmZXJTdGFibGUgfHwgJHRoaXMtPnBhY2thZ2UtPmdldFByZWZlclN0YWJsZSgpOwp9CmlmIChudWxsID09PSAkcHJlZmVyTG93ZXN0KSB7CiRwcmVmZXJMb3dlc3QgPSAkdGhpcy0+cHJlZmVyTG93ZXN0Owp9CgokcHJlZmVycmVkVmVyc2lvbnMgPSBudWxsOwppZiAoJGZvclVwZGF0ZSAmJiAkdGhpcy0+bWluaW1hbFVwZGF0ZSAmJiAkdGhpcy0+dXBkYXRlQWxsb3dMaXN0ICE9PSBudWxsICYmICRsb2NrZWRSZXBvICE9PSBudWxsKSB7CiRwcmVmZXJyZWRWZXJzaW9ucyA9IFtdOwpmb3JlYWNoICgkbG9ja2VkUmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGtnKSB7CmlmICgkcGtnIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlIHx8IGluX2FycmF5KCRwa2ctPmdldE5hbWUoKSwgJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCwgdHJ1ZSkpIHsKY29udGludWU7Cn0KJHByZWZlcnJlZFZlcnNpb25zWyRwa2ctPmdldE5hbWUoKV0gPSAkcGtnLT5nZXRWZXJzaW9uKCk7Cn0KfQoKcmV0dXJuIG5ldyBEZWZhdWx0UG9saWN5KCRwcmVmZXJTdGFibGUsICRwcmVmZXJMb3dlc3QsICRwcmVmZXJyZWRWZXJzaW9ucyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlUmVxdWVzdChSb290UGFja2FnZUludGVyZmFjZSAkcm9vdFBhY2thZ2UsIFBsYXRmb3JtUmVwb3NpdG9yeSAkcGxhdGZvcm1SZXBvLCA/TG9ja0FycmF5UmVwb3NpdG9yeSAkbG9ja2VkUmVwb3NpdG9yeSA9IG51bGwpOiBSZXF1ZXN0CnsKJHJlcXVlc3QgPSBuZXcgUmVxdWVzdCgkbG9ja2VkUmVwb3NpdG9yeSk7CgokcmVxdWVzdC0+Zml4UGFja2FnZSgkcm9vdFBhY2thZ2UpOwppZiAoJHJvb3RQYWNrYWdlIGluc3RhbmNlb2YgUm9vdEFsaWFzUGFja2FnZSkgewokcmVxdWVzdC0+Zml4UGFja2FnZSgkcm9vdFBhY2thZ2UtPmdldEFsaWFzT2YoKSk7Cn0KCiRmaXhlZFBhY2thZ2VzID0gJHBsYXRmb3JtUmVwby0+Z2V0UGFja2FnZXMoKTsKaWYgKCR0aGlzLT5hZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5KSB7CiRmaXhlZFBhY2thZ2VzID0gYXJyYXlfbWVyZ2UoJGZpeGVkUGFja2FnZXMsICR0aGlzLT5hZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpKTsKfQoKCgoKJHByb3ZpZGVkID0gJHJvb3RQYWNrYWdlLT5nZXRQcm92aWRlcygpOwpmb3JlYWNoICgkZml4ZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewoKaWYgKCRwYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCkgIT09ICRwbGF0Zm9ybVJlcG8KfHwgIWlzc2V0KCRwcm92aWRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXSkKfHwgISRwcm92aWRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXS0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpCikgewokcmVxdWVzdC0+Zml4UGFja2FnZSgkcGFja2FnZSk7Cn0KfQoKcmV0dXJuICRyZXF1ZXN0Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJlcXVpcmVQYWNrYWdlc0ZvclVwZGF0ZShSZXF1ZXN0ICRyZXF1ZXN0LCA/TG9ja0FycmF5UmVwb3NpdG9yeSAkbG9ja2VkUmVwb3NpdG9yeSA9IG51bGwsIGJvb2wgJGluY2x1ZGVEZXZSZXF1aXJlcyA9IHRydWUpOiB2b2lkCnsKCmlmICgkdGhpcy0+dXBkYXRlTWlycm9ycykgewokZXhjbHVkZWRQYWNrYWdlcyA9IFtdOwppZiAoISRpbmNsdWRlRGV2UmVxdWlyZXMpIHsKJGV4Y2x1ZGVkUGFja2FnZXMgPSBhcnJheV9mbGlwKCR0aGlzLT5sb2NrZXItPmdldERldlBhY2thZ2VOYW1lcygpKTsKfQoKZm9yZWFjaCAoJGxvY2tlZFJlcG9zaXRvcnktPmdldFBhY2thZ2VzKCkgYXMgJGxvY2tlZFBhY2thZ2UpIHsKCgppZiAoISRsb2NrZWRQYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICFpc3NldCgkZXhjbHVkZWRQYWNrYWdlc1skbG9ja2VkUGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKJHJlcXVlc3QtPnJlcXVpcmVOYW1lKCRsb2NrZWRQYWNrYWdlLT5nZXROYW1lKCksIG5ldyBDb25zdHJhaW50KCc9PScsICRsb2NrZWRQYWNrYWdlLT5nZXRWZXJzaW9uKCkpKTsKfQp9Cn0gZWxzZSB7CiRsaW5rcyA9ICR0aGlzLT5wYWNrYWdlLT5nZXRSZXF1aXJlcygpOwppZiAoJGluY2x1ZGVEZXZSZXF1aXJlcykgewokbGlua3MgPSBhcnJheV9tZXJnZSgkbGlua3MsICR0aGlzLT5wYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKTsKfQpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKJHJlcXVlc3QtPnJlcXVpcmVOYW1lKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSk7Cn0KfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Um9vdEFsaWFzZXMoYm9vbCAkZm9yVXBkYXRlKTogYXJyYXkKewppZiAoJGZvclVwZGF0ZSkgewokYWxpYXNlcyA9ICR0aGlzLT5wYWNrYWdlLT5nZXRBbGlhc2VzKCk7Cn0gZWxzZSB7CiRhbGlhc2VzID0gJHRoaXMtPmxvY2tlci0+Z2V0QWxpYXNlcygpOwp9CgpyZXR1cm4gJGFsaWFzZXM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0UGxhdGZvcm1SZXF1aXJlbWVudHMoYXJyYXkgJGxpbmtzKTogYXJyYXkKewokcGxhdGZvcm1SZXFzID0gW107CmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CiRwbGF0Zm9ybVJlcXNbJGxpbmstPmdldFRhcmdldCgpXSA9ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7Cn0KfQoKcmV0dXJuICRwbGF0Zm9ybVJlcXM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBtb2NrTG9jYWxSZXBvc2l0b3JpZXMoUmVwb3NpdG9yeU1hbmFnZXIgJHJtKTogdm9pZAp7CiRwYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkcm0tPmdldExvY2FsUmVwb3NpdG9yeSgpLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRwYWNrYWdlc1soc3RyaW5nKSAkcGFja2FnZV0gPSBjbG9uZSAkcGFja2FnZTsKfQpmb3JlYWNoICgkcGFja2FnZXMgYXMgJGtleSA9PiAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJGFsaWFzID0gKHN0cmluZykgJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKJGNsYXNzTmFtZSA9IGdldF9jbGFzcygkcGFja2FnZSk7CiRwYWNrYWdlc1ska2V5XSA9IG5ldyAkY2xhc3NOYW1lKCRwYWNrYWdlc1skYWxpYXNdLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKTsKfQp9CiRybS0+c2V0TG9jYWxSZXBvc2l0b3J5KApuZXcgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5KCRwYWNrYWdlcykKKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVQb29sT3B0aW1pemVyKFBvbGljeUludGVyZmFjZSAkcG9saWN5KTogP1Bvb2xPcHRpbWl6ZXIKewoKCgppZiAoJzAnID09PSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9QT09MX09QVElNSVpFUicpKSB7CiR0aGlzLT5pby0+d3JpdGUoJ1Bvb2wgT3B0aW1pemVyIHdhcyBkaXNhYmxlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLicsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CgpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIG5ldyBQb29sT3B0aW1pemVyKCRwb2xpY3kpOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKElPSW50ZXJmYWNlICRpbywgQ29tcG9zZXIgJGNvbXBvc2VyKTogc2VsZgp7CnJldHVybiBuZXcgc3RhdGljKAokaW8sCiRjb21wb3Nlci0+Z2V0Q29uZmlnKCksCiRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLAokY29tcG9zZXItPmdldERvd25sb2FkTWFuYWdlcigpLAokY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCksCiRjb21wb3Nlci0+Z2V0TG9ja2VyKCksCiRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLAokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLAokY29tcG9zZXItPmdldEF1dG9sb2FkR2VuZXJhdG9yKCkKKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElnbm9yZWRUeXBlcyhhcnJheSAkdHlwZXMpOiBzZWxmCnsKJHRoaXMtPmlnbm9yZWRUeXBlcyA9ICR0eXBlczsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFsbG93ZWRUeXBlcyg/YXJyYXkgJHR5cGVzKTogc2VsZgp7CiR0aGlzLT5hbGxvd2VkVHlwZXMgPSAkdHlwZXM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnkpOiBzZWxmCnsKJHRoaXMtPmFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnkgPSAkYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeTsKCnJldHVybiAkdGhpczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUZW1wb3JhcnlDb25zdHJhaW50cyhhcnJheSAkY29uc3RyYWludHMpOiBzZWxmCnsKJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzID0gJGNvbnN0cmFpbnRzOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREcnlSdW4oYm9vbCAkZHJ5UnVuID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+ZHJ5UnVuID0gJGRyeVJ1bjsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRHJ5UnVuKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRyeVJ1bjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RG93bmxvYWRPbmx5KGJvb2wgJGRvd25sb2FkT25seSA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPmRvd25sb2FkT25seSA9ICRkb3dubG9hZE9ubHk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlclNvdXJjZShib29sICRwcmVmZXJTb3VyY2UgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5wcmVmZXJTb3VyY2UgPSAkcHJlZmVyU291cmNlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmVmZXJEaXN0KGJvb2wgJHByZWZlckRpc3QgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5wcmVmZXJEaXN0ID0gJHByZWZlckRpc3Q7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGltaXplQXV0b2xvYWRlcihib29sICRvcHRpbWl6ZUF1dG9sb2FkZXIpOiBzZWxmCnsKJHRoaXMtPm9wdGltaXplQXV0b2xvYWRlciA9ICRvcHRpbWl6ZUF1dG9sb2FkZXI7CmlmICghJHRoaXMtPm9wdGltaXplQXV0b2xvYWRlcikgewoKCiR0aGlzLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoZmFsc2UpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoYm9vbCAkY2xhc3NNYXBBdXRob3JpdGF0aXZlKTogc2VsZgp7CiR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUgPSAkY2xhc3NNYXBBdXRob3JpdGF0aXZlOwppZiAoJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZSkgewoKJHRoaXMtPnNldE9wdGltaXplQXV0b2xvYWRlcih0cnVlKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBcGN1QXV0b2xvYWRlcihib29sICRhcGN1QXV0b2xvYWRlciwgP3N0cmluZyAkYXBjdUF1dG9sb2FkZXJQcmVmaXggPSBudWxsKTogc2VsZgp7CiR0aGlzLT5hcGN1QXV0b2xvYWRlciA9ICRhcGN1QXV0b2xvYWRlcjsKJHRoaXMtPmFwY3VBdXRvbG9hZGVyUHJlZml4ID0gJGFwY3VBdXRvbG9hZGVyUHJlZml4OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVcGRhdGUoYm9vbCAkdXBkYXRlKTogc2VsZgp7CiR0aGlzLT51cGRhdGUgPSAkdXBkYXRlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnN0YWxsKGJvb2wgJGluc3RhbGwpOiBzZWxmCnsKJHRoaXMtPmluc3RhbGwgPSAkaW5zdGFsbDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2TW9kZShib29sICRkZXZNb2RlID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+ZGV2TW9kZSA9ICRkZXZNb2RlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldER1bXBBdXRvbG9hZGVyKGJvb2wgJGR1bXBBdXRvbG9hZGVyID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+ZHVtcEF1dG9sb2FkZXIgPSAkZHVtcEF1dG9sb2FkZXI7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJ1blNjcmlwdHMoYm9vbCAkcnVuU2NyaXB0cyA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPnJ1blNjcmlwdHMgPSAkcnVuU2NyaXB0czsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmlnKENvbmZpZyAkY29uZmlnKTogc2VsZgp7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJib3NlKGJvb2wgJHZlcmJvc2UgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT52ZXJib3NlID0gJHZlcmJvc2U7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcmJvc2UoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+dmVyYm9zZTsKfQoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJZ25vcmVQbGF0Zm9ybVJlcXVpcmVtZW50cygkaWdub3JlUGxhdGZvcm1SZXFzKTogc2VsZgp7CnRyaWdnZXJfZXJyb3IoJ0luc3RhbGxlcjo6c2V0SWdub3JlUGxhdGZvcm1SZXF1aXJlbWVudHMgaXMgZGVwcmVjYXRlZCBzaW5jZSBDb21wb3NlciAyLjIsIHVzZSBzZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RlYWQuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwoKcmV0dXJuICR0aGlzLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Ojpmcm9tQm9vbE9yTGlzdCgkaWdub3JlUGxhdGZvcm1SZXFzKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOiBzZWxmCnsKJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VXBkYXRlTWlycm9ycyhib29sICR1cGRhdGVNaXJyb3JzKTogc2VsZgp7CiR0aGlzLT51cGRhdGVNaXJyb3JzID0gJHVwZGF0ZU1pcnJvcnM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFVwZGF0ZUFsbG93TGlzdChhcnJheSAkcGFja2FnZXMpOiBzZWxmCnsKaWYgKGNvdW50KCRwYWNrYWdlcykgPT09IDApIHsKJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCA9IG51bGw7Cn0gZWxzZSB7CiR0aGlzLT51cGRhdGVBbGxvd0xpc3QgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKGFycmF5X21hcCgnc3RydG9sb3dlcicsICRwYWNrYWdlcykpKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKGludCAkdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKTogc2VsZgp7CmlmICghaW5fYXJyYXkoJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcywgW1JlcXVlc3Q6OlVQREFURV9PTkxZX0xJU1RFRCwgUmVxdWVzdDo6VVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQU19OT19ST09UX1JFUVVJUkUsIFJlcXVlc3Q6OlVQREFURV9MSVNURURfV0lUSF9UUkFOU0lUSVZFX0RFUFNdLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgdmFsdWUgZm9yIHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyBzdXBwbGllZCIpOwp9CgokdGhpcy0+dXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llczsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyU3RhYmxlKGJvb2wgJHByZWZlclN0YWJsZSA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPnByZWZlclN0YWJsZSA9ICRwcmVmZXJTdGFibGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlckxvd2VzdChib29sICRwcmVmZXJMb3dlc3QgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5wcmVmZXJMb3dlc3QgPSAkcHJlZmVyTG93ZXN0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE1pbmltYWxVcGRhdGUoYm9vbCAkbWluaW1hbFVwZGF0ZSA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPm1pbmltYWxVcGRhdGUgPSAkbWluaW1hbFVwZGF0ZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRXcml0ZUxvY2soYm9vbCAkd3JpdGVMb2NrID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+d3JpdGVMb2NrID0gJHdyaXRlTG9jazsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFeGVjdXRlT3BlcmF0aW9ucyhib29sICRleGVjdXRlT3BlcmF0aW9ucyA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zID0gJGV4ZWN1dGVPcGVyYXRpb25zOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdWRpdChib29sICRhdWRpdCk6IHNlbGYKewokdGhpcy0+YXVkaXQgPSAkYXVkaXQ7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFcnJvck9uQXVkaXQoYm9vbCAkZXJyb3JPbkF1ZGl0KTogc2VsZgp7CiR0aGlzLT5lcnJvck9uQXVkaXQgPSAkZXJyb3JPbkF1ZGl0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXVkaXRGb3JtYXQoc3RyaW5nICRhdWRpdEZvcm1hdCk6IHNlbGYKewokdGhpcy0+YXVkaXRGb3JtYXQgPSAkYXVkaXRGb3JtYXQ7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXNhYmxlUGx1Z2lucygpOiBzZWxmCnsKJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXItPmRpc2FibGVQbHVnaW5zKCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIgJHN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIpOiBzZWxmCnsKJHRoaXMtPnN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIgPSAkc3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcjsKCnJldHVybiAkdGhpczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwoKCgoKCgoKCmNsYXNzIEJpbmFyeUluc3RhbGxlcgp7Cgpwcm90ZWN0ZWQgJGJpbkRpcjsKCnByb3RlY3RlZCAkYmluQ29tcGF0OwoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkZmlsZXN5c3RlbTsKCnByaXZhdGUgJHZlbmRvckRpcjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIHN0cmluZyAkYmluRGlyLCBzdHJpbmcgJGJpbkNvbXBhdCwgP0ZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0gPSBudWxsLCA/c3RyaW5nICR2ZW5kb3JEaXIgPSBudWxsKQp7CiR0aGlzLT5iaW5EaXIgPSAkYmluRGlyOwokdGhpcy0+YmluQ29tcGF0ID0gJGJpbkNvbXBhdDsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+ZmlsZXN5c3RlbSA9ICRmaWxlc3lzdGVtID86IG5ldyBGaWxlc3lzdGVtKCk7CiR0aGlzLT52ZW5kb3JEaXIgPSAkdmVuZG9yRGlyOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbEJpbmFyaWVzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkaW5zdGFsbFBhdGgsIGJvb2wgJHdhcm5Pbk92ZXJ3cml0ZSA9IHRydWUpOiB2b2lkCnsKJGJpbmFyaWVzID0gJHRoaXMtPmdldEJpbmFyaWVzKCRwYWNrYWdlKTsKaWYgKCEkYmluYXJpZXMpIHsKcmV0dXJuOwp9CgpQbGF0Zm9ybTo6d29ya2Fyb3VuZEZpbGVzeXN0ZW1Jc3N1ZXMoKTsKCmZvcmVhY2ggKCRiaW5hcmllcyBhcyAkYmluKSB7CiRiaW5QYXRoID0gJGluc3RhbGxQYXRoLicvJy4kYmluOwppZiAoIWZpbGVfZXhpc3RzKCRiaW5QYXRoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICA8d2FybmluZz5Ta2lwcGVkIGluc3RhbGxhdGlvbiBvZiBiaW4gJy4kYmluLicgZm9yIHBhY2thZ2UgJy4kcGFja2FnZS0+Z2V0TmFtZSgpLic6IGZpbGUgbm90IGZvdW5kIGluIHBhY2thZ2U8L3dhcm5pbmc+Jyk7CmNvbnRpbnVlOwp9CmlmIChpc19kaXIoJGJpblBhdGgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPlNraXBwZWQgaW5zdGFsbGF0aW9uIG9mIGJpbiAnLiRiaW4uJyBmb3IgcGFja2FnZSAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJzogZm91bmQgYSBkaXJlY3RvcnkgYXQgdGhhdCBwYXRoPC93YXJuaW5nPicpOwpjb250aW51ZTsKfQppZiAoISR0aGlzLT5maWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkYmluUGF0aCkpIHsKCgoKCiRiaW5QYXRoID0gcmVhbHBhdGgoJGJpblBhdGgpOwp9CiR0aGlzLT5pbml0aWFsaXplQmluRGlyKCk7CiRsaW5rID0gJHRoaXMtPmJpbkRpci4nLycuYmFzZW5hbWUoJGJpbik7CmlmIChmaWxlX2V4aXN0cygkbGluaykpIHsKaWYgKCFpc19saW5rKCRsaW5rKSkgewppZiAoJHdhcm5Pbk92ZXJ3cml0ZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBTa2lwcGVkIGluc3RhbGxhdGlvbiBvZiBiaW4gJy4kYmluLicgZm9yIHBhY2thZ2UgJy4kcGFja2FnZS0+Z2V0TmFtZSgpLic6IG5hbWUgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgZmlsZScpOwp9CmNvbnRpbnVlOwp9CmlmIChyZWFscGF0aCgkbGluaykgPT09IHJlYWxwYXRoKCRiaW5QYXRoKSkgewoKJHRoaXMtPmZpbGVzeXN0ZW0tPnVubGluaygkbGluayk7Cn0KfQoKJGJpbkNvbXBhdCA9ICR0aGlzLT5iaW5Db21wYXQ7CmlmICgkYmluQ29tcGF0ID09PSAiYXV0byIgJiYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSB8fCBQbGF0Zm9ybTo6aXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXgoKSkpIHsKJGJpbkNvbXBhdCA9ICdmdWxsJzsKfQoKaWYgKCRiaW5Db21wYXQgPT09ICJmdWxsIikgewokdGhpcy0+aW5zdGFsbEZ1bGxCaW5hcmllcygkYmluUGF0aCwgJGxpbmssICRiaW4sICRwYWNrYWdlKTsKfSBlbHNlIHsKJHRoaXMtPmluc3RhbGxVbml4eVByb3h5QmluYXJpZXMoJGJpblBhdGgsICRsaW5rKTsKfQpTaWxlbmNlcjo6Y2FsbCgnY2htb2QnLCAkYmluUGF0aCwgMDc3NyAmIH51bWFzaygpKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQmluYXJpZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewokdGhpcy0+aW5pdGlhbGl6ZUJpbkRpcigpOwoKJGJpbmFyaWVzID0gJHRoaXMtPmdldEJpbmFyaWVzKCRwYWNrYWdlKTsKaWYgKCEkYmluYXJpZXMpIHsKcmV0dXJuOwp9CmZvcmVhY2ggKCRiaW5hcmllcyBhcyAkYmluKSB7CiRsaW5rID0gJHRoaXMtPmJpbkRpci4nLycuYmFzZW5hbWUoJGJpbik7CmlmIChpc19saW5rKCRsaW5rKSB8fCBmaWxlX2V4aXN0cygkbGluaykpIHsgCiR0aGlzLT5maWxlc3lzdGVtLT51bmxpbmsoJGxpbmspOwp9CmlmIChpc19maWxlKCRsaW5rLicuYmF0JykpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnVubGluaygkbGluay4nLmJhdCcpOwp9Cn0KCgppZiAoaXNfZGlyKCR0aGlzLT5iaW5EaXIpICYmICR0aGlzLT5maWxlc3lzdGVtLT5pc0RpckVtcHR5KCR0aGlzLT5iaW5EaXIpKSB7ClNpbGVuY2VyOjpjYWxsKCdybWRpcicsICR0aGlzLT5iaW5EaXIpOwp9Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGV0ZXJtaW5lQmluYXJ5Q2FsbGVyKHN0cmluZyAkYmluKTogc3RyaW5nCnsKaWYgKCcuYmF0JyA9PT0gc3Vic3RyKCRiaW4sIC00KSB8fCAnLmV4ZScgPT09IHN1YnN0cigkYmluLCAtNCkpIHsKcmV0dXJuICdjYWxsJzsKfQoKJGhhbmRsZSA9IGZvcGVuKCRiaW4sICdyJyk7CiRsaW5lID0gZmdldHMoJGhhbmRsZSk7CmZjbG9zZSgkaGFuZGxlKTsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teIyEvKD86dXNyL2Jpbi9lbnYgKT8oPzpbXi9dKy8pKiguKykkfW0nLCAoc3RyaW5nKSAkbGluZSwgJG1hdGNoKSkgewpyZXR1cm4gdHJpbSgkbWF0Y2hbMV0pOwp9CgpyZXR1cm4gJ3BocCc7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRCaW5hcmllcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkKewpyZXR1cm4gJHBhY2thZ2UtPmdldEJpbmFyaWVzKCk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbnN0YWxsRnVsbEJpbmFyaWVzKHN0cmluZyAkYmluUGF0aCwgc3RyaW5nICRsaW5rLCBzdHJpbmcgJGJpbiwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewoKaWYgKCcuYmF0JyAhPT0gc3Vic3RyKCRiaW5QYXRoLCAtNCkpIHsKJHRoaXMtPmluc3RhbGxVbml4eVByb3h5QmluYXJpZXMoJGJpblBhdGgsICRsaW5rKTsKJGxpbmsgLj0gJy5iYXQnOwppZiAoZmlsZV9leGlzdHMoJGxpbmspKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIFNraXBwZWQgaW5zdGFsbGF0aW9uIG9mIGJpbiAnLiRiaW4uJy5iYXQgcHJveHkgZm9yIHBhY2thZ2UgJy4kcGFja2FnZS0+Z2V0TmFtZSgpLic6IGEgLmJhdCBwcm94eSB3YXMgYWxyZWFkeSBpbnN0YWxsZWQnKTsKfQp9CmlmICghZmlsZV9leGlzdHMoJGxpbmspKSB7CmZpbGVfcHV0X2NvbnRlbnRzKCRsaW5rLCAkdGhpcy0+Z2VuZXJhdGVXaW5kb3dzUHJveHlDb2RlKCRiaW5QYXRoLCAkbGluaykpOwpTaWxlbmNlcjo6Y2FsbCgnY2htb2QnLCAkbGluaywgMDc3NyAmIH51bWFzaygpKTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5zdGFsbFVuaXh5UHJveHlCaW5hcmllcyhzdHJpbmcgJGJpblBhdGgsIHN0cmluZyAkbGluayk6IHZvaWQKewpmaWxlX3B1dF9jb250ZW50cygkbGluaywgJHRoaXMtPmdlbmVyYXRlVW5peHlQcm94eUNvZGUoJGJpblBhdGgsICRsaW5rKSk7ClNpbGVuY2VyOjpjYWxsKCdjaG1vZCcsICRsaW5rLCAwNzc3ICYgfnVtYXNrKCkpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZUJpbkRpcigpOiB2b2lkCnsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGhpcy0+YmluRGlyKTsKJHRoaXMtPmJpbkRpciA9IHJlYWxwYXRoKCR0aGlzLT5iaW5EaXIpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVXaW5kb3dzUHJveHlDb2RlKHN0cmluZyAkYmluLCBzdHJpbmcgJGxpbmspOiBzdHJpbmcKewokYmluUGF0aCA9ICR0aGlzLT5maWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoKCRsaW5rLCAkYmluKTsKJGNhbGxlciA9IHNlbGY6OmRldGVybWluZUJpbmFyeUNhbGxlcigkYmluKTsKCgoKCmlmICgkY2FsbGVyID09PSAncGhwJykgewpyZXR1cm4gIkBFQ0hPIE9GRlxyXG4iLgoic2V0bG9jYWwgRElTQUJMRURFTEFZRURFWFBBTlNJT05cclxuIi4KIlNFVCBCSU5fVEFSR0VUPSV+ZHAwLyIudHJpbShQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShiYXNlbmFtZSgkbGluaywgJy5iYXQnKSksICciXCcnKS4iXHJcbiIuCiJTRVQgQ09NUE9TRVJfUlVOVElNRV9CSU5fRElSPSV+ZHAwXHJcbiIuCiJ7JGNhbGxlcn0gXCIlQklOX1RBUkdFVCVcIiAlKlxyXG4iOwp9CgpyZXR1cm4gIkBFQ0hPIE9GRlxyXG4iLgoic2V0bG9jYWwgRElTQUJMRURFTEFZRURFWFBBTlNJT05cclxuIi4KIlNFVCBCSU5fVEFSR0VUPSV+ZHAwLyIudHJpbShQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkYmluUGF0aCksICciXCcnKS4iXHJcbiIuCiJTRVQgQ09NUE9TRVJfUlVOVElNRV9CSU5fRElSPSV+ZHAwXHJcbiIuCiJ7JGNhbGxlcn0gXCIlQklOX1RBUkdFVCVcIiAlKlxyXG4iOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVVbml4eVByb3h5Q29kZShzdHJpbmcgJGJpbiwgc3RyaW5nICRsaW5rKTogc3RyaW5nCnsKJGJpblBhdGggPSAkdGhpcy0+ZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aCgkbGluaywgJGJpbik7CgokYmluRGlyID0gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoZGlybmFtZSgkYmluUGF0aCkpOwokYmluRmlsZSA9IGJhc2VuYW1lKCRiaW5QYXRoKTsKCiRiaW5Db250ZW50cyA9IChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKCRiaW4sIGZhbHNlLCBudWxsLCAwLCA1MDApOwoKCmlmIChQcmVnOjppc01hdGNoKCd7XigjIS4qXHI/XG4pP1tcclxuXHQgXSo8XD9waHB9JywgJGJpbkNvbnRlbnRzLCAkbWF0Y2gpKSB7CgokcHJveHlDb2RlID0gJG1hdGNoWzFdID09PSBudWxsID8gJyMhL3Vzci9iaW4vZW52IHBocCcgOiB0cmltKCRtYXRjaFsxXSk7CiRiaW5QYXRoRXhwb3J0ZWQgPSAkdGhpcy0+ZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aENvZGUoJGxpbmssICRiaW4sIGZhbHNlLCB0cnVlKTsKJHN0cmVhbVByb3h5Q29kZSA9ICRzdHJlYW1IaW50ID0gJyc7CiRnbG9iYWxzQ29kZSA9ICckR0xPQkFMU1tcJ19jb21wb3Nlcl9iaW5fZGlyXCddID0gX19ESVJfXzsnLiJcbiI7CiRwaHB1bml0SGFjazEgPSAkcGhwdW5pdEhhY2syID0gJyc7CgppZiAoJHRoaXMtPnZlbmRvckRpciAhPT0gbnVsbCkgewoKJHZlbmRvckRpclJlYWwgPSByZWFscGF0aCgkdGhpcy0+dmVuZG9yRGlyKTsKaWYgKCR2ZW5kb3JEaXJSZWFsID09PSBmYWxzZSkgewokdmVuZG9yRGlyUmVhbCA9ICR0aGlzLT52ZW5kb3JEaXI7Cn0KJGdsb2JhbHNDb2RlIC49ICckR0xPQkFMU1tcJ19jb21wb3Nlcl9hdXRvbG9hZF9wYXRoXCddID0gJyAuICR0aGlzLT5maWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZSgkbGluaywgJHZlbmRvckRpclJlYWwgLiAnL2F1dG9sb2FkLnBocCcsIGZhbHNlLCB0cnVlKS4iO1xuIjsKfQoKaWYgKCR0aGlzLT5maWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCRiaW4pID09PSAkdGhpcy0+ZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkdGhpcy0+dmVuZG9yRGlyLicvcGhwdW5pdC9waHB1bml0L3BocHVuaXQnKSkgewoKJGdsb2JhbHNDb2RlIC49ICckR0xPQkFMU1tcJ19fUEhQVU5JVF9JU09MQVRJT05fRVhDTFVERV9MSVNUXCddID0gJEdMT0JBTFNbXCdfX1BIUFVOSVRfSVNPTEFUSU9OX0JMQUNLTElTVFwnXSA9IGFycmF5KHJlYWxwYXRoKCcuJGJpblBhdGhFeHBvcnRlZC4nKSk7Jy4iXG4iOwoKJHBocHVuaXRIYWNrMSA9ICIncGhwdmZzY29tcG9zZXI6Ly8nLiI7CiRwaHB1bml0SGFjazIgPSAnCiAgICAgICAgICAgICAgICAkZGF0YSA9IHN0cl9yZXBsYWNlKFwnX19ESVJfX1wnLCB2YXJfZXhwb3J0KGRpcm5hbWUoJHRoaXMtPnJlYWxwYXRoKSwgdHJ1ZSksICRkYXRhKTsKICAgICAgICAgICAgICAgICRkYXRhID0gc3RyX3JlcGxhY2UoXCdfX0ZJTEVfX1wnLCB2YXJfZXhwb3J0KCR0aGlzLT5yZWFscGF0aCwgdHJ1ZSksICRkYXRhKTsnOwp9CmlmICh0cmltKCRtYXRjaFswXSkgIT09ICc8P3BocCcpIHsKJHN0cmVhbUhpbnQgPSAnIHVzaW5nIGEgc3RyZWFtIHdyYXBwZXIgdG8gcHJldmVudCB0aGUgc2hlYmFuZyBmcm9tIGJlaW5nIG91dHB1dCBvbiBQSFA8OCcuIlxuICoiOwokc3RyZWFtUHJveHlDb2RlID0gPDw8U1RSRUFNUFJPWFkKaWYgKFBIUF9WRVJTSU9OX0lEIDwgODAwMDApIHsKICAgIGlmICghY2xhc3NfZXhpc3RzKCdDb21wb3NlclxCaW5Qcm94eVdyYXBwZXInKSkgewogICAgICAgIC8qKgogICAgICAgICAqIEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIGZpbmFsIGNsYXNzIEJpblByb3h5V3JhcHBlcgogICAgICAgIHsKICAgICAgICAgICAgcHJpdmF0ZSBcJGhhbmRsZTsKICAgICAgICAgICAgcHJpdmF0ZSBcJHBvc2l0aW9uOwogICAgICAgICAgICBwcml2YXRlIFwkcmVhbHBhdGg7CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX29wZW4oXCRwYXRoLCBcJG1vZGUsIFwkb3B0aW9ucywgJlwkb3BlbmVkX3BhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGdldCByaWQgb2YgcGhwdmZzY29tcG9zZXI6Ly8gcHJlZml4IGZvciBfX0ZJTEVfXyAmIF9fRElSX18gcmVzb2x1dGlvbgogICAgICAgICAgICAgICAgXCRvcGVuZWRfcGF0aCA9IHN1YnN0cihcJHBhdGgsIDE3KTsKICAgICAgICAgICAgICAgIFwkdGhpcy0+cmVhbHBhdGggPSByZWFscGF0aChcJG9wZW5lZF9wYXRoKSA/OiBcJG9wZW5lZF9wYXRoOwogICAgICAgICAgICAgICAgXCRvcGVuZWRfcGF0aCA9ICRwaHB1bml0SGFjazFcJHRoaXMtPnJlYWxwYXRoOwogICAgICAgICAgICAgICAgXCR0aGlzLT5oYW5kbGUgPSBmb3BlbihcJHRoaXMtPnJlYWxwYXRoLCBcJG1vZGUpOwogICAgICAgICAgICAgICAgXCR0aGlzLT5wb3NpdGlvbiA9IDA7CgogICAgICAgICAgICAgICAgcmV0dXJuIChib29sKSBcJHRoaXMtPmhhbmRsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9yZWFkKFwkY291bnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFwkZGF0YSA9IGZyZWFkKFwkdGhpcy0+aGFuZGxlLCBcJGNvdW50KTsKCiAgICAgICAgICAgICAgICBpZiAoXCR0aGlzLT5wb3NpdGlvbiA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIFwkZGF0YSA9IHByZWdfcmVwbGFjZSgne14jIS4qXFxyP1xcbn0nLCAnJywgXCRkYXRhKTsKICAgICAgICAgICAgICAgIH0kcGhwdW5pdEhhY2syCgogICAgICAgICAgICAgICAgXCR0aGlzLT5wb3NpdGlvbiArPSBzdHJsZW4oXCRkYXRhKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gXCRkYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX2Nhc3QoXCRjYXN0QXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBcJHRoaXMtPmhhbmRsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9jbG9zZSgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZjbG9zZShcJHRoaXMtPmhhbmRsZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fbG9jayhcJG9wZXJhdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIFwkb3BlcmF0aW9uID8gZmxvY2soXCR0aGlzLT5oYW5kbGUsIFwkb3BlcmF0aW9uKSA6IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fc2VlayhcJG9mZnNldCwgXCR3aGVuY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgwID09PSBmc2VlayhcJHRoaXMtPmhhbmRsZSwgXCRvZmZzZXQsIFwkd2hlbmNlKSkgewogICAgICAgICAgICAgICAgICAgIFwkdGhpcy0+cG9zaXRpb24gPSBmdGVsbChcJHRoaXMtPmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX3RlbGwoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gXCR0aGlzLT5wb3NpdGlvbjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9lb2YoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmVvZihcJHRoaXMtPmhhbmRsZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fc3RhdCgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX3NldF9vcHRpb24oXCRvcHRpb24sIFwkYXJnMSwgXCRhcmcyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHVybF9zdGF0KFwkcGF0aCwgXCRmbGFncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgXCRwYXRoID0gc3Vic3RyKFwkcGF0aCwgMTcpOwogICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKFwkcGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdChcJHBhdGgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoCiAgICAgICAgKGZ1bmN0aW9uX2V4aXN0cygnc3RyZWFtX2dldF93cmFwcGVycycpICYmIGluX2FycmF5KCdwaHB2ZnNjb21wb3NlcicsIHN0cmVhbV9nZXRfd3JhcHBlcnMoKSwgdHJ1ZSkpCiAgICAgICAgfHwgKGZ1bmN0aW9uX2V4aXN0cygnc3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXInKSAmJiBzdHJlYW1fd3JhcHBlcl9yZWdpc3RlcigncGhwdmZzY29tcG9zZXInLCAnQ29tcG9zZXJcQmluUHJveHlXcmFwcGVyJykpCiAgICApIHsKICAgICAgICByZXR1cm4gaW5jbHVkZSgicGhwdmZzY29tcG9zZXI6Ly8iIC4gJGJpblBhdGhFeHBvcnRlZCk7CiAgICB9Cn0KClNUUkVBTVBST1hZOwp9CgpyZXR1cm4gJHByb3h5Q29kZSAuICJcbiIgLiA8PDxQUk9YWQo8P3BocAoKLyoqCiAqIFByb3h5IFBIUCBmaWxlIGdlbmVyYXRlZCBieSBDb21wb3NlcgogKgogKiBUaGlzIGZpbGUgaW5jbHVkZXMgdGhlIHJlZmVyZW5jZWQgYmluIHBhdGggKCRiaW5QYXRoKQogKiRzdHJlYW1IaW50CiAqIEBnZW5lcmF0ZWQKICovCgpuYW1lc3BhY2UgQ29tcG9zZXI7CgokZ2xvYmFsc0NvZGUKJHN0cmVhbVByb3h5Q29kZQpyZXR1cm4gaW5jbHVkZSAkYmluUGF0aEV4cG9ydGVkOwoKUFJPWFk7Cn0KCnJldHVybiA8PDxQUk9YWQojIS91c3IvYmluL2VudiBzaAoKIyBTdXBwb3J0IGJhc2ggdG8gc3VwcG9ydCBgc291cmNlYCB3aXRoIGZhbGxiYWNrIG9uICQwIGlmIHRoaXMgZG9lcyBub3QgcnVuIHdpdGggYmFzaAojIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNTAwNjUwNS82NTEyCnNlbGZBcmc9IlwkQkFTSF9TT1VSQ0UiCmlmIFsgLXogIlwkc2VsZkFyZyIgXTsgdGhlbgogICAgc2VsZkFyZz0iXCQwIgpmaQoKc2VsZj1cJChyZWFscGF0aCBcJHNlbGZBcmcgMj4gL2Rldi9udWxsKQppZiBbIC16ICJcJHNlbGYiIF07IHRoZW4KICAgIHNlbGY9Ilwkc2VsZkFyZyIKZmkKCmRpcj1cJChjZCAiXCR7c2VsZiVbL1xcXFxdKn0iID4gL2Rldi9udWxsOyBjZCAkYmluRGlyICYmIHB3ZCkKCmlmIFsgLWQgL3Byb2MvY3lnZHJpdmUgXTsgdGhlbgogICAgY2FzZSBcJCh3aGljaCBwaHApIGluCiAgICAgICAgXCQocmVhZGxpbmsgLW4gL3Byb2MvY3lnZHJpdmUpLyopCiAgICAgICAgICAgICMgV2UgYXJlIGluIEN5Z3dpbiB1c2luZyBXaW5kb3dzIHBocCwgc28gdGhlIHBhdGggbXVzdCBiZSB0cmFuc2xhdGVkCiAgICAgICAgICAgIGRpcj1cJChjeWdwYXRoIC1tICJcJGRpciIpOwogICAgICAgICAgICA7OwogICAgZXNhYwpmaQoKZXhwb3J0IENPTVBPU0VSX1JVTlRJTUVfQklOX0RJUj0iXCQoY2QgIlwke3NlbGYlWy9cXFxcXSp9IiA+IC9kZXYvbnVsbDsgcHdkKSIKCiMgSWYgYmFzaCBpcyBzb3VyY2luZyB0aGlzIGZpbGUsIHdlIGhhdmUgdG8gc291cmNlIHRoZSB0YXJnZXQgYXMgd2VsbApiYXNoU291cmNlPSJcJEJBU0hfU09VUkNFIgppZiBbIC1uICJcJGJhc2hTb3VyY2UiIF07IHRoZW4KICAgIGlmIFsgIlwkYmFzaFNvdXJjZSIgIT0gIlwkMCIgXTsgdGhlbgogICAgICAgIHNvdXJjZSAiXCR7ZGlyfS8kYmluRmlsZSIgIlwkQCIKICAgICAgICByZXR1cm4KICAgIGZpCmZpCgpleGVjICJcJHtkaXJ9LyRiaW5GaWxlIiAiXCRAIgoKUFJPWFk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIEJpbmFyeVByZXNlbmNlSW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlbnN1cmVCaW5hcmllc1ByZXNlbmNlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xDb25zb2xlSU87CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cT3BlcmF0aW9uSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVcGRhdGVPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVuaW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cTWFya0FsaWFzSW5zdGFsbGVkT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxNYXJrQWxpYXNVbmluc3RhbGxlZE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRmlsZURvd25sb2FkZXI7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxMb29wOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIFNlbGRcU2lnbmFsXFNpZ25hbEhhbmRsZXI7CgoKCgoKCgoKY2xhc3MgSW5zdGFsbGF0aW9uTWFuYWdlcgp7Cgpwcml2YXRlICRpbnN0YWxsZXJzID0gW107Cgpwcml2YXRlICRjYWNoZSA9IFtdOwoKcHJpdmF0ZSAkbm90aWZpYWJsZVBhY2thZ2VzID0gW107Cgpwcml2YXRlICRsb29wOwoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7Cgpwcml2YXRlICRvdXRwdXRQcm9ncmVzczsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChMb29wICRsb29wLCBJT0ludGVyZmFjZSAkaW8sID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwpCnsKJHRoaXMtPmxvb3AgPSAkbG9vcDsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCk6IHZvaWQKewokdGhpcy0+bm90aWZpYWJsZVBhY2thZ2VzID0gW107CkZpbGVEb3dubG9hZGVyOjokZG93bmxvYWRNZXRhZGF0YSA9IFtdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRJbnN0YWxsZXIoSW5zdGFsbGVySW50ZXJmYWNlICRpbnN0YWxsZXIpOiB2b2lkCnsKYXJyYXlfdW5zaGlmdCgkdGhpcy0+aW5zdGFsbGVycywgJGluc3RhbGxlcik7CiR0aGlzLT5jYWNoZSA9IFtdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVJbnN0YWxsZXIoSW5zdGFsbGVySW50ZXJmYWNlICRpbnN0YWxsZXIpOiB2b2lkCnsKaWYgKGZhbHNlICE9PSAoJGtleSA9IGFycmF5X3NlYXJjaCgkaW5zdGFsbGVyLCAkdGhpcy0+aW5zdGFsbGVycywgdHJ1ZSkpKSB7CmFycmF5X3NwbGljZSgkdGhpcy0+aW5zdGFsbGVycywgJGtleSwgMSk7CiR0aGlzLT5jYWNoZSA9IFtdOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZVBsdWdpbnMoKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5pbnN0YWxsZXJzIGFzICRpID0+ICRpbnN0YWxsZXIpIHsKaWYgKCEkaW5zdGFsbGVyIGluc3RhbmNlb2YgUGx1Z2luSW5zdGFsbGVyKSB7CmNvbnRpbnVlOwp9CgokaW5zdGFsbGVyLT5kaXNhYmxlUGx1Z2lucygpOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGVyKHN0cmluZyAkdHlwZSk6IEluc3RhbGxlckludGVyZmFjZQp7CiR0eXBlID0gc3RydG9sb3dlcigkdHlwZSk7CgppZiAoaXNzZXQoJHRoaXMtPmNhY2hlWyR0eXBlXSkpIHsKcmV0dXJuICR0aGlzLT5jYWNoZVskdHlwZV07Cn0KCmZvcmVhY2ggKCR0aGlzLT5pbnN0YWxsZXJzIGFzICRpbnN0YWxsZXIpIHsKaWYgKCRpbnN0YWxsZXItPnN1cHBvcnRzKCR0eXBlKSkgewpyZXR1cm4gJHRoaXMtPmNhY2hlWyR0eXBlXSA9ICRpbnN0YWxsZXI7Cn0KfQoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vua25vd24gaW5zdGFsbGVyIHR5cGU6ICcuJHR5cGUpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQYWNrYWdlSW5zdGFsbGVkKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBib29sCnsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CnJldHVybiAkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkgJiYgJHRoaXMtPmlzUGFja2FnZUluc3RhbGxlZCgkcmVwbywgJHBhY2thZ2UtPmdldEFsaWFzT2YoKSk7Cn0KCnJldHVybiAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpLT5pc0luc3RhbGxlZCgkcmVwbywgJHBhY2thZ2UpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5zdXJlQmluYXJpZXNQcmVzZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CnRyeSB7CiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpOwp9IGNhdGNoIChcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uICRlKSB7CgpyZXR1cm47Cn0KCgppZiAoJGluc3RhbGxlciBpbnN0YW5jZW9mIEJpbmFyeVByZXNlbmNlSW50ZXJmYWNlKSB7CiRpbnN0YWxsZXItPmVuc3VyZUJpbmFyaWVzUHJlc2VuY2UoJHBhY2thZ2UpOwp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGFycmF5ICRvcGVyYXRpb25zLCBib29sICRkZXZNb2RlID0gdHJ1ZSwgYm9vbCAkcnVuU2NyaXB0cyA9IHRydWUsIGJvb2wgJGRvd25sb2FkT25seSA9IGZhbHNlKTogdm9pZAp7CgokY2xlYW51cFByb21pc2VzID0gW107Cgokc2lnbmFsSGFuZGxlciA9IFNpZ25hbEhhbmRsZXI6OmNyZWF0ZShbU2lnbmFsSGFuZGxlcjo6U0lHSU5ULCBTaWduYWxIYW5kbGVyOjpTSUdURVJNLCBTaWduYWxIYW5kbGVyOjpTSUdIVVBdLCBmdW5jdGlvbiAoc3RyaW5nICRzaWduYWwsIFNpZ25hbEhhbmRsZXIgJGhhbmRsZXIpIHVzZSAoJiRjbGVhbnVwUHJvbWlzZXMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSZWNlaXZlZCAnLiRzaWduYWwuJywgYWJvcnRpbmcnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokdGhpcy0+cnVuQ2xlYW51cCgkY2xlYW51cFByb21pc2VzKTsKJGhhbmRsZXItPmV4aXRXaXRoTGFzdFNpZ25hbCgpOwp9KTsKCnRyeSB7CgoKJGJhdGNoZXMgPSBbXTsKJGJhdGNoID0gW107CmZvcmVhY2ggKCRvcGVyYXRpb25zIGFzICRpbmRleCA9PiAkb3BlcmF0aW9uKSB7CmlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgVXBkYXRlT3BlcmF0aW9uIHx8ICRvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnN0YWxsT3BlcmF0aW9uKSB7CiRwYWNrYWdlID0gJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbiA/ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKSA6ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKaWYgKCRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1wbHVnaW4nKSB7CiRleHRyYSA9ICRwYWNrYWdlLT5nZXRFeHRyYSgpOwppZiAoaXNzZXQoJGV4dHJhWydwbHVnaW4tbW9kaWZpZXMtZG93bmxvYWRzJ10pICYmICRleHRyYVsncGx1Z2luLW1vZGlmaWVzLWRvd25sb2FkcyddID09PSB0cnVlKSB7CmlmIChjb3VudCgkYmF0Y2gpID4gMCkgewokYmF0Y2hlc1tdID0gJGJhdGNoOwp9CiRiYXRjaGVzW10gPSBbJGluZGV4ID0+ICRvcGVyYXRpb25dOwokYmF0Y2ggPSBbXTsKCmNvbnRpbnVlOwp9Cn0KfQokYmF0Y2hbJGluZGV4XSA9ICRvcGVyYXRpb247Cn0KCmlmIChjb3VudCgkYmF0Y2gpID4gMCkgewokYmF0Y2hlc1tdID0gJGJhdGNoOwp9Cgpmb3JlYWNoICgkYmF0Y2hlcyBhcyAkYmF0Y2hUb0V4ZWN1dGUpIHsKJHRoaXMtPmRvd25sb2FkQW5kRXhlY3V0ZUJhdGNoKCRyZXBvLCAkYmF0Y2hUb0V4ZWN1dGUsICRjbGVhbnVwUHJvbWlzZXMsICRkZXZNb2RlLCAkcnVuU2NyaXB0cywgJGRvd25sb2FkT25seSwgJG9wZXJhdGlvbnMpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPnJ1bkNsZWFudXAoJGNsZWFudXBQcm9taXNlcyk7Cgp0aHJvdyAkZTsKfSBmaW5hbGx5IHsKJHNpZ25hbEhhbmRsZXItPnVucmVnaXN0ZXIoKTsKfQoKaWYgKCRkb3dubG9hZE9ubHkpIHsKcmV0dXJuOwp9CgoKCgokcmVwby0+d3JpdGUoJGRldk1vZGUsICR0aGlzKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvd25sb2FkQW5kRXhlY3V0ZUJhdGNoKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGFycmF5ICRvcGVyYXRpb25zLCBhcnJheSAmJGNsZWFudXBQcm9taXNlcywgYm9vbCAkZGV2TW9kZSwgYm9vbCAkcnVuU2NyaXB0cywgYm9vbCAkZG93bmxvYWRPbmx5LCBhcnJheSAkYWxsT3BlcmF0aW9ucyk6IHZvaWQKewokcHJvbWlzZXMgPSBbXTsKCmZvcmVhY2ggKCRvcGVyYXRpb25zIGFzICRpbmRleCA9PiAkb3BlcmF0aW9uKSB7CiRvcFR5cGUgPSAkb3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCk7CgoKaWYgKCFpbl9hcnJheSgkb3BUeXBlLCBbJ3VwZGF0ZScsICdpbnN0YWxsJywgJ3VuaW5zdGFsbCddLCB0cnVlKSkgewpjb250aW51ZTsKfQoKaWYgKCRvcFR5cGUgPT09ICd1cGRhdGUnKSB7CgokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKTsKJGluaXRpYWxQYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0SW5pdGlhbFBhY2thZ2UoKTsKfSBlbHNlIHsKCiRwYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpOwokaW5pdGlhbFBhY2thZ2UgPSBudWxsOwp9CiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpOwoKJGNsZWFudXBQcm9taXNlc1skaW5kZXhdID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJG9wVHlwZSwgJGluc3RhbGxlciwgJHBhY2thZ2UsICRpbml0aWFsUGFja2FnZSk6ID9Qcm9taXNlSW50ZXJmYWNlIHsKCgppZiAobnVsbCA9PT0gJHBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgpyZXR1cm4gJGluc3RhbGxlci0+Y2xlYW51cCgkb3BUeXBlLCAkcGFja2FnZSwgJGluaXRpYWxQYWNrYWdlKTsKfTsKCmlmICgkb3BUeXBlICE9PSAndW5pbnN0YWxsJykgewokcHJvbWlzZSA9ICRpbnN0YWxsZXItPmRvd25sb2FkKCRwYWNrYWdlLCAkaW5pdGlhbFBhY2thZ2UpOwppZiAobnVsbCAhPT0gJHByb21pc2UpIHsKJHByb21pc2VzW10gPSAkcHJvbWlzZTsKfQp9Cn0KCgppZiAoY291bnQoJHByb21pc2VzKSA+IDApIHsKJHRoaXMtPndhaXRPblByb21pc2VzKCRwcm9taXNlcyk7Cn0KCmlmICgkZG93bmxvYWRPbmx5KSB7CiR0aGlzLT5ydW5DbGVhbnVwKCRjbGVhbnVwUHJvbWlzZXMpOwpyZXR1cm47Cn0KCgoKJGJhdGNoZXMgPSBbXTsKJGJhdGNoID0gW107CmZvcmVhY2ggKCRvcGVyYXRpb25zIGFzICRpbmRleCA9PiAkb3BlcmF0aW9uKSB7CmlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zdGFsbE9wZXJhdGlvbiB8fCAkb3BlcmF0aW9uIGluc3RhbmNlb2YgVXBkYXRlT3BlcmF0aW9uKSB7CiRwYWNrYWdlID0gJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbiA/ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKSA6ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKaWYgKCRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1wbHVnaW4nIHx8ICRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1pbnN0YWxsZXInKSB7CmlmIChjb3VudCgkYmF0Y2gpID4gMCkgewokYmF0Y2hlc1tdID0gJGJhdGNoOwp9CiRiYXRjaGVzW10gPSBbJGluZGV4ID0+ICRvcGVyYXRpb25dOwokYmF0Y2ggPSBbXTsKCmNvbnRpbnVlOwp9Cn0KJGJhdGNoWyRpbmRleF0gPSAkb3BlcmF0aW9uOwp9CgppZiAoY291bnQoJGJhdGNoKSA+IDApIHsKJGJhdGNoZXNbXSA9ICRiYXRjaDsKfQoKZm9yZWFjaCAoJGJhdGNoZXMgYXMgJGJhdGNoVG9FeGVjdXRlKSB7CiR0aGlzLT5leGVjdXRlQmF0Y2goJHJlcG8sICRiYXRjaFRvRXhlY3V0ZSwgJGNsZWFudXBQcm9taXNlcywgJGRldk1vZGUsICRydW5TY3JpcHRzLCAkYWxsT3BlcmF0aW9ucyk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4ZWN1dGVCYXRjaChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBhcnJheSAkb3BlcmF0aW9ucywgYXJyYXkgJGNsZWFudXBQcm9taXNlcywgYm9vbCAkZGV2TW9kZSwgYm9vbCAkcnVuU2NyaXB0cywgYXJyYXkgJGFsbE9wZXJhdGlvbnMpOiB2b2lkCnsKJHByb21pc2VzID0gW107CiRwb3N0RXhlY0NhbGxiYWNrcyA9IFtdOwoKZm9yZWFjaCAoJG9wZXJhdGlvbnMgYXMgJGluZGV4ID0+ICRvcGVyYXRpb24pIHsKJG9wVHlwZSA9ICRvcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKTsKCgppZiAoIWluX2FycmF5KCRvcFR5cGUsIFsndXBkYXRlJywgJ2luc3RhbGwnLCAndW5pbnN0YWxsJ10sIHRydWUpKSB7CgppZiAoJHRoaXMtPmlvLT5pc0RlYnVnKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgIC0gJyAuICRvcGVyYXRpb24tPnNob3coZmFsc2UpKTsKfQokdGhpcy0+eyRvcFR5cGV9KCRyZXBvLCAkb3BlcmF0aW9uKTsKCmNvbnRpbnVlOwp9CgppZiAoJG9wVHlwZSA9PT0gJ3VwZGF0ZScpIHsKCiRwYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0VGFyZ2V0UGFja2FnZSgpOwokaW5pdGlhbFBhY2thZ2UgPSAkb3BlcmF0aW9uLT5nZXRJbml0aWFsUGFja2FnZSgpOwp9IGVsc2UgewoKJHBhY2thZ2UgPSAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCk7CiRpbml0aWFsUGFja2FnZSA9IG51bGw7Cn0KCiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpOwoKJGV2ZW50TmFtZSA9IFsKJ2luc3RhbGwnID0+IFBhY2thZ2VFdmVudHM6OlBSRV9QQUNLQUdFX0lOU1RBTEwsCid1cGRhdGUnID0+IFBhY2thZ2VFdmVudHM6OlBSRV9QQUNLQUdFX1VQREFURSwKJ3VuaW5zdGFsbCcgPT4gUGFja2FnZUV2ZW50czo6UFJFX1BBQ0tBR0VfVU5JTlNUQUxMLApdWyRvcFR5cGVdOwoKaWYgKCRydW5TY3JpcHRzICYmICR0aGlzLT5ldmVudERpc3BhdGNoZXIgIT09IG51bGwpIHsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2hQYWNrYWdlRXZlbnQoJGV2ZW50TmFtZSwgJGRldk1vZGUsICRyZXBvLCAkYWxsT3BlcmF0aW9ucywgJG9wZXJhdGlvbik7Cn0KCiRkaXNwYXRjaGVyID0gJHRoaXMtPmV2ZW50RGlzcGF0Y2hlcjsKJGlvID0gJHRoaXMtPmlvOwoKJHByb21pc2UgPSAkaW5zdGFsbGVyLT5wcmVwYXJlKCRvcFR5cGUsICRwYWNrYWdlLCAkaW5pdGlhbFBhY2thZ2UpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRwcm9taXNlID0gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkb3BUeXBlLCAkcmVwbywgJG9wZXJhdGlvbikgewpyZXR1cm4gJHRoaXMtPnskb3BUeXBlfSgkcmVwbywgJG9wZXJhdGlvbik7Cn0pLT50aGVuKCRjbGVhbnVwUHJvbWlzZXNbJGluZGV4XSkKLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJGRldk1vZGUsICRyZXBvKTogdm9pZCB7CiRyZXBvLT53cml0ZSgkZGV2TW9kZSwgJHRoaXMpOwp9LCBzdGF0aWMgZnVuY3Rpb24gKCRlKSB1c2UgKCRvcFR5cGUsICRwYWNrYWdlLCAkaW8pOiB2b2lkIHsKJGlvLT53cml0ZUVycm9yKCcgICAgPGVycm9yPicgLiB1Y2ZpcnN0KCRvcFR5cGUpIC4nIG9mICcuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGZhaWxlZDwvZXJyb3I+Jyk7Cgp0aHJvdyAkZTsKfSk7CgokZXZlbnROYW1lID0gWwonaW5zdGFsbCcgPT4gUGFja2FnZUV2ZW50czo6UE9TVF9QQUNLQUdFX0lOU1RBTEwsCid1cGRhdGUnID0+IFBhY2thZ2VFdmVudHM6OlBPU1RfUEFDS0FHRV9VUERBVEUsCid1bmluc3RhbGwnID0+IFBhY2thZ2VFdmVudHM6OlBPU1RfUEFDS0FHRV9VTklOU1RBTEwsCl1bJG9wVHlwZV07CgppZiAoJHJ1blNjcmlwdHMgJiYgJGRpc3BhdGNoZXIgIT09IG51bGwpIHsKJHBvc3RFeGVjQ2FsbGJhY2tzW10gPSBzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkZGlzcGF0Y2hlciwgJGV2ZW50TmFtZSwgJGRldk1vZGUsICRyZXBvLCAkYWxsT3BlcmF0aW9ucywgJG9wZXJhdGlvbik6IHZvaWQgewokZGlzcGF0Y2hlci0+ZGlzcGF0Y2hQYWNrYWdlRXZlbnQoJGV2ZW50TmFtZSwgJGRldk1vZGUsICRyZXBvLCAkYWxsT3BlcmF0aW9ucywgJG9wZXJhdGlvbik7Cn07Cn0KCiRwcm9taXNlc1tdID0gJHByb21pc2U7Cn0KCgppZiAoY291bnQoJHByb21pc2VzKSA+IDApIHsKJHRoaXMtPndhaXRPblByb21pc2VzKCRwcm9taXNlcyk7Cn0KClBsYXRmb3JtOjp3b3JrYXJvdW5kRmlsZXN5c3RlbUlzc3VlcygpOwoKZm9yZWFjaCAoJHBvc3RFeGVjQ2FsbGJhY2tzIGFzICRjYikgewokY2IoKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHdhaXRPblByb21pc2VzKGFycmF5ICRwcm9taXNlcyk6IHZvaWQKewokcHJvZ3Jlc3MgPSBudWxsOwppZiAoCiR0aGlzLT5vdXRwdXRQcm9ncmVzcwomJiAkdGhpcy0+aW8gaW5zdGFuY2VvZiBDb25zb2xlSU8KJiYgISgoYm9vbCkgUGxhdGZvcm06OmdldEVudignQ0knKSkKJiYgISR0aGlzLT5pby0+aXNEZWJ1ZygpCiYmIGNvdW50KCRwcm9taXNlcykgPiAxCikgewokcHJvZ3Jlc3MgPSAkdGhpcy0+aW8tPmdldFByb2dyZXNzQmFyKCk7Cn0KJHRoaXMtPmxvb3AtPndhaXQoJHByb21pc2VzLCAkcHJvZ3Jlc3MpOwppZiAoJHByb2dyZXNzICE9PSBudWxsKSB7CiRwcm9ncmVzcy0+Y2xlYXIoKTsKCmlmICghJHRoaXMtPmlvLT5pc0RlY29yYXRlZCgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7Cn0KfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogP1Byb21pc2VJbnRlcmZhY2UKewokaW5zdGFsbGVyID0gJHRoaXMtPmdldEluc3RhbGxlcigkcGFja2FnZS0+Z2V0VHlwZSgpKTsKJHByb21pc2UgPSAkaW5zdGFsbGVyLT5jbGVhbnVwKCJpbnN0YWxsIiwgJHBhY2thZ2UpOwoKcmV0dXJuICRwcm9taXNlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgSW5zdGFsbE9wZXJhdGlvbiAkb3BlcmF0aW9uKTogP1Byb21pc2VJbnRlcmZhY2UKewokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKJGluc3RhbGxlciA9ICR0aGlzLT5nZXRJbnN0YWxsZXIoJHBhY2thZ2UtPmdldFR5cGUoKSk7CiRwcm9taXNlID0gJGluc3RhbGxlci0+aW5zdGFsbCgkcmVwbywgJHBhY2thZ2UpOwokdGhpcy0+bWFya0Zvck5vdGlmaWNhdGlvbigkcGFja2FnZSk7CgpyZXR1cm4gJHByb21pc2U7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFVwZGF0ZU9wZXJhdGlvbiAkb3BlcmF0aW9uKTogP1Byb21pc2VJbnRlcmZhY2UKewokaW5pdGlhbCA9ICRvcGVyYXRpb24tPmdldEluaXRpYWxQYWNrYWdlKCk7CiR0YXJnZXQgPSAkb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCk7CgokaW5pdGlhbFR5cGUgPSAkaW5pdGlhbC0+Z2V0VHlwZSgpOwokdGFyZ2V0VHlwZSA9ICR0YXJnZXQtPmdldFR5cGUoKTsKCmlmICgkaW5pdGlhbFR5cGUgPT09ICR0YXJnZXRUeXBlKSB7CiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRpbml0aWFsVHlwZSk7CiRwcm9taXNlID0gJGluc3RhbGxlci0+dXBkYXRlKCRyZXBvLCAkaW5pdGlhbCwgJHRhcmdldCk7CiR0aGlzLT5tYXJrRm9yTm90aWZpY2F0aW9uKCR0YXJnZXQpOwp9IGVsc2UgewokcHJvbWlzZSA9ICR0aGlzLT5nZXRJbnN0YWxsZXIoJGluaXRpYWxUeXBlKS0+dW5pbnN0YWxsKCRyZXBvLCAkaW5pdGlhbCk7CmlmICghJHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CiRwcm9taXNlID0gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJGluc3RhbGxlciA9ICR0aGlzLT5nZXRJbnN0YWxsZXIoJHRhcmdldFR5cGUpOwokcHJvbWlzZSA9ICRwcm9taXNlLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRpbnN0YWxsZXIsICRyZXBvLCAkdGFyZ2V0KTogUHJvbWlzZUludGVyZmFjZSB7CiRwcm9taXNlID0gJGluc3RhbGxlci0+aW5zdGFsbCgkcmVwbywgJHRhcmdldCk7CmlmICgkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKcmV0dXJuICRwcm9taXNlOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfSk7Cn0KCnJldHVybiAkcHJvbWlzZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgVW5pbnN0YWxsT3BlcmF0aW9uICRvcGVyYXRpb24pOiA/UHJvbWlzZUludGVyZmFjZQp7CiRwYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpOwokaW5zdGFsbGVyID0gJHRoaXMtPmdldEluc3RhbGxlcigkcGFja2FnZS0+Z2V0VHlwZSgpKTsKCnJldHVybiAkaW5zdGFsbGVyLT51bmluc3RhbGwoJHJlcG8sICRwYWNrYWdlKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hcmtBbGlhc0luc3RhbGxlZChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBNYXJrQWxpYXNJbnN0YWxsZWRPcGVyYXRpb24gJG9wZXJhdGlvbik6IHZvaWQKewokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKCmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CiRyZXBvLT5hZGRQYWNrYWdlKGNsb25lICRwYWNrYWdlKTsKfQp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbWFya0FsaWFzVW5pbnN0YWxsZWQoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgTWFya0FsaWFzVW5pbnN0YWxsZWRPcGVyYXRpb24gJG9wZXJhdGlvbik6IHZvaWQKewokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKCiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRwYWNrYWdlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6ID9zdHJpbmcKewokaW5zdGFsbGVyID0gJHRoaXMtPmdldEluc3RhbGxlcigkcGFja2FnZS0+Z2V0VHlwZSgpKTsKCnJldHVybiAkaW5zdGFsbGVyLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRPdXRwdXRQcm9ncmVzcyhib29sICRvdXRwdXRQcm9ncmVzcyk6IHZvaWQKewokdGhpcy0+b3V0cHV0UHJvZ3Jlc3MgPSAkb3V0cHV0UHJvZ3Jlc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBub3RpZnlJbnN0YWxscyhJT0ludGVyZmFjZSAkaW8pOiB2b2lkCnsKJHByb21pc2VzID0gW107Cgp0cnkgewpmb3JlYWNoICgkdGhpcy0+bm90aWZpYWJsZVBhY2thZ2VzIGFzICRyZXBvVXJsID0+ICRwYWNrYWdlcykgewoKaWYgKHN0cl9jb250YWlucygkcmVwb1VybCwgJyVwYWNrYWdlJScpKSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokdXJsID0gc3RyX3JlcGxhY2UoJyVwYWNrYWdlJScsICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksICRyZXBvVXJsKTsKCiRwYXJhbXMgPSBbCid2ZXJzaW9uJyA9PiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLAondmVyc2lvbl9ub3JtYWxpemVkJyA9PiAkcGFja2FnZS0+Z2V0VmVyc2lvbigpLApdOwokb3B0cyA9IFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCidodHRwJyA9PiBbCidtZXRob2QnID0+ICdQT1NUJywKJ2hlYWRlcicgPT4gWydDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCddLAonY29udGVudCcgPT4gaHR0cF9idWlsZF9xdWVyeSgkcGFyYW1zLCAnJywgJyYnKSwKJ3RpbWVvdXQnID0+IDMsCl0sCl07CgokcHJvbWlzZXNbXSA9ICR0aGlzLT5sb29wLT5nZXRIdHRwRG93bmxvYWRlcigpLT5hZGQoJHVybCwgJG9wdHMpOwp9Cgpjb250aW51ZTsKfQoKJHBvc3REYXRhID0gWydkb3dubG9hZHMnID0+IFtdXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRwYWNrYWdlTm90aWZpY2F0aW9uID0gWwonbmFtZScgPT4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSwKJ3ZlcnNpb24nID0+ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCksCl07CmlmIChzdHJwb3MoJHJlcG9VcmwsICdwYWNrYWdpc3Qub3JnLycpICE9PSBmYWxzZSkgewppZiAoaXNzZXQoRmlsZURvd25sb2FkZXI6OiRkb3dubG9hZE1ldGFkYXRhWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewokcGFja2FnZU5vdGlmaWNhdGlvblsnZG93bmxvYWRlZCddID0gRmlsZURvd25sb2FkZXI6OiRkb3dubG9hZE1ldGFkYXRhWyRwYWNrYWdlLT5nZXROYW1lKCldOwp9IGVsc2UgewokcGFja2FnZU5vdGlmaWNhdGlvblsnZG93bmxvYWRlZCddID0gZmFsc2U7Cn0KfQokcG9zdERhdGFbJ2Rvd25sb2FkcyddW10gPSAkcGFja2FnZU5vdGlmaWNhdGlvbjsKfQoKJG9wdHMgPSBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLAonaHR0cCcgPT4gWwonbWV0aG9kJyA9PiAnUE9TVCcsCidoZWFkZXInID0+IFsnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJ10sCidjb250ZW50JyA9PiBqc29uX2VuY29kZSgkcG9zdERhdGEpLAondGltZW91dCcgPT4gNiwKXSwKXTsKCiRwcm9taXNlc1tdID0gJHRoaXMtPmxvb3AtPmdldEh0dHBEb3dubG9hZGVyKCktPmFkZCgkcmVwb1VybCwgJG9wdHMpOwp9CgokdGhpcy0+bG9vcC0+d2FpdCgkcHJvbWlzZXMpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KCiR0aGlzLT5yZXNldCgpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIG1hcmtGb3JOb3RpZmljYXRpb24oUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewppZiAoJHBhY2thZ2UtPmdldE5vdGlmaWNhdGlvblVybCgpICE9PSBudWxsKSB7CiR0aGlzLT5ub3RpZmlhYmxlUGFja2FnZXNbJHBhY2thZ2UtPmdldE5vdGlmaWNhdGlvblVybCgpXVskcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRwYWNrYWdlOwp9Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJ1bkNsZWFudXAoYXJyYXkgJGNsZWFudXBQcm9taXNlcyk6IHZvaWQKewokcHJvbWlzZXMgPSBbXTsKCiR0aGlzLT5sb29wLT5hYm9ydEpvYnMoKTsKCmZvcmVhY2ggKCRjbGVhbnVwUHJvbWlzZXMgYXMgJGNsZWFudXApIHsKJHByb21pc2VzW10gPSBuZXcgXFJlYWN0XFByb21pc2VcUHJvbWlzZShzdGF0aWMgZnVuY3Rpb24gKCRyZXNvbHZlKSB1c2UgKCRjbGVhbnVwKTogdm9pZCB7CiRwcm9taXNlID0gJGNsZWFudXAoKTsKaWYgKCEkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKJHJlc29sdmUobnVsbCk7Cn0gZWxzZSB7CiRwcm9taXNlLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRyZXNvbHZlKTogdm9pZCB7CiRyZXNvbHZlKG51bGwpOwp9KTsKfQp9KTsKfQoKaWYgKGNvdW50KCRwcm9taXNlcykgPiAwKSB7CiR0aGlzLT5sb29wLT53YWl0KCRwcm9taXNlcyk7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcVHJhbnNhY3Rpb247CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQ7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKCmNsYXNzIEluc3RhbGxlckV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRjb21wb3NlcjsKCgoKCnByaXZhdGUgJGlvOwoKCgoKcHJpdmF0ZSAkZGV2TW9kZTsKCgoKCnByaXZhdGUgJGV4ZWN1dGVPcGVyYXRpb25zOwoKCgoKcHJpdmF0ZSAkdHJhbnNhY3Rpb247CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRldmVudE5hbWUsIENvbXBvc2VyICRjb21wb3NlciwgSU9JbnRlcmZhY2UgJGlvLCBib29sICRkZXZNb2RlLCBib29sICRleGVjdXRlT3BlcmF0aW9ucywgVHJhbnNhY3Rpb24gJHRyYW5zYWN0aW9uKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGV2ZW50TmFtZSk7CgokdGhpcy0+Y29tcG9zZXIgPSAkY29tcG9zZXI7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmRldk1vZGUgPSAkZGV2TW9kZTsKJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zID0gJGV4ZWN1dGVPcGVyYXRpb25zOwokdGhpcy0+dHJhbnNhY3Rpb24gPSAkdHJhbnNhY3Rpb247Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlcigpOiBDb21wb3Nlcgp7CnJldHVybiAkdGhpcy0+Y29tcG9zZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJTygpOiBJT0ludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+aW87Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0Rldk1vZGUoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZGV2TW9kZTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRXhlY3V0aW5nT3BlcmF0aW9ucygpOiBib29sCnsKcmV0dXJuICR0aGlzLT5leGVjdXRlT3BlcmF0aW9uczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uKCk6ID9UcmFuc2FjdGlvbgp7CnJldHVybiAkdGhpcy0+dHJhbnNhY3Rpb247Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKY2xhc3MgSW5zdGFsbGVyRXZlbnRzCnsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX09QRVJBVElPTlNfRVhFQyA9ICdwcmUtb3BlcmF0aW9ucy1leGVjJzsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCmludGVyZmFjZSBJbnN0YWxsZXJJbnRlcmZhY2UKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSW5zdGFsbGVkKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk7CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTsKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cChzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFydGlhbENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXERvd25sb2FkTWFuYWdlcjsKCgoKCgoKCmNsYXNzIExpYnJhcnlJbnN0YWxsZXIgaW1wbGVtZW50cyBJbnN0YWxsZXJJbnRlcmZhY2UsIEJpbmFyeVByZXNlbmNlSW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkY29tcG9zZXI7Cgpwcm90ZWN0ZWQgJHZlbmRvckRpcjsKCnByb3RlY3RlZCAkZG93bmxvYWRNYW5hZ2VyOwoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkdHlwZTsKCnByb3RlY3RlZCAkZmlsZXN5c3RlbTsKCnByb3RlY3RlZCAkYmluYXJ5SW5zdGFsbGVyOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgUGFydGlhbENvbXBvc2VyICRjb21wb3NlciwgP3N0cmluZyAkdHlwZSA9ICdsaWJyYXJ5JywgP0ZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0gPSBudWxsLCA/QmluYXJ5SW5zdGFsbGVyICRiaW5hcnlJbnN0YWxsZXIgPSBudWxsKQp7CiR0aGlzLT5jb21wb3NlciA9ICRjb21wb3NlcjsKJHRoaXMtPmRvd25sb2FkTWFuYWdlciA9ICRjb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyID8gJGNvbXBvc2VyLT5nZXREb3dubG9hZE1hbmFnZXIoKSA6IG51bGw7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPnR5cGUgPSAkdHlwZTsKCiR0aGlzLT5maWxlc3lzdGVtID0gJGZpbGVzeXN0ZW0gPzogbmV3IEZpbGVzeXN0ZW0oKTsKJHRoaXMtPnZlbmRvckRpciA9IHJ0cmltKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgndmVuZG9yLWRpcicpLCAnLycpOwokdGhpcy0+YmluYXJ5SW5zdGFsbGVyID0gJGJpbmFyeUluc3RhbGxlciA/OiBuZXcgQmluYXJ5SW5zdGFsbGVyKCR0aGlzLT5pbywgcnRyaW0oJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdiaW4tZGlyJyksICcvJyksICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYmluLWNvbXBhdCcpLCAkdGhpcy0+ZmlsZXN5c3RlbSwgJHRoaXMtPnZlbmRvckRpcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKQp7CnJldHVybiAkcGFja2FnZVR5cGUgPT09ICR0aGlzLT50eXBlIHx8IG51bGwgPT09ICR0aGlzLT50eXBlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnN0YWxsZWQoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRpbnN0YWxsUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgppZiAoRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkaW5zdGFsbFBhdGgpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmICR0aGlzLT5maWxlc3lzdGVtLT5pc0p1bmN0aW9uKCRpbnN0YWxsUGF0aCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19saW5rKCRpbnN0YWxsUGF0aCkpIHsKaWYgKHJlYWxwYXRoKCRpbnN0YWxsUGF0aCkgPT09IGZhbHNlKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5kb3dubG9hZCgkcGFja2FnZSwgJGRvd25sb2FkUGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5wcmVwYXJlKCR0eXBlLCAkcGFja2FnZSwgJGRvd25sb2FkUGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5jbGVhbnVwKCR0eXBlLCAkcGFja2FnZSwgJGRvd25sb2FkUGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokdGhpcy0+aW5pdGlhbGl6ZVZlbmRvckRpcigpOwokZG93bmxvYWRQYXRoID0gJHRoaXMtPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKCgppZiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGRvd25sb2FkUGF0aCkgJiYgJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CiR0aGlzLT5iaW5hcnlJbnN0YWxsZXItPnJlbW92ZUJpbmFyaWVzKCRwYWNrYWdlKTsKfQoKJHByb21pc2UgPSAkdGhpcy0+aW5zdGFsbENvZGUoJHBhY2thZ2UpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRiaW5hcnlJbnN0YWxsZXIgPSAkdGhpcy0+YmluYXJ5SW5zdGFsbGVyOwokaW5zdGFsbFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRiaW5hcnlJbnN0YWxsZXIsICRpbnN0YWxsUGF0aCwgJHBhY2thZ2UsICRyZXBvKTogdm9pZCB7CiRiaW5hcnlJbnN0YWxsZXItPmluc3RhbGxCaW5hcmllcygkcGFja2FnZSwgJGluc3RhbGxQYXRoKTsKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHBhY2thZ2UpOwp9Cn0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCkKewppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCRpbml0aWFsKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAnLiRpbml0aWFsKTsKfQoKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKCiR0aGlzLT5iaW5hcnlJbnN0YWxsZXItPnJlbW92ZUJpbmFyaWVzKCRpbml0aWFsKTsKJHByb21pc2UgPSAkdGhpcy0+dXBkYXRlQ29kZSgkaW5pdGlhbCwgJHRhcmdldCk7CmlmICghJHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CiRwcm9taXNlID0gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJGJpbmFyeUluc3RhbGxlciA9ICR0aGlzLT5iaW5hcnlJbnN0YWxsZXI7CiRpbnN0YWxsUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkdGFyZ2V0KTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkYmluYXJ5SW5zdGFsbGVyLCAkaW5zdGFsbFBhdGgsICR0YXJnZXQsICRpbml0aWFsLCAkcmVwbyk6IHZvaWQgewokYmluYXJ5SW5zdGFsbGVyLT5pbnN0YWxsQmluYXJpZXMoJHRhcmdldCwgJGluc3RhbGxQYXRoKTsKJHJlcG8tPnJlbW92ZVBhY2thZ2UoJGluaXRpYWwpOwppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCR0YXJnZXQpKSB7CiRyZXBvLT5hZGRQYWNrYWdlKGNsb25lICR0YXJnZXQpOwp9Cn0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgaXMgbm90IGluc3RhbGxlZDogJy4kcGFja2FnZSk7Cn0KCiRwcm9taXNlID0gJHRoaXMtPnJlbW92ZUNvZGUoJHBhY2thZ2UpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRiaW5hcnlJbnN0YWxsZXIgPSAkdGhpcy0+YmluYXJ5SW5zdGFsbGVyOwokZG93bmxvYWRQYXRoID0gJHRoaXMtPmdldFBhY2thZ2VCYXNlUGF0aCgkcGFja2FnZSk7CiRmaWxlc3lzdGVtID0gJHRoaXMtPmZpbGVzeXN0ZW07CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJGJpbmFyeUluc3RhbGxlciwgJGZpbGVzeXN0ZW0sICRkb3dubG9hZFBhdGgsICRwYWNrYWdlLCAkcmVwbyk6IHZvaWQgewokYmluYXJ5SW5zdGFsbGVyLT5yZW1vdmVCaW5hcmllcygkcGFja2FnZSk7CiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRwYWNrYWdlKTsKCmlmIChzdHJwb3MoJHBhY2thZ2UtPmdldE5hbWUoKSwgJy8nKSkgewokcGFja2FnZVZlbmRvckRpciA9IGRpcm5hbWUoJGRvd25sb2FkUGF0aCk7CmlmIChpc19kaXIoJHBhY2thZ2VWZW5kb3JEaXIpICYmICRmaWxlc3lzdGVtLT5pc0RpckVtcHR5KCRwYWNrYWdlVmVuZG9yRGlyKSkgewpTaWxlbmNlcjo6Y2FsbCgncm1kaXInLCAkcGFja2FnZVZlbmRvckRpcik7Cn0KfQp9KTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokdGhpcy0+aW5pdGlhbGl6ZVZlbmRvckRpcigpOwoKJGJhc2VQYXRoID0gKCR0aGlzLT52ZW5kb3JEaXIgPyAkdGhpcy0+dmVuZG9yRGlyLicvJyA6ICcnKSAuICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7CiR0YXJnZXREaXIgPSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCk7CgpyZXR1cm4gJGJhc2VQYXRoIC4gKCR0YXJnZXREaXIgPyAnLycuJHRhcmdldERpciA6ICcnKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5zdXJlQmluYXJpZXNQcmVzZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiR0aGlzLT5iaW5hcnlJbnN0YWxsZXItPmluc3RhbGxCaW5hcmllcygkcGFja2FnZSwgJHRoaXMtPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKSwgZmFsc2UpOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQYWNrYWdlQmFzZVBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokaW5zdGFsbFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwokdGFyZ2V0RGlyID0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpOwoKaWYgKCR0YXJnZXREaXIpIHsKcmV0dXJuIFByZWc6OnJlcGxhY2UoJ3svKicuc3RyX3JlcGxhY2UoJy8nLCAnLysnLCBwcmVnX3F1b3RlKCR0YXJnZXREaXIpKS4nLz8kfScsICcnLCAkaW5zdGFsbFBhdGgpOwp9CgpyZXR1cm4gJGluc3RhbGxQYXRoOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluc3RhbGxDb2RlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5pbnN0YWxsKCRwYWNrYWdlLCAkZG93bmxvYWRQYXRoKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB1cGRhdGVDb2RlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCkKewokaW5pdGlhbERvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkaW5pdGlhbCk7CiR0YXJnZXREb3dubG9hZFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHRhcmdldCk7CmlmICgkdGFyZ2V0RG93bmxvYWRQYXRoICE9PSAkaW5pdGlhbERvd25sb2FkUGF0aCkgewoKCmlmIChzdHJwb3MoJGluaXRpYWxEb3dubG9hZFBhdGgsICR0YXJnZXREb3dubG9hZFBhdGgpID09PSAwCnx8IHN0cnBvcygkdGFyZ2V0RG93bmxvYWRQYXRoLCAkaW5pdGlhbERvd25sb2FkUGF0aCkgPT09IDAKKSB7CiRwcm9taXNlID0gJHRoaXMtPnJlbW92ZUNvZGUoJGluaXRpYWwpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCnJldHVybiAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCR0YXJnZXQpOiBQcm9taXNlSW50ZXJmYWNlIHsKJHByb21pc2UgPSAkdGhpcy0+aW5zdGFsbENvZGUoJHRhcmdldCk7CmlmICgkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKcmV0dXJuICRwcm9taXNlOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfSk7Cn0KCiR0aGlzLT5maWxlc3lzdGVtLT5yZW5hbWUoJGluaXRpYWxEb3dubG9hZFBhdGgsICR0YXJnZXREb3dubG9hZFBhdGgpOwp9CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT51cGRhdGUoJGluaXRpYWwsICR0YXJnZXQsICR0YXJnZXREb3dubG9hZFBhdGgpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbW92ZUNvZGUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokZG93bmxvYWRQYXRoID0gJHRoaXMtPmdldFBhY2thZ2VCYXNlUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5yZW1vdmUoJHBhY2thZ2UsICRkb3dubG9hZFBhdGgpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZVZlbmRvckRpcigpCnsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGhpcy0+dmVuZG9yRGlyKTsKJHRoaXMtPnZlbmRvckRpciA9IHJlYWxwYXRoKCR0aGlzLT52ZW5kb3JEaXIpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RG93bmxvYWRNYW5hZ2VyKCk6IERvd25sb2FkTWFuYWdlcgp7CmFzc2VydCgkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyIGluc3RhbmNlb2YgRG93bmxvYWRNYW5hZ2VyLCBuZXcgXExvZ2ljRXhjZXB0aW9uKHNlbGY6OmNsYXNzLicgc2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggYSBmdWxseSBsb2FkZWQgQ29tcG9zZXIgaW5zdGFuY2UgdG8gYmUgYWJsZSB0byBpbnN0YWxsLy4uLiBwYWNrYWdlcycpKTsKCnJldHVybiAkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVXBkYXRlT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CgoKCgoKCmNsYXNzIE1ldGFwYWNrYWdlSW5zdGFsbGVyIGltcGxlbWVudHMgSW5zdGFsbGVySW50ZXJmYWNlCnsKCnByaXZhdGUgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+aW8gPSAkaW87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKQp7CnJldHVybiAkcGFja2FnZVR5cGUgPT09ICdtZXRhcGFja2FnZSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0luc3RhbGxlZChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CnJldHVybiAkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cCgkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCkKewoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIEluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkpOwoKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHBhY2thZ2UpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJGluaXRpYWwpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICcuJGluaXRpYWwpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gVXBkYXRlT3BlcmF0aW9uOjpmb3JtYXQoJGluaXRpYWwsICR0YXJnZXQpKTsKCiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRpbml0aWFsKTsKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHRhcmdldCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICcuJHBhY2thZ2UpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gVW5pbnN0YWxsT3BlcmF0aW9uOjpmb3JtYXQoJHBhY2thZ2UpKTsKCiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRwYWNrYWdlKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsUGF0aChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CnJldHVybiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCgoKY2xhc3MgTm9vcEluc3RhbGxlciBpbXBsZW1lbnRzIEluc3RhbGxlckludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKQp7CnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnN0YWxsZWQoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewpyZXR1cm4gJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCkKewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhbnVwKCR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CiRyZXBvLT5hZGRQYWNrYWdlKGNsb25lICRwYWNrYWdlKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJGluaXRpYWwpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICcuJGluaXRpYWwpOwp9CgokcmVwby0+cmVtb3ZlUGFja2FnZSgkaW5pdGlhbCk7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHRhcmdldCkpIHsKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHRhcmdldCk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgaXMgbm90IGluc3RhbGxlZDogJy4kcGFja2FnZSk7Cn0KJHJlcG8tPnJlbW92ZVBhY2thZ2UoJHBhY2thZ2UpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsUGF0aChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiR0YXJnZXREaXIgPSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCk7CgpyZXR1cm4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSAuICgkdGFyZ2V0RGlyID8gJy8nLiR0YXJnZXREaXIgOiAnJyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXE9wZXJhdGlvbkludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKCgoKCgoKY2xhc3MgUGFja2FnZUV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRjb21wb3NlcjsKCgoKCnByaXZhdGUgJGlvOwoKCgoKcHJpdmF0ZSAkZGV2TW9kZTsKCgoKCnByaXZhdGUgJGxvY2FsUmVwbzsKCgoKCnByaXZhdGUgJG9wZXJhdGlvbnM7CgoKCgpwcml2YXRlICRvcGVyYXRpb247CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGV2ZW50TmFtZSwgQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8sIGJvb2wgJGRldk1vZGUsIFJlcG9zaXRvcnlJbnRlcmZhY2UgJGxvY2FsUmVwbywgYXJyYXkgJG9wZXJhdGlvbnMsIE9wZXJhdGlvbkludGVyZmFjZSAkb3BlcmF0aW9uKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGV2ZW50TmFtZSk7CgokdGhpcy0+Y29tcG9zZXIgPSAkY29tcG9zZXI7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmRldk1vZGUgPSAkZGV2TW9kZTsKJHRoaXMtPmxvY2FsUmVwbyA9ICRsb2NhbFJlcG87CiR0aGlzLT5vcGVyYXRpb25zID0gJG9wZXJhdGlvbnM7CiR0aGlzLT5vcGVyYXRpb24gPSAkb3BlcmF0aW9uOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXIoKTogQ29tcG9zZXIKewpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SU8oKTogSU9JbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmlvOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNEZXZNb2RlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRldk1vZGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbFJlcG8oKTogUmVwb3NpdG9yeUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+bG9jYWxSZXBvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3BlcmF0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+b3BlcmF0aW9uczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdGlvbigpOiBPcGVyYXRpb25JbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPm9wZXJhdGlvbjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7CgoKCgoKCmNsYXNzIFBhY2thZ2VFdmVudHMKewoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9QQUNLQUdFX0lOU1RBTEwgPSAncHJlLXBhY2thZ2UtaW5zdGFsbCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfUEFDS0FHRV9JTlNUQUxMID0gJ3Bvc3QtcGFja2FnZS1pbnN0YWxsJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX1BBQ0tBR0VfVVBEQVRFID0gJ3ByZS1wYWNrYWdlLXVwZGF0ZSc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfUEFDS0FHRV9VUERBVEUgPSAncG9zdC1wYWNrYWdlLXVwZGF0ZSc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9QQUNLQUdFX1VOSU5TVEFMTCA9ICdwcmUtcGFja2FnZS11bmluc3RhbGwnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX1BBQ0tBR0VfVU5JTlNUQUxMID0gJ3Bvc3QtcGFja2FnZS11bmluc3RhbGwnOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhcnRpYWxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5NYW5hZ2VyOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCmNsYXNzIFBsdWdpbkluc3RhbGxlciBleHRlbmRzIExpYnJhcnlJbnN0YWxsZXIKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBQYXJ0aWFsQ29tcG9zZXIgJGNvbXBvc2VyLCA/RmlsZXN5c3RlbSAkZnMgPSBudWxsLCA/QmluYXJ5SW5zdGFsbGVyICRiaW5hcnlJbnN0YWxsZXIgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGlvLCAkY29tcG9zZXIsICdjb21wb3Nlci1wbHVnaW4nLCAkZnMsICRiaW5hcnlJbnN0YWxsZXIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VwcG9ydHMoc3RyaW5nICRwYWNrYWdlVHlwZSkKewpyZXR1cm4gJHBhY2thZ2VUeXBlID09PSAnY29tcG9zZXItcGx1Z2luJyB8fCAkcGFja2FnZVR5cGUgPT09ICdjb21wb3Nlci1pbnN0YWxsZXInOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZVBsdWdpbnMoKTogdm9pZAp7CiR0aGlzLT5nZXRQbHVnaW5NYW5hZ2VyKCktPmRpc2FibGVQbHVnaW5zKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKCR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CgppZiAoKCR0eXBlID09PSAnaW5zdGFsbCcgfHwgJHR5cGUgPT09ICd1cGRhdGUnKSAmJiAhJHRoaXMtPmdldFBsdWdpbk1hbmFnZXIoKS0+YXJlUGx1Z2luc0Rpc2FibGVkKCdsb2NhbCcpKSB7CiR0aGlzLT5nZXRQbHVnaW5NYW5hZ2VyKCktPmlzUGx1Z2luQWxsb3dlZCgkcGFja2FnZS0+Z2V0TmFtZSgpLCBmYWxzZSwgdHJ1ZSA9PT0gKCRwYWNrYWdlLT5nZXRFeHRyYSgpWydwbHVnaW4tb3B0aW9uYWwnXSA/PyBmYWxzZSkpOwp9CgpyZXR1cm4gcGFyZW50OjpwcmVwYXJlKCR0eXBlLCAkcGFja2FnZSwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKJGV4dHJhID0gJHBhY2thZ2UtPmdldEV4dHJhKCk7CmlmIChlbXB0eSgkZXh0cmFbJ2NsYXNzJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdFcnJvciB3aGlsZSBpbnN0YWxsaW5nICcuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nLCBjb21wb3Nlci1wbHVnaW4gcGFja2FnZXMgc2hvdWxkIGhhdmUgYSBjbGFzcyBkZWZpbmVkIGluIHRoZWlyIGV4dHJhIGtleSB0byBiZSB1c2FibGUuJyk7Cn0KCnJldHVybiBwYXJlbnQ6OmRvd25sb2FkKCRwYWNrYWdlLCAkcHJldlBhY2thZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiRwcm9taXNlID0gcGFyZW50OjppbnN0YWxsKCRyZXBvLCAkcGFja2FnZSk7CmlmICghJHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CiRwcm9taXNlID0gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJHBhY2thZ2UsICRyZXBvKTogdm9pZCB7CnRyeSB7ClBsYXRmb3JtOjp3b3JrYXJvdW5kRmlsZXN5c3RlbUlzc3VlcygpOwokdGhpcy0+Z2V0UGx1Z2luTWFuYWdlcigpLT5yZWdpc3RlclBhY2thZ2UoJHBhY2thZ2UsIHRydWUpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5yb2xsYmFja0luc3RhbGwoJGUsICRyZXBvLCAkcGFja2FnZSk7Cn0KfSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KQp7CiRwcm9taXNlID0gcGFyZW50Ojp1cGRhdGUoJHJlcG8sICRpbml0aWFsLCAkdGFyZ2V0KTsKaWYgKCEkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKJHByb21pc2UgPSBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkaW5pdGlhbCwgJHRhcmdldCwgJHJlcG8pOiB2b2lkIHsKdHJ5IHsKUGxhdGZvcm06Ondvcmthcm91bmRGaWxlc3lzdGVtSXNzdWVzKCk7CiR0aGlzLT5nZXRQbHVnaW5NYW5hZ2VyKCktPmRlYWN0aXZhdGVQYWNrYWdlKCRpbml0aWFsKTsKJHRoaXMtPmdldFBsdWdpbk1hbmFnZXIoKS0+cmVnaXN0ZXJQYWNrYWdlKCR0YXJnZXQsIHRydWUpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5yb2xsYmFja0luc3RhbGwoJGUsICRyZXBvLCAkdGFyZ2V0KTsKfQp9KTsKfQoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiR0aGlzLT5nZXRQbHVnaW5NYW5hZ2VyKCktPnVuaW5zdGFsbFBhY2thZ2UoJHBhY2thZ2UpOwoKcmV0dXJuIHBhcmVudDo6dW5pbnN0YWxsKCRyZXBvLCAkcGFja2FnZSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcm9sbGJhY2tJbnN0YWxsKFxFeGNlcHRpb24gJGUsIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdQbHVnaW4gaW5pdGlhbGl6YXRpb24gZmFpbGVkICgnLiRlLT5nZXRNZXNzYWdlKCkuJyksIHVuaW5zdGFsbGluZyBwbHVnaW4nKTsKcGFyZW50Ojp1bmluc3RhbGwoJHJlcG8sICRwYWNrYWdlKTsKdGhyb3cgJGU7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQbHVnaW5NYW5hZ2VyKCk6IFBsdWdpbk1hbmFnZXIKewphc3NlcnQoJHRoaXMtPmNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIsIG5ldyBcTG9naWNFeGNlcHRpb24oc2VsZjo6Y2xhc3MuJyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIGZ1bGx5IGxvYWRlZCBDb21wb3NlciBpbnN0YW5jZS4nKSk7CiRwbHVnaW5NYW5hZ2VyID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRQbHVnaW5NYW5hZ2VyKCk7CgpyZXR1cm4gJHBsdWdpbk1hbmFnZXI7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRG93bmxvYWRNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwoKCgoKCgoKY2xhc3MgUHJvamVjdEluc3RhbGxlciBpbXBsZW1lbnRzIEluc3RhbGxlckludGVyZmFjZQp7Cgpwcml2YXRlICRpbnN0YWxsUGF0aDsKCnByaXZhdGUgJGRvd25sb2FkTWFuYWdlcjsKCnByaXZhdGUgJGZpbGVzeXN0ZW07CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRpbnN0YWxsUGF0aCwgRG93bmxvYWRNYW5hZ2VyICRkbSwgRmlsZXN5c3RlbSAkZnMpCnsKJHRoaXMtPmluc3RhbGxQYXRoID0gcnRyaW0oc3RydHIoJGluc3RhbGxQYXRoLCAnXFwnLCAnLycpLCAnLycpLicvJzsKJHRoaXMtPmRvd25sb2FkTWFuYWdlciA9ICRkbTsKJHRoaXMtPmZpbGVzeXN0ZW0gPSAkZnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKTogYm9vbAp7CnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnN0YWxsZWQoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogP1Byb21pc2VJbnRlcmZhY2UKewokaW5zdGFsbFBhdGggPSAkdGhpcy0+aW5zdGFsbFBhdGg7CmlmIChmaWxlX2V4aXN0cygkaW5zdGFsbFBhdGgpICYmICEkdGhpcy0+ZmlsZXN5c3RlbS0+aXNEaXJFbXB0eSgkaW5zdGFsbFBhdGgpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9qZWN0IGRpcmVjdG9yeSAkaW5zdGFsbFBhdGggaXMgbm90IGVtcHR5LiIpOwp9CmlmICghaXNfZGlyKCRpbnN0YWxsUGF0aCkpIHsKbWtkaXIoJGluc3RhbGxQYXRoLCAwNzc3LCB0cnVlKTsKfQoKcmV0dXJuICR0aGlzLT5kb3dubG9hZE1hbmFnZXItPmRvd25sb2FkKCRwYWNrYWdlLCAkaW5zdGFsbFBhdGgsICRwcmV2UGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKCR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogP1Byb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmRvd25sb2FkTWFuYWdlci0+cHJlcGFyZSgkdHlwZSwgJHBhY2thZ2UsICR0aGlzLT5pbnN0YWxsUGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiA/UHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyLT5jbGVhbnVwKCR0eXBlLCAkcGFja2FnZSwgJHRoaXMtPmluc3RhbGxQYXRoLCAkcHJldlBhY2thZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogP1Byb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmRvd25sb2FkTWFuYWdlci0+aW5zdGFsbCgkcGFja2FnZSwgJHRoaXMtPmluc3RhbGxQYXRoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVwZGF0ZShJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQpOiA/UHJvbWlzZUludGVyZmFjZQp7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJub3Qgc3VwcG9ydGVkIik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6ID9Qcm9taXNlSW50ZXJmYWNlCnsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIm5vdCBzdXBwb3J0ZWQiKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+aW5zdGFsbFBhdGg7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwoKCgoKCgpjbGFzcyBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyCnsKcHVibGljIGNvbnN0IE1PREVfTElTVCA9IDE7CnB1YmxpYyBjb25zdCBNT0RFX0JZX1BBQ0tBR0UgPSAyOwpwdWJsaWMgY29uc3QgTU9ERV9CWV9TVUdHRVNUSU9OID0gNDsKCgoKCnByb3RlY3RlZCAkc3VnZ2VzdGVkUGFja2FnZXMgPSBbXTsKCgoKCnByaXZhdGUgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+aW8gPSAkaW87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXM7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUGFja2FnZShzdHJpbmcgJHNvdXJjZSwgc3RyaW5nICR0YXJnZXQsIHN0cmluZyAkcmVhc29uKTogU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcgp7CiR0aGlzLT5zdWdnZXN0ZWRQYWNrYWdlc1tdID0gWwonc291cmNlJyA9PiAkc291cmNlLAondGFyZ2V0JyA9PiAkdGFyZ2V0LAoncmVhc29uJyA9PiAkcmVhc29uLApdOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkU3VnZ2VzdGlvbnNGcm9tUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcgp7CiRzb3VyY2UgPSAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwpmb3JlYWNoICgkcGFja2FnZS0+Z2V0U3VnZ2VzdHMoKSBhcyAkdGFyZ2V0ID0+ICRyZWFzb24pIHsKJHRoaXMtPmFkZFBhY2thZ2UoCiRzb3VyY2UsCiR0YXJnZXQsCiRyZWFzb24KKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gb3V0cHV0KGludCAkbW9kZSwgP0luc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8gPSBudWxsLCA/UGFja2FnZUludGVyZmFjZSAkb25seURlcGVuZGVudHNPZiA9IG51bGwpOiB2b2lkCnsKJHN1Z2dlc3RlZFBhY2thZ2VzID0gJHRoaXMtPmdldEZpbHRlcmVkU3VnZ2VzdGlvbnMoJGluc3RhbGxlZFJlcG8sICRvbmx5RGVwZW5kZW50c09mKTsKCiRzdWdnZXN0ZXJzID0gW107CiRzdWdnZXN0ZWQgPSBbXTsKZm9yZWFjaCAoJHN1Z2dlc3RlZFBhY2thZ2VzIGFzICRzdWdnZXN0aW9uKSB7CiRzdWdnZXN0ZXJzWyRzdWdnZXN0aW9uWydzb3VyY2UnXV1bJHN1Z2dlc3Rpb25bJ3RhcmdldCddXSA9ICRzdWdnZXN0aW9uWydyZWFzb24nXTsKJHN1Z2dlc3RlZFskc3VnZ2VzdGlvblsndGFyZ2V0J11dWyRzdWdnZXN0aW9uWydzb3VyY2UnXV0gPSAkc3VnZ2VzdGlvblsncmVhc29uJ107Cn0Ka3NvcnQoJHN1Z2dlc3RlcnMpOwprc29ydCgkc3VnZ2VzdGVkKTsKCgppZiAoJG1vZGUgJiBzZWxmOjpNT0RFX0xJU1QpIHsKZm9yZWFjaCAoYXJyYXlfa2V5cygkc3VnZ2VzdGVkKSBhcyAkbmFtZSkgewokdGhpcy0+aW8tPndyaXRlKHNwcmludGYoJzxpbmZvPiVzPC9pbmZvPicsICRuYW1lKSk7Cn0KCnJldHVybjsKfQoKCmlmICgkbW9kZSAmIHNlbGY6Ok1PREVfQllfUEFDS0FHRSkgewpmb3JlYWNoICgkc3VnZ2VzdGVycyBhcyAkc3VnZ2VzdGVyID0+ICRzdWdnZXN0aW9ucykgewokdGhpcy0+aW8tPndyaXRlKHNwcmludGYoJzxjb21tZW50PiVzPC9jb21tZW50PiBzdWdnZXN0czonLCAkc3VnZ2VzdGVyKSk7Cgpmb3JlYWNoICgkc3VnZ2VzdGlvbnMgYXMgJHN1Z2dlc3Rpb24gPT4gJHJlYXNvbikgewokdGhpcy0+aW8tPndyaXRlKHNwcmludGYoJyAtIDxpbmZvPiVzPC9pbmZvPicgLiAoJHJlYXNvbiA/ICc6ICVzJyA6ICcnKSwgJHN1Z2dlc3Rpb24sICR0aGlzLT5lc2NhcGVPdXRwdXQoJHJlYXNvbikpKTsKfQokdGhpcy0+aW8tPndyaXRlKCcnKTsKfQp9CgoKaWYgKCRtb2RlICYgc2VsZjo6TU9ERV9CWV9TVUdHRVNUSU9OKSB7CgppZiAoJG1vZGUgJiBzZWxmOjpNT0RFX0JZX1BBQ0tBR0UpIHsKJHRoaXMtPmlvLT53cml0ZShzdHJfcmVwZWF0KCctJywgNzgpKTsKfQpmb3JlYWNoICgkc3VnZ2VzdGVkIGFzICRzdWdnZXN0aW9uID0+ICRzdWdnZXN0ZXJzKSB7CiR0aGlzLT5pby0+d3JpdGUoc3ByaW50ZignPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+IGlzIHN1Z2dlc3RlZCBieTonLCAkc3VnZ2VzdGlvbikpOwoKZm9yZWFjaCAoJHN1Z2dlc3RlcnMgYXMgJHN1Z2dlc3RlciA9PiAkcmVhc29uKSB7CiR0aGlzLT5pby0+d3JpdGUoc3ByaW50ZignIC0gPGluZm8+JXM8L2luZm8+JyAuICgkcmVhc29uID8gJzogJXMnIDogJycpLCAkc3VnZ2VzdGVyLCAkdGhpcy0+ZXNjYXBlT3V0cHV0KCRyZWFzb24pKSk7Cn0KJHRoaXMtPmlvLT53cml0ZSgnJyk7Cn0KfQoKaWYgKCRvbmx5RGVwZW5kZW50c09mKSB7CiRhbGxTdWdnZXN0ZWRQYWNrYWdlcyA9ICR0aGlzLT5nZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCRpbnN0YWxsZWRSZXBvKTsKJGRpZmYgPSBjb3VudCgkYWxsU3VnZ2VzdGVkUGFja2FnZXMpIC0gY291bnQoJHN1Z2dlc3RlZFBhY2thZ2VzKTsKaWYgKCRkaWZmKSB7CiR0aGlzLT5pby0+d3JpdGUoJzxpbmZvPicuJGRpZmYuJyBhZGRpdGlvbmFsIHN1Z2dlc3Rpb25zPC9pbmZvPiBieSB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBjYW4gYmUgc2hvd24gd2l0aCA8aW5mbz4tLWFsbDwvaW5mbz4nKTsKfQp9Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvdXRwdXRNaW5pbWFsaXN0aWMoP0luc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8gPSBudWxsLCA/UGFja2FnZUludGVyZmFjZSAkb25seURlcGVuZGVudHNPZiA9IG51bGwpOiB2b2lkCnsKJHN1Z2dlc3RlZFBhY2thZ2VzID0gJHRoaXMtPmdldEZpbHRlcmVkU3VnZ2VzdGlvbnMoJGluc3RhbGxlZFJlcG8sICRvbmx5RGVwZW5kZW50c09mKTsKaWYgKCRzdWdnZXN0ZWRQYWNrYWdlcykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPicuY291bnQoJHN1Z2dlc3RlZFBhY2thZ2VzKS4nIHBhY2thZ2Ugc3VnZ2VzdGlvbnMgd2VyZSBhZGRlZCBieSBuZXcgZGVwZW5kZW5jaWVzLCB1c2UgYGNvbXBvc2VyIHN1Z2dlc3RgIHRvIHNlZSBkZXRhaWxzLjwvaW5mbz4nKTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RmlsdGVyZWRTdWdnZXN0aW9ucyg/SW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbyA9IG51bGwsID9QYWNrYWdlSW50ZXJmYWNlICRvbmx5RGVwZW5kZW50c09mID0gbnVsbCk6IGFycmF5CnsKJHN1Z2dlc3RlZFBhY2thZ2VzID0gJHRoaXMtPmdldFBhY2thZ2VzKCk7CiRpbnN0YWxsZWROYW1lcyA9IFtdOwppZiAobnVsbCAhPT0gJGluc3RhbGxlZFJlcG8gJiYgIWVtcHR5KCRzdWdnZXN0ZWRQYWNrYWdlcykpIHsKZm9yZWFjaCAoJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJGluc3RhbGxlZE5hbWVzID0gYXJyYXlfbWVyZ2UoCiRpbnN0YWxsZWROYW1lcywKJHBhY2thZ2UtPmdldE5hbWVzKCkKKTsKfQp9Cgokc291cmNlRmlsdGVyID0gW107CmlmICgkb25seURlcGVuZGVudHNPZikgewokc291cmNlRmlsdGVyID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGxpbmspOiBzdHJpbmcgewpyZXR1cm4gJGxpbmstPmdldFRhcmdldCgpOwp9LCBhcnJheV9tZXJnZSgkb25seURlcGVuZGVudHNPZi0+Z2V0UmVxdWlyZXMoKSwgJG9ubHlEZXBlbmRlbnRzT2YtPmdldERldlJlcXVpcmVzKCkpKTsKJHNvdXJjZUZpbHRlcltdID0gJG9ubHlEZXBlbmRlbnRzT2YtPmdldE5hbWUoKTsKfQoKJHN1Z2dlc3Rpb25zID0gW107CmZvcmVhY2ggKCRzdWdnZXN0ZWRQYWNrYWdlcyBhcyAkc3VnZ2VzdGlvbikgewppZiAoaW5fYXJyYXkoJHN1Z2dlc3Rpb25bJ3RhcmdldCddLCAkaW5zdGFsbGVkTmFtZXMpIHx8IChcY291bnQoJHNvdXJjZUZpbHRlcikgPiAwICYmICFpbl9hcnJheSgkc3VnZ2VzdGlvblsnc291cmNlJ10sICRzb3VyY2VGaWx0ZXIpKSkgewpjb250aW51ZTsKfQoKJHN1Z2dlc3Rpb25zW10gPSAkc3VnZ2VzdGlvbjsKfQoKcmV0dXJuICRzdWdnZXN0aW9uczsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBlc2NhcGVPdXRwdXQoc3RyaW5nICRzdHJpbmcpOiBzdHJpbmcKewpyZXR1cm4gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoCiR0aGlzLT5yZW1vdmVDb250cm9sQ2hhcmFjdGVycygkc3RyaW5nKQopOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJlbW92ZUNvbnRyb2xDaGFyYWN0ZXJzKHN0cmluZyAkc3RyaW5nKTogc3RyaW5nCnsKcmV0dXJuIFByZWc6OnJlcGxhY2UoCicvW1s6Y250cmw6XV0vJywKJycsCnN0cl9yZXBsYWNlKCJcbiIsICcgJywgJHN0cmluZykKKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxKc29uOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIEpzb25TY2hlbWFcVmFsaWRhdG9yOwp1c2UgU2VsZFxKc29uTGludFxKc29uUGFyc2VyOwp1c2UgU2VsZFxKc29uTGludFxQYXJzaW5nRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CgoKCgoKCgpjbGFzcyBKc29uRmlsZQp7CnB1YmxpYyBjb25zdCBMQVhfU0NIRU1BID0gMTsKcHVibGljIGNvbnN0IFNUUklDVF9TQ0hFTUEgPSAyOwpwdWJsaWMgY29uc3QgQVVUSF9TQ0hFTUEgPSAzOwpwdWJsaWMgY29uc3QgTE9DS19TQ0hFTUEgPSA0OwoKCnB1YmxpYyBjb25zdCBKU09OX1VORVNDQVBFRF9TTEFTSEVTID0gNjQ7CgpwdWJsaWMgY29uc3QgSlNPTl9QUkVUVFlfUFJJTlQgPSAxMjg7CgpwdWJsaWMgY29uc3QgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSA9IDI1NjsKCnB1YmxpYyBjb25zdCBDT01QT1NFUl9TQ0hFTUFfUEFUSCA9IF9fRElSX18gLiAnLy4uLy4uLy4uL3Jlcy9jb21wb3Nlci1zY2hlbWEuanNvbic7CnB1YmxpYyBjb25zdCBMT0NLX1NDSEVNQV9QQVRIID0gX19ESVJfXyAuICcvLi4vLi4vLi4vcmVzL2NvbXBvc2VyLWxvY2stc2NoZW1hLmpzb24nOwoKcHVibGljIGNvbnN0IElOREVOVF9ERUZBVUxUID0gJyAgICAnOwoKCnByaXZhdGUgJHBhdGg7Cgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCnByaXZhdGUgJGlvOwoKcHJpdmF0ZSAkaW5kZW50ID0gc2VsZjo6SU5ERU5UX0RFRkFVTFQ7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHBhdGgsID9IdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIgPSBudWxsLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewokdGhpcy0+cGF0aCA9ICRwYXRoOwoKaWYgKG51bGwgPT09ICRodHRwRG93bmxvYWRlciAmJiBQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovL31pJywgJHBhdGgpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdodHRwIHVybHMgcmVxdWlyZSBhIEh0dHBEb3dubG9hZGVyIGluc3RhbmNlIHRvIGJlIHBhc3NlZCcpOwp9CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPmlvID0gJGlvOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGF0aCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnBhdGg7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBleGlzdHMoKTogYm9vbAp7CnJldHVybiBpc19maWxlKCR0aGlzLT5wYXRoKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZWFkKCkKewp0cnkgewppZiAoJHRoaXMtPmh0dHBEb3dubG9hZGVyKSB7CiRqc29uID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHRoaXMtPnBhdGgpLT5nZXRCb2R5KCk7Cn0gZWxzZSB7CmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkdGhpcy0+cGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgZmlsZSAiJy4kdGhpcy0+cGF0aC4nIiBpcyBub3QgcmVhZGFibGUuJyk7Cn0KaWYgKCR0aGlzLT5pbyAmJiAkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokcmVhbHBhdGhJbmZvID0gJyc7CiRyZWFscGF0aCA9IHJlYWxwYXRoKCR0aGlzLT5wYXRoKTsKaWYgKGZhbHNlICE9PSAkcmVhbHBhdGggJiYgJHJlYWxwYXRoICE9PSAkdGhpcy0+cGF0aCkgewokcmVhbHBhdGhJbmZvID0gJyAoJyAuICRyZWFscGF0aCAuICcpJzsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1JlYWRpbmcgJyAuICR0aGlzLT5wYXRoIC4gJHJlYWxwYXRoSW5mbyk7Cn0KJGpzb24gPSBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+cGF0aCk7Cn0KfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkZS0+Z2V0TWVzc2FnZSgpLCAwLCAkZSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcmVhZCAnLiR0aGlzLT5wYXRoLiJcblxuIi4kZS0+Z2V0TWVzc2FnZSgpKTsKfQoKaWYgKCRqc29uID09PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCByZWFkICcuJHRoaXMtPnBhdGgpOwp9CgokdGhpcy0+aW5kZW50ID0gc2VsZjo6ZGV0ZWN0SW5kZW50aW5nKCRqc29uKTsKCnJldHVybiBzdGF0aWM6OnBhcnNlSnNvbigkanNvbiwgJHRoaXMtPnBhdGgpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZShhcnJheSAkaGFzaCwgaW50ICRvcHRpb25zID0gSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyB8IEpTT05fUFJFVFRZX1BSSU5UIHwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSkKewppZiAoJHRoaXMtPnBhdGggPT09ICdwaHA6Ly9tZW1vcnknKSB7CmZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5wYXRoLCBzdGF0aWM6OmVuY29kZSgkaGFzaCwgJG9wdGlvbnMsICR0aGlzLT5pbmRlbnQpKTsKCnJldHVybjsKfQoKJGRpciA9IGRpcm5hbWUoJHRoaXMtPnBhdGgpOwppZiAoIWlzX2RpcigkZGlyKSkgewppZiAoZmlsZV9leGlzdHMoJGRpcikpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oCnJlYWxwYXRoKCRkaXIpLicgZXhpc3RzIGFuZCBpcyBub3QgYSBkaXJlY3RvcnkuJwopOwp9CmlmICghQG1rZGlyKCRkaXIsIDA3NzcsIHRydWUpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKAokZGlyLicgZG9lcyBub3QgZXhpc3QgYW5kIGNvdWxkIG5vdCBiZSBjcmVhdGVkLicKKTsKfQp9CgokcmV0cmllcyA9IDM7CndoaWxlICgkcmV0cmllcy0tKSB7CnRyeSB7CiR0aGlzLT5maWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKCR0aGlzLT5wYXRoLCBzdGF0aWM6OmVuY29kZSgkaGFzaCwgJG9wdGlvbnMsICR0aGlzLT5pbmRlbnQpLiAoJG9wdGlvbnMgJiBKU09OX1BSRVRUWV9QUklOVCA/ICJcbiIgOiAnJykpOwpicmVhazsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJHJldHJpZXMgPiAwKSB7CnVzbGVlcCg1MDAwMDApOwpjb250aW51ZTsKfQoKdGhyb3cgJGU7Cn0KfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZChzdHJpbmcgJHBhdGgsIHN0cmluZyAkY29udGVudCkKewokY3VycmVudENvbnRlbnQgPSBAZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwppZiAoZmFsc2UgPT09ICRjdXJyZW50Q29udGVudCB8fCAkY3VycmVudENvbnRlbnQgIT09ICRjb250ZW50KSB7CnJldHVybiBmaWxlX3B1dF9jb250ZW50cygkcGF0aCwgJGNvbnRlbnQpOwp9CgpyZXR1cm4gMDsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVTY2hlbWEoaW50ICRzY2hlbWEgPSBzZWxmOjpTVFJJQ1RfU0NIRU1BLCA/c3RyaW5nICRzY2hlbWFGaWxlID0gbnVsbCk6IGJvb2wKewppZiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJHRoaXMtPnBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIGZpbGUgIicuJHRoaXMtPnBhdGguJyIgaXMgbm90IHJlYWRhYmxlLicpOwp9CiRjb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPnBhdGgpOwokZGF0YSA9IGpzb25fZGVjb2RlKCRjb250ZW50KTsKCmlmIChudWxsID09PSAkZGF0YSAmJiAnbnVsbCcgIT09ICRjb250ZW50KSB7CnNlbGY6OnZhbGlkYXRlU3ludGF4KCRjb250ZW50LCAkdGhpcy0+cGF0aCk7Cn0KCnJldHVybiBzZWxmOjp2YWxpZGF0ZUpzb25TY2hlbWEoJHRoaXMtPnBhdGgsICRkYXRhLCAkc2NoZW1hLCAkc2NoZW1hRmlsZSk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUpzb25TY2hlbWEoc3RyaW5nICRzb3VyY2UsICRkYXRhLCBpbnQgJHNjaGVtYSwgP3N0cmluZyAkc2NoZW1hRmlsZSA9IG51bGwpOiBib29sCnsKJGlzQ29tcG9zZXJTY2hlbWFGaWxlID0gZmFsc2U7CmlmIChudWxsID09PSAkc2NoZW1hRmlsZSkgewppZiAoJHNjaGVtYSA9PT0gc2VsZjo6TE9DS19TQ0hFTUEpIHsKJHNjaGVtYUZpbGUgPSBzZWxmOjpMT0NLX1NDSEVNQV9QQVRIOwp9IGVsc2UgewokaXNDb21wb3NlclNjaGVtYUZpbGUgPSB0cnVlOwokc2NoZW1hRmlsZSA9IHNlbGY6OkNPTVBPU0VSX1NDSEVNQV9QQVRIOwp9Cn0KCgppZiAoZmFsc2UgPT09IHN0cnBvcygkc2NoZW1hRmlsZSwgJzovLycpKSB7CiRzY2hlbWFGaWxlID0gJ2ZpbGU6Ly8nIC4gJHNjaGVtYUZpbGU7Cn0KCiRzY2hlbWFEYXRhID0gKG9iamVjdCkgWyckcmVmJyA9PiAkc2NoZW1hRmlsZSwgJyRzY2hlbWEnID0+ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIl07CgppZiAoJHNjaGVtYSA9PT0gc2VsZjo6U1RSSUNUX1NDSEVNQSAmJiAkaXNDb21wb3NlclNjaGVtYUZpbGUpIHsKJHNjaGVtYURhdGEgPSBqc29uX2RlY29kZSgoc3RyaW5nKSBmaWxlX2dldF9jb250ZW50cygkc2NoZW1hRmlsZSkpOwokc2NoZW1hRGF0YS0+YWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZTsKJHNjaGVtYURhdGEtPnJlcXVpcmVkID0gWyduYW1lJywgJ2Rlc2NyaXB0aW9uJ107Cn0gZWxzZWlmICgkc2NoZW1hID09PSBzZWxmOjpBVVRIX1NDSEVNQSAmJiAkaXNDb21wb3NlclNjaGVtYUZpbGUpIHsKJHNjaGVtYURhdGEgPSAob2JqZWN0KSBbJyRyZWYnID0+ICRzY2hlbWFGaWxlLicjL3Byb3BlcnRpZXMvY29uZmlnJywgJyRzY2hlbWEnID0+ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIl07Cn0KCiR2YWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKCk7CgokZGF0YSA9IGpzb25fZGVjb2RlKChzdHJpbmcpIGpzb25fZW5jb2RlKCRkYXRhKSk7CiR2YWxpZGF0b3ItPnZhbGlkYXRlKCRkYXRhLCAkc2NoZW1hRGF0YSk7CgppZiAoISR2YWxpZGF0b3ItPmlzVmFsaWQoKSkgewokZXJyb3JzID0gW107CmZvcmVhY2ggKCR2YWxpZGF0b3ItPmdldEVycm9ycygpIGFzICRlcnJvcikgewokZXJyb3JzW10gPSAoJGVycm9yWydwcm9wZXJ0eSddID8gJGVycm9yWydwcm9wZXJ0eSddLicgOiAnIDogJycpLiRlcnJvclsnbWVzc2FnZSddOwp9CnRocm93IG5ldyBKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbignIicuJHNvdXJjZS4nIiBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgSlNPTiBzY2hlbWEnLCAkZXJyb3JzKTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGUoJGRhdGEsIGludCAkb3B0aW9ucyA9IDQ0OCwgc3RyaW5nICRpbmRlbnQgPSBzZWxmOjpJTkRFTlRfREVGQVVMVCk6IHN0cmluZwp7CiRqc29uID0ganNvbl9lbmNvZGUoJGRhdGEsICRvcHRpb25zKTsKCmlmIChmYWxzZSA9PT0gJGpzb24pIHsKc2VsZjo6dGhyb3dFbmNvZGVFcnJvcihqc29uX2xhc3RfZXJyb3IoKSk7Cn0KCmlmICgoJG9wdGlvbnMgJiBKU09OX1BSRVRUWV9QUklOVCkgPiAwICYmICRpbmRlbnQgIT09IHNlbGY6OklOREVOVF9ERUZBVUxUICkgewoKcmV0dXJuIFByZWc6OnJlcGxhY2VDYWxsYmFjaygKJyNeIHs0LH0jbScsCnN0YXRpYyBmdW5jdGlvbiAoJG1hdGNoKSB1c2UgKCRpbmRlbnQpOiBzdHJpbmcgewpyZXR1cm4gc3RyX3JlcGVhdCgkaW5kZW50LCAoaW50KShzdHJsZW4oJG1hdGNoWzBdKSAvIDQpKTsKfSwKJGpzb24KKTsKfQoKcmV0dXJuICRqc29uOwp9CgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gdGhyb3dFbmNvZGVFcnJvcihpbnQgJGNvZGUpOiB2b2lkCnsKc3dpdGNoICgkY29kZSkgewpjYXNlIEpTT05fRVJST1JfREVQVEg6CiRtc2cgPSAnTWF4aW11bSBzdGFjayBkZXB0aCBleGNlZWRlZCc7CmJyZWFrOwpjYXNlIEpTT05fRVJST1JfU1RBVEVfTUlTTUFUQ0g6CiRtc2cgPSAnVW5kZXJmbG93IG9yIHRoZSBtb2RlcyBtaXNtYXRjaCc7CmJyZWFrOwpjYXNlIEpTT05fRVJST1JfQ1RSTF9DSEFSOgokbXNnID0gJ1VuZXhwZWN0ZWQgY29udHJvbCBjaGFyYWN0ZXIgZm91bmQnOwpicmVhazsKY2FzZSBKU09OX0VSUk9SX1VURjg6CiRtc2cgPSAnTWFsZm9ybWVkIFVURi04IGNoYXJhY3RlcnMsIHBvc3NpYmx5IGluY29ycmVjdGx5IGVuY29kZWQnOwpicmVhazsKZGVmYXVsdDoKJG1zZyA9ICdVbmtub3duIGVycm9yJzsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdKU09OIGVuY29kaW5nIGZhaWxlZDogJy4kbXNnKTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZUpzb24oP3N0cmluZyAkanNvbiwgP3N0cmluZyAkZmlsZSA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRqc29uKSB7CnJldHVybiBudWxsOwp9CiRkYXRhID0ganNvbl9kZWNvZGUoJGpzb24sIHRydWUpOwppZiAobnVsbCA9PT0gJGRhdGEgJiYgSlNPTl9FUlJPUl9OT05FICE9PSBqc29uX2xhc3RfZXJyb3IoKSkgewpzZWxmOjp2YWxpZGF0ZVN5bnRheCgkanNvbiwgJGZpbGUpOwp9CgpyZXR1cm4gJGRhdGE7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZVN5bnRheChzdHJpbmcgJGpzb24sID9zdHJpbmcgJGZpbGUgPSBudWxsKTogYm9vbAp7CiRwYXJzZXIgPSBuZXcgSnNvblBhcnNlcigpOwokcmVzdWx0ID0gJHBhcnNlci0+bGludCgkanNvbik7CmlmIChudWxsID09PSAkcmVzdWx0KSB7CmlmIChkZWZpbmVkKCdKU09OX0VSUk9SX1VURjgnKSAmJiBKU09OX0VSUk9SX1VURjggPT09IGpzb25fbGFzdF9lcnJvcigpKSB7CmlmICgkZmlsZSA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignVGhlIGlucHV0IGlzIG5vdCBVVEYtOCwgY291bGQgbm90IHBhcnNlIGFzIEpTT04nKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJyInIC4gJGZpbGUgLiAnIiBpcyBub3QgVVRGLTgsIGNvdWxkIG5vdCBwYXJzZSBhcyBKU09OJyk7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCmlmICgkZmlsZSA9PT0gbnVsbCkgewp0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbignVGhlIGlucHV0IGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgSlNPTicgLiAiXG4iIC4gJHJlc3VsdC0+Z2V0TWVzc2FnZSgpLAokcmVzdWx0LT5nZXREZXRhaWxzKCkpOwp9IGVsc2Ugewp0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbignIicgLiAkZmlsZSAuICciIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgSlNPTicgLiAiXG4iIC4gJHJlc3VsdC0+Z2V0TWVzc2FnZSgpLAokcmVzdWx0LT5nZXREZXRhaWxzKCkpOwp9Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGV0ZWN0SW5kZW50aW5nKD9zdHJpbmcgJGpzb24pOiBzdHJpbmcKewppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnI14oWyBcdF0rKSIjbScsICRqc29uID8/ICcnLCAkbWF0Y2gpKSB7CnJldHVybiAkbWF0Y2hbMV07Cn0KcmV0dXJuIHNlbGY6OklOREVOVF9ERUZBVUxUOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEpzb247Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCgoKCgoKCmNsYXNzIEpzb25Gb3JtYXR0ZXIKewoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdChzdHJpbmcgJGpzb24sIGJvb2wgJHVuZXNjYXBlVW5pY29kZSwgYm9vbCAkdW5lc2NhcGVTbGFzaGVzKTogc3RyaW5nCnsKJHJlc3VsdCA9ICcnOwokcG9zID0gMDsKJHN0ckxlbiA9IHN0cmxlbigkanNvbik7CiRpbmRlbnRTdHIgPSAnICAgICc7CiRuZXdMaW5lID0gIlxuIjsKJG91dE9mUXVvdGVzID0gdHJ1ZTsKJGJ1ZmZlciA9ICcnOwokbm9lc2NhcGUgPSB0cnVlOwoKZm9yICgkaSA9IDA7ICRpIDwgJHN0ckxlbjsgJGkrKykgewoKJGNoYXIgPSBzdWJzdHIoJGpzb24sICRpLCAxKTsKCgppZiAoJyInID09PSAkY2hhciAmJiAkbm9lc2NhcGUpIHsKJG91dE9mUXVvdGVzID0gISRvdXRPZlF1b3RlczsKfQoKaWYgKCEkb3V0T2ZRdW90ZXMpIHsKJGJ1ZmZlciAuPSAkY2hhcjsKJG5vZXNjYXBlID0gJ1xcJyA9PT0gJGNoYXIgPyAhJG5vZXNjYXBlIDogdHJ1ZTsKY29udGludWU7Cn0KaWYgKCcnICE9PSAkYnVmZmVyKSB7CmlmICgkdW5lc2NhcGVTbGFzaGVzKSB7CiRidWZmZXIgPSBzdHJfcmVwbGFjZSgnXFwvJywgJy8nLCAkYnVmZmVyKTsKfQoKaWYgKCR1bmVzY2FwZVVuaWNvZGUgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2VuY29kaW5nJykpIHsKCiRidWZmZXIgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJy8oXFxcXCspdShbMC05YS1mXXs0fSkvaScsIHN0YXRpYyBmdW5jdGlvbiAoJG1hdGNoKTogc3RyaW5nIHsKJGwgPSBzdHJsZW4oJG1hdGNoWzFdKTsKCmlmICgkbCAlIDIpIHsKJGNvZGUgPSBoZXhkZWMoJG1hdGNoWzJdKTsKCgppZiAoMHhEODAwIDw9ICRjb2RlICYmIDB4REZGRiA+PSAkY29kZSkgewpyZXR1cm4gJG1hdGNoWzBdOwp9CgpyZXR1cm4gc3RyX3JlcGVhdCgnXFwnLCAkbCAtIDEpIC4gbWJfY29udmVydF9lbmNvZGluZygKcGFjaygnSConLCAkbWF0Y2hbMl0pLAonVVRGLTgnLAonVUNTLTJCRScKKTsKfQoKcmV0dXJuICRtYXRjaFswXTsKfSwgJGJ1ZmZlcik7Cn0KCiRyZXN1bHQgLj0gJGJ1ZmZlci4kY2hhcjsKJGJ1ZmZlciA9ICcnOwpjb250aW51ZTsKfQoKaWYgKCc6JyA9PT0gJGNoYXIpIHsKCiRjaGFyIC49ICcgJzsKfSBlbHNlaWYgKCd9JyA9PT0gJGNoYXIgfHwgJ10nID09PSAkY2hhcikgewokcG9zLS07CiRwcmV2Q2hhciA9IHN1YnN0cigkanNvbiwgJGkgLSAxLCAxKTsKCmlmICgneycgIT09ICRwcmV2Q2hhciAmJiAnWycgIT09ICRwcmV2Q2hhcikgewoKCiRyZXN1bHQgLj0gJG5ld0xpbmU7CiRyZXN1bHQgLj0gc3RyX3JlcGVhdCgkaW5kZW50U3RyLCAkcG9zKTsKfSBlbHNlIHsKCiRyZXN1bHQgPSBydHJpbSgkcmVzdWx0KTsKfQp9CgokcmVzdWx0IC49ICRjaGFyOwoKCgppZiAoJywnID09PSAkY2hhciB8fCAneycgPT09ICRjaGFyIHx8ICdbJyA9PT0gJGNoYXIpIHsKJHJlc3VsdCAuPSAkbmV3TGluZTsKCmlmICgneycgPT09ICRjaGFyIHx8ICdbJyA9PT0gJGNoYXIpIHsKJHBvcysrOwp9CgokcmVzdWx0IC49IHN0cl9yZXBlYXQoJGluZGVudFN0ciwgJHBvcyk7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSnNvbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKCgoKCmNsYXNzIEpzb25NYW5pcHVsYXRvcgp7Cgpwcml2YXRlIGNvbnN0IERFRklORVMgPSAnKD8oREVGSU5FKQogICAgICAgKD88bnVtYmVyPiAgICAtPyAoPz0gWzEtOV18MCg/IVxkKSApIFxkKysgKD86XC5cZCsrKT8gKD86W2VFXSBbKy1dPysgXGQrKyk/ICkKICAgICAgICg/PGJvb2xlYW4+ICAgdHJ1ZSB8IGZhbHNlIHwgbnVsbCApCiAgICAgICAoPzxzdHJpbmc+ICAgICIgKD86W14iXFxcXF0qKyB8IFxcXFwgWyJcXFxcYmZucnRcL10gfCBcXFxcIHUgWzAtOUEtRmEtZl17NH0gKSogIiApCiAgICAgICAoPzxhcnJheT4gICAgIFxbICAoPzogICg/Jmpzb24pIFxzKisgKD86ICwgKD8manNvbikgXHMqKyApKisgICk/KyAgXHMqKyBcXSApCiAgICAgICAoPzxwYWlyPiAgICAgIFxzKisgKD8mc3RyaW5nKSBccyorIDogKD8manNvbikgXHMqKyApCiAgICAgICAoPzxvYmplY3Q+ICAgIFx7ICAoPzogICg/JnBhaXIpICAoPzogLCAoPyZwYWlyKSAgKSorICApPysgIFxzKisgXH0gKQogICAgICAgKD88anNvbj4gICAgICBccyorICg/OiAoPyZudW1iZXIpIHwgKD8mYm9vbGVhbikgfCAoPyZzdHJpbmcpIHwgKD8mYXJyYXkpIHwgKD8mb2JqZWN0KSApICkKICAgICknOwoKCnByaXZhdGUgJGNvbnRlbnRzOwoKcHJpdmF0ZSAkbmV3bGluZTsKCnByaXZhdGUgJGluZGVudDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGNvbnRlbnRzKQp7CiRjb250ZW50cyA9IHRyaW0oJGNvbnRlbnRzKTsKaWYgKCRjb250ZW50cyA9PT0gJycpIHsKJGNvbnRlbnRzID0gJ3t9JzsKfQppZiAoIVByZWc6OmlzTWF0Y2goJyNeXHsoLiopXH0kI3MnLCAkY29udGVudHMpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUganNvbiBmaWxlIG11c3QgYmUgYW4gb2JqZWN0ICh7fSknKTsKfQokdGhpcy0+bmV3bGluZSA9IGZhbHNlICE9PSBzdHJwb3MoJGNvbnRlbnRzLCAiXHJcbiIpID8gIlxyXG4iIDogIlxuIjsKJHRoaXMtPmNvbnRlbnRzID0gJGNvbnRlbnRzID09PSAne30nID8gJ3snIC4gJHRoaXMtPm5ld2xpbmUgLiAnfScgOiAkY29udGVudHM7CiR0aGlzLT5kZXRlY3RJbmRlbnRpbmcoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnRzKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Y29udGVudHMgLiAkdGhpcy0+bmV3bGluZTsKfQoKcHVibGljIGZ1bmN0aW9uIGFkZExpbmsoc3RyaW5nICR0eXBlLCBzdHJpbmcgJHBhY2thZ2UsIHN0cmluZyAkY29uc3RyYWludCwgYm9vbCAkc29ydFBhY2thZ2VzID0gZmFsc2UpOiBib29sCnsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7CgoKaWYgKCFpc3NldCgkZGVjb2RlZFskdHlwZV0pKSB7CnJldHVybiAkdGhpcy0+YWRkTWFpbktleSgkdHlwZSwgWyRwYWNrYWdlID0+ICRjb25zdHJhaW50XSk7Cn0KCiRyZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PlxzKlx7XHMqKD86KD8mc3RyaW5nKVxzKjpccyooPyZqc29uKVxzKixccyopKj8pJy4KJyg/UDxwcm9wZXJ0eT4nLnByZWdfcXVvdGUoSnNvbkZpbGU6OmVuY29kZSgkdHlwZSkpLidccyo6XHMqKSg/UDx2YWx1ZT4oPyZqc29uKSkoP1A8ZW5kPi4qKX1zeCc7CmlmICghUHJlZzo6aXNNYXRjaCgkcmVnZXgsICR0aGlzLT5jb250ZW50cywgJG1hdGNoZXMpKSB7CnJldHVybiBmYWxzZTsKfQphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWydzdGFydCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbJ3ZhbHVlJ10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1snZW5kJ10pKTsKCiRsaW5rcyA9ICRtYXRjaGVzWyd2YWx1ZSddOwoKCiRwYWNrYWdlUmVnZXggPSBzdHJfcmVwbGFjZSgnLycsICdcXFxcPy8nLCBwcmVnX3F1b3RlKCRwYWNrYWdlKSk7CiRyZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLiciKD9QPHBhY2thZ2U+Jy4kcGFja2FnZVJlZ2V4LicpIihccyo6XHMqKSg/JnN0cmluZyl9aXgnOwppZiAoUHJlZzo6aXNNYXRjaCgkcmVnZXgsICRsaW5rcywgJHBhY2thZ2VNYXRjaGVzKSkgewphc3NlcnQoaXNfc3RyaW5nKCRwYWNrYWdlTWF0Y2hlc1sncGFja2FnZSddKSk7CgokZXhpc3RpbmdQYWNrYWdlID0gJHBhY2thZ2VNYXRjaGVzWydwYWNrYWdlJ107CiRwYWNrYWdlUmVnZXggPSBzdHJfcmVwbGFjZSgnLycsICdcXFxcPy8nLCBwcmVnX3F1b3RlKCRleGlzdGluZ1BhY2thZ2UpKTsKJGxpbmtzID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCd7Jy5zZWxmOjpERUZJTkVTLiciJy4kcGFja2FnZVJlZ2V4LiciKD9QPHNlcGFyYXRvcj5ccyo6XHMqKSg/JnN0cmluZyl9aXgnLCBzdGF0aWMgZnVuY3Rpb24gKCRtKSB1c2UgKCRleGlzdGluZ1BhY2thZ2UsICRjb25zdHJhaW50KTogc3RyaW5nIHsKcmV0dXJuIEpzb25GaWxlOjplbmNvZGUoc3RyX3JlcGxhY2UoJ1xcLycsICcvJywgJGV4aXN0aW5nUGFja2FnZSkpIC4gJG1bJ3NlcGFyYXRvciddIC4gJyInIC4gJGNvbnN0cmFpbnQgLiAnIic7Cn0sICRsaW5rcyk7Cn0gZWxzZSB7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcjXlxzKlx7XHMqXFMrLio/KFxzKlx9XHMqKSQjcycsICRsaW5rcywgJG1hdGNoKSkgewoKJGxpbmtzID0gUHJlZzo6cmVwbGFjZSgKJ3snLnByZWdfcXVvdGUoJG1hdGNoWzFdKS4nJH0nLAoKYWRkY3NsYXNoZXMoJywnIC4gJHRoaXMtPm5ld2xpbmUgLiAkdGhpcy0+aW5kZW50IC4gJHRoaXMtPmluZGVudCAuIEpzb25GaWxlOjplbmNvZGUoJHBhY2thZ2UpLic6ICcuSnNvbkZpbGU6OmVuY29kZSgkY29uc3RyYWludCkgLiAkbWF0Y2hbMV0sICdcXCQnKSwKJGxpbmtzCik7Cn0gZWxzZSB7CgokbGlua3MgPSAneycgLiAkdGhpcy0+bmV3bGluZSAuCiR0aGlzLT5pbmRlbnQgLiAkdGhpcy0+aW5kZW50IC4gSnNvbkZpbGU6OmVuY29kZSgkcGFja2FnZSkuJzogJy5Kc29uRmlsZTo6ZW5jb2RlKCRjb25zdHJhaW50KSAuICR0aGlzLT5uZXdsaW5lIC4KJHRoaXMtPmluZGVudCAuICd9JzsKfQp9CgppZiAodHJ1ZSA9PT0gJHNvcnRQYWNrYWdlcykgewokcmVxdWlyZW1lbnRzID0ganNvbl9kZWNvZGUoJGxpbmtzLCB0cnVlKTsKJHRoaXMtPnNvcnRQYWNrYWdlcygkcmVxdWlyZW1lbnRzKTsKJGxpbmtzID0gJHRoaXMtPmZvcm1hdCgkcmVxdWlyZW1lbnRzKTsKfQoKJHRoaXMtPmNvbnRlbnRzID0gJG1hdGNoZXNbJ3N0YXJ0J10gLiAkbWF0Y2hlc1sncHJvcGVydHknXSAuICRsaW5rcyAuICRtYXRjaGVzWydlbmQnXTsKCnJldHVybiB0cnVlOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzb3J0UGFja2FnZXMoYXJyYXkgJiRwYWNrYWdlcyA9IFtdKTogdm9pZAp7CiRwcmVmaXggPSBzdGF0aWMgZnVuY3Rpb24gKCRyZXF1aXJlbWVudCk6IHN0cmluZyB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXF1aXJlbWVudCkpIHsKcmV0dXJuIFByZWc6OnJlcGxhY2UoClsKJy9ecGhwLycsCicvXmhodm0vJywKJy9eZXh0LycsCicvXmxpYi8nLAonL15cRC8nLApdLApbCicwLSQwJywKJzEtJDAnLAonMi0kMCcsCiczLSQwJywKJzQtJDAnLApdLAokcmVxdWlyZW1lbnQKKTsKfQoKcmV0dXJuICc1LScuJHJlcXVpcmVtZW50Owp9OwoKdWtzb3J0KCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkYSwgJGIpIHVzZSAoJHByZWZpeCk6IGludCB7CnJldHVybiBzdHJuYXRjbXAoJHByZWZpeCgkYSksICRwcmVmaXgoJGIpKTsKfSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSZXBvc2l0b3J5KHN0cmluZyAkbmFtZSwgJGNvbmZpZywgYm9vbCAkYXBwZW5kID0gdHJ1ZSk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmFkZFN1Yk5vZGUoJ3JlcG9zaXRvcmllcycsICRuYW1lLCAkY29uZmlnLCAkYXBwZW5kKTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVJlcG9zaXRvcnkoc3RyaW5nICRuYW1lKTogYm9vbAp7CnJldHVybiAkdGhpcy0+cmVtb3ZlU3ViTm9kZSgncmVwb3NpdG9yaWVzJywgJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQ29uZmlnU2V0dGluZyhzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmFkZFN1Yk5vZGUoJ2NvbmZpZycsICRuYW1lLCAkdmFsdWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQ29uZmlnU2V0dGluZyhzdHJpbmcgJG5hbWUpOiBib29sCnsKcmV0dXJuICR0aGlzLT5yZW1vdmVTdWJOb2RlKCdjb25maWcnLCAkbmFtZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQcm9wZXJ0eShzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IGJvb2wKewppZiAoc3RycG9zKCRuYW1lLCAnc3VnZ2VzdC4nKSA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPmFkZFN1Yk5vZGUoJ3N1Z2dlc3QnLCBzdWJzdHIoJG5hbWUsIDgpLCAkdmFsdWUpOwp9CgppZiAoc3RycG9zKCRuYW1lLCAnZXh0cmEuJykgPT09IDApIHsKcmV0dXJuICR0aGlzLT5hZGRTdWJOb2RlKCdleHRyYScsIHN1YnN0cigkbmFtZSwgNiksICR2YWx1ZSk7Cn0KCmlmIChzdHJwb3MoJG5hbWUsICdzY3JpcHRzLicpID09PSAwKSB7CnJldHVybiAkdGhpcy0+YWRkU3ViTm9kZSgnc2NyaXB0cycsIHN1YnN0cigkbmFtZSwgOCksICR2YWx1ZSk7Cn0KCnJldHVybiAkdGhpcy0+YWRkTWFpbktleSgkbmFtZSwgJHZhbHVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVByb3BlcnR5KHN0cmluZyAkbmFtZSk6IGJvb2wKewppZiAoc3RycG9zKCRuYW1lLCAnc3VnZ2VzdC4nKSA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPnJlbW92ZVN1Yk5vZGUoJ3N1Z2dlc3QnLCBzdWJzdHIoJG5hbWUsIDgpKTsKfQoKaWYgKHN0cnBvcygkbmFtZSwgJ2V4dHJhLicpID09PSAwKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlU3ViTm9kZSgnZXh0cmEnLCBzdWJzdHIoJG5hbWUsIDYpKTsKfQoKaWYgKHN0cnBvcygkbmFtZSwgJ3NjcmlwdHMuJykgPT09IDApIHsKcmV0dXJuICR0aGlzLT5yZW1vdmVTdWJOb2RlKCdzY3JpcHRzJywgc3Vic3RyKCRuYW1lLCA4KSk7Cn0KCmlmIChzdHJwb3MoJG5hbWUsICdhdXRvbG9hZC4nKSA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPnJlbW92ZVN1Yk5vZGUoJ2F1dG9sb2FkJywgc3Vic3RyKCRuYW1lLCA5KSk7Cn0KCmlmIChzdHJwb3MoJG5hbWUsICdhdXRvbG9hZC1kZXYuJykgPT09IDApIHsKcmV0dXJuICR0aGlzLT5yZW1vdmVTdWJOb2RlKCdhdXRvbG9hZC1kZXYnLCBzdWJzdHIoJG5hbWUsIDEzKSk7Cn0KCnJldHVybiAkdGhpcy0+cmVtb3ZlTWFpbktleSgkbmFtZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRTdWJOb2RlKHN0cmluZyAkbWFpbk5vZGUsIHN0cmluZyAkbmFtZSwgJHZhbHVlLCBib29sICRhcHBlbmQgPSB0cnVlKTogYm9vbAp7CiRkZWNvZGVkID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Y29udGVudHMpOwoKJHN1Yk5hbWUgPSBudWxsOwppZiAoaW5fYXJyYXkoJG1haW5Ob2RlLCBbJ2NvbmZpZycsICdleHRyYScsICdzY3JpcHRzJ10pICYmIGZhbHNlICE9PSBzdHJwb3MoJG5hbWUsICcuJykpIHsKWyRuYW1lLCAkc3ViTmFtZV0gPSBleHBsb2RlKCcuJywgJG5hbWUsIDIpOwp9CgoKaWYgKCFpc3NldCgkZGVjb2RlZFskbWFpbk5vZGVdKSkgewppZiAoJHN1Yk5hbWUgIT09IG51bGwpIHsKJHRoaXMtPmFkZE1haW5LZXkoJG1haW5Ob2RlLCBbJG5hbWUgPT4gWyRzdWJOYW1lID0+ICR2YWx1ZV1dKTsKfSBlbHNlIHsKJHRoaXMtPmFkZE1haW5LZXkoJG1haW5Ob2RlLCBbJG5hbWUgPT4gJHZhbHVlXSk7Cn0KCnJldHVybiB0cnVlOwp9CgoKJG5vZGVSZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PiBccyogXHsgXHMqICg/OiAoPyZzdHJpbmcpIFxzKiA6ICg/Jmpzb24pIFxzKiAsIFxzKiApKj8nLgpwcmVnX3F1b3RlKEpzb25GaWxlOjplbmNvZGUoJG1haW5Ob2RlKSkuJ1xzKjpccyopKD9QPGNvbnRlbnQ+KD8mb2JqZWN0KSkoP1A8ZW5kPi4qKX1zeCc7Cgp0cnkgewppZiAoIVByZWc6OmlzTWF0Y2goJG5vZGVSZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gpKSB7CnJldHVybiBmYWxzZTsKfQp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSA9PT0gUFJFR19CQUNLVFJBQ0tfTElNSVRfRVJST1IpIHsKcmV0dXJuIGZhbHNlOwp9CnRocm93ICRlOwp9Cgphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnc3RhcnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnY29udGVudCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydlbmQnXSkpOwoKJGNoaWxkcmVuID0gJG1hdGNoWydjb250ZW50J107CgppZiAoIUBqc29uX2RlY29kZSgkY2hpbGRyZW4pKSB7CnJldHVybiBmYWxzZTsKfQoKCiRjaGlsZFJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJyg/UDxzdGFydD4iJy5wcmVnX3F1b3RlKCRuYW1lKS4nIlxzKjpccyopKD9QPGNvbnRlbnQ+KD8manNvbikpKD9QPGVuZD4sPyl9eCc7CmlmIChQcmVnOjppc01hdGNoKCRjaGlsZFJlZ2V4LCAkY2hpbGRyZW4sICRtYXRjaGVzKSkgewokY2hpbGRyZW4gPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJGNoaWxkUmVnZXgsIGZ1bmN0aW9uICgkbWF0Y2hlcykgdXNlICgkc3ViTmFtZSwgJHZhbHVlKTogc3RyaW5nIHsKaWYgKCRzdWJOYW1lICE9PSBudWxsICYmIGlzX3N0cmluZygkbWF0Y2hlc1snY29udGVudCddKSkgewokY3VyVmFsID0ganNvbl9kZWNvZGUoJG1hdGNoZXNbJ2NvbnRlbnQnXSwgdHJ1ZSk7CmlmICghaXNfYXJyYXkoJGN1clZhbCkpIHsKJGN1clZhbCA9IFtdOwp9CiRjdXJWYWxbJHN1Yk5hbWVdID0gJHZhbHVlOwokdmFsdWUgPSAkY3VyVmFsOwp9CgpyZXR1cm4gJG1hdGNoZXNbJ3N0YXJ0J10gLiAkdGhpcy0+Zm9ybWF0KCR2YWx1ZSwgMSkgLiAkbWF0Y2hlc1snZW5kJ107Cn0sICRjaGlsZHJlbik7Cn0gZWxzZWlmIChQcmVnOjppc01hdGNoKCcjXlx7KD9QPGxlYWRpbmdzcGFjZT5ccyo/KSg/UDxjb250ZW50PlxTKy4qPyk/KD9QPHRyYWlsaW5nc3BhY2U+XHMqKVx9JCNzJywgJGNoaWxkcmVuLCAkbWF0Y2gpKSB7CiR3aGl0ZXNwYWNlID0gJG1hdGNoWyd0cmFpbGluZ3NwYWNlJ107CmlmIChudWxsICE9PSAkbWF0Y2hbJ2NvbnRlbnQnXSkgewppZiAoJHN1Yk5hbWUgIT09IG51bGwpIHsKJHZhbHVlID0gWyRzdWJOYW1lID0+ICR2YWx1ZV07Cn0KCgppZiAoJGFwcGVuZCkgewokY2hpbGRyZW4gPSBQcmVnOjpyZXBsYWNlKAonIycuJHdoaXRlc3BhY2UuJ30kIycsCmFkZGNzbGFzaGVzKCcsJyAuICR0aGlzLT5uZXdsaW5lIC4gJHRoaXMtPmluZGVudCAuICR0aGlzLT5pbmRlbnQgLiBKc29uRmlsZTo6ZW5jb2RlKCRuYW1lKS4nOiAnLiR0aGlzLT5mb3JtYXQoJHZhbHVlLCAxKSAuICR3aGl0ZXNwYWNlIC4gJ30nLCAnXFwkJyksCiRjaGlsZHJlbgopOwp9IGVsc2Ugewokd2hpdGVzcGFjZSA9ICRtYXRjaFsnbGVhZGluZ3NwYWNlJ107CiRjaGlsZHJlbiA9IFByZWc6OnJlcGxhY2UoCicjXnsnLiR3aGl0ZXNwYWNlLicjJywKYWRkY3NsYXNoZXMoJ3snIC4gJHdoaXRlc3BhY2UgLiBKc29uRmlsZTo6ZW5jb2RlKCRuYW1lKS4nOiAnLiR0aGlzLT5mb3JtYXQoJHZhbHVlLCAxKSAuICcsJyAuICR0aGlzLT5uZXdsaW5lIC4gJHRoaXMtPmluZGVudCAuICR0aGlzLT5pbmRlbnQsICdcXCQnKSwKJGNoaWxkcmVuCik7Cn0KfSBlbHNlIHsKaWYgKCRzdWJOYW1lICE9PSBudWxsKSB7CiR2YWx1ZSA9IFskc3ViTmFtZSA9PiAkdmFsdWVdOwp9CgoKJGNoaWxkcmVuID0gJ3snIC4gJHRoaXMtPm5ld2xpbmUgLiAkdGhpcy0+aW5kZW50IC4gJHRoaXMtPmluZGVudCAuIEpzb25GaWxlOjplbmNvZGUoJG5hbWUpLic6ICcuJHRoaXMtPmZvcm1hdCgkdmFsdWUsIDEpIC4gJHdoaXRlc3BhY2UgLiAnfSc7Cn0KfSBlbHNlIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignTm90aGluZyBtYXRjaGVkIGFib3ZlIGZvcjogJy4kY2hpbGRyZW4pOwp9CgokdGhpcy0+Y29udGVudHMgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJG5vZGVSZWdleCwgc3RhdGljIGZ1bmN0aW9uICgkbSkgdXNlICgkY2hpbGRyZW4pOiBzdHJpbmcgewpyZXR1cm4gJG1bJ3N0YXJ0J10gLiAkY2hpbGRyZW4gLiAkbVsnZW5kJ107Cn0sICR0aGlzLT5jb250ZW50cyk7CgpyZXR1cm4gdHJ1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVN1Yk5vZGUoc3RyaW5nICRtYWluTm9kZSwgc3RyaW5nICRuYW1lKTogYm9vbAp7CiRkZWNvZGVkID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Y29udGVudHMpOwoKCmlmIChlbXB0eSgkZGVjb2RlZFskbWFpbk5vZGVdKSkgewpyZXR1cm4gdHJ1ZTsKfQoKCiRub2RlUmVnZXggPSAneycuc2VsZjo6REVGSU5FUy4nXig/UDxzdGFydD4gXHMqIFx7IFxzKiAoPzogKD8mc3RyaW5nKSBccyogOiAoPyZqc29uKSBccyogLCBccyogKSo/Jy4KcHJlZ19xdW90ZShKc29uRmlsZTo6ZW5jb2RlKCRtYWluTm9kZSkpLidccyo6XHMqKSg/UDxjb250ZW50Pig/Jm9iamVjdCkpKD9QPGVuZD4uKil9c3gnOwp0cnkgewppZiAoIVByZWc6OmlzTWF0Y2goJG5vZGVSZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gpKSB7CnJldHVybiBmYWxzZTsKfQp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSA9PT0gUFJFR19CQUNLVFJBQ0tfTElNSVRfRVJST1IpIHsKcmV0dXJuIGZhbHNlOwp9CnRocm93ICRlOwp9Cgphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnc3RhcnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnY29udGVudCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydlbmQnXSkpOwoKJGNoaWxkcmVuID0gJG1hdGNoWydjb250ZW50J107CgoKaWYgKCFAanNvbl9kZWNvZGUoJGNoaWxkcmVuLCB0cnVlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRzdWJOYW1lID0gbnVsbDsKaWYgKGluX2FycmF5KCRtYWluTm9kZSwgWydjb25maWcnLCAnZXh0cmEnLCAnc2NyaXB0cyddKSAmJiBmYWxzZSAhPT0gc3RycG9zKCRuYW1lLCAnLicpKSB7ClskbmFtZSwgJHN1Yk5hbWVdID0gZXhwbG9kZSgnLicsICRuYW1lLCAyKTsKfQoKCmlmICghaXNzZXQoJGRlY29kZWRbJG1haW5Ob2RlXVskbmFtZV0pIHx8ICgkc3ViTmFtZSAmJiAhaXNzZXQoJGRlY29kZWRbJG1haW5Ob2RlXVskbmFtZV1bJHN1Yk5hbWVdKSkpIHsKcmV0dXJuIHRydWU7Cn0KCgoka2V5UmVnZXggPSBzdHJfcmVwbGFjZSgnLycsICdcXFxcPy8nLCBwcmVnX3F1b3RlKCRuYW1lKSk7CmlmIChQcmVnOjppc01hdGNoKCd7IicuJGtleVJlZ2V4LiciXHMqOn1pJywgJGNoaWxkcmVuKSkgewoKaWYgKFByZWc6OmlzTWF0Y2hBbGwoJ3snLnNlbGY6OkRFRklORVMuJyInLiRrZXlSZWdleC4nIlxzKjpccyooPzooPyZqc29uKSl9eCcsICRjaGlsZHJlbiwgJG1hdGNoZXMpKSB7CiRiZXN0TWF0Y2ggPSAnJzsKZm9yZWFjaCAoJG1hdGNoZXNbMF0gYXMgJG1hdGNoKSB7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoKSk7CmlmIChzdHJsZW4oJGJlc3RNYXRjaCkgPCBzdHJsZW4oJG1hdGNoKSkgewokYmVzdE1hdGNoID0gJG1hdGNoOwp9Cn0KJGNoaWxkcmVuQ2xlYW4gPSBQcmVnOjpyZXBsYWNlKCd7LFxzKicucHJlZ19xdW90ZSgkYmVzdE1hdGNoKS4nfWknLCAnJywgJGNoaWxkcmVuLCAtMSwgJGNvdW50KTsKaWYgKDEgIT09ICRjb3VudCkgewokY2hpbGRyZW5DbGVhbiA9IFByZWc6OnJlcGxhY2UoJ3snLnByZWdfcXVvdGUoJGJlc3RNYXRjaCkuJ1xzKiw/XHMqfWknLCAnJywgJGNoaWxkcmVuQ2xlYW4sIC0xLCAkY291bnQpOwppZiAoMSAhPT0gJGNvdW50KSB7CnJldHVybiBmYWxzZTsKfQp9Cn0KfSBlbHNlIHsKJGNoaWxkcmVuQ2xlYW4gPSAkY2hpbGRyZW47Cn0KCmlmICghaXNzZXQoJGNoaWxkcmVuQ2xlYW4pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJKc29uTWFuaXB1bGF0b3I6IFwkY2hpbGRyZW5DbGVhbiBpcyBub3QgZGVmaW5lZC4gUGxlYXNlIHJlcG9ydCBhdCBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY29tcG9zZXIvaXNzdWVzL25ldy4iKTsKfQoKCnVuc2V0KCRtYXRjaCk7CmlmIChQcmVnOjppc01hdGNoKCcjXlx7XHMqPyg/UDxjb250ZW50PlxTKy4qPyk/KD9QPHRyYWlsaW5nc3BhY2U+XHMqKVx9JCNzJywgJGNoaWxkcmVuQ2xlYW4sICRtYXRjaCkpIHsKaWYgKG51bGwgPT09ICRtYXRjaFsnY29udGVudCddKSB7CiRuZXdsaW5lID0gJHRoaXMtPm5ld2xpbmU7CiRpbmRlbnQgPSAkdGhpcy0+aW5kZW50OwoKJHRoaXMtPmNvbnRlbnRzID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCRub2RlUmVnZXgsIHN0YXRpYyBmdW5jdGlvbiAoJG1hdGNoZXMpIHVzZSAoJGluZGVudCwgJG5ld2xpbmUpOiBzdHJpbmcgewpyZXR1cm4gJG1hdGNoZXNbJ3N0YXJ0J10gLiAneycgLiAkbmV3bGluZSAuICRpbmRlbnQgLiAnfScgLiAkbWF0Y2hlc1snZW5kJ107Cn0sICR0aGlzLT5jb250ZW50cyk7CgoKaWYgKCRzdWJOYW1lICE9PSBudWxsKSB7CiRjdXJWYWwgPSBqc29uX2RlY29kZSgkY2hpbGRyZW4sIHRydWUpOwp1bnNldCgkY3VyVmFsWyRuYW1lXVskc3ViTmFtZV0pOwppZiAoJGN1clZhbFskbmFtZV0gPT09IFtdKSB7CiRjdXJWYWxbJG5hbWVdID0gbmV3IFxBcnJheU9iamVjdCgpOwp9CiR0aGlzLT5hZGRTdWJOb2RlKCRtYWluTm9kZSwgJG5hbWUsICRjdXJWYWxbJG5hbWVdKTsKfQoKcmV0dXJuIHRydWU7Cn0KfQoKJHRoaXMtPmNvbnRlbnRzID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCRub2RlUmVnZXgsIGZ1bmN0aW9uICgkbWF0Y2hlcykgdXNlICgkbmFtZSwgJHN1Yk5hbWUsICRjaGlsZHJlbkNsZWFuKTogc3RyaW5nIHsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1snY29udGVudCddKSk7CmlmICgkc3ViTmFtZSAhPT0gbnVsbCkgewokY3VyVmFsID0ganNvbl9kZWNvZGUoJG1hdGNoZXNbJ2NvbnRlbnQnXSwgdHJ1ZSk7CnVuc2V0KCRjdXJWYWxbJG5hbWVdWyRzdWJOYW1lXSk7CmlmICgkY3VyVmFsWyRuYW1lXSA9PT0gW10pIHsKJGN1clZhbFskbmFtZV0gPSBuZXcgXEFycmF5T2JqZWN0KCk7Cn0KJGNoaWxkcmVuQ2xlYW4gPSAkdGhpcy0+Zm9ybWF0KCRjdXJWYWwsIDAsIHRydWUpOwp9CgpyZXR1cm4gJG1hdGNoZXNbJ3N0YXJ0J10gLiAkY2hpbGRyZW5DbGVhbiAuICRtYXRjaGVzWydlbmQnXTsKfSwgJHRoaXMtPmNvbnRlbnRzKTsKCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkTWFpbktleShzdHJpbmcgJGtleSwgJGNvbnRlbnQpOiBib29sCnsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7CiRjb250ZW50ID0gJHRoaXMtPmZvcm1hdCgkY29udGVudCk7CgoKJHJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJ14oP1A8c3RhcnQ+XHMqXHtccyooPzooPyZzdHJpbmcpXHMqOlxzKig/Jmpzb24pXHMqLFxzKikqPyknLgonKD9QPGtleT4nLnByZWdfcXVvdGUoSnNvbkZpbGU6OmVuY29kZSgka2V5KSkuJ1xzKjpccyooPyZqc29uKSkoP1A8ZW5kPi4qKX1zeCc7CmlmIChpc3NldCgkZGVjb2RlZFska2V5XSkgJiYgUHJlZzo6aXNNYXRjaCgkcmVnZXgsICR0aGlzLT5jb250ZW50cywgJG1hdGNoZXMpKSB7CgppZiAoIUBqc29uX2RlY29kZSgneycuJG1hdGNoZXNbJ2tleSddLid9JykpIHsKcmV0dXJuIGZhbHNlOwp9CgokdGhpcy0+Y29udGVudHMgPSAkbWF0Y2hlc1snc3RhcnQnXSAuIEpzb25GaWxlOjplbmNvZGUoJGtleSkuJzogJy4kY29udGVudCAuICRtYXRjaGVzWydlbmQnXTsKCnJldHVybiB0cnVlOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJyNbXntcc10oXHMqKVx9JCMnLCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCkpIHsKJHRoaXMtPmNvbnRlbnRzID0gUHJlZzo6cmVwbGFjZSgKJyMnLiRtYXRjaFsxXS4nXH0kIycsCmFkZGNzbGFzaGVzKCcsJyAuICR0aGlzLT5uZXdsaW5lIC4gJHRoaXMtPmluZGVudCAuIEpzb25GaWxlOjplbmNvZGUoJGtleSkuICc6ICcuICRjb250ZW50IC4gJHRoaXMtPm5ld2xpbmUgLiAnfScsICdcXCQnKSwKJHRoaXMtPmNvbnRlbnRzCik7CgpyZXR1cm4gdHJ1ZTsKfQoKCiR0aGlzLT5jb250ZW50cyA9IFByZWc6OnJlcGxhY2UoCicjXH0kIycsCmFkZGNzbGFzaGVzKCR0aGlzLT5pbmRlbnQgLiBKc29uRmlsZTo6ZW5jb2RlKCRrZXkpLiAnOiAnLiRjb250ZW50IC4gJHRoaXMtPm5ld2xpbmUgLiAnfScsICdcXCQnKSwKJHRoaXMtPmNvbnRlbnRzCik7CgpyZXR1cm4gdHJ1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZU1haW5LZXkoc3RyaW5nICRrZXkpOiBib29sCnsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7CgppZiAoIWFycmF5X2tleV9leGlzdHMoJGtleSwgJGRlY29kZWQpKSB7CnJldHVybiB0cnVlOwp9CgoKJHJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJ14oP1A8c3RhcnQ+XHMqXHtccyooPzooPyZzdHJpbmcpXHMqOlxzKig/Jmpzb24pXHMqLFxzKikqPyknLgonKD9QPHJlbW92YWw+Jy5wcmVnX3F1b3RlKEpzb25GaWxlOjplbmNvZGUoJGtleSkpLidccyo6XHMqKD8manNvbikpXHMqLD9ccyooP1A8ZW5kPi4qKX1zeCc7CmlmIChQcmVnOjppc01hdGNoKCRyZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2hlcykpIHsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1snc3RhcnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWydyZW1vdmFsJ10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1snZW5kJ10pKTsKCgppZiAoIUBqc29uX2RlY29kZSgneycuJG1hdGNoZXNbJ3JlbW92YWwnXS4nfScpKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcjLFxzKiQjJywgJG1hdGNoZXNbJ3N0YXJ0J10pICYmIFByZWc6OmlzTWF0Y2goJyNeXH0kIycsICRtYXRjaGVzWydlbmQnXSkpIHsKJG1hdGNoZXNbJ3N0YXJ0J10gPSBydHJpbShQcmVnOjpyZXBsYWNlKCcjLChccyopJCMnLCAnJDEnLCAkbWF0Y2hlc1snc3RhcnQnXSksICR0aGlzLT5pbmRlbnQpOwp9CgokdGhpcy0+Y29udGVudHMgPSAkbWF0Y2hlc1snc3RhcnQnXSAuICRtYXRjaGVzWydlbmQnXTsKaWYgKFByZWc6OmlzTWF0Y2goJyNeXHtccypcfVxzKiQjJywgJHRoaXMtPmNvbnRlbnRzKSkgewokdGhpcy0+Y29udGVudHMgPSAie1xufSI7Cn0KCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVNYWluS2V5SWZFbXB0eShzdHJpbmcgJGtleSk6IGJvb2wKewokZGVjb2RlZCA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHRoaXMtPmNvbnRlbnRzKTsKCmlmICghYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkZGVjb2RlZCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19hcnJheSgkZGVjb2RlZFska2V5XSkgJiYgY291bnQoJGRlY29kZWRbJGtleV0pID09PSAwKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlTWFpbktleSgka2V5KTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXQoJGRhdGEsIGludCAkZGVwdGggPSAwLCBib29sICR3YXNPYmplY3QgPSBmYWxzZSk6IHN0cmluZwp7CmlmICgkZGF0YSBpbnN0YW5jZW9mIFxzdGRDbGFzcyB8fCAkZGF0YSBpbnN0YW5jZW9mIFxBcnJheU9iamVjdCkgewokZGF0YSA9IChhcnJheSkgJGRhdGE7CiR3YXNPYmplY3QgPSB0cnVlOwp9CgppZiAoaXNfYXJyYXkoJGRhdGEpKSB7CmlmIChcY291bnQoJGRhdGEpID09PSAwKSB7CnJldHVybiAkd2FzT2JqZWN0ID8gJ3snIC4gJHRoaXMtPm5ld2xpbmUgLiBzdHJfcmVwZWF0KCR0aGlzLT5pbmRlbnQsICRkZXB0aCArIDEpIC4gJ30nIDogJ1tdJzsKfQoKaWYgKGFycmF5X2lzX2xpc3QoJGRhdGEpKSB7CmZvcmVhY2ggKCRkYXRhIGFzICRrZXkgPT4gJHZhbCkgewokZGF0YVska2V5XSA9ICR0aGlzLT5mb3JtYXQoJHZhbCwgJGRlcHRoICsgMSk7Cn0KCnJldHVybiAnWycuaW1wbG9kZSgnLCAnLCAkZGF0YSkuJ10nOwp9Cgokb3V0ID0gJ3snIC4gJHRoaXMtPm5ld2xpbmU7CiRlbGVtcyA9IFtdOwpmb3JlYWNoICgkZGF0YSBhcyAka2V5ID0+ICR2YWwpIHsKJGVsZW1zW10gPSBzdHJfcmVwZWF0KCR0aGlzLT5pbmRlbnQsICRkZXB0aCArIDIpIC4gSnNvbkZpbGU6OmVuY29kZSgoc3RyaW5nKSAka2V5KS4gJzogJy4kdGhpcy0+Zm9ybWF0KCR2YWwsICRkZXB0aCArIDEpOwp9CgpyZXR1cm4gJG91dCAuIGltcGxvZGUoJywnLiR0aGlzLT5uZXdsaW5lLCAkZWxlbXMpIC4gJHRoaXMtPm5ld2xpbmUgLiBzdHJfcmVwZWF0KCR0aGlzLT5pbmRlbnQsICRkZXB0aCArIDEpIC4gJ30nOwp9CgpyZXR1cm4gSnNvbkZpbGU6OmVuY29kZSgkZGF0YSk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBkZXRlY3RJbmRlbnRpbmcoKTogdm9pZAp7CiR0aGlzLT5pbmRlbnQgPSBKc29uRmlsZTo6ZGV0ZWN0SW5kZW50aW5nKCR0aGlzLT5jb250ZW50cyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSnNvbjsKCnVzZSBFeGNlcHRpb247CgoKCgpjbGFzcyBKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CgoKCnByb3RlY3RlZCAkZXJyb3JzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSwgYXJyYXkgJGVycm9ycyA9IFtdLCA/RXhjZXB0aW9uICRwcmV2aW91cyA9IG51bGwpCnsKJHRoaXMtPmVycm9ycyA9ICRlcnJvcnM7CnBhcmVudDo6X19jb25zdHJ1Y3QoKHN0cmluZykgJG1lc3NhZ2UsIDAsICRwcmV2aW91cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmVycm9yczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQSFBTdGFuOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBQaHBQYXJzZXJcTm9kZVxFeHByXE1ldGhvZENhbGw7CnVzZSBQSFBTdGFuXEFuYWx5c2VyXFNjb3BlOwp1c2UgUEhQU3RhblxSZWZsZWN0aW9uXE1ldGhvZFJlZmxlY3Rpb247CnVzZSBQSFBTdGFuXFJlZmxlY3Rpb25cUGFyYW1ldGVyc0FjY2VwdG9yU2VsZWN0b3I7CnVzZSBQSFBTdGFuXFR5cGVcQXJyYXlUeXBlOwp1c2UgUEhQU3RhblxUeXBlXEJvb2xlYW5UeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50QXJyYXlUeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50Qm9vbGVhblR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcQ29uc3RhbnRcQ29uc3RhbnRTdHJpbmdUeXBlOwp1c2UgUEhQU3RhblxUeXBlXER5bmFtaWNNZXRob2RSZXR1cm5UeXBlRXh0ZW5zaW9uOwp1c2UgUEhQU3RhblxUeXBlXEludGVnZXJSYW5nZVR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcSW50ZWdlclR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcTWl4ZWRUeXBlOwp1c2UgUEhQU3RhblxUeXBlXFN0cmluZ1R5cGU7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlQ29tYmluYXRvcjsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlVXRpbHM7CnVzZSBQSFBTdGFuXFR5cGVcVW5pb25UeXBlOwoKZmluYWwgY2xhc3MgQ29uZmlnUmV0dXJuVHlwZUV4dGVuc2lvbiBpbXBsZW1lbnRzIER5bmFtaWNNZXRob2RSZXR1cm5UeXBlRXh0ZW5zaW9uCnsKCnByaXZhdGUgJHByb3BlcnRpZXMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKJHNjaGVtYSA9IEpzb25GaWxlOjpwYXJzZUpzb24oKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoSnNvbkZpbGU6OkNPTVBPU0VSX1NDSEVNQV9QQVRIKSk7CgoKCmZvcmVhY2ggKCRzY2hlbWFbJ3Byb3BlcnRpZXMnXVsnY29uZmlnJ11bJ3Byb3BlcnRpZXMnXSBhcyAkcHJvcCA9PiAkY29uZikgewokdHlwZSA9ICR0aGlzLT5wYXJzZVR5cGUoJGNvbmYsICRwcm9wKTsKCiR0aGlzLT5wcm9wZXJ0aWVzWyRwcm9wXSA9ICR0eXBlOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzcygpOiBzdHJpbmcKewpyZXR1cm4gQ29uZmlnOjpjbGFzczsKfQoKcHVibGljIGZ1bmN0aW9uIGlzTWV0aG9kU3VwcG9ydGVkKE1ldGhvZFJlZmxlY3Rpb24gJG1ldGhvZFJlZmxlY3Rpb24pOiBib29sCnsKcmV0dXJuIHN0cnRvbG93ZXIoJG1ldGhvZFJlZmxlY3Rpb24tPmdldE5hbWUoKSkgPT09ICdnZXQnOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZUZyb21NZXRob2RDYWxsKE1ldGhvZFJlZmxlY3Rpb24gJG1ldGhvZFJlZmxlY3Rpb24sIE1ldGhvZENhbGwgJG1ldGhvZENhbGwsIFNjb3BlICRzY29wZSk6ID9UeXBlCnsKJGFyZ3MgPSAkbWV0aG9kQ2FsbC0+Z2V0QXJncygpOwoKaWYgKGNvdW50KCRhcmdzKSA8IDEpIHsKcmV0dXJuIG51bGw7Cn0KCiRrZXlUeXBlID0gJHNjb3BlLT5nZXRUeXBlKCRhcmdzWzBdLT52YWx1ZSk7CmlmIChtZXRob2RfZXhpc3RzKCRrZXlUeXBlLCAnZ2V0Q29uc3RhbnRTdHJpbmdzJykpIHsgCiRzdHJpbmdzID0gJGtleVR5cGUtPmdldENvbnN0YW50U3RyaW5ncygpOwp9IGVsc2UgewoKJHN0cmluZ3MgPSBUeXBlVXRpbHM6OmdldENvbnN0YW50U3RyaW5ncygka2V5VHlwZSk7IAp9CmlmICgkc3RyaW5ncyAhPT0gW10pIHsKJHR5cGVzID0gW107CmZvcmVhY2goJHN0cmluZ3MgYXMgJHN0cmluZykgewppZiAoIWlzc2V0KCR0aGlzLT5wcm9wZXJ0aWVzWyRzdHJpbmctPmdldFZhbHVlKCldKSkgewpyZXR1cm4gbnVsbDsKfQokdHlwZXNbXSA9ICR0aGlzLT5wcm9wZXJ0aWVzWyRzdHJpbmctPmdldFZhbHVlKCldOwp9CgpyZXR1cm4gVHlwZUNvbWJpbmF0b3I6OnVuaW9uKC4uLiR0eXBlcyk7Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBhcnNlVHlwZShhcnJheSAkZGVmLCBzdHJpbmcgJHBhdGgpOiBUeXBlCnsKaWYgKGlzc2V0KCRkZWZbJ3R5cGUnXSkpIHsKJHR5cGVzID0gW107CmZvcmVhY2ggKChhcnJheSkgJGRlZlsndHlwZSddIGFzICR0eXBlKSB7CnN3aXRjaCAoJHR5cGUpIHsKY2FzZSAnaW50ZWdlcic6CmlmIChpbl9hcnJheSgkcGF0aCwgWydwcm9jZXNzLXRpbWVvdXQnLCAnY2FjaGUtdHRsJywgJ2NhY2hlLWZpbGVzLXR0bCcsICdjYWNoZS1maWxlcy1tYXhzaXplJ10sIHRydWUpKSB7CiR0eXBlc1tdID0gSW50ZWdlclJhbmdlVHlwZTo6Y3JlYXRlQWxsR3JlYXRlclRoYW5PckVxdWFsVG8oMCk7Cn0gZWxzZSB7CiR0eXBlc1tdID0gbmV3IEludGVnZXJUeXBlKCk7Cn0KYnJlYWs7CgpjYXNlICdzdHJpbmcnOgppZiAoJHBhdGggPT09ICdjYWNoZS1maWxlcy1tYXhzaXplJykgewoKfSBlbHNlaWYgKCRwYXRoID09PSAnZGlzY2FyZC1jaGFuZ2VzJykgewokdHlwZXNbXSA9IG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ3N0YXNoJyk7Cn0gZWxzZWlmICgkcGF0aCA9PT0gJ3VzZS1wYXJlbnQtZGlyJykgewokdHlwZXNbXSA9IG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ3Byb21wdCcpOwp9IGVsc2VpZiAoJHBhdGggPT09ICdzdG9yZS1hdXRocycpIHsKJHR5cGVzW10gPSBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdwcm9tcHQnKTsKfSBlbHNlaWYgKCRwYXRoID09PSAncGxhdGZvcm0tY2hlY2snKSB7CiR0eXBlc1tdID0gbmV3IENvbnN0YW50U3RyaW5nVHlwZSgncGhwLW9ubHknKTsKfSBlbHNlaWYgKCRwYXRoID09PSAnZ2l0aHViLXByb3RvY29scycpIHsKJHR5cGVzW10gPSBuZXcgVW5pb25UeXBlKFtuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdnaXQnKSwgbmV3IENvbnN0YW50U3RyaW5nVHlwZSgnaHR0cHMnKSwgbmV3IENvbnN0YW50U3RyaW5nVHlwZSgnc3NoJyksIG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ2h0dHAnKV0pOwp9IGVsc2VpZiAoc3RyX3N0YXJ0c193aXRoKCRwYXRoLCAncHJlZmVycmVkLWluc3RhbGwnKSkgewokdHlwZXNbXSA9IG5ldyBVbmlvblR5cGUoW25ldyBDb25zdGFudFN0cmluZ1R5cGUoJ3NvdXJjZScpLCBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdkaXN0JyksIG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ2F1dG8nKV0pOwp9IGVsc2UgewokdHlwZXNbXSA9IG5ldyBTdHJpbmdUeXBlKCk7Cn0KYnJlYWs7CgpjYXNlICdib29sZWFuJzoKaWYgKCRwYXRoID09PSAncGxhdGZvcm0uYWRkaXRpb25hbFByb3BlcnRpZXMnKSB7CiR0eXBlc1tdID0gbmV3IENvbnN0YW50Qm9vbGVhblR5cGUoZmFsc2UpOwp9IGVsc2UgewokdHlwZXNbXSA9IG5ldyBCb29sZWFuVHlwZSgpOwp9CmJyZWFrOwoKY2FzZSAnb2JqZWN0JzoKJGFkZGxQcm9wVHlwZSA9IG51bGw7CmlmIChpc3NldCgkZGVmWydhZGRpdGlvbmFsUHJvcGVydGllcyddKSkgewokYWRkbFByb3BUeXBlID0gJHRoaXMtPnBhcnNlVHlwZSgkZGVmWydhZGRpdGlvbmFsUHJvcGVydGllcyddLCAkcGF0aC4nLmFkZGl0aW9uYWxQcm9wZXJ0aWVzJyk7Cn0KCmlmIChpc3NldCgkZGVmWydwcm9wZXJ0aWVzJ10pKSB7CiRrZXlOYW1lcyA9IFtdOwokdmFsVHlwZXMgPSBbXTsKJG9wdGlvbmFsS2V5cyA9IFtdOwokcHJvcEluZGV4ID0gMDsKZm9yZWFjaCAoJGRlZlsncHJvcGVydGllcyddIGFzICRwcm9wTmFtZSA9PiAkcHJvcGRlZikgewoka2V5TmFtZXNbXSA9IG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJHByb3BOYW1lKTsKJHZhbFR5cGUgPSAkdGhpcy0+cGFyc2VUeXBlKCRwcm9wZGVmLCAkcGF0aC4nLicuJHByb3BOYW1lKTsKaWYgKCFpc3NldCgkZGVmWydyZXF1aXJlZCddKSB8fCAhaW5fYXJyYXkoJHByb3BOYW1lLCAkZGVmWydyZXF1aXJlZCddLCB0cnVlKSkgewokdmFsVHlwZSA9IFR5cGVDb21iaW5hdG9yOjphZGROdWxsKCR2YWxUeXBlKTsKJG9wdGlvbmFsS2V5c1tdID0gJHByb3BJbmRleDsKfQokdmFsVHlwZXNbXSA9ICR2YWxUeXBlOwokcHJvcEluZGV4Kys7Cn0KCmlmICgkYWRkbFByb3BUeXBlICE9PSBudWxsKSB7CiR0eXBlc1tdID0gbmV3IEFycmF5VHlwZShUeXBlQ29tYmluYXRvcjo6dW5pb24obmV3IFN0cmluZ1R5cGUoKSwgLi4uJGtleU5hbWVzKSwgVHlwZUNvbWJpbmF0b3I6OnVuaW9uKCRhZGRsUHJvcFR5cGUsIC4uLiR2YWxUeXBlcykpOwp9IGVsc2UgewokdHlwZXNbXSA9IG5ldyBDb25zdGFudEFycmF5VHlwZSgka2V5TmFtZXMsICR2YWxUeXBlcywgWzBdLCAkb3B0aW9uYWxLZXlzKTsKfQp9IGVsc2UgewokdHlwZXNbXSA9IG5ldyBBcnJheVR5cGUobmV3IFN0cmluZ1R5cGUoKSwgJGFkZGxQcm9wVHlwZSA/PyBuZXcgTWl4ZWRUeXBlKCkpOwp9CmJyZWFrOwoKY2FzZSAnYXJyYXknOgppZiAoaXNzZXQoJGRlZlsnaXRlbXMnXSkpIHsKJHZhbFR5cGUgPSAkdGhpcy0+cGFyc2VUeXBlKCRkZWZbJ2l0ZW1zJ10sICRwYXRoLicuaXRlbXMnKTsKfSBlbHNlIHsKJHZhbFR5cGUgPSBuZXcgTWl4ZWRUeXBlKCk7Cn0KCiR0eXBlc1tdID0gbmV3IEFycmF5VHlwZShuZXcgSW50ZWdlclR5cGUoKSwgJHZhbFR5cGUpOwpicmVhazsKCmRlZmF1bHQ6CiR0eXBlc1tdID0gbmV3IE1peGVkVHlwZSgpOwp9Cn0KCiR0eXBlID0gVHlwZUNvbWJpbmF0b3I6OnVuaW9uKC4uLiR0eXBlcyk7Cn0gZWxzZWlmIChpc3NldCgkZGVmWydlbnVtJ10pKSB7CiR0eXBlID0gVHlwZUNvbWJpbmF0b3I6OnVuaW9uKC4uLmFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkdmFsdWUpOiBDb25zdGFudFN0cmluZ1R5cGUgewpyZXR1cm4gbmV3IENvbnN0YW50U3RyaW5nVHlwZSgkdmFsdWUpOwp9LCAkZGVmWydlbnVtJ10pKTsKfSBlbHNlIHsKJHR5cGUgPSBuZXcgTWl4ZWRUeXBlKCk7Cn0KCgppZiAoJHBhdGggPT09ICdhbGxvdy1wbHVnaW5zJyAmJiB0aW1lKCkgPCBzdHJ0b3RpbWUoJzIwMjItMDctMDEnKSkgewokdHlwZSA9IFR5cGVDb21iaW5hdG9yOjphZGROdWxsKCR0eXBlKTsKfQoKCmlmIChpbl9hcnJheSgkcGF0aCwgWydhdXRvbG9hZGVyLXN1ZmZpeCcsICdnaXRsYWItcHJvdG9jb2wnXSwgdHJ1ZSkpIHsKJHR5cGUgPSBUeXBlQ29tYmluYXRvcjo6YWRkTnVsbCgkdHlwZSk7Cn0KCnJldHVybiAkdHlwZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQSFBTdGFuOwoKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxSdWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBQaHBQYXJzZXJcTm9kZVxFeHByXE1ldGhvZENhbGw7CnVzZSBQSFBTdGFuXEFuYWx5c2VyXFNjb3BlOwp1c2UgUEhQU3RhblxSZWZsZWN0aW9uXE1ldGhvZFJlZmxlY3Rpb247CnVzZSBQSFBTdGFuXFR5cGVcQWNjZXNzb3J5XEFjY2Vzc29yeU5vbkVtcHR5U3RyaW5nVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxDb25zdGFudFxDb25zdGFudEFycmF5VHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxDb25zdGFudFxDb25zdGFudFN0cmluZ1R5cGU7CnVzZSBQSFBTdGFuXFR5cGVcQ29uc3RhbnRcQ29uc3RhbnRJbnRlZ2VyVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxEeW5hbWljTWV0aG9kUmV0dXJuVHlwZUV4dGVuc2lvbjsKdXNlIFBIUFN0YW5cVHlwZVxJbnRlZ2VyVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxTdHJpbmdUeXBlOwp1c2UgUEhQU3RhblxUeXBlXFR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcT2JqZWN0VHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlQ29tYmluYXRvcjsKdXNlIFBocFBhcnNlclxOb2RlXElkZW50aWZpZXI7CgpmaW5hbCBjbGFzcyBSdWxlUmVhc29uRGF0YVJldHVyblR5cGVFeHRlbnNpb24gaW1wbGVtZW50cyBEeW5hbWljTWV0aG9kUmV0dXJuVHlwZUV4dGVuc2lvbgp7CnB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzcygpOiBzdHJpbmcKewpyZXR1cm4gUnVsZTo6Y2xhc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc01ldGhvZFN1cHBvcnRlZChNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uKTogYm9vbAp7CnJldHVybiBzdHJ0b2xvd2VyKCRtZXRob2RSZWZsZWN0aW9uLT5nZXROYW1lKCkpID09PSAnZ2V0cmVhc29uZGF0YSc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlRnJvbU1ldGhvZENhbGwoTWV0aG9kUmVmbGVjdGlvbiAkbWV0aG9kUmVmbGVjdGlvbiwgTWV0aG9kQ2FsbCAkbWV0aG9kQ2FsbCwgU2NvcGUgJHNjb3BlKTogVHlwZQp7CiRyZWFzb25UeXBlID0gJHNjb3BlLT5nZXRUeXBlKG5ldyBNZXRob2RDYWxsKCRtZXRob2RDYWxsLT52YXIsIG5ldyBJZGVudGlmaWVyKCdnZXRSZWFzb24nKSkpOwoKJHR5cGVzID0gWwpSdWxlOjpSVUxFX1JPT1RfUkVRVUlSRSA9PiBuZXcgQ29uc3RhbnRBcnJheVR5cGUoW25ldyBDb25zdGFudFN0cmluZ1R5cGUoJ3BhY2thZ2VOYW1lJyksIG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ2NvbnN0cmFpbnQnKV0sIFtuZXcgU3RyaW5nVHlwZSwgbmV3IE9iamVjdFR5cGUoQ29uc3RyYWludEludGVyZmFjZTo6Y2xhc3MpXSksClJ1bGU6OlJVTEVfRklYRUQgPT4gbmV3IENvbnN0YW50QXJyYXlUeXBlKFtuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdwYWNrYWdlJyldLCBbbmV3IE9iamVjdFR5cGUoQmFzZVBhY2thZ2U6OmNsYXNzKV0pLApSdWxlOjpSVUxFX1BBQ0tBR0VfQ09ORkxJQ1QgPT4gbmV3IE9iamVjdFR5cGUoTGluazo6Y2xhc3MpLApSdWxlOjpSVUxFX1BBQ0tBR0VfUkVRVUlSRVMgPT4gbmV3IE9iamVjdFR5cGUoTGluazo6Y2xhc3MpLApSdWxlOjpSVUxFX1BBQ0tBR0VfU0FNRV9OQU1FID0+IFR5cGVDb21iaW5hdG9yOjppbnRlcnNlY3QobmV3IFN0cmluZ1R5cGUsIG5ldyBBY2Nlc3NvcnlOb25FbXB0eVN0cmluZ1R5cGUoKSksClJ1bGU6OlJVTEVfTEVBUk5FRCA9PiBuZXcgSW50ZWdlclR5cGUoKSwKUnVsZTo6UlVMRV9QQUNLQUdFX0FMSUFTID0+IG5ldyBPYmplY3RUeXBlKEJhc2VQYWNrYWdlOjpjbGFzcyksClJ1bGU6OlJVTEVfUEFDS0FHRV9JTlZFUlNFX0FMSUFTID0+IG5ldyBPYmplY3RUeXBlKEJhc2VQYWNrYWdlOjpjbGFzcyksCl07Cgpmb3JlYWNoICgkdHlwZXMgYXMgJGNvbnN0ID0+ICR0eXBlKSB7CmlmICgobmV3IENvbnN0YW50SW50ZWdlclR5cGUoJGNvbnN0KSktPmlzU3VwZXJUeXBlT2YoJHJlYXNvblR5cGUpLT55ZXMoKSkgewpyZXR1cm4gJHR5cGU7Cn0KfQoKcmV0dXJuIFR5cGVDb21iaW5hdG9yOjp1bmlvbiguLi4kdHlwZXMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwoKCgoKY2xhc3MgQWxpYXNQYWNrYWdlIGV4dGVuZHMgQmFzZVBhY2thZ2UKewoKcHJvdGVjdGVkICR2ZXJzaW9uOwoKcHJvdGVjdGVkICRwcmV0dHlWZXJzaW9uOwoKcHJvdGVjdGVkICRkZXY7Cgpwcm90ZWN0ZWQgJHJvb3RQYWNrYWdlQWxpYXMgPSBmYWxzZTsKCgoKCnByb3RlY3RlZCAkc3RhYmlsaXR5OwoKcHJvdGVjdGVkICRoYXNTZWxmVmVyc2lvblJlcXVpcmVzID0gZmFsc2U7CgoKcHJvdGVjdGVkICRhbGlhc09mOwoKcHJvdGVjdGVkICRyZXF1aXJlczsKCnByb3RlY3RlZCAkZGV2UmVxdWlyZXM7Cgpwcm90ZWN0ZWQgJGNvbmZsaWN0czsKCnByb3RlY3RlZCAkcHJvdmlkZXM7Cgpwcm90ZWN0ZWQgJHJlcGxhY2VzOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChCYXNlUGFja2FnZSAkYWxpYXNPZiwgc3RyaW5nICR2ZXJzaW9uLCBzdHJpbmcgJHByZXR0eVZlcnNpb24pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkYWxpYXNPZi0+Z2V0TmFtZSgpKTsKCiR0aGlzLT52ZXJzaW9uID0gJHZlcnNpb247CiR0aGlzLT5wcmV0dHlWZXJzaW9uID0gJHByZXR0eVZlcnNpb247CiR0aGlzLT5hbGlhc09mID0gJGFsaWFzT2Y7CiR0aGlzLT5zdGFiaWxpdHkgPSBWZXJzaW9uUGFyc2VyOjpwYXJzZVN0YWJpbGl0eSgkdmVyc2lvbik7CiR0aGlzLT5kZXYgPSAkdGhpcy0+c3RhYmlsaXR5ID09PSAnZGV2JzsKCmZvcmVhY2ggKExpbms6OiRUWVBFUyBhcyAkdHlwZSkgewokbGlua3MgPSAkYWxpYXNPZi0+eydnZXQnIC4gdWNmaXJzdCgkdHlwZSl9KCk7CiR0aGlzLT57JHR5cGV9ID0gJHRoaXMtPnJlcGxhY2VTZWxmVmVyc2lvbkRlcGVuZGVuY2llcygkbGlua3MsICR0eXBlKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNPZigpCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnZlcnNpb247Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFiaWxpdHkoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zdGFiaWxpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlWZXJzaW9uKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cHJldHR5VmVyc2lvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGV2KCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRldjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcXVpcmVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXF1aXJlczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25mbGljdHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmNvbmZsaWN0czsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cHJvdmlkZXM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbGFjZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcGxhY2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2UmVxdWlyZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmRldlJlcXVpcmVzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSb290UGFja2FnZUFsaWFzKGJvb2wgJHZhbHVlKTogdm9pZAp7CiR0aGlzLT5yb290UGFja2FnZUFsaWFzID0gJHZhbHVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNSb290UGFja2FnZUFsaWFzKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnJvb3RQYWNrYWdlQWxpYXM7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZXBsYWNlU2VsZlZlcnNpb25EZXBlbmRlbmNpZXMoYXJyYXkgJGxpbmtzLCAkbGlua1R5cGUpOiBhcnJheQp7CgokcHJldHR5VmVyc2lvbiA9ICR0aGlzLT5wcmV0dHlWZXJzaW9uOwppZiAoJHByZXR0eVZlcnNpb24gPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiRwcmV0dHlWZXJzaW9uID0gJHRoaXMtPmFsaWFzT2YtPmdldFByZXR0eVZlcnNpb24oKTsKfQoKaWYgKFxpbl9hcnJheSgkbGlua1R5cGUsIFtMaW5rOjpUWVBFX0NPTkZMSUNULCBMaW5rOjpUWVBFX1BST1ZJREUsIExpbms6OlRZUEVfUkVQTEFDRV0sIHRydWUpKSB7CiRuZXdMaW5rcyA9IFtdOwpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKCmlmICgnc2VsZi52ZXJzaW9uJyA9PT0gJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSkgewokbmV3TGlua3NbXSA9IG5ldyBMaW5rKCRsaW5rLT5nZXRTb3VyY2UoKSwgJGxpbmstPmdldFRhcmdldCgpLCAkY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9JywgJHRoaXMtPnZlcnNpb24pLCAkbGlua1R5cGUsICRwcmV0dHlWZXJzaW9uKTsKJGNvbnN0cmFpbnQtPnNldFByZXR0eVN0cmluZygkcHJldHR5VmVyc2lvbik7Cn0KfQokbGlua3MgPSBhcnJheV9tZXJnZSgkbGlua3MsICRuZXdMaW5rcyk7Cn0gZWxzZSB7CmZvcmVhY2ggKCRsaW5rcyBhcyAkaW5kZXggPT4gJGxpbmspIHsKaWYgKCdzZWxmLnZlcnNpb24nID09PSAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpKSB7CmlmICgkbGlua1R5cGUgPT09IExpbms6OlRZUEVfUkVRVUlSRSkgewokdGhpcy0+aGFzU2VsZlZlcnNpb25SZXF1aXJlcyA9IHRydWU7Cn0KJGxpbmtzWyRpbmRleF0gPSBuZXcgTGluaygkbGluay0+Z2V0U291cmNlKCksICRsaW5rLT5nZXRUYXJnZXQoKSwgJGNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPScsICR0aGlzLT52ZXJzaW9uKSwgJGxpbmtUeXBlLCAkcHJldHR5VmVyc2lvbik7CiRjb25zdHJhaW50LT5zZXRQcmV0dHlTdHJpbmcoJHByZXR0eVZlcnNpb24pOwp9Cn0KfQoKcmV0dXJuICRsaW5rczsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1NlbGZWZXJzaW9uUmVxdWlyZXMoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+aGFzU2VsZlZlcnNpb25SZXF1aXJlczsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuIHBhcmVudDo6X190b1N0cmluZygpLicgKCcuKCR0aGlzLT5yb290UGFja2FnZUFsaWFzID8gJ3Jvb3QgJyA6ICcnKS4gJ2FsaWFzIG9mICcuJHRoaXMtPmFsaWFzT2YtPmdldFZlcnNpb24oKS4nKSc7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFR5cGUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFRhcmdldERpcigpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRUYXJnZXREaXIoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEV4dHJhKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRFeHRyYSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5zdGFsbGF0aW9uU291cmNlKD9zdHJpbmcgJHR5cGUpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEluc3RhbGxhdGlvblNvdXJjZSgkdHlwZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsYXRpb25Tb3VyY2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFNvdXJjZVR5cGUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybCgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTb3VyY2VVcmwoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFNvdXJjZVVybHMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVJlZmVyZW5jZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZVJlZmVyZW5jZSg/c3RyaW5nICRyZWZlcmVuY2UpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFNvdXJjZVJlZmVyZW5jZSgkcmVmZXJlbmNlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZU1pcnJvcnMoP2FycmF5ICRtaXJyb3JzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRTb3VyY2VNaXJyb3JzKCRtaXJyb3JzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZU1pcnJvcnMoKTogP2FycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTb3VyY2VNaXJyb3JzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VHlwZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXREaXN0VHlwZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFVybCgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXREaXN0VXJsKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VXJscygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0RGlzdFVybHMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RSZWZlcmVuY2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0RGlzdFJlZmVyZW5jZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFJlZmVyZW5jZSg/c3RyaW5nICRyZWZlcmVuY2UpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldERpc3RSZWZlcmVuY2UoJHJlZmVyZW5jZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0U2hhMUNoZWNrc3VtKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldERpc3RTaGExQ2hlY2tzdW0oKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFRyYW5zcG9ydE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFRyYW5zcG9ydE9wdGlvbnMoJG9wdGlvbnMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0T3B0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdE1pcnJvcnMoP2FycmF5ICRtaXJyb3JzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXREaXN0TWlycm9ycygkbWlycm9ycyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0TWlycm9ycygpOiA/YXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldERpc3RNaXJyb3JzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRvbG9hZCgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0QXV0b2xvYWQoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERldkF1dG9sb2FkKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXREZXZBdXRvbG9hZCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5jbHVkZVBhdGhzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRJbmNsdWRlUGF0aHMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFBocEV4dCgpOiA/YXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFBocEV4dCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVsZWFzZURhdGUoKTogP1xEYXRlVGltZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0UmVsZWFzZURhdGUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEJpbmFyaWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRCaW5hcmllcygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3VnZ2VzdHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFN1Z2dlc3RzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXROb3RpZmljYXRpb25VcmwoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0Tm90aWZpY2F0aW9uVXJsKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0RlZmF1bHRCcmFuY2goKTogYm9vbAp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+aXNEZWZhdWx0QnJhbmNoKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0VXJsKD9zdHJpbmcgJHVybCk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0RGlzdFVybCgkdXJsKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RUeXBlKD9zdHJpbmcgJHR5cGUpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldERpc3RUeXBlKCR0eXBlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZURpc3RSZWZlcmVuY2VzKHN0cmluZyAkcmVmZXJlbmNlKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRTb3VyY2VEaXN0UmVmZXJlbmNlcygkcmVmZXJlbmNlKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwoKdXNlIEZpbHRlckl0ZXJhdG9yOwp1c2UgSXRlcmF0b3I7CnVzZSBQaGFyRGF0YTsKdXNlIFNwbEZpbGVJbmZvOwoKCgoKY2xhc3MgQXJjaGl2YWJsZUZpbGVzRmlsdGVyIGV4dGVuZHMgRmlsdGVySXRlcmF0b3IKewoKcHJpdmF0ZSAkZGlycyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpOiBib29sCnsKJGZpbGUgPSAkdGhpcy0+Z2V0SW5uZXJJdGVyYXRvcigpLT5jdXJyZW50KCk7CmlmICgkZmlsZS0+aXNEaXIoKSkgewokdGhpcy0+ZGlyc1tdID0gKHN0cmluZykgJGZpbGU7CgpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWRkRW1wdHlEaXIoUGhhckRhdGEgJHBoYXIsIHN0cmluZyAkc291cmNlcyk6IHZvaWQKewpmb3JlYWNoICgkdGhpcy0+ZGlycyBhcyAkZmlsZXBhdGgpIHsKJGxvY2FsbmFtZSA9IHN0cl9yZXBsYWNlKCRzb3VyY2VzIC4gIi8iLCAnJywgJGZpbGVwYXRoKTsKJHBoYXItPmFkZEVtcHR5RGlyKCRsb2NhbG5hbWUpOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBGaWxlc3lzdGVtSXRlcmF0b3I7CnVzZSBGaWx0ZXJJdGVyYXRvcjsKdXNlIEl0ZXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEZpbmRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxTcGxGaWxlSW5mbzsKCgoKCgoKCgoKCmNsYXNzIEFyY2hpdmFibGVGaWxlc0ZpbmRlciBleHRlbmRzIEZpbHRlckl0ZXJhdG9yCnsKCgoKcHJvdGVjdGVkICRmaW5kZXI7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc291cmNlcywgYXJyYXkgJGV4Y2x1ZGVzLCBib29sICRpZ25vcmVGaWx0ZXJzID0gZmFsc2UpCnsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKCiRzb3VyY2VzUmVhbFBhdGggPSByZWFscGF0aCgkc291cmNlcyk7CmlmICgkc291cmNlc1JlYWxQYXRoID09PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCByZWFscGF0aCgpIHRoZSBzb3VyY2UgZGlyZWN0b3J5ICInLiRzb3VyY2VzLiciJyk7Cn0KJHNvdXJjZXMgPSAkZnMtPm5vcm1hbGl6ZVBhdGgoJHNvdXJjZXNSZWFsUGF0aCk7CgppZiAoJGlnbm9yZUZpbHRlcnMpIHsKJGZpbHRlcnMgPSBbXTsKfSBlbHNlIHsKJGZpbHRlcnMgPSBbCm5ldyBHaXRFeGNsdWRlRmlsdGVyKCRzb3VyY2VzKSwKbmV3IENvbXBvc2VyRXhjbHVkZUZpbHRlcigkc291cmNlcywgJGV4Y2x1ZGVzKSwKXTsKfQoKJHRoaXMtPmZpbmRlciA9IG5ldyBGaW5kZXIoKTsKCiRmaWx0ZXIgPSBzdGF0aWMgZnVuY3Rpb24gKFxTcGxGaWxlSW5mbyAkZmlsZSkgdXNlICgkc291cmNlcywgJGZpbHRlcnMsICRmcyk6IGJvb2wgewokcmVhbHBhdGggPSAkZmlsZS0+Z2V0UmVhbFBhdGgoKTsKaWYgKCRyZWFscGF0aCA9PT0gZmFsc2UpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgkZmlsZS0+aXNMaW5rKCkgJiYgc3RycG9zKCRyZWFscGF0aCwgJHNvdXJjZXMpICE9PSAwKSB7CnJldHVybiBmYWxzZTsKfQoKJHJlbGF0aXZlUGF0aCA9IFByZWc6OnJlcGxhY2UoCicjXicucHJlZ19xdW90ZSgkc291cmNlcywgJyMnKS4nIycsCicnLAokZnMtPm5vcm1hbGl6ZVBhdGgoJHJlYWxwYXRoKQopOwoKJGV4Y2x1ZGUgPSBmYWxzZTsKZm9yZWFjaCAoJGZpbHRlcnMgYXMgJGZpbHRlcikgewokZXhjbHVkZSA9ICRmaWx0ZXItPmZpbHRlcigkcmVsYXRpdmVQYXRoLCAkZXhjbHVkZSk7Cn0KCnJldHVybiAhJGV4Y2x1ZGU7Cn07CgokdGhpcy0+ZmluZGVyCi0+aW4oJHNvdXJjZXMpCi0+ZmlsdGVyKCRmaWx0ZXIpCi0+aWdub3JlVkNTKHRydWUpCi0+aWdub3JlRG90RmlsZXMoZmFsc2UpCi0+c29ydEJ5TmFtZSgpOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkdGhpcy0+ZmluZGVyLT5nZXRJdGVyYXRvcigpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpOiBib29sCnsKCiRjdXJyZW50ID0gJHRoaXMtPmdldElubmVySXRlcmF0b3IoKS0+Y3VycmVudCgpOwoKaWYgKCEkY3VycmVudC0+aXNEaXIoKSkgewpyZXR1cm4gdHJ1ZTsKfQoKJGl0ZXJhdG9yID0gbmV3IEZpbGVzeXN0ZW1JdGVyYXRvcigoc3RyaW5nKSAkY3VycmVudCwgRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFMpOwoKcmV0dXJuICEkaXRlcmF0b3ItPnZhbGlkKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCnVzZSBDb21wb3NlclxEb3dubG9hZGVyXERvd25sb2FkTWFuYWdlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXExvb3A7CnVzZSBDb21wb3NlclxVdGlsXFN5bmNIZWxwZXI7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKY2xhc3MgQXJjaGl2ZU1hbmFnZXIKewoKcHJvdGVjdGVkICRkb3dubG9hZE1hbmFnZXI7Cgpwcm90ZWN0ZWQgJGxvb3A7CgoKCgpwcm90ZWN0ZWQgJGFyY2hpdmVycyA9IFtdOwoKCgoKcHJvdGVjdGVkICRvdmVyd3JpdGVGaWxlcyA9IHRydWU7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoRG93bmxvYWRNYW5hZ2VyICRkb3dubG9hZE1hbmFnZXIsIExvb3AgJGxvb3ApCnsKJHRoaXMtPmRvd25sb2FkTWFuYWdlciA9ICRkb3dubG9hZE1hbmFnZXI7CiR0aGlzLT5sb29wID0gJGxvb3A7Cn0KCnB1YmxpYyBmdW5jdGlvbiBhZGRBcmNoaXZlcihBcmNoaXZlckludGVyZmFjZSAkYXJjaGl2ZXIpOiB2b2lkCnsKJHRoaXMtPmFyY2hpdmVyc1tdID0gJGFyY2hpdmVyOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE92ZXJ3cml0ZUZpbGVzKGJvb2wgJG92ZXJ3cml0ZUZpbGVzKTogc2VsZgp7CiR0aGlzLT5vdmVyd3JpdGVGaWxlcyA9ICRvdmVyd3JpdGVGaWxlczsKCnJldHVybiAkdGhpczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlRmlsZW5hbWVQYXJ0cyhDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBhcnJheQp7CiRiYXNlTmFtZSA9ICRwYWNrYWdlLT5nZXRBcmNoaXZlTmFtZSgpOwppZiAobnVsbCA9PT0gJGJhc2VOYW1lKSB7CiRiYXNlTmFtZSA9IFByZWc6OnJlcGxhY2UoJyNbXmEtejAtOS1fXSNpJywgJy0nLCAkcGFja2FnZS0+Z2V0TmFtZSgpKTsKfQoKJHBhcnRzID0gWwonYmFzZScgPT4gJGJhc2VOYW1lLApdOwoKJGRpc3RSZWZlcmVuY2UgPSAkcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpOwppZiAobnVsbCAhPT0gJGRpc3RSZWZlcmVuY2UgJiYgUHJlZzo6aXNNYXRjaCgne15bYS1mMC05XXs0MH0kfScsICRkaXN0UmVmZXJlbmNlKSkgewokcGFydHNbJ2Rpc3RfcmVmZXJlbmNlJ10gPSAkZGlzdFJlZmVyZW5jZTsKJHBhcnRzWydkaXN0X3R5cGUnXSA9ICRwYWNrYWdlLT5nZXREaXN0VHlwZSgpOwp9IGVsc2UgewokcGFydHNbJ3ZlcnNpb24nXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7CiRwYXJ0c1snZGlzdF9yZWZlcmVuY2UnXSA9ICRkaXN0UmVmZXJlbmNlOwp9Cgokc291cmNlUmVmZXJlbmNlID0gJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwppZiAobnVsbCAhPT0gJHNvdXJjZVJlZmVyZW5jZSkgewokcGFydHNbJ3NvdXJjZV9yZWZlcmVuY2UnXSA9IHN1YnN0cihoYXNoKCdzaGExJywgJHNvdXJjZVJlZmVyZW5jZSksIDAsIDYpOwp9CgokcGFydHMgPSBhcnJheV9maWx0ZXIoJHBhcnRzLCBmdW5jdGlvbiAoP3N0cmluZyAkcGFydCkgewpyZXR1cm4gJHBhcnQgIT09IG51bGw7Cn0pOwpmb3JlYWNoICgkcGFydHMgYXMgJGtleSA9PiAkcGFydCkgewokcGFydHNbJGtleV0gPSBzdHJfcmVwbGFjZSgnLycsICctJywgJHBhcnQpOwp9CgpyZXR1cm4gJHBhcnRzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZUZpbGVuYW1lRnJvbVBhcnRzKGFycmF5ICRwYXJ0cyk6IHN0cmluZwp7CnJldHVybiBpbXBsb2RlKCctJywgJHBhcnRzKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlRmlsZW5hbWUoQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5nZXRQYWNrYWdlRmlsZW5hbWVGcm9tUGFydHMoJHRoaXMtPmdldFBhY2thZ2VGaWxlbmFtZVBhcnRzKCRwYWNrYWdlKSk7Cn0KCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJjaGl2ZShDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZm9ybWF0LCBzdHJpbmcgJHRhcmdldERpciwgP3N0cmluZyAkZmlsZU5hbWUgPSBudWxsLCBib29sICRpZ25vcmVGaWx0ZXJzID0gZmFsc2UpOiBzdHJpbmcKewppZiAoZW1wdHkoJGZvcm1hdCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0Zvcm1hdCBtdXN0IGJlIHNwZWNpZmllZCcpOwp9CgoKJHVzYWJsZUFyY2hpdmVyID0gbnVsbDsKZm9yZWFjaCAoJHRoaXMtPmFyY2hpdmVycyBhcyAkYXJjaGl2ZXIpIHsKaWYgKCRhcmNoaXZlci0+c3VwcG9ydHMoJGZvcm1hdCwgJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSkpIHsKJHVzYWJsZUFyY2hpdmVyID0gJGFyY2hpdmVyOwpicmVhazsKfQp9CgoKaWYgKG51bGwgPT09ICR1c2FibGVBcmNoaXZlcikgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignTm8gYXJjaGl2ZXIgZm91bmQgdG8gc3VwcG9ydCAlcyBmb3JtYXQnLCAkZm9ybWF0KSk7Cn0KCiRmaWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oKTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlSW50ZXJmYWNlKSB7CiRzb3VyY2VQYXRoID0gcmVhbHBhdGgoJy4nKTsKfSBlbHNlIHsKCiRzb3VyY2VQYXRoID0gc3lzX2dldF90ZW1wX2RpcigpLicvY29tcG9zZXJfYXJjaGl2ZScuYmluMmhleChyYW5kb21fYnl0ZXMoNSkpOwokZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRzb3VyY2VQYXRoKTsKCnRyeSB7CgokcHJvbWlzZSA9ICR0aGlzLT5kb3dubG9hZE1hbmFnZXItPmRvd25sb2FkKCRwYWNrYWdlLCAkc291cmNlUGF0aCk7ClN5bmNIZWxwZXI6OmF3YWl0KCR0aGlzLT5sb29wLCAkcHJvbWlzZSk7CiRwcm9taXNlID0gJHRoaXMtPmRvd25sb2FkTWFuYWdlci0+aW5zdGFsbCgkcGFja2FnZSwgJHNvdXJjZVBhdGgpOwpTeW5jSGVscGVyOjphd2FpdCgkdGhpcy0+bG9vcCwgJHByb21pc2UpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiRmaWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJHNvdXJjZVBhdGgpOwp0aHJvdyAkZTsKfQoKCmlmIChmaWxlX2V4aXN0cygkY29tcG9zZXJKc29uUGF0aCA9ICRzb3VyY2VQYXRoLicvY29tcG9zZXIuanNvbicpKSB7CiRqc29uRmlsZSA9IG5ldyBKc29uRmlsZSgkY29tcG9zZXJKc29uUGF0aCk7CiRqc29uRGF0YSA9ICRqc29uRmlsZS0+cmVhZCgpOwppZiAoIWVtcHR5KCRqc29uRGF0YVsnYXJjaGl2ZSddWyduYW1lJ10pKSB7CiRwYWNrYWdlLT5zZXRBcmNoaXZlTmFtZSgkanNvbkRhdGFbJ2FyY2hpdmUnXVsnbmFtZSddKTsKfQppZiAoIWVtcHR5KCRqc29uRGF0YVsnYXJjaGl2ZSddWydleGNsdWRlJ10pKSB7CiRwYWNrYWdlLT5zZXRBcmNoaXZlRXhjbHVkZXMoJGpzb25EYXRhWydhcmNoaXZlJ11bJ2V4Y2x1ZGUnXSk7Cn0KfQp9Cgokc3VwcG9ydGVkRm9ybWF0cyA9ICR0aGlzLT5nZXRTdXBwb3J0ZWRGb3JtYXRzKCk7CiRwYWNrYWdlTmFtZVBhcnRzID0gbnVsbCA9PT0gJGZpbGVOYW1lID8KJHRoaXMtPmdldFBhY2thZ2VGaWxlbmFtZVBhcnRzKCRwYWNrYWdlKQo6IFsnYmFzZScgPT4gJGZpbGVOYW1lXTsKCiRwYWNrYWdlTmFtZSA9ICR0aGlzLT5nZXRQYWNrYWdlRmlsZW5hbWVGcm9tUGFydHMoJHBhY2thZ2VOYW1lUGFydHMpOwokZXhjbHVkZVBhdHRlcm5zID0gJHRoaXMtPmJ1aWxkRXhjbHVkZVBhdHRlcm5zKCRwYWNrYWdlTmFtZVBhcnRzLCAkc3VwcG9ydGVkRm9ybWF0cyk7CgoKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGFyZ2V0RGlyKTsKJHRhcmdldCA9IHJlYWxwYXRoKCR0YXJnZXREaXIpLicvJy4kcGFja2FnZU5hbWUuJy4nLiRmb3JtYXQ7CiRmaWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoZGlybmFtZSgkdGFyZ2V0KSk7CgppZiAoISR0aGlzLT5vdmVyd3JpdGVGaWxlcyAmJiBmaWxlX2V4aXN0cygkdGFyZ2V0KSkgewpyZXR1cm4gJHRhcmdldDsKfQoKCiR0ZW1wVGFyZ2V0ID0gc3lzX2dldF90ZW1wX2RpcigpLicvY29tcG9zZXJfYXJjaGl2ZScuYmluMmhleChyYW5kb21fYnl0ZXMoNSkpLicuJy4kZm9ybWF0OwokZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKGRpcm5hbWUoJHRlbXBUYXJnZXQpKTsKCiRhcmNoaXZlUGF0aCA9ICR1c2FibGVBcmNoaXZlci0+YXJjaGl2ZSgKJHNvdXJjZVBhdGgsCiR0ZW1wVGFyZ2V0LAokZm9ybWF0LAphcnJheV9tZXJnZSgkZXhjbHVkZVBhdHRlcm5zLCAkcGFja2FnZS0+Z2V0QXJjaGl2ZUV4Y2x1ZGVzKCkpLAokaWdub3JlRmlsdGVycwopOwokZmlsZXN5c3RlbS0+cmVuYW1lKCRhcmNoaXZlUGF0aCwgJHRhcmdldCk7CgoKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlSW50ZXJmYWNlKSB7CiRmaWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJHNvdXJjZVBhdGgpOwp9CiRmaWxlc3lzdGVtLT5yZW1vdmUoJHRlbXBUYXJnZXQpOwoKcmV0dXJuICR0YXJnZXQ7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYnVpbGRFeGNsdWRlUGF0dGVybnMoYXJyYXkgJHBhcnRzLCBhcnJheSAkZm9ybWF0cyk6IGFycmF5CnsKJGJhc2UgPSAkcGFydHNbJ2Jhc2UnXTsKaWYgKGNvdW50KCRwYXJ0cykgPiAxKSB7CiRiYXNlIC49ICctKic7Cn0KCiRwYXR0ZXJucyA9IFtdOwpmb3JlYWNoICgkZm9ybWF0cyBhcyAkZm9ybWF0KSB7CiRwYXR0ZXJuc1tdID0gIiRiYXNlLiRmb3JtYXQiOwp9CgpyZXR1cm4gJHBhdHRlcm5zOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFN1cHBvcnRlZEZvcm1hdHMoKTogYXJyYXkKewoKCgoKCiRmb3JtYXRzID0gW107CmZvcmVhY2ggKCR0aGlzLT5hcmNoaXZlcnMgYXMgJGFyY2hpdmVyKSB7CiRpdGVtcyA9IFtdOwpzd2l0Y2ggKGdldF9jbGFzcygkYXJjaGl2ZXIpKSB7CmNhc2UgWmlwQXJjaGl2ZXI6OmNsYXNzOgokaXRlbXMgPSBbJ3ppcCddOwpicmVhazsKCmNhc2UgUGhhckFyY2hpdmVyOjpjbGFzczoKJGl0ZW1zID0gWyd6aXAnLCAndGFyJywgJ3Rhci5neicsICd0YXIuYnoyJ107CmJyZWFrOwp9CgokZm9ybWF0cyA9IGFycmF5X21lcmdlKCRmb3JtYXRzLCAkaXRlbXMpOwp9CgpyZXR1cm4gYXJyYXlfdW5pcXVlKCRmb3JtYXRzKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwoKCgoKCgppbnRlcmZhY2UgQXJjaGl2ZXJJbnRlcmZhY2UKewoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhcmNoaXZlKHN0cmluZyAkc291cmNlcywgc3RyaW5nICR0YXJnZXQsIHN0cmluZyAkZm9ybWF0LCBhcnJheSAkZXhjbHVkZXMgPSBbXSwgYm9vbCAkaWdub3JlRmlsdGVycyA9IGZhbHNlKTogc3RyaW5nOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VwcG9ydHMoc3RyaW5nICRmb3JtYXQsID9zdHJpbmcgJHNvdXJjZVR5cGUpOiBib29sOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlcjsKCgoKCmFic3RyYWN0IGNsYXNzIEJhc2VFeGNsdWRlRmlsdGVyCnsKCgoKcHJvdGVjdGVkICRzb3VyY2VQYXRoOwoKCgoKcHJvdGVjdGVkICRleGNsdWRlUGF0dGVybnM7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRzb3VyY2VQYXRoKQp7CiR0aGlzLT5zb3VyY2VQYXRoID0gJHNvdXJjZVBhdGg7CiR0aGlzLT5leGNsdWRlUGF0dGVybnMgPSBbXTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaWx0ZXIoc3RyaW5nICRyZWxhdGl2ZVBhdGgsIGJvb2wgJGV4Y2x1ZGUpOiBib29sCnsKZm9yZWFjaCAoJHRoaXMtPmV4Y2x1ZGVQYXR0ZXJucyBhcyAkcGF0dGVybkRhdGEpIHsKWyRwYXR0ZXJuLCAkbmVnYXRlLCAkc3RyaXBMZWFkaW5nU2xhc2hdID0gJHBhdHRlcm5EYXRhOwoKaWYgKCRzdHJpcExlYWRpbmdTbGFzaCkgewokcGF0aCA9IHN1YnN0cigkcmVsYXRpdmVQYXRoLCAxKTsKfSBlbHNlIHsKJHBhdGggPSAkcmVsYXRpdmVQYXRoOwp9Cgp0cnkgewppZiAoUHJlZzo6aXNNYXRjaCgkcGF0dGVybiwgJHBhdGgpKSB7CiRleGNsdWRlID0gISRuZWdhdGU7Cn0KfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKCn0KfQoKcmV0dXJuICRleGNsdWRlOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZUxpbmVzKGFycmF5ICRsaW5lcywgY2FsbGFibGUgJGxpbmVQYXJzZXIpOiBhcnJheQp7CnJldHVybiBhcnJheV9maWx0ZXIoCmFycmF5X21hcCgKc3RhdGljIGZ1bmN0aW9uICgkbGluZSkgdXNlICgkbGluZVBhcnNlcikgewokbGluZSA9IHRyaW0oJGxpbmUpOwoKaWYgKCEkbGluZSB8fCAwID09PSBzdHJwb3MoJGxpbmUsICcjJykpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkbGluZVBhcnNlcigkbGluZSk7Cn0sCiRsaW5lcwopLApzdGF0aWMgZnVuY3Rpb24gKCRwYXR0ZXJuKTogYm9vbCB7CnJldHVybiAkcGF0dGVybiAhPT0gbnVsbDsKfQopOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlUGF0dGVybnMoYXJyYXkgJHJ1bGVzKTogYXJyYXkKewokcGF0dGVybnMgPSBbXTsKZm9yZWFjaCAoJHJ1bGVzIGFzICRydWxlKSB7CiRwYXR0ZXJuc1tdID0gJHRoaXMtPmdlbmVyYXRlUGF0dGVybigkcnVsZSk7Cn0KCnJldHVybiAkcGF0dGVybnM7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVQYXR0ZXJuKHN0cmluZyAkcnVsZSk6IGFycmF5CnsKJG5lZ2F0ZSA9IGZhbHNlOwokcGF0dGVybiA9ICcnOwoKaWYgKCRydWxlICE9PSAnJyAmJiAkcnVsZVswXSA9PT0gJyEnKSB7CiRuZWdhdGUgPSB0cnVlOwokcnVsZSA9IGx0cmltKCRydWxlLCAnIScpOwp9CgokZmlyc3RTbGFzaFBvc2l0aW9uID0gc3RycG9zKCRydWxlLCAnLycpOwppZiAoMCA9PT0gJGZpcnN0U2xhc2hQb3NpdGlvbikgewokcGF0dGVybiA9ICdeLyc7Cn0gZWxzZWlmIChmYWxzZSA9PT0gJGZpcnN0U2xhc2hQb3NpdGlvbiB8fCBzdHJsZW4oJHJ1bGUpIC0gMSA9PT0gJGZpcnN0U2xhc2hQb3NpdGlvbikgewokcGF0dGVybiA9ICcvJzsKfQoKJHJ1bGUgPSB0cmltKCRydWxlLCAnLycpOwoKCiRydWxlID0gc3Vic3RyKEZpbmRlclxHbG9iOjp0b1JlZ2V4KCRydWxlKSwgMiwgLTIpOwoKcmV0dXJuIFsneycuJHBhdHRlcm4uJHJ1bGUuJyg/PSR8Lyl9JywgJG5lZ2F0ZSwgZmFsc2VdOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcQXJjaGl2ZXI7CgoKCgoKCmNsYXNzIENvbXBvc2VyRXhjbHVkZUZpbHRlciBleHRlbmRzIEJhc2VFeGNsdWRlRmlsdGVyCnsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHNvdXJjZVBhdGgsIGFycmF5ICRleGNsdWRlUnVsZXMpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkc291cmNlUGF0aCk7CiR0aGlzLT5leGNsdWRlUGF0dGVybnMgPSAkdGhpcy0+Z2VuZXJhdGVQYXR0ZXJucygkZXhjbHVkZVJ1bGVzKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgoKCgpjbGFzcyBHaXRFeGNsdWRlRmlsdGVyIGV4dGVuZHMgQmFzZUV4Y2x1ZGVGaWx0ZXIKewoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRzb3VyY2VQYXRoKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHNvdXJjZVBhdGgpOwoKaWYgKGZpbGVfZXhpc3RzKCRzb3VyY2VQYXRoLicvLmdpdGF0dHJpYnV0ZXMnKSkgewokdGhpcy0+ZXhjbHVkZVBhdHRlcm5zID0gYXJyYXlfbWVyZ2UoCiR0aGlzLT5leGNsdWRlUGF0dGVybnMsCiR0aGlzLT5wYXJzZUxpbmVzKApmaWxlKCRzb3VyY2VQYXRoLicvLmdpdGF0dHJpYnV0ZXMnKSwKWyR0aGlzLCAncGFyc2VHaXRBdHRyaWJ1dGVzTGluZSddCikKKTsKfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlR2l0QXR0cmlidXRlc0xpbmUoc3RyaW5nICRsaW5lKTogP2FycmF5CnsKJHBhcnRzID0gUHJlZzo6c3BsaXQoJyNccysjJywgJGxpbmUpOwoKaWYgKGNvdW50KCRwYXJ0cykgPT09IDIgJiYgJHBhcnRzWzFdID09PSAnZXhwb3J0LWlnbm9yZScpIHsKcmV0dXJuICR0aGlzLT5nZW5lcmF0ZVBhdHRlcm4oJHBhcnRzWzBdKTsKfQoKaWYgKGNvdW50KCRwYXJ0cykgPT09IDIgJiYgJHBhcnRzWzFdID09PSAnLWV4cG9ydC1pZ25vcmUnKSB7CnJldHVybiAkdGhpcy0+Z2VuZXJhdGVQYXR0ZXJuKCchJy4kcGFydHNbMF0pOwp9CgpyZXR1cm4gbnVsbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwoKdXNlIFBoYXJEYXRhOwoKCgoKCgpjbGFzcyBQaGFyQXJjaGl2ZXIgaW1wbGVtZW50cyBBcmNoaXZlckludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgc3RhdGljICRmb3JtYXRzID0gWwonemlwJyA9PiBcUGhhcjo6WklQLAondGFyJyA9PiBcUGhhcjo6VEFSLAondGFyLmd6JyA9PiBcUGhhcjo6VEFSLAondGFyLmJ6MicgPT4gXFBoYXI6OlRBUiwKXTsKCgpwcm90ZWN0ZWQgc3RhdGljICRjb21wcmVzc0Zvcm1hdHMgPSBbCid0YXIuZ3onID0+IFxQaGFyOjpHWiwKJ3Rhci5iejInID0+IFxQaGFyOjpCWjIsCl07CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJjaGl2ZShzdHJpbmcgJHNvdXJjZXMsIHN0cmluZyAkdGFyZ2V0LCBzdHJpbmcgJGZvcm1hdCwgYXJyYXkgJGV4Y2x1ZGVzID0gW10sIGJvb2wgJGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IHN0cmluZwp7CiRzb3VyY2VzID0gcmVhbHBhdGgoJHNvdXJjZXMpOwoKCmlmIChmaWxlX2V4aXN0cygkdGFyZ2V0KSkgewp1bmxpbmsoJHRhcmdldCk7Cn0KCnRyeSB7CiRmaWxlbmFtZSA9IHN1YnN0cigkdGFyZ2V0LCAwLCBzdHJycG9zKCR0YXJnZXQsICRmb3JtYXQpIC0gMSk7CgoKaWYgKGlzc2V0KHN0YXRpYzo6JGNvbXByZXNzRm9ybWF0c1skZm9ybWF0XSkpIHsKCiR0YXJnZXQgPSAkZmlsZW5hbWUgLiAnLnRhcic7Cn0KCiRwaGFyID0gbmV3IFxQaGFyRGF0YSgKJHRhcmdldCwKXEZpbGVzeXN0ZW1JdGVyYXRvcjo6S0VZX0FTX1BBVEhOQU1FIHwgXEZpbGVzeXN0ZW1JdGVyYXRvcjo6Q1VSUkVOVF9BU19GSUxFSU5GTywKJycsCnN0YXRpYzo6JGZvcm1hdHNbJGZvcm1hdF0KKTsKJGZpbGVzID0gbmV3IEFyY2hpdmFibGVGaWxlc0ZpbmRlcigkc291cmNlcywgJGV4Y2x1ZGVzLCAkaWdub3JlRmlsdGVycyk7CiRmaWxlc09ubHkgPSBuZXcgQXJjaGl2YWJsZUZpbGVzRmlsdGVyKCRmaWxlcyk7CiRwaGFyLT5idWlsZEZyb21JdGVyYXRvcigkZmlsZXNPbmx5LCAkc291cmNlcyk7CiRmaWxlc09ubHktPmFkZEVtcHR5RGlyKCRwaGFyLCAkc291cmNlcyk7CgppZiAoIWZpbGVfZXhpc3RzKCR0YXJnZXQpKSB7CiR0YXJnZXQgPSAkZmlsZW5hbWUgLiAnLicgLiAkZm9ybWF0Owp1bnNldCgkcGhhcik7CgppZiAoJGZvcm1hdCA9PT0gJ3RhcicpIHsKCmZpbGVfcHV0X2NvbnRlbnRzKCR0YXJnZXQsIHN0cl9yZXBlYXQoIlwwIiwgMTAyNDApKTsKfSBlbHNlaWYgKCRmb3JtYXQgPT09ICd6aXAnKSB7CgokZW9jZCA9IHBhY2soCidWdnZ2dlZWdicsCjB4MDYwNTRiNTAsIAowLCAKMCwgCjAsIAowLCAKMCwgCjAsIAowIAopOwoKZmlsZV9wdXRfY29udGVudHMoJHRhcmdldCwgJGVvY2QpOwp9IGVsc2VpZiAoJGZvcm1hdCA9PT0gJ3Rhci5neicgfHwgJGZvcm1hdCA9PT0gJ3Rhci5iejInKSB7CmlmICghUGhhckRhdGE6OmNhbkNvbXByZXNzKHN0YXRpYzo6JGNvbXByZXNzRm9ybWF0c1skZm9ybWF0XSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ0NhbiBub3QgY29tcHJlc3MgdG8gJXMgZm9ybWF0JywgJGZvcm1hdCkpOwp9CmlmICgkZm9ybWF0ID09PSAndGFyLmd6JyAmJiBmdW5jdGlvbl9leGlzdHMoJ2d6Y29tcHJlc3MnKSkgewpmaWxlX3B1dF9jb250ZW50cygkdGFyZ2V0LCBnemNvbXByZXNzKHN0cl9yZXBlYXQoIlwwIiwgMTAyNDApKSk7Cn0gZWxzZWlmICgkZm9ybWF0ID09PSAndGFyLmJ6MicgJiYgZnVuY3Rpb25fZXhpc3RzKCdiemNvbXByZXNzJykpIHsKZmlsZV9wdXRfY29udGVudHMoJHRhcmdldCwgYnpjb21wcmVzcyhzdHJfcmVwZWF0KCJcMCIsIDEwMjQwKSkpOwp9Cn0KCnJldHVybiAkdGFyZ2V0Owp9CgppZiAoaXNzZXQoc3RhdGljOjokY29tcHJlc3NGb3JtYXRzWyRmb3JtYXRdKSkgewoKaWYgKCFQaGFyRGF0YTo6Y2FuQ29tcHJlc3Moc3RhdGljOjokY29tcHJlc3NGb3JtYXRzWyRmb3JtYXRdKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignQ2FuIG5vdCBjb21wcmVzcyB0byAlcyBmb3JtYXQnLCAkZm9ybWF0KSk7Cn0KCgp1bmxpbmsoJHRhcmdldCk7CgoKJHBoYXItPmNvbXByZXNzKHN0YXRpYzo6JGNvbXByZXNzRm9ybWF0c1skZm9ybWF0XSk7CgoKJHRhcmdldCA9ICRmaWxlbmFtZSAuICcuJyAuICRmb3JtYXQ7Cn0KCnJldHVybiAkdGFyZ2V0Owp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CiRtZXNzYWdlID0gc3ByaW50ZigKIkNvdWxkIG5vdCBjcmVhdGUgYXJjaGl2ZSAnJXMnIGZyb20gJyVzJzogJXMiLAokdGFyZ2V0LAokc291cmNlcywKJGUtPmdldE1lc3NhZ2UoKQopOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRtZXNzYWdlLCAkZS0+Z2V0Q29kZSgpLCAkZSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIHN1cHBvcnRzKHN0cmluZyAkZm9ybWF0LCA/c3RyaW5nICRzb3VyY2VUeXBlKTogYm9vbAp7CnJldHVybiBpc3NldChzdGF0aWM6OiRmb3JtYXRzWyRmb3JtYXRdKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwoKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBaaXBBcmNoaXZlOwoKCgoKY2xhc3MgWmlwQXJjaGl2ZXIgaW1wbGVtZW50cyBBcmNoaXZlckludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgc3RhdGljICRmb3JtYXRzID0gWwonemlwJyA9PiB0cnVlLApdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGFyY2hpdmUoc3RyaW5nICRzb3VyY2VzLCBzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRmb3JtYXQsIGFycmF5ICRleGNsdWRlcyA9IFtdLCBib29sICRpZ25vcmVGaWx0ZXJzID0gZmFsc2UpOiBzdHJpbmcKewokZnMgPSBuZXcgRmlsZXN5c3RlbSgpOwokc291cmNlc1JlYWxwYXRoID0gcmVhbHBhdGgoJHNvdXJjZXMpOwppZiAoZmFsc2UgIT09ICRzb3VyY2VzUmVhbHBhdGgpIHsKJHNvdXJjZXMgPSAkc291cmNlc1JlYWxwYXRoOwp9CnVuc2V0KCRzb3VyY2VzUmVhbHBhdGgpOwokc291cmNlcyA9ICRmcy0+bm9ybWFsaXplUGF0aCgkc291cmNlcyk7CgokemlwID0gbmV3IFppcEFyY2hpdmUoKTsKJHJlcyA9ICR6aXAtPm9wZW4oJHRhcmdldCwgWmlwQXJjaGl2ZTo6Q1JFQVRFKTsKaWYgKCRyZXMgPT09IHRydWUpIHsKJGZpbGVzID0gbmV3IEFyY2hpdmFibGVGaWxlc0ZpbmRlcigkc291cmNlcywgJGV4Y2x1ZGVzLCAkaWdub3JlRmlsdGVycyk7CmZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZSkgewoKJGZpbGVwYXRoID0gJGZpbGUtPmdldFBhdGhuYW1lKCk7CiRyZWxhdGl2ZVBhdGggPSAkZmlsZS0+Z2V0UmVsYXRpdmVQYXRobmFtZSgpOwoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokcmVsYXRpdmVQYXRoID0gc3RydHIoJHJlbGF0aXZlUGF0aCwgJ1xcJywgJy8nKTsKfQoKaWYgKCRmaWxlLT5pc0RpcigpKSB7CiR6aXAtPmFkZEVtcHR5RGlyKCRyZWxhdGl2ZVBhdGgpOwp9IGVsc2UgewokemlwLT5hZGRGaWxlKCRmaWxlcGF0aCwgJHJlbGF0aXZlUGF0aCk7Cn0KCgoKCmlmIChtZXRob2RfZXhpc3RzKCR6aXAsICdzZXRFeHRlcm5hbEF0dHJpYnV0ZXNOYW1lJykpIHsKJHBlcm1zID0gZmlsZXBlcm1zKCRmaWxlcGF0aCk7CgoKCgokemlwLT5zZXRFeHRlcm5hbEF0dHJpYnV0ZXNOYW1lKCRyZWxhdGl2ZVBhdGgsIFppcEFyY2hpdmU6Ok9QU1lTX1VOSVgsICRwZXJtcyA8PCAxNik7Cn0KfQppZiAoJHppcC0+Y2xvc2UoKSkgewppZiAoIWZpbGVfZXhpc3RzKCR0YXJnZXQpKSB7CgokZW9jZCA9IHBhY2soCidWdnZ2dlZWdicsCjB4MDYwNTRiNTAsIAowLCAKMCwgCjAsIAowLCAKMCwgCjAsIAowIAopOwpmaWxlX3B1dF9jb250ZW50cygkdGFyZ2V0LCAkZW9jZCk7Cn0KCnJldHVybiAkdGFyZ2V0Owp9Cn0KJG1lc3NhZ2UgPSBzcHJpbnRmKAoiQ291bGQgbm90IGNyZWF0ZSBhcmNoaXZlICclcycgZnJvbSAnJXMnOiAlcyIsCiR0YXJnZXQsCiRzb3VyY2VzLAokemlwLT5nZXRTdGF0dXNTdHJpbmcoKQopOwp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJG1lc3NhZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VwcG9ydHMoc3RyaW5nICRmb3JtYXQsID9zdHJpbmcgJHNvdXJjZVR5cGUpOiBib29sCnsKcmV0dXJuIGlzc2V0KHN0YXRpYzo6JGZvcm1hdHNbJGZvcm1hdF0pICYmICR0aGlzLT5jb21wcmVzc2lvbkF2YWlsYWJsZSgpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNvbXByZXNzaW9uQXZhaWxhYmxlKCk6IGJvb2wKewpyZXR1cm4gY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQmFzZVBhY2thZ2UgaW1wbGVtZW50cyBQYWNrYWdlSW50ZXJmYWNlCnsKCgoKCnB1YmxpYyBzdGF0aWMgJHN1cHBvcnRlZExpbmtUeXBlcyA9IFsKJ3JlcXVpcmUnID0+IFsnZGVzY3JpcHRpb24nID0+ICdyZXF1aXJlcycsICdtZXRob2QnID0+IExpbms6OlRZUEVfUkVRVUlSRV0sCidjb25mbGljdCcgPT4gWydkZXNjcmlwdGlvbicgPT4gJ2NvbmZsaWN0cycsICdtZXRob2QnID0+IExpbms6OlRZUEVfQ09ORkxJQ1RdLAoncHJvdmlkZScgPT4gWydkZXNjcmlwdGlvbicgPT4gJ3Byb3ZpZGVzJywgJ21ldGhvZCcgPT4gTGluazo6VFlQRV9QUk9WSURFXSwKJ3JlcGxhY2UnID0+IFsnZGVzY3JpcHRpb24nID0+ICdyZXBsYWNlcycsICdtZXRob2QnID0+IExpbms6OlRZUEVfUkVQTEFDRV0sCidyZXF1aXJlLWRldicgPT4gWydkZXNjcmlwdGlvbicgPT4gJ3JlcXVpcmVzIChmb3IgZGV2ZWxvcG1lbnQpJywgJ21ldGhvZCcgPT4gTGluazo6VFlQRV9ERVZfUkVRVUlSRV0sCl07CgpwdWJsaWMgY29uc3QgU1RBQklMSVRZX1NUQUJMRSA9IDA7CnB1YmxpYyBjb25zdCBTVEFCSUxJVFlfUkMgPSA1OwpwdWJsaWMgY29uc3QgU1RBQklMSVRZX0JFVEEgPSAxMDsKcHVibGljIGNvbnN0IFNUQUJJTElUWV9BTFBIQSA9IDE1OwpwdWJsaWMgY29uc3QgU1RBQklMSVRZX0RFViA9IDIwOwoKcHVibGljIGNvbnN0IFNUQUJJTElUSUVTID0gWwonc3RhYmxlJyA9PiBzZWxmOjpTVEFCSUxJVFlfU1RBQkxFLAonUkMnID0+IHNlbGY6OlNUQUJJTElUWV9SQywKJ2JldGEnID0+IHNlbGY6OlNUQUJJTElUWV9CRVRBLAonYWxwaGEnID0+IHNlbGY6OlNUQUJJTElUWV9BTFBIQSwKJ2RldicgPT4gc2VsZjo6U1RBQklMSVRZX0RFViwKXTsKCgoKCgoKCnB1YmxpYyBzdGF0aWMgJHN0YWJpbGl0aWVzID0gc2VsZjo6U1RBQklMSVRJRVM7CgoKCgoKCnB1YmxpYyAkaWQ7Cgpwcm90ZWN0ZWQgJG5hbWU7Cgpwcm90ZWN0ZWQgJHByZXR0eU5hbWU7Cgpwcm90ZWN0ZWQgJHJlcG9zaXRvcnkgPSBudWxsOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lKQp7CiR0aGlzLT5wcmV0dHlOYW1lID0gJG5hbWU7CiR0aGlzLT5uYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CiR0aGlzLT5pZCA9IC0xOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPm5hbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlOYW1lKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cHJldHR5TmFtZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzKCRwcm92aWRlcyA9IHRydWUpOiBhcnJheQp7CiRuYW1lcyA9IFsKJHRoaXMtPmdldE5hbWUoKSA9PiB0cnVlLApdOwoKaWYgKCRwcm92aWRlcykgewpmb3JlYWNoICgkdGhpcy0+Z2V0UHJvdmlkZXMoKSBhcyAkbGluaykgewokbmFtZXNbJGxpbmstPmdldFRhcmdldCgpXSA9IHRydWU7Cn0KfQoKZm9yZWFjaCAoJHRoaXMtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKJG5hbWVzWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSB0cnVlOwp9CgpyZXR1cm4gYXJyYXlfa2V5cygkbmFtZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SWQoaW50ICRpZCk6IHZvaWQKewokdGhpcy0+aWQgPSAkaWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJZCgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmlkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KTogdm9pZAp7CmlmICgkdGhpcy0+cmVwb3NpdG9yeSAmJiAkcmVwb3NpdG9yeSAhPT0gJHRoaXMtPnJlcG9zaXRvcnkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKAonUGFja2FnZSAiJXMiIGNhbm5vdCBiZSBhZGRlZCB0byByZXBvc2l0b3J5ICIlcyIgYXMgaXQgaXMgYWxyZWFkeSBpbiByZXBvc2l0b3J5ICIlcyIuJywKJHRoaXMtPmdldFByZXR0eU5hbWUoKSwKJHJlcG9zaXRvcnktPmdldFJlcG9OYW1lKCksCiR0aGlzLT5yZXBvc2l0b3J5LT5nZXRSZXBvTmFtZSgpCikpOwp9CiR0aGlzLT5yZXBvc2l0b3J5ID0gJHJlcG9zaXRvcnk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3J5KCk6ID9SZXBvc2l0b3J5SW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3J5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQbGF0Zm9ybSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5nZXRSZXBvc2l0b3J5KCkgaW5zdGFuY2VvZiBQbGF0Zm9ybVJlcG9zaXRvcnk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVbmlxdWVOYW1lKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0TmFtZSgpLictJy4kdGhpcy0+Z2V0VmVyc2lvbigpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBib29sCnsKJHNlbGYgPSAkdGhpczsKaWYgKCR0aGlzIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRzZWxmID0gJHRoaXMtPmdldEFsaWFzT2YoKTsKfQppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgpyZXR1cm4gJHBhY2thZ2UgPT09ICRzZWxmOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldFVuaXF1ZU5hbWUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldFByZXR0eU5hbWUoKS4nICcuJHRoaXMtPmdldFByZXR0eVZlcnNpb24oKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZ1bGxQcmV0dHlWZXJzaW9uKGJvb2wgJHRydW5jYXRlID0gdHJ1ZSwgaW50ICRkaXNwbGF5TW9kZSA9IFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfU09VUkNFX1JFRl9JRl9ERVYpOiBzdHJpbmcKewppZiAoJGRpc3BsYXlNb2RlID09PSBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX1NPVVJDRV9SRUZfSUZfREVWICYmCighJHRoaXMtPmlzRGV2KCkgfHwgIVxpbl9hcnJheSgkdGhpcy0+Z2V0U291cmNlVHlwZSgpLCBbJ2hnJywgJ2dpdCddKSkKKSB7CnJldHVybiAkdGhpcy0+Z2V0UHJldHR5VmVyc2lvbigpOwp9Cgpzd2l0Y2ggKCRkaXNwbGF5TW9kZSkgewpjYXNlIFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfU09VUkNFX1JFRl9JRl9ERVY6CmNhc2UgUGFja2FnZUludGVyZmFjZTo6RElTUExBWV9TT1VSQ0VfUkVGOgokcmVmZXJlbmNlID0gJHRoaXMtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwpicmVhazsKY2FzZSBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX0RJU1RfUkVGOgokcmVmZXJlbmNlID0gJHRoaXMtPmdldERpc3RSZWZlcmVuY2UoKTsKYnJlYWs7CmRlZmF1bHQ6CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdEaXNwbGF5IG1vZGUgJy4kZGlzcGxheU1vZGUuJyBpcyBub3Qgc3VwcG9ydGVkJyk7Cn0KCmlmIChudWxsID09PSAkcmVmZXJlbmNlKSB7CnJldHVybiAkdGhpcy0+Z2V0UHJldHR5VmVyc2lvbigpOwp9CgoKaWYgKCR0cnVuY2F0ZSAmJiBcc3RybGVuKCRyZWZlcmVuY2UpID09PSA0MCAmJiAkdGhpcy0+Z2V0U291cmNlVHlwZSgpICE9PSAnc3ZuJykgewpyZXR1cm4gJHRoaXMtPmdldFByZXR0eVZlcnNpb24oKSAuICcgJyAuIHN1YnN0cigkcmVmZXJlbmNlLCAwLCA3KTsKfQoKcmV0dXJuICR0aGlzLT5nZXRQcmV0dHlWZXJzaW9uKCkgLiAnICcgLiAkcmVmZXJlbmNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5UHJpb3JpdHkoKTogaW50CnsKcmV0dXJuIHNlbGY6OlNUQUJJTElUSUVTWyR0aGlzLT5nZXRTdGFiaWxpdHkoKV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkKewokdGhpcy0+cmVwb3NpdG9yeSA9IG51bGw7CiR0aGlzLT5pZCA9IC0xOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhY2thZ2VOYW1lVG9SZWdleHAoc3RyaW5nICRhbGxvd1BhdHRlcm4sIHN0cmluZyAkd3JhcCA9ICd7XiVzJH1pJyk6IHN0cmluZwp7CiRjbGVhbmVkQWxsb3dQYXR0ZXJuID0gc3RyX3JlcGxhY2UoJ1xcKicsICcuKicsIHByZWdfcXVvdGUoJGFsbG93UGF0dGVybikpOwoKcmV0dXJuIHNwcmludGYoJHdyYXAsICRjbGVhbmVkQWxsb3dQYXR0ZXJuKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFja2FnZU5hbWVzVG9SZWdleHAoYXJyYXkgJHBhY2thZ2VOYW1lcywgc3RyaW5nICR3cmFwID0gJ3teKD86JXMpJH1pRCcpOiBzdHJpbmcKewokcGFja2FnZU5hbWVzID0gYXJyYXlfbWFwKApzdGF0aWMgZnVuY3Rpb24gKCRwYWNrYWdlTmFtZSk6IHN0cmluZyB7CnJldHVybiBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGFja2FnZU5hbWUsICclcycpOwp9LAokcGFja2FnZU5hbWVzCik7CgpyZXR1cm4gc3ByaW50Zigkd3JhcCwgaW1wbG9kZSgnfCcsICRwYWNrYWdlTmFtZXMpKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXENvbXBhcmVyOwoKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CgoKCgoKCmNsYXNzIENvbXBhcmVyCnsKCnByaXZhdGUgJHNvdXJjZTsKCnByaXZhdGUgJHVwZGF0ZTsKCnByaXZhdGUgJGNoYW5nZWQ7CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlKHN0cmluZyAkc291cmNlKTogdm9pZAp7CiR0aGlzLT5zb3VyY2UgPSAkc291cmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0VXBkYXRlKHN0cmluZyAkdXBkYXRlKTogdm9pZAp7CiR0aGlzLT51cGRhdGUgPSAkdXBkYXRlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlZChib29sICRleHBsaWNhdGVkID0gZmFsc2UpCnsKJGNoYW5nZWQgPSAkdGhpcy0+Y2hhbmdlZDsKaWYgKCFjb3VudCgkY2hhbmdlZCkpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgkZXhwbGljYXRlZCkgewpmb3JlYWNoICgkY2hhbmdlZCBhcyAkc2VjdGlvbktleSA9PiAkaXRlbVNlY3Rpb24pIHsKZm9yZWFjaCAoJGl0ZW1TZWN0aW9uIGFzICRpdGVtS2V5ID0+ICRpdGVtKSB7CiRjaGFuZ2VkWyRzZWN0aW9uS2V5XVskaXRlbUtleV0gPSAkaXRlbS4nICgnLiRzZWN0aW9uS2V5LicpJzsKfQp9Cn0KCnJldHVybiAkY2hhbmdlZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZWRBc1N0cmluZyhib29sICR0b1N0cmluZyA9IGZhbHNlLCBib29sICRleHBsaWNhdGVkID0gZmFsc2UpOiBzdHJpbmcKewokY2hhbmdlZCA9ICR0aGlzLT5nZXRDaGFuZ2VkKCRleHBsaWNhdGVkKTsKaWYgKGZhbHNlID09PSAkY2hhbmdlZCkgewpyZXR1cm4gJyc7Cn0KCiRzdHJpbmdzID0gW107CmZvcmVhY2ggKCRjaGFuZ2VkIGFzICRzZWN0aW9uS2V5ID0+ICRpdGVtU2VjdGlvbikgewpmb3JlYWNoICgkaXRlbVNlY3Rpb24gYXMgJGl0ZW1LZXkgPT4gJGl0ZW0pIHsKJHN0cmluZ3NbXSA9ICRpdGVtLiJcclxuIjsKfQp9CgpyZXR1cm4gdHJpbShpbXBsb2RlKCJcclxuIiwgJHN0cmluZ3MpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGRvQ29tcGFyZSgpOiB2b2lkCnsKJHNvdXJjZSA9IFtdOwokZGVzdGluYXRpb24gPSBbXTsKJHRoaXMtPmNoYW5nZWQgPSBbXTsKJGN1cnJlbnREaXJlY3RvcnkgPSBQbGF0Zm9ybTo6Z2V0Q3dkKCk7CmNoZGlyKCR0aGlzLT5zb3VyY2UpOwokc291cmNlID0gJHRoaXMtPmRvVHJlZSgnLicsICRzb3VyY2UpOwppZiAoIWlzX2FycmF5KCRzb3VyY2UpKSB7CnJldHVybjsKfQpjaGRpcigkY3VycmVudERpcmVjdG9yeSk7CmNoZGlyKCR0aGlzLT51cGRhdGUpOwokZGVzdGluYXRpb24gPSAkdGhpcy0+ZG9UcmVlKCcuJywgJGRlc3RpbmF0aW9uKTsKaWYgKCFpc19hcnJheSgkZGVzdGluYXRpb24pKSB7CmV4aXQ7Cn0KY2hkaXIoJGN1cnJlbnREaXJlY3RvcnkpOwpmb3JlYWNoICgkc291cmNlIGFzICRkaXIgPT4gJHZhbHVlKSB7CmZvcmVhY2ggKCR2YWx1ZSBhcyAkZmlsZSA9PiAkaGFzaCkgewppZiAoaXNzZXQoJGRlc3RpbmF0aW9uWyRkaXJdWyRmaWxlXSkpIHsKaWYgKCRoYXNoICE9PSAkZGVzdGluYXRpb25bJGRpcl1bJGZpbGVdKSB7CiR0aGlzLT5jaGFuZ2VkWydjaGFuZ2VkJ11bXSA9ICRkaXIuJy8nLiRmaWxlOwp9Cn0gZWxzZSB7CiR0aGlzLT5jaGFuZ2VkWydyZW1vdmVkJ11bXSA9ICRkaXIuJy8nLiRmaWxlOwp9Cn0KfQpmb3JlYWNoICgkZGVzdGluYXRpb24gYXMgJGRpciA9PiAkdmFsdWUpIHsKZm9yZWFjaCAoJHZhbHVlIGFzICRmaWxlID0+ICRoYXNoKSB7CmlmICghaXNzZXQoJHNvdXJjZVskZGlyXVskZmlsZV0pKSB7CiR0aGlzLT5jaGFuZ2VkWydhZGRlZCddW10gPSAkZGlyLicvJy4kZmlsZTsKfQp9Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvVHJlZShzdHJpbmcgJGRpciwgYXJyYXkgJiRhcnJheSkKewppZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgewp3aGlsZSAoJGZpbGUgPSByZWFkZGlyKCRkaCkpIHsKaWYgKCRmaWxlICE9PSAnLicgJiYgJGZpbGUgIT09ICcuLicpIHsKaWYgKGlzX2xpbmsoJGRpci4nLycuJGZpbGUpKSB7CiRhcnJheVskZGlyXVskZmlsZV0gPSByZWFkbGluaygkZGlyLicvJy4kZmlsZSk7Cn0gZWxzZWlmIChpc19kaXIoJGRpci4nLycuJGZpbGUpKSB7CmlmICghY291bnQoJGFycmF5KSkgewokYXJyYXlbMF0gPSAnVGVtcCc7Cn0KaWYgKCEkdGhpcy0+ZG9UcmVlKCRkaXIuJy8nLiRmaWxlLCAkYXJyYXkpKSB7CnJldHVybiBmYWxzZTsKfQp9IGVsc2VpZiAoaXNfZmlsZSgkZGlyLicvJy4kZmlsZSkgJiYgZmlsZXNpemUoJGRpci4nLycuJGZpbGUpKSB7CiRhcnJheVskZGlyXVskZmlsZV0gPSBoYXNoX2ZpbGUoXFBIUF9WRVJTSU9OX0lEID4gODAxMDAgPyAneHhoMycgOiAnc2hhMScsICRkaXIuJy8nLiRmaWxlKTsKfQp9Cn0KaWYgKGNvdW50KCRhcnJheSkgPiAxICYmIGlzc2V0KCRhcnJheVsnMCddKSkgewp1bnNldCgkYXJyYXlbJzAnXSk7Cn0KCnJldHVybiAkYXJyYXk7Cn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKCgoKY2xhc3MgQ29tcGxldGVBbGlhc1BhY2thZ2UgZXh0ZW5kcyBBbGlhc1BhY2thZ2UgaW1wbGVtZW50cyBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UKewoKcHJvdGVjdGVkICRhbGlhc09mOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb21wbGV0ZVBhY2thZ2UgJGFsaWFzT2YsIHN0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRwcmV0dHlWZXJzaW9uKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGFsaWFzT2YsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc09mKCkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2Y7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTY3JpcHRzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTY3JpcHRzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTY3JpcHRzKGFycmF5ICRzY3JpcHRzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRTY3JpcHRzKCRzY3JpcHRzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcmllcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0UmVwb3NpdG9yaWVzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBvc2l0b3JpZXMoYXJyYXkgJHJlcG9zaXRvcmllcyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0UmVwb3NpdG9yaWVzKCRyZXBvc2l0b3JpZXMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGljZW5zZSgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0TGljZW5zZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0TGljZW5zZShhcnJheSAkbGljZW5zZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0TGljZW5zZSgkbGljZW5zZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRLZXl3b3JkcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0S2V5d29yZHMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEtleXdvcmRzKGFycmF5ICRrZXl3b3Jkcyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0S2V5d29yZHMoJGtleXdvcmRzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0aW9uKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldERlc2NyaXB0aW9uKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREZXNjcmlwdGlvbig/c3RyaW5nICRkZXNjcmlwdGlvbik6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0RGVzY3JpcHRpb24oJGRlc2NyaXB0aW9uKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEhvbWVwYWdlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEhvbWVwYWdlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRIb21lcGFnZSg/c3RyaW5nICRob21lcGFnZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0SG9tZXBhZ2UoJGhvbWVwYWdlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEF1dGhvcnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEF1dGhvcnMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEF1dGhvcnMoYXJyYXkgJGF1dGhvcnMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEF1dGhvcnMoJGF1dGhvcnMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3VwcG9ydCgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0U3VwcG9ydCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VwcG9ydChhcnJheSAkc3VwcG9ydCk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0U3VwcG9ydCgkc3VwcG9ydCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRGdW5kaW5nKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRGdW5kaW5nKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRGdW5kaW5nKGFycmF5ICRmdW5kaW5nKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRGdW5kaW5nKCRmdW5kaW5nKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzQWJhbmRvbmVkKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmlzQWJhbmRvbmVkKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBsYWNlbWVudFBhY2thZ2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRBYmFuZG9uZWQoJGFiYW5kb25lZCk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0QWJhbmRvbmVkKCRhYmFuZG9uZWQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJjaGl2ZU5hbWUoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0QXJjaGl2ZU5hbWUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEFyY2hpdmVOYW1lKD9zdHJpbmcgJG5hbWUpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEFyY2hpdmVOYW1lKCRuYW1lKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEFyY2hpdmVFeGNsdWRlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0QXJjaGl2ZUV4Y2x1ZGVzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmNoaXZlRXhjbHVkZXMoYXJyYXkgJGV4Y2x1ZGVzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRBcmNoaXZlRXhjbHVkZXMoJGV4Y2x1ZGVzKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKCgoKCgpjbGFzcyBDb21wbGV0ZVBhY2thZ2UgZXh0ZW5kcyBQYWNrYWdlIGltcGxlbWVudHMgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkcmVwb3NpdG9yaWVzID0gW107Cgpwcm90ZWN0ZWQgJGxpY2Vuc2UgPSBbXTsKCnByb3RlY3RlZCAka2V5d29yZHMgPSBbXTsKCnByb3RlY3RlZCAkYXV0aG9ycyA9IFtdOwoKcHJvdGVjdGVkICRkZXNjcmlwdGlvbiA9IG51bGw7Cgpwcm90ZWN0ZWQgJGhvbWVwYWdlID0gbnVsbDsKCnByb3RlY3RlZCAkc2NyaXB0cyA9IFtdOwoKcHJvdGVjdGVkICRzdXBwb3J0ID0gW107Cgpwcm90ZWN0ZWQgJGZ1bmRpbmcgPSBbXTsKCnByb3RlY3RlZCAkYWJhbmRvbmVkID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGFyY2hpdmVOYW1lID0gbnVsbDsKCnByb3RlY3RlZCAkYXJjaGl2ZUV4Y2x1ZGVzID0gW107CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U2NyaXB0cyhhcnJheSAkc2NyaXB0cyk6IHZvaWQKewokdGhpcy0+c2NyaXB0cyA9ICRzY3JpcHRzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2NyaXB0cygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+c2NyaXB0czsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcG9zaXRvcmllcyhhcnJheSAkcmVwb3NpdG9yaWVzKTogdm9pZAp7CiR0aGlzLT5yZXBvc2l0b3JpZXMgPSAkcmVwb3NpdG9yaWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yaWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3JpZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMaWNlbnNlKGFycmF5ICRsaWNlbnNlKTogdm9pZAp7CiR0aGlzLT5saWNlbnNlID0gJGxpY2Vuc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMaWNlbnNlKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5saWNlbnNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0S2V5d29yZHMoYXJyYXkgJGtleXdvcmRzKTogdm9pZAp7CiR0aGlzLT5rZXl3b3JkcyA9ICRrZXl3b3JkczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEtleXdvcmRzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5rZXl3b3JkczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dGhvcnMoYXJyYXkgJGF1dGhvcnMpOiB2b2lkCnsKJHRoaXMtPmF1dGhvcnMgPSAkYXV0aG9yczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dGhvcnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmF1dGhvcnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXNjcmlwdGlvbig/c3RyaW5nICRkZXNjcmlwdGlvbik6IHZvaWQKewokdGhpcy0+ZGVzY3JpcHRpb24gPSAkZGVzY3JpcHRpb247Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXNjcmlwdGlvbigpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5kZXNjcmlwdGlvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhvbWVwYWdlKD9zdHJpbmcgJGhvbWVwYWdlKTogdm9pZAp7CiR0aGlzLT5ob21lcGFnZSA9ICRob21lcGFnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhvbWVwYWdlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmhvbWVwYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VwcG9ydChhcnJheSAkc3VwcG9ydCk6IHZvaWQKewokdGhpcy0+c3VwcG9ydCA9ICRzdXBwb3J0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3VwcG9ydCgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+c3VwcG9ydDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZ1bmRpbmcoYXJyYXkgJGZ1bmRpbmcpOiB2b2lkCnsKJHRoaXMtPmZ1bmRpbmcgPSAkZnVuZGluZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZ1bmRpbmcoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmZ1bmRpbmc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0FiYW5kb25lZCgpOiBib29sCnsKcmV0dXJuIChib29sKSAkdGhpcy0+YWJhbmRvbmVkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QWJhbmRvbmVkKCRhYmFuZG9uZWQpOiB2b2lkCnsKJHRoaXMtPmFiYW5kb25lZCA9ICRhYmFuZG9uZWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBsYWNlbWVudFBhY2thZ2UoKTogP3N0cmluZwp7CnJldHVybiBcaXNfc3RyaW5nKCR0aGlzLT5hYmFuZG9uZWQpID8gJHRoaXMtPmFiYW5kb25lZCA6IG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmNoaXZlTmFtZSg/c3RyaW5nICRuYW1lKTogdm9pZAp7CiR0aGlzLT5hcmNoaXZlTmFtZSA9ICRuYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJjaGl2ZU5hbWUoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YXJjaGl2ZU5hbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmNoaXZlRXhjbHVkZXMoYXJyYXkgJGV4Y2x1ZGVzKTogdm9pZAp7CiR0aGlzLT5hcmNoaXZlRXhjbHVkZXMgPSAkZXhjbHVkZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmNoaXZlRXhjbHVkZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFyY2hpdmVFeGNsdWRlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKCgoKCgoKCmludGVyZmFjZSBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgZXh0ZW5kcyBQYWNrYWdlSW50ZXJmYWNlCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2NyaXB0cygpOiBhcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTY3JpcHRzKGFycmF5ICRzY3JpcHRzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcmllcygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcG9zaXRvcmllcyhhcnJheSAkcmVwb3NpdG9yaWVzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExpY2Vuc2UoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMaWNlbnNlKGFycmF5ICRsaWNlbnNlKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEtleXdvcmRzKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0S2V5d29yZHMoYXJyYXkgJGtleXdvcmRzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0aW9uKCk6ID9zdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVzY3JpcHRpb24oc3RyaW5nICRkZXNjcmlwdGlvbik6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIb21lcGFnZSgpOiA/c3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhvbWVwYWdlKHN0cmluZyAkaG9tZXBhZ2UpOiB2b2lkOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRob3JzKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0aG9ycyhhcnJheSAkYXV0aG9ycyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdXBwb3J0KCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VwcG9ydChhcnJheSAkc3VwcG9ydCk6IHZvaWQ7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZ1bmRpbmcoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGdW5kaW5nKGFycmF5ICRmdW5kaW5nKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0FiYW5kb25lZCgpOiBib29sOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcGxhY2VtZW50UGFja2FnZSgpOiA/c3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFiYW5kb25lZCgkYWJhbmRvbmVkKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyY2hpdmVOYW1lKCk6ID9zdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXJjaGl2ZU5hbWUoc3RyaW5nICRuYW1lKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyY2hpdmVFeGNsdWRlcygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFyY2hpdmVFeGNsdWRlcyhhcnJheSAkZXhjbHVkZXMpOiB2b2lkOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXER1bXBlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCmNsYXNzIEFycmF5RHVtcGVyCnsKCgoKcHVibGljIGZ1bmN0aW9uIGR1bXAoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5CnsKJGtleXMgPSBbCidiaW5hcmllcycgPT4gJ2JpbicsCid0eXBlJywKJ2V4dHJhJywKJ2luc3RhbGxhdGlvblNvdXJjZScgPT4gJ2luc3RhbGxhdGlvbi1zb3VyY2UnLAonYXV0b2xvYWQnLAonZGV2QXV0b2xvYWQnID0+ICdhdXRvbG9hZC1kZXYnLAonbm90aWZpY2F0aW9uVXJsJyA9PiAnbm90aWZpY2F0aW9uLXVybCcsCidpbmNsdWRlUGF0aHMnID0+ICdpbmNsdWRlLXBhdGgnLAoncGhwRXh0JyA9PiAncGhwLWV4dCcsCl07CgokZGF0YSA9IFtdOwokZGF0YVsnbmFtZSddID0gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKJGRhdGFbJ3ZlcnNpb24nXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7CiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCk7CgppZiAoJHBhY2thZ2UtPmdldFRhcmdldERpcigpICE9PSBudWxsKSB7CiRkYXRhWyd0YXJnZXQtZGlyJ10gPSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCk7Cn0KCmlmICgkcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpICE9PSBudWxsKSB7CiRkYXRhWydzb3VyY2UnXVsndHlwZSddID0gJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKTsKJGRhdGFbJ3NvdXJjZSddWyd1cmwnXSA9ICRwYWNrYWdlLT5nZXRTb3VyY2VVcmwoKTsKaWYgKG51bGwgIT09ICgkdmFsdWUgPSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpKSB7CiRkYXRhWydzb3VyY2UnXVsncmVmZXJlbmNlJ10gPSAkdmFsdWU7Cn0KaWYgKCRtaXJyb3JzID0gJHBhY2thZ2UtPmdldFNvdXJjZU1pcnJvcnMoKSkgewokZGF0YVsnc291cmNlJ11bJ21pcnJvcnMnXSA9ICRtaXJyb3JzOwp9Cn0KCmlmICgkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKSAhPT0gbnVsbCkgewokZGF0YVsnZGlzdCddWyd0eXBlJ10gPSAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKTsKJGRhdGFbJ2Rpc3QnXVsndXJsJ10gPSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpOwppZiAobnVsbCAhPT0gKCR2YWx1ZSA9ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkpKSB7CiRkYXRhWydkaXN0J11bJ3JlZmVyZW5jZSddID0gJHZhbHVlOwp9CmlmIChudWxsICE9PSAoJHZhbHVlID0gJHBhY2thZ2UtPmdldERpc3RTaGExQ2hlY2tzdW0oKSkpIHsKJGRhdGFbJ2Rpc3QnXVsnc2hhc3VtJ10gPSAkdmFsdWU7Cn0KaWYgKCRtaXJyb3JzID0gJHBhY2thZ2UtPmdldERpc3RNaXJyb3JzKCkpIHsKJGRhdGFbJ2Rpc3QnXVsnbWlycm9ycyddID0gJG1pcnJvcnM7Cn0KfQoKZm9yZWFjaCAoQmFzZVBhY2thZ2U6OiRzdXBwb3J0ZWRMaW5rVHlwZXMgYXMgJHR5cGUgPT4gJG9wdHMpIHsKJGxpbmtzID0gJHBhY2thZ2UtPnsnZ2V0Jy51Y2ZpcnN0KCRvcHRzWydtZXRob2QnXSl9KCk7CmlmIChcY291bnQoJGxpbmtzKSA9PT0gMCkgewpjb250aW51ZTsKfQpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKJGRhdGFbJHR5cGVdWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpOwp9Cmtzb3J0KCRkYXRhWyR0eXBlXSk7Cn0KCiRwYWNrYWdlcyA9ICRwYWNrYWdlLT5nZXRTdWdnZXN0cygpOwppZiAoXGNvdW50KCRwYWNrYWdlcykgPiAwKSB7Cmtzb3J0KCRwYWNrYWdlcyk7CiRkYXRhWydzdWdnZXN0J10gPSAkcGFja2FnZXM7Cn0KCmlmICgkcGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSBpbnN0YW5jZW9mIFxEYXRlVGltZUludGVyZmFjZSkgewokZGF0YVsndGltZSddID0gJHBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCktPmZvcm1hdChEQVRFX1JGQzMzMzkpOwp9CgppZiAoJHBhY2thZ2UtPmlzRGVmYXVsdEJyYW5jaCgpKSB7CiRkYXRhWydkZWZhdWx0LWJyYW5jaCddID0gdHJ1ZTsKfQoKJGRhdGEgPSAkdGhpcy0+ZHVtcFZhbHVlcygkcGFja2FnZSwgJGtleXMsICRkYXRhKTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSkgewppZiAoJHBhY2thZ2UtPmdldEFyY2hpdmVOYW1lKCkpIHsKJGRhdGFbJ2FyY2hpdmUnXVsnbmFtZSddID0gJHBhY2thZ2UtPmdldEFyY2hpdmVOYW1lKCk7Cn0KaWYgKCRwYWNrYWdlLT5nZXRBcmNoaXZlRXhjbHVkZXMoKSkgewokZGF0YVsnYXJjaGl2ZSddWydleGNsdWRlJ10gPSAkcGFja2FnZS0+Z2V0QXJjaGl2ZUV4Y2x1ZGVzKCk7Cn0KCiRrZXlzID0gWwonc2NyaXB0cycsCidsaWNlbnNlJywKJ2F1dGhvcnMnLAonZGVzY3JpcHRpb24nLAonaG9tZXBhZ2UnLAona2V5d29yZHMnLAoncmVwb3NpdG9yaWVzJywKJ3N1cHBvcnQnLAonZnVuZGluZycsCl07CgokZGF0YSA9ICR0aGlzLT5kdW1wVmFsdWVzKCRwYWNrYWdlLCAka2V5cywgJGRhdGEpOwoKaWYgKGlzc2V0KCRkYXRhWydrZXl3b3JkcyddKSAmJiBcaXNfYXJyYXkoJGRhdGFbJ2tleXdvcmRzJ10pKSB7CnNvcnQoJGRhdGFbJ2tleXdvcmRzJ10pOwp9CgppZiAoJHBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpIHsKJGRhdGFbJ2FiYW5kb25lZCddID0gJHBhY2thZ2UtPmdldFJlcGxhY2VtZW50UGFja2FnZSgpID86IHRydWU7Cn0KfQoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJG1pbmltdW1TdGFiaWxpdHkgPSAkcGFja2FnZS0+Z2V0TWluaW11bVN0YWJpbGl0eSgpOwppZiAoJG1pbmltdW1TdGFiaWxpdHkgIT09ICcnKSB7CiRkYXRhWydtaW5pbXVtLXN0YWJpbGl0eSddID0gJG1pbmltdW1TdGFiaWxpdHk7Cn0KfQoKaWYgKFxjb3VudCgkcGFja2FnZS0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpKSA+IDApIHsKJGRhdGFbJ3RyYW5zcG9ydC1vcHRpb25zJ10gPSAkcGFja2FnZS0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpOwp9CgpyZXR1cm4gJGRhdGE7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZHVtcFZhbHVlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAka2V5cywgYXJyYXkgJGRhdGEpOiBhcnJheQp7CmZvcmVhY2ggKCRrZXlzIGFzICRtZXRob2QgPT4gJGtleSkgewppZiAoaXNfbnVtZXJpYygkbWV0aG9kKSkgewokbWV0aG9kID0gJGtleTsKfQoKJGdldHRlciA9ICdnZXQnLnVjZmlyc3QoJG1ldGhvZCk7CiR2YWx1ZSA9ICRwYWNrYWdlLT57JGdldHRlcn0oKTsKCmlmIChudWxsICE9PSAkdmFsdWUgJiYgIShcaXNfYXJyYXkoJHZhbHVlKSAmJiAwID09PSBcY291bnQoJHZhbHVlKSkpIHsKJGRhdGFbJGtleV0gPSAkdmFsdWU7Cn0KfQoKcmV0dXJuICRkYXRhOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKCgoKCgoKY2xhc3MgTGluawp7CnB1YmxpYyBjb25zdCBUWVBFX1JFUVVJUkUgPSAncmVxdWlyZXMnOwpwdWJsaWMgY29uc3QgVFlQRV9ERVZfUkVRVUlSRSA9ICdkZXZSZXF1aXJlcyc7CnB1YmxpYyBjb25zdCBUWVBFX1BST1ZJREUgPSAncHJvdmlkZXMnOwpwdWJsaWMgY29uc3QgVFlQRV9DT05GTElDVCA9ICdjb25mbGljdHMnOwpwdWJsaWMgY29uc3QgVFlQRV9SRVBMQUNFID0gJ3JlcGxhY2VzJzsKCgoKCgpwdWJsaWMgY29uc3QgVFlQRV9ET0VTX05PVF9SRVFVSVJFID0gJ2RvZXMgbm90IHJlcXVpcmUnOwoKcHJpdmF0ZSBjb25zdCBUWVBFX1VOS05PV04gPSAncmVsYXRlcyB0byc7CgoKCgoKCgoKcHVibGljIHN0YXRpYyAkVFlQRVMgPSBbCnNlbGY6OlRZUEVfUkVRVUlSRSwKc2VsZjo6VFlQRV9ERVZfUkVRVUlSRSwKc2VsZjo6VFlQRV9QUk9WSURFLApzZWxmOjpUWVBFX0NPTkZMSUNULApzZWxmOjpUWVBFX1JFUExBQ0UsCl07CgoKCgpwcm90ZWN0ZWQgJHNvdXJjZTsKCgoKCnByb3RlY3RlZCAkdGFyZ2V0OwoKCgoKcHJvdGVjdGVkICRjb25zdHJhaW50OwoKCgoKCnByb3RlY3RlZCAkZGVzY3JpcHRpb247CgoKCgpwcm90ZWN0ZWQgJHByZXR0eUNvbnN0cmFpbnQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCnN0cmluZyAkc291cmNlLApzdHJpbmcgJHRhcmdldCwKQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCwKJGRlc2NyaXB0aW9uID0gc2VsZjo6VFlQRV9VTktOT1dOLAo/c3RyaW5nICRwcmV0dHlDb25zdHJhaW50ID0gbnVsbAopIHsKJHRoaXMtPnNvdXJjZSA9IHN0cnRvbG93ZXIoJHNvdXJjZSk7CiR0aGlzLT50YXJnZXQgPSBzdHJ0b2xvd2VyKCR0YXJnZXQpOwokdGhpcy0+Y29uc3RyYWludCA9ICRjb25zdHJhaW50OwokdGhpcy0+ZGVzY3JpcHRpb24gPSBzZWxmOjpUWVBFX0RFVl9SRVFVSVJFID09PSAkZGVzY3JpcHRpb24gPyAncmVxdWlyZXMgKGZvciBkZXZlbG9wbWVudCknIDogJGRlc2NyaXB0aW9uOwokdGhpcy0+cHJldHR5Q29uc3RyYWludCA9ICRwcmV0dHlDb25zdHJhaW50Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24oKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5kZXNjcmlwdGlvbjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnNvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFRhcmdldCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnRhcmdldDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbnN0cmFpbnQoKTogQ29uc3RyYWludEludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+Y29uc3RyYWludDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eUNvbnN0cmFpbnQoKTogc3RyaW5nCnsKaWYgKG51bGwgPT09ICR0aGlzLT5wcmV0dHlDb25zdHJhaW50KSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKHNwcmludGYoJ0xpbmsgJXMgaGFzIGJlZW4gbWlzY29uZmlndXJlZCBhbmQgaGFkIG5vIHByZXR0eUNvbnN0cmFpbnQgZ2l2ZW4uJywgJHRoaXMpKTsKfQoKcmV0dXJuICR0aGlzLT5wcmV0dHlDb25zdHJhaW50Owp9CgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnNvdXJjZS4nICcuJHRoaXMtPmRlc2NyaXB0aW9uLicgJy4kdGhpcy0+dGFyZ2V0LicgKCcuJHRoaXMtPmNvbnN0cmFpbnQuJyknOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKFBhY2thZ2VJbnRlcmZhY2UgJHNvdXJjZVBhY2thZ2UpOiBzdHJpbmcKewpyZXR1cm4gJHNvdXJjZVBhY2thZ2UtPmdldFByZXR0eVN0cmluZygpLicgJy4kdGhpcy0+ZGVzY3JpcHRpb24uJyAnLiR0aGlzLT50YXJnZXQuJyAnLiR0aGlzLT5jb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXExvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZUFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290QWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKY2xhc3MgQXJyYXlMb2FkZXIgaW1wbGVtZW50cyBMb2FkZXJJbnRlcmZhY2UKewoKcHJvdGVjdGVkICR2ZXJzaW9uUGFyc2VyOwoKcHJvdGVjdGVkICRsb2FkT3B0aW9uczsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/VmVyc2lvblBhcnNlciAkcGFyc2VyID0gbnVsbCwgYm9vbCAkbG9hZE9wdGlvbnMgPSBmYWxzZSkKewppZiAoISRwYXJzZXIpIHsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwp9CiR0aGlzLT52ZXJzaW9uUGFyc2VyID0gJHBhcnNlcjsKJHRoaXMtPmxvYWRPcHRpb25zID0gJGxvYWRPcHRpb25zOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZChhcnJheSAkY29uZmlnLCBzdHJpbmcgJGNsYXNzID0gJ0NvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlJyk6IEJhc2VQYWNrYWdlCnsKaWYgKCRjbGFzcyAhPT0gJ0NvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlJyAmJiAkY2xhc3MgIT09ICdDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlJykgewp0cmlnZ2VyX2Vycm9yKCdUaGUgJGNsYXNzIGFyZyBpcyBkZXByZWNhdGVkLCBwbGVhc2UgcmVhY2ggb3V0IHRvIENvbXBvc2VyIG1haW50YWluZXJzIEFTQVAgaWYgeW91IHN0aWxsIG5lZWQgdGhpcy4nLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0KCiRwYWNrYWdlID0gJHRoaXMtPmNyZWF0ZU9iamVjdCgkY29uZmlnLCAkY2xhc3MpOwoKZm9yZWFjaCAoQmFzZVBhY2thZ2U6OiRzdXBwb3J0ZWRMaW5rVHlwZXMgYXMgJHR5cGUgPT4gJG9wdHMpIHsKaWYgKCFpc3NldCgkY29uZmlnWyR0eXBlXSkgfHwgIWlzX2FycmF5KCRjb25maWdbJHR5cGVdKSkgewpjb250aW51ZTsKfQokbWV0aG9kID0gJ3NldCcudWNmaXJzdCgkb3B0c1snbWV0aG9kJ10pOwokcGFja2FnZS0+eyRtZXRob2R9KAokdGhpcy0+cGFyc2VMaW5rcygKJHBhY2thZ2UtPmdldE5hbWUoKSwKJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSwKJG9wdHNbJ21ldGhvZCddLAokY29uZmlnWyR0eXBlXQopCik7Cn0KCiRwYWNrYWdlID0gJHRoaXMtPmNvbmZpZ3VyZU9iamVjdCgkcGFja2FnZSwgJGNvbmZpZyk7CgpyZXR1cm4gJHBhY2thZ2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWRQYWNrYWdlcyhhcnJheSAkdmVyc2lvbnMpOiBhcnJheQp7CiRwYWNrYWdlcyA9IFtdOwokbGlua0NhY2hlID0gW107Cgpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb24pIHsKJHBhY2thZ2UgPSAkdGhpcy0+Y3JlYXRlT2JqZWN0KCR2ZXJzaW9uLCAnQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2UnKTsKCiR0aGlzLT5jb25maWd1cmVDYWNoZWRMaW5rcygkbGlua0NhY2hlLCAkcGFja2FnZSwgJHZlcnNpb24pOwokcGFja2FnZSA9ICR0aGlzLT5jb25maWd1cmVPYmplY3QoJHBhY2thZ2UsICR2ZXJzaW9uKTsKCiRwYWNrYWdlc1tdID0gJHBhY2thZ2U7Cn0KCnJldHVybiAkcGFja2FnZXM7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdChhcnJheSAkY29uZmlnLCBzdHJpbmcgJGNsYXNzKTogQ29tcGxldGVQYWNrYWdlCnsKaWYgKCFpc3NldCgkY29uZmlnWyduYW1lJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdVbmtub3duIHBhY2thZ2UgaGFzIG5vIG5hbWUgZGVmaW5lZCAoJy5qc29uX2VuY29kZSgkY29uZmlnKS4nKS4nKTsKfQppZiAoIWlzc2V0KCRjb25maWdbJ3ZlcnNpb24nXSkgfHwgIWlzX3NjYWxhcigkY29uZmlnWyd2ZXJzaW9uJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdQYWNrYWdlICcuJGNvbmZpZ1snbmFtZSddLicgaGFzIG5vIHZlcnNpb24gZGVmaW5lZC4nKTsKfQppZiAoIWlzX3N0cmluZygkY29uZmlnWyd2ZXJzaW9uJ10pKSB7CiRjb25maWdbJ3ZlcnNpb24nXSA9IChzdHJpbmcpICRjb25maWdbJ3ZlcnNpb24nXTsKfQoKCmlmIChpc3NldCgkY29uZmlnWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSkgJiYgaXNfc3RyaW5nKCRjb25maWdbJ3ZlcnNpb25fbm9ybWFsaXplZCddKSkgewokdmVyc2lvbiA9ICRjb25maWdbJ3ZlcnNpb25fbm9ybWFsaXplZCddOwoKCmlmICgkdmVyc2lvbiA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRjb25maWdbJ3ZlcnNpb24nXSk7Cn0KfSBlbHNlIHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRjb25maWdbJ3ZlcnNpb24nXSk7Cn0KCnJldHVybiBuZXcgJGNsYXNzKCRjb25maWdbJ25hbWUnXSwgJHZlcnNpb24sICRjb25maWdbJ3ZlcnNpb24nXSk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY29uZmlndXJlT2JqZWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICRjb25maWcpOiBCYXNlUGFja2FnZQp7CmlmICghJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2UpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQXJyYXlMb2FkZXIgZXhwZWN0cyBpbnN0YW5jZXMgb2YgdGhlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlIGNsYXNzIHRvIGZ1bmN0aW9uIGNvcnJlY3RseScpOwp9CgokcGFja2FnZS0+c2V0VHlwZShpc3NldCgkY29uZmlnWyd0eXBlJ10pID8gc3RydG9sb3dlcigkY29uZmlnWyd0eXBlJ10pIDogJ2xpYnJhcnknKTsKCmlmIChpc3NldCgkY29uZmlnWyd0YXJnZXQtZGlyJ10pKSB7CiRwYWNrYWdlLT5zZXRUYXJnZXREaXIoJGNvbmZpZ1sndGFyZ2V0LWRpciddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ2V4dHJhJ10pICYmIFxpc19hcnJheSgkY29uZmlnWydleHRyYSddKSkgewokcGFja2FnZS0+c2V0RXh0cmEoJGNvbmZpZ1snZXh0cmEnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydiaW4nXSkpIHsKaWYgKCFcaXNfYXJyYXkoJGNvbmZpZ1snYmluJ10pKSB7CiRjb25maWdbJ2JpbiddID0gWyRjb25maWdbJ2JpbiddXTsKfQpmb3JlYWNoICgkY29uZmlnWydiaW4nXSBhcyAka2V5ID0+ICRiaW4pIHsKJGNvbmZpZ1snYmluJ11bJGtleV0gPSBsdHJpbSgkYmluLCAnLycpOwp9CiRwYWNrYWdlLT5zZXRCaW5hcmllcygkY29uZmlnWydiaW4nXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydpbnN0YWxsYXRpb24tc291cmNlJ10pKSB7CiRwYWNrYWdlLT5zZXRJbnN0YWxsYXRpb25Tb3VyY2UoJGNvbmZpZ1snaW5zdGFsbGF0aW9uLXNvdXJjZSddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ2RlZmF1bHQtYnJhbmNoJ10pICYmICRjb25maWdbJ2RlZmF1bHQtYnJhbmNoJ10gPT09IHRydWUpIHsKJHBhY2thZ2UtPnNldElzRGVmYXVsdEJyYW5jaCh0cnVlKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ3NvdXJjZSddKSkgewppZiAoIWlzc2V0KCRjb25maWdbJ3NvdXJjZSddWyd0eXBlJ10sICRjb25maWdbJ3NvdXJjZSddWyd1cmwnXSwgJGNvbmZpZ1snc291cmNlJ11bJ3JlZmVyZW5jZSddKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbihzcHJpbnRmKAoiUGFja2FnZSAlcydzIHNvdXJjZSBrZXkgc2hvdWxkIGJlIHNwZWNpZmllZCBhcyB7XCJ0eXBlXCI6IC4uLiwgXCJ1cmxcIjogLi4uLCBcInJlZmVyZW5jZVwiOiAuLi59LFxuJXMgZ2l2ZW4uIiwKJGNvbmZpZ1snbmFtZSddLApqc29uX2VuY29kZSgkY29uZmlnWydzb3VyY2UnXSkKKSk7Cn0KJHBhY2thZ2UtPnNldFNvdXJjZVR5cGUoJGNvbmZpZ1snc291cmNlJ11bJ3R5cGUnXSk7CiRwYWNrYWdlLT5zZXRTb3VyY2VVcmwoJGNvbmZpZ1snc291cmNlJ11bJ3VybCddKTsKJHBhY2thZ2UtPnNldFNvdXJjZVJlZmVyZW5jZShpc3NldCgkY29uZmlnWydzb3VyY2UnXVsncmVmZXJlbmNlJ10pID8gKHN0cmluZykgJGNvbmZpZ1snc291cmNlJ11bJ3JlZmVyZW5jZSddIDogbnVsbCk7CmlmIChpc3NldCgkY29uZmlnWydzb3VyY2UnXVsnbWlycm9ycyddKSkgewokcGFja2FnZS0+c2V0U291cmNlTWlycm9ycygkY29uZmlnWydzb3VyY2UnXVsnbWlycm9ycyddKTsKfQp9CgppZiAoaXNzZXQoJGNvbmZpZ1snZGlzdCddKSkgewppZiAoIWlzc2V0KCRjb25maWdbJ2Rpc3QnXVsndHlwZSddLCAkY29uZmlnWydkaXN0J11bJ3VybCddKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbihzcHJpbnRmKAoiUGFja2FnZSAlcydzIGRpc3Qga2V5IHNob3VsZCBiZSBzcGVjaWZpZWQgYXMgIi4KIntcInR5cGVcIjogLi4uLCBcInVybFwiOiAuLi4sIFwicmVmZXJlbmNlXCI6IC4uLiwgXCJzaGFzdW1cIjogLi4ufSxcbiVzIGdpdmVuLiIsCiRjb25maWdbJ25hbWUnXSwKanNvbl9lbmNvZGUoJGNvbmZpZ1snZGlzdCddKQopKTsKfQokcGFja2FnZS0+c2V0RGlzdFR5cGUoJGNvbmZpZ1snZGlzdCddWyd0eXBlJ10pOwokcGFja2FnZS0+c2V0RGlzdFVybCgkY29uZmlnWydkaXN0J11bJ3VybCddKTsKJHBhY2thZ2UtPnNldERpc3RSZWZlcmVuY2UoaXNzZXQoJGNvbmZpZ1snZGlzdCddWydyZWZlcmVuY2UnXSkgPyAoc3RyaW5nKSAkY29uZmlnWydkaXN0J11bJ3JlZmVyZW5jZSddIDogbnVsbCk7CiRwYWNrYWdlLT5zZXREaXN0U2hhMUNoZWNrc3VtKCRjb25maWdbJ2Rpc3QnXVsnc2hhc3VtJ10gPz8gbnVsbCk7CmlmIChpc3NldCgkY29uZmlnWydkaXN0J11bJ21pcnJvcnMnXSkpIHsKJHBhY2thZ2UtPnNldERpc3RNaXJyb3JzKCRjb25maWdbJ2Rpc3QnXVsnbWlycm9ycyddKTsKfQp9CgppZiAoaXNzZXQoJGNvbmZpZ1snc3VnZ2VzdCddKSAmJiBcaXNfYXJyYXkoJGNvbmZpZ1snc3VnZ2VzdCddKSkgewpmb3JlYWNoICgkY29uZmlnWydzdWdnZXN0J10gYXMgJHRhcmdldCA9PiAkcmVhc29uKSB7CmlmICgnc2VsZi52ZXJzaW9uJyA9PT0gdHJpbSgkcmVhc29uKSkgewokY29uZmlnWydzdWdnZXN0J11bJHRhcmdldF0gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9Cn0KJHBhY2thZ2UtPnNldFN1Z2dlc3RzKCRjb25maWdbJ3N1Z2dlc3QnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydhdXRvbG9hZCddKSkgewokcGFja2FnZS0+c2V0QXV0b2xvYWQoJGNvbmZpZ1snYXV0b2xvYWQnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydhdXRvbG9hZC1kZXYnXSkpIHsKJHBhY2thZ2UtPnNldERldkF1dG9sb2FkKCRjb25maWdbJ2F1dG9sb2FkLWRldiddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ2luY2x1ZGUtcGF0aCddKSkgewokcGFja2FnZS0+c2V0SW5jbHVkZVBhdGhzKCRjb25maWdbJ2luY2x1ZGUtcGF0aCddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ3BocC1leHQnXSkpIHsKJHBhY2thZ2UtPnNldFBocEV4dCgkY29uZmlnWydwaHAtZXh0J10pOwp9CgppZiAoIWVtcHR5KCRjb25maWdbJ3RpbWUnXSkpIHsKJHRpbWUgPSBQcmVnOjppc01hdGNoKCcvXlxkKyskL0QnLCAkY29uZmlnWyd0aW1lJ10pID8gJ0AnLiRjb25maWdbJ3RpbWUnXSA6ICRjb25maWdbJ3RpbWUnXTsKCnRyeSB7CiRkYXRlID0gbmV3IFxEYXRlVGltZSgkdGltZSwgbmV3IFxEYXRlVGltZVpvbmUoJ1VUQycpKTsKJHBhY2thZ2UtPnNldFJlbGVhc2VEYXRlKCRkYXRlKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp9Cn0KCmlmICghZW1wdHkoJGNvbmZpZ1snbm90aWZpY2F0aW9uLXVybCddKSkgewokcGFja2FnZS0+c2V0Tm90aWZpY2F0aW9uVXJsKCRjb25maWdbJ25vdGlmaWNhdGlvbi11cmwnXSk7Cn0KCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSkgewppZiAoIWVtcHR5KCRjb25maWdbJ2FyY2hpdmUnXVsnbmFtZSddKSkgewokcGFja2FnZS0+c2V0QXJjaGl2ZU5hbWUoJGNvbmZpZ1snYXJjaGl2ZSddWyduYW1lJ10pOwp9CmlmICghZW1wdHkoJGNvbmZpZ1snYXJjaGl2ZSddWydleGNsdWRlJ10pKSB7CiRwYWNrYWdlLT5zZXRBcmNoaXZlRXhjbHVkZXMoJGNvbmZpZ1snYXJjaGl2ZSddWydleGNsdWRlJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snc2NyaXB0cyddKSAmJiBcaXNfYXJyYXkoJGNvbmZpZ1snc2NyaXB0cyddKSkgewpmb3JlYWNoICgkY29uZmlnWydzY3JpcHRzJ10gYXMgJGV2ZW50ID0+ICRsaXN0ZW5lcnMpIHsKJGNvbmZpZ1snc2NyaXB0cyddWyRldmVudF0gPSAoYXJyYXkpICRsaXN0ZW5lcnM7Cn0KZm9yZWFjaCAoWydjb21wb3NlcicsICdwaHAnLCAncHV0ZW52J10gYXMgJHJlc2VydmVkKSB7CmlmIChpc3NldCgkY29uZmlnWydzY3JpcHRzJ11bJHJlc2VydmVkXSkpIHsKdHJpZ2dlcl9lcnJvcignVGhlIGAnLiRyZXNlcnZlZC4nYCBzY3JpcHQgbmFtZSBpcyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLCBwbGVhc2UgYXZvaWQgZGVmaW5pbmcgaXQnLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0KfQokcGFja2FnZS0+c2V0U2NyaXB0cygkY29uZmlnWydzY3JpcHRzJ10pOwp9CgppZiAoIWVtcHR5KCRjb25maWdbJ2Rlc2NyaXB0aW9uJ10pICYmIFxpc19zdHJpbmcoJGNvbmZpZ1snZGVzY3JpcHRpb24nXSkpIHsKJHBhY2thZ2UtPnNldERlc2NyaXB0aW9uKCRjb25maWdbJ2Rlc2NyaXB0aW9uJ10pOwp9CgppZiAoIWVtcHR5KCRjb25maWdbJ2hvbWVwYWdlJ10pICYmIFxpc19zdHJpbmcoJGNvbmZpZ1snaG9tZXBhZ2UnXSkpIHsKJHBhY2thZ2UtPnNldEhvbWVwYWdlKCRjb25maWdbJ2hvbWVwYWdlJ10pOwp9CgppZiAoIWVtcHR5KCRjb25maWdbJ2tleXdvcmRzJ10pICYmIFxpc19hcnJheSgkY29uZmlnWydrZXl3b3JkcyddKSkgewokcGFja2FnZS0+c2V0S2V5d29yZHMoYXJyYXlfbWFwKCdzdHJ2YWwnLCAkY29uZmlnWydrZXl3b3JkcyddKSk7Cn0KCmlmICghZW1wdHkoJGNvbmZpZ1snbGljZW5zZSddKSkgewokcGFja2FnZS0+c2V0TGljZW5zZShcaXNfYXJyYXkoJGNvbmZpZ1snbGljZW5zZSddKSA/ICRjb25maWdbJ2xpY2Vuc2UnXSA6IFskY29uZmlnWydsaWNlbnNlJ11dKTsKfQoKaWYgKCFlbXB0eSgkY29uZmlnWydhdXRob3JzJ10pICYmIFxpc19hcnJheSgkY29uZmlnWydhdXRob3JzJ10pKSB7CiRwYWNrYWdlLT5zZXRBdXRob3JzKCRjb25maWdbJ2F1dGhvcnMnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydzdXBwb3J0J10pICYmIFxpc19hcnJheSgkY29uZmlnWydzdXBwb3J0J10pKSB7CiRwYWNrYWdlLT5zZXRTdXBwb3J0KCRjb25maWdbJ3N1cHBvcnQnXSk7Cn0KCmlmICghZW1wdHkoJGNvbmZpZ1snZnVuZGluZyddKSAmJiBcaXNfYXJyYXkoJGNvbmZpZ1snZnVuZGluZyddKSkgewokcGFja2FnZS0+c2V0RnVuZGluZygkY29uZmlnWydmdW5kaW5nJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snYWJhbmRvbmVkJ10pKSB7CiRwYWNrYWdlLT5zZXRBYmFuZG9uZWQoJGNvbmZpZ1snYWJhbmRvbmVkJ10pOwp9Cn0KCmlmICgkdGhpcy0+bG9hZE9wdGlvbnMgJiYgaXNzZXQoJGNvbmZpZ1sndHJhbnNwb3J0LW9wdGlvbnMnXSkpIHsKJHBhY2thZ2UtPnNldFRyYW5zcG9ydE9wdGlvbnMoJGNvbmZpZ1sndHJhbnNwb3J0LW9wdGlvbnMnXSk7Cn0KCmlmICgkYWxpYXNOb3JtYWxpemVkID0gJHRoaXMtPmdldEJyYW5jaEFsaWFzKCRjb25maWcpKSB7CiRwcmV0dHlBbGlhcyA9IFByZWc6OnJlcGxhY2UoJ3soXC45ezd9KSt9JywgJy54JywgJGFsaWFzTm9ybWFsaXplZCk7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZSkgewpyZXR1cm4gbmV3IFJvb3RBbGlhc1BhY2thZ2UoJHBhY2thZ2UsICRhbGlhc05vcm1hbGl6ZWQsICRwcmV0dHlBbGlhcyk7Cn0KCnJldHVybiBuZXcgQ29tcGxldGVBbGlhc1BhY2thZ2UoJHBhY2thZ2UsICRhbGlhc05vcm1hbGl6ZWQsICRwcmV0dHlBbGlhcyk7Cn0KCnJldHVybiAkcGFja2FnZTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY29uZmlndXJlQ2FjaGVkTGlua3MoYXJyYXkgJiRsaW5rQ2FjaGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICRjb25maWcpOiB2b2lkCnsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwokcHJldHR5VmVyc2lvbiA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cgpmb3JlYWNoIChCYXNlUGFja2FnZTo6JHN1cHBvcnRlZExpbmtUeXBlcyBhcyAkdHlwZSA9PiAkb3B0cykgewppZiAoaXNzZXQoJGNvbmZpZ1skdHlwZV0pKSB7CiRtZXRob2QgPSAnc2V0Jy51Y2ZpcnN0KCRvcHRzWydtZXRob2QnXSk7CgokbGlua3MgPSBbXTsKZm9yZWFjaCAoJGNvbmZpZ1skdHlwZV0gYXMgJHByZXR0eVRhcmdldCA9PiAkY29uc3RyYWludCkgewokdGFyZ2V0ID0gc3RydG9sb3dlcigkcHJldHR5VGFyZ2V0KTsKCgppZiAoJHRhcmdldCA9PT0gJG5hbWUpIHsKY29udGludWU7Cn0KCmlmICgkY29uc3RyYWludCA9PT0gJ3NlbGYudmVyc2lvbicpIHsKJGxpbmtzWyR0YXJnZXRdID0gJHRoaXMtPmNyZWF0ZUxpbmsoJG5hbWUsICRwcmV0dHlWZXJzaW9uLCAkb3B0c1snbWV0aG9kJ10sICR0YXJnZXQsICRjb25zdHJhaW50KTsKfSBlbHNlIHsKaWYgKCFpc3NldCgkbGlua0NhY2hlWyRuYW1lXVskdHlwZV1bJHRhcmdldF1bJGNvbnN0cmFpbnRdKSkgewokbGlua0NhY2hlWyRuYW1lXVskdHlwZV1bJHRhcmdldF1bJGNvbnN0cmFpbnRdID0gWyR0YXJnZXQsICR0aGlzLT5jcmVhdGVMaW5rKCRuYW1lLCAkcHJldHR5VmVyc2lvbiwgJG9wdHNbJ21ldGhvZCddLCAkdGFyZ2V0LCAkY29uc3RyYWludCldOwp9CgpbJHRhcmdldCwgJGxpbmtdID0gJGxpbmtDYWNoZVskbmFtZV1bJHR5cGVdWyR0YXJnZXRdWyRjb25zdHJhaW50XTsKJGxpbmtzWyR0YXJnZXRdID0gJGxpbms7Cn0KfQoKJHBhY2thZ2UtPnskbWV0aG9kfSgkbGlua3MpOwp9Cn0KfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwYXJzZUxpbmtzKHN0cmluZyAkc291cmNlLCBzdHJpbmcgJHNvdXJjZVZlcnNpb24sIHN0cmluZyAkZGVzY3JpcHRpb24sIGFycmF5ICRsaW5rcyk6IGFycmF5CnsKJHJlcyA9IFtdOwpmb3JlYWNoICgkbGlua3MgYXMgJHRhcmdldCA9PiAkY29uc3RyYWludCkgewppZiAoIWlzX3N0cmluZygkY29uc3RyYWludCkpIHsKY29udGludWU7Cn0KJHRhcmdldCA9IHN0cnRvbG93ZXIoKHN0cmluZykgJHRhcmdldCk7CiRyZXNbJHRhcmdldF0gPSAkdGhpcy0+Y3JlYXRlTGluaygkc291cmNlLCAkc291cmNlVmVyc2lvbiwgJGRlc2NyaXB0aW9uLCAkdGFyZ2V0LCAkY29uc3RyYWludCk7Cn0KCnJldHVybiAkcmVzOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVMaW5rKHN0cmluZyAkc291cmNlLCBzdHJpbmcgJHNvdXJjZVZlcnNpb24sIHN0cmluZyAkZGVzY3JpcHRpb24sIHN0cmluZyAkdGFyZ2V0LCBzdHJpbmcgJHByZXR0eUNvbnN0cmFpbnQpOiBMaW5rCnsKaWYgKCFcaXNfc3RyaW5nKCRwcmV0dHlDb25zdHJhaW50KSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignTGluayBjb25zdHJhaW50IGluICcuJHNvdXJjZS4nICcuJGRlc2NyaXB0aW9uLicgPiAnLiR0YXJnZXQuJyBzaG91bGQgYmUgYSBzdHJpbmcsIGdvdCAnLlxnZXR0eXBlKCRwcmV0dHlDb25zdHJhaW50KSAuICcgKCcgLiB2YXJfZXhwb3J0KCRwcmV0dHlDb25zdHJhaW50LCB0cnVlKSAuICcpJyk7Cn0KaWYgKCdzZWxmLnZlcnNpb24nID09PSAkcHJldHR5Q29uc3RyYWludCkgewokcGFyc2VkQ29uc3RyYWludCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRzb3VyY2VWZXJzaW9uKTsKfSBlbHNlIHsKJHBhcnNlZENvbnN0cmFpbnQgPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkcHJldHR5Q29uc3RyYWludCk7Cn0KCnJldHVybiBuZXcgTGluaygkc291cmNlLCAkdGFyZ2V0LCAkcGFyc2VkQ29uc3RyYWludCwgJGRlc2NyaXB0aW9uLCAkcHJldHR5Q29uc3RyYWludCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoQWxpYXMoYXJyYXkgJGNvbmZpZyk6ID9zdHJpbmcKewppZiAoIWlzc2V0KCRjb25maWdbJ3ZlcnNpb24nXSkgfHwgIWlzX3NjYWxhcigkY29uZmlnWyd2ZXJzaW9uJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCduby9pbnZhbGlkIHZlcnNpb24gZGVmaW5lZCcpOwp9CmlmICghaXNfc3RyaW5nKCRjb25maWdbJ3ZlcnNpb24nXSkpIHsKJGNvbmZpZ1sndmVyc2lvbiddID0gKHN0cmluZykgJGNvbmZpZ1sndmVyc2lvbiddOwp9CgppZiAoc3RycG9zKCRjb25maWdbJ3ZlcnNpb24nXSwgJ2Rldi0nKSAhPT0gMCAmJiAnLWRldicgIT09IHN1YnN0cigkY29uZmlnWyd2ZXJzaW9uJ10sIC00KSkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ2V4dHJhJ11bJ2JyYW5jaC1hbGlhcyddKSAmJiBcaXNfYXJyYXkoJGNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ10pKSB7CmZvcmVhY2ggKCRjb25maWdbJ2V4dHJhJ11bJ2JyYW5jaC1hbGlhcyddIGFzICRzb3VyY2VCcmFuY2ggPT4gJHRhcmdldEJyYW5jaCkgewokc291cmNlQnJhbmNoID0gKHN0cmluZykgJHNvdXJjZUJyYW5jaDsKCgppZiAoJy1kZXYnICE9PSBzdWJzdHIoJHRhcmdldEJyYW5jaCwgLTQpKSB7CmNvbnRpbnVlOwp9CgoKaWYgKCR0YXJnZXRCcmFuY2ggPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiR2YWxpZGF0ZWRUYXJnZXRCcmFuY2ggPSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUzsKfSBlbHNlIHsKJHZhbGlkYXRlZFRhcmdldEJyYW5jaCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemVCcmFuY2goc3Vic3RyKCR0YXJnZXRCcmFuY2gsIDAsIC00KSk7Cn0KaWYgKCctZGV2JyAhPT0gc3Vic3RyKCR2YWxpZGF0ZWRUYXJnZXRCcmFuY2gsIC00KSkgewpjb250aW51ZTsKfQoKCmlmIChzdHJ0b2xvd2VyKCRjb25maWdbJ3ZlcnNpb24nXSkgIT09IHN0cnRvbG93ZXIoJHNvdXJjZUJyYW5jaCkpIHsKY29udGludWU7Cn0KCgppZiAoKCRzb3VyY2VQcmVmaXggPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VOdW1lcmljQWxpYXNQcmVmaXgoJHNvdXJjZUJyYW5jaCkpCiYmICgkdGFyZ2V0UHJlZml4ID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlTnVtZXJpY0FsaWFzUHJlZml4KCR0YXJnZXRCcmFuY2gpKQomJiAoc3RyaXBvcygkdGFyZ2V0UHJlZml4LCAkc291cmNlUHJlZml4KSAhPT0gMCkKKSB7CmNvbnRpbnVlOwp9CgpyZXR1cm4gJHZhbGlkYXRlZFRhcmdldEJyYW5jaDsKfQp9CgppZiAoCmlzc2V0KCRjb25maWdbJ2RlZmF1bHQtYnJhbmNoJ10pCiYmICRjb25maWdbJ2RlZmF1bHQtYnJhbmNoJ10gPT09IHRydWUKJiYgZmFsc2UgPT09ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZU51bWVyaWNBbGlhc1ByZWZpeChQcmVnOjpyZXBsYWNlKCd7XnZ9JywgJycsICRjb25maWdbJ3ZlcnNpb24nXSkpCikgewpyZXR1cm4gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVM7Cn0KCnJldHVybiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyOwoKCgoKY2xhc3MgSW52YWxpZFBhY2thZ2VFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uCnsKCnByaXZhdGUgJGVycm9yczsKCnByaXZhdGUgJHdhcm5pbmdzOwoKcHJpdmF0ZSAkZGF0YTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRlcnJvcnMsIGFycmF5ICR3YXJuaW5ncywgYXJyYXkgJGRhdGEpCnsKJHRoaXMtPmVycm9ycyA9ICRlcnJvcnM7CiR0aGlzLT53YXJuaW5ncyA9ICR3YXJuaW5nczsKJHRoaXMtPmRhdGEgPSAkZGF0YTsKcGFyZW50OjpfX2NvbnN0cnVjdCgiSW52YWxpZCBwYWNrYWdlIGluZm9ybWF0aW9uOiBcbiIuaW1wbG9kZSgiXG4iLCBhcnJheV9tZXJnZSgkZXJyb3JzLCAkd2FybmluZ3MpKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREYXRhKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5kYXRhOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5lcnJvcnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRXYXJuaW5ncygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+d2FybmluZ3M7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXI7Cgp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290QWxpYXNQYWNrYWdlOwoKCgoKY2xhc3MgSnNvbkxvYWRlcgp7Cgpwcml2YXRlICRsb2FkZXI7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoTG9hZGVySW50ZXJmYWNlICRsb2FkZXIpCnsKJHRoaXMtPmxvYWRlciA9ICRsb2FkZXI7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZCgkanNvbik6IEJhc2VQYWNrYWdlCnsKaWYgKCRqc29uIGluc3RhbmNlb2YgSnNvbkZpbGUpIHsKJGNvbmZpZyA9ICRqc29uLT5yZWFkKCk7Cn0gZWxzZWlmIChmaWxlX2V4aXN0cygkanNvbikpIHsKJGNvbmZpZyA9IEpzb25GaWxlOjpwYXJzZUpzb24oZmlsZV9nZXRfY29udGVudHMoJGpzb24pLCAkanNvbik7Cn0gZWxzZWlmIChpc19zdHJpbmcoJGpzb24pKSB7CiRjb25maWcgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRqc29uKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKIkpzb25Mb2FkZXI6IFVua25vd24gXCRqc29uIHBhcmFtZXRlciAlcy4gUGxlYXNlIHJlcG9ydCBhdCBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY29tcG9zZXIvaXNzdWVzL25ldy4iLApnZXR0eXBlKCRqc29uKQopKTsKfQoKcmV0dXJuICR0aGlzLT5sb2FkZXItPmxvYWQoJGNvbmZpZyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290QWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CgoKCgoKCmludGVyZmFjZSBMb2FkZXJJbnRlcmZhY2UKewoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWQoYXJyYXkgJGNvbmZpZywgc3RyaW5nICRjbGFzcyA9ICdDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZScpOiBCYXNlUGFja2FnZTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290QWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uR3Vlc3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeU1hbmFnZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CgoKCgoKCgoKY2xhc3MgUm9vdFBhY2thZ2VMb2FkZXIgZXh0ZW5kcyBBcnJheUxvYWRlcgp7CgoKCnByaXZhdGUgJG1hbmFnZXI7CgoKCgpwcml2YXRlICRjb25maWc7CgoKCgpwcml2YXRlICR2ZXJzaW9uR3Vlc3NlcjsKCgoKCnByaXZhdGUgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJlcG9zaXRvcnlNYW5hZ2VyICRtYW5hZ2VyLCBDb25maWcgJGNvbmZpZywgP1ZlcnNpb25QYXJzZXIgJHBhcnNlciA9IG51bGwsID9WZXJzaW9uR3Vlc3NlciAkdmVyc2lvbkd1ZXNzZXIgPSBudWxsLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYXJzZXIpOwoKJHRoaXMtPm1hbmFnZXIgPSAkbWFuYWdlcjsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CmlmIChudWxsID09PSAkdmVyc2lvbkd1ZXNzZXIpIHsKJHByb2Nlc3NFeGVjdXRvciA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHByb2Nlc3NFeGVjdXRvci0+ZW5hYmxlQXN5bmMoKTsKJHZlcnNpb25HdWVzc2VyID0gbmV3IFZlcnNpb25HdWVzc2VyKCRjb25maWcsICRwcm9jZXNzRXhlY3V0b3IsICR0aGlzLT52ZXJzaW9uUGFyc2VyKTsKfQokdGhpcy0+dmVyc2lvbkd1ZXNzZXIgPSAkdmVyc2lvbkd1ZXNzZXI7CiR0aGlzLT5pbyA9ICRpbzsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkKGFycmF5ICRjb25maWcsIHN0cmluZyAkY2xhc3MgPSAnQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZScsID9zdHJpbmcgJGN3ZCA9IG51bGwpOiBCYXNlUGFja2FnZQp7CmlmICgkY2xhc3MgIT09ICdDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlJykgewp0cmlnZ2VyX2Vycm9yKCdUaGUgJGNsYXNzIGFyZyBpcyBkZXByZWNhdGVkLCBwbGVhc2UgcmVhY2ggb3V0IHRvIENvbXBvc2VyIG1haW50YWluZXJzIEFTQVAgaWYgeW91IHN0aWxsIG5lZWQgdGhpcy4nLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0KCmlmICghaXNzZXQoJGNvbmZpZ1snbmFtZSddKSkgewokY29uZmlnWyduYW1lJ10gPSAnX19yb290X18nOwp9IGVsc2VpZiAoJGVyciA9IFZhbGlkYXRpbmdBcnJheUxvYWRlcjo6aGFzUGFja2FnZU5hbWluZ0Vycm9yKCRjb25maWdbJ25hbWUnXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3VyIHBhY2thZ2UgbmFtZSAnLiRlcnIpOwp9CiRhdXRvVmVyc2lvbmVkID0gZmFsc2U7CmlmICghaXNzZXQoJGNvbmZpZ1sndmVyc2lvbiddKSkgewokY29tbWl0ID0gbnVsbDsKCgppZiAoUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfUk9PVF9WRVJTSU9OJykpIHsKJGNvbmZpZ1sndmVyc2lvbiddID0gJHRoaXMtPnZlcnNpb25HdWVzc2VyLT5nZXRSb290VmVyc2lvbkZyb21FbnYoKTsKfSBlbHNlIHsKJHZlcnNpb25EYXRhID0gJHRoaXMtPnZlcnNpb25HdWVzc2VyLT5ndWVzc1ZlcnNpb24oJGNvbmZpZywgJGN3ZCA/PyBQbGF0Zm9ybTo6Z2V0Q3dkKHRydWUpKTsKaWYgKCR2ZXJzaW9uRGF0YSkgewokY29uZmlnWyd2ZXJzaW9uJ10gPSAkdmVyc2lvbkRhdGFbJ3ByZXR0eV92ZXJzaW9uJ107CiRjb25maWdbJ3ZlcnNpb25fbm9ybWFsaXplZCddID0gJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ107CiRjb21taXQgPSAkdmVyc2lvbkRhdGFbJ2NvbW1pdCddOwp9Cn0KCmlmICghaXNzZXQoJGNvbmZpZ1sndmVyc2lvbiddKSkgewppZiAoJHRoaXMtPmlvICE9PSBudWxsICYmICRjb25maWdbJ25hbWUnXSAhPT0gJ19fcm9vdF9fJyAmJiAncHJvamVjdCcgIT09ICgkY29uZmlnWyd0eXBlJ10gPz8gJycpKSB7CiR0aGlzLT5pby0+d2FybmluZygKc3ByaW50ZigKIkNvbXBvc2VyIGNvdWxkIG5vdCBkZXRlY3QgdGhlIHJvb3QgcGFja2FnZSAoJXMpIHZlcnNpb24sIGRlZmF1bHRpbmcgdG8gJzEuMC4wJy4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL3Jvb3QtdmVyc2lvbiIsCiRjb25maWdbJ25hbWUnXQopCik7Cn0KJGNvbmZpZ1sndmVyc2lvbiddID0gJzEuMC4wJzsKJGF1dG9WZXJzaW9uZWQgPSB0cnVlOwp9CgppZiAoJGNvbW1pdCkgewokY29uZmlnWydzb3VyY2UnXSA9IFsKJ3R5cGUnID0+ICcnLAondXJsJyA9PiAnJywKJ3JlZmVyZW5jZScgPT4gJGNvbW1pdCwKXTsKJGNvbmZpZ1snZGlzdCddID0gWwondHlwZScgPT4gJycsCid1cmwnID0+ICcnLAoncmVmZXJlbmNlJyA9PiAkY29tbWl0LApdOwp9Cn0KCgokcGFja2FnZSA9IHBhcmVudDo6bG9hZCgkY29uZmlnLCAkY2xhc3MpOwppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290QWxpYXNQYWNrYWdlKSB7CiRyZWFsUGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0gZWxzZSB7CiRyZWFsUGFja2FnZSA9ICRwYWNrYWdlOwp9CgppZiAoISRyZWFsUGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0V4cGVjdGluZyBhIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2UgYXQgdGhpcyBwb2ludCcpOwp9CgppZiAoJGF1dG9WZXJzaW9uZWQpIHsKJHJlYWxQYWNrYWdlLT5yZXBsYWNlVmVyc2lvbigkcmVhbFBhY2thZ2UtPmdldFZlcnNpb24oKSwgUm9vdFBhY2thZ2U6OkRFRkFVTFRfUFJFVFRZX1ZFUlNJT04pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snbWluaW11bS1zdGFiaWxpdHknXSkpIHsKJHJlYWxQYWNrYWdlLT5zZXRNaW5pbXVtU3RhYmlsaXR5KFZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkY29uZmlnWydtaW5pbXVtLXN0YWJpbGl0eSddKSk7Cn0KCiRhbGlhc2VzID0gW107CiRzdGFiaWxpdHlGbGFncyA9IFtdOwokcmVmZXJlbmNlcyA9IFtdOwpmb3JlYWNoIChbJ3JlcXVpcmUnLCAncmVxdWlyZS1kZXYnXSBhcyAkbGlua1R5cGUpIHsKaWYgKGlzc2V0KCRjb25maWdbJGxpbmtUeXBlXSkpIHsKJGxpbmtJbmZvID0gQmFzZVBhY2thZ2U6OiRzdXBwb3J0ZWRMaW5rVHlwZXNbJGxpbmtUeXBlXTsKJG1ldGhvZCA9ICdnZXQnLnVjZmlyc3QoJGxpbmtJbmZvWydtZXRob2QnXSk7CiRsaW5rcyA9IFtdOwpmb3JlYWNoICgkcmVhbFBhY2thZ2UtPnskbWV0aG9kfSgpIGFzICRsaW5rKSB7CiRsaW5rc1skbGluay0+Z2V0VGFyZ2V0KCldID0gJGxpbmstPmdldENvbnN0cmFpbnQoKS0+Z2V0UHJldHR5U3RyaW5nKCk7Cn0KJGFsaWFzZXMgPSAkdGhpcy0+ZXh0cmFjdEFsaWFzZXMoJGxpbmtzLCAkYWxpYXNlcyk7CiRzdGFiaWxpdHlGbGFncyA9IHNlbGY6OmV4dHJhY3RTdGFiaWxpdHlGbGFncygkbGlua3MsICRyZWFsUGFja2FnZS0+Z2V0TWluaW11bVN0YWJpbGl0eSgpLCAkc3RhYmlsaXR5RmxhZ3MpOwokcmVmZXJlbmNlcyA9IHNlbGY6OmV4dHJhY3RSZWZlcmVuY2VzKCRsaW5rcywgJHJlZmVyZW5jZXMpOwoKaWYgKGlzc2V0KCRsaW5rc1skY29uZmlnWyduYW1lJ11dKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignUm9vdCBwYWNrYWdlIFwnJXNcJyBjYW5ub3QgcmVxdWlyZSBpdHNlbGYgaW4gaXRzIGNvbXBvc2VyLmpzb24nIC4gUEhQX0VPTCAuCidEaWQgeW91IGFjY2lkZW50YWxseSBuYW1lIHlvdXIgcm9vdCBwYWNrYWdlIGFmdGVyIGFuIGV4dGVybmFsIHBhY2thZ2U/JywgJGNvbmZpZ1snbmFtZSddKSk7Cn0KfQp9Cgpmb3JlYWNoIChhcnJheV9rZXlzKEJhc2VQYWNrYWdlOjokc3VwcG9ydGVkTGlua1R5cGVzKSBhcyAkbGlua1R5cGUpIHsKaWYgKGlzc2V0KCRjb25maWdbJGxpbmtUeXBlXSkpIHsKZm9yZWFjaCAoJGNvbmZpZ1skbGlua1R5cGVdIGFzICRsaW5rTmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoJGVyciA9IFZhbGlkYXRpbmdBcnJheUxvYWRlcjo6aGFzUGFja2FnZU5hbWluZ0Vycm9yKCRsaW5rTmFtZSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRsaW5rVHlwZS4nLicuJGVycik7Cn0KfQp9Cn0KCiRyZWFsUGFja2FnZS0+c2V0QWxpYXNlcygkYWxpYXNlcyk7CiRyZWFsUGFja2FnZS0+c2V0U3RhYmlsaXR5RmxhZ3MoJHN0YWJpbGl0eUZsYWdzKTsKJHJlYWxQYWNrYWdlLT5zZXRSZWZlcmVuY2VzKCRyZWZlcmVuY2VzKTsKCmlmIChpc3NldCgkY29uZmlnWydwcmVmZXItc3RhYmxlJ10pKSB7CiRyZWFsUGFja2FnZS0+c2V0UHJlZmVyU3RhYmxlKChib29sKSAkY29uZmlnWydwcmVmZXItc3RhYmxlJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snY29uZmlnJ10pKSB7CiRyZWFsUGFja2FnZS0+c2V0Q29uZmlnKCRjb25maWdbJ2NvbmZpZyddKTsKfQoKJHJlcG9zID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmRlZmF1bHRSZXBvcyhudWxsLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+bWFuYWdlcik7CmZvcmVhY2ggKCRyZXBvcyBhcyAkcmVwbykgewokdGhpcy0+bWFuYWdlci0+YWRkUmVwb3NpdG9yeSgkcmVwbyk7Cn0KJHJlYWxQYWNrYWdlLT5zZXRSZXBvc2l0b3JpZXMoJHRoaXMtPmNvbmZpZy0+Z2V0UmVwb3NpdG9yaWVzKCkpOwoKcmV0dXJuICRwYWNrYWdlOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4dHJhY3RBbGlhc2VzKGFycmF5ICRyZXF1aXJlcywgYXJyYXkgJGFsaWFzZXMpOiBhcnJheQp7CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxTmFtZSA9PiAkcmVxVmVyc2lvbikgewppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygneyg/Ol58XHwgKnwsICopKFteLFxzI3xdKykoPzojW14gXSspPyArYXMgKyhbXixcc3xdKykoPzokfCAqXHx8ICosKX0nLCAkcmVxVmVyc2lvbiwgJG1hdGNoKSkgewokYWxpYXNlc1tdID0gWwoncGFja2FnZScgPT4gc3RydG9sb3dlcigkcmVxTmFtZSksCid2ZXJzaW9uJyA9PiAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRtYXRjaFsxXSwgJHJlcVZlcnNpb24pLAonYWxpYXMnID0+ICRtYXRjaFsyXSwKJ2FsaWFzX25vcm1hbGl6ZWQnID0+ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJG1hdGNoWzJdLCAkcmVxVmVyc2lvbiksCl07Cn0gZWxzZWlmIChzdHJwb3MoJHJlcVZlcnNpb24sICcgYXMgJykgIT09IGZhbHNlKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdJbnZhbGlkIGFsaWFzIGRlZmluaXRpb24gaW4gIicuJHJlcU5hbWUuJyI6ICInLiRyZXFWZXJzaW9uLiciLiBBbGlhc2VzIHNob3VsZCBiZSBpbiB0aGUgZm9ybSAiZXhhY3QtdmVyc2lvbiBhcyBvdGhlci1leGFjdC12ZXJzaW9uIi4nKTsKfQp9CgpyZXR1cm4gJGFsaWFzZXM7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXh0cmFjdFN0YWJpbGl0eUZsYWdzKGFycmF5ICRyZXF1aXJlcywgc3RyaW5nICRtaW5pbXVtU3RhYmlsaXR5LCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MpOiBhcnJheQp7CiRzdGFiaWxpdGllcyA9IEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFUzsKJG1pbmltdW1TdGFiaWxpdHkgPSAkc3RhYmlsaXRpZXNbJG1pbmltdW1TdGFiaWxpdHldOwpmb3JlYWNoICgkcmVxdWlyZXMgYXMgJHJlcU5hbWUgPT4gJHJlcVZlcnNpb24pIHsKJGNvbnN0cmFpbnRzID0gW107CgoKJG9yU3BsaXQgPSBQcmVnOjpzcGxpdCgne1xzKlx8XHw/XHMqfScsIHRyaW0oJHJlcVZlcnNpb24pKTsKZm9yZWFjaCAoJG9yU3BsaXQgYXMgJG9yQ29uc3RyYWludCkgewokYW5kU3BsaXQgPSBQcmVnOjpzcGxpdCgneyg/PCFefGFzfFs9PjwgLF0pICooPzwhLSlbLCBdKD8hLSkgKig/ISx8YXN8JCl9JywgJG9yQ29uc3RyYWludCk7CmZvcmVhY2ggKCRhbmRTcGxpdCBhcyAkYW5kQ29uc3RyYWludCkgewokY29uc3RyYWludHNbXSA9ICRhbmRDb25zdHJhaW50Owp9Cn0KCgokbWF0Y2hlZCA9IGZhbHNlOwpmb3JlYWNoICgkY29uc3RyYWludHMgYXMgJGNvbnN0cmFpbnQpIHsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teW15AXSo/QCgnLmltcGxvZGUoJ3wnLCBhcnJheV9rZXlzKCRzdGFiaWxpdGllcykpLicpJH1pJywgJGNvbnN0cmFpbnQsICRtYXRjaCkpIHsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRyZXFOYW1lKTsKJHN0YWJpbGl0eSA9ICRzdGFiaWxpdGllc1tWZXJzaW9uUGFyc2VyOjpub3JtYWxpemVTdGFiaWxpdHkoJG1hdGNoWzFdKV07CgppZiAoaXNzZXQoJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSkgJiYgJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSA+ICRzdGFiaWxpdHkpIHsKY29udGludWU7Cn0KJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSA9ICRzdGFiaWxpdHk7CiRtYXRjaGVkID0gdHJ1ZTsKfQp9CgppZiAoJG1hdGNoZWQpIHsKY29udGludWU7Cn0KCmZvcmVhY2ggKCRjb25zdHJhaW50cyBhcyAkY29uc3RyYWludCkgewoKCiRyZXFWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgne14oW14sXHNAXSspIGFzIC4rJH0nLCAnJDEnLCAkY29uc3RyYWludCk7CmlmIChQcmVnOjppc01hdGNoKCd7XlteLFxzQF0rJH0nLCAkcmVxVmVyc2lvbikgJiYgJ3N0YWJsZScgIT09ICgkc3RhYmlsaXR5TmFtZSA9IFZlcnNpb25QYXJzZXI6OnBhcnNlU3RhYmlsaXR5KCRyZXFWZXJzaW9uKSkpIHsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRyZXFOYW1lKTsKJHN0YWJpbGl0eSA9ICRzdGFiaWxpdGllc1skc3RhYmlsaXR5TmFtZV07CmlmICgoaXNzZXQoJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSkgJiYgJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSA+ICRzdGFiaWxpdHkpIHx8ICgkbWluaW11bVN0YWJpbGl0eSA+ICRzdGFiaWxpdHkpKSB7CmNvbnRpbnVlOwp9CiRzdGFiaWxpdHlGbGFnc1skbmFtZV0gPSAkc3RhYmlsaXR5Owp9Cn0KfQoKcmV0dXJuICRzdGFiaWxpdHlGbGFnczsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGV4dHJhY3RSZWZlcmVuY2VzKGFycmF5ICRyZXF1aXJlcywgYXJyYXkgJHJlZmVyZW5jZXMpOiBhcnJheQp7CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxTmFtZSA9PiAkcmVxVmVyc2lvbikgewokcmVxVmVyc2lvbiA9IFByZWc6OnJlcGxhY2UoJ3teKFteLFxzQF0rKSBhcyAuKyR9JywgJyQxJywgJHJlcVZlcnNpb24pOwppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15bXixcc0BdKz8jKFthLWYwLTldKykkfScsICRyZXFWZXJzaW9uLCAkbWF0Y2gpICYmICdkZXYnID09PSBWZXJzaW9uUGFyc2VyOjpwYXJzZVN0YWJpbGl0eSgkcmVxVmVyc2lvbikpIHsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRyZXFOYW1lKTsKJHJlZmVyZW5jZXNbJG5hbWVdID0gJG1hdGNoWzFdOwp9Cn0KCnJldHVybiAkcmVmZXJlbmNlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXExvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNYXRjaE5vbmVDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXEludGVydmFsczsKdXNlIENvbXBvc2VyXFNwZHhcU3BkeExpY2Vuc2VzOwoKCgoKY2xhc3MgVmFsaWRhdGluZ0FycmF5TG9hZGVyIGltcGxlbWVudHMgTG9hZGVySW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IENIRUNLX0FMTCA9IDM7CnB1YmxpYyBjb25zdCBDSEVDS19VTkJPVU5EX0NPTlNUUkFJTlRTID0gMTsKcHVibGljIGNvbnN0IENIRUNLX1NUUklDVF9DT05TVFJBSU5UUyA9IDI7CgoKcHJpdmF0ZSAkbG9hZGVyOwoKcHJpdmF0ZSAkdmVyc2lvblBhcnNlcjsKCnByaXZhdGUgJGVycm9yczsKCnByaXZhdGUgJHdhcm5pbmdzOwoKcHJpdmF0ZSAkY29uZmlnOwoKcHJpdmF0ZSAkZmxhZ3M7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoTG9hZGVySW50ZXJmYWNlICRsb2FkZXIsIGJvb2wgJHN0cmljdE5hbWUgPSB0cnVlLCA/VmVyc2lvblBhcnNlciAkcGFyc2VyID0gbnVsbCwgaW50ICRmbGFncyA9IDApCnsKJHRoaXMtPmxvYWRlciA9ICRsb2FkZXI7CiR0aGlzLT52ZXJzaW9uUGFyc2VyID0gJHBhcnNlciA/PyBuZXcgVmVyc2lvblBhcnNlcigpOwokdGhpcy0+ZmxhZ3MgPSAkZmxhZ3M7CgppZiAoJHN0cmljdE5hbWUgIT09IHRydWUpIHsgCnRyaWdnZXJfZXJyb3IoJyRzdHJpY3ROYW1lIG11c3QgYmUgc2V0IHRvIHRydWUgaW4gVmFsaWRhdGluZ0FycmF5TG9hZGVyXCdzIGNvbnN0cnVjdG9yIGFzIG9mIDIuMiwgYW5kIGl0IHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjAnLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWQoYXJyYXkgJGNvbmZpZywgc3RyaW5nICRjbGFzcyA9ICdDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZScpOiBCYXNlUGFja2FnZQp7CiR0aGlzLT5lcnJvcnMgPSBbXTsKJHRoaXMtPndhcm5pbmdzID0gW107CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwoKJHRoaXMtPnZhbGlkYXRlU3RyaW5nKCduYW1lJywgdHJ1ZSk7CmlmIChpc3NldCgkY29uZmlnWyduYW1lJ10pICYmIG51bGwgIT09ICgkZXJyID0gc2VsZjo6aGFzUGFja2FnZU5hbWluZ0Vycm9yKCRjb25maWdbJ25hbWUnXSkpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICduYW1lIDogJy4kZXJyOwp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1sndmVyc2lvbiddKSkgewppZiAoIWlzX3NjYWxhcigkdGhpcy0+Y29uZmlnWyd2ZXJzaW9uJ10pKSB7CiR0aGlzLT52YWxpZGF0ZVN0cmluZygndmVyc2lvbicpOwp9IGVsc2UgewppZiAoIWlzX3N0cmluZygkdGhpcy0+Y29uZmlnWyd2ZXJzaW9uJ10pKSB7CiR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXSA9IChzdHJpbmcpICR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXTsKfQp0cnkgewokdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3ZlcnNpb24gOiBpbnZhbGlkIHZhbHVlICgnLiR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXS4nKTogJy4kZS0+Z2V0TWVzc2FnZSgpOwp1bnNldCgkdGhpcy0+Y29uZmlnWyd2ZXJzaW9uJ10pOwp9Cn0KfQoKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ2NvbmZpZyddWydwbGF0Zm9ybSddKSkgewpmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5jb25maWdbJ2NvbmZpZyddWydwbGF0Zm9ybSddIGFzICRrZXkgPT4gJHBsYXRmb3JtKSB7CmlmIChmYWxzZSA9PT0gJHBsYXRmb3JtKSB7CmNvbnRpbnVlOwp9CmlmICghaXNfc3RyaW5nKCRwbGF0Zm9ybSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2NvbmZpZy5wbGF0Zm9ybS4nIC4gJGtleSAuICcgOiBpbnZhbGlkIHZhbHVlICgnLmdldHR5cGUoJHBsYXRmb3JtKS4nICcudmFyX2V4cG9ydCgkcGxhdGZvcm0sIHRydWUpLicpOiBleHBlY3RlZCBzdHJpbmcgb3IgZmFsc2UnOwpjb250aW51ZTsKfQp0cnkgewokdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwbGF0Zm9ybSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2NvbmZpZy5wbGF0Zm9ybS4nIC4gJGtleSAuICcgOiBpbnZhbGlkIHZhbHVlICgnLiRwbGF0Zm9ybS4nKTogJy4kZS0+Z2V0TWVzc2FnZSgpOwp9Cn0KfQoKJHRoaXMtPnZhbGlkYXRlUmVnZXgoJ3R5cGUnLCAnW0EtWmEtejAtOS1dKycpOwokdGhpcy0+dmFsaWRhdGVTdHJpbmcoJ3RhcmdldC1kaXInKTsKJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ2V4dHJhJyk7CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snYmluJ10pKSB7CmlmIChpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1snYmluJ10pKSB7CiR0aGlzLT52YWxpZGF0ZVN0cmluZygnYmluJyk7Cn0gZWxzZSB7CiR0aGlzLT52YWxpZGF0ZUZsYXRBcnJheSgnYmluJyk7Cn0KfQoKJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ3NjcmlwdHMnKTsgCiR0aGlzLT52YWxpZGF0ZVN0cmluZygnZGVzY3JpcHRpb24nKTsKJHRoaXMtPnZhbGlkYXRlVXJsKCdob21lcGFnZScpOwokdGhpcy0+dmFsaWRhdGVGbGF0QXJyYXkoJ2tleXdvcmRzJywgJ1tccHtOfVxwe0x9IC5fLV0rJyk7CgokcmVsZWFzZURhdGUgPSBudWxsOwokdGhpcy0+dmFsaWRhdGVTdHJpbmcoJ3RpbWUnKTsKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ3RpbWUnXSkpIHsKdHJ5IHsKJHJlbGVhc2VEYXRlID0gbmV3IFxEYXRlVGltZSgkdGhpcy0+Y29uZmlnWyd0aW1lJ10sIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3RpbWUgOiBpbnZhbGlkIHZhbHVlICgnLiR0aGlzLT5jb25maWdbJ3RpbWUnXS4nKTogJy4kZS0+Z2V0TWVzc2FnZSgpOwp1bnNldCgkdGhpcy0+Y29uZmlnWyd0aW1lJ10pOwp9Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWydsaWNlbnNlJ10pKSB7CgppZiAoaXNfYXJyYXkoJHRoaXMtPmNvbmZpZ1snbGljZW5zZSddKSB8fCBpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1snbGljZW5zZSddKSkgewokbGljZW5zZXMgPSAoYXJyYXkpICR0aGlzLT5jb25maWdbJ2xpY2Vuc2UnXTsKCmZvcmVhY2ggKCRsaWNlbnNlcyBhcyAkaW5kZXggPT4gJGxpY2Vuc2UpIHsKaWYgKCFpc19zdHJpbmcoJGxpY2Vuc2UpKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gc3ByaW50ZigKJ0xpY2Vuc2UgJXMgc2hvdWxkIGJlIGEgc3RyaW5nLicsCmpzb25fZW5jb2RlKCRsaWNlbnNlKQopOwp1bnNldCgkbGljZW5zZXNbJGluZGV4XSk7Cn0KfQoKCmlmIChudWxsID09PSAkcmVsZWFzZURhdGUgfHwgJHJlbGVhc2VEYXRlLT5nZXRUaW1lc3RhbXAoKSA+PSBzdHJ0b3RpbWUoJy04ZGF5cycpKSB7CiRsaWNlbnNlVmFsaWRhdG9yID0gbmV3IFNwZHhMaWNlbnNlcygpOwpmb3JlYWNoICgkbGljZW5zZXMgYXMgJGxpY2Vuc2UpIHsKCmlmICgncHJvcHJpZXRhcnknID09PSAkbGljZW5zZSkgewpjb250aW51ZTsKfQokbGljZW5zZVRvVmFsaWRhdGUgPSBzdHJfcmVwbGFjZSgncHJvcHJpZXRhcnknLCAnTUlUJywgJGxpY2Vuc2UpOwppZiAoISRsaWNlbnNlVmFsaWRhdG9yLT52YWxpZGF0ZSgkbGljZW5zZVRvVmFsaWRhdGUpKSB7CmlmICgkbGljZW5zZVZhbGlkYXRvci0+dmFsaWRhdGUodHJpbSgkbGljZW5zZVRvVmFsaWRhdGUpKSkgewokdGhpcy0+d2FybmluZ3NbXSA9IHNwcmludGYoCidMaWNlbnNlICVzIG11c3Qgbm90IGNvbnRhaW4gZXh0cmEgc3BhY2VzLCBtYWtlIHN1cmUgdG8gdHJpbSBpdC4nLApqc29uX2VuY29kZSgkbGljZW5zZSkKKTsKfSBlbHNlIHsKJHRoaXMtPndhcm5pbmdzW10gPSBzcHJpbnRmKAonTGljZW5zZSAlcyBpcyBub3QgYSB2YWxpZCBTUERYIGxpY2Vuc2UgaWRlbnRpZmllciwgc2VlIGh0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvIGlmIHlvdSB1c2UgYW4gb3BlbiBsaWNlbnNlLicgLiBQSFBfRU9MIC4KJ0lmIHRoZSBzb2Z0d2FyZSBpcyBjbG9zZWQtc291cmNlLCB5b3UgbWF5IHVzZSAicHJvcHJpZXRhcnkiIGFzIGxpY2Vuc2UuJywKanNvbl9lbmNvZGUoJGxpY2Vuc2UpCik7Cn0KfQp9Cn0KCiR0aGlzLT5jb25maWdbJ2xpY2Vuc2UnXSA9IGFycmF5X3ZhbHVlcygkbGljZW5zZXMpOwp9IGVsc2UgewokdGhpcy0+d2FybmluZ3NbXSA9IHNwcmludGYoCidMaWNlbnNlIG11c3QgYmUgYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncywgZ290ICVzLicsCmpzb25fZW5jb2RlKCR0aGlzLT5jb25maWdbJ2xpY2Vuc2UnXSkKKTsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snbGljZW5zZSddKTsKfQp9CgppZiAoJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ2F1dGhvcnMnKSkgewpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ10gYXMgJGtleSA9PiAkYXV0aG9yKSB7CmlmICghaXNfYXJyYXkoJGF1dGhvcikpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2F1dGhvcnMuJy4ka2V5LicgOiBzaG91bGQgYmUgYW4gYXJyYXksICcuZ2V0dHlwZSgkYXV0aG9yKS4nIGdpdmVuJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snYXV0aG9ycyddWyRrZXldKTsKY29udGludWU7Cn0KZm9yZWFjaCAoWydob21lcGFnZScsICdlbWFpbCcsICduYW1lJywgJ3JvbGUnXSBhcyAkYXV0aG9yRGF0YSkgewppZiAoaXNzZXQoJGF1dGhvclskYXV0aG9yRGF0YV0pICYmICFpc19zdHJpbmcoJGF1dGhvclskYXV0aG9yRGF0YV0pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdhdXRob3JzLicuJGtleS4nLicuJGF1dGhvckRhdGEuJyA6IGludmFsaWQgdmFsdWUsIG11c3QgYmUgYSBzdHJpbmcnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ11bJGtleV1bJGF1dGhvckRhdGFdKTsKfQp9CmlmIChpc3NldCgkYXV0aG9yWydob21lcGFnZSddKSAmJiAhJHRoaXMtPmZpbHRlclVybCgkYXV0aG9yWydob21lcGFnZSddKSkgewokdGhpcy0+d2FybmluZ3NbXSA9ICdhdXRob3JzLicuJGtleS4nLmhvbWVwYWdlIDogaW52YWxpZCB2YWx1ZSAoJy4kYXV0aG9yWydob21lcGFnZSddLicpLCBtdXN0IGJlIGFuIGh0dHAvaHR0cHMgVVJMJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snYXV0aG9ycyddWyRrZXldWydob21lcGFnZSddKTsKfQppZiAoaXNzZXQoJGF1dGhvclsnZW1haWwnXSkgJiYgZmFsc2UgPT09IGZpbHRlcl92YXIoJGF1dGhvclsnZW1haWwnXSwgRklMVEVSX1ZBTElEQVRFX0VNQUlMKSkgewokdGhpcy0+d2FybmluZ3NbXSA9ICdhdXRob3JzLicuJGtleS4nLmVtYWlsIDogaW52YWxpZCB2YWx1ZSAoJy4kYXV0aG9yWydlbWFpbCddLicpLCBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcyc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2F1dGhvcnMnXVska2V5XVsnZW1haWwnXSk7Cn0KaWYgKFxjb3VudCgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ11bJGtleV0pID09PSAwKSB7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2F1dGhvcnMnXVska2V5XSk7Cn0KfQppZiAoXGNvdW50KCR0aGlzLT5jb25maWdbJ2F1dGhvcnMnXSkgPT09IDApIHsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snYXV0aG9ycyddKTsKfQp9CgppZiAoJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ3N1cHBvcnQnKSAmJiAhZW1wdHkoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddKSkgewpmb3JlYWNoIChbJ2lzc3VlcycsICdmb3J1bScsICd3aWtpJywgJ3NvdXJjZScsICdlbWFpbCcsICdpcmMnLCAnZG9jcycsICdyc3MnLCAnY2hhdCcsICdzZWN1cml0eSddIGFzICRrZXkpIHsKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVska2V5XSkgJiYgIWlzX3N0cmluZygkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJGtleV0pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdzdXBwb3J0LicuJGtleS4nIDogaW52YWxpZCB2YWx1ZSwgbXVzdCBiZSBhIHN0cmluZyc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVska2V5XSk7Cn0KfQoKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVsnZW1haWwnXSkgJiYgIWZpbHRlcl92YXIoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWydlbWFpbCddLCBGSUxURVJfVkFMSURBVEVfRU1BSUwpKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ3N1cHBvcnQuZW1haWwgOiBpbnZhbGlkIHZhbHVlICgnLiR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVsnZW1haWwnXS4nKSwgbXVzdCBiZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJ2VtYWlsJ10pOwp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWydpcmMnXSkgJiYgISR0aGlzLT5maWx0ZXJVcmwoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWydpcmMnXSwgWydpcmMnLCAnaXJjcyddKSkgewokdGhpcy0+d2FybmluZ3NbXSA9ICdzdXBwb3J0LmlyYyA6IGludmFsaWQgdmFsdWUgKCcuJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWydpcmMnXS4nKSwgbXVzdCBiZSBhIGlyYzovLzxzZXJ2ZXI+LzxjaGFubmVsPiBvciBpcmNzOi8vIFVSTCc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVsnaXJjJ10pOwp9Cgpmb3JlYWNoIChbJ2lzc3VlcycsICdmb3J1bScsICd3aWtpJywgJ3NvdXJjZScsICdkb2NzJywgJ2NoYXQnLCAnc2VjdXJpdHknXSBhcyAka2V5KSB7CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJGtleV0pICYmICEkdGhpcy0+ZmlsdGVyVXJsKCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVska2V5XSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnc3VwcG9ydC4nLiRrZXkuJyA6IGludmFsaWQgdmFsdWUgKCcuJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWyRrZXldLicpLCBtdXN0IGJlIGFuIGh0dHAvaHR0cHMgVVJMJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWyRrZXldKTsKfQp9CmlmIChlbXB0eSgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J10pKSB7CnVuc2V0KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXSk7Cn0KfQoKaWYgKCR0aGlzLT52YWxpZGF0ZUFycmF5KCdmdW5kaW5nJykgJiYgIWVtcHR5KCR0aGlzLT5jb25maWdbJ2Z1bmRpbmcnXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmNvbmZpZ1snZnVuZGluZyddIGFzICRrZXkgPT4gJGZ1bmRpbmdPcHRpb24pIHsKaWYgKCFpc19hcnJheSgkZnVuZGluZ09wdGlvbikpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2Z1bmRpbmcuJy4ka2V5LicgOiBzaG91bGQgYmUgYW4gYXJyYXksICcuZ2V0dHlwZSgkZnVuZGluZ09wdGlvbikuJyBnaXZlbic7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2Z1bmRpbmcnXVska2V5XSk7CmNvbnRpbnVlOwp9CmZvcmVhY2ggKFsndHlwZScsICd1cmwnXSBhcyAkZnVuZGluZ0RhdGEpIHsKaWYgKGlzc2V0KCRmdW5kaW5nT3B0aW9uWyRmdW5kaW5nRGF0YV0pICYmICFpc19zdHJpbmcoJGZ1bmRpbmdPcHRpb25bJGZ1bmRpbmdEYXRhXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2Z1bmRpbmcuJy4ka2V5LicuJy4kZnVuZGluZ0RhdGEuJyA6IGludmFsaWQgdmFsdWUsIG11c3QgYmUgYSBzdHJpbmcnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ11bJGtleV1bJGZ1bmRpbmdEYXRhXSk7Cn0KfQppZiAoaXNzZXQoJGZ1bmRpbmdPcHRpb25bJ3VybCddKSAmJiAhJHRoaXMtPmZpbHRlclVybCgkZnVuZGluZ09wdGlvblsndXJsJ10pKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ2Z1bmRpbmcuJy4ka2V5LicudXJsIDogaW52YWxpZCB2YWx1ZSAoJy4kZnVuZGluZ09wdGlvblsndXJsJ10uJyksIG11c3QgYmUgYW4gaHR0cC9odHRwcyBVUkwnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ11bJGtleV1bJ3VybCddKTsKfQppZiAoZW1wdHkoJHRoaXMtPmNvbmZpZ1snZnVuZGluZyddWyRrZXldKSkgewp1bnNldCgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ11bJGtleV0pOwp9Cn0KaWYgKGVtcHR5KCR0aGlzLT5jb25maWdbJ2Z1bmRpbmcnXSkpIHsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snZnVuZGluZyddKTsKfQp9CgokdGhpcy0+dmFsaWRhdGVBcnJheSgncGhwLWV4dCcpOwppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1sncGhwLWV4dCddKSAmJiAhaW5fYXJyYXkoJHRoaXMtPmNvbmZpZ1sndHlwZSddID8/ICcnLCBbJ3BocC1leHQnLCAncGhwLWV4dC16ZW5kJ10sIHRydWUpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0IGNhbiBvbmx5IGJlIHNldCBieSBwYWNrYWdlcyBvZiB0eXBlICJwaHAtZXh0IiBvciAicGhwLWV4dC16ZW5kIiB3aGljaCBtdXN0IGJlIEMgZXh0ZW5zaW9ucyc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ3BocC1leHQnXSk7Cn0KCiR1bmJvdW5kQ29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9JywgJzEwMDAwMDAwLWRldicpOwoKZm9yZWFjaCAoYXJyYXlfa2V5cyhCYXNlUGFja2FnZTo6JHN1cHBvcnRlZExpbmtUeXBlcykgYXMgJGxpbmtUeXBlKSB7CmlmICgkdGhpcy0+dmFsaWRhdGVBcnJheSgkbGlua1R5cGUpICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJGxpbmtUeXBlXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmNvbmZpZ1skbGlua1R5cGVdIGFzICRwYWNrYWdlID0+ICRjb25zdHJhaW50KSB7CiRwYWNrYWdlID0gKHN0cmluZykgJHBhY2thZ2U7CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyduYW1lJ10pICYmIDAgPT09IHN0cmNhc2VjbXAoJHBhY2thZ2UsICR0aGlzLT5jb25maWdbJ25hbWUnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJGxpbmtUeXBlLicuJy4kcGFja2FnZS4nIDogYSBwYWNrYWdlIGNhbm5vdCBzZXQgYSAnLiRsaW5rVHlwZS4nIG9uIGl0c2VsZic7CnVuc2V0KCR0aGlzLT5jb25maWdbJGxpbmtUeXBlXVskcGFja2FnZV0pOwpjb250aW51ZTsKfQppZiAoJGVyciA9IHNlbGY6Omhhc1BhY2thZ2VOYW1pbmdFcnJvcigkcGFja2FnZSwgdHJ1ZSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkbGlua1R5cGUuJy4nLiRlcnI7Cn0gZWxzZWlmICghUHJlZzo6aXNNYXRjaCgne15bQS1aYS16MC05Xy4vLV0rJH0nLCAkcGFja2FnZSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJGxpbmtUeXBlLicuJy4kcGFja2FnZS4nIDogaW52YWxpZCBrZXksIHBhY2thZ2UgbmFtZXMgbXVzdCBiZSBzdHJpbmdzIGNvbnRhaW5pbmcgb25seSBbQS1aYS16MC05Xy4vLV0nOwp9CmlmICghaXNfc3RyaW5nKCRjb25zdHJhaW50KSkgewokdGhpcy0+ZXJyb3JzW10gPSAkbGlua1R5cGUuJy4nLiRwYWNrYWdlLicgOiBpbnZhbGlkIHZhbHVlLCBtdXN0IGJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB2ZXJzaW9uIGNvbnN0cmFpbnQnOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRsaW5rVHlwZV1bJHBhY2thZ2VdKTsKfSBlbHNlaWYgKCdzZWxmLnZlcnNpb24nICE9PSAkY29uc3RyYWludCkgewp0cnkgewokbGlua0NvbnN0cmFpbnQgPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludCk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yc1tdID0gJGxpbmtUeXBlLicuJy4kcGFja2FnZS4nIDogaW52YWxpZCB2ZXJzaW9uIGNvbnN0cmFpbnQgKCcuJGUtPmdldE1lc3NhZ2UoKS4nKSc7CnVuc2V0KCR0aGlzLT5jb25maWdbJGxpbmtUeXBlXVskcGFja2FnZV0pOwpjb250aW51ZTsKfQoKCmlmICgKKCR0aGlzLT5mbGFncyAmIHNlbGY6OkNIRUNLX1VOQk9VTkRfQ09OU1RSQUlOVFMpCiYmICdyZXF1aXJlJyA9PT0gJGxpbmtUeXBlCiYmICRsaW5rQ29uc3RyYWludC0+bWF0Y2hlcygkdW5ib3VuZENvbnN0cmFpbnQpCiYmICFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWNrYWdlKQopIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkbGlua1R5cGUuJy4nLiRwYWNrYWdlLicgOiB1bmJvdW5kIHZlcnNpb24gY29uc3RyYWludHMgKCcuJGNvbnN0cmFpbnQuJykgc2hvdWxkIGJlIGF2b2lkZWQnOwp9IGVsc2VpZiAoCgooJHRoaXMtPmZsYWdzICYgc2VsZjo6Q0hFQ0tfU1RSSUNUX0NPTlNUUkFJTlRTKQomJiAncmVxdWlyZScgPT09ICRsaW5rVHlwZQomJiAkbGlua0NvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50ICYmIGluX2FycmF5KCRsaW5rQ29uc3RyYWludC0+Z2V0T3BlcmF0b3IoKSwgWyc9PScsICc9J10sIHRydWUpCiYmIChuZXcgQ29uc3RyYWludCgnPj0nLCAnMS4wLjAuMC1kZXYnKSktPm1hdGNoZXMoJGxpbmtDb25zdHJhaW50KQopIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkbGlua1R5cGUuJy4nLiRwYWNrYWdlLicgOiBleGFjdCB2ZXJzaW9uIGNvbnN0cmFpbnRzICgnLiRjb25zdHJhaW50LicpIHNob3VsZCBiZSBhdm9pZGVkIGlmIHRoZSBwYWNrYWdlIGZvbGxvd3Mgc2VtYW50aWMgdmVyc2lvbmluZyc7Cn0KCiRjb21wYWN0ZWQgPSBJbnRlcnZhbHM6OmNvbXBhY3RDb25zdHJhaW50KCRsaW5rQ29uc3RyYWludCk7CmlmICgkY29tcGFjdGVkIGluc3RhbmNlb2YgTWF0Y2hOb25lQ29uc3RyYWludCkgewokdGhpcy0+d2FybmluZ3NbXSA9ICRsaW5rVHlwZS4nLicuJHBhY2thZ2UuJyA6IHRoaXMgdmVyc2lvbiBjb25zdHJhaW50IGNhbm5vdCBwb3NzaWJseSBtYXRjaCBhbnl0aGluZyAoJy4kY29uc3RyYWludC4nKSc7Cn0KfQoKaWYgKCRsaW5rVHlwZSA9PT0gJ2NvbmZsaWN0JyAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWydyZXBsYWNlJ10pICYmICRrZXlzID0gYXJyYXlfaW50ZXJzZWN0X2tleSgkdGhpcy0+Y29uZmlnWydyZXBsYWNlJ10sICR0aGlzLT5jb25maWdbJ2NvbmZsaWN0J10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRsaW5rVHlwZS4nLicuJHBhY2thZ2UuJyA6IHlvdSBjYW5ub3QgY29uZmxpY3Qgd2l0aCBhIHBhY2thZ2UgdGhhdCBpcyBhbHNvIHJlcGxhY2VkLCBhcyByZXBsYWNlIGFscmVhZHkgY3JlYXRlcyBhbiBpbXBsaWNpdCBjb25mbGljdCBydWxlJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1skbGlua1R5cGVdWyRwYWNrYWdlXSk7Cn0KfQp9Cn0KCmlmICgkdGhpcy0+dmFsaWRhdGVBcnJheSgnc3VnZ2VzdCcpICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJ3N1Z2dlc3QnXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmNvbmZpZ1snc3VnZ2VzdCddIGFzICRwYWNrYWdlID0+ICRkZXNjcmlwdGlvbikgewppZiAoIWlzX3N0cmluZygkZGVzY3JpcHRpb24pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdzdWdnZXN0LicuJHBhY2thZ2UuJyA6IGludmFsaWQgdmFsdWUsIG11c3QgYmUgYSBzdHJpbmcgZGVzY3JpYmluZyB3aHkgdGhlIHBhY2thZ2UgaXMgc3VnZ2VzdGVkJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snc3VnZ2VzdCddWyRwYWNrYWdlXSk7Cn0KfQp9CgppZiAoJHRoaXMtPnZhbGlkYXRlU3RyaW5nKCdtaW5pbXVtLXN0YWJpbGl0eScpICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJ21pbmltdW0tc3RhYmlsaXR5J10pKSB7CmlmICghaXNzZXQoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTW3N0cnRvbG93ZXIoJHRoaXMtPmNvbmZpZ1snbWluaW11bS1zdGFiaWxpdHknXSldKSAmJiAkdGhpcy0+Y29uZmlnWydtaW5pbXVtLXN0YWJpbGl0eSddICE9PSAnUkMnKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdtaW5pbXVtLXN0YWJpbGl0eSA6IGludmFsaWQgdmFsdWUgKCcuJHRoaXMtPmNvbmZpZ1snbWluaW11bS1zdGFiaWxpdHknXS4nKSwgbXVzdCBiZSBvbmUgb2YgJy5pbXBsb2RlKCcsICcsIGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTKSk7CnVuc2V0KCR0aGlzLT5jb25maWdbJ21pbmltdW0tc3RhYmlsaXR5J10pOwp9Cn0KCmlmICgkdGhpcy0+dmFsaWRhdGVBcnJheSgnYXV0b2xvYWQnKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWydhdXRvbG9hZCddKSkgewokdHlwZXMgPSBbJ3Bzci0wJywgJ3Bzci00JywgJ2NsYXNzbWFwJywgJ2ZpbGVzJywgJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCddOwpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWydhdXRvbG9hZCddIGFzICR0eXBlID0+ICR0eXBlQ29uZmlnKSB7CmlmICghaW5fYXJyYXkoJHR5cGUsICR0eXBlcykpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2F1dG9sb2FkIDogaW52YWxpZCB2YWx1ZSAoJy4kdHlwZS4nKSwgbXVzdCBiZSBvbmUgb2YgJy5pbXBsb2RlKCcsICcsICR0eXBlcyk7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2F1dG9sb2FkJ11bJHR5cGVdKTsKfQppZiAoJHR5cGUgPT09ICdwc3ItNCcpIHsKZm9yZWFjaCAoJHR5cGVDb25maWcgYXMgJG5hbWVzcGFjZSA9PiAkZGlycykgewppZiAoJG5hbWVzcGFjZSAhPT0gJycgJiYgJ1xcJyAhPT0gc3Vic3RyKChzdHJpbmcpICRuYW1lc3BhY2UsIC0xKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnYXV0b2xvYWQucHNyLTQgOiBpbnZhbGlkIHZhbHVlICgnLiRuYW1lc3BhY2UuJyksIG5hbWVzcGFjZXMgbXVzdCBlbmQgd2l0aCBhIG5hbWVzcGFjZSBzZXBhcmF0b3IsIHNob3VsZCBiZSAnLiRuYW1lc3BhY2UuJ1xcXFwnOwp9Cn0KfQp9Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWydhdXRvbG9hZCddWydwc3ItNCddKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWyd0YXJnZXQtZGlyJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICd0YXJnZXQtZGlyIDogdGhpcyBjYW4gbm90IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgYXV0b2xvYWQucHNyLTQgc2V0dGluZywgcmVtb3ZlIHRhcmdldC1kaXIgdG8gdXBncmFkZSB0byBwc3ItNCc7CgoKdW5zZXQoJHRoaXMtPmNvbmZpZ1snYXV0b2xvYWQnXVsncHNyLTQnXSk7Cn0KCmZvcmVhY2ggKFsnc291cmNlJywgJ2Rpc3QnXSBhcyAkc3JjVHlwZSkgewppZiAoJHRoaXMtPnZhbGlkYXRlQXJyYXkoJHNyY1R5cGUpICYmICFlbXB0eSgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXSkpIHsKaWYgKCFpc3NldCgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndHlwZSddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkc3JjVHlwZSAuICcudHlwZSA6IG11c3QgYmUgcHJlc2VudCc7Cn0KaWYgKCFpc3NldCgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndXJsJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRzcmNUeXBlIC4gJy51cmwgOiBtdXN0IGJlIHByZXNlbnQnOwp9CmlmICgkc3JjVHlwZSA9PT0gJ3NvdXJjZScgJiYgIWlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnJlZmVyZW5jZSA6IG11c3QgYmUgcHJlc2VudCc7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd0eXBlJ10pICYmICFpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3R5cGUnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnR5cGUgOiBzaG91bGQgYmUgYSBzdHJpbmcsICcuZ2V0dHlwZSgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndHlwZSddKS4nIGdpdmVuJzsKfQppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3VybCddKSAmJiAhaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnVybCA6IHNob3VsZCBiZSBhIHN0cmluZywgJy5nZXR0eXBlKCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXSkuJyBnaXZlbic7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkgJiYgIWlzX3N0cmluZygkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsncmVmZXJlbmNlJ10pICYmICFpc19pbnQoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3JlZmVyZW5jZSddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkc3JjVHlwZSAuICcucmVmZXJlbmNlIDogc2hvdWxkIGJlIGEgc3RyaW5nIG9yIGludCwgJy5nZXR0eXBlKCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkuJyBnaXZlbic7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkgJiYgUHJlZzo6aXNNYXRjaCgne15ccyotfScsIChzdHJpbmcpICR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnJlZmVyZW5jZSA6IG11c3Qgbm90IHN0YXJ0IHdpdGggYSAiLSIsICInLiR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXS4nIiBnaXZlbic7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXSkgJiYgUHJlZzo6aXNNYXRjaCgne15ccyotfScsIChzdHJpbmcpICR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnVybCA6IG11c3Qgbm90IHN0YXJ0IHdpdGggYSAiLSIsICInLiR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXS4nIiBnaXZlbic7Cn0KfQp9CgoKCgokdGhpcy0+dmFsaWRhdGVGbGF0QXJyYXkoJ2luY2x1ZGUtcGF0aCcpOwokdGhpcy0+dmFsaWRhdGVBcnJheSgndHJhbnNwb3J0LW9wdGlvbnMnKTsKCgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ10pKSB7CmlmICghaXNfYXJyYXkoJHRoaXMtPmNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdleHRyYS5icmFuY2gtYWxpYXMgOiBtdXN0IGJlIGFuIGFycmF5IG9mIHZlcnNpb25zID0+IGFsaWFzZXMnOwp9IGVsc2Ugewpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXSBhcyAkc291cmNlQnJhbmNoID0+ICR0YXJnZXRCcmFuY2gpIHsKaWYgKCFpc19zdHJpbmcoJHRhcmdldEJyYW5jaCkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnZXh0cmEuYnJhbmNoLWFsaWFzLicuJHNvdXJjZUJyYW5jaC4nIDogdGhlIHRhcmdldCBicmFuY2ggKCcuanNvbl9lbmNvZGUoJHRhcmdldEJyYW5jaCkuJykgbXVzdCBiZSBhIHN0cmluZywgIicuZ2V0dHlwZSgkdGFyZ2V0QnJhbmNoKS4nIiByZWNlaXZlZC4nOwp1bnNldCgkdGhpcy0+Y29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXVskc291cmNlQnJhbmNoXSk7Cgpjb250aW51ZTsKfQoKCmlmICgnLWRldicgIT09IHN1YnN0cigkdGFyZ2V0QnJhbmNoLCAtNCkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnZXh0cmEuYnJhbmNoLWFsaWFzLicuJHNvdXJjZUJyYW5jaC4nIDogdGhlIHRhcmdldCBicmFuY2ggKCcuJHRhcmdldEJyYW5jaC4nKSBtdXN0IGVuZCBpbiAtZGV2JzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ11bJHNvdXJjZUJyYW5jaF0pOwoKY29udGludWU7Cn0KCgokdmFsaWRhdGVkVGFyZ2V0QnJhbmNoID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZUJyYW5jaChzdWJzdHIoJHRhcmdldEJyYW5jaCwgMCwgLTQpKTsKaWYgKCctZGV2JyAhPT0gc3Vic3RyKCR2YWxpZGF0ZWRUYXJnZXRCcmFuY2gsIC00KSkgewokdGhpcy0+d2FybmluZ3NbXSA9ICdleHRyYS5icmFuY2gtYWxpYXMuJy4kc291cmNlQnJhbmNoLicgOiB0aGUgdGFyZ2V0IGJyYW5jaCAoJy4kdGFyZ2V0QnJhbmNoLicpIG11c3QgYmUgYSBwYXJzZWFibGUgbnVtYmVyIGxpa2UgMi4wLWRldic7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2V4dHJhJ11bJ2JyYW5jaC1hbGlhcyddWyRzb3VyY2VCcmFuY2hdKTsKCmNvbnRpbnVlOwp9CgoKaWYgKCgkc291cmNlUHJlZml4ID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlTnVtZXJpY0FsaWFzUHJlZml4KCRzb3VyY2VCcmFuY2gpKQomJiAoJHRhcmdldFByZWZpeCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZU51bWVyaWNBbGlhc1ByZWZpeCgkdGFyZ2V0QnJhbmNoKSkKJiYgKHN0cmlwb3MoJHRhcmdldFByZWZpeCwgJHNvdXJjZVByZWZpeCkgIT09IDApCikgewokdGhpcy0+d2FybmluZ3NbXSA9ICdleHRyYS5icmFuY2gtYWxpYXMuJy4kc291cmNlQnJhbmNoLicgOiB0aGUgdGFyZ2V0IGJyYW5jaCAoJy4kdGFyZ2V0QnJhbmNoLicpIGlzIG5vdCBhIHZhbGlkIG51bWVyaWMgYWxpYXMgZm9yIHRoaXMgdmVyc2lvbic7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2V4dHJhJ11bJ2JyYW5jaC1hbGlhcyddWyRzb3VyY2VCcmFuY2hdKTsKfQp9Cn0KfQoKaWYgKCR0aGlzLT5lcnJvcnMpIHsKdGhyb3cgbmV3IEludmFsaWRQYWNrYWdlRXhjZXB0aW9uKCR0aGlzLT5lcnJvcnMsICR0aGlzLT53YXJuaW5ncywgJGNvbmZpZyk7Cn0KCiRwYWNrYWdlID0gJHRoaXMtPmxvYWRlci0+bG9hZCgkdGhpcy0+Y29uZmlnLCAkY2xhc3MpOwokdGhpcy0+Y29uZmlnID0gW107CgpyZXR1cm4gJHBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRXYXJuaW5ncygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+d2FybmluZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmVycm9yczsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXNQYWNrYWdlTmFtaW5nRXJyb3Ioc3RyaW5nICRuYW1lLCBib29sICRpc0xpbmsgPSBmYWxzZSk6ID9zdHJpbmcKewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmFtZSkpIHsKcmV0dXJuIG51bGw7Cn0KCmlmICghUHJlZzo6aXNNYXRjaCgne15bYS16MC05XSg/OltfLi1dP1thLXowLTldKyspKisvW2EtejAtOV0oPzooPzpbXy5dfC17MSwyfSk/W2EtejAtOV0rKykqKyR9aUQnLCAkbmFtZSkpIHsKcmV0dXJuICRuYW1lLicgaXMgaW52YWxpZCwgaXQgc2hvdWxkIGhhdmUgYSB2ZW5kb3IgbmFtZSwgYSBmb3J3YXJkIHNsYXNoLCBhbmQgYSBwYWNrYWdlIG5hbWUuIFRoZSB2ZW5kb3IgYW5kIHBhY2thZ2UgbmFtZSBjYW4gYmUgd29yZHMgc2VwYXJhdGVkIGJ5IC0sIC4gb3IgXy4gVGhlIGNvbXBsZXRlIG5hbWUgc2hvdWxkIG1hdGNoICJeW2EtejAtOV0oW18uLV0/W2EtejAtOV0rKSovW2EtejAtOV0oKFtfLl0/fC17MCwyfSlbYS16MC05XSspKiQiLic7Cn0KCiRyZXNlcnZlZE5hbWVzID0gWydudWwnLCAnY29uJywgJ3BybicsICdhdXgnLCAnY29tMScsICdjb20yJywgJ2NvbTMnLCAnY29tNCcsICdjb201JywgJ2NvbTYnLCAnY29tNycsICdjb204JywgJ2NvbTknLCAnbHB0MScsICdscHQyJywgJ2xwdDMnLCAnbHB0NCcsICdscHQ1JywgJ2xwdDYnLCAnbHB0NycsICdscHQ4JywgJ2xwdDknXTsKJGJpdHMgPSBleHBsb2RlKCcvJywgc3RydG9sb3dlcigkbmFtZSkpOwppZiAoaW5fYXJyYXkoJGJpdHNbMF0sICRyZXNlcnZlZE5hbWVzLCB0cnVlKSB8fCBpbl9hcnJheSgkYml0c1sxXSwgJHJlc2VydmVkTmFtZXMsIHRydWUpKSB7CnJldHVybiAkbmFtZS4nIGlzIHJlc2VydmVkLCBwYWNrYWdlIGFuZCB2ZW5kb3IgbmFtZXMgY2FuIG5vdCBtYXRjaCBhbnkgb2Y6ICcuaW1wbG9kZSgnLCAnLCAkcmVzZXJ2ZWROYW1lcykuJy4nOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgne1wuanNvbiR9JywgJG5hbWUpKSB7CnJldHVybiAkbmFtZS4nIGlzIGludmFsaWQsIHBhY2thZ2UgbmFtZXMgY2FuIG5vdCBlbmQgaW4gLmpzb24sIGNvbnNpZGVyIHJlbmFtaW5nIGl0IG9yIHBlcmhhcHMgdXNpbmcgYSAtanNvbiBzdWZmaXggaW5zdGVhZC4nOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgne1tBLVpdfScsICRuYW1lKSkgewppZiAoJGlzTGluaykgewpyZXR1cm4gJG5hbWUuJyBpcyBpbnZhbGlkLCBpdCBzaG91bGQgbm90IGNvbnRhaW4gdXBwZXJjYXNlIGNoYXJhY3RlcnMuIFBsZWFzZSB1c2UgJy5zdHJ0b2xvd2VyKCRuYW1lKS4nIGluc3RlYWQuJzsKfQoKJHN1Z2dlc3ROYW1lID0gUHJlZzo6cmVwbGFjZSgneyg/OihbYS16XSkoW0EtWl0pfChbQS1aXSkoW0EtWl1bYS16XSkpfScsICdcXDFcXDMtXFwyXFw0JywgJG5hbWUpOwokc3VnZ2VzdE5hbWUgPSBzdHJ0b2xvd2VyKCRzdWdnZXN0TmFtZSk7CgpyZXR1cm4gJG5hbWUuJyBpcyBpbnZhbGlkLCBpdCBzaG91bGQgbm90IGNvbnRhaW4gdXBwZXJjYXNlIGNoYXJhY3RlcnMuIFdlIHN1Z2dlc3QgdXNpbmcgJy4kc3VnZ2VzdE5hbWUuJyBpbnN0ZWFkLic7Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVJlZ2V4KHN0cmluZyAkcHJvcGVydHksIHN0cmluZyAkcmVnZXgsIGJvb2wgJG1hbmRhdG9yeSA9IGZhbHNlKTogYm9vbAp7CmlmICghJHRoaXMtPnZhbGlkYXRlU3RyaW5nKCRwcm9wZXJ0eSwgJG1hbmRhdG9yeSkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoIVByZWc6OmlzTWF0Y2goJ3teJy4kcmVnZXguJyR9dScsICR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkpIHsKJG1lc3NhZ2UgPSAkcHJvcGVydHkuJyA6IGludmFsaWQgdmFsdWUgKCcuJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldLicpLCBtdXN0IG1hdGNoICcuJHJlZ2V4OwppZiAoJG1hbmRhdG9yeSkgewokdGhpcy0+ZXJyb3JzW10gPSAkbWVzc2FnZTsKfSBlbHNlIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkbWVzc2FnZTsKfQp1bnNldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVN0cmluZyhzdHJpbmcgJHByb3BlcnR5LCBib29sICRtYW5kYXRvcnkgPSBmYWxzZSk6IGJvb2wKewppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSAmJiAhaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHByb3BlcnR5LicgOiBzaG91bGQgYmUgYSBzdHJpbmcsICcuZ2V0dHlwZSgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pLicgZ2l2ZW4nOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pOwoKcmV0dXJuIGZhbHNlOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkgfHwgdHJpbSgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pID09PSAnJykgewppZiAoJG1hbmRhdG9yeSkgewokdGhpcy0+ZXJyb3JzW10gPSAkcHJvcGVydHkuJyA6IG11c3QgYmUgcHJlc2VudCc7Cn0KdW5zZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVBcnJheShzdHJpbmcgJHByb3BlcnR5LCBib29sICRtYW5kYXRvcnkgPSBmYWxzZSk6IGJvb2wKewppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSAmJiAhaXNfYXJyYXkoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkcHJvcGVydHkuJyA6IHNob3VsZCBiZSBhbiBhcnJheSwgJy5nZXR0eXBlKCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkuJyBnaXZlbic7CnVuc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSk7CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICghaXNzZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSB8fCAhY291bnQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSkgewppZiAoJG1hbmRhdG9yeSkgewokdGhpcy0+ZXJyb3JzW10gPSAkcHJvcGVydHkuJyA6IG11c3QgYmUgcHJlc2VudCBhbmQgY29udGFpbiBhdCBsZWFzdCBvbmUgZWxlbWVudCc7Cn0KdW5zZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlRmxhdEFycmF5KHN0cmluZyAkcHJvcGVydHksID9zdHJpbmcgJHJlZ2V4ID0gbnVsbCwgYm9vbCAkbWFuZGF0b3J5ID0gZmFsc2UpOiBib29sCnsKaWYgKCEkdGhpcy0+dmFsaWRhdGVBcnJheSgkcHJvcGVydHksICRtYW5kYXRvcnkpKSB7CnJldHVybiBmYWxzZTsKfQoKJHBhc3MgPSB0cnVlOwpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0gYXMgJGtleSA9PiAkdmFsdWUpIHsKaWYgKCFpc19zdHJpbmcoJHZhbHVlKSAmJiAhaXNfbnVtZXJpYygkdmFsdWUpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRwcm9wZXJ0eS4nLicuJGtleS4nIDogbXVzdCBiZSBhIHN0cmluZyBvciBpbnQsICcuZ2V0dHlwZSgkdmFsdWUpLicgZ2l2ZW4nOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV1bJGtleV0pOwokcGFzcyA9IGZhbHNlOwoKY29udGludWU7Cn0KCmlmICgkcmVnZXggJiYgIVByZWc6OmlzTWF0Y2goJ3teJy4kcmVnZXguJyR9dScsIChzdHJpbmcpICR2YWx1ZSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkcHJvcGVydHkuJy4nLiRrZXkuJyA6IGludmFsaWQgdmFsdWUgKCcuJHZhbHVlLicpLCBtdXN0IG1hdGNoICcuJHJlZ2V4Owp1bnNldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV1bJGtleV0pOwokcGFzcyA9IGZhbHNlOwp9Cn0KCnJldHVybiAkcGFzczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVVybChzdHJpbmcgJHByb3BlcnR5LCBib29sICRtYW5kYXRvcnkgPSBmYWxzZSk6IGJvb2wKewppZiAoISR0aGlzLT52YWxpZGF0ZVN0cmluZygkcHJvcGVydHksICRtYW5kYXRvcnkpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCEkdGhpcy0+ZmlsdGVyVXJsKCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkcHJvcGVydHkuJyA6IGludmFsaWQgdmFsdWUgKCcuJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldLicpLCBtdXN0IGJlIGFuIGh0dHAvaHR0cHMgVVJMJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbHRlclVybCgkdmFsdWUsIGFycmF5ICRzY2hlbWVzID0gWydodHRwJywgJ2h0dHBzJ10pOiBib29sCnsKaWYgKCR2YWx1ZSA9PT0gJycpIHsKcmV0dXJuIHRydWU7Cn0KCiRiaXRzID0gcGFyc2VfdXJsKCR2YWx1ZSk7CmlmIChlbXB0eSgkYml0c1snc2NoZW1lJ10pIHx8IGVtcHR5KCRiaXRzWydob3N0J10pKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFpbl9hcnJheSgkYml0c1snc2NoZW1lJ10sICRzY2hlbWVzLCB0cnVlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7Cgp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsYXRpb25NYW5hZ2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxMb2NrQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJvb3RQYWNrYWdlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxEdW1wZXJcQXJyYXlEdW1wZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcR2l0IGFzIEdpdFV0aWw7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIFNlbGRcSnNvbkxpbnRcUGFyc2luZ0V4Y2VwdGlvbjsKCgoKCgoKCmNsYXNzIExvY2tlcgp7Cgpwcml2YXRlICRsb2NrRmlsZTsKCnByaXZhdGUgJGluc3RhbGxhdGlvbk1hbmFnZXI7Cgpwcml2YXRlICRoYXNoOwoKcHJpdmF0ZSAkY29udGVudEhhc2g7Cgpwcml2YXRlICRsb2FkZXI7Cgpwcml2YXRlICRkdW1wZXI7Cgpwcml2YXRlICRwcm9jZXNzOwoKcHJpdmF0ZSAkbG9ja0RhdGFDYWNoZSA9IG51bGw7Cgpwcml2YXRlICR2aXJ0dWFsRmlsZVdyaXR0ZW4gPSBmYWxzZTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBKc29uRmlsZSAkbG9ja0ZpbGUsIEluc3RhbGxhdGlvbk1hbmFnZXIgJGluc3RhbGxhdGlvbk1hbmFnZXIsIHN0cmluZyAkY29tcG9zZXJGaWxlQ29udGVudHMsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKQp7CiR0aGlzLT5sb2NrRmlsZSA9ICRsb2NrRmlsZTsKJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXIgPSAkaW5zdGFsbGF0aW9uTWFuYWdlcjsKJHRoaXMtPmhhc2ggPSBoYXNoKCdtZDUnLCAkY29tcG9zZXJGaWxlQ29udGVudHMpOwokdGhpcy0+Y29udGVudEhhc2ggPSBzZWxmOjpnZXRDb250ZW50SGFzaCgkY29tcG9zZXJGaWxlQ29udGVudHMpOwokdGhpcy0+bG9hZGVyID0gbmV3IEFycmF5TG9hZGVyKG51bGwsIHRydWUpOwokdGhpcy0+ZHVtcGVyID0gbmV3IEFycmF5RHVtcGVyKCk7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3MgPz8gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SnNvbkZpbGUoKTogSnNvbkZpbGUKewpyZXR1cm4gJHRoaXMtPmxvY2tGaWxlOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29udGVudEhhc2goc3RyaW5nICRjb21wb3NlckZpbGVDb250ZW50cyk6IHN0cmluZwp7CiRjb250ZW50ID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkY29tcG9zZXJGaWxlQ29udGVudHMsICdjb21wb3Nlci5qc29uJyk7CgokcmVsZXZhbnRLZXlzID0gWwonbmFtZScsCid2ZXJzaW9uJywKJ3JlcXVpcmUnLAoncmVxdWlyZS1kZXYnLAonY29uZmxpY3QnLAoncmVwbGFjZScsCidwcm92aWRlJywKJ21pbmltdW0tc3RhYmlsaXR5JywKJ3ByZWZlci1zdGFibGUnLAoncmVwb3NpdG9yaWVzJywKJ2V4dHJhJywKXTsKCiRyZWxldmFudENvbnRlbnQgPSBbXTsKCmZvcmVhY2ggKGFycmF5X2ludGVyc2VjdCgkcmVsZXZhbnRLZXlzLCBhcnJheV9rZXlzKCRjb250ZW50KSkgYXMgJGtleSkgewokcmVsZXZhbnRDb250ZW50WyRrZXldID0gJGNvbnRlbnRbJGtleV07Cn0KaWYgKGlzc2V0KCRjb250ZW50Wydjb25maWcnXVsncGxhdGZvcm0nXSkpIHsKJHJlbGV2YW50Q29udGVudFsnY29uZmlnJ11bJ3BsYXRmb3JtJ10gPSAkY29udGVudFsnY29uZmlnJ11bJ3BsYXRmb3JtJ107Cn0KCmtzb3J0KCRyZWxldmFudENvbnRlbnQpOwoKcmV0dXJuIGhhc2goJ21kNScsIEpzb25GaWxlOjplbmNvZGUoJHJlbGV2YW50Q29udGVudCwgMCkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNMb2NrZWQoKTogYm9vbAp7CmlmICghJHRoaXMtPnZpcnR1YWxGaWxlV3JpdHRlbiAmJiAhJHRoaXMtPmxvY2tGaWxlLT5leGlzdHMoKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRkYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CgpyZXR1cm4gaXNzZXQoJGRhdGFbJ3BhY2thZ2VzJ10pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNGcmVzaCgpOiBib29sCnsKJGxvY2sgPSAkdGhpcy0+bG9ja0ZpbGUtPnJlYWQoKTsKCmlmICghZW1wdHkoJGxvY2tbJ2NvbnRlbnQtaGFzaCddKSkgewoKcmV0dXJuICR0aGlzLT5jb250ZW50SGFzaCA9PT0gJGxvY2tbJ2NvbnRlbnQtaGFzaCddOwp9CgoKaWYgKCFlbXB0eSgkbG9ja1snaGFzaCddKSkgewpyZXR1cm4gJHRoaXMtPmhhc2ggPT09ICRsb2NrWydoYXNoJ107Cn0KCgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NrZWRSZXBvc2l0b3J5KGJvb2wgJHdpdGhEZXZSZXFzID0gZmFsc2UpOiBMb2NrQXJyYXlSZXBvc2l0b3J5CnsKJGxvY2tEYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CiRwYWNrYWdlcyA9IG5ldyBMb2NrQXJyYXlSZXBvc2l0b3J5KCk7CgokbG9ja2VkUGFja2FnZXMgPSAkbG9ja0RhdGFbJ3BhY2thZ2VzJ107CmlmICgkd2l0aERldlJlcXMpIHsKaWYgKGlzc2V0KCRsb2NrRGF0YVsncGFja2FnZXMtZGV2J10pKSB7CiRsb2NrZWRQYWNrYWdlcyA9IGFycmF5X21lcmdlKCRsb2NrZWRQYWNrYWdlcywgJGxvY2tEYXRhWydwYWNrYWdlcy1kZXYnXSk7Cn0gZWxzZSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIGxvY2sgZmlsZSBkb2VzIG5vdCBjb250YWluIHJlcXVpcmUtZGV2IGluZm9ybWF0aW9uLCBydW4gaW5zdGFsbCB3aXRoIHRoZSAtLW5vLWRldiBvcHRpb24gb3IgZGVsZXRlIGl0IGFuZCBydW4gY29tcG9zZXIgdXBkYXRlIHRvIGdlbmVyYXRlIGEgbmV3IGxvY2sgZmlsZS4nKTsKfQp9CgppZiAoZW1wdHkoJGxvY2tlZFBhY2thZ2VzKSkgewpyZXR1cm4gJHBhY2thZ2VzOwp9CgppZiAoaXNzZXQoJGxvY2tlZFBhY2thZ2VzWzBdWyduYW1lJ10pKSB7CiRwYWNrYWdlQnlOYW1lID0gW107CmZvcmVhY2ggKCRsb2NrZWRQYWNrYWdlcyBhcyAkaW5mbykgewokcGFja2FnZSA9ICR0aGlzLT5sb2FkZXItPmxvYWQoJGluZm8pOwokcGFja2FnZXMtPmFkZFBhY2thZ2UoJHBhY2thZ2UpOwokcGFja2FnZUJ5TmFtZVskcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRwYWNrYWdlOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRwYWNrYWdlQnlOYW1lWyRwYWNrYWdlLT5nZXRBbGlhc09mKCktPmdldE5hbWUoKV0gPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9Cn0KCmlmIChpc3NldCgkbG9ja0RhdGFbJ2FsaWFzZXMnXSkpIHsKZm9yZWFjaCAoJGxvY2tEYXRhWydhbGlhc2VzJ10gYXMgJGFsaWFzKSB7CmlmIChpc3NldCgkcGFja2FnZUJ5TmFtZVskYWxpYXNbJ3BhY2thZ2UnXV0pKSB7CiRhbGlhc1BrZyA9IG5ldyBDb21wbGV0ZUFsaWFzUGFja2FnZSgkcGFja2FnZUJ5TmFtZVskYWxpYXNbJ3BhY2thZ2UnXV0sICRhbGlhc1snYWxpYXNfbm9ybWFsaXplZCddLCAkYWxpYXNbJ2FsaWFzJ10pOwokYWxpYXNQa2ctPnNldFJvb3RQYWNrYWdlQWxpYXModHJ1ZSk7CiRwYWNrYWdlcy0+YWRkUGFja2FnZSgkYWxpYXNQa2cpOwp9Cn0KfQoKcmV0dXJuICRwYWNrYWdlczsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3VyIGNvbXBvc2VyLmxvY2sgaXMgaW52YWxpZC4gUnVuICJjb21wb3NlciB1cGRhdGUiIHRvIGdlbmVyYXRlIGEgbmV3IG9uZS4nKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldlBhY2thZ2VOYW1lcygpOiBhcnJheQp7CiRuYW1lcyA9IFtdOwokbG9ja0RhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKaWYgKGlzc2V0KCRsb2NrRGF0YVsncGFja2FnZXMtZGV2J10pKSB7CmZvcmVhY2ggKCRsb2NrRGF0YVsncGFja2FnZXMtZGV2J10gYXMgJHBhY2thZ2UpIHsKJG5hbWVzW10gPSBzdHJ0b2xvd2VyKCRwYWNrYWdlWyduYW1lJ10pOwp9Cn0KCnJldHVybiAkbmFtZXM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybVJlcXVpcmVtZW50cyhib29sICR3aXRoRGV2UmVxcyA9IGZhbHNlKTogYXJyYXkKewokbG9ja0RhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKJHJlcXVpcmVtZW50cyA9IFtdOwoKaWYgKCFlbXB0eSgkbG9ja0RhdGFbJ3BsYXRmb3JtJ10pKSB7CiRyZXF1aXJlbWVudHMgPSAkdGhpcy0+bG9hZGVyLT5wYXJzZUxpbmtzKAonX19yb290X18nLAonMS4wLjAnLApMaW5rOjpUWVBFX1JFUVVJUkUsCiRsb2NrRGF0YVsncGxhdGZvcm0nXSA/PyBbXQopOwp9CgppZiAoJHdpdGhEZXZSZXFzICYmICFlbXB0eSgkbG9ja0RhdGFbJ3BsYXRmb3JtLWRldiddKSkgewokZGV2UmVxdWlyZW1lbnRzID0gJHRoaXMtPmxvYWRlci0+cGFyc2VMaW5rcygKJ19fcm9vdF9fJywKJzEuMC4wJywKTGluazo6VFlQRV9SRVFVSVJFLAokbG9ja0RhdGFbJ3BsYXRmb3JtLWRldiddID8/IFtdCik7CgokcmVxdWlyZW1lbnRzID0gYXJyYXlfbWVyZ2UoJHJlcXVpcmVtZW50cywgJGRldlJlcXVpcmVtZW50cyk7Cn0KCnJldHVybiAkcmVxdWlyZW1lbnRzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWluaW11bVN0YWJpbGl0eSgpOiBzdHJpbmcKewokbG9ja0RhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKCnJldHVybiAkbG9ja0RhdGFbJ21pbmltdW0tc3RhYmlsaXR5J10gPz8gJ3N0YWJsZSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFiaWxpdHlGbGFncygpOiBhcnJheQp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwoKcmV0dXJuICRsb2NrRGF0YVsnc3RhYmlsaXR5LWZsYWdzJ10gPz8gW107Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmVmZXJTdGFibGUoKTogP2Jvb2wKewokbG9ja0RhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKCgoKcmV0dXJuICRsb2NrRGF0YVsncHJlZmVyLXN0YWJsZSddID8/IG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmVmZXJMb3dlc3QoKTogP2Jvb2wKewokbG9ja0RhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKCgoKcmV0dXJuICRsb2NrRGF0YVsncHJlZmVyLWxvd2VzdCddID8/IG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybU92ZXJyaWRlcygpOiBhcnJheQp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwoKcmV0dXJuICRsb2NrRGF0YVsncGxhdGZvcm0tb3ZlcnJpZGVzJ10gPz8gW107Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsaWFzZXMoKTogYXJyYXkKewokbG9ja0RhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKCnJldHVybiAkbG9ja0RhdGFbJ2FsaWFzZXMnXSA/PyBbXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBsdWdpbkFwaSgpCnsKJGxvY2tEYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CgpyZXR1cm4gJGxvY2tEYXRhWydwbHVnaW4tYXBpLXZlcnNpb24nXSA/PyAnMS4xLjAnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9ja0RhdGEoKTogYXJyYXkKewppZiAobnVsbCAhPT0gJHRoaXMtPmxvY2tEYXRhQ2FjaGUpIHsKcmV0dXJuICR0aGlzLT5sb2NrRGF0YUNhY2hlOwp9CgppZiAoISR0aGlzLT5sb2NrRmlsZS0+ZXhpc3RzKCkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignTm8gbG9ja2ZpbGUgZm91bmQuIFVuYWJsZSB0byByZWFkIGxvY2tlZCBwYWNrYWdlcycpOwp9CgpyZXR1cm4gJHRoaXMtPmxvY2tEYXRhQ2FjaGUgPSAkdGhpcy0+bG9ja0ZpbGUtPnJlYWQoKTsKfQoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9ja0RhdGEoYXJyYXkgJHBhY2thZ2VzLCA/YXJyYXkgJGRldlBhY2thZ2VzLCBhcnJheSAkcGxhdGZvcm1SZXFzLCBhcnJheSAkcGxhdGZvcm1EZXZSZXFzLCBhcnJheSAkYWxpYXNlcywgc3RyaW5nICRtaW5pbXVtU3RhYmlsaXR5LCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGJvb2wgJHByZWZlclN0YWJsZSwgYm9vbCAkcHJlZmVyTG93ZXN0LCBhcnJheSAkcGxhdGZvcm1PdmVycmlkZXMsIGJvb2wgJHdyaXRlID0gdHJ1ZSk6IGJvb2wKewoKCiRhbGlhc2VzID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGFsaWFzKTogYXJyYXkgewppZiAoaW5fYXJyYXkoJGFsaWFzWyd2ZXJzaW9uJ10sIFsnZGV2LW1hc3RlcicsICdkZXYtdHJ1bmsnLCAnZGV2LWRlZmF1bHQnXSwgdHJ1ZSkpIHsKJGFsaWFzWyd2ZXJzaW9uJ10gPSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUzsKfQoKcmV0dXJuICRhbGlhczsKfSwgJGFsaWFzZXMpOwoKJGxvY2sgPSBbCidfcmVhZG1lJyA9PiBbJ1RoaXMgZmlsZSBsb2NrcyB0aGUgZGVwZW5kZW5jaWVzIG9mIHlvdXIgcHJvamVjdCB0byBhIGtub3duIHN0YXRlJywKJ1JlYWQgbW9yZSBhYm91dCBpdCBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDEtYmFzaWMtdXNhZ2UubWQjaW5zdGFsbGluZy1kZXBlbmRlbmNpZXMnLAonVGhpcyBmaWxlIGlzIEBnZW5lcicuJ2F0ZWQgYXV0b21hdGljYWxseScsIF0sCidjb250ZW50LWhhc2gnID0+ICR0aGlzLT5jb250ZW50SGFzaCwKJ3BhY2thZ2VzJyA9PiAkdGhpcy0+bG9ja1BhY2thZ2VzKCRwYWNrYWdlcyksCidwYWNrYWdlcy1kZXYnID0+IG51bGwsCidhbGlhc2VzJyA9PiAkYWxpYXNlcywKJ21pbmltdW0tc3RhYmlsaXR5JyA9PiAkbWluaW11bVN0YWJpbGl0eSwKJ3N0YWJpbGl0eS1mbGFncycgPT4gJHN0YWJpbGl0eUZsYWdzLAoncHJlZmVyLXN0YWJsZScgPT4gJHByZWZlclN0YWJsZSwKJ3ByZWZlci1sb3dlc3QnID0+ICRwcmVmZXJMb3dlc3QsCl07CgppZiAobnVsbCAhPT0gJGRldlBhY2thZ2VzKSB7CiRsb2NrWydwYWNrYWdlcy1kZXYnXSA9ICR0aGlzLT5sb2NrUGFja2FnZXMoJGRldlBhY2thZ2VzKTsKfQoKJGxvY2tbJ3BsYXRmb3JtJ10gPSAkcGxhdGZvcm1SZXFzOwokbG9ja1sncGxhdGZvcm0tZGV2J10gPSAkcGxhdGZvcm1EZXZSZXFzOwppZiAoXGNvdW50KCRwbGF0Zm9ybU92ZXJyaWRlcykgPiAwKSB7CiRsb2NrWydwbGF0Zm9ybS1vdmVycmlkZXMnXSA9ICRwbGF0Zm9ybU92ZXJyaWRlczsKfQokbG9ja1sncGx1Z2luLWFwaS12ZXJzaW9uJ10gPSBQbHVnaW5JbnRlcmZhY2U6OlBMVUdJTl9BUElfVkVSU0lPTjsKCiRsb2NrID0gJHRoaXMtPmZpeHVwSnNvbkRhdGFUeXBlKCRsb2NrKTsKCnRyeSB7CiRpc0xvY2tlZCA9ICR0aGlzLT5pc0xvY2tlZCgpOwp9IGNhdGNoIChQYXJzaW5nRXhjZXB0aW9uICRlKSB7CiRpc0xvY2tlZCA9IGZhbHNlOwp9CmlmICghJGlzTG9ja2VkIHx8ICRsb2NrICE9PSAkdGhpcy0+Z2V0TG9ja0RhdGEoKSkgewppZiAoJHdyaXRlKSB7CiR0aGlzLT5sb2NrRmlsZS0+d3JpdGUoJGxvY2spOwokdGhpcy0+bG9ja0RhdGFDYWNoZSA9IG51bGw7CiR0aGlzLT52aXJ0dWFsRmlsZVdyaXR0ZW4gPSBmYWxzZTsKfSBlbHNlIHsKJHRoaXMtPnZpcnR1YWxGaWxlV3JpdHRlbiA9IHRydWU7CiR0aGlzLT5sb2NrRGF0YUNhY2hlID0gSnNvbkZpbGU6OnBhcnNlSnNvbihKc29uRmlsZTo6ZW5jb2RlKCRsb2NrKSk7Cn0KCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVwZGF0ZUhhc2goSnNvbkZpbGUgJGNvbXBvc2VySnNvbiwgP2NhbGxhYmxlICRkYXRhUHJvY2Vzc29yID0gbnVsbCk6IHZvaWQKewokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkY29tcG9zZXJKc29uLT5nZXRQYXRoKCkpOwppZiAoZmFsc2UgPT09ICRjb250ZW50cykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VuYWJsZSB0byByZWFkICcuJGNvbXBvc2VySnNvbi0+Z2V0UGF0aCgpLicgY29udGVudHMgdG8gdXBkYXRlIHRoZSBsb2NrIGZpbGUgaGFzaC4nKTsKfQoKJGxvY2tNdGltZSA9IGZpbGVtdGltZSgkdGhpcy0+bG9ja0ZpbGUtPmdldFBhdGgoKSk7CiRsb2NrRGF0YSA9ICR0aGlzLT5sb2NrRmlsZS0+cmVhZCgpOwokbG9ja0RhdGFbJ2NvbnRlbnQtaGFzaCddID0gTG9ja2VyOjpnZXRDb250ZW50SGFzaCgkY29udGVudHMpOwppZiAoJGRhdGFQcm9jZXNzb3IgIT09IG51bGwpIHsKJGxvY2tEYXRhID0gJGRhdGFQcm9jZXNzb3IoJGxvY2tEYXRhKTsKfQoKJHRoaXMtPmxvY2tGaWxlLT53cml0ZSgkdGhpcy0+Zml4dXBKc29uRGF0YVR5cGUoJGxvY2tEYXRhKSk7CiR0aGlzLT5sb2NrRGF0YUNhY2hlID0gbnVsbDsKJHRoaXMtPnZpcnR1YWxGaWxlV3JpdHRlbiA9IGZhbHNlOwppZiAoaXNfaW50KCRsb2NrTXRpbWUpKSB7CkB0b3VjaCgkdGhpcy0+bG9ja0ZpbGUtPmdldFBhdGgoKSwgJGxvY2tNdGltZSk7Cn0KfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaXh1cEpzb25EYXRhVHlwZShhcnJheSAkbG9ja0RhdGEpOiBhcnJheQp7CmZvcmVhY2ggKFsnc3RhYmlsaXR5LWZsYWdzJywgJ3BsYXRmb3JtJywgJ3BsYXRmb3JtLWRldiddIGFzICRrZXkpIHsKaWYgKGlzc2V0KCRsb2NrRGF0YVska2V5XSkgJiYgaXNfYXJyYXkoJGxvY2tEYXRhWyRrZXldKSAmJiBcY291bnQoJGxvY2tEYXRhWyRrZXldKSA9PT0gMCkgewokbG9ja0RhdGFbJGtleV0gPSBuZXcgXHN0ZENsYXNzKCk7Cn0KfQoKaWYgKGlzX2FycmF5KCRsb2NrRGF0YVsnc3RhYmlsaXR5LWZsYWdzJ10pKSB7Cmtzb3J0KCRsb2NrRGF0YVsnc3RhYmlsaXR5LWZsYWdzJ10pOwp9CgpyZXR1cm4gJGxvY2tEYXRhOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2NrUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzKTogYXJyYXkKewokbG9ja2VkID0gW107Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CgokbmFtZSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7CiR2ZXJzaW9uID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKCmlmICghJG5hbWUgfHwgISR2ZXJzaW9uKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZigKJ1BhY2thZ2UgIiVzIiBoYXMgbm8gdmVyc2lvbiBvciBuYW1lIGFuZCBjYW4gbm90IGJlIGxvY2tlZCcsCiRwYWNrYWdlCikpOwp9Cgokc3BlYyA9ICR0aGlzLT5kdW1wZXItPmR1bXAoJHBhY2thZ2UpOwp1bnNldCgkc3BlY1sndmVyc2lvbl9ub3JtYWxpemVkJ10pOwoKCiR0aW1lID0gJHNwZWNbJ3RpbWUnXSA/PyBudWxsOwp1bnNldCgkc3BlY1sndGltZSddKTsKaWYgKCRwYWNrYWdlLT5pc0RldigpICYmICRwYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSA9PT0gJ3NvdXJjZScpIHsKCiR0aW1lID0gJHRoaXMtPmdldFBhY2thZ2VUaW1lKCRwYWNrYWdlKSA/OiAkdGltZTsKfQppZiAobnVsbCAhPT0gJHRpbWUpIHsKJHNwZWNbJ3RpbWUnXSA9ICR0aW1lOwp9Cgp1bnNldCgkc3BlY1snaW5zdGFsbGF0aW9uLXNvdXJjZSddKTsKCiRsb2NrZWRbXSA9ICRzcGVjOwp9Cgp1c29ydCgkbG9ja2VkLCBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYikgewokY29tcGFyaXNvbiA9IHN0cmNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsKCmlmICgwICE9PSAkY29tcGFyaXNvbikgewpyZXR1cm4gJGNvbXBhcmlzb247Cn0KCgpyZXR1cm4gc3RyY21wKCRhWyd2ZXJzaW9uJ10sICRiWyd2ZXJzaW9uJ10pOwp9KTsKCnJldHVybiAkbG9ja2VkOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFBhY2thZ2VUaW1lKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiA/c3RyaW5nCnsKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKSB7CnJldHVybiBudWxsOwp9CgokcGF0aCA9ICR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CmlmICgkcGF0aCA9PT0gbnVsbCkgewpyZXR1cm4gbnVsbDsKfQokcGF0aCA9IHJlYWxwYXRoKCRwYXRoKTsKJHNvdXJjZVR5cGUgPSAkcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpOwokZGF0ZXRpbWUgPSBudWxsOwoKaWYgKCRwYXRoICYmIGluX2FycmF5KCRzb3VyY2VUeXBlLCBbJ2dpdCcsICdoZyddKSkgewokc291cmNlUmVmID0gJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpID86ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCk7CnN3aXRjaCAoJHNvdXJjZVR5cGUpIHsKY2FzZSAnZ2l0JzoKR2l0VXRpbDo6Y2xlYW5FbnYoKTsKCiRjb21tYW5kID0gYXJyYXlfbWVyZ2UoWydnaXQnLCAnbG9nJywgJy1uMScsICctLXByZXR0eT0lY3QnLCAoc3RyaW5nKSAkc291cmNlUmVmXSwgR2l0VXRpbDo6Z2V0Tm9TaG93U2lnbmF0dXJlRmxhZ3MoJHRoaXMtPnByb2Nlc3MpKTsKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCAkcGF0aCkgJiYgUHJlZzo6aXNNYXRjaCgne15ccypcZCtccyokfScsICRvdXRwdXQpKSB7CiRkYXRldGltZSA9IG5ldyBcRGF0ZVRpbWUoJ0AnLnRyaW0oJG91dHB1dCksIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0KYnJlYWs7CgpjYXNlICdoZyc6CmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ2xvZycsICctLXRlbXBsYXRlJywgJ3tkYXRlfGhnZGF0ZX0nLCAnLXInLCAoc3RyaW5nKSAkc291cmNlUmVmXSwgJG91dHB1dCwgJHBhdGgpICYmIFByZWc6OmlzTWF0Y2goJ3teXHMqKFxkKylccyp9JywgJG91dHB1dCwgJG1hdGNoKSkgewokZGF0ZXRpbWUgPSBuZXcgXERhdGVUaW1lKCdAJy4kbWF0Y2hbMV0sIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0KYnJlYWs7Cn0KfQoKcmV0dXJuICRkYXRldGltZSA/ICRkYXRldGltZS0+Zm9ybWF0KERBVEVfUkZDMzMzOSkgOiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWlzc2luZ1JlcXVpcmVtZW50SW5mbyhSb290UGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYm9vbCAkaW5jbHVkZURldik6IGFycmF5CnsKJG1pc3NpbmdSZXF1aXJlbWVudEluZm8gPSBbXTsKJG1pc3NpbmdSZXF1aXJlbWVudHMgPSBmYWxzZTsKJHNldHMgPSBbWydyZXBvJyA9PiAkdGhpcy0+Z2V0TG9ja2VkUmVwb3NpdG9yeShmYWxzZSksICdtZXRob2QnID0+ICdnZXRSZXF1aXJlcycsICdkZXNjcmlwdGlvbicgPT4gJ1JlcXVpcmVkJ11dOwppZiAoJGluY2x1ZGVEZXYgPT09IHRydWUpIHsKJHNldHNbXSA9IFsncmVwbycgPT4gJHRoaXMtPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSksICdtZXRob2QnID0+ICdnZXREZXZSZXF1aXJlcycsICdkZXNjcmlwdGlvbicgPT4gJ1JlcXVpcmVkIChpbiByZXF1aXJlLWRldiknXTsKfQokcm9vdFJlcG8gPSBuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KGNsb25lICRwYWNrYWdlKTsKCmZvcmVhY2ggKCRzZXRzIGFzICRzZXQpIHsKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJHNldFsncmVwbyddLCAkcm9vdFJlcG9dKTsKCmZvcmVhY2ggKGNhbGxfdXNlcl9mdW5jKFskcGFja2FnZSwgJHNldFsnbWV0aG9kJ11dKSBhcyAkbGluaykgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CmNvbnRpbnVlOwp9CmlmICgkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpID09PSAnc2VsZi52ZXJzaW9uJykgewpjb250aW51ZTsKfQppZiAoJGluc3RhbGxlZFJlcG8tPmZpbmRQYWNrYWdlc1dpdGhSZXBsYWNlcnNBbmRQcm92aWRlcnMoJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0Q29uc3RyYWludCgpKSA9PT0gW10pIHsKJHJlc3VsdHMgPSAkaW5zdGFsbGVkUmVwby0+ZmluZFBhY2thZ2VzV2l0aFJlcGxhY2Vyc0FuZFByb3ZpZGVycygkbGluay0+Z2V0VGFyZ2V0KCkpOwoKaWYgKCRyZXN1bHRzICE9PSBbXSkgewokcHJvdmlkZXIgPSByZXNldCgkcmVzdWx0cyk7CiRkZXNjcmlwdGlvbiA9ICRwcm92aWRlci0+Z2V0UHJldHR5VmVyc2lvbigpOwppZiAoJHByb3ZpZGVyLT5nZXROYW1lKCkgIT09ICRsaW5rLT5nZXRUYXJnZXQoKSkgewpmb3JlYWNoIChbJ2dldFJlcGxhY2VzJyA9PiAncmVwbGFjZWQgYXMgJXMgYnkgJXMnLCAnZ2V0UHJvdmlkZXMnID0+ICdwcm92aWRlZCBhcyAlcyBieSAlcyddIGFzICRtZXRob2QgPT4gJHRleHQpIHsKZm9yZWFjaCAoY2FsbF91c2VyX2Z1bmMoWyRwcm92aWRlciwgJG1ldGhvZF0pIGFzICRwcm92aWRlckxpbmspIHsKaWYgKCRwcm92aWRlckxpbmstPmdldFRhcmdldCgpID09PSAkbGluay0+Z2V0VGFyZ2V0KCkpIHsKJGRlc2NyaXB0aW9uID0gc3ByaW50ZigkdGV4dCwgJHByb3ZpZGVyTGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLCAkcHJvdmlkZXItPmdldFByZXR0eU5hbWUoKS4nICcuJHByb3ZpZGVyLT5nZXRQcmV0dHlWZXJzaW9uKCkpOwpicmVhayAyOwp9Cn0KfQp9CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnLSAnIC4gJHNldFsnZGVzY3JpcHRpb24nXS4nIHBhY2thZ2UgIicgLiAkbGluay0+Z2V0VGFyZ2V0KCkgLiAnIiBpcyBpbiB0aGUgbG9jayBmaWxlIGFzICInLiRkZXNjcmlwdGlvbi4nIiBidXQgdGhhdCBkb2VzIG5vdCBzYXRpc2Z5IHlvdXIgY29uc3RyYWludCAiJy4kbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLiciLic7Cn0gZWxzZSB7CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnLSAnIC4gJHNldFsnZGVzY3JpcHRpb24nXS4nIHBhY2thZ2UgIicgLiAkbGluay0+Z2V0VGFyZ2V0KCkgLiAnIiBpcyBub3QgcHJlc2VudCBpbiB0aGUgbG9jayBmaWxlLic7Cn0KJG1pc3NpbmdSZXF1aXJlbWVudHMgPSB0cnVlOwp9Cn0KfQoKaWYgKCRtaXNzaW5nUmVxdWlyZW1lbnRzKSB7CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnVGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBjb21wb3NlciBmaWxlcyBhcmUgaW5jb3JyZWN0bHkgbWVyZ2VkIG9yIHRoZSBjb21wb3Nlci5qc29uIGZpbGUgaXMgbWFudWFsbHkgZWRpdGVkLic7CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnUmVhZCBtb3JlIGFib3V0IGNvcnJlY3RseSByZXNvbHZpbmcgbWVyZ2UgY29uZmxpY3RzIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy9yZXNvbHZpbmctbWVyZ2UtY29uZmxpY3RzLm1kJzsKJG1pc3NpbmdSZXF1aXJlbWVudEluZm9bXSA9ICdhbmQgcHJlZmVyIHVzaW5nIHRoZSAicmVxdWlyZSIgY29tbWFuZCBvdmVyIGVkaXRpbmcgdGhlIGNvbXBvc2VyLmpzb24gZmlsZSBkaXJlY3RseSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3JlcXVpcmUtcic7Cn0KCnJldHVybiAkbWlzc2luZ1JlcXVpcmVtZW50SW5mbzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxDb21wb3Nlck1pcnJvcjsKCgoKCgoKCgoKCmNsYXNzIFBhY2thZ2UgZXh0ZW5kcyBCYXNlUGFja2FnZQp7Cgpwcm90ZWN0ZWQgJHR5cGU7Cgpwcm90ZWN0ZWQgJHRhcmdldERpcjsKCnByb3RlY3RlZCAkaW5zdGFsbGF0aW9uU291cmNlOwoKcHJvdGVjdGVkICRzb3VyY2VUeXBlOwoKcHJvdGVjdGVkICRzb3VyY2VVcmw7Cgpwcm90ZWN0ZWQgJHNvdXJjZVJlZmVyZW5jZTsKCnByb3RlY3RlZCAkc291cmNlTWlycm9yczsKCnByb3RlY3RlZCAkZGlzdFR5cGU7Cgpwcm90ZWN0ZWQgJGRpc3RVcmw7Cgpwcm90ZWN0ZWQgJGRpc3RSZWZlcmVuY2U7Cgpwcm90ZWN0ZWQgJGRpc3RTaGExQ2hlY2tzdW07Cgpwcm90ZWN0ZWQgJGRpc3RNaXJyb3JzOwoKcHJvdGVjdGVkICR2ZXJzaW9uOwoKcHJvdGVjdGVkICRwcmV0dHlWZXJzaW9uOwoKcHJvdGVjdGVkICRyZWxlYXNlRGF0ZTsKCnByb3RlY3RlZCAkZXh0cmEgPSBbXTsKCnByb3RlY3RlZCAkYmluYXJpZXMgPSBbXTsKCnByb3RlY3RlZCAkZGV2OwoKCgoKcHJvdGVjdGVkICRzdGFiaWxpdHk7Cgpwcm90ZWN0ZWQgJG5vdGlmaWNhdGlvblVybDsKCgpwcm90ZWN0ZWQgJHJlcXVpcmVzID0gW107Cgpwcm90ZWN0ZWQgJGNvbmZsaWN0cyA9IFtdOwoKcHJvdGVjdGVkICRwcm92aWRlcyA9IFtdOwoKcHJvdGVjdGVkICRyZXBsYWNlcyA9IFtdOwoKcHJvdGVjdGVkICRkZXZSZXF1aXJlcyA9IFtdOwoKcHJvdGVjdGVkICRzdWdnZXN0cyA9IFtdOwoKCgoKcHJvdGVjdGVkICRhdXRvbG9hZCA9IFtdOwoKCgoKcHJvdGVjdGVkICRkZXZBdXRvbG9hZCA9IFtdOwoKcHJvdGVjdGVkICRpbmNsdWRlUGF0aHMgPSBbXTsKCnByb3RlY3RlZCAkaXNEZWZhdWx0QnJhbmNoID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJHRyYW5zcG9ydE9wdGlvbnMgPSBbXTsKCgoKCnByb3RlY3RlZCAkcGhwRXh0ID0gbnVsbDsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkcHJldHR5VmVyc2lvbikKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lKTsKCiR0aGlzLT52ZXJzaW9uID0gJHZlcnNpb247CiR0aGlzLT5wcmV0dHlWZXJzaW9uID0gJHByZXR0eVZlcnNpb247CgokdGhpcy0+c3RhYmlsaXR5ID0gVmVyc2lvblBhcnNlcjo6cGFyc2VTdGFiaWxpdHkoJHZlcnNpb24pOwokdGhpcy0+ZGV2ID0gJHRoaXMtPnN0YWJpbGl0eSA9PT0gJ2Rldic7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RldigpOiBib29sCnsKcmV0dXJuICR0aGlzLT5kZXY7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRUeXBlKHN0cmluZyAkdHlwZSk6IHZvaWQKewokdGhpcy0+dHlwZSA9ICR0eXBlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnR5cGUgPzogJ2xpYnJhcnknOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+c3RhYmlsaXR5Owp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0VGFyZ2V0RGlyKD9zdHJpbmcgJHRhcmdldERpcik6IHZvaWQKewokdGhpcy0+dGFyZ2V0RGlyID0gJHRhcmdldERpcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhcmdldERpcigpOiA/c3RyaW5nCnsKaWYgKG51bGwgPT09ICR0aGlzLT50YXJnZXREaXIpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBsdHJpbShQcmVnOjpyZXBsYWNlKCd7ICg/Ol58W1xcXFwvXSspIFwuXC4/ICg/OltcXFxcL10rfCQpICg/OlwuXC4/ICg/OltcXFxcL10rfCQpICkqfXgnLCAnLycsICR0aGlzLT50YXJnZXREaXIpLCAnLycpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RXh0cmEoYXJyYXkgJGV4dHJhKTogdm9pZAp7CiR0aGlzLT5leHRyYSA9ICRleHRyYTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEV4dHJhKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5leHRyYTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJpbmFyaWVzKGFycmF5ICRiaW5hcmllcyk6IHZvaWQKewokdGhpcy0+YmluYXJpZXMgPSAkYmluYXJpZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCaW5hcmllcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YmluYXJpZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnN0YWxsYXRpb25Tb3VyY2UoP3N0cmluZyAkdHlwZSk6IHZvaWQKewokdGhpcy0+aW5zdGFsbGF0aW9uU291cmNlID0gJHR5cGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsYXRpb25Tb3VyY2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+aW5zdGFsbGF0aW9uU291cmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlVHlwZSg/c3RyaW5nICR0eXBlKTogdm9pZAp7CiR0aGlzLT5zb3VyY2VUeXBlID0gJHR5cGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPnNvdXJjZVR5cGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VVcmwoP3N0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5zb3VyY2VVcmwgPSAkdXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlVXJsKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPnNvdXJjZVVybDsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZVJlZmVyZW5jZSg/c3RyaW5nICRyZWZlcmVuY2UpOiB2b2lkCnsKJHRoaXMtPnNvdXJjZVJlZmVyZW5jZSA9ICRyZWZlcmVuY2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VSZWZlcmVuY2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+c291cmNlUmVmZXJlbmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlTWlycm9ycyg/YXJyYXkgJG1pcnJvcnMpOiB2b2lkCnsKJHRoaXMtPnNvdXJjZU1pcnJvcnMgPSAkbWlycm9yczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZU1pcnJvcnMoKTogP2FycmF5CnsKcmV0dXJuICR0aGlzLT5zb3VyY2VNaXJyb3JzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlVXJscygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Z2V0VXJscygkdGhpcy0+c291cmNlVXJsLCAkdGhpcy0+c291cmNlTWlycm9ycywgJHRoaXMtPnNvdXJjZVJlZmVyZW5jZSwgJHRoaXMtPnNvdXJjZVR5cGUsICdzb3VyY2UnKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RUeXBlKD9zdHJpbmcgJHR5cGUpOiB2b2lkCnsKJHRoaXMtPmRpc3RUeXBlID0gJHR5cGUgPT09ICcnID8gbnVsbCA6ICR0eXBlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFR5cGUoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+ZGlzdFR5cGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0VXJsKD9zdHJpbmcgJHVybCk6IHZvaWQKewokdGhpcy0+ZGlzdFVybCA9ICR1cmwgPT09ICcnID8gbnVsbCA6ICR1cmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VXJsKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmRpc3RVcmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0UmVmZXJlbmNlKD9zdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQKewokdGhpcy0+ZGlzdFJlZmVyZW5jZSA9ICRyZWZlcmVuY2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0UmVmZXJlbmNlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmRpc3RSZWZlcmVuY2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0U2hhMUNoZWNrc3VtKD9zdHJpbmcgJHNoYTFjaGVja3N1bSk6IHZvaWQKewokdGhpcy0+ZGlzdFNoYTFDaGVja3N1bSA9ICRzaGExY2hlY2tzdW07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0U2hhMUNoZWNrc3VtKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmRpc3RTaGExQ2hlY2tzdW07Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0TWlycm9ycyg/YXJyYXkgJG1pcnJvcnMpOiB2b2lkCnsKJHRoaXMtPmRpc3RNaXJyb3JzID0gJG1pcnJvcnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0TWlycm9ycygpOiA/YXJyYXkKewpyZXR1cm4gJHRoaXMtPmRpc3RNaXJyb3JzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFVybHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmdldFVybHMoJHRoaXMtPmRpc3RVcmwsICR0aGlzLT5kaXN0TWlycm9ycywgJHRoaXMtPmRpc3RSZWZlcmVuY2UsICR0aGlzLT5kaXN0VHlwZSwgJ2Rpc3QnKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydE9wdGlvbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnRyYW5zcG9ydE9wdGlvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUcmFuc3BvcnRPcHRpb25zKGFycmF5ICRvcHRpb25zKTogdm9pZAp7CiR0aGlzLT50cmFuc3BvcnRPcHRpb25zID0gJG9wdGlvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dmVyc2lvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVZlcnNpb24oKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wcmV0dHlWZXJzaW9uOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVsZWFzZURhdGUoP1xEYXRlVGltZUludGVyZmFjZSAkcmVsZWFzZURhdGUpOiB2b2lkCnsKJHRoaXMtPnJlbGVhc2VEYXRlID0gJHJlbGVhc2VEYXRlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVsZWFzZURhdGUoKTogP1xEYXRlVGltZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+cmVsZWFzZURhdGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcXVpcmVzKGFycmF5ICRyZXF1aXJlcyk6IHZvaWQKewppZiAoaXNzZXQoJHJlcXVpcmVzWzBdKSkgeyAKJHJlcXVpcmVzID0gJHRoaXMtPmNvbnZlcnRMaW5rc1RvTWFwKCRyZXF1aXJlcywgJ3NldFJlcXVpcmVzJyk7Cn0KCiR0aGlzLT5yZXF1aXJlcyA9ICRyZXF1aXJlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcXVpcmVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXF1aXJlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmxpY3RzKGFycmF5ICRjb25mbGljdHMpOiB2b2lkCnsKaWYgKGlzc2V0KCRjb25mbGljdHNbMF0pKSB7IAokY29uZmxpY3RzID0gJHRoaXMtPmNvbnZlcnRMaW5rc1RvTWFwKCRjb25mbGljdHMsICdzZXRDb25mbGljdHMnKTsKfQoKJHRoaXMtPmNvbmZsaWN0cyA9ICRjb25mbGljdHM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmxpY3RzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5jb25mbGljdHM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByb3ZpZGVzKGFycmF5ICRwcm92aWRlcyk6IHZvaWQKewppZiAoaXNzZXQoJHByb3ZpZGVzWzBdKSkgeyAKJHByb3ZpZGVzID0gJHRoaXMtPmNvbnZlcnRMaW5rc1RvTWFwKCRwcm92aWRlcywgJ3NldFByb3ZpZGVzJyk7Cn0KCiR0aGlzLT5wcm92aWRlcyA9ICRwcm92aWRlczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cHJvdmlkZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcGxhY2VzKGFycmF5ICRyZXBsYWNlcyk6IHZvaWQKewppZiAoaXNzZXQoJHJlcGxhY2VzWzBdKSkgeyAKJHJlcGxhY2VzID0gJHRoaXMtPmNvbnZlcnRMaW5rc1RvTWFwKCRyZXBsYWNlcywgJ3NldFJlcGxhY2VzJyk7Cn0KCiR0aGlzLT5yZXBsYWNlcyA9ICRyZXBsYWNlczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBsYWNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVwbGFjZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldlJlcXVpcmVzKGFycmF5ICRkZXZSZXF1aXJlcyk6IHZvaWQKewppZiAoaXNzZXQoJGRldlJlcXVpcmVzWzBdKSkgeyAKJGRldlJlcXVpcmVzID0gJHRoaXMtPmNvbnZlcnRMaW5rc1RvTWFwKCRkZXZSZXF1aXJlcywgJ3NldERldlJlcXVpcmVzJyk7Cn0KCiR0aGlzLT5kZXZSZXF1aXJlcyA9ICRkZXZSZXF1aXJlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldlJlcXVpcmVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5kZXZSZXF1aXJlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VnZ2VzdHMoYXJyYXkgJHN1Z2dlc3RzKTogdm9pZAp7CiR0aGlzLT5zdWdnZXN0cyA9ICRzdWdnZXN0czsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN1Z2dlc3RzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5zdWdnZXN0czsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRvbG9hZChhcnJheSAkYXV0b2xvYWQpOiB2b2lkCnsKJHRoaXMtPmF1dG9sb2FkID0gJGF1dG9sb2FkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0b2xvYWQoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmF1dG9sb2FkOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldkF1dG9sb2FkKGFycmF5ICRkZXZBdXRvbG9hZCk6IHZvaWQKewokdGhpcy0+ZGV2QXV0b2xvYWQgPSAkZGV2QXV0b2xvYWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZBdXRvbG9hZCgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZGV2QXV0b2xvYWQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEluY2x1ZGVQYXRocyhhcnJheSAkaW5jbHVkZVBhdGhzKTogdm9pZAp7CiR0aGlzLT5pbmNsdWRlUGF0aHMgPSAkaW5jbHVkZVBhdGhzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5jbHVkZVBhdGhzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5pbmNsdWRlUGF0aHM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UGhwRXh0KD9hcnJheSAkcGhwRXh0KTogdm9pZAp7CiR0aGlzLT5waHBFeHQgPSAkcGhwRXh0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGhwRXh0KCk6ID9hcnJheQp7CnJldHVybiAkdGhpcy0+cGhwRXh0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Tm90aWZpY2F0aW9uVXJsKHN0cmluZyAkbm90aWZpY2F0aW9uVXJsKTogdm9pZAp7CiR0aGlzLT5ub3RpZmljYXRpb25VcmwgPSAkbm90aWZpY2F0aW9uVXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Tm90aWZpY2F0aW9uVXJsKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPm5vdGlmaWNhdGlvblVybDsKfQoKcHVibGljIGZ1bmN0aW9uIHNldElzRGVmYXVsdEJyYW5jaChib29sICRkZWZhdWx0QnJhbmNoKTogdm9pZAp7CiR0aGlzLT5pc0RlZmF1bHRCcmFuY2ggPSAkZGVmYXVsdEJyYW5jaDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVmYXVsdEJyYW5jaCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5pc0RlZmF1bHRCcmFuY2g7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VEaXN0UmVmZXJlbmNlcyhzdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQKewokdGhpcy0+c2V0U291cmNlUmVmZXJlbmNlKCRyZWZlcmVuY2UpOwoKCgppZiAoCiR0aGlzLT5nZXREaXN0VXJsKCkgIT09IG51bGwKJiYgUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly8oPzooPzp3d3dcLik/Yml0YnVja2V0XC5vcmd8KGFwaVwuKT9naXRodWJcLmNvbXwoPzp3d3dcLik/Z2l0bGFiXC5jb20pL31pJywgJHRoaXMtPmdldERpc3RVcmwoKSkKKSB7CiR0aGlzLT5zZXREaXN0UmVmZXJlbmNlKCRyZWZlcmVuY2UpOwokdGhpcy0+c2V0RGlzdFVybChQcmVnOjpyZXBsYWNlKCd7KD88PS98c2hhPSlbYS1mMC05XXs0MH0oPz0vfCQpfWknLCAkcmVmZXJlbmNlLCAkdGhpcy0+Z2V0RGlzdFVybCgpKSk7Cn0gZWxzZWlmICgkdGhpcy0+Z2V0RGlzdFJlZmVyZW5jZSgpKSB7IAokdGhpcy0+c2V0RGlzdFJlZmVyZW5jZSgkcmVmZXJlbmNlKTsKfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlcGxhY2VWZXJzaW9uKHN0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRwcmV0dHlWZXJzaW9uKTogdm9pZAp7CiR0aGlzLT52ZXJzaW9uID0gJHZlcnNpb247CiR0aGlzLT5wcmV0dHlWZXJzaW9uID0gJHByZXR0eVZlcnNpb247CgokdGhpcy0+c3RhYmlsaXR5ID0gVmVyc2lvblBhcnNlcjo6cGFyc2VTdGFiaWxpdHkoJHZlcnNpb24pOwokdGhpcy0+ZGV2ID0gJHRoaXMtPnN0YWJpbGl0eSA9PT0gJ2Rldic7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0VXJscyg/c3RyaW5nICR1cmwsID9hcnJheSAkbWlycm9ycywgP3N0cmluZyAkcmVmLCA/c3RyaW5nICR0eXBlLCBzdHJpbmcgJHVybFR5cGUpOiBhcnJheQp7CmlmICghJHVybCkgewpyZXR1cm4gW107Cn0KCmlmICgkdXJsVHlwZSA9PT0gJ2Rpc3QnICYmIGZhbHNlICE9PSBzdHJwb3MoJHVybCwgJyUnKSkgewokdXJsID0gQ29tcG9zZXJNaXJyb3I6OnByb2Nlc3NVcmwoJHVybCwgJHRoaXMtPm5hbWUsICR0aGlzLT52ZXJzaW9uLCAkcmVmLCAkdHlwZSwgJHRoaXMtPnByZXR0eVZlcnNpb24pOwp9CgokdXJscyA9IFskdXJsXTsKaWYgKCRtaXJyb3JzKSB7CmZvcmVhY2ggKCRtaXJyb3JzIGFzICRtaXJyb3IpIHsKaWYgKCR1cmxUeXBlID09PSAnZGlzdCcpIHsKJG1pcnJvclVybCA9IENvbXBvc2VyTWlycm9yOjpwcm9jZXNzVXJsKCRtaXJyb3JbJ3VybCddLCAkdGhpcy0+bmFtZSwgJHRoaXMtPnZlcnNpb24sICRyZWYsICR0eXBlLCAkdGhpcy0+cHJldHR5VmVyc2lvbik7Cn0gZWxzZWlmICgkdXJsVHlwZSA9PT0gJ3NvdXJjZScgJiYgJHR5cGUgPT09ICdnaXQnKSB7CiRtaXJyb3JVcmwgPSBDb21wb3Nlck1pcnJvcjo6cHJvY2Vzc0dpdFVybCgkbWlycm9yWyd1cmwnXSwgJHRoaXMtPm5hbWUsICR1cmwsICR0eXBlKTsKfSBlbHNlaWYgKCR1cmxUeXBlID09PSAnc291cmNlJyAmJiAkdHlwZSA9PT0gJ2hnJykgewokbWlycm9yVXJsID0gQ29tcG9zZXJNaXJyb3I6OnByb2Nlc3NIZ1VybCgkbWlycm9yWyd1cmwnXSwgJHRoaXMtPm5hbWUsICR1cmwsICR0eXBlKTsKfSBlbHNlIHsKY29udGludWU7Cn0KaWYgKCFcaW5fYXJyYXkoJG1pcnJvclVybCwgJHVybHMpKSB7CiRmdW5jID0gJG1pcnJvclsncHJlZmVycmVkJ10gPyAnYXJyYXlfdW5zaGlmdCcgOiAnYXJyYXlfcHVzaCc7CiRmdW5jKCR1cmxzLCAkbWlycm9yVXJsKTsKfQp9Cn0KCnJldHVybiAkdXJsczsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY29udmVydExpbmtzVG9NYXAoYXJyYXkgJGxpbmtzLCBzdHJpbmcgJHNvdXJjZSk6IGFycmF5CnsKdHJpZ2dlcl9lcnJvcignUGFja2FnZTo6Jy4kc291cmNlLicgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIG1hcCBvZiBsb3dlcmNhc2VkIHBhY2thZ2UgbmFtZSA9PiBMaW5rIG9iamVjdCwgZ290IGEgaW5kZXhlZCBhcnJheSwgdGhpcyBpcyBkZXByZWNhdGVkIGFuZCB5b3Ugc2hvdWxkIGZpeCB5b3VyIHVzYWdlLicpOwokbmV3TGlua3MgPSBbXTsKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CiRuZXdMaW5rc1skbGluay0+Z2V0VGFyZ2V0KCldID0gJGxpbms7Cn0KCnJldHVybiAkbmV3TGlua3M7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCmludGVyZmFjZSBQYWNrYWdlSW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IERJU1BMQVlfU09VUkNFX1JFRl9JRl9ERVYgPSAwOwpwdWJsaWMgY29uc3QgRElTUExBWV9TT1VSQ0VfUkVGID0gMTsKcHVibGljIGNvbnN0IERJU1BMQVlfRElTVF9SRUYgPSAyOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlOYW1lKCk6IHN0cmluZzsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXMoYm9vbCAkcHJvdmlkZXMgPSB0cnVlKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SWQoaW50ICRpZCk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJZCgpOiBpbnQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZXYoKTogYm9vbDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKTogc3RyaW5nOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFyZ2V0RGlyKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFeHRyYSgpOiBhcnJheTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnN0YWxsYXRpb25Tb3VyY2UoP3N0cmluZyAkdHlwZSk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGF0aW9uU291cmNlKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VVcmwoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybHMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VSZWZlcmVuY2UoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZU1pcnJvcnMoKTogP2FycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZU1pcnJvcnMoP2FycmF5ICRtaXJyb3JzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RUeXBlKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VXJsKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VXJscygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RSZWZlcmVuY2UoKTogP3N0cmluZzsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFNoYTFDaGVja3N1bSgpOiA/c3RyaW5nOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdE1pcnJvcnMoKTogP2FycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RNaXJyb3JzKD9hcnJheSAkbWlycm9ycyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVZlcnNpb24oKTogc3RyaW5nOwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RnVsbFByZXR0eVZlcnNpb24oYm9vbCAkdHJ1bmNhdGUgPSB0cnVlLCBpbnQgJGRpc3BsYXlNb2RlID0gc2VsZjo6RElTUExBWV9TT1VSQ0VfUkVGX0lGX0RFVik6IHN0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlbGVhc2VEYXRlKCk6ID9cRGF0ZVRpbWVJbnRlcmZhY2U7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFiaWxpdHkoKTogc3RyaW5nOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcXVpcmVzKCk6IGFycmF5OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbmZsaWN0cygpOiBhcnJheTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcygpOiBhcnJheTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBsYWNlcygpOiBhcnJheTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZSZXF1aXJlcygpOiBhcnJheTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3VnZ2VzdHMoKTogYXJyYXk7CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRvbG9hZCgpOiBhcnJheTsKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldkF1dG9sb2FkKCk6IGFycmF5OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluY2x1ZGVQYXRocygpOiBhcnJheTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGhwRXh0KCk6ID9hcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG9zaXRvcnkpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeSgpOiA/UmVwb3NpdG9yeUludGVyZmFjZTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJpbmFyaWVzKCk6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVuaXF1ZU5hbWUoKTogc3RyaW5nOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Tm90aWZpY2F0aW9uVXJsKCk6ID9zdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKCk6IHN0cmluZzsKCnB1YmxpYyBmdW5jdGlvbiBpc0RlZmF1bHRCcmFuY2goKTogYm9vbDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydE9wdGlvbnMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUcmFuc3BvcnRPcHRpb25zKGFycmF5ICRvcHRpb25zKTogdm9pZDsKCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VSZWZlcmVuY2UoP3N0cmluZyAkcmVmZXJlbmNlKTogdm9pZDsKCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0VXJsKD9zdHJpbmcgJHVybCk6IHZvaWQ7CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFR5cGUoP3N0cmluZyAkdHlwZSk6IHZvaWQ7CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFJlZmVyZW5jZSg/c3RyaW5nICRyZWZlcmVuY2UpOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZURpc3RSZWZlcmVuY2VzKHN0cmluZyAkcmVmZXJlbmNlKTogdm9pZDsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCgoKCmNsYXNzIFJvb3RBbGlhc1BhY2thZ2UgZXh0ZW5kcyBDb21wbGV0ZUFsaWFzUGFja2FnZSBpbXBsZW1lbnRzIFJvb3RQYWNrYWdlSW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkYWxpYXNPZjsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUm9vdFBhY2thZ2UgJGFsaWFzT2YsIHN0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRwcmV0dHlWZXJzaW9uKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGFsaWFzT2YsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc09mKCkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2Y7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRBbGlhc2VzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNaW5pbXVtU3RhYmlsaXR5KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0TWluaW11bVN0YWJpbGl0eSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5RmxhZ3MoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFN0YWJpbGl0eUZsYWdzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWZlcmVuY2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRSZWZlcmVuY2VzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmVmZXJTdGFibGUoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0UHJlZmVyU3RhYmxlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25maWcoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldENvbmZpZygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVxdWlyZXMoYXJyYXkgJHJlcXVpcmVzKTogdm9pZAp7CiR0aGlzLT5yZXF1aXJlcyA9ICR0aGlzLT5yZXBsYWNlU2VsZlZlcnNpb25EZXBlbmRlbmNpZXMoJHJlcXVpcmVzLCBMaW5rOjpUWVBFX1JFUVVJUkUpOwoKJHRoaXMtPmFsaWFzT2YtPnNldFJlcXVpcmVzKCRyZXF1aXJlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXZSZXF1aXJlcyhhcnJheSAkZGV2UmVxdWlyZXMpOiB2b2lkCnsKJHRoaXMtPmRldlJlcXVpcmVzID0gJHRoaXMtPnJlcGxhY2VTZWxmVmVyc2lvbkRlcGVuZGVuY2llcygkZGV2UmVxdWlyZXMsIExpbms6OlRZUEVfREVWX1JFUVVJUkUpOwoKJHRoaXMtPmFsaWFzT2YtPnNldERldlJlcXVpcmVzKCRkZXZSZXF1aXJlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25mbGljdHMoYXJyYXkgJGNvbmZsaWN0cyk6IHZvaWQKewokdGhpcy0+Y29uZmxpY3RzID0gJHRoaXMtPnJlcGxhY2VTZWxmVmVyc2lvbkRlcGVuZGVuY2llcygkY29uZmxpY3RzLCBMaW5rOjpUWVBFX0NPTkZMSUNUKTsKJHRoaXMtPmFsaWFzT2YtPnNldENvbmZsaWN0cygkY29uZmxpY3RzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByb3ZpZGVzKGFycmF5ICRwcm92aWRlcyk6IHZvaWQKewokdGhpcy0+cHJvdmlkZXMgPSAkdGhpcy0+cmVwbGFjZVNlbGZWZXJzaW9uRGVwZW5kZW5jaWVzKCRwcm92aWRlcywgTGluazo6VFlQRV9QUk9WSURFKTsKJHRoaXMtPmFsaWFzT2YtPnNldFByb3ZpZGVzKCRwcm92aWRlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBsYWNlcyhhcnJheSAkcmVwbGFjZXMpOiB2b2lkCnsKJHRoaXMtPnJlcGxhY2VzID0gJHRoaXMtPnJlcGxhY2VTZWxmVmVyc2lvbkRlcGVuZGVuY2llcygkcmVwbGFjZXMsIExpbms6OlRZUEVfUkVQTEFDRSk7CiR0aGlzLT5hbGlhc09mLT5zZXRSZXBsYWNlcygkcmVwbGFjZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b2xvYWQoYXJyYXkgJGF1dG9sb2FkKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRBdXRvbG9hZCgkYXV0b2xvYWQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2QXV0b2xvYWQoYXJyYXkgJGRldkF1dG9sb2FkKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXREZXZBdXRvbG9hZCgkZGV2QXV0b2xvYWQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3RhYmlsaXR5RmxhZ3MoYXJyYXkgJHN0YWJpbGl0eUZsYWdzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRTdGFiaWxpdHlGbGFncygkc3RhYmlsaXR5RmxhZ3MpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TWluaW11bVN0YWJpbGl0eShzdHJpbmcgJG1pbmltdW1TdGFiaWxpdHkpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldE1pbmltdW1TdGFiaWxpdHkoJG1pbmltdW1TdGFiaWxpdHkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyU3RhYmxlKGJvb2wgJHByZWZlclN0YWJsZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0UHJlZmVyU3RhYmxlKCRwcmVmZXJTdGFibGUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmlnKGFycmF5ICRjb25maWcpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldENvbmZpZygkY29uZmlnKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlZmVyZW5jZXMoYXJyYXkgJHJlZmVyZW5jZXMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFJlZmVyZW5jZXMoJHJlZmVyZW5jZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QWxpYXNlcyhhcnJheSAkYWxpYXNlcyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0QWxpYXNlcygkYWxpYXNlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdWdnZXN0cyhhcnJheSAkc3VnZ2VzdHMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFN1Z2dlc3RzKCRzdWdnZXN0cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFeHRyYShhcnJheSAkZXh0cmEpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEV4dHJhKCRleHRyYSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkKewpwYXJlbnQ6Ol9fY2xvbmUoKTsKJHRoaXMtPmFsaWFzT2YgPSBjbG9uZSAkdGhpcy0+YWxpYXNPZjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKCgoKCgpjbGFzcyBSb290UGFja2FnZSBleHRlbmRzIENvbXBsZXRlUGFja2FnZSBpbXBsZW1lbnRzIFJvb3RQYWNrYWdlSW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IERFRkFVTFRfUFJFVFRZX1ZFUlNJT04gPSAnMS4wLjArbm8tdmVyc2lvbi1zZXQnOwoKCnByb3RlY3RlZCAkbWluaW11bVN0YWJpbGl0eSA9ICdzdGFibGUnOwoKcHJvdGVjdGVkICRwcmVmZXJTdGFibGUgPSBmYWxzZTsKCnByb3RlY3RlZCAkc3RhYmlsaXR5RmxhZ3MgPSBbXTsKCnByb3RlY3RlZCAkY29uZmlnID0gW107Cgpwcm90ZWN0ZWQgJHJlZmVyZW5jZXMgPSBbXTsKCnByb3RlY3RlZCAkYWxpYXNlcyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE1pbmltdW1TdGFiaWxpdHkoc3RyaW5nICRtaW5pbXVtU3RhYmlsaXR5KTogdm9pZAp7CiR0aGlzLT5taW5pbXVtU3RhYmlsaXR5ID0gJG1pbmltdW1TdGFiaWxpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNaW5pbXVtU3RhYmlsaXR5KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+bWluaW11bVN0YWJpbGl0eTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0YWJpbGl0eUZsYWdzKGFycmF5ICRzdGFiaWxpdHlGbGFncyk6IHZvaWQKewokdGhpcy0+c3RhYmlsaXR5RmxhZ3MgPSAkc3RhYmlsaXR5RmxhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFiaWxpdHlGbGFncygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+c3RhYmlsaXR5RmxhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmVmZXJTdGFibGUoYm9vbCAkcHJlZmVyU3RhYmxlKTogdm9pZAp7CiR0aGlzLT5wcmVmZXJTdGFibGUgPSAkcHJlZmVyU3RhYmxlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlZmVyU3RhYmxlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnByZWZlclN0YWJsZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbmZpZyhhcnJheSAkY29uZmlnKTogdm9pZAp7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5jb25maWc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZWZlcmVuY2VzKGFycmF5ICRyZWZlcmVuY2VzKTogdm9pZAp7CiR0aGlzLT5yZWZlcmVuY2VzID0gJHJlZmVyZW5jZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWZlcmVuY2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZWZlcmVuY2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QWxpYXNlcyhhcnJheSAkYWxpYXNlcyk6IHZvaWQKewokdGhpcy0+YWxpYXNlcyA9ICRhbGlhc2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKCgoKCgoKCgoKCmludGVyZmFjZSBSb290UGFja2FnZUludGVyZmFjZSBleHRlbmRzIENvbXBsZXRlUGFja2FnZUludGVyZmFjZQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsaWFzZXMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNaW5pbXVtU3RhYmlsaXR5KCk6IHN0cmluZzsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5RmxhZ3MoKTogYXJyYXk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlZmVyZW5jZXMoKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlZmVyU3RhYmxlKCk6IGJvb2w7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25maWcoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXF1aXJlcyhhcnJheSAkcmVxdWlyZXMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2UmVxdWlyZXMoYXJyYXkgJGRldlJlcXVpcmVzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbmZsaWN0cyhhcnJheSAkY29uZmxpY3RzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByb3ZpZGVzKGFycmF5ICRwcm92aWRlcyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBsYWNlcyhhcnJheSAkcmVwbGFjZXMpOiB2b2lkOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9sb2FkKGFycmF5ICRhdXRvbG9hZCk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2QXV0b2xvYWQoYXJyYXkgJGRldkF1dG9sb2FkKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0YWJpbGl0eUZsYWdzKGFycmF5ICRzdGFiaWxpdHlGbGFncyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNaW5pbXVtU3RhYmlsaXR5KHN0cmluZyAkbWluaW11bVN0YWJpbGl0eSk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyU3RhYmxlKGJvb2wgJHByZWZlclN0YWJsZSk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25maWcoYXJyYXkgJGNvbmZpZyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZWZlcmVuY2VzKGFycmF5ICRyZWZlcmVuY2VzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFsaWFzZXMoYXJyYXkgJGFsaWFzZXMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VnZ2VzdHMoYXJyYXkgJHN1Z2dlc3RzKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFeHRyYShhcnJheSAkZXh0cmEpOiB2b2lkOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb247Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKCgoKCmNsYXNzIFN0YWJpbGl0eUZpbHRlcgp7CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1BhY2thZ2VBY2NlcHRhYmxlKGFycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsIGFycmF5ICRzdGFiaWxpdHlGbGFncywgYXJyYXkgJG5hbWVzLCBzdHJpbmcgJHN0YWJpbGl0eSk6IGJvb2wKewpmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpIHsKCmlmIChpc3NldCgkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdKSkgewppZiAoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTWyRzdGFiaWxpdHldIDw9ICRzdGFiaWxpdHlGbGFnc1skbmFtZV0pIHsKcmV0dXJuIHRydWU7Cn0KfSBlbHNlaWYgKGlzc2V0KCRhY2NlcHRhYmxlU3RhYmlsaXRpZXNbJHN0YWJpbGl0eV0pKSB7CgpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxEdW1wZXJcQXJyYXlEdW1wZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxJbnRlcnZhbHM7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKCgoKCmNsYXNzIFZlcnNpb25CdW1wZXIKewoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBidW1wUmVxdWlyZW1lbnQoQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHN0cmluZwp7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokcHJldHR5Q29uc3RyYWludCA9ICRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKTsKaWYgKHN0cl9zdGFydHNfd2l0aCgkY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCksICdkZXYtJykpIHsKcmV0dXJuICRwcmV0dHlDb25zdHJhaW50Owp9CgokdmVyc2lvbiA9ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCk7CmlmIChzdHJfc3RhcnRzX3dpdGgoJHBhY2thZ2UtPmdldFZlcnNpb24oKSwgJ2Rldi0nKSkgewokbG9hZGVyID0gbmV3IEFycmF5TG9hZGVyKCRwYXJzZXIpOwokZHVtcGVyID0gbmV3IEFycmF5RHVtcGVyKCk7CiRleHRyYSA9ICRsb2FkZXItPmdldEJyYW5jaEFsaWFzKCRkdW1wZXItPmR1bXAoJHBhY2thZ2UpKTsKCgppZiAobnVsbCA9PT0gJGV4dHJhIHx8ICRleHRyYSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKcmV0dXJuICRwcmV0dHlDb25zdHJhaW50Owp9CgokdmVyc2lvbiA9ICRleHRyYTsKfQoKJGludGVydmFscyA9IEludGVydmFsczo6Z2V0KCRjb25zdHJhaW50KTsKCgppZiAoXGNvdW50KCRpbnRlcnZhbHNbJ2JyYW5jaGVzJ11bJ25hbWVzJ10pID4gMCkgewpyZXR1cm4gJHByZXR0eUNvbnN0cmFpbnQ7Cn0KCiRtYWpvciA9IFByZWc6OnJlcGxhY2UoJ3teKFxkKykuKn0nLCAnJDEnLCAkdmVyc2lvbik7CiR2ZXJzaW9uV2l0aG91dFN1ZmZpeCA9IFByZWc6OnJlcGxhY2UoJ3soPzpcLig/OjB8OTk5OTk5OSkpKygtZGV2KT8kfScsICcnLCAkdmVyc2lvbik7CiRuZXdQcmV0dHlDb25zdHJhaW50ID0gJ14nLiR2ZXJzaW9uV2l0aG91dFN1ZmZpeDsKCgppZiAoIVByZWc6OmlzTWF0Y2goJ3teXF5cZCsoXC5cZCspKiR9JywgJG5ld1ByZXR0eUNvbnN0cmFpbnQpKSB7CnJldHVybiAkcHJldHR5Q29uc3RyYWludDsKfQoKJHBhdHRlcm4gPSAnewogICAgICAgICAgICAoPzw9LHxcIHxcfHxeKSAjIGxlYWRpbmcgc2VwYXJhdG9yCiAgICAgICAgICAgICg/UDxjb25zdHJhaW50PgogICAgICAgICAgICAgICAgXF52PycuJG1ham9yLicoPzpcLlxkKykqICMgZS5nLiBeMi5hbnl0aGluZwogICAgICAgICAgICAgICAgfCB+dj8nLiRtYWpvci4nKD86XC5cZCspezEsM30gIyBlLmcuIH4yLjIgb3IgfjIuMi4yIG9yIH4yLjIuMi4yCiAgICAgICAgICAgICAgICB8IHY/Jy4kbWFqb3IuJyg/OlwuWyp4XSkrICMgZS5nLiAyLiogb3IgMi4qLiogb3IgMi54LngueCBldGMKICAgICAgICAgICAgICAgIHwgPj12P1xkKD86XC5cZCspKiAjIGUuZy4gPj0yIG9yID49MS4yIGV0YwogICAgICAgICAgICAgICAgfCBcKiAjIGZ1bGwgd2lsZGNhcmQKICAgICAgICAgICAgKQogICAgICAgICAgICAoPz0sfCR8XCB8XHx8QCkgIyB0cmFpbGluZyBzZXBhcmF0b3IKICAgICAgICB9eCc7CmlmIChQcmVnOjppc01hdGNoQWxsV2l0aE9mZnNldHMoJHBhdHRlcm4sICRwcmV0dHlDb25zdHJhaW50LCAkbWF0Y2hlcykpIHsKJG1vZGlmaWVkID0gJHByZXR0eUNvbnN0cmFpbnQ7CmZvcmVhY2ggKGFycmF5X3JldmVyc2UoJG1hdGNoZXNbJ2NvbnN0cmFpbnQnXSkgYXMgJG1hdGNoKSB7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWzBdKSk7CiRzdWZmaXggPSAnJzsKaWYgKHN1YnN0cl9jb3VudCgkbWF0Y2hbMF0sICcuJykgPT09IDIgJiYgc3Vic3RyX2NvdW50KCR2ZXJzaW9uV2l0aG91dFN1ZmZpeCwgJy4nKSA9PT0gMSkgewokc3VmZml4ID0gJy4wJzsKfQppZiAoc3RyX3N0YXJ0c193aXRoKCRtYXRjaFswXSwgJ34nKSAmJiBzdWJzdHJfY291bnQoJG1hdGNoWzBdLCAnLicpICE9PSAxKSB7CgokdmVyc2lvbkJpdHMgPSBleHBsb2RlKCcuJywgJHZlcnNpb25XaXRob3V0U3VmZml4KTsKJHZlcnNpb25CaXRzID0gYXJyYXlfcGFkKCR2ZXJzaW9uQml0cywgc3Vic3RyX2NvdW50KCRtYXRjaFswXSwgJy4nKSArIDEsICcwJyk7CiRyZXBsYWNlbWVudCA9ICd+Jy5pbXBsb2RlKCcuJywgYXJyYXlfc2xpY2UoJHZlcnNpb25CaXRzLCAwLCBzdWJzdHJfY291bnQoJG1hdGNoWzBdLCAnLicpICsgMSkpOwp9IGVsc2VpZiAoJG1hdGNoWzBdID09PSAnKicgfHwgc3RyX3N0YXJ0c193aXRoKCRtYXRjaFswXSwgJz49JykpIHsKJHJlcGxhY2VtZW50ID0gJz49Jy4kdmVyc2lvbldpdGhvdXRTdWZmaXguJHN1ZmZpeDsKfSBlbHNlIHsKJHJlcGxhY2VtZW50ID0gJG5ld1ByZXR0eUNvbnN0cmFpbnQuJHN1ZmZpeDsKfQokbW9kaWZpZWQgPSBzdWJzdHJfcmVwbGFjZSgkbW9kaWZpZWQsICRyZXBsYWNlbWVudCwgJG1hdGNoWzFdLCBQbGF0Zm9ybTo6c3RybGVuKCRtYXRjaFswXSkpOwp9CgoKJG5ld0NvbnN0cmFpbnQgPSAkcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRtb2RpZmllZCk7CmlmIChJbnRlcnZhbHM6OmlzU3Vic2V0T2YoJG5ld0NvbnN0cmFpbnQsICRjb25zdHJhaW50KSAmJiBJbnRlcnZhbHM6OmlzU3Vic2V0T2YoJGNvbnN0cmFpbnQsICRuZXdDb25zdHJhaW50KSkgewpyZXR1cm4gJHByZXR0eUNvbnN0cmFpbnQ7Cn0KCnJldHVybiAkbW9kaWZpZWQ7Cn0KCnJldHVybiAkcHJldHR5Q29uc3RyYWludDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb247Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xIZ0RyaXZlcjsKdXNlIENvbXBvc2VyXElPXE51bGxJTzsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyIGFzIFNlbXZlclZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxVdGlsXEdpdCBhcyBHaXRVdGlsOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcU3ZuIGFzIFN2blV0aWw7CnVzZSBSZWFjdFxQcm9taXNlXENhbmNlbGxhYmxlUHJvbWlzZUludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKCgoKCgoKCgoKY2xhc3MgVmVyc2lvbkd1ZXNzZXIKewoKCgpwcml2YXRlICRjb25maWc7CgoKCgpwcml2YXRlICRwcm9jZXNzOwoKCgoKcHJpdmF0ZSAkdmVyc2lvblBhcnNlcjsKCgoKCnByaXZhdGUgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KENvbmZpZyAkY29uZmlnLCBQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MsIFNlbXZlclZlcnNpb25QYXJzZXIgJHZlcnNpb25QYXJzZXIsID9JT0ludGVyZmFjZSAkaW8gPSBudWxsKQp7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzOwokdGhpcy0+dmVyc2lvblBhcnNlciA9ICR2ZXJzaW9uUGFyc2VyOwokdGhpcy0+aW8gPSAkaW87Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBndWVzc1ZlcnNpb24oYXJyYXkgJHBhY2thZ2VDb25maWcsIHN0cmluZyAkcGF0aCk6ID9hcnJheQp7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewpyZXR1cm4gbnVsbDsKfQoKCgppZiAoUGxhdGZvcm06OmlzSW5wdXRDb21wbGV0aW9uUHJvY2VzcygpKSB7CnJldHVybiBudWxsOwp9CgokdmVyc2lvbkRhdGEgPSAkdGhpcy0+Z3Vlc3NHaXRWZXJzaW9uKCRwYWNrYWdlQ29uZmlnLCAkcGF0aCk7CmlmIChudWxsICE9PSAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXSkgewpyZXR1cm4gJHRoaXMtPnBvc3Rwcm9jZXNzKCR2ZXJzaW9uRGF0YSk7Cn0KCiR2ZXJzaW9uRGF0YSA9ICR0aGlzLT5ndWVzc0hnVmVyc2lvbigkcGFja2FnZUNvbmZpZywgJHBhdGgpOwppZiAobnVsbCAhPT0gJHZlcnNpb25EYXRhICYmIG51bGwgIT09ICR2ZXJzaW9uRGF0YVsndmVyc2lvbiddKSB7CnJldHVybiAkdGhpcy0+cG9zdHByb2Nlc3MoJHZlcnNpb25EYXRhKTsKfQoKJHZlcnNpb25EYXRhID0gJHRoaXMtPmd1ZXNzRm9zc2lsVmVyc2lvbigkcGF0aCk7CmlmIChudWxsICE9PSAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXSkgewpyZXR1cm4gJHRoaXMtPnBvc3Rwcm9jZXNzKCR2ZXJzaW9uRGF0YSk7Cn0KCiR2ZXJzaW9uRGF0YSA9ICR0aGlzLT5ndWVzc1N2blZlcnNpb24oJHBhY2thZ2VDb25maWcsICRwYXRoKTsKaWYgKG51bGwgIT09ICR2ZXJzaW9uRGF0YSAmJiBudWxsICE9PSAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXSkgewpyZXR1cm4gJHRoaXMtPnBvc3Rwcm9jZXNzKCR2ZXJzaW9uRGF0YSk7Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcG9zdHByb2Nlc3MoYXJyYXkgJHZlcnNpb25EYXRhKTogYXJyYXkKewppZiAoIWVtcHR5KCR2ZXJzaW9uRGF0YVsnZmVhdHVyZV92ZXJzaW9uJ10pICYmICR2ZXJzaW9uRGF0YVsnZmVhdHVyZV92ZXJzaW9uJ10gPT09ICR2ZXJzaW9uRGF0YVsndmVyc2lvbiddICYmICR2ZXJzaW9uRGF0YVsnZmVhdHVyZV9wcmV0dHlfdmVyc2lvbiddID09PSAkdmVyc2lvbkRhdGFbJ3ByZXR0eV92ZXJzaW9uJ10pIHsKdW5zZXQoJHZlcnNpb25EYXRhWydmZWF0dXJlX3ZlcnNpb24nXSwgJHZlcnNpb25EYXRhWydmZWF0dXJlX3ByZXR0eV92ZXJzaW9uJ10pOwp9CgppZiAoJy1kZXYnID09PSBzdWJzdHIoJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ10sIC00KSAmJiBQcmVnOjppc01hdGNoKCd7XC45ezd9fScsICR2ZXJzaW9uRGF0YVsndmVyc2lvbiddKSkgewokdmVyc2lvbkRhdGFbJ3ByZXR0eV92ZXJzaW9uJ10gPSBQcmVnOjpyZXBsYWNlKCd7KFwuOXs3fSkrfScsICcueCcsICR2ZXJzaW9uRGF0YVsndmVyc2lvbiddKTsKfQoKaWYgKCFlbXB0eSgkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfdmVyc2lvbiddKSAmJiAnLWRldicgPT09IHN1YnN0cigkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfdmVyc2lvbiddLCAtNCkgJiYgUHJlZzo6aXNNYXRjaCgne1wuOXs3fX0nLCAkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfdmVyc2lvbiddKSkgewokdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfcHJldHR5X3ZlcnNpb24nXSA9IFByZWc6OnJlcGxhY2UoJ3soXC45ezd9KSt9JywgJy54JywgJHZlcnNpb25EYXRhWydmZWF0dXJlX3ZlcnNpb24nXSk7Cn0KCnJldHVybiAkdmVyc2lvbkRhdGE7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBndWVzc0dpdFZlcnNpb24oYXJyYXkgJHBhY2thZ2VDb25maWcsIHN0cmluZyAkcGF0aCk6IGFycmF5CnsKR2l0VXRpbDo6Y2xlYW5FbnYoKTsKJGNvbW1pdCA9IG51bGw7CiR2ZXJzaW9uID0gbnVsbDsKJHByZXR0eVZlcnNpb24gPSBudWxsOwokZmVhdHVyZVZlcnNpb24gPSBudWxsOwokZmVhdHVyZVByZXR0eVZlcnNpb24gPSBudWxsOwokaXNEZXRhY2hlZCA9IGZhbHNlOwoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdicmFuY2gnLCAnLWEnLCAnLS1uby1jb2xvcicsICctLW5vLWFiYnJldicsICctdiddLCAkb3V0cHV0LCAkcGF0aCkpIHsKJGJyYW5jaGVzID0gW107CiRpc0ZlYXR1cmVCcmFuY2ggPSBmYWxzZTsKCgpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkYnJhbmNoKSB7CmlmICgkYnJhbmNoICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKD86XCogKSAqKFwobm8gYnJhbmNoXCl8XChkZXRhY2hlZCBmcm9tIFxTK1wpfFwoSEVBRCBkZXRhY2hlZCBhdCBcUytcKXxcUyspICooW2EtZjAtOV0rKSAuKiR9JywgJGJyYW5jaCwgJG1hdGNoKSkgewppZiAoCiRtYXRjaFsxXSA9PT0gJyhubyBicmFuY2gpJwp8fCBzdHJwb3MoJG1hdGNoWzFdLCAnKGRldGFjaGVkICcpID09PSAwCnx8IHN0cnBvcygkbWF0Y2hbMV0sICcoSEVBRCBkZXRhY2hlZCBhdCcpID09PSAwCikgewokdmVyc2lvbiA9ICdkZXYtJyAuICRtYXRjaFsyXTsKJHByZXR0eVZlcnNpb24gPSAkdmVyc2lvbjsKJGlzRmVhdHVyZUJyYW5jaCA9IHRydWU7CiRpc0RldGFjaGVkID0gdHJ1ZTsKfSBlbHNlIHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKCRtYXRjaFsxXSk7CiRwcmV0dHlWZXJzaW9uID0gJ2Rldi0nIC4gJG1hdGNoWzFdOwokaXNGZWF0dXJlQnJhbmNoID0gJHRoaXMtPmlzRmVhdHVyZUJyYW5jaCgkcGFja2FnZUNvbmZpZywgJG1hdGNoWzFdKTsKfQoKJGNvbW1pdCA9ICRtYXRjaFsyXTsKfQoKaWYgKCRicmFuY2ggJiYgIVByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teICouKy9IRUFEIH0nLCAkYnJhbmNoKSkgewppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oPzpcKiApPyAqKCg/OnJlbW90ZXMvKD86b3JpZ2lufHVwc3RyZWFtKS8pP1teXHMvXSspICooW2EtZjAtOV0rKSAuKiR9JywgJGJyYW5jaCwgJG1hdGNoKSkgewokYnJhbmNoZXNbXSA9ICRtYXRjaFsxXTsKfQp9Cn0KCmlmICgkaXNGZWF0dXJlQnJhbmNoKSB7CiRmZWF0dXJlVmVyc2lvbiA9ICR2ZXJzaW9uOwokZmVhdHVyZVByZXR0eVZlcnNpb24gPSAkcHJldHR5VmVyc2lvbjsKCgokcmVzdWx0ID0gJHRoaXMtPmd1ZXNzRmVhdHVyZVZlcnNpb24oJHBhY2thZ2VDb25maWcsICR2ZXJzaW9uLCAkYnJhbmNoZXMsIFsnZ2l0JywgJ3Jldi1saXN0JywgJyVjYW5kaWRhdGUlLi4lYnJhbmNoJSddLCAkcGF0aCk7CiR2ZXJzaW9uID0gJHJlc3VsdFsndmVyc2lvbiddOwokcHJldHR5VmVyc2lvbiA9ICRyZXN1bHRbJ3ByZXR0eV92ZXJzaW9uJ107Cn0KfQpHaXRVdGlsOjpjaGVja0ZvclJlcG9Pd25lcnNoaXBFcnJvcigkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJHBhdGgsICR0aGlzLT5pbyk7CgppZiAoISR2ZXJzaW9uIHx8ICRpc0RldGFjaGVkKSB7CiRyZXN1bHQgPSAkdGhpcy0+dmVyc2lvbkZyb21HaXRUYWdzKCRwYXRoKTsKaWYgKCRyZXN1bHQpIHsKJHZlcnNpb24gPSAkcmVzdWx0Wyd2ZXJzaW9uJ107CiRwcmV0dHlWZXJzaW9uID0gJHJlc3VsdFsncHJldHR5X3ZlcnNpb24nXTsKJGZlYXR1cmVWZXJzaW9uID0gbnVsbDsKJGZlYXR1cmVQcmV0dHlWZXJzaW9uID0gbnVsbDsKfQp9CgppZiAobnVsbCA9PT0gJGNvbW1pdCkgewokY29tbWFuZCA9IGFycmF5X21lcmdlKFsnZ2l0JywgJ2xvZycsICctLXByZXR0eT0lSCcsICctbjEnLCAnSEVBRCddLCBHaXRVdGlsOjpnZXROb1Nob3dTaWduYXR1cmVGbGFncygkdGhpcy0+cHJvY2VzcykpOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewokY29tbWl0ID0gdHJpbSgkb3V0cHV0KSA/OiBudWxsOwp9Cn0KCmlmICgkZmVhdHVyZVZlcnNpb24pIHsKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdjb21taXQnID0+ICRjb21taXQsICdwcmV0dHlfdmVyc2lvbicgPT4gJHByZXR0eVZlcnNpb24sICdmZWF0dXJlX3ZlcnNpb24nID0+ICRmZWF0dXJlVmVyc2lvbiwgJ2ZlYXR1cmVfcHJldHR5X3ZlcnNpb24nID0+ICRmZWF0dXJlUHJldHR5VmVyc2lvbl07Cn0KCnJldHVybiBbJ3ZlcnNpb24nID0+ICR2ZXJzaW9uLCAnY29tbWl0JyA9PiAkY29tbWl0LCAncHJldHR5X3ZlcnNpb24nID0+ICRwcmV0dHlWZXJzaW9uXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2ZXJzaW9uRnJvbUdpdFRhZ3Moc3RyaW5nICRwYXRoKTogP2FycmF5CnsKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdkZXNjcmliZScsICctLWV4YWN0LW1hdGNoJywgJy0tdGFncyddLCAkb3V0cHV0LCAkcGF0aCkpIHsKdHJ5IHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKHRyaW0oJG91dHB1dCkpOwoKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdwcmV0dHlfdmVyc2lvbicgPT4gdHJpbSgkb3V0cHV0KV07Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGd1ZXNzSGdWZXJzaW9uKGFycmF5ICRwYWNrYWdlQ29uZmlnLCBzdHJpbmcgJHBhdGgpOiA/YXJyYXkKewoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnaGcnLCAnYnJhbmNoJ10sICRvdXRwdXQsICRwYXRoKSkgewokYnJhbmNoID0gdHJpbSgkb3V0cHV0KTsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKCRicmFuY2gpOwokaXNGZWF0dXJlQnJhbmNoID0gMCA9PT0gc3RycG9zKCR2ZXJzaW9uLCAnZGV2LScpOwoKaWYgKFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTID09PSAkdmVyc2lvbikgewpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ2NvbW1pdCcgPT4gbnVsbCwgJ3ByZXR0eV92ZXJzaW9uJyA9PiAnZGV2LScuJGJyYW5jaF07Cn0KCmlmICghJGlzRmVhdHVyZUJyYW5jaCkgewpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ2NvbW1pdCcgPT4gbnVsbCwgJ3ByZXR0eV92ZXJzaW9uJyA9PiAkdmVyc2lvbl07Cn0KCgokaW8gPSBuZXcgTnVsbElPKCk7CiRkcml2ZXIgPSBuZXcgSGdEcml2ZXIoWyd1cmwnID0+ICRwYXRoXSwgJGlvLCAkdGhpcy0+Y29uZmlnLCBuZXcgSHR0cERvd25sb2FkZXIoJGlvLCAkdGhpcy0+Y29uZmlnKSwgJHRoaXMtPnByb2Nlc3MpOwokYnJhbmNoZXMgPSBhcnJheV9tYXAoJ3N0cnZhbCcsIGFycmF5X2tleXMoJGRyaXZlci0+Z2V0QnJhbmNoZXMoKSkpOwoKCiRyZXN1bHQgPSAkdGhpcy0+Z3Vlc3NGZWF0dXJlVmVyc2lvbigkcGFja2FnZUNvbmZpZywgJHZlcnNpb24sICRicmFuY2hlcywgWydoZycsICdsb2cnLCAnLXInLCAnbm90IGFuY2VzdG9ycyhcJyVjYW5kaWRhdGUlXCcpIGFuZCBhbmNlc3RvcnMoXCclYnJhbmNoJVwnKScsICctLXRlbXBsYXRlJywgJyJ7bm9kZX1cXG4iJ10sICRwYXRoKTsKJHJlc3VsdFsnY29tbWl0J10gPSAnJzsKJHJlc3VsdFsnZmVhdHVyZV92ZXJzaW9uJ10gPSAkdmVyc2lvbjsKJHJlc3VsdFsnZmVhdHVyZV9wcmV0dHlfdmVyc2lvbiddID0gJHZlcnNpb247CgpyZXR1cm4gJHJlc3VsdDsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGd1ZXNzRmVhdHVyZVZlcnNpb24oYXJyYXkgJHBhY2thZ2VDb25maWcsID9zdHJpbmcgJHZlcnNpb24sIGFycmF5ICRicmFuY2hlcywgYXJyYXkgJHNjbUNtZGxpbmUsIHN0cmluZyAkcGF0aCk6IGFycmF5CnsKJHByZXR0eVZlcnNpb24gPSAkdmVyc2lvbjsKCgoKaWYgKCFpc3NldCgkcGFja2FnZUNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ11bJHZlcnNpb25dKQp8fCBzdHJwb3MoanNvbl9lbmNvZGUoJHBhY2thZ2VDb25maWcpLCAnInNlbGYudmVyc2lvbiInKQopIHsKJGJyYW5jaCA9IFByZWc6OnJlcGxhY2UoJ3teZGV2LX0nLCAnJywgJHZlcnNpb24pOwokbGVuZ3RoID0gUEhQX0lOVF9NQVg7CgoKaWYgKCEkdGhpcy0+aXNGZWF0dXJlQnJhbmNoKCRwYWNrYWdlQ29uZmlnLCAkYnJhbmNoKSkgewpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ3ByZXR0eV92ZXJzaW9uJyA9PiAkcHJldHR5VmVyc2lvbl07Cn0KCgoKCnVzb3J0KCRicmFuY2hlcywgc3RhdGljIGZ1bmN0aW9uICgkYSwgJGIpOiBpbnQgewokYVJlbW90ZSA9IDAgPT09IHN0cnBvcygkYSwgJ3JlbW90ZXMvJyk7CiRiUmVtb3RlID0gMCA9PT0gc3RycG9zKCRiLCAncmVtb3Rlcy8nKTsKCmlmICgkYVJlbW90ZSAhPT0gJGJSZW1vdGUpIHsKcmV0dXJuICRhUmVtb3RlID8gMSA6IC0xOwp9CgpyZXR1cm4gc3RybmF0Y2FzZWNtcCgkYiwgJGEpOwp9KTsKCiRwcm9taXNlcyA9IFtdOwokdGhpcy0+cHJvY2Vzcy0+c2V0TWF4Sm9icygzMCk7CnRyeSB7CiRsYXN0SW5kZXggPSAtMTsKZm9yZWFjaCAoJGJyYW5jaGVzIGFzICRpbmRleCA9PiAkY2FuZGlkYXRlKSB7CiRjYW5kaWRhdGVWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgne15yZW1vdGVzL1xTKy99JywgJycsICRjYW5kaWRhdGUpOwoKCmlmICgkY2FuZGlkYXRlID09PSAkYnJhbmNoIHx8ICR0aGlzLT5pc0ZlYXR1cmVCcmFuY2goJHBhY2thZ2VDb25maWcsICRjYW5kaWRhdGVWZXJzaW9uKSkgewpjb250aW51ZTsKfQoKJGNtZExpbmUgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJGNvbXBvbmVudCkgdXNlICgkY2FuZGlkYXRlLCAkYnJhbmNoKSB7CnJldHVybiBzdHJfcmVwbGFjZShbJyVjYW5kaWRhdGUlJywgJyVicmFuY2glJ10sIFskY2FuZGlkYXRlLCAkYnJhbmNoXSwgJGNvbXBvbmVudCk7Cn0sICRzY21DbWRsaW5lKTsKJHByb21pc2VzW10gPSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZUFzeW5jKCRjbWRMaW5lLCAkcGF0aCktPnRoZW4oZnVuY3Rpb24gKFByb2Nlc3MgJHByb2Nlc3MpIHVzZSAoJiRsYXN0SW5kZXgsICRpbmRleCwgJiRsZW5ndGgsICYkdmVyc2lvbiwgJiRwcmV0dHlWZXJzaW9uLCAkY2FuZGlkYXRlVmVyc2lvbiwgJiRwcm9taXNlcyk6IHZvaWQgewppZiAoISRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkgewpyZXR1cm47Cn0KCiRvdXRwdXQgPSAkcHJvY2Vzcy0+Z2V0T3V0cHV0KCk7CgoKCmlmIChzdHJsZW4oJG91dHB1dCkgPCAkbGVuZ3RoIHx8IChzdHJsZW4oJG91dHB1dCkgPT09ICRsZW5ndGggJiYgJGxhc3RJbmRleCA8ICRpbmRleCkpIHsKJGxhc3RJbmRleCA9ICRpbmRleDsKJGxlbmd0aCA9IHN0cmxlbigkb3V0cHV0KTsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKCRjYW5kaWRhdGVWZXJzaW9uKTsKJHByZXR0eVZlcnNpb24gPSAnZGV2LScgLiAkY2FuZGlkYXRlVmVyc2lvbjsKaWYgKCRsZW5ndGggPT09IDApIHsKZm9yZWFjaCAoJHByb21pc2VzIGFzICRwcm9taXNlKSB7CgpcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKCRwcm9taXNlKS0+Y2FuY2VsKCk7Cn0KfQp9Cn0pOwp9CgokdGhpcy0+cHJvY2Vzcy0+d2FpdCgpOwp9IGZpbmFsbHkgewokdGhpcy0+cHJvY2Vzcy0+cmVzZXRNYXhKb2JzKCk7Cn0KfQoKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdwcmV0dHlfdmVyc2lvbicgPT4gJHByZXR0eVZlcnNpb25dOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzRmVhdHVyZUJyYW5jaChhcnJheSAkcGFja2FnZUNvbmZpZywgP3N0cmluZyAkYnJhbmNoTmFtZSk6IGJvb2wKewokbm9uRmVhdHVyZUJyYW5jaGVzID0gJyc7CmlmICghZW1wdHkoJHBhY2thZ2VDb25maWdbJ25vbi1mZWF0dXJlLWJyYW5jaGVzJ10pKSB7CiRub25GZWF0dXJlQnJhbmNoZXMgPSBpbXBsb2RlKCd8JywgJHBhY2thZ2VDb25maWdbJ25vbi1mZWF0dXJlLWJyYW5jaGVzJ10pOwp9CgpyZXR1cm4gIVByZWc6OmlzTWF0Y2goJ3teKCcgLiAkbm9uRmVhdHVyZUJyYW5jaGVzIC4gJ3xtYXN0ZXJ8bWFpbnxsYXRlc3R8bmV4dHxjdXJyZW50fHN1cHBvcnR8dGlwfHRydW5rfGRlZmF1bHR8ZGV2ZWxvcHxcZCtcLi4rKSR9JywgJGJyYW5jaE5hbWUsICRtYXRjaCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ3Vlc3NGb3NzaWxWZXJzaW9uKHN0cmluZyAkcGF0aCk6IGFycmF5CnsKJHZlcnNpb24gPSBudWxsOwokcHJldHR5VmVyc2lvbiA9IG51bGw7CgoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZm9zc2lsJywgJ2JyYW5jaCcsICdsaXN0J10sICRvdXRwdXQsICRwYXRoKSkgewokYnJhbmNoID0gdHJpbSgkb3V0cHV0KTsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKCRicmFuY2gpOwokcHJldHR5VmVyc2lvbiA9ICdkZXYtJyAuICRicmFuY2g7Cn0KCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAndGFnJywgJ2xpc3QnXSwgJG91dHB1dCwgJHBhdGgpKSB7CnRyeSB7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSh0cmltKCRvdXRwdXQpKTsKJHByZXR0eVZlcnNpb24gPSB0cmltKCRvdXRwdXQpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KfQoKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdjb21taXQnID0+ICcnLCAncHJldHR5X3ZlcnNpb24nID0+ICRwcmV0dHlWZXJzaW9uXTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGd1ZXNzU3ZuVmVyc2lvbihhcnJheSAkcGFja2FnZUNvbmZpZywgc3RyaW5nICRwYXRoKTogP2FycmF5CnsKU3ZuVXRpbDo6Y2xlYW5FbnYoKTsKCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydzdm4nLCAnaW5mbycsICctLXhtbCddLCAkb3V0cHV0LCAkcGF0aCkpIHsKJHRydW5rUGF0aCA9IGlzc2V0KCRwYWNrYWdlQ29uZmlnWyd0cnVuay1wYXRoJ10pID8gcHJlZ19xdW90ZSgkcGFja2FnZUNvbmZpZ1sndHJ1bmstcGF0aCddLCAnIycpIDogJ3RydW5rJzsKJGJyYW5jaGVzUGF0aCA9IGlzc2V0KCRwYWNrYWdlQ29uZmlnWydicmFuY2hlcy1wYXRoJ10pID8gcHJlZ19xdW90ZSgkcGFja2FnZUNvbmZpZ1snYnJhbmNoZXMtcGF0aCddLCAnIycpIDogJ2JyYW5jaGVzJzsKJHRhZ3NQYXRoID0gaXNzZXQoJHBhY2thZ2VDb25maWdbJ3RhZ3MtcGF0aCddKSA/IHByZWdfcXVvdGUoJHBhY2thZ2VDb25maWdbJ3RhZ3MtcGF0aCddLCAnIycpIDogJ3RhZ3MnOwoKJHVybFBhdHRlcm4gPSAnIzx1cmw+LiovKCcgLiAkdHJ1bmtQYXRoIC4gJ3woJyAuICRicmFuY2hlc1BhdGggLiAnfCcgLiAkdGFnc1BhdGggLiAnKS8oLiopKTwvdXJsPiMnOwoKaWYgKFByZWc6OmlzTWF0Y2goJHVybFBhdHRlcm4sICRvdXRwdXQsICRtYXRjaGVzKSkgewppZiAoaXNzZXQoJG1hdGNoZXNbMl0sICRtYXRjaGVzWzNdKSAmJiAoJGJyYW5jaGVzUGF0aCA9PT0gJG1hdGNoZXNbMl0gfHwgJHRhZ3NQYXRoID09PSAkbWF0Y2hlc1syXSkpIHsKCiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZUJyYW5jaCgkbWF0Y2hlc1szXSk7CiRwcmV0dHlWZXJzaW9uID0gJ2Rldi0nIC4gJG1hdGNoZXNbM107CgpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ2NvbW1pdCcgPT4gJycsICdwcmV0dHlfdmVyc2lvbicgPT4gJHByZXR0eVZlcnNpb25dOwp9Cgphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWzFdKSk7CiRwcmV0dHlWZXJzaW9uID0gdHJpbSgkbWF0Y2hlc1sxXSk7CmlmICgkcHJldHR5VmVyc2lvbiA9PT0gJ3RydW5rJykgewokdmVyc2lvbiA9ICdkZXYtdHJ1bmsnOwp9IGVsc2UgewokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9CgpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ2NvbW1pdCcgPT4gJycsICdwcmV0dHlfdmVyc2lvbicgPT4gJHByZXR0eVZlcnNpb25dOwp9Cn0KCnJldHVybiBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdFZlcnNpb25Gcm9tRW52KCk6IHN0cmluZwp7CiR2ZXJzaW9uID0gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfUk9PVF9WRVJTSU9OJyk7CmlmICghaXNfc3RyaW5nKCR2ZXJzaW9uKSB8fCAkdmVyc2lvbiA9PT0gJycpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDT01QT1NFUl9ST09UX1ZFUlNJT04gbm90IHNldCBvciBlbXB0eScpOwp9CmlmIChQcmVnOjppc01hdGNoKCd7XihcZCsoPzpcLlxkKykqKS1kZXYkfWknLCAkdmVyc2lvbiwgJG1hdGNoKSkgewokdmVyc2lvbiA9ICRtYXRjaFsxXS4nLngtZGV2JzsKfQoKcmV0dXJuICR2ZXJzaW9uOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyIGFzIFNlbXZlclZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcU2VtdmVyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKCmNsYXNzIFZlcnNpb25QYXJzZXIgZXh0ZW5kcyBTZW12ZXJWZXJzaW9uUGFyc2VyCnsKcHVibGljIGNvbnN0IERFRkFVTFRfQlJBTkNIX0FMSUFTID0gJzk5OTk5OTktZGV2JzsKCgpwcml2YXRlIHN0YXRpYyAkY29uc3RyYWludHMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBwYXJzZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50cyk6IENvbnN0cmFpbnRJbnRlcmZhY2UKewppZiAoIWlzc2V0KHNlbGY6OiRjb25zdHJhaW50c1skY29uc3RyYWludHNdKSkgewpzZWxmOjokY29uc3RyYWludHNbJGNvbnN0cmFpbnRzXSA9IHBhcmVudDo6cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludHMpOwp9CgpyZXR1cm4gc2VsZjo6JGNvbnN0cmFpbnRzWyRjb25zdHJhaW50c107Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2VOYW1lVmVyc2lvblBhaXJzKGFycmF5ICRwYWlycyk6IGFycmF5CnsKJHBhaXJzID0gYXJyYXlfdmFsdWVzKCRwYWlycyk7CiRyZXN1bHQgPSBbXTsKCmZvciAoJGkgPSAwLCAkY291bnQgPSBjb3VudCgkcGFpcnMpOyAkaSA8ICRjb3VudDsgJGkrKykgewokcGFpciA9IFByZWc6OnJlcGxhY2UoJ3teKFtePTogXSspWz06IF0oLiopJH0nLCAnJDEgJDInLCB0cmltKCRwYWlyc1skaV0pKTsKaWYgKGZhbHNlID09PSBzdHJwb3MoJHBhaXIsICcgJykgJiYgaXNzZXQoJHBhaXJzWyRpICsgMV0pICYmIGZhbHNlID09PSBzdHJwb3MoJHBhaXJzWyRpICsgMV0sICcvJykgJiYgIVByZWc6OmlzTWF0Y2goJ3soPzw9W2EtejAtOV8vLV0pXCp8XCooPz1bYS16MC05Xy8tXSl9aScsICRwYWlyc1skaSArIDFdKSAmJiAhUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFpcnNbJGkgKyAxXSkpIHsKJHBhaXIgLj0gJyAnLiRwYWlyc1skaSArIDFdOwokaSsrOwp9CgppZiAoc3RycG9zKCRwYWlyLCAnICcpKSB7ClskbmFtZSwgJHZlcnNpb25dID0gZXhwbG9kZSgnICcsICRwYWlyLCAyKTsKJHJlc3VsdFtdID0gWyduYW1lJyA9PiAkbmFtZSwgJ3ZlcnNpb24nID0+ICR2ZXJzaW9uXTsKfSBlbHNlIHsKJHJlc3VsdFtdID0gWyduYW1lJyA9PiAkcGFpcl07Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNVcGdyYWRlKHN0cmluZyAkbm9ybWFsaXplZEZyb20sIHN0cmluZyAkbm9ybWFsaXplZFRvKTogYm9vbAp7CmlmICgkbm9ybWFsaXplZEZyb20gPT09ICRub3JtYWxpemVkVG8pIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpbl9hcnJheSgkbm9ybWFsaXplZEZyb20sIFsnZGV2LW1hc3RlcicsICdkZXYtdHJ1bmsnLCAnZGV2LWRlZmF1bHQnXSwgdHJ1ZSkpIHsKJG5vcm1hbGl6ZWRGcm9tID0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVM7Cn0KaWYgKGluX2FycmF5KCRub3JtYWxpemVkVG8sIFsnZGV2LW1hc3RlcicsICdkZXYtdHJ1bmsnLCAnZGV2LWRlZmF1bHQnXSwgdHJ1ZSkpIHsKJG5vcm1hbGl6ZWRUbyA9IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTOwp9CgppZiAoc3RycG9zKCRub3JtYWxpemVkRnJvbSwgJ2Rldi0nKSA9PT0gMCB8fCBzdHJwb3MoJG5vcm1hbGl6ZWRUbywgJ2Rldi0nKSA9PT0gMCkgewpyZXR1cm4gdHJ1ZTsKfQoKJHNvcnRlZCA9IFNlbXZlcjo6c29ydChbJG5vcm1hbGl6ZWRUbywgJG5vcm1hbGl6ZWRGcm9tXSk7CgpyZXR1cm4gJHNvcnRlZFswXSA9PT0gJG5vcm1hbGl6ZWRGcm9tOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvbjsKCnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXER1bXBlclxBcnJheUR1bXBlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CgoKCgoKCgpjbGFzcyBWZXJzaW9uU2VsZWN0b3IKewoKcHJpdmF0ZSAkcmVwb3NpdG9yeVNldDsKCgpwcml2YXRlICRwbGF0Zm9ybUNvbnN0cmFpbnRzID0gW107CgoKcHJpdmF0ZSAkcGFyc2VyOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsID9QbGF0Zm9ybVJlcG9zaXRvcnkgJHBsYXRmb3JtUmVwbyA9IG51bGwpCnsKJHRoaXMtPnJlcG9zaXRvcnlTZXQgPSAkcmVwb3NpdG9yeVNldDsKaWYgKCRwbGF0Zm9ybVJlcG8pIHsKZm9yZWFjaCAoJHBsYXRmb3JtUmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokdGhpcy0+cGxhdGZvcm1Db25zdHJhaW50c1skcGFja2FnZS0+Z2V0TmFtZSgpXVtdID0gbmV3IENvbnN0cmFpbnQoJz09JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSk7Cn0KfQp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRCZXN0Q2FuZGlkYXRlKHN0cmluZyAkcGFja2FnZU5hbWUsID9zdHJpbmcgJHRhcmdldFBhY2thZ2VWZXJzaW9uID0gbnVsbCwgc3RyaW5nICRwcmVmZXJyZWRTdGFiaWxpdHkgPSAnc3RhYmxlJywgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSBudWxsLCBpbnQgJHJlcG9TZXRGbGFncyA9IDAsID9JT0ludGVyZmFjZSAkaW8gPSBudWxsLCAkc2hvd1dhcm5pbmdzID0gdHJ1ZSkKewppZiAoIWlzc2V0KEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFU1skcHJlZmVycmVkU3RhYmlsaXR5XSkpIHsKCnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdFeHBlY3RlZCBhIHZhbGlkIHN0YWJpbGl0eSBuYW1lIGFzIDNyZCBhcmd1bWVudCwgZ290ICcuJHByZWZlcnJlZFN0YWJpbGl0eSk7Cn0KCmlmIChudWxsID09PSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikgewokcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9IFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVOb3RoaW5nKCk7Cn0gZWxzZWlmICghKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSkpIHsKdHJpZ2dlcl9lcnJvcignVmVyc2lvblNlbGVjdG9yOjpmaW5kQmVzdENhbmRpZGF0ZSB3aXRoIGlnbm9yZWQgcGxhdGZvcm0gcmVxcyBhcyBib29sfGFycmF5IGlzIGRlcHJlY2F0ZWQgc2luY2UgQ29tcG9zZXIgMi4yLCB1c2UgYW4gaW5zdGFuY2Ugb2YgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6ZnJvbUJvb2xPckxpc3QoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwp9CgokY29uc3RyYWludCA9ICR0YXJnZXRQYWNrYWdlVmVyc2lvbiA/ICR0aGlzLT5nZXRQYXJzZXIoKS0+cGFyc2VDb25zdHJhaW50cygkdGFyZ2V0UGFja2FnZVZlcnNpb24pIDogbnVsbDsKJGNhbmRpZGF0ZXMgPSAkdGhpcy0+cmVwb3NpdG9yeVNldC0+ZmluZFBhY2thZ2VzKHN0cnRvbG93ZXIoJHBhY2thZ2VOYW1lKSwgJGNvbnN0cmFpbnQsICRyZXBvU2V0RmxhZ3MpOwoKJG1pblByaW9yaXR5ID0gQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTWyRwcmVmZXJyZWRTdGFiaWxpdHldOwp1c29ydCgkY2FuZGlkYXRlcywgc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRhLCBQYWNrYWdlSW50ZXJmYWNlICRiKSB1c2UgKCRtaW5Qcmlvcml0eSkgewokYVByaW9yaXR5ID0gJGEtPmdldFN0YWJpbGl0eVByaW9yaXR5KCk7CiRiUHJpb3JpdHkgPSAkYi0+Z2V0U3RhYmlsaXR5UHJpb3JpdHkoKTsKCgoKaWYgKCRtaW5Qcmlvcml0eSA8ICRhUHJpb3JpdHkgJiYgJGJQcmlvcml0eSA8ICRhUHJpb3JpdHkpIHsKcmV0dXJuIDE7Cn0KCgoKaWYgKCRtaW5Qcmlvcml0eSA8ICRhUHJpb3JpdHkgJiYgJGFQcmlvcml0eSA8ICRiUHJpb3JpdHkpIHsKcmV0dXJuIC0xOwp9CgoKCmlmICgkbWluUHJpb3JpdHkgPj0gJGFQcmlvcml0eSAmJiAkbWluUHJpb3JpdHkgPCAkYlByaW9yaXR5KSB7CnJldHVybiAtMTsKfQoKCnJldHVybiB2ZXJzaW9uX2NvbXBhcmUoJGItPmdldFZlcnNpb24oKSwgJGEtPmdldFZlcnNpb24oKSk7Cn0pOwoKaWYgKGNvdW50KCR0aGlzLT5wbGF0Zm9ybUNvbnN0cmFpbnRzKSA+IDAgJiYgISgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIElnbm9yZUFsbFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpKSB7CgokYWxyZWFkeVdhcm5lZE5hbWVzID0gW107CgokYWxyZWFkeVNlZW5OYW1lcyA9IFtdOwoKZm9yZWFjaCAoJGNhbmRpZGF0ZXMgYXMgJHBrZykgewokcmVxcyA9ICRwa2ctPmdldFJlcXVpcmVzKCk7CiRza2lwID0gZmFsc2U7CmZvcmVhY2ggKCRyZXFzIGFzICRuYW1lID0+ICRsaW5rKSB7CmlmICghUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmFtZSkgfHwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmlzSWdub3JlZCgkbmFtZSkpIHsKY29udGludWU7Cn0KaWYgKGlzc2V0KCR0aGlzLT5wbGF0Zm9ybUNvbnN0cmFpbnRzWyRuYW1lXSkpIHsKZm9yZWFjaCAoJHRoaXMtPnBsYXRmb3JtQ29uc3RyYWludHNbJG5hbWVdIGFzICRwcm92aWRlZENvbnN0cmFpbnQpIHsKaWYgKCRsaW5rLT5nZXRDb25zdHJhaW50KCktPm1hdGNoZXMoJHByb3ZpZGVkQ29uc3RyYWludCkpIHsKCmNvbnRpbnVlIDI7Cn0KaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgJiYgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmlzVXBwZXJCb3VuZElnbm9yZWQoJG5hbWUpKSB7CiRmaWx0ZXJlZENvbnN0cmFpbnQgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+ZmlsdGVyQ29uc3RyYWludCgkbmFtZSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSk7CmlmICgkZmlsdGVyZWRDb25zdHJhaW50LT5tYXRjaGVzKCRwcm92aWRlZENvbnN0cmFpbnQpKSB7Cgpjb250aW51ZSAyOwp9Cn0KfQoKCiRyZWFzb24gPSAnaXMgbm90IHNhdGlzZmllZCBieSB5b3VyIHBsYXRmb3JtJzsKfSBlbHNlIHsKCgokcmVhc29uID0gJ2lzIG1pc3NpbmcgZnJvbSB5b3VyIHBsYXRmb3JtJzsKfQoKJGlzTGF0ZXN0VmVyc2lvbiA9ICFpc3NldCgkYWxyZWFkeVNlZW5OYW1lc1skcGtnLT5nZXROYW1lKCldKTsKJGFscmVhZHlTZWVuTmFtZXNbJHBrZy0+Z2V0TmFtZSgpXSA9IHRydWU7CmlmICgkaW8gIT09IG51bGwgJiYgKCRzaG93V2FybmluZ3MgPT09IHRydWUgfHwgKGlzX2NhbGxhYmxlKCRzaG93V2FybmluZ3MpICYmICRzaG93V2FybmluZ3MoJHBrZykpKSkgewokaXNGaXJzdFdhcm5pbmcgPSAhaXNzZXQoJGFscmVhZHlXYXJuZWROYW1lc1skcGtnLT5nZXROYW1lKCkuJy8nLiRsaW5rLT5nZXRUYXJnZXQoKV0pOwokYWxyZWFkeVdhcm5lZE5hbWVzWyRwa2ctPmdldE5hbWUoKS4nLycuJGxpbmstPmdldFRhcmdldCgpXSA9IHRydWU7CiRsYXRlc3QgPSAkaXNMYXRlc3RWZXJzaW9uID8gIidzIGxhdGVzdCB2ZXJzaW9uIiA6ICcnOwokaW8tPndyaXRlRXJyb3IoCic8d2FybmluZz5DYW5ub3QgdXNlICcuJHBrZy0+Z2V0UHJldHR5TmFtZSgpLiRsYXRlc3QuJyAnLiRwa2ctPmdldFByZXR0eVZlcnNpb24oKS4nIGFzIGl0ICcuJGxpbmstPmdldERlc2NyaXB0aW9uKCkuJyAnLiRsaW5rLT5nZXRUYXJnZXQoKS4nICcuJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKS4nIHdoaWNoICcuJHJlYXNvbi4nLjwvPicsCnRydWUsCiRpc0ZpcnN0V2FybmluZyA/IElPSW50ZXJmYWNlOjpOT1JNQUwgOiBJT0ludGVyZmFjZTo6VkVSQk9TRQopOwp9CgoKJHNraXAgPSB0cnVlOwp9CgppZiAoJHNraXApIHsKY29udGludWU7Cn0KCiRwYWNrYWdlID0gJHBrZzsKYnJlYWs7Cn0KfSBlbHNlIHsKJHBhY2thZ2UgPSBjb3VudCgkY2FuZGlkYXRlcykgPiAwID8gJGNhbmRpZGF0ZXNbMF0gOiBudWxsOwp9CgppZiAoIWlzc2V0KCRwYWNrYWdlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgJHBhY2thZ2UtPmdldFZlcnNpb24oKSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgpyZXR1cm4gJHBhY2thZ2U7Cn0KCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFJlY29tbWVuZGVkUmVxdWlyZVZlcnNpb24oUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHN0cmluZwp7CgoKaWYgKDAgPT09IHN0cnBvcygkcGFja2FnZS0+Z2V0TmFtZSgpLCAnZXh0LScpKSB7CiRwaHBWZXJzaW9uID0gUEhQX01BSk9SX1ZFUlNJT04gLiAnLicgLiBQSFBfTUlOT1JfVkVSU0lPTiAuICcuJyAuIFBIUF9SRUxFQVNFX1ZFUlNJT047CiRleHRWZXJzaW9uID0gaW1wbG9kZSgnLicsIGFycmF5X3NsaWNlKGV4cGxvZGUoJy4nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSwgMCwgMykpOwppZiAoJHBocFZlcnNpb24gPT09ICRleHRWZXJzaW9uKSB7CnJldHVybiAnKic7Cn0KfQoKJHZlcnNpb24gPSAkcGFja2FnZS0+Z2V0VmVyc2lvbigpOwppZiAoISRwYWNrYWdlLT5pc0RldigpKSB7CnJldHVybiAkdGhpcy0+dHJhbnNmb3JtVmVyc2lvbigkdmVyc2lvbiwgJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSwgJHBhY2thZ2UtPmdldFN0YWJpbGl0eSgpKTsKfQoKJGxvYWRlciA9IG5ldyBBcnJheUxvYWRlcigkdGhpcy0+Z2V0UGFyc2VyKCkpOwokZHVtcGVyID0gbmV3IEFycmF5RHVtcGVyKCk7CiRleHRyYSA9ICRsb2FkZXItPmdldEJyYW5jaEFsaWFzKCRkdW1wZXItPmR1bXAoJHBhY2thZ2UpKTsKaWYgKCRleHRyYSAmJiAkZXh0cmEgIT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiRleHRyYSA9IFByZWc6OnJlcGxhY2UoJ3teKFxkK1wuXGQrXC5cZCspKFwuOTk5OTk5OSktZGV2JH0nLCAnJDEuMCcsICRleHRyYSwgLTEsICRjb3VudCk7CmlmICgkY291bnQgPiAwKSB7CiRleHRyYSA9IHN0cl9yZXBsYWNlKCcuOTk5OTk5OScsICcuMCcsICRleHRyYSk7CgpyZXR1cm4gJHRoaXMtPnRyYW5zZm9ybVZlcnNpb24oJGV4dHJhLCAkZXh0cmEsICdkZXYnKTsKfQp9CgpyZXR1cm4gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB0cmFuc2Zvcm1WZXJzaW9uKHN0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRwcmV0dHlWZXJzaW9uLCBzdHJpbmcgJHN0YWJpbGl0eSk6IHN0cmluZwp7CgoKJHNlbWFudGljVmVyc2lvblBhcnRzID0gZXhwbG9kZSgnLicsICR2ZXJzaW9uKTsKCgppZiAoY291bnQoJHNlbWFudGljVmVyc2lvblBhcnRzKSA9PT0gNCAmJiBQcmVnOjppc01hdGNoKCd7XlxkK1xEP30nLCAkc2VtYW50aWNWZXJzaW9uUGFydHNbM10pKSB7CgppZiAoJHNlbWFudGljVmVyc2lvblBhcnRzWzBdID09PSAnMCcpIHsKdW5zZXQoJHNlbWFudGljVmVyc2lvblBhcnRzWzNdKTsKfSBlbHNlIHsKdW5zZXQoJHNlbWFudGljVmVyc2lvblBhcnRzWzJdLCAkc2VtYW50aWNWZXJzaW9uUGFydHNbM10pOwp9CiR2ZXJzaW9uID0gaW1wbG9kZSgnLicsICRzZW1hbnRpY1ZlcnNpb25QYXJ0cyk7Cn0gZWxzZSB7CnJldHVybiAkcHJldHR5VmVyc2lvbjsKfQoKCmlmICgkc3RhYmlsaXR5ICE9PSAnc3RhYmxlJykgewokdmVyc2lvbiAuPSAnQCcuJHN0YWJpbGl0eTsKfQoKCnJldHVybiAnXicgLiAkdmVyc2lvbjsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQYXJzZXIoKTogVmVyc2lvblBhcnNlcgp7CmlmICgkdGhpcy0+cGFyc2VyID09PSBudWxsKSB7CiR0aGlzLT5wYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwp9CgpyZXR1cm4gJHRoaXMtPnBhcnNlcjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxMb29wOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5TWFuYWdlcjsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsYXRpb25NYW5hZ2VyOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKCgoKCmNsYXNzIFBhcnRpYWxDb21wb3Nlcgp7CgoKCnByaXZhdGUgJGdsb2JhbCA9IGZhbHNlOwoKCgoKcHJpdmF0ZSAkcGFja2FnZTsKCgoKCnByaXZhdGUgJGxvb3A7CgoKCgpwcml2YXRlICRyZXBvc2l0b3J5TWFuYWdlcjsKCgoKCnByaXZhdGUgJGluc3RhbGxhdGlvbk1hbmFnZXI7CgoKCgpwcml2YXRlICRjb25maWc7CgoKCgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7CgpwdWJsaWMgZnVuY3Rpb24gc2V0UGFja2FnZShSb290UGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewokdGhpcy0+cGFja2FnZSA9ICRwYWNrYWdlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZSgpOiBSb290UGFja2FnZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+cGFja2FnZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldENvbmZpZyhDb25maWcgJGNvbmZpZyk6IHZvaWQKewokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbmZpZygpOiBDb25maWcKewpyZXR1cm4gJHRoaXMtPmNvbmZpZzsKfQoKcHVibGljIGZ1bmN0aW9uIHNldExvb3AoTG9vcCAkbG9vcCk6IHZvaWQKewokdGhpcy0+bG9vcCA9ICRsb29wOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9vcCgpOiBMb29wCnsKcmV0dXJuICR0aGlzLT5sb29wOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yeU1hbmFnZXIoUmVwb3NpdG9yeU1hbmFnZXIgJG1hbmFnZXIpOiB2b2lkCnsKJHRoaXMtPnJlcG9zaXRvcnlNYW5hZ2VyID0gJG1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3J5TWFuYWdlcigpOiBSZXBvc2l0b3J5TWFuYWdlcgp7CnJldHVybiAkdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnN0YWxsYXRpb25NYW5hZ2VyKEluc3RhbGxhdGlvbk1hbmFnZXIgJG1hbmFnZXIpOiB2b2lkCnsKJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXIgPSAkbWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxhdGlvbk1hbmFnZXIoKTogSW5zdGFsbGF0aW9uTWFuYWdlcgp7CnJldHVybiAkdGhpcy0+aW5zdGFsbGF0aW9uTWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEV2ZW50RGlzcGF0Y2hlcihFdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlcik6IHZvaWQKewokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEV2ZW50RGlzcGF0Y2hlcigpOiBFdmVudERpc3BhdGNoZXIKewpyZXR1cm4gJHRoaXMtPmV2ZW50RGlzcGF0Y2hlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGlzR2xvYmFsKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmdsb2JhbDsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEdsb2JhbCgpOiB2b2lkCnsKJHRoaXMtPmdsb2JhbCA9IHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGxhdGZvcm07Cgp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGVjdXRhYmxlRmluZGVyOwoKY2xhc3MgSGh2bURldGVjdG9yCnsKCnByaXZhdGUgc3RhdGljICRoaHZtVmVyc2lvbiA9IG51bGw7Cgpwcml2YXRlICRleGVjdXRhYmxlRmluZGVyOwoKcHJpdmF0ZSAkcHJvY2Vzc0V4ZWN1dG9yOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9FeGVjdXRhYmxlRmluZGVyICRleGVjdXRhYmxlRmluZGVyID0gbnVsbCwgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2Vzc0V4ZWN1dG9yID0gbnVsbCkKewokdGhpcy0+ZXhlY3V0YWJsZUZpbmRlciA9ICRleGVjdXRhYmxlRmluZGVyOwokdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yID0gJHByb2Nlc3NFeGVjdXRvcjsKfQoKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCk6IHZvaWQKewpzZWxmOjokaGh2bVZlcnNpb24gPSBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiA/c3RyaW5nCnsKaWYgKG51bGwgIT09IHNlbGY6OiRoaHZtVmVyc2lvbikgewpyZXR1cm4gc2VsZjo6JGhodm1WZXJzaW9uID86IG51bGw7Cn0KCnNlbGY6OiRoaHZtVmVyc2lvbiA9IGRlZmluZWQoJ0hIVk1fVkVSU0lPTicpID8gSEhWTV9WRVJTSU9OIDogbnVsbDsKaWYgKHNlbGY6OiRoaHZtVmVyc2lvbiA9PT0gbnVsbCAmJiAhUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnNlbGY6OiRoaHZtVmVyc2lvbiA9IGZhbHNlOwokdGhpcy0+ZXhlY3V0YWJsZUZpbmRlciA9ICR0aGlzLT5leGVjdXRhYmxlRmluZGVyID86IG5ldyBFeGVjdXRhYmxlRmluZGVyKCk7CiRoaHZtUGF0aCA9ICR0aGlzLT5leGVjdXRhYmxlRmluZGVyLT5maW5kKCdoaHZtJyk7CmlmICgkaGh2bVBhdGggIT09IG51bGwpIHsKJHRoaXMtPnByb2Nlc3NFeGVjdXRvciA9ICR0aGlzLT5wcm9jZXNzRXhlY3V0b3IgPz8gbmV3IFByb2Nlc3NFeGVjdXRvcigpOwokZXhpdENvZGUgPSAkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yLT5leGVjdXRlKFskaGh2bVBhdGgsICctLXBocCcsICctZCcsICdoaHZtLmppdD0wJywgJy1yJywgJ2VjaG8gSEhWTV9WRVJTSU9OOyddLCBzZWxmOjokaGh2bVZlcnNpb24pOwppZiAoJGV4aXRDb2RlICE9PSAwKSB7CnNlbGY6OiRoaHZtVmVyc2lvbiA9IGZhbHNlOwp9Cn0KfQoKcmV0dXJuIHNlbGY6OiRoaHZtVmVyc2lvbiA/OiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsYXRmb3JtOwoKY2xhc3MgUnVudGltZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNDb25zdGFudChzdHJpbmcgJGNvbnN0YW50LCA/c3RyaW5nICRjbGFzcyA9IG51bGwpOiBib29sCnsKcmV0dXJuIGRlZmluZWQobHRyaW0oJGNsYXNzLic6OicuJGNvbnN0YW50LCAnOicpKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uc3RhbnQoc3RyaW5nICRjb25zdGFudCwgP3N0cmluZyAkY2xhc3MgPSBudWxsKQp7CnJldHVybiBjb25zdGFudChsdHJpbSgkY2xhc3MuJzo6Jy4kY29uc3RhbnQsICc6JykpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzRnVuY3Rpb24oc3RyaW5nICRmbik6IGJvb2wKewpyZXR1cm4gZnVuY3Rpb25fZXhpc3RzKCRmbik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGludm9rZShjYWxsYWJsZSAkY2FsbGFibGUsIGFycmF5ICRhcmd1bWVudHMgPSBbXSkKewpyZXR1cm4gJGNhbGxhYmxlKC4uLiRhcmd1bWVudHMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQ2xhc3Moc3RyaW5nICRjbGFzcyk6IGJvb2wKewpyZXR1cm4gY2xhc3NfZXhpc3RzKCRjbGFzcywgZmFsc2UpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29uc3RydWN0KHN0cmluZyAkY2xhc3MsIGFycmF5ICRhcmd1bWVudHMgPSBbXSk6IG9iamVjdAp7CmlmIChlbXB0eSgkYXJndW1lbnRzKSkgewpyZXR1cm4gbmV3ICRjbGFzczsKfQoKJHJlZmwgPSBuZXcgXFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpOwoKcmV0dXJuICRyZWZsLT5uZXdJbnN0YW5jZUFyZ3MoJGFyZ3VtZW50cyk7Cn0KCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucygpOiBhcnJheQp7CnJldHVybiBnZXRfbG9hZGVkX2V4dGVuc2lvbnMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEV4dGVuc2lvblZlcnNpb24oc3RyaW5nICRleHRlbnNpb24pOiBzdHJpbmcKewokdmVyc2lvbiA9IHBocHZlcnNpb24oJGV4dGVuc2lvbik7CmlmICgkdmVyc2lvbiA9PT0gZmFsc2UpIHsKJHZlcnNpb24gPSAnMCc7Cn0KCnJldHVybiAkdmVyc2lvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEV4dGVuc2lvbkluZm8oc3RyaW5nICRleHRlbnNpb24pOiBzdHJpbmcKewokcmVmbGVjdG9yID0gbmV3IFxSZWZsZWN0aW9uRXh0ZW5zaW9uKCRleHRlbnNpb24pOwoKb2Jfc3RhcnQoKTsKJHJlZmxlY3Rvci0+aW5mbygpOwoKcmV0dXJuIG9iX2dldF9jbGVhbigpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsYXRmb3JtOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIFZlcnNpb24KewoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFyc2VPcGVuc3NsKHN0cmluZyAkb3BlbnNzbFZlcnNpb24sID9ib29sICYkaXNGaXBzKTogP3N0cmluZwp7CiRpc0ZpcHMgPSBmYWxzZTsKCmlmICghUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL14oPzx2ZXJzaW9uPlswLTkuXSspKD88cGF0Y2g+W2Etel17MCwyfSkoPzxzdWZmaXg+KD86LT8oPzpkZXZ8cHJlfGFscGhhfGJldGF8cmN8ZmlwcylbXGRdKikqKSg/Oi1cdyspPyg/OiBcKC4rP1wpKT8kLycsICRvcGVuc3NsVmVyc2lvbiwgJG1hdGNoZXMpKSB7CnJldHVybiBudWxsOwp9CgoKJHBhdGNoID0gJyc7CmlmICh2ZXJzaW9uX2NvbXBhcmUoJG1hdGNoZXNbJ3ZlcnNpb24nXSwgJzMuMC4wJywgJzwnKSkgewokcGF0Y2ggPSAnLicuc2VsZjo6Y29udmVydEFscGhhVmVyc2lvblRvSW50VmVyc2lvbigkbWF0Y2hlc1sncGF0Y2gnXSk7Cn0KCiRpc0ZpcHMgPSBzdHJwb3MoJG1hdGNoZXNbJ3N1ZmZpeCddLCAnZmlwcycpICE9PSBmYWxzZTsKJHN1ZmZpeCA9IHN0cnRyKCctJy5sdHJpbSgkbWF0Y2hlc1snc3VmZml4J10sICctJyksIFsnLWZpcHMnID0+ICcnLCAnLXByZScgPT4gJy1hbHBoYSddKTsKCnJldHVybiBydHJpbSgkbWF0Y2hlc1sndmVyc2lvbiddLiRwYXRjaC4kc3VmZml4LCAnLScpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlTGlianBlZyhzdHJpbmcgJGxpYmpwZWdWZXJzaW9uKTogP3N0cmluZwp7CmlmICghUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL14oPzxtYWpvcj5cZCspKD88bWlub3I+W2Etel0qKSQvJywgJGxpYmpwZWdWZXJzaW9uLCAkbWF0Y2hlcykpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkbWF0Y2hlc1snbWFqb3InXS4nLicuc2VsZjo6Y29udmVydEFscGhhVmVyc2lvblRvSW50VmVyc2lvbigkbWF0Y2hlc1snbWlub3InXSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFyc2Vab25laW5mb1ZlcnNpb24oc3RyaW5nICR6b25laW5mb1ZlcnNpb24pOiA/c3RyaW5nCnsKaWYgKCFQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXig/PHllYXI+XGR7NH0pKD88cmV2aXNpb24+W2Etel0qKSQvJywgJHpvbmVpbmZvVmVyc2lvbiwgJG1hdGNoZXMpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJG1hdGNoZXNbJ3llYXInXS4nLicuc2VsZjo6Y29udmVydEFscGhhVmVyc2lvblRvSW50VmVyc2lvbigkbWF0Y2hlc1sncmV2aXNpb24nXSk7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvbnZlcnRBbHBoYVZlcnNpb25Ub0ludFZlcnNpb24oc3RyaW5nICRhbHBoYSk6IGludAp7CnJldHVybiBzdHJsZW4oJGFscGhhKSAqICgtb3JkKCdhJykgKyAxKSArIGFycmF5X3N1bShhcnJheV9tYXAoJ29yZCcsIHN0cl9zcGxpdCgkYWxwaGEpKSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29udmVydExpYnhwbVZlcnNpb25JZChpbnQgJHZlcnNpb25JZCk6IHN0cmluZwp7CnJldHVybiBzZWxmOjpjb252ZXJ0VmVyc2lvbklkKCR2ZXJzaW9uSWQsIDEwMCk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29udmVydE9wZW5sZGFwVmVyc2lvbklkKGludCAkdmVyc2lvbklkKTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6OmNvbnZlcnRWZXJzaW9uSWQoJHZlcnNpb25JZCwgMTAwKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY29udmVydFZlcnNpb25JZChpbnQgJHZlcnNpb25JZCwgaW50ICRiYXNlKTogc3RyaW5nCnsKcmV0dXJuIHNwcmludGYoCiclZC4lZC4lZCcsCiR2ZXJzaW9uSWQgLyAoJGJhc2UgKiAkYmFzZSksCihpbnQpICgkdmVyc2lvbklkIC8gJGJhc2UpICUgJGJhc2UsCiR2ZXJzaW9uSWQgJSAkYmFzZQopOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpblxDYXBhYmlsaXR5OwoKCgoKCgoKaW50ZXJmYWNlIENhcGFiaWxpdHkKewp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW5cQ2FwYWJpbGl0eTsKCgoKCgoKCgoKCgppbnRlcmZhY2UgQ29tbWFuZFByb3ZpZGVyIGV4dGVuZHMgQ2FwYWJpbGl0eQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1hbmRzKCk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCgoKCgoKCgppbnRlcmZhY2UgQ2FwYWJsZQp7CgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDYXBhYmlsaXRpZXMoKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIENvbW1hbmRFdmVudCBleHRlbmRzIEV2ZW50CnsKCgoKcHJpdmF0ZSAkY29tbWFuZE5hbWU7CgoKCgpwcml2YXRlICRpbnB1dDsKCgoKCnByaXZhdGUgJG91dHB1dDsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgc3RyaW5nICRjb21tYW5kTmFtZSwgSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgYXJyYXkgJGFyZ3MgPSBbXSwgYXJyYXkgJGZsYWdzID0gW10pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbmFtZSwgJGFyZ3MsICRmbGFncyk7CiR0aGlzLT5jb21tYW5kTmFtZSA9ICRjb21tYW5kTmFtZTsKJHRoaXMtPmlucHV0ID0gJGlucHV0OwokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElucHV0KCk6IElucHV0SW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5pbnB1dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE91dHB1dCgpOiBPdXRwdXRJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPm91dHB1dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1hbmROYW1lKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Y29tbWFuZE5hbWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKdXNlIFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbjsKCmNsYXNzIFBsdWdpbkJsb2NrZWRFeGNlcHRpb24gZXh0ZW5kcyBVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24Kewp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47CgoKCgoKCmNsYXNzIFBsdWdpbkV2ZW50cwp7CgoKCgoKCgoKcHVibGljIGNvbnN0IElOSVQgPSAnaW5pdCc7CgoKCgoKCgoKCnB1YmxpYyBjb25zdCBDT01NQU5EID0gJ2NvbW1hbmQnOwoKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX0ZJTEVfRE9XTkxPQUQgPSAncHJlLWZpbGUtZG93bmxvYWQnOwoKCgoKCgoKCgpwdWJsaWMgY29uc3QgUE9TVF9GSUxFX0RPV05MT0FEID0gJ3Bvc3QtZmlsZS1kb3dubG9hZCc7CgoKCgoKCgoKCnB1YmxpYyBjb25zdCBQUkVfQ09NTUFORF9SVU4gPSAncHJlLWNvbW1hbmQtcnVuJzsKCgoKCgoKCgoKCnB1YmxpYyBjb25zdCBQUkVfUE9PTF9DUkVBVEUgPSAncHJlLXBvb2wtY3JlYXRlJzsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CgoKCgoKCmludGVyZmFjZSBQbHVnaW5JbnRlcmZhY2UKewoKCgoKCgoKCgoKcHVibGljIGNvbnN0IFBMVUdJTl9BUElfVkVSU0lPTiA9ICcyLjYuMCc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhY3RpdmF0ZShDb21wb3NlciAkY29tcG9zZXIsIElPSW50ZXJmYWNlICRpbyk7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVhY3RpdmF0ZShDb21wb3NlciAkY29tcG9zZXIsIElPSW50ZXJmYWNlICRpbyk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbChDb21wb3NlciAkY29tcG9zZXIsIElPSW50ZXJmYWNlICRpbyk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudFN1YnNjcmliZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvY2tlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhcnRpYWxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVV0aWxzOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXENhcGFiaWxpdHlcQ2FwYWJpbGl0eTsKdXNlIENvbXBvc2VyXFV0aWxcUGFja2FnZVNvcnRlcjsKCgoKCgoKCmNsYXNzIFBsdWdpbk1hbmFnZXIKewoKcHJvdGVjdGVkICRjb21wb3NlcjsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGdsb2JhbENvbXBvc2VyOwoKcHJvdGVjdGVkICR2ZXJzaW9uUGFyc2VyOwoKcHJvdGVjdGVkICRkaXNhYmxlUGx1Z2lucyA9IGZhbHNlOwoKCnByb3RlY3RlZCAkcGx1Z2lucyA9IFtdOwoKcHJvdGVjdGVkICRyZWdpc3RlcmVkUGx1Z2lucyA9IFtdOwoKCgoKcHJpdmF0ZSAkYWxsb3dQbHVnaW5SdWxlczsKCgoKCnByaXZhdGUgJGFsbG93R2xvYmFsUGx1Z2luUnVsZXM7CgoKcHJpdmF0ZSAkcnVubmluZ0luR2xvYmFsRGlyID0gZmFsc2U7CgoKcHJpdmF0ZSBzdGF0aWMgJGNsYXNzQ291bnRlciA9IDA7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb21wb3NlciAkY29tcG9zZXIsID9QYXJ0aWFsQ29tcG9zZXIgJGdsb2JhbENvbXBvc2VyID0gbnVsbCwgJGRpc2FibGVQbHVnaW5zID0gZmFsc2UpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29tcG9zZXIgPSAkY29tcG9zZXI7CiR0aGlzLT5nbG9iYWxDb21wb3NlciA9ICRnbG9iYWxDb21wb3NlcjsKJHRoaXMtPnZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokdGhpcy0+ZGlzYWJsZVBsdWdpbnMgPSAkZGlzYWJsZVBsdWdpbnM7CiR0aGlzLT5hbGxvd1BsdWdpblJ1bGVzID0gJHRoaXMtPnBhcnNlQWxsb3dlZFBsdWdpbnMoJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdhbGxvdy1wbHVnaW5zJyksICRjb21wb3Nlci0+Z2V0TG9ja2VyKCkpOwokdGhpcy0+YWxsb3dHbG9iYWxQbHVnaW5SdWxlcyA9ICR0aGlzLT5wYXJzZUFsbG93ZWRQbHVnaW5zKCRnbG9iYWxDb21wb3NlciAhPT0gbnVsbCA/ICRnbG9iYWxDb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYWxsb3ctcGx1Z2lucycpIDogZmFsc2UpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UnVubmluZ0luR2xvYmFsRGlyKGJvb2wgJHJ1bm5pbmdJbkdsb2JhbERpcik6IHZvaWQKewokdGhpcy0+cnVubmluZ0luR2xvYmFsRGlyID0gJHJ1bm5pbmdJbkdsb2JhbERpcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWRJbnN0YWxsZWRQbHVnaW5zKCk6IHZvaWQKewppZiAoISR0aGlzLT5hcmVQbHVnaW5zRGlzYWJsZWQoJ2xvY2FsJykpIHsKJHJlcG8gPSAkdGhpcy0+Y29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwokdGhpcy0+bG9hZFJlcG9zaXRvcnkoJHJlcG8sIGZhbHNlLCAkdGhpcy0+Y29tcG9zZXItPmdldFBhY2thZ2UoKSk7Cn0KCmlmICgkdGhpcy0+Z2xvYmFsQ29tcG9zZXIgIT09IG51bGwgJiYgISR0aGlzLT5hcmVQbHVnaW5zRGlzYWJsZWQoJ2dsb2JhbCcpKSB7CiR0aGlzLT5sb2FkUmVwb3NpdG9yeSgkdGhpcy0+Z2xvYmFsQ29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpLCB0cnVlKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVhY3RpdmF0ZUluc3RhbGxlZFBsdWdpbnMoKTogdm9pZAp7CmlmICghJHRoaXMtPmFyZVBsdWdpbnNEaXNhYmxlZCgnbG9jYWwnKSkgewokcmVwbyA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiR0aGlzLT5kZWFjdGl2YXRlUmVwb3NpdG9yeSgkcmVwbywgZmFsc2UpOwp9CgppZiAoJHRoaXMtPmdsb2JhbENvbXBvc2VyICE9PSBudWxsICYmICEkdGhpcy0+YXJlUGx1Z2luc0Rpc2FibGVkKCdnbG9iYWwnKSkgewokdGhpcy0+ZGVhY3RpdmF0ZVJlcG9zaXRvcnkoJHRoaXMtPmdsb2JhbENvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKSwgdHJ1ZSk7Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGx1Z2lucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cGx1Z2luczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEdsb2JhbENvbXBvc2VyKCk6ID9QYXJ0aWFsQ29tcG9zZXIKewpyZXR1cm4gJHRoaXMtPmdsb2JhbENvbXBvc2VyOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZWdpc3RlclBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYm9vbCAkZmFpbE9uTWlzc2luZ0NsYXNzZXMgPSBmYWxzZSwgYm9vbCAkaXNHbG9iYWxQbHVnaW4gPSBmYWxzZSk6IHZvaWQKewppZiAoJHRoaXMtPmFyZVBsdWdpbnNEaXNhYmxlZCgkaXNHbG9iYWxQbHVnaW4gPyAnZ2xvYmFsJyA6ICdsb2NhbCcpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+VGhlICInLiRwYWNrYWdlLT5nZXROYW1lKCkuJyIgcGx1Z2luIHdhcyBub3QgbG9hZGVkIGFzIHBsdWdpbnMgYXJlIGRpc2FibGVkLjwvd2FybmluZz4nKTsKcmV0dXJuOwp9CgppZiAoJHBhY2thZ2UtPmdldFR5cGUoKSA9PT0gJ2NvbXBvc2VyLXBsdWdpbicpIHsKJHJlcXVpcmVzQ29tcG9zZXIgPSBudWxsOwpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgeyAKaWYgKCdjb21wb3Nlci1wbHVnaW4tYXBpJyA9PT0gJGxpbmstPmdldFRhcmdldCgpKSB7CiRyZXF1aXJlc0NvbXBvc2VyID0gJGxpbmstPmdldENvbnN0cmFpbnQoKTsKYnJlYWs7Cn0KfQoKaWYgKCEkcmVxdWlyZXNDb21wb3Nlcikgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIlBsdWdpbiAiLiRwYWNrYWdlLT5nZXROYW1lKCkuIiBpcyBtaXNzaW5nIGEgcmVxdWlyZSBzdGF0ZW1lbnQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgY29tcG9zZXItcGx1Z2luLWFwaSBwYWNrYWdlLiIpOwp9CgokY3VycmVudFBsdWdpbkFwaVZlcnNpb24gPSAkdGhpcy0+Z2V0UGx1Z2luQXBpVmVyc2lvbigpOwokY3VycmVudFBsdWdpbkFwaUNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRjdXJyZW50UGx1Z2luQXBpVmVyc2lvbikpOwoKaWYgKCRyZXF1aXJlc0NvbXBvc2VyLT5nZXRQcmV0dHlTdHJpbmcoKSA9PT0gJHRoaXMtPmdldFBsdWdpbkFwaVZlcnNpb24oKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlRoZSAiJyAuICRwYWNrYWdlLT5nZXROYW1lKCkgLiAnIiBwbHVnaW4gcmVxdWlyZXMgY29tcG9zZXItcGx1Z2luLWFwaSAnLiR0aGlzLT5nZXRQbHVnaW5BcGlWZXJzaW9uKCkuJywgdGhpcyAqV0lMTCogYnJlYWsgaW4gdGhlIGZ1dHVyZSBhbmQgaXQgc2hvdWxkIGJlIGZpeGVkIEFTQVAgKHJlcXVpcmUgXicuJHRoaXMtPmdldFBsdWdpbkFwaVZlcnNpb24oKS4nIGluc3RlYWQgZm9yIGV4YW1wbGUpLjwvd2FybmluZz4nKTsKfSBlbHNlaWYgKCEkcmVxdWlyZXNDb21wb3Nlci0+bWF0Y2hlcygkY3VycmVudFBsdWdpbkFwaUNvbnN0cmFpbnQpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+VGhlICInIC4gJHBhY2thZ2UtPmdldE5hbWUoKSAuICciIHBsdWdpbiAnLigkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA/ICcoaW5zdGFsbGVkIGdsb2JhbGx5KSAnIDogJycpLid3YXMgc2tpcHBlZCBiZWNhdXNlIGl0IHJlcXVpcmVzIGEgUGx1Z2luIEFQSSB2ZXJzaW9uICgiJyAuICRyZXF1aXJlc0NvbXBvc2VyLT5nZXRQcmV0dHlTdHJpbmcoKSAuICciKSB0aGF0IGRvZXMgbm90IG1hdGNoIHlvdXIgQ29tcG9zZXIgaW5zdGFsbGF0aW9uICgiJyAuICRjdXJyZW50UGx1Z2luQXBpVmVyc2lvbiAuICciKS4gWW91IG1heSBuZWVkIHRvIHJ1biBjb21wb3NlciB1cGRhdGUgd2l0aCB0aGUgIi0tbm8tcGx1Z2lucyIgb3B0aW9uLjwvd2FybmluZz4nKTsKCnJldHVybjsKfQoKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgPT09ICdzeW1mb255L2ZsZXgnICYmIFByZWc6OmlzTWF0Y2goJ3teWzAtOS5dKyR9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkgJiYgdmVyc2lvbl9jb21wYXJlKCRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICcxLjkuOCcsICc8JykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgIicgLiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4gJyIgcGx1Z2luICcuKCRpc0dsb2JhbFBsdWdpbiB8fCAkdGhpcy0+cnVubmluZ0luR2xvYmFsRGlyID8gJyhpbnN0YWxsZWQgZ2xvYmFsbHkpICcgOiAnJykuJ3dhcyBza2lwcGVkIGJlY2F1c2UgaXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBDb21wb3NlciAyKy4gTWFrZSBzdXJlIHRvIHVwZGF0ZSBpdCB0byB2ZXJzaW9uIDEuOS44IG9yIGdyZWF0ZXIuPC93YXJuaW5nPicpOwoKcmV0dXJuOwp9Cn0KCmlmICghJHRoaXMtPmlzUGx1Z2luQWxsb3dlZCgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkaXNHbG9iYWxQbHVnaW4sIHRydWUgPT09ICgkcGFja2FnZS0+Z2V0RXh0cmEoKVsncGx1Z2luLW9wdGlvbmFsJ10gPz8gZmFsc2UpKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1NraXBwZWQgbG9hZGluZyAiJy4kcGFja2FnZS0+Z2V0TmFtZSgpIC4gJyIgJy4oJGlzR2xvYmFsUGx1Z2luIHx8ICR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIgPyAnKGluc3RhbGxlZCBnbG9iYWxseSkgJyA6ICcnKS4nYXMgaXQgaXMgbm90IGluIGNvbmZpZy5hbGxvdy1wbHVnaW5zJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCnJldHVybjsKfQoKJG9sZEluc3RhbGxlclBsdWdpbiA9ICgkcGFja2FnZS0+Z2V0VHlwZSgpID09PSAnY29tcG9zZXItaW5zdGFsbGVyJyk7CgppZiAoaXNzZXQoJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewpyZXR1cm47Cn0KJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldID0gW107CgokZXh0cmEgPSAkcGFja2FnZS0+Z2V0RXh0cmEoKTsKaWYgKGVtcHR5KCRleHRyYVsnY2xhc3MnXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0Vycm9yIHdoaWxlIGluc3RhbGxpbmcgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicsIGNvbXBvc2VyLXBsdWdpbiBwYWNrYWdlcyBzaG91bGQgaGF2ZSBhIGNsYXNzIGRlZmluZWQgaW4gdGhlaXIgZXh0cmEga2V5IHRvIGJlIHVzYWJsZS4nKTsKfQokY2xhc3NlcyA9IGlzX2FycmF5KCRleHRyYVsnY2xhc3MnXSkgPyAkZXh0cmFbJ2NsYXNzJ10gOiBbJGV4dHJhWydjbGFzcyddXTsKCiRsb2NhbFJlcG8gPSAkdGhpcy0+Y29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwokZ2xvYmFsUmVwbyA9ICR0aGlzLT5nbG9iYWxDb21wb3NlciAhPT0gbnVsbCA/ICR0aGlzLT5nbG9iYWxDb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCkgOiBudWxsOwoKJHJvb3RQYWNrYWdlID0gY2xvbmUgJHRoaXMtPmNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CgoKCiRyb290UGFja2FnZUF1dG9sb2FkcyA9ICRyb290UGFja2FnZS0+Z2V0QXV0b2xvYWQoKTsKJHJvb3RQYWNrYWdlQXV0b2xvYWRzWydmaWxlcyddID0gW107CiRyb290UGFja2FnZS0+c2V0QXV0b2xvYWQoJHJvb3RQYWNrYWdlQXV0b2xvYWRzKTsKJHJvb3RQYWNrYWdlQXV0b2xvYWRzID0gJHJvb3RQYWNrYWdlLT5nZXREZXZBdXRvbG9hZCgpOwokcm9vdFBhY2thZ2VBdXRvbG9hZHNbJ2ZpbGVzJ10gPSBbXTsKJHJvb3RQYWNrYWdlLT5zZXREZXZBdXRvbG9hZCgkcm9vdFBhY2thZ2VBdXRvbG9hZHMpOwp1bnNldCgkcm9vdFBhY2thZ2VBdXRvbG9hZHMpOwoKJHJvb3RQYWNrYWdlUmVwbyA9IG5ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoJHJvb3RQYWNrYWdlKTsKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJGxvY2FsUmVwbywgJHJvb3RQYWNrYWdlUmVwb10pOwppZiAoJGdsb2JhbFJlcG8pIHsKJGluc3RhbGxlZFJlcG8tPmFkZFJlcG9zaXRvcnkoJGdsb2JhbFJlcG8pOwp9CgokYXV0b2xvYWRQYWNrYWdlcyA9IFskcGFja2FnZS0+Z2V0TmFtZSgpID0+ICRwYWNrYWdlXTsKJGF1dG9sb2FkUGFja2FnZXMgPSAkdGhpcy0+Y29sbGVjdERlcGVuZGVuY2llcygkaW5zdGFsbGVkUmVwbywgJGF1dG9sb2FkUGFja2FnZXMsICRwYWNrYWdlKTsKCiRnZW5lcmF0b3IgPSAkdGhpcy0+Y29tcG9zZXItPmdldEF1dG9sb2FkR2VuZXJhdG9yKCk7CiRhdXRvbG9hZHMgPSBbWyRyb290UGFja2FnZSwgJyddXTsKZm9yZWFjaCAoJGF1dG9sb2FkUGFja2FnZXMgYXMgJGF1dG9sb2FkUGFja2FnZSkgewppZiAoJGF1dG9sb2FkUGFja2FnZSA9PT0gJHJvb3RQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CgokaW5zdGFsbFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJGF1dG9sb2FkUGFja2FnZSwgJGdsb2JhbFJlcG8gJiYgJGdsb2JhbFJlcG8tPmhhc1BhY2thZ2UoJGF1dG9sb2FkUGFja2FnZSkpOwppZiAoJGluc3RhbGxQYXRoID09PSBudWxsKSB7CmNvbnRpbnVlOwp9CiRhdXRvbG9hZHNbXSA9IFskYXV0b2xvYWRQYWNrYWdlLCAkaW5zdGFsbFBhdGhdOwp9CgokbWFwID0gJGdlbmVyYXRvci0+cGFyc2VBdXRvbG9hZHMoJGF1dG9sb2FkcywgJHJvb3RQYWNrYWdlKTsKJGNsYXNzTG9hZGVyID0gJGdlbmVyYXRvci0+Y3JlYXRlTG9hZGVyKCRtYXAsICR0aGlzLT5jb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgndmVuZG9yLWRpcicpKTsKJGNsYXNzTG9hZGVyLT5yZWdpc3RlcihmYWxzZSk7Cgpmb3JlYWNoICgkbWFwWydmaWxlcyddIGFzICRmaWxlSWRlbnRpZmllciA9PiAkZmlsZSkgewoKCgppZiAoJGZpbGVJZGVudGlmaWVyID09PSAnN2U5YmQ2MTJjYzQ0NGIzZWVkNzg4ZWJiZTQ2MjYzYTAnKSB7CmNvbnRpbnVlOwp9ClxDb21wb3NlclxBdXRvbG9hZFxjb21wb3NlclJlcXVpcmUoJGZpbGVJZGVudGlmaWVyLCAkZmlsZSk7Cn0KCmZvcmVhY2ggKCRjbGFzc2VzIGFzICRjbGFzcykgewppZiAoY2xhc3NfZXhpc3RzKCRjbGFzcywgZmFsc2UpKSB7CiRjbGFzcyA9IHRyaW0oJGNsYXNzLCAnXFwnKTsKJHBhdGggPSAkY2xhc3NMb2FkZXItPmZpbmRGaWxlKCRjbGFzcyk7CiRjb2RlID0gZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwokc2VwYXJhdG9yUG9zID0gc3RycnBvcygkY2xhc3MsICdcXCcpOwokY2xhc3NOYW1lID0gJGNsYXNzOwppZiAoJHNlcGFyYXRvclBvcykgewokY2xhc3NOYW1lID0gc3Vic3RyKCRjbGFzcywgJHNlcGFyYXRvclBvcyArIDEpOwp9CiRjb2RlID0gUHJlZzo6cmVwbGFjZSgne14oKD86KD86ZmluYWx8cmVhZG9ubHkpXHMrKSooPzpccyopKWNsYXNzXHMrKCcucHJlZ19xdW90ZSgkY2xhc3NOYW1lKS4nKX1taScsICckMWNsYXNzICQyX2NvbXBvc2VyX3RtcCcuc2VsZjo6JGNsYXNzQ291bnRlciwgJGNvZGUsIDEpOwokY29kZSA9IHN0cnRyKCRjb2RlLCBbCidfX0ZJTEVfXycgPT4gdmFyX2V4cG9ydCgkcGF0aCwgdHJ1ZSksCidfX0RJUl9fJyA9PiB2YXJfZXhwb3J0KGRpcm5hbWUoJHBhdGgpLCB0cnVlKSwKJ19fQ0xBU1NfXycgPT4gdmFyX2V4cG9ydCgkY2xhc3MsIHRydWUpLApdKTsKJGNvZGUgPSBQcmVnOjpyZXBsYWNlKCcvXlxzKjxcPyhwaHApPy9pJywgJycsICRjb2RlLCAxKTsKZXZhbCgkY29kZSk7CiRjbGFzcyAuPSAnX2NvbXBvc2VyX3RtcCcuc2VsZjo6JGNsYXNzQ291bnRlcjsKc2VsZjo6JGNsYXNzQ291bnRlcisrOwp9CgppZiAoJG9sZEluc3RhbGxlclBsdWdpbikgewppZiAoIWlzX2EoJGNsYXNzLCAnQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxlckludGVyZmFjZScsIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGFjdGl2YXRlIHBsdWdpbiAiJy4kcGFja2FnZS0+Z2V0TmFtZSgpLiciIGFzICInLiRjbGFzcy4nIiBkb2VzIG5vdCBpbXBsZW1lbnQgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxlckludGVyZmFjZScpOwp9CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+TG9hZGluZyAiJy4kcGFja2FnZS0+Z2V0TmFtZSgpIC4gJyIgJy4oJGlzR2xvYmFsUGx1Z2luIHx8ICR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIgPyAnKGluc3RhbGxlZCBnbG9iYWxseSkgJyA6ICcnKS4nd2hpY2ggaXMgYSBsZWdhY3kgY29tcG9zZXItaW5zdGFsbGVyIGJ1aWx0IGZvciBDb21wb3NlciAxLngsIGl0IGlzIGxpa2VseSB0byBjYXVzZSBpc3N1ZXMgYXMgeW91IGFyZSBydW5uaW5nIENvbXBvc2VyIDIueC48L3dhcm5pbmc+Jyk7CiRpbnN0YWxsZXIgPSBuZXcgJGNsYXNzKCR0aGlzLT5pbywgJHRoaXMtPmNvbXBvc2VyKTsKJHRoaXMtPmNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPmFkZEluc3RhbGxlcigkaW5zdGFsbGVyKTsKJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldW10gPSAkaW5zdGFsbGVyOwp9IGVsc2VpZiAoY2xhc3NfZXhpc3RzKCRjbGFzcykpIHsKaWYgKCFpc19hKCRjbGFzcywgJ0NvbXBvc2VyXFBsdWdpblxQbHVnaW5JbnRlcmZhY2UnLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBhY3RpdmF0ZSBwbHVnaW4gIicuJHBhY2thZ2UtPmdldE5hbWUoKS4nIiBhcyAiJy4kY2xhc3MuJyIgZG9lcyBub3QgaW1wbGVtZW50IENvbXBvc2VyXFBsdWdpblxQbHVnaW5JbnRlcmZhY2UnKTsKfQokcGx1Z2luID0gbmV3ICRjbGFzcygpOwokdGhpcy0+YWRkUGx1Z2luKCRwbHVnaW4sICRpc0dsb2JhbFBsdWdpbiwgJHBhY2thZ2UpOwokdGhpcy0+cmVnaXN0ZXJlZFBsdWdpbnNbJHBhY2thZ2UtPmdldE5hbWUoKV1bXSA9ICRwbHVnaW47Cn0gZWxzZWlmICgkZmFpbE9uTWlzc2luZ0NsYXNzZXMpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1BsdWdpbiAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJyBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQsIGNsYXNzIG5vdCBmb3VuZDogJy4kY2xhc3MpOwp9Cn0KfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVhY3RpdmF0ZVBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewppZiAoIWlzc2V0KCR0aGlzLT5yZWdpc3RlcmVkUGx1Z2luc1skcGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKcmV0dXJuOwp9CgokcGx1Z2lucyA9ICR0aGlzLT5yZWdpc3RlcmVkUGx1Z2luc1skcGFja2FnZS0+Z2V0TmFtZSgpXTsKZm9yZWFjaCAoJHBsdWdpbnMgYXMgJHBsdWdpbikgewppZiAoJHBsdWdpbiBpbnN0YW5jZW9mIEluc3RhbGxlckludGVyZmFjZSkgewokdGhpcy0+Y29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+cmVtb3ZlSW5zdGFsbGVyKCRwbHVnaW4pOwp9IGVsc2UgewokdGhpcy0+cmVtb3ZlUGx1Z2luKCRwbHVnaW4pOwp9Cn0KdW5zZXQoJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CmlmICghaXNzZXQoJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewpyZXR1cm47Cn0KCiRwbHVnaW5zID0gJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldOwpmb3JlYWNoICgkcGx1Z2lucyBhcyAkcGx1Z2luKSB7CmlmICgkcGx1Z2luIGluc3RhbmNlb2YgSW5zdGFsbGVySW50ZXJmYWNlKSB7CiR0aGlzLT5jb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5yZW1vdmVJbnN0YWxsZXIoJHBsdWdpbik7Cn0gZWxzZSB7CiR0aGlzLT5yZW1vdmVQbHVnaW4oJHBsdWdpbik7CiR0aGlzLT51bmluc3RhbGxQbHVnaW4oJHBsdWdpbik7Cn0KfQp1bnNldCgkdGhpcy0+cmVnaXN0ZXJlZFBsdWdpbnNbJHBhY2thZ2UtPmdldE5hbWUoKV0pOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGx1Z2luQXBpVmVyc2lvbigpOiBzdHJpbmcKewpyZXR1cm4gUGx1Z2luSW50ZXJmYWNlOjpQTFVHSU5fQVBJX1ZFUlNJT047Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUGx1Z2luKFBsdWdpbkludGVyZmFjZSAkcGx1Z2luLCBib29sICRpc0dsb2JhbFBsdWdpbiA9IGZhbHNlLCA/UGFja2FnZUludGVyZmFjZSAkc291cmNlUGFja2FnZSA9IG51bGwpOiB2b2lkCnsKaWYgKCR0aGlzLT5hcmVQbHVnaW5zRGlzYWJsZWQoJGlzR2xvYmFsUGx1Z2luID8gJ2dsb2JhbCcgOiAnbG9jYWwnKSkgewpyZXR1cm47Cn0KCmlmICgkc291cmNlUGFja2FnZSA9PT0gbnVsbCkgewp0cmlnZ2VyX2Vycm9yKCdDYWxsaW5nIFBsdWdpbk1hbmFnZXI6OmFkZFBsdWdpbiB3aXRob3V0ICRzb3VyY2VQYWNrYWdlIGlzIGRlcHJlY2F0ZWQsIGlmIHlvdSBhcmUgdXNpbmcgdGhpcyBwbGVhc2UgZ2V0IGluIHRvdWNoIHdpdGggdXMgdG8gZXhwbGFpbiB0aGUgdXNlIGNhc2UnLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0gZWxzZWlmICghJHRoaXMtPmlzUGx1Z2luQWxsb3dlZCgkc291cmNlUGFja2FnZS0+Z2V0TmFtZSgpLCAkaXNHbG9iYWxQbHVnaW4sIHRydWUgPT09ICgkc291cmNlUGFja2FnZS0+Z2V0RXh0cmEoKVsncGx1Z2luLW9wdGlvbmFsJ10gPz8gZmFsc2UpKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1NraXBwZWQgbG9hZGluZyAiJy5nZXRfY2xhc3MoJHBsdWdpbikuJyBmcm9tICcuJHNvdXJjZVBhY2thZ2UtPmdldE5hbWUoKSAuICciICcuKCRpc0dsb2JhbFBsdWdpbiB8fCAkdGhpcy0+cnVubmluZ0luR2xvYmFsRGlyID8gJyhpbnN0YWxsZWQgZ2xvYmFsbHkpICcgOiAnJykuJyBhcyBpdCBpcyBub3QgaW4gY29uZmlnLmFsbG93LXBsdWdpbnMnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKcmV0dXJuOwp9CgokZGV0YWlscyA9IFtdOwppZiAoJHNvdXJjZVBhY2thZ2UpIHsKJGRldGFpbHNbXSA9ICdmcm9tICcuJHNvdXJjZVBhY2thZ2UtPmdldE5hbWUoKTsKfQppZiAoJGlzR2xvYmFsUGx1Z2luIHx8ICR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIpIHsKJGRldGFpbHNbXSA9ICdpbnN0YWxsZWQgZ2xvYmFsbHknOwp9CiR0aGlzLT5pby0+d3JpdGVFcnJvcignTG9hZGluZyBwbHVnaW4gJy5nZXRfY2xhc3MoJHBsdWdpbikuKCRkZXRhaWxzID8gJyAoJy5pbXBsb2RlKCcsICcsICRkZXRhaWxzKS4nKScgOiAnJyksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5wbHVnaW5zW10gPSAkcGx1Z2luOwokcGx1Z2luLT5hY3RpdmF0ZSgkdGhpcy0+Y29tcG9zZXIsICR0aGlzLT5pbyk7CgppZiAoJHBsdWdpbiBpbnN0YW5jZW9mIEV2ZW50U3Vic2NyaWJlckludGVyZmFjZSkgewokdGhpcy0+Y29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5hZGRTdWJzY3JpYmVyKCRwbHVnaW4pOwp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVQbHVnaW4oUGx1Z2luSW50ZXJmYWNlICRwbHVnaW4pOiB2b2lkCnsKJGluZGV4ID0gYXJyYXlfc2VhcmNoKCRwbHVnaW4sICR0aGlzLT5wbHVnaW5zLCB0cnVlKTsKaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKcmV0dXJuOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1VubG9hZGluZyBwbHVnaW4gJy5nZXRfY2xhc3MoJHBsdWdpbiksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CnVuc2V0KCR0aGlzLT5wbHVnaW5zWyRpbmRleF0pOwokcGx1Z2luLT5kZWFjdGl2YXRlKCR0aGlzLT5jb21wb3NlciwgJHRoaXMtPmlvKTsKCiR0aGlzLT5jb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPnJlbW92ZUxpc3RlbmVyKCRwbHVnaW4pOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsUGx1Z2luKFBsdWdpbkludGVyZmFjZSAkcGx1Z2luKTogdm9pZAp7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignVW5pbnN0YWxsaW5nIHBsdWdpbiAnLmdldF9jbGFzcygkcGx1Z2luKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHBsdWdpbi0+dW5pbnN0YWxsKCR0aGlzLT5jb21wb3NlciwgJHRoaXMtPmlvKTsKfQoKCgoKCgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2FkUmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBib29sICRpc0dsb2JhbFJlcG8sID9Sb290UGFja2FnZUludGVyZmFjZSAkcm9vdFBhY2thZ2UgPSBudWxsKTogdm9pZAp7CiRwYWNrYWdlcyA9ICRyZXBvLT5nZXRQYWNrYWdlcygpOwoKJHdlaWdodHMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZS0+Z2V0VHlwZSgpID09PSAnY29tcG9zZXItcGx1Z2luJykgewokZXh0cmEgPSAkcGFja2FnZS0+Z2V0RXh0cmEoKTsKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgPT09ICdjb21wb3Nlci9pbnN0YWxsZXJzJyB8fCB0cnVlID09PSAoJGV4dHJhWydwbHVnaW4tbW9kaWZpZXMtaW5zdGFsbC1wYXRoJ10gPz8gZmFsc2UpKSB7CiR3ZWlnaHRzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gLTEwMDAwOwp9Cn0KfQoKJHNvcnRlZFBhY2thZ2VzID0gUGFja2FnZVNvcnRlcjo6c29ydFBhY2thZ2VzKCRwYWNrYWdlcywgJHdlaWdodHMpOwppZiAoISRpc0dsb2JhbFJlcG8pIHsKJHJlcXVpcmVkUGFja2FnZXMgPSBSZXBvc2l0b3J5VXRpbHM6OmZpbHRlclJlcXVpcmVkUGFja2FnZXMoJHBhY2thZ2VzLCAkcm9vdFBhY2thZ2UsIHRydWUpOwp9Cgpmb3JlYWNoICgkc29ydGVkUGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCEoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2UpKSB7CmNvbnRpbnVlOwp9CgppZiAoIWluX2FycmF5KCRwYWNrYWdlLT5nZXRUeXBlKCksIFsnY29tcG9zZXItcGx1Z2luJywgJ2NvbXBvc2VyLWluc3RhbGxlciddLCB0cnVlKSkgewpjb250aW51ZTsKfQoKaWYgKAohJGlzR2xvYmFsUmVwbwomJiAhaW5fYXJyYXkoJHBhY2thZ2UsICRyZXF1aXJlZFBhY2thZ2VzLCB0cnVlKQomJiAhJHRoaXMtPmlzUGx1Z2luQWxsb3dlZCgkcGFja2FnZS0+Z2V0TmFtZSgpLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpCikgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlRoZSAiJy4kcGFja2FnZS0+Z2V0TmFtZSgpLiciIHBsdWdpbiB3YXMgbm90IGxvYWRlZCBhcyBpdCBpcyBub3QgbGlzdGVkIGluIGFsbG93LXBsdWdpbnMgYW5kIGlzIG5vdCByZXF1aXJlZCBieSB0aGUgcm9vdCBwYWNrYWdlIGFueW1vcmUuPC93YXJuaW5nPicpOwpjb250aW51ZTsKfQoKaWYgKCdjb21wb3Nlci1wbHVnaW4nID09PSAkcGFja2FnZS0+Z2V0VHlwZSgpKSB7CiR0aGlzLT5yZWdpc3RlclBhY2thZ2UoJHBhY2thZ2UsIGZhbHNlLCAkaXNHbG9iYWxSZXBvKTsKCn0gZWxzZWlmICgnY29tcG9zZXItaW5zdGFsbGVyJyA9PT0gJHBhY2thZ2UtPmdldFR5cGUoKSkgewokdGhpcy0+cmVnaXN0ZXJQYWNrYWdlKCRwYWNrYWdlLCBmYWxzZSwgJGlzR2xvYmFsUmVwbyk7Cn0KfQp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkZWFjdGl2YXRlUmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBib29sICRpc0dsb2JhbFJlcG8pOiB2b2lkCnsKJHBhY2thZ2VzID0gJHJlcG8tPmdldFBhY2thZ2VzKCk7CiRzb3J0ZWRQYWNrYWdlcyA9IGFycmF5X3JldmVyc2UoUGFja2FnZVNvcnRlcjo6c29ydFBhY2thZ2VzKCRwYWNrYWdlcykpOwoKZm9yZWFjaCAoJHNvcnRlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICghKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlKSkgewpjb250aW51ZTsKfQppZiAoJ2NvbXBvc2VyLXBsdWdpbicgPT09ICRwYWNrYWdlLT5nZXRUeXBlKCkpIHsKJHRoaXMtPmRlYWN0aXZhdGVQYWNrYWdlKCRwYWNrYWdlKTsKCn0gZWxzZWlmICgnY29tcG9zZXItaW5zdGFsbGVyJyA9PT0gJHBhY2thZ2UtPmdldFR5cGUoKSkgewokdGhpcy0+ZGVhY3RpdmF0ZVBhY2thZ2UoJHBhY2thZ2UpOwp9Cn0KfQoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjb2xsZWN0RGVwZW5kZW5jaWVzKEluc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8sIGFycmF5ICRjb2xsZWN0ZWQsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBhcnJheQp7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRyZXF1aXJlTGluaykgewpmb3JlYWNoICgkaW5zdGFsbGVkUmVwby0+ZmluZFBhY2thZ2VzV2l0aFJlcGxhY2Vyc0FuZFByb3ZpZGVycygkcmVxdWlyZUxpbmstPmdldFRhcmdldCgpKSBhcyAkcmVxdWlyZWRQYWNrYWdlKSB7CmlmICghaXNzZXQoJGNvbGxlY3RlZFskcmVxdWlyZWRQYWNrYWdlLT5nZXROYW1lKCldKSkgewokY29sbGVjdGVkWyRyZXF1aXJlZFBhY2thZ2UtPmdldE5hbWUoKV0gPSAkcmVxdWlyZWRQYWNrYWdlOwokY29sbGVjdGVkID0gJHRoaXMtPmNvbGxlY3REZXBlbmRlbmNpZXMoJGluc3RhbGxlZFJlcG8sICRjb2xsZWN0ZWQsICRyZXF1aXJlZFBhY2thZ2UpOwp9Cn0KfQoKcmV0dXJuICRjb2xsZWN0ZWQ7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEluc3RhbGxQYXRoKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGJvb2wgJGdsb2JhbCA9IGZhbHNlKTogP3N0cmluZwp7CmlmICghJGdsb2JhbCkgewpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKfQoKYXNzZXJ0KG51bGwgIT09ICR0aGlzLT5nbG9iYWxDb21wb3Nlcik7CgpyZXR1cm4gJHRoaXMtPmdsb2JhbENvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDYXBhYmlsaXR5SW1wbGVtZW50YXRpb25DbGFzc05hbWUoUGx1Z2luSW50ZXJmYWNlICRwbHVnaW4sIHN0cmluZyAkY2FwYWJpbGl0eSk6ID9zdHJpbmcKewppZiAoISgkcGx1Z2luIGluc3RhbmNlb2YgQ2FwYWJsZSkpIHsKcmV0dXJuIG51bGw7Cn0KCiRjYXBhYmlsaXRpZXMgPSAoYXJyYXkpICRwbHVnaW4tPmdldENhcGFiaWxpdGllcygpOwoKaWYgKCFlbXB0eSgkY2FwYWJpbGl0aWVzWyRjYXBhYmlsaXR5XSkgJiYgaXNfc3RyaW5nKCRjYXBhYmlsaXRpZXNbJGNhcGFiaWxpdHldKSAmJiB0cmltKCRjYXBhYmlsaXRpZXNbJGNhcGFiaWxpdHldKSkgewpyZXR1cm4gdHJpbSgkY2FwYWJpbGl0aWVzWyRjYXBhYmlsaXR5XSk7Cn0KCmlmICgKYXJyYXlfa2V5X2V4aXN0cygkY2FwYWJpbGl0eSwgJGNhcGFiaWxpdGllcykKJiYgKGVtcHR5KCRjYXBhYmlsaXRpZXNbJGNhcGFiaWxpdHldKSB8fCAhaXNfc3RyaW5nKCRjYXBhYmlsaXRpZXNbJGNhcGFiaWxpdHldKSB8fCAhdHJpbSgkY2FwYWJpbGl0aWVzWyRjYXBhYmlsaXR5XSkpCikgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignUGx1Z2luICcuZ2V0X2NsYXNzKCRwbHVnaW4pLicgcHJvdmlkZWQgaW52YWxpZCBjYXBhYmlsaXR5IGNsYXNzIG5hbWUocyksIGdvdCAnLnZhcl9leHBvcnQoJGNhcGFiaWxpdGllc1skY2FwYWJpbGl0eV0sIHRydWUpKTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQbHVnaW5DYXBhYmlsaXR5KFBsdWdpbkludGVyZmFjZSAkcGx1Z2luLCAkY2FwYWJpbGl0eUNsYXNzTmFtZSwgYXJyYXkgJGN0b3JBcmdzID0gW10pOiA/Q2FwYWJpbGl0eQp7CmlmICgkY2FwYWJpbGl0eUNsYXNzID0gJHRoaXMtPmdldENhcGFiaWxpdHlJbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSgkcGx1Z2luLCAkY2FwYWJpbGl0eUNsYXNzTmFtZSkpIHsKaWYgKCFjbGFzc19leGlzdHMoJGNhcGFiaWxpdHlDbGFzcykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFudGlhdGUgQ2FwYWJpbGl0eSwgYXMgY2xhc3MgJGNhcGFiaWxpdHlDbGFzcyBmcm9tIHBsdWdpbiAiLmdldF9jbGFzcygkcGx1Z2luKS4iIGRvZXMgbm90IGV4aXN0LiIpOwp9CgokY3RvckFyZ3NbJ3BsdWdpbiddID0gJHBsdWdpbjsKJGNhcGFiaWxpdHlPYmogPSBuZXcgJGNhcGFiaWxpdHlDbGFzcygkY3RvckFyZ3MpOwoKCmlmICghJGNhcGFiaWxpdHlPYmogaW5zdGFuY2VvZiBDYXBhYmlsaXR5IHx8ICEkY2FwYWJpbGl0eU9iaiBpbnN0YW5jZW9mICRjYXBhYmlsaXR5Q2xhc3NOYW1lKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKJ0NsYXNzICcgLiAkY2FwYWJpbGl0eUNsYXNzIC4gJyBtdXN0IGltcGxlbWVudCBib3RoIENvbXBvc2VyXFBsdWdpblxDYXBhYmlsaXR5XENhcGFiaWxpdHkgYW5kICcuICRjYXBhYmlsaXR5Q2xhc3NOYW1lIC4gJy4nCik7Cn0KCnJldHVybiAkY2FwYWJpbGl0eU9iajsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBsdWdpbkNhcGFiaWxpdGllcygkY2FwYWJpbGl0eUNsYXNzTmFtZSwgYXJyYXkgJGN0b3JBcmdzID0gW10pOiBhcnJheQp7CiRjYXBhYmlsaXRpZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmdldFBsdWdpbnMoKSBhcyAkcGx1Z2luKSB7CiRjYXBhYmlsaXR5ID0gJHRoaXMtPmdldFBsdWdpbkNhcGFiaWxpdHkoJHBsdWdpbiwgJGNhcGFiaWxpdHlDbGFzc05hbWUsICRjdG9yQXJncyk7CmlmIChudWxsICE9PSAkY2FwYWJpbGl0eSkgewokY2FwYWJpbGl0aWVzW10gPSAkY2FwYWJpbGl0eTsKfQp9CgpyZXR1cm4gJGNhcGFiaWxpdGllczsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcGFyc2VBbGxvd2VkUGx1Z2lucygkYWxsb3dQbHVnaW5zQ29uZmlnLCA/TG9ja2VyICRsb2NrZXIgPSBudWxsKTogP2FycmF5CnsKaWYgKFtdID09PSAkYWxsb3dQbHVnaW5zQ29uZmlnICYmICRsb2NrZXIgIT09IG51bGwgJiYgJGxvY2tlci0+aXNMb2NrZWQoKSAmJiB2ZXJzaW9uX2NvbXBhcmUoJGxvY2tlci0+Z2V0UGx1Z2luQXBpKCksICcyLjIuMCcsICc8JykpIHsKcmV0dXJuIG51bGw7Cn0KCmlmICh0cnVlID09PSAkYWxsb3dQbHVnaW5zQ29uZmlnKSB7CnJldHVybiBbJ3t9JyA9PiB0cnVlXTsKfQoKaWYgKGZhbHNlID09PSAkYWxsb3dQbHVnaW5zQ29uZmlnKSB7CnJldHVybiBbJ3t9JyA9PiBmYWxzZV07Cn0KCiRydWxlcyA9IFtdOwpmb3JlYWNoICgkYWxsb3dQbHVnaW5zQ29uZmlnIGFzICRwYXR0ZXJuID0+ICRhbGxvdykgewokcnVsZXNbQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJHBhdHRlcm4pXSA9ICRhbGxvdzsKfQoKcmV0dXJuICRydWxlczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFyZVBsdWdpbnNEaXNhYmxlZCgkdHlwZSkKewpyZXR1cm4gJHRoaXMtPmRpc2FibGVQbHVnaW5zID09PSB0cnVlIHx8ICR0aGlzLT5kaXNhYmxlUGx1Z2lucyA9PT0gJHR5cGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXNhYmxlUGx1Z2lucygpOiB2b2lkCnsKJHRoaXMtPmRpc2FibGVQbHVnaW5zID0gdHJ1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUGx1Z2luQWxsb3dlZChzdHJpbmcgJHBhY2thZ2UsIGJvb2wgJGlzR2xvYmFsUGx1Z2luLCBib29sICRvcHRpb25hbCA9IGZhbHNlLCBib29sICRwcm9tcHQgPSB0cnVlKTogYm9vbAp7CmlmICgkaXNHbG9iYWxQbHVnaW4pIHsKJHJ1bGVzID0gJiR0aGlzLT5hbGxvd0dsb2JhbFBsdWdpblJ1bGVzOwp9IGVsc2UgewokcnVsZXMgPSAmJHRoaXMtPmFsbG93UGx1Z2luUnVsZXM7Cn0KCgoKaWYgKCRydWxlcyA9PT0gbnVsbCkgewppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Rm9yIGFkZGl0aW9uYWwgc2VjdXJpdHkgeW91IHNob3VsZCBkZWNsYXJlIHRoZSBhbGxvdy1wbHVnaW5zIGNvbmZpZyB3aXRoIGEgbGlzdCBvZiBwYWNrYWdlcyBuYW1lcyB0aGF0IGFyZSBhbGxvd2VkIHRvIHJ1biBjb2RlLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvYWxsb3ctcGx1Z2luczwvd2FybmluZz4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGlzIHdhcm5pbmcgd2lsbCBiZWNvbWUgYW4gZXhjZXB0aW9uIG9uY2UgeW91IHJ1biBjb21wb3NlciB1cGRhdGUhPC93YXJuaW5nPicpOwoKJHJ1bGVzID0gWyd7fScgPT4gdHJ1ZV07CgoKcmV0dXJuIHRydWU7Cn0KCgokcnVsZXMgPSBbXTsKfQoKZm9yZWFjaCAoJHJ1bGVzIGFzICRwYXR0ZXJuID0+ICRhbGxvdykgewppZiAoUHJlZzo6aXNNYXRjaCgkcGF0dGVybiwgJHBhY2thZ2UpKSB7CnJldHVybiAkYWxsb3cgPT09IHRydWU7Cn0KfQoKaWYgKCRwYWNrYWdlID09PSAnY29tcG9zZXIvcGFja2FnZS12ZXJzaW9ucy1kZXByZWNhdGVkJykgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSAmJiAkcHJvbXB0KSB7CiRjb21wb3NlciA9ICRpc0dsb2JhbFBsdWdpbiAmJiAkdGhpcy0+Z2xvYmFsQ29tcG9zZXIgIT09IG51bGwgPyAkdGhpcy0+Z2xvYmFsQ29tcG9zZXIgOiAkdGhpcy0+Y29tcG9zZXI7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJHBhY2thZ2UuKCRpc0dsb2JhbFBsdWdpbiB8fCAkdGhpcy0+cnVubmluZ0luR2xvYmFsRGlyID8gJyAoaW5zdGFsbGVkIGdsb2JhbGx5KScgOiAnJykuJyBjb250YWlucyBhIENvbXBvc2VyIHBsdWdpbiB3aGljaCBpcyBjdXJyZW50bHkgbm90IGluIHlvdXIgYWxsb3ctcGx1Z2lucyBjb25maWcuIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9hbGxvdy1wbHVnaW5zPC93YXJuaW5nPicpOwokYXR0ZW1wdHMgPSAwOwp3aGlsZSAodHJ1ZSkgewoKCiRkZWZhdWx0ID0gJz8nOwppZiAoJGF0dGVtcHRzID4gNSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1RvbyBtYW55IGZhaWxlZCBwcm9tcHRzLCBhYm9ydGluZy4nKTsKYnJlYWs7Cn0KCnN3aXRjaCAoJGFuc3dlciA9ICR0aGlzLT5pby0+YXNrKCdEbyB5b3UgdHJ1c3QgIjxmZz1ncmVlbjtvcHRpb25zPWJvbGQ+Jy4kcGFja2FnZS4nPC8+IiB0byBleGVjdXRlIGNvZGUgYW5kIHdpc2ggdG8gZW5hYmxlIGl0IG5vdz8gKHdyaXRlcyAiYWxsb3ctcGx1Z2lucyIgdG8gY29tcG9zZXIuanNvbikgWzxjb21tZW50PnksbixkLD88L2NvbW1lbnQ+XSAnLCAkZGVmYXVsdCkpIHsKY2FzZSAneSc6CmNhc2UgJ24nOgpjYXNlICdkJzoKJGFsbG93ID0gJGFuc3dlciA9PT0gJ3knOwoKCiRydWxlc1tCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGFja2FnZSldID0gJGFsbG93OwoKCmlmICgkYW5zd2VyID09PSAneScgfHwgJGFuc3dlciA9PT0gJ24nKSB7CiRhbGxvd1BsdWdpbnMgPSAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2FsbG93LXBsdWdpbnMnKTsKaWYgKGlzX2FycmF5KCRhbGxvd1BsdWdpbnMpKSB7CiRhbGxvd1BsdWdpbnNbJHBhY2thZ2VdID0gJGFsbG93OwppZiAoJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdzb3J0LXBhY2thZ2VzJykpIHsKa3NvcnQoJGFsbG93UGx1Z2lucyk7Cn0KJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0Q29uZmlnU291cmNlKCktPmFkZENvbmZpZ1NldHRpbmcoJ2FsbG93LXBsdWdpbnMnLCAkYWxsb3dQbHVnaW5zKTsKJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+bWVyZ2UoWydjb25maWcnID0+IFsnYWxsb3ctcGx1Z2lucycgPT4gJGFsbG93UGx1Z2luc11dKTsKfQp9CgpyZXR1cm4gJGFsbG93OwoKY2FzZSAnPyc6CmRlZmF1bHQ6CiRhdHRlbXB0cysrOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoWwoneSAtIGFkZCBwYWNrYWdlIHRvIGFsbG93LXBsdWdpbnMgaW4gY29tcG9zZXIuanNvbiBhbmQgbGV0IGl0IHJ1biBpbW1lZGlhdGVseScsCiduIC0gYWRkIHBhY2thZ2UgKGFzIGRpc2FsbG93ZWQpIHRvIGFsbG93LXBsdWdpbnMgaW4gY29tcG9zZXIuanNvbiB0byBzdXBwcmVzcyBmdXJ0aGVyIHByb21wdHMnLAonZCAtIGRpc2NhcmQgdGhpcywgZG8gbm90IGNoYW5nZSBjb21wb3Nlci5qc29uIGFuZCBkbyBub3QgYWxsb3cgdGhlIHBsdWdpbiB0byBydW4nLAonPyAtIHByaW50IGhlbHAnLApdKTsKYnJlYWs7Cn0KfQp9IGVsc2VpZiAoJG9wdGlvbmFsKSB7CnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFBsdWdpbkJsb2NrZWRFeGNlcHRpb24oCiRwYWNrYWdlLigkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA/ICcgKGluc3RhbGxlZCBnbG9iYWxseSknIDogJycpLicgY29udGFpbnMgYSBDb21wb3NlciBwbHVnaW4gd2hpY2ggaXMgYmxvY2tlZCBieSB5b3VyIGFsbG93LXBsdWdpbnMgY29uZmlnLiBZb3UgbWF5IGFkZCBpdCB0byB0aGUgbGlzdCBpZiB5b3UgY29uc2lkZXIgaXQgc2FmZS4nLlBIUF9FT0wuCidZb3UgY2FuIHJ1biAiY29tcG9zZXIgJy4oJGlzR2xvYmFsUGx1Z2luIHx8ICR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIgPyAnZ2xvYmFsICcgOiAnJykuJ2NvbmZpZyAtLW5vLXBsdWdpbnMgYWxsb3ctcGx1Z2lucy4nLiRwYWNrYWdlLicgW3RydWV8ZmFsc2VdIiB0byBlbmFibGUgaXQgKHRydWUpIG9yIGRpc2FibGUgaXQgZXhwbGljaXRseSBhbmQgc3VwcHJlc3MgdGhpcyBleGNlcHRpb24gKGZhbHNlKScuUEhQX0VPTC4KJ1NlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9hbGxvdy1wbHVnaW5zJwopOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQ7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIFBvc3RGaWxlRG93bmxvYWRFdmVudCBleHRlbmRzIEV2ZW50CnsKCgoKcHJpdmF0ZSAkZmlsZU5hbWU7CgoKCgpwcml2YXRlICRjaGVja3N1bTsKCgoKCnByaXZhdGUgJHVybDsKCgoKCnByaXZhdGUgJGNvbnRleHQ7CgoKCgpwcml2YXRlICR0eXBlOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsID9zdHJpbmcgJGZpbGVOYW1lLCA/c3RyaW5nICRjaGVja3N1bSwgc3RyaW5nICR1cmwsIHN0cmluZyAkdHlwZSwgJGNvbnRleHQgPSBudWxsKQp7CgppZiAoJGNvbnRleHQgPT09IG51bGwgJiYgJHR5cGUgaW5zdGFuY2VvZiBQYWNrYWdlSW50ZXJmYWNlKSB7CiRjb250ZXh0ID0gJHR5cGU7CiR0eXBlID0gJ3BhY2thZ2UnOwp0cmlnZ2VyX2Vycm9yKCdQb3N0RmlsZURvd25sb2FkRXZlbnQ6Ol9fY29uc3RydWN0IHNob3VsZCByZWNlaXZlIGEgJHR5cGU9cGFja2FnZSBhbmQgdGhlIHBhY2thZ2Ugb2JqZWN0IGluICRjb250ZXh0IHNpbmNlIENvbXBvc2VyIDIuMS4nLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJG5hbWUpOwokdGhpcy0+ZmlsZU5hbWUgPSAkZmlsZU5hbWU7CiR0aGlzLT5jaGVja3N1bSA9ICRjaGVja3N1bTsKJHRoaXMtPnVybCA9ICR1cmw7CiR0aGlzLT5jb250ZXh0ID0gJGNvbnRleHQ7CiR0aGlzLT50eXBlID0gJHR5cGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVOYW1lKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmZpbGVOYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hlY2tzdW0oKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+Y2hlY2tzdW07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT51cmw7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRleHQoKQp7CnJldHVybiAkdGhpcy0+Y29udGV4dDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZSgpOiA/UGFja2FnZUludGVyZmFjZQp7CnRyaWdnZXJfZXJyb3IoJ1Bvc3RGaWxlRG93bmxvYWRFdmVudDo6Z2V0UGFja2FnZSBpcyBkZXByZWNhdGVkIHNpbmNlIENvbXBvc2VyIDIuMSwgdXNlIGdldENvbnRleHQgaW5zdGVhZC4nLCBFX1VTRVJfREVQUkVDQVRFRCk7CiRjb250ZXh0ID0gJHRoaXMtPmdldENvbnRleHQoKTsKCnJldHVybiAkY29udGV4dCBpbnN0YW5jZW9mIFBhY2thZ2VJbnRlcmZhY2UgPyAkY29udGV4dCA6IG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dHlwZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47Cgp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKCgoKCgoKY2xhc3MgUHJlQ29tbWFuZFJ1bkV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRpbnB1dDsKCgoKCnByaXZhdGUgJGNvbW1hbmQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBJbnB1dEludGVyZmFjZSAkaW5wdXQsIHN0cmluZyAkY29tbWFuZCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lKTsKJHRoaXMtPmlucHV0ID0gJGlucHV0OwokdGhpcy0+Y29tbWFuZCA9ICRjb21tYW5kOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXQoKTogSW5wdXRJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmlucHV0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmNvbW1hbmQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CgoKCgoKCmNsYXNzIFByZUZpbGVEb3dubG9hZEV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCgoKCnByaXZhdGUgJHByb2Nlc3NlZFVybDsKCgoKCnByaXZhdGUgJGN1c3RvbUNhY2hlS2V5OwoKCgoKcHJpdmF0ZSAkdHlwZTsKCgoKCnByaXZhdGUgJGNvbnRleHQ7CgoKCgpwcml2YXRlICR0cmFuc3BvcnRPcHRpb25zID0gW107CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyLCBzdHJpbmcgJHByb2Nlc3NlZFVybCwgc3RyaW5nICR0eXBlLCAkY29udGV4dCA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbmFtZSk7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPnByb2Nlc3NlZFVybCA9ICRwcm9jZXNzZWRVcmw7CiR0aGlzLT50eXBlID0gJHR5cGU7CiR0aGlzLT5jb250ZXh0ID0gJGNvbnRleHQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRIdHRwRG93bmxvYWRlcigpOiBIdHRwRG93bmxvYWRlcgp7CnJldHVybiAkdGhpcy0+aHR0cERvd25sb2FkZXI7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb2Nlc3NlZFVybCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnByb2Nlc3NlZFVybDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJvY2Vzc2VkVXJsKHN0cmluZyAkcHJvY2Vzc2VkVXJsKTogdm9pZAp7CiR0aGlzLT5wcm9jZXNzZWRVcmwgPSAkcHJvY2Vzc2VkVXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VzdG9tQ2FjaGVLZXkoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+Y3VzdG9tQ2FjaGVLZXk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEN1c3RvbUNhY2hlS2V5KD9zdHJpbmcgJGN1c3RvbUNhY2hlS2V5KTogdm9pZAp7CiR0aGlzLT5jdXN0b21DYWNoZUtleSA9ICRjdXN0b21DYWNoZUtleTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT50eXBlOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZXh0KCkKewpyZXR1cm4gJHRoaXMtPmNvbnRleHQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0T3B0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+dHJhbnNwb3J0T3B0aW9uczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUcmFuc3BvcnRPcHRpb25zKGFycmF5ICRvcHRpb25zKTogdm9pZAp7CiR0aGlzLT50cmFuc3BvcnRPcHRpb25zID0gJG9wdGlvbnM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxSZXF1ZXN0Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKCgoKCgoKY2xhc3MgUHJlUG9vbENyZWF0ZUV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRyZXBvc2l0b3JpZXM7CgoKCnByaXZhdGUgJHJlcXVlc3Q7CgoKCgpwcml2YXRlICRhY2NlcHRhYmxlU3RhYmlsaXRpZXM7CgoKCgpwcml2YXRlICRzdGFiaWxpdHlGbGFnczsKCgoKCnByaXZhdGUgJHJvb3RBbGlhc2VzOwoKCgoKcHJpdmF0ZSAkcm9vdFJlZmVyZW5jZXM7CgoKCnByaXZhdGUgJHBhY2thZ2VzOwoKCgpwcml2YXRlICR1bmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzOwoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgYXJyYXkgJHJlcG9zaXRvcmllcywgUmVxdWVzdCAkcmVxdWVzdCwgYXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgYXJyYXkgJHN0YWJpbGl0eUZsYWdzLCBhcnJheSAkcm9vdEFsaWFzZXMsIGFycmF5ICRyb290UmVmZXJlbmNlcywgYXJyYXkgJHBhY2thZ2VzLCBhcnJheSAkdW5hY2NlcHRhYmxlRml4ZWRQYWNrYWdlcykKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lKTsKCiR0aGlzLT5yZXBvc2l0b3JpZXMgPSAkcmVwb3NpdG9yaWVzOwokdGhpcy0+cmVxdWVzdCA9ICRyZXF1ZXN0OwokdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzID0gJGFjY2VwdGFibGVTdGFiaWxpdGllczsKJHRoaXMtPnN0YWJpbGl0eUZsYWdzID0gJHN0YWJpbGl0eUZsYWdzOwokdGhpcy0+cm9vdEFsaWFzZXMgPSAkcm9vdEFsaWFzZXM7CiR0aGlzLT5yb290UmVmZXJlbmNlcyA9ICRyb290UmVmZXJlbmNlczsKJHRoaXMtPnBhY2thZ2VzID0gJHBhY2thZ2VzOwokdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRQYWNrYWdlcyA9ICR1bmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yaWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3JpZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXF1ZXN0KCk6IFJlcXVlc3QKewpyZXR1cm4gJHRoaXMtPnJlcXVlc3Q7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWNjZXB0YWJsZVN0YWJpbGl0aWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5RmxhZ3MoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnN0YWJpbGl0eUZsYWdzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RBbGlhc2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yb290QWxpYXNlczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290UmVmZXJlbmNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cm9vdFJlZmVyZW5jZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cGFja2FnZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVbmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT51bmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzKTogdm9pZAp7CiR0aGlzLT5wYWNrYWdlcyA9ICRwYWNrYWdlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFVuYWNjZXB0YWJsZUZpeGVkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzKTogdm9pZAp7CiR0aGlzLT51bmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzID0gJHBhY2thZ2VzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFF1ZXN0aW9uOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cUXVlc3Rpb247CgoKCgoKCgoKY2xhc3MgU3RyaWN0Q29uZmlybWF0aW9uUXVlc3Rpb24gZXh0ZW5kcyBRdWVzdGlvbgp7Cgpwcml2YXRlICR0cnVlQW5zd2VyUmVnZXg7Cgpwcml2YXRlICRmYWxzZUFuc3dlclJlZ2V4OwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRxdWVzdGlvbiwgYm9vbCAkZGVmYXVsdCA9IHRydWUsIHN0cmluZyAkdHJ1ZUFuc3dlclJlZ2V4ID0gJy9eeSg/OmVzKT8kL2knLCBzdHJpbmcgJGZhbHNlQW5zd2VyUmVnZXggPSAnL15ubz8kL2knKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHF1ZXN0aW9uLCAkZGVmYXVsdCk7CgokdGhpcy0+dHJ1ZUFuc3dlclJlZ2V4ID0gJHRydWVBbnN3ZXJSZWdleDsKJHRoaXMtPmZhbHNlQW5zd2VyUmVnZXggPSAkZmFsc2VBbnN3ZXJSZWdleDsKJHRoaXMtPnNldE5vcm1hbGl6ZXIoJHRoaXMtPmdldERlZmF1bHROb3JtYWxpemVyKCkpOwokdGhpcy0+c2V0VmFsaWRhdG9yKCR0aGlzLT5nZXREZWZhdWx0VmFsaWRhdG9yKCkpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldERlZmF1bHROb3JtYWxpemVyKCk6IGNhbGxhYmxlCnsKJGRlZmF1bHQgPSAkdGhpcy0+Z2V0RGVmYXVsdCgpOwokdHJ1ZVJlZ2V4ID0gJHRoaXMtPnRydWVBbnN3ZXJSZWdleDsKJGZhbHNlUmVnZXggPSAkdGhpcy0+ZmFsc2VBbnN3ZXJSZWdleDsKCnJldHVybiBzdGF0aWMgZnVuY3Rpb24gKCRhbnN3ZXIpIHVzZSAoJGRlZmF1bHQsICR0cnVlUmVnZXgsICRmYWxzZVJlZ2V4KSB7CmlmIChpc19ib29sKCRhbnN3ZXIpKSB7CnJldHVybiAkYW5zd2VyOwp9CmlmIChlbXB0eSgkYW5zd2VyKSAmJiAhZW1wdHkoJGRlZmF1bHQpKSB7CnJldHVybiAkZGVmYXVsdDsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJHRydWVSZWdleCwgJGFuc3dlcikpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChQcmVnOjppc01hdGNoKCRmYWxzZVJlZ2V4LCAkYW5zd2VyKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiBudWxsOwp9Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldERlZmF1bHRWYWxpZGF0b3IoKTogY2FsbGFibGUKewpyZXR1cm4gc3RhdGljIGZ1bmN0aW9uICgkYW5zd2VyKTogYm9vbCB7CmlmICghaXNfYm9vbCgkYW5zd2VyKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQbGVhc2UgYW5zd2VyIHllcywgeSwgbm8sIG9yIG4uJyk7Cn0KCnJldHVybiAkYW5zd2VyOwp9Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFBhcnRpYWxTZWN1cml0eUFkdmlzb3J5Owp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcU2VjdXJpdHlBZHZpc29yeTsKCgoKCgoKCmludGVyZmFjZSBBZHZpc29yeVByb3ZpZGVySW50ZXJmYWNlCnsKcHVibGljIGZ1bmN0aW9uIGhhc1NlY3VyaXR5QWR2aXNvcmllcygpOiBib29sOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTZWN1cml0eUFkdmlzb3JpZXMoYXJyYXkgJHBhY2thZ2VDb25zdHJhaW50TWFwLCBib29sICRhbGxvd1BhcnRpYWxBZHZpc29yaWVzID0gZmFsc2UpOiBhcnJheTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFN0YWJpbGl0eUZpbHRlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50OwoKCgoKCgpjbGFzcyBBcnJheVJlcG9zaXRvcnkgaW1wbGVtZW50cyBSZXBvc2l0b3J5SW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkcGFja2FnZXMgPSBudWxsOwoKCgoKcHJvdGVjdGVkICRwYWNrYWdlTWFwID0gbnVsbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcGFja2FnZXMgPSBbXSkKewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHRoaXMtPmFkZFBhY2thZ2UoJHBhY2thZ2UpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpCnsKcmV0dXJuICdhcnJheSByZXBvIChkZWZpbmluZyAnLiR0aGlzLT5jb3VudCgpLicgcGFja2FnZScuKCR0aGlzLT5jb3VudCgpID4gMSA/ICdzJyA6ICcnKS4nKSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lTWFwLCBhcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGFycmF5ICRhbHJlYWR5TG9hZGVkID0gW10pCnsKJHBhY2thZ2VzID0gJHRoaXMtPmdldFBhY2thZ2VzKCk7CgokcmVzdWx0ID0gW107CiRuYW1lc0ZvdW5kID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoYXJyYXlfa2V5X2V4aXN0cygkcGFja2FnZS0+Z2V0TmFtZSgpLCAkcGFja2FnZU5hbWVNYXApKSB7CmlmICgKKCEkcGFja2FnZU5hbWVNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0gfHwgJHBhY2thZ2VOYW1lTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldLT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9PScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSkKJiYgU3RhYmlsaXR5RmlsdGVyOjppc1BhY2thZ2VBY2NlcHRhYmxlKCRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncywgJHBhY2thZ2UtPmdldE5hbWVzKCksICRwYWNrYWdlLT5nZXRTdGFiaWxpdHkoKSkKJiYgIWlzc2V0KCRhbHJlYWR5TG9hZGVkWyRwYWNrYWdlLT5nZXROYW1lKCldWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldKQopIHsKCiRyZXN1bHRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAhaXNzZXQoJHJlc3VsdFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UtPmdldEFsaWFzT2YoKSldKSkgewokcmVzdWx0W3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZS0+Z2V0QWxpYXNPZigpKV0gPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9Cn0KCiRuYW1lc0ZvdW5kWyRwYWNrYWdlLT5nZXROYW1lKCldID0gdHJ1ZTsKfQp9CgoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewppZiAoaXNzZXQoJHJlc3VsdFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UtPmdldEFsaWFzT2YoKSldKSkgewokcmVzdWx0W3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldID0gJHBhY2thZ2U7Cn0KfQp9CgpyZXR1cm4gWyduYW1lc0ZvdW5kJyA9PiBhcnJheV9rZXlzKCRuYW1lc0ZvdW5kKSwgJ3BhY2thZ2VzJyA9PiAkcmVzdWx0XTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlKHN0cmluZyAkbmFtZSwgJGNvbnN0cmFpbnQpCnsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKCmlmICghJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50SW50ZXJmYWNlKSB7CiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJGNvbnN0cmFpbnQgPSAkdmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludCk7Cn0KCmZvcmVhY2ggKCR0aGlzLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkbmFtZSA9PT0gJHBhY2thZ2UtPmdldE5hbWUoKSkgewokcGtnQ29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9PScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpOwppZiAoJGNvbnN0cmFpbnQtPm1hdGNoZXMoJHBrZ0NvbnN0cmFpbnQpKSB7CnJldHVybiAkcGFja2FnZTsKfQp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2VzKHN0cmluZyAkbmFtZSwgJGNvbnN0cmFpbnQgPSBudWxsKQp7CgokbmFtZSA9IHN0cnRvbG93ZXIoJG5hbWUpOwokcGFja2FnZXMgPSBbXTsKCmlmIChudWxsICE9PSAkY29uc3RyYWludCAmJiAhJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50SW50ZXJmYWNlKSB7CiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJGNvbnN0cmFpbnQgPSAkdmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludCk7Cn0KCmZvcmVhY2ggKCR0aGlzLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkbmFtZSA9PT0gJHBhY2thZ2UtPmdldE5hbWUoKSkgewppZiAobnVsbCA9PT0gJGNvbnN0cmFpbnQgfHwgJGNvbnN0cmFpbnQtPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpKSB7CiRwYWNrYWdlc1tdID0gJHBhY2thZ2U7Cn0KfQp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VhcmNoKHN0cmluZyAkcXVlcnksIGludCAkbW9kZSA9IDAsID9zdHJpbmcgJHR5cGUgPSBudWxsKQp7CmlmICgkbW9kZSA9PT0gc2VsZjo6U0VBUkNIX0ZVTExURVhUKSB7CiRyZWdleCA9ICd7KD86Jy5pbXBsb2RlKCd8JywgUHJlZzo6c3BsaXQoJ3tccyt9JywgcHJlZ19xdW90ZSgkcXVlcnkpKSkuJyl9aSc7Cn0gZWxzZSB7CgokcmVnZXggPSAneyg/OicuaW1wbG9kZSgnfCcsIFByZWc6OnNwbGl0KCd7XHMrfScsICRxdWVyeSkpLicpfWknOwp9CgokbWF0Y2hlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokbmFtZSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7CmlmICgkbW9kZSA9PT0gc2VsZjo6U0VBUkNIX1ZFTkRPUikgewpbJG5hbWVdID0gZXhwbG9kZSgnLycsICRuYW1lKTsKfQppZiAoaXNzZXQoJG1hdGNoZXNbJG5hbWVdKSkgewpjb250aW51ZTsKfQppZiAobnVsbCAhPT0gJHR5cGUgJiYgJHBhY2thZ2UtPmdldFR5cGUoKSAhPT0gJHR5cGUpIHsKY29udGludWU7Cn0KCmlmIChQcmVnOjppc01hdGNoKCRyZWdleCwgJG5hbWUpCnx8ICgkbW9kZSA9PT0gc2VsZjo6U0VBUkNIX0ZVTExURVhUICYmICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmIFByZWc6OmlzTWF0Y2goJHJlZ2V4LCBpbXBsb2RlKCcgJywgKGFycmF5KSAkcGFja2FnZS0+Z2V0S2V5d29yZHMoKSkgLiAnICcgLiAkcGFja2FnZS0+Z2V0RGVzY3JpcHRpb24oKSkpCikgewppZiAoJG1vZGUgPT09IHNlbGY6OlNFQVJDSF9WRU5ET1IpIHsKJG1hdGNoZXNbJG5hbWVdID0gWwonbmFtZScgPT4gJG5hbWUsCidkZXNjcmlwdGlvbicgPT4gbnVsbCwKXTsKfSBlbHNlIHsKJG1hdGNoZXNbJG5hbWVdID0gWwonbmFtZScgPT4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSwKJ2Rlc2NyaXB0aW9uJyA9PiAkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSA/ICRwYWNrYWdlLT5nZXREZXNjcmlwdGlvbigpIDogbnVsbCwKXTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiAkcGFja2FnZS0+aXNBYmFuZG9uZWQoKSkgewokbWF0Y2hlc1skbmFtZV1bJ2FiYW5kb25lZCddID0gJHBhY2thZ2UtPmdldFJlcGxhY2VtZW50UGFja2FnZSgpID86IHRydWU7Cn0KfQp9Cn0KCnJldHVybiBhcnJheV92YWx1ZXMoJG1hdGNoZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CmlmICgkdGhpcy0+cGFja2FnZU1hcCA9PT0gbnVsbCkgewokdGhpcy0+cGFja2FnZU1hcCA9IFtdOwpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcmVwb1BhY2thZ2UpIHsKJHRoaXMtPnBhY2thZ2VNYXBbJHJlcG9QYWNrYWdlLT5nZXRVbmlxdWVOYW1lKCldID0gJHJlcG9QYWNrYWdlOwp9Cn0KCnJldHVybiBpc3NldCgkdGhpcy0+cGFja2FnZU1hcFskcGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpXSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgQmFzZVBhY2thZ2UpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ09ubHkgc3ViY2xhc3NlcyBvZiBCYXNlUGFja2FnZSBhcmUgc3VwcG9ydGVkJyk7Cn0KaWYgKG51bGwgPT09ICR0aGlzLT5wYWNrYWdlcykgewokdGhpcy0+aW5pdGlhbGl6ZSgpOwp9CiRwYWNrYWdlLT5zZXRSZXBvc2l0b3J5KCR0aGlzKTsKJHRoaXMtPnBhY2thZ2VzW10gPSAkcGFja2FnZTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokYWxpYXNlZFBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwppZiAobnVsbCA9PT0gJGFsaWFzZWRQYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCkpIHsKJHRoaXMtPmFkZFBhY2thZ2UoJGFsaWFzZWRQYWNrYWdlKTsKfQp9CgoKJHRoaXMtPnBhY2thZ2VNYXAgPSBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdmlkZXJzKHN0cmluZyAkcGFja2FnZU5hbWUpCnsKJHJlc3VsdCA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPmdldFBhY2thZ2VzKCkgYXMgJGNhbmRpZGF0ZSkgewppZiAoaXNzZXQoJHJlc3VsdFskY2FuZGlkYXRlLT5nZXROYW1lKCldKSkgewpjb250aW51ZTsKfQpmb3JlYWNoICgkY2FuZGlkYXRlLT5nZXRQcm92aWRlcygpIGFzICRsaW5rKSB7CmlmICgkcGFja2FnZU5hbWUgPT09ICRsaW5rLT5nZXRUYXJnZXQoKSkgewokcmVzdWx0WyRjYW5kaWRhdGUtPmdldE5hbWUoKV0gPSBbCiduYW1lJyA9PiAkY2FuZGlkYXRlLT5nZXROYW1lKCksCidkZXNjcmlwdGlvbicgPT4gJGNhbmRpZGF0ZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSA/ICRjYW5kaWRhdGUtPmdldERlc2NyaXB0aW9uKCkgOiBudWxsLAondHlwZScgPT4gJGNhbmRpZGF0ZS0+Z2V0VHlwZSgpLApdOwpjb250aW51ZSAyOwp9Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVBbGlhc1BhY2thZ2UoQmFzZVBhY2thZ2UgJHBhY2thZ2UsIHN0cmluZyAkYWxpYXMsIHN0cmluZyAkcHJldHR5QWxpYXMpCnsKd2hpbGUgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlKSB7CnJldHVybiBuZXcgQ29tcGxldGVBbGlhc1BhY2thZ2UoJHBhY2thZ2UsICRhbGlhcywgJHByZXR0eUFsaWFzKTsKfQoKcmV0dXJuIG5ldyBBbGlhc1BhY2thZ2UoJHBhY2thZ2UsICRhbGlhcywgJHByZXR0eUFsaWFzKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJHBhY2thZ2VJZCA9ICRwYWNrYWdlLT5nZXRVbmlxdWVOYW1lKCk7Cgpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAka2V5ID0+ICRyZXBvUGFja2FnZSkgewppZiAoJHBhY2thZ2VJZCA9PT0gJHJlcG9QYWNrYWdlLT5nZXRVbmlxdWVOYW1lKCkpIHsKYXJyYXlfc3BsaWNlKCR0aGlzLT5wYWNrYWdlcywgJGtleSwgMSk7CgoKJHRoaXMtPnBhY2thZ2VNYXAgPSBudWxsOwoKcmV0dXJuOwp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VzKCkKewppZiAobnVsbCA9PT0gJHRoaXMtPnBhY2thZ2VzKSB7CiR0aGlzLT5pbml0aWFsaXplKCk7Cn0KCmlmIChudWxsID09PSAkdGhpcy0+cGFja2FnZXMpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignaW5pdGlhbGl6ZSBmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFja2FnZXMgYXJyYXknKTsKfQoKcmV0dXJuICR0aGlzLT5wYWNrYWdlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKaWYgKG51bGwgPT09ICR0aGlzLT5wYWNrYWdlcykgewokdGhpcy0+aW5pdGlhbGl6ZSgpOwp9CgpyZXR1cm4gY291bnQoJHRoaXMtPnBhY2thZ2VzKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpCnsKJHRoaXMtPnBhY2thZ2VzID0gW107Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxMb2FkZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxUYXI7CnVzZSBDb21wb3NlclxVdGlsXFppcDsKCgoKCmNsYXNzIEFydGlmYWN0UmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeSBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZVJlcG9zaXRvcnlJbnRlcmZhY2UKewoKcHJvdGVjdGVkICRsb2FkZXI7CgoKcHJvdGVjdGVkICRsb29rdXA7Cgpwcm90ZWN0ZWQgJHJlcG9Db25maWc7Cgpwcml2YXRlICRpbzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVwb0NvbmZpZywgSU9JbnRlcmZhY2UgJGlvKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoKTsKaWYgKCFleHRlbnNpb25fbG9hZGVkKCd6aXAnKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBhcnRpZmFjdCByZXBvc2l0b3J5IHJlcXVpcmVzIFBIUFwncyB6aXAgZXh0ZW5zaW9uJyk7Cn0KCiR0aGlzLT5sb2FkZXIgPSBuZXcgQXJyYXlMb2FkZXIoKTsKJHRoaXMtPmxvb2t1cCA9IFBsYXRmb3JtOjpleHBhbmRQYXRoKCRyZXBvQ29uZmlnWyd1cmwnXSk7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPnJlcG9Db25maWcgPSAkcmVwb0NvbmZpZzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCkKewpyZXR1cm4gJ2FydGlmYWN0IHJlcG8gKCcuJHRoaXMtPmxvb2t1cC4nKSc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvQ29uZmlnKCkKewpyZXR1cm4gJHRoaXMtPnJlcG9Db25maWc7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKCkKewpwYXJlbnQ6OmluaXRpYWxpemUoKTsKCiR0aGlzLT5zY2FuRGlyZWN0b3J5KCR0aGlzLT5sb29rdXApOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNjYW5EaXJlY3Rvcnkoc3RyaW5nICRwYXRoKTogdm9pZAp7CiRpbyA9ICR0aGlzLT5pbzsKCiRkaXJlY3RvcnkgPSBuZXcgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRwYXRoLCBcUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3I6OkZPTExPV19TWU1MSU5LUyk7CiRpdGVyYXRvciA9IG5ldyBcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcigkZGlyZWN0b3J5KTsKJHJlZ2V4ID0gbmV3IFxSZWdleEl0ZXJhdG9yKCRpdGVyYXRvciwgJy9eLitcLih6aXB8dGFyfGd6fHRneikkL2knKTsKZm9yZWFjaCAoJHJlZ2V4IGFzICRmaWxlKSB7CgppZiAoISRmaWxlLT5pc0ZpbGUoKSkgewpjb250aW51ZTsKfQoKJHBhY2thZ2UgPSAkdGhpcy0+Z2V0Q29tcG9zZXJJbmZvcm1hdGlvbigkZmlsZSk7CmlmICghJHBhY2thZ2UpIHsKJGlvLT53cml0ZUVycm9yKCJGaWxlIDxjb21tZW50PnskZmlsZS0+Z2V0QmFzZW5hbWUoKX08L2NvbW1lbnQ+IGRvZXNuJ3Qgc2VlbSB0byBob2xkIGEgcGFja2FnZSIsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKY29udGludWU7Cn0KCiR0ZW1wbGF0ZSA9ICdGb3VuZCBwYWNrYWdlIDxpbmZvPiVzPC9pbmZvPiAoPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+KSBpbiBmaWxlIDxpbmZvPiVzPC9pbmZvPic7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKCR0ZW1wbGF0ZSwgJHBhY2thZ2UtPmdldE5hbWUoKSwgJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSwgJGZpbGUtPmdldEJhc2VuYW1lKCkpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CgokdGhpcy0+YWRkUGFja2FnZSgkcGFja2FnZSk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDb21wb3NlckluZm9ybWF0aW9uKFxTcGxGaWxlSW5mbyAkZmlsZSk6ID9CYXNlUGFja2FnZQp7CiRqc29uID0gbnVsbDsKJGZpbGVUeXBlID0gbnVsbDsKJGZpbGVFeHRlbnNpb24gPSBwYXRoaW5mbygkZmlsZS0+Z2V0UGF0aG5hbWUoKSwgUEFUSElORk9fRVhURU5TSU9OKTsKaWYgKGluX2FycmF5KCRmaWxlRXh0ZW5zaW9uLCBbJ2d6JywgJ3RhcicsICd0Z3onXSwgdHJ1ZSkpIHsKJGZpbGVUeXBlID0gJ3Rhcic7Cn0gZWxzZWlmICgkZmlsZUV4dGVuc2lvbiA9PT0gJ3ppcCcpIHsKJGZpbGVUeXBlID0gJ3ppcCc7Cn0gZWxzZSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmlsZXMgd2l0aCAiJy4kZmlsZUV4dGVuc2lvbi4nIiBleHRlbnNpb25zIGFyZW5cJ3Qgc3VwcG9ydGVkLiBPbmx5IFpJUCBhbmQgVEFSL1RBUi5HWi9UR1ogYXJjaGl2ZXMgYXJlIHN1cHBvcnRlZC4nKTsKfQoKdHJ5IHsKaWYgKCRmaWxlVHlwZSA9PT0gJ3RhcicpIHsKJGpzb24gPSBUYXI6OmdldENvbXBvc2VySnNvbigkZmlsZS0+Z2V0UGF0aG5hbWUoKSk7Cn0gZWxzZSB7CiRqc29uID0gWmlwOjpnZXRDb21wb3Nlckpzb24oJGZpbGUtPmdldFBhdGhuYW1lKCkpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGV4Y2VwdGlvbikgewokdGhpcy0+aW8tPndyaXRlKCdGYWlsZWQgbG9hZGluZyBwYWNrYWdlICcuJGZpbGUtPmdldFBhdGhuYW1lKCkuJzogJy4kZXhjZXB0aW9uLT5nZXRNZXNzYWdlKCksIGZhbHNlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cn0KCmlmIChudWxsID09PSAkanNvbikgewpyZXR1cm4gbnVsbDsKfQoKJHBhY2thZ2UgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRqc29uLCAkZmlsZS0+Z2V0UGF0aG5hbWUoKS4nI2NvbXBvc2VyLmpzb24nKTsKJHBhY2thZ2VbJ2Rpc3QnXSA9IFsKJ3R5cGUnID0+ICRmaWxlVHlwZSwKJ3VybCcgPT4gc3RydHIoJGZpbGUtPmdldFBhdGhuYW1lKCksICdcXCcsICcvJyksCidzaGFzdW0nID0+IGhhc2hfZmlsZSgnc2hhMScsICRmaWxlLT5nZXRSZWFsUGF0aCgpKSwKXTsKCnRyeSB7CiRwYWNrYWdlID0gJHRoaXMtPmxvYWRlci0+bG9hZCgkcGFja2FnZSk7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0ZhaWxlZCBsb2FkaW5nIHBhY2thZ2UgaW4gJy4kZmlsZS4nOiAnLiRlLT5nZXRNZXNzYWdlKCksIDAsICRlKTsKfQoKcmV0dXJuICRwYWNrYWdlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCnRyYWl0IENhbm9uaWNhbFBhY2thZ2VzVHJhaXQKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDYW5vbmljYWxQYWNrYWdlcygpCnsKJHBhY2thZ2VzID0gJHRoaXMtPmdldFBhY2thZ2VzKCk7CgoKJHBhY2thZ2VzQnlOYW1lID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoIWlzc2V0KCRwYWNrYWdlc0J5TmFtZVskcGFja2FnZS0+Z2V0TmFtZSgpXSkgfHwgJHBhY2thZ2VzQnlOYW1lWyRwYWNrYWdlLT5nZXROYW1lKCldIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRwYWNrYWdlc0J5TmFtZVskcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRwYWNrYWdlOwp9Cn0KCiRjYW5vbmljYWxQYWNrYWdlcyA9IFtdOwoKCmZvcmVhY2ggKCRwYWNrYWdlc0J5TmFtZSBhcyAkcGFja2FnZSkgewp3aGlsZSAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgokY2Fub25pY2FsUGFja2FnZXNbXSA9ICRwYWNrYWdlOwp9CgpyZXR1cm4gJGNhbm9uaWNhbFBhY2thZ2VzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcUGFydGlhbFNlY3VyaXR5QWR2aXNvcnk7CnVzZSBDb21wb3NlclxBZHZpc29yeVxTZWN1cml0eUFkdmlzb3J5Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxTdGFiaWxpdHlGaWx0ZXI7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFBsdWdpblxQb3N0RmlsZURvd25sb2FkRXZlbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29tcGlsaW5nTWF0Y2hlcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXExvb3A7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFByZUZpbGVEb3dubG9hZEV2ZW50Owp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNYXRjaEFsbENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUmVzcG9uc2U7CnVzZSBDb21wb3NlclxNZXRhZGF0YU1pbmlmaWVyXE1ldGFkYXRhTWluaWZpZXI7CnVzZSBDb21wb3NlclxVdGlsXFVybDsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCmNsYXNzIENvbXBvc2VyUmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeSBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZVJlcG9zaXRvcnlJbnRlcmZhY2UsIEFkdmlzb3J5UHJvdmlkZXJJbnRlcmZhY2UKewoKCgoKcHJpdmF0ZSAkcmVwb0NvbmZpZzsKCnByaXZhdGUgJG9wdGlvbnM7Cgpwcml2YXRlICR1cmw7Cgpwcml2YXRlICRiYXNlVXJsOwoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCnByaXZhdGUgJGxvb3A7Cgpwcm90ZWN0ZWQgJGNhY2hlOwoKcHJvdGVjdGVkICRub3RpZnlVcmwgPSBudWxsOwoKcHJvdGVjdGVkICRzZWFyY2hVcmwgPSBudWxsOwoKcHJvdGVjdGVkICRwcm92aWRlcnNBcGlVcmwgPSBudWxsOwoKcHJvdGVjdGVkICRoYXNQcm92aWRlcnMgPSBmYWxzZTsKCnByb3RlY3RlZCAkcHJvdmlkZXJzVXJsID0gbnVsbDsKCnByb3RlY3RlZCAkbGlzdFVybCA9IG51bGw7Cgpwcm90ZWN0ZWQgJGhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0ID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGF2YWlsYWJsZVBhY2thZ2VzID0gbnVsbDsKCnByb3RlY3RlZCAkYXZhaWxhYmxlUGFja2FnZVBhdHRlcm5zID0gbnVsbDsKCnByb3RlY3RlZCAkbGF6eVByb3ZpZGVyc1VybCA9IG51bGw7Cgpwcm90ZWN0ZWQgJHByb3ZpZGVyTGlzdGluZzsKCnByb3RlY3RlZCAkbG9hZGVyOwoKcHJpdmF0ZSAkYWxsb3dTc2xEb3duZ3JhZGUgPSBmYWxzZTsKCnByaXZhdGUgJGV2ZW50RGlzcGF0Y2hlcjsKCnByaXZhdGUgJHNvdXJjZU1pcnJvcnM7Cgpwcml2YXRlICRkaXN0TWlycm9yczsKCnByaXZhdGUgJGRlZ3JhZGVkTW9kZSA9IGZhbHNlOwoKcHJpdmF0ZSAkcm9vdERhdGE7Cgpwcml2YXRlICRoYXNQYXJ0aWFsUGFja2FnZXMgPSBmYWxzZTsKCnByaXZhdGUgJHBhcnRpYWxQYWNrYWdlc0J5TmFtZSA9IG51bGw7Cgpwcml2YXRlICRkaXNwbGF5ZWRXYXJuaW5nQWJvdXROb25NYXRjaGluZ1BhY2thZ2VJbmRleCA9IGZhbHNlOwoKcHJpdmF0ZSAkc2VjdXJpdHlBZHZpc29yeUNvbmZpZyA9IG51bGw7CgoKCgoKCnByaXZhdGUgJGZyZXNoTWV0YWRhdGFVcmxzID0gW107CgoKCgoKCnByaXZhdGUgJHBhY2thZ2VzTm90Rm91bmRDYWNoZSA9IFtdOwoKCgoKcHJpdmF0ZSAkdmVyc2lvblBhcnNlcjsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHJlcG9Db25maWcsIElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciwgP0V2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CmlmICghUHJlZzo6aXNNYXRjaCgne15bXHcuXStcPz86Ly99JywgJHJlcG9Db25maWdbJ3VybCddKSkgewppZiAoKCRsb2NhbEZpbGVQYXRoID0gcmVhbHBhdGgoJHJlcG9Db25maWdbJ3VybCddKSkgIT09IGZhbHNlKSB7CgokcmVwb0NvbmZpZ1sndXJsJ10gPSAnZmlsZTovLycuJGxvY2FsRmlsZVBhdGg7Cn0gZWxzZSB7CgokcmVwb0NvbmZpZ1sndXJsJ10gPSAnaHR0cDovLycuJHJlcG9Db25maWdbJ3VybCddOwp9Cn0KJHJlcG9Db25maWdbJ3VybCddID0gcnRyaW0oJHJlcG9Db25maWdbJ3VybCddLCAnLycpOwppZiAoJHJlcG9Db25maWdbJ3VybCddID09PSAnJykgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIHJlcG9zaXRvcnkgdXJsIG11c3Qgbm90IGJlIGFuIGVtcHR5IHN0cmluZycpOwp9CgppZiAoc3RyX3N0YXJ0c193aXRoKCRyZXBvQ29uZmlnWyd1cmwnXSwgJ2h0dHBzPycpKSB7CiRyZXBvQ29uZmlnWyd1cmwnXSA9IChleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykgPyAnaHR0cHMnIDogJ2h0dHAnKSAuIHN1YnN0cigkcmVwb0NvbmZpZ1sndXJsJ10sIDYpOwp9CgokdXJsQml0cyA9IHBhcnNlX3VybChzdHJ0cigkcmVwb0NvbmZpZ1sndXJsJ10sICdcXCcsICcvJykpOwppZiAoJHVybEJpdHMgPT09IGZhbHNlIHx8IGVtcHR5KCR1cmxCaXRzWydzY2hlbWUnXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0ludmFsaWQgdXJsIGdpdmVuIGZvciBDb21wb3NlciByZXBvc2l0b3J5OiAnLiRyZXBvQ29uZmlnWyd1cmwnXSk7Cn0KCmlmICghaXNzZXQoJHJlcG9Db25maWdbJ29wdGlvbnMnXSkpIHsKJHJlcG9Db25maWdbJ29wdGlvbnMnXSA9IFtdOwp9CmlmIChpc3NldCgkcmVwb0NvbmZpZ1snYWxsb3dfc3NsX2Rvd25ncmFkZSddKSAmJiB0cnVlID09PSAkcmVwb0NvbmZpZ1snYWxsb3dfc3NsX2Rvd25ncmFkZSddKSB7CiR0aGlzLT5hbGxvd1NzbERvd25ncmFkZSA9IHRydWU7Cn0KCiR0aGlzLT5vcHRpb25zID0gJHJlcG9Db25maWdbJ29wdGlvbnMnXTsKJHRoaXMtPnVybCA9ICRyZXBvQ29uZmlnWyd1cmwnXTsKCgppZiAoUHJlZzo6aXNNYXRjaCgne14oP1A8cHJvdG8+aHR0cHM/KTovL3BhY2thZ2lzdFwub3JnLz8kfWknLCAkdGhpcy0+dXJsLCAkbWF0Y2gpKSB7CiR0aGlzLT51cmwgPSAkbWF0Y2hbJ3Byb3RvJ10uJzovL3JlcG8ucGFja2FnaXN0Lm9yZyc7Cn0KCiRiYXNlVXJsID0gcnRyaW0oUHJlZzo6cmVwbGFjZSgneyg/Oi9bXi9cXFxcXStcLmpzb24pPyg/Ols/I10uKik/JH0nLCAnJywgJHRoaXMtPnVybCksICcvJyk7CmFzc2VydCgkYmFzZVVybCAhPT0gJycpOwokdGhpcy0+YmFzZVVybCA9ICRiYXNlVXJsOwokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jYWNoZSA9IG5ldyBDYWNoZSgkaW8sICRjb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKS4nLycuUHJlZzo6cmVwbGFjZSgne1teYS16MC05Ll19aScsICctJywgVXJsOjpzYW5pdGl6ZSgkdGhpcy0+dXJsKSksICdhLXowLTkuJH5fJyk7CiR0aGlzLT5jYWNoZS0+c2V0UmVhZE9ubHkoJGNvbmZpZy0+Z2V0KCdjYWNoZS1yZWFkLW9ubHknKSk7CiR0aGlzLT52ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJHRoaXMtPmxvYWRlciA9IG5ldyBBcnJheUxvYWRlcigkdGhpcy0+dmVyc2lvblBhcnNlcik7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciA9ICRldmVudERpc3BhdGNoZXI7CiR0aGlzLT5yZXBvQ29uZmlnID0gJHJlcG9Db25maWc7CiR0aGlzLT5sb29wID0gbmV3IExvb3AoJHRoaXMtPmh0dHBEb3dubG9hZGVyKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCkKewpyZXR1cm4gJ2NvbXBvc2VyIHJlcG8gKCcuVXJsOjpzYW5pdGl6ZSgkdGhpcy0+dXJsKS4nKSc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvQ29uZmlnKCkKewpyZXR1cm4gJHRoaXMtPnJlcG9Db25maWc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZShzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50KQp7CgokaGFzUHJvdmlkZXJzID0gJHRoaXMtPmhhc1Byb3ZpZGVycygpOwoKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKaWYgKCEkY29uc3RyYWludCBpbnN0YW5jZW9mIENvbnN0cmFpbnRJbnRlcmZhY2UpIHsKJGNvbnN0cmFpbnQgPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludCk7Cn0KCmlmICgkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCkgewppZiAoJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcygpICYmIGlzc2V0KCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWVbJG5hbWVdKSkgewpyZXR1cm4gJHRoaXMtPmZpbHRlclBhY2thZ2VzKCR0aGlzLT53aGF0UHJvdmlkZXMoJG5hbWUpLCAkY29uc3RyYWludCwgdHJ1ZSk7Cn0KCmlmICgkdGhpcy0+aGFzQXZhaWxhYmxlUGFja2FnZUxpc3QgJiYgISR0aGlzLT5sYXp5UHJvdmlkZXJzUmVwb0NvbnRhaW5zKCRuYW1lKSkgewpyZXR1cm4gbnVsbDsKfQoKJHBhY2thZ2VzID0gJHRoaXMtPmxvYWRBc3luY1BhY2thZ2VzKFskbmFtZSA9PiAkY29uc3RyYWludF0pOwoKaWYgKGNvdW50KCRwYWNrYWdlc1sncGFja2FnZXMnXSkgPiAwKSB7CnJldHVybiByZXNldCgkcGFja2FnZXNbJ3BhY2thZ2VzJ10pOwp9CgpyZXR1cm4gbnVsbDsKfQoKaWYgKCRoYXNQcm92aWRlcnMpIHsKZm9yZWFjaCAoJHRoaXMtPmdldFByb3ZpZGVyTmFtZXMoKSBhcyAkcHJvdmlkZXJOYW1lKSB7CmlmICgkbmFtZSA9PT0gJHByb3ZpZGVyTmFtZSkgewpyZXR1cm4gJHRoaXMtPmZpbHRlclBhY2thZ2VzKCR0aGlzLT53aGF0UHJvdmlkZXMoJHByb3ZpZGVyTmFtZSksICRjb25zdHJhaW50LCB0cnVlKTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIHBhcmVudDo6ZmluZFBhY2thZ2UoJG5hbWUsICRjb25zdHJhaW50KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlcyhzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50ID0gbnVsbCkKewoKJGhhc1Byb3ZpZGVycyA9ICR0aGlzLT5oYXNQcm92aWRlcnMoKTsKCiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CmlmIChudWxsICE9PSAkY29uc3RyYWludCAmJiAhJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50SW50ZXJmYWNlKSB7CiRjb25zdHJhaW50ID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpOwp9CgppZiAoJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpIHsKaWYgKCR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMoKSAmJiBpc3NldCgkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lWyRuYW1lXSkpIHsKcmV0dXJuICR0aGlzLT5maWx0ZXJQYWNrYWdlcygkdGhpcy0+d2hhdFByb3ZpZGVzKCRuYW1lKSwgJGNvbnN0cmFpbnQpOwp9CgppZiAoJHRoaXMtPmhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0ICYmICEkdGhpcy0+bGF6eVByb3ZpZGVyc1JlcG9Db250YWlucygkbmFtZSkpIHsKcmV0dXJuIFtdOwp9CgokcmVzdWx0ID0gJHRoaXMtPmxvYWRBc3luY1BhY2thZ2VzKFskbmFtZSA9PiAkY29uc3RyYWludF0pOwoKcmV0dXJuICRyZXN1bHRbJ3BhY2thZ2VzJ107Cn0KCmlmICgkaGFzUHJvdmlkZXJzKSB7CmZvcmVhY2ggKCR0aGlzLT5nZXRQcm92aWRlck5hbWVzKCkgYXMgJHByb3ZpZGVyTmFtZSkgewppZiAoJG5hbWUgPT09ICRwcm92aWRlck5hbWUpIHsKcmV0dXJuICR0aGlzLT5maWx0ZXJQYWNrYWdlcygkdGhpcy0+d2hhdFByb3ZpZGVzKCRwcm92aWRlck5hbWUpLCAkY29uc3RyYWludCk7Cn0KfQoKcmV0dXJuIFtdOwp9CgpyZXR1cm4gcGFyZW50OjpmaW5kUGFja2FnZXMoJG5hbWUsICRjb25zdHJhaW50KTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbHRlclBhY2thZ2VzKGFycmF5ICRwYWNrYWdlcywgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsLCBib29sICRyZXR1cm5GaXJzdE1hdGNoID0gZmFsc2UpCnsKaWYgKG51bGwgPT09ICRjb25zdHJhaW50KSB7CmlmICgkcmV0dXJuRmlyc3RNYXRjaCkgewpyZXR1cm4gcmVzZXQoJHBhY2thZ2VzKTsKfQoKcmV0dXJuICRwYWNrYWdlczsKfQoKJGZpbHRlcmVkUGFja2FnZXMgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokcGtnQ29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9PScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpOwoKaWYgKCRjb25zdHJhaW50LT5tYXRjaGVzKCRwa2dDb25zdHJhaW50KSkgewppZiAoJHJldHVybkZpcnN0TWF0Y2gpIHsKcmV0dXJuICRwYWNrYWdlOwp9CgokZmlsdGVyZWRQYWNrYWdlc1tdID0gJHBhY2thZ2U7Cn0KfQoKaWYgKCRyZXR1cm5GaXJzdE1hdGNoKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGZpbHRlcmVkUGFja2FnZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlcygpCnsKJGhhc1Byb3ZpZGVycyA9ICR0aGlzLT5oYXNQcm92aWRlcnMoKTsKCmlmICgkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCkgewppZiAoaXNfYXJyYXkoJHRoaXMtPmF2YWlsYWJsZVBhY2thZ2VzKSAmJiAhJHRoaXMtPmF2YWlsYWJsZVBhY2thZ2VQYXR0ZXJucykgewokcGFja2FnZU1hcCA9IFtdOwpmb3JlYWNoICgkdGhpcy0+YXZhaWxhYmxlUGFja2FnZXMgYXMgJG5hbWUpIHsKJHBhY2thZ2VNYXBbJG5hbWVdID0gbmV3IE1hdGNoQWxsQ29uc3RyYWludCgpOwp9CgokcmVzdWx0ID0gJHRoaXMtPmxvYWRBc3luY1BhY2thZ2VzKCRwYWNrYWdlTWFwKTsKCnJldHVybiBhcnJheV92YWx1ZXMoJHJlc3VsdFsncGFja2FnZXMnXSk7Cn0KCmlmICgkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzKCkpIHsKaWYgKCFpc19hcnJheSgkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdoYXNQYXJ0aWFsUGFja2FnZXMgZmFpbGVkIHRvIGluaXRpYWxpemUgJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZScpOwp9CgpyZXR1cm4gJHRoaXMtPmNyZWF0ZVBhY2thZ2VzKCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWUsICdwYWNrYWdlcy5qc29uIGlubGluZSBwYWNrYWdlcycpOwp9Cgp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdDb21wb3NlciByZXBvc2l0b3JpZXMgdGhhdCBoYXZlIGxhenkgcHJvdmlkZXJzIGFuZCBubyBhdmFpbGFibGUtcGFja2FnZXMgbGlzdCBjYW4gbm90IGxvYWQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgcGFja2FnZXMsIHVzZSBnZXRQYWNrYWdlTmFtZXMgaW5zdGVhZC4nKTsKfQoKaWYgKCRoYXNQcm92aWRlcnMpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQ29tcG9zZXIgcmVwb3NpdG9yaWVzIHRoYXQgaGF2ZSBwcm92aWRlcnMgY2FuIG5vdCBsb2FkIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHBhY2thZ2VzLCB1c2UgZ2V0UGFja2FnZU5hbWVzIGluc3RlYWQuJyk7Cn0KCnJldHVybiBwYXJlbnQ6OmdldFBhY2thZ2VzKCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VOYW1lcyg/c3RyaW5nICRwYWNrYWdlRmlsdGVyID0gbnVsbCkKewokaGFzUHJvdmlkZXJzID0gJHRoaXMtPmhhc1Byb3ZpZGVycygpOwoKJGZpbHRlclJlc3VsdHMgPQoKCgoKc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkcmVzdWx0cyk6IGFycmF5IHsKcmV0dXJuICRyZXN1bHRzOwp9CjsKaWYgKG51bGwgIT09ICRwYWNrYWdlRmlsdGVyICYmICcnICE9PSAkcGFja2FnZUZpbHRlcikgewokcGFja2FnZUZpbHRlclJlZ2V4ID0gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJHBhY2thZ2VGaWx0ZXIpOwokZmlsdGVyUmVzdWx0cyA9CgoKCgpzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRyZXN1bHRzKSB1c2UgKCRwYWNrYWdlRmlsdGVyUmVnZXgpOiBhcnJheSB7CgpyZXR1cm4gUHJlZzo6Z3JlcCgkcGFja2FnZUZpbHRlclJlZ2V4LCAkcmVzdWx0cyk7Cn0KOwp9CgppZiAoJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpIHsKaWYgKGlzX2FycmF5KCR0aGlzLT5hdmFpbGFibGVQYWNrYWdlcykpIHsKcmV0dXJuICRmaWx0ZXJSZXN1bHRzKGFycmF5X2tleXMoJHRoaXMtPmF2YWlsYWJsZVBhY2thZ2VzKSk7Cn0KCmlmICgkdGhpcy0+bGlzdFVybCkgewoKcmV0dXJuICR0aGlzLT5sb2FkUGFja2FnZUxpc3QoJHBhY2thZ2VGaWx0ZXIpOwp9CgppZiAoJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcygpICYmICR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWUgIT09IG51bGwpIHsKcmV0dXJuICRmaWx0ZXJSZXN1bHRzKGFycmF5X2tleXMoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZSkpOwp9CgpyZXR1cm4gW107Cn0KCmlmICgkaGFzUHJvdmlkZXJzKSB7CnJldHVybiAkZmlsdGVyUmVzdWx0cygkdGhpcy0+Z2V0UHJvdmlkZXJOYW1lcygpKTsKfQoKJG5hbWVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRuYW1lc1tdID0gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKfQoKcmV0dXJuICRmaWx0ZXJSZXN1bHRzKCRuYW1lcyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0VmVuZG9yTmFtZXMoKTogYXJyYXkKewokY2FjaGVLZXkgPSAndmVuZG9yLWxpc3QudHh0JzsKJGNhY2hlQWdlID0gJHRoaXMtPmNhY2hlLT5nZXRBZ2UoJGNhY2hlS2V5KTsKaWYgKGZhbHNlICE9PSAkY2FjaGVBZ2UgJiYgJGNhY2hlQWdlIDwgNjAwICYmICgkY2FjaGVkRGF0YSA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkY2FjaGVLZXkpKSAhPT0gZmFsc2UpIHsKJGNhY2hlZERhdGEgPSBleHBsb2RlKCJcbiIsICRjYWNoZWREYXRhKTsKCnJldHVybiAkY2FjaGVkRGF0YTsKfQoKJG5hbWVzID0gJHRoaXMtPmdldFBhY2thZ2VOYW1lcygpOwoKJHVuaXF1ZXMgPSBbXTsKZm9yZWFjaCAoJG5hbWVzIGFzICRuYW1lKSB7CiR1bmlxdWVzW2V4cGxvZGUoJy8nLCAkbmFtZSwgMilbMF1dID0gdHJ1ZTsKfQoKJHZlbmRvcnMgPSBhcnJheV9rZXlzKCR1bmlxdWVzKTsKCmlmICghJHRoaXMtPmNhY2hlLT5pc1JlYWRPbmx5KCkpIHsKJHRoaXMtPmNhY2hlLT53cml0ZSgkY2FjaGVLZXksIGltcGxvZGUoIlxuIiwgJHZlbmRvcnMpKTsKfQoKcmV0dXJuICR2ZW5kb3JzOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRQYWNrYWdlTGlzdCg/c3RyaW5nICRwYWNrYWdlRmlsdGVyID0gbnVsbCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5saXN0VXJsKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ01ha2Ugc3VyZSB0byBjYWxsIGxvYWRSb290U2VydmVyRmlsZSBiZWZvcmUgbG9hZFBhY2thZ2VMaXN0Jyk7Cn0KCiR1cmwgPSAkdGhpcy0+bGlzdFVybDsKaWYgKGlzX3N0cmluZygkcGFja2FnZUZpbHRlcikgJiYgJHBhY2thZ2VGaWx0ZXIgIT09ICcnKSB7CiR1cmwgLj0gJz9maWx0ZXI9Jy51cmxlbmNvZGUoJHBhY2thZ2VGaWx0ZXIpOwokcmVzdWx0ID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHVybCwgJHRoaXMtPm9wdGlvbnMpLT5kZWNvZGVKc29uKCk7CgpyZXR1cm4gJHJlc3VsdFsncGFja2FnZU5hbWVzJ107Cn0KCiRjYWNoZUtleSA9ICdwYWNrYWdlLWxpc3QudHh0JzsKJGNhY2hlQWdlID0gJHRoaXMtPmNhY2hlLT5nZXRBZ2UoJGNhY2hlS2V5KTsKaWYgKGZhbHNlICE9PSAkY2FjaGVBZ2UgJiYgJGNhY2hlQWdlIDwgNjAwICYmICgkY2FjaGVkRGF0YSA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkY2FjaGVLZXkpKSAhPT0gZmFsc2UpIHsKJGNhY2hlZERhdGEgPSBleHBsb2RlKCJcbiIsICRjYWNoZWREYXRhKTsKCnJldHVybiAkY2FjaGVkRGF0YTsKfQoKJHJlc3VsdCA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCR1cmwsICR0aGlzLT5vcHRpb25zKS0+ZGVjb2RlSnNvbigpOwppZiAoISR0aGlzLT5jYWNoZS0+aXNSZWFkT25seSgpKSB7CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGNhY2hlS2V5LCBpbXBsb2RlKCJcbiIsICRyZXN1bHRbJ3BhY2thZ2VOYW1lcyddKSk7Cn0KCnJldHVybiAkcmVzdWx0WydwYWNrYWdlTmFtZXMnXTsKfQoKcHVibGljIGZ1bmN0aW9uIGxvYWRQYWNrYWdlcyhhcnJheSAkcGFja2FnZU5hbWVNYXAsIGFycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsIGFycmF5ICRzdGFiaWxpdHlGbGFncywgYXJyYXkgJGFscmVhZHlMb2FkZWQgPSBbXSkKewoKJGhhc1Byb3ZpZGVycyA9ICR0aGlzLT5oYXNQcm92aWRlcnMoKTsKCmlmICghJGhhc1Byb3ZpZGVycyAmJiAhJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcygpICYmIG51bGwgPT09ICR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsKSB7CnJldHVybiBwYXJlbnQ6OmxvYWRQYWNrYWdlcygkcGFja2FnZU5hbWVNYXAsICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncywgJGFscmVhZHlMb2FkZWQpOwp9CgokcGFja2FnZXMgPSBbXTsKJG5hbWVzRm91bmQgPSBbXTsKCmlmICgkaGFzUHJvdmlkZXJzIHx8ICR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMoKSkgewpmb3JlYWNoICgkcGFja2FnZU5hbWVNYXAgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKJG1hdGNoZXMgPSBbXTsKCgoKaWYgKCEkaGFzUHJvdmlkZXJzICYmICFpc3NldCgkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lWyRuYW1lXSkpIHsKY29udGludWU7Cn0KCiRjYW5kaWRhdGVzID0gJHRoaXMtPndoYXRQcm92aWRlcygkbmFtZSwgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzLCAkYWxyZWFkeUxvYWRlZCk7CmZvcmVhY2ggKCRjYW5kaWRhdGVzIGFzICRjYW5kaWRhdGUpIHsKaWYgKCRjYW5kaWRhdGUtPmdldE5hbWUoKSAhPT0gJG5hbWUpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignd2hhdFByb3ZpZGVzIHNob3VsZCBuZXZlciByZXR1cm4gYSBwYWNrYWdlIHdpdGggYSBkaWZmZXJlbnQgbmFtZSB0aGFuIHRoZSByZXF1ZXN0ZWQgb25lJyk7Cn0KJG5hbWVzRm91bmRbJG5hbWVdID0gdHJ1ZTsKCmlmICghJGNvbnN0cmFpbnQgfHwgJGNvbnN0cmFpbnQtPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJGNhbmRpZGF0ZS0+Z2V0VmVyc2lvbigpKSkpIHsKJG1hdGNoZXNbc3BsX29iamVjdF9oYXNoKCRjYW5kaWRhdGUpXSA9ICRjYW5kaWRhdGU7CmlmICgkY2FuZGlkYXRlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICFpc3NldCgkbWF0Y2hlc1tzcGxfb2JqZWN0X2hhc2goJGNhbmRpZGF0ZS0+Z2V0QWxpYXNPZigpKV0pKSB7CiRtYXRjaGVzW3NwbF9vYmplY3RfaGFzaCgkY2FuZGlkYXRlLT5nZXRBbGlhc09mKCkpXSA9ICRjYW5kaWRhdGUtPmdldEFsaWFzT2YoKTsKfQp9Cn0KCgpmb3JlYWNoICgkY2FuZGlkYXRlcyBhcyAkY2FuZGlkYXRlKSB7CmlmICgkY2FuZGlkYXRlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmlmIChpc3NldCgkbWF0Y2hlc1tzcGxfb2JqZWN0X2hhc2goJGNhbmRpZGF0ZS0+Z2V0QWxpYXNPZigpKV0pKSB7CiRtYXRjaGVzW3NwbF9vYmplY3RfaGFzaCgkY2FuZGlkYXRlKV0gPSAkY2FuZGlkYXRlOwp9Cn0KfQokcGFja2FnZXMgPSBhcnJheV9tZXJnZSgkcGFja2FnZXMsICRtYXRjaGVzKTsKCnVuc2V0KCRwYWNrYWdlTmFtZU1hcFskbmFtZV0pOwp9Cn0KCmlmICgkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCAmJiBjb3VudCgkcGFja2FnZU5hbWVNYXApKSB7CmlmICgkdGhpcy0+aGFzQXZhaWxhYmxlUGFja2FnZUxpc3QpIHsKZm9yZWFjaCAoJHBhY2thZ2VOYW1lTWFwIGFzICRuYW1lID0+ICRjb25zdHJhaW50KSB7CmlmICghJHRoaXMtPmxhenlQcm92aWRlcnNSZXBvQ29udGFpbnMoc3RydG9sb3dlcigkbmFtZSkpKSB7CnVuc2V0KCRwYWNrYWdlTmFtZU1hcFskbmFtZV0pOwp9Cn0KfQoKJHJlc3VsdCA9ICR0aGlzLT5sb2FkQXN5bmNQYWNrYWdlcygkcGFja2FnZU5hbWVNYXAsICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncywgJGFscmVhZHlMb2FkZWQpOwokcGFja2FnZXMgPSBhcnJheV9tZXJnZSgkcGFja2FnZXMsICRyZXN1bHRbJ3BhY2thZ2VzJ10pOwokbmFtZXNGb3VuZCA9IGFycmF5X21lcmdlKCRuYW1lc0ZvdW5kLCAkcmVzdWx0WyduYW1lc0ZvdW5kJ10pOwp9CgpyZXR1cm4gWyduYW1lc0ZvdW5kJyA9PiBhcnJheV9rZXlzKCRuYW1lc0ZvdW5kKSwgJ3BhY2thZ2VzJyA9PiAkcGFja2FnZXNdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VhcmNoKHN0cmluZyAkcXVlcnksIGludCAkbW9kZSA9IDAsID9zdHJpbmcgJHR5cGUgPSBudWxsKQp7CiR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoNjAwKTsKCmlmICgkdGhpcy0+c2VhcmNoVXJsICYmICRtb2RlID09PSBzZWxmOjpTRUFSQ0hfRlVMTFRFWFQpIHsKJHVybCA9IHN0cl9yZXBsYWNlKFsnJXF1ZXJ5JScsICcldHlwZSUnXSwgW3VybGVuY29kZSgkcXVlcnkpLCAkdHlwZV0sICR0aGlzLT5zZWFyY2hVcmwpOwoKJHNlYXJjaCA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCR1cmwsICR0aGlzLT5vcHRpb25zKS0+ZGVjb2RlSnNvbigpOwoKaWYgKGVtcHR5KCRzZWFyY2hbJ3Jlc3VsdHMnXSkpIHsKcmV0dXJuIFtdOwp9CgokcmVzdWx0cyA9IFtdOwpmb3JlYWNoICgkc2VhcmNoWydyZXN1bHRzJ10gYXMgJHJlc3VsdCkgewoKaWYgKCFlbXB0eSgkcmVzdWx0Wyd2aXJ0dWFsJ10pKSB7CmNvbnRpbnVlOwp9CgokcmVzdWx0c1tdID0gJHJlc3VsdDsKfQoKcmV0dXJuICRyZXN1bHRzOwp9CgppZiAoJG1vZGUgPT09IHNlbGY6OlNFQVJDSF9WRU5ET1IpIHsKJHJlc3VsdHMgPSBbXTsKJHJlZ2V4ID0gJ3soPzonLmltcGxvZGUoJ3wnLCBQcmVnOjpzcGxpdCgne1xzK30nLCAkcXVlcnkpKS4nKX1pJzsKCiR2ZW5kb3JOYW1lcyA9ICR0aGlzLT5nZXRWZW5kb3JOYW1lcygpOwpmb3JlYWNoIChQcmVnOjpncmVwKCRyZWdleCwgJHZlbmRvck5hbWVzKSBhcyAkbmFtZSkgewokcmVzdWx0c1tdID0gWyduYW1lJyA9PiAkbmFtZSwgJ2Rlc2NyaXB0aW9uJyA9PiAnJ107Cn0KCnJldHVybiAkcmVzdWx0czsKfQoKaWYgKCR0aGlzLT5oYXNQcm92aWRlcnMoKSB8fCAkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCkgewoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teXF4oP1A8cXVlcnk+KD9QPHZlbmRvcj5bYS16MC05Xy4tXSspL1thLXowLTlfLi1dKilcKj8kfWknLCAkcXVlcnksICRtYXRjaCkgJiYgJHRoaXMtPmxpc3RVcmwgIT09IG51bGwpIHsKJHVybCA9ICR0aGlzLT5saXN0VXJsIC4gJz92ZW5kb3I9Jy51cmxlbmNvZGUoJG1hdGNoWyd2ZW5kb3InXSkuJyZmaWx0ZXI9Jy51cmxlbmNvZGUoJG1hdGNoWydxdWVyeSddLicqJyk7CiRyZXN1bHQgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkdXJsLCAkdGhpcy0+b3B0aW9ucyktPmRlY29kZUpzb24oKTsKCiRyZXN1bHRzID0gW107CmZvcmVhY2ggKCRyZXN1bHRbJ3BhY2thZ2VOYW1lcyddIGFzICRuYW1lKSB7CiRyZXN1bHRzW10gPSBbJ25hbWUnID0+ICRuYW1lLCAnZGVzY3JpcHRpb24nID0+ICcnXTsKfQoKcmV0dXJuICRyZXN1bHRzOwp9CgokcmVzdWx0cyA9IFtdOwokcmVnZXggPSAneyg/OicuaW1wbG9kZSgnfCcsIFByZWc6OnNwbGl0KCd7XHMrfScsICRxdWVyeSkpLicpfWknOwoKJHBhY2thZ2VOYW1lcyA9ICR0aGlzLT5nZXRQYWNrYWdlTmFtZXMoKTsKZm9yZWFjaCAoUHJlZzo6Z3JlcCgkcmVnZXgsICRwYWNrYWdlTmFtZXMpIGFzICRuYW1lKSB7CiRyZXN1bHRzW10gPSBbJ25hbWUnID0+ICRuYW1lLCAnZGVzY3JpcHRpb24nID0+ICcnXTsKfQoKcmV0dXJuICRyZXN1bHRzOwp9CgpyZXR1cm4gcGFyZW50OjpzZWFyY2goJHF1ZXJ5LCAkbW9kZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYXNTZWN1cml0eUFkdmlzb3JpZXMoKTogYm9vbAp7CiR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoNjAwKTsKCnJldHVybiAkdGhpcy0+c2VjdXJpdHlBZHZpc29yeUNvbmZpZyAhPT0gbnVsbCAmJiAoJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlDb25maWdbJ21ldGFkYXRhJ10gfHwgJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlDb25maWdbJ2FwaS11cmwnXSAhPT0gbnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTZWN1cml0eUFkdmlzb3JpZXMoYXJyYXkgJHBhY2thZ2VDb25zdHJhaW50TWFwLCBib29sICRhbGxvd1BhcnRpYWxBZHZpc29yaWVzID0gZmFsc2UpOiBhcnJheQp7CiR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoNjAwKTsKaWYgKG51bGwgPT09ICR0aGlzLT5zZWN1cml0eUFkdmlzb3J5Q29uZmlnKSB7CnJldHVybiBbJ25hbWVzRm91bmQnID0+IFtdLCAnYWR2aXNvcmllcycgPT4gW11dOwp9CgokYWR2aXNvcmllcyA9IFtdOwokbmFtZXNGb3VuZCA9IFtdOwoKJGFwaVVybCA9ICR0aGlzLT5zZWN1cml0eUFkdmlzb3J5Q29uZmlnWydhcGktdXJsJ107CgoKaWYgKCR0aGlzLT5oYXNBdmFpbGFibGVQYWNrYWdlTGlzdCkgewpmb3JlYWNoICgkcGFja2FnZUNvbnN0cmFpbnRNYXAgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCEkdGhpcy0+bGF6eVByb3ZpZGVyc1JlcG9Db250YWlucyhzdHJ0b2xvd2VyKCRuYW1lKSkpIHsKdW5zZXQoJHBhY2thZ2VDb25zdHJhaW50TWFwWyRuYW1lXSk7Cn0KfQp9CgokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKCgoKCgokY3JlYXRlID0gZnVuY3Rpb24gKGFycmF5ICRkYXRhLCBzdHJpbmcgJG5hbWUpIHVzZSAoJHBhcnNlciwgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMsICYkcGFja2FnZUNvbnN0cmFpbnRNYXApOiA/UGFydGlhbFNlY3VyaXR5QWR2aXNvcnkgewokYWR2aXNvcnkgPSBQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeTo6Y3JlYXRlKCRuYW1lLCAkZGF0YSwgJHBhcnNlcik7CmlmICghJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgJiYgISRhZHZpc29yeSBpbnN0YW5jZW9mIFNlY3VyaXR5QWR2aXNvcnkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdBZHZpc29yeSBmb3IgJy4kbmFtZS4nIGNvdWxkIG5vdCBiZSBsb2FkZWQgYXMgYSBmdWxsIGFkdmlzb3J5IGZyb20gJy4kdGhpcy0+Z2V0UmVwb05hbWUoKSAuIFBIUF9FT0wgLiB2YXJfZXhwb3J0KCRkYXRhLCB0cnVlKSk7Cn0KaWYgKCEkYWR2aXNvcnktPmFmZmVjdGVkVmVyc2lvbnMtPm1hdGNoZXMoJHBhY2thZ2VDb25zdHJhaW50TWFwWyRuYW1lXSkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkYWR2aXNvcnk7Cn07CgppZiAoJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlDb25maWdbJ21ldGFkYXRhJ10gJiYgKCRhbGxvd1BhcnRpYWxBZHZpc29yaWVzIHx8ICRhcGlVcmwgPT09IG51bGwpKSB7CiRwcm9taXNlcyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZUNvbnN0cmFpbnRNYXAgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKCgppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmFtZSkgfHwgJ19fcm9vdF9fJyA9PT0gJG5hbWUpIHsKY29udGludWU7Cn0KCiRwcm9taXNlc1tdID0gJHRoaXMtPnN0YXJ0Q2FjaGVkQXN5bmNEb3dubG9hZCgkbmFtZSwgJG5hbWUpCi0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRzcGVjKSB1c2UgKCYkYWR2aXNvcmllcywgJiRuYW1lc0ZvdW5kLCAmJHBhY2thZ2VDb25zdHJhaW50TWFwLCAkbmFtZSwgJGNyZWF0ZSk6IHZvaWQgewpbJHJlc3BvbnNlLCBdID0gJHNwZWM7CgppZiAoIWlzc2V0KCRyZXNwb25zZVsnc2VjdXJpdHktYWR2aXNvcmllcyddKSB8fCAhaXNfYXJyYXkoJHJlc3BvbnNlWydzZWN1cml0eS1hZHZpc29yaWVzJ10pKSB7CnJldHVybjsKfQoKJG5hbWVzRm91bmRbJG5hbWVdID0gdHJ1ZTsKaWYgKGNvdW50KCRyZXNwb25zZVsnc2VjdXJpdHktYWR2aXNvcmllcyddKSA+IDApIHsKJGFkdmlzb3JpZXNbJG5hbWVdID0gYXJyYXlfZmlsdGVyKGFycmF5X21hcCgKc3RhdGljIGZ1bmN0aW9uICgkZGF0YSkgdXNlICgkbmFtZSwgJGNyZWF0ZSkgewpyZXR1cm4gJGNyZWF0ZSgkZGF0YSwgJG5hbWUpOwp9LAokcmVzcG9uc2VbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXQopKTsKfQp1bnNldCgkcGFja2FnZUNvbnN0cmFpbnRNYXBbJG5hbWVdKTsKfSk7Cn0KCiR0aGlzLT5sb29wLT53YWl0KCRwcm9taXNlcyk7Cn0KCmlmICgkYXBpVXJsICE9PSBudWxsICYmIGNvdW50KCRwYWNrYWdlQ29uc3RyYWludE1hcCkgPiAwKSB7CiRvcHRpb25zID0gJHRoaXMtPm9wdGlvbnM7CiRvcHRpb25zWydodHRwJ11bJ21ldGhvZCddID0gJ1BPU1QnOwppZiAoaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gKGFycmF5KSAkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXTsKfQokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXVtdID0gJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzsKJG9wdGlvbnNbJ2h0dHAnXVsndGltZW91dCddID0gMTA7CiRvcHRpb25zWydodHRwJ11bJ2NvbnRlbnQnXSA9IGh0dHBfYnVpbGRfcXVlcnkoWydwYWNrYWdlcycgPT4gYXJyYXlfa2V5cygkcGFja2FnZUNvbnN0cmFpbnRNYXApXSk7CgokcmVzcG9uc2UgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkYXBpVXJsLCAkb3B0aW9ucyk7CiR3YXJuZWQgPSBmYWxzZTsKCmZvcmVhY2ggKCRyZXNwb25zZS0+ZGVjb2RlSnNvbigpWydhZHZpc29yaWVzJ10gYXMgJG5hbWUgPT4gJGxpc3QpIHsKaWYgKCFpc3NldCgkcGFja2FnZUNvbnN0cmFpbnRNYXBbJG5hbWVdKSkgewppZiAoISR3YXJuZWQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiR0aGlzLT5nZXRSZXBvTmFtZSgpLicgcmV0dXJuZWQgbmFtZXMgd2hpY2ggd2VyZSBub3QgcmVxdWVzdGVkIGluIHJlc3BvbnNlIHRvIHRoZSBzZWN1cml0eS1hZHZpc29yaWVzIEFQSS4gJy4kbmFtZS4nIHdhcyBub3QgcmVxdWVzdGVkIGJ1dCBpcyBwcmVzZW50IGluIHRoZSByZXNwb25zZS4gUmVxdWVzdGVkIG5hbWVzIHdlcmU6ICcuaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKCRwYWNrYWdlQ29uc3RyYWludE1hcCkpLic8L3dhcm5pbmc+Jyk7CiR3YXJuZWQgPSB0cnVlOwp9CmNvbnRpbnVlOwp9CmlmIChjb3VudCgkbGlzdCkgPiAwKSB7CiRhZHZpc29yaWVzWyRuYW1lXSA9IGFycmF5X2ZpbHRlcihhcnJheV9tYXAoCnN0YXRpYyBmdW5jdGlvbiAoJGRhdGEpIHVzZSAoJG5hbWUsICRjcmVhdGUpIHsKcmV0dXJuICRjcmVhdGUoJGRhdGEsICRuYW1lKTsKfSwKJGxpc3QKKSk7Cn0KJG5hbWVzRm91bmRbJG5hbWVdID0gdHJ1ZTsKfQp9CgpyZXR1cm4gWyduYW1lc0ZvdW5kJyA9PiBhcnJheV9rZXlzKCRuYW1lc0ZvdW5kKSwgJ2Fkdmlzb3JpZXMnID0+IGFycmF5X2ZpbHRlcigkYWR2aXNvcmllcyldOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdmlkZXJzKHN0cmluZyAkcGFja2FnZU5hbWUpCnsKJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSgpOwokcmVzdWx0ID0gW107CgppZiAoJHRoaXMtPnByb3ZpZGVyc0FwaVVybCkgewp0cnkgewokYXBpUmVzdWx0ID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoc3RyX3JlcGxhY2UoJyVwYWNrYWdlJScsICRwYWNrYWdlTmFtZSwgJHRoaXMtPnByb3ZpZGVyc0FwaVVybCksICR0aGlzLT5vcHRpb25zKS0+ZGVjb2RlSnNvbigpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKCRlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQwNCkgewpyZXR1cm4gJHJlc3VsdDsKfQp0aHJvdyAkZTsKfQoKZm9yZWFjaCAoJGFwaVJlc3VsdFsncHJvdmlkZXJzJ10gYXMgJHByb3ZpZGVyKSB7CiRyZXN1bHRbJHByb3ZpZGVyWyduYW1lJ11dID0gJHByb3ZpZGVyOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKaWYgKCR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMoKSkgewppZiAoIWlzX2FycmF5KCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWUpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2hhc1BhcnRpYWxQYWNrYWdlcyBmYWlsZWQgdG8gaW5pdGlhbGl6ZSAkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lJyk7Cn0KZm9yZWFjaCAoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZSBhcyAkdmVyc2lvbnMpIHsKZm9yZWFjaCAoJHZlcnNpb25zIGFzICRjYW5kaWRhdGUpIHsKaWYgKGlzc2V0KCRyZXN1bHRbJGNhbmRpZGF0ZVsnbmFtZSddXSkgfHwgIWlzc2V0KCRjYW5kaWRhdGVbJ3Byb3ZpZGUnXVskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQokcmVzdWx0WyRjYW5kaWRhdGVbJ25hbWUnXV0gPSBbCiduYW1lJyA9PiAkY2FuZGlkYXRlWyduYW1lJ10sCidkZXNjcmlwdGlvbicgPT4gJGNhbmRpZGF0ZVsnZGVzY3JpcHRpb24nXSA/PyAnJywKJ3R5cGUnID0+ICRjYW5kaWRhdGVbJ3R5cGUnXSA/PyAnJywKXTsKfQp9Cn0KCmlmICgkdGhpcy0+cGFja2FnZXMpIHsKJHJlc3VsdCA9IGFycmF5X21lcmdlKCRyZXN1bHQsIHBhcmVudDo6Z2V0UHJvdmlkZXJzKCRwYWNrYWdlTmFtZSkpOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQcm92aWRlck5hbWVzKCk6IGFycmF5CnsKJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSgpOwoKaWYgKG51bGwgPT09ICR0aGlzLT5wcm92aWRlckxpc3RpbmcpIHsKJGRhdGEgPSAkdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CmlmIChpc19hcnJheSgkZGF0YSkpIHsKJHRoaXMtPmxvYWRQcm92aWRlckxpc3RpbmdzKCRkYXRhKTsKfQp9CgppZiAoJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpIHsKCnJldHVybiBbXTsKfQoKaWYgKG51bGwgIT09ICR0aGlzLT5wcm92aWRlcnNVcmwgJiYgbnVsbCAhPT0gJHRoaXMtPnByb3ZpZGVyTGlzdGluZykgewpyZXR1cm4gYXJyYXlfa2V5cygkdGhpcy0+cHJvdmlkZXJMaXN0aW5nKTsKfQoKcmV0dXJuIFtdOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlUGFja2FnZVRyYW5zcG9ydE9wdGlvbnMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0RGlzdFVybHMoKSBhcyAkdXJsKSB7CmlmIChzdHJwb3MoJHVybCwgJHRoaXMtPmJhc2VVcmwpID09PSAwKSB7CiRwYWNrYWdlLT5zZXRUcmFuc3BvcnRPcHRpb25zKCR0aGlzLT5vcHRpb25zKTsKCnJldHVybjsKfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gaGFzUHJvdmlkZXJzKCk6IGJvb2wKewokdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CgpyZXR1cm4gJHRoaXMtPmhhc1Byb3ZpZGVyczsKfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gd2hhdFByb3ZpZGVzKHN0cmluZyAkbmFtZSwgP2FycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMgPSBudWxsLCA/YXJyYXkgJHN0YWJpbGl0eUZsYWdzID0gbnVsbCwgYXJyYXkgJGFscmVhZHlMb2FkZWQgPSBbXSk6IGFycmF5CnsKJHBhY2thZ2VzU291cmNlID0gbnVsbDsKaWYgKCEkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzKCkgfHwgIWlzc2V0KCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWVbJG5hbWVdKSkgewoKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5hbWUpIHx8ICdfX3Jvb3RfXycgPT09ICRuYW1lKSB7CnJldHVybiBbXTsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5wcm92aWRlckxpc3RpbmcpIHsKJGRhdGEgPSAkdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CmlmIChpc19hcnJheSgkZGF0YSkpIHsKJHRoaXMtPmxvYWRQcm92aWRlckxpc3RpbmdzKCRkYXRhKTsKfQp9CgokdXNlTGFzdE1vZGlmaWVkQ2hlY2sgPSBmYWxzZTsKaWYgKCR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsICYmICFpc3NldCgkdGhpcy0+cHJvdmlkZXJMaXN0aW5nWyRuYW1lXSkpIHsKJGhhc2ggPSBudWxsOwokdXJsID0gc3RyX3JlcGxhY2UoJyVwYWNrYWdlJScsICRuYW1lLCAkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCk7CiRjYWNoZUtleSA9ICdwcm92aWRlci0nLnN0cnRyKCRuYW1lLCAnLycsICckJykuJy5qc29uJzsKJHVzZUxhc3RNb2RpZmllZENoZWNrID0gdHJ1ZTsKfSBlbHNlaWYgKCR0aGlzLT5wcm92aWRlcnNVcmwpIHsKCmlmICghaXNzZXQoJHRoaXMtPnByb3ZpZGVyTGlzdGluZ1skbmFtZV0pKSB7CnJldHVybiBbXTsKfQoKJGhhc2ggPSAkdGhpcy0+cHJvdmlkZXJMaXN0aW5nWyRuYW1lXVsnc2hhMjU2J107CiR1cmwgPSBzdHJfcmVwbGFjZShbJyVwYWNrYWdlJScsICclaGFzaCUnXSwgWyRuYW1lLCAkaGFzaF0sICR0aGlzLT5wcm92aWRlcnNVcmwpOwokY2FjaGVLZXkgPSAncHJvdmlkZXItJy5zdHJ0cigkbmFtZSwgJy8nLCAnJCcpLicuanNvbic7Cn0gZWxzZSB7CnJldHVybiBbXTsKfQoKJHBhY2thZ2VzID0gbnVsbDsKaWYgKCEkdXNlTGFzdE1vZGlmaWVkQ2hlY2sgJiYgJGhhc2ggJiYgJHRoaXMtPmNhY2hlLT5zaGEyNTYoJGNhY2hlS2V5KSA9PT0gJGhhc2gpIHsKJHBhY2thZ2VzID0ganNvbl9kZWNvZGUoJHRoaXMtPmNhY2hlLT5yZWFkKCRjYWNoZUtleSksIHRydWUpOwokcGFja2FnZXNTb3VyY2UgPSAnY2FjaGVkIGZpbGUgKCcuJGNhY2hlS2V5Licgb3JpZ2luYXRpbmcgZnJvbSAnLlVybDo6c2FuaXRpemUoJHVybCkuJyknOwp9IGVsc2VpZiAoJHVzZUxhc3RNb2RpZmllZENoZWNrKSB7CmlmICgkY29udGVudHMgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJGNhY2hlS2V5KSkgewokY29udGVudHMgPSBqc29uX2RlY29kZSgkY29udGVudHMsIHRydWUpOwoKaWYgKGlzc2V0KCRhbHJlYWR5TG9hZGVkWyRuYW1lXSkpIHsKJHBhY2thZ2VzID0gJGNvbnRlbnRzOwokcGFja2FnZXNTb3VyY2UgPSAnY2FjaGVkIGZpbGUgKCcuJGNhY2hlS2V5Licgb3JpZ2luYXRpbmcgZnJvbSAnLlVybDo6c2FuaXRpemUoJHVybCkuJyknOwp9IGVsc2VpZiAoaXNzZXQoJGNvbnRlbnRzWydsYXN0LW1vZGlmaWVkJ10pKSB7CiRyZXNwb25zZSA9ICR0aGlzLT5mZXRjaEZpbGVJZkxhc3RNb2RpZmllZCgkdXJsLCAkY2FjaGVLZXksICRjb250ZW50c1snbGFzdC1tb2RpZmllZCddKTsKJHBhY2thZ2VzID0gdHJ1ZSA9PT0gJHJlc3BvbnNlID8gJGNvbnRlbnRzIDogJHJlc3BvbnNlOwokcGFja2FnZXNTb3VyY2UgPSB0cnVlID09PSAkcmVzcG9uc2UgPyAnY2FjaGVkIGZpbGUgKCcuJGNhY2hlS2V5Licgb3JpZ2luYXRpbmcgZnJvbSAnLlVybDo6c2FuaXRpemUoJHVybCkuJyknIDogJ2Rvd25sb2FkZWQgZmlsZSAoJy5Vcmw6OnNhbml0aXplKCR1cmwpLicpJzsKfQp9Cn0KCmlmICghJHBhY2thZ2VzKSB7CnRyeSB7CiRwYWNrYWdlcyA9ICR0aGlzLT5mZXRjaEZpbGUoJHVybCwgJGNhY2hlS2V5LCAkaGFzaCwgJHVzZUxhc3RNb2RpZmllZENoZWNrKTsKJHBhY2thZ2VzU291cmNlID0gJ2Rvd25sb2FkZWQgZmlsZSAoJy5Vcmw6OnNhbml0aXplKCR1cmwpLicpJzsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CgppZiAoJHRoaXMtPmxhenlQcm92aWRlcnNVcmwgJiYgaW5fYXJyYXkoJGUtPmdldFN0YXR1c0NvZGUoKSwgWzQwNCwgNDk5XSwgdHJ1ZSkpIHsKJHBhY2thZ2VzID0gWydwYWNrYWdlcycgPT4gW11dOwokcGFja2FnZXNTb3VyY2UgPSAnbm90LWZvdW5kIGZpbGUgKCcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nKSc7CmlmICgkZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0OTkpIHsKJHRoaXMtPmlvLT5lcnJvcignPHdhcm5pbmc+JyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnPC93YXJuaW5nPicpOwp9Cn0gZWxzZSB7CnRocm93ICRlOwp9Cn0KfQoKJGxvYWRpbmdQYXJ0aWFsUGFja2FnZSA9IGZhbHNlOwp9IGVsc2UgewokcGFja2FnZXMgPSBbJ3BhY2thZ2VzJyA9PiBbJ3ZlcnNpb25zJyA9PiAkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lWyRuYW1lXV1dOwokcGFja2FnZXNTb3VyY2UgPSAncm9vdCBmaWxlICgnLlVybDo6c2FuaXRpemUoJHRoaXMtPmdldFBhY2thZ2VzSnNvblVybCgpKS4nKSc7CiRsb2FkaW5nUGFydGlhbFBhY2thZ2UgPSB0cnVlOwp9CgokcmVzdWx0ID0gW107CiR2ZXJzaW9uc1RvTG9hZCA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXNbJ3BhY2thZ2VzJ10gYXMgJHZlcnNpb25zKSB7CmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAkdmVyc2lvbikgewokbm9ybWFsaXplZE5hbWUgPSBzdHJ0b2xvd2VyKCR2ZXJzaW9uWyduYW1lJ10pOwoKCmlmICgkbm9ybWFsaXplZE5hbWUgIT09ICRuYW1lKSB7CmNvbnRpbnVlOwp9CgppZiAoISRsb2FkaW5nUGFydGlhbFBhY2thZ2UgJiYgJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcygpICYmIGlzc2V0KCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWVbJG5vcm1hbGl6ZWROYW1lXSkpIHsKY29udGludWU7Cn0KCmlmICghaXNzZXQoJHZlcnNpb25zVG9Mb2FkWyR2ZXJzaW9uWyd1aWQnXV0pKSB7CmlmICghaXNzZXQoJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddKSkgewokdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uWyd2ZXJzaW9uJ10pOwp9IGVsc2VpZiAoJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewoKJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkdmVyc2lvblsndmVyc2lvbiddKTsKfQoKCmlmIChpc3NldCgkYWxyZWFkeUxvYWRlZFskbmFtZV1bJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddXSkpIHsKY29udGludWU7Cn0KCmlmICgkdGhpcy0+aXNWZXJzaW9uQWNjZXB0YWJsZShudWxsLCAkbm9ybWFsaXplZE5hbWUsICR2ZXJzaW9uLCAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MpKSB7CiR2ZXJzaW9uc1RvTG9hZFskdmVyc2lvblsndWlkJ11dID0gJHZlcnNpb247Cn0KfQp9Cn0KCgokbG9hZGVkUGFja2FnZXMgPSAkdGhpcy0+Y3JlYXRlUGFja2FnZXMoJHZlcnNpb25zVG9Mb2FkLCAkcGFja2FnZXNTb3VyY2UpOwokdWlkcyA9IGFycmF5X2tleXMoJHZlcnNpb25zVG9Mb2FkKTsKCmZvcmVhY2ggKCRsb2FkZWRQYWNrYWdlcyBhcyAkaW5kZXggPT4gJHBhY2thZ2UpIHsKJHBhY2thZ2UtPnNldFJlcG9zaXRvcnkoJHRoaXMpOwokdWlkID0gJHVpZHNbJGluZGV4XTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokYWxpYXNlZCA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7CiRhbGlhc2VkLT5zZXRSZXBvc2l0b3J5KCR0aGlzKTsKCiRyZXN1bHRbJHVpZF0gPSAkYWxpYXNlZDsKJHJlc3VsdFskdWlkLictYWxpYXMnXSA9ICRwYWNrYWdlOwp9IGVsc2UgewokcmVzdWx0WyR1aWRdID0gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKCkKewpwYXJlbnQ6OmluaXRpYWxpemUoKTsKCiRyZXBvRGF0YSA9ICR0aGlzLT5sb2FkRGF0YUZyb21TZXJ2ZXIoKTsKCmZvcmVhY2ggKCR0aGlzLT5jcmVhdGVQYWNrYWdlcygkcmVwb0RhdGEsICdyb290IGZpbGUgKCcuVXJsOjpzYW5pdGl6ZSgkdGhpcy0+Z2V0UGFja2FnZXNKc29uVXJsKCkpLicpJykgYXMgJHBhY2thZ2UpIHsKJHRoaXMtPmFkZFBhY2thZ2UoJHBhY2thZ2UpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKcGFyZW50OjphZGRQYWNrYWdlKCRwYWNrYWdlKTsKJHRoaXMtPmNvbmZpZ3VyZVBhY2thZ2VUcmFuc3BvcnRPcHRpb25zKCRwYWNrYWdlKTsKfQoKCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRBc3luY1BhY2thZ2VzKGFycmF5ICRwYWNrYWdlTmFtZXMsID9hcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzID0gbnVsbCwgP2FycmF5ICRzdGFiaWxpdHlGbGFncyA9IG51bGwsIGFycmF5ICRhbHJlYWR5TG9hZGVkID0gW10pOiBhcnJheQp7CiR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoKTsKCiRwYWNrYWdlcyA9IFtdOwokbmFtZXNGb3VuZCA9IFtdOwokcHJvbWlzZXMgPSBbXTsKCmlmIChudWxsID09PSAkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdsb2FkQXN5bmNQYWNrYWdlcyBvbmx5IHN1cHBvcnRzIHYyIHByb3RvY29sIGNvbXBvc2VyIHJlcG9zIHdpdGggYSBtZXRhZGF0YS11cmwnKTsKfQoKCmZvcmVhY2ggKCRwYWNrYWdlTmFtZXMgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCRhY2NlcHRhYmxlU3RhYmlsaXRpZXMgPT09IG51bGwgfHwgJHN0YWJpbGl0eUZsYWdzID09PSBudWxsIHx8IFN0YWJpbGl0eUZpbHRlcjo6aXNQYWNrYWdlQWNjZXB0YWJsZSgkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsIFskbmFtZV0sICdkZXYnKSkgewokcGFja2FnZU5hbWVzWyRuYW1lLid+ZGV2J10gPSAkY29uc3RyYWludDsKfQoKaWYgKGlzc2V0KCRhY2NlcHRhYmxlU3RhYmlsaXRpZXNbJ2RldiddKSAmJiBjb3VudCgkYWNjZXB0YWJsZVN0YWJpbGl0aWVzKSA9PT0gMSAmJiBjb3VudCgkc3RhYmlsaXR5RmxhZ3MpID09PSAwKSB7CnVuc2V0KCRwYWNrYWdlTmFtZXNbJG5hbWVdKTsKfQp9Cgpmb3JlYWNoICgkcGFja2FnZU5hbWVzIGFzICRuYW1lID0+ICRjb25zdHJhaW50KSB7CiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CgokcmVhbE5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7fmRldiR9JywgJycsICRuYW1lKTsKCmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZWFsTmFtZSkgfHwgJ19fcm9vdF9fJyA9PT0gJHJlYWxOYW1lKSB7CmNvbnRpbnVlOwp9CgokcHJvbWlzZXNbXSA9ICR0aGlzLT5zdGFydENhY2hlZEFzeW5jRG93bmxvYWQoJG5hbWUsICRyZWFsTmFtZSkKLT50aGVuKGZ1bmN0aW9uIChhcnJheSAkc3BlYykgdXNlICgmJHBhY2thZ2VzLCAmJG5hbWVzRm91bmQsICRyZWFsTmFtZSwgJGNvbnN0cmFpbnQsICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncywgJGFscmVhZHlMb2FkZWQpOiB2b2lkIHsKWyRyZXNwb25zZSwgJHBhY2thZ2VzU291cmNlXSA9ICRzcGVjOwppZiAobnVsbCA9PT0gJHJlc3BvbnNlIHx8ICFpc3NldCgkcmVzcG9uc2VbJ3BhY2thZ2VzJ11bJHJlYWxOYW1lXSkpIHsKcmV0dXJuOwp9CgokdmVyc2lvbnMgPSAkcmVzcG9uc2VbJ3BhY2thZ2VzJ11bJHJlYWxOYW1lXTsKCmlmIChpc3NldCgkcmVzcG9uc2VbJ21pbmlmaWVkJ10pICYmICRyZXNwb25zZVsnbWluaWZpZWQnXSA9PT0gJ2NvbXBvc2VyLzIuMCcpIHsKJHZlcnNpb25zID0gTWV0YWRhdGFNaW5pZmllcjo6ZXhwYW5kKCR2ZXJzaW9ucyk7Cn0KCiRuYW1lc0ZvdW5kWyRyZWFsTmFtZV0gPSB0cnVlOwokdmVyc2lvbnNUb0xvYWQgPSBbXTsKZm9yZWFjaCAoJHZlcnNpb25zIGFzICR2ZXJzaW9uKSB7CmlmICghaXNzZXQoJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddKSkgewokdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uWyd2ZXJzaW9uJ10pOwp9IGVsc2VpZiAoJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewoKJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkdmVyc2lvblsndmVyc2lvbiddKTsKfQoKCmlmIChpc3NldCgkYWxyZWFkeUxvYWRlZFskcmVhbE5hbWVdWyR2ZXJzaW9uWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXV0pKSB7CmNvbnRpbnVlOwp9CgppZiAoJHRoaXMtPmlzVmVyc2lvbkFjY2VwdGFibGUoJGNvbnN0cmFpbnQsICRyZWFsTmFtZSwgJHZlcnNpb24sICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncykpIHsKJHZlcnNpb25zVG9Mb2FkW10gPSAkdmVyc2lvbjsKfQp9CgokbG9hZGVkUGFja2FnZXMgPSAkdGhpcy0+Y3JlYXRlUGFja2FnZXMoJHZlcnNpb25zVG9Mb2FkLCAkcGFja2FnZXNTb3VyY2UpOwpmb3JlYWNoICgkbG9hZGVkUGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHBhY2thZ2UtPnNldFJlcG9zaXRvcnkoJHRoaXMpOwokcGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAhaXNzZXQoJHBhY2thZ2VzW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZS0+Z2V0QWxpYXNPZigpKV0pKSB7CiRwYWNrYWdlLT5nZXRBbGlhc09mKCktPnNldFJlcG9zaXRvcnkoJHRoaXMpOwokcGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpXSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KfQp9KTsKfQoKJHRoaXMtPmxvb3AtPndhaXQoJHByb21pc2VzKTsKCnJldHVybiBbJ25hbWVzRm91bmQnID0+ICRuYW1lc0ZvdW5kLCAncGFja2FnZXMnID0+ICRwYWNrYWdlc107Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc3RhcnRDYWNoZWRBc3luY0Rvd25sb2FkKHN0cmluZyAkZmlsZU5hbWUsID9zdHJpbmcgJHBhY2thZ2VOYW1lID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAobnVsbCA9PT0gJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignc3RhcnRDYWNoZWRBc3luY0Rvd25sb2FkIG9ubHkgc3VwcG9ydHMgdjIgcHJvdG9jb2wgY29tcG9zZXIgcmVwb3Mgd2l0aCBhIG1ldGFkYXRhLXVybCcpOwp9CgokbmFtZSA9IHN0cnRvbG93ZXIoJGZpbGVOYW1lKTsKJHBhY2thZ2VOYW1lID0gJHBhY2thZ2VOYW1lID8/ICRuYW1lOwoKJHVybCA9IHN0cl9yZXBsYWNlKCclcGFja2FnZSUnLCAkbmFtZSwgJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpOwokY2FjaGVLZXkgPSAncHJvdmlkZXItJy5zdHJ0cigkbmFtZSwgJy8nLCAnficpLicuanNvbic7CgokbGFzdE1vZGlmaWVkID0gbnVsbDsKaWYgKCRjb250ZW50cyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkY2FjaGVLZXkpKSB7CiRjb250ZW50cyA9IGpzb25fZGVjb2RlKCRjb250ZW50cywgdHJ1ZSk7CiRsYXN0TW9kaWZpZWQgPSAkY29udGVudHNbJ2xhc3QtbW9kaWZpZWQnXSA/PyBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPmFzeW5jRmV0Y2hGaWxlKCR1cmwsICRjYWNoZUtleSwgJGxhc3RNb2RpZmllZCkKLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoJHJlc3BvbnNlKSB1c2UgKCR1cmwsICRjYWNoZUtleSwgJGNvbnRlbnRzLCAkcGFja2FnZU5hbWUpOiBhcnJheSB7CiRwYWNrYWdlc1NvdXJjZSA9ICdkb3dubG9hZGVkIGZpbGUgKCcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nKSc7CgppZiAodHJ1ZSA9PT0gJHJlc3BvbnNlKSB7CiRwYWNrYWdlc1NvdXJjZSA9ICdjYWNoZWQgZmlsZSAoJy4kY2FjaGVLZXkuJyBvcmlnaW5hdGluZyBmcm9tICcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nKSc7CiRyZXNwb25zZSA9ICRjb250ZW50czsKfQoKaWYgKCFpc3NldCgkcmVzcG9uc2VbJ3BhY2thZ2VzJ11bJHBhY2thZ2VOYW1lXSkgJiYgIWlzc2V0KCRyZXNwb25zZVsnc2VjdXJpdHktYWR2aXNvcmllcyddKSkgewpyZXR1cm4gW251bGwsICRwYWNrYWdlc1NvdXJjZV07Cn0KCnJldHVybiBbJHJlc3BvbnNlLCAkcGFja2FnZXNTb3VyY2VdOwp9KTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzVmVyc2lvbkFjY2VwdGFibGUoP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQsIHN0cmluZyAkbmFtZSwgYXJyYXkgJHZlcnNpb25EYXRhLCA/YXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcyA9IG51bGwsID9hcnJheSAkc3RhYmlsaXR5RmxhZ3MgPSBudWxsKTogYm9vbAp7CiR2ZXJzaW9ucyA9IFskdmVyc2lvbkRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddXTsKCmlmICgkYWxpYXMgPSAkdGhpcy0+bG9hZGVyLT5nZXRCcmFuY2hBbGlhcygkdmVyc2lvbkRhdGEpKSB7CiR2ZXJzaW9uc1tdID0gJGFsaWFzOwp9Cgpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb24pIHsKaWYgKG51bGwgIT09ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMgJiYgbnVsbCAhPT0gJHN0YWJpbGl0eUZsYWdzICYmICFTdGFiaWxpdHlGaWx0ZXI6OmlzUGFja2FnZUFjY2VwdGFibGUoJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzLCBbJG5hbWVdLCBWZXJzaW9uUGFyc2VyOjpwYXJzZVN0YWJpbGl0eSgkdmVyc2lvbikpKSB7CmNvbnRpbnVlOwp9CgppZiAoJGNvbnN0cmFpbnQgJiYgIUNvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRjb25zdHJhaW50LCBDb25zdHJhaW50OjpPUF9FUSwgJHZlcnNpb24pKSB7CmNvbnRpbnVlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFBhY2thZ2VzSnNvblVybCgpOiBzdHJpbmcKewokanNvblVybFBhcnRzID0gcGFyc2VfdXJsKHN0cnRyKCR0aGlzLT51cmwsICdcXCcsICcvJykpOwoKaWYgKGlzc2V0KCRqc29uVXJsUGFydHNbJ3BhdGgnXSkgJiYgZmFsc2UgIT09IHN0cnBvcygkanNvblVybFBhcnRzWydwYXRoJ10sICcuanNvbicpKSB7CnJldHVybiAkdGhpcy0+dXJsOwp9CgpyZXR1cm4gJHRoaXMtPnVybCAuICcvcGFja2FnZXMuanNvbic7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBsb2FkUm9vdFNlcnZlckZpbGUoP2ludCAkcm9vdE1heEFnZSA9IG51bGwpCnsKaWYgKG51bGwgIT09ICR0aGlzLT5yb290RGF0YSkgewpyZXR1cm4gJHRoaXMtPnJvb3REYXRhOwp9CgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSAmJiBzdHJwb3MoJHRoaXMtPnVybCwgJ2h0dHBzJykgPT09IDApIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgbXVzdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uIGluIHlvdXIgcGhwLmluaSB0byBsb2FkIGluZm9ybWF0aW9uIGZyb20gJy4kdGhpcy0+dXJsKTsKfQoKaWYgKCRjYWNoZWREYXRhID0gJHRoaXMtPmNhY2hlLT5yZWFkKCdwYWNrYWdlcy5qc29uJykpIHsKJGNhY2hlZERhdGEgPSBqc29uX2RlY29kZSgkY2FjaGVkRGF0YSwgdHJ1ZSk7CmlmICgkcm9vdE1heEFnZSAhPT0gbnVsbCAmJiAoJGFnZSA9ICR0aGlzLT5jYWNoZS0+Z2V0QWdlKCdwYWNrYWdlcy5qc29uJykpICE9PSBmYWxzZSAmJiAkYWdlIDw9ICRyb290TWF4QWdlKSB7CiRkYXRhID0gJGNhY2hlZERhdGE7Cn0gZWxzZWlmIChpc3NldCgkY2FjaGVkRGF0YVsnbGFzdC1tb2RpZmllZCddKSkgewokcmVzcG9uc2UgPSAkdGhpcy0+ZmV0Y2hGaWxlSWZMYXN0TW9kaWZpZWQoJHRoaXMtPmdldFBhY2thZ2VzSnNvblVybCgpLCAncGFja2FnZXMuanNvbicsICRjYWNoZWREYXRhWydsYXN0LW1vZGlmaWVkJ10pOwokZGF0YSA9IHRydWUgPT09ICRyZXNwb25zZSA/ICRjYWNoZWREYXRhIDogJHJlc3BvbnNlOwp9Cn0KCmlmICghaXNzZXQoJGRhdGEpKSB7CiRkYXRhID0gJHRoaXMtPmZldGNoRmlsZSgkdGhpcy0+Z2V0UGFja2FnZXNKc29uVXJsKCksICdwYWNrYWdlcy5qc29uJywgbnVsbCwgdHJ1ZSk7Cn0KCmlmICghZW1wdHkoJGRhdGFbJ25vdGlmeS1iYXRjaCddKSkgewokdGhpcy0+bm90aWZ5VXJsID0gJHRoaXMtPmNhbm9uaWNhbGl6ZVVybCgkZGF0YVsnbm90aWZ5LWJhdGNoJ10pOwp9IGVsc2VpZiAoIWVtcHR5KCRkYXRhWydub3RpZnknXSkpIHsKJHRoaXMtPm5vdGlmeVVybCA9ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ25vdGlmeSddKTsKfQoKaWYgKCFlbXB0eSgkZGF0YVsnc2VhcmNoJ10pKSB7CiR0aGlzLT5zZWFyY2hVcmwgPSAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydzZWFyY2gnXSk7Cn0KCmlmICghZW1wdHkoJGRhdGFbJ21pcnJvcnMnXSkpIHsKZm9yZWFjaCAoJGRhdGFbJ21pcnJvcnMnXSBhcyAkbWlycm9yKSB7CmlmICghZW1wdHkoJG1pcnJvclsnZ2l0LXVybCddKSkgewokdGhpcy0+c291cmNlTWlycm9yc1snZ2l0J11bXSA9IFsndXJsJyA9PiAkbWlycm9yWydnaXQtdXJsJ10sICdwcmVmZXJyZWQnID0+ICFlbXB0eSgkbWlycm9yWydwcmVmZXJyZWQnXSldOwp9CmlmICghZW1wdHkoJG1pcnJvclsnaGctdXJsJ10pKSB7CiR0aGlzLT5zb3VyY2VNaXJyb3JzWydoZyddW10gPSBbJ3VybCcgPT4gJG1pcnJvclsnaGctdXJsJ10sICdwcmVmZXJyZWQnID0+ICFlbXB0eSgkbWlycm9yWydwcmVmZXJyZWQnXSldOwp9CmlmICghZW1wdHkoJG1pcnJvclsnZGlzdC11cmwnXSkpIHsKJHRoaXMtPmRpc3RNaXJyb3JzW10gPSBbCid1cmwnID0+ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJG1pcnJvclsnZGlzdC11cmwnXSksCidwcmVmZXJyZWQnID0+ICFlbXB0eSgkbWlycm9yWydwcmVmZXJyZWQnXSksCl07Cn0KfQp9CgppZiAoIWVtcHR5KCRkYXRhWydwcm92aWRlcnMtbGF6eS11cmwnXSkpIHsKJHRoaXMtPmxhenlQcm92aWRlcnNVcmwgPSAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydwcm92aWRlcnMtbGF6eS11cmwnXSk7CiR0aGlzLT5oYXNQcm92aWRlcnMgPSB0cnVlOwoKJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcyA9ICFlbXB0eSgkZGF0YVsncGFja2FnZXMnXSkgJiYgaXNfYXJyYXkoJGRhdGFbJ3BhY2thZ2VzJ10pOwp9CgoKCgppZiAoIWVtcHR5KCRkYXRhWydtZXRhZGF0YS11cmwnXSkpIHsKJHRoaXMtPmxhenlQcm92aWRlcnNVcmwgPSAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydtZXRhZGF0YS11cmwnXSk7CiR0aGlzLT5wcm92aWRlcnNVcmwgPSBudWxsOwokdGhpcy0+aGFzUHJvdmlkZXJzID0gZmFsc2U7CiR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMgPSAhZW1wdHkoJGRhdGFbJ3BhY2thZ2VzJ10pICYmIGlzX2FycmF5KCRkYXRhWydwYWNrYWdlcyddKTsKJHRoaXMtPmFsbG93U3NsRG93bmdyYWRlID0gZmFsc2U7CgoKCgppZiAoIWVtcHR5KCRkYXRhWydhdmFpbGFibGUtcGFja2FnZXMnXSkpIHsKJGF2YWlsUGFja2FnZXMgPSBhcnJheV9tYXAoJ3N0cnRvbG93ZXInLCAkZGF0YVsnYXZhaWxhYmxlLXBhY2thZ2VzJ10pOwokdGhpcy0+YXZhaWxhYmxlUGFja2FnZXMgPSBhcnJheV9jb21iaW5lKCRhdmFpbFBhY2thZ2VzLCAkYXZhaWxQYWNrYWdlcyk7CiR0aGlzLT5oYXNBdmFpbGFibGVQYWNrYWdlTGlzdCA9IHRydWU7Cn0KCgoKCmlmICghZW1wdHkoJGRhdGFbJ2F2YWlsYWJsZS1wYWNrYWdlLXBhdHRlcm5zJ10pKSB7CiR0aGlzLT5hdmFpbGFibGVQYWNrYWdlUGF0dGVybnMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkcGF0dGVybik6IHN0cmluZyB7CnJldHVybiBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGF0dGVybik7Cn0sICRkYXRhWydhdmFpbGFibGUtcGFja2FnZS1wYXR0ZXJucyddKTsKJHRoaXMtPmhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0ID0gdHJ1ZTsKfQoKCgp1bnNldCgkZGF0YVsncHJvdmlkZXJzLXVybCddLCAkZGF0YVsncHJvdmlkZXJzJ10sICRkYXRhWydwcm92aWRlcnMtaW5jbHVkZXMnXSk7CgppZiAoaXNzZXQoJGRhdGFbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXSkgJiYgaXNfYXJyYXkoJGRhdGFbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXSkpIHsKJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlDb25maWcgPSBbCidtZXRhZGF0YScgPT4gJGRhdGFbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXVsnbWV0YWRhdGEnXSA/PyBmYWxzZSwKJ2FwaS11cmwnID0+IGlzc2V0KCRkYXRhWydzZWN1cml0eS1hZHZpc29yaWVzJ11bJ2FwaS11cmwnXSkgJiYgaXNfc3RyaW5nKCRkYXRhWydzZWN1cml0eS1hZHZpc29yaWVzJ11bJ2FwaS11cmwnXSkgPyAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydzZWN1cml0eS1hZHZpc29yaWVzJ11bJ2FwaS11cmwnXSkgOiBudWxsLApdOwppZiAoJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlDb25maWdbJ2FwaS11cmwnXSA9PT0gbnVsbCAmJiAhJHRoaXMtPmhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0KSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdJbnZhbGlkIHNlY3VyaXR5IGFkdmlzb3J5IGNvbmZpZ3VyYXRpb24gb24gJy4kdGhpcy0+Z2V0UmVwb05hbWUoKS4nOiBJZiB0aGUgcmVwb3NpdG9yeSBkb2VzIG5vdCBwcm92aWRlIGEgc2VjdXJpdHktYWR2aXNvcmllcy5hcGktdXJsIHRoZW4gYXZhaWxhYmxlLXBhY2thZ2VzIG9yIGF2YWlsYWJsZS1wYWNrYWdlLXBhdHRlcm5zIGFyZSByZXF1aXJlZCB0byBiZSBwcm92aWRlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29uLicpOwp9Cn0KfQoKaWYgKCR0aGlzLT5hbGxvd1NzbERvd25ncmFkZSkgewokdGhpcy0+dXJsID0gc3RyX3JlcGxhY2UoJ2h0dHBzOi8vJywgJ2h0dHA6Ly8nLCAkdGhpcy0+dXJsKTsKJHRoaXMtPmJhc2VVcmwgPSBzdHJfcmVwbGFjZSgnaHR0cHM6Ly8nLCAnaHR0cDovLycsICR0aGlzLT5iYXNlVXJsKTsKfQoKaWYgKCFlbXB0eSgkZGF0YVsncHJvdmlkZXJzLXVybCddKSkgewokdGhpcy0+cHJvdmlkZXJzVXJsID0gJHRoaXMtPmNhbm9uaWNhbGl6ZVVybCgkZGF0YVsncHJvdmlkZXJzLXVybCddKTsKJHRoaXMtPmhhc1Byb3ZpZGVycyA9IHRydWU7Cn0KCmlmICghZW1wdHkoJGRhdGFbJ2xpc3QnXSkpIHsKJHRoaXMtPmxpc3RVcmwgPSAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydsaXN0J10pOwp9CgppZiAoIWVtcHR5KCRkYXRhWydwcm92aWRlcnMnXSkgfHwgIWVtcHR5KCRkYXRhWydwcm92aWRlcnMtaW5jbHVkZXMnXSkpIHsKJHRoaXMtPmhhc1Byb3ZpZGVycyA9IHRydWU7Cn0KCmlmICghZW1wdHkoJGRhdGFbJ3Byb3ZpZGVycy1hcGknXSkpIHsKJHRoaXMtPnByb3ZpZGVyc0FwaVVybCA9ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ3Byb3ZpZGVycy1hcGknXSk7Cn0KCnJldHVybiAkdGhpcy0+cm9vdERhdGEgPSAkZGF0YTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY2Fub25pY2FsaXplVXJsKHN0cmluZyAkdXJsKTogc3RyaW5nCnsKaWYgKHN0cmxlbigkdXJsKSA9PT0gMCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignRXhwZWN0ZWQgYSBzdHJpbmcgd2l0aCBhIHZhbHVlIGFuZCBub3QgYW4gZW1wdHkgc3RyaW5nJyk7Cn0KCmlmIChzdHJfc3RhcnRzX3dpdGgoJHVybCwgJy8nKSkgewppZiAoUHJlZzo6aXNNYXRjaCgne15bXjpdKys6Ly9bXi9dKit9JywgJHRoaXMtPnVybCwgJG1hdGNoZXMpKSB7CnJldHVybiAkbWF0Y2hlc1swXSAuICR1cmw7Cn0KCnJldHVybiAkdGhpcy0+dXJsOwp9CgpyZXR1cm4gJHVybDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2FkRGF0YUZyb21TZXJ2ZXIoKTogYXJyYXkKewokZGF0YSA9ICR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoKTsKaWYgKHRydWUgPT09ICRkYXRhKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2xvYWRSb290U2VydmVyRmlsZSBzaG91bGQgbm90IHJldHVybiB0cnVlIGR1cmluZyBpbml0aWFsaXphdGlvbicpOwp9CgpyZXR1cm4gJHRoaXMtPmxvYWRJbmNsdWRlcygkZGF0YSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gaGFzUGFydGlhbFBhY2thZ2VzKCk6IGJvb2wKewppZiAoJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcyAmJiBudWxsID09PSAkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lKSB7CiR0aGlzLT5pbml0aWFsaXplUGFydGlhbFBhY2thZ2VzKCk7Cn0KCnJldHVybiAkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRQcm92aWRlckxpc3RpbmdzKCRkYXRhKTogdm9pZAp7CmlmIChpc3NldCgkZGF0YVsncHJvdmlkZXJzJ10pKSB7CmlmICghaXNfYXJyYXkoJHRoaXMtPnByb3ZpZGVyTGlzdGluZykpIHsKJHRoaXMtPnByb3ZpZGVyTGlzdGluZyA9IFtdOwp9CiR0aGlzLT5wcm92aWRlckxpc3RpbmcgPSBhcnJheV9tZXJnZSgkdGhpcy0+cHJvdmlkZXJMaXN0aW5nLCAkZGF0YVsncHJvdmlkZXJzJ10pOwp9CgppZiAoJHRoaXMtPnByb3ZpZGVyc1VybCAmJiBpc3NldCgkZGF0YVsncHJvdmlkZXItaW5jbHVkZXMnXSkpIHsKJGluY2x1ZGVzID0gJGRhdGFbJ3Byb3ZpZGVyLWluY2x1ZGVzJ107CmZvcmVhY2ggKCRpbmNsdWRlcyBhcyAkaW5jbHVkZSA9PiAkbWV0YWRhdGEpIHsKJHVybCA9ICR0aGlzLT5iYXNlVXJsIC4gJy8nIC4gc3RyX3JlcGxhY2UoJyVoYXNoJScsICRtZXRhZGF0YVsnc2hhMjU2J10sICRpbmNsdWRlKTsKJGNhY2hlS2V5ID0gc3RyX3JlcGxhY2UoWyclaGFzaCUnLCckJ10sICcnLCAkaW5jbHVkZSk7CmlmICgkdGhpcy0+Y2FjaGUtPnNoYTI1NigkY2FjaGVLZXkpID09PSAkbWV0YWRhdGFbJ3NoYTI1NiddKSB7CiRpbmNsdWRlZERhdGEgPSBqc29uX2RlY29kZSgkdGhpcy0+Y2FjaGUtPnJlYWQoJGNhY2hlS2V5KSwgdHJ1ZSk7Cn0gZWxzZSB7CiRpbmNsdWRlZERhdGEgPSAkdGhpcy0+ZmV0Y2hGaWxlKCR1cmwsICRjYWNoZUtleSwgJG1ldGFkYXRhWydzaGEyNTYnXSk7Cn0KCiR0aGlzLT5sb2FkUHJvdmlkZXJMaXN0aW5ncygkaW5jbHVkZWREYXRhKTsKfQp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2FkSW5jbHVkZXMoYXJyYXkgJGRhdGEpOiBhcnJheQp7CiRwYWNrYWdlcyA9IFtdOwoKCmlmICghaXNzZXQoJGRhdGFbJ3BhY2thZ2VzJ10pICYmICFpc3NldCgkZGF0YVsnaW5jbHVkZXMnXSkpIHsKZm9yZWFjaCAoJGRhdGEgYXMgJHBrZykgewppZiAoaXNzZXQoJHBrZ1sndmVyc2lvbnMnXSkgJiYgaXNfYXJyYXkoJHBrZ1sndmVyc2lvbnMnXSkpIHsKZm9yZWFjaCAoJHBrZ1sndmVyc2lvbnMnXSBhcyAkbWV0YWRhdGEpIHsKJHBhY2thZ2VzW10gPSAkbWV0YWRhdGE7Cn0KfQp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgppZiAoaXNzZXQoJGRhdGFbJ3BhY2thZ2VzJ10pKSB7CmZvcmVhY2ggKCRkYXRhWydwYWNrYWdlcyddIGFzICRwYWNrYWdlID0+ICR2ZXJzaW9ucykgewokcGFja2FnZU5hbWUgPSBzdHJ0b2xvd2VyKChzdHJpbmcpICRwYWNrYWdlKTsKZm9yZWFjaCAoJHZlcnNpb25zIGFzICR2ZXJzaW9uID0+ICRtZXRhZGF0YSkgewokcGFja2FnZXNbXSA9ICRtZXRhZGF0YTsKaWYgKCEkdGhpcy0+ZGlzcGxheWVkV2FybmluZ0Fib3V0Tm9uTWF0Y2hpbmdQYWNrYWdlSW5kZXggJiYgJHBhY2thZ2VOYW1lICE9PSBzdHJ0b2xvd2VyKChzdHJpbmcpICgkbWV0YWRhdGFbJ25hbWUnXSA/PyAnJykpKSB7CiR0aGlzLT5kaXNwbGF5ZWRXYXJuaW5nQWJvdXROb25NYXRjaGluZ1BhY2thZ2VJbmRleCA9IHRydWU7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCI8d2FybmluZz5XYXJuaW5nOiB0aGUgcGFja2FnZXMga2V5ICclcycgZG9lc24ndCBtYXRjaCB0aGUgbmFtZSBkZWZpbmVkIGluIHRoZSBwYWNrYWdlIG1ldGFkYXRhICclcycgaW4gcmVwb3NpdG9yeSAlczwvd2FybmluZz4iLCAkcGFja2FnZSwgJG1ldGFkYXRhWyduYW1lJ10gPz8gJycsICR0aGlzLT5iYXNlVXJsKSk7Cn0KfQp9Cn0KCmlmIChpc3NldCgkZGF0YVsnaW5jbHVkZXMnXSkpIHsKZm9yZWFjaCAoJGRhdGFbJ2luY2x1ZGVzJ10gYXMgJGluY2x1ZGUgPT4gJG1ldGFkYXRhKSB7CmlmIChpc3NldCgkbWV0YWRhdGFbJ3NoYTEnXSkgJiYgJHRoaXMtPmNhY2hlLT5zaGExKChzdHJpbmcpICRpbmNsdWRlKSA9PT0gJG1ldGFkYXRhWydzaGExJ10pIHsKJGluY2x1ZGVkRGF0YSA9IGpzb25fZGVjb2RlKCR0aGlzLT5jYWNoZS0+cmVhZCgoc3RyaW5nKSAkaW5jbHVkZSksIHRydWUpOwp9IGVsc2UgewokaW5jbHVkZWREYXRhID0gJHRoaXMtPmZldGNoRmlsZSgkaW5jbHVkZSk7Cn0KJHBhY2thZ2VzID0gYXJyYXlfbWVyZ2UoJHBhY2thZ2VzLCAkdGhpcy0+bG9hZEluY2x1ZGVzKCRpbmNsdWRlZERhdGEpKTsKfQp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzLCA/c3RyaW5nICRzb3VyY2UgPSBudWxsKTogYXJyYXkKewppZiAoISRwYWNrYWdlcykgewpyZXR1cm4gW107Cn0KCnRyeSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAmJGRhdGEpIHsKaWYgKCFpc3NldCgkZGF0YVsnbm90aWZpY2F0aW9uLXVybCddKSkgewokZGF0YVsnbm90aWZpY2F0aW9uLXVybCddID0gJHRoaXMtPm5vdGlmeVVybDsKfQp9CgokcGFja2FnZUluc3RhbmNlcyA9ICR0aGlzLT5sb2FkZXItPmxvYWRQYWNrYWdlcygkcGFja2FnZXMpOwoKZm9yZWFjaCAoJHBhY2thZ2VJbnN0YW5jZXMgYXMgJHBhY2thZ2UpIHsKaWYgKGlzc2V0KCR0aGlzLT5zb3VyY2VNaXJyb3JzWyRwYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCldKSkgewokcGFja2FnZS0+c2V0U291cmNlTWlycm9ycygkdGhpcy0+c291cmNlTWlycm9yc1skcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpXSk7Cn0KJHBhY2thZ2UtPnNldERpc3RNaXJyb3JzKCR0aGlzLT5kaXN0TWlycm9ycyk7CiR0aGlzLT5jb25maWd1cmVQYWNrYWdlVHJhbnNwb3J0T3B0aW9ucygkcGFja2FnZSk7Cn0KCnJldHVybiAkcGFja2FnZUluc3RhbmNlczsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBsb2FkIHBhY2thZ2VzICcuKCRwYWNrYWdlc1swXVsnbmFtZSddID8/IGpzb25fZW5jb2RlKCRwYWNrYWdlcykpLicgaW4gJy4kdGhpcy0+Z2V0UmVwb05hbWUoKS4oJHNvdXJjZSA/ICcgZnJvbSAnLiRzb3VyY2UgOiAnJykuJzogWycuZ2V0X2NsYXNzKCRlKS4nXSAnLiRlLT5nZXRNZXNzYWdlKCksIDAsICRlKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZmV0Y2hGaWxlKHN0cmluZyAkZmlsZW5hbWUsID9zdHJpbmcgJGNhY2hlS2V5ID0gbnVsbCwgP3N0cmluZyAkc2hhMjU2ID0gbnVsbCwgYm9vbCAkc3RvcmVMYXN0TW9kaWZpZWRUaW1lID0gZmFsc2UpCnsKaWYgKCcnID09PSAkZmlsZW5hbWUpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRmaWxlbmFtZSBzaG91bGQgbm90IGJlIGFuIGVtcHR5IHN0cmluZycpOwp9CgppZiAobnVsbCA9PT0gJGNhY2hlS2V5KSB7CiRjYWNoZUtleSA9ICRmaWxlbmFtZTsKJGZpbGVuYW1lID0gJHRoaXMtPmJhc2VVcmwuJy8nLiRmaWxlbmFtZTsKfQoKCmlmICgoJHBvcyA9IHN0cnBvcygkZmlsZW5hbWUsICckJykpICYmIFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vfWknLCAkZmlsZW5hbWUpKSB7CiRmaWxlbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUsIDAsICRwb3MpIC4gJyUyNCcgLiBzdWJzdHIoJGZpbGVuYW1lLCAkcG9zICsgMSk7Cn0KCiRyZXRyaWVzID0gMzsKd2hpbGUgKCRyZXRyaWVzLS0pIHsKdHJ5IHsKJG9wdGlvbnMgPSAkdGhpcy0+b3B0aW9uczsKaWYgKCR0aGlzLT5ldmVudERpc3BhdGNoZXIpIHsKJHByZUZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFByZUZpbGVEb3dubG9hZEV2ZW50KFBsdWdpbkV2ZW50czo6UFJFX0ZJTEVfRE9XTkxPQUQsICR0aGlzLT5odHRwRG93bmxvYWRlciwgJGZpbGVuYW1lLCAnbWV0YWRhdGEnLCBbJ3JlcG9zaXRvcnknID0+ICR0aGlzXSk7CiRwcmVGaWxlRG93bmxvYWRFdmVudC0+c2V0VHJhbnNwb3J0T3B0aW9ucygkdGhpcy0+b3B0aW9ucyk7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcHJlRmlsZURvd25sb2FkRXZlbnQpOwokZmlsZW5hbWUgPSAkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldFByb2Nlc3NlZFVybCgpOwokb3B0aW9ucyA9ICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpOwp9CgokcmVzcG9uc2UgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkZmlsZW5hbWUsICRvcHRpb25zKTsKJGpzb24gPSAoc3RyaW5nKSAkcmVzcG9uc2UtPmdldEJvZHkoKTsKaWYgKCRzaGEyNTYgJiYgJHNoYTI1NiAhPT0gaGFzaCgnc2hhMjU2JywgJGpzb24pKSB7CgppZiAoJHRoaXMtPmFsbG93U3NsRG93bmdyYWRlKSB7CiR0aGlzLT51cmwgPSBzdHJfcmVwbGFjZSgnaHR0cDovLycsICdodHRwczovLycsICR0aGlzLT51cmwpOwokdGhpcy0+YmFzZVVybCA9IHN0cl9yZXBsYWNlKCdodHRwOi8vJywgJ2h0dHBzOi8vJywgJHRoaXMtPmJhc2VVcmwpOwokZmlsZW5hbWUgPSBzdHJfcmVwbGFjZSgnaHR0cDovLycsICdodHRwczovLycsICRmaWxlbmFtZSk7Cn0KCmlmICgkcmV0cmllcyA+IDApIHsKdXNsZWVwKDEwMDAwMCk7Cgpjb250aW51ZTsKfQoKCnRocm93IG5ldyBSZXBvc2l0b3J5U2VjdXJpdHlFeGNlcHRpb24oJ1RoZSBjb250ZW50cyBvZiAnLiRmaWxlbmFtZS4nIGRvIG5vdCBtYXRjaCBpdHMgc2lnbmF0dXJlLiBUaGlzIGNvdWxkIGluZGljYXRlIGEgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrIG9yIGUuZy4gYW50aXZpcnVzIHNvZnR3YXJlIGNvcnJ1cHRpbmcgZmlsZXMuIFRyeSBydW5uaW5nIGNvbXBvc2VyIGFnYWluIGFuZCByZXBvcnQgdGhpcyBpZiB5b3UgdGhpbmsgaXQgaXMgYSBtaXN0YWtlLicpOwp9CgppZiAoJHRoaXMtPmV2ZW50RGlzcGF0Y2hlcikgewokcG9zdEZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFBvc3RGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBPU1RfRklMRV9ET1dOTE9BRCwgbnVsbCwgJHNoYTI1NiwgJGZpbGVuYW1lLCAnbWV0YWRhdGEnLCBbJ3Jlc3BvbnNlJyA9PiAkcmVzcG9uc2UsICdyZXBvc2l0b3J5JyA9PiAkdGhpc10pOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkcG9zdEZpbGVEb3dubG9hZEV2ZW50LT5nZXROYW1lKCksICRwb3N0RmlsZURvd25sb2FkRXZlbnQpOwp9CgokZGF0YSA9ICRyZXNwb25zZS0+ZGVjb2RlSnNvbigpOwpIdHRwRG93bmxvYWRlcjo6b3V0cHV0V2FybmluZ3MoJHRoaXMtPmlvLCAkdGhpcy0+dXJsLCAkZGF0YSk7CgppZiAoJGNhY2hlS2V5ICYmICEkdGhpcy0+Y2FjaGUtPmlzUmVhZE9ubHkoKSkgewppZiAoJHN0b3JlTGFzdE1vZGlmaWVkVGltZSkgewokbGFzdE1vZGlmaWVkRGF0ZSA9ICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdsYXN0LW1vZGlmaWVkJyk7CmlmICgkbGFzdE1vZGlmaWVkRGF0ZSkgewokZGF0YVsnbGFzdC1tb2RpZmllZCddID0gJGxhc3RNb2RpZmllZERhdGU7CiRqc29uID0gSnNvbkZpbGU6OmVuY29kZSgkZGF0YSwgMCk7Cn0KfQokdGhpcy0+Y2FjaGUtPndyaXRlKCRjYWNoZUtleSwgJGpzb24pOwp9CgokcmVzcG9uc2UtPmNvbGxlY3QoKTsKCmJyZWFrOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFxMb2dpY0V4Y2VwdGlvbikgewp0aHJvdyAkZTsKfQoKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmICRlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQwNCkgewp0aHJvdyAkZTsKfQoKaWYgKCRlIGluc3RhbmNlb2YgUmVwb3NpdG9yeVNlY3VyaXR5RXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CgppZiAoJGNhY2hlS2V5ICYmICgkY29udGVudHMgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJGNhY2hlS2V5KSkpIHsKaWYgKCEkdGhpcy0+ZGVncmFkZWRNb2RlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kdGhpcy0+dXJsLicgY291bGQgbm90IGJlIGZ1bGx5IGxvYWRlZCAoJy4kZS0+Z2V0TWVzc2FnZSgpLicpLCBwYWNrYWdlIGluZm9ybWF0aW9uIHdhcyBsb2FkZWQgZnJvbSB0aGUgbG9jYWwgY2FjaGUgYW5kIG1heSBiZSBvdXQgb2YgZGF0ZTwvd2FybmluZz4nKTsKfQokdGhpcy0+ZGVncmFkZWRNb2RlID0gdHJ1ZTsKJGRhdGEgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRjb250ZW50cywgJHRoaXMtPmNhY2hlLT5nZXRSb290KCkuJGNhY2hlS2V5KTsKCmJyZWFrOwp9Cgp0aHJvdyAkZTsKfQp9CgppZiAoIWlzc2V0KCRkYXRhKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCJDb21wb3NlclJlcG9zaXRvcnk6IFVuZGVmaW5lZCBcJGRhdGEuIFBsZWFzZSByZXBvcnQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy9uZXcuIik7Cn0KCnJldHVybiAkZGF0YTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmZXRjaEZpbGVJZkxhc3RNb2RpZmllZChzdHJpbmcgJGZpbGVuYW1lLCBzdHJpbmcgJGNhY2hlS2V5LCBzdHJpbmcgJGxhc3RNb2RpZmllZFRpbWUpCnsKaWYgKCcnID09PSAkZmlsZW5hbWUpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRmaWxlbmFtZSBzaG91bGQgbm90IGJlIGFuIGVtcHR5IHN0cmluZycpOwp9Cgp0cnkgewokb3B0aW9ucyA9ICR0aGlzLT5vcHRpb25zOwppZiAoJHRoaXMtPmV2ZW50RGlzcGF0Y2hlcikgewokcHJlRmlsZURvd25sb2FkRXZlbnQgPSBuZXcgUHJlRmlsZURvd25sb2FkRXZlbnQoUGx1Z2luRXZlbnRzOjpQUkVfRklMRV9ET1dOTE9BRCwgJHRoaXMtPmh0dHBEb3dubG9hZGVyLCAkZmlsZW5hbWUsICdtZXRhZGF0YScsIFsncmVwb3NpdG9yeScgPT4gJHRoaXNdKTsKJHByZUZpbGVEb3dubG9hZEV2ZW50LT5zZXRUcmFuc3BvcnRPcHRpb25zKCR0aGlzLT5vcHRpb25zKTsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXROYW1lKCksICRwcmVGaWxlRG93bmxvYWRFdmVudCk7CiRmaWxlbmFtZSA9ICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0UHJvY2Vzc2VkVXJsKCk7CiRvcHRpb25zID0gJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRUcmFuc3BvcnRPcHRpb25zKCk7Cn0KCmlmIChpc3NldCgkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSAoYXJyYXkpICRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddOwp9CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddW10gPSAnSWYtTW9kaWZpZWQtU2luY2U6ICcuJGxhc3RNb2RpZmllZFRpbWU7CiRyZXNwb25zZSA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCRmaWxlbmFtZSwgJG9wdGlvbnMpOwokanNvbiA9IChzdHJpbmcpICRyZXNwb25zZS0+Z2V0Qm9keSgpOwppZiAoJGpzb24gPT09ICcnICYmICRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpID09PSAzMDQpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgkdGhpcy0+ZXZlbnREaXNwYXRjaGVyKSB7CiRwb3N0RmlsZURvd25sb2FkRXZlbnQgPSBuZXcgUG9zdEZpbGVEb3dubG9hZEV2ZW50KFBsdWdpbkV2ZW50czo6UE9TVF9GSUxFX0RPV05MT0FELCBudWxsLCBudWxsLCAkZmlsZW5hbWUsICdtZXRhZGF0YScsIFsncmVzcG9uc2UnID0+ICRyZXNwb25zZSwgJ3JlcG9zaXRvcnknID0+ICR0aGlzXSk7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRwb3N0RmlsZURvd25sb2FkRXZlbnQtPmdldE5hbWUoKSwgJHBvc3RGaWxlRG93bmxvYWRFdmVudCk7Cn0KCiRkYXRhID0gJHJlc3BvbnNlLT5kZWNvZGVKc29uKCk7Ckh0dHBEb3dubG9hZGVyOjpvdXRwdXRXYXJuaW5ncygkdGhpcy0+aW8sICR0aGlzLT51cmwsICRkYXRhKTsKCiRsYXN0TW9kaWZpZWREYXRlID0gJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2xhc3QtbW9kaWZpZWQnKTsKJHJlc3BvbnNlLT5jb2xsZWN0KCk7CmlmICgkbGFzdE1vZGlmaWVkRGF0ZSkgewokZGF0YVsnbGFzdC1tb2RpZmllZCddID0gJGxhc3RNb2RpZmllZERhdGU7CiRqc29uID0gSnNvbkZpbGU6OmVuY29kZSgkZGF0YSwgMCk7Cn0KaWYgKCEkdGhpcy0+Y2FjaGUtPmlzUmVhZE9ubHkoKSkgewokdGhpcy0+Y2FjaGUtPndyaXRlKCRjYWNoZUtleSwgJGpzb24pOwp9CgpyZXR1cm4gJGRhdGE7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCRlIGluc3RhbmNlb2YgXExvZ2ljRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CgppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gJiYgJGUtPmdldFN0YXR1c0NvZGUoKSA9PT0gNDA0KSB7CnRocm93ICRlOwp9CgppZiAoISR0aGlzLT5kZWdyYWRlZE1vZGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiR0aGlzLT51cmwuJyBjb3VsZCBub3QgYmUgZnVsbHkgbG9hZGVkICgnLiRlLT5nZXRNZXNzYWdlKCkuJyksIHBhY2thZ2UgaW5mb3JtYXRpb24gd2FzIGxvYWRlZCBmcm9tIHRoZSBsb2NhbCBjYWNoZSBhbmQgbWF5IGJlIG91dCBvZiBkYXRlPC93YXJuaW5nPicpOwp9CiR0aGlzLT5kZWdyYWRlZE1vZGUgPSB0cnVlOwoKcmV0dXJuIHRydWU7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhc3luY0ZldGNoRmlsZShzdHJpbmcgJGZpbGVuYW1lLCBzdHJpbmcgJGNhY2hlS2V5LCA/c3RyaW5nICRsYXN0TW9kaWZpZWRUaW1lID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoJycgPT09ICRmaWxlbmFtZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJGZpbGVuYW1lIHNob3VsZCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7Cn0KCmlmIChpc3NldCgkdGhpcy0+cGFja2FnZXNOb3RGb3VuZENhY2hlWyRmaWxlbmFtZV0pKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKFsncGFja2FnZXMnID0+IFtdXSk7Cn0KCmlmIChpc3NldCgkdGhpcy0+ZnJlc2hNZXRhZGF0YVVybHNbJGZpbGVuYW1lXSkgJiYgJGxhc3RNb2RpZmllZFRpbWUpIHsKCgokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUodHJ1ZSk7CgpyZXR1cm4gJHByb21pc2U7Cn0KCiRodHRwRG93bmxvYWRlciA9ICR0aGlzLT5odHRwRG93bmxvYWRlcjsKJG9wdGlvbnMgPSAkdGhpcy0+b3B0aW9uczsKaWYgKCR0aGlzLT5ldmVudERpc3BhdGNoZXIpIHsKJHByZUZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFByZUZpbGVEb3dubG9hZEV2ZW50KFBsdWdpbkV2ZW50czo6UFJFX0ZJTEVfRE9XTkxPQUQsICR0aGlzLT5odHRwRG93bmxvYWRlciwgJGZpbGVuYW1lLCAnbWV0YWRhdGEnLCBbJ3JlcG9zaXRvcnknID0+ICR0aGlzXSk7CiRwcmVGaWxlRG93bmxvYWRFdmVudC0+c2V0VHJhbnNwb3J0T3B0aW9ucygkdGhpcy0+b3B0aW9ucyk7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcHJlRmlsZURvd25sb2FkRXZlbnQpOwokZmlsZW5hbWUgPSAkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldFByb2Nlc3NlZFVybCgpOwokb3B0aW9ucyA9ICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpOwp9CgppZiAoJGxhc3RNb2RpZmllZFRpbWUpIHsKaWYgKGlzc2V0KCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSkgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9IChhcnJheSkgJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ107Cn0KJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ11bXSA9ICdJZi1Nb2RpZmllZC1TaW5jZTogJy4kbGFzdE1vZGlmaWVkVGltZTsKfQoKJGlvID0gJHRoaXMtPmlvOwokdXJsID0gJHRoaXMtPnVybDsKJGNhY2hlID0gJHRoaXMtPmNhY2hlOwokZGVncmFkZWRNb2RlID0gJiR0aGlzLT5kZWdyYWRlZE1vZGU7CiRldmVudERpc3BhdGNoZXIgPSAkdGhpcy0+ZXZlbnREaXNwYXRjaGVyOwoKCgoKJGFjY2VwdCA9IGZ1bmN0aW9uICgkcmVzcG9uc2UpIHVzZSAoJGlvLCAkdXJsLCAkZmlsZW5hbWUsICRjYWNoZSwgJGNhY2hlS2V5LCAkZXZlbnREaXNwYXRjaGVyKSB7CgppZiAoJHJlc3BvbnNlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQwNCkgewokdGhpcy0+cGFja2FnZXNOb3RGb3VuZENhY2hlWyRmaWxlbmFtZV0gPSB0cnVlOwoKcmV0dXJuIFsncGFja2FnZXMnID0+IFtdXTsKfQoKJGpzb24gPSAoc3RyaW5nKSAkcmVzcG9uc2UtPmdldEJvZHkoKTsKaWYgKCRqc29uID09PSAnJyAmJiAkcmVzcG9uc2UtPmdldFN0YXR1c0NvZGUoKSA9PT0gMzA0KSB7CiR0aGlzLT5mcmVzaE1ldGFkYXRhVXJsc1skZmlsZW5hbWVdID0gdHJ1ZTsKCnJldHVybiB0cnVlOwp9CgppZiAoJGV2ZW50RGlzcGF0Y2hlcikgewokcG9zdEZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFBvc3RGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBPU1RfRklMRV9ET1dOTE9BRCwgbnVsbCwgbnVsbCwgJGZpbGVuYW1lLCAnbWV0YWRhdGEnLCBbJ3Jlc3BvbnNlJyA9PiAkcmVzcG9uc2UsICdyZXBvc2l0b3J5JyA9PiAkdGhpc10pOwokZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkcG9zdEZpbGVEb3dubG9hZEV2ZW50LT5nZXROYW1lKCksICRwb3N0RmlsZURvd25sb2FkRXZlbnQpOwp9CgokZGF0YSA9ICRyZXNwb25zZS0+ZGVjb2RlSnNvbigpOwpIdHRwRG93bmxvYWRlcjo6b3V0cHV0V2FybmluZ3MoJGlvLCAkdXJsLCAkZGF0YSk7CgokbGFzdE1vZGlmaWVkRGF0ZSA9ICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdsYXN0LW1vZGlmaWVkJyk7CiRyZXNwb25zZS0+Y29sbGVjdCgpOwppZiAoJGxhc3RNb2RpZmllZERhdGUpIHsKJGRhdGFbJ2xhc3QtbW9kaWZpZWQnXSA9ICRsYXN0TW9kaWZpZWREYXRlOwokanNvbiA9IEpzb25GaWxlOjplbmNvZGUoJGRhdGEsIEpTT05fVU5FU0NBUEVEX1NMQVNIRVMgfCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKfQppZiAoISRjYWNoZS0+aXNSZWFkT25seSgpKSB7CiRjYWNoZS0+d3JpdGUoJGNhY2hlS2V5LCAkanNvbik7Cn0KJHRoaXMtPmZyZXNoTWV0YWRhdGFVcmxzWyRmaWxlbmFtZV0gPSB0cnVlOwoKcmV0dXJuICRkYXRhOwp9OwoKJHJlamVjdCA9IGZ1bmN0aW9uICgkZSkgdXNlICgkZmlsZW5hbWUsICRhY2NlcHQsICRpbywgJHVybCwgJiRkZWdyYWRlZE1vZGUsICRsYXN0TW9kaWZpZWRUaW1lKSB7CmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0MDQpIHsKJHRoaXMtPnBhY2thZ2VzTm90Rm91bmRDYWNoZVskZmlsZW5hbWVdID0gdHJ1ZTsKCnJldHVybiBmYWxzZTsKfQoKaWYgKCEkZGVncmFkZWRNb2RlKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kdXJsLicgY291bGQgbm90IGJlIGZ1bGx5IGxvYWRlZCAoJy4kZS0+Z2V0TWVzc2FnZSgpLicpLCBwYWNrYWdlIGluZm9ybWF0aW9uIHdhcyBsb2FkZWQgZnJvbSB0aGUgbG9jYWwgY2FjaGUgYW5kIG1heSBiZSBvdXQgb2YgZGF0ZTwvd2FybmluZz4nKTsKfQokZGVncmFkZWRNb2RlID0gdHJ1ZTsKCgppZiAoJGxhc3RNb2RpZmllZFRpbWUpIHsKcmV0dXJuICRhY2NlcHQobmV3IFJlc3BvbnNlKFsndXJsJyA9PiAkdXJsXSwgMzA0LCBbXSwgJycpKTsKfQoKCmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0OTkpIHsKcmV0dXJuICRhY2NlcHQobmV3IFJlc3BvbnNlKFsndXJsJyA9PiAkdXJsXSwgNDA0LCBbXSwgJycpKTsKfQoKdGhyb3cgJGU7Cn07CgpyZXR1cm4gJGh0dHBEb3dubG9hZGVyLT5hZGQoJGZpbGVuYW1lLCAkb3B0aW9ucyktPnRoZW4oJGFjY2VwdCwgJHJlamVjdCk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpbml0aWFsaXplUGFydGlhbFBhY2thZ2VzKCk6IHZvaWQKewokcm9vdERhdGEgPSAkdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CmlmICgkcm9vdERhdGEgPT09IHRydWUpIHsKcmV0dXJuOwp9CgokdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lID0gW107CmZvcmVhY2ggKCRyb290RGF0YVsncGFja2FnZXMnXSBhcyAkcGFja2FnZSA9PiAkdmVyc2lvbnMpIHsKZm9yZWFjaCAoJHZlcnNpb25zIGFzICR2ZXJzaW9uKSB7CiR2ZXJzaW9uUGFja2FnZU5hbWUgPSBzdHJ0b2xvd2VyKChzdHJpbmcpICgkdmVyc2lvblsnbmFtZSddID8/ICcnKSk7CiR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWVbJHZlcnNpb25QYWNrYWdlTmFtZV1bXSA9ICR2ZXJzaW9uOwppZiAoISR0aGlzLT5kaXNwbGF5ZWRXYXJuaW5nQWJvdXROb25NYXRjaGluZ1BhY2thZ2VJbmRleCAmJiAkdmVyc2lvblBhY2thZ2VOYW1lICE9PSBzdHJ0b2xvd2VyKCRwYWNrYWdlKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZigiPHdhcm5pbmc+V2FybmluZzogdGhlIHBhY2thZ2VzIGtleSAnJXMnIGRvZXNuJ3QgbWF0Y2ggdGhlIG5hbWUgZGVmaW5lZCBpbiB0aGUgcGFja2FnZSBtZXRhZGF0YSAnJXMnIGluIHJlcG9zaXRvcnkgJXM8L3dhcm5pbmc+IiwgJHBhY2thZ2UsICR2ZXJzaW9uWyduYW1lJ10gPz8gJycsICR0aGlzLT5iYXNlVXJsKSk7CiR0aGlzLT5kaXNwbGF5ZWRXYXJuaW5nQWJvdXROb25NYXRjaGluZ1BhY2thZ2VJbmRleCA9IHRydWU7Cn0KfQp9CgoKJHRoaXMtPnJvb3REYXRhID0gdHJ1ZTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbGF6eVByb3ZpZGVyc1JlcG9Db250YWlucyhzdHJpbmcgJG5hbWUpCnsKaWYgKCEkdGhpcy0+aGFzQXZhaWxhYmxlUGFja2FnZUxpc3QpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignbGF6eVByb3ZpZGVyc1JlcG9Db250YWlucyBzaG91bGQgbm90IGJlIGNhbGxlZCB1bmxlc3MgaGFzQXZhaWxhYmxlUGFja2FnZUxpc3QgaXMgdHJ1ZScpOwp9CgppZiAoaXNfYXJyYXkoJHRoaXMtPmF2YWlsYWJsZVBhY2thZ2VzKSAmJiBpc3NldCgkdGhpcy0+YXZhaWxhYmxlUGFja2FnZXNbJG5hbWVdKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKGlzX2FycmF5KCR0aGlzLT5hdmFpbGFibGVQYWNrYWdlUGF0dGVybnMpKSB7CmZvcmVhY2ggKCR0aGlzLT5hdmFpbGFibGVQYWNrYWdlUGF0dGVybnMgYXMgJHByb3ZpZGVyUmVnZXgpIHsKaWYgKFByZWc6OmlzTWF0Y2goJHByb3ZpZGVyUmVnZXgsICRuYW1lKSkgewpyZXR1cm4gdHJ1ZTsKfQp9Cn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIENvbXBvc2l0ZVJlcG9zaXRvcnkgaW1wbGVtZW50cyBSZXBvc2l0b3J5SW50ZXJmYWNlCnsKCgoKCnByaXZhdGUgJHJlcG9zaXRvcmllczsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHJlcG9zaXRvcmllcykKewokdGhpcy0+cmVwb3NpdG9yaWVzID0gW107CmZvcmVhY2ggKCRyZXBvc2l0b3JpZXMgYXMgJHJlcG8pIHsKJHRoaXMtPmFkZFJlcG9zaXRvcnkoJHJlcG8pOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJ2NvbXBvc2l0ZSByZXBvICgnLmltcGxvZGUoJywgJywgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJHJlcG8pOiBzdHJpbmcgewpyZXR1cm4gJHJlcG8tPmdldFJlcG9OYW1lKCk7Cn0sICR0aGlzLT5yZXBvc2l0b3JpZXMpKS4nKSc7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcmllcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVwb3NpdG9yaWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYm9vbAp7CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKCmlmICgkcmVwb3NpdG9yeS0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2UoJG5hbWUsICRjb25zdHJhaW50KTogP0Jhc2VQYWNrYWdlCnsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewoKJHBhY2thZ2UgPSAkcmVwb3NpdG9yeS0+ZmluZFBhY2thZ2UoJG5hbWUsICRjb25zdHJhaW50KTsKaWYgKG51bGwgIT09ICRwYWNrYWdlKSB7CnJldHVybiAkcGFja2FnZTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlcygkbmFtZSwgJGNvbnN0cmFpbnQgPSBudWxsKTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewoKJHBhY2thZ2VzW10gPSAkcmVwb3NpdG9yeS0+ZmluZFBhY2thZ2VzKCRuYW1lLCAkY29uc3RyYWludCk7Cn0KCnJldHVybiAkcGFja2FnZXMgPyBhcnJheV9tZXJnZSguLi4kcGFja2FnZXMpIDogW107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lTWFwLCBhcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGFycmF5ICRhbHJlYWR5TG9hZGVkID0gW10pOiBhcnJheQp7CiRwYWNrYWdlcyA9IFtdOwokbmFtZXNGb3VuZCA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgokcmVzdWx0ID0gJHJlcG9zaXRvcnktPmxvYWRQYWNrYWdlcygkcGFja2FnZU5hbWVNYXAsICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncywgJGFscmVhZHlMb2FkZWQpOwokcGFja2FnZXNbXSA9ICRyZXN1bHRbJ3BhY2thZ2VzJ107CiRuYW1lc0ZvdW5kW10gPSAkcmVzdWx0WyduYW1lc0ZvdW5kJ107Cn0KCnJldHVybiBbCidwYWNrYWdlcycgPT4gJHBhY2thZ2VzID8gYXJyYXlfbWVyZ2UoLi4uJHBhY2thZ2VzKSA6IFtdLAonbmFtZXNGb3VuZCcgPT4gJG5hbWVzRm91bmQgPyBhcnJheV91bmlxdWUoYXJyYXlfbWVyZ2UoLi4uJG5hbWVzRm91bmQpKSA6IFtdLApdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VhcmNoKHN0cmluZyAkcXVlcnksIGludCAkbW9kZSA9IDAsID9zdHJpbmcgJHR5cGUgPSBudWxsKTogYXJyYXkKewokbWF0Y2hlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgokbWF0Y2hlc1tdID0gJHJlcG9zaXRvcnktPnNlYXJjaCgkcXVlcnksICRtb2RlLCAkdHlwZSk7Cn0KCnJldHVybiBcY291bnQoJG1hdGNoZXMpID4gMCA/IGFycmF5X21lcmdlKC4uLiRtYXRjaGVzKSA6IFtdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZXMoKTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewoKJHBhY2thZ2VzW10gPSAkcmVwb3NpdG9yeS0+Z2V0UGFja2FnZXMoKTsKfQoKcmV0dXJuICRwYWNrYWdlcyA/IGFycmF5X21lcmdlKC4uLiRwYWNrYWdlcykgOiBbXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3ZpZGVycygkcGFja2FnZU5hbWUpOiBhcnJheQp7CiRyZXN1bHRzID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKCiRyZXN1bHRzW10gPSAkcmVwb3NpdG9yeS0+Z2V0UHJvdmlkZXJzKCRwYWNrYWdlTmFtZSk7Cn0KCnJldHVybiAkcmVzdWx0cyA/IGFycmF5X21lcmdlKC4uLiRyZXN1bHRzKSA6IFtdOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKaWYgKCRyZXBvc2l0b3J5IGluc3RhbmNlb2YgV3JpdGFibGVSZXBvc2l0b3J5SW50ZXJmYWNlKSB7CiRyZXBvc2l0b3J5LT5yZW1vdmVQYWNrYWdlKCRwYWNrYWdlKTsKfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewokdG90YWwgPSAwOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgokdG90YWwgKz0gJHJlcG9zaXRvcnktPmNvdW50KCk7Cn0KCnJldHVybiAkdG90YWw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG9zaXRvcnkpOiB2b2lkCnsKaWYgKCRyZXBvc2l0b3J5IGluc3RhbmNlb2Ygc2VsZikgewpmb3JlYWNoICgkcmVwb3NpdG9yeS0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJHJlcG8pIHsKJHRoaXMtPmFkZFJlcG9zaXRvcnkoJHJlcG8pOwp9Cn0gZWxzZSB7CiR0aGlzLT5yZXBvc2l0b3JpZXNbXSA9ICRyZXBvc2l0b3J5Owp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKaW50ZXJmYWNlIENvbmZpZ3VyYWJsZVJlcG9zaXRvcnlJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb0NvbmZpZygpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKCgoKCgoKY2xhc3MgRmlsZXN5c3RlbVJlcG9zaXRvcnkgZXh0ZW5kcyBXcml0YWJsZUFycmF5UmVwb3NpdG9yeQp7Cgpwcm90ZWN0ZWQgJGZpbGU7Cgpwcml2YXRlICRkdW1wVmVyc2lvbnM7Cgpwcml2YXRlICRyb290UGFja2FnZTsKCnByaXZhdGUgJGZpbGVzeXN0ZW07Cgpwcml2YXRlICRkZXZNb2RlID0gbnVsbDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChKc29uRmlsZSAkcmVwb3NpdG9yeUZpbGUsIGJvb2wgJGR1bXBWZXJzaW9ucyA9IGZhbHNlLCA/Um9vdFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlID0gbnVsbCwgP0ZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0gPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoKTsKJHRoaXMtPmZpbGUgPSAkcmVwb3NpdG9yeUZpbGU7CiR0aGlzLT5kdW1wVmVyc2lvbnMgPSAkZHVtcFZlcnNpb25zOwokdGhpcy0+cm9vdFBhY2thZ2UgPSAkcm9vdFBhY2thZ2U7CiR0aGlzLT5maWxlc3lzdGVtID0gJGZpbGVzeXN0ZW0gPzogbmV3IEZpbGVzeXN0ZW07CmlmICgkZHVtcFZlcnNpb25zICYmICEkcm9vdFBhY2thZ2UpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0V4cGVjdGVkIGEgcm9vdCBwYWNrYWdlIGluc3RhbmNlIGlmICRkdW1wVmVyc2lvbnMgaXMgdHJ1ZScpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZNb2RlKCkKewpyZXR1cm4gJHRoaXMtPmRldk1vZGU7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKCkKewpwYXJlbnQ6OmluaXRpYWxpemUoKTsKCmlmICghJHRoaXMtPmZpbGUtPmV4aXN0cygpKSB7CnJldHVybjsKfQoKdHJ5IHsKJGRhdGEgPSAkdGhpcy0+ZmlsZS0+cmVhZCgpOwppZiAoaXNzZXQoJGRhdGFbJ3BhY2thZ2VzJ10pKSB7CiRwYWNrYWdlcyA9ICRkYXRhWydwYWNrYWdlcyddOwp9IGVsc2UgewokcGFja2FnZXMgPSAkZGF0YTsKfQoKaWYgKGlzc2V0KCRkYXRhWydkZXYtcGFja2FnZS1uYW1lcyddKSkgewokdGhpcy0+c2V0RGV2UGFja2FnZU5hbWVzKCRkYXRhWydkZXYtcGFja2FnZS1uYW1lcyddKTsKfQppZiAoaXNzZXQoJGRhdGFbJ2RldiddKSkgewokdGhpcy0+ZGV2TW9kZSA9ICRkYXRhWydkZXYnXTsKfQoKaWYgKCFpc19hcnJheSgkcGFja2FnZXMpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdDb3VsZCBub3QgcGFyc2UgcGFja2FnZSBsaXN0IGZyb20gdGhlIHJlcG9zaXRvcnknKTsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBJbnZhbGlkUmVwb3NpdG9yeUV4Y2VwdGlvbignSW52YWxpZCByZXBvc2l0b3J5IGRhdGEgaW4gJy4kdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpLicsIHBhY2thZ2VzIGNvdWxkIG5vdCBiZSBsb2FkZWQ6IFsnLmdldF9jbGFzcygkZSkuJ10gJy4kZS0+Z2V0TWVzc2FnZSgpKTsKfQoKJGxvYWRlciA9IG5ldyBBcnJheUxvYWRlcihudWxsLCB0cnVlKTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlRGF0YSkgewokcGFja2FnZSA9ICRsb2FkZXItPmxvYWQoJHBhY2thZ2VEYXRhKTsKJHRoaXMtPmFkZFBhY2thZ2UoJHBhY2thZ2UpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiByZWxvYWQoKQp7CiR0aGlzLT5wYWNrYWdlcyA9IG51bGw7CiR0aGlzLT5pbml0aWFsaXplKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZShib29sICRkZXZNb2RlLCBJbnN0YWxsYXRpb25NYW5hZ2VyICRpbnN0YWxsYXRpb25NYW5hZ2VyKQp7CiRkYXRhID0gWydwYWNrYWdlcycgPT4gW10sICdkZXYnID0+ICRkZXZNb2RlLCAnZGV2LXBhY2thZ2UtbmFtZXMnID0+IFtdXTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcigpOwoKCgoKJHJlcG9EaXIgPSBkaXJuYW1lKCR0aGlzLT5maWxlLT5nZXRQYXRoKCkpOwokdGhpcy0+ZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRyZXBvRGlyKTsKCiRyZXBvRGlyID0gJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgocmVhbHBhdGgoJHJlcG9EaXIpKTsKJGluc3RhbGxQYXRocyA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPmdldENhbm9uaWNhbFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJHBrZ0FycmF5ID0gJGR1bXBlci0+ZHVtcCgkcGFja2FnZSk7CiRwYXRoID0gJGluc3RhbGxhdGlvbk1hbmFnZXItPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKJGluc3RhbGxQYXRoID0gbnVsbDsKaWYgKCcnICE9PSAkcGF0aCAmJiBudWxsICE9PSAkcGF0aCkgewokbm9ybWFsaXplZFBhdGggPSAkdGhpcy0+ZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkdGhpcy0+ZmlsZXN5c3RlbS0+aXNBYnNvbHV0ZVBhdGgoJHBhdGgpID8gJHBhdGggOiBQbGF0Zm9ybTo6Z2V0Q3dkKCkgLiAnLycgLiAkcGF0aCk7CiRpbnN0YWxsUGF0aCA9ICR0aGlzLT5maWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoKCRyZXBvRGlyLCAkbm9ybWFsaXplZFBhdGgsIHRydWUpOwp9CiRpbnN0YWxsUGF0aHNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkaW5zdGFsbFBhdGg7CgokcGtnQXJyYXlbJ2luc3RhbGwtcGF0aCddID0gJGluc3RhbGxQYXRoOwokZGF0YVsncGFja2FnZXMnXVtdID0gJHBrZ0FycmF5OwoKCgppZiAoaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJHRoaXMtPmRldlBhY2thZ2VOYW1lcywgdHJ1ZSkpIHsKJGRhdGFbJ2Rldi1wYWNrYWdlLW5hbWVzJ11bXSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0KfQoKc29ydCgkZGF0YVsnZGV2LXBhY2thZ2UtbmFtZXMnXSk7CnVzb3J0KCRkYXRhWydwYWNrYWdlcyddLCBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYik6IGludCB7CnJldHVybiBzdHJjbXAoJGFbJ25hbWUnXSwgJGJbJ25hbWUnXSk7Cn0pOwoKJHRoaXMtPmZpbGUtPndyaXRlKCRkYXRhKTsKCmlmICgkdGhpcy0+ZHVtcFZlcnNpb25zKSB7CiR2ZXJzaW9ucyA9ICR0aGlzLT5nZW5lcmF0ZUluc3RhbGxlZFZlcnNpb25zKCRpbnN0YWxsYXRpb25NYW5hZ2VyLCAkaW5zdGFsbFBhdGhzLCAkZGV2TW9kZSwgJHJlcG9EaXIpOwoKJHRoaXMtPmZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHJlcG9EaXIuJy9pbnN0YWxsZWQucGhwJywgJzw/cGhwIHJldHVybiAnIC4gJHRoaXMtPmR1bXBUb1BocENvZGUoJHZlcnNpb25zKSAuICc7Jy4iXG4iKTsKJGluc3RhbGxlZFZlcnNpb25zQ2xhc3MgPSBmaWxlX2dldF9jb250ZW50cyhfX0RJUl9fLicvLi4vSW5zdGFsbGVkVmVyc2lvbnMucGhwJyk7CgoKaWYgKCRpbnN0YWxsZWRWZXJzaW9uc0NsYXNzICE9PSBmYWxzZSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+ZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZCgkcmVwb0Rpci4nL0luc3RhbGxlZFZlcnNpb25zLnBocCcsICRpbnN0YWxsZWRWZXJzaW9uc0NsYXNzKTsKCgpcQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnM6OnJlbG9hZCgkdmVyc2lvbnMpOwoKCgoKdHJ5IHsKJHJlZmxQcm9wID0gbmV3IFxSZWZsZWN0aW9uUHJvcGVydHkoXENvbXBvc2VyXEluc3RhbGxlZFZlcnNpb25zOjpjbGFzcywgJ3NlbGZEaXInKTsKJHJlZmxQcm9wLT5zZXRBY2Nlc3NpYmxlKHRydWUpOwokcmVmbFByb3AtPnNldFZhbHVlKG51bGwsIHN0cnRyKCRyZXBvRGlyLCAnXFwnLCAnLycpKTsKCiRyZWZsUHJvcCA9IG5ldyBcUmVmbGVjdGlvblByb3BlcnR5KFxDb21wb3NlclxJbnN0YWxsZWRWZXJzaW9uczo6Y2xhc3MsICdpbnN0YWxsZWRJc0xvY2FsRGlyJyk7CiRyZWZsUHJvcC0+c2V0QWNjZXNzaWJsZSh0cnVlKTsKJHJlZmxQcm9wLT5zZXRWYWx1ZShudWxsLCB0cnVlKTsKfSBjYXRjaCAoXFJlZmxlY3Rpb25FeGNlcHRpb24gJGUpIHsKaWYgKCFQcmVnOjppc01hdGNoKCd7UHJvcGVydHkgLio/IGRvZXMgbm90IGV4aXN0fWknLCAkZS0+Z2V0TWVzc2FnZSgpKSkgewp0aHJvdyAkZTsKfQoKfQp9Cn0KfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmVseUxvYWRJbnN0YWxsZWRWZXJzaW9ucyhzdHJpbmcgJHBhdGgpOiBib29sCnsKJGluc3RhbGxlZFZlcnNpb25zRGF0YSA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiRwYXR0ZXJuID0gPDw8J1JFR0VYJwp7KD8oREVGSU5FKQogICAoPzxudW1iZXI+ICAtPyBccyorIFxkKysgKD86XC5cZCsrKT8gKQogICAoPzxib29sZWFuPiB0cnVlIHwgZmFsc2UgfCBudWxsICkKICAgKD88c3RyaW5ncz4gKD8mc3RyaW5nKSAoPzogXHMqKyBcLiBccyorICg/JnN0cmluZykpKisgKQogICAoPzxzdHJpbmc+ICAoPzogIiAoPzpbXiJcXCRdKisgfCBcXCBbIlxcMF0gKSogIiB8ICcgKD86W14nXFxdKisgfCBcXCBbJ1xcXSApKiAnICkgKQogICAoPzxhcnJheT4gICBhcnJheVwoIFxzKisgKD86ICg/Oig/Jm51bWJlcil8KD8mc3RyaW5ncykpIFxzKisgPT4gXHMqKyAoPzogKD86X19ESVJfXyBccyorIFwuIFxzKispPyAoPyZzdHJpbmdzKSB8ICg/JnZhbHVlKSApIFxzKissIFxzKisgKSorICBccyorIFwpICkKICAgKD88dmFsdWU+ICAgKD86ICg/Jm51bWJlcikgfCAoPyZib29sZWFuKSB8ICg/JnN0cmluZ3MpIHwgKD8mYXJyYXkpICkgKQopCl48XD9waHBccysrcmV0dXJuXHMrKyg/JmFycmF5KVxzKis7JH1peApSRUdFWDsKaWYgKGlzX3N0cmluZygkaW5zdGFsbGVkVmVyc2lvbnNEYXRhKSAmJiBQcmVnOjppc01hdGNoKCRwYXR0ZXJuLCB0cmltKCRpbnN0YWxsZWRWZXJzaW9uc0RhdGEpKSkgewpcQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnM6OnJlbG9hZChldmFsKCc/PicuUHJlZzo6cmVwbGFjZSgnez0+XHMqK19fRElSX19ccyorXC5ccyorKFtcJyJdKX0nLCAnPT4gJy52YXJfZXhwb3J0KGRpcm5hbWUoJHBhdGgpLCB0cnVlKS4nIC4gJDEnLCAkaW5zdGFsbGVkVmVyc2lvbnNEYXRhKSkpOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkdW1wVG9QaHBDb2RlKGFycmF5ICRhcnJheSA9IFtdLCBpbnQgJGxldmVsID0gMCk6IHN0cmluZwp7CiRsaW5lcyA9ICJhcnJheShcbiI7CiRsZXZlbCsrOwoKZm9yZWFjaCAoJGFycmF5IGFzICRrZXkgPT4gJHZhbHVlKSB7CiRsaW5lcyAuPSBzdHJfcmVwZWF0KCcgICAgJywgJGxldmVsKTsKJGxpbmVzIC49IGlzX2ludCgka2V5KSA/ICRrZXkgLiAnID0+ICcgOiB2YXJfZXhwb3J0KCRrZXksIHRydWUpIC4gJyA9PiAnOwoKaWYgKGlzX2FycmF5KCR2YWx1ZSkpIHsKaWYgKCFlbXB0eSgkdmFsdWUpKSB7CiRsaW5lcyAuPSAkdGhpcy0+ZHVtcFRvUGhwQ29kZSgkdmFsdWUsICRsZXZlbCk7Cn0gZWxzZSB7CiRsaW5lcyAuPSAiYXJyYXkoKSxcbiI7Cn0KfSBlbHNlaWYgKCRrZXkgPT09ICdpbnN0YWxsX3BhdGgnICYmIGlzX3N0cmluZygkdmFsdWUpKSB7CmlmICgkdGhpcy0+ZmlsZXN5c3RlbS0+aXNBYnNvbHV0ZVBhdGgoJHZhbHVlKSkgewokbGluZXMgLj0gdmFyX2V4cG9ydCgkdmFsdWUsIHRydWUpIC4gIixcbiI7Cn0gZWxzZSB7CiRsaW5lcyAuPSAiX19ESVJfXyAuICIgLiB2YXJfZXhwb3J0KCcvJyAuICR2YWx1ZSwgdHJ1ZSkgLiAiLFxuIjsKfQp9IGVsc2VpZiAoaXNfc3RyaW5nKCR2YWx1ZSkpIHsKJGxpbmVzIC49IHZhcl9leHBvcnQoJHZhbHVlLCB0cnVlKSAuICIsXG4iOwp9IGVsc2VpZiAoaXNfYm9vbCgkdmFsdWUpKSB7CiRsaW5lcyAuPSAoJHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJykgLiAiLFxuIjsKfSBlbHNlaWYgKGlzX251bGwoJHZhbHVlKSkgewokbGluZXMgLj0gIm51bGwsXG4iOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignVW5leHBlY3RlZCB0eXBlICcuZ2V0dHlwZSgkdmFsdWUpKTsKfQp9CgokbGluZXMgLj0gc3RyX3JlcGVhdCgnICAgICcsICRsZXZlbCAtIDEpIC4gJyknIC4gKCRsZXZlbCAtIDEgPT09IDAgPyAnJyA6ICIsXG4iKTsKCnJldHVybiAkbGluZXM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZW5lcmF0ZUluc3RhbGxlZFZlcnNpb25zKEluc3RhbGxhdGlvbk1hbmFnZXIgJGluc3RhbGxhdGlvbk1hbmFnZXIsIGFycmF5ICRpbnN0YWxsUGF0aHMsIGJvb2wgJGRldk1vZGUsIHN0cmluZyAkcmVwb0Rpcik6IGFycmF5CnsKJGRldlBhY2thZ2VzID0gYXJyYXlfZmxpcCgkdGhpcy0+ZGV2UGFja2FnZU5hbWVzKTsKJHBhY2thZ2VzID0gJHRoaXMtPmdldFBhY2thZ2VzKCk7CmlmIChudWxsID09PSAkdGhpcy0+cm9vdFBhY2thZ2UpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignSXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBkdW1wIHBhY2thZ2VzIGlmIG5vIHJvb3QgcGFja2FnZSBpcyBnaXZlbicpOwp9CiRwYWNrYWdlc1tdID0gJHJvb3RQYWNrYWdlID0gJHRoaXMtPnJvb3RQYWNrYWdlOwoKd2hpbGUgKCRyb290UGFja2FnZSBpbnN0YW5jZW9mIFJvb3RBbGlhc1BhY2thZ2UpIHsKJHJvb3RQYWNrYWdlID0gJHJvb3RQYWNrYWdlLT5nZXRBbGlhc09mKCk7CiRwYWNrYWdlc1tdID0gJHJvb3RQYWNrYWdlOwp9CiR2ZXJzaW9ucyA9IFsKJ3Jvb3QnID0+ICR0aGlzLT5kdW1wUm9vdFBhY2thZ2UoJHJvb3RQYWNrYWdlLCAkaW5zdGFsbFBhdGhzLCAkZGV2TW9kZSwgJHJlcG9EaXIsICRkZXZQYWNrYWdlcyksCid2ZXJzaW9ucycgPT4gW10sCl07CgoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpjb250aW51ZTsKfQoKJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHRoaXMtPmR1bXBJbnN0YWxsZWRQYWNrYWdlKCRwYWNrYWdlLCAkaW5zdGFsbFBhdGhzLCAkcmVwb0RpciwgJGRldlBhY2thZ2VzKTsKfQoKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokaXNEZXZQYWNrYWdlID0gaXNzZXQoJGRldlBhY2thZ2VzWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJHJlcGxhY2UpIHsKCmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXBsYWNlLT5nZXRUYXJnZXQoKSkpIHsKY29udGludWU7Cn0KaWYgKCFpc3NldCgkdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHJlcGxhY2UtPmdldFRhcmdldCgpXVsnZGV2X3JlcXVpcmVtZW50J10pKSB7CiR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcmVwbGFjZS0+Z2V0VGFyZ2V0KCldWydkZXZfcmVxdWlyZW1lbnQnXSA9ICRpc0RldlBhY2thZ2U7Cn0gZWxzZWlmICghJGlzRGV2UGFja2FnZSkgewokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHJlcGxhY2UtPmdldFRhcmdldCgpXVsnZGV2X3JlcXVpcmVtZW50J10gPSBmYWxzZTsKfQokcmVwbGFjZWQgPSAkcmVwbGFjZS0+Z2V0UHJldHR5Q29uc3RyYWludCgpOwppZiAoJHJlcGxhY2VkID09PSAnc2VsZi52ZXJzaW9uJykgewokcmVwbGFjZWQgPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9CmlmICghaXNzZXQoJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRyZXBsYWNlLT5nZXRUYXJnZXQoKV1bJ3JlcGxhY2VkJ10pIHx8ICFpbl9hcnJheSgkcmVwbGFjZWQsICR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcmVwbGFjZS0+Z2V0VGFyZ2V0KCldWydyZXBsYWNlZCddLCB0cnVlKSkgewokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHJlcGxhY2UtPmdldFRhcmdldCgpXVsncmVwbGFjZWQnXVtdID0gJHJlcGxhY2VkOwp9Cn0KZm9yZWFjaCAoJHBhY2thZ2UtPmdldFByb3ZpZGVzKCkgYXMgJHByb3ZpZGUpIHsKCmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwcm92aWRlLT5nZXRUYXJnZXQoKSkpIHsKY29udGludWU7Cn0KaWYgKCFpc3NldCgkdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHByb3ZpZGUtPmdldFRhcmdldCgpXVsnZGV2X3JlcXVpcmVtZW50J10pKSB7CiR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcHJvdmlkZS0+Z2V0VGFyZ2V0KCldWydkZXZfcmVxdWlyZW1lbnQnXSA9ICRpc0RldlBhY2thZ2U7Cn0gZWxzZWlmICghJGlzRGV2UGFja2FnZSkgewokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHByb3ZpZGUtPmdldFRhcmdldCgpXVsnZGV2X3JlcXVpcmVtZW50J10gPSBmYWxzZTsKfQokcHJvdmlkZWQgPSAkcHJvdmlkZS0+Z2V0UHJldHR5Q29uc3RyYWludCgpOwppZiAoJHByb3ZpZGVkID09PSAnc2VsZi52ZXJzaW9uJykgewokcHJvdmlkZWQgPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9CmlmICghaXNzZXQoJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRwcm92aWRlLT5nZXRUYXJnZXQoKV1bJ3Byb3ZpZGVkJ10pIHx8ICFpbl9hcnJheSgkcHJvdmlkZWQsICR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcHJvdmlkZS0+Z2V0VGFyZ2V0KCldWydwcm92aWRlZCddLCB0cnVlKSkgewokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHByb3ZpZGUtPmdldFRhcmdldCgpXVsncHJvdmlkZWQnXVtdID0gJHByb3ZpZGVkOwp9Cn0KfQoKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CiR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcGFja2FnZS0+Z2V0TmFtZSgpXVsnYWxpYXNlcyddW10gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSkgewokdmVyc2lvbnNbJ3Jvb3QnXVsnYWxpYXNlcyddW10gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9Cn0KCmtzb3J0KCR2ZXJzaW9uc1sndmVyc2lvbnMnXSk7Cmtzb3J0KCR2ZXJzaW9ucyk7Cgpmb3JlYWNoICgkdmVyc2lvbnNbJ3ZlcnNpb25zJ10gYXMgJG5hbWUgPT4gJHZlcnNpb24pIHsKZm9yZWFjaCAoWydhbGlhc2VzJywgJ3JlcGxhY2VkJywgJ3Byb3ZpZGVkJ10gYXMgJGtleSkgewppZiAoaXNzZXQoJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRuYW1lXVska2V5XSkpIHsKc29ydCgkdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJG5hbWVdWyRrZXldLCBTT1JUX05BVFVSQUwpOwp9Cn0KfQoKcmV0dXJuICR2ZXJzaW9uczsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGR1bXBJbnN0YWxsZWRQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICRpbnN0YWxsUGF0aHMsIHN0cmluZyAkcmVwb0RpciwgYXJyYXkgJGRldlBhY2thZ2VzKTogYXJyYXkKewokcmVmZXJlbmNlID0gbnVsbDsKaWYgKCRwYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSkgewokcmVmZXJlbmNlID0gJHBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpID09PSAnc291cmNlJyA/ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSA6ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCk7Cn0KaWYgKG51bGwgPT09ICRyZWZlcmVuY2UpIHsKJHJlZmVyZW5jZSA9ICgkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkgPzogJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSkgPzogbnVsbDsKfQoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJHRvID0gJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgocmVhbHBhdGgoUGxhdGZvcm06OmdldEN3ZCgpKSk7CiRpbnN0YWxsUGF0aCA9ICR0aGlzLT5maWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoKCRyZXBvRGlyLCAkdG8sIHRydWUpOwp9IGVsc2UgewokaW5zdGFsbFBhdGggPSAkaW5zdGFsbFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldOwp9CgokZGF0YSA9IFsKJ3ByZXR0eV92ZXJzaW9uJyA9PiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLAondmVyc2lvbicgPT4gJHBhY2thZ2UtPmdldFZlcnNpb24oKSwKJ3JlZmVyZW5jZScgPT4gJHJlZmVyZW5jZSwKJ3R5cGUnID0+ICRwYWNrYWdlLT5nZXRUeXBlKCksCidpbnN0YWxsX3BhdGgnID0+ICRpbnN0YWxsUGF0aCwKJ2FsaWFzZXMnID0+IFtdLAonZGV2X3JlcXVpcmVtZW50JyA9PiBpc3NldCgkZGV2UGFja2FnZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0pLApdOwoKcmV0dXJuICRkYXRhOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZHVtcFJvb3RQYWNrYWdlKFJvb3RQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkaW5zdGFsbFBhdGhzLCBib29sICRkZXZNb2RlLCBzdHJpbmcgJHJlcG9EaXIsIGFycmF5ICRkZXZQYWNrYWdlcykKewokZGF0YSA9ICR0aGlzLT5kdW1wSW5zdGFsbGVkUGFja2FnZSgkcGFja2FnZSwgJGluc3RhbGxQYXRocywgJHJlcG9EaXIsICRkZXZQYWNrYWdlcyk7CgpyZXR1cm4gWwonbmFtZScgPT4gJHBhY2thZ2UtPmdldE5hbWUoKSwKJ3ByZXR0eV92ZXJzaW9uJyA9PiAkZGF0YVsncHJldHR5X3ZlcnNpb24nXSwKJ3ZlcnNpb24nID0+ICRkYXRhWyd2ZXJzaW9uJ10sCidyZWZlcmVuY2UnID0+ICRkYXRhWydyZWZlcmVuY2UnXSwKJ3R5cGUnID0+ICRkYXRhWyd0eXBlJ10sCidpbnN0YWxsX3BhdGgnID0+ICRkYXRhWydpbnN0YWxsX3BhdGgnXSwKJ2FsaWFzZXMnID0+ICRkYXRhWydhbGlhc2VzJ10sCidkZXYnID0+ICRkZXZNb2RlLApdOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgoKY2xhc3MgRmlsdGVyUmVwb3NpdG9yeSBpbXBsZW1lbnRzIFJlcG9zaXRvcnlJbnRlcmZhY2UsIEFkdmlzb3J5UHJvdmlkZXJJbnRlcmZhY2UKewoKcHJpdmF0ZSAkb25seSA9IG51bGw7Cgpwcml2YXRlICRleGNsdWRlID0gbnVsbDsKCnByaXZhdGUgJGNhbm9uaWNhbCA9IHRydWU7Cgpwcml2YXRlICRyZXBvOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGFycmF5ICRvcHRpb25zKQp7CmlmIChpc3NldCgkb3B0aW9uc1snb25seSddKSkgewppZiAoIWlzX2FycmF5KCRvcHRpb25zWydvbmx5J10pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCcib25seSIga2V5IGZvciByZXBvc2l0b3J5ICcuJHJlcG8tPmdldFJlcG9OYW1lKCkuJyBzaG91bGQgYmUgYW4gYXJyYXknKTsKfQokdGhpcy0+b25seSA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZXNUb1JlZ2V4cCgkb3B0aW9uc1snb25seSddKTsKfQppZiAoaXNzZXQoJG9wdGlvbnNbJ2V4Y2x1ZGUnXSkpIHsKaWYgKCFpc19hcnJheSgkb3B0aW9uc1snZXhjbHVkZSddKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignImV4Y2x1ZGUiIGtleSBmb3IgcmVwb3NpdG9yeSAnLiRyZXBvLT5nZXRSZXBvTmFtZSgpLicgc2hvdWxkIGJlIGFuIGFycmF5Jyk7Cn0KJHRoaXMtPmV4Y2x1ZGUgPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoJG9wdGlvbnNbJ2V4Y2x1ZGUnXSk7Cn0KaWYgKCR0aGlzLT5leGNsdWRlICYmICR0aGlzLT5vbmx5KSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdPbmx5IG9uZSBvZiAib25seSIgYW5kICJleGNsdWRlIiBjYW4gYmUgc3BlY2lmaWVkIGZvciByZXBvc2l0b3J5ICcuJHJlcG8tPmdldFJlcG9OYW1lKCkpOwp9CmlmIChpc3NldCgkb3B0aW9uc1snY2Fub25pY2FsJ10pKSB7CmlmICghaXNfYm9vbCgkb3B0aW9uc1snY2Fub25pY2FsJ10pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCciY2Fub25pY2FsIiBrZXkgZm9yIHJlcG9zaXRvcnkgJy4kcmVwby0+Z2V0UmVwb05hbWUoKS4nIHNob3VsZCBiZSBhIGJvb2xlYW4nKTsKfQokdGhpcy0+Y2Fub25pY2FsID0gJG9wdGlvbnNbJ2Nhbm9uaWNhbCddOwp9CgokdGhpcy0+cmVwbyA9ICRyZXBvOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5yZXBvLT5nZXRSZXBvTmFtZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeSgpOiBSZXBvc2l0b3J5SW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5yZXBvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYm9vbAp7CnJldHVybiAkdGhpcy0+cmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZSgkbmFtZSwgJGNvbnN0cmFpbnQpOiA/QmFzZVBhY2thZ2UKewppZiAoISR0aGlzLT5pc0FsbG93ZWQoJG5hbWUpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG8tPmZpbmRQYWNrYWdlKCRuYW1lLCAkY29uc3RyYWludCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZXMoJG5hbWUsICRjb25zdHJhaW50ID0gbnVsbCk6IGFycmF5CnsKaWYgKCEkdGhpcy0+aXNBbGxvd2VkKCRuYW1lKSkgewpyZXR1cm4gW107Cn0KCnJldHVybiAkdGhpcy0+cmVwby0+ZmluZFBhY2thZ2VzKCRuYW1lLCAkY29uc3RyYWludCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lTWFwLCBhcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGFycmF5ICRhbHJlYWR5TG9hZGVkID0gW10pOiBhcnJheQp7CmZvcmVhY2ggKCRwYWNrYWdlTmFtZU1hcCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoISR0aGlzLT5pc0FsbG93ZWQoJG5hbWUpKSB7CnVuc2V0KCRwYWNrYWdlTmFtZU1hcFskbmFtZV0pOwp9Cn0KCmlmICghJHBhY2thZ2VOYW1lTWFwKSB7CnJldHVybiBbJ25hbWVzRm91bmQnID0+IFtdLCAncGFja2FnZXMnID0+IFtdXTsKfQoKJHJlc3VsdCA9ICR0aGlzLT5yZXBvLT5sb2FkUGFja2FnZXMoJHBhY2thZ2VOYW1lTWFwLCAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsICRhbHJlYWR5TG9hZGVkKTsKaWYgKCEkdGhpcy0+Y2Fub25pY2FsKSB7CiRyZXN1bHRbJ25hbWVzRm91bmQnXSA9IFtdOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNlYXJjaChzdHJpbmcgJHF1ZXJ5LCBpbnQgJG1vZGUgPSAwLCA/c3RyaW5nICR0eXBlID0gbnVsbCk6IGFycmF5CnsKJHJlc3VsdCA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPnJlcG8tPnNlYXJjaCgkcXVlcnksICRtb2RlLCAkdHlwZSkgYXMgJHBhY2thZ2UpIHsKaWYgKCR0aGlzLT5pc0FsbG93ZWQoJHBhY2thZ2VbJ25hbWUnXSkpIHsKJHJlc3VsdFtdID0gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlcygpOiBhcnJheQp7CiRyZXN1bHQgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCR0aGlzLT5pc0FsbG93ZWQoJHBhY2thZ2UtPmdldE5hbWUoKSkpIHsKJHJlc3VsdFtdID0gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcnMoJHBhY2thZ2VOYW1lKTogYXJyYXkKewokcmVzdWx0ID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvLT5nZXRQcm92aWRlcnMoJHBhY2thZ2VOYW1lKSBhcyAkbmFtZSA9PiAkcHJvdmlkZXIpIHsKaWYgKCR0aGlzLT5pc0FsbG93ZWQoJHByb3ZpZGVyWyduYW1lJ10pKSB7CiRyZXN1bHRbJG5hbWVdID0gJHByb3ZpZGVyOwp9Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKaWYgKCR0aGlzLT5yZXBvLT5jb3VudCgpID4gMCkgewpyZXR1cm4gY291bnQoJHRoaXMtPmdldFBhY2thZ2VzKCkpOwp9CgpyZXR1cm4gMDsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1NlY3VyaXR5QWR2aXNvcmllcygpOiBib29sCnsKaWYgKCEkdGhpcy0+cmVwbyBpbnN0YW5jZW9mIEFkdmlzb3J5UHJvdmlkZXJJbnRlcmZhY2UpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG8tPmhhc1NlY3VyaXR5QWR2aXNvcmllcygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBZHZpc29yaWVzKGFycmF5ICRwYWNrYWdlQ29uc3RyYWludE1hcCwgYm9vbCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyA9IGZhbHNlKTogYXJyYXkKewppZiAoISR0aGlzLT5yZXBvIGluc3RhbmNlb2YgQWR2aXNvcnlQcm92aWRlckludGVyZmFjZSkgewpyZXR1cm4gWyduYW1lc0ZvdW5kJyA9PiBbXSwgJ2Fkdmlzb3JpZXMnID0+IFtdXTsKfQoKZm9yZWFjaCAoJHBhY2thZ2VDb25zdHJhaW50TWFwIGFzICRuYW1lID0+ICRjb25zdHJhaW50KSB7CmlmICghJHRoaXMtPmlzQWxsb3dlZCgkbmFtZSkpIHsKdW5zZXQoJHBhY2thZ2VDb25zdHJhaW50TWFwWyRuYW1lXSk7Cn0KfQoKcmV0dXJuICR0aGlzLT5yZXBvLT5nZXRTZWN1cml0eUFkdmlzb3JpZXMoJHBhY2thZ2VDb25zdHJhaW50TWFwLCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gaXNBbGxvd2VkKHN0cmluZyAkbmFtZSk6IGJvb2wKewppZiAoISR0aGlzLT5vbmx5ICYmICEkdGhpcy0+ZXhjbHVkZSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCR0aGlzLT5vbmx5KSB7CnJldHVybiBQcmVnOjppc01hdGNoKCR0aGlzLT5vbmx5LCAkbmFtZSk7Cn0KCmlmICgkdGhpcy0+ZXhjbHVkZSA9PT0gbnVsbCkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuICFQcmVnOjppc01hdGNoKCR0aGlzLT5leGNsdWRlLCAkbmFtZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKCgpjbGFzcyBJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnkgZXh0ZW5kcyBXcml0YWJsZUFycmF5UmVwb3NpdG9yeSBpbXBsZW1lbnRzIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdpbnN0YWxsZWQgJy5wYXJlbnQ6OmdldFJlcG9OYW1lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ZyZXNoKCk6IGJvb2wKewoKCnJldHVybiAkdGhpcy0+Y291bnQoKSA9PT0gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKCgoKCgpjbGFzcyBJbnN0YWxsZWRGaWxlc3lzdGVtUmVwb3NpdG9yeSBleHRlbmRzIEZpbGVzeXN0ZW1SZXBvc2l0b3J5IGltcGxlbWVudHMgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZQp7CnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpCnsKcmV0dXJuICdpbnN0YWxsZWQgJy5wYXJlbnQ6OmdldFJlcG9OYW1lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ZyZXNoKCkKewpyZXR1cm4gISR0aGlzLT5maWxlLT5leGlzdHMoKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKCgoKCgoKCgoKCmNsYXNzIEluc3RhbGxlZFJlcG9zaXRvcnkgZXh0ZW5kcyBDb21wb3NpdGVSZXBvc2l0b3J5CnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2VzV2l0aFJlcGxhY2Vyc0FuZFByb3ZpZGVycyhzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50ID0gbnVsbCk6IGFycmF5CnsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKCmlmIChudWxsICE9PSAkY29uc3RyYWludCAmJiAhJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50SW50ZXJmYWNlKSB7CiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJGNvbnN0cmFpbnQgPSAkdmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludCk7Cn0KCiRtYXRjaGVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5nZXRSZXBvc2l0b3JpZXMoKSBhcyAkcmVwbykgewpmb3JlYWNoICgkcmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkY2FuZGlkYXRlKSB7CmlmICgkbmFtZSA9PT0gJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpKSB7CmlmIChudWxsID09PSAkY29uc3RyYWludCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCkpKSkgewokbWF0Y2hlc1tdID0gJGNhbmRpZGF0ZTsKfQpjb250aW51ZTsKfQoKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGNhbmRpZGF0ZS0+Z2V0UHJvdmlkZXMoKSwgJGNhbmRpZGF0ZS0+Z2V0UmVwbGFjZXMoKSkgYXMgJGxpbmspIHsKaWYgKAokbmFtZSA9PT0gJGxpbmstPmdldFRhcmdldCgpCiYmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkKKSB7CiRtYXRjaGVzW10gPSAkY2FuZGlkYXRlOwpjb250aW51ZSAyOwp9Cn0KfQp9CgpyZXR1cm4gJG1hdGNoZXM7Cn0KCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXBlbmRlbnRzKCRuZWVkbGUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCwgYm9vbCAkaW52ZXJ0ID0gZmFsc2UsIGJvb2wgJHJlY3Vyc2UgPSB0cnVlLCA/YXJyYXkgJHBhY2thZ2VzRm91bmQgPSBudWxsKTogYXJyYXkKewokbmVlZGxlcyA9IGFycmF5X21hcCgnc3RydG9sb3dlcicsIChhcnJheSkgJG5lZWRsZSk7CiRyZXN1bHRzID0gW107CgoKaWYgKG51bGwgPT09ICRwYWNrYWdlc0ZvdW5kKSB7CiRwYWNrYWdlc0ZvdW5kID0gJG5lZWRsZXM7Cn0KCgokcm9vdFBhY2thZ2UgPSBudWxsOwpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSkgewokcm9vdFBhY2thZ2UgPSAkcGFja2FnZTsKYnJlYWs7Cn0KfQoKCmZvcmVhY2ggKCR0aGlzLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRsaW5rcyA9ICRwYWNrYWdlLT5nZXRSZXF1aXJlcygpOwoKCgokcGFja2FnZXNJblRyZWUgPSAkcGFja2FnZXNGb3VuZDsKCgppZiAoISRpbnZlcnQpIHsKJGxpbmtzICs9ICRwYWNrYWdlLT5nZXRSZXBsYWNlcygpOwoKCgoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKZm9yZWFjaCAoJG5lZWRsZXMgYXMgJG5lZWRsZSkgewppZiAoJGxpbmstPmdldFNvdXJjZSgpID09PSAkbmVlZGxlKSB7CmlmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAoJGxpbmstPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcygkY29uc3RyYWludCkgPT09IHRydWUpKSB7CgppZiAoaW5fYXJyYXkoJGxpbmstPmdldFRhcmdldCgpLCAkcGFja2FnZXNJblRyZWUpKSB7CiRyZXN1bHRzW10gPSBbJHBhY2thZ2UsICRsaW5rLCBmYWxzZV07CmNvbnRpbnVlOwp9CiRwYWNrYWdlc0luVHJlZVtdID0gJGxpbmstPmdldFRhcmdldCgpOwokZGVwZW5kZW50cyA9ICRyZWN1cnNlID8gJHRoaXMtPmdldERlcGVuZGVudHMoJGxpbmstPmdldFRhcmdldCgpLCBudWxsLCBmYWxzZSwgdHJ1ZSwgJHBhY2thZ2VzSW5UcmVlKSA6IFtdOwokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCAkbGluaywgJGRlcGVuZGVudHNdOwokbmVlZGxlc1tdID0gJGxpbmstPmdldFRhcmdldCgpOwp9Cn0KfQp9CnVuc2V0KCRuZWVkbGUpOwp9CgoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJGxpbmtzICs9ICRwYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpOwp9CgoKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CmZvcmVhY2ggKCRuZWVkbGVzIGFzICRuZWVkbGUpIHsKaWYgKCRsaW5rLT5nZXRUYXJnZXQoKSA9PT0gJG5lZWRsZSkgewppZiAoJGNvbnN0cmFpbnQgPT09IG51bGwgfHwgKCRsaW5rLT5nZXRDb25zdHJhaW50KCktPm1hdGNoZXMoJGNvbnN0cmFpbnQpID09PSAhJGludmVydCkpIHsKCmlmIChpbl9hcnJheSgkbGluay0+Z2V0U291cmNlKCksICRwYWNrYWdlc0luVHJlZSkpIHsKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssIGZhbHNlXTsKY29udGludWU7Cn0KJHBhY2thZ2VzSW5UcmVlW10gPSAkbGluay0+Z2V0U291cmNlKCk7CiRkZXBlbmRlbnRzID0gJHJlY3Vyc2UgPyAkdGhpcy0+Z2V0RGVwZW5kZW50cygkbGluay0+Z2V0U291cmNlKCksIG51bGwsIGZhbHNlLCB0cnVlLCAkcGFja2FnZXNJblRyZWUpIDogW107CiRyZXN1bHRzW10gPSBbJHBhY2thZ2UsICRsaW5rLCAkZGVwZW5kZW50c107Cn0KfQp9Cn0KCgppZiAoJGludmVydCAmJiBpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkbmVlZGxlcywgdHJ1ZSkpIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldENvbmZsaWN0cygpIGFzICRsaW5rKSB7CmZvcmVhY2ggKCR0aGlzLT5maW5kUGFja2FnZXMoJGxpbmstPmdldFRhcmdldCgpKSBhcyAkcGtnKSB7CiR2ZXJzaW9uID0gbmV3IENvbnN0cmFpbnQoJz0nLCAkcGtnLT5nZXRWZXJzaW9uKCkpOwppZiAoJGxpbmstPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcygkdmVyc2lvbikgPT09ICRpbnZlcnQpIHsKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssIGZhbHNlXTsKfQp9Cn0KfQoKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRDb25mbGljdHMoKSBhcyAkbGluaykgewppZiAoaW5fYXJyYXkoJGxpbmstPmdldFRhcmdldCgpLCAkbmVlZGxlcywgdHJ1ZSkpIHsKZm9yZWFjaCAoJHRoaXMtPmZpbmRQYWNrYWdlcygkbGluay0+Z2V0VGFyZ2V0KCkpIGFzICRwa2cpIHsKJHZlcnNpb24gPSBuZXcgQ29uc3RyYWludCgnPScsICRwa2ctPmdldFZlcnNpb24oKSk7CmlmICgkbGluay0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKCR2ZXJzaW9uKSA9PT0gJGludmVydCkgewokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCAkbGluaywgZmFsc2VdOwp9Cn0KfQp9CgoKaWYgKCRpbnZlcnQgJiYgJGNvbnN0cmFpbnQgJiYgaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJG5lZWRsZXMsIHRydWUpICYmICRjb25zdHJhaW50LT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRsaW5rLT5nZXRUYXJnZXQoKSkpIHsKaWYgKCR0aGlzLT5maW5kUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCksICRsaW5rLT5nZXRDb25zdHJhaW50KCkpKSB7CmNvbnRpbnVlOwp9CgokcGxhdGZvcm1Qa2cgPSAkdGhpcy0+ZmluZFBhY2thZ2UoJGxpbmstPmdldFRhcmdldCgpLCAnKicpOwokZGVzY3JpcHRpb24gPSAkcGxhdGZvcm1Qa2cgPyAnYnV0ICcuJHBsYXRmb3JtUGtnLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyBpcyBpbnN0YWxsZWQnIDogJ2J1dCBpdCBpcyBtaXNzaW5nJzsKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgbmV3IExpbmsoJHBhY2thZ2UtPmdldE5hbWUoKSwgJGxpbmstPmdldFRhcmdldCgpLCBuZXcgTWF0Y2hBbGxDb25zdHJhaW50LCBMaW5rOjpUWVBFX1JFUVVJUkUsICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCkuJyAnLiRkZXNjcmlwdGlvbiksIGZhbHNlXTsKCmNvbnRpbnVlOwp9Cgpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcGtnKSB7CmlmICghaW5fYXJyYXkoJGxpbmstPmdldFRhcmdldCgpLCAkcGtnLT5nZXROYW1lcygpKSkgewpjb250aW51ZTsKfQoKJHZlcnNpb24gPSBuZXcgQ29uc3RyYWludCgnPScsICRwa2ctPmdldFZlcnNpb24oKSk7CgppZiAoJGxpbmstPmdldFRhcmdldCgpICE9PSAkcGtnLT5nZXROYW1lKCkpIHsKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHBrZy0+Z2V0UmVwbGFjZXMoKSwgJHBrZy0+Z2V0UHJvdmlkZXMoKSkgYXMgJHByb3YpIHsKaWYgKCRsaW5rLT5nZXRUYXJnZXQoKSA9PT0gJHByb3YtPmdldFRhcmdldCgpKSB7CiR2ZXJzaW9uID0gJHByb3YtPmdldENvbnN0cmFpbnQoKTsKYnJlYWs7Cn0KfQp9CgppZiAoISRsaW5rLT5nZXRDb25zdHJhaW50KCktPm1hdGNoZXMoJHZlcnNpb24pKSB7CgoKaWYgKCRyb290UGFja2FnZSkgewpmb3JlYWNoIChhcnJheV9tZXJnZSgkcm9vdFBhY2thZ2UtPmdldFJlcXVpcmVzKCksICRyb290UGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSkgYXMgJHJvb3RSZXEpIHsKaWYgKGluX2FycmF5KCRyb290UmVxLT5nZXRUYXJnZXQoKSwgJHBrZy0+Z2V0TmFtZXMoKSkgJiYgISRyb290UmVxLT5nZXRDb25zdHJhaW50KCktPm1hdGNoZXMoJGxpbmstPmdldENvbnN0cmFpbnQoKSkpIHsKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssIGZhbHNlXTsKJHJlc3VsdHNbXSA9IFskcm9vdFBhY2thZ2UsICRyb290UmVxLCBmYWxzZV07CmNvbnRpbnVlIDM7Cn0KfQoKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssIGZhbHNlXTsKJHJlc3VsdHNbXSA9IFskcm9vdFBhY2thZ2UsIG5ldyBMaW5rKCRyb290UGFja2FnZS0+Z2V0TmFtZSgpLCAkbGluay0+Z2V0VGFyZ2V0KCksIG5ldyBNYXRjaEFsbENvbnN0cmFpbnQsIExpbms6OlRZUEVfRE9FU19OT1RfUkVRVUlSRSwgJ2J1dCAnIC4gJHBrZy0+Z2V0UHJldHR5VmVyc2lvbigpIC4gJyBpcyBpbnN0YWxsZWQnKSwgZmFsc2VdOwp9IGVsc2UgewoKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssIGZhbHNlXTsKfQp9Cgpjb250aW51ZSAyOwp9Cn0KfQp9Cgprc29ydCgkcmVzdWx0cyk7CgpyZXR1cm4gJHJlc3VsdHM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJ2luc3RhbGxlZCByZXBvICgnLmltcGxvZGUoJywgJywgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJHJlcG8pOiBzdHJpbmcgewpyZXR1cm4gJHJlcG8tPmdldFJlcG9OYW1lKCk7Cn0sICR0aGlzLT5nZXRSZXBvc2l0b3JpZXMoKSkpLicpJzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwb3NpdG9yeSk6IHZvaWQKewppZiAoCiRyZXBvc2l0b3J5IGluc3RhbmNlb2YgTG9ja0FycmF5UmVwb3NpdG9yeQp8fCAkcmVwb3NpdG9yeSBpbnN0YW5jZW9mIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UKfHwgJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSb290UGFja2FnZVJlcG9zaXRvcnkKfHwgJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBQbGF0Zm9ybVJlcG9zaXRvcnkKKSB7CnBhcmVudDo6YWRkUmVwb3NpdG9yeSgkcmVwb3NpdG9yeSk7CgpyZXR1cm47Cn0KCnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0FuIEluc3RhbGxlZFJlcG9zaXRvcnkgY2FuIG5vdCBjb250YWluIGEgcmVwb3NpdG9yeSBvZiB0eXBlICcuZ2V0X2NsYXNzKCRyZXBvc2l0b3J5KS4nICgnLiRyZXBvc2l0b3J5LT5nZXRSZXBvTmFtZSgpLicpJyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKCgppbnRlcmZhY2UgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSBleHRlbmRzIFdyaXRhYmxlUmVwb3NpdG9yeUludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZNb2RlKCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNGcmVzaCgpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKCgoKCgpjbGFzcyBJbnZhbGlkUmVwb3NpdG9yeUV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24Kewp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKCgoKCgoKCmNsYXNzIExvY2tBcnJheVJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkKewp1c2UgQ2Fub25pY2FsUGFja2FnZXNUcmFpdDsKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJ2xvY2sgcmVwbyc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXFZhbGlkYXRpbmdBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgoKY2xhc3MgUGFja2FnZVJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkKewoKcHJpdmF0ZSAkY29uZmlnOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGNvbmZpZykKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnWydwYWNrYWdlJ107CgoKaWYgKCFpc19udW1lcmljKGtleSgkdGhpcy0+Y29uZmlnKSkpIHsKJHRoaXMtPmNvbmZpZyA9IFskdGhpcy0+Y29uZmlnXTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKcGFyZW50Ojppbml0aWFsaXplKCk7CgokbG9hZGVyID0gbmV3IFZhbGlkYXRpbmdBcnJheUxvYWRlcihuZXcgQXJyYXlMb2FkZXIobnVsbCwgdHJ1ZSksIHRydWUpOwpmb3JlYWNoICgkdGhpcy0+Y29uZmlnIGFzICRwYWNrYWdlKSB7CnRyeSB7CiRwYWNrYWdlID0gJGxvYWRlci0+bG9hZCgkcGFja2FnZSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IEludmFsaWRSZXBvc2l0b3J5RXhjZXB0aW9uKCdBIHJlcG9zaXRvcnkgb2YgdHlwZSAicGFja2FnZSIgY29udGFpbnMgYW4gaW52YWxpZCBwYWNrYWdlIGRlZmluaXRpb246ICcuJGUtPmdldE1lc3NhZ2UoKS4iXG5cbkludmFsaWQgcGFja2FnZSBkZWZpbml0aW9uOlxuIi5qc29uX2VuY29kZSgkcGFja2FnZSkpOwp9CgokdGhpcy0+YWRkUGFja2FnZSgkcGFja2FnZSk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCk6IHN0cmluZwp7CnJldHVybiBQcmVnOjpyZXBsYWNlKCd7XmFycmF5IH0nLCAncGFja2FnZSAnLCBwYXJlbnQ6OmdldFJlcG9OYW1lKCkpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25HdWVzc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxVcmw7CnVzZSBDb21wb3NlclxVdGlsXEdpdCBhcyBHaXRVdGlsOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgUGF0aFJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkgaW1wbGVtZW50cyBDb25maWd1cmFibGVSZXBvc2l0b3J5SW50ZXJmYWNlCnsKCgoKcHJpdmF0ZSAkbG9hZGVyOwoKCgoKcHJpdmF0ZSAkdmVyc2lvbkd1ZXNzZXI7CgoKCgpwcml2YXRlICR1cmw7CgoKCgoKcHJpdmF0ZSAkcmVwb0NvbmZpZzsKCgoKCnByaXZhdGUgJHByb2Nlc3M7CgoKCgpwcml2YXRlICRvcHRpb25zOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHJlcG9Db25maWcsIElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsID9IdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIgPSBudWxsLCA/RXZlbnREaXNwYXRjaGVyICRkaXNwYXRjaGVyID0gbnVsbCwgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpCnsKaWYgKCFpc3NldCgkcmVwb0NvbmZpZ1sndXJsJ10pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91IG11c3Qgc3BlY2lmeSB0aGUgYHVybGAgY29uZmlndXJhdGlvbiBmb3IgdGhlIHBhdGggcmVwb3NpdG9yeScpOwp9CgokdGhpcy0+bG9hZGVyID0gbmV3IEFycmF5TG9hZGVyKG51bGwsIHRydWUpOwokdGhpcy0+dXJsID0gUGxhdGZvcm06OmV4cGFuZFBhdGgoJHJlcG9Db25maWdbJ3VybCddKTsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiR0aGlzLT52ZXJzaW9uR3Vlc3NlciA9IG5ldyBWZXJzaW9uR3Vlc3NlcigkY29uZmlnLCAkdGhpcy0+cHJvY2VzcywgbmV3IFZlcnNpb25QYXJzZXIoKSwgJGlvKTsKJHRoaXMtPnJlcG9Db25maWcgPSAkcmVwb0NvbmZpZzsKJHRoaXMtPm9wdGlvbnMgPSAkcmVwb0NvbmZpZ1snb3B0aW9ucyddID8/IFtdOwppZiAoIWlzc2V0KCR0aGlzLT5vcHRpb25zWydyZWxhdGl2ZSddKSkgewokZmlsZXN5c3RlbSA9IG5ldyBGaWxlc3lzdGVtKCk7CiR0aGlzLT5vcHRpb25zWydyZWxhdGl2ZSddID0gISRmaWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkdGhpcy0+dXJsKTsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdwYXRoIHJlcG8gKCcuVXJsOjpzYW5pdGl6ZSgkdGhpcy0+cmVwb0NvbmZpZ1sndXJsJ10pLicpJzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9Db25maWcoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcG9Db25maWc7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZAp7CnBhcmVudDo6aW5pdGlhbGl6ZSgpOwoKJHVybE1hdGNoZXMgPSAkdGhpcy0+Z2V0VXJsTWF0Y2hlcygpOwoKaWYgKGVtcHR5KCR1cmxNYXRjaGVzKSkgewppZiAoUHJlZzo6aXNNYXRjaCgne1sqe31dfScsICR0aGlzLT51cmwpKSB7CiR1cmwgPSAkdGhpcy0+dXJsOwp3aGlsZSAoUHJlZzo6aXNNYXRjaCgne1sqe31dfScsICR1cmwpKSB7CiR1cmwgPSBkaXJuYW1lKCR1cmwpOwp9CgppZiAoaXNfZGlyKCR1cmwpKSB7CnJldHVybjsKfQp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBgdXJsYCBzdXBwbGllZCBmb3IgdGhlIHBhdGggKCcgLiAkdGhpcy0+dXJsIC4gJykgcmVwb3NpdG9yeSBkb2VzIG5vdCBleGlzdCcpOwp9Cgpmb3JlYWNoICgkdXJsTWF0Y2hlcyBhcyAkdXJsKSB7CiRwYXRoID0gcmVhbHBhdGgoJHVybCkgLiBESVJFQ1RPUllfU0VQQVJBVE9SOwokY29tcG9zZXJGaWxlUGF0aCA9ICRwYXRoLidjb21wb3Nlci5qc29uJzsKCmlmICghZmlsZV9leGlzdHMoJGNvbXBvc2VyRmlsZVBhdGgpKSB7CmNvbnRpbnVlOwp9CgokanNvbiA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRjb21wb3NlckZpbGVQYXRoKTsKJHBhY2thZ2UgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRqc29uLCAkY29tcG9zZXJGaWxlUGF0aCk7CiRwYWNrYWdlWydkaXN0J10gPSBbCid0eXBlJyA9PiAncGF0aCcsCid1cmwnID0+ICR1cmwsCl07CiRyZWZlcmVuY2UgPSAkdGhpcy0+b3B0aW9uc1sncmVmZXJlbmNlJ10gPz8gJ2F1dG8nOwppZiAoJ25vbmUnID09PSAkcmVmZXJlbmNlKSB7CiRwYWNrYWdlWydkaXN0J11bJ3JlZmVyZW5jZSddID0gbnVsbDsKfSBlbHNlaWYgKCdjb25maWcnID09PSAkcmVmZXJlbmNlIHx8ICdhdXRvJyA9PT0gJHJlZmVyZW5jZSkgewokcGFja2FnZVsnZGlzdCddWydyZWZlcmVuY2UnXSA9IGhhc2goJ3NoYTEnLCAkanNvbiAuIHNlcmlhbGl6ZSgkdGhpcy0+b3B0aW9ucykpOwp9CgoKJHBhY2thZ2VbJ3RyYW5zcG9ydC1vcHRpb25zJ10gPSBhcnJheV9pbnRlcnNlY3Rfa2V5KCR0aGlzLT5vcHRpb25zLCBbJ3N5bWxpbmsnID0+IHRydWUsICdyZWxhdGl2ZScgPT4gdHJ1ZV0pOwoKaWYgKGlzc2V0KCRwYWNrYWdlWyduYW1lJ10sICR0aGlzLT5vcHRpb25zWyd2ZXJzaW9ucyddWyRwYWNrYWdlWyduYW1lJ11dKSkgewokcGFja2FnZVsndmVyc2lvbiddID0gJHRoaXMtPm9wdGlvbnNbJ3ZlcnNpb25zJ11bJHBhY2thZ2VbJ25hbWUnXV07Cn0KCgppZiAoIWlzc2V0KCRwYWNrYWdlWyd2ZXJzaW9uJ10pICYmICgkcm9vdFZlcnNpb24gPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ST09UX1ZFUlNJT04nKSkpIHsKaWYgKAowID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZXYtcGFyc2UnLCAnSEVBRCddLCAkcmVmMSwgJHBhdGgpCiYmIDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3Jldi1wYXJzZScsICdIRUFEJ10sICRyZWYyKQomJiAkcmVmMSA9PT0gJHJlZjIKKSB7CiRwYWNrYWdlWyd2ZXJzaW9uJ10gPSAkdGhpcy0+dmVyc2lvbkd1ZXNzZXItPmdldFJvb3RWZXJzaW9uRnJvbUVudigpOwp9Cn0KCiRvdXRwdXQgPSAnJzsKaWYgKCdhdXRvJyA9PT0gJHJlZmVyZW5jZSAmJiBpc19kaXIoJHBhdGggLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJy5naXQnKSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShhcnJheV9tZXJnZShbJ2dpdCcsICdsb2cnLCAnLW4xJywgJy0tcHJldHR5PSVIJ10sIEdpdFV0aWw6OmdldE5vU2hvd1NpZ25hdHVyZUZsYWdzKCR0aGlzLT5wcm9jZXNzKSksICRvdXRwdXQsICRwYXRoKSkgewokcGFja2FnZVsnZGlzdCddWydyZWZlcmVuY2UnXSA9IHRyaW0oJG91dHB1dCk7Cn0KCmlmICghaXNzZXQoJHBhY2thZ2VbJ3ZlcnNpb24nXSkpIHsKJHZlcnNpb25EYXRhID0gJHRoaXMtPnZlcnNpb25HdWVzc2VyLT5ndWVzc1ZlcnNpb24oJHBhY2thZ2UsICRwYXRoKTsKaWYgKGlzX2FycmF5KCR2ZXJzaW9uRGF0YSkgJiYgJHZlcnNpb25EYXRhWydwcmV0dHlfdmVyc2lvbiddKSB7CgppZiAoIWVtcHR5KCR2ZXJzaW9uRGF0YVsnZmVhdHVyZV9wcmV0dHlfdmVyc2lvbiddKSkgewokcGFja2FnZVsndmVyc2lvbiddID0gJHZlcnNpb25EYXRhWydmZWF0dXJlX3ByZXR0eV92ZXJzaW9uJ107CiR0aGlzLT5hZGRQYWNrYWdlKCR0aGlzLT5sb2FkZXItPmxvYWQoJHBhY2thZ2UpKTsKfQoKJHBhY2thZ2VbJ3ZlcnNpb24nXSA9ICR2ZXJzaW9uRGF0YVsncHJldHR5X3ZlcnNpb24nXTsKfSBlbHNlIHsKJHBhY2thZ2VbJ3ZlcnNpb24nXSA9ICdkZXYtbWFpbic7Cn0KfQoKdHJ5IHsKJHRoaXMtPmFkZFBhY2thZ2UoJHRoaXMtPmxvYWRlci0+bG9hZCgkcGFja2FnZSkpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIGxvYWRpbmcgdGhlIHBhY2thZ2UgaW4gJy4kY29tcG9zZXJGaWxlUGF0aCwgMCwgJGUpOwp9Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFVybE1hdGNoZXMoKTogYXJyYXkKewokZmxhZ3MgPSBHTE9CX01BUksgfCBHTE9CX09OTFlESVI7CgppZiAoZGVmaW5lZCgnR0xPQl9CUkFDRScpKSB7CiRmbGFncyB8PSBHTE9CX0JSQUNFOwp9IGVsc2VpZiAoc3RycG9zKCR0aGlzLT51cmwsICd7JykgIT09IGZhbHNlIHx8IHN0cnBvcygkdGhpcy0+dXJsLCAnfScpICE9PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBvcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgR0xPQl9CUkFDRSB3aGljaCBpcyByZXF1aXJlZCBmb3IgdGhlIHVybCAnLiAkdGhpcy0+dXJsKTsKfQoKCnJldHVybiBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogc3RyaW5nIHsKcmV0dXJuIHJ0cmltKHN0cl9yZXBsYWNlKERJUkVDVE9SWV9TRVBBUkFUT1IsICcvJywgJHZhbCksICcvJyk7Cn0sIGdsb2IoJHRoaXMtPnVybCwgJGZsYWdzKSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKCgoKCgoKY2xhc3MgUGVhclJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgUEVBUiByZXBvc2l0b3J5IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBDb21wb3NlciAyLngnKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGxhdGZvcm1cSGh2bURldGVjdG9yOwp1c2UgQ29tcG9zZXJcUGxhdGZvcm1cUnVudGltZTsKdXNlIENvbXBvc2VyXFBsYXRmb3JtXFZlcnNpb247CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBDb21wb3NlclxYZGVidWdIYW5kbGVyXFhkZWJ1Z0hhbmRsZXI7CgoKCgpjbGFzcyBQbGF0Zm9ybVJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkKewoKCgoKcHVibGljIGNvbnN0IFBMQVRGT1JNX1BBQ0tBR0VfUkVHRVggPSAne14oPzpwaHAoPzotNjRiaXR8LWlwdjZ8LXp0c3wtZGVidWcpP3xoaHZtfCg/OmV4dHxsaWIpLVthLXowLTldKD86W18uLV0/W2EtejAtOV0rKSp8Y29tcG9zZXIoPzotKD86cGx1Z2lufHJ1bnRpbWUpLWFwaSk/KSR9aUQnOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJGxhc3RTZWVuUGxhdGZvcm1QaHAgPSBudWxsOwoKCgoKcHJpdmF0ZSAkdmVyc2lvblBhcnNlcjsKCgoKCgoKCgpwcml2YXRlICRvdmVycmlkZXMgPSBbXTsKCgoKCgoKcHJpdmF0ZSAkZGlzYWJsZWRQYWNrYWdlcyA9IFtdOwoKCnByaXZhdGUgJHJ1bnRpbWU7Cgpwcml2YXRlICRoaHZtRGV0ZWN0b3I7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHBhY2thZ2VzID0gW10sIGFycmF5ICRvdmVycmlkZXMgPSBbXSwgP1J1bnRpbWUgJHJ1bnRpbWUgPSBudWxsLCA/SGh2bURldGVjdG9yICRoaHZtRGV0ZWN0b3IgPSBudWxsKQp7CiR0aGlzLT5ydW50aW1lID0gJHJ1bnRpbWUgPzogbmV3IFJ1bnRpbWUoKTsKJHRoaXMtPmhodm1EZXRlY3RvciA9ICRoaHZtRGV0ZWN0b3IgPzogbmV3IEhodm1EZXRlY3RvcigpOwpmb3JlYWNoICgkb3ZlcnJpZGVzIGFzICRuYW1lID0+ICR2ZXJzaW9uKSB7CmlmICghaXNfc3RyaW5nKCR2ZXJzaW9uKSAmJiBmYWxzZSAhPT0gJHZlcnNpb24pIHsgCnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdjb25maWcucGxhdGZvcm0uJy4kbmFtZS4nIHNob3VsZCBiZSBhIHN0cmluZyBvciBmYWxzZSwgYnV0IGdvdCAnLmdldHR5cGUoJHZlcnNpb24pLicgJy52YXJfZXhwb3J0KCR2ZXJzaW9uLCB0cnVlKSk7Cn0KaWYgKCRuYW1lID09PSAncGhwJyAmJiAkdmVyc2lvbiA9PT0gZmFsc2UpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ2NvbmZpZy5wbGF0Zm9ybS4nLiRuYW1lLicgY2Fubm90IGJlIHNldCB0byBmYWxzZSBhcyB5b3UgY2Fubm90IGRpc2FibGUgcGhwIGVudGlyZWx5LicpOwp9CiR0aGlzLT5vdmVycmlkZXNbc3RydG9sb3dlcigkbmFtZSldID0gWyduYW1lJyA9PiAkbmFtZSwgJ3ZlcnNpb24nID0+ICR2ZXJzaW9uXTsKfQpwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYWNrYWdlcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJ3BsYXRmb3JtIHJlcG8nOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNQbGF0Zm9ybVBhY2thZ2VEaXNhYmxlZChzdHJpbmcgJG5hbWUpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5kaXNhYmxlZFBhY2thZ2VzWyRuYW1lXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXNhYmxlZFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5kaXNhYmxlZFBhY2thZ2VzOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKcGFyZW50Ojppbml0aWFsaXplKCk7CgokbGlicmFyaWVzID0gW107CgokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CgoKCmZvcmVhY2ggKCR0aGlzLT5vdmVycmlkZXMgYXMgJG92ZXJyaWRlKSB7CgppZiAoIXNlbGY6OmlzUGxhdGZvcm1QYWNrYWdlKCRvdmVycmlkZVsnbmFtZSddKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBwbGF0Zm9ybSBwYWNrYWdlIG5hbWUgaW4gY29uZmlnLnBsYXRmb3JtOiAnLiRvdmVycmlkZVsnbmFtZSddKTsKfQoKaWYgKCRvdmVycmlkZVsndmVyc2lvbiddICE9PSBmYWxzZSkgewokdGhpcy0+YWRkT3ZlcnJpZGRlblBhY2thZ2UoJG92ZXJyaWRlKTsKfQp9CgokcHJldHR5VmVyc2lvbiA9IENvbXBvc2VyOjpnZXRWZXJzaW9uKCk7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcHJldHR5VmVyc2lvbik7CiRjb21wb3NlciA9IG5ldyBDb21wbGV0ZVBhY2thZ2UoJ2NvbXBvc2VyJywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJGNvbXBvc2VyLT5zZXREZXNjcmlwdGlvbignQ29tcG9zZXIgcGFja2FnZScpOwokdGhpcy0+YWRkUGFja2FnZSgkY29tcG9zZXIpOwoKJHByZXR0eVZlcnNpb24gPSBQbHVnaW5JbnRlcmZhY2U6OlBMVUdJTl9BUElfVkVSU0lPTjsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKJGNvbXBvc2VyUGx1Z2luQXBpID0gbmV3IENvbXBsZXRlUGFja2FnZSgnY29tcG9zZXItcGx1Z2luLWFwaScsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRjb21wb3NlclBsdWdpbkFwaS0+c2V0RGVzY3JpcHRpb24oJ1RoZSBDb21wb3NlciBQbHVnaW4gQVBJJyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRjb21wb3NlclBsdWdpbkFwaSk7CgokcHJldHR5VmVyc2lvbiA9IENvbXBvc2VyOjpSVU5USU1FX0FQSV9WRVJTSU9OOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwokY29tcG9zZXJSdW50aW1lQXBpID0gbmV3IENvbXBsZXRlUGFja2FnZSgnY29tcG9zZXItcnVudGltZS1hcGknLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwokY29tcG9zZXJSdW50aW1lQXBpLT5zZXREZXNjcmlwdGlvbignVGhlIENvbXBvc2VyIFJ1bnRpbWUgQVBJJyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRjb21wb3NlclJ1bnRpbWVBcGkpOwoKdHJ5IHsKJHByZXR0eVZlcnNpb24gPSAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1BIUF9WRVJTSU9OJyk7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcHJldHR5VmVyc2lvbik7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKJHByZXR0eVZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCcjXihbXn4rLV0rKS4qJCMnLCAnJDEnLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1BIUF9WRVJTSU9OJykpOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9CgokcGhwID0gbmV3IENvbXBsZXRlUGFja2FnZSgncGhwJywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJHBocC0+c2V0RGVzY3JpcHRpb24oJ1RoZSBQSFAgaW50ZXJwcmV0ZXInKTsKJHRoaXMtPmFkZFBhY2thZ2UoJHBocCk7CgppZiAoJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdQSFBfREVCVUcnKSkgewokcGhwZGVidWcgPSBuZXcgQ29tcGxldGVQYWNrYWdlKCdwaHAtZGVidWcnLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwokcGhwZGVidWctPnNldERlc2NyaXB0aW9uKCdUaGUgUEhQIGludGVycHJldGVyLCB3aXRoIGRlYnVnZ2luZyBzeW1ib2xzJyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRwaHBkZWJ1Zyk7Cn0KCmlmICgkdGhpcy0+cnVudGltZS0+aGFzQ29uc3RhbnQoJ1BIUF9aVFMnKSAmJiAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1BIUF9aVFMnKSkgewokcGhwenRzID0gbmV3IENvbXBsZXRlUGFja2FnZSgncGhwLXp0cycsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRwaHB6dHMtPnNldERlc2NyaXB0aW9uKCdUaGUgUEhQIGludGVycHJldGVyLCB3aXRoIFplbmQgVGhyZWFkIFNhZmV0eScpOwokdGhpcy0+YWRkUGFja2FnZSgkcGhwenRzKTsKfQoKaWYgKCR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnUEhQX0lOVF9TSVpFJykgPT09IDgpIHsKJHBocDY0ID0gbmV3IENvbXBsZXRlUGFja2FnZSgncGhwLTY0Yml0JywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJHBocDY0LT5zZXREZXNjcmlwdGlvbignVGhlIFBIUCBpbnRlcnByZXRlciwgNjRiaXQnKTsKJHRoaXMtPmFkZFBhY2thZ2UoJHBocDY0KTsKfQoKCgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdBRl9JTkVUNicpIHx8IFNpbGVuY2VyOjpjYWxsKFskdGhpcy0+cnVudGltZSwgJ2ludm9rZSddLCAnaW5ldF9wdG9uJywgWyc6OiddKSAhPT0gZmFsc2UpIHsKJHBocElwdjYgPSBuZXcgQ29tcGxldGVQYWNrYWdlKCdwaHAtaXB2NicsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRwaHBJcHY2LT5zZXREZXNjcmlwdGlvbignVGhlIFBIUCBpbnRlcnByZXRlciwgd2l0aCBJUHY2IHN1cHBvcnQnKTsKJHRoaXMtPmFkZFBhY2thZ2UoJHBocElwdjYpOwp9CgokbG9hZGVkRXh0ZW5zaW9ucyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25zKCk7CgoKZm9yZWFjaCAoJGxvYWRlZEV4dGVuc2lvbnMgYXMgJG5hbWUpIHsKaWYgKGluX2FycmF5KCRuYW1lLCBbJ3N0YW5kYXJkJywgJ0NvcmUnXSkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5hZGRFeHRlbnNpb24oJG5hbWUsICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25WZXJzaW9uKCRuYW1lKSk7Cn0KCgppZiAoIWluX2FycmF5KCd4ZGVidWcnLCAkbG9hZGVkRXh0ZW5zaW9ucywgdHJ1ZSkgJiYgKCRwcmV0dHlWZXJzaW9uID0gWGRlYnVnSGFuZGxlcjo6Z2V0U2tpcHBlZFZlcnNpb24oKSkpIHsKJHRoaXMtPmFkZEV4dGVuc2lvbigneGRlYnVnJywgJHByZXR0eVZlcnNpb24pOwp9CgoKCgpmb3JlYWNoICgkbG9hZGVkRXh0ZW5zaW9ucyBhcyAkbmFtZSkgewpzd2l0Y2ggKCRuYW1lKSB7CmNhc2UgJ2FtcXAnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCgppZiAoUHJlZzo6aXNNYXRjaCgnL15saWJyYWJiaXRtcSB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbGlicmFiYml0bXFNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnJhYmJpdG1xJywgJGxpYnJhYmJpdG1xTWF0Y2hlc1sndmVyc2lvbiddLCAnQU1RUCBsaWJyYWJiaXRtcSB2ZXJzaW9uJyk7Cn0KCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15BTVFQIHByb3RvY29sIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRwcm90b2NvbE1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictcHJvdG9jb2wnLCBzdHJfcmVwbGFjZSgnLScsICcuJywgJHByb3RvY29sTWF0Y2hlc1sndmVyc2lvbiddKSwgJ0FNUVAgcHJvdG9jb2wgdmVyc2lvbicpOwp9CmJyZWFrOwoKY2FzZSAnYnoyJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9eQlppcDIgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4qKSwvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLCAkbWF0Y2hlc1sndmVyc2lvbiddKTsKfQpicmVhazsKCmNhc2UgJ2N1cmwnOgokY3VybFZlcnNpb24gPSAkdGhpcy0+cnVudGltZS0+aW52b2tlKCdjdXJsX3ZlcnNpb24nKTsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUsICRjdXJsVmVyc2lvblsndmVyc2lvbiddKTsKCiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlNTTCBWZXJzaW9uID0+ICg/PGxpYnJhcnk+W14vXSspLyg/PHZlcnNpb24+LispJH1pbScsICRpbmZvLCAkc3NsTWF0Y2hlcykpIHsKJGxpYnJhcnkgPSBzdHJ0b2xvd2VyKCRzc2xNYXRjaGVzWydsaWJyYXJ5J10pOwppZiAoJGxpYnJhcnkgPT09ICdvcGVuc3NsJykgewokcGFyc2VkVmVyc2lvbiA9IFZlcnNpb246OnBhcnNlT3BlbnNzbCgkc3NsTWF0Y2hlc1sndmVyc2lvbiddLCAkaXNGaXBzKTsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1vcGVuc3NsJy4oJGlzRmlwcyA/ICctZmlwcycgOiAnJyksICRwYXJzZWRWZXJzaW9uLCAnY3VybCBPcGVuU1NMIHZlcnNpb24gKCcuJHBhcnNlZFZlcnNpb24uJyknLCBbXSwgJGlzRmlwcyA/IFsnY3VybC1vcGVuc3NsJ10gOiBbXSk7Cn0gZWxzZSB7CmlmICgkbGlicmFyeSA9PT0gJyhzZWN1cmV0cmFuc3BvcnQpIG9wZW5zc2wnKSB7CiRzaG9ydGxpYiA9ICdzZWN1cmV0cmFuc3BvcnQnOwp9IGVsc2Ugewokc2hvcnRsaWIgPSAkbGlicmFyeTsKfQokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLScuJHNob3J0bGliLCAkc3NsTWF0Y2hlc1sndmVyc2lvbiddLCAnY3VybCAnLiRsaWJyYXJ5LicgdmVyc2lvbiAoJy4kc3NsTWF0Y2hlc1sndmVyc2lvbiddLicpJywgWydjdXJsLW9wZW5zc2wnXSk7Cn0KfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XmxpYlNTSCBWZXJzaW9uID0+ICg/PGxpYnJhcnk+W14vXSspLyg/PHZlcnNpb24+Lis/KSg/Oi8uKik/JH1pbScsICRpbmZvLCAkc3NoTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy0nLnN0cnRvbG93ZXIoJHNzaE1hdGNoZXNbJ2xpYnJhcnknXSksICRzc2hNYXRjaGVzWyd2ZXJzaW9uJ10sICdjdXJsICcuJHNzaE1hdGNoZXNbJ2xpYnJhcnknXS4nIHZlcnNpb24nKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlpMaWIgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSR9aW0nLCAkaW5mbywgJHpsaWJNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLXpsaWInLCAkemxpYk1hdGNoZXNbJ3ZlcnNpb24nXSwgJ2N1cmwgemxpYiB2ZXJzaW9uJyk7Cn0KYnJlYWs7CgpjYXNlICdkYXRlJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9edGltZWxpYiB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkdGltZWxpYk1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictdGltZWxpYicsICR0aW1lbGliTWF0Y2hlc1sndmVyc2lvbiddLCAnZGF0ZSB0aW1lbGliIHZlcnNpb24nKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXlRpbWV6b25lIERhdGFiYXNlID0+ICg/PHNvdXJjZT5pbnRlcm5hbHxleHRlcm5hbCkkL2ltJywgJGluZm8sICR6b25laW5mb1NvdXJjZU1hdGNoZXMpKSB7CiRleHRlcm5hbCA9ICR6b25laW5mb1NvdXJjZU1hdGNoZXNbJ3NvdXJjZSddID09PSAnZXh0ZXJuYWwnOwppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL14iT2xzb24iIFRpbWV6b25lIERhdGFiYXNlIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKz8pKD86XC5zeXN0ZW0pPyQvaW0nLCAkaW5mbywgJHpvbmVpbmZvTWF0Y2hlcykpIHsKCmlmICgkZXh0ZXJuYWwgJiYgaW5fYXJyYXkoJ3RpbWV6b25lZGInLCAkbG9hZGVkRXh0ZW5zaW9ucywgdHJ1ZSkpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ3RpbWV6b25lZGItem9uZWluZm8nLCAkem9uZWluZm9NYXRjaGVzWyd2ZXJzaW9uJ10sICd6b25laW5mbyAoIk9sc29uIikgZGF0YWJhc2UgZm9yIGRhdGUgKHJlcGxhY2VkIGJ5IHRpbWV6b25lZGIpJywgWyRuYW1lLictem9uZWluZm8nXSk7Cn0gZWxzZSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictem9uZWluZm8nLCAkem9uZWluZm9NYXRjaGVzWyd2ZXJzaW9uJ10sICd6b25laW5mbyAoIk9sc29uIikgZGF0YWJhc2UgZm9yIGRhdGUnKTsKfQp9Cn0KYnJlYWs7CgpjYXNlICdmaWxlaW5mbyc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKCmlmIChQcmVnOjppc01hdGNoKCcvXmxpYm1hZ2ljID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbWFnaWNNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYm1hZ2ljJywgJG1hZ2ljTWF0Y2hlc1sndmVyc2lvbiddLCAnZmlsZWluZm8gbGlibWFnaWMgdmVyc2lvbicpOwp9CmJyZWFrOwoKY2FzZSAnZ2QnOgokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZSwgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdHRF9WRVJTSU9OJykpOwoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15saWJKUEVHIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKz8pKD86IGNvbXBhdGlibGUpPyQvaW0nLCAkaW5mbywgJGxpYmpwZWdNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYmpwZWcnLCBWZXJzaW9uOjpwYXJzZUxpYmpwZWcoJGxpYmpwZWdNYXRjaGVzWyd2ZXJzaW9uJ10pLCAnbGlianBlZyB2ZXJzaW9uIGZvciBnZCcpOwp9CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15saWJQTkcgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJGxpYnBuZ01hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlicG5nJywgJGxpYnBuZ01hdGNoZXNbJ3ZlcnNpb24nXSwgJ2xpYnBuZyB2ZXJzaW9uIGZvciBnZCcpOwp9CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15GcmVlVHlwZSBWZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkZnJlZXR5cGVNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWZyZWV0eXBlJywgJGZyZWV0eXBlTWF0Y2hlc1sndmVyc2lvbiddLCAnZnJlZXR5cGUgdmVyc2lvbiBmb3IgZ2QnKTsKfQoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9ebGliWHBtIFZlcnNpb24gPT4gKD88dmVyc2lvbklkPlxkKykkL2ltJywgJGluZm8sICRsaWJ4cG1NYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnhwbScsIFZlcnNpb246OmNvbnZlcnRMaWJ4cG1WZXJzaW9uSWQoKGludCkgJGxpYnhwbU1hdGNoZXNbJ3ZlcnNpb25JZCddKSwgJ2xpYnhwbSB2ZXJzaW9uIGZvciBnZCcpOwp9CgpicmVhazsKCmNhc2UgJ2dtcCc6CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ0dNUF9WRVJTSU9OJykpOwpicmVhazsKCmNhc2UgJ2ljb252JzoKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnSUNPTlZfVkVSU0lPTicpKTsKYnJlYWs7CgpjYXNlICdpbnRsJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgokZGVzY3JpcHRpb24gPSAnVGhlIElDVSB1bmljb2RlIGFuZCBnbG9iYWxpemF0aW9uIHN1cHBvcnQgbGlicmFyeSc7CgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdJTlRMX0lDVV9WRVJTSU9OJykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ2ljdScsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnSU5UTF9JQ1VfVkVSU0lPTicpLCAkZGVzY3JpcHRpb24pOwp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaCgnL15JQ1UgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICdpY3UnLCAkbWF0Y2hlc1sndmVyc2lvbiddLCAkZGVzY3JpcHRpb24pOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eSUNVIFRaRGF0YSB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LiopJC9pbScsICRpbmZvLCAkem9uZWluZm9NYXRjaGVzKSAmJiBudWxsICE9PSAoJHZlcnNpb24gPSBWZXJzaW9uOjpwYXJzZVpvbmVpbmZvVmVyc2lvbigkem9uZWluZm9NYXRjaGVzWyd2ZXJzaW9uJ10pKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAnaWN1LXpvbmVpbmZvJywgJHZlcnNpb24sICd6b25laW5mbyAoIk9sc29uIikgZGF0YWJhc2UgZm9yIGljdScpOwp9CgoKaWYgKCR0aGlzLT5ydW50aW1lLT5oYXNDbGFzcygnUmVzb3VyY2VCdW5kbGUnKSkgewokcmVzb3VyY2VCdW5kbGUgPSAkdGhpcy0+cnVudGltZS0+aW52b2tlKFsnUmVzb3VyY2VCdW5kbGUnLCAnY3JlYXRlJ10sIFsncm9vdCcsICdJQ1VEQVRBJywgZmFsc2VdKTsKaWYgKCRyZXNvdXJjZUJ1bmRsZSAhPT0gbnVsbCkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAnaWN1LWNsZHInLCAkcmVzb3VyY2VCdW5kbGUtPmdldCgnVmVyc2lvbicpLCAnSUNVIENMRFIgcHJvamVjdCB2ZXJzaW9uJyk7Cn0KfQoKaWYgKCR0aGlzLT5ydW50aW1lLT5oYXNDbGFzcygnSW50bENoYXInKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAnaWN1LXVuaWNvZGUnLCBpbXBsb2RlKCcuJywgYXJyYXlfc2xpY2UoJHRoaXMtPnJ1bnRpbWUtPmludm9rZShbJ0ludGxDaGFyJywgJ2dldFVuaWNvZGVWZXJzaW9uJ10pLCAwLCAzKSksICdJQ1UgdW5pY29kZSB2ZXJzaW9uJyk7Cn0KYnJlYWs7CgpjYXNlICdpbWFnaWNrJzoKCiRpbWFnZU1hZ2lja1ZlcnNpb24gPSAkdGhpcy0+cnVudGltZS0+Y29uc3RydWN0KCdJbWFnaWNrJyktPmdldFZlcnNpb24oKTsKCgppZiAoUHJlZzo6aXNNYXRjaCgnL15JbWFnZU1hZ2ljayAoPzx2ZXJzaW9uPltcZC5dKykoPzotKD88cGF0Y2g+XGQrKSk/LycsICRpbWFnZU1hZ2lja1ZlcnNpb25bJ3ZlcnNpb25TdHJpbmcnXSwgJG1hdGNoZXMpKSB7CiR2ZXJzaW9uID0gJG1hdGNoZXNbJ3ZlcnNpb24nXTsKaWYgKGlzc2V0KCRtYXRjaGVzWydwYXRjaCddKSkgewokdmVyc2lvbiAuPSAnLicuJG1hdGNoZXNbJ3BhdGNoJ107Cn0KCiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictaW1hZ2VtYWdpY2snLCAkdmVyc2lvbiwgbnVsbCwgWydpbWFnaWNrJ10pOwp9CmJyZWFrOwoKY2FzZSAnbGRhcCc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eVmVuZG9yIFZlcnNpb24gPT4gKD88dmVyc2lvbklkPlxkKykkL2ltJywgJGluZm8sICRtYXRjaGVzKSAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXlZlbmRvciBOYW1lID0+ICg/PHZlbmRvcj4uKykkL2ltJywgJGluZm8sICR2ZW5kb3JNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLScuc3RydG9sb3dlcigkdmVuZG9yTWF0Y2hlc1sndmVuZG9yJ10pLCBWZXJzaW9uOjpjb252ZXJ0T3BlbmxkYXBWZXJzaW9uSWQoKGludCkgJG1hdGNoZXNbJ3ZlcnNpb25JZCddKSwgJHZlbmRvck1hdGNoZXNbJ3ZlbmRvciddLicgdmVyc2lvbiBvZiBsZGFwJyk7Cn0KYnJlYWs7CgpjYXNlICdsaWJ4bWwnOgoKJGxpYnhtbFByb3ZpZGVzID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGV4dGVuc2lvbik6IHN0cmluZyB7CnJldHVybiAkZXh0ZW5zaW9uIC4gJy1saWJ4bWwnOwp9LCBhcnJheV9pbnRlcnNlY3QoJGxvYWRlZEV4dGVuc2lvbnMsIFsnZG9tJywgJ3NpbXBsZXhtbCcsICd4bWwnLCAneG1scmVhZGVyJywgJ3htbHdyaXRlciddKSk7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ0xJQlhNTF9ET1RURURfVkVSU0lPTicpLCAnbGlieG1sIGxpYnJhcnkgdmVyc2lvbicsIFtdLCAkbGlieG1sUHJvdmlkZXMpOwoKYnJlYWs7CgpjYXNlICdtYnN0cmluZyc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKCmlmIChQcmVnOjppc01hdGNoKCcvXmxpYm1iZmwgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJGxpYm1iZmxNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYm1iZmwnLCAkbGlibWJmbE1hdGNoZXNbJ3ZlcnNpb24nXSwgJ21ic3RyaW5nIGxpYm1iZmwgdmVyc2lvbicpOwp9CgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdNQl9PTklHVVJVTUFfVkVSU0lPTicpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictb25pZ3VydW1hJywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdNQl9PTklHVVJVTUFfVkVSU0lPTicpLCAnbWJzdHJpbmcgb25pZ3VydW1hIHZlcnNpb24nKTsKCgoKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2goJy9eKD86b25pZ3VydW1hfE11bHRpYnl0ZSByZWdleCBcKG9uaWd1cnVtYVwpKSB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkb25pZ3VydW1hTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1vbmlndXJ1bWEnLCAkb25pZ3VydW1hTWF0Y2hlc1sndmVyc2lvbiddLCAnbWJzdHJpbmcgb25pZ3VydW1hIHZlcnNpb24nKTsKfQoKYnJlYWs7CgpjYXNlICdtZW1jYWNoZWQnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCgppZiAoUHJlZzo6aXNNYXRjaCgnL15saWJtZW1jYWNoZWQgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlibWVtY2FjaGVkJywgJG1hdGNoZXNbJ3ZlcnNpb24nXSwgJ2xpYm1lbWNhY2hlZCB2ZXJzaW9uJyk7Cn0KYnJlYWs7CgpjYXNlICdvcGVuc3NsJzoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xig/Ok9wZW5TU0x8TGlicmVTU0wpP1xzKig/PHZlcnNpb24+XFMrKX1pJywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdPUEVOU1NMX1ZFUlNJT05fVEVYVCcpLCAkbWF0Y2hlcykpIHsKJHBhcnNlZFZlcnNpb24gPSBWZXJzaW9uOjpwYXJzZU9wZW5zc2woJG1hdGNoZXNbJ3ZlcnNpb24nXSwgJGlzRmlwcyk7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLigkaXNGaXBzID8gJy1maXBzJyA6ICcnKSwgJHBhcnNlZFZlcnNpb24sICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnT1BFTlNTTF9WRVJTSU9OX1RFWFQnKSwgW10sICRpc0ZpcHMgPyBbJG5hbWVdIDogW10pOwp9CmJyZWFrOwoKY2FzZSAncGNyZSc6CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLCBQcmVnOjpyZXBsYWNlKCd7XihcUyspLip9JywgJyQxJywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdQQ1JFX1ZFUlNJT04nKSkpOwoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eUENSRSBVbmljb2RlIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRwY3JlVW5pY29kZU1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictdW5pY29kZScsICRwY3JlVW5pY29kZU1hdGNoZXNbJ3ZlcnNpb24nXSwgJ1BDUkUgVW5pY29kZSB2ZXJzaW9uIHN1cHBvcnQnKTsKfQoKYnJlYWs7CgpjYXNlICdteXNxbG5kJzoKY2FzZSAncGRvX215c3FsJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL14oPzpDbGllbnQgQVBJIHZlcnNpb258VmVyc2lvbikgPT4gbXlzcWxuZCAoPzx2ZXJzaW9uPi4rPykgL21pJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLW15c3FsbmQnLCAkbWF0Y2hlc1sndmVyc2lvbiddLCAnbXlzcWxuZCBsaWJyYXJ5IHZlcnNpb24gZm9yICcuJG5hbWUpOwp9CmJyZWFrOwoKY2FzZSAnbW9uZ29kYic6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9ebGlibW9uZ29jIGJ1bmRsZWQgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJGxpYm1vbmdvY01hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlibW9uZ29jJywgJGxpYm1vbmdvY01hdGNoZXNbJ3ZlcnNpb24nXSwgJ2xpYm1vbmdvYyB2ZXJzaW9uIG9mIG1vbmdvZGInKTsKfQoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9ebGliYnNvbiBidW5kbGVkIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRsaWJic29uTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1saWJic29uJywgJGxpYmJzb25NYXRjaGVzWyd2ZXJzaW9uJ10sICdsaWJic29uIHZlcnNpb24gb2YgbW9uZ29kYicpOwp9CmJyZWFrOwoKY2FzZSAncGdzcWwnOgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdQR1NRTF9MSUJQUV9WRVJTSU9OJykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ3Bnc3FsLWxpYnBxJywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdQR1NRTF9MSUJQUV9WRVJTSU9OJyksICdsaWJwcSBmb3IgcGdzcWwnKTsKYnJlYWs7Cn0KCgpjYXNlICdwZG9fcGdzcWwnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCmlmIChQcmVnOjppc01hdGNoKCcvXlBvc3RncmVTUUxcKGxpYnBxXCkgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4qKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlicHEnLCAkbWF0Y2hlc1sndmVyc2lvbiddLCAnbGlicHEgZm9yICcuJG5hbWUpOwp9CmJyZWFrOwoKY2FzZSAncHEnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ebGlicHEgPT4gKD88Y29tcGlsZWQ+LispID0+ICg/PGxpbmtlZD4uKykkL2ltJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnBxJywgJG1hdGNoZXNbJ2xpbmtlZCddLCAnbGlicHEgZm9yICcuJG5hbWUpOwp9CmJyZWFrOwoKY2FzZSAncmRrYWZrYSc6CmlmICgkdGhpcy0+cnVudGltZS0+aGFzQ29uc3RhbnQoJ1JEX0tBRktBX1ZFUlNJT04nKSkgewoKCgoKCgoKCgokbGliUmRLYWZrYVZlcnNpb25JbnQgPSAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1JEX0tBRktBX1ZFUlNJT04nKTsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1saWJyZGthZmthJywgc3ByaW50ZignJWQuJWQuJWQnLCAoJGxpYlJkS2Fma2FWZXJzaW9uSW50ICYgMHg3RjAwMDAwMCkgPj4gMjQsICgkbGliUmRLYWZrYVZlcnNpb25JbnQgJiAweDAwRkYwMDAwKSA+PiAxNiwgKCRsaWJSZEthZmthVmVyc2lvbkludCAmIDB4MDAwMEZGMDApID4+IDgpLCAnbGlicmRrYWZrYSBmb3IgJy4kbmFtZSk7Cn0KYnJlYWs7CgpjYXNlICdsaWJzb2RpdW0nOgpjYXNlICdzb2RpdW0nOgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdTT0RJVU1fTElCUkFSWV9WRVJTSU9OJykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ2xpYnNvZGl1bScsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnU09ESVVNX0xJQlJBUllfVkVSU0lPTicpKTsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ2xpYnNvZGl1bScsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnU09ESVVNX0xJQlJBUllfVkVSU0lPTicpKTsKfQpicmVhazsKCmNhc2UgJ3NxbGl0ZTMnOgpjYXNlICdwZG9fc3FsaXRlJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgppZiAoUHJlZzo6aXNNYXRjaCgnL15TUUxpdGUgTGlicmFyeSA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictc3FsaXRlJywgJG1hdGNoZXNbJ3ZlcnNpb24nXSk7Cn0KYnJlYWs7CgpjYXNlICdzc2gyJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgppZiAoUHJlZzo6aXNNYXRjaCgnL15saWJzc2gyIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnNzaDInLCAkbWF0Y2hlc1sndmVyc2lvbiddKTsKfQpicmVhazsKCmNhc2UgJ3hzbCc6CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICdsaWJ4c2x0JywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdMSUJYU0xUX0RPVFRFRF9WRVJTSU9OJyksIG51bGwsIFsneHNsJ10pOwoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygneHNsJyk7CmlmIChQcmVnOjppc01hdGNoKCcvXmxpYnhzbHQgY29tcGlsZWQgYWdhaW5zdCBsaWJ4bWwgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICdsaWJ4c2x0LWxpYnhtbCcsICRtYXRjaGVzWyd2ZXJzaW9uJ10sICdsaWJ4bWwgdmVyc2lvbiBsaWJ4c2x0IGlzIGNvbXBpbGVkIGFnYWluc3QnKTsKfQpicmVhazsKCmNhc2UgJ3lhbWwnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCd5YW1sJyk7CgppZiAoUHJlZzo6aXNNYXRjaCgnL15MaWJZQU1MIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnlhbWwnLCAkbWF0Y2hlc1sndmVyc2lvbiddLCAnbGlieWFtbCB2ZXJzaW9uIG9mIHlhbWwnKTsKfQpicmVhazsKCmNhc2UgJ3ppcCc6CmlmICgkdGhpcy0+cnVudGltZS0+aGFzQ29uc3RhbnQoJ0xJQlpJUF9WRVJTSU9OJywgJ1ppcEFyY2hpdmUnKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnppcCcsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnTElCWklQX1ZFUlNJT04nLCAnWmlwQXJjaGl2ZScpLCBudWxsLCBbJ3ppcCddKTsKfQpicmVhazsKCmNhc2UgJ3psaWInOgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdaTElCX1ZFUlNJT04nKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZSwgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdaTElCX1ZFUlNJT04nKSk7CgoKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2goJy9eTGlua2VkIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpLCAkbWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUsICRtYXRjaGVzWyd2ZXJzaW9uJ10pOwp9CmJyZWFrOwoKZGVmYXVsdDoKYnJlYWs7Cn0KfQoKJGhodm1WZXJzaW9uID0gJHRoaXMtPmhodm1EZXRlY3Rvci0+Z2V0VmVyc2lvbigpOwppZiAoJGhodm1WZXJzaW9uKSB7CnRyeSB7CiRwcmV0dHlWZXJzaW9uID0gJGhodm1WZXJzaW9uOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CiRwcmV0dHlWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgnI14oW15+Ky1dKykuKiQjJywgJyQxJywgJGhodm1WZXJzaW9uKTsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKfQoKJGhodm0gPSBuZXcgQ29tcGxldGVQYWNrYWdlKCdoaHZtJywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJGhodm0tPnNldERlc2NyaXB0aW9uKCdUaGUgSEhWTSBSdW50aW1lICg2NGJpdCknKTsKJHRoaXMtPmFkZFBhY2thZ2UoJGhodm0pOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignRXhwZWN0ZWQgQ29tcGxldGVQYWNrYWdlIGJ1dCBnb3QgJy5nZXRfY2xhc3MoJHBhY2thZ2UpKTsKfQoKCmlmIChpc3NldCgkdGhpcy0+b3ZlcnJpZGVzWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewppZiAoJHRoaXMtPm92ZXJyaWRlc1skcGFja2FnZS0+Z2V0TmFtZSgpXVsndmVyc2lvbiddID09PSBmYWxzZSkgewokdGhpcy0+YWRkRGlzYWJsZWRQYWNrYWdlKCRwYWNrYWdlKTsKCnJldHVybjsKfQoKJG92ZXJyaWRlciA9ICR0aGlzLT5maW5kUGFja2FnZSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAnKicpOwppZiAoJHBhY2thZ2UtPmdldFZlcnNpb24oKSA9PT0gJG92ZXJyaWRlci0+Z2V0VmVyc2lvbigpKSB7CiRhY3R1YWxUZXh0ID0gJ3NhbWUgYXMgYWN0dWFsJzsKfSBlbHNlIHsKJGFjdHVhbFRleHQgPSAnYWN0dWFsOiAnLiRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0KaWYgKCRvdmVycmlkZXIgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UpIHsKJG92ZXJyaWRlci0+c2V0RGVzY3JpcHRpb24oJG92ZXJyaWRlci0+Z2V0RGVzY3JpcHRpb24oKS4nLCAnLiRhY3R1YWxUZXh0KTsKfQoKcmV0dXJuOwp9CgoKaWYgKGlzc2V0KCR0aGlzLT5vdmVycmlkZXNbJ3BocCddKSAmJiAwID09PSBzdHJwb3MoJHBhY2thZ2UtPmdldE5hbWUoKSwgJ3BocC0nKSkgewokb3ZlcnJpZGVyID0gJHRoaXMtPmFkZE92ZXJyaWRkZW5QYWNrYWdlKCR0aGlzLT5vdmVycmlkZXNbJ3BocCddLCAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpKTsKaWYgKCRwYWNrYWdlLT5nZXRWZXJzaW9uKCkgPT09ICRvdmVycmlkZXItPmdldFZlcnNpb24oKSkgewokYWN0dWFsVGV4dCA9ICdzYW1lIGFzIGFjdHVhbCc7Cn0gZWxzZSB7CiRhY3R1YWxUZXh0ID0gJ2FjdHVhbDogJy4kcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9CiRvdmVycmlkZXItPnNldERlc2NyaXB0aW9uKCRvdmVycmlkZXItPmdldERlc2NyaXB0aW9uKCkuJywgJy4kYWN0dWFsVGV4dCk7CgpyZXR1cm47Cn0KCnBhcmVudDo6YWRkUGFja2FnZSgkcGFja2FnZSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkT3ZlcnJpZGRlblBhY2thZ2UoYXJyYXkgJG92ZXJyaWRlLCA/c3RyaW5nICRuYW1lID0gbnVsbCk6IENvbXBsZXRlUGFja2FnZQp7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkb3ZlcnJpZGVbJ3ZlcnNpb24nXSk7CiRwYWNrYWdlID0gbmV3IENvbXBsZXRlUGFja2FnZSgkbmFtZSA/OiAkb3ZlcnJpZGVbJ25hbWUnXSwgJHZlcnNpb24sICRvdmVycmlkZVsndmVyc2lvbiddKTsKJHBhY2thZ2UtPnNldERlc2NyaXB0aW9uKCdQYWNrYWdlIG92ZXJyaWRkZW4gdmlhIGNvbmZpZy5wbGF0Zm9ybScpOwokcGFja2FnZS0+c2V0RXh0cmEoWydjb25maWcucGxhdGZvcm0nID0+IHRydWVdKTsKcGFyZW50OjphZGRQYWNrYWdlKCRwYWNrYWdlKTsKCmlmICgkcGFja2FnZS0+Z2V0TmFtZSgpID09PSAncGhwJykgewpzZWxmOjokbGFzdFNlZW5QbGF0Zm9ybVBocCA9IGltcGxvZGUoJy4nLCBhcnJheV9zbGljZShleHBsb2RlKCcuJywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSksIDAsIDMpKTsKfQoKcmV0dXJuICRwYWNrYWdlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGFkZERpc2FibGVkUGFja2FnZShDb21wbGV0ZVBhY2thZ2UgJHBhY2thZ2UpOiB2b2lkCnsKJHBhY2thZ2UtPnNldERlc2NyaXB0aW9uKCRwYWNrYWdlLT5nZXREZXNjcmlwdGlvbigpLicuIDx3YXJuaW5nPlBhY2thZ2UgZGlzYWJsZWQgdmlhIGNvbmZpZy5wbGF0Zm9ybTwvd2FybmluZz4nKTsKJHBhY2thZ2UtPnNldEV4dHJhKFsnY29uZmlnLnBsYXRmb3JtJyA9PiB0cnVlXSk7CgokdGhpcy0+ZGlzYWJsZWRQYWNrYWdlc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRwYWNrYWdlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFkZEV4dGVuc2lvbihzdHJpbmcgJG5hbWUsIHN0cmluZyAkcHJldHR5VmVyc2lvbik6IHZvaWQKewokZXh0cmFEZXNjcmlwdGlvbiA9IG51bGw7Cgp0cnkgewokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CiRleHRyYURlc2NyaXB0aW9uID0gJyAoYWN0dWFsIHZlcnNpb246ICcuJHByZXR0eVZlcnNpb24uJyknOwppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oXGQrXC5cZCtcLlxkKyg/OlwuXGQrKT8pfScsICRwcmV0dHlWZXJzaW9uLCAkbWF0Y2gpKSB7CiRwcmV0dHlWZXJzaW9uID0gJG1hdGNoWzFdOwp9IGVsc2UgewokcHJldHR5VmVyc2lvbiA9ICcwJzsKfQokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9CgokcGFja2FnZU5hbWUgPSAkdGhpcy0+YnVpbGRQYWNrYWdlTmFtZSgkbmFtZSk7CiRleHQgPSBuZXcgQ29tcGxldGVQYWNrYWdlKCRwYWNrYWdlTmFtZSwgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJGV4dC0+c2V0RGVzY3JpcHRpb24oJ1RoZSAnLiRuYW1lLicgUEhQIGV4dGVuc2lvbicuJGV4dHJhRGVzY3JpcHRpb24pOwokZXh0LT5zZXRUeXBlKCdwaHAtZXh0Jyk7CgppZiAoJG5hbWUgPT09ICd1dWlkJykgewokZXh0LT5zZXRSZXBsYWNlcyhbCidsaWItdXVpZCcgPT4gbmV3IExpbmsoJ2V4dC11dWlkJywgJ2xpYi11dWlkJywgbmV3IENvbnN0cmFpbnQoJz0nLCAkdmVyc2lvbiksIExpbms6OlRZUEVfUkVQTEFDRSwgJGV4dC0+Z2V0UHJldHR5VmVyc2lvbigpKSwKXSk7Cn0KCiR0aGlzLT5hZGRQYWNrYWdlKCRleHQpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkUGFja2FnZU5hbWUoc3RyaW5nICRuYW1lKTogc3RyaW5nCnsKcmV0dXJuICdleHQtJyAuIHN0cl9yZXBsYWNlKCcgJywgJy0nLCBzdHJ0b2xvd2VyKCRuYW1lKSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhZGRMaWJyYXJ5KGFycmF5ICYkbGlicmFyaWVzLCBzdHJpbmcgJG5hbWUsID9zdHJpbmcgJHByZXR0eVZlcnNpb24sID9zdHJpbmcgJGRlc2NyaXB0aW9uID0gbnVsbCwgYXJyYXkgJHJlcGxhY2VzID0gW10sIGFycmF5ICRwcm92aWRlcyA9IFtdKTogdm9pZAp7CmlmIChudWxsID09PSAkcHJldHR5VmVyc2lvbikgewpyZXR1cm47Cn0KdHJ5IHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewpyZXR1cm47Cn0KCgoKaWYgKGlzc2V0KCRsaWJyYXJpZXNbJ2xpYi0nLiRuYW1lXSkpIHsKcmV0dXJuOwp9CiRsaWJyYXJpZXNbJ2xpYi0nLiRuYW1lXSA9IHRydWU7CgppZiAoJGRlc2NyaXB0aW9uID09PSBudWxsKSB7CiRkZXNjcmlwdGlvbiA9ICdUaGUgJy4kbmFtZS4nIGxpYnJhcnknOwp9CgokbGliID0gbmV3IENvbXBsZXRlUGFja2FnZSgnbGliLScuJG5hbWUsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRsaWItPnNldERlc2NyaXB0aW9uKCRkZXNjcmlwdGlvbik7CgokcmVwbGFjZUxpbmtzID0gW107CmZvcmVhY2ggKCRyZXBsYWNlcyBhcyAkcmVwbGFjZSkgewokcmVwbGFjZSA9IHN0cnRvbG93ZXIoJHJlcGxhY2UpOwokcmVwbGFjZUxpbmtzWyRyZXBsYWNlXSA9IG5ldyBMaW5rKCdsaWItJy4kbmFtZSwgJ2xpYi0nLiRyZXBsYWNlLCBuZXcgQ29uc3RyYWludCgnPScsICR2ZXJzaW9uKSwgTGluazo6VFlQRV9SRVBMQUNFLCAkbGliLT5nZXRQcmV0dHlWZXJzaW9uKCkpOwp9CiRwcm92aWRlTGlua3MgPSBbXTsKZm9yZWFjaCAoJHByb3ZpZGVzIGFzICRwcm92aWRlKSB7CiRwcm92aWRlID0gc3RydG9sb3dlcigkcHJvdmlkZSk7CiRwcm92aWRlTGlua3NbJHByb3ZpZGVdID0gbmV3IExpbmsoJ2xpYi0nLiRuYW1lLCAnbGliLScuJHByb3ZpZGUsIG5ldyBDb25zdHJhaW50KCc9JywgJHZlcnNpb24pLCBMaW5rOjpUWVBFX1BST1ZJREUsICRsaWItPmdldFByZXR0eVZlcnNpb24oKSk7Cn0KJGxpYi0+c2V0UmVwbGFjZXMoJHJlcGxhY2VMaW5rcyk7CiRsaWItPnNldFByb3ZpZGVzKCRwcm92aWRlTGlua3MpOwoKJHRoaXMtPmFkZFBhY2thZ2UoJGxpYik7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNQbGF0Zm9ybVBhY2thZ2Uoc3RyaW5nICRuYW1lKTogYm9vbAp7CnN0YXRpYyAkY2FjaGUgPSBbXTsKCmlmIChpc3NldCgkY2FjaGVbJG5hbWVdKSkgewpyZXR1cm4gJGNhY2hlWyRuYW1lXTsKfQoKcmV0dXJuICRjYWNoZVskbmFtZV0gPSBQcmVnOjppc01hdGNoKFBsYXRmb3JtUmVwb3NpdG9yeTo6UExBVEZPUk1fUEFDS0FHRV9SRUdFWCwgJG5hbWUpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFBsYXRmb3JtUGhwVmVyc2lvbigpOiA/c3RyaW5nCnsKcmV0dXJuIHNlbGY6OiRsYXN0U2VlblBsYXRmb3JtUGhwOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2VhcmNoKHN0cmluZyAkcXVlcnksIGludCAkbW9kZSA9IDAsID9zdHJpbmcgJHR5cGUgPSBudWxsKTogYXJyYXkKewoKaWYgKCRtb2RlID09PSBzZWxmOjpTRUFSQ0hfVkVORE9SKSB7CnJldHVybiBbXTsKfQoKcmV0dXJuIHBhcmVudDo6c2VhcmNoKCRxdWVyeSwgJG1vZGUsICR0eXBlKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwoKCgoKY2xhc3MgUmVwb3NpdG9yeUZhY3RvcnkKewoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmcoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICRyZXBvc2l0b3J5LCBib29sICRhbGxvd0ZpbGVzeXN0ZW0gPSBmYWxzZSkKewppZiAoMCA9PT0gc3RycG9zKCRyZXBvc2l0b3J5LCAnaHR0cCcpKSB7CiRyZXBvQ29uZmlnID0gWyd0eXBlJyA9PiAnY29tcG9zZXInLCAndXJsJyA9PiAkcmVwb3NpdG9yeV07Cn0gZWxzZWlmICgianNvbiIgPT09IHBhdGhpbmZvKCRyZXBvc2l0b3J5LCBQQVRISU5GT19FWFRFTlNJT04pKSB7CiRqc29uID0gbmV3IEpzb25GaWxlKCRyZXBvc2l0b3J5LCBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkaW8sICRjb25maWcpKTsKJGRhdGEgPSAkanNvbi0+cmVhZCgpOwppZiAoIWVtcHR5KCRkYXRhWydwYWNrYWdlcyddKSB8fCAhZW1wdHkoJGRhdGFbJ2luY2x1ZGVzJ10pIHx8ICFlbXB0eSgkZGF0YVsncHJvdmlkZXItaW5jbHVkZXMnXSkpIHsKJHJlcG9Db25maWcgPSBbJ3R5cGUnID0+ICdjb21wb3NlcicsICd1cmwnID0+ICdmaWxlOi8vJyAuIHN0cnRyKHJlYWxwYXRoKCRyZXBvc2l0b3J5KSwgJ1xcJywgJy8nKV07Cn0gZWxzZWlmICgkYWxsb3dGaWxlc3lzdGVtKSB7CiRyZXBvQ29uZmlnID0gWyd0eXBlJyA9PiAnZmlsZXN5c3RlbScsICdqc29uJyA9PiAkanNvbl07Cn0gZWxzZSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJlcG9zaXRvcnkgVVJMICgkcmVwb3NpdG9yeSkgZ2l2ZW4uIFRoaXMgZmlsZSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgY29tcG9zZXIgcmVwb3NpdG9yeS4iKTsKfQp9IGVsc2VpZiAoc3RycG9zKCRyZXBvc2l0b3J5LCAneycpID09PSAwKSB7CgokcmVwb0NvbmZpZyA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHJlcG9zaXRvcnkpOwp9IGVsc2Ugewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCByZXBvc2l0b3J5IHVybCAoJHJlcG9zaXRvcnkpIGdpdmVuLiBIYXMgdG8gYmUgYSAuanNvbiBmaWxlLCBhbiBodHRwIHVybCBvciBhIEpTT04gb2JqZWN0LiIpOwp9CgpyZXR1cm4gJHJlcG9Db25maWc7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVN0cmluZyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHJlcG9zaXRvcnksIGJvb2wgJGFsbG93RmlsZXN5c3RlbSA9IGZhbHNlLCA/UmVwb3NpdG9yeU1hbmFnZXIgJHJtID0gbnVsbCk6IFJlcG9zaXRvcnlJbnRlcmZhY2UKewokcmVwb0NvbmZpZyA9IHN0YXRpYzo6Y29uZmlnRnJvbVN0cmluZygkaW8sICRjb25maWcsICRyZXBvc2l0b3J5LCAkYWxsb3dGaWxlc3lzdGVtKTsKCnJldHVybiBzdGF0aWM6OmNyZWF0ZVJlcG8oJGlvLCAkY29uZmlnLCAkcmVwb0NvbmZpZywgJHJtKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVSZXBvKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIGFycmF5ICRyZXBvQ29uZmlnLCA/UmVwb3NpdG9yeU1hbmFnZXIgJHJtID0gbnVsbCk6IFJlcG9zaXRvcnlJbnRlcmZhY2UKewppZiAoISRybSkgewpAdHJpZ2dlcl9lcnJvcignTm90IHBhc3NpbmcgYSByZXBvc2l0b3J5IG1hbmFnZXIgd2hlbiBjYWxsaW5nIGNyZWF0ZVJlcG8gaXMgZGVwcmVjYXRlZCBzaW5jZSBDb21wb3NlciAyLjMuNicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKJHJtID0gc3RhdGljOjptYW5hZ2VyKCRpbywgJGNvbmZpZyk7Cn0KJHJlcG9zID0gc2VsZjo6Y3JlYXRlUmVwb3MoJHJtLCBbJHJlcG9Db25maWddKTsKCnJldHVybiByZXNldCgkcmVwb3MpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlZmF1bHRSZXBvcyg/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCwgP0NvbmZpZyAkY29uZmlnID0gbnVsbCwgP1JlcG9zaXRvcnlNYW5hZ2VyICRybSA9IG51bGwpOiBhcnJheQp7CmlmIChudWxsID09PSAkcm0pIHsKQHRyaWdnZXJfZXJyb3IoJ05vdCBwYXNzaW5nIGEgcmVwb3NpdG9yeSBtYW5hZ2VyIHdoZW4gY2FsbGluZyBkZWZhdWx0UmVwb3MgaXMgZGVwcmVjYXRlZCBzaW5jZSBDb21wb3NlciAyLjMuNiwgdXNlIGRlZmF1bHRSZXBvc1dpdGhEZWZhdWx0TWFuYWdlcigpIGluc3RlYWQgaWYgeW91IGNhbm5vdCBnZXQgYSBtYW5hZ2VyLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKfQoKaWYgKG51bGwgPT09ICRjb25maWcpIHsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygkaW8pOwp9CmlmIChudWxsICE9PSAkaW8pIHsKJGlvLT5sb2FkQ29uZmlndXJhdGlvbigkY29uZmlnKTsKfQppZiAobnVsbCA9PT0gJHJtKSB7CmlmIChudWxsID09PSAkaW8pIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoaXMgZnVuY3Rpb24gcmVxdWlyZXMgZWl0aGVyIGFuIElPSW50ZXJmYWNlIG9yIGEgUmVwb3NpdG9yeU1hbmFnZXInKTsKfQokcm0gPSBzdGF0aWM6Om1hbmFnZXIoJGlvLCAkY29uZmlnLCBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkaW8sICRjb25maWcpKTsKfQoKcmV0dXJuIHNlbGY6OmNyZWF0ZVJlcG9zKCRybSwgJGNvbmZpZy0+Z2V0UmVwb3NpdG9yaWVzKCkpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYW5hZ2VyKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsID9IdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIgPSBudWxsLCA/RXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIgPSBudWxsLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCk6IFJlcG9zaXRvcnlNYW5hZ2VyCnsKaWYgKCRodHRwRG93bmxvYWRlciA9PT0gbnVsbCkgewokaHR0cERvd25sb2FkZXIgPSBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkaW8sICRjb25maWcpOwp9CmlmICgkcHJvY2VzcyA9PT0gbnVsbCkgewokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHByb2Nlc3MtPmVuYWJsZUFzeW5jKCk7Cn0KCiRybSA9IG5ldyBSZXBvc2l0b3J5TWFuYWdlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJGV2ZW50RGlzcGF0Y2hlciwgJHByb2Nlc3MpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygnY29tcG9zZXInLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NlclJlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ3ZjcycsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ3BhY2thZ2UnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxQYWNrYWdlUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygncGVhcicsICdDb21wb3NlclxSZXBvc2l0b3J5XFBlYXJSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdnaXQnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdiaXRidWNrZXQnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdnaXQtYml0YnVja2V0JywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygnZ2l0aHViJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygnZ2l0bGFiJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygnc3ZuJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygnZm9zc2lsJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygncGVyZm9yY2UnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdoZycsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2FydGlmYWN0JywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcQXJ0aWZhY3RSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdwYXRoJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcUGF0aFJlcG9zaXRvcnknKTsKCnJldHVybiAkcm07Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVmYXVsdFJlcG9zV2l0aERlZmF1bHRNYW5hZ2VyKElPSW50ZXJmYWNlICRpbyk6IGFycmF5CnsKJG1hbmFnZXIgPSBSZXBvc2l0b3J5RmFjdG9yeTo6bWFuYWdlcigkaW8sICRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoJGlvKSk7CiRpby0+bG9hZENvbmZpZ3VyYXRpb24oJGNvbmZpZyk7CgpyZXR1cm4gUmVwb3NpdG9yeUZhY3Rvcnk6OmRlZmF1bHRSZXBvcygkaW8sICRjb25maWcsICRtYW5hZ2VyKTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVSZXBvcyhSZXBvc2l0b3J5TWFuYWdlciAkcm0sIGFycmF5ICRyZXBvQ29uZmlncyk6IGFycmF5CnsKJHJlcG9zID0gW107Cgpmb3JlYWNoICgkcmVwb0NvbmZpZ3MgYXMgJGluZGV4ID0+ICRyZXBvKSB7CmlmIChpc19zdHJpbmcoJHJlcG8pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCcicmVwb3NpdG9yaWVzIiBzaG91bGQgYmUgYW4gYXJyYXkgb2YgcmVwb3NpdG9yeSBkZWZpbml0aW9ucywgb25seSBhIHNpbmdsZSByZXBvc2l0b3J5IHdhcyBnaXZlbicpOwp9CmlmICghaXNfYXJyYXkoJHJlcG8pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdSZXBvc2l0b3J5ICInLiRpbmRleC4nIiAoJy5qc29uX2VuY29kZSgkcmVwbykuJykgc2hvdWxkIGJlIGFuIGFycmF5LCAnLmdldHR5cGUoJHJlcG8pLicgZ2l2ZW4nKTsKfQppZiAoIWlzc2V0KCRyZXBvWyd0eXBlJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdSZXBvc2l0b3J5ICInLiRpbmRleC4nIiAoJy5qc29uX2VuY29kZSgkcmVwbykuJykgbXVzdCBoYXZlIGEgdHlwZSBkZWZpbmVkJyk7Cn0KCiRuYW1lID0gc2VsZjo6Z2VuZXJhdGVSZXBvc2l0b3J5TmFtZSgkaW5kZXgsICRyZXBvLCAkcmVwb3MpOwppZiAoJHJlcG9bJ3R5cGUnXSA9PT0gJ2ZpbGVzeXN0ZW0nKSB7CiRyZXBvc1skbmFtZV0gPSBuZXcgRmlsZXN5c3RlbVJlcG9zaXRvcnkoJHJlcG9bJ2pzb24nXSk7Cn0gZWxzZSB7CiRyZXBvc1skbmFtZV0gPSAkcm0tPmNyZWF0ZVJlcG9zaXRvcnkoJHJlcG9bJ3R5cGUnXSwgJHJlcG8sIChzdHJpbmcpICRpbmRleCk7Cn0KfQoKcmV0dXJuICRyZXBvczsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlUmVwb3NpdG9yeU5hbWUoJGluZGV4LCBhcnJheSAkcmVwbywgYXJyYXkgJGV4aXN0aW5nUmVwb3MpOiBzdHJpbmcKewokbmFtZSA9IGlzX2ludCgkaW5kZXgpICYmIGlzc2V0KCRyZXBvWyd1cmwnXSkgPyBQcmVnOjpyZXBsYWNlKCd7Xmh0dHBzPzovL31pJywgJycsICRyZXBvWyd1cmwnXSkgOiAoc3RyaW5nKSAkaW5kZXg7CndoaWxlIChpc3NldCgkZXhpc3RpbmdSZXBvc1skbmFtZV0pKSB7CiRuYW1lIC49ICcyJzsKfQoKcmV0dXJuICRuYW1lOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CgoKCgoKCgoKaW50ZXJmYWNlIFJlcG9zaXRvcnlJbnRlcmZhY2UgZXh0ZW5kcyBcQ291bnRhYmxlCnsKcHVibGljIGNvbnN0IFNFQVJDSF9GVUxMVEVYVCA9IDA7CnB1YmxpYyBjb25zdCBTRUFSQ0hfTkFNRSA9IDE7CnB1YmxpYyBjb25zdCBTRUFSQ0hfVkVORE9SID0gMjsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlKHN0cmluZyAkbmFtZSwgJGNvbnN0cmFpbnQpOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2VzKHN0cmluZyAkbmFtZSwgJGNvbnN0cmFpbnQgPSBudWxsKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VzKCk7CgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lTWFwLCBhcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGFycmF5ICRhbHJlYWR5TG9hZGVkID0gW10pOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWFyY2goc3RyaW5nICRxdWVyeSwgaW50ICRtb2RlID0gMCwgP3N0cmluZyAkdHlwZSA9IG51bGwpOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcnMoc3RyaW5nICRwYWNrYWdlTmFtZSk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwoKCgoKCgoKCmNsYXNzIFJlcG9zaXRvcnlNYW5hZ2VyCnsKCnByaXZhdGUgJGxvY2FsUmVwb3NpdG9yeTsKCnByaXZhdGUgJHJlcG9zaXRvcmllcyA9IFtdOwoKcHJpdmF0ZSAkcmVwb3NpdG9yeUNsYXNzZXMgPSBbXTsKCnByaXZhdGUgJGlvOwoKcHJpdmF0ZSAkY29uZmlnOwoKcHJpdmF0ZSAkaHR0cERvd25sb2FkZXI7Cgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7Cgpwcml2YXRlICRwcm9jZXNzOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciwgP0V2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyID0gbnVsbCwgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZShzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50KTogP1BhY2thZ2VJbnRlcmZhY2UKewpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgppZiAoJHBhY2thZ2UgPSAkcmVwb3NpdG9yeS0+ZmluZFBhY2thZ2UoJG5hbWUsICRjb25zdHJhaW50KSkgewpyZXR1cm4gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlcyhzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50KTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5nZXRSZXBvc2l0b3JpZXMoKSBhcyAkcmVwb3NpdG9yeSkgewokcGFja2FnZXMgPSBhcnJheV9tZXJnZSgkcGFja2FnZXMsICRyZXBvc2l0b3J5LT5maW5kUGFja2FnZXMoJG5hbWUsICRjb25zdHJhaW50KSk7Cn0KCnJldHVybiAkcGFja2FnZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwb3NpdG9yeSk6IHZvaWQKewokdGhpcy0+cmVwb3NpdG9yaWVzW10gPSAkcmVwb3NpdG9yeTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwZW5kUmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KTogdm9pZAp7CmFycmF5X3Vuc2hpZnQoJHRoaXMtPnJlcG9zaXRvcmllcywgJHJlcG9zaXRvcnkpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVSZXBvc2l0b3J5KHN0cmluZyAkdHlwZSwgYXJyYXkgJGNvbmZpZywgP3N0cmluZyAkbmFtZSA9IG51bGwpOiBSZXBvc2l0b3J5SW50ZXJmYWNlCnsKaWYgKCFpc3NldCgkdGhpcy0+cmVwb3NpdG9yeUNsYXNzZXNbJHR5cGVdKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUmVwb3NpdG9yeSB0eXBlIGlzIG5vdCByZWdpc3RlcmVkOiAnLiR0eXBlKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ3BhY2thZ2lzdCddKSAmJiBmYWxzZSA9PT0gJGNvbmZpZ1sncGFja2FnaXN0J10pIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5SZXBvc2l0b3J5ICInLiRuYW1lLiciICgnLmpzb25fZW5jb2RlKCRjb25maWcpLicpIGhhcyBhIHBhY2thZ2lzdCBrZXkgd2hpY2ggc2hvdWxkIGJlIGluIGl0cyBvd24gcmVwb3NpdG9yeSBkZWZpbml0aW9uPC93YXJuaW5nPicpOwp9CgokY2xhc3MgPSAkdGhpcy0+cmVwb3NpdG9yeUNsYXNzZXNbJHR5cGVdOwoKaWYgKGlzc2V0KCRjb25maWdbJ29ubHknXSkgfHwgaXNzZXQoJGNvbmZpZ1snZXhjbHVkZSddKSB8fCBpc3NldCgkY29uZmlnWydjYW5vbmljYWwnXSkpIHsKJGZpbHRlckNvbmZpZyA9ICRjb25maWc7CnVuc2V0KCRjb25maWdbJ29ubHknXSwgJGNvbmZpZ1snZXhjbHVkZSddLCAkY29uZmlnWydjYW5vbmljYWwnXSk7Cn0KCiRyZXBvc2l0b3J5ID0gbmV3ICRjbGFzcygkY29uZmlnLCAkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5odHRwRG93bmxvYWRlciwgJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciwgJHRoaXMtPnByb2Nlc3MpOwoKaWYgKGlzc2V0KCRmaWx0ZXJDb25maWcpKSB7CiRyZXBvc2l0b3J5ID0gbmV3IEZpbHRlclJlcG9zaXRvcnkoJHJlcG9zaXRvcnksICRmaWx0ZXJDb25maWcpOwp9CgpyZXR1cm4gJHJlcG9zaXRvcnk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBvc2l0b3J5Q2xhc3Moc3RyaW5nICR0eXBlLCAkY2xhc3MpOiB2b2lkCnsKJHRoaXMtPnJlcG9zaXRvcnlDbGFzc2VzWyR0eXBlXSA9ICRjbGFzczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yaWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3JpZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldExvY2FsUmVwb3NpdG9yeShJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KTogdm9pZAp7CiR0aGlzLT5sb2NhbFJlcG9zaXRvcnkgPSAkcmVwb3NpdG9yeTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsUmVwb3NpdG9yeSgpOiBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5sb2NhbFJlcG9zaXRvcnk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKY2xhc3MgUmVwb3NpdG9yeVNlY3VyaXR5RXhjZXB0aW9uIGV4dGVuZHMgXEV4Y2VwdGlvbgp7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFBvb2xPcHRpbWl6ZXI7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUG9vbDsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxQb29sQnVpbGRlcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxSZXF1ZXN0Owp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFNlY3VyaXR5QWR2aXNvcnk7CnVzZSBDb21wb3NlclxBZHZpc29yeVxQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cTnVsbElPOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZUFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cU3RhYmlsaXR5RmlsdGVyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTXVsdGlDb25zdHJhaW50OwoKCgoKCgpjbGFzcyBSZXBvc2l0b3J5U2V0CnsKCgoKcHVibGljIGNvbnN0IEFMTE9XX1VOQUNDRVBUQUJMRV9TVEFCSUxJVElFUyA9IDE7CgoKCnB1YmxpYyBjb25zdCBBTExPV19TSEFET1dFRF9SRVBPU0lUT1JJRVMgPSAyOwoKCgoKCnByaXZhdGUgJHJvb3RBbGlhc2VzOwoKCgoKCnByaXZhdGUgJHJvb3RSZWZlcmVuY2VzOwoKCnByaXZhdGUgJHJlcG9zaXRvcmllcyA9IFtdOwoKCgoKCnByaXZhdGUgJGFjY2VwdGFibGVTdGFiaWxpdGllczsKCgoKCgpwcml2YXRlICRzdGFiaWxpdHlGbGFnczsKCgoKCgpwcml2YXRlICRyb290UmVxdWlyZXM7CgoKCgpwcml2YXRlICR0ZW1wb3JhcnlDb25zdHJhaW50czsKCgpwcml2YXRlICRsb2NrZWQgPSBmYWxzZTsKCnByaXZhdGUgJGFsbG93SW5zdGFsbGVkUmVwb3NpdG9yaWVzID0gZmFsc2U7CgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWluaW11bVN0YWJpbGl0eSA9ICdzdGFibGUnLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MgPSBbXSwgYXJyYXkgJHJvb3RBbGlhc2VzID0gW10sIGFycmF5ICRyb290UmVmZXJlbmNlcyA9IFtdLCBhcnJheSAkcm9vdFJlcXVpcmVzID0gW10sIGFycmF5ICR0ZW1wb3JhcnlDb25zdHJhaW50cyA9IFtdKQp7CiR0aGlzLT5yb290QWxpYXNlcyA9IHNlbGY6OmdldFJvb3RBbGlhc2VzUGVyUGFja2FnZSgkcm9vdEFsaWFzZXMpOwokdGhpcy0+cm9vdFJlZmVyZW5jZXMgPSAkcm9vdFJlZmVyZW5jZXM7CgokdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzID0gW107CmZvcmVhY2ggKEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFUyBhcyAkc3RhYmlsaXR5ID0+ICR2YWx1ZSkgewppZiAoJHZhbHVlIDw9IEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFU1skbWluaW11bVN0YWJpbGl0eV0pIHsKJHRoaXMtPmFjY2VwdGFibGVTdGFiaWxpdGllc1skc3RhYmlsaXR5XSA9ICR2YWx1ZTsKfQp9CiR0aGlzLT5zdGFiaWxpdHlGbGFncyA9ICRzdGFiaWxpdHlGbGFnczsKJHRoaXMtPnJvb3RSZXF1aXJlcyA9ICRyb290UmVxdWlyZXM7CmZvcmVhY2ggKCRyb290UmVxdWlyZXMgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5hbWUpKSB7CnVuc2V0KCR0aGlzLT5yb290UmVxdWlyZXNbJG5hbWVdKTsKfQp9CgokdGhpcy0+dGVtcG9yYXJ5Q29uc3RyYWludHMgPSAkdGVtcG9yYXJ5Q29uc3RyYWludHM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBhbGxvd0luc3RhbGxlZFJlcG9zaXRvcmllcyhib29sICRhbGxvdyA9IHRydWUpOiB2b2lkCnsKJHRoaXMtPmFsbG93SW5zdGFsbGVkUmVwb3NpdG9yaWVzID0gJGFsbG93Owp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RSZXF1aXJlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cm9vdFJlcXVpcmVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGVtcG9yYXJ5Q29uc3RyYWludHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8pOiB2b2lkCnsKaWYgKCR0aGlzLT5sb2NrZWQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJQb29sIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBmcm9tIHRoaXMgcmVwb3NpdG9yeSBzZXQsIGl0IGNhbm5vdCBiZSBtb2RpZmllZCBhbnltb3JlLiIpOwp9CgppZiAoJHJlcG8gaW5zdGFuY2VvZiBDb21wb3NpdGVSZXBvc2l0b3J5KSB7CiRyZXBvcyA9ICRyZXBvLT5nZXRSZXBvc2l0b3JpZXMoKTsKfSBlbHNlIHsKJHJlcG9zID0gWyRyZXBvXTsKfQoKZm9yZWFjaCAoJHJlcG9zIGFzICRyZXBvKSB7CiR0aGlzLT5yZXBvc2l0b3JpZXNbXSA9ICRyZXBvOwp9Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlcyhzdHJpbmcgJG5hbWUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCwgaW50ICRmbGFncyA9IDApOiBhcnJheQp7CiRpZ25vcmVTdGFiaWxpdHkgPSAoJGZsYWdzICYgc2VsZjo6QUxMT1dfVU5BQ0NFUFRBQkxFX1NUQUJJTElUSUVTKSAhPT0gMDsKJGxvYWRGcm9tQWxsUmVwb3MgPSAoJGZsYWdzICYgc2VsZjo6QUxMT1dfU0hBRE9XRURfUkVQT1NJVE9SSUVTKSAhPT0gMDsKCiRwYWNrYWdlcyA9IFtdOwppZiAoJGxvYWRGcm9tQWxsUmVwb3MpIHsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewokcGFja2FnZXNbXSA9ICRyZXBvc2l0b3J5LT5maW5kUGFja2FnZXMoJG5hbWUsICRjb25zdHJhaW50KSA/OiBbXTsKfQp9IGVsc2Ugewpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CiRyZXN1bHQgPSAkcmVwb3NpdG9yeS0+bG9hZFBhY2thZ2VzKFskbmFtZSA9PiAkY29uc3RyYWludF0sICRpZ25vcmVTdGFiaWxpdHkgPyBCYXNlUGFja2FnZTo6U1RBQklMSVRJRVMgOiAkdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkaWdub3JlU3RhYmlsaXR5ID8gW10gOiAkdGhpcy0+c3RhYmlsaXR5RmxhZ3MpOwoKJHBhY2thZ2VzW10gPSAkcmVzdWx0WydwYWNrYWdlcyddOwpmb3JlYWNoICgkcmVzdWx0WyduYW1lc0ZvdW5kJ10gYXMgJG5hbWVGb3VuZCkgewoKaWYgKCRuYW1lID09PSAkbmFtZUZvdW5kKSB7CmJyZWFrIDI7Cn0KfQp9Cn0KCiRjYW5kaWRhdGVzID0gJHBhY2thZ2VzID8gYXJyYXlfbWVyZ2UoLi4uJHBhY2thZ2VzKSA6IFtdOwoKCmlmICgkaWdub3JlU3RhYmlsaXR5IHx8ICEkbG9hZEZyb21BbGxSZXBvcykgewpyZXR1cm4gJGNhbmRpZGF0ZXM7Cn0KCiRyZXN1bHQgPSBbXTsKZm9yZWFjaCAoJGNhbmRpZGF0ZXMgYXMgJGNhbmRpZGF0ZSkgewppZiAoJHRoaXMtPmlzUGFja2FnZUFjY2VwdGFibGUoJGNhbmRpZGF0ZS0+Z2V0TmFtZXMoKSwgJGNhbmRpZGF0ZS0+Z2V0U3RhYmlsaXR5KCkpKSB7CiRyZXN1bHRbXSA9ICRjYW5kaWRhdGU7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBZHZpc29yaWVzKGFycmF5ICRwYWNrYWdlTmFtZXMsIGJvb2wgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgPSBmYWxzZSk6IGFycmF5CnsKJG1hcCA9IFtdOwpmb3JlYWNoICgkcGFja2FnZU5hbWVzIGFzICRuYW1lKSB7CiRtYXBbJG5hbWVdID0gbmV3IE1hdGNoQWxsQ29uc3RyYWludCgpOwp9CgpyZXR1cm4gJHRoaXMtPmdldFNlY3VyaXR5QWR2aXNvcmllc0ZvckNvbnN0cmFpbnRzKCRtYXAsICRhbGxvd1BhcnRpYWxBZHZpc29yaWVzKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNYXRjaGluZ1NlY3VyaXR5QWR2aXNvcmllcyhhcnJheSAkcGFja2FnZXMsIGJvb2wgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgPSBmYWxzZSk6IGFycmF5CnsKJG1hcCA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGFja2FnZS0+aXNSb290UGFja2FnZUFsaWFzKCkpIHsKY29udGludWU7Cn0KaWYgKGlzc2V0KCRtYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiRtYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSBuZXcgTXVsdGlDb25zdHJhaW50KFtuZXcgQ29uc3RyYWludCgnPScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpLCAkbWFwWyRwYWNrYWdlLT5nZXROYW1lKCldXSwgZmFsc2UpOwp9IGVsc2UgewokbWFwWyRwYWNrYWdlLT5nZXROYW1lKCldID0gbmV3IENvbnN0cmFpbnQoJz0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKfQp9CgpyZXR1cm4gJHRoaXMtPmdldFNlY3VyaXR5QWR2aXNvcmllc0ZvckNvbnN0cmFpbnRzKCRtYXAsICRhbGxvd1BhcnRpYWxBZHZpc29yaWVzKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBZHZpc29yaWVzRm9yQ29uc3RyYWludHMoYXJyYXkgJHBhY2thZ2VDb25zdHJhaW50TWFwLCBib29sICRhbGxvd1BhcnRpYWxBZHZpc29yaWVzKTogYXJyYXkKewokcmVwb0Fkdmlzb3JpZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewppZiAoISRyZXBvc2l0b3J5IGluc3RhbmNlb2YgQWR2aXNvcnlQcm92aWRlckludGVyZmFjZSB8fCAhJHJlcG9zaXRvcnktPmhhc1NlY3VyaXR5QWR2aXNvcmllcygpKSB7CmNvbnRpbnVlOwp9CgokcmVwb0Fkdmlzb3JpZXNbXSA9ICRyZXBvc2l0b3J5LT5nZXRTZWN1cml0eUFkdmlzb3JpZXMoJHBhY2thZ2VDb25zdHJhaW50TWFwLCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcylbJ2Fkdmlzb3JpZXMnXTsKfQoKJGFkdmlzb3JpZXMgPSBhcnJheV9tZXJnZV9yZWN1cnNpdmUoW10sIC4uLiRyZXBvQWR2aXNvcmllcyk7Cmtzb3J0KCRhZHZpc29yaWVzKTsKCnJldHVybiAkYWR2aXNvcmllczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcnMoc3RyaW5nICRwYWNrYWdlTmFtZSk6IGFycmF5CnsKJHByb3ZpZGVycyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CmlmICgkcmVwb1Byb3ZpZGVycyA9ICRyZXBvc2l0b3J5LT5nZXRQcm92aWRlcnMoJHBhY2thZ2VOYW1lKSkgewokcHJvdmlkZXJzID0gYXJyYXlfbWVyZ2UoJHByb3ZpZGVycywgJHJlcG9Qcm92aWRlcnMpOwp9Cn0KCnJldHVybiAkcHJvdmlkZXJzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQYWNrYWdlQWNjZXB0YWJsZShhcnJheSAkbmFtZXMsIHN0cmluZyAkc3RhYmlsaXR5KTogYm9vbAp7CnJldHVybiBTdGFiaWxpdHlGaWx0ZXI6OmlzUGFja2FnZUFjY2VwdGFibGUoJHRoaXMtPmFjY2VwdGFibGVTdGFiaWxpdGllcywgJHRoaXMtPnN0YWJpbGl0eUZsYWdzLCAkbmFtZXMsICRzdGFiaWxpdHkpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlUG9vbChSZXF1ZXN0ICRyZXF1ZXN0LCBJT0ludGVyZmFjZSAkaW8sID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwsID9Qb29sT3B0aW1pemVyICRwb29sT3B0aW1pemVyID0gbnVsbCwgYXJyYXkgJGlnbm9yZWRUeXBlcyA9IFtdLCA/YXJyYXkgJGFsbG93ZWRUeXBlcyA9IG51bGwpOiBQb29sCnsKJHBvb2xCdWlsZGVyID0gbmV3IFBvb2xCdWlsZGVyKCR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXMsICR0aGlzLT5zdGFiaWxpdHlGbGFncywgJHRoaXMtPnJvb3RBbGlhc2VzLCAkdGhpcy0+cm9vdFJlZmVyZW5jZXMsICRpbywgJGV2ZW50RGlzcGF0Y2hlciwgJHBvb2xPcHRpbWl6ZXIsICR0aGlzLT50ZW1wb3JhcnlDb25zdHJhaW50cyk7CiRwb29sQnVpbGRlci0+c2V0SWdub3JlZFR5cGVzKCRpZ25vcmVkVHlwZXMpOwokcG9vbEJ1aWxkZXItPnNldEFsbG93ZWRUeXBlcygkYWxsb3dlZFR5cGVzKTsKCmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG8pIHsKaWYgKCgkcmVwbyBpbnN0YW5jZW9mIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgfHwgJHJlcG8gaW5zdGFuY2VvZiBJbnN0YWxsZWRSZXBvc2l0b3J5KSAmJiAhJHRoaXMtPmFsbG93SW5zdGFsbGVkUmVwb3NpdG9yaWVzKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1RoZSBwb29sIGNhbiBub3QgYWNjZXB0IHBhY2thZ2VzIGZyb20gYW4gaW5zdGFsbGVkIHJlcG9zaXRvcnknKTsKfQp9CgokdGhpcy0+bG9ja2VkID0gdHJ1ZTsKCnJldHVybiAkcG9vbEJ1aWxkZXItPmJ1aWxkUG9vbCgkdGhpcy0+cmVwb3NpdG9yaWVzLCAkcmVxdWVzdCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVQb29sV2l0aEFsbFBhY2thZ2VzKCk6IFBvb2wKewpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvKSB7CmlmICgoJHJlcG8gaW5zdGFuY2VvZiBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlIHx8ICRyZXBvIGluc3RhbmNlb2YgSW5zdGFsbGVkUmVwb3NpdG9yeSkgJiYgISR0aGlzLT5hbGxvd0luc3RhbGxlZFJlcG9zaXRvcmllcykgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdUaGUgcG9vbCBjYW4gbm90IGFjY2VwdCBwYWNrYWdlcyBmcm9tIGFuIGluc3RhbGxlZCByZXBvc2l0b3J5Jyk7Cn0KfQoKJHRoaXMtPmxvY2tlZCA9IHRydWU7CgokcGFja2FnZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewpmb3JlYWNoICgkcmVwb3NpdG9yeS0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokcGFja2FnZXNbXSA9ICRwYWNrYWdlOwoKaWYgKGlzc2V0KCR0aGlzLT5yb290QWxpYXNlc1skcGFja2FnZS0+Z2V0TmFtZSgpXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXSkpIHsKJGFsaWFzID0gJHRoaXMtPnJvb3RBbGlhc2VzWyRwYWNrYWdlLT5nZXROYW1lKCldWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldOwp3aGlsZSAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZSkgewokYWxpYXNQYWNrYWdlID0gbmV3IENvbXBsZXRlQWxpYXNQYWNrYWdlKCRwYWNrYWdlLCAkYWxpYXNbJ2FsaWFzX25vcm1hbGl6ZWQnXSwgJGFsaWFzWydhbGlhcyddKTsKfSBlbHNlIHsKJGFsaWFzUGFja2FnZSA9IG5ldyBBbGlhc1BhY2thZ2UoJHBhY2thZ2UsICRhbGlhc1snYWxpYXNfbm9ybWFsaXplZCddLCAkYWxpYXNbJ2FsaWFzJ10pOwp9CiRhbGlhc1BhY2thZ2UtPnNldFJvb3RQYWNrYWdlQWxpYXModHJ1ZSk7CiRwYWNrYWdlc1tdID0gJGFsaWFzUGFja2FnZTsKfQp9Cn0KCnJldHVybiBuZXcgUG9vbCgkcGFja2FnZXMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlUG9vbEZvclBhY2thZ2Uoc3RyaW5nICRwYWNrYWdlTmFtZSwgP0xvY2tBcnJheVJlcG9zaXRvcnkgJGxvY2tlZFJlcG8gPSBudWxsKTogUG9vbAp7CgpyZXR1cm4gJHRoaXMtPmNyZWF0ZVBvb2xGb3JQYWNrYWdlcyhbJHBhY2thZ2VOYW1lXSwgJGxvY2tlZFJlcG8pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlUG9vbEZvclBhY2thZ2VzKGFycmF5ICRwYWNrYWdlTmFtZXMsID9Mb2NrQXJyYXlSZXBvc2l0b3J5ICRsb2NrZWRSZXBvID0gbnVsbCk6IFBvb2wKewokcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KCRsb2NrZWRSZXBvKTsKCiRhbGxvd2VkUGFja2FnZXMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VOYW1lcyBhcyAkcGFja2FnZU5hbWUpIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHBhY2thZ2VOYW1lKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdjcmVhdGVQb29sRm9yUGFja2FnZShzKSBjYW4gbm90IGJlIHVzZWQgZm9yIHBsYXRmb3JtIHBhY2thZ2VzLCBhcyB0aGV5IGFyZSBuZXZlciBsb2FkZWQgYnkgdGhlIFBvb2xCdWlsZGVyIHdoaWNoIGV4cGVjdHMgdGhlbSB0byBiZSBmaXhlZC4gVXNlIGNyZWF0ZVBvb2xXaXRoQWxsUGFja2FnZXMgb3IgcGFzcyBpbiBhIHByb3BlciByZXF1ZXN0IHdpdGggdGhlIHBsYXRmb3JtIHBhY2thZ2VzIHlvdSBuZWVkIGZpeGVkIGluIGl0LicpOwp9CgokcmVxdWVzdC0+cmVxdWlyZU5hbWUoJHBhY2thZ2VOYW1lKTsKJGFsbG93ZWRQYWNrYWdlc1tdID0gc3RydG9sb3dlcigkcGFja2FnZU5hbWUpOwp9CgppZiAoY291bnQoJGFsbG93ZWRQYWNrYWdlcykgPiAwKSB7CiRyZXF1ZXN0LT5yZXN0cmljdFBhY2thZ2VzKCRhbGxvd2VkUGFja2FnZXMpOwp9CgpyZXR1cm4gJHRoaXMtPmNyZWF0ZVBvb2woJHJlcXVlc3QsIG5ldyBOdWxsSU8oKSk7Cn0KCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldFJvb3RBbGlhc2VzUGVyUGFja2FnZShhcnJheSAkYWxpYXNlcyk6IGFycmF5CnsKJG5vcm1hbGl6ZWRBbGlhc2VzID0gW107Cgpmb3JlYWNoICgkYWxpYXNlcyBhcyAkYWxpYXMpIHsKJG5vcm1hbGl6ZWRBbGlhc2VzWyRhbGlhc1sncGFja2FnZSddXVskYWxpYXNbJ3ZlcnNpb24nXV0gPSBbCidhbGlhcycgPT4gJGFsaWFzWydhbGlhcyddLAonYWxpYXNfbm9ybWFsaXplZCcgPT4gJGFsaWFzWydhbGlhc19ub3JtYWxpemVkJ10sCl07Cn0KCnJldHVybiAkbm9ybWFsaXplZEFsaWFzZXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIFJlcG9zaXRvcnlVdGlscwp7CgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmlsdGVyUmVxdWlyZWRQYWNrYWdlcyhhcnJheSAkcGFja2FnZXMsIFBhY2thZ2VJbnRlcmZhY2UgJHJlcXVpcmVyLCBib29sICRpbmNsdWRlUmVxdWlyZURldiA9IGZhbHNlLCBhcnJheSAkYnVja2V0ID0gW10pOiBhcnJheQp7CiRyZXF1aXJlcyA9ICRyZXF1aXJlci0+Z2V0UmVxdWlyZXMoKTsKaWYgKCRpbmNsdWRlUmVxdWlyZURldikgewokcmVxdWlyZXMgPSBhcnJheV9tZXJnZSgkcmVxdWlyZXMsICRyZXF1aXJlci0+Z2V0RGV2UmVxdWlyZXMoKSk7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkY2FuZGlkYXRlKSB7CmZvcmVhY2ggKCRjYW5kaWRhdGUtPmdldE5hbWVzKCkgYXMgJG5hbWUpIHsKaWYgKGlzc2V0KCRyZXF1aXJlc1skbmFtZV0pKSB7CmlmICghaW5fYXJyYXkoJGNhbmRpZGF0ZSwgJGJ1Y2tldCwgdHJ1ZSkpIHsKJGJ1Y2tldFtdID0gJGNhbmRpZGF0ZTsKJGJ1Y2tldCA9IHNlbGY6OmZpbHRlclJlcXVpcmVkUGFja2FnZXMoJHBhY2thZ2VzLCAkY2FuZGlkYXRlLCBmYWxzZSwgJGJ1Y2tldCk7Cn0KYnJlYWs7Cn0KfQp9CgpyZXR1cm4gJGJ1Y2tldDsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZsYXR0ZW5SZXBvc2l0b3JpZXMoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgYm9vbCAkdW53cmFwRmlsdGVyUmVwb3MgPSB0cnVlKTogYXJyYXkKewoKaWYgKCR1bndyYXBGaWx0ZXJSZXBvcyAmJiAkcmVwbyBpbnN0YW5jZW9mIEZpbHRlclJlcG9zaXRvcnkpIHsKJHJlcG8gPSAkcmVwby0+Z2V0UmVwb3NpdG9yeSgpOwp9CgppZiAoISRyZXBvIGluc3RhbmNlb2YgQ29tcG9zaXRlUmVwb3NpdG9yeSkgewpyZXR1cm4gWyRyZXBvXTsKfQoKJHJlcG9zID0gW107CmZvcmVhY2ggKCRyZXBvLT5nZXRSZXBvc2l0b3JpZXMoKSBhcyAkcikgewpmb3JlYWNoIChzZWxmOjpmbGF0dGVuUmVwb3NpdG9yaWVzKCRyLCAkdW53cmFwRmlsdGVyUmVwb3MpIGFzICRyMikgewokcmVwb3NbXSA9ICRyMjsKfQp9CgpyZXR1cm4gJHJlcG9zOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKCgoKCgoKCgpjbGFzcyBSb290UGFja2FnZVJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUm9vdFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKcGFyZW50OjpfX2NvbnN0cnVjdChbJHBhY2thZ2VdKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCk6IHN0cmluZwp7CnJldHVybiAncm9vdCBwYWNrYWdlIHJlcG8nOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzOwoKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKCgoKCmNsYXNzIEZvc3NpbERyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7Cgpwcm90ZWN0ZWQgJHRhZ3M7Cgpwcm90ZWN0ZWQgJGJyYW5jaGVzOwoKcHJvdGVjdGVkICRyb290SWRlbnRpZmllciA9IG51bGw7Cgpwcm90ZWN0ZWQgJHJlcG9GaWxlID0gbnVsbDsKCnByb3RlY3RlZCAkY2hlY2tvdXREaXI7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKCiR0aGlzLT5jaGVja0Zvc3NpbCgpOwoKCiR0aGlzLT5jb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJHRoaXMtPnVybCwgJHRoaXMtPmlvKTsKCgoKaWYgKEZpbGVzeXN0ZW06OmlzTG9jYWxQYXRoKCR0aGlzLT51cmwpICYmIGlzX2RpcigkdGhpcy0+dXJsKSkgewokdGhpcy0+Y2hlY2tvdXREaXIgPSAkdGhpcy0+dXJsOwp9IGVsc2UgewppZiAoIUNhY2hlOjppc1VzYWJsZSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlcG8tZGlyJykpIHx8ICFDYWNoZTo6aXNVc2FibGUoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRm9zc2lsRHJpdmVyIHJlcXVpcmVzIGEgdXNhYmxlIGNhY2hlIGRpcmVjdG9yeSwgYW5kIGl0IGxvb2tzIGxpa2UgeW91IHNldCBpdCB0byBiZSBkaXNhYmxlZCcpOwp9CgokbG9jYWxOYW1lID0gUHJlZzo6cmVwbGFjZSgne1teYS16MC05XX1pJywgJy0nLCAkdGhpcy0+dXJsKTsKJHRoaXMtPnJlcG9GaWxlID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZXBvLWRpcicpIC4gJy8nIC4gJGxvY2FsTmFtZSAuICcuZm9zc2lsJzsKJHRoaXMtPmNoZWNrb3V0RGlyID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykgLiAnLycgLiAkbG9jYWxOYW1lIC4gJy8nOwoKJHRoaXMtPnVwZGF0ZUxvY2FsUmVwbygpOwp9CgokdGhpcy0+Z2V0VGFncygpOwokdGhpcy0+Z2V0QnJhbmNoZXMoKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrRm9zc2lsKCk6IHZvaWQKewppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAndmVyc2lvbiddLCAkaWdub3JlZE91dHB1dCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJmb3NzaWwgd2FzIG5vdCBmb3VuZCwgY2hlY2sgdGhhdCBpdCBpcyBpbnN0YWxsZWQgYW5kIGluIHlvdXIgUEFUSCBlbnYuXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsUmVwbygpOiB2b2lkCnsKYXNzZXJ0KCR0aGlzLT5yZXBvRmlsZSAhPT0gbnVsbCk7CgokZnMgPSBuZXcgRmlsZXN5c3RlbSgpOwokZnMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGhpcy0+Y2hlY2tvdXREaXIpOwoKaWYgKCFpc193cml0YWJsZShkaXJuYW1lKCR0aGlzLT5jaGVja291dERpcikpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ2FuIG5vdCBjbG9uZSAnLiR0aGlzLT51cmwuJyB0byBhY2Nlc3MgcGFja2FnZSBpbmZvcm1hdGlvbi4gVGhlICInLiR0aGlzLT5jaGVja291dERpci4nIiBkaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlIGJ5IHRoZSBjdXJyZW50IHVzZXIuJyk7Cn0KCgppZiAoaXNfZmlsZSgkdGhpcy0+cmVwb0ZpbGUpICYmIGlzX2RpcigkdGhpcy0+Y2hlY2tvdXREaXIpICYmIDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZm9zc2lsJywgJ2luZm8nXSwgJG91dHB1dCwgJHRoaXMtPmNoZWNrb3V0RGlyKSkgewppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAncHVsbCddLCAkb3V0cHV0LCAkdGhpcy0+Y2hlY2tvdXREaXIpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkZhaWxlZCB0byB1cGRhdGUgJy4kdGhpcy0+dXJsLicsIHBhY2thZ2UgaW5mb3JtYXRpb24gZnJvbSB0aGlzIHJlcG9zaXRvcnkgbWF5IGJlIG91dGRhdGVkICgnLiR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLicpPC9lcnJvcj4nKTsKfQp9IGVsc2UgewoKJGZzLT5yZW1vdmVEaXJlY3RvcnkoJHRoaXMtPmNoZWNrb3V0RGlyKTsKJGZzLT5yZW1vdmUoJHRoaXMtPnJlcG9GaWxlKTsKCiRmcy0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCR0aGlzLT5jaGVja291dERpcik7CgppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAnY2xvbmUnLCAnLS0nLCAkdGhpcy0+dXJsLCAkdGhpcy0+cmVwb0ZpbGVdLCAkb3V0cHV0KSkgewokb3V0cHV0ID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBjbG9uZSAnLiR0aGlzLT51cmwuJyB0byByZXBvc2l0b3J5ICcgLiAkdGhpcy0+cmVwb0ZpbGUgLiAiXG5cbiIgLiRvdXRwdXQpOwp9CgppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAnb3BlbicsICctLW5lc3RlZCcsICctLScsICR0aGlzLT5yZXBvRmlsZV0sICRvdXRwdXQsICR0aGlzLT5jaGVja291dERpcikpIHsKJG91dHB1dCA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gb3BlbiByZXBvc2l0b3J5ICcuJHRoaXMtPnJlcG9GaWxlLicgaW4gJyAuICR0aGlzLT5jaGVja291dERpciAuICJcblxuIiAuJG91dHB1dCk7Cn0KfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nCnsKaWYgKG51bGwgPT09ICR0aGlzLT5yb290SWRlbnRpZmllcikgewokdGhpcy0+cm9vdElkZW50aWZpZXIgPSAndHJ1bmsnOwp9CgpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5CnsKcmV0dXJuIFsndHlwZScgPT4gJ2Zvc3NpbCcsICd1cmwnID0+ICR0aGlzLT5nZXRVcmwoKSwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVDb250ZW50KHN0cmluZyAkZmlsZSwgc3RyaW5nICRpZGVudGlmaWVyKTogP3N0cmluZwp7CiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZm9zc2lsJywgJ2NhdCcsICctcicsICRpZGVudGlmaWVyLCAnLS0nLCAkZmlsZV0sICRjb250ZW50LCAkdGhpcy0+Y2hlY2tvdXREaXIpOwoKaWYgKCcnID09PSB0cmltKCRjb250ZW50KSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRjb250ZW50Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAnZmluZm8nLCAnLWInLCAnLW4nLCAnMScsICdjb21wb3Nlci5qc29uJ10sICRvdXRwdXQsICR0aGlzLT5jaGVja291dERpcik7ClssICRkYXRlXSA9IGV4cGxvZGUoJyAnLCB0cmltKCRvdXRwdXQpLCAzKTsKCnJldHVybiBuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCRkYXRlLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+dGFncykgewokdGFncyA9IFtdOwoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAndGFnJywgJ2xpc3QnXSwgJG91dHB1dCwgJHRoaXMtPmNoZWNrb3V0RGlyKTsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJHRhZykgewokdGFnc1skdGFnXSA9ICR0YWc7Cn0KCiR0aGlzLT50YWdzID0gJHRhZ3M7Cn0KCnJldHVybiAkdGhpcy0+dGFnczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5icmFuY2hlcykgewokYnJhbmNoZXMgPSBbXTsKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZm9zc2lsJywgJ2JyYW5jaCcsICdsaXN0J10sICRvdXRwdXQsICR0aGlzLT5jaGVja291dERpcik7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpIGFzICRicmFuY2gpIHsKJGJyYW5jaCA9IHRyaW0oUHJlZzo6cmVwbGFjZSgnL15cKi8nLCAnJywgdHJpbSgkYnJhbmNoKSkpOwokYnJhbmNoZXNbJGJyYW5jaF0gPSAkYnJhbmNoOwp9CgokdGhpcy0+YnJhbmNoZXMgPSAkYnJhbmNoZXM7Cn0KCnJldHVybiAkdGhpcy0+YnJhbmNoZXM7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VwcG9ydHMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIGJvb2wgJGRlZXAgPSBmYWxzZSk6IGJvb2wKewppZiAoUHJlZzo6aXNNYXRjaCgnIyheKD86aHR0cHM/fHNzaCk6Ly8oPzpbXkBdQCk/KD86Y2hpc2VsYXBwXC5jb218Zm9zc2lsXC4pKSNpJywgJHVybCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChQcmVnOjppc01hdGNoKCchL2Zvc3NpbC98XC5mb3NzaWwhJywgJHVybCkpIHsKcmV0dXJuIHRydWU7Cn0KCgppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHVybCkpIHsKJHVybCA9IEZpbGVzeXN0ZW06OmdldFBsYXRmb3JtUGF0aCgkdXJsKTsKaWYgKCFpc19kaXIoJHVybCkpIHsKcmV0dXJuIGZhbHNlOwp9CgokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKCmlmICgkcHJvY2Vzcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICdpbmZvJ10sICRvdXRwdXQsICR1cmwpID09PSAwKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxCaXRidWNrZXQ7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUmVzcG9uc2U7CgoKCgpjbGFzcyBHaXRCaXRidWNrZXREcml2ZXIgZXh0ZW5kcyBWY3NEcml2ZXIKewoKcHJvdGVjdGVkICRvd25lcjsKCnByb3RlY3RlZCAkcmVwb3NpdG9yeTsKCnByaXZhdGUgJGhhc0lzc3VlcyA9IGZhbHNlOwoKcHJpdmF0ZSAkcm9vdElkZW50aWZpZXI7Cgpwcml2YXRlICR0YWdzOwoKcHJpdmF0ZSAkYnJhbmNoZXM7Cgpwcml2YXRlICRicmFuY2hlc1VybCA9ICcnOwoKcHJpdmF0ZSAkdGFnc1VybCA9ICcnOwoKcHJpdmF0ZSAkaG9tZVVybCA9ICcnOwoKcHJpdmF0ZSAkd2Vic2l0ZSA9ICcnOwoKcHJpdmF0ZSAkY2xvbmVIdHRwc1VybCA9ICcnOwoKcHJpdmF0ZSAkcmVwb0RhdGE7CgoKCgpwcm90ZWN0ZWQgJGZhbGxiYWNrRHJpdmVyID0gbnVsbDsKCnByaXZhdGUgJHZjc1R5cGU7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKaWYgKCFQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcjXmh0dHBzPzovL2JpdGJ1Y2tldFwub3JnLyhbXi9dKykvKFteL10rPykoPzpcLmdpdHwvPyk/JCNpJywgJHRoaXMtPnVybCwgJG1hdGNoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgQml0YnVja2V0IHJlcG9zaXRvcnkgVVJMICVzIGlzIGludmFsaWQuIEl0IG11c3QgYmUgdGhlIEhUVFBTIFVSTCBvZiBhIEJpdGJ1Y2tldCByZXBvc2l0b3J5LicsICR0aGlzLT51cmwpKTsKfQoKJHRoaXMtPm93bmVyID0gJG1hdGNoWzFdOwokdGhpcy0+cmVwb3NpdG9yeSA9ICRtYXRjaFsyXTsKJHRoaXMtPm9yaWdpblVybCA9ICdiaXRidWNrZXQub3JnJzsKJHRoaXMtPmNhY2hlID0gbmV3IENhY2hlKAokdGhpcy0+aW8sCmltcGxvZGUoJy8nLCBbCiR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKSwKJHRoaXMtPm9yaWdpblVybCwKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeSwKXSkKKTsKJHRoaXMtPmNhY2hlLT5zZXRSZWFkT25seSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlYWQtb25seScpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBzdHJpbmcKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldFVybCgpOwp9CgpyZXR1cm4gJHRoaXMtPmNsb25lSHR0cHNVcmw7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRSZXBvRGF0YSgpOiBib29sCnsKJHJlc291cmNlID0gc3ByaW50ZigKJ2h0dHBzOi8vYXBpLmJpdGJ1Y2tldC5vcmcvMi4wL3JlcG9zaXRvcmllcy8lcy8lcz8lcycsCiR0aGlzLT5vd25lciwKJHRoaXMtPnJlcG9zaXRvcnksCmh0dHBfYnVpbGRfcXVlcnkoClsnZmllbGRzJyA9PiAnLXByb2plY3QsLW93bmVyJ10sCicnLAonJicKKQopOwoKJHJlcG9EYXRhID0gJHRoaXMtPmZldGNoV2l0aE9BdXRoQ3JlZGVudGlhbHMoJHJlc291cmNlLCB0cnVlKS0+ZGVjb2RlSnNvbigpOwppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiBmYWxzZTsKfQokdGhpcy0+cGFyc2VDbG9uZVVybHMoJHJlcG9EYXRhWydsaW5rcyddWydjbG9uZSddKTsKCiR0aGlzLT5oYXNJc3N1ZXMgPSAhZW1wdHkoJHJlcG9EYXRhWydoYXNfaXNzdWVzJ10pOwokdGhpcy0+YnJhbmNoZXNVcmwgPSAkcmVwb0RhdGFbJ2xpbmtzJ11bJ2JyYW5jaGVzJ11bJ2hyZWYnXTsKJHRoaXMtPnRhZ3NVcmwgPSAkcmVwb0RhdGFbJ2xpbmtzJ11bJ3RhZ3MnXVsnaHJlZiddOwokdGhpcy0+aG9tZVVybCA9ICRyZXBvRGF0YVsnbGlua3MnXVsnaHRtbCddWydocmVmJ107CiR0aGlzLT53ZWJzaXRlID0gJHJlcG9EYXRhWyd3ZWJzaXRlJ107CiR0aGlzLT52Y3NUeXBlID0gJHJlcG9EYXRhWydzY20nXTsKCiR0aGlzLT5yZXBvRGF0YSA9ICRyZXBvRGF0YTsKCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJJbmZvcm1hdGlvbihzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdKSkgewppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSAmJiAkcmVzID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRpZGVudGlmaWVyKSkgewokY29tcG9zZXIgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRyZXMpOwp9IGVsc2UgewokY29tcG9zZXIgPSAkdGhpcy0+Z2V0QmFzZUNvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwoKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikpIHsKJHRoaXMtPmNhY2hlLT53cml0ZSgkaWRlbnRpZmllciwganNvbl9lbmNvZGUoJGNvbXBvc2VyKSk7Cn0KfQoKaWYgKCRjb21wb3NlciAhPT0gbnVsbCkgewoKaWYgKGlzc2V0KCRjb21wb3Nlclsnc3VwcG9ydCddKSAmJiAhaXNfYXJyYXkoJGNvbXBvc2VyWydzdXBwb3J0J10pKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddID0gW107Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXVsnc291cmNlJ10pKSB7CiRsYWJlbCA9IGFycmF5X3NlYXJjaCgKJGlkZW50aWZpZXIsCiR0aGlzLT5nZXRUYWdzKCkKKSA/OiBhcnJheV9zZWFyY2goCiRpZGVudGlmaWVyLAokdGhpcy0+Z2V0QnJhbmNoZXMoKQopID86ICRpZGVudGlmaWVyOwoKaWYgKGFycmF5X2tleV9leGlzdHMoJGxhYmVsLCAkdGFncyA9ICR0aGlzLT5nZXRUYWdzKCkpKSB7CiRoYXNoID0gJHRhZ3NbJGxhYmVsXTsKfSBlbHNlaWYgKGFycmF5X2tleV9leGlzdHMoJGxhYmVsLCAkYnJhbmNoZXMgPSAkdGhpcy0+Z2V0QnJhbmNoZXMoKSkpIHsKJGhhc2ggPSAkYnJhbmNoZXNbJGxhYmVsXTsKfQoKaWYgKCFpc3NldCgkaGFzaCkpIHsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddID0gc3ByaW50ZigKJ2h0dHBzOi8vJXMvJXMvJXMvc3JjJywKJHRoaXMtPm9yaWdpblVybCwKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeQopOwp9IGVsc2UgewokY29tcG9zZXJbJ3N1cHBvcnQnXVsnc291cmNlJ10gPSBzcHJpbnRmKAonaHR0cHM6Ly8lcy8lcy8lcy9zcmMvJXMvP2F0PSVzJywKJHRoaXMtPm9yaWdpblVybCwKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeSwKJGhhc2gsCiRsYWJlbAopOwp9Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXVsnaXNzdWVzJ10pICYmICR0aGlzLT5oYXNJc3N1ZXMpIHsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ2lzc3VlcyddID0gc3ByaW50ZigKJ2h0dHBzOi8vJXMvJXMvJXMvaXNzdWVzJywKJHRoaXMtPm9yaWdpblVybCwKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeQopOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydob21lcGFnZSddKSkgewokY29tcG9zZXJbJ2hvbWVwYWdlJ10gPSBlbXB0eSgkdGhpcy0+d2Vic2l0ZSkgPyAkdGhpcy0+aG9tZVVybCA6ICR0aGlzLT53ZWJzaXRlOwp9Cn0KCiR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdID0gJGNvbXBvc2VyOwp9CgpyZXR1cm4gJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmcKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldEZpbGVDb250ZW50KCRmaWxlLCAkaWRlbnRpZmllcik7Cn0KCmlmIChzdHJwb3MoJGlkZW50aWZpZXIsICcvJykgIT09IGZhbHNlKSB7CiRicmFuY2hlcyA9ICR0aGlzLT5nZXRCcmFuY2hlcygpOwppZiAoaXNzZXQoJGJyYW5jaGVzWyRpZGVudGlmaWVyXSkpIHsKJGlkZW50aWZpZXIgPSAkYnJhbmNoZXNbJGlkZW50aWZpZXJdOwp9Cn0KCiRyZXNvdXJjZSA9IHNwcmludGYoCidodHRwczovL2FwaS5iaXRidWNrZXQub3JnLzIuMC9yZXBvc2l0b3JpZXMvJXMvJXMvc3JjLyVzLyVzJywKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeSwKJGlkZW50aWZpZXIsCiRmaWxlCik7CgpyZXR1cm4gJHRoaXMtPmZldGNoV2l0aE9BdXRoQ3JlZGVudGlhbHMoJHJlc291cmNlKS0+Z2V0Qm9keSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKaWYgKCR0aGlzLT5mYWxsYmFja0RyaXZlcikgewpyZXR1cm4gJHRoaXMtPmZhbGxiYWNrRHJpdmVyLT5nZXRDaGFuZ2VEYXRlKCRpZGVudGlmaWVyKTsKfQoKaWYgKHN0cnBvcygkaWRlbnRpZmllciwgJy8nKSAhPT0gZmFsc2UpIHsKJGJyYW5jaGVzID0gJHRoaXMtPmdldEJyYW5jaGVzKCk7CmlmIChpc3NldCgkYnJhbmNoZXNbJGlkZW50aWZpZXJdKSkgewokaWRlbnRpZmllciA9ICRicmFuY2hlc1skaWRlbnRpZmllcl07Cn0KfQoKJHJlc291cmNlID0gc3ByaW50ZigKJ2h0dHBzOi8vYXBpLmJpdGJ1Y2tldC5vcmcvMi4wL3JlcG9zaXRvcmllcy8lcy8lcy9jb21taXQvJXM/ZmllbGRzPWRhdGUnLAokdGhpcy0+b3duZXIsCiR0aGlzLT5yZXBvc2l0b3J5LAokaWRlbnRpZmllcgopOwokY29tbWl0ID0gJHRoaXMtPmZldGNoV2l0aE9BdXRoQ3JlZGVudGlhbHMoJHJlc291cmNlKS0+ZGVjb2RlSnNvbigpOwoKcmV0dXJuIG5ldyBcRGF0ZVRpbWVJbW11dGFibGUoJGNvbW1pdFsnZGF0ZSddKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZShzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0U291cmNlKCRpZGVudGlmaWVyKTsKfQoKcmV0dXJuIFsndHlwZScgPT4gJHRoaXMtPnZjc1R5cGUsICd1cmwnID0+ICR0aGlzLT5nZXRVcmwoKSwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldERpc3QoJGlkZW50aWZpZXIpOwp9CgokdXJsID0gc3ByaW50ZigKJ2h0dHBzOi8vYml0YnVja2V0Lm9yZy8lcy8lcy9nZXQvJXMuemlwJywKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeSwKJGlkZW50aWZpZXIKKTsKCnJldHVybiBbJ3R5cGUnID0+ICd6aXAnLCAndXJsJyA9PiAkdXJsLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllciwgJ3NoYXN1bScgPT4gJyddOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheQp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0VGFncygpOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPnRhZ3MpIHsKJHRhZ3MgPSBbXTsKJHJlc291cmNlID0gc3ByaW50ZigKJyVzPyVzJywKJHRoaXMtPnRhZ3NVcmwsCmh0dHBfYnVpbGRfcXVlcnkoClsKJ3BhZ2VsZW4nID0+IDEwMCwKJ2ZpZWxkcycgPT4gJ3ZhbHVlcy5uYW1lLHZhbHVlcy50YXJnZXQuaGFzaCxuZXh0JywKJ3NvcnQnID0+ICctdGFyZ2V0LmRhdGUnLApdLAonJywKJyYnCikKKTsKJGhhc05leHQgPSB0cnVlOwp3aGlsZSAoJGhhc05leHQpIHsKJHRhZ3NEYXRhID0gJHRoaXMtPmZldGNoV2l0aE9BdXRoQ3JlZGVudGlhbHMoJHJlc291cmNlKS0+ZGVjb2RlSnNvbigpOwpmb3JlYWNoICgkdGFnc0RhdGFbJ3ZhbHVlcyddIGFzICRkYXRhKSB7CiR0YWdzWyRkYXRhWyduYW1lJ11dID0gJGRhdGFbJ3RhcmdldCddWydoYXNoJ107Cn0KaWYgKGVtcHR5KCR0YWdzRGF0YVsnbmV4dCddKSkgewokaGFzTmV4dCA9IGZhbHNlOwp9IGVsc2UgewokcmVzb3VyY2UgPSAkdGFnc0RhdGFbJ25leHQnXTsKfQp9CgokdGhpcy0+dGFncyA9ICR0YWdzOwp9CgpyZXR1cm4gJHRoaXMtPnRhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0QnJhbmNoZXMoKTsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5icmFuY2hlcykgewokYnJhbmNoZXMgPSBbXTsKJHJlc291cmNlID0gc3ByaW50ZigKJyVzPyVzJywKJHRoaXMtPmJyYW5jaGVzVXJsLApodHRwX2J1aWxkX3F1ZXJ5KApbCidwYWdlbGVuJyA9PiAxMDAsCidmaWVsZHMnID0+ICd2YWx1ZXMubmFtZSx2YWx1ZXMudGFyZ2V0Lmhhc2gsdmFsdWVzLmhlYWRzLG5leHQnLAonc29ydCcgPT4gJy10YXJnZXQuZGF0ZScsCl0sCicnLAonJicKKQopOwokaGFzTmV4dCA9IHRydWU7CndoaWxlICgkaGFzTmV4dCkgewokYnJhbmNoRGF0YSA9ICR0aGlzLT5mZXRjaFdpdGhPQXV0aENyZWRlbnRpYWxzKCRyZXNvdXJjZSktPmRlY29kZUpzb24oKTsKZm9yZWFjaCAoJGJyYW5jaERhdGFbJ3ZhbHVlcyddIGFzICRkYXRhKSB7CiRicmFuY2hlc1skZGF0YVsnbmFtZSddXSA9ICRkYXRhWyd0YXJnZXQnXVsnaGFzaCddOwp9CmlmIChlbXB0eSgkYnJhbmNoRGF0YVsnbmV4dCddKSkgewokaGFzTmV4dCA9IGZhbHNlOwp9IGVsc2UgewokcmVzb3VyY2UgPSAkYnJhbmNoRGF0YVsnbmV4dCddOwp9Cn0KCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZldGNoV2l0aE9BdXRoQ3JlZGVudGlhbHMoc3RyaW5nICR1cmwsIGJvb2wgJGZldGNoaW5nUmVwb0RhdGEgPSBmYWxzZSk6IFJlc3BvbnNlCnsKdHJ5IHsKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewokYml0YnVja2V0VXRpbCA9IG5ldyBCaXRidWNrZXQoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHRoaXMtPmh0dHBEb3dubG9hZGVyKTsKCmlmIChpbl9hcnJheSgkZS0+Z2V0Q29kZSgpLCBbNDAzLCA0MDRdLCB0cnVlKSB8fCAoNDAxID09PSAkZS0+Z2V0Q29kZSgpICYmIHN0cnBvcygkZS0+Z2V0TWVzc2FnZSgpLCAnQ291bGQgbm90IGF1dGhlbnRpY2F0ZSBhZ2FpbnN0JykgPT09IDApKSB7CmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkdGhpcy0+b3JpZ2luVXJsKQomJiAkYml0YnVja2V0VXRpbC0+YXV0aG9yaXplT0F1dGgoJHRoaXMtPm9yaWdpblVybCkKKSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpICYmICRmZXRjaGluZ1JlcG9EYXRhKSB7CiR0aGlzLT5hdHRlbXB0Q2xvbmVGYWxsYmFjaygpOwoKcmV0dXJuIG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJ2R1bW15J10sIDIwMCwgW10sICdudWxsJyk7Cn0KfQoKdGhyb3cgJGU7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlU3NoVXJsKCk6IHN0cmluZwp7CnJldHVybiAnZ2l0QCcgLiAkdGhpcy0+b3JpZ2luVXJsIC4gJzonIC4gJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nLmdpdCc7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhdHRlbXB0Q2xvbmVGYWxsYmFjaygpOiBib29sCnsKdHJ5IHsKJHRoaXMtPnNldHVwRmFsbGJhY2tEcml2ZXIoJHRoaXMtPmdlbmVyYXRlU3NoVXJsKCkpOwoKcmV0dXJuIHRydWU7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5mYWxsYmFja0RyaXZlciA9IG51bGw7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoCic8ZXJyb3I+RmFpbGVkIHRvIGNsb25lIHRoZSAnIC4gJHRoaXMtPmdlbmVyYXRlU3NoVXJsKCkgLiAnIHJlcG9zaXRvcnksIHRyeSBydW5uaW5nIGluIGludGVyYWN0aXZlIG1vZGUnCi4gJyBzbyB0aGF0IHlvdSBjYW4gZW50ZXIgeW91ciBCaXRidWNrZXQgT0F1dGggY29uc3VtZXIgY3JlZGVudGlhbHM8L2Vycm9yPicKKTsKdGhyb3cgJGU7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNldHVwRmFsbGJhY2tEcml2ZXIoc3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPmZhbGxiYWNrRHJpdmVyID0gbmV3IEdpdERyaXZlcigKWyd1cmwnID0+ICR1cmxdLAokdGhpcy0+aW8sCiR0aGlzLT5jb25maWcsCiR0aGlzLT5odHRwRG93bmxvYWRlciwKJHRoaXMtPnByb2Nlc3MKKTsKJHRoaXMtPmZhbGxiYWNrRHJpdmVyLT5pbml0aWFsaXplKCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZUNsb25lVXJscyhhcnJheSAkY2xvbmVMaW5rcyk6IHZvaWQKewpmb3JlYWNoICgkY2xvbmVMaW5rcyBhcyAkY2xvbmVMaW5rKSB7CmlmICgkY2xvbmVMaW5rWyduYW1lJ10gPT09ICdodHRwcycpIHsKCgokdGhpcy0+Y2xvbmVIdHRwc1VybCA9IFByZWc6OnJlcGxhY2UoJy9odHRwczpcL1wvKFteQF0rQCk/LycsICdodHRwczovLycsICRjbG9uZUxpbmtbJ2hyZWYnXSk7Cn0KfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5mYWxsYmFja0RyaXZlcikgewpyZXR1cm4gJHRoaXMtPmZhbGxiYWNrRHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPnJvb3RJZGVudGlmaWVyKSB7CmlmICghJHRoaXMtPmdldFJlcG9EYXRhKCkpIHsKaWYgKCEkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQSBmYWxsYmFjayBkcml2ZXIgc2hvdWxkIGJlIHNldHVwIGlmIGdldFJlcG9EYXRhIHJldHVybnMgZmFsc2UnKTsKfQoKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKTsKfQoKaWYgKCR0aGlzLT52Y3NUeXBlICE9PSAnZ2l0Jykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCiR0aGlzLT51cmwuJyBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSBnaXQgcmVwb3NpdG9yeSwgdXNlICcuCiR0aGlzLT5jbG9uZUh0dHBzVXJsLicgYnV0IHJlbWVtYmVyIHRoYXQgQml0YnVja2V0IG5vIGxvbmdlciBzdXBwb3J0cyB0aGUgbWVyY3VyaWFsIHJlcG9zaXRvcmllcy4gJy4KJ2h0dHBzOi8vYml0YnVja2V0Lm9yZy9ibG9nL3N1bnNldHRpbmctbWVyY3VyaWFsLXN1cHBvcnQtaW4tYml0YnVja2V0JwopOwp9CgokdGhpcy0+cm9vdElkZW50aWZpZXIgPSAkdGhpcy0+cmVwb0RhdGFbJ21haW5icmFuY2gnXVsnbmFtZSddID8/ICdtYXN0ZXInOwp9CgpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIHN0cmluZyAkdXJsLCBib29sICRkZWVwID0gZmFsc2UpOiBib29sCnsKaWYgKCFQcmVnOjppc01hdGNoKCcjXmh0dHBzPzovL2JpdGJ1Y2tldFwub3JnLyhbXi9dKykvKFteL10rPykoXC5naXR8Lz8pPyQjaScsICR1cmwpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpIHsKJGlvLT53cml0ZUVycm9yKCdTa2lwcGluZyBCaXRidWNrZXQgZ2l0IGRyaXZlciBmb3IgJy4kdXJsLicgYmVjYXVzZSB0aGUgT3BlblNTTCBQSFAgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcVXJsOwp1c2UgQ29tcG9zZXJcVXRpbFxHaXQgYXMgR2l0VXRpbDsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxDb25maWc7CgoKCgpjbGFzcyBHaXREcml2ZXIgZXh0ZW5kcyBWY3NEcml2ZXIKewoKcHJvdGVjdGVkICR0YWdzOwoKcHJvdGVjdGVkICRicmFuY2hlczsKCnByb3RlY3RlZCAkcm9vdElkZW50aWZpZXI7Cgpwcm90ZWN0ZWQgJHJlcG9EaXI7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKaWYgKEZpbGVzeXN0ZW06OmlzTG9jYWxQYXRoKCR0aGlzLT51cmwpKSB7CiR0aGlzLT51cmwgPSBQcmVnOjpyZXBsYWNlKCd7W1xcL11cLmdpdC8/JH0nLCAnJywgJHRoaXMtPnVybCk7CmlmICghaXNfZGlyKCR0aGlzLT51cmwpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIHJlYWQgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tICcuJHRoaXMtPnVybC4nIGFzIHRoZSBwYXRoIGRvZXMgbm90IGV4aXN0Jyk7Cn0KJHRoaXMtPnJlcG9EaXIgPSAkdGhpcy0+dXJsOwokY2FjaGVVcmwgPSByZWFscGF0aCgkdGhpcy0+dXJsKTsKfSBlbHNlIHsKaWYgKCFDYWNoZTo6aXNVc2FibGUoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignR2l0RHJpdmVyIHJlcXVpcmVzIGEgdXNhYmxlIGNhY2hlIGRpcmVjdG9yeSwgYW5kIGl0IGxvb2tzIGxpa2UgeW91IHNldCBpdCB0byBiZSBkaXNhYmxlZCcpOwp9CgokdGhpcy0+cmVwb0RpciA9ICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpIC4gJy8nIC4gUHJlZzo6cmVwbGFjZSgne1teYS16MC05Ll19aScsICctJywgVXJsOjpzYW5pdGl6ZSgkdGhpcy0+dXJsKSkgLiAnLyc7CgpHaXRVdGlsOjpjbGVhbkVudigpOwoKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoZGlybmFtZSgkdGhpcy0+cmVwb0RpcikpOwoKaWYgKCFpc193cml0YWJsZShkaXJuYW1lKCR0aGlzLT5yZXBvRGlyKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDYW4gbm90IGNsb25lICcuJHRoaXMtPnVybC4nIHRvIGFjY2VzcyBwYWNrYWdlIGluZm9ybWF0aW9uLiBUaGUgIicuZGlybmFtZSgkdGhpcy0+cmVwb0RpcikuJyIgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSBieSB0aGUgY3VycmVudCB1c2VyLicpOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgne15zc2g6Ly9bXkBdK0BbXjpdKzpbXjAtOV0rfScsICR0aGlzLT51cmwpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgc291cmNlIFVSTCAnLiR0aGlzLT51cmwuJyBpcyBpbnZhbGlkLCBzc2ggVVJMcyBzaG91bGQgaGF2ZSBhIHBvcnQgbnVtYmVyIGFmdGVyICI6Ii4nLiJcbiIuJ1VzZSBzc2g6Ly9naXRAZXhhbXBsZS5jb206MjIvcGF0aCBvciBqdXN0IGdpdEBleGFtcGxlLmNvbTpwYXRoIGlmIHlvdSBkbyBub3Qgd2FudCB0byBwcm92aWRlIGEgcGFzc3dvcmQgb3IgY3VzdG9tIHBvcnQuJyk7Cn0KCiRnaXRVdGlsID0gbmV3IEdpdFV0aWwoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJGZzKTsKaWYgKCEkZ2l0VXRpbC0+c3luY01pcnJvcigkdGhpcy0+dXJsLCAkdGhpcy0+cmVwb0RpcikpIHsKaWYgKCFpc19kaXIoJHRoaXMtPnJlcG9EaXIpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGNsb25lICcuJHRoaXMtPnVybC4nIHRvIHJlYWQgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIGl0Jyk7Cn0KJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+RmFpbGVkIHRvIHVwZGF0ZSAnLiR0aGlzLT51cmwuJywgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgcmVwb3NpdG9yeSBtYXkgYmUgb3V0ZGF0ZWQ8L2Vycm9yPicpOwp9CgokY2FjaGVVcmwgPSAkdGhpcy0+dXJsOwp9CgokdGhpcy0+Z2V0VGFncygpOwokdGhpcy0+Z2V0QnJhbmNoZXMoKTsKCiR0aGlzLT5jYWNoZSA9IG5ldyBDYWNoZSgkdGhpcy0+aW8sICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKS4nLycuUHJlZzo6cmVwbGFjZSgne1teYS16MC05Ll19aScsICctJywgVXJsOjpzYW5pdGl6ZSgkY2FjaGVVcmwpKSk7CiR0aGlzLT5jYWNoZS0+c2V0UmVhZE9ubHkoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZWFkLW9ubHknKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewppZiAobnVsbCA9PT0gJHRoaXMtPnJvb3RJZGVudGlmaWVyKSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICdtYXN0ZXInOwoKJGdpdFV0aWwgPSBuZXcgR2l0VXRpbCgkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzLCBuZXcgRmlsZXN5c3RlbSgpKTsKaWYgKCFGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdGhpcy0+dXJsKSkgewokZGVmYXVsdEJyYW5jaCA9ICRnaXRVdGlsLT5nZXRNaXJyb3JEZWZhdWx0QnJhbmNoKCR0aGlzLT51cmwsICR0aGlzLT5yZXBvRGlyLCBmYWxzZSk7CmlmICgkZGVmYXVsdEJyYW5jaCAhPT0gbnVsbCkgewpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJGRlZmF1bHRCcmFuY2g7Cn0KfQoKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2JyYW5jaCcsICctLW5vLWNvbG9yJ10sICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKTsKJGJyYW5jaGVzID0gJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCk7CmlmICghaW5fYXJyYXkoJyogbWFzdGVyJywgJGJyYW5jaGVzKSkgewpmb3JlYWNoICgkYnJhbmNoZXMgYXMgJGJyYW5jaCkgewppZiAoJGJyYW5jaCAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlwqICsoXFMrKX0nLCAkYnJhbmNoLCAkbWF0Y2gpKSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICRtYXRjaFsxXTsKYnJlYWs7Cn0KfQp9Cn0KCnJldHVybiAkdGhpcy0+cm9vdElkZW50aWZpZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT51cmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXkKewpyZXR1cm4gWyd0eXBlJyA9PiAnZ2l0JywgJ3VybCcgPT4gJHRoaXMtPmdldFVybCgpLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKaWYgKGlzc2V0KCRpZGVudGlmaWVyWzBdKSAmJiAkaWRlbnRpZmllclswXSA9PT0gJy0nKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCBnaXQgaWRlbnRpZmllciBkZXRlY3RlZC4gSWRlbnRpZmllciBtdXN0IG5vdCBzdGFydCB3aXRoIGEgLSwgZ2l2ZW46ICcgLiAkaWRlbnRpZmllcik7Cn0KCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3Nob3cnLCAkaWRlbnRpZmllci4nOicuJGZpbGVdLCAkY29udGVudCwgJHRoaXMtPnJlcG9EaXIpOwoKaWYgKHRyaW0oJGNvbnRlbnQpID09PSAnJykgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRjb250ZW50Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnLWMnLCAnbG9nLnNob3dTaWduYXR1cmU9ZmFsc2UnLCAnbG9nJywgJy0xJywgJy0tZm9ybWF0PSVhdCcsICRpZGVudGlmaWVyXSwgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpOwoKcmV0dXJuIG5ldyBcRGF0ZVRpbWVJbW11dGFibGUoJ0AnLnRyaW0oJG91dHB1dCksIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT50YWdzKSB7CiR0aGlzLT50YWdzID0gW107CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdzaG93LXJlZicsICctLXRhZ3MnLCAnLS1kZXJlZmVyZW5jZSddLCAkb3V0cHV0LCAkdGhpcy0+cmVwb0Rpcik7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpIGFzICR0YWcpIHsKaWYgKCR0YWcgIT09ICcnICYmIFByZWc6OmlzTWF0Y2goJ3teKFthLWYwLTldezQwfSkgcmVmcy90YWdzLyhcUys/KShcXlx7XH0pPyR9JywgJHRhZywgJG1hdGNoKSkgewokdGhpcy0+dGFnc1skbWF0Y2hbMl1dID0gJG1hdGNoWzFdOwp9Cn0KfQoKcmV0dXJuICR0aGlzLT50YWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPmJyYW5jaGVzKSB7CiRicmFuY2hlcyA9IFtdOwoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnYnJhbmNoJywgJy0tbm8tY29sb3InLCAnLS1uby1hYmJyZXYnLCAnLXYnXSwgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkYnJhbmNoKSB7CmlmICgkYnJhbmNoICE9PSAnJyAmJiAhUHJlZzo6aXNNYXRjaCgne14gKlteL10rL0hFQUQgfScsICRicmFuY2gpKSB7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xig/OlwqICk/ICooXFMrKSAqKFthLWYwLTldKykoPzogLiopPyR9JywgJGJyYW5jaCwgJG1hdGNoKSAmJiAkbWF0Y2hbMV1bMF0gIT09ICctJykgewokYnJhbmNoZXNbJG1hdGNoWzFdXSA9ICRtYXRjaFsyXTsKfQp9Cn0KCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmIChQcmVnOjppc01hdGNoKCcjKF5naXQ6Ly98XC5naXQvPyR8Z2l0KD86b2xpdGUpP0B8Ly9naXRcLnwvL2dpdGh1Yi5jb20vKSNpJywgJHVybCkpIHsKcmV0dXJuIHRydWU7Cn0KCgppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHVybCkpIHsKJHVybCA9IEZpbGVzeXN0ZW06OmdldFBsYXRmb3JtUGF0aCgkdXJsKTsKaWYgKCFpc19kaXIoJHVybCkpIHsKcmV0dXJuIGZhbHNlOwp9CgokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKCmlmICgkcHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICd0YWcnXSwgJG91dHB1dCwgJHVybCkgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KR2l0VXRpbDo6Y2hlY2tGb3JSZXBvT3duZXJzaGlwRXJyb3IoJHByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCksICR1cmwpOwp9CgppZiAoISRkZWVwKSB7CnJldHVybiBmYWxzZTsKfQoKJGdpdFV0aWwgPSBuZXcgR2l0VXRpbCgkaW8sICRjb25maWcsIG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKSwgbmV3IEZpbGVzeXN0ZW0oKSk7CkdpdFV0aWw6OmNsZWFuRW52KCk7Cgp0cnkgewokZ2l0VXRpbC0+cnVuQ29tbWFuZHMoW1snZ2l0JywgJ2xzLXJlbW90ZScsICctLWhlYWRzJywgJy0tJywgJyV1cmwlJ11dLCAkdXJsLCBzeXNfZ2V0X3RlbXBfZGlyKCkpOwp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEdpdEh1YjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKCgoKCmNsYXNzIEdpdEh1YkRyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7Cgpwcm90ZWN0ZWQgJG93bmVyOwoKcHJvdGVjdGVkICRyZXBvc2l0b3J5OwoKcHJvdGVjdGVkICR0YWdzOwoKcHJvdGVjdGVkICRicmFuY2hlczsKCnByb3RlY3RlZCAkcm9vdElkZW50aWZpZXI7Cgpwcm90ZWN0ZWQgJHJlcG9EYXRhOwoKcHJvdGVjdGVkICRoYXNJc3N1ZXMgPSBmYWxzZTsKCnByb3RlY3RlZCAkaXNQcml2YXRlID0gZmFsc2U7Cgpwcml2YXRlICRpc0FyY2hpdmVkID0gZmFsc2U7Cgpwcml2YXRlICRmdW5kaW5nSW5mbzsKCgoKCgoKcHJvdGVjdGVkICRnaXREcml2ZXIgPSBudWxsOwoKCgoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZAp7CmlmICghUHJlZzo6aXNNYXRjaCgnI14oPzooPzpodHRwcz98Z2l0KTovLyhbXi9dKykvfGdpdEAoW146XSspOi8/KShbXi9dKykvKFteL10rPykoPzpcLmdpdHwvKT8kIycsICR0aGlzLT51cmwsICRtYXRjaCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIEdpdEh1YiByZXBvc2l0b3J5IFVSTCAlcyBpcyBpbnZhbGlkLicsICR0aGlzLT51cmwpKTsKfQoKJHRoaXMtPm93bmVyID0gJG1hdGNoWzNdOwokdGhpcy0+cmVwb3NpdG9yeSA9ICRtYXRjaFs0XTsKJHRoaXMtPm9yaWdpblVybCA9IHN0cnRvbG93ZXIoJG1hdGNoWzFdID8/IChzdHJpbmcpICRtYXRjaFsyXSk7CmlmICgkdGhpcy0+b3JpZ2luVXJsID09PSAnd3d3LmdpdGh1Yi5jb20nKSB7CiR0aGlzLT5vcmlnaW5VcmwgPSAnZ2l0aHViLmNvbSc7Cn0KJHRoaXMtPmNhY2hlID0gbmV3IENhY2hlKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZXBvLWRpcicpLicvJy4kdGhpcy0+b3JpZ2luVXJsLicvJy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5KTsKJHRoaXMtPmNhY2hlLT5zZXRSZWFkT25seSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlYWQtb25seScpKTsKCmlmICgkdGhpcy0+Y29uZmlnLT5nZXQoJ3VzZS1naXRodWItYXBpJykgPT09IGZhbHNlIHx8IChpc3NldCgkdGhpcy0+cmVwb0NvbmZpZ1snbm8tYXBpJ10pICYmICR0aGlzLT5yZXBvQ29uZmlnWyduby1hcGknXSkpIHsKJHRoaXMtPnNldHVwR2l0RHJpdmVyKCR0aGlzLT51cmwpOwoKcmV0dXJuOwp9CgokdGhpcy0+ZmV0Y2hSb290SWRlbnRpZmllcigpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeVVybCgpOiBzdHJpbmcKewpyZXR1cm4gJ2h0dHBzOi8vJy4kdGhpcy0+b3JpZ2luVXJsLicvJy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCk7Cn0KCnJldHVybiAkdGhpcy0+cm9vdElkZW50aWZpZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldFVybCgpOwp9CgpyZXR1cm4gJ2h0dHBzOi8vJyAuICR0aGlzLT5vcmlnaW5VcmwgLiAnLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nLmdpdCc7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRBcGlVcmwoKTogc3RyaW5nCnsKaWYgKCdnaXRodWIuY29tJyA9PT0gJHRoaXMtPm9yaWdpblVybCkgewokYXBpVXJsID0gJ2FwaS5naXRodWIuY29tJzsKfSBlbHNlIHsKJGFwaVVybCA9ICR0aGlzLT5vcmlnaW5VcmwgLiAnL2FwaS92Myc7Cn0KCnJldHVybiAnaHR0cHM6Ly8nIC4gJGFwaVVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZShzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRTb3VyY2UoJGlkZW50aWZpZXIpOwp9CmlmICgkdGhpcy0+aXNQcml2YXRlKSB7CgoKJHVybCA9ICR0aGlzLT5nZW5lcmF0ZVNzaFVybCgpOwp9IGVsc2UgewokdXJsID0gJHRoaXMtPmdldFVybCgpOwp9CgpyZXR1cm4gWyd0eXBlJyA9PiAnZ2l0JywgJ3VybCcgPT4gJHVybCwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewokdXJsID0gJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy96aXBiYWxsLycuJGlkZW50aWZpZXI7CgpyZXR1cm4gWyd0eXBlJyA9PiAnemlwJywgJ3VybCcgPT4gJHVybCwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXIsICdzaGFzdW0nID0+ICcnXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VySW5mb3JtYXRpb24oc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdKSkgewppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSAmJiAkcmVzID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRpZGVudGlmaWVyKSkgewokY29tcG9zZXIgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRyZXMpOwp9IGVsc2UgewokY29tcG9zZXIgPSAkdGhpcy0+Z2V0QmFzZUNvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwoKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikpIHsKJHRoaXMtPmNhY2hlLT53cml0ZSgkaWRlbnRpZmllciwganNvbl9lbmNvZGUoJGNvbXBvc2VyKSk7Cn0KfQoKaWYgKCRjb21wb3NlciAhPT0gbnVsbCkgewoKaWYgKGlzc2V0KCRjb21wb3Nlclsnc3VwcG9ydCddKSAmJiAhaXNfYXJyYXkoJGNvbXBvc2VyWydzdXBwb3J0J10pKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddID0gW107Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXVsnc291cmNlJ10pKSB7CiRsYWJlbCA9IGFycmF5X3NlYXJjaCgkaWRlbnRpZmllciwgJHRoaXMtPmdldFRhZ3MoKSkgPzogYXJyYXlfc2VhcmNoKCRpZGVudGlmaWVyLCAkdGhpcy0+Z2V0QnJhbmNoZXMoKSkgPzogJGlkZW50aWZpZXI7CiRjb21wb3Nlclsnc3VwcG9ydCddWydzb3VyY2UnXSA9IHNwcmludGYoJ2h0dHBzOi8vJXMvJXMvJXMvdHJlZS8lcycsICR0aGlzLT5vcmlnaW5VcmwsICR0aGlzLT5vd25lciwgJHRoaXMtPnJlcG9zaXRvcnksICRsYWJlbCk7Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXVsnaXNzdWVzJ10pICYmICR0aGlzLT5oYXNJc3N1ZXMpIHsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ2lzc3VlcyddID0gc3ByaW50ZignaHR0cHM6Ly8lcy8lcy8lcy9pc3N1ZXMnLCAkdGhpcy0+b3JpZ2luVXJsLCAkdGhpcy0+b3duZXIsICR0aGlzLT5yZXBvc2l0b3J5KTsKfQppZiAoIWlzc2V0KCRjb21wb3NlclsnYWJhbmRvbmVkJ10pICYmICR0aGlzLT5pc0FyY2hpdmVkKSB7CiRjb21wb3NlclsnYWJhbmRvbmVkJ10gPSB0cnVlOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydmdW5kaW5nJ10pICYmICRmdW5kaW5nID0gJHRoaXMtPmdldEZ1bmRpbmdJbmZvKCkpIHsKJGNvbXBvc2VyWydmdW5kaW5nJ10gPSAkZnVuZGluZzsKfQp9CgokdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9ICRjb21wb3NlcjsKfQoKcmV0dXJuICR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEZ1bmRpbmdJbmZvKCkKewppZiAobnVsbCAhPT0gJHRoaXMtPmZ1bmRpbmdJbmZvKSB7CnJldHVybiAkdGhpcy0+ZnVuZGluZ0luZm87Cn0KCmlmICgkdGhpcy0+b3JpZ2luVXJsICE9PSAnZ2l0aHViLmNvbScpIHsKcmV0dXJuICR0aGlzLT5mdW5kaW5nSW5mbyA9IGZhbHNlOwp9Cgpmb3JlYWNoIChbJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy9jb250ZW50cy8uZ2l0aHViL0ZVTkRJTkcueW1sJywgJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLy5naXRodWIvY29udGVudHMvRlVORElORy55bWwnXSBhcyAkZmlsZSkgewp0cnkgewokcmVzcG9uc2UgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkZmlsZSwgWwoncmV0cnktYXV0aC1mYWlsdXJlJyA9PiBmYWxzZSwKXSktPmRlY29kZUpzb24oKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CmNvbnRpbnVlOwp9CmlmIChlbXB0eSgkcmVzcG9uc2VbJ2NvbnRlbnQnXSkgfHwgJHJlc3BvbnNlWydlbmNvZGluZyddICE9PSAnYmFzZTY0JyB8fCAhKCRmdW5kaW5nID0gYmFzZTY0X2RlY29kZSgkcmVzcG9uc2VbJ2NvbnRlbnQnXSkpKSB7CmNvbnRpbnVlOwp9CmJyZWFrOwp9CmlmIChlbXB0eSgkZnVuZGluZykpIHsKcmV0dXJuICR0aGlzLT5mdW5kaW5nSW5mbyA9IGZhbHNlOwp9CgokcmVzdWx0ID0gW107CiRrZXkgPSBudWxsOwpmb3JlYWNoIChQcmVnOjpzcGxpdCgne1xyP1xufScsICRmdW5kaW5nKSBhcyAkbGluZSkgewokbGluZSA9IHRyaW0oJGxpbmUpOwppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oXHcrKVxzKjpccyooLispJH0nLCAkbGluZSwgJG1hdGNoKSkgewppZiAoJG1hdGNoWzJdID09PSAnWycpIHsKJGtleSA9ICRtYXRjaFsxXTsKY29udGludWU7Cn0KaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teXFsoLio/KVxdKD86XHMqIy4qKT8kfScsICRtYXRjaFsyXSwgJG1hdGNoMikpIHsKZm9yZWFjaCAoYXJyYXlfbWFwKCd0cmltJywgUHJlZzo6c3BsaXQoJ3tbXCciXT9ccyosXHMqW1wnIl0/fScsICRtYXRjaDJbMV0pKSBhcyAkaXRlbSkgewokcmVzdWx0W10gPSBbJ3R5cGUnID0+ICRtYXRjaFsxXSwgJ3VybCcgPT4gdHJpbSgkaXRlbSwgJyJcJyAnKV07Cn0KfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKFteI10uKj8pKD86XHMrIy4qKT8kfScsICRtYXRjaFsyXSwgJG1hdGNoMikpIHsKJHJlc3VsdFtdID0gWyd0eXBlJyA9PiAkbWF0Y2hbMV0sICd1cmwnID0+IHRyaW0oJG1hdGNoMlsxXSwgJyJcJyAnKV07Cn0KJGtleSA9IG51bGw7Cn0gZWxzZWlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihcdyspXHMqOlxzKiNccyokfScsICRsaW5lLCAkbWF0Y2gpKSB7CiRrZXkgPSAkbWF0Y2hbMV07Cn0gZWxzZWlmICgka2V5ICE9PSBudWxsICYmICgKUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14tXHMqKC4rKSg/OlxzKyMuKik/JH0nLCAkbGluZSwgJG1hdGNoKQp8fCBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiguKyksKD86XHMqIy4qKT8kfScsICRsaW5lLCAkbWF0Y2gpCikpIHsKJHJlc3VsdFtdID0gWyd0eXBlJyA9PiAka2V5LCAndXJsJyA9PiB0cmltKCRtYXRjaFsxXSwgJyJcJyAnKV07Cn0gZWxzZWlmICgka2V5ICE9PSBudWxsICYmICRsaW5lID09PSAnXScpIHsKJGtleSA9IG51bGw7Cn0KfQoKZm9yZWFjaCAoJHJlc3VsdCBhcyAka2V5ID0+ICRpdGVtKSB7CnN3aXRjaCAoJGl0ZW1bJ3R5cGUnXSkgewpjYXNlICdjb21tdW5pdHlfYnJpZGdlJzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly9mdW5kaW5nLmNvbW11bml0eWJyaWRnZS5vcmcvcHJvamVjdHMvJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdnaXRodWInOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL2dpdGh1Yi5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdpc3N1ZWh1bnQnOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL2lzc3VlaHVudC5pby9yLycgLiAkaXRlbVsndXJsJ107CmJyZWFrOwpjYXNlICdrb19maSc6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8va28tZmkuY29tLycgLiBiYXNlbmFtZSgkaXRlbVsndXJsJ10pOwpicmVhazsKY2FzZSAnbGliZXJhcGF5JzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly9saWJlcmFwYXkuY29tLycgLiBiYXNlbmFtZSgkaXRlbVsndXJsJ10pOwpicmVhazsKY2FzZSAnb3Blbl9jb2xsZWN0aXZlJzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdwYXRyZW9uJzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly93d3cucGF0cmVvbi5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICd0aWRlbGlmdCc6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViLycgLiAkaXRlbVsndXJsJ107CmJyZWFrOwpjYXNlICdwb2xhcic6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vcG9sYXIuc2gvJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdidXlfbWVfYV9jb2ZmZWUnOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tLycgLiBiYXNlbmFtZSgkaXRlbVsndXJsJ10pOwpicmVhazsKY2FzZSAndGhhbmtzX2Rldic6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vdGhhbmtzLmRldi8nIC4gJGl0ZW1bJ3VybCddOwpicmVhazsKY2FzZSAnb3RlY2hpZSc6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vb3RlY2hpZS5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdjdXN0b20nOgokYml0cyA9IHBhcnNlX3VybCgkaXRlbVsndXJsJ10pOwppZiAoJGJpdHMgPT09IGZhbHNlKSB7CnVuc2V0KCRyZXN1bHRbJGtleV0pOwpicmVhazsKfQoKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdzY2hlbWUnLCAkYml0cykgJiYgIWFycmF5X2tleV9leGlzdHMoJ2hvc3QnLCAkYml0cykpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teW2EtejAtOS1dKytcLlthLXpdezIsM30kfScsICRpdGVtWyd1cmwnXSkpIHsKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly8nLiRpdGVtWyd1cmwnXTsKYnJlYWs7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+RnVuZGluZyBVUkwgJy4kaXRlbVsndXJsJ10uJyBub3QgaW4gYSBzdXBwb3J0ZWQgZm9ybWF0Ljwvd2FybmluZz4nKTsKdW5zZXQoJHJlc3VsdFska2V5XSk7CmJyZWFrOwp9CmJyZWFrOwp9Cn0KCnJldHVybiAkdGhpcy0+ZnVuZGluZ0luZm8gPSAkcmVzdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldEZpbGVDb250ZW50KCRmaWxlLCAkaWRlbnRpZmllcik7Cn0KCiRyZXNvdXJjZSA9ICR0aGlzLT5nZXRBcGlVcmwoKSAuICcvcmVwb3MvJy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicvY29udGVudHMvJyAuICRmaWxlIC4gJz9yZWY9Jy51cmxlbmNvZGUoJGlkZW50aWZpZXIpOwokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlKS0+ZGVjb2RlSnNvbigpOwoKCgppZiAoKCFpc3NldCgkcmVzb3VyY2VbJ2NvbnRlbnQnXSkgfHwgJHJlc291cmNlWydjb250ZW50J10gPT09ICcnKSAmJiAkcmVzb3VyY2VbJ2VuY29kaW5nJ10gPT09ICdub25lJyAmJiBpc3NldCgkcmVzb3VyY2VbJ2dpdF91cmwnXSkpIHsKJHJlc291cmNlID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZVsnZ2l0X3VybCddKS0+ZGVjb2RlSnNvbigpOwp9CgppZiAoIWlzc2V0KCRyZXNvdXJjZVsnY29udGVudCddKSB8fCAkcmVzb3VyY2VbJ2VuY29kaW5nJ10gIT09ICdiYXNlNjQnIHx8IGZhbHNlID09PSAoJGNvbnRlbnQgPSBiYXNlNjRfZGVjb2RlKCRyZXNvdXJjZVsnY29udGVudCddKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcmV0cmlldmUgJyAuICRmaWxlIC4gJyBmb3IgJy4kaWRlbnRpZmllcik7Cn0KCnJldHVybiAkY29udGVudDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZURhdGUoc3RyaW5nICRpZGVudGlmaWVyKTogP1xEYXRlVGltZUltbXV0YWJsZQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRDaGFuZ2VEYXRlKCRpZGVudGlmaWVyKTsKfQoKJHJlc291cmNlID0gJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy9jb21taXRzLycudXJsZW5jb2RlKCRpZGVudGlmaWVyKTsKJGNvbW1pdCA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UpLT5kZWNvZGVKc29uKCk7CgpyZXR1cm4gbmV3IFxEYXRlVGltZUltbXV0YWJsZSgkY29tbWl0Wydjb21taXQnXVsnY29tbWl0dGVyJ11bJ2RhdGUnXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldFRhZ3MoKTsKfQppZiAobnVsbCA9PT0gJHRoaXMtPnRhZ3MpIHsKJHRhZ3MgPSBbXTsKJHJlc291cmNlID0gJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy90YWdzP3Blcl9wYWdlPTEwMCc7CgpkbyB7CiRyZXNwb25zZSA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UpOwokdGFnc0RhdGEgPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKZm9yZWFjaCAoJHRhZ3NEYXRhIGFzICR0YWcpIHsKJHRhZ3NbJHRhZ1snbmFtZSddXSA9ICR0YWdbJ2NvbW1pdCddWydzaGEnXTsKfQoKJHJlc291cmNlID0gJHRoaXMtPmdldE5leHRQYWdlKCRyZXNwb25zZSk7Cn0gd2hpbGUgKCRyZXNvdXJjZSk7CgokdGhpcy0+dGFncyA9ICR0YWdzOwp9CgpyZXR1cm4gJHRoaXMtPnRhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRCcmFuY2hlcygpOwp9CmlmIChudWxsID09PSAkdGhpcy0+YnJhbmNoZXMpIHsKJGJyYW5jaGVzID0gW107CiRyZXNvdXJjZSA9ICR0aGlzLT5nZXRBcGlVcmwoKSAuICcvcmVwb3MvJy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicvZ2l0L3JlZnMvaGVhZHM/cGVyX3BhZ2U9MTAwJzsKCmRvIHsKJHJlc3BvbnNlID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZSk7CiRicmFuY2hEYXRhID0gJHJlc3BvbnNlLT5kZWNvZGVKc29uKCk7CmZvcmVhY2ggKCRicmFuY2hEYXRhIGFzICRicmFuY2gpIHsKJG5hbWUgPSBzdWJzdHIoJGJyYW5jaFsncmVmJ10sIDExKTsKaWYgKCRuYW1lICE9PSAnZ2gtcGFnZXMnKSB7CiRicmFuY2hlc1skbmFtZV0gPSAkYnJhbmNoWydvYmplY3QnXVsnc2hhJ107Cn0KfQoKJHJlc291cmNlID0gJHRoaXMtPmdldE5leHRQYWdlKCRyZXNwb25zZSk7Cn0gd2hpbGUgKCRyZXNvdXJjZSk7CgokdGhpcy0+YnJhbmNoZXMgPSAkYnJhbmNoZXM7Cn0KCnJldHVybiAkdGhpcy0+YnJhbmNoZXM7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VwcG9ydHMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIGJvb2wgJGRlZXAgPSBmYWxzZSk6IGJvb2wKewppZiAoIVByZWc6OmlzTWF0Y2goJyNeKCg/Omh0dHBzP3xnaXQpOi8vKFteL10rKS98Z2l0QChbXjpdKyk6Lz8pKFteL10rKS8oW14vXSs/KSg/OlwuZ2l0fC8pPyQjJywgJHVybCwgJG1hdGNoZXMpKSB7CnJldHVybiBmYWxzZTsKfQoKJG9yaWdpblVybCA9ICRtYXRjaGVzWzJdID8/IChzdHJpbmcpICRtYXRjaGVzWzNdOwppZiAoIWluX2FycmF5KHN0cnRvbG93ZXIoUHJlZzo6cmVwbGFjZSgne153d3dcLn1pJywgJycsICRvcmlnaW5VcmwpKSwgJGNvbmZpZy0+Z2V0KCdnaXRodWItZG9tYWlucycpKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSB7CiRpby0+d3JpdGVFcnJvcignU2tpcHBpbmcgR2l0SHViIGRyaXZlciBmb3IgJy4kdXJsLicgYmVjYXVzZSB0aGUgT3BlblNTTCBQSFAgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb0RhdGEoKTogP2FycmF5CnsKJHRoaXMtPmZldGNoUm9vdElkZW50aWZpZXIoKTsKCnJldHVybiAkdGhpcy0+cmVwb0RhdGE7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZVNzaFVybCgpOiBzdHJpbmcKewppZiAoZmFsc2UgIT09IHN0cnBvcygkdGhpcy0+b3JpZ2luVXJsLCAnOicpKSB7CnJldHVybiAnc3NoOi8vZ2l0QCcgLiAkdGhpcy0+b3JpZ2luVXJsIC4gJy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9CgpyZXR1cm4gJ2dpdEAnIC4gJHRoaXMtPm9yaWdpblVybCAuICc6Jy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicuZ2l0JzsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbnRlbnRzKHN0cmluZyAkdXJsLCBib29sICRmZXRjaGluZ1JlcG9EYXRhID0gZmFsc2UpOiBSZXNwb25zZQp7CnRyeSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MsICR0aGlzLT5odHRwRG93bmxvYWRlcik7Cgpzd2l0Y2ggKCRlLT5nZXRDb2RlKCkpIHsKY2FzZSA0MDE6CmNhc2UgNDA0OgoKaWYgKCEkZmV0Y2hpbmdSZXBvRGF0YSkgewp0aHJvdyAkZTsKfQoKaWYgKCRnaXRIdWJVdGlsLT5hdXRob3JpemVPQXV0aCgkdGhpcy0+b3JpZ2luVXJsKSkgewpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKfQoKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokdGhpcy0+YXR0ZW1wdENsb25lRmFsbGJhY2soKTsKCnJldHVybiBuZXcgUmVzcG9uc2UoWyd1cmwnID0+ICdkdW1teSddLCAyMDAsIFtdLCAnbnVsbCcpOwp9Cgokc2NvcGVzSXNzdWVkID0gW107CiRzY29wZXNOZWVkZWQgPSBbXTsKaWYgKCRoZWFkZXJzID0gJGUtPmdldEhlYWRlcnMoKSkgewppZiAoJHNjb3BlcyA9IFJlc3BvbnNlOjpmaW5kSGVhZGVyVmFsdWUoJGhlYWRlcnMsICdYLU9BdXRoLVNjb3BlcycpKSB7CiRzY29wZXNJc3N1ZWQgPSBleHBsb2RlKCcgJywgJHNjb3Blcyk7Cn0KaWYgKCRzY29wZXMgPSBSZXNwb25zZTo6ZmluZEhlYWRlclZhbHVlKCRoZWFkZXJzLCAnWC1BY2NlcHRlZC1PQXV0aC1TY29wZXMnKSkgewokc2NvcGVzTmVlZGVkID0gZXhwbG9kZSgnICcsICRzY29wZXMpOwp9Cn0KJHNjb3Blc0ZhaWxlZCA9IGFycmF5X2RpZmYoJHNjb3Blc05lZWRlZCwgJHNjb3Blc0lzc3VlZCk7CgoKaWYgKCEkaGVhZGVycyB8fCAhY291bnQoJHNjb3Blc05lZWRlZCkgfHwgY291bnQoJHNjb3Blc0ZhaWxlZCkpIHsKJGdpdEh1YlV0aWwtPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseSgkdGhpcy0+b3JpZ2luVXJsLCAnWW91ciBHaXRIdWIgY3JlZGVudGlhbHMgYXJlIHJlcXVpcmVkIHRvIGZldGNoIHByaXZhdGUgcmVwb3NpdG9yeSBtZXRhZGF0YSAoPGluZm8+Jy4kdGhpcy0+dXJsLic8L2luZm8+KScpOwp9CgpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKCmNhc2UgNDAzOgppZiAoISR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJHRoaXMtPm9yaWdpblVybCkgJiYgJGdpdEh1YlV0aWwtPmF1dGhvcml6ZU9BdXRoKCR0aGlzLT5vcmlnaW5VcmwpKSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpICYmICRmZXRjaGluZ1JlcG9EYXRhKSB7CiR0aGlzLT5hdHRlbXB0Q2xvbmVGYWxsYmFjaygpOwoKcmV0dXJuIG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJ2R1bW15J10sIDIwMCwgW10sICdudWxsJyk7Cn0KCiRyYXRlTGltaXRlZCA9ICRnaXRIdWJVdGlsLT5pc1JhdGVMaW1pdGVkKChhcnJheSkgJGUtPmdldEhlYWRlcnMoKSk7CgppZiAoISR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJHRoaXMtPm9yaWdpblVybCkpIHsKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5HaXRIdWIgQVBJIGxpbWl0IGV4aGF1c3RlZC4gRmFpbGVkIHRvIGdldCBtZXRhZGF0YSBmb3IgdGhlICcuJHRoaXMtPnVybC4nIHJlcG9zaXRvcnksIHRyeSBydW5uaW5nIGluIGludGVyYWN0aXZlIG1vZGUgc28gdGhhdCB5b3UgY2FuIGVudGVyIHlvdXIgR2l0SHViIGNyZWRlbnRpYWxzIHRvIGluY3JlYXNlIHRoZSBBUEkgbGltaXQ8L2Vycm9yPicpOwp0aHJvdyAkZTsKfQoKJGdpdEh1YlV0aWwtPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseSgkdGhpcy0+b3JpZ2luVXJsLCAnQVBJIGxpbWl0IGV4aGF1c3RlZC4gRW50ZXIgeW91ciBHaXRIdWIgY3JlZGVudGlhbHMgdG8gZ2V0IGEgbGFyZ2VyIEFQSSBsaW1pdCAoPGluZm8+Jy4kdGhpcy0+dXJsLic8L2luZm8+KScpOwoKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7Cn0KCmlmICgkcmF0ZUxpbWl0ZWQpIHsKJHJhdGVMaW1pdCA9ICRnaXRIdWJVdGlsLT5nZXRSYXRlTGltaXQoJGUtPmdldEhlYWRlcnMoKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKAonPGVycm9yPkdpdEh1YiBBUEkgbGltaXQgKCVkIGNhbGxzL2hyKSBpcyBleGhhdXN0ZWQuIFlvdSBhcmUgYWxyZWFkeSBhdXRob3JpemVkIHNvIHlvdSBoYXZlIHRvIHdhaXQgdW50aWwgJXMgYmVmb3JlIGRvaW5nIG1vcmUgcmVxdWVzdHM8L2Vycm9yPicsCiRyYXRlTGltaXRbJ2xpbWl0J10sCiRyYXRlTGltaXRbJ3Jlc2V0J10KKSk7Cn0KCnRocm93ICRlOwoKZGVmYXVsdDoKdGhyb3cgJGU7Cn0KfQp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBmZXRjaFJvb3RJZGVudGlmaWVyKCk6IHZvaWQKewppZiAoJHRoaXMtPnJlcG9EYXRhKSB7CnJldHVybjsKfQoKJHJlcG9EYXRhVXJsID0gJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnk7Cgp0cnkgewokdGhpcy0+cmVwb0RhdGEgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlcG9EYXRhVXJsLCB0cnVlKS0+ZGVjb2RlSnNvbigpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKCRlLT5nZXRDb2RlKCkgPT09IDQ5OSkgewokdGhpcy0+YXR0ZW1wdENsb25lRmFsbGJhY2soKTsKfSBlbHNlIHsKdGhyb3cgJGU7Cn0KfQppZiAobnVsbCA9PT0gJHRoaXMtPnJlcG9EYXRhICYmIG51bGwgIT09ICR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuOwp9CgokdGhpcy0+b3duZXIgPSAkdGhpcy0+cmVwb0RhdGFbJ293bmVyJ11bJ2xvZ2luJ107CiR0aGlzLT5yZXBvc2l0b3J5ID0gJHRoaXMtPnJlcG9EYXRhWyduYW1lJ107CgokdGhpcy0+aXNQcml2YXRlID0gIWVtcHR5KCR0aGlzLT5yZXBvRGF0YVsncHJpdmF0ZSddKTsKaWYgKGlzc2V0KCR0aGlzLT5yZXBvRGF0YVsnZGVmYXVsdF9icmFuY2gnXSkpIHsKJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJHRoaXMtPnJlcG9EYXRhWydkZWZhdWx0X2JyYW5jaCddOwp9IGVsc2VpZiAoaXNzZXQoJHRoaXMtPnJlcG9EYXRhWydtYXN0ZXJfYnJhbmNoJ10pKSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICR0aGlzLT5yZXBvRGF0YVsnbWFzdGVyX2JyYW5jaCddOwp9IGVsc2UgewokdGhpcy0+cm9vdElkZW50aWZpZXIgPSAnbWFzdGVyJzsKfQokdGhpcy0+aGFzSXNzdWVzID0gIWVtcHR5KCR0aGlzLT5yZXBvRGF0YVsnaGFzX2lzc3VlcyddKTsKJHRoaXMtPmlzQXJjaGl2ZWQgPSAhZW1wdHkoJHRoaXMtPnJlcG9EYXRhWydhcmNoaXZlZCddKTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGF0dGVtcHRDbG9uZUZhbGxiYWNrKCk6IGJvb2wKewokdGhpcy0+aXNQcml2YXRlID0gdHJ1ZTsKCnRyeSB7CgoKCgokdGhpcy0+c2V0dXBHaXREcml2ZXIoJHRoaXMtPmdlbmVyYXRlU3NoVXJsKCkpOwoKcmV0dXJuIHRydWU7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5naXREcml2ZXIgPSBudWxsOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+RmFpbGVkIHRvIGNsb25lIHRoZSAnLiR0aGlzLT5nZW5lcmF0ZVNzaFVybCgpLicgcmVwb3NpdG9yeSwgdHJ5IHJ1bm5pbmcgaW4gaW50ZXJhY3RpdmUgbW9kZSBzbyB0aGF0IHlvdSBjYW4gZW50ZXIgeW91ciBHaXRIdWIgY3JlZGVudGlhbHM8L2Vycm9yPicpOwp0aHJvdyAkZTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0dXBHaXREcml2ZXIoc3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPmdpdERyaXZlciA9IG5ldyBHaXREcml2ZXIoClsndXJsJyA9PiAkdXJsXSwKJHRoaXMtPmlvLAokdGhpcy0+Y29uZmlnLAokdGhpcy0+aHR0cERvd25sb2FkZXIsCiR0aGlzLT5wcm9jZXNzCik7CiR0aGlzLT5naXREcml2ZXItPmluaXRpYWxpemUoKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldE5leHRQYWdlKFJlc3BvbnNlICRyZXNwb25zZSk6ID9zdHJpbmcKewokaGVhZGVyID0gJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2xpbmsnKTsKaWYgKCEkaGVhZGVyKSB7CnJldHVybiBudWxsOwp9CgokbGlua3MgPSBleHBsb2RlKCcsJywgJGhlYWRlcik7CmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewppZiAoUHJlZzo6aXNNYXRjaCgnezwoLis/KT47ICpyZWw9Im5leHQifScsICRsaW5rLCAkbWF0Y2gpKSB7CnJldHVybiAkbWF0Y2hbMV07Cn0KfQoKcmV0dXJuIG51bGw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXEdpdExhYjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKCgoKCgoKCmNsYXNzIEdpdExhYkRyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7CgoKCgpwcml2YXRlICRzY2hlbWU7Cgpwcml2YXRlICRuYW1lc3BhY2U7Cgpwcml2YXRlICRyZXBvc2l0b3J5OwoKCgoKcHJpdmF0ZSAkcHJvamVjdCA9IG51bGw7CgoKCgpwcml2YXRlICRjb21taXRzID0gW107CgoKcHJpdmF0ZSAkdGFnczsKCgpwcml2YXRlICRicmFuY2hlczsKCgoKCgoKcHJvdGVjdGVkICRnaXREcml2ZXIgPSBudWxsOwoKCgoKCgpwcm90ZWN0ZWQgJHByb3RvY29sOwoKCgoKCgpwcml2YXRlICRpc1ByaXZhdGUgPSB0cnVlOwoKCgoKcHJpdmF0ZSAkaGFzTm9uc3RhbmRhcmRPcmlnaW4gPSBmYWxzZTsKCnB1YmxpYyBjb25zdCBVUkxfUkVHRVggPSAnI14oPzooP1A8c2NoZW1lPmh0dHBzPyk6Ly8oP1A8ZG9tYWluPi4rPykoPzo6KD9QPHBvcnQ+WzAtOV0rKSk/L3xnaXRAKD9QPGRvbWFpbjI+W146XSspOikoP1A8cGFydHM+LispLyg/UDxyZXBvPlteL10rPykoPzpcLmdpdHwvKT8kIyc7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZAp7CmlmICghUHJlZzo6aXNNYXRjaChzZWxmOjpVUkxfUkVHRVgsICR0aGlzLT51cmwsICRtYXRjaCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIEdpdExhYiByZXBvc2l0b3J5IFVSTCAlcyBpcyBpbnZhbGlkLiBJdCBtdXN0IGJlIHRoZSBIVFRQIFVSTCBvZiBhIEdpdExhYiBwcm9qZWN0LicsICR0aGlzLT51cmwpKTsKfQoKJGd1ZXNzZWREb21haW4gPSAkbWF0Y2hbJ2RvbWFpbiddID8/IChzdHJpbmcpICRtYXRjaFsnZG9tYWluMiddOwokY29uZmlndXJlZERvbWFpbnMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyk7CiR1cmxQYXJ0cyA9IGV4cGxvZGUoJy8nLCAkbWF0Y2hbJ3BhcnRzJ10pOwoKJHRoaXMtPnNjaGVtZSA9IGluX2FycmF5KCRtYXRjaFsnc2NoZW1lJ10sIFsnaHR0cHMnLCAnaHR0cCddLCB0cnVlKQo/ICRtYXRjaFsnc2NoZW1lJ10KOiAoaXNzZXQoJHRoaXMtPnJlcG9Db25maWdbJ3NlY3VyZS1odHRwJ10pICYmICR0aGlzLT5yZXBvQ29uZmlnWydzZWN1cmUtaHR0cCddID09PSBmYWxzZSA/ICdodHRwJyA6ICdodHRwcycpCjsKJG9yaWdpbiA9IHNlbGY6OmRldGVybWluZU9yaWdpbigkY29uZmlndXJlZERvbWFpbnMsICRndWVzc2VkRG9tYWluLCAkdXJsUGFydHMsICRtYXRjaFsncG9ydCddKTsKaWYgKGZhbHNlID09PSAkb3JpZ2luKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0l0IHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gY3JlYXRlIGEgZ2l0bGFiIGRyaXZlciB3aXRoIGFuIHVucGFyc2FibGUgb3JpZ2luIFVSTCAoJy4kdGhpcy0+dXJsLicpJyk7Cn0KJHRoaXMtPm9yaWdpblVybCA9ICRvcmlnaW47CgppZiAoaXNfc3RyaW5nKCRwcm90b2NvbCA9ICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLXByb3RvY29sJykpKSB7CgppZiAoIWluX2FycmF5KCRwcm90b2NvbCwgWydnaXQnLCAnaHR0cCcsICdodHRwcyddLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ2dpdGxhYi1wcm90b2NvbCBtdXN0IGJlIG9uZSBvZiBnaXQsIGh0dHAuJyk7Cn0KJHRoaXMtPnByb3RvY29sID0gJHByb3RvY29sID09PSAnZ2l0JyA/ICdzc2gnIDogJ2h0dHAnOwp9CgppZiAoZmFsc2UgIT09IHN0cnBvcygkdGhpcy0+b3JpZ2luVXJsLCAnOicpIHx8IGZhbHNlICE9PSBzdHJwb3MoJHRoaXMtPm9yaWdpblVybCwgJy8nKSkgewokdGhpcy0+aGFzTm9uc3RhbmRhcmRPcmlnaW4gPSB0cnVlOwp9CgokdGhpcy0+bmFtZXNwYWNlID0gaW1wbG9kZSgnLycsICR1cmxQYXJ0cyk7CiR0aGlzLT5yZXBvc2l0b3J5ID0gUHJlZzo6cmVwbGFjZSgnIyhcLmdpdCkkIycsICcnLCAkbWF0Y2hbJ3JlcG8nXSk7CgokdGhpcy0+Y2FjaGUgPSBuZXcgQ2FjaGUoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlcG8tZGlyJykuJy8nLiR0aGlzLT5vcmlnaW5VcmwuJy8nLiR0aGlzLT5uYW1lc3BhY2UuJy8nLiR0aGlzLT5yZXBvc2l0b3J5KTsKJHRoaXMtPmNhY2hlLT5zZXRSZWFkT25seSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlYWQtb25seScpKTsKCiR0aGlzLT5mZXRjaFByb2plY3QoKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEh0dHBEb3dubG9hZGVyKEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlcik6IHZvaWQKewokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlckluZm9ybWF0aW9uKHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKfQoKaWYgKCFpc3NldCgkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSkpIHsKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikgJiYgJHJlcyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkaWRlbnRpZmllcikpIHsKJGNvbXBvc2VyID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkcmVzKTsKfSBlbHNlIHsKJGNvbXBvc2VyID0gJHRoaXMtPmdldEJhc2VDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKCmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpKSB7CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGlkZW50aWZpZXIsIGpzb25fZW5jb2RlKCRjb21wb3NlcikpOwp9Cn0KCmlmIChudWxsICE9PSAkY29tcG9zZXIpIHsKCmlmIChpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXSkgJiYgIWlzX2FycmF5KCRjb21wb3Nlclsnc3VwcG9ydCddKSkgewokY29tcG9zZXJbJ3N1cHBvcnQnXSA9IFtdOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddKSAmJiBpc3NldCgkdGhpcy0+cHJvamVjdFsnd2ViX3VybCddKSkgewokbGFiZWwgPSBhcnJheV9zZWFyY2goJGlkZW50aWZpZXIsICR0aGlzLT5nZXRUYWdzKCksIHRydWUpID86IGFycmF5X3NlYXJjaCgkaWRlbnRpZmllciwgJHRoaXMtPmdldEJyYW5jaGVzKCksIHRydWUpID86ICRpZGVudGlmaWVyOwokY29tcG9zZXJbJ3N1cHBvcnQnXVsnc291cmNlJ10gPSBzcHJpbnRmKCclcy8tL3RyZWUvJXMnLCAkdGhpcy0+cHJvamVjdFsnd2ViX3VybCddLCAkbGFiZWwpOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J11bJ2lzc3VlcyddKSAmJiAhZW1wdHkoJHRoaXMtPnByb2plY3RbJ2lzc3Vlc19lbmFibGVkJ10pICYmIGlzc2V0KCR0aGlzLT5wcm9qZWN0Wyd3ZWJfdXJsJ10pKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddWydpc3N1ZXMnXSA9IHNwcmludGYoJyVzLy0vaXNzdWVzJywgJHRoaXMtPnByb2plY3RbJ3dlYl91cmwnXSk7Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ2FiYW5kb25lZCddKSAmJiAhZW1wdHkoJHRoaXMtPnByb2plY3RbJ2FyY2hpdmVkJ10pKSB7CiRjb21wb3NlclsnYWJhbmRvbmVkJ10gPSB0cnVlOwp9Cn0KCiR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdID0gJGNvbXBvc2VyOwp9CgpyZXR1cm4gJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmcKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0RmlsZUNvbnRlbnQoJGZpbGUsICRpZGVudGlmaWVyKTsKfQoKCmlmICghUHJlZzo6aXNNYXRjaCgne1thLWYwLTldezQwfX1pJywgJGlkZW50aWZpZXIpKSB7CiRicmFuY2hlcyA9ICR0aGlzLT5nZXRCcmFuY2hlcygpOwppZiAoaXNzZXQoJGJyYW5jaGVzWyRpZGVudGlmaWVyXSkpIHsKJGlkZW50aWZpZXIgPSAkYnJhbmNoZXNbJGlkZW50aWZpZXJdOwp9Cn0KCiRyZXNvdXJjZSA9ICR0aGlzLT5nZXRBcGlVcmwoKS4nL3JlcG9zaXRvcnkvZmlsZXMvJy4kdGhpcy0+dXJsRW5jb2RlQWxsKCRmaWxlKS4nL3Jhdz9yZWY9Jy4kaWRlbnRpZmllcjsKCnRyeSB7CiRjb250ZW50ID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZSktPmdldEJvZHkoKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CmlmICgkZS0+Z2V0Q29kZSgpICE9PSA0MDQpIHsKdGhyb3cgJGU7Cn0KCnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGFuZ2VEYXRlKHN0cmluZyAkaWRlbnRpZmllcik6ID9cRGF0ZVRpbWVJbW11dGFibGUKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0Q2hhbmdlRGF0ZSgkaWRlbnRpZmllcik7Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29tbWl0c1skaWRlbnRpZmllcl0pKSB7CnJldHVybiBuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCR0aGlzLT5jb21taXRzWyRpZGVudGlmaWVyXVsnY29tbWl0dGVkX2RhdGUnXSk7Cn0KCnJldHVybiBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeVVybCgpOiBzdHJpbmcKewppZiAoJHRoaXMtPnByb3RvY29sKSB7CnJldHVybiAkdGhpcy0+cHJvamVjdFsieyR0aGlzLT5wcm90b2NvbH1fdXJsX3RvX3JlcG8iXTsKfQoKcmV0dXJuICR0aGlzLT5pc1ByaXZhdGUgPyAkdGhpcy0+cHJvamVjdFsnc3NoX3VybF90b19yZXBvJ10gOiAkdGhpcy0+cHJvamVjdFsnaHR0cF91cmxfdG9fcmVwbyddOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRVcmwoKTsKfQoKcmV0dXJuICR0aGlzLT5wcm9qZWN0Wyd3ZWJfdXJsJ107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CiR1cmwgPSAkdGhpcy0+Z2V0QXBpVXJsKCkuJy9yZXBvc2l0b3J5L2FyY2hpdmUuemlwP3NoYT0nLiRpZGVudGlmaWVyOwoKcmV0dXJuIFsndHlwZScgPT4gJ3ppcCcsICd1cmwnID0+ICR1cmwsICdyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyLCAnc2hhc3VtJyA9PiAnJ107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXkKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0U291cmNlKCRpZGVudGlmaWVyKTsKfQoKcmV0dXJuIFsndHlwZScgPT4gJ2dpdCcsICd1cmwnID0+ICR0aGlzLT5nZXRSZXBvc2l0b3J5VXJsKCksICdyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RJZGVudGlmaWVyKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpOwp9CgpyZXR1cm4gJHRoaXMtPnByb2plY3RbJ2RlZmF1bHRfYnJhbmNoJ107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRCcmFuY2hlcygpOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPmJyYW5jaGVzKSB7CiR0aGlzLT5icmFuY2hlcyA9ICR0aGlzLT5nZXRSZWZlcmVuY2VzKCdicmFuY2hlcycpOwp9CgpyZXR1cm4gJHRoaXMtPmJyYW5jaGVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRUYWdzKCk7Cn0KCmlmIChudWxsID09PSAkdGhpcy0+dGFncykgewokdGhpcy0+dGFncyA9ICR0aGlzLT5nZXRSZWZlcmVuY2VzKCd0YWdzJyk7Cn0KCnJldHVybiAkdGhpcy0+dGFnczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFwaVVybCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnNjaGVtZS4nOi8vJy4kdGhpcy0+b3JpZ2luVXJsLicvYXBpL3Y0L3Byb2plY3RzLycuJHRoaXMtPnVybEVuY29kZUFsbCgkdGhpcy0+bmFtZXNwYWNlKS4nJTJGJy4kdGhpcy0+dXJsRW5jb2RlQWxsKCR0aGlzLT5yZXBvc2l0b3J5KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1cmxFbmNvZGVBbGwoc3RyaW5nICRzdHJpbmcpOiBzdHJpbmcKewokZW5jb2RlZCA9ICcnOwpmb3IgKCRpID0gMDsgaXNzZXQoJHN0cmluZ1skaV0pOyAkaSsrKSB7CiRjaGFyYWN0ZXIgPSAkc3RyaW5nWyRpXTsKaWYgKCFjdHlwZV9hbG51bSgkY2hhcmFjdGVyKSAmJiAhaW5fYXJyYXkoJGNoYXJhY3RlciwgWyctJywgJ18nXSwgdHJ1ZSkpIHsKJGNoYXJhY3RlciA9ICclJyAuIHNwcmludGYoJyUwMlgnLCBvcmQoJGNoYXJhY3RlcikpOwp9CiRlbmNvZGVkIC49ICRjaGFyYWN0ZXI7Cn0KCnJldHVybiAkZW5jb2RlZDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFJlZmVyZW5jZXMoc3RyaW5nICR0eXBlKTogYXJyYXkKewokcGVyUGFnZSA9IDEwMDsKJHJlc291cmNlID0gJHRoaXMtPmdldEFwaVVybCgpLicvcmVwb3NpdG9yeS8nLiR0eXBlLic/cGVyX3BhZ2U9Jy4kcGVyUGFnZTsKCiRyZWZlcmVuY2VzID0gW107CmRvIHsKJHJlc3BvbnNlID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZSk7CiRkYXRhID0gJHJlc3BvbnNlLT5kZWNvZGVKc29uKCk7Cgpmb3JlYWNoICgkZGF0YSBhcyAkZGF0dW0pIHsKJHJlZmVyZW5jZXNbJGRhdHVtWyduYW1lJ11dID0gJGRhdHVtWydjb21taXQnXVsnaWQnXTsKCgoKJHRoaXMtPmNvbW1pdHNbJGRhdHVtWydjb21taXQnXVsnaWQnXV0gPSAkZGF0dW1bJ2NvbW1pdCddOwp9CgppZiAoY291bnQoJGRhdGEpID49ICRwZXJQYWdlKSB7CiRyZXNvdXJjZSA9ICR0aGlzLT5nZXROZXh0UGFnZSgkcmVzcG9uc2UpOwp9IGVsc2UgewokcmVzb3VyY2UgPSBmYWxzZTsKfQp9IHdoaWxlICgkcmVzb3VyY2UpOwoKcmV0dXJuICRyZWZlcmVuY2VzOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZmV0Y2hQcm9qZWN0KCk6IHZvaWQKewppZiAoIWlzX251bGwoJHRoaXMtPnByb2plY3QpKSB7CnJldHVybjsKfQoKCiRyZXNvdXJjZSA9ICR0aGlzLT5nZXRBcGlVcmwoKTsKJHRoaXMtPnByb2plY3QgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlLCB0cnVlKS0+ZGVjb2RlSnNvbigpOwppZiAoaXNzZXQoJHRoaXMtPnByb2plY3RbJ3Zpc2liaWxpdHknXSkpIHsKJHRoaXMtPmlzUHJpdmF0ZSA9ICR0aGlzLT5wcm9qZWN0Wyd2aXNpYmlsaXR5J10gIT09ICdwdWJsaWMnOwp9IGVsc2UgewoKJHRoaXMtPmlzUHJpdmF0ZSA9IGZhbHNlOwp9Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhdHRlbXB0Q2xvbmVGYWxsYmFjaygpOiBib29sCnsKaWYgKCR0aGlzLT5pc1ByaXZhdGUgPT09IGZhbHNlKSB7CiR1cmwgPSAkdGhpcy0+Z2VuZXJhdGVQdWJsaWNVcmwoKTsKfSBlbHNlIHsKJHVybCA9ICR0aGlzLT5nZW5lcmF0ZVNzaFVybCgpOwp9Cgp0cnkgewoKCgokdGhpcy0+c2V0dXBHaXREcml2ZXIoJHVybCk7CgpyZXR1cm4gdHJ1ZTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmdpdERyaXZlciA9IG51bGw7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5GYWlsZWQgdG8gY2xvbmUgdGhlICcuJHVybC4nIHJlcG9zaXRvcnksIHRyeSBydW5uaW5nIGluIGludGVyYWN0aXZlIG1vZGUgc28gdGhhdCB5b3UgY2FuIGVudGVyIHlvdXIgY3JlZGVudGlhbHM8L2Vycm9yPicpOwp0aHJvdyAkZTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVTc2hVcmwoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5oYXNOb25zdGFuZGFyZE9yaWdpbikgewpyZXR1cm4gJ3NzaDovL2dpdEAnLiR0aGlzLT5vcmlnaW5VcmwuJy8nLiR0aGlzLT5uYW1lc3BhY2UuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicuZ2l0JzsKfQoKcmV0dXJuICdnaXRAJyAuICR0aGlzLT5vcmlnaW5VcmwgLiAnOicuJHRoaXMtPm5hbWVzcGFjZS4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVQdWJsaWNVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zY2hlbWUgLiAnOi8vJyAuICR0aGlzLT5vcmlnaW5VcmwgLiAnLycuJHRoaXMtPm5hbWVzcGFjZS4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0dXBHaXREcml2ZXIoc3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPmdpdERyaXZlciA9IG5ldyBHaXREcml2ZXIoClsndXJsJyA9PiAkdXJsXSwKJHRoaXMtPmlvLAokdGhpcy0+Y29uZmlnLAokdGhpcy0+aHR0cERvd25sb2FkZXIsCiR0aGlzLT5wcm9jZXNzCik7CiR0aGlzLT5naXREcml2ZXItPmluaXRpYWxpemUoKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbnRlbnRzKHN0cmluZyAkdXJsLCBib29sICRmZXRjaGluZ1JlcG9EYXRhID0gZmFsc2UpOiBSZXNwb25zZQp7CnRyeSB7CiRyZXNwb25zZSA9IHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7CgppZiAoJGZldGNoaW5nUmVwb0RhdGEpIHsKJGpzb24gPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKCgoKCmlmICghaXNzZXQoJGpzb25bJ2RlZmF1bHRfYnJhbmNoJ10pICYmIGlzc2V0KCRqc29uWydwZXJtaXNzaW9ucyddKSkgewokdGhpcy0+aXNQcml2YXRlID0gJGpzb25bJ3Zpc2liaWxpdHknXSAhPT0gJ3B1YmxpYyc7CgokbW9yZVRoYW5HdWVzdEFjY2VzcyA9IGZhbHNlOwoKCgpmb3JlYWNoICgkanNvblsncGVybWlzc2lvbnMnXSBhcyAkcGVybWlzc2lvbikgewppZiAoJHBlcm1pc3Npb24gJiYgJHBlcm1pc3Npb25bJ2FjY2Vzc19sZXZlbCddID4gMTApIHsKJG1vcmVUaGFuR3Vlc3RBY2Nlc3MgPSB0cnVlOwp9Cn0KCmlmICghJG1vcmVUaGFuR3Vlc3RBY2Nlc3MpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5HaXRMYWIgdG9rZW4gd2l0aCBHdWVzdCBvbmx5IGFjY2VzcyBkZXRlY3RlZDwvd2FybmluZz4nKTsKCiR0aGlzLT5hdHRlbXB0Q2xvbmVGYWxsYmFjaygpOwoKcmV0dXJuIG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJ2R1bW15J10sIDIwMCwgW10sICdudWxsJyk7Cn0KfQoKCmlmICghaXNzZXQoJGpzb25bJ2RlZmF1bHRfYnJhbmNoJ10pKSB7CgppZiAoaXNzZXQoJGpzb25bJ3JlcG9zaXRvcnlfYWNjZXNzX2xldmVsJ10pICYmICRqc29uWydyZXBvc2l0b3J5X2FjY2Vzc19sZXZlbCddID09PSAnZGlzYWJsZWQnKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1RoZSBHaXRMYWIgcmVwb3NpdG9yeSBpcyBkaXNhYmxlZCBpbiB0aGUgcHJvamVjdCcsIDQwMCk7Cn0KCmlmICghZW1wdHkoJGpzb25bJ2lkJ10pKSB7CiR0aGlzLT5pc1ByaXZhdGUgPSBmYWxzZTsKfQoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignR2l0TGFiIEFQSSBzZWVtcyB0byBub3QgYmUgYXV0aGVudGljYXRlZCBhcyBpdCBkaWQgbm90IHJldHVybiBhIGRlZmF1bHRfYnJhbmNoJywgNDAxKTsKfQp9CgpyZXR1cm4gJHJlc3BvbnNlOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJGdpdExhYlV0aWwgPSBuZXcgR2l0TGFiKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MsICR0aGlzLT5odHRwRG93bmxvYWRlcik7Cgpzd2l0Y2ggKCRlLT5nZXRDb2RlKCkpIHsKY2FzZSA0MDE6CmNhc2UgNDA0OgoKaWYgKCEkZmV0Y2hpbmdSZXBvRGF0YSkgewp0aHJvdyAkZTsKfQoKaWYgKCRnaXRMYWJVdGlsLT5hdXRob3JpemVPQXV0aCgkdGhpcy0+b3JpZ2luVXJsKSkgewpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKfQoKaWYgKCRnaXRMYWJVdGlsLT5pc09BdXRoRXhwaXJlZCgkdGhpcy0+b3JpZ2luVXJsKSAmJiAkZ2l0TGFiVXRpbC0+YXV0aG9yaXplT0F1dGhSZWZyZXNoKCR0aGlzLT5zY2hlbWUsICR0aGlzLT5vcmlnaW5VcmwpKSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT5hdHRlbXB0Q2xvbmVGYWxsYmFjaygpOwoKcmV0dXJuIG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJ2R1bW15J10sIDIwMCwgW10sICdudWxsJyk7Cn0KJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5GYWlsZWQgdG8gZG93bmxvYWQgJyAuICR0aGlzLT5uYW1lc3BhY2UgLiAnLycgLiAkdGhpcy0+cmVwb3NpdG9yeSAuICc6JyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnPC93YXJuaW5nPicpOwokZ2l0TGFiVXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCR0aGlzLT5zY2hlbWUsICR0aGlzLT5vcmlnaW5VcmwsICdZb3VyIGNyZWRlbnRpYWxzIGFyZSByZXF1aXJlZCB0byBmZXRjaCBwcml2YXRlIHJlcG9zaXRvcnkgbWV0YWRhdGEgKDxpbmZvPicuJHRoaXMtPnVybC4nPC9pbmZvPiknKTsKCnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwoKY2FzZSA0MDM6CmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkdGhpcy0+b3JpZ2luVXJsKSAmJiAkZ2l0TGFiVXRpbC0+YXV0aG9yaXplT0F1dGgoJHRoaXMtPm9yaWdpblVybCkpIHsKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7Cn0KCmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkgJiYgJGZldGNoaW5nUmVwb0RhdGEpIHsKJHRoaXMtPmF0dGVtcHRDbG9uZUZhbGxiYWNrKCk7CgpyZXR1cm4gbmV3IFJlc3BvbnNlKFsndXJsJyA9PiAnZHVtbXknXSwgMjAwLCBbXSwgJ251bGwnKTsKfQoKdGhyb3cgJGU7CgpkZWZhdWx0Ogp0aHJvdyAkZTsKfQp9Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VwcG9ydHMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIGJvb2wgJGRlZXAgPSBmYWxzZSk6IGJvb2wKewppZiAoIVByZWc6OmlzTWF0Y2goc2VsZjo6VVJMX1JFR0VYLCAkdXJsLCAkbWF0Y2gpKSB7CnJldHVybiBmYWxzZTsKfQoKJHNjaGVtZSA9ICRtYXRjaFsnc2NoZW1lJ107CiRndWVzc2VkRG9tYWluID0gJG1hdGNoWydkb21haW4nXSA/PyAoc3RyaW5nKSAkbWF0Y2hbJ2RvbWFpbjInXTsKJHVybFBhcnRzID0gZXhwbG9kZSgnLycsICRtYXRjaFsncGFydHMnXSk7CgppZiAoZmFsc2UgPT09IHNlbGY6OmRldGVybWluZU9yaWdpbigkY29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksICRndWVzc2VkRG9tYWluLCAkdXJsUGFydHMsICRtYXRjaFsncG9ydCddKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgnaHR0cHMnID09PSAkc2NoZW1lICYmICFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpIHsKJGlvLT53cml0ZUVycm9yKCdTa2lwcGluZyBHaXRMYWIgZHJpdmVyIGZvciAnLiR1cmwuJyBiZWNhdXNlIHRoZSBPcGVuU1NMIFBIUCBleHRlbnNpb24gaXMgbWlzc2luZy4nLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CgpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvRGF0YSgpOiA/YXJyYXkKewokdGhpcy0+ZmV0Y2hQcm9qZWN0KCk7CgpyZXR1cm4gJHRoaXMtPnByb2plY3Q7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXROZXh0UGFnZShSZXNwb25zZSAkcmVzcG9uc2UpOiA/c3RyaW5nCnsKJGhlYWRlciA9ICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdsaW5rJyk7CgokbGlua3MgPSBleHBsb2RlKCcsJywgJGhlYWRlcik7CmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnezwoLis/KT47ICpyZWw9Im5leHQifScsICRsaW5rLCAkbWF0Y2gpKSB7CnJldHVybiAkbWF0Y2hbMV07Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBkZXRlcm1pbmVPcmlnaW4oYXJyYXkgJGNvbmZpZ3VyZWREb21haW5zLCBzdHJpbmcgJGd1ZXNzZWREb21haW4sIGFycmF5ICYkdXJsUGFydHMsID9zdHJpbmcgJHBvcnROdW1iZXIpCnsKJGd1ZXNzZWREb21haW4gPSBzdHJ0b2xvd2VyKCRndWVzc2VkRG9tYWluKTsKCmlmIChpbl9hcnJheSgkZ3Vlc3NlZERvbWFpbiwgJGNvbmZpZ3VyZWREb21haW5zKSB8fCAobnVsbCAhPT0gJHBvcnROdW1iZXIgJiYgaW5fYXJyYXkoJGd1ZXNzZWREb21haW4uJzonLiRwb3J0TnVtYmVyLCAkY29uZmlndXJlZERvbWFpbnMpKSkgewppZiAobnVsbCAhPT0gJHBvcnROdW1iZXIpIHsKcmV0dXJuICRndWVzc2VkRG9tYWluLic6Jy4kcG9ydE51bWJlcjsKfQoKcmV0dXJuICRndWVzc2VkRG9tYWluOwp9CgppZiAobnVsbCAhPT0gJHBvcnROdW1iZXIpIHsKJGd1ZXNzZWREb21haW4gLj0gJzonLiRwb3J0TnVtYmVyOwp9Cgp3aGlsZSAobnVsbCAhPT0gKCRwYXJ0ID0gYXJyYXlfc2hpZnQoJHVybFBhcnRzKSkpIHsKJGd1ZXNzZWREb21haW4gLj0gJy8nIC4gJHBhcnQ7CgppZiAoaW5fYXJyYXkoJGd1ZXNzZWREb21haW4sICRjb25maWd1cmVkRG9tYWlucykgfHwgKG51bGwgIT09ICRwb3J0TnVtYmVyICYmIGluX2FycmF5KFByZWc6OnJlcGxhY2UoJ3s6XGQrfScsICcnLCAkZ3Vlc3NlZERvbWFpbiksICRjb25maWd1cmVkRG9tYWlucykpKSB7CnJldHVybiAkZ3Vlc3NlZERvbWFpbjsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEhnIGFzIEhnVXRpbHM7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxVcmw7CgoKCgpjbGFzcyBIZ0RyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7Cgpwcm90ZWN0ZWQgJHRhZ3M7Cgpwcm90ZWN0ZWQgJGJyYW5jaGVzOwoKcHJvdGVjdGVkICRyb290SWRlbnRpZmllcjsKCnByb3RlY3RlZCAkcmVwb0RpcjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHRoaXMtPnVybCkpIHsKJHRoaXMtPnJlcG9EaXIgPSAkdGhpcy0+dXJsOwp9IGVsc2UgewppZiAoIUNhY2hlOjppc1VzYWJsZSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdIZ0RyaXZlciByZXF1aXJlcyBhIHVzYWJsZSBjYWNoZSBkaXJlY3RvcnksIGFuZCBpdCBsb29rcyBsaWtlIHlvdSBzZXQgaXQgdG8gYmUgZGlzYWJsZWQnKTsKfQoKJGNhY2hlRGlyID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJyk7CiR0aGlzLT5yZXBvRGlyID0gJGNhY2hlRGlyIC4gJy8nIC4gUHJlZzo6cmVwbGFjZSgne1teYS16MC05XX1pJywgJy0nLCBVcmw6OnNhbml0aXplKCR0aGlzLT51cmwpKSAuICcvJzsKCiRmcyA9IG5ldyBGaWxlc3lzdGVtKCk7CiRmcy0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRjYWNoZURpcik7CgppZiAoIWlzX3dyaXRhYmxlKGRpcm5hbWUoJHRoaXMtPnJlcG9EaXIpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NhbiBub3QgY2xvbmUgJy4kdGhpcy0+dXJsLicgdG8gYWNjZXNzIHBhY2thZ2UgaW5mb3JtYXRpb24uIFRoZSAiJy4kY2FjaGVEaXIuJyIgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSBieSB0aGUgY3VycmVudCB1c2VyLicpOwp9CgoKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdGhpcy0+dXJsLCAkdGhpcy0+aW8pOwoKJGhnVXRpbHMgPSBuZXcgSGdVdGlscygkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKCgppZiAoaXNfZGlyKCR0aGlzLT5yZXBvRGlyKSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ3N1bW1hcnknXSwgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpKSB7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ3B1bGwnXSwgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkZhaWxlZCB0byB1cGRhdGUgJy4kdGhpcy0+dXJsLicsIHBhY2thZ2UgaW5mb3JtYXRpb24gZnJvbSB0aGlzIHJlcG9zaXRvcnkgbWF5IGJlIG91dGRhdGVkICgnLiR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLicpPC9lcnJvcj4nKTsKfQp9IGVsc2UgewoKJGZzLT5yZW1vdmVEaXJlY3RvcnkoJHRoaXMtPnJlcG9EaXIpOwoKJHJlcG9EaXIgPSAkdGhpcy0+cmVwb0RpcjsKJGNvbW1hbmQgPSBzdGF0aWMgZnVuY3Rpb24gKCR1cmwpIHVzZSAoJHJlcG9EaXIpOiBhcnJheSB7CnJldHVybiBbJ2hnJywgJ2Nsb25lJywgJy0tbm91cGRhdGUnLCAnLS0nLCAkdXJsLCAkcmVwb0Rpcl07Cn07CgokaGdVdGlscy0+cnVuQ29tbWFuZCgkY29tbWFuZCwgJHRoaXMtPnVybCwgbnVsbCk7Cn0KfQoKJHRoaXMtPmdldFRhZ3MoKTsKJHRoaXMtPmdldEJyYW5jaGVzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewppZiAobnVsbCA9PT0gJHRoaXMtPnJvb3RJZGVudGlmaWVyKSB7CiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnaGcnLCAndGlwJywgJy0tdGVtcGxhdGUnLCAne25vZGV9J10sICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKTsKJG91dHB1dCA9ICR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpOwokdGhpcy0+cm9vdElkZW50aWZpZXIgPSAkb3V0cHV0WzBdOwp9CgpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5CnsKcmV0dXJuIFsndHlwZScgPT4gJ2hnJywgJ3VybCcgPT4gJHRoaXMtPmdldFVybCgpLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKaWYgKGlzc2V0KCRpZGVudGlmaWVyWzBdKSAmJiAkaWRlbnRpZmllclswXSA9PT0gJy0nKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCBoZyBpZGVudGlmaWVyIGRldGVjdGVkLiBJZGVudGlmaWVyIG11c3Qgbm90IHN0YXJ0IHdpdGggYSAtLCBnaXZlbjogJyAuICRpZGVudGlmaWVyKTsKfQoKJHJlc291cmNlID0gWydoZycsICdjYXQnLCAnLXInLCAkaWRlbnRpZmllciwgJy0tJywgJGZpbGVdOwokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkcmVzb3VyY2UsICRjb250ZW50LCAkdGhpcy0+cmVwb0Rpcik7CgppZiAoIXRyaW0oJGNvbnRlbnQpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGFuZ2VEYXRlKHN0cmluZyAkaWRlbnRpZmllcik6ID9cRGF0ZVRpbWVJbW11dGFibGUKewokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgKWydoZycsICdsb2cnLCAnLS10ZW1wbGF0ZScsICd7ZGF0ZXxyZmMzMzM5ZGF0ZX0nLCAnLXInLCAkaWRlbnRpZmllcl0sCiRvdXRwdXQsCiR0aGlzLT5yZXBvRGlyCik7CgpyZXR1cm4gbmV3IFxEYXRlVGltZUltbXV0YWJsZSh0cmltKCRvdXRwdXQpLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+dGFncykgewokdGFncyA9IFtdOwoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydoZycsICd0YWdzJ10sICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKTsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJHRhZykgewppZiAoJHRhZyAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcoXihbXlxzXSspXHMrXGQrOiguKikkKScsICR0YWcsICRtYXRjaCkpIHsKJHRhZ3NbJG1hdGNoWzFdXSA9ICRtYXRjaFsyXTsKfQp9CnVuc2V0KCR0YWdzWyd0aXAnXSk7CgokdGhpcy0+dGFncyA9ICR0YWdzOwp9CgpyZXR1cm4gJHRoaXMtPnRhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+YnJhbmNoZXMpIHsKJGJyYW5jaGVzID0gW107CiRib29rbWFya3MgPSBbXTsKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnaGcnLCAnYnJhbmNoZXMnXSwgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkYnJhbmNoKSB7CmlmICgkYnJhbmNoICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJyheKFteXHNdKylccytcZCs6KFthLWYwLTldKykpJywgJGJyYW5jaCwgJG1hdGNoKSAmJiAkbWF0Y2hbMV1bMF0gIT09ICctJykgewokYnJhbmNoZXNbJG1hdGNoWzFdXSA9ICRtYXRjaFsyXTsKfQp9CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ2Jvb2ttYXJrcyddLCAkb3V0cHV0LCAkdGhpcy0+cmVwb0Rpcik7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpIGFzICRicmFuY2gpIHsKaWYgKCRicmFuY2ggJiYgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnKF4oPzpbXHMqXSopKFteXHNdKylccytcZCs6KC4qKSQpJywgJGJyYW5jaCwgJG1hdGNoKSAmJiAkbWF0Y2hbMV1bMF0gIT09ICctJykgewokYm9va21hcmtzWyRtYXRjaFsxXV0gPSAkbWF0Y2hbMl07Cn0KfQoKCiR0aGlzLT5icmFuY2hlcyA9IGFycmF5X21lcmdlKCRib29rbWFya3MsICRicmFuY2hlcyk7Cn0KCnJldHVybiAkdGhpcy0+YnJhbmNoZXM7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VwcG9ydHMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIGJvb2wgJGRlZXAgPSBmYWxzZSk6IGJvb2wKewppZiAoUHJlZzo6aXNNYXRjaCgnIyheKD86aHR0cHM/fHNzaCk6Ly8oPzpbXkBdK0ApP2JpdGJ1Y2tldC5vcmd8aHR0cHM6Ly8oPzouKj8pXC5raWxuaGcuY29tKSNpJywgJHVybCkpIHsKcmV0dXJuIHRydWU7Cn0KCgppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHVybCkpIHsKJHVybCA9IEZpbGVzeXN0ZW06OmdldFBsYXRmb3JtUGF0aCgkdXJsKTsKaWYgKCFpc19kaXIoJHVybCkpIHsKcmV0dXJuIGZhbHNlOwp9CgokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKCmlmICgkcHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ3N1bW1hcnknXSwgJG91dHB1dCwgJHVybCkgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KfQoKaWYgKCEkZGVlcCkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokZXhpdCA9ICRwcm9jZXNzLT5leGVjdXRlKFsnaGcnLCAnaWRlbnRpZnknLCAnLS0nLCAkdXJsXSwgJGlnbm9yZWQpOwoKcmV0dXJuICRleGl0ID09PSAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcUGVyZm9yY2U7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUmVzcG9uc2U7CgoKCgpjbGFzcyBQZXJmb3JjZURyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7Cgpwcm90ZWN0ZWQgJGRlcG90OwoKcHJvdGVjdGVkICRicmFuY2g7Cgpwcm90ZWN0ZWQgJHBlcmZvcmNlID0gbnVsbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewokdGhpcy0+ZGVwb3QgPSAkdGhpcy0+cmVwb0NvbmZpZ1snZGVwb3QnXTsKJHRoaXMtPmJyYW5jaCA9ICcnOwppZiAoIWVtcHR5KCR0aGlzLT5yZXBvQ29uZmlnWydicmFuY2gnXSkpIHsKJHRoaXMtPmJyYW5jaCA9ICR0aGlzLT5yZXBvQ29uZmlnWydicmFuY2gnXTsKfQoKJHRoaXMtPmluaXRQZXJmb3JjZSgkdGhpcy0+cmVwb0NvbmZpZyk7CiR0aGlzLT5wZXJmb3JjZS0+cDRMb2dpbigpOwokdGhpcy0+cGVyZm9yY2UtPmNoZWNrU3RyZWFtKCk7CgokdGhpcy0+cGVyZm9yY2UtPndyaXRlUDRDbGllbnRTcGVjKCk7CiR0aGlzLT5wZXJmb3JjZS0+Y29ubmVjdENsaWVudCgpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGluaXRQZXJmb3JjZShhcnJheSAkcmVwb0NvbmZpZyk6IHZvaWQKewppZiAoIWVtcHR5KCR0aGlzLT5wZXJmb3JjZSkpIHsKcmV0dXJuOwp9CgppZiAoIUNhY2hlOjppc1VzYWJsZSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdQZXJmb3JjZURyaXZlciByZXF1aXJlcyBhIHVzYWJsZSBjYWNoZSBkaXJlY3RvcnksIGFuZCBpdCBsb29rcyBsaWtlIHlvdSBzZXQgaXQgdG8gYmUgZGlzYWJsZWQnKTsKfQoKJHJlcG9EaXIgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSAuICcvJyAuICR0aGlzLT5kZXBvdDsKJHRoaXMtPnBlcmZvcmNlID0gUGVyZm9yY2U6OmNyZWF0ZSgkcmVwb0NvbmZpZywgJHRoaXMtPmdldFVybCgpLCAkcmVwb0RpciwgJHRoaXMtPnByb2Nlc3MsICR0aGlzLT5pbyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPnBlcmZvcmNlLT5nZXRGaWxlQ29udGVudCgkZmlsZSwgJGlkZW50aWZpZXIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmJyYW5jaDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wZXJmb3JjZS0+Z2V0QnJhbmNoZXMoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnBlcmZvcmNlLT5nZXRUYWdzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5CnsKcmV0dXJuIFsKJ3R5cGUnID0+ICdwZXJmb3JjZScsCid1cmwnID0+ICR0aGlzLT5yZXBvQ29uZmlnWyd1cmwnXSwKJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXIsCidwNHVzZXInID0+ICR0aGlzLT5wZXJmb3JjZS0+Z2V0VXNlcigpLApdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQ29tcG9zZXJGaWxlKHN0cmluZyAkaWRlbnRpZmllcik6IGJvb2wKewokY29tcG9zZXJJbmZvID0gJHRoaXMtPnBlcmZvcmNlLT5nZXRDb21wb3NlckluZm9ybWF0aW9uKCcvLycgLiAkdGhpcy0+ZGVwb3QgLiAnLycgLiAkaWRlbnRpZmllcik7CgpyZXR1cm4gIWVtcHR5KCRjb21wb3NlckluZm8pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGVudHMoc3RyaW5nICR1cmwpOiBSZXNwb25zZQp7CnRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignTm90IGltcGxlbWVudGVkL3VzZWQgaW4gUGVyZm9yY2VEcml2ZXInKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmICgkZGVlcCB8fCBQcmVnOjppc01hdGNoKCcjXGIocGVyZm9yY2V8cDQpXGIjaScsICR1cmwpKSB7CnJldHVybiBQZXJmb3JjZTo6Y2hlY2tTZXJ2ZXJFeGlzdHMoJHVybCwgbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pKTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cCgpOiB2b2lkCnsKJHRoaXMtPnBlcmZvcmNlLT5jbGVhbnVwQ2xpZW50U3BlYygpOwokdGhpcy0+cGVyZm9yY2UgPSBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVwb3QoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5kZXBvdDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmJyYW5jaDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcVXJsOwp1c2UgQ29tcG9zZXJcVXRpbFxTdm4gYXMgU3ZuVXRpbDsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CgoKCgoKY2xhc3MgU3ZuRHJpdmVyIGV4dGVuZHMgVmNzRHJpdmVyCnsKCnByb3RlY3RlZCAkYmFzZVVybDsKCnByb3RlY3RlZCAkdGFnczsKCnByb3RlY3RlZCAkYnJhbmNoZXM7Cgpwcm90ZWN0ZWQgJHJvb3RJZGVudGlmaWVyOwoKCnByb3RlY3RlZCAkdHJ1bmtQYXRoID0gJ3RydW5rJzsKCnByb3RlY3RlZCAkYnJhbmNoZXNQYXRoID0gJ2JyYW5jaGVzJzsKCnByb3RlY3RlZCAkdGFnc1BhdGggPSAndGFncyc7Cgpwcm90ZWN0ZWQgJHBhY2thZ2VQYXRoID0gJyc7Cgpwcm90ZWN0ZWQgJGNhY2hlQ3JlZGVudGlhbHMgPSB0cnVlOwoKCgoKcHJpdmF0ZSAkdXRpbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewokdGhpcy0+dXJsID0gJHRoaXMtPmJhc2VVcmwgPSBydHJpbShzZWxmOjpub3JtYWxpemVVcmwoJHRoaXMtPnVybCksICcvJyk7CgpTdm5VdGlsOjpjbGVhbkVudigpOwoKaWYgKGlzc2V0KCR0aGlzLT5yZXBvQ29uZmlnWyd0cnVuay1wYXRoJ10pKSB7CiR0aGlzLT50cnVua1BhdGggPSAkdGhpcy0+cmVwb0NvbmZpZ1sndHJ1bmstcGF0aCddOwp9CmlmIChpc3NldCgkdGhpcy0+cmVwb0NvbmZpZ1snYnJhbmNoZXMtcGF0aCddKSkgewokdGhpcy0+YnJhbmNoZXNQYXRoID0gJHRoaXMtPnJlcG9Db25maWdbJ2JyYW5jaGVzLXBhdGgnXTsKfQppZiAoaXNzZXQoJHRoaXMtPnJlcG9Db25maWdbJ3RhZ3MtcGF0aCddKSkgewokdGhpcy0+dGFnc1BhdGggPSAkdGhpcy0+cmVwb0NvbmZpZ1sndGFncy1wYXRoJ107Cn0KaWYgKGFycmF5X2tleV9leGlzdHMoJ3N2bi1jYWNoZS1jcmVkZW50aWFscycsICR0aGlzLT5yZXBvQ29uZmlnKSkgewokdGhpcy0+Y2FjaGVDcmVkZW50aWFscyA9IChib29sKSAkdGhpcy0+cmVwb0NvbmZpZ1snc3ZuLWNhY2hlLWNyZWRlbnRpYWxzJ107Cn0KaWYgKGlzc2V0KCR0aGlzLT5yZXBvQ29uZmlnWydwYWNrYWdlLXBhdGgnXSkpIHsKJHRoaXMtPnBhY2thZ2VQYXRoID0gJy8nIC4gdHJpbSgkdGhpcy0+cmVwb0NvbmZpZ1sncGFja2FnZS1wYXRoJ10sICcvJyk7Cn0KCmlmIChmYWxzZSAhPT0gKCRwb3MgPSBzdHJycG9zKCR0aGlzLT51cmwsICcvJyAuICR0aGlzLT50cnVua1BhdGgpKSkgewokdGhpcy0+YmFzZVVybCA9IHN1YnN0cigkdGhpcy0+dXJsLCAwLCAkcG9zKTsKfQoKJHRoaXMtPmNhY2hlID0gbmV3IENhY2hlKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZXBvLWRpcicpLicvJy5QcmVnOjpyZXBsYWNlKCd7W15hLXowLTkuXX1pJywgJy0nLCBVcmw6OnNhbml0aXplKCR0aGlzLT5iYXNlVXJsKSkpOwokdGhpcy0+Y2FjaGUtPnNldFJlYWRPbmx5KCR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVhZC1vbmx5JykpOwoKJHRoaXMtPmdldEJyYW5jaGVzKCk7CiR0aGlzLT5nZXRUYWdzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyID86ICR0aGlzLT50cnVua1BhdGg7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT51cmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXkKewpyZXR1cm4gWyd0eXBlJyA9PiAnc3ZuJywgJ3VybCcgPT4gJHRoaXMtPmJhc2VVcmwsICdyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3Qoc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKcmV0dXJuIG51bGw7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBzaG91bGRDYWNoZShzdHJpbmcgJGlkZW50aWZpZXIpOiBib29sCnsKcmV0dXJuICR0aGlzLT5jYWNoZSAmJiBQcmVnOjppc01hdGNoKCd7QFxkKyR9JywgJGlkZW50aWZpZXIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJJbmZvcm1hdGlvbihzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewppZiAoIWlzc2V0KCR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdKSkgewppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSAmJiAkcmVzID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRpZGVudGlmaWVyLicuanNvbicpKSB7CgoKaWYgKCRyZXMgPT09ICciIicpIHsKJHJlcyA9ICdudWxsJzsKJHRoaXMtPmNhY2hlLT53cml0ZSgkaWRlbnRpZmllci4nLmpzb24nLCBqc29uX2VuY29kZShudWxsKSk7Cn0KCnJldHVybiAkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHJlcyk7Cn0KCnRyeSB7CiRjb21wb3NlciA9ICR0aGlzLT5nZXRCYXNlQ29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewokbWVzc2FnZSA9ICRlLT5nZXRNZXNzYWdlKCk7CmlmIChzdHJpcG9zKCRtZXNzYWdlLCAncGF0aCBub3QgZm91bmQnKSA9PT0gZmFsc2UgJiYgc3RyaXBvcygkbWVzc2FnZSwgJ3N2bjogd2FybmluZzogVzE2MDAxMycpID09PSBmYWxzZSkgewp0aHJvdyAkZTsKfQoKJGNvbXBvc2VyID0gbnVsbDsKfQoKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikpIHsKJHRoaXMtPmNhY2hlLT53cml0ZSgkaWRlbnRpZmllci4nLmpzb24nLCBqc29uX2VuY29kZSgkY29tcG9zZXIpKTsKfQoKJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl0gPSAkY29tcG9zZXI7Cn0KCgppZiAoIWlzX2FycmF5KCR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKJGlkZW50aWZpZXIgPSAnLycgLiB0cmltKCRpZGVudGlmaWVyLCAnLycpIC4gJy8nOwoKaWYgKFByZWc6OmlzTWF0Y2goJ3teKC4rPykoQFxkKyk/LyR9JywgJGlkZW50aWZpZXIsICRtYXRjaCkgJiYgJG1hdGNoWzJdICE9PSBudWxsKSB7CiRwYXRoID0gJG1hdGNoWzFdOwokcmV2ID0gJG1hdGNoWzJdOwp9IGVsc2UgewokcGF0aCA9ICRpZGVudGlmaWVyOwokcmV2ID0gJyc7Cn0KCnRyeSB7CiRyZXNvdXJjZSA9ICRwYXRoLiRmaWxlOwokb3V0cHV0ID0gJHRoaXMtPmV4ZWN1dGUoWydzdm4nLCAnY2F0J10sICR0aGlzLT5iYXNlVXJsIC4gJHJlc291cmNlIC4gJHJldik7CmlmICgnJyA9PT0gdHJpbSgkb3V0cHV0KSkgewpyZXR1cm4gbnVsbDsKfQp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCRlLT5nZXRNZXNzYWdlKCkpOwp9CgpyZXR1cm4gJG91dHB1dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZURhdGUoc3RyaW5nICRpZGVudGlmaWVyKTogP1xEYXRlVGltZUltbXV0YWJsZQp7CiRpZGVudGlmaWVyID0gJy8nIC4gdHJpbSgkaWRlbnRpZmllciwgJy8nKSAuICcvJzsKCmlmIChQcmVnOjppc01hdGNoKCd7XiguKz8pKEBcZCspPy8kfScsICRpZGVudGlmaWVyLCAkbWF0Y2gpICYmIG51bGwgIT09ICRtYXRjaFsyXSkgewokcGF0aCA9ICRtYXRjaFsxXTsKJHJldiA9ICRtYXRjaFsyXTsKfSBlbHNlIHsKJHBhdGggPSAkaWRlbnRpZmllcjsKJHJldiA9ICcnOwp9Cgokb3V0cHV0ID0gJHRoaXMtPmV4ZWN1dGUoWydzdm4nLCAnaW5mbyddLCAkdGhpcy0+YmFzZVVybCAuICRwYXRoIC4gJHJldik7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpIGFzICRsaW5lKSB7CmlmICgkbGluZSAhPT0gJycgJiYgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15MYXN0IENoYW5nZWQgRGF0ZTogKFteKF0rKX0nLCAkbGluZSwgJG1hdGNoKSkgewpyZXR1cm4gbmV3IFxEYXRlVGltZUltbXV0YWJsZSgkbWF0Y2hbMV0sIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT50YWdzKSB7CiR0YWdzID0gW107CgppZiAoJHRoaXMtPnRhZ3NQYXRoICE9PSBmYWxzZSkgewokb3V0cHV0ID0gJHRoaXMtPmV4ZWN1dGUoWydzdm4nLCAnbHMnLCAnLS12ZXJib3NlJ10sICR0aGlzLT5iYXNlVXJsIC4gJy8nIC4gJHRoaXMtPnRhZ3NQYXRoKTsKaWYgKCRvdXRwdXQgIT09ICcnKSB7CiRsYXN0UmV2ID0gMDsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGxpbmUpIHsKJGxpbmUgPSB0cmltKCRsaW5lKTsKaWYgKCRsaW5lICE9PSAnJyAmJiBQcmVnOjppc01hdGNoKCd7XlxzKihcUyspLio/KFxTKylccyokfScsICRsaW5lLCAkbWF0Y2gpKSB7CmlmICgkbWF0Y2hbMl0gPT09ICcuLycpIHsKJGxhc3RSZXYgPSAoaW50KSAkbWF0Y2hbMV07Cn0gZWxzZSB7CiR0YWdzW3J0cmltKCRtYXRjaFsyXSwgJy8nKV0gPSAkdGhpcy0+YnVpbGRJZGVudGlmaWVyKAonLycgLiAkdGhpcy0+dGFnc1BhdGggLiAnLycgLiAkbWF0Y2hbMl0sCm1heCgkbGFzdFJldiwgKGludCkgJG1hdGNoWzFdKQopOwp9Cn0KfQp9Cn0KCiR0aGlzLT50YWdzID0gJHRhZ3M7Cn0KCnJldHVybiAkdGhpcy0+dGFnczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5icmFuY2hlcykgewokYnJhbmNoZXMgPSBbXTsKCmlmIChmYWxzZSA9PT0gJHRoaXMtPnRydW5rUGF0aCkgewokdHJ1bmtQYXJlbnQgPSAkdGhpcy0+YmFzZVVybCAuICcvJzsKfSBlbHNlIHsKJHRydW5rUGFyZW50ID0gJHRoaXMtPmJhc2VVcmwgLiAnLycgLiAkdGhpcy0+dHJ1bmtQYXRoOwp9Cgokb3V0cHV0ID0gJHRoaXMtPmV4ZWN1dGUoWydzdm4nLCAnbHMnLCAnLS12ZXJib3NlJ10sICR0cnVua1BhcmVudCk7CmlmICgkb3V0cHV0ICE9PSAnJykgewpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkbGluZSkgewokbGluZSA9IHRyaW0oJGxpbmUpOwppZiAoJGxpbmUgIT09ICcnICYmIFByZWc6OmlzTWF0Y2goJ3teXHMqKFxTKykuKj8oXFMrKVxzKiR9JywgJGxpbmUsICRtYXRjaCkpIHsKaWYgKCRtYXRjaFsyXSA9PT0gJy4vJykgewokYnJhbmNoZXNbJ3RydW5rJ10gPSAkdGhpcy0+YnVpbGRJZGVudGlmaWVyKAonLycgLiAkdGhpcy0+dHJ1bmtQYXRoLAooaW50KSAkbWF0Y2hbMV0KKTsKJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJGJyYW5jaGVzWyd0cnVuayddOwpicmVhazsKfQp9Cn0KfQp1bnNldCgkb3V0cHV0KTsKCmlmICgkdGhpcy0+YnJhbmNoZXNQYXRoICE9PSBmYWxzZSkgewokb3V0cHV0ID0gJHRoaXMtPmV4ZWN1dGUoWydzdm4nLCAnbHMnLCAnLS12ZXJib3NlJ10sICR0aGlzLT5iYXNlVXJsIC4gJy8nIC4gJHRoaXMtPmJyYW5jaGVzUGF0aCk7CmlmICgkb3V0cHV0ICE9PSAnJykgewokbGFzdFJldiA9IDA7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKHRyaW0oJG91dHB1dCkpIGFzICRsaW5lKSB7CiRsaW5lID0gdHJpbSgkbGluZSk7CmlmICgkbGluZSAhPT0gJycgJiYgUHJlZzo6aXNNYXRjaCgne15ccyooXFMrKS4qPyhcUyspXHMqJH0nLCAkbGluZSwgJG1hdGNoKSkgewppZiAoJG1hdGNoWzJdID09PSAnLi8nKSB7CiRsYXN0UmV2ID0gKGludCkgJG1hdGNoWzFdOwp9IGVsc2UgewokYnJhbmNoZXNbcnRyaW0oJG1hdGNoWzJdLCAnLycpXSA9ICR0aGlzLT5idWlsZElkZW50aWZpZXIoCicvJyAuICR0aGlzLT5icmFuY2hlc1BhdGggLiAnLycgLiAkbWF0Y2hbMl0sCm1heCgkbGFzdFJldiwgKGludCkgJG1hdGNoWzFdKQopOwp9Cn0KfQp9Cn0KCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CiR1cmwgPSBzZWxmOjpub3JtYWxpemVVcmwoJHVybCk7CmlmIChQcmVnOjppc01hdGNoKCcjKF5zdm46Ly98XnN2blwrc3NoOi8vfHN2blwuKSNpJywgJHVybCkpIHsKcmV0dXJuIHRydWU7Cn0KCgppZiAoISRkZWVwICYmICFGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdXJsKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokZXhpdCA9ICRwcm9jZXNzLT5leGVjdXRlKFsnc3ZuJywgJ2luZm8nLCAnLS1ub24taW50ZXJhY3RpdmUnLCAnLS0nLCAkdXJsXSwgJGlnbm9yZWRPdXRwdXQpOwoKaWYgKCRleGl0ID09PSAwKSB7CgpyZXR1cm4gdHJ1ZTsKfQoKCmlmIChmYWxzZSAhPT0gc3RyaXBvcygkcHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJ2F1dGhvcml6YXRpb24gZmFpbGVkOicpKSB7CgoKcmV0dXJuIHRydWU7Cn0KCgppZiAoZmFsc2UgIT09IHN0cmlwb3MoJHByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCksICdBdXRoZW50aWNhdGlvbiBmYWlsZWQnKSkgewoKCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gbm9ybWFsaXplVXJsKHN0cmluZyAkdXJsKTogc3RyaW5nCnsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKaWYgKCRmcy0+aXNBYnNvbHV0ZVBhdGgoJHVybCkpIHsKcmV0dXJuICdmaWxlOi8vJyAuIHN0cnRyKCR1cmwsICdcXCcsICcvJyk7Cn0KCnJldHVybiAkdXJsOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKGFycmF5ICRjb21tYW5kLCBzdHJpbmcgJHVybCk6IHN0cmluZwp7CmlmIChudWxsID09PSAkdGhpcy0+dXRpbCkgewokdGhpcy0+dXRpbCA9IG5ldyBTdm5VdGlsKCR0aGlzLT5iYXNlVXJsLCAkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKJHRoaXMtPnV0aWwtPnNldENhY2hlQ3JlZGVudGlhbHMoJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMpOwp9Cgp0cnkgewpyZXR1cm4gJHRoaXMtPnV0aWwtPmV4ZWN1dGUoJGNvbW1hbmQsICR1cmwpOwp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewppZiAobnVsbCA9PT0gJHRoaXMtPnV0aWwtPmJpbmFyeVZlcnNpb24oKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBsb2FkICcuJHRoaXMtPnVybC4nLCBzdm4gd2FzIG5vdCBmb3VuZCwgY2hlY2sgdGhhdCBpdCBpcyBpbnN0YWxsZWQgYW5kIGluIHlvdXIgUEFUSCBlbnYuJyAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAonUmVwb3NpdG9yeSAnLiR0aGlzLT51cmwuJyBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkLCAnLiRlLT5nZXRNZXNzYWdlKCkKKTsKfQp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYnVpbGRJZGVudGlmaWVyKHN0cmluZyAkYmFzZURpciwgaW50ICRyZXZpc2lvbik6IHN0cmluZwp7CnJldHVybiBydHJpbSgkYmFzZURpciwgJy8nKSAuICR0aGlzLT5wYWNrYWdlUGF0aCAuICcvQCcgLiAkcmV2aXNpb247Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgVmNzRHJpdmVyIGltcGxlbWVudHMgVmNzRHJpdmVySW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkdXJsOwoKcHJvdGVjdGVkICRvcmlnaW5Vcmw7Cgpwcm90ZWN0ZWQgJHJlcG9Db25maWc7Cgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRjb25maWc7Cgpwcm90ZWN0ZWQgJHByb2Nlc3M7Cgpwcm90ZWN0ZWQgJGh0dHBEb3dubG9hZGVyOwoKcHJvdGVjdGVkICRpbmZvQ2FjaGUgPSBbXTsKCnByb3RlY3RlZCAkY2FjaGU7CgoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHJlcG9Db25maWcsIElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciwgUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzKQp7CmlmIChGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkcmVwb0NvbmZpZ1sndXJsJ10pKSB7CiRyZXBvQ29uZmlnWyd1cmwnXSA9IEZpbGVzeXN0ZW06OmdldFBsYXRmb3JtUGF0aCgkcmVwb0NvbmZpZ1sndXJsJ10pOwp9CgokdGhpcy0+dXJsID0gJHJlcG9Db25maWdbJ3VybCddOwokdGhpcy0+b3JpZ2luVXJsID0gJHJlcG9Db25maWdbJ3VybCddOwokdGhpcy0+cmVwb0NvbmZpZyA9ICRyZXBvQ29uZmlnOwokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXI7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3M7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBzaG91bGRDYWNoZShzdHJpbmcgJGlkZW50aWZpZXIpOiBib29sCnsKcmV0dXJuICR0aGlzLT5jYWNoZSAmJiBQcmVnOjppc01hdGNoKCd7XlthLWYwLTldezQwfSR9aUQnLCAkaWRlbnRpZmllcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlckluZm9ybWF0aW9uKHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CmlmICghaXNzZXQoJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl0pKSB7CmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpICYmICRyZXMgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJGlkZW50aWZpZXIpKSB7CnJldHVybiAkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHJlcyk7Cn0KCiRjb21wb3NlciA9ICR0aGlzLT5nZXRCYXNlQ29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7CgppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSkgewokdGhpcy0+Y2FjaGUtPndyaXRlKCRpZGVudGlmaWVyLCBKc29uRmlsZTo6ZW5jb2RlKCRjb21wb3NlciwgMCkpOwp9CgokdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9ICRjb21wb3NlcjsKfQoKcmV0dXJuICR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QmFzZUNvbXBvc2VySW5mb3JtYXRpb24oc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKJGNvbXBvc2VyRmlsZUNvbnRlbnQgPSAkdGhpcy0+Z2V0RmlsZUNvbnRlbnQoJ2NvbXBvc2VyLmpzb24nLCAkaWRlbnRpZmllcik7CgppZiAoISRjb21wb3NlckZpbGVDb250ZW50KSB7CnJldHVybiBudWxsOwp9CgokY29tcG9zZXIgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRjb21wb3NlckZpbGVDb250ZW50LCAkaWRlbnRpZmllciAuICc6Y29tcG9zZXIuanNvbicpOwoKaWYgKFtdID09PSAkY29tcG9zZXIgfHwgIWlzX2FycmF5KCRjb21wb3NlcikpIHsKcmV0dXJuIG51bGw7Cn0KCmlmIChlbXB0eSgkY29tcG9zZXJbJ3RpbWUnXSkgJiYgbnVsbCAhPT0gKCRjaGFuZ2VEYXRlID0gJHRoaXMtPmdldENoYW5nZURhdGUoJGlkZW50aWZpZXIpKSkgewokY29tcG9zZXJbJ3RpbWUnXSA9ICRjaGFuZ2VEYXRlLT5mb3JtYXQoREFURV9SRkMzMzM5KTsKfQoKcmV0dXJuICRjb21wb3NlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0NvbXBvc2VyRmlsZShzdHJpbmcgJGlkZW50aWZpZXIpOiBib29sCnsKdHJ5IHsKcmV0dXJuIG51bGwgIT09ICR0aGlzLT5nZXRDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRTY2hlbWUoKTogc3RyaW5nCnsKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewpyZXR1cm4gJ2h0dHBzJzsKfQoKcmV0dXJuICdodHRwJzsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb250ZW50cyhzdHJpbmcgJHVybCk6IFJlc3BvbnNlCnsKJG9wdGlvbnMgPSAkdGhpcy0+cmVwb0NvbmZpZ1snb3B0aW9ucyddID8/IFtdOwoKcmV0dXJuICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCR1cmwsICRvcHRpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoKTogdm9pZAp7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CgoKCgoKaW50ZXJmYWNlIFZjc0RyaXZlckludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJJbmZvcm1hdGlvbihzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZURhdGUoc3RyaW5nICRpZGVudGlmaWVyKTogP1xEYXRlVGltZUltbXV0YWJsZTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RJZGVudGlmaWVyKCk6IHN0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3Qoc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBzdHJpbmc7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0NvbXBvc2VyRmlsZShzdHJpbmcgJGlkZW50aWZpZXIpOiBib29sOwoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoKTogdm9pZDsKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbDsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXFZjc0RyaXZlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxWYWxpZGF0aW5nQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxJbnZhbGlkUGFja2FnZUV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXExvYWRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxVcmw7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25maWc7CgoKCgpjbGFzcyBWY3NSZXBvc2l0b3J5IGV4dGVuZHMgQXJyYXlSZXBvc2l0b3J5IGltcGxlbWVudHMgQ29uZmlndXJhYmxlUmVwb3NpdG9yeUludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJHVybDsKCnByb3RlY3RlZCAkcGFja2FnZU5hbWU7Cgpwcm90ZWN0ZWQgJGlzVmVyYm9zZTsKCnByb3RlY3RlZCAkaXNWZXJ5VmVyYm9zZTsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGNvbmZpZzsKCnByb3RlY3RlZCAkdmVyc2lvblBhcnNlcjsKCnByb3RlY3RlZCAkdHlwZTsKCnByb3RlY3RlZCAkbG9hZGVyOwoKcHJvdGVjdGVkICRyZXBvQ29uZmlnOwoKcHJvdGVjdGVkICRodHRwRG93bmxvYWRlcjsKCnByb3RlY3RlZCAkcHJvY2Vzc0V4ZWN1dG9yOwoKcHJvdGVjdGVkICRicmFuY2hFcnJvck9jY3VycmVkID0gZmFsc2U7Cgpwcml2YXRlICRkcml2ZXJzOwoKcHJpdmF0ZSAkZHJpdmVyOwoKcHJpdmF0ZSAkdmVyc2lvbkNhY2hlOwoKcHJpdmF0ZSAkZW1wdHlSZWZlcmVuY2VzID0gW107Cgpwcml2YXRlICR2ZXJzaW9uVHJhbnNwb3J0RXhjZXB0aW9ucyA9IFtdOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVwb0NvbmZpZywgSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyLCA/RXZlbnREaXNwYXRjaGVyICRkaXNwYXRjaGVyID0gbnVsbCwgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwsID9hcnJheSAkZHJpdmVycyA9IG51bGwsID9WZXJzaW9uQ2FjaGVJbnRlcmZhY2UgJHZlcnNpb25DYWNoZSA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgpOwokdGhpcy0+ZHJpdmVycyA9ICRkcml2ZXJzID86IFsKJ2dpdGh1YicgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXEdpdEh1YkRyaXZlcicsCidnaXRsYWInID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xHaXRMYWJEcml2ZXInLAonYml0YnVja2V0JyA9PiAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcR2l0Qml0YnVja2V0RHJpdmVyJywKJ2dpdC1iaXRidWNrZXQnID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xHaXRCaXRidWNrZXREcml2ZXInLAonZ2l0JyA9PiAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcR2l0RHJpdmVyJywKJ2hnJyA9PiAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcSGdEcml2ZXInLAoncGVyZm9yY2UnID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xQZXJmb3JjZURyaXZlcicsCidmb3NzaWwnID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xGb3NzaWxEcml2ZXInLAoKJ3N2bicgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXFN2bkRyaXZlcicsCl07CgokdGhpcy0+dXJsID0gJHJlcG9Db25maWdbJ3VybCddID0gUGxhdGZvcm06OmV4cGFuZFBhdGgoJHJlcG9Db25maWdbJ3VybCddKTsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+dHlwZSA9ICRyZXBvQ29uZmlnWyd0eXBlJ10gPz8gJ3Zjcyc7CiR0aGlzLT5pc1ZlcmJvc2UgPSAkaW8tPmlzVmVyYm9zZSgpOwokdGhpcy0+aXNWZXJ5VmVyYm9zZSA9ICRpby0+aXNWZXJ5VmVyYm9zZSgpOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnJlcG9Db25maWcgPSAkcmVwb0NvbmZpZzsKJHRoaXMtPnZlcnNpb25DYWNoZSA9ICR2ZXJzaW9uQ2FjaGU7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPnByb2Nlc3NFeGVjdXRvciA9ICRwcm9jZXNzID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCkKewokZHJpdmVyQ2xhc3MgPSBnZXRfY2xhc3MoJHRoaXMtPmdldERyaXZlcigpKTsKJGRyaXZlclR5cGUgPSBhcnJheV9zZWFyY2goJGRyaXZlckNsYXNzLCAkdGhpcy0+ZHJpdmVycyk7CmlmICghJGRyaXZlclR5cGUpIHsKJGRyaXZlclR5cGUgPSAkZHJpdmVyQ2xhc3M7Cn0KCnJldHVybiAndmNzIHJlcG8gKCcuJGRyaXZlclR5cGUuJyAnLlVybDo6c2FuaXRpemUoJHRoaXMtPnVybCkuJyknOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb0NvbmZpZygpCnsKcmV0dXJuICR0aGlzLT5yZXBvQ29uZmlnOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9hZGVyKExvYWRlckludGVyZmFjZSAkbG9hZGVyKTogdm9pZAp7CiR0aGlzLT5sb2FkZXIgPSAkbG9hZGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RHJpdmVyKCk6ID9WY3NEcml2ZXJJbnRlcmZhY2UKewppZiAoJHRoaXMtPmRyaXZlcikgewpyZXR1cm4gJHRoaXMtPmRyaXZlcjsKfQoKaWYgKGlzc2V0KCR0aGlzLT5kcml2ZXJzWyR0aGlzLT50eXBlXSkpIHsKJGNsYXNzID0gJHRoaXMtPmRyaXZlcnNbJHRoaXMtPnR5cGVdOwokdGhpcy0+ZHJpdmVyID0gbmV3ICRjbGFzcygkdGhpcy0+cmVwb0NvbmZpZywgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+aHR0cERvd25sb2FkZXIsICR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpOwokdGhpcy0+ZHJpdmVyLT5pbml0aWFsaXplKCk7CgpyZXR1cm4gJHRoaXMtPmRyaXZlcjsKfQoKZm9yZWFjaCAoJHRoaXMtPmRyaXZlcnMgYXMgJGRyaXZlcikgewppZiAoJGRyaXZlcjo6c3VwcG9ydHMoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+dXJsKSkgewokdGhpcy0+ZHJpdmVyID0gbmV3ICRkcml2ZXIoJHRoaXMtPnJlcG9Db25maWcsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPmh0dHBEb3dubG9hZGVyLCAkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yKTsKJHRoaXMtPmRyaXZlci0+aW5pdGlhbGl6ZSgpOwoKcmV0dXJuICR0aGlzLT5kcml2ZXI7Cn0KfQoKZm9yZWFjaCAoJHRoaXMtPmRyaXZlcnMgYXMgJGRyaXZlcikgewppZiAoJGRyaXZlcjo6c3VwcG9ydHMoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+dXJsLCB0cnVlKSkgewokdGhpcy0+ZHJpdmVyID0gbmV3ICRkcml2ZXIoJHRoaXMtPnJlcG9Db25maWcsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPmh0dHBEb3dubG9hZGVyLCAkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yKTsKJHRoaXMtPmRyaXZlci0+aW5pdGlhbGl6ZSgpOwoKcmV0dXJuICR0aGlzLT5kcml2ZXI7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYWRJbnZhbGlkQnJhbmNoZXMoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+YnJhbmNoRXJyb3JPY2N1cnJlZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVtcHR5UmVmZXJlbmNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZW1wdHlSZWZlcmVuY2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvblRyYW5zcG9ydEV4Y2VwdGlvbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnZlcnNpb25UcmFuc3BvcnRFeGNlcHRpb25zOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpCnsKcGFyZW50Ojppbml0aWFsaXplKCk7CgokaXNWZXJib3NlID0gJHRoaXMtPmlzVmVyYm9zZTsKJGlzVmVyeVZlcmJvc2UgPSAkdGhpcy0+aXNWZXJ5VmVyYm9zZTsKCiRkcml2ZXIgPSAkdGhpcy0+Z2V0RHJpdmVyKCk7CmlmICghJGRyaXZlcikgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignTm8gZHJpdmVyIGZvdW5kIHRvIGhhbmRsZSBWQ1MgcmVwb3NpdG9yeSAnLiR0aGlzLT51cmwpOwp9CgokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwppZiAoISR0aGlzLT5sb2FkZXIpIHsKJHRoaXMtPmxvYWRlciA9IG5ldyBBcnJheUxvYWRlcigkdGhpcy0+dmVyc2lvblBhcnNlcik7Cn0KCiRoYXNSb290SWRlbnRpZmllckNvbXBvc2VySnNvbiA9IGZhbHNlOwp0cnkgewokaGFzUm9vdElkZW50aWZpZXJDb21wb3Nlckpzb24gPSAkZHJpdmVyLT5oYXNDb21wb3NlckZpbGUoJGRyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKSk7CmlmICgkaGFzUm9vdElkZW50aWZpZXJDb21wb3Nlckpzb24pIHsKJGRhdGEgPSAkZHJpdmVyLT5nZXRDb21wb3NlckluZm9ybWF0aW9uKCRkcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCkpOwokdGhpcy0+cGFja2FnZU5hbWUgPSAhZW1wdHkoJGRhdGFbJ25hbWUnXSkgPyAkZGF0YVsnbmFtZSddIDogbnVsbDsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkdGhpcy0+c2hvdWxkUmV0aHJvd1RyYW5zcG9ydEV4Y2VwdGlvbigkZSkpIHsKdGhyb3cgJGU7Cn0KCmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Ta2lwcGVkIHBhcnNpbmcgJy4kZHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpLicsICcuJGUtPmdldE1lc3NhZ2UoKS4nPC9lcnJvcj4nKTsKfQp9Cgpmb3JlYWNoICgkZHJpdmVyLT5nZXRUYWdzKCkgYXMgJHRhZyA9PiAkaWRlbnRpZmllcikgewokdGFnID0gKHN0cmluZykgJHRhZzsKJG1zZyA9ICdSZWFkaW5nIGNvbXBvc2VyLmpzb24gb2YgPGluZm8+JyAuICgkdGhpcy0+cGFja2FnZU5hbWUgPzogJHRoaXMtPnVybCkgLiAnPC9pbmZvPiAoPGNvbW1lbnQ+JyAuICR0YWcgLiAnPC9jb21tZW50PiknOwoKCiR0YWcgPSBzdHJfcmVwbGFjZSgncmVsZWFzZS0nLCAnJywgJHRhZyk7CgokY2FjaGVkUGFja2FnZSA9ICR0aGlzLT5nZXRDYWNoZWRQYWNrYWdlVmVyc2lvbigkdGFnLCAkaWRlbnRpZmllciwgJGlzVmVyYm9zZSwgJGlzVmVyeVZlcmJvc2UpOwppZiAoJGNhY2hlZFBhY2thZ2UpIHsKJHRoaXMtPmFkZFBhY2thZ2UoJGNhY2hlZFBhY2thZ2UpOwoKY29udGludWU7Cn0KaWYgKCRjYWNoZWRQYWNrYWdlID09PSBmYWxzZSkgewokdGhpcy0+ZW1wdHlSZWZlcmVuY2VzW10gPSAkaWRlbnRpZmllcjsKCmNvbnRpbnVlOwp9CgppZiAoISRwYXJzZWRUYWcgPSAkdGhpcy0+dmFsaWRhdGVUYWcoJHRhZykpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCB0YWcgJy4kdGFnLicsIGludmFsaWQgdGFnIG5hbWU8L3dhcm5pbmc+Jyk7Cn0KY29udGludWU7Cn0KCmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1zZyk7Cn0gZWxzZWlmICgkaXNWZXJib3NlKSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoJG1zZywgZmFsc2UpOwp9Cgp0cnkgewokZGF0YSA9ICRkcml2ZXItPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwppZiAobnVsbCA9PT0gJGRhdGEpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCB0YWcgJy4kdGFnLicsIG5vIGNvbXBvc2VyIGZpbGU8L3dhcm5pbmc+Jyk7Cn0KJHRoaXMtPmVtcHR5UmVmZXJlbmNlc1tdID0gJGlkZW50aWZpZXI7CmNvbnRpbnVlOwp9CgoKaWYgKGlzc2V0KCRkYXRhWyd2ZXJzaW9uJ10pKSB7CiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJGRhdGFbJ3ZlcnNpb24nXSk7Cn0gZWxzZSB7CgokZGF0YVsndmVyc2lvbiddID0gJHRhZzsKJGRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddID0gJHBhcnNlZFRhZzsKfQoKCiRkYXRhWyd2ZXJzaW9uJ10gPSBQcmVnOjpyZXBsYWNlKCd7Wy4tXT9kZXYkfWknLCAnJywgJGRhdGFbJ3ZlcnNpb24nXSk7CiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9IFByZWc6OnJlcGxhY2UoJ3soXmRldi18Wy4tXT9kZXYkKX1pJywgJycsICRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSk7CgoKdW5zZXQoJGRhdGFbJ2RlZmF1bHQtYnJhbmNoJ10pOwoKCmlmICgkZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10gIT09ICRwYXJzZWRUYWcpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CmlmIChQcmVnOjppc01hdGNoKCd7KF5kZXYtfFsuLV0/ZGV2JCl9aScsICRwYXJzZWRUYWcpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCB0YWcgJy4kdGFnLicsIGludmFsaWQgdGFnIG5hbWUsIHRhZ3MgY2FuIG5vdCB1c2UgZGV2IHByZWZpeGVzIG9yIHN1ZmZpeGVzPC93YXJuaW5nPicpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNraXBwZWQgdGFnICcuJHRhZy4nLCB0YWcgKCcuJHBhcnNlZFRhZy4nKSBkb2VzIG5vdCBtYXRjaCB2ZXJzaW9uICgnLiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXS4nKSBpbiBjb21wb3Nlci5qc29uPC93YXJuaW5nPicpOwp9Cn0KY29udGludWU7Cn0KCiR0YWdQYWNrYWdlTmFtZSA9ICR0aGlzLT5wYWNrYWdlTmFtZSA/OiAoJGRhdGFbJ25hbWUnXSA/PyAnJyk7CmlmICgkZXhpc3RpbmdQYWNrYWdlID0gJHRoaXMtPmZpbmRQYWNrYWdlKCR0YWdQYWNrYWdlTmFtZSwgJGRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddKSkgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIHRhZyAnLiR0YWcuJywgaXQgY29uZmxpY3RzIHdpdGggYW4gYW5vdGhlciB0YWcgKCcuJGV4aXN0aW5nUGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLicpIGFzIGJvdGggcmVzb2x2ZSB0byAnLiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXS4nIGludGVybmFsbHk8L3dhcm5pbmc+Jyk7Cn0KY29udGludWU7Cn0KCmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0ltcG9ydGluZyB0YWcgJy4kdGFnLicgKCcuJGRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddLicpJyk7Cn0KCiR0aGlzLT5hZGRQYWNrYWdlKCR0aGlzLT5sb2FkZXItPmxvYWQoJHRoaXMtPnByZVByb2Nlc3MoJGRyaXZlciwgJGRhdGEsICRpZGVudGlmaWVyKSkpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbikgewokdGhpcy0+dmVyc2lvblRyYW5zcG9ydEV4Y2VwdGlvbnNbJ3RhZ3MnXVskdGFnXSA9ICRlOwppZiAoJGUtPmdldENvZGUoKSA9PT0gNDA0KSB7CiR0aGlzLT5lbXB0eVJlZmVyZW5jZXNbXSA9ICRpZGVudGlmaWVyOwp9CmlmICgkdGhpcy0+c2hvdWxkUmV0aHJvd1RyYW5zcG9ydEV4Y2VwdGlvbigkZSkpIHsKdGhyb3cgJGU7Cn0KfQppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIHRhZyAnLiR0YWcuJywgJy4oJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gPyAnbm8gY29tcG9zZXIgZmlsZSB3YXMgZm91bmQgKCcgLiAkZS0+Z2V0Q29kZSgpIC4gJyBIVFRQIHN0YXR1cyBjb2RlKScgOiAkZS0+Z2V0TWVzc2FnZSgpKS4nPC93YXJuaW5nPicpOwp9CmNvbnRpbnVlOwp9Cn0KCmlmICghJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT5vdmVyd3JpdGVFcnJvcignJywgZmFsc2UpOwp9CgokYnJhbmNoZXMgPSAkZHJpdmVyLT5nZXRCcmFuY2hlcygpOwoKaWYgKCRoYXNSb290SWRlbnRpZmllckNvbXBvc2VySnNvbiAmJiBpc3NldCgkYnJhbmNoZXNbJGRyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKV0pKSB7CiRicmFuY2hlcyA9IFskZHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpID0+ICRicmFuY2hlc1skZHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpXV0gKyAkYnJhbmNoZXM7Cn0KCmZvcmVhY2ggKCRicmFuY2hlcyBhcyAkYnJhbmNoID0+ICRpZGVudGlmaWVyKSB7CiRicmFuY2ggPSAoc3RyaW5nKSAkYnJhbmNoOwokbXNnID0gJ1JlYWRpbmcgY29tcG9zZXIuanNvbiBvZiA8aW5mbz4nIC4gKCR0aGlzLT5wYWNrYWdlTmFtZSA/OiAkdGhpcy0+dXJsKSAuICc8L2luZm8+ICg8Y29tbWVudD4nIC4gJGJyYW5jaCAuICc8L2NvbW1lbnQ+KSc7CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1zZyk7Cn0gZWxzZWlmICgkaXNWZXJib3NlKSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoJG1zZywgZmFsc2UpOwp9CgppZiAoISRwYXJzZWRCcmFuY2ggPSAkdGhpcy0+dmFsaWRhdGVCcmFuY2goJGJyYW5jaCkpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCBicmFuY2ggJy4kYnJhbmNoLicsIGludmFsaWQgbmFtZTwvd2FybmluZz4nKTsKfQpjb250aW51ZTsKfQoKCmlmIChzdHJwb3MoJHBhcnNlZEJyYW5jaCwgJ2Rldi0nKSA9PT0gMCB8fCBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUyA9PT0gJHBhcnNlZEJyYW5jaCkgewokdmVyc2lvbiA9ICdkZXYtJyAuIHN0cl9yZXBsYWNlKCcjJywgJysnLCAkYnJhbmNoKTsKJHBhcnNlZEJyYW5jaCA9IHN0cl9yZXBsYWNlKCcjJywgJysnLCAkcGFyc2VkQnJhbmNoKTsKfSBlbHNlIHsKJHByZWZpeCA9IHN0cnBvcygkYnJhbmNoLCAndicpID09PSAwID8gJ3YnIDogJyc7CiR2ZXJzaW9uID0gJHByZWZpeCAuIFByZWc6OnJlcGxhY2UoJ3soXC45ezd9KSt9JywgJy54JywgJHBhcnNlZEJyYW5jaCk7Cn0KCiRjYWNoZWRQYWNrYWdlID0gJHRoaXMtPmdldENhY2hlZFBhY2thZ2VWZXJzaW9uKCR2ZXJzaW9uLCAkaWRlbnRpZmllciwgJGlzVmVyYm9zZSwgJGlzVmVyeVZlcmJvc2UsICRkcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCkgPT09ICRicmFuY2gpOwppZiAoJGNhY2hlZFBhY2thZ2UpIHsKJHRoaXMtPmFkZFBhY2thZ2UoJGNhY2hlZFBhY2thZ2UpOwoKY29udGludWU7Cn0KaWYgKCRjYWNoZWRQYWNrYWdlID09PSBmYWxzZSkgewokdGhpcy0+ZW1wdHlSZWZlcmVuY2VzW10gPSAkaWRlbnRpZmllcjsKCmNvbnRpbnVlOwp9Cgp0cnkgewokZGF0YSA9ICRkcml2ZXItPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwppZiAobnVsbCA9PT0gJGRhdGEpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCBicmFuY2ggJy4kYnJhbmNoLicsIG5vIGNvbXBvc2VyIGZpbGU8L3dhcm5pbmc+Jyk7Cn0KJHRoaXMtPmVtcHR5UmVmZXJlbmNlc1tdID0gJGlkZW50aWZpZXI7CmNvbnRpbnVlOwp9CgoKJGRhdGFbJ3ZlcnNpb24nXSA9ICR2ZXJzaW9uOwokZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkcGFyc2VkQnJhbmNoOwoKdW5zZXQoJGRhdGFbJ2RlZmF1bHQtYnJhbmNoJ10pOwppZiAoJGRyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKSA9PT0gJGJyYW5jaCkgewokZGF0YVsnZGVmYXVsdC1icmFuY2gnXSA9IHRydWU7Cn0KCmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0ltcG9ydGluZyBicmFuY2ggJy4kYnJhbmNoLicgKCcuJGRhdGFbJ3ZlcnNpb24nXS4nKScpOwp9CgokcGFja2FnZURhdGEgPSAkdGhpcy0+cHJlUHJvY2VzcygkZHJpdmVyLCAkZGF0YSwgJGlkZW50aWZpZXIpOwokcGFja2FnZSA9ICR0aGlzLT5sb2FkZXItPmxvYWQoJHBhY2thZ2VEYXRhKTsKaWYgKCR0aGlzLT5sb2FkZXIgaW5zdGFuY2VvZiBWYWxpZGF0aW5nQXJyYXlMb2FkZXIgJiYgXGNvdW50KCR0aGlzLT5sb2FkZXItPmdldFdhcm5pbmdzKCkpID4gMCkgewp0aHJvdyBuZXcgSW52YWxpZFBhY2thZ2VFeGNlcHRpb24oJHRoaXMtPmxvYWRlci0+Z2V0RXJyb3JzKCksICR0aGlzLT5sb2FkZXItPmdldFdhcm5pbmdzKCksICRwYWNrYWdlRGF0YSk7Cn0KJHRoaXMtPmFkZFBhY2thZ2UoJHBhY2thZ2UpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJHRoaXMtPnZlcnNpb25UcmFuc3BvcnRFeGNlcHRpb25zWydicmFuY2hlcyddWyRicmFuY2hdID0gJGU7CmlmICgkZS0+Z2V0Q29kZSgpID09PSA0MDQpIHsKJHRoaXMtPmVtcHR5UmVmZXJlbmNlc1tdID0gJGlkZW50aWZpZXI7Cn0KaWYgKCR0aGlzLT5zaG91bGRSZXRocm93VHJhbnNwb3J0RXhjZXB0aW9uKCRlKSkgewp0aHJvdyAkZTsKfQppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIGJyYW5jaCAnLiRicmFuY2guJywgbm8gY29tcG9zZXIgZmlsZSB3YXMgZm91bmQgKCcgLiAkZS0+Z2V0Q29kZSgpIC4gJyBIVFRQIHN0YXR1cyBjb2RlKTwvd2FybmluZz4nKTsKfQpjb250aW51ZTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoISRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7Cn0KJHRoaXMtPmJyYW5jaEVycm9yT2NjdXJyZWQgPSB0cnVlOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Ta2lwcGVkIGJyYW5jaCAnLiRicmFuY2guJywgJy4kZS0+Z2V0TWVzc2FnZSgpLic8L2Vycm9yPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJycpOwpjb250aW51ZTsKfQp9CiRkcml2ZXItPmNsZWFudXAoKTsKCmlmICghJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT5vdmVyd3JpdGVFcnJvcignJywgZmFsc2UpOwp9CgppZiAoISR0aGlzLT5nZXRQYWNrYWdlcygpKSB7CnRocm93IG5ldyBJbnZhbGlkUmVwb3NpdG9yeUV4Y2VwdGlvbignTm8gdmFsaWQgY29tcG9zZXIuanNvbiB3YXMgZm91bmQgaW4gYW55IGJyYW5jaCBvciB0YWcgb2YgJy4kdGhpcy0+dXJsLicsIGNvdWxkIG5vdCBsb2FkIGEgcGFja2FnZSBmcm9tIGl0LicpOwp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByZVByb2Nlc3MoVmNzRHJpdmVySW50ZXJmYWNlICRkcml2ZXIsIGFycmF5ICRkYXRhLCBzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CgoKCiRkYXRhUGFja2FnZU5hbWUgPSAkZGF0YVsnbmFtZSddID8/IG51bGw7CiRkYXRhWyduYW1lJ10gPSAkdGhpcy0+cGFja2FnZU5hbWUgPzogJGRhdGFQYWNrYWdlTmFtZTsKCmlmICghaXNzZXQoJGRhdGFbJ2Rpc3QnXSkpIHsKJGRhdGFbJ2Rpc3QnXSA9ICRkcml2ZXItPmdldERpc3QoJGlkZW50aWZpZXIpOwp9CmlmICghaXNzZXQoJGRhdGFbJ3NvdXJjZSddKSkgewokZGF0YVsnc291cmNlJ10gPSAkZHJpdmVyLT5nZXRTb3VyY2UoJGlkZW50aWZpZXIpOwp9CgoKaWYgKGlzX2FycmF5KCRkYXRhWydkaXN0J10pICYmICFpc3NldCgkZGF0YVsnZGlzdCddWydyZWZlcmVuY2UnXSkgJiYgaXNzZXQoJGRhdGFbJ3NvdXJjZSddWydyZWZlcmVuY2UnXSkpIHsKJGRhdGFbJ2Rpc3QnXVsncmVmZXJlbmNlJ10gPSAkZGF0YVsnc291cmNlJ11bJ3JlZmVyZW5jZSddOwp9CgpyZXR1cm4gJGRhdGE7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVCcmFuY2goc3RyaW5nICRicmFuY2gpCnsKdHJ5IHsKJG5vcm1hbGl6ZWRCcmFuY2ggPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKCRicmFuY2gpOwoKCiR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRub3JtYWxpemVkQnJhbmNoKTsKCnJldHVybiAkbm9ybWFsaXplZEJyYW5jaDsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVUYWcoc3RyaW5nICR2ZXJzaW9uKQp7CnRyeSB7CnJldHVybiAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q2FjaGVkUGFja2FnZVZlcnNpb24oc3RyaW5nICR2ZXJzaW9uLCBzdHJpbmcgJGlkZW50aWZpZXIsIGJvb2wgJGlzVmVyYm9zZSwgYm9vbCAkaXNWZXJ5VmVyYm9zZSwgYm9vbCAkaXNEZWZhdWx0QnJhbmNoID0gZmFsc2UpCnsKaWYgKCEkdGhpcy0+dmVyc2lvbkNhY2hlKSB7CnJldHVybiBudWxsOwp9CgokY2FjaGVkUGFja2FnZSA9ICR0aGlzLT52ZXJzaW9uQ2FjaGUtPmdldFZlcnNpb25QYWNrYWdlKCR2ZXJzaW9uLCAkaWRlbnRpZmllcik7CmlmICgkY2FjaGVkUGFja2FnZSA9PT0gZmFsc2UpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCAnLiR2ZXJzaW9uLicsIG5vIGNvbXBvc2VyIGZpbGUgKGNhY2hlZCBmcm9tIHJlZiAnLiRpZGVudGlmaWVyLicpPC93YXJuaW5nPicpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkY2FjaGVkUGFja2FnZSkgewokbXNnID0gJ0ZvdW5kIGNhY2hlZCBjb21wb3Nlci5qc29uIG9mIDxpbmZvPicgLiAoJHRoaXMtPnBhY2thZ2VOYW1lID86ICR0aGlzLT51cmwpIC4gJzwvaW5mbz4gKDxjb21tZW50PicgLiAkdmVyc2lvbiAuICc8L2NvbW1lbnQ+KSc7CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1zZyk7Cn0gZWxzZWlmICgkaXNWZXJib3NlKSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoJG1zZywgZmFsc2UpOwp9Cgp1bnNldCgkY2FjaGVkUGFja2FnZVsnZGVmYXVsdC1icmFuY2gnXSk7CmlmICgkaXNEZWZhdWx0QnJhbmNoKSB7CiRjYWNoZWRQYWNrYWdlWydkZWZhdWx0LWJyYW5jaCddID0gdHJ1ZTsKfQoKaWYgKCRleGlzdGluZ1BhY2thZ2UgPSAkdGhpcy0+ZmluZFBhY2thZ2UoJGNhY2hlZFBhY2thZ2VbJ25hbWUnXSwgbmV3IENvbnN0cmFpbnQoJz0nLCAkY2FjaGVkUGFja2FnZVsndmVyc2lvbl9ub3JtYWxpemVkJ10pKSkgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIGNhY2hlZCB2ZXJzaW9uICcuJHZlcnNpb24uJywgaXQgY29uZmxpY3RzIHdpdGggYW4gYW5vdGhlciB0YWcgKCcuJGV4aXN0aW5nUGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLicpIGFzIGJvdGggcmVzb2x2ZSB0byAnLiRjYWNoZWRQYWNrYWdlWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXS4nIGludGVybmFsbHk8L3dhcm5pbmc+Jyk7Cn0KJGNhY2hlZFBhY2thZ2UgPSBudWxsOwp9Cn0KCmlmICgkY2FjaGVkUGFja2FnZSkgewpyZXR1cm4gJHRoaXMtPmxvYWRlci0+bG9hZCgkY2FjaGVkUGFja2FnZSk7Cn0KCnJldHVybiBudWxsOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNob3VsZFJldGhyb3dUcmFuc3BvcnRFeGNlcHRpb24oVHJhbnNwb3J0RXhjZXB0aW9uICRlKTogYm9vbAp7CnJldHVybiBpbl9hcnJheSgkZS0+Z2V0Q29kZSgpLCBbNDAxLCA0MDMsIDQyOV0sIHRydWUpIHx8ICRlLT5nZXRDb2RlKCkgPj0gNTAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7CgppbnRlcmZhY2UgVmVyc2lvbkNhY2hlSW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZlcnNpb25QYWNrYWdlKHN0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRpZGVudGlmaWVyKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcjsKCgoKCgoKY2xhc3MgV3JpdGFibGVBcnJheVJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkgaW1wbGVtZW50cyBXcml0YWJsZVJlcG9zaXRvcnlJbnRlcmZhY2UKewp1c2UgQ2Fub25pY2FsUGFja2FnZXNUcmFpdDsKCgoKCnByb3RlY3RlZCAkZGV2UGFja2FnZU5hbWVzID0gW107CgoKcHJpdmF0ZSAkZGV2TW9kZSA9IG51bGw7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2TW9kZSgpCnsKcmV0dXJuICR0aGlzLT5kZXZNb2RlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2UGFja2FnZU5hbWVzKGFycmF5ICRkZXZQYWNrYWdlTmFtZXMpCnsKJHRoaXMtPmRldlBhY2thZ2VOYW1lcyA9ICRkZXZQYWNrYWdlTmFtZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZQYWNrYWdlTmFtZXMoKQp7CnJldHVybiAkdGhpcy0+ZGV2UGFja2FnZU5hbWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoYm9vbCAkZGV2TW9kZSwgSW5zdGFsbGF0aW9uTWFuYWdlciAkaW5zdGFsbGF0aW9uTWFuYWdlcikKewokdGhpcy0+ZGV2TW9kZSA9ICRkZXZNb2RlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVsb2FkKCkKewokdGhpcy0+ZGV2TW9kZSA9IG51bGw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcjsKCgoKCgoKaW50ZXJmYWNlIFdyaXRhYmxlUmVwb3NpdG9yeUludGVyZmFjZSBleHRlbmRzIFJlcG9zaXRvcnlJbnRlcmZhY2UKewoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoYm9vbCAkZGV2TW9kZSwgSW5zdGFsbGF0aW9uTWFuYWdlciAkaW5zdGFsbGF0aW9uTWFuYWdlcik7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2Fub25pY2FsUGFja2FnZXMoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbG9hZCgpOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXZQYWNrYWdlTmFtZXMoYXJyYXkgJGRldlBhY2thZ2VOYW1lcyk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2UGFja2FnZU5hbWVzKCk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNjcmlwdDsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50IGFzIEJhc2VFdmVudDsKCgoKCgoKCmNsYXNzIEV2ZW50IGV4dGVuZHMgQmFzZUV2ZW50CnsKCgoKcHJpdmF0ZSAkY29tcG9zZXI7CgoKCgpwcml2YXRlICRpbzsKCgoKCnByaXZhdGUgJGRldk1vZGU7CgoKCgpwcml2YXRlICRvcmlnaW5hdGluZ0V2ZW50OwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIENvbXBvc2VyICRjb21wb3NlciwgSU9JbnRlcmZhY2UgJGlvLCBib29sICRkZXZNb2RlID0gZmFsc2UsIGFycmF5ICRhcmdzID0gW10sIGFycmF5ICRmbGFncyA9IFtdKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG5hbWUsICRhcmdzLCAkZmxhZ3MpOwokdGhpcy0+Y29tcG9zZXIgPSAkY29tcG9zZXI7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmRldk1vZGUgPSAkZGV2TW9kZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VyKCk6IENvbXBvc2VyCnsKcmV0dXJuICR0aGlzLT5jb21wb3NlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElPKCk6IElPSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5pbzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGV2TW9kZSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5kZXZNb2RlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcmlnaW5hdGluZ0V2ZW50KCk6ID9CYXNlRXZlbnQKewpyZXR1cm4gJHRoaXMtPm9yaWdpbmF0aW5nRXZlbnQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9yaWdpbmF0aW5nRXZlbnQoQmFzZUV2ZW50ICRldmVudCk6IHNlbGYKewokdGhpcy0+b3JpZ2luYXRpbmdFdmVudCA9ICR0aGlzLT5jYWxjdWxhdGVPcmlnaW5hdGluZ0V2ZW50KCRldmVudCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2FsY3VsYXRlT3JpZ2luYXRpbmdFdmVudChCYXNlRXZlbnQgJGV2ZW50KTogQmFzZUV2ZW50CnsKaWYgKCRldmVudCBpbnN0YW5jZW9mIEV2ZW50ICYmICRldmVudC0+Z2V0T3JpZ2luYXRpbmdFdmVudCgpKSB7CnJldHVybiAkdGhpcy0+Y2FsY3VsYXRlT3JpZ2luYXRpbmdFdmVudCgkZXZlbnQtPmdldE9yaWdpbmF0aW5nRXZlbnQoKSk7Cn0KCnJldHVybiAkZXZlbnQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2NyaXB0OwoKCgoKCgoKY2xhc3MgU2NyaXB0RXZlbnRzCnsKCgoKCgoKCnB1YmxpYyBjb25zdCBQUkVfSU5TVEFMTF9DTUQgPSAncHJlLWluc3RhbGwtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUE9TVF9JTlNUQUxMX0NNRCA9ICdwb3N0LWluc3RhbGwtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX1VQREFURV9DTUQgPSAncHJlLXVwZGF0ZS1jbWQnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX1VQREFURV9DTUQgPSAncG9zdC11cGRhdGUtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX1NUQVRVU19DTUQgPSAncHJlLXN0YXR1cy1jbWQnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX1NUQVRVU19DTUQgPSAncG9zdC1zdGF0dXMtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX0FVVE9MT0FEX0RVTVAgPSAncHJlLWF1dG9sb2FkLWR1bXAnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX0FVVE9MT0FEX0RVTVAgPSAncG9zdC1hdXRvbG9hZC1kdW1wJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUE9TVF9ST09UX1BBQ0tBR0VfSU5TVEFMTCA9ICdwb3N0LXJvb3QtcGFja2FnZS1pbnN0YWxsJzsKCgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfQ1JFQVRFX1BST0pFQ1RfQ01EID0gJ3Bvc3QtY3JlYXRlLXByb2plY3QtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX0FSQ0hJVkVfQ01EID0gJ3ByZS1hcmNoaXZlLWNtZCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfQVJDSElWRV9DTUQgPSAncG9zdC1hcmNoaXZlLWNtZCc7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbGZVcGRhdGU7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgS2V5cwp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmluZ2VycHJpbnQoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKJGhhc2ggPSBzdHJ0b3VwcGVyKGhhc2goJ3NoYTI1NicsIFByZWc6OnJlcGxhY2UoJ3tcc30nLCAnJywgZmlsZV9nZXRfY29udGVudHMoJHBhdGgpKSkpOwoKcmV0dXJuIGltcGxvZGUoJyAnLCBbCnN1YnN0cigkaGFzaCwgMCwgOCksCnN1YnN0cigkaGFzaCwgOCwgOCksCnN1YnN0cigkaGFzaCwgMTYsIDgpLApzdWJzdHIoJGhhc2gsIDI0LCA4KSwKJycsIApzdWJzdHIoJGhhc2gsIDMyLCA4KSwKc3Vic3RyKCRoYXNoLCA0MCwgOCksCnN1YnN0cigkaGFzaCwgNDgsIDgpLApzdWJzdHIoJGhhc2gsIDU2LCA4KSwKXSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2VsZlVwZGF0ZTsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxDb25maWc7CgoKCgpjbGFzcyBWZXJzaW9ucwp7CgoKCgpwdWJsaWMgc3RhdGljICRjaGFubmVscyA9IHNlbGY6OkNIQU5ORUxTOwoKcHVibGljIGNvbnN0IENIQU5ORUxTID0gWydzdGFibGUnLCAncHJldmlldycsICdzbmFwc2hvdCcsICcxJywgJzInLCAnMi4yJ107CgoKcHJpdmF0ZSAkaHR0cERvd25sb2FkZXI7Cgpwcml2YXRlICRjb25maWc7Cgpwcml2YXRlICRjaGFubmVsOwoKcHJpdmF0ZSAkdmVyc2lvbnNEYXRhID0gbnVsbDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb25maWcgJGNvbmZpZywgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyKQp7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGFubmVsKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+Y2hhbm5lbCkgewpyZXR1cm4gJHRoaXMtPmNoYW5uZWw7Cn0KCiRjaGFubmVsRmlsZSA9ICR0aGlzLT5jb25maWctPmdldCgnaG9tZScpLicvdXBkYXRlLWNoYW5uZWwnOwppZiAoZmlsZV9leGlzdHMoJGNoYW5uZWxGaWxlKSkgewokY2hhbm5lbCA9IHRyaW0oZmlsZV9nZXRfY29udGVudHMoJGNoYW5uZWxGaWxlKSk7CmlmIChpbl9hcnJheSgkY2hhbm5lbCwgWydzdGFibGUnLCAncHJldmlldycsICdzbmFwc2hvdCcsICcyLjInXSwgdHJ1ZSkpIHsKcmV0dXJuICR0aGlzLT5jaGFubmVsID0gJGNoYW5uZWw7Cn0KfQoKcmV0dXJuICR0aGlzLT5jaGFubmVsID0gJ3N0YWJsZSc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRDaGFubmVsKHN0cmluZyAkY2hhbm5lbCwgP0lPSW50ZXJmYWNlICRpbyA9IG51bGwpOiB2b2lkCnsKaWYgKCFpbl9hcnJheSgkY2hhbm5lbCwgc2VsZjo6Q0hBTk5FTFMsIHRydWUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIGNoYW5uZWwgJy4kY2hhbm5lbC4nLCBtdXN0IGJlIG9uZSBvZjogJyAuIGltcGxvZGUoJywgJywgc2VsZjo6Q0hBTk5FTFMpKTsKfQoKJGNoYW5uZWxGaWxlID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdob21lJykuJy91cGRhdGUtY2hhbm5lbCc7CiR0aGlzLT5jaGFubmVsID0gJGNoYW5uZWw7CgoKJHN0b3JlZENoYW5uZWwgPSBQcmVnOjppc01hdGNoKCd7XlxkKyR9RCcsICRjaGFubmVsKSA/ICdzdGFibGUnIDogJGNoYW5uZWw7CiRwcmV2aW91c2x5U3RvcmVkID0gZmlsZV9leGlzdHMoJGNoYW5uZWxGaWxlKSA/IHRyaW0oKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJGNoYW5uZWxGaWxlKSkgOiBudWxsOwpmaWxlX3B1dF9jb250ZW50cygkY2hhbm5lbEZpbGUsICRzdG9yZWRDaGFubmVsLlBIUF9FT0wpOwoKaWYgKCRpbyAhPT0gbnVsbCAmJiAkcHJldmlvdXNseVN0b3JlZCAhPT0gJHN0b3JlZENoYW5uZWwpIHsKJGlvLT53cml0ZUVycm9yKCdTdG9yaW5nICI8aW5mbz4nLiRzdG9yZWRDaGFubmVsLic8L2luZm8+IiBhcyBkZWZhdWx0IHVwZGF0ZSBjaGFubmVsIGZvciB0aGUgbmV4dCBzZWxmLXVwZGF0ZSBydW4uJyk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExhdGVzdCg/c3RyaW5nICRjaGFubmVsID0gbnVsbCk6IGFycmF5CnsKJHZlcnNpb25zID0gJHRoaXMtPmdldFZlcnNpb25zRGF0YSgpOwoKZm9yZWFjaCAoJHZlcnNpb25zWyRjaGFubmVsID86ICR0aGlzLT5nZXRDaGFubmVsKCldIGFzICR2ZXJzaW9uKSB7CmlmICgkdmVyc2lvblsnbWluLXBocCddIDw9IFxQSFBfVkVSU0lPTl9JRCkgewpyZXR1cm4gJHZlcnNpb247Cn0KfQoKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1RoZXJlIGlzIG5vIHZlcnNpb24gb2YgQ29tcG9zZXIgYXZhaWxhYmxlIGZvciB5b3VyIFBIUCB2ZXJzaW9uICgnLlBIUF9WRVJTSU9OLicpJyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0VmVyc2lvbnNEYXRhKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT52ZXJzaW9uc0RhdGEpIHsKaWYgKCR0aGlzLT5jb25maWctPmdldCgnZGlzYWJsZS10bHMnKSA9PT0gdHJ1ZSkgewokcHJvdG9jb2wgPSAnaHR0cCc7Cn0gZWxzZSB7CiRwcm90b2NvbCA9ICdodHRwcyc7Cn0KCiR0aGlzLT52ZXJzaW9uc0RhdGEgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkcHJvdG9jb2wgLiAnOi8vZ2V0Y29tcG9zZXIub3JnL3ZlcnNpb25zJyktPmRlY29kZUpzb24oKTsKfQoKcmV0dXJuICR0aGlzLT52ZXJzaW9uc0RhdGE7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgQXV0aEhlbHBlcgp7Cgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRjb25maWc7Cgpwcml2YXRlICRkaXNwbGF5ZWRPcmlnaW5BdXRoZW50aWNhdGlvbnMgPSBbXTsKCnByaXZhdGUgJGJpdGJ1Y2tldFJldHJ5ID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZykKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RvcmVBdXRoKHN0cmluZyAkb3JpZ2luLCAkc3RvcmVBdXRoKTogdm9pZAp7CiRzdG9yZSA9IGZhbHNlOwokY29uZmlnU291cmNlID0gJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpOwppZiAoJHN0b3JlQXV0aCA9PT0gdHJ1ZSkgewokc3RvcmUgPSAkY29uZmlnU291cmNlOwp9IGVsc2VpZiAoJHN0b3JlQXV0aCA9PT0gJ3Byb21wdCcpIHsKJGFuc3dlciA9ICR0aGlzLT5pby0+YXNrQW5kVmFsaWRhdGUoCidEbyB5b3Ugd2FudCB0byBzdG9yZSBjcmVkZW50aWFscyBmb3IgJy4kb3JpZ2luLicgaW4gJy4kY29uZmlnU291cmNlLT5nZXROYW1lKCkuJyA/IFtZbl0gJywKc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpOiBzdHJpbmcgewokaW5wdXQgPSBzdHJ0b2xvd2VyKHN1YnN0cih0cmltKCR2YWx1ZSksIDAsIDEpKTsKaWYgKGluX2FycmF5KCRpbnB1dCwgWyd5JywnbiddKSkgewpyZXR1cm4gJGlucHV0Owp9CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignUGxlYXNlIGFuc3dlciAoeSllcyBvciAobilvJyk7Cn0sCm51bGwsCid5JwopOwoKaWYgKCRhbnN3ZXIgPT09ICd5Jykgewokc3RvcmUgPSAkY29uZmlnU291cmNlOwp9Cn0KaWYgKCRzdG9yZSkgewokc3RvcmUtPmFkZENvbmZpZ1NldHRpbmcoCidodHRwLWJhc2ljLicuJG9yaWdpbiwKJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luKQopOwp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9tcHRBdXRoSWZOZWVkZWQoc3RyaW5nICR1cmwsIHN0cmluZyAkb3JpZ2luLCBpbnQgJHN0YXR1c0NvZGUsID9zdHJpbmcgJHJlYXNvbiA9IG51bGwsIGFycmF5ICRoZWFkZXJzID0gW10sIGludCAkcmV0cnlDb3VudCA9IDApOiBhcnJheQp7CiRzdG9yZUF1dGggPSBmYWxzZTsKCmlmIChpbl9hcnJheSgkb3JpZ2luLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJyksIHRydWUpKSB7CiRnaXRIdWJVdGlsID0gbmV3IEdpdEh1YigkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsIG51bGwpOwokbWVzc2FnZSA9ICJcbiI7CgokcmF0ZUxpbWl0ZWQgPSAkZ2l0SHViVXRpbC0+aXNSYXRlTGltaXRlZCgkaGVhZGVycyk7CiRyZXF1aXJlc1NzbyA9ICRnaXRIdWJVdGlsLT5yZXF1aXJlc1NzbygkaGVhZGVycyk7CgppZiAoJHJlcXVpcmVzU3NvKSB7CiRzc29VcmwgPSAkZ2l0SHViVXRpbC0+Z2V0U3NvVXJsKCRoZWFkZXJzKTsKJG1lc3NhZ2UgPSAnR2l0SHViIEFQSSB0b2tlbiByZXF1aXJlcyBTU08gYXV0aG9yaXphdGlvbi4gQXV0aG9yaXplIHRoaXMgdG9rZW4gYXQgJyAuICRzc29VcmwgLiAiXG4iOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1lc3NhZ2UpOwppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ0NvdWxkIG5vdCBhdXRoZW50aWNhdGUgYWdhaW5zdCAnIC4gJG9yaWdpbiwgNDAzKTsKfQokdGhpcy0+aW8tPmFzaygnQWZ0ZXIgYXV0aG9yaXppbmcgeW91ciB0b2tlbiwgY29uZmlybSB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHJldHJ5IHRoZSByZXF1ZXN0Jyk7CgpyZXR1cm4gWydyZXRyeScgPT4gdHJ1ZSwgJ3N0b3JlQXV0aCcgPT4gJHN0b3JlQXV0aF07Cn0KCmlmICgkcmF0ZUxpbWl0ZWQpIHsKJHJhdGVMaW1pdCA9ICRnaXRIdWJVdGlsLT5nZXRSYXRlTGltaXQoJGhlYWRlcnMpOwppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkb3JpZ2luKSkgewokbWVzc2FnZSA9ICdSZXZpZXcgeW91ciBjb25maWd1cmVkIEdpdEh1YiBPQXV0aCB0b2tlbiBvciBlbnRlciBhIG5ldyBvbmUgdG8gZ28gb3ZlciB0aGUgQVBJIHJhdGUgbGltaXQuJzsKfSBlbHNlIHsKJG1lc3NhZ2UgPSAnQ3JlYXRlIGEgR2l0SHViIE9BdXRoIHRva2VuIHRvIGdvIG92ZXIgdGhlIEFQSSByYXRlIGxpbWl0Lic7Cn0KCiRtZXNzYWdlID0gc3ByaW50ZigKJ0dpdEh1YiBBUEkgbGltaXQgKCVkIGNhbGxzL2hyKSBpcyBleGhhdXN0ZWQsIGNvdWxkIG5vdCBmZXRjaCAnLiR1cmwuJy4gJy4kbWVzc2FnZS4nIFlvdSBjYW4gYWxzbyB3YWl0IHVudGlsICVzIGZvciB0aGUgcmF0ZSBsaW1pdCB0byByZXNldC4nLAokcmF0ZUxpbWl0WydsaW1pdCddLAokcmF0ZUxpbWl0WydyZXNldCddCikuIlxuIjsKfSBlbHNlIHsKJG1lc3NhZ2UgLj0gJ0NvdWxkIG5vdCBmZXRjaCAnLiR1cmwuJywgcGxlYXNlICc7CmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRvcmlnaW4pKSB7CiRtZXNzYWdlIC49ICdyZXZpZXcgeW91ciBjb25maWd1cmVkIEdpdEh1YiBPQXV0aCB0b2tlbiBvciBlbnRlciBhIG5ldyBvbmUgdG8gYWNjZXNzIHByaXZhdGUgcmVwb3MnOwp9IGVsc2UgewokbWVzc2FnZSAuPSAnY3JlYXRlIGEgR2l0SHViIE9BdXRoIHRva2VuIHRvIGFjY2VzcyBwcml2YXRlIHJlcG9zJzsKfQp9CgppZiAoISRnaXRIdWJVdGlsLT5hdXRob3JpemVPQXV0aCgkb3JpZ2luKQomJiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpIHx8ICEkZ2l0SHViVXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCRvcmlnaW4sICRtZXNzYWdlKSkKKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ0NvdWxkIG5vdCBhdXRoZW50aWNhdGUgYWdhaW5zdCAnLiRvcmlnaW4sIDQwMSk7Cn0KfSBlbHNlaWYgKGluX2FycmF5KCRvcmlnaW4sICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkpIHsKJG1lc3NhZ2UgPSAiXG4iLidDb3VsZCBub3QgZmV0Y2ggJy4kdXJsLicsIGVudGVyIHlvdXIgJyAuICRvcmlnaW4gLiAnIGNyZWRlbnRpYWxzICcgLigkc3RhdHVzQ29kZSA9PT0gNDAxID8gJ3RvIGFjY2VzcyBwcml2YXRlIHJlcG9zJyA6ICd0byBnbyBvdmVyIHRoZSBBUEkgcmF0ZSBsaW1pdCcpOwokZ2l0TGFiVXRpbCA9IG5ldyBHaXRMYWIoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCBudWxsKTsKCiRhdXRoID0gbnVsbDsKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG9yaWdpbikpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW4pOwppZiAoaW5fYXJyYXkoJGF1dGhbJ3Bhc3N3b3JkJ10sIFsnZ2l0bGFiLWNpLXRva2VuJywgJ3ByaXZhdGUtdG9rZW4nLCAnb2F1dGgyJ10sIHRydWUpKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oIkludmFsaWQgY3JlZGVudGlhbHMgZm9yICciIC4gJHVybCAuICInLCBhYm9ydGluZy4iLCAkc3RhdHVzQ29kZSk7Cn0KfQoKaWYgKCEkZ2l0TGFiVXRpbC0+YXV0aG9yaXplT0F1dGgoJG9yaWdpbikKJiYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSB8fCAhJGdpdExhYlV0aWwtPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseShwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9TQ0hFTUUpLCAkb3JpZ2luLCAkbWVzc2FnZSkpCikgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdDb3VsZCBub3QgYXV0aGVudGljYXRlIGFnYWluc3QgJy4kb3JpZ2luLCA0MDEpOwp9CgppZiAoJGF1dGggIT09IG51bGwgJiYgJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkb3JpZ2luKSkgewppZiAoJGF1dGggPT09ICR0aGlzLT5pby0+Z2V0QXV0aGVudGljYXRpb24oJG9yaWdpbikpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbigiSW52YWxpZCBjcmVkZW50aWFscyBmb3IgJyIgLiAkdXJsIC4gIicsIGFib3J0aW5nLiIsICRzdGF0dXNDb2RlKTsKfQp9Cn0gZWxzZWlmICgkb3JpZ2luID09PSAnYml0YnVja2V0Lm9yZycgfHwgJG9yaWdpbiA9PT0gJ2FwaS5iaXRidWNrZXQub3JnJykgewokYXNrRm9yT0F1dGhUb2tlbiA9IHRydWU7CiRvcmlnaW4gPSAnYml0YnVja2V0Lm9yZyc7CmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRvcmlnaW4pKSB7CiRhdXRoID0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luKTsKaWYgKCRhdXRoWyd1c2VybmFtZSddICE9PSAneC10b2tlbi1hdXRoJykgewokYml0YnVja2V0VXRpbCA9IG5ldyBCaXRidWNrZXQoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnKTsKJGFjY2Vzc1Rva2VuID0gJGJpdGJ1Y2tldFV0aWwtPnJlcXVlc3RUb2tlbigkb3JpZ2luLCAkYXV0aFsndXNlcm5hbWUnXSwgJGF1dGhbJ3Bhc3N3b3JkJ10pOwppZiAoIWVtcHR5KCRhY2Nlc3NUb2tlbikpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luLCAneC10b2tlbi1hdXRoJywgJGFjY2Vzc1Rva2VuKTsKJGFza0Zvck9BdXRoVG9rZW4gPSBmYWxzZTsKfQp9IGVsc2VpZiAoIWlzc2V0KCR0aGlzLT5iaXRidWNrZXRSZXRyeVskdXJsXSkpIHsKCgoKJGFza0Zvck9BdXRoVG9rZW4gPSBmYWxzZTsKJHRoaXMtPmJpdGJ1Y2tldFJldHJ5WyR1cmxdID0gdHJ1ZTsKfSBlbHNlIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignQ291bGQgbm90IGF1dGhlbnRpY2F0ZSBhZ2FpbnN0ICcgLiAkb3JpZ2luLCA0MDEpOwp9Cn0KCmlmICgkYXNrRm9yT0F1dGhUb2tlbikgewokbWVzc2FnZSA9ICJcbiIuJ0NvdWxkIG5vdCBmZXRjaCAnIC4gJHVybCAuICcsIHBsZWFzZSBjcmVhdGUgYSBiaXRidWNrZXQgT0F1dGggdG9rZW4gdG8gJyAuICgoJHN0YXR1c0NvZGUgPT09IDQwMSB8fCAkc3RhdHVzQ29kZSA9PT0gNDAzKSA/ICdhY2Nlc3MgcHJpdmF0ZSByZXBvcycgOiAnZ28gb3ZlciB0aGUgQVBJIHJhdGUgbGltaXQnKTsKJGJpdEJ1Y2tldFV0aWwgPSBuZXcgQml0YnVja2V0KCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZyk7CmlmICghJGJpdEJ1Y2tldFV0aWwtPmF1dGhvcml6ZU9BdXRoKCRvcmlnaW4pCiYmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkgfHwgISRiaXRCdWNrZXRVdGlsLT5hdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoJG9yaWdpbiwgJG1lc3NhZ2UpKQopIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignQ291bGQgbm90IGF1dGhlbnRpY2F0ZSBhZ2FpbnN0ICcgLiAkb3JpZ2luLCA0MDEpOwp9Cn0KfSBlbHNlIHsKCmlmICgkc3RhdHVzQ29kZSA9PT0gNDA0KSB7CnJldHVybiBbJ3JldHJ5JyA9PiBmYWxzZSwgJ3N0b3JlQXV0aCcgPT4gZmFsc2VdOwp9CgoKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewppZiAoJHN0YXR1c0NvZGUgPT09IDQwMSkgewokbWVzc2FnZSA9ICJUaGUgJyIgLiAkdXJsIC4gIicgVVJMIHJlcXVpcmVkIGF1dGhlbnRpY2F0aW9uIChIVFRQIDQwMSkuXG5Zb3UgbXVzdCBiZSB1c2luZyB0aGUgaW50ZXJhY3RpdmUgY29uc29sZSB0byBhdXRoZW50aWNhdGUiOwp9IGVsc2VpZiAoJHN0YXR1c0NvZGUgPT09IDQwMykgewokbWVzc2FnZSA9ICJUaGUgJyIgLiAkdXJsIC4gIicgVVJMIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZCAoSFRUUCA0MDMpOiAiIC4gJHJlYXNvbjsKfSBlbHNlIHsKJG1lc3NhZ2UgPSAiVW5rbm93biBlcnJvciBjb2RlICciIC4gJHN0YXR1c0NvZGUgLiAiJywgcmVhc29uOiAiIC4gJHJlYXNvbjsKfQoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbigkbWVzc2FnZSwgJHN0YXR1c0NvZGUpOwp9CgoKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG9yaWdpbikpIHsKCgppZiAoJHJldHJ5Q291bnQgPT09IDApIHsKcmV0dXJuIFsncmV0cnknID0+IHRydWUsICdzdG9yZUF1dGgnID0+IGZhbHNlXTsKfQoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbigiSW52YWxpZCBjcmVkZW50aWFscyAoSFRUUCAkc3RhdHVzQ29kZSkgZm9yICckdXJsJywgYWJvcnRpbmcuIiwgJHN0YXR1c0NvZGUpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBBdXRoZW50aWNhdGlvbiByZXF1aXJlZCAoPGluZm8+Jy4kb3JpZ2luLic8L2luZm8+KTonKTsKJHVzZXJuYW1lID0gJHRoaXMtPmlvLT5hc2soJyAgICAgIFVzZXJuYW1lOiAnKTsKJHBhc3N3b3JkID0gJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCcgICAgICBQYXNzd29yZDogJyk7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpbiwgJHVzZXJuYW1lLCAkcGFzc3dvcmQpOwokc3RvcmVBdXRoID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdzdG9yZS1hdXRocycpOwp9CgpyZXR1cm4gWydyZXRyeScgPT4gdHJ1ZSwgJ3N0b3JlQXV0aCcgPT4gJHN0b3JlQXV0aF07Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEF1dGhlbnRpY2F0aW9uSGVhZGVyKGFycmF5ICRoZWFkZXJzLCBzdHJpbmcgJG9yaWdpbiwgc3RyaW5nICR1cmwpOiBhcnJheQp7CmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRvcmlnaW4pKSB7CiRhdXRoZW50aWNhdGlvbkRpc3BsYXlNZXNzYWdlID0gbnVsbDsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW4pOwppZiAoJGF1dGhbJ3Bhc3N3b3JkJ10gPT09ICdiZWFyZXInKSB7CiRoZWFkZXJzW10gPSAnQXV0aG9yaXphdGlvbjogQmVhcmVyICcuJGF1dGhbJ3VzZXJuYW1lJ107Cn0gZWxzZWlmICgnZ2l0aHViLmNvbScgPT09ICRvcmlnaW4gJiYgJ3gtb2F1dGgtYmFzaWMnID09PSAkYXV0aFsncGFzc3dvcmQnXSkgewoKaWYgKFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vYXBpXC5naXRodWJcLmNvbS99JywgJHVybCkpIHsKJGhlYWRlcnNbXSA9ICdBdXRob3JpemF0aW9uOiB0b2tlbiAnLiRhdXRoWyd1c2VybmFtZSddOwokYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSA9ICdVc2luZyBHaXRIdWIgdG9rZW4gYXV0aGVudGljYXRpb24nOwp9Cn0gZWxzZWlmICgKaW5fYXJyYXkoJG9yaWdpbiwgJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKQomJiBpbl9hcnJheSgkYXV0aFsncGFzc3dvcmQnXSwgWydvYXV0aDInLCAncHJpdmF0ZS10b2tlbicsICdnaXRsYWItY2ktdG9rZW4nXSwgdHJ1ZSkKKSB7CmlmICgkYXV0aFsncGFzc3dvcmQnXSA9PT0gJ29hdXRoMicpIHsKJGhlYWRlcnNbXSA9ICdBdXRob3JpemF0aW9uOiBCZWFyZXIgJy4kYXV0aFsndXNlcm5hbWUnXTsKJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UgPSAnVXNpbmcgR2l0TGFiIE9BdXRoIHRva2VuIGF1dGhlbnRpY2F0aW9uJzsKfSBlbHNlIHsKJGhlYWRlcnNbXSA9ICdQUklWQVRFLVRPS0VOOiAnLiRhdXRoWyd1c2VybmFtZSddOwokYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSA9ICdVc2luZyBHaXRMYWIgcHJpdmF0ZSB0b2tlbiBhdXRoZW50aWNhdGlvbic7Cn0KfSBlbHNlaWYgKAonYml0YnVja2V0Lm9yZycgPT09ICRvcmlnaW4KJiYgJHVybCAhPT0gQml0YnVja2V0OjpPQVVUSDJfQUNDRVNTX1RPS0VOX1VSTAomJiAneC10b2tlbi1hdXRoJyA9PT0gJGF1dGhbJ3VzZXJuYW1lJ10KKSB7CmlmICghJHRoaXMtPmlzUHVibGljQml0QnVja2V0RG93bmxvYWQoJHVybCkpIHsKJGhlYWRlcnNbXSA9ICdBdXRob3JpemF0aW9uOiBCZWFyZXIgJyAuICRhdXRoWydwYXNzd29yZCddOwokYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSA9ICdVc2luZyBCaXRidWNrZXQgT0F1dGggdG9rZW4gYXV0aGVudGljYXRpb24nOwp9Cn0gZWxzZSB7CiRhdXRoU3RyID0gYmFzZTY0X2VuY29kZSgkYXV0aFsndXNlcm5hbWUnXSAuICc6JyAuICRhdXRoWydwYXNzd29yZCddKTsKJGhlYWRlcnNbXSA9ICdBdXRob3JpemF0aW9uOiBCYXNpYyAnLiRhdXRoU3RyOwokYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSA9ICdVc2luZyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHdpdGggdXNlcm5hbWUgIicgLiAkYXV0aFsndXNlcm5hbWUnXSAuICciJzsKfQoKaWYgKCRhdXRoZW50aWNhdGlvbkRpc3BsYXlNZXNzYWdlICYmICghaXNzZXQoJHRoaXMtPmRpc3BsYXllZE9yaWdpbkF1dGhlbnRpY2F0aW9uc1skb3JpZ2luXSkgfHwgJHRoaXMtPmRpc3BsYXllZE9yaWdpbkF1dGhlbnRpY2F0aW9uc1skb3JpZ2luXSAhPT0gJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHRoaXMtPmRpc3BsYXllZE9yaWdpbkF1dGhlbnRpY2F0aW9uc1skb3JpZ2luXSA9ICRhdXRoZW50aWNhdGlvbkRpc3BsYXlNZXNzYWdlOwp9Cn0gZWxzZWlmIChpbl9hcnJheSgkb3JpZ2luLCBbJ2FwaS5iaXRidWNrZXQub3JnJywgJ2FwaS5naXRodWIuY29tJ10sIHRydWUpKSB7CnJldHVybiAkdGhpcy0+YWRkQXV0aGVudGljYXRpb25IZWFkZXIoJGhlYWRlcnMsIHN0cl9yZXBsYWNlKCdhcGkuJywgJycsICRvcmlnaW4pLCAkdXJsKTsKfQoKcmV0dXJuICRoZWFkZXJzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUHVibGljQml0QnVja2V0RG93bmxvYWQoc3RyaW5nICR1cmxUb0JpdEJ1Y2tldEZpbGUpOiBib29sCnsKJGRvbWFpbiA9IHBhcnNlX3VybCgkdXJsVG9CaXRCdWNrZXRGaWxlLCBQSFBfVVJMX0hPU1QpOwppZiAoc3RycG9zKCRkb21haW4sICdiaXRidWNrZXQub3JnJykgPT09IGZhbHNlKSB7CgoKcmV0dXJuIHRydWU7Cn0KCiRwYXRoID0gcGFyc2VfdXJsKCR1cmxUb0JpdEJ1Y2tldEZpbGUsIFBIUF9VUkxfUEFUSCk7CgoKCiRwYXRoUGFydHMgPSBleHBsb2RlKCcvJywgJHBhdGgpOwoKcmV0dXJuIGNvdW50KCRwYXRoUGFydHMpID49IDQgJiYgJHBhdGhQYXJ0c1szXSA9PT0gJ2Rvd25sb2Fkcyc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEJpdGJ1Y2tldAp7Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJHByb2Nlc3M7Cgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCnByaXZhdGUgJHRva2VuID0gbnVsbDsKCnByaXZhdGUgJHRpbWU7CgpwdWJsaWMgY29uc3QgT0FVVEgyX0FDQ0VTU19UT0tFTl9VUkwgPSAnaHR0cHM6Ly9iaXRidWNrZXQub3JnL3NpdGUvb2F1dGgyL2FjY2Vzc190b2tlbic7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwsID9IdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIgPSBudWxsLCA/aW50ICR0aW1lID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID86IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyID86IEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCR0aGlzLT5pbywgJGNvbmZpZyk7CiR0aGlzLT50aW1lID0gJHRpbWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUb2tlbigpOiBzdHJpbmcKewppZiAoIWlzc2V0KCR0aGlzLT50b2tlblsnYWNjZXNzX3Rva2VuJ10pKSB7CnJldHVybiAnJzsKfQoKcmV0dXJuICR0aGlzLT50b2tlblsnYWNjZXNzX3Rva2VuJ107Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdXRob3JpemVPQXV0aChzdHJpbmcgJG9yaWdpblVybCk6IGJvb2wKewppZiAoJG9yaWdpblVybCAhPT0gJ2JpdGJ1Y2tldC5vcmcnKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdjb25maWcnLCAnYml0YnVja2V0LmFjY2Vzc3Rva2VuJ10sICRvdXRwdXQpKSB7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpblVybCwgJ3gtdG9rZW4tYXV0aCcsIHRyaW0oJG91dHB1dCkpOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZXF1ZXN0QWNjZXNzVG9rZW4oKTogYm9vbAp7CnRyeSB7CiRyZXNwb25zZSA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KHNlbGY6Ok9BVVRIMl9BQ0NFU1NfVE9LRU5fVVJMLCBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLAonaHR0cCcgPT4gWwonbWV0aG9kJyA9PiAnUE9TVCcsCidjb250ZW50JyA9PiAnZ3JhbnRfdHlwZT1jbGllbnRfY3JlZGVudGlhbHMnLApdLApdKTsKCiR0b2tlbiA9ICRyZXNwb25zZS0+ZGVjb2RlSnNvbigpOwppZiAoIWlzc2V0KCR0b2tlblsnZXhwaXJlc19pbiddKSB8fCAhaXNzZXQoJHRva2VuWydhY2Nlc3NfdG9rZW4nXSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRXhwZWN0ZWQgYSB0b2tlbiBjb25maWd1cmVkIHdpdGggZXhwaXJlc19pbiBhbmQgYWNjZXNzX3Rva2VuIHByZXNlbnQsIGdvdCAnLmpzb25fZW5jb2RlKCR0b2tlbikpOwp9CgokdGhpcy0+dG9rZW4gPSAkdG9rZW47Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSA9PT0gNDAwKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkludmFsaWQgT0F1dGggY29uc3VtZXIgcHJvdmlkZWQuPC9lcnJvcj4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdUaGlzIGNhbiBoYXZlIHRocmVlIHJlYXNvbnM6Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignMS4gWW91IGFyZSBhdXRoZW50aWNhdGluZyB3aXRoIGEgYml0YnVja2V0IHVzZXJuYW1lL3Bhc3N3b3JkIGNvbWJpbmF0aW9uJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignMi4gWW91IGFyZSB1c2luZyBhbiBPQXV0aCBjb25zdW1lciwgYnV0IGRpZG5cJ3QgY29uZmlndXJlIGEgKGR1bW15KSBjYWxsYmFjayB1cmwnKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCczLiBZb3UgYXJlIHVzaW5nIGFuIE9BdXRoIGNvbnN1bWVyLCBidXQgZGlkblwndCBjb25maWd1cmUgaXQgYXMgcHJpdmF0ZSBjb25zdW1lcicpOwoKcmV0dXJuIGZhbHNlOwp9CmlmIChpbl9hcnJheSgkZS0+Z2V0Q29kZSgpLCBbNDAzLCA0MDFdKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5JbnZhbGlkIE9BdXRoIGNvbnN1bWVyIHByb3ZpZGVkLjwvZXJyb3I+Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignWW91IGNhbiBhbHNvIGFkZCBpdCBtYW51YWxseSBsYXRlciBieSB1c2luZyAiY29tcG9zZXIgY29uZmlnIC0tZ2xvYmFsIC0tYXV0aCBiaXRidWNrZXQtb2F1dGguYml0YnVja2V0Lm9yZyA8Y29uc3VtZXIta2V5PiA8Y29uc3VtZXItc2VjcmV0PiInKTsKCnJldHVybiBmYWxzZTsKfQoKdGhyb3cgJGU7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KHN0cmluZyAkb3JpZ2luVXJsLCA/c3RyaW5nICRtZXNzYWdlID0gbnVsbCk6IGJvb2wKewppZiAoJG1lc3NhZ2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRtZXNzYWdlKTsKfQoKJGxvY2FsQXV0aENvbmZpZyA9ICR0aGlzLT5jb25maWctPmdldExvY2FsQXV0aENvbmZpZ1NvdXJjZSgpOwokdXJsID0gJ2h0dHBzOi8vc3VwcG9ydC5hdGxhc3NpYW4uY29tL2JpdGJ1Y2tldC1jbG91ZC9kb2NzL3VzZS1vYXV0aC1vbi1iaXRidWNrZXQtY2xvdWQvJzsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdGb2xsb3cgdGhlIGluc3RydWN0aW9ucyBoZXJlOicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJHVybCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCd0byBjcmVhdGUgYSBjb25zdW1lci4gSXQgd2lsbCBiZSBzdG9yZWQgaW4gIiVzIiBmb3IgZnV0dXJlIHVzZSBieSBDb21wb3Nlci4nLCAoJGxvY2FsQXV0aENvbmZpZyAhPT0gbnVsbCA/ICRsb2NhbEF1dGhDb25maWctPmdldE5hbWUoKSAuICcgT1IgJyA6ICcnKSAuICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKS0+Z2V0TmFtZSgpKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRW5zdXJlIHlvdSBlbnRlciBhICJDYWxsYmFjayBVUkwiIChodHRwOi8vZXhhbXBsZS5jb20gaXMgZmluZSkgb3IgaXQgd2lsbCBub3QgYmUgcG9zc2libGUgdG8gY3JlYXRlIGFuIEFjY2VzcyBUb2tlbiAodGhpcyBjYWxsYmFjayB1cmwgd2lsbCBub3QgYmUgdXNlZCBieSBjb21wb3NlciknKTsKCiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gZmFsc2U7CmlmICgkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsKSB7CiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gJHRoaXMtPmlvLT5hc2tDb25maXJtYXRpb24oJ0EgbG9jYWwgYXV0aCBjb25maWcgc291cmNlIHdhcyBmb3VuZCwgZG8geW91IHdhbnQgdG8gc3RvcmUgdGhlIHRva2VuIHRoZXJlPycsIHRydWUpOwp9CgokY29uc3VtZXJLZXkgPSB0cmltKChzdHJpbmcpICR0aGlzLT5pby0+YXNrQW5kSGlkZUFuc3dlcignQ29uc3VtZXIgS2V5IChoaWRkZW4pOiAnKSk7CgppZiAoISRjb25zdW1lcktleSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPk5vIGNvbnN1bWVyIGtleSBnaXZlbiwgYWJvcnRpbmcuPC93YXJuaW5nPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdSBjYW4gYWxzbyBhZGQgaXQgbWFudWFsbHkgbGF0ZXIgYnkgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLWF1dGggYml0YnVja2V0LW9hdXRoLmJpdGJ1Y2tldC5vcmcgPGNvbnN1bWVyLWtleT4gPGNvbnN1bWVyLXNlY3JldD4iJyk7CgpyZXR1cm4gZmFsc2U7Cn0KCiRjb25zdW1lclNlY3JldCA9IHRyaW0oKHN0cmluZykgJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCdDb25zdW1lciBTZWNyZXQgKGhpZGRlbik6ICcpKTsKCmlmICghJGNvbnN1bWVyU2VjcmV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Tm8gY29uc3VtZXIgc2VjcmV0IGdpdmVuLCBhYm9ydGluZy48L3dhcm5pbmc+Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignWW91IGNhbiBhbHNvIGFkZCBpdCBtYW51YWxseSBsYXRlciBieSB1c2luZyAiY29tcG9zZXIgY29uZmlnIC0tZ2xvYmFsIC0tYXV0aCBiaXRidWNrZXQtb2F1dGguYml0YnVja2V0Lm9yZyA8Y29uc3VtZXIta2V5PiA8Y29uc3VtZXItc2VjcmV0PiInKTsKCnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkY29uc3VtZXJLZXksICRjb25zdW1lclNlY3JldCk7CgppZiAoISR0aGlzLT5yZXF1ZXN0QWNjZXNzVG9rZW4oKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgokYXV0aENvbmZpZ1NvdXJjZSA9ICRzdG9yZUluTG9jYWxBdXRoQ29uZmlnICYmICRsb2NhbEF1dGhDb25maWcgIT09IG51bGwgPyAkbG9jYWxBdXRoQ29uZmlnIDogJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpOwokdGhpcy0+c3RvcmVJbkF1dGhDb25maWcoJGF1dGhDb25maWdTb3VyY2UsICRvcmlnaW5VcmwsICRjb25zdW1lcktleSwgJGNvbnN1bWVyU2VjcmV0KTsKCgokdGhpcy0+Y29uZmlnLT5nZXRBdXRoQ29uZmlnU291cmNlKCktPnJlbW92ZUNvbmZpZ1NldHRpbmcoJ2h0dHAtYmFzaWMuJyAuICRvcmlnaW5VcmwpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5Db25zdW1lciBzdG9yZWQgc3VjY2Vzc2Z1bGx5LjwvaW5mbz4nKTsKCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVxdWVzdFRva2VuKHN0cmluZyAkb3JpZ2luVXJsLCBzdHJpbmcgJGNvbnN1bWVyS2V5LCBzdHJpbmcgJGNvbnN1bWVyU2VjcmV0KTogc3RyaW5nCnsKaWYgKCR0aGlzLT50b2tlbiAhPT0gbnVsbCB8fCAkdGhpcy0+Z2V0VG9rZW5Gcm9tQ29uZmlnKCRvcmlnaW5VcmwpKSB7CnJldHVybiAkdGhpcy0+dG9rZW5bJ2FjY2Vzc190b2tlbiddOwp9CgokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsICRjb25zdW1lcktleSwgJGNvbnN1bWVyU2VjcmV0KTsKaWYgKCEkdGhpcy0+cmVxdWVzdEFjY2Vzc1Rva2VuKCkpIHsKcmV0dXJuICcnOwp9CgokdGhpcy0+c3RvcmVJbkF1dGhDb25maWcoJHRoaXMtPmNvbmZpZy0+Z2V0TG9jYWxBdXRoQ29uZmlnU291cmNlKCkgPz8gJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpLCAkb3JpZ2luVXJsLCAkY29uc3VtZXJLZXksICRjb25zdW1lclNlY3JldCk7CgppZiAoIWlzc2V0KCR0aGlzLT50b2tlblsnYWNjZXNzX3Rva2VuJ10pKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRva2VuIGFib3ZlJyk7Cn0KCnJldHVybiAkdGhpcy0+dG9rZW5bJ2FjY2Vzc190b2tlbiddOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHN0b3JlSW5BdXRoQ29uZmlnKENvbmZpZ1xDb25maWdTb3VyY2VJbnRlcmZhY2UgJGF1dGhDb25maWdTb3VyY2UsIHN0cmluZyAkb3JpZ2luVXJsLCBzdHJpbmcgJGNvbnN1bWVyS2V5LCBzdHJpbmcgJGNvbnN1bWVyU2VjcmV0KTogdm9pZAp7CiR0aGlzLT5jb25maWctPmdldENvbmZpZ1NvdXJjZSgpLT5yZW1vdmVDb25maWdTZXR0aW5nKCdiaXRidWNrZXQtb2F1dGguJy4kb3JpZ2luVXJsKTsKCmlmIChudWxsID09PSAkdGhpcy0+dG9rZW4gfHwgIWlzc2V0KCR0aGlzLT50b2tlblsnZXhwaXJlc19pbiddKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFeHBlY3RlZCBhIHRva2VuIGNvbmZpZ3VyZWQgd2l0aCBleHBpcmVzX2luIHByZXNlbnQsIGdvdCAnLmpzb25fZW5jb2RlKCR0aGlzLT50b2tlbikpOwp9CgokdGltZSA9IG51bGwgPT09ICR0aGlzLT50aW1lID8gdGltZSgpIDogJHRoaXMtPnRpbWU7CiRjb25zdW1lciA9IFsKImNvbnN1bWVyLWtleSIgPT4gJGNvbnN1bWVyS2V5LAoiY29uc3VtZXItc2VjcmV0IiA9PiAkY29uc3VtZXJTZWNyZXQsCiJhY2Nlc3MtdG9rZW4iID0+ICR0aGlzLT50b2tlblsnYWNjZXNzX3Rva2VuJ10sCiJhY2Nlc3MtdG9rZW4tZXhwaXJhdGlvbiIgPT4gJHRpbWUgKyAkdGhpcy0+dG9rZW5bJ2V4cGlyZXNfaW4nXSwKXTsKCiR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKS0+YWRkQ29uZmlnU2V0dGluZygnYml0YnVja2V0LW9hdXRoLicuJG9yaWdpblVybCwgJGNvbnN1bWVyKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRUb2tlbkZyb21Db25maWcoc3RyaW5nICRvcmlnaW5VcmwpOiBib29sCnsKJGF1dGhDb25maWcgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2JpdGJ1Y2tldC1vYXV0aCcpOwoKaWYgKAohaXNzZXQoJGF1dGhDb25maWdbJG9yaWdpblVybF1bJ2FjY2Vzcy10b2tlbiddLCAkYXV0aENvbmZpZ1skb3JpZ2luVXJsXVsnYWNjZXNzLXRva2VuLWV4cGlyYXRpb24nXSkKfHwgdGltZSgpID4gJGF1dGhDb25maWdbJG9yaWdpblVybF1bJ2FjY2Vzcy10b2tlbi1leHBpcmF0aW9uJ10KKSB7CnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPnRva2VuID0gWwonYWNjZXNzX3Rva2VuJyA9PiAkYXV0aENvbmZpZ1skb3JpZ2luVXJsXVsnYWNjZXNzLXRva2VuJ10sCl07CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgoKY2xhc3MgQ29tcG9zZXJNaXJyb3IKewoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9jZXNzVXJsKHN0cmluZyAkbWlycm9yVXJsLCBzdHJpbmcgJHBhY2thZ2VOYW1lLCBzdHJpbmcgJHZlcnNpb24sID9zdHJpbmcgJHJlZmVyZW5jZSwgP3N0cmluZyAkdHlwZSwgP3N0cmluZyAkcHJldHR5VmVyc2lvbiA9IG51bGwpOiBzdHJpbmcKewppZiAoJHJlZmVyZW5jZSkgewokcmVmZXJlbmNlID0gUHJlZzo6aXNNYXRjaCgne14oW2EtZjAtOV0qfCVyZWZlcmVuY2UlKSR9JywgJHJlZmVyZW5jZSkgPyAkcmVmZXJlbmNlIDogaGFzaCgnbWQ1JywgJHJlZmVyZW5jZSk7Cn0KJHZlcnNpb24gPSBzdHJwb3MoJHZlcnNpb24sICcvJykgPT09IGZhbHNlID8gJHZlcnNpb24gOiBoYXNoKCdtZDUnLCAkdmVyc2lvbik7CgokZnJvbSA9IFsnJXBhY2thZ2UlJywgJyV2ZXJzaW9uJScsICclcmVmZXJlbmNlJScsICcldHlwZSUnXTsKJHRvID0gWyRwYWNrYWdlTmFtZSwgJHZlcnNpb24sICRyZWZlcmVuY2UsICR0eXBlXTsKaWYgKG51bGwgIT09ICRwcmV0dHlWZXJzaW9uKSB7CiRmcm9tW10gPSAnJXByZXR0eVZlcnNpb24lJzsKJHRvW10gPSAkcHJldHR5VmVyc2lvbjsKfQoKJHVybCA9IHN0cl9yZXBsYWNlKCRmcm9tLCAkdG8sICRtaXJyb3JVcmwpOwphc3NlcnQoJHVybCAhPT0gJycpOwoKcmV0dXJuICR1cmw7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb2Nlc3NHaXRVcmwoc3RyaW5nICRtaXJyb3JVcmwsIHN0cmluZyAkcGFja2FnZU5hbWUsIHN0cmluZyAkdXJsLCA/c3RyaW5nICR0eXBlKTogc3RyaW5nCnsKaWYgKFByZWc6OmlzTWF0Y2goJyNeKD86KD86aHR0cHM/fGdpdCk6Ly9naXRodWJcLmNvbS98Z2l0QGdpdGh1YlwuY29tOikoW14vXSspLyguKz8pKD86XC5naXQpPyQjJywgJHVybCwgJG1hdGNoKSkgewokdXJsID0gJ2doLScuJG1hdGNoWzFdLicvJy4kbWF0Y2hbMl07Cn0gZWxzZWlmIChQcmVnOjppc01hdGNoKCcjXmh0dHBzOi8vYml0YnVja2V0XC5vcmcvKFteL10rKS8oLis/KSg/OlwuZ2l0KT8vPyQjJywgJHVybCwgJG1hdGNoKSkgewokdXJsID0gJ2JiLScuJG1hdGNoWzFdLicvJy4kbWF0Y2hbMl07Cn0gZWxzZSB7CiR1cmwgPSBQcmVnOjpyZXBsYWNlKCd7W15hLXowLTlfLi1dfWknLCAnLScsIHRyaW0oJHVybCwgJy8nKSk7Cn0KCnJldHVybiBzdHJfcmVwbGFjZSgKWyclcGFja2FnZSUnLCAnJW5vcm1hbGl6ZWRVcmwlJywgJyV0eXBlJSddLApbJHBhY2thZ2VOYW1lLCAkdXJsLCAkdHlwZV0sCiRtaXJyb3JVcmwKKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvY2Vzc0hnVXJsKHN0cmluZyAkbWlycm9yVXJsLCBzdHJpbmcgJHBhY2thZ2VOYW1lLCBzdHJpbmcgJHVybCwgc3RyaW5nICR0eXBlKTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6OnByb2Nlc3NHaXRVcmwoJG1pcnJvclVybCwgJHBhY2thZ2VOYW1lLCAkdXJsLCAkdHlwZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXFZhbGlkYXRpbmdBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEludmFsaWRQYWNrYWdlRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFNwZHhcU3BkeExpY2Vuc2VzOwp1c2UgU2VsZFxKc29uTGludFxEdXBsaWNhdGVLZXlFeGNlcHRpb247CnVzZSBTZWxkXEpzb25MaW50XEpzb25QYXJzZXI7CgoKCgoKCgpjbGFzcyBDb25maWdWYWxpZGF0b3IKewpwdWJsaWMgY29uc3QgQ0hFQ0tfVkVSU0lPTiA9IDE7CgoKcHJpdmF0ZSAkaW87CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvKQp7CiR0aGlzLT5pbyA9ICRpbzsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKHN0cmluZyAkZmlsZSwgaW50ICRhcnJheUxvYWRlclZhbGlkYXRpb25GbGFncyA9IFZhbGlkYXRpbmdBcnJheUxvYWRlcjo6Q0hFQ0tfQUxMLCBpbnQgJGZsYWdzID0gc2VsZjo6Q0hFQ0tfVkVSU0lPTik6IGFycmF5CnsKJGVycm9ycyA9IFtdOwokcHVibGlzaEVycm9ycyA9IFtdOwokd2FybmluZ3MgPSBbXTsKCgokbGF4VmFsaWQgPSBmYWxzZTsKJG1hbmlmZXN0ID0gbnVsbDsKdHJ5IHsKJGpzb24gPSBuZXcgSnNvbkZpbGUoJGZpbGUsIG51bGwsICR0aGlzLT5pbyk7CiRtYW5pZmVzdCA9ICRqc29uLT5yZWFkKCk7CgokanNvbi0+dmFsaWRhdGVTY2hlbWEoSnNvbkZpbGU6OkxBWF9TQ0hFTUEpOwokbGF4VmFsaWQgPSB0cnVlOwokanNvbi0+dmFsaWRhdGVTY2hlbWEoKTsKfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKZm9yZWFjaCAoJGUtPmdldEVycm9ycygpIGFzICRtZXNzYWdlKSB7CmlmICgkbGF4VmFsaWQpIHsKJHB1Ymxpc2hFcnJvcnNbXSA9ICRtZXNzYWdlOwp9IGVsc2UgewokZXJyb3JzW10gPSAkbWVzc2FnZTsKfQp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJGVycm9yc1tdID0gJGUtPmdldE1lc3NhZ2UoKTsKCnJldHVybiBbJGVycm9ycywgJHB1Ymxpc2hFcnJvcnMsICR3YXJuaW5nc107Cn0KCmlmIChpc19hcnJheSgkbWFuaWZlc3QpKSB7CiRqc29uUGFyc2VyID0gbmV3IEpzb25QYXJzZXIoKTsKdHJ5IHsKJGpzb25QYXJzZXItPnBhcnNlKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSwgSnNvblBhcnNlcjo6REVURUNUX0tFWV9DT05GTElDVFMpOwp9IGNhdGNoIChEdXBsaWNhdGVLZXlFeGNlcHRpb24gJGUpIHsKJGRldGFpbHMgPSAkZS0+Z2V0RGV0YWlscygpOwokd2FybmluZ3NbXSA9ICdLZXkgJy4kZGV0YWlsc1sna2V5J10uJyBpcyBhIGR1cGxpY2F0ZSBpbiAnLiRmaWxlLicgYXQgbGluZSAnLiRkZXRhaWxzWydsaW5lJ107Cn0KfQoKCmlmIChlbXB0eSgkbWFuaWZlc3RbJ2xpY2Vuc2UnXSkpIHsKJHdhcm5pbmdzW10gPSAnTm8gbGljZW5zZSBzcGVjaWZpZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRvIHNvLiBGb3IgY2xvc2VkLXNvdXJjZSBzb2Z0d2FyZSB5b3UgbWF5IHVzZSAicHJvcHJpZXRhcnkiIGFzIGxpY2Vuc2UuJzsKfSBlbHNlIHsKJGxpY2Vuc2VzID0gKGFycmF5KSAkbWFuaWZlc3RbJ2xpY2Vuc2UnXTsKCgpmb3JlYWNoICgkbGljZW5zZXMgYXMgJGtleSA9PiAkbGljZW5zZSkgewppZiAoJ3Byb3ByaWV0YXJ5JyA9PT0gJGxpY2Vuc2UpIHsKdW5zZXQoJGxpY2Vuc2VzWyRrZXldKTsKfQp9CgokbGljZW5zZVZhbGlkYXRvciA9IG5ldyBTcGR4TGljZW5zZXMoKTsKZm9yZWFjaCAoJGxpY2Vuc2VzIGFzICRsaWNlbnNlKSB7CiRzcGR4TGljZW5zZSA9ICRsaWNlbnNlVmFsaWRhdG9yLT5nZXRMaWNlbnNlQnlJZGVudGlmaWVyKCRsaWNlbnNlKTsKaWYgKCRzcGR4TGljZW5zZSAmJiAkc3BkeExpY2Vuc2VbM10pIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teW0FMXT9HUEwtWzEyM10oXC5bMDFdKT9cKyR9aScsICRsaWNlbnNlKSkgewokd2FybmluZ3NbXSA9IHNwcmludGYoCidMaWNlbnNlICIlcyIgaXMgYSBkZXByZWNhdGVkIFNQRFggbGljZW5zZSBpZGVudGlmaWVyLCB1c2UgIicuc3RyX3JlcGxhY2UoJysnLCAnJywgJGxpY2Vuc2UpLictb3ItbGF0ZXIiIGluc3RlYWQnLAokbGljZW5zZQopOwp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaCgne15bQUxdP0dQTC1bMTIzXShcLlswMV0pPyR9aScsICRsaWNlbnNlKSkgewokd2FybmluZ3NbXSA9IHNwcmludGYoCidMaWNlbnNlICIlcyIgaXMgYSBkZXByZWNhdGVkIFNQRFggbGljZW5zZSBpZGVudGlmaWVyLCB1c2UgIicuJGxpY2Vuc2UuJy1vbmx5IiBvciAiJy4kbGljZW5zZS4nLW9yLWxhdGVyIiBpbnN0ZWFkJywKJGxpY2Vuc2UKKTsKfSBlbHNlIHsKJHdhcm5pbmdzW10gPSBzcHJpbnRmKAonTGljZW5zZSAiJXMiIGlzIGEgZGVwcmVjYXRlZCBTUERYIGxpY2Vuc2UgaWRlbnRpZmllciwgc2VlIGh0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvJywKJGxpY2Vuc2UKKTsKfQp9Cn0KfQoKaWYgKCgkZmxhZ3MgJiBzZWxmOjpDSEVDS19WRVJTSU9OKSAmJiBpc3NldCgkbWFuaWZlc3RbJ3ZlcnNpb24nXSkpIHsKJHdhcm5pbmdzW10gPSAnVGhlIHZlcnNpb24gZmllbGQgaXMgcHJlc2VudCwgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGVhdmUgaXQgb3V0IGlmIHRoZSBwYWNrYWdlIGlzIHB1Ymxpc2hlZCBvbiBQYWNrYWdpc3QuJzsKfQoKaWYgKCFlbXB0eSgkbWFuaWZlc3RbJ25hbWUnXSkgJiYgUHJlZzo6aXNNYXRjaCgne1tBLVpdfScsICRtYW5pZmVzdFsnbmFtZSddKSkgewokc3VnZ2VzdE5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7KD86KFthLXpdKShbQS1aXSl8KFtBLVpdKShbQS1aXVthLXpdKSl9JywgJ1xcMVxcMy1cXDJcXDQnLCAkbWFuaWZlc3RbJ25hbWUnXSk7CiRzdWdnZXN0TmFtZSA9IHN0cnRvbG93ZXIoJHN1Z2dlc3ROYW1lKTsKCiRwdWJsaXNoRXJyb3JzW10gPSBzcHJpbnRmKAonTmFtZSAiJXMiIGRvZXMgbm90IG1hdGNoIHRoZSBiZXN0IHByYWN0aWNlIChlLmcuIGxvd2VyLWNhc2VkL3dpdGgtZGFzaGVzKS4gV2Ugc3VnZ2VzdCB1c2luZyAiJXMiIGluc3RlYWQuIEFzIHN1Y2ggeW91IHdpbGwgbm90IGJlIGFibGUgdG8gc3VibWl0IGl0IHRvIFBhY2thZ2lzdC4nLAokbWFuaWZlc3RbJ25hbWUnXSwKJHN1Z2dlc3ROYW1lCik7Cn0KCmlmICghZW1wdHkoJG1hbmlmZXN0Wyd0eXBlJ10pICYmICRtYW5pZmVzdFsndHlwZSddID09PSAnY29tcG9zZXItaW5zdGFsbGVyJykgewokd2FybmluZ3NbXSA9ICJUaGUgcGFja2FnZSB0eXBlICdjb21wb3Nlci1pbnN0YWxsZXInIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBkaXN0cmlidXRlIHlvdXIgY3VzdG9tIGluc3RhbGxlcnMgYXMgcGx1Z2lucyBmcm9tIG5vdyBvbi4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy9wbHVnaW5zLm1kIGZvciBwbHVnaW4gZG9jdW1lbnRhdGlvbi4iOwp9CgoKaWYgKGlzc2V0KCRtYW5pZmVzdFsncmVxdWlyZSddLCAkbWFuaWZlc3RbJ3JlcXVpcmUtZGV2J10pKSB7CiRyZXF1aXJlT3ZlcnJpZGVzID0gYXJyYXlfaW50ZXJzZWN0X2tleSgkbWFuaWZlc3RbJ3JlcXVpcmUnXSwgJG1hbmlmZXN0WydyZXF1aXJlLWRldiddKTsKCmlmICghZW1wdHkoJHJlcXVpcmVPdmVycmlkZXMpKSB7CiRwbHVyYWwgPSAoY291bnQoJHJlcXVpcmVPdmVycmlkZXMpID4gMSkgPyAnYXJlJyA6ICdpcyc7CiR3YXJuaW5nc1tdID0gaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKCRyZXF1aXJlT3ZlcnJpZGVzKSkuICIgeyRwbHVyYWx9IHJlcXVpcmVkIGJvdGggaW4gcmVxdWlyZSBhbmQgcmVxdWlyZS1kZXYsIHRoaXMgY2FuIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvciI7Cn0KfQoKCmZvcmVhY2ggKFsncHJvdmlkZScsICdyZXBsYWNlJ10gYXMgJGxpbmtUeXBlKSB7CmlmIChpc3NldCgkbWFuaWZlc3RbJGxpbmtUeXBlXSkpIHsKZm9yZWFjaCAoWydyZXF1aXJlJywgJ3JlcXVpcmUtZGV2J10gYXMgJHJlcXVpcmVUeXBlKSB7CmlmIChpc3NldCgkbWFuaWZlc3RbJHJlcXVpcmVUeXBlXSkpIHsKZm9yZWFjaCAoJG1hbmlmZXN0WyRsaW5rVHlwZV0gYXMgJHByb3ZpZGUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKGlzc2V0KCRtYW5pZmVzdFskcmVxdWlyZVR5cGVdWyRwcm92aWRlXSkpIHsKJHdhcm5pbmdzW10gPSAnVGhlIHBhY2thZ2UgJyAuICRwcm92aWRlIC4gJyBpbiAnLiRyZXF1aXJlVHlwZS4nIGlzIGFsc28gbGlzdGVkIGluICcuJGxpbmtUeXBlLicgd2hpY2ggc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudC4gUmVtb3ZlIGl0IGZyb20gJy4kbGlua1R5cGUuJyBpZiB5b3Ugd2lzaCB0byBpbnN0YWxsIGl0Lic7Cn0KfQp9Cn0KfQp9CgoKJHJlcXVpcmUgPSAkbWFuaWZlc3RbJ3JlcXVpcmUnXSA/PyBbXTsKJHJlcXVpcmVEZXYgPSAkbWFuaWZlc3RbJ3JlcXVpcmUtZGV2J10gPz8gW107CiRwYWNrYWdlcyA9IGFycmF5X21lcmdlKCRyZXF1aXJlLCAkcmVxdWlyZURldik7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSA9PiAkdmVyc2lvbikgewppZiAoUHJlZzo6aXNNYXRjaCgnLyMvJywgJHZlcnNpb24pKSB7CiR3YXJuaW5nc1tdID0gc3ByaW50ZigKJ1RoZSBwYWNrYWdlICIlcyIgaXMgcG9pbnRpbmcgdG8gYSBjb21taXQtcmVmLCB0aGlzIGlzIGJhZCBwcmFjdGljZSBhbmQgY2FuIGNhdXNlIHVuZm9yZXNlZW4gaXNzdWVzLicsCiRwYWNrYWdlCik7Cn0KfQoKCiRzY3JpcHRzRGVzY3JpcHRpb25zID0gJG1hbmlmZXN0WydzY3JpcHRzLWRlc2NyaXB0aW9ucyddID8/IFtdOwokc2NyaXB0cyA9ICRtYW5pZmVzdFsnc2NyaXB0cyddID8/IFtdOwpmb3JlYWNoICgkc2NyaXB0c0Rlc2NyaXB0aW9ucyBhcyAkc2NyaXB0TmFtZSA9PiAkc2NyaXB0RGVzY3JpcHRpb24pIHsKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRzY3JpcHROYW1lLCAkc2NyaXB0cykpIHsKJHdhcm5pbmdzW10gPSBzcHJpbnRmKAonRGVzY3JpcHRpb24gZm9yIG5vbi1leGlzdGVudCBzY3JpcHQgIiVzIiBmb3VuZCBpbiAic2NyaXB0cy1kZXNjcmlwdGlvbnMiJywKJHNjcmlwdE5hbWUKKTsKfQp9CgoKJHNjcmlwdEFsaWFzZXMgPSAkbWFuaWZlc3RbJ3NjcmlwdHMtYWxpYXNlcyddID8/IFtdOwpmb3JlYWNoICgkc2NyaXB0QWxpYXNlcyBhcyAkc2NyaXB0TmFtZSA9PiAkc2NyaXB0QWxpYXMpIHsKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRzY3JpcHROYW1lLCAkc2NyaXB0cykpIHsKJHdhcm5pbmdzW10gPSBzcHJpbnRmKAonQWxpYXNlcyBmb3Igbm9uLWV4aXN0ZW50IHNjcmlwdCAiJXMiIGZvdW5kIGluICJzY3JpcHRzLWFsaWFzZXMiJywKJHNjcmlwdE5hbWUKKTsKfQp9CgoKaWYgKGlzc2V0KCRtYW5pZmVzdFsnYXV0b2xvYWQnXVsncHNyLTAnXVsnJ10pKSB7CiR3YXJuaW5nc1tdID0gIkRlZmluaW5nIGF1dG9sb2FkLnBzci0wIHdpdGggYW4gZW1wdHkgbmFtZXNwYWNlIHByZWZpeCBpcyBhIGJhZCBpZGVhIGZvciBwZXJmb3JtYW5jZSI7Cn0KaWYgKGlzc2V0KCRtYW5pZmVzdFsnYXV0b2xvYWQnXVsncHNyLTQnXVsnJ10pKSB7CiR3YXJuaW5nc1tdID0gIkRlZmluaW5nIGF1dG9sb2FkLnBzci00IHdpdGggYW4gZW1wdHkgbmFtZXNwYWNlIHByZWZpeCBpcyBhIGJhZCBpZGVhIGZvciBwZXJmb3JtYW5jZSI7Cn0KCiRsb2FkZXIgPSBuZXcgVmFsaWRhdGluZ0FycmF5TG9hZGVyKG5ldyBBcnJheUxvYWRlcigpLCB0cnVlLCBudWxsLCAkYXJyYXlMb2FkZXJWYWxpZGF0aW9uRmxhZ3MpOwp0cnkgewppZiAoIWlzc2V0KCRtYW5pZmVzdFsndmVyc2lvbiddKSkgewokbWFuaWZlc3RbJ3ZlcnNpb24nXSA9ICcxLjAuMCc7Cn0KaWYgKCFpc3NldCgkbWFuaWZlc3RbJ25hbWUnXSkpIHsKJG1hbmlmZXN0WyduYW1lJ10gPSAnZHVtbXkvZHVtbXknOwp9CiRsb2FkZXItPmxvYWQoJG1hbmlmZXN0KTsKfSBjYXRjaCAoSW52YWxpZFBhY2thZ2VFeGNlcHRpb24gJGUpIHsKJGVycm9ycyA9IGFycmF5X21lcmdlKCRlcnJvcnMsICRlLT5nZXRFcnJvcnMoKSk7Cn0KCiR3YXJuaW5ncyA9IGFycmF5X21lcmdlKCR3YXJuaW5ncywgJGxvYWRlci0+Z2V0V2FybmluZ3MoKSk7CgpyZXR1cm4gWyRlcnJvcnMsICRwdWJsaXNoRXJyb3JzLCAkd2FybmluZ3NdOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CgoKCgoKCmNsYXNzIEVycm9ySGFuZGxlcgp7Cgpwcml2YXRlIHN0YXRpYyAkaW87CgoKcHJpdmF0ZSBzdGF0aWMgJGhhc1Nob3duRGVwcmVjYXRpb25Ob3RpY2UgPSAwOwoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhbmRsZShpbnQgJGxldmVsLCBzdHJpbmcgJG1lc3NhZ2UsIHN0cmluZyAkZmlsZSwgaW50ICRsaW5lKTogYm9vbAp7CiRpc0RlcHJlY2F0aW9uTm90aWNlID0gJGxldmVsID09PSBFX0RFUFJFQ0FURUQgfHwgJGxldmVsID09PSBFX1VTRVJfREVQUkVDQVRFRDsKCgppZiAoISRpc0RlcHJlY2F0aW9uTm90aWNlICYmIDAgPT09IChlcnJvcl9yZXBvcnRpbmcoKSAmICRsZXZlbCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChmaWx0ZXJfdmFyKGluaV9nZXQoJ3hkZWJ1Zy5zY3JlYW0nKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pKSB7CiRtZXNzYWdlIC49ICJcblxuV2FybmluZzogWW91IGhhdmUgeGRlYnVnLnNjcmVhbSBlbmFibGVkLCB0aGUgd2FybmluZyBhYm92ZSBtYXkgYmUiLgoiXG5hIGxlZ2l0aW1hdGVseSBzdXBwcmVzc2VkIGVycm9yIHRoYXQgeW91IHdlcmUgbm90IHN1cHBvc2VkIHRvIHNlZS4iOwp9CgppZiAoISRpc0RlcHJlY2F0aW9uTm90aWNlKSB7CgoKaWYgKGluX2FycmF5KCRsZXZlbCwgW0VfV0FSTklORywgRV9VU0VSX1dBUk5JTkddLCB0cnVlKSAmJiBzdHJfY29udGFpbnMoJG1lc3NhZ2UsICdzaG91bGQgZWl0aGVyIGJlIHVzZWQgb3IgaW50ZW50aW9uYWxseSBpZ25vcmVkIGJ5IGNhc3RpbmcgaXQgYXMgKHZvaWQpJykpIHsKc2VsZjo6b3V0cHV0V2FybmluZygnSWdub3JlZCBuZXcgUEhQIHdhcm5pbmcgYnV0IGl0IHNob3VsZCBiZSByZXBvcnRlZCBhbmQgZml4ZWQ6ICcuJG1lc3NhZ2UuJyBpbiAnLiRmaWxlLic6Jy4kbGluZSwgdHJ1ZSk7CnJldHVybiB0cnVlOwp9Cgp0aHJvdyBuZXcgXEVycm9yRXhjZXB0aW9uKCRtZXNzYWdlLCAwLCAkbGV2ZWwsICRmaWxlLCAkbGluZSk7Cn0KCmlmIChzZWxmOjokaW8gIT09IG51bGwpIHsKaWYgKHNlbGY6OiRoYXNTaG93bkRlcHJlY2F0aW9uTm90aWNlID4gMCAmJiAhc2VsZjo6JGlvLT5pc1ZlcmJvc2UoKSkgewppZiAoc2VsZjo6JGhhc1Nob3duRGVwcmVjYXRpb25Ob3RpY2UgPT09IDEpIHsKc2VsZjo6JGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Nb3JlIGRlcHJlY2F0aW9uIG5vdGljZXMgd2VyZSBoaWRkZW4sIHJ1biBhZ2FpbiB3aXRoIGAtdmAgdG8gc2hvdyB0aGVtLjwvd2FybmluZz4nKTsKc2VsZjo6JGhhc1Nob3duRGVwcmVjYXRpb25Ob3RpY2UgPSAyOwp9CnJldHVybiB0cnVlOwp9CnNlbGY6OiRoYXNTaG93bkRlcHJlY2F0aW9uTm90aWNlID0gMTsKc2VsZjo6b3V0cHV0V2FybmluZygnRGVwcmVjYXRpb24gTm90aWNlOiAnLiRtZXNzYWdlLicgaW4gJy4kZmlsZS4nOicuJGxpbmUpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWdpc3Rlcig/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCk6IHZvaWQKewpzZXRfZXJyb3JfaGFuZGxlcihbX19DTEFTU19fLCAnaGFuZGxlJ10pOwplcnJvcl9yZXBvcnRpbmcoRV9BTEwpOwpzZWxmOjokaW8gPSAkaW87Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG91dHB1dFdhcm5pbmcoc3RyaW5nICRtZXNzYWdlLCBib29sICRvdXRwdXRFdmVuV2l0aG91dElPID0gZmFsc2UpOiB2b2lkCnsKaWYgKHNlbGY6OiRpbyAhPT0gbnVsbCkgewpzZWxmOjokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJG1lc3NhZ2UuJzwvd2FybmluZz4nKTsKaWYgKHNlbGY6OiRpby0+aXNWZXJib3NlKCkpIHsKc2VsZjo6JGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5TdGFjayB0cmFjZTo8L3dhcm5pbmc+Jyk7CnNlbGY6OiRpby0+d3JpdGVFcnJvcihhcnJheV9maWx0ZXIoYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGEpOiA/c3RyaW5nIHsKaWYgKGlzc2V0KCRhWydsaW5lJ10sICRhWydmaWxlJ10pKSB7CnJldHVybiAnPHdhcm5pbmc+ICcuJGFbJ2ZpbGUnXS4nOicuJGFbJ2xpbmUnXS4nPC93YXJuaW5nPic7Cn0KCnJldHVybiBudWxsOwp9LCBhcnJheV9zbGljZShkZWJ1Z19iYWNrdHJhY2UoKSwgMikpLCBmdW5jdGlvbiAoP3N0cmluZyAkbGluZSkgewpyZXR1cm4gJGxpbmUgIT09IG51bGw7Cn0pKTsKfQoKcmV0dXJuOwp9CgppZiAoJG91dHB1dEV2ZW5XaXRob3V0SU8pIHsKaWYgKGRlZmluZWQoJ1NUREVSUicpICYmIGlzX3Jlc291cmNlKFNUREVSUikpIHsKZndyaXRlKFNUREVSUiwgJ1dhcm5pbmc6ICcuJG1lc3NhZ2UuUEhQX0VPTCk7Cn0gZWxzZSB7CmVjaG8gJ1dhcm5pbmc6ICcuJG1lc3NhZ2UuUEhQX0VPTDsKfQp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBFcnJvckV4Y2VwdGlvbjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yOwp1c2UgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uXElPRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEZpbmRlcjsKCgoKCgpjbGFzcyBGaWxlc3lzdGVtCnsKCnByaXZhdGUgJHByb2Nlc3NFeGVjdXRvcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/UHJvY2Vzc0V4ZWN1dG9yICRleGVjdXRvciA9IG51bGwpCnsKJHRoaXMtPnByb2Nlc3NFeGVjdXRvciA9ICRleGVjdXRvcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZShzdHJpbmcgJGZpbGUpCnsKaWYgKGlzX2RpcigkZmlsZSkpIHsKcmV0dXJuICR0aGlzLT5yZW1vdmVEaXJlY3RvcnkoJGZpbGUpOwp9CgppZiAoZmlsZV9leGlzdHMoJGZpbGUpKSB7CnJldHVybiAkdGhpcy0+dW5saW5rKCRmaWxlKTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RpckVtcHR5KHN0cmluZyAkZGlyKQp7CiRmaW5kZXIgPSBGaW5kZXI6OmNyZWF0ZSgpCi0+aWdub3JlVkNTKGZhbHNlKQotPmlnbm9yZURvdEZpbGVzKGZhbHNlKQotPmRlcHRoKDApCi0+aW4oJGRpcik7CgpyZXR1cm4gXGNvdW50KCRmaW5kZXIpID09PSAwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZW1wdHlEaXJlY3Rvcnkoc3RyaW5nICRkaXIsIGJvb2wgJGVuc3VyZURpcmVjdG9yeUV4aXN0cyA9IHRydWUpCnsKaWYgKGlzX2xpbmsoJGRpcikgJiYgZmlsZV9leGlzdHMoJGRpcikpIHsKJHRoaXMtPnVubGluaygkZGlyKTsKfQoKaWYgKCRlbnN1cmVEaXJlY3RvcnlFeGlzdHMpIHsKJHRoaXMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkZGlyKTsKfQoKaWYgKGlzX2RpcigkZGlyKSkgewokZmluZGVyID0gRmluZGVyOjpjcmVhdGUoKQotPmlnbm9yZVZDUyhmYWxzZSkKLT5pZ25vcmVEb3RGaWxlcyhmYWxzZSkKLT5kZXB0aCgwKQotPmluKCRkaXIpOwoKZm9yZWFjaCAoJGZpbmRlciBhcyAkcGF0aCkgewokdGhpcy0+cmVtb3ZlKChzdHJpbmcpICRwYXRoKTsKfQp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVEaXJlY3Rvcnkoc3RyaW5nICRkaXJlY3RvcnkpCnsKJGVkZ2VDYXNlUmVzdWx0ID0gJHRoaXMtPnJlbW92ZUVkZ2VDYXNlcygkZGlyZWN0b3J5KTsKaWYgKCRlZGdlQ2FzZVJlc3VsdCAhPT0gbnVsbCkgewpyZXR1cm4gJGVkZ2VDYXNlUmVzdWx0Owp9CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRjbWQgPSBbJ3JtZGlyJywgJy9TJywgJy9RJywgUGxhdGZvcm06OnJlYWxwYXRoKCRkaXJlY3RvcnkpXTsKfSBlbHNlIHsKJGNtZCA9IFsncm0nLCAnLXJmJywgJGRpcmVjdG9yeV07Cn0KCiRyZXN1bHQgPSAkdGhpcy0+Z2V0UHJvY2VzcygpLT5leGVjdXRlKCRjbWQsICRvdXRwdXQpID09PSAwOwoKCmNsZWFyc3RhdGNhY2hlKCk7CgppZiAoJHJlc3VsdCAmJiAhaXNfZGlyKCRkaXJlY3RvcnkpKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gJHRoaXMtPnJlbW92ZURpcmVjdG9yeVBocCgkZGlyZWN0b3J5KTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVEaXJlY3RvcnlBc3luYyhzdHJpbmcgJGRpcmVjdG9yeSkKewokZWRnZUNhc2VSZXN1bHQgPSAkdGhpcy0+cmVtb3ZlRWRnZUNhc2VzKCRkaXJlY3RvcnkpOwppZiAoJGVkZ2VDYXNlUmVzdWx0ICE9PSBudWxsKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKCRlZGdlQ2FzZVJlc3VsdCk7Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJGNtZCA9IFsncm1kaXInLCAnL1MnLCAnL1EnLCBQbGF0Zm9ybTo6cmVhbHBhdGgoJGRpcmVjdG9yeSldOwp9IGVsc2UgewokY21kID0gWydybScsICctcmYnLCAkZGlyZWN0b3J5XTsKfQoKJHByb21pc2UgPSAkdGhpcy0+Z2V0UHJvY2VzcygpLT5leGVjdXRlQXN5bmMoJGNtZCk7CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKCRwcm9jZXNzKSB1c2UgKCRkaXJlY3RvcnkpIHsKCmNsZWFyc3RhdGNhY2hlKCk7CgppZiAoJHByb2Nlc3MtPmlzU3VjY2Vzc2Z1bCgpKSB7CmlmICghaXNfZGlyKCRkaXJlY3RvcnkpKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKHRydWUpOwp9Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKCR0aGlzLT5yZW1vdmVEaXJlY3RvcnlQaHAoJGRpcmVjdG9yeSkpOwp9KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZW1vdmVFZGdlQ2FzZXMoc3RyaW5nICRkaXJlY3RvcnksIGJvb2wgJGZhbGxiYWNrVG9QaHAgPSB0cnVlKTogP2Jvb2wKewppZiAoJHRoaXMtPmlzU3ltbGlua2VkRGlyZWN0b3J5KCRkaXJlY3RvcnkpKSB7CnJldHVybiAkdGhpcy0+dW5saW5rU3ltbGlua2VkRGlyZWN0b3J5KCRkaXJlY3RvcnkpOwp9CgppZiAoJHRoaXMtPmlzSnVuY3Rpb24oJGRpcmVjdG9yeSkpIHsKcmV0dXJuICR0aGlzLT5yZW1vdmVKdW5jdGlvbigkZGlyZWN0b3J5KTsKfQoKaWYgKGlzX2xpbmsoJGRpcmVjdG9yeSkpIHsKcmV0dXJuIHVubGluaygkZGlyZWN0b3J5KTsKfQoKaWYgKCFpc19kaXIoJGRpcmVjdG9yeSkgfHwgIWZpbGVfZXhpc3RzKCRkaXJlY3RvcnkpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgne14oPzpbYS16XTopP1svXFxcXF0rJH1pJywgJGRpcmVjdG9yeSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdBYm9ydGluZyBhbiBhdHRlbXB0ZWQgZGVsZXRpb24gb2YgJy4kZGlyZWN0b3J5LicsIHRoaXMgd2FzIHByb2JhYmx5IG5vdCBpbnRlbmRlZCwgaWYgaXQgaXMgYSByZWFsIHVzZSBjYXNlIHBsZWFzZSByZXBvcnQgaXQuJyk7Cn0KCmlmICghXGZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykgJiYgJGZhbGxiYWNrVG9QaHApIHsKcmV0dXJuICR0aGlzLT5yZW1vdmVEaXJlY3RvcnlQaHAoJGRpcmVjdG9yeSk7Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlRGlyZWN0b3J5UGhwKHN0cmluZyAkZGlyZWN0b3J5KQp7CiRlZGdlQ2FzZVJlc3VsdCA9ICR0aGlzLT5yZW1vdmVFZGdlQ2FzZXMoJGRpcmVjdG9yeSwgZmFsc2UpOwppZiAoJGVkZ2VDYXNlUmVzdWx0ICE9PSBudWxsKSB7CnJldHVybiAkZWRnZUNhc2VSZXN1bHQ7Cn0KCnRyeSB7CiRpdCA9IG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyZWN0b3J5LCBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewoKCmNsZWFyc3RhdGNhY2hlKCk7CnVzbGVlcCgxMDAwMDApOwppZiAoIWlzX2RpcigkZGlyZWN0b3J5KSkgewpyZXR1cm4gdHJ1ZTsKfQokaXQgPSBuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGRpcmVjdG9yeSwgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3I6OlNLSVBfRE9UUyk7Cn0KJHJpID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGl0LCBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpDSElMRF9GSVJTVCk7Cgpmb3JlYWNoICgkcmkgYXMgJGZpbGUpIHsKaWYgKCRmaWxlLT5pc0RpcigpKSB7CiR0aGlzLT5ybWRpcigkZmlsZS0+Z2V0UGF0aG5hbWUoKSk7Cn0gZWxzZSB7CiR0aGlzLT51bmxpbmsoJGZpbGUtPmdldFBhdGhuYW1lKCkpOwp9Cn0KCgp1bnNldCgkcmksICRpdCwgJGZpbGUpOwoKcmV0dXJuICR0aGlzLT5ybWRpcigkZGlyZWN0b3J5KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0cyhzdHJpbmcgJGRpcmVjdG9yeSkKewppZiAoIWlzX2RpcigkZGlyZWN0b3J5KSkgewppZiAoZmlsZV9leGlzdHMoJGRpcmVjdG9yeSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAokZGlyZWN0b3J5LicgZXhpc3RzIGFuZCBpcyBub3QgYSBkaXJlY3RvcnkuJwopOwp9CgppZiAoaXNfbGluaygkZGlyZWN0b3J5KSAmJiAhQCR0aGlzLT51bmxpbmtJbXBsZW1lbnRhdGlvbigkZGlyZWN0b3J5KSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBkZWxldGUgc3ltYm9saWMgbGluayAnLiRkaXJlY3RvcnkuJzogJy4oZXJyb3JfZ2V0X2xhc3QoKVsnbWVzc2FnZSddID8/ICcnKSk7Cn0KCmlmICghQG1rZGlyKCRkaXJlY3RvcnksIDA3NzcsIHRydWUpKSB7CiRlID0gbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRkaXJlY3RvcnkuJyBkb2VzIG5vdCBleGlzdCBhbmQgY291bGQgbm90IGJlIGNyZWF0ZWQ6ICcuKGVycm9yX2dldF9sYXN0KClbJ21lc3NhZ2UnXSA/PyAnJykpOwoKCgoKCiRub3JtYWxpemVkID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJGRpcmVjdG9yeSk7CmlmICgkbm9ybWFsaXplZCAhPT0gJGRpcmVjdG9yeSkgewp0cnkgewokdGhpcy0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRub3JtYWxpemVkKTsKcmV0dXJuOwp9IGNhdGNoIChcVGhyb3dhYmxlICRpZ25vcmVkRXgpIHt9Cn0KCnRocm93ICRlOwp9Cn0KfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVubGluayhzdHJpbmcgJHBhdGgpCnsKJHVubGlua2VkID0gQCR0aGlzLT51bmxpbmtJbXBsZW1lbnRhdGlvbigkcGF0aCk7CmlmICghJHVubGlua2VkKSB7CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnVzbGVlcCgzNTAwMDApOwokdW5saW5rZWQgPSBAJHRoaXMtPnVubGlua0ltcGxlbWVudGF0aW9uKCRwYXRoKTsKfQoKaWYgKCEkdW5saW5rZWQpIHsKJGVycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKJG1lc3NhZ2UgPSAnQ291bGQgbm90IGRlbGV0ZSAnLiRwYXRoLic6ICcgLiAoJGVycm9yWydtZXNzYWdlJ10gPz8gJycpOwppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRtZXNzYWdlIC49ICJcblRoaXMgY2FuIGJlIGR1ZSB0byBhbiBhbnRpdmlydXMgb3IgdGhlIFdpbmRvd3MgU2VhcmNoIEluZGV4ZXIgbG9ja2luZyB0aGUgZmlsZSB3aGlsZSB0aGV5IGFyZSBhbmFseXplZCI7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBybWRpcihzdHJpbmcgJHBhdGgpCnsKJGRlbGV0ZWQgPSBAcm1kaXIoJHBhdGgpOwppZiAoISRkZWxldGVkKSB7CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnVzbGVlcCgzNTAwMDApOwokZGVsZXRlZCA9IEBybWRpcigkcGF0aCk7Cn0KCmlmICghJGRlbGV0ZWQpIHsKJGVycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKJG1lc3NhZ2UgPSAnQ291bGQgbm90IGRlbGV0ZSAnLiRwYXRoLic6ICcgLiAoJGVycm9yWydtZXNzYWdlJ10gPz8gJycpOwppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRtZXNzYWdlIC49ICJcblRoaXMgY2FuIGJlIGR1ZSB0byBhbiBhbnRpdmlydXMgb3IgdGhlIFdpbmRvd3MgU2VhcmNoIEluZGV4ZXIgbG9ja2luZyB0aGUgZmlsZSB3aGlsZSB0aGV5IGFyZSBhbmFseXplZCI7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvcHlUaGVuUmVtb3ZlKHN0cmluZyAkc291cmNlLCBzdHJpbmcgJHRhcmdldCkKewokdGhpcy0+Y29weSgkc291cmNlLCAkdGFyZ2V0KTsKaWYgKCFpc19kaXIoJHNvdXJjZSkpIHsKJHRoaXMtPnVubGluaygkc291cmNlKTsKCnJldHVybjsKfQoKJHRoaXMtPnJlbW92ZURpcmVjdG9yeVBocCgkc291cmNlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weShzdHJpbmcgJHNvdXJjZSwgc3RyaW5nICR0YXJnZXQpCnsKCiR0YXJnZXQgPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkdGFyZ2V0KTsKCmlmICghaXNfZGlyKCRzb3VyY2UpKSB7CnRyeSB7CnJldHVybiBjb3B5KCRzb3VyY2UsICR0YXJnZXQpOwp9IGNhdGNoIChFcnJvckV4Y2VwdGlvbiAkZSkgewoKCmlmIChzdHJfY29udGFpbnMoJGUtPmdldE1lc3NhZ2UoKSwgJ0JhZCBhZGRyZXNzJykpIHsKJHNvdXJjZUhhbmRsZSA9IGZvcGVuKCRzb3VyY2UsICdyJyk7CiR0YXJnZXRIYW5kbGUgPSBmb3BlbigkdGFyZ2V0LCAndycpOwppZiAoZmFsc2UgPT09ICRzb3VyY2VIYW5kbGUgfHwgZmFsc2UgPT09ICR0YXJnZXRIYW5kbGUpIHsKdGhyb3cgJGU7Cn0Kd2hpbGUgKCFmZW9mKCRzb3VyY2VIYW5kbGUpKSB7CmlmIChmYWxzZSA9PT0gZndyaXRlKCR0YXJnZXRIYW5kbGUsIChzdHJpbmcpIGZyZWFkKCRzb3VyY2VIYW5kbGUsIDEwMjQgKiAxMDI0KSkpIHsKdGhyb3cgJGU7Cn0KfQpmY2xvc2UoJHNvdXJjZUhhbmRsZSk7CmZjbG9zZSgkdGFyZ2V0SGFuZGxlKTsKCnJldHVybiB0cnVlOwp9CnRocm93ICRlOwp9Cn0KCiRpdCA9IG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkc291cmNlLCBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKTsKJHJpID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGl0LCBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpTRUxGX0ZJUlNUKTsKJHRoaXMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGFyZ2V0KTsKCiRyZXN1bHQgPSB0cnVlOwpmb3JlYWNoICgkcmkgYXMgJGZpbGUpIHsKJHRhcmdldFBhdGggPSAkdGFyZ2V0IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRyaS0+Z2V0U3ViUGF0aG5hbWUoKTsKaWYgKCRmaWxlLT5pc0RpcigpKSB7CiR0aGlzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHRhcmdldFBhdGgpOwp9IGVsc2UgewokcmVzdWx0ID0gJHJlc3VsdCAmJiBjb3B5KCRmaWxlLT5nZXRQYXRobmFtZSgpLCAkdGFyZ2V0UGF0aCk7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW5hbWUoc3RyaW5nICRzb3VyY2UsIHN0cmluZyAkdGFyZ2V0KQp7CmlmICh0cnVlID09PSBAcmVuYW1lKCRzb3VyY2UsICR0YXJnZXQpKSB7CnJldHVybjsKfQoKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewokdGhpcy0+Y29weVRoZW5SZW1vdmUoJHNvdXJjZSwgJHRhcmdldCk7CgpyZXR1cm47Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKCiRyZXN1bHQgPSAkdGhpcy0+Z2V0UHJvY2VzcygpLT5leGVjdXRlKFsneGNvcHknLCAkc291cmNlLCAkdGFyZ2V0LCAnL0UnLCAnL0knLCAnL1EnLCAnL1knXSwgJG91dHB1dCk7CgoKY2xlYXJzdGF0Y2FjaGUoKTsKCmlmICgwID09PSAkcmVzdWx0KSB7CiR0aGlzLT5yZW1vdmUoJHNvdXJjZSk7CgpyZXR1cm47Cn0KfSBlbHNlIHsKCgokcmVzdWx0ID0gJHRoaXMtPmdldFByb2Nlc3MoKS0+ZXhlY3V0ZShbJ212JywgJHNvdXJjZSwgJHRhcmdldF0sICRvdXRwdXQpOwoKCmNsZWFyc3RhdGNhY2hlKCk7CgppZiAoMCA9PT0gJHJlc3VsdCkgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmNvcHlUaGVuUmVtb3ZlKCRzb3VyY2UsICR0YXJnZXQpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kU2hvcnRlc3RQYXRoKHN0cmluZyAkZnJvbSwgc3RyaW5nICR0bywgYm9vbCAkZGlyZWN0b3JpZXMgPSBmYWxzZSwgYm9vbCAkcHJlZmVyUmVsYXRpdmUgPSBmYWxzZSkKewppZiAoISR0aGlzLT5pc0Fic29sdXRlUGF0aCgkZnJvbSkgfHwgISR0aGlzLT5pc0Fic29sdXRlUGF0aCgkdG8pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJyRmcm9tICglcykgYW5kICR0byAoJXMpIG11c3QgYmUgYWJzb2x1dGUgcGF0aHMuJywgJGZyb20sICR0bykpOwp9CgokZnJvbSA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRmcm9tKTsKJHRvID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHRvKTsKCmlmICgkZGlyZWN0b3JpZXMpIHsKJGZyb20gPSBydHJpbSgkZnJvbSwgJy8nKSAuICcvZHVtbXlfZmlsZSc7Cn0KCmlmIChcZGlybmFtZSgkZnJvbSkgPT09IFxkaXJuYW1lKCR0bykpIHsKcmV0dXJuICcuLycuYmFzZW5hbWUoJHRvKTsKfQoKJGNvbW1vblBhdGggPSAkdG87CndoaWxlIChzdHJwb3MoJGZyb20uJy8nLCAkY29tbW9uUGF0aC4nLycpICE9PSAwICYmICcvJyAhPT0gJGNvbW1vblBhdGggJiYgIVByZWc6OmlzTWF0Y2goJ3teW0EtWl06Lz8kfWknLCAkY29tbW9uUGF0aCkpIHsKJGNvbW1vblBhdGggPSBzdHJ0cihcZGlybmFtZSgkY29tbW9uUGF0aCksICdcXCcsICcvJyk7Cn0KCgppZiAoMCAhPT0gc3RycG9zKCRmcm9tLCAkY29tbW9uUGF0aCkpIHsKcmV0dXJuICR0bzsKfQoKJGNvbW1vblBhdGggPSBydHJpbSgkY29tbW9uUGF0aCwgJy8nKSAuICcvJzsKJHNvdXJjZVBhdGhEZXB0aCA9IHN1YnN0cl9jb3VudCgoc3RyaW5nKSBzdWJzdHIoJGZyb20sIFxzdHJsZW4oJGNvbW1vblBhdGgpKSwgJy8nKTsKJGNvbW1vblBhdGhDb2RlID0gc3RyX3JlcGVhdCgnLi4vJywgJHNvdXJjZVBhdGhEZXB0aCk7CgoKaWYgKCEkcHJlZmVyUmVsYXRpdmUgJiYgJy8nID09PSAkY29tbW9uUGF0aCAmJiAkc291cmNlUGF0aERlcHRoID4gMSkgewpyZXR1cm4gJHRvOwp9CgokcmVzdWx0ID0gJGNvbW1vblBhdGhDb2RlIC4gc3Vic3RyKCR0bywgXHN0cmxlbigkY29tbW9uUGF0aCkpOwppZiAoXHN0cmxlbigkcmVzdWx0KSA9PT0gMCkgewpyZXR1cm4gJy4vJzsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRTaG9ydGVzdFBhdGhDb2RlKHN0cmluZyAkZnJvbSwgc3RyaW5nICR0bywgYm9vbCAkZGlyZWN0b3JpZXMgPSBmYWxzZSwgYm9vbCAkc3RhdGljQ29kZSA9IGZhbHNlLCBib29sICRwcmVmZXJSZWxhdGl2ZSA9IGZhbHNlKQp7CmlmICghJHRoaXMtPmlzQWJzb2x1dGVQYXRoKCRmcm9tKSB8fCAhJHRoaXMtPmlzQWJzb2x1dGVQYXRoKCR0bykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignJGZyb20gKCVzKSBhbmQgJHRvICglcykgbXVzdCBiZSBhYnNvbHV0ZSBwYXRocy4nLCAkZnJvbSwgJHRvKSk7Cn0KCiRmcm9tID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJGZyb20pOwokdG8gPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkdG8pOwoKaWYgKCRmcm9tID09PSAkdG8pIHsKcmV0dXJuICRkaXJlY3RvcmllcyA/ICdfX0RJUl9fJyA6ICdfX0ZJTEVfXyc7Cn0KCiRjb21tb25QYXRoID0gJHRvOwp3aGlsZSAoc3RycG9zKCRmcm9tLicvJywgJGNvbW1vblBhdGguJy8nKSAhPT0gMCAmJiAnLycgIT09ICRjb21tb25QYXRoICYmICFQcmVnOjppc01hdGNoKCd7XltBLVpdOi8/JH1pJywgJGNvbW1vblBhdGgpICYmICcuJyAhPT0gJGNvbW1vblBhdGgpIHsKJGNvbW1vblBhdGggPSBzdHJ0cihcZGlybmFtZSgkY29tbW9uUGF0aCksICdcXCcsICcvJyk7Cn0KCgppZiAoMCAhPT0gc3RycG9zKCRmcm9tLCAkY29tbW9uUGF0aCkgfHwgJy4nID09PSAkY29tbW9uUGF0aCkgewpyZXR1cm4gdmFyX2V4cG9ydCgkdG8sIHRydWUpOwp9CgokY29tbW9uUGF0aCA9IHJ0cmltKCRjb21tb25QYXRoLCAnLycpIC4gJy8nOwppZiAoc3RyX3N0YXJ0c193aXRoKCR0bywgJGZyb20uJy8nKSkgewpyZXR1cm4gJ19fRElSX18gLiAnLnZhcl9leHBvcnQoKHN0cmluZykgc3Vic3RyKCR0bywgXHN0cmxlbigkZnJvbSkpLCB0cnVlKTsKfQokc291cmNlUGF0aERlcHRoID0gc3Vic3RyX2NvdW50KChzdHJpbmcpIHN1YnN0cigkZnJvbSwgXHN0cmxlbigkY29tbW9uUGF0aCkpLCAnLycpICsgKGludCkgJGRpcmVjdG9yaWVzOwoKCmlmICghJHByZWZlclJlbGF0aXZlICYmICcvJyA9PT0gJGNvbW1vblBhdGggJiYgJHNvdXJjZVBhdGhEZXB0aCA+IDEpIHsKcmV0dXJuIHZhcl9leHBvcnQoJHRvLCB0cnVlKTsKfQoKaWYgKCRzdGF0aWNDb2RlKSB7CiRjb21tb25QYXRoQ29kZSA9ICJfX0RJUl9fIC4gJyIuc3RyX3JlcGVhdCgnLy4uJywgJHNvdXJjZVBhdGhEZXB0aCkuIiciOwp9IGVsc2UgewokY29tbW9uUGF0aENvZGUgPSBzdHJfcmVwZWF0KCdkaXJuYW1lKCcsICRzb3VyY2VQYXRoRGVwdGgpLidfX0RJUl9fJy5zdHJfcmVwZWF0KCcpJywgJHNvdXJjZVBhdGhEZXB0aCk7Cn0KJHJlbFRhcmdldCA9IChzdHJpbmcpIHN1YnN0cigkdG8sIFxzdHJsZW4oJGNvbW1vblBhdGgpKTsKCnJldHVybiAkY29tbW9uUGF0aENvZGUgLiAoXHN0cmxlbigkcmVsVGFyZ2V0KSA+IDAgPyAnLicgLiB2YXJfZXhwb3J0KCcvJyAuICRyZWxUYXJnZXQsIHRydWUpIDogJycpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0Fic29sdXRlUGF0aChzdHJpbmcgJHBhdGgpCnsKcmV0dXJuIHN0cnBvcygkcGF0aCwgJy8nKSA9PT0gMCB8fCBzdWJzdHIoJHBhdGgsIDEsIDEpID09PSAnOicgfHwgc3RycG9zKCRwYXRoLCAnXFxcXCcpID09PSAwOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzaXplKHN0cmluZyAkcGF0aCkKewppZiAoIWZpbGVfZXhpc3RzKCRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIiRwYXRoIGRvZXMgbm90IGV4aXN0LiIpOwp9CmlmIChpc19kaXIoJHBhdGgpKSB7CnJldHVybiAkdGhpcy0+ZGlyZWN0b3J5U2l6ZSgkcGF0aCk7Cn0KCnJldHVybiAoaW50KSBmaWxlc2l6ZSgkcGF0aCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChzdHJpbmcgJHBhdGgpCnsKJHBhcnRzID0gW107CiRwYXRoID0gc3RydHIoJHBhdGgsICdcXCcsICcvJyk7CiRwcmVmaXggPSAnJzsKJGFic29sdXRlID0gJyc7CgoKaWYgKHN0cnBvcygkcGF0aCwgJy8vJykgPT09IDAgJiYgXHN0cmxlbigkcGF0aCkgPiAyKSB7CiRhYnNvbHV0ZSA9ICcvLyc7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAyKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiggWzAtOWEtel17Mix9KzogKD86IC8vICg/OiBbYS16XTogKT8gKT8gfCBbYS16XTogKX1peCcsICRwYXRoLCAkbWF0Y2gpKSB7CiRwcmVmaXggPSAkbWF0Y2hbMV07CiRwYXRoID0gc3Vic3RyKCRwYXRoLCBcc3RybGVuKCRwcmVmaXgpKTsKfQoKaWYgKHN0cnBvcygkcGF0aCwgJy8nKSA9PT0gMCkgewokYWJzb2x1dGUgPSAnLyc7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAxKTsKfQoKJHVwID0gZmFsc2U7CmZvcmVhY2ggKGV4cGxvZGUoJy8nLCAkcGF0aCkgYXMgJGNodW5rKSB7CmlmICgnLi4nID09PSAkY2h1bmsgJiYgKFxzdHJsZW4oJGFic29sdXRlKSA+IDAgfHwgJHVwKSkgewphcnJheV9wb3AoJHBhcnRzKTsKJHVwID0gIShcY291bnQoJHBhcnRzKSA9PT0gMCB8fCAnLi4nID09PSBlbmQoJHBhcnRzKSk7Cn0gZWxzZWlmICgnLicgIT09ICRjaHVuayAmJiAnJyAhPT0gJGNodW5rKSB7CiRwYXJ0c1tdID0gJGNodW5rOwokdXAgPSAnLi4nICE9PSAkY2h1bms7Cn0KfQoKCiRwcmVmaXggPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3soXnw6Ly8pW2Etel06JH1pJywgc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkbSkgewpyZXR1cm4gc3RydG91cHBlcigkbVswXSk7Cn0sICRwcmVmaXgpOwoKcmV0dXJuICRwcmVmaXguJGFic29sdXRlLmltcGxvZGUoJy8nLCAkcGFydHMpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cmltVHJhaWxpbmdTbGFzaChzdHJpbmcgJHBhdGgpCnsKaWYgKCFQcmVnOjppc01hdGNoKCd7XlsvXFxcXF0rJH0nLCAkcGF0aCkpIHsKJHBhdGggPSBydHJpbSgkcGF0aCwgJy9cXCcpOwp9CgpyZXR1cm4gJHBhdGg7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0xvY2FsUGF0aChzdHJpbmcgJHBhdGgpCnsKCgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnJldHVybiBQcmVnOjppc01hdGNoKCd7XihmaWxlOi8vKD8hLy8pfC8oPyEvKXwvP1thLXpdOltcXFxcL118XC5cLltcXFxcL118W2EtejAtOV8uLV0rW1xcXFwvXSl9aScsICRwYXRoKTsKfQoKcmV0dXJuIFByZWc6OmlzTWF0Y2goJ3teKGZpbGU6Ly98L3wvP1thLXpdOltcXFxcL118XC5cLltcXFxcL118W2EtejAtOV8uLV0rW1xcXFwvXSl9aScsICRwYXRoKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybVBhdGgoc3RyaW5nICRwYXRoKQp7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJHBhdGggPSBQcmVnOjpyZXBsYWNlKCd7Xig/OmZpbGU6Ly8vKFthLXpdKTo/Lyl9aScsICdmaWxlOi8vJDE6LycsICRwYXRoKTsKfQoKcmV0dXJuIFByZWc6OnJlcGxhY2UoJ3teZmlsZTovL31pJywgJycsICRwYXRoKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzUmVhZGFibGUoc3RyaW5nICRwYXRoKQp7CmlmIChpc19yZWFkYWJsZSgkcGF0aCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19maWxlKCRwYXRoKSkgewpyZXR1cm4gZmFsc2UgIT09IFNpbGVuY2VyOjpjYWxsKCdmaWxlX2dldF9jb250ZW50cycsICRwYXRoLCBmYWxzZSwgbnVsbCwgMCwgMSk7Cn0KCmlmIChpc19kaXIoJHBhdGgpKSB7CnJldHVybiBmYWxzZSAhPT0gU2lsZW5jZXI6OmNhbGwoJ29wZW5kaXInLCAkcGF0aCk7Cn0KCgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkaXJlY3RvcnlTaXplKHN0cmluZyAkZGlyZWN0b3J5KQp7CiRpdCA9IG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyZWN0b3J5LCBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKTsKJHJpID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGl0LCBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpDSElMRF9GSVJTVCk7Cgokc2l6ZSA9IDA7CmZvcmVhY2ggKCRyaSBhcyAkZmlsZSkgewppZiAoJGZpbGUtPmlzRmlsZSgpKSB7CiRzaXplICs9ICRmaWxlLT5nZXRTaXplKCk7Cn0KfQoKcmV0dXJuICRzaXplOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UHJvY2VzcygpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpIHsKJHRoaXMtPnByb2Nlc3NFeGVjdXRvciA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoKTsKfQoKcmV0dXJuICR0aGlzLT5wcm9jZXNzRXhlY3V0b3I7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1bmxpbmtJbXBsZW1lbnRhdGlvbihzdHJpbmcgJHBhdGgpOiBib29sCnsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBpc19kaXIoJHBhdGgpICYmIGlzX2xpbmsoJHBhdGgpKSB7CnJldHVybiBybWRpcigkcGF0aCk7Cn0KCnJldHVybiB1bmxpbmsoJHBhdGgpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbGF0aXZlU3ltbGluayhzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRsaW5rKQp7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdzeW1saW5rJykpIHsKcmV0dXJuIGZhbHNlOwp9CgokY3dkID0gUGxhdGZvcm06OmdldEN3ZCgpOwoKJHJlbGF0aXZlUGF0aCA9ICR0aGlzLT5maW5kU2hvcnRlc3RQYXRoKCRsaW5rLCAkdGFyZ2V0KTsKY2hkaXIoXGRpcm5hbWUoJGxpbmspKTsKJHJlc3VsdCA9IEBzeW1saW5rKCRyZWxhdGl2ZVBhdGgsICRsaW5rKTsKCmNoZGlyKCRjd2QpOwoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzU3ltbGlua2VkRGlyZWN0b3J5KHN0cmluZyAkZGlyZWN0b3J5KQp7CmlmICghaXNfZGlyKCRkaXJlY3RvcnkpKSB7CnJldHVybiBmYWxzZTsKfQoKJHJlc29sdmVkID0gJHRoaXMtPnJlc29sdmVTeW1saW5rZWREaXJlY3RvcnlTeW1saW5rKCRkaXJlY3RvcnkpOwoKcmV0dXJuIGlzX2xpbmsoJHJlc29sdmVkKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB1bmxpbmtTeW1saW5rZWREaXJlY3Rvcnkoc3RyaW5nICRkaXJlY3RvcnkpOiBib29sCnsKJHJlc29sdmVkID0gJHRoaXMtPnJlc29sdmVTeW1saW5rZWREaXJlY3RvcnlTeW1saW5rKCRkaXJlY3RvcnkpOwoKcmV0dXJuICR0aGlzLT51bmxpbmsoJHJlc29sdmVkKTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVzb2x2ZVN5bWxpbmtlZERpcmVjdG9yeVN5bWxpbmsoc3RyaW5nICRwYXRobmFtZSk6IHN0cmluZwp7CmlmICghaXNfZGlyKCRwYXRobmFtZSkpIHsKcmV0dXJuICRwYXRobmFtZTsKfQoKJHJlc29sdmVkID0gcnRyaW0oJHBhdGhuYW1lLCAnLycpOwoKaWYgKDAgPT09IFxzdHJsZW4oJHJlc29sdmVkKSkgewpyZXR1cm4gJHBhdGhuYW1lOwp9CgpyZXR1cm4gJHJlc29sdmVkOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBqdW5jdGlvbihzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRqdW5jdGlvbikKewppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0Z1bmN0aW9uICVzIGlzIG5vdCBhdmFpbGFibGUgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm0nLCBfX0NMQVNTX18pKTsKfQppZiAoIWlzX2RpcigkdGFyZ2V0KSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IGp1bmN0aW9uIHRvICIlcyIgYXMgaXQgaXMgbm90IGEgZGlyZWN0b3J5LicsICR0YXJnZXQpLCAwLCBudWxsLCAkdGFyZ2V0KTsKfQoKCmlmICghaXNfZGlyKCRqdW5jdGlvbikgfHwgJHRoaXMtPmlzSnVuY3Rpb24oJGp1bmN0aW9uKSkgewpAcm1kaXIoJGp1bmN0aW9uKTsKfQoKJGNtZCA9IFsnbWtsaW5rJywgJy9KJywgc3RyX3JlcGxhY2UoJy8nLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkanVuY3Rpb24pLCBQbGF0Zm9ybTo6cmVhbHBhdGgoJHRhcmdldCldOwppZiAoJHRoaXMtPmdldFByb2Nlc3MoKS0+ZXhlY3V0ZSgkY21kLCAkb3V0cHV0KSAhPT0gMCkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNyZWF0ZSBqdW5jdGlvbiB0byAiJXMiIGF0ICIlcyIuJywgJHRhcmdldCwgJGp1bmN0aW9uKSwgMCwgbnVsbCwgJHRhcmdldCk7Cn0KY2xlYXJzdGF0Y2FjaGUodHJ1ZSwgJGp1bmN0aW9uKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNKdW5jdGlvbihzdHJpbmcgJGp1bmN0aW9uKQp7CmlmICghUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnJldHVybiBmYWxzZTsKfQoKCmNsZWFyc3RhdGNhY2hlKHRydWUsICRqdW5jdGlvbik7CgppZiAoIWlzX2RpcigkanVuY3Rpb24pIHx8IGlzX2xpbmsoJGp1bmN0aW9uKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRzdGF0ID0gbHN0YXQoJGp1bmN0aW9uKTsKCgpyZXR1cm4gaXNfYXJyYXkoJHN0YXQpID8gMHg0MDAwICE9PSAoJHN0YXRbJ21vZGUnXSAmIDB4RjAwMCkgOiBmYWxzZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlSnVuY3Rpb24oc3RyaW5nICRqdW5jdGlvbikKewppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gZmFsc2U7Cn0KJGp1bmN0aW9uID0gcnRyaW0oc3RyX3JlcGxhY2UoJy8nLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkanVuY3Rpb24pLCBESVJFQ1RPUllfU0VQQVJBVE9SKTsKaWYgKCEkdGhpcy0+aXNKdW5jdGlvbigkanVuY3Rpb24pKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCclcyBpcyBub3QgYSBqdW5jdGlvbiBhbmQgdGh1cyBjYW5ub3QgYmUgcmVtb3ZlZCBhcyBvbmUnLCAkanVuY3Rpb24pKTsKfQoKcmV0dXJuICR0aGlzLT5ybWRpcigkanVuY3Rpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZChzdHJpbmcgJHBhdGgsIHN0cmluZyAkY29udGVudCkKewokY3VycmVudENvbnRlbnQgPSBTaWxlbmNlcjo6Y2FsbCgnZmlsZV9nZXRfY29udGVudHMnLCAkcGF0aCk7CmlmIChmYWxzZSA9PT0gJGN1cnJlbnRDb250ZW50IHx8ICRjdXJyZW50Q29udGVudCAhPT0gJGNvbnRlbnQpIHsKcmV0dXJuIGZpbGVfcHV0X2NvbnRlbnRzKCRwYXRoLCAkY29udGVudCk7Cn0KCnJldHVybiAwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2FmZUNvcHkoc3RyaW5nICRzb3VyY2UsIHN0cmluZyAkdGFyZ2V0KTogdm9pZAp7CmlmICghZmlsZV9leGlzdHMoJHRhcmdldCkgfHwgIWZpbGVfZXhpc3RzKCRzb3VyY2UpIHx8ICEkdGhpcy0+ZmlsZXNBcmVFcXVhbCgkc291cmNlLCAkdGFyZ2V0KSkgewokc291cmNlSGFuZGxlID0gZm9wZW4oJHNvdXJjZSwgJ3InKTsKYXNzZXJ0KCRzb3VyY2VIYW5kbGUgIT09IGZhbHNlLCAnQ291bGQgbm90IG9wZW4gIicuJHNvdXJjZS4nIiBmb3IgcmVhZGluZy4nKTsKJHRhcmdldEhhbmRsZSA9IGZvcGVuKCR0YXJnZXQsICd3KycpOwphc3NlcnQoJHRhcmdldEhhbmRsZSAhPT0gZmFsc2UsICdDb3VsZCBub3Qgb3BlbiAiJy4kdGFyZ2V0LiciIGZvciB3cml0aW5nLicpOwoKc3RyZWFtX2NvcHlfdG9fc3RyZWFtKCRzb3VyY2VIYW5kbGUsICR0YXJnZXRIYW5kbGUpOwpmY2xvc2UoJHNvdXJjZUhhbmRsZSk7CmZjbG9zZSgkdGFyZ2V0SGFuZGxlKTsKCnRvdWNoKCR0YXJnZXQsIChpbnQpIGZpbGVtdGltZSgkc291cmNlKSwgKGludCkgZmlsZWF0aW1lKCRzb3VyY2UpKTsKfQp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaWxlc0FyZUVxdWFsKHN0cmluZyAkYSwgc3RyaW5nICRiKTogYm9vbAp7CgppZiAoZmlsZXNpemUoJGEpICE9PSBmaWxlc2l6ZSgkYikpIHsKcmV0dXJuIGZhbHNlOwp9CgoKJGFIYW5kbGUgPSBmb3BlbigkYSwgJ3JiJyk7CmFzc2VydCgkYUhhbmRsZSAhPT0gZmFsc2UsICdDb3VsZCBub3Qgb3BlbiAiJy4kYS4nIiBmb3IgcmVhZGluZy4nKTsKJGJIYW5kbGUgPSBmb3BlbigkYiwgJ3JiJyk7CmFzc2VydCgkYkhhbmRsZSAhPT0gZmFsc2UsICdDb3VsZCBub3Qgb3BlbiAiJy4kYi4nIiBmb3IgcmVhZGluZy4nKTsKCiRyZXN1bHQgPSB0cnVlOwp3aGlsZSAoIWZlb2YoJGFIYW5kbGUpKSB7CmlmIChmcmVhZCgkYUhhbmRsZSwgODE5MikgIT09IGZyZWFkKCRiSGFuZGxlLCA4MTkyKSkgewokcmVzdWx0ID0gZmFsc2U7CmJyZWFrOwp9Cn0KCmZjbG9zZSgkYUhhbmRsZSk7CmZjbG9zZSgkYkhhbmRsZSk7CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgR2l0CnsKCnByaXZhdGUgc3RhdGljICR2ZXJzaW9uID0gZmFsc2U7CgoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkY29uZmlnOwoKcHJvdGVjdGVkICRwcm9jZXNzOwoKcHJvdGVjdGVkICRmaWxlc3lzdGVtOwoKcHJvdGVjdGVkICRodHRwRG93bmxvYWRlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MsIEZpbGVzeXN0ZW0gJGZzKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3M7CiR0aGlzLT5maWxlc3lzdGVtID0gJGZzOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrRm9yUmVwb093bmVyc2hpcEVycm9yKHN0cmluZyAkb3V0cHV0LCBzdHJpbmcgJHBhdGgsID9JT0ludGVyZmFjZSAkaW8gPSBudWxsKTogdm9pZAp7CmlmIChzdHJfY29udGFpbnMoJG91dHB1dCwgJ2ZhdGFsOiBkZXRlY3RlZCBkdWJpb3VzIG93bmVyc2hpcCcpKSB7CiRtc2cgPSAnVGhlIHJlcG9zaXRvcnkgYXQgIicgLiAkcGF0aCAuICciIGRvZXMgbm90IGhhdmUgdGhlIGNvcnJlY3Qgb3duZXJzaGlwIGFuZCBnaXQgcmVmdXNlcyB0byB1c2UgaXQ6JyAuIFBIUF9FT0wgLiBQSFBfRU9MIC4gJG91dHB1dDsKaWYgKCRpbyA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJG1zZyk7Cn0KJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiRtc2cuJzwvd2FybmluZz4nKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0SHR0cERvd25sb2FkZXIoSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyKTogdm9pZAp7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJ1bkNvbW1hbmRzKGFycmF5ICRjb21tYW5kcywgc3RyaW5nICR1cmwsID9zdHJpbmcgJGN3ZCwgYm9vbCAkaW5pdGlhbENsb25lID0gZmFsc2UsICYkY29tbWFuZE91dHB1dCA9IG51bGwpOiB2b2lkCnsKJGNhbGxhYmxlcyA9IFtdOwpmb3JlYWNoICgkY29tbWFuZHMgYXMgJGNtZCkgewokY2FsbGFibGVzW10gPSBzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkdXJsKSB1c2UgKCRjbWQpOiBhcnJheSB7CiRtYXAgPSBbCicldXJsJScgPT4gJHVybCwKJyVzYW5pdGl6ZWRVcmwlJyA9PiBQcmVnOjpyZXBsYWNlKCd7Oi8vKFteQF0rPyk6KC4rPylAfScsICc6Ly8nLCAkdXJsKSwKXTsKCnJldHVybiBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJG1hcCk6IHN0cmluZyB7CnJldHVybiAkbWFwWyR2YWx1ZV0gPz8gJHZhbHVlOwp9LCAkY21kKTsKfTsKfQoKCiR0aGlzLT5ydW5Db21tYW5kKCRjYWxsYWJsZXMsICR1cmwsICRjd2QsICRpbml0aWFsQ2xvbmUsICRjb21tYW5kT3V0cHV0KTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJ1bkNvbW1hbmQoJGNvbW1hbmRDYWxsYWJsZSwgc3RyaW5nICR1cmwsID9zdHJpbmcgJGN3ZCwgYm9vbCAkaW5pdGlhbENsb25lID0gZmFsc2UsICYkY29tbWFuZE91dHB1dCA9IG51bGwpOiB2b2lkCnsKJGNvbW1hbmRDYWxsYWJsZXMgPSBpc19jYWxsYWJsZSgkY29tbWFuZENhbGxhYmxlKSA/IFskY29tbWFuZENhbGxhYmxlXSA6ICRjb21tYW5kQ2FsbGFibGU7CiRsYXN0Q29tbWFuZCA9ICcnOwoKCiR0aGlzLT5jb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJHVybCwgJHRoaXMtPmlvKTsKCmlmICgkaW5pdGlhbENsb25lKSB7CiRvcmlnQ3dkID0gJGN3ZDsKfQoKJHJ1bkNvbW1hbmRzID0gZnVuY3Rpb24gKCR1cmwpIHVzZSAoJGNvbW1hbmRDYWxsYWJsZXMsICRjd2QsICYkY29tbWFuZE91dHB1dCwgJiRsYXN0Q29tbWFuZCwgJGluaXRpYWxDbG9uZSkgewokY29sbGVjdE91dHB1dHMgPSAhaXNfY2FsbGFibGUoJGNvbW1hbmRPdXRwdXQpOwokb3V0cHV0cyA9IFtdOwoKJHN0YXR1cyA9IDA7CiRjb3VudGVyID0gMDsKZm9yZWFjaCAoJGNvbW1hbmRDYWxsYWJsZXMgYXMgJGNhbGxhYmxlKSB7CiRsYXN0Q29tbWFuZCA9ICRjYWxsYWJsZSgkdXJsKTsKaWYgKCRjb2xsZWN0T3V0cHV0cykgewokb3V0cHV0c1tdID0gJyc7CiRvdXRwdXQgPSAmJG91dHB1dHNbY291bnQoJG91dHB1dHMpIC0gMV07Cn0gZWxzZSB7CiRvdXRwdXQgPSAmJGNvbW1hbmRPdXRwdXQ7Cn0KJHN0YXR1cyA9ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRsYXN0Q29tbWFuZCwgJG91dHB1dCwgJGluaXRpYWxDbG9uZSAmJiAkY291bnRlciA9PT0gMCA/IG51bGwgOiAkY3dkKTsKaWYgKCRzdGF0dXMgIT09IDApIHsKYnJlYWs7Cn0KJGNvdW50ZXIrKzsKfQoKaWYgKCRjb2xsZWN0T3V0cHV0cykgewokY29tbWFuZE91dHB1dCA9IGltcGxvZGUoJycsICRvdXRwdXRzKTsKfQoKcmV0dXJuICRzdGF0dXM7Cn07CgppZiAoUHJlZzo6aXNNYXRjaCgne15zc2g6Ly9bXkBdK0BbXjpdKzpbXjAtOV0rfScsICR1cmwpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgc291cmNlIFVSTCAnIC4gJHVybCAuICcgaXMgaW52YWxpZCwgc3NoIFVSTHMgc2hvdWxkIGhhdmUgYSBwb3J0IG51bWJlciBhZnRlciAiOiIuJyAuICJcbiIgLiAnVXNlIHNzaDovL2dpdEBleGFtcGxlLmNvbToyMi9wYXRoIG9yIGp1c3QgZ2l0QGV4YW1wbGUuY29tOnBhdGggaWYgeW91IGRvIG5vdCB3YW50IHRvIHByb3ZpZGUgYSBwYXNzd29yZCBvciBjdXN0b20gcG9ydC4nKTsKfQoKaWYgKCEkaW5pdGlhbENsb25lKSB7CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZW1vdGUnLCAnLXYnXSwgJG91dHB1dCwgJGN3ZCk7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xig/OmNvbXBvc2VyfG9yaWdpbilccytodHRwcz86Ly8oLispOiguKylAKFteL10rKX1pbScsICRvdXRwdXQsICRtYXRjaCkgJiYgISR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG1hdGNoWzNdKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRtYXRjaFszXSwgcmF3dXJsZGVjb2RlKCRtYXRjaFsxXSksIHJhd3VybGRlY29kZSgkbWF0Y2hbMl0pKTsKfQp9CgokcHJvdG9jb2xzID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRodWItcHJvdG9jb2xzJyk7CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKD86aHR0cHM/fGdpdCk6Ly8nIC4gc2VsZjo6Z2V0R2l0SHViRG9tYWluc1JlZ2V4KCR0aGlzLT5jb25maWcpIC4gJy8oLiopfScsICR1cmwsICRtYXRjaCkpIHsKJG1lc3NhZ2VzID0gW107CmZvcmVhY2ggKCRwcm90b2NvbHMgYXMgJHByb3RvY29sKSB7CmlmICgnc3NoJyA9PT0gJHByb3RvY29sKSB7CiRwcm90b1VybCA9ICJnaXRAIiAuICRtYXRjaFsxXSAuICI6IiAuICRtYXRjaFsyXTsKfSBlbHNlIHsKJHByb3RvVXJsID0gJHByb3RvY29sIC4gIjovLyIgLiAkbWF0Y2hbMV0gLiAiLyIgLiAkbWF0Y2hbMl07Cn0KCmlmICgwID09PSAkcnVuQ29tbWFuZHMoJHByb3RvVXJsKSkgewpyZXR1cm47Cn0KJG1lc3NhZ2VzW10gPSAnLSAnIC4gJHByb3RvVXJsIC4gIlxuIiAuIFByZWc6OnJlcGxhY2UoJyNeI20nLCAnICAnLCAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7CgppZiAoJGluaXRpYWxDbG9uZSAmJiBpc3NldCgkb3JpZ0N3ZCkpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkb3JpZ0N3ZCk7Cn0KfQoKCmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkbWF0Y2hbMV0pICYmICEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokdGhpcy0+dGhyb3dFeGNlcHRpb24oJ0ZhaWxlZCB0byBjbG9uZSAnIC4gJHVybCAuICcgdmlhICcgLiBpbXBsb2RlKCcsICcsICRwcm90b2NvbHMpIC4gJyBwcm90b2NvbHMsIGFib3J0aW5nLicgLiAiXG5cbiIgLiBpbXBsb2RlKCJcbiIsICRtZXNzYWdlcyksICR1cmwpOwp9Cn0KCgokYnlwYXNzU3NoRm9yR2l0SHViID0gUHJlZzo6aXNNYXRjaCgne15naXRAJyAuIHNlbGY6OmdldEdpdEh1YkRvbWFpbnNSZWdleCgkdGhpcy0+Y29uZmlnKSAuICc6KC4rPylcLmdpdCR9aScsICR1cmwpICYmICFpbl9hcnJheSgnc3NoJywgJHByb3RvY29scywgdHJ1ZSk7CgokYXV0aCA9IG51bGw7CiRjcmVkZW50aWFscyA9IFtdOwppZiAoJGJ5cGFzc1NzaEZvckdpdEh1YiB8fCAwICE9PSAkcnVuQ29tbWFuZHMoJHVybCkpIHsKJGVycm9yTXNnID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teZ2l0QCcgLiBzZWxmOjpnZXRHaXRIdWJEb21haW5zUmVnZXgoJHRoaXMtPmNvbmZpZykgLiAnOiguKz8pXC5naXQkfWknLCAkdXJsLCAkbWF0Y2gpCgp8fCBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xmh0dHBzPzovLycgLiBzZWxmOjpnZXRHaXRIdWJEb21haW5zUmVnZXgoJHRoaXMtPmNvbmZpZykgLiAnLyguKj8pKD86XC5naXQpPyR9aScsICR1cmwsICRtYXRjaCkKKSB7CmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkbWF0Y2hbMV0pKSB7CiRnaXRIdWJVdGlsID0gbmV3IEdpdEh1YigkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKJG1lc3NhZ2UgPSAnQ2xvbmluZyBmYWlsZWQgdXNpbmcgYW4gc3NoIGtleSBmb3IgYXV0aGVudGljYXRpb24sIGVudGVyIHlvdXIgR2l0SHViIGNyZWRlbnRpYWxzIHRvIGFjY2VzcyBwcml2YXRlIHJlcG9zJzsKCmlmICghJGdpdEh1YlV0aWwtPmF1dGhvcml6ZU9BdXRoKCRtYXRjaFsxXSkgJiYgJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGdpdEh1YlV0aWwtPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseSgkbWF0Y2hbMV0sICRtZXNzYWdlKTsKfQp9CgppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkbWF0Y2hbMV0pKSB7CiRhdXRoID0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkbWF0Y2hbMV0pOwokYXV0aFVybCA9ICdodHRwczovLycgLiByYXd1cmxlbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10pIC4gJzonIC4gcmF3dXJsZW5jb2RlKCRhdXRoWydwYXNzd29yZCddKSAuICdAJyAuICRtYXRjaFsxXSAuICcvJyAuICRtYXRjaFsyXSAuICcuZ2l0JzsKaWYgKDAgPT09ICRydW5Db21tYW5kcygkYXV0aFVybCkpIHsKcmV0dXJuOwp9CgokY3JlZGVudGlhbHMgPSBbcmF3dXJsZW5jb2RlKCRhdXRoWyd1c2VybmFtZSddKSwgcmF3dXJsZW5jb2RlKCRhdXRoWydwYXNzd29yZCddKV07CiRlcnJvck1zZyA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwp9Cgp9IGVsc2VpZiAoClByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKGh0dHBzPyk6Ly8oYml0YnVja2V0XC5vcmcpLyguKj8pKD86XC5naXQpPyR9aScsICR1cmwsICRtYXRjaCkKfHwgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oZ2l0KUAoYml0YnVja2V0XC5vcmcpOiguKz9cLmdpdCkkfWknLCAkdXJsLCAkbWF0Y2gpCikgeyAKJGJpdGJ1Y2tldFV0aWwgPSBuZXcgQml0YnVja2V0KCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MsICR0aGlzLT5odHRwRG93bmxvYWRlcik7CgokZG9tYWluID0gJG1hdGNoWzJdOwokcmVwb193aXRoX2dpdF9wYXJ0ID0gJG1hdGNoWzNdOwppZiAoIXN0cl9lbmRzX3dpdGgoJHJlcG9fd2l0aF9naXRfcGFydCwgJy5naXQnKSkgewokcmVwb193aXRoX2dpdF9wYXJ0IC49ICcuZ2l0JzsKfQppZiAoISR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJGRvbWFpbikpIHsKJG1lc3NhZ2UgPSAnRW50ZXIgeW91ciBCaXRidWNrZXQgY3JlZGVudGlhbHMgdG8gYWNjZXNzIHByaXZhdGUgcmVwb3MnOwoKaWYgKCEkYml0YnVja2V0VXRpbC0+YXV0aG9yaXplT0F1dGgoJGRvbWFpbikgJiYgJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGJpdGJ1Y2tldFV0aWwtPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseSgkbWF0Y2hbMV0sICRtZXNzYWdlKTsKJGFjY2Vzc1Rva2VuID0gJGJpdGJ1Y2tldFV0aWwtPmdldFRva2VuKCk7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJ3gtdG9rZW4tYXV0aCcsICRhY2Nlc3NUb2tlbik7Cn0KfQoKCgoKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJGRvbWFpbikpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRkb21haW4pOwokYXV0aFVybCA9ICdodHRwczovLycgLiByYXd1cmxlbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10pIC4gJzonIC4gcmF3dXJsZW5jb2RlKCRhdXRoWydwYXNzd29yZCddKSAuICdAJyAuICRkb21haW4gLiAnLycgLiAkcmVwb193aXRoX2dpdF9wYXJ0OwoKaWYgKDAgPT09ICRydW5Db21tYW5kcygkYXV0aFVybCkpIHsKCgpyZXR1cm47Cn0KCgppZiAoJGF1dGhbJ3VzZXJuYW1lJ10gIT09ICd4LXRva2VuLWF1dGgnKSB7CiRhY2Nlc3NUb2tlbiA9ICRiaXRidWNrZXRVdGlsLT5yZXF1ZXN0VG9rZW4oJGRvbWFpbiwgJGF1dGhbJ3VzZXJuYW1lJ10sICRhdXRoWydwYXNzd29yZCddKTsKaWYgKCFlbXB0eSgkYWNjZXNzVG9rZW4pKSB7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJ3gtdG9rZW4tYXV0aCcsICRhY2Nlc3NUb2tlbik7Cn0KfQp9CgppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkZG9tYWluKSkgewokYXV0aCA9ICR0aGlzLT5pby0+Z2V0QXV0aGVudGljYXRpb24oJGRvbWFpbik7CiRhdXRoVXJsID0gJ2h0dHBzOi8vJyAuIHJhd3VybGVuY29kZSgkYXV0aFsndXNlcm5hbWUnXSkgLiAnOicgLiByYXd1cmxlbmNvZGUoJGF1dGhbJ3Bhc3N3b3JkJ10pIC4gJ0AnIC4gJGRvbWFpbiAuICcvJyAuICRyZXBvX3dpdGhfZ2l0X3BhcnQ7CmlmICgwID09PSAkcnVuQ29tbWFuZHMoJGF1dGhVcmwpKSB7CnJldHVybjsKfQoKJGNyZWRlbnRpYWxzID0gW3Jhd3VybGVuY29kZSgkYXV0aFsndXNlcm5hbWUnXSksIHJhd3VybGVuY29kZSgkYXV0aFsncGFzc3dvcmQnXSldOwp9Cgokc3NoVXJsID0gJ2dpdEBiaXRidWNrZXQub3JnOicgLiAkcmVwb193aXRoX2dpdF9wYXJ0OwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBObyBiaXRidWNrZXQgYXV0aGVudGljYXRpb24gY29uZmlndXJlZC4gRmFsbGluZyBiYWNrIHRvIHNzaC4nKTsKaWYgKDAgPT09ICRydW5Db21tYW5kcygkc3NoVXJsKSkgewpyZXR1cm47Cn0KCiRlcnJvck1zZyA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwp9IGVsc2VpZiAoCgpQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihnaXQpQCcgLiBzZWxmOjpnZXRHaXRMYWJEb21haW5zUmVnZXgoJHRoaXMtPmNvbmZpZykgLiAnOiguKz9cLmdpdCkkfWknLCAkdXJsLCAkbWF0Y2gpCgp8fCBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihodHRwcz8pOi8vJyAuIHNlbGY6OmdldEdpdExhYkRvbWFpbnNSZWdleCgkdGhpcy0+Y29uZmlnKSAuICcvKC4qKX1pJywgJHVybCwgJG1hdGNoKQopIHsKaWYgKCRtYXRjaFsxXSA9PT0gJ2dpdCcpIHsKJG1hdGNoWzFdID0gJ2h0dHBzJzsKfQoKaWYgKCEkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaFsyXSkpIHsKJGdpdExhYlV0aWwgPSBuZXcgR2l0TGFiKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwokbWVzc2FnZSA9ICdDbG9uaW5nIGZhaWxlZCwgZW50ZXIgeW91ciBHaXRMYWIgY3JlZGVudGlhbHMgdG8gYWNjZXNzIHByaXZhdGUgcmVwb3MnOwoKaWYgKCEkZ2l0TGFiVXRpbC0+YXV0aG9yaXplT0F1dGgoJG1hdGNoWzJdKSAmJiAkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokZ2l0TGFiVXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCRtYXRjaFsxXSwgJG1hdGNoWzJdLCAkbWVzc2FnZSk7Cn0KfQoKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG1hdGNoWzJdKSkgewokYXV0aCA9ICR0aGlzLT5pby0+Z2V0QXV0aGVudGljYXRpb24oJG1hdGNoWzJdKTsKaWYgKCRhdXRoWydwYXNzd29yZCddID09PSAncHJpdmF0ZS10b2tlbicgfHwgJGF1dGhbJ3Bhc3N3b3JkJ10gPT09ICdvYXV0aDInIHx8ICRhdXRoWydwYXNzd29yZCddID09PSAnZ2l0bGFiLWNpLXRva2VuJykgewokYXV0aFVybCA9ICRtYXRjaFsxXSAuICc6Ly8nIC4gcmF3dXJsZW5jb2RlKCRhdXRoWydwYXNzd29yZCddKSAuICc6JyAuIHJhd3VybGVuY29kZSgoc3RyaW5nKSAkYXV0aFsndXNlcm5hbWUnXSkgLiAnQCcgLiAkbWF0Y2hbMl0gLiAnLycgLiAkbWF0Y2hbM107IAp9IGVsc2UgewokYXV0aFVybCA9ICRtYXRjaFsxXSAuICc6Ly8nIC4gcmF3dXJsZW5jb2RlKChzdHJpbmcpICRhdXRoWyd1c2VybmFtZSddKSAuICc6JyAuIHJhd3VybGVuY29kZSgoc3RyaW5nKSAkYXV0aFsncGFzc3dvcmQnXSkgLiAnQCcgLiAkbWF0Y2hbMl0gLiAnLycgLiAkbWF0Y2hbM107Cn0KCmlmICgwID09PSAkcnVuQ29tbWFuZHMoJGF1dGhVcmwpKSB7CnJldHVybjsKfQoKJGNyZWRlbnRpYWxzID0gW3Jhd3VybGVuY29kZSgoc3RyaW5nKSAkYXV0aFsndXNlcm5hbWUnXSksIHJhd3VybGVuY29kZSgoc3RyaW5nKSAkYXV0aFsncGFzc3dvcmQnXSldOwokZXJyb3JNc2cgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKfQp9IGVsc2VpZiAobnVsbCAhPT0gKCRtYXRjaCA9ICR0aGlzLT5nZXRBdXRoZW50aWNhdGlvbkZhaWx1cmUoJHVybCkpKSB7IAppZiAoc3RyX2NvbnRhaW5zKCRtYXRjaFsyXSwgJ0AnKSkgewpbJGF1dGhQYXJ0cywgJG1hdGNoWzJdXSA9IGV4cGxvZGUoJ0AnLCAkbWF0Y2hbMl0sIDIpOwp9Cgokc3RvcmVBdXRoID0gZmFsc2U7CmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaFsyXSkpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRtYXRjaFsyXSk7Cn0gZWxzZWlmICgkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokZGVmYXVsdFVzZXJuYW1lID0gbnVsbDsKaWYgKGlzc2V0KCRhdXRoUGFydHMpICYmICRhdXRoUGFydHMgIT09ICcnKSB7CmlmIChzdHJfY29udGFpbnMoJGF1dGhQYXJ0cywgJzonKSkgewpbJGRlZmF1bHRVc2VybmFtZSwgXSA9IGV4cGxvZGUoJzonLCAkYXV0aFBhcnRzLCAyKTsKfSBlbHNlIHsKJGRlZmF1bHRVc2VybmFtZSA9ICRhdXRoUGFydHM7Cn0KfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgQXV0aGVudGljYXRpb24gcmVxdWlyZWQgKDxpbmZvPicgLiAkbWF0Y2hbMl0gLiAnPC9pbmZvPik6Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+JyAuIHRyaW0oJGVycm9yTXNnKSAuICc8L3dhcm5pbmc+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwokYXV0aCA9IFsKJ3VzZXJuYW1lJyA9PiAkdGhpcy0+aW8tPmFzaygnICAgICAgVXNlcm5hbWU6ICcsICRkZWZhdWx0VXNlcm5hbWUpLAoncGFzc3dvcmQnID0+ICR0aGlzLT5pby0+YXNrQW5kSGlkZUFuc3dlcignICAgICAgUGFzc3dvcmQ6ICcpLApdOwokc3RvcmVBdXRoID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdzdG9yZS1hdXRocycpOwp9CgppZiAobnVsbCAhPT0gJGF1dGgpIHsKJGF1dGhVcmwgPSAkbWF0Y2hbMV0gLiByYXd1cmxlbmNvZGUoKHN0cmluZykgJGF1dGhbJ3VzZXJuYW1lJ10pIC4gJzonIC4gcmF3dXJsZW5jb2RlKChzdHJpbmcpICRhdXRoWydwYXNzd29yZCddKSAuICdAJyAuICRtYXRjaFsyXSAuICRtYXRjaFszXTsKCmlmICgwID09PSAkcnVuQ29tbWFuZHMoJGF1dGhVcmwpKSB7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG1hdGNoWzJdLCAkYXV0aFsndXNlcm5hbWUnXSwgJGF1dGhbJ3Bhc3N3b3JkJ10pOwokYXV0aEhlbHBlciA9IG5ldyBBdXRoSGVscGVyKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZyk7CiRhdXRoSGVscGVyLT5zdG9yZUF1dGgoJG1hdGNoWzJdLCAkc3RvcmVBdXRoKTsKCnJldHVybjsKfQoKJGNyZWRlbnRpYWxzID0gW3Jhd3VybGVuY29kZSgoc3RyaW5nKSAkYXV0aFsndXNlcm5hbWUnXSksIHJhd3VybGVuY29kZSgoc3RyaW5nKSAkYXV0aFsncGFzc3dvcmQnXSldOwokZXJyb3JNc2cgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKfQp9CgppZiAoJGluaXRpYWxDbG9uZSAmJiBpc3NldCgkb3JpZ0N3ZCkpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkb3JpZ0N3ZCk7Cn0KCiRsYXN0Q29tbWFuZCA9IGltcGxvZGUoJyAnLCAkbGFzdENvbW1hbmQpOwppZiAoY291bnQoJGNyZWRlbnRpYWxzKSA+IDApIHsKJGxhc3RDb21tYW5kID0gJHRoaXMtPm1hc2tDcmVkZW50aWFscygkbGFzdENvbW1hbmQsICRjcmVkZW50aWFscyk7CiRlcnJvck1zZyA9ICR0aGlzLT5tYXNrQ3JlZGVudGlhbHMoJGVycm9yTXNnLCAkY3JlZGVudGlhbHMpOwp9CiR0aGlzLT50aHJvd0V4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuICRsYXN0Q29tbWFuZCAuICJcblxuIiAuICRlcnJvck1zZywgJHVybCk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHN5bmNNaXJyb3Ioc3RyaW5nICR1cmwsIHN0cmluZyAkZGlyKTogYm9vbAp7CmlmICgoYm9vbCkgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfRElTQUJMRV9ORVRXT1JLJykgJiYgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfRElTQUJMRV9ORVRXT1JLJykgIT09ICdwcmltZScpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5BYm9ydGluZyBnaXQgbWlycm9yIHN5bmMgb2YgJy4kdXJsLicgYXMgbmV0d29yayBpcyBkaXNhYmxlZDwvd2FybmluZz4nKTsKCnJldHVybiBmYWxzZTsKfQoKCmlmIChpc19kaXIoJGRpcikgJiYgMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAncmV2LXBhcnNlJywgJy0tZ2l0LWRpciddLCAkb3V0cHV0LCAkZGlyKSAmJiB0cmltKCRvdXRwdXQpID09PSAnLicpIHsKdHJ5IHsKJGNvbW1hbmRzID0gWwpbJ2dpdCcsICdyZW1vdGUnLCAnc2V0LXVybCcsICdvcmlnaW4nLCAnLS0nLCAnJXVybCUnXSwKWydnaXQnLCAncmVtb3RlJywgJ3VwZGF0ZScsICctLXBydW5lJywgJ29yaWdpbiddLApbJ2dpdCcsICdyZW1vdGUnLCAnc2V0LXVybCcsICdvcmlnaW4nLCAnLS0nLCAnJXNhbml0aXplZFVybCUnXSwKWydnaXQnLCAnZ2MnLCAnLS1hdXRvJ10sCl07CgokdGhpcy0+cnVuQ29tbWFuZHMoJGNvbW1hbmRzLCAkdXJsLCAkZGlyKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5TeW5jIG1pcnJvciBmYWlsZWQ6ICcgLiAkZS0+Z2V0TWVzc2FnZSgpIC4gJzwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0Kc2VsZjo6Y2hlY2tGb3JSZXBvT3duZXJzaGlwRXJyb3IoJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCksICRkaXIpOwoKCiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJGRpcik7CgokdGhpcy0+cnVuQ29tbWFuZHMoW1snZ2l0JywgJ2Nsb25lJywgJy0tbWlycm9yJywgJy0tJywgJyV1cmwlJywgJGRpcl1dLCAkdXJsLCAkZGlyLCB0cnVlKTsKCnJldHVybiB0cnVlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZmV0Y2hSZWZPclN5bmNNaXJyb3Ioc3RyaW5nICR1cmwsIHN0cmluZyAkZGlyLCBzdHJpbmcgJHJlZiwgP3N0cmluZyAkcHJldHR5VmVyc2lvbiA9IG51bGwpOiBib29sCnsKaWYgKCR0aGlzLT5jaGVja1JlZklzSW5NaXJyb3IoJGRpciwgJHJlZikpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17NDB9JH0nLCAkcmVmKSAmJiAkcHJldHR5VmVyc2lvbiAhPT0gbnVsbCkgewokYnJhbmNoID0gUHJlZzo6cmVwbGFjZSgneyg/Ol5kZXYtfCg/OlwueCk/LWRldiQpfWknLCAnJywgJHByZXR0eVZlcnNpb24pOwokYnJhbmNoZXMgPSBudWxsOwokdGFncyA9IG51bGw7CmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdicmFuY2gnXSwgJG91dHB1dCwgJGRpcikpIHsKJGJyYW5jaGVzID0gJG91dHB1dDsKfQppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAndGFnJ10sICRvdXRwdXQsICRkaXIpKSB7CiR0YWdzID0gJG91dHB1dDsKfQoKCgoKCmlmIChudWxsICE9PSAkYnJhbmNoZXMgJiYgIVByZWc6OmlzTWF0Y2goJ3teW1xzKl0qdj8nLnByZWdfcXVvdGUoJGJyYW5jaCkuJyR9bScsICRicmFuY2hlcykKJiYgbnVsbCAhPT0gJHRhZ3MgJiYgIVByZWc6OmlzTWF0Y2goJ3teW1xzKl0qJy5wcmVnX3F1b3RlKCRicmFuY2gpLickfW0nLCAkdGFncykKKSB7CiR0aGlzLT5zeW5jTWlycm9yKCR1cmwsICRkaXIpOwp9Cn0KCnJldHVybiB0cnVlOwp9CgppZiAoJHRoaXMtPnN5bmNNaXJyb3IoJHVybCwgJGRpcikpIHsKcmV0dXJuICR0aGlzLT5jaGVja1JlZklzSW5NaXJyb3IoJGRpciwgJHJlZik7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXROb1Nob3dTaWduYXR1cmVGbGFnKFByb2Nlc3NFeGVjdXRvciAkcHJvY2Vzcyk6IHN0cmluZwp7CiRnaXRWZXJzaW9uID0gc2VsZjo6Z2V0VmVyc2lvbigkcHJvY2Vzcyk7CmlmICgkZ2l0VmVyc2lvbiAmJiB2ZXJzaW9uX2NvbXBhcmUoJGdpdFZlcnNpb24sICcyLjEwLjAtcmMwJywgJz49JykpIHsKcmV0dXJuICcgLS1uby1zaG93LXNpZ25hdHVyZSc7Cn0KCnJldHVybiAnJzsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXROb1Nob3dTaWduYXR1cmVGbGFncyhQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MpOiBhcnJheQp7CiRmbGFncyA9IHN0YXRpYzo6Z2V0Tm9TaG93U2lnbmF0dXJlRmxhZygkcHJvY2Vzcyk7CmlmICgnJyA9PT0gJGZsYWdzKSB7CnJldHVybiBbXTsKfQoKcmV0dXJuIGV4cGxvZGUoJyAnLCBzdWJzdHIoJGZsYWdzLCAxKSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tSZWZJc0luTWlycm9yKHN0cmluZyAkZGlyLCBzdHJpbmcgJHJlZik6IGJvb2wKewppZiAoaXNfZGlyKCRkaXIpICYmIDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3Jldi1wYXJzZScsICctLWdpdC1kaXInXSwgJG91dHB1dCwgJGRpcikgJiYgdHJpbSgkb3V0cHV0KSA9PT0gJy4nKSB7CiRleGl0Q29kZSA9ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3Jldi1wYXJzZScsICctLXF1aWV0JywgJy0tdmVyaWZ5JywgJHJlZi4nXntjb21taXR9J10sICRpZ25vcmVkT3V0cHV0LCAkZGlyKTsKaWYgKCRleGl0Q29kZSA9PT0gMCkgewpyZXR1cm4gdHJ1ZTsKfQp9CnNlbGY6OmNoZWNrRm9yUmVwb093bmVyc2hpcEVycm9yKCR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLCAkZGlyKTsKCnJldHVybiBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRBdXRoZW50aWNhdGlvbkZhaWx1cmUoc3RyaW5nICR1cmwpOiA/YXJyYXkKewppZiAoIVByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKGh0dHBzPzovLykoW14vXSspKC4qKSR9aScsICR1cmwsICRtYXRjaCkpIHsKcmV0dXJuIG51bGw7Cn0KCiRhdXRoRmFpbHVyZXMgPSBbCidmYXRhbDogQXV0aGVudGljYXRpb24gZmFpbGVkJywKJ3JlbW90ZSBlcnJvcjogSW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZC4nLAonZXJyb3I6IDQwMSBVbmF1dGhvcml6ZWQnLAonZmF0YWw6IHVuYWJsZSB0byBhY2Nlc3MnLAonZmF0YWw6IGNvdWxkIG5vdCByZWFkIFVzZXJuYW1lJywKXTsKCiRlcnJvck91dHB1dCA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwpmb3JlYWNoICgkYXV0aEZhaWx1cmVzIGFzICRhdXRoRmFpbHVyZSkgewppZiAoc3RycG9zKCRlcnJvck91dHB1dCwgJGF1dGhGYWlsdXJlKSAhPT0gZmFsc2UpIHsKcmV0dXJuICRtYXRjaDsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldE1pcnJvckRlZmF1bHRCcmFuY2goc3RyaW5nICR1cmwsIHN0cmluZyAkZGlyLCBib29sICRpc0xvY2FsUGF0aFJlcG9zaXRvcnkpOiA/c3RyaW5nCnsKaWYgKChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSkgewpyZXR1cm4gbnVsbDsKfQoKdHJ5IHsKaWYgKCRpc0xvY2FsUGF0aFJlcG9zaXRvcnkpIHsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAncmVtb3RlJywgJ3Nob3cnLCAnb3JpZ2luJ10sICRvdXRwdXQsICRkaXIpOwp9IGVsc2UgewokY29tbWFuZHMgPSBbClsnZ2l0JywgJ3JlbW90ZScsICdzZXQtdXJsJywgJ29yaWdpbicsICctLScsICcldXJsJSddLApbJ2dpdCcsICdyZW1vdGUnLCAnc2hvdycsICdvcmlnaW4nXSwKWydnaXQnLCAncmVtb3RlJywgJ3NldC11cmwnLCAnb3JpZ2luJywgJy0tJywgJyVzYW5pdGl6ZWRVcmwlJ10sCl07CgokdGhpcy0+cnVuQ29tbWFuZHMoJGNvbW1hbmRzLCAkdXJsLCAkZGlyLCBmYWxzZSwgJG91dHB1dCk7Cn0KCiRsaW5lcyA9ICR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpOwpmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teXHMqSEVBRCBicmFuY2g6XHMoLispXHMqJH1tJywgJGxpbmUsICRtYXRjaGVzKSkgewpyZXR1cm4gJG1hdGNoZXNbMV07Cn0KfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkZhaWxlZCB0byBmZXRjaCByb290IGlkZW50aWZpZXIgZnJvbSByZW1vdGU6ICcgLiAkZS0+Z2V0TWVzc2FnZSgpIC4gJzwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfQoKcmV0dXJuIG51bGw7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xlYW5FbnYoKTogdm9pZAp7CgppZiAoUGxhdGZvcm06OmdldEVudignR0lUX0FTS1BBU1MnKSAhPT0gJ2VjaG8nKSB7ClBsYXRmb3JtOjpwdXRFbnYoJ0dJVF9BU0tQQVNTJywgJ2VjaG8nKTsKfQoKCmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdHSVRfRElSJykpIHsKUGxhdGZvcm06OmNsZWFyRW52KCdHSVRfRElSJyk7Cn0KaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0dJVF9XT1JLX1RSRUUnKSkgewpQbGF0Zm9ybTo6Y2xlYXJFbnYoJ0dJVF9XT1JLX1RSRUUnKTsKfQoKCmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdMQU5HVUFHRScpICE9PSAnQycpIHsKUGxhdGZvcm06OnB1dEVudignTEFOR1VBR0UnLCAnQycpOwp9CgoKUGxhdGZvcm06OmNsZWFyRW52KCdEWUxEX0xJQlJBUllfUEFUSCcpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEdpdEh1YkRvbWFpbnNSZWdleChDb25maWcgJGNvbmZpZyk6IHN0cmluZwp7CnJldHVybiAnKCcgLiBpbXBsb2RlKCd8JywgYXJyYXlfbWFwKCdwcmVnX3F1b3RlJywgJGNvbmZpZy0+Z2V0KCdnaXRodWItZG9tYWlucycpKSkgLiAnKSc7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0R2l0TGFiRG9tYWluc1JlZ2V4KENvbmZpZyAkY29uZmlnKTogc3RyaW5nCnsKcmV0dXJuICcoJyAuIGltcGxvZGUoJ3wnLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCAkY29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJykpKSAuICcpJzsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKCRtZXNzYWdlLCBzdHJpbmcgJHVybCk6IHZvaWQKewoKY2xlYXJzdGF0Y2FjaGUoKTsKCmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICctLXZlcnNpb24nXSwgJGlnbm9yZWRPdXRwdXQpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihVcmw6OnNhbml0aXplKCdGYWlsZWQgdG8gY2xvbmUgJyAuICR1cmwgLiAnLCBnaXQgd2FzIG5vdCBmb3VuZCwgY2hlY2sgdGhhdCBpdCBpcyBpbnN0YWxsZWQgYW5kIGluIHlvdXIgUEFUSCBlbnYuJyAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKSk7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihVcmw6OnNhbml0aXplKCRtZXNzYWdlKSk7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKFByb2Nlc3NFeGVjdXRvciAkcHJvY2Vzcyk6ID9zdHJpbmcKewppZiAoZmFsc2UgPT09IHNlbGY6OiR2ZXJzaW9uKSB7CnNlbGY6OiR2ZXJzaW9uID0gbnVsbDsKaWYgKDAgPT09ICRwcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJy0tdmVyc2lvbiddLCAkb3V0cHV0KSAmJiBQcmVnOjppc01hdGNoKCcvXmdpdCB2ZXJzaW9uIChcZCsoPzpcLlxkKykrKS9tJywgJG91dHB1dCwgJG1hdGNoZXMpKSB7CnNlbGY6OiR2ZXJzaW9uID0gJG1hdGNoZXNbMV07Cn0KfQoKcmV0dXJuIHNlbGY6OiR2ZXJzaW9uOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1hc2tDcmVkZW50aWFscyhzdHJpbmcgJGVycm9yLCBhcnJheSAkY3JlZGVudGlhbHMpOiBzdHJpbmcKewokbWFza2VkQ3JlZGVudGlhbHMgPSBbXTsKCmZvcmVhY2ggKCRjcmVkZW50aWFscyBhcyAkY3JlZGVudGlhbCkgewppZiAoaW5fYXJyYXkoJGNyZWRlbnRpYWwsIFsncHJpdmF0ZS10b2tlbicsICd4LXRva2VuLWF1dGgnLCAnb2F1dGgyJywgJ2dpdGxhYi1jaS10b2tlbicsICd4LW9hdXRoLWJhc2ljJ10pKSB7CiRtYXNrZWRDcmVkZW50aWFsc1tdID0gJGNyZWRlbnRpYWw7Cn0gZWxzZWlmIChzdHJsZW4oJGNyZWRlbnRpYWwpID4gNikgewokbWFza2VkQ3JlZGVudGlhbHNbXSA9IHN1YnN0cigkY3JlZGVudGlhbCwgMCwgMykgLiAnLi4uJyAuIHN1YnN0cigkY3JlZGVudGlhbCwgLTMpOwp9IGVsc2VpZiAoc3RybGVuKCRjcmVkZW50aWFsKSA+IDMpIHsKJG1hc2tlZENyZWRlbnRpYWxzW10gPSBzdWJzdHIoJGNyZWRlbnRpYWwsIDAsIDMpIC4gJy4uLic7Cn0gZWxzZSB7CiRtYXNrZWRDcmVkZW50aWFsc1tdID0gJ1hYWCc7Cn0KfQoKcmV0dXJuIHN0cl9yZXBsYWNlKCRjcmVkZW50aWFscywgJG1hc2tlZENyZWRlbnRpYWxzLCAkZXJyb3IpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBHaXRIdWIKewoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkY29uZmlnOwoKcHJvdGVjdGVkICRwcm9jZXNzOwoKcHJvdGVjdGVkICRodHRwRG93bmxvYWRlcjsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsLCA/SHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID86IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyID86IEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCR0aGlzLT5pbywgJGNvbmZpZyk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdXRob3JpemVPQXV0aChzdHJpbmcgJG9yaWdpblVybCk6IGJvb2wKewppZiAoIWluX2FycmF5KCRvcmlnaW5VcmwsICR0aGlzLT5jb25maWctPmdldCgnZ2l0aHViLWRvbWFpbnMnKSkpIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2NvbmZpZycsICdnaXRodWIuYWNjZXNzdG9rZW4nXSwgJG91dHB1dCkpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCB0cmltKCRvdXRwdXQpLCAneC1vYXV0aC1iYXNpYycpOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseShzdHJpbmcgJG9yaWdpblVybCwgP3N0cmluZyAkbWVzc2FnZSA9IG51bGwpOiBib29sCnsKaWYgKCRtZXNzYWdlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbWVzc2FnZSk7Cn0KCiRub3RlID0gJ0NvbXBvc2VyJzsKaWYgKCR0aGlzLT5jb25maWctPmdldCgnZ2l0aHViLWV4cG9zZS1ob3N0bmFtZScpID09PSB0cnVlICYmIDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnaG9zdG5hbWUnXSwgJG91dHB1dCkpIHsKJG5vdGUgLj0gJyBvbiAnIC4gdHJpbSgkb3V0cHV0KTsKfQokbm90ZSAuPSAnICcgLiBkYXRlKCdZLW0tZCBIaScpOwoKJHVybCA9ICdodHRwczovLycuJG9yaWdpblVybC4nL3NldHRpbmdzL3Rva2Vucy9uZXc/c2NvcGVzPSZkZXNjcmlwdGlvbj0nIC4gc3RyX3JlcGxhY2UoJyUyMCcsICcrJywgcmF3dXJsZW5jb2RlKCRub3RlKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignV2hlbiB3b3JraW5nIHdpdGggX3B1YmxpY18gR2l0SHViIHJlcG9zaXRvcmllcyBvbmx5LCBoZWFkIGhlcmUgdG8gcmV0cmlldmUgYSB0b2tlbjonKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCR1cmwpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1RoaXMgdG9rZW4gd2lsbCBoYXZlIHJlYWQtb25seSBwZXJtaXNzaW9uIGZvciBwdWJsaWMgaW5mb3JtYXRpb24gb25seS4nKTsKCiRsb2NhbEF1dGhDb25maWcgPSAkdGhpcy0+Y29uZmlnLT5nZXRMb2NhbEF1dGhDb25maWdTb3VyY2UoKTsKJHVybCA9ICdodHRwczovLycuJG9yaWdpblVybC4nL3NldHRpbmdzL3Rva2Vucy9uZXc/c2NvcGVzPXJlcG8mZGVzY3JpcHRpb249JyAuIHN0cl9yZXBsYWNlKCclMjAnLCAnKycsIHJhd3VybGVuY29kZSgkbm90ZSkpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1doZW4geW91IG5lZWQgdG8gYWNjZXNzIF9wcml2YXRlXyBHaXRIdWIgcmVwb3NpdG9yaWVzIGFzIHdlbGwsIGdvIHRvOicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJHVybCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignTm90ZSB0aGF0IHN1Y2ggdG9rZW5zIGhhdmUgYnJvYWQgcmVhZC93cml0ZSBwZXJtaXNzaW9ucyBvbiB5b3VyIGJlaGFsZiwgZXZlbiBpZiBub3QgbmVlZGVkIGJ5IENvbXBvc2VyLicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignVG9rZW5zIHdpbGwgYmUgc3RvcmVkIGluIHBsYWluIHRleHQgaW4gIiVzIiBmb3IgZnV0dXJlIHVzZSBieSBDb21wb3Nlci4nLCAoJGxvY2FsQXV0aENvbmZpZyAhPT0gbnVsbCA/ICRsb2NhbEF1dGhDb25maWctPmdldE5hbWUoKSAuICcgT1IgJyA6ICcnKSAuICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKS0+Z2V0TmFtZSgpKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIGNoZWNrIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy9hdXRoZW50aWNhdGlvbi1mb3ItcHJpdmF0ZS1wYWNrYWdlcy5tZCNnaXRodWItb2F1dGgnKTsKCiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gZmFsc2U7CmlmICgkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsKSB7CiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gJHRoaXMtPmlvLT5hc2tDb25maXJtYXRpb24oJ0EgbG9jYWwgYXV0aCBjb25maWcgc291cmNlIHdhcyBmb3VuZCwgZG8geW91IHdhbnQgdG8gc3RvcmUgdGhlIHRva2VuIHRoZXJlPycsIHRydWUpOwp9CgokdG9rZW4gPSB0cmltKChzdHJpbmcpICR0aGlzLT5pby0+YXNrQW5kSGlkZUFuc3dlcignVG9rZW4gKGhpZGRlbik6ICcpKTsKCmlmICgkdG9rZW4gPT09ICcnKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Tm8gdG9rZW4gZ2l2ZW4sIGFib3J0aW5nLjwvd2FybmluZz4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdZb3UgY2FuIGFsc28gYWRkIGl0IG1hbnVhbGx5IGxhdGVyIGJ5IHVzaW5nICJjb21wb3NlciBjb25maWcgLS1nbG9iYWwgLS1hdXRoIGdpdGh1Yi1vYXV0aC5naXRodWIuY29tIDx0b2tlbj4iJyk7CgpyZXR1cm4gZmFsc2U7Cn0KCiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpblVybCwgJHRva2VuLCAneC1vYXV0aC1iYXNpYycpOwoKdHJ5IHsKJGFwaVVybCA9ICgnZ2l0aHViLmNvbScgPT09ICRvcmlnaW5VcmwpID8gJ2FwaS5naXRodWIuY29tLycgOiAkb3JpZ2luVXJsIC4gJy9hcGkvdjMvJzsKCiR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCdodHRwczovLycuICRhcGlVcmwsIFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCl0pOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKGluX2FycmF5KCRlLT5nZXRDb2RlKCksIFs0MDMsIDQwMV0pKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkludmFsaWQgdG9rZW4gcHJvdmlkZWQuPC9lcnJvcj4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdZb3UgY2FuIGFsc28gYWRkIGl0IG1hbnVhbGx5IGxhdGVyIGJ5IHVzaW5nICJjb21wb3NlciBjb25maWcgLS1nbG9iYWwgLS1hdXRoIGdpdGh1Yi1vYXV0aC5naXRodWIuY29tIDx0b2tlbj4iJyk7CgpyZXR1cm4gZmFsc2U7Cn0KCnRocm93ICRlOwp9CgoKJGF1dGhDb25maWdTb3VyY2UgPSAkc3RvcmVJbkxvY2FsQXV0aENvbmZpZyAmJiAkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsID8gJGxvY2FsQXV0aENvbmZpZyA6ICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKTsKJHRoaXMtPmNvbmZpZy0+Z2V0Q29uZmlnU291cmNlKCktPnJlbW92ZUNvbmZpZ1NldHRpbmcoJ2dpdGh1Yi1vYXV0aC4nLiRvcmlnaW5VcmwpOwokYXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygnZ2l0aHViLW9hdXRoLicuJG9yaWdpblVybCwgJHRva2VuKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGluZm8+VG9rZW4gc3RvcmVkIHN1Y2Nlc3NmdWxseS48L2luZm8+Jyk7CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSYXRlTGltaXQoYXJyYXkgJGhlYWRlcnMpOiBhcnJheQp7CiRyYXRlTGltaXQgPSBbCidsaW1pdCcgPT4gJz8nLAoncmVzZXQnID0+ICc/JywKXTsKCmZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKJGhlYWRlciA9IHRyaW0oJGhlYWRlcik7CmlmIChmYWxzZSA9PT0gc3RyaXBvcygkaGVhZGVyLCAneC1yYXRlbGltaXQtJykpIHsKY29udGludWU7Cn0KWyR0eXBlLCAkdmFsdWVdID0gZXhwbG9kZSgnOicsICRoZWFkZXIsIDIpOwpzd2l0Y2ggKHN0cnRvbG93ZXIoJHR5cGUpKSB7CmNhc2UgJ3gtcmF0ZWxpbWl0LWxpbWl0JzoKJHJhdGVMaW1pdFsnbGltaXQnXSA9IChpbnQpIHRyaW0oJHZhbHVlKTsKYnJlYWs7CmNhc2UgJ3gtcmF0ZWxpbWl0LXJlc2V0JzoKJHJhdGVMaW1pdFsncmVzZXQnXSA9IGRhdGUoJ1ktbS1kIEg6aTpzJywgKGludCkgdHJpbSgkdmFsdWUpKTsKYnJlYWs7Cn0KfQoKcmV0dXJuICRyYXRlTGltaXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNzb1VybChhcnJheSAkaGVhZGVycyk6ID9zdHJpbmcKewpmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CiRoZWFkZXIgPSB0cmltKCRoZWFkZXIpOwppZiAoZmFsc2UgPT09IHN0cmlwb3MoJGhlYWRlciwgJ3gtZ2l0aHViLXNzbzogcmVxdWlyZWQnKSkgewpjb250aW51ZTsKfQppZiAoUHJlZzo6aXNNYXRjaCgne1xidXJsPSg/UDx1cmw+W15ccztdKyl9JywgJGhlYWRlciwgJG1hdGNoKSkgewpyZXR1cm4gJG1hdGNoWyd1cmwnXTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNSYXRlTGltaXRlZChhcnJheSAkaGVhZGVycyk6IGJvb2wKewpmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XngtcmF0ZWxpbWl0LXJlbWFpbmluZzogKjAkfWknLCB0cmltKCRoZWFkZXIpKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVxdWlyZXNTc28oYXJyYXkgJGhlYWRlcnMpOiBib29sCnsKZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlcikgewppZiAoUHJlZzo6aXNNYXRjaCgne154LWdpdGh1Yi1zc286IHJlcXVpcmVkfWknLCB0cmltKCRoZWFkZXIpKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIEdpdExhYgp7Cgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRjb25maWc7Cgpwcm90ZWN0ZWQgJHByb2Nlc3M7Cgpwcm90ZWN0ZWQgJGh0dHBEb3dubG9hZGVyOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwsID9IdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIgPSBudWxsKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3MgPzogbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXIgPzogRmFjdG9yeTo6Y3JlYXRlSHR0cERvd25sb2FkZXIoJHRoaXMtPmlvLCAkY29uZmlnKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdXRob3JpemVPQXV0aChzdHJpbmcgJG9yaWdpblVybCk6IGJvb2wKewoKJGJjT3JpZ2luVXJsID0gUHJlZzo6cmVwbGFjZSgnezpcZCt9JywgJycsICRvcmlnaW5VcmwpOwoKaWYgKCFpbl9hcnJheSgkb3JpZ2luVXJsLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksIHRydWUpICYmICFpbl9hcnJheSgkYmNPcmlnaW5VcmwsICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkpIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2NvbmZpZycsICdnaXRsYWIuYWNjZXNzdG9rZW4nXSwgJG91dHB1dCkpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCB0cmltKCRvdXRwdXQpLCAnb2F1dGgyJyk7CgpyZXR1cm4gdHJ1ZTsKfQoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdjb25maWcnLCAnZ2l0bGFiLmRlcGxveXRva2VuLnVzZXInXSwgJHRva2VuVXNlcikgJiYgMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnY29uZmlnJywgJ2dpdGxhYi5kZXBsb3l0b2tlbi50b2tlbiddLCAkdG9rZW5QYXNzd29yZCkpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCB0cmltKCR0b2tlblVzZXIpLCB0cmltKCR0b2tlblBhc3N3b3JkKSk7CgpyZXR1cm4gdHJ1ZTsKfQoKCiRhdXRoVG9rZW5zID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRsYWItdG9rZW4nKTsKCmlmIChpc3NldCgkYXV0aFRva2Vuc1skb3JpZ2luVXJsXSkpIHsKJHRva2VuID0gJGF1dGhUb2tlbnNbJG9yaWdpblVybF07Cn0KCmlmIChpc3NldCgkYXV0aFRva2Vuc1skYmNPcmlnaW5VcmxdKSkgewokdG9rZW4gPSAkYXV0aFRva2Vuc1skYmNPcmlnaW5VcmxdOwp9CgppZiAoaXNzZXQoJHRva2VuKSkgewokdXNlcm5hbWUgPSBpc19hcnJheSgkdG9rZW4pID8gJHRva2VuWyJ1c2VybmFtZSJdIDogJHRva2VuOwokcGFzc3dvcmQgPSBpc19hcnJheSgkdG9rZW4pID8gJHRva2VuWyJ0b2tlbiJdIDogJ3ByaXZhdGUtdG9rZW4nOwoKCgppZiAoaW5fYXJyYXkoJHVzZXJuYW1lLCBbJ3ByaXZhdGUtdG9rZW4nLCAnZ2l0bGFiLWNpLXRva2VuJywgJ29hdXRoMiddLCB0cnVlKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsICRwYXNzd29yZCwgJHVzZXJuYW1lKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkdXNlcm5hbWUsICRwYXNzd29yZCk7Cn0KCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoc3RyaW5nICRzY2hlbWUsIHN0cmluZyAkb3JpZ2luVXJsLCA/c3RyaW5nICRtZXNzYWdlID0gbnVsbCk6IGJvb2wKewppZiAoJG1lc3NhZ2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRtZXNzYWdlKTsKfQoKJGxvY2FsQXV0aENvbmZpZyA9ICR0aGlzLT5jb25maWctPmdldExvY2FsQXV0aENvbmZpZ1NvdXJjZSgpOwokcGVyc29uYWxBY2Nlc3NUb2tlbkxpbmsgPSAkc2NoZW1lLic6Ly8nLiRvcmlnaW5VcmwuJy8tL3VzZXJfc2V0dGluZ3MvcGVyc29uYWxfYWNjZXNzX3Rva2Vucyc7CiRyZXZva2VMaW5rID0gJHNjaGVtZS4nOi8vJy4kb3JpZ2luVXJsLicvLS91c2VyX3NldHRpbmdzL2FwcGxpY2F0aW9ucyc7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdBIHRva2VuIHdpbGwgYmUgY3JlYXRlZCBhbmQgc3RvcmVkIGluICIlcyIsIHlvdXIgcGFzc3dvcmQgd2lsbCBuZXZlciBiZSBzdG9yZWQnLCAoJGxvY2FsQXV0aENvbmZpZyAhPT0gbnVsbCA/ICRsb2NhbEF1dGhDb25maWctPmdldE5hbWUoKSAuICcgT1IgJyA6ICcnKSAuICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKS0+Z2V0TmFtZSgpKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignVG8gcmV2b2tlIGFjY2VzcyB0byB0aGlzIHRva2VuIHlvdSBjYW4gdmlzaXQ6Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkcmV2b2tlTGluayk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHNldHVwIGFuIHBlcnNvbmFsIGFjY2VzcyB0b2tlbiBvbjonKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRwZXJzb25hbEFjY2Vzc1Rva2VuTGluayk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignYW5kIHN0b3JlIGl0IHVuZGVyICJnaXRsYWItdG9rZW4iIHNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvYXV0aGVudGljYXRpb24tZm9yLXByaXZhdGUtcGFja2FnZXMubWQjZ2l0bGFiLXRva2VuIGZvciBtb3JlIGRldGFpbHMuJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL2F1dGhlbnRpY2F0aW9uLWZvci1wcml2YXRlLXBhY2thZ2VzLm1kI2dpdGxhYi10b2tlbicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ2ZvciBtb3JlIGRldGFpbHMuJyk7Cgokc3RvcmVJbkxvY2FsQXV0aENvbmZpZyA9IGZhbHNlOwppZiAoJGxvY2FsQXV0aENvbmZpZyAhPT0gbnVsbCkgewokc3RvcmVJbkxvY2FsQXV0aENvbmZpZyA9ICR0aGlzLT5pby0+YXNrQ29uZmlybWF0aW9uKCdBIGxvY2FsIGF1dGggY29uZmlnIHNvdXJjZSB3YXMgZm91bmQsIGRvIHlvdSB3YW50IHRvIHN0b3JlIHRoZSB0b2tlbiB0aGVyZT8nLCB0cnVlKTsKfQoKJGF0dGVtcHRDb3VudGVyID0gMDsKCndoaWxlICgkYXR0ZW1wdENvdW50ZXIrKyA8IDUpIHsKdHJ5IHsKJHJlc3BvbnNlID0gJHRoaXMtPmNyZWF0ZVRva2VuKCRzY2hlbWUsICRvcmlnaW5VcmwpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKCgppZiAoaW5fYXJyYXkoJGUtPmdldENvZGUoKSwgWzQwMywgNDAxXSkpIHsKaWYgKDQwMSA9PT0gJGUtPmdldENvZGUoKSkgewokcmVzcG9uc2UgPSBqc29uX2RlY29kZSgkZS0+Z2V0UmVzcG9uc2UoKSwgdHJ1ZSk7CmlmIChpc3NldCgkcmVzcG9uc2VbJ2Vycm9yJ10pICYmICRyZXNwb25zZVsnZXJyb3InXSA9PT0gJ2ludmFsaWRfZ3JhbnQnKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignQmFkIGNyZWRlbnRpYWxzLiBJZiB5b3UgaGF2ZSB0d28gZmFjdG9yIGF1dGhlbnRpY2F0aW9uIGVuYWJsZWQgeW91IHdpbGwgaGF2ZSB0byBtYW51YWxseSBjcmVhdGUgYSBwZXJzb25hbCBhY2Nlc3MgdG9rZW4nKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdCYWQgY3JlZGVudGlhbHMuJyk7Cn0KfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdNYXhpbXVtIG51bWJlciBvZiBsb2dpbiBhdHRlbXB0cyBleGNlZWRlZC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdZb3UgY2FuIGFsc28gbWFudWFsbHkgY3JlYXRlIGEgcGVyc29uYWwgYWNjZXNzIHRva2VuIGVuYWJsaW5nIHRoZSAicmVhZF9hcGkiIHNjb3BlIGF0OicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJHBlcnNvbmFsQWNjZXNzVG9rZW5MaW5rKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdBZGQgaXQgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLWF1dGggZ2l0bGFiLXRva2VuLicuJG9yaWdpblVybC4nIDx0b2tlbj4iJyk7Cgpjb250aW51ZTsKfQoKdGhyb3cgJGU7Cn0KCiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpblVybCwgJHJlc3BvbnNlWydhY2Nlc3NfdG9rZW4nXSwgJ29hdXRoMicpOwoKJGF1dGhDb25maWdTb3VyY2UgPSAkc3RvcmVJbkxvY2FsQXV0aENvbmZpZyAmJiAkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsID8gJGxvY2FsQXV0aENvbmZpZyA6ICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKTsKCmlmIChpc3NldCgkcmVzcG9uc2VbJ2V4cGlyZXNfaW4nXSkpIHsKJGF1dGhDb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoCidnaXRsYWItb2F1dGguJy4kb3JpZ2luVXJsLApbCidleHBpcmVzLWF0JyA9PiBpbnR2YWwoJHJlc3BvbnNlWydjcmVhdGVkX2F0J10pICsgaW50dmFsKCRyZXNwb25zZVsnZXhwaXJlc19pbiddKSwKJ3JlZnJlc2gtdG9rZW4nID0+ICRyZXNwb25zZVsncmVmcmVzaF90b2tlbiddLAondG9rZW4nID0+ICRyZXNwb25zZVsnYWNjZXNzX3Rva2VuJ10sCl0KKTsKfSBlbHNlIHsKJGF1dGhDb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoJ2dpdGxhYi1vYXV0aC4nLiRvcmlnaW5VcmwsICRyZXNwb25zZVsnYWNjZXNzX3Rva2VuJ10pOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdJbnZhbGlkIEdpdExhYiBjcmVkZW50aWFscyA1IHRpbWVzIGluIGEgcm93LCBhYm9ydGluZy4nKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXV0aG9yaXplT0F1dGhSZWZyZXNoKHN0cmluZyAkc2NoZW1lLCBzdHJpbmcgJG9yaWdpblVybCk6IGJvb2wKewp0cnkgewokcmVzcG9uc2UgPSAkdGhpcy0+cmVmcmVzaFRva2VuKCRzY2hlbWUsICRvcmlnaW5VcmwpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJDb3VsZG4ndCByZWZyZXNoIGFjY2VzcyB0b2tlbjogIi4kZS0+Z2V0TWVzc2FnZSgpKTsKCnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkcmVzcG9uc2VbJ2FjY2Vzc190b2tlbiddLCAnb2F1dGgyJyk7CgoKJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpLT5hZGRDb25maWdTZXR0aW5nKAonZ2l0bGFiLW9hdXRoLicuJG9yaWdpblVybCwKWwonZXhwaXJlcy1hdCcgPT4gaW50dmFsKCRyZXNwb25zZVsnY3JlYXRlZF9hdCddKSArIGludHZhbCgkcmVzcG9uc2VbJ2V4cGlyZXNfaW4nXSksCidyZWZyZXNoLXRva2VuJyA9PiAkcmVzcG9uc2VbJ3JlZnJlc2hfdG9rZW4nXSwKJ3Rva2VuJyA9PiAkcmVzcG9uc2VbJ2FjY2Vzc190b2tlbiddLApdCik7CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVRva2VuKHN0cmluZyAkc2NoZW1lLCBzdHJpbmcgJG9yaWdpblVybCk6IGFycmF5CnsKJHVzZXJuYW1lID0gJHRoaXMtPmlvLT5hc2soJ1VzZXJuYW1lOiAnKTsKJHBhc3N3b3JkID0gJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCdQYXNzd29yZDogJyk7CgokaGVhZGVycyA9IFsnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXTsKCiRhcGlVcmwgPSAkb3JpZ2luVXJsOwokZGF0YSA9IGh0dHBfYnVpbGRfcXVlcnkoWwondXNlcm5hbWUnID0+ICR1c2VybmFtZSwKJ3Bhc3N3b3JkJyA9PiAkcGFzc3dvcmQsCidncmFudF90eXBlJyA9PiAncGFzc3dvcmQnLApdLCAnJywgJyYnKTsKJG9wdGlvbnMgPSBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLAonaHR0cCcgPT4gWwonbWV0aG9kJyA9PiAnUE9TVCcsCidoZWFkZXInID0+ICRoZWFkZXJzLAonY29udGVudCcgPT4gJGRhdGEsCl0sCl07CgokdG9rZW4gPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkc2NoZW1lLic6Ly8nLiRhcGlVcmwuJy9vYXV0aC90b2tlbicsICRvcHRpb25zKS0+ZGVjb2RlSnNvbigpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdUb2tlbiBzdWNjZXNzZnVsbHkgY3JlYXRlZCcpOwoKcmV0dXJuICR0b2tlbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNPQXV0aEV4cGlyZWQoc3RyaW5nICRvcmlnaW5VcmwpOiBib29sCnsKJGF1dGhUb2tlbnMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1vYXV0aCcpOwppZiAoaXNzZXQoJGF1dGhUb2tlbnNbJG9yaWdpblVybF1bJ2V4cGlyZXMtYXQnXSkpIHsKaWYgKCRhdXRoVG9rZW5zWyRvcmlnaW5VcmxdWydleHBpcmVzLWF0J10gPCB0aW1lKCkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVmcmVzaFRva2VuKHN0cmluZyAkc2NoZW1lLCBzdHJpbmcgJG9yaWdpblVybCk6IGFycmF5CnsKJGF1dGhUb2tlbnMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1vYXV0aCcpOwppZiAoIWlzc2V0KCRhdXRoVG9rZW5zWyRvcmlnaW5VcmxdWydyZWZyZXNoLXRva2VuJ10pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignTm8gR2l0TGFiIHJlZnJlc2ggdG9rZW4gcHJlc2VudCBmb3IgJy4kb3JpZ2luVXJsLicuJyk7Cn0KCiRyZWZyZXNoVG9rZW4gPSAkYXV0aFRva2Vuc1skb3JpZ2luVXJsXVsncmVmcmVzaC10b2tlbiddOwokaGVhZGVycyA9IFsnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXTsKCiRkYXRhID0gaHR0cF9idWlsZF9xdWVyeShbCidyZWZyZXNoX3Rva2VuJyA9PiAkcmVmcmVzaFRva2VuLAonZ3JhbnRfdHlwZScgPT4gJ3JlZnJlc2hfdG9rZW4nLApdLCAnJywgJyYnKTsKJG9wdGlvbnMgPSBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLAonaHR0cCcgPT4gWwonbWV0aG9kJyA9PiAnUE9TVCcsCidoZWFkZXInID0+ICRoZWFkZXJzLAonY29udGVudCcgPT4gJGRhdGEsCl0sCl07CgokdG9rZW4gPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkc2NoZW1lLic6Ly8nLiRvcmlnaW5VcmwuJy9vYXV0aC90b2tlbicsICRvcHRpb25zKS0+ZGVjb2RlSnNvbigpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0dpdExhYiB0b2tlbiBzdWNjZXNzZnVsbHkgcmVmcmVzaGVkJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignVG8gcmV2b2tlIGFjY2VzcyB0byB0aGlzIHRva2VuIHlvdSBjYW4gdmlzaXQgJy4kc2NoZW1lLic6Ly8nLiRvcmlnaW5VcmwuJy8tL3VzZXJfc2V0dGluZ3MvYXBwbGljYXRpb25zJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7CgpyZXR1cm4gJHRva2VuOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBIZwp7Cgpwcml2YXRlIHN0YXRpYyAkdmVyc2lvbiA9IGZhbHNlOwoKCgoKcHJpdmF0ZSAkaW87CgoKCgpwcml2YXRlICRjb25maWc7CgoKCgpwcml2YXRlICRwcm9jZXNzOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2VzcykKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzOwp9CgpwdWJsaWMgZnVuY3Rpb24gcnVuQ29tbWFuZChjYWxsYWJsZSAkY29tbWFuZENhbGxhYmxlLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkY3dkKTogdm9pZAp7CiR0aGlzLT5jb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJHVybCwgJHRoaXMtPmlvKTsKCgokY29tbWFuZCA9ICRjb21tYW5kQ2FsbGFibGUoJHVybCk7CgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0LCAkY3dkKSkgewpyZXR1cm47Cn0KCgppZiAoClByZWc6OmlzTWF0Y2goJ3teKD9QPHByb3RvPnNzaHxodHRwcz8pOi8vKD86KD9QPHVzZXI+W146QF0rKSg/OjooP1A8cGFzcz5bXjpAXSspKT9AKT8oP1A8aG9zdD5bXi9dKykoP1A8cGF0aD4vLiopP31taScsICR1cmwsICRtYXRjaGVzKQomJiAkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaGVzWydob3N0J10pCikgewppZiAoJG1hdGNoZXNbJ3Byb3RvJ10gPT09ICdzc2gnKSB7CiR1c2VyID0gJyc7CmlmICgkbWF0Y2hlc1sndXNlciddICE9PSBudWxsKSB7CiR1c2VyID0gcmF3dXJsZW5jb2RlKCRtYXRjaGVzWyd1c2VyJ10pIC4gJ0AnOwp9CiRhdXRoZW50aWNhdGVkVXJsID0gJG1hdGNoZXNbJ3Byb3RvJ10gLiAnOi8vJyAuICR1c2VyIC4gJG1hdGNoZXNbJ2hvc3QnXSAuICRtYXRjaGVzWydwYXRoJ107Cn0gZWxzZSB7CiRhdXRoID0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkbWF0Y2hlc1snaG9zdCddKTsKJGF1dGhlbnRpY2F0ZWRVcmwgPSAkbWF0Y2hlc1sncHJvdG8nXSAuICc6Ly8nIC4gcmF3dXJsZW5jb2RlKChzdHJpbmcpICRhdXRoWyd1c2VybmFtZSddKSAuICc6JyAuIHJhd3VybGVuY29kZSgoc3RyaW5nKSAkYXV0aFsncGFzc3dvcmQnXSkgLiAnQCcgLiAkbWF0Y2hlc1snaG9zdCddIC4gJG1hdGNoZXNbJ3BhdGgnXTsKfQokY29tbWFuZCA9ICRjb21tYW5kQ2FsbGFibGUoJGF1dGhlbnRpY2F0ZWRVcmwpOwoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkaWdub3JlZE91dHB1dCwgJGN3ZCkpIHsKcmV0dXJuOwp9CgokZXJyb3IgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKfSBlbHNlIHsKJGVycm9yID0gJ1RoZSBnaXZlbiBVUkwgKCcgLiR1cmwuICcpIGRvZXMgbm90IG1hdGNoIHRoZSByZXF1aXJlZCBmb3JtYXQgKHNzaHxodHRwKHMpOi8vKHVzZXJuYW1lOnBhc3N3b3JkQClleGFtcGxlLmNvbS9wYXRoLXRvLXJlcG9zaXRvcnkpJzsKfQoKJHRoaXMtPnRocm93RXhjZXB0aW9uKCJGYWlsZWQgdG8gY2xvbmUgJHVybCwgXG5cbiIgLiAkZXJyb3IsICR1cmwpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24oJG1lc3NhZ2UsIHN0cmluZyAkdXJsKTogdm9pZAp7CmlmIChudWxsID09PSBzZWxmOjpnZXRWZXJzaW9uKCR0aGlzLT5wcm9jZXNzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oVXJsOjpzYW5pdGl6ZSgKJ0ZhaWxlZCB0byBjbG9uZSAnIC4gJHVybCAuICcsIGhnIHdhcyBub3QgZm91bmQsIGNoZWNrIHRoYXQgaXQgaXMgaW5zdGFsbGVkIGFuZCBpbiB5b3VyIFBBVEggZW52LicgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKQopKTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKFVybDo6c2FuaXRpemUoJG1lc3NhZ2UpKTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFZlcnNpb24oUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzKTogP3N0cmluZwp7CmlmIChmYWxzZSA9PT0gc2VsZjo6JHZlcnNpb24pIHsKc2VsZjo6JHZlcnNpb24gPSBudWxsOwppZiAoMCA9PT0gJHByb2Nlc3MtPmV4ZWN1dGUoWydoZycsICctLXZlcnNpb24nXSwgJG91dHB1dCkgJiYgUHJlZzo6aXNNYXRjaCgnL14uKz8gKFxkKyg/OlwuXGQrKSspKD86XCsuKj8pP1wpP1xyP1xuLycsICRvdXRwdXQsICRtYXRjaGVzKSkgewpzZWxmOjokdmVyc2lvbiA9ICRtYXRjaGVzWzFdOwp9Cn0KCnJldHVybiBzZWxmOjokdmVyc2lvbjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsXEh0dHA7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFN0cmVhbUNvbnRleHRGYWN0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxBdXRoSGVscGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxVcmw7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcSHR0cEZvdW5kYXRpb25cSXBVdGlsczsKCgoKCgoKCgpjbGFzcyBDdXJsRG93bmxvYWRlcgp7CgoKCgoKCnByaXZhdGUgY29uc3QgQkFEX01VTFRJUExFWElOR19DVVJMX1ZFUlNJT05TID0gWyc3Ljg3LjAnLCAnNy44OC4wJywgJzcuODguMSddOwoKCnByaXZhdGUgJG11bHRpSGFuZGxlOwoKcHJpdmF0ZSAkc2hhcmVIYW5kbGU7Cgpwcml2YXRlICRqb2JzID0gW107Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJGF1dGhIZWxwZXI7Cgpwcml2YXRlICRzZWxlY3RUaW1lb3V0ID0gNS4wOwoKcHJpdmF0ZSAkbWF4UmVkaXJlY3RzID0gMjA7Cgpwcml2YXRlICRtYXhSZXRyaWVzID0gMzsKCnByb3RlY3RlZCAkbXVsdGlFcnJvcnMgPSBbCkNVUkxNX0JBRF9IQU5ETEUgPT4gWydDVVJMTV9CQURfSEFORExFJywgJ1RoZSBwYXNzZWQtaW4gaGFuZGxlIGlzIG5vdCBhIHZhbGlkIENVUkxNIGhhbmRsZS4nXSwKQ1VSTE1fQkFEX0VBU1lfSEFORExFID0+IFsnQ1VSTE1fQkFEX0VBU1lfSEFORExFJywgIkFuIGVhc3kgaGFuZGxlIHdhcyBub3QgZ29vZC92YWxpZC4gSXQgY291bGQgbWVhbiB0aGF0IGl0IGlzbid0IGFuIGVhc3kgaGFuZGxlIGF0IGFsbCwgb3IgcG9zc2libHkgdGhhdCB0aGUgaGFuZGxlIGFscmVhZHkgaXMgaW4gdXNlZCBieSB0aGlzIG9yIGFub3RoZXIgbXVsdGkgaGFuZGxlLiJdLApDVVJMTV9PVVRfT0ZfTUVNT1JZID0+IFsnQ1VSTE1fT1VUX09GX01FTU9SWScsICdZb3UgYXJlIGRvb21lZC4nXSwKQ1VSTE1fSU5URVJOQUxfRVJST1IgPT4gWydDVVJMTV9JTlRFUk5BTF9FUlJPUicsICdUaGlzIGNhbiBvbmx5IGJlIHJldHVybmVkIGlmIGxpYmN1cmwgYnVncy4gUGxlYXNlIHJlcG9ydCBpdCB0byB1cyEnXSwKXTsKCgpwcml2YXRlIHN0YXRpYyAkb3B0aW9ucyA9IFsKJ2h0dHAnID0+IFsKJ21ldGhvZCcgPT4gQ1VSTE9QVF9DVVNUT01SRVFVRVNULAonY29udGVudCcgPT4gQ1VSTE9QVF9QT1NURklFTERTLAonaGVhZGVyJyA9PiBDVVJMT1BUX0hUVFBIRUFERVIsCid0aW1lb3V0JyA9PiBDVVJMT1BUX1RJTUVPVVQsCl0sCidzc2wnID0+IFsKJ2NhZmlsZScgPT4gQ1VSTE9QVF9DQUlORk8sCidjYXBhdGgnID0+IENVUkxPUFRfQ0FQQVRILAondmVyaWZ5X3BlZXInID0+IENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsCid2ZXJpZnlfcGVlcl9uYW1lJyA9PiBDVVJMT1BUX1NTTF9WRVJJRllIT1NULAonbG9jYWxfY2VydCcgPT4gQ1VSTE9QVF9TU0xDRVJULAonbG9jYWxfcGsnID0+IENVUkxPUFRfU1NMS0VZLAoncGFzc3BocmFzZScgPT4gQ1VSTE9QVF9TU0xLRVlQQVNTV0QsCl0sCl07CgoKcHJpdmF0ZSBzdGF0aWMgJHRpbWVJbmZvID0gWwondG90YWxfdGltZScgPT4gdHJ1ZSwKJ25hbWVsb29rdXBfdGltZScgPT4gdHJ1ZSwKJ2Nvbm5lY3RfdGltZScgPT4gdHJ1ZSwKJ3ByZXRyYW5zZmVyX3RpbWUnID0+IHRydWUsCidzdGFydHRyYW5zZmVyX3RpbWUnID0+IHRydWUsCidyZWRpcmVjdF90aW1lJyA9PiB0cnVlLApdOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIGFycmF5ICRvcHRpb25zID0gW10sIGJvb2wgJGRpc2FibGVUbHMgPSBmYWxzZSkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwoKJHRoaXMtPm11bHRpSGFuZGxlID0gJG1oID0gY3VybF9tdWx0aV9pbml0KCk7CmlmIChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfbXVsdGlfc2V0b3B0JykpIHsKaWYgKFByb3h5TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKS0+aGFzUHJveHkoKSAmJiAoJHZlcnNpb24gPSBjdXJsX3ZlcnNpb24oKSkgIT09IGZhbHNlICYmIGluX2FycmF5KCR2ZXJzaW9uWyd2ZXJzaW9uJ10sIHNlbGY6OkJBRF9NVUxUSVBMRVhJTkdfQ1VSTF9WRVJTSU9OUywgdHJ1ZSkpIHsKCgoKCgoKCmN1cmxfbXVsdGlfc2V0b3B0KCRtaCwgQ1VSTE1PUFRfUElQRUxJTklORywgIDApOwp9IGVsc2UgewpjdXJsX211bHRpX3NldG9wdCgkbWgsIENVUkxNT1BUX1BJUEVMSU5JTkcsIFxQSFBfVkVSU0lPTl9JRCA+PSA3MDQwMCA/ICAyIDogIDMpOwp9CmlmIChkZWZpbmVkKCdDVVJMTU9QVF9NQVhfSE9TVF9DT05ORUNUSU9OUycpICYmICFkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSkgewpjdXJsX211bHRpX3NldG9wdCgkbWgsIENVUkxNT1BUX01BWF9IT1NUX0NPTk5FQ1RJT05TLCA4KTsKfQp9CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3NoYXJlX2luaXQnKSkgewokdGhpcy0+c2hhcmVIYW5kbGUgPSAkc2ggPSBjdXJsX3NoYXJlX2luaXQoKTsKY3VybF9zaGFyZV9zZXRvcHQoJHNoLCBDVVJMU0hPUFRfU0hBUkUsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7CmN1cmxfc2hhcmVfc2V0b3B0KCRzaCwgQ1VSTFNIT1BUX1NIQVJFLCBDVVJMX0xPQ0tfREFUQV9ETlMpOwpjdXJsX3NoYXJlX3NldG9wdCgkc2gsIENVUkxTSE9QVF9TSEFSRSwgQ1VSTF9MT0NLX0RBVEFfU1NMX1NFU1NJT04pOwp9CgokdGhpcy0+YXV0aEhlbHBlciA9IG5ldyBBdXRoSGVscGVyKCRpbywgJGNvbmZpZyk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChjYWxsYWJsZSAkcmVzb2x2ZSwgY2FsbGFibGUgJHJlamVjdCwgc3RyaW5nICRvcmlnaW4sIHN0cmluZyAkdXJsLCBhcnJheSAkb3B0aW9ucywgP3N0cmluZyAkY29weVRvID0gbnVsbCk6IGludAp7CiRhdHRyaWJ1dGVzID0gW107CmlmIChpc3NldCgkb3B0aW9uc1sncmV0cnktYXV0aC1mYWlsdXJlJ10pKSB7CiRhdHRyaWJ1dGVzWydyZXRyeUF1dGhGYWlsdXJlJ10gPSAkb3B0aW9uc1sncmV0cnktYXV0aC1mYWlsdXJlJ107CnVuc2V0KCRvcHRpb25zWydyZXRyeS1hdXRoLWZhaWx1cmUnXSk7Cn0KCnJldHVybiAkdGhpcy0+aW5pdERvd25sb2FkKCRyZXNvbHZlLCAkcmVqZWN0LCAkb3JpZ2luLCAkdXJsLCAkb3B0aW9ucywgJGNvcHlUbywgJGF0dHJpYnV0ZXMpOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaW5pdERvd25sb2FkKGNhbGxhYmxlICRyZXNvbHZlLCBjYWxsYWJsZSAkcmVqZWN0LCBzdHJpbmcgJG9yaWdpbiwgc3RyaW5nICR1cmwsIGFycmF5ICRvcHRpb25zLCA/c3RyaW5nICRjb3B5VG8gPSBudWxsLCBhcnJheSAkYXR0cmlidXRlcyA9IFtdKTogaW50CnsKJGF0dHJpYnV0ZXMgPSBhcnJheV9tZXJnZShbCidyZXRyeUF1dGhGYWlsdXJlJyA9PiB0cnVlLAoncmVkaXJlY3RzJyA9PiAwLAoncmV0cmllcycgPT4gMCwKJ3N0b3JlQXV0aCcgPT4gZmFsc2UsCidpcFJlc29sdmUnID0+IG51bGwsCl0sICRhdHRyaWJ1dGVzKTsKCmlmICgkYXR0cmlidXRlc1snaXBSZXNvbHZlJ10gPT09IG51bGwgJiYgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfSVBSRVNPTFZFJykgPT09ICc0JykgewokYXR0cmlidXRlc1snaXBSZXNvbHZlJ10gPSA0Owp9IGVsc2VpZiAoJGF0dHJpYnV0ZXNbJ2lwUmVzb2x2ZSddID09PSBudWxsICYmIFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0lQUkVTT0xWRScpID09PSAnNicpIHsKJGF0dHJpYnV0ZXNbJ2lwUmVzb2x2ZSddID0gNjsKfQoKJG9yaWdpbmFsT3B0aW9ucyA9ICRvcHRpb25zOwoKCmlmICghUHJlZzo6aXNNYXRjaCgne15odHRwOi8vKHJlcG9cLik/cGFja2FnaXN0XC5vcmcvcC99JywgJHVybCkgfHwgKGZhbHNlID09PSBzdHJwb3MoJHVybCwgJyQnKSAmJiBmYWxzZSA9PT0gc3RycG9zKCR1cmwsICclMjQnKSkpIHsKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdXJsLCAkdGhpcy0+aW8sICRvcHRpb25zKTsKfQoKJGN1cmxIYW5kbGUgPSBjdXJsX2luaXQoKTsKJGhlYWRlckhhbmRsZSA9IGZvcGVuKCdwaHA6Ly90ZW1wL21heG1lbW9yeTozMjc2OCcsICd3K2InKTsKaWYgKGZhbHNlID09PSAkaGVhZGVySGFuZGxlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIG9wZW4gYSB0ZW1wIHN0cmVhbSB0byBzdG9yZSBjdXJsIGhlYWRlcnMnKTsKfQoKaWYgKCRjb3B5VG8gIT09IG51bGwpIHsKJGJvZHlUYXJnZXQgPSAkY29weVRvLid+JzsKfSBlbHNlIHsKJGJvZHlUYXJnZXQgPSAncGhwOi8vdGVtcC9tYXhtZW1vcnk6NTI0Mjg4JzsKfQoKJGVycm9yTWVzc2FnZSA9ICcnOwpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKGludCAkY29kZSwgc3RyaW5nICRtc2cpIHVzZSAoJiRlcnJvck1lc3NhZ2UpOiBib29sIHsKaWYgKCRlcnJvck1lc3NhZ2UpIHsKJGVycm9yTWVzc2FnZSAuPSAiXG4iOwp9CiRlcnJvck1lc3NhZ2UgLj0gUHJlZzo6cmVwbGFjZSgne15mb3BlblwoLio/XCk6IH0nLCAnJywgJG1zZyk7CgpyZXR1cm4gdHJ1ZTsKfSk7CiRib2R5SGFuZGxlID0gZm9wZW4oJGJvZHlUYXJnZXQsICd3K2InKTsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7CmlmIChmYWxzZSA9PT0gJGJvZHlIYW5kbGUpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVGhlICInLiR1cmwuJyIgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byAnLigkY29weVRvID8/ICdhIHRlbXBvcmFyeSBmaWxlJykuJzogJy4kZXJyb3JNZXNzYWdlKTsKfQoKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfVVJMLCAkdXJsKTsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIGZhbHNlKTsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsIDEwKTsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfVElNRU9VVCwgbWF4KChpbnQpIGluaV9nZXQoImRlZmF1bHRfc29ja2V0X3RpbWVvdXQiKSwgMzAwKSk7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX1dSSVRFSEVBREVSLCAkaGVhZGVySGFuZGxlKTsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfRklMRSwgJGJvZHlIYW5kbGUpOwpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9FTkNPRElORywgIiIpOyAKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfUFJPVE9DT0xTLCBDVVJMUFJPVE9fSFRUUCB8IENVUkxQUk9UT19IVFRQUyk7CgppZiAoJGF0dHJpYnV0ZXNbJ2lwUmVzb2x2ZSddID09PSA0KSB7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX0lQUkVTT0xWRSwgQ1VSTF9JUFJFU09MVkVfVjQpOwp9IGVsc2VpZiAoJGF0dHJpYnV0ZXNbJ2lwUmVzb2x2ZSddID09PSA2KSB7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX0lQUkVTT0xWRSwgQ1VSTF9JUFJFU09MVkVfVjYpOwp9CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3NoYXJlX2luaXQnKSkgewpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9TSEFSRSwgJHRoaXMtPnNoYXJlSGFuZGxlKTsKfQoKaWYgKCFpc3NldCgkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSBbXTsKfQoKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSBhcnJheV9kaWZmKCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddLCBbJ0Nvbm5lY3Rpb246IGNsb3NlJ10pOwokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXVtdID0gJ0Nvbm5lY3Rpb246IGtlZXAtYWxpdmUnOwoKJHZlcnNpb24gPSBjdXJsX3ZlcnNpb24oKTsKJGZlYXR1cmVzID0gJHZlcnNpb25bJ2ZlYXR1cmVzJ107CmlmICgwID09PSBzdHJwb3MoJHVybCwgJ2h0dHBzOi8vJykgJiYgXGRlZmluZWQoJ0NVUkxfVkVSU0lPTl9IVFRQMicpICYmIFxkZWZpbmVkKCdDVVJMX0hUVFBfVkVSU0lPTl8yXzAnKSAmJiAoQ1VSTF9WRVJTSU9OX0hUVFAyICYgJGZlYXR1cmVzKSAhPT0gMCkgewpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9IVFRQX1ZFUlNJT04sIENVUkxfSFRUUF9WRVJTSU9OXzJfMCk7Cn0KCgoKaWYgKGlzc2V0KCR2ZXJzaW9uWyd2ZXJzaW9uJ10pICYmIGluX2FycmF5KCR2ZXJzaW9uWyd2ZXJzaW9uJ10sIFsnOC43LjAnLCAnOC43LjEnXSwgdHJ1ZSkgJiYgXGRlZmluZWQoJ0NVUkxfVkVSU0lPTl9MSUJaJykgJiYgKENVUkxfVkVSU0lPTl9MSUJaICYgJGZlYXR1cmVzKSAhPT0gMCkgewpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9FTkNPRElORywgImd6aXAiKTsKfQoKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSAkdGhpcy0+YXV0aEhlbHBlci0+YWRkQXV0aGVudGljYXRpb25IZWFkZXIoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10sICRvcmlnaW4sICR1cmwpOwokb3B0aW9ucyA9IFN0cmVhbUNvbnRleHRGYWN0b3J5Ojppbml0T3B0aW9ucygkdXJsLCAkb3B0aW9ucywgdHJ1ZSk7Cgpmb3JlYWNoIChzZWxmOjokb3B0aW9ucyBhcyAkdHlwZSA9PiAkY3VybE9wdGlvbnMpIHsKZm9yZWFjaCAoJGN1cmxPcHRpb25zIGFzICRuYW1lID0+ICRjdXJsT3B0aW9uKSB7CmlmIChpc3NldCgkb3B0aW9uc1skdHlwZV1bJG5hbWVdKSkgewppZiAoJHR5cGUgPT09ICdzc2wnICYmICRuYW1lID09PSAndmVyaWZ5X3BlZXJfbmFtZScpIHsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsICRjdXJsT3B0aW9uLCAkb3B0aW9uc1skdHlwZV1bJG5hbWVdID09PSB0cnVlID8gMiA6ICRvcHRpb25zWyR0eXBlXVskbmFtZV0pOwp9IGVsc2UgewpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgJGN1cmxPcHRpb24sICRvcHRpb25zWyR0eXBlXVskbmFtZV0pOwp9Cn0KfQp9CgokcHJveHkgPSBQcm94eU1hbmFnZXI6OmdldEluc3RhbmNlKCktPmdldFByb3h5Rm9yUmVxdWVzdCgkdXJsKTsKY3VybF9zZXRvcHRfYXJyYXkoJGN1cmxIYW5kbGUsICRwcm94eS0+Z2V0Q3VybE9wdGlvbnMoJG9wdGlvbnNbJ3NzbCddID8/IFtdKSk7CgokcHJvZ3Jlc3MgPSBhcnJheV9kaWZmX2tleShjdXJsX2dldGluZm8oJGN1cmxIYW5kbGUpLCBzZWxmOjokdGltZUluZm8pOwoKJHRoaXMtPmpvYnNbKGludCkgJGN1cmxIYW5kbGVdID0gWwondXJsJyA9PiAkdXJsLAonb3JpZ2luJyA9PiAkb3JpZ2luLAonYXR0cmlidXRlcycgPT4gJGF0dHJpYnV0ZXMsCidvcHRpb25zJyA9PiAkb3JpZ2luYWxPcHRpb25zLAoncHJvZ3Jlc3MnID0+ICRwcm9ncmVzcywKJ2N1cmxIYW5kbGUnID0+ICRjdXJsSGFuZGxlLAonZmlsZW5hbWUnID0+ICRjb3B5VG8sCidoZWFkZXJIYW5kbGUnID0+ICRoZWFkZXJIYW5kbGUsCidib2R5SGFuZGxlJyA9PiAkYm9keUhhbmRsZSwKJ3Jlc29sdmUnID0+ICRyZXNvbHZlLAoncmVqZWN0JyA9PiAkcmVqZWN0LAoncHJpbWFyeUlwJyA9PiAnJywKXTsKCiR1c2luZ1Byb3h5ID0gJHByb3h5LT5nZXRTdGF0dXMoJyB1c2luZyBwcm94eSAoJXMpJyk7CiRpZk1vZGlmaWVkID0gZmFsc2UgIT09IHN0cmlwb3MoaW1wbG9kZSgnLCcsICRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSwgJ2lmLW1vZGlmaWVkLXNpbmNlOicpID8gJyBpZiBtb2RpZmllZCcgOiAnJzsKaWYgKCRhdHRyaWJ1dGVzWydyZWRpcmVjdHMnXSA9PT0gMCAmJiAkYXR0cmlidXRlc1sncmV0cmllcyddID09PSAwKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRG93bmxvYWRpbmcgJyAuIFVybDo6c2FuaXRpemUoJHVybCkgLiAkdXNpbmdQcm94eSAuICRpZk1vZGlmaWVkLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9CgokdGhpcy0+Y2hlY2tDdXJsUmVzdWx0KGN1cmxfbXVsdGlfYWRkX2hhbmRsZSgkdGhpcy0+bXVsdGlIYW5kbGUsICRjdXJsSGFuZGxlKSk7CgoKcmV0dXJuIChpbnQpICRjdXJsSGFuZGxlOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWJvcnRSZXF1ZXN0KGludCAkaWQpOiB2b2lkCnsKaWYgKGlzc2V0KCR0aGlzLT5qb2JzWyRpZF0sICR0aGlzLT5qb2JzWyRpZF1bJ2N1cmxIYW5kbGUnXSkpIHsKJGpvYiA9ICR0aGlzLT5qb2JzWyRpZF07CmN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgkdGhpcy0+bXVsdGlIYW5kbGUsICRqb2JbJ2N1cmxIYW5kbGUnXSk7CmN1cmxfY2xvc2UoJGpvYlsnY3VybEhhbmRsZSddKTsKaWYgKGlzX3Jlc291cmNlKCRqb2JbJ2hlYWRlckhhbmRsZSddKSkgewpmY2xvc2UoJGpvYlsnaGVhZGVySGFuZGxlJ10pOwp9CmlmIChpc19yZXNvdXJjZSgkam9iWydib2R5SGFuZGxlJ10pKSB7CmZjbG9zZSgkam9iWydib2R5SGFuZGxlJ10pOwp9CmlmIChudWxsICE9PSAkam9iWydmaWxlbmFtZSddKSB7CkB1bmxpbmsoJGpvYlsnZmlsZW5hbWUnXS4nficpOwp9CnVuc2V0KCR0aGlzLT5qb2JzWyRpZF0pOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiB0aWNrKCk6IHZvaWQKewpzdGF0aWMgJHRpbWVvdXRXYXJuaW5nID0gZmFsc2U7CgppZiAoY291bnQoJHRoaXMtPmpvYnMpID09PSAwKSB7CnJldHVybjsKfQoKJGFjdGl2ZSA9IHRydWU7CiR0aGlzLT5jaGVja0N1cmxSZXN1bHQoY3VybF9tdWx0aV9leGVjKCR0aGlzLT5tdWx0aUhhbmRsZSwgJGFjdGl2ZSkpOwppZiAoLTEgPT09IGN1cmxfbXVsdGlfc2VsZWN0KCR0aGlzLT5tdWx0aUhhbmRsZSwgJHRoaXMtPnNlbGVjdFRpbWVvdXQpKSB7Cgp1c2xlZXAoMTUwKTsKfQoKd2hpbGUgKCRwcm9ncmVzcyA9IGN1cmxfbXVsdGlfaW5mb19yZWFkKCR0aGlzLT5tdWx0aUhhbmRsZSkpIHsKJGN1cmxIYW5kbGUgPSAkcHJvZ3Jlc3NbJ2hhbmRsZSddOwokcmVzdWx0ID0gJHByb2dyZXNzWydyZXN1bHQnXTsKJGkgPSAoaW50KSAkY3VybEhhbmRsZTsKaWYgKCFpc3NldCgkdGhpcy0+am9ic1skaV0pKSB7CmNvbnRpbnVlOwp9CgokcHJvZ3Jlc3MgPSBjdXJsX2dldGluZm8oJGN1cmxIYW5kbGUpOwppZiAoZmFsc2UgPT09ICRwcm9ncmVzcykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCBnZXR0aW5nIGluZm8gZnJvbSBjdXJsIGhhbmRsZSAnLiRpLicgKCcuJHRoaXMtPmpvYnNbJGldWyd1cmwnXS4nKScpOwp9CiRqb2IgPSAkdGhpcy0+am9ic1skaV07CnVuc2V0KCR0aGlzLT5qb2JzWyRpXSk7CiRlcnJvciA9IGN1cmxfZXJyb3IoJGN1cmxIYW5kbGUpOwokZXJybm8gPSBjdXJsX2Vycm5vKCRjdXJsSGFuZGxlKTsKY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCR0aGlzLT5tdWx0aUhhbmRsZSwgJGN1cmxIYW5kbGUpOwpjdXJsX2Nsb3NlKCRjdXJsSGFuZGxlKTsKCiRoZWFkZXJzID0gbnVsbDsKJHN0YXR1c0NvZGUgPSBudWxsOwokcmVzcG9uc2UgPSBudWxsOwp0cnkgewoKaWYgKENVUkxFX09LICE9PSAkZXJybm8gfHwgJGVycm9yIHx8ICRyZXN1bHQgIT09IENVUkxFX09LKSB7CiRlcnJubyA9ICRlcnJubyA/OiAkcmVzdWx0OwppZiAoISRlcnJvciAmJiBmdW5jdGlvbl9leGlzdHMoJ2N1cmxfc3RyZXJyb3InKSkgewokZXJyb3IgPSBjdXJsX3N0cmVycm9yKCRlcnJubyk7Cn0KJHByb2dyZXNzWydlcnJvcl9jb2RlJ10gPSAkZXJybm87CgppZiAoCighaXNzZXQoJGpvYlsnb3B0aW9ucyddWydodHRwJ11bJ21ldGhvZCddKSB8fCAkam9iWydvcHRpb25zJ11bJ2h0dHAnXVsnbWV0aG9kJ10gPT09ICdHRVQnKQomJiAoCmluX2FycmF5KCRlcnJubywgWzcgLCAxNiAsIDkyICwgNiBdLCB0cnVlKQp8fCAoaW5fYXJyYXkoJGVycm5vLCBbNTYgLCAzNSBdLCB0cnVlKSAmJiBzdHJfY29udGFpbnMoKHN0cmluZykgJGVycm9yLCAnQ29ubmVjdGlvbiByZXNldCBieSBwZWVyJykpCikgJiYgJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gPCAkdGhpcy0+bWF4UmV0cmllcwopIHsKJGF0dHJpYnV0ZXMgPSBbJ3JldHJpZXMnID0+ICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMV07CmlmICgkZXJybm8gPT09IDcgJiYgIWlzc2V0KCRqb2JbJ2F0dHJpYnV0ZXMnXVsnaXBSZXNvbHZlJ10pKSB7IAokYXR0cmlidXRlc1snaXBSZXNvbHZlJ10gPSA0Owp9CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmV0cnlpbmcgKCcuKCRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMSkuJykgJyAuIFVybDo6c2FuaXRpemUoJGpvYlsndXJsJ10pIC4gJyBkdWUgdG8gY3VybCBlcnJvciAnLiAkZXJybm8sIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5yZXN0YXJ0Sm9iV2l0aERlbGF5KCRqb2IsICRqb2JbJ3VybCddLCAkYXR0cmlidXRlcyk7CmNvbnRpbnVlOwp9CgoKaWYgKCRlcnJubyA9PT0gNTUgKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmV0cnlpbmcgKCcuKCRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMSkuJykgJyAuIFVybDo6c2FuaXRpemUoJGpvYlsndXJsJ10pIC4gJyBkdWUgdG8gY3VybCBlcnJvciAnLiAkZXJybm8sIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5yZXN0YXJ0Sm9iV2l0aERlbGF5KCRqb2IsICRqb2JbJ3VybCddLCBbJ3JldHJpZXMnID0+ICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMV0pOwpjb250aW51ZTsKfQoKaWYgKCRlcnJubyA9PT0gMjggICYmIFxQSFBfVkVSU0lPTl9JRCA+PSA3MDMwMCAmJiAkcHJvZ3Jlc3NbJ25hbWVsb29rdXBfdGltZSddID09PSAwLjAgJiYgISR0aW1lb3V0V2FybmluZykgewokdGltZW91dFdhcm5pbmcgPSB0cnVlOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkEgY29ubmVjdGlvbiB0aW1lb3V0IHdhcyBlbmNvdW50ZXJlZC4gSWYgeW91IGludGVuZCB0byBydW4gQ29tcG9zZXIgd2l0aG91dCBjb25uZWN0aW5nIHRvIHRoZSBpbnRlcm5ldCwgcnVuIHRoZSBjb21tYW5kIGFnYWluIHByZWZpeGVkIHdpdGggQ09NUE9TRVJfRElTQUJMRV9ORVRXT1JLPTEgdG8gbWFrZSBDb21wb3NlciBydW4gaW4gb2ZmbGluZSBtb2RlLjwvd2FybmluZz4nKTsKfQoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignY3VybCBlcnJvciAnLiRlcnJuby4nIHdoaWxlIGRvd25sb2FkaW5nICcuVXJsOjpzYW5pdGl6ZSgkcHJvZ3Jlc3NbJ3VybCddKS4nOiAnLiRlcnJvcik7Cn0KJHN0YXR1c0NvZGUgPSAkcHJvZ3Jlc3NbJ2h0dHBfY29kZSddOwpyZXdpbmQoJGpvYlsnaGVhZGVySGFuZGxlJ10pOwokaGVhZGVycyA9IGV4cGxvZGUoIlxyXG4iLCBydHJpbShzdHJlYW1fZ2V0X2NvbnRlbnRzKCRqb2JbJ2hlYWRlckhhbmRsZSddKSkpOwpmY2xvc2UoJGpvYlsnaGVhZGVySGFuZGxlJ10pOwoKaWYgKCRzdGF0dXNDb2RlID09PSAwKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1JlY2VpdmVkIHVuZXhwZWN0ZWQgaHR0cCBzdGF0dXMgY29kZSAwIHdpdGhvdXQgZXJyb3IgZm9yICcuVXJsOjpzYW5pdGl6ZSgkcHJvZ3Jlc3NbJ3VybCddKS4nOiBoZWFkZXJzICcudmFyX2V4cG9ydCgkaGVhZGVycywgdHJ1ZSkuJyBjdXJsIGluZm8gJy52YXJfZXhwb3J0KCRwcm9ncmVzcywgdHJ1ZSkpOwp9CgoKaWYgKG51bGwgIT09ICRqb2JbJ2ZpbGVuYW1lJ10pIHsKJGNvbnRlbnRzID0gJGpvYlsnZmlsZW5hbWUnXS4nfic7CmlmICgkc3RhdHVzQ29kZSA+PSAzMDApIHsKcmV3aW5kKCRqb2JbJ2JvZHlIYW5kbGUnXSk7CiRjb250ZW50cyA9IHN0cmVhbV9nZXRfY29udGVudHMoJGpvYlsnYm9keUhhbmRsZSddKTsKfQokcmVzcG9uc2UgPSBuZXcgQ3VybFJlc3BvbnNlKFsndXJsJyA9PiAkam9iWyd1cmwnXV0sICRzdGF0dXNDb2RlLCAkaGVhZGVycywgJGNvbnRlbnRzLCAkcHJvZ3Jlc3MpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1snLiRzdGF0dXNDb2RlLiddICcuVXJsOjpzYW5pdGl6ZSgkam9iWyd1cmwnXSksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0gZWxzZSB7CiRtYXhGaWxlU2l6ZSA9ICRqb2JbJ29wdGlvbnMnXVsnbWF4X2ZpbGVfc2l6ZSddID8/IG51bGw7CnJld2luZCgkam9iWydib2R5SGFuZGxlJ10pOwppZiAoJG1heEZpbGVTaXplICE9PSBudWxsKSB7CiRjb250ZW50cyA9IHN0cmVhbV9nZXRfY29udGVudHMoJGpvYlsnYm9keUhhbmRsZSddLCAkbWF4RmlsZVNpemUpOwoKCmlmICgkY29udGVudHMgIT09IGZhbHNlICYmIFBsYXRmb3JtOjpzdHJsZW4oJGNvbnRlbnRzKSA+PSAkbWF4RmlsZVNpemUpIHsKdGhyb3cgbmV3IE1heEZpbGVTaXplRXhjZWVkZWRFeGNlcHRpb24oJ01heGltdW0gYWxsb3dlZCBkb3dubG9hZCBzaXplIHJlYWNoZWQuIERvd25sb2FkZWQgJyAuIFBsYXRmb3JtOjpzdHJsZW4oJGNvbnRlbnRzKSAuICcgb2YgYWxsb3dlZCAnIC4gJG1heEZpbGVTaXplIC4gJyBieXRlcycpOwp9Cn0gZWxzZSB7CiRjb250ZW50cyA9IHN0cmVhbV9nZXRfY29udGVudHMoJGpvYlsnYm9keUhhbmRsZSddKTsKfQoKJHJlc3BvbnNlID0gbmV3IEN1cmxSZXNwb25zZShbJ3VybCcgPT4gJGpvYlsndXJsJ11dLCAkc3RhdHVzQ29kZSwgJGhlYWRlcnMsICRjb250ZW50cywgJHByb2dyZXNzKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdbJy4kc3RhdHVzQ29kZS4nXSAnLlVybDo6c2FuaXRpemUoJGpvYlsndXJsJ10pLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9CmZjbG9zZSgkam9iWydib2R5SGFuZGxlJ10pOwoKaWYgKCRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpID49IDMwMCAmJiAkcmVzcG9uc2UtPmdldEhlYWRlcignY29udGVudC10eXBlJykgPT09ICdhcHBsaWNhdGlvbi9qc29uJykgewpIdHRwRG93bmxvYWRlcjo6b3V0cHV0V2FybmluZ3MoJHRoaXMtPmlvLCAkam9iWydvcmlnaW4nXSwganNvbl9kZWNvZGUoJHJlc3BvbnNlLT5nZXRCb2R5KCksIHRydWUpKTsKfQoKJHJlc3VsdCA9ICR0aGlzLT5pc0F1dGhlbnRpY2F0ZWRSZXRyeU5lZWRlZCgkam9iLCAkcmVzcG9uc2UpOwppZiAoJHJlc3VsdFsncmV0cnknXSkgewokdGhpcy0+cmVzdGFydEpvYigkam9iLCAkam9iWyd1cmwnXSwgWydzdG9yZUF1dGgnID0+ICRyZXN1bHRbJ3N0b3JlQXV0aCddLCAncmV0cmllcycgPT4gJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gKyAxXSk7CmNvbnRpbnVlOwp9CgoKaWYgKCRzdGF0dXNDb2RlID49IDMwMCAmJiAkc3RhdHVzQ29kZSA8PSAzOTkgJiYgJHN0YXR1c0NvZGUgIT09IDMwNCAmJiAkam9iWydhdHRyaWJ1dGVzJ11bJ3JlZGlyZWN0cyddIDwgJHRoaXMtPm1heFJlZGlyZWN0cykgewokbG9jYXRpb24gPSAkdGhpcy0+aGFuZGxlUmVkaXJlY3QoJGpvYiwgJHJlc3BvbnNlKTsKaWYgKCRsb2NhdGlvbikgewokdGhpcy0+cmVzdGFydEpvYigkam9iLCAkbG9jYXRpb24sIFsncmVkaXJlY3RzJyA9PiAkam9iWydhdHRyaWJ1dGVzJ11bJ3JlZGlyZWN0cyddICsgMV0pOwpjb250aW51ZTsKfQp9CgoKaWYgKCRzdGF0dXNDb2RlID49IDQwMCAmJiAkc3RhdHVzQ29kZSA8PSA1OTkpIHsKaWYgKAooIWlzc2V0KCRqb2JbJ29wdGlvbnMnXVsnaHR0cCddWydtZXRob2QnXSkgfHwgJGpvYlsnb3B0aW9ucyddWydodHRwJ11bJ21ldGhvZCddID09PSAnR0VUJykKJiYgaW5fYXJyYXkoJHN0YXR1c0NvZGUsIFs0MjMsIDQyNSwgNTAwLCA1MDIsIDUwMywgNTA0LCA1MDcsIDUxMF0sIHRydWUpCiYmICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddIDwgJHRoaXMtPm1heFJldHJpZXMKKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmV0cnlpbmcgKCcuKCRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMSkuJykgJyAuIFVybDo6c2FuaXRpemUoJGpvYlsndXJsJ10pIC4gJyBkdWUgdG8gc3RhdHVzIGNvZGUgJy4gJHN0YXR1c0NvZGUsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5yZXN0YXJ0Sm9iV2l0aERlbGF5KCRqb2IsICRqb2JbJ3VybCddLCBbJ3JldHJpZXMnID0+ICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMV0pOwpjb250aW51ZTsKfQoKdGhyb3cgJHRoaXMtPmZhaWxSZXNwb25zZSgkam9iLCAkcmVzcG9uc2UsICRyZXNwb25zZS0+Z2V0U3RhdHVzTWVzc2FnZSgpKTsKfQoKaWYgKCRqb2JbJ2F0dHJpYnV0ZXMnXVsnc3RvcmVBdXRoJ10gIT09IGZhbHNlKSB7CiR0aGlzLT5hdXRoSGVscGVyLT5zdG9yZUF1dGgoJGpvYlsnb3JpZ2luJ10sICRqb2JbJ2F0dHJpYnV0ZXMnXVsnc3RvcmVBdXRoJ10pOwp9CgoKaWYgKG51bGwgIT09ICRqb2JbJ2ZpbGVuYW1lJ10pIHsKcmVuYW1lKCRqb2JbJ2ZpbGVuYW1lJ10uJ34nLCAkam9iWydmaWxlbmFtZSddKTsKJGpvYlsncmVzb2x2ZSddKCRyZXNwb25zZSk7Cn0gZWxzZSB7CiRqb2JbJ3Jlc29sdmUnXSgkcmVzcG9uc2UpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uKSB7CmlmIChudWxsICE9PSAkaGVhZGVycykgewokZS0+c2V0SGVhZGVycygkaGVhZGVycyk7CiRlLT5zZXRTdGF0dXNDb2RlKCRzdGF0dXNDb2RlKTsKfQppZiAobnVsbCAhPT0gJHJlc3BvbnNlKSB7CiRlLT5zZXRSZXNwb25zZSgkcmVzcG9uc2UtPmdldEJvZHkoKSk7Cn0KJGUtPnNldFJlc3BvbnNlSW5mbygkcHJvZ3Jlc3MpOwp9CgokdGhpcy0+cmVqZWN0Sm9iKCRqb2IsICRlKTsKfQp9Cgpmb3JlYWNoICgkdGhpcy0+am9icyBhcyAkaSA9PiAkY3VybEhhbmRsZSkgewokY3VybEhhbmRsZSA9ICR0aGlzLT5qb2JzWyRpXVsnY3VybEhhbmRsZSddOwokcHJvZ3Jlc3MgPSBhcnJheV9kaWZmX2tleShjdXJsX2dldGluZm8oJGN1cmxIYW5kbGUpLCBzZWxmOjokdGltZUluZm8pOwoKaWYgKCR0aGlzLT5qb2JzWyRpXVsncHJvZ3Jlc3MnXSAhPT0gJHByb2dyZXNzKSB7CiR0aGlzLT5qb2JzWyRpXVsncHJvZ3Jlc3MnXSA9ICRwcm9ncmVzczsKCmlmIChpc3NldCgkdGhpcy0+am9ic1skaV1bJ29wdGlvbnMnXVsnbWF4X2ZpbGVfc2l6ZSddKSkgewoKaWYgKCR0aGlzLT5qb2JzWyRpXVsnb3B0aW9ucyddWydtYXhfZmlsZV9zaXplJ10gPCAkcHJvZ3Jlc3NbJ2Rvd25sb2FkX2NvbnRlbnRfbGVuZ3RoJ10pIHsKJHRoaXMtPnJlamVjdEpvYigkdGhpcy0+am9ic1skaV0sIG5ldyBNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uKCdNYXhpbXVtIGFsbG93ZWQgZG93bmxvYWQgc2l6ZSByZWFjaGVkLiBDb250ZW50LWxlbmd0aCBoZWFkZXIgaW5kaWNhdGVzICcgLiAkcHJvZ3Jlc3NbJ2Rvd25sb2FkX2NvbnRlbnRfbGVuZ3RoJ10gLiAnIGJ5dGVzLiBBbGxvd2VkICcgLiAkdGhpcy0+am9ic1skaV1bJ29wdGlvbnMnXVsnbWF4X2ZpbGVfc2l6ZSddIC4gJyBieXRlcycpKTsKfQoKCmlmICgkdGhpcy0+am9ic1skaV1bJ29wdGlvbnMnXVsnbWF4X2ZpbGVfc2l6ZSddIDwgJHByb2dyZXNzWydzaXplX2Rvd25sb2FkJ10pIHsKJHRoaXMtPnJlamVjdEpvYigkdGhpcy0+am9ic1skaV0sIG5ldyBNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uKCdNYXhpbXVtIGFsbG93ZWQgZG93bmxvYWQgc2l6ZSByZWFjaGVkLiBEb3dubG9hZGVkICcgLiAkcHJvZ3Jlc3NbJ3NpemVfZG93bmxvYWQnXSAuICcgb2YgYWxsb3dlZCAnIC4gJHRoaXMtPmpvYnNbJGldWydvcHRpb25zJ11bJ21heF9maWxlX3NpemUnXSAuICcgYnl0ZXMnKSk7Cn0KfQoKaWYgKGlzc2V0KCRwcm9ncmVzc1sncHJpbWFyeV9pcCddKSAmJiAkcHJvZ3Jlc3NbJ3ByaW1hcnlfaXAnXSAhPT0gJHRoaXMtPmpvYnNbJGldWydwcmltYXJ5SXAnXSkgewppZiAoCmlzc2V0KCR0aGlzLT5qb2JzWyRpXVsnb3B0aW9ucyddWydwcmV2ZW50X2lwX2FjY2Vzc19jYWxsYWJsZSddKSAmJgppc19jYWxsYWJsZSgkdGhpcy0+am9ic1skaV1bJ29wdGlvbnMnXVsncHJldmVudF9pcF9hY2Nlc3NfY2FsbGFibGUnXSkgJiYKJHRoaXMtPmpvYnNbJGldWydvcHRpb25zJ11bJ3ByZXZlbnRfaXBfYWNjZXNzX2NhbGxhYmxlJ10oJHByb2dyZXNzWydwcmltYXJ5X2lwJ10pCikgewokdGhpcy0+cmVqZWN0Sm9iKCR0aGlzLT5qb2JzWyRpXSwgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihzcHJpbnRmKCdJUCAiJXMiIGlzIGJsb2NrZWQgZm9yICIlcyIuJywgJHByb2dyZXNzWydwcmltYXJ5X2lwJ10sICRwcm9ncmVzc1sndXJsJ10pKSk7Cn0KCiR0aGlzLT5qb2JzWyRpXVsncHJpbWFyeUlwJ10gPSAoc3RyaW5nKSAkcHJvZ3Jlc3NbJ3ByaW1hcnlfaXAnXTsKfQoKCn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZVJlZGlyZWN0KGFycmF5ICRqb2IsIFJlc3BvbnNlICRyZXNwb25zZSk6IHN0cmluZwp7CmlmICgkbG9jYXRpb25IZWFkZXIgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignbG9jYXRpb24nKSkgewppZiAocGFyc2VfdXJsKCRsb2NhdGlvbkhlYWRlciwgUEhQX1VSTF9TQ0hFTUUpKSB7CgokdGFyZ2V0VXJsID0gJGxvY2F0aW9uSGVhZGVyOwp9IGVsc2VpZiAocGFyc2VfdXJsKCRsb2NhdGlvbkhlYWRlciwgUEhQX1VSTF9IT1NUKSkgewoKJHRhcmdldFVybCA9IHBhcnNlX3VybCgkam9iWyd1cmwnXSwgUEhQX1VSTF9TQ0hFTUUpLic6Jy4kbG9jYXRpb25IZWFkZXI7Cn0gZWxzZWlmICgnLycgPT09ICRsb2NhdGlvbkhlYWRlclswXSkgewoKJHVybEhvc3QgPSBwYXJzZV91cmwoJGpvYlsndXJsJ10sIFBIUF9VUkxfSE9TVCk7CgoKJHRhcmdldFVybCA9IFByZWc6OnJlcGxhY2UoJ3teKC4rKD86Ly98QCknLnByZWdfcXVvdGUoJHVybEhvc3QpLicoPzo6XGQrKT8pKD86Wy9cP10uKik/JH0nLCAnXDEnLiRsb2NhdGlvbkhlYWRlciwgJGpvYlsndXJsJ10pOwp9IGVsc2UgewoKCiR0YXJnZXRVcmwgPSBQcmVnOjpyZXBsYWNlKCd7XiguKy8pW14vP10qKD86XD8uKik/JH0nLCAnXDEnLiRsb2NhdGlvbkhlYWRlciwgJGpvYlsndXJsJ10pOwp9Cn0KCmlmICghZW1wdHkoJHRhcmdldFVybCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJ0ZvbGxvd2luZyByZWRpcmVjdCAoJXUpICVzJywgJGpvYlsnYXR0cmlidXRlcyddWydyZWRpcmVjdHMnXSArIDEsIFVybDo6c2FuaXRpemUoJHRhcmdldFVybCkpLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKcmV0dXJuICR0YXJnZXRVcmw7Cn0KCnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1RoZSAiJy4kam9iWyd1cmwnXS4nIiBmaWxlIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkLCBnb3QgcmVkaXJlY3Qgd2l0aG91dCBMb2NhdGlvbiAoJy4kcmVzcG9uc2UtPmdldFN0YXR1c01lc3NhZ2UoKS4nKScpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpc0F1dGhlbnRpY2F0ZWRSZXRyeU5lZWRlZChhcnJheSAkam9iLCBSZXNwb25zZSAkcmVzcG9uc2UpOiBhcnJheQp7CmlmIChpbl9hcnJheSgkcmVzcG9uc2UtPmdldFN0YXR1c0NvZGUoKSwgWzQwMSwgNDAzXSkgJiYgJGpvYlsnYXR0cmlidXRlcyddWydyZXRyeUF1dGhGYWlsdXJlJ10pIHsKJHJlc3VsdCA9ICR0aGlzLT5hdXRoSGVscGVyLT5wcm9tcHRBdXRoSWZOZWVkZWQoJGpvYlsndXJsJ10sICRqb2JbJ29yaWdpbiddLCAkcmVzcG9uc2UtPmdldFN0YXR1c0NvZGUoKSwgJHJlc3BvbnNlLT5nZXRTdGF0dXNNZXNzYWdlKCksICRyZXNwb25zZS0+Z2V0SGVhZGVycygpLCAkam9iWydhdHRyaWJ1dGVzJ11bJ3JldHJpZXMnXSk7CgppZiAoJHJlc3VsdFsncmV0cnknXSkgewpyZXR1cm4gJHJlc3VsdDsKfQp9CgokbG9jYXRpb25IZWFkZXIgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignbG9jYXRpb24nKTsKJG5lZWRzQXV0aFJldHJ5ID0gZmFsc2U7CgoKaWYgKAokam9iWydvcmlnaW4nXSA9PT0gJ2JpdGJ1Y2tldC5vcmcnCiYmICEkdGhpcy0+YXV0aEhlbHBlci0+aXNQdWJsaWNCaXRCdWNrZXREb3dubG9hZCgkam9iWyd1cmwnXSkKJiYgc3Vic3RyKCRqb2JbJ3VybCddLCAtNCkgPT09ICcuemlwJwomJiAoISRsb2NhdGlvbkhlYWRlciB8fCBzdWJzdHIoJGxvY2F0aW9uSGVhZGVyLCAtNCkgIT09ICcuemlwJykKJiYgUHJlZzo6aXNNYXRjaCgne150ZXh0L2h0bWxcYn1pJywgJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2NvbnRlbnQtdHlwZScpKQopIHsKJG5lZWRzQXV0aFJldHJ5ID0gJ0JpdGJ1Y2tldCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbiBhbmQgaXQgd2FzIG5vdCBwcm92aWRlZCc7Cn0KCgppZiAoCiRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0MDQKJiYgaW5fYXJyYXkoJGpvYlsnb3JpZ2luJ10sICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkKJiYgZmFsc2UgIT09IHN0cnBvcygkam9iWyd1cmwnXSwgJ2FyY2hpdmUuemlwJykKKSB7CiRuZWVkc0F1dGhSZXRyeSA9ICdHaXRMYWIgcmVxdWlyZXMgYXV0aGVudGljYXRpb24gYW5kIGl0IHdhcyBub3QgcHJvdmlkZWQnOwp9CgppZiAoJG5lZWRzQXV0aFJldHJ5KSB7CmlmICgkam9iWydhdHRyaWJ1dGVzJ11bJ3JldHJ5QXV0aEZhaWx1cmUnXSkgewokcmVzdWx0ID0gJHRoaXMtPmF1dGhIZWxwZXItPnByb21wdEF1dGhJZk5lZWRlZCgkam9iWyd1cmwnXSwgJGpvYlsnb3JpZ2luJ10sIDQwMSwgbnVsbCwgW10sICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddKTsKaWYgKCRyZXN1bHRbJ3JldHJ5J10pIHsKcmV0dXJuICRyZXN1bHQ7Cn0KfQoKdGhyb3cgJHRoaXMtPmZhaWxSZXNwb25zZSgkam9iLCAkcmVzcG9uc2UsICRuZWVkc0F1dGhSZXRyeSk7Cn0KCnJldHVybiBbJ3JldHJ5JyA9PiBmYWxzZSwgJ3N0b3JlQXV0aCcgPT4gZmFsc2VdOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlc3RhcnRKb2IoYXJyYXkgJGpvYiwgc3RyaW5nICR1cmwsIGFycmF5ICRhdHRyaWJ1dGVzID0gW10pOiB2b2lkCnsKaWYgKG51bGwgIT09ICRqb2JbJ2ZpbGVuYW1lJ10pIHsKQHVubGluaygkam9iWydmaWxlbmFtZSddLid+Jyk7Cn0KCiRhdHRyaWJ1dGVzID0gYXJyYXlfbWVyZ2UoJGpvYlsnYXR0cmlidXRlcyddLCAkYXR0cmlidXRlcyk7CiRvcmlnaW4gPSBVcmw6OmdldE9yaWdpbigkdGhpcy0+Y29uZmlnLCAkdXJsKTsKCiR0aGlzLT5pbml0RG93bmxvYWQoJGpvYlsncmVzb2x2ZSddLCAkam9iWydyZWplY3QnXSwgJG9yaWdpbiwgJHVybCwgJGpvYlsnb3B0aW9ucyddLCAkam9iWydmaWxlbmFtZSddLCAkYXR0cmlidXRlcyk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVzdGFydEpvYldpdGhEZWxheShhcnJheSAkam9iLCBzdHJpbmcgJHVybCwgYXJyYXkgJGF0dHJpYnV0ZXMpOiB2b2lkCnsKaWYgKCRhdHRyaWJ1dGVzWydyZXRyaWVzJ10gPj0gMykgewp1c2xlZXAoNTAwMDAwKTsgCn0gZWxzZWlmICgkYXR0cmlidXRlc1sncmV0cmllcyddID49IDIpIHsKdXNsZWVwKDEwMDAwMCk7IAp9IAoKJHRoaXMtPnJlc3RhcnRKb2IoJGpvYiwgJHVybCwgJGF0dHJpYnV0ZXMpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZhaWxSZXNwb25zZShhcnJheSAkam9iLCBSZXNwb25zZSAkcmVzcG9uc2UsIHN0cmluZyAkZXJyb3JNZXNzYWdlKTogVHJhbnNwb3J0RXhjZXB0aW9uCnsKaWYgKG51bGwgIT09ICRqb2JbJ2ZpbGVuYW1lJ10pIHsKQHVubGluaygkam9iWydmaWxlbmFtZSddLid+Jyk7Cn0KCiRkZXRhaWxzID0gJyc7CmlmIChpbl9hcnJheShzdHJ0b2xvd2VyKChzdHJpbmcpICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKSksIFsnYXBwbGljYXRpb24vanNvbicsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J10sIHRydWUpKSB7CiRkZXRhaWxzID0gJzonLlBIUF9FT0wuc3Vic3RyKCRyZXNwb25zZS0+Z2V0Qm9keSgpLCAwLCAyMDApLihzdHJsZW4oJHJlc3BvbnNlLT5nZXRCb2R5KCkpID4gMjAwID8gJy4uLicgOiAnJyk7Cn0KCnJldHVybiBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgIicuJGpvYlsndXJsJ10uJyIgZmlsZSBjb3VsZCBub3QgYmUgZG93bmxvYWRlZCAoJy4kZXJyb3JNZXNzYWdlLicpJyAuICRkZXRhaWxzLCAkcmVzcG9uc2UtPmdldFN0YXR1c0NvZGUoKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVqZWN0Sm9iKGFycmF5ICRqb2IsIFxFeGNlcHRpb24gJGUpOiB2b2lkCnsKaWYgKGlzX3Jlc291cmNlKCRqb2JbJ2hlYWRlckhhbmRsZSddKSkgewpmY2xvc2UoJGpvYlsnaGVhZGVySGFuZGxlJ10pOwp9CmlmIChpc19yZXNvdXJjZSgkam9iWydib2R5SGFuZGxlJ10pKSB7CmZjbG9zZSgkam9iWydib2R5SGFuZGxlJ10pOwp9CmlmIChudWxsICE9PSAkam9iWydmaWxlbmFtZSddKSB7CkB1bmxpbmsoJGpvYlsnZmlsZW5hbWUnXS4nficpOwp9CiRqb2JbJ3JlamVjdCddKCRlKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0N1cmxSZXN1bHQoaW50ICRjb2RlKTogdm9pZAp7CmlmICgkY29kZSAhPT0gQ1VSTE1fT0sgJiYgJGNvZGUgIT09IENVUkxNX0NBTExfTVVMVElfUEVSRk9STSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCmlzc2V0KCR0aGlzLT5tdWx0aUVycm9yc1skY29kZV0pCj8gImNVUkwgZXJyb3I6IHskY29kZX0gKHskdGhpcy0+bXVsdGlFcnJvcnNbJGNvZGVdWzBdfSk6IGNVUkwgbWVzc2FnZTogeyR0aGlzLT5tdWx0aUVycm9yc1skY29kZV1bMV19Igo6ICdVbmV4cGVjdGVkIGNVUkwgZXJyb3I6ICcgLiAkY29kZQopOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbFxIdHRwOwoKCgoKY2xhc3MgQ3VybFJlc3BvbnNlIGV4dGVuZHMgUmVzcG9uc2UKewoKCgoKCnByaXZhdGUgJGN1cmxJbmZvOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXF1ZXN0LCA/aW50ICRjb2RlLCBhcnJheSAkaGVhZGVycywgP3N0cmluZyAkYm9keSwgYXJyYXkgJGN1cmxJbmZvKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHJlcXVlc3QsICRjb2RlLCAkaGVhZGVycywgJGJvZHkpOwokdGhpcy0+Y3VybEluZm8gPSAkY3VybEluZm87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDdXJsSW5mbygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Y3VybEluZm87Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbFxIdHRwOwoKCgoKCmNsYXNzIFByb3h5SXRlbQp7Cgpwcml2YXRlICR1cmw7Cgpwcml2YXRlICRzYWZlVXJsOwoKcHJpdmF0ZSAkY3VybEF1dGg7Cgpwcml2YXRlICRvcHRpb25zUHJveHk7Cgpwcml2YXRlICRvcHRpb25zQXV0aDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcHJveHlVcmwsIHN0cmluZyAkZW52TmFtZSkKewokc3ludGF4RXJyb3IgPSBzcHJpbnRmKCd1bnN1cHBvcnRlZCBgJXNgIHN5bnRheCcsICRlbnZOYW1lKTsKCmlmIChzdHJwYnJrKCRwcm94eVVybCwgIlxyXG5cdCIpICE9PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJHN5bnRheEVycm9yKTsKfQppZiAoZmFsc2UgPT09ICgkcHJveHkgPSBwYXJzZV91cmwoJHByb3h5VXJsKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRzeW50YXhFcnJvcik7Cn0KaWYgKCFpc3NldCgkcHJveHlbJ2hvc3QnXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCd1bmFibGUgdG8gZmluZCBwcm94eSBob3N0IGluICcgLiAkZW52TmFtZSk7Cn0KCiRzY2hlbWUgPSBpc3NldCgkcHJveHlbJ3NjaGVtZSddKSA/IHN0cnRvbG93ZXIoJHByb3h5WydzY2hlbWUnXSkgLiAnOi8vJyA6ICdodHRwOi8vJzsKJHNhZmUgPSAnJzsKCmlmIChpc3NldCgkcHJveHlbJ3VzZXInXSkpIHsKJHNhZmUgPSAnKioqJzsKJHVzZXIgPSAkcHJveHlbJ3VzZXInXTsKJGF1dGggPSByYXd1cmxkZWNvZGUoJHByb3h5Wyd1c2VyJ10pOwoKaWYgKGlzc2V0KCRwcm94eVsncGFzcyddKSkgewokc2FmZSAuPSAnOioqKic7CiR1c2VyIC49ICc6JyAuICRwcm94eVsncGFzcyddOwokYXV0aCAuPSAnOicgLiByYXd1cmxkZWNvZGUoJHByb3h5WydwYXNzJ10pOwp9Cgokc2FmZSAuPSAnQCc7CgppZiAoc3RybGVuKCR1c2VyKSA+IDApIHsKJHRoaXMtPmN1cmxBdXRoID0gJHVzZXI7CiR0aGlzLT5vcHRpb25zQXV0aCA9ICdQcm94eS1BdXRob3JpemF0aW9uOiBCYXNpYyAnIC4gYmFzZTY0X2VuY29kZSgkYXV0aCk7Cn0KfQoKJGhvc3QgPSAkcHJveHlbJ2hvc3QnXTsKJHBvcnQgPSBudWxsOwoKaWYgKGlzc2V0KCRwcm94eVsncG9ydCddKSkgewokcG9ydCA9ICRwcm94eVsncG9ydCddOwp9IGVsc2VpZiAoJHNjaGVtZSA9PT0gJ2h0dHA6Ly8nKSB7CiRwb3J0ID0gODA7Cn0gZWxzZWlmICgkc2NoZW1lID09PSAnaHR0cHM6Ly8nKSB7CiRwb3J0ID0gNDQzOwp9CgoKCmlmICgkcG9ydCA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ3VuYWJsZSB0byBmaW5kIHByb3h5IHBvcnQgaW4gJyAuICRlbnZOYW1lKTsKfQppZiAoJHBvcnQgPT09IDApIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdwb3J0IDAgaXMgcmVzZXJ2ZWQgaW4gJyAuICRlbnZOYW1lKTsKfQoKJHRoaXMtPnVybCA9IHNwcmludGYoJyVzJXM6JWQnLCAkc2NoZW1lLCAkaG9zdCwgJHBvcnQpOwokdGhpcy0+c2FmZVVybCA9IHNwcmludGYoJyVzJXMlczolZCcsICRzY2hlbWUsICRzYWZlLCAkaG9zdCwgJHBvcnQpOwoKJHNjaGVtZSA9IHN0cl9yZXBsYWNlKFsnaHR0cDovLycsICdodHRwczovLyddLCBbJ3RjcDovLycsICdzc2w6Ly8nXSwgJHNjaGVtZSk7CiR0aGlzLT5vcHRpb25zUHJveHkgPSBzcHJpbnRmKCclcyVzOiVkJywgJHNjaGVtZSwgJGhvc3QsICRwb3J0KTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdG9SZXF1ZXN0UHJveHkoc3RyaW5nICRzY2hlbWUpOiBSZXF1ZXN0UHJveHkKewokb3B0aW9ucyA9IFsnaHR0cCcgPT4gWydwcm94eScgPT4gJHRoaXMtPm9wdGlvbnNQcm94eV1dOwoKaWYgKCR0aGlzLT5vcHRpb25zQXV0aCAhPT0gbnVsbCkgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9ICR0aGlzLT5vcHRpb25zQXV0aDsKfQoKaWYgKCRzY2hlbWUgPT09ICdodHRwJykgewokb3B0aW9uc1snaHR0cCddWydyZXF1ZXN0X2Z1bGx1cmknXSA9IHRydWU7Cn0KCnJldHVybiBuZXcgUmVxdWVzdFByb3h5KCR0aGlzLT51cmwsICR0aGlzLT5jdXJsQXV0aCwgJG9wdGlvbnMsICR0aGlzLT5zYWZlVXJsKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsXEh0dHA7Cgp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxVdGlsXE5vUHJveHlQYXR0ZXJuOwoKCgoKCmNsYXNzIFByb3h5TWFuYWdlcgp7Cgpwcml2YXRlICRlcnJvciA9IG51bGw7Cgpwcml2YXRlICRodHRwUHJveHkgPSBudWxsOwoKcHJpdmF0ZSAkaHR0cHNQcm94eSA9IG51bGw7Cgpwcml2YXRlICRub1Byb3h5SGFuZGxlciA9IG51bGw7CgoKcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlID0gbnVsbDsKCnByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CnRyeSB7CiR0aGlzLT5nZXRQcm94eURhdGEoKTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yID0gJGUtPmdldE1lc3NhZ2UoKTsKfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbmNlKCk6IFByb3h5TWFuYWdlcgp7CmlmIChzZWxmOjokaW5zdGFuY2UgPT09IG51bGwpIHsKc2VsZjo6JGluc3RhbmNlID0gbmV3IHNlbGYoKTsKfQoKcmV0dXJuIHNlbGY6OiRpbnN0YW5jZTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXNldCgpOiB2b2lkCnsKc2VsZjo6JGluc3RhbmNlID0gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1Byb3h5KCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmh0dHBQcm94eSAhPT0gbnVsbCB8fCAkdGhpcy0+aHR0cHNQcm94eSAhPT0gbnVsbDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJveHlGb3JSZXF1ZXN0KHN0cmluZyAkcmVxdWVzdFVybCk6IFJlcXVlc3RQcm94eQp7CmlmICgkdGhpcy0+ZXJyb3IgIT09IG51bGwpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVW5hYmxlIHRvIHVzZSBhIHByb3h5OiAnLiR0aGlzLT5lcnJvcik7Cn0KCiRzY2hlbWUgPSAoc3RyaW5nKSBwYXJzZV91cmwoJHJlcXVlc3RVcmwsIFBIUF9VUkxfU0NIRU1FKTsKJHByb3h5ID0gJHRoaXMtPmdldFByb3h5Rm9yU2NoZW1lKCRzY2hlbWUpOwoKaWYgKCRwcm94eSA9PT0gbnVsbCkgewpyZXR1cm4gUmVxdWVzdFByb3h5Ojpub25lKCk7Cn0KCmlmICgkdGhpcy0+bm9Qcm94eSgkcmVxdWVzdFVybCkpIHsKcmV0dXJuIFJlcXVlc3RQcm94eTo6bm9Qcm94eSgpOwp9CgpyZXR1cm4gJHByb3h5LT50b1JlcXVlc3RQcm94eSgkc2NoZW1lKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQcm94eUZvclNjaGVtZShzdHJpbmcgJHNjaGVtZSk6ID9Qcm94eUl0ZW0KewppZiAoJHNjaGVtZSA9PT0gJ2h0dHAnKSB7CnJldHVybiAkdGhpcy0+aHR0cFByb3h5Owp9CgppZiAoJHNjaGVtZSA9PT0gJ2h0dHBzJykgewpyZXR1cm4gJHRoaXMtPmh0dHBzUHJveHk7Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFByb3h5RGF0YSgpOiB2b2lkCnsKCmlmIChQSFBfU0FQSSA9PT0gJ2NsaScgfHwgUEhQX1NBUEkgPT09ICdwaHBkYmcnKSB7ClskZW52LCAkbmFtZV0gPSAkdGhpcy0+Z2V0UHJveHlFbnYoJ2h0dHBfcHJveHknKTsKaWYgKCRlbnYgIT09IG51bGwpIHsKJHRoaXMtPmh0dHBQcm94eSA9IG5ldyBQcm94eUl0ZW0oJGVudiwgJG5hbWUpOwp9Cn0KCgppZiAoJHRoaXMtPmh0dHBQcm94eSA9PT0gbnVsbCkgewpbJGVudiwgJG5hbWVdID0gJHRoaXMtPmdldFByb3h5RW52KCdjZ2lfaHR0cF9wcm94eScpOwppZiAoJGVudiAhPT0gbnVsbCkgewokdGhpcy0+aHR0cFByb3h5ID0gbmV3IFByb3h5SXRlbSgkZW52LCAkbmFtZSk7Cn0KfQoKClskZW52LCAkbmFtZV0gPSAkdGhpcy0+Z2V0UHJveHlFbnYoJ2h0dHBzX3Byb3h5Jyk7CmlmICgkZW52ICE9PSBudWxsKSB7CiR0aGlzLT5odHRwc1Byb3h5ID0gbmV3IFByb3h5SXRlbSgkZW52LCAkbmFtZSk7Cn0KCgpbJGVudiwgJG5hbWVdID0gJHRoaXMtPmdldFByb3h5RW52KCdub19wcm94eScpOwppZiAoJGVudiAhPT0gbnVsbCkgewokdGhpcy0+bm9Qcm94eUhhbmRsZXIgPSBuZXcgTm9Qcm94eVBhdHRlcm4oJGVudik7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFByb3h5RW52KHN0cmluZyAkZW52TmFtZSk6IGFycmF5CnsKJG5hbWVzID0gW3N0cnRvbG93ZXIoJGVudk5hbWUpLCBzdHJ0b3VwcGVyKCRlbnZOYW1lKV07Cgpmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpIHsKaWYgKGlzX3N0cmluZygkX1NFUlZFUlskbmFtZV0gPz8gbnVsbCkpIHsKaWYgKCRfU0VSVkVSWyRuYW1lXSAhPT0gJycpIHsKcmV0dXJuIFskX1NFUlZFUlskbmFtZV0sICRuYW1lXTsKfQp9Cn0KCnJldHVybiBbbnVsbCwgJyddOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG5vUHJveHkoc3RyaW5nICRyZXF1ZXN0VXJsKTogYm9vbAp7CmlmICgkdGhpcy0+bm9Qcm94eUhhbmRsZXIgPT09IG51bGwpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gJHRoaXMtPm5vUHJveHlIYW5kbGVyLT50ZXN0KCRyZXF1ZXN0VXJsKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsXEh0dHA7Cgp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CgoKCgoKCgpjbGFzcyBSZXF1ZXN0UHJveHkKewoKcHJpdmF0ZSAkY29udGV4dE9wdGlvbnM7Cgpwcml2YXRlICRzdGF0dXM7Cgpwcml2YXRlICR1cmw7Cgpwcml2YXRlICRhdXRoOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9zdHJpbmcgJHVybCwgP3N0cmluZyAkYXV0aCwgP2FycmF5ICRjb250ZXh0T3B0aW9ucywgP3N0cmluZyAkc3RhdHVzKQp7CiR0aGlzLT51cmwgPSAkdXJsOwokdGhpcy0+YXV0aCA9ICRhdXRoOwokdGhpcy0+Y29udGV4dE9wdGlvbnMgPSAkY29udGV4dE9wdGlvbnM7CiR0aGlzLT5zdGF0dXMgPSAkc3RhdHVzOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vbmUoKTogUmVxdWVzdFByb3h5CnsKcmV0dXJuIG5ldyBzZWxmKG51bGwsIG51bGwsIG51bGwsIG51bGwpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vUHJveHkoKTogUmVxdWVzdFByb3h5CnsKcmV0dXJuIG5ldyBzZWxmKG51bGwsIG51bGwsIG51bGwsICdleGNsdWRlZCBieSBub19wcm94eScpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZXh0T3B0aW9ucygpOiA/YXJyYXkKewpyZXR1cm4gJHRoaXMtPmNvbnRleHRPcHRpb25zOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VybE9wdGlvbnMoYXJyYXkgJHNzbE9wdGlvbnMpOiBhcnJheQp7CmlmICgkdGhpcy0+aXNTZWN1cmUoKSAmJiAhJHRoaXMtPnN1cHBvcnRzU2VjdXJlUHJveHkoKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdDYW5ub3QgdXNlIGFuIEhUVFBTIHByb3h5LiBQSFAgPj0gNy4zIGFuZCBjVXJsID49IDcuNTIuMCBhcmUgcmVxdWlyZWQuJyk7Cn0KCgoKJG9wdGlvbnMgPSBbQ1VSTE9QVF9QUk9YWSA9PiAoc3RyaW5nKSAkdGhpcy0+dXJsXTsKCgppZiAoJHRoaXMtPnVybCAhPT0gbnVsbCkgewokb3B0aW9uc1tDVVJMT1BUX05PUFJPWFldID0gJyc7Cn0KCgppZiAoJHRoaXMtPmF1dGggIT09IG51bGwpIHsKJG9wdGlvbnNbQ1VSTE9QVF9QUk9YWUFVVEhdID0gQ1VSTEFVVEhfQkFTSUM7CiRvcHRpb25zW0NVUkxPUFRfUFJPWFlVU0VSUFdEXSA9ICR0aGlzLT5hdXRoOwp9CgppZiAoJHRoaXMtPmlzU2VjdXJlKCkpIHsKaWYgKGlzc2V0KCRzc2xPcHRpb25zWydjYWZpbGUnXSkpIHsKJG9wdGlvbnNbQ1VSTE9QVF9QUk9YWV9DQUlORk9dID0gJHNzbE9wdGlvbnNbJ2NhZmlsZSddOwp9CmlmIChpc3NldCgkc3NsT3B0aW9uc1snY2FwYXRoJ10pKSB7CiRvcHRpb25zW0NVUkxPUFRfUFJPWFlfQ0FQQVRIXSA9ICRzc2xPcHRpb25zWydjYXBhdGgnXTsKfQp9CgpyZXR1cm4gJG9wdGlvbnM7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdHVzKD9zdHJpbmcgJGZvcm1hdCA9IG51bGwpOiBzdHJpbmcKewppZiAoJHRoaXMtPnN0YXR1cyA9PT0gbnVsbCkgewpyZXR1cm4gJyc7Cn0KCiRmb3JtYXQgPSAkZm9ybWF0ID8/ICclcyc7CmlmIChzdHJwb3MoJGZvcm1hdCwgJyVzJykgIT09IGZhbHNlKSB7CnJldHVybiBzcHJpbnRmKCRmb3JtYXQsICR0aGlzLT5zdGF0dXMpOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3RyaW5nIGZvcm1hdCBzcGVjaWZpZXIgaXMgbWlzc2luZycpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0V4Y2x1ZGVkQnlOb1Byb3h5KCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnN0YXR1cyAhPT0gbnVsbCAmJiAkdGhpcy0+dXJsID09PSBudWxsOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNTZWN1cmUoKTogYm9vbAp7CnJldHVybiAwID09PSBzdHJwb3MoKHN0cmluZykgJHRoaXMtPnVybCwgJ2h0dHBzOi8vJyk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0c1NlY3VyZVByb3h5KCk6IGJvb2wKewppZiAoZmFsc2UgPT09ICgkdmVyc2lvbiA9IGN1cmxfdmVyc2lvbigpKSB8fCAhZGVmaW5lZCgnQ1VSTF9WRVJTSU9OX0hUVFBTX1BST1hZJykpIHsKcmV0dXJuIGZhbHNlOwp9CgokZmVhdHVyZXMgPSAkdmVyc2lvblsnZmVhdHVyZXMnXTsKCnJldHVybiAoYm9vbCkgKCRmZWF0dXJlcyAmIENVUkxfVkVSU0lPTl9IVFRQU19QUk9YWSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbFxIdHRwOwoKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwoKCgoKY2xhc3MgUmVzcG9uc2UKewoKcHJpdmF0ZSAkcmVxdWVzdDsKCnByaXZhdGUgJGNvZGU7Cgpwcml2YXRlICRoZWFkZXJzOwoKcHJpdmF0ZSAkYm9keTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHJlcXVlc3QsID9pbnQgJGNvZGUsIGFycmF5ICRoZWFkZXJzLCA/c3RyaW5nICRib2R5KQp7CmlmICghaXNzZXQoJHJlcXVlc3RbJ3VybCddKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCd1cmwga2V5IG1pc3NpbmcgZnJvbSByZXF1ZXN0IGFycmF5Jyk7Cn0KJHRoaXMtPnJlcXVlc3QgPSAkcmVxdWVzdDsKJHRoaXMtPmNvZGUgPSAoaW50KSAkY29kZTsKJHRoaXMtPmhlYWRlcnMgPSAkaGVhZGVyczsKJHRoaXMtPmJvZHkgPSAkYm9keTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXR1c0NvZGUoKTogaW50CnsKcmV0dXJuICR0aGlzLT5jb2RlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdHVzTWVzc2FnZSgpOiA/c3RyaW5nCnsKJHZhbHVlID0gbnVsbDsKZm9yZWFjaCAoJHRoaXMtPmhlYWRlcnMgYXMgJGhlYWRlcikgewppZiAoUHJlZzo6aXNNYXRjaCgne15IVFRQL1xTKyBcZCt9aScsICRoZWFkZXIpKSB7CgoKJHZhbHVlID0gJGhlYWRlcjsKfQp9CgpyZXR1cm4gJHZhbHVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVhZGVycygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+aGVhZGVyczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlcihzdHJpbmcgJG5hbWUpOiA/c3RyaW5nCnsKcmV0dXJuIHNlbGY6OmZpbmRIZWFkZXJWYWx1ZSgkdGhpcy0+aGVhZGVycywgJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Qm9keSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5ib2R5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVjb2RlSnNvbigpCnsKcmV0dXJuIEpzb25GaWxlOjpwYXJzZUpzb24oJHRoaXMtPmJvZHksICR0aGlzLT5yZXF1ZXN0Wyd1cmwnXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb2xsZWN0KCk6IHZvaWQKewp1bnNldCgkdGhpcy0+cmVxdWVzdCwgJHRoaXMtPmNvZGUsICR0aGlzLT5oZWFkZXJzLCAkdGhpcy0+Ym9keSk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbmRIZWFkZXJWYWx1ZShhcnJheSAkaGVhZGVycywgc3RyaW5nICRuYW1lKTogP3N0cmluZwp7CiR2YWx1ZSA9IG51bGw7CmZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teJy5wcmVnX3F1b3RlKCRuYW1lKS4nOlxzKiguKz8pXHMqJH1pJywgJGhlYWRlciwgJG1hdGNoKSkgewokdmFsdWUgPSAkbWF0Y2hbMV07Cn0KfQoKcmV0dXJuICR2YWx1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUmVzcG9uc2U7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcQ3VybERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXEV4Y2VwdGlvblxJcnJlY292ZXJhYmxlRG93bmxvYWRFeGNlcHRpb247CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2U7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIEh0dHBEb3dubG9hZGVyCnsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfUVVFVUVEID0gMTsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfU1RBUlRFRCA9IDI7CnByaXZhdGUgY29uc3QgU1RBVFVTX0NPTVBMRVRFRCA9IDM7CnByaXZhdGUgY29uc3QgU1RBVFVTX0ZBSUxFRCA9IDQ7CnByaXZhdGUgY29uc3QgU1RBVFVTX0FCT1JURUQgPSA1OwoKCnByaXZhdGUgJGlvOwoKcHJpdmF0ZSAkY29uZmlnOwoKcHJpdmF0ZSAkam9icyA9IFtdOwoKcHJpdmF0ZSAkb3B0aW9ucyA9IFtdOwoKcHJpdmF0ZSAkcnVubmluZ0pvYnMgPSAwOwoKcHJpdmF0ZSAkbWF4Sm9icyA9IDEyOwoKcHJpdmF0ZSAkY3VybDsKCnByaXZhdGUgJHJmczsKCnByaXZhdGUgJGlkR2VuID0gMDsKCnByaXZhdGUgJGRpc2FibGVkOwoKcHJpdmF0ZSAkYWxsb3dBc3luYyA9IGZhbHNlOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgYXJyYXkgJG9wdGlvbnMgPSBbXSwgYm9vbCAkZGlzYWJsZVRscyA9IGZhbHNlKQp7CiR0aGlzLT5pbyA9ICRpbzsKCiR0aGlzLT5kaXNhYmxlZCA9IChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKTsKCgoKaWYgKCRkaXNhYmxlVGxzID09PSBmYWxzZSkgewokdGhpcy0+b3B0aW9ucyA9IFN0cmVhbUNvbnRleHRGYWN0b3J5OjpnZXRUbHNEZWZhdWx0cygkb3B0aW9ucywgJGlvKTsKfQoKCiR0aGlzLT5vcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJHRoaXMtPm9wdGlvbnMsICRvcHRpb25zKTsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CgppZiAoc2VsZjo6aXNDdXJsRW5hYmxlZCgpKSB7CiR0aGlzLT5jdXJsID0gbmV3IEN1cmxEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJG9wdGlvbnMsICRkaXNhYmxlVGxzKTsKfQoKJHRoaXMtPnJmcyA9IG5ldyBSZW1vdGVGaWxlc3lzdGVtKCRpbywgJGNvbmZpZywgJG9wdGlvbnMsICRkaXNhYmxlVGxzKTsKCmlmIChpc19udW1lcmljKCRtYXhKb2JzID0gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfTUFYX1BBUkFMTEVMX0hUVFAnKSkpIHsKJHRoaXMtPm1heEpvYnMgPSBtYXgoMSwgbWluKDUwLCAoaW50KSAkbWF4Sm9icykpOwp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICR1cmwsIGFycmF5ICRvcHRpb25zID0gW10pCnsKaWYgKCcnID09PSAkdXJsKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckdXJsIG11c3Qgbm90IGJlIGFuIGVtcHR5IHN0cmluZycpOwp9Clskam9iLCAkcHJvbWlzZV0gPSAkdGhpcy0+YWRkSm9iKFsndXJsJyA9PiAkdXJsLCAnb3B0aW9ucycgPT4gJG9wdGlvbnMsICdjb3B5VG8nID0+IG51bGxdLCB0cnVlKTsKJHByb21pc2UtPnRoZW4obnVsbCwgZnVuY3Rpb24gKFxUaHJvd2FibGUgJGUpIHsKCn0pOwokdGhpcy0+d2FpdCgkam9iWydpZCddKTsKCiRyZXNwb25zZSA9ICR0aGlzLT5nZXRSZXNwb25zZSgkam9iWydpZCddKTsKCnJldHVybiAkcmVzcG9uc2U7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkKHN0cmluZyAkdXJsLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgnJyA9PT0gJHVybCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJHVybCBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTsKfQpbLCAkcHJvbWlzZV0gPSAkdGhpcy0+YWRkSm9iKFsndXJsJyA9PiAkdXJsLCAnb3B0aW9ucycgPT4gJG9wdGlvbnMsICdjb3B5VG8nID0+IG51bGxdKTsKCnJldHVybiAkcHJvbWlzZTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3B5KHN0cmluZyAkdXJsLCBzdHJpbmcgJHRvLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgnJyA9PT0gJHVybCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJHVybCBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTsKfQpbJGpvYl0gPSAkdGhpcy0+YWRkSm9iKFsndXJsJyA9PiAkdXJsLCAnb3B0aW9ucycgPT4gJG9wdGlvbnMsICdjb3B5VG8nID0+ICR0b10sIHRydWUpOwokdGhpcy0+d2FpdCgkam9iWydpZCddKTsKCnJldHVybiAkdGhpcy0+Z2V0UmVzcG9uc2UoJGpvYlsnaWQnXSk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENvcHkoc3RyaW5nICR1cmwsIHN0cmluZyAkdG8sIGFycmF5ICRvcHRpb25zID0gW10pCnsKaWYgKCcnID09PSAkdXJsKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckdXJsIG11c3Qgbm90IGJlIGFuIGVtcHR5IHN0cmluZycpOwp9ClssICRwcm9taXNlXSA9ICR0aGlzLT5hZGRKb2IoWyd1cmwnID0+ICR1cmwsICdvcHRpb25zJyA9PiAkb3B0aW9ucywgJ2NvcHlUbycgPT4gJHRvXSk7CgpyZXR1cm4gJHByb21pc2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbnMoKQp7CnJldHVybiAkdGhpcy0+b3B0aW9uczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpCnsKJHRoaXMtPm9wdGlvbnMgPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkdGhpcy0+b3B0aW9ucywgJG9wdGlvbnMpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkSm9iKGFycmF5ICRyZXF1ZXN0LCBib29sICRzeW5jID0gZmFsc2UpOiBhcnJheQp7CiRyZXF1ZXN0WydvcHRpb25zJ10gPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkdGhpcy0+b3B0aW9ucywgJHJlcXVlc3RbJ29wdGlvbnMnXSk7CgoKJGpvYiA9IFsKJ2lkJyA9PiAkdGhpcy0+aWRHZW4rKywKJ3N0YXR1cycgPT4gc2VsZjo6U1RBVFVTX1FVRVVFRCwKJ3JlcXVlc3QnID0+ICRyZXF1ZXN0LAonc3luYycgPT4gJHN5bmMsCidvcmlnaW4nID0+IFVybDo6Z2V0T3JpZ2luKCR0aGlzLT5jb25maWcsICRyZXF1ZXN0Wyd1cmwnXSksCl07CgppZiAoISRzeW5jICYmICEkdGhpcy0+YWxsb3dBc3luYykgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdZb3UgbXVzdCB1c2UgdGhlIEh0dHBEb3dubG9hZGVyIGluc3RhbmNlIHdoaWNoIGlzIHBhcnQgb2YgYSBDb21wb3NlclxMb29wIGluc3RhbmNlIHRvIGJlIGFibGUgdG8gcnVuIGFzeW5jIGh0dHAgcmVxdWVzdHMnKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xmh0dHBzPzovLyhbXjovXSspOihbXkAvXSspQChbXi9dKyl9aScsICRyZXF1ZXN0Wyd1cmwnXSwgJG1hdGNoKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRqb2JbJ29yaWdpbiddLCByYXd1cmxkZWNvZGUoJG1hdGNoWzFdKSwgcmF3dXJsZGVjb2RlKCRtYXRjaFsyXSkpOwp9CgokcmZzID0gJHRoaXMtPnJmczsKCmlmICgkdGhpcy0+Y2FuVXNlQ3VybCgkam9iKSkgewokcmVzb2x2ZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCRyZXNvbHZlLCAkcmVqZWN0KSB1c2UgKCYkam9iKTogdm9pZCB7CiRqb2JbJ3N0YXR1cyddID0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19RVUVVRUQ7CiRqb2JbJ3Jlc29sdmUnXSA9ICRyZXNvbHZlOwokam9iWydyZWplY3QnXSA9ICRyZWplY3Q7Cn07Cn0gZWxzZSB7CiRyZXNvbHZlciA9IHN0YXRpYyBmdW5jdGlvbiAoJHJlc29sdmUsICRyZWplY3QpIHVzZSAoJiRqb2IsICRyZnMpOiB2b2lkIHsKCiR1cmwgPSAkam9iWydyZXF1ZXN0J11bJ3VybCddOwokb3B0aW9ucyA9ICRqb2JbJ3JlcXVlc3QnXVsnb3B0aW9ucyddOwoKJGpvYlsnc3RhdHVzJ10gPSBIdHRwRG93bmxvYWRlcjo6U1RBVFVTX1NUQVJURUQ7CgppZiAoJGpvYlsncmVxdWVzdCddWydjb3B5VG8nXSkgewokcmZzLT5jb3B5KCRqb2JbJ29yaWdpbiddLCAkdXJsLCAkam9iWydyZXF1ZXN0J11bJ2NvcHlUbyddLCBmYWxzZSAsICRvcHRpb25zKTsKCiRoZWFkZXJzID0gJHJmcy0+Z2V0TGFzdEhlYWRlcnMoKTsKJHJlc3BvbnNlID0gbmV3IEh0dHBcUmVzcG9uc2UoJGpvYlsncmVxdWVzdCddLCAkcmZzLT5maW5kU3RhdHVzQ29kZSgkaGVhZGVycyksICRoZWFkZXJzLCAkam9iWydyZXF1ZXN0J11bJ2NvcHlUbyddLid+Jyk7CgokcmVzb2x2ZSgkcmVzcG9uc2UpOwp9IGVsc2UgewokYm9keSA9ICRyZnMtPmdldENvbnRlbnRzKCRqb2JbJ29yaWdpbiddLCAkdXJsLCBmYWxzZSAsICRvcHRpb25zKTsKJGhlYWRlcnMgPSAkcmZzLT5nZXRMYXN0SGVhZGVycygpOwokcmVzcG9uc2UgPSBuZXcgSHR0cFxSZXNwb25zZSgkam9iWydyZXF1ZXN0J10sICRyZnMtPmZpbmRTdGF0dXNDb2RlKCRoZWFkZXJzKSwgJGhlYWRlcnMsICRib2R5KTsKCiRyZXNvbHZlKCRyZXNwb25zZSk7Cn0KfTsKfQoKJGN1cmwgPSAkdGhpcy0+Y3VybDsKCiRjYW5jZWxlciA9IHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCYkam9iLCAkY3VybCk6IHZvaWQgewppZiAoJGpvYlsnc3RhdHVzJ10gPT09IEh0dHBEb3dubG9hZGVyOjpTVEFUVVNfUVVFVUVEKSB7CiRqb2JbJ3N0YXR1cyddID0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19BQk9SVEVEOwp9CmlmICgkam9iWydzdGF0dXMnXSAhPT0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19TVEFSVEVEKSB7CnJldHVybjsKfQokam9iWydzdGF0dXMnXSA9IEh0dHBEb3dubG9hZGVyOjpTVEFUVVNfQUJPUlRFRDsKaWYgKGlzc2V0KCRqb2JbJ2N1cmxfaWQnXSkpIHsKJGN1cmwtPmFib3J0UmVxdWVzdCgkam9iWydjdXJsX2lkJ10pOwp9CnRocm93IG5ldyBJcnJlY292ZXJhYmxlRG93bmxvYWRFeGNlcHRpb24oJ0Rvd25sb2FkIG9mICcgLiBVcmw6OnNhbml0aXplKCRqb2JbJ3JlcXVlc3QnXVsndXJsJ10pIC4gJyBjYW5jZWxlZCcpOwp9OwoKJHByb21pc2UgPSBuZXcgUHJvbWlzZSgkcmVzb2x2ZXIsICRjYW5jZWxlcik7CiRwcm9taXNlID0gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKCRyZXNwb25zZSkgdXNlICgmJGpvYikgewokam9iWydzdGF0dXMnXSA9IEh0dHBEb3dubG9hZGVyOjpTVEFUVVNfQ09NUExFVEVEOwokam9iWydyZXNwb25zZSddID0gJHJlc3BvbnNlOwoKJHRoaXMtPm1hcmtKb2JEb25lKCk7CgpyZXR1cm4gJHJlc3BvbnNlOwp9LCBmdW5jdGlvbiAoJGUpIHVzZSAoJiRqb2IpOiB2b2lkIHsKJGpvYlsnc3RhdHVzJ10gPSBIdHRwRG93bmxvYWRlcjo6U1RBVFVTX0ZBSUxFRDsKJGpvYlsnZXhjZXB0aW9uJ10gPSAkZTsKCiR0aGlzLT5tYXJrSm9iRG9uZSgpOwoKdGhyb3cgJGU7Cn0pOwokdGhpcy0+am9ic1skam9iWydpZCddXSA9ICYkam9iOwoKaWYgKCR0aGlzLT5ydW5uaW5nSm9icyA8ICR0aGlzLT5tYXhKb2JzKSB7CiR0aGlzLT5zdGFydEpvYigkam9iWydpZCddKTsKfQoKcmV0dXJuIFskam9iLCAkcHJvbWlzZV07Cn0KCnByaXZhdGUgZnVuY3Rpb24gc3RhcnRKb2IoaW50ICRpZCk6IHZvaWQKewokam9iID0gJiR0aGlzLT5qb2JzWyRpZF07CmlmICgkam9iWydzdGF0dXMnXSAhPT0gc2VsZjo6U1RBVFVTX1FVRVVFRCkgewpyZXR1cm47Cn0KCgokam9iWydzdGF0dXMnXSA9IHNlbGY6OlNUQVRVU19TVEFSVEVEOwokdGhpcy0+cnVubmluZ0pvYnMrKzsKCmFzc2VydChpc3NldCgkam9iWydyZXNvbHZlJ10pKTsKYXNzZXJ0KGlzc2V0KCRqb2JbJ3JlamVjdCddKSk7CgokcmVzb2x2ZSA9ICRqb2JbJ3Jlc29sdmUnXTsKJHJlamVjdCA9ICRqb2JbJ3JlamVjdCddOwokdXJsID0gJGpvYlsncmVxdWVzdCddWyd1cmwnXTsKJG9wdGlvbnMgPSAkam9iWydyZXF1ZXN0J11bJ29wdGlvbnMnXTsKJG9yaWdpbiA9ICRqb2JbJ29yaWdpbiddOwoKaWYgKCR0aGlzLT5kaXNhYmxlZCkgewppZiAoaXNzZXQoJGpvYlsncmVxdWVzdCddWydvcHRpb25zJ11bJ2h0dHAnXVsnaGVhZGVyJ10pICYmIGZhbHNlICE9PSBzdHJpcG9zKGltcGxvZGUoJycsICRqb2JbJ3JlcXVlc3QnXVsnb3B0aW9ucyddWydodHRwJ11bJ2hlYWRlciddKSwgJ2lmLW1vZGlmaWVkLXNpbmNlJykpIHsKJHJlc29sdmUobmV3IFJlc3BvbnNlKFsndXJsJyA9PiAkdXJsXSwgMzA0LCBbXSwgJycpKTsKfSBlbHNlIHsKJGUgPSBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdOZXR3b3JrIGRpc2FibGVkLCByZXF1ZXN0IGNhbmNlbGVkOiAnLlVybDo6c2FuaXRpemUoJHVybCksIDQ5OSk7CiRlLT5zZXRTdGF0dXNDb2RlKDQ5OSk7CiRyZWplY3QoJGUpOwp9CgpyZXR1cm47Cn0KCnRyeSB7CmlmICgkam9iWydyZXF1ZXN0J11bJ2NvcHlUbyddKSB7CiRqb2JbJ2N1cmxfaWQnXSA9ICR0aGlzLT5jdXJsLT5kb3dubG9hZCgkcmVzb2x2ZSwgJHJlamVjdCwgJG9yaWdpbiwgJHVybCwgJG9wdGlvbnMsICRqb2JbJ3JlcXVlc3QnXVsnY29weVRvJ10pOwp9IGVsc2Ugewokam9iWydjdXJsX2lkJ10gPSAkdGhpcy0+Y3VybC0+ZG93bmxvYWQoJHJlc29sdmUsICRyZWplY3QsICRvcmlnaW4sICR1cmwsICRvcHRpb25zKTsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRleGNlcHRpb24pIHsKJHJlamVjdCgkZXhjZXB0aW9uKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIG1hcmtKb2JEb25lKCk6IHZvaWQKewokdGhpcy0+cnVubmluZ0pvYnMtLTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YWl0KD9pbnQgJGluZGV4ID0gbnVsbCkKewpkbyB7CiRqb2JDb3VudCA9ICR0aGlzLT5jb3VudEFjdGl2ZUpvYnMoJGluZGV4KTsKfSB3aGlsZSAoJGpvYkNvdW50KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVuYWJsZUFzeW5jKCk6IHZvaWQKewokdGhpcy0+YWxsb3dBc3luYyA9IHRydWU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudEFjdGl2ZUpvYnMoP2ludCAkaW5kZXggPSBudWxsKTogaW50CnsKaWYgKCR0aGlzLT5ydW5uaW5nSm9icyA8ICR0aGlzLT5tYXhKb2JzKSB7CmZvcmVhY2ggKCR0aGlzLT5qb2JzIGFzICRqb2IpIHsKaWYgKCRqb2JbJ3N0YXR1cyddID09PSBzZWxmOjpTVEFUVVNfUVVFVUVEICYmICR0aGlzLT5ydW5uaW5nSm9icyA8ICR0aGlzLT5tYXhKb2JzKSB7CiR0aGlzLT5zdGFydEpvYigkam9iWydpZCddKTsKfQp9Cn0KCmlmICgkdGhpcy0+Y3VybCkgewokdGhpcy0+Y3VybC0+dGljaygpOwp9CgppZiAobnVsbCAhPT0gJGluZGV4KSB7CnJldHVybiAkdGhpcy0+am9ic1skaW5kZXhdWydzdGF0dXMnXSA8IHNlbGY6OlNUQVRVU19DT01QTEVURUQgPyAxIDogMDsKfQoKJGFjdGl2ZSA9IDA7CmZvcmVhY2ggKCR0aGlzLT5qb2JzIGFzICRqb2IpIHsKaWYgKCRqb2JbJ3N0YXR1cyddIDwgc2VsZjo6U1RBVFVTX0NPTVBMRVRFRCkgewokYWN0aXZlKys7Cn0gZWxzZWlmICghJGpvYlsnc3luYyddKSB7CnVuc2V0KCR0aGlzLT5qb2JzWyRqb2JbJ2lkJ11dKTsKfQp9CgpyZXR1cm4gJGFjdGl2ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSZXNwb25zZShpbnQgJGluZGV4KTogUmVzcG9uc2UKewppZiAoIWlzc2V0KCR0aGlzLT5qb2JzWyRpbmRleF0pKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0ludmFsaWQgcmVxdWVzdCBpZCcpOwp9CgppZiAoJHRoaXMtPmpvYnNbJGluZGV4XVsnc3RhdHVzJ10gPT09IHNlbGY6OlNUQVRVU19GQUlMRUQpIHsKYXNzZXJ0KGlzc2V0KCR0aGlzLT5qb2JzWyRpbmRleF1bJ2V4Y2VwdGlvbiddKSk7CnRocm93ICR0aGlzLT5qb2JzWyRpbmRleF1bJ2V4Y2VwdGlvbiddOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5qb2JzWyRpbmRleF1bJ3Jlc3BvbnNlJ10pKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1Jlc3BvbnNlIG5vdCBhdmFpbGFibGUgeWV0LCBjYWxsIHdhaXQoKSBmaXJzdCcpOwp9CgokcmVzcCA9ICR0aGlzLT5qb2JzWyRpbmRleF1bJ3Jlc3BvbnNlJ107Cgp1bnNldCgkdGhpcy0+am9ic1skaW5kZXhdKTsKCnJldHVybiAkcmVzcDsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG91dHB1dFdhcm5pbmdzKElPSW50ZXJmYWNlICRpbywgc3RyaW5nICR1cmwsICRkYXRhKTogdm9pZAp7CiRjbGVhbk1lc3NhZ2UgPSBzdGF0aWMgZnVuY3Rpb24gKCRtc2cpIHVzZSAoJGlvKSB7CmlmICghJGlvLT5pc0RlY29yYXRlZCgpKSB7CiRtc2cgPSBQcmVnOjpyZXBsYWNlKCd7Jy5jaHIoMjcpLidcXFtbO1xkXSptfXUnLCAnJywgJG1zZyk7Cn0KCnJldHVybiAkbXNnOwp9OwoKCmZvcmVhY2ggKFsnd2FybmluZycsICdpbmZvJ10gYXMgJHR5cGUpIHsKaWYgKGVtcHR5KCRkYXRhWyR0eXBlXSkpIHsKY29udGludWU7Cn0KCmlmICghZW1wdHkoJGRhdGFbJHR5cGUgLiAnLXZlcnNpb25zJ10pKSB7CiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJGNvbnN0cmFpbnQgPSAkdmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkZGF0YVskdHlwZSAuICctdmVyc2lvbnMnXSk7CiRjb21wb3NlciA9IG5ldyBDb25zdHJhaW50KCc9PScsICR2ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoQ29tcG9zZXI6OmdldFZlcnNpb24oKSkpOwppZiAoISRjb25zdHJhaW50LT5tYXRjaGVzKCRjb21wb3NlcikpIHsKY29udGludWU7Cn0KfQoKJGlvLT53cml0ZUVycm9yKCc8Jy4kdHlwZS4nPicudWNmaXJzdCgkdHlwZSkuJyBmcm9tICcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nOiAnLiRjbGVhbk1lc3NhZ2UoJGRhdGFbJHR5cGVdKS4nPC8nLiR0eXBlLic+Jyk7Cn0KCgpmb3JlYWNoIChbJ3dhcm5pbmdzJywgJ2luZm9zJ10gYXMgJGtleSkgewppZiAoZW1wdHkoJGRhdGFbJGtleV0pKSB7CmNvbnRpbnVlOwp9CgokdmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CmZvcmVhY2ggKCRkYXRhWyRrZXldIGFzICRzcGVjKSB7CiR0eXBlID0gc3Vic3RyKCRrZXksIDAsIC0xKTsKJGNvbnN0cmFpbnQgPSAkdmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkc3BlY1sndmVyc2lvbnMnXSk7CiRjb21wb3NlciA9IG5ldyBDb25zdHJhaW50KCc9PScsICR2ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoQ29tcG9zZXI6OmdldFZlcnNpb24oKSkpOwppZiAoISRjb25zdHJhaW50LT5tYXRjaGVzKCRjb21wb3NlcikpIHsKY29udGludWU7Cn0KCiRpby0+d3JpdGVFcnJvcignPCcuJHR5cGUuJz4nLnVjZmlyc3QoJHR5cGUpLicgZnJvbSAnLlVybDo6c2FuaXRpemUoJHVybCkuJzogJy4kY2xlYW5NZXNzYWdlKCRzcGVjWydtZXNzYWdlJ10pLic8LycuJHR5cGUuJz4nKTsKfQp9Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRFeGNlcHRpb25IaW50cyhcVGhyb3dhYmxlICRlKTogP2FycmF5CnsKaWYgKCEkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbikgewpyZXR1cm4gbnVsbDsKfQoKaWYgKApmYWxzZSAhPT0gc3RycG9zKCRlLT5nZXRNZXNzYWdlKCksICdSZXNvbHZpbmcgdGltZWQgb3V0JykKfHwgZmFsc2UgIT09IHN0cnBvcygkZS0+Z2V0TWVzc2FnZSgpLCAnQ291bGQgbm90IHJlc29sdmUgaG9zdCcpCikgewpTaWxlbmNlcjo6c3VwcHJlc3MoKTsKJHRlc3RDb25uZWN0aXZpdHkgPSBmaWxlX2dldF9jb250ZW50cygnaHR0cHM6Ly84LjguOC44JywgZmFsc2UsIHN0cmVhbV9jb250ZXh0X2NyZWF0ZShbCidzc2wnID0+IFsndmVyaWZ5X3BlZXInID0+IGZhbHNlXSwKJ2h0dHAnID0+IFsnZm9sbG93X2xvY2F0aW9uJyA9PiBmYWxzZSwgJ2lnbm9yZV9lcnJvcnMnID0+IHRydWVdLApdKSk7ClNpbGVuY2VyOjpyZXN0b3JlKCk7CmlmIChmYWxzZSAhPT0gJHRlc3RDb25uZWN0aXZpdHkpIHsKcmV0dXJuIFsKJzxlcnJvcj5UaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBwcm9iYWJseSBpbmRpY2F0ZXMgeW91IGhhdmUgbWlzY29uZmlndXJlZCBETlMgcmVzb2x2ZXIocyk8L2Vycm9yPicsCl07Cn0KCnJldHVybiBbCic8ZXJyb3I+VGhlIGZvbGxvd2luZyBleGNlcHRpb24gcHJvYmFibHkgaW5kaWNhdGVzIHlvdSBhcmUgb2ZmbGluZSBvciBoYXZlIG1pc2NvbmZpZ3VyZWQgRE5TIHJlc29sdmVyKHMpPC9lcnJvcj4nLApdOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjYW5Vc2VDdXJsKGFycmF5ICRqb2IpOiBib29sCnsKaWYgKCEkdGhpcy0+Y3VybCkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly99aScsICRqb2JbJ3JlcXVlc3QnXVsndXJsJ10pKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFlbXB0eSgkam9iWydyZXF1ZXN0J11bJ29wdGlvbnMnXVsnc3NsJ11bJ2FsbG93X3NlbGZfc2lnbmVkJ10pKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNDdXJsRW5hYmxlZCgpOiBib29sCnsKcmV0dXJuIFxleHRlbnNpb25fbG9hZGVkKCdjdXJsJykgJiYgXGZ1bmN0aW9uX2V4aXN0cygnY3VybF9tdWx0aV9leGVjJykgJiYgXGZ1bmN0aW9uX2V4aXN0cygnY3VybF9tdWx0aV9pbml0Jyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxYZGVidWdIYW5kbGVyXFhkZWJ1Z0hhbmRsZXI7CgoKCgoKCgoKY2xhc3MgSW5pSGVscGVyCnsKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEFsbCgpOiBhcnJheQp7CnJldHVybiBYZGVidWdIYW5kbGVyOjpnZXRBbGxJbmlGaWxlcygpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE1lc3NhZ2UoKTogc3RyaW5nCnsKJHBhdGhzID0gc2VsZjo6Z2V0QWxsKCk7CgppZiAoZW1wdHkoJHBhdGhzWzBdKSkgewphcnJheV9zaGlmdCgkcGF0aHMpOwp9CgokaW5pID0gYXJyYXlfc2hpZnQoJHBhdGhzKTsKCmlmIChlbXB0eSgkaW5pKSkgewpyZXR1cm4gJ0EgcGhwLmluaSBmaWxlIGRvZXMgbm90IGV4aXN0LiBZb3Ugd2lsbCBoYXZlIHRvIGNyZWF0ZSBvbmUuJzsKfQoKaWYgKCFlbXB0eSgkcGF0aHMpKSB7CnJldHVybiAnWW91ciBjb21tYW5kLWxpbmUgUEhQIGlzIHVzaW5nIG11bHRpcGxlIGluaSBmaWxlcy4gUnVuIGBwaHAgLS1pbmlgIHRvIHNob3cgdGhlbS4nOwp9CgpyZXR1cm4gJ1RoZSBwaHAuaW5pIHVzZWQgYnkgeW91ciBjb21tYW5kLWxpbmUgUEhQIGlzOiAnLiRpbmk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBSZWFjdFxQcm9taXNlXENhbmNlbGxhYmxlUHJvbWlzZUludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFByb2dyZXNzQmFyOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKCgoKY2xhc3MgTG9vcAp7Cgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCnByaXZhdGUgJHByb2Nlc3NFeGVjdXRvcjsKCnByaXZhdGUgJGN1cnJlbnRQcm9taXNlcyA9IFtdOwoKcHJpdmF0ZSAkd2FpdEluZGV4ID0gMDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3NFeGVjdXRvciA9IG51bGwpCnsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+aHR0cERvd25sb2FkZXItPmVuYWJsZUFzeW5jKCk7CgokdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yID0gJHByb2Nlc3NFeGVjdXRvcjsKaWYgKCR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpIHsKJHRoaXMtPnByb2Nlc3NFeGVjdXRvci0+ZW5hYmxlQXN5bmMoKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SHR0cERvd25sb2FkZXIoKTogSHR0cERvd25sb2FkZXIKewpyZXR1cm4gJHRoaXMtPmh0dHBEb3dubG9hZGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvY2Vzc0V4ZWN1dG9yKCk6ID9Qcm9jZXNzRXhlY3V0b3IKewpyZXR1cm4gJHRoaXMtPnByb2Nlc3NFeGVjdXRvcjsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YWl0KGFycmF5ICRwcm9taXNlcywgP1Byb2dyZXNzQmFyICRwcm9ncmVzcyA9IG51bGwpOiB2b2lkCnsKJHVuY2F1Z2h0ID0gbnVsbDsKClxSZWFjdFxQcm9taXNlXGFsbCgkcHJvbWlzZXMpLT50aGVuKApzdGF0aWMgZnVuY3Rpb24gKCk6IHZvaWQgewp9LApzdGF0aWMgZnVuY3Rpb24gKFxUaHJvd2FibGUgJGUpIHVzZSAoJiR1bmNhdWdodCk6IHZvaWQgewokdW5jYXVnaHQgPSAkZTsKfQopOwoKCgokd2FpdEluZGV4ID0gJHRoaXMtPndhaXRJbmRleCsrOwokdGhpcy0+Y3VycmVudFByb21pc2VzWyR3YWl0SW5kZXhdID0gJHByb21pc2VzOwoKaWYgKCRwcm9ncmVzcykgewokdG90YWxKb2JzID0gMDsKJHRvdGFsSm9icyArPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmNvdW50QWN0aXZlSm9icygpOwppZiAoJHRoaXMtPnByb2Nlc3NFeGVjdXRvcikgewokdG90YWxKb2JzICs9ICR0aGlzLT5wcm9jZXNzRXhlY3V0b3ItPmNvdW50QWN0aXZlSm9icygpOwp9CiRwcm9ncmVzcy0+c3RhcnQoJHRvdGFsSm9icyk7Cn0KCiRsYXN0VXBkYXRlID0gMDsKd2hpbGUgKHRydWUpIHsKJGFjdGl2ZUpvYnMgPSAwOwoKJGFjdGl2ZUpvYnMgKz0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5jb3VudEFjdGl2ZUpvYnMoKTsKaWYgKCR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpIHsKJGFjdGl2ZUpvYnMgKz0gJHRoaXMtPnByb2Nlc3NFeGVjdXRvci0+Y291bnRBY3RpdmVKb2JzKCk7Cn0KCmlmICgkcHJvZ3Jlc3MgJiYgbWljcm90aW1lKHRydWUpIC0gJGxhc3RVcGRhdGUgPiAwLjEpIHsKJGxhc3RVcGRhdGUgPSBtaWNyb3RpbWUodHJ1ZSk7CiRwcm9ncmVzcy0+c2V0UHJvZ3Jlc3MoJHByb2dyZXNzLT5nZXRNYXhTdGVwcygpIC0gJGFjdGl2ZUpvYnMpOwp9CgppZiAoISRhY3RpdmVKb2JzKSB7CmJyZWFrOwp9Cn0KCgppZiAoJHByb2dyZXNzKSB7CiRwcm9ncmVzcy0+ZmluaXNoKCk7Cn0KCnVuc2V0KCR0aGlzLT5jdXJyZW50UHJvbWlzZXNbJHdhaXRJbmRleF0pOwppZiAobnVsbCAhPT0gJHVuY2F1Z2h0KSB7CnRocm93ICR1bmNhdWdodDsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gYWJvcnRKb2JzKCk6IHZvaWQKewpmb3JlYWNoICgkdGhpcy0+Y3VycmVudFByb21pc2VzIGFzICRwcm9taXNlR3JvdXApIHsKZm9yZWFjaCAoJHByb21pc2VHcm91cCBhcyAkcHJvbWlzZSkgewoKXFJlYWN0XFByb21pc2VccmVzb2x2ZSgkcHJvbWlzZSktPmNhbmNlbCgpOwp9Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKQHRyaWdnZXJfZXJyb3IoJ0NvbXBvc2VyXFV0aWxcTWV0YWRhdGFNaW5pZmllciBpcyBkZXByZWNhdGVkLCB1c2UgQ29tcG9zZXJcTWV0YWRhdGFNaW5pZmllclxNZXRhZGF0YU1pbmlmaWVyIGZyb20gY29tcG9zZXIvbWV0YWRhdGEtbWluaWZpZXIgaW5zdGVhZC4nLCBFX1VTRVJfREVQUkVDQVRFRCk7CgoKCgpjbGFzcyBNZXRhZGF0YU1pbmlmaWVyIGV4dGVuZHMgXENvbXBvc2VyXE1ldGFkYXRhTWluaWZpZXJcTWV0YWRhdGFNaW5pZmllcgp7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2Ugc3RkQ2xhc3M7CgoKCgpjbGFzcyBOb1Byb3h5UGF0dGVybgp7CgoKCnByb3RlY3RlZCAkaG9zdE5hbWVzID0gW107CgoKCgpwcm90ZWN0ZWQgJHJ1bGVzID0gW107CgoKCgpwcm90ZWN0ZWQgJG5vcHJveHk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRwYXR0ZXJuKQp7CiR0aGlzLT5ob3N0TmFtZXMgPSBQcmVnOjpzcGxpdCgne1tccyxdK30nLCAkcGF0dGVybiwgLTEsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOwokdGhpcy0+bm9wcm94eSA9IGVtcHR5KCR0aGlzLT5ob3N0TmFtZXMpIHx8ICcqJyA9PT0gJHRoaXMtPmhvc3ROYW1lc1swXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHRlc3Qoc3RyaW5nICR1cmwpOiBib29sCnsKaWYgKCR0aGlzLT5ub3Byb3h5KSB7CnJldHVybiB0cnVlOwp9CgppZiAoISR1cmxEYXRhID0gJHRoaXMtPmdldFVybERhdGEoJHVybCkpIHsKcmV0dXJuIGZhbHNlOwp9Cgpmb3JlYWNoICgkdGhpcy0+aG9zdE5hbWVzIGFzICRpbmRleCA9PiAkaG9zdE5hbWUpIHsKaWYgKCR0aGlzLT5tYXRjaCgkaW5kZXgsICRob3N0TmFtZSwgJHVybERhdGEpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0VXJsRGF0YShzdHJpbmcgJHVybCkKewppZiAoISRob3N0ID0gcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfSE9TVCkpIHsKcmV0dXJuIGZhbHNlOwp9CgokcG9ydCA9IHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX1BPUlQpOwoKaWYgKGVtcHR5KCRwb3J0KSkgewpzd2l0Y2ggKHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX1NDSEVNRSkpIHsKY2FzZSAnaHR0cCc6CiRwb3J0ID0gODA7CmJyZWFrOwpjYXNlICdodHRwcyc6CiRwb3J0ID0gNDQzOwpicmVhazsKfQp9CgokaG9zdE5hbWUgPSAkaG9zdCAuICgkcG9ydCA/ICc6JyAuICRwb3J0IDogJycpOwpbJGhvc3QsICRwb3J0LCAkZXJyXSA9ICR0aGlzLT5zcGxpdEhvc3RQb3J0KCRob3N0TmFtZSk7CgppZiAoJGVyciB8fCAhJHRoaXMtPmlwQ2hlY2tEYXRhKCRob3N0LCAkaXBkYXRhKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiAkdGhpcy0+bWFrZURhdGEoJGhvc3QsICRwb3J0LCAkaXBkYXRhKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIG1hdGNoKGludCAkaW5kZXgsIHN0cmluZyAkaG9zdE5hbWUsIHN0ZENsYXNzICR1cmwpOiBib29sCnsKaWYgKCEkcnVsZSA9ICR0aGlzLT5nZXRSdWxlKCRpbmRleCwgJGhvc3ROYW1lKSkgewoKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHJ1bGUtPmlwZGF0YSkgewoKaWYgKCEkdXJsLT5pcGRhdGEpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHJ1bGUtPmlwZGF0YS0+bmV0bWFzaykgewpyZXR1cm4gJHRoaXMtPm1hdGNoUmFuZ2UoJHJ1bGUtPmlwZGF0YSwgJHVybC0+aXBkYXRhKTsKfQoKJG1hdGNoID0gJHJ1bGUtPmlwZGF0YS0+aXAgPT09ICR1cmwtPmlwZGF0YS0+aXA7Cn0gZWxzZSB7CgokaGF5c3RhY2sgPSBzdWJzdHIoJHVybC0+bmFtZSwgLXN0cmxlbigkcnVsZS0+bmFtZSkpOwokbWF0Y2ggPSBzdHJpcG9zKCRoYXlzdGFjaywgJHJ1bGUtPm5hbWUpID09PSAwOwp9CgppZiAoJG1hdGNoICYmICRydWxlLT5wb3J0KSB7CiRtYXRjaCA9ICRydWxlLT5wb3J0ID09PSAkdXJsLT5wb3J0Owp9CgpyZXR1cm4gJG1hdGNoOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbWF0Y2hSYW5nZShzdGRDbGFzcyAkbmV0d29yaywgc3RkQ2xhc3MgJHRhcmdldCk6IGJvb2wKewokbmV0ID0gdW5wYWNrKCdDKicsICRuZXR3b3JrLT5pcCk7CiRtYXNrID0gdW5wYWNrKCdDKicsICRuZXR3b3JrLT5uZXRtYXNrKTsKJGlwID0gdW5wYWNrKCdDKicsICR0YXJnZXQtPmlwKTsKaWYgKGZhbHNlID09PSAkbmV0KSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHBhcnNlIG5ldHdvcmsgSVAgJy4kbmV0d29yay0+aXApOwp9CmlmIChmYWxzZSA9PT0gJG1hc2spIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcGFyc2UgbmV0bWFzayAnLiRuZXR3b3JrLT5uZXRtYXNrKTsKfQppZiAoZmFsc2UgPT09ICRpcCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBwYXJzZSB0YXJnZXQgSVAgJy4kdGFyZ2V0LT5pcCk7Cn0KCmZvciAoJGkgPSAxOyAkaSA8IDE3OyArKyRpKSB7CmlmICgoJG5ldFskaV0gJiAkbWFza1skaV0pICE9PSAoJGlwWyRpXSAmICRtYXNrWyRpXSkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UnVsZShpbnQgJGluZGV4LCBzdHJpbmcgJGhvc3ROYW1lKTogP3N0ZENsYXNzCnsKaWYgKGFycmF5X2tleV9leGlzdHMoJGluZGV4LCAkdGhpcy0+cnVsZXMpKSB7CnJldHVybiAkdGhpcy0+cnVsZXNbJGluZGV4XTsKfQoKJHRoaXMtPnJ1bGVzWyRpbmRleF0gPSBudWxsOwpbJGhvc3QsICRwb3J0LCAkZXJyXSA9ICR0aGlzLT5zcGxpdEhvc3RQb3J0KCRob3N0TmFtZSk7CgppZiAoJGVyciB8fCAhJHRoaXMtPmlwQ2hlY2tEYXRhKCRob3N0LCAkaXBkYXRhLCB0cnVlKSkgewpyZXR1cm4gbnVsbDsKfQoKJHRoaXMtPnJ1bGVzWyRpbmRleF0gPSAkdGhpcy0+bWFrZURhdGEoJGhvc3QsICRwb3J0LCAkaXBkYXRhKTsKCnJldHVybiAkdGhpcy0+cnVsZXNbJGluZGV4XTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlwQ2hlY2tEYXRhKHN0cmluZyAkaG9zdCwgP3N0ZENsYXNzICYkaXBkYXRhLCBib29sICRhbGxvd1ByZWZpeCA9IGZhbHNlKTogYm9vbAp7CiRpcGRhdGEgPSBudWxsOwokbmV0bWFzayA9IG51bGw7CiRwcmVmaXggPSBudWxsOwokbW9kaWZpZWQgPSBmYWxzZTsKCgppZiAoc3RycG9zKCRob3N0LCAnLycpICE9PSBmYWxzZSkgewpbJGhvc3QsICRwcmVmaXhdID0gZXhwbG9kZSgnLycsICRob3N0KTsKCmlmICghJGFsbG93UHJlZml4IHx8ICEkdGhpcy0+dmFsaWRhdGVJbnQoJHByZWZpeCwgMCwgMTI4KSkgewpyZXR1cm4gZmFsc2U7Cn0KJHByZWZpeCA9IChpbnQpICRwcmVmaXg7CiRtb2RpZmllZCA9IHRydWU7Cn0KCgppZiAoIWZpbHRlcl92YXIoJGhvc3QsIEZJTFRFUl9WQUxJREFURV9JUCkpIHsKcmV0dXJuICEkbW9kaWZpZWQ7Cn0KClskaXAsICRzaXplXSA9ICR0aGlzLT5pcEdldEFkZHIoJGhvc3QpOwoKaWYgKCRwcmVmaXggIT09IG51bGwpIHsKCmlmICgkcHJlZml4ID4gJHNpemUgKiA4KSB7CnJldHVybiBmYWxzZTsKfQoKWyRpcCwgJG5ldG1hc2tdID0gJHRoaXMtPmlwR2V0TmV0d29yaygkaXAsICRzaXplLCAkcHJlZml4KTsKfQoKJGlwZGF0YSA9ICR0aGlzLT5tYWtlSXBEYXRhKCRpcCwgJHNpemUsICRuZXRtYXNrKTsKCnJldHVybiB0cnVlOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXBHZXRBZGRyKHN0cmluZyAkaG9zdCk6IGFycmF5CnsKJGlwID0gaW5ldF9wdG9uKCRob3N0KTsKJHNpemUgPSBzdHJsZW4oJGlwKTsKJG1hcHBlZCA9ICR0aGlzLT5pcE1hcFRvNigkaXAsICRzaXplKTsKCnJldHVybiBbJG1hcHBlZCwgJHNpemVdOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlwR2V0TWFzayhpbnQgJHByZWZpeCwgaW50ICRzaXplKTogc3RyaW5nCnsKJG1hc2sgPSAnJzsKCmlmICgkb25lcyA9IGZsb29yKCRwcmVmaXggLyA4KSkgewokbWFzayA9IHN0cl9yZXBlYXQoY2hyKDI1NSksIChpbnQpICRvbmVzKTsKfQoKaWYgKCRyZW1haW5kZXIgPSAkcHJlZml4ICUgOCkgewokbWFzayAuPSBjaHIoMHhmZiBeICgweGZmID4+ICRyZW1haW5kZXIpKTsKfQoKJG1hc2sgPSBzdHJfcGFkKCRtYXNrLCAkc2l6ZSwgY2hyKDApKTsKCnJldHVybiAkdGhpcy0+aXBNYXBUbzYoJG1hc2ssICRzaXplKTsKfQoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpcEdldE5ldHdvcmsoc3RyaW5nICRyYW5nZUlwLCBpbnQgJHNpemUsIGludCAkcHJlZml4KTogYXJyYXkKewokbmV0bWFzayA9ICR0aGlzLT5pcEdldE1hc2soJHByZWZpeCwgJHNpemUpOwoKCiRtYXNrID0gdW5wYWNrKCdDKicsICRuZXRtYXNrKTsKJGlwID0gdW5wYWNrKCdDKicsICRyYW5nZUlwKTsKJG5ldCA9ICcnOwppZiAoZmFsc2UgPT09ICRtYXNrKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHBhcnNlIG5ldG1hc2sgJy4kbmV0bWFzayk7Cn0KaWYgKGZhbHNlID09PSAkaXApIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcGFyc2UgcmFuZ2UgSVAgJy4kcmFuZ2VJcCk7Cn0KCmZvciAoJGkgPSAxOyAkaSA8IDE3OyArKyRpKSB7CiRuZXQgLj0gY2hyKCRpcFskaV0gJiAkbWFza1skaV0pOwp9CgpyZXR1cm4gWyRuZXQsICRuZXRtYXNrXTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlwTWFwVG82KHN0cmluZyAkYmluYXJ5LCBpbnQgJHNpemUpOiBzdHJpbmcKewppZiAoJHNpemUgPT09IDQpIHsKJHByZWZpeCA9IHN0cl9yZXBlYXQoY2hyKDApLCAxMCkgLiBzdHJfcmVwZWF0KGNocigyNTUpLCAyKTsKJGJpbmFyeSA9ICRwcmVmaXggLiAkYmluYXJ5Owp9CgpyZXR1cm4gJGJpbmFyeTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBtYWtlRGF0YShzdHJpbmcgJGhvc3QsIGludCAkcG9ydCwgP3N0ZENsYXNzICRpcGRhdGEpOiBzdGRDbGFzcwp7CnJldHVybiAob2JqZWN0KSBbCidob3N0JyA9PiAkaG9zdCwKJ25hbWUnID0+ICcuJyAuIGx0cmltKCRob3N0LCAnLicpLAoncG9ydCcgPT4gJHBvcnQsCidpcGRhdGEnID0+ICRpcGRhdGEsCl07Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1ha2VJcERhdGEoc3RyaW5nICRpcCwgaW50ICRzaXplLCA/c3RyaW5nICRuZXRtYXNrKTogc3RkQ2xhc3MKewpyZXR1cm4gKG9iamVjdCkgWwonaXAnID0+ICRpcCwKJ3NpemUnID0+ICRzaXplLAonbmV0bWFzaycgPT4gJG5ldG1hc2ssCl07Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzcGxpdEhvc3RQb3J0KHN0cmluZyAkaG9zdE5hbWUpOiBhcnJheQp7CgokZXJyb3IgPSBbJycsICcnLCB0cnVlXTsKJHBvcnQgPSAwOwokaXA2ID0gJyc7CgoKaWYgKCRob3N0TmFtZVswXSA9PT0gJ1snKSB7CiRpbmRleCA9IHN0cnBvcygkaG9zdE5hbWUsICddJyk7CgoKaWYgKGZhbHNlID09PSAkaW5kZXggfHwgJGluZGV4IDwgMykgewpyZXR1cm4gJGVycm9yOwp9CgokaXA2ID0gc3Vic3RyKCRob3N0TmFtZSwgMSwgJGluZGV4IC0gMSk7CiRob3N0TmFtZSA9IHN1YnN0cigkaG9zdE5hbWUsICRpbmRleCArIDEpOwoKaWYgKHN0cnBicmsoJGhvc3ROYW1lLCAnW10nKSAhPT0gZmFsc2UgfHwgc3Vic3RyX2NvdW50KCRob3N0TmFtZSwgJzonKSA+IDEpIHsKcmV0dXJuICRlcnJvcjsKfQp9CgppZiAoc3Vic3RyX2NvdW50KCRob3N0TmFtZSwgJzonKSA9PT0gMSkgewokaW5kZXggPSBzdHJwb3MoJGhvc3ROYW1lLCAnOicpOwokcG9ydCA9IHN1YnN0cigkaG9zdE5hbWUsICRpbmRleCArIDEpOwokaG9zdE5hbWUgPSBzdWJzdHIoJGhvc3ROYW1lLCAwLCAkaW5kZXgpOwoKaWYgKCEkdGhpcy0+dmFsaWRhdGVJbnQoJHBvcnQsIDEsIDY1NTM1KSkgewpyZXR1cm4gJGVycm9yOwp9CgokcG9ydCA9IChpbnQpICRwb3J0Owp9CgokaG9zdCA9ICRpcDYgLiAkaG9zdE5hbWU7CgpyZXR1cm4gWyRob3N0LCAkcG9ydCwgZmFsc2VdOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlSW50KHN0cmluZyAkaW50LCBpbnQgJG1pbiwgaW50ICRtYXgpOiBib29sCnsKJG9wdGlvbnMgPSBbCidvcHRpb25zJyA9PiBbCidtaW5fcmFuZ2UnID0+ICRtaW4sCidtYXhfcmFuZ2UnID0+ICRtYXgsCl0sCl07CgpyZXR1cm4gZmFsc2UgIT09IGZpbHRlcl92YXIoJGludCwgRklMVEVSX1ZBTElEQVRFX0lOVCwgJG9wdGlvbnMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgpjbGFzcyBQYWNrYWdlSW5mbwp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Vmlld1NvdXJjZVVybChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogP3N0cmluZwp7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiBpc3NldCgkcGFja2FnZS0+Z2V0U3VwcG9ydCgpWydzb3VyY2UnXSkgJiYgJycgIT09ICRwYWNrYWdlLT5nZXRTdXBwb3J0KClbJ3NvdXJjZSddKSB7CnJldHVybiAkcGFja2FnZS0+Z2V0U3VwcG9ydCgpWydzb3VyY2UnXTsKfQoKcmV0dXJuICRwYWNrYWdlLT5nZXRTb3VyY2VVcmwoKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWaWV3U291cmNlT3JIb21lcGFnZVVybChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogP3N0cmluZwp7CiR1cmwgPSBzZWxmOjpnZXRWaWV3U291cmNlVXJsKCRwYWNrYWdlKSA/PyAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgPyAkcGFja2FnZS0+Z2V0SG9tZXBhZ2UoKSA6IG51bGwpOwoKaWYgKCR1cmwgPT09ICcnKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJHVybDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CgpjbGFzcyBQYWNrYWdlU29ydGVyCnsKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRNb3N0Q3VycmVudFZlcnNpb24oYXJyYXkgJHBhY2thZ2VzKTogP1BhY2thZ2VJbnRlcmZhY2UKewppZiAoY291bnQoJHBhY2thZ2VzKSA9PT0gMCkgewpyZXR1cm4gbnVsbDsKfQoKJGhpZ2hlc3QgPSByZXNldCgkcGFja2FnZXMpOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJGNhbmRpZGF0ZSkgewppZiAoJGNhbmRpZGF0ZS0+aXNEZWZhdWx0QnJhbmNoKCkpIHsKcmV0dXJuICRjYW5kaWRhdGU7Cn0KCmlmICh2ZXJzaW9uX2NvbXBhcmUoJGhpZ2hlc3QtPmdldFZlcnNpb24oKSwgJGNhbmRpZGF0ZS0+Z2V0VmVyc2lvbigpLCAnPCcpKSB7CiRoaWdoZXN0ID0gJGNhbmRpZGF0ZTsKfQp9CgpyZXR1cm4gJGhpZ2hlc3Q7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNvcnRQYWNrYWdlc0FscGhhYmV0aWNhbGx5KGFycmF5ICRwYWNrYWdlcyk6IGFycmF5CnsKdXNvcnQoJHBhY2thZ2VzLCBzdGF0aWMgZnVuY3Rpb24gKFBhY2thZ2VJbnRlcmZhY2UgJGEsIFBhY2thZ2VJbnRlcmZhY2UgJGIpIHsKcmV0dXJuICRhLT5nZXROYW1lKCkgPD0+ICRiLT5nZXROYW1lKCk7Cn0pOwoKcmV0dXJuICRwYWNrYWdlczsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzb3J0UGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzLCBhcnJheSAkd2VpZ2h0cyA9IFtdKTogYXJyYXkKewokdXNhZ2VMaXN0ID0gW107Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJGxpbmtzID0gJHBhY2thZ2UtPmdldFJlcXVpcmVzKCk7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlSW50ZXJmYWNlKSB7CiRsaW5rcyA9IGFycmF5X21lcmdlKCRsaW5rcywgJHBhY2thZ2UtPmdldERldlJlcXVpcmVzKCkpOwp9CmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewokdGFyZ2V0ID0gJGxpbmstPmdldFRhcmdldCgpOwokdXNhZ2VMaXN0WyR0YXJnZXRdW10gPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9Cn0KJGNvbXB1dGluZyA9IFtdOwokY29tcHV0ZWQgPSBbXTsKJGNvbXB1dGVJbXBvcnRhbmNlID0gc3RhdGljIGZ1bmN0aW9uICgkbmFtZSkgdXNlICgmJGNvbXB1dGVJbXBvcnRhbmNlLCAmJGNvbXB1dGluZywgJiRjb21wdXRlZCwgJHVzYWdlTGlzdCwgJHdlaWdodHMpIHsKCmlmIChpc3NldCgkY29tcHV0ZWRbJG5hbWVdKSkgewpyZXR1cm4gJGNvbXB1dGVkWyRuYW1lXTsKfQoKCmlmIChpc3NldCgkY29tcHV0aW5nWyRuYW1lXSkpIHsKcmV0dXJuIDA7Cn0KCiRjb21wdXRpbmdbJG5hbWVdID0gdHJ1ZTsKJHdlaWdodCA9ICR3ZWlnaHRzWyRuYW1lXSA/PyAwOwoKaWYgKGlzc2V0KCR1c2FnZUxpc3RbJG5hbWVdKSkgewpmb3JlYWNoICgkdXNhZ2VMaXN0WyRuYW1lXSBhcyAkdXNlcikgewokd2VpZ2h0IC09IDEgLSAkY29tcHV0ZUltcG9ydGFuY2UoJHVzZXIpOwp9Cn0KCnVuc2V0KCRjb21wdXRpbmdbJG5hbWVdKTsKJGNvbXB1dGVkWyRuYW1lXSA9ICR3ZWlnaHQ7CgpyZXR1cm4gJHdlaWdodDsKfTsKCiR3ZWlnaHRlZFBhY2thZ2VzID0gW107Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJGluZGV4ID0+ICRwYWNrYWdlKSB7CiRuYW1lID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKJHdlaWdodCA9ICRjb21wdXRlSW1wb3J0YW5jZSgkbmFtZSk7CiR3ZWlnaHRlZFBhY2thZ2VzW10gPSBbJ25hbWUnID0+ICRuYW1lLCAnd2VpZ2h0JyA9PiAkd2VpZ2h0LCAnaW5kZXgnID0+ICRpbmRleF07Cn0KCnVzb3J0KCR3ZWlnaHRlZFBhY2thZ2VzLCBzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRhLCBhcnJheSAkYik6IGludCB7CmlmICgkYVsnd2VpZ2h0J10gIT09ICRiWyd3ZWlnaHQnXSkgewpyZXR1cm4gJGFbJ3dlaWdodCddIC0gJGJbJ3dlaWdodCddOwp9CgpyZXR1cm4gc3RybmF0Y2FzZWNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsKfSk7Cgokc29ydGVkUGFja2FnZXMgPSBbXTsKCmZvcmVhY2ggKCR3ZWlnaHRlZFBhY2thZ2VzIGFzICRwa2cpIHsKJHNvcnRlZFBhY2thZ2VzW10gPSAkcGFja2FnZXNbJHBrZ1snaW5kZXgnXV07Cn0KCnJldHVybiAkc29ydGVkUGFja2FnZXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhlY3V0YWJsZUZpbmRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKCgoKCgoKY2xhc3MgUGVyZm9yY2UKewoKcHJvdGVjdGVkICRwYXRoOwoKcHJvdGVjdGVkICRwNERlcG90OwoKcHJvdGVjdGVkICRwNENsaWVudDsKCnByb3RlY3RlZCAkcDRVc2VyOwoKcHJvdGVjdGVkICRwNFBhc3N3b3JkOwoKcHJvdGVjdGVkICRwNFBvcnQ7Cgpwcm90ZWN0ZWQgJHA0U3RyZWFtOwoKcHJvdGVjdGVkICRwNENsaWVudFNwZWM7Cgpwcm90ZWN0ZWQgJHA0RGVwb3RUeXBlOwoKcHJvdGVjdGVkICRwNEJyYW5jaDsKCnByb3RlY3RlZCAkcHJvY2VzczsKCnByb3RlY3RlZCAkdW5pcXVlUGVyZm9yY2VDbGllbnROYW1lOwoKcHJvdGVjdGVkICR3aW5kb3dzRmxhZzsKCnByb3RlY3RlZCAkY29tbWFuZFJlc3VsdDsKCgpwcm90ZWN0ZWQgJGlvOwoKCnByb3RlY3RlZCAkZmlsZXN5c3RlbTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcmVwb0NvbmZpZywgc3RyaW5nICRwb3J0LCBzdHJpbmcgJHBhdGgsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2VzcywgYm9vbCAkaXNXaW5kb3dzLCBJT0ludGVyZmFjZSAkaW8pCnsKJHRoaXMtPndpbmRvd3NGbGFnID0gJGlzV2luZG93czsKJHRoaXMtPnA0UG9ydCA9ICRwb3J0OwokdGhpcy0+aW5pdGlhbGl6ZVBhdGgoJHBhdGgpOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzOwokdGhpcy0+aW5pdGlhbGl6ZSgkcmVwb0NvbmZpZyk7CiR0aGlzLT5pbyA9ICRpbzsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoJHJlcG9Db25maWcsIHN0cmluZyAkcG9ydCwgc3RyaW5nICRwYXRoLCBQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MsIElPSW50ZXJmYWNlICRpbyk6IHNlbGYKewpyZXR1cm4gbmV3IFBlcmZvcmNlKCRyZXBvQ29uZmlnLCAkcG9ydCwgJHBhdGgsICRwcm9jZXNzLCBQbGF0Zm9ybTo6aXNXaW5kb3dzKCksICRpbyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2tTZXJ2ZXJFeGlzdHMoc3RyaW5nICR1cmwsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2Vzc0V4ZWN1dG9yKTogYm9vbAp7CnJldHVybiAwID09PSAkcHJvY2Vzc0V4ZWN1dG9yLT5leGVjdXRlKFsncDQnLCAnLXAnLCAkdXJsLCAnaW5mbycsICctcyddLCAkaWdub3JlZE91dHB1dCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCRyZXBvQ29uZmlnKTogdm9pZAp7CiR0aGlzLT51bmlxdWVQZXJmb3JjZUNsaWVudE5hbWUgPSAkdGhpcy0+Z2VuZXJhdGVVbmlxdWVQZXJmb3JjZUNsaWVudE5hbWUoKTsKaWYgKCEkcmVwb0NvbmZpZykgewpyZXR1cm47Cn0KaWYgKGlzc2V0KCRyZXBvQ29uZmlnWyd1bmlxdWVfcGVyZm9yY2VfY2xpZW50X25hbWUnXSkpIHsKJHRoaXMtPnVuaXF1ZVBlcmZvcmNlQ2xpZW50TmFtZSA9ICRyZXBvQ29uZmlnWyd1bmlxdWVfcGVyZm9yY2VfY2xpZW50X25hbWUnXTsKfQoKaWYgKGlzc2V0KCRyZXBvQ29uZmlnWydkZXBvdCddKSkgewokdGhpcy0+cDREZXBvdCA9ICRyZXBvQ29uZmlnWydkZXBvdCddOwp9CmlmIChpc3NldCgkcmVwb0NvbmZpZ1snYnJhbmNoJ10pKSB7CiR0aGlzLT5wNEJyYW5jaCA9ICRyZXBvQ29uZmlnWydicmFuY2gnXTsKfQppZiAoaXNzZXQoJHJlcG9Db25maWdbJ3A0dXNlciddKSkgewokdGhpcy0+cDRVc2VyID0gJHJlcG9Db25maWdbJ3A0dXNlciddOwp9IGVsc2UgewokdGhpcy0+cDRVc2VyID0gJHRoaXMtPmdldFA0dmFyaWFibGUoJ1A0VVNFUicpOwp9CmlmIChpc3NldCgkcmVwb0NvbmZpZ1sncDRwYXNzd29yZCddKSkgewokdGhpcy0+cDRQYXNzd29yZCA9ICRyZXBvQ29uZmlnWydwNHBhc3N3b3JkJ107Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemVEZXBvdEFuZEJyYW5jaCg/c3RyaW5nICRkZXBvdCwgP3N0cmluZyAkYnJhbmNoKTogdm9pZAp7CmlmIChpc3NldCgkZGVwb3QpKSB7CiR0aGlzLT5wNERlcG90ID0gJGRlcG90Owp9CmlmIChpc3NldCgkYnJhbmNoKSkgewokdGhpcy0+cDRCcmFuY2ggPSAkYnJhbmNoOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZW5lcmF0ZVVuaXF1ZVBlcmZvcmNlQ2xpZW50TmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gZ2V0aG9zdG5hbWUoKSAuICJfIiAuIHRpbWUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXBDbGllbnRTcGVjKCk6IHZvaWQKewokY2xpZW50ID0gJHRoaXMtPmdldENsaWVudCgpOwokdGFzayA9ICdjbGllbnQgLWQgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRjbGllbnQpOwokdXNlUDRDbGllbnQgPSBmYWxzZTsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJHRhc2ssICR1c2VQNENsaWVudCk7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRjbGllbnRTcGVjID0gJHRoaXMtPmdldFA0Q2xpZW50U3BlYygpOwokZmlsZVN5c3RlbSA9ICR0aGlzLT5nZXRGaWxlc3lzdGVtKCk7CiRmaWxlU3lzdGVtLT5yZW1vdmUoJGNsaWVudFNwZWMpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOiBpbnQKewokdGhpcy0+Y29tbWFuZFJlc3VsdCA9ICcnOwoKcmV0dXJuICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkdGhpcy0+Y29tbWFuZFJlc3VsdCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDbGllbnQoKTogc3RyaW5nCnsKaWYgKCFpc3NldCgkdGhpcy0+cDRDbGllbnQpKSB7CiRjbGVhblN0cmVhbU5hbWUgPSBzdHJfcmVwbGFjZShbJy8vJywgJy8nLCAnQCddLCBbJycsICdfJywgJyddLCAkdGhpcy0+Z2V0U3RyZWFtKCkpOwokdGhpcy0+cDRDbGllbnQgPSAnY29tcG9zZXJfcGVyZm9yY2VfJyAuICR0aGlzLT51bmlxdWVQZXJmb3JjZUNsaWVudE5hbWUgLiAnXycgLiAkY2xlYW5TdHJlYW1OYW1lOwp9CgpyZXR1cm4gJHRoaXMtPnA0Q2xpZW50Owp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGF0aCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnBhdGg7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplUGF0aChzdHJpbmcgJHBhdGgpOiB2b2lkCnsKJHRoaXMtPnBhdGggPSAkcGF0aDsKJGZzID0gJHRoaXMtPmdldEZpbGVzeXN0ZW0oKTsKJGZzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHBhdGgpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UG9ydCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnA0UG9ydDsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFN0cmVhbShzdHJpbmcgJHN0cmVhbSk6IHZvaWQKewokdGhpcy0+cDRTdHJlYW0gPSAkc3RyZWFtOwokaW5kZXggPSBzdHJycG9zKCRzdHJlYW0sICcvJyk7CgppZiAoJGluZGV4ID4gMikgewokdGhpcy0+cDREZXBvdFR5cGUgPSAnc3RyZWFtJzsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gaXNTdHJlYW0oKTogYm9vbAp7CnJldHVybiBpc19zdHJpbmcoJHRoaXMtPnA0RGVwb3RUeXBlKSAmJiAoc3RyY21wKCR0aGlzLT5wNERlcG90VHlwZSwgJ3N0cmVhbScpID09PSAwKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFN0cmVhbSgpOiBzdHJpbmcKewppZiAoIWlzc2V0KCR0aGlzLT5wNFN0cmVhbSkpIHsKaWYgKCR0aGlzLT5pc1N0cmVhbSgpKSB7CiR0aGlzLT5wNFN0cmVhbSA9ICcvLycgLiAkdGhpcy0+cDREZXBvdCAuICcvJyAuICR0aGlzLT5wNEJyYW5jaDsKfSBlbHNlIHsKJHRoaXMtPnA0U3RyZWFtID0gJy8vJyAuICR0aGlzLT5wNERlcG90Owp9Cn0KCnJldHVybiAkdGhpcy0+cDRTdHJlYW07Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHJlYW1XaXRob3V0TGFiZWwoc3RyaW5nICRzdHJlYW0pOiBzdHJpbmcKewokaW5kZXggPSBzdHJwb3MoJHN0cmVhbSwgJ0AnKTsKaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKcmV0dXJuICRzdHJlYW07Cn0KCnJldHVybiBzdWJzdHIoJHN0cmVhbSwgMCwgJGluZGV4KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFA0Q2xpZW50U3BlYygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnBhdGggLiAnLycgLiAkdGhpcy0+Z2V0Q2xpZW50KCkgLiAnLnA0LnNwZWMnOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlcigpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wNFVzZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRVc2VyKD9zdHJpbmcgJHVzZXIpOiB2b2lkCnsKJHRoaXMtPnA0VXNlciA9ICR1c2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcXVlcnlQNFVzZXIoKTogdm9pZAp7CiR0aGlzLT5nZXRVc2VyKCk7CmlmIChzdHJsZW4oKHN0cmluZykgJHRoaXMtPnA0VXNlcikgPiAwKSB7CnJldHVybjsKfQokdGhpcy0+cDRVc2VyID0gJHRoaXMtPmdldFA0dmFyaWFibGUoJ1A0VVNFUicpOwppZiAoc3RybGVuKChzdHJpbmcpICR0aGlzLT5wNFVzZXIpID4gMCkgewpyZXR1cm47Cn0KJHRoaXMtPnA0VXNlciA9ICR0aGlzLT5pby0+YXNrKCdFbnRlciBQNCBVc2VyOicpOwppZiAoJHRoaXMtPndpbmRvd3NGbGFnKSB7CiRjb21tYW5kID0gJHRoaXMtPmdldFA0RXhlY3V0YWJsZSgpLicgc2V0IFA0VVNFUj0nIC4gJHRoaXMtPnA0VXNlcjsKfSBlbHNlIHsKJGNvbW1hbmQgPSAnZXhwb3J0IFA0VVNFUj0nIC4gJHRoaXMtPnA0VXNlcjsKfQokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UDR2YXJpYWJsZShzdHJpbmcgJG5hbWUpOiA/c3RyaW5nCnsKaWYgKCR0aGlzLT53aW5kb3dzRmxhZykgewokY29tbWFuZCA9ICR0aGlzLT5nZXRQNEV4ZWN1dGFibGUoKS4nIHNldCc7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSB0cmltKCR0aGlzLT5jb21tYW5kUmVzdWx0KTsKJHJlc0FycmF5ID0gZXhwbG9kZShQSFBfRU9MLCAkcmVzdWx0KTsKZm9yZWFjaCAoJHJlc0FycmF5IGFzICRsaW5lKSB7CiRmaWVsZHMgPSBleHBsb2RlKCc9JywgJGxpbmUpOwppZiAoc3RyY21wKCRuYW1lLCAkZmllbGRzWzBdKSA9PT0gMCkgewokaW5kZXggPSBzdHJwb3MoJGZpZWxkc1sxXSwgJyAnKTsKaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKJHZhbHVlID0gJGZpZWxkc1sxXTsKfSBlbHNlIHsKJHZhbHVlID0gc3Vic3RyKCRmaWVsZHNbMV0sIDAsICRpbmRleCk7Cn0KJHZhbHVlID0gdHJpbSgkdmFsdWUpOwoKcmV0dXJuICR2YWx1ZTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKJGNvbW1hbmQgPSAnZWNobyAkJyAuICRuYW1lOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokcmVzdWx0ID0gdHJpbSgkdGhpcy0+Y29tbWFuZFJlc3VsdCk7CgpyZXR1cm4gJHJlc3VsdDsKfQoKcHVibGljIGZ1bmN0aW9uIHF1ZXJ5UDRQYXNzd29yZCgpOiA/c3RyaW5nCnsKaWYgKGlzc2V0KCR0aGlzLT5wNFBhc3N3b3JkKSkgewpyZXR1cm4gJHRoaXMtPnA0UGFzc3dvcmQ7Cn0KJHBhc3N3b3JkID0gJHRoaXMtPmdldFA0dmFyaWFibGUoJ1A0UEFTU1dEJyk7CmlmIChzdHJsZW4oKHN0cmluZykgJHBhc3N3b3JkKSA8PSAwKSB7CiRwYXNzd29yZCA9ICR0aGlzLT5pby0+YXNrQW5kSGlkZUFuc3dlcignRW50ZXIgcGFzc3dvcmQgZm9yIFBlcmZvcmNlIHVzZXIgJyAuICR0aGlzLT5nZXRVc2VyKCkgLiAnOiAnKTsKfQokdGhpcy0+cDRQYXNzd29yZCA9ICRwYXNzd29yZDsKCnJldHVybiAkcGFzc3dvcmQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZW5lcmF0ZVA0Q29tbWFuZChzdHJpbmcgJGNvbW1hbmQsIGJvb2wgJHVzZUNsaWVudCA9IHRydWUpOiBzdHJpbmcKewokcDRDb21tYW5kID0gJHRoaXMtPmdldFA0RXhlY3V0YWJsZSgpLicgJzsKJHA0Q29tbWFuZCAuPSAnLXUgJyAuICR0aGlzLT5nZXRVc2VyKCkgLiAnICc7CmlmICgkdXNlQ2xpZW50KSB7CiRwNENvbW1hbmQgLj0gJy1jICcgLiAkdGhpcy0+Z2V0Q2xpZW50KCkgLiAnICc7Cn0KJHA0Q29tbWFuZCAuPSAnLXAgJyAuICR0aGlzLT5nZXRQb3J0KCkgLiAnICcgLiAkY29tbWFuZDsKCnJldHVybiAkcDRDb21tYW5kOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNMb2dnZWRJbigpOiBib29sCnsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJ2xvZ2luIC1zJywgZmFsc2UpOwokZXhpdENvZGUgPSAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwppZiAoJGV4aXRDb2RlKSB7CiRlcnJvck91dHB1dCA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwokaW5kZXggPSBzdHJwb3MoJGVycm9yT3V0cHV0LCAkdGhpcy0+Z2V0VXNlcigpKTsKaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKJGluZGV4ID0gc3RycG9zKCRlcnJvck91dHB1dCwgJ3A0Jyk7CmlmICgkaW5kZXggPT09IGZhbHNlKSB7CnJldHVybiBmYWxzZTsKfQp0aHJvdyBuZXcgXEV4Y2VwdGlvbigncDQgY29tbWFuZCBub3QgZm91bmQgaW4gcGF0aDogJyAuICRlcnJvck91dHB1dCk7Cn0KdGhyb3cgbmV3IFxFeGNlcHRpb24oJ0ludmFsaWQgdXNlciBuYW1lOiAnIC4gJHRoaXMtPmdldFVzZXIoKSk7Cn0KCnJldHVybiB0cnVlOwp9CgpwdWJsaWMgZnVuY3Rpb24gY29ubmVjdENsaWVudCgpOiB2b2lkCnsKJHA0Q3JlYXRlQ2xpZW50Q29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgKJ2NsaWVudCAtaSA8ICcgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdGhpcy0+Z2V0UDRDbGllbnRTcGVjKCkpCik7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkcDRDcmVhdGVDbGllbnRDb21tYW5kKTsKfQoKcHVibGljIGZ1bmN0aW9uIHN5bmNDb2RlQmFzZSg/c3RyaW5nICRzb3VyY2VSZWZlcmVuY2UpOiB2b2lkCnsKJHByZXZEaXIgPSBQbGF0Zm9ybTo6Z2V0Q3dkKCk7CmNoZGlyKCR0aGlzLT5wYXRoKTsKJHA0U3luY0NvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJ3N5bmMgLWYgJyk7CmlmIChudWxsICE9PSAkc291cmNlUmVmZXJlbmNlKSB7CiRwNFN5bmNDb21tYW5kIC49ICdAJyAuICRzb3VyY2VSZWZlcmVuY2U7Cn0KJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRwNFN5bmNDb21tYW5kKTsKY2hkaXIoJHByZXZEaXIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVDbGllbnRTcGVjVG9GaWxlKCRzcGVjKTogdm9pZAp7CmZ3cml0ZSgkc3BlYywgJ0NsaWVudDogJyAuICR0aGlzLT5nZXRDbGllbnQoKSAuIFBIUF9FT0wgLiBQSFBfRU9MKTsKZndyaXRlKCRzcGVjLCAnVXBkYXRlOiAnIC4gZGF0ZSgnWS9tL2QgSDppOnMnKSAuIFBIUF9FT0wgLiBQSFBfRU9MKTsKZndyaXRlKCRzcGVjLCAnQWNjZXNzOiAnIC4gZGF0ZSgnWS9tL2QgSDppOnMnKSAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICdPd25lcjogICcgLiAkdGhpcy0+Z2V0VXNlcigpIC4gUEhQX0VPTCAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICdEZXNjcmlwdGlvbjonIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJyAgQ3JlYXRlZCBieSAnIC4gJHRoaXMtPmdldFVzZXIoKSAuICcgZnJvbSBjb21wb3Nlci4nIC4gUEhQX0VPTCAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICdSb290OiAnIC4gJHRoaXMtPmdldFBhdGgoKSAuIFBIUF9FT0wgLiBQSFBfRU9MKTsKZndyaXRlKCRzcGVjLCAnT3B0aW9uczogIG5vYWxsd3JpdGUgbm9jbG9iYmVyIG5vY29tcHJlc3MgdW5sb2NrZWQgbW9kdGltZSBybWRpcicgLiBQSFBfRU9MIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJ1N1Ym1pdE9wdGlvbnM6ICByZXZlcnR1bmNoYW5nZWQnIC4gUEhQX0VPTCAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICdMaW5lRW5kOiAgbG9jYWwnIC4gUEhQX0VPTCAuIFBIUF9FT0wpOwppZiAoJHRoaXMtPmlzU3RyZWFtKCkpIHsKZndyaXRlKCRzcGVjLCAnU3RyZWFtOicgLiBQSFBfRU9MKTsKZndyaXRlKCRzcGVjLCAnICAnIC4gJHRoaXMtPmdldFN0cmVhbVdpdGhvdXRMYWJlbCgkdGhpcy0+cDRTdHJlYW0pIC4gUEhQX0VPTCk7Cn0gZWxzZSB7CmZ3cml0ZSgKJHNwZWMsCidWaWV3OiAgJyAuICR0aGlzLT5nZXRTdHJlYW0oKSAuICcvLi4uICAvLycgLiAkdGhpcy0+Z2V0Q2xpZW50KCkgLiAnLy4uLiAnIC4gUEhQX0VPTAopOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiB3cml0ZVA0Q2xpZW50U3BlYygpOiB2b2lkCnsKJGNsaWVudFNwZWMgPSAkdGhpcy0+Z2V0UDRDbGllbnRTcGVjKCk7CiRzcGVjID0gZm9wZW4oJGNsaWVudFNwZWMsICd3Jyk7CnRyeSB7CiR0aGlzLT53cml0ZUNsaWVudFNwZWNUb0ZpbGUoJHNwZWMpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmZjbG9zZSgkc3BlYyk7CnRocm93ICRlOwp9CmZjbG9zZSgkc3BlYyk7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcmVhZCgkcGlwZSwgJG5hbWUpOiB2b2lkCnsKaWYgKGZlb2YoJHBpcGUpKSB7CnJldHVybjsKfQokbGluZSA9IGZnZXRzKCRwaXBlKTsKd2hpbGUgKCRsaW5lICE9PSBmYWxzZSkgewokbGluZSA9IGZnZXRzKCRwaXBlKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gd2luZG93c0xvZ2luKD9zdHJpbmcgJHBhc3N3b3JkKTogaW50CnsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJyBsb2dpbiAtYScpOwoKJHByb2Nlc3MgPSBQcm9jZXNzOjpmcm9tU2hlbGxDb21tYW5kbGluZSgkY29tbWFuZCwgbnVsbCwgbnVsbCwgJHBhc3N3b3JkKTsKCnJldHVybiAkcHJvY2Vzcy0+cnVuKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwNExvZ2luKCk6IHZvaWQKewokdGhpcy0+cXVlcnlQNFVzZXIoKTsKaWYgKCEkdGhpcy0+aXNMb2dnZWRJbigpKSB7CiRwYXNzd29yZCA9ICR0aGlzLT5xdWVyeVA0UGFzc3dvcmQoKTsKaWYgKCR0aGlzLT53aW5kb3dzRmxhZykgewokdGhpcy0+d2luZG93c0xvZ2luKCRwYXNzd29yZCk7Cn0gZWxzZSB7CiRjb21tYW5kID0gJ2VjaG8gJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRwYXNzd29yZCkgLiAnIHwgJyAuICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgnIGxvZ2luIC1hJywgZmFsc2UpOwokZXhpdENvZGUgPSAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwppZiAoJGV4aXRDb2RlKSB7CnRocm93IG5ldyBcRXhjZXB0aW9uKCJFcnJvciBsb2dnaW5nIGluOiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlckluZm9ybWF0aW9uKHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CiRjb21wb3NlckZpbGVDb250ZW50ID0gJHRoaXMtPmdldEZpbGVDb250ZW50KCdjb21wb3Nlci5qc29uJywgJGlkZW50aWZpZXIpOwoKaWYgKCEkY29tcG9zZXJGaWxlQ29udGVudCkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIGpzb25fZGVjb2RlKCRjb21wb3NlckZpbGVDb250ZW50LCB0cnVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVDb250ZW50KHN0cmluZyAkZmlsZSwgc3RyaW5nICRpZGVudGlmaWVyKTogP3N0cmluZwp7CiRwYXRoID0gJHRoaXMtPmdldEZpbGVQYXRoKCRmaWxlLCAkaWRlbnRpZmllcik7CgokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgnIHByaW50ICcgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkcGF0aCkpOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokcmVzdWx0ID0gJHRoaXMtPmNvbW1hbmRSZXN1bHQ7CgppZiAoIXRyaW0oJHJlc3VsdCkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZVBhdGgoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKJGluZGV4ID0gc3RycG9zKCRpZGVudGlmaWVyLCAnQCcpOwppZiAoJGluZGV4ID09PSBmYWxzZSkgewpyZXR1cm4gJGlkZW50aWZpZXIuICcvJyAuICRmaWxlOwp9CgokcGF0aCA9IHN1YnN0cigkaWRlbnRpZmllciwgMCwgJGluZGV4KSAuICcvJyAuICRmaWxlIC4gc3Vic3RyKCRpZGVudGlmaWVyLCAkaW5kZXgpOwokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgnIGZpbGVzICcgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkcGF0aCksIGZhbHNlKTsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKJHJlc3VsdCA9ICR0aGlzLT5jb21tYW5kUmVzdWx0OwokaW5kZXgyID0gc3RycG9zKCRyZXN1bHQsICdubyBzdWNoIGZpbGUocykuJyk7CmlmICgkaW5kZXgyID09PSBmYWxzZSkgewokaW5kZXgzID0gc3RycG9zKCRyZXN1bHQsICdjaGFuZ2UnKTsKaWYgKCRpbmRleDMgIT09IGZhbHNlKSB7CiRwaHJhc2UgPSB0cmltKHN1YnN0cigkcmVzdWx0LCAkaW5kZXgzKSk7CiRmaWVsZHMgPSBleHBsb2RlKCcgJywgJHBocmFzZSk7CgpyZXR1cm4gc3Vic3RyKCRpZGVudGlmaWVyLCAwLCAkaW5kZXgpIC4gJy8nIC4gJGZpbGUgLiAnQCcgLiAkZmllbGRzWzFdOwp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXkKewokcG9zc2libGVCcmFuY2hlcyA9IFtdOwppZiAoISR0aGlzLT5pc1N0cmVhbSgpKSB7CiRwb3NzaWJsZUJyYW5jaGVzWyR0aGlzLT5wNEJyYW5jaF0gPSAkdGhpcy0+Z2V0U3RyZWFtKCk7Cn0gZWxzZSB7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCdzdHJlYW1zICcuUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJy8vJyAuICR0aGlzLT5wNERlcG90IC4gJy8uLi4nKSk7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSAkdGhpcy0+Y29tbWFuZFJlc3VsdDsKJHJlc0FycmF5ID0gZXhwbG9kZShQSFBfRU9MLCAkcmVzdWx0KTsKZm9yZWFjaCAoJHJlc0FycmF5IGFzICRsaW5lKSB7CiRyZXNCaXRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKaWYgKGNvdW50KCRyZXNCaXRzKSA+IDQpIHsKJGJyYW5jaCA9IFByZWc6OnJlcGxhY2UoJy9bXkEtWmEtejAtOSBdLycsICcnLCAkcmVzQml0c1s0XSk7CiRwb3NzaWJsZUJyYW5jaGVzWyRicmFuY2hdID0gJHJlc0JpdHNbMV07Cn0KfQp9CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCdjaGFuZ2VzICcuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR0aGlzLT5nZXRTdHJlYW0oKSAuICcvLi4uJyksIGZhbHNlKTsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKJHJlc3VsdCA9ICR0aGlzLT5jb21tYW5kUmVzdWx0OwokcmVzQXJyYXkgPSBleHBsb2RlKFBIUF9FT0wsICRyZXN1bHQpOwokbGFzdENvbW1pdCA9ICRyZXNBcnJheVswXTsKJGxhc3RDb21taXRBcnIgPSBleHBsb2RlKCcgJywgJGxhc3RDb21taXQpOwokbGFzdENvbW1pdE51bSA9ICRsYXN0Q29tbWl0QXJyWzFdOwoKcmV0dXJuIFsnbWFzdGVyJyA9PiAkcG9zc2libGVCcmFuY2hlc1skdGhpcy0+cDRCcmFuY2hdIC4gJ0AnLiAkbGFzdENvbW1pdE51bV07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJ2xhYmVscycpOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokcmVzdWx0ID0gJHRoaXMtPmNvbW1hbmRSZXN1bHQ7CiRyZXNBcnJheSA9IGV4cGxvZGUoUEhQX0VPTCwgJHJlc3VsdCk7CiR0YWdzID0gW107CmZvcmVhY2ggKCRyZXNBcnJheSBhcyAkbGluZSkgewppZiAoc3RycG9zKCRsaW5lLCAnTGFiZWwnKSAhPT0gZmFsc2UpIHsKJGZpZWxkcyA9IGV4cGxvZGUoJyAnLCAkbGluZSk7CiR0YWdzWyRmaWVsZHNbMV1dID0gJHRoaXMtPmdldFN0cmVhbSgpIC4gJ0AnIC4gJGZpZWxkc1sxXTsKfQp9CgpyZXR1cm4gJHRhZ3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVja1N0cmVhbSgpOiBib29sCnsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJ2RlcG90cycsIGZhbHNlKTsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKJHJlc3VsdCA9ICR0aGlzLT5jb21tYW5kUmVzdWx0OwokcmVzQXJyYXkgPSBleHBsb2RlKFBIUF9FT0wsICRyZXN1bHQpOwpmb3JlYWNoICgkcmVzQXJyYXkgYXMgJGxpbmUpIHsKaWYgKHN0cnBvcygkbGluZSwgJ0RlcG90JykgIT09IGZhbHNlKSB7CiRmaWVsZHMgPSBleHBsb2RlKCcgJywgJGxpbmUpOwppZiAoc3RyY21wKCR0aGlzLT5wNERlcG90LCAkZmllbGRzWzFdKSA9PT0gMCkgewokdGhpcy0+cDREZXBvdFR5cGUgPSAkZmllbGRzWzNdOwoKcmV0dXJuICR0aGlzLT5pc1N0cmVhbSgpOwp9Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q2hhbmdlTGlzdChzdHJpbmcgJHJlZmVyZW5jZSk6IG1peGVkCnsKJGluZGV4ID0gc3RycG9zKCRyZWZlcmVuY2UsICdAJyk7CmlmICgkaW5kZXggPT09IGZhbHNlKSB7CnJldHVybiBudWxsOwp9CiRsYWJlbCA9IHN1YnN0cigkcmVmZXJlbmNlLCAkaW5kZXgpOwokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgnIGNoYW5nZXMgLW0xICcgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkbGFiZWwpKTsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKJGNoYW5nZXMgPSAkdGhpcy0+Y29tbWFuZFJlc3VsdDsKaWYgKHN0cnBvcygkY2hhbmdlcywgJ0NoYW5nZScpICE9PSAwKSB7CnJldHVybiBudWxsOwp9CiRmaWVsZHMgPSBleHBsb2RlKCcgJywgJGNoYW5nZXMpOwoKcmV0dXJuICRmaWVsZHNbMV07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21taXRMb2dzKHN0cmluZyAkZnJvbVJlZmVyZW5jZSwgc3RyaW5nICR0b1JlZmVyZW5jZSk6IG1peGVkCnsKJGZyb21DaGFuZ2VMaXN0ID0gJHRoaXMtPmdldENoYW5nZUxpc3QoJGZyb21SZWZlcmVuY2UpOwppZiAoJGZyb21DaGFuZ2VMaXN0ID09PSBudWxsKSB7CnJldHVybiBudWxsOwp9CiR0b0NoYW5nZUxpc3QgPSAkdGhpcy0+Z2V0Q2hhbmdlTGlzdCgkdG9SZWZlcmVuY2UpOwppZiAoJHRvQ2hhbmdlTGlzdCA9PT0gbnVsbCkgewpyZXR1cm4gbnVsbDsKfQokaW5kZXggPSBzdHJwb3MoJGZyb21SZWZlcmVuY2UsICdAJyk7CiRtYWluID0gc3Vic3RyKCRmcm9tUmVmZXJlbmNlLCAwLCAkaW5kZXgpIC4gJy8uLi4nOwokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgnZmlsZWxvZyAnIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJG1haW4gLiAnQCcgLiAkZnJvbUNoYW5nZUxpc3QuICcsJyAuICR0b0NoYW5nZUxpc3QpKTsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKCnJldHVybiAkdGhpcy0+Y29tbWFuZFJlc3VsdDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVzeXN0ZW0oKTogRmlsZXN5c3RlbQp7CmlmIChudWxsID09PSAkdGhpcy0+ZmlsZXN5c3RlbSkgewokdGhpcy0+ZmlsZXN5c3RlbSA9IG5ldyBGaWxlc3lzdGVtKCR0aGlzLT5wcm9jZXNzKTsKfQoKcmV0dXJuICR0aGlzLT5maWxlc3lzdGVtOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RmlsZXN5c3RlbShGaWxlc3lzdGVtICRmcyk6IHZvaWQKewokdGhpcy0+ZmlsZXN5c3RlbSA9ICRmczsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQNEV4ZWN1dGFibGUoKTogc3RyaW5nCnsKc3RhdGljICRwNEV4ZWN1dGFibGU7CgppZiAoJHA0RXhlY3V0YWJsZSkgewpyZXR1cm4gJHA0RXhlY3V0YWJsZTsKfQoKJGZpbmRlciA9IG5ldyBFeGVjdXRhYmxlRmluZGVyKCk7CgpyZXR1cm4gJHA0RXhlY3V0YWJsZSA9ICRmaW5kZXItPmZpbmQoJ3A0JykgPz8gJ3A0JzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgoKY2xhc3MgUGxhdGZvcm0KewoKcHJpdmF0ZSBzdGF0aWMgJGlzVmlydHVhbEJveEd1ZXN0ID0gbnVsbDsKCnByaXZhdGUgc3RhdGljICRpc1dpbmRvd3NTdWJzeXN0ZW1Gb3JMaW51eCA9IG51bGw7Cgpwcml2YXRlIHN0YXRpYyAkaXNEb2NrZXIgPSBudWxsOwoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEN3ZChib29sICRhbGxvd0VtcHR5ID0gZmFsc2UpOiBzdHJpbmcKewokY3dkID0gZ2V0Y3dkKCk7CgoKaWYgKGZhbHNlID09PSAkY3dkKSB7CiRjd2QgPSByZWFscGF0aCgnJyk7Cn0KCgppZiAoZmFsc2UgPT09ICRjd2QpIHsKaWYgKCRhbGxvd0VtcHR5KSB7CnJldHVybiAnJzsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Jyk7Cn0KCnJldHVybiAkY3dkOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlYWxwYXRoKHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CiRyZWFsUGF0aCA9IHJlYWxwYXRoKCRwYXRoKTsKaWYgKCRyZWFsUGF0aCA9PT0gZmFsc2UpIHsKcmV0dXJuICRwYXRoOwp9CgpyZXR1cm4gJHJlYWxQYXRoOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRFbnYoc3RyaW5nICRuYW1lKQp7CmlmIChhcnJheV9rZXlfZXhpc3RzKCRuYW1lLCAkX1NFUlZFUikpIHsKcmV0dXJuIChzdHJpbmcpICRfU0VSVkVSWyRuYW1lXTsKfQppZiAoYXJyYXlfa2V5X2V4aXN0cygkbmFtZSwgJF9FTlYpKSB7CnJldHVybiAoc3RyaW5nKSAkX0VOVlskbmFtZV07Cn0KCnJldHVybiBnZXRlbnYoJG5hbWUpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHB1dEVudihzdHJpbmcgJG5hbWUsIHN0cmluZyAkdmFsdWUpOiB2b2lkCnsKcHV0ZW52KCRuYW1lIC4gJz0nIC4gJHZhbHVlKTsKJF9TRVJWRVJbJG5hbWVdID0gJF9FTlZbJG5hbWVdID0gJHZhbHVlOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsZWFyRW52KHN0cmluZyAkbmFtZSk6IHZvaWQKewpwdXRlbnYoJG5hbWUpOwp1bnNldCgkX1NFUlZFUlskbmFtZV0sICRfRU5WWyRuYW1lXSk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXhwYW5kUGF0aChzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewppZiAoUHJlZzo6aXNNYXRjaCgnI15+W1xcL10jJywgJHBhdGgpKSB7CnJldHVybiBzZWxmOjpnZXRVc2VyRGlyZWN0b3J5KCkgLiBzdWJzdHIoJHBhdGgsIDEpOwp9CgpyZXR1cm4gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCcjXihcJHwoP1A8cGVyY2VudD4lKSkoP1A8dmFyPlx3KyspKD8ocGVyY2VudCklKSg/UDxwYXRoPi4qKSMnLCBzdGF0aWMgZnVuY3Rpb24gKCRtYXRjaGVzKTogc3RyaW5nIHsKCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgJG1hdGNoZXNbJ3ZhciddID09PSAnSE9NRScpIHsKaWYgKChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCdIT01FJykpIHsKcmV0dXJuIFBsYXRmb3JtOjpnZXRFbnYoJ0hPTUUnKSAuICRtYXRjaGVzWydwYXRoJ107Cn0KcmV0dXJuIFBsYXRmb3JtOjpnZXRFbnYoJ1VTRVJQUk9GSUxFJykgLiAkbWF0Y2hlc1sncGF0aCddOwp9CgpyZXR1cm4gUGxhdGZvcm06OmdldEVudigkbWF0Y2hlc1sndmFyJ10pIC4gJG1hdGNoZXNbJ3BhdGgnXTsKfSwgJHBhdGgpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRVc2VyRGlyZWN0b3J5KCk6IHN0cmluZwp7CmlmIChmYWxzZSAhPT0gKCRob21lID0gc2VsZjo6Z2V0RW52KCdIT01FJykpKSB7CnJldHVybiAkaG9tZTsKfQoKaWYgKHNlbGY6OmlzV2luZG93cygpICYmIGZhbHNlICE9PSAoJGhvbWUgPSBzZWxmOjpnZXRFbnYoJ1VTRVJQUk9GSUxFJykpKSB7CnJldHVybiAkaG9tZTsKfQoKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHVpZCcpICYmIFxmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykpIHsKJGluZm8gPSBwb3NpeF9nZXRwd3VpZChwb3NpeF9nZXR1aWQoKSk7CgppZiAoaXNfYXJyYXkoJGluZm8pKSB7CnJldHVybiAkaW5mb1snZGlyJ107Cn0KfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGV0ZXJtaW5lIHVzZXIgZGlyZWN0b3J5Jyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXgoKTogYm9vbAp7CmlmIChudWxsID09PSBzZWxmOjokaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXgpIHsKc2VsZjo6JGlzV2luZG93c1N1YnN5c3RlbUZvckxpbnV4ID0gZmFsc2U7CgoKaWYgKHNlbGY6OmlzV2luZG93cygpKSB7CnJldHVybiBzZWxmOjokaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXggPSBmYWxzZTsKfQoKaWYgKAohKGJvb2wpIGluaV9nZXQoJ29wZW5fYmFzZWRpcicpCiYmIGlzX3JlYWRhYmxlKCcvcHJvYy92ZXJzaW9uJykKJiYgZmFsc2UgIT09IHN0cmlwb3MoKHN0cmluZylTaWxlbmNlcjo6Y2FsbCgnZmlsZV9nZXRfY29udGVudHMnLCAnL3Byb2MvdmVyc2lvbicpLCAnbWljcm9zb2Z0JykKJiYgIXNlbGY6OmlzRG9ja2VyKCkgCikgewpyZXR1cm4gc2VsZjo6JGlzV2luZG93c1N1YnN5c3RlbUZvckxpbnV4ID0gdHJ1ZTsKfQp9CgpyZXR1cm4gc2VsZjo6JGlzV2luZG93c1N1YnN5c3RlbUZvckxpbnV4Owp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzV2luZG93cygpOiBib29sCnsKcmV0dXJuIFxkZWZpbmVkKCdQSFBfV0lORE9XU19WRVJTSU9OX0JVSUxEJyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNEb2NrZXIoKTogYm9vbAp7CmlmIChudWxsICE9PSBzZWxmOjokaXNEb2NrZXIpIHsKcmV0dXJuIHNlbGY6OiRpc0RvY2tlcjsKfQoKCmlmICgoYm9vbCkgaW5pX2dldCgnb3Blbl9iYXNlZGlyJykpIHsKcmV0dXJuIHNlbGY6OiRpc0RvY2tlciA9IGZhbHNlOwp9CgoKaWYgKGZpbGVfZXhpc3RzKCcvLmRvY2tlcmVudicpIHx8IGZpbGVfZXhpc3RzKCcvcnVuLy5jb250YWluZXJlbnYnKSB8fCBmaWxlX2V4aXN0cygnL3Zhci9ydW4vLmNvbnRhaW5lcmVudicpKSB7CnJldHVybiBzZWxmOjokaXNEb2NrZXIgPSB0cnVlOwp9CgoKJGNncm91cHMgPSBbCicvcHJvYy9zZWxmL21vdW50aW5mbycsIAonL3Byb2MvMS9jZ3JvdXAnLCAKXTsKZm9yZWFjaCAoJGNncm91cHMgYXMgJGNncm91cCkgewppZiAoIWlzX3JlYWRhYmxlKCRjZ3JvdXApKSB7CmNvbnRpbnVlOwp9CgoKdHJ5IHsKJGRhdGEgPSBAZmlsZV9nZXRfY29udGVudHMoJGNncm91cCk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKYnJlYWs7Cn0KaWYgKCFpc19zdHJpbmcoJGRhdGEpKSB7CmNvbnRpbnVlOwp9CgppZiAoc3RyX2NvbnRhaW5zKCRkYXRhLCAnL3Zhci9saWIvZG9ja2VyLycpIHx8IHN0cl9jb250YWlucygkZGF0YSwgJy9pby5jb250YWluZXJkLnNuYXBzaG90dGVyJykpIHsKcmV0dXJuIHNlbGY6OiRpc0RvY2tlciA9IHRydWU7Cn0KfQoKcmV0dXJuIHNlbGY6OiRpc0RvY2tlciA9IGZhbHNlOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cmxlbihzdHJpbmcgJHN0cik6IGludAp7CnN0YXRpYyAkdXNlTWJTdHJpbmcgPSBudWxsOwppZiAobnVsbCA9PT0gJHVzZU1iU3RyaW5nKSB7CiR1c2VNYlN0cmluZyA9IFxmdW5jdGlvbl9leGlzdHMoJ21iX3N0cmxlbicpICYmIChib29sKSBpbmlfZ2V0KCdtYnN0cmluZy5mdW5jX292ZXJsb2FkJyk7Cn0KCmlmICgkdXNlTWJTdHJpbmcpIHsKcmV0dXJuIG1iX3N0cmxlbigkc3RyLCAnOGJpdCcpOwp9CgpyZXR1cm4gXHN0cmxlbigkc3RyKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1R0eSgkZmQgPSBudWxsKTogYm9vbAp7CmlmICgkZmQgPT09IG51bGwpIHsKJGZkID0gZGVmaW5lZCgnU1RET1VUJykgPyBTVERPVVQgOiBmb3BlbigncGhwOi8vc3Rkb3V0JywgJ3cnKTsKaWYgKCRmZCA9PT0gZmFsc2UpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCgoKaWYgKGluX2FycmF5KHN0cnRvdXBwZXIoKHN0cmluZykgc2VsZjo6Z2V0RW52KCdNU1lTVEVNJykpLCBbJ01JTkdXMzInLCAnTUlOR1c2NCddLCB0cnVlKSkgewpyZXR1cm4gdHJ1ZTsKfQoKCgppZiAoZnVuY3Rpb25fZXhpc3RzKCdzdHJlYW1faXNhdHR5JykpIHsKcmV0dXJuIHN0cmVhbV9pc2F0dHkoJGZkKTsKfQoKCmlmIChmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2lzYXR0eScpICYmIHBvc2l4X2lzYXR0eSgkZmQpKSB7CnJldHVybiB0cnVlOwp9Cgokc3RhdCA9IEBmc3RhdCgkZmQpOwppZiAoJHN0YXQgPT09IGZhbHNlKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIDAwMjAwMDAgPT09ICgkc3RhdFsnbW9kZSddICYgMDE3MDAwMCk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNJbnB1dENvbXBsZXRpb25Qcm9jZXNzKCk6IGJvb2wKewpyZXR1cm4gJ19jb21wbGV0ZScgPT09ICgkX1NFUlZFUlsnYXJndiddWzFdID8/IG51bGwpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdvcmthcm91bmRGaWxlc3lzdGVtSXNzdWVzKCk6IHZvaWQKewppZiAoc2VsZjo6aXNWaXJ0dWFsQm94R3Vlc3QoKSkgewp1c2xlZXAoMjAwMDAwKTsKfQp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzVmlydHVhbEJveEd1ZXN0KCk6IGJvb2wKewppZiAobnVsbCA9PT0gc2VsZjo6JGlzVmlydHVhbEJveEd1ZXN0KSB7CnNlbGY6OiRpc1ZpcnR1YWxCb3hHdWVzdCA9IGZhbHNlOwppZiAoc2VsZjo6aXNXaW5kb3dzKCkpIHsKcmV0dXJuIHNlbGY6OiRpc1ZpcnR1YWxCb3hHdWVzdDsKfQoKaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGV1aWQnKSkgewokcHJvY2Vzc1VzZXIgPSBwb3NpeF9nZXRwd3VpZChwb3NpeF9nZXRldWlkKCkpOwppZiAoaXNfYXJyYXkoJHByb2Nlc3NVc2VyKSAmJiAkcHJvY2Vzc1VzZXJbJ25hbWUnXSA9PT0gJ3ZhZ3JhbnQnKSB7CnJldHVybiBzZWxmOjokaXNWaXJ0dWFsQm94R3Vlc3QgPSB0cnVlOwp9Cn0KCmlmIChzZWxmOjpnZXRFbnYoJ0NPTVBPU0VSX1JVTlRJTUVfRU5WJykgPT09ICd2aXJ0dWFsYm94JykgewpyZXR1cm4gc2VsZjo6JGlzVmlydHVhbEJveEd1ZXN0ID0gdHJ1ZTsKfQoKaWYgKGRlZmluZWQoJ1BIUF9PU19GQU1JTFknKSAmJiBQSFBfT1NfRkFNSUxZID09PSAnTGludXgnKSB7CiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigpOwp0cnkgewppZiAoMCA9PT0gJHByb2Nlc3MtPmV4ZWN1dGUoWydsc21vZCddLCAkb3V0cHV0KSAmJiBzdHJfY29udGFpbnMoJG91dHB1dCwgJ3Zib3hndWVzdCcpKSB7CnJldHVybiBzZWxmOjokaXNWaXJ0dWFsQm94R3Vlc3QgPSB0cnVlOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKCn0KfQp9CgpyZXR1cm4gc2VsZjo6JGlzVmlydHVhbEJveEd1ZXN0Owp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldERldk51bGwoKTogc3RyaW5nCnsKaWYgKHNlbGY6OmlzV2luZG93cygpKSB7CnJldHVybiAnTlVMJzsKfQoKcmV0dXJuICcvZGV2L251bGwnOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBTZWxkXFNpZ25hbFxTaWduYWxIYW5kbGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUHJvY2Vzc1NpZ25hbGVkRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhlY3V0YWJsZUZpbmRlcjsKCgoKCgpjbGFzcyBQcm9jZXNzRXhlY3V0b3IKewpwcml2YXRlIGNvbnN0IFNUQVRVU19RVUVVRUQgPSAxOwpwcml2YXRlIGNvbnN0IFNUQVRVU19TVEFSVEVEID0gMjsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfQ09NUExFVEVEID0gMzsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfRkFJTEVEID0gNDsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfQUJPUlRFRCA9IDU7Cgpwcml2YXRlIGNvbnN0IEJVSUxUSU5fQ01EX0NPTU1BTkRTID0gWwonYXNzb2MnLCAnYnJlYWsnLCAnY2FsbCcsICdjZCcsICdjaGRpcicsICdjbHMnLCAnY29sb3InLCAnY29weScsICdkYXRlJywKJ2RlbCcsICdkaXInLCAnZWNobycsICdlbmRsb2NhbCcsICdlcmFzZScsICdleGl0JywgJ2ZvcicsICdmdHlwZScsICdnb3RvJywKJ2hlbHAnLCAnaWYnLCAnbGFiZWwnLCAnbWQnLCAnbWtkaXInLCAnbWtsaW5rJywgJ21vdmUnLCAncGF0aCcsICdwYXVzZScsCidwb3BkJywgJ3Byb21wdCcsICdwdXNoZCcsICdyZCcsICdyZW0nLCAncmVuJywgJ3JlbmFtZScsICdybWRpcicsICdzZXQnLAonc2V0bG9jYWwnLCAnc2hpZnQnLCAnc3RhcnQnLCAndGltZScsICd0aXRsZScsICd0eXBlJywgJ3ZlcicsICd2b2wnLApdOwoKcHJpdmF0ZSBjb25zdCBHSVRfQ01EU19ORUVEX0dJVF9ESVIgPSBbClsnc2hvdyddLApbJ2xvZyddLApbJ2JyYW5jaCddLApbJ3JlbW90ZScsICdzZXQtdXJsJ10KXTsKCgpwcm90ZWN0ZWQgc3RhdGljICR0aW1lb3V0ID0gMzAwOwoKCnByb3RlY3RlZCAkY2FwdHVyZU91dHB1dCA9IGZhbHNlOwoKcHJvdGVjdGVkICRlcnJvck91dHB1dCA9ICcnOwoKcHJvdGVjdGVkICRpbzsKCgoKCnByaXZhdGUgJGpvYnMgPSBbXTsKCnByaXZhdGUgJHJ1bm5pbmdKb2JzID0gMDsKCnByaXZhdGUgJG1heEpvYnMgPSAxMDsKCnByaXZhdGUgJGlkR2VuID0gMDsKCnByaXZhdGUgJGFsbG93QXN5bmMgPSBmYWxzZTsKCgpwcml2YXRlIHN0YXRpYyAkZXhlY3V0YWJsZXMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5yZXNldE1heEpvYnMoKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGUoJGNvbW1hbmQsICYkb3V0cHV0ID0gbnVsbCwgP3N0cmluZyAkY3dkID0gbnVsbCk6IGludAp7CmlmIChmdW5jX251bV9hcmdzKCkgPiAxKSB7CnJldHVybiAkdGhpcy0+ZG9FeGVjdXRlKCRjb21tYW5kLCAkY3dkLCBmYWxzZSwgJG91dHB1dCk7Cn0KCnJldHVybiAkdGhpcy0+ZG9FeGVjdXRlKCRjb21tYW5kLCAkY3dkLCBmYWxzZSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZVR0eSgkY29tbWFuZCwgP3N0cmluZyAkY3dkID0gbnVsbCk6IGludAp7CmlmIChQbGF0Zm9ybTo6aXNUdHkoKSkgewpyZXR1cm4gJHRoaXMtPmRvRXhlY3V0ZSgkY29tbWFuZCwgJGN3ZCwgdHJ1ZSk7Cn0KCnJldHVybiAkdGhpcy0+ZG9FeGVjdXRlKCRjb21tYW5kLCAkY3dkLCBmYWxzZSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBydW5Qcm9jZXNzKCRjb21tYW5kLCA/c3RyaW5nICRjd2QsID9hcnJheSAkZW52LCBib29sICR0dHksICYkb3V0cHV0ID0gbnVsbCk6ID9pbnQKewoKCgppZiAoaXNfc3RyaW5nKCRjb21tYW5kKSkgewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmIFByZWc6OmlzTWF0Y2goJ3teKFteOi9cXFxcXSsrKSB9JywgJGNvbW1hbmQsICRtYXRjaCkpIHsKJGNvbW1hbmQgPSBzdWJzdHJfcmVwbGFjZSgkY29tbWFuZCwgc2VsZjo6ZXNjYXBlKHNlbGY6OmdldEV4ZWN1dGFibGUoJG1hdGNoWzFdKSksIDAsIHN0cmxlbigkbWF0Y2hbMV0pKTsKfQoKJHByb2Nlc3MgPSBQcm9jZXNzOjpmcm9tU2hlbGxDb21tYW5kbGluZSgkY29tbWFuZCwgJGN3ZCwgJGVudiwgbnVsbCwgc3RhdGljOjpnZXRUaW1lb3V0KCkpOwp9IGVsc2UgewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmIFxzdHJsZW4oJGNvbW1hbmRbMF0pID09PSBzdHJjc3BuKCRjb21tYW5kWzBdLCAnOi9cXCcpKSB7CiRjb21tYW5kWzBdID0gc2VsZjo6Z2V0RXhlY3V0YWJsZSgkY29tbWFuZFswXSk7Cn0KCiRwcm9jZXNzID0gbmV3IFByb2Nlc3MoJGNvbW1hbmQsICRjd2QsICRlbnYsIG51bGwsIHN0YXRpYzo6Z2V0VGltZW91dCgpKTsKfQoKaWYgKCEgUGxhdGZvcm06OmlzV2luZG93cygpICYmICR0dHkpIHsKdHJ5IHsKJHByb2Nlc3MtPnNldFR0eSh0cnVlKTsKfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiAkZSkgewoKfQp9CgokY2FsbGJhY2sgPSBpc19jYWxsYWJsZSgkb3V0cHV0KSA/ICRvdXRwdXQgOiBmdW5jdGlvbiAoc3RyaW5nICR0eXBlLCBzdHJpbmcgJGJ1ZmZlcik6IHZvaWQgewokdGhpcy0+b3V0cHV0SGFuZGxlcigkdHlwZSwgJGJ1ZmZlcik7Cn07Cgokc2lnbmFsSGFuZGxlciA9IFNpZ25hbEhhbmRsZXI6OmNyZWF0ZSgKW1NpZ25hbEhhbmRsZXI6OlNJR0lOVCwgU2lnbmFsSGFuZGxlcjo6U0lHVEVSTSwgU2lnbmFsSGFuZGxlcjo6U0lHSFVQXSwKZnVuY3Rpb24gKHN0cmluZyAkc2lnbmFsKSB7CmlmICgkdGhpcy0+aW8gIT09IG51bGwpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKAonUmVjZWl2ZWQgJy4kc2lnbmFsLicsIGFib3J0aW5nIHdoZW4gY2hpbGQgcHJvY2VzcyBpcyBkb25lJywKdHJ1ZSwKSU9JbnRlcmZhY2U6OkRFQlVHCik7Cn0KfQopOwoKdHJ5IHsKJHByb2Nlc3MtPnJ1bigkY2FsbGJhY2spOwoKaWYgKCR0aGlzLT5jYXB0dXJlT3V0cHV0ICYmICFpc19jYWxsYWJsZSgkb3V0cHV0KSkgewokb3V0cHV0ID0gJHByb2Nlc3MtPmdldE91dHB1dCgpOwp9CgokdGhpcy0+ZXJyb3JPdXRwdXQgPSAkcHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKfSBjYXRjaCAoUHJvY2Vzc1NpZ25hbGVkRXhjZXB0aW9uICRlKSB7CmlmICgkc2lnbmFsSGFuZGxlci0+aXNUcmlnZ2VyZWQoKSkgewoKJHNpZ25hbEhhbmRsZXItPmV4aXRXaXRoTGFzdFNpZ25hbCgpOwp9Cn0gZmluYWxseSB7CiRzaWduYWxIYW5kbGVyLT51bnJlZ2lzdGVyKCk7Cn0KCnJldHVybiAkcHJvY2Vzcy0+Z2V0RXhpdENvZGUoKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9FeGVjdXRlKCRjb21tYW5kLCA/c3RyaW5nICRjd2QsIGJvb2wgJHR0eSwgJiRvdXRwdXQgPSBudWxsKTogaW50CnsKJHRoaXMtPm91dHB1dENvbW1hbmRSdW4oJGNvbW1hbmQsICRjd2QsIGZhbHNlKTsKCiR0aGlzLT5jYXB0dXJlT3V0cHV0ID0gZnVuY19udW1fYXJncygpID4gMzsKJHRoaXMtPmVycm9yT3V0cHV0ID0gJyc7CgokZW52ID0gbnVsbDsKCiRyZXF1aXJlc0dpdERpckVudiA9ICR0aGlzLT5yZXF1aXJlc0dpdERpckVudigkY29tbWFuZCk7CmlmICgkY3dkICE9PSBudWxsICYmICRyZXF1aXJlc0dpdERpckVudikgewokaXNCYXJlUmVwb3NpdG9yeSA9ICFpc19kaXIoc3ByaW50ZignJXMvLmdpdCcsIHJ0cmltKCRjd2QsICcvJykpKTsKaWYgKCRpc0JhcmVSZXBvc2l0b3J5KSB7CiRjb25maWdWYWx1ZSA9ICcnOwokdGhpcy0+cnVuUHJvY2VzcyhbJ2dpdCcsICdjb25maWcnLCAnc2FmZS5iYXJlUmVwb3NpdG9yeSddLCAkY3dkLCBbJ0dJVF9ESVInID0+ICRjd2RdLCAkdHR5LCAkY29uZmlnVmFsdWUpOwokY29uZmlnVmFsdWUgPSB0cmltKCRjb25maWdWYWx1ZSk7CmlmICgkY29uZmlnVmFsdWUgPT09ICdleHBsaWNpdCcpIHsKJGVudiA9IFsnR0lUX0RJUicgPT4gJGN3ZF07Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPnJ1blByb2Nlc3MoJGNvbW1hbmQsICRjd2QsICRlbnYsICR0dHksICRvdXRwdXQpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGVBc3luYygkY29tbWFuZCwgP3N0cmluZyAkY3dkID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoISR0aGlzLT5hbGxvd0FzeW5jKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1lvdSBtdXN0IHVzZSB0aGUgUHJvY2Vzc0V4ZWN1dG9yIGluc3RhbmNlIHdoaWNoIGlzIHBhcnQgb2YgYSBDb21wb3NlclxMb29wIGluc3RhbmNlIHRvIGJlIGFibGUgdG8gcnVuIGFzeW5jIHByb2Nlc3NlcycpOwp9Cgokam9iID0gWwonaWQnID0+ICR0aGlzLT5pZEdlbisrLAonc3RhdHVzJyA9PiBzZWxmOjpTVEFUVVNfUVVFVUVELAonY29tbWFuZCcgPT4gJGNvbW1hbmQsCidjd2QnID0+ICRjd2QsCl07CgokcmVzb2x2ZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCRyZXNvbHZlLCAkcmVqZWN0KSB1c2UgKCYkam9iKTogdm9pZCB7CiRqb2JbJ3N0YXR1cyddID0gUHJvY2Vzc0V4ZWN1dG9yOjpTVEFUVVNfUVVFVUVEOwokam9iWydyZXNvbHZlJ10gPSAkcmVzb2x2ZTsKJGpvYlsncmVqZWN0J10gPSAkcmVqZWN0Owp9OwoKJGNhbmNlbGVyID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJiRqb2IpOiB2b2lkIHsKaWYgKCRqb2JbJ3N0YXR1cyddID09PSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19RVUVVRUQpIHsKJGpvYlsnc3RhdHVzJ10gPSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19BQk9SVEVEOwp9CmlmICgkam9iWydzdGF0dXMnXSAhPT0gUHJvY2Vzc0V4ZWN1dG9yOjpTVEFUVVNfU1RBUlRFRCkgewpyZXR1cm47Cn0KJGpvYlsnc3RhdHVzJ10gPSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19BQk9SVEVEOwp0cnkgewppZiAoZGVmaW5lZCgnU0lHSU5UJykpIHsKJGpvYlsncHJvY2VzcyddLT5zaWduYWwoU0lHSU5UKTsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cgp9CiRqb2JbJ3Byb2Nlc3MnXS0+c3RvcCgxKTsKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQWJvcnRlZCBwcm9jZXNzJyk7Cn07CgokcHJvbWlzZSA9IG5ldyBQcm9taXNlKCRyZXNvbHZlciwgJGNhbmNlbGVyKTsKJHByb21pc2UgPSAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCYkam9iKSB7CmlmICgkam9iWydwcm9jZXNzJ10tPmlzU3VjY2Vzc2Z1bCgpKSB7CiRqb2JbJ3N0YXR1cyddID0gUHJvY2Vzc0V4ZWN1dG9yOjpTVEFUVVNfQ09NUExFVEVEOwp9IGVsc2Ugewokam9iWydzdGF0dXMnXSA9IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX0ZBSUxFRDsKfQoKJHRoaXMtPm1hcmtKb2JEb25lKCk7CgpyZXR1cm4gJGpvYlsncHJvY2VzcyddOwp9LCBmdW5jdGlvbiAoJGUpIHVzZSAoJiRqb2IpOiB2b2lkIHsKJGpvYlsnc3RhdHVzJ10gPSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19GQUlMRUQ7CgokdGhpcy0+bWFya0pvYkRvbmUoKTsKCnRocm93ICRlOwp9KTsKJHRoaXMtPmpvYnNbJGpvYlsnaWQnXV0gPSAmJGpvYjsKCmlmICgkdGhpcy0+cnVubmluZ0pvYnMgPCAkdGhpcy0+bWF4Sm9icykgewokdGhpcy0+c3RhcnRKb2IoJGpvYlsnaWQnXSk7Cn0KCnJldHVybiAkcHJvbWlzZTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIG91dHB1dEhhbmRsZXIoc3RyaW5nICR0eXBlLCBzdHJpbmcgJGJ1ZmZlcik6IHZvaWQKewppZiAoJHRoaXMtPmNhcHR1cmVPdXRwdXQpIHsKcmV0dXJuOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPmlvKSB7CmVjaG8gJGJ1ZmZlcjsKCnJldHVybjsKfQoKaWYgKFByb2Nlc3M6OkVSUiA9PT0gJHR5cGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yUmF3KCRidWZmZXIsIGZhbHNlKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZVJhdygkYnVmZmVyLCBmYWxzZSk7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBzdGFydEpvYihpbnQgJGlkKTogdm9pZAp7CiRqb2IgPSAmJHRoaXMtPmpvYnNbJGlkXTsKaWYgKCRqb2JbJ3N0YXR1cyddICE9PSBzZWxmOjpTVEFUVVNfUVVFVUVEKSB7CnJldHVybjsKfQoKCiRqb2JbJ3N0YXR1cyddID0gc2VsZjo6U1RBVFVTX1NUQVJURUQ7CiR0aGlzLT5ydW5uaW5nSm9icysrOwoKJGNvbW1hbmQgPSAkam9iWydjb21tYW5kJ107CiRjd2QgPSAkam9iWydjd2QnXTsKCiR0aGlzLT5vdXRwdXRDb21tYW5kUnVuKCRjb21tYW5kLCAkY3dkLCB0cnVlKTsKCnRyeSB7CmlmIChpc19zdHJpbmcoJGNvbW1hbmQpKSB7CiRwcm9jZXNzID0gUHJvY2Vzczo6ZnJvbVNoZWxsQ29tbWFuZGxpbmUoJGNvbW1hbmQsICRjd2QsIG51bGwsIG51bGwsIHN0YXRpYzo6Z2V0VGltZW91dCgpKTsKfSBlbHNlIHsKJHByb2Nlc3MgPSBuZXcgUHJvY2VzcygkY29tbWFuZCwgJGN3ZCwgbnVsbCwgbnVsbCwgc3RhdGljOjpnZXRUaW1lb3V0KCkpOwp9Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKJGpvYlsncmVqZWN0J10oJGUpOwoKcmV0dXJuOwp9Cgokam9iWydwcm9jZXNzJ10gPSAkcHJvY2VzczsKCnRyeSB7CiRwcm9jZXNzLT5zdGFydCgpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiRqb2JbJ3JlamVjdCddKCRlKTsKCnJldHVybjsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0TWF4Sm9icyhpbnQgJG1heEpvYnMpOiB2b2lkCnsKJHRoaXMtPm1heEpvYnMgPSAkbWF4Sm9iczsKfQoKcHVibGljIGZ1bmN0aW9uIHJlc2V0TWF4Sm9icygpOiB2b2lkCnsKaWYgKGlzX251bWVyaWMoJG1heEpvYnMgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9NQVhfUEFSQUxMRUxfUFJPQ0VTU0VTJykpKSB7CiR0aGlzLT5tYXhKb2JzID0gbWF4KDEsIG1pbig1MCwgKGludCkgJG1heEpvYnMpKTsKfSBlbHNlIHsKJHRoaXMtPm1heEpvYnMgPSAxMDsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FpdCgkaW5kZXggPSBudWxsKTogdm9pZAp7CndoaWxlICh0cnVlKSB7CmlmICgwID09PSAkdGhpcy0+Y291bnRBY3RpdmVKb2JzKCRpbmRleCkpIHsKcmV0dXJuOwp9Cgp1c2xlZXAoMTAwMCk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVuYWJsZUFzeW5jKCk6IHZvaWQKewokdGhpcy0+YWxsb3dBc3luYyA9IHRydWU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudEFjdGl2ZUpvYnMoJGluZGV4ID0gbnVsbCk6IGludAp7Cgpmb3JlYWNoICgkdGhpcy0+am9icyBhcyAkam9iKSB7CmlmICgkam9iWydzdGF0dXMnXSA9PT0gc2VsZjo6U1RBVFVTX1NUQVJURUQpIHsKaWYgKCEkam9iWydwcm9jZXNzJ10tPmlzUnVubmluZygpKSB7CmNhbGxfdXNlcl9mdW5jKCRqb2JbJ3Jlc29sdmUnXSwgJGpvYlsncHJvY2VzcyddKTsKfQoKJGpvYlsncHJvY2VzcyddLT5jaGVja1RpbWVvdXQoKTsKfQoKaWYgKCR0aGlzLT5ydW5uaW5nSm9icyA8ICR0aGlzLT5tYXhKb2JzKSB7CmlmICgkam9iWydzdGF0dXMnXSA9PT0gc2VsZjo6U1RBVFVTX1FVRVVFRCkgewokdGhpcy0+c3RhcnRKb2IoJGpvYlsnaWQnXSk7Cn0KfQp9CgppZiAobnVsbCAhPT0gJGluZGV4KSB7CnJldHVybiAkdGhpcy0+am9ic1skaW5kZXhdWydzdGF0dXMnXSA8IHNlbGY6OlNUQVRVU19DT01QTEVURUQgPyAxIDogMDsKfQoKJGFjdGl2ZSA9IDA7CmZvcmVhY2ggKCR0aGlzLT5qb2JzIGFzICRqb2IpIHsKaWYgKCRqb2JbJ3N0YXR1cyddIDwgc2VsZjo6U1RBVFVTX0NPTVBMRVRFRCkgewokYWN0aXZlKys7Cn0gZWxzZSB7CnVuc2V0KCR0aGlzLT5qb2JzWyRqb2JbJ2lkJ11dKTsKfQp9CgpyZXR1cm4gJGFjdGl2ZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBtYXJrSm9iRG9uZSgpOiB2b2lkCnsKJHRoaXMtPnJ1bm5pbmdKb2JzLS07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzcGxpdExpbmVzKD9zdHJpbmcgJG91dHB1dCk6IGFycmF5CnsKJG91dHB1dCA9IHRyaW0oKHN0cmluZykgJG91dHB1dCk7CgpyZXR1cm4gJG91dHB1dCA9PT0gJycgPyBbXSA6IFByZWc6OnNwbGl0KCd7XHI/XG59JywgJG91dHB1dCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvck91dHB1dCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmVycm9yT3V0cHV0Owp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRpbWVvdXQoKTogaW50CnsKcmV0dXJuIHN0YXRpYzo6JHRpbWVvdXQ7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VGltZW91dChpbnQgJHRpbWVvdXQpOiB2b2lkCnsKc3RhdGljOjokdGltZW91dCA9ICR0aW1lb3V0Owp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlc2NhcGUoJGFyZ3VtZW50KTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6OmVzY2FwZUFyZ3VtZW50KCRhcmd1bWVudCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0Q29tbWFuZFJ1bigkY29tbWFuZCwgP3N0cmluZyAkY3dkLCBib29sICRhc3luYyk6IHZvaWQKewppZiAobnVsbCA9PT0gJHRoaXMtPmlvIHx8ICEkdGhpcy0+aW8tPmlzRGVidWcoKSkgewpyZXR1cm47Cn0KCiRjb21tYW5kU3RyaW5nID0gaXNfc3RyaW5nKCRjb21tYW5kKSA/ICRjb21tYW5kIDogaW1wbG9kZSgnICcsIGFycmF5X21hcChzZWxmOjpjbGFzcy4nOjplc2NhcGUnLCAkY29tbWFuZCkpOwokc2FmZUNvbW1hbmQgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3s6Ly8oP1A8dXNlcj5bXjovXHNdKyk6KD9QPHBhc3N3b3JkPlteQFxzL10rKUB9aScsIHN0YXRpYyBmdW5jdGlvbiAoJG0pOiBzdHJpbmcgewoKaWYgKFByZWc6OmlzTWF0Y2goJ3teKFthLWYwLTldezEyLH18Z2hbYS16XV9bYS16QS1aMC05X10rKSR9JywgJG1bJ3VzZXInXSkpIHsKcmV0dXJuICc6Ly8qKio6KioqQCc7Cn0KaWYgKFByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17MTIsfSR9JywgJG1bJ3VzZXInXSkpIHsKcmV0dXJuICc6Ly8qKio6KioqQCc7Cn0KCnJldHVybiAnOi8vJy4kbVsndXNlciddLic6KioqQCc7Cn0sICRjb21tYW5kU3RyaW5nKTsKJHNhZmVDb21tYW5kID0gUHJlZzo6cmVwbGFjZSgiey0tcGFzc3dvcmQgKC4qW15cXFxcXVwnKSB9IiwgJy0tcGFzc3dvcmQgXCcqKipcJyAnLCAkc2FmZUNvbW1hbmQpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0V4ZWN1dGluZycuKCRhc3luYyA/ICcgYXN5bmMnIDogJycpLicgY29tbWFuZCAoJy4oJGN3ZCA/OiAnQ1dEJykuJyk6ICcuJHNhZmVDb21tYW5kKTsKfQoKCgoKCgoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGVzY2FwZUFyZ3VtZW50KCRhcmd1bWVudCk6IHN0cmluZwp7CmlmICgnJyA9PT0gKCRhcmd1bWVudCA9IChzdHJpbmcpICRhcmd1bWVudCkpIHsKcmV0dXJuIGVzY2FwZXNoZWxsYXJnKCRhcmd1bWVudCk7Cn0KCmlmICghUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnJldHVybiAiJyIuc3RyX3JlcGxhY2UoIiciLCAiJ1xcJyciLCAkYXJndW1lbnQpLiInIjsKfQoKCgoKJGFyZ3VtZW50ID0gc3RydHIoJGFyZ3VtZW50LCBbCiJcbiIgPT4gJyAnLAoiXHV7ZmYwMn0iID0+ICciJywKIlx1ezAyYmF9IiA9PiAnIicsCiJcdXszMDFkfSIgPT4gJyInLAoiXHV7MzAxZX0iID0+ICciJywKIlx1ezAzMGV9IiA9PiAnIicsCiJcdXtmZjFhfSIgPT4gJzonLAoiXHV7MDU4OX0iID0+ICc6JywKIlx1ezIyMzZ9IiA9PiAnOicsCiJcdXtmZjBmfSIgPT4gJy8nLAoiXHV7MjA0NH0iID0+ICcvJywKIlx1ezIyMTV9IiA9PiAnLycsCiJcdXswMGI0fSIgPT4gJy8nLApdKTsKCgokcXVvdGUgPSBzdHJwYnJrKCRhcmd1bWVudCwgIiBcdCwiKSAhPT0gZmFsc2U7CiRhcmd1bWVudCA9IFByZWc6OnJlcGxhY2UoJy8oXFxcXCopIi8nLCAnJDEkMVxcIicsICRhcmd1bWVudCwgLTEsICRkcXVvdGVzKTsKJG1ldGEgPSAkZHF1b3RlcyA+IDAgfHwgUHJlZzo6aXNNYXRjaCgnLyVbXiVdKyV8IVteIV0rIS8nLCAkYXJndW1lbnQpOwoKaWYgKCEkbWV0YSAmJiAhJHF1b3RlKSB7CiRxdW90ZSA9IHN0cnBicmsoJGFyZ3VtZW50LCAnXiZ8PD4oKScpICE9PSBmYWxzZTsKfQoKaWYgKCRxdW90ZSkgewokYXJndW1lbnQgPSAnIicuUHJlZzo6cmVwbGFjZSgnLyhcXFxcKikkLycsICckMSQxJywgJGFyZ3VtZW50KS4nIic7Cn0KCmlmICgkbWV0YSkgewokYXJndW1lbnQgPSBQcmVnOjpyZXBsYWNlKCcvKFsiXiZ8PD4oKSVdKS8nLCAnXiQxJywgJGFyZ3VtZW50KTsKJGFyZ3VtZW50ID0gUHJlZzo6cmVwbGFjZSgnLyghKS8nLCAnXl4kMScsICRhcmd1bWVudCk7Cn0KCnJldHVybiAkYXJndW1lbnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXF1aXJlc0dpdERpckVudigkY29tbWFuZCk6IGJvb2wKewokY21kID0gIWlzX2FycmF5KCRjb21tYW5kKSA/IGV4cGxvZGUoJyAnLCAkY29tbWFuZCkgOiAkY29tbWFuZDsKaWYgKCRjbWRbMF0gIT09ICdnaXQnKSB7CnJldHVybiBmYWxzZTsKfQoKZm9yZWFjaCAoc2VsZjo6R0lUX0NNRFNfTkVFRF9HSVRfRElSIGFzICRnaXRDbWQpIHsKaWYgKGFycmF5X2ludGVyc2VjdCgkY21kLCAkZ2l0Q21kKSA9PT0gJGdpdENtZCkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEV4ZWN1dGFibGUoc3RyaW5nICRuYW1lKTogc3RyaW5nCnsKaWYgKFxpbl9hcnJheShzdHJ0b2xvd2VyKCRuYW1lKSwgc2VsZjo6QlVJTFRJTl9DTURfQ09NTUFORFMsIHRydWUpKSB7CnJldHVybiAkbmFtZTsKfQoKaWYgKCFpc3NldChzZWxmOjokZXhlY3V0YWJsZXNbJG5hbWVdKSkgewokcGF0aCA9IChuZXcgRXhlY3V0YWJsZUZpbmRlcigpKS0+ZmluZCgkbmFtZSwgJG5hbWUpOwppZiAoJHBhdGggIT09IG51bGwpIHsKc2VsZjo6JGV4ZWN1dGFibGVzWyRuYW1lXSA9ICRwYXRoOwp9Cn0KCnJldHVybiBzZWxmOjokZXhlY3V0YWJsZXNbJG5hbWVdID8/ICRuYW1lOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxQcm94eU1hbmFnZXI7CgoKCgoKCgpjbGFzcyBSZW1vdGVGaWxlc3lzdGVtCnsKCnByaXZhdGUgJGlvOwoKcHJpdmF0ZSAkY29uZmlnOwoKcHJpdmF0ZSAkc2NoZW1lOwoKcHJpdmF0ZSAkYnl0ZXNNYXg7Cgpwcml2YXRlICRvcmlnaW5Vcmw7Cgpwcml2YXRlICRmaWxlVXJsOwoKcHJpdmF0ZSAkZmlsZU5hbWU7Cgpwcml2YXRlICRyZXRyeSA9IGZhbHNlOwoKcHJpdmF0ZSAkcHJvZ3Jlc3M7Cgpwcml2YXRlICRsYXN0UHJvZ3Jlc3M7Cgpwcml2YXRlICRvcHRpb25zID0gW107Cgpwcml2YXRlICRkaXNhYmxlVGxzID0gZmFsc2U7Cgpwcml2YXRlICRsYXN0SGVhZGVyczsKCnByaXZhdGUgJHN0b3JlQXV0aCA9IGZhbHNlOwoKcHJpdmF0ZSAkYXV0aEhlbHBlcjsKCnByaXZhdGUgJGRlZ3JhZGVkTW9kZSA9IGZhbHNlOwoKcHJpdmF0ZSAkcmVkaXJlY3RzOwoKcHJpdmF0ZSAkbWF4UmVkaXJlY3RzID0gMjA7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBhcnJheSAkb3B0aW9ucyA9IFtdLCBib29sICRkaXNhYmxlVGxzID0gZmFsc2UsID9BdXRoSGVscGVyICRhdXRoSGVscGVyID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CgoKCmlmICgkZGlzYWJsZVRscyA9PT0gZmFsc2UpIHsKJHRoaXMtPm9wdGlvbnMgPSBTdHJlYW1Db250ZXh0RmFjdG9yeTo6Z2V0VGxzRGVmYXVsdHMoJG9wdGlvbnMsICRpbyk7Cn0gZWxzZSB7CiR0aGlzLT5kaXNhYmxlVGxzID0gdHJ1ZTsKfQoKCiR0aGlzLT5vcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJHRoaXMtPm9wdGlvbnMsICRvcHRpb25zKTsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5hdXRoSGVscGVyID0gJGF1dGhIZWxwZXIgPz8gbmV3IEF1dGhIZWxwZXIoJGlvLCAkY29uZmlnKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weShzdHJpbmcgJG9yaWdpblVybCwgc3RyaW5nICRmaWxlVXJsLCBzdHJpbmcgJGZpbGVOYW1lLCBib29sICRwcm9ncmVzcyA9IHRydWUsIGFycmF5ICRvcHRpb25zID0gW10pCnsKcmV0dXJuICR0aGlzLT5nZXQoJG9yaWdpblVybCwgJGZpbGVVcmwsICRvcHRpb25zLCAkZmlsZU5hbWUsICRwcm9ncmVzcyk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGVudHMoc3RyaW5nICRvcmlnaW5VcmwsIHN0cmluZyAkZmlsZVVybCwgYm9vbCAkcHJvZ3Jlc3MgPSB0cnVlLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CnJldHVybiAkdGhpcy0+Z2V0KCRvcmlnaW5VcmwsICRmaWxlVXJsLCAkb3B0aW9ucywgbnVsbCwgJHByb2dyZXNzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9ucygpCnsKcmV0dXJuICR0aGlzLT5vcHRpb25zOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9ucyhhcnJheSAkb3B0aW9ucykKewokdGhpcy0+b3B0aW9ucyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCR0aGlzLT5vcHRpb25zLCAkb3B0aW9ucyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVGxzRGlzYWJsZWQoKQp7CnJldHVybiAkdGhpcy0+ZGlzYWJsZVRscyA9PT0gdHJ1ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdEhlYWRlcnMoKQp7CnJldHVybiAkdGhpcy0+bGFzdEhlYWRlcnM7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbmRTdGF0dXNDb2RlKGFycmF5ICRoZWFkZXJzKQp7CiR2YWx1ZSA9IG51bGw7CmZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teSFRUUC9cUysgKFxkKyl9aScsICRoZWFkZXIsICRtYXRjaCkpIHsKCgokdmFsdWUgPSAoaW50KSAkbWF0Y2hbMV07Cn0KfQoKcmV0dXJuICR2YWx1ZTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kU3RhdHVzTWVzc2FnZShhcnJheSAkaGVhZGVycykKewokdmFsdWUgPSBudWxsOwpmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XkhUVFAvXFMrIFxkK31pJywgJGhlYWRlcikpIHsKCgokdmFsdWUgPSAkaGVhZGVyOwp9Cn0KCnJldHVybiAkdmFsdWU7Cn0KCgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldChzdHJpbmcgJG9yaWdpblVybCwgc3RyaW5nICRmaWxlVXJsLCBhcnJheSAkYWRkaXRpb25hbE9wdGlvbnMgPSBbXSwgP3N0cmluZyAkZmlsZU5hbWUgPSBudWxsLCBib29sICRwcm9ncmVzcyA9IHRydWUpCnsKJHRoaXMtPnNjaGVtZSA9IHBhcnNlX3VybChzdHJ0cigkZmlsZVVybCwgJ1xcJywgJy8nKSwgUEhQX1VSTF9TQ0hFTUUpOwokdGhpcy0+Ynl0ZXNNYXggPSAwOwokdGhpcy0+b3JpZ2luVXJsID0gJG9yaWdpblVybDsKJHRoaXMtPmZpbGVVcmwgPSAkZmlsZVVybDsKJHRoaXMtPmZpbGVOYW1lID0gJGZpbGVOYW1lOwokdGhpcy0+cHJvZ3Jlc3MgPSAkcHJvZ3Jlc3M7CiR0aGlzLT5sYXN0UHJvZ3Jlc3MgPSBudWxsOwokcmV0cnlBdXRoRmFpbHVyZSA9IHRydWU7CiR0aGlzLT5sYXN0SGVhZGVycyA9IFtdOwokdGhpcy0+cmVkaXJlY3RzID0gMTsgCgokdGVtcEFkZGl0aW9uYWxPcHRpb25zID0gJGFkZGl0aW9uYWxPcHRpb25zOwppZiAoaXNzZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmV0cnktYXV0aC1mYWlsdXJlJ10pKSB7CiRyZXRyeUF1dGhGYWlsdXJlID0gKGJvb2wpICR0ZW1wQWRkaXRpb25hbE9wdGlvbnNbJ3JldHJ5LWF1dGgtZmFpbHVyZSddOwoKdW5zZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmV0cnktYXV0aC1mYWlsdXJlJ10pOwp9CgokaXNSZWRpcmVjdCA9IGZhbHNlOwppZiAoaXNzZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmVkaXJlY3RzJ10pKSB7CiR0aGlzLT5yZWRpcmVjdHMgPSAkdGVtcEFkZGl0aW9uYWxPcHRpb25zWydyZWRpcmVjdHMnXTsKJGlzUmVkaXJlY3QgPSB0cnVlOwoKdW5zZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmVkaXJlY3RzJ10pOwp9Cgokb3B0aW9ucyA9ICR0aGlzLT5nZXRPcHRpb25zRm9yVXJsKCRvcmlnaW5VcmwsICR0ZW1wQWRkaXRpb25hbE9wdGlvbnMpOwp1bnNldCgkdGVtcEFkZGl0aW9uYWxPcHRpb25zKTsKCiRvcmlnRmlsZVVybCA9ICRmaWxlVXJsOwoKaWYgKGlzc2V0KCRvcHRpb25zWydwcmV2ZW50X2lwX2FjY2Vzc19jYWxsYWJsZSddKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIlJlbW90ZUZpbGVzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IHRoZSAncHJldmVudF9pcF9hY2Nlc3NfY2FsbGFibGUnIGNvbmZpZy4iKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydnaXRsYWItdG9rZW4nXSkpIHsKJGZpbGVVcmwgLj0gKGZhbHNlID09PSBzdHJwb3MoJGZpbGVVcmwsICc/JykgPyAnPycgOiAnJicpIC4gJ2FjY2Vzc190b2tlbj0nLiRvcHRpb25zWydnaXRsYWItdG9rZW4nXTsKdW5zZXQoJG9wdGlvbnNbJ2dpdGxhYi10b2tlbiddKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydodHRwJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2lnbm9yZV9lcnJvcnMnXSA9IHRydWU7Cn0KCmlmICgkdGhpcy0+ZGVncmFkZWRNb2RlICYmIHN0cnBvcygkZmlsZVVybCwgJ2h0dHA6Ly9yZXBvLnBhY2thZ2lzdC5vcmcvJykgPT09IDApIHsKCiRmaWxlVXJsID0gJ2h0dHA6Ly8nIC4gZ2V0aG9zdGJ5bmFtZSgncmVwby5wYWNrYWdpc3Qub3JnJykgLiBzdWJzdHIoJGZpbGVVcmwsIDIwKTsKJGRlZ3JhZGVkUGFja2FnaXN0ID0gdHJ1ZTsKfQoKJG1heEZpbGVTaXplID0gbnVsbDsKaWYgKGlzc2V0KCRvcHRpb25zWydtYXhfZmlsZV9zaXplJ10pKSB7CiRtYXhGaWxlU2l6ZSA9ICRvcHRpb25zWydtYXhfZmlsZV9zaXplJ107CnVuc2V0KCRvcHRpb25zWydtYXhfZmlsZV9zaXplJ10pOwp9CgokY3R4ID0gU3RyZWFtQ29udGV4dEZhY3Rvcnk6OmdldENvbnRleHQoJGZpbGVVcmwsICRvcHRpb25zLCBbJ25vdGlmaWNhdGlvbicgPT4gWyR0aGlzLCAnY2FsbGJhY2tHZXQnXV0pOwoKJHByb3h5ID0gUHJveHlNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpLT5nZXRQcm94eUZvclJlcXVlc3QoJGZpbGVVcmwpOwokdXNpbmdQcm94eSA9ICRwcm94eS0+Z2V0U3RhdHVzKCcgdXNpbmcgcHJveHkgKCVzKScpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoKHN0cnBvcygkb3JpZ0ZpbGVVcmwsICdodHRwJykgPT09IDAgPyAnRG93bmxvYWRpbmcgJyA6ICdSZWFkaW5nICcpIC4gVXJsOjpzYW5pdGl6ZSgkb3JpZ0ZpbGVVcmwpIC4gJHVzaW5nUHJveHksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CnVuc2V0KCRvcmlnRmlsZVVybCwgJHByb3h5LCAkdXNpbmdQcm94eSk7CgoKaWYgKCghUHJlZzo6aXNNYXRjaCgne15odHRwOi8vKHJlcG9cLik/cGFja2FnaXN0XC5vcmcvcC99JywgJGZpbGVVcmwpIHx8IChmYWxzZSA9PT0gc3RycG9zKCRmaWxlVXJsLCAnJCcpICYmIGZhbHNlID09PSBzdHJwb3MoJGZpbGVVcmwsICclMjQnKSkpICYmIGVtcHR5KCRkZWdyYWRlZFBhY2thZ2lzdCkpIHsKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkZmlsZVVybCwgJHRoaXMtPmlvKTsKfQoKaWYgKCR0aGlzLT5wcm9ncmVzcyAmJiAhJGlzUmVkaXJlY3QpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJEb3dubG9hZGluZyAoPGNvbW1lbnQ+Y29ubmVjdGluZy4uLjwvY29tbWVudD4pIiwgZmFsc2UpOwp9CgokZXJyb3JNZXNzYWdlID0gJyc7CiRlcnJvckNvZGUgPSAwOwokcmVzdWx0ID0gZmFsc2U7CnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJGNvZGUsICRtc2cpIHVzZSAoJiRlcnJvck1lc3NhZ2UpOiBib29sIHsKaWYgKCRlcnJvck1lc3NhZ2UpIHsKJGVycm9yTWVzc2FnZSAuPSAiXG4iOwp9CiRlcnJvck1lc3NhZ2UgLj0gUHJlZzo6cmVwbGFjZSgne15maWxlX2dldF9jb250ZW50c1woLio/XCk6IH0nLCAnJywgJG1zZyk7CgpyZXR1cm4gdHJ1ZTsKfSk7CiRodHRwX3Jlc3BvbnNlX2hlYWRlciA9IFtdOwp0cnkgewokcmVzdWx0ID0gJHRoaXMtPmdldFJlbW90ZUNvbnRlbnRzKCRvcmlnaW5VcmwsICRmaWxlVXJsLCAkY3R4LCAkaHR0cF9yZXNwb25zZV9oZWFkZXIsICRtYXhGaWxlU2l6ZSk7CgppZiAoIWVtcHR5KCRodHRwX3Jlc3BvbnNlX2hlYWRlclswXSkpIHsKJHN0YXR1c0NvZGUgPSBzZWxmOjpmaW5kU3RhdHVzQ29kZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIpOwppZiAoJHN0YXR1c0NvZGUgPj0gMzAwICYmIFJlc3BvbnNlOjpmaW5kSGVhZGVyVmFsdWUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyLCAnY29udGVudC10eXBlJykgPT09ICdhcHBsaWNhdGlvbi9qc29uJykgewpIdHRwRG93bmxvYWRlcjo6b3V0cHV0V2FybmluZ3MoJHRoaXMtPmlvLCAkb3JpZ2luVXJsLCBqc29uX2RlY29kZSgkcmVzdWx0LCB0cnVlKSk7Cn0KCmlmIChpbl9hcnJheSgkc3RhdHVzQ29kZSwgWzQwMSwgNDAzXSkgJiYgJHJldHJ5QXV0aEZhaWx1cmUpIHsKJHRoaXMtPnByb21wdEF1dGhBbmRSZXRyeSgkc3RhdHVzQ29kZSwgJHRoaXMtPmZpbmRTdGF0dXNNZXNzYWdlKCRodHRwX3Jlc3BvbnNlX2hlYWRlciksICRodHRwX3Jlc3BvbnNlX2hlYWRlcik7Cn0KfQoKJGNvbnRlbnRMZW5ndGggPSAhZW1wdHkoJGh0dHBfcmVzcG9uc2VfaGVhZGVyWzBdKSA/IFJlc3BvbnNlOjpmaW5kSGVhZGVyVmFsdWUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyLCAnY29udGVudC1sZW5ndGgnKSA6IG51bGw7CmlmICgkY29udGVudExlbmd0aCAmJiBQbGF0Zm9ybTo6c3RybGVuKCRyZXN1bHQpIDwgJGNvbnRlbnRMZW5ndGgpIHsKCiRlID0gbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignQ29udGVudC1MZW5ndGggbWlzbWF0Y2gsIHJlY2VpdmVkICcuUGxhdGZvcm06OnN0cmxlbigkcmVzdWx0KS4nIGJ5dGVzIG91dCBvZiB0aGUgZXhwZWN0ZWQgJy4kY29udGVudExlbmd0aCk7CiRlLT5zZXRIZWFkZXJzKCRodHRwX3Jlc3BvbnNlX2hlYWRlcik7CiRlLT5zZXRTdGF0dXNDb2RlKHNlbGY6OmZpbmRTdGF0dXNDb2RlKCRodHRwX3Jlc3BvbnNlX2hlYWRlcikpOwp0cnkgewokZS0+c2V0UmVzcG9uc2UoJHRoaXMtPmRlY29kZVJlc3VsdCgkcmVzdWx0LCAkaHR0cF9yZXNwb25zZV9oZWFkZXIpKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZGlzY2FyZGVkKSB7CiRlLT5zZXRSZXNwb25zZSgkdGhpcy0+bm9ybWFsaXplUmVzdWx0KCRyZXN1bHQpKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdDb250ZW50LUxlbmd0aCBtaXNtYXRjaCwgcmVjZWl2ZWQgJy5QbGF0Zm9ybTo6c3RybGVuKCRyZXN1bHQpLicgb3V0IG9mICcuJGNvbnRlbnRMZW5ndGguJyBieXRlczogKCcgLiBiYXNlNjRfZW5jb2RlKCRyZXN1bHQpLicpJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCnRocm93ICRlOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmICFlbXB0eSgkaHR0cF9yZXNwb25zZV9oZWFkZXJbMF0pKSB7CiRlLT5zZXRIZWFkZXJzKCRodHRwX3Jlc3BvbnNlX2hlYWRlcik7CiRlLT5zZXRTdGF0dXNDb2RlKHNlbGY6OmZpbmRTdGF0dXNDb2RlKCRodHRwX3Jlc3BvbnNlX2hlYWRlcikpOwp9CmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkcmVzdWx0ICE9PSBmYWxzZSkgewokZS0+c2V0UmVzcG9uc2UoJHRoaXMtPmRlY29kZVJlc3VsdCgkcmVzdWx0LCAkaHR0cF9yZXNwb25zZV9oZWFkZXIpKTsKfQokcmVzdWx0ID0gZmFsc2U7Cn0KaWYgKCRlcnJvck1lc3NhZ2UgJiYgIWZpbHRlcl92YXIoaW5pX2dldCgnYWxsb3dfdXJsX2ZvcGVuJyksIEZJTFRFUl9WQUxJREFURV9CT09MRUFOKSkgewokZXJyb3JNZXNzYWdlID0gJ2FsbG93X3VybF9mb3BlbiBtdXN0IGJlIGVuYWJsZWQgaW4gcGhwLmluaSAoJy4kZXJyb3JNZXNzYWdlLicpJzsKfQpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKaWYgKGlzc2V0KCRlKSAmJiAhJHRoaXMtPnJldHJ5KSB7CmlmICghJHRoaXMtPmRlZ3JhZGVkTW9kZSAmJiBmYWxzZSAhPT0gc3RycG9zKCRlLT5nZXRNZXNzYWdlKCksICdPcGVyYXRpb24gdGltZWQgb3V0JykpIHsKJHRoaXMtPmRlZ3JhZGVkTW9kZSA9IHRydWU7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCic8ZXJyb3I+Jy4kZS0+Z2V0TWVzc2FnZSgpLic8L2Vycm9yPicsCic8ZXJyb3I+UmV0cnlpbmcgd2l0aCBkZWdyYWRlZCBtb2RlLCBjaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kI2RlZ3JhZGVkLW1vZGUgZm9yIG1vcmUgaW5mbzwvZXJyb3I+JywKXSk7CgpyZXR1cm4gJHRoaXMtPmdldCgkdGhpcy0+b3JpZ2luVXJsLCAkdGhpcy0+ZmlsZVVybCwgJGFkZGl0aW9uYWxPcHRpb25zLCAkdGhpcy0+ZmlsZU5hbWUsICR0aGlzLT5wcm9ncmVzcyk7Cn0KCnRocm93ICRlOwp9Cgokc3RhdHVzQ29kZSA9IG51bGw7CiRjb250ZW50VHlwZSA9IG51bGw7CiRsb2NhdGlvbkhlYWRlciA9IG51bGw7CmlmICghZW1wdHkoJGh0dHBfcmVzcG9uc2VfaGVhZGVyWzBdKSkgewokc3RhdHVzQ29kZSA9IHNlbGY6OmZpbmRTdGF0dXNDb2RlKCRodHRwX3Jlc3BvbnNlX2hlYWRlcik7CiRjb250ZW50VHlwZSA9IFJlc3BvbnNlOjpmaW5kSGVhZGVyVmFsdWUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyLCAnY29udGVudC10eXBlJyk7CiRsb2NhdGlvbkhlYWRlciA9IFJlc3BvbnNlOjpmaW5kSGVhZGVyVmFsdWUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyLCAnbG9jYXRpb24nKTsKfQoKCmlmICgkb3JpZ2luVXJsID09PSAnYml0YnVja2V0Lm9yZycKJiYgISR0aGlzLT5hdXRoSGVscGVyLT5pc1B1YmxpY0JpdEJ1Y2tldERvd25sb2FkKCRmaWxlVXJsKQomJiBzdWJzdHIoJGZpbGVVcmwsIC00KSA9PT0gJy56aXAnCiYmICghJGxvY2F0aW9uSGVhZGVyIHx8IHN1YnN0cihwYXJzZV91cmwoJGxvY2F0aW9uSGVhZGVyLCBQSFBfVVJMX1BBVEgpLCAtNCkgIT09ICcuemlwJykKJiYgJGNvbnRlbnRUeXBlICYmIFByZWc6OmlzTWF0Y2goJ3tedGV4dC9odG1sXGJ9aScsICRjb250ZW50VHlwZSkKKSB7CiRyZXN1bHQgPSBmYWxzZTsKaWYgKCRyZXRyeUF1dGhGYWlsdXJlKSB7CiR0aGlzLT5wcm9tcHRBdXRoQW5kUmV0cnkoNDAxKTsKfQp9CgoKaWYgKCRzdGF0dXNDb2RlID09PSA0MDQKJiYgaW5fYXJyYXkoJG9yaWdpblVybCwgJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKQomJiBmYWxzZSAhPT0gc3RycG9zKCRmaWxlVXJsLCAnYXJjaGl2ZS56aXAnKQopIHsKJHJlc3VsdCA9IGZhbHNlOwppZiAoJHJldHJ5QXV0aEZhaWx1cmUpIHsKJHRoaXMtPnByb21wdEF1dGhBbmRSZXRyeSg0MDEpOwp9Cn0KCgokaGFzRm9sbG93ZWRSZWRpcmVjdCA9IGZhbHNlOwppZiAoJHN0YXR1c0NvZGUgPj0gMzAwICYmICRzdGF0dXNDb2RlIDw9IDM5OSAmJiAkc3RhdHVzQ29kZSAhPT0gMzA0ICYmICR0aGlzLT5yZWRpcmVjdHMgPCAkdGhpcy0+bWF4UmVkaXJlY3RzKSB7CiRoYXNGb2xsb3dlZFJlZGlyZWN0ID0gdHJ1ZTsKJHJlc3VsdCA9ICR0aGlzLT5oYW5kbGVSZWRpcmVjdCgkaHR0cF9yZXNwb25zZV9oZWFkZXIsICRhZGRpdGlvbmFsT3B0aW9ucywgJHJlc3VsdCk7Cn0KCgppZiAoJHN0YXR1c0NvZGUgJiYgJHN0YXR1c0NvZGUgPj0gNDAwICYmICRzdGF0dXNDb2RlIDw9IDU5OSkgewppZiAoISR0aGlzLT5yZXRyeSkgewppZiAoJHRoaXMtPnByb2dyZXNzICYmICEkaXNSZWRpcmVjdCkgewokdGhpcy0+aW8tPm92ZXJ3cml0ZUVycm9yKCJEb3dubG9hZGluZyAoPGVycm9yPmZhaWxlZDwvZXJyb3I+KSIsIGZhbHNlKTsKfQoKJGUgPSBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgIicuJHRoaXMtPmZpbGVVcmwuJyIgZmlsZSBjb3VsZCBub3QgYmUgZG93bmxvYWRlZCAoJy4kaHR0cF9yZXNwb25zZV9oZWFkZXJbMF0uJyknLCAkc3RhdHVzQ29kZSk7CiRlLT5zZXRIZWFkZXJzKCRodHRwX3Jlc3BvbnNlX2hlYWRlcik7CiRlLT5zZXRSZXNwb25zZSgkdGhpcy0+ZGVjb2RlUmVzdWx0KCRyZXN1bHQsICRodHRwX3Jlc3BvbnNlX2hlYWRlcikpOwokZS0+c2V0U3RhdHVzQ29kZSgkc3RhdHVzQ29kZSk7CnRocm93ICRlOwp9CiRyZXN1bHQgPSBmYWxzZTsKfQoKaWYgKCR0aGlzLT5wcm9ncmVzcyAmJiAhJHRoaXMtPnJldHJ5ICYmICEkaXNSZWRpcmVjdCkgewokdGhpcy0+aW8tPm92ZXJ3cml0ZUVycm9yKCJEb3dubG9hZGluZyAoIi4oJHJlc3VsdCA9PT0gZmFsc2UgPyAnPGVycm9yPmZhaWxlZDwvZXJyb3I+JyA6ICc8Y29tbWVudD4xMDAlPC9jb21tZW50PicpLiIpIiwgZmFsc2UpOwp9CgoKaWYgKCRyZXN1bHQgJiYgZXh0ZW5zaW9uX2xvYWRlZCgnemxpYicpICYmIHN0cnBvcygkZmlsZVVybCwgJ2h0dHAnKSA9PT0gMCAmJiAhJGhhc0ZvbGxvd2VkUmVkaXJlY3QpIHsKdHJ5IHsKJHJlc3VsdCA9ICR0aGlzLT5kZWNvZGVSZXN1bHQoJHJlc3VsdCwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJHRoaXMtPmRlZ3JhZGVkTW9kZSkgewp0aHJvdyAkZTsKfQoKJHRoaXMtPmRlZ3JhZGVkTW9kZSA9IHRydWU7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCicnLAonPGVycm9yPkZhaWxlZCB0byBkZWNvZGUgcmVzcG9uc2U6ICcuJGUtPmdldE1lc3NhZ2UoKS4nPC9lcnJvcj4nLAonPGVycm9yPlJldHJ5aW5nIHdpdGggZGVncmFkZWQgbW9kZSwgY2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL3Ryb3VibGVzaG9vdGluZy5tZCNkZWdyYWRlZC1tb2RlIGZvciBtb3JlIGluZm88L2Vycm9yPicsCl0pOwoKcmV0dXJuICR0aGlzLT5nZXQoJHRoaXMtPm9yaWdpblVybCwgJHRoaXMtPmZpbGVVcmwsICRhZGRpdGlvbmFsT3B0aW9ucywgJHRoaXMtPmZpbGVOYW1lLCAkdGhpcy0+cHJvZ3Jlc3MpOwp9Cn0KCgppZiAoZmFsc2UgIT09ICRyZXN1bHQgJiYgbnVsbCAhPT0gJGZpbGVOYW1lICYmICEkaXNSZWRpcmVjdCkgewppZiAoJycgPT09ICRyZXN1bHQpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignIicuJHRoaXMtPmZpbGVVcmwuJyIgYXBwZWFycyBicm9rZW4sIGFuZCByZXR1cm5lZCBhbiBlbXB0eSAyMDAgcmVzcG9uc2UnKTsKfQoKJGVycm9yTWVzc2FnZSA9ICcnOwpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCRjb2RlLCAkbXNnKSB1c2UgKCYkZXJyb3JNZXNzYWdlKTogYm9vbCB7CmlmICgkZXJyb3JNZXNzYWdlKSB7CiRlcnJvck1lc3NhZ2UgLj0gIlxuIjsKfQokZXJyb3JNZXNzYWdlIC49IFByZWc6OnJlcGxhY2UoJ3teZmlsZV9wdXRfY29udGVudHNcKC4qP1wpOiB9JywgJycsICRtc2cpOwoKcmV0dXJuIHRydWU7Cn0pOwokcmVzdWx0ID0gKGJvb2wpIGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlTmFtZSwgJHJlc3VsdCk7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwppZiAoZmFsc2UgPT09ICRyZXN1bHQpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVGhlICInLiR0aGlzLT5maWxlVXJsLiciIGZpbGUgY291bGQgbm90IGJlIHdyaXR0ZW4gdG8gJy4kZmlsZU5hbWUuJzogJy4kZXJyb3JNZXNzYWdlKTsKfQp9CgppZiAoJHRoaXMtPnJldHJ5KSB7CiR0aGlzLT5yZXRyeSA9IGZhbHNlOwoKJHJlc3VsdCA9ICR0aGlzLT5nZXQoJHRoaXMtPm9yaWdpblVybCwgJHRoaXMtPmZpbGVVcmwsICRhZGRpdGlvbmFsT3B0aW9ucywgJHRoaXMtPmZpbGVOYW1lLCAkdGhpcy0+cHJvZ3Jlc3MpOwoKaWYgKCR0aGlzLT5zdG9yZUF1dGgpIHsKJHRoaXMtPmF1dGhIZWxwZXItPnN0b3JlQXV0aCgkdGhpcy0+b3JpZ2luVXJsLCAkdGhpcy0+c3RvcmVBdXRoKTsKJHRoaXMtPnN0b3JlQXV0aCA9IGZhbHNlOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKaWYgKGZhbHNlID09PSAkcmVzdWx0KSB7CiRlID0gbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVGhlICInLiR0aGlzLT5maWxlVXJsLiciIGZpbGUgY291bGQgbm90IGJlIGRvd25sb2FkZWQ6ICcuJGVycm9yTWVzc2FnZSwgJGVycm9yQ29kZSk7CmlmICghZW1wdHkoJGh0dHBfcmVzcG9uc2VfaGVhZGVyWzBdKSkgewokZS0+c2V0SGVhZGVycygkaHR0cF9yZXNwb25zZV9oZWFkZXIpOwp9CgppZiAoISR0aGlzLT5kZWdyYWRlZE1vZGUgJiYgZmFsc2UgIT09IHN0cnBvcygkZS0+Z2V0TWVzc2FnZSgpLCAnT3BlcmF0aW9uIHRpbWVkIG91dCcpKSB7CiR0aGlzLT5kZWdyYWRlZE1vZGUgPSB0cnVlOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJycpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoWwonPGVycm9yPicuJGUtPmdldE1lc3NhZ2UoKS4nPC9lcnJvcj4nLAonPGVycm9yPlJldHJ5aW5nIHdpdGggZGVncmFkZWQgbW9kZSwgY2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL3Ryb3VibGVzaG9vdGluZy5tZCNkZWdyYWRlZC1tb2RlIGZvciBtb3JlIGluZm88L2Vycm9yPicsCl0pOwoKcmV0dXJuICR0aGlzLT5nZXQoJHRoaXMtPm9yaWdpblVybCwgJHRoaXMtPmZpbGVVcmwsICRhZGRpdGlvbmFsT3B0aW9ucywgJHRoaXMtPmZpbGVOYW1lLCAkdGhpcy0+cHJvZ3Jlc3MpOwp9Cgp0aHJvdyAkZTsKfQoKaWYgKCFlbXB0eSgkaHR0cF9yZXNwb25zZV9oZWFkZXJbMF0pKSB7CiR0aGlzLT5sYXN0SGVhZGVycyA9ICRodHRwX3Jlc3BvbnNlX2hlYWRlcjsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UmVtb3RlQ29udGVudHMoc3RyaW5nICRvcmlnaW5VcmwsIHN0cmluZyAkZmlsZVVybCwgJGNvbnRleHQsID9hcnJheSAmJHJlc3BvbnNlSGVhZGVycyA9IG51bGwsID9pbnQgJG1heEZpbGVTaXplID0gbnVsbCkKewokcmVzdWx0ID0gZmFsc2U7Cgp0cnkgewokZSA9IG51bGw7CmlmICgkbWF4RmlsZVNpemUgIT09IG51bGwpIHsKJHJlc3VsdCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlVXJsLCBmYWxzZSwgJGNvbnRleHQsIDAsICRtYXhGaWxlU2l6ZSk7Cn0gZWxzZSB7CgokcmVzdWx0ID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGVVcmwsIGZhbHNlLCAkY29udGV4dCk7Cn0KfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewp9CgppZiAoJHJlc3VsdCAhPT0gZmFsc2UgJiYgJG1heEZpbGVTaXplICE9PSBudWxsICYmIFBsYXRmb3JtOjpzdHJsZW4oJHJlc3VsdCkgPj0gJG1heEZpbGVTaXplKSB7CnRocm93IG5ldyBNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uKCdNYXhpbXVtIGFsbG93ZWQgZG93bmxvYWQgc2l6ZSByZWFjaGVkLiBEb3dubG9hZGVkICcgLiBQbGF0Zm9ybTo6c3RybGVuKCRyZXN1bHQpIC4gJyBvZiBhbGxvd2VkICcgLiAkbWF4RmlsZVNpemUgLiAnIGJ5dGVzJyk7Cn0KCgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwNDAwKSB7CiRyZXNwb25zZUhlYWRlcnMgPSBodHRwX2dldF9sYXN0X3Jlc3BvbnNlX2hlYWRlcnMoKTsKaHR0cF9jbGVhcl9sYXN0X3Jlc3BvbnNlX2hlYWRlcnMoKTsKfSBlbHNlIHsKJHJlc3BvbnNlSGVhZGVycyA9ICRodHRwX3Jlc3BvbnNlX2hlYWRlciA/PyBbXTsKfQoKaWYgKG51bGwgIT09ICRlKSB7CnRocm93ICRlOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2FsbGJhY2tHZXQoaW50ICRub3RpZmljYXRpb25Db2RlLCBpbnQgJHNldmVyaXR5LCA/c3RyaW5nICRtZXNzYWdlLCBpbnQgJG1lc3NhZ2VDb2RlLCBpbnQgJGJ5dGVzVHJhbnNmZXJyZWQsIGludCAkYnl0ZXNNYXgpCnsKc3dpdGNoICgkbm90aWZpY2F0aW9uQ29kZSkgewpjYXNlIFNUUkVBTV9OT1RJRllfRkFJTFVSRToKaWYgKDQwMCA9PT0gJG1lc3NhZ2VDb2RlKSB7CgoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbigiVGhlICciIC4gJHRoaXMtPmZpbGVVcmwgLiAiJyBVUkwgY291bGQgbm90IGJlIGFjY2Vzc2VkOiAiIC4gJG1lc3NhZ2UsICRtZXNzYWdlQ29kZSk7Cn0KYnJlYWs7CgpjYXNlIFNUUkVBTV9OT1RJRllfRklMRV9TSVpFX0lTOgokdGhpcy0+Ynl0ZXNNYXggPSAkYnl0ZXNNYXg7CmJyZWFrOwoKY2FzZSBTVFJFQU1fTk9USUZZX1BST0dSRVNTOgppZiAoJHRoaXMtPmJ5dGVzTWF4ID4gMCAmJiAkdGhpcy0+cHJvZ3Jlc3MpIHsKJHByb2dyZXNzaW9uID0gbWluKDEwMCwgKGludCkgcm91bmQoJGJ5dGVzVHJhbnNmZXJyZWQgLyAkdGhpcy0+Ynl0ZXNNYXggKiAxMDApKTsKCmlmICgoMCA9PT0gJHByb2dyZXNzaW9uICUgNSkgJiYgMTAwICE9PSAkcHJvZ3Jlc3Npb24gJiYgJHByb2dyZXNzaW9uICE9PSAkdGhpcy0+bGFzdFByb2dyZXNzKSB7CiR0aGlzLT5sYXN0UHJvZ3Jlc3MgPSAkcHJvZ3Jlc3Npb247CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoIkRvd25sb2FkaW5nICg8Y29tbWVudD4kcHJvZ3Jlc3Npb24lPC9jb21tZW50PikiLCBmYWxzZSk7Cn0KfQpicmVhazsKCmRlZmF1bHQ6CmJyZWFrOwp9Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcm9tcHRBdXRoQW5kUmV0cnkoJGh0dHBTdGF0dXMsID9zdHJpbmcgJHJlYXNvbiA9IG51bGwsIGFycmF5ICRoZWFkZXJzID0gW10pCnsKJHJlc3VsdCA9ICR0aGlzLT5hdXRoSGVscGVyLT5wcm9tcHRBdXRoSWZOZWVkZWQoJHRoaXMtPmZpbGVVcmwsICR0aGlzLT5vcmlnaW5VcmwsICRodHRwU3RhdHVzLCAkcmVhc29uLCAkaGVhZGVycywgMSApOwoKJHRoaXMtPnN0b3JlQXV0aCA9ICRyZXN1bHRbJ3N0b3JlQXV0aCddOwokdGhpcy0+cmV0cnkgPSAkcmVzdWx0WydyZXRyeSddOwoKaWYgKCR0aGlzLT5yZXRyeSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdSRVRSWScpOwp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldE9wdGlvbnNGb3JVcmwoc3RyaW5nICRvcmlnaW5VcmwsIGFycmF5ICRhZGRpdGlvbmFsT3B0aW9ucykKewokdGxzT3B0aW9ucyA9IFtdOwokaGVhZGVycyA9IFtdOwoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ3psaWInKSkgewokaGVhZGVyc1tdID0gJ0FjY2VwdC1FbmNvZGluZzogZ3ppcCc7Cn0KCiRvcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJHRoaXMtPm9wdGlvbnMsICR0bHNPcHRpb25zLCAkYWRkaXRpb25hbE9wdGlvbnMpOwppZiAoISR0aGlzLT5kZWdyYWRlZE1vZGUpIHsKCgokb3B0aW9uc1snaHR0cCddWydwcm90b2NvbF92ZXJzaW9uJ10gPSAxLjE7CiRoZWFkZXJzW10gPSAnQ29ubmVjdGlvbjogY2xvc2UnOwp9CgokaGVhZGVycyA9ICR0aGlzLT5hdXRoSGVscGVyLT5hZGRBdXRoZW50aWNhdGlvbkhlYWRlcigkaGVhZGVycywgJG9yaWdpblVybCwgJHRoaXMtPmZpbGVVcmwpOwoKJG9wdGlvbnNbJ2h0dHAnXVsnZm9sbG93X2xvY2F0aW9uJ10gPSAwOwoKaWYgKGlzc2V0KCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSAmJiAhaXNfYXJyYXkoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gZXhwbG9kZSgiXHJcbiIsIHRyaW0oJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10sICJcclxuIikpOwp9CmZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ11bXSA9ICRoZWFkZXI7Cn0KCnJldHVybiAkb3B0aW9uczsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaGFuZGxlUmVkaXJlY3QoYXJyYXkgJGh0dHBfcmVzcG9uc2VfaGVhZGVyLCBhcnJheSAkYWRkaXRpb25hbE9wdGlvbnMsICRyZXN1bHQpCnsKaWYgKCRsb2NhdGlvbkhlYWRlciA9IFJlc3BvbnNlOjpmaW5kSGVhZGVyVmFsdWUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyLCAnbG9jYXRpb24nKSkgewppZiAocGFyc2VfdXJsKCRsb2NhdGlvbkhlYWRlciwgUEhQX1VSTF9TQ0hFTUUpKSB7CgokdGFyZ2V0VXJsID0gJGxvY2F0aW9uSGVhZGVyOwp9IGVsc2VpZiAocGFyc2VfdXJsKCRsb2NhdGlvbkhlYWRlciwgUEhQX1VSTF9IT1NUKSkgewoKJHRhcmdldFVybCA9ICR0aGlzLT5zY2hlbWUuJzonLiRsb2NhdGlvbkhlYWRlcjsKfSBlbHNlaWYgKCcvJyA9PT0gJGxvY2F0aW9uSGVhZGVyWzBdKSB7CgokdXJsSG9zdCA9IHBhcnNlX3VybCgkdGhpcy0+ZmlsZVVybCwgUEhQX1VSTF9IT1NUKTsKCgokdGFyZ2V0VXJsID0gUHJlZzo6cmVwbGFjZSgne14oLisoPzovL3xAKScucHJlZ19xdW90ZSgkdXJsSG9zdCkuJyg/OjpcZCspPykoPzpbL1w/XS4qKT8kfScsICdcMScuJGxvY2F0aW9uSGVhZGVyLCAkdGhpcy0+ZmlsZVVybCk7Cn0gZWxzZSB7CgoKJHRhcmdldFVybCA9IFByZWc6OnJlcGxhY2UoJ3teKC4rLylbXi8/XSooPzpcPy4qKT8kfScsICdcMScuJGxvY2F0aW9uSGVhZGVyLCAkdGhpcy0+ZmlsZVVybCk7Cn0KfQoKaWYgKCFlbXB0eSgkdGFyZ2V0VXJsKSkgewokdGhpcy0+cmVkaXJlY3RzKys7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJycsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdGb2xsb3dpbmcgcmVkaXJlY3QgKCV1KSAlcycsICR0aGlzLT5yZWRpcmVjdHMsIFVybDo6c2FuaXRpemUoJHRhcmdldFVybCkpLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKJGFkZGl0aW9uYWxPcHRpb25zWydyZWRpcmVjdHMnXSA9ICR0aGlzLT5yZWRpcmVjdHM7CgpyZXR1cm4gJHRoaXMtPmdldChwYXJzZV91cmwoJHRhcmdldFVybCwgUEhQX1VSTF9IT1NUKSwgJHRhcmdldFVybCwgJGFkZGl0aW9uYWxPcHRpb25zLCAkdGhpcy0+ZmlsZU5hbWUsICR0aGlzLT5wcm9ncmVzcyk7Cn0KCmlmICghJHRoaXMtPnJldHJ5KSB7CiRlID0gbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVGhlICInLiR0aGlzLT5maWxlVXJsLiciIGZpbGUgY291bGQgbm90IGJlIGRvd25sb2FkZWQsIGdvdCByZWRpcmVjdCB3aXRob3V0IExvY2F0aW9uICgnLiRodHRwX3Jlc3BvbnNlX2hlYWRlclswXS4nKScpOwokZS0+c2V0SGVhZGVycygkaHR0cF9yZXNwb25zZV9oZWFkZXIpOwokZS0+c2V0UmVzcG9uc2UoJHRoaXMtPmRlY29kZVJlc3VsdCgkcmVzdWx0LCAkaHR0cF9yZXNwb25zZV9oZWFkZXIpKTsKCnRocm93ICRlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRlY29kZVJlc3VsdCgkcmVzdWx0LCBhcnJheSAkaHR0cF9yZXNwb25zZV9oZWFkZXIpOiA/c3RyaW5nCnsKCmlmICgkcmVzdWx0ICYmIGV4dGVuc2lvbl9sb2FkZWQoJ3psaWInKSkgewokY29udGVudEVuY29kaW5nID0gUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIsICdjb250ZW50LWVuY29kaW5nJyk7CiRkZWNvZGUgPSAkY29udGVudEVuY29kaW5nICYmICdnemlwJyA9PT0gc3RydG9sb3dlcigkY29udGVudEVuY29kaW5nKTsKCmlmICgkZGVjb2RlKSB7CiRyZXN1bHQgPSB6bGliX2RlY29kZSgkcmVzdWx0KTsKCmlmICgkcmVzdWx0ID09PSBmYWxzZSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdGYWlsZWQgdG8gZGVjb2RlIHpsaWIgc3RyZWFtJyk7Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPm5vcm1hbGl6ZVJlc3VsdCgkcmVzdWx0KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBub3JtYWxpemVSZXN1bHQoJHJlc3VsdCk6ID9zdHJpbmcKewppZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkcmVzdWx0Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7CgoKCgoKCmNsYXNzIFNpbGVuY2VyCnsKCgoKcHJpdmF0ZSBzdGF0aWMgJHN0YWNrID0gW107CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHByZXNzKD9pbnQgJG1hc2sgPSBudWxsKTogaW50CnsKaWYgKCFpc3NldCgkbWFzaykpIHsKJG1hc2sgPSBFX1dBUk5JTkcgfCBFX05PVElDRSB8IEVfVVNFUl9XQVJOSU5HIHwgRV9VU0VSX05PVElDRSB8IEVfREVQUkVDQVRFRCB8IEVfVVNFUl9ERVBSRUNBVEVEOwp9CiRvbGQgPSBlcnJvcl9yZXBvcnRpbmcoKTsKc2VsZjo6JHN0YWNrW10gPSAkb2xkOwplcnJvcl9yZXBvcnRpbmcoJG9sZCAmIH4kbWFzayk7CgpyZXR1cm4gJG9sZDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0b3JlKCk6IHZvaWQKewppZiAoIWVtcHR5KHNlbGY6OiRzdGFjaykpIHsKZXJyb3JfcmVwb3J0aW5nKGFycmF5X3BvcChzZWxmOjokc3RhY2spKTsKfQp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2FsbChjYWxsYWJsZSAkY2FsbGFibGUsIC4uLiRwYXJhbWV0ZXJzKQp7CnRyeSB7CnNlbGY6OnN1cHByZXNzKCk7CiRyZXN1bHQgPSAkY2FsbGFibGUoLi4uJHBhcmFtZXRlcnMpOwpzZWxmOjpyZXN0b3JlKCk7CgpyZXR1cm4gJHJlc3VsdDsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewoKc2VsZjo6cmVzdG9yZSgpOwp0aHJvdyAkZTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxDYUJ1bmRsZVxDYUJ1bmRsZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUHJveHlNYW5hZ2VyOwp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CgoKCgoKCgpmaW5hbCBjbGFzcyBTdHJlYW1Db250ZXh0RmFjdG9yeQp7CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENvbnRleHQoc3RyaW5nICR1cmwsIGFycmF5ICRkZWZhdWx0T3B0aW9ucyA9IFtdLCBhcnJheSAkZGVmYXVsdFBhcmFtcyA9IFtdKQp7CiRvcHRpb25zID0gWydodHRwJyA9PiBbCgonZm9sbG93X2xvY2F0aW9uJyA9PiAxLAonbWF4X3JlZGlyZWN0cycgPT4gMjAsCl1dOwoKJG9wdGlvbnMgPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkb3B0aW9ucywgc2VsZjo6aW5pdE9wdGlvbnMoJHVybCwgJGRlZmF1bHRPcHRpb25zKSk7CnVuc2V0KCRkZWZhdWx0T3B0aW9uc1snaHR0cCddWydoZWFkZXInXSk7CiRvcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJG9wdGlvbnMsICRkZWZhdWx0T3B0aW9ucyk7CgppZiAoaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gc2VsZjo6Zml4SHR0cEhlYWRlckZpZWxkKCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKTsKfQoKcmV0dXJuIHN0cmVhbV9jb250ZXh0X2NyZWF0ZSgkb3B0aW9ucywgJGRlZmF1bHRQYXJhbXMpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbml0T3B0aW9ucyhzdHJpbmcgJHVybCwgYXJyYXkgJG9wdGlvbnMsIGJvb2wgJGZvckN1cmwgPSBmYWxzZSk6IGFycmF5CnsKCmlmICghaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gW107Cn0KaWYgKGlzX3N0cmluZygkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSBleHBsb2RlKCJcclxuIiwgJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pOwp9CgoKaWYgKCEkZm9yQ3VybCkgewokcHJveHkgPSBQcm94eU1hbmFnZXI6OmdldEluc3RhbmNlKCktPmdldFByb3h5Rm9yUmVxdWVzdCgkdXJsKTsKJHByb3h5T3B0aW9ucyA9ICRwcm94eS0+Z2V0Q29udGV4dE9wdGlvbnMoKTsKaWYgKCRwcm94eU9wdGlvbnMgIT09IG51bGwpIHsKJGlzSHR0cHNSZXF1ZXN0ID0gMCA9PT0gc3RycG9zKCR1cmwsICdodHRwczovLycpOwoKaWYgKCRwcm94eS0+aXNTZWN1cmUoKSkgewppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdZb3UgbXVzdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uIHRvIHVzZSBhIHNlY3VyZSBwcm94eS4nKTsKfQppZiAoJGlzSHR0cHNSZXF1ZXN0KSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1lvdSBtdXN0IGVuYWJsZSB0aGUgY3VybCBleHRlbnNpb24gdG8gbWFrZSBodHRwcyByZXF1ZXN0cyB0aHJvdWdoIGEgc2VjdXJlIHByb3h5LicpOwp9Cn0gZWxzZWlmICgkaXNIdHRwc1JlcXVlc3QgJiYgIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdZb3UgbXVzdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uIHRvIG1ha2UgaHR0cHMgcmVxdWVzdHMgdGhyb3VnaCBhIHByb3h5LicpOwp9CgoKaWYgKGlzc2V0KCRwcm94eU9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddW10gPSAkcHJveHlPcHRpb25zWydodHRwJ11bJ2hlYWRlciddOwp1bnNldCgkcHJveHlPcHRpb25zWydodHRwJ11bJ2hlYWRlciddKTsKfQokb3B0aW9ucyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCRvcHRpb25zLCAkcHJveHlPcHRpb25zKTsKfQp9CgppZiAoZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykpIHsKJHBocFZlcnNpb24gPSAnSEhWTSAnIC4gSEhWTV9WRVJTSU9OOwp9IGVsc2UgewokcGhwVmVyc2lvbiA9ICdQSFAgJyAuIFBIUF9NQUpPUl9WRVJTSU9OIC4gJy4nIC4gUEhQX01JTk9SX1ZFUlNJT04gLiAnLicgLiBQSFBfUkVMRUFTRV9WRVJTSU9OOwp9CgppZiAoJGZvckN1cmwpIHsKJGN1cmwgPSBjdXJsX3ZlcnNpb24oKTsKJGh0dHBWZXJzaW9uID0gJ2NVUkwgJy4kY3VybFsndmVyc2lvbiddOwp9IGVsc2UgewokaHR0cFZlcnNpb24gPSAnc3RyZWFtcyc7Cn0KCmlmICghaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pIHx8IGZhbHNlID09PSBzdHJpcG9zKGltcGxvZGUoJycsICRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSwgJ3VzZXItYWdlbnQnKSkgewokcGxhdGZvcm1QaHBWZXJzaW9uID0gUGxhdGZvcm1SZXBvc2l0b3J5OjpnZXRQbGF0Zm9ybVBocFZlcnNpb24oKTsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ11bXSA9IHNwcmludGYoCidVc2VyLUFnZW50OiBDb21wb3Nlci8lcyAoJXM7ICVzOyAlczsgJXMlcyVzKScsCkNvbXBvc2VyOjpnZXRWZXJzaW9uKCksCmZ1bmN0aW9uX2V4aXN0cygncGhwX3VuYW1lJykgPyBwaHBfdW5hbWUoJ3MnKSA6ICdVbmtub3duJywKZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKSA/IHBocF91bmFtZSgncicpIDogJ1Vua25vd24nLAokcGhwVmVyc2lvbiwKJGh0dHBWZXJzaW9uLAokcGxhdGZvcm1QaHBWZXJzaW9uID8gJzsgUGxhdGZvcm0tUEhQICcuJHBsYXRmb3JtUGhwVmVyc2lvbiA6ICcnLApQbGF0Zm9ybTo6Z2V0RW52KCdDSScpID8gJzsgQ0knIDogJycKKTsKfQoKcmV0dXJuICRvcHRpb25zOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VGxzRGVmYXVsdHMoYXJyYXkgJG9wdGlvbnMsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpOiBhcnJheQp7CiRjaXBoZXJzID0gaW1wbG9kZSgnOicsIFsKJ0VDREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NicsCidFQ0RIRS1FQ0RTQS1BRVMxMjgtR0NNLVNIQTI1NicsCidFQ0RIRS1SU0EtQUVTMjU2LUdDTS1TSEEzODQnLAonRUNESEUtRUNEU0EtQUVTMjU2LUdDTS1TSEEzODQnLAonREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NicsCidESEUtRFNTLUFFUzEyOC1HQ00tU0hBMjU2JywKJ2tFREgrQUVTR0NNJywKJ0VDREhFLVJTQS1BRVMxMjgtU0hBMjU2JywKJ0VDREhFLUVDRFNBLUFFUzEyOC1TSEEyNTYnLAonRUNESEUtUlNBLUFFUzEyOC1TSEEnLAonRUNESEUtRUNEU0EtQUVTMTI4LVNIQScsCidFQ0RIRS1SU0EtQUVTMjU2LVNIQTM4NCcsCidFQ0RIRS1FQ0RTQS1BRVMyNTYtU0hBMzg0JywKJ0VDREhFLVJTQS1BRVMyNTYtU0hBJywKJ0VDREhFLUVDRFNBLUFFUzI1Ni1TSEEnLAonREhFLVJTQS1BRVMxMjgtU0hBMjU2JywKJ0RIRS1SU0EtQUVTMTI4LVNIQScsCidESEUtRFNTLUFFUzEyOC1TSEEyNTYnLAonREhFLVJTQS1BRVMyNTYtU0hBMjU2JywKJ0RIRS1EU1MtQUVTMjU2LVNIQScsCidESEUtUlNBLUFFUzI1Ni1TSEEnLAonQUVTMTI4LUdDTS1TSEEyNTYnLAonQUVTMjU2LUdDTS1TSEEzODQnLAonQUVTMTI4LVNIQTI1NicsCidBRVMyNTYtU0hBMjU2JywKJ0FFUzEyOC1TSEEnLAonQUVTMjU2LVNIQScsCidBRVMnLAonQ0FNRUxMSUEnLAonREVTLUNCQzMtU0hBJywKJyFhTlVMTCcsCichZU5VTEwnLAonIUVYUE9SVCcsCichREVTJywKJyFSQzQnLAonIU1ENScsCichUFNLJywKJyFhRUNESCcsCichRURILURTUy1ERVMtQ0JDMy1TSEEnLAonIUVESC1SU0EtREVTLUNCQzMtU0hBJywKJyFLUkI1LURFUy1DQkMzLVNIQScsCl0pOwoKCgoKCgoKJGRlZmF1bHRzID0gWwonc3NsJyA9PiBbCidjaXBoZXJzJyA9PiAkY2lwaGVycywKJ3ZlcmlmeV9wZWVyJyA9PiB0cnVlLAondmVyaWZ5X2RlcHRoJyA9PiA3LAonU05JX2VuYWJsZWQnID0+IHRydWUsCidjYXB0dXJlX3BlZXJfY2VydCcgPT4gdHJ1ZSwKXSwKXTsKCmlmIChpc3NldCgkb3B0aW9uc1snc3NsJ10pKSB7CiRkZWZhdWx0c1snc3NsJ10gPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkZGVmYXVsdHNbJ3NzbCddLCAkb3B0aW9uc1snc3NsJ10pOwp9CgoKCgoKaWYgKCFpc3NldCgkZGVmYXVsdHNbJ3NzbCddWydjYWZpbGUnXSkgJiYgIWlzc2V0KCRkZWZhdWx0c1snc3NsJ11bJ2NhcGF0aCddKSkgewokcmVzdWx0ID0gQ2FCdW5kbGU6OmdldFN5c3RlbUNhUm9vdEJ1bmRsZVBhdGgoJGxvZ2dlcik7CgppZiAoaXNfZGlyKCRyZXN1bHQpKSB7CiRkZWZhdWx0c1snc3NsJ11bJ2NhcGF0aCddID0gJHJlc3VsdDsKfSBlbHNlIHsKJGRlZmF1bHRzWydzc2wnXVsnY2FmaWxlJ10gPSAkcmVzdWx0Owp9Cn0KCmlmIChpc3NldCgkZGVmYXVsdHNbJ3NzbCddWydjYWZpbGUnXSkgJiYgKCFGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRkZWZhdWx0c1snc3NsJ11bJ2NhZmlsZSddKSB8fCAhQ2FCdW5kbGU6OnZhbGlkYXRlQ2FGaWxlKCRkZWZhdWx0c1snc3NsJ11bJ2NhZmlsZSddLCAkbG9nZ2VyKSkpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVGhlIGNvbmZpZ3VyZWQgY2FmaWxlIHdhcyBub3QgdmFsaWQgb3IgY291bGQgbm90IGJlIHJlYWQuJyk7Cn0KCmlmIChpc3NldCgkZGVmYXVsdHNbJ3NzbCddWydjYXBhdGgnXSkgJiYgKCFpc19kaXIoJGRlZmF1bHRzWydzc2wnXVsnY2FwYXRoJ10pIHx8ICFGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRkZWZhdWx0c1snc3NsJ11bJ2NhcGF0aCddKSkpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVGhlIGNvbmZpZ3VyZWQgY2FwYXRoIHdhcyBub3QgdmFsaWQgb3IgY291bGQgbm90IGJlIHJlYWQuJyk7Cn0KCgoKCiRkZWZhdWx0c1snc3NsJ11bJ2Rpc2FibGVfY29tcHJlc3Npb24nXSA9IHRydWU7CgpyZXR1cm4gJGRlZmF1bHRzOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZml4SHR0cEhlYWRlckZpZWxkKCRoZWFkZXIpOiBhcnJheQp7CmlmICghaXNfYXJyYXkoJGhlYWRlcikpIHsKJGhlYWRlciA9IGV4cGxvZGUoIlxyXG4iLCAkaGVhZGVyKTsKfQp1YXNvcnQoJGhlYWRlciwgc3RhdGljIGZ1bmN0aW9uICgkZWwpOiBpbnQgewpyZXR1cm4gc3RyaXBvcygkZWwsICdjb250ZW50LXR5cGUnKSA9PT0gMCA/IDEgOiAtMTsKfSk7CgpyZXR1cm4gJGhlYWRlcjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCmNsYXNzIFN2bgp7CnByaXZhdGUgY29uc3QgTUFYX1FUWV9BVVRIX1RSSUVTID0gNTsKCgoKCnByb3RlY3RlZCAkY3JlZGVudGlhbHM7CgoKCgpwcm90ZWN0ZWQgJGhhc0F1dGg7CgoKCgpwcm90ZWN0ZWQgJGlvOwoKCgoKcHJvdGVjdGVkICR1cmw7CgoKCgpwcm90ZWN0ZWQgJGNhY2hlQ3JlZGVudGlhbHMgPSB0cnVlOwoKCgoKcHJvdGVjdGVkICRwcm9jZXNzOwoKCgoKcHJvdGVjdGVkICRxdHlBdXRoVHJpZXMgPSAwOwoKCgoKcHJvdGVjdGVkICRjb25maWc7CgoKCgpwcml2YXRlIHN0YXRpYyAkdmVyc2lvbjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHVybCwgSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpCnsKJHRoaXMtPnVybCA9ICR1cmw7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3MgPzogbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsZWFuRW52KCk6IHZvaWQKewoKUGxhdGZvcm06OmNsZWFyRW52KCdEWUxEX0xJQlJBUllfUEFUSCcpOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZShhcnJheSAkY29tbWFuZCwgc3RyaW5nICR1cmwsID9zdHJpbmcgJGN3ZCA9IG51bGwsID9zdHJpbmcgJHBhdGggPSBudWxsLCBib29sICR2ZXJib3NlID0gZmFsc2UpOiBzdHJpbmcKewoKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdXJsLCAkdGhpcy0+aW8pOwoKcmV0dXJuICR0aGlzLT5leGVjdXRlV2l0aEF1dGhSZXRyeSgkY29tbWFuZCwgJGN3ZCwgJHVybCwgJHBhdGgsICR2ZXJib3NlKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZUxvY2FsKGFycmF5ICRjb21tYW5kLCBzdHJpbmcgJHBhdGgsID9zdHJpbmcgJGN3ZCA9IG51bGwsIGJvb2wgJHZlcmJvc2UgPSBmYWxzZSk6IHN0cmluZwp7CgpyZXR1cm4gJHRoaXMtPmV4ZWN1dGVXaXRoQXV0aFJldHJ5KCRjb21tYW5kLCAkY3dkLCAnJywgJHBhdGgsICR2ZXJib3NlKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleGVjdXRlV2l0aEF1dGhSZXRyeShhcnJheSAkc3ZuQ29tbWFuZCwgP3N0cmluZyAkY3dkLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkcGF0aCwgYm9vbCAkdmVyYm9zZSk6ID9zdHJpbmcKewoKJGNvbW1hbmQgPSAkdGhpcy0+Z2V0Q29tbWFuZCgkc3ZuQ29tbWFuZCwgJHVybCwgJHBhdGgpOwoKJG91dHB1dCA9IG51bGw7CiRpbyA9ICR0aGlzLT5pbzsKJGhhbmRsZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCR0eXBlLCAkYnVmZmVyKSB1c2UgKCYkb3V0cHV0LCAkaW8sICR2ZXJib3NlKSB7CmlmICgkdHlwZSAhPT0gJ291dCcpIHsKcmV0dXJuIG51bGw7Cn0KaWYgKHN0cnBvcygkYnVmZmVyLCAnUmVkaXJlY3RpbmcgdG8gVVJMICcpID09PSAwKSB7CnJldHVybiBudWxsOwp9CiRvdXRwdXQgLj0gJGJ1ZmZlcjsKaWYgKCR2ZXJib3NlKSB7CiRpby0+d3JpdGVFcnJvcigkYnVmZmVyLCBmYWxzZSk7Cn0KfTsKJHN0YXR1cyA9ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkaGFuZGxlciwgJGN3ZCk7CmlmICgwID09PSAkc3RhdHVzKSB7CnJldHVybiAkb3V0cHV0Owp9CgokZXJyb3JPdXRwdXQgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKJGZ1bGxPdXRwdXQgPSB0cmltKGltcGxvZGUoIlxuIiwgWyRvdXRwdXQsICRlcnJvck91dHB1dF0pKTsKCgppZiAoZmFsc2UgPT09IHN0cmlwb3MoJGZ1bGxPdXRwdXQsICdDb3VsZCBub3QgYXV0aGVudGljYXRlIHRvIHNlcnZlcjonKQomJiBmYWxzZSA9PT0gc3RyaXBvcygkZnVsbE91dHB1dCwgJ2F1dGhvcml6YXRpb24gZmFpbGVkJykKJiYgZmFsc2UgPT09IHN0cmlwb3MoJGZ1bGxPdXRwdXQsICdzdm46IEUxNzAwMDE6JykKJiYgZmFsc2UgPT09IHN0cmlwb3MoJGZ1bGxPdXRwdXQsICdzdm46IEUyMTUwMDQ6JykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRmdWxsT3V0cHV0KTsKfQoKaWYgKCEkdGhpcy0+aGFzQXV0aCgpKSB7CiR0aGlzLT5kb0F1dGhEYW5jZSgpOwp9CgoKaWYgKCR0aGlzLT5xdHlBdXRoVHJpZXMrKyA8IHNlbGY6Ok1BWF9RVFlfQVVUSF9UUklFUykgewoKcmV0dXJuICR0aGlzLT5leGVjdXRlV2l0aEF1dGhSZXRyeSgkc3ZuQ29tbWFuZCwgJGN3ZCwgJHVybCwgJHBhdGgsICR2ZXJib3NlKTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAond3JvbmcgY3JlZGVudGlhbHMgcHJvdmlkZWQgKCcuJGZ1bGxPdXRwdXQuJyknCik7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRDYWNoZUNyZWRlbnRpYWxzKGJvb2wgJGNhY2hlQ3JlZGVudGlhbHMpOiB2b2lkCnsKJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMgPSAkY2FjaGVDcmVkZW50aWFsczsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvQXV0aERhbmNlKCk6IFN2bgp7CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKJ2NhbiBub3QgYXNrIGZvciBhdXRoZW50aWNhdGlvbiBpbiBub24gaW50ZXJhY3RpdmUgbW9kZScKKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJUaGUgU3VidmVyc2lvbiBzZXJ2ZXIgKHskdGhpcy0+dXJsfSkgcmVxdWVzdGVkIGNyZWRlbnRpYWxzOiIpOwoKJHRoaXMtPmhhc0F1dGggPSB0cnVlOwokdGhpcy0+Y3JlZGVudGlhbHMgPSBbCid1c2VybmFtZScgPT4gKHN0cmluZykgJHRoaXMtPmlvLT5hc2soIlVzZXJuYW1lOiAiLCAnJyksCidwYXNzd29yZCcgPT4gKHN0cmluZykgJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCJQYXNzd29yZDogIiksCl07CgokdGhpcy0+Y2FjaGVDcmVkZW50aWFscyA9ICR0aGlzLT5pby0+YXNrQ29uZmlybWF0aW9uKCJTaG91bGQgU3VidmVyc2lvbiBjYWNoZSB0aGVzZSBjcmVkZW50aWFscz8gKHllcy9ubykgIik7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb21tYW5kKGFycmF5ICRjbWQsIHN0cmluZyAkdXJsLCA/c3RyaW5nICRwYXRoID0gbnVsbCk6IGFycmF5CnsKJGNtZCA9IGFycmF5X21lcmdlKAokY21kLApbJy0tbm9uLWludGVyYWN0aXZlJ10sCiR0aGlzLT5nZXRDcmVkZW50aWFsQXJncygpLApbJy0tJywgJHVybF0KKTsKCmlmICgkcGF0aCAhPT0gbnVsbCkgewokY21kW10gPSAkcGF0aDsKfQoKcmV0dXJuICRjbWQ7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q3JlZGVudGlhbEFyZ3MoKTogYXJyYXkKewppZiAoISR0aGlzLT5oYXNBdXRoKCkpIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gYXJyYXlfbWVyZ2UoCiR0aGlzLT5nZXRBdXRoQ2FjaGVBcmdzKCksClsnLS11c2VybmFtZScsICR0aGlzLT5nZXRVc2VybmFtZSgpLCAnLS1wYXNzd29yZCcsICR0aGlzLT5nZXRQYXNzd29yZCgpXQopOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQYXNzd29yZCgpOiBzdHJpbmcKewppZiAoJHRoaXMtPmNyZWRlbnRpYWxzID09PSBudWxsKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oIk5vIHN2biBhdXRoIGRldGVjdGVkLiIpOwp9CgpyZXR1cm4gJHRoaXMtPmNyZWRlbnRpYWxzWydwYXNzd29yZCddOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRVc2VybmFtZSgpOiBzdHJpbmcKewppZiAoJHRoaXMtPmNyZWRlbnRpYWxzID09PSBudWxsKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oIk5vIHN2biBhdXRoIGRldGVjdGVkLiIpOwp9CgpyZXR1cm4gJHRoaXMtPmNyZWRlbnRpYWxzWyd1c2VybmFtZSddOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzQXV0aCgpOiBib29sCnsKaWYgKG51bGwgIT09ICR0aGlzLT5oYXNBdXRoKSB7CnJldHVybiAkdGhpcy0+aGFzQXV0aDsKfQoKaWYgKGZhbHNlID09PSAkdGhpcy0+Y3JlYXRlQXV0aEZyb21Db25maWcoKSkgewokdGhpcy0+Y3JlYXRlQXV0aEZyb21VcmwoKTsKfQoKcmV0dXJuIChib29sKSAkdGhpcy0+aGFzQXV0aDsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QXV0aENhY2hlQXJncygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Y2FjaGVDcmVkZW50aWFscyA/IFtdIDogWyctLW5vLWF1dGgtY2FjaGUnXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVBdXRoRnJvbUNvbmZpZygpOiBib29sCnsKaWYgKCEkdGhpcy0+Y29uZmlnLT5oYXMoJ2h0dHAtYmFzaWMnKSkgewpyZXR1cm4gJHRoaXMtPmhhc0F1dGggPSBmYWxzZTsKfQoKJGF1dGhDb25maWcgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2h0dHAtYmFzaWMnKTsKCiRob3N0ID0gcGFyc2VfdXJsKCR0aGlzLT51cmwsIFBIUF9VUkxfSE9TVCk7CmlmIChpc3NldCgkYXV0aENvbmZpZ1skaG9zdF0pKSB7CiR0aGlzLT5jcmVkZW50aWFscyA9IFsKJ3VzZXJuYW1lJyA9PiAkYXV0aENvbmZpZ1skaG9zdF1bJ3VzZXJuYW1lJ10sCidwYXNzd29yZCcgPT4gJGF1dGhDb25maWdbJGhvc3RdWydwYXNzd29yZCddLApdOwoKcmV0dXJuICR0aGlzLT5oYXNBdXRoID0gdHJ1ZTsKfQoKcmV0dXJuICR0aGlzLT5oYXNBdXRoID0gZmFsc2U7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlQXV0aEZyb21VcmwoKTogYm9vbAp7CiR1cmkgPSBwYXJzZV91cmwoJHRoaXMtPnVybCk7CmlmIChlbXB0eSgkdXJpWyd1c2VyJ10pKSB7CnJldHVybiAkdGhpcy0+aGFzQXV0aCA9IGZhbHNlOwp9CgokdGhpcy0+Y3JlZGVudGlhbHMgPSBbCid1c2VybmFtZScgPT4gJHVyaVsndXNlciddLAoncGFzc3dvcmQnID0+ICFlbXB0eSgkdXJpWydwYXNzJ10pID8gJHVyaVsncGFzcyddIDogJycsCl07CgpyZXR1cm4gJHRoaXMtPmhhc0F1dGggPSB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYmluYXJ5VmVyc2lvbigpOiA/c3RyaW5nCnsKaWYgKCFzZWxmOjokdmVyc2lvbikgewppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydzdm4nLCAnLS12ZXJzaW9uJ10sICRvdXRwdXQpKSB7CmlmIChQcmVnOjppc01hdGNoKCd7KFxkKyg/OlwuXGQrKSspfScsICRvdXRwdXQsICRtYXRjaCkpIHsKc2VsZjo6JHZlcnNpb24gPSAkbWF0Y2hbMV07Cn0KfQp9CgpyZXR1cm4gc2VsZjo6JHZlcnNpb247Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxEb3dubG9hZGVyXERvd25sb2FkZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXERvd25sb2FkTWFuYWdlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCmNsYXNzIFN5bmNIZWxwZXIKewoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZG93bmxvYWRBbmRJbnN0YWxsUGFja2FnZVN5bmMoTG9vcCAkbG9vcCwgJGRvd25sb2FkZXIsIHN0cmluZyAkcGF0aCwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IHZvaWQKewphc3NlcnQoJGRvd25sb2FkZXIgaW5zdGFuY2VvZiBEb3dubG9hZGVySW50ZXJmYWNlIHx8ICRkb3dubG9hZGVyIGluc3RhbmNlb2YgRG93bmxvYWRNYW5hZ2VyKTsKCiR0eXBlID0gJHByZXZQYWNrYWdlICE9PSBudWxsID8gJ3VwZGF0ZScgOiAnaW5zdGFsbCc7Cgp0cnkgewpzZWxmOjphd2FpdCgkbG9vcCwgJGRvd25sb2FkZXItPmRvd25sb2FkKCRwYWNrYWdlLCAkcGF0aCwgJHByZXZQYWNrYWdlKSk7CgpzZWxmOjphd2FpdCgkbG9vcCwgJGRvd25sb2FkZXItPnByZXBhcmUoJHR5cGUsICRwYWNrYWdlLCAkcGF0aCwgJHByZXZQYWNrYWdlKSk7CgppZiAoJHR5cGUgPT09ICd1cGRhdGUnICYmICRwcmV2UGFja2FnZSAhPT0gbnVsbCkgewpzZWxmOjphd2FpdCgkbG9vcCwgJGRvd25sb2FkZXItPnVwZGF0ZSgkcGFja2FnZSwgJHByZXZQYWNrYWdlLCAkcGF0aCkpOwp9IGVsc2UgewpzZWxmOjphd2FpdCgkbG9vcCwgJGRvd25sb2FkZXItPmluc3RhbGwoJHBhY2thZ2UsICRwYXRoKSk7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewpzZWxmOjphd2FpdCgkbG9vcCwgJGRvd25sb2FkZXItPmNsZWFudXAoJHR5cGUsICRwYWNrYWdlLCAkcGF0aCwgJHByZXZQYWNrYWdlKSk7CnRocm93ICRlOwp9CgpzZWxmOjphd2FpdCgkbG9vcCwgJGRvd25sb2FkZXItPmNsZWFudXAoJHR5cGUsICRwYWNrYWdlLCAkcGF0aCwgJHByZXZQYWNrYWdlKSk7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXdhaXQoTG9vcCAkbG9vcCwgP1Byb21pc2VJbnRlcmZhY2UgJHByb21pc2UgPSBudWxsKTogdm9pZAp7CmlmICgkcHJvbWlzZSAhPT0gbnVsbCkgewokbG9vcC0+d2FpdChbJHByb21pc2VdKTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7CgoKCgpjbGFzcyBUYXIKewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENvbXBvc2VySnNvbihzdHJpbmcgJHBhdGhUb0FyY2hpdmUpOiA/c3RyaW5nCnsKJHBoYXIgPSBuZXcgXFBoYXJEYXRhKCRwYXRoVG9BcmNoaXZlKTsKCmlmICghJHBoYXItPnZhbGlkKCkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBzZWxmOjpleHRyYWN0Q29tcG9zZXJKc29uRnJvbUZvbGRlcigkcGhhcik7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGV4dHJhY3RDb21wb3Nlckpzb25Gcm9tRm9sZGVyKFxQaGFyRGF0YSAkcGhhcik6IHN0cmluZwp7CmlmIChpc3NldCgkcGhhclsnY29tcG9zZXIuanNvbiddKSkgewpyZXR1cm4gJHBoYXJbJ2NvbXBvc2VyLmpzb24nXS0+Z2V0Q29udGVudCgpOwp9CgokdG9wTGV2ZWxQYXRocyA9IFtdOwpmb3JlYWNoICgkcGhhciBhcyAkZm9sZGVyRmlsZSkgewokbmFtZSA9ICRmb2xkZXJGaWxlLT5nZXRCYXNlbmFtZSgpOwoKaWYgKCRmb2xkZXJGaWxlLT5pc0RpcigpKSB7CiR0b3BMZXZlbFBhdGhzWyRuYW1lXSA9IHRydWU7CmlmIChcY291bnQoJHRvcExldmVsUGF0aHMpID4gMSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0FyY2hpdmUgaGFzIG1vcmUgdGhhbiBvbmUgdG9wIGxldmVsIGRpcmVjdG9yaWVzLCBhbmQgbm8gY29tcG9zZXIuanNvbiB3YXMgZm91bmQgb24gdGhlIHRvcCBsZXZlbCwgc28gaXRcJ3MgYW4gaW52YWxpZCBhcmNoaXZlLiBUb3AgbGV2ZWwgcGF0aHMgZm91bmQgd2VyZTogJy5pbXBsb2RlKCcsJywgYXJyYXlfa2V5cygkdG9wTGV2ZWxQYXRocykpKTsKfQp9Cn0KCiRjb21wb3Nlckpzb25QYXRoID0ga2V5KCR0b3BMZXZlbFBhdGhzKS4nL2NvbXBvc2VyLmpzb24nOwppZiAoXGNvdW50KCR0b3BMZXZlbFBhdGhzKSA+IDAgJiYgaXNzZXQoJHBoYXJbJGNvbXBvc2VySnNvblBhdGhdKSkgewpyZXR1cm4gJHBoYXJbJGNvbXBvc2VySnNvblBhdGhdLT5nZXRDb250ZW50KCk7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignTm8gY29tcG9zZXIuanNvbiBmb3VuZCBlaXRoZXIgYXQgdGhlIHRvcCBsZXZlbCBvciB3aXRoaW4gdGhlIHRvcG1vc3QgZGlyZWN0b3J5Jyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxDYUJ1bmRsZVxDYUJ1bmRsZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgpmaW5hbCBjbGFzcyBUbHNIZWxwZXIKewoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja0NlcnRpZmljYXRlSG9zdCgkY2VydGlmaWNhdGUsIHN0cmluZyAkaG9zdG5hbWUsID9zdHJpbmcgJiRjbiA9IG51bGwpOiBib29sCnsKJG5hbWVzID0gc2VsZjo6Z2V0Q2VydGlmaWNhdGVOYW1lcygkY2VydGlmaWNhdGUpOwoKaWYgKGVtcHR5KCRuYW1lcykpIHsKcmV0dXJuIGZhbHNlOwp9CgokY29tYmluZWROYW1lcyA9IGFycmF5X21lcmdlKCRuYW1lc1snc2FuJ10sIFskbmFtZXNbJ2NuJ11dKTsKJGhvc3RuYW1lID0gc3RydG9sb3dlcigkaG9zdG5hbWUpOwoKZm9yZWFjaCAoJGNvbWJpbmVkTmFtZXMgYXMgJGNlcnROYW1lKSB7CiRtYXRjaGVyID0gc2VsZjo6Y2VydE5hbWVNYXRjaGVyKCRjZXJ0TmFtZSk7CgppZiAoJG1hdGNoZXIgJiYgJG1hdGNoZXIoJGhvc3RuYW1lKSkgewokY24gPSAkbmFtZXNbJ2NuJ107CgpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENlcnRpZmljYXRlTmFtZXMoJGNlcnRpZmljYXRlKTogP2FycmF5CnsKaWYgKGlzX2FycmF5KCRjZXJ0aWZpY2F0ZSkpIHsKJGluZm8gPSAkY2VydGlmaWNhdGU7Cn0gZWxzZWlmIChDYUJ1bmRsZTo6aXNPcGVuc3NsUGFyc2VTYWZlKCkpIHsKJGluZm8gPSBvcGVuc3NsX3g1MDlfcGFyc2UoJGNlcnRpZmljYXRlLCBmYWxzZSk7Cn0KCmlmICghaXNzZXQoJGluZm9bJ3N1YmplY3QnXVsnY29tbW9uTmFtZSddKSkgewpyZXR1cm4gbnVsbDsKfQoKJGNvbW1vbk5hbWUgPSBzdHJ0b2xvd2VyKCRpbmZvWydzdWJqZWN0J11bJ2NvbW1vbk5hbWUnXSk7CiRzdWJqZWN0QWx0TmFtZXMgPSBbXTsKCmlmIChpc3NldCgkaW5mb1snZXh0ZW5zaW9ucyddWydzdWJqZWN0QWx0TmFtZSddKSkgewokc3ViamVjdEFsdE5hbWVzID0gUHJlZzo6c3BsaXQoJ3tccyosXHMqfScsICRpbmZvWydleHRlbnNpb25zJ11bJ3N1YmplY3RBbHROYW1lJ10pOwokc3ViamVjdEFsdE5hbWVzID0gYXJyYXlfZmlsdGVyKAphcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkbmFtZSk6ID9zdHJpbmcgewppZiAoMCA9PT0gc3RycG9zKCRuYW1lLCAnRE5TOicpKSB7CnJldHVybiBzdHJ0b2xvd2VyKGx0cmltKHN1YnN0cigkbmFtZSwgNCkpKTsKfQoKcmV0dXJuIG51bGw7Cn0sICRzdWJqZWN0QWx0TmFtZXMpLApmdW5jdGlvbiAoP3N0cmluZyAkc2FuKSB7CnJldHVybiAkc2FuICE9PSBudWxsOwp9Cik7CiRzdWJqZWN0QWx0TmFtZXMgPSBhcnJheV92YWx1ZXMoJHN1YmplY3RBbHROYW1lcyk7Cn0KCnJldHVybiBbCidjbicgPT4gJGNvbW1vbk5hbWUsCidzYW4nID0+ICRzdWJqZWN0QWx0TmFtZXMsCl07Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q2VydGlmaWNhdGVGaW5nZXJwcmludChzdHJpbmcgJGNlcnRpZmljYXRlKTogc3RyaW5nCnsKJHB1YmtleSA9IG9wZW5zc2xfZ2V0X3B1YmxpY2tleSgkY2VydGlmaWNhdGUpOwppZiAoJHB1YmtleSA9PT0gZmFsc2UpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gcmV0cmlldmUgdGhlIHB1YmxpYyBrZXkgZnJvbSBjZXJ0aWZpY2F0ZScpOwp9CiRwdWJrZXlkZXRhaWxzID0gb3BlbnNzbF9wa2V5X2dldF9kZXRhaWxzKCRwdWJrZXkpOwokcHVia2V5cGVtID0gJHB1YmtleWRldGFpbHNbJ2tleSddOwoKJHN0YXJ0ID0gJy0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tJzsKJGVuZCA9ICctLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0nOwokcGVtdHJpbSA9IHN1YnN0cigkcHVia2V5cGVtLCBzdHJwb3MoJHB1YmtleXBlbSwgJHN0YXJ0KSArIHN0cmxlbigkc3RhcnQpLCAoc3RybGVuKCRwdWJrZXlwZW0pIC0gc3RycG9zKCRwdWJrZXlwZW0sICRlbmQpKSAqICgtMSkpOwokZGVyID0gYmFzZTY0X2RlY29kZSgkcGVtdHJpbSk7CgpyZXR1cm4gaGFzaCgnc2hhMScsICRkZXIpOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzT3BlbnNzbFBhcnNlU2FmZSgpOiBib29sCnsKcmV0dXJuIENhQnVuZGxlOjppc09wZW5zc2xQYXJzZVNhZmUoKTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjZXJ0TmFtZU1hdGNoZXIoc3RyaW5nICRjZXJ0TmFtZSk6ID9jYWxsYWJsZQp7CiR3aWxkY2FyZHMgPSBzdWJzdHJfY291bnQoJGNlcnROYW1lLCAnKicpOwoKaWYgKDAgPT09ICR3aWxkY2FyZHMpIHsKCnJldHVybiBzdGF0aWMgZnVuY3Rpb24gKCRob3N0bmFtZSkgdXNlICgkY2VydE5hbWUpOiBib29sIHsKcmV0dXJuICRob3N0bmFtZSA9PT0gJGNlcnROYW1lOwp9Owp9CgppZiAoMSA9PT0gJHdpbGRjYXJkcykgewokY29tcG9uZW50cyA9IGV4cGxvZGUoJy4nLCAkY2VydE5hbWUpOwoKaWYgKDMgPiBjb3VudCgkY29tcG9uZW50cykpIHsKCnJldHVybiBudWxsOwp9CgokZmlyc3RDb21wb25lbnQgPSAkY29tcG9uZW50c1swXTsKCgppZiAoJyonICE9PSAkZmlyc3RDb21wb25lbnRbc3RybGVuKCRmaXJzdENvbXBvbmVudCkgLSAxXSkgewpyZXR1cm4gbnVsbDsKfQoKJHdpbGRjYXJkUmVnZXggPSBwcmVnX3F1b3RlKCRjZXJ0TmFtZSk7CiR3aWxkY2FyZFJlZ2V4ID0gc3RyX3JlcGxhY2UoJ1xcKicsICdbYS16MC05LV0rJywgJHdpbGRjYXJkUmVnZXgpOwokd2lsZGNhcmRSZWdleCA9ICJ7Xnskd2lsZGNhcmRSZWdleH0kfSI7CgpyZXR1cm4gc3RhdGljIGZ1bmN0aW9uICgkaG9zdG5hbWUpIHVzZSAoJHdpbGRjYXJkUmVnZXgpOiBib29sIHsKcmV0dXJuIFByZWc6OmlzTWF0Y2goJHdpbGRjYXJkUmVnZXgsICRob3N0bmFtZSk7Cn07Cn0KCnJldHVybiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgVXJsCnsKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdXBkYXRlRGlzdFJlZmVyZW5jZShDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIHN0cmluZyAkcmVmKTogc3RyaW5nCnsKJGhvc3QgPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9IT1NUKTsKCmlmICgkaG9zdCA9PT0gJ2FwaS5naXRodWIuY29tJyB8fCAkaG9zdCA9PT0gJ2dpdGh1Yi5jb20nIHx8ICRob3N0ID09PSAnd3d3LmdpdGh1Yi5jb20nKSB7CmlmIChQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovLyg/Ond3d1wuKT9naXRodWJcLmNvbS8oW14vXSspLyhbXi9dKykvKHppcHx0YXIpYmFsbC8oLispJH1pJywgJHVybCwgJG1hdGNoKSkgewoKJHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLycgLiAkbWF0Y2hbMV0gLiAnLycuICRtYXRjaFsyXSAuICcvJyAuICRtYXRjaFszXSAuICdiYWxsLycgLiAkcmVmOwp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly8oPzp3d3dcLik/Z2l0aHViXC5jb20vKFteL10rKS8oW14vXSspL2FyY2hpdmUvLitcLih6aXB8dGFyKSg/OlwuZ3opPyR9aScsICR1cmwsICRtYXRjaCkpIHsKCiR1cmwgPSAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8nIC4gJG1hdGNoWzFdIC4gJy8nLiAkbWF0Y2hbMl0gLiAnLycgLiAkbWF0Y2hbM10gLiAnYmFsbC8nIC4gJHJlZjsKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vYXBpXC5naXRodWJcLmNvbS9yZXBvcy8oW14vXSspLyhbXi9dKykvKHppcHx0YXIpYmFsbCg/Oi8uKyk/JH1pJywgJHVybCwgJG1hdGNoKSkgewoKJHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLycgLiAkbWF0Y2hbMV0gLiAnLycuICRtYXRjaFsyXSAuICcvJyAuICRtYXRjaFszXSAuICdiYWxsLycgLiAkcmVmOwp9Cn0gZWxzZWlmICgkaG9zdCA9PT0gJ2JpdGJ1Y2tldC5vcmcnIHx8ICRob3N0ID09PSAnd3d3LmJpdGJ1Y2tldC5vcmcnKSB7CmlmIChQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovLyg/Ond3d1wuKT9iaXRidWNrZXRcLm9yZy8oW14vXSspLyhbXi9dKykvZ2V0LyguKylcLih6aXB8dGFyXC5nenx0YXJcLmJ6MikkfWknLCAkdXJsLCAkbWF0Y2gpKSB7CgokdXJsID0gJ2h0dHBzOi8vYml0YnVja2V0Lm9yZy8nIC4gJG1hdGNoWzFdIC4gJy8nLiAkbWF0Y2hbMl0gLiAnL2dldC8nIC4gJHJlZiAuICcuJyAuICRtYXRjaFs0XTsKfQp9IGVsc2VpZiAoJGhvc3QgPT09ICdnaXRsYWIuY29tJyB8fCAkaG9zdCA9PT0gJ3d3dy5naXRsYWIuY29tJykgewppZiAoUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly8oPzp3d3dcLik/Z2l0bGFiXC5jb20vYXBpL3ZbMzRdL3Byb2plY3RzLyhbXi9dKykvcmVwb3NpdG9yeS9hcmNoaXZlXC4oemlwfHRhclwuZ3p8dGFyXC5iejJ8dGFyKVw/c2hhPS4rJH1pJywgJHVybCwgJG1hdGNoKSkgewoKJHVybCA9ICdodHRwczovL2dpdGxhYi5jb20vYXBpL3Y0L3Byb2plY3RzLycgLiAkbWF0Y2hbMV0gLiAnL3JlcG9zaXRvcnkvYXJjaGl2ZS4nIC4gJG1hdGNoWzJdIC4gJz9zaGE9JyAuICRyZWY7Cn0KfSBlbHNlaWYgKGluX2FycmF5KCRob3N0LCAkY29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJyksIHRydWUpKSB7CiR1cmwgPSBQcmVnOjpyZXBsYWNlKCd7KC9yZXBvcy9bXi9dKy9bXi9dKy8oemlwfHRhciliYWxsKSg/Oi8uKyk/JH1pJywgJyQxLycuJHJlZiwgJHVybCk7Cn0gZWxzZWlmIChpbl9hcnJheSgkaG9zdCwgJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKSkgewokdXJsID0gUHJlZzo6cmVwbGFjZSgneygvYXBpL3ZbMzRdL3Byb2plY3RzL1teL10rL3JlcG9zaXRvcnkvYXJjaGl2ZVwuKD86emlwfHRhclwuZ3p8dGFyXC5iejJ8dGFyKVw/c2hhPSkuKyR9aScsICckezF9Jy4kcmVmLCAkdXJsKTsKfQoKYXNzZXJ0KCR1cmwgIT09ICcnKTsKCnJldHVybiAkdXJsOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRPcmlnaW4oQ29uZmlnICRjb25maWcsIHN0cmluZyAkdXJsKTogc3RyaW5nCnsKaWYgKDAgPT09IHN0cnBvcygkdXJsLCAnZmlsZTovLycpKSB7CnJldHVybiAkdXJsOwp9Cgokb3JpZ2luID0gKHN0cmluZykgcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfSE9TVCk7CmlmICgkcG9ydCA9IHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX1BPUlQpKSB7CiRvcmlnaW4gLj0gJzonLiRwb3J0Owp9CgppZiAoc3RyX2VuZHNfd2l0aCgkb3JpZ2luLCAnLmdpdGh1Yi5jb20nKSAmJiAkb3JpZ2luICE9PSAnY29kZWxvYWQuZ2l0aHViLmNvbScpIHsKcmV0dXJuICdnaXRodWIuY29tJzsKfQoKaWYgKCRvcmlnaW4gPT09ICdyZXBvLnBhY2thZ2lzdC5vcmcnKSB7CnJldHVybiAncGFja2FnaXN0Lm9yZyc7Cn0KCmlmICgkb3JpZ2luID09PSAnJykgewokb3JpZ2luID0gJHVybDsKfQoKCgppZiAoCmZhbHNlID09PSBzdHJwb3MoJG9yaWdpbiwgJy8nKQomJiAhaW5fYXJyYXkoJG9yaWdpbiwgJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKQopIHsKZm9yZWFjaCAoJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpIGFzICRnaXRsYWJEb21haW4pIHsKaWYgKCRnaXRsYWJEb21haW4gIT09ICcnICYmIHN0cl9zdGFydHNfd2l0aCgkZ2l0bGFiRG9tYWluLCAkb3JpZ2luKSkgewpyZXR1cm4gJGdpdGxhYkRvbWFpbjsKfQp9Cn0KCnJldHVybiAkb3JpZ2luOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhbml0aXplKHN0cmluZyAkdXJsKTogc3RyaW5nCnsKCgokdXJsID0gUHJlZzo6cmVwbGFjZSgneyhbJj9dYWNjZXNzX3Rva2VuPSlbXiZdK30nLCAnJDEqKionLCAkdXJsKTsKCiR1cmwgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3teKD9QPHByZWZpeD5bYS16MC05XSs6Ly8pPyg/UDx1c2VyPlteOi9cc0BdKyk6KD9QPHBhc3N3b3JkPlteQFxzL10rKUB9aScsIHN0YXRpYyBmdW5jdGlvbiAoJG0pOiBzdHJpbmcgewoKaWYgKFByZWc6OmlzTWF0Y2goJ3teKFthLWYwLTldezEyLH18Z2hbYS16XV9bYS16QS1aMC05X10rfGdpdGh1Yl9wYXRfW2EtekEtWjAtOV9dKykkfScsICRtWyd1c2VyJ10pKSB7CnJldHVybiAkbVsncHJlZml4J10uJyoqKjoqKipAJzsKfQoKcmV0dXJuICRtWydwcmVmaXgnXS4kbVsndXNlciddLic6KioqQCc7Cn0sICR1cmwpOwoKcmV0dXJuICR1cmw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCgoKCmNsYXNzIFppcAp7CgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJKc29uKHN0cmluZyAkcGF0aFRvWmlwKTogP3N0cmluZwp7CmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnemlwJykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgWmlwIFV0aWwgcmVxdWlyZXMgUEhQXCdzIHppcCBleHRlbnNpb24nKTsKfQoKJHppcCA9IG5ldyBcWmlwQXJjaGl2ZSgpOwppZiAoJHppcC0+b3BlbigkcGF0aFRvWmlwKSAhPT0gdHJ1ZSkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKDAgPT09ICR6aXAtPm51bUZpbGVzKSB7CiR6aXAtPmNsb3NlKCk7CgpyZXR1cm4gbnVsbDsKfQoKJGZvdW5kRmlsZUluZGV4ID0gc2VsZjo6bG9jYXRlRmlsZSgkemlwLCAnY29tcG9zZXIuanNvbicpOwoKJGNvbnRlbnQgPSBudWxsOwokY29uZmlndXJhdGlvbkZpbGVOYW1lID0gJHppcC0+Z2V0TmFtZUluZGV4KCRmb3VuZEZpbGVJbmRleCk7CiRzdHJlYW0gPSAkemlwLT5nZXRTdHJlYW0oJGNvbmZpZ3VyYXRpb25GaWxlTmFtZSk7CgppZiAoZmFsc2UgIT09ICRzdHJlYW0pIHsKJGNvbnRlbnQgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRzdHJlYW0pOwp9CgokemlwLT5jbG9zZSgpOwoKcmV0dXJuICRjb250ZW50Owp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGxvY2F0ZUZpbGUoXFppcEFyY2hpdmUgJHppcCwgc3RyaW5nICRmaWxlbmFtZSk6IGludAp7CgppZiAoZmFsc2UgIT09ICgkaW5kZXggPSAkemlwLT5sb2NhdGVOYW1lKCRmaWxlbmFtZSkpICYmICR6aXAtPmdldEZyb21JbmRleCgkaW5kZXgpICE9PSBmYWxzZSkgewpyZXR1cm4gJGluZGV4Owp9CgokdG9wTGV2ZWxQYXRocyA9IFtdOwpmb3IgKCRpID0gMDsgJGkgPCAkemlwLT5udW1GaWxlczsgJGkrKykgewokbmFtZSA9ICR6aXAtPmdldE5hbWVJbmRleCgkaSk7CiRkaXJuYW1lID0gZGlybmFtZSgkbmFtZSk7CgoKaWYgKHN0cnBvcygkbmFtZSwgJ19fTUFDT1NYJykgIT09IGZhbHNlKSB7CmNvbnRpbnVlOwp9CgoKaWYgKCRkaXJuYW1lID09PSAnLicpIHsKJHRvcExldmVsUGF0aHNbJG5hbWVdID0gdHJ1ZTsKaWYgKFxjb3VudCgkdG9wTGV2ZWxQYXRocykgPiAxKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQXJjaGl2ZSBoYXMgbW9yZSB0aGFuIG9uZSB0b3AgbGV2ZWwgZGlyZWN0b3JpZXMsIGFuZCBubyBjb21wb3Nlci5qc29uIHdhcyBmb3VuZCBvbiB0aGUgdG9wIGxldmVsLCBzbyBpdFwncyBhbiBpbnZhbGlkIGFyY2hpdmUuIFRvcCBsZXZlbCBwYXRocyBmb3VuZCB3ZXJlOiAnLmltcGxvZGUoJywnLCBhcnJheV9rZXlzKCR0b3BMZXZlbFBhdGhzKSkpOwp9CmNvbnRpbnVlOwp9CgoKaWYgKGZhbHNlID09PSBzdHJwb3MoJGRpcm5hbWUsICdcXCcpICYmIGZhbHNlID09PSBzdHJwb3MoJGRpcm5hbWUsICcvJykpIHsKJHRvcExldmVsUGF0aHNbJGRpcm5hbWUuJy8nXSA9IHRydWU7CmlmIChcY291bnQoJHRvcExldmVsUGF0aHMpID4gMSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0FyY2hpdmUgaGFzIG1vcmUgdGhhbiBvbmUgdG9wIGxldmVsIGRpcmVjdG9yaWVzLCBhbmQgbm8gY29tcG9zZXIuanNvbiB3YXMgZm91bmQgb24gdGhlIHRvcCBsZXZlbCwgc28gaXRcJ3MgYW4gaW52YWxpZCBhcmNoaXZlLiBUb3AgbGV2ZWwgcGF0aHMgZm91bmQgd2VyZTogJy5pbXBsb2RlKCcsJywgYXJyYXlfa2V5cygkdG9wTGV2ZWxQYXRocykpKTsKfQp9Cn0KCmlmICgkdG9wTGV2ZWxQYXRocyAmJiBmYWxzZSAhPT0gKCRpbmRleCA9ICR6aXAtPmxvY2F0ZU5hbWUoa2V5KCR0b3BMZXZlbFBhdGhzKS4kZmlsZW5hbWUpKSAmJiAkemlwLT5nZXRGcm9tSW5kZXgoJGluZGV4KSAhPT0gZmFsc2UpIHsKcmV0dXJuICRpbmRleDsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdObyBjb21wb3Nlci5qc29uIGZvdW5kIGVpdGhlciBhdCB0aGUgdG9wIGxldmVsIG9yIHdpdGhpbiB0aGUgdG9wbW9zdCBkaXJlY3RvcnknKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCnVzZSBDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcjsKCmZ1bmN0aW9uIGluY2x1ZGVJZkV4aXN0cyhzdHJpbmcgJGZpbGUpOiA/Q2xhc3NMb2FkZXIKewpyZXR1cm4gZmlsZV9leGlzdHMoJGZpbGUpID8gaW5jbHVkZSAkZmlsZSA6IG51bGw7Cn0KCmlmICgoISRsb2FkZXIgPSBpbmNsdWRlSWZFeGlzdHMoX19ESVJfXy4nLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnKSkgJiYgKCEkbG9hZGVyID0gaW5jbHVkZUlmRXhpc3RzKF9fRElSX18uJy8uLi8uLi8uLi9hdXRvbG9hZC5waHAnKSkpIHsKZWNobyAnWW91IG11c3Qgc2V0IHVwIHRoZSBwcm9qZWN0IGRlcGVuZGVuY2llcyB1c2luZyBgY29tcG9zZXIgaW5zdGFsbGAnLlBIUF9FT0wuCidTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG93bmxvYWQvIGZvciBpbnN0cnVjdGlvbnMgb24gaW5zdGFsbGluZyBDb21wb3NlcicuUEhQX0VPTDsKZXhpdCgxKTsKfQoKcmV0dXJuICRsb2FkZXI7Cjw/cGhwCgovKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBDb21wb3Nlci4KICoKICogKGMpIE5pbHMgQWRlcm1hbm4gPG5hZGVybWFuQG5hZGVybWFuLmRlPgogKiAgICAgSm9yZGkgQm9nZ2lhbm8gPGouYm9nZ2lhbm9Ac2VsZC5iZT4KICoKICogRm9yIHRoZSBmdWxsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpZXcgdGhlIExJQ0VOU0UKICogZmlsZSB0aGF0IHdhcyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc291cmNlIGNvZGUuCiAqLwoKbmFtZXNwYWNlIENvbXBvc2VyXEF1dG9sb2FkOwoKLyoqCiAqIENsYXNzTG9hZGVyIGltcGxlbWVudHMgYSBQU1ItMCwgUFNSLTQgYW5kIGNsYXNzbWFwIGNsYXNzIGxvYWRlci4KICoKICogICAgICRsb2FkZXIgPSBuZXcgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyKCk7CiAqCiAqICAgICAvLyByZWdpc3RlciBjbGFzc2VzIHdpdGggbmFtZXNwYWNlcwogKiAgICAgJGxvYWRlci0+YWRkKCdTeW1mb255XENvbXBvbmVudCcsIF9fRElSX18uJy9jb21wb25lbnQnKTsKICogICAgICRsb2FkZXItPmFkZCgnU3ltZm9ueScsICAgICAgICAgICBfX0RJUl9fLicvZnJhbWV3b3JrJyk7CiAqCiAqICAgICAvLyBhY3RpdmF0ZSB0aGUgYXV0b2xvYWRlcgogKiAgICAgJGxvYWRlci0+cmVnaXN0ZXIoKTsKICoKICogICAgIC8vIHRvIGVuYWJsZSBzZWFyY2hpbmcgdGhlIGluY2x1ZGUgcGF0aCAoZWcuIGZvciBQRUFSIHBhY2thZ2VzKQogKiAgICAgJGxvYWRlci0+c2V0VXNlSW5jbHVkZVBhdGgodHJ1ZSk7CiAqCiAqIEluIHRoaXMgZXhhbXBsZSwgaWYgeW91IHRyeSB0byB1c2UgYSBjbGFzcyBpbiB0aGUgU3ltZm9ueVxDb21wb25lbnQKICogbmFtZXNwYWNlIG9yIG9uZSBvZiBpdHMgY2hpbGRyZW4gKFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGUgZm9yIGluc3RhbmNlKSwKICogdGhlIGF1dG9sb2FkZXIgd2lsbCBmaXJzdCBsb29rIGZvciB0aGUgY2xhc3MgdW5kZXIgdGhlIGNvbXBvbmVudC8KICogZGlyZWN0b3J5LCBhbmQgaXQgd2lsbCB0aGVuIGZhbGxiYWNrIHRvIHRoZSBmcmFtZXdvcmsvIGRpcmVjdG9yeSBpZiBub3QKICogZm91bmQgYmVmb3JlIGdpdmluZyB1cC4KICoKICogVGhpcyBjbGFzcyBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZSBTeW1mb255IFVuaXZlcnNhbENsYXNzTG9hZGVyLgogKgogKiBAYXV0aG9yIEZhYmllbiBQb3RlbmNpZXIgPGZhYmllbkBzeW1mb255LmNvbT4KICogQGF1dGhvciBKb3JkaSBCb2dnaWFubyA8ai5ib2dnaWFub0BzZWxkLmJlPgogKiBAc2VlICAgIGh0dHBzOi8vd3d3LnBocC1maWcub3JnL3Bzci9wc3ItMC8KICogQHNlZSAgICBodHRwczovL3d3dy5waHAtZmlnLm9yZy9wc3IvcHNyLTQvCiAqLwpjbGFzcyBDbGFzc0xvYWRlcgp7CiAgICAvKiogQHZhciBcQ2xvc3VyZShzdHJpbmcpOnZvaWQgKi8KICAgIHByaXZhdGUgc3RhdGljICRpbmNsdWRlRmlsZTsKCiAgICAvKiogQHZhciBzdHJpbmd8bnVsbCAqLwogICAgcHJpdmF0ZSAkdmVuZG9yRGlyOwoKICAgIC8vIFBTUi00CiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBhcnJheTxzdHJpbmcsIGludD4+CiAgICAgKi8KICAgIHByaXZhdGUgJHByZWZpeExlbmd0aHNQc3I0ID0gYXJyYXkoKTsKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGxpc3Q8c3RyaW5nPj4KICAgICAqLwogICAgcHJpdmF0ZSAkcHJlZml4RGlyc1BzcjQgPSBhcnJheSgpOwogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwcml2YXRlICRmYWxsYmFja0RpcnNQc3I0ID0gYXJyYXkoKTsKCiAgICAvLyBQU1ItMAogICAgLyoqCiAgICAgKiBMaXN0IG9mIFBTUi0wIHByZWZpeGVzCiAgICAgKgogICAgICogU3RydWN0dXJlZCBhcyBhcnJheSgnRiAoZmlyc3QgbGV0dGVyKScgPT4gYXJyYXkoJ0Zvb1xCYXIgKGZ1bGwgcHJlZml4KScgPT4gYXJyYXkoJ3BhdGgnLCAncGF0aDInKSkpCiAgICAgKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGFycmF5PHN0cmluZywgbGlzdDxzdHJpbmc+Pj4KICAgICAqLwogICAgcHJpdmF0ZSAkcHJlZml4ZXNQc3IwID0gYXJyYXkoKTsKICAgIC8qKgogICAgICogQHZhciBsaXN0PHN0cmluZz4KICAgICAqLwogICAgcHJpdmF0ZSAkZmFsbGJhY2tEaXJzUHNyMCA9IGFycmF5KCk7CgogICAgLyoqIEB2YXIgYm9vbCAqLwogICAgcHJpdmF0ZSAkdXNlSW5jbHVkZVBhdGggPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgJGNsYXNzTWFwID0gYXJyYXkoKTsKCiAgICAvKiogQHZhciBib29sICovCiAgICBwcml2YXRlICRjbGFzc01hcEF1dGhvcml0YXRpdmUgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBib29sPgogICAgICovCiAgICBwcml2YXRlICRtaXNzaW5nQ2xhc3NlcyA9IGFycmF5KCk7CgogICAgLyoqIEB2YXIgc3RyaW5nfG51bGwgKi8KICAgIHByaXZhdGUgJGFwY3VQcmVmaXg7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgc2VsZj4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJHJlZ2lzdGVyZWRMb2FkZXJzID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkdmVuZG9yRGlyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmVuZG9yRGlyID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+dmVuZG9yRGlyID0gJHZlbmRvckRpcjsKICAgICAgICBzZWxmOjppbml0aWFsaXplSW5jbHVkZUNsb3N1cmUoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gYXJyYXk8c3RyaW5nLCBsaXN0PHN0cmluZz4+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcmVmaXhlcygpCiAgICB7CiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+cHJlZml4ZXNQc3IwKSkgewogICAgICAgICAgICByZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJ2FycmF5X21lcmdlJywgYXJyYXlfdmFsdWVzKCR0aGlzLT5wcmVmaXhlc1BzcjApKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBhcnJheTxzdHJpbmcsIGxpc3Q8c3RyaW5nPj4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFByZWZpeGVzUHNyNCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wcmVmaXhEaXJzUHNyNDsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGYWxsYmFja0RpcnMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMDsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGYWxsYmFja0RpcnNQc3I0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5PHN0cmluZywgc3RyaW5nPiBBcnJheSBvZiBjbGFzc25hbWUgPT4gcGF0aAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q2xhc3NNYXAoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y2xhc3NNYXA7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gYXJyYXk8c3RyaW5nLCBzdHJpbmc+ICRjbGFzc01hcCBDbGFzcyB0byBmaWxlbmFtZSBtYXAKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZENsYXNzTWFwKGFycmF5ICRjbGFzc01hcCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmNsYXNzTWFwKSB7CiAgICAgICAgICAgICR0aGlzLT5jbGFzc01hcCA9IGFycmF5X21lcmdlKCR0aGlzLT5jbGFzc01hcCwgJGNsYXNzTWFwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Y2xhc3NNYXAgPSAkY2xhc3NNYXA7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGEgc2V0IG9mIFBTUi0wIGRpcmVjdG9yaWVzIGZvciBhIGdpdmVuIHByZWZpeCwgZWl0aGVyCiAgICAgKiBhcHBlbmRpbmcgb3IgcHJlcGVuZGluZyB0byB0aGUgb25lcyBwcmV2aW91c2x5IHNldCBmb3IgdGhpcyBwcmVmaXguCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgJHByZWZpeCAgVGhlIHByZWZpeAogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPnxzdHJpbmcgJHBhdGhzICAgVGhlIFBTUi0wIHJvb3QgZGlyZWN0b3JpZXMKICAgICAqIEBwYXJhbSBib29sICAgICAgICAgICAgICAgICRwcmVwZW5kIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgZGlyZWN0b3JpZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZCgkcHJlZml4LCAkcGF0aHMsICRwcmVwZW5kID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHBhdGhzID0gKGFycmF5KSAkcGF0aHM7CiAgICAgICAgaWYgKCEkcHJlZml4KSB7CiAgICAgICAgICAgIGlmICgkcHJlcGVuZCkgewogICAgICAgICAgICAgICAgJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAgPSBhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgICAgICAkcGF0aHMsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3IwLAogICAgICAgICAgICAgICAgICAgICRwYXRocwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJGZpcnN0ID0gJHByZWZpeFswXTsKICAgICAgICBpZiAoIWlzc2V0KCR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSkpIHsKICAgICAgICAgICAgJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdID0gJHBhdGhzOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoJHByZXBlbmQpIHsKICAgICAgICAgICAgJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdID0gYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICAkcGF0aHMsCiAgICAgICAgICAgICAgICAkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0KICAgICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0gPSBhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgICR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSwKICAgICAgICAgICAgICAgICRwYXRocwogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIHNldCBvZiBQU1ItNCBkaXJlY3RvcmllcyBmb3IgYSBnaXZlbiBuYW1lc3BhY2UsIGVpdGhlcgogICAgICogYXBwZW5kaW5nIG9yIHByZXBlbmRpbmcgdG8gdGhlIG9uZXMgcHJldmlvdXNseSBzZXQgZm9yIHRoaXMgbmFtZXNwYWNlLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICRwcmVmaXggIFRoZSBwcmVmaXgvbmFtZXNwYWNlLCB3aXRoIHRyYWlsaW5nICdcXCcKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz58c3RyaW5nICRwYXRocyAgIFRoZSBQU1ItNCBiYXNlIGRpcmVjdG9yaWVzCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICAgICAgICAgICAkcHJlcGVuZCBXaGV0aGVyIHRvIHByZXBlbmQgdGhlIGRpcmVjdG9yaWVzCiAgICAgKgogICAgICogQHRocm93cyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRQc3I0KCRwcmVmaXgsICRwYXRocywgJHByZXBlbmQgPSBmYWxzZSkKICAgIHsKICAgICAgICAkcGF0aHMgPSAoYXJyYXkpICRwYXRoczsKICAgICAgICBpZiAoISRwcmVmaXgpIHsKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZGlyZWN0b3JpZXMgZm9yIHRoZSByb290IG5hbWVzcGFjZS4KICAgICAgICAgICAgaWYgKCRwcmVwZW5kKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNCA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgICAgICRwYXRocywKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3I0ID0gYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQsCiAgICAgICAgICAgICAgICAgICAgJHBhdGhzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKCFpc3NldCgkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0pKSB7CiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGRpcmVjdG9yaWVzIGZvciBhIG5ldyBuYW1lc3BhY2UuCiAgICAgICAgICAgICRsZW5ndGggPSBzdHJsZW4oJHByZWZpeCk7CiAgICAgICAgICAgIGlmICgnXFwnICE9PSAkcHJlZml4WyRsZW5ndGggLSAxXSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkEgbm9uLWVtcHR5IFBTUi00IHByZWZpeCBtdXN0IGVuZCB3aXRoIGEgbmFtZXNwYWNlIHNlcGFyYXRvci4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+cHJlZml4TGVuZ3Roc1BzcjRbJHByZWZpeFswXV1bJHByZWZpeF0gPSAkbGVuZ3RoOwogICAgICAgICAgICAkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0gPSAkcGF0aHM7CiAgICAgICAgfSBlbHNlaWYgKCRwcmVwZW5kKSB7CiAgICAgICAgICAgIC8vIFByZXBlbmQgZGlyZWN0b3JpZXMgZm9yIGFuIGFscmVhZHkgcmVnaXN0ZXJlZCBuYW1lc3BhY2UuCiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgJHBhdGhzLAogICAgICAgICAgICAgICAgJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdCiAgICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gQXBwZW5kIGRpcmVjdG9yaWVzIGZvciBhbiBhbHJlYWR5IHJlZ2lzdGVyZWQgbmFtZXNwYWNlLgogICAgICAgICAgICAkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0gPSBhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgICR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSwKICAgICAgICAgICAgICAgICRwYXRocwogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIHNldCBvZiBQU1ItMCBkaXJlY3RvcmllcyBmb3IgYSBnaXZlbiBwcmVmaXgsCiAgICAgKiByZXBsYWNpbmcgYW55IG90aGVycyBwcmV2aW91c2x5IHNldCBmb3IgdGhpcyBwcmVmaXguCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgJHByZWZpeCBUaGUgcHJlZml4CiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+fHN0cmluZyAkcGF0aHMgIFRoZSBQU1ItMCBiYXNlIGRpcmVjdG9yaWVzCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQoJHByZWZpeCwgJHBhdGhzKQogICAgewogICAgICAgIGlmICghJHByZWZpeCkgewogICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCA9IChhcnJheSkgJHBhdGhzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhlc1BzcjBbJHByZWZpeFswXV1bJHByZWZpeF0gPSAoYXJyYXkpICRwYXRoczsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBzZXQgb2YgUFNSLTQgZGlyZWN0b3JpZXMgZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlLAogICAgICogcmVwbGFjaW5nIGFueSBvdGhlcnMgcHJldmlvdXNseSBzZXQgZm9yIHRoaXMgbmFtZXNwYWNlLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICRwcmVmaXggVGhlIHByZWZpeC9uYW1lc3BhY2UsIHdpdGggdHJhaWxpbmcgJ1xcJwogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPnxzdHJpbmcgJHBhdGhzICBUaGUgUFNSLTQgYmFzZSBkaXJlY3RvcmllcwogICAgICoKICAgICAqIEB0aHJvd3MgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UHNyNCgkcHJlZml4LCAkcGF0aHMpCiAgICB7CiAgICAgICAgaWYgKCEkcHJlZml4KSB7CiAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3I0ID0gKGFycmF5KSAkcGF0aHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGxlbmd0aCA9IHN0cmxlbigkcHJlZml4KTsKICAgICAgICAgICAgaWYgKCdcXCcgIT09ICRwcmVmaXhbJGxlbmd0aCAtIDFdKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQSBub24tZW1wdHkgUFNSLTQgcHJlZml4IG11c3QgZW5kIHdpdGggYSBuYW1lc3BhY2Ugc2VwYXJhdG9yLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhMZW5ndGhzUHNyNFskcHJlZml4WzBdXVskcHJlZml4XSA9ICRsZW5ndGg7CiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9IChhcnJheSkgJHBhdGhzOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFR1cm5zIG9uIHNlYXJjaGluZyB0aGUgaW5jbHVkZSBwYXRoIGZvciBjbGFzcyBmaWxlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkdXNlSW5jbHVkZVBhdGgKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFVzZUluY2x1ZGVQYXRoKCR1c2VJbmNsdWRlUGF0aCkKICAgIHsKICAgICAgICAkdGhpcy0+dXNlSW5jbHVkZVBhdGggPSAkdXNlSW5jbHVkZVBhdGg7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0aGUgYXV0b2xvYWRlciB1c2VzIHRoZSBpbmNsdWRlIHBhdGggdG8gY2hlY2sKICAgICAqIGZvciBjbGFzc2VzLgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlSW5jbHVkZVBhdGgoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dXNlSW5jbHVkZVBhdGg7CiAgICB9CgogICAgLyoqCiAgICAgKiBUdXJucyBvZmYgc2VhcmNoaW5nIHRoZSBwcmVmaXggYW5kIGZhbGxiYWNrIGRpcmVjdG9yaWVzIGZvciBjbGFzc2VzCiAgICAgKiB0aGF0IGhhdmUgbm90IGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBjbGFzcyBtYXAuCiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZQogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRjbGFzc01hcEF1dGhvcml0YXRpdmUpCiAgICB7CiAgICAgICAgJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZSA9ICRjbGFzc01hcEF1dGhvcml0YXRpdmU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTaG91bGQgY2xhc3MgbG9va3VwIGZhaWwgaWYgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IGNsYXNzIG1hcD8KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzQ2xhc3NNYXBBdXRob3JpdGF0aXZlKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEFQQ3UgcHJlZml4IHRvIHVzZSB0byBjYWNoZSBmb3VuZC9ub3QtZm91bmQgY2xhc3NlcywgaWYgdGhlIGV4dGVuc2lvbiBpcyBlbmFibGVkLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkYXBjdVByZWZpeAogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0QXBjdVByZWZpeCgkYXBjdVByZWZpeCkKICAgIHsKICAgICAgICAkdGhpcy0+YXBjdVByZWZpeCA9IGZ1bmN0aW9uX2V4aXN0cygnYXBjdV9mZXRjaCcpICYmIGZpbHRlcl92YXIoaW5pX2dldCgnYXBjLmVuYWJsZWQnKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pID8gJGFwY3VQcmVmaXggOiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIEFQQ3UgcHJlZml4IGluIHVzZSwgb3IgbnVsbCBpZiBBUEN1IGNhY2hpbmcgaXMgbm90IGVuYWJsZWQuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmd8bnVsbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QXBjdVByZWZpeCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hcGN1UHJlZml4OwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIHRoaXMgaW5zdGFuY2UgYXMgYW4gYXV0b2xvYWRlci4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkcHJlcGVuZCBXaGV0aGVyIHRvIHByZXBlbmQgdGhlIGF1dG9sb2FkZXIgb3Igbm90CiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlcigkcHJlcGVuZCA9IGZhbHNlKQogICAgewogICAgICAgIHNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpLCB0cnVlLCAkcHJlcGVuZCk7CgogICAgICAgIGlmIChudWxsID09PSAkdGhpcy0+dmVuZG9yRGlyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkcHJlcGVuZCkgewogICAgICAgICAgICBzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnMgPSBhcnJheSgkdGhpcy0+dmVuZG9yRGlyID0+ICR0aGlzKSArIHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bnNldChzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnNbJHRoaXMtPnZlbmRvckRpcl0pOwogICAgICAgICAgICBzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnNbJHRoaXMtPnZlbmRvckRpcl0gPSAkdGhpczsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBVbnJlZ2lzdGVycyB0aGlzIGluc3RhbmNlIGFzIGFuIGF1dG9sb2FkZXIuCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB1bnJlZ2lzdGVyKCkKICAgIHsKICAgICAgICBzcGxfYXV0b2xvYWRfdW5yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpKTsKCiAgICAgICAgaWYgKG51bGwgIT09ICR0aGlzLT52ZW5kb3JEaXIpIHsKICAgICAgICAgICAgdW5zZXQoc2VsZjo6JHJlZ2lzdGVyZWRMb2FkZXJzWyR0aGlzLT52ZW5kb3JEaXJdKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3Mgb3IgaW50ZXJmYWNlLgogICAgICoKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICRjbGFzcyBUaGUgbmFtZSBvZiB0aGUgY2xhc3MKICAgICAqIEByZXR1cm4gdHJ1ZXxudWxsIFRydWUgaWYgbG9hZGVkLCBudWxsIG90aGVyd2lzZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbG9hZENsYXNzKCRjbGFzcykKICAgIHsKICAgICAgICBpZiAoJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSkgewogICAgICAgICAgICAkaW5jbHVkZUZpbGUgPSBzZWxmOjokaW5jbHVkZUZpbGU7CiAgICAgICAgICAgICRpbmNsdWRlRmlsZSgkZmlsZSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogRmluZHMgdGhlIHBhdGggdG8gdGhlIGZpbGUgd2hlcmUgdGhlIGNsYXNzIGlzIGRlZmluZWQuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmd8ZmFsc2UgVGhlIHBhdGggaWYgZm91bmQsIGZhbHNlIG90aGVyd2lzZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZmluZEZpbGUoJGNsYXNzKQogICAgewogICAgICAgIC8vIGNsYXNzIG1hcCBsb29rdXAKICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPmNsYXNzTWFwWyRjbGFzc10pKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y2xhc3NNYXBbJGNsYXNzXTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUgfHwgaXNzZXQoJHRoaXMtPm1pc3NpbmdDbGFzc2VzWyRjbGFzc10pKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKG51bGwgIT09ICR0aGlzLT5hcGN1UHJlZml4KSB7CiAgICAgICAgICAgICRmaWxlID0gYXBjdV9mZXRjaCgkdGhpcy0+YXBjdVByZWZpeC4kY2xhc3MsICRoaXQpOwogICAgICAgICAgICBpZiAoJGhpdCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkZmlsZSA9ICR0aGlzLT5maW5kRmlsZVdpdGhFeHRlbnNpb24oJGNsYXNzLCAnLnBocCcpOwoKICAgICAgICAvLyBTZWFyY2ggZm9yIEhhY2sgZmlsZXMgaWYgd2UgYXJlIHJ1bm5pbmcgb24gSEhWTQogICAgICAgIGlmIChmYWxzZSA9PT0gJGZpbGUgJiYgZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykpIHsKICAgICAgICAgICAgJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGVXaXRoRXh0ZW5zaW9uKCRjbGFzcywgJy5oaCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG51bGwgIT09ICR0aGlzLT5hcGN1UHJlZml4KSB7CiAgICAgICAgICAgIGFwY3VfYWRkKCR0aGlzLT5hcGN1UHJlZml4LiRjbGFzcywgJGZpbGUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZhbHNlID09PSAkZmlsZSkgewogICAgICAgICAgICAvLyBSZW1lbWJlciB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3QgZXhpc3QuCiAgICAgICAgICAgICR0aGlzLT5taXNzaW5nQ2xhc3Nlc1skY2xhc3NdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkZmlsZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIGxvYWRlcnMga2V5ZWQgYnkgdGhlaXIgY29ycmVzcG9uZGluZyB2ZW5kb3IgZGlyZWN0b3JpZXMuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheTxzdHJpbmcsIHNlbGY+CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZExvYWRlcnMoKQogICAgewogICAgICAgIHJldHVybiBzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gIHN0cmluZyAgICAgICAkY2xhc3MKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAgICRleHQKICAgICAqIEByZXR1cm4gc3RyaW5nfGZhbHNlCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZmluZEZpbGVXaXRoRXh0ZW5zaW9uKCRjbGFzcywgJGV4dCkKICAgIHsKICAgICAgICAvLyBQU1ItNCBsb29rdXAKICAgICAgICAkbG9naWNhbFBhdGhQc3I0ID0gc3RydHIoJGNsYXNzLCAnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SKSAuICRleHQ7CgogICAgICAgICRmaXJzdCA9ICRjbGFzc1swXTsKICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnByZWZpeExlbmd0aHNQc3I0WyRmaXJzdF0pKSB7CiAgICAgICAgICAgICRzdWJQYXRoID0gJGNsYXNzOwogICAgICAgICAgICB3aGlsZSAoZmFsc2UgIT09ICRsYXN0UG9zID0gc3RycnBvcygkc3ViUGF0aCwgJ1xcJykpIHsKICAgICAgICAgICAgICAgICRzdWJQYXRoID0gc3Vic3RyKCRzdWJQYXRoLCAwLCAkbGFzdFBvcyk7CiAgICAgICAgICAgICAgICAkc2VhcmNoID0gJHN1YlBhdGggLiAnXFwnOwogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5wcmVmaXhEaXJzUHNyNFskc2VhcmNoXSkpIHsKICAgICAgICAgICAgICAgICAgICAkcGF0aEVuZCA9IERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzdWJzdHIoJGxvZ2ljYWxQYXRoUHNyNCwgJGxhc3RQb3MgKyAxKTsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHNlYXJjaF0gYXMgJGRpcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUgPSAkZGlyIC4gJHBhdGhFbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFBTUi00IGZhbGxiYWNrIGRpcnMKICAgICAgICBmb3JlYWNoICgkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNCBhcyAkZGlyKSB7CiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGxvZ2ljYWxQYXRoUHNyNCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUFNSLTAgbG9va3VwCiAgICAgICAgaWYgKGZhbHNlICE9PSAkcG9zID0gc3RycnBvcygkY2xhc3MsICdcXCcpKSB7CiAgICAgICAgICAgIC8vIG5hbWVzcGFjZWQgY2xhc3MgbmFtZQogICAgICAgICAgICAkbG9naWNhbFBhdGhQc3IwID0gc3Vic3RyKCRsb2dpY2FsUGF0aFBzcjQsIDAsICRwb3MgKyAxKQogICAgICAgICAgICAgICAgLiBzdHJ0cihzdWJzdHIoJGxvZ2ljYWxQYXRoUHNyNCwgJHBvcyArIDEpLCAnXycsIERJUkVDVE9SWV9TRVBBUkFUT1IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFBFQVItbGlrZSBjbGFzcyBuYW1lCiAgICAgICAgICAgICRsb2dpY2FsUGF0aFBzcjAgPSBzdHJ0cigkY2xhc3MsICdfJywgRElSRUNUT1JZX1NFUEFSQVRPUikgLiAkZXh0OwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XSkpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdIGFzICRwcmVmaXggPT4gJGRpcnMpIHsKICAgICAgICAgICAgICAgIGlmICgwID09PSBzdHJwb3MoJGNsYXNzLCAkcHJlZml4KSkgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkbG9naWNhbFBhdGhQc3IwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBQU1ItMCBmYWxsYmFjayBkaXJzCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAgYXMgJGRpcikgewogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUgPSAkZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRsb2dpY2FsUGF0aFBzcjApKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFBTUi0wIGluY2x1ZGUgcGF0aHMuCiAgICAgICAgaWYgKCR0aGlzLT51c2VJbmNsdWRlUGF0aCAmJiAkZmlsZSA9IHN0cmVhbV9yZXNvbHZlX2luY2x1ZGVfcGF0aCgkbG9naWNhbFBhdGhQc3IwKSkgewogICAgICAgICAgICByZXR1cm4gJGZpbGU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdGlhbGl6ZUluY2x1ZGVDbG9zdXJlKCkKICAgIHsKICAgICAgICBpZiAoc2VsZjo6JGluY2x1ZGVGaWxlICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNjb3BlIGlzb2xhdGVkIGluY2x1ZGUuCiAgICAgICAgICoKICAgICAgICAgKiBQcmV2ZW50cyBhY2Nlc3MgdG8gJHRoaXMvc2VsZiBmcm9tIGluY2x1ZGVkIGZpbGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtICBzdHJpbmcgJGZpbGUKICAgICAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAgICAgKi8KICAgICAgICBzZWxmOjokaW5jbHVkZUZpbGUgPSBcQ2xvc3VyZTo6YmluZChzdGF0aWMgZnVuY3Rpb24oJGZpbGUpIHsKICAgICAgICAgICAgaW5jbHVkZSAkZmlsZTsKICAgICAgICB9LCBudWxsLCBudWxsKTsKICAgIH0KfQo8P3BocAoKLyoKICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ29tcG9zZXIuCiAqCiAqIChjKSBOaWxzIEFkZXJtYW5uIDxuYWRlcm1hbkBuYWRlcm1hbi5kZT4KICogICAgIEpvcmRpIEJvZ2dpYW5vIDxqLmJvZ2dpYW5vQHNlbGQuYmU+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCm5hbWVzcGFjZSBDb21wb3NlcjsKCnVzZSBDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyOwoKLyoqCiAqIFRoaXMgY2xhc3MgaXMgY29waWVkIGluIGV2ZXJ5IENvbXBvc2VyIGluc3RhbGxlZCBwcm9qZWN0IGFuZCBhdmFpbGFibGUgdG8gYWxsCiAqCiAqIFNlZSBhbHNvIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNy1ydW50aW1lLm1kI2luc3RhbGxlZC12ZXJzaW9ucwogKgogKiBUbyByZXF1aXJlIGl0cyBwcmVzZW5jZSwgeW91IGNhbiByZXF1aXJlIGBjb21wb3Nlci1ydW50aW1lLWFwaSBeMi4wYAogKgogKiBAZmluYWwKICovCmNsYXNzIEluc3RhbGxlZFZlcnNpb25zCnsKICAgIC8qKgogICAgICogQHZhciBzdHJpbmd8bnVsbCBpZiBzZXQgKGJ5IHJlZmxlY3Rpb24gYnkgQ29tcG9zZXIpLCB0aGlzIHNob3VsZCBiZSBzZXQgdG8gdGhlIHBhdGggd2hlcmUgdGhpcyBjbGFzcyBpcyBiZWluZyBjb3BpZWQgdG8KICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyAkc2VsZkRpciA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAdmFyIG1peGVkW118bnVsbAogICAgICogQHBzYWxtLXZhciBhcnJheXtyb290OiBhcnJheXtuYW1lOiBzdHJpbmcsIHByZXR0eV92ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmd8bnVsbCwgdHlwZTogc3RyaW5nLCBpbnN0YWxsX3BhdGg6IHN0cmluZywgYWxpYXNlczogc3RyaW5nW10sIGRldjogYm9vbH0sIHZlcnNpb25zOiBhcnJheTxzdHJpbmcsIGFycmF5e3ByZXR0eV92ZXJzaW9uPzogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nLCByZWZlcmVuY2U/OiBzdHJpbmd8bnVsbCwgdHlwZT86IHN0cmluZywgaW5zdGFsbF9wYXRoPzogc3RyaW5nLCBhbGlhc2VzPzogc3RyaW5nW10sIGRldl9yZXF1aXJlbWVudDogYm9vbCwgcmVwbGFjZWQ/OiBzdHJpbmdbXSwgcHJvdmlkZWQ/OiBzdHJpbmdbXX0+fXxhcnJheXt9fG51bGwKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJGluc3RhbGxlZDsKCiAgICAvKioKICAgICAqIEB2YXIgYm9vbAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyAkaW5zdGFsbGVkSXNMb2NhbERpcjsKCiAgICAvKioKICAgICAqIEB2YXIgYm9vbHxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljICRjYW5HZXRWZW5kb3JzOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheVtdCiAgICAgKiBAcHNhbG0tdmFyIGFycmF5PHN0cmluZywgYXJyYXl7cm9vdDogYXJyYXl7bmFtZTogc3RyaW5nLCBwcmV0dHlfdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHJlZmVyZW5jZTogc3RyaW5nfG51bGwsIHR5cGU6IHN0cmluZywgaW5zdGFsbF9wYXRoOiBzdHJpbmcsIGFsaWFzZXM6IHN0cmluZ1tdLCBkZXY6IGJvb2x9LCB2ZXJzaW9uczogYXJyYXk8c3RyaW5nLCBhcnJheXtwcmV0dHlfdmVyc2lvbj86IHN0cmluZywgdmVyc2lvbj86IHN0cmluZywgcmVmZXJlbmNlPzogc3RyaW5nfG51bGwsIHR5cGU/OiBzdHJpbmcsIGluc3RhbGxfcGF0aD86IHN0cmluZywgYWxpYXNlcz86IHN0cmluZ1tdLCBkZXZfcmVxdWlyZW1lbnQ6IGJvb2wsIHJlcGxhY2VkPzogc3RyaW5nW10sIHByb3ZpZGVkPzogc3RyaW5nW119Pn0+CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljICRpbnN0YWxsZWRCeVZlbmRvciA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgcGFja2FnZSBuYW1lcyB3aGljaCBhcmUgcHJlc2VudCwgZWl0aGVyIGJ5IGJlaW5nIGluc3RhbGxlZCwgcmVwbGFjZWQgb3IgcHJvdmlkZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZ1tdCiAgICAgKiBAcHNhbG0tcmV0dXJuIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbGxlZFBhY2thZ2VzKCkKICAgIHsKICAgICAgICAkcGFja2FnZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgJHBhY2thZ2VzW10gPSBhcnJheV9rZXlzKCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ10pOwogICAgICAgIH0KCiAgICAgICAgaWYgKDEgPT09IFxjb3VudCgkcGFja2FnZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkcGFja2FnZXNbMF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXlfa2V5cyhhcnJheV9mbGlwKFxjYWxsX3VzZXJfZnVuY19hcnJheSgnYXJyYXlfbWVyZ2UnLCAkcGFja2FnZXMpKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgcGFja2FnZSBuYW1lcyB3aXRoIGEgc3BlY2lmaWMgdHlwZSBlLmcuICdsaWJyYXJ5JwogICAgICoKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgJHR5cGUKICAgICAqIEByZXR1cm4gc3RyaW5nW10KICAgICAqIEBwc2FsbS1yZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGVkUGFja2FnZXNCeVR5cGUoJHR5cGUpCiAgICB7CiAgICAgICAgJHBhY2thZ2VzQnlUeXBlID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBmb3JlYWNoICgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddIGFzICRuYW1lID0+ICRwYWNrYWdlKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHBhY2thZ2VbJ3R5cGUnXSkgJiYgJHBhY2thZ2VbJ3R5cGUnXSA9PT0gJHR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAkcGFja2FnZXNCeVR5cGVbXSA9ICRuYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHBhY2thZ2VzQnlUeXBlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhY2thZ2UgaXMgaW5zdGFsbGVkCiAgICAgKgogICAgICogVGhpcyBhbHNvIHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFja2FnZSBuYW1lIGlzIHByb3ZpZGVkIG9yIHJlcGxhY2VkIGJ5IGFub3RoZXIgcGFja2FnZQogICAgICoKICAgICAqIEBwYXJhbSAgc3RyaW5nICRwYWNrYWdlTmFtZQogICAgICogQHBhcmFtICBib29sICAgJGluY2x1ZGVEZXZSZXF1aXJlbWVudHMKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSW5zdGFsbGVkKCRwYWNrYWdlTmFtZSwgJGluY2x1ZGVEZXZSZXF1aXJlbWVudHMgPSB0cnVlKQogICAgewogICAgICAgIGZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkaW5jbHVkZURldlJlcXVpcmVtZW50cyB8fCAhaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydkZXZfcmVxdWlyZW1lbnQnXSkgfHwgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydkZXZfcmVxdWlyZW1lbnQnXSA9PT0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYWNrYWdlIHNhdGlzZmllcyBhIHZlcnNpb24gY29uc3RyYWludAogICAgICoKICAgICAqIGUuZy4gSWYgeW91IHdhbnQgdG8ga25vdyB3aGV0aGVyIHZlcnNpb24gMi4zKyBvZiBwYWNrYWdlIGZvby9iYXIgaXMgaW5zdGFsbGVkLCB5b3Ugd291bGQgY2FsbDoKICAgICAqCiAgICAgKiAgIENvbXBvc2VyXEluc3RhbGxlZFZlcnNpb25zOjpzYXRpc2ZpZXMobmV3IFZlcnNpb25QYXJzZXIsICdmb28vYmFyJywgJ14yLjMnKQogICAgICoKICAgICAqIEBwYXJhbSAgVmVyc2lvblBhcnNlciAkcGFyc2VyICAgICAgSW5zdGFsbCBjb21wb3Nlci9zZW12ZXIgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhpcyBjbGFzcyBhbmQgZnVuY3Rpb25hbGl0eQogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAgICRwYWNrYWdlTmFtZQogICAgICogQHBhcmFtICBzdHJpbmd8bnVsbCAgICRjb25zdHJhaW50ICBBIHZlcnNpb24gY29uc3RyYWludCB0byBjaGVjayBmb3IsIGlmIHlvdSBwYXNzIG9uZSB5b3UgaGF2ZSB0byBtYWtlIHN1cmUgY29tcG9zZXIvc2VtdmVyIGlzIHJlcXVpcmVkIGJ5IHlvdXIgcGFja2FnZQogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F0aXNmaWVzKFZlcnNpb25QYXJzZXIgJHBhcnNlciwgJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCkKICAgIHsKICAgICAgICAkY29uc3RyYWludCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoKHN0cmluZykgJGNvbnN0cmFpbnQpOwogICAgICAgICRwcm92aWRlZCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoc2VsZjo6Z2V0VmVyc2lvblJhbmdlcygkcGFja2FnZU5hbWUpKTsKCiAgICAgICAgcmV0dXJuICRwcm92aWRlZC0+bWF0Y2hlcygkY29uc3RyYWludCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdmVyc2lvbiBjb25zdHJhaW50IHJlcHJlc2VudGluZyBhbGwgdGhlIHJhbmdlKHMpIHdoaWNoIGFyZSBpbnN0YWxsZWQgZm9yIGEgZ2l2ZW4gcGFja2FnZQogICAgICoKICAgICAqIEl0IGlzIGVhc2llciB0byB1c2UgdGhpcyB2aWEgaXNJbnN0YWxsZWQoKSB3aXRoIHRoZSAkY29uc3RyYWludCBhcmd1bWVudCBpZiB5b3UgbmVlZCB0byBjaGVjawogICAgICogd2hldGhlciBhIGdpdmVuIHZlcnNpb24gb2YgYSBwYWNrYWdlIGlzIGluc3RhbGxlZCwgYW5kIG5vdCBqdXN0IHdoZXRoZXIgaXQgZXhpc3RzCiAgICAgKgogICAgICogQHBhcmFtICBzdHJpbmcgJHBhY2thZ2VOYW1lCiAgICAgKiBAcmV0dXJuIHN0cmluZyBWZXJzaW9uIGNvbnN0cmFpbnQgdXNhYmxlIHdpdGggY29tcG9zZXIvc2VtdmVyCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmVyc2lvblJhbmdlcygkcGFja2FnZU5hbWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmFuZ2VzID0gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKGlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXSkpIHsKICAgICAgICAgICAgICAgICRyYW5nZXNbXSA9ICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygnYWxpYXNlcycsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgICRyYW5nZXMgPSBhcnJheV9tZXJnZSgkcmFuZ2VzLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2FsaWFzZXMnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJ3JlcGxhY2VkJywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgJHJhbmdlcyA9IGFycmF5X21lcmdlKCRyYW5nZXMsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVwbGFjZWQnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJ3Byb3ZpZGVkJywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgJHJhbmdlcyA9IGFycmF5X21lcmdlKCRyYW5nZXMsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJvdmlkZWQnXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpbXBsb2RlKCcgfHwgJywgJHJhbmdlcyk7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAkcGFja2FnZU5hbWUKICAgICAqIEByZXR1cm4gc3RyaW5nfG51bGwgSWYgdGhlIHBhY2thZ2UgaXMgYmVpbmcgcmVwbGFjZWQgb3IgcHJvdmlkZWQgYnV0IGlzIG5vdCByZWFsbHkgaW5zdGFsbGVkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgYXMgdmVyc2lvbiwgdXNlIHNhdGlzZmllcyBvciBnZXRWZXJzaW9uUmFuZ2VzIGlmIHlvdSBuZWVkIHRvIGtub3cgaWYgYSBnaXZlbiB2ZXJzaW9uIGlzIHByZXNlbnQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCRwYWNrYWdlTmFtZSkKICAgIHsKICAgICAgICBmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWyd2ZXJzaW9uJ10pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsndmVyc2lvbiddOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAgJHBhY2thZ2VOYW1lCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xudWxsIElmIHRoZSBwYWNrYWdlIGlzIGJlaW5nIHJlcGxhY2VkIG9yIHByb3ZpZGVkIGJ1dCBpcyBub3QgcmVhbGx5IGluc3RhbGxlZCwgbnVsbCB3aWxsIGJlIHJldHVybmVkIGFzIHZlcnNpb24sIHVzZSBzYXRpc2ZpZXMgb3IgZ2V0VmVyc2lvblJhbmdlcyBpZiB5b3UgbmVlZCB0byBrbm93IGlmIGEgZ2l2ZW4gdmVyc2lvbiBpcyBwcmVzZW50CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UHJldHR5VmVyc2lvbigkcGFja2FnZU5hbWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcmV0dHlfdmVyc2lvbiddOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAgJHBhY2thZ2VOYW1lCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xudWxsIElmIHRoZSBwYWNrYWdlIGlzIGJlaW5nIHJlcGxhY2VkIG9yIHByb3ZpZGVkIGJ1dCBpcyBub3QgcmVhbGx5IGluc3RhbGxlZCwgbnVsbCB3aWxsIGJlIHJldHVybmVkIGFzIHJlZmVyZW5jZQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJlZmVyZW5jZSgkcGFja2FnZU5hbWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVmZXJlbmNlJ10pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVmZXJlbmNlJ107CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAkcGFja2FnZU5hbWUKICAgICAqIEByZXR1cm4gc3RyaW5nfG51bGwgSWYgdGhlIHBhY2thZ2UgaXMgYmVpbmcgcmVwbGFjZWQgb3IgcHJvdmlkZWQgYnV0IGlzIG5vdCByZWFsbHkgaW5zdGFsbGVkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgYXMgaW5zdGFsbCBwYXRoLiBQYWNrYWdlcyBvZiB0eXBlIG1ldGFwYWNrYWdlcyBhbHNvIGhhdmUgYSBudWxsIGluc3RhbGwgcGF0aC4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YWxsUGF0aCgkcGFja2FnZU5hbWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydpbnN0YWxsX3BhdGgnXSkgPyAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2luc3RhbGxfcGF0aCddIDogbnVsbDsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBpcyBub3QgaW5zdGFsbGVkJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKiBAcHNhbG0tcmV0dXJuIGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJvb3RQYWNrYWdlKCkKICAgIHsKICAgICAgICAkaW5zdGFsbGVkID0gc2VsZjo6Z2V0SW5zdGFsbGVkKCk7CgogICAgICAgIHJldHVybiAkaW5zdGFsbGVkWzBdWydyb290J107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByYXcgaW5zdGFsbGVkLnBocCBkYXRhIGZvciBjdXN0b20gaW1wbGVtZW50YXRpb25zCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEFsbFJhd0RhdGEoKSBpbnN0ZWFkIHdoaWNoIHJldHVybnMgYWxsIGRhdGFzZXRzIGZvciBhbGwgYXV0b2xvYWRlcnMgcHJlc2VudCBpbiB0aGUgcHJvY2Vzcy4gZ2V0UmF3RGF0YSBvbmx5IHJldHVybnMgdGhlIGZpcnN0IGRhdGFzZXQgbG9hZGVkLCB3aGljaCBtYXkgbm90IGJlIHdoYXQgeW91IGV4cGVjdC4KICAgICAqIEByZXR1cm4gYXJyYXlbXQogICAgICogQHBzYWxtLXJldHVybiBhcnJheXtyb290OiBhcnJheXtuYW1lOiBzdHJpbmcsIHByZXR0eV92ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmd8bnVsbCwgdHlwZTogc3RyaW5nLCBpbnN0YWxsX3BhdGg6IHN0cmluZywgYWxpYXNlczogc3RyaW5nW10sIGRldjogYm9vbH0sIHZlcnNpb25zOiBhcnJheTxzdHJpbmcsIGFycmF5e3ByZXR0eV92ZXJzaW9uPzogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nLCByZWZlcmVuY2U/OiBzdHJpbmd8bnVsbCwgdHlwZT86IHN0cmluZywgaW5zdGFsbF9wYXRoPzogc3RyaW5nLCBhbGlhc2VzPzogc3RyaW5nW10sIGRldl9yZXF1aXJlbWVudDogYm9vbCwgcmVwbGFjZWQ/OiBzdHJpbmdbXSwgcHJvdmlkZWQ/OiBzdHJpbmdbXX0+fQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJhd0RhdGEoKQogICAgewogICAgICAgIEB0cmlnZ2VyX2Vycm9yKCdnZXRSYXdEYXRhIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgZGF0YXNldCBsb2FkZWQsIHdoaWNoIG1heSBub3QgYmUgd2hhdCB5b3UgZXhwZWN0LiBVc2UgZ2V0QWxsUmF3RGF0YSgpIGluc3RlYWQgd2hpY2ggcmV0dXJucyBhbGwgZGF0YXNldHMgZm9yIGFsbCBhdXRvbG9hZGVycyBwcmVzZW50IGluIHRoZSBwcm9jZXNzLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiAgICAgICAgaWYgKG51bGwgPT09IHNlbGY6OiRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgLy8gb25seSByZXF1aXJlIHRoZSBpbnN0YWxsZWQucGhwIGZpbGUgaWYgdGhpcyBmaWxlIGlzIGxvYWRlZCBmcm9tIGl0cyBkdW1wZWQgbG9jYXRpb24sCiAgICAgICAgICAgIC8vIGFuZCBub3QgZnJvbSBpdHMgc291cmNlIGxvY2F0aW9uIGluIHRoZSBjb21wb3Nlci9jb21wb3NlciBwYWNrYWdlLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy85OTM3CiAgICAgICAgICAgIGlmIChzdWJzdHIoX19ESVJfXywgLTgsIDEpICE9PSAnQycpIHsKICAgICAgICAgICAgICAgIHNlbGY6OiRpbnN0YWxsZWQgPSBpbmNsdWRlIF9fRElSX18gLiAnL2luc3RhbGxlZC5waHAnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2VsZjo6JGluc3RhbGxlZCA9IGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjokaW5zdGFsbGVkOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmF3IGRhdGEgb2YgYWxsIGluc3RhbGxlZC5waHAgd2hpY2ggYXJlIGN1cnJlbnRseSBsb2FkZWQgZm9yIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5W10KICAgICAqIEBwc2FsbS1yZXR1cm4gbGlzdDxhcnJheXtyb290OiBhcnJheXtuYW1lOiBzdHJpbmcsIHByZXR0eV92ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmd8bnVsbCwgdHlwZTogc3RyaW5nLCBpbnN0YWxsX3BhdGg6IHN0cmluZywgYWxpYXNlczogc3RyaW5nW10sIGRldjogYm9vbH0sIHZlcnNpb25zOiBhcnJheTxzdHJpbmcsIGFycmF5e3ByZXR0eV92ZXJzaW9uPzogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nLCByZWZlcmVuY2U/OiBzdHJpbmd8bnVsbCwgdHlwZT86IHN0cmluZywgaW5zdGFsbF9wYXRoPzogc3RyaW5nLCBhbGlhc2VzPzogc3RyaW5nW10sIGRldl9yZXF1aXJlbWVudDogYm9vbCwgcmVwbGFjZWQ/OiBzdHJpbmdbXSwgcHJvdmlkZWQ/OiBzdHJpbmdbXX0+fT4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGxSYXdEYXRhKCkKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6Z2V0SW5zdGFsbGVkKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBMZXRzIHlvdSByZWxvYWQgdGhlIHN0YXRpYyBhcnJheSBmcm9tIGFub3RoZXIgZmlsZQogICAgICoKICAgICAqIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGNvbXBsZXggaW50ZWdyYXRpb25zIGluIHdoaWNoIGEgcHJvamVjdCBuZWVkcyB0byB1c2UKICAgICAqIHRoaXMgY2xhc3MgYnV0IHRoZW4gYWxzbyBuZWVkcyB0byBleGVjdXRlIGFub3RoZXIgcHJvamVjdCdzIGF1dG9sb2FkZXIgaW4gcHJvY2VzcywKICAgICAqIGFuZCB3YW50cyB0byBlbnN1cmUgYm90aCBwcm9qZWN0cyBoYXZlIGFjY2VzcyB0byB0aGVpciB2ZXJzaW9uIG9mIGluc3RhbGxlZC5waHAuCiAgICAgKgogICAgICogQSB0eXBpY2FsIGNhc2Ugd291bGQgYmUgUEhQVW5pdCwgd2hlcmUgaXQgd291bGQgbmVlZCB0byBtYWtlIHN1cmUgaXQgcmVhZHMgYWxsCiAgICAgKiB0aGUgZGF0YSBpdCBuZWVkcyBmcm9tIHRoaXMgY2xhc3MsIHRoZW4gY2FsbCByZWxvYWQoKSB3aXRoCiAgICAgKiBgcmVxdWlyZSAkQ1dEL3ZlbmRvci9jb21wb3Nlci9pbnN0YWxsZWQucGhwYCAob3Igc2ltaWxhcikgYXMgaW5wdXQgdG8gbWFrZSBzdXJlCiAgICAgKiB0aGUgcHJvamVjdCBpbiB3aGljaCBpdCBydW5zIGNhbiB0aGVuIGFsc28gdXNlIHRoaXMgY2xhc3Mgc2FmZWx5LCB3aXRob3V0CiAgICAgKiBpbnRlcmZlcmVuY2UgYmV0d2VlbiBQSFBVbml0J3MgZGVwZW5kZW5jaWVzIGFuZCB0aGUgcHJvamVjdCdzIGRlcGVuZGVuY2llcy4KICAgICAqCiAgICAgKiBAcGFyYW0gIGFycmF5W10gJGRhdGEgQSB2ZW5kb3IvY29tcG9zZXIvaW5zdGFsbGVkLnBocCBkYXRhIHNldAogICAgICogQHJldHVybiB2b2lkCiAgICAgKgogICAgICogQHBzYWxtLXBhcmFtIGFycmF5e3Jvb3Q6IGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfSwgdmVyc2lvbnM6IGFycmF5PHN0cmluZywgYXJyYXl7cHJldHR5X3ZlcnNpb24/OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIHJlZmVyZW5jZT86IHN0cmluZ3xudWxsLCB0eXBlPzogc3RyaW5nLCBpbnN0YWxsX3BhdGg/OiBzdHJpbmcsIGFsaWFzZXM/OiBzdHJpbmdbXSwgZGV2X3JlcXVpcmVtZW50OiBib29sLCByZXBsYWNlZD86IHN0cmluZ1tdLCBwcm92aWRlZD86IHN0cmluZ1tdfT59ICRkYXRhCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVsb2FkKCRkYXRhKQogICAgewogICAgICAgIHNlbGY6OiRpbnN0YWxsZWQgPSAkZGF0YTsKICAgICAgICBzZWxmOjokaW5zdGFsbGVkQnlWZW5kb3IgPSBhcnJheSgpOwoKICAgICAgICAvLyB3aGVuIHVzaW5nIHJlbG9hZCwgd2UgZGlzYWJsZSB0aGUgZHVwbGljYXRlIHByb3RlY3Rpb24gdG8gZW5zdXJlIHRoYXQgc2VsZjo6JGluc3RhbGxlZCBkYXRhIGlzCiAgICAgICAgLy8gYWx3YXlzIHJldHVybmVkLCBidXQgd2UgY2Fubm90IGtub3cgd2hldGhlciBpdCBjb21lcyBmcm9tIHRoZSBpbnN0YWxsZWQucGhwIGluIF9fRElSX18gb3Igbm90LAogICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gYXNzdW1lIGl0IGRvZXMgbm90LCBhbmQgdGhhdCBtYXkgcmVzdWx0IGluIGR1cGxpY2F0ZSBkYXRhIGJlaW5nIHJldHVybmVkIHdoZW4gbGlzdGluZwogICAgICAgIC8vIGFsbCBpbnN0YWxsZWQgcGFja2FnZXMgZm9yIGV4YW1wbGUKICAgICAgICBzZWxmOjokaW5zdGFsbGVkSXNMb2NhbERpciA9IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0U2VsZkRpcigpCiAgICB7CiAgICAgICAgaWYgKHNlbGY6OiRzZWxmRGlyID09PSBudWxsKSB7CiAgICAgICAgICAgIHNlbGY6OiRzZWxmRGlyID0gc3RydHIoX19ESVJfXywgJ1xcJywgJy8nKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjokc2VsZkRpcjsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gYXJyYXlbXQogICAgICogQHBzYWxtLXJldHVybiBsaXN0PGFycmF5e3Jvb3Q6IGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfSwgdmVyc2lvbnM6IGFycmF5PHN0cmluZywgYXJyYXl7cHJldHR5X3ZlcnNpb24/OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIHJlZmVyZW5jZT86IHN0cmluZ3xudWxsLCB0eXBlPzogc3RyaW5nLCBpbnN0YWxsX3BhdGg/OiBzdHJpbmcsIGFsaWFzZXM/OiBzdHJpbmdbXSwgZGV2X3JlcXVpcmVtZW50OiBib29sLCByZXBsYWNlZD86IHN0cmluZ1tdLCBwcm92aWRlZD86IHN0cmluZ1tdfT59PgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YWxsZWQoKQogICAgewogICAgICAgIGlmIChudWxsID09PSBzZWxmOjokY2FuR2V0VmVuZG9ycykgewogICAgICAgICAgICBzZWxmOjokY2FuR2V0VmVuZG9ycyA9IG1ldGhvZF9leGlzdHMoJ0NvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyJywgJ2dldFJlZ2lzdGVyZWRMb2FkZXJzJyk7CiAgICAgICAgfQoKICAgICAgICAkaW5zdGFsbGVkID0gYXJyYXkoKTsKICAgICAgICAkY29waWVkTG9jYWxEaXIgPSBmYWxzZTsKCiAgICAgICAgaWYgKHNlbGY6OiRjYW5HZXRWZW5kb3JzKSB7CiAgICAgICAgICAgICRzZWxmRGlyID0gc2VsZjo6Z2V0U2VsZkRpcigpOwogICAgICAgICAgICBmb3JlYWNoIChDbGFzc0xvYWRlcjo6Z2V0UmVnaXN0ZXJlZExvYWRlcnMoKSBhcyAkdmVuZG9yRGlyID0+ICRsb2FkZXIpIHsKICAgICAgICAgICAgICAgICR2ZW5kb3JEaXIgPSBzdHJ0cigkdmVuZG9yRGlyLCAnXFwnLCAnLycpOwogICAgICAgICAgICAgICAgaWYgKGlzc2V0KHNlbGY6OiRpbnN0YWxsZWRCeVZlbmRvclskdmVuZG9yRGlyXSkpIHsKICAgICAgICAgICAgICAgICAgICAkaW5zdGFsbGVkW10gPSBzZWxmOjokaW5zdGFsbGVkQnlWZW5kb3JbJHZlbmRvckRpcl07CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoaXNfZmlsZSgkdmVuZG9yRGlyLicvY29tcG9zZXIvaW5zdGFsbGVkLnBocCcpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB2YXIgYXJyYXl7cm9vdDogYXJyYXl7bmFtZTogc3RyaW5nLCBwcmV0dHlfdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHJlZmVyZW5jZTogc3RyaW5nfG51bGwsIHR5cGU6IHN0cmluZywgaW5zdGFsbF9wYXRoOiBzdHJpbmcsIGFsaWFzZXM6IHN0cmluZ1tdLCBkZXY6IGJvb2x9LCB2ZXJzaW9uczogYXJyYXk8c3RyaW5nLCBhcnJheXtwcmV0dHlfdmVyc2lvbj86IHN0cmluZywgdmVyc2lvbj86IHN0cmluZywgcmVmZXJlbmNlPzogc3RyaW5nfG51bGwsIHR5cGU/OiBzdHJpbmcsIGluc3RhbGxfcGF0aD86IHN0cmluZywgYWxpYXNlcz86IHN0cmluZ1tdLCBkZXZfcmVxdWlyZW1lbnQ6IGJvb2wsIHJlcGxhY2VkPzogc3RyaW5nW10sIHByb3ZpZGVkPzogc3RyaW5nW119Pn0gJHJlcXVpcmVkICovCiAgICAgICAgICAgICAgICAgICAgJHJlcXVpcmVkID0gcmVxdWlyZSAkdmVuZG9yRGlyLicvY29tcG9zZXIvaW5zdGFsbGVkLnBocCc7CiAgICAgICAgICAgICAgICAgICAgc2VsZjo6JGluc3RhbGxlZEJ5VmVuZG9yWyR2ZW5kb3JEaXJdID0gJHJlcXVpcmVkOwogICAgICAgICAgICAgICAgICAgICRpbnN0YWxsZWRbXSA9ICRyZXF1aXJlZDsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZjo6JGluc3RhbGxlZCA9PT0gbnVsbCAmJiAkdmVuZG9yRGlyLicvY29tcG9zZXInID09PSAkc2VsZkRpcikgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokaW5zdGFsbGVkID0gJHJlcXVpcmVkOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokaW5zdGFsbGVkSXNMb2NhbERpciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNlbGY6OiRpbnN0YWxsZWRJc0xvY2FsRGlyICYmICR2ZW5kb3JEaXIuJy9jb21wb3NlcicgPT09ICRzZWxmRGlyKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvcGllZExvY2FsRGlyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG51bGwgPT09IHNlbGY6OiRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgLy8gb25seSByZXF1aXJlIHRoZSBpbnN0YWxsZWQucGhwIGZpbGUgaWYgdGhpcyBmaWxlIGlzIGxvYWRlZCBmcm9tIGl0cyBkdW1wZWQgbG9jYXRpb24sCiAgICAgICAgICAgIC8vIGFuZCBub3QgZnJvbSBpdHMgc291cmNlIGxvY2F0aW9uIGluIHRoZSBjb21wb3Nlci9jb21wb3NlciBwYWNrYWdlLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy85OTM3CiAgICAgICAgICAgIGlmIChzdWJzdHIoX19ESVJfXywgLTgsIDEpICE9PSAnQycpIHsKICAgICAgICAgICAgICAgIC8qKiBAdmFyIGFycmF5e3Jvb3Q6IGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfSwgdmVyc2lvbnM6IGFycmF5PHN0cmluZywgYXJyYXl7cHJldHR5X3ZlcnNpb24/OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIHJlZmVyZW5jZT86IHN0cmluZ3xudWxsLCB0eXBlPzogc3RyaW5nLCBpbnN0YWxsX3BhdGg/OiBzdHJpbmcsIGFsaWFzZXM/OiBzdHJpbmdbXSwgZGV2X3JlcXVpcmVtZW50OiBib29sLCByZXBsYWNlZD86IHN0cmluZ1tdLCBwcm92aWRlZD86IHN0cmluZ1tdfT59ICRyZXF1aXJlZCAqLwogICAgICAgICAgICAgICAgJHJlcXVpcmVkID0gcmVxdWlyZSBfX0RJUl9fIC4gJy9pbnN0YWxsZWQucGhwJzsKICAgICAgICAgICAgICAgIHNlbGY6OiRpbnN0YWxsZWQgPSAkcmVxdWlyZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZWxmOjokaW5zdGFsbGVkID0gYXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHNlbGY6OiRpbnN0YWxsZWQgIT09IGFycmF5KCkgJiYgISRjb3BpZWRMb2NhbERpcikgewogICAgICAgICAgICAkaW5zdGFsbGVkW10gPSBzZWxmOjokaW5zdGFsbGVkOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRpbnN0YWxsZWQ7CiAgICB9Cn0KewogICAgIiRzY2hlbWEiOiAiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCiAgICAidGl0bGUiOiAiQ29tcG9zZXIgTG9jayBGaWxlIiwKICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAicmVxdWlyZWQiOiBbICJjb250ZW50LWhhc2giLCAicGFja2FnZXMiLCAicGFja2FnZXMtZGV2IiBdLAogICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogdHJ1ZSwKICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICJfcmVhZG1lIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZm9ybWF0aW9uYWwgdGV4dCBmb3IgaHVtYW5zIHJlYWRpbmcgdGhlIGZpbGUiCiAgICAgICAgfSwKICAgICAgICAiY29udGVudC1oYXNoIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSGFzaCBvZiBhbGwgcmVsZXZhbnQgcHJvcGVydGllcyBvZiB0aGUgY29tcG9zZXIuanNvbiB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIGxvY2sgZmlsZS4iCiAgICAgICAgfSwKICAgICAgICAicGFja2FnZXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGFycmF5IG9mIHBhY2thZ2VzIHRoYXQgYXJlIHJlcXVpcmVkLiIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICIkcmVmIjogIi4vY29tcG9zZXItc2NoZW1hLmpzb24iLAogICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJuYW1lIiwgInZlcnNpb24iXQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGFja2FnZXMtZGV2IjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBwYWNrYWdlcyB0aGF0IGFyZSByZXF1aXJlZCBpbiByZXF1aXJlLWRldi4iLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAiJHJlZiI6ICIuL2NvbXBvc2VyLXNjaGVtYS5qc29uIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiYWxpYXNlcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5saW5lIGFsaWFzZXMgZGVmaW5lZCBpbiB0aGUgcm9vdCBwYWNrYWdlLiIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbICJwYWNrYWdlIiwgInZlcnNpb24iLCAiYWxpYXMiLCAiYWxpYXNfbm9ybWFsaXplZCIgXSwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxpYXNfbm9ybWFsaXplZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgIm1pbmltdW0tc3RhYmlsaXR5IjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0tc3RhYmlsaXR5IHVzZWQgdG8gZ2VuZXJhdGUgdGhpcyBsb2NrIGZpbGUuIgogICAgICAgIH0sCiAgICAgICAgInN0YWJpbGl0eS1mbGFncyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJvb3QgcGFja2FnZSBzdGFiaWxpdHkgZmxhZ3MgY2hhbmdpbmcgdGhlIG1pbmltdW0tc3RhYmlsaXR5IGZvciBzcGVjaWZpYyBwYWNrYWdlcy4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicHJlZmVyLXN0YWJsZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRoZSAtLXByZWZlci1zdGFibGUgZmxhZyB3YXMgdXNlZCB3aGVuIGJ1aWxkaW5nIHRoaXMgbG9jayBmaWxlLiIKICAgICAgICB9LAogICAgICAgICJwcmVmZXItbG93ZXN0IjogewogICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIC0tcHJlZmVyLWxvd2VzdCBmbGFnIHdhcyB1c2VkIHdoZW4gYnVpbGRpbmcgdGhpcyBsb2NrIGZpbGUuIgogICAgICAgIH0sCiAgICAgICAgInBsYXRmb3JtIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGxhdGZvcm0gcmVxdWlyZW1lbnRzIG9mIHRoZSByb290IHBhY2thZ2UuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGxhdGZvcm0tZGV2IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGxhdGZvcm0gZGV2LXJlcXVpcmVtZW50cyBvZiB0aGUgcm9vdCBwYWNrYWdlLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInBsYXRmb3JtLW92ZXJyaWRlcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBsYXRmb3JtIGNvbmZpZyBvdmVycmlkZXMgb2YgdGhlIHJvb3QgcGFja2FnZS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwbHVnaW4tYXBpLXZlcnNpb24iOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgY29tcG9zZXItcGx1Z2luLWFwaSB2ZXJzaW9uIHRoYXQgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgdGhpcyBsb2NrIGZpbGUuIgogICAgICAgIH0KICAgIH0KfQp7CiAgICAiJHNjaGVtYSI6ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKICAgICJ0aXRsZSI6ICJDb21wb3NlciBQYWNrYWdlIFJlcG9zaXRvcnkiLAogICAgInR5cGUiOiAib2JqZWN0IiwKICAgICJvbmVPZiI6IFsKICAgICAgICB7ICJyZXF1aXJlZCI6IFsgInBhY2thZ2VzIiBdIH0sCiAgICAgICAgeyAicmVxdWlyZWQiOiBbICJwcm92aWRlcnMiIF0gfSwKICAgICAgICB7ICJyZXF1aXJlZCI6IFsgInByb3ZpZGVyLWluY2x1ZGVzIiwgInByb3ZpZGVycy11cmwiIF0gfSwKICAgICAgICB7ICJyZXF1aXJlZCI6IFsgIm1ldGFkYXRhLXVybCIgXSB9CiAgICBdLAogICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgInBhY2thZ2VzIjogewogICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0IiwgImFycmF5Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGhhc2htYXAgb2YgcGFja2FnZSBuYW1lcyBpbiB0aGUgZm9ybSBvZiA8dmVuZG9yPi88bmFtZT4uIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3ZlcnNpb25zIiB9CiAgICAgICAgfSwKICAgICAgICAibWV0YWRhdGEtdXJsIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW5kcG9pbnQgdG8gcmV0cmlldmUgcGFja2FnZSBtZXRhZGF0YSBkYXRhIGZyb20sIGluIENvbXBvc2VyIHYyIGZvcm1hdCwgZS5nLiAnL3AyLyVwYWNrYWdlJS5qc29uJy4iCiAgICAgICAgfSwKICAgICAgICAiYXZhaWxhYmxlLXBhY2thZ2VzIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHlvdXIgcmVwb3NpdG9yeSBvbmx5IGhhcyBhIHNtYWxsIG51bWJlciBvZiBwYWNrYWdlcywgYW5kIHlvdSB3YW50IHRvIGF2b2lkIHNlcnZpbmcgbWFueSA0MDRzLCBzcGVjaWZ5IGFsbCB0aGUgcGFja2FnZSBuYW1lcyB0aGF0IHlvdXIgcmVwb3NpdG9yeSBjb250YWlucyBoZXJlLiIKICAgICAgICB9LAogICAgICAgICJhdmFpbGFibGUtcGFja2FnZS1wYXR0ZXJucyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB5b3VyIHJlcG9zaXRvcnkgb25seSBoYXMgYSBzbWFsbCBudW1iZXIgb2YgcGFja2FnZXMsIGFuZCB5b3Ugd2FudCB0byBhdm9pZCBzZXJ2aW5nIG1hbnkgNDA0cywgc3BlY2lmeSBwYWNrYWdlIG5hbWUgcGF0dGVybnMgY29udGFpbmluZyB3aWxkY2FyZHMgKCopIHRoYXQgeW91ciByZXBvc2l0b3J5IGNvbnRhaW5zIGhlcmUuIgogICAgICAgIH0sCiAgICAgICAgInNlY3VyaXR5LWFkdmlzb3JpZXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsibWV0YWRhdGEiLCAiYXBpLXVybCJdLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1ldGFkYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgbWV0YWRhdGEgZmlsZXMgY29udGFpbiBzZWN1cml0eSBhZHZpc29yeSBkYXRhIG9yIHdoZXRoZXIgaXQgc2hvdWxkIGFsd2F5cyBiZSBxdWVyaWVkIHVzaW5nIHRoZSBBUEkgVVJMLiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhcGktdXJsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW5kcG9pbnQgdG8gY2FsbCB0byByZXRyaWV2ZSBzZWN1cml0eSBhZHZpc29yaWVzIGRhdGEuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgIm1ldGFkYXRhLWNoYW5nZXMtdXJsIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW5kcG9pbnQgdG8gcmV0cmlldmUgcGFja2FnZSBtZXRhZGF0YSB1cGRhdGVzIGZyb20uIFRoaXMgc2hvdWxkIHJlY2VpdmUgYSB0aW1lc3RhbXAgc2luY2UgbGFzdCBjYWxsIHRvIGJlIGFibGUgdG8gcmV0dXJuIG5ldyBjaGFuZ2VzLiBlLmcuICcvbWV0YWRhdGEvY2hhbmdlcy5qc29uJy4iCiAgICAgICAgfSwKICAgICAgICAicHJvdmlkZXJzLWFwaSI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVuZHBvaW50IHRvIHJldHJpZXZlIHBhY2thZ2UgbmFtZXMgcHJvdmlkaW5nIGEgZ2l2ZW4gbmFtZSBmcm9tLCBlLmcuICcvcHJvdmlkZXJzLyVwYWNrYWdlJS5qc29uJy4iCiAgICAgICAgfSwKICAgICAgICAibm90aWZ5LWJhdGNoIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW5kcG9pbnQgdG8gY2FsbCBhZnRlciBtdWx0aXBsZSBwYWNrYWdlcyBoYXZlIGJlZW4gaW5zdGFsbGVkLCBlLmcuICcvZG93bmxvYWRzLycuIgogICAgICAgIH0sCiAgICAgICAgInNlYXJjaCI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVuZHBvaW50IHRoYXQgcHJvdmlkZXMgc2VhcmNoIGNhcGFiaWxpdGllcywgZS5nLiAnL3NlYXJjaC5qc29uP3E9JXF1ZXJ5JSZ0eXBlPSV0eXBlJScuIgogICAgICAgIH0sCiAgICAgICAgImxpc3QiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmRwb2ludCB0aGF0IHByb3ZpZGVzIGEgZnVsbCBsaXN0IG9mIHBhY2thZ2VzIHByZXNlbnQgaW4gdGhlIHJlcG9zaXRvcnkuIEl0IHNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgYD9maWx0ZXI9eHhgIHF1ZXJ5IHBhcmFtLCB3aGljaCBjYW4gY29udGFpbiBgKmAgYXMgd2lsZGNhcmRzIG1hdGNoaW5nIGFueSBzdWJzdHJpbmcuIGUuZy4gJy9saXN0Lmpzb24nLiIKICAgICAgICB9LAogICAgICAgICJ3YXJuaW5ncyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJtZXNzYWdlIiwgInZlcnNpb25zIl0sCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbWVzc2FnZSB0aGF0IHdpbGwgYmUgb3V0cHV0IGJ5IENvbXBvc2VyIGFzIGEgd2FybmluZyB3aGVuIHRoaXMgc291cmNlIGlzIGNvbnN1bHRlZC4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVyc2lvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHZlcnNpb24gY29uc3RyYWludCB0byBsaW1pdCB0byB3aGljaCBDb21wb3NlciB2ZXJzaW9ucyB0aGUgd2FybmluZyBzaG91bGQgYmUgc2hvd24uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImluZm9zIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbIm1lc3NhZ2UiLCAidmVyc2lvbnMiXSwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBvdXRwdXQgYnkgQ29tcG9zZXIgYXMgaW5mbyB3aGVuIHRoaXMgc291cmNlIGlzIGNvbnN1bHRlZC4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVyc2lvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHZlcnNpb24gY29uc3RyYWludCB0byBsaW1pdCB0byB3aGljaCBDb21wb3NlciB2ZXJzaW9ucyB0aGUgaW5mbyBzaG91bGQgYmUgc2hvd24uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInByb3ZpZGVycy11cmwiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJERVBSRUNBVEVEOiBFbmRwb2ludCB0byByZXRyaWV2ZSBwcm92aWRlciBkYXRhIGZyb20sIGUuZy4gJy9wLyVwYWNrYWdlJSQlaGFzaCUuanNvbicuIgogICAgICAgIH0sCiAgICAgICAgInByb3ZpZGVyLWluY2x1ZGVzIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSBoYXNobWFwIG9mIHByb3ZpZGVyIGxpc3RpbmdzLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wcm92aWRlciIgfQogICAgICAgIH0sCiAgICAgICAgInByb3ZpZGVycyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRFUFJFQ0FURUQ6IEEgaGFzaG1hcCBvZiBwYWNrYWdlIG5hbWVzIGluIHRoZSBmb3JtIG9mIDx2ZW5kb3I+LzxuYW1lPi4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcHJvdmlkZXIiIH0KICAgICAgICB9LAogICAgICAgICJ3YXJuaW5nIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBvdXRwdXQgYnkgQ29tcG9zZXIgYXMgYSB3YXJuaW5nIHdoZW4gdGhpcyBzb3VyY2UgaXMgY29uc3VsdGVkLiIKICAgICAgICB9LAogICAgICAgICJ3YXJuaW5nLXZlcnNpb25zIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSB2ZXJzaW9uIGNvbnN0cmFpbnQgdG8gbGltaXQgdG8gd2hpY2ggQ29tcG9zZXIgdmVyc2lvbnMgdGhlIHdhcm5pbmcgc2hvdWxkIGJlIHNob3duLiIKICAgICAgICB9LAogICAgICAgICJpbmZvIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBvdXRwdXQgYnkgQ29tcG9zZXIgYXMgYSBpbmZvIHdoZW4gdGhpcyBzb3VyY2UgaXMgY29uc3VsdGVkLiIKICAgICAgICB9LAogICAgICAgICJpbmZvLXZlcnNpb25zIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSB2ZXJzaW9uIGNvbnN0cmFpbnQgdG8gbGltaXQgdG8gd2hpY2ggQ29tcG9zZXIgdmVyc2lvbnMgdGhlIGluZm8gc2hvdWxkIGJlIHNob3duLiIKICAgICAgICB9CiAgICB9LAogICAgImRlZmluaXRpb25zIjogewogICAgICAgICJ2ZXJzaW9ucyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgaGFzaG1hcCBvZiB2ZXJzaW9ucyBhbmQgdGhlaXIgbWV0YWRhdGEuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3ZlcnNpb24iIH0KICAgICAgICB9LAogICAgICAgICJ2ZXJzaW9uIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAib25lT2YiOiBbCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcGFja2FnZSIgfSwKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9tZXRhcGFja2FnZSIgfQogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICAicGFja2FnZS1iYXNlIjogewogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInZlcnNpb24iOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTm9ybWFsaXplZCB2ZXJzaW9uLCBvcHRpb25hbCBidXQgY2FuIHNhdmUgY29tcHV0YXRpb25hbCB0aW1lIG9uIGNsaWVudCBzaWRlLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXV0b2xvYWQiOiB7ICJ0eXBlIjogIm9iamVjdCIgfSwKICAgICAgICAgICAgICAgICJyZXF1aXJlIjogeyAidHlwZSI6ICJvYmplY3QiIH0sCiAgICAgICAgICAgICAgICAicmVwbGFjZSI6IHsgInR5cGUiOiAib2JqZWN0IiB9LAogICAgICAgICAgICAgICAgImNvbmZsaWN0IjogeyAidHlwZSI6ICJvYmplY3QiIH0sCiAgICAgICAgICAgICAgICAicHJvdmlkZSI6IHsgInR5cGUiOiAib2JqZWN0IiB9LAogICAgICAgICAgICAgICAgInRpbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAicGFja2FnZSI6IHsKICAgICAgICAgICAgImFsbE9mIjogWwogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3BhY2thZ2UtYmFzZSIgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImRpc3QiOiB7ICJ0eXBlIjogIm9iamVjdCIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSI6IHsgInR5cGUiOiAib2JqZWN0IiB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsgIm9uZU9mIjogWwogICAgICAgICAgICAgICAgICAgIHsgInJlcXVpcmVkIjogWyAibmFtZSIsICJ2ZXJzaW9uIiwgInNvdXJjZSIgXSB9LAogICAgICAgICAgICAgICAgICAgIHsgInJlcXVpcmVkIjogWyAibmFtZSIsICJ2ZXJzaW9uIiwgImRpc3QiIF0gfQogICAgICAgICAgICAgICAgXSB9CiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgICJtZXRhcGFja2FnZSI6IHsKICAgICAgICAgICAgImFsbE9mIjogWwogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3BhY2thZ2UtYmFzZSIgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyAibWV0YXBhY2thZ2UiIF0gfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyAibmFtZSIsICJ2ZXJzaW9uIiwgInR5cGUiIF0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgInByb3ZpZGVyIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJzaGEyNTYiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSGFzaCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSByZXNvdXJjZS4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KewogICAgIiRzY2hlbWEiOiAiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCiAgICAidGl0bGUiOiAiQ29tcG9zZXIgUGFja2FnZSIsCiAgICAidHlwZSI6ICJvYmplY3QiLAogICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgIm5hbWUiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQYWNrYWdlIG5hbWUsIGluY2x1ZGluZyAndmVuZG9yLW5hbWUvJyBwcmVmaXguIiwKICAgICAgICAgICAgInBhdHRlcm4iOiAiXlthLXowLTldKFtfLi1dP1thLXowLTldKykqXC9bYS16MC05XSgoW18uXXwtezEsMn0pP1thLXowLTldKykqJCIKICAgICAgICB9LAogICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNob3J0IHBhY2thZ2UgZGVzY3JpcHRpb24uIgogICAgICAgIH0sCiAgICAgICAgImxpY2Vuc2UiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYXJyYXkiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpY2Vuc2UgbmFtZS4gT3IgYW4gYXJyYXkgb2YgbGljZW5zZSBuYW1lcy4iCiAgICAgICAgfSwKICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBhY2thZ2UgdHlwZSwgZWl0aGVyICdsaWJyYXJ5JyBmb3IgY29tbW9uIHBhY2thZ2VzLCAnY29tcG9zZXItcGx1Z2luJyBmb3IgcGx1Z2lucywgJ21ldGFwYWNrYWdlJyBmb3IgZW1wdHkgcGFja2FnZXMsIG9yIGEgY3VzdG9tIHR5cGUgKFthLXowLTktXSspIGRlZmluZWQgYnkgd2hhdGV2ZXIgcHJvamVjdCB0aGlzIHBhY2thZ2UgYXBwbGllcyB0by4iLAogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAicGF0dGVybiI6ICJeW2EtejAtOS1dKyQiCiAgICAgICAgfSwKICAgICAgICAiYWJhbmRvbmVkIjogewogICAgICAgICAgICAidHlwZSI6IFsiYm9vbGVhbiIsICJzdHJpbmciXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGFja2FnZSBoYXMgYmVlbiBhYmFuZG9uZWQsIGl0IGNhbiBiZSBib29sZWFuIG9yIGEgcGFja2FnZSBuYW1lL1VSTCBwb2ludGluZyB0byBhIHJlY29tbWVuZGVkIGFsdGVybmF0aXZlLiBEZWZhdWx0cyB0byBmYWxzZS4iCiAgICAgICAgfSwKICAgICAgICAidmVyc2lvbiI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBhY2thZ2UgdmVyc2lvbiwgc2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNC1zY2hlbWEubWQjdmVyc2lvbiBmb3IgbW9yZSBpbmZvIG9uIHZhbGlkIHNjaGVtZXMuIiwKICAgICAgICAgICAgInBhdHRlcm4iOiAiXlt2Vl0/XFxkKyg/OlsuLV1cXGQrKXswLDN9Wy5fLV0/KD86KD86W3NTXVt0VF1bYUFdW2JCXVtsTF1bZUVdfFtiQl1bZUVdW3RUXVthQV18W2JCXXxbclJdW2NDXXxbYUFdW2xMXVtwUF1baEhdW2FBXXxbYUFdfFtwUF1bYUFdW3RUXVtjQ11baEhdfFtwUF1bbExdfFtwUF0pKD86KD86Wy4tXT9cXGQrKSorKT8pPyg/OlsuLV0/W2REXVtlRV1bdlZdfFxcLngtZGV2KT8oPzpcXCsuKik/JHxeZGV2LS4qJCIKICAgICAgICB9LAogICAgICAgICJkZWZhdWx0LWJyYW5jaCI6IHsKICAgICAgICAgICAgInR5cGUiOiBbImJvb2xlYW4iXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkludGVybmFsIHVzZSBvbmx5LCBkbyBub3Qgc3BlY2lmeSB0aGlzIGluIGNvbXBvc2VyLmpzb24uIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdmVyc2lvbiBpcyB0aGUgZGVmYXVsdCBicmFuY2ggb2YgdGhlIGxpbmtlZCBWQ1MgcmVwb3NpdG9yeS4gRGVmYXVsdHMgdG8gZmFsc2UuIgogICAgICAgIH0sCiAgICAgICAgIm5vbi1mZWF0dXJlLWJyYW5jaGVzIjogewogICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgc2V0IG9mIHN0cmluZyBvciByZWdleCBwYXR0ZXJucyBmb3Igbm9uLW51bWVyaWMgYnJhbmNoIG5hbWVzIHRoYXQgd2lsbCBub3QgYmUgaGFuZGxlZCBhcyBmZWF0dXJlIGJyYW5jaGVzLiIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImtleXdvcmRzIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSB0YWcva2V5d29yZCB0aGF0IHRoaXMgcGFja2FnZSByZWxhdGVzIHRvLiIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInJlYWRtZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJlbGF0aXZlIHBhdGggdG8gdGhlIHJlYWRtZSBkb2N1bWVudC4iCiAgICAgICAgfSwKICAgICAgICAidGltZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBhY2thZ2UgcmVsZWFzZSBkYXRlLCBpbiAnWVlZWS1NTS1ERCcsICdZWVlZLU1NLUREIEhIOk1NOlNTJyBvciAnWVlZWS1NTS1ERFRISDpNTTpTU1onIGZvcm1hdC4iCiAgICAgICAgfSwKICAgICAgICAiYXV0aG9ycyI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9hdXRob3JzIgogICAgICAgIH0sCiAgICAgICAgImhvbWVwYWdlIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG9tZXBhZ2UgVVJMIGZvciB0aGUgcHJvamVjdC4iLAogICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICB9LAogICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJlbWFpbCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbWFpbCBhZGRyZXNzIGZvciBzdXBwb3J0LiIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJlbWFpbCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiaXNzdWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVSTCB0byB0aGUgaXNzdWUgdHJhY2tlci4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJmb3J1bSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVUkwgdG8gdGhlIGZvcnVtLiIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIndpa2kiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIHRoZSB3aWtpLiIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImlyYyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJUkMgY2hhbm5lbCBmb3Igc3VwcG9ydCwgYXMgaXJjOi8vc2VydmVyL2NoYW5uZWwuIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2hhdCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVUkwgdG8gdGhlIHN1cHBvcnQgY2hhdC4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIGJyb3dzZSBvciBkb3dubG9hZCB0aGUgc291cmNlcy4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJkb2NzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVSTCB0byB0aGUgZG9jdW1lbnRhdGlvbi4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIHRoZSBSU1MgZmVlZC4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzZWN1cml0eSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVUkwgdG8gdGhlIHZ1bG5lcmFiaWxpdHkgZGlzY2xvc3VyZSBwb2xpY3kgKFZEUCkuIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBvcHRpb25zIHRvIGZ1bmQgdGhlIGRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZSBvZiB0aGUgcGFja2FnZS4iLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUeXBlIG9mIGZ1bmRpbmcgb3IgcGxhdGZvcm0gdGhyb3VnaCB3aGljaCBmdW5kaW5nIGlzIHBvc3NpYmxlLiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1cmwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVUkwgdG8gYSB3ZWJzaXRlIHdpdGggZGV0YWlscyBvbiBmdW5kaW5nIGFuZCBhIHdheSB0byBmdW5kIHRoZSBwYWNrYWdlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zb3VyY2UiCiAgICAgICAgfSwKICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kaXN0IgogICAgICAgIH0sCiAgICAgICAgIl9jb21tZW50IjogewogICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGtleSB0byBzdG9yZSBjb21tZW50cyBpbiIKICAgICAgICB9LAogICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgcGFja2FnZSBuYW1lIChrZXlzKSBhbmQgdmVyc2lvbiBjb25zdHJhaW50cyAodmFsdWVzKSB0aGF0IGFyZSByZXF1aXJlZCB0byBydW4gdGhpcyBwYWNrYWdlLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgcGFja2FnZSBuYW1lIChrZXlzKSBhbmQgdmVyc2lvbiBjb25zdHJhaW50cyAodmFsdWVzKSB0aGF0IHRoaXMgcGFja2FnZSByZXF1aXJlcyBmb3IgZGV2ZWxvcGluZyBpdCAodGVzdGluZyB0b29scyBhbmQgc3VjaCkuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVwbGFjZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIHBhY2thZ2UgbmFtZSAoa2V5cykgYW5kIHZlcnNpb24gY29uc3RyYWludHMgKHZhbHVlcykgdGhhdCBjYW4gYmUgcmVwbGFjZWQgYnkgdGhpcyBwYWNrYWdlLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImNvbmZsaWN0IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgcGFja2FnZSBuYW1lIChrZXlzKSBhbmQgdmVyc2lvbiBjb25zdHJhaW50cyAodmFsdWVzKSB0aGF0IGNvbmZsaWN0IHdpdGggdGhpcyBwYWNrYWdlLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInByb3ZpZGUiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBwYWNrYWdlIG5hbWUgKGtleXMpIGFuZCB2ZXJzaW9uIGNvbnN0cmFpbnRzICh2YWx1ZXMpIHRoYXQgdGhpcyBwYWNrYWdlIHByb3ZpZGVzIGluIGFkZGl0aW9uIHRvIHRoaXMgcGFja2FnZSdzIG5hbWUuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAic3VnZ2VzdCI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIHBhY2thZ2UgbmFtZSAoa2V5cykgYW5kIGRlc2NyaXB0aW9ucyAodmFsdWVzKSB0aGF0IHRoaXMgcGFja2FnZSBzdWdnZXN0cyB3b3JrIHdlbGwgd2l0aCBpdCAodGhpcyB3aWxsIGJlIHN1Z2dlc3RlZCB0byB0aGUgdXNlciBkdXJpbmcgaW5zdGFsbGF0aW9uKS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZXBvc2l0b3JpZXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJvYmplY3QiLCAiYXJyYXkiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgc2V0IG9mIGFkZGl0aW9uYWwgcmVwb3NpdG9yaWVzIHdoZXJlIHBhY2thZ2VzIGNhbiBiZSBmb3VuZC4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3JlcG9zaXRvcnkiIH0sCiAgICAgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJib29sZWFuIiwgImVudW0iOiBbZmFsc2VdIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgImFueU9mIjogWwogICAgICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9yZXBvc2l0b3J5IiB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAidHlwZSI6ICJib29sZWFuIiwgImVudW0iOiBbZmFsc2VdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5Qcm9wZXJ0aWVzIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgIm1heFByb3BlcnRpZXMiOiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAibWluaW11bS1zdGFiaWxpdHkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBtaW5pbXVtIHN0YWJpbGl0eSB0aGUgcGFja2FnZXMgbXVzdCBoYXZlIHRvIGJlIGluc3RhbGwtYWJsZS4gUG9zc2libGUgdmFsdWVzIGFyZTogZGV2LCBhbHBoYSwgYmV0YSwgUkMsIHN0YWJsZS4iLAogICAgICAgICAgICAiZW51bSI6IFsiZGV2IiwgImFscGhhIiwgImJldGEiLCAicmMiLCAiUkMiLCAic3RhYmxlIl0KICAgICAgICB9LAogICAgICAgICJwcmVmZXItc3RhYmxlIjogewogICAgICAgICAgICAidHlwZSI6IFsiYm9vbGVhbiJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgc2V0IHRvIHRydWUsIHN0YWJsZSBwYWNrYWdlcyB3aWxsIGJlIHByZWZlcnJlZCB0byBkZXYgcGFja2FnZXMgd2hlbiBwb3NzaWJsZSwgZXZlbiBpZiB0aGUgbWluaW11bS1zdGFiaWxpdHkgYWxsb3dzIHVuc3RhYmxlIHBhY2thZ2VzLiIKICAgICAgICB9LAogICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9hdXRvbG9hZCIKICAgICAgICB9LAogICAgICAgICJhdXRvbG9hZC1kZXYiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXNjcmlwdGlvbiBvZiBhZGRpdGlvbmFsIGF1dG9sb2FkIHJ1bGVzIGZvciBkZXZlbG9wbWVudCBwdXJwb3NlIChlZy4gYSB0ZXN0IHN1aXRlKS4iLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJwc3ItMCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBuYW1lc3BhY2VzIChrZXlzKSBhbmQgdGhlIGRpcmVjdG9yaWVzIHRoZXkgY2FuIGJlIGZvdW5kIGludG8gKHZhbHVlcywgY2FuIGJlIGFycmF5cyBvZiBwYXRocykgYnkgdGhlIGF1dG9sb2FkZXIuIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYXJyYXkiXSwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBuYW1lc3BhY2VzIChrZXlzKSBhbmQgdGhlIFBTUi00IGRpcmVjdG9yaWVzIHRoZXkgY2FuIG1hcCB0byAodmFsdWVzLCBjYW4gYmUgYXJyYXlzIG9mIHBhdGhzKSBieSB0aGUgYXV0b2xvYWRlci4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJhcnJheSJdLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsYXNzbWFwIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBhcnJheSBvZiBwYXRocyB0aGF0IGNvbnRhaW4gY2xhc3NlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY2xhc3MtbWFwIGdlbmVyYXRpb24gcHJvY2Vzcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBhcnJheSBvZiBmaWxlcyB0aGF0IGFyZSBhbHdheXMgcmVxdWlyZWQgb24gZXZlcnkgcmVxdWVzdC4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJ0YXJnZXQtZGlyIjogewogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogRm9yY2VzIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RhbGxlZCBpbnRvIHRoZSBnaXZlbiBzdWJkaXJlY3RvcnkgcGF0aC4gVGhpcyBpcyB1c2VkIGZvciBhdXRvbG9hZGluZyBQU1ItMCBwYWNrYWdlcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZWlyIGZ1bGwgcGF0aC4gVXNlIGZvcndhcmQgc2xhc2hlcyBmb3IgY3Jvc3MtcGxhdGZvcm0gY29tcGF0aWJpbGl0eS4iLAogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgfSwKICAgICAgICAiaW5jbHVkZS1wYXRoIjogewogICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRFUFJFQ0FURUQ6IEEgbGlzdCBvZiBkaXJlY3RvcmllcyB3aGljaCBzaG91bGQgZ2V0IGFkZGVkIHRvIFBIUCdzIGluY2x1ZGUgcGF0aC4gVGhpcyBpcyBvbmx5IHByZXNlbnQgdG8gc3VwcG9ydCBsZWdhY3kgcHJvamVjdHMsIGFuZCBhbGwgbmV3IGNvZGUgc2hvdWxkIHByZWZlcmFibHkgdXNlIGF1dG9sb2FkaW5nLiIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImJpbiI6IHsKICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJhcnJheSJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBzZXQgb2YgZmlsZXMsIG9yIGEgc2luZ2xlIGZpbGUsIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYmluYXJpZXMgYW5kIHN5bWxpbmtlZCBpbnRvIGJpbi1kaXIgKGZyb20gY29uZmlnKS4iLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJhcmNoaXZlIjogewogICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25zIGZvciBjcmVhdGluZyBwYWNrYWdlIGFyY2hpdmVzIGZvciBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGJhc2UgbmFtZSBmb3IgYXJjaGl2ZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgcGF0dGVybnMgZm9yIHBhdGhzIHRvIGV4Y2x1ZGUgb3IgaW5jbHVkZSBpZiBwcmVmaXhlZCB3aXRoIGFuIGV4Y2xhbWF0aW9uIG1hcmsuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGhwLWV4dCI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNldHRpbmdzIGZvciBQSFAgZXh0ZW5zaW9uIHBhY2thZ2VzLiIsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgImV4dGVuc2lvbi1uYW1lIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHNwZWNpZmllZCwgdGhpcyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiwgd2hlcmUgbmVlZGVkIGJ5IHRvb2xpbmcuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCwgdGhlIGV4dGVuc2lvbiBuYW1lIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBDb21wb3NlciBwYWNrYWdlIG5hbWUgKGUuZy4gYHZlbmRvci9uYW1lYCB3b3VsZCBiZWNvbWUgYGV4dC1uYW1lYCkuIFRoZSBleHRlbnNpb24gbmFtZSBtYXkgYmUgc3BlY2lmaWVkIHdpdGggb3Igd2l0aG91dCB0aGUgYGV4dC1gIHByZWZpeCwgYW5kIHRvb2xzIHRoYXQgdXNlIHRoaXMgbXVzdCBub3JtYWxpc2UgdGhpcyBhcHByb3ByaWF0ZWx5LiIsCiAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiAiZXh0LXhkZWJ1ZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJpb3JpdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgdXNlZCB0byBhZGQgYSBwcmVmaXggdG8gdGhlIElOSSBmaWxlLCBlLmcuIGA5MC14ZGVidWcuaW5pYCB3aGljaCBhZmZlY3RzIHRoZSBsb2FkaW5nIG9yZGVyLiBUaGUgcHJpb3JpdHkgaXMgYSBudW1iZXIgaW4gdGhlIHJhbmdlIDEwLTk5IGluY2x1c2l2ZSwgd2l0aCAxMCBiZWluZyB0aGUgaGlnaGVzdCBwcmlvcml0eSAoaS5lLiB3aWxsIGJlIHByb2Nlc3NlZCBmaXJzdCksIGFuZCA5OSBiZWluZyB0aGUgbG93ZXN0IHByaW9yaXR5IChpLmUuIHdpbGwgYmUgcHJvY2Vzc2VkIGxhc3QpLiBUaGVyZSBhcmUgdHdvIGRpZ2l0cyBzbyB0aGF0IHRoZSBmaWxlcyBzb3J0IGNvcnJlY3RseSBvbiBhbnkgcGxhdGZvcm0sIHdoZXRoZXIgdGhlIHNvcnRpbmcgaXMgbmF0dXJhbCBvciBub3QuIiwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IDEwLAogICAgICAgICAgICAgICAgICAgICJtYXhpbXVtIjogOTksCiAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiA4MCwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDgwCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInN1cHBvcnQtenRzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEb2VzIHRoaXMgcGFja2FnZSBzdXBwb3J0IFplbmQgVGhyZWFkIFNhZmV0eSIsCiAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic3VwcG9ydC1udHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRvZXMgdGhpcyBwYWNrYWdlIHN1cHBvcnQgbm9uLVRocmVhZCBTYWZlIG1vZGUiLAogICAgICAgICAgICAgICAgICAgICJleGFtcGxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJ1aWxkLXBhdGgiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJudWxsIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHNwZWNpZmllZCwgdGhpcyBpcyB0aGUgc3ViZGlyZWN0b3J5IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSBleHRlbnNpb24gaW5zdGVhZCBvZiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC4iLAogICAgICAgICAgICAgICAgICAgICJleGFtcGxlIjogIm15LWV4dGVuc2lvbi1zb3VyY2UiLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogbnVsbAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJkb3dubG9hZC11cmwtbWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHNwZWNpZmllZCwgdGhpcyB0ZWNobmlxdWUgd2lsbCBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBVUkwgdGhhdCBQSUUgdXNlcyB0byBkb3dubG9hZCB0aGUgYXNzZXQuIFRoZSBkZWZhdWx0LCBpZiBub3Qgc3BlY2lmaWVkLCBpcyBjb21wb3Nlci1kZWZhdWx0LiIsCiAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbImNvbXBvc2VyLWRlZmF1bHQiLCAicHJlLXBhY2thZ2VkLXNvdXJjZSJdLAogICAgICAgICAgICAgICAgICAgICJleGFtcGxlIjogImNvbXBvc2VyLWRlZmF1bHQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm9zLWZhbWlsaWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAxLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBPUyBmYW1pbGllcyB0byBtYXJrIGFzIGNvbXBhdGlibGUgd2l0aCB0aGUgZXh0ZW5zaW9uLiBTcGVjaWZ5aW5nIHRoaXMgcHJvcGVydHkgd2lsbCBtZWFuIHRoaXMgcGFja2FnZSBpcyBub3QgaW5zdGFsbGFibGUgd2l0aCBQSUUgb24gYW55IE9TIGZhbWlseSBub3QgbGlzdGVkIGhlcmUuIE11c3Qgbm90IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgb3MtZmFtaWxpZXMtZXhjbHVkZS4iLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbIndpbmRvd3MiLCAiYnNkIiwgImRhcndpbiIsICJzb2xhcmlzIiwgImxpbnV4IiwgInVua25vd24iXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBuYW1lIG9mIHRoZSBPUyBmYW1pbHkgdG8gbWFyayBhcyBjb21wYXRpYmxlLiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm9zLWZhbWlsaWVzLWV4Y2x1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJtaW5JdGVtcyI6IDEsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGFycmF5IG9mIE9TIGZhbWlsaWVzIHRvIG1hcmsgYXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGV4dGVuc2lvbi4gU3BlY2lmeWluZyB0aGlzIHByb3BlcnR5IHdpbGwgbWVhbiB0aGlzIHBhY2thZ2UgaXMgaW5zdGFsbGFibGUgb24gYW55IE9TIGZhbWlseSBleGNlcHQgdGhvc2UgbGlzdGVkIGhlcmUuIE11c3Qgbm90IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgb3MtZmFtaWxpZXMuIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJ3aW5kb3dzIiwgImJzZCIsICJkYXJ3aW4iLCAic29sYXJpcyIsICJsaW51eCIsICJ1bmtub3duIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbmFtZSBvZiB0aGUgT1MgZmFtaWx5IHRvIGV4Y2x1ZGUuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY29uZmlndXJlLW9wdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGVzZSBjb25maWd1cmUgb3B0aW9ucyBtYWtlIHVwIHRoZSBmbGFncyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gLi9jb25maWd1cmUgd2hlbiBpbnN0YWxsaW5nIHRoZSBleHRlbnNpb24uIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsibmFtZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBuYW1lIG9mIHRoZSBmbGFnLCB0aGlzIHdvdWxkIHR5cGljYWxseSBiZSBwcmVmaXhlZCB3aXRoIGAtLWAsIGZvciBleGFtcGxlLCB0aGUgdmFsdWUgJ3RoZS1mbGFnJyB3b3VsZCBiZSBwYXNzZWQgYXMgYC4vY29uZmlndXJlIC0tdGhlLWZsYWdgLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiAid2l0aG91dC14ZGVidWctY29tcHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogIl5bYS16QS1aMC05XVthLXpBLVowLTktX10qJCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVlZHMtdmFsdWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZSBmbGFnIG5lZWRzIGEgdmFsdWUgKGUuZy4gLS13aXRoLXNvbWVsaWI9PHBhdGg+KSwgb3RoZXJ3aXNlIGl0IGlzIGEgZmxhZyB3aXRob3V0IGEgdmFsdWUgKGUuZy4gLS1lbmFibGUtc29tZS1mZWF0dXJlKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGFtcGxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgZmxhZyBkb2VzIG9yIG1lYW5zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiAiRGlzYWJsZSBjb21wcmVzc2lvbiB0aHJvdWdoIHpsaWIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhbGxPZiI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibm90IjogewogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbIm9zLWZhbWlsaWVzIiwgIm9zLWZhbWlsaWVzLWV4Y2x1ZGUiXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgImNvbmZpZyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbXBvc2VyIG9wdGlvbnMuIiwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAicGxhdGZvcm0iOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgcGFja2FnZSBuYW1lIChrZXlzKSBhbmQgdmVyc2lvbiAodmFsdWVzKSB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb2NrIHRoZSBwbGF0Zm9ybSBwYWNrYWdlcyBvbiB0aGlzIG1hY2hpbmUsIHRoZSB2ZXJzaW9uIGNhbiBiZSBzZXQgdG8gZmFsc2UgdG8gbWFrZSBpdCBhcHBlYXIgbGlrZSB0aGUgcGFja2FnZSBpcyBub3QgcHJlc2VudC4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJib29sZWFuIl0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImFsbG93LXBsdWdpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCIsICJib29sZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIHtcInBhdHRlcm5cIjogdHJ1ZXxmYWxzZX0gd2l0aCBwYWNrYWdlcyB3aGljaCBhcmUgYWxsb3dlZCB0byBiZSBsb2FkZWQgYXMgcGx1Z2lucywgb3IgdHJ1ZSB0byBhbGxvdyBhbGwsIGZhbHNlIHRvIGFsbG93IG5vbmUuIERlZmF1bHRzIHRvIHt9IHdoaWNoIHByb21wdHMgd2hlbiBhbiB1bmtub3duIHBsdWdpbiBpcyBhZGRlZC4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImJvb2xlYW4iXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJvY2Vzcy10aW1lb3V0IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgdGltZW91dCBpbiBzZWNvbmRzIGZvciBwcm9jZXNzIGV4ZWN1dGlvbnMsIGRlZmF1bHRzIHRvIDMwMCAoNW1pbnMpLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidXNlLWluY2x1ZGUtcGF0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIENvbXBvc2VyIGF1dG9sb2FkZXIgd2lsbCBhbHNvIGxvb2sgZm9yIGNsYXNzZXMgaW4gdGhlIFBIUCBpbmNsdWRlIHBhdGguIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1c2UtcGFyZW50LWRpciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImJvb2xlYW4iXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hlbiBydW5uaW5nIENvbXBvc2VyIGluIGEgZGlyZWN0b3J5IHdoZXJlIHRoZXJlIGlzIG5vIGNvbXBvc2VyLmpzb24sIGlmIHRoZXJlIGlzIG9uZSBwcmVzZW50IGluIGEgZGlyZWN0b3J5IGFib3ZlIENvbXBvc2VyIHdpbGwgYnkgZGVmYXVsdCBhc2sgeW91IHdoZXRoZXIgeW91IHdhbnQgdG8gdXNlIHRoYXQgZGlyZWN0b3J5J3MgY29tcG9zZXIuanNvbiBpbnN0ZWFkLiBPbmUgb2Y6IHRydWUgKGFsd2F5cyB1c2UgcGFyZW50IGlmIG5lZWRlZCksIGZhbHNlIChuZXZlciBhc2sgb3IgdXNlIGl0KSBvciBcInByb21wdFwiIChhc2sgZXZlcnkgdGltZSksIGRlZmF1bHRzIHRvIHByb21wdC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZWZlcnJlZC1pbnN0YWxsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAib2JqZWN0Il0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBpbnN0YWxsIG1ldGhvZCBDb21wb3NlciB3aWxsIHByZWZlciB0byB1c2UsIGRlZmF1bHRzIHRvIGF1dG8gYW5kIGNhbiBiZSBhbnkgb2Ygc291cmNlLCBkaXN0LCBhdXRvLCBvciBhbiBvYmplY3Qgb2Yge1wicGF0dGVyblwiOiBcInByZWZlcmVuY2VcIn0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXVkaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VjdXJpdHkgYXVkaXQgY29uZmlndXJhdGlvbiBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgYWR2aXNvcnkgaWRzLCByZW1vdGUgaWRzIG9yIENWRSBpZHMgKGtleXMpIGFuZCB0aGUgZXhwbGFuYXRpb25zICh2YWx1ZXMpIGZvciB3aHkgdGhleSdyZSBiZWluZyBpZ25vcmVkLiBUaGUgbGlzdGVkIGl0ZW1zIGFyZSByZXBvcnRlZCBidXQgbGV0IHRoZSBhdWRpdCBjb21tYW5kIHBhc3MuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJzdHJpbmciXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgc2V0IG9mIGFkdmlzb3J5IGlkcywgcmVtb3RlIGlkcyBvciBDVkUgaWRzIHRoYXQgYXJlIHJlcG9ydGVkIGJ1dCBsZXQgdGhlIGF1ZGl0IGNvbW1hbmQgcGFzcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJhYmFuZG9uZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaWdub3JlIiwgInJlcG9ydCIsICJmYWlsIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciBhYmFuZG9uZWQgcGFja2FnZXMgc2hvdWxkIGJlIGlnbm9yZWQsIHJlcG9ydGVkIGFzIHByb2JsZW1zIG9yIGNhdXNlIGFuIGF1ZGl0IGZhaWx1cmUuIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RpZnktb24taW5zdGFsbCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29tcG9zZXIgYWxsb3dzIHJlcG9zaXRvcmllcyB0byBkZWZpbmUgYSBub3RpZmljYXRpb24gVVJMLCBzbyB0aGF0IHRoZXkgZ2V0IG5vdGlmaWVkIHdoZW5ldmVyIGEgcGFja2FnZSBmcm9tIHRoYXQgcmVwb3NpdG9yeSBpcyBpbnN0YWxsZWQuIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZGlzYWJsZSB0aGF0IGJlaGF2aW91ciwgZGVmYXVsdHMgdG8gdHJ1ZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImdpdGh1Yi1wcm90b2NvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgcHJvdG9jb2xzIHRvIHVzZSBmb3IgZ2l0aHViLmNvbSBjbG9uZXMsIGluIHByaW9yaXR5IG9yZGVyLCBkZWZhdWx0cyB0byBbXCJodHRwc1wiLCBcInNzaFwiLCBcImdpdFwiXS4iLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0aHViLW9hdXRoIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIG9iamVjdCBvZiBkb21haW4gbmFtZSA9PiBnaXRodWIgQVBJIG9hdXRoIHRva2VucywgdHlwaWNhbGx5IHtcImdpdGh1Yi5jb21cIjpcIjx0b2tlbj5cIn0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImdpdGxhYi1vYXV0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBvYmplY3Qgb2YgZG9tYWluIG5hbWUgPT4gZ2l0bGFiIEFQSSBvYXV0aCB0b2tlbnMsIHR5cGljYWxseSB7XCJnaXRsYWIuY29tXCI6e1wiZXhwaXJlcy1hdFwiOlwiPGV4cGlyYXRpb24gZGF0ZT5cIiwgXCJyZWZyZXNoLXRva2VuXCI6XCI8cmVmcmVzaCB0b2tlbj5cIiwgXCJ0b2tlblwiOlwiPHRva2VuPlwifX0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAib2JqZWN0Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsgInRva2VuIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGlyZXMtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBleHBpcmF0aW9uIGRhdGUgZm9yIHRoaXMgR2l0TGFiIHRva2VuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWZyZXNoLXRva2VuIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSByZWZyZXNoIHRva2VuIHVzZWQgZm9yIEdpdExhYiBhdXRoZW50aWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9rZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHRva2VuIHVzZWQgZm9yIEdpdExhYiBhdXRoZW50aWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0bGFiLXRva2VuIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIG9iamVjdCBvZiBkb21haW4gbmFtZSA9PiBnaXRsYWIgcHJpdmF0ZSB0b2tlbnMsIHR5cGljYWxseSB7XCJnaXRsYWIuY29tXCI6XCI8dG9rZW4+XCJ9LCBvciBhbiBvYmplY3Qgd2l0aCB1c2VybmFtZSBhbmQgdG9rZW4ga2V5cy4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJvYmplY3QiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ1c2VybmFtZSIsICJ0b2tlbiJdLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VybmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgdXNlcm5hbWUgdXNlZCBmb3IgR2l0TGFiIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b2tlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgdG9rZW4gdXNlZCBmb3IgR2l0TGFiIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJnaXRsYWItcHJvdG9jb2wiOiB7CiAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbImdpdCIsICJodHRwIiwgImh0dHBzIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgcHJvdG9jb2wgdG8gZm9yY2UgdXNlIG9mIHdoZW4gY3JlYXRpbmcgYSByZXBvc2l0b3J5IFVSTCBmb3IgdGhlIGBzb3VyY2VgIHZhbHVlIG9mIHRoZSBwYWNrYWdlIG1ldGFkYXRhLiBPbmUgb2YgYGdpdGAgb3IgYGh0dHBgLiBCeSBkZWZhdWx0LCBDb21wb3NlciB3aWxsIGdlbmVyYXRlIGEgZ2l0IFVSTCBmb3IgcHJpdmF0ZSByZXBvc2l0b3JpZXMgYW5kIGh0dHAgb25lIGZvciBwdWJsaWMgcmVwb3MuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJiZWFyZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gb2JqZWN0IG9mIGRvbWFpbiBuYW1lID0+IGJlYXJlciBhdXRoZW50aWNhdGlvbiB0b2tlbiwgZm9yIGV4YW1wbGUge1wiZXhhbXBsZS5jb21cIjpcIjx0b2tlbj5cIn0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRpc2FibGUtdGxzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZWZhdWx0cyB0byBgZmFsc2VgLiBJZiBzZXQgdG8gdHJ1ZSBhbGwgSFRUUFMgVVJMcyB3aWxsIGJlIHRyaWVkIHdpdGggSFRUUCBpbnN0ZWFkIGFuZCBubyBuZXR3b3JrIGxldmVsIGVuY3J5cHRpb24gaXMgcGVyZm9ybWVkLiBFbmFibGluZyB0aGlzIGlzIGEgc2VjdXJpdHkgcmlzayBhbmQgaXMgTk9UIHJlY29tbWVuZGVkLiBUaGUgYmV0dGVyIHdheSBpcyB0byBlbmFibGUgdGhlIHBocF9vcGVuc3NsIGV4dGVuc2lvbiBpbiBwaHAuaW5pLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic2VjdXJlLWh0dHAiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmF1bHRzIHRvIGB0cnVlYC4gSWYgc2V0IHRvIHRydWUgb25seSBIVFRQUyBVUkxzIGFyZSBhbGxvd2VkIHRvIGJlIGRvd25sb2FkZWQgdmlhIENvbXBvc2VyLiBJZiB5b3UgcmVhbGx5IGFic29sdXRlbHkgbmVlZCBIVFRQIGFjY2VzcyB0byBzb21ldGhpbmcgdGhlbiB5b3UgY2FuIGRpc2FibGUgaXQsIGJ1dCB1c2luZyBcIkxldCdzIEVuY3J5cHRcIiB0byBnZXQgYSBmcmVlIFNTTCBjZXJ0aWZpY2F0ZSBpcyBnZW5lcmFsbHkgYSBiZXR0ZXIgYWx0ZXJuYXRpdmUuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzZWN1cmUtc3ZuLWRvbWFpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgZG9tYWlucyB3aGljaCBzaG91bGQgYmUgdHJ1c3RlZC9tYXJrZWQgYXMgdXNpbmcgYSBzZWN1cmUgU3VidmVyc2lvbi9TVk4gdHJhbnNwb3J0LiBCeSBkZWZhdWx0IHN2bjovLyBwcm90b2NvbCBpcyBzZWVuIGFzIGluc2VjdXJlIGFuZCB3aWxsIHRocm93LiBUaGlzIGlzIGEgYmV0dGVyL3NhZmVyIGFsdGVybmF0aXZlIHRvIGRpc2FibGluZyBgc2VjdXJlLWh0dHBgIGFsdG9nZXRoZXIuIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhZmlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHdheSB0byBzZXQgdGhlIHBhdGggdG8gdGhlIG9wZW5zc2wgQ0EgZmlsZS4gSW4gUEhQIDUuNisgeW91IHNob3VsZCByYXRoZXIgc2V0IHRoaXMgdmlhIG9wZW5zc2wuY2FmaWxlIGluIHBocC5pbmksIGFsdGhvdWdoIFBIUCA1LjYrIHNob3VsZCBiZSBhYmxlIHRvIGRldGVjdCB5b3VyIHN5c3RlbSBDQSBmaWxlIGF1dG9tYXRpY2FsbHkuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjYXBhdGgiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgY2FmaWxlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaWYgdGhlIGNlcnRpZmljYXRlIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGRpcmVjdG9yeSBwb2ludGVkIHRvIGJ5IGNhcGF0aCBpcyBzZWFyY2hlZCBmb3IgYSBzdWl0YWJsZSBjZXJ0aWZpY2F0ZS4gY2FwYXRoIG11c3QgYmUgYSBjb3JyZWN0bHkgaGFzaGVkIGNlcnRpZmljYXRlIGRpcmVjdG9yeS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImh0dHAtYmFzaWMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gb2JqZWN0IG9mIGRvbWFpbiBuYW1lID0+IHtcInVzZXJuYW1lXCI6IFwiLi4uXCIsIFwicGFzc3dvcmRcIjogXCIuLi5cIn0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidXNlcm5hbWUiLCAicGFzc3dvcmQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHVzZXJuYW1lIHVzZWQgZm9yIEhUVFAgQmFzaWMgYXV0aGVudGljYXRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhc3N3b3JkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwYXNzd29yZCB1c2VkIGZvciBIVFRQIEJhc2ljIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzdG9yZS1hdXRocyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImJvb2xlYW4iXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hhdCB0byBkbyBhZnRlciBwcm9tcHRpbmcgZm9yIGF1dGhlbnRpY2F0aW9uLCBvbmUgb2Y6IHRydWUgKHN0b3JlKSwgZmFsc2UgKGRvIG5vdCBzdG9yZSkgb3IgXCJwcm9tcHRcIiAoYXNrIGV2ZXJ5IHRpbWUpLCBkZWZhdWx0cyB0byBwcm9tcHQuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ2ZW5kb3ItZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBhbGwgcGFja2FnZXMgYXJlIGluc3RhbGxlZCwgZGVmYXVsdHMgdG8gXCJ2ZW5kb3JcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJpbi1kaXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGxvY2F0aW9uIHdoZXJlIGFsbCBiaW5hcmllcyBhcmUgbGlua2VkLCBkZWZhdWx0cyB0byBcInZlbmRvci9iaW5cIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRhdGEtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBvbGQgcGhhciBmaWxlcyBhcmUgc3RvcmVkLCBkZWZhdWx0cyB0byBcIiRob21lXCIgZXhjZXB0IG9uIFhERyBCYXNlIERpcmVjdG9yeSBjb21wbGlhbnQgdW5peGVzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FjaGUtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBhbGwgY2FjaGVzIGFyZSBsb2NhdGVkLCBkZWZhdWx0cyB0byBcIn4vLmNvbXBvc2VyL2NhY2hlXCIgb24gKm5peCBhbmQgXCIlTE9DQUxBUFBEQVRBJVxcQ29tcG9zZXJcIiBvbiB3aW5kb3dzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FjaGUtZmlsZXMtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBmaWxlcyAoemlwIGRvd25sb2FkcykgYXJlIGNhY2hlZCwgZGVmYXVsdHMgdG8gXCJ7JGNhY2hlLWRpcn0vZmlsZXNcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLXJlcG8tZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSByZXBvIChnaXQvaGcgcmVwbyBjbG9uZXMpIGFyZSBjYWNoZWQsIGRlZmF1bHRzIHRvIFwieyRjYWNoZS1kaXJ9L3JlcG9cIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLXZjcy1kaXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGxvY2F0aW9uIHdoZXJlIHZjcyBpbmZvcyAoZ2l0IGNsb25lcywgZ2l0aHViIGFwaSBjYWxscywgZXRjLiB3aGVuIHJlYWRpbmcgdmNzIHJlcG9zKSBhcmUgY2FjaGVkLCBkZWZhdWx0cyB0byBcInskY2FjaGUtZGlyfS92Y3NcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLXR0bCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGRlZmF1bHQgY2FjaGUgdGltZS10by1saXZlLCBkZWZhdWx0cyB0byAxNTU1MjAwMCAoNiBtb250aHMpLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FjaGUtZmlsZXMtdHRsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgY2FjaGUgdGltZS10by1saXZlIGZvciBmaWxlcywgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIGNhY2hlLXR0bC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLWZpbGVzLW1heHNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJpbnRlZ2VyIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBjYWNoZSBtYXggc2l6ZSBmb3IgdGhlIGZpbGVzIGNhY2hlLCBkZWZhdWx0cyB0byBcIjMwME1pQlwiLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FjaGUtcmVhZC1vbmx5IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJib29sZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gdXNlIHRoZSBDb21wb3NlciBjYWNoZSBpbiByZWFkLW9ubHkgbW9kZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJpbi1jb21wYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbImF1dG8iLCAiZnVsbCIsICJwcm94eSIsICJzeW1saW5rIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBjb21wYXRpYmlsaXR5IG9mIHRoZSBiaW5hcmllcywgZGVmYXVsdHMgdG8gXCJhdXRvXCIgKGF1dG9tYXRpY2FsbHkgZ3Vlc3NlZCksIGNhbiBiZSBcImZ1bGxcIiAoY29tcGF0aWJsZSB3aXRoIGJvdGggV2luZG93cyBhbmQgVW5peC1iYXNlZCBzeXN0ZW1zKSBhbmQgXCJwcm94eVwiIChvbmx5IGJhc2gtc3R5bGUgcHJveHkpLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZGlzY2FyZC1jaGFuZ2VzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYm9vbGVhbiJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZGVmYXVsdCBzdHlsZSBvZiBoYW5kbGluZyBkaXJ0eSB1cGRhdGVzLCBkZWZhdWx0cyB0byBmYWxzZSBhbmQgY2FuIGJlIGFueSBvZiB0cnVlLCBmYWxzZSBvciBcInN0YXNoXCIuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdXRvbG9hZGVyLXN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBzdHJpbmcgdG8gYmUgdXNlZCBhcyBhIHN1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCBDb21wb3NlciBhdXRvbG9hZGVyLiBXaGVuIG51bGwgYSByYW5kb20gb25lIHdpbGwgYmUgZ2VuZXJhdGVkLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3B0aW1pemUtYXV0b2xvYWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWx3YXlzIG9wdGltaXplIHdoZW4gZHVtcGluZyB0aGUgYXV0b2xvYWRlci4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZXBlbmQtYXV0b2xvYWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgZmFsc2UsIHRoZSBjb21wb3NlciBhdXRvbG9hZGVyIHdpbGwgbm90IGJlIHByZXBlbmRlZCB0byBleGlzdGluZyBhdXRvbG9hZGVycywgZGVmYXVsdHMgdG8gdHJ1ZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsYXNzbWFwLWF1dGhvcml0YXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBjb21wb3NlciBhdXRvbG9hZGVyIHdpbGwgbm90IHNjYW4gdGhlIGZpbGVzeXN0ZW0gZm9yIGNsYXNzZXMgdGhhdCBhcmUgbm90IGZvdW5kIGluIHRoZSBjbGFzcyBtYXAsIGRlZmF1bHRzIHRvIGZhbHNlLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXBjdS1hdXRvbG9hZGVyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlLCB0aGUgQ29tcG9zZXIgYXV0b2xvYWRlciB3aWxsIGNoZWNrIGZvciBBUEN1IGFuZCB1c2UgaXQgdG8gY2FjaGUgZm91bmQvbm90LWZvdW5kIGNsYXNzZXMgd2hlbiB0aGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQsIGRlZmF1bHRzIHRvIGZhbHNlLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0aHViLWRvbWFpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgZG9tYWlucyB0byB1c2UgaW4gZ2l0aHViIG1vZGUuIFRoaXMgaXMgdXNlZCBmb3IgR2l0SHViIEVudGVycHJpc2Ugc2V0dXBzLCBkZWZhdWx0cyB0byBbXCJnaXRodWIuY29tXCJdLiIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJnaXRodWItZXhwb3NlLWhvc3RuYW1lIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZWZhdWx0cyB0byB0cnVlLiBJZiBzZXQgdG8gZmFsc2UsIHRoZSBPQXV0aCB0b2tlbnMgY3JlYXRlZCB0byBhY2Nlc3MgdGhlIGdpdGh1YiBBUEkgd2lsbCBoYXZlIGEgZGF0ZSBpbnN0ZWFkIG9mIHRoZSBtYWNoaW5lIGhvc3RuYW1lLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0bGFiLWRvbWFpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgZG9tYWlucyB0byB1c2UgaW4gZ2l0bGFiIG1vZGUuIFRoaXMgaXMgdXNlZCBmb3IgY3VzdG9tIEdpdExhYiBzZXR1cHMsIGRlZmF1bHRzIHRvIFtcImdpdGxhYi5jb21cIl0uIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJpdGJ1Y2tldC1vYXV0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBvYmplY3Qgb2YgZG9tYWluIG5hbWUgPT4ge1wiY29uc3VtZXIta2V5XCI6IFwiLi4uXCIsIFwiY29uc3VtZXItc2VjcmV0XCI6IFwiLi4uXCJ9LiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbImNvbnN1bWVyLWtleSIsICJjb25zdW1lci1zZWNyZXQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3VtZXIta2V5IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBjb25zdW1lci1rZXkgdXNlZCBmb3IgT0F1dGggYXV0aGVudGljYXRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN1bWVyLXNlY3JldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgY29uc3VtZXItc2VjcmV0IHVzZWQgZm9yIE9BdXRoIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3MtdG9rZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIE9BdXRoIHRva2VuIHJldHJpZXZlZCBmcm9tIEJpdGJ1Y2tldCdzIEFQSSwgdGhpcyBpcyB3cml0dGVuIGJ5IENvbXBvc2VyIGFuZCB5b3Ugc2hvdWxkIG5vdCBzZXQgaXQgbm9yIG1vZGlmeSBpdC4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2Vzcy10b2tlbi1leHBpcmF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZ2VuZXJhdGVkIHRva2VuJ3MgZXhwaXJhdGlvbiB0aW1lc3RhbXAsIHRoaXMgaXMgd3JpdHRlbiBieSBDb21wb3NlciBhbmQgeW91IHNob3VsZCBub3Qgc2V0IGl0IG5vciBtb2RpZnkgaXQuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1c2UtZ2l0aHViLWFwaSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gdHJ1ZS4gIElmIHNldCB0byBmYWxzZSwgZ2xvYmFsbHkgZGlzYWJsZXMgdGhlIHVzZSBvZiB0aGUgR2l0SHViIEFQSSBmb3IgYWxsIEdpdEh1YiByZXBvc2l0b3JpZXMgYW5kIGNsb25lcyB0aGUgcmVwb3NpdG9yeSBhcyBpdCB3b3VsZCBmb3IgYW55IG90aGVyIHJlcG9zaXRvcnkuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhcmNoaXZlLWZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZGVmYXVsdCBhcmNoaXZpbmcgZm9ybWF0IHdoZW4gbm90IHByb3ZpZGVkIG9uIGNsaSwgZGVmYXVsdHMgdG8gXCJ0YXJcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImFyY2hpdmUtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IGFyY2hpdmUgcGF0aCB3aGVuIG5vdCBwcm92aWRlZCBvbiBjbGksIGRlZmF1bHRzIHRvIFwiLlwiLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiaHRhY2Nlc3MtcHJvdGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gdHJ1ZS4gSWYgc2V0IHRvIGZhbHNlLCBDb21wb3NlciB3aWxsIG5vdCBjcmVhdGUgLmh0YWNjZXNzIGZpbGVzIGluIHRoZSBjb21wb3NlciBob21lLCBjYWNoZSwgYW5kIGRhdGEgZGlyZWN0b3JpZXMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzb3J0LXBhY2thZ2VzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZWZhdWx0cyB0byBmYWxzZS4gSWYgc2V0IHRvIHRydWUsIENvbXBvc2VyIHdpbGwgc29ydCBwYWNrYWdlcyB3aGVuIGFkZGluZy91cGRhdGluZyBhIG5ldyBkZXBlbmRlbmN5LiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibG9jayI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gdHJ1ZS4gSWYgc2V0IHRvIGZhbHNlLCBDb21wb3NlciB3aWxsIG5vdCBjcmVhdGUgYSBjb21wb3Nlci5sb2NrIGZpbGUuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwbGF0Zm9ybS1jaGVjayI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYm9vbGVhbiIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gXCJwaHAtb25seVwiIHdoaWNoIGNoZWNrcyBvbmx5IHRoZSBQSFAgdmVyc2lvbi4gU2V0dGluZyB0byB0cnVlIHdpbGwgYWxzbyBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgcmVxdWlyZWQgUEhQIGV4dGVuc2lvbnMuIElmIHNldCB0byBmYWxzZSwgQ29tcG9zZXIgd2lsbCBub3QgY3JlYXRlIGFuZCByZXF1aXJlIGEgcGxhdGZvcm1fY2hlY2sucGhwIGZpbGUgYXMgcGFydCBvZiB0aGUgYXV0b2xvYWRlciBib290c3RyYXAuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJidW1wLWFmdGVyLXVwZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImJvb2xlYW4iXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gZmFsc2UgYW5kIGNhbiBiZSBhbnkgb2YgdHJ1ZSwgZmFsc2UsIFwiZGV2XCJgIG9yIFwibm8tZGV2XCJgLiBJZiBzZXQgdG8gdHJ1ZSwgQ29tcG9zZXIgd2lsbCBydW4gdGhlIGJ1bXAgY29tbWFuZCBhZnRlciBydW5uaW5nIHRoZSB1cGRhdGUgY29tbWFuZC4gSWYgc2V0IHRvIFwiZGV2XCIgb3IgXCJuby1kZXZcIiB0aGVuIG9ubHkgdGhlIGNvcnJlc3BvbmRpbmcgZGVwZW5kZW5jaWVzIHdpbGwgYmUgYnVtcGVkLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYWxsb3ctbWlzc2luZy1yZXF1aXJlbWVudHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImJvb2xlYW4iXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gZmFsc2UuIElmIHNldCB0byB0cnVlLCBDb21wb3NlciB3aWxsIGFsbG93IGluc3RhbGwgd2hlbiBsb2NrIGZpbGUgaXMgbm90IHVwIHRvIGRhdGUgd2l0aCB0aGUgbGF0ZXN0IGNoYW5nZXMgaW4gY29tcG9zZXIuanNvbi4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCIsICJhcnJheSJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQXJiaXRyYXJ5IGV4dHJhIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCBieSBwbHVnaW5zLCBmb3IgZXhhbXBsZSwgcGFja2FnZSBvZiB0eXBlIGNvbXBvc2VyLXBsdWdpbiBtYXkgaGF2ZSBhICdjbGFzcycga2V5IGRlZmluaW5nIGFuIGluc3RhbGxlciBjbGFzcyBuYW1lLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHRydWUKICAgICAgICB9LAogICAgICAgICJzY3JpcHRzIjogewogICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTY3JpcHQgbGlzdGVuZXJzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUvYWZ0ZXIgc29tZSBldmVudHMuIiwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAicHJlLWluc3RhbGwtY21kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGJlZm9yZSB0aGUgaW5zdGFsbCBjb21tYW5kIGlzIGV4ZWN1dGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3QtaW5zdGFsbC1jbWQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYWZ0ZXIgdGhlIGluc3RhbGwgY29tbWFuZCBpcyBleGVjdXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwcmUtdXBkYXRlLWNtZCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBiZWZvcmUgdGhlIHVwZGF0ZSBjb21tYW5kIGlzIGV4ZWN1dGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3QtdXBkYXRlLWNtZCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBhZnRlciB0aGUgdXBkYXRlIGNvbW1hbmQgaXMgZXhlY3V0ZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJlLXN0YXR1cy1jbWQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYmVmb3JlIHRoZSBzdGF0dXMgY29tbWFuZCBpcyBleGVjdXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LXN0YXR1cy1jbWQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYWZ0ZXIgdGhlIHN0YXR1cyBjb21tYW5kIGlzIGV4ZWN1dGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZS1wYWNrYWdlLWluc3RhbGwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYmVmb3JlIGEgcGFja2FnZSBpcyBpbnN0YWxsZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicG9zdC1wYWNrYWdlLWluc3RhbGwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYWZ0ZXIgYSBwYWNrYWdlIGlzIGluc3RhbGxlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwcmUtcGFja2FnZS11cGRhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYmVmb3JlIGEgcGFja2FnZSBpcyB1cGRhdGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3QtcGFja2FnZS11cGRhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYWZ0ZXIgYSBwYWNrYWdlIGlzIHVwZGF0ZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJlLXBhY2thZ2UtdW5pbnN0YWxsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGJlZm9yZSBhIHBhY2thZ2UgaGFzIGJlZW4gdW5pbnN0YWxsZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicG9zdC1wYWNrYWdlLXVuaW5zdGFsbCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBhZnRlciBhIHBhY2thZ2UgaGFzIGJlZW4gdW5pbnN0YWxsZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJlLWF1dG9sb2FkLWR1bXAiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYmVmb3JlIHRoZSBhdXRvbG9hZGVyIGlzIGR1bXBlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LWF1dG9sb2FkLWR1bXAiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYWZ0ZXIgdGhlIGF1dG9sb2FkZXIgaXMgZHVtcGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3Qtcm9vdC1wYWNrYWdlLWluc3RhbGwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYWZ0ZXIgdGhlIHJvb3QtcGFja2FnZSBpcyBpbnN0YWxsZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicG9zdC1jcmVhdGUtcHJvamVjdC1jbWQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYWZ0ZXIgdGhlIGNyZWF0ZS1wcm9qZWN0IGNvbW1hbmQgaXMgZXhlY3V0ZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInNjcmlwdHMtZGVzY3JpcHRpb25zIjogewogICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXNjcmlwdGlvbnMgZm9yIGN1c3RvbSBjb21tYW5kcywgc2hvd24gaW4gY29uc29sZSBoZWxwLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInNjcmlwdHMtYWxpYXNlcyI6IHsKICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxpYXNlcyBmb3IgY3VzdG9tIGNvbW1hbmRzLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKICAgICJkZWZpbml0aW9ucyI6IHsKICAgICAgICAiYXV0aG9ycyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBhdXRob3JzIHRoYXQgY29udHJpYnV0ZWQgdG8gdGhlIHBhY2thZ2UuIFRoaXMgaXMgdHlwaWNhbGx5IHRoZSBtYWluIG1haW50YWluZXJzLCBub3QgdGhlIGZ1bGwgbGlzdC4iLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbICJuYW1lIl0sCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZ1bGwgbmFtZSBvZiB0aGUgYXV0aG9yLiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVtYWlsIGFkZHJlc3Mgb2YgdGhlIGF1dGhvci4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogImVtYWlsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG9tZXBhZ2UgVVJMIGZvciB0aGUgYXV0aG9yLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBdXRob3IncyByb2xlIGluIHRoZSBwcm9qZWN0LiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlc2NyaXB0aW9uIG9mIGhvdyB0aGUgcGFja2FnZSBjYW4gYmUgYXV0b2xvYWRlZC4iLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJwc3ItMCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBuYW1lc3BhY2VzIChrZXlzKSBhbmQgdGhlIGRpcmVjdG9yaWVzIHRoZXkgY2FuIGJlIGZvdW5kIGluICh2YWx1ZXMsIGNhbiBiZSBhcnJheXMgb2YgcGF0aHMpIGJ5IHRoZSBhdXRvbG9hZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImFycmF5Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgbmFtZXNwYWNlcyAoa2V5cykgYW5kIHRoZSBQU1ItNCBkaXJlY3RvcmllcyB0aGV5IGNhbiBtYXAgdG8gKHZhbHVlcywgY2FuIGJlIGFycmF5cyBvZiBwYXRocykgYnkgdGhlIGF1dG9sb2FkZXIuIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYXJyYXkiXSwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjbGFzc21hcCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gYXJyYXkgb2YgcGF0aHMgdGhhdCBjb250YWluIGNsYXNzZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNsYXNzLW1hcCBnZW5lcmF0aW9uIHByb2Nlc3MuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJmaWxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gYXJyYXkgb2YgZmlsZXMgdGhhdCBhcmUgYWx3YXlzIHJlcXVpcmVkIG9uIGV2ZXJ5IHJlcXVlc3QuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlLWZyb20tY2xhc3NtYXAiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIGFycmF5IG9mIHBhdHRlcm5zIHRvIGV4Y2x1ZGUgZnJvbSBhdXRvbG9hZCBjbGFzc21hcCBnZW5lcmF0aW9uLiAoZS5nLiBcImV4Y2x1ZGUtZnJvbS1jbGFzc21hcFwiOiBbXCIvdGVzdC9cIiwgXCIvdGVzdHMvXCIsIFwiL1Rlc3RzL1wiXSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInJlcG9zaXRvcnkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9jb21wb3Nlci1yZXBvc2l0b3J5IiB9LAogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Zjcy1yZXBvc2l0b3J5IiB9LAogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3BhdGgtcmVwb3NpdG9yeSIgfSwKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9hcnRpZmFjdC1yZXBvc2l0b3J5IiB9LAogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3BlYXItcmVwb3NpdG9yeSIgfSwKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wYWNrYWdlLXJlcG9zaXRvcnkiIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgImNvbXBvc2VyLXJlcG9zaXRvcnkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidHlwZSIsICJ1cmwiXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbImNvbXBvc2VyIl0gfSwKICAgICAgICAgICAgICAgICJ1cmwiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJjYW5vbmljYWwiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAib25seSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImFsbG93X3NzbF9kb3duZ3JhZGUiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAiZm9yY2UtbGF6eS1wcm92aWRlcnMiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInZjcy1yZXBvc2l0b3J5IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicmVxdWlyZWQiOiBbInR5cGUiLCAidXJsIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyJ2Y3MiLCAiZ2l0aHViIiwgImdpdCIsICJnaXRsYWIiLCAiYml0YnVja2V0IiwgImdpdC1iaXRidWNrZXQiLCAiaGciLCAiZm9zc2lsIiwgInBlcmZvcmNlIiwgInN2biJdIH0sCiAgICAgICAgICAgICAgICAidXJsIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAiY2Fub25pY2FsIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAogICAgICAgICAgICAgICAgIm9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJuby1hcGkiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAic2VjdXJlLWh0dHAiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAic3ZuLWNhY2hlLWNyZWRlbnRpYWxzIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAogICAgICAgICAgICAgICAgInRydW5rLXBhdGgiOiB7ICJ0eXBlIjogWyJzdHJpbmciLCAiYm9vbGVhbiJdIH0sCiAgICAgICAgICAgICAgICAiYnJhbmNoZXMtcGF0aCI6IHsgInR5cGUiOiBbInN0cmluZyIsICJib29sZWFuIl0gfSwKICAgICAgICAgICAgICAgICJ0YWdzLXBhdGgiOiB7ICJ0eXBlIjogWyJzdHJpbmciLCAiYm9vbGVhbiJdIH0sCiAgICAgICAgICAgICAgICAicGFja2FnZS1wYXRoIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAiZGVwb3QiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJicmFuY2giOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJ1bmlxdWVfcGVyZm9yY2VfY2xpZW50X25hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJwNHVzZXIiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJwNHBhc3N3b3JkIjogeyAidHlwZSI6ICJzdHJpbmciIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInBhdGgtcmVwb3NpdG9yeSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ0eXBlIiwgInVybCJdLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogeyAidHlwZSI6ICJzdHJpbmciLCAiZW51bSI6IFsicGF0aCJdIH0sCiAgICAgICAgICAgICAgICAidXJsIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAiY2Fub25pY2FsIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAogICAgICAgICAgICAgICAgIm9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiB7ICJ0eXBlIjogWyJzdHJpbmciXSwgImVudW0iOiBbIm5vbmUiLCAiY29uZmlnIiwgImF1dG8iXSB9LAogICAgICAgICAgICAgICAgICAgICAgICAic3ltbGluayI6IHsgInR5cGUiOiBbImJvb2xlYW4iLCAibnVsbCJdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWxhdGl2ZSI6IHsgInR5cGUiOiBbImJvb2xlYW4iXSB9LAogICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbnMiOiB7ICJ0eXBlIjogIm9iamVjdCIsICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsgInR5cGUiOiAic3RyaW5nIiB9IH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHRydWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImFydGlmYWN0LXJlcG9zaXRvcnkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidHlwZSIsICJ1cmwiXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbImFydGlmYWN0Il0gfSwKICAgICAgICAgICAgICAgICJ1cmwiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJjYW5vbmljYWwiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAib25seSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwZWFyLXJlcG9zaXRvcnkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidHlwZSIsICJ1cmwiXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbInBlYXIiXSB9LAogICAgICAgICAgICAgICAgInVybCI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgImNhbm9uaWNhbCI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKICAgICAgICAgICAgICAgICJvbmx5IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidmVuZG9yLWFsaWFzIjogeyAidHlwZSI6ICJzdHJpbmciIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInBhY2thZ2UtcmVwb3NpdG9yeSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ0eXBlIiwgInBhY2thZ2UiXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbInBhY2thZ2UiXSB9LAogICAgICAgICAgICAgICAgImNhbm9uaWNhbCI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKICAgICAgICAgICAgICAgICJvbmx5IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicGFja2FnZSI6IHsKICAgICAgICAgICAgICAgICAgICAib25lT2YiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9pbmxpbmUtcGFja2FnZSIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2lubGluZS1wYWNrYWdlIiB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJpbmxpbmUtcGFja2FnZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInJlcXVpcmVkIjogWyJuYW1lIiwgInZlcnNpb24iXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQYWNrYWdlIG5hbWUsIGluY2x1ZGluZyAndmVuZG9yLW5hbWUvJyBwcmVmaXguIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGFyZ2V0LWRpciI6IHsKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogRm9yY2VzIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RhbGxlZCBpbnRvIHRoZSBnaXZlbiBzdWJkaXJlY3RvcnkgcGF0aC4gVGhpcyBpcyB1c2VkIGZvciBhdXRvbG9hZGluZyBQU1ItMCBwYWNrYWdlcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZWlyIGZ1bGwgcGF0aC4gVXNlIGZvcndhcmQgc2xhc2hlcyBmb3IgY3Jvc3MtcGxhdGZvcm0gY29tcGF0aWJpbGl0eS4iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJrZXl3b3JkcyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJob21lcGFnZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGltZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxpY2Vuc2UiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdXRob3JzIjogewogICAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYXV0aG9ycyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVwbGFjZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY29uZmxpY3QiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByb3ZpZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzdWdnZXN0IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0IiwgImFycmF5Il0sCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogdHJ1ZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2F1dG9sb2FkIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhcmNoaXZlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJvYmplY3QiXSwKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2x1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYmluIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYXJyYXkiXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBzZXQgb2YgZmlsZXMsIG9yIGEgc2luZ2xlIGZpbGUsIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYmluYXJpZXMgYW5kIHN5bWxpbmtlZCBpbnRvIGJpbi1kaXIgKGZyb20gY29uZmlnKS4iLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiaW5jbHVkZS1wYXRoIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJERVBSRUNBVEVEOiBBIGxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hpY2ggc2hvdWxkIGdldCBhZGRlZCB0byBQSFAncyBpbmNsdWRlIHBhdGguIFRoaXMgaXMgb25seSBwcmVzZW50IHRvIHN1cHBvcnQgbGVnYWN5IHByb2plY3RzLCBhbmQgYWxsIG5ldyBjb2RlIHNob3VsZCBwcmVmZXJhYmx5IHVzZSBhdXRvbG9hZGluZy4iLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc291cmNlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGlzdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ0eXBlIiwgInVybCIsICJyZWZlcmVuY2UiXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInVybCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm1pcnJvcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJkaXN0IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicmVxdWlyZWQiOiBbInR5cGUiLCAidXJsIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1cmwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtaXJyb3JzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cjw/cGhwCgoKCmlmIChQSFBfVkVSU0lPTl9JRCA8IDUwNjAwKSB7CmlmICghaGVhZGVyc19zZW50KCkpIHsKaGVhZGVyKCdIVFRQLzEuMSA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yJyk7Cn0KJGVyciA9ICdDb21wb3NlciAyLjMuMCBkcm9wcGVkIHN1cHBvcnQgZm9yIGF1dG9sb2FkaW5nIG9uIFBIUCA8NS42IGFuZCB5b3UgYXJlIHJ1bm5pbmcgJy5QSFBfVkVSU0lPTi4nLCBwbGVhc2UgdXBncmFkZSBQSFAgb3IgdXNlIENvbXBvc2VyIDIuMiBMVFMgdmlhICJjb21wb3NlciBzZWxmLXVwZGF0ZSAtLTIuMiIuIEFib3J0aW5nLicuUEhQX0VPTDsKaWYgKCFpbmlfZ2V0KCdkaXNwbGF5X2Vycm9ycycpKSB7CmlmIChQSFBfU0FQSSA9PT0gJ2NsaScgfHwgUEhQX1NBUEkgPT09ICdwaHBkYmcnKSB7CmZ3cml0ZShTVERFUlIsICRlcnIpOwp9IGVsc2VpZiAoIWhlYWRlcnNfc2VudCgpKSB7CmVjaG8gJGVycjsKfQp9CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCRlcnIpOwp9CgpyZXF1aXJlX29uY2UgX19ESVJfXyAuICcvY29tcG9zZXIvYXV0b2xvYWRfcmVhbC5waHAnOwoKcmV0dXJuIENvbXBvc2VyQXV0b2xvYWRlckluaXRDb21wb3NlclBoYXIxNzQ3MTM3Njk3OjpnZXRMb2FkZXIoKTsKPD9waHAKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQXV0b2xvYWQ7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgQ2xhc3NMb2FkZXIKewoKcHJpdmF0ZSBzdGF0aWMgJGluY2x1ZGVGaWxlOwoKCnByaXZhdGUgJHZlbmRvckRpcjsKCgoKCgpwcml2YXRlICRwcmVmaXhMZW5ndGhzUHNyNCA9IGFycmF5KCk7CgoKCnByaXZhdGUgJHByZWZpeERpcnNQc3I0ID0gYXJyYXkoKTsKCgoKcHJpdmF0ZSAkZmFsbGJhY2tEaXJzUHNyNCA9IGFycmF5KCk7CgoKCgoKCgoKCnByaXZhdGUgJHByZWZpeGVzUHNyMCA9IGFycmF5KCk7CgoKCnByaXZhdGUgJGZhbGxiYWNrRGlyc1BzcjAgPSBhcnJheSgpOwoKCnByaXZhdGUgJHVzZUluY2x1ZGVQYXRoID0gZmFsc2U7CgoKCgpwcml2YXRlICRjbGFzc01hcCA9IGFycmF5KCk7CgoKcHJpdmF0ZSAkY2xhc3NNYXBBdXRob3JpdGF0aXZlID0gZmFsc2U7CgoKCgpwcml2YXRlICRtaXNzaW5nQ2xhc3NlcyA9IGFycmF5KCk7CgoKcHJpdmF0ZSAkYXBjdVByZWZpeDsKCgoKCnByaXZhdGUgc3RhdGljICRyZWdpc3RlcmVkTG9hZGVycyA9IGFycmF5KCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHZlbmRvckRpciA9IG51bGwpCnsKJHRoaXMtPnZlbmRvckRpciA9ICR2ZW5kb3JEaXI7CnNlbGY6OmluaXRpYWxpemVJbmNsdWRlQ2xvc3VyZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlZml4ZXMoKQp7CmlmICghZW1wdHkoJHRoaXMtPnByZWZpeGVzUHNyMCkpIHsKcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KCdhcnJheV9tZXJnZScsIGFycmF5X3ZhbHVlcygkdGhpcy0+cHJlZml4ZXNQc3IwKSk7Cn0KCnJldHVybiBhcnJheSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlZml4ZXNQc3I0KCkKewpyZXR1cm4gJHRoaXMtPnByZWZpeERpcnNQc3I0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmFsbGJhY2tEaXJzKCkKewpyZXR1cm4gJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGYWxsYmFja0RpcnNQc3I0KCkKewpyZXR1cm4gJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzc01hcCgpCnsKcmV0dXJuICR0aGlzLT5jbGFzc01hcDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQ2xhc3NNYXAoYXJyYXkgJGNsYXNzTWFwKQp7CmlmICgkdGhpcy0+Y2xhc3NNYXApIHsKJHRoaXMtPmNsYXNzTWFwID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmNsYXNzTWFwLCAkY2xhc3NNYXApOwp9IGVsc2UgewokdGhpcy0+Y2xhc3NNYXAgPSAkY2xhc3NNYXA7Cn0KfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGQoJHByZWZpeCwgJHBhdGhzLCAkcHJlcGVuZCA9IGZhbHNlKQp7CiRwYXRocyA9IChhcnJheSkgJHBhdGhzOwppZiAoISRwcmVmaXgpIHsKaWYgKCRwcmVwZW5kKSB7CiR0aGlzLT5mYWxsYmFja0RpcnNQc3IwID0gYXJyYXlfbWVyZ2UoCiRwYXRocywKJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAKKTsKfSBlbHNlIHsKJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAgPSBhcnJheV9tZXJnZSgKJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAsCiRwYXRocwopOwp9CgpyZXR1cm47Cn0KCiRmaXJzdCA9ICRwcmVmaXhbMF07CmlmICghaXNzZXQoJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdKSkgewokdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0gPSAkcGF0aHM7CgpyZXR1cm47Cn0KaWYgKCRwcmVwZW5kKSB7CiR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSA9IGFycmF5X21lcmdlKAokcGF0aHMsCiR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XQopOwp9IGVsc2UgewokdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0gPSBhcnJheV9tZXJnZSgKJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdLAokcGF0aHMKKTsKfQp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUHNyNCgkcHJlZml4LCAkcGF0aHMsICRwcmVwZW5kID0gZmFsc2UpCnsKJHBhdGhzID0gKGFycmF5KSAkcGF0aHM7CmlmICghJHByZWZpeCkgewoKaWYgKCRwcmVwZW5kKSB7CiR0aGlzLT5mYWxsYmFja0RpcnNQc3I0ID0gYXJyYXlfbWVyZ2UoCiRwYXRocywKJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQKKTsKfSBlbHNlIHsKJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQgPSBhcnJheV9tZXJnZSgKJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQsCiRwYXRocwopOwp9Cn0gZWxzZWlmICghaXNzZXQoJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdKSkgewoKJGxlbmd0aCA9IHN0cmxlbigkcHJlZml4KTsKaWYgKCdcXCcgIT09ICRwcmVmaXhbJGxlbmd0aCAtIDFdKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJBIG5vbi1lbXB0eSBQU1ItNCBwcmVmaXggbXVzdCBlbmQgd2l0aCBhIG5hbWVzcGFjZSBzZXBhcmF0b3IuIik7Cn0KJHRoaXMtPnByZWZpeExlbmd0aHNQc3I0WyRwcmVmaXhbMF1dWyRwcmVmaXhdID0gJGxlbmd0aDsKJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdID0gJHBhdGhzOwp9IGVsc2VpZiAoJHByZXBlbmQpIHsKCiR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9IGFycmF5X21lcmdlKAokcGF0aHMsCiR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XQopOwp9IGVsc2UgewoKJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdID0gYXJyYXlfbWVyZ2UoCiR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSwKJHBhdGhzCik7Cn0KfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldCgkcHJlZml4LCAkcGF0aHMpCnsKaWYgKCEkcHJlZml4KSB7CiR0aGlzLT5mYWxsYmFja0RpcnNQc3IwID0gKGFycmF5KSAkcGF0aHM7Cn0gZWxzZSB7CiR0aGlzLT5wcmVmaXhlc1BzcjBbJHByZWZpeFswXV1bJHByZWZpeF0gPSAoYXJyYXkpICRwYXRoczsKfQp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQc3I0KCRwcmVmaXgsICRwYXRocykKewppZiAoISRwcmVmaXgpIHsKJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQgPSAoYXJyYXkpICRwYXRoczsKfSBlbHNlIHsKJGxlbmd0aCA9IHN0cmxlbigkcHJlZml4KTsKaWYgKCdcXCcgIT09ICRwcmVmaXhbJGxlbmd0aCAtIDFdKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJBIG5vbi1lbXB0eSBQU1ItNCBwcmVmaXggbXVzdCBlbmQgd2l0aCBhIG5hbWVzcGFjZSBzZXBhcmF0b3IuIik7Cn0KJHRoaXMtPnByZWZpeExlbmd0aHNQc3I0WyRwcmVmaXhbMF1dWyRwcmVmaXhdID0gJGxlbmd0aDsKJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdID0gKGFycmF5KSAkcGF0aHM7Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVc2VJbmNsdWRlUGF0aCgkdXNlSW5jbHVkZVBhdGgpCnsKJHRoaXMtPnVzZUluY2x1ZGVQYXRoID0gJHVzZUluY2x1ZGVQYXRoOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlSW5jbHVkZVBhdGgoKQp7CnJldHVybiAkdGhpcy0+dXNlSW5jbHVkZVBhdGg7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENsYXNzTWFwQXV0aG9yaXRhdGl2ZSgkY2xhc3NNYXBBdXRob3JpdGF0aXZlKQp7CiR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUgPSAkY2xhc3NNYXBBdXRob3JpdGF0aXZlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0NsYXNzTWFwQXV0aG9yaXRhdGl2ZSgpCnsKcmV0dXJuICR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmU7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXBjdVByZWZpeCgkYXBjdVByZWZpeCkKewokdGhpcy0+YXBjdVByZWZpeCA9IGZ1bmN0aW9uX2V4aXN0cygnYXBjdV9mZXRjaCcpICYmIGZpbHRlcl92YXIoaW5pX2dldCgnYXBjLmVuYWJsZWQnKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pID8gJGFwY3VQcmVmaXggOiBudWxsOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcGN1UHJlZml4KCkKewpyZXR1cm4gJHRoaXMtPmFwY3VQcmVmaXg7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXIoJHByZXBlbmQgPSBmYWxzZSkKewpzcGxfYXV0b2xvYWRfcmVnaXN0ZXIoYXJyYXkoJHRoaXMsICdsb2FkQ2xhc3MnKSwgdHJ1ZSwgJHByZXBlbmQpOwoKaWYgKG51bGwgPT09ICR0aGlzLT52ZW5kb3JEaXIpIHsKcmV0dXJuOwp9CgppZiAoJHByZXBlbmQpIHsKc2VsZjo6JHJlZ2lzdGVyZWRMb2FkZXJzID0gYXJyYXkoJHRoaXMtPnZlbmRvckRpciA9PiAkdGhpcykgKyBzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnM7Cn0gZWxzZSB7CnVuc2V0KHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyc1skdGhpcy0+dmVuZG9yRGlyXSk7CnNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyc1skdGhpcy0+dmVuZG9yRGlyXSA9ICR0aGlzOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVucmVnaXN0ZXIoKQp7CnNwbF9hdXRvbG9hZF91bnJlZ2lzdGVyKGFycmF5KCR0aGlzLCAnbG9hZENsYXNzJykpOwoKaWYgKG51bGwgIT09ICR0aGlzLT52ZW5kb3JEaXIpIHsKdW5zZXQoc2VsZjo6JHJlZ2lzdGVyZWRMb2FkZXJzWyR0aGlzLT52ZW5kb3JEaXJdKTsKfQp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZENsYXNzKCRjbGFzcykKewppZiAoJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSkgewokaW5jbHVkZUZpbGUgPSBzZWxmOjokaW5jbHVkZUZpbGU7CiRpbmNsdWRlRmlsZSgkZmlsZSk7CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZEZpbGUoJGNsYXNzKQp7CgppZiAoaXNzZXQoJHRoaXMtPmNsYXNzTWFwWyRjbGFzc10pKSB7CnJldHVybiAkdGhpcy0+Y2xhc3NNYXBbJGNsYXNzXTsKfQppZiAoJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZSB8fCBpc3NldCgkdGhpcy0+bWlzc2luZ0NsYXNzZXNbJGNsYXNzXSkpIHsKcmV0dXJuIGZhbHNlOwp9CmlmIChudWxsICE9PSAkdGhpcy0+YXBjdVByZWZpeCkgewokZmlsZSA9IGFwY3VfZmV0Y2goJHRoaXMtPmFwY3VQcmVmaXguJGNsYXNzLCAkaGl0KTsKaWYgKCRoaXQpIHsKcmV0dXJuICRmaWxlOwp9Cn0KCiRmaWxlID0gJHRoaXMtPmZpbmRGaWxlV2l0aEV4dGVuc2lvbigkY2xhc3MsICcucGhwJyk7CgoKaWYgKGZhbHNlID09PSAkZmlsZSAmJiBkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSkgewokZmlsZSA9ICR0aGlzLT5maW5kRmlsZVdpdGhFeHRlbnNpb24oJGNsYXNzLCAnLmhoJyk7Cn0KCmlmIChudWxsICE9PSAkdGhpcy0+YXBjdVByZWZpeCkgewphcGN1X2FkZCgkdGhpcy0+YXBjdVByZWZpeC4kY2xhc3MsICRmaWxlKTsKfQoKaWYgKGZhbHNlID09PSAkZmlsZSkgewoKJHRoaXMtPm1pc3NpbmdDbGFzc2VzWyRjbGFzc10gPSB0cnVlOwp9CgpyZXR1cm4gJGZpbGU7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkTG9hZGVycygpCnsKcmV0dXJuIHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyczsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbmRGaWxlV2l0aEV4dGVuc2lvbigkY2xhc3MsICRleHQpCnsKCiRsb2dpY2FsUGF0aFBzcjQgPSBzdHJ0cigkY2xhc3MsICdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IpIC4gJGV4dDsKCiRmaXJzdCA9ICRjbGFzc1swXTsKaWYgKGlzc2V0KCR0aGlzLT5wcmVmaXhMZW5ndGhzUHNyNFskZmlyc3RdKSkgewokc3ViUGF0aCA9ICRjbGFzczsKd2hpbGUgKGZhbHNlICE9PSAkbGFzdFBvcyA9IHN0cnJwb3MoJHN1YlBhdGgsICdcXCcpKSB7CiRzdWJQYXRoID0gc3Vic3RyKCRzdWJQYXRoLCAwLCAkbGFzdFBvcyk7CiRzZWFyY2ggPSAkc3ViUGF0aCAuICdcXCc7CmlmIChpc3NldCgkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHNlYXJjaF0pKSB7CiRwYXRoRW5kID0gRElSRUNUT1JZX1NFUEFSQVRPUiAuIHN1YnN0cigkbG9naWNhbFBhdGhQc3I0LCAkbGFzdFBvcyArIDEpOwpmb3JlYWNoICgkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHNlYXJjaF0gYXMgJGRpcikgewppZiAoZmlsZV9leGlzdHMoJGZpbGUgPSAkZGlyIC4gJHBhdGhFbmQpKSB7CnJldHVybiAkZmlsZTsKfQp9Cn0KfQp9CgoKZm9yZWFjaCAoJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQgYXMgJGRpcikgewppZiAoZmlsZV9leGlzdHMoJGZpbGUgPSAkZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRsb2dpY2FsUGF0aFBzcjQpKSB7CnJldHVybiAkZmlsZTsKfQp9CgoKaWYgKGZhbHNlICE9PSAkcG9zID0gc3RycnBvcygkY2xhc3MsICdcXCcpKSB7CgokbG9naWNhbFBhdGhQc3IwID0gc3Vic3RyKCRsb2dpY2FsUGF0aFBzcjQsIDAsICRwb3MgKyAxKQouIHN0cnRyKHN1YnN0cigkbG9naWNhbFBhdGhQc3I0LCAkcG9zICsgMSksICdfJywgRElSRUNUT1JZX1NFUEFSQVRPUik7Cn0gZWxzZSB7CgokbG9naWNhbFBhdGhQc3IwID0gc3RydHIoJGNsYXNzLCAnXycsIERJUkVDVE9SWV9TRVBBUkFUT1IpIC4gJGV4dDsKfQoKaWYgKGlzc2V0KCR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XSkpIHsKZm9yZWFjaCAoJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdIGFzICRwcmVmaXggPT4gJGRpcnMpIHsKaWYgKDAgPT09IHN0cnBvcygkY2xhc3MsICRwcmVmaXgpKSB7CmZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKaWYgKGZpbGVfZXhpc3RzKCRmaWxlID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkbG9naWNhbFBhdGhQc3IwKSkgewpyZXR1cm4gJGZpbGU7Cn0KfQp9Cn0KfQoKCmZvcmVhY2ggKCR0aGlzLT5mYWxsYmFja0RpcnNQc3IwIGFzICRkaXIpIHsKaWYgKGZpbGVfZXhpc3RzKCRmaWxlID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkbG9naWNhbFBhdGhQc3IwKSkgewpyZXR1cm4gJGZpbGU7Cn0KfQoKCmlmICgkdGhpcy0+dXNlSW5jbHVkZVBhdGggJiYgJGZpbGUgPSBzdHJlYW1fcmVzb2x2ZV9pbmNsdWRlX3BhdGgoJGxvZ2ljYWxQYXRoUHNyMCkpIHsKcmV0dXJuICRmaWxlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluaXRpYWxpemVJbmNsdWRlQ2xvc3VyZSgpCnsKaWYgKHNlbGY6OiRpbmNsdWRlRmlsZSAhPT0gbnVsbCkgewpyZXR1cm47Cn0KCgoKCgoKCgoKc2VsZjo6JGluY2x1ZGVGaWxlID0gXENsb3N1cmU6OmJpbmQoc3RhdGljIGZ1bmN0aW9uKCRmaWxlKSB7CmluY2x1ZGUgJGZpbGU7Cn0sIG51bGwsIG51bGwpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXI7Cgp1c2UgQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcVmVyc2lvblBhcnNlcjsKCgoKCgoKCgoKCmNsYXNzIEluc3RhbGxlZFZlcnNpb25zCnsKCgoKCnByaXZhdGUgc3RhdGljICRzZWxmRGlyID0gbnVsbDsKCgoKCgpwcml2YXRlIHN0YXRpYyAkaW5zdGFsbGVkOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJGluc3RhbGxlZElzTG9jYWxEaXI7CgoKCgpwcml2YXRlIHN0YXRpYyAkY2FuR2V0VmVuZG9yczsKCgoKCgpwcml2YXRlIHN0YXRpYyAkaW5zdGFsbGVkQnlWZW5kb3IgPSBhcnJheSgpOwoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YWxsZWRQYWNrYWdlcygpCnsKJHBhY2thZ2VzID0gYXJyYXkoKTsKZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewokcGFja2FnZXNbXSA9IGFycmF5X2tleXMoJGluc3RhbGxlZFsndmVyc2lvbnMnXSk7Cn0KCmlmICgxID09PSBcY291bnQoJHBhY2thZ2VzKSkgewpyZXR1cm4gJHBhY2thZ2VzWzBdOwp9CgpyZXR1cm4gYXJyYXlfa2V5cyhhcnJheV9mbGlwKFxjYWxsX3VzZXJfZnVuY19hcnJheSgnYXJyYXlfbWVyZ2UnLCAkcGFja2FnZXMpKSk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbGxlZFBhY2thZ2VzQnlUeXBlKCR0eXBlKQp7CiRwYWNrYWdlc0J5VHlwZSA9IGFycmF5KCk7Cgpmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CmZvcmVhY2ggKCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ10gYXMgJG5hbWUgPT4gJHBhY2thZ2UpIHsKaWYgKGlzc2V0KCRwYWNrYWdlWyd0eXBlJ10pICYmICRwYWNrYWdlWyd0eXBlJ10gPT09ICR0eXBlKSB7CiRwYWNrYWdlc0J5VHlwZVtdID0gJG5hbWU7Cn0KfQp9CgpyZXR1cm4gJHBhY2thZ2VzQnlUeXBlOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSW5zdGFsbGVkKCRwYWNrYWdlTmFtZSwgJGluY2x1ZGVEZXZSZXF1aXJlbWVudHMgPSB0cnVlKQp7CmZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKaWYgKGlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKcmV0dXJuICRpbmNsdWRlRGV2UmVxdWlyZW1lbnRzIHx8ICFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2Rldl9yZXF1aXJlbWVudCddKSB8fCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2Rldl9yZXF1aXJlbWVudCddID09PSBmYWxzZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F0aXNmaWVzKFZlcnNpb25QYXJzZXIgJHBhcnNlciwgJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCkKewokY29uc3RyYWludCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoKHN0cmluZykgJGNvbnN0cmFpbnQpOwokcHJvdmlkZWQgPSAkcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKHNlbGY6OmdldFZlcnNpb25SYW5nZXMoJHBhY2thZ2VOYW1lKSk7CgpyZXR1cm4gJHByb3ZpZGVkLT5tYXRjaGVzKCRjb25zdHJhaW50KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWZXJzaW9uUmFuZ2VzKCRwYWNrYWdlTmFtZSkKewpmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CmlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKJHJhbmdlcyA9IGFycmF5KCk7CmlmIChpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3ByZXR0eV92ZXJzaW9uJ10pKSB7CiRyYW5nZXNbXSA9ICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXTsKfQppZiAoYXJyYXlfa2V5X2V4aXN0cygnYWxpYXNlcycsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKJHJhbmdlcyA9IGFycmF5X21lcmdlKCRyYW5nZXMsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsnYWxpYXNlcyddKTsKfQppZiAoYXJyYXlfa2V5X2V4aXN0cygncmVwbGFjZWQnLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CiRyYW5nZXMgPSBhcnJheV9tZXJnZSgkcmFuZ2VzLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3JlcGxhY2VkJ10pOwp9CmlmIChhcnJheV9rZXlfZXhpc3RzKCdwcm92aWRlZCcsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKJHJhbmdlcyA9IGFycmF5X21lcmdlKCRyYW5nZXMsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJvdmlkZWQnXSk7Cn0KCnJldHVybiBpbXBsb2RlKCcgfHwgJywgJHJhbmdlcyk7Cn0KCnRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBpcyBub3QgaW5zdGFsbGVkJyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFZlcnNpb24oJHBhY2thZ2VOYW1lKQp7CmZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKaWYgKCFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CmNvbnRpbnVlOwp9CgppZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsndmVyc2lvbiddKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsndmVyc2lvbiddOwp9Cgp0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQcmV0dHlWZXJzaW9uKCRwYWNrYWdlTmFtZSkKewpmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CmlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKaWYgKCFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3ByZXR0eV92ZXJzaW9uJ10pKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcmV0dHlfdmVyc2lvbiddOwp9Cgp0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSZWZlcmVuY2UoJHBhY2thZ2VOYW1lKQp7CmZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKaWYgKCFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CmNvbnRpbnVlOwp9CgppZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVmZXJlbmNlJ10pKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydyZWZlcmVuY2UnXTsKfQoKdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoJHBhY2thZ2VOYW1lKQp7CmZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKaWYgKCFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CmNvbnRpbnVlOwp9CgpyZXR1cm4gaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydpbnN0YWxsX3BhdGgnXSkgPyAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2luc3RhbGxfcGF0aCddIDogbnVsbDsKfQoKdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Um9vdFBhY2thZ2UoKQp7CiRpbnN0YWxsZWQgPSBzZWxmOjpnZXRJbnN0YWxsZWQoKTsKCnJldHVybiAkaW5zdGFsbGVkWzBdWydyb290J107Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJhd0RhdGEoKQp7CkB0cmlnZ2VyX2Vycm9yKCdnZXRSYXdEYXRhIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgZGF0YXNldCBsb2FkZWQsIHdoaWNoIG1heSBub3QgYmUgd2hhdCB5b3UgZXhwZWN0LiBVc2UgZ2V0QWxsUmF3RGF0YSgpIGluc3RlYWQgd2hpY2ggcmV0dXJucyBhbGwgZGF0YXNldHMgZm9yIGFsbCBhdXRvbG9hZGVycyBwcmVzZW50IGluIHRoZSBwcm9jZXNzLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCmlmIChudWxsID09PSBzZWxmOjokaW5zdGFsbGVkKSB7CgoKaWYgKHN1YnN0cihfX0RJUl9fLCAtOCwgMSkgIT09ICdDJykgewpzZWxmOjokaW5zdGFsbGVkID0gaW5jbHVkZSBfX0RJUl9fIC4gJy9pbnN0YWxsZWQucGhwJzsKfSBlbHNlIHsKc2VsZjo6JGluc3RhbGxlZCA9IGFycmF5KCk7Cn0KfQoKcmV0dXJuIHNlbGY6OiRpbnN0YWxsZWQ7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QWxsUmF3RGF0YSgpCnsKcmV0dXJuIHNlbGY6OmdldEluc3RhbGxlZCgpOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlbG9hZCgkZGF0YSkKewpzZWxmOjokaW5zdGFsbGVkID0gJGRhdGE7CnNlbGY6OiRpbnN0YWxsZWRCeVZlbmRvciA9IGFycmF5KCk7CgoKCgoKc2VsZjo6JGluc3RhbGxlZElzTG9jYWxEaXIgPSBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0U2VsZkRpcigpCnsKaWYgKHNlbGY6OiRzZWxmRGlyID09PSBudWxsKSB7CnNlbGY6OiRzZWxmRGlyID0gc3RydHIoX19ESVJfXywgJ1xcJywgJy8nKTsKfQoKcmV0dXJuIHNlbGY6OiRzZWxmRGlyOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGVkKCkKewppZiAobnVsbCA9PT0gc2VsZjo6JGNhbkdldFZlbmRvcnMpIHsKc2VsZjo6JGNhbkdldFZlbmRvcnMgPSBtZXRob2RfZXhpc3RzKCdDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcicsICdnZXRSZWdpc3RlcmVkTG9hZGVycycpOwp9CgokaW5zdGFsbGVkID0gYXJyYXkoKTsKJGNvcGllZExvY2FsRGlyID0gZmFsc2U7CgppZiAoc2VsZjo6JGNhbkdldFZlbmRvcnMpIHsKJHNlbGZEaXIgPSBzZWxmOjpnZXRTZWxmRGlyKCk7CmZvcmVhY2ggKENsYXNzTG9hZGVyOjpnZXRSZWdpc3RlcmVkTG9hZGVycygpIGFzICR2ZW5kb3JEaXIgPT4gJGxvYWRlcikgewokdmVuZG9yRGlyID0gc3RydHIoJHZlbmRvckRpciwgJ1xcJywgJy8nKTsKaWYgKGlzc2V0KHNlbGY6OiRpbnN0YWxsZWRCeVZlbmRvclskdmVuZG9yRGlyXSkpIHsKJGluc3RhbGxlZFtdID0gc2VsZjo6JGluc3RhbGxlZEJ5VmVuZG9yWyR2ZW5kb3JEaXJdOwp9IGVsc2VpZiAoaXNfZmlsZSgkdmVuZG9yRGlyLicvY29tcG9zZXIvaW5zdGFsbGVkLnBocCcpKSB7CgokcmVxdWlyZWQgPSByZXF1aXJlICR2ZW5kb3JEaXIuJy9jb21wb3Nlci9pbnN0YWxsZWQucGhwJzsKc2VsZjo6JGluc3RhbGxlZEJ5VmVuZG9yWyR2ZW5kb3JEaXJdID0gJHJlcXVpcmVkOwokaW5zdGFsbGVkW10gPSAkcmVxdWlyZWQ7CmlmIChzZWxmOjokaW5zdGFsbGVkID09PSBudWxsICYmICR2ZW5kb3JEaXIuJy9jb21wb3NlcicgPT09ICRzZWxmRGlyKSB7CnNlbGY6OiRpbnN0YWxsZWQgPSAkcmVxdWlyZWQ7CnNlbGY6OiRpbnN0YWxsZWRJc0xvY2FsRGlyID0gdHJ1ZTsKfQp9CmlmIChzZWxmOjokaW5zdGFsbGVkSXNMb2NhbERpciAmJiAkdmVuZG9yRGlyLicvY29tcG9zZXInID09PSAkc2VsZkRpcikgewokY29waWVkTG9jYWxEaXIgPSB0cnVlOwp9Cn0KfQoKaWYgKG51bGwgPT09IHNlbGY6OiRpbnN0YWxsZWQpIHsKCgppZiAoc3Vic3RyKF9fRElSX18sIC04LCAxKSAhPT0gJ0MnKSB7CgokcmVxdWlyZWQgPSByZXF1aXJlIF9fRElSX18gLiAnL2luc3RhbGxlZC5waHAnOwpzZWxmOjokaW5zdGFsbGVkID0gJHJlcXVpcmVkOwp9IGVsc2UgewpzZWxmOjokaW5zdGFsbGVkID0gYXJyYXkoKTsKfQp9CgppZiAoc2VsZjo6JGluc3RhbGxlZCAhPT0gYXJyYXkoKSAmJiAhJGNvcGllZExvY2FsRGlyKSB7CiRpbnN0YWxsZWRbXSA9IHNlbGY6OiRpbnN0YWxsZWQ7Cn0KCnJldHVybiAkaW5zdGFsbGVkOwp9Cn0KPD9waHAKCgoKJHZlbmRvckRpciA9IGRpcm5hbWUoX19ESVJfXyk7CiRiYXNlRGlyID0gZGlybmFtZSgkdmVuZG9yRGlyKTsKCnJldHVybiBhcnJheSgKJ0F0dHJpYnV0ZScgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvQXR0cmlidXRlLnBocCcsCidDVVJMU3RyaW5nRmlsZScgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9SZXNvdXJjZXMvc3R1YnMvQ1VSTFN0cmluZ0ZpbGUucGhwJywKJ0NvbXBvc2VyXFxJbnN0YWxsZWRWZXJzaW9ucycgPT4gJHZlbmRvckRpciAuICcvY29tcG9zZXIvSW5zdGFsbGVkVmVyc2lvbnMucGhwJywKJ0pzb25FeGNlcHRpb24nID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMvUmVzb3VyY2VzL3N0dWJzL0pzb25FeGNlcHRpb24ucGhwJywKJ05vcm1hbGl6ZXInID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL1Jlc291cmNlcy9zdHVicy9Ob3JtYWxpemVyLnBocCcsCidQaHBUb2tlbicgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvUGhwVG9rZW4ucGhwJywKJ1JldHVyblR5cGVXaWxsQ2hhbmdlJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgxL1Jlc291cmNlcy9zdHVicy9SZXR1cm5UeXBlV2lsbENoYW5nZS5waHAnLAonU3RyaW5nYWJsZScgPT4gJHZlbmRvckRpciAuICcvbWFyYy1tYWJlL3BocC1lbnVtL3N0dWJzL1N0cmluZ2FibGUucGhwJywKJ1VuaGFuZGxlZE1hdGNoRXJyb3InID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1VuaGFuZGxlZE1hdGNoRXJyb3IucGhwJywKJ1ZhbHVlRXJyb3InID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1ZhbHVlRXJyb3IucGhwJywKKTsKPD9waHAKCgoKJHZlbmRvckRpciA9IGRpcm5hbWUoX19ESVJfXyk7CiRiYXNlRGlyID0gZGlybmFtZSgkdmVuZG9yRGlyKTsKCnJldHVybiBhcnJheSgKJ2E0YTExOWE1NmU1MGZiYjI5MzI4MWQ5YTQ4MDA3ZTBlJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL2Jvb3RzdHJhcC5waHAnLAonNmUzZmFlMjk2MzFlZjI4MDY2MGIzY2RhZDA2ZjI1YTgnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzL2Z1bmN0aW9uLnBocCcsCicwZTZkN2JmNGE1ODExYmZhNWNmNDBjNWNjZDZmYWU2YScgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9ib290c3RyYXAucGhwJywKJzMyMGNkZTIyZjY2ZGQ0ZjVkM2ZkNjIxZDNlODhiOThmJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWN0eXBlL2Jvb3RzdHJhcC5waHAnLAonODgyNWVkZTgzZjJmMjg5MTI3NzIyZDRlODQyY2Y3ZTgnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZS9ib290c3RyYXAucGhwJywKJ2U2OWY3ZjZlZTI4N2I5NjkxOThjM2M5ZDY3NzdiZDM4JyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9ib290c3RyYXAucGhwJywKJzBkNTllZTI0MGE0Y2Q5NmRkYmI0ZmYxNjRmY2NlYTRkJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDczL2Jvb3RzdHJhcC5waHAnLAonYjZiOTkxYTU3NjIwZTJmYjZiMmY2NmYwM2ZlOWRkYzInID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvc3RyaW5nL1Jlc291cmNlcy9mdW5jdGlvbnMucGhwJywKJ2FkMTU1ZjhmMWNmMGQ0MThmZTQ5ZTI0OGRiOGM2NjFiJyA9PiAkdmVuZG9yRGlyIC4gJy9yZWFjdC9wcm9taXNlL3NyYy9mdW5jdGlvbnNfaW5jbHVkZS5waHAnLAonMjNjMTgwNDZmNTJiZWYzZWVhMDM0NjU3YmFmZGE1MGYnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvYm9vdHN0cmFwLnBocCcsCik7Cjw/cGhwCgoKCiR2ZW5kb3JEaXIgPSBkaXJuYW1lKF9fRElSX18pOwokYmFzZURpciA9IGRpcm5hbWUoJHZlbmRvckRpcik7CgpyZXR1cm4gYXJyYXkoCik7Cjw/cGhwCgoKCiR2ZW5kb3JEaXIgPSBkaXJuYW1lKF9fRElSX18pOwokYmFzZURpciA9IGRpcm5hbWUoJHZlbmRvckRpcik7CgpyZXR1cm4gYXJyYXkoCidTeW1mb255XFxQb2x5ZmlsbFxcUGhwODFcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MScpLAonU3ltZm9ueVxcUG9seWZpbGxcXFBocDgwXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAnKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA3M1xcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDczJyksCidTeW1mb255XFxQb2x5ZmlsbFxcTWJzdHJpbmdcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZycpLAonU3ltZm9ueVxcUG9seWZpbGxcXEludGxcXE5vcm1hbGl6ZXJcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXInKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxHcmFwaGVtZVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUnKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxDdHlwZVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWN0eXBlJyksCidTeW1mb255XFxDb250cmFjdHNcXFNlcnZpY2VcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cycpLAonU3ltZm9ueVxcQ29tcG9uZW50XFxTdHJpbmdcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9zdHJpbmcnKSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcUHJvY2Vzc1xcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3Byb2Nlc3MnKSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcRmluZGVyXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvZmluZGVyJyksCidTeW1mb255XFxDb21wb25lbnRcXEZpbGVzeXN0ZW1cXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9maWxlc3lzdGVtJyksCidTeW1mb255XFxDb21wb25lbnRcXENvbnNvbGVcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9jb25zb2xlJyksCidTZWxkXFxTaWduYWxcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc2VsZC9zaWduYWwtaGFuZGxlci9zcmMnKSwKJ1NlbGRcXFBoYXJVdGlsc1xcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zZWxkL3BoYXItdXRpbHMvc3JjJyksCidTZWxkXFxKc29uTGludFxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zZWxkL2pzb25saW50L3NyYy9TZWxkL0pzb25MaW50JyksCidSZWFjdFxcUHJvbWlzZVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9yZWFjdC9wcm9taXNlL3NyYycpLAonUHNyXFxMb2dcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvcHNyL2xvZy9Qc3IvTG9nJyksCidQc3JcXENvbnRhaW5lclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9wc3IvY29udGFpbmVyL3NyYycpLAonTWFiZUVudW1cXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvbWFyYy1tYWJlL3BocC1lbnVtL3NyYycpLAonSnNvblNjaGVtYVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hJyksCidDb21wb3NlclxcWGRlYnVnSGFuZGxlclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci94ZGVidWctaGFuZGxlci9zcmMnKSwKJ0NvbXBvc2VyXFxTcGR4XFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL3NwZHgtbGljZW5zZXMvc3JjJyksCidDb21wb3NlclxcU2VtdmVyXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL3NlbXZlci9zcmMnKSwKJ0NvbXBvc2VyXFxQY3JlXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL3BjcmUvc3JjJyksCidDb21wb3NlclxcTWV0YWRhdGFNaW5pZmllclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci9zcmMnKSwKJ0NvbXBvc2VyXFxDbGFzc01hcEdlbmVyYXRvclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3NyYycpLAonQ29tcG9zZXJcXENhQnVuZGxlXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL2NhLWJ1bmRsZS9zcmMnKSwKJ0NvbXBvc2VyXFwnID0+IGFycmF5KCRiYXNlRGlyIC4gJy9zcmMvQ29tcG9zZXInKSwKKTsKPD9waHAKCgoKY2xhc3MgQ29tcG9zZXJBdXRvbG9hZGVySW5pdENvbXBvc2VyUGhhcjE3NDcxMzc2OTcKewpwcml2YXRlIHN0YXRpYyAkbG9hZGVyOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsb2FkQ2xhc3NMb2FkZXIoJGNsYXNzKQp7CmlmICgnQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXInID09PSAkY2xhc3MpIHsKcmVxdWlyZSBfX0RJUl9fIC4gJy9DbGFzc0xvYWRlci5waHAnOwp9Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TG9hZGVyKCkKewppZiAobnVsbCAhPT0gc2VsZjo6JGxvYWRlcikgewpyZXR1cm4gc2VsZjo6JGxvYWRlcjsKfQoKc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCdDb21wb3NlckF1dG9sb2FkZXJJbml0Q29tcG9zZXJQaGFyMTc0NzEzNzY5NycsICdsb2FkQ2xhc3NMb2FkZXInKSwgdHJ1ZSwgdHJ1ZSk7CnNlbGY6OiRsb2FkZXIgPSAkbG9hZGVyID0gbmV3IFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcihcZGlybmFtZShfX0RJUl9fKSk7CnNwbF9hdXRvbG9hZF91bnJlZ2lzdGVyKGFycmF5KCdDb21wb3NlckF1dG9sb2FkZXJJbml0Q29tcG9zZXJQaGFyMTc0NzEzNzY5NycsICdsb2FkQ2xhc3NMb2FkZXInKSk7CgpyZXF1aXJlIF9fRElSX18gLiAnL2F1dG9sb2FkX3N0YXRpYy5waHAnOwpjYWxsX3VzZXJfZnVuYyhcQ29tcG9zZXJcQXV0b2xvYWRcQ29tcG9zZXJTdGF0aWNJbml0Q29tcG9zZXJQaGFyMTc0NzEzNzY5Nzo6Z2V0SW5pdGlhbGl6ZXIoJGxvYWRlcikpOwoKJGxvYWRlci0+cmVnaXN0ZXIodHJ1ZSk7CgokZmlsZXNUb0xvYWQgPSBcQ29tcG9zZXJcQXV0b2xvYWRcQ29tcG9zZXJTdGF0aWNJbml0Q29tcG9zZXJQaGFyMTc0NzEzNzY5Nzo6JGZpbGVzOwokcmVxdWlyZUZpbGUgPSBcQ2xvc3VyZTo6YmluZChzdGF0aWMgZnVuY3Rpb24gKCRmaWxlSWRlbnRpZmllciwgJGZpbGUpIHsKaWYgKGVtcHR5KCRHTE9CQUxTWydfX2NvbXBvc2VyX2F1dG9sb2FkX2ZpbGVzJ11bJGZpbGVJZGVudGlmaWVyXSkpIHsKJEdMT0JBTFNbJ19fY29tcG9zZXJfYXV0b2xvYWRfZmlsZXMnXVskZmlsZUlkZW50aWZpZXJdID0gdHJ1ZTsKCnJlcXVpcmUgJGZpbGU7Cn0KfSwgbnVsbCwgbnVsbCk7CmZvcmVhY2ggKCRmaWxlc1RvTG9hZCBhcyAkZmlsZUlkZW50aWZpZXIgPT4gJGZpbGUpIHsKJHJlcXVpcmVGaWxlKCRmaWxlSWRlbnRpZmllciwgJGZpbGUpOwp9CgpyZXR1cm4gJGxvYWRlcjsKfQp9Cjw/cGhwCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBdXRvbG9hZDsKCmNsYXNzIENvbXBvc2VyU3RhdGljSW5pdENvbXBvc2VyUGhhcjE3NDcxMzc2OTcKewpwdWJsaWMgc3RhdGljICRmaWxlcyA9IGFycmF5ICgKJ2E0YTExOWE1NmU1MGZiYjI5MzI4MWQ5YTQ4MDA3ZTBlJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvYm9vdHN0cmFwLnBocCcsCic2ZTNmYWUyOTYzMWVmMjgwNjYwYjNjZGFkMDZmMjVhOCcgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cy9mdW5jdGlvbi5waHAnLAonMGU2ZDdiZjRhNTgxMWJmYTVjZjQwYzVjY2Q2ZmFlNmEnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9ib290c3RyYXAucGhwJywKJzMyMGNkZTIyZjY2ZGQ0ZjVkM2ZkNjIxZDNlODhiOThmJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvYm9vdHN0cmFwLnBocCcsCic4ODI1ZWRlODNmMmYyODkxMjc3MjJkNGU4NDJjZjdlOCcgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUvYm9vdHN0cmFwLnBocCcsCidlNjlmN2Y2ZWUyODdiOTY5MTk4YzNjOWQ2Nzc3YmQzOCcgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9ib290c3RyYXAucGhwJywKJzBkNTllZTI0MGE0Y2Q5NmRkYmI0ZmYxNjRmY2NlYTRkJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMvYm9vdHN0cmFwLnBocCcsCidiNmI5OTFhNTc2MjBlMmZiNmIyZjY2ZjAzZmU5ZGRjMicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3N0cmluZy9SZXNvdXJjZXMvZnVuY3Rpb25zLnBocCcsCidhZDE1NWY4ZjFjZjBkNDE4ZmU0OWUyNDhkYjhjNjYxYicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9yZWFjdC9wcm9taXNlL3NyYy9mdW5jdGlvbnNfaW5jbHVkZS5waHAnLAonMjNjMTgwNDZmNTJiZWYzZWVhMDM0NjU3YmFmZGE1MGYnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9ib290c3RyYXAucGhwJywKKTsKCnB1YmxpYyBzdGF0aWMgJHByZWZpeExlbmd0aHNQc3I0ID0gYXJyYXkgKAonUycgPT4gCmFycmF5ICgKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MVxcJyA9PiAyMywKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MFxcJyA9PiAyMywKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA3M1xcJyA9PiAyMywKJ1N5bWZvbnlcXFBvbHlmaWxsXFxNYnN0cmluZ1xcJyA9PiAyNiwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxOb3JtYWxpemVyXFwnID0+IDMzLAonU3ltZm9ueVxcUG9seWZpbGxcXEludGxcXEdyYXBoZW1lXFwnID0+IDMxLAonU3ltZm9ueVxcUG9seWZpbGxcXEN0eXBlXFwnID0+IDIzLAonU3ltZm9ueVxcQ29udHJhY3RzXFxTZXJ2aWNlXFwnID0+IDI2LAonU3ltZm9ueVxcQ29tcG9uZW50XFxTdHJpbmdcXCcgPT4gMjUsCidTeW1mb255XFxDb21wb25lbnRcXFByb2Nlc3NcXCcgPT4gMjYsCidTeW1mb255XFxDb21wb25lbnRcXEZpbmRlclxcJyA9PiAyNSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcRmlsZXN5c3RlbVxcJyA9PiAyOSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcQ29uc29sZVxcJyA9PiAyNiwKJ1NlbGRcXFNpZ25hbFxcJyA9PiAxMiwKJ1NlbGRcXFBoYXJVdGlsc1xcJyA9PiAxNSwKJ1NlbGRcXEpzb25MaW50XFwnID0+IDE0LAopLAonUicgPT4gCmFycmF5ICgKJ1JlYWN0XFxQcm9taXNlXFwnID0+IDE0LAopLAonUCcgPT4gCmFycmF5ICgKJ1BzclxcTG9nXFwnID0+IDgsCidQc3JcXENvbnRhaW5lclxcJyA9PiAxNCwKKSwKJ00nID0+IAphcnJheSAoCidNYWJlRW51bVxcJyA9PiA5LAopLAonSicgPT4gCmFycmF5ICgKJ0pzb25TY2hlbWFcXCcgPT4gMTEsCiksCidDJyA9PiAKYXJyYXkgKAonQ29tcG9zZXJcXFhkZWJ1Z0hhbmRsZXJcXCcgPT4gMjMsCidDb21wb3NlclxcU3BkeFxcJyA9PiAxNCwKJ0NvbXBvc2VyXFxTZW12ZXJcXCcgPT4gMTYsCidDb21wb3NlclxcUGNyZVxcJyA9PiAxNCwKJ0NvbXBvc2VyXFxNZXRhZGF0YU1pbmlmaWVyXFwnID0+IDI2LAonQ29tcG9zZXJcXENsYXNzTWFwR2VuZXJhdG9yXFwnID0+IDI3LAonQ29tcG9zZXJcXENhQnVuZGxlXFwnID0+IDE4LAonQ29tcG9zZXJcXCcgPT4gOSwKKSwKKTsKCnB1YmxpYyBzdGF0aWMgJHByZWZpeERpcnNQc3I0ID0gYXJyYXkgKAonU3ltZm9ueVxcUG9seWZpbGxcXFBocDgxXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgxJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MFxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MCcsCiksCidTeW1mb255XFxQb2x5ZmlsbFxcUGhwNzNcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMnLAopLAonU3ltZm9ueVxcUG9seWZpbGxcXE1ic3RyaW5nXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxOb3JtYWxpemVyXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplcicsCiksCidTeW1mb255XFxQb2x5ZmlsbFxcSW50bFxcR3JhcGhlbWVcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZScsCiksCidTeW1mb255XFxQb2x5ZmlsbFxcQ3R5cGVcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUnLAopLAonU3ltZm9ueVxcQ29udHJhY3RzXFxTZXJ2aWNlXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzJywKKSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcU3RyaW5nXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3N0cmluZycsCiksCidTeW1mb255XFxDb21wb25lbnRcXFByb2Nlc3NcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcHJvY2VzcycsCiksCidTeW1mb255XFxDb21wb25lbnRcXEZpbmRlclxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9maW5kZXInLAopLAonU3ltZm9ueVxcQ29tcG9uZW50XFxGaWxlc3lzdGVtXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L2ZpbGVzeXN0ZW0nLAopLAonU3ltZm9ueVxcQ29tcG9uZW50XFxDb25zb2xlXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L2NvbnNvbGUnLAopLAonU2VsZFxcU2lnbmFsXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zZWxkL3NpZ25hbC1oYW5kbGVyL3NyYycsCiksCidTZWxkXFxQaGFyVXRpbHNcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3NlbGQvcGhhci11dGlscy9zcmMnLAopLAonU2VsZFxcSnNvbkxpbnRcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3NlbGQvanNvbmxpbnQvc3JjL1NlbGQvSnNvbkxpbnQnLAopLAonUmVhY3RcXFByb21pc2VcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3JlYWN0L3Byb21pc2Uvc3JjJywKKSwKJ1BzclxcTG9nXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9wc3IvbG9nL1Bzci9Mb2cnLAopLAonUHNyXFxDb250YWluZXJcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3Bzci9jb250YWluZXIvc3JjJywKKSwKJ01hYmVFbnVtXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9tYXJjLW1hYmUvcGhwLWVudW0vc3JjJywKKSwKJ0pzb25TY2hlbWFcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEnLAopLAonQ29tcG9zZXJcXFhkZWJ1Z0hhbmRsZXJcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyL3NyYycsCiksCidDb21wb3NlclxcU3BkeFxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIvc3BkeC1saWNlbnNlcy9zcmMnLAopLAonQ29tcG9zZXJcXFNlbXZlclxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIvc2VtdmVyL3NyYycsCiksCidDb21wb3NlclxcUGNyZVxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIvcGNyZS9zcmMnLAopLAonQ29tcG9zZXJcXE1ldGFkYXRhTWluaWZpZXJcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL2NvbXBvc2VyL21ldGFkYXRhLW1pbmlmaWVyL3NyYycsCiksCidDb21wb3NlclxcQ2xhc3NNYXBHZW5lcmF0b3JcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL2NvbXBvc2VyL2NsYXNzLW1hcC1nZW5lcmF0b3Ivc3JjJywKKSwKJ0NvbXBvc2VyXFxDYUJ1bmRsZVxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIvY2EtYnVuZGxlL3NyYycsCiksCidDb21wb3NlclxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uLy4uJyAuICcvc3JjL0NvbXBvc2VyJywKKSwKKTsKCnB1YmxpYyBzdGF0aWMgJGNsYXNzTWFwID0gYXJyYXkgKAonQXR0cmlidXRlJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL0F0dHJpYnV0ZS5waHAnLAonQ1VSTFN0cmluZ0ZpbGUnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9SZXNvdXJjZXMvc3R1YnMvQ1VSTFN0cmluZ0ZpbGUucGhwJywKJ0NvbXBvc2VyXFxJbnN0YWxsZWRWZXJzaW9ucycgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9jb21wb3Nlci9JbnN0YWxsZWRWZXJzaW9ucy5waHAnLAonSnNvbkV4Y2VwdGlvbicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDczL1Jlc291cmNlcy9zdHVicy9Kc29uRXhjZXB0aW9uLnBocCcsCidOb3JtYWxpemVyJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL1Jlc291cmNlcy9zdHVicy9Ob3JtYWxpemVyLnBocCcsCidQaHBUb2tlbicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9QaHBUb2tlbi5waHAnLAonUmV0dXJuVHlwZVdpbGxDaGFuZ2UnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9SZXNvdXJjZXMvc3R1YnMvUmV0dXJuVHlwZVdpbGxDaGFuZ2UucGhwJywKJ1N0cmluZ2FibGUnID0+IF9fRElSX18gLiAnLy4uJyAuICcvbWFyYy1tYWJlL3BocC1lbnVtL3N0dWJzL1N0cmluZ2FibGUucGhwJywKJ1VuaGFuZGxlZE1hdGNoRXJyb3InID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvVW5oYW5kbGVkTWF0Y2hFcnJvci5waHAnLAonVmFsdWVFcnJvcicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9WYWx1ZUVycm9yLnBocCcsCik7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluaXRpYWxpemVyKENsYXNzTG9hZGVyICRsb2FkZXIpCnsKcmV0dXJuIFxDbG9zdXJlOjpiaW5kKGZ1bmN0aW9uICgpIHVzZSAoJGxvYWRlcikgewokbG9hZGVyLT5wcmVmaXhMZW5ndGhzUHNyNCA9IENvbXBvc2VyU3RhdGljSW5pdENvbXBvc2VyUGhhcjE3NDcxMzc2OTc6OiRwcmVmaXhMZW5ndGhzUHNyNDsKJGxvYWRlci0+cHJlZml4RGlyc1BzcjQgPSBDb21wb3NlclN0YXRpY0luaXRDb21wb3NlclBoYXIxNzQ3MTM3Njk3OjokcHJlZml4RGlyc1BzcjQ7CiRsb2FkZXItPmNsYXNzTWFwID0gQ29tcG9zZXJTdGF0aWNJbml0Q29tcG9zZXJQaGFyMTc0NzEzNzY5Nzo6JGNsYXNzTWFwOwoKfSwgbnVsbCwgQ2xhc3NMb2FkZXI6OmNsYXNzKTsKfQp9CgpDb3B5cmlnaHQgKEMpIDIwMTYgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgojIwojIyBCdW5kbGUgb2YgQ0EgUm9vdCBDZXJ0aWZpY2F0ZXMKIyMKIyMgQ2VydGlmaWNhdGUgZGF0YSBmcm9tIE1vemlsbGEgYXMgb2Y6IFR1ZSBGZWIgMjUgMDQ6MTI6MDMgMjAyNSBHTVQKIyMKIyMgRmluZCB1cGRhdGVkIHZlcnNpb25zIGhlcmU6IGh0dHBzOi8vY3VybC5zZS9kb2NzL2NhZXh0cmFjdC5odG1sCiMjCiMjIFRoaXMgaXMgYSBidW5kbGUgb2YgWC41MDkgY2VydGlmaWNhdGVzIG9mIHB1YmxpYyBDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcwojIyAoQ0EpLiBUaGVzZSB3ZXJlIGF1dG9tYXRpY2FsbHkgZXh0cmFjdGVkIGZyb20gTW96aWxsYSdzIHJvb3QgY2VydGlmaWNhdGVzCiMjIGZpbGUgKGNlcnRkYXRhLnR4dCkuICBUaGlzIGZpbGUgY2FuIGJlIGZvdW5kIGluIHRoZSBtb3ppbGxhIHNvdXJjZSB0cmVlOgojIyBodHRwczovL2hnLm1vemlsbGEub3JnL3JlbGVhc2VzL21vemlsbGEtcmVsZWFzZS9yYXctZmlsZS9kZWZhdWx0L3NlY3VyaXR5L25zcy9saWIvY2tmdy9idWlsdGlucy9jZXJ0ZGF0YS50eHQKIyMKIyMgSXQgY29udGFpbnMgdGhlIGNlcnRpZmljYXRlcyBpbiBQRU0gZm9ybWF0IGFuZCB0aGVyZWZvcmUKIyMgY2FuIGJlIGRpcmVjdGx5IHVzZWQgd2l0aCBjdXJsIC8gbGliY3VybCAvIHBocF9jdXJsLCBvciB3aXRoCiMjIGFuIEFwYWNoZSttb2Rfc3NsIHdlYnNlcnZlciBmb3IgU1NMIGNsaWVudCBhdXRoZW50aWNhdGlvbi4KIyMgSnVzdCBjb25maWd1cmUgdGhpcyBmaWxlIGFzIHRoZSBTU0xDQUNlcnRpZmljYXRlRmlsZS4KIyMKIyMgQ29udmVyc2lvbiBkb25lIHdpdGggbWstY2EtYnVuZGxlLnBsIHZlcnNpb24gMS4yOS4KIyMgU0hBMjU2OiA2MjBmZDg5YzAyYWNiMDAxOWYxODk5ZGFiNzkwN2RiNWQyMDczNTkwNGY1YTlhMGQzYTg3NzFhNTg1N2FjNDgyCiMjCgoKR2xvYmFsU2lnbiBSb290IENBCj09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGRUQ0NBbDJnQXdJQkFnSUxCQUFBQUFBQkZVdGF3NVF3RFFZSktvWklodmNOQVFFRkJRQXdWekVMTUFrR0ExVUVCaE1DUWtVeApHVEFYQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhFREFPQmdOVkJBc1RCMUp2YjNRZ1EwRXhHekFaQmdOVkJBTVRFa2RzCmIySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MDVPREE1TURFeE1qQXdNREJhRncweU9EQXhNamd4TWpBd01EQmFNRmN4Q3pBSkJnTlYKQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aVlXeFRhV2R1SUc1MkxYTmhNUkF3RGdZRFZRUUxFd2RTYjI5MElFTkJNUnN3R1FZRApWUVFERXhKSGJHOWlZV3hUYVdkdUlGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURhCkR1YVpqYzZqNDArS2Z2dnhpNE1sYStwSUgvRXFzTG1WRVFTOThHUFI0bWRtenh6ZHp4dElLKzZOaVk2YXJ5bUFaYXZweHkwU3k2c2MKVEhBSG9UMEtNTTBWalUvNDNkU01VQlVjNzFEdXhDNzMvT2xTOHBGOTRHM1ZOVENPWGtOejhrSHAxV3Jqc29rNlZqazRid1k4aUdsYgpLazNGcDFTNGJJbk1tL2s4eXVYOWlmVVNQSko0bHRiY2RHNlRSR0hSamNkR3NuVU9odWdaaXRWdGJOVjRGcFdpNmNnS09PdnlKQk5QCmMxU1RFNFU2Rzd3ZU5MV0xCWXk1ZDR1eDJ4OGdrYXNKVTI2UXpuczNkTGx3UjVFaVVXTVdlYTZ4cmtFbUNNZ1pLOUZHcWtqV1pDclgKZ3pUL0xDckJiQmxEU2dlRjU5Tjg5aUZvNytyeVVwOS9rNURQQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSZ2UyWWFSUTJYeW9sUUwzMEV6VFNvLy96OVN6QU5CZ2txaGtpRzl3MEJBUVVGCkFBT0NBUUVBMW5QbmZFOTIwSTIvN0xxaXZqVEZLREsxZlB4c25Dd3J2UW1lVTc5clhxb1JTTGJsQ0tPenlqMWhUZE5HQ2JNK3c2RGoKWTFVYjhycnZyVG5oUTdrNG8rWXZpaVk3NzZCUVZ2bkdDdjA0emNRTGNGR1VsNWdFMzhOZmxOVVZ5UlJCbk1SZGRXUVZEZjlWTU95RwpqLzhON3l5NVkwYjJxdnpmdkduOUxoSklaSnJnbGZDbTd5bVBBYkVWdFF3ZHBmNXBMR2trZUI2enB4eHhZdTdLeUplc0YxMkt3dmhICmhtNHF4Rll4bGRCbmlZVXIrV3ltWFVhZERLcUM1SmxSM1hDMzIxWTlZZVJxNFZ6Vzl2NDkza0hNQjY1alVyOVRVL1FyNmNmOXR2ZUMKWDRYU1FSamJnYk1FSE1VZnBJQnZGU0RKM2d5SUNoM1dabFhpL0VqSktTWnA0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVudHJ1c3QubmV0IFByZW1pdW0gMjA0OCBTZWN1cmUgU2VydmVyIENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFS2pDQ0F4S2dBd0lCQWdJRU9HUGUrREFOQmdrcWhraUc5dzBCQVFVRkFEQ0J0REVVTUJJR0ExVUVDaE1MUlc1MGNuVnpkQzV1ClpYUXhRREErQmdOVkJBc1VOM2QzZHk1bGJuUnlkWE4wTG01bGRDOURVRk5mTWpBME9DQnBibU52Y25BdUlHSjVJSEpsWmk0Z0tHeHAKYldsMGN5QnNhV0ZpTGlreEpUQWpCZ05WQkFzVEhDaGpLU0F4T1RrNUlFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVgpCQU1US2tWdWRISjFjM1F1Ym1WMElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUNneU1EUTRLVEFlRncwNU9URXlNalF4Ck56VXdOVEZhRncweU9UQTNNalF4TkRFMU1USmFNSUcwTVJRd0VnWURWUVFLRXd0RmJuUnlkWE4wTG01bGRERkFNRDRHQTFVRUN4UTMKZDNkM0xtVnVkSEoxYzNRdWJtVjBMME5RVTE4eU1EUTRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHBZV0l1S1RFbApNQ01HQTFVRUN4TWNLR01wSURFNU9Ua2dSVzUwY25WemRDNXVaWFFnVEdsdGFYUmxaREV6TURFR0ExVUVBeE1xUlc1MGNuVnpkQzV1ClpYUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0tESXdORGdwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBclUxTHFSS0dzdXFqSUFjVkZtUXFLMHZSdnd0S1RZN3RnSGFsWjdkNFFNQnpRc2hvd050VEs5MWV1SGFZTlpPTApHcDE4RXpvT0gxdTNIcy9sSkJRZXNZR3BqWDI0ekd0TEEvRUNETnlycFVBa0FIOTBsS0dkQ0NtemlBdjFoM2VkVmMza3czN1hhbVNyCmhSU0dsVnVYTWxCdlBjaTZaZ3pqL0wyNFNjRjJpVWtaL2NDb3ZZbWpaeS9Hbjd4eEdXQzRMZWtzeVpCMlpudVU0cTk0MW1WVFhUelcKbkxMUEtRUDVMNlJRc3RSSXpnVXlWWXI5c21STUR1U1lCM1hiZjkrNUNGVmdoVEFwK1h0SXBHbUc0elUvSG9aZGVub1Z2ZThBamhVaQpWQmNBa0NhVHZBNUphSkcvK0VmVG5aVkN3UTVOMzI4bXo4TVlJV0ptUTNEVzFjQUg0UUlEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFCkJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVVmVTQjBSR0F2dGlKdVFpak1mbWhKQWtXdVhBd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnRUJBRHViajFhYk1PZFRtWHg2ZWFkTmw5Y1psWkQ3QmgvS00zeEdZNCtXWmlUNlFCc2hKOHJtY25QeQpULzR4bWYzSURFeG9VOGFBZ2hPWStyYXQybDA5OGM1dTloVVJsSUlNN2orVnJ4R3JEOWN2M2g4RGoxY3NIc203bWhwRWxlc1lUNllmCnpYMVhFQytiQkFsYWhMVnUyQjA2NGRhZTBXeDVYbmtjRk1YajBFeVRPMlU4N2Q4OXZxYmxsUnJEdFJuRHZWNWJ1LzhqNzJnWnl4S1QKSjF3RExXOHcwQjYyR3F6ZVd2ZlJxcWducHY1NWdjUjVtVE5YdWhLd3FlQkNiSlBLVnQ3K2JZUUxDSXQramVyWG1DSEc4K2M4ZVM5ZQpuTkZNRlkzaDdDSTN6SnBEQzVmY2dKQ05zMmViYjBnSUZWYlB2L0VyZkY2YWR1bFprTVY4Z3pVUlpWRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJRUFnQUF1VEFOQmdrcWhraUc5dzBCQVFVRkFEQmFNUXN3Q1FZRFZRUUdFd0pKUlRFU01CQUdBMVVFCkNoTUpRbUZzZEdsdGIzSmxNUk13RVFZRFZRUUxFd3BEZVdKbGNsUnlkWE4wTVNJd0lBWURWUVFERXhsQ1lXeDBhVzF2Y21VZ1EzbGkKWlhKVWNuVnpkQ0JTYjI5ME1CNFhEVEF3TURVeE1qRTRORFl3TUZvWERUSTFNRFV4TWpJek5Ua3dNRm93V2pFTE1Ba0dBMVVFQmhNQwpTVVV4RWpBUUJnTlZCQW9UQ1VKaGJIUnBiVzl5WlRFVE1CRUdBMVVFQ3hNS1EzbGlaWEpVY25WemRERWlNQ0FHQTFVRUF4TVpRbUZzCmRHbHRiM0psSUVONVltVnlWSEoxYzNRZ1VtOXZkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLTUUKdXlLcm1EMVg2Q1p5bXJWNTFDbmk0ZWlWZ0xHdzQxdU9LeW1hWk4raFhlMndDUVZ0MnlndXptS2lZdjYwaU5vUzZ6anJJWjNBUVNzQgpVbnVJZDlNY2o4ZTZ1WWkxYWdubmMrZ1JRS2ZSek1waWpTM2xqd3VtVU5Lb1VNTW82dldySlllS21wWWNxV2U0UHd6VjkvbFNFeS9DCkc5VndjUENQd0JMS0JzdWE0ZG5LTTNwMzF2anN1ZkZvUkVKSUU5TEF3cVN1WG1EK3RxWUYvTFRkQjFrQzFGa1ltR1AxcFdQZ2tBeDkKWGJJR2V2T0Y2dXZVQTY1ZWhENWYveFh0YWJ6NU9UWnlkYzkzVWszenlaQXN1VDNseVNOVFB4OGttQ0ZjQjVrcHZjWTY3T2R1aGpwcgpsM1JqTTcxb0dESHdlSTEydi95ZWpsMHFocWROa053bkdqa0NBd0VBQWFORk1FTXdIUVlEVlIwT0JCWUVGT1dkV1RDQ1Ixak1yUG9JClZEYUdlenExQkUzd01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRTXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUIKQlFVQUE0SUJBUUNGREYyTzVHOVJhRUlGb04yN1R5Y2xoQU85OTJUOUxkY3c0NlFRRit2YUtTbTJlVDkyOWhrVEk3Z1FDdmxZcE5SaApjTDBFWVdvU2loZlZDcjNGdkRCODF1a01KWTJHUUUvc3pLTitPTVkzRVUvdDNXZ3hqa3pTc3dGMDdyNTFYZ2RJR245dy94WmNoTUI1CmhiZ0YvWCsrWlJHakQ4QUN0UGhTTnprRTFha3hlaGkvb0NyMEVwbjNvMFdDNHp4ZTlaMmV0Y2llZkM3SXBKNU9DQlJMYmYxd2JXc2EKWTcxazVoKzN6dkR5bnk2N0c3ZnlVSWh6a3NMaTR4YU5taklDcTQ0WTNla1FFZTUrTmF1UXJ6NHdsSHJRTXoyblpRLzEvSTZlWXM5SApSQ3dCWGJzZHRUTFNSOUk0THREK2dkd3lhaDYxN2p6Vi9PZUJIUm5ESkVMcVl6bXAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRWtUQ0NBM21nQXdJQkFnSUVSV3RRVkRBTkJna3Foa2lHOXcwQkFRVUZBRENCc0RFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVgpCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhPVEEzQmdOVkJBc1RNSGQzZHk1bGJuUnlkWE4wTG01bGRDOURVRk1nYVhNZ2FXNWpiM0p3CmIzSmhkR1ZrSUdKNUlISmxabVZ5Wlc1alpURWZNQjBHQTFVRUN4TVdLR01wSURJd01EWWdSVzUwY25WemRDd2dTVzVqTGpFdE1Dc0cKQTFVRUF4TWtSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBMk1URXlOekl3TWpNMApNbG9YRFRJMk1URXlOekl3TlRNME1sb3dnYkF4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUZiblJ5ZFhOMExDQkpibU11Ck1Ua3dOd1lEVlFRTEV6QjNkM2N1Wlc1MGNuVnpkQzV1WlhRdlExQlRJR2x6SUdsdVkyOXljRzl5WVhSbFpDQmllU0J5WldabGNtVnUKWTJVeEh6QWRCZ05WQkFzVEZpaGpLU0F5TURBMklFVnVkSEoxYzNRc0lFbHVZeTR4TFRBckJnTlZCQU1USkVWdWRISjFjM1FnVW05dgpkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCkFMYVZ0a05DK3NadEttOUkzNVJNT1ZjRjdzTjVFVUZvTnUzcy9wb0JqNkU0S1B6M0VFWm1MazBlR3JFYVRzYlJ3SldJc01uL01Zc3oKQTl1M2czcytJSVJlN2JKV0tLZjQ0TGxBY1RmRnkwY09seXBvd0NLVlloWGJSOW4xMEN2L2drdkpyVDdlVE51UWdGQS9DWXFFQU93dwpDajBZemZ2OUtsbWFJNVVYTEVXZUgyNURlVzBNWEpqK1NLZkZJMGRjWHYxdTV4NjA5bWhGMFlhRFc2S0tqYkhqS1lEK0pYR0lyYjY4Cmo2eFNsa3VxVVkza0V6RVo2RTVObjl1c3MyclZ2RGxVY2NwNmVuK1EzWDBkZ05tQnUxa213aEgrNXBQaTk0RGtaZnMwTnc0cGdIQk4KcnppR0xwNS9WNitlRjY3ckhNc29JVisySE5qbm9nUWkrZFBhMk1zQ0F3RUFBYU9Cc0RDQnJUQU9CZ05WSFE4QkFmOEVCQU1DQVFZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QXJCZ05WSFJBRUpEQWlnQTh5TURBMk1URXlOekl3TWpNME1scUJEekl3TWpZeE1USTNNakExCk16UXlXakFmQmdOVkhTTUVHREFXZ0JSb2tPUm5wS1pUZ01lR1pxVHg5MHREKzRTOWJUQWRCZ05WSFE0RUZnUVVhSkRrWjZTbVU0REgKaG1hazhmZExRL3VFdlcwd0hRWUpLb1pJaHZaOUIwRUFCQkF3RGhzSVZqY3VNVG8wTGpBREFnU1FNQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFDVDFEQ3cxd01nS3RENVkraVJEQVVncVY4WnludHlUdFN4MjlDVysxUmFHU3dNQ1BleXZJV29uWDl0TzFLekt0dm4xSVNNClkvWVB5eVlCa1ZCczlGOFU0cE4wd0JPZU1EcFE0N1JneFJ6d0lrU05jVWVzeUJySjZadWFBR0FULzNCK1h4Rk5TUnV6RlZKN3lWVGEKdjUyVnIydWEySjdwOGVSRGplSVJSRHEvcjcyRFFuTlNpNnE3cHluUDlXUWNDazNSdktxc255clEvMzkvMm4zcXNlMHdKY0dFMmpUUwpXM2lEVnV5Y05zTW00aEgyWjBrZGtxdU0rK3YvZXU2RlNxZFFnUENuWEVxVUxsOEZtVHhTUWVETnRHUFBBVU82bklQY2oyQTc4MXEwCnRIdXUyZ3VRT0hYdmdSMW0wdmRYY0RhenYvd29yM0VsaFZzVC9oNS9XclE4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNvbW9kbyBBQUEgU2VydmljZXMgcm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNakNDQXhxZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREI3TVFzd0NRWURWUVFHRXdKSFFqRWJNQmtHQTFVRUNBd1MKUjNKbFlYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIREFkVFlXeG1iM0prTVJvd0dBWURWUVFLREJGRGIyMXZaRzhnUTBFZwpUR2x0YVhSbFpERWhNQjhHQTFVRUF3d1lRVUZCSUVObGNuUnBabWxqWVhSbElGTmxjblpwWTJWek1CNFhEVEEwTURFd01UQXdNREF3Ck1Gb1hEVEk0TVRJek1USXpOVGsxT1Zvd2V6RUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdNRWtkeVpXRjBaWElnVFdGdVkyaGwKYzNSbGNqRVFNQTRHQTFVRUJ3d0hVMkZzWm05eVpERWFNQmdHQTFVRUNnd1JRMjl0YjJSdklFTkJJRXhwYldsMFpXUXhJVEFmQmdOVgpCQU1NR0VGQlFTQkRaWEowYVdacFkyRjBaU0JUWlhKMmFXTmxjekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DCmdnRUJBTDVBbmZSdTRlcDJoeHhOUlVTT3ZrYklnd2Fkd1NyK0dCK081QUw2ODZ0ZFVJb1dNUXVhQnRERmNDTE5TUzFVWTh5MmJtaEcKQzFQcXkwd2t3THh5VHVyeEZhNzBWSm9TQ3NONnNqTmc0dHFKVmZNaVdQUGUzTS92ZzRhaWpKUlBuMmp5bUpCR2hDZkhkci9qekRVcwppMTRIWkdXQ3dFaXdxSkg1WVo5MklGQ29rY2RtdGV0NFlnTlc4SW9hRStveG94NmdtZjA0OXZZbk1saHZCL1ZydVBzVUs2KzNxc3pXClkxOXpqTm9GbWFnNHFNc1hlRFpSck9tZTlIZzZqYzhQMlVMaW1BeXJMNThPQWQ3dm41bEo4UzNmckhSTkc1aTFSOFhsS2RINWtCakgKWXB5K2c4Y21lejZLSmNmQTNaM21OV2dRSUoyUDJON1N3NFNjRFY3b0w4a0NBd0VBQWFPQndEQ0J2VEFkQmdOVkhRNEVGZ1FVb0JFSwpJejZXOFFmczRxOHA3NEtsZjlBd3BMUXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d2V3WURWUjBmCkJIUXdjakE0b0RhZ05JWXlhSFIwY0RvdkwyTnliQzVqYjIxdlpHOWpZUzVqYjIwdlFVRkJRMlZ5ZEdsbWFXTmhkR1ZUWlhKMmFXTmwKY3k1amNtd3dOcUEwb0RLR01HaDBkSEE2THk5amNtd3VZMjl0YjJSdkxtNWxkQzlCUVVGRFpYSjBhV1pwWTJGMFpWTmxjblpwWTJWegpMbU55YkRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUNGYjhBdkNiNlArayt0Wjd4a1NBemsvRXhmWUFXTXltdHJ3VVNXZ0VkdWptCjdsM3NBZzlnMW8xUUdFOG1UZ0hqNXJDbDdyKzhkRlJCdi8zOEVyakhUMXIwaVdBRmYyQzNCVXJ6OXZIQ3Y4UzVkSWEyTFgxcnpOTHoKUnQwdnh1QnF3OE0wQXl4OWx0MWF3ZzZuQ3BuQkJZdXJEQy96WERyUGJEZFZDWWZlVTBCc1dPLzh0cXRsYmdUMkc5dzg0Rm9WeHA3Wgo4VmxJTUNGbEEyenM2U0Z6N0pzRG9lQTNyYUFWR0kvNnVnTE9weXlwRUJNczFPVUlKcXNpbDJENGtGNTAxS0thVTczeXFXamdvbTdDCjEyeXhvdytldit0bzUxYnlydkxqS3pnNkNZRzFhNFhYdmkzdFB4cTNzbVBpOVdJc2d0UnFBRUZROFRtRG41WHBOcGFZYmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpRdW9WYWRpcyBSb290IENBIDIKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdHpDQ0E1K2dBd0lCQWdJQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9UCkVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01qQWVGdzB3TmpFeE1qUXgKT0RJM01EQmFGdzB6TVRFeE1qUXhPREl6TXpOYU1FVXhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXWVdScGN5QlNiMjkwSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCkR3QXdnZ0lLQW9JQ0FRQ2FHTXBMbEEwQUxhOERLWXJ3RDRISXJrd1poUjBJbjZzcFJJWHpMNEd0TWg2UVJyK2poaVlhSHY1K0hCZzYKWEp4Z0Z5bzZkSU16TUgxaFZCSEw3YXZnNXRLaWZ2VnJieGkzQ2dzdC9lays3d3JHc3hEcDNNSkdGL2hkL2FUYS81NUpXcHptTStZawpsdmMvdWxzckhIbzF3dFpuL3F0bVVJdHRLR0FyNzlkZ3c4ZVR2STAya2ZOLytOc1JFOFNjZDNiQnJyY0Nhb0Y2cVVXRDRnWG11VmJCCmxEZVBTSEZqSXV3WFpRZVZpa3ZmajhaYUN1V3c0MTllYXhHckRQbUY2MFRwK0FSejh1bitYSmlNOVhPdmE3Uit6ZFJjQWl0TU9lR3kKbFpVdFFvZlgxYk9RUTdkc0UvSGUzZmJFK0lrLzBYWDFrc09SMVlxSTBKRHMzRzNlaWNKbGNaYUxEUVA5bkw5YkZxeVMyK3IrZVh5dAo2Ni8zRnN2YnpTVXI1Ui83bXAvaVVjdzZVd3hJNWc2OXliUjJCbExtRVJPRmNtTURCT0FFTmlzZ0dRTG9kS2NmdHNsV1p2QjFKZHhuCndRNWhZSWl6UHRHby9LUGFIYkRSc1NOVTMwUjJiZTFCMk1HeUlyWlRITjgxSGR5aGR5b3g1QzMxNWVYYnlPRC81WURYQzJPZy96T2gKRDdvc0ZSWHFsN1BTb3JXKzhveVdIaHFQSFd5a1lUZTVobk16MTVlV25pTjlncVJNZ2VLaDBicG5YNVVIb3ljUjdoWVFlN3hGU2t5eQpCTktyNzlYOURGSE9VR29JTWZtUjJneVBaRndEd3pxTElEOXVqV2M5T3RiK2ZWdUl5Vjc3ekdIY2l6TjMwMFF5TlFsaUJKSVdFTmllCkowZjdPeUhqK09zZFd3SURBUUFCbzRHd01JR3RNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdDd1lEVlIwUEJBUURBZ0VHTUIwR0ExVWQKRGdRV0JCUWFoR0s4U0V3ekpRVFU3dEQyQThRWlJ0R1VhekJ1QmdOVkhTTUVaekJsZ0JRYWhHSzhTRXd6SlFUVTd0RDJBOFFaUnRHVQphNkZKcEVjd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1UCkVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01vSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUQ0S0ZrMmZCbHVvcm5GZEx3VXYKWitZVFJZUEVOdmJ6d0NZTURiVkhaRjM0dEhMSlJxVURHQ2RWaVhoOWR1cVdOSUFYSU56bmcvaU4vQWU0Mmw5TkxtZXloUDNaUlB4MwpVSUhtZkxUSkRRdHlVL2gyQndkQlI1WU0rK0NDSnBOVmpQNGlIMkJsZkYvbkpyUDNNcENZVU5RM2NWWDJraUY0OTVWNSt2Z3RKb2RtClZqQjNwamQ0TTFJUVdLNC9ZWTd5YXJIdkdINUtXV1BLamFKVzFhY3Z2RllmenpuQjR2c0txQlVzZlUxNlk4WnNsMFE4MG0vRFNoY0sKK0pEU1Y2SVpVYVV0bDBIYUIwK3BVTnFRalpSRzRUN3dsUDBRQURqMU8raEE0YlJ1VmhvZ3pHOVlqZTB1UlkvVzZaTS81N0VzM3pyVwpJb3pjaExzaWI5RDQ1TVk1NlFTSVBNTzY2MVY2YllDWkpQVnNBZnY0bDdDVVcrdjkwbS94ZDJnTk5XUWpyTGhWb1FQUlRVSVozUGgxCldWYWorYWhKZWZpdkRya1JvSHkzYXUwMDBMWW1ZamdhaHd6NDZQMHUwNUIvQjVFcUhkWitYSVdEbWJBNENEL3BYdmsxQitUSlltNVgKZjZkUWxmZTZ5SnZtanFJQnhkWm12M2xoOHp3YzRibUNYRjJndytuWVNMMFpvaEVVR1c2eWhodG9Qa2czR29pM1haWmVuTWZ2SjJJSQo0cEVaWE5MeElkMjZGMEtDbDNHQlV6R3BuL1o5WXI5eTRhT1RIY3lLSmxvSk9ORE8xdzJBRnJSNHBUcUhUSTJLcGRWR2wvSXNFTG04ClZDTEFBVkJwUTU3MHN1OXQrT3phOGVPeDc5K1JqMVFxQ3lYQkpobkVVaEFGWmRXQ0VPckNNYzB1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClF1b1ZhZGlzIFJvb3QgQ0EgMwo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUduVENDQklXZ0F3SUJBZ0lDQmNZd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1QKRUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXpBZUZ3MHdOakV4TWpReApPVEV4TWpOYUZ3MHpNVEV4TWpReE9UQTJORFJhTUVVeEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUMKRHdBd2dnSUtBb0lDQVFETVYwSVdWSnptbU5QVFRlNys3Y2VmUXpsS1piUG9Gb2cwMncxWmtYVFBrcmdFUUswQ1N6R3J2STJSYU5nZwpEaG9CNGhwN1RoZGQ0b3EzUDVrYXpldGhxOEpscGgrM3Q3MjNqL3o5Y0k4TG9HZStBYUpaejNIbUR5bDIvN0ZXZVVVckg1NTZWT2lqCktUVm9wQUZQRDZRdU4rOGJ2K09QRUtoeXExaFg1MVNHeU1uelc5b3MybDJPYmp5alB0cjdndVhkOGx5eUJUTnZpamJPMEJOTy83OUsKRERSTXBzTWh2VkFFVmV1eHU1MzdSUjVrRmQ1VkFZd0NkclhMb1Q5Q2Fid3Z2V2hERmxhSktqZGhrZjJtcms3QXl4UmxsRGRMa2didgpCTkRJbklqYkMzdUJyN0U5S3NSbE9uaTI3dHlBc2RMVG1adzY3bXRhYTdPTnQ5WE9uTUsrcFVzdkZyR2VhRHNHYjY1OW4vamU3TXdwCnA1aWpKVU12Ny9GZkp1R0lUZmhlYnRmWkZHNFpNMm1uTzRTSms4UlRWUk9oVVhoQStMakpvdTU3dWxKQ2c1NFU3UVZTV2xsV3A1ZjgKblQ4S0tkamNUNUVPRTd6ZWxhVGZpNW0rckpzemlPKzFnYThieGlKVHlQYkg3cGNVc01WOGVGTEk4TTV1ZDJDRXB1a3FkaUR0V0FFWApNSlBwR292Z2MyUFphcEtVU1U2MHJVcUZ4S01pTVB3SjdXZ2ljNmFJREZVaFdNWGhPcDhxM2NyaGtPRFpjNnRzZ0xqb0MyU1RvSnlNCkdmK3owZ3pza1NhSGlyT2k0WENQTEFybHpXMW9VZXZhUHdWL2l6TG1FMXhyL2w5QTRpTEl0TFJrVDlhNmZVZytxR2tNMTd1R2NjbHoKdUQ4N25TVkwydjlBNndJREFRQUJvNElCbFRDQ0FaRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96Q0I0UVlEVlIwZ0JJSFpNSUhXTUlIVApCZ2tyQmdFRUFiNVlBQU13Z2NVd2daTUdDQ3NHQVFVRkJ3SUNNSUdHR29HRFFXNTVJSFZ6WlNCdlppQjBhR2x6SUVObGNuUnBabWxqCllYUmxJR052Ym5OMGFYUjFkR1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCRFpYSjAKYVdacFkyRjBaU0JRYjJ4cFkza2dMeUJEWlhKMGFXWnBZMkYwYVc5dUlGQnlZV04wYVdObElGTjBZWFJsYldWdWRDNHdMUVlJS3dZQgpCUVVIQWdFV0lXaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTm5iRzlpWVd3dVkyOXRMMk53Y3pBTEJnTlZIUThFQkFNQ0FRWXdIUVlEClZSME9CQllFRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUU1HNEdBMVVkSXdSbk1HV0FGUExBRStDQ1F6Nzc3aTluTXBZMVhOdTQKeXdMUW9VbWtSekJGTVFzd0NRWURWUVFHRXdKQ1RURVpNQmNHQTFVRUNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWJNQmtHQTFVRQpBeE1TVVhWdlZtRmthWE1nVW05dmRDQkRRU0F6Z2dJRnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFUNjJnTEV6NndQSnY5MlpWCnF5TTA3dWNwMnNOYnRyQ0QyZERRNGlINzgyQ25PMTFnVXllaW0vWUlJaXJudjZCeTVad2thakd4a0hvbjI0UVJpU2VtZDFvNDE3K3MKaHZ6dVhZTzhCc2JSZDJzUGJTUXZTM3BzcHdlV3l1T0VuNjJJaXgyckZvMWJaaGZaRnZTTGdOTGQrTEoydy93NEU2b00za0pwSzI3egpQT3VBSjl2MXBrUU5uMXBWV1F2VkRWSkl4YTZmOGkrQXhlb3lVRFVTbHk3QjRmL3hJNGhST0oveVpsWjI1dzlSbDZWU0RFMUpVWlUyClBiK2lTd3dRSFlhWlRLcnpjaEdUNU9yMm05cW9YYWROdDU0Q3JuTUF5Tm9qQStqNTZobDBZZ0NVeXlJZ3ZwU25XYldDYXI2WmVYcXAKOGtva1V2ZDAvYnBPNXFnZEFtNnhEWUJFd2E3VEl6ZGZ1NFY4SzVJdTZINmxpOTJaNGI4bmJ5MWRxbnVIL2dyZFMveU85U2JrYm5CQwpialBzTVo1N2s4SGt5V2thUGNCclRpSnQ3cXRZVGNiUVFjRXI2azhTaDE3clJkaHM5WmdDMDZEWVZZb0dtUm1pb0hmUk1KNnN6SFh1CmcvV3dZam5QYkZmaVROS1JDdzUxS0J1YXYvMGFRL0hLZC9zN2oyRzRhU2dXUWdSZWNDb2NJZGlQNGIwald5MTBRSkxaWXhrTmM5MXAKdkdKSHZPQjBLN0xyZmI1Qkc3WEFSc1doSXN0ZlRzRW9rdDRZdXRVcUtMc1JpeGVUbUpsZ2xGd2p6MW9ubDE0TEJRYVROeDQ3YVRicgpxWjVoSFk4eTJvNE0xblErZXdrazJnRjNSOFE3elRTTW1mWEs0U1ZoTTdKWkcrSnUxemRYdGcycEV0bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKWFJhbXAgR2xvYmFsIENBIFJvb3QKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNRENDQXhpZ0F3SUJBZ0lRVUpSczdCanExWnhOMVpmdmRZK2dyVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JnakVMTUFrR0ExVUUKQmhNQ1ZWTXhIakFjQmdOVkJBc1RGWGQzZHk1NGNtRnRjSE5sWTNWeWFYUjVMbU52YlRFa01DSUdBMVVFQ2hNYldGSmhiWEFnVTJWagpkWEpwZEhrZ1UyVnlkbWxqWlhNZ1NXNWpNUzB3S3dZRFZRUURFeVJZVW1GdGNDQkhiRzlpWVd3Z1EyVnlkR2xtYVdOaGRHbHZiaUJCCmRYUm9iM0pwZEhrd0hoY05NRFF4TVRBeE1UY3hOREEwV2hjTk16VXdNVEF4TURVek56RTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXgKSGpBY0JnTlZCQXNURlhkM2R5NTRjbUZ0Y0hObFkzVnlhWFI1TG1OdmJURWtNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmpkWEpwZEhrZwpVMlZ5ZG1salpYTWdTVzVqTVMwd0t3WURWUVFERXlSWVVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwCmRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDWUpCNjlGYlM2MzhlTXBTZTJPQXRwODdaT3FDd3UKSVIxY1JOOGhYWDRqZFA1ZWZyUkt0NmF0SDY3Z0JoYmltMXZaWjNSclhZQ1BLWjJHRzltY0RaaHRkaEFvV09SbHNIOUttSG1mNE1NeApmb0FydFl6QVFEc1JodERMb29ZMllLVFZNSUp0Mlc3UUR4SUVNNWRmVDJGYThPVDVrYXZuSFR1ODZNLzBheTAwZk9KSVlSeU84MkZFCnpHK2dTcW1Vc0UzYTU2azBlbkk0cUVITVBKUVJmZXZJcG95M2hzdktNenZaUFRlTCszbytoaXpuYzljS1Y2eGtteG5yOUE4RUNJcXMKQXhjWlpQUmFKU0tOTkN5eTltZ2RFbTNUaWg0VTJzU1BwdUlqaGRWNkRiMXE0T25zN0JlN1FodG5xaVh0UllNaC9NSEpmTlZpUHZyeQp4UzNUL2RSbEFnTUJBQUdqZ1o4d2dad3dFd1lKS3dZQkJBR0NOeFFDQkFZZUJBQkRBRUV3Q3dZRFZSMFBCQVFEQWdHR01BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTVpQb2owR1k0UUpuTTVpNUFTc2pWeTE2YlliTURZR0ExVWRId1F2TUMwd0s2QXAKb0NlR0pXaDBkSEE2THk5amNtd3VlSEpoYlhCelpXTjFjbWwwZVM1amIyMHZXRWREUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQwpBUUV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUpFVk9RTUJHMmY3U2h6NUNtQmJvZHBObDJMNUpGTW4xNEprVHBBdXcwa2JLNXJjCi9LaDRaelh4SGZBUnZiZEk0eEQyRGQ4LzBzbTJxbFdrU0xvQzI5NVpMaFZiTzUwV2ZVZlhOK3BmVFhZU05yc2YxNkdCQkVZZ295eHQKcVo0QmZqOHB6Z0NUMy8zSmtuT0ppV1NlNXl2a0hKRXMwcm5PZmM1dk1ablQ1cjdTSHBEd0NSUjVYQ09yVGRMYUlSOU5tWG1kNGM4bgpueENiSElnTnNJcGtRVEc0RG15UUpLU2JYSEdQdXJ0K0hCdmJhb0FQSWJ6cDI2YTNRUFN5aTZteDVPK2FHdEE5YVpudXFDaWo0VHl6CjhMSVJuTTk4UU9iZDUwTjlvdGc2dGFtTjhqU1p4TlFRNFFiOUNZUVFPKzdFVFBUc0ozeEN3blI4Z29vSnliUURKYnc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdvIERhZGR5IENsYXNzIDIgQ0EKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUFEQ0NBdWlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaE1COEdBMVVFQ2hNWQpWR2hsSUVkdklFUmhaR1I1SUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEEwTURZeU9URTNNRFl5TUZvWERUTTBNRFl5T1RFM01EWXlNRm93WXpFTE1Ba0cKQTFVRUJoTUNWVk14SVRBZkJnTlZCQW9UR0ZSb1pTQkhieUJFWVdSa2VTQkhjbTkxY0N3Z1NXNWpMakV4TUM4R0ExVUVDeE1vUjI4ZwpSR0ZrWkhrZ1EyeGhjM01nTWlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNBd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRU5BRENDQVFnQ2dnRUJBTjZkMStwWEdFbWhXK3ZYWDBpRzZyN2QvK1R2Wnh6MFpXaXpWM0dnWG5lNzdadEo2WENBUFZZWVl3aHYKMnZMTTBEOS9BbFFpVkJEWXNvSFV3SFU5UzMvSGQ4TStlS3NhQTdVZ2F5OXFLN0hGaUg3RXV4Nnd3ZGhGSjIrcU4xajNoeWJYMkMzMgpxUmUzSDNJMlRxWVhQMldZa3RzcWJsMmkvb2pnQzk1LzVZMFY0ZXZMT3RYaUVxSVRMZGlPcjE4U1BhQUlCUWkyWEtWbE9BUkZtUjZqCllHQjB4VUdsY21JYllzVWZiMThhUXI0Q1VXV29yaU1ZYXZ4NEE2bE5mNEREK3F0YS9LRkFwTW9aRnY2eXlPOWVjdzN1ZDcyYTlubVkKdkxFSFo2SVZEZDJnV01aRWV3bytZaWhmdWtFSFUxalBFWDQ0ZE1YNC83VnBrSStFZE9xWEc2OENBUU9qZ2NBd2diMHdIUVlEVlIwTwpCQllFRk5MRXNOS1IxRXdSY2JOaHl6MmgvdDJvYXRUak1JR05CZ05WSFNNRWdZVXdnWUtBRk5MRXNOS1IxRXdSY2JOaHl6MmgvdDJvCmF0VGpvV2VrWlRCak1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVkdobElFZHZJRVJoWkdSNUlFZHliM1Z3TENCSmJtTXUKTVRFd0x3WURWUVFMRXloSGJ5QkVZV1JrZVNCRGJHRnpjeUF5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVnZ0VBTUF3RwpBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQURKTDg3TEtQcEg4RXNhaEI0eU9kNkF6QmhSY2tCNFk5d2ltClBRb1orWWVBRVc1cDVKWVhNUDgwa1dOeU9PN01IQUdqSFpRb3BESDJlc1JVMS9ibE1WZ0Rvc3pPWXR1VVJYTzF2MFhKSkxYVmdnS3QKSTNscGpiaTJUYzdQVE1vekkrZ2NpS3FkaTBGdUZza2c1WW1lelR2YWNQZCttU1lnRkZRbHEyNXpoZWFiSVowS2JJSU9xUGpDRFBvUQpIbXlXNzRjTnhBOWhpNjN1Z3l1VitJNlNoSEk1NnlEcWcrMkR6WmR1Q0x6clRpYTJjeXZrMC9aTS9pWng0bUVSZEVyL1Z4cUhEM1ZJCkxzOVJhUmVnQWhKaGxkWFJRTElRVE83RXJCQkRwcVdlQ3RXVllwb056NGlDeFRJTTVDdWZSZVlObnlpY3Nia3FXbGV0TncrdkhYL2IKdlo4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTdGFyZmllbGQgQ2xhc3MgMiBDQQo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUR6Q0NBdmVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQm9NUXN3Q1FZRFZRUUdFd0pWVXpFbE1DTUdBMVVFQ2hNYwpVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBR0ExVUVDeE1wVTNSaGNtWnBaV3hrSUVOc1lYTnpJRElnClEyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EUXdOakk1TVRjek9URTJXaGNOTXpRd05qSTVNVGN6T1RFMldqQm8KTVFzd0NRWURWUVFHRXdKVlV6RWxNQ01HQTFVRUNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBRwpBMVVFQ3hNcFUzUmhjbVpwWld4a0lFTnNZWE56SURJZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFZ01BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEUUF3Z2dFSUFvSUJBUUMzTXNqKzZYR21CSVd0REJGazM4NU43OGdER0ljL29hdjdQS2FmOE1PaDJ0VFkKYml0VGtQc2twRDZFOEo3b1gremxKMFQxS0tZL2U5N2dLdkRJcjFNdm5zb0ZBWk1lajJZY09hZE4rbHEyY3dRbFp1dDNmK2RaeGtxWgpKUlJVNnliSDgzOFoxVEJ3ajYrd1Jpci9yZXNwN2RlZnFnU0hvOVQ1aWFVMFg5dERrWUkyMldZOHNiaTVndjJjT2o0UXlEdnZCbVZtCmVwc1pHRDMvY1ZFOE1DNWZ2ajEzYzdKZEJtekRJMWFhSzRVbWtoeW5BclBrUHcydkNIbUN1RFk5NnB6VE5iTzhhY3Ixekozby9XU04KRjRBemJsNUtYWm5KSG9lMG5SckExVzRUTlNOZTM1dGZQZS9XOTNiQzZqNjdlQTBjUW1kckJOajQxdHB2aS9KRW9BR3JBZ0VEbzRIRgpNSUhDTUIwR0ExVWREZ1FXQkJTL1g3ZlJ6dDBmaHZSYlZhemMxeERDRHFtSTV6Q0JrZ1lEVlIwakJJR0tNSUdIZ0JTL1g3ZlJ6dDBmCmh2UmJWYXpjMXhEQ0RxbUk1NkZzcEdvd2FERUxNQWtHQTFVRUJoTUNWVk14SlRBakJnTlZCQW9USEZOMFlYSm1hV1ZzWkNCVVpXTm8KYm05c2IyZHBaWE1zSUVsdVl5NHhNakF3QmdOVkJBc1RLVk4wWVhKbWFXVnNaQ0JEYkdGemN5QXlJRU5sY25ScFptbGpZWFJwYjI0ZwpRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQVdkUDRpZDBja2FWYUdzCmFmUHpXZHFiQVljYVQxZXBvWGtKS3R2M0w3SWV6TWRlYXRpRGg2R1g3MGsxUG5jR1FWaGl2NDVZdUFwblAreXozU0ZtSDhsVStuTE0KUFV4QTJJR3ZkNTZEZXJ1aXgvVTBGNDdaRVVEMC9Dd3FUUlYvcDJKZExpWFRBQXNnR2gxbytSZTQ5TDJMN1NoWjNVMFdpeGVEeUxKbAp4eTE2cGFxOFU0WnQzVmVreXZnZ1FRdG84UFQ3ZEw1V1hYcDU5ZmtkaGVNdGxiNzFjWkJEekkwZm1nQUtoeW5wVlNKWUFDUHE0eEpECktWdEhDTjJNUVdwbEJxamxJYXBCdEpVaGxibDkwVFNyRTlhdHZOemlQVG5OdlQ1MWNLRVlXUVBKSXJTUG5OVmVLdGVsdHRRS2JmaTMKUUJGR21oOTVEbUsvRDVmczRDOGZGNVE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0ekNDQXArZ0F3SUJBZ0lRRE9mZzVSZllSdjZQNVdEOEcvQXdPVEFOQmdrcWhraUc5dzBCQVFVRkFEQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRdwpJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1EwRXdIaGNOTURZeE1URXdNREF3TURBd1doY05NekV4Ck1URXdNREF3TURBd1dqQmxNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUwKRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUTBFdwpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdERoWE81RU9BWExHSDg3ZGcrWEVTcGE3Y0pwU0lxdlRPCjlTQTVLRmhnRFBpQTJxa1ZsVEpoUExXeEtJU0tpdHlmQ2d5REYzcVBrS3lLNTNsVFhER0VLdllQbURJMmRzemUzVHlvb3U5cSt5SHkKVW1IZm55RFhIK0t4MmY0WVpOSVNXMS81V0JnMXZFZk5vVGI1YTMvVXNEZyt3UnZEakRQWjJDOFkvaWdQczZlRDFzTnVSTUJoTlpZVwovbG1jaTNadDEvR2lTdzByL3d0eTJwNWcwSTZRTmNaNFZZY2dvYy9sYlFySVNYd3htRE5zSXVtSDBESmFvcm9UZ2hIdE9SZWRtVHB5Cm9lYjZwTm5WRnpGMXJvVjlJcTQvQVVhRzlpaDV5TEhhNUZjWHhINGNEckMwa3FaV3M3MnlsKzJxcC9DM3hhZy9sUmJRLzZHVzZ3aGYKR0hkUEFnTUJBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSRgo2Nkt2OUpMTGdqRXRVWXVucHlHZDgyM0lEekFmQmdOVkhTTUVHREFXZ0JSRjY2S3Y5SkxMZ2pFdFVZdW5weUdkODIzSUR6QU5CZ2txCmhraUc5dzBCQVFVRkFBT0NBUUVBb2c2ODMrTHQ4T055YzNwa2xMLzNjbWJZTXVSQ2RXS3VoK3Z5MWRuZVZyT2Z6TTRVS0xrTmwyQmMKRWt4WTVOTTlnMGxGV0pjMWFScW9SK3BXeG5tckV0aG5nWVRmZndrOGxPYTRKaXdndlQyektJbjNYLzhpNHBlRUgrbGw3NGZnMzhGbgpTYk5kNjdJSkt1c203WGkrZlQ4cjg3Y21OVzFmaVFHMlNWdWZBUVdicXowbHdjeTJmOEx4YjRiRyttUm82NEV0bE90Q3QvcU1IdDFpCjhiNVFaN2RzdmZQeEgyc01OZ2NXZnpkOHFWdHRldkVTUm1DRDF5Y0V2a3ZPbDc3RFp5cG9FZCtBNXd3elpyOFREUlJ1ODM4Zll4QWUKK28wYkpXMXNqNlczWVFHeDBxTW1vUkJ4bmEzaXcvbkRtVkczS3djSXppN21VTEtuK2dwRkw2THc4Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEdsb2JhbCBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcnpDQ0FwZWdBd0lCQWdJUUNEdmdWcEJDUnJHaGRXckpXWkhIU2pBTkJna3Foa2lHOXcwQkFRVUZBREJoTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXcKSGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCRFFUQWVGdzB3TmpFeE1UQXdNREF3TURCYUZ3MHpNVEV4TVRBdwpNREF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzCmR5NWthV2RwWTJWeWRDNWpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFTkJNSUlCSWpBTkJna3EKaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0anZoRVhMZXFLVFRvMWVxVUtLUEMzZVF5YUtsN2hMT2xsc0JDU0RNQVpPbgpUakMzVS9kRHhHa0FWNTNpalNMZGh3WkFBSUVKenM0Ymc3L2Z6VHR4UnVMV1pzY0ZzM1luRm85N25oNlZmZTYzU0tNSTJ0YXZlZ3c1CkJtVi9TbDBmdkJmNHE3N3VLTmQwZjNwNG1WbUZhRzVjSXpKTHYwN0E2RnB0NDNDL2R4Qy8vQUgyaGRtb1JCQllNcWwxR05YUm9yNUgKNGlkcTlKb3orRWtJWUl2VVg3UTZoTCtocWtwTWZUN1BUMTlzZGw2Z1N6ZVJudHdpNW0zT0ZCcU9hc3YremJNVVpCZkhXeW1lTXIveQo3dnJUQzBMVXE3ZEJNdG9NMU8vNGdkVzdqVmcvdFJ2b1NTaWljTm94Qk4zM3NoYnlUQXBPQjZqdFNqMWV0WCtqa01Pdkp3SURBUUFCCm8yTXdZVEFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBOTVRTlZiUlRMdG0KOEtQaUd4dkRsN0k5MFZVd0h3WURWUjBqQkJnd0ZvQVVBOTVRTlZiUlRMdG04S1BpR3h2RGw3STkwVlV3RFFZSktvWklodmNOQVFFRgpCUUFEZ2dFQkFNdWNONnBJRXhJSyt0MUVuRTlTc1BUZnJnVDFlWGtJb3lRWS9Fc3JoTUF0dWRYSC92VEJIMWpMdUcyY2VuVG5tQ21yCkViWGpjS0NoelV5SW1aT01rWERpcXc4Y3ZwT3AvMlBWNUFkZzA2Ty9uVnNKOGRXTzQxUDBqbVA2UDZmYnRHYmZZbWJXMFc1QmpmSXQKdGVwM1NwK2RXT0lyV2NCQUkrMHRLSUpGUG5sVWtpYVk0SUJJcURmdjhOWjVZQmJlck9nT3pXNnNSQmM0TDBuYTRVVStLcmsyVTg4NgpVQWIzTHVqRVYwbHNZU0VZMVFTdGVEd3NPb0JycCt1dkZSVHAySW5CdVRoczRwRnNpdjlrdVhjbFZ6REFHeVNqNGR6cDMwZDh0YlFrCkNBVXc3QzI5Qzc5RnYxQzVxZlBybUFFU3JjaUl4cGcwWDQwS1BNYnAxWldWYmQ0PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4VENDQXEyZ0F3SUJBZ0lRQXF4Y0ptb0xRSnVQQzNueXJrWWxkekFOQmdrcWhraUc5dzBCQVFVRkFEQnNNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNzdwpLUVlEVlFRREV5SkVhV2RwUTJWeWRDQklhV2RvSUVGemMzVnlZVzVqWlNCRlZpQlNiMjkwSUVOQk1CNFhEVEEyTVRFeE1EQXdNREF3Ck1Gb1hEVE14TVRFeE1EQXdNREF3TUZvd2JERUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREVScFoybERaWEowSUVsdVl6RVoKTUJjR0ExVUVDeE1RZDNkM0xtUnBaMmxqWlhKMExtTnZiVEVyTUNrR0ExVUVBeE1pUkdsbmFVTmxjblFnU0dsbmFDQkJjM04xY21GdQpZMlVnUlZZZ1VtOXZkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTWJNNVhQbSs5Uzc1UzB0Ck1xYmY1WUUveWMwbFNiWnhLc1BWbERSbm9nb2NzRjlwcGtDeHhMZXlqOUNZcEtsQldUclQzSlRXUE50ME9LUkt6RTBsZ3ZkS3BWTVMKT083elNXMXhrWDVqdHF1bVg4T2toUGhQWWxHKytNWHMyemlTNHdibENKRU14Q2hCVmZ2TFdva1ZmbkhvTmI5TmNnazl2am80VUZ0MwpNUnVOczhja1JacW5yRzBBRkZvRXQ3b1Q2MUVLbUVGQklrNWxZWWVCUVZDbWVWeUozaGxLVjlVdTVsMGNVeXgrbU0wYUJoYWthSFBRCk5BUVRYS0Z4MDFwOFZkdGVaT0UzaHpCV0JPVVJ0Q21BRXZGNU9ZaWlBaEY4SjJhM2lMZDQ4c29LcURpckNtVEN2MlpkbFlUQm9TVWUKaDEwYVVBc2dFc3hCdTI0TFVUaTRTOHNDQXdFQUFhTmpNR0V3RGdZRFZSMFBBUUgvQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGTUFNQgpBZjh3SFFZRFZSME9CQllFRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1COEdBMVVkSXdRWU1CYUFGTEUrdzJrRCtMOUhBZFNZCkpob0lBdTlqWkN2RE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQWNHZ2FYM05lY256eUlaZ1lJVnlIYklVZjRLbWVxdnhneWRrQVEKVjhHSzgzclpFV1dPTmZxZS9FVzFudGxNTVV1NGtlaERMSTZ6ZU03YjQxTjVjZGJsSVpRQjJsV0htaVJrOW9wbXpONmNOODJvTkxGcApteVBJbm5naUszQkQ0MVZITVdFWjcxakZoUzlPTVBhZ01SWWp5T2ZpWlJZenk3OGFHNkE5K01wZWl6R0xZQWlKTFF3R1hGSzN4UGtLCm1ORVZYNThTdm53Mll6aTlSS1IvNUNZckNzU1hhUTNwak9MQUVGZTR5SFlTa1ZYeVNHbll2Q29DV3c5RTFDQXgyL1M2Y0NaZGtHQ2UKdkVzWENTKzB5eDVEYU1rSEo4SFNYUGZxSWJsb0VwdzhuTCtlL0lCY20yUE43RWVxSlNkbm9EZnpBSUo5Vk5lcCtPa3VFNk4zNkI5SwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTd2lzc1NpZ24gR29sZCBDQSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1akNDQTZLZ0F3SUJBZ0lKQUx0QUhFUDFYayt3TUEwR0NTcUdTSWIzRFFFQkJRVUFNRVV4Q3pBSkJnTlZCQVlUQWtOSU1SVXcKRXdZRFZRUUtFd3hUZDJsemMxTnBaMjRnUVVjeEh6QWRCZ05WQkFNVEZsTjNhWE56VTJsbmJpQkhiMnhrSUVOQklDMGdSekl3SGhjTgpNRFl4TURJMU1EZ3pNRE0xV2hjTk16WXhNREkxTURnek1ETTFXakJGTVFzd0NRWURWUVFHRXdKRFNERVZNQk1HQTFVRUNoTU1VM2RwCmMzTlRhV2R1SUVGSE1SOHdIUVlEVlFRREV4WlRkMmx6YzFOcFoyNGdSMjlzWkNCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcitUdWZvc2tEaEp1cVZBdEZrUTdrcEpjeXJoZGhKSkNFeXE4WlZlQ1FENVhKTTFRaXlVcQp0Mi84NzZMUXdCOENKRW9UbG84akUrWW9XQUNqUjhjR3A0UWpLN3U5bGl0L1ZjeUx3VmNmRG1KbEQ5MDlWb3B6MnE1K2JicUJISDVDCmpDQTEyVU5OaFBxRTIxSXM4dzRuZHd0cnZ4RXZjbmlmTHRnKzVoZzNXaXB5K2RwaWtKS1Z5aCtjNmJNOEs4dnpBUk8vV3MvQnRRcGcKdmQyMW1XUlR1S0NXczIvaUpuZVJqT0JpRUFLZk5BK2sxWkl6VWQ2K2picUVlbUE4YXR1ZksremUzZ0UvYmszbFVJYkx0Sy90UkVERgp5bHFNMnRJcmZLanV2cWJsQ3FvT3BkOEZVcmRWeHlKZE1tcVhsMk1UMjhuYmVUWjdoVHBLeFZLSitTVG5uWGVwZ3Y5VkhLVnhhU3ZSCkFpVHlzeWJVYTlvRVZlWEJDc2R0TURlUUt1U2VGRE5lRmhkVnhWdTF5elNKa3ZHZEpvK2hCOVRHc25oUTJ3d01DM3dMakVIWHVlbmQKaklqM28wMnlNc3pZRjlyTnQ4NW1uZFQ5WHYrOWx6NHBkZWQrcDJKWXJ5VTBwVUhIUGJ3TlVNb0RBdzhJV2grVmMzaGl2Njl5RkdrTwpwZVVERG5pT0ppaEM4QWNMWWlBUVp6bEcrcWtEekFRNGVtYnZJSU8xakVwV2pwRUEvSTVjZ3Q2SW9NUGlhRzU5amU4ODNXWDBYYXhSCjd5U0FycXBXbDIvNXJYM2FZVCtZZHp5bGtiWWNqQ2JhWmFJSmJjSGlWT081eWt4TWdJOTNlMkNhSHQrMjhrZ2VEcnBPVkcyWTRPR2kKR3FKM1VNL0VZNUxzUnhtZDYrWnJ6c0VDQXdFQUFhT0JyRENCcVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBZEJnTlZIUTRFRmdRVVd5VjdscVJsVVg2NE9mUEFlR1plNkRybjhPNHdId1lEVlIwakJCZ3dGb0FVV3lWN2xxUmxVWDY0Ck9mUEFlR1plNkRybjhPNHdSZ1lEVlIwZ0JEOHdQVEE3QmdsZ2hYUUJXUUVDQVFFd0xqQXNCZ2dyQmdFRkJRY0NBUllnYUhSMGNEb3YKTDNKbGNHOXphWFJ2Y25rdWMzZHBjM056YVdkdUxtTnZiUzh3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUNlNjQ1Ujg4YTdBM2hmbQo1ZGpWOVZTd2cvUzd6VjRGZTArZmRXYXZQT2hXZnZ4eWVEZ0QyU3RpR3dDNStPbGd6Y3pPVVlySFVERnU0VXArR0M5cFdiWTlaSUVyCjQ0T0U1aUtIam4zZzdnS1pZYmdlOUxncmlCSVdoTUl4a3ppV01hYTVPMU0vd3lTVFZsdHBrdXpGd2JzNEFPUHNGNm00M01kOEFZT2YKTWtlNlVpSTBIVEo2Q1ZhbmZDVTJxVDFMMnNDQ2J3cTdFc2lIU3ljUitSNHR4NU0vbnR0ZkptdFMyUzZLOFJUR1JJMFZxYmUvdmQ2bQpHdTZ1TGZ0SWR4Zit1K3l2R1BVcVVmQTVoSmVWYkc0Ynd5dkVkR0I1SmJBS0o5L2ZYdEk1ejBWOVFrdmZzeXdleGNaZHlsVTZvSnhwCm1vL2E3N0t3UEorSGJCSXJaWEFWVWpFYUpNOXZNU05RSDR4UGp5UERkRUZqSEZXb0ZOMCs0RkZRei9FYk1GWU9rckNDaGRpRHl5SmsKdkMyNEpkVlVvcmdHNnEyU3BDU2d3WWExU2hOcVI4OHVDMWFWVk12T210dHF0S2F5MjBFSWhpZDM5MnFnUW13TE9NN1hkVkF5a3NMZgpLekFpU05EVlFUZ2xYYVRwWFovR2xIWFFSZjB3bDBPUGtLc0t4NFp6WUVwcExkNmxlTmNHMm1xZVN6NTNPaUFUSWdIUXYyaWVZMkJyCk5VMExiYnFoUGNDVDRIOGpzMVd0Y2lWT1J2blNGdSt3Wk1FQm51bktvR3FZRHMvWVlQSXZTYmprUXVFNE5SYjB5RzVQOTRGVzZMcWoKdmlPdnJ2MXZBK0FDT3pCMitodHRRYzhCc2VtNHlXYjAyeWJ6T3FSMDhra2tXOG13MEZmQitqNTY0WmZKCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyZVRydXN0IENBCj09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdURDQ0FxQ2dBd0lCQWdJUURQQ09YQWdXcGExQ2YvRHJKeGhaMERBTkJna3Foa2lHOXcwQkFRVUZBREJJTVFzd0NRWURWUVFHCkV3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHhGekFWQmdOVkJBTVREbE5sWTNWeVpWUnkKZFhOMElFTkJNQjRYRFRBMk1URXdOekU1TXpFeE9Gb1hEVEk1TVRJek1URTVOREExTlZvd1NERUxNQWtHQTFVRUJoTUNWVk14SURBZQpCZ05WQkFvVEYxTmxZM1Z5WlZSeWRYTjBJRU52Y25CdmNtRjBhVzl1TVJjd0ZRWURWUVFERXc1VFpXTjFjbVZVY25WemRDQkRRVENDCkFTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS3VrZ2VXVnpmWDJGSTdDVDhyVTRuaVZXSnhCNFEyWlFDUVgKT1pFelp1bSs0WU92WWx5SjBmd2tXMkd6NEJFUlFSd2RidkM0dS9qZXA0RzZwa2pHbngyOXZvNnBRVDY0bE8wcEd0U08wZ01kQSs5dApEV2NjVjljR3Jjckk5ZjRPcjJZbFNBU1dDMTJqdWhiRENFL1JSdmdVWFBMSVhnR1piZjJJeklhb3dXOHhRbXhTUG1qTDh4azAzN3VICkdGYUFKc1RRM01CdjM5Nmd3cEVXb0dRUlMwUzhIdmJuK21QZVpxeDJwSEdqN0RhVWFIcDNwTEhuRGkrQmV1SzFjb2J2b211TDhBL2IKMDFrL3VuSzhSQ1NjNDNPejk2OVhMMEltbmFsMHVnQlM4a3ZOVTN4SEN6YUZEbWFwQ0pjV05GZkJadmVBNCsxd1ZNZVQ0QzRvRlZtSAp1cnNDQXdFQUFhT0JuVENCbWpBVEJna3JCZ0VFQVlJM0ZBSUVCaDRFQUVNQVFUQUxCZ05WSFE4RUJBTUNBWVl3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVFqSzJGdm9FL2Y1ZFMzckQvZmRNUUIxYVE2OHdOQVlEVlIwZkJDMHdLekFwb0NlZ0pZWWoKYUhSMGNEb3ZMMk55YkM1elpXTjFjbVYwY25WemRDNWpiMjB2VTFSRFFTNWpjbXd3RUFZSkt3WUJCQUdDTnhVQkJBTUNBUUF3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFERHRUMHJoV0RwU2NsdTFwcU5sR0thN1VUdDM2WjNxMDU5YzRFVmxldzNLVytKd1VMS1VCUlN1ClNjZU5RUWNTYzVSK0RDTWgvYndRZjJBUVduTDFtQTZzN0xsLzNYcHZYZE1jOVArSUJXbENxUVZ4eUxlc0p1Z3V0SXhxLzNIY3VMSGYKbWJ4OElWUXI1RmlpdTFjcHJwNnBveGttRDVrdUNMRHYvV25QbVJvSmplT25ueXZKTmpSN0pMTjRUSlVYcEFZbUhyWmtValpmWUdmWgpuTVVGZEF2blp5UFNDUHlJNmE2TGYrRXc5RGQrL2NZeTJpMmVSREF3Yk80SDN0STAvTkwvUVBaTDlHWkdCbFNtOGpJS1l5WXdhNXZSCjNJdEh1dUc1MVdMUW9xRDBad1Y0S1dNYWJ3VFcrTVpNbzVxeE43U041U2hMSFo0c3dyaG92TzBDN2pFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN1cmUgR2xvYmFsIENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2RENDQXFTZ0F3SUJBZ0lRQjFZaXBPalVpb2xOOUJQSThQanFwVEFOQmdrcWhraUc5dzBCQVFVRkFEQktNUXN3Q1FZRFZRUUcKRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eEdUQVhCZ05WQkFNVEVGTmxZM1Z5WlNCSApiRzlpWVd3Z1EwRXdIaGNOTURZeE1UQTNNVGswTWpJNFdoY05Namt4TWpNeE1UazFNakEyV2pCS01Rc3dDUVlEVlFRR0V3SlZVekVnCk1CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4R1RBWEJnTlZCQU1URUZObFkzVnlaU0JIYkc5aVlXd2cKUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2TlM3WXJHeFZhUVp4NVJOb0pMTlAyTXdoUi9qeApZRGlKaVFQcHZlcGVSbE1KM0Z6MVd1ajNSU29DNnpGaDF5a3pUTTdIZkFvM2ZnKzZNcGpoSFpldmo4ZmN5VGlXODlzYS9GSHRhTWJRCmJxUjhKTkd1UXNpV1VHTXU0UDUxL3Bpblgwa3VsZU01TTJTT0hxUmZrTkpuUExMWi9rRzVWYWNKam5JRkhvdmRSSVdDUXRCSndCMWcKOE5FWExKWHI5cVhCa3FQRndxY0lZQTFnQkJDV2VaNFdOT2FwdHZvbFJUbklIbVg1ay9XcThWTGNtWmc5cFlZYUREVXora3VsQkFZVgpIREdBNzZvWWE4SjcxOXJPK1RNZzFmVzlhak10Z1FUN3NGelVuS1BpWEIzanFVSjFYbnZVZCs4NVZMckpDaGdiRXBsSkw0aEwvVkJpCjBYUG5qM3BEQWdNQkFBR2pnWjB3Z1pvd0V3WUpLd1lCQkFHQ054UUNCQVllQkFCREFFRXdDd1lEVlIwUEJBUURBZ0dHTUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZLOUVCTUpCZmtpRDIwNDVBdXpzaEhybXpzbWtNRFFHQTFVZEh3UXRNQ3N3S2FBbgpvQ1dHSTJoMGRIQTZMeTlqY213dWMyVmpkWEpsZEhKMWMzUXVZMjl0TDFOSFEwRXVZM0pzTUJBR0NTc0dBUVFCZ2pjVkFRUURBZ0VBCk1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQmpHZ2hBZmFSZVV3MTMySHF1SHcwTFVSWUQ3eGg4eU9PdmFsaVRGR0NSc29UY2lFNisKT1lvNjgrYUNpVjBCTjdPckpLUVZEcEkxV2twRVhrNVgrblhPSDBqT1p2UThRQ2FTbUd3YjdpUkdEQmV6VXFYYnBaR1J6emZUYitjbgpDRHBPR1I4NnAxaGNGODk1UDR2a3A5TW1JNTBtRDFocC9FZCtzdENOaTVPL0tVOURhWFIyWjB2UEI0em1BdmUxNGJSRHRVc3RGSi81CjNDWU52NlpIZEFiWWlORTZLVENFenRJNWdHSWJxTWRYU2J4cVZWRm5GVXErTlFmazFYV1lOM2t3Rk5zcG5XekZhY3hIVmFJdzk4eGMKZjhMRG1CeHJUaGFBNjNwNFpVV2lBQnF2REExVlpEUkl1Sks1OGJSUUtmSlBJeC9hYkt3ZlJPSGRJM2hSVzhjVwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDT01PRE8gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSFRDQ0F3V2dBd0lCQWdJUVRvRXRpb0psNEFzQzdqNDFBa2JsUFRBTkJna3Foa2lHOXcwQkFRVUZBRENCZ1RFTE1Ba0dBMVVFCkJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0cKQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhKekFsQmdOVkJBTVRIa05QVFU5RVR5QkRaWEowYVdacFkyRjBhVzl1SUVGMQpkR2h2Y21sMGVUQWVGdzB3TmpFeU1ERXdNREF3TURCYUZ3MHlPVEV5TXpFeU16VTVOVGxhTUlHQk1Rc3dDUVlEVlFRR0V3SkhRakViCk1Ca0dBMVVFQ0JNU1IzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSEV3ZFRZV3htYjNKa01Sb3dHQVlEVlFRS0V4RkQKVDAxUFJFOGdRMEVnVEdsdGFYUmxaREVuTUNVR0ExVUVBeE1lUTA5TlQwUlBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTBFQ0xpM0xqa1J2M1VjRWJWQVNZMDZtL3dlYUtYVHVICis3dUl6ZzNqTHo4R2x2Q2lLVkNacnRzN29WZXdkRkZ4emUxQ2tVMUIvcW5JMkdxR2QwUzdXV2FYVUY2MDFDeHdSTS9hTjVWQ2FUd3cKeEhHelV2QWhUYUhZdWpsOEhKNmpKSjN5Z3hhWXFoWjhRNXNWVzdldU5KSCsxR0ltR0VhYVArdkIrZkdRVit1c2VnMkwyM0l3YW1iVgo0RWFqY054bzJmOEVTSWwzM3JYcCsyZHRRZW04T2IweTJXSUM4YkdvUFc0M25PSXY0dE9pSm92R3VGVkRpT0VqUHFYU0pEbHFSNnNBCjFLR3pxU1grRFQrbkhiclRVY0VMcE5xc09POVZVQ1FGWlVhVE5FOHRqYTNHMUNFWjBvN0tCV0Z4QjNOSDVZb1pFcjBFVGM1T25LVkkKckxzbTl3SURBUUFCbzRHT01JR0xNQjBHQTFVZERnUVdCQlFMV09XTHhrd1ZONlJBcVRDcEliNUhObHBXL3pBT0JnTlZIUThCQWY4RQpCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pCSkJnTlZIUjhFUWpCQU1ENmdQS0E2aGpob2RIUndPaTh2WTNKc0xtTnZiVzlrCmIyTmhMbU52YlM5RFQwMVBSRTlEWlhKMGFXWnBZMkYwYVc5dVFYVjBhRzl5YVhSNUxtTnliREFOQmdrcWhraUc5dzBCQVFVRkFBT0MKQVFFQVBwaWVtL1liNmRjNXQzaXVIWElZU2RPSDVFT0M2ei9KcXZXb3RlOVZmQ0ZTWmZuVkRlRnM5RDZNazNPUkxnTEVUZ2R4YjhDUApPR0VJcUI2QkNzQXZJQzlCaTVIY1NFVzg4Y2JldW5ack04Z0FMVEZHVE8zbm5jK0lsUDh6d0Zib0pJWW11Tmc0T044cWE5MFN6TWMvClJ4ZE1vc0lHbGduVzIvNC9QRVpCMzFqaVZnODhPOEVja3pYWk9GS3M3c2pzTGpCT2xEVzBKQjlMZUduYThnSTR6SlZTay9Cd0pWbWMKSUdmRTd2bUxWMkgwa25aOVA0U05WYmZvNWF6VjhmVVpWcVphKzVBY3I1UHI1UnpVWjVkZEJBNitDNE9tRjRPNU1CS2d4VE1WQmJrTgorOGNGZHVQWVNvMzhOQmVqeGlFb3ZqQkZNUjdIZUw1WVlUaXNPK0lCWlE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpVENDQWcrZ0F3SUJBZ0lRSDBldnFtSUFjRkJVVEFHZW0yT1pLakFLQmdncWhrak9QUVFEQXpDQmhURUxNQWtHQTFVRUJoTUMKUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRQpDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1USWtOUFRVOUVUeUJGUTBNZ1EyVnlkR2xtYVdOaGRHbHZiaUJCCmRYUm9iM0pwZEhrd0hoY05NRGd3TXpBMk1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaFRFTE1Ba0dBMVVFQmhNQ1IwSXgKR3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUgpRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvCmIzSnBkSGt3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUURSM3N2ZGNtQ0ZZWDdkZVNSRnRTcllwbjFQbElMQnM1QkFIK1gKNFFva1BCMEJCTzQ5MG8wSmx3emdkZVQ2KzNlS0t2VURZRXMyaXhZakZxMEpjZlJLOUNoUXRQNklIRzQvYkM4dkNWbGJwVnNMTTVuaQp3ejJKK1dvczc3TFRCdW1qUWpCQU1CMEdBMVVkRGdRV0JCUjFjYWNaU0JtOG5aM3FRVWZmbE1SSWQ1blRlVEFPQmdOVkhROEJBZjhFCkJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakVBN3dOYmVxeTNlQXB5dDRqZi83VkcKRkFrSytxRG1mUWpHR29lOUdLaHp2U2JLWUF5ZHpwbWZ6MXdQTU9HK0ZESHFBakFVOUpNOFNhY3plcEJHUjdOamZST2JUcmR2R0RlQQpVLzdkSU9BMW1qYlJ4d0c1NXR6ZDgvOGRMRG9XVjltU09kWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydGlnbmEKPT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lKQVA3YzR3RVB5VWovTUEwR0NTcUdTSWIzRFFFQkJRVUFNRFF4Q3pBSkJnTlZCQVlUQWtaU01SSXcKRUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoTUI0WERUQTNNRFl5T1RFMU1UTXdOVm9YRFRJMwpNRFl5T1RFMU1UTXdOVm93TkRFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVVJvYVcxNWIzUnBjekVSTUE4R0ExVUVBd3dJClEyVnlkR2xuYm1Fd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJYVBISjF0YXpOSFVtZ2g3c3RMN3EKWE9FbTdSRkhZZUdpZkJaNFFDSGtZSjVheUdQaHhMR1drdjhZYldrajRTdGk5OTNpTmkrUkI3bEl6dzdzZWJZczV6UkxjQWdsb3p5SApHeG55Z1FjUE9KQVoweEgraHJUeTBWNGVIcGJOZ0d6T096R1R0dktnMEttVkVuMmxtc3hyeUlSV2lqT3A1eUlWVXhid3pCZnNWMS9wCm9ncVlDZDdqWDV4djNFampoUXNWV3FhNm42eEk0d215OS9ReTNsNDB2aHg0WFVKYnpnNGlqMDJRMTMweUdMTUxMR3Evamo4VUVZa2cKRG5jVXRUMlVDSWYzSlI3VnNtQUE3RzhxS0NWdUtqNFlZeGNsUHo1RUlCYjJKc2dscmdWS3RPZGpMUE9NRmxOK1hQc1JHZ2pCUm1LZgpJcmp4d28xcDNQbzZXQWJmQWdNQkFBR2pnYnd3Z2Jrd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUd1MytRVG1RCnRDUlp2Z0h5VXRWRjlsbzUzQkV3WkFZRFZSMGpCRjB3VzRBVUd1MytRVG1RdENSWnZnSHlVdFZGOWxvNTNCR2hPS1EyTURReEN6QUoKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEVUQVBCZ05WQkFNTUNFTmxjblJwWjI1aGdna0EvdHpqQVEvSgpTUDh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBCmhRTWVrbkgyUXEvaG8yR2U2L1BBRC9LbDFOcVY1dGErYURZOWZtNGZUSXJ2MFE4aGJWNmxVbVBPRXZqdkt0cHY2emYrRXdMSHl6cysKSW12YVlTNS8xSEk5M1REaEhreEFHWXdQMTV6Umd6QjdtRm5jZmNhNURDbE1vVE9pNjJjNlpZVFRsdUx0ZGtWd2o3VXIzdmtqMWtsdQpQQlMxeHA4MUhsRFF3WTlxY0VRQ1lzdXVIV2hCcDZwWDZGT3FCOUlHOXRVVUJndVJBM1VzYkhLMVlaV2FEWXU1RGVmMTMxVE4zdWJZCjFna0lsMlBsd1M2d3QwUW13Q2JBcjFVd25qdlZOaW9aQlBSY0h2L1BMTGYvMFAySFFCSFZFU083U01BaHFhUW9MZjBWK0xCT0svUXcKV3lIOEVaRTB2a0h2ZTUyWGRmK1hsY0NXV0MvcXUwYlh1K1RaTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgplUEtJIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGc0RDQ0E1aWdBd0lCQWdJUUZjaTlaVWRjcjdpWEFGN2tCdEs4blRBTkJna3Foa2lHOXcwQkFRVUZBREJlTVFzd0NRWURWUVFHCkV3SlVWekVqTUNFR0ExVUVDZ3dhUTJoMWJtZG9kMkVnVkdWc1pXTnZiU0JEYnk0c0lFeDBaQzR4S2pBb0JnTlZCQXNNSVdWUVMwa2cKVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHdOREV5TWpBd01qTXhNamRhRncwek5ERXlNakF3TWpNeApNamRhTUY0eEN6QUpCZ05WQkFZVEFsUlhNU013SVFZRFZRUUtEQnBEYUhWdVoyaDNZU0JVWld4bFkyOXRJRU52TGl3Z1RIUmtMakVxCk1DZ0dBMVVFQ3d3aFpWQkxTU0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQ0lqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBNFNVUDdvM2JpRE4xWjgydEgzMDZUbTJkMHk4VTgyTjB5d0VoYWpmcWhGQUhTeVpiQ1VOcwpJWjVxeU5VRDlXQnBqOHp3SXVRZjUvZHFJakczTEJYeTRQNEFha1AvaDJYR3RSckJwMHh0SW5BaGlqSHlsM1NKQ1JJbUhKN0syUktpCmxUemE2V2UvQ0tCazQ5WkN0MFh2bC9UMjlkZTFTaFVDV0gyWVdFdGd2TTNYRFpvVE0xUFJZZmw2MWRkNHM1b3o5d0NHemgxTmxEaXYKcU94NFVYQ0tYQkNEVVNIM0VUMDBobDdsU00yWGdZSTFUQm5zWmZacnhRV2g3a2NUMXJNaEo1UVFDdGtrTzdxK1JCTkdNRCtYUE5qWAoxMnJ1T3pqaks5U1hEcmtiNXdkSmZ6Y3ErWGQ0ejFUdFcwYWRvNEFPa1VQQjFsdGZGTHFmcG8wa1IwQlp2M0k0c2pac04vK1owVjBPCldRcXJhZmZBc2dSRmVsUUFycjVUOXJYbjRmZzhvekhTcWY0aFVtVEZwbWZ3ZFFjR2xCU0JWY1luNUFHUEY4RnFjZGUrUy91VVdIMSsKRVRPeFF2ZGliQmpXendsb1BuOXM5aDZQWXEybFk5c0pweDhpUWtFZWI1bUtQdGY1UDBCNmViQ2xBWkxTblQwSUZhVVFBUzJ6TW5hbwpsUTJ6ZXByN0J4QjRFVy9oajhlNkR5VWFkQ3JsSEpoQm1kOGhoK2lWQm1vS3MycEhkbVgyT3MrUFloY1pld29velJyU2d4NGh4eXkvCnZ2OWhhTGRuRzd0NFRZM09aK1hrd1k2M0kyYmluWkIxTkppcE5pdUttcFM1bmV6TWlySDRKWWxjV3JZdmpCOXRlU1NuVW1qRGhEWGkKWm8xakRpVk4xUm15NW5rM3B5S2RWREVDQXdFQUFhTnFNR2d3SFFZRFZSME9CQllFRkI0TTk3Wm44dUdTSmdsRndGVTVMbmMvUWtxaQpNQXdHQTFVZEV3UUZNQU1CQWY4d09RWUVaeW9IQUFReE1DOHdMUUlCQURBSkJnVXJEZ01DR2dVQU1BY0dCV2NxQXdBQUJCUkZzTUxICkNsWjg3bHQ0REpYNUdGUEJwaHpZRURBTkJna3Foa2lHOXcwQkFRVUZBQU9DQWdFQUNiT0RVMWtCUHBWSnVmR0J1dmwySUNPMUoyQjAKMUdxWk5GNXNBRlBabi9LbXNTUUhSR29xeHFXT2VCTG9SOWxZR3hNcVhubWJud29xWjZZbFB3WnBWblBEaW1aSSt5bUJWM1FHeXB6cQpLT2c0WnlZcjhkVzFQMldUK0RaZGpvMk5RQ0NIR2Vydko4QTl0RGtQSlh0b1VIUlZuQXhaZlZvOVFaUWxVZ2pnUnl3Vk1SblZ2d2RWCnhyc1N0WmYwWDRPRnVuSEIyV3lCRVhZS0NyQy9ncGYzNmozNit1d3RxU2lVTzFiZDBsRXVyc0M5Q0JXTWQxSTBsdGFick5NZGptRVAKTlh1YnJqbHBDMkpnUUNBMmo2LzdOdTR0Q0VvZHVMK2JYUGpxcFJ1Z2M2YlkrRzdnTXdSZmFLb25oKzNad1pDYzdiM2phald2WTkrcgpHTm02NXVsSzZsQ0tEMkdUSHVJdEdlSXdsRFdTWFE2MkI2OFpnSTlIa0ZGTExrM2RoZUxTQ2xJS0Y1cjhHckJRQXVVQm8yTTNJVXhFCnhKdFJtUkVPYzV3R2oxUXVweWhlUkRtSFZpMDN2WVZFbE9FTVN5eWN3NUtGTkdITEQ3aWJTa05TL2pRNmZianBLZHgycWNndytCUngKZ01ZZU5raDBJa0ZjaDRMb0dIR0xRWWxFNTM1WVc2aTRqUlBwcDJ6RFIrMnpHcDFpcm8yQzZwU2UzVmtRdzYzZDRrM2pNZFhIN09qeQpzUDZTSGhZS0d2elo4L2dudHNtK0hiUnNaSkIvOU9URVc5YzNya0lPM2FRYWIzeUlWTVVXYnVGNmFDNzRPcjhOcER5Sk8zaW5UbU9ECkJDRUlaNDN5Z2tuUVcvMnh6UStEaE5RK0lJWDNTajByblAwcUNnbE42b0g0RVp3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpjZXJ0U0lHTiBST09UIENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURPRENDQWlDZ0F3SUJBZ0lHSUFZRkZuQUNNQTBHQ1NxR1NJYjNEUUVCQlFVQU1Ec3hDekFKQmdOVkJBWVRBbEpQTVJFd0R3WUQKVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRUN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQWVGdzB3TmpBM01EUXhOekl3TURSYQpGdzB6TVRBM01EUXhOekl3TURSYU1Ec3hDekFKQmdOVkJBWVRBbEpQTVJFd0R3WURWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFCkN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxjenVYN0kKSlVxT3RkdTBLQnVxVjVEbzBTTFRaTHJUaytqVXJJWmhRR3BnVjJoVWhFMjhhbFFDQmYvZm01b3FybDBIajByREtIL3YreXY2ZWZISApyZkFRVXlTUWkyYkpxSWlycjFxakFPbSt1a2J1VzNON0xCZUNnVjVpTEtFQ1piTzl4U3NBZnNUOEF6TlhEZTNpK3M1ZFJkWTR6VFcyCnNzSFFuSUZLcXVTeUFWd2RqMStaeExHdDI0Z2g2NUFJZ29Eek1LTkQ1cENDcmxVb1NlMWIxNmtRT0E3K2oweGJtMGJxUWZXd0NIVEQKMElnenRuelhkTi9jaE5GRERuVTVvU1ZBS09wNHl3NHNMam1kakl0dUZod3ZKb0lRNHVObGxBb0V3RjczWFZ2NEVPTFF1bnBMKzk0MwpBQUFhV3lqajBweHpQaktIbUtISlVTL1gzcXd6czA4Q0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCCkFmOEVCQU1DQWNZd0hRWURWUjBPQkJZRUZPQ01tOXNsU2JQeGZJYldza0tIQzlCcm9ObmtNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUIKQVFBKzBoeUpMalg4K0hYZDVuOWxpUFJ5VE1rczF6Sk84OTBaZVVlOWpqdGJrdzlRU1NRVGF4UUdjdThKMDZHaDQwQ0V5ZWNZTW5ROApTRzRQbjB2VTl4N1RrNFprVkpkamNsRFZWYy82SUpNQ29wdkRJNU5PRmxWMm9IQjViYzBoSDg4dkxid1o0NGd4K0ZrYWdRbklsNlowCngyREVXOHhYanJKMS9Sc0NDZHRaYjNLVGFmY3hRZGFJT0wrSHNyMFdlZm1xNUw2SUpkMWhKeU1jdFRFSEJEYTBHcEM5b0hSeFVJbHQKdkJUakQ0YXU4YXMreDZBSnpLTkkwZURiWk9lU3RjK3Zja053aS9uRGhEd1RxbjZTbTFkVGsvcHd3cEVPTWZtYloxM3BsamhlWDdOegpUb2dWWjk2ZWRoQmlJTDVWYVpWREFEbE45dTZ3V2s1SlJGUllYMEtECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVGVENDQXYyZ0F3SUJBZ0lHU1VFczVBQVFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR25NUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEcKQTFVRUJ3d0lRblZrWVhCbGMzUXhGVEFUQmdOVkJBb01ERTVsZEV4dlkyc2dTMlowTGpFM01EVUdBMVVFQ3d3dVZHRnV3N3B6dzYxMApkc09oYm5scmFXRmt3N05ySUNoRFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpLVEUxTURNR0ExVUVBd3dzVG1WMFRHOWpheUJCCmNtRnVlU0FvUTJ4aGMzTWdSMjlzWkNrZ1JzV1JkR0Z1dzdwenc2MTBkc09oYm5rd0hoY05NRGd4TWpFeE1UVXdPREl4V2hjTk1qZ3gKTWpBMk1UVXdPREl4V2pDQnB6RUxNQWtHQTFVRUJoTUNTRlV4RVRBUEJnTlZCQWNNQ0VKMVpHRndaWE4wTVJVd0V3WURWUVFLREF4TwpaWFJNYjJOcklFdG1kQzR4TnpBMUJnTlZCQXNNTGxSaGJzTzZjOE90ZEhiRG9XNTVhMmxoWk1PemF5QW9RMlZ5ZEdsbWFXTmhkR2x2CmJpQlRaWEoyYVdObGN5a3hOVEF6QmdOVkJBTU1MRTVsZEV4dlkyc2dRWEpoYm5rZ0tFTnNZWE56SUVkdmJHUXBJRWJGa1hSaGJzTzYKYzhPdGRIYkRvVzU1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4Q1JlYzc1TGJSVERvZlRqbDVCdQowakJGSGp6dVo5bGs0QnFLZjhvd3lvUGpJTUhqOURyVGxGOGFmRnR0dnpCUGhDZjJueDlKdk1hWkNwRHlEL1YvUTRRM1kxR0xlcVZ3Ci9IcFl6WTZiN2NOR2JJUndYZHJ6QVpBai9FNHdxWDdoSjJQbjdXUThvTGpKTTJQK0ZwRC9zTGo5MTZqQXdKUkRDN2JWV2FhZVZ0QWsKSDNCNXI5czVWQTFsZGRrVlFaUUJyMTdzOW8zeC82MWsvaUNhMTF6ci9xWWZDR1NqaTNaVnJSNDdLR0F1aHlYb3FxOGZ4bVJHSUxkdwpmenplU051V1U3YzVkK1FhNHNjV2hIYVhXeSs3R1JXRitHbUY5Wm1ucWZJMHA2bTJwZ1A4YjRZOVZIeDJCSnRyK1VCZEFEVEhMcGwxCm5lV0lBNnBOK0FQU1FuYkFHd0lEQUtpTG8wVXdRekFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VFTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVXpQcG5rL0MydU5DbHdCN3pVLzJNVTkrRDE1WXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS3QvN2h3VwpxWnc4VVFDZ3dCRUlCYWVaNW04QmlGUmhidkc1R0sxS3JmNkJRQ09VTC90MWZDOG9TMklrZ1lJTDlXSHhIRzY0WVRqcmdmcGlvVHRhCll0T1VaY1RoNW0yQytDOGxjTEloSnNGeVVSK01MTU9Fa01OYWo3clA5S2RscGV1WTBmc0Zza1oxRlNOcWI0VmpNSUR3MVo0ZktSekMKYkxCUVdWMlFXenVvRFREUHYzMS96dkdkZzczSlJtNGdwdmxoVWJvaEwzdStwUlZqb2RTVmgvR2V1Zk9KOHoyRnVMamJ2clc1S2ZuYQpOd1VBU1pRRGhFVG52ME14ejNXTEpkSDBwbVQxa3ZhckJlczk2YVVMTm1MYXpBWmZOb3UyWGpHNEt2dGU5bkhmUkNhZXhPWU5rYlF1CmRaV0FVV3BMTUthd1lxR1Q4WnZZenNSamRUOVpSN0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVDakNDQXZLZ0F3SUJBZ0lKQU1KK1F3Uk9SejhaTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdDTVFzd0NRWURWUVFHRXdKSVZURVIKTUE4R0ExVUVCd3dJUW5Wa1lYQmxjM1F4RmpBVUJnTlZCQW9NRFUxcFkzSnZjMlZqSUV4MFpDNHhKekFsQmdOVkJBTU1IazFwWTNKdgpjMlZqSUdVdFUzcHBaMjV2SUZKdmIzUWdRMEVnTWpBd09URWZNQjBHQ1NxR1NJYjNEUUVKQVJZUWFXNW1iMEJsTFhONmFXZHVieTVvCmRUQWVGdzB3T1RBMk1UWXhNVE13TVRoYUZ3MHlPVEV5TXpBeE1UTXdNVGhhTUlHQ01Rc3dDUVlEVlFRR0V3SklWVEVSTUE4R0ExVUUKQnd3SVFuVmtZWEJsYzNReEZqQVVCZ05WQkFvTURVMXBZM0p2YzJWaklFeDBaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnZjMlZqSUdVdApVM3BwWjI1dklGSnZiM1FnUTBFZ01qQXdPVEVmTUIwR0NTcUdTSWIzRFFFSkFSWVFhVzVtYjBCbExYTjZhV2R1Ynk1b2RUQ0NBU0l3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPbjRqL05qcmRxRzJLZmdRdnZQa2Q2bUp2aVpwV053clp1dXlqTkEKZlcyV2JxRU9STzdoRTUyVVFsS2F2WFdGZEN5b0RoMlR0aGkzakN5b3ovdGNjYm5hN1A3b2ZvL2tMeDJ5cUhXSDJMZWg1VHZQbVVwRwowSU1aZmNDaEVoeVZiVXIwMk1lbFRUTXVoVGxBZFg0VWZJQVNtRkRIUVdlNG9JQmhWS1pzVGgvZ25RNEg2Y202TStmK3dGVW9MQUtBCnB4bjFudHhWVXdPWGV3ZEkvNW43TjRva3hGbk1VQkJqanFxcEdyQ0VHb2I1WDd1eFVHNmswUXJNMVhGK0g2Y2JmUFZUYmlKZnl5dm0KMUh4ZHJ0YkN4a3psQlFIWjdWZjh3U041L1BySUpJT1Y4N1ZxVVFIUWQ5YnBFcUg1R29QN2dodTVzSmYwZGdZelEwbWcvd3UxK3JVQwpBd0VBQWFPQmdEQitNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCVExEOGJmClFrUE1QY3UxU0NPaEducW1LcnMwYURBZkJnTlZIU01FR0RBV2dCVExEOGJmUWtQTVBjdTFTQ09oR25xbUtyczBhREFiQmdOVkhSRUUKRkRBU2dSQnBibVp2UUdVdGMzcHBaMjV2TG1oMU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRREowUTVlTHRYTXMzdyt5L3c5L3cwbwpsWk1FeUwvYXpYbTRRNUR3cEw3djh1OGhtTHpVMUYwRzl1NUM3REJzb0txcHl2R3Zpdm8vQzNOcVB1b3VRSDRmcmxSaGVlc3VDRGZYCkkvT01uNzRkc2VHa2RkdWc0bFFVc2JvY0thUVk5aEs2b2hRVTR6RTF5RUQvdCtBRmRsZkJIRm55K0wvazdTVmlYSVR3Zm40ZnM3NzUKdHlFUnpBTUJWbkNuRUpJZUd6U0JIcTJjR3NNRVBPMENZZFllQnZOZk9vZnlLL0ZGaCtVOXJOSEhWNFM5YTY3YzJQbTJHMkp3Q3owMgp5VUx5TXRkNlllYlMyejNQeUtuSm05emJXRVRYYnppdmYzalRvNjBhZGJvY3dUWjhqeDV0SE1OMVJxNDFCYWIyWEQwaDdsYnd5WUlpCkxYcFVxM0REZlNKbGduQ1cKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IENBIC0gUjMKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURYekNDQWtlZ0F3SUJBZ0lMQkFBQUFBQUJJVmhUQ0tJd0RRWUpLb1pJaHZjTkFRRUxCUUF3VERFZ01CNEdBMVVFQ3hNWFIyeHYKWW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpNeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzYjJKaApiRk5wWjI0d0hoY05NRGt3TXpFNE1UQXdNREF3V2hjTk1qa3dNekU0TVRBd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUCmFXZHVJRkp2YjNRZ1EwRWdMU0JTTXpFVE1CRUdBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG4KYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXdsZHBCNUJuZ2lGdlhBZzdhRXlpaWUvUVYyRWNXdAppSEw4UmdKRHg3S0tuUVJmSk1zdVMrRmdna2JoVXFzTWdVZHdiTjFrMGV2MUxLTVBnajBNSzY2WDE3WVVoaEI1dXpzVGdIZU1DT0ZKCjBtcGlMeDllK3BabzM0a25sVGlmQnRjK3ljc21XUTF6M3JESTZTWU9neFhHNzF1TDBnUmd5a21tS1BacE8vYkx5Q2lSNVoyS1lWYzMKckhRVTNIVGdPdTV5THk2Yys5Qzd2L1U5QU9FR00raUNLNjVUcGpvV2M0emRRUTRnT3NDMHA2SHBzaytRTGpKZzZWZkx1UVNTYUdqbApPQ1pnZGJLZmQvK1JGTyt1SUVuOHJVQVZTTkVDTVdFWlhyaVg3NjEzdDJTYWVyOWZ3UlB2bTJMN0RXemdWR2tXcVFQYWJ1bURrM0YyCnhtbUZnaGNDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUUKRkkvd1MzK29Ma1VrcmsxUSttT2FpOTdpM1J1OE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkxRTnZBVUtyK3lBenY5NVpVUlVtNwpsZ0FKUWF5ekU0YUdLQWN6eW12bWRMbTZBQzJ1cEFyVDlmSHhENHEvYzJkS2c4ZEVlM2pncjI1c2J3TXBqak01UmNPTzVMbFhiS3I4CkVwYnNVOFl0NUNSc3VaUmorOXhUYUdkV1BvTzR6elVodzhsby9zN2F3bE9xekpDSzZmQmRSb3lWM1hwWUtCb3ZIZDdOQURkQmorMUUKYmRkVEtKZCs4MmNFSGhYWGlwYTAwOTVNSjZSTUczTnpkdlFYbWNJZmVnN2pMUWl0Q2h3cy96eXJWUTRQa1g0MjY4TlhTYjdoTGkxOApZSXZEUVZFVEk1M085ekpybEFHb21lY3NNeDg2T3lYU2hrRE9PeXlHZU1saEx4UzY3dHRWYjkrRTdnVUpUYjBvMkhMTzAySlFaUjdyCmtwZURNZG16dGNwSFdEOWYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSXplbnBlLmNvbQo9PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGOFRDQ0E5bWdBd0lCQWdJUUFMQzNXaFpJWDcvaHkvV0wxeG5tZlRBTkJna3Foa2lHOXcwQkFRc0ZBREE0TVFzd0NRWURWUVFHCkV3SkZVekVVTUJJR0ExVUVDZ3dMU1ZwRlRsQkZJRk11UVM0eEV6QVJCZ05WQkFNTUNrbDZaVzV3WlM1amIyMHdIaGNOTURjeE1qRXoKTVRNd09ESTRXaGNOTXpjeE1qRXpNRGd5TnpJMVdqQTRNUXN3Q1FZRFZRUUdFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdQpRUzR4RXpBUkJnTlZCQU1NQ2tsNlpXNXdaUzVqYjIwd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURKCjAzcktEeDZzcDRib0ZtVnFzY0liUlRKeGxkbitFRnZNcitlbGVRR1BpY1BLOGxWeDkzZStkNVR6Y3FRc1JOaWVrcHNVT3FIbkpKQUsKQ2xhT3hkZ21sT0haU09FdFB0b0tjdDJqbVJYYWdhS0g5SHR1Sm5lSldLM1c2d3l5UVhwemJtM2JlbmhCNlFpSUVuNkhMbVlSWTJ4VQorenlkY3NDOEx2L0N0OTBOZHVNNjEvZTBhTDZpOWVPQmJzRkdiMTJONEUzR1ZGV0pHak14Q3JGWHVhT0ttTVBzT3pURmxVRnBmblhDClBDREZZYnBSUjZBZ2tKT2hrRXZ6VG55RlJWU2EwUVVtUWJDMVRSMHp2c1FEeUNWOHdYRGJPL1FKTFZRblNLd3Y0Y1NzUHNqTGtreFQKT1RjajdOTUIrZUFKUkUxTlpNRGhEVnFISXJ5dEc2UCtKclVWODZmOGhCbnA3S0dJdEVScGhJUHppZEYwQnFuTUM5YkMzaWVGVUNiSwpGN2pKZW9kV0xCb0JIbXkrRTYwUXJMVWs5VGlSb2RaTDJ2RzcwdDVIdGZHOGdmWlphODhaVSttTkZjdEt5Nmx2Uk9VYlFjL2hocWZLCjBHcWZ2RXlOQmpOYW9vWGxrRFdnWWx3V1R2RGpvdm9ER3JRc2NiTllMTjU3QzlzYUQrdmVJUjhHZHdZRHNNbnZtZnpBdVU4TGhpaisKMHJucTQ5cWx3MGRwRXVEYjhQWVppKzE3Y05jQzF1MkhHQ2dzQkNSTWQrUklpaHJHTzVyVUQ4cjZkZElCUUZxTmViK0x6MHZQcWhiQgpsZVN0VElvK0Y1SFVzV0xsZ3VXQUJLUURmbzIvMm4raUQ1ZFBETk1OKzlmUjVYSitITWgzLzF1YUQ3ZXVCVWJsOGFnVzdFZWtGd0lECkFRQUJvNEgyTUlIek1JR3dCZ05WSFJFRWdhZ3dnYVdCRDJsdVptOUFhWHBsYm5CbExtTnZiYVNCa1RDQmpqRkhNRVVHQTFVRUNndysKU1ZwRlRsQkZJRk11UVM0Z0xTQkRTVVlnUVRBeE16TTNNall3TFZKTlpYSmpMbFpwZEc5eWFXRXRSMkZ6ZEdWcGVpQlVNVEExTlNCRwpOaklnVXpneFF6QkJCZ05WQkFrTU9rRjJaR0VnWkdWc0lFMWxaR2wwWlhKeVlXNWxieUJGZEc5eVltbGtaV0VnTVRRZ0xTQXdNVEF4Ck1DQldhWFJ2Y21saExVZGhjM1JsYVhvd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME8KQkJZRUZCMGNaUTZvOGlWN3RKSFA1TEd4NXIxVmRHd0ZNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUI0cGd3V1NwOU1pRHJBeXc2bApGbjJmdVVoZkdJOE5ZamIyelJscnJLdlY5cEY5cm5IelA3TU9lSVdibGFRbklVZENTbnhJT3ZWRmZMTU1qbEY0ckpVVDNzYjlmYmdhCmtFeXJrZ1BIN1VJQnpnL1lzZnFpa3VGZ2JhNTZhd21xeGludWFFbG5NSUFrZWpFV09WdCs4Und1M1d3SnJmSXh3WUpPdWJ2NXZyOHEKaFQvQVFLTTZXZnhaU3p3b0pOdTBGWFd1RFlpNkxuUEF2VmlINVVMeTYxN3VIakFpbWNzMzBjUWhiSUhzdm0wbTVoemtRaUNlUjdDcwpnMWx3TERYV3J6WTB0TTA3K0RLbzcrTjRpZnVOUlN6YW5MaCtRQnhoNXo2aWtpeEw4czM2bUxZcC8vUHllNmtmTHFDVFZ5dmVoUVA1CmFUZkxubmhxQmJURk1YaUo3SHFuaGVHNWV6emV2aDU1aE02ZmNBNVp3alV1a0NveDJlUkZla0drTGhPYk5BNW1lMG1yWkpmUVJzTjUKblhKUVk2YVlXd2E5U0czWU9ZTnc2RFh3QmRHcXZPUGJ5QUxxZlAyQzJzSmJVald1bURxdHVqV1RJNmNmU04wMVJwaXlFR2prcFRIQwpDbGd1R1lFUXlWQjEvT3BhRnM0UjErN3ZVSWd0WWY4L1FuTUZsRVBWamp4T0FUb1pwUjlHVG5mUVhlV0JJaUdIL3BSOWhOaVRyZFpvClEwaXkyK3R6Sk9lUmYxU2t0b0ErbmFNOFRITENWOFNnMU13NEo4N1ZCcDZpU05ucG44NkNjRGFUbWp2ZmxpSGpXYmNNMnBFMzhQMVoKV3JPWnlHbHNReVlCTldOZ1ZZa0RPblhZdWtyWlZQL3Uzb0RZTGRFNDFWNHRDNWg5UG16Yi9DYUl4dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHhUQ0NBcTJnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnekVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFnVApCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4R2pBWUJnTlZCQW9URVVkdlJHRmtaSGt1WTI5dExDQkpibU11Ck1URXdMd1lEVlFRREV5aEhieUJFWVdSa2VTQlNiMjkwSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTUKTURrd01UQXdNREF3TUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1lNeEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNgpiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1Sb3dHQVlEVlFRS0V4RkhiMFJoWkdSNUxtTnZiU3dnU1c1akxqRXhNQzhHCkExVUVBeE1vUjI4Z1JHRmtaSGtnVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMOXhZZ2p4K2xrMDl4dkpHS1AzZ0VsWTZTS0RFNmJGSUVNQk80VHg1b1ZKbnlmcQo5b1FiVHFDMDIzQ1l4eklCc1FVK0IwN3U5UHBQTDFrd0l1ZXJHVlpyNG9BSC9QTVdkWUE1VVh2bCtUVzJkRTZwallJVDVMWS9xUU9ECitxSytpaFZxZjk0THc3WVpGQVhLNnNPb0JKUTdSbnd5RGZNQVppTElqV2x0Tm93UkdMZlRzaHhndERqNkFvek8wOTFHQjk0S1B1dGQKZk1oOCs3QXJVNlNTWW1sUkpRVmhHa1NCakN5cFE1WWozNnc2Z1pvT0tjVWNxZWxkSHJhZW5qQUtPYzd4aUlEN1MxM01NdXlGWWtNbApOQUpXSndHUnREdHdLajl1c2VpY2lBRjluOVQ1MjFOdFlKMi9MT2RZcTdoZlJ2ek94QnNEUEFuclNURmNhVWF6NEVjQ0F3RUFBYU5DCk1FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZEcWFoUWNRWnlpMjcvYTkKQlVGdUlNR1UyZy9lTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDWjIxMTUxZm1YV1djRFlmRitPd1l4ZFMyaElJNVBaWWUwOTZhYwp2TmpwTDlEYld1N1BkSXh6dERoQzJnVjcrQUoxdVAybHNkZXU5dGZlRTh0VEVINktSdEdYK3JjdUt4R3JrTEFuZ1Bub24xcnBONStyCjVOOXNzNFVYblQzWkpFOTVrVFhXWHdUcmdJT3JtZ0l0dFJEMDJKREhCSE5BN1hJbG9LbWY3SjZyYUJLWlY4YVBFam9KcEwxRS9RWVYKTjhHYjVES2o3VGpvMkdUekxINFUvQUxxbjgzL0IyZ1gyeUtRT0MxNmpkRlU4V25qWHpQS2VqMTdDdVBLZjE4NTVlSjF1c1YyR0RQTwpMUEF2VEszM3NlZk9UNmpFbTBwVUJzVi9mZFVJRCtJYy9uNFh1S3hlOXRRV3NrTUpERTMycDJ1MG1ZUmx5bnFJNHVKRXZsejM2aHoxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEM1RDQ0FzV2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmp6RUxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQWdUCkIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhKVEFqQmdOVkJBb1RIRk4wWVhKbWFXVnNaQ0JVWldOb2JtOXMKYjJkcFpYTXNJRWx1WXk0eE1qQXdCZ05WQkFNVEtWTjBZWEptYVdWc1pDQlNiMjkwSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMAplU0F0SUVjeU1CNFhEVEE1TURrd01UQXdNREF3TUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUkF3CkRnWURWUVFJRXdkQmNtbDZiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1TVXdJd1lEVlFRS0V4eFRkR0Z5Wm1sbGJHUWcKVkdWamFHNXZiRzluYVdWekxDQkpibU11TVRJd01BWURWUVFERXlsVGRHRnlabWxsYkdRZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQgpkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDN0d1FQODlvLzhBckZ2Clc1OUkyWjE1NHFLM0EyRldHTU5IdHRmS1BUVXVpVVAzb1dtYjNvb2EvUk1nbkxSSmR6SXBWdjI1N0l6ZEl2cHkzQ2RobCs3MldvVHMKYmhtNWlTemNoRnZWZFB0clg4V0pwUkJTaVVaVjlMaDFIT1ovNUZTdVMvaFZjbGNDR2ZnWGNWbnJIaWdIZE1XZFNMNXN0UFNrc1BOawpOM21Td094R1huL2hiVk5NWXEvTkh3dGp1enFkKy94NUFKaGhkTThtZ2tCajg3SnlhaGtObWNyVURuWE1OL3VMaWNGWjhXSi9YN05mClpURDRwN2ROZGxvZWRsNDB3T2lXVnBtS3MvQi9wTTI5M0RJeGZKSFA0RjhSK0d1cVNWelJtWlRSb3VOald3bDJ0VlppNFV0MEhaYlUKSnRRSUJGblFtQTRPNXQ3OHcrd2ZrUEVDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3SFFZRFZSME9CQllFRkh3TU1oK24yVEIveEgxb28yS29vYzZyQjFzbk1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQVJXZm9sClR3TnZsSms3bWgrQ2hUblVkZ1dVWHVFb2syMWlYUW5Db0tqVXNIVTQ4VFJxbmVTZmlvWW1VZVlzMGNZdGJwVWdTcElCN0xpS1ozc3gKNG1jdWpKVURKaTVEblVveDlnNjFETHUzNGpkL0lyb0FvdzU3VXZ0cnV6dkUwM2xSVHMyUTlHY0hHY2c4Um5vTkFYM0ZXT2R0NW9VdwpGNW9reEJEZ0JQZmc4bi9VcWdyL1FoMDM3WlRsWkZrU0lIYzQwekkrT0lGMWxuUDZhSSt4eTg0ZnhlejZuSDdQZnJIeEJ5MjIvTC9LCnBML1Fsd1ZLdk9vWUtBS1F2VlI0Q1NGeDA5RjlIZGtXc0tsaFBkQUtBQ0w4eDN2TENXUkZDenRBZ2ZkOWZETDFtTXBZam4wcTdwQloKYzJUNU5uUmVKYUgxWmdVdWZ6a1ZxU3I3VUl1T2hXbjAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ3ekNDQXRlZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCbURFTE1Ba0dBMVVFQmhNQ1ZWTXhFREFPQmdOVkJBZ1QKQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVEhGTjBZWEptYVdWc1pDQlVaV05vYm05cwpiMmRwWlhNc0lFbHVZeTR4T3pBNUJnTlZCQU1UTWxOMFlYSm1hV1ZzWkNCVFpYSjJhV05sY3lCU2IyOTBJRU5sY25ScFptbGpZWFJsCklFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWmd4Q3pBSkJnTlYKQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VApkR0Z5Wm1sbGJHUWdWR1ZqYUc1dmJHOW5hV1Z6TENCSmJtTXVNVHN3T1FZRFZRUURFekpUZEdGeVptbGxiR1FnVTJWeWRtbGpaWE1nClVtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0MKQVFvQ2dnRUJBTlVNT3NRcStVN2k5YjRabDErT2lGT3hIei9MejU4Z0UyMHBPc2dQZlR6M2EzWTRZOWsyWUtpYlhsd0FnTEl2V1gvMgpoL2tsUTRibmFSdFNtcERoY2VQWUxRMU9iL2JJU2RtMjh4cFdyaXUyZEJUcnovc200eHE2SFpZdWFqdFlsSWxIVnY4bG9KTndVNFBhCmhIUVV3MmVlQkdnNjM0NUFXaDFLVHM5RGtUdm5WdFlBY010UzdudDlyanJudkRINVJmYkNZTThUV1FJcmdNdzBSOSs1M3BCbGJRTFAKTEpHbXB1ZmVoUmhKZkdaT296cHRxYlh1TkM2NkRRTzRNOTlINjdGcmpTWFptODZCMFVWR01wWndoOTRDRGtsRGhiWnNjN3RrNm1GQgpyTW5VVk4rSEw4Y2lzaWJNbjFsVWFKLzh2aW92eEZVY2RVQmdGNFVDVlRtTGZ3VUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSnhmQU4rcUFkY3dLemlJb3JodFNwenlFWkdETUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQkFRQkxOcWFFZDJuZE94bWZaeU1JYnc1aHlmMkUzRi9ZTm9ITjJCdEJMWjlnM2NjYWFOblJib2JoaUNQUApFOTVEeitJMHN3U2RIeW5Wdi9oZXlOWEJ2ZTZTYnpKMDhwR0NMNzJDUW5xdEtyY2dmVTI4ZWxVU3doWHF2ZmRxbFM1c2RKL1BITFR5CnhRR2poZEJ5UHExenF3dWJkUXh0UmJlT2xLeVdON1dnMEk4VlJ3N2o2SVBkai8zdlFRRjN6Q2VwWW9VejhqY0k3M0hQZHdiZXlCa2QKaUVEUGZVWWQveDdINGM3L0k5dkcrbzFWVHFrQzUwY1JSajcwL2IxN0tTYTdxV0ZpTnlpMkxTcjJFSVpreVhDbjBxMjNLWEI1Nmp6YQpZeVdmL1dpM01PeHcrM1dLdDIxZ1o3SWV5TG5wMktodkFvdG5EVTBtVjNIYUlQekJTbENOc1NpNgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZmZpcm1UcnVzdCBDb21tZXJjaWFsCj09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURURENDQWpTZ0F3SUJBZ0lJZDNjR0p5YXBzWHd3RFFZSktvWklodmNOQVFFTEJRQXdSREVMTUFrR0ExVUVCaE1DVlZNeEZEQVMKQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WemRDQkRiMjF0WlhKamFXRnNNQjRYRFRFdwpNREV5T1RFME1EWXdObG9YRFRNd01USXpNVEUwTURZd05sb3dSREVMTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5CmJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WemRDQkRiMjF0WlhKamFXRnNNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FROEFNSUlCQ2dLQ0FRRUE5aHRQWndjcm9SWDFCaUxMSHdHeTQzTkZCa1JKTEx0SkpSVFd6c08zcXl4UHhrRXlsRmY2RXFkYgpEdUtQSHg2R0dhZXF0UzI1WHcyS3dxK0ZOWGt5TGJzY1lqZnlzVnRLUGNyTmNWL3BRcjZVNk1qZStTSklaTWJscThZcmJhMEY4UHJWCkM4K2E1ZkJRcElzN1I2VWpXM3A2K0RNL3VPK1psK01nd2RZb2ljK1UrN2xGN2VOQUZ4SFVkUEFMTWVJckptcWJURmV1ckNBK3VrVjYKQmZPOW0ya1ZybjFPSUdQRU5YWTZCd0xKTi8zSFIrN284WFlkY3hYeWw2UzF5SHA1MlVLcUszOWMvczRtVDZObWdUV3ZSTHBVSGh3dwpNbVdkNWp5VFhsQk9ldU02MUc3TUd2djUwamV1SkNxclZ3TWlLQTFKZFgrM0tOcDF2NDdqM0E1NU1RSURBUUFCbzBJd1FEQWRCZ05WCkhRNEVGZ1FVblpQR1U0dGV5cTgvbng0UDVabVZ2Q1QybEk4d0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGaXM5QVFPemNBTi93cjkxTG9XWHltOWUyaVpXRW5TdEIwM1RYOG5mVVlHWFVQRwpoaTQrYzdJbWZVK1RxYmJFS3BxcklaY1VzZDZNMDZ1SkZkaHJKTlR4RnE3WXBGelVmMUdPN1JnQnNaTmp2Yno0WVlDYW5ySE9RbkRpCnFYMEdKWDBub2Y1djdMTWVKTnJqUzFVYUFEczF0RHZaMTEwdy9ZRVRpZkxDQml2dFo4U095VU95WEdzVmlRSzhZdnhPOHJVenFySnYKMHdxaVVPUDJPK2d1Uk1MYlpqaXBNMVpJOFcwYk00ME5qRDlnTjUzVHltMStOSDRObjNKMml4dWZjdjFTTlVGRkFwWXZITEthYzBraApzVWxIUlVlMDcybzBFY2xObXN4WnQ5WUNubHBPWmJXVXJodmZLYkFXOGI4QW5nYzZGMlMxQkxVaklaa0tsVHVYZk84PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZmZpcm1UcnVzdCBOZXR3b3JraW5nCj09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURURENDQWpTZ0F3SUJBZ0lJZkU4RU9SelVtUzB3RFFZSktvWklodmNOQVFFRkJRQXdSREVMTUFrR0ExVUVCaE1DVlZNeEZEQVMKQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WemRDQk9aWFIzYjNKcmFXNW5NQjRYRFRFdwpNREV5T1RFME1EZ3lORm9YRFRNd01USXpNVEUwTURneU5Gb3dSREVMTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5CmJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WemRDQk9aWFIzYjNKcmFXNW5NSUlCSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FROEFNSUlCQ2dLQ0FRRUF0SVRNTXhjdWE1UnNhMkZTb091anozbVVUT1dVZ0puTFZXUkVaWTluWk9JRzQxdzNTZll2bTRTRQpIaTN5WUowd1RzeUVoZUlzeng2ZS9qYXJNM2MxUk5nMWxobzlOdWg2RHRqVlI2RnFhWXZaL0xzNnJubGExZlRXY2J1YWtDTnJtcmVJCmRJY01IbCs1bmkzNnExTXIzTHQyUHBOTUNBaU1IcUlqSE5ScXJTSzZtUUV1YldYTHZpUm1WU1JMUUVTeEc5Zmh3b1hBM2hBL1BlMjQKL1BIeEkxUGN2MldYYjluNVFIR05mYjJWMU02K29GNG5JOTc5cHRBbURnQXA2enhHOEQxZ3Z6OVEwdHdtUVZHZUZEZENCS053VjZnYgpoKzB0K252dWpBcmpxV2FKR2N0QitkMUVObUhQNG5kR3lIMzI5SktCTnYzYk5QRnlmdk1NRnIyMEZRSURBUUFCbzBJd1FEQWRCZ05WCkhRNEVGZ1FVQngvUzU1emF3bTZpUUxTd2VsQVFVSFRFeUwwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFJbFhzaFo2cU1MOTF0bWJtelRDbkxReUZFMm5wTi9zdnFlKytFUGJrVGZPdERJdQpVRlVhTlU1MlEzRWc3NU4zVGhWd0xvZkR3UjF0M011MUo5UXNWdEZTVXpwRTBuUEl4QnNGWlZwaWtwenVRWTB4MitjMDZsa2gxUUY2CjEyUzRaRG5OeWUydjdVc0RTS2VnbVFHQTNHV2pOcTVsV1VoUGdrdklaZkZYSGVWWkxnby9iTmpSOWVVSnRHeFVBQXJnRlUySGRXMjMKV0paYTNXM1NBS0QwbTBpK3d6ZWt1amJnZkllRmx4b1ZvdDR1b2x1OXJ4ajVrRkROY0ZuNEoyZEh5OGVnQnpwOTBTeGRiQms2WnJWOQovWkZ2Z3JHK0NKUGJGRWZ4b2pmSFJaNDh4M2V2WktpVDMvWnBnNEpnOGtsQ05PMWFBRlNGSEJZMmtneGMrcWF0djlzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZmZpcm1UcnVzdCBQcmVtaXVtCj09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZSakNDQXk2Z0F3SUJBZ0lJYll3VVJyR21DdTR3RFFZSktvWklodmNOQVFFTUJRQXdRVEVMTUFrR0ExVUVCaE1DVlZNeEZEQVMKQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVJ3d0dnWURWUVFEREJOQlptWnBjbTFVY25WemRDQlFjbVZ0YVhWdE1CNFhEVEV3TURFeQpPVEUwTVRBek5sb1hEVFF3TVRJek1URTBNVEF6Tmxvd1FURUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5CmRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVVjblZ6ZENCUWNtVnRhWFZ0TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEEKTUlJQ0NnS0NBZ0VBeEJMZnFWLytRZDNkOVorSzQvYXM0VHg0bXJ6WThIOTZvRE1xM0kwZ1c2NHRiK2VUMlRad2FtalBqbEdqaFZ0bgpCS0FRSkc5ZEtJTEJsMWZZU0NrVHR1RytrVTNmaFF4VEdKb2VKS0pQai9DaWhRdkw5Q2wvMHFSWTdpWk55YXFvZTVyWitqamVSRmNWCjVmaU15TmxJNGcwV0p4MGV5SU9GSmJlNnFsVkJ6QU1pU3kyUmpZdm1pYTlteCtuL0srazhyTnJTczhQaGFKeUorSG9BVnQ3MFZaVnMKKzdwazNXS0wzd3QzTXV0aXpDYWFtN3VxWW9OTXRBWjZNTWdwdiswR1RaZTVITVF4SzlWZnZGTVNGNXlaVnlsbWQyRWhNUWN1SlVtZApHUEx1OHl0eGpMVzZPUWRKZC96dkxwS1FCWTB0TDNkNzcwTy9OYnVhMlBsenB5enkwRmZ1S0U0bVg0K1FhQWt2dVBqY0J1a3VtajVSCnA5RWl4QXFuT0Voc3Mvbi9mYXVHVitPNjFvVjRkN3BENmtoLzl0aStJMjBldjlFMmJGaGM4ZTZrR1ZRYTlRUFNkdWJoakwwOHM5TkkKUytMSStIK1NxSFpHbkVKbFBxUWV3UWNEV2tZdHVKZnp0OVd5VlNIdnV0eE1BSmY3RkpVbk03L29RMGRHMGdpWkZtQTdtbjdTNXUwNAo2dXdCSGp4SVZra0p4MHczQUo2SURzQno0VzltNlhKSE1ENFE1UXNEeVpwQ0FHekZsSDVoeElyZmY0SWFDMW5FV1RKM3M3eGdhVlk1Ci9iUUdleXpXWkRiWnZVanRoQjkrcFNLUEtyaEM5SUszMUZPUWVFNHRHdjJCYjBUWE93RjBsa0xnQU9JdWErckY3bktzdTcvKzZxcW8KK056MnNubUt0bWNDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkozQVo2WU1JdGttOVVXcnBtVlNFU2ZZUmF4ak1BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJEQVVBQTRJQ0FRQ3pWMDBRWWs0NjVLenF1Qnl2Ck1pUElzMGxhVVp4MktJMTVxbGRHRjlYMVV2YTNST2dJUkw4WWhOSUxnTTNGRXYwQVZRVmhoMEhjdFNTZVBNVFl5UHR3bmk5NGxvTWcKTnQ1OEQya1RpS1YxTnBnSXBzYmZyTTdqV05hM1B0NjY4K3MwUU5paWdmVjRQeS9WcGZ6Wm90UmVCQTRYcmY1QjhPV3ljdnBFZ2pOQwo2QzFZOTFhTVlqKzZRckNjREZ4K0xtVW1YRk5QQUxKNGZxRU5tUzJOdUIyT29zU3cvV0RRTUtTT3lBUmlxY1R0TmQ1NmwrME9PRjZTCkw1TndwYW1jYjZkOUV4MSt4Z2hJc1Y1bjYxRUlKZW5tSld0U0taR2Mwamx6Q0ZmZW1RYTBXNTBRQnVIQ0FLaTRIRW9DQ2hUUXdVSEsKKzR3MUlYMkNPUEtwVkpFWk5aT1ViV282eGJMUXU0bUdrK2lieVE4NnAzcTRvZkI0UnZyOE55L2xpb1R6My80RTJhRm9vQzhrNGdtVgpCdFdWeXVFa2x1dDg5cE1GdSsxejZTM1JkVG5YNXlUYjJFNWZRNCtlMEJRNXYxVndTSmxYTWJTYzdrcVlBNVl3SDJBRzdoc2ovb0ZnCkl4cEhZb1dsekJrMGdHK3pyQnJqbi9CN1NLM1ZBZGxudHFseWsrb3Racld5dU9ROVBMTHZUSXpxNndlL3F6V2FWWWE4R0thMXFGNjAKZzJ4cmFVRFRuOXp4dzJscnVlRnRDZlR4cWxCMkNucDllaGVoVlpaQ21URUozV0FSalFVd2Z1YU9SdEdkRk5ySEYrUUZsb3pFSkxVYgp6eFFIc2tENG81NUJocndFMEd1V3lDcUFOUDIvN3dhajNWakZoVDArai82ZUtlQzJ1QWxvR1J3WVF3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUIvakNDQVlXZ0F3SUJBZ0lJZEpjbGlzYy9lbFF3Q2dZSUtvWkl6ajBFQXdNd1JURUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlYKQkFvTUMwRm1abWx5YlZSeWRYTjBNU0F3SGdZRFZRUUREQmRCWm1acGNtMVVjblZ6ZENCUWNtVnRhWFZ0SUVWRFF6QWVGdzB4TURBeApNamt4TkRJd01qUmFGdzAwTURFeU16RXhOREl3TWpSYU1FVXhDekFKQmdOVkJBWVRBbFZUTVJRd0VnWURWUVFLREF0QlptWnBjbTFVCmNuVnpkREVnTUI0R0ExVUVBd3dYUVdabWFYSnRWSEoxYzNRZ1VISmxiV2wxYlNCRlEwTXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUEKSWdOaUFBUU5NRjRiRlowRDBLRjVOYmM2UEpKNnloVWN6V0x6bkNaY0J6M2xWUHFqMXN3UzZ2UVVYK2lPR2Fzdkxram1yQmhEZUt6UQpOOE85c3MwczVrZmlHdVpqdUQwdUwzakVUOXYwRDZSb1RGVnlhNVVkVGhoQ2xYak1OenlSNHB0bEt5bWpRakJBTUIwR0ExVWREZ1FXCkJCU2FyeWw2d0JFMU5TWlJNQUREYXY1QTFhN1dQREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQUsKQmdncWhrak9QUVFEQXdObkFEQmtBakFYQ2ZPSGlGQmFyOGpBUXI5SFgvVnNhb2JneENkMDVEaFQxd1YvR3pUanhpK3p5Z2s4TjUzWAo1N2hHOGYyaDRuRUNNRUpaaDBQVVVkKzYwd2t5V3M2SWZsYzluRjlDYS9VSExiWHdncFA1V1crdVpQcFk1WXNlNDJPK3RZSE5id0tNCmVRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdXpDQ0FxT2dBd0lCQWdJREJFVEFNQTBHQ1NxR1NJYjNEUUVCQlFVQU1INHhDekFKQmdOVkJBWVRBbEJNTVNJd0lBWURWUVFLCkV4bFZibWw2WlhSdklGUmxZMmh1YjJ4dloybGxjeUJUTGtFdU1TY3dKUVlEVlFRTEV4NURaWEowZFcwZ1EyVnlkR2xtYVdOaGRHbHYKYmlCQmRYUm9iM0pwZEhreElqQWdCZ05WQkFNVEdVTmxjblIxYlNCVWNuVnpkR1ZrSUU1bGRIZHZjbXNnUTBFd0hoY05NRGd4TURJeQpNVEl3TnpNM1doY05Namt4TWpNeE1USXdOek0zV2pCK01Rc3dDUVlEVlFRR0V3SlFUREVpTUNBR0ExVUVDaE1aVlc1cGVtVjBieUJVClpXTm9ibTlzYjJkcFpYTWdVeTVCTGpFbk1DVUdBMVVFQ3hNZVEyVnlkSFZ0SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKTVNJd0lBWURWUVFERXhsRFpYSjBkVzBnVkhKMWMzUmxaQ0JPWlhSM2IzSnJJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQwpBUThBTUlJQkNnS0NBUUVBNC90OW8zSzZ3dkRKRklmMWF3Rk80VzVBQjdwdEoxMS85MXN0czFySFVWK3JwREttWVllMmJnK0cwakFDCmwvalhhVmVoR0RsZGFtUjV4Z0ZackR3eFNqaDgwZ1RTU3lqb0lGODdCNkxNVFhQYjg2NVB4MWJWV3FlV2lmcnpxMmpVSTRaWko4OEoKSjd5c2JuS0RIREJ5MytDaTZkTGhkSFVadlNxZWV4VlVCQnZYUXptdFZTakY0aHE3OU1Ea3JqaEpNOHgyaFo4NVJkS2tudklTakZINApmT1F0Zi9Xc1grc1duN0V0MGJyTWtVSjNUQ1hKa0RodjIvRE0rNDRlbDFrKzFXQk81Z1VvN1VsNUUwdTZTTnN2K1hMVE9jcitIOWcwCmN2VzBRTTh4QWNQczNoRXRGMTBmdUZEUlhobW5hZDRITXlqS1VKWDVwMVRMVklaUVJhbjVTUUlEQVFBQm8wSXdRREFQQmdOVkhSTUIKQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRSWRzM0xCLzhrOXNYTjdidVF2T0tFTjBaMTl6QU9CZ05WSFE4QkFmOEVCQU1DQVFZdwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBS2FvclNMT0FUMm1vLzlpMEVpZGkxNXlzSGhFNDl3Y3J3bjlJMGo2dlNyRXVWVUV0UkNqCmpTZmVDNEpqME83ZUREZDVRVnNpc3JDYVFWeW1jT0RVMEhmTEk5TUE0R3hXTCtGcERRM1pxcjhoZ1ZEWkJxV28vNVUzMEtyKzRyUDEKbVMxRmhJcmxRZ25YZEFJdjk0blltZW04SjlSSGpib05SaHgzenhTa0hMbWtNY1NjS0hRRE5QOHpHU2FsNlExMHR6Nlh4bmJvSjVhagpadDNocnZKQlc4cVlWb056Y09TR0d0SXhRYm92dmkwVFduWnZUdWhPZ1E0L1d3TWlvQksrWmxnUlNzc0R4TFFxS2kyV0YrQTVWTHhJCjAzWW5uWm90QnFiSjdEblNxOXVmbWdzbkFqVXBzVUNWNS9ub25GV0lHVWJXdHpUMWZzNDVtdGs0OFZIM1R5dz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGV6Q0NBbU9nQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQmZNUXN3Q1FZRFZRUUdFd0pVVnpFU01CQUdBMVVFQ2d3SgpWRUZKVjBGT0xVTkJNUkF3RGdZRFZRUUxEQWRTYjI5MElFTkJNU293S0FZRFZRUUREQ0ZVVjBOQklGSnZiM1FnUTJWeWRHbG1hV05oCmRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EZ3dPREk0TURjeU5ETXpXaGNOTXpBeE1qTXhNVFUxT1RVNVdqQmZNUXN3Q1FZRFZRUUcKRXdKVVZ6RVNNQkFHQTFVRUNnd0pWRUZKVjBGT0xVTkJNUkF3RGdZRFZRUUxEQWRTYjI5MElFTkJNU293S0FZRFZRUUREQ0ZVVjBOQgpJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUN3Zm5LNHBBT1U1cWZlQ1RpUlNoRkFoNmQ4V1dRVWU3VVJFTjMrdjlYQXUxYmloU1gwTlhJUCtGUFFRZUZFQWNLMEhNTXgKUWhaSGhUTWlkcklLYncvbEpWQlBoWWErdjVndUVHY2V2aEVGaGdXUXhGblFmSGdRc0lCY3QrSEhLM1hMZkordXRkR2RJemRqcDl4QwpvaTJTQkJ0UXdYdTRQaHZKVmdTTEwxS2JyYWxXNmNIL3JhbFloekMyZ2ZlWFJmd1pWenNyYitSSDlKbEYvaDN4K0plamlCMDNIRnlQCjRIWWxtbEQ0b0ZUL1JKQjJJOUl5eHNPckJyLzgrNy96clgyU1lnSmJLZE0xbzVPYVEyUmdYYkw2TXY4N0JLOU5RR3I1eCtQdkkvMXIKeStVUGl6Z043Z3I4L2crWW56QXgzV3hTWmZtTGdiNGk0UnhZQTdxUkc0a0hBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQgpCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJxT0ZzbWpkNkxXdkpQZWxTREdSampDRFdtdWpBTkJna3Foa2lHCjl3MEJBUVVGQUFPQ0FRRUFQTlYzUGRyZmlicUhEQWhVYWlCUWtyNndRVDI1Sm1TRENpL29RTUNYS0NlQ01FckprLzlxNTZZQWY0bEMKbXRZUjVWUE9MOHp5MmdYRS91SlF4RHFHZmN6YWZoQUpPNUkxS2xPeS91c3JCZGxzWGViUTc5TnFacDRWS0lWNjZJSUFyQjZuQ1dsVwpRdE5vVVJpK1ZKcS9SRUc2U2I0Z3VtbGM3cmgzemM1c0g2MkRsaGg5RHJVVU9ZVHhLT2t0bzU1N0hucHlXb096ZVcvdnRQelFDcVZZClQwYmYrMjE1V2ZLRUlsS3VEOHo3ZkR2bmFzcEhZY042K05PU0JCKzRJSVRoTmxRV3gwRGVPNHB6M04vR0NVemY3TnIvMUZOQ29jbnkKWWgwaWd6eVh4ZmtaWWllc1pTTFgwenpHNVk2eVU4eEp6cnd3L25zT001RDc3ZElVa1I4SHJ3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQmRNUXN3Q1FZRFZRUUdFd0pLVURFbE1DTUdBMVVFQ2hNYwpVMFZEVDAwZ1ZISjFjM1FnVTNsemRHVnRjeUJEVHk0c1RGUkVMakVuTUNVR0ExVUVDeE1lVTJWamRYSnBkSGtnUTI5dGJYVnVhV05oCmRHbHZiaUJTYjI5MFEwRXlNQjRYRFRBNU1EVXlPVEExTURBek9Wb1hEVEk1TURVeU9UQTFNREF6T1Zvd1hURUxNQWtHQTFVRUJoTUMKU2xBeEpUQWpCZ05WQkFvVEhGTkZRMDlOSUZSeWRYTjBJRk41YzNSbGJYTWdRMDh1TEV4VVJDNHhKekFsQmdOVkJBc1RIbE5sWTNWeQphWFI1SUVOdmJXMTFibWxqWVhScGIyNGdVbTl2ZEVOQk1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCkFOQVZPVkt4VXJPNnhWbUN4RjFTcmpwRFpZQkx4L0tXdk5zMmw5YW1aSXlvWHZEakNoejMzNWM5UzY3Mlhld2h0VUdyemJsK2RwKysKK1Q0Mk5LQTd3Zll4RVVWMGt6MVhnTVg1aVpuSzVhdHExTFhhUVpBUXdkYldRb25Ddi9RNEVwVk1WQVgzTnVSRmczc1VaZGJjREUzUgozbjRNcXp2RUZiNDZWcVphYjNacFVxbDZ1Y2pyYXBwZFV0QXRDbXMxRmdrUWhOQnF5am9HQURkSDVINVhUeitMNjJlNGlLckZ2bE5WCnNwSEVmYm13aFJrR2VDN2JZUnI2aGZWS2thSG5GdFdPb2puZmxMaHdIeWcvaS94QVhtT0RQSU1xR3Bscno5NVphanY4YnhiWEgvMUsKRU90T2doWTZyQ2NNVS9HdDFTU3dhd05Rd1MwOEZ0MUVOQ2NhZGZzQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZBcUZxWGRsQlpoOApRSUg0RDVjc09QRUs3RHpQTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCCkN3VUFBNElCQVFCTU9xTkVyTGxGc2NlVGZzZ0xDa0xmWk9vYzdsbHNDTHFKWDJyS1NwV2VlbzhIeGRwRmNvSnhEanJTekcrbnRLRWoKdS9Za244c1gvb3ltenNMUzI4eU4vSEg4QXluQmJGMHpYMlMyWlR1SmJ4aDJlUFhjb2tnZkdUK09rK3Z4K2hmdXpVN2pCQkpWMXVYawozZnMrQlh6aUhWN0dwN3lYVDJnNjlla3VDa08ycjFkY1ltaDh0LzJqaW9TZ3JHSytLd21ITlBCcUFidWJLVlk4L2dBM3p5TnM4VTZxCnRuUkdFbXlSN2pUVjdKcVI1MFMra0RGeTFVa0M5Z0xsOUIvcmZObVdWYW4vN0lyNW1VZi9OVm9DcWdUTGlsdUhjU21SdmFTMGVnMjkKbXZWWEl3QUhJUmMvU2puUkJVa0xwN1kzZ2FWZGpLb3pYb0VvZktkOUorc0FybzAzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFjdGFsaXMgQXV0aGVudGljYXRpb24gUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1ekNDQTZPZ0F3SUJBZ0lJVndvUmwwTEU0OHd3RFFZSktvWklodmNOQVFFTEJRQXdhekVMTUFrR0ExVUVCaE1DU1ZReERqQU0KQmdOVkJBY01CVTFwYkdGdU1TTXdJUVlEVlFRS0RCcEJZM1JoYkdseklGTXVjQzVCTGk4d016TTFPRFV5TURrMk56RW5NQ1VHQTFVRQpBd3dlUVdOMFlXeHBjeUJCZFhSb1pXNTBhV05oZEdsdmJpQlNiMjkwSUVOQk1CNFhEVEV4TURreU1qRXhNakl3TWxvWERUTXdNRGt5Ck1qRXhNakl3TWxvd2F6RUxNQWtHQTFVRUJoTUNTVlF4RGpBTUJnTlZCQWNNQlUxcGJHRnVNU013SVFZRFZRUUtEQnBCWTNSaGJHbHoKSUZNdWNDNUJMaTh3TXpNMU9EVXlNRGsyTnpFbk1DVUdBMVVFQXd3ZVFXTjBZV3hwY3lCQmRYUm9aVzUwYVdOaGRHbHZiaUJTYjI5MApJRU5CTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFwOGJFcFNta0xPL2xHTVd3VUtOdlVUdWZDbHJKCndrZzRDc0ljb0JoL2tiV0h1VUEvM1Ixb0h3aUQxUzBlaUtENGoxYVBiWmtDa3BBVzFWOEliSW5YNGF5OElNS3g0SU5SaW1sTkFKWmEKYnkvQVJINmpEdVNSelZqdTNQdkhIa1ZIM1NlNUNBR2ZwaUVkOVVFdEwwejlLSzNnaXEwaXRGWmxqb1pVajVOREtkNDVSbmlqTUNPNgp6ZkI5RTFmQVhkS0RhMGhNeEt1ZmdGcGJPcjNKcHlJL2dDY3pXdzYzaWd4ZEJ6Y0l5MnpTZWtjaVJEWEZ6TXd1anQwcTdiZDlaZzFmCllWRWlWUnZqUnVQalBkQTFZcHJicnhUSVc2SE1pUnZoTUNiOG9Kc2ZnYWRISHdUcm96bVNCcCtaMDcvVDZrOVFuQm4rbG9jZVBHWDIKb3hna2c0WVE1MVErcURwMkpFK0JJY1hqRHdMNGs1UkhJTHYrMUE3VGFMbmR4SHFFZ3VOVFZIbmQyNXpTOGdlYkxyYThQdTJGYmU4bApFZktYR2tKaDkwcVg2SXV4RUFmNlpZR3lvam5QOXp6L0dQdkc4VnFMV2VJQ3JIdVMwRTRVVDFsRjlneGVLRit3NkQ5Rno4K3ZtMi83CmhOTjNXcFZ2ckpTRW51Njh3RXFQU3BQNFJDSGlNVVZoVUU0UTJPTTFmRXdadE40RnY2TUduOGkxemVRZjF4Y0dEWHFWZEZVTmFCcjgKRUJ0aVpKMXQ0SldndzVRSFZ3MFU1cjBGKzdpZjV0K0w0c2JuZnBiMlU4V0FORkFvV1BBU1VIRVhNTHJtZUdPODlMS3RteXV5L3VFNQpqRjY2Q3lDVTNudUR1UC9qVm8yM0VlazdqUEt4d1YyZHBBdE1LOW15R1BXMW4wc0NBd0VBQWFOak1HRXdIUVlEVlIwT0JCWUVGRkxZCmlEckluM2htN1luemV6aHdsTWtDQWpiUU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVVdGlJT3NpZmVHYnQKaWZON09IQ1V5UUlDTnRBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBTGUzS0h3R0NtU1V5SQpXT1lkaVBjVVpFaW0yRmdLRGs4VE5kODFIZFR0QmpISWdUNXExZDA3R2pMdWtEMFIwaTcwanNOakxpTm1zR2UrYjdiQUV6bGdxcUkwCkpaTjFVdDZubmEwT2g0bFNjV29XUEJrZGcvaWFLV1crOUQrYTJmRHpXb2NoY1lCTnkrQTRteis3K3VBd1RjK0cwMlVRR1JqUmx3S3gKSzNKQ2FLeWd2VTVhMmhpL2E1aUIwUDJhdmw0VlNNMFJGYm5BS1Z5MDZJajNQamF1dDJMOUhtTGVjSGdRSEVoYjJyeWtPTHBuN1ZVKwpYbGZmMUFOQVRJR2swazlqcHdsQ0NSVDhBS25DZ0hOUExzQkEyUkY3U09wNkFzRFQ2eWdCSmxoMHdjQnpJbTJUbGYwNWZic3E0L2FDCjR5eVhYMDRma1pUNi9peWoySFlhdUUyeU9FK2IraDFJWUhrbTR2UDlxZENhNkhDUFNYclc1YjBLRHRzdDg0Mi82K09rZmN2SGxYSG8KMnFOOHhjTDRkSklFRzRhc3BDSlRRTGFzL2t4MnovdVVNc0ExbjNZL2J1V1FicUNtSnFLNExMN1JLNFg5cDJqSXVnRXJzV3gwSGJoegpsZWZ1dDhjbDhBQk1BTEordGd1TEhQUEFVSjRsdWVBSTNqWm0vemVsMGJ0VVpDekpKN1ZMa241bC85TXQ0YmxPdkgra1FTR1FRWGVtCk9SL3FudU9mMEdadkJleXFkbjYvYXhhZzY3WEgvSkpVTHlzUkp5VTNlRXhSYXJEenpGaGRGUEZxU0JYL3dnZTJzWTBQamx4UVJyTTkKdndHWVQ3SlpWRWMrTkh0NGJWYVRMblBxWmloNHpSMFV2NkNQTHk2NExvN3lGSXJNNmJWOCsyeWRES1hobGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpCdXlwYXNzIENsYXNzIDIgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldUQ0NBMEdnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFzRkFEQk9NUXN3Q1FZRFZRUUdFd0pPVHpFZE1Cc0dBMVVFQ2d3VQpRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SURBZUJnTlZCQU1NRjBKMWVYQmhjM01nUTJ4aGMzTWdNaUJTYjI5MElFTkJNQjRYCkRURXdNVEF5TmpBNE16Z3dNMW9YRFRRd01UQXlOakE0TXpnd00xb3dUakVMTUFrR0ExVUVCaE1DVGs4eEhUQWJCZ05WQkFvTUZFSjEKZVhCaGMzTWdRVk10T1Rnek1UWXpNekkzTVNBd0hnWURWUVFEREJkQ2RYbHdZWE56SUVOc1lYTnpJRElnVW05dmRDQkRRVENDQWlJdwpEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTmZIWHZmQkI5UjMrME1oOVBUMWFlVHVNZ0hibzRZZjVGa051dWQxCmcxTHI2aHhoRlVpN0hRZktqSzZ3M0phZDZzTmdrb2FDS0hPY1ZnYi9TMlR3RENvM1NiWGx6d3g4N3ZGS3UzTXdaZlBWTDRPMmZ1UG4KOVo2cllQblQ4WjJTZElya0hKYXNXNERwdGZReGg2TlIvTWQrb1crT1UzZlVsOEZWTTVJK0dDOTExSzJHU2N1VnIxUUdiTmdHRTQxYgovK0VtR1ZuQUpMcUJjWG1RUkZCb0pKUmZ1TE1SOFNsQllhTkJ5eU0yMWNIeE1sQVFUbi8waHBQc2hOT092RXUvWEFGT0J6M2NGSXFVCkNxVHFjL3NMVWVnVEJ4ajZEdkVyMFZRVmZUemg5N1FaUW1kaVhuZmdvbFhzdHRscEY5VTZyMFR0U3NXZTVIb25mT1YxMTZyTEplZmYKYXdyYkQwMlRUcWlnelhzdThsa0JhcmNOdUFlQmZvczRHemptQ2xlWlBlNGg2S1AxREJiZGkrdzBqcHdxSEFBVkY0MW9nOUp3bnhnSQp6UkZvMWNsclVzM0VSby9jdGZQWVYzTWU2WlE1QkwvVDNqamV0RlBzYVJ5aWZzU1A1QnR3cmZLaStmdjNGbVJtYVo5SlVhTGlGUmhuCkJrcC8xV3kxVGJNejRHSHJYYjdwbUE4eTF4MUxQQzVhQVZLUkNmTGY2bzNZQmtCanFoSGsvc00zbmhSU1AvVGl6UEpoazlIOVoydlgKVXE2L2FLdEFRNkJYTlZONDhGUDRZVUlIWk1iWGI1dE1PQTFqckdLdk5vdWljd29OOVNHOWRLcE42bklEU2R2SFh4MWlZOGY5M1pIcwpNKzcxYmJSdU1HamV5Tlltc0hWZWU3UUhJSmloZGpLNFRXeFBBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEClZSME9CQllFRk1tQWQrQmlrb0wxUnB6enV2ZE13OTY0bzYwNU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0YKQUFPQ0FnRUFVMThoOWJxd09sSTVMSkt3YkFESjc4NGc3d2J5bHA3cHBIUi9laGI4dC9XMit4VWJQNnVtd0hKZEVMRng3cnhQNDYycwpBMjB1Y1M2dnhPT3RvNzBNRWFlMC8wcXlleEFRSDZkWFFiTEFydlFzV2RaSEVJanpJVkVwTU1wZ2hxOUdxeDN0T2x1d2xONUU0MEVJCm9zSHNIZGI5VDdiV1I5QVVDOHJteXJWN2QzNUJIMTZEeDdhTU9aYXdQNWFCUVc5Z2tPTG8rZnNpY2RsOXN6MUd2N1NFcjVBY0Q0OFMKYXEvdjdoNTZyZ0pLaWhjcmR2NnNWSWtrTEU4L3RyS25Ub3lva1pmN0tjWjdYQzI1eTJhMnQ2aGJFbEdGdFFsK1luaHcvcWxxWUxZZApEbmtNL2NycUpJQnl3NWMvOG5lclF5SUt4K3UyRElTQ0xJQnJRWW9Jd091bGE5K1pFc3VLMVY2QURKSGdKZ2cyU01YNk9CRTEveVdECkxmSjZ2OXI5anY2bHkwVXNIOFNJVTY1M0R0bWFkc1dPTEIyanV0WHNNcTdBcXF6MzBYcE42OVFINGtqM0lvNndwSjlxem82eXNtRDAKb3lMUUkrdVVXbnBwM1ErL1FGZXNhMWxRMmFPWjRXNytqUUY1SnlNVjNwS2Rld2xOV3VkTFNEQmFHT1lLYmVhUDROSzc1dDk4YmlHQwp3V2c1VGJTWVdHWml6RXFRWHNQNkp3U3hlUlYwbWN5K3JTRGVKbUFjNjFaUnBxUHE1S00vcC85aDNQRmFUV3d5STBQdXJLanU3a29TCkNUeGRjY0srZWZyQ2gyZ2RDLzFjYWN3RzBKcDlWSmtxeVRrYUdhOUxLa1B6WTExYVdPSXY0eDNrcWRiUUN0Q2V2OWVCQ2ZISnh5WU4KckpnV1ZxQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXVENDQTBHZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJPTVFzd0NRWURWUVFHRXdKT1R6RWRNQnNHQTFVRUNnd1UKUW5WNWNHRnpjeUJCVXkwNU9ETXhOak16TWpjeElEQWVCZ05WQkFNTUYwSjFlWEJoYzNNZ1EyeGhjM01nTXlCU2IyOTBJRU5CTUI0WApEVEV3TVRBeU5qQTRNamcxT0ZvWERUUXdNVEF5TmpBNE1qZzFPRm93VGpFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxCmVYQmhjM01nUVZNdE9UZ3pNVFl6TXpJM01TQXdIZ1lEVlFRRERCZENkWGx3WVhOeklFTnNZWE56SURNZ1VtOXZkQ0JEUVRDQ0FpSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUtYYUNwVVdVT09WOGw2ZGRqRUdNbnFiOFJCMnVBQ2F0VkkyelNSSApzSjhZWkx5YTl2clZlZGlRWWt3aUw5NDRQZGJncU9rY0xOdDRFZW1PYUZFVmNzZnpNNGZrb0YwTFhPQlhCeW93OWMzRU4zY29UUmlSCjVyL1ZVdjF4TFhBKzU4YkVpdVB3S0F2MGRwaWhpNGRWc2pvVC9MYytKemVPSXVPb1R5cnZZTHM5dHpuRERnRkhtVjBTVDl0RCtsZWgKN2ZtZHZoRkhKbHNUbUt0ZEZvcXdOeHhYblVYL2lKWTJ2N3ZLQjN0dmgyUFgwREpxMWwxc0RQR3piam5pYXpFdU9RQW5GTjQ0d093Wgpab1lTNkoxeUZoTmtVc2VwTnh6OWdqRHRoQmdkOUs1Yy8zQVRBT3V4OVRONlM5WlYrQVdOUzJtdzliTW9ObHdVeEZGelRXc0w4VFFICjJ4YzUxOXdvZTJ2MW4vTXV3VThYS2hEenpNcm82LzFycXk2YW55MkNiZ1RVVWdHVExUMkcvSDc4Mys5Q0hhWnI3N2tneHZlOW9LZVYKL2FmbWlTVFl6SXcwYk9Jakw5a1NHaUc1VlpGdkM1RjVHUXl0UUlnTGNPSjYwZzdZYUVpN2doTTVFRmpwMkNvSHhoTGJXTnZTTzFVUQpSd1VWWjJKK0dHT21SajhKRGxReVhyOE5Zbm9uNzREbzI5bExCbG8zV2lYUUNCSjMxRzhKVUpjOXlCM0QzNHhGTUZiRzAyU3JadlBBClhwYWN3OFR2dzN4cml6cDVmN05KenozaWlaK2dNRXVGdVp5VUpIbVBmV3VwUldnUEs5RHgyaHpMYWJqS1NXSnR5TkJqWXQxZ0QxaXEKajZHOEJhVm1vczhiZHJLRVpMRk1PVkxBTUxyd2pFc0NzTGEzQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRApWUjBPQkJZRUZFZTR6Zi9sYis3NHN1d3ZUZzc1SmJDT1BHdkRNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBZ0VBQUNBalFUVUVrTUpBWW1EdjRqVk0xeitzNGpTUXVLRnZkdm9XRnFSSU55enBrTUx5UFBnS245aUI1YnRiMmlVc3BLZFYKY1NReTlzZ0w4cnhxK0pPc3NnZkNYNS9iek1pS3FyNXFiK0ZKRU13eDE0Qzd1OGpZb2c1a1YrcWk5Y0twTVJYU0lHcnMvQ0lCS00rRwp1SUFlcWN3UnBUenlGck5IbmZ6U2dDSEV5OUJIY0VHaHlvTVpDQ3h0OGwxM25Jb1VFOVEySEpMdzVRWTMzS2Jta0pzNGoxeHJHMGFHClEwSmZQZ0VIVTFSZFpYMzNpbk9obWxSYUh5bERGQ2ZDaFErMWlIc2FPNVMzSFdDbnRaem5LV2xYV3B1VGVrTXdHd1BYWXNoQXBxcjgKWk9SSzE1RlRBYWdnaUc2Y1gwUzV5MkNCTk94djAzM2FTRi9ydEpDOExha2NDNndjMWFKb0lJQUUxdnl4ankrN1NqRU5Tb1ljNitJMgpLU2IxMnRqRThuVmh6MzZ1ZG1OS2VrQmxrNGY0SG9DTWh1V0cxbzhPL0ZNc1lPZ1dZUnFpUGtON3pUbGdWR3IxOG9rbUFXaURTS0l6CjZNa0VrYklSTkJFKzZ0QkRHUjhEazVBTS8xRTlWL1JCYnVITG9MN3J5V1BOYmN6aytEYXFhSjN0dlYyWGNFUU50ZzQxM09FTVhidWcKVVpUTGZoYnJFUytqa2tYSVRISFp2TW1aVWxkR0wxRFB2VFZwOUQwVnpnYWxMQTgrOW9HNmxMdkR1NzlsZU5LR2VmOUpPeHFERFBEZQplT3pJOGsxTUd0NkNLZmpCV3RydDd1WW5YdWhGMEowY1VhaG9xMFRqMEl0cTQvZzd1OXhOMTJUeVViN21xcXRhNlRIdUJyeHp2eE5pCkNwL0h1WmM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHd6Q0NBcXVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTQpJbFF0VTNsemRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVCmNuVnpkQ0JEWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJRE13SGhjTk1EZ3gKTURBeE1UQXlPVFUyV2hjTk16TXhNREF4TWpNMU9UVTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb01JbFF0VTNsegpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEClpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURNd2dnRWlNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDOWRaUHdZaUp2Sks3Z2VuYXNmYjNaSk5XNHQvek44RUxnNjNpSVZsNmJtbFFkVFF5Swo5dFBQY1BSU3RkaVRCT05HaG5GQlNpdndLaXhWQTlaSXcrQTVPTzN5WER3L1JMeVRQV0dyVHMwTnZ2QWdKMWdPUkg4RUdvZWwxNVlVCk5wRFFTWHVoZGZzYWEzT3grTTZwQ1N6eVU5WERGRVM0aHFYMml5czUycU16Vk5uNmNocjNJaFVjaUpGcmYyYmx3MnFBc0NUejM0WkYKaVAwWmYzV0hIeCt4R3dwekpGdTVaZUFzVk1oZzAyWVhQK0hNVkROemtRSTZwbjk3ZGptaUg1YTJPSzYxeUpOMEhaNjV0T1ZnblM5VwowZURyWGx0TUVuQU1iRVFncXhIWTlCbjIwcHhTTitmNnRzSXhPMHJVRkptdHh4cjFYVi82QjdoOERSL1dneDZ6QWdNQkFBR2pRakJBCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJTMUEvZDJPMkdDYWhLcUdGUHIKQXlHVXYvN095akFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBVmozdmxOVzkybk95V0w2dWtLMllKNWYrQWJHd1VnQzRUZVFiSVhRYgpmc0R1WG1rcUphOWMxaDNhMG5uSjg1Y3A0SWFIM2dSWkQvRloxR1NGUzVtdkpRUWV5VWFwbDk2Q3NodHduNXoycjNFeDNYc0ZwU3pUCnVjcEg5c3J5OXVldHVVZy92QmEzd1czMDZnbXY3UE8xNXdXZXBoNktVMUhXazRITWRKUDJ1ZHFtSlFWMGVWcCtRRDZDU3lZUk1HN2gKUDBISFJ3QTExZlhUOTFRK2dUM2FTV3Fhcys4UVBlYnJiOUhJSWtmTHpNOEJNWkxaR09NaXZna2VHajVhc3VSckRGUjZmVU5PdUltbAplOWVpUFphR3pQSW1OQzFxa3AyYUd0QXc0bDFPQkxCZml5QitkOEU5bFlMUlJwbzdQSGk0YjZIUURXU2llQjRwVHBQRHBGUVVXdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNekNDQXh1Z0F3SUJBZ0lEQ1lQek1BMEdDU3FHU0liM0RRRUJDd1VBTUUweEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUsKREF4RUxWUnlkWE4wSUVkdFlrZ3hKekFsQmdOVkJBTU1Ia1F0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdNakF3T1RBZQpGdzB3T1RFeE1EVXdPRE0xTlRoYUZ3MHlPVEV4TURVd09ETTFOVGhhTUUweEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUtEQXhFCkxWUnlkWE4wSUVkdFlrZ3hKekFsQmdOVkJBTU1Ia1F0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdNakF3T1RDQ0FTSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5PeVNzOTZSKzkxbXlQNk9pL1dVRVdKTlRyR2E5disyd0JvcU9BRApFUjAzVUFpZlRVcG9sRFd6VTlHVVk2Y2dWcS9lVVhqc0tqM3pTRWhRUGdyZlJsV0xKMjNERUUwTmtWSkQySWZnWFU0MnRTSEtYemxBCkJGOWJmc3lqeGl1cFFCN1pOb1RXU1BPU0hqUkdJQ1RCcEZHT1NocnZVRDlwWFJsL1JjUEhBWTlSeVNQb2NxNjB2RllKZnhMTEhMR3YKS1pBS3lWWE1EOU8wR3UxSE5WcEs3Wnh6QkNIUXFyME1FN1VBeWlac3hHc01sRnFWbE5wUW12SC9wU3RtTWFUSk9LRGZIUis0Q1M3egpwK2huVXF1VkgrQkdQdGlrdzhwYXhUR0E2RWlhbjVScC9obmQySE44Z2NxVzNvN3RzeklGWllRMDV1YjlWeEMxWDNhL0w3QVFEY1VDCkF3RUFBYU9DQVJvd2dnRVdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGUDNhRk1TZk1ONGh2UjVDT2Z5cll5TkoKNFBHRU1BNEdBMVVkRHdFQi93UUVBd0lCQmpDQjB3WURWUjBmQklITE1JSElNSUdBb0g2Z2ZJWjZiR1JoY0RvdkwyUnBjbVZqZEc5eQplUzVrTFhSeWRYTjBMbTVsZEM5RFRqMUVMVlJTVlZOVUpUSXdVbTl2ZENVeU1FTnNZWE56SlRJd015VXlNRU5CSlRJd01pVXlNREl3Ck1Ea3NUejFFTFZSeWRYTjBKVEl3UjIxaVNDeERQVVJGUDJObGNuUnBabWxqWVhSbGNtVjJiMk5oZEdsdmJteHBjM1F3UTZCQm9EK0cKUFdoMGRIQTZMeTkzZDNjdVpDMTBjblZ6ZEM1dVpYUXZZM0pzTDJRdGRISjFjM1JmY205dmRGOWpiR0Z6YzE4elgyTmhYekpmTWpBdwpPUzVqY213d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFIK1gyekRJMzZTY2ZTRjZnSERPRkJKcGlCU1ZZRVFCckxMcE1FK2JVTUptCjJINk5NTFZ3TWVuaWFjZnpjTnNnRlliUURmQytyQUYxaE01K24wMi90MkE3blBQS0hlSmVhTmlqblpmbFFHRFNOaUgrMExTNEY5cDAKbzMvVTM3Q1lBcXh2YTJzc0pTUnlvV1h1SlZybDVqTG44dCtyU2ZyemtHa2oyd1RaNTF4WS9HWFVsNzdNL0M0S3pDVXFOUVQ0WUpFVgpkVDFCL3lNZkdjaHM2NEpUQktia1RDSk5qWXk2emx0ejdHUlVVRzNSbkZYN2FjTTJ3NHk4UElXbWF3b21EZUNUbUdDdWZzWWtsNHBoClg1R09acElKaHpiTmk1c3RQdlpSMUZEVVdTaTlnL0xNS0h0VGhtM1lKb2h3MStxUnpUNjV5c0NRYmxyR1huUmwxMXorbytJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIEVWIDIwMDkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUXpDQ0F5dWdBd0lCQWdJRENZUDBNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1GQXhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLCkRBeEVMVlJ5ZFhOMElFZHRZa2d4S2pBb0JnTlZCQU1NSVVRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnUlZZZ01qQXcKT1RBZUZ3MHdPVEV4TURVd09EVXdORFphRncweU9URXhNRFV3T0RVd05EWmFNRkF4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRSwpEQXhFTFZSeWRYTjBJRWR0WWtneEtqQW9CZ05WQkFNTUlVUXRWRkpWVTFRZ1VtOXZkQ0JEYkdGemN5QXpJRU5CSURJZ1JWWWdNakF3Ck9UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUpueGhEUnd1aSszTUtDT3ZYd0V6NzVpdkpuOWdwZlMKZWdwbmxqZ0o5aEJPbFNKem1ZM2FGUzNuQmZ3WmN5SzNqcGdBdkR3OXJLRnMrOVo1SlV1dDhNeGsyb2crS2JnUENkTTAzVFAxWXRIaAp6Um5wN2hoUFRGaXU0aDdXREZzVld0ZzZ1TVFZWkI3ak03SzFpWGRPREwvWmxHc1RsMjhTby82WnFRVE1GZXhnYURidENIdTM5YitUCjdXWXhnNHpHY1RTSFRoZnFyNHVSalJ4V1FhNGlOMTQzOGgzWjBTME5MMmxScDc1bXBvbzZLcjNIR3JIaEZQQytPaDI1ejF1eGF2NjAKc1VZZ292c2VPM0R2azVoOWpIT1c4c1h2aFhDdEtTYjhIZ1ErSEtEWUQ4dFNnMko4N290VGxaQ3BWNkxxWVFYWStVM0VKL3B1cmUzNQoxMUgzYTZVQ0F3RUFBYU9DQVNRd2dnRWdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTk9VaWt4aUV5b1pMc3l2CmNvcDlOdGVhSE54bk1BNEdBMVVkRHdFQi93UUVBd0lCQmpDQjNRWURWUjBmQklIVk1JSFNNSUdIb0lHRW9JR0JobjlzWkdGd09pOHYKWkdseVpXTjBiM0o1TG1RdGRISjFjM1F1Ym1WMEwwTk9QVVF0VkZKVlUxUWxNakJTYjI5MEpUSXdRMnhoYzNNbE1qQXpKVEl3UTBFbApNakF5SlRJd1JWWWxNakF5TURBNUxFODlSQzFVY25WemRDVXlNRWR0WWtnc1F6MUVSVDlqWlhKMGFXWnBZMkYwWlhKbGRtOWpZWFJwCmIyNXNhWE4wTUVhZ1JLQkNoa0JvZEhSd09pOHZkM2QzTG1RdGRISjFjM1F1Ym1WMEwyTnliQzlrTFhSeWRYTjBYM0p2YjNSZlkyeGgKYzNOZk0xOWpZVjh5WDJWMlh6SXdNRGt1WTNKc01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQTA3WHRhUEtTVWlPOGFFWFVITDdQKwpQUG9lVVNicmgvWXAzdUR4MU1Za0NlbkJ6MVVidEREWnpocitCbEdtRmFRdDc3Skx2eUFvSlVuUnBqWjNOT2hrMzFLeEVjZHplczA1Cm5zS3RqSEVoOGxwcnI5ODhUbFd2c29SbEZJbTVkOHNxTWI3UG8yM1BiMGlVTWtadjUzR01vS2FFR1RjSDhnTkZDU3VHZFh6ZlgybFgKQU50dTJLWnlJa3RRMUhXWVZ0KzNHUDlEUTFDdWVrUjc4SGxSMTBNOXA5T0IwL0RKVDduYXhwZUcwSUxENUVKdC9yRGlaRTRPSnVkQQpOQ2ExQ0luWENHTmpPQ2QxSGpQcWJxamRuNWxQZEUyQmlZQkwzWnFYS1Z3dnZvRkJ1WXovNm4xZ0JwN04xejNUTHFNVnZLam1KdVZ2Cnc5eTRBeUhxbnhieExGUzEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ0EgRGlzaWcgUm9vdCBSMgo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYVRDQ0ExR2dBd0lCQWdJSkFKSzRpTnV3aXNGak1BMEdDU3FHU0liM0RRRUJDd1VBTUZJeEN6QUpCZ05WQkFZVEFsTkxNUk13CkVRWURWUVFIRXdwQ2NtRjBhWE5zWVhaaE1STXdFUVlEVlFRS0V3cEVhWE5wWnlCaExuTXVNUmt3RndZRFZRUURFeEJEUVNCRWFYTnAKWnlCU2IyOTBJRkl5TUI0WERURXlNRGN4T1RBNU1UVXpNRm9YRFRReU1EY3hPVEE1TVRVek1Gb3dVakVMTUFrR0ExVUVCaE1DVTBzeApFekFSQmdOVkJBY1RDa0p5WVhScGMyeGhkbUV4RXpBUkJnTlZCQW9UQ2tScGMybG5JR0V1Y3k0eEdUQVhCZ05WQkFNVEVFTkJJRVJwCmMybG5JRkp2YjNRZ1VqSXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDaW84UUFDZGFGWFMxdEZQYkMKdzNPZU5jSnhWWDZCKzZ0R1VPREJmRWw0NXF0NVdEemEvM3djbjlpWEFuZythMEVFNlVHOXZnTXNSZll2Wk5TclhhTkhQV1NiNldpYQp4c3diUDdxK3NvczBBaTZZVlJuOGpHK3FYOXBNemswRElhUFkwalNUVnBiTFRBd0FGanhmR3MzSXgyeW1yZE14cDd6bzVlRm0xdEw3CkE3UkJaY2tRcmc0Rlk4YUFhbWt3L2RMdWtPOE5KOStmbFhQMDRTWGFiQmJlUVRnMDZvdjgwZWdFRkdFdFFYNnN4M2RPeTFGVSsxNlMKR0JzRVdtakd5Y1Q2dHhPZ21MY1JLN2ZXVjh4OG5oZlJ5eVgraGs0a0xsWU1lRTJlQVJLbUs2Y0JaVzU4WWgyRWhOL3F3R3UxcFNxVgpnOE5URVF4ekhRdXlScERSUWpyT1FHNlZyZi9HbEsxdWw0U09mVytlaW9BTlNXMXo0bnVTSHNQendmUHJMZ1Z2MlJ2UE4zWUV5TFJhCjVCZW55OTEySDlBWmR1Z3NCYlBXbkRUWWx0eGhoNUVGNUVRSU04SGF1UWhsMUs2eU5nM3J1amk2RE9XYm51dU5adDJaejlhSlFmWUUKa29vcEtXMXJPaHpuZFgwQ2NRN3p3T2U5eXhuZG5XQ3l3bVpndHJFRTdzbm1ocm1hWmtDbzV4SHRnVVVEaS9abldlakJCaEc5M2MrQQpBazlsUUhoY1IxREltK1lmZ1h2a1JLaGJoWnJpM2xyVngvazZSR1pMNURKVWZPUnNuTE1PUFJlaXNqUVMxbjZ5cUVtNzBYb29RTDZpCkZoL2Y1RGNmRVhQN2tBcGxRNklOZlBnR0FWVXpmYkFOdVBUMXJxVkNWM3cyRVl4N1hzUURuWXg1blFJREFRQUJvMEl3UURBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXRabjRyN0NVOWVNZzFncXR6azVXcEM1dQpRdTB3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUNZR1huRG5aVFBJZ203Wm5CYzZHM3Btc2dIMmVEdHBYaS9xLzA3NUtNT1lLbUZNCnRDUVNpbjF0RVJUM25MWEs1cnllSjQ1TUdjaXB2WHJBMXpZT2JZVnlicWpHb20zMituTmpmN3h1ZVFnY25ZcWZHb3BUcHRpNzJUVlYKc1JIRnFRT3pWanU1aEpNaVhuN0I5aEpTaStvc1o3eitOa3oxdU0vUnMwbVNPOU1wRHBrYmx2ZGh1RHZFSzdaNGJMUWpiL0Q5MDdKZQpkUitabGFpczl0cmh4VEY3KzlGR3M5SzhaN1JpVkxvSjkyT3drNkthK2VsU0xvdGdFcXY4OVdCVzd4QmNpOFFhUXR5RFcyUU95N1c4CjFrL0JmRHh1alJOdCszdnJNTkRjVGEvRjFiYWxURnR4eWVneHZ1ZzRCa2loR3VMcTB0NFNPVmdhLzRBT2duWG10OGtIYkE3di96angKbUhIRXQzOE9GZEFsYWIwaW5TdnRCZlpHUjZ6dHdQRFVPK0xzN3BaYmtCTk9IbFk2NjdEdmxydVdJeEc2OGtPR2RHU1Z5Q2gxM3gwMQp1dEkzZ3poVE9EWTd6MnpwK1dzTzBQc0U2RTkzMTJVQmVJWU1lajRoWXZGL1kzRU15WjlFMjZnbm9uVytib0UrMThEckc1Z1BjRncwCnNvck13SVVZNjI1NnMvZGFvUWUvcVVLUzgyQWlsK1FVb1FlYlRuYkFqbjM5cENYSFIrMy9IM09zek1PbDZXOEtqcHRsd2xDRnRhT2cKVXhMTVZZZGg4NEd1RUVaaHZVUWh1TUk5ZE05K0pEWDZIQWNPbXowaXl1OHhMNHlzRXIzdlFDajhLV2Vmc2hOUFppVEVVeG5wSGlrVgo3K1p0c0g4dFovM3piQnQxUnFQbFNoZnBwTmNMCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFDQ1ZSQUlaMQo9PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUgwekNDQmJ1Z0F3SUJBZ0lJWHNPM3BrTi9wT0F3RFFZSktvWklodmNOQVFFRkJRQXdRakVTTUJBR0ExVUVBd3dKUVVORFZsSkIKU1ZveE1SQXdEZ1lEVlFRTERBZFFTMGxCUTBOV01RMHdDd1lEVlFRS0RBUkJRME5XTVFzd0NRWURWUVFHRXdKRlV6QWVGdzB4TVRBMQpNRFV3T1RNM016ZGFGdzB6TURFeU16RXdPVE0zTXpkYU1FSXhFakFRQmdOVkJBTU1DVUZEUTFaU1FVbGFNVEVRTUE0R0ExVUVDd3dIClVFdEpRVU5EVmpFTk1Bc0dBMVVFQ2d3RVFVTkRWakVMTUFrR0ExVUVCaE1DUlZNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUMKRHdBd2dnSUtBb0lDQVFDYnFhdS9ZVXFYcnkrWFpwcDBYOURabHYzUDR1Um03eDhmUnpQQ1JLUGZtdDRmdFZUZEZYeHBOUkZ2dThnTQpqbW9ZSHRpUDJSYThFRWcyWFBCanM1QmFYQ1EzMTZQV3l3bHh1ZkVCY29Td2ZkdE5nTTM4MDIvSitOcTJEb0xTUllXb0cyaW9QZWowClJHeTlvY0xMQTc2TVBoTUFoTjlLU01Eaklncm82VGVuR0V5eENRMGpWbjhFVGRrWGhCaWx5TnBBbEhQcnpnNVhQQU9CT3AwS29WZEQKYWF4WGJYbVFlT1cxdER2WXZFeU5LS0dubzZlNkFrNGwwU3F1N2E0RElyaHJJQTh3S0ZTVmYrRHV6Z3BtbmRGQUxXNGlyNTBhd1FVWgowbS9BOHAvNGU3TUNRdnRRcVIwdGt3OGpxOGJCRDVMLzBLSVY5Vk1KY1J6L1JST0U1aVplK09DSUhBcjhGcmFvY3dhNDhHT0VBcURHCld1em5kTjl3cnFPREplcld4NWVIazZmR2lvb3psMkEzRUQ2WFBtNHBGZGFoRDlHSUxCS2ZiNnFreGtMclFhTGpsVVBUQVlWdGpyczcKOHlNMngvNDc0S0VsQjBpcnlZbDAvd2lQZ0wvQWxtWHo3dXhMYUwyZGlNTXhzMER4Nk0vMk9MdWM1TkYvMU9WWW0zejYxUE1PbTNXUgo1THBTTGhsKzBmWE5XaG44dWdiMisxS29TNWtFM2ZqNXRJdFFvMDVpaWZDSEpQcURRc0dIK3RVdEtTcGFjWHBrYXRjbllHTU4yODVKCjlZMGZrSWt5Ri9oelE3alNXcE9HWWRiaGRRcnFlV1oyaUU5eDZ3UWwxZ3BhZXBQbHVVc1hRQSt4dHJuMTNrL2M0TE9zT3hGd1lJUksKUTI2WklNQXBjUXJBWlFJREFRQUJvNElDeXpDQ0FzY3dmUVlJS3dZQkJRVUhBUUVFY1RCdk1Fd0dDQ3NHQVFVRkJ6QUNoa0JvZEhSdwpPaTh2ZDNkM0xtRmpZM1l1WlhNdlptbHNaV0ZrYldsdUwwRnlZMmhwZG05ekwyTmxjblJwWm1sallXUnZjeTl5WVdsNllXTmpkakV1ClkzSjBNQjhHQ0NzR0FRVUZCekFCaGhOb2RIUndPaTh2YjJOemNDNWhZMk4yTG1Wek1CMEdBMVVkRGdRV0JCVFNoN1RqM3pjbmsxWDIKVnVxQjVUYk1qQjQvdlRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZOS0h0T1BmTnllVFZmWlc2b0hsTnN5TQpIais5TUlJQmN3WURWUjBnQklJQmFqQ0NBV1l3Z2dGaUJnUlZIU0FBTUlJQldEQ0NBU0lHQ0NzR0FRVUZCd0lDTUlJQkZCNkNBUkFBClFRQjFBSFFBYndCeUFHa0FaQUJoQUdRQUlBQmtBR1VBSUFCREFHVUFjZ0IwQUdrQVpnQnBBR01BWVFCakFHa0E4d0J1QUNBQVVnQmgKQU8wQWVnQWdBR1FBWlFBZ0FHd0FZUUFnQUVFQVF3QkRBRllBSUFBb0FFRUFad0JsQUc0QVl3QnBBR0VBSUFCa0FHVUFJQUJVQUdVQQpZd0J1QUc4QWJBQnZBR2NBN1FCaEFDQUFlUUFnQUVNQVpRQnlBSFFBYVFCbUFHa0FZd0JoQUdNQWFRRHpBRzRBSUFCRkFHd0FaUUJqCkFIUUFjZ0R6QUc0QWFRQmpBR0VBTEFBZ0FFTUFTUUJHQUNBQVVRQTBBRFlBTUFBeEFERUFOUUEyQUVVQUtRQXVBQ0FBUXdCUUFGTUEKSUFCbEFHNEFJQUJvQUhRQWRBQndBRG9BTHdBdkFIY0Fkd0IzQUM0QVlRQmpBR01BZGdBdUFHVUFjekF3QmdnckJnRUZCUWNDQVJZawphSFIwY0RvdkwzZDNkeTVoWTJOMkxtVnpMMnhsWjJsemJHRmphVzl1WDJNdWFIUnRNRlVHQTFVZEh3Uk9NRXd3U3FCSW9FYUdSR2gwCmRIQTZMeTkzZDNjdVlXTmpkaTVsY3k5bWFXeGxZV1J0YVc0dlFYSmphR2wyYjNNdlkyVnlkR2xtYVdOaFpHOXpMM0poYVhwaFkyTjIKTVY5a1pYSXVZM0pzTUE0R0ExVWREd0VCL3dRRUF3SUJCakFYQmdOVkhSRUVFREFPZ1F4aFkyTjJRR0ZqWTNZdVpYTXdEUVlKS29aSQpodmNOQVFFRkJRQURnZ0lCQUpjeEFwL24vVU5uU0VRVTVDbUg3VXdvWnRDUE5kcE5ZYmRLbDAyMTI1RGdCUzRPeG5uUThwZHBENzBFClI5bSsyN1VwMnB2WnJxbVoxZE04TUpQMWphR28vQWFOUlBUS0ZwVjhNOXhpaTZnMytDZllDUzBiNzhnVUp5Q3BaRVQvTHRaMXFteE4KWUVBWlNVTlVZOXJpekxwbTVVOUVlbHZaYW9FclFOVi8rUUVuV0N6STdVaVJmRCttQU0vRUtYTVJOdDZHR1Q2ZDdobUtHOVd3N1k0OQpuQ3JBRGRnOVp1TThEYjNWbEZ6aTRxYzFHd1FBOWo5YWplcER2VitKSGFuQnNNeVo0azBBQ3RySkoxdm5FNUJjNVBVem9sVnQzT0FKClRTK3hKbHNuZFFBSnhHSjNLUWhmbmxtc3RuNnRuMVF3SWdQQkhuRmsvdms0Q3BZWTNRSVVyQ1BMQmh3ZXBIMk5EZDRuUWVpdDJoVzMKc0NQZEs2alQyaVdIN2VoVlJFMkk5RForaEpwNHJQY09Wa2tPMWpNbDFvUlFRbXdnRWgwcTFiNjg4bkNCcEhCZ3ZnVzFtNTRFUkw1aApJNnpwcFNTTUVZQ1VXcUtpdVVuU3dkelJwKzB4RVN5ZUdhYnU0Vlhod09yUERZVGtGN2VpZktYZVZTVUc3c3pBaDF4QTJzeVZQMVhnCk5jZTRoTDYwWGMxNmd3Rnk3b2ZtWHgydXRZWEdKdC9td1pycEhnSkhueXFvYmFsYnoreEZkMytZSjVveVhTcmpoTzdGbUdZdmxpQWQKM2RqREo5ZXcrZjdaZmMzUW40OExGRmhSbnkrTHd6Z3QzdWlQMW8ySHBQVldReGFaTFBTa1ZyUTB1R0UzeWNKWWdCdWdsNkg4V1kzcApFZmJSRDB0Vk5FWXFpNFk3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRXQ0EgR2xvYmFsIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlFUQ0NBeW1nQXdJQkFnSUNETDR3RFFZSktvWklodmNOQVFFTEJRQXdVVEVMTUFrR0ExVUVCaE1DVkZjeEVqQVFCZ05WQkFvVApDVlJCU1ZkQlRpMURRVEVRTUE0R0ExVUVDeE1IVW05dmRDQkRRVEVjTUJvR0ExVUVBeE1UVkZkRFFTQkhiRzlpWVd3Z1VtOXZkQ0JEClFUQWVGdzB4TWpBMk1qY3dOakk0TXpOYUZ3MHpNREV5TXpFeE5UVTVOVGxhTUZFeEN6QUpCZ05WQkFZVEFsUlhNUkl3RUFZRFZRUUsKRXdsVVFVbFhRVTR0UTBFeEVEQU9CZ05WQkFzVEIxSnZiM1FnUTBFeEhEQWFCZ05WQkFNVEUxUlhRMEVnUjJ4dlltRnNJRkp2YjNRZwpRMEV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3dCZHZJNjR6RWJvb2g3NDVObkhFS0gxSnc3VzJDCm5KZkYxMHhPUlVuTFFFSzFFalJzR2NKMHBERmZoUUtYN0VNekNsUFNuSXlPdDdoNTJ5dlZhdktPWnNUdUt3RUhrdFN6MEFMZlVQWlYKcjJZT3krQkhZQzhyTWprMVVqb29nL2g3RnNZWXVHTFdSeVdSenZBWkVrMnRZL1hUUDNWZktmQ2hNQndxb0ppbUZiM3UvUmsyOE9LUgpRNC82eXRZUUowbE03OTNCOFlWd204cnFxRnBEL0cyR2IzUHBOMFdwOERiSHpJaDFIcnRzQnYrYmF6NFg3R0dxY1h6R0hhTDNTZWtWCnRUeldvV0gxRWZjRmJ4MzlFYjdRTUFmQ0tiQUpUaWJjNDZLb2tXb2Z3cEZGaUZ6bG1MaHhwUlVaeVh4MUVjeHdkRTh0bXgyUlJQMVcKS0tEK3U0WnF5UHBjQzFqY3hrdDJ5S3NpMlhNUHBmUmFBb2svVDU0aWd1NmlkRk1xUFZNbmFSMXNqaklzWkFBbVkyRTJUcU5HdHo5OQpzeTJzYlpDaWxhTE96OXFDNXdjMEdaYnB1Q0dxS1g2bU9MNk9LVW9oWm5rZnM4TzFDV2ZlMXRRSFJ2TXEydVlpTjJETGdiWVBvQS9wCnlKVi92MVdSQlhyUFBSWEFiOTRKbEFHRDF6UWJ6RUNsOExpYlo5V1lrVHVuaEhpVkpxUmFDUGdyZExRQUJEemZ1QlNPNk4rcGpXeG4Ka2pNZHdMZlM3SkxJdmdtL0xDa0Zid0pybnUrOHZ5cThXOEJRajBGd2NZZXlUYmNFcVlTak1xK3U3bXNYaTdLeC9temhrSXlJcUpkSQp6c2hOeS9NR3oxOXFDa0t4SGg1M0w0Nmc1cElPQnZ3Rkl0SW00VEZSZlRMY0R3SURBUUFCb3lNd0lUQU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFYelNCZHUrV0hkWGx0ZGtDWTRRV3dhNmcKY0ZHbjkweEhOY2dMMXlnOWlYSFpxak5CNmhRYmJDRUF3R3hDR1g2ZmFWc2dRdCtpMHRyRWZKZExqYkRvck1qdXBXa0VtUXFTcHFzbgpMaHBOZ2IrRTFIQWVyVWYrL1VxZE0rRHl1Y1JGQ0NFSzJtbHBjM0lOdmpUK2xJdXR3eDQxMTZLRDcrVTR4NldGSDZ2UE5Pdy9LUDRNCjhWZUdUc2xWOXh6VTJLVjlCbnB2MWQ4UTM0Rk9JV1d4dHVFWGVaVkZCczVmek54R2lXTm9SSTJUOUdSd29EMmRLQVhET1hDNFluc2cKL2VUYjZRaWh1SjQ5Q2NkUCt5ejRrM1pCM2xMZzRWZlNuUU84ZDU3K25pbGU5OEZSWUIvZTJndXlMWFczUTBpVDUvWjV4b1JkZ0ZsZwpsUHg0bUk4OGsxSHRRSkFIMzJSakpNdE9jUVdoMTVRYWlETHhJblFpcnFXbTJCSnBUR0NqQXU0cjdOUmprZ3Rldmk5MmE2TzJKcnlQCkE5Z0s4a3hrUnIwNVl1V1c2elJqRVNqTWxmR3Q3Ky9jZ0ZoSTZVdTQ2bVdzNmZ5QXRiWElSZm1zd1ovWnVlcGlpSTdFOFV1REVxM20KaTRUV25zTHJneGlmYXJzYkpHQXpjTXpzOXpMelhObDVmZStlcFA3Skk4TWs3aFdTc1QyUlR5YUd2V1p6SkJQcXBLNWp3YTE5aEFNOApFSGlHRzNuanhQUHlCSlVncmlPQ3hMTTZBR0svNWpZazRWZTZ4eDZRZGRWZlA1VmhLOEU3emVXemFHSFFSaWFwSVZKcExlc3V4K3QzCnpxWTZ0UU16VDNiUjUxeFVBVjNMZVBUSkRML1BFbzRYTFNOb2xPZXIvcW15S3diUUJNMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVGVsaWFTb25lcmEgUm9vdCBDQSB2MQo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGT0RDQ0F5Q2dBd0lCQWdJUkFKVytGcUQzTGtieGV6bUNjdnFMelpZd0RRWUpLb1pJaHZjTkFRRUZCUUF3TnpFVU1CSUdBMVVFCkNnd0xWR1ZzYVdGVGIyNWxjbUV4SHpBZEJnTlZCQU1NRmxSbGJHbGhVMjl1WlhKaElGSnZiM1FnUTBFZ2RqRXdIaGNOTURjeE1ERTQKTVRJd01EVXdXaGNOTXpJeE1ERTRNVEl3TURVd1dqQTNNUlF3RWdZRFZRUUtEQXRVWld4cFlWTnZibVZ5WVRFZk1CMEdBMVVFQXd3VwpWR1ZzYVdGVGIyNWxjbUVnVW05dmRDQkRRU0IyTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTUsrCjZ5ZndJYVB6YVNaVmZwM0ZWUmFSWFAzdkliOVRnSG90MHBHTVl6SHc3Q1R3dzZYU2Nud1FiZlEzdCtYbWZIbnFqTFdDaTY1SXRxd0EKM0dWMTdDcE5YOEdIOVNCbEs0R29SejZKSTVVd0ZwQi82RmNIU09jWnJyOUZaN0UzR3dZcS90NzVySDJEKzE2NjVJK1haNzVMam8xawpCMWM0VldrME5qMFRTTzlQNHRObUhxVFBHcmRlTmpQVXRBYTlHQUg5ZDRSUUFFWDFqRjNvSTd4Ky9qWGg3VkI3cVRDTkdkTUpqbWhuClhiODhseGhUdXlsaXhjcGVjc0hIbHRUYkxhQzBIMmtEN09yaVVQRU1QUENzODFNdDhCejE3V3c1T1hPQUZzaFNzQ1BONEQ3YzNUeEgKb0xzMWl1S1lhSXUrNWI5eTd0TDZwZTBTN2Z5WUdLa21kdHdvU3hBZ0hOTi9GbmN0N1crQTkwbTdVd1c3WFdqSDFNaDFGaitKV292MwpGMGZVVFBIU2lYaytUVDJZcUdIZU9oN1MrRjRENE1ISkhJelRqVTNUbFRhek4xOWpZNXN6RlBBdEptdFRmSW1NTXNKdTdEMGhBRG5KCm9XamlVSU11c0Rvcjh6YWdyQy9rYjJIQ1VRazVQb3RUdWJ0bjJ0eFR1WFpaTnAxRDVTRGdQVEpnaFNKUnQ4Y3p1OTBWTDZSNHBnZDcKZ1VZMkJJYmRlVFhIbFN3N3NLTVhOZVZ6SDdSY1dlL2E2aEJsZTNyUWY1K3p0Q28zTzNDTG0xdTVLN2Zzc2xFU2wxTXBXdFR3RWhEYwpUd0s3RXBJdll0US9hVU44RGRiOFdIVUJpSjFZRmt2ZXVwRC9Sd0dKQm1yMlg3S1Fhck1DcGdLSXY3TkhmaXJaMWZwb2VEVk5BZ01CCkFBR2pQekE5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3Q3dZRFZSMFBCQVFEQWdFR01CMEdBMVVkRGdRV0JCVHdqMWs0QUxQMWo1cVcKRE5YcitudXFGK2dURWpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQWdFQXZ1UmNZazRrOUF3SS8vRFRER2prazBraVAwUW5iN3R0M29ObQp6cWpNRGZ6MW1nYmxkeFNSNjUxQmU1a3FoT1gvL0NIQlhmRGtIMWUzZGFtaFh3SW0vOWZIOTA3ZVQvajNIRWJBZWs5QUxDSTE4Qm14CjBHdG5MTENvNE1CQU56WDJoRnhjNDY5Q2VQNm55UTFRNmcyRWR2WlI3NE5UeG5yL0RsWkpMbzk2MWd6bUoxVGpUUXBnY21MTmtRZlcKcGIvSW1XdnR4Qm5tcTB3Uk9NVnZNZUp1U2NnL2RvQW1BeVlwNERiMjlpQlQ0eGR3TkJlZFkyZ2VhK3pEVFlhNEV6QXZYVVlOUjBQVgpHNnBaRHJsY2pRWklyWFNIWDhmOE1WUkJFK0xISVE2ZTRCNE40Y0I3UTRXUXhZcFl4bVVLZUZmeXhpTVBBZGtnUzk0UCs1S0ZkU3BjCmM0MXRleVdSeXU1RnJnWkxBTXpUc1ZsUTJqcUlPeWxEUmw2WEsxVE9VMitOU3VlVytyOXhEa0tMZlAwb29OQkl5dHJFZ1V5N29uT1QKSnNqckROWW1pTGJBSk0rN3ZWdnJkWDNwQ0k2R015eDVkd2xwcFluOHMzQ1FoM2FQMHlLN1FzNjljd3NnSmlyUW16MXdIaVJzellkMgpxUmVXdDg4Tmt2dU9HS21ZU2RHZS9tQkVjaUc1R2UzQzlUSHhPVWlJa0NSMVZCYXR6dlQ0YVJSa09mdWp1THB3UU1jbkhML0VWbFA2ClkyWFE4eHdPRnZWcmhsaE5HTlRrRFk2bG5WdVIzSFlrVUQvR0t2dlp0NXkxMXViUTJlZ1ppeFZ4U0syMzZ0aFppTlNRdnhhejJlbXMKV1dGVXlCeTZ5c0hLNGJrZ1RJODZrNG1sb015LzAvWjFwSFdXYlZZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR3ekNDQXF1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb00KSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVQpjblZ6ZENCRFpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURJd0hoY05NRGd4Ck1EQXhNVEEwTURFMFdoY05Nek14TURBeE1qTTFPVFU1V2pDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NSWxRdFUzbHoKZEdWdGN5QkZiblJsY25CeWFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRApaVzUwWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklESXdnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3FYOW9iWCtoemtlWGFYUFNpNWtmbDgyaFZZQVVkQXFTem0xbnpIb3F2TkszOERjTFoKU0JudWFZL0pJUHdocWdjWjdiQmNyR1hIWCswQ2ZIdDhMUnZXdXJtQXdoaUNGb1Q2WnJBSXhsUWpnZVROdVVrLzlrOXVOMGdvT0EvRgp2dWRvY1AwNWwwM1N4NWlSVUtyRVJMTWpmVGxINlZKaTFoS1RYcmN4bGtJRiszYW5IcVAxd3Z6cGVzVnNxWEZQNnN0NHZHQ3Z4OTcwCjJjdStmak9sYnBTRDhEVDZJYXZxam5LZ1A2VGVNRnZ2aGsxcWxWdERSS2dRRlJ6bEFWZkZtUEhtQmlpUnFpREZ0MU1tVVVPeUN4R1YKV09IQUQzYlp3STE4Z2ZOeWNKNXYvaHFPMlY4MXhySnZOSHkrU0UvaVdqblgySjE0bnArR1BnTmVHWXRFb3RYSEFnTUJBQUdqUWpCQQpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUy9XU0EyQUhtZ29DSnJqTlh5CllkSzRMTXVDU2pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQU1RT2lZUXNmZE9oeU5zWnQrVTJlK2lLbzRZRld6ODI3bitxcmtSazQKcjZwOEZVM3p0cU9OcGZTTzlrU3BwK2dobGEwK0FHSVdpUEFDdXZ4aEkrWXptekI2YXpaaWU2MEVJNFJZWmVMYks0cm5KVk0zWWxOZgp2Tm9CWWltaXBpZHg1am9pZnNGdkhaVndJRW9ITk4vcS94V0E1YnJYZXRoYmRYd0ZlaWxIZmtDb01STjN6VUE3dEZGSGVpNFI0MGNSCjNwMW0wSXZWVkdiNmcxWHFmTUlwaVJ2cGI3UE80Z1dFeVM4K2VJVmlic2xmd1hoamRGakFTQmdNbVRucnBNd2F0WGxhalJXYzJCUU4KOW5vSFY4Y2lnd1V0UEpzbEpqMFlzNmxEZk1qSXEyU1BEcU8vbkJ1ZE1OdmEwQmt1cWp6eCt6T0FkdVROclJsUEJTZU9FNkZ1d2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBdG9zIFRydXN0ZWRSb290IDIwMTEKPT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJSVhEUExZaXhmc3pJd0RRWUpLb1pJaHZjTkFRRUxCUUF3UERFZU1Cd0dBMVVFQXd3VlFYUnZjeUJVCmNuVnpkR1ZrVW05dmRDQXlNREV4TVEwd0N3WURWUVFLREFSQmRHOXpNUXN3Q1FZRFZRUUdFd0pFUlRBZUZ3MHhNVEEzTURjeE5EVTQKTXpCYUZ3MHpNREV5TXpFeU16VTVOVGxhTUR3eEhqQWNCZ05WQkFNTUZVRjBiM01nVkhKMWMzUmxaRkp2YjNRZ01qQXhNVEVOTUFzRwpBMVVFQ2d3RVFYUnZjekVMTUFrR0ExVUVCaE1DUkVVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNWCmhUdVhieW83TGp2UHB2TXBOYjdQR0t3K3F0bjRUYUErR2tlNXZKcmY4djdNUGtmb2VwYkNKSTQxOUtrTS9JTDliY0Z5WWllOTZtdnIKNTRyTVZENlFVTStBMUpYNzZMV0MxQlRGdHFsVkpWZmJzVkQyc0dCa1dYcHB6d08zYncyK3lqNXZkSExxcWpBcWMySytTWkZoeUJIKwpEZ01xOTJvZzNBSVZEVjRWYXZ6amdzRzF4WjFrQ1d5aldaZ0hKOGNibGl0aGRIRnNRL0gzTllrUTRKN3NWYUUzSXFLSEJBVXNSMzIwCkhMbGlLV1lveXJmaGsvV2tsQU9adVhDRnRlWkk2bzFRL05uZXpHOEhEdDBMY3AyQU1CWUhsVDhvRHYzRmRVOVQxblNhdENRdWpnS1IKejNiRm14NVZkSng0SWJId0xmRUxuOExWbGhnZjhGUWllb3dIQWdNQkFBR2pmVEI3TUIwR0ExVWREZ1FXQkJTbnBRYXhMS1lKWU83UgpsK2x3cnJ3N0dXemJJVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRktlbEJyRXNwZ2xnN3RHWDZYQ3V2RHNaCmJOc2hNQmdHQTFVZElBUVJNQTh3RFFZTEt3WUJCQUd3TFFNRUFRRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liM0RRRUIKQ3dVQUE0SUJBUUFtZHpUYmxFaUdLa0dkTEQ0R2tHREVqS3dMVkxnZnVYdlRCem5rK2o1N3NqMU83WjhqdlpmemExenY3djFBcHQraAprNkVLaHF6dklOQjVBYjE0OXhuWUpERTBCQUdtdWhXYXd5ZmMyRThQekJoai81a1BEcEZyZFJiaElmellKc2RIdDZiUFdISnhmcnJoClRaVkhPOG12YmFHMHdleUo5clFQT0xYaVpOd2x6NmJiNjVwY21hSEZDTjc5NXRyVjFscEZETVMzd3JVVTc3UVIvdzRWdGZYMTI4YTkKNjFxbjhGWWlxVHhsVk1ZVnFMMkduczJEbG1oNmNZR0o0UXZoNmhFYmFBak1hWjdzbmtHZVJESW1ldUtIQ25FOTYrUmFwTkxieGMzRwozbUIvdWZOUFJKTHZLcmNZUHFjWjJRdDlzVGRCUXJDNllCM3kvZ2tSc1BDSGU2ZWQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKUXVvVmFkaXMgUm9vdCBDQSAxIEczCj09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVlRmhmTHEwc0dVdmpOd2MxTkJNb3RaYlVaWk13RFFZSktvWklodmNOQVFFTEJRQXdTREVMTUFrRwpBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2CmIzUWdRMEVnTVNCSE16QWVGdzB4TWpBeE1USXhOekkzTkRSYUZ3MDBNakF4TVRJeE56STNORFJhTUVneEN6QUpCZ05WQkFZVEFrSk4KTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURFZwpSek13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2d2bEFRanVueWJFQzBCSnlGdVRISzNDM2tFYWtFClBCdFZ3ZWRZTUIwa3RNUHZoZDZNTE9IQlBkK0M1ayt0UjRkczdGdEp3VXJWdTQvc2g2eC9ncHFHN0QwRG1WSUIwaldlck5yd1U4bG0KUE5Tc0FnSGFKTk03cUFKR3I2UWM0L2h6V0hhMzlnNlFEYlh3ejh6NitjWk01Y09HTUFxTkYzNDE2OFhmdXc2Y3dJMkg0NGc0aFdmNgpQc2VyNEJPY0JSaVl6NVAxc1pLMC9DUFR6OVhFSjBuZ25qeWJDS09MWFNvaDRQdzVxbFBhZlg3UEdnbFR2RjBGQk0raFNvK0xkb0lOCm9malN4eFIzVzVBMkI0R2JQZ2I2VWw1anhhWUEvcVhwVWh0U3RaSTVjZ01KWXIyd1lCWnVwdDBsd2dObTNmTUUwVURpVG91RzlHL2wKZzZBbmhGNEV3ZldRdlRBOXhPK29hYnc0bTZTa2x0RmkybW5BQVphdXk4UlJOT29NcXY4aGpsbVBTbHprWVpxbjB1a3FlSTFSUFRvVgo3cUpaanFsYzNzWDVrQ0xsaUVWeDNaR1piSHFmUFQyWWZGNzJ2aFpvb0Y2dUN5UDhXZytxSW5ZdHlhRVFIZVRUUkNPUWlKL0dLdWJYCjlacXpXQjR2TUlrSUcxU2l0WmdqN0FoM0hKVmRZZEhMaVp4Zm9rcVJtdThocWtrV0NLaTlZU2d4eVhTdGhmYlp4YkdMMGVVUU1rMWYKaXlBNlBFa2ZNNFZaRGR2TENYVkRhWFA3YTNGOThOL0VUSDNHb3k3SWxYbkxjNktPVGswaysxN2tCTDV5RzZZbkxVbGFtWHJYWEFrZwp0MytVdVUveERSeGVpRUliRWJmbmtkdWViUFJxMzR3R21BT3R6Q2p2cFVmelV3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVvNWZXODE2aUVPR3JSWjg4RjJRODdnRnduTXd3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFCajZXM1g4UG5ySFgzZkh5dC9QWDhNU3hFQmQxREtxdUdyWDFSVVZScGdqcGVhUVd4aVpUT090UXFPQwpNVGFJemVuN3hBU1dTSXNCeDQwQnoxc3pCcFpHWm5RZFQrM0J0cm0wRFdITVkzN1hMbmVNbGh3cUkyaHJoVmQyY0RNVC91RlBwaU4zCkdQb2FqT2k5WmNuUFAvVEpGOXpyeDd6QUJDNHRSaTlwWnNNYmovN3NQdFBLbEw5MkNpVU5xWHNDSEtuUU8xOEx3SUU2UFdUaHY2Y3QKVHIxTnhOZ3B4aUlZME1Xc2NnS0NQNm82b2pvaWx6SGRDR1BEZFJTNVlDZ3RXMmpnRnFsbWdpTlI5ZXRUMkRHYmUrbTNuVXZyaUJiUAorVjA0aWtrd2orM3g2eG4wZHhveEdFMW5WR3d2YjJYNTJ6M3NJZXhlOVBTTHltQmxWTkZ4WlBUNXBxT0JNell6Y2ZDa2VGOU9yWU1oCjNqUkpqZWhackozeWRsbzI4aFAwcitBSngyRXFiUGZnbmE2N2hrb29ieTd1dEhuTmtEUERzM2I2OWZCc25RR1ErcDZROXB4eXowZmEKd3gva05TQlQ4bFRSMzJHRHBnTGlKVGplaFRJdFhuT1FVbDFDeE00OVMrSDVHWVFkMWFKUXpFSDdRUlREdmRiSldxTmpaZ0tBdlFVNgpPMGVjN0FBbVRQV0lVYitvSTM4WUI3QUw3WXNtb1dUVFlVcnJYSi9lczY5bkE3TWYzVzFkYVdocHExNDY3SHhwdk1jN2hVNmVGYm0wCkZVL0RsWHBZMThsczZXeTU4eWxqWHJRczhDMDk3VnBsNEtsYlFNSkltWUZ0bmg4R0tqd1N0SXNQbTZJazhLYU4xbnJnUzdaa2xtT1YKaE1KS3pSd3VKSWN6WU9YRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpRdW9WYWRpcyBSb290IENBIDIgRzMKPT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVVJGYzBKRnVCaVpzMThzNjRLenRicHlid2RTZ3dEUVlKS29aSWh2Y05BUUVMQlFBd1NERUxNQWtHCkExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWNCZ05WQkFNVEZWRjFiMVpoWkdseklGSnYKYjNRZ1EwRWdNaUJITXpBZUZ3MHhNakF4TVRJeE9EVTVNekphRncwME1qQXhNVEl4T0RVNU16SmFNRWd4Q3pBSkJnTlZCQVlUQWtKTgpNUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJRElnClJ6TXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDaHJpV3lBUmpjVjRnL1J1djVyK0xySTNIaW10RmgKWmlGZnFxOG5VZVZ1R3hiVUxYMVFzRk4zdlhnNllPSmtBcHQ4aHB2V0dvNnQveDhWZjlXVkhoTEw1aFNFQk1IZk5yTVduNHJqeWR1WQpOTTdZTXhjb1J2eW55ZkRTdE5WTkNYSkorZktINDZuYWZhRjlhN0k2SmFsdFVrU3MrTDV1Kzl5bWM1R1FZYVlERkNEeTU0ZWppSzJ0Cm9Jei9wZ3NsVWlYbkZnSFZ5N2cxZ1F5ak8vRGg0ZnhhWGM2QWNXMzRTYXMrTzdxNDE0QUIrNlhyVzdQRlhtQXFNYUN2TitnZ09wK28KTWl3TXpBa2QwNTZPWGJ4TW1PN0ZHbWg3N0ZPbTZSUTFvOS9OZ0o4TVNQc2M5UEcvU3JqNjFZeHhTc2NmcmY1Qm1yT0RYZktFVnUrbApWMFBPS2EyTXExVy94UHRiQWQwaklhRllBSTdEMEdvVDdSUGpFaXVBM0dmbWxiTE5IaUp1S3ZoQjFQTEtGQWVOaWxVU3htbjF1SVpvCkwxTmVzTktxSWNHWTVqRGpaMVhIbTI2c0dhaFZwa1VHMENNNjIrdGxYU29SRWZBN1Q4cHQ5RFRFY2VUL0FGcjJYSzRqWUlWejhlUVEKc1NXdTFaSzdFOEVNNERuYXREbFh0YXMxcW5JaE80TTE1ekhmZWlGdXVESUlmUjB5a1JWS1luTFA0M2Vodk5VUkczWUJad2pnUVF2RAo2eFZ1K0tRWjJhS3JyK0luVWxZckFvb3NGQ1Q1djBJQ3Z5Ykl4by9nYmpoOVV5M2w3Wml6bFdOb2YvazE5TitJeFdBMWtzQjhhUnhoCmxSYlE2OTRMcno0RUVFVmxXRkE0cjBqeVdiWVc4andOa0FMR2NDNEJyVHdWMXdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVTdlZHZkbHEvWU94Slc4YWxkN3R5Rm5HYnhEMHdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUpIZmdEOURDWDV4d3ZmcnM0aVA0Vkd5dkQxMStTaGR5THlabTN0ZHF1WEs0UXIzNkxMVG45MW5NWDY2CkFhckhha0U3a05RSVhMSmdhcER3eU00RFl2bUw3ZnR1S3R3R1RUd3BENGtXaWxoTVNBL29oR0hxUEhLbWQrUkNyb2lqUTFoNWZxN0sKcFZNTnFUMXd2U0FaWWFSc09QeERNdUhCUi8vNDdQRVJJaktXbk1MMlcybVdleUFNUTBHYVcvWlpHWWplVllnM1VRdDRYQW9lbzBMOQp4NTJJRDhEeWVBSWtWSk92aVllSXlVcUFIZXJRYmo1aExqYTdOUTRubHYxbU5EdGhjblB4Rmx4SEJsUkpBSHBZRXJBSzc0WDlzYmd6CmRXcVRIQkxtWUY1dkhYL0pIeVBMaEdHZkhvSkUrVit0WWxVa21sS1k3Vkhub1g2WE91WXZIeEhhVTRBc2haNnJOUkRiSWw5cXhWNlgKVS9JeUFna3dvMWp3RFFIVmNzYXhmR2w3dy9VMlJjeGhibDVNbE1WZXJ1Z09Yb3UvOTgzZzdhRU9HelB1VkJqK0Q3N3Zmb1JyUStOdwptTnRkZGJJTldRZUZGU001MXZIZnFTWVAxa2pIczZZaTlUTTNXcFZIbjN1NkdCVnYvOVlVWklOSjBncG5JZHNQTldOZ0tDTGpzWldECnpZV20zUzhQNTJkU2Jyc3ZoWHoxU25QbnhUN0F2U0VTQlQvOHR3TkpBbHZJSmViaVZEajFlWWVNSFZPeVRvVjdCampITFBqNHNIS04KSmVWM1V2UURIRWltVUYrSUlEQnU4b0pEcXoyWGhPZFQreUhCVHc4aW1vYTRXU3IyUnowWmlDM29oZUdlN0lVSWFyRnNOTWtkN0VncgpPM2p0WnNTT2VXbUQzbitNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClF1b1ZhZGlzIFJvb3QgQ0EgMyBHMwo9PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVTHZXYkFpaW4yM3IvMWFPcDdyMERvTThTYWgwd0RRWUpLb1pJaHZjTkFRRUxCUUF3U0RFTE1Ba0cKQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBY0JnTlZCQU1URlZGMWIxWmhaR2x6SUZKdgpiM1FnUTBFZ015QkhNekFlRncweE1qQXhNVEl5TURJMk16SmFGdzAwTWpBeE1USXlNREkyTXpKYU1FZ3hDekFKQmdOVkJBWVRBa0pOCk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklETWcKUnpNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN6eXc0UVo0N3FGSmVuTWlvS1ZqWi9hRXpIczI4NgpJeFNSL3hsL3BjcXM3ck4yblhycGl4dXJhekhiK2d0VFRLL0ZwUnA1UElwTS82emZKZDVPMllJeUMwVGV5dHVNcktOdUZvTTdwbVJMCk1vbjdGaFk0ZnV0RDR0TjBTc0ppQ25NSzNVbXpWOUt3Q29XZGNUemVvOHZBTXZNQk9TQkRHelhSVTdPeDdzV1RhWUkrRnJVb1JxSGUKNm9rSjdVTzRCVWFLaHZWWlI3NGJid0VoRUxuOXFkSW95aEE1Q2NvVE5zK2NyYTFBZEhrckFqODAvL29nYVgzVDdtSDF1clBuTU5BMwpJNFp5WVVVcFNGbG9iM2VtTG9HK0IwMXZyODdFUlJPUkZIQUdqeCtmK0lkcHNRN3Z3NGtaNitvY1lmeDZiSXJjMWdNTG5pYTZFdDNVClZEbXJKcU16Nm5XQjJpM05EMC9rQTlIdkZaY2JhNURGQXBDVFpnSWhzVWZlaTVwS2dMbFZqN1dpTDhEV00yZmFmc1NudEFSRTYwZjcKNWxpNTl3endleXV4d0hBcHcwQmlMVHRJYWR3alBFanJld2w1cVczYXFEQ1l6NEJ5QTRpbVcwYXVjbmw4Q0FNaFphNjM0Unlsc1NxaQpNZDVtQlBmQWRPaHgzdjg5V2N5V0poS0xoWlZYR3F0cmRRdEVQUkVvUEh0aHQrS1BaMC9sN0R4TVlJQnBWemdlQVZ1TlZlakgzOERNCmR5TTBTWFY4OXBnUjZ5M2U3VUV1RkFVQ2YrRCtJT3MxNXhHc0lzNVhQZDdKTUcwUUE0WE44ZitNRnJYQnNqNkliR0Iva0UrVjkvWXQKclFFNUJ3VDZkWUI5djBsUTdlL0p4SHdjNjRCKzI3YlEzUlAreWRPYzE3S1hxUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVeGhmUXZLanFBa1B5R3dhWlhTdVFJTG5Ybk9Rd0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnSUJBRFJoMlZhMUVvZFZUZDJqTlRGR3U2UUhjcnhmWVdMb3Bmc0xON0U4dHJQNktaMS9BdldreWFpVHQzcHgKS0dtUGMrRlNrTnJWdmpybHQzWnFWb0FoMzEzbTZUcWU1VDcyb21uSEtncXdHRWZjSUhCOVVxTStXWHpCdXNuSUZVQmh5bkxXY0t6Uwp0L0FjNUlZcDhNN3ZhR1BRdFNDS0ZXR2Fmb2FZdE1uQ2R2dk11akFXektOaHhuUVQ1V3Z2b3hYcUEvNFRpMlRrMDhIUzZJVDdTZEVRClRYbG02NnI5OUkweEhuQVVyZHplWnhOTWdSVmh2TGZaa1hkeEdZRmd1L0JZcGJXY0MvZVBJbFVud0VzQmJUdVpEZFFkbTJObkw5RHUKRGNwbXZKUlBwcTN0L081anJGYy9aU1hQc29hUDBBai91SFlVYnQ3bEoreXJlTFZUdWJZLzZDRDUwcWkrWVViS2g0eUU4L254b0dpYgpJaDZCSnBzUUJKRnh3QVlmM0tEVHVWYW40NWd0ZjRPZDM0d3JuREtPTXBUd0FUd2lLcDlEd2k3RG1Ea0hPSHY4WGdCQ0gvTXlKbm1ECmhQYmw4TUZSRXNBTEhnUWpERlNsVEM5SnhVclJ0bTVnRFd2OGE0dUZKR1MzaVE2ckpVZGJQTTkrU2IzSDZRckcydmQrRGhjSTAwaVgKMEhHUzhBODVQalJxSEgzWThpS3V1Mm4wTTdTbVNGWFJEdzRtNk95MkN5Mm5oVFhOL1ZuSW45SE5QbG9wTkxrOWhNNnhaZFJaa1pGVwpkU0hCZDU3NWV1RmduZE90QkJqMGZPdGVrNDlUU2lJcCtFZ3JQazJHckZ0L3l3YVpXV0RZV0dXVmpVVFI5MzkrSjM5OXJvRDFCMHkyClBweHhWSmtFUy8xWStaajAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEcyCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGxqQ0NBbjZnQXdJQkFnSVFDNU1jT3RZNVorcG5JNy9EcjVyMFN6QU5CZ2txaGtpRzl3MEJBUXNGQURCbE1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3CklnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpJd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3cKTVRFMU1USXdNREF3V2pCbE1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTApFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSekl3CmdnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURaNXlndlVqODJja21Ja3pUeitHb2VNVlNBbjYxVVFiVkgKMzVhbzFLK0FMYmtLejNYOWlhVjlKUHJqSWd3cnZKVVhDek8vR1UxQkJwQUF2UXhORVA0SHRlY2NiaUpWTVdXWHZkTVgwaDVpODl2cQpiRkNNUDRRTWxzKzN5d1BneW0yaEZFd2JpZDN0QUxCU2ZLK1JiTEU0RTlIcEVnakFBTEFjS3hIYWQzQTJtNjdPZVlmY2duRG1DWFJ3ClZXbXZvMmlmdjkyMmViUHluWEFwVmZTci81Vmg4OGxBYngzUnZwTzcwNGdxdTUyL2NscFdjVHMvMVBQUkN2NG83NlB1MlptdkE5T1AKWUxmeWtxR3h2WW1KSHpETnc2WXVZak91RmdKM1JGcm5nUW84cDBRdWViZy9CTHhjb0lmaEc2OVJqczNzTFByNC9tM3dPbnlxaStSbgpsVEdOQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlRPCncwcTVtVlh5dU50Z3Y2bCt2VmExbHphbjFqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUF5cVZWak9QSVFXNXBKNmQxRWU4OGhqWnYKMHAzR2VEZ2RhWmFpa21rdU9HeWJmUVRVaWFXeE1UZUt5U0hNcTJ6Tml4eWExcjlJMGpKbXdZckE4eTg2NzhEajFKR0cwVkRqQTl0egpkMjlLT1ZQdDNpYkh0WDJ2SzBMUmRXTGpTaXNDeDFCTDRHbmlsbXdPUkdZUVJJK3RCZXY0ZWF5bUcrZzNOSjFUeVdHcW9sS3ZTbkFXCmhzSTZ5TEVUY0RiWXorNzBDalRWVzB6OUI1eWl1dGtCY2x6elRjSGREckVjRGNSanZxMzBGUHVKN0tKQkRrek15RmRBMEc0RHFzME0Kam9tWm1XendQREN2T045dnZLTytLU0FucTNUL0V5SjQzcGRTVlI2RHRWUWdBKzZ1d0U5VzNqZk13MytxQkNlNzAzZTRZdHNYZkp3bwpJaE56Yk04bTlZb3A1dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNSakNDQWMyZ0F3SUJBZ0lRQzZGYStoM2ZvTFZKUksvTkpLQnM3REFLQmdncWhrak9QUVFEQXpCbE1Rc3dDUVlEVlFRR0V3SlYKVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRApWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpNd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxCk1USXdNREF3V2pCbE1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSek13ZGpBUQpCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFaNTd5c1JHWHR6YmcvV1B1TnNWZXBSQzBGRmZMdkMvOFFkSisxWWxKZlpuNGY1ZHdiClJYa0x6TVpUQ3AyTlhRTFpxVm5lQWxyMmxTb09qVGhLaWtuR3ZNWURPQWRmVmRwK0NXN2lmMTdRUlNBUFdYWVExcUFrOEMzZU52SnMKS1RtalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCVEwwTDJwNFpnRgpVYUZOTjZLRGVjNk5IU3JraERBS0JnZ3Foa2pPUFFRREF3Tm5BREJrQWpBbHBJRkZBbXNTUzNWMFQ4Z2o0M0R5ZFhMZWZJbnd6NUZ5CllaNWVFSkpaVnJtRHh4RG5PT2xZSmpaOTFlUTBoamtDTUh3MlUvQXc1V0pqT3BuaXRxTTdtelQ2SHRvUWtuRmVrUk9uM2FSdWtzd3kKMXZVaFpzY3Y2cFpqYW1WRmtwVUJ0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEdsb2JhbCBSb290IEcyCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEampDQ0FuYWdBd0lCQWdJUUF6cng1cWNScWFDN0tHU3hIUW42NVRBTkJna3Foa2lHOXcwQkFRc0ZBREJoTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXcKSGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCSE1qQWVGdzB4TXpBNE1ERXhNakF3TURCYUZ3MHpPREF4TVRVeApNakF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzCmR5NWthV2RwWTJWeWRDNWpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFY3lNSUlCSWpBTkJna3EKaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF1emZOTk54N2E4bXlhSkN0U25YL1Jyb2hDZ2lOOVJsVXlmdUkyL091OGpxSgprVHg2NXFzR0dtdlByQzNvWGdra1JMcGltbjdXbzZoKzRGUjFJQVdzVUxlY1l4cHNNTnphSHhteDF4N2UvZGZneTVTRE42N3NIME5PCjNYc3MwcjB1cFMva3FiaXRPdFNacExZbDZadHJBR0NTWVA5UElVa1k5MmVRcTJFR25JL3l1dW0wNlpJeWE3WHpWK2hkRzgyTUhhdVYKQkpWSjh6VXRsdU5KYmQxMzQvdEpTN1NzVlFlcGo1V3p0Q083VEcxRjhQYXBzcFV3dFAxTVZZd25TbGNVZklLZHpYT1MweFpLQmd5TQpVTkdQSGdtK0Y2SG1JY3I5ZytVUXZJT2xDc1JuS1BaekZCUTlSbmJEaHhTSklUUk5ydzlGREtaSm9icTduTVd4TTRNcGhRSURBUUFCCm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQWRCZ05WSFE0RUZnUVVUaUpVSUJpVjV1TnUKNWcvNitya1M3UVlYanprd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFHQm5LSlJ2RGtoajZ6SGQ2bWNZMVlsOVBNV0xTbi9wdnRzcgpGOSt3WDNOM0tqSVRPWUZuUW9RajhrVm5OZXlJdi9pUHNHRU1OS1N1SUV5RXh0djROZUYyMmQrbVFydkhSQWlHZnpaMEpGcmFiQTBVCldUVzk4a25kdGgvSnN3MUhLajJaTDd0Y3U3WFVJT0daWDFOR0ZkdG9tL0R6TU5VK01lS05oSjdqaXRyYWxqNDFFNlZmOFBsd1VIQkgKUVJGWEdVN0FqNjRHeEpVVEZ5OGJKWjkxOHJHT21hRnZFN0ZCY2Y2SUtzaFBFQ0JWMS9NVVJlWGdSUFRxaDVVeWt3NytVMGI2TEozLwppeUs1UzlrSlJhVGVwTGlhV04wYmZWS2ZqbGxEaUlHa25pYlZiNjNkRGNZM2ZlMERraHZsZDE5MjdqeU54RjFXVzZMWlptNnpOVGZsCk1yWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNQekNDQWNXZ0F3SUJBZ0lRQlZWV3ZQSmVwRFUxdzZRUDFhdEZjakFLQmdncWhrak9QUVFEQXpCaE1Rc3dDUVlEVlFRR0V3SlYKVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU0F3SGdZRApWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkhNekFlRncweE16QTRNREV4TWpBd01EQmFGdzB6T0RBeE1UVXhNakF3Ck1EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVE1SVXdFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkM2R5NWsKYVdkcFkyVnlkQzVqYjIweElEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRWN6TUhZd0VBWUhLb1pJemowQwpBUVlGSzRFRUFDSURZZ0FFM2FmWnU0cTRDL3NMZnlIUzhMNitjL016WFJxOE5PcmV4cHU4MEpYMjhNelFDN3BoVzFGR2ZwNHRuKzZPCll3d1g3QWR3OWMrRUxrQ0RuT2cvUVcwN3JkT2tGRmsyZUowRFErNFFFMnh5M3E2SXA2RnJ0VVBPWjl3ai93TWNvK0krbzBJd1FEQVAKQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQWRCZ05WSFE0RUZnUVVzOXRJcFBtaHhkaXVOa0hNRVdOcApZaW04UzhZd0NnWUlLb1pJemowRUF3TURhQUF3WlFJeEFLMjg4bXcvRWtyUkxUbkRDZ21YYy9TSU5veUlKN3ZtaUkxUWhhZGorWjR5CjNtYVREL0hNc1FtUDNXeXIrbXQvb0FJd09XWmJ3bVNOdUo1UTNLalZTYUx0eDl6UlNYOFhBYmpJaG85T2pJZ3JxSnFwaXNYUkFMMzQKVk9LYTVWdDhzeWNYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNAo9PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZrRENDQTNpZ0F3SUJBZ0lRQlpzYlY1Nk9JVExpT1FlOXAzZDFYREFOQmdrcWhraUc5dzBCQVF3RkFEQmlNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNFdwpId1lEVlFRREV4aEVhV2RwUTJWeWRDQlVjblZ6ZEdWa0lGSnZiM1FnUnpRd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxCk1USXdNREF3V2pCaU1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU0V3SHdZRFZRUURFeGhFYVdkcFEyVnlkQ0JVY25WemRHVmtJRkp2YjNRZ1J6UXdnZ0lpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQy81cEJ6YU42NzVGMUtQREFpTUdrejdNS25KUzdKSVQzeWl0aFp3dUVwCnB6MVlxM2FhemE1N0c0UU54REFmOHh1a09CYnJWc2FYYlIycnNubnl5aEhTNUYvV0JUeFNEMUlmeHA0VnBYNituNmxYRmxsVmNxOW8KazNEQ3NycDFtV3B6TXBUUkVFUVFMdCtDOHdlRTVuUTdiWEhpTFF3YjdpRFZ5U0FkWXlrdHp1eGVUc2lUK0NGaG16VHJCY1plN0ZzYQp2T3ZKejgyc05FQmZzWHBtN25mSVNLaG1WMWVmVkZpT0RDdTNUNmN3MlZidXludGQ0NjNKVDE3bE5lY3h5OXFUWHR5T2o0RGF0cEdZClFKQjV3M2pIdHJIRXRXb1lPQU1RamRqVU42UXVCWDJJOVlJK0VKRndxMVdDUVRMWDJ3UnpLbTZSQVh3aFROUzhyaHNEZFYxNFp0azYKTVVTYU0wQy9DTmRhU2FUQzVxbWdaOTJrSjd5aFR6bTFFVmdYOXlSY1JvOWs5OEZwaUhhWWRqMVpYVUoyaDRtWGFYcEk4T0NpRWh0bQptblRLM2tzZTV3NWpydWJVNzVLU09wNDkzQURrUlNXSnRwcEVHU3Qrd0pTMDBtRnQ2elBaeGQ5TEJBRE1mUnlWdzQvM0liS3lFYmU3CmYvTFZqSEFzUVdDcXNXTVlSSlVhZG1KKzlvQ3crK2hrcGpQUmlRZmh2YmZtUTZRWXVLWjNBZUVQbEF3aEhiSlVLU1dKYk9VT1VsRkgKZEw0bXJMWkJkZDU2ckYrTlA4bTgwMEVSRWx2bEVGRHJNY1hLY2hZaUNkOThUSFUvWSt3aFg4UWdVV3R2c2F1R2kwL0Mxa1ZmblNEOApvUjdGd0kraXNYNEtKcG4xNUdrdm1CMHQ5ZG1wc2gzbEd3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkCkR3RUIvd1FFQXdJQmhqQWRCZ05WSFE0RUZnUVU3TmZqZ3RKeFhXUk0zeTVuUCtlNm1LNGNEMDh3RFFZSktvWklodmNOQVFFTUJRQUQKZ2dJQkFMdGgyWDJwYkw0WHhKRWJ3NkdpQUkzalpHZ1BWczkzcm5ENS9acEttYm5KZUZ3TURGL2s1aFFwVmdzMlNWMUVZK0N0bkpZWQpaaHNqRFQxNTZXMXIxbFQ0MGp6QlEwQ3VIVkQxVXZ5UU83dVltV2xyeDhHbnFHaWtKOXlkK1NldU1JVzU5bWROT2o2UFdUa2lVMFRyCnlGMER5dTFRZW4xaUlRcUF5SE5tMGFBRllGL29wYlNucjZqM2JUV2NmRnFLMXFJNG1mTjRpL1JOMGlBTDNnVHVqSnRIZ1hJTndCUXkKN3pCWkxxN2djZkpXNUdxWGI1SlFiWmFOYUhxYXNqWVVlZ2J5SkxrSkVWRFhDTEc0aVhxRUkyRkNLZVdqemFJZ1FkZlJuR1RaNmlhaAppeFRYVEJteVVFRnhQVDlOY0NPR0RFcmNnZExNTXBTRURRZ0pseHhQd081cklIUXcwdUE1TkJDRklSVUJDT2hWTXQ1eFNka29GMUJOCjVyNU4wWFdzME1yN1FiaERwYXJUd3dWRVR5dzJtK0w2NGtXNEkxTnNCbTluVlg5R3RVdy9iaWhhZVNiU3BLaGlsOUllNHUxS2k3d2IKL1VkS0RkOW5abjZ5VzBIUU8rVDBPL1FFWStudndsUUFVYUNLS3NuT2VNelY2b2NFR0xQT3IwbUlyL09TbWJhejVtRVAwb1VBNTFBYQo1QnVWblJtaHVaeXhtN0VBSHUvUUQwOUNiTWtLdk81RCtqcHhwY2hOSnFVMS9ZbGR2SVZpSFRMU29DdFU3WnBYd2R2NkVNOFp0NHRLCkc0OEJ0aWVWVStpMmlXMWJ2R2pVSStpTFVhSlcrZkNtZ0tEV0hyTzhEdzlUZFNtcTZoTjM1TjZNZ1NHdEJ4QkhFYTJIUFFmUmRielAKODJaKwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYyRENDQThDZ0F3SUJBZ0lRVEtyNXl0dGpiK0FmOTA3WVd3T0duVEFOQmdrcWhraUc5dzBCQVF3RkFEQ0JoVEVMTUFrR0ExVUUKQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnRwpBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCU1UwRWdRMlZ5ZEdsbWFXTmhkR2x2CmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBd01URTVNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmhURUxNQWtHQTFVRUJoTUMKUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRQpDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1USWtOUFRVOUVUeUJTVTBFZ1EyVnlkR2xtYVdOaGRHbHZiaUJCCmRYUm9iM0pwZEhrd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNSNkZTUzBncFdzYXdOSk4zRnowUm4KZEprck42TjlJM0FBY2J4VDM4VDZLaEtQUzM4UVZyMmZjSEszWVgvSlN3OFhwejNqc0FSaDd2OFJsOGYwaGo0SytqNWMrWlBtTkhyWgpGR3ZubkxPRm9JSjZkcTl4a05mcy9RMzZuR3o2MzdDQzlCUisrYjdFcGk5UGY1bC90ZnhuUTNLOURBRFdpZXRyTE5QdGo1Z2NGS3QrCjVlTnUvTmlvNUpJazJrTnJZcmhWL2VyQnZHeTJpL01Palpya20yeHBtZmg0U0RCRjFhM2hEVHhGWVB3eWxsRW52R2ZEeWk2MmErcEcKeDhjZ29MRWZaZDVJQ0xxa1RxbnlnMFkzaE92b3pJRklRMmRPY2lxYlhMMU1HeWlLWENKN3RLdVkyZTdnVVlQRENVWk9iVDZaK3BVWAoybnd6VjBFOGpWSHRDN1pjcnl4akd0OVh5RCs4NlYzRW02OUZtZUtqV2lTMHVxbFdQYzl2cXY5SldMN3dxUC8wdUszcE4vdTZ1UFFMCk92bm9RMEllaWRpRXl4UHgyYnZoaVdDNGpDaFdyQlFkbkFybmNldlBEdDA5cVphaFNMMDg5NisxRFNKTXdCR0I3Rlk3OXRPaTRsdTMKc2dRaVVwV0FrMm5vamt4bDhaRURMWEIwQXVxTFp4VXBhVklDdTlmZlVHcFZScitnb3loaGYzRFF3NktxTENHcVI4NG9uQVpGZHIrQwpHQ2UwMWE2MHkxRG1hL1JNaG5FdzZhYmZGb2JnMlA5QTNmdlFRb2gvb3pNNkxsd2VRUkdCWTg0WWNXc3I3S2FLdHpGY09tcEg0TU41CldkWWdHcS95YXBpcWNyeFhTdEpMbmJzUS9MQk1RZVh0SFQxZUtKMmN6TCt6VWRxblIrV0VVd0lEQVFBQm8wSXdRREFkQmdOVkhRNEUKRmdRVXU2OStBajM2cHZFOGhJNnQ3amlZN05reU10UXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4dwpEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBQXJ4MVVhRXQ2NVJ1Mnl5VFVFVUFKTk1uTXZsd0ZUUG9DV09Bdm45c0tJTjlTQ1lQQk10CnJGYWlzTlorRVpMcExycWVMcHB5c2IwWlJHeGhOYUthdEJZU2FWcU00ZGMrcEJyb0x3UDBybUVkRUJzcXBJdDZ4ZjRGcHVIQTFzaisKbnE2UEs3bzltZmpZY3dsWVJtNm1uUFRYSjlPVjJqZURjaHpUYytDaVI1a0RPRjNWU1hrQUtSekg3SnNnSEFja2FWZDRzam44T29TZwp0Wng4amI4dWsySW50em5hRnhpdXZUd0phUCtFbXp6VjFnc0Q0MWVlRlBmUjYwL0l2WWNqdDdaSlEzbUZYTHJya2d1aHh1aG9xRXdXCnNScVpDdWhUTEpLN29Ra1lkUXhscUh2TEk3Y2F3aWlGd3h2LzBDdGk3NlI3Q1pHWVo0d1VBYzFvQm1waklYVURnSWlLYm9IR2hmS3AKcEMzbjlLVWtFRWVEeXMzMGpYbFlzUWFiNXhvcTJaMEIxNVI5N1FOS3l2RGI2S2tCUHZWV21ja2Vqa2s5dStVSnVlQlBTWkk5Rm9KQQp6TXhaeHVZNjdSSXVhVHhzbGJIOXFoMTdmNGErSGc0eVJ2djdFNDkxZjB5TFMwWmovZ0EwUUhEQnc3bWgzYVp3NGdTelFienBnSkhxClpKeDY0U0lEcVp4dWJ3NWxUMnlIaDE3emJxRDVkYVdiUU9oVHNpZWRTcm5BZHlHTi80ZnkzcnlNN3hmZnQwa0wwZkp1TUFzYURrNTIKN1JIODllbFdzbjIveDIwS2s0eWwwTUMySGI0NlRwU2kxMjVzQzhLS2ZQb2c4OFRrNWMwTnFNdVJrckY4aGV5MUZHbG1Eb0xuemM3SQpMYVpSZnlIQk5WT0ZCa3BkbjYyN0cxOTAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGM2pDQ0E4YWdBd0lCQWdJUUFmMXRNUHlqeWxHb0c3eGtEalVETFRBTkJna3Foa2lHOXcwQkFRd0ZBRENCaURFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUsKRXhWVWFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JTVTBFZ1EyVnlkR2xtYVdOaApkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3TWpBeE1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaURFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUsKRXhWVWFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JTVTBFZ1EyVnlkR2xtYVdOaApkR2x2YmlCQmRYUm9iM0pwZEhrd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNBRW1VWE5nN0Qyd2l6CjBLeFhEWGJ0elNmVFRLMVFnMkhpcWlCTkNTMWtDZHpPaVovTVBhbnM5cy9CM1BIVHNkWjdOeWdSSzBmYU9jYThPaG0wWDZhOWZaMmoKWTBLMmR2S3BPeXVSK09KdjBPd1dJSkFKUHVMb2RNa1l0SkhVWW1UYmY2TUc4WWdZYXBBaVBMeitFL0NIRkh2MjVCK08xT1JSeGhGbgpSZ2hSeTRZVVZEKzhNLzUrYkp6L0ZwMFl2VkdPTmFhblpzaHlaOXNoWnJIVW0zZ0R3RkE2Nk16dzNMeWVUUDZ2QlpZMUgxZGF0Ly9PCitUMjNMTGIyVk4zSTV4STZUYTVNaXJkY21yUzNJRDNLZnlJMHJuNDdhR1lCUk9jQlRrWlRtek5nOTVTK1V6ZVFjMFB6TXNOVDc5dXEKL25ST2FjZHJqR0NUM3NUSEROL2hNcTdNa3p0UmVKVm5pKzQ5VnY0TTBHa1BHdy96SlNack0yMzNia2Y2YzBQbGZnNmxackVwZkRLRQpZMVdKeEEzQmsxUXdHUk9zMDMwM3ArdGRPbXcxWE50QjF4TGFxVWtMMzlpQWlnbVRZbzYxWnM4bGlNMkV1TEUvcERrUDJRS2U2eEpNCmxYenphd1dwWGhhRHpMaG40dWdUbmN4Ymd0Tk1zKzFiLzk3bGM2d2pPeTBBdnpWVmRBbEoyRWxZR24rU051WlJrZzd6Sm4wY1RSZTgKeWV4REp0Qy9RVjlBcVVSRTlKbm5WNGVlVUI5WFZLZysvWFJqTDdGUVpRbm1XRUl1UXhwTXRQQWxSMW42QkI2VDFDWkdTbENCc3Q2KwplTGY4WnhYaHlWZUVIZzlqMXVsaXV0WmZWUzdxWE1Zb0NBUWxPYmdPSzZueVRKY2NCejhOVXZYdDd5K0NEd0lEQVFBQm8wSXdRREFkCkJnTlZIUTRFRmdRVVUzbS9XcW9yU3M5VWdPSFltOENkOHJJRFpzc3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBRnpVZkEzUDl3RjlRWmxsREhQRlVwL0wrTStaQm44YjJrTVZuNTRDVlZlVwpGUEZTUENlSGxDanRIem9CTjZKMi9GTlF3SVNieG10T3Vvd2hUNktPVldLUjgya1YyTHlJNDhTcUMvM3ZxT2xMVlNvR0lHMVZlQ2taCjdsOHdYRXNrRVZYL0pKcHVYaW9yN2d0Tm4zLzNBVGlVRkpWREJ3bjdZS251SEtzU2pLQ2FYcWVZYWxsdGl6OEkrOGpSUmE4WUZXU1EKRWc5ektDN0Y0aVJPL0ZqczhQUkYvaUt6NnkrTzB0bEZZUVhCbDIrb2RuS1BpNHcycjc4TkJjNXhqZWFtYng5c3BuRml4ZGpRZzNJTQo4V2NSaVF5Y0UweHlOTis4MVhIZnFuSGQ0YmxzakR3U1hXWGF2VmNTdGtOci8rWGVUV1lSVWMrWnJ1d1h0dWh4a1l6ZVNmN2ROWEdpCkZTZVVITTloNHlhN2I2Tm5KU0ZkNXQwZEN5NW9HenVDcit5RFo0WFVtRkYwc2JtWmdJbi9mM2daWEhsS1lDNlNRSzVNTnlvc3ljZGkKeUE1ZDl6WmJ5dUFsSlFHMDNSb0huSGNBUDlEYzFldzkxUHE3UDh5RjFtOS9xUzNmdVFMMzlaZWF0VFhhdzJld2gwcXBLSjRqanY5YwpKMnZoc0UvekIrNEFMdFJaaDh0U1FaWHE5RWZYN21SQlZYeU5XUUtWM1dLZHdybnVXaWgwaEtXYnQ1REhEQWZmOVlrMmRETFdLTUd3CnNBdmduRXpESE5iODQybTFSMGFCTDZLQ3E5TmpSSERFamY4dE03cXRqM3UxY0lpdVBoblBRQ2pZL01pUXUxMlpJdlZTNWxqRkg0Z3gKUSs2SUhkZkdqanhEYWgybkdONTlQUmJ4WXZuS2tLajkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDanpDQ0FoV2dBd0lCQWdJUVhJdVp4VnFVeGRKeFZ0N05pWURNSmpBS0JnZ3Foa2pPUFFRREF6Q0JpREVMTUFrR0ExVUVCaE1DClZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlUKYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQkZRME1nUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXdNakF4TURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JpREVMTUFrR0ExVUVCaE1DClZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlUKYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQkZRME1nUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUWFyRlJhcWZsb0krZDYxU1J2VThaYTJFdXJ4dFcyCjBlWnpjYTdkbk5ZTVlmM2JvSWtEdUFVVTdGZk83bDAvNGlHenp2ZlVpbm5nbzROK0xaZlFZY1R4bWR3bGtXT3JmekNqdEhEaXg2RXoKblBPL0xseFRzVit6ZlRKL2lqVGplWG1qUWpCQU1CMEdBMVVkRGdRV0JCUTY0UW1HMU04WndwWjJkRWwyM09BMXhtTmptakFPQmdOVgpIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakEyWjZFV0NOemtsd0JCCkhVNis0V01Cenp1cVFoRmtvSjJVT1FJUmVWeDdIZnBrdWU0V1FyTy9pc0lKeE96a3NVMENNUURwS21GSGpGSktTMDRZY1BiV1JOWnUKOVlPNmJWaTlKTmxXU09ydnhLSkdnWWhxT2tiUnFadE55V0hhMFYxWGFoZz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0hqQ0NBYVNnQXdJQkFnSVJZRmxKNENZdXUxWDVDbmVLY2ZsSzJHd3dDZ1lJS29aSXpqMEVBd013VURFa01DSUdBMVVFQ3hNYgpSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEUVNBdElGSTFNUk13RVFZRFZRUUtFd3BIYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFECkV3cEhiRzlpWVd4VGFXZHVNQjRYRFRFeU1URXhNekF3TURBd01Gb1hEVE00TURFeE9UQXpNVFF3TjFvd1VERWtNQ0lHQTFVRUN4TWIKUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRFFTQXRJRkkxTVJNd0VRWURWUVFLRXdwSGJHOWlZV3hUYVdkdU1STXdFUVlEVlFRRApFd3BIYkc5aVlXeFRhV2R1TUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVSMFVPbHZ0OVhiL3BPZEVoK0o4THR0VjdIcEk2ClNGa2M4R0l4TGNCNktQNGFwMXl6dHN5WDUwWFVXUHJSZDIxRG9zQ0haVFFLSDNyZDZ6d3pvY1dkVGFSdlFaVTRmOGtlaE92Um5rbVMKaDVTSEREcUZTbWFmblZtVFRaZGhCb1pLbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZApCZ05WSFE0RUZnUVVQZVlwU0p2cUI4b2hSRW9tM203ZTBvUFFuMWt3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4QU9WcEVzbHUyOFl4CnVnbEI0WmY0Ky8yYTRuMFN5ZTE4Wk5QTEJTV0xWdG1nNTE1ZFRndURuRnQyS2FBSkppRnFZZ0l3Y2RLMWoxenFPK0Y0Q1lXb2RaSTcKeUZ6OVNPOE5kQ0tvQ09KdXhVbk94d3k4cDJGcDhmYzc0U3JMK1N2elpwQTMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSWRlblRydXN0IENvbW1lcmNpYWwgUm9vdCBDQSAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVFDZ0ZDZ0FBQUFVVWp5RVMxQUFBQUFqQU5CZ2txaGtpRzl3MEJBUXNGQURCS01Rc3dDUVlEVlFRRwpFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1TY3dKUVlEVlFRREV4NUpaR1Z1VkhKMWMzUWdRMjl0YldWeVkybGhiQ0JTCmIyOTBJRU5CSURFd0hoY05NVFF3TVRFMk1UZ3hNakl6V2hjTk16UXdNVEUyTVRneE1qSXpXakJLTVFzd0NRWURWUVFHRXdKVlV6RVMKTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNjd0pRWURWUVFERXg1SlpHVnVWSEoxYzNRZ1EyOXRiV1Z5WTJsaGJDQlNiMjkwSUVOQgpJREV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ25VQm5lUDVrOTFETkc4VzlSWVlLeXFVK1BaNGxkCmhObFQzUXdvMmRmdy82NlZRM0taK2JWZGZJckJRdUV4VUhUUmdRMTh6WnNocTBQaXJLMWVobTd6Q1lvZldqSzlvdXVVK2VoY0N1ei8KbU5LdmNiTzBVNTlPaCsrU3ZMM3NUekl3aUVzWFhsZkVVOEwyQXBlTjJXSXJ2eVFmWW8zZnc3Z3BTMGw0UEpOZ2lDTDhtZG8yeU1LaQoxQ3hVQUdjMWJuTy9BbGp3cE4zbHNLSW1lc3JnTnFVWkZ2WDl0Kyt1UDBEMWJWb0UvYzQweWlUY2RDTWJYVE1URWwzRUFTWDJNTjBDClhaL2cxVWU5dE9zYm9idEpTZGlmV3dMeml1UWtrT1JpVDAvQnI0c09kQmVvMFhLSWFub0JTY3kwUm5uR0Y3SGFtQjRIV2ZwMUlZVmwKM1pCV3p2dXJwV0NkeEozNVVyQ0x2WWY1anlzakNpTjJPL2N6NGNrQTgybjVTNkxnVHJ4K2t6bUVCL2RFY0g3K0IxcmxzYXpSR016eQpOZVZKU1FqS1ZzazkrdzhZZllzN3dSUENUWS9KVHc0MzZSK2hEbXJmWWk3TE5RWlJlU3pJSlRqMCtrdW5pVnljMHVNTk9ZWktkSHpWCldZZkNQMDRNWEZMMFBmZFNndkhxbzZ6OVNUUWFLUE5CaURvVDd1amUvNWtkWDdyTDZCN3l1VkJnd0RIVGMrWHZ2cUR0TXd0MHZpQWcKeEdkczhBZ0RlbFdBZjBaT2xxZjBIajdoOXRnSjRUTmtLMlBYTWw2ZitjQjdEM2h2bDd5VG12bWNFcEI0ZW9DSEZkZHlkSnhWZEhpeAp1dUZ1Y0FTNlQ2QzZhTU43L3pId2N6MDlsQ3F4QzBFT29QNU5pR1ZyZVRPMDF3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU3VVFad05Qd0JvdnVwSHUrUXVjbVZNaU9Obll3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFBMnVrREwycGt0OFJIWVpZUjRuS00xZVZPOGx2T01Ja1BrcDE2NW9DT0dVQUZqdkxpNStVMUtNdGx3SAo2b2k2bVl0UWxOZUNnTjloQ1FDVHJRMFU1czdCOGplVWVMQmZuTE9pYzdpUEJaTTR6WTArc0xqN3dNK3g4dXd0TFJ2TTdLcWFzNnBnCmdoc3RPOE9FUFZlS2xoNmNkYmpUTU0xZ0NJT1EwNDVVOFUxbXdGMTBBMENqN29WK3doOTNuQWJvd2FjWVhWS1Y3Y25kSlo1dCtxbnQKb3pvMDBGbDcydTFROHpXLzdlc1VUVEhIWVBUYThZZWM0a2ppeHNVMyt3WVErblZaWmpGSEtkcDJtaHpwZ3E3dm1ybFI5NGdqbW1tVgpZanpsVllBMjExUUMvL0c1WGM3VUkyL1lSWVJLVzJYdmlRemRGS2NneXhpbEpiUU4rUUh3b3RMMEFNaDBqcUVxU0k1bDJ4UEU0aVVYCmZldStoMXNYSUZSUmswcFRBd3ZzWGNvejdXTDlSY2N2Vzl4WW9JQTU1dnJYL2hNVXB1MDlsRXBDZE5URGQxbHp6WTlHdmxVNDcvcm8Ka1RMcWwxZ0VJdDQ0dzh5OGJja3pPbW9LYVQrZ3lPcHlqNHhqaGlPOWJUeVducFhnU1V5cW9ya3FHNXcyZ1hqdHcraEc0aVpaUkhVZQoyWFdKVWMwUWhKMWhZTXRkK1pjaVRZNlk1dU4vOWx1N3JzM0tTb0ZyWGd2elVlRjBLK2wrSjZmWm1VbE8rS1dBMnlVUEhHTmlpc2t6CloyczhFSVBHcmQ2b3pSYU9qZkFITjNHZjhxdjhRZlhCaSt3QU4xMEo1VTZBNy9xeFhEZ0dwUnRLNGR3NExUemNxeCtRR3RWS25PN1IKY0d6TTd2UlgrQmk2aEc2SAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWmpDQ0EwNmdBd0lCQWdJUUNnRkNnQUFBQVVVanowWjhBQUFBQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJOTVFzd0NRWURWUVFHCkV3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNvd0tBWURWUVFERXlGSlpHVnVWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnYKY2lCU2IyOTBJRU5CSURFd0hoY05NVFF3TVRFMk1UYzFNek15V2hjTk16UXdNVEUyTVRjMU16TXlXakJOTVFzd0NRWURWUVFHRXdKVgpVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNvd0tBWURWUVFERXlGSlpHVnVWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnZjaUJTCmIyOTBJRU5CSURFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMySXBUOHBFaXY2RWRyQ3ZzbmR1VHkKUDRvN2Vrb3NNU3FNamJDcHd6RnJxSGQyaENhMnJJRkNEUWpyVlZpN2V2aThaWDN5b0cyTHFFZnBZblllRWU0SUZOR3lSQmIwNnRENgpIaTllMjh0elFhNjhBTEJLSzBDeXJPRTdTOEl0bmVTaG0rd2FPaDd3Q0xQUTVDUTFCNStjdE1sU2Jkc0h5bysxVy9DRDgwL0hMYVhJCnJjdVZJS1F4S0ZkWVd1U05HNXFybmcwTThnb3pPU0k1Q3BjdTgxTjN1VVJGL1lUTE5pQ0JXUzJhYjIxSVNHSEtUTjlUMGE5U3ZFU2YKcXk5cmczTHZkWURhQmpNYlhjamFZOFpOemF4bU1jM1IzajZIRURiaHVhUjY3MkJRc3N2S3BsYmdONityTkJNNUplZzVadVNZZXFvUwptSnhaWm9ZK3JmR3d5ajRHRDN2d0VVczNvRVJ0ZTh1b2pISDAxYldSTnN6d0ZjWXIzbEVYc1pkTVVEMnhsVmw4QlgwdElkVUF2d0ZuCm9sNTdwbHp5OXlMeGtBMlQyNnBFVVdiTWZYWUQ2MnFvS2pnWmwzWU5hNHBoK2J6MjduYjljQ3ZkS1R6NENoNWJRaHlMVmk5Vkd4eWgKTHJYSEZ1YjRxanlTam1tMkFjRzFocDJKRHdzNGxGVG82dHllUFNXOFV5YnQxYXM1cXNWQVRGU3JzclRaMmZqWGN0c2N2RzI5WlYvdgppRFVxWmkvdTlyTmw4RE9OZkpoQmFVWVBReHhwK3B1MTBHRnF6Y3BMMlV5UVJxc1ZXYUZIVkNrdWd5aGZITUtpcTNJWEFBYU9SZXlMCjRqTTlmOW9aUk9SaWNzUGZJc2J5VnRUZFg1Vnk3VzFmOTBnRFcvM0ZLcUQyY3lPRUVCc0I1d0lEQVFBQm8wSXdRREFPQmdOVkhROEIKQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVNDNIZ250aW5RdG5iY1pGcmxKUHJ3NlBSRktNdwpEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBRWY2M1Fxd0VaRTRyVTFkOStVT2wxUVpna2lIVkl5cVpKbllXdjZJQWNWWXBabXhJMVFqCnQyb2RJRmZsQVdKQkY5TUoyM1hMYmxTUWRmNGFuNEVLd3QzWDl3blFXM0lWNUI0SmFqMHo4eUdhNWhWK3JWSFZEUkR0ZlVMQWorN0EKbWdqVlFkWmNEaUZwYm9CaERoWEF1TS9GU1JKU3pMNDZ6TlF1T0FYZU5mMGZiN2lBYUpnOVRhREtRR1hTYzN6MWk5a0tsVC9ZUHlOdApHdEVxSkJuWmhiTVg3M2h1cVZqUkk5UEhFKzF5Slg5ZHNYTncwSDhHbHdtRUtZQmhIZnBlLzNPc29PT0p1Qnh4RmNiZU1YOFMzT0Z0Cm02L242SjkxZUV5clJqdWF6cjhGR0YxTkZUd1dtaGxRQkpxeW1tOWxpMUpmUEZnRUtDWEFabUV4ZnJuZ2Ria2FxSUhXY2hlenhRTXgKTlJGNGVLTGc2VENNZjREZldOODh1aWVXNG9BMGJlT1kwMlFuckVoK0tIZGN4aVZoSmZpRkRHWDZ4REl2cFpnRjVQZ0xaeFlXeG9LNApNaG41K2JsNTNCL042NityRHQwYjIwWGtldWNDNHBWZC9HbndVMmxobFhWNUMxNVY1amdjbEtsWk01N0ljWFI1ZjFHSnRzaHF1RERJCmFqakRicDdoTnhicUJXSk1XeEpIN2FlMHMxaFd4MG56ZnhKb0NURng4RzM0VGtmNzFvWHV4VmhBR2FRZHAvbExRemZjYUZwUHordkMKWkhUZXRCWFo5RlJVR2k4YzE1ZHhWSkNPMlNDZFV5dC9xNC9pNmpDOFVEZnY4VWUxZlh3c0JPeG9uYlJKUkJEMGNrc2NaT2Y4NW11UQozV2w5YWYwQVZxVzNyTGF0dDhvK0FlK2MKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVQakNDQXlhZ0F3SUJBZ0lFU2xPTUtEQU5CZ2txaGtpRzl3MEJBUXNGQURDQnZqRUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlYKQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjNkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm5ZV3d0ZEdWeQpiWE14T1RBM0JnTlZCQXNUTUNoaktTQXlNREE1SUVWdWRISjFjM1FzSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnCmIyNXNlVEV5TURBR0ExVUVBeE1wUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6SXcKSGhjTk1Ea3dOekEzTVRjeU5UVTBXaGNOTXpBeE1qQTNNVGMxTlRVMFdqQ0J2akVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVApEVVZ1ZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzZDNjdVpXNTBjblZ6ZEM1dVpYUXZiR1ZuWVd3dGRHVnliWE14Ck9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNUlFVnVkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXMKZVRFeU1EQUdBMVVFQXhNcFJXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSekl3Z2dFaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM2aExaeTI1NE1hK0taNlRBQnAzYnFNcmlWUVJySjJtRk9XSExQCi92YUNlYjl6WVFZS3BTZllzMS9UUlU0Y2N0Wk9Ndkp5aWcvM2d4blFhb0NBQUVVZXNNZm5tcjhTVnljY28yZ3ZDb2U5YW1zT1htWHoKSEhmVjFJV05jQ0cwc3pMbmk2TFZoamtDc2JqU1I4N2t5VW5FTzZmZSsxUjlWNzd3Nkc3Q2ViSTZDMVhpVUpnV01oTmNMM2hXd2NLVQpzL0phNUNlYW55VFh4dXpRbXlXQzQ4ekN4RVhGakpkNkJtc3FFWitwQ201SU8yL2IxQkVaUXZlUEI3LzFVMStjUHZRWExPWnByRTR5ClRHSjM2cmZvNWJzMHZCbUxycHhSNTdkK3RWT3hNeUxsYmM5d1BCcjY0cHRudG9QMGphV3ZZa3hONEZpc1pEUVNBL2kyalpSakpLUngKQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJxY2laNgowQjd2ZmVjN2FWSFViSTJma0JKbXF6QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFlWjhkbHNhMmVUOGlqWWZUaHdNRVlHcHJtaTVaCmlYTVJyRVBSOVJQL2pUa3J3UEs5VDNDTXFTL3FGOFFMVko3VUc1YVlNenlvcldLaUFIYXJXV2x1QmgxK3hMbEVqWml2RXRSaDJ3b1oKUmtmejYvZGp3VUFGUUtYU3QvUzFtamEvcVloMmlBUlZCQ3VjaDM4YU56eCtMYVVhMk5TSlhzcTlyRDFzMkcydjFmTjJEODA3aURnaQpuV3lUbXNROXY0SWJaVCttRDEycS9PV3lGY3ExcmNhOFBkQ0U2T29HY3JCTk9USjR2ejRSbkF1a25ab2g4L0NiQ3pCNDI4SGNoMFArCnZHT2F5c1hDSE1uSGpmODdFbGdJNXJZOTdIb3NUdnVEbHM0TVBHbUhWSE9rYzhLVC8xRVFyQlZVQWRqOEJiR0pvWDkwZzVwSjE5eE8KZTRwSWI0dEY5Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMrVENDQW9DZ0F3SUJBZ0lOQUthTGVTa0FBQUFBVU5DUitUQUtCZ2dxaGtqT1BRUURBekNCdnpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCM2QzY3VaVzUwY25WemRDNXVaWFF2YkdWbgpZV3d0ZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1ERXlJRVZ1ZEhKMWMzUXNJRWx1WXk0Z0xTQm1iM0lnWVhWMGFHOXlhWHBsClpDQjFjMlVnYjI1c2VURXpNREVHQTFVRUF4TXFSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKSUMwZ1JVTXhNQjRYRFRFeU1USXhPREUxTWpVek5sb1hEVE0zTVRJeE9ERTFOVFV6Tmxvd2diOHhDekFKQmdOVkJBWVRBbFZUTVJZdwpGQVlEVlFRS0V3MUZiblJ5ZFhOMExDQkpibU11TVNnd0pnWURWUVFMRXg5VFpXVWdkM2QzTG1WdWRISjFjM1F1Ym1WMEwyeGxaMkZzCkxYUmxjbTF6TVRrd053WURWUVFMRXpBb1l5a2dNakF4TWlCRmJuUnlkWE4wTENCSmJtTXVJQzBnWm05eUlHRjFkR2h2Y21sNlpXUWcKZFhObElHOXViSGt4TXpBeEJnTlZCQU1US2tWdWRISjFjM1FnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdApJRVZETVRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCSVFUeWRDNmJVRjc0bXpRNjFWZlpnSWFKUFJiaVdsSDQ3akNmZkh5CkFzV2ZvUFpiMVlzR0dZWlBVeEJ0QnlRbm9hRDQxVWNaWVV4OXlwTW42blFNNzIrV0NmNWo3SEJkTnExbmQ2N0puWHhWUkRxaVkxRWYKOWVOaTFLbEhCejdNSUtOQ01FQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRQpGTGRqNXhyZGpla0lwbFdEcE9CcVVFRmxFVUpKTUFvR0NDcUdTTTQ5QkFNREEyY0FNR1FDTUdGNTJPVkNSOThjcmxPWkY3WnZISDNoCnZ4R1UwUU9JZGVTTmlhU0tkMGJlYldIdkF2WDd0ZC9NL2s3Ly9xbm1wd0l3VzVuWGhUY0d0WHNJL2VzbmkwcVUrZUg2cDQ0bUNPaDgKa21odGM5aHZKcXdoQXJpWnR5WkJXeVZncnRCSUd1NEcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ0ZDQSBFViBST09UCj09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmpUQ0NBM1dnQXdJQkFnSUVHRXJNMWpBTkJna3Foa2lHOXcwQkFRc0ZBREJXTVFzd0NRWURWUVFHRXdKRFRqRXdNQzRHQTFVRQpDZ3duUTJocGJtRWdSbWx1WVc1amFXRnNJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1SVXdFd1lEVlFRRERBeERSa05CCklFVldJRkpQVDFRd0hoY05NVEl3T0RBNE1ETXdOekF4V2hjTk1qa3hNak14TURNd056QXhXakJXTVFzd0NRWURWUVFHRXdKRFRqRXcKTUM0R0ExVUVDZ3duUTJocGJtRWdSbWx1WVc1amFXRnNJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1SVXdFd1lEVlFRRApEQXhEUmtOQklFVldJRkpQVDFRd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURYWFd2TkVEOGZCVm5WCkJVMDNzUTdzbUN1T0ZSMzZrMHNYZ2lGeEVGTFhVV1J3RnNKVmFVMk9GVzJmdnd3Ynd1Q2paOVlNck04aXJxOTNWQ3BMVElwVFVuckQKN2k3ZXMzRWx3ZWxkUGU2aEw2UDNLanpKSXgxcXF4MmhwL0h6N0tEVlJNOFZ6M0l2SFdPWDZKbjUvWk9rVklCTVV0UlNxeTVKMzVETgp1RisrUDk2aHlrMGcxQ1hvaENsVHQ3R0lILy82MnBDZkNxa3RRVCt4OFJncDdoWlpMRFJKR3FnRzE2aUkwZ055ZWpMaTZtaE5iaXlXClpYdktXZnJ5NHQzdU1Dejd6RWFzeEdQcmIzODJLelJ6RXBSLzM4d21udkZ5WFZCbFdZOXBzNGRlTW0vREdJcTFsWSt3ZWpmZVdrVTcKeHpiaDcyZlJPZE9YVzNOaUdVZ3RoeHdHKzNTWUlFbHo4QVhTRzdHZ283Y2JjTk9JYWJsYTFqajBZdHdsaTNpLytPaCt1RnpKbFU5ZgpweTI1SUd2UGE5MzFEZlNDdC9TeVppNFFLUGFYV251V0ZvOEJHUzFzYm44NVdBWmtnd0dEZzhOTmt0MHl4b2VrTitrV3pxb3RhSzhLCmdXVTZjTUdiclUxdFZNb3FMVXVGRzdPQTVuQkZEV3RlTmZCL083aWM1QVJ3aVJJbGs5b0ttU0pnYW1OZ1RuWUdtRTY5ZzYwZFdJb2wKaGRMSFpSNHRqc2JmdHNiaGY0b0VJUlVwZFBBK25KQ2REQzd4aWo1YXFnd0pIc2ZWUEtQdGw4TWVOUG80K1FnTzQ4QmRLNFBSVm1ySgp0cWhVVXk1NE1tYzlnbjkwMFB2aHRnVmd1WERiamd2NUUxaHZjV0FRVWhDNXdVRUo3M0lmWnpGNC81WUZqUUlEQVFBQm8yTXdZVEFmCkJnTlZIU01FR0RBV2dCVGovaTM5S05BTHRicTJvc1MvQnFvRmpKUDdMekFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIKL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVNC80dC9TalFDN1c2dHFMRXZ3YXFCWXlUK3k4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQgpBQ1hHdW12cmg4dmVnam1XUGZCRXAydUVjd1BlblN0UHVpQi92SGl5ejVld0c1enoxM2t1OVVpMjB2c1hpT2JUZWovdFV4UFE0aTlxCmVjc0FJeWptSGpkWE5ZbUV3blpQTkRhdFo4UE9RUWFJeGZmdTJCcTQxZ3QvVVArVHFoZExqT3p0VW1DeXBBYnFUdXYwYXhuOTYvVWEKNENVcW10ekhRVGIzeUhRRmhEbVZPZFlMTzZRbitnallYQjc0QkdCU0VTZ29BLy92VTJZQXBVbzBGbVo4L1Fta3JwNW5HbTlCQzJzRwpFNXVQaG5FRnRDK05pV1l6S1haVW1oSDRKL3F5UDVIZ3pnMGI4ekFhcmI4aVhSdlR2eVVGVGVHU0duK1puenhFazhyVVFFbHNnSWZYCkJEckRNbEkxRGxiNHBkMTl4SXNORVI5VHl4NnlGN1pvZDFyZzFNdklCNjcxT2k2T043ZlFBVXRES1hlTU9aZVBnbHI0VWVXSm9Cam4KYUg5ZENpNzdvMGNPUGFZamVzWUJ4NC9JWHI5dGdGYStpaVM2TStxZjRUSVJudkhTVDREMkcwQ3ZPSjRSVUhsekVoTE41bXlkTEloeQpQRENCQnBFaTZsbXQyaGt1SXNLTnVZeUg0R2E4Y3lOZklXUmpnRWoxb0R3WVBaVElTRUVkUUxwZS92NVdPYUhJejE2ZUdXUkdFTm9YCmtiY0ZnS3lMbVpKOTU2TFlCd3MySitkSWVXQ0t3OWNUWFBoeVFOOUt5OCtaQUFvQUN4R1YybFpGQTRnS24yZlExWG14cUkxQWJRM0MKZWtENjgxOWtSNUxMVTdtN1djNVAvZEFWVXdIWTMrdlo1bmJ2MENPN082bDVzOVVDS2MySm81WVBTalhuVGtMQWRjMEh6K1lzNjNzdQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpPSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdCIENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0VENDQXAyZ0F3SUJBZ0lRZHJFZ1VuVHdoWWRHcy9nakd2YkN3REFOQmdrcWhraUc5dzBCQVFzRkFEQnRNUXN3Q1FZRFZRUUcKRXdKRFNERVFNQTRHQTFVRUNoTUhWMGxUWlV0bGVURWlNQ0FHQTFVRUN4TVpUMGxUVkVVZ1JtOTFibVJoZEdsdmJpQkZibVJ2Y25ObApaREVvTUNZR0ExVUVBeE1mVDBsVFZFVWdWMGxUWlV0bGVTQkhiRzlpWVd3Z1VtOXZkQ0JIUWlCRFFUQWVGdzB4TkRFeU1ERXhOVEF3Ck16SmFGdzB6T1RFeU1ERXhOVEV3TXpGYU1HMHhDekFKQmdOVkJBWVRBa05JTVJBd0RnWURWUVFLRXdkWFNWTmxTMlY1TVNJd0lBWUQKVlFRTEV4bFBTVk5VUlNCR2IzVnVaR0YwYVc5dUlFVnVaRzl5YzJWa01TZ3dKZ1lEVlFRREV4OVBTVk5VUlNCWFNWTmxTMlY1SUVkcwpiMkpoYkNCU2IyOTBJRWRDSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMkJlM0hFb2tLdGFYCnNjcmlIdnQ5T08rWTliSTVtRTRudUJGZGU5SWxsSWlDRlNacUd6RzdxRnNoSVN2WUQwNmZXdkd4V3VSNTFqSWpLK0ZUekpsRlhIdFAKcmJ5L2gwb0xTNWRhcVBaSTdIMTdEYzBoQnQrZUZmMUJpa2kzSVBTaGVodFgxRjFRLzdwbjJDT1pIOGcvNDk3L2IxdDNzV3R1dU1sawo5K0hLUVVZT0tYSFF1U1A4eVlGZlR2ZHYzNytFclhOa3U3ZENqbW4yMUhZZGZwMm51RmVLVVdkeTE5U291SlZVUUhNRDl1cjA2LzRvClFuYy9uU01ic3JZOWdCUUhUQzVQOTlVS0ZnMjlaa00zZmlORGVjTkFodlZNS2RxT21xME5wUVNIaUI2RjQrbFQxWnZJaXdOamVPdmcKR1VwdXV5OXJNMlJZazYxcHY0OGI3NEpJeHdJREFRQUJvMUV3VHpBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFkQmdOVkhRNEVGZ1FVTlEvSU5tTmU0cVBzK1R0bUZjNVJVdU9SbWowd0VBWUpLd1lCQkFHQ054VUJCQU1DQVFBd0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnRUJBRUJNKzRleW1ZR1FmcDNGc0xBbXpZaDdLektOYnJnaGNWaVhmYTQzRks4KzUvZWE0bjMyY1ppWkJLcEQKZEhpajQwbGhQbk9NVFpUZytYSEV0aFlPVTNnZjFxS0hMd0k1Z1NrOHJ4V1lJVEQrS0pBQWpOSGh5L3BleVAzNEVFWTdvbmhDa1JkMApWUXJlVUdkTlp0R24vLzNad0xXb280ck9adlVQUTgybksxZDdZMFpxcWk1UzJQVHQ0VzJ0S1pCNFNMcmhJNnFqaWV5MXE1YkF0RXVpCkhaZWVldkp1UUhIZmFQRmxUYzU4QmQ5VFphbWw4TEdYQkhBVlJnT1kxTksvVkxTZ1dIMVNiOXBXSm1MVTJOdUpNVzhjOENMQzAySWMKTmMxTWFSVlVHcENZM3VzZVg4cDN4OHVPUFVOcG5KcFkwQ1E3M3h0QWxuNDFyWUhIVG5HNmlCTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU1pBRklSIFJPT1QgQ0EyCj09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGNqQ0NBbHFnQXdJQkFnSVVQb3BkQit4VjBqTFZ0K08yWHdIckxkemsxdVF3RFFZSktvWklodmNOQVFFTEJRQXdVVEVMTUFrRwpBMVVFQmhNQ1VFd3hLREFtQmdOVkJBb01IMHR5WVdwdmQyRWdTWHBpWVNCU2IzcHNhV042Wlc1cGIzZGhJRk11UVM0eEdEQVdCZ05WCkJBTU1EMU5hUVVaSlVpQlNUMDlVSUVOQk1qQWVGdzB4TlRFd01Ua3dOelF6TXpCYUZ3MHpOVEV3TVRrd056UXpNekJhTUZFeEN6QUoKQmdOVkJBWVRBbEJNTVNnd0pnWURWUVFLREI5TGNtRnFiM2RoSUVsNlltRWdVbTk2YkdsamVtVnVhVzkzWVNCVExrRXVNUmd3RmdZRApWUVFEREE5VFdrRkdTVklnVWs5UFZDQkRRVEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzN2RDVRCnFFdk5RTFhPWWVlV3lyU2gyZ3dpc1BxMWUzWUFkNHdMejMyb2hzd21VZVFnUFlVTTFsamo1L1FxR0ozYTBhNG03dXRUM1BTUTFoTksKREpBOHcvVGEwbzROa2pyY3NiSC9PTjdEdWkxZmdMa0N2VXFkR3crMHc4TEJad1BkM0J1Y1BiT3czZ0FlcURSSHU1cnIvZ3NVdlRhRQoyZzBndi9wYnk2a1dJSzA1WU80dmRiYm5sNXo1UHYxK1RXOU5MKytJRFdyNjNmRTliaUNsb0JLMFRYQzV6dGR5TzRtVHA0Q0VIQ2RKCmNrbTEvenVWbnNITXlBSHM2QTZLQ3BibnM2YUg1ZGI1QlNzTmwwQndQTHFzZFZxYzFVMmRBZ3JTUzV0bVMwWUhGMld0bjJ5SUFOd2kKaWVEaFpOUm52REY1WVR5N3lrSE5YR29BeUR3NGpsaXZBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUApBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlF1RnFsS0dMWEx6UFZ2VVBNalgvaGQ1Nnp3eURBTkJna3Foa2lHOXcwQkFRc0ZBQU9DCkFRRUF0WFA0QTl4Wld4MTI2YU1xZTVBb3NrM0FNMCtxbXJIVXVPUW4vNm1XbWM1RzRHMThUS0k0cEFadzhQUkJFZXcvUjQwL2NvZjUKTy8ya2J5dFRBT0QvT2JscUJ3N3JIUnoyb25LUXk0STlFWUtMMHJ1ZktxOGg1bU9HblhrWjcvZTdERFdRdzRydFR3LzF6QkxacEQ2NwpvUHdnbFY5UEppOFJJNE5PZFFjUHY1dlJ0QjNwRUFUK3ltQ1Bva3k0cmMvaGtBL05yZ3JIWFh1M1VOTFVZZnJWRmR2WG40ZFJWT3VsCjQrdkpoYUFsSURmN2pzNE1OSVRoUElHeWQwNURwWWhmaG1laFBlYTBYR0cyUHR2K3R5akZvZ2V1dGNyS2pTb1M3NWZ0d2pDa3lTcDYKKy9OTkl4dVpNelNnTHZXcEN6L1VYZUhQaEovaUdjSmZpdFlnSHVOenR3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjBqQ0NBN3FnQXdJQkFnSVFJZGJRU2s4bEQ4a3lOL3lxWGhLTjZUQU5CZ2txaGtpRzl3MEJBUTBGQURDQmdERUxNQWtHQTFVRQpCaE1DVUV3eElqQWdCZ05WQkFvVEdWVnVhWHBsZEc4Z1ZHVmphRzV2Ykc5bmFXVnpJRk11UVM0eEp6QWxCZ05WQkFzVEhrTmxjblIxCmJTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRFa01DSUdBMVVFQXhNYlEyVnlkSFZ0SUZSeWRYTjBaV1FnVG1WMGQyOXkKYXlCRFFTQXlNQ0lZRHpJd01URXhNREEyTURnek9UVTJXaGdQTWpBME5qRXdNRFl3T0RNNU5UWmFNSUdBTVFzd0NRWURWUVFHRXdKUQpUREVpTUNBR0ExVUVDaE1aVlc1cGVtVjBieUJVWldOb2JtOXNiMmRwWlhNZ1V5NUJMakVuTUNVR0ExVUVDeE1lUTJWeWRIVnRJRU5sCmNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNU1F3SWdZRFZRUURFeHREWlhKMGRXMGdWSEoxYzNSbFpDQk9aWFIzYjNKcklFTkIKSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUM5K1hqNDV0V0FER1NkaGh1V1pHYy9Jam9lZFFGOQo3L3RjWjR6SnpGeHJxWkhtdVVMbElFdWIycHQ3dVpsZDJadUFTOWVFUUNzbjAraTZNTHMrQ1JxblNaWHZLMEFrd3BmSHArNmJKZStvCkNnQ1hoVnFxbmR3cHllSTFCK3R3VFVyV3diTld1S0ZCT0p2Uit6Ri9qK0JmNGJFL0Q0NFdTV0RYQm8wWSthb21FS3NxMDlEUlo0MGIKUnI1SE1OVXVjdEhGWTlyblkzbEVma3RqSkltR0xqUS9LVXhTaXlxbndPS1JLSW01d0Z2NUhkbm5KNjMvbWdLWHdjWlFrcHNDTEwycAp1VFJaQ3IrRVN2L2Yvck9mNjltZTRKZ2o3S1pyZHhZcTI4eXRPeHlraDl4R2MxNFpZbWhGVitTUWdrSzdRdGJ3WWVEQm96MW1vMTMwCkdPNkl5WTBYUlNtWk1uVUNNZTRwSnNockF1YTFZa1YvTnhWYUkyaUoxRDdlVGlldzhFQU12RTBYeTAyaXN4N1FCbHJkOXBQUFYzV1oKOWZxR0dtZDRzNytXL2pUY3ZlZFNWdVd6NVhWNzEwR1JCZHhkYWVPVkRVTzUvSU9XT1pWN2JJQmFUeE55eHRkOUtYcEV1bEtrS3RWQgpSZ2tnL2lLZ3Rsc3dqYnlKRE5YWGNQaUhVdjNhNzZ4UkxnZXpUdjdRQ2Rwdzc1ajZWdVp0MjdWWFM5emxMQ1VWeUo0dWVFNzQycHllCmhpektWL01hNWNpU2l4cUNsbnJEdkZBU2FkZ09Xa2FMT3VzbStpUEp0ckNCdmtJQXBQalcvakF1eDlKRzl1V09kZjN5ekxuUWgxdk0KQmhCZ3U0TTF0MTVuM2tmc21VanhwS0VWL3EyTVlvNDVWVTg1RnJteFk1My90d0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUIwR0ExVWREZ1FXQkJTMm9WUTVBc09nUDQ2S3ZQclUrQnltMFRvTy9UQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0RRWUpLb1pJCmh2Y05BUUVOQlFBRGdnSUJBSEdsRHM3azZiOC9PTldKV3NRQ1lmdE14UlFYTFl0UFUyc1FGL3hsaE1jUVNaRGUyOGNtazRnbWIzRFcKQWw0NW9QZVBxNWExcFJOY2dSUnREb0dDRVJ1S1RzWlBwZDFpSGtUZkNWbjBXM2NMTittTElNYjRDazR1V0J6ck05RFBobURKMnZ1QQpMNTVNWUlSNFBTRmsxdnRCSHhnUDU4bDFjYjI5WE40MGh6NUJzQTcydWRZL0NST1dGQy9lbWgxYXVWYk9OVHF3WDNCTlh1TXA4U01vCmNsbTJxOEtNWmlZY2R5d21kaldMS0tkcG9Qazc5U1BkaFJCMHlaQURWcEhucjdwSDFCS1hFU0xqb2ttVWJPZTNsRXU2TGFUYU00dE0KcGtUL1dqekdIV1RZdFRIa3BqeDZxRmNMMisxaEdzdnh6bk4zWTZTSGIweFJPTmJrWDhlZnRvRXE1SVZJZVZoZU8vamJBb0pud1RuYgp3M1JMUFRZZStTbVRpR2hicUVRWklmQ242SUVOTE9pVE5yUTNzc3F3R3laNm1pVWZtcHFBbmtzcVAvdWptdjV6TW5IQ25zWnk0WXBvCkovSGtEN1RFVEtWaGsvaVhFQWNxTUNXcHVjaHh1TzlvekMxKzllQitENEtvYjdhNmJJTkRkODJLa2hlaG5sdDRGajFGNGpOeTNlRm0KeXBuVHljVW0vUTFvQkVhdXR0bWJqTDRadnJIRzhobmpYQUxLTE5odlNnZlp5VFhhUUhYeXhLY1piNTVDRUpoMTVwV0xZTHp0eFJMWAppczdWbUZ4V2xnUEY3bmNHTmYvUDVPNC9FMkh1MjlvdGhmRE5ycDJ5R0FsRnc1S2hjaGY4UjdhZ0N5enh4TjVEYUFocVh6dndkbVA3CnpBWXNwc2JpRHJXNXZpU1AKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHQ3pDQ0EvT2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQnBqRUxNQWtHQTFVRUJoTUNSMUl4RHpBTkJnTlZCQWNUCkJrRjBhR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWtJRkpsYzJWaGNtTm9JRWx1YzNScGRIVjAKYVc5dWN5QkRaWEowTGlCQmRYUm9iM0pwZEhreFFEQStCZ05WQkFNVE4waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObApZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdVbTl2ZEVOQklESXdNVFV3SGhjTk1UVXdOekEzTVRBeE1USXhXaGNOTkRBd05qTXdNVEF4Ck1USXhXakNCcGpFTE1Ba0dBMVVFQmhNQ1IxSXhEekFOQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWcKUVdOaFpHVnRhV01nWVc1a0lGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3hRREErQmdOVgpCQU1UTjBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nVW05dmRFTkJJREl3Ck1UVXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFEQytLay9HNG44UER3RVhUMlFOckNST25rOFpscnYKYlRrQlNScTB0ODkvVFNOVHQ1QUE0eE1xS0tZeDhaRUE0eWpzcmlGQnpoL2EvWDBTV3dHREQ3bXdYNW5oOGhLRGdFMEdQdCtzcitlaAppR3N4ci9DTDBCZ3p1TnRGYWpUMEFvQWtLQW9DRlpWZWRpb05tVG9VVy9iTHkxTzhFMDBCaURlVUpSdEN2Q0xZanFPV1hqclpNdHMrCjZQQVFaZTEwNFMrbmZLOG5OTHNwZlp1Mnp3bkk1ZE1LL0lobFpYUUszSE1jWE0xQXNSelV0b1NNVEZEUGFJNm9XYTdDSjA2Q29qWGQKRlBRZi83SjMxWWN2cW01OUpDZm54c3NtNXVYK1p3ZGoyRVVOM1RwWlpUbFllcEtaY2oyY2hGNklJYmpWOUN6ODJYQlNUM2k0dlR3cgppNVdZOWJQUmFNOGdGSDVNWEYvbmkrWDFOWUVaTjljUkNMZG12dE5Lem9OWEFEckRnZmdYeTVJMlhkR2oySFViNFlzbjZucElRZjFGCkdRYXRKNWxPd1hCSDNiV2ZnVk1TNWJHTVNGMHhReGZqak1aNlk1WkxLVEJPaEU1aUdWNDh6cGVRcFg4QjY1M2crSXVKM1NXWVBaSzIKZnUvWjhWRlJmUzBteUdsWlllQ3NhcmdxTmhFRWVsQzlNb1MrTDl4eTFkY2RGa2ZrUjJZZ1AvU1d4YStPQVhxbEQzcGs5UTBZaDltdQppTlg2aE1FNndHa29MZklOYUZHcTQ2VjN4cVNRRHFFM2l6RWpSOEVKQ090dTkzaWIxNEw4aENDWlNSbTJFa2F4KzBWVkZxbWpaYXljCkJ3L3FhOXdmTGdaeTdJYUlFdVF0MjE4RkwrVHdBOU1tTStlQXdzMUNvUmMwQ3dJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVWNSVm55TWpKdlhWZGN0QTRHR3FkODNFa1ZBc3dEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUhXN2JWUkxxaEJZUmpUeVl0Y1dObDBJWHRWc3lJZTl0QzVHOGpINGZPcEN0Wk1XVmR5aERCS2cybUYrCkQxaFljMlJ5eCtoRmp0eXA4aVkveG5tTXNWTUlNNEd3VmhPKzVsRmMySnNLVDB1Y1ZsTUM2VS8yRFdEcVRVSlY2SHdiSVNIVEd6ck0KZC9LNGtQRm94L2xhL3ZvdDlML0o5VVViempnUUtqZUtlYU8wNHdsc2hZYVQvNG1XSjNpQmoyZmpSblJVanRrTmFlSks5RTEwQS8reQpkKzJWWjVma3NjV3J2Mm9qNk5TVTRrUW9Zc1JMNHZEWTRpbHJHbkIrSkdHVGUwOERNaVVOUlNRcmxyUkdhcjlLQy9lYWo4R3NHc1ZuCjgyODAwdnB6WTR6dkZyQ29wRVlxK09zUzdISzA3L2dyZm94U3dJdUVWUGt2UHVOVnFOeG1zZG5oWDlpempGazBXYVNyVDJ5N0h4amIKZGF2WXk1TE5sRGhoRGdjR0gwdEdFUEVWdm8yRlhEdEtLNEY1RDdScG4wbFFsMDMzRGxaZHdKVnF3amJERzJqSjlTcmNSNXErc3M3RgpKZWo2QTduYStSWnVrWVQxSENqSS9DYk0xeHlRVnFkZmJ6b0V2TTE0aVF1T0R5K2pxaytpR3hJOUZnaEFEL0ZHVE5lcWV3akJDdlZ0Cko5NENqOHJEdFN2SzZldklJVk00cGN3NzJIYzNNS0pQMlcvUjhrQ3RRWG9YeGRaS05ZbTNRZFY4aG45VlRZTktwWE1nd0RxdmtQR2EKSkk3WmpuSEtlN2lHMnJLUG1UNGRFdzBTRWU3VXEvRHBGWFlDNU9EZnFpQWVXMkdGWkVDcGtKY05yVlBTV2gySGFnQ1haV0swdm05cQpwL1VzUXUweXJiWWhucjY4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDd3pDQ0FrcWdBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakNCcWpFTE1Ba0dBMVVFQmhNQ1IxSXhEekFOQmdOVkJBY1RCa0YwCmFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXUKY3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4UkRCQ0JnTlZCQU1UTzBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKagphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1JVTkRJRkp2YjNSRFFTQXlNREUxTUI0WERURTFNRGN3TnpFd016Y3hNbG9YRFRRd01EWXpNREV3Ck16Y3hNbG93Z2FveEN6QUpCZ05WQkFZVEFrZFNNUTh3RFFZRFZRUUhFd1pCZEdobGJuTXhSREJDQmdOVkJBb1RPMGhsYkd4bGJtbGoKSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUTJWeWRDNGdRWFYwYUc5eWFYUjVNVVF3UWdZRApWUVFERXp0SVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6SUVWRFF5QlNiMjkwClEwRWdNakF4TlRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCSktnUWVoTGdvUmM0dmd4RVptR1pFNEpKUytkUVM4S3JqVlAKZEpXeVVXUnJqV3ZtUDNDVjhBVkVSNlp5T0ZCMmxRSmFqcTRvbnZrdFRwbnZMRWh2VENVcDZORnhXOThkd1hVM3ROZjZlM3BDbkdvSwpWbHA4YVF1cWdBa2tiSDdCUnFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPCkJCWUVGTFFpQzRLWkpBRU9uTHZrRHYyLys1Y2drNWtxTUFvR0NDcUdTTTQ5QkFNQ0EyY0FNR1FDTUdmT0ZtSTRvcXhpUmFlcGxTVEEKR2llY01qdkF3Tlc2cWVmNEJFTlRoZTVTSWQ2ZDlTV0RQcDVZU3kvWFp4TU9JUUl3QmVGMUFkNW83U29mVFV3SkNBM3NTNjFrRnlqbgpkYzVGWlhJaEY4c2lRUTZNRTVnNG1sUnRtOHJpZk9vQ1dDS1IKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSVNSRyBSb290IFgxCj09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmF6Q0NBMU9nQXdJQkFnSVJBSUlRejdEU1FPTlpSR1BndTJPQ2l3QXdEUVlKS29aSWh2Y05BUUVMQlFBd1R6RUxNQWtHQTFVRQpCaE1DVlZNeEtUQW5CZ05WQkFvVElFbHVkR1Z5Ym1WMElGTmxZM1Z5YVhSNUlGSmxjMlZoY21Ob0lFZHliM1Z3TVJVd0V3WURWUVFECkV3eEpVMUpISUZKdmIzUWdXREV3SGhjTk1UVXdOakEwTVRFd05ETTRXaGNOTXpVd05qQTBNVEV3TkRNNFdqQlBNUXN3Q1FZRFZRUUcKRXdKVlV6RXBNQ2NHQTFVRUNoTWdTVzUwWlhKdVpYUWdVMlZqZFhKcGRIa2dVbVZ6WldGeVkyZ2dSM0p2ZFhBeEZUQVRCZ05WQkFNVApERWxUVWtjZ1VtOXZkQ0JZTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBSzNvSkhQMEZEZnptNTRyClZ5Z2NoNzdjdDk4NGtJeHVQT1pYb0hqM2RjS2kvdlZxYnZZQVR5amIzbWlHYkVTVHRyRmovUlFTYTc4ZjB1b3hteUYrMFRNOHVrajEKM1huZnM3ai9FdkVobWt2QmlvWnhhVXBtWm15UGZqeHd2NjBwSWdiejVNRG1nSzdpUzQrM21YNlVBNS9UUjVkOG1VZ2pVK2c0cms4SwpiNE11MFVsWGpJQjB0dG92MERpTmV3TndJUnQxOGpBOCtvK3UzZHBqcStzV1Q4S09FVXQrend2by83VjNMdlN5ZTByZ1RCSWxESENOCkF5bWc0Vk1rN0JQWjdobS9FTE5LakQrSm8yRlIzcXlIQjVUMFkzSHNMdUp2VzVpQjRZbGNOSGxzZHU4N2tHSjU1dHVrbWk4bXhkQVEKNFE3ZTJSQ09GdnUzOTZqM3grVUNCNWlQTmdpVjUrSTNsZzAyZFo3N0RuS3hIWnU4QS9sSkJkaUIzUVcwS3RaQjZhd0JkcFVLRDlqZgoxYjBTSHpVdktCZHMwcGpCcUFsa2QyNUhON3JPckZsZWFKMS9jdGFKeFFaQktUNVpQdDBtOVNUSkVhZGFvMHhBSDBhaG1iV25PbEZ1CmhqdWVmWEtuRWdWNFdlMCtVWGdWQ3dPUGpkQXZCYkkrZTBvY1MzTUZFdnpHNnVCUUUzeERrM1N6eW5UbmpoOEJDTkF3MUZ0eE5yUUgKdXNFd01GeEl0NEk3bUtaOVlJcWlveW1DekxxOWd3UWJvb01EUWFIV0JmRWJ3cmJ3cUh5R08wYW9TQ3FJM0hhYWRyOGZhcVU5R1kvcgpPUE5rM3NnckRRb28vL2ZiNGhWQzFDTFFKMTNoZWY0WTUzQ0lyVTdtMllzNnh0MG5VVzcvdkdUMU0wTlBBZ01CQUFHalFqQkFNQTRHCkExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlI1dEZubWU3Ymw1QUZ6Z0FpSXlCcFkKOXVtYmJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFWUjlZcWJ5eXFGRFFETEhZR21rZ0p5a0lyR0YxWElwdStJTGxhUy9WOWxaTAp1Ymh6RUZuVElaZCs1MHh4KzdMU1lLMDVxQXZxRnlGV2hmRlFEbG5yenVCWjZickpGZStHblkrRWdQYms2WkdRM0JlYllodEY4R2FWCjBueHZ3dW83N3gvUHk5YXVKL0dwc01pdS9YMSttdm9pQk92LzJYL3FrU3Npc1JjT2ovS0tORnRZMlB3QnlWUzV1Q2JNaW9nemlVd3QKaER5QzMrNldWd1c2TEx2M3hMZkhUanVDdmpISUluTnprdEhDZ0tRNU9SQXpJNEpNUEorR3NsV1lIYjRwaG93aW01N2lhenRYT29KdwpUZHdKeDRuTENnZE5iT2hkanNudnpxdkh1N1VyVGtYV1N0QW16T1Z5eWdocXBaWGpGYUgzcE8zSkxGK2wrLytzS0FJdXZ0ZDd1K054CmU1QVcwd2RlUmxOOE53ZENqTlBFbHB6Vm1iVXE0SlVhZ0VpdVREa0h6c3hIcEZLVks3cTQrNjNTTTFOOTVSMU5iZFdoc2NkQ2IrWkEKSnpWY295aTNCNDNualRPUTV5T2YrMUNjZVd4RzFiUVZzNVp1ZnBzTWxqcTRVaTAvMWx2aCt3akNoUDRrcUtPSjJxeHE0Umdxc2FoRApZVnZUSDl3N2pYYnlMZWlOZGQ4WE0ydzlVL3Q3eTBGZi85eWkwR0U0NFphNHJGMkxOOWQxMVRQQW1SR3VuVUhCY25XRXZnSkJRbDluCkpFaVUwWnNudmdjL3ViaFBnWFJSNFhxMzdaMGo0cjdnMVNnRUV6d3hBNTdkZW15UHhnY1l4bi9lUjQ0L0tKNEVCcytsVkRSM3ZleUoKbStrWFE5OWIyMS8ramg1WG9zMUFuWDVpSXRyZUdDYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQUMgUkFJWiBGTk1ULVJDTQo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZ3pDQ0EydWdBd0lCQWdJUFhaT05NR2MyeUFZZEdzZFVoR2tITUEwR0NTcUdTSWIzRFFFQkN3VUFNRHN4Q3pBSkJnTlZCQVlUCkFrVlRNUkV3RHdZRFZRUUtEQWhHVGsxVUxWSkRUVEVaTUJjR0ExVUVDd3dRUVVNZ1VrRkpXaUJHVGsxVUxWSkRUVEFlRncwd09ERXcKTWpreE5UVTVOVFphRncwek1EQXhNREV3TURBd01EQmFNRHN4Q3pBSkJnTlZCQVlUQWtWVE1SRXdEd1lEVlFRS0RBaEdUazFVTFZKRApUVEVaTUJjR0ExVUVDd3dRUVVNZ1VrRkpXaUJHVGsxVUxWSkRUVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DCmdnSUJBTHB4Z0hwTWhtNS95Qk50d01aOUhBQ1hqeXdNSTdzUW1rQ3BHcmVIaVBpYlZtcjc1bnVPaTVLT3B5VmRXUkhiTmk2M1VSY2YKcVFnZkJCY2tXS28zU2hqZjVUblVWLzNYd1N5UkFaSGlJdFFEd0ZqOGQwZnNqejUwUTdxc05JMU5PSFpuanJESWJ6QXpXSEZjdFBWcgpidFFCVUxnVGZteEtvMG5SSUJudXZNQXBHR1duM3Y3djNRcVFJZWNhWjVKQ0VKaGZUekM4UGh4RnRCRFhhRUFVd0VENjUzY1hldVlMCmoyVmJQTm1hVXR1MXZaNUd6ejNya1FVQ3dKYXlka3hORUpZN2t2cWNmdytaMzc0ak5VVWVBbHordGFpYm1TWGFYdk1pd3puMTVDb3UKMDhZZnhHeXF4UnhxQVFWS0w5TEZ3YWcwSmwxbXBkSUNJZmtZdHdiMVRwbHZxS3RNVWVqUFVCakZkOGc1Q1N4SmtqS1pxTHNYRjNtdwpXc1htbzhSWlpVYzFnMTZwNkRVTG1idmt6U0RHbTBvR09iVm8vQ0s2N2xXTUswN3E4N0hqL0xhWm10VkMrbkZOQ00rSEhtcHhmZm5UCnRPbWxjWUY3d2s1SGxxWDJkb1dqS0kvcGdHNkJVNlZ0WDdoSStjTDVOcVl1U2YrNGxzS01CN09iaUZqODZ4c2MzaTF3NHBlU01LR0oKNDd4VnFDZldTKzJRcll2Nll5VlpMYWcxM2NxWE03emx6Y2VkMGV6dlhnNUtrQVltWTYyNTJUVXRCN3AyWlN5c1Y0OTk5QWVVMTRFQwpsbDJqQjBuVmV0QlgrUnZuVTBaMXFyQjVRc3RvY1FqcFlMMDVhYzcwcjhOV1FNZXRVcUlKNUcrR1I0b2Y2eWduWFlNZ3J3VEpiRmFhCmkwYjFBZ01CQUFHamdZTXdnWUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUUKRlBkOXhmM0U2Sm9iZDJTbjlSMmd6TCtIWUpwdE1ENEdBMVVkSUFRM01EVXdNd1lFVlIwZ0FEQXJNQ2tHQ0NzR0FRVUZCd0lCRmgxbwpkSFJ3T2k4dmQzZDNMbU5sY25RdVptNXRkQzVsY3k5a2NHTnpMekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBQjVCSzMvTWpUdkRECm5GRmxtNXdpb29vTWhmTnpLV3ROL2dIaXFReGpBYjhFWjZXZG1GLzlBUlA2N0pwaTZZYit0bUxTYmt5VSs4QjFSWHhsRFBpeU44K3MKRDgrTmIva1o5NC9zSHZKd252REt1TyszLzNZM2RsdjJib2p6cjJJeUlwTU5PbXFPRkdZTUxWTjBWMlVlMWJMZEk0RTdwV1lqSjJjSgpqK0YzcWtQTlpWRUk3VkZZL3VZNStjdEhoS1FWOFhhN3BPNmtPOFJmNzdJemxoRVl0OGxsdmhqaG82VGMraGo1MDd3VG16bDZOTHJUClFmdjZNb29xdHl1R0MybURPTDdOaWk0TGNLMk5KcEx1SHZVQkt3cloxcGViYnVDb0dSdzZJWXNNSGtDdEErZmRabjcxdVNBTkEraVcKK1lKRjFEbmdvQUJkMTVqbWZaNW5jOE9hS3Zlcmk2RTZGTzgwdkZJT2laaWFCRUNFSFg1RmFaTlh6dXZPK0ZCOFR4eHVCRU9iK2RZNwpJeGpwNm83UlRVYU44VHZrYXNxNit5TzNtL3FaQVNsYVdGb3Q0L25VYlE0bXJjRnVOTHd5K0F3RittV2oyenMzZ3lMcDF0eHlNLzFkCjhpQzlkandqMmlqMytSdnJXV1RWM0Y5eWZpRDh6WW0xa0dkTlluby9UcTBkd3puK2V2UW9GdDlCOWtpQUJkY1BVWG1zRUt2VTdBTm0KNW1xd3VqR1NRa0JxdmpyVGN1RnFOMVc4ckIyVnQybGg4a09SZE9hZzB3b2tScUVJcjliYVJSbVcxRk1kVzRSNThNRDNSKytMajhVRwpycDFNWXAzL1JnVDQwOG0yRUNWQWRmNFdxc2xLWUlZdnV1OHdkK1JVNHJpRW1WaUFxaE9MVVRwUFNQYUx0ck09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFtYXpvbiBSb290IENBIDEKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFFUQ0NBaW1nQXdJQkFnSVRCbXlmejVtL2pBbzU0dkI0aWtQbWxqWmJ5akFOQmdrcWhraUc5dzBCQVFzRkFEQTVNUXN3Q1FZRApWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0Z1VtOXZkQ0JEUVNBeE1CNFhEVEUxCk1EVXlOakF3TURBd01Gb1hEVE00TURFeE56QXdNREF3TUZvd09URUxNQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHYKYmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWdRMEVnTVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQUxKNGdISEtlTlhqY2E5SGdGQjBmVzdZMTRoMjlKbG85MWdoWVBsMGhBRXZyQUl0aHRPZ1EzcE9zcVRRTnJvQnZvM2JTTWdICkZ6Wk05TzZJSThjKzZ6ZjF0Um40U1dpdzN0ZTVkamdkWVo2ay9vSTJwZVZLVnVSRjRmbjl0QmI2ZE5xY216VTVML3F3SUZBR2JIclEKZ0xLbSthL3NSeG1QVURnSDNLS0hPVmo0dXRXcCtVaG5NSmJ1bEhoZWI0bWpVY0F3aG1haFJXYTZWT3VqdzVINVNOei8wZWd3TFgwdApkSEExMTRnazk1N0VXVzY3YzRjWDhqSkdLTGhEK3JjZHFzcTA4cDhrRGkxTDkzRmNYbW4vNnBVQ3l6aUtybEE0Yjl2N0xXSWJ4Y2NlClZPRjM0R2ZJRDV5SEk5WS9RQ0IvSUlERWdFdytPeVFtamdTdWJKcklxZzBDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3SFFZRFZSME9CQllFRklRWXpJVTA3THdNbEpRdUNGbWN4N0lRVGdvSU1BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUJBUUNZOGpkYVFaQ2hHc1YyVVNnZ05pTU9ydVlvdTZyNGxLNUlwREIvRy93a2pVdTB5S0dYOXJieGVuRElVNVBNCkNDamptQ1hQSTZUNTNpSFRmSVVKclU2YWRUckNDMnFKZUhaRVJ4aGxiSTFCamp0L21zdjB0YWRRMXdVc04rZ0RTNjNwWWFBQ2J2WHkKOE1XeTdWdTMzUHFVWEhlZUU2Vi9VcTJWOHZpVE85NkxYRnZLV2xKYllLOFU5MHZ2by91ZlFKVnRNVlQ4UXRQSFJoOGpyZGtQU0hDYQoyWFY0Y2RGeVF6UjFibGRad2dKY0ptQXB6eU1aRm82SVE2WFU1TXNJK3lNUlEraERLWEppb2FsZFhnalVrSzY0Mk00VXd0QlY4b2IyCnhKTkRkMlpod0xub1FkZVhlR0FEYmtweXJxWFJmYm9Rbm9ac0c0cTVXVFA0NjhTUXZ2RzUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQW1hem9uIFJvb3QgQ0EgMgo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUVRDQ0F5bWdBd0lCQWdJVEJteWYwcFkxaHA4S0QrV0dlUGhiSnJ1S056QU5CZ2txaGtpRzl3MEJBUXdGQURBNU1Rc3dDUVlEClZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjZiMjRnVW05dmRDQkRRU0F5TUI0WERURTEKTURVeU5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTE1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdgpiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2YjNRZ1EwRWdNakNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DCmdnSUJBSzJXbnkyY1NreEtnWGxSbWV5S3kydGdVUk84VFcwRy9MQUlqZDBaRUdySEpndzEyTUJ2SUlUcGxMR2JoUVBEVzl0SzZNajQKa0hiWlcwL2pUT2dHTmszTW1xdzlESkFya3RRR0dXQ3NOMFI1aFlHQ3JWbzM0QTNNbmFaTVVuYnFRNTIzQk5GUTlsWGcxZEttU1lYcApOK25LZnE1Y2xVMUltait1SUZwdGlKWFpOTGhTR2tPUXNMOXNCYm0yZUxmcTBPUTZQQkpUWXY5SzhudStOUVdwRWpUajgyUjBZaXc5CkFFbGFLUDR5Ukx1SDNXVW5BbkU3MmtyM0g5ck45eUZWa0U4UDdLNkM0WjlyMlVYVHUvQmZoKzA4TERtRzJqL2U3SEpWNjNtanJkdmQKZkxDNkhNNzgzazgxZHM4UCtIZ2ZhalpSUmlkaFcrbWV6L0NpVlgxOEpZcHZMN1RGejRRdUsvME5VUkJzKzE4YnZCdCt4YTQ3bUFFeAprdjhMVi9TYXNybFg2YXZ2RFhiUjhPNzB6b2FuNEc3cHRHbWgzMm4yTThacExwY1RucVdIc0ZjUWdUZkpVN083Zi9hUzBaelFHUFNTCmJ0cURUNlpqbVV5bCsxN3ZJV1I2SUY5c1pJVVZ5emZwWWd3TEtoYmNBUzR5Mmo1TDlaNDY5aGRBbE8rZWtRaUcrcjVqcUZvejdNdDAKUTVYNWJHbFNOc2NwYi94VkExd2YrNSs5Uit2blNVZVZDMDZKSWdsSjRQVmhIdkcvTG9weWJvQlovMWM2K1hVeW8wNWY3TzBvWXRsTgpjL0xNZ1JkZzdjM3IzTnVueXNWK0FyM3lWQWhVL2JRdENTd1hWRXFZMFZUaFVXY0kwdTF1Zm04LzBpMkJXU2xteTVBNWxSRWVkQ2YrCjNldXZBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCU3cKRFBCTU1QUUZXQUpJL1RQbFVxOUxoT05tVWpBTkJna3Foa2lHOXcwQkFRd0ZBQU9DQWdFQXFxaUFqdzU0bytDaTFNM205Wmg2TytvQQpBN0NYRHBPOFdxajJMSXh5aDZteC9IOXovV054ZUtXSFdjOHc0UTBRc2hOYWJZTDFhdWFBbjZBRkMyamtSMnZIYXQrMi9YY3ljdVVZCitnbjBvSk1zWGRLTWRZVjJaWkFNQTNtM01TTmpyWGlEQ1lab2hNci8rYzhtbXBKNTU4MUx4ZWRocHhmTDg2a1NrNU5ycCtndlU1TEUKWUZpd3pBSlJHRnVGaldKWlk3YXR0TjZhK3liM0FDZkFYVlUzZEpuSlVIL2pXUzVFNHl3bDd1eE1NbmUwbnhycFMxMGd4ZHI5SEljVwp4a1BvMUxzbW1rVndYcWtMTjFQaVJuc24vZUJHOG9tM3pFSzJ5eWdtYnRtbHlUcklRUk5nOTFDTUZhNnliUm9WR2xkNDVwSXEyV1dRCmdqOXNBcSt1RWpvbmxqWUUxeDJpZ0dPcG0vSGx1clI4RkxCT3liRWZkRjg0OWxIcW0vb3NvaEhVcVMwbkdrV3hyN0pPY1EzQVdFYlcKYVFiTFU4dXovbXRCelVGK2ZVd1BmSEo1ZWxuTlhrb09ySnVwbUhONWZMVDB6TG00Qnd5eWRGeTR4MitJb1pDbjlLcjV2MmM2OUJvVgpZaDYzbjc0OXNTbXZaNkVTOGxnUUdWTURNQnU0R29uMm5MMlhBNDZqQ2ZNZGl5SHh0Ti9rSE5HZlpRSUc2bHpXRTdPRTc2S2xYSXgzCkthZG93R3V1UU5Lb3RPck44STFMT0p3Wm1oc29WTGlKa08vS2RZRStIdkprSk1jWXIwNy9SNTRIOWpWbHBOTUtWdi8xRjJSczc2Z2kKSlVtVHR0OEFGOXBZZmwzdXhSdXcwZEZmSVJESCtmTzZBZ29uQjhYeDFzZlQ0UHNKWUd3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBbWF6b24gUm9vdCBDQSAzCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJ0akNDQVZ1Z0F3SUJBZ0lUQm15ZjFYU1hObVkvT3d1YTJlaWVkZ1B5U2pBS0JnZ3Foa2pPUFFRREFqQTVNUXN3Q1FZRFZRUUcKRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0Z1VtOXZkQ0JEUVNBek1CNFhEVEUxTURVeQpOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUxNQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaCk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWdRMEVnTXpCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkNtWHA4WkIKZjhBTm0rZ0JHMWJHOGxLbHVpMnlFdWpTTHRmNnljWFlxbTBmYzRFN081aHJPWHd6cGNWT2hvNkFGMmhpUlZkOVJGZ2RzemZsWndqcgpadDZqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXQkJTcnR0dlhCcDQzCnJEQ0dCNUZ3eDV6RUdiRjR3REFLQmdncWhrak9QUVFEQWdOSkFEQkdBaUVBNElXU294ZTNqZmtyQnFXVHJCcVlhR0Z5K3VHaDBQc2MKZUdDbVE1bkZ1TVFDSVFDY0F1L3hsSnl6bHZucnhpcjR0aXorT3BBVUZ0ZU1ZeVJJSE44d2ZkVm9Pdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFtYXpvbiBSb290IENBIDQKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQjhqQ0NBWGlnQXdJQkFnSVRCbXlmMThHN0VFd3BRK1Z4ZTNzc3lCckJEakFLQmdncWhrak9QUVFEQXpBNU1Rc3dDUVlEVlFRRwpFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjZiMjRnVW05dmRDQkRRU0EwTUI0WERURTFNRFV5Ck5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTE1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVoKTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2YjNRZ1EwRWdOREIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJOS3JpamRQbzFNTgovc0dLZTB1b2UwWkxZN0JpOWkwYjJ3aHhJZElBNkdPOW1pZjc4RGx1WGVvOXBjbUJxcU5iSUpoRlhSYmIvZWdRYmVPYzRPTzlYNFJpCjgzQmtNNkRMSkM5d3VvaWhLcUIxK0lHdVlnYkVnZHM1Ymltd0h2b3VYS05DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlYKSFE4QkFmOEVCQU1DQVlZd0hRWURWUjBPQkJZRUZOUHN4enBsYnN6aDJuYWFWdnVjODRadFYrV0JNQW9HQ0NxR1NNNDlCQU1EQTJnQQpNR1VDTURxTElmRzlmaEd0ME85WWxpL1c2NTEra0kwcnoyWlZ3eXpqS0tsd0NrY084RGRaRXY4dG1aUW9UaXBQTlUweldnSXhBT3AxCkFFNDd4RHFVRXBISldFYWRJUk55cDRpY2l1Uk1TdHVXMUt5TGEydEpFbE16cmRma3ZpVDh0UXAyMUtXOEVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVl6Q0NBMHVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0IwakVMTUFrR0ExVUVCaE1DVkZJeEdEQVdCZ05WQkFjVApEMGRsWW5wbElDMGdTMjlqWVdWc2FURkNNRUFHQTFVRUNoTTVWSFZ5YTJsNVpTQkNhV3hwYlhObGJDQjJaU0JVWld0dWIyeHZhbWxyCklFRnlZWE4wYVhKdFlTQkxkWEoxYlhVZ0xTQlVWVUpKVkVGTE1TMHdLd1lEVlFRTEV5UkxZVzExSUZObGNuUnBabWxyWVhONWIyNGcKVFdWeWEyVjZhU0F0SUV0aGJYVWdVMDB4TmpBMEJnTlZCQU1UTFZSVlFrbFVRVXNnUzJGdGRTQlRUU0JUVTB3Z1MyOXJJRk5sY25ScApabWxyWVhOcElDMGdVM1Z5ZFcwZ01UQWVGdzB4TXpFeE1qVXdPREkxTlRWYUZ3MDBNekV3TWpVd09ESTFOVFZhTUlIU01Rc3dDUVlEClZRUUdFd0pVVWpFWU1CWUdBMVVFQnhNUFIyVmllbVVnTFNCTGIyTmhaV3hwTVVJd1FBWURWUVFLRXpsVWRYSnJhWGxsSUVKcGJHbHQKYzJWc0lIWmxJRlJsYTI1dmJHOXFhV3NnUVhKaGMzUnBjbTFoSUV0MWNuVnRkU0F0SUZSVlFrbFVRVXN4TFRBckJnTlZCQXNUSkV0aApiWFVnVTJWeWRHbG1hV3RoYzNsdmJpQk5aWEpyWlhwcElDMGdTMkZ0ZFNCVFRURTJNRFFHQTFVRUF4TXRWRlZDU1ZSQlN5QkxZVzExCklGTk5JRk5UVENCTGIyc2dVMlZ5ZEdsbWFXdGhjMmtnTFNCVGRYSjFiU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBcjNVd002cTdhOU9aTEJJM2hObU5lNWVBMDI3bi81dFFsVDZRbFZaQzF4bDhKb1NOa3ZvQkhUb1A0bVE0dDR5OAo2SWo1aXlTckxxUDFOK1JBamhnbGVZTjFIenYvYktqRnhsYjR0TzJLUktPcmJFejhIZERjNzJpOXorU3F6dkJWOTZJMDFJTnJOM3djCnd2NjFBK3hYenJ5MHRjWHRBQTlUTnlwTjlFOE1nL3VHejh2K2pFNjloL21uaXlGWG5IcmZBMmVKTEoyWFlhY1F1RldRZnc0dEp6aDAKMytmOTJrNFM0MDBWSWdMSTRPRDhENjJLMThsVVVNdzdEOG9XZ0lUUVVWYkRqbFovaVNJekwrYUZDcjJscUJzMjN0UGNMRzA3eHhPOQpXU01zNXVXazk5Z0w3ZXFRUUVTb2xidVQxZENBTkxaR2VBNGZBSk5HNGU3cCtleFBGd0lEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVClpUL0hpb2JHUE4wOFZGdzErRHJ0VWd4SFY4Z3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUoKS29aSWh2Y05BUUVMQlFBRGdnRUJBQ28vNGZFeWpxN2htRnhMWHM5ckhtb0owaUtwRXNkZVYzMXpWbVNBaEhxVDVBbTVFTTJmS2lmaApBSGUrU01nMXFJR2Y1TGdzeVg4T3NOSkxOMTNxdWRVTFhqUzk5SE1wdyswbUZaeCtDRk9LV0kzUVN5amZ3YlBmSVBQNTQrTTYzOHljCmxOaE9UOE5yRjdmM2N1aXRaak8xSlZPcjRQaE1xWjM5OGcyNnJyblpxc1pyK1pPN3JxdTRsendER3JwRHhwYTVSWEk0czZlaGxqMlIKZTM3QUlWTk1oKzN5QzFTVlVaUFZJcVVOaXZHVERqNVVEckRZeVU3YzhqRXlWdXBrK2VxMW5SWm1Rbkx6ZjlPeE1VUDhwSTRYOFcwagpxNVJtK0szN0R3aHVKaTEvRndjSnNvejdVTUNmbG8zUHR2MEFuVm9VbXI4Q1JQWEJ3cDhpWHFJUG9lTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR0RDQSBUcnVzdEFVVEggUjUgUk9PVAo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGaURDQ0EzQ2dBd0lCQWdJSWZRbVgvdkJINm5vd0RRWUpLb1pJaHZjTkFRRUxCUUF3WWpFTE1Ba0dBMVVFQmhNQ1EwNHhNakF3CkJnTlZCQW9NS1VkVlFVNUhJRVJQVGtjZ1EwVlNWRWxHU1VOQlZFVWdRVlZVU0U5U1NWUlpJRU5QTGl4TVZFUXVNUjh3SFFZRFZRUUQKREJaSFJFTkJJRlJ5ZFhOMFFWVlVTQ0JTTlNCU1QwOVVNQjRYRFRFME1URXlOakExTVRNeE5Wb1hEVFF3TVRJek1URTFOVGsxT1ZvdwpZakVMTUFrR0ExVUVCaE1DUTA0eE1qQXdCZ05WQkFvTUtVZFZRVTVISUVSUFRrY2dRMFZTVkVsR1NVTkJWRVVnUVZWVVNFOVNTVlJaCklFTlBMaXhNVkVRdU1SOHdIUVlEVlFRRERCWkhSRU5CSUZSeWRYTjBRVlZVU0NCU05TQlNUMDlVTUlJQ0lqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBMmFNVzhNaDBkSGViN3pNTk93WitWZnkxWUk5MmhoSkNmVlptUG9pQzdYSmpEcDZMM1RRcwpBbEZSd3huOVdWU0V5ZkZyczB5dzZlaEdYVGpHb3FjdUVWZTZnaFdpbkk5dHNKbEtDdkxyaVhCalRubkV0MXU5b2wyeDhrRUNLNjJwCk9xUHNlUXJzWHpyai9lK0FQSzAwbXhxcmlDWjdWcUtDaGgvck5ZbURmMSt1S1U0OXRtN3Nyc0h3SjV1dTQvVHM3NjUvOTRZOWNucnIKcGZ0WlRxZnJsWXdpT1huaExRaVB6THlSdUVIM0ZNRWpxY090bWtWRXM3TFhMTTNHS2VKUUVLNWN5NEtPRnhnMmZaZm1pSnF3VFRRSgo5Q3k1V21ZcXNCZWJuaDUyblVwbU1VSGZQL3ZGQnU4YnRuNGFSamIzWkdNNzR6a1lJK2RuZFJUVmRWZVNONzIrYWhzbVVQSTJKZ2FRCnhYQUJaRzEyWnVHUjIyNEh3R0dBTHJJdUw0eHdwOUU3UExPUjVHNjJ4RHR3OG15U2x3bk5SMzBZd1BPN25nL1dpNjRIdGxvUHpnc00KUjZmbFByaTlmY2ViTmFCaGx6cEJkUmZNSzVaM0twSWhIdG1WZGlCbmFNOE52ZC9XSHdscW11TE1jM0drTDMwU2dMZFRNRVplUzFTWgpEMmZKcGNqeUlNR0M3SjBSMzhJQyt4bzcwZTBnbXU5bFpKSVFEU3JpM25EeEdHZUNqR0hldUx6Ukw1ejdEOUFyN1J0MnVlUTVWZmo0Cm9SMjRxb0FBVElMbnNuOEp1THd3b0M4TjlWS2VqdmVTc3dvQUhRQlVsd2Jnc1FmWnh3OWNaWDA4YlZsWDVPMmxqZWxBVTU4VlM2QngKOWhvaDQ5cHdCaUZZRkllRmQzbXFnbmtDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRk9MSlFKOU56dWlhb1h6UERqOWx4U21JYWhsUgpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRRFJTVmZnCnA4eG9XTG9CRHlzWnpZMndZVVdzRWUxalVHbjRIMysrRm8vOW5lc0xxakpIZHRKbkpPMjlmRE15bHlySEJZWm1EUmQ5RkJVYjFPdjkKSDVyMlhwZHB0eG9scEFxemtUOWZOcXlMN0Zlb1B1ZUJpaGhYT1lWMEdrTEg2VnNUWDQvNUNPbVNkSTMxUjlLck85YjdlR1pPTm4zNQo2WkxwQk43OVNXUDhiZnNVY1pObkwwZEt0N24vSGlwemNFWXd2MXJ5TDNtbDRZME0yZm15WXplTU4yV0ZjR3BjV3dseXVhMWpQTEhkCitQd3l2emVHNUx1T21DZCt1aDhXNFhBUjhnUGZKV0l5SnlZWU1vU2Yvd0E2RTdxYVRmUlB1QlJ3SXJIS0s1RE9LY0Z3OUMrZGYvS1EKSHRaYTM3ZEcvT2FHK3N2Z0lIWjZ1cWJMOVh6ZVlxV3hpKzdlZ21hS1Rqb3dIeitBeTYwbnVneGUxOUN4VnNwM2NiSzFkYUZRcVVCRApGOElvMmM5U2kxdklZOVJDUHFBemVrWXU5d29nUmxSK2FrOHg4WUYrUW5RNFpYTW43c1o4dUk3WHBUclhtS0djakJCVjA5dEw3RUNRCjhzMXVWOUppRG54WGs3R25iYzJkZzdzcTUrVzJPM0ZZcmYzUlJieGFrZTVURlcvVFJRbDFicnFRWFI0RXp6ZmZIcWhtc1l6bUlHcnYKL0VoT2RKaENyeWx2TG1ySCszM1JaakVpeklZQWZtYURERUwwdlRTU3d4cnFUOHArY2swTGNJeW1TTHVtb1JUMisxaEVtUlN1cWd1VAphYUFwSlVxbHl5dmRpbVlIRm5nVlYzRWI3UFZIaFBPZU1UZDYxWDhrcmVTOC9mM01ib1BvREtpM1FXd0gzYjA4aHBjdjBnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGM1RDQ0E4V2dBd0lCQWdJSWV5eWIweGFBTXBrd0RRWUpLb1pJaHZjTkFRRUxCUUF3ZkRFTE1Ba0dBMVVFQmhNQ1ZWTXhEakFNCkJnTlZCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUtEQTlUVTB3Z1EyOXljRzl5WVhScGIyNHgKTVRBdkJnTlZCQU1NS0ZOVFRDNWpiMjBnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNCU1UwRXdIaGNOTVRZdwpNakV5TVRjek9UTTVXaGNOTkRFd01qRXlNVGN6T1RNNVdqQjhNUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14CkVEQU9CZ05WQkFjTUIwaHZkWE4wYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFeE1DOEdBMVVFQXd3b1UxTk0KTG1OdmJTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRkpUUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0lQQURDQ0Fnb0NnZ0lCQVBrUDNhTXJmY3ZRS3Y3c1o0V201eTRidW5maDQvV3ZwT3o2U2wyUnhGZEhheGgzYTNieS9aUGtQUS9DCkZwNExac05XbEo0WGc0WE9WdS95RnYwQVl2VWlDVlRvWlJkT1FibmdUMGFYcWh2SXVHNWlYbW14WDlzcUFuNzhiTXJ6UWRqdDBPajgKUDJGSTdiQURGQjBRRGtzWjRMdE83SVpsL3pielhtY0NDNTJHVldIOWVqanQvdUlaQUxkdm9WQmlkWFE4b1BySUpaSzBibm9peC9nZQpvZU95M1pFeHF5c2RCUCtsU2dRMzZZV2tNeXY5NHRaVk5Id1pwRXBveDdLbzA3ZktvWk9JNjhHWHZJejVIZGtpaENSMHh3UTlhcWtwCms4enJ1RnZoL2w4bHFqUll5TUVqVkowYm1CSERPSngrUFlac3BROUFobndDOUZ3Q1R5akxybkdmRHpySU0vNFJKVFhxL0xyRllEM1oKZkJqVnNxblRkWGdEY2lMS09zTWY3eXpsTHFuNm5peTJVVWI5cndQVzZtQm82b1VXTm11RjZSN0FzOTNFSk55QUtvRkJiWlEreU9ESgpnVUVBbmw2L2Y4VUltS0lZTEVKQXMvbHZPQ2RMVG9EMFBZRkg0SWg4Nmh6T3RYVmNVUzRjSzM4YWNpam5BTFhSZE1iWDVKK3RCNU8yClV6VTEvRGZrdy9aZEZyNGhjOTZTQ3ZpZ1kycThscEpxUHZpOFpWV2IzdlVOaVNZRS9DVWFwaVZweThKdHluemlXVitYck92dkxzaTgKMXh0WlBDdk04aG5JazJzbll4blAvT2ttK01weG0zK1QvalJuaEU2WjYveXplQWt6Y0xwbXBuYnRHM1ByR3FVTnhDSVRJSlJXQ2s0cwpiRTZ4L2MrY0NicWlNKzJIQWdNQkFBR2pZekJoTUIwR0ExVWREZ1FXQkJUZEJBa0hvdlY2ZlZKVEVwS1Y3amlBSlEybVdUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRk4wRUNRZWk5WHA5VWxNU2twWHVPSUFsRGFaWk1BNEdBMVVkRHdFQi93UUUKQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFJQmdSbENuN0pwMGNIaDV3WWZHVmNwTnhKSzFvazFpT01xOGJzM0FEL0NVcgpkSVdRUFhocTlMbUxwWmM3dFJpUnV4Nm4rVUJia2ZsVm1hOGVFZEJjSGFkbTQ3R1VCd3d5T2FicUc3QjUyQjJjY0VUaml0M0UrWlVmCmlqaERQd0dGcFVlblBVYXl2T1VpYVBkN25OZ3NQZ29oeUMwenJML0ZnWmt4ZE1GMWNjVytzZkFqUmZTZGEvd1pZNTJqdkFUR0dBc2wKdTFPSkQ3T0FVTjVGN2tSL3E1UjRaSmpUOWlqZGg5aHdaWFQ3RHJrVDY2Y1BZYWt5bHN6ZXUrMWpUQmk3cVVEM29GUnVJSWh4ZFJqcQplclEwY3VBakozZGN0cERxaGlWQXErOHpEOHVmZ3I2aUlQdjJ0UzBhNXNLRnNYUVArOGhsQXFSU0FVZmRTU0xCdjlqcmE2eCszdXhqCk14VzNJd2lQeGcrTlFWcmRqc1c1aitWRlAzamJ1dEliUUxIK2NVMC80SUdpdWw2MDdCWGdrOTBJSDM3aFZaa0xJZDZUbmdyNzVxTkoKdlRZdy91ZDNzcUIxbDdVdGdZZ1haU0QzMnBBQW44bFN6RExLTlh6MVBRL1lLOWYxSm16SkJqU1dGdXB3V1JveWVYa0x0b2gvRDFKSQpQYjlzMktKRUx0Rk90M0pZMDRrVGxmNUVxL2pYaXh0dW5Md3NvRnZWYWdDdlh6ZmgxZm9RQzVpY2h1Y21qODd3N0c2S1Z3dUE0MDZ5CndLQmpZWkM2VldnM2RHcTJrdHVmb1lZaXRtVW5EdXkybjBKZzVHZkN0ZHBCQzhUVGkyRWJ2UG9ma1N2WFJBZGV1aW1zMmNYcDcxTkkKV3V1QThTaFlJYzJ3QmxYN0p6OVRrSENwQkI1WEo3az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDalRDQ0FoU2dBd0lCQWdJSWRlYmZ5OEZvVzZnd0NnWUlLb1pJemowRUF3SXdmREVMTUFrR0ExVUVCaE1DVlZNeERqQU1CZ05WCkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRS0RBOVRVMHdnUTI5eWNHOXlZWFJwYjI0eE1UQXYKQmdOVkJBTU1LRk5UVEM1amIyMGdVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0JGUTBNd0hoY05NVFl3TWpFeQpNVGd4TkRBeldoY05OREV3TWpFeU1UZ3hOREF6V2pCOE1Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXhFREFPCkJnTlZCQWNNQjBodmRYTjBiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakV4TUM4R0ExVUVBd3dvVTFOTUxtTnYKYlNCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlFVkRRekIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQQpCRVZ1cVZERXBpTTJubDhvalJmTGxpSmtQOXg2amgzTUNMT2ljU1M2amttNUJCdEhsbGlyTFpYSTdaNElOY2duNjRtTVUxanJZb3IrCjhGc1BhekZTWTBFN2ljM3M3TGFOR2RNMEI5eTd4Z1ovd2tXVjdNdC9xQ1BnQ2VtQit2TkgwNk5qTUdFd0hRWURWUjBPQkJZRUZJTFIKaFhNdzV6VUUwNDRDa3Z2bHBOSEVJZWpOTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVWd0R0ZjekRuTlFUVApqZ0tTKytXazBjUWg2TTB3RGdZRFZSMFBBUUgvQkFRREFnR0dNQW9HQ0NxR1NNNDlCQU1DQTJjQU1HUUNNRy9uNjFrUnBHRFBZYkNXCmUrMEYrUzhUa2R6dDVmeFFheEZHUnJNY0lRQml1NzdENStqTkI1bjVEUXRkY2o3RXFnSXdIN3k2QytJd0pQdDhiWUJWQ3BrK2dBMHoKNVdhanM2TzdwZFdMandrc3BsMSs0dkFIQ0dodDBueHBibC9mNVdwbAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY2ekNDQTlPZ0F3SUJBZ0lJVnJZcHpUUzhlUFl3RFFZSktvWklodmNOQVFFTEJRQXdnWUl4Q3pBSkJnTlZCQVlUQWxWVE1RNHcKREFZRFZRUUlEQVZVWlhoaGN6RVFNQTRHQTFVRUJ3d0hTRzkxYzNSdmJqRVlNQllHQTFVRUNnd1BVMU5NSUVOdmNuQnZjbUYwYVc5dQpNVGN3TlFZRFZRUUREQzVUVTB3dVkyOXRJRVZXSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ1VsTkJJRkl5Ck1CNFhEVEUzTURVek1URTRNVFF6TjFvWERUUXlNRFV6TURFNE1UUXpOMW93Z1lJeEN6QUpCZ05WQkFZVEFsVlRNUTR3REFZRFZRUUkKREFWVVpYaGhjekVRTUE0R0ExVUVCd3dIU0c5MWMzUnZiakVZTUJZR0ExVUVDZ3dQVTFOTUlFTnZjbkJ2Y21GMGFXOXVNVGN3TlFZRApWUVFEREM1VFUwd3VZMjl0SUVWV0lGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dVbE5CSUZJeU1JSUNJakFOCkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQWp6WmxRT0hXVGNEWHRPbEcybXZxTTBmTlRQbDlmYjY5TFQzdzIzamgKaHFYWnVnbFhhTzFYUHFEUUNFR0Q1eWhCSkIvamNoWFFBUnI3WG5BanNzdWZPZVBQeFU3R2ttMG14bnU3czlvbm5RcUc2WUUzQmY3dwpjWEhzd3h6cFk2SVhGSjN2RzJmVGhWVUNBdFpKeWN4YTRiSDNiektmeWRRN2lFR29uTDNMcTl0dGV3a2Zva3h5a05vckNQelBQRlRPClp3K296MTJXR1F2RTQzTHJyZEY5SFNmdmt1c1F2MXZyTzYvUGdOM0IwcFlFVzNwK3BLazhPSGFrWW82Z09WN3FkODlkQUZtUFppdysKQjZLakJTWVJhWmZxaGJjUGxndEx5RURoVUxvdWlzdjNENW9pNTMrYU54UE44azBUYXlIUndNd2k4cUZHOWtScG5NcGhOUWNBYjlaaApDQkhxdXJqMjZiTmc1VTI1N0o4VVpzbFhXTnZOaDJuNGlvWVNBMGUvWmhOMnJIZDlOQ1NGZzgzWHFweVFHcDhoTEg5NHQyUzQyT2ltCjlIaXpWY3VFMGpMRWVLNmpqMkhkemdoVHJleUkvQlhrbWczbW54cDN6a3lQdUJRVlBXS2NoamdHQUdZUzVGbDJXbFBBQXBpaUVDdG8KUkh1T2VjNHpTbmFxVzRFV0c3V0syTkFBZTE1aXRBbldobU1PcGdXVlNib29pNGlUc2pRYzJLUlZicmNjME42WlZUc2o5Q0xnK1NsbQpKdXdnVUhmYlNndVB2dVVDWUhCQlh0U3VVRGtpRkNiTHNqdHpkRlZIQjNtQk9hZ3dFMFRsQklxdWxoTWxRZys1VThTYi9NM2tITjQ4CitxdldCa29mWjZhWU1CemRMTnZjR0pWWFpzYi9YSXRXOVhjQ0F3RUFBYU5qTUdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZkJnTlYKSFNNRUdEQVdnQlQ1WUx2VTQ5VTA5cmoxQm9BbHAzUGJSbW1vbmpBZEJnTlZIUTRFRmdRVStXQzcxT1BWTlBhNDlRYUFKYWR6MjBacApxSjR3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJXczQ3TENwMUpqcitreEpHN1poY0ZVWmgxCisrVlFMSHFlOFJUNnE5T0tQditSS1k5amk5aTBxVlFCRGI2VGhpLzVTbTNIWHZWWCtjcFZIQksrUnc4MnhkOXF0OXQxd2tjbGY3bngKWS9ob0xWVUUwZktOc0tUUHZEeGVIM2pucGFBZ2NMQUV4YmYzY3FmZUlnMjlNeVZHakdTU0p1TStMbU9XMnB1TVBmZ1lDZGNEekgyRwpndURLQkFkUlVOZi9rdFVNNzlxR241blg2N2V2YU9JNUpwUzZhTGUvZzlQcWVtYzlZbWV1SmVWeTZPTGs3SzRTOWtzclBKL3BzRUR6Ck9GU3ovYmRveU5yR2oxRThzdnVSM0J6bm01M2h0dzF5aitLa3hLbDQrZXNVck1aREJjSmxPU2dZQXNPQ3NwMEZ2bVh0bGw5bGREejcKQ1RVdWU1d1QvUnNQWGNkdGdUcFdEOHc3NGE4Q0x5S3NSc3BHUEtBY1ROWkV0RjR1WEJWbUNlRW1LZjdHVW1HNnNYUC93d3ljNVd4cQpsRDhVeWtBV2xZVHpXYW1zWDB4aGsyM1JPOHlpbFF3aXBtZG5SQzY1MmRLS1FiTm1DMXI3ZlNPbDhocXcvOTZiZzVRdTBUL2ZrcmVSCnJ3VTdaY2VnYkxITlloTERrQnZqSmM0MHZHOTNkckVRdy9jRkdzRFdyM1JpU0JkM2ttbVFZUnplbFlCMFZJOFlITVB6QTlDL3BFTjEKaGxNWWVnb3VDUncybjVIOWdvb2lTOUVPVUNYZHl3TU1GOG1EQUFoT05VMktpKzN3QXBSbUxFUi95NVVubGhldENUQ3N0bkVYYm9zWAo5aHdKMUMwN21LVngwMVFUMldEejlVdG1UL3J4N2lBU2piU3NWN0ZGWTZHc2RxbkMrdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2xEQ0NBaHFnQXdJQkFnSUlMQ21jV3hidEJaVXdDZ1lJS29aSXpqMEVBd0l3ZnpFTE1Ba0dBMVVFQmhNQ1ZWTXhEakFNQmdOVgpCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUtEQTlUVTB3Z1EyOXljRzl5WVhScGIyNHhOREF5CkJnTlZCQU1NSzFOVFRDNWpiMjBnUlZZZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQkZRME13SGhjTk1UWXcKTWpFeU1UZ3hOVEl6V2hjTk5ERXdNakV5TVRneE5USXpXakIvTVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeApFREFPQmdOVkJBY01CMGh2ZFhOMGIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRTBNRElHQTFVRUF3d3JVMU5NCkxtTnZiU0JGVmlCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlFVkRRekIyTUJBR0J5cUdTTTQ5QWdFR0JTdUIKQkFBaUEySUFCS29TUjVDWUcvdnZ3MEFIZ3lCTzhUQ0NvZ2JSOHBLR1lmTDJJV2pLQU1USDZrTUFWSWJjL1IvZkFMaEJZbHpjY0JZeQozaCtaMU16RkI4Z0lIMkVXQjFFOWZWd0hVK00xT0l6ZnpaL1pMZzFLdGhrdVduQmFCdTIrOEtHd3l0QUpLYU5qTUdFd0hRWURWUjBPCkJCWUVGRnZLWHVYZTBvR3F6YWd0WkZHMjJYS2JsK1pQTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVVc4cGUKNWQ3U2dhck5xQzFrVWJiWmNwdVg1azh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQW9HQ0NxR1NNNDlCQU1DQTJnQU1HVUNNUUNLNWtDSgpOK3ZwMVJQWnl0UnJKUE93UFlkR1dCcnNzZDl2KzFhNmNHdkhPTXpvc1l4UEQvZnhaM1lPZzlBZVVZOENNRDMySXlnbVRNWmdoNU1tCm03STFIcnJXOXp6UkhNNzZKVHltR29FVlcvTVNEMnp1WllySmg2ajVCK0JpbW94Y1NnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IENBIC0gUjYKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZnekNDQTJ1Z0F3SUJBZ0lPUmVhN0E0TXp3NFZsU09iL1JWRXdEUVlKS29aSWh2Y05BUUVNQlFBd1RERWdNQjRHQTFVRUN4TVgKUjJ4dlltRnNVMmxuYmlCU2IyOTBJRU5CSUMwZ1VqWXhFekFSQmdOVkJBb1RDa2RzYjJKaGJGTnBaMjR4RXpBUkJnTlZCQU1UQ2tkcwpiMkpoYkZOcFoyNHdIaGNOTVRReE1qRXdNREF3TURBd1doY05NelF4TWpFd01EQXdNREF3V2pCTU1TQXdIZ1lEVlFRTEV4ZEhiRzlpCllXeFRhV2R1SUZKdmIzUWdRMEVnTFNCU05qRVRNQkVHQTFVRUNoTUtSMnh2WW1Gc1UybG5iakVUTUJFR0ExVUVBeE1LUjJ4dlltRnMKVTJsbmJqQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUpVSDZIUEtadm5zRk1wN1BQY05DUEcwUlFzcwpnclJJeHV0YlBLNkR1RUdTTXhTa2IzL3BLc3pHc0locnhiYUowY2F5L3hUT1VSUWg3RXJkRzFyRzFvZnVUVG9WQnUxa1pndVNnTXBFCjNuT1VUdk9uaVg5UGVHTUl5QkpRYlVKbUwwMjVlU2hOVWhxS0dvQzNHWUVPZnNTS3ZHUk1JUnhEYU5jOVBJckZzbWJWa0pxM01RYkYKdnVKdE1nYW1Idm01NjZxanVMKytnbU5RMFBBWWlkL2tEM24xNnFJZkt0SndMbnZudkpPN2JWUGlTSHlNRUFjNC8yYXlkMkYrNE9xTQpQS3EwcFBiemxVb1NCMjM5akxLSno5Q2dZWGZJV0hTdzFDTTY5MTA2eXFMYm5RbmVYVVF0a1BHQnpWZVMrbjY4VUFSak5OOXJreGkrCmF6YXlPZVNzSkRhMzhPKzJIQk5YazdiZXN2amloYmR6b3JnMXFrWHk0SjAyb1c5VWl2RnlWbTR1aU1WUlFrUVZsTzZqeFRpV20wNU8KV2d0SDh3WTJTWGN3dkhFMzVhYnNJUWgxL09aaEZqOTMxZG1SbDRRS2JOUUNUWFRBRk8zOU9mdUQ4bDRVb1FTd0Mrbis3by9oYmd1eQpDTE5oWmdscXNRWTZaWlpad1BBMS9jbmFLSTBhRVlkd2dRcW9tblVkbmpxR0JRQ2UyNERXSmZuY0JaNG5XVXgyT1Z2cSthV2gySU1QCjBmL2ZNQkg1aGM4elNQWEtiV1FVTEhwWVQ5TkxDRW5GbFdRYVl3NTVQZld6ak1wWXJaeENSWGx1RG9jWlhGU3haYmEvakp2Y0Ura04KYjdndTNHZHV5WXNSdFlRVWlnQVpjSU41a1plUjFCb252emNlTWdmWUZHTThLRXl2QWdNQkFBR2pZekJoTUE0R0ExVWREd0VCL3dRRQpBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJTdWJBV2preFBpb3VmaTF4eld4L0IveUdkVG9EQWZCZ05WCkhTTUVHREFXZ0JTdWJBV2preFBpb3VmaTF4eld4L0IveUdkVG9EQU5CZ2txaGtpRzl3MEJBUXdGQUFPQ0FnRUFneVh0Nk5IOWxWTE4KbnNBRW9KRnA1bHpRaE43Y3JhSlA2RWQ0MW1XWXFWdW9QSWQ4QW9yUmJyY1djK1pmd0ZTWTFYUyt3YzNpRVpHdEl4ZzkzZUZ5UkphMApsVjdBZTQ2WmVCWkRFMVpYczZLek83VjMzRUJ5cktQcm16VStzUWdob2VmRVF6ZDVNcjYxNTV3c1RMeERLWm1PTU5Pc0llRGpIZnJZCkJ6TjJWQUFpS3JsTklDNXdhTnJsVS95RFhOT2Q4djlFREVSbTh0TGp2VVlBR20wQ3VpVmRqYUV4VWQxVVJoeE4yNW1XN3hvY0JGeW0KRmU5NDRIbitYZHMrcWt4Vi9ab1ZxVy9ocHZ2ZmNERHB3KzVDUnUzQ2t3V0orbjFqZXovUWNZRjhBT2lZcmc1NE5NTWwrNjhLbnlCcgozVHNUanhLTTRrRWFTSHB6b0hkcHg3WmNmNExJSHY1WUd5Z3JxR3l0WG0zQUJkSjd0K3VBL2lVMy9nS2JhS3hDWGNQdTljemM4RkIxCjBqWnBuT1o3Qk45dUJtbTIzZ29KU0ZtSDYzc1VZSHBrcW1sRDc1SEhUT3dZM1d6dlV5Mk1tZUZlOG5JK3oxVEl2V2ZzcEE5TVJmL1QKdVRBakIweVBFTCtHbHRtWldyU1pWeHlrekxzVmlWTzZMQVVQNU1TZUdiRVlOTlZNbmJydDl4K3ZKSlVFZUtnRHUrNkI1ZHBmZkl0SwpvWkIwSmFlelBrdklMRmE5eDhqdk9PSmNrdkI1OTV5RXVuUXRZUUVnZm43UjhrOEhXVitMTFVOUzYwWU1sT0gxWmtkNWQ5VlVXeCt0CkpEZkxSVnBPb0VSSXlOaXdtY1VWaEFuMjFrbEp3R1c0NWhweGJxQ284WUxvUlQ1czFnTFhDbWVEQlZySnBCQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDYVRDQ0FlK2dBd0lCQWdJUUlTcFdESzdhREt0QVJiOHJvaTA2NmpBS0JnZ3Foa2pPUFFRREF6QnRNUXN3Q1FZRFZRUUdFd0pEClNERVFNQTRHQTFVRUNoTUhWMGxUWlV0bGVURWlNQ0FHQTFVRUN4TVpUMGxUVkVVZ1JtOTFibVJoZEdsdmJpQkZibVJ2Y25ObFpERW8KTUNZR0ExVUVBeE1mVDBsVFZFVWdWMGxUWlV0bGVTQkhiRzlpWVd3Z1VtOXZkQ0JIUXlCRFFUQWVGdzB4TnpBMU1Ea3dPVFE0TXpSYQpGdzAwTWpBMU1Ea3dPVFU0TXpOYU1HMHhDekFKQmdOVkJBWVRBa05JTVJBd0RnWURWUVFLRXdkWFNWTmxTMlY1TVNJd0lBWURWUVFMCkV4bFBTVk5VUlNCR2IzVnVaR0YwYVc5dUlFVnVaRzl5YzJWa01TZ3dKZ1lEVlFRREV4OVBTVk5VUlNCWFNWTmxTMlY1SUVkc2IySmgKYkNCU2IyOTBJRWRESUVOQk1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFVE9sUXdNWVBjaGk4MlBHNnM0bmllVXFqRnFkcgpWQ1RiVWYvcTlBa2t3d3Npbjh0cUo0S0JEZExBcnpIa2RJSnV5aVhaakhXZDhkdlFtcUpMSVg0V3AyT1Ewam5Vc1lkNFh4aVdEMUFiCk5UY1Bhc2JjMlJOTnBJNlFOK2E5V3pHUm8xUXdVakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWQKQmdOVkhRNEVGZ1FVU0ljVXJPUERucEJnT3RmS2llN1RyWXkwVUdZd0VBWUpLd1lCQkFHQ054VUJCQU1DQVFBd0NnWUlLb1pJemowRQpBd01EYUFBd1pRSXdKc2RwVzl6VjU3TG55QXlNak1QZGVZd2JZOVhKVXBST1RZSktjeDZ5Z0lTcEpjQk1XbTFKS1dCNEUrSitTT3RrCkFqRUEyelFnTWdqL21ra0N0b2plRks5ZGJKbHhqUm8vaTlmZ29qYUdIQWVDT25aVC9jS2k3ZTk3c0lCUFdBOUxVem05Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClVDQSBHbG9iYWwgRzIgUm9vdAo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZSakNDQXk2Z0F3SUJBZ0lRWGQreDJscWo3VjIrV21VZ1pRT1E3ekFOQmdrcWhraUc5dzBCQVFzRkFEQTlNUXN3Q1FZRFZRUUcKRXdKRFRqRVJNQThHQTFVRUNnd0lWVzVwVkhKMWMzUXhHekFaQmdOVkJBTU1FbFZEUVNCSGJHOWlZV3dnUnpJZ1VtOXZkREFlRncweApOakF6TVRFd01EQXdNREJhRncwME1ERXlNekV3TURBd01EQmFNRDB4Q3pBSkJnTlZCQVlUQWtOT01SRXdEd1lEVlFRS0RBaFZibWxVCmNuVnpkREViTUJrR0ExVUVBd3dTVlVOQklFZHNiMkpoYkNCSE1pQlNiMjkwTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEEKTUlJQ0NnS0NBZ0VBeGVZcmIzenZKZ1VubzRFazJtL0xBZm1abXFreXdpS0hZVUdSTzh2RGFCc0d4VXlwSzhGbkZ5SWRLKzM1S1ltVApvbmk5a211Z293Mmlmc3FUczZiUmpEWFZkZmtYOXM5RnhlVjY3SGVUb0k4anJnNGFBMysrMU5EdExudXJSaU5iL3l6bVZIcVV3Q29WCjhNbU5zSG83Sk9IWGFPSXhQQVl6UnJaVUVhYWxMeUpVS2xnTkFRTHgraFZSWjJ6QSt0ZTJHMy9SVm9ndkdqcU5PN3VDRWVCSEFOQlMKaDZ2N2huNFBKR3RBblRSbnZJM0hMWVp2ZVQ2T3FUd1hTMyt3bWVPd2NXRGNDL1Zrdzg1RHZHMXh1ZExlSjF1SzZOakdydUZaZmM4bwpMVFc0bFZZYThiSllTN2NTTjhoOHMrMUxnT0dOK2pJanRtKzNTSlVJc1VST2hZdzZBbFFnTDkrL1YwODdPcEFoMThFbU5WUWc3TWMvClIrenZXcjlMZXNHdE94ZFFYR0xZRDB0SzNDdjZicnh6a3Mzc3gxRG9RWmJYcVg1dDJPa2RqNHExdVZpU3VrcVNLd3hXL1lEckNQQmUKS1c0YkhBeXZqNU9KcmR1OW81NGh5b2taN04rMXd4cnJGdjU0Tmt6V2J0QStGeHlRRjJzbXV2dDZMNzhSSEJnT0xYTURqNkRsTmFCYQo0a3gxSFhIaE9UaFRlRURNZzVQWENwNmRXNCtLNU9YZ1NPUklza2ZOVGlwMUtudnlJdmJKdmdtUmxsZDZpSWlzN25Dcytkd3A0d3djCk94Sk9STmFuVHJBbXlQUFpHcGVSYU9ydmpVWUcwbFpGV0pvOERBK0R1QVVsd3puUE82UTBpYmQ1RWk5SHhlZXBsMm44cG5kbnRkOTcKOFhwbEZlUmhWbVVDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwTwpCQllFRklIRWpNejE1REQvcFF3SVg0d1ZaeUYwQWQvZk1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQVRaU0wxaml1dFJPVEwvN2xvCjVzT0FTRDBFZS9vakwzcnROdHF5em0zMjVwN2xYMWlQeXpjeW9jaGx0cTQ0UFRVYlBydzd0Z1RRdlBsSjladjNoY1UydHN1OCtNZzUKMWVSZkI3MFZWSmQweXNydFQ3cTZaSGFmZ2JpRVJVbE1qVytpNjdITTBjT1Uya1RDNXVMcUdPaWlIeWNGdXRmbDFxbk4zZTkybUkwQQpEczBiK2dPM2pvQllEaWMvVXZ1VW9zcGVaY25XaE5xNU5YSHpKc0JQZCthQko5SjNPNW9VYjNuMDl0RGgwNVM2MEZkUnZTY0ZEY0g5CnlCSXc3bStORVNzSW5kVFV2NEJGRkpxSVJOb3c2clNuNCs3dlc0TFZQdGF0ZUpMYlhEenoySzM2dUd0L3hEWW90Z0lWaWxRc25MQVgKYzQ3UU42TVVQSmlWQUF3cEJWdWVTVW14WDhmank4OG5aWTQxRjdkWHlERFpRVnU1Rkxib3dnK1VNYWVVbU14cTY3WGhKL1VRcUFIbwpqaEppNklqTXRYOUdsOENiRUdZNEdqWkdYeUpvUGQvSnhoTW5xMU1HcktJOGhnWmxiN0Yrc1NsRW1xTzZTV2tvYVkvWDVWK3RCSVprCmJ4cWdETVVJWXM2QW85RHo3R2pldmpQSEYxdC9nTVJNVExHbWhJckRPN2dKelJTQnVoampWRmMyL3RzdmZFZWhPalBJK1ZnN1JFK3gKeWdLSkJKWW9hTVZMdUNhSnU5WXpMMURWL3BxSnVoZ3lrbFRHVytDZCtWN2xEU0tiOXRyaXlDR3lZaUdxaGtDeUxtVFRYOGpqZmhGbgpSUjhGL3VPaTc3T29zL045ai9nTUh5SWZMWEMwdUFFMGRqQUE1U040cDFiWFVCK0srd2Ixd2hudzBBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVUNBIEV4dGVuZGVkIFZhbGlkYXRpb24gUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGV2pDQ0EwS2dBd0lCQWdJUVQ5SXJqL1ZreURPZVR6UllaaU53WURBTkJna3Foa2lHOXcwQkFRc0ZBREJITVFzd0NRWURWUVFHCkV3SkRUakVSTUE4R0ExVUVDZ3dJVlc1cFZISjFjM1F4SlRBakJnTlZCQU1NSEZWRFFTQkZlSFJsYm1SbFpDQldZV3hwWkdGMGFXOXUKSUZKdmIzUXdIaGNOTVRVd016RXpNREF3TURBd1doY05Nemd4TWpNeE1EQXdNREF3V2pCSE1Rc3dDUVlEVlFRR0V3SkRUakVSTUE4RwpBMVVFQ2d3SVZXNXBWSEoxYzNReEpUQWpCZ05WQkFNTUhGVkRRU0JGZUhSbGJtUmxaQ0JXWVd4cFpHRjBhVzl1SUZKdmIzUXdnZ0lpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3BDUWNvRXdLd21lQmtxaDVERm5wenNaR2dkVDZvK3VNNEFIcnMKaVdvZ0Q0dkZzSnN6QTFxR3hsaUcxY0dGdTAvR25FQk55cjd1YVphNHJZRXdtbnlTQmVzRks1cEkwTGgyUHBiSUlMdlNzUEdQMkt4RgpSditxWjJDMGQzNXFIendhVW5vRVBRYzhoUTJFMEI5MkN2ZHFGTjl5NHpSOFYwNVdBVDU1OGFvcE8yejYrSTl0VGNnMTM2N3IzQ1R1CmVVV25oYllGaU42SVhTVjhsMlJuQ2RtL1doVUZodk1KSHV4WU1qTVI4M2Rrc0hZZjVCQTFGeHZ5RHJGc3BDcWpjL3dKSHg0eUdWTVIKNTltekxDNTJMcUdqM241cWlBbm84Z2VLK0xMTkVPZmljMENUdXdqUlArSDhDNVN6SmU5OHB0ZlJyNS8vbHByMWtYdVlDM2ZVZnVnSAowbUsxbFRuajgvRnREdzVsaElwalZNV0F0dUNlUzMxSEpxY0JDRjNSaUo3WHd6SkUrb0pLQ21oVWZ6aFRBOHlrQUROa1VWa0xvNEtSCmVsN3NGc0x6S3VaaTJpcmJXV0lRSlVvcWdRdEhCME1HY0lmUytwTVJLWHBJVGV1VXgzQk5yMmZWVWJHQUlBRUJ0SG9JcHBCL1R1RHYKQjBHSHIycWxYb3Y3ejFDeW1sU3Z3NG02V0MzMU1KaXhObkk1ZmtrRS9TbW5USG5rQlZmYmxMa1dVNDFHc3gyVllWZFdmNi93Rmx0aApXRzgyVUJFTDJLd3JsUllhRGg4SXpUWTBaUkJpWnRXQVh4UWdYeTBNb0hnS2FOWXMxK2x2SzlKS0JaUDhubTlyWi8rSThVNmxhVXBTCk53WHF4aGFOMHNTWjBZSXJPN28xZGZkUlVWanp5QWZkNUxRRGZ3SURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVUyWFE2NURBOURmY1MKM0g1YUJaOGVOSnIzNFJRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3RFFZSktvWklodmNOQVFFTApCUUFEZ2dJQkFEYU5sOHhDRldRcE41c21MTmI3cmhWcExHc2FHdmRmdHZrSFRGbnE4OG5JdWE3TXVpNTYzTUQxc0MzQU82K2ZjQVVSCmFwOGxUd0VwY09QbERPSHFXbnpjU2J2QkhpcUI5UlpMY3BISW9qRzVxdHI4blIvelhVQUNFL3hPSEFiS3N4U1FWQmNaRWhyeEg5Y00KYVZyMmNYajBsSDJSQzQ3c2tGU092RytoVEt2OGRHVDljWnI0UVFlaHpaSGtQSnJnbXpJNWM2c3ExV25JZUpFbU1YM2l4ekR4L0JSNApkeElPRS9UZEZwUy9TMmQ3Y0ZPRnlyQzc4emhOTEpBNXdBM0NYV3ZwNHVYVmlJM1dMTCtyRzc2MUtJY1NGM1J1L0gzOGo5Q0hKckFiCis3bHNxK0tlUFJYQk95NW5BbGlSbisvNFFoOHN0MmoxZGEzUHRmYi9FWDNDOENTbHJkUDZvRHlwK2wzY3BhRHZSS1MrMXVqbDVCT1cKRjNzR1BqTHR4N2RDdkhhajJHVTRLemcxVVNFT0RtOHVOQk5BNFN0bkRHMUtRVEFZSTFveVZabkpGK0E4M3Zic2VhMHJXQm1pclN3aQpHcFdPdnBhUVhVSlh4UGtVQXpVckhDMVJWd2luT3Q0LzVNaTBBM1BDd1NhQXV3dENINjBOcnlaeTJzeStzNk9EV0EyQ3hSOUdVZU9jCkdNeU5tNDNzU2V0MVVOV01LRm5LZERUYWpBc2hxeDdxRytYSC9SVSt3QmVxK3lOdUprYkwrdm14Y210cHp5S0VDMklQck5rWkFKU2kKZGp6VUxacnRCSjR0Qm1JUU4xSWNoWEliSitYTXhqSHNOK3hqV1pzTEhYYk1makthaUpVSU5sSzczblpmZGtsSnJYKzlaU0N5eWNFcgpkaGgybjFheAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0aWduYSBSb290IENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdXekNDQkVPZ0F3SUJBZ0lSQU1ycEc0bnhWUU1ObytaQmJjVGpwdUV3RFFZSktvWklodmNOQVFFTEJRQXdXakVMTUFrR0ExVUUKQmhNQ1JsSXhFakFRQmdOVkJBb01DVVJvYVcxNWIzUnBjekVjTUJvR0ExVUVDd3dUTURBd01pQTBPREUwTmpNd09ERXdNREF6TmpFWgpNQmNHQTFVRUF3d1FRMlZ5ZEdsbmJtRWdVbTl2ZENCRFFUQWVGdzB4TXpFd01ERXdPRE15TWpkYUZ3MHpNekV3TURFd09ETXlNamRhCk1Gb3hDekFKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEhEQWFCZ05WQkFzTUV6QXdNRElnTkRneE5EWXoKTURneE1EQXdNell4R1RBWEJnTlZCQU1NRUVObGNuUnBaMjVoSUZKdmIzUWdRMEV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQwpEd0F3Z2dJS0FvSUNBUUROR0RsbEdsbXg2bVFXRG95VUpKVjhnOVBGT1NiY0RPOFdWNDNYMkt5alFuK0N5dTNOVzlzT3R5M3RSUWdYCnN0bXp5OVlYVW5JbzI0NU9ub3EyQy9tZWhKcE5kdDRpS1Z6U3M5SUdQakE1cVhTamtsWWNvVzlNQ2lCdG55TjZ0TWJhTE9RZExOeXoKS05BVDhreE9Ba21oVkVDZTV1VUZvQzJFeVArWWJORHJpaHFFQ0I2M2FDUHVJOVZ3em0xUmFSRHVvWHJDMFNJeHdvS0YwdkpWZGxCOApKWHJKaEZ3THJOMUNUaXZuZ3FJa2ljdVFzdER1STdwbVRMdGlwUGxUV21SN2ZKajZvMGllRDVXdXB4ajBhdXd1QTBXdjhIVDRLczE2ClhkRytSQ1l5S2ZIeDlXek1mZ0loQzU5dnBEKytuVlBpejMycExIeFlHcGZoUFRjM0dHWW8wa0RGVVlxTXd5M09VNGdrV0dRd0ZzV3EKNE5ZS3BrRGZlUGIxQkh4cEU0UzgwZEduQnM4QjkyakFxRmU3T21HdEJJeVQ0NjM4OE50RWJWbmNTVm11ckpxWk5qQkJlM1l6SW9lagp3cEtHYnZsdzdxNkhoNVVieEhxOU1mUFUwdVdaLzc1STdIWDFlQllkcG5EQmZ6d2JvWkw3ejhnODFzV1RDby8xVlRwMmxjNVptSW9KCmxYY3ltb082TEFRNmw3M1VMNzdYYkp1aXluMXRKc2xWMWMvRGVWSUlDWmtISkMxa0pXdW1JV21iYXQxMFRXdVhla0c5cXhmNWtCZEkKanpiNUxkWEYyKzZxaFVWQitzMDZSYkZvNWpaTW01Qlg3Q081aHdqQ3hBbnhsNFlxS0UzaWRNRGF4SXpiMytLaEYxbk9KRmwwTWRwLwovVEJ0MmR6aGF1SDhYd0lEQVFBQm80SUJHakNDQVJZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkhRWURWUjBPQkJZRUZCaUhWdUJ1ZCs0a05UeE9jNW9mMXVIaWVYNHJNQjhHQTFVZEl3UVlNQmFBRkJpSFZ1QnVkKzRrTlR4T2M1b2YKMXVIaWVYNHJNRVFHQTFVZElBUTlNRHN3T1FZRVZSMGdBREF4TUM4R0NDc0dBUVVGQndJQkZpTm9kSFJ3Y3pvdkwzZDNkM2N1WTJWeQpkR2xuYm1FdVpuSXZZWFYwYjNKcGRHVnpMekJ0QmdOVkhSOEVaakJrTUMrZ0xhQXJoaWxvZEhSd09pOHZZM0pzTG1ObGNuUnBaMjVoCkxtWnlMMk5sY25ScFoyNWhjbTl2ZEdOaExtTnliREF4b0MrZ0xZWXJhSFIwY0RvdkwyTnliQzVrYUdsdGVXOTBhWE11WTI5dEwyTmwKY25ScFoyNWhjbTl2ZEdOaExtTnliREFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBbExpZVQvRGpsUWdpNTgxb1FmY2NWZFY4QU9JdApPb2xkYURndlVTSUxTbzNMNmJ0ZFBydGNQYkVvL3VSVFZSUFBvWkFiQWgxZlprWUpNeWpoRFNTWGNOTVFIK3BrVjVhN1hkcm54SXhQClRHUkdIVnlINDFuZVF0R2JxSDZtaWQyUEhNa3dndTA3bk0zQTZSbmdhdGdDZFRlcjl6UW9LSkh5QkFwUE5lTmdKZ0g2MEJHTStSRnEKN3E4OXcxRFRqMTh6ZVR5R3FITkZrSXdndG5KekZ5TytCMlhsZUpJTnVnSEE2NHdjWnIrc2huY0JsQTJjNXVrNWpSK21VWXlaRERsMwo0YlNiK2h4blYyOXFhbzZwSzB4WGVYcFhJcy9OWDJOR2pWeFpPb2I0TWtkaW8yY05HSkhjKzZacjlVaGhjeU5aamdLbnZFVHE5RW1kCjhWUlkrV0N2Mmhpa0x5aEYzSHFnaUlaZDh6dm4veWsxZ1B4a1E1VG00eHh2dnEwT0ttT1pLOGwraGZaeDZBWURsZjdlajBnY1d0U1MKNkN2dTV6SGJ1Z1JxaDVqbnhWL3ZmYWNpOXdIWVRmbUowQTZhQlZta25walpieXZLY0w1a3dsV2o5T212dzVJcDNJZ1dKSms4alNhWQp0bHUzek02M053ZjlKdG1ZaFNUL1dTTURtdTJkbmFqa1hqak8xMUlOYjlJL2JiRUZhMG5PaXBGR2MvVDJML0NvYzNjT1pheWhqV1pTCmFYNUxhQXpISGpjbmc2V014d0xrRk0xSkFiQnpzLzNHa0RwdjBtenRPKzdza2I2aVExMkxBRXBtSlVSdzNrQVArSHdWOTZMT1BOZGUKRTR5QkZ4Z1gwYjN4ZHhBNjFHVTV3U2VzVnl3bFZQK2kyaytLWVRsZXJqMUtqTDA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCmVtU2lnbiBSb290IENBIC0gRzEKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGxEQ0NBbnlnQXdJQkFnSUtNZlhrWWd4c1dPM1cyREFOQmdrcWhraUc5dzBCQVFzRkFEQm5NUXN3Q1FZRFZRUUdFd0pKVGpFVApNQkVHQTFVRUN4TUtaVzFUYVdkdUlGQkxTVEVsTUNNR0ExVUVDaE1jWlUxMVpHaHlZU0JVWldOb2JtOXNiMmRwWlhNZ1RHbHRhWFJsClpERWNNQm9HQTFVRUF4TVRaVzFUYVdkdUlGSnZiM1FnUTBFZ0xTQkhNVEFlRncweE9EQXlNVGd4T0RNd01EQmFGdzAwTXpBeU1UZ3gKT0RNd01EQmFNR2N4Q3pBSkJnTlZCQVlUQWtsT01STXdFUVlEVlFRTEV3cGxiVk5wWjI0Z1VFdEpNU1V3SXdZRFZRUUtFeHhsVFhWawphSEpoSUZSbFkyaHViMnh2WjJsbGN5Qk1hVzFwZEdWa01Sd3dHZ1lEVlFRREV4TmxiVk5wWjI0Z1VtOXZkQ0JEUVNBdElFY3hNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFrMHU3NldhSzdwMWIxVFNUMEJzZXcrZWV1R1F6ZjJONGFMVE4KTG5GMTE1c2d4azBwdkxab1lJcjNJWnBXTlZyemRyM1l6WnIvazFaTHBWa0dvWk0wS2QwV05IVk84b0cweDVaT3JSa1ZVa3IrUEhCMQpjTTJ2SzZzVm1qTThxck9McXMxRC9mWHFjUC90enhFN2xNNU9NaGJUSTBBcWQ3T3ZQQUVzYk8yWkxJdlpUbW1Zc3ZlUFFiQXllR0hXCkRWL0QrcUpBa2gxY0YrWndQalhub3JmQ1l1S3JwRGhNdFRrMWIrb0RhZm82VkdpRmJkYnlMME5WSHBFTkR0alZhcVNXMFJNOExIaFEKNkRxUzBoZFc1VFVhUUJ3K2pTenRPZDlDNElOQmROK2p6Y0tHWUVobzQya0xWQUNMNUhacElRMTVUalFJWGhUQ3pMRzNyZGQ4Y0lySApoUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVKys4TmhwNnc0OTJwdWZFaEYzOCsvUEIzS3hvd0RnWURWUjBQQVFIL0JBUURBZ0VHCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGbi84b3oxaDMxeFBhT2ZHMXZSMnZqVG5HczIKdlp1cFlldmVGaXgwUFo3bWRkclh1cWU4UWhmblBaSHI1WDNkUHB6eHo1S3NiRWpNd2lJL2FUdkZ0aFV2b3pYR2FDb2NWNjg1NzQzUQpOY01ZREhzQVZoek5peGwwM3I0UEV1RFFxcUUvQWpTeGNNNmRHTllJQXdsRzdtRGdmcmJFU1FSUmZYQmd2S3F5LzNseWVxWWRQVjhxCitNcmkvVG0zUjducmZ0OEVJNi82bkFZSDZmdGprNEJBdGNac0NqRW96Z3lmejdNak5ZQkJqV3pFTjN1Qkw0Q2hRRUtGNmRrNGplaWgKVTgwQnYybm9XZ2J5UlF1UStxN2h2NTN5cmxjOHBhNnlWdlNMWlVEcC9UR0JMUFE1Q2RqdWE2ZTBwaDBWcFpqM0FZSFloWDN6VVZ4eAppTjY2ekIrQWZrbz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKZW1TaWduIEVDQyBSb290IENBIC0gRzMKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNUakNDQWRPZ0F3SUJBZ0lLUFBZSHFXaHdEdHFMaERBS0JnZ3Foa2pPUFFRREF6QnJNUXN3Q1FZRFZRUUdFd0pKVGpFVE1CRUcKQTFVRUN4TUtaVzFUYVdkdUlGQkxTVEVsTUNNR0ExVUVDaE1jWlUxMVpHaHlZU0JVWldOb2JtOXNiMmRwWlhNZ1RHbHRhWFJsWkRFZwpNQjRHQTFVRUF4TVhaVzFUYVdkdUlFVkRReUJTYjI5MElFTkJJQzBnUnpNd0hoY05NVGd3TWpFNE1UZ3pNREF3V2hjTk5ETXdNakU0Ck1UZ3pNREF3V2pCck1Rc3dDUVlEVlFRR0V3SkpUakVUTUJFR0ExVUVDeE1LWlcxVGFXZHVJRkJMU1RFbE1DTUdBMVVFQ2hNY1pVMTEKWkdoeVlTQlVaV05vYm05c2IyZHBaWE1nVEdsdGFYUmxaREVnTUI0R0ExVUVBeE1YWlcxVGFXZHVJRVZEUXlCU2IyOTBJRU5CSUMwZwpSek13ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUWpwUXk0TFJMMUtQT3hzdDNpQWhLQW5qbGZTVTJmeVNVMFdYVHN1d1ljCjU4QnlyK2l1TCtGQlZJY1VxRXF5Nkh5QzVsdHF0ZHl6ZGM2TEJ0Q0dJNzlHMVk0UFB3VDAxeHlTZnZhbFk4TDFYNDR1VDZFWUdRSXIKTWdxQ1pIMFdrOUdqUWpCQU1CMEdBMVVkRGdRV0JCUjhYUUtFRTlUTWlwdUJ6aGNjTGlrZW5FaGpRakFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOcEFEQm1BakVBdnZOaHp3SVFIV1NWQjdnWWJvaUZCUytECkNCZVF5aCtLVE9nTkczcXhyZFdCQ1Vmdk82d0lCSHhjbWJIdFJ3ZlNBakVBbmJwVi9LbEs2TzN0NW5ZQlFudkkrR0RaalZHTFZUdjcKakh2clpRbkQrSmJOUjZpQzhoWlZkeVIrRWhDVkJDeWoKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKZW1TaWduIFJvb3QgQ0EgLSBDMQo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEY3pDQ0FsdWdBd0lCQWdJTEFLN1BBTHJFenpMNFE3SXdEUVlKS29aSWh2Y05BUUVMQlFBd1ZqRUxNQWtHQTFVRUJoTUNWVk14CkV6QVJCZ05WQkFzVENtVnRVMmxuYmlCUVMwa3hGREFTQmdOVkJBb1RDMlZOZFdSb2NtRWdTVzVqTVJ3d0dnWURWUVFERXhObGJWTnAKWjI0Z1VtOXZkQ0JEUVNBdElFTXhNQjRYRFRFNE1ESXhPREU0TXpBd01Gb1hEVFF6TURJeE9ERTRNekF3TUZvd1ZqRUxNQWtHQTFVRQpCaE1DVlZNeEV6QVJCZ05WQkFzVENtVnRVMmxuYmlCUVMwa3hGREFTQmdOVkJBb1RDMlZOZFdSb2NtRWdTVzVqTVJ3d0dnWURWUVFECkV4TmxiVk5wWjI0Z1VtOXZkQ0JEUVNBdElFTXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXordXAKdWZHWkJjellLQ0ZLODNNMFVZUldFUFdnVHl3UzQvb1RtaWZRei9sNUduUmZIWGs1L0Z2NGNJN2drbEwzNUNYNVZJUFpIZFBJV29VLwpYc2UyQis0K3dNNmFyNnhXUWlvNUpYRFd2N1Y3TnEyczluUGN6ZGNkaW9PbCt5dVFGVGRySENaSDNEc3BWcE5xczhGcU9wMDk5Y0dYCk9GZ0ZpeHdSNCtTMHVGMkZIWVArZUY4TFJXZ1lTS1ZHY3pRNy9nL0lkcnZIR1BNRjBZYnpoZTNudWRreXJWV0l6cWEya2JCUHJINFYKSTViMlAvQWdOQmJlQ3NiRUJFVjVmNmY5dnRLcHBhK2N4U01xOXp3aGJMMnZqMDdGT3JMek5CTDgzNEFhU2FUVXFaWDNub2xlb29tcwpsTXVvYUp1dmltVW56WW51M1l5MWF5bHdRNkJwQytTNUR3SURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVUvcUhnY0I0cUF6bFNXa0srClhKR0ZlaGlxVGJVd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dFQkFNSktWdm9WSVhzb291bmxIZnY0TGNRNWxrRk1PeWNzeEd3WUZZREdySzlIV1M4bUMrTTJzTzg3L2tPWFNUS1pFaFZiM3hFcAovNnRUK0x2QmVBK3NuRk92Vjcxb2pEMXBNL0Nqb0NOak8yUm5Ja1N0MVhITFZpcDRrcU5QRWpFMk51TGUvZ0RFbzJBUEo2MmdzSXExCk5ucFNvYjBuOUNBbll1aE5sQ1FUNUFvRTZUeXJMc2hEQ1VyR1lRVGxTVFIrMDhUSTlRL0FxdW02VkY3ell5dFBUMURVL3JsN21ZdzkKd0M2OEFpdlR4RURraWdjeEhwdk9KcGtUK3hIcW1pSU1FUm5IWGh1QlVERElsaEp1NTh0QmY1RTdva2UzVklBYjNBRE1tcERxdzhOUQpCbUlNTU1BVlNLZW9XWHpocmlLaTRncDZEL3BpcTFKTTRmSGZ5cjZERFVJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgplbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMwo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0t6Q0NBYkdnQXdJQkFnSUtlM0cyZ2xhNEVueWNxREFLQmdncWhrak9QUVFEQXpCYU1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFRwpBMVVFQ3hNS1pXMVRhV2R1SUZCTFNURVVNQklHQTFVRUNoTUxaVTExWkdoeVlTQkpibU14SURBZUJnTlZCQU1URjJWdFUybG5iaUJGClEwTWdVbTl2ZENCRFFTQXRJRU16TUI0WERURTRNREl4T0RFNE16QXdNRm9YRFRRek1ESXhPREU0TXpBd01Gb3dXakVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBc1RDbVZ0VTJsbmJpQlFTMGt4RkRBU0JnTlZCQW9UQzJWTmRXUm9jbUVnU1c1ak1TQXdIZ1lEVlFRRApFeGRsYlZOcFoyNGdSVU5ESUZKdmIzUWdRMEVnTFNCRE16QjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQlAybFlhNTdKaEFkCjZiY2lNSzRHOUlHenNVSnhsVG04MDFManI2LzU4cGMxa2paR0RvZVZqYms1V3VtNzM5RCt5QWRCUEx0VmI0T2phdnRpc0lHSkFuQjkKU01WSzQra2lWQ0pOazd0Q0RLOTNuQ09tZmRkaEVjNWx4L2gvL3ZYeXFhTkNNRUF3SFFZRFZSME9CQllFRlB0YVNOQ0FJRUR5cU9rQQpCMmtaZDZmbXcvVFBNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01Bb0dDQ3FHU000OUJBTURBMmdBCk1HVUNNUUMwMkM4Q2lmMjJUR0s2UTA0VGhISzFydDBjM3RhMTNGYVBXRUJhTGQ0Z1RDS0R5cE9vZnU0U1FNZldoMC80MzRVQ01Cd1UKWk9SOGxvTVJuTERSV21GTHBnOUowd0Q4b2Z6a3BmOS9yZGN3ME1kM2Y3NkJCMVV3VUNBVTlWYzRDcWd4VVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpIb25na29uZyBQb3N0IFJvb3QgQ0EgMwo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnp6Q0NBN2VnQXdJQkFnSVVDQlpmaWt5bDdBREprMERmeE1hdUk3Z2NXcVF3RFFZSktvWklodmNOQVFFTEJRQXdiekVMTUFrRwpBMVVFQmhNQ1NFc3hFakFRQmdOVkJBZ1RDVWh2Ym1jZ1MyOXVaekVTTUJBR0ExVUVCeE1KU0c5dVp5QkxiMjVuTVJZd0ZBWURWUVFLCkV3MUliMjVuYTI5dVp5QlFiM04wTVNBd0hnWURWUVFERXhkSWIyNW5hMjl1WnlCUWIzTjBJRkp2YjNRZ1EwRWdNekFlRncweE56QTIKTURNd01qSTVORFphRncwME1qQTJNRE13TWpJNU5EWmFNRzh4Q3pBSkJnTlZCQVlUQWtoTE1SSXdFQVlEVlFRSUV3bEliMjVuSUV0dgpibWN4RWpBUUJnTlZCQWNUQ1VodmJtY2dTMjl1WnpFV01CUUdBMVVFQ2hNTlNHOXVaMnR2Ym1jZ1VHOXpkREVnTUI0R0ExVUVBeE1YClNHOXVaMnR2Ym1jZ1VHOXpkQ0JTYjI5MElFTkJJRE13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3oKaU5mcXpnOGdUcjdtMWdOdDdsbjh3bGZmS1dpaGd3NCthTWRvV0p3Y1lFdUpRd3k1MUJXeTdzRk9kZW0xcCsvbDZUV1o1TXdjNTB0ZgpqVE13SUROVDJhYTcxVDRUanVrZmgwbXRVQzFReWhpK0FWaWlFM0NXdTRtSVZvQmMrTDBzUE9GTVY0aTcwN21WNzh2SDl0b3hkQ2ltCjVsU0o5VUV4eXVVbUdzMkM0SERhT3ltNzFRUDFtYnBWOVdUUllBNnppVW00aWk4RjBvUkZLSHlQYUZBU2VQd0x0VlBMd3BnY2hLT2UKc0w0anBOcmN5Q3NlMm01RkhvbVkydmtBTGdicEREdHcxVkFsaUpuTHpYTmc5OVgvTldmRm9ieGVxODFLdUVYcnlHZ2VEUTBVUmhMagowbVJpaWtLWXZMVEdDQWo0L2FoTVpKeDJBYjB2cVd3ekQ5Zy9LTGc4YVFGQ2huNXB3Y2tHeXVWNlJtWHB3dFpRUVM0L3QrVHRiTmUvCkpnRVJvaFlwU21zMEJwRHNFOUsyKzJwMjBqenQ4Tll0M2VFVjdLT2JMeXpKUGl2a2FUdi9jaVd4Tm9aYngzOXJpMVViU3NVZ1lUMnUKeTFEaENEcStzSTlqUVZNd0NGazhtQjEzdW1PUmVzb1FVR0MvOE5lOGxZZVBsOFgrbDJvQmxLTjhXNFVkS2prNjBGU2gwVGx4bmYwaAorYlY3OE9MZ0FvOXVsaVFsTEtBZUxLakVpYWZ2N1prR0w3WUtURS9ib3N3M0dxOUhoUzJLWDhRME5Fd0EvUmlUWnhQUk4rWkl0SXNHCnhWZDdHWVlLZWNzQXlWS3ZRdjgzaitHakhubzlVS3RqQnVjVnRUKzJSVGVVTjdGKzhrakRmOFYxL3BlTlJZOGFweHB5S0JwQUR3SUQKQVFBQm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWZCZ05WSFNNRUdEQVdnQlFYbmMwZQppOVk1SzNEVFhOU2d1Qit3QVB6RllUQWRCZ05WSFE0RUZnUVVGNTNOSG92V09TdHcwMXpVb0xnZnNBRDh4V0V3RFFZSktvWklodmNOCkFRRUxCUUFEZ2dJQkFGYlZlMjdtSWdIU1Fwc1kxUTdYWmlOYzQvNmd4NUxTNlpTdFM2TEc3Qko4ZE5WSTBsa1VtY0RydWRIcjlFZ3cKVzYyblYzT1pxZFBsdDlFdVdTUlkzR2d1TG1MWWF1UndDeTBnVUNDa01wWFJBSmk3MC8zM012Skpyc1o2NEVlK2JzN0xvM0k2TFdsZAp5OGpvUlRuVStrTEJFVXgzWFpMN2F2OVlST1hyZ1o2dm9KbXR2cWtCWnNzNEhUemZReC8wVFc2MHVoZEcvSDM5aDRGNWFnMHpEL292CitCUzVnTE5kVGFxWDRmbmtHTVg0MVRpTUpqejk4aWppN2xwSmlDemZlVDJPbnBBOHZVRktPdDFiOXBxMHpqOGxNSDh5ZmFJRGxORGMKZXFGUzNtNlRqUmdtL1ZXc3ZZK2Iwcyt2NTRZc3l4OEpiNk52cVlUVWM3OU5vWFFiVGlOZzhzd09xbitrbkV3bHFMSm1PemovMlpRdwo5bktFdm1oVkVBL0djeXdXYVpNSC9yRkY3YnVpVldxdzJyVktBaVVuaGRlM3Q0WkVGb2xzZ0NzK2w2bWMxWDVWVE1iZVJSQWM2dWs3Cm53TlQ3dTU2QVFJV2VOVG93cjVHZG9nVFB5SzdTQklkVWdDMEFuNGhHaDZjSmZUelBWNGUwaHo1c3kyMjl6ZGN4c3NoVHJEM21VY1kKaGNFcnVsV3VCdXJRQjdMY3E5Q0NsblhPMGxEK21lZlBMNS9uZHRGaEt2c2h1ekhRcXA5SHBMSWl5aFk2VUZmRVcwTm54V1ZpQTBrQgo2MFBaMlBpZXJjK3hZdzVGOUtCYUxKc3R4YWJBcmFoSDlDZE1PQTB1RzBrN1V2VG9pSU1yVkNqVThqVlN0REtEWW1sa0RKR2NuNWZxCmRCYjlIeEVHbXB2MAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpNaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDV1RDQ0FkK2dBd0lCQWdJUVp2STlyNGZlaTdGSzZneFhNUUhDN0RBS0JnZ3Foa2pPUFFRREF6QmxNUXN3Q1FZRFZRUUdFd0pWClV6RWVNQndHQTFVRUNoTVZUV2xqY205emIyWjBJRU52Y25CdmNtRjBhVzl1TVRZd05BWURWUVFERXkxTmFXTnliM052Wm5RZ1JVTkQKSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1SURJd01UY3dIaGNOTVRreE1qRTRNak13TmpRMVdoY05OREl3TnpFNApNak14TmpBMFdqQmxNUXN3Q1FZRFZRUUdFd0pWVXpFZU1Cd0dBMVVFQ2hNVlRXbGpjbTl6YjJaMElFTnZjbkJ2Y21GMGFXOXVNVFl3Ck5BWURWUVFERXkxTmFXTnliM052Wm5RZ1JVTkRJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVJREl3TVRjd2RqQVEKQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFUVXZEMENRblZCRXlQTmdBU0dBbEV2YXFpQllndGx6UGJLblI1dlNtWlJvZ1BablpINgp0aGF4akc3ZWZNM2JlYVl2enJ2T2NTL2xwYXNvN0dNRVpwbjQrdktURUFYaGdTaEM0OFpvOU9ZYmhHQktpYS90ZVE4N3p2SDJSUFVCCmVNQ2pWREJTTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlRJeTVseWNGSU0KK09hK3NnUlhLU3JQUWhEdE5UQVFCZ2tyQmdFRUFZSTNGUUVFQXdJQkFEQUtCZ2dxaGtqT1BRUURBd05vQURCbEFqQlk4azNxRFBsZgpYdTVnS2NzNjh0dldNb1FaUDN6Vkw4S3h6Sk91VUxzSk1zYkc3WDdKTnBRUzVHaUZCcUliMEM4Q01RQ1o2UmEwRHZwV1NOU2tNQmFSCmVOdFVqR1VCaXVkUVpzSXh0em02dUJvaUIwNzhhMVFXSVA4cnRlZE1ERTJtVDNNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpNaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGcURDQ0E1Q2dBd0lCQWdJUUh0T1hDVi9ZdExOSGNCNnF2bjlGc3pBTkJna3Foa2lHOXcwQkFRd0ZBREJsTVFzd0NRWURWUVFHCkV3SlZVekVlTUJ3R0ExVUVDaE1WVFdsamNtOXpiMlowSUVOdmNuQnZjbUYwYVc5dU1UWXdOQVlEVlFRREV5MU5hV055YjNOdlpuUWcKVWxOQklGSnZiM1FnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNUlESXdNVGN3SGhjTk1Ua3hNakU0TWpJMU1USXlXaGNOTkRJdwpOekU0TWpNd01ESXpXakJsTVFzd0NRWURWUVFHRXdKVlV6RWVNQndHQTFVRUNoTVZUV2xqY205emIyWjBJRU52Y25CdmNtRjBhVzl1Ck1UWXdOQVlEVlFRREV5MU5hV055YjNOdlpuUWdVbE5CSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1SURJd01UY3cKZ2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREtXNzZVTTR3cGxaRVdDcFc5UjJMQmlmT1pOdDlHa01tbAo3WGhxYjBlUmFQZ25aMUF6SGFHbSsrRGxRNk9FQWxjQlhaeElRSUpURUx5L3h6dG9rTGFDTGVYMFpkRE1iUm5NbGZsN3JFcVVyUTdlClMwTWRod2VTRTVDQWcyUTFPUVQ4NWVsc3M3WWZVSlE0WlZCY0YwYTV0b1cxSExVWDZOWkZuZGl5SnJES3hIQktybUNrM2JQWjdQdzcKMVZkeXZEL0l5YkxlUzJ2NEkyd0R3QVc5bGNmTmN6dG1nR1RqR3F3dStVY0Y4Z2EybTNQMWVETmJ4Nkg3SnlxaHRKcVJqSkhUT29JKwpka0MwelZKaFVYQW9QOFhGV3ZMSmpFbTdGRnROeVA5blRVd1NscTMxL25pb2w0ZlgvVjRnZ055aFN5TDcxSW10dXM1SGwwZFZlNDlGCnlHY29oSlVjYUREdjcwbmdOWHRrNTVpd2xOcE5oVHMrVmNRb3IxZnpuaFBiUmllZkhxSmVSSU9rcGNyVkU3TkxQOFRqd3VhR1lhUlMKTUxsNklFOXZEemhUeXpNTUV5dVAxcHE5S3NndHNSeDlTMUhLUjlGSUozSmRoK3ZWUmVaSVpaMnZVcEM2VzZJWVpWY1NuMmk1MUJWcgpsTVJwSXBqME0rRHQrVkdPUVZESk5FOTJrS3o4T01IWTRYdTU0K09VNFVacHl3NEtVR3NUdXF3UE4xcTNFcldRZ1I1V3JsY2lodG5KCjB0SFhVZU9yTzhaVi9SNE8wM1FLMGRxcTZtbTRseWlQU01RSCtGSkRPdlRLVlRVc3NLWnF3Sno1OG9IaEVtckFSZGxuczg3L0k2S0oKQ2xUVUZMa3FxTmZzK2F2TkpWZ3llWStRVzVnNXhBZ0d3YXgvRGowQXBRSURBUUFCbzFRd1VqQU9CZ05WSFE4QkFmOEVCQU1DQVlZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVDY3RaZjRheWNJOGF3em5qd05ucHY3dE5zaU13RUFZSkt3WUJCQUdDCk54VUJCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFLeXZQbDNDRVphSmpxUG5rdGFYRmJnVG9xWkNMZ0xORmdWWko4b2cKNkxxNDZCcnNUYWlYVnE1bFE3R1BBSnRTelZYTlV6bHRZa3lMRFZ0OExrUy9neENQODFPQ2dNTlBPc2R1RVQvbTR4YVJoUHR0aEg4MApkSzJKcDg2NTE5ZWZoR1NTdnBXaHJRbFRNOTN1Q3VwS1VZNXZWYXU2dFpSR3JveC8yS0pRSldWZ2dFYmJNd1N1YkxXWWRGUWwzSlBrCitPTlZGVDI0YmNNS3BCTEJhWVZ1MzJUeFU1bmhTblVnblpVUDVOYmNBL0ZaR09oSGliSlhXcFMycWRnWEt4ZEo1WGJMd1ZhWk9qZXgKLzJrc2taR1Q0ZDlNb3pkMlRhR2YrRzBlSGRQNjdQdjBSUjBUYmMvM1dlVWlKM0lyaHZOWHV6RHRKRTNjZlZhN283UDROSG1Kd2VEeQpBbUgzcHZ3UHV4d1hDNjVCMlh5OUo2UDlManJSazVTeGN4MGtpNjliSUltdHQyZG1lZlU2eHFhV00vNVRrc2hHc1JHUnhwbC9qOG5XClpqRWdRUkNITFF6V3dhODBtTXBrZy9zVFY5SEI4RHg2aktYQi9aVWhvSEhCazJkeEV1cVBpQXBwR1dTWkkxYjdyQ291Y0w1bXhBeUUKNytXTDg1TUIrR3FRazJkTHNtaWp0V0tQNlQrTWVqdGVEK2VNdU1aODd6ZjlkT0xJVHpOeTRaUTViYjBTcjc0TVRuQjhHMitOc3pLVApjMFFXYmVqMDkrQ1ZnSStXWFRpazlLdmVDakNIazloTkFIRmlSU2RMT2tLRVczOWx0MmMwVWkyY0ZtdXFxTmg3bzBKTWNjY015ajZECjVLYnZ0d0V3WGxHamVmVndhYVpCUkErR3NDeVJ4ajNxcmcrRQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgplLVN6aWdubyBSb290IENBIDIwMTcKPT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUURDQ0FlV2dBd0lCQWdJTUFWUkk3eUg5bDFrTjlRUUtNQW9HQ0NxR1NNNDlCQU1DTUhFeEN6QUpCZ05WQkFZVEFraFZNUkV3CkR3WURWUVFIREFoQ2RXUmhjR1Z6ZERFV01CUUdBMVVFQ2d3TlRXbGpjbTl6WldNZ1RIUmtMakVYTUJVR0ExVUVZUXdPVmtGVVNGVXQKTWpNMU9EUTBPVGN4SGpBY0JnTlZCQU1NRldVdFUzcHBaMjV2SUZKdmIzUWdRMEVnTWpBeE56QWVGdzB4TnpBNE1qSXhNakEzTURaYQpGdzAwTWpBNE1qSXhNakEzTURaYU1IRXhDekFKQmdOVkJBWVRBa2hWTVJFd0R3WURWUVFIREFoQ2RXUmhjR1Z6ZERFV01CUUdBMVVFCkNnd05UV2xqY205elpXTWdUSFJrTGpFWE1CVUdBMVVFWVF3T1ZrRlVTRlV0TWpNMU9EUTBPVGN4SGpBY0JnTlZCQU1NRldVdFUzcHAKWjI1dklGSnZiM1FnUTBFZ01qQXhOekJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCSmJjUFlyWXNIdHZ4aWUrUkpDeApzMVlWZTQ1REpIMGFoRm51WTJpeXhsNkgwQlZJSHFpUXJiMVRvdHJlT3BDbVlGOW9NcldHUWQrSFd5eDd4ZjU4ZXRxall6QmhNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlNIRVJVSTBhckJlQXl4cjg3R3laRHYKdnpBRXdEQWZCZ05WSFNNRUdEQVdnQlNIRVJVSTBhckJlQXl4cjg3R3laRHZ2ekFFd0RBS0JnZ3Foa2pPUFFRREFnTkpBREJHQWlFQQp0VmZkMTRwVkN6Ymhoa1Q2MU5sb2piamNJNHFLRGRRdmZlcHo3TDlOYktnQ0lRRExwYlFTK3VlMTZNOStrL3p6Tlk5dlRscDh0THhPCnN2eHlxbHRaK2VmY01RPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKY2VydFNJR04gUm9vdCBDQSBHMgo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUnpDQ0F5K2dBd0lCQWdJSkVRQTB0azdHTmkwMk1BMEdDU3FHU0liM0RRRUJDd1VBTUVFeEN6QUpCZ05WQkFZVEFsSlBNUlF3CkVnWURWUVFLRXd0RFJWSlVVMGxIVGlCVFFURWNNQm9HQTFVRUN4TVRZMlZ5ZEZOSlIwNGdVazlQVkNCRFFTQkhNakFlRncweE56QXkKTURZd09USTNNelZhRncwME1qQXlNRFl3T1RJM016VmFNRUV4Q3pBSkJnTlZCQVlUQWxKUE1SUXdFZ1lEVlFRS0V3dERSVkpVVTBsSApUaUJUUVRFY01Cb0dBMVVFQ3hNVFkyVnlkRk5KUjA0Z1VrOVBWQ0JEUVNCSE1qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQCkFEQ0NBZ29DZ2dJQkFNREZkUm1SZlVSMGRJZitEanVXM05nQkZzenVZNUhuQzIvT093cHBHbnpDNDYrQ2pvYlhYbzlYNjlNaFdmMDUKTjBJd3ZsRHF0ZytwaU5ndUxXa2g1OUUzR0U1OWtkVVdYMnRiQU1JNVF3MDJoVks1VTJVUEhVTGxqODhGMCs3Y0RCclp1SXQ0SW1mawphYkJveFR6a2JGcEc1ODNIK3UvRTdFdTlhcVNzL2N3b1VlK1N0Q21ycXpXYVRPVEVDTVltelBocG4rU2M4Q25UWFBuR0ZpV2VJOE1nCndUMFBQemhBc1A2Q1JEaXFXaHFLYTJOWU9MUVYwN1lSYVhzZVZPNk1HaUtzY3BjL0kxbWJ5U0tFd1FkUHpIL2lWOG9TY0x1bVpmTnAKZFdPOWxmc2JsODNrcUsvMjBVNm8yWXB4Sk0wMlBieVd4UEZzcWE3bHp3MXVLQTJ3RHJYS1VYdDRGTU1nTDMvN0ZGWGhFWm45MVFxaApuZ0xqWWwvck5Vc3N1SExvUGoxUHJDeTdMb2JpbzNhUDVaTXF6NldyeUZ5TlN3Yi9Fa2FzZU1zVUJ6WGdxZCtMNmE4VlR4YUpXNzMyCmpjWlpyb2lGRHNHSjZ4OW54VVdPLzIwM05pdDRab09SVVNzOS8xRjNkbUtoN0djK1BvR0Q0RmFwVUI4ZmVwbXJZNytFRjNmeERUdmYKOTV4aHN6V1lpanF5N0R3YU56OStqNUxQMlJJVVpOb1FBaFZCLzAvRTZ4eWp5ZnFaOTBicDRSalpzYmd5TGNzVURGRFlnMldEN3JsYwp6OHNGV2t6NkdaZHIxbDBUMDhKY1ZMd3ljNkI0OWZGdEhzdWZwYWFmSXR6UlVaNkNlV1JnS1JNK28vMVBjbXFyNHRUbHVDUlZMRVJMCmlvaEVuTXFFMHlvN0FnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWQKRGdRV0JCU0NJUzFteHRlZzRCWHJ6a3dKZDhSZ25sUnVBekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBWU40YXVPZnlZSUxWQXpPQgp5d2FLOFNKSjZlanFrWC9HTTE1b0dRT0dPME1CendkdzVBZ2VaWVdSNWhFaXQvVUNJNDZ1dVI1OUgzNXM1cjBsMVpVYThnV21yNFVDCmI2NzQxakgvSmNsS3lNZUtxZG1mUzBtYkVWZVpra01SM3JZenBNelhqV1I5MU0wOEtDeTBtcGJxVGZYRVJNUWxxaUNBMkNsVjkrQkIKL0FZbS83azI5VU1VQTJaNDRSR3gyaUJmUmdCNEFDR2xIZ0FvWVhodnFBRUJqNTAwbXYvME9KRDd1Tkd6Y2diSmNlYUJ4WG50QzZaNQo4aE1MblBkZERuc2trN1JJMjRaZjNsQ0dlT2RBNWpHb2tIWndZYStjTnl3UnRZSzNxcTRrTkZ0eURHa056Vm1mOW5Hdm5BdlJDamo1CkJpS0RVeVVNL0ZIRTVyN2lPWlVMSksydjBaWGtsdGQwWkd0eFRnSThxb1h6SUtORE9YWmJiRkQrbXB3VUhtVVVpaFc5bzRKRldrbFcKYXRLY3NXTXk1V0hnVXlJT3B3cEo2c3QrSDZqaVlvRDJFRVZTbUFZWTNxWE5MMytxMU9rK0NITHNJd01DUEthcTJMeG5kRDBVRi90VQpTeGZqMDNrOWJXdEp5U2dPTG5SUXZ3elpSam9RaHNtblArbWc3SC9ycFhkWWFYSG1nd28zOG9aSmFyNTVDSkQyQWhaa1B1WGFUSDRNCk5NbjVYN2F6S0ZHbnB5dXFTZnFOWlNsTzQyc1RwNVNqTFZGdGVBeEV5OS9lQ0cvT28yU3IwNVdFMUxsU1ZISjdsaVhNdkdualNHNE4KME1lZEo1cXErQk9TM1I3Zlk1ODFxUlkyN0l5NGcvUTlpWS9OdEJkZTE3TVhRUkJkSjNOZ2hWZEpJZ2M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRydXN0d2F2ZSBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjJqQ0NBOEtnQXdJQkFnSU1CZmNPaHRwSjgwWTFMcnF5TUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdJTVFzd0NRWURWUVFHRXdKVgpVekVSTUE4R0ExVUVDQXdJU1d4c2FXNXZhWE14RURBT0JnTlZCQWNNQjBOb2FXTmhaMjh4SVRBZkJnTlZCQW9NR0ZSeWRYTjBkMkYyClpTQkliMnhrYVc1bmN5d2dTVzVqTGpFeE1DOEdBMVVFQXd3b1ZISjFjM1IzWVhabElFZHNiMkpoYkNCRFpYSjBhV1pwWTJGMGFXOXUKSUVGMWRHaHZjbWwwZVRBZUZ3MHhOekE0TWpNeE9UTTBNVEphRncwME1qQTRNak14T1RNME1USmFNSUdJTVFzd0NRWURWUVFHRXdKVgpVekVSTUE4R0ExVUVDQXdJU1d4c2FXNXZhWE14RURBT0JnTlZCQWNNQjBOb2FXTmhaMjh4SVRBZkJnTlZCQW9NR0ZSeWRYTjBkMkYyClpTQkliMnhrYVc1bmN5d2dTVzVqTGpFeE1DOEdBMVVFQXd3b1ZISjFjM1IzWVhabElFZHNiMkpoYkNCRFpYSjBhV1pwWTJGMGFXOXUKSUVGMWRHaHZjbWwwZVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTGxkVVNoTFBEZVMwWUxPdlIyOQp6ZDI0cTg4S1B1RmQ1ZHlxQ2JsWEFqN21ZMkhmOGcrQ1k2Nmo5Nnh6MFh6bnN3dXZDQUFKV1gvTktTcUlrNGNYR0lEdGlMSzB0aEFmCkxkWmZWYUlUWGRIRzZ3WldpWWorckRLZC9WekRCY2R1N29hSnVvZ0RuWEloaHBDdWp3T2wzSitJS011amtra1A3TkFQNG0xRVQ0QnEKc3RUbm9BcFRBYnFPbDVGMmJyejgxV3MyNWtDSTFuc3ZYd1hvTEcwUjgrZXl2cEpFVE5LWHBQN1Njb0ZEQjV6cEVUNzFpeHBaZlI5bwpXTjBFQUN5VzgwT3pmcGdaZE5tY2M5a1l2a0hITkhuWjlHTENRN216SjdBaXkvazlVc2N3UjdQSlByaHE0dWZvZ1hCZVFvdFBKcVgrCk9zSWdicnY0Rm83TkRLbTBHMngyRU9GWWVVWStWTTZBcUZjSk55a2JtUk9QRE1qV0xCejdCZWdJbFQxbFJ0enV6V25pVFkrSEtFNDAKQ3o3UEZObTczYlpRbXExMzFCblcyaHFJeUU0YkozWFlzZ2p4cm9Nd3VSRU96WWZ3aEkwVmNueWg3OHp5aUdHNjlHbTdESXdMZFZjRQp1RTRxRkM0OUR4d2VNcVppTnU1bTRpSzRCVUJqRUNMek14MTBjb29zOVRrcG9OUG5HNENFTGNVOTQwMngvUnB2dW1VSE8xanNRa1VtCis5amFKWExFOWdDeElubTk0M3haWWtxY0JXODl6dWJXUjJPWnhpUnZjaExJckgrUXRBdVJjT2kzNWhZUWNSZk8zZ1pQU0VGOU5VcWoKaWZMSlMzdEJFVzFudHdpWVRPVVJHYTVDZ056N2tBWFUrRkRLdnVTdHg4S1UxeGFkNWhlUHJ6YjdBZ01CQUFHalFqQkFNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkpuZ0dXY05ZdHQyczlvOXVGdm8vVUxTTVE2SE1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFtSE53NHJEVDdUbnNUR0RacVJLR0Z4NlcwT2hVS0R0a0xTR20rSjFXRTJwSVBVL0gKUGluYmJWaURWRDJIZlNNRjFPUWMzT2c0WlliRmRhZGEyelVGdlhmZXV5azNRQVVIdzVSU244cGszZkViSzl4R0NoQUNNZjFLYUEwSApaSkRtSHZVcW9haTdQRjM1b3dnTEVRenhQeTBRbEcvKzRqU0hnOWJQNVJzMWJkSUQ0YkFOcUtDcVJpZUNOcWNWdGdpbVFsUlh0cGxhCjRndDVrTmRYRWxFMUdZaEJhQ1hVTnhlRUZmc0JjdHlWM2xJbUlKZ200bmIxSjIvNkFEdEtZZGtOeTFHVEt2MFdCcGFuSTVvalNQNVIKdmJiRXNMRlV6dDVzUWEwV1ozN2IvVGpOdVRoT3NzRmd5NTBYMzFpZWVtS3lKbzkwbFp2a1d4M1NEOTJZSEp0WnVTUFRNYUNtL3pqZAp6eUJQNlZoV09tZkQwZmFabVoyNk5yYUFMNGhIVDRhL1JEcUE1RGNjcHJycWw1Z1IwSVJpUjJRZXF1NUF2elN4bkk5TzRmS1NUeCtPCjg1Nlgzdk9tZVdxSmNVOUxKeGRJL3V6MFVBOVBTWDNNUmVPOWVrREZRZHhoVmljR2FlVnlRWUhUdGdHSm9DODZjbm4rT2pDL1FlekgKWWo2UlM4ZlpNWFpDK2ZjOFkrd21qSE1NZlJvZDZxaDhoNmpDSjN6aE0wRVB6OC84QUtBaWdKNUtwMjhBc0VGRnR5TEthRWpGUXFLdQozUjN5NEc1T0JWaXh3SkFXS3FROUVFQytqMkpqZzZtY2duMHRBdW1ETUh6TEo4bjlIbVlBc0M3VElTK09NeFpzbU8wUXFBZld6SlBQCjI5RnBIT1RLeWVDMm5Pbk9jWEhlYkQ4V3BIaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDWURDQ0FnZWdBd0lCQWdJTURXcGZDRDhvWEQ1UmxkOWRNQW9HQ0NxR1NNNDlCQU1DTUlHUk1Rc3dDUVlEVlFRR0V3SlZVekVSCk1BOEdBMVVFQ0JNSVNXeHNhVzV2YVhNeEVEQU9CZ05WQkFjVEIwTm9hV05oWjI4eElUQWZCZ05WQkFvVEdGUnlkWE4wZDJGMlpTQkkKYjJ4a2FXNW5jeXdnU1c1akxqRTZNRGdHQTFVRUF4TXhWSEoxYzNSM1lYWmxJRWRzYjJKaGJDQkZRME1nVURJMU5pQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB4TnpBNE1qTXhPVE0xTVRCYUZ3MDBNakE0TWpNeE9UTTFNVEJhTUlHUk1Rc3dDUVlEClZRUUdFd0pWVXpFUk1BOEdBMVVFQ0JNSVNXeHNhVzV2YVhNeEVEQU9CZ05WQkFjVEIwTm9hV05oWjI4eElUQWZCZ05WQkFvVEdGUnkKZFhOMGQyRjJaU0JJYjJ4a2FXNW5jeXdnU1c1akxqRTZNRGdHQTFVRUF4TXhWSEoxYzNSM1lYWmxJRWRzYjJKaGJDQkZRME1nVURJMQpOaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJINzdiT1lqCjQzTXlDTXBnNWxPY3VuU05HTEI0a0ZLQTNUakFTaDNScU15VHBKY0dPTW9ORldMR2pnRXFaWjJxM3pTUkxvSEI1RE9TTWNUOUNUcW0KUDYyalF6QkJNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEd1lEVlIwUEFRSC9CQVVEQXdjR0FEQWRCZ05WSFE0RUZnUVVvMEVHckpCdAowVXJyZGFWS0VKbXpzYUdMU3Zjd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ0IrWlUyZzZnV3JLdUVaK0h4YmIvYWQ0bHZ2aWd0d2p6ClJNNHEzd2doRERjQ0lDMG1BNkFGdld2UjlsejRaY3lHYmJPY05FaGpoQW5GalhjYTRzeWM0WFI3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRydXN0d2F2ZSBHbG9iYWwgRUNDIFAzODQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ25UQ0NBaVNnQXdJQkFnSU1DTDJGbDJ5Wko2U0FhRWM3TUFvR0NDcUdTTTQ5QkFNRE1JR1JNUXN3Q1FZRFZRUUdFd0pWVXpFUgpNQThHQTFVRUNCTUlTV3hzYVc1dmFYTXhFREFPQmdOVkJBY1RCME5vYVdOaFoyOHhJVEFmQmdOVkJBb1RHRlJ5ZFhOMGQyRjJaU0JJCmIyeGthVzVuY3l3Z1NXNWpMakU2TURnR0ExVUVBeE14VkhKMWMzUjNZWFpsSUVkc2IySmhiQ0JGUTBNZ1VETTROQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncweE56QTRNak14T1RNMk5ETmFGdzAwTWpBNE1qTXhPVE0yTkROYU1JR1JNUXN3Q1FZRApWUVFHRXdKVlV6RVJNQThHQTFVRUNCTUlTV3hzYVc1dmFYTXhFREFPQmdOVkJBY1RCME5vYVdOaFoyOHhJVEFmQmdOVkJBb1RHRlJ5CmRYTjBkMkYyWlNCSWIyeGthVzVuY3l3Z1NXNWpMakU2TURnR0ExVUVBeE14VkhKMWMzUjNZWFpsSUVkc2IySmhiQ0JGUTBNZ1VETTQKTkNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJHdmFEWFUxQ0RGSApCYTVGbVZYeEVSTXVTdmdRTVNPamZvUFRmeWdJT2lZYU9zK1hnaCtBdHljSmo5R09NTVFLbXc2c1dBU3I5elo5bENPa213cUtpNnZyCi9Ua2xadkZlL295dWpVRjVuUWxnemlpcDA0cHQ4OVpGMVBLWWhEaGxvS05ETUVFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBUEJnTlYKSFE4QkFmOEVCUU1EQndZQU1CMEdBMVVkRGdRV0JCUlZxWVNKMHNFeXZSakxiS1lIVHNqbm5iNkNrREFLQmdncWhrak9QUVFEQXdObgpBREJrQWpBM0FaS1hSUkorb1BNK3JSazZjdDMwVUpNREVyNUUwazlCcEl5Y25SK2o5c0tTNTBnVS9rNmJwWkZYcnNZM2Nyc0NNR2NsCkNyRU1YdTZwWTVKdjVaQUwvbVlpeWtmOWlqSDNnLzU2dnhDK0dDc2VqL1lwSHBSWjc0NGhOOHRSbUtWdVN3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZvakNDQTRxZ0F3SUJBZ0lVQVpRd0hxSUwzZlhGTXlxeFEwUngrTlpRVFEwd0RRWUpLb1pJaHZjTkFRRU1CUUF3YVRFTE1Ba0cKQTFVRUJoTUNTMUl4SmpBa0JnTlZCQW9NSFU1QlZrVlNJRUpWVTBsT1JWTlRJRkJNUVZSR1QxSk5JRU52Y25BdU1USXdNQVlEVlFRRApEQ2xPUVZaRlVpQkhiRzlpWVd3Z1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB4TnpBNE1UZ3dPRFU0Ck5ESmFGdzB6TnpBNE1UZ3lNelU1TlRsYU1Ha3hDekFKQmdOVkJBWVRBa3RTTVNZd0pBWURWUVFLREIxT1FWWkZVaUJDVlZOSlRrVlQKVXlCUVRFRlVSazlTVFNCRGIzSndMakV5TURBR0ExVUVBd3dwVGtGV1JWSWdSMnh2WW1Gc0lGSnZiM1FnUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzIxUEdUWExWQWlRcXJEWkJiClVHT3VrSlIwRjBWeTFudGxXaWxMcDFhZ1M3Z3ZRblhwMlhza1dqRmxxeGNYMFRNNjJSSGNRRGFIMzhkcTZTWmVXWXAzNCtoSW5ERVcKK2o2UnNjckpvK0tmemlGVG93STJNTXRTQXVYYU1sM0R4ZWI1N2hISGk4bEVIb1NUR0VxMG4rVVNaR25RSm9WaUFiYkpBaDIrZzFHNwpYTnI0clJWcW1mZVNWUGMwVyttLzZpbUJFdFJUa1phemtWcmQvcEJ6S1Bzd1JyWEtDQWZIY1hMSlp0TTBsL2FNOUJoSzRkQTlXa1cyCmFhY3AreVBPaU5nU25BQklxS1lQc3p1U2pYRU9kTVdMeUV6NTlKdU91RHhwN1c4N1VDOVk3Y1N3MEJ3YmFneml2RVNxMk0wVVhaUjQKWWI4T2J0b3F2QzhNQzNHbXN4WS9uT2I1eko5VE5lSURvS0FZdjd2eHZ2VFdqSWNOUXZjR3VmRnQ3UVNVcVA2MjB3YkdRR0hmblozegpWSGJPVXpvQnBwSkI3QVNqancyaTFRbksxc3VhOGU5RFhjQ3JwVUhQWEZOd2NNbUlwaTNVYTJGelVDYUdZUTVmRzhJcjRvelZ1NTNCCkEwSzZsTnBmcWJES3pFMEs3MGRwQXk4aSsvRW96cjlkVUdXb2tHMnpkTEFJeDZ5bzBlcytuUHhkR29NdUs4dTE4MFNkT3FjWFlaYWkKY2ROd2xoVk50MHh6N2hsY3hWcytRZjZzZFdBN0cyUE9BTjNhQ0pCaXRPVXQ3a2luYXhlWlZMNkhTdU9wWGdSTTZ4QnRWTmJ2OGVqeQpZaGJMZ0d2dFBlMzFIekNscmt2SkUrMktBUUhKdUZGWXdHWTZzV1pMeE5VeEFtTHBkSVFNMjAxR0xRSURBUUFCbzBJd1FEQWRCZ05WCkhRNEVGZ1FVMHArSTM2SE5MTDNzOVRzQkFaTXpKN0xyWUVzd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUIKQWY4d0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFETEtnTE9kUFZRRzNkTFNMdkNrQVNFTFowaktiWTdneUtvTnFvMGhWNC9HUG5ySwoyMUhVVXJQVWxvU2xXR0IvNVF1T0gvWGNDaFdCNVR1MnR5SXZDWndURnJGc0REVUliYXRqY3UzY3Z1ekhWK1l3SUhIVzF4REJFMVVCCmpDcEQ1RUh4enpwNlU1TE9vZ01GRFRqZkFyc1FMdGs3MHB0NndLR20rTFV4NXZSMXlibFRtWFZISWxvVUZjZDRHN2FkNlF6NEczYngKaFlUZW9kb1M3NlRpRUpkNmVONE1VWmVvSVVDTGhyME44RjVPU3phN095QWZpa0pXNFFzYXYzdlFJa01zUkl6NzVTcTBiQndjdXBUZwpFMzRoNXByQ3k4VkNaTFFlbEhzSUpjaHh6SWRGVjRYVG55bGlJb05SbHdBWWwzZHFtSkxKZkdCczMyeDlTdVJ3VE1LZXVCMzMwRFRICkQ4ejdwLzhEdnExd2tOb0wzY2h0bDErYWZ3a3lRZjNOb3N4YWJVenlxa24rWnZqcDJEWHJEaWdlN2tndk90QjVDVGg4cGlLQ2s1WFEKQTc2K0FxQUYzU0FpNDI4ZGlEUmd4dVlLdVFsMUMvQUg2R21XTmNmN0k0R09PRG00UlN0RGVLTFJMQlQvRFNoeWNwV2JYZ25iaVVTWQpxcUZKdTNGUzhyLzIveWVoTnErNHRuZUkzVHFrYlpzMGtOd1VYVEMvdCtzWDVJZTNjZENoMTNjVjFFTFg4dk14bVYyYjNSWnRQK29HCkkvaEdvaUx0ay9iZG11WXFoN0dZVlBFaTkydEY0K0tPZGgyYWpjUUdqVGEzRlBPZFZHbTNqanpWcEcyVGdiZXQ5cjFrZThMSmFEbWcKa3B6Tk5JYVJrUHBrVVozKy91dWw5WFhlaWZkeQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBQyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2JqQ0NBZk9nQXdJQkFnSVFZdll5Yk9YRTQyaGNHMkxkbkM2ZGxUQUtCZ2dxaGtqT1BRUURBekI0TVFzd0NRWURWUVFHRXdKRgpVekVSTUE4R0ExVUVDZ3dJUms1TlZDMVNRMDB4RGpBTUJnTlZCQXNNQlVObGNtVnpNUmd3RmdZRFZRUmhEQTlXUVZSRlV5MVJNamd5Ck5qQXdORW94TERBcUJnTlZCQU1NSTBGRElGSkJTVm9nUms1TlZDMVNRMDBnVTBWU1ZrbEVUMUpGVXlCVFJVZFZVazlUTUI0WERURTQKTVRJeU1EQTVNemN6TTFvWERUUXpNVEl5TURBNU16Y3pNMW93ZURFTE1Ba0dBMVVFQmhNQ1JWTXhFVEFQQmdOVkJBb01DRVpPVFZRdApVa05OTVE0d0RBWURWUVFMREFWRFpYSmxjekVZTUJZR0ExVUVZUXdQVmtGVVJWTXRVVEk0TWpZd01EUktNU3d3S2dZRFZRUUREQ05CClF5QlNRVWxhSUVaT1RWUXRVa05OSUZORlVsWkpSRTlTUlZNZ1UwVkhWVkpQVXpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUEKQlBhNlYxUEl5cXZmTmtwU0llU1gwb05ubnZCbFVkQmVoOGRIc1ZueVYwZWJBQUtUUkJkcDIwTEhzYkk2R0E2MFhZeXpabDJoTlBrMgpMRW5iODBiOHMwUnBSQk5tL2RmRi9hODJUYzREVFFkeHo2OXFCZEtpUTFvS1VtOEJBMDZPaTZOQ01FQXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQUc1TCsrL0VZWmc4ay9RUVc2cmN4L24wbTVKTUFvR0NDcUcKU000OUJBTURBMmtBTUdZQ01RQ3VTdU1yUU1OMEVmS1ZyUllqM2s0TUd1WmRwU1JlYTBSNy9EamlUOHVjUlJjUlRCUW5KbFU1ZFVvRAp6Qk9RbjVJQ01RRDZTbXhnaUhQejdyaVlZcW5PSzhMWmlxWndNUjJ2c0pSTTYwL0c0OUh6WXFjOC81TXVCMXhKQVdkcEVnSnl2K2M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdsb2JhbFNpZ24gUm9vdCBSNDYKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldqQ0NBMEtnQXdJQkFnSVNFZEs3dWRjakdKNUFYd3FkTGREZkpXZlJNQTBHQ1NxR1NJYjNEUUVCREFVQU1FWXhDekFKQmdOVgpCQVlUQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpWVd4VGFXZHVJRzUyTFhOaE1Sd3dHZ1lEVlFRREV4TkhiRzlpWVd4VGFXZHVJRkp2CmIzUWdValEyTUI0WERURTVNRE15TURBd01EQXdNRm9YRFRRMk1ETXlNREF3TURBd01Gb3dSakVMTUFrR0ExVUVCaE1DUWtVeEdUQVgKQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhIREFhQmdOVkJBTVRFMGRzYjJKaGJGTnBaMjRnVW05dmRDQlNORFl3Z2dJaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNzckhReTZMTmw1YnJ0UXlZZHBva05SYm9waUxLa0hXUGQwOEVzCkNWZUpPYUZWNldjMGR3eHU1RlVkVWlYU0UydGU0UjJwdDMySk1sOE5ucDhzZW1OZ1FCK21zTFo0ajVsVWxnaFlydVFHdkdJRkFoYS8KcjZnakE3YVVEN3h1Yk1MTDFhYTdET24yd1FMN0lkNW0zUmVyZEVMdjhIUXZKZlRxYTFWYmtOdWQzMTZIQ2tEN3JSbHIrL2ZLWUlqZQoyc0dQMXE3VmY5UThnKzdYRmt5RFJUTnJKOUNHMEJ3dGEvT3JmZkdGcWZVbzBxM3Y4NFJMSElmOEU2TTZjcUphRVN2V0ozRW43WUV0CmJXYUJrb2UwRzFoNnpEOEsra1pQVFhoYytDdEk0d1NFeTEzMnRHcXpaZnhDbmxFbUl5RExQUlQ1Z2UxbEZnQlBHbVNYWmdqUGpIdmoKSzhDZCtSVHlHL0ZXYWhhL0xJV0Z6WGc0bXV0Q2FnSTBHSU1YVHBSVytMYUN0Zk9XM1QzenZuOGdkejU3R1NOckxOUnljME5YZmVENAoxMmxQRnpZRStjQ1FZRGRGM3VZTTJIU05ycHlpYlhSZFFyNEc5ZGxrYmdJUXJJbXdURHNIVFVCK0pNV0ttSUo1anFTbmdpQ05JL29uCmNjbmZ4a0Ywb0UzMmtSYmNSb3hmS1dNeFdYRU0yRy9DdGpKOSsrWmRVNlorRmZ5N2RYeGQ3UGoyRnh6c3gyc1p5L043OENzSHBkbHMKZVZSMmJKMGNwbTRPNlhrTXFDTnFvOThiTURHZnNWUjcvbXJMWnFyY1pkQ2lua3FhQnlGcmdZL2J4Rm42M2lMQUJKempxbHMyaytnOQp2WHFoblF0MnNRdkhuZjNQbUtnR3d2Z3FvNkdEb0xjbGNxVUM0d0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVQTF5cmM0R0hxTXl3cHRXVTRqYVdTZjhGbVN3d0RRWUpLb1pJaHZjTkFRRU0KQlFBRGdnSUJBSHg0N1BZQ0xMdGJmcElyWFRuY3Z0Z2Rva0l6VGZudnBDbzdSR2tlck5sRm8wNDhwOWdrVWJKVUhKTk94Tzk3azRWZwpKdW9KU09EMXU4ZnBhTks3YWpGeHpIbXVFYWp3bWYzbEg3d3ZxTXhYNjNiRUlhWkhVMVZOYUw4RnBPN1hKcXRpMmtNM1MrTEd0ZVd5Cmd4azZ4OVBiVFo0SWV2UHV6ejVpKzZ6b1lNelJ4NkZjZzBYRVJjenpGMnNVeVFRQ1B0SWtwbm5wSHM2aTU4RlpGWjhkNGt1YVBwOTIKQ0MxcjJMcFhGTnFENnY2TVZlblFUcW5NZHpHeFJCRjZYTEUrMHhSRkZSaGlKQlBTeTAzT1hJUEJOdklRdFE2SWJiamhWcCtKM3BabQpPVWRrTEc1TnJtSjd2MkIwR2JoV3JKS3NGakx0cldoVi9waTYwelRlOU1saHd3Nkc5a3VFWU80TmU3VXlXSG1SVlN5QlE3TjBIM3FxCkpaNGQxNkdMdWMxQ0xnU2tab05OaVRXMmJLZzJTbmtoZUNMUVFyelJRREdRb2I0RXo4cG43Zlh3Z05OZ3lZTXFJZ1hRQnp0U3Z3eWUKcWl2NXUrWWZqeVc2aFkwWEhnTCtYVkFFVjgvK0xienZYTUFhcTdhZkpNYmZjMmhJa0N3VTlEOVNHdVRTeXhURFlXblA0dmtZeGJvegpueFNqQkYyNWNmZTFsTmoyTThGYXdUU0xmSnZka3pybkU2SndZWit2ait2WXhYWDRNMmJVZEdjNk4zZWM1OTJrRDNaRFpvcEQ4cC83CkRFSjRZOUhpRDI5NzFLRTlkSmVGdDBnNVFkWWcvTkE2cy9yb2I4U0t1bkUzdm91WHNYZ3hUN1BudGdNVHpsU2RyaVZaekg4MVh3ajMKUUVVeGVDcDYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IEU0Ngo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDQ3pDQ0FaR2dBd0lCQWdJU0VkSzd1ak51MUx6bUpHakZEWVFkbU9oRE1Bb0dDQ3FHU000OUJBTURNRVl4Q3pBSkJnTlZCQVlUCkFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aVlXeFRhV2R1SUc1MkxYTmhNUnd3R2dZRFZRUURFeE5IYkc5aVlXeFRhV2R1SUZKdmIzUWcKUlRRMk1CNFhEVEU1TURNeU1EQXdNREF3TUZvWERUUTJNRE15TURBd01EQXdNRm93UmpFTE1Ba0dBMVVFQmhNQ1FrVXhHVEFYQmdOVgpCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4SERBYUJnTlZCQU1URTBkc2IySmhiRk5wWjI0Z1VtOXZkQ0JGTkRZd2RqQVFCZ2NxCmhrak9QUUlCQmdVcmdRUUFJZ05pQUFTY0RySFB0K2llVW5kMU5QcWxScWV0TWhreXRBZXBKOHFVdXd6U0NoREgyb213bHd4d0V3a0IKanRqcVIrcStzb0FyemZ3b0RkdXN2S1NHTisxd0NBQjE2cE1MZXk1U25DTm9Jd1pEN0pJdlU0VGIrMGNVQitoZmxHZGR5WHFCUENDagpRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlF4Q3BDUHRzYWQwa1JMCmdMV2k1aCt4RWs4YmxUQUtCZ2dxaGtqT1BRUURBd05vQURCbEFqRUEzMVNRN1p2dmk1UUNreGVDbWI2em5pejJDNUdNbjBvVXNmWmsKdkx0b1VSTU1BL2NWaTRSZ3VZdi9Vbzduakx3Y0FqQTgrUkhVakU3QXdXSENGVXlxcXgwTE1WODdIT0lBbDBReDV2NXpsaS9hbHRQKwpDQWV6TkltOEJaLzNIb2J1aTNBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHTE9CQUxUUlVTVCAyMDIwCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZnakNDQTJxZ0F3SUJBZ0lMV2t1OVd2dFBpbHY2WmVVd0RRWUpLb1pJaHZjTkFRRUxCUUF3VFRFTE1Ba0dBMVVFQmhNQ1FWUXgKSXpBaEJnTlZCQW9UR21VdFkyOXRiV1Z5WTJVZ2JXOXVhWFJ2Y21sdVp5QkhiV0pJTVJrd0Z3WURWUVFERXhCSFRFOUNRVXhVVWxWVApWQ0F5TURJd01CNFhEVEl3TURJeE1EQXdNREF3TUZvWERUUXdNRFl4TURBd01EQXdNRm93VFRFTE1Ba0dBMVVFQmhNQ1FWUXhJekFoCkJnTlZCQW9UR21VdFkyOXRiV1Z5WTJVZ2JXOXVhWFJ2Y21sdVp5QkhiV0pJTVJrd0Z3WURWUVFERXhCSFRFOUNRVXhVVWxWVFZDQXkKTURJd01JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcmk1V3JSc2M3L2FWajZCM0d5dlRZNCtFVFVXaQpENTliUmF0WmUxRTArZXlMaW5qRjNXdXZ2Y1RmazBVZXY1RTRDNjRPRnVkQmMvamJ1OUc0VWVETGd6dHpPRzUzaWc5Wll5Yk5weXJPClZQdTQ0c0I4Ujg1Z2ZEK3ljL0xBR2JhS2tvYzFEWkFvb3VRVkJHTSt1cS91ZkY3TXBvdFFzamozUVdQS3p2OXBqMmdPbFRibHpMbU0KQ2NwTDNUR1Fsc2pNSC8xV2xqVGJqaHpxTEw2RkxtUGRxcW1WMC8wcGxSUHd5SmlUMlMwV1I1QVJnNkk2SXFJb1Y2THIvc0NNS0tDbQpmZWNxUWp1Q2dHT2xZeDhaekh5eVpxakMwMjAzYitKK0JsSFpSWVFmRXM0a1VtU0ZDMGlBVG9leElpSXdxdXV1dnVBQzRFRG9zRUtBCkExR3F0SDZxUk5kRFlmT2lheGFKU2FTanBDdUtBc1I0OUdpS3dlUjZOckZ2RzVZYmQwbU4xTWtHY28vUFUrUGNGNFVnU3R5WUo5T1IKSml0SEhta0hyOTZpNU9UVWF3dXpYbnpVSklCSEtXazdidWlzL1VEcjJPMXhjU3Z5NkZnZDYwR1hJc1VmMURuUUo0K0g0eGowNEtsRwpEZlYwT29JdTBHNHNrYU14WER0RzZuc0VFRlplZ0IzMXBXWG9ndnppQjR4aVJmVWcza1p3aHFHOGs5TWVkS1pzc0N6M0F3eUlETXZVCmNsT0d2R0JHODVocXd2Ry9RL2x3SUhmS04wRjVWVkpqalZzU244Vm94SWlkclBJd3E3ZWpNWmRuclk4WEQyekhjKzBrbEd2SWc1clEKbWpkSkJLdXhGc2hzU1VrdHE2SFFqSkx5UVVwNUlTWGJZOWUybktkK1FtbjdPbU1DQXdFQUFhTmpNR0V3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRk53dUg5RmhOM25rcTlYVnN4SnhhRDFxYUp3aU1COEdBMVVkCkl3UVlNQmFBRk53dUg5RmhOM25rcTlYVnN4SnhhRDFxYUp3aU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQ1I4RUlDYUVEdXcyakEKVkMvZjdHTER3NTZLb0RFb3FvT09wRmFXRWhDR1ZycVhjdEpVTUh5dEdkVWRhRy83RkVMWWpRN3p0ZEdsNHdKQ1h0em9SbGdITlFJdwo0THgwU3NGREt2L2JHdEN3cjJ6RC9jdXo5WDl0QXk1WlZwMHRMVFdNc3RaREZ5eVNDc3RkNkl3UFMzQkQwSUwvcU15L3BKVEF2b2U5Cml1T1RlOGFQbXhhZEoyVzhlc1ZDZ214Y0I5Q3B3WWhnUk9tWWhSWmYrSS9LQVJET0pjUDVZQnVneFpmRDB5eUlNYUs5TU96UTBNQVMKOGNFNTQrWDErTlpLM1RUTisyL0JUK01BaTFiaWt2Y29za0ozY2lObnh6OFJGYkxFQXdXK3V4RjdDcitvYnVmL1dFUFBtMmVnZ0FlMgpIY3F0YmVwQkVYNHRkSlA3d3J5K1VVVEY3MmdsSjREanlLRFVFdXpacFRjZE4zeTBrY3JhMUxHV2dlOW9YSFlRU2E5K3BUZUFzUnhTCnZUT0JUSS81M1dYWkZNMktKVmowNHNXRHBRbVExR3dVWTdWQTMrdkEvTVJZZmcwVUZvZFVKMjVXNUhDRXVHd3lFbjZDTVVPKzE5MTgKb2EydTFxc2dFdThLd3hDTVNaWTEzQXQxWHJGUDFVODBEaEVnQjNWRFJlbWpFZHFzbzVuQ3Rua240cm52eU9MMk5TbDZkUHJGZjRJRgpZcVlLNm1peWVVY0didkpYcUJVenh2ZDRTajFDZTJ0Ky92ZEc2dEhyanUrSWFGdm93ZGx4ZnYxazcvOW5SNGhZSlM4K2hnZTkrNmpsCmdxaXNwZE5wUTgweGlFbUVVNUxBc1RrYk9ZTUJNTVR5cWZyUUE3MXlOMkJXSHpaOHZUbVI5VzBOdjN2WGtnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGN3pDQ0E5ZWdBd0lCQWdJSURkUGp2R3o1YTdFd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z1lReEVqQVFCZ05WQkFVVENVYzJNekk0Ck56VXhNREVMTUFrR0ExVUVCaE1DUlZNeEp6QWxCZ05WQkFvVEhrRk9SaUJCZFhSdmNtbGtZV1FnWkdVZ1EyVnlkR2xtYVdOaFkybHYKYmpFVU1CSUdBMVVFQ3hNTFFVNUdJRU5CSUZKaGFYb3hJakFnQmdOVkJBTVRHVUZPUmlCVFpXTjFjbVVnVTJWeWRtVnlJRkp2YjNRZwpRMEV3SGhjTk1Ua3dPVEEwTVRBd01ETTRXaGNOTXprd09ETXdNVEF3TURNNFdqQ0JoREVTTUJBR0ExVUVCUk1KUnpZek1qZzNOVEV3Ck1Rc3dDUVlEVlFRR0V3SkZVekVuTUNVR0ExVUVDaE1lUVU1R0lFRjFkRzl5YVdSaFpDQmtaU0JEWlhKMGFXWnBZMkZqYVc5dU1SUXcKRWdZRFZRUUxFd3RCVGtZZ1EwRWdVbUZwZWpFaU1DQUdBMVVFQXhNWlFVNUdJRk5sWTNWeVpTQlRaWEoyWlhJZ1VtOXZkQ0JEUVRDQwpBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU52cmF5dm1aRlNWZ3BDamNxUVpBWjJjQzRGZmMwbTZwNnp6CkJFNTdsZ3ZzRWVCYnBoek9HOUlOZ3h3cnVKNGRma1V5WUE4SDZYZFlmcDlxeUdGT3RpYkJUSTMvVE84MHNoOWwyTGw0OWEycGNibnYKVDFnZHBkNTBJSmVoN1doTTNwSVhTN3lyLzJXYW52dEgyVmR5OHdtaHJuWkVFMjZjTFVRNXZQbkhPNlJZUFVHOXRNSkpvOGdOMHBjdgpCMlZTQUtkdXlLOW83UFFVbHJaWEgxYkRPWjhyYmVUelB2WTFaTm9NSEtHRVN5OUxTK0lzSkoxdGswRHJ0U09PTXNwdlJkT29pWHNlCnp4NzZXME9MemMyb0QycktERjY1bmtlUDhObTJDZ3RZWlJjenVTUGtkeGw5eTBvdWtudFBMeEIzc1kwdmFKeGl6T0JRK095UnAxUk0KVnduVmRtUEY2R1VlN20xcXp3bWQrbnhQcldBSS9WYVpEeFVzZTZtQXE0eGhqMG9IZGtMZVBmVGRzaVF6VzdpMW8wVEpySDkzUEIwago3SUtwcHVMSUJrd0MvcXhjbVprTEx4Q0twdlIvMVlkMERWbEpSZmJ3Y1Z3NUtkYS9TaU9MOVY4Qlk5S0hjeWkxU3dyMStLdUNMSDV6CkpUSWRDMk1LRjRFQS83WjJYdWUwc1VES0lidlZnRkhsU0ZKbkxOSmhpUWNORDg1Q2Q4QkVjNXhFVUtEYkVBb3RsUnlCcitRYzVSUWUKOFRaQkFRSXZmWE9uM2tMTVRPbUpEVmIzbjVIVUE4WnN5WS9iMkJ6Z1FKaGRacG1ZZ0c0dC93SEZ6c3RHSDZ3Q3hrUG1ycUtFUE1WTwpIajF0eVJSTTR5NUJ1OG81dnpZOEtobXFRWWRPcGM1TE1ubmRrRWwvQWdNQkFBR2pZekJoTUI4R0ExVWRJd1FZTUJhQUZKeGYwR3hqCm8xK1R5cE9ZQ0syTWg2VXNYTUUzTUIwR0ExVWREZ1FXQkJTY1g5QnNZNk5mazhxVG1BaXRqSWVsTEZ6Qk56QU9CZ05WSFE4QkFmOEUKQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFUaDY1aXNhZ21EOXV3Mm5BYWx4SgpVcXpMSzExNE9NSFZWSVNmay9DSEdUMHNab25yRFVMOHpQQjFoVCtMOUlCZGVlVVhaNzAxZ3VMeVBJNTlXemJMV29BQUtmTE9LeXp4Cmo2cHRCWk5zY3NkVzY5OVFJeWpsUlJBOTZHZWpydzVWRDVBSll1OUxXYUwyVS9IQU5lUXZ3U1M5ZVM5T0lDSTcvUm9nc0tRT0xIRHQKZEQrNEU1VUdVY2pvaHliS3BGdHFGaUdTM1hOZ25oQVkzanlCNnVnWXczeUo4b3RRUHIwUjRoVURxRFo5TXdGc1NCWFhpSkNaQk1YTQo1Z2YwdlBTUTdSUGk2b3ZEajZNekQ4RXBUQk5PMmhWV2NYTnlnbEQybWpOOG9yR29HalIwWlZ6TzBldXJVK0FhZ05qcU9rbmtKakNiCjVSeUtxS2tWTW9hWmtnb1FJMVlTNFBiT1RPSzd2dHVOa25NQlppOWlQckp5SjBVMjdVMVc0NWVaL3pvMVBxVlVTbEpaUzJEYjd2NTQKRVg5SzNCUjVZTFpyWkFQYkZZUGhvcjcySTVkUThBa3pOcWR4bGlYenVVSjkyemcvTEZpczZFTGhEdGpUTzB3dWd1bURMbXN4MmQxSApoazl0bDVFdVQrSW9jVFVXMGZKei9pVXJCMGNrWXlmSStQYlphL3dTTVZZSXdGTkNyNXpRTTM3OEJ2QXhSQU1VOFZqcThtb05xUkd5Cmc3N0ZHcjhINmxuY280ZzE3NXgyTWp4TkJpTE9GZVhkbnRpUDJ0N1N4RG5sRjRIUE9FZnJmNGh0V1J2Zm4wSVVybjdQcUxCbVpkbzMKcjUrcVBlb290dDdWTVZnV2dsdnF1eGwxQW5NYXlrZ2FJWk9RQ282VGhLZDlPeU1Za29tZ2phdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydHVtIEVDLTM4NCBDQQo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDWlRDQ0FldWdBd0lCQWdJUWVJOG5YSUVTVWlDbEJOQXQzYnB6OURBS0JnZ3Foa2pPUFFRREF6QjBNUXN3Q1FZRFZRUUdFd0pRClRERWhNQjhHQTFVRUNoTVlRWE56WldOdklFUmhkR0VnVTNsemRHVnRjeUJUTGtFdU1TY3dKUVlEVlFRTEV4NURaWEowZFcwZ1EyVnkKZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhreEdUQVhCZ05WQkFNVEVFTmxjblIxYlNCRlF5MHpPRFFnUTBFd0hoY05NVGd3TXpJMgpNRGN5TkRVMFdoY05ORE13TXpJMk1EY3lORFUwV2pCME1Rc3dDUVlEVlFRR0V3SlFUREVoTUI4R0ExVUVDaE1ZUVhOelpXTnZJRVJoCmRHRWdVM2x6ZEdWdGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RFpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3gKR1RBWEJnTlZCQU1URUVObGNuUjFiU0JGUXkwek9EUWdRMEV3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBVEVLSTZyR0Z0cQp2bTVrTjJQa3pleXJPdmZNb2JnT2drblhoaW1mb1pUeTQyQjRtSUY0QmszeTdKb09WMkNEbjdUbUZ5OGFzMTBDVzRralBNSVJCU3FuCmlCTVk4MUNFMTcwMExDZUpWZi9PVE9mZnBoOG94UEJVdzdsOHQxT3Q2OEtqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWUQKVlIwT0JCWUVGSTBHWm5Ra2RqcnppZmU4MXIxSGZTKzhFRjlMTUE0R0ExVWREd0VCL3dRRUF3SUJCakFLQmdncWhrak9QUVFEQXdObwpBREJsQWpBRFZTMm01aGpFZk8vSlVHN0JKdytjaDY5dTFSc0lHTDJTS2NIdmxKRjQwam9jVllsaTVSc0pIcnBrYS9GMnROUUNNUUMwClFvU1ovNnZubnZ1Umx5ZGQzTEJiTUhIT1hqZ2FhdGtsNStyM1laSlcrT3JhTnNLSFpaWXVjaVV2ZjkvREU4az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydHVtIFRydXN0ZWQgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGd0RDQ0E2aWdBd0lCQWdJUUhyOVpVTGpKZ0RkTUJ2ZnJWVSsxN1RBTkJna3Foa2lHOXcwQkFRMEZBREI2TVFzd0NRWURWUVFHCkV3SlFUREVoTUI4R0ExVUVDaE1ZUVhOelpXTnZJRVJoZEdFZ1UzbHpkR1Z0Y3lCVExrRXVNU2N3SlFZRFZRUUxFeDVEWlhKMGRXMGcKUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3hIekFkQmdOVkJBTVRGa05sY25SMWJTQlVjblZ6ZEdWa0lGSnZiM1FnUTBFdwpIaGNOTVRnd016RTJNVEl4TURFeldoY05ORE13TXpFMk1USXhNREV6V2pCNk1Rc3dDUVlEVlFRR0V3SlFUREVoTUI4R0ExVUVDaE1ZClFYTnpaV052SUVSaGRHRWdVM2x6ZEdWdGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RFpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt4SHpBZEJnTlZCQU1URmtObGNuUjFiU0JVY25WemRHVmtJRkp2YjNRZ1EwRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRFJMWTY3dHpicWJUZVJuMDZUcHdYa0tRTWx6aHlDOTN5Wm4wRUd6ZTJqdXNEYkNTekJmTjhwCmZrdGxMNU9uMUFGckF5Z1lvOWlkQmNFcTJFWHhrZDdmTzlDQUFvelBPQS9xcDF4NEVhVEJ5SVZjSmRQVHN1Y2x6eEZVbDZzMXdCNTIKSE84QVU1ODUzQlNsTENJbHMzSnkvSTJ6NVQ0SUhoUXFOd3VJUE1xdzlNakNvYTY4d2I0cFoxWGkvSzFaWFA2OVZ5eXdrSTNDN1RlMgpmSm1JdGRVRG1qMFZEVDA2cUtoRjhKVk9KVmtkelpocHU5UE1Nc21ONzRIK3JYMkp1N3BnRThwbGxXZWc4eG4yQTFiVWF0TW40cUd0CmcvQktFaUozSEFWejRobHhRc0RzZFVhYWtGamdhbzRycFVZd0JJNFpzaGZqdnFtNmYxYnhKQVBYc2lFb2RnNDJNRXg1MVVHYW1xaTQKTmJvTU92SkVHeUNJOThVbDF6M0c0ejVEM1lmK3hPcjFVejVNWmY4N1NzdDRXbXNYWHczSHcwOU9taXFpN1ZkTkl1SkdtajhQa1RRawpmVlhqakpVMzB4cndDU3NzMHNtTnRBMEFxMmNwS05nQjlSa0V0aDIrZHY1eVhNU0Z5dEtBUWQ4RnFLUFZoSkJQQy9QZ1A1c1owamVKClAvSjdVaHlNOXVIM1BBZVhqQTZpV1lFTXNwQTkwK05aUnUwUHFhZmVnR3RhcWdlMkdjdThWL09YSVhvTXNTdDBQdXZhcDJjdFRNU1kKbmpZSmRtWm0vQm8vNmtoVUhMNHd2WUJRdjN5MXpnRDJER0haNXlRRDRPTUJnUTY5MklVMGlMMnlOcWg3WEFqbFJJQ01iL2d2MVNISwpIUnpRKzhTMWg5RTZUc2QydFRWSXRRSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCU00reHgxCnZBTFRuMDR1U05uNVlGU3F4TE5QK2pBT0JnTlZIUThCQWY4RUJBTUNBUVl3RFFZSktvWklodmNOQVFFTkJRQURnZ0lCQUVpaTFRQUwKTHRBL3ZCelZ0VlJKSGxwcjlPVHk0RUEzNE13VWU3bkoralcxZFJlVGFnVnBoWnpOVHhsNFd4bUI4Mk0rdzg1YmovVXZYZ0YyRXo4cwpBTG5ObGxJNVNXMEVUc1hwRDRZTjRmcXpYNElTOFRyT1pnWWtOQ3Zvek1ybmFkeUhuY0kwMTNuUjAzZTRxbGxZL3AwbStqaUdQcDJLCmgyUlg1UmM2NHZtTnVlTXplTUdRMkxqZHQ0TlI1TVRNSTlVR2ZPWlIwODAwTWNEMlJyc0xyZnc5RUFVcU8wcVJKZTZNMUlTSGdDcTgKQ1l5cU9oTmY2RFI1VU1FUUdmblRLQjdVMFZFd0tiT3VrR2ZXSHdwanNjV3B4a0l4WXhlVTcybkxML3FNRkgzRVF4aUoyZkF5UU9hQQo0a1pmNWVQQkFGbW8rZWdndklrc0RrYzBDK3BYd2xNMi9LZlVyekhOL2dMbGRmcTVKd241OC9VN3luMmZxU0xMaU1tcTBVYzlObmVvCldXUnJKOC92SjhIakpMV0c5NjUrTWsyd2VXalJPZWlRV01PRHZBOHMxcGZyemd6aElNZmF0ejdEUDc4djNEU2sreXNoeldlUFMvVGoKNnRRLzUwKzZ1YVdUUlJ4bUh5SDZaRjV2NEhhVU1zdDE5VzdsOW8vSHVLVE1xSlo5WlBza1drb0RiR3M0eHVnRFE1cjNWN216S1dtVApPUFFEOHJ2N2dtc0hJTkZTSDVwa0FudVladHRjVFZvUDBJU1ZvRHdVUXdiS3l0dTRRVGJhYWtSbmg2K3Y0MFVSRldrSXNyNFdPWmNrCmJ4SkYwV2RkQ2FqSkZkcjYwcVpmRTJFZnY0V3N0SzJ0QlpRSWd4NTFGOU54TzVOUUkxbWc3VHlSVkoxMkFNWER1RGpiCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClR1blRydXN0IFJvb3QgQ0EKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnN6Q0NBNXVnQXdJQkFnSVVFd0xWNGtCTWtrYUdGbWRkdEx1N3NtcysvQk13RFFZSktvWklodmNOQVFFTEJRQXdZVEVMTUFrRwpBMVVFQmhNQ1ZFNHhOekExQmdOVkJBb01Ma0ZuWlc1alpTQk9ZWFJwYjI1aGJHVWdaR1VnUTJWeWRHbG1hV05oZEdsdmJpQkZiR1ZqCmRISnZibWx4ZFdVeEdUQVhCZ05WQkFNTUVGUjFibFJ5ZFhOMElGSnZiM1FnUTBFd0hoY05NVGt3TkRJMk1EZzFOelUyV2hjTk5EUXcKTkRJMk1EZzFOelUyV2pCaE1Rc3dDUVlEVlFRR0V3SlVUakUzTURVR0ExVUVDZ3d1UVdkbGJtTmxJRTVoZEdsdmJtRnNaU0JrWlNCRApaWEowYVdacFkyRjBhVzl1SUVWc1pXTjBjbTl1YVhGMVpURVpNQmNHQTFVRUF3d1FWSFZ1VkhKMWMzUWdVbTl2ZENCRFFUQ0NBaUl3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNUE4wL3k5QkZQZERDQTYxWWd1QlV0QjlZT0NmdmRabjU2ZVkraHoKMnZZR3FVOGZ0UGtMSHptTW1pRFFmZ2JVN0RUWmhyeDFXNGVJOE5MWjFLTUtzbXdiNjBrc1BxeGQySlFEb093MDVUREVOWDM3SmswYgpiakJVMlBXQVJadzVyWnpKSlFSTm1wQStUa0J1aW12TktXZkd6QzNnZE9nRlZ3cElVUHA2UTlwKzdGdWFEbUoyL3VxZEhZVnk3Qkc3Ck5lZ2ZKNy9Cb2NlN1NCYmRWdGZNVHFEaHVhemIxWU1aR29YUmxKZlh5cU5sQy9NNCtRS3UzZlpuejhrLzlZb3NSeHFaYndVTi9kQWQKZ2pIOEtjd0FXSmVSVElBQUhET0ZsaS9MUWNLTEVJVERDU1NKSDdVUDJkbDNSeGlTbEdCY3g1a0RQUDczbGFkOVVLR0F3cW1EclZpVwpWU0hiaGxuVXI4YTgzWUZ1Qjl0Z1l2N3NFRzdhYUFIMGd4dXBQcUpiSTlka3h0L2NvbjNZUzdxQzBsSDRacjhHUnVSNUtpWTJlWThmClRwa2RzbzhNRGh6L3lWM0EvWkFRcHJFMzg4MDZKRzYwaFpDL2dMa01qTldiMXNqeFZqOGFnSWw2cWVJYk1sRXNQdkxmZS9aZGVpa1oKanVYSXZUWnhpMTFNd2gwL3JWaWl6ejF3VGFaUW1DWGNJL200V0VFSWNiOVB1SVNnandCVUZmeVJiVmlubGp2clM1WW56V3Vpb1lhcwpEWHhVNW1aTVpsK1F2aUdhQWtZdDVJUENnTG5QU3o3b2Z6d0I3STllelgvU0tFSUJsWXJpbHowUUlYMzJuUnpGTktIc0xBNEtVaXdTClZYQWtQY3ZDRkRWRFhTZE92c0M5cW55VzUveWVZYTFFMHdDWEFnTUJBQUdqWXpCaE1CMEdBMVVkRGdRV0JCUUdtcHNmVTMzeDlhVEkKMDRZK29YTlp0UGRFSVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZBYWFteDlUZmZIMXBNalRoajZoYzFtMAo5MFFoTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBcWdWdXR0MFZ5Yit6eGlEMkJrZXdocE1sCjA0MjV5QUEvbC9WU0o0aHh5WFQ5NjhwazIxdnZIbDI2djlIcjdseHB1aGJJODdtUDB6WXVRRWtIRFZuZWl4Q3dTUVhpLzVFL1M3ZmQKQW83NGdTaGN6Tnh0cjE4VW5IMVllQTMyZ0FtNTZRNlhLUm00dCt2NEZzdFZFdVRHZmJ2RTdQaTFIRTQrWjcvRlh4dHRiVWNvcWdSWQpZZFoydnlKLzBBZHFwMlJUOEplTm5ZQS91OEVIMjJXdjVwc3ltc05VazhRY0NNTkUrM3RqRVVQUmFocGhhbmx0a0U4cGprY0Z3UkpwCmFkYkdOakhoL1BxQXVseFB4T3UzTXF6NGRXRVgxeEFadWZIU0NlOTZRcDFiV2d2VXhwVk9LczcvQjlkUGZoZ0dpUEVadGRtWXU2NXgKeEJ6bmRGbFk3d3lKejRzZmRaTWFCQlNTU0ZDcDYxY3BBQmJqTmh6SStML3dNOVZCRDhUTVBOM3BNME1Ca1JBckh0RzVYYzB5R1l1UApqQ0IzMXlMRVF0eUVGcHNsYmVpMFZYRi9zSHl6MDNGSnVjOVNwQVEvM0QyZ3U2OHpuZ293WUk3Ym5WMlVxTDFnNTJLQWRvR0RESXpNCk1FWko0Z3pTcUsvcllYSHY1eUppcWZkY1pHeWZGb3huTmlkRjlRbDd2L1lRQ3ZHd2pWUkRqQVM2b3ovdjRqWEgrWFRnYnpSQjBMOXoKWlZjZytadG5lbVpvSkU2QVpiMFFtUVpaOG1XdnVNWkh1LzJRZUl0QmN5NnZWUi9jTzVKeWJvVFQwR0ZNRGN4MlYrSXRoU0lWTmczcgpBWjNyMk92RWhKbjd3QXpNTXVqamQ5cURSSXVlVlNqQWkxalRrRDVPR3dEeEZhMkRLNW89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkhBUklDQSBUTFMgUlNBIFJvb3QgQ0EgMjAyMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZwRENDQTR5Z0F3SUJBZ0lRT2NxVEhPOUQ4OGFPazhmMFpJazRmakFOQmdrcWhraUc5dzBCQVFzRkFEQnNNUXN3Q1FZRFZRUUcKRXdKSFVqRTNNRFVHQTFVRUNnd3VTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dQpjeUJEUVRFa01DSUdBMVVFQXd3YlNFRlNTVU5CSUZSTVV5QlNVMEVnVW05dmRDQkRRU0F5TURJeE1CNFhEVEl4TURJeE9URXdOVFV6Ck9Gb1hEVFExTURJeE16RXdOVFV6TjFvd2JERUxNQWtHQTFVRUJoTUNSMUl4TnpBMUJnTlZCQW9NTGtobGJHeGxibWxqSUVGallXUmwKYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1EwRXhKREFpQmdOVkJBTU1HMGhCVWtsRFFTQlVURk1nVWxOQgpJRkp2YjNRZ1EwRWdNakF5TVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBSXZDNTY5bG13Vm5sc2tOCkpMblFEbVQ4enVJa0dDeUVmM2RSeXdRUk5yaGU3V2x4cDU3a0pRbVhaOEZId3MrUkZqWmlQVGdFNFZHQy82elN0R25kTHV3Um8wWHUKYTJzN1RMK01qYVFlblJHNTZUajVlZzRNbU9JakhkRk9ZOVRudUVGRSsydXZhOW9mMDhXUmlGdWtpWkxSZ2VhTU9WaWcxbWxEcWEyWQpVbGh1MndyN2E4OW8rdU9rWGpwRmM1Z0g2bDhDY3Q0TXBiT2ZycWtkdHgyei9JcFo1MjV5WmEzMU1KUWpCL09DRmtzMW1KeFR1eS9LCjVGclp4NDBkL0ppWit5eWtnbXZ3S2grT0MxOXhYRnl1UW5zcGlZSExBNk9aeW9pZUMwQUpRVFBiNWxoNi9hNlpjTUJhRDlZVGhuRXYKZG1uOGtOM2JMVzdSOHB2MUdtdWVieFdNZXZCTEtLQWlPSUFrYkRha08vSXdrZk40RTgvQlB6V3I4UjBSSTdWRElwNEJrcmNZQXVVUgowWUxiRlFETVlUZkJLbnlhNGRDNnMxQkc3b0tzblRINCt5UGlBd0JJY0tNSkpua1ZVMkR6T0Z5dE9PcUJBR01VdVROZTNRdmJvRVVICkdqTUorRTIwcHdLbWFmVENXUVdJWllWV3Jrdkw0TjQ4ZlMwYXlPbjdINk5oU3RZcUU2MTNUQm9ZbTVFUFdOZ0dWTVdYK0tvL0lJcW0KaGFaMzlxYjhIT0x1YnBRektvTlFoQXJsVDRiNFVFVjRBSUhyVzJqakpvM01lMXhSOUJRc1FMNGFZQjE2Y21FZEgyTXRpS3JPb2tXUQpDUHhydnJOUUtscjlxRWdZUnRhUVFKS1FDb1JlYURINDYrME4weDNHZlprWVZWWW5aUzZOUmNVazdNN2pBZ01CQUFHalFqQkFNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkFwSUk2WmdwSklLTStxVFc4Vlg2aVZOdlJMdU1BNEdBMVVkRHdFQi93UUUKQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFQcEJJcW01aUZTVm1ld3pWakl1Sm5kZnRUZ2Z2bk5BVVgxNVF2V2lXa0tRVQpFYXBvYlFrMU9VQUoydlFKTERTbGUxbUVTU21YZE1nSEhrZHQ4czRjVUNiam5qMUFVei8zZjVaMkVNVkdwZEFnUzFEME5Uc1k5RlZxClFSdEhCbWc4dXdrSVl0bGZWVUtxckZPRnJKVldObGFyNUFXTXhhamFINk5wdlZNUHhQL2N5dU4rOGt5SWhrZEdHdk1BOVlDUm90eEQKUXBTYklQRFJ6YkxyTEZQQ1UzaEtUd1NVUVpxUEp6TEI1VWtadi9IeXdvdW9Damt4S0xSOVlqWXNUZXdmTTdaK2QyMStVUENmRHRjUgpqODhZeGVNbi9pYnZCWjNQenpmRjBIdmFPN0FXaEF3Nms5YStGOXNQUGc0WmVBbkhxUUp5SWt2M04zYTZkY1NGQTFwajFiRjFCY0s1CnZaU3RqQldacDVOOTlzWHpxblRQQklXVW1BRDA0dm5LSkdXLzRHS3Z5TVg2c3NtZVZramFlZjJXZGhXK280NVd4TE0wL0w1SDlNRzAKcVB6Vk1JaG83c3V1eVdQRWRyNnNPQmpoWGx6UHJqb2lVZXZSaTdQekt6TUhWSWY2dExJVGU3cFRCR0lCbmZIQVQrN2hPdFNMSUJENgpBbGZtNzhFTHQ1QkduQmtwak54dm9FcHBhWlMzSkdXZy82dy96Z0g3SVM3OWFQaWI4cVhQTVRoY0Zhcm1sd0RCMzFxbHB6bXE2WVIvClBGR29PdG1VVzR5L1R3aHg1ZHVvWE5UU3B2NEFvOFlXeHcvb2dNNGNLR1IwR1FqVFF1UE9BRjEvc2R3VHNPRUZ5OUVncW9aMG5qbm4Ka2YzL1c5YjNyYVl2QXd0dDQxZFU2M1pUR0kwUm1Mbz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1ZEQ0NBZHVnQXdJQkFnSVFaM1NkalhmWU8ycmJJdlQvV2VLL3pqQUtCZ2dxaGtqT1BRUURBekJzTVFzd0NRWURWUVFHRXdKSApVakUzTURVR0ExVUVDZ3d1U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEClFURWtNQ0lHQTFVRUF3d2JTRUZTU1VOQklGUk1VeUJGUTBNZ1VtOXZkQ0JEUVNBeU1ESXhNQjRYRFRJeE1ESXhPVEV4TURFeE1Gb1gKRFRRMU1ESXhNekV4TURFd09Wb3diREVMTUFrR0ExVUVCaE1DUjFJeE56QTFCZ05WQkFvTUxraGxiR3hsYm1saklFRmpZV1JsYldsagpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdRMEV4SkRBaUJnTlZCQU1NRzBoQlVrbERRU0JVVEZNZ1JVTkRJRkp2CmIzUWdRMEVnTWpBeU1UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkRnSS9yR2dsdEo2cks5Sk90REE0TU03S0tyeGNtMWwKQUVlSWhQeWFKbXVxUzdwc0JBcUlYaGZ5VllmOE1MQTA0alJZVnhxRVUra3cyYW55bG5URFVSOVlTVEhNbUU1Z0VZZDEwM0tVa0UrYgpFQ1VxcUhndHZwQkJXSkFWY3FlaHQ2TkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVeVJ0VGdSTCtCTlVXCjBhcThtbSszb0pVWmJzb3dEZ1lEVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01CSGVydmpjVG9pd3FmQWkKcmNKUlFPOWdjUzN1andMRVhRTndTYVNTNnNVVWlIQ20wdzJ3cXNvc1FKejc2WUp1bWdJd0swZWFCOGJSd29GOHlndVdHRUViby9RdwpDWjYxSXlnTm54UzJQRk9pVEFacGZmcHNrY1lxU1VYbTdMY1Q0VHBzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdGRENDQS95Z0F3SUJBZ0lJRzNEcDB2K3ViSEV3RFFZSktvWklodmNOQVFFTEJRQXdVVEVMTUFrR0ExVUVCaE1DUlZNeFFqQkEKQmdOVkJBTU1PVUYxZEc5eWFXUmhaQ0JrWlNCRFpYSjBhV1pwWTJGamFXOXVJRVpwY20xaGNISnZabVZ6YVc5dVlXd2dRMGxHSUVFMgpNall6TkRBMk9EQWVGdzB4TkRBNU1qTXhOVEl5TURkYUZ3MHpOakExTURVeE5USXlNRGRhTUZFeEN6QUpCZ05WQkFZVEFrVlRNVUl3ClFBWURWUVFERERsQmRYUnZjbWxrWVdRZ1pHVWdRMlZ5ZEdsbWFXTmhZMmx2YmlCR2FYSnRZWEJ5YjJabGMybHZibUZzSUVOSlJpQkIKTmpJMk16UXdOamd3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREtsbXVPNnZqNzhhSTE0SDlNMnVERApVdGQ5dGhESUFsNnpReXJFVDJxeXloeGRLSnA0RVJwcFdWZXZ0U0JDNUlzUDV0OWJwZ09TTC9VUjVHTFhNbkU0MlFRTWNhczlVWDRQCkI5OWpCVnpwdjVSdndTbUN3TFRhVWJEQlBMdXROMHBjeXZGTE5nNGtxNy9EaEhmOXFGRDBzZWZHTDlJdFdZMTZDazZXYVZJQ3FqYVkKN1B6NkZJTU1OeC9Ka2pkLzE0RXQ1Y1M1NEQ0MC9tZjBQbWJSMC9SQXoxNWlOQTl3Qmo0Z0dGck85M0liSld5VGRCU1RvM094RHFxSApFQ05aWHlBRkdVZnRhSTZTRXNwZC9OWXJzcEk4SU0vaFg2OGd2cUIyZjNibDdCcUdZVE0rNTN1MFA2QVBqcUs1YW0rNWh5WnZRV3lJCnBsRDlhbU1MOVpNV0d4bVBzdTJibThtUTlRRU0zeGs5RHo0NEk4a3Zqd3pSQXY0YlZkWk8wSTA4cjArazgvNnZLdE1GblhrSW9jdFgKTWJTY3lKQ3laL1FZRnBNNi9FZlkwWGlXTVIrNkt3eGZYWm10WTRsYUpDQjIyTi85cTA2bUlxcWRYdVluaW4xb0thUG5pcmphRWJzWApMWm1kRXlSRzk4WGkySitPZjhlUGRHMWFzdWh5OWF6dUpCQ3RMeFRhL3kyYVJuRkh2a0xmdXdIYjlIL1RLSTh4V1Z2VHlRS210RkxLCmJwZjdROFVJSm0rSzlMdjlueWlxRGRWRjh4TTZIZGpBZUk5Qlp6d2VsR1N1ZXd2RjZOa0JpRGthbDRaa1FkVTdod3h1K2cvR3ZVZ1UKdnpsTjFKNUJ0bytXSFdPV2s5bVZCbmd4YUo0M0JqdUFpVVZoT1NQSEcwU2pGZVVjK0pJd3V3SURBUUFCbzRIdk1JSHNNQjBHQTFVZApEZ1FXQkJSbHpldXJOUjRBUG43VmRNQWN0SE5IRGhwa0x6QVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUJNSUdtQmdOVkhTQUVnWjR3Cmdac3dnWmdHQkZVZElBQXdnWTh3THdZSUt3WUJCUVVIQWdFV0kyaDBkSEE2THk5M2QzY3VabWx5YldGd2NtOW1aWE5wYjI1aGJDNWoKYjIwdlkzQnpNRndHQ0NzR0FRVUZCd0lDTUZBZVRnQlFBR0VBY3dCbEFHOEFJQUJrQUdVQUlBQnNBR0VBSUFCQ0FHOEFiZ0JoQUc0QQpid0IyQUdFQUlBQTBBRGNBSUFCQ0FHRUFjZ0JqQUdVQWJBQnZBRzRBWVFBZ0FEQUFPQUF3QURFQU56QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBSFNIS0FJcmR4OW1pV1R0ajNRdVJoeTdxUGo0Q3gyRHRqcW42RVdLQjdmZ1BpREwKNFFqYkV3ajRLS0Uxc29DekMxSEEwMWFhalRORlNhOUo4T0E5QjNwRkUxci95SmZZMHhnc2ZaYjQzYUpsUTNDVGtCVzZrTi9vR2JEYgpMSXBnRDdkdmxBY2VIYWJKaGZhOU5QaEFlR0lRY0RxK2ZVczVnYWtRMUpaQnUvaGZIQXNkQ1BLeHNJbDY4dmVnNE1TUGkzaTFPMWlsCkk0NVBWZjQyTytBTXQ4b3FNRUVndElETnJ2eDJabk9vcm03aGZOb0Q2SlFnNWlLajBCK1FYU0JURkNaWDJsU1gzeFpFRUFFZWlHYVAKY2ppVDNTQzNOTDdYOGU1amprZDVLQWI4ODFsRkpXQWlNeHVqWDZpNkt0b2FQYzFBNm96dUJSV1YxYVVzSUMrbm1DanVSZnp4dUlnQQpMSTlDMmxIVm5PVVRhSEZGUTR1ZUN5RThTMXdGM0JxZm1JN2F2U0tlY3MydENzdk1vMmViS0hURW05Y2FQQVJZcG9LZHJjZDdiLytBCmx1bjRqV3E5R0pBZC8wa2FrRkkza3k4OEFsMkNkZ3RSNXhiSFYvZzQrYWZObXlKVTcyT3dGVzFUWlFOS1hrcWdzcWVPU1FCWk9OWEgKOUlCazlXNlZVTGdSZmhWd09FcXdmOURFTW5EQUdmL0pPQzBVTEdiMFFrVG1WWFliZ0JWWC84Q25wNm81cXRqVGNOQXV1dXVVYXZwZgpOSWJuWXJYOWl2QXdoWlRKcnlRQ0wyL1czV2YrNDdCVlR3U1lUNlJCVnVLVDBHcm8xdlA3WmVET2RjUXhXUXp1Z3NnTVlETktHYnFFClp5Y1B2RUpkdlNSVURld2RjQVpmcEx6NklIeFYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKdlRydXMgRUNDIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNEekNDQVpXZ0F3SUJBZ0lVYm1xOFdhcFR2cGc1WjZMU2E2UTc1bTBjMXRvd0NnWUlLb1pJemowRUF3TXdSekVMTUFrR0ExVUUKQmhNQ1EwNHhIREFhQmdOVkJBb1RFMmxVY25WelEyaHBibUVnUTI4dUxFeDBaQzR4R2pBWUJnTlZCQU1URVhaVWNuVnpJRVZEUXlCUwpiMjkwSUVOQk1CNFhEVEU0TURjek1UQTNNalkwTkZvWERUUXpNRGN6TVRBM01qWTBORm93UnpFTE1Ba0dBMVVFQmhNQ1EwNHhIREFhCkJnTlZCQW9URTJsVWNuVnpRMmhwYm1FZ1EyOHVMRXgwWkM0eEdqQVlCZ05WQkFNVEVYWlVjblZ6SUVWRFF5QlNiMjkwSUVOQk1IWXcKRUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRVpWQktyb3g1bGtxcUhBakRvNkxOL2xsV1FYZjlKcFJDdXgzTkNOdHpzbHQxODgrYwpUb0wwdi9oaEpvVnMxb1ZiY25EUy9kdGl0TjlUaTcyeFJGaGlRZ25IK245YkVPZitRUDNBMk1Nck11ZHdwcmVtSUZVZGU0QmRTNDluClRQRVFvMEl3UURBZEJnTlZIUTRFRmdRVW1Ebk52dGl5alBleXErR3RKSzk3ZktIYkg4OHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXdWNTNkVnZISDQrbTRTVkJybTJuRGIrekRmU1hrVjVVVApRSnRTMHp2elFCbThKc2N0QnA2MWV6YWY5U1hVWTJzQUFqRUE2ZFBHbmxhYUtzeWgyai9JWml2VFdKd2doZnFya1lwd2NCRTRZR1FMCllnbVJXQUQ1VGZzMGFOb0pyU0VHR0pUTwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgp2VHJ1cyBSb290IENBCj09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZWakNDQXo2Z0F3SUJBZ0lVUStOeEU5aXpXUlJkdDg2TS9UWDliN3dGalVVd0RRWUpLb1pJaHZjTkFRRUxCUUF3UXpFTE1Ba0cKQTFVRUJoTUNRMDR4SERBYUJnTlZCQW9URTJsVWNuVnpRMmhwYm1FZ1EyOHVMRXgwWkM0eEZqQVVCZ05WQkFNVERYWlVjblZ6SUZKdgpiM1FnUTBFd0hoY05NVGd3TnpNeE1EY3lOREExV2hjTk5ETXdOek14TURjeU5EQTFXakJETVFzd0NRWURWUVFHRXdKRFRqRWNNQm9HCkExVUVDaE1UYVZSeWRYTkRhR2x1WVNCRGJ5NHNUSFJrTGpFV01CUUdBMVVFQXhNTmRsUnlkWE1nVW05dmRDQkRRVENDQWlJd0RRWUoKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTDFWZkdIVHVCMEVZZ1dncm15M2NMUkI2a3NEWGhBL2tGb2NpenV3Wm90cwpTS1ljSXJyVlFKTHVNN0lqV2NtT3ZGamFpNTdRR2ZJdldjYU1ZMXE2bjZNTHNMT2FYTG9SdUJMcERMdlBibXlBaHlrVUF5eU5KSnJJClpJTzFhcXdUTERQeG45d3NZVHdhUDNCVm02MEFVbi9QQkxuK052cWN3QmF1WXY2V1RFTitWUlMrR3JQU2JjS3ZkbWFWYXlxd2xIZUYKWGdRUFloMWpkZmRyNTh0Ym1uRHNQbWNGOFA0SENJRFBLTnNGeGhRbkw0Wjk4Q2ZlLytaK00wam5DeDVZMFNjclV3NVhTbVhYKzZLQQpZUHhNdkRWVEFXcVhjb0t2OFIxdzZKejE3MTdDYk1kSGZscVVoU1pOTzdyclRPaXdDY0psd3AyZENadE90WmNGclBVR29QYzJCWDcwCmtMSnJ4TFQ1Wk9ycEdncklEYWp0SjhuVTU3TzVxNElpa0NjOUt1aDhrTys4VC8zaUNpU24zbVVrcEYzcXdIWXcwM2RRK0EwRW01UTIKQVhQS0JsaW0wenZjK2dSR0UxV0t5VVJIdUZFNUdpN29OT0o1eTFsS0NuKzhwdThmQTJkcVdTc2xZcFBaVXhsbVBDZGlLWVpOcEd2dQovOVJPdXRXMDRvNUlXZ0FaQ2ZFRjJjNlJzZmZyNlRsUDltOEVRNXBWOVQ0RkZMMi9zMW0wMkk0emhLT1FVcXF6QXBWZytReE1hUG51CjFSY04rSEZYdFNYa0tlNWxYYS9SN2p3WEMxcER4YVdHNmlTZTRnVUgzRFJDRXBIV09YU3VURUdDMi9LbVNOR3ptL016cXZPbXdNVk8KOWZTZGRtUG1Bc1lpUzhHVlAxQmtMRlRsdHZBOEtjOVhBZ01CQUFHalFqQkFNQjBHQTFVZERnUVdCQlJVWW5CajhYV0VRMWlPMFJZZwpzY2FzR3J6MmlUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DCkFnRUFLYnFTU2FldDhQRnd3K1NYOEorcEpkVnJualQrNWhwazlqcHJVcklRZUJxZlROcUsydXdjTjFMZ1FrdjdiSGJLSkFzNUVoV2QKbnhFdC9IbGszT0RnOWQzZ1Y4bWxzblp3VUtUK3R3cHcxYUEwOFhYWFRVbTZFZEd6Mk95Qy8rc094TDlrTFgxamJoZDQ3RjE4aU1qcgpqbGQyMlZrRStyeFNIMFdzOEhxQTdPeHZkcTZSMnhDT0JOeVMzNkQyNXE1SjA4RnNFaHZNS2FyNUNLWGlOeFRLc2JobTd4cUM1UEQ0CjhhY1dhYmZicVdFOG4vVXh5K1FBUnNJdmRMR3gxNEh1cUNhVnZJaXZURFVIS2dMS2VCUnRSeXRBVnVuTEttQ2had09nem95OHNISm4KeERITzJ6VGxKUU5nSlh0eG1PVEFHeXRmZEVMU1M4VlpDQWVIdnNYRGYrZVcyZUhjS0pmV2p3WGo5WnRPeWgxUVJ3VlRzTW81NTRXZwppY0VGT3dFMzB6OUo0bmZySThpSVpqczlPWFloUnZIc1h5TzQ2NkptZFhUQlFQZllhSnFUNGkycExyMGNveDdJZE1ha0xYb2dxenU0CnNFYjliOTFmVWxWMVl2Q1hvSHpYT1AwbDM4MmdteERQaTdnNFhsN0Z0S1lDTnFFZVh4elA0cGFkS2FyOW1LNVM0Zk5CVXZ1cExuS1cKbnlmanFuTjkrQm9qWm5zN3EyV3dNZ0ZMRlQ0OW9rOE1LeldpeHRsbkVqVXd6WFl1RnJPWm5rMVBUaTA3TkVQaG1nNE5wR2FYdXRJYwpTa3dzS291TGdVOXhHcW5kWEh0N0NNVUFEVGRBNDN4N1ZGOHZoVjkyOXZlbnNCeFhWc0Z5NksyaXI0MHpTYm9maXR6bWRIeGdobStICmwzcz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSVNSRyBSb290IFgyCj09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0d6Q0NBYUdnQXdJQkFnSVFRZEtkMFhMcTdxZUF3U3hzNlMrSFVqQUtCZ2dxaGtqT1BRUURBekJQTVFzd0NRWURWUVFHRXdKVgpVekVwTUNjR0ExVUVDaE1nU1c1MFpYSnVaWFFnVTJWamRYSnBkSGtnVW1WelpXRnlZMmdnUjNKdmRYQXhGVEFUQmdOVkJBTVRERWxUClVrY2dVbTl2ZENCWU1qQWVGdzB5TURBNU1EUXdNREF3TURCYUZ3MDBNREE1TVRjeE5qQXdNREJhTUU4eEN6QUpCZ05WQkFZVEFsVlQKTVNrd0p3WURWUVFLRXlCSmJuUmxjbTVsZENCVFpXTjFjbWwwZVNCU1pYTmxZWEpqYUNCSGNtOTFjREVWTUJNR0ExVUVBeE1NU1ZOUwpSeUJTYjI5MElGZ3lNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRXpadlZuNENEQ3V3SlN2TVdTajVjejNlczNtY0ZEUjBICnR0d1crMXFMRk52aWNXREV1a1dWRVltTzZnYmY5eW9XSEtTNXhjVXk0QVBnSG9JWU9JdlhSZGdLYW03bUFIZjdBbEY5SXRnS2JwcGIKZDkvdytrSHNPZHgxeW1nSERCL3FvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVgpIUTRFRmdRVWZFS1dydDVMU0R2Nmt2aWVqTTl0aTZseU41VXdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXdlM2xPUmxDRXdrU0hSaHRGCmNQOVltZDcwL2FUU1ZhWWdMWFRXTkx4Qm8xQmZBU2RXdEw0bmRRYXZFaTUxbUkzOEFqRUFpL1YzYk5USVphcmdDeXp1Rkowbk42VDUKVTZWUjVDbUQxL2lRTVZ0Q253cjEvcTRBYU9lTVNRKzJiMXRiRmZMbgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpIaVBLSSBSb290IENBIC0gRzEKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYWpDQ0ExS2dBd0lCQWdJUUxkMnN6bUtYbEtGRDZMRE5kbXBlWURBTkJna3Foa2lHOXcwQkFRc0ZBREJQTVFzd0NRWURWUVFHCkV3SlVWekVqTUNFR0ExVUVDZ3dhUTJoMWJtZG9kMkVnVkdWc1pXTnZiU0JEYnk0c0lFeDBaQzR4R3pBWkJnTlZCQU1NRWtocFVFdEoKSUZKdmIzUWdRMEVnTFNCSE1UQWVGdzB4T1RBeU1qSXdPVFEyTURSYUZ3MHpOekV5TXpFeE5UVTVOVGxhTUU4eEN6QUpCZ05WQkFZVApBbFJYTVNNd0lRWURWUVFLREJwRGFIVnVaMmgzWVNCVVpXeGxZMjl0SUVOdkxpd2dUSFJrTGpFYk1Ca0dBMVVFQXd3U1NHbFFTMGtnClVtOXZkQ0JEUVNBdElFY3hNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTlCNS9Vbk15REhQa3ZSTjAKbzlRd3FOQ3VTOWkyMzNWSFp2Ujg1emtFSG1wd0lOSmFSM0puVmZTbDZKM1ZIaUdoOEdlNnpDRm92a1JUdjQzNTR0d3ZWY2czUHgrawp3Snl6NUhkY29FYitkL29hb0RqcTdacHkzaXU5bEZjNnV1eDU1MTk5UW1RNWVpWTI5eVR3MVMrNmxaZ1JacTJYTmRaMUFZRGdyL1NFCllZd05IbDk4aDVaZVFhL3JoK3I0WGZFdWlBVStUQ0s3Mmg4cTNWSkdaRG56UXM3Wm5neXpzSGVYWkp6QTlLTXVINVVIc0JmZk1Oc0EKR0paTW9ZRkwzUVJ0VTZNOS9BZXMxTVUzZ3V2a2xRZ1pLSUxTUWpxajJGUHNlWWxnU0dESWNwSlEzQU9QZ3oreVFsZGEyMnJwRVpmZApoU2k4TUV5cjQ4S3hSVVJISCtDS0ZnZVcwaUVQVThEdHFYN1VUdXliQ2V5dlFxd3cxci9SRUVYZ3BoYXlwY1hUVDNPVU0zRUNvV3FqCjFqT1hUeUZqSGx1UDJjRmVSWEYzRDRGZFh5R2FyWVBNK2w3V2pTTmZHejFCcnlCMVpscEs5cC83cXhqM2NjQzJIVEhzT3lEcnkrSzQKOWE2U3N2ZmhoRXZ5b3ZLVG1pS2UweFJ2TmxTOUgxNVpGYmx6cU1GOGIzdGk2UlpzUjFwbDh3NFJtMGJaL1czYzFwekF0SDJsc04wLwpWbStoK2Zia0VrajlCbjhTVjdhcEkwOWJBOFBnY1NvanQvZXdzVHU4bUwzV21LZ01hL2FPRW1lbThySlk1QUlKRXp5cHV4QzAwakJGCjhlejNBQkhmWmZqY0swTlZ2eGFYeEEvVkxHR0VxbktHL3VZNmZzSS9mZTc4THhRKzVvWGRVRyszU2UwQ0F3RUFBYU5DTUVBd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU4bmNYK2w2by92WTljZFZvdXNsR0REallyN0F3RGdZRFZSMFBBUUgvQkFRRApBZ0dHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCUVVmQjEzSEFFNC8rcWRkUnhvc3VlajZpcDA2OTF4MVRQT2h3RW1TS3N4QkhpCjd6TktwaU1kRGcxSDJEZkhiNjgwZjArQmF6VlA2WEtsTWVKNDUvZE9sQmhiUUgzUGF5RlVodWFWZXZ2R3l1cWNTRTVYQ1YwdnJQU2wKdEpjeldOV3NlYW5NWC9tRitsTEZqZmlSRk9zNkRSZlFVc0o3NDhKemprWjRCamdzNkZ6YVpzVDBwUEJXR1RNcFdtV1NCVWRHU3F1RQp3eDRub1I4Umtwa25kWk1QdkRZN2wxZVBKbHNNdTV3UDFHNHdCOVRjWHpab1pqbURsaWNtaXNqRU9mNmFJVy9WY29icGYyTGxsMDdRCkpOQkFzTkIxQ0k2OWFPNEkxMjU4RUhCR0czemdpTEtlY29hWkFlTy9uMGtadENXK1ZtV3VGMlBsSHQvby8wZWx2K0VtQllUa3NNQ3YKNXdpWnFBeGVKb0JGMVBob0w1YVBydUpLSEp3V0RCTnZPSWYydThnMFg1SURVWGx3cHQvTDlabE5lYzFPdkZlZlEwNXJMaXNZK0dwegpqTHJGTmU4NWFrRWV6M0dvb3JLR0IxczZ5ZUh2UDJVRWdFY3lSSENWVGpGbmFuUmJFRVYxNnJDZjBPWTEvazZmaTh3cmtrVmJiaVZnCmhVYk4wYXF3ZG1hVGQ1YStnNzQ0dGlST0pndk03WHBXR3VEcFdzWmtyVXg2QUVoRUw3bEF1eE0rdmhWNG5ZV0JTaXBYM3RVWlE5cmIKeWx0SGhvTUxQN1lOZG5oemVTSmVzWUFmejc3UlAxWVFtQ3VWaDZFZm5XUVVZRGtzc3dCVkx1VDFzdzVYeEpGQkFKdy82S1hmNnZiLwp5UEN0YlZLb0Y2dWJZZndTVVRYa0pmMnZxbXFHT1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCM0RDQ0FZT2dBd0lCQWdJTkFnUGxmdlUvay8ybENTR3lwakFLQmdncWhrak9QUVFEQWpCUU1TUXdJZ1lEVlFRTEV4dEhiRzlpCllXeFRhV2R1SUVWRFF5QlNiMjkwSUVOQklDMGdValF4RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wWjI0eEV6QVJCZ05WQkFNVENrZHMKYjJKaGJGTnBaMjR3SGhjTk1USXhNVEV6TURBd01EQXdXaGNOTXpnd01URTVNRE14TkRBM1dqQlFNU1F3SWdZRFZRUUxFeHRIYkc5aQpZV3hUYVdkdUlFVkRReUJTYjI5MElFTkJJQzBnVWpReEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzCmIySmhiRk5wWjI0d1dUQVRCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFTNHhublRqMndsRHA4dU9Sa2NBNlN1bXVVNUJ3a1cKeW1PeHVZYjRpbGZCVjg1QytuT2g5MlZDL3g3QkFMSnVjdzcveHlIbEdLU3EyWEUvcU5TNXpvd2RvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVZMQjdyVVc0NGtCLyt3cHUrNzR6eVR5amhOVXdDZ1lJCktvWkl6ajBFQXdJRFJ3QXdSQUlnSWs5MGNybGdyL0htbktBV0JWQmZ3MTQ3Ym1GMDc3NEJ4TDRZU0ZsaGdqSUNJQ2FkVkdOQTNqZGcKVU0vSTJPMmRncTQzbUx5amoweE1xVFFyYk8vN2xac20KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR1RTIFJvb3QgUjEKPT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZWekNDQXorZ0F3SUJBZ0lOQWdQbGsyOHhzQk5KaUd1aUZ6QU5CZ2txaGtpRzl3MEJBUXdGQURCSE1Rc3dDUVlEVlFRR0V3SlYKVXpFaU1DQUdBMVVFQ2hNWlIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZwpVakV3SGhjTk1UWXdOakl5TURBd01EQXdXaGNOTXpZd05qSXlNREF3TURBd1dqQkhNUXN3Q1FZRFZRUUdFd0pWVXpFaU1DQUdBMVVFCkNoTVpSMjl2WjJ4bElGUnlkWE4wSUZObGNuWnBZMlZ6SUV4TVF6RVVNQklHQTFVRUF4TUxSMVJUSUZKdmIzUWdVakV3Z2dJaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMyRVFLTEh1T2hkNXM3M0wrVVByZVZwMEE4b2YyQytYMHlCb0p4OXZhTQpmL3ZvMjd4cUxwZVhvNHhMK1N2MnNmbk9oQjJ4K2NXWDN1KzU4cVBwdkJLSlhxZXFVcXY0SXlmTHBMR2NZOXZYbVg3d0NsN3JhS2IwCnhscEhEVTBRTStOT3NST2p5QmhzUyt6OENaRGZuV1FwSlNNSG9iVFNQUzVnNE0vU0NZZTd6VWp3VGNMQ2VvaUt1N3JQV1JuV3I0K3cKQjdDZU1mR0N3Y0RmTHFadGJCa090ZGgrSmhwRkF6MndlYVNVS0swUGZ5YmxxQWorbHVnOGFKUlQ3b002aUNzVmxnbXk0SHFNTG5YVwpuT3VuVm1TUGxrOW9yajJYd29TUHdMeEF3QXRjdmZhSHN6VnNyQmhRZjRUZ1RNMlMweURwTTd4U21hOHl0U216SlNxMFNQbHk0Y3BrCjkrYUNFSTNvbmNLS2lQbzRab3I4WS9rQitYajllMXgzK25hSCt1emZzUTU1bFZlMHZTYnYxZ0hSNnhZS3U0NEx0Y1hGaWxXcjA2enEKa1VzcHpCbWtNaVZPS3ZGbFJOQUN6cXJPU2JUcW4zeURzRUI3NTBPcnAyeWpqMzJKZ2ZwTXBmL1Zqc1BPUytDMTJMT09SYzkyd08xQQpLLzFURDdDbjFUc05zWXFpQTk0eHJjeDM2bTk3UHRiZmtTSVM1cjc2MkRMOEVHTVVVWExlWGRZV2s3MHBhRFB2T21ic0I0b20zeFBYClYyVjRKOTVlU1JRQW9nQi9tcWdodHFteGxiQ2x1UTBXRWRySGJFZzhRT0IrRFZyTlZqelJsd1c1eTB2dE9VdWN4RC9TVlJOdUpMRFcKY2ZyMHdick03UnYxL29GQjJBQ1lQVHJJcm5xWU54Z0ZsUUlEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVApBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVNUs4ckpuRWFLMGduaFM5U1ppenY4SWtUY1Q0d0RRWUpLb1pJaHZjTkFRRU1CUUFECmdnSUJBSitxUWliYkM1dSsveDZXa2k0K29tVkthcGk2SXN0OXdUcllnZ29HeHZhbDNzQk9oMlo1b2ZtbVdKeXErYlhtWU9mZzZMRWUKUWtFekN6Yzl6b2x3RmNxMUpLalBhN1hTUUNHWXp5STB6enZGSW9UZ3hRNktmRjJJNURVa3pwcytHbFFlYnR1eWg2Zjg4L3FCVlJSaQpDbG1wSWdVeFBvTFc3dHRYTkx3emxkTVhHK2dub290N1RpWWFlbHBrdHRHc04vSDlvUE00N0hMd0VYV2R5elJTamVaMmF4ZkczNGFyCko0NUpLM1ZtZ1JBaHB1bys5SzRsLzN3VjNzNk1KVC9LWW5BSzl5OEpaZ2ZJUHh6ODhOdEZNTjlpaU1HMUQ1M0RuMHJlV1ZsSHhZY2kKTnVhQ3ArMEt1ZUlIb0kxN2VrbzhjZExpQTZFZk1nZmRHK1JDemd3QVJXR0F0UXNnV1NsNHZmbFZ5MlBGUEV6MHR2L2JhbDh4YTVtZQpMTUZyVUtUWDVoZ1V2WVUvWjZ0R242RC9RcWM2ZjF6TFhiQndIU3MwOWRSMkNRenJlRXhaQmZNelFzTmhGUkFiZDAzT0lvelVoZkpGCmZiZFQ2dTlBV3BRS1hDQmZUa0JkWWlKMjMvL09ZYjJNSTNqU053TGdqdDdSRVRlSjlyL3RTUWRpcnBMc1FCcXZGQW5aMEU2eW92ZSsKN3U3WS85d2FMZDY0Tm5IaS9IbTNsQ1hSU0hOYm9UWG5zNWxuZGNFWk9pdEhUdE5DanYweHlCWm0ydElNUE51empzbWhEWUFQZXhaMwpGTC8vMndtVXNwTzhJRmdWNmR0eFEvUGVFTU1BM0tncWxiYkMxaitRYTNiYmJQNk12UEp3TlF6Y21SazEzTmZJUm1QVk5uR3VWL3UzCmdtM2MKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR1RTIFJvb3QgUjIKPT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZWekNDQXorZ0F3SUJBZ0lOQWdQbHJzV05CQ1VhcXhFbHFqQU5CZ2txaGtpRzl3MEJBUXdGQURCSE1Rc3dDUVlEVlFRR0V3SlYKVXpFaU1DQUdBMVVFQ2hNWlIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZwpVakl3SGhjTk1UWXdOakl5TURBd01EQXdXaGNOTXpZd05qSXlNREF3TURBd1dqQkhNUXN3Q1FZRFZRUUdFd0pWVXpFaU1DQUdBMVVFCkNoTVpSMjl2WjJ4bElGUnlkWE4wSUZObGNuWnBZMlZ6SUV4TVF6RVVNQklHQTFVRUF4TUxSMVJUSUZKdmIzUWdVakl3Z2dJaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURPM3YybSsrenNGRFE4QndaYWJGbjNHVFhkOThHZFZhclR6VHVrazNMdgpDdnB0bmZid2hZQmJvVWhTbnpuRnQrNG9yTy9MZG1nVXVkK3RBV3laSDhRaUhaLytjbmZnTEZ1djVBUy9UM0tnR2pTWTZEbG83SlVsCmUzYWg1bW01aFJtOWlZeityZTAyNm5POC80UGl5MzNCMHM1S3M0MEZub3RKazkvQlc5QnVYdkF1TUM2Qy9QcTh0QmNLU09XSW04V2IKYTk2d3lyUUQ4TnIwa0xobFpQZGNUSzNvZm1aZW1kZTR3ajdJMEJPZHJlN2tSWHVKVmZlS0gySlNoQkt6d2tDWDQ0b2ZSNUdtZEZyUworTEZqS0JDNHN3bTRWbmRBb2lhWWVjYiszeVh1UHVXZ2Y5UmhEMUZMUEQrTTJ1RndkTmpDYUtINXdRenBvZUovdTFVOGRnYnVhazdNCmtvZ3dUWnE5VHd0SW1vUzFtS1BWKzNQQlYySGRLRloxRTY2SGp1Y01VUWtRZFloTXZJMzVlenpVSWtnZkt0enJhN3RFc2NzemNUSkcKcjYxSzhZem9kRHFzNXhvaWM0RFNNUGNsUXNjaU96c1NyWll1eHNOMkI2b2d0elZKVittU1NlaDJGbkl4Wnl1V2ZvcWp4NVJXSXI5cQpTMzRCSWJJak10L2tta1J0V1Z0ZDlRQ2dISnZHZUplTmtQK2J5S3EwcnhGUk9WN1orMmV0MVZzUm5US2FHNzNWdWx1bHljc2xhVk5WCkoxemd5amJMaUdIN0hyZlF5KzRXKzlPbVRONlNwZFRpMy9VR1ZONHVuVXUwa3pDcWdjN2RHdHhSY3cxUGNPbmx0aFloR1hteTVva0wKZFdUSzFhdThDY0VZb2YvVVZLR0ZQUDBVSkFPeWg5T2t0d0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVApBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVdS8vS2ppT2ZUNW5LMitKb3BxVVZKeGNlMlE0d0RRWUpLb1pJaHZjTkFRRU1CUUFECmdnSUJBQi9LenQzSHZxR2YyU2RNQzl3WG1CRnFpTjQ5NW5GV2NyS2VHazZjMVN1WUpGMmJhM3V3TTRJSnZkOGxSdXFZbnJZYi9vTTgKMG1KaHdRVHR6dURGeWNnVEUxWG5xR090akhzQi9uY3c0YzVvbXdYNEV1NTVNYUJCUlRVb0NuR2tKRStNM0R5Q0IxOW0zSDBRL2d4aApzd1dWN3VHdWdRK28rTWVQVGFnakFpWnJIWU5TVmM2MUx3REtnRURnNFhTc1lQV0hnSjJ1Tm1TUlhiQm9HT3FLWWNsM3FKZkV5Y2VsCi9GVkw4L0IvdVdVOUoyalF6R3Y2VTUzaGtSckpYUnFXYlRLSDdRTWd5QUxPV3I3WjZ2MnlUY1F2Rzk5ZmV2WDRpOGJ1TVRvbFVWVm4KaldReWUrbWV3NEs2S2kzcEhyVGdTQWFpL0dldkh5SUNjL3NnQ3ErZFZFdWh6ZjlnUjdBL1hlOGJWcjJYSVpZdEN0RmVuVGdDUjJ5NQo5UFlqSmJpZ2Fwb3Jkd2o2eExFb2tDWllDRHppZnFyWFBXKzZNWWdLQmVzbnRhRko3cUJGVkh2bUoyV1pJQ0dvbzd6N0dKYTdVbThNCjdZTlJUT2xaNGlCZ3hjSmxrb0tNOHhBZkRvcVh2bmVDYlQrUEhWMjhTU2U5ekU4UDRjNTJoZ1FqeGNDTUVsdjkyNFNnSlBGSS8yUjgKMEw1Y0Z0SHZtYTNBSC92THJydzRJZ1ltWk5yYWx3NC9LQlZFcUU4QXl2Q2F6TTkwYXJRK1BPdVY3TFhUV3RpQm1lbERHRGZyczd2UgpXR0pCODJiU2o2cDRsVlFndzFvdWRDdlYwYjRZYWNDczFhVFBPYnBSaEFObDZXTEFZdjdZVFZXVzR0QVIra2cwRWV5ZTdRVWQ1TWpXCkhZYkwKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR1RTIFJvb3QgUjMKPT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNDVENDQVk2Z0F3SUJBZ0lOQWdQbHVJTHJJUGdsSjIwOVpqQUtCZ2dxaGtqT1BRUURBekJITVFzd0NRWURWUVFHRXdKVlV6RWkKTUNBR0ExVUVDaE1aUjI5dloyeGxJRlJ5ZFhOMElGTmxjblpwWTJWeklFeE1RekVVTUJJR0ExVUVBeE1MUjFSVElGSnZiM1FnVWpNdwpIaGNOTVRZd05qSXlNREF3TURBd1doY05Nell3TmpJeU1EQXdNREF3V2pCSE1Rc3dDUVlEVlFRR0V3SlZVekVpTUNBR0ExVUVDaE1aClIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZ1VqTXdkakFRQmdjcWhrak8KUFFJQkJnVXJnUVFBSWdOaUFBUWZUek9ITXltS29ZVGV5OGNoV0VHSjZsYWRLMHVGeGgxTUo3eC9KbEZ5YitLZjFxUEt6RVVVUm91dAo3MzZHak95eGZpLy9xWEdkR0lSRkJFRlZiaXZxSm4rN2tBSGpTeG02NUZTV1JRbXgxV3lSUksyRUU0NmFqQTJBRERMMjRDZWpRakJBCk1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJUQjhTYTZvQzJ1aFlIUDAvRXEKRXIyNENtZjl2REFLQmdncWhrak9QUVFEQXdOcEFEQm1BakVBOXVFZ2xSUjdWS09RRmhHL2hNanFiMnNYbmg1R21DQ2JuOU1OMmF6VApMODE4K0ZzdVZidS8zWkwzcEF6Y01lR2lBakVBL0pkbVp1VkRGaE9EM2NmZkw3NFVPTzBCenJFWEdoRjE2YjBEanlaK2hPWEpZS2FWCjExUlp0K2NSTEluVXVlNFgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR1RTIFJvb3QgUjQKPT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNDVENDQVk2Z0F3SUJBZ0lOQWdQbHdHanZZeHFjY3BCUVVqQUtCZ2dxaGtqT1BRUURBekJITVFzd0NRWURWUVFHRXdKVlV6RWkKTUNBR0ExVUVDaE1aUjI5dloyeGxJRlJ5ZFhOMElGTmxjblpwWTJWeklFeE1RekVVTUJJR0ExVUVBeE1MUjFSVElGSnZiM1FnVWpRdwpIaGNOTVRZd05qSXlNREF3TURBd1doY05Nell3TmpJeU1EQXdNREF3V2pCSE1Rc3dDUVlEVlFRR0V3SlZVekVpTUNBR0ExVUVDaE1aClIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZ1VqUXdkakFRQmdjcWhrak8KUFFJQkJnVXJnUVFBSWdOaUFBVHpkSE9uYUl0Z3JrTzROY1dCTUh0TFNaMzd3V0hPNXQ1R3ZXdlZZUmcxcmtEZGMvZUprVEJhNnp6dQpoWHlpUUhZN3FjYTRSOWdxNTVLUmFuUHBzWEk1bnltZm9walRYMTVZaG1VUG9ZUmxCdEhjaThuSGM4aU1haS9seEt2UkhZcWpRakJBCk1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJTQVROYnJkUDlKTnFQVjJQeTEKUHNWcThKUWRqREFLQmdncWhrak9QUVFEQXdOcEFEQm1BakVBNkVEL2c5NEQ5Sit1SFhxbkxybXZUL2FESFE0dGhRRWQwZGxxN0EvQwpyOGRlVmw1YzFSeFlJaWdMOXpDMkw3RjhBakVBOEdFOHAvU2dndU1oMVlRZGM0YWNMYS9LTkp2eG43a2pOdUs4WUFPZGdMT2FWc2poCjRyc1VlY3JOSWRTVXRVbEQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVGVsaWEgUm9vdCBDQSB2Mgo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZERDQ0ExeWdBd0lCQWdJUEFXZGZKOWIrZXVQa3JMNEpXd1dlTUEwR0NTcUdTSWIzRFFFQkN3VUFNRVF4Q3pBSkJnTlZCQVlUCkFrWkpNUm93R0FZRFZRUUtEQkZVWld4cFlTQkdhVzVzWVc1a0lFOTVhakVaTUJjR0ExVUVBd3dRVkdWc2FXRWdVbTl2ZENCRFFTQjIKTWpBZUZ3MHhPREV4TWpreE1UVTFOVFJhRncwME16RXhNamt4TVRVMU5UUmFNRVF4Q3pBSkJnTlZCQVlUQWtaSk1Sb3dHQVlEVlFRSwpEQkZVWld4cFlTQkdhVzVzWVc1a0lFOTVhakVaTUJjR0ExVUVBd3dRVkdWc2FXRWdVbTl2ZENCRFFTQjJNakNDQWlJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTExRUHdlODRudlFhNW40NG5kcDU4NmRwQU84Z20yaC9vRmxIMHduckk0QXVoWjcKNnpCcUFNQ3pkR2grc3EvSDFXS3plajlReW93MlJDUmowamJwRElYMlEzYlZUS0ZnY21maUtET2x5ekc0T2lJak5MaDl2VllpUUozcQo5SHNEcldqOHNvRlBtTkIwNm8zbGZjMWp3NlAyM3BMQ1dCbmdscnZGeEtrOXBYU1cvcS81aWFxOWxSZFUySGhFOFF4M0ZaTGdtRUtuCnBOYXFJSkxOd2FDemxySTZoRUtOZmRXVjVOYmI2V0xFV0xONXhZelROVE9EbjNXaFVpZGhPUEZaUFk1UTRMMTVQT2RzbHY1ZTJRSmwKdEk1YzBCRTAzMTIvVXFlQkFNTi9tVVdaRmRVWHlBcFQ3R1B6bVgzTWFSS0d3aGZ3QVo2L2hMelJVc3Nia21iT3BGUGxvYi9FMnduVwo1b2xXSzhqamZON2ovNG5sTlc0bzZHd0xJMUdwSlFYclNQamRzY3I2YkFoUjc3Y1liRVRLSnVGenhva0dnZVdLckxEaUtjYTVKTE5yClJCSDBwVVBDVEVQbGNEYU10ak5YZXBVdWdxRDBYQkN6WVlQMkFnV0dMbnd0Yk53RFJtNDFrOVY2bFMvZUlOaGJmcFNRQkdxNldUMEUKQlhXZE42SU9MajNyd2FSU2cvN1FhOVJtanR6RzZSSk9IU3BYcWhDOGZGNkNmYWFteWZJdHVmVVhKNjNSRG9sVUs1WDZ3SzBkbUJSNApNMEtHQ3FsenRmdDBEYmNiTUJuRVdnNGNKN2ZhR05EL2lzZ0Z1dkdxSEtJM3QrWklwRVlzbE9xb2RtSkhpeEJUQjBoWGJPS1NUYmF1CkJjdmN3VXBlajZ3OUdVN0M3V0IxSzl2QnlrTFZBZ01CQUFHall6QmhNQjhHQTFVZEl3UVlNQmFBRkhLczVETjVxa1dIOXYyc0haN1cKeHkrRzJDUTVNQjBHQTFVZERnUVdCQlJ5ck9RemVhcEZoL2I5ckIyZTFzY3ZodGdrT1RBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQW9EdFpwd21VUGphRTBuNHZPYVdXbC9vUnJmeG44M0VKCjhyS0poR2RFcjdudjdaYnNuR1RiTWpCdlo1cXNmbCt5cXdFMmZvSDY1SVJlMHF3MjRHdGl4WDFMRG9KdDBuWmkwZjZYK0o4d2ZCajUKdEZKM2doMTIyOU1kcWZEQm1nQzliWFhZZmVmNnh6aWpuSERvUm5rRHJ5NTAyM1g0YmxNTUE4aVpHb2sxR1R6VHlWUjhxUEFzNW00SAplVzlxNGVicWtZSnBDaDNEZmxtaW5tdEdGWmhiMDY5R0hXTEl6b0JTU1JFL3lRUVN3eE44UHp1S2x0czhvQjRLdEl0VXNpUm5EZStDCnk3NDhmZEhpZjY0VzFsWll1ZG9nc1lNVm9lK0tUVEp2UVM4VFVvS1UxeHJCZUtKUjNTdHdiYmNhK2ZldzRHZVhWdHQ4WVZNSkF5Z0MKUU1lejJQMmNjR3JHS01PRjZlTHRHcE9nM2t1WW9vUStCWGNCbGozN3RDQVBuSElDZWhJdjFhTzZVWGl2S2l0RVpVNjEvUXJvd2MxNQpoMkVyM29CWFJiOW44WnVSWHFXazdGbElFQTA0eDdENncwUnRCUFY0VUJ5U2xsdmE5Ymd1dWx2UDVmQnFuVXN2V0hNdFR5M0VIRDcwCnN6K3JGUTQ3R1VHS3BNRlhFbVp4VFBwVDQxZnJZcFVKbmxUZDBjSThWenk5T0syWVpMZTRBNXBUVm1CZHM5aENHMXhMRW9vYzYrdDkKeG5wcHh5ZC9wUGlMOHVTVVpvZEw2WlFIQ1JKNWlyTHJkQVRjenZSRVdlQVd5c1VzV05jOGU4OWlobXBRZlRVMlpxZjdOK2NveDlqUQpyYVZwbEkvb3dkOGsrQnNITVllQjJGMzI2Q2pZU2xLQXJCUHVVQlFlbU1jPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpELVRSVVNUIEJSIFJvb3QgQ0EgMSAyMDIwCj09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMyekNDQW1DZ0F3SUJBZ0lRZk1tUEs0VFgzK29QeVdXYTAwdE5sakFLQmdncWhrak9QUVFEQXpCSU1Rc3dDUVlEVlFRR0V3SkUKUlRFVk1CTUdBMVVFQ2hNTVJDMVVjblZ6ZENCSGJXSklNU0l3SUFZRFZRUURFeGxFTFZSU1ZWTlVJRUpTSUZKdmIzUWdRMEVnTVNBeQpNREl3TUI0WERUSXdNREl4TVRBNU5EVXdNRm9YRFRNMU1ESXhNVEE1TkRRMU9Wb3dTREVMTUFrR0ExVUVCaE1DUkVVeEZUQVRCZ05WCkJBb1RERVF0VkhKMWMzUWdSMjFpU0RFaU1DQUdBMVVFQXhNWlJDMVVVbFZUVkNCQ1VpQlNiMjkwSUVOQklERWdNakF5TURCMk1CQUcKQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQk1iTHh5alIrNFQxbXU5Q0ZDRGhRMnR1ZGEzOEt3T0UxSGFUSmRkWk8wRmxheDdtTkNxNwpkUFlTenVodDU2dmtQRTQvUkFpTHpSWnh5NytTbWZTazF6eFFWRktRaFlONGxHZG5veHdKR1QxMU5JWGU3V0I5eHd5MFFWSzVidVh1ClFxT0NBUTB3Z2dFSk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZIT1JFS3YvVmJOYWZBa2wxYks2Q0tCcnF4OXQKTUE0R0ExVWREd0VCL3dRRUF3SUJCakNCeGdZRFZSMGZCSUcrTUlHN01ENmdQS0E2aGpob2RIUndPaTh2WTNKc0xtUXRkSEoxYzNRdQpibVYwTDJOeWJDOWtMWFJ5ZFhOMFgySnlYM0p2YjNSZlkyRmZNVjh5TURJd0xtTnliREI1b0hlZ2RZWnpiR1JoY0RvdkwyUnBjbVZqCmRHOXllUzVrTFhSeWRYTjBMbTVsZEM5RFRqMUVMVlJTVlZOVUpUSXdRbElsTWpCU2IyOTBKVEl3UTBFbE1qQXhKVEl3TWpBeU1DeFAKUFVRdFZISjFjM1FsTWpCSGJXSklMRU05UkVVL1kyVnlkR2xtYVdOaGRHVnlaWFp2WTJGMGFXOXViR2x6ZERBS0JnZ3Foa2pPUFFRRApBd05wQURCbUFqRUFsSkF0RS9yaFkvaGhZK2l0aFhoVWtaeTRremcrR2tIYVFCWlRRZ2pLTDQ3eFBvRld3S3JZN1JqRXNLNzBQdm9tCkFqRUE4eWppeHRzcm1mdTNVYmdrbzZTVWVoby81amJpQTFjemlqRExnc2ZXRkJIVmRXTmJGSldjSHdIUDJOVnlwdzg3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkQtVFJVU1QgRVYgUm9vdCBDQSAxIDIwMjAKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQzJ6Q0NBbUNnQXdJQkFnSVFYd0pCMTNxSGZFd0RvNnlXamZ2LzBEQUtCZ2dxaGtqT1BRUURBekJJTVFzd0NRWURWUVFHRXdKRQpSVEVWTUJNR0ExVUVDaE1NUkMxVWNuVnpkQ0JIYldKSU1TSXdJQVlEVlFRREV4bEVMVlJTVlZOVUlFVldJRkp2YjNRZ1EwRWdNU0F5Ck1ESXdNQjRYRFRJd01ESXhNVEV3TURBd01Gb1hEVE0xTURJeE1UQTVOVGsxT1Zvd1NERUxNQWtHQTFVRUJoTUNSRVV4RlRBVEJnTlYKQkFvVERFUXRWSEoxYzNRZ1IyMWlTREVpTUNBR0ExVUVBeE1aUkMxVVVsVlRWQ0JGVmlCU2IyOTBJRU5CSURFZ01qQXlNREIyTUJBRwpCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCUEVMM1laRElCbmZsNFhvSWtxYno1Mll2N1FGSnNuTDQ2YlNqOFdlZUhzeGlhbUpyU2M4ClpSQ0MvTi9EblU3d015UEUwakwxSExEZk14ZGR4ZkN4aXZudnViY1V5aWxLd2crcGYzVmxTU293Wi9Sazk5WWFkOXJEd3BkaFFudEoKcmFPQ0FRMHdnZ0VKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkg4UUFSWTNPcVFvNUZENHBQZnNheksyL3VtTApNQTRHQTFVZER3RUIvd1FFQXdJQkJqQ0J4Z1lEVlIwZkJJRytNSUc3TUQ2Z1BLQTZoamhvZEhSd09pOHZZM0pzTG1RdGRISjFjM1F1CmJtVjBMMk55YkM5a0xYUnlkWE4wWDJWMlgzSnZiM1JmWTJGZk1WOHlNREl3TG1OeWJEQjVvSGVnZFlaemJHUmhjRG92TDJScGNtVmoKZEc5eWVTNWtMWFJ5ZFhOMExtNWxkQzlEVGoxRUxWUlNWVk5VSlRJd1JWWWxNakJTYjI5MEpUSXdRMEVsTWpBeEpUSXdNakF5TUN4UApQVVF0VkhKMWMzUWxNakJIYldKSUxFTTlSRVUvWTJWeWRHbG1hV05oZEdWeVpYWnZZMkYwYVc5dWJHbHpkREFLQmdncWhrak9QUVFECkF3TnBBREJtQWpFQXlqekdLblhDWG5WaU9UWUFZRnFMd1pPWnpObmJRVHM3aDVrWE85WE1UOG9pOTZDQXkvbTBzUnRXOVhMUy9CblIKQWpFQWtmY3drejhRUml0eHBOQTdSSnZBS1FJRnNrRjNVZk41V3A2T0ZLQk9RdEpiZ2ZNMGFnUG5JamhRVyswWlQwTVcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgVExTIEVDQyBQMzg0IFJvb3QgRzUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNHVENDQVorZ0F3SUJBZ0lRQ2VDVFphejMyY2k1UGh3TEJDb3U4ekFLQmdncWhrak9QUVFEQXpCT01Rc3dDUVlEVlFRR0V3SlYKVXpFWE1CVUdBMVVFQ2hNT1JHbG5hVU5sY25Rc0lFbHVZeTR4SmpBa0JnTlZCQU1USFVScFoybERaWEowSUZSTVV5QkZRME1nVURNNApOQ0JTYjI5MElFYzFNQjRYRFRJeE1ERXhOVEF3TURBd01Gb1hEVFEyTURFeE5ESXpOVGsxT1Zvd1RqRUxNQWtHQTFVRUJoTUNWVk14CkZ6QVZCZ05WQkFvVERrUnBaMmxEWlhKMExDQkpibU11TVNZd0pBWURWUVFERXgxRWFXZHBRMlZ5ZENCVVRGTWdSVU5ESUZBek9EUWcKVW05dmRDQkhOVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJNRkVvYzhSbDFDYTNpT0NOUWZOME1zWW5kTHhmM2MxVHp2ZApsSEpTN2NJNytPejZlMnRZSU95WnJzbjhhTE4xdWRzSjdNZ1Q5VTdHQ2gxbU1FeTdIMGNLUEdFUVFpbDhwUWdPNENMcDB6Vm96cHRqCm40UzFtVTFZb0k3MVZPZVZ5YU5DTUVBd0hRWURWUjBPQkJZRUZNRlJSVkJacXo3bkxGcjZJQ0lTQjRDSWZCRnFNQTRHQTFVZER3RUIKL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNUUNKYW8xSDUrejhibFVEMldkcwpKazZEeHYzSit5c1R2TGQ2akxSbDBtbHBZeE5qT3laUUxnR2hlUWFSblVpL3dyNENNRWZERlh1eG9KR1pTWk9vUEh6b1JnYUxMUEl4CkFKU2RZc2lKdlJtRUZPbWwrd0c0RFhaRGpDNVR5M3pmREJlV1VBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgVExTIFJTQTQwOTYgUm9vdCBHNQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWmpDQ0EwNmdBd0lCQWdJUUNQbTBlS2o2ZnRwcU16ZUozbnpQaWpBTkJna3Foa2lHOXcwQkFRd0ZBREJOTVFzd0NRWURWUVFHCkV3SlZVekVYTUJVR0ExVUVDaE1PUkdsbmFVTmxjblFzSUVsdVl5NHhKVEFqQmdOVkJBTVRIRVJwWjJsRFpYSjBJRlJNVXlCU1UwRTAKTURrMklGSnZiM1FnUnpVd0hoY05NakV3TVRFMU1EQXdNREF3V2hjTk5EWXdNVEUwTWpNMU9UVTVXakJOTVFzd0NRWURWUVFHRXdKVgpVekVYTUJVR0ExVUVDaE1PUkdsbmFVTmxjblFzSUVsdVl5NHhKVEFqQmdOVkJBTVRIRVJwWjJsRFpYSjBJRlJNVXlCU1UwRTBNRGsyCklGSnZiM1FnUnpVd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN6MFBUSmVSR2QvZnhtZ2VmTTFlUzgKN0lFK2FqV09McmZuM3EvNUIwM1BNSjNxQ1F1WnZXeFgyaGhLdUhpc09qbW9wa2lzTG5MbHZldnhHczNucEFPcFB4RzAyQytKRnZ1VQpBVDI3TC9nVEJhRjRISTRvNEVYZ2cvUlpHNVd6cm40RFJlVyt3a0wrN3ZJOHRvVVRtREtkRnFncHdnc2NPTnlmTVhkY3Z5ZWovQ2VzCnR5dTlkSnNYTGZLQjJsMnc0U01YUG9oS0VpUFE2cytkM2dNWHNVSktvQlpNcEcyVDZUODY3anA4blZpZDlFNlAvRHNqeUcyNDRnWGEKek92c3d6SDAxNmNwVklEUFJGdE1iekNlODh6ZEg1UkRuVTEvY0hBTjFEclJOL0Jzblp2QUZKTlk3ODFCT0hXOEV3T1ZmSC9qWE9uVgpEZFhpZkJCaXFtdndQWGJ6UDZQb3NNSDk3NnBYVGF5R3B4aTBLY0VzRHI5a3ZpbU0yQUl0elZ3djhuL3ZGZlFNRmF3S3NQSFREVTlxClRYZVhBYUR4WnJlM3p1L083T3lsZGNxczQrRmo5N2loQk1pOGV6OWRMUllpVnUxSVNmNm5MM2t3Slp1NmF5MC9uVHZFRitjZEx2dnkKejZiODR4UXNscGdoakxTUjZSbGdnL0l3S3daelVOV1lPd2JweDRvTVlJd28rRktiYnVIMlRic0dKSnZYS3lZLy9Tb3ZjZlhXSkw1LwpNWjRQYmVpUFQwMmpQLzgxNnQ5SlhrR1Bodm54ZDNsTEc3U2pYaS83UmdMUVpoTmVYb1ZQenRod2lIdk9BYldXbDlmTmZmMkMrTUlrCndjb0JPVStOb3NFVVFCK2NadFVNQ1ViVzh0RFJTSFpXT2tQTHRnb1JPYnFNRTJ3R3RaN1A2d0lEQVFBQm8wSXdRREFkQmdOVkhRNEUKRmdRVVVUTWM3VFpBcnhmVEpjMXBhUEt2VGlNK3MwRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4dwpEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBR0NtcjF0ZlY5cUoyMHRRcWNRak5TSC8wR0V3aEpHM1B4RFBKWTdKdjBZMDJjRWhKaHh3CkdYSWVvOG1IL3FsRFpKWTZ5Rk1FQ3JaQnU4UkhBTm1mR0JnN3NnN3pOT29rOTkydklHQ3VraWhmTnVkZDVON0hQTnRRT2EyN1BTaE4KbG54MnhsdjB3ZHNVcGFzWllnY1lRRitYa2R5Y3g2dTFVUTNtYVZOVnpEbDkyc1VSVlhMRk80dUorRFF0cEJmbEYrYVpmVENJSVRmTgpNQmM5dVBLOHFIV2dROXcraVV1UXJtMEQ0Qnlqb0pZSnUzMmp0eW9RUkV0R0J6Umo3VEc1Qk82am01cXU1akY0OU9va1lUdXJXR1QvCnU0Y25ZaVdCMzl5aEwvYnRwLzk2ajFFdU1QaWtBZEtGT1Y4Qm1aWnZXbHR3R1ViK2htQStyWUFRQ2QwNUpTOVlmN3ZTZFBEM1JoOUcKT1VyWVU5RHpManR4cGRSdi9QTm41QWVQM1NZWjRZMWIrcU9URVp2cHlEckRWV2lha3VGU2Rqam80YnE5KzAvVjc3UG5TSU14OElJaAo0N2ErcDZ0djc1L2ZUTThCdUdKcUl6M25DVTJBRzNzd3BNUGRCMzgwdnFRbXN2WkI2QWtkNHlDWXFqZFAvL2Z4NGlsd01VYy9kTkFVCkZ2b2hpZ0xWaWdtVWR5N3lXU2lMZkZDU0NtWjRPSU4xeExWYXFCSEc1Y0dkWmxYUFU4U3YxM1dGcVVJVFZ1d2hkNEdUV2d6cWx0bEoKeXFFSThwYzdiWnNFR0NSRWpud0I4dHdsMkY2R21yRTUyL1dSTW1yUnBuQ0tvdmZlcEVXRkpxZ2VqRjBwVzhoTDJKcHFBMTV3OG9WUApiRXRvTDhwVTlvemFNdjdEYTRNL09NWisKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydGFpbmx5IFJvb3QgUjEKPT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZSekNDQXkrZ0F3SUJBZ0lSQUk0UCtVdVFjV2hsTTFUMDFFUTV0K0F3RFFZSktvWklodmNOQVFFTEJRQXdQVEVMTUFrR0ExVUUKQmhNQ1ZWTXhFakFRQmdOVkJBb1RDVU5sY25SaGFXNXNlVEVhTUJnR0ExVUVBeE1SUTJWeWRHRnBibXg1SUZKdmIzUWdVakV3SGhjTgpNakV3TkRBeE1EQXdNREF3V2hjTk5EWXdOREF4TURBd01EQXdXakE5TVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpRMlZ5CmRHRnBibXg1TVJvd0dBWURWUVFERXhGRFpYSjBZV2x1YkhrZ1VtOXZkQ0JTTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVAKQURDQ0Fnb0NnZ0lCQU5BMjFCL3EzYXZrMGJibSt5TEEzUk1OYW5zaUV4eVhQR2hqWmpLY0E3V05wSUdEMm5nd0VjL2NzaXUra3IrTwo1TVFUdnFSb1ROb0NhQlowdnJMZEJPUnJLdDAzSDJBczIvWDNvWHlWdHd4d2hpN3hPdTlTOTh6VG0vbUx2ZzdmTWJlZGFGeVNwdlhsCjh3bzB0Zjk3b3VTSG9jYXZGd0R2QTVIdHFSeE9jVDNTaTJ5SjlIaUc1bXBKb002MTByQ3JtL2IwMUM3amN2azJ4dXNWdHlXTU92d2wKRGJNaWN5RjB5RXFXWVpMMUx3c1lwZlN0NHU1QnZRRjUrcGFNalJjQ01MVDVyM2dhakxRMkVCQUhCWERROURHUWlsSEZoaVo1c2hHSQpYc1h3Q2xUTlNhYS9BcHpTUktmdDQzanZSbDV0Y2RGNWNCeEdYMUhweVRmY1gzNXBlMEhmTkVYZ080VDBvWW9LTnA0M3pHSlM0WWtOCktQbDZJN0VOUFQyYS9aMkI3eXlRd0h0RVRydEo0QTVLVnBLOHk3WGRlUmVKa2Q1aGlYU1NxT015aGI1T2hhUkxXY3NyeFhpT2NWVFEKQWplWmpPVko2dUJVY3FRUkJpOExqTUZidnJXaHNGTnVuTGhna1I5WmEva3Q5SlFLbDdYc3hYWURWQnRsVXJwTWtsWlJOYUJBMkNuYgpybEoyT3kwd1FKdUswRUpXdExlSUFhU0hPMU9XemFNV2ovTm1xaGV4eDJEZ3dVTUZETzZiVzJCdkJseUhXeWY1UUJHZW5EUEJ0K1UxClZ3Vi9KODRYSUl3Yy9QSDcyakVwU2UzMUM0U25UOEgyVHNJb25QcnU0SzhIK3pNUmVpRlBDeUVRdGtBNnF5STZCSnlMbTRTR2NwclMKcDZYRXRIV1JxU3NqQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZApEZ1FXQkJUZ3FqOGxqWjlFWE1FNjZDNnVkMHlFUG1jTTlEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUF1VmV2dUJMYVY0T1BhQXN6CkhRTlRWZlNWY09RclBiQTU2L3FKWXYzMzFoZ0VMeUUwM2ZGbzhOV1dXdDdDZ0tQQmpjWnE5MWwzcmhWa3oxdDVCWGRtNm96VGF3M2QKOFZrc3dUT2xNSUFWUlFkRkdqRWl0cElBcTVsTk9vOTNyNmtpeWk5anloWFd4OGJ3UFd6OEhBMllFR0dlRWFJaTF3cnlrWHByT1E0dgpNTU0yU1ovZzZROENSRkEzbEZWOTZwLzJPN3FVcFV6cHZENVJ0T2pLa2paVWJWd2xLTnJkclJUOTArN2lJZ1hyMFBLM2FCTFhXb3BCCkdzYVNwVm83WTBWUHYrRTZkeUl2WEw5RytWb0RoUk5DWDhyZVU5ZGl0YVkxQk1KSC81bjloTjljenVsZWdDaEI4bjNuSHBEWVQzWSsKZ2p3Ti9LVUQrbnNhMlVVZVlOckVqdm44SzhsN2xjVXEvNnFKMzRJeEQzTC9EQ2ZYQ2g1V0FGQWVESkRCbHJYWUZJVzdwdzBXd2ZnSApKQnU2aGFFYUJRbUF1cFZqeVRyc0paOS9uYnFrUnhXYlJIRHhha3ZXT0Y1RDh4aCtVRzdwV2lqbVplWjNHenI5SGI0REpxUGIxT0c3CmZwWW5LeDN1cFB2YUpWUVRBOTQ1eHNNZlRaRHNqeHRLMGh6dGhaVTRVSGxHMXNHUVVER3BYSnB1SGZVelZvdW5tZEx5eUN3ems1SXcKeDA2TVpUTVFaQmY5SkJlVzBZM0NPbW9yNnhPTFJQSWg4MG9hdDNkZjErMklwSExsT1IrVm5iNW53WEFSUGJ2MCtFbTM0eWFYT3AvUwpYM3o3d0psOE9TbmdleDIvRGFlUDBpazBiaVFWeTk2UVhyOGF4R2Jxd3VhNk9WK0ttYWxCV1Fld0xLOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydGFpbmx5IFJvb3QgRTEKPT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUI5ekNDQVgyZ0F3SUJBZ0lRQmlVenNVY0RNeWRjK1kyYXViL00rREFLQmdncWhrak9QUVFEQXpBOU1Rc3dDUVlEVlFRR0V3SlYKVXpFU01CQUdBMVVFQ2hNSlEyVnlkR0ZwYm14NU1Sb3dHQVlEVlFRREV4RkRaWEowWVdsdWJIa2dVbTl2ZENCRk1UQWVGdzB5TVRBMApNREV3TURBd01EQmFGdzAwTmpBME1ERXdNREF3TURCYU1EMHhDekFKQmdOVkJBWVRBbFZUTVJJd0VBWURWUVFLRXdsRFpYSjBZV2x1CmJIa3hHakFZQmdOVkJBTVRFVU5sY25SaGFXNXNlU0JTYjI5MElFVXhNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRTNtLzQKZnh6ZjdmbEhoNGF4cE1DSytJS1hnT3FQeUVwZUtuMklhS2NCWWhTUkpIcGNucU1YZllxR0lUUVlVQnNRM3RBM1N5YkhHV0NBNlRTOQpZQmsyUU5ZcGh3azhrWHIydkJNajNWbE9CRjdQeUFJY0dGUEJNZGphSU9sRWplUjJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTh5Z1l5MlIxN2lrcTYrMnVJMWc0aGV2SUlnY3dDZ1lJS29aSXpqMEUKQXdNRGFBQXdaUUl4QUxHT1dpRERzaGxpVGQ2d1Q5OXUwbkNLOFo5K2Fvem11dDZEYWNwcHM2a0Z0WmFTRjRmQzB1clFlODdZUVZ0OApyZ0l3UnQ3cXkxMmE3RExDWlJhd1REQmNNUFBhVG5PR0J0ak9pUVJJTnpmNDNUTlJuWEN2ZTFYWUFTNTlCV1FPaHJpUgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNPRENDQWI2Z0F3SUJBZ0lKQU5aZG03TjRnUzdyTUFvR0NDcUdTTTQ5QkFNRE1HRXhDekFKQmdOVkJBWVRBa3BRTVNVd0l3WUQKVlFRS0V4eFRSVU5QVFNCVWNuVnpkQ0JUZVhOMFpXMXpJRU5QTGl4TVZFUXVNU3N3S1FZRFZRUURFeUpUWldOMWNtbDBlU0JEYjIxdApkVzVwWTJGMGFXOXVJRVZEUXlCU2IyOTBRMEV4TUI0WERURTJNRFl4TmpBMU1UVXlPRm9YRFRNNE1ERXhPREExTVRVeU9Gb3dZVEVMCk1Ba0dBMVVFQmhNQ1NsQXhKVEFqQmdOVkJBb1RIRk5GUTA5TklGUnlkWE4wSUZONWMzUmxiWE1nUTA4dUxFeFVSQzR4S3pBcEJnTlYKQkFNVElsTmxZM1Z5YVhSNUlFTnZiVzExYm1sallYUnBiMjRnUlVORElGSnZiM1JEUVRFd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQQpJZ05pQUFTa3BXOWdBd1BEdlRIMDB4ZWNLNFIxck9YOVBWZHUxMk8vNWdTSmtvNkJuT1BwUjI3S2tCTElFK0NubmZkbGRCOXNFTExvCjVPbnZiWVV5bVVTeFh2M01kaERZVzcyaXh2bldRdVJYZHR5UXdqV3BTNGc4RWtkdFhQOUpUeHBLVUxHalFqQkFNQjBHQTFVZERnUVcKQkJTR0hPZitMYVZLaXdqK0tCSDZ2cU5tK0dCWkx6QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBSwpCZ2dxaGtqT1BRUURBd05vQURCbEFqQVZYVUk5L0xidTl6dXhOdWllOXNSR0tFa3owRmhES21NcHpFMnh0SHFpdVEwNHBWMUlLdjNMCnNuTmRvNGdJeHd3Q01RREFxeTBPYmUwWW90dFQ2U1hiVlFqZ1VNemZSR0VXZ3F0SnNMS0I3SE9IZUxSTXNtSWJFdm9XVFNWTFk3MGUKTjlrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpCSkNBIEdsb2JhbCBSb290IENBMQo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmREQ0NBMXlnQXdJQkFnSVFWVzlsNDdUWmtHb2JDZEZzUHNCc0lEQU5CZ2txaGtpRzl3MEJBUXNGQURCVU1Rc3dDUVlEVlFRRwpFd0pEVGpFbU1DUUdBMVVFQ2d3ZFFrVkpTa2xPUnlCRFJWSlVTVVpKUTBGVVJTQkJWVlJJVDFKSlZGa3hIVEFiQmdOVkJBTU1GRUpLClEwRWdSMnh2WW1Gc0lGSnZiM1FnUTBFeE1CNFhEVEU1TVRJeE9UQXpNVFl4TjFvWERUUTBNVEl4TWpBek1UWXhOMW93VkRFTE1Ba0cKQTFVRUJoTUNRMDR4SmpBa0JnTlZCQW9NSFVKRlNVcEpUa2NnUTBWU1ZFbEdTVU5CVkVVZ1FWVlVTRTlTU1ZSWk1SMHdHd1lEVlFRRApEQlJDU2tOQklFZHNiMkpoYkNCU2IyOTBJRU5CTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBUEZtCkNMM1p4UlZoeTRRRVFhVnBOM2Nkd2JCNytzTjNTSkFUY21UUnVIeVFOWjBZZVlqamx3RThSNEh5RHFLWURaNC9OK0Fac3BEeVJoeVMKc1RwaHp2cTNScDREaHRjemJ1MzNSWXgyTjk1dWxwSDMxMzRyaHhmVml6WHVoSkZ5Vjl4Z3c4TzU1OGRuSkNOUFl3cGo5bVo5UzFXbgpQM2hrU1drU2wrQk1EZE1Kb0RJd092cWZ3UEtjeFJJcUxoeTFCRFBhcERnUmF0N0dHUFpIT2lKQmh5TDh4SWtvVk5pTXBUQUsrQmNXCnlxdzMvWG1ua1JkNE9KbXRXTzJ5M3N5SmZRT2NzNGxsNStNN3NTS0dqd1p0ZUFmOWtSSi9zR3NjaVEzNXVNdDBXd2ZDeVBRMTBXUmoKZXVsdW1paldNTDNtRzkwVnI0VHFuTWZLOVE3cThsMHBoNDlwY3ptK0xpUnZSU0dzeGRScEpRYURyWHBJaFJNc0RRYTRiSGxXL0tObgpNb0gxVjZYS1YwSnA2VndrWWUvaU1CaE9SSmhWYjNyQ2s5Z1p0dDU4UjRvUlRrbEgyeWlVQWd1VVNpejVFdEJQNkRGK2JIcS9waitiCk9UMENGcU1ZczJlc1d6OHNneXRuT1lGY3VYNlUxV1Rkbm85dXJ1aDhXN1RYYWtkSTEzNnoxQzJPVm5aT3oybnhia1JzMUNUcWpTU2gKR0wrOVYvNnBtVFcxMnhCM3VEMUl1dGJCNS9FalB0ZmZoWjBuUE5SQXZRb012ZlhualNYV2dYU0hSdFFwZGFKQ2JQZHppZWQ5djNwSwpIOU1peVJWVno5OXZmRlhRcElzSEVUZGZnNlltVjZZQlczNytXR2dIcWVsNjJibm8vMUFmcThLMHdNN282djBQdlkxTnVMeHhBZ01CCkFBR2pRakJBTUIwR0ExVWREZ1FXQkJURjcrM00ySTBoeGtqazQ5Y1VMcWNXaytXWUFUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEcKQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFVb0tzSVRRZkkvS2kyUG00cnpjMklJblJOd1BXYVorNApZUkM2b2pHWVdVZm8wUTBsSGhWQkRPQXFWZFZYVXN2NDVNZHBveDFOY1FKZVh5RkZZRWhjQ1k1SkVNRUUzS2xpYXdMd1E4aE9uVGhKCmRNa3ljRlJ0d1VmOGpyUTJudFNjdmQwZzFsUEpHS20xVnJsMmk1Vm5adTY5bVA2dTc3NXUrMkQyL1ZuR0tocy9JMHFVSkRBbnlJbTgKNjBRa21zczl2ay9WZXM2T0Y4dGl3ZG5lSGc1Ni8wT0dORks4WVQ4OFg3dlpkclJUdkplei9vcE1FaTRyODlmTzRhTC8zWHR3K3p1aApUYVJqQXYwNGw1VS9CWENnYTk5aWdVT0x0RmtOU294VW5NVzdnWi9OZmFYdkN5VWVPaURiSFB3Zm1HY0NDdFJ6UkJQYlVZUWFWUU5XCjRBQitkQWIvT01SeUhkT29QMmd4WGRNSnh5Nk1XMlBnNk53ZTB1eGhIdkxlNWUvMm1YWmdMUjZVY25IR0N5b3l4NUpPMVViWEhmbXAKR1FySStwWE9iU09ZcWdzNHJacFdEVytOOFRFQWlNRVhuTTBaTmpYK1ZWT2c0RHd6WDVaZTRqTHAzek83QmtxcDJJUnp6bmZTeHF4eAo0VnlqSFF5N0N0OWY0cU54Mk5vM1dxQjRLL1RVZmV0MjdmSmhjS1ZsbXRPSk5CaXIrM0krMTdROWVWellINkV6ZTltQ1VBeVRGNnBzCjNNS0N1d0pYTnErWUp5bzVVT0d3aWZVbGwzNUhhQkMwN0hQS3M1ZlJKTnoyWXFBbzA3V2p1R1MzaUdKQ3o1MVR6Wm0rWkdpUFR4NFMKU1BmU0tjT1lLTXJ5TWd1VGpDbFBQR0F5elFXV1llenlyLzZ6Y0N3dXB2ST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQkpDQSBHbG9iYWwgUm9vdCBDQTIKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNKVENDQWF1Z0F3SUJBZ0lRTEJjSWZXUXF3UDZGR0ZrR3o3Uks2ekFLQmdncWhrak9QUVFEQXpCVU1Rc3dDUVlEVlFRR0V3SkQKVGpFbU1DUUdBMVVFQ2d3ZFFrVkpTa2xPUnlCRFJWSlVTVVpKUTBGVVJTQkJWVlJJVDFKSlZGa3hIVEFiQmdOVkJBTU1GRUpLUTBFZwpSMnh2WW1Gc0lGSnZiM1FnUTBFeU1CNFhEVEU1TVRJeE9UQXpNVGd5TVZvWERUUTBNVEl4TWpBek1UZ3lNVm93VkRFTE1Ba0dBMVVFCkJoTUNRMDR4SmpBa0JnTlZCQW9NSFVKRlNVcEpUa2NnUTBWU1ZFbEdTVU5CVkVVZ1FWVlVTRTlTU1ZSWk1SMHdHd1lEVlFRRERCUkMKU2tOQklFZHNiMkpoYkNCU2IyOTBJRU5CTWpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCSjNMZ0pHTlUyZTF1VkN4QS9qbApTUjlCSWdtd1VWSlkxaXMwajhVU1JoVEZpeThzaFA4c2JxalY4UW5qQXlFVXhFTTlmTUVzeEV0cVNzM3BoK0I5OWlLKytrcFJ1RENLCi9lSGVHQklLOWtlMzV4ZS9KNHJVUVV5V1BHQ1d3ZjBWSEtOQ01FQXdIUVlEVlIwT0JCWUVGTkpLc1ZGL0J2RFJnaDlPYmwrcmcveEkKMUxDUk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTUJxOApXOWYrcWRKVURrcGQwbTJ4UU56MFE5WFNTcGtaRWxhQTk0TTA0VFZPU0cwRUQxY3hNREF0c2FxZEF6amJCZ0l4QU12TWgxUExldDhnClVYT1F3S2hiWWRERlVEbjloZjdCNDNqNHB0Wkx2WnVIancvbDFsT1dxenpJUU5waDkxT2o5dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3RpZ28gUHVibGljIFNlcnZlciBBdXRoZW50aWNhdGlvbiBSb290IEU0Ngo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNPakNDQWNHZ0F3SUJBZ0lRUXZMTTJodHBOMFJmRmY1MUtCQzQ5REFLQmdncWhrak9QUVFEQXpCZk1Rc3dDUVlEVlFRR0V3SkgKUWpFWU1CWUdBMVVFQ2hNUFUyVmpkR2xuYnlCTWFXMXBkR1ZrTVRZd05BWURWUVFERXkxVFpXTjBhV2R2SUZCMVlteHBZeUJUWlhKMgpaWElnUVhWMGFHVnVkR2xqWVhScGIyNGdVbTl2ZENCRk5EWXdIaGNOTWpFd016SXlNREF3TURBd1doY05ORFl3TXpJeE1qTTFPVFU1CldqQmZNUXN3Q1FZRFZRUUdFd0pIUWpFWU1CWUdBMVVFQ2hNUFUyVmpkR2xuYnlCTWFXMXBkR1ZrTVRZd05BWURWUVFERXkxVFpXTjAKYVdkdklGQjFZbXhwWXlCVFpYSjJaWElnUVhWMGFHVnVkR2xqWVhScGIyNGdVbTl2ZENCRk5EWXdkakFRQmdjcWhrak9QUUlCQmdVcgpnUVFBSWdOaUFBUjIrcG1wYmlEdCtkZDM0d2M3cU5zOVh6am9xMVdtVmsvV1NPcnNmeTJxdzdMRmVleVpZWDhRZWNjQ1d2a0VOL1UwCk5TdDN6bjhnajFLakFJbnMxYWVpYlZ2alM1S1RvSUQxQVpUYzhHZ0hIczN1L2lWU3RTQkRIQnYrNnhuT1E2T2pRakJBTUIwR0ExVWQKRGdRV0JCVFJJdHBNV2ZGTFh5WTRxcDNXN3VzTncvdXBZVEFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFLQmdncWhrak9QUVFEQXdObkFEQmtBakFuN3FSYXFDRzc2VWVYbEltbGRDQnRlVS9JdlpOZVdCajdMUm9BYXNtNFBkQ2tUMFJICmxBRldvdmd6SlF4QzM2b0NNQjNxNFM2SUx1SDVweDBDTWs3eW4yeFZkT091cnZ1bEd1N3QwdnpDQXhIclJWeGdFRDFjZjVrRFcyMVUKU0FHS2N3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdGlnbyBQdWJsaWMgU2VydmVyIEF1dGhlbnRpY2F0aW9uIFJvb3QgUjQ2Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmlqQ0NBM0tnQXdJQkFnSVFkWTM5aTY1OEJ3RDZxU1duNGNldEZEQU5CZ2txaGtpRzl3MEJBUXdGQURCZk1Rc3dDUVlEVlFRRwpFd0pIUWpFWU1CWUdBMVVFQ2hNUFUyVmpkR2xuYnlCTWFXMXBkR1ZrTVRZd05BWURWUVFERXkxVFpXTjBhV2R2SUZCMVlteHBZeUJUClpYSjJaWElnUVhWMGFHVnVkR2xqWVhScGIyNGdVbTl2ZENCU05EWXdIaGNOTWpFd016SXlNREF3TURBd1doY05ORFl3TXpJeE1qTTEKT1RVNVdqQmZNUXN3Q1FZRFZRUUdFd0pIUWpFWU1CWUdBMVVFQ2hNUFUyVmpkR2xuYnlCTWFXMXBkR1ZrTVRZd05BWURWUVFERXkxVApaV04wYVdkdklGQjFZbXhwWXlCVFpYSjJaWElnUVhWMGFHVnVkR2xqWVhScGIyNGdVbTl2ZENCU05EWXdnZ0lpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ1R2dFUyVW5YWUFTT2dIRWRDU2U1anRyY2gvY1NWMVVnckpud1VVeERhZWYwcnR5MmsKMUN6NjZqTGRTY0s1dlE5SVBYdGFtRlN2bmwweGRFOEgvRkFoM2FUUGFFOGJFbU50SlpsTUtwbnpTREJoK29GOEhxY0lTdHcrS3h3ZgpHRXh4cWpXTXJmaHU2RHRLMmVXVUF0YUpoQk9xYmNoUE04eFFsamVTTTl4ZmlPZWZWTmxJOEpoRDFtYjlueGM0UThVQlVRdlg0eU1QCkZGMWJGT2RMdnQzMHlOb0ROOUhXT2FFaFVUQ0RzRzNYTUU2V1c1SHdjQ1NydjBXQlpFTU52U0U2THp6cG5nM0xJTFZDSjh6YWI1dnUKWkRDUU9jMlRaWUVoTWJValVETTNJdU00N2ZneE1NeEYvbUw1MFYweWVVS0gzMnJNVmhsQVRjNnF1L20xZGttVThTZjRrYVdENVFhegpZdzZBM09BU1ZZQ21PMmEwT1ljdHlQRFEwUlRwNUExTkR2WmRWM0xGT3h4SFZwM2kxZnVCWVl6TVRZQ1FORnUzMXhSMTNOZ0VTSi9BCndTaUl0T2tjeXFleDhWYTNlMGxNV2VVZ0ZhaUVBaW42T0pScG1ra0dqODBmZVJRWEVneURldDRmc1pmdStaZDRLS1RJUkpMcGZTWUYKcGxoeW0za1QyQkZmcnNVNFlqUm9zb1l3anZpUVlaNHliUFVITnMyaVRHN3NpamJ0OHVhWkZVUnd3M3k4bkRuQXRPRnI5NE1sSTFmWgpFb0RsU2ZCMUQrK042eHliVkNpMElUejhmQXIvNzN0cmRmK0xIYUFaQmF2NitDdUJRdWc0dXJ2N3F2MDk0UFBLMzA2WGx5bnQ4eGhXCjZhV1dyTDNEa0ppeTRQbWkxS1pIUTN4dHp3SURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVWbk5ZWkpYNWtocXdFaW9FWW5taFFCV0kKSVVrd0RnWURWUjBQQVFIL0JBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUM5YwptVHo4Qmw2TWxDNXc2dEl5TVkyMDhGSFZ2QXJ6Wko4SFh0WEJjMmhrZXFLNUR1ajVYWVV0cURkRnFpajBsZ1ZRWUtsSmZwL2ltVFlwCkUwUkhhcDFWSUR6WW0vRURNcnJhUUtGejZvT2h0MFNtRHBrQm0rUzhmNzRUbEg3S3BoNTJnRFk5aEFhTE15WmxiY3ArbnY0ZmpGZzQKZXhxRHNRKzhGeEc3NWdiTVkvcUI4b0ZNMmdzUWE2SDYxU2lsendaQUZ2OTdmUmhlT1JLa1U1NStNa0lRcGlHUnFSeE9GM3lFdkorTQowZWpmNWxHNU5rYy9rTG5IdkFMY1d4eFBEa2pCSllPY0NqK2VzUU16RWhvbnJQY2liQ1RSQVVINFdBUCtKV2dpSDVwYVBIeHNublZJCjg0SHhabWR1VElMQTdycFhEaGp2THByM0V0aWdhK2tGcGFIcGFQaThURDhTSGtYb1VzQ2p2eEluZWJuTU1UekQ5am9pRmdPZ3lZOW0KcEZ1aVRkYUJKUWJwZHFRQUNqN0x6VFdiNE9FNHkyQlRoaWhDUVJ4RVYraW9yYXRGNHlVUXZOcytaVUg3RzZhWEQrdTVkSG41SHJ3ZApWdzFIcjhNdm40ZEdwK3NtV2c5V1k3VmlZRzRBKytNbkVTTG4vcG1QTlBXNTZNT1JjcjNZd3g2NUx2S1JSRkhRVjgwTU5OVklJYi9iCkUvRm1KVU5TMG5BaU5zMmZ4QngxSUsxamNtTUdEdzRuenRKcURieTFPUnJwMFhaNjBWems1MGxKTFZVM2FQQWFPcGcrVkJlSFZPbW0KSjFDSmV5QXZQLysvb1l0S1I1ai9LM3RKUHNNcFJtQVlRcXN6S2JyQUtia1RpZE9JaWpsQk84bjlwdTBmOUdCajM5SXRWUUdMCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNTTC5jb20gVExTIFJTQSBSb290IENBIDIwMjIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmlUQ0NBM0dnQXdJQkFnSVFiNzdhclhPOUNFRGlpMDIrMVBkYmtUQU5CZ2txaGtpRzl3MEJBUXNGQURCT01Rc3dDUVlEVlFRRwpFd0pWVXpFWU1CWUdBMVVFQ2d3UFUxTk1JRU52Y25CdmNtRjBhVzl1TVNVd0l3WURWUVFEREJ4VFUwd3VZMjl0SUZSTVV5QlNVMEVnClVtOXZkQ0JEUVNBeU1ESXlNQjRYRFRJeU1EZ3lOVEUyTXpReU1sb1hEVFEyTURneE9URTJNelF5TVZvd1RqRUxNQWtHQTFVRUJoTUMKVlZNeEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFbE1DTUdBMVVFQXd3Y1UxTk1MbU52YlNCVVRGTWdVbE5CSUZKdgpiM1FnUTBFZ01qQXlNakNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOQ2tDWEpQUUlnU1lUNDFJNTd1CjluVFBMM3RZUGM0OERSQW9rQytYOTR4STJLRFlKYkZNc0JGTUYzTlEwQ0pLWTd1QjB5bHUxYlVKUGlZWWY3SVNmNU9ZdDYvd05yL3kKN2hpZW5EdFN4VWNaWFhUelpHYlZYY2RvdEw4YkhBYWp2STlBSTdZZXhvUzlVY1FiT2NHVjBpbnNTNjU3TGI4NS9iUmkzcFo3UWNhYwpvT0FHY3Z2d0I1Y0pPWUYwci9jMFdSRlhDc0pid1NUME1YTXdnc2FkdWdMM1BueEVYNE1OOC9IZElHa1dDVkRpMUZXMjRJQnlkbTVNClI3ZDFWVm0wVTNUWmxNWkJyVmlLTVdZUEhxSWJLVUJPTDk5NzVoWXNMZnkvN1BPMCtyNFk5cHRKMU80RmJ0azA4NXp4N0FHTDBTREcKRDZDMXZCZE9TSHRSd3Z6cFhHazNSMmF6YVBnVktQQzUwNlFWekZwUHVsSndveEpGM2NhNlR2dkMwUGVvVWlkdGJubTFqUHg3ak1FVwpUTzZBZjc3d2RyNUJVeEl6cmxvNFFxdlhEejVCalhZSE10V3JpZlpPWjlteFFuVWpidlBOUXJMOFZmVlRoeGM3d0ROWThWTFMrWUNrCjhPandPNHM0ektUR2tIOFBuUDJMMGFQUDJvT25hY2xRTnRWY0JkSUtRWFRiWXhFM3dhV2dsa3NlakJZU2Q2NlVOSHNlZjhKbUFPU3EKZytxS2tLM09Oa1JOMFZIcHZCL3phZ1g5d0hRZkpSbEFVVzdxZ2xGQTM1dTVDQ29HQXRVakhCUFc2ZHZieHJCNnkzc25tL3ZnMVVZawo3UkJMWTB1bEJZKzZ1QjBycHZxUjRwSlN2ZXpyWjVkdG1pMmZnVElGWnpMN1NBZy8yU1c0QkNVdkFnTUJBQUdqWXpCaE1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVK3k0Mzd1T0VlaWN1elJrMXNUTjgvOVJFUXJrd0hRWURWUjBPQkJZRUZQc3UKTis3amhIb25MczBaTmJFemZQL1VSRUs1TUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBallsdApoRVVZOFUrem9POW9wTUFkckRDOFoyYXdtczIycXlJWlp0TTdRYlVRblJDNmNtNHBKQ0FjQVpsaTA1Ymc0dnNNUXRmaFdzU1dUVlROCmo4cERVLzBxdU9yNFpjb0J3cTFnYUFhZk9ScFIyZUNOSnZrTFRxVlRKWG9qcEJ6T0NCdmZSNGl5clQ3Z0o0ZUxTWXdmcVVkWWU1YnkKaUIwWXJyUFJwZ3FVK3R2VDVUZ0thM2tTTS90S1dUY1dRQTY3M3ZXSkRQRnMwL2RSYTE0MTlkdkFKdW9TYzA2cGtaQ21GOE5zTHpqVQpvM0tVUXl4aTRVNWNNajI5VEgwWlI2TERTZWVXUDQrYTB6dmtFZGlMQTl6MnRtQlZHS2FCVWZQaHFCVnE2K0FMOEJReDFybU1SVHFvCkVOand1U2ZyOTh0Njd3VnlsclhFajVaenhPaFdjNXk4YVZGanZPOW5IRU1hWDNjWkh4ajRIQ1VwK1VtWktiYVNQYUtETjdFZ2thaWIKTU9scWJMUWprMlVFcXhIekRoMVRKRWxUSGFFL25VaVNFZUo5RFUvMTE3MmlXRDU0blI0ZksvNGh1eG9UdHJFb1pQMndBZ0RIYklDaQp2UlpRSUE5eWdWL01sUCs3bWVhNmtNdnErY1lNd3E3RkdjNHpvV3RjdTM1OE5GY1hyZkEvcnMzcXI1bnNMRlIrak00dUVsWkk3eGM3ClAwcGVZTkxjZERhOHBVTmp5dzlib3dKV0NaNGtMT0dHZ1l6K3F4Y3Mrc2ppTWhvNi80VUl5WU9mOGtwSUVGUjNOKzJpdkVDKzVCQjAKOStSYnU3bnppZm1QUWRqSDVGQ1FOWUErSExoTmtOUFU5OE93b1g2RXluZVNNU3k0a0xHQ2VuUk9teE1tdE5WUVpsUjRybUE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNTTC5jb20gVExTIEVDQyBSb290IENBIDIwMjIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ09qQ0NBY0NnQXdJQkFnSVFGQVAxcS9zM2l4ZEFXK0pEc3FYUnhEQUtCZ2dxaGtqT1BRUURBekJPTVFzd0NRWURWUVFHRXdKVgpVekVZTUJZR0ExVUVDZ3dQVTFOTUlFTnZjbkJ2Y21GMGFXOXVNU1V3SXdZRFZRUUREQnhUVTB3dVkyOXRJRlJNVXlCRlEwTWdVbTl2CmRDQkRRU0F5TURJeU1CNFhEVEl5TURneU5URTJNek0wT0ZvWERUUTJNRGd4T1RFMk16TTBOMW93VGpFTE1Ba0dBMVVFQmhNQ1ZWTXgKR0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakVsTUNNR0ExVUVBd3djVTFOTUxtTnZiU0JVVEZNZ1JVTkRJRkp2YjNRZwpRMEVnTWpBeU1qQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkVVcE5YUDZ3cmdqemhSOXFMRk5vRnMyN2lvc1U4TmdDVFd5CkpHWW1hY0N6bGRaZGtrQVpEc2FsRTNEMDd4SlJLRjNuekwzNVBJWEJ6NVNReVN2T2trSllXV2Y5bENjUVpJeFBCTEZOU2VSN1Q1djEKNXdqNEE0ajNwOE9TU3hsVWdhTmpNR0V3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFmQmdOVkhTTUVHREFXZ0JTSmp5K2o2Q3VnRkZSNwo4MWE0Smw5bk9BdWMwREFkQmdOVkhRNEVGZ1FVaVk4dm8rZ3JvQlJVZS9OV3VDWmZaemdMbk5Bd0RnWURWUjBQQVFIL0JBUURBZ0dHCk1Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01GWGpJbGJwMTVJa1dFOGVsRElQREFJMnd2MnNkREpPNGZzY2dJaWp6UHZYNnl2L04zM3cKN2RlZWRXbzFkbEpGNEFJeEFNZU5iMElnajc2MlRWbnRkMDBweENBZ1JXU0dPbERHeEswdGsvVVlmWEx0cWMvRXJGYzJLQWhsM3p4NQpabjZnNmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNGVENDQVp1Z0F3SUJBZ0lRUFpnN3BtWTlrR1AzZmlaWE9BVHZBREFLQmdncWhrak9QUVFEQXpCTU1TNHdMQVlEVlFRRERDVkIKZEc5eklGUnlkWE4wWldSU2IyOTBJRkp2YjNRZ1EwRWdSVU5ESUZSTVV5QXlNREl4TVEwd0N3WURWUVFLREFSQmRHOXpNUXN3Q1FZRApWUVFHRXdKRVJUQWVGdzB5TVRBME1qSXdPVEkyTWpOYUZ3MDBNVEEwTVRjd09USTJNakphTUV3eExqQXNCZ05WQkFNTUpVRjBiM01nClZISjFjM1JsWkZKdmIzUWdVbTl2ZENCRFFTQkZRME1nVkV4VElESXdNakV4RFRBTEJnTlZCQW9NQkVGMGIzTXhDekFKQmdOVkJBWVQKQWtSRk1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFbG9aWUtEY0taOUNnM2lRWkdlSGtCUWNmbCszb1pJSzU5c1J4VU02SwpEUC9YdFhhN29XeVRiSU9pYUc2bDJiNHNpSlZCelYzZHNjcURZNFBNd0w1MDJlQ2RwTzVLVGxiZ21DbEJrMUlRMVNRNEFqSm44WlFTCmIrL1h4ZDR1L1JtQW8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlIyS0NYV2ZlQm1tbm9Kc21vN2pqUFgKTnROUG9qQU9CZ05WSFE4QkFmOEVCQU1DQVlZd0NnWUlLb1pJemowRUF3TURhQUF3WlFJd1c1a3A4NXd4dG9scmJOYTlkK0Y4NTFGKwp1RHJOb3paZmZQYzhkejdrVUsybzU5SlpEQ2FPTUR0dUNDckNwMXJJQWpFQW1lTU01NlBEcjlOSkxrYUNJMlpkeVFBVUV2MDQ5T0dZCmEzY3BldHNrejJWQXY5TGNqQkhvOUgxL0lJU3BRdVFvCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlpEQ0NBMHlnQXdJQkFnSVFVOVhQNWhtVEMvc3JCUkxZd2lxaXBEQU5CZ2txaGtpRzl3MEJBUXdGQURCTU1TNHdMQVlEVlFRRApEQ1ZCZEc5eklGUnlkWE4wWldSU2IyOTBJRkp2YjNRZ1EwRWdVbE5CSUZSTVV5QXlNREl4TVEwd0N3WURWUVFLREFSQmRHOXpNUXN3CkNRWURWUVFHRXdKRVJUQWVGdzB5TVRBME1qSXdPVEl4TVRCYUZ3MDBNVEEwTVRjd09USXhNRGxhTUV3eExqQXNCZ05WQkFNTUpVRjAKYjNNZ1ZISjFjM1JsWkZKdmIzUWdVbTl2ZENCRFFTQlNVMEVnVkV4VElESXdNakV4RFRBTEJnTlZCQW9NQkVGMGIzTXhDekFKQmdOVgpCQVlUQWtSRk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBdG9BT3hIbTlCWXg5c0tPZFRTSk55L0JCCmwwMVo0TkgrVm95WDh0ZTlqMnkzSTQ5ZjFjVFlRY3Z5QWg1eDVlbjJYc3NJS2w0dzhpMW14NFFiWkZjNG5YVXRWc1l2WWUrVy9DQkcKdmV2VWV6OC9mRWM0QktrYnFsTGZFemZURlJWT3ZWOThyNjFqeDNuY0NIdlZvT1gzVzNXc2dGV1prbUdielNvWGZkdVA5TFZxNmhkSwpaQ2htRlNsc0F2RnIxYnFqTTl4YVo2Y0Y0cjlsdGhhd0VPM05VRFBKY0ZEc0dZNnd4L0owVzJ0RXhuMld1WmdJV1diZUtRR2I5Q3B0CjB4VTZrR3BuOGJSclp0a2g2OHJaWW54R0VGemVkVWxubmtMNS9uV3BvNjMvZGdwblFPUEY5NDNIaFpwWm5tS2FhdTFGaDVobnN0VksKUE5lME93QU53SThmNFVERXJtd2gzRWwrZnNxeWpXMjJ2NU12b1Z3K2o4cnRnSTVZNGR0WHo0VTJPTEp4cEFtTWtva0lpRWp4UUdNWQpzbHVNV3VQRDB4ZXFxeG1qTEJ2azFjYmlabnJYZ2htbU94WXNMM0dIWDBXZWxYT1R3a0tCSVJPVzE1MjdrMmdWK3Aya0hZenlnZUJZCkJyM0p0dVAyaVYySitheEVvY3RyK2hieHgxQTlKTnIzdytTSDFWYnhUNUF3K2tVSldkbzB6dUFUSEFSOEFOU2JocVJBdk5uY1RGZCsKcnJjenRsNTI0V1dMWnQrTnl0ZVlyODQybUl5Y2c1a0RjUE92ZE8zR0RqYm52ZXpCYzZlVVdzdVNaSUttQU1Gd29XNHNLZUZZVit4YQpmSmxySmFTUU9vRDBJSjJhenNjdCtiSkxLWldENlRXTnAwbElwdzlNR1pIUTliOFE0SEVDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWRFbVowZiswZW1oRmRjTit0TnpNemprejJnZ3dEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEcKQ1NxR1NJYjNEUUVCREFVQUE0SUNBUUFqUTFNa1lseHQvVDdDejFVQWJNVldpTGtPM1RyaUpRMlZTcGZLZ0ludUtzMWwrTnNXNEFtUwo0QmpIZUppNzgreENVdnVwcElMWFRkaUsvT1JPL2F1UXhEaDFNb1NmLzdPd0t3SXpOc0FRa0c4ZG5LL2hhWlBzbzBVdkZKLzFUQ3BsClEzSU05OFA0bFlzVTg0VWdZdDFVVTkwczNCaVZhVStEUjNCQU0xaDNFZ3lpNjFJeEhrekpxTTdGNzhQUnJlQnJBd0EwSnJSVUlUV1gKQWR4ZkcvRjg1MVg2TFdoM2U5TnB6Tk1PYTdwTmRrVFd3aFdhSnV5d3hmVzcwWHAwd216TnhiVmU5a3ptV3kyQjI3TzNPcGVlN2M5RwpzbEE5aEdDWmNiVXp0VmRGNWtKSGRXb09zQWdNcnIzZTk3c1BXRDJQQXpIb1BZSlF5aTllREYyMGw3NGdOQWYweEJMaDd0ZXcyVmt0CmFmY3hCUFR5K2F2NUV6SDRBWGNPUFVJakpzeWFjbWRSSVhyTVBJV282aUZxTzl0YVBLVTBucHJBTE4rQW5DbmczM2VVMGFLQVF2OXEKVEZzUjBQWE5vcjZ1ekZGY3c5VlVld3l1MXJrR2Q0RGk3d2NhYU14WlVhMStYR2RydWR2aUIwSmJ1QUVGV0RsTjVMdVlvN0V5N05tagoxbStVSS84N3R5bGw1Z2ZwNzdZWjZ1ZkNPQjB5aUpBOEV5dHV6TytyZHdZMGQ0UlBjdVNCaFBtNWREVGVkaytTS2xPeEpUbmJQUC9sClBxWU81V3VlLzl2c0wzU0QzNDYwczZuZUZFMy9NYU5GY3lUNmxTbk1FcGNFb2ppMmpiRHdOL3pJSVg4L3N5UWJQWXR1ekUyd0ZnMlcKSFlNZlJzQ2J2VU9aNThTV0xzNWZ5UT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZwVENDQTQyZ0F3SUJBZ0lVWlBZT1pYZGhhcXM3dE9xRmhMdXhpYmh4a3c4d0RRWUpLb1pJaHZjTkFRRU1CUUF3V2pFTE1Ba0cKQTFVRUJoTUNRMDR4SlRBakJnTlZCQW9NSEZSeWRYTjBRWE5wWVNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eEpEQWlCZ05WQkFNTQpHMVJ5ZFhOMFFYTnBZU0JIYkc5aVlXd2dVbTl2ZENCRFFTQkhNekFlRncweU1UQTFNakF3TWpFd01UbGFGdzAwTmpBMU1Ua3dNakV3Ck1UbGFNRm94Q3pBSkJnTlZCQVlUQWtOT01TVXdJd1lEVlFRS0RCeFVjblZ6ZEVGemFXRWdWR1ZqYUc1dmJHOW5hV1Z6TENCSmJtTXUKTVNRd0lnWURWUVFEREJ0VWNuVnpkRUZ6YVdFZ1IyeHZZbUZzSUZKdmIzUWdRMEVnUnpNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQpBNElDRHdBd2dnSUtBb0lDQVFEQU1ZSmhrdVNVR3dvcVpkQytCcW1ITzFFUzZuQkJydUw3ZE9vS2pibXpUTnlQdHhOU1QxUVk0U3h6CmxaSEZaanRxejZ4amJZZFQ4UGZ4T2JlZ1EyT3d4QU5kVjZublJNN0VvWU5sOWxBK3NYNFd1RHFLQXRDV0h3RE5CU0h2Qm0zZElad1oKUTBXaHhlaUF5c0t0UUdJWEJzYXF2UFBXNXZ4UWZtWkNIenlMcG5sNWhrQTFueUR2UCt1TFJ4K1Bqc1hVanJZc3lVUUU0OVJEZFQvVgpQNjhjekg1R1g2emZaQkNLNzBid2tQQVBMZlNJQzdFcHFxK0Zxa2xZcUw5am9EaVI1clBtZDJqRStTb1poTHNPNGZXdmlleWxMMUFnCmRCNFNRWE1lSk5uS3ppeWhXVFhBeUIxR0oyRmFqL2xOMDNKNVpoNmZGWkFoTGYzdGkxWndBMHBKUG45cE1SSnB4eDVjeW5vVGkram0KOVdBUHpKTXNoSC94L0dyOG0wZWQyNjJJUGZOMmRUUFhTNlRJaS9uMVExaFB5OGdEVkkrbGhYZ0VHdk56OHRlSEhVR2Y1OWdYemhxYwpEMHI4M0VSb1ZHamlRVHorTElTR056ek5QeStpMitmM1ZBTmZXZFAza1hqSGkzZHFGdVZKaFpCRmNuQXZrVjM0UG1WQUN4bVp5U1lnCldtakJOYjlQcDFIeDJCRXJXK0NhbmlnN0Nqb0tIOEdCNVM3d3BybHBwWWlVNW1zVGY5RmtQejJjY0VibG9vVjdXSVFuM01TQVBtZWEKbXNlYU1RNHc3T1lYUUpYWlJlMEJscXEvRFBOTDBXUDNFMWpBdVBQNlo5MmJmVzFLL3pKTXRTVTcveHhuRDRVaVdRV1JrVUYzZ2RDRgpUSWNRY2YrZVF4dXVsWFV0Z1FJREFRQUJvMk13WVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZFRGs1UElqCjd6aktzSzVYZi9JaE1CWTAyN3lTTUIwR0ExVWREZ1FXQkJSQTVPVHlJKzg0eXJDdVYzL3lJVEFXTk51OGtqQU9CZ05WSFE4QkFmOEUKQkFNQ0FRWXdEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBQ1k3VWVGTk9QTXlHTFMwWHVGbFhzU1VUOVNuWWFQNHdNOHpBUUxwdzZvMQpEL0dVRTNkM05aNHRWbEZFYnVIR0xpZ2UvOXJzUjgyWFJCZjM0RXpDNFh4OE1ucG15RnEyWEZORlYxcEYxQVdaTHk0alZlNWphTi9UCkczaW5FcFFHQUhVTmNvVHBMcnhhYXRYZUwxbkhvK3pTaDJiYnQxUzFKS3YwUTNqYlN3VEViOTNtUG1ZK0tmSkxhSEVpaDZENHNUTmoKZHVNTmhYSkVJbFUvSEh6cC9MZ1Y2Rkw2cWo2aklUazFkSW1tYXNJNStualB0cXpuNTlaVy95T1NMbEFMcWJVSE0vUTRYNlJKcHN0bApjSGJvQ29XQVN6WTlNL2VWVkhVbDJxekVjNEpsNlZMMVhQMDRsUUpxYVRERkhBcFhCNjRpcEN6NXhVRzN1T3lmVDBnQStRRUVWY3lzCitUSXh4SFdWQnFCLzBZMG4zYk9wcEhLSC9sbUxtbnAwRnQwV3BXSXA2enFXM0l1bmFGblQ2M2VST2ZqWHk5bVBYMW9uQVgxZGFCbGkKMk1qTjlMZHlSNzVibDg3eXJhS1prNjJVeTVQMkVnbVZ0cXZYTzlBL0Vjc3dGaTU1Z09SbmdTMWQ3WEI0dG1CWnJPRmRSV09QeU45eQphRnZxSGJnQjhYNzc1NHF6NDFTZ09BbmdQTjVDOHNMdExwdnpIelcyTnRqamdLR0x6WmxrRDhLcXE3SEs5VytlUTQyRVZKbXpic0FTClp0aHdFUEVHTlRORHFKd3V1aFF4emhCL0hJYmpqOUxWK0hmc202dnhMMlBaUWwvZ1o0RmtrZkdYTC94dUp2WXorTk8xK01SaXF6RlIKSlFKNitOMXJaZFZ0VFRESVpicG9GR1dzSnd0MGl2S0gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVHJ1c3RBc2lhIEdsb2JhbCBSb290IENBIEc0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1ZUQ0NBZHlnQXdJQkFnSVVUeU5rdUk2WFk1N0dVNEhCZGs3TEtuUVYxdGN3Q2dZSUtvWkl6ajBFQXdNd1dqRUxNQWtHQTFVRQpCaE1DUTA0eEpUQWpCZ05WQkFvTUhGUnlkWE4wUVhOcFlTQlVaV05vYm05c2IyZHBaWE1zSUVsdVl5NHhKREFpQmdOVkJBTU1HMVJ5CmRYTjBRWE5wWVNCSGJHOWlZV3dnVW05dmRDQkRRU0JITkRBZUZ3MHlNVEExTWpBd01qRXdNakphRncwME5qQTFNVGt3TWpFd01qSmEKTUZveEN6QUpCZ05WQkFZVEFrTk9NU1V3SXdZRFZRUUtEQnhVY25WemRFRnphV0VnVkdWamFHNXZiRzluYVdWekxDQkpibU11TVNRdwpJZ1lEVlFRRERCdFVjblZ6ZEVGemFXRWdSMnh2WW1Gc0lGSnZiM1FnUTBFZ1J6UXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pCkFBVHhzODA0NUNWRDVkNFpDYnVCZWFJVlh4VmpBZDdDcTkyenBodG5TNENEcjVuTHJCZmJLNWJLZkZKVjRocmhQVmJ3THhZSStoVzgKbTd0SDVqL3VxT0ZNalBYVE52azRYYXR3bWtjTjRvRkJCdXRKK2JBcDNUUHNVS1YvZVNtNElKaWpZekJoTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVwYnRLbDg2ekszK2tNZDZYZzFtRHBtOXh5OTR3SFFZRFZSME9CQllFRktXN1NwZk9zeXQvCnBESGVsNE5aZzZadmNjdmVNQTRHQTFVZER3RUIvd1FFQXdJQkJqQUtCZ2dxaGtqT1BRUURBd05uQURCa0FqQmU4dXNHekVreG4wQUEKYmJkK052Qk5FVS96eTRrNkxIaVJVS05id01wMUp2Sy9rRjBMZ294Z0tKL0djSnBvNVBFQ01GeFlEbFoyejFqRDF4Q011bzZ1NDd4awpkVWZGVlpEai9icFY2d2ZFVTZzM3FlNGhzaUZiWUk4OU12SFZJNVRXV0E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDb21tU2NvcGUgUHVibGljIFRydXN0IEVDQyBSb290LTAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNIVENDQWFPZ0F3SUJBZ0lVUTNDQ2Q4OU5YVFR4eXE0eUx6ZjM5SDkxb0o0d0NnWUlLb1pJemowRUF3TXdUakVMTUFrR0ExVUUKQmhNQ1ZWTXhFakFRQmdOVkJBb01DVU52YlcxVFkyOXdaVEVyTUNrR0ExVUVBd3dpUTI5dGJWTmpiM0JsSUZCMVlteHBZeUJVY25WegpkQ0JGUTBNZ1VtOXZkQzB3TVRBZUZ3MHlNVEEwTWpneE56TTFORE5hRncwME5qQTBNamd4TnpNMU5ESmFNRTR4Q3pBSkJnTlZCQVlUCkFsVlRNUkl3RUFZRFZRUUtEQWxEYjIxdFUyTnZjR1V4S3pBcEJnTlZCQU1NSWtOdmJXMVRZMjl3WlNCUWRXSnNhV01nVkhKMWMzUWcKUlVORElGSnZiM1F0TURFd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVJMTnVtdVYxNm9jTmZRajNSaWQ4TmVlcXJsdHFMeAplUDBDZmxmZGtYbWNiTGxTaUZTOEx3Uyt1TTMyRU5FcDdMWFFvTVB3aVhBWnUxRmx4VU9jdzV0am5TQ0RQZ1lMcGtKRWhSR25Tam90CjZkWm9MMGhPVXlzSFAwMjl1YXgzT1ZlalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEcKQTFVZERnUVdCQlNPQjJMQVVOM0dHUVlBUm5RRTkvT3VmWFZOTURBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpFQW5EUGZRZU1qcUVJMgpKcGMxWEh2cjIwdjRxb3R6VlJWY3JIZ3BEN29oMk1TZzJORUQzVzNST1QzRWsyRFM0M0t5QWpCOHhYNkkwMUQxSGlYbytrNTE1bGlXCnBEVmZHMlhxWVpwd0k3VU5vNXVTVW05cG9JeU5TdER1aXc3TFI0N1FqUkU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0hEQ0NBYU9nQXdJQkFnSVVLUDJaWUVGSHBnRTZ5aFI3SCsvNWFBaURYWDB3Q2dZSUtvWkl6ajBFQXdNd1RqRUxNQWtHQTFVRQpCaE1DVlZNeEVqQVFCZ05WQkFvTUNVTnZiVzFUWTI5d1pURXJNQ2tHQTFVRUF3d2lRMjl0YlZOamIzQmxJRkIxWW14cFl5QlVjblZ6CmRDQkZRME1nVW05dmRDMHdNakFlRncweU1UQTBNamd4TnpRME5UUmFGdzAwTmpBME1qZ3hOelEwTlROYU1FNHhDekFKQmdOVkJBWVQKQWxWVE1SSXdFQVlEVlFRS0RBbERiMjF0VTJOdmNHVXhLekFwQmdOVkJBTU1Ja052YlcxVFkyOXdaU0JRZFdKc2FXTWdWSEoxYzNRZwpSVU5ESUZKdmIzUXRNREl3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUjRNSUhvWXg3bDYzRlJEL2NIQjhvNW1YeE8xUS9NCk1EQUxqMmFUUHMrOXhZYTkrYkczdEQ2MEI4anpsakh6N2FSUCtLTk9qU2tWV0xqVmIzL3ViQ0sxc0s5SVJRcTlxRW1VdjRSRHNOdUUKU2dNakdXZHFiOEZ1dkFZNU45R0lJdmVqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwRwpBMVVkRGdRV0JCVG1HSFgvNzJEZWhLVDFSc2ZlU2xYak1qWjU5VEFLQmdncWhrak9QUVFEQXdObkFEQmtBakFtYzBsNnRxdm1TZlI5ClVqL1VRUVN1Z0VPRFpYVzVoWUE0TzladjVKT0dxNC9uaWNoL20zNXJDaEpWWWFvUjRIa0NNSGZvTVhHc1BIRUQxb1FtSGhTNDh6czcKM3UxWi9HdE1NSDlaemtYcGMyQVZta3p3NWw0bEloVnR3b2RaMExLT2FnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYkRDQ0ExU2dBd0lCQWdJVVBnTkpnWFVXZERHT1RLdlZ4WkFwbHNVNUVOMHdEUVlKS29aSWh2Y05BUUVMQlFBd1RqRUxNQWtHCkExVUVCaE1DVlZNeEVqQVFCZ05WQkFvTUNVTnZiVzFUWTI5d1pURXJNQ2tHQTFVRUF3d2lRMjl0YlZOamIzQmxJRkIxWW14cFl5QlUKY25WemRDQlNVMEVnVW05dmRDMHdNVEFlRncweU1UQTBNamd4TmpRMU5UUmFGdzAwTmpBME1qZ3hOalExTlROYU1FNHhDekFKQmdOVgpCQVlUQWxWVE1SSXdFQVlEVlFRS0RBbERiMjF0VTJOdmNHVXhLekFwQmdOVkJBTU1Ja052YlcxVFkyOXdaU0JRZFdKc2FXTWdWSEoxCmMzUWdVbE5CSUZKdmIzUXRNREV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3dTR1dqRFIxQzQ1RnQKbllTa1laWVN3dTNEMmlNMEdYYjI2djFWV3ZaVkFWTVA4c3lNbDArNVVNdXpBVVJXbHYyYktPeDdkQXZuUW10VnpzbGhzdWl0UUR5Ngp1VUVLQlU4YkpvV1BRN1ZBdFlYUjFISGNnMEh6OWtYSGdLS0VVSmRHenFBTXhHQldCQjBIVzBhbERySkxwQTZsZk83NDFHSUR1Wk5xCmloUzRjUGd1Z2tZNEl3NTB4MnRCdDlBcG81MkFzSDUzazJOQyt6U0RPM09qV2lFMjYwZjZHQmZadW1iQ2s2U1AvRjJrcmZ4UWFwV3MKdkNRejBiMklmNGIxOWJKektvOThyd2p5R3BnL3FZRmxQOEdNaWNXV01Kb0t6L1RVeURUdG5TKzhqVGlHVSs2WG42bXlZNVFYalEvYwpaaXA4VWxGMXk1bU82RDFjdjU0N0tJMkRBZytwbjNMaUxDdXozR2FYQUVEUXBGU09tMTE3UlRZbTFuSkQ2OC9BNmczY3poTG1mVGlmCkJTZW9sejdwVWNac0JTakJBZy9wR0czc3Zad0cxS2RKOUZRRmEyd3c4ZXNEMWVvOWFuYkN5eG9vU1UxL1pPRDZLOXB6ZzRIL2tRTzkKbEx2a3VJNmNNbVBObjd0b2diR0VXNjgydjNmdUhYLzNTWnRTN05KM1duMlJuVTNDT1Mza3VvTDRiL0pPSGc5TzVqOVpwU1BjUFllbwpLRmdvMGZFYk50dFB4UC9oakZ0eWpNY21BeWVqT1FvQnFzQ3lNV0NESXFGUEVna0JFYTgwMU0vWHJtTFRCUWUwTVhYZ0RXMVhUMm1ICitWZXB1aFgyeUZKdG9jdWNIK1g4ZUtnMW1wOUJGTTZsdE02VUNCd0pyVmJsMnJaSm1rcnFZeGhUbkN3dXd3SURBUUFCbzBJd1FEQVAKQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVOMTJtbW5ReXdzTDV4NllWRUZtNAo1UDNsdUcwd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFLK256OTcvNEwxQ2pVM2xJcGJmYU9wOVRTcDkwSzA5Rmx4RDUzM0FodWg2Ck5XUHh6SUhJeGd2b0xsSTFwS1pKa0dOUnJEU3NCVHRYQU9uVFl0UFpLZFZVdmh3UWtaeXliZjVaL1huMzZsYlFubWhVUW84bVV1Sk0KM3krWHBpL1NCNWlvODJCZFM1cFlWNGp2Z3VYNnIyeUJTNUtQUUpxVFJsbkxYM2dXc1djK1FndmZLTm13clpnZ3ZrTjgwVjRhQ1JjawpqWHRkbGVtcndXQ3JXeGhrZ1B1dDRBWjlIY3BadVBONEtXZkdWaDJ2dHJWMEtuYWhQL3QxTUorVVhqdWxZUFBMWEF6aURzbGcrTWtmCkZvb20zZWNuZitzbHBvcTl1QzAyRUpxeFdFMmFhRTlnVk9YMlJoT09pS3k4SVVJU3JjWktpWDJid2RndDZaWUQ5S0owREx3QUhiL1cKTnlWbnRIS0xyNFc5NmlvRGo4ejdQRVFrZ3VJQnBRdFp0alNOTWdzU0Rlc253djFCMTBBOGNrWXB3SXpxdWcveEJwTXU5NXlvOUdBKwpvL0U0WG80VHdiTTZsNGMva3NwNHFSeXYwTEFiSmg2K2NPeDY5VE9ZNmx6L0t3c0VUa1BkWTM0T3AwNTRBNVUrMUMwd2xSRVFLQzYvCm9BSSsvMTVaMHdVT2xWOVRSZTlyaDlWSXpSYW1sb1BoMzdNRzg4RVUyNmZzSEl0ZGtKQU5jbEhuWWZrVXlxK0RqNyt2c1FwWlhkeGMKMStTV3JWdGdIZHF1bDdJNTJRYjFkZ0FUK0doTUliQTF4TnhWc3NuQlFWb2NpY0NNYjNTZ2F6Tk50UUVvL2EydGlSYzdwcHFFdk91TQo2c1J4SktpNktma0lzaWRXTlRKZjZqbjdNWnJWR2N6dwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDb21tU2NvcGUgUHVibGljIFRydXN0IFJTQSBSb290LTAyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZiRENDQTFTZ0F3SUJBZ0lVVkJhL08zNDVsWEdOMGFvQXBZWU5LNDk2QlU0d0RRWUpLb1pJaHZjTkFRRUxCUUF3VGpFTE1Ba0cKQTFVRUJoTUNWVk14RWpBUUJnTlZCQW9NQ1VOdmJXMVRZMjl3WlRFck1Da0dBMVVFQXd3aVEyOXRiVk5qYjNCbElGQjFZbXhwWXlCVQpjblZ6ZENCU1UwRWdVbTl2ZEMwd01qQWVGdzB5TVRBME1qZ3hOekUyTkROYUZ3MDBOakEwTWpneE56RTJOREphTUU0eEN6QUpCZ05WCkJBWVRBbFZUTVJJd0VBWURWUVFLREFsRGIyMXRVMk52Y0dVeEt6QXBCZ05WQkFNTUlrTnZiVzFUWTI5d1pTQlFkV0pzYVdNZ1ZISjEKYzNRZ1VsTkJJRkp2YjNRdE1ESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFEaCtnNzdhQUFTeUUzVgpyQ0xFTlFFN3hWVGxXWFpqcFgvcndjUnFtTDB5alJlQTYxMjYwV0k5SlNNWk5SVHBmNG1uRzJJODFsRG5OSlVETXJHMGt5STlwK0t4CjdlWjdUaTZIbXcwemRRcmVxalhuZnVVMm1LS3VKWjZWc3pLV3BDdFlIdTgvL21JMFNGSFJ0STFDcldEYVNXcVZjTjNTQU9MTVYyTUMKZTViZFNaZGJrazZWMC9uTEtSOFlTdmdCS3RKakNXNGs2WW5TNWNjaVROeHpoa2NBcWcySWpxNkZmVXJwdXpOUERsSnduWlhqZkcyVwpXeTA5WDZHRFJsMjI0eVc0ZktjWmdCenFaVVBja1hrMkxIUjg4bWNHeVluSjI3L2FhTDhqN2R4cnJTaURlUy9zT0tVTk53Rm5KNXJwCk05a3pYemVoeGZDclBmcDRzT2Nzbi9ZK24yRGc3MGpwa0VVZUJWRjRHaXdTTEZ3b3JBMmlJNTQwandYbW9qUE9FWGNUMUE2a0hrSWYKaHMxdy90a3VGVDBkdTdqeVUxZmJ6TVowS1p3WXN6WjFPQzRQVktINGtoK0psays3MU82ZDZUczJRclVLT3lyVVpIazJFT0g1a1FNcgpleUJVelEwWkdzaEJNalRSc0puaGtCNEJRRGExdC9xcDVYZDFwQ0tCWGJDTDVDY1NEMVNJeHR1RmRPYTN3TmVtS2ZyYjN2T1RseWNFClZTOEtiemZGUFJPdkNnQ3BMSXNjZ1NqWDc0WXhxYTd5YnJqS2FpeFVSOWdxaUM2dndRY1FlS3dSb2k5QzhEZkY4cmhXM1E1aUxjNHQKVm41VjhxZEU5aXN5OUNPb1IralVLZ0Y0ejJyRE42aWVaZElzNWZxNk04RUdSUGJtejZVTnAyWUlOSW9zOHdJREFRQUJvMEl3UURBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVVI5RG5zU0wvblN6MTJWZGdzN0d4CmNKWHZZWG93RFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUlacHNVMHY2WjlQSXBOb2p1UWhtYVBPUlZNYmMwUlRBSUZoelRIakNMcUIKS0NoNmtybTJxTWhEbnNjVEprM0MyT1ZWbkpKZFVOakNLOXYrNXFpWHoxSTZKTU5sWkZ4SE1hTmxOUlBEazduMytWR1h1NlR3WW9mRgoxZ2JUbDRNZ3FYNjd0aUhDcFEyRUFPSHlKeENEdXQwRGdkWGRhTU5tRU1qUmRyU3pieW1lQVBuQ0tmV3hreGxTYVJvc1RLQ0w0QldhCk1TL1RpSlZaYnVYRXMxRElGQWhLbTRzVGc3R2tjckk3ZGpOQjNOeXFwZ2R2SFNRU244aDJ2Uy9aanZRczdyZlNPQkFrTmxFdjQxeGQKZ1NHbjJydE8vK1lIcVA2NURTZHN1M0JhVlhvVDZmRXFTV25IWDRkWFRFTjViVHBsNlRCY1FlN3JkNlZ6RW9qb3YzMnU1Y1NvSHcyTwpIRzFRQWs4bUdFUGVqMVdGc1FzM0JXREpWVGtTQktFcXozRVduelpSU2I5d081NW5uUHQ3ZWNrNUhIaXNkNUZVbXJoMUNvRlNsK05tCllXdnRQamdlbG1GVjRaRlVqTzJNSkIrQnlSQ2FjNWtyRms1eUFEOVVHL2lOdW92bkZOYTJSVTlnN0phdXd5OENUbDJkbGtseUFMS3IKZFZ3UGFGc2RaY0pmTXc4ZUQvQTdodld3VHJ1Yzkrb2xCZHl0b3B0TEZ3RytRdDgxSVIydHE2NzB2NjRmRzlQaU8veXpjbk1jbXlpUQppUk05SGNFQVJ3bVdtamdiM2JIUERjSzBSUE9XbGM0eU9vODBuT0FYeDE3T3JnM2JoempsUDF2OW14bmhNVUY2Y0tvamF3SGhSVXpOCmxNNDduaTNuaUFJaTlHN295T3pXUFBPNXN0ZDNlcXg3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRlbGVrb20gU2VjdXJpdHkgVExTIEVDQyBSb290IDIwMjAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1FqQ0NBY21nQXdJQkFnSVFOanFXak1sY3Nsak4wQUZkeGVWWEFEQUtCZ2dxaGtqT1BRUURBekJqTVFzd0NRWURWUVFHRXdKRQpSVEVuTUNVR0ExVUVDZ3dlUkdWMWRITmphR1VnVkdWc1pXdHZiU0JUWldOMWNtbDBlU0JIYldKSU1Tc3dLUVlEVlFRRERDSlVaV3hsCmEyOXRJRk5sWTNWeWFYUjVJRlJNVXlCRlEwTWdVbTl2ZENBeU1ESXdNQjRYRFRJd01EZ3lOVEEzTkRneU1Gb1hEVFExTURneU5USXoKTlRrMU9Wb3dZekVMTUFrR0ExVUVCaE1DUkVVeEp6QWxCZ05WQkFvTUhrUmxkWFJ6WTJobElGUmxiR1ZyYjIwZ1UyVmpkWEpwZEhrZwpSMjFpU0RFck1Da0dBMVVFQXd3aVZHVnNaV3R2YlNCVFpXTjFjbWwwZVNCVVRGTWdSVU5ESUZKdmIzUWdNakF5TURCMk1CQUdCeXFHClNNNDlBZ0VHQlN1QkJBQWlBMklBQk02Ly9sZW92OVdxOXhDYXpielJFYUs5WjBMTWtPc1ZHSkRab3MwTUtpWHJQay9PdGRLUEQvTTEKMmtPTEFvQytiMUVrSFE5cks4cWZ3bTlRTXVVM0lMWWcvNGdORDIxSnU5c0dwSWVRa3BUMENkRFBmOGlBQzhHWHM3czFKOG5DRzZOQwpNRUF3SFFZRFZSME9CQllFRk9OeXpHNlZtVWV4NXJOaFROSExxK082emQ2Zk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQCkFRSC9CQVFEQWdFR01Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01IVlNpN2VrRUUrdVNoQ0xzb1JiUXVIbUtqWUMycUJ1R1Q4bHY5cFoKTW83ays1RGNrMlRPcmJSQlIyRGl6NmZMSGdJd04wR01adDlCYTlhREFFSDlMMXIzVUxSbjBTeW9jZGREeXB3bkpKR0RTQTNQemZkVQpnYS9zZitSbjI3aVE3dDBsCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRlbGVrb20gU2VjdXJpdHkgVExTIFJTQSBSb290IDIwMjMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnN6Q0NBNXVnQXdJQkFnSVFJWnhVTGVqMjdIRjMrazdvdzNCWGx6QU5CZ2txaGtpRzl3MEJBUXdGQURCak1Rc3dDUVlEVlFRRwpFd0pFUlRFbk1DVUdBMVVFQ2d3ZVJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCVFpXTjFjbWwwZVNCSGJXSklNU3N3S1FZRFZRUUREQ0pVClpXeGxhMjl0SUZObFkzVnlhWFI1SUZSTVV5QlNVMEVnVW05dmRDQXlNREl6TUI0WERUSXpNRE15T0RFeU1UWTBOVm9YRFRRNE1ETXkKTnpJek5UazFPVm93WXpFTE1Ba0dBMVVFQmhNQ1JFVXhKekFsQmdOVkJBb01Ia1JsZFhSelkyaGxJRlJsYkdWcmIyMGdVMlZqZFhKcApkSGtnUjIxaVNERXJNQ2tHQTFVRUF3d2lWR1ZzWld0dmJTQlRaV04xY21sMGVTQlVURk1nVWxOQklGSnZiM1FnTWpBeU16Q0NBaUl3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFPMDFvWUdBODh0S2FWdkMrMUdEcmliOTRXN3pnUko5Y1VEL2gzVkMKS1NIdGdWSXMzeExCR1lTSndiM0ZLTlhWUzJ4RTFremJCNVpLVlhyS05vSUVOcWlsL0NmMlNmSFZjcDZSK1NQV2NIdTc5WnZCN0pQUApHZXBsZm9od29IUDg5disxVm1MaGMybzBtRDZDdUt5VlUvUUJvQ2NIY3FNQVU2RGtzcXVET0ZjekpaU2Z2a2dkbU9HanVwNWN6UVJ4ClVYMTFlS3Z6V2FyRTRHQytqNE5TdUhVYVFUWHR2UE02WSttcEZFWFg1bExSYnRMZXZPUDFDenZtNE1TOVEyUVRwczcwbURkc2lwV28KbDhoSEQvQmVFSXZuSFJ6K3NUdWdCVE5vQlVHQ3dRTXJBY2puajAycjZMWDJ6V3RFdGVmZGkrenFKYlFBSWxkTnNMR3lNY0VXenYvOQpGSVMzUi9xeThYRGUyNHRzTmxpa2ZMTVIwY04zZjErMkplQU54ZEt6K2JpNGQ5czNjWEZINDJBWVR5UzJkVGQ0dWFOaXI3M0pjbzR2CnpMdXUyK1FWVWhrSE0vdHF0eTFMa0NpQ2MvNFlpeldOMjZjRWFyN3F3VTAyT3hZMmtUTHZ0a0NKa1VQZzhxS3JCQzdtOGt3T0ZqUWcKcklmQkxYN0paa2NYRkJHazgvZWhKSW1yMkJySW9WeXhvL2VNYmNnQnlVL0o3TVQ4ckZFejBjaUQwY21mSGRSSE5Dayt5N0FPK29NTApLRmpsS2R3L2ZLaWZ5YllLdTZib1JoWVBsdVY3NUdwNlNHMTJtQVdsM0cwZVFoNUMyaHJnVXZlMWc4QWFlM2cxTERqMUgvMUpveTdTCldXTy9nTENNazNQTE5hYVpsU0poWlFOZyt5K1RTL3FhbklBN0FnTUJBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlYKSFE0RUZnUVV0cWVYZ2oxMGhadjNQSitUbXBWNWRWS01iVWN3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFmQmdOVkhTTUVHREFXZ0JTMgpwNWVDUFhTRm0vYzhuNU9hbFhsMVVveHRSekFOQmdrcWhraUc5dzBCQVF3RkFBT0NBZ0VBcU14aHByNTFuaFZRcEd2N3FIQkZmTHArCnNWcjhXeVA2Q25mNG1IR0NERzNnWGthcWsvUWVvTVBoazl0THJiS21YYXV3MUdMTFhydG05UzN1bDBBOFl1dGUxaFRXak9LV2kwRnAKa3pYbXVabHJZclNoRjJZMHBtdGp4cmxPOGlMcFdBMVdRZEg2REVyd004MDd1MjBoT3E2T2NyWERTdnZwZmVXeG00YnU0dUI5dFBjeQovU0tFOFlYSk4zbnB0VCsvWE9SMHNvOFJZZ0RkR0dhaDJYc2pYL0dPMVdmb1ZOcGJPbXMyYi9tQnNUTkhNM2RBK1ZLcTNkU0R6NFY0Cm1acVR1WE5uUWtZUkllcitDcWtiR21WcHM0K3VGcmIyUzFheUxmbWx5T3c3WXFQdGE5Qk8xVUFKcEIrWTF6cWxrbGtnNUxCOXpWdHoKYUwxdHhLSVREbWNadUkxQ2Ztd01tbTZnSkMzVlJSdmN4QUlVL29WYlpaZktUcEJRQ0hwQ05mbnF3bWJVK0FHdUhyUyt3Nmp2L25hYQpvcVlmUnZhRTdmemJ6c1FDem5kSUxJeXk3TU1Bbyt3c1ZSakJmaG51NFMveXJZT2JucXNaMzhhS0w0eDM1YmNGN0R2QjdMNkdzNGE4CndQZmM1K3BicnJMTXRUV0dTOURpUDdiWStBNEE3bDNqOTQxWS84K0xOK2xqWDI3M0NYRTJ3aEpkVi9MSXRNM3o3Z0xmRWR4cXVWZUUKSFZsTmpNN0lEaVBDdHlhYUVCUngvcE95aXJpQThBNFFudE9vVUF3M2dpL3E0SXFkNFN3NS83VzBjd0RrOTBpbWM2eS9zdDUzQkllMApvODJiTlNRMytwQ1RFNEZDeHBnbWRUZG1RUkNzdS9XVTQ4SXhLNjNuSTFiTU5TV1NzMUE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkZJUk1BUFJPRkVTSU9OQUwgQ0EgUk9PVC1BIFdFQgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNlakNDQWdDZ0F3SUJBZ0lRTVpjaDdhK0pRbjgxUVllaFoxWk1iVEFLQmdncWhrak9QUVFEQXpCdU1Rc3dDUVlEVlFRR0V3SkYKVXpFY01Cb0dBMVVFQ2d3VFJtbHliV0Z3Y205bVpYTnBiMjVoYkNCVFFURVlNQllHQTFVRVlRd1BWa0ZVUlZNdFFUWXlOak0wTURZNApNU2N3SlFZRFZRUUREQjVHU1ZKTlFWQlNUMFpGVTBsUFRrRk1JRU5CSUZKUFQxUXRRU0JYUlVJd0hoY05Nakl3TkRBMk1Ea3dNVE0yCldoY05ORGN3TXpNeE1Ea3dNVE0yV2pCdU1Rc3dDUVlEVlFRR0V3SkZVekVjTUJvR0ExVUVDZ3dUUm1seWJXRndjbTltWlhOcGIyNWgKYkNCVFFURVlNQllHQTFVRVlRd1BWa0ZVUlZNdFFUWXlOak0wTURZNE1TY3dKUVlEVlFRRERCNUdTVkpOUVZCU1QwWkZVMGxQVGtGTQpJRU5CSUZKUFQxUXRRU0JYUlVJd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVJIVStvc0VhUjN4eXJxODlaZmU5TUVrVno2CmlNWWl1WU1RWW5lRU15M3BBNGpVNERQMzdYY3NTbURxNUcrdGJiVDRUSXFrNUIvSzZrODRTaTZDY3l2SFpwc0tqRUNjZklyMjhqbGcKc3Q3TDdMamtiK3FiWGJkVGtCZ3lWY1VndDVTall6QmhNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVaytGRApZMXc4bmRZbjgxTHNGN0twcnl6M2R2Z3dIUVlEVlIwT0JCWUVGSlBoUTJOY1BKM1dKL05TN0JleXFhOHM5M2I0TUE0R0ExVWREd0VCCi93UUVBd0lCQmpBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpBZGZLUjd3NGwxTStFN3FVVy9SdW5wb2QzSkloYTNSeEVMMkpxNjhjZ0wKY0ZCVEFwRndoVm1wSHFUbTZpTXhvQUFDTVFEOTR2aXpyeGE1SG5QRWx1UEJNQm5ZZnViRGw5NGNUN2lKTHpQclNBOFo5NGRHWFNhUQpwWVhGdVhxVVBvZW92UUE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRXQ0EgQ1lCRVIgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZqVENDQTNXZ0F3SUJBZ0lRUUFFMGpNSUFBQUFBQUFBQUFUenl4akFOQmdrcWhraUc5dzBCQVF3RkFEQlFNUXN3Q1FZRFZRUUcKRXdKVVZ6RVNNQkFHQTFVRUNoTUpWRUZKVjBGT0xVTkJNUkF3RGdZRFZRUUxFd2RTYjI5MElFTkJNUnN3R1FZRFZRUURFeEpVVjBOQgpJRU5aUWtWU0lGSnZiM1FnUTBFd0hoY05Nakl4TVRJeU1EWTFOREk1V2hjTk5EY3hNVEl5TVRVMU9UVTVXakJRTVFzd0NRWURWUVFHCkV3SlVWekVTTUJBR0ExVUVDaE1KVkVGSlYwRk9MVU5CTVJBd0RnWURWUVFMRXdkU2IyOTBJRU5CTVJzd0dRWURWUVFERXhKVVYwTkIKSUVOWlFrVlNJRkp2YjNRZ1EwRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFERytNb2UyUWtnZmgxcwpUczZQNDBjelJKekh5V21xT2x0NDduRFNrdmdFczFKU0hXZHlLS0hmaTEyVkN2N3F6ZTMzS2M3d2IzK3N6VDN2c3h4RmF2Y29rUEZoClY4VU14S05RWGQ3VXRjc1p5b0M1ZGM0cHp0S0ZJdXdDWTh4RU1DRGE2cEZiVnVZZEhOV2Rac2MvMzRiS1MxUEUyWTJ5SGVyNDNDZFQKbzBmaFljeDl0YkQ0N25PUnhjNXpiODd1RUI4YUJzL3BKMkRGVHhuazY4NGlKa1hYWUpuZHprODM0SC9uWTYyd3VGbTQwQVpvTldEVApOcTV4UXdUeGFXVjRmUE1mODhvb24xb2dsV2EwemJmdWozaWtSUmpwSmkrTm15a29zYVMzT20yNTFCdzRja1ZZc1Y3cjhDaWJ0NExLCi9jL1dNdytmKzVlZXNSeWNudXBmWHR1cTNWVHBNQ0VvYlk1NTgzV1NqQ2IrM01YMnc3RGZSRmxEbzdZREtQWUlNS29OTStIdm5La0gKSXVOWlcwQ1Ayb2kzYVFpb3R5TXVSQWxaTjF2SDR4ZnlJdXR1T1ZMRjNsU25tTWxMSUpYY1JvbGZ0Qkw1aFNtTzY4Z25GU0RBUzlUTQpmQXhzTkF3bW15WXhwanluOXRuUVM2SmsvenVaUVhMQjRIQ1g4U1M3SzhSMElyR3NheUl5Sk5ONEtzREFvUy94VWdYSlArOTJadUpGCjJBMDlyWlhJeDRrbXlBK3Vwd011KzhGZitpRGhjSzJ3WlNBM00yQ3cxYS9YREJ6Q2tIRFhTaGk4ZmdHd3NPc1ZIa1FHemFSUDZBelIKd3lBUTRWUmxuclpSMEJwMmEwSmFXSFkwNnJjM0dhNHVkZm1XNWNGWjk1UlhLU1dOT2t5clRacEIwRjhtQXdJREFRQUJvMk13WVRBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZkJnTlZIU01FR0RBV2dCU2RoV0VVZk1GaWI1ZG81RTgzClFPR3Q0QTFXTnpBZEJnTlZIUTRFRmdRVW5ZVmhGSHpCWW0rWGFPUlBOMERocmVBTlZqY3dEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUIKQUdTUGVzUmlEcldJekxqSGhnNmhTaGJOY0F1M3A0VUxzM2EyRDZmL0NJc0xKYytvMUlOMUtyaVdpTGI3M3kwdHRHbFRJVFZYMW9sTgpjNzlwajNDalljeWEyeDZhNENENGJMdWJJcDFkaERHYUxJcmRhcUhYS0duSy9uWlZla1puNjh4RGlCYWlBOWE1Ri9nWmJHMGpBbi94Clg5QUtLU003MGFvSzdha1hKbFFLVGNLbFRmakYvYmlCenlzc2VLTm5US2tIbXZQZlh2dDg5WW5OZEpkaEVHb0hLNEZhMG82MzV5RFIKSUc0a3FJUW5vVmVzcWxWWUw5elp5dnBvQko3dFJDVDVkRUE3SXpPcmcxb1lKa0syYlZTMUZtQXdiTEdnK0xoQm9GMUpTZEpsQlRycQovcDFodkliWnY5N1R1anF4ZjM2U05JN0pBRzdjbUwzYzdJQUZyUUk5MzJYdEN3UDM5eGFFQkRHNms1VFk4aEw0aXVPL1FxK24xTTBSCkZ4YklRaDBVcUVMMjBrQ0dvRThqeXBaRlZtQUd6YmRWQWFZQmxHWCtiZ1VKdXJTa3F1THZXTDY5SjFiWTczTnhXMFF6OHBweTZyQmUKUG02cFVsdnNjRzIxaDQ4M1hqeU1uTTdrOE00TVowSE16dmFBcTA3TVRGYjF3V0ZaazdRK3B0cTROeEtmS2pMamk3Z2g3TU1yWlF6dgpJdDZJS1R0TTEvcit0K0ZIdnB3K1BvUDdVVjMxYVBjdUlZWGN2L0ZhNG56WHhlU0R3V3JydW9CYTNsd3RjSGI0eU9XSGg4cWduYUhsCkloSW5EMFE5SFd6cTFNS0xMMjk1cTM5UXBzUVpwNkY2dDViNXdSOWlXcUpEQjBCZUpzYXM3YTV3RnNXcXluS0tUYkRQQVlzRFAyN1gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJlU2lnbiBSb290IENBMTIKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURjakNDQWxxZ0F3SUJBZ0lVWnZuSHdhL3N3bEcwN1ZPWDV1YUN3eXNja0JZd0RRWUpLb1pJaHZjTkFRRUxCUUF3VVRFTE1Ba0cKQTFVRUJoTUNTbEF4SXpBaEJnTlZCQW9UR2tONVltVnlkSEoxYzNRZ1NtRndZVzRnUTI4dUxDQk1kR1F1TVIwd0d3WURWUVFERXhSVApaV04xY21WVGFXZHVJRkp2YjNRZ1EwRXhNakFlRncweU1EQTBNRGd3TlRNMk5EWmFGdzAwTURBME1EZ3dOVE0yTkRaYU1GRXhDekFKCkJnTlZCQVlUQWtwUU1TTXdJUVlEVlFRS0V4cERlV0psY25SeWRYTjBJRXBoY0dGdUlFTnZMaXdnVEhSa0xqRWRNQnNHQTFVRUF4TVUKVTJWamRYSmxVMmxuYmlCU2IyOTBJRU5CTVRJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM2T2NFMwplbWhGS3hTMDYrUVQ2MWQxSTAyUEpDMFc2SzZPeVgya1Z6c3FkaVV6ZzJ6cU1vcVVtMDQ4bHVUOVViK1p5Wk4rdi9tdHA3SklLd2NjCkovVk12SEFTZDZTRlZMWDlrSHJrbytSUldBUE5FSGw1N211VEgyU09hMlNyb3hQamNmNTlxNXpkSjFNM3M2b1l3bGttN0ZzZjB1WmwKZk8rVHZkaFlYQXZBNDJWdlBNZktXZVArYmwrc2c3NzlYU1ZPS2lrNzFndXJGeko0cE9FK2xFYStZbTZiM2thb3NSYm5oVzcwQ0VCRgpFYUNlVkVTRTk5ZzJ6dlZRUjl3c01KdnV3UFdXMHY0SmhzY0dXYTVQcm80Um1IdnpDMUtxWWlhcUlkK09KVE41bHhaSmpmVSsxVWVmCk56RkpNM0lGVFF5MlZZenhWNCtLaDlHdHhSRVNPYUN0QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFAKQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSWE5QTjB6d1JMMVNYbThVQzJMRXpaTGVtZ3JUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQwpBUUVBUHJ2YkZ4YlM4aFFCSUN3NGcwdXR2c3FGZXBxMm0ydW00ZnlsT3F5dHRDZzZyOWNCZzBrclk2TGRtbVFPbUZ4djNZNjdpbFFpCkxVb1Q4NjVBUTl0UGtiZUdHdXdBdEVHQnBFLzZhb3VJczNZSWNpcEpRTVBUdzRXSm1CQ2xuVzhadDd2UGVtVlYyemZyUElweU1wY2UKbWlrK3JZM21veHR0OVhVYTVyQm91VnVpN21sSEp6V2hocG1BOHpOTDRXdWtKc1B2ZEZsc2VxSmt0aDVFdzFEZ0R6azlxVFB4cGZQUwp2V0tFckk0Y3FjMWF2VGM3YmdvaXRQUVY1NUZZeFRwRTA1VW8yY0JsNlhMSzBBKzlIN01WMmFuanBFY0pudURMTi92OXZaZlZ2aGdhCmFhSTVnZGthOWF0L3lPUGlad3VkOUF6cVZOL1NzcSt4SXZFZzM3eEVIQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyZVNpZ24gUm9vdCBDQTE0Cj09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGY2pDQ0ExcWdBd0lCQWdJVVpOdGFEQ0JPNk5jcGQ4aFFKNkphSjkwdDhzc3dEUVlKS29aSWh2Y05BUUVNQlFBd1VURUxNQWtHCkExVUVCaE1DU2xBeEl6QWhCZ05WQkFvVEdrTjVZbVZ5ZEhKMWMzUWdTbUZ3WVc0Z1EyOHVMQ0JNZEdRdU1SMHdHd1lEVlFRREV4UlQKWldOMWNtVlRhV2R1SUZKdmIzUWdRMEV4TkRBZUZ3MHlNREEwTURnd056QTJNVGxhRncwME5UQTBNRGd3TnpBMk1UbGFNRkV4Q3pBSgpCZ05WQkFZVEFrcFFNU013SVFZRFZRUUtFeHBEZVdKbGNuUnlkWE4wSUVwaGNHRnVJRU52TGl3Z1RIUmtMakVkTUJzR0ExVUVBeE1VClUyVmpkWEpsVTJsbmJpQlNiMjkwSUVOQk1UUXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFERjBucWgKMW9xL0ZqSFFtTkU2bFB4YXVHNGl3V0wzcHdvbjcxRDJMckdlYUJMd2JDUmpPZkh3M3hERzNyZFNJTlZTVzBLWm52T2d2bElmWDh4bgpiYWN1VUtMQmw0MjIrSlgxc0xyY25lQyt5OS8zT1BKSDlhYWFrcFVxWWxsUUM2S3hOZWRsc21HeTZwSnhhZVFwOEUrQmdRUThzcVZiCjFNV29XV2Q3VlJ4SnEzcWR3dWR6VGUvTkNjTEVWeExiQVE0amVRa0hPNkxvL0lyUGo4QkdKSnc0SitDRG5SdWd2M2dWRU91R1RncGEKL2QvYUxJSis3c3IyS2VINmNhSDNpR2ljblBDTnZnOUprZGpxT3ZuOTBHaHgyK20xSzA2Q2ttOW1IK0R3M0V6c3l0SHF1blFHK2JPRQprSlRSWDQ1ekdSQmRBdVZ3cGNBUTBCQjhiOFZZU2JTd2JwcmFmWlgxek5vQ3I3Z3NmWG1QdmtQeCtTZ29qUWxEK0FqZGE4aUxMQ1N4CmpWSUh2WGlieThwb3NxVGRERXg1WU1hWjBaUHhNQm9IMDY0aXd1ck84WVFKek9BVWJuOC9mdEtDaGF6Y3FSWk9oYUJneS9hYzE4aXoKanUzR201aDFEVlhvWCtXVml3S2tya01wS0JHazVoSXdBVXQxYXg1bW5Ya3ZwWFl2SFVDMGJjbDllUWpzMFdxMlhTcXlwV2E5YTRYMApkRmJEOWVkMVVpZ3NwZjltUjZYVS92NmVWTDlsZmdIV01JK2xOcHlpVUJ6dU9JQUJTTWJIZFBUR3JNTkFTUlpoZEN5dmpHODE3WHNZCkFGczJQSnhRRGNxU014RHhKa2x0MzNVa040SWkxK2lXL1JWTEFwWStCM0tWZnFzOVRDN1h5dkRmNEZnL0xTOEVtamlqQVFJREFRQUIKbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVUJwT2pDbDRvYVRlcQpZUjNyNi93dGJ5UGs4NkF3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUphQWNna0dmcHpNa3dRV3U2QTZqWkpPdHhFYUNuRnhFTTBFCnJYK2xSVkFRWms1S1FhSUQyUkZQZWplNVMrTEdqekptZFNYNzY4NC9BeWttamJnV0hmWWZNMjVJNXVqNFY3SWJlZDg3aHdyaVpMb0EKeW16dmZ0QWo2M2lQLzJTYk5EZWZOV1dpcEFBOUVpT1dXRjNLWTRmR293ZUlUZWRwZG9wVHpmRlA3RUx5aytPWnBEYzhoN2hpMi9EcwpIemMvTjE5RHpGR2R0ZkNYd3JlRmFtZ0xSQjdsVWU2VHprdHVoc0hTRENSWk5ocWZMSkdQNHhqYmxKVUs3WkdxRHBuY2xsUGpZWVBHCkZyb2p1dHpkZmhyR2UwSzIyVm9GM0pwZjFkKzQya2Q5MmpqYnJEblZIbXRzS2hlTVljMnhiWElCdzhNZ0FHSm9GakhWZHFxR3V3NnEKbnNiNThObjREU0VDNU1Vb0Zsa1J1ZGxwY3lxU2VMaVNWNXNJOGpybEw1V3dXTGRySUJSdEZPOEt2SDdZVmRpSTJpLzZHYVg3aStCLwpPZlZ5SzRYRUxLenZHVVdTVExOaEI5eE5IMjdTZ1JOY212TVNaNFBQbXorTG41Mmt1YWlXQTNyRjdpRGVNOW92bmhwNmRCN2g3c3hhCk9nVGRzeG9FcUJSanJMZEhFb09hYlBYbTZSVVZrUnFFR1E2VVJPY1NqaVZiZ0djWjNHT1RFQXRsTG9yNkNacE8yb1lvZmFwaE5kZ08KcHlnYXUxTGdlUGhzdW15d2JybUhYdW1aTlRmeFBXUXJxYUEwazg5akw5V0IzNjVqSjZVZVRvM2NLWGhaK1BtaElJeW5Ka0J1Z25MTgplTExJanp3ZWMrZkJINy9QenFVcW05dEVaREtndTM5Y0pSTkl0WCtTCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyZVNpZ24gUm9vdCBDQTE1Cj09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSXpDQ0FhbWdBd0lCQWdJVUZoWEh3OWhKcDc1cERJcUk3ZkJ3K2QyM1BvY3dDZ1lJS29aSXpqMEVBd013VVRFTE1Ba0dBMVVFCkJoTUNTbEF4SXpBaEJnTlZCQW9UR2tONVltVnlkSEoxYzNRZ1NtRndZVzRnUTI4dUxDQk1kR1F1TVIwd0d3WURWUVFERXhSVFpXTjEKY21WVGFXZHVJRkp2YjNRZ1EwRXhOVEFlRncweU1EQTBNRGd3T0RNeU5UWmFGdzAwTlRBME1EZ3dPRE15TlRaYU1GRXhDekFKQmdOVgpCQVlUQWtwUU1TTXdJUVlEVlFRS0V4cERlV0psY25SeWRYTjBJRXBoY0dGdUlFTnZMaXdnVEhSa0xqRWRNQnNHQTFVRUF4TVVVMlZqCmRYSmxVMmxuYmlCU2IyOTBJRU5CTVRVd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFMVUhTTlpES1ptYlBTWUFpNElvNUcKZEN4NHdDdEVMVzFmSGNtdVMxSWdnejI0RkcxVGgyQ2VYMnlGMndZVWxlREhLUCtkWCtTcThiT0xiZTFQTDB2SlNwU1JaSFgrQWV6QgoyT3Q2bEhoV0dFTmZhNEhMOXJ6YXRBeTJLWk1JYVkralFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFECkFnRUdNQjBHQTFVZERnUVdCQlRyUWNpdS9OV2VVVWoxdll2MGh5Q1RRU3ZUOURBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpFQTJTNkoKZmw1T3BCRUh2Vm5DQjk2ck1qaFRLa1pFQmhkNnpsSHA0UDltTFFsTzRFLzBCZEdGOWpWZzNQVnlzMFo5QWpCRW1FWWFnb1VlWVdtSgpTd2RMWnJXZXFycWdIa0haQVhRNmJrVTZpWUFaZXpLWVZXT3I2Mk51azIyckd3bGdNVTQ9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkQtVFJVU1QgQlIgUm9vdCBDQSAyIDIwMjMKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnFUQ0NBNUdnQXdJQkFnSVFjenN3QkVoYjJVMTRMbk5MeWFIY1pqQU5CZ2txaGtpRzl3MEJBUTBGQURCSU1Rc3dDUVlEVlFRRwpFd0pFUlRFVk1CTUdBMVVFQ2hNTVJDMVVjblZ6ZENCSGJXSklNU0l3SUFZRFZRUURFeGxFTFZSU1ZWTlVJRUpTSUZKdmIzUWdRMEVnCk1pQXlNREl6TUI0WERUSXpNRFV3T1RBNE5UWXpNVm9YRFRNNE1EVXdPVEE0TlRZek1Gb3dTREVMTUFrR0ExVUVCaE1DUkVVeEZUQVQKQmdOVkJBb1RERVF0VkhKMWMzUWdSMjFpU0RFaU1DQUdBMVVFQXhNWlJDMVVVbFZUVkNCQ1VpQlNiMjkwSUVOQklESWdNakF5TXpDQwpBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUs3L0NWbVJnQXBLYU9Za1A3aW41TWc2Q2pvV3pja2pZYUNUCmNmS3JpM09Qb0dkbFlOSlVhMk5SYjBrejRISUhFMzA0elFhU0J5bFNhMDUzYkFUVGxmcmRUSXpaWGNGaGZVdm5LTE5FZ1h0UnI5MHoKc1doODFrNU0vaXRvdWNwbWFjVHNYbGQvOXczSG5EWTI1UWRnck1CTTZnaHM3d1o4VDFzb2VnajhrMTJiOXB5MGk0YTZJYm4wOE9oWgpXaWloTklRYUpaRzJ0WS92c3ZtQSt2azlQQkZ5Mk9NdmhuYkZlU3pCcVpDVFJwaG55NE5xb0ZBanB6djJnVG5nN2ZDNXYyWHgyTXQ2CisrOXpBODRBOUgzWDRGMDdacmpjanJxRHk0ZDJBL3dsMmVjamJ3YjlaL1BnLzRTOFI3KzFGaGhHYVJUTUJmZmIwMG1zYTh5cjVMVUwKUXlSZVMydE5aOS9XdFQ1UGVCK1VjU1RxM25EODhaUCtucE5hNUpSYWwxUU1OWHRmYk80QUh5VHNBN29DOVhiMG45U2E3WVVzT0NJdgp4OWd2ZGhGUC9XeGM2UFdPSjRkL0dVb2hSNUFkZVkwY1cvalBTb1hrN2JOYmpiN0VaQ2hkUWNSdXJEaGFUeU4wZEtrU3cvYlN1UkVWCk13ZVIyRHMzT21Nd0J0SEZJallvWWlNUTRFYk1sNnpXSzExa0pOWHVIQTdlK3doYWRTcjJZMjNPQzBLKzBicHdISndoNVE4eGFSZlgKL0FxMDN1MkFuTXVTdEl2MTNsbWlXQW1sWTBjTDRVRXlORUhabXJIWnFMQWJXdDRORGZUaXNsMDFnTG1CMUlScGtRTExkZENOeGJVOQpDWkVKanhTaEZIUjVQdGJKRlIya1dWa2kzUGFLUlQwOEV0WStYVEl2QWdNQkFBR2pnWTR3Z1lzd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QWRCZ05WSFE0RUZnUVVaNUR3MXQ2MUdOVkdLWDVjcS9pZUNMeGtsUkF3RGdZRFZSMFBBUUgvQkFRREFnRUdNRWtHQTFVZEh3UkMKTUVBd1BxQThvRHFHT0doMGRIQTZMeTlqY213dVpDMTBjblZ6ZEM1dVpYUXZZM0pzTDJRdGRISjFjM1JmWW5KZmNtOXZkRjlqWVY4eQpYekl3TWpNdVkzSnNNQTBHQ1NxR1NJYjNEUUVCRFFVQUE0SUNBUUEwOTdOM1U5c3dGcmt0cFNIeFFDRjE2K3RJRm9FOWMrQ2VKeXJyCmQ2a1RwR29LV2xvVU16MW9INEd1YWYyTW4yVnNORUxaTGRCL2VCYXhPcXdqTWExZWY2N25yaXY2dXZ3OGw1VkFrMS9ETFFPajdhUnYKVTlmNlFBNHc5UUFnTEFCTWpEdTBveCsydjVFeXE2K1NtTk1XNXRUUlZGeERXeTZ1NzFjcXFMUnZwTzhOVmhUYUlhc2dkcDREL0NhNApuajgrQXlibVROdWRYMEtFUFVVREF4eFppTXJjTG1Fa1dxVHFKd3R6RXI1U3N3clBNaGZpSG9jYUZwVkliVnJnME04SmtpWm1rZGlqCllRNnFnWUYvNkZLQzBVTG40QjBZK3FTRk51ZUc0QTNydk5USjFqeEQ4VjFKYm42Qm0ybTFpV0tQaUZMWTEvNG53U1BGeXlzQ3U3RmYKL3Z0RGhRTkd2bDNHeWlFbS85Y0NublJLM1BnVEZiR0JWemJMWlZ6UkhURjM2U1hEdzdJeU45WHhtQW5rYldPQUNLc0drb0hVNlhDUApweit5N1lhTWdtbzF5RUphZ3RGU0drVVBGYVVBOEpSN1pTZFhPVVBQZkgvbXZUV3plL0VaVE40NmxzL3BkdTRENThKRFVqeHFnZWpCCldvQzlFVjJUYS92SDVtUS91MmtjNmQwbGk2OTB5VlJBeXN1VEV3cnQrMmFTRWNyMXdQcllnMVVEZk5QRklrWjFjR3Q1U0FZcWdwcS8KNXVzV0RpSkZBYnpkTnBRMHFUVW1pdGVYdWU0SWNyODBrbkNEZ0tzNHFsbG8zVUNrR0pDeTg5VUR5aWJLNzlYSDRJOVRqdkFBNDZqdApuL210ZCtBclkwK2V3KzQzdTNnSmhKNjVidnNwbVpEb2dOT2ZKQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkQtVFJVU1QgRVYgUm9vdCBDQSAyIDIwMjMKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnFUQ0NBNUdnQXdJQkFnSVFhU1lKZm9CTFRLQ25qSGhpVTE5YWJ6QU5CZ2txaGtpRzl3MEJBUTBGQURCSU1Rc3dDUVlEVlFRRwpFd0pFUlRFVk1CTUdBMVVFQ2hNTVJDMVVjblZ6ZENCSGJXSklNU0l3SUFZRFZRUURFeGxFTFZSU1ZWTlVJRVZXSUZKdmIzUWdRMEVnCk1pQXlNREl6TUI0WERUSXpNRFV3T1RBNU1UQXpNMW9YRFRNNE1EVXdPVEE1TVRBek1sb3dTREVMTUFrR0ExVUVCaE1DUkVVeEZUQVQKQmdOVkJBb1RERVF0VkhKMWMzUWdSMjFpU0RFaU1DQUdBMVVFQXhNWlJDMVVVbFZUVkNCRlZpQlNiMjkwSUVOQklESWdNakF5TXpDQwpBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5pT280bUFDN0pYVXR5cFUwdzN1WDlqRnhQdnAxc2pXMmwxCnNKa0tGOEdMeE51bzRNd3h1c0x5elYzcHQvZ2RyMnJFbFlmWFI4bVYySUlFVUQyQkNQL2tQYk94MXNXeS9ZZ0oyNXlFN0NVWEZJZC8KTUhpYmFsakp0bk1vUERUM21mZC8wNmI0SEVWOHJTeU1sRC9ZWnhCVGZpTE5UaVZSOENVa05SRmVFTWJzaDJhSmdXaTZ6Q3VkUjNNZgp2YzJScEhKcW5LSWJHS0J2N0ZEMGZVRENxRERQdlhQSUV5c1FFeDZMbXFnNmxIUFRHR2tLU3YvQkFRUC9lWCsxU0g5Nzd1Z3BielpNCmxXR0cyUG1pYzRydXJpK1c3bWpOUFUwb1F2bEZLekliUmxVV2FxWkxLZm03bFZhL1JoM3NIWk1kd0dXeUg2RkRybGFlb0xHUGF4SzMKWUcxNEM4cUtYTzBlbGc2RHBraVZqVHVqSWNTdVdNWUFzb1MwSTZTV2hqVzQySjdZckRSSm1HT1Z4Y3R0U0VmaThpNFlIdEF4cTkxMAo3UG5jakxnY2ptZ2p1dER6VU56UFpZOXpPakxIZlA3S2dpSlB2bzVpUjJibHpZZmk2TlVQR0ovbEJISkxSandROGtUQ1pGWnhUblhvCm5Na21kTVY5V2RFS1d3OXQvcDUxSEJqR0dqcDgyQTBFek0yM1JXVjZzWSs0cm9SSVByTjZUYWdENHVKK0FSWlphQmhETTdEUzNMQWEKUXpYdXBkcXBSbHl1aG9GQkFVcDBKdXlmQnIvQ0JUZGtkWGdwYVAzRjllditSL25raGJEaGV6R2Rwbjl5bzduRUxDN01tVmNPSVF4RgpBWlJsNjJVSnhtTWlDek5Ka2tnOC9NM09zRDZPbm92NC9rbkZOWEpIQWdNQkFBR2pnWTR3Z1lzd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QWRCZ05WSFE0RUZnUVVxdnlSRUJ1SGtWOFd1YjlQUzVGZUFCeXhNb0F3RGdZRFZSMFBBUUgvQkFRREFnRUdNRWtHQTFVZEh3UkMKTUVBd1BxQThvRHFHT0doMGRIQTZMeTlqY213dVpDMTBjblZ6ZEM1dVpYUXZZM0pzTDJRdGRISjFjM1JmWlhaZmNtOXZkRjlqWVY4eQpYekl3TWpNdVkzSnNNQTBHQ1NxR1NJYjNEUUVCRFFVQUE0SUNBUUNUeTZVZm1SSHNtZzFmTEJXVHhqKytFSTE0UXZCdWtFZEhqcU9TCk1vMXdqL1piamI2SnprY0JhaHNnSUlsYnlJSVFiT0RubWFwcnhpcWdZeldSYW9VbHJSYzRwWnQrVVBKMjZvVUZLaWRCSzdHQjBhTDIKUUhXcERzdnhWVWpZN05Ic3Mrak9GS0UxN01KZU5ScXJwaFlCQm83cTNDK2ppc29za2V0U2psOE1teGZQeTNNSEdjUnF3bk5VNzN4RApVbVBCRWNyQ1JiSDBPMVAxYWE0ODQ2WGVyT2hVdDdLUi9heXBIL0tINUJmR1NhaDgyQXBCOVBJKzUzYzBCRkxkNklIeVRTOVVSWjBWCjRVL001ZDQwVnhESkkzSVhjSTFRY0I5V2JNeTUvenBhVDJONncyNWxCeDJFb2YrcERHT0piYkpBaURuWEgzZG90ZnljMWRabmFWdW8KZE52OGlmWWJNdmVrSktaMnQwZFQ3NDFKajZtMmcxcWxscEJGWWZYZUEwOG1ENmlMOEFPV3NLd1YwSEZhYW51VTVuQ1QydkZwNExKaQpUWjZQLzRtZG0xM05SZW1VQWlLTjREVi82UEVFZVhGc1ZJUDRNN2tGTWh0WVZSRlAwT1VuUjNIczdkcG4xbUttUzAwUGFhTEp2T3dpClM1VEhhSlFYZnVLT0tENjJ4dXIxTkd5Zk40Z0hPTnVHY2ZyTmxVaERicU5QZ29mWE5KaHVTNU41WUhWcEQvQWExVlA2SVF6Q1Aray8KSHhpTWtsMTRwM1puR2J1eTZuL3BjQWxXVnFPd0RBc3RObDdGNmNUVmc4dUdGNWNzYkJOdmgxcXZTYVlkMjgwNEJDNWY0a28xRGkxTAorS0lrQkkzWTRXTmVBcEkwMnBoaFhCeHZXSFprcy93Q3VQV2RDZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDYUJ1bmRsZTsKCnVzZSBQc3JcTG9nXExvZ2dlckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUGhwUHJvY2VzczsKCgoKCgpjbGFzcyBDYUJ1bmRsZQp7Cgpwcml2YXRlIHN0YXRpYyAkY2FQYXRoOwoKcHJpdmF0ZSBzdGF0aWMgJGNhRmlsZVZhbGlkaXR5ID0gYXJyYXkoKTsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFN5c3RlbUNhUm9vdEJ1bmRsZVBhdGgoP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCkKewppZiAoc2VsZjo6JGNhUGF0aCAhPT0gbnVsbCkgewpyZXR1cm4gc2VsZjo6JGNhUGF0aDsKfQokY2FCdW5kbGVQYXRocyA9IGFycmF5KCk7CgoKCiRjYUJ1bmRsZVBhdGhzW10gPSBzZWxmOjpnZXRFbnZWYXJpYWJsZSgnU1NMX0NFUlRfRklMRScpOwoKCgokY2FCdW5kbGVQYXRoc1tdID0gc2VsZjo6Z2V0RW52VmFyaWFibGUoJ1NTTF9DRVJUX0RJUicpOwoKJGNhQnVuZGxlUGF0aHNbXSA9IGluaV9nZXQoJ29wZW5zc2wuY2FmaWxlJyk7CiRjYUJ1bmRsZVBhdGhzW10gPSBpbmlfZ2V0KCdvcGVuc3NsLmNhcGF0aCcpOwoKJG90aGVyTG9jYXRpb25zID0gYXJyYXkoCicvZXRjL3BraS90bHMvY2VydHMvY2EtYnVuZGxlLmNydCcsIAonL2V0Yy9zc2wvY2VydHMvY2EtY2VydGlmaWNhdGVzLmNydCcsIAonL2V0Yy9zc2wvY2EtYnVuZGxlLnBlbScsIAonL3Vzci9zc2wvY2VydHMvY2EtYnVuZGxlLmNydCcsIAonL29wdC9sb2NhbC9zaGFyZS9jdXJsL2N1cmwtY2EtYnVuZGxlLmNydCcsIAonL3Vzci9sb2NhbC9zaGFyZS9jdXJsL2N1cmwtY2EtYnVuZGxlLmNydCcsIAonL3Vzci9zaGFyZS9zc2wvY2VydHMvY2EtYnVuZGxlLmNydCcsIAonL2V0Yy9zc2wvY2VydC5wZW0nLCAKJy91c3IvbG9jYWwvZXRjL29wZW5zc2wvY2VydC5wZW0nLCAKJy91c3IvbG9jYWwvZXRjL29wZW5zc2xAMS4xL2NlcnQucGVtJywgCicvb3B0L2hvbWVicmV3L2V0Yy9vcGVuc3NsQDMvY2VydC5wZW0nLCAKJy9vcHQvaG9tZWJyZXcvZXRjL29wZW5zc2xAMS4xL2NlcnQucGVtJywgCicvZXRjL3BraS90bHMvY2VydHMnLAonL2V0Yy9zc2wvY2VydHMnLCAKKTsKCiRjYUJ1bmRsZVBhdGhzID0gYXJyYXlfbWVyZ2UoJGNhQnVuZGxlUGF0aHMsICRvdGhlckxvY2F0aW9ucyk7Cgpmb3JlYWNoICgkY2FCdW5kbGVQYXRocyBhcyAkY2FCdW5kbGUpIHsKaWYgKCRjYUJ1bmRsZSAmJiBzZWxmOjpjYUZpbGVVc2FibGUoJGNhQnVuZGxlLCAkbG9nZ2VyKSkgewpyZXR1cm4gc2VsZjo6JGNhUGF0aCA9ICRjYUJ1bmRsZTsKfQoKaWYgKCRjYUJ1bmRsZSAmJiBzZWxmOjpjYURpclVzYWJsZSgkY2FCdW5kbGUsICRsb2dnZXIpKSB7CnJldHVybiBzZWxmOjokY2FQYXRoID0gJGNhQnVuZGxlOwp9Cn0KCnJldHVybiBzZWxmOjokY2FQYXRoID0gc3RhdGljOjpnZXRCdW5kbGVkQ2FCdW5kbGVQYXRoKCk7IAp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRCdW5kbGVkQ2FCdW5kbGVQYXRoKCkKewokY2FCdW5kbGVGaWxlID0gX19ESVJfXy4nLy4uL3Jlcy9jYWNlcnQucGVtJzsKCgoKaWYgKDAgPT09IHN0cnBvcygkY2FCdW5kbGVGaWxlLCAncGhhcjovLycpKSB7CiR0ZW1wQ2FCdW5kbGVGaWxlID0gdGVtcG5hbShzeXNfZ2V0X3RlbXBfZGlyKCksICdvcGVuc3NsLWNhLWJ1bmRsZS0nKTsKaWYgKGZhbHNlID09PSAkdGVtcENhQnVuZGxlRmlsZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byBzdG9yZSB0aGUgYnVuZGxlZCBDQSBmaWxlJyk7Cn0KCmZpbGVfcHV0X2NvbnRlbnRzKAokdGVtcENhQnVuZGxlRmlsZSwKZmlsZV9nZXRfY29udGVudHMoJGNhQnVuZGxlRmlsZSkKKTsKCnJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKGZ1bmN0aW9uKCkgdXNlICgkdGVtcENhQnVuZGxlRmlsZSkgewpAdW5saW5rKCR0ZW1wQ2FCdW5kbGVGaWxlKTsKfSk7CgokY2FCdW5kbGVGaWxlID0gJHRlbXBDYUJ1bmRsZUZpbGU7Cn0KCnJldHVybiAkY2FCdW5kbGVGaWxlOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdmFsaWRhdGVDYUZpbGUoJGZpbGVuYW1lLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CnN0YXRpYyAkd2FybmVkID0gZmFsc2U7CgppZiAoaXNzZXQoc2VsZjo6JGNhRmlsZVZhbGlkaXR5WyRmaWxlbmFtZV0pKSB7CnJldHVybiBzZWxmOjokY2FGaWxlVmFsaWRpdHlbJGZpbGVuYW1lXTsKfQoKJGNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKTsKCmlmIChpc19zdHJpbmcoJGNvbnRlbnRzKSAmJiBzdHJsZW4oJGNvbnRlbnRzKSA+IDApIHsKJGNvbnRlbnRzID0gcHJlZ19yZXBsYWNlKCIvXihcXC0rKD86QkVHSU58RU5EKSlcXHMrVFJVU1RFRFxccysoQ0VSVElGSUNBVEVcXC0rKVwkL20iLCAnJDEgJDInLCAkY29udGVudHMpOwppZiAobnVsbCA9PT0gJGNvbnRlbnRzKSB7CgokaXNWYWxpZCA9IGZhbHNlOwp9IGVsc2UgewokaXNWYWxpZCA9IChib29sKSBvcGVuc3NsX3g1MDlfcGFyc2UoJGNvbnRlbnRzKTsKfQp9IGVsc2UgewokaXNWYWxpZCA9IGZhbHNlOwp9CgppZiAoJGxvZ2dlcikgewokbG9nZ2VyLT5kZWJ1ZygnQ2hlY2tlZCBDQSBmaWxlICcucmVhbHBhdGgoJGZpbGVuYW1lKS4nOiAnLigkaXNWYWxpZCA/ICd2YWxpZCcgOiAnaW52YWxpZCcpKTsKfQoKcmV0dXJuIHNlbGY6OiRjYUZpbGVWYWxpZGl0eVskZmlsZW5hbWVdID0gJGlzVmFsaWQ7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc09wZW5zc2xQYXJzZVNhZmUoKQp7CnJldHVybiB0cnVlOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXNldCgpCnsKc2VsZjo6JGNhRmlsZVZhbGlkaXR5ID0gYXJyYXkoKTsKc2VsZjo6JGNhUGF0aCA9IG51bGw7Cn0KCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRFbnZWYXJpYWJsZSgkbmFtZSkKewppZiAoaXNzZXQoJF9TRVJWRVJbJG5hbWVdKSkgewpyZXR1cm4gKHN0cmluZykgJF9TRVJWRVJbJG5hbWVdOwp9CgppZiAoUEhQX1NBUEkgPT09ICdjbGknICYmICgkdmFsdWUgPSBnZXRlbnYoJG5hbWUpKSAhPT0gZmFsc2UgJiYgJHZhbHVlICE9PSBudWxsKSB7CnJldHVybiAoc3RyaW5nKSAkdmFsdWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjYUZpbGVVc2FibGUoJGNlcnRGaWxlLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CnJldHVybiAkY2VydEZpbGUKJiYgc2VsZjo6aXNGaWxlKCRjZXJ0RmlsZSwgJGxvZ2dlcikKJiYgc2VsZjo6aXNSZWFkYWJsZSgkY2VydEZpbGUsICRsb2dnZXIpCiYmIHNlbGY6OnZhbGlkYXRlQ2FGaWxlKCRjZXJ0RmlsZSwgJGxvZ2dlcik7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY2FEaXJVc2FibGUoJGNlcnREaXIsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKcmV0dXJuICRjZXJ0RGlyCiYmIHNlbGY6OmlzRGlyKCRjZXJ0RGlyLCAkbG9nZ2VyKQomJiBzZWxmOjppc1JlYWRhYmxlKCRjZXJ0RGlyLCAkbG9nZ2VyKQomJiBzZWxmOjpnbG9iKCRjZXJ0RGlyIC4gJy8qJywgJGxvZ2dlcik7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNGaWxlKCRjZXJ0RmlsZSwgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCkKewokaXNGaWxlID0gQGlzX2ZpbGUoJGNlcnRGaWxlKTsKaWYgKCEkaXNGaWxlICYmICRsb2dnZXIpIHsKJGxvZ2dlci0+ZGVidWcoc3ByaW50ZignQ2hlY2tlZCBDQSBmaWxlICVzIGRvZXMgbm90IGV4aXN0IG9yIGl0IGlzIG5vdCBhIGZpbGUuJywgJGNlcnRGaWxlKSk7Cn0KCnJldHVybiAkaXNGaWxlOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzRGlyKCRjZXJ0RGlyLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CiRpc0RpciA9IEBpc19kaXIoJGNlcnREaXIpOwppZiAoISRpc0RpciAmJiAkbG9nZ2VyKSB7CiRsb2dnZXItPmRlYnVnKHNwcmludGYoJ0NoZWNrZWQgZGlyZWN0b3J5ICVzIGRvZXMgbm90IGV4aXN0IG9yIGl0IGlzIG5vdCBhIGRpcmVjdG9yeS4nLCAkY2VydERpcikpOwp9CgpyZXR1cm4gJGlzRGlyOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzUmVhZGFibGUoJGNlcnRGaWxlT3JEaXIsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKJGlzUmVhZGFibGUgPSBAaXNfcmVhZGFibGUoJGNlcnRGaWxlT3JEaXIpOwppZiAoISRpc1JlYWRhYmxlICYmICRsb2dnZXIpIHsKJGxvZ2dlci0+ZGVidWcoc3ByaW50ZignQ2hlY2tlZCBmaWxlIG9yIGRpcmVjdG9yeSAlcyBpcyBub3QgcmVhZGFibGUuJywgJGNlcnRGaWxlT3JEaXIpKTsKfQoKcmV0dXJuICRpc1JlYWRhYmxlOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdsb2IoJHBhdHRlcm4sID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKJGNlcnRzID0gZ2xvYigkcGF0dGVybik7CmlmICgkY2VydHMgPT09IGZhbHNlKSB7CmlmICgkbG9nZ2VyKSB7CiRsb2dnZXItPmRlYnVnKHNwcmludGYoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBmaW5kIGNlcnRpZmljYXRlcyBmb3IgcGF0dGVybjogJXMiLCAkcGF0dGVybikpOwp9CnJldHVybiBmYWxzZTsKfQoKaWYgKGNvdW50KCRjZXJ0cykgPT09IDApIHsKaWYgKCRsb2dnZXIpIHsKJGxvZ2dlci0+ZGVidWcoc3ByaW50ZigiTm8gQ0EgZmlsZXMgZm91bmQgZm9yIHBhdHRlcm46ICVzIiwgJHBhdHRlcm4pKTsKfQpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9Cn0KCkNvcHlyaWdodCAoQykgMjAyMiBDb21wb3NlcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCm9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbwpzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KCjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBDbGFzc01hcCBpbXBsZW1lbnRzIFxDb3VudGFibGUKewoKCgpwdWJsaWMgJG1hcCA9IFtdOwoKCgoKcHJpdmF0ZSAkYW1iaWd1b3VzQ2xhc3NlcyA9IFtdOwoKCgoKcHJpdmF0ZSAkcHNyVmlvbGF0aW9ucyA9IFtdOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWFwKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5tYXA7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBzclZpb2xhdGlvbnMoKTogYXJyYXkKewppZiAoXGNvdW50KCR0aGlzLT5wc3JWaW9sYXRpb25zKSA9PT0gMCkgewpyZXR1cm4gW107Cn0KCnJldHVybiBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkdmlvbGF0aW9uKTogc3RyaW5nIHsKcmV0dXJuICR2aW9sYXRpb25bJ3dhcm5pbmcnXTsKfSwgYXJyYXlfbWVyZ2UoLi4uYXJyYXlfdmFsdWVzKCR0aGlzLT5wc3JWaW9sYXRpb25zKSkpOwp9CgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFtYmlndW91c0NsYXNzZXMoJGR1cGxpY2F0ZXNGaWx0ZXIgPSAney8odGVzdHxmaXh0dXJlfGV4YW1wbGV8c3R1YilzPy99aScpOiBhcnJheQp7CmlmIChmYWxzZSA9PT0gJGR1cGxpY2F0ZXNGaWx0ZXIpIHsKcmV0dXJuICR0aGlzLT5hbWJpZ3VvdXNDbGFzc2VzOwp9CgppZiAodHJ1ZSA9PT0gJGR1cGxpY2F0ZXNGaWx0ZXIpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRkdXBsaWNhdGVzRmlsdGVyIHNob3VsZCBiZSBmYWxzZSBvciBhIHN0cmluZyB3aXRoIGEgdmFsaWQgcmVnZXgsIGdvdCB0cnVlLicpOwp9CgokYW1iaWd1b3VzQ2xhc3NlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+YW1iaWd1b3VzQ2xhc3NlcyBhcyAkY2xhc3MgPT4gJHBhdGhzKSB7CiRwYXRocyA9IGFycmF5X2ZpbHRlcigkcGF0aHMsIGZ1bmN0aW9uICgkcGF0aCkgdXNlICgkZHVwbGljYXRlc0ZpbHRlcikgewpyZXR1cm4gIVByZWc6OmlzTWF0Y2goJGR1cGxpY2F0ZXNGaWx0ZXIsIHN0cnRyKCRwYXRoLCAnXFwnLCAnLycpKTsKfSk7CmlmIChcY291bnQoJHBhdGhzKSA+IDApIHsKJGFtYmlndW91c0NsYXNzZXNbJGNsYXNzXSA9IGFycmF5X3ZhbHVlcygkcGF0aHMpOwp9Cn0KCnJldHVybiAkYW1iaWd1b3VzQ2xhc3NlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNvcnQoKTogdm9pZAp7Cmtzb3J0KCR0aGlzLT5tYXApOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENsYXNzKHN0cmluZyAkY2xhc3NOYW1lLCBzdHJpbmcgJHBhdGgpOiB2b2lkCnsKdW5zZXQoJHRoaXMtPnBzclZpb2xhdGlvbnNbc3RydHIoJHBhdGgsICdcXCcsICcvJyldKTsKCiR0aGlzLT5tYXBbJGNsYXNzTmFtZV0gPSAkcGF0aDsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzc1BhdGgoc3RyaW5nICRjbGFzc05hbWUpOiBzdHJpbmcKewppZiAoIWlzc2V0KCR0aGlzLT5tYXBbJGNsYXNzTmFtZV0pKSB7CnRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ0NsYXNzICcuJGNsYXNzTmFtZS4nIGlzIG5vdCBwcmVzZW50IGluIHRoZSBtYXAnKTsKfQoKcmV0dXJuICR0aGlzLT5tYXBbJGNsYXNzTmFtZV07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNDbGFzcyhzdHJpbmcgJGNsYXNzTmFtZSk6IGJvb2wKewpyZXR1cm4gaXNzZXQoJHRoaXMtPm1hcFskY2xhc3NOYW1lXSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBhZGRQc3JWaW9sYXRpb24oc3RyaW5nICR3YXJuaW5nLCBzdHJpbmcgJGNsYXNzTmFtZSwgc3RyaW5nICRwYXRoKTogdm9pZAp7CiRwYXRoID0gcnRyaW0oc3RydHIoJHBhdGgsICdcXCcsICcvJyksICcvJyk7CgokdGhpcy0+cHNyVmlvbGF0aW9uc1skcGF0aF1bXSA9IFsnd2FybmluZycgPT4gJHdhcm5pbmcsICdjbGFzc05hbWUnID0+ICRjbGFzc05hbWVdOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2xlYXJQc3JWaW9sYXRpb25zQnlQYXRoKHN0cmluZyAkcGF0aFByZWZpeCk6IHZvaWQKewokcGF0aFByZWZpeCA9IHJ0cmltKHN0cnRyKCRwYXRoUHJlZml4LCAnXFwnLCAnLycpLCAnLycpOwoKZm9yZWFjaCAoJHRoaXMtPnBzclZpb2xhdGlvbnMgYXMgJHBhdGggPT4gJHZpb2xhdGlvbnMpIHsKaWYgKCRwYXRoID09PSAkcGF0aFByZWZpeCB8fCAwID09PSBcc3RycG9zKCRwYXRoLCAkcGF0aFByZWZpeC4nLycpKSB7CnVuc2V0KCR0aGlzLT5wc3JWaW9sYXRpb25zWyRwYXRoXSk7Cn0KfQp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEFtYmlndW91c0NsYXNzKHN0cmluZyAkY2xhc3NOYW1lLCBzdHJpbmcgJHBhdGgpOiB2b2lkCnsKJHRoaXMtPmFtYmlndW91c0NsYXNzZXNbJGNsYXNzTmFtZV1bXSA9ICRwYXRoOwp9CgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKcmV0dXJuIFxjb3VudCgkdGhpcy0+bWFwKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSYXdQc3JWaW9sYXRpb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wc3JWaW9sYXRpb25zOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENsYXNzTWFwR2VuZXJhdG9yOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxGaW5kZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKCgoKCgoKCmNsYXNzIENsYXNzTWFwR2VuZXJhdG9yCnsKCgoKcHJpdmF0ZSAkZXh0ZW5zaW9uczsKCgoKCnByaXZhdGUgJHNjYW5uZWRGaWxlcyA9IG51bGw7CgoKCgpwcml2YXRlICRjbGFzc01hcDsKCgoKCnByaXZhdGUgJHN0cmVhbVdyYXBwZXJzUmVnZXg7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGV4dGVuc2lvbnMgPSBbJ3BocCcsICdpbmMnXSkKewokdGhpcy0+ZXh0ZW5zaW9ucyA9ICRleHRlbnNpb25zOwokdGhpcy0+Y2xhc3NNYXAgPSBuZXcgQ2xhc3NNYXA7CiR0aGlzLT5zdHJlYW1XcmFwcGVyc1JlZ2V4ID0gc3ByaW50Zigne14oPzolcyk6Ly99JywgaW1wbG9kZSgnfCcsIGFycmF5X21hcCgncHJlZ19xdW90ZScsIHN0cmVhbV9nZXRfd3JhcHBlcnMoKSkpKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdm9pZER1cGxpY2F0ZVNjYW5zKD9GaWxlTGlzdCAkc2Nhbm5lZEZpbGVzID0gbnVsbCk6IHNlbGYKewokdGhpcy0+c2Nhbm5lZEZpbGVzID0gJHNjYW5uZWRGaWxlcyA/PyBuZXcgRmlsZUxpc3Q7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVNYXAoJHBhdGgpOiBhcnJheQp7CiRnZW5lcmF0b3IgPSBuZXcgc2VsZigpOwoKJGdlbmVyYXRvci0+c2NhblBhdGhzKCRwYXRoKTsKCnJldHVybiAkZ2VuZXJhdG9yLT5nZXRDbGFzc01hcCgpLT5nZXRNYXAoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENsYXNzTWFwKCk6IENsYXNzTWFwCnsKcmV0dXJuICR0aGlzLT5jbGFzc01hcDsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2NhblBhdGhzKCRwYXRoLCA/c3RyaW5nICRleGNsdWRlZCA9IG51bGwsIHN0cmluZyAkYXV0b2xvYWRUeXBlID0gJ2NsYXNzbWFwJywgP3N0cmluZyAkbmFtZXNwYWNlID0gbnVsbCwgYXJyYXkgJGV4Y2x1ZGVkRGlycyA9IFtdKTogdm9pZAp7CmlmICghaW5fYXJyYXkoJGF1dG9sb2FkVHlwZSwgWydwc3ItMCcsICdwc3ItNCcsICdjbGFzc21hcCddLCB0cnVlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJGF1dG9sb2FkVHlwZSBtdXN0IGJlIG9uZSBvZjogInBzci0wIiwgInBzci00IiBvciAiY2xhc3NtYXAiJyk7Cn0KCmlmICgnY2xhc3NtYXAnICE9PSAkYXV0b2xvYWRUeXBlKSB7CmlmICghaXNfc3RyaW5nKCRwYXRoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJHBhdGggbXVzdCBiZSBhIHN0cmluZyB3aGVuIHNwZWNpZnlpbmcgYSBwc3ItMCBvciBwc3ItNCBhdXRvbG9hZCB0eXBlJyk7Cn0KaWYgKCFpc19zdHJpbmcoJG5hbWVzcGFjZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRuYW1lc3BhY2UgbXVzdCBiZSBnaXZlbiAoZXZlbiBpZiBpdCBpcyBhbiBlbXB0eSBzdHJpbmcgaWYgeW91IGRvIG5vdCB3YW50IHRvIGZpbHRlcikgd2hlbiBzcGVjaWZ5aW5nIGEgcHNyLTAgb3IgcHNyLTQgYXV0b2xvYWQgdHlwZScpOwp9CiRiYXNlUGF0aCA9ICRwYXRoOwp9CgppZiAoaXNfc3RyaW5nKCRwYXRoKSkgewppZiAoaXNfZmlsZSgkcGF0aCkpIHsKJHBhdGggPSBbbmV3IFxTcGxGaWxlSW5mbygkcGF0aCldOwp9IGVsc2VpZiAoaXNfZGlyKCRwYXRoKSB8fCBzdHJwb3MoJHBhdGgsICcqJykgIT09IGZhbHNlKSB7CiRwYXRoID0gRmluZGVyOjpjcmVhdGUoKQotPmZpbGVzKCkKLT5mb2xsb3dMaW5rcygpCi0+bmFtZSgnL1wuKD86Jy5pbXBsb2RlKCd8JywgYXJyYXlfbWFwKCdwcmVnX3F1b3RlJywgJHRoaXMtPmV4dGVuc2lvbnMpKS4nKSQvJykKLT5pbigkcGF0aCkKLT5leGNsdWRlKCRleGNsdWRlZERpcnMpOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidDb3VsZCBub3Qgc2NhbiBmb3IgY2xhc3NlcyBpbnNpZGUgIicuJHBhdGguJyIgd2hpY2ggZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgZmlsZSBub3IgYSBmb2xkZXInCik7Cn0KfQoKJGN3ZCA9IHJlYWxwYXRoKHNlbGY6OmdldEN3ZCgpKTsKCmZvcmVhY2ggKCRwYXRoIGFzICRmaWxlKSB7CiRmaWxlUGF0aCA9ICRmaWxlLT5nZXRQYXRobmFtZSgpOwppZiAoIWluX2FycmF5KHBhdGhpbmZvKCRmaWxlUGF0aCwgUEFUSElORk9fRVhURU5TSU9OKSwgJHRoaXMtPmV4dGVuc2lvbnMsIHRydWUpKSB7CmNvbnRpbnVlOwp9CgokaXNTdHJlYW1XcmFwcGVyUGF0aCA9IFByZWc6OmlzTWF0Y2goJHRoaXMtPnN0cmVhbVdyYXBwZXJzUmVnZXgsICRmaWxlUGF0aCk7CmlmICghc2VsZjo6aXNBYnNvbHV0ZVBhdGgoJGZpbGVQYXRoKSAmJiAhJGlzU3RyZWFtV3JhcHBlclBhdGgpIHsKJGZpbGVQYXRoID0gJGN3ZCAuICcvJyAuICRmaWxlUGF0aDsKJGZpbGVQYXRoID0gc2VsZjo6bm9ybWFsaXplUGF0aCgkZmlsZVBhdGgpOwp9IGVsc2UgewokZmlsZVBhdGggPSBQcmVnOjpyZXBsYWNlKCd7KD88ITopW1xcXFwvXXsyLH19JywgJy8nLCAkZmlsZVBhdGgpOwp9CgppZiAoJycgPT09ICRmaWxlUGF0aCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdHb3QgYW4gZW1wdHkgJGZpbGVQYXRoIGZvciAnLiRmaWxlLT5nZXRQYXRobmFtZSgpKTsKfQoKJHJlYWxQYXRoID0gJGlzU3RyZWFtV3JhcHBlclBhdGgKPyAkZmlsZVBhdGgKOiByZWFscGF0aCgkZmlsZVBhdGgpOwoKCmlmIChmYWxzZSA9PT0gJHJlYWxQYXRoKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigncmVhbHBhdGggb2YgJy4kZmlsZVBhdGguJyBmYWlsZWQgdG8gcmVzb2x2ZSwgZ290IGZhbHNlJyk7Cn0KCgoKaWYgKCR0aGlzLT5zY2FubmVkRmlsZXMgIT09IG51bGwgJiYgJHRoaXMtPnNjYW5uZWRGaWxlcy0+Y29udGFpbnMoJHJlYWxQYXRoKSkgewpjb250aW51ZTsKfQoKCmlmIChudWxsICE9PSAkZXhjbHVkZWQgJiYgUHJlZzo6aXNNYXRjaCgkZXhjbHVkZWQsIHN0cnRyKCRyZWFsUGF0aCwgJ1xcJywgJy8nKSkpIHsKY29udGludWU7Cn0KCmlmIChudWxsICE9PSAkZXhjbHVkZWQgJiYgUHJlZzo6aXNNYXRjaCgkZXhjbHVkZWQsIHN0cnRyKCRmaWxlUGF0aCwgJ1xcJywgJy8nKSkpIHsKY29udGludWU7Cn0KCiRjbGFzc2VzID0gUGhwRmlsZVBhcnNlcjo6ZmluZENsYXNzZXMoJGZpbGVQYXRoKTsKaWYgKCdjbGFzc21hcCcgIT09ICRhdXRvbG9hZFR5cGUgJiYgaXNzZXQoJG5hbWVzcGFjZSkpIHsKJGNsYXNzZXMgPSAkdGhpcy0+ZmlsdGVyQnlOYW1lc3BhY2UoJGNsYXNzZXMsICRmaWxlUGF0aCwgJG5hbWVzcGFjZSwgJGF1dG9sb2FkVHlwZSwgJGJhc2VQYXRoKTsKCgppZiAoXGNvdW50KCRjbGFzc2VzKSA+IDAgJiYgJHRoaXMtPnNjYW5uZWRGaWxlcyAhPT0gbnVsbCkgewokdGhpcy0+c2Nhbm5lZEZpbGVzLT5hZGQoJHJlYWxQYXRoKTsKfQp9IGVsc2VpZiAoJHRoaXMtPnNjYW5uZWRGaWxlcyAhPT0gbnVsbCkgewoKJHRoaXMtPnNjYW5uZWRGaWxlcy0+YWRkKCRyZWFsUGF0aCk7Cn0KCmZvcmVhY2ggKCRjbGFzc2VzIGFzICRjbGFzcykgewppZiAoISR0aGlzLT5jbGFzc01hcC0+aGFzQ2xhc3MoJGNsYXNzKSkgewokdGhpcy0+Y2xhc3NNYXAtPmFkZENsYXNzKCRjbGFzcywgJGZpbGVQYXRoKTsKfSBlbHNlaWYgKCRmaWxlUGF0aCAhPT0gJHRoaXMtPmNsYXNzTWFwLT5nZXRDbGFzc1BhdGgoJGNsYXNzKSkgewokdGhpcy0+Y2xhc3NNYXAtPmFkZEFtYmlndW91c0NsYXNzKCRjbGFzcywgJGZpbGVQYXRoKTsKfQp9Cn0KfQoKCgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaWx0ZXJCeU5hbWVzcGFjZShhcnJheSAkY2xhc3Nlcywgc3RyaW5nICRmaWxlUGF0aCwgc3RyaW5nICRiYXNlTmFtZXNwYWNlLCBzdHJpbmcgJG5hbWVzcGFjZVR5cGUsIHN0cmluZyAkYmFzZVBhdGgpOiBhcnJheQp7CiR2YWxpZENsYXNzZXMgPSBbXTsKJHJlamVjdGVkQ2xhc3NlcyA9IFtdOwoKJHJlYWxTdWJQYXRoID0gc3Vic3RyKCRmaWxlUGF0aCwgc3RybGVuKCRiYXNlUGF0aCkgKyAxKTsKJGRvdFBvc2l0aW9uID0gc3RycnBvcygkcmVhbFN1YlBhdGgsICcuJyk7CiRyZWFsU3ViUGF0aCA9IHN1YnN0cigkcmVhbFN1YlBhdGgsIDAsICRkb3RQb3NpdGlvbiA9PT0gZmFsc2UgPyBQSFBfSU5UX01BWCA6ICRkb3RQb3NpdGlvbik7Cgpmb3JlYWNoICgkY2xhc3NlcyBhcyAkY2xhc3MpIHsKCmlmICgncHNyLTAnID09PSAkbmFtZXNwYWNlVHlwZSkgewokbmFtZXNwYWNlTGVuZ3RoID0gc3RycnBvcygkY2xhc3MsICdcXCcpOwppZiAoZmFsc2UgIT09ICRuYW1lc3BhY2VMZW5ndGgpIHsKJG5hbWVzcGFjZSA9IHN1YnN0cigkY2xhc3MsIDAsICRuYW1lc3BhY2VMZW5ndGggKyAxKTsKJGNsYXNzTmFtZSA9IHN1YnN0cigkY2xhc3MsICRuYW1lc3BhY2VMZW5ndGggKyAxKTsKJHN1YlBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkbmFtZXNwYWNlKQouIHN0cl9yZXBsYWNlKCdfJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJGNsYXNzTmFtZSk7Cn0gZWxzZSB7CiRzdWJQYXRoID0gc3RyX3JlcGxhY2UoJ18nLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkY2xhc3MpOwp9Cn0gZWxzZWlmICgncHNyLTQnID09PSAkbmFtZXNwYWNlVHlwZSkgewokc3ViTmFtZXNwYWNlID0gKCcnICE9PSAkYmFzZU5hbWVzcGFjZSkgPyBzdWJzdHIoJGNsYXNzLCBzdHJsZW4oJGJhc2VOYW1lc3BhY2UpKSA6ICRjbGFzczsKJHN1YlBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkc3ViTmFtZXNwYWNlKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRuYW1lc3BhY2VUeXBlIG11c3QgYmUgInBzci0wIiBvciAicHNyLTQiJyk7Cn0KaWYgKCRzdWJQYXRoID09PSAkcmVhbFN1YlBhdGgpIHsKJHZhbGlkQ2xhc3Nlc1tdID0gJGNsYXNzOwp9IGVsc2UgewokcmVqZWN0ZWRDbGFzc2VzW10gPSAkY2xhc3M7Cn0KfQoKaWYgKFxjb3VudCgkdmFsaWRDbGFzc2VzKSA9PT0gMCkgewokY3dkID0gcmVhbHBhdGgoc2VsZjo6Z2V0Q3dkKCkpOwppZiAoJGN3ZCA9PT0gZmFsc2UpIHsKJGN3ZCA9IHNlbGY6OmdldEN3ZCgpOwp9CiRjd2QgPSBzZWxmOjpub3JtYWxpemVQYXRoKCRjd2QpOwokc2hvcnRQYXRoID0gUHJlZzo6cmVwbGFjZSgne14nLnByZWdfcXVvdGUoJGN3ZCkuJ30nLCAnLicsIHNlbGY6Om5vcm1hbGl6ZVBhdGgoJGZpbGVQYXRoKSwgMSk7CiRzaG9ydEJhc2VQYXRoID0gUHJlZzo6cmVwbGFjZSgne14nLnByZWdfcXVvdGUoJGN3ZCkuJ30nLCAnLicsIHNlbGY6Om5vcm1hbGl6ZVBhdGgoJGJhc2VQYXRoKSwgMSk7Cgpmb3JlYWNoICgkcmVqZWN0ZWRDbGFzc2VzIGFzICRjbGFzcykgewokdGhpcy0+Y2xhc3NNYXAtPmFkZFBzclZpb2xhdGlvbigiQ2xhc3MgJGNsYXNzIGxvY2F0ZWQgaW4gJHNob3J0UGF0aCBkb2VzIG5vdCBjb21wbHkgd2l0aCAkbmFtZXNwYWNlVHlwZSBhdXRvbG9hZGluZyBzdGFuZGFyZCAocnVsZTogJGJhc2VOYW1lc3BhY2UgPT4gJHNob3J0QmFzZVBhdGgpLiBTa2lwcGluZy4iLCAkY2xhc3MsICRmaWxlUGF0aCk7Cn0KCnJldHVybiBbXTsKfQoKcmV0dXJuICR2YWxpZENsYXNzZXM7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNBYnNvbHV0ZVBhdGgoc3RyaW5nICRwYXRoKQp7CnJldHVybiBzdHJwb3MoJHBhdGgsICcvJykgPT09IDAgfHwgc3Vic3RyKCRwYXRoLCAxLCAxKSA9PT0gJzonIHx8IHN0cnBvcygkcGF0aCwgJ1xcXFwnKSA9PT0gMDsKfQoKCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChzdHJpbmcgJHBhdGgpCnsKJHBhcnRzID0gW107CiRwYXRoID0gc3RydHIoJHBhdGgsICdcXCcsICcvJyk7CiRwcmVmaXggPSAnJzsKJGFic29sdXRlID0gJyc7CgoKaWYgKHN0cnBvcygkcGF0aCwgJy8vJykgPT09IDAgJiYgXHN0cmxlbigkcGF0aCkgPiAyKSB7CiRhYnNvbHV0ZSA9ICcvLyc7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAyKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiggWzAtOWEtel17Mix9KzogKD86IC8vICg/OiBbYS16XTogKT8gKT8gfCBbYS16XTogKX1peCcsICRwYXRoLCAkbWF0Y2gpKSB7CiRwcmVmaXggPSAkbWF0Y2hbMV07CiRwYXRoID0gc3Vic3RyKCRwYXRoLCBcc3RybGVuKCRwcmVmaXgpKTsKfQoKaWYgKHN0cnBvcygkcGF0aCwgJy8nKSA9PT0gMCkgewokYWJzb2x1dGUgPSAnLyc7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAxKTsKfQoKJHVwID0gZmFsc2U7CmZvcmVhY2ggKGV4cGxvZGUoJy8nLCAkcGF0aCkgYXMgJGNodW5rKSB7CmlmICgnLi4nID09PSAkY2h1bmsgJiYgKFxzdHJsZW4oJGFic29sdXRlKSA+IDAgfHwgJHVwKSkgewphcnJheV9wb3AoJHBhcnRzKTsKJHVwID0gIShcY291bnQoJHBhcnRzKSA9PT0gMCB8fCAnLi4nID09PSBlbmQoJHBhcnRzKSk7Cn0gZWxzZWlmICgnLicgIT09ICRjaHVuayAmJiAnJyAhPT0gJGNodW5rKSB7CiRwYXJ0c1tdID0gJGNodW5rOwokdXAgPSAnLi4nICE9PSAkY2h1bms7Cn0KfQoKCiRwcmVmaXggPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3soPzpefDovLylbYS16XTokfWknLCBmdW5jdGlvbiAoYXJyYXkgJG0pIHsgcmV0dXJuIHN0cnRvdXBwZXIoKHN0cmluZykgJG1bMF0pOyB9LCAkcHJlZml4KTsKCnJldHVybiAkcHJlZml4LiRhYnNvbHV0ZS5pbXBsb2RlKCcvJywgJHBhcnRzKTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0Q3dkKCk6IHN0cmluZwp7CiRjd2QgPSBnZXRjd2QoKTsKCmlmIChmYWxzZSA9PT0gJGN3ZCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnknKTsKfQoKcmV0dXJuICRjd2Q7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3I7CgoKCgoKCmNsYXNzIEZpbGVMaXN0CnsKCgoKcHVibGljICRmaWxlcyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZChzdHJpbmcgJHBhdGgpOiB2b2lkCnsKJHRoaXMtPmZpbGVzWyRwYXRoXSA9IHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb250YWlucyhzdHJpbmcgJHBhdGgpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5maWxlc1skcGF0aF0pOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENsYXNzTWFwR2VuZXJhdG9yOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgpjbGFzcyBQaHBGaWxlQ2xlYW5lcgp7Cgpwcml2YXRlIHN0YXRpYyAkdHlwZUNvbmZpZzsKCgpwcml2YXRlIHN0YXRpYyAkcmVzdFBhdHRlcm47CgoKCgoKcHJpdmF0ZSAkY29udGVudHM7CgoKCgoKcHJpdmF0ZSAkbGVuOwoKCgoKCnByaXZhdGUgJG1heE1hdGNoZXM7CgoKcHJpdmF0ZSAkaW5kZXggPSAwOwoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRUeXBlQ29uZmlnKGFycmF5ICR0eXBlcyk6IHZvaWQKewpmb3JlYWNoICgkdHlwZXMgYXMgJHR5cGUpIHsKc2VsZjo6JHR5cGVDb25maWdbJHR5cGVbMF1dID0gYXJyYXkoCiduYW1lJyA9PiAkdHlwZSwKJ2xlbmd0aCcgPT4gXHN0cmxlbigkdHlwZSksCidwYXR0ZXJuJyA9PiAney5cYig/PCFbXCQ6Pl0pJy4kdHlwZS4nXHMrK1thLXpBLVpfXHg3Zi1ceGZmOl1bYS16QS1aMC05X1x4N2YtXHhmZjpcLV0qK31BaXMnLAopOwp9CgpzZWxmOjokcmVzdFBhdHRlcm4gPSAne1tePyJcJzwvJy5pbXBsb2RlKCcnLCBhcnJheV9rZXlzKHNlbGY6OiR0eXBlQ29uZmlnKSkuJ10rfUEnOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRjb250ZW50cywgaW50ICRtYXhNYXRjaGVzKQp7CiR0aGlzLT5jb250ZW50cyA9ICRjb250ZW50czsKJHRoaXMtPmxlbiA9IFxzdHJsZW4oJHRoaXMtPmNvbnRlbnRzKTsKJHRoaXMtPm1heE1hdGNoZXMgPSAkbWF4TWF0Y2hlczsKfQoKcHVibGljIGZ1bmN0aW9uIGNsZWFuKCk6IHN0cmluZwp7CiRjbGVhbiA9ICcnOwoKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4pIHsKJHRoaXMtPnNraXBUb1BocCgpOwokY2xlYW4gLj0gJzw/JzsKCndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuKSB7CiRjaGFyID0gJHRoaXMtPmNvbnRlbnRzWyR0aGlzLT5pbmRleF07CmlmICgkY2hhciA9PT0gJz8nICYmICR0aGlzLT5wZWVrKCc+JykpIHsKJGNsZWFuIC49ICc/Pic7CiR0aGlzLT5pbmRleCArPSAyOwpjb250aW51ZSAyOwp9CgppZiAoJGNoYXIgPT09ICciJykgewokdGhpcy0+c2tpcFN0cmluZygnIicpOwokY2xlYW4gLj0gJ251bGwnOwpjb250aW51ZTsKfQoKaWYgKCRjaGFyID09PSAiJyIpIHsKJHRoaXMtPnNraXBTdHJpbmcoIiciKTsKJGNsZWFuIC49ICdudWxsJzsKY29udGludWU7Cn0KCmlmICgkY2hhciA9PT0gIjwiICYmICR0aGlzLT5wZWVrKCc8JykgJiYgJHRoaXMtPm1hdGNoKCd7PDw8WyBcdF0qKyhbXCciXT8pKFthLXpBLVpfXHg4MC1ceGZmXVthLXpBLVowLTlfXHg4MC1ceGZmXSorKVxcMSg/OlxyXG58XG58XHIpfUEnLCAkbWF0Y2gpKSB7CiR0aGlzLT5pbmRleCArPSBcc3RybGVuKCRtYXRjaFswXSk7CiR0aGlzLT5za2lwSGVyZWRvYygkbWF0Y2hbMl0pOwokY2xlYW4gLj0gJ251bGwnOwpjb250aW51ZTsKfQoKaWYgKCRjaGFyID09PSAnLycpIHsKaWYgKCR0aGlzLT5wZWVrKCcvJykpIHsKJHRoaXMtPnNraXBUb05ld2xpbmUoKTsKY29udGludWU7Cn0KaWYgKCR0aGlzLT5wZWVrKCcqJykpIHsKJHRoaXMtPnNraXBDb21tZW50KCk7CmNvbnRpbnVlOwp9Cn0KCmlmICgkdGhpcy0+bWF4TWF0Y2hlcyA9PT0gMSAmJiBpc3NldChzZWxmOjokdHlwZUNvbmZpZ1skY2hhcl0pKSB7CiR0eXBlID0gc2VsZjo6JHR5cGVDb25maWdbJGNoYXJdOwppZiAoClxzdWJzdHIoJHRoaXMtPmNvbnRlbnRzLCAkdGhpcy0+aW5kZXgsICR0eXBlWydsZW5ndGgnXSkgPT09ICR0eXBlWyduYW1lJ10KJiYgUHJlZzo6aXNNYXRjaCgkdHlwZVsncGF0dGVybiddLCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCwgMCwgJHRoaXMtPmluZGV4IC0gMSkKKSB7CiRjbGVhbiAuPSAkbWF0Y2hbMF07CgpyZXR1cm4gJGNsZWFuOwp9Cn0KCiR0aGlzLT5pbmRleCArPSAxOwppZiAoJHRoaXMtPm1hdGNoKHNlbGY6OiRyZXN0UGF0dGVybiwgJG1hdGNoKSkgewokY2xlYW4gLj0gJGNoYXIgLiAkbWF0Y2hbMF07CiR0aGlzLT5pbmRleCArPSBcc3RybGVuKCRtYXRjaFswXSk7Cn0gZWxzZSB7CiRjbGVhbiAuPSAkY2hhcjsKfQp9Cn0KCnJldHVybiAkY2xlYW47Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2tpcFRvUGhwKCk6IHZvaWQKewp3aGlsZSAoJHRoaXMtPmluZGV4IDwgJHRoaXMtPmxlbikgewppZiAoJHRoaXMtPmNvbnRlbnRzWyR0aGlzLT5pbmRleF0gPT09ICc8JyAmJiAkdGhpcy0+cGVlaygnPycpKSB7CiR0aGlzLT5pbmRleCArPSAyOwpicmVhazsKfQoKJHRoaXMtPmluZGV4ICs9IDE7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBza2lwU3RyaW5nKHN0cmluZyAkZGVsaW1pdGVyKTogdm9pZAp7CiR0aGlzLT5pbmRleCArPSAxOwp3aGlsZSAoJHRoaXMtPmluZGV4IDwgJHRoaXMtPmxlbikgewppZiAoJHRoaXMtPmNvbnRlbnRzWyR0aGlzLT5pbmRleF0gPT09ICdcXCcgJiYgKCR0aGlzLT5wZWVrKCdcXCcpIHx8ICR0aGlzLT5wZWVrKCRkZWxpbWl0ZXIpKSkgewokdGhpcy0+aW5kZXggKz0gMjsKY29udGludWU7Cn0KaWYgKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAkZGVsaW1pdGVyKSB7CiR0aGlzLT5pbmRleCArPSAxOwpicmVhazsKfQokdGhpcy0+aW5kZXggKz0gMTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNraXBDb21tZW50KCk6IHZvaWQKewokdGhpcy0+aW5kZXggKz0gMjsKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4pIHsKaWYgKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAnKicgJiYgJHRoaXMtPnBlZWsoJy8nKSkgewokdGhpcy0+aW5kZXggKz0gMjsKYnJlYWs7Cn0KCiR0aGlzLT5pbmRleCArPSAxOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2tpcFRvTmV3bGluZSgpOiB2b2lkCnsKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4pIHsKaWYgKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAiXHIiIHx8ICR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAiXG4iKSB7CnJldHVybjsKfQokdGhpcy0+aW5kZXggKz0gMTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNraXBIZXJlZG9jKHN0cmluZyAkZGVsaW1pdGVyKTogdm9pZAp7CiRmaXJzdERlbGltaXRlckNoYXIgPSAkZGVsaW1pdGVyWzBdOwokZGVsaW1pdGVyTGVuZ3RoID0gXHN0cmxlbigkZGVsaW1pdGVyKTsKJGRlbGltaXRlclBhdHRlcm4gPSAneycucHJlZ19xdW90ZSgkZGVsaW1pdGVyKS4nKD8hW2EtekEtWjAtOV9ceDgwLVx4ZmZdKX1BJzsKCndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuKSB7Cgpzd2l0Y2ggKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdKSB7CmNhc2UgIlx0IjoKY2FzZSAiICI6CiR0aGlzLT5pbmRleCArPSAxOwpjb250aW51ZSAyOwpjYXNlICRmaXJzdERlbGltaXRlckNoYXI6CmlmICgKXHN1YnN0cigkdGhpcy0+Y29udGVudHMsICR0aGlzLT5pbmRleCwgJGRlbGltaXRlckxlbmd0aCkgPT09ICRkZWxpbWl0ZXIKJiYgJHRoaXMtPm1hdGNoKCRkZWxpbWl0ZXJQYXR0ZXJuKQopIHsKJHRoaXMtPmluZGV4ICs9ICRkZWxpbWl0ZXJMZW5ndGg7CgpyZXR1cm47Cn0KYnJlYWs7Cn0KCgp3aGlsZSAoJHRoaXMtPmluZGV4IDwgJHRoaXMtPmxlbikgewokdGhpcy0+c2tpcFRvTmV3bGluZSgpOwoKCndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuICYmICgkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XSA9PT0gIlxyIiB8fCAkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XSA9PT0gIlxuIikpIHsKJHRoaXMtPmluZGV4ICs9IDE7Cn0KCmJyZWFrOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBwZWVrKHN0cmluZyAkY2hhcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmluZGV4ICsgMSA8ICR0aGlzLT5sZW4gJiYgJHRoaXMtPmNvbnRlbnRzWyR0aGlzLT5pbmRleCArIDFdID09PSAkY2hhcjsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1hdGNoKHN0cmluZyAkcmVnZXgsID9hcnJheSAmJG1hdGNoID0gbnVsbCk6IGJvb2wKewpyZXR1cm4gUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygkcmVnZXgsICR0aGlzLT5jb250ZW50cywgJG1hdGNoLCAwLCAkdGhpcy0+aW5kZXgpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENsYXNzTWFwR2VuZXJhdG9yOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIFBocEZpbGVQYXJzZXIKewoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaW5kQ2xhc3NlcyhzdHJpbmcgJHBhdGgpOiBhcnJheQp7CiRleHRyYVR5cGVzID0gc2VsZjo6Z2V0RXh0cmFUeXBlcygpOwoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3BocF9zdHJpcF93aGl0ZXNwYWNlJykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDbGFzc21hcCBnZW5lcmF0aW9uIHJlbGllcyBvbiB0aGUgcGhwX3N0cmlwX3doaXRlc3BhY2UgZnVuY3Rpb24sIGJ1dCBpdCBoYXMgYmVlbiBkaXNhYmxlZCBieSB0aGUgZGlzYWJsZV9mdW5jdGlvbnMgZGlyZWN0aXZlLicpOwp9CgoKJGNvbnRlbnRzID0gQHBocF9zdHJpcF93aGl0ZXNwYWNlKCRwYXRoKTsKaWYgKCcnID09PSAkY29udGVudHMpIHsKaWYgKCFmaWxlX2V4aXN0cygkcGF0aCkpIHsKJG1lc3NhZ2UgPSAnRmlsZSBhdCAiJXMiIGRvZXMgbm90IGV4aXN0LCBjaGVjayB5b3VyIGNsYXNzbWFwIGRlZmluaXRpb25zJzsKfSBlbHNlaWYgKCFzZWxmOjppc1JlYWRhYmxlKCRwYXRoKSkgewokbWVzc2FnZSA9ICdGaWxlIGF0ICIlcyIgaXMgbm90IHJlYWRhYmxlLCBjaGVjayBpdHMgcGVybWlzc2lvbnMnOwp9IGVsc2VpZiAoJycgPT09IHRyaW0oKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJHBhdGgpKSkgewoKcmV0dXJuIGFycmF5KCk7Cn0gZWxzZSB7CiRtZXNzYWdlID0gJ0ZpbGUgYXQgIiVzIiBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIFBIUCwgaXQgbWF5IGJlIGJpbmFyeSBvciBjb3JydXB0ZWQnOwp9CiRlcnJvciA9IGVycm9yX2dldF9sYXN0KCk7CmlmIChpc3NldCgkZXJyb3JbJ21lc3NhZ2UnXSkpIHsKJG1lc3NhZ2UgLj0gUEhQX0VPTCAuICdUaGUgZm9sbG93aW5nIG1lc3NhZ2UgbWF5IGJlIGhlbHBmdWw6JyAuIFBIUF9FT0wgLiAkZXJyb3JbJ21lc3NhZ2UnXTsKfQp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZigkbWVzc2FnZSwgJHBhdGgpKTsKfQoKClByZWc6Om1hdGNoQWxsU3RyaWN0R3JvdXBzKCd7XGIoPzpjbGFzc3xpbnRlcmZhY2V8dHJhaXQnLiRleHRyYVR5cGVzLicpXHN9aScsICRjb250ZW50cywgJG1hdGNoZXMpOwppZiAoMCA9PT0gXGNvdW50KCRtYXRjaGVzKSkgewpyZXR1cm4gYXJyYXkoKTsKfQoKJHAgPSBuZXcgUGhwRmlsZUNsZWFuZXIoJGNvbnRlbnRzLCBjb3VudCgkbWF0Y2hlc1swXSkpOwokY29udGVudHMgPSAkcC0+Y2xlYW4oKTsKdW5zZXQoJHApOwoKUHJlZzo6bWF0Y2hBbGwoJ3sKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgXGIoPzwhW1xcXFwkOj5dKSg/UDx0eXBlPmNsYXNzfGludGVyZmFjZXx0cmFpdCcuJGV4dHJhVHlwZXMuJykgXHMrKyAoP1A8bmFtZT5bYS16QS1aX1x4N2YtXHhmZjpdW2EtekEtWjAtOV9ceDdmLVx4ZmY6XC1dKispCiAgICAgICAgICAgICAgIHwgXGIoPzwhW1xcXFwkOj5dKSg/UDxucz5uYW1lc3BhY2UpICg/UDxuc25hbWU+XHMrK1thLXpBLVpfXHg3Zi1ceGZmXVthLXpBLVowLTlfXHg3Zi1ceGZmXSorKD86XHMqK1xcXFxccyorW2EtekEtWl9ceDdmLVx4ZmZdW2EtekEtWjAtOV9ceDdmLVx4ZmZdKispKispPyBccyorIFtceztdCiAgICAgICAgICAgICkKICAgICAgICB9aXgnLCAkY29udGVudHMsICRtYXRjaGVzKTsKCiRjbGFzc2VzID0gYXJyYXkoKTsKJG5hbWVzcGFjZSA9ICcnOwoKZm9yICgkaSA9IDAsICRsZW4gPSBjb3VudCgkbWF0Y2hlc1sndHlwZSddKTsgJGkgPCAkbGVuOyAkaSsrKSB7CmlmIChpc3NldCgkbWF0Y2hlc1snbnMnXVskaV0pICYmICRtYXRjaGVzWyducyddWyRpXSAhPT0gJycpIHsKJG5hbWVzcGFjZSA9IHN0cl9yZXBsYWNlKGFycmF5KCcgJywgIlx0IiwgIlxyIiwgIlxuIiksICcnLCAoc3RyaW5nKSAkbWF0Y2hlc1snbnNuYW1lJ11bJGldKSAuICdcXCc7Cn0gZWxzZSB7CiRuYW1lID0gJG1hdGNoZXNbJ25hbWUnXVskaV07CmFzc2VydChpc19zdHJpbmcoJG5hbWUpKTsKCmlmICgkbmFtZSA9PT0gJ2V4dGVuZHMnIHx8ICRuYW1lID09PSAnaW1wbGVtZW50cycpIHsKY29udGludWU7Cn0KaWYgKCRuYW1lWzBdID09PSAnOicpIHsKCiRuYW1lID0gJ3hocCcuc3Vic3RyKHN0cl9yZXBsYWNlKGFycmF5KCctJywgJzonKSwgYXJyYXkoJ18nLCAnX18nKSwgJG5hbWUpLCAxKTsKfSBlbHNlaWYgKHN0cnRvbG93ZXIoKHN0cmluZykgJG1hdGNoZXNbJ3R5cGUnXVskaV0pID09PSAnZW51bScpIHsKCgoKCgoKCgokY29sb25Qb3MgPSBzdHJycG9zKCRuYW1lLCAnOicpOwppZiAoZmFsc2UgIT09ICRjb2xvblBvcykgewokbmFtZSA9IHN1YnN0cigkbmFtZSwgMCwgJGNvbG9uUG9zKTsKfQp9CgokY2xhc3NOYW1lID0gbHRyaW0oJG5hbWVzcGFjZSAuICRuYW1lLCAnXFwnKTsKJGNsYXNzZXNbXSA9ICRjbGFzc05hbWU7Cn0KfQoKcmV0dXJuICRjbGFzc2VzOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRFeHRyYVR5cGVzKCk6IHN0cmluZwp7CnN0YXRpYyAkZXh0cmFUeXBlcyA9IG51bGw7CgppZiAobnVsbCA9PT0gJGV4dHJhVHlwZXMpIHsKJGV4dHJhVHlwZXMgPSAnJzsKaWYgKFBIUF9WRVJTSU9OX0lEID49IDgwMTAwIHx8IChkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSAmJiB2ZXJzaW9uX2NvbXBhcmUoSEhWTV9WRVJTSU9OLCAnMy4zJywgJz49JykpKSB7CiRleHRyYVR5cGVzIC49ICd8ZW51bSc7Cn0KCiRleHRyYVR5cGVzQXJyYXkgPSBhcnJheV9maWx0ZXIoZXhwbG9kZSgnfCcsICRleHRyYVR5cGVzKSwgZnVuY3Rpb24gKHN0cmluZyAkdHlwZSkgewpyZXR1cm4gJHR5cGUgIT09ICcnOwp9KTsKUGhwRmlsZUNsZWFuZXI6OnNldFR5cGVDb25maWcoYXJyYXlfbWVyZ2UoWydjbGFzcycsICdpbnRlcmZhY2UnLCAndHJhaXQnXSwgJGV4dHJhVHlwZXNBcnJheSkpOwp9CgpyZXR1cm4gJGV4dHJhVHlwZXM7Cn0KCgoKCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNSZWFkYWJsZShzdHJpbmcgJHBhdGgpCnsKaWYgKGlzX3JlYWRhYmxlKCRwYXRoKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKGlzX2ZpbGUoJHBhdGgpKSB7CnJldHVybiBmYWxzZSAhPT0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoLCBmYWxzZSwgbnVsbCwgMCwgMSk7Cn0KCgpyZXR1cm4gZmFsc2U7Cn0KfQp7CiAgICAicGFja2FnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJjb21wb3Nlci9jYS1idW5kbGUiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIxLjUuNiIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS41LjYuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY2EtYnVuZGxlLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImY2NWMyMzljOTcwZTdmMDcyZjA2N2FiNzg2NDZlOWYwYjI5MzUxNzUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9jb21wb3Nlci9jYS1idW5kbGUvemlwYmFsbC9mNjVjMjM5Yzk3MGU3ZjA3MmYwNjdhYjc4NjQ2ZTlmMGIyOTM1MTc1IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiZjY1YzIzOWM5NzBlN2YwNzJmMDY3YWI3ODY0NmU5ZjBiMjkzNTE3NSIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAiZXh0LW9wZW5zc2wiOiAiKiIsCiAgICAgICAgICAgICAgICAiZXh0LXBjcmUiOiAiKiIsCiAgICAgICAgICAgICAgICAicGhwIjogIl43LjIgfHwgXjguMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICJeMS4xMCIsCiAgICAgICAgICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIl44IHx8IF45IiwKICAgICAgICAgICAgICAgICJwc3IvbG9nIjogIl4xLjAgfHwgXjIuMCB8fCBeMy4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3Byb2Nlc3MiOiAiXjQuMCB8fCBeNS4wIHx8IF42LjAgfHwgXjcuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNS0wMy0wNlQxNDozMDo1NiswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICJkZXYtbWFpbiI6ICIxLngtZGV2IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJDb21wb3NlclxcQ2FCdW5kbGVcXCI6ICJzcmMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly9zZWxkLmJlIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGV0cyB5b3UgZmluZCBhIHBhdGggdG8gdGhlIHN5c3RlbSBDQSBidW5kbGUsIGFuZCBpbmNsdWRlcyBhIGZhbGxiYWNrIHRvIHRoZSBNb3ppbGxhIENBIGJ1bmRsZS4iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiY2FidW5kbGUiLAogICAgICAgICAgICAgICAgImNhY2VydCIsCiAgICAgICAgICAgICAgICAiY2VydGlmaWNhdGUiLAogICAgICAgICAgICAgICAgInNzbCIsCiAgICAgICAgICAgICAgICAidGxzIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpcmMiOiAiaXJjOi8vaXJjLmZyZWVub2RlLm9yZy9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jYS1idW5kbGUvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NhLWJ1bmRsZS90cmVlLzEuNS42IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vcGFja2FnaXN0LmNvbSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9jb21wb3Nlci9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi9jYS1idW5kbGUiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogImNvbXBvc2VyL2NsYXNzLW1hcC1nZW5lcmF0b3IiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIxLjYuMSIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS42LjEuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIxMzRiNzA1ZGRiMDAyNWQzOTdkODMxOGE3NTgyNWZlM2M5ZDFkYTM0IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci96aXBiYWxsLzEzNGI3MDVkZGIwMDI1ZDM5N2Q4MzE4YTc1ODI1ZmUzYzlkMWRhMzQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIxMzRiNzA1ZGRiMDAyNWQzOTdkODMxOGE3NTgyNWZlM2M5ZDFkYTM0IiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJjb21wb3Nlci9wY3JlIjogIl4yLjEgfHwgXjMuMSIsCiAgICAgICAgICAgICAgICAicGhwIjogIl43LjIgfHwgXjguMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9maW5kZXIiOiAiXjQuNCB8fCBeNS4zIHx8IF42IHx8IF43IgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuIjogIl4xLjEyIHx8IF4yIiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4tZGVwcmVjYXRpb24tcnVsZXMiOiAiXjEgfHwgXjIiLAogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3Rhbi1waHB1bml0IjogIl4xIHx8IF4yIiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4tc3RyaWN0LXJ1bGVzIjogIl4xLjEgfHwgXjIiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeOCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9maWxlc3lzdGVtIjogIl41LjQgfHwgXjYiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjUtMDMtMjRUMTM6NTA6NDQrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1haW4iOiAiMS54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiQ29tcG9zZXJcXENsYXNzTWFwR2VuZXJhdG9yXFwiOiAic3JjIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSm9yZGkgQm9nZ2lhbm8iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqLmJvZ2dpYW5vQHNlbGQuYmUiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3NlbGQuYmUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVdGlsaXRpZXMgdG8gc2NhbiBQSFAgY29kZSBhbmQgZ2VuZXJhdGUgY2xhc3MgbWFwcy4iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiY2xhc3NtYXAiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci9pc3N1ZXMiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci90cmVlLzEuNi4xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vcGFja2FnaXN0LmNvbSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9jb21wb3Nlci9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi9jbGFzcy1tYXAtZ2VuZXJhdG9yIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJjb21wb3Nlci9tZXRhZGF0YS1taW5pZmllciIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjAuMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJjNTQ5ZDIzODI5NTM2ZjBkMGU5ODRhYWFiYmYwMmFmOTFmNDQzMjA3IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvY29tcG9zZXIvbWV0YWRhdGEtbWluaWZpZXIvemlwYmFsbC9jNTQ5ZDIzODI5NTM2ZjBkMGU5ODRhYWFiYmYwMmFmOTFmNDQzMjA3IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiYzU0OWQyMzgyOTUzNmYwZDBlOTg0YWFhYmJmMDJhZjkxZjQ0MzIwNyIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIl41LjMuMiB8fCBeNy4wIHx8IF44LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJjb21wb3Nlci9jb21wb3NlciI6ICJeMiIsCiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuIjogIl4wLjEyLjU1IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BocHVuaXQtYnJpZGdlIjogIl40LjIgfHwgXjUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjEtMDQtMDdUMTM6Mzc6MzMrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1haW4iOiAiMS54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiQ29tcG9zZXJcXE1ldGFkYXRhTWluaWZpZXJcXCI6ICJzcmMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly9zZWxkLmJlIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU21hbGwgdXRpbGl0eSBsaWJyYXJ5IHRoYXQgaGFuZGxlcyBtZXRhZGF0YSBtaW5pZmljYXRpb24gYW5kIGV4cGFuc2lvbi4iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiY29tcG9zZXIiLAogICAgICAgICAgICAgICAgImNvbXByZXNzaW9uIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL21ldGFkYXRhLW1pbmlmaWVyL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci90cmVlLzEuMC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vcGFja2FnaXN0LmNvbSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9jb21wb3Nlci9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi9tZXRhZGF0YS1taW5pZmllciIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAiY29tcG9zZXIvcGNyZSIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMy4yIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIyLjMuMi4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9wY3JlLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImViYjgxZGY4ZjUyYjQwMTcyZDE0MDYyYWU5NmEwNjkzOWQ4MGEwNjkiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9jb21wb3Nlci9wY3JlL3ppcGJhbGwvZWJiODFkZjhmNTJiNDAxNzJkMTQwNjJhZTk2YTA2OTM5ZDgwYTA2OSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImViYjgxZGY4ZjUyYjQwMTcyZDE0MDYyYWU5NmEwNjkzOWQ4MGEwNjkiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICJeNy4yIHx8IF44LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjb25mbGljdCI6IHsKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiPDEuMTEuMTAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiXjEuMTIgfHwgXjIiLAogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3Rhbi1zdHJpY3QtcnVsZXMiOiAiXjEgfHwgXjIiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeOCB8fCBeOSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNC0xMS0xMlQxNjoyNDo0NyswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAicGhwc3RhbiI6IHsKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb24ubmVvbiIKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1haW4iOiAiMi54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiQ29tcG9zZXJcXFBjcmVcXCI6ICJzcmMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly9zZWxkLmJlIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUENSRSB3cmFwcGluZyBsaWJyYXJ5IHRoYXQgb2ZmZXJzIHR5cGUtc2FmZSBwcmVnXyogcmVwbGFjZW1lbnRzLiIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJQQ1JFIiwKICAgICAgICAgICAgICAgICJwcmVnIiwKICAgICAgICAgICAgICAgICJyZWdleCIsCiAgICAgICAgICAgICAgICAicmVndWxhciBleHByZXNzaW9uIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3BjcmUvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3BjcmUvdHJlZS8yLjMuMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3BhY2thZ2lzdC5jb20iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3QvY29tcG9zZXIvY29tcG9zZXIiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4vcGNyZSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAiY29tcG9zZXIvc2VtdmVyIiwKICAgICAgICAgICAgInZlcnNpb24iOiAiMy40LjMiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjMuNC4zLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3NlbXZlci5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI0MzEzZDI2YWRhNWUwYzRlZGZiZDFkYzQ4MWE5MmZmN2JmZjkxZjEyIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvY29tcG9zZXIvc2VtdmVyL3ppcGJhbGwvNDMxM2QyNmFkYTVlMGM0ZWRmYmQxZGM0ODFhOTJmZjdiZmY5MWYxMiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjQzMTNkMjZhZGE1ZTBjNGVkZmJkMWRjNDgxYTkyZmY3YmZmOTFmMTIiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICJeNS4zLjIgfHwgXjcuMCB8fCBeOC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuIjogIl4xLjExIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BocHVuaXQtYnJpZGdlIjogIl4zIHx8IF43IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA5LTE5VDE0OjE1OjIxKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi1tYWluIjogIjMueC1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIkNvbXBvc2VyXFxTZW12ZXJcXCI6ICJzcmMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJOaWxzIEFkZXJtYW5uIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAibmFkZXJtYW5AbmFkZXJtYW4uZGUiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwOi8vd3d3Lm5hZGVybWFuLmRlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly9zZWxkLmJlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJSb2IgQmFzdCIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInJvYi5iYXN0QGdtYWlsLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly9yb2JiYXN0Lm5sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VtdmVyIGxpYnJhcnkgdGhhdCBvZmZlcnMgdXRpbGl0aWVzLCB2ZXJzaW9uIGNvbnN0cmFpbnQgcGFyc2luZyBhbmQgdmFsaWRhdGlvbi4iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAic2VtYW50aWMiLAogICAgICAgICAgICAgICAgInNlbXZlciIsCiAgICAgICAgICAgICAgICAidmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAidmVyc2lvbmluZyIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAiaXJjIjogImlyY3M6Ly9pcmMubGliZXJhLmNoYXQ6NjY5Ny9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9zZW12ZXIvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3NlbXZlci90cmVlLzMuNC4zIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vcGFja2FnaXN0LmNvbSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9jb21wb3Nlci9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi9zZW12ZXIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogImNvbXBvc2VyL3NwZHgtbGljZW5zZXMiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIxLjUuOSIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS41LjkuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvc3BkeC1saWNlbnNlcy5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJlZGYzNjRjZWZlOGM0MzUwMWUyMWU4ODExMGFhYzEwYjI4NGMzYzlmIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvY29tcG9zZXIvc3BkeC1saWNlbnNlcy96aXBiYWxsL2VkZjM2NGNlZmU4YzQzNTAxZTIxZTg4MTEwYWFjMTBiMjg0YzNjOWYiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJlZGYzNjRjZWZlOGM0MzUwMWUyMWU4ODExMGFhYzEwYjI4NGMzYzlmIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiXjUuMy4yIHx8IF43LjAgfHwgXjguMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICJeMS4xMSIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9waHB1bml0LWJyaWRnZSI6ICJeMyB8fCBeNyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNS0wNS0xMlQyMTowNzowNyswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICJkZXYtbWFpbiI6ICIxLngtZGV2IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJDb21wb3NlclxcU3BkeFxcIjogInNyYyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk5pbHMgQWRlcm1hbm4iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJuYWRlcm1hbkBuYWRlcm1hbi5kZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly93d3cubmFkZXJtYW4uZGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkpvcmRpIEJvZ2dpYW5vIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiai5ib2dnaWFub0BzZWxkLmJlIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3NlbGQuYmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlJvYiBCYXN0IiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicm9iLmJhc3RAZ21haWwuY29tIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3JvYmJhc3QubmwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTUERYIGxpY2Vuc2VzIGxpc3QgYW5kIHZhbGlkYXRpb24gbGlicmFyeS4iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAibGljZW5zZSIsCiAgICAgICAgICAgICAgICAic3BkeCIsCiAgICAgICAgICAgICAgICAidmFsaWRhdG9yIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpcmMiOiAiaXJjczovL2lyYy5saWJlcmEuY2hhdDo2Njk3L2NvbXBvc2VyIiwKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3NwZHgtbGljZW5zZXMvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3NwZHgtbGljZW5zZXMvdHJlZS8xLjUuOSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3BhY2thZ2lzdC5jb20iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3QvY29tcG9zZXIvY29tcG9zZXIiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4vc3BkeC1saWNlbnNlcyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAiY29tcG9zZXIveGRlYnVnLWhhbmRsZXIiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuNSIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMy4wLjUuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIveGRlYnVnLWhhbmRsZXIuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNmMxOTI1NTYxNjMyZTgzZDYwYTQ0NDkyZTBiMzQ0Y2Y0OGFiODVlZiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyL3ppcGJhbGwvNmMxOTI1NTYxNjMyZTgzZDYwYTQ0NDkyZTBiMzQ0Y2Y0OGFiODVlZiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjZjMTkyNTU2MTYzMmU4M2Q2MGE0NDQ5MmUwYjM0NGNmNDhhYjg1ZWYiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgImNvbXBvc2VyL3BjcmUiOiAiXjEgfHwgXjIgfHwgXjMiLAogICAgICAgICAgICAgICAgInBocCI6ICJeNy4yLjUgfHwgXjguMCIsCiAgICAgICAgICAgICAgICAicHNyL2xvZyI6ICJeMSB8fCBeMiB8fCBeMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICJeMS4wIiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4tc3RyaWN0LXJ1bGVzIjogIl4xLjEiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeOC41IHx8IF45LjYgfHwgXjEwLjUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMDUtMDZUMTY6Mzc6MTYrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiQ29tcG9zZXJcXFhkZWJ1Z0hhbmRsZXJcXCI6ICJzcmMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb2huIFN0ZXZlbnNvbiIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImpvaG4tc3RldmVuc29uQGJsdWV5b25kZXIuY28udWsiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZXN0YXJ0cyBhIHByb2Nlc3Mgd2l0aG91dCBYZGVidWcuIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgIlhkZWJ1ZyIsCiAgICAgICAgICAgICAgICAicGVyZm9ybWFuY2UiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlyYyI6ICJpcmNzOi8vaXJjLmxpYmVyYS5jaGF0OjY2OTcvY29tcG9zZXIiLAogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIveGRlYnVnLWhhbmRsZXIvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyL3RyZWUvMy4wLjUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3QuY29tIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L2NvbXBvc2VyL2NvbXBvc2VyIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuL3hkZWJ1Zy1oYW5kbGVyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJqdXN0aW5yYWluYm93L2pzb24tc2NoZW1hIiwKICAgICAgICAgICAgInZlcnNpb24iOiAiNi40LjEiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjYuNC4xLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2pzb25yYWluYm93L2pzb24tc2NoZW1hLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjM1ZDI2MmM5NDk1OTU3MWU4NzM2ZGIxZTVjOWJjMzZhYjk0YWU5MDAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9qc29ucmFpbmJvdy9qc29uLXNjaGVtYS96aXBiYWxsLzM1ZDI2MmM5NDk1OTU3MWU4NzM2ZGIxZTVjOWJjMzZhYjk0YWU5MDAiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIzNWQyNjJjOTQ5NTk1NzFlODczNmRiMWU1YzliYzM2YWI5NGFlOTAwIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJleHQtanNvbiI6ICIqIiwKICAgICAgICAgICAgICAgICJtYXJjLW1hYmUvcGhwLWVudW0iOiAiXjQuMCIsCiAgICAgICAgICAgICAgICAicGhwIjogIl43LjIgfHwgXjguMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgImZyaWVuZHNvZnBocC9waHAtY3MtZml4ZXIiOiAiMy4zLjAiLAogICAgICAgICAgICAgICAgImpzb24tc2NoZW1hL2pzb24tc2NoZW1hLXRlc3Qtc3VpdGUiOiAiMS4yLjAiLAogICAgICAgICAgICAgICAgIm1hcmMtbWFiZS9waHAtZW51bS1waHBzdGFuIjogIl4yLjAiLAogICAgICAgICAgICAgICAgInBocHNwZWMvcHJvcGhlY3kiOiAiXjEuMTkiLAogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICJeMS4xMiIsCiAgICAgICAgICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIl44LjUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjUtMDQtMDRUMTM6MDg6MDcrMDA6MDAiLAogICAgICAgICAgICAiYmluIjogWwogICAgICAgICAgICAgICAgImJpbi92YWxpZGF0ZS1qc29uIgogICAgICAgICAgICBdLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1hc3RlciI6ICI2LngtZGV2IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJKc29uU2NoZW1hXFwiOiAic3JjL0pzb25TY2hlbWEvIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiQnJ1bm8gUHJpZXRvIFJlaXMiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJicnVuby5wLnJlaXNAZ21haWwuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKdXN0aW4gUmFpbmJvdyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImp1c3Rpbi5yYWluYm93QGdtYWlsLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSWdvciBXaWVkbGVyIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiaWdvckB3aWVkbGVyLmNoIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJSb2JlcnQgU2Now7ZudGhhbCIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInNlcm9zY2hvQGdvb2dsZW1haWwuY29tIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaWJyYXJ5IHRvIHZhbGlkYXRlIGEganNvbiBzY2hlbWEuIiwKICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9qc29ucmFpbmJvdy9qc29uLXNjaGVtYSIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJqc29uIiwKICAgICAgICAgICAgICAgICJzY2hlbWEiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vanNvbnJhaW5ib3cvanNvbi1zY2hlbWEvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL2pzb25yYWluYm93L2pzb24tc2NoZW1hL3RyZWUvNi40LjEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAibWFyYy1tYWJlL3BocC1lbnVtIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjQuNy4xIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICI0LjcuMS4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9tYXJjLW1hYmUvcGhwLWVudW0uZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNzE1OTgwOWU1Y2ZhMDQxZGNhMjhlNjFmN2Y3YWU1ODA2M2FhZThlZCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21hcmMtbWFiZS9waHAtZW51bS96aXBiYWxsLzcxNTk4MDllNWNmYTA0MWRjYTI4ZTYxZjdmN2FlNTgwNjNhYWU4ZWQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI3MTU5ODA5ZTVjZmEwNDFkY2EyOGU2MWY3ZjdhZTU4MDYzYWFlOGVkIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJleHQtcmVmbGVjdGlvbiI6ICIqIiwKICAgICAgICAgICAgICAgICJwaHAiOiAiXjcuMSB8IF44LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJwaHBiZW5jaC9waHBiZW5jaCI6ICJeMC4xNi4xMCB8fCBeMS4wLjQiLAogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICJeMS4zLjEiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeNy41LjIwIHwgXjguNS4yMiB8IF45LjUuMTEiLAogICAgICAgICAgICAgICAgInZpbWVvL3BzYWxtIjogIl40LjE3LjAgfCBeNS4yNi4xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTExLTI4VDA0OjU0OjQ0KzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi0zLngiOiAiMy4yLWRldiIsCiAgICAgICAgICAgICAgICAgICAgImRldi1tYXN0ZXIiOiAiNC43LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiTWFiZUVudW1cXCI6ICJzcmMvIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjbGFzc21hcCI6IFsKICAgICAgICAgICAgICAgICAgICAic3R1YnMvU3RyaW5nYWJsZS5waHAiCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiQlNELTMtQ2xhdXNlIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJNYXJjIEJlbm5ld2l0eiIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImRldkBtYWJlLmJlcmxpbiIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vbWFiZS5iZXJsaW4vIiwKICAgICAgICAgICAgICAgICAgICAicm9sZSI6ICJMZWFkIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2ltcGxlIGFuZCBmYXN0IGltcGxlbWVudGF0aW9uIG9mIGVudW1lcmF0aW9ucyB3aXRoIG5hdGl2ZSBQSFAiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL21hcmMtbWFiZS9waHAtZW51bSIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJlbnVtIiwKICAgICAgICAgICAgICAgICJlbnVtLW1hcCIsCiAgICAgICAgICAgICAgICAiZW51bS1zZXQiLAogICAgICAgICAgICAgICAgImVudW1lcmF0aW9uIiwKICAgICAgICAgICAgICAgICJlbnVtZXJhdG9yIiwKICAgICAgICAgICAgICAgICJlbnVtbWFwIiwKICAgICAgICAgICAgICAgICJlbnVtc2V0IiwKICAgICAgICAgICAgICAgICJtYXAiLAogICAgICAgICAgICAgICAgInNldCIsCiAgICAgICAgICAgICAgICAidHlwZSIsCiAgICAgICAgICAgICAgICAidHlwZS1oaW50IiwKICAgICAgICAgICAgICAgICJ0eXBlaGludCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vZ2l0aHViLmNvbS9tYXJjLW1hYmUvcGhwLWVudW0vaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL21hcmMtbWFiZS9waHAtZW51bS90cmVlL3Y0LjcuMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9tYXJjLW1hYmUvcGhwLWVudW0iCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInBzci9jb250YWluZXIiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS4xLjEuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vcGhwLWZpZy9jb250YWluZXIuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiODYyMjU2NzQwOTAxMDI4MmI3YWVlYmU0YmI4NDFmZTk4YjU4ZGNhZiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3BocC1maWcvY29udGFpbmVyL3ppcGJhbGwvODYyMjU2NzQwOTAxMDI4MmI3YWVlYmU0YmI4NDFmZTk4YjU4ZGNhZiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjg2MjI1Njc0MDkwMTAyODJiN2FlZWJlNGJiODQxZmU5OGI1OGRjYWYiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDIxLTAzLTA1VDE3OjM2OjA2KzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlBzclxcQ29udGFpbmVyXFwiOiAic3JjLyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlBIUC1GSUciLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3d3dy5waHAtZmlnLm9yZy8iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJDb21tb24gQ29udGFpbmVyIEludGVyZmFjZSAoUEhQIEZJRyBQU1ItMTEpIiwKICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9waHAtZmlnL2NvbnRhaW5lciIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJQU1ItMTEiLAogICAgICAgICAgICAgICAgImNvbnRhaW5lciIsCiAgICAgICAgICAgICAgICAiY29udGFpbmVyLWludGVyZmFjZSIsCiAgICAgICAgICAgICAgICAiY29udGFpbmVyLWludGVyb3AiLAogICAgICAgICAgICAgICAgInBzciIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vZ2l0aHViLmNvbS9waHAtZmlnL2NvbnRhaW5lci9pc3N1ZXMiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vcGhwLWZpZy9jb250YWluZXIvdHJlZS8xLjEuMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9wc3IvY29udGFpbmVyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJwc3IvbG9nIiwKICAgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjQiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMS40LjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3BocC1maWcvbG9nLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImQ0OTY5NWI5MDljM2I3NjI4YjYyODlkYjU0NzlhMWMyMDQ2MDFmMTEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9waHAtZmlnL2xvZy96aXBiYWxsL2Q0OTY5NWI5MDljM2I3NjI4YjYyODlkYjU0NzlhMWMyMDQ2MDFmMTEiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJkNDk2OTViOTA5YzNiNzYyOGI2Mjg5ZGI1NDc5YTFjMjA0NjAxZjExIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj01LjMuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyMS0wNS0wM1QxMToyMDoyNyswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICJkZXYtbWFzdGVyIjogIjEuMS54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiUHNyXFxMb2dcXCI6ICJQc3IvTG9nLyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlBIUC1GSUciLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3d3dy5waHAtZmlnLm9yZy8iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJDb21tb24gaW50ZXJmYWNlIGZvciBsb2dnaW5nIGxpYnJhcmllcyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL2dpdGh1Yi5jb20vcGhwLWZpZy9sb2ciLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAibG9nIiwKICAgICAgICAgICAgICAgICJwc3IiLAogICAgICAgICAgICAgICAgInBzci0zIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3BocC1maWcvbG9nL3RyZWUvMS4xLjQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vcHNyL2xvZyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAicmVhY3QvcHJvbWlzZSIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInYzLjIuMCIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMy4yLjAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vcmVhY3RwaHAvcHJvbWlzZS5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI4YTE2NDY0MzMxM2M3MTM1NDU4MmRjODUwYjQyYjMzZmExMmE0YjYzIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvcmVhY3RwaHAvcHJvbWlzZS96aXBiYWxsLzhhMTY0NjQzMzEzYzcxMzU0NTgyZGM4NTBiNDJiMzNmYTEyYTRiNjMiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI4YTE2NDY0MzMxM2M3MTM1NDU4MmRjODUwYjQyYjMzZmExMmE0YjYzIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjEuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICIxLjEwLjM5IHx8IDEuNC4xMCIsCiAgICAgICAgICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIl45LjYgfHwgXjcuNSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNC0wNS0yNFQxMDozOTowNSswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgImZpbGVzIjogWwogICAgICAgICAgICAgICAgICAgICJzcmMvZnVuY3Rpb25zX2luY2x1ZGUucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiUmVhY3RcXFByb21pc2VcXCI6ICJzcmMvIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSmFuIFNvcmdhbGxhIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAianNvcmdhbGxhQGdtYWlsLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc29yZ2FsbGEuY29tLyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiQ2hyaXN0aWFuIEzDvGNrIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiY2hyaXN0aWFuQGNsdWUuZW5naW5lZXJpbmciLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL2NsdWUuZW5naW5lZXJpbmcvIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJDZWVzLUphbiBLaWV3aWV0IiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicmVhY3RwaHBAY2Vlc2phbmtpZXdpZXQubmwiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3d5cmloYXhpbXVzLm5ldC8iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkNocmlzIEJvZGVuIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiY2JvZGVuQGdtYWlsLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vY2JvZGVuLmRldi8iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpZ2h0d2VpZ2h0IGltcGxlbWVudGF0aW9uIG9mIENvbW1vbkpTIFByb21pc2VzL0EgZm9yIFBIUCIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJwcm9taXNlIiwKICAgICAgICAgICAgICAgICJwcm9taXNlcyIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdHBocC9wcm9taXNlL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdHBocC9wcm9taXNlL3RyZWUvdjMuMi4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL3JlYWN0cGhwIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvcGVuX2NvbGxlY3RpdmUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vcmVhY3QvcHJvbWlzZSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic2VsZC9qc29ubGludCIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMTEuMCIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS4xMS4wLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsvanNvbmxpbnQuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMTc0OGFhZjg0N2ZjNzMxY2ZhZDc3MjVhZWM0MTNlZTQ2ZjBjYzNhMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL1NlbGRhZWsvanNvbmxpbnQvemlwYmFsbC8xNzQ4YWFmODQ3ZmM3MzFjZmFkNzcyNWFlYzQxM2VlNDZmMGNjM2EyIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMTc0OGFhZjg0N2ZjNzMxY2ZhZDc3MjVhZWM0MTNlZTQ2ZjBjYzNhMiIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIl41LjMgfHwgXjcuMCB8fCBeOC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuIjogIl4xLjExIiwKICAgICAgICAgICAgICAgICJwaHB1bml0L3BocHVuaXQiOiAiXjQuOC4zNSB8fCBeNS43IHx8IF42LjAgfHwgXjguNS4xMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNC0wNy0xMVQxNDo1NTo0NSswMDowMCIsCiAgICAgICAgICAgICJiaW4iOiBbCiAgICAgICAgICAgICAgICAiYmluL2pzb25saW50IgogICAgICAgICAgICBdLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU2VsZFxcSnNvbkxpbnRcXCI6ICJzcmMvU2VsZC9Kc29uTGludC8iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc2VsZC5iZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkpTT04gTGludGVyIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImpzb24iLAogICAgICAgICAgICAgICAgImxpbnRlciIsCiAgICAgICAgICAgICAgICAicGFyc2VyIiwKICAgICAgICAgICAgICAgICJ2YWxpZGF0b3IiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vU2VsZGFlay9qc29ubGludC9pc3N1ZXMiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vU2VsZGFlay9qc29ubGludC90cmVlLzEuMTEuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vU2VsZGFlayIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zZWxkL2pzb25saW50IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zZWxkL2pzb25saW50IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzZWxkL3BoYXItdXRpbHMiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMSIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS4yLjEuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vU2VsZGFlay9waGFyLXV0aWxzLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImVhMmY0MDE0ZjE2M2MxYmU0YzYwMWI5YjdiZDZhZjgxYmE4ZDcwMWMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9TZWxkYWVrL3BoYXItdXRpbHMvemlwYmFsbC9lYTJmNDAxNGYxNjNjMWJlNGM2MDFiOWI3YmQ2YWY4MWJhOGQ3MDFjIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiZWEyZjQwMTRmMTYzYzFiZTRjNjAxYjliN2JkNmFmODFiYThkNzAxYyIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49NS4zIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDIyLTA4LTMxVDEwOjMxOjE4KzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi1tYXN0ZXIiOiAiMS54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU2VsZFxcUGhhclV0aWxzXFwiOiAic3JjLyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkpvcmRpIEJvZ2dpYW5vIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiai5ib2dnaWFub0BzZWxkLmJlIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUEhBUiBmaWxlIGZvcm1hdCB1dGlsaXRpZXMsIGZvciB3aGVuIFBIUCBwaGFycyB5b3UgdXAiLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAicGhhciIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vZ2l0aHViLmNvbS9TZWxkYWVrL3BoYXItdXRpbHMvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsvcGhhci11dGlscy90cmVlLzEuMi4xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3NlbGQvcGhhci11dGlscyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic2VsZC9zaWduYWwtaGFuZGxlciIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4yIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIyLjAuMi4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9TZWxkYWVrL3NpZ25hbC1oYW5kbGVyLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjA0YTYxMTJlODgzYWQ3NmMwYWRhOGU0YTlmNzUyMGJiZmRiNmJiOTgiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9TZWxkYWVrL3NpZ25hbC1oYW5kbGVyL3ppcGJhbGwvMDRhNjExMmU4ODNhZDc2YzBhZGE4ZTRhOWY3NTIwYmJmZGI2YmI5OCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjA0YTYxMTJlODgzYWQ3NmMwYWRhOGU0YTlmNzUyMGJiZmRiNmJiOTgiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuIjogIl4xIiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4tZGVwcmVjYXRpb24tcnVsZXMiOiAiXjEuMCIsCiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuLXBocHVuaXQiOiAiXjEiLAogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3Rhbi1zdHJpY3QtcnVsZXMiOiAiXjEuMyIsCiAgICAgICAgICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIl43LjUuMjAgfHwgXjguNS4yMyIsCiAgICAgICAgICAgICAgICAicHNyL2xvZyI6ICJeMSB8fCBeMiB8fCBeMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyMy0wOS0wM1QwOToyNDowMCswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICJkZXYtbWFpbiI6ICIyLngtZGV2IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTZWxkXFxTaWduYWxcXCI6ICJzcmMvIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSm9yZGkgQm9nZ2lhbm8iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqLmJvZ2dpYW5vQHNlbGQuYmUiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwOi8vc2VsZC5iZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNpbXBsZSB1bml4IHNpZ25hbCBoYW5kbGVyIHRoYXQgc2lsZW50bHkgZmFpbHMgd2hlcmUgc2lnbmFscyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgZWFzeSBjcm9zcy1wbGF0Zm9ybSBkZXZlbG9wbWVudCIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJwb3NpeCIsCiAgICAgICAgICAgICAgICAic2lnaW50IiwKICAgICAgICAgICAgICAgICJzaWduYWwiLAogICAgICAgICAgICAgICAgInNpZ3Rlcm0iLAogICAgICAgICAgICAgICAgInVuaXgiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vU2VsZGFlay9zaWduYWwtaGFuZGxlci9pc3N1ZXMiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vU2VsZGFlay9zaWduYWwtaGFuZGxlci90cmVlLzIuMC4yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3NlbGQvc2lnbmFsLWhhbmRsZXIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvY29uc29sZSIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInY1LjQuNDciLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjUuNC40Ny4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L2NvbnNvbGUuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiYzRiYTk4MGNhNjFhOWViMThlZTZiY2M3M2YyOGU0NzU4NTJiYjFlZCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvY29uc29sZS96aXBiYWxsL2M0YmE5ODBjYTYxYTllYjE4ZWU2YmNjNzNmMjhlNDc1ODUyYmIxZWQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJjNGJhOTgwY2E2MWE5ZWIxOGVlNmJjYzczZjI4ZTQ3NTg1MmJiMWVkIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIuNSIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMiOiAiXjIuMXxeMyIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZyI6ICJ+MS4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLXBocDczIjogIl4xLjkiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtcGhwODAiOiAiXjEuMTYiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvc2VydmljZS1jb250cmFjdHMiOiAiXjEuMXxeMnxeMyIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9zdHJpbmciOiAiXjUuMXxeNi4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiY29uZmxpY3QiOiB7CiAgICAgICAgICAgICAgICAicHNyL2xvZyI6ICI+PTMiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZGVwZW5kZW5jeS1pbmplY3Rpb24iOiAiPDQuNCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9kb3RlbnYiOiAiPDUuMSIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9ldmVudC1kaXNwYXRjaGVyIjogIjw0LjQiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvbG9jayI6ICI8NC40IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3Byb2Nlc3MiOiAiPDQuNCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInByb3ZpZGUiOiB7CiAgICAgICAgICAgICAgICAicHNyL2xvZy1pbXBsZW1lbnRhdGlvbiI6ICIxLjB8Mi4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAicHNyL2xvZyI6ICJeMXxeMiIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9jb25maWciOiAiXjQuNHxeNS4wfF42LjAiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZGVwZW5kZW5jeS1pbmplY3Rpb24iOiAiXjQuNHxeNS4wfF42LjAiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZXZlbnQtZGlzcGF0Y2hlciI6ICJeNC40fF41LjB8XjYuMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9sb2NrIjogIl40LjR8XjUuMHxeNi4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3Byb2Nlc3MiOiAiXjQuNHxeNS4wfF42LjAiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvdmFyLWR1bXBlciI6ICJeNC40fF41LjB8XjYuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN1Z2dlc3QiOiB7CiAgICAgICAgICAgICAgICAicHNyL2xvZyI6ICJGb3IgdXNpbmcgdGhlIGNvbnNvbGUgbG9nZ2VyIiwKICAgICAgICAgICAgICAgICJzeW1mb255L2V2ZW50LWRpc3BhdGNoZXIiOiAiIiwKICAgICAgICAgICAgICAgICJzeW1mb255L2xvY2siOiAiIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3Byb2Nlc3MiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTExLTA2VDExOjMwOjU1KzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXENvbXBvbmVudFxcQ29uc29sZVxcIjogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZS1mcm9tLWNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICIvVGVzdHMvIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiRmFiaWVuIFBvdGVuY2llciIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImZhYmllbkBzeW1mb255LmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVhc2VzIHRoZSBjcmVhdGlvbiBvZiBiZWF1dGlmdWwgYW5kIHRlc3RhYmxlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2VzIiwKICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiY2xpIiwKICAgICAgICAgICAgICAgICJjb21tYW5kLWxpbmUiLAogICAgICAgICAgICAgICAgImNvbnNvbGUiLAogICAgICAgICAgICAgICAgInRlcm1pbmFsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvY29uc29sZS90cmVlL3Y1LjQuNDciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvY29uc29sZSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2Mi41LjQiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjIuNS40LjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjYwNTM4OWYyYTdlNTYyNWYyNzNiNTM5NjBkYzQ2YWVhZjljNjI5MTgiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cy96aXBiYWxsLzYwNTM4OWYyYTdlNTYyNWYyNzNiNTM5NjBkYzQ2YWVhZjljNjI5MTgiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI2MDUzODlmMmE3ZTU2MjVmMjczYjUzOTYwZGM0NmFlYWY5YzYyOTE4IiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMDktMjVUMTQ6MTE6MTMrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgInRoYW5rcyI6IHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L2NvbnRyYWN0cyIsCiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9jb250cmFjdHMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1haW4iOiAiMi41LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJmaWxlcyI6IFsKICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24ucGhwIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmljb2xhcyBHcmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJwQHRjaHdvcmsuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBnZW5lcmljIGZ1bmN0aW9uIGFuZCBjb252ZW50aW9uIHRvIHRyaWdnZXIgZGVwcmVjYXRpb24gbm90aWNlcyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cy90cmVlL3YyLjUuNCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvZmlsZXN5c3RlbSIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInY1LjQuNDUiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjUuNC40NS4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L2ZpbGVzeXN0ZW0uZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNTdjODI5NGVkMzdkNGEwNTViNzcwNTc4MjdjNjdmOTU1OGM5NWM1NCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvZmlsZXN5c3RlbS96aXBiYWxsLzU3YzgyOTRlZDM3ZDRhMDU1Yjc3MDU3ODI3YzY3Zjk1NThjOTVjNTQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI1N2M4Mjk0ZWQzN2Q0YTA1NWI3NzA1NzgyN2M2N2Y5NTU4Yzk1YzU0IiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIuNSIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wb2x5ZmlsbC1jdHlwZSI6ICJ+MS44IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nIjogIn4xLjgiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtcGhwODAiOiAiXjEuMTYiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJzeW1mb255L3Byb2Nlc3MiOiAiXjUuNHxeNi40IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTEwLTIyVDEzOjA1OjM1KzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXENvbXBvbmVudFxcRmlsZXN5c3RlbVxcIjogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZS1mcm9tLWNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICIvVGVzdHMvIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiRmFiaWVuIFBvdGVuY2llciIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImZhYmllbkBzeW1mb255LmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGJhc2ljIHV0aWxpdGllcyBmb3IgdGhlIGZpbGVzeXN0ZW0iLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9maWxlc3lzdGVtL3RyZWUvdjUuNC40NSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9maWxlc3lzdGVtIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L2ZpbmRlciIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInY1LjQuNDUiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjUuNC40NS4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L2ZpbmRlci5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI2Mzc0MTc4NGNkN2I5OTY3OTc1ZWVjNjEwYjI1NmVlZDNlZGUwMjJiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9maW5kZXIvemlwYmFsbC82Mzc0MTc4NGNkN2I5OTY3OTc1ZWVjNjEwYjI1NmVlZDNlZGUwMjJiIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNjM3NDE3ODRjZDdiOTk2Nzk3NWVlYzYxMGIyNTZlZWQzZWRlMDIyYiIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yLjUiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzIjogIl4yLjF8XjMiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtcGhwODAiOiAiXjEuMTYiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMDktMjhUMTM6MzI6MDgrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU3ltZm9ueVxcQ29tcG9uZW50XFxGaW5kZXJcXCI6ICIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUtZnJvbS1jbGFzc21hcCI6IFsKICAgICAgICAgICAgICAgICAgICAiL1Rlc3RzLyIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkZhYmllbiBQb3RlbmNpZXIiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJmYWJpZW5Ac3ltZm9ueS5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaW5kcyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdmlhIGFuIGludHVpdGl2ZSBmbHVlbnQgaW50ZXJmYWNlIiwKICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20iLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvZmluZGVyL3RyZWUvdjUuNC40NSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9maW5kZXIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwtY3R5cGUiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2MS4zMi4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjMyLjAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZS5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJhM2NjOGIwNDRhNmVhNTEzMzEwY2JkNDhlZjczMzNiMzg0OTQ1NjM4IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZS96aXBiYWxsL2EzY2M4YjA0NGE2ZWE1MTMzMTBjYmQ0OGVmNzMzM2IzODQ5NDU2MzgiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJhM2NjOGIwNDRhNmVhNTEzMzEwY2JkNDhlZjczMzNiMzg0OTQ1NjM4IiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcm92aWRlIjogewogICAgICAgICAgICAgICAgImV4dC1jdHlwZSI6ICIqIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic3VnZ2VzdCI6IHsKICAgICAgICAgICAgICAgICJleHQtY3R5cGUiOiAiRm9yIGJlc3QgcGVyZm9ybWFuY2UiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMDktMDlUMTE6NDU6MTArMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgInRoYW5rcyI6IHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsIiwKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgImZpbGVzIjogWwogICAgICAgICAgICAgICAgICAgICJib290c3RyYXAucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU3ltZm9ueVxcUG9seWZpbGxcXEN0eXBlXFwiOiAiIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiR2VydCBkZSBQYWd0ZXIiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJCYWNrRW5kVGVhQGdtYWlsLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN5bWZvbnkgcG9seWZpbGwgZm9yIGN0eXBlIGZ1bmN0aW9ucyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNvbXBhdGliaWxpdHkiLAogICAgICAgICAgICAgICAgImN0eXBlIiwKICAgICAgICAgICAgICAgICJwb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAicG9ydGFibGUiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZS90cmVlL3YxLjMyLjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZSIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInYxLjMyLjAiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMzIuMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiYjkxMjM5MjZlM2I3YmMyZjk4YzAyYWQ1NGY2YTRiMDJiOTFhOGFiZSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZS96aXBiYWxsL2I5MTIzOTI2ZTNiN2JjMmY5OGMwMmFkNTRmNmE0YjAyYjkxYThhYmUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJiOTEyMzkyNmUzYjdiYzJmOThjMDJhZDU0ZjZhNGIwMmI5MWE4YWJlIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzdWdnZXN0IjogewogICAgICAgICAgICAgICAgImV4dC1pbnRsIjogIkZvciBiZXN0IHBlcmZvcm1hbmNlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA5LTA5VDExOjQ1OjEwKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJ0aGFua3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJmaWxlcyI6IFsKICAgICAgICAgICAgICAgICAgICAiYm9vdHN0cmFwLnBocCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxHcmFwaGVtZVxcIjogIiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk5pY29sYXMgR3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicEB0Y2h3b3JrLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN5bWZvbnkgcG9seWZpbGwgZm9yIGludGwncyBncmFwaGVtZV8qIGZ1bmN0aW9ucyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNvbXBhdGliaWxpdHkiLAogICAgICAgICAgICAgICAgImdyYXBoZW1lIiwKICAgICAgICAgICAgICAgICJpbnRsIiwKICAgICAgICAgICAgICAgICJwb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAicG9ydGFibGUiLAogICAgICAgICAgICAgICAgInNoaW0iCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lL3RyZWUvdjEuMzIuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplciIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInYxLjMyLjAiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMzIuMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIzODMzZDcyNTVjYzMwMzU0NjQzNWNiNjUwMzE2YmZmNzA4YTFjNzVjIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvemlwYmFsbC8zODMzZDcyNTVjYzMwMzU0NjQzNWNiNjUwMzE2YmZmNzA4YTFjNzVjIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMzgzM2Q3MjU1Y2MzMDM1NDY0MzVjYjY1MDMxNmJmZjcwOGExYzc1YyIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic3VnZ2VzdCI6IHsKICAgICAgICAgICAgICAgICJleHQtaW50bCI6ICJGb3IgYmVzdCBwZXJmb3JtYW5jZSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNC0wOS0wOVQxMTo0NToxMCswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAidGhhbmtzIjogewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwiLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAiZmlsZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImJvb3RzdHJhcC5waHAiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxQb2x5ZmlsbFxcSW50bFxcTm9ybWFsaXplclxcIjogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2xhc3NtYXAiOiBbCiAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlcy9zdHVicyIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk5pY29sYXMgR3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicEB0Y2h3b3JrLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN5bWZvbnkgcG9seWZpbGwgZm9yIGludGwncyBOb3JtYWxpemVyIGNsYXNzIGFuZCByZWxhdGVkIGZ1bmN0aW9ucyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNvbXBhdGliaWxpdHkiLAogICAgICAgICAgICAgICAgImludGwiLAogICAgICAgICAgICAgICAgIm5vcm1hbGl6ZXIiLAogICAgICAgICAgICAgICAgInBvbHlmaWxsIiwKICAgICAgICAgICAgICAgICJwb3J0YWJsZSIsCiAgICAgICAgICAgICAgICAic2hpbSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci90cmVlL3YxLjMyLjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjEuMzIuMCIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS4zMi4wLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNmQ4NTdmNGQ3NmJkNGIzNDNlYWMyNmQ2YjUzOTU4NWQyYmM1NjQ5MyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvemlwYmFsbC82ZDg1N2Y0ZDc2YmQ0YjM0M2VhYzI2ZDZiNTM5NTg1ZDJiYzU2NDkzIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNmQ4NTdmNGQ3NmJkNGIzNDNlYWMyNmQ2YjUzOTU4NWQyYmM1NjQ5MyIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAiZXh0LWljb252IjogIioiLAogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInByb3ZpZGUiOiB7CiAgICAgICAgICAgICAgICAiZXh0LW1ic3RyaW5nIjogIioiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzdWdnZXN0IjogewogICAgICAgICAgICAgICAgImV4dC1tYnN0cmluZyI6ICJGb3IgYmVzdCBwZXJmb3JtYW5jZSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNC0xMi0yM1QwODo0ODo1OSswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAidGhhbmtzIjogewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwiLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAiZmlsZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImJvb3RzdHJhcC5waHAiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxQb2x5ZmlsbFxcTWJzdHJpbmdcXCI6ICIiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJOaWNvbGFzIEdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInBAdGNod29yay5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTeW1mb255IHBvbHlmaWxsIGZvciB0aGUgTWJzdHJpbmcgZXh0ZW5zaW9uIiwKICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiY29tcGF0aWJpbGl0eSIsCiAgICAgICAgICAgICAgICAibWJzdHJpbmciLAogICAgICAgICAgICAgICAgInBvbHlmaWxsIiwKICAgICAgICAgICAgICAgICJwb3J0YWJsZSIsCiAgICAgICAgICAgICAgICAic2hpbSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL3RyZWUvdjEuMzIuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbC1waHA3MyIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInYxLjMyLjAiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMzIuMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLXBocDczLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjBmNjhjMDM1NjVkY2FhZjI1YTg5MDY2NzU0MmU4YmQ3NWZlN2U1YmIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L3BvbHlmaWxsLXBocDczL3ppcGJhbGwvMGY2OGMwMzU2NWRjYWFmMjVhODkwNjY3NTQyZThiZDc1ZmU3ZTViYiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjBmNjhjMDM1NjVkY2FhZjI1YTg5MDY2NzU0MmU4YmQ3NWZlN2U1YmIiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNC0wOS0wOVQxMTo0NToxMCswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAidGhhbmtzIjogewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwiLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAiZmlsZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImJvb3RzdHJhcC5waHAiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxQb2x5ZmlsbFxcUGhwNzNcXCI6ICIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZXMvc3R1YnMiCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJOaWNvbGFzIEdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInBAdGNod29yay5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTeW1mb255IHBvbHlmaWxsIGJhY2twb3J0aW5nIHNvbWUgUEhQIDcuMysgZmVhdHVyZXMgdG8gbG93ZXIgUEhQIHZlcnNpb25zIiwKICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiY29tcGF0aWJpbGl0eSIsCiAgICAgICAgICAgICAgICAicG9seWZpbGwiLAogICAgICAgICAgICAgICAgInBvcnRhYmxlIiwKICAgICAgICAgICAgICAgICJzaGltIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMvdHJlZS92MS4zMi4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vc3ltZm9ueS5jb20vc3BvbnNvciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9mYWJwb3QiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3Qvc3ltZm9ueS9zeW1mb255IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zeW1mb255L3BvbHlmaWxsLXBocDczIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsLXBocDgwIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjEuMzIuMCIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS4zMi4wLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtcGhwODAuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMGNjOWRkMGYxN2Y2MWQ4MTMxZTdkZjZiODRiZDM0NDg5OWZlMjYwOCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvemlwYmFsbC8wY2M5ZGQwZjE3ZjYxZDgxMzFlN2RmNmI4NGJkMzQ0ODk5ZmUyNjA4IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMGNjOWRkMGYxN2Y2MWQ4MTMxZTdkZjZiODRiZDM0NDg5OWZlMjYwOCIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI1LTAxLTAyVDA4OjEwOjExKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJ0aGFua3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJmaWxlcyI6IFsKICAgICAgICAgICAgICAgICAgICAiYm9vdHN0cmFwLnBocCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MFxcIjogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2xhc3NtYXAiOiBbCiAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlcy9zdHVicyIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIklvbiBCYXphbiIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImlvbi5iYXphbkBnbWFpbC5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk5pY29sYXMgR3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicEB0Y2h3b3JrLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN5bWZvbnkgcG9seWZpbGwgYmFja3BvcnRpbmcgc29tZSBQSFAgOC4wKyBmZWF0dXJlcyB0byBsb3dlciBQSFAgdmVyc2lvbnMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJjb21wYXRpYmlsaXR5IiwKICAgICAgICAgICAgICAgICJwb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAicG9ydGFibGUiLAogICAgICAgICAgICAgICAgInNoaW0iCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC90cmVlL3YxLjMyLjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvcG9seWZpbGwtcGhwODAiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwtcGhwODEiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2MS4zMi4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjMyLjAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI0YTRjZmMyZDI1M2MyMWE1YWQwZTUzMDcxZGYyNDhlZDQ4YzZjZTVjIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS96aXBiYWxsLzRhNGNmYzJkMjUzYzIxYTVhZDBlNTMwNzFkZjI0OGVkNDhjNmNlNWMiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI0YTRjZmMyZDI1M2MyMWE1YWQwZTUzMDcxZGYyNDhlZDQ4YzZjZTVjIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMDktMDlUMTE6NDU6MTArMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgInRoYW5rcyI6IHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsIiwKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgImZpbGVzIjogWwogICAgICAgICAgICAgICAgICAgICJib290c3RyYXAucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU3ltZm9ueVxcUG9seWZpbGxcXFBocDgxXFwiOiAiIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjbGFzc21hcCI6IFsKICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VzL3N0dWJzIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmljb2xhcyBHcmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJwQHRjaHdvcmsuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3ltZm9ueSBwb2x5ZmlsbCBiYWNrcG9ydGluZyBzb21lIFBIUCA4LjErIGZlYXR1cmVzIHRvIGxvd2VyIFBIUCB2ZXJzaW9ucyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNvbXBhdGliaWxpdHkiLAogICAgICAgICAgICAgICAgInBvbHlmaWxsIiwKICAgICAgICAgICAgICAgICJwb3J0YWJsZSIsCiAgICAgICAgICAgICAgICAic2hpbSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLXBocDgxL3RyZWUvdjEuMzIuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9wb2x5ZmlsbC1waHA4MSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wcm9jZXNzIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjUuNC40NyIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiNS40LjQ3LjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcHJvY2Vzcy5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI1ZDE2NjJmYjMyZWJjOTRmMTdkZGI4ZDYzNTQ1NGE3NzYwNjY3MzNkIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9wcm9jZXNzL3ppcGJhbGwvNWQxNjYyZmIzMmViYzk0ZjE3ZGRiOGQ2MzU0NTRhNzc2MDY2NzMzZCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjVkMTY2MmZiMzJlYmM5NGYxN2RkYjhkNjM1NDU0YTc3NjA2NjczM2QiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi41IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLXBocDgwIjogIl4xLjE2IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTExLTA2VDExOjM2OjQyKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXENvbXBvbmVudFxcUHJvY2Vzc1xcIjogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZS1mcm9tLWNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICIvVGVzdHMvIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiRmFiaWVuIFBvdGVuY2llciIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImZhYmllbkBzeW1mb255LmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4ZWN1dGVzIGNvbW1hbmRzIGluIHN1Yi1wcm9jZXNzZXMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wcm9jZXNzL3RyZWUvdjUuNC40NyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9wcm9jZXNzIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3NlcnZpY2UtY29udHJhY3RzIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjIuNS40IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIyLjUuNC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImYzN2I0MTlmN2FlYTJlOWFiZjEwYWJkMjYxODMyY2FjZTEyZTMzMDAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL3ppcGJhbGwvZjM3YjQxOWY3YWVhMmU5YWJmMTBhYmQyNjE4MzJjYWNlMTJlMzMwMCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImYzN2I0MTlmN2FlYTJlOWFiZjEwYWJkMjYxODMyY2FjZTEyZTMzMDAiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi41IiwKICAgICAgICAgICAgICAgICJwc3IvY29udGFpbmVyIjogIl4xLjEiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzIjogIl4yLjF8XjMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjb25mbGljdCI6IHsKICAgICAgICAgICAgICAgICJleHQtcHNyIjogIjwxLjF8Pj0yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic3VnZ2VzdCI6IHsKICAgICAgICAgICAgICAgICJzeW1mb255L3NlcnZpY2UtaW1wbGVtZW50YXRpb24iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA5LTI1VDE0OjExOjEzKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJ0aGFua3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9jb250cmFjdHMiLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvY29udHJhY3RzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi1tYWluIjogIjIuNS1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXENvbnRyYWN0c1xcU2VydmljZVxcIjogIiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk5pY29sYXMgR3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicEB0Y2h3b3JrLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkdlbmVyaWMgYWJzdHJhY3Rpb25zIHJlbGF0ZWQgdG8gd3JpdGluZyBzZXJ2aWNlcyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImFic3RyYWN0aW9ucyIsCiAgICAgICAgICAgICAgICAiY29udHJhY3RzIiwKICAgICAgICAgICAgICAgICJkZWNvdXBsaW5nIiwKICAgICAgICAgICAgICAgICJpbnRlcmZhY2VzIiwKICAgICAgICAgICAgICAgICJpbnRlcm9wZXJhYmlsaXR5IiwKICAgICAgICAgICAgICAgICJzdGFuZGFyZHMiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy90cmVlL3YyLjUuNCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9zdHJpbmciLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2NS40LjQ3IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICI1LjQuNDcuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9zdHJpbmcuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMTM2Y2E3ZDcyZjcyYjU5OWYyNjMxYWNhNDc0YTRmOGUyNjcxOTc5OSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvc3RyaW5nL3ppcGJhbGwvMTM2Y2E3ZDcyZjcyYjU5OWYyNjMxYWNhNDc0YTRmOGUyNjcxOTc5OSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjEzNmNhN2Q3MmY3MmI1OTlmMjYzMWFjYTQ3NGE0ZjhlMjY3MTk3OTkiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi41IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLWN0eXBlIjogIn4xLjgiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZSI6ICJ+MS4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplciI6ICJ+MS4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nIjogIn4xLjAiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtcGhwODAiOiAifjEuMTUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjb25mbGljdCI6IHsKICAgICAgICAgICAgICAgICJzeW1mb255L3RyYW5zbGF0aW9uLWNvbnRyYWN0cyI6ICI+PTMuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInN5bWZvbnkvZXJyb3ItaGFuZGxlciI6ICJeNC40fF41LjB8XjYuMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9odHRwLWNsaWVudCI6ICJeNC40fF41LjB8XjYuMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS90cmFuc2xhdGlvbi1jb250cmFjdHMiOiAiXjEuMXxeMiIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS92YXItZXhwb3J0ZXIiOiAiXjQuNHxeNS4wfF42LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMTEtMTBUMjA6MzM6NTgrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJmaWxlcyI6IFsKICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VzL2Z1bmN0aW9ucy5waHAiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxDb21wb25lbnRcXFN0cmluZ1xcIjogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZS1mcm9tLWNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICIvVGVzdHMvIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmljb2xhcyBHcmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJwQHRjaHdvcmsuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvdmlkZXMgYW4gb2JqZWN0LW9yaWVudGVkIEFQSSB0byBzdHJpbmdzIGFuZCBkZWFscyB3aXRoIGJ5dGVzLCBVVEYtOCBjb2RlIHBvaW50cyBhbmQgZ3JhcGhlbWUgY2x1c3RlcnMgaW4gYSB1bmlmaWVkIHdheSIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImdyYXBoZW1lIiwKICAgICAgICAgICAgICAgICJpMThuIiwKICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgInVuaWNvZGUiLAogICAgICAgICAgICAgICAgInV0Zi04IiwKICAgICAgICAgICAgICAgICJ1dGY4IgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvc3RyaW5nL3RyZWUvdjUuNC40NyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9zdHJpbmciCiAgICAgICAgfQogICAgXSwKICAgICJkZXYiOiBmYWxzZSwKICAgICJkZXYtcGFja2FnZS1uYW1lcyI6IFtdCn0KPD9waHAgcmV0dXJuIGFycmF5KAoncm9vdCcgPT4gYXJyYXkoCiduYW1lJyA9PiAnY29tcG9zZXIvY29tcG9zZXInLAoncHJldHR5X3ZlcnNpb24nID0+ICcyLjguOScsCid2ZXJzaW9uJyA9PiAnMi44LjkuMCcsCidyZWZlcmVuY2UnID0+ICdiNGU2YmZmMmRiN2NlNzU2ZGRiNzdlY2VlOTU4YTBmNDFmNDJiZDlkJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vLi4vJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXYnID0+IGZhbHNlLAopLAondmVyc2lvbnMnID0+IGFycmF5KAonY29tcG9zZXIvY2EtYnVuZGxlJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMS41LjYnLAondmVyc2lvbicgPT4gJzEuNS42LjAnLAoncmVmZXJlbmNlJyA9PiAnZjY1YzIzOWM5NzBlN2YwNzJmMDY3YWI3ODY0NmU5ZjBiMjkzNTE3NScsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4vY2EtYnVuZGxlJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzEuNi4xJywKJ3ZlcnNpb24nID0+ICcxLjYuMS4wJywKJ3JlZmVyZW5jZScgPT4gJzEzNGI3MDVkZGIwMDI1ZDM5N2Q4MzE4YTc1ODI1ZmUzYzlkMWRhMzQnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uL2NsYXNzLW1hcC1nZW5lcmF0b3InLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidjb21wb3Nlci9jb21wb3NlcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzIuOC45JywKJ3ZlcnNpb24nID0+ICcyLjguOS4wJywKJ3JlZmVyZW5jZScgPT4gJ2I0ZTZiZmYyZGI3Y2U3NTZkZGI3N2VjZWU5NThhMGY0MWY0MmJkOWQnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi8uLi8nLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidjb21wb3Nlci9tZXRhZGF0YS1taW5pZmllcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzEuMC4wJywKJ3ZlcnNpb24nID0+ICcxLjAuMC4wJywKJ3JlZmVyZW5jZScgPT4gJ2M1NDlkMjM4Mjk1MzZmMGQwZTk4NGFhYWJiZjAyYWY5MWY0NDMyMDcnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uL21ldGFkYXRhLW1pbmlmaWVyJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonY29tcG9zZXIvcGNyZScgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzIuMy4yJywKJ3ZlcnNpb24nID0+ICcyLjMuMi4wJywKJ3JlZmVyZW5jZScgPT4gJ2ViYjgxZGY4ZjUyYjQwMTcyZDE0MDYyYWU5NmEwNjkzOWQ4MGEwNjknLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uL3BjcmUnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidjb21wb3Nlci9zZW12ZXInID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICczLjQuMycsCid2ZXJzaW9uJyA9PiAnMy40LjMuMCcsCidyZWZlcmVuY2UnID0+ICc0MzEzZDI2YWRhNWUwYzRlZGZiZDFkYzQ4MWE5MmZmN2JmZjkxZjEyJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi9zZW12ZXInLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidjb21wb3Nlci9zcGR4LWxpY2Vuc2VzJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMS41LjknLAondmVyc2lvbicgPT4gJzEuNS45LjAnLAoncmVmZXJlbmNlJyA9PiAnZWRmMzY0Y2VmZThjNDM1MDFlMjFlODgxMTBhYWMxMGIyODRjM2M5ZicsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4vc3BkeC1saWNlbnNlcycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMy4wLjUnLAondmVyc2lvbicgPT4gJzMuMC41LjAnLAoncmVmZXJlbmNlJyA9PiAnNmMxOTI1NTYxNjMyZTgzZDYwYTQ0NDkyZTBiMzQ0Y2Y0OGFiODVlZicsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4veGRlYnVnLWhhbmRsZXInLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidqdXN0aW5yYWluYm93L2pzb24tc2NoZW1hJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnNi40LjEnLAondmVyc2lvbicgPT4gJzYuNC4xLjAnLAoncmVmZXJlbmNlJyA9PiAnMzVkMjYyYzk0OTU5NTcxZTg3MzZkYjFlNWM5YmMzNmFiOTRhZTkwMCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidtYXJjLW1hYmUvcGhwLWVudW0nID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2NC43LjEnLAondmVyc2lvbicgPT4gJzQuNy4xLjAnLAoncmVmZXJlbmNlJyA9PiAnNzE1OTgwOWU1Y2ZhMDQxZGNhMjhlNjFmN2Y3YWU1ODA2M2FhZThlZCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL21hcmMtbWFiZS9waHAtZW51bScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3Bzci9jb250YWluZXInID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICcxLjEuMScsCid2ZXJzaW9uJyA9PiAnMS4xLjEuMCcsCidyZWZlcmVuY2UnID0+ICc4NjIyNTY3NDA5MDEwMjgyYjdhZWViZTRiYjg0MWZlOThiNThkY2FmJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vcHNyL2NvbnRhaW5lcicsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3Bzci9sb2cnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICcxLjEuNCcsCid2ZXJzaW9uJyA9PiAnMS4xLjQuMCcsCidyZWZlcmVuY2UnID0+ICdkNDk2OTViOTA5YzNiNzYyOGI2Mjg5ZGI1NDc5YTFjMjA0NjAxZjExJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vcHNyL2xvZycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3Bzci9sb2ctaW1wbGVtZW50YXRpb24nID0+IGFycmF5KAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKJ3Byb3ZpZGVkJyA9PiBhcnJheSgKMCA9PiAnMS4wfDIuMCcsCiksCiksCidyZWFjdC9wcm9taXNlJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjMuMi4wJywKJ3ZlcnNpb24nID0+ICczLjIuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzhhMTY0NjQzMzEzYzcxMzU0NTgyZGM4NTBiNDJiMzNmYTEyYTRiNjMnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9yZWFjdC9wcm9taXNlJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc2VsZC9qc29ubGludCcgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzEuMTEuMCcsCid2ZXJzaW9uJyA9PiAnMS4xMS4wLjAnLAoncmVmZXJlbmNlJyA9PiAnMTc0OGFhZjg0N2ZjNzMxY2ZhZDc3MjVhZWM0MTNlZTQ2ZjBjYzNhMicsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3NlbGQvanNvbmxpbnQnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzZWxkL3BoYXItdXRpbHMnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICcxLjIuMScsCid2ZXJzaW9uJyA9PiAnMS4yLjEuMCcsCidyZWZlcmVuY2UnID0+ICdlYTJmNDAxNGYxNjNjMWJlNGM2MDFiOWI3YmQ2YWY4MWJhOGQ3MDFjJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc2VsZC9waGFyLXV0aWxzJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc2VsZC9zaWduYWwtaGFuZGxlcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzIuMC4yJywKJ3ZlcnNpb24nID0+ICcyLjAuMi4wJywKJ3JlZmVyZW5jZScgPT4gJzA0YTYxMTJlODgzYWQ3NmMwYWRhOGU0YTlmNzUyMGJiZmRiNmJiOTgnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zZWxkL3NpZ25hbC1oYW5kbGVyJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9jb25zb2xlJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjUuNC40NycsCid2ZXJzaW9uJyA9PiAnNS40LjQ3LjAnLAoncmVmZXJlbmNlJyA9PiAnYzRiYTk4MGNhNjFhOWViMThlZTZiY2M3M2YyOGU0NzU4NTJiYjFlZCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvY29uc29sZScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjIuNS40JywKJ3ZlcnNpb24nID0+ICcyLjUuNC4wJywKJ3JlZmVyZW5jZScgPT4gJzYwNTM4OWYyYTdlNTYyNWYyNzNiNTM5NjBkYzQ2YWVhZjljNjI5MTgnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvZmlsZXN5c3RlbScgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3Y1LjQuNDUnLAondmVyc2lvbicgPT4gJzUuNC40NS4wJywKJ3JlZmVyZW5jZScgPT4gJzU3YzgyOTRlZDM3ZDRhMDU1Yjc3MDU3ODI3YzY3Zjk1NThjOTVjNTQnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L2ZpbGVzeXN0ZW0nLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzeW1mb255L2ZpbmRlcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3Y1LjQuNDUnLAondmVyc2lvbicgPT4gJzUuNC40NS4wJywKJ3JlZmVyZW5jZScgPT4gJzYzNzQxNzg0Y2Q3Yjk5Njc5NzVlZWM2MTBiMjU2ZWVkM2VkZTAyMmInLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L2ZpbmRlcicsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtY3R5cGUnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2MS4zMi4wJywKJ3ZlcnNpb24nID0+ICcxLjMyLjAuMCcsCidyZWZlcmVuY2UnID0+ICdhM2NjOGIwNDRhNmVhNTEzMzEwY2JkNDhlZjczMzNiMzg0OTQ1NjM4JywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZScgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjMyLjAnLAondmVyc2lvbicgPT4gJzEuMzIuMC4wJywKJ3JlZmVyZW5jZScgPT4gJ2I5MTIzOTI2ZTNiN2JjMmY5OGMwMmFkNTRmNmE0YjAyYjkxYThhYmUnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjMyLjAnLAondmVyc2lvbicgPT4gJzEuMzIuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzM4MzNkNzI1NWNjMzAzNTQ2NDM1Y2I2NTAzMTZiZmY3MDhhMWM3NWMnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplcicsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2MS4zMi4wJywKJ3ZlcnNpb24nID0+ICcxLjMyLjAuMCcsCidyZWZlcmVuY2UnID0+ICc2ZDg1N2Y0ZDc2YmQ0YjM0M2VhYzI2ZDZiNTM5NTg1ZDJiYzU2NDkzJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtcGhwNzMnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2MS4zMi4wJywKJ3ZlcnNpb24nID0+ICcxLjMyLjAuMCcsCidyZWZlcmVuY2UnID0+ICcwZjY4YzAzNTY1ZGNhYWYyNWE4OTA2Njc1NDJlOGJkNzVmZTdlNWJiJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9wb2x5ZmlsbC1waHA3MycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtcGhwODAnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2MS4zMi4wJywKJ3ZlcnNpb24nID0+ICcxLjMyLjAuMCcsCidyZWZlcmVuY2UnID0+ICcwY2M5ZGQwZjE3ZjYxZDgxMzFlN2RmNmI4NGJkMzQ0ODk5ZmUyNjA4JywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9wb2x5ZmlsbC1waHA4MCcsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtcGhwODEnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2MS4zMi4wJywKJ3ZlcnNpb24nID0+ICcxLjMyLjAuMCcsCidyZWZlcmVuY2UnID0+ICc0YTRjZmMyZDI1M2MyMWE1YWQwZTUzMDcxZGYyNDhlZDQ4YzZjZTVjJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9wb2x5ZmlsbC1waHA4MScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcHJvY2VzcycgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3Y1LjQuNDcnLAondmVyc2lvbicgPT4gJzUuNC40Ny4wJywKJ3JlZmVyZW5jZScgPT4gJzVkMTY2MmZiMzJlYmM5NGYxN2RkYjhkNjM1NDU0YTc3NjA2NjczM2QnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3Byb2Nlc3MnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzeW1mb255L3NlcnZpY2UtY29udHJhY3RzJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjIuNS40JywKJ3ZlcnNpb24nID0+ICcyLjUuNC4wJywKJ3JlZmVyZW5jZScgPT4gJ2YzN2I0MTlmN2FlYTJlOWFiZjEwYWJkMjYxODMyY2FjZTEyZTMzMDAnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9zdHJpbmcnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2NS40LjQ3JywKJ3ZlcnNpb24nID0+ICc1LjQuNDcuMCcsCidyZWZlcmVuY2UnID0+ICcxMzZjYTdkNzJmNzJiNTk5ZjI2MzFhY2E0NzRhNGY4ZTI2NzE5Nzk5JywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9zdHJpbmcnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCiksCik7CgpDb3B5cmlnaHQgKEMpIDIwMjEgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXE1ldGFkYXRhTWluaWZpZXI7CgpjbGFzcyBNZXRhZGF0YU1pbmlmaWVyCnsKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBleHBhbmQoYXJyYXkgJHZlcnNpb25zKQp7CiRleHBhbmRlZCA9IGFycmF5KCk7CiRleHBhbmRlZFZlcnNpb24gPSBudWxsOwpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb25EYXRhKSB7CmlmICghJGV4cGFuZGVkVmVyc2lvbikgewokZXhwYW5kZWRWZXJzaW9uID0gJHZlcnNpb25EYXRhOwokZXhwYW5kZWRbXSA9ICRleHBhbmRlZFZlcnNpb247CmNvbnRpbnVlOwp9CgoKZm9yZWFjaCAoJHZlcnNpb25EYXRhIGFzICRrZXkgPT4gJHZhbCkgewppZiAoJHZhbCA9PT0gJ19fdW5zZXQnKSB7CnVuc2V0KCRleHBhbmRlZFZlcnNpb25bJGtleV0pOwp9IGVsc2UgewokZXhwYW5kZWRWZXJzaW9uWyRrZXldID0gJHZhbDsKfQp9CgokZXhwYW5kZWRbXSA9ICRleHBhbmRlZFZlcnNpb247Cn0KCnJldHVybiAkZXhwYW5kZWQ7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWluaWZ5KGFycmF5ICR2ZXJzaW9ucykKewokbWluaWZpZWRWZXJzaW9ucyA9IGFycmF5KCk7CgokbGFzdEtub3duVmVyc2lvbkRhdGEgPSBudWxsOwpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb24pIHsKaWYgKCEkbGFzdEtub3duVmVyc2lvbkRhdGEpIHsKJGxhc3RLbm93blZlcnNpb25EYXRhID0gJHZlcnNpb247CiRtaW5pZmllZFZlcnNpb25zW10gPSAkdmVyc2lvbjsKY29udGludWU7Cn0KCiRtaW5pZmllZFZlcnNpb24gPSBhcnJheSgpOwoKCmZvcmVhY2ggKCR2ZXJzaW9uIGFzICRrZXkgPT4gJHZhbCkgewppZiAoIWlzc2V0KCRsYXN0S25vd25WZXJzaW9uRGF0YVska2V5XSkgfHwgJGxhc3RLbm93blZlcnNpb25EYXRhWyRrZXldICE9PSAkdmFsKSB7CiRtaW5pZmllZFZlcnNpb25bJGtleV0gPSAkdmFsOwokbGFzdEtub3duVmVyc2lvbkRhdGFbJGtleV0gPSAkdmFsOwp9Cn0KCgpmb3JlYWNoICgkbGFzdEtub3duVmVyc2lvbkRhdGEgYXMgJGtleSA9PiAkdmFsKSB7CmlmICghaXNzZXQoJHZlcnNpb25bJGtleV0pKSB7CiRtaW5pZmllZFZlcnNpb25bJGtleV0gPSAiX191bnNldCI7CnVuc2V0KCRsYXN0S25vd25WZXJzaW9uRGF0YVska2V5XSk7Cn0KfQoKJG1pbmlmaWVkVmVyc2lvbnNbXSA9ICRtaW5pZmllZFZlcnNpb247Cn0KCnJldHVybiAkbWluaWZpZWRWZXJzaW9uczsKfQp9CgpDb3B5cmlnaHQgKEMpIDIwMjEgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpmaW5hbCBjbGFzcyBNYXRjaEFsbFJlc3VsdAp7CgoKCgoKCnB1YmxpYyAkbWF0Y2hlczsKCgoKCgpwdWJsaWMgJGNvdW50OwoKCgoKCnB1YmxpYyAkbWF0Y2hlZDsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRjb3VudCwgYXJyYXkgJG1hdGNoZXMpCnsKJHRoaXMtPm1hdGNoZXMgPSAkbWF0Y2hlczsKJHRoaXMtPm1hdGNoZWQgPSAoYm9vbCkgJGNvdW50OwokdGhpcy0+Y291bnQgPSAkY291bnQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpmaW5hbCBjbGFzcyBNYXRjaEFsbFN0cmljdEdyb3Vwc1Jlc3VsdAp7CgoKCgoKCnB1YmxpYyAkbWF0Y2hlczsKCgoKCgpwdWJsaWMgJGNvdW50OwoKCgoKCnB1YmxpYyAkbWF0Y2hlZDsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRjb3VudCwgYXJyYXkgJG1hdGNoZXMpCnsKJHRoaXMtPm1hdGNoZXMgPSAkbWF0Y2hlczsKJHRoaXMtPm1hdGNoZWQgPSAoYm9vbCkgJGNvdW50OwokdGhpcy0+Y291bnQgPSAkY291bnQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpmaW5hbCBjbGFzcyBNYXRjaEFsbFdpdGhPZmZzZXRzUmVzdWx0CnsKCgoKCgoKCnB1YmxpYyAkbWF0Y2hlczsKCgoKCgpwdWJsaWMgJGNvdW50OwoKCgoKCnB1YmxpYyAkbWF0Y2hlZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkY291bnQsIGFycmF5ICRtYXRjaGVzKQp7CiR0aGlzLT5tYXRjaGVzID0gJG1hdGNoZXM7CiR0aGlzLT5tYXRjaGVkID0gKGJvb2wpICRjb3VudDsKJHRoaXMtPmNvdW50ID0gJGNvdW50Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlOwoKZmluYWwgY2xhc3MgTWF0Y2hSZXN1bHQKewoKCgoKCgpwdWJsaWMgJG1hdGNoZXM7CgoKCgoKcHVibGljICRtYXRjaGVkOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJGNvdW50LCBhcnJheSAkbWF0Y2hlcykKewokdGhpcy0+bWF0Y2hlcyA9ICRtYXRjaGVzOwokdGhpcy0+bWF0Y2hlZCA9IChib29sKSAkY291bnQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpmaW5hbCBjbGFzcyBNYXRjaFN0cmljdEdyb3Vwc1Jlc3VsdAp7CgoKCgoKCnB1YmxpYyAkbWF0Y2hlczsKCgoKCgpwdWJsaWMgJG1hdGNoZWQ7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkY291bnQsIGFycmF5ICRtYXRjaGVzKQp7CiR0aGlzLT5tYXRjaGVzID0gJG1hdGNoZXM7CiR0aGlzLT5tYXRjaGVkID0gKGJvb2wpICRjb3VudDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmZpbmFsIGNsYXNzIE1hdGNoV2l0aE9mZnNldHNSZXN1bHQKewoKCgoKCgoKcHVibGljICRtYXRjaGVzOwoKCgoKCnB1YmxpYyAkbWF0Y2hlZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkY291bnQsIGFycmF5ICRtYXRjaGVzKQp7CiR0aGlzLT5tYXRjaGVzID0gJG1hdGNoZXM7CiR0aGlzLT5tYXRjaGVkID0gKGJvb2wpICRjb3VudDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzID0gMSk7CgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZVxQSFBTdGFuOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFBjcmVcUmVnZXg7CnVzZSBDb21wb3NlclxQY3JlXFBjcmVFeGNlcHRpb247CnVzZSBOZXR0ZVxVdGlsc1xSZWdleHBFeGNlcHRpb247CnVzZSBOZXR0ZVxVdGlsc1xTdHJpbmdzOwp1c2UgUGhwUGFyc2VyXE5vZGU7CnVzZSBQaHBQYXJzZXJcTm9kZVxFeHByXFN0YXRpY0NhbGw7CnVzZSBQaHBQYXJzZXJcTm9kZVxOYW1lXEZ1bGx5UXVhbGlmaWVkOwp1c2UgUEhQU3RhblxBbmFseXNlclxTY29wZTsKdXNlIFBIUFN0YW5cUnVsZXNcUnVsZTsKdXNlIFBIUFN0YW5cUnVsZXNcUnVsZUVycm9yQnVpbGRlcjsKdXNlIGZ1bmN0aW9uIGluX2FycmF5Owp1c2UgZnVuY3Rpb24gc3ByaW50ZjsKCgoKCgoKY2xhc3MgSW52YWxpZFJlZ2V4UGF0dGVyblJ1bGUgaW1wbGVtZW50cyBSdWxlCnsKcHVibGljIGZ1bmN0aW9uIGdldE5vZGVUeXBlKCk6IHN0cmluZwp7CnJldHVybiBTdGF0aWNDYWxsOjpjbGFzczsKfQoKcHVibGljIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKE5vZGUgJG5vZGUsIFNjb3BlICRzY29wZSk6IGFycmF5CnsKJHBhdHRlcm5zID0gJHRoaXMtPmV4dHJhY3RQYXR0ZXJucygkbm9kZSwgJHNjb3BlKTsKCiRlcnJvcnMgPSBbXTsKZm9yZWFjaCAoJHBhdHRlcm5zIGFzICRwYXR0ZXJuKSB7CiRlcnJvck1lc3NhZ2UgPSAkdGhpcy0+dmFsaWRhdGVQYXR0ZXJuKCRwYXR0ZXJuKTsKaWYgKCRlcnJvck1lc3NhZ2UgPT09IG51bGwpIHsKY29udGludWU7Cn0KCiRlcnJvcnNbXSA9IFJ1bGVFcnJvckJ1aWxkZXI6Om1lc3NhZ2Uoc3ByaW50ZignUmVnZXggcGF0dGVybiBpcyBpbnZhbGlkOiAlcycsICRlcnJvck1lc3NhZ2UpKS0+aWRlbnRpZmllcigncmVnZXhwLnBhdHRlcm4nKS0+YnVpbGQoKTsKfQoKcmV0dXJuICRlcnJvcnM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdFBhdHRlcm5zKFN0YXRpY0NhbGwgJG5vZGUsIFNjb3BlICRzY29wZSk6IGFycmF5CnsKaWYgKCEkbm9kZS0+Y2xhc3MgaW5zdGFuY2VvZiBGdWxseVF1YWxpZmllZCkgewpyZXR1cm4gW107Cn0KJGlzUmVnZXggPSAkbm9kZS0+Y2xhc3MtPnRvU3RyaW5nKCkgPT09IFJlZ2V4OjpjbGFzczsKJGlzUHJlZyA9ICRub2RlLT5jbGFzcy0+dG9TdHJpbmcoKSA9PT0gUHJlZzo6Y2xhc3M7CmlmICghJGlzUmVnZXggJiYgISRpc1ByZWcpIHsKcmV0dXJuIFtdOwp9CmlmICghJG5vZGUtPm5hbWUgaW5zdGFuY2VvZiBOb2RlXElkZW50aWZpZXIgfHwgIVByZWc6OmlzTWF0Y2goJ3teKG1hdGNofGlzTWF0Y2h8Z3JlcHxyZXBsYWNlfHNwbGl0KX0nLCAkbm9kZS0+bmFtZS0+bmFtZSkpIHsKcmV0dXJuIFtdOwp9CgokZnVuY3Rpb25OYW1lID0gJG5vZGUtPm5hbWUtPm5hbWU7CmlmICghaXNzZXQoJG5vZGUtPmdldEFyZ3MoKVswXSkpIHsKcmV0dXJuIFtdOwp9CgokcGF0dGVybk5vZGUgPSAkbm9kZS0+Z2V0QXJncygpWzBdLT52YWx1ZTsKJHBhdHRlcm5UeXBlID0gJHNjb3BlLT5nZXRUeXBlKCRwYXR0ZXJuTm9kZSk7CgokcGF0dGVyblN0cmluZ3MgPSBbXTsKCmZvcmVhY2ggKCRwYXR0ZXJuVHlwZS0+Z2V0Q29uc3RhbnRTdHJpbmdzKCkgYXMgJGNvbnN0YW50U3RyaW5nVHlwZSkgewppZiAoJGZ1bmN0aW9uTmFtZSA9PT0gJ3JlcGxhY2VDYWxsYmFja0FycmF5Jykgewpjb250aW51ZTsKfQoKJHBhdHRlcm5TdHJpbmdzW10gPSAkY29uc3RhbnRTdHJpbmdUeXBlLT5nZXRWYWx1ZSgpOwp9Cgpmb3JlYWNoICgkcGF0dGVyblR5cGUtPmdldENvbnN0YW50QXJyYXlzKCkgYXMgJGNvbnN0YW50QXJyYXlUeXBlKSB7CmlmICgKaW5fYXJyYXkoJGZ1bmN0aW9uTmFtZSwgWwoncmVwbGFjZScsCidyZXBsYWNlQ2FsbGJhY2snLApdLCB0cnVlKQopIHsKZm9yZWFjaCAoJGNvbnN0YW50QXJyYXlUeXBlLT5nZXRWYWx1ZVR5cGVzKCkgYXMgJGFycmF5S2V5VHlwZSkgewpmb3JlYWNoICgkYXJyYXlLZXlUeXBlLT5nZXRDb25zdGFudFN0cmluZ3MoKSBhcyAkY29uc3RhbnRTdHJpbmcpIHsKJHBhdHRlcm5TdHJpbmdzW10gPSAkY29uc3RhbnRTdHJpbmctPmdldFZhbHVlKCk7Cn0KfQp9CgppZiAoJGZ1bmN0aW9uTmFtZSAhPT0gJ3JlcGxhY2VDYWxsYmFja0FycmF5Jykgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJGNvbnN0YW50QXJyYXlUeXBlLT5nZXRLZXlUeXBlcygpIGFzICRhcnJheUtleVR5cGUpIHsKZm9yZWFjaCAoJGFycmF5S2V5VHlwZS0+Z2V0Q29uc3RhbnRTdHJpbmdzKCkgYXMgJGNvbnN0YW50U3RyaW5nKSB7CiRwYXR0ZXJuU3RyaW5nc1tdID0gJGNvbnN0YW50U3RyaW5nLT5nZXRWYWx1ZSgpOwp9Cn0KfQoKcmV0dXJuICRwYXR0ZXJuU3RyaW5nczsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVBhdHRlcm4oc3RyaW5nICRwYXR0ZXJuKTogP3N0cmluZwp7CnRyeSB7CiRtc2cgPSBudWxsOwokcHJldiA9IHNldF9lcnJvcl9oYW5kbGVyKGZ1bmN0aW9uIChpbnQgJHNldmVyaXR5LCBzdHJpbmcgJG1lc3NhZ2UsIHN0cmluZyAkZmlsZSkgdXNlICgmJG1zZyk6IGJvb2wgewokbXNnID0gcHJlZ19yZXBsYWNlKCIjXnByZWdfbWF0Y2goX2FsbCk/XFwoLio/XFwpOiAjIiwgJycsICRtZXNzYWdlKTsKCnJldHVybiB0cnVlOwp9KTsKCmlmICgkcGF0dGVybiA9PT0gJycpIHsKcmV0dXJuICdFbXB0eSBzdHJpbmcgaXMgbm90IGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uJzsKfQoKUHJlZzo6bWF0Y2goJHBhdHRlcm4sICcnKTsKaWYgKCRtc2cgIT09IG51bGwpIHsKcmV0dXJuICRtc2c7Cn0KfSBjYXRjaCAoUGNyZUV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSA9PT0gUFJFR19JTlRFUk5BTF9FUlJPUiAmJiAkbXNnICE9PSBudWxsKSB7CnJldHVybiAkbXNnOwp9CgpyZXR1cm4gcHJlZ19yZXBsYWNlKCd7Lio/IGZhaWxlZCBleGVjdXRpbmcgIi4qIjogfScsICcnLCAkZS0+Z2V0TWVzc2FnZSgpKTsKfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KCnJldHVybiBudWxsOwp9Cgp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmVcUEhQU3RhbjsKCnVzZSBQSFBTdGFuXEFuYWx5c2VyXFNjb3BlOwp1c2UgUEhQU3RhblxUeXBlXEFycmF5VHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxDb25zdGFudFxDb25zdGFudEFycmF5VHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxDb25zdGFudFxDb25zdGFudEludGVnZXJUeXBlOwp1c2UgUEhQU3RhblxUeXBlXEludGVyc2VjdGlvblR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZUNvbWJpbmF0b3I7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZTsKdXNlIFBocFBhcnNlclxOb2RlXEFyZzsKdXNlIFBIUFN0YW5cVHlwZVxQaHBcUmVnZXhBcnJheVNoYXBlTWF0Y2hlcjsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlVHJhdmVyc2VyOwp1c2UgUEhQU3RhblxUeXBlXFVuaW9uVHlwZTsKCmZpbmFsIGNsYXNzIFByZWdNYXRjaEZsYWdzCnsKc3RhdGljIHB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlKD9BcmcgJGZsYWdzQXJnLCBTY29wZSAkc2NvcGUpOiA/VHlwZQp7CmlmICgkZmxhZ3NBcmcgPT09IG51bGwpIHsKcmV0dXJuIG5ldyBDb25zdGFudEludGVnZXJUeXBlKFBSRUdfVU5NQVRDSEVEX0FTX05VTEwgfCBSZWdleEFycmF5U2hhcGVNYXRjaGVyOjpQUkVHX1VOTUFUQ0hFRF9BU19OVUxMX09OXzcyXzczKTsKfQoKJGZsYWdzVHlwZSA9ICRzY29wZS0+Z2V0VHlwZSgkZmxhZ3NBcmctPnZhbHVlKTsKCiRjb25zdGFudFNjYWxhcnMgPSAkZmxhZ3NUeXBlLT5nZXRDb25zdGFudFNjYWxhclZhbHVlcygpOwppZiAoJGNvbnN0YW50U2NhbGFycyA9PT0gW10pIHsKcmV0dXJuIG51bGw7Cn0KCiRpbnRlcm5hbEZsYWdzVHlwZXMgPSBbXTsKZm9yZWFjaCAoJGZsYWdzVHlwZS0+Z2V0Q29uc3RhbnRTY2FsYXJWYWx1ZXMoKSBhcyAkY29uc3RhbnRTY2FsYXJWYWx1ZSkgewppZiAoIWlzX2ludCgkY29uc3RhbnRTY2FsYXJWYWx1ZSkpIHsKcmV0dXJuIG51bGw7Cn0KCiRpbnRlcm5hbEZsYWdzVHlwZXNbXSA9IG5ldyBDb25zdGFudEludGVnZXJUeXBlKCRjb25zdGFudFNjYWxhclZhbHVlIHwgUFJFR19VTk1BVENIRURfQVNfTlVMTCB8IFJlZ2V4QXJyYXlTaGFwZU1hdGNoZXI6OlBSRUdfVU5NQVRDSEVEX0FTX05VTExfT05fNzJfNzMpOwp9CnJldHVybiBUeXBlQ29tYmluYXRvcjo6dW5pb24oLi4uJGludGVybmFsRmxhZ3NUeXBlcyk7Cn0KCnN0YXRpYyBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlTnVsbEZyb21NYXRjaGVzKFR5cGUgJG1hdGNoZXNUeXBlKTogVHlwZQp7CnJldHVybiBUeXBlVHJhdmVyc2VyOjptYXAoJG1hdGNoZXNUeXBlLCBzdGF0aWMgZnVuY3Rpb24gKFR5cGUgJHR5cGUsIGNhbGxhYmxlICR0cmF2ZXJzZSk6IFR5cGUgewppZiAoJHR5cGUgaW5zdGFuY2VvZiBVbmlvblR5cGUgfHwgJHR5cGUgaW5zdGFuY2VvZiBJbnRlcnNlY3Rpb25UeXBlKSB7CnJldHVybiAkdHJhdmVyc2UoJHR5cGUpOwp9CgppZiAoJHR5cGUgaW5zdGFuY2VvZiBDb25zdGFudEFycmF5VHlwZSkgewpyZXR1cm4gbmV3IENvbnN0YW50QXJyYXlUeXBlKAokdHlwZS0+Z2V0S2V5VHlwZXMoKSwKYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoVHlwZSAkdmFsdWVUeXBlKSB1c2UgKCR0cmF2ZXJzZSk6IFR5cGUgewpyZXR1cm4gJHRyYXZlcnNlKCR2YWx1ZVR5cGUpOwp9LCAkdHlwZS0+Z2V0VmFsdWVUeXBlcygpKSwKJHR5cGUtPmdldE5leHRBdXRvSW5kZXhlcygpLApbXSwKJHR5cGUtPmlzTGlzdCgpCik7Cn0KCmlmICgkdHlwZSBpbnN0YW5jZW9mIEFycmF5VHlwZSkgewpyZXR1cm4gbmV3IEFycmF5VHlwZSgkdHlwZS0+Z2V0S2V5VHlwZSgpLCAkdHJhdmVyc2UoJHR5cGUtPmdldEl0ZW1UeXBlKCkpKTsKfQoKcmV0dXJuIFR5cGVDb21iaW5hdG9yOjpyZW1vdmVOdWxsKCR0eXBlKTsKfSk7Cn0KCn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZVxQSFBTdGFuOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIFBocFBhcnNlclxOb2RlXEV4cHJcU3RhdGljQ2FsbDsKdXNlIFBIUFN0YW5cQW5hbHlzZXJcU2NvcGU7CnVzZSBQSFBTdGFuXFJlZmxlY3Rpb25cTWV0aG9kUmVmbGVjdGlvbjsKdXNlIFBIUFN0YW5cUmVmbGVjdGlvblxQYXJhbWV0ZXJSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxUcmluYXJ5TG9naWM7CnVzZSBQSFBTdGFuXFR5cGVcUGhwXFJlZ2V4QXJyYXlTaGFwZU1hdGNoZXI7CnVzZSBQSFBTdGFuXFR5cGVcU3RhdGljTWV0aG9kUGFyYW1ldGVyT3V0VHlwZUV4dGVuc2lvbjsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlOwoKZmluYWwgY2xhc3MgUHJlZ01hdGNoUGFyYW1ldGVyT3V0VHlwZUV4dGVuc2lvbiBpbXBsZW1lbnRzIFN0YXRpY01ldGhvZFBhcmFtZXRlck91dFR5cGVFeHRlbnNpb24KewoKCgpwcml2YXRlICRyZWdleFNoYXBlTWF0Y2hlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKUmVnZXhBcnJheVNoYXBlTWF0Y2hlciAkcmVnZXhTaGFwZU1hdGNoZXIKKQp7CiR0aGlzLT5yZWdleFNoYXBlTWF0Y2hlciA9ICRyZWdleFNoYXBlTWF0Y2hlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGlzU3RhdGljTWV0aG9kU3VwcG9ydGVkKE1ldGhvZFJlZmxlY3Rpb24gJG1ldGhvZFJlZmxlY3Rpb24sIFBhcmFtZXRlclJlZmxlY3Rpb24gJHBhcmFtZXRlcik6IGJvb2wKewpyZXR1cm4KJG1ldGhvZFJlZmxlY3Rpb24tPmdldERlY2xhcmluZ0NsYXNzKCktPmdldE5hbWUoKSA9PT0gUHJlZzo6Y2xhc3MKJiYgaW5fYXJyYXkoJG1ldGhvZFJlZmxlY3Rpb24tPmdldE5hbWUoKSwgWwonbWF0Y2gnLCAnaXNNYXRjaCcsICdtYXRjaFN0cmljdEdyb3VwcycsICdpc01hdGNoU3RyaWN0R3JvdXBzJywKJ21hdGNoQWxsJywgJ2lzTWF0Y2hBbGwnLCAnbWF0Y2hBbGxTdHJpY3RHcm91cHMnLCAnaXNNYXRjaEFsbFN0cmljdEdyb3VwcycKXSwgdHJ1ZSkKJiYgJHBhcmFtZXRlci0+Z2V0TmFtZSgpID09PSAnbWF0Y2hlcyc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQYXJhbWV0ZXJPdXRUeXBlRnJvbVN0YXRpY01ldGhvZENhbGwoTWV0aG9kUmVmbGVjdGlvbiAkbWV0aG9kUmVmbGVjdGlvbiwgU3RhdGljQ2FsbCAkbWV0aG9kQ2FsbCwgUGFyYW1ldGVyUmVmbGVjdGlvbiAkcGFyYW1ldGVyLCBTY29wZSAkc2NvcGUpOiA/VHlwZQp7CiRhcmdzID0gJG1ldGhvZENhbGwtPmdldEFyZ3MoKTsKJHBhdHRlcm5BcmcgPSAkYXJnc1swXSA/PyBudWxsOwokbWF0Y2hlc0FyZyA9ICRhcmdzWzJdID8/IG51bGw7CiRmbGFnc0FyZyA9ICRhcmdzWzNdID8/IG51bGw7CgppZiAoCiRwYXR0ZXJuQXJnID09PSBudWxsIHx8ICRtYXRjaGVzQXJnID09PSBudWxsCikgewpyZXR1cm4gbnVsbDsKfQoKJGZsYWdzVHlwZSA9IFByZWdNYXRjaEZsYWdzOjpnZXRUeXBlKCRmbGFnc0FyZywgJHNjb3BlKTsKaWYgKCRmbGFnc1R5cGUgPT09IG51bGwpIHsKcmV0dXJuIG51bGw7Cn0KCmlmIChzdHJpcG9zKCRtZXRob2RSZWZsZWN0aW9uLT5nZXROYW1lKCksICdtYXRjaEFsbCcpICE9PSBmYWxzZSkgewpyZXR1cm4gJHRoaXMtPnJlZ2V4U2hhcGVNYXRjaGVyLT5tYXRjaEFsbEV4cHIoJHBhdHRlcm5BcmctPnZhbHVlLCAkZmxhZ3NUeXBlLCBUcmluYXJ5TG9naWM6OmNyZWF0ZU1heWJlKCksICRzY29wZSk7Cn0KCnJldHVybiAkdGhpcy0+cmVnZXhTaGFwZU1hdGNoZXItPm1hdGNoRXhwcigkcGF0dGVybkFyZy0+dmFsdWUsICRmbGFnc1R5cGUsIFRyaW5hcnlMb2dpYzo6Y3JlYXRlTWF5YmUoKSwgJHNjb3BlKTsKfQoKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlXFBIUFN0YW47Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgUGhwUGFyc2VyXE5vZGVcRXhwclxTdGF0aWNDYWxsOwp1c2UgUEhQU3RhblxBbmFseXNlclxTY29wZTsKdXNlIFBIUFN0YW5cQW5hbHlzZXJcU3BlY2lmaWVkVHlwZXM7CnVzZSBQSFBTdGFuXEFuYWx5c2VyXFR5cGVTcGVjaWZpZXI7CnVzZSBQSFBTdGFuXEFuYWx5c2VyXFR5cGVTcGVjaWZpZXJBd2FyZUV4dGVuc2lvbjsKdXNlIFBIUFN0YW5cQW5hbHlzZXJcVHlwZVNwZWNpZmllckNvbnRleHQ7CnVzZSBQSFBTdGFuXFJlZmxlY3Rpb25cTWV0aG9kUmVmbGVjdGlvbjsKdXNlIFBIUFN0YW5cVHJpbmFyeUxvZ2ljOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50QXJyYXlUeXBlOwp1c2UgUEhQU3RhblxUeXBlXFBocFxSZWdleEFycmF5U2hhcGVNYXRjaGVyOwp1c2UgUEhQU3RhblxUeXBlXFN0YXRpY01ldGhvZFR5cGVTcGVjaWZ5aW5nRXh0ZW5zaW9uOwp1c2UgUEhQU3RhblxUeXBlXFR5cGVDb21iaW5hdG9yOwp1c2UgUEhQU3RhblxUeXBlXFR5cGU7CgpmaW5hbCBjbGFzcyBQcmVnTWF0Y2hUeXBlU3BlY2lmeWluZ0V4dGVuc2lvbiBpbXBsZW1lbnRzIFN0YXRpY01ldGhvZFR5cGVTcGVjaWZ5aW5nRXh0ZW5zaW9uLCBUeXBlU3BlY2lmaWVyQXdhcmVFeHRlbnNpb24KewoKCgpwcml2YXRlICR0eXBlU3BlY2lmaWVyOwoKCgoKcHJpdmF0ZSAkcmVnZXhTaGFwZU1hdGNoZXI7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUmVnZXhBcnJheVNoYXBlTWF0Y2hlciAkcmVnZXhTaGFwZU1hdGNoZXIpCnsKJHRoaXMtPnJlZ2V4U2hhcGVNYXRjaGVyID0gJHJlZ2V4U2hhcGVNYXRjaGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0VHlwZVNwZWNpZmllcihUeXBlU3BlY2lmaWVyICR0eXBlU3BlY2lmaWVyKTogdm9pZAp7CiR0aGlzLT50eXBlU3BlY2lmaWVyID0gJHR5cGVTcGVjaWZpZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzcygpOiBzdHJpbmcKewpyZXR1cm4gUHJlZzo6Y2xhc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1N0YXRpY01ldGhvZFN1cHBvcnRlZChNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uLCBTdGF0aWNDYWxsICRub2RlLCBUeXBlU3BlY2lmaWVyQ29udGV4dCAkY29udGV4dCk6IGJvb2wKewpyZXR1cm4gaW5fYXJyYXkoJG1ldGhvZFJlZmxlY3Rpb24tPmdldE5hbWUoKSwgWwonbWF0Y2gnLCAnaXNNYXRjaCcsICdtYXRjaFN0cmljdEdyb3VwcycsICdpc01hdGNoU3RyaWN0R3JvdXBzJywKJ21hdGNoQWxsJywgJ2lzTWF0Y2hBbGwnLCAnbWF0Y2hBbGxTdHJpY3RHcm91cHMnLCAnaXNNYXRjaEFsbFN0cmljdEdyb3VwcycKXSwgdHJ1ZSkKJiYgISRjb250ZXh0LT5udWxsKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzcGVjaWZ5VHlwZXMoTWV0aG9kUmVmbGVjdGlvbiAkbWV0aG9kUmVmbGVjdGlvbiwgU3RhdGljQ2FsbCAkbm9kZSwgU2NvcGUgJHNjb3BlLCBUeXBlU3BlY2lmaWVyQ29udGV4dCAkY29udGV4dCk6IFNwZWNpZmllZFR5cGVzCnsKJGFyZ3MgPSAkbm9kZS0+Z2V0QXJncygpOwokcGF0dGVybkFyZyA9ICRhcmdzWzBdID8/IG51bGw7CiRtYXRjaGVzQXJnID0gJGFyZ3NbMl0gPz8gbnVsbDsKJGZsYWdzQXJnID0gJGFyZ3NbM10gPz8gbnVsbDsKCmlmICgKJHBhdHRlcm5BcmcgPT09IG51bGwgfHwgJG1hdGNoZXNBcmcgPT09IG51bGwKKSB7CnJldHVybiBuZXcgU3BlY2lmaWVkVHlwZXMoKTsKfQoKJGZsYWdzVHlwZSA9IFByZWdNYXRjaEZsYWdzOjpnZXRUeXBlKCRmbGFnc0FyZywgJHNjb3BlKTsKaWYgKCRmbGFnc1R5cGUgPT09IG51bGwpIHsKcmV0dXJuIG5ldyBTcGVjaWZpZWRUeXBlcygpOwp9CgppZiAoc3RyaXBvcygkbWV0aG9kUmVmbGVjdGlvbi0+Z2V0TmFtZSgpLCAnbWF0Y2hBbGwnKSAhPT0gZmFsc2UpIHsKJG1hdGNoZWRUeXBlID0gJHRoaXMtPnJlZ2V4U2hhcGVNYXRjaGVyLT5tYXRjaEFsbEV4cHIoJHBhdHRlcm5BcmctPnZhbHVlLCAkZmxhZ3NUeXBlLCBUcmluYXJ5TG9naWM6OmNyZWF0ZUZyb21Cb29sZWFuKCRjb250ZXh0LT50cnVlKCkpLCAkc2NvcGUpOwp9IGVsc2UgewokbWF0Y2hlZFR5cGUgPSAkdGhpcy0+cmVnZXhTaGFwZU1hdGNoZXItPm1hdGNoRXhwcigkcGF0dGVybkFyZy0+dmFsdWUsICRmbGFnc1R5cGUsIFRyaW5hcnlMb2dpYzo6Y3JlYXRlRnJvbUJvb2xlYW4oJGNvbnRleHQtPnRydWUoKSksICRzY29wZSk7Cn0KCmlmICgkbWF0Y2hlZFR5cGUgPT09IG51bGwpIHsKcmV0dXJuIG5ldyBTcGVjaWZpZWRUeXBlcygpOwp9CgppZiAoCmluX2FycmF5KCRtZXRob2RSZWZsZWN0aW9uLT5nZXROYW1lKCksIFsnbWF0Y2hTdHJpY3RHcm91cHMnLCAnaXNNYXRjaFN0cmljdEdyb3VwcycsICdtYXRjaEFsbFN0cmljdEdyb3VwcycsICdpc01hdGNoQWxsU3RyaWN0R3JvdXBzJ10sIHRydWUpCikgewokbWF0Y2hlZFR5cGUgPSBQcmVnTWF0Y2hGbGFnczo6cmVtb3ZlTnVsbEZyb21NYXRjaGVzKCRtYXRjaGVkVHlwZSk7Cn0KCiRvdmVyd3JpdGUgPSBmYWxzZTsKaWYgKCRjb250ZXh0LT5mYWxzZSgpKSB7CiRvdmVyd3JpdGUgPSB0cnVlOwokY29udGV4dCA9ICRjb250ZXh0LT5uZWdhdGUoKTsKfQoKCmlmIChtZXRob2RfZXhpc3RzKCdQSFBTdGFuXEFuYWx5c2VyXFNwZWNpZmllZFR5cGVzJywgJ3NldFJvb3RFeHByJykpIHsKCiR0eXBlU3BlY2lmaWVyID0gJHRoaXMtPnR5cGVTcGVjaWZpZXItPmNyZWF0ZSgKJG1hdGNoZXNBcmctPnZhbHVlLAokbWF0Y2hlZFR5cGUsCiRjb250ZXh0LAoKJHNjb3BlCiktPnNldFJvb3RFeHByKCRub2RlKTsKCnJldHVybiAkb3ZlcndyaXRlID8gJHR5cGVTcGVjaWZpZXItPnNldEFsd2F5c092ZXJ3cml0ZVR5cGVzKCkgOiAkdHlwZVNwZWNpZmllcjsKfQoKCnJldHVybiAkdGhpcy0+dHlwZVNwZWNpZmllci0+Y3JlYXRlKAokbWF0Y2hlc0FyZy0+dmFsdWUsCiRtYXRjaGVkVHlwZSwKJGNvbnRleHQsCgokb3ZlcndyaXRlLAokc2NvcGUsCiRub2RlCik7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlXFBIUFN0YW47Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGNyZVxSZWdleDsKdXNlIFBocFBhcnNlclxOb2RlXEV4cHJcU3RhdGljQ2FsbDsKdXNlIFBIUFN0YW5cQW5hbHlzZXJcU2NvcGU7CnVzZSBQSFBTdGFuXFJlZmxlY3Rpb25cTWV0aG9kUmVmbGVjdGlvbjsKdXNlIFBIUFN0YW5cUmVmbGVjdGlvblxOYXRpdmVcTmF0aXZlUGFyYW1ldGVyUmVmbGVjdGlvbjsKdXNlIFBIUFN0YW5cUmVmbGVjdGlvblxQYXJhbWV0ZXJSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxUcmluYXJ5TG9naWM7CnVzZSBQSFBTdGFuXFR5cGVcQ2xvc3VyZVR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcUGhwXFJlZ2V4QXJyYXlTaGFwZU1hdGNoZXI7CnVzZSBQSFBTdGFuXFR5cGVcU3RhdGljTWV0aG9kUGFyYW1ldGVyQ2xvc3VyZVR5cGVFeHRlbnNpb247CnVzZSBQSFBTdGFuXFR5cGVcU3RyaW5nVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlOwoKZmluYWwgY2xhc3MgUHJlZ1JlcGxhY2VDYWxsYmFja0Nsb3N1cmVUeXBlRXh0ZW5zaW9uIGltcGxlbWVudHMgU3RhdGljTWV0aG9kUGFyYW1ldGVyQ2xvc3VyZVR5cGVFeHRlbnNpb24KewoKCgpwcml2YXRlICRyZWdleFNoYXBlTWF0Y2hlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSZWdleEFycmF5U2hhcGVNYXRjaGVyICRyZWdleFNoYXBlTWF0Y2hlcikKewokdGhpcy0+cmVnZXhTaGFwZU1hdGNoZXIgPSAkcmVnZXhTaGFwZU1hdGNoZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1N0YXRpY01ldGhvZFN1cHBvcnRlZChNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uLCBQYXJhbWV0ZXJSZWZsZWN0aW9uICRwYXJhbWV0ZXIpOiBib29sCnsKcmV0dXJuIGluX2FycmF5KCRtZXRob2RSZWZsZWN0aW9uLT5nZXREZWNsYXJpbmdDbGFzcygpLT5nZXROYW1lKCksIFtQcmVnOjpjbGFzcywgUmVnZXg6OmNsYXNzXSwgdHJ1ZSkKJiYgaW5fYXJyYXkoJG1ldGhvZFJlZmxlY3Rpb24tPmdldE5hbWUoKSwgWydyZXBsYWNlQ2FsbGJhY2snXSwgdHJ1ZSkKJiYgJHBhcmFtZXRlci0+Z2V0TmFtZSgpID09PSAncmVwbGFjZW1lbnQnOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZUZyb21TdGF0aWNNZXRob2RDYWxsKE1ldGhvZFJlZmxlY3Rpb24gJG1ldGhvZFJlZmxlY3Rpb24sIFN0YXRpY0NhbGwgJG1ldGhvZENhbGwsIFBhcmFtZXRlclJlZmxlY3Rpb24gJHBhcmFtZXRlciwgU2NvcGUgJHNjb3BlKTogP1R5cGUKewokYXJncyA9ICRtZXRob2RDYWxsLT5nZXRBcmdzKCk7CiRwYXR0ZXJuQXJnID0gJGFyZ3NbMF0gPz8gbnVsbDsKJGZsYWdzQXJnID0gJGFyZ3NbNV0gPz8gbnVsbDsKCmlmICgKJHBhdHRlcm5BcmcgPT09IG51bGwKKSB7CnJldHVybiBudWxsOwp9CgokZmxhZ3NUeXBlID0gbnVsbDsKaWYgKCRmbGFnc0FyZyAhPT0gbnVsbCkgewokZmxhZ3NUeXBlID0gJHNjb3BlLT5nZXRUeXBlKCRmbGFnc0FyZy0+dmFsdWUpOwp9CgokbWF0Y2hlc1R5cGUgPSAkdGhpcy0+cmVnZXhTaGFwZU1hdGNoZXItPm1hdGNoRXhwcigkcGF0dGVybkFyZy0+dmFsdWUsICRmbGFnc1R5cGUsIFRyaW5hcnlMb2dpYzo6Y3JlYXRlWWVzKCksICRzY29wZSk7CmlmICgkbWF0Y2hlc1R5cGUgPT09IG51bGwpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBuZXcgQ2xvc3VyZVR5cGUoClsKbmV3IE5hdGl2ZVBhcmFtZXRlclJlZmxlY3Rpb24oJHBhcmFtZXRlci0+Z2V0TmFtZSgpLCAkcGFyYW1ldGVyLT5pc09wdGlvbmFsKCksICRtYXRjaGVzVHlwZSwgJHBhcmFtZXRlci0+cGFzc2VkQnlSZWZlcmVuY2UoKSwgJHBhcmFtZXRlci0+aXNWYXJpYWRpYygpLCAkcGFyYW1ldGVyLT5nZXREZWZhdWx0VmFsdWUoKSksCl0sCm5ldyBTdHJpbmdUeXBlKCkKKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmVcUEhQU3RhbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQY3JlXFJlZ2V4Owp1c2UgUGhwUGFyc2VyXE5vZGU7CnVzZSBQaHBQYXJzZXJcTm9kZVxFeHByXFN0YXRpY0NhbGw7CnVzZSBQaHBQYXJzZXJcTm9kZVxOYW1lXEZ1bGx5UXVhbGlmaWVkOwp1c2UgUEhQU3RhblxBbmFseXNlclxTY29wZTsKdXNlIFBIUFN0YW5cQW5hbHlzZXJcU3BlY2lmaWVkVHlwZXM7CnVzZSBQSFBTdGFuXFJ1bGVzXFJ1bGU7CnVzZSBQSFBTdGFuXFJ1bGVzXFJ1bGVFcnJvckJ1aWxkZXI7CnVzZSBQSFBTdGFuXFRyaW5hcnlMb2dpYzsKdXNlIFBIUFN0YW5cVHlwZVxPYmplY3RUeXBlOwp1c2UgUEhQU3RhblxUeXBlXFR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZUNvbWJpbmF0b3I7CnVzZSBQSFBTdGFuXFR5cGVcUGhwXFJlZ2V4QXJyYXlTaGFwZU1hdGNoZXI7CnVzZSBmdW5jdGlvbiBzcHJpbnRmOwoKCgoKZmluYWwgY2xhc3MgVW5zYWZlU3RyaWN0R3JvdXBzQ2FsbFJ1bGUgaW1wbGVtZW50cyBSdWxlCnsKCgoKcHJpdmF0ZSAkcmVnZXhTaGFwZU1hdGNoZXI7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUmVnZXhBcnJheVNoYXBlTWF0Y2hlciAkcmVnZXhTaGFwZU1hdGNoZXIpCnsKJHRoaXMtPnJlZ2V4U2hhcGVNYXRjaGVyID0gJHJlZ2V4U2hhcGVNYXRjaGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Tm9kZVR5cGUoKTogc3RyaW5nCnsKcmV0dXJuIFN0YXRpY0NhbGw6OmNsYXNzOwp9CgpwdWJsaWMgZnVuY3Rpb24gcHJvY2Vzc05vZGUoTm9kZSAkbm9kZSwgU2NvcGUgJHNjb3BlKTogYXJyYXkKewppZiAoISRub2RlLT5jbGFzcyBpbnN0YW5jZW9mIEZ1bGx5UXVhbGlmaWVkKSB7CnJldHVybiBbXTsKfQokaXNSZWdleCA9ICRub2RlLT5jbGFzcy0+dG9TdHJpbmcoKSA9PT0gUmVnZXg6OmNsYXNzOwokaXNQcmVnID0gJG5vZGUtPmNsYXNzLT50b1N0cmluZygpID09PSBQcmVnOjpjbGFzczsKaWYgKCEkaXNSZWdleCAmJiAhJGlzUHJlZykgewpyZXR1cm4gW107Cn0KaWYgKCEkbm9kZS0+bmFtZSBpbnN0YW5jZW9mIE5vZGVcSWRlbnRpZmllciB8fCAhaW5fYXJyYXkoJG5vZGUtPm5hbWUtPm5hbWUsIFsnbWF0Y2hTdHJpY3RHcm91cHMnLCAnaXNNYXRjaFN0cmljdEdyb3VwcycsICdtYXRjaEFsbFN0cmljdEdyb3VwcycsICdpc01hdGNoQWxsU3RyaWN0R3JvdXBzJ10sIHRydWUpKSB7CnJldHVybiBbXTsKfQoKJGFyZ3MgPSAkbm9kZS0+Z2V0QXJncygpOwppZiAoIWlzc2V0KCRhcmdzWzBdKSkgewpyZXR1cm4gW107Cn0KCiRwYXR0ZXJuQXJnID0gJGFyZ3NbMF0gPz8gbnVsbDsKaWYgKCRpc1ByZWcpIHsKaWYgKCFpc3NldCgkYXJnc1syXSkpIHsgCnJldHVybiBbXTsKfQokZmxhZ3NBcmcgPSAkYXJnc1szXSA/PyBudWxsOwp9IGVsc2UgewokZmxhZ3NBcmcgPSAkYXJnc1syXSA/PyBudWxsOwp9CgppZiAoJHBhdHRlcm5BcmcgPT09IG51bGwpIHsKcmV0dXJuIFtdOwp9CgokZmxhZ3NUeXBlID0gUHJlZ01hdGNoRmxhZ3M6OmdldFR5cGUoJGZsYWdzQXJnLCAkc2NvcGUpOwppZiAoJGZsYWdzVHlwZSA9PT0gbnVsbCkgewpyZXR1cm4gW107Cn0KCiRtYXRjaGVkVHlwZSA9ICR0aGlzLT5yZWdleFNoYXBlTWF0Y2hlci0+bWF0Y2hFeHByKCRwYXR0ZXJuQXJnLT52YWx1ZSwgJGZsYWdzVHlwZSwgVHJpbmFyeUxvZ2ljOjpjcmVhdGVZZXMoKSwgJHNjb3BlKTsKaWYgKCRtYXRjaGVkVHlwZSA9PT0gbnVsbCkgewpyZXR1cm4gWwpSdWxlRXJyb3JCdWlsZGVyOjptZXNzYWdlKHNwcmludGYoJ1RoZSAlcyBjYWxsIGlzIHBvdGVudGlhbGx5IHVuc2FmZSBhcyAkbWF0Y2hlc1wnIHR5cGUgY291bGQgbm90IGJlIGluZmVycmVkLicsICRub2RlLT5uYW1lLT5uYW1lKSkKLT5pZGVudGlmaWVyKCdjb21wb3NlclBjcmUubWF5YmVVbnNhZmVTdHJpY3RHcm91cHMnKQotPmJ1aWxkKCksCl07Cn0KCmlmIChjb3VudCgkbWF0Y2hlZFR5cGUtPmdldENvbnN0YW50QXJyYXlzKCkpID09PSAxKSB7CiRtYXRjaGVkVHlwZSA9ICRtYXRjaGVkVHlwZS0+Z2V0Q29uc3RhbnRBcnJheXMoKVswXTsKJG51bGxhYmxlR3JvdXBzID0gW107CmZvcmVhY2ggKCRtYXRjaGVkVHlwZS0+Z2V0VmFsdWVUeXBlcygpIGFzICRpbmRleCA9PiAkdHlwZSkgewppZiAoVHlwZUNvbWJpbmF0b3I6OmNvbnRhaW5zTnVsbCgkdHlwZSkpIHsKJG51bGxhYmxlR3JvdXBzW10gPSAkbWF0Y2hlZFR5cGUtPmdldEtleVR5cGVzKClbJGluZGV4XS0+Z2V0VmFsdWUoKTsKfQp9CgppZiAoXGNvdW50KCRudWxsYWJsZUdyb3VwcykgPiAwKSB7CnJldHVybiBbClJ1bGVFcnJvckJ1aWxkZXI6Om1lc3NhZ2Uoc3ByaW50ZigKJ1RoZSAlcyBjYWxsIGlzIHVuc2FmZSBhcyBtYXRjaCBncm91cCVzICIlcyIgJXMgb3B0aW9uYWwgYW5kIG1heSBiZSBudWxsLicsCiRub2RlLT5uYW1lLT5uYW1lLApcY291bnQoJG51bGxhYmxlR3JvdXBzKSA+IDEgPyAncycgOiAnJywKaW1wbG9kZSgnIiwgIicsICRudWxsYWJsZUdyb3VwcyksClxjb3VudCgkbnVsbGFibGVHcm91cHMpID4gMSA/ICdhcmUnIDogJ2lzJwopKS0+aWRlbnRpZmllcignY29tcG9zZXJQY3JlLnVuc2FmZVN0cmljdEdyb3VwcycpLT5idWlsZCgpLApdOwp9Cn0KCnJldHVybiBbXTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmNsYXNzIFBjcmVFeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbgp7CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tRnVuY3Rpb24oJGZ1bmN0aW9uLCAkcGF0dGVybikKewokY29kZSA9IHByZWdfbGFzdF9lcnJvcigpOwoKaWYgKGlzX2FycmF5KCRwYXR0ZXJuKSkgewokcGF0dGVybiA9IGltcGxvZGUoJywgJywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gbmV3IFBjcmVFeGNlcHRpb24oJGZ1bmN0aW9uLicoKTogZmFpbGVkIGV4ZWN1dGluZyAiJy4kcGF0dGVybi4nIjogJy5zZWxmOjpwY3JlTGFzdEVycm9yTWVzc2FnZSgkY29kZSksICRjb2RlKTsKfQoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHBjcmVMYXN0RXJyb3JNZXNzYWdlKCRjb2RlKQp7CmlmIChmdW5jdGlvbl9leGlzdHMoJ3ByZWdfbGFzdF9lcnJvcl9tc2cnKSkgewpyZXR1cm4gcHJlZ19sYXN0X2Vycm9yX21zZygpOwp9CgoKaWYgKFBIUF9WRVJTSU9OX0lEIDwgNzAyMDEgJiYgJGNvZGUgPT09IDApIHsKcmV0dXJuICdVTkRFRklORURfRVJST1InOwp9CgokY29uc3RhbnRzID0gZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpOwppZiAoIWlzc2V0KCRjb25zdGFudHNbJ3BjcmUnXSkgfHwgIWlzX2FycmF5KCRjb25zdGFudHNbJ3BjcmUnXSkpIHsKcmV0dXJuICdVTkRFRklORURfRVJST1InOwp9Cgpmb3JlYWNoICgkY29uc3RhbnRzWydwY3JlJ10gYXMgJGNvbnN0ID0+ICR2YWwpIHsKaWYgKCR2YWwgPT09ICRjb2RlICYmIHN1YnN0cigkY29uc3QsIC02KSA9PT0gJ19FUlJPUicpIHsKcmV0dXJuICRjb25zdDsKfQp9CgpyZXR1cm4gJ1VOREVGSU5FRF9FUlJPUic7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpjbGFzcyBQcmVnCnsKCnB1YmxpYyBjb25zdCBBUlJBWV9NU0cgPSAnJHN1YmplY3QgYXMgYW4gYXJyYXkgaXMgbm90IHN1cHBvcnRlZC4gWW91IGNhbiB1c2UgXCdmb3JlYWNoXCcgaW5zdGVhZC4nOwoKcHVibGljIGNvbnN0IElOVkFMSURfVFlQRV9NU0cgPSAnJHN1YmplY3QgbXVzdCBiZSBhIHN0cmluZywgJXMgZ2l2ZW4uJzsKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaChzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcyA9IG51bGwsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBpbnQKewpzZWxmOjpjaGVja09mZnNldENhcHR1cmUoJGZsYWdzLCAnbWF0Y2hXaXRoT2Zmc2V0cycpOwoKJHJlc3VsdCA9IHNlbGY6OnByZWdNYXRjaCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MgfCBQUkVHX1VOTUFUQ0hFRF9BU19OVUxMLCAkb2Zmc2V0KTsKaWYgKCRyZXN1bHQgPT09IGZhbHNlKSB7CnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19tYXRjaCcsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaFN0cmljdEdyb3VwcyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcyA9IG51bGwsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBpbnQKewokcmVzdWx0ID0gc2VsZjo6bWF0Y2goJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlc0ludGVybmFsLCAkZmxhZ3MsICRvZmZzZXQpOwokbWF0Y2hlcyA9IHNlbGY6OmVuZm9yY2VOb25OdWxsTWF0Y2hlcygkcGF0dGVybiwgJG1hdGNoZXNJbnRlcm5hbCwgJ21hdGNoJyk7CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2hXaXRoT2Zmc2V0cyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcywgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGludAp7CiRyZXN1bHQgPSBzZWxmOjpwcmVnTWF0Y2goJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzIHwgUFJFR19VTk1BVENIRURfQVNfTlVMTCB8IFBSRUdfT0ZGU0VUX0NBUFRVUkUsICRvZmZzZXQpOwppZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX21hdGNoJywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoQWxsKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzID0gbnVsbCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGludAp7CnNlbGY6OmNoZWNrT2Zmc2V0Q2FwdHVyZSgkZmxhZ3MsICdtYXRjaEFsbFdpdGhPZmZzZXRzJyk7CnNlbGY6OmNoZWNrU2V0T3JkZXIoJGZsYWdzKTsKCiRyZXN1bHQgPSBwcmVnX21hdGNoX2FsbCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MgfCBQUkVHX1VOTUFUQ0hFRF9BU19OVUxMLCAkb2Zmc2V0KTsKaWYgKCFpc19pbnQoJHJlc3VsdCkpIHsgCnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19tYXRjaF9hbGwnLCAkcGF0dGVybik7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2hBbGxTdHJpY3RHcm91cHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMgPSBudWxsLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogaW50CnsKJHJlc3VsdCA9IHNlbGY6Om1hdGNoQWxsKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXNJbnRlcm5hbCwgJGZsYWdzLCAkb2Zmc2V0KTsKJG1hdGNoZXMgPSBzZWxmOjplbmZvcmNlTm9uTnVsbE1hdGNoQWxsKCRwYXR0ZXJuLCAkbWF0Y2hlc0ludGVybmFsLCAnbWF0Y2hBbGwnKTsKCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaEFsbFdpdGhPZmZzZXRzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogaW50CnsKc2VsZjo6Y2hlY2tTZXRPcmRlcigkZmxhZ3MpOwoKJHJlc3VsdCA9IHByZWdfbWF0Y2hfYWxsKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncyB8IFBSRUdfVU5NQVRDSEVEX0FTX05VTEwgfCBQUkVHX09GRlNFVF9DQVBUVVJFLCAkb2Zmc2V0KTsKaWYgKCFpc19pbnQoJHJlc3VsdCkpIHsgCnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19tYXRjaF9hbGwnLCAkcGF0dGVybik7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZSgkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgaW50ICRsaW1pdCA9IC0xLCA/aW50ICYkY291bnQgPSBudWxsKTogc3RyaW5nCnsKaWYgKCFpc19zY2FsYXIoJHN1YmplY3QpKSB7CmlmIChpc19hcnJheSgkc3ViamVjdCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3RhdGljOjpBUlJBWV9NU0cpOwp9Cgp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKHN0YXRpYzo6SU5WQUxJRF9UWVBFX01TRywgZ2V0dHlwZSgkc3ViamVjdCkpKTsKfQoKJHJlc3VsdCA9IHByZWdfcmVwbGFjZSgkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgJGxpbWl0LCAkY291bnQpOwppZiAoJHJlc3VsdCA9PT0gbnVsbCkgewp0aHJvdyBQY3JlRXhjZXB0aW9uOjpmcm9tRnVuY3Rpb24oJ3ByZWdfcmVwbGFjZScsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZUNhbGxiYWNrKCRwYXR0ZXJuLCBjYWxsYWJsZSAkcmVwbGFjZW1lbnQsICRzdWJqZWN0LCBpbnQgJGxpbWl0ID0gLTEsID9pbnQgJiRjb3VudCA9IG51bGwsIGludCAkZmxhZ3MgPSAwKTogc3RyaW5nCnsKaWYgKCFpc19zY2FsYXIoJHN1YmplY3QpKSB7CmlmIChpc19hcnJheSgkc3ViamVjdCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3RhdGljOjpBUlJBWV9NU0cpOwp9Cgp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKHN0YXRpYzo6SU5WQUxJRF9UWVBFX01TRywgZ2V0dHlwZSgkc3ViamVjdCkpKTsKfQoKaWYgKFBIUF9WRVJTSU9OX0lEID49IDcwNDAwKSB7CiRyZXN1bHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJHBhdHRlcm4sICRyZXBsYWNlbWVudCwgJHN1YmplY3QsICRsaW1pdCwgJGNvdW50LCAkZmxhZ3MpOwp9IGVsc2UgewokcmVzdWx0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCk7Cn0KaWYgKCRyZXN1bHQgPT09IG51bGwpIHsKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX3JlcGxhY2VfY2FsbGJhY2snLCAkcGF0dGVybik7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZUNhbGxiYWNrQXJyYXkoYXJyYXkgJHBhdHRlcm4sICRzdWJqZWN0LCBpbnQgJGxpbWl0ID0gLTEsID9pbnQgJiRjb3VudCA9IG51bGwsIGludCAkZmxhZ3MgPSAwKTogc3RyaW5nCnsKaWYgKCFpc19zY2FsYXIoJHN1YmplY3QpKSB7CmlmIChpc19hcnJheSgkc3ViamVjdCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3RhdGljOjpBUlJBWV9NU0cpOwp9Cgp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKHN0YXRpYzo6SU5WQUxJRF9UWVBFX01TRywgZ2V0dHlwZSgkc3ViamVjdCkpKTsKfQoKaWYgKFBIUF9WRVJTSU9OX0lEID49IDcwNDAwKSB7CiRyZXN1bHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2tfYXJyYXkoJHBhdHRlcm4sICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCwgJGZsYWdzKTsKfSBlbHNlIHsKJHJlc3VsdCA9IHByZWdfcmVwbGFjZV9jYWxsYmFja19hcnJheSgkcGF0dGVybiwgJHN1YmplY3QsICRsaW1pdCwgJGNvdW50KTsKfQppZiAoJHJlc3VsdCA9PT0gbnVsbCkgewokcGF0dGVybiA9IGFycmF5X2tleXMoJHBhdHRlcm4pOwp0aHJvdyBQY3JlRXhjZXB0aW9uOjpmcm9tRnVuY3Rpb24oJ3ByZWdfcmVwbGFjZV9jYWxsYmFja19hcnJheScsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNwbGl0KHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGxpbWl0ID0gLTEsIGludCAkZmxhZ3MgPSAwKTogYXJyYXkKewppZiAoKCRmbGFncyAmIFBSRUdfU1BMSVRfT0ZGU0VUX0NBUFRVUkUpICE9PSAwKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQUkVHX1NQTElUX09GRlNFVF9DQVBUVVJFIGlzIG5vdCBzdXBwb3J0ZWQgYXMgaXQgY2hhbmdlcyB0aGUgdHlwZSBvZiAkbWF0Y2hlcywgdXNlIHNwbGl0V2l0aE9mZnNldHMoKSBpbnN0ZWFkJyk7Cn0KCiRyZXN1bHQgPSBwcmVnX3NwbGl0KCRwYXR0ZXJuLCAkc3ViamVjdCwgJGxpbWl0LCAkZmxhZ3MpOwppZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX3NwbGl0JywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNwbGl0V2l0aE9mZnNldHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgaW50ICRmbGFncyA9IDApOiBhcnJheQp7CiRyZXN1bHQgPSBwcmVnX3NwbGl0KCRwYXR0ZXJuLCAkc3ViamVjdCwgJGxpbWl0LCAkZmxhZ3MgfCBQUkVHX1NQTElUX09GRlNFVF9DQVBUVVJFKTsKaWYgKCRyZXN1bHQgPT09IGZhbHNlKSB7CnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19zcGxpdCcsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyZXAoc3RyaW5nICRwYXR0ZXJuLCBhcnJheSAkYXJyYXksIGludCAkZmxhZ3MgPSAwKTogYXJyYXkKewokcmVzdWx0ID0gcHJlZ19ncmVwKCRwYXR0ZXJuLCAkYXJyYXksICRmbGFncyk7CmlmICgkcmVzdWx0ID09PSBmYWxzZSkgewp0aHJvdyBQY3JlRXhjZXB0aW9uOjpmcm9tRnVuY3Rpb24oJ3ByZWdfZ3JlcCcsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNNYXRjaChzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcyA9IG51bGwsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBib29sCnsKcmV0dXJuIChib29sKSBzdGF0aWM6Om1hdGNoKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTWF0Y2hTdHJpY3RHcm91cHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMgPSBudWxsLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogYm9vbAp7CnJldHVybiAoYm9vbCkgc2VsZjo6bWF0Y2hTdHJpY3RHcm91cHMoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc01hdGNoQWxsKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzID0gbnVsbCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpIHN0YXRpYzo6bWF0Y2hBbGwoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc01hdGNoQWxsU3RyaWN0R3JvdXBzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzID0gbnVsbCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpIHNlbGY6Om1hdGNoQWxsU3RyaWN0R3JvdXBzKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc01hdGNoV2l0aE9mZnNldHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBib29sCnsKcmV0dXJuIChib29sKSBzdGF0aWM6Om1hdGNoV2l0aE9mZnNldHMoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTWF0Y2hBbGxXaXRoT2Zmc2V0cyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcywgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpIHN0YXRpYzo6bWF0Y2hBbGxXaXRoT2Zmc2V0cygkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjaGVja09mZnNldENhcHR1cmUoaW50ICRmbGFncywgc3RyaW5nICR1c2VGdW5jdGlvbk5hbWUpOiB2b2lkCnsKaWYgKCgkZmxhZ3MgJiBQUkVHX09GRlNFVF9DQVBUVVJFKSAhPT0gMCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUFJFR19PRkZTRVRfQ0FQVFVSRSBpcyBub3Qgc3VwcG9ydGVkIGFzIGl0IGNoYW5nZXMgdGhlIHR5cGUgb2YgJG1hdGNoZXMsIHVzZSAnIC4gJHVzZUZ1bmN0aW9uTmFtZSAuICcoKSBpbnN0ZWFkJyk7Cn0KfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY2hlY2tTZXRPcmRlcihpbnQgJGZsYWdzKTogdm9pZAp7CmlmICgoJGZsYWdzICYgUFJFR19TRVRfT1JERVIpICE9PSAwKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQUkVHX1NFVF9PUkRFUiBpcyBub3Qgc3VwcG9ydGVkIGFzIGl0IGNoYW5nZXMgdGhlIHR5cGUgb2YgJG1hdGNoZXMnKTsKfQp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGVuZm9yY2VOb25OdWxsTWF0Y2hlcyhzdHJpbmcgJHBhdHRlcm4sIGFycmF5ICRtYXRjaGVzLCBzdHJpbmcgJHZhcmlhbnRNZXRob2QpCnsKZm9yZWFjaCAoJG1hdGNoZXMgYXMgJGdyb3VwID0+ICRtYXRjaCkgewppZiAobnVsbCA9PT0gJG1hdGNoKSB7CnRocm93IG5ldyBVbmV4cGVjdGVkTnVsbE1hdGNoRXhjZXB0aW9uKCdQYXR0ZXJuICInLiRwYXR0ZXJuLiciIGhhZCBhbiB1bmV4cGVjdGVkIHVubWF0Y2hlZCBncm91cCAiJy4kZ3JvdXAuJyIsIG1ha2Ugc3VyZSB0aGUgcGF0dGVybiBhbHdheXMgbWF0Y2hlcyBvciB1c2UgJy4kdmFyaWFudE1ldGhvZC4nKCkgaW5zdGVhZC4nKTsKfQp9CgoKcmV0dXJuICRtYXRjaGVzOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGVuZm9yY2VOb25OdWxsTWF0Y2hBbGwoc3RyaW5nICRwYXR0ZXJuLCBhcnJheSAkbWF0Y2hlcywgc3RyaW5nICR2YXJpYW50TWV0aG9kKQp7CmZvcmVhY2ggKCRtYXRjaGVzIGFzICRncm91cCA9PiAkZ3JvdXBNYXRjaGVzKSB7CmZvcmVhY2ggKCRncm91cE1hdGNoZXMgYXMgJG1hdGNoKSB7CmlmIChudWxsID09PSAkbWF0Y2gpIHsKdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsTWF0Y2hFeGNlcHRpb24oJ1BhdHRlcm4gIicuJHBhdHRlcm4uJyIgaGFkIGFuIHVuZXhwZWN0ZWQgdW5tYXRjaGVkIGdyb3VwICInLiRncm91cC4nIiwgbWFrZSBzdXJlIHRoZSBwYXR0ZXJuIGFsd2F5cyBtYXRjaGVzIG9yIHVzZSAnLiR2YXJpYW50TWV0aG9kLicoKSBpbnN0ZWFkLicpOwp9Cn0KfQoKCnJldHVybiAkbWF0Y2hlczsKfQoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBwcmVnTWF0Y2goc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMgPSBudWxsLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKQp7CmlmIChQSFBfVkVSU0lPTl9JRCA+PSA3MDQwMCkgewpyZXR1cm4gcHJlZ19tYXRjaCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwp9CgoKCgoKCgoKJHJlc3VsdCA9IHByZWdfbWF0Y2hfYWxsKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXNJbnRlcm5hbCwgJGZsYWdzLCAkb2Zmc2V0KTsKaWYgKCFpc19pbnQoJHJlc3VsdCkpIHsgCnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19tYXRjaCcsICRwYXR0ZXJuKTsKfQoKaWYgKCRyZXN1bHQgPT09IDApIHsKJG1hdGNoZXMgPSBbXTsKfSBlbHNlIHsKCiRtYXRjaGVzID0gYXJyYXlfbWFwKGZ1bmN0aW9uIChhcnJheSAkbSkgewokZmlyc3QgPSByZXNldCgkbSk7CmFzc2VydCgkZmlyc3QgIT09IGZhbHNlKTsKcmV0dXJuICRmaXJzdDsKfSwgJG1hdGNoZXNJbnRlcm5hbCk7CiRyZXN1bHQgPSBtaW4oJHJlc3VsdCwgMSk7Cn0KCnJldHVybiAkcmVzdWx0Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlOwoKY2xhc3MgUmVnZXgKewoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTWF0Y2goc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsIGludCAkb2Zmc2V0ID0gMCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpIFByZWc6Om1hdGNoKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsIDAsICRvZmZzZXQpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaChzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IE1hdGNoUmVzdWx0CnsKc2VsZjo6Y2hlY2tPZmZzZXRDYXB0dXJlKCRmbGFncywgJ21hdGNoV2l0aE9mZnNldHMnKTsKCiRjb3VudCA9IFByZWc6Om1hdGNoKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7CgpyZXR1cm4gbmV3IE1hdGNoUmVzdWx0KCRjb3VudCwgJG1hdGNoZXMpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaFN0cmljdEdyb3VwcyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IE1hdGNoU3RyaWN0R3JvdXBzUmVzdWx0CnsKCiRjb3VudCA9IFByZWc6Om1hdGNoU3RyaWN0R3JvdXBzKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7CgpyZXR1cm4gbmV3IE1hdGNoU3RyaWN0R3JvdXBzUmVzdWx0KCRjb3VudCwgJG1hdGNoZXMpOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoV2l0aE9mZnNldHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBNYXRjaFdpdGhPZmZzZXRzUmVzdWx0CnsKJGNvdW50ID0gUHJlZzo6bWF0Y2hXaXRoT2Zmc2V0cygkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwoKcmV0dXJuIG5ldyBNYXRjaFdpdGhPZmZzZXRzUmVzdWx0KCRjb3VudCwgJG1hdGNoZXMpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaEFsbChzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IE1hdGNoQWxsUmVzdWx0CnsKc2VsZjo6Y2hlY2tPZmZzZXRDYXB0dXJlKCRmbGFncywgJ21hdGNoQWxsV2l0aE9mZnNldHMnKTsKc2VsZjo6Y2hlY2tTZXRPcmRlcigkZmxhZ3MpOwoKJGNvdW50ID0gUHJlZzo6bWF0Y2hBbGwoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKCnJldHVybiBuZXcgTWF0Y2hBbGxSZXN1bHQoJGNvdW50LCAkbWF0Y2hlcyk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoQWxsU3RyaWN0R3JvdXBzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogTWF0Y2hBbGxTdHJpY3RHcm91cHNSZXN1bHQKewpzZWxmOjpjaGVja09mZnNldENhcHR1cmUoJGZsYWdzLCAnbWF0Y2hBbGxXaXRoT2Zmc2V0cycpOwpzZWxmOjpjaGVja1NldE9yZGVyKCRmbGFncyk7CgoKJGNvdW50ID0gUHJlZzo6bWF0Y2hBbGxTdHJpY3RHcm91cHMoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKCnJldHVybiBuZXcgTWF0Y2hBbGxTdHJpY3RHcm91cHNSZXN1bHQoJGNvdW50LCAkbWF0Y2hlcyk7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2hBbGxXaXRoT2Zmc2V0cyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IE1hdGNoQWxsV2l0aE9mZnNldHNSZXN1bHQKewpzZWxmOjpjaGVja1NldE9yZGVyKCRmbGFncyk7CgokY291bnQgPSBQcmVnOjptYXRjaEFsbFdpdGhPZmZzZXRzKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7CgpyZXR1cm4gbmV3IE1hdGNoQWxsV2l0aE9mZnNldHNSZXN1bHQoJGNvdW50LCAkbWF0Y2hlcyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlcGxhY2UoJHBhdHRlcm4sICRyZXBsYWNlbWVudCwgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSk6IFJlcGxhY2VSZXN1bHQKewokcmVzdWx0ID0gUHJlZzo6cmVwbGFjZSgkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgJGxpbWl0LCAkY291bnQpOwoKcmV0dXJuIG5ldyBSZXBsYWNlUmVzdWx0KCRjb3VudCwgJHJlc3VsdCk7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZUNhbGxiYWNrKCRwYXR0ZXJuLCBjYWxsYWJsZSAkcmVwbGFjZW1lbnQsICRzdWJqZWN0LCBpbnQgJGxpbWl0ID0gLTEsIGludCAkZmxhZ3MgPSAwKTogUmVwbGFjZVJlc3VsdAp7CiRyZXN1bHQgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJHBhdHRlcm4sICRyZXBsYWNlbWVudCwgJHN1YmplY3QsICRsaW1pdCwgJGNvdW50LCAkZmxhZ3MpOwoKcmV0dXJuIG5ldyBSZXBsYWNlUmVzdWx0KCRjb3VudCwgJHJlc3VsdCk7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlQ2FsbGJhY2tBcnJheShhcnJheSAkcGF0dGVybiwgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgaW50ICRmbGFncyA9IDApOiBSZXBsYWNlUmVzdWx0CnsKJHJlc3VsdCA9IFByZWc6OnJlcGxhY2VDYWxsYmFja0FycmF5KCRwYXR0ZXJuLCAkc3ViamVjdCwgJGxpbWl0LCAkY291bnQsICRmbGFncyk7CgpyZXR1cm4gbmV3IFJlcGxhY2VSZXN1bHQoJGNvdW50LCAkcmVzdWx0KTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY2hlY2tPZmZzZXRDYXB0dXJlKGludCAkZmxhZ3MsIHN0cmluZyAkdXNlRnVuY3Rpb25OYW1lKTogdm9pZAp7CmlmICgoJGZsYWdzICYgUFJFR19PRkZTRVRfQ0FQVFVSRSkgIT09IDApIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BSRUdfT0ZGU0VUX0NBUFRVUkUgaXMgbm90IHN1cHBvcnRlZCBhcyBpdCBjaGFuZ2VzIHRoZSByZXR1cm4gdHlwZSwgdXNlICcuJHVzZUZ1bmN0aW9uTmFtZS4nKCkgaW5zdGVhZCcpOwp9Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNoZWNrU2V0T3JkZXIoaW50ICRmbGFncyk6IHZvaWQKewppZiAoKCRmbGFncyAmIFBSRUdfU0VUX09SREVSKSAhPT0gMCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUFJFR19TRVRfT1JERVIgaXMgbm90IHN1cHBvcnRlZCBhcyBpdCBjaGFuZ2VzIHRoZSByZXR1cm4gdHlwZScpOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpmaW5hbCBjbGFzcyBSZXBsYWNlUmVzdWx0CnsKCgoKCnB1YmxpYyAkcmVzdWx0OwoKCgoKCnB1YmxpYyAkY291bnQ7CgoKCgoKcHVibGljICRtYXRjaGVkOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkY291bnQsIHN0cmluZyAkcmVzdWx0KQp7CiR0aGlzLT5jb3VudCA9ICRjb3VudDsKJHRoaXMtPm1hdGNoZWQgPSAoYm9vbCkgJGNvdW50OwokdGhpcy0+cmVzdWx0ID0gJHJlc3VsdDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmNsYXNzIFVuZXhwZWN0ZWROdWxsTWF0Y2hFeGNlcHRpb24gZXh0ZW5kcyBQY3JlRXhjZXB0aW9uCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tRnVuY3Rpb24oJGZ1bmN0aW9uLCAkcGF0dGVybikKewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdmcm9tRnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gJy5zZWxmOjpjbGFzcy4nLCB1c2UgJy5QY3JlRXhjZXB0aW9uOjpjbGFzcyk7Cn0KfQoKQ29weXJpZ2h0IChDKSAyMDE1IENvbXBvc2VyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCnNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXI7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKCmNsYXNzIENvbXBhcmF0b3IKewoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JlYXRlclRoYW4oJHZlcnNpb24xLCAkdmVyc2lvbjIpCnsKcmV0dXJuIHNlbGY6OmNvbXBhcmUoJHZlcnNpb24xLCAnPicsICR2ZXJzaW9uMik7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmVhdGVyVGhhbk9yRXF1YWxUbygkdmVyc2lvbjEsICR2ZXJzaW9uMikKewpyZXR1cm4gc2VsZjo6Y29tcGFyZSgkdmVyc2lvbjEsICc+PScsICR2ZXJzaW9uMik7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsZXNzVGhhbigkdmVyc2lvbjEsICR2ZXJzaW9uMikKewpyZXR1cm4gc2VsZjo6Y29tcGFyZSgkdmVyc2lvbjEsICc8JywgJHZlcnNpb24yKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxlc3NUaGFuT3JFcXVhbFRvKCR2ZXJzaW9uMSwgJHZlcnNpb24yKQp7CnJldHVybiBzZWxmOjpjb21wYXJlKCR2ZXJzaW9uMSwgJzw9JywgJHZlcnNpb24yKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVxdWFsVG8oJHZlcnNpb24xLCAkdmVyc2lvbjIpCnsKcmV0dXJuIHNlbGY6OmNvbXBhcmUoJHZlcnNpb24xLCAnPT0nLCAkdmVyc2lvbjIpOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbm90RXF1YWxUbygkdmVyc2lvbjEsICR2ZXJzaW9uMikKewpyZXR1cm4gc2VsZjo6Y29tcGFyZSgkdmVyc2lvbjEsICchPScsICR2ZXJzaW9uMik7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb21wYXJlKCR2ZXJzaW9uMSwgJG9wZXJhdG9yLCAkdmVyc2lvbjIpCnsKJGNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgkb3BlcmF0b3IsICR2ZXJzaW9uMik7CgpyZXR1cm4gJGNvbnN0cmFpbnQtPm1hdGNoU3BlY2lmaWMobmV3IENvbnN0cmFpbnQoJz09JywgJHZlcnNpb24xKSwgdHJ1ZSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlcjsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKCgoKCmNsYXNzIENvbXBpbGluZ01hdGNoZXIKewoKCgoKcHJpdmF0ZSBzdGF0aWMgJGNvbXBpbGVkQ2hlY2tlckNhY2hlID0gYXJyYXkoKTsKCgoKCnByaXZhdGUgc3RhdGljICRyZXN1bHRDYWNoZSA9IGFycmF5KCk7CgoKcHJpdmF0ZSBzdGF0aWMgJGVuYWJsZWQ7CgoKCgpwcml2YXRlIHN0YXRpYyAkdHJhbnNPcEludCA9IGFycmF5KApDb25zdHJhaW50OjpPUF9FUSA9PiBDb25zdHJhaW50OjpTVFJfT1BfRVEsCkNvbnN0cmFpbnQ6Ok9QX0xUID0+IENvbnN0cmFpbnQ6OlNUUl9PUF9MVCwKQ29uc3RyYWludDo6T1BfTEUgPT4gQ29uc3RyYWludDo6U1RSX09QX0xFLApDb25zdHJhaW50OjpPUF9HVCA9PiBDb25zdHJhaW50OjpTVFJfT1BfR1QsCkNvbnN0cmFpbnQ6Ok9QX0dFID0+IENvbnN0cmFpbnQ6OlNUUl9PUF9HRSwKQ29uc3RyYWludDo6T1BfTkUgPT4gQ29uc3RyYWludDo6U1RSX09QX05FLAopOwoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsZWFyKCkKewpzZWxmOjokcmVzdWx0Q2FjaGUgPSBhcnJheSgpOwpzZWxmOjokY29tcGlsZWRDaGVja2VyQ2FjaGUgPSBhcnJheSgpOwp9CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaChDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50LCAkb3BlcmF0b3IsICR2ZXJzaW9uKQp7CiRyZXN1bHRDYWNoZUtleSA9ICRvcGVyYXRvci4kY29uc3RyYWludC4nOycuJHZlcnNpb247CgppZiAoaXNzZXQoc2VsZjo6JHJlc3VsdENhY2hlWyRyZXN1bHRDYWNoZUtleV0pKSB7CnJldHVybiBzZWxmOjokcmVzdWx0Q2FjaGVbJHJlc3VsdENhY2hlS2V5XTsKfQoKaWYgKHNlbGY6OiRlbmFibGVkID09PSBudWxsKSB7CnNlbGY6OiRlbmFibGVkID0gIVxpbl9hcnJheSgnZXZhbCcsIGV4cGxvZGUoJywnLCAoc3RyaW5nKSBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSwgdHJ1ZSk7Cn0KaWYgKCFzZWxmOjokZW5hYmxlZCkgewpyZXR1cm4gc2VsZjo6JHJlc3VsdENhY2hlWyRyZXN1bHRDYWNoZUtleV0gPSAkY29uc3RyYWludC0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludChzZWxmOjokdHJhbnNPcEludFskb3BlcmF0b3JdLCAkdmVyc2lvbikpOwp9CgokY2FjaGVLZXkgPSAkb3BlcmF0b3IuJGNvbnN0cmFpbnQ7CmlmICghaXNzZXQoc2VsZjo6JGNvbXBpbGVkQ2hlY2tlckNhY2hlWyRjYWNoZUtleV0pKSB7CiRjb2RlID0gJGNvbnN0cmFpbnQtPmNvbXBpbGUoJG9wZXJhdG9yKTsKc2VsZjo6JGNvbXBpbGVkQ2hlY2tlckNhY2hlWyRjYWNoZUtleV0gPSAkZnVuY3Rpb24gPSBldmFsKCdyZXR1cm4gZnVuY3Rpb24oJHYsICRiKXtyZXR1cm4gJy4kY29kZS4nO307Jyk7Cn0gZWxzZSB7CiRmdW5jdGlvbiA9IHNlbGY6OiRjb21waWxlZENoZWNrZXJDYWNoZVskY2FjaGVLZXldOwp9CgpyZXR1cm4gc2VsZjo6JHJlc3VsdENhY2hlWyRyZXN1bHRDYWNoZUtleV0gPSAkZnVuY3Rpb24oJHZlcnNpb24sIHN0cnBvcygkdmVyc2lvbiwgJ2Rldi0nKSA9PT0gMCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50OwoKY2xhc3MgQm91bmQKewoKCgpwcml2YXRlICR2ZXJzaW9uOwoKCgoKcHJpdmF0ZSAkaXNJbmNsdXNpdmU7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR2ZXJzaW9uLCAkaXNJbmNsdXNpdmUpCnsKJHRoaXMtPnZlcnNpb24gPSAkdmVyc2lvbjsKJHRoaXMtPmlzSW5jbHVzaXZlID0gJGlzSW5jbHVzaXZlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpCnsKcmV0dXJuICR0aGlzLT52ZXJzaW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbmNsdXNpdmUoKQp7CnJldHVybiAkdGhpcy0+aXNJbmNsdXNpdmU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1plcm8oKQp7CnJldHVybiAkdGhpcy0+Z2V0VmVyc2lvbigpID09PSAnMC4wLjAuMC1kZXYnICYmICR0aGlzLT5pc0luY2x1c2l2ZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQb3NpdGl2ZUluZmluaXR5KCkKewpyZXR1cm4gJHRoaXMtPmdldFZlcnNpb24oKSA9PT0gUEhQX0lOVF9NQVguJy4wLjAuMCcgJiYgISR0aGlzLT5pc0luY2x1c2l2ZSgpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21wYXJlVG8oQm91bmQgJG90aGVyLCAkb3BlcmF0b3IpCnsKaWYgKCFcaW5fYXJyYXkoJG9wZXJhdG9yLCBhcnJheSgnPCcsICc+JyksIHRydWUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdEb2VzIG5vdCBzdXBwb3J0IGFueSBvdGhlciBvcGVyYXRvciBvdGhlciB0aGFuID4gb3IgPC4nKTsKfQoKCmlmICgkdGhpcyA9PSAkb3RoZXIpIHsKcmV0dXJuIGZhbHNlOwp9CgokY29tcGFyZVJlc3VsdCA9IHZlcnNpb25fY29tcGFyZSgkdGhpcy0+Z2V0VmVyc2lvbigpLCAkb3RoZXItPmdldFZlcnNpb24oKSk7CgoKaWYgKDAgIT09ICRjb21wYXJlUmVzdWx0KSB7CnJldHVybiAoKCc+JyA9PT0gJG9wZXJhdG9yKSA/IDEgOiAtMSkgPT09ICRjb21wYXJlUmVzdWx0Owp9CgoKcmV0dXJuICc+JyA9PT0gJG9wZXJhdG9yID8gJG90aGVyLT5pc0luY2x1c2l2ZSgpIDogISRvdGhlci0+aXNJbmNsdXNpdmUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CnJldHVybiBzcHJpbnRmKAonJXMgWyVzXScsCiR0aGlzLT5nZXRWZXJzaW9uKCksCiR0aGlzLT5pc0luY2x1c2l2ZSgpID8gJ2luY2x1c2l2ZScgOiAnZXhjbHVzaXZlJwopOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHplcm8oKQp7CnJldHVybiBuZXcgQm91bmQoJzAuMC4wLjAtZGV2JywgdHJ1ZSk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9zaXRpdmVJbmZpbml0eSgpCnsKcmV0dXJuIG5ldyBCb3VuZChQSFBfSU5UX01BWC4nLjAuMC4wJywgZmFsc2UpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludDsKCgoKCmNsYXNzIENvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKCmNvbnN0IE9QX0VRID0gMDsKY29uc3QgT1BfTFQgPSAxOwpjb25zdCBPUF9MRSA9IDI7CmNvbnN0IE9QX0dUID0gMzsKY29uc3QgT1BfR0UgPSA0Owpjb25zdCBPUF9ORSA9IDU7CgoKY29uc3QgU1RSX09QX0VRID0gJz09JzsKY29uc3QgU1RSX09QX0VRX0FMVCA9ICc9JzsKY29uc3QgU1RSX09QX0xUID0gJzwnOwpjb25zdCBTVFJfT1BfTEUgPSAnPD0nOwpjb25zdCBTVFJfT1BfR1QgPSAnPic7CmNvbnN0IFNUUl9PUF9HRSA9ICc+PSc7CmNvbnN0IFNUUl9PUF9ORSA9ICchPSc7CmNvbnN0IFNUUl9PUF9ORV9BTFQgPSAnPD4nOwoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgJHRyYW5zT3BTdHIgPSBhcnJheSgKJz0nID0+IHNlbGY6Ok9QX0VRLAonPT0nID0+IHNlbGY6Ok9QX0VRLAonPCcgPT4gc2VsZjo6T1BfTFQsCic8PScgPT4gc2VsZjo6T1BfTEUsCic+JyA9PiBzZWxmOjpPUF9HVCwKJz49JyA9PiBzZWxmOjpPUF9HRSwKJzw+JyA9PiBzZWxmOjpPUF9ORSwKJyE9JyA9PiBzZWxmOjpPUF9ORSwKKTsKCgoKCgoKCnByaXZhdGUgc3RhdGljICR0cmFuc09wSW50ID0gYXJyYXkoCnNlbGY6Ok9QX0VRID0+ICc9PScsCnNlbGY6Ok9QX0xUID0+ICc8JywKc2VsZjo6T1BfTEUgPT4gJzw9JywKc2VsZjo6T1BfR1QgPT4gJz4nLApzZWxmOjpPUF9HRSA9PiAnPj0nLApzZWxmOjpPUF9ORSA9PiAnIT0nLAopOwoKCgoKCnByb3RlY3RlZCAkb3BlcmF0b3I7CgoKcHJvdGVjdGVkICR2ZXJzaW9uOwoKCnByb3RlY3RlZCAkcHJldHR5U3RyaW5nOwoKCnByb3RlY3RlZCAkbG93ZXJCb3VuZDsKCgpwcm90ZWN0ZWQgJHVwcGVyQm91bmQ7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRvcGVyYXRvciwgJHZlcnNpb24pCnsKaWYgKCFpc3NldChzZWxmOjokdHJhbnNPcFN0clskb3BlcmF0b3JdKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAonSW52YWxpZCBvcGVyYXRvciAiJXMiIGdpdmVuLCBleHBlY3RlZCBvbmUgb2Y6ICVzJywKJG9wZXJhdG9yLAppbXBsb2RlKCcsICcsIHNlbGY6OmdldFN1cHBvcnRlZE9wZXJhdG9ycygpKQopKTsKfQoKJHRoaXMtPm9wZXJhdG9yID0gc2VsZjo6JHRyYW5zT3BTdHJbJG9wZXJhdG9yXTsKJHRoaXMtPnZlcnNpb24gPSAkdmVyc2lvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZlcnNpb24oKQp7CnJldHVybiAkdGhpcy0+dmVyc2lvbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3BlcmF0b3IoKQp7CnJldHVybiBzZWxmOjokdHJhbnNPcEludFskdGhpcy0+b3BlcmF0b3JdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtYXRjaGVzKENvbnN0cmFpbnRJbnRlcmZhY2UgJHByb3ZpZGVyKQp7CmlmICgkcHJvdmlkZXIgaW5zdGFuY2VvZiBzZWxmKSB7CnJldHVybiAkdGhpcy0+bWF0Y2hTcGVjaWZpYygkcHJvdmlkZXIpOwp9CgoKcmV0dXJuICRwcm92aWRlci0+bWF0Y2hlcygkdGhpcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmV0dHlTdHJpbmcoJHByZXR0eVN0cmluZykKewokdGhpcy0+cHJldHR5U3RyaW5nID0gJHByZXR0eVN0cmluZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZygpCnsKaWYgKCR0aGlzLT5wcmV0dHlTdHJpbmcpIHsKcmV0dXJuICR0aGlzLT5wcmV0dHlTdHJpbmc7Cn0KCnJldHVybiAkdGhpcy0+X190b1N0cmluZygpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdXBwb3J0ZWRPcGVyYXRvcnMoKQp7CnJldHVybiBhcnJheV9rZXlzKHNlbGY6OiR0cmFuc09wU3RyKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0T3BlcmF0b3JDb25zdGFudCgkb3BlcmF0b3IpCnsKcmV0dXJuIHNlbGY6OiR0cmFuc09wU3RyWyRvcGVyYXRvcl07Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2ZXJzaW9uQ29tcGFyZSgkYSwgJGIsICRvcGVyYXRvciwgJGNvbXBhcmVCcmFuY2hlcyA9IGZhbHNlKQp7CmlmICghaXNzZXQoc2VsZjo6JHRyYW5zT3BTdHJbJG9wZXJhdG9yXSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKJ0ludmFsaWQgb3BlcmF0b3IgIiVzIiBnaXZlbiwgZXhwZWN0ZWQgb25lIG9mOiAlcycsCiRvcGVyYXRvciwKaW1wbG9kZSgnLCAnLCBzZWxmOjpnZXRTdXBwb3J0ZWRPcGVyYXRvcnMoKSkKKSk7Cn0KCiRhSXNCcmFuY2ggPSBzdHJwb3MoJGEsICdkZXYtJykgPT09IDA7CiRiSXNCcmFuY2ggPSBzdHJwb3MoJGIsICdkZXYtJykgPT09IDA7CgppZiAoJG9wZXJhdG9yID09PSAnIT0nICYmICgkYUlzQnJhbmNoIHx8ICRiSXNCcmFuY2gpKSB7CnJldHVybiAkYSAhPT0gJGI7Cn0KCmlmICgkYUlzQnJhbmNoICYmICRiSXNCcmFuY2gpIHsKcmV0dXJuICRvcGVyYXRvciA9PT0gJz09JyAmJiAkYSA9PT0gJGI7Cn0KCgppZiAoISRjb21wYXJlQnJhbmNoZXMgJiYgKCRhSXNCcmFuY2ggfHwgJGJJc0JyYW5jaCkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gXHZlcnNpb25fY29tcGFyZSgkYSwgJGIsICRvcGVyYXRvcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRvdGhlck9wZXJhdG9yKQp7CmlmIChzdHJwb3MoJHRoaXMtPnZlcnNpb24sICdkZXYtJykgPT09IDApIHsKaWYgKHNlbGY6Ok9QX0VRID09PSAkdGhpcy0+b3BlcmF0b3IpIHsKaWYgKHNlbGY6Ok9QX0VRID09PSAkb3RoZXJPcGVyYXRvcikgewpyZXR1cm4gc3ByaW50ZignJGIgJiYgJHYgPT09ICVzJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpKTsKfQppZiAoc2VsZjo6T1BfTkUgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiBzcHJpbnRmKCchJGIgfHwgJHYgIT09ICVzJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpKTsKfQpyZXR1cm4gJ2ZhbHNlJzsKfQoKaWYgKHNlbGY6Ok9QX05FID09PSAkdGhpcy0+b3BlcmF0b3IpIHsKaWYgKHNlbGY6Ok9QX0VRID09PSAkb3RoZXJPcGVyYXRvcikgewpyZXR1cm4gc3ByaW50ZignISRiIHx8ICR2ICE9PSAlcycsIFx2YXJfZXhwb3J0KCR0aGlzLT52ZXJzaW9uLCB0cnVlKSk7Cn0KaWYgKHNlbGY6Ok9QX05FID09PSAkb3RoZXJPcGVyYXRvcikgewpyZXR1cm4gJ3RydWUnOwp9CnJldHVybiAnISRiJzsKfQoKcmV0dXJuICdmYWxzZSc7Cn0KCmlmIChzZWxmOjpPUF9FUSA9PT0gJHRoaXMtPm9wZXJhdG9yKSB7CmlmIChzZWxmOjpPUF9FUSA9PT0gJG90aGVyT3BlcmF0b3IpIHsKcmV0dXJuIHNwcmludGYoJ1x2ZXJzaW9uX2NvbXBhcmUoJHYsICVzLCBcJz09XCcpJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpKTsKfQppZiAoc2VsZjo6T1BfTkUgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiBzcHJpbnRmKCckYiB8fCBcdmVyc2lvbl9jb21wYXJlKCR2LCAlcywgXCchPVwnKScsIFx2YXJfZXhwb3J0KCR0aGlzLT52ZXJzaW9uLCB0cnVlKSk7Cn0KCnJldHVybiBzcHJpbnRmKCchJGIgJiYgXHZlcnNpb25fY29tcGFyZSglcywgJHYsIFwnJXNcJyknLCBcdmFyX2V4cG9ydCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSksIHNlbGY6OiR0cmFuc09wSW50WyRvdGhlck9wZXJhdG9yXSk7Cn0KCmlmIChzZWxmOjpPUF9ORSA9PT0gJHRoaXMtPm9wZXJhdG9yKSB7CmlmIChzZWxmOjpPUF9FUSA9PT0gJG90aGVyT3BlcmF0b3IpIHsKcmV0dXJuIHNwcmludGYoJyRiIHx8ICghJGIgJiYgXHZlcnNpb25fY29tcGFyZSgkdiwgJXMsIFwnIT1cJykpJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpKTsKfQoKaWYgKHNlbGY6Ok9QX05FID09PSAkb3RoZXJPcGVyYXRvcikgewpyZXR1cm4gJ3RydWUnOwp9CnJldHVybiAnISRiJzsKfQoKaWYgKHNlbGY6Ok9QX0xUID09PSAkdGhpcy0+b3BlcmF0b3IgfHwgc2VsZjo6T1BfTEUgPT09ICR0aGlzLT5vcGVyYXRvcikgewppZiAoc2VsZjo6T1BfTFQgPT09ICRvdGhlck9wZXJhdG9yIHx8IHNlbGY6Ok9QX0xFID09PSAkb3RoZXJPcGVyYXRvcikgewpyZXR1cm4gJyEkYic7Cn0KfSBlbHNlIHsgCmlmIChzZWxmOjpPUF9HVCA9PT0gJG90aGVyT3BlcmF0b3IgfHwgc2VsZjo6T1BfR0UgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiAnISRiJzsKfQp9CgppZiAoc2VsZjo6T1BfTkUgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiAndHJ1ZSc7Cn0KCiRjb2RlQ29tcGFyaXNvbiA9IHNwcmludGYoJ1x2ZXJzaW9uX2NvbXBhcmUoJHYsICVzLCBcJyVzXCcpJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpLCBzZWxmOjokdHJhbnNPcEludFskdGhpcy0+b3BlcmF0b3JdKTsKaWYgKCR0aGlzLT5vcGVyYXRvciA9PT0gc2VsZjo6T1BfTEUpIHsKaWYgKCRvdGhlck9wZXJhdG9yID09PSBzZWxmOjpPUF9HVCkgewpyZXR1cm4gc3ByaW50ZignISRiICYmIFx2ZXJzaW9uX2NvbXBhcmUoJHYsICVzLCBcJyE9XCcpICYmICcsIFx2YXJfZXhwb3J0KCR0aGlzLT52ZXJzaW9uLCB0cnVlKSkgLiAkY29kZUNvbXBhcmlzb247Cn0KfSBlbHNlaWYgKCR0aGlzLT5vcGVyYXRvciA9PT0gc2VsZjo6T1BfR0UpIHsKaWYgKCRvdGhlck9wZXJhdG9yID09PSBzZWxmOjpPUF9MVCkgewpyZXR1cm4gc3ByaW50ZignISRiICYmIFx2ZXJzaW9uX2NvbXBhcmUoJHYsICVzLCBcJyE9XCcpICYmICcsIFx2YXJfZXhwb3J0KCR0aGlzLT52ZXJzaW9uLCB0cnVlKSkgLiAkY29kZUNvbXBhcmlzb247Cn0KfQoKcmV0dXJuIHNwcmludGYoJyEkYiAmJiAlcycsICRjb2RlQ29tcGFyaXNvbik7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtYXRjaFNwZWNpZmljKENvbnN0cmFpbnQgJHByb3ZpZGVyLCAkY29tcGFyZUJyYW5jaGVzID0gZmFsc2UpCnsKJG5vRXF1YWxPcCA9IHN0cl9yZXBsYWNlKCc9JywgJycsIHNlbGY6OiR0cmFuc09wSW50WyR0aGlzLT5vcGVyYXRvcl0pOwokcHJvdmlkZXJOb0VxdWFsT3AgPSBzdHJfcmVwbGFjZSgnPScsICcnLCBzZWxmOjokdHJhbnNPcEludFskcHJvdmlkZXItPm9wZXJhdG9yXSk7CgokaXNFcXVhbE9wID0gc2VsZjo6T1BfRVEgPT09ICR0aGlzLT5vcGVyYXRvcjsKJGlzTm9uRXF1YWxPcCA9IHNlbGY6Ok9QX05FID09PSAkdGhpcy0+b3BlcmF0b3I7CiRpc1Byb3ZpZGVyRXF1YWxPcCA9IHNlbGY6Ok9QX0VRID09PSAkcHJvdmlkZXItPm9wZXJhdG9yOwokaXNQcm92aWRlck5vbkVxdWFsT3AgPSBzZWxmOjpPUF9ORSA9PT0gJHByb3ZpZGVyLT5vcGVyYXRvcjsKCgoKaWYgKCRpc05vbkVxdWFsT3AgfHwgJGlzUHJvdmlkZXJOb25FcXVhbE9wKSB7CmlmICgkaXNOb25FcXVhbE9wICYmICEkaXNQcm92aWRlck5vbkVxdWFsT3AgJiYgISRpc1Byb3ZpZGVyRXF1YWxPcCAmJiBzdHJwb3MoJHByb3ZpZGVyLT52ZXJzaW9uLCAnZGV2LScpID09PSAwKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCRpc1Byb3ZpZGVyTm9uRXF1YWxPcCAmJiAhJGlzTm9uRXF1YWxPcCAmJiAhJGlzRXF1YWxPcCAmJiBzdHJwb3MoJHRoaXMtPnZlcnNpb24sICdkZXYtJykgPT09IDApIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoISRpc0VxdWFsT3AgJiYgISRpc1Byb3ZpZGVyRXF1YWxPcCkgewpyZXR1cm4gdHJ1ZTsKfQpyZXR1cm4gJHRoaXMtPnZlcnNpb25Db21wYXJlKCRwcm92aWRlci0+dmVyc2lvbiwgJHRoaXMtPnZlcnNpb24sICchPScsICRjb21wYXJlQnJhbmNoZXMpOwp9CgoKCmlmICgkdGhpcy0+b3BlcmF0b3IgIT09IHNlbGY6Ok9QX0VRICYmICRub0VxdWFsT3AgPT09ICRwcm92aWRlck5vRXF1YWxPcCkgewpyZXR1cm4gIShzdHJwb3MoJHRoaXMtPnZlcnNpb24sICdkZXYtJykgPT09IDAgfHwgc3RycG9zKCRwcm92aWRlci0+dmVyc2lvbiwgJ2Rldi0nKSA9PT0gMCk7Cn0KCiR2ZXJzaW9uMSA9ICRpc0VxdWFsT3AgPyAkdGhpcy0+dmVyc2lvbiA6ICRwcm92aWRlci0+dmVyc2lvbjsKJHZlcnNpb24yID0gJGlzRXF1YWxPcCA/ICRwcm92aWRlci0+dmVyc2lvbiA6ICR0aGlzLT52ZXJzaW9uOwokb3BlcmF0b3IgPSAkaXNFcXVhbE9wID8gJHByb3ZpZGVyLT5vcGVyYXRvciA6ICR0aGlzLT5vcGVyYXRvcjsKCmlmICgkdGhpcy0+dmVyc2lvbkNvbXBhcmUoJHZlcnNpb24xLCAkdmVyc2lvbjIsIHNlbGY6OiR0cmFuc09wSW50WyRvcGVyYXRvcl0sICRjb21wYXJlQnJhbmNoZXMpKSB7CgoKCnJldHVybiAhKHNlbGY6OiR0cmFuc09wSW50WyRwcm92aWRlci0+b3BlcmF0b3JdID09PSAkcHJvdmlkZXJOb0VxdWFsT3AKJiYgc2VsZjo6JHRyYW5zT3BJbnRbJHRoaXMtPm9wZXJhdG9yXSAhPT0gJG5vRXF1YWxPcAomJiBcdmVyc2lvbl9jb21wYXJlKCRwcm92aWRlci0+dmVyc2lvbiwgJHRoaXMtPnZlcnNpb24sICc9PScpKTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKcmV0dXJuIHNlbGY6OiR0cmFuc09wSW50WyR0aGlzLT5vcGVyYXRvcl0gLiAnICcgLiAkdGhpcy0+dmVyc2lvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvd2VyQm91bmQoKQp7CiR0aGlzLT5leHRyYWN0Qm91bmRzKCk7CgpyZXR1cm4gJHRoaXMtPmxvd2VyQm91bmQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcHBlckJvdW5kKCkKewokdGhpcy0+ZXh0cmFjdEJvdW5kcygpOwoKcmV0dXJuICR0aGlzLT51cHBlckJvdW5kOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4dHJhY3RCb3VuZHMoKQp7CmlmIChudWxsICE9PSAkdGhpcy0+bG93ZXJCb3VuZCkgewpyZXR1cm47Cn0KCgppZiAoc3RycG9zKCR0aGlzLT52ZXJzaW9uLCAnZGV2LScpID09PSAwKSB7CiR0aGlzLT5sb3dlckJvdW5kID0gQm91bmQ6Onplcm8oKTsKJHRoaXMtPnVwcGVyQm91bmQgPSBCb3VuZDo6cG9zaXRpdmVJbmZpbml0eSgpOwoKcmV0dXJuOwp9Cgpzd2l0Y2ggKCR0aGlzLT5vcGVyYXRvcikgewpjYXNlIHNlbGY6Ok9QX0VROgokdGhpcy0+bG93ZXJCb3VuZCA9IG5ldyBCb3VuZCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSk7CiR0aGlzLT51cHBlckJvdW5kID0gbmV3IEJvdW5kKCR0aGlzLT52ZXJzaW9uLCB0cnVlKTsKYnJlYWs7CmNhc2Ugc2VsZjo6T1BfTFQ6CiR0aGlzLT5sb3dlckJvdW5kID0gQm91bmQ6Onplcm8oKTsKJHRoaXMtPnVwcGVyQm91bmQgPSBuZXcgQm91bmQoJHRoaXMtPnZlcnNpb24sIGZhbHNlKTsKYnJlYWs7CmNhc2Ugc2VsZjo6T1BfTEU6CiR0aGlzLT5sb3dlckJvdW5kID0gQm91bmQ6Onplcm8oKTsKJHRoaXMtPnVwcGVyQm91bmQgPSBuZXcgQm91bmQoJHRoaXMtPnZlcnNpb24sIHRydWUpOwpicmVhazsKY2FzZSBzZWxmOjpPUF9HVDoKJHRoaXMtPmxvd2VyQm91bmQgPSBuZXcgQm91bmQoJHRoaXMtPnZlcnNpb24sIGZhbHNlKTsKJHRoaXMtPnVwcGVyQm91bmQgPSBCb3VuZDo6cG9zaXRpdmVJbmZpbml0eSgpOwpicmVhazsKY2FzZSBzZWxmOjpPUF9HRToKJHRoaXMtPmxvd2VyQm91bmQgPSBuZXcgQm91bmQoJHRoaXMtPnZlcnNpb24sIHRydWUpOwokdGhpcy0+dXBwZXJCb3VuZCA9IEJvdW5kOjpwb3NpdGl2ZUluZmluaXR5KCk7CmJyZWFrOwpjYXNlIHNlbGY6Ok9QX05FOgokdGhpcy0+bG93ZXJCb3VuZCA9IEJvdW5kOjp6ZXJvKCk7CiR0aGlzLT51cHBlckJvdW5kID0gQm91bmQ6OnBvc2l0aXZlSW5maW5pdHkoKTsKYnJlYWs7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnQ7CgoKCgoKCgppbnRlcmZhY2UgQ29uc3RyYWludEludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbWF0Y2hlcyhDb25zdHJhaW50SW50ZXJmYWNlICRwcm92aWRlcik7CgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoJG90aGVyT3BlcmF0b3IpOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVwcGVyQm91bmQoKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb3dlckJvdW5kKCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmV0dHlTdHJpbmcoJHByZXR0eVN0cmluZyk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnQ7CgoKCgoKCmNsYXNzIE1hdGNoQWxsQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewoKcHJvdGVjdGVkICRwcmV0dHlTdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtYXRjaGVzKENvbnN0cmFpbnRJbnRlcmZhY2UgJHByb3ZpZGVyKQp7CnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkb3RoZXJPcGVyYXRvcikKewpyZXR1cm4gJ3RydWUnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJldHR5U3RyaW5nKCRwcmV0dHlTdHJpbmcpCnsKJHRoaXMtPnByZXR0eVN0cmluZyA9ICRwcmV0dHlTdHJpbmc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoKQp7CmlmICgkdGhpcy0+cHJldHR5U3RyaW5nKSB7CnJldHVybiAkdGhpcy0+cHJldHR5U3RyaW5nOwp9CgpyZXR1cm4gKHN0cmluZykgJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewpyZXR1cm4gJyonOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXBwZXJCb3VuZCgpCnsKcmV0dXJuIEJvdW5kOjpwb3NpdGl2ZUluZmluaXR5KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb3dlckJvdW5kKCkKewpyZXR1cm4gQm91bmQ6Onplcm8oKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnQ7CgoKCgpjbGFzcyBNYXRjaE5vbmVDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJHByZXR0eVN0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hdGNoZXMoQ29uc3RyYWludEludGVyZmFjZSAkcHJvdmlkZXIpCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkb3RoZXJPcGVyYXRvcikKewpyZXR1cm4gJ2ZhbHNlJzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZXR0eVN0cmluZygkcHJldHR5U3RyaW5nKQp7CiR0aGlzLT5wcmV0dHlTdHJpbmcgPSAkcHJldHR5U3RyaW5nOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKCkKewppZiAoJHRoaXMtPnByZXR0eVN0cmluZykgewpyZXR1cm4gJHRoaXMtPnByZXR0eVN0cmluZzsKfQoKcmV0dXJuIChzdHJpbmcpICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKcmV0dXJuICdbXSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcHBlckJvdW5kKCkKewpyZXR1cm4gbmV3IEJvdW5kKCcwLjAuMC4wLWRldicsIGZhbHNlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvd2VyQm91bmQoKQp7CnJldHVybiBuZXcgQm91bmQoJzAuMC4wLjAtZGV2JywgZmFsc2UpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludDsKCgoKCmNsYXNzIE11bHRpQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewoKCgoKcHJvdGVjdGVkICRjb25zdHJhaW50czsKCgpwcm90ZWN0ZWQgJHByZXR0eVN0cmluZzsKCgpwcm90ZWN0ZWQgJHN0cmluZzsKCgpwcm90ZWN0ZWQgJGNvbmp1bmN0aXZlOwoKCnByb3RlY3RlZCAkbG93ZXJCb3VuZDsKCgpwcm90ZWN0ZWQgJHVwcGVyQm91bmQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGNvbnN0cmFpbnRzLCAkY29uanVuY3RpdmUgPSB0cnVlKQp7CmlmIChcY291bnQoJGNvbnN0cmFpbnRzKSA8IDIpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oCidNdXN0IHByb3ZpZGUgYXQgbGVhc3QgdHdvIGNvbnN0cmFpbnRzIGZvciBhIE11bHRpQ29uc3RyYWludC4gVXNlICcuCid0aGUgcmVndWxhciBDb25zdHJhaW50IGNsYXNzIGZvciBvbmUgY29uc3RyYWludCBvbmx5IG9yIE1hdGNoQWxsQ29uc3RyYWludCBmb3Igbm9uZS4gWW91IG1heSB1c2UgJy4KJ011bHRpQ29uc3RyYWludDo6Y3JlYXRlKCkgd2hpY2ggb3B0aW1pemVzIGFuZCBoYW5kbGVzIHRob3NlIGNhc2VzIGF1dG9tYXRpY2FsbHkuJwopOwp9CgokdGhpcy0+Y29uc3RyYWludHMgPSAkY29uc3RyYWludHM7CiR0aGlzLT5jb25qdW5jdGl2ZSA9ICRjb25qdW5jdGl2ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbnN0cmFpbnRzKCkKewpyZXR1cm4gJHRoaXMtPmNvbnN0cmFpbnRzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNDb25qdW5jdGl2ZSgpCnsKcmV0dXJuICR0aGlzLT5jb25qdW5jdGl2ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGlzanVuY3RpdmUoKQp7CnJldHVybiAhJHRoaXMtPmNvbmp1bmN0aXZlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkb3RoZXJPcGVyYXRvcikKewokcGFydHMgPSBhcnJheSgpOwpmb3JlYWNoICgkdGhpcy0+Y29uc3RyYWludHMgYXMgJGNvbnN0cmFpbnQpIHsKJGNvZGUgPSAkY29uc3RyYWludC0+Y29tcGlsZSgkb3RoZXJPcGVyYXRvcik7CmlmICgkY29kZSA9PT0gJ3RydWUnKSB7CmlmICghJHRoaXMtPmNvbmp1bmN0aXZlKSB7CnJldHVybiAndHJ1ZSc7Cn0KfSBlbHNlaWYgKCRjb2RlID09PSAnZmFsc2UnKSB7CmlmICgkdGhpcy0+Y29uanVuY3RpdmUpIHsKcmV0dXJuICdmYWxzZSc7Cn0KfSBlbHNlIHsKJHBhcnRzW10gPSAnKCcuJGNvZGUuJyknOwp9Cn0KCmlmICghJHBhcnRzKSB7CnJldHVybiAkdGhpcy0+Y29uanVuY3RpdmUgPyAndHJ1ZScgOiAnZmFsc2UnOwp9CgpyZXR1cm4gJHRoaXMtPmNvbmp1bmN0aXZlID8gaW1wbG9kZSgnJiYnLCAkcGFydHMpIDogaW1wbG9kZSgnfHwnLCAkcGFydHMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtYXRjaGVzKENvbnN0cmFpbnRJbnRlcmZhY2UgJHByb3ZpZGVyKQp7CmlmIChmYWxzZSA9PT0gJHRoaXMtPmNvbmp1bmN0aXZlKSB7CmZvcmVhY2ggKCR0aGlzLT5jb25zdHJhaW50cyBhcyAkY29uc3RyYWludCkgewppZiAoJHByb3ZpZGVyLT5tYXRjaGVzKCRjb25zdHJhaW50KSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCmlmICgkcHJvdmlkZXIgaW5zdGFuY2VvZiBNdWx0aUNvbnN0cmFpbnQgJiYgJHByb3ZpZGVyLT5pc0Rpc2p1bmN0aXZlKCkpIHsKcmV0dXJuICRwcm92aWRlci0+bWF0Y2hlcygkdGhpcyk7Cn0KCmZvcmVhY2ggKCR0aGlzLT5jb25zdHJhaW50cyBhcyAkY29uc3RyYWludCkgewppZiAoISRwcm92aWRlci0+bWF0Y2hlcygkY29uc3RyYWludCkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJldHR5U3RyaW5nKCRwcmV0dHlTdHJpbmcpCnsKJHRoaXMtPnByZXR0eVN0cmluZyA9ICRwcmV0dHlTdHJpbmc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoKQp7CmlmICgkdGhpcy0+cHJldHR5U3RyaW5nKSB7CnJldHVybiAkdGhpcy0+cHJldHR5U3RyaW5nOwp9CgpyZXR1cm4gKHN0cmluZykgJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewppZiAoJHRoaXMtPnN0cmluZyAhPT0gbnVsbCkgewpyZXR1cm4gJHRoaXMtPnN0cmluZzsKfQoKJGNvbnN0cmFpbnRzID0gYXJyYXkoKTsKZm9yZWFjaCAoJHRoaXMtPmNvbnN0cmFpbnRzIGFzICRjb25zdHJhaW50KSB7CiRjb25zdHJhaW50c1tdID0gKHN0cmluZykgJGNvbnN0cmFpbnQ7Cn0KCnJldHVybiAkdGhpcy0+c3RyaW5nID0gJ1snIC4gaW1wbG9kZSgkdGhpcy0+Y29uanVuY3RpdmUgPyAnICcgOiAnIHx8ICcsICRjb25zdHJhaW50cykgLiAnXSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb3dlckJvdW5kKCkKewokdGhpcy0+ZXh0cmFjdEJvdW5kcygpOwoKaWYgKG51bGwgPT09ICR0aGlzLT5sb3dlckJvdW5kKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2V4dHJhY3RCb3VuZHMgc2hvdWxkIGhhdmUgcG9wdWxhdGVkIHRoZSBsb3dlckJvdW5kIHByb3BlcnR5Jyk7Cn0KCnJldHVybiAkdGhpcy0+bG93ZXJCb3VuZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVwcGVyQm91bmQoKQp7CiR0aGlzLT5leHRyYWN0Qm91bmRzKCk7CgppZiAobnVsbCA9PT0gJHRoaXMtPnVwcGVyQm91bmQpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignZXh0cmFjdEJvdW5kcyBzaG91bGQgaGF2ZSBwb3B1bGF0ZWQgdGhlIHVwcGVyQm91bmQgcHJvcGVydHknKTsKfQoKcmV0dXJuICR0aGlzLT51cHBlckJvdW5kOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKGFycmF5ICRjb25zdHJhaW50cywgJGNvbmp1bmN0aXZlID0gdHJ1ZSkKewppZiAoMCA9PT0gXGNvdW50KCRjb25zdHJhaW50cykpIHsKcmV0dXJuIG5ldyBNYXRjaEFsbENvbnN0cmFpbnQoKTsKfQoKaWYgKDEgPT09IFxjb3VudCgkY29uc3RyYWludHMpKSB7CnJldHVybiAkY29uc3RyYWludHNbMF07Cn0KCiRvcHRpbWl6ZWQgPSBzZWxmOjpvcHRpbWl6ZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50cywgJGNvbmp1bmN0aXZlKTsKaWYgKCRvcHRpbWl6ZWQgIT09IG51bGwpIHsKbGlzdCgkY29uc3RyYWludHMsICRjb25qdW5jdGl2ZSkgPSAkb3B0aW1pemVkOwppZiAoXGNvdW50KCRjb25zdHJhaW50cykgPT09IDEpIHsKcmV0dXJuICRjb25zdHJhaW50c1swXTsKfQp9CgpyZXR1cm4gbmV3IHNlbGYoJGNvbnN0cmFpbnRzLCAkY29uanVuY3RpdmUpOwp9CgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gb3B0aW1pemVDb25zdHJhaW50cyhhcnJheSAkY29uc3RyYWludHMsICRjb25qdW5jdGl2ZSkKewoKCgppZiAoISRjb25qdW5jdGl2ZSkgewokbGVmdCA9ICRjb25zdHJhaW50c1swXTsKJG1lcmdlZENvbnN0cmFpbnRzID0gYXJyYXkoKTsKJG9wdGltaXplZCA9IGZhbHNlOwpmb3IgKCRpID0gMSwgJGwgPSBcY291bnQoJGNvbnN0cmFpbnRzKTsgJGkgPCAkbDsgJGkrKykgewokcmlnaHQgPSAkY29uc3RyYWludHNbJGldOwppZiAoCiRsZWZ0IGluc3RhbmNlb2Ygc2VsZgomJiAkbGVmdC0+Y29uanVuY3RpdmUKJiYgJHJpZ2h0IGluc3RhbmNlb2Ygc2VsZgomJiAkcmlnaHQtPmNvbmp1bmN0aXZlCiYmIFxjb3VudCgkbGVmdC0+Y29uc3RyYWludHMpID09PSAyCiYmIFxjb3VudCgkcmlnaHQtPmNvbnN0cmFpbnRzKSA9PT0gMgomJiAoJGxlZnQwID0gKHN0cmluZykgJGxlZnQtPmNvbnN0cmFpbnRzWzBdKQomJiAkbGVmdDBbMF0gPT09ICc+JyAmJiAkbGVmdDBbMV0gPT09ICc9JwomJiAoJGxlZnQxID0gKHN0cmluZykgJGxlZnQtPmNvbnN0cmFpbnRzWzFdKQomJiAkbGVmdDFbMF0gPT09ICc8JwomJiAoJHJpZ2h0MCA9IChzdHJpbmcpICRyaWdodC0+Y29uc3RyYWludHNbMF0pCiYmICRyaWdodDBbMF0gPT09ICc+JyAmJiAkcmlnaHQwWzFdID09PSAnPScKJiYgKCRyaWdodDEgPSAoc3RyaW5nKSAkcmlnaHQtPmNvbnN0cmFpbnRzWzFdKQomJiAkcmlnaHQxWzBdID09PSAnPCcKJiYgc3Vic3RyKCRsZWZ0MSwgMikgPT09IHN1YnN0cigkcmlnaHQwLCAzKQopIHsKJG9wdGltaXplZCA9IHRydWU7CiRsZWZ0ID0gbmV3IE11bHRpQ29uc3RyYWludCgKYXJyYXkoCiRsZWZ0LT5jb25zdHJhaW50c1swXSwKJHJpZ2h0LT5jb25zdHJhaW50c1sxXSwKKSwKdHJ1ZSk7Cn0gZWxzZSB7CiRtZXJnZWRDb25zdHJhaW50c1tdID0gJGxlZnQ7CiRsZWZ0ID0gJHJpZ2h0Owp9Cn0KaWYgKCRvcHRpbWl6ZWQpIHsKJG1lcmdlZENvbnN0cmFpbnRzW10gPSAkbGVmdDsKcmV0dXJuIGFycmF5KCRtZXJnZWRDb25zdHJhaW50cywgZmFsc2UpOwp9Cn0KCgoKcmV0dXJuIG51bGw7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdEJvdW5kcygpCnsKaWYgKG51bGwgIT09ICR0aGlzLT5sb3dlckJvdW5kKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJHRoaXMtPmNvbnN0cmFpbnRzIGFzICRjb25zdHJhaW50KSB7CmlmIChudWxsID09PSAkdGhpcy0+bG93ZXJCb3VuZCB8fCBudWxsID09PSAkdGhpcy0+dXBwZXJCb3VuZCkgewokdGhpcy0+bG93ZXJCb3VuZCA9ICRjb25zdHJhaW50LT5nZXRMb3dlckJvdW5kKCk7CiR0aGlzLT51cHBlckJvdW5kID0gJGNvbnN0cmFpbnQtPmdldFVwcGVyQm91bmQoKTsKY29udGludWU7Cn0KCmlmICgkY29uc3RyYWludC0+Z2V0TG93ZXJCb3VuZCgpLT5jb21wYXJlVG8oJHRoaXMtPmxvd2VyQm91bmQsICR0aGlzLT5pc0Nvbmp1bmN0aXZlKCkgPyAnPicgOiAnPCcpKSB7CiR0aGlzLT5sb3dlckJvdW5kID0gJGNvbnN0cmFpbnQtPmdldExvd2VyQm91bmQoKTsKfQoKaWYgKCRjb25zdHJhaW50LT5nZXRVcHBlckJvdW5kKCktPmNvbXBhcmVUbygkdGhpcy0+dXBwZXJCb3VuZCwgJHRoaXMtPmlzQ29uanVuY3RpdmUoKSA/ICc8JyA6ICc+JykpIHsKJHRoaXMtPnVwcGVyQm91bmQgPSAkY29uc3RyYWludC0+Z2V0VXBwZXJCb3VuZCgpOwp9Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2VtdmVyOwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CgpjbGFzcyBJbnRlcnZhbAp7Cgpwcml2YXRlICRzdGFydDsKCnByaXZhdGUgJGVuZDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb25zdHJhaW50ICRzdGFydCwgQ29uc3RyYWludCAkZW5kKQp7CiR0aGlzLT5zdGFydCA9ICRzdGFydDsKJHRoaXMtPmVuZCA9ICRlbmQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFydCgpCnsKcmV0dXJuICR0aGlzLT5zdGFydDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVuZCgpCnsKcmV0dXJuICR0aGlzLT5lbmQ7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVplcm8oKQp7CnN0YXRpYyAkemVybzsKCmlmIChudWxsID09PSAkemVybykgewokemVybyA9IG5ldyBDb25zdHJhaW50KCc+PScsICcwLjAuMC4wLWRldicpOwp9CgpyZXR1cm4gJHplcm87Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdW50aWxQb3NpdGl2ZUluZmluaXR5KCkKewpzdGF0aWMgJHBvc2l0aXZlSW5maW5pdHk7CgppZiAobnVsbCA9PT0gJHBvc2l0aXZlSW5maW5pdHkpIHsKJHBvc2l0aXZlSW5maW5pdHkgPSBuZXcgQ29uc3RyYWludCgnPCcsIFBIUF9JTlRfTUFYLicuMC4wLjAnKTsKfQoKcmV0dXJuICRwb3NpdGl2ZUluZmluaXR5Owp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFueSgpCnsKcmV0dXJuIG5ldyBzZWxmKHNlbGY6OmZyb21aZXJvKCksIHNlbGY6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhbnlEZXYoKQp7CgpyZXR1cm4gYXJyYXkoJ25hbWVzJyA9PiBhcnJheSgpLCAnZXhjbHVkZScgPT4gdHJ1ZSk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbm9EZXYoKQp7CgpyZXR1cm4gYXJyYXkoJ25hbWVzJyA9PiBhcnJheSgpLCAnZXhjbHVkZScgPT4gZmFsc2UpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXI7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNYXRjaEFsbENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNYXRjaE5vbmVDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTXVsdGlDb25zdHJhaW50OwoKCgoKCgoKCgoKCgoKY2xhc3MgSW50ZXJ2YWxzCnsKCgoKcHJpdmF0ZSBzdGF0aWMgJGludGVydmFsc0NhY2hlID0gYXJyYXkoKTsKCgoKCnByaXZhdGUgc3RhdGljICRvcFNvcnRPcmRlciA9IGFycmF5KAonPj0nID0+IC0zLAonPCcgPT4gLTIsCic+JyA9PiAyLAonPD0nID0+IDMsCik7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xlYXIoKQp7CnNlbGY6OiRpbnRlcnZhbHNDYWNoZSA9IGFycmF5KCk7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1N1YnNldE9mKENvbnN0cmFpbnRJbnRlcmZhY2UgJGNhbmRpZGF0ZSwgQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCkKewppZiAoJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBNYXRjaEFsbENvbnN0cmFpbnQpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgkY2FuZGlkYXRlIGluc3RhbmNlb2YgTWF0Y2hOb25lQ29uc3RyYWludCB8fCAkY29uc3RyYWludCBpbnN0YW5jZW9mIE1hdGNoTm9uZUNvbnN0cmFpbnQpIHsKcmV0dXJuIGZhbHNlOwp9CgokaW50ZXJzZWN0aW9uSW50ZXJ2YWxzID0gc2VsZjo6Z2V0KG5ldyBNdWx0aUNvbnN0cmFpbnQoYXJyYXkoJGNhbmRpZGF0ZSwgJGNvbnN0cmFpbnQpLCB0cnVlKSk7CiRjYW5kaWRhdGVJbnRlcnZhbHMgPSBzZWxmOjpnZXQoJGNhbmRpZGF0ZSk7CmlmIChcY291bnQoJGludGVyc2VjdGlvbkludGVydmFsc1snbnVtZXJpYyddKSAhPT0gXGNvdW50KCRjYW5kaWRhdGVJbnRlcnZhbHNbJ251bWVyaWMnXSkpIHsKcmV0dXJuIGZhbHNlOwp9Cgpmb3JlYWNoICgkaW50ZXJzZWN0aW9uSW50ZXJ2YWxzWydudW1lcmljJ10gYXMgJGluZGV4ID0+ICRpbnRlcnZhbCkgewppZiAoIWlzc2V0KCRjYW5kaWRhdGVJbnRlcnZhbHNbJ251bWVyaWMnXVskaW5kZXhdKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgoc3RyaW5nKSAkY2FuZGlkYXRlSW50ZXJ2YWxzWydudW1lcmljJ11bJGluZGV4XS0+Z2V0U3RhcnQoKSAhPT0gKHN0cmluZykgJGludGVydmFsLT5nZXRTdGFydCgpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKChzdHJpbmcpICRjYW5kaWRhdGVJbnRlcnZhbHNbJ251bWVyaWMnXVskaW5kZXhdLT5nZXRFbmQoKSAhPT0gKHN0cmluZykgJGludGVydmFsLT5nZXRFbmQoKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKaWYgKCRpbnRlcnNlY3Rpb25JbnRlcnZhbHNbJ2JyYW5jaGVzJ11bJ2V4Y2x1ZGUnXSAhPT0gJGNhbmRpZGF0ZUludGVydmFsc1snYnJhbmNoZXMnXVsnZXhjbHVkZSddKSB7CnJldHVybiBmYWxzZTsKfQppZiAoXGNvdW50KCRpbnRlcnNlY3Rpb25JbnRlcnZhbHNbJ2JyYW5jaGVzJ11bJ25hbWVzJ10pICE9PSBcY291bnQoJGNhbmRpZGF0ZUludGVydmFsc1snYnJhbmNoZXMnXVsnbmFtZXMnXSkpIHsKcmV0dXJuIGZhbHNlOwp9CmZvcmVhY2ggKCRpbnRlcnNlY3Rpb25JbnRlcnZhbHNbJ2JyYW5jaGVzJ11bJ25hbWVzJ10gYXMgJGluZGV4ID0+ICRuYW1lKSB7CmlmICgkbmFtZSAhPT0gJGNhbmRpZGF0ZUludGVydmFsc1snYnJhbmNoZXMnXVsnbmFtZXMnXVskaW5kZXhdKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhdmVJbnRlcnNlY3Rpb25zKENvbnN0cmFpbnRJbnRlcmZhY2UgJGEsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGIpCnsKaWYgKCRhIGluc3RhbmNlb2YgTWF0Y2hBbGxDb25zdHJhaW50IHx8ICRiIGluc3RhbmNlb2YgTWF0Y2hBbGxDb25zdHJhaW50KSB7CnJldHVybiB0cnVlOwp9CgppZiAoJGEgaW5zdGFuY2VvZiBNYXRjaE5vbmVDb25zdHJhaW50IHx8ICRiIGluc3RhbmNlb2YgTWF0Y2hOb25lQ29uc3RyYWludCkgewpyZXR1cm4gZmFsc2U7Cn0KCiRpbnRlcnNlY3Rpb25JbnRlcnZhbHMgPSBzZWxmOjpnZW5lcmF0ZUludGVydmFscyhuZXcgTXVsdGlDb25zdHJhaW50KGFycmF5KCRhLCAkYiksIHRydWUpLCB0cnVlKTsKCnJldHVybiBcY291bnQoJGludGVyc2VjdGlvbkludGVydmFsc1snbnVtZXJpYyddKSA+IDAgfHwgJGludGVyc2VjdGlvbkludGVydmFsc1snYnJhbmNoZXMnXVsnZXhjbHVkZSddIHx8IFxjb3VudCgkaW50ZXJzZWN0aW9uSW50ZXJ2YWxzWydicmFuY2hlcyddWyduYW1lcyddKSA+IDA7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbXBhY3RDb25zdHJhaW50KENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpCnsKaWYgKCEkY29uc3RyYWludCBpbnN0YW5jZW9mIE11bHRpQ29uc3RyYWludCkgewpyZXR1cm4gJGNvbnN0cmFpbnQ7Cn0KCiRpbnRlcnZhbHMgPSBzZWxmOjpnZW5lcmF0ZUludGVydmFscygkY29uc3RyYWludCk7CiRjb25zdHJhaW50cyA9IGFycmF5KCk7CiRoYXNOdW1lcmljTWF0Y2hBbGwgPSBmYWxzZTsKCmlmIChcY291bnQoJGludGVydmFsc1snbnVtZXJpYyddKSA9PT0gMSAmJiAoc3RyaW5nKSAkaW50ZXJ2YWxzWydudW1lcmljJ11bMF0tPmdldFN0YXJ0KCkgPT09IChzdHJpbmcpIEludGVydmFsOjpmcm9tWmVybygpICYmIChzdHJpbmcpICRpbnRlcnZhbHNbJ251bWVyaWMnXVswXS0+Z2V0RW5kKCkgPT09IChzdHJpbmcpIEludGVydmFsOjp1bnRpbFBvc2l0aXZlSW5maW5pdHkoKSkgewokY29uc3RyYWludHNbXSA9ICRpbnRlcnZhbHNbJ251bWVyaWMnXVswXS0+Z2V0U3RhcnQoKTsKJGhhc051bWVyaWNNYXRjaEFsbCA9IHRydWU7Cn0gZWxzZSB7CiR1bkVxdWFsQ29uc3RyYWludHMgPSBhcnJheSgpOwpmb3IgKCRpID0gMCwgJGNvdW50ID0gXGNvdW50KCRpbnRlcnZhbHNbJ251bWVyaWMnXSk7ICRpIDwgJGNvdW50OyAkaSsrKSB7CiRpbnRlcnZhbCA9ICRpbnRlcnZhbHNbJ251bWVyaWMnXVskaV07CgoKCgoKaWYgKCRpbnRlcnZhbC0+Z2V0RW5kKCktPmdldE9wZXJhdG9yKCkgPT09ICc8JyAmJiAkaSsxIDwgJGNvdW50KSB7CiRuZXh0SW50ZXJ2YWwgPSAkaW50ZXJ2YWxzWydudW1lcmljJ11bJGkrMV07CmlmICgkaW50ZXJ2YWwtPmdldEVuZCgpLT5nZXRWZXJzaW9uKCkgPT09ICRuZXh0SW50ZXJ2YWwtPmdldFN0YXJ0KCktPmdldFZlcnNpb24oKSAmJiAkbmV4dEludGVydmFsLT5nZXRTdGFydCgpLT5nZXRPcGVyYXRvcigpID09PSAnPicpIHsKCgoKaWYgKFxjb3VudCgkdW5FcXVhbENvbnN0cmFpbnRzKSA9PT0gMCAmJiAoc3RyaW5nKSAkaW50ZXJ2YWwtPmdldFN0YXJ0KCkgIT09IChzdHJpbmcpIEludGVydmFsOjpmcm9tWmVybygpKSB7CiR1bkVxdWFsQ29uc3RyYWludHNbXSA9ICRpbnRlcnZhbC0+Z2V0U3RhcnQoKTsKfQokdW5FcXVhbENvbnN0cmFpbnRzW10gPSBuZXcgQ29uc3RyYWludCgnIT0nLCAkaW50ZXJ2YWwtPmdldEVuZCgpLT5nZXRWZXJzaW9uKCkpOwpjb250aW51ZTsKfQp9CgppZiAoXGNvdW50KCR1bkVxdWFsQ29uc3RyYWludHMpID4gMCkgewoKaWYgKChzdHJpbmcpICRpbnRlcnZhbC0+Z2V0RW5kKCkgIT09IChzdHJpbmcpIEludGVydmFsOjp1bnRpbFBvc2l0aXZlSW5maW5pdHkoKSkgewokdW5FcXVhbENvbnN0cmFpbnRzW10gPSAkaW50ZXJ2YWwtPmdldEVuZCgpOwp9CgoKaWYgKFxjb3VudCgkdW5FcXVhbENvbnN0cmFpbnRzKSA+IDEpIHsKJGNvbnN0cmFpbnRzW10gPSBuZXcgTXVsdGlDb25zdHJhaW50KCR1bkVxdWFsQ29uc3RyYWludHMsIHRydWUpOwp9IGVsc2UgewokY29uc3RyYWludHNbXSA9ICR1bkVxdWFsQ29uc3RyYWludHNbMF07Cn0KCiR1bkVxdWFsQ29uc3RyYWludHMgPSBhcnJheSgpOwpjb250aW51ZTsKfQoKCmlmICgkaW50ZXJ2YWwtPmdldFN0YXJ0KCktPmdldFZlcnNpb24oKSA9PT0gJGludGVydmFsLT5nZXRFbmQoKS0+Z2V0VmVyc2lvbigpICYmICRpbnRlcnZhbC0+Z2V0U3RhcnQoKS0+Z2V0T3BlcmF0b3IoKSA9PT0gJz49JyAmJiAkaW50ZXJ2YWwtPmdldEVuZCgpLT5nZXRPcGVyYXRvcigpID09PSAnPD0nKSB7CiRjb25zdHJhaW50c1tdID0gbmV3IENvbnN0cmFpbnQoJz09JywgJGludGVydmFsLT5nZXRTdGFydCgpLT5nZXRWZXJzaW9uKCkpOwpjb250aW51ZTsKfQoKaWYgKChzdHJpbmcpICRpbnRlcnZhbC0+Z2V0U3RhcnQoKSA9PT0gKHN0cmluZykgSW50ZXJ2YWw6OmZyb21aZXJvKCkpIHsKJGNvbnN0cmFpbnRzW10gPSAkaW50ZXJ2YWwtPmdldEVuZCgpOwp9IGVsc2VpZiAoKHN0cmluZykgJGludGVydmFsLT5nZXRFbmQoKSA9PT0gKHN0cmluZykgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKSB7CiRjb25zdHJhaW50c1tdID0gJGludGVydmFsLT5nZXRTdGFydCgpOwp9IGVsc2UgewokY29uc3RyYWludHNbXSA9IG5ldyBNdWx0aUNvbnN0cmFpbnQoYXJyYXkoJGludGVydmFsLT5nZXRTdGFydCgpLCAkaW50ZXJ2YWwtPmdldEVuZCgpKSwgdHJ1ZSk7Cn0KfQp9CgokZGV2Q29uc3RyYWludHMgPSBhcnJheSgpOwoKaWYgKDAgPT09IFxjb3VudCgkaW50ZXJ2YWxzWydicmFuY2hlcyddWyduYW1lcyddKSkgewppZiAoJGludGVydmFsc1snYnJhbmNoZXMnXVsnZXhjbHVkZSddKSB7CmlmICgkaGFzTnVtZXJpY01hdGNoQWxsKSB7CnJldHVybiBuZXcgTWF0Y2hBbGxDb25zdHJhaW50Owp9Cgp9Cn0gZWxzZSB7CmZvcmVhY2ggKCRpbnRlcnZhbHNbJ2JyYW5jaGVzJ11bJ25hbWVzJ10gYXMgJGJyYW5jaE5hbWUpIHsKaWYgKCRpbnRlcnZhbHNbJ2JyYW5jaGVzJ11bJ2V4Y2x1ZGUnXSkgewokZGV2Q29uc3RyYWludHNbXSA9IG5ldyBDb25zdHJhaW50KCchPScsICRicmFuY2hOYW1lKTsKfSBlbHNlIHsKJGRldkNvbnN0cmFpbnRzW10gPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkYnJhbmNoTmFtZSk7Cn0KfQoKCgppZiAoJGludGVydmFsc1snYnJhbmNoZXMnXVsnZXhjbHVkZSddKSB7CmlmIChcY291bnQoJGNvbnN0cmFpbnRzKSA+IDEpIHsKcmV0dXJuIG5ldyBNdWx0aUNvbnN0cmFpbnQoYXJyYXlfbWVyZ2UoCmFycmF5KG5ldyBNdWx0aUNvbnN0cmFpbnQoJGNvbnN0cmFpbnRzLCBmYWxzZSkpLAokZGV2Q29uc3RyYWludHMKKSwgdHJ1ZSk7Cn0KCmlmIChcY291bnQoJGNvbnN0cmFpbnRzKSA9PT0gMSAmJiAoc3RyaW5nKSRjb25zdHJhaW50c1swXSA9PT0gKHN0cmluZylJbnRlcnZhbDo6ZnJvbVplcm8oKSkgewppZiAoXGNvdW50KCRkZXZDb25zdHJhaW50cykgPiAxKSB7CnJldHVybiBuZXcgTXVsdGlDb25zdHJhaW50KCRkZXZDb25zdHJhaW50cywgdHJ1ZSk7Cn0KcmV0dXJuICRkZXZDb25zdHJhaW50c1swXTsKfQoKcmV0dXJuIG5ldyBNdWx0aUNvbnN0cmFpbnQoYXJyYXlfbWVyZ2UoJGNvbnN0cmFpbnRzLCAkZGV2Q29uc3RyYWludHMpLCB0cnVlKTsKfQoKCgokY29uc3RyYWludHMgPSBhcnJheV9tZXJnZSgkY29uc3RyYWludHMsICRkZXZDb25zdHJhaW50cyk7Cn0KCmlmIChcY291bnQoJGNvbnN0cmFpbnRzKSA+IDEpIHsKcmV0dXJuIG5ldyBNdWx0aUNvbnN0cmFpbnQoJGNvbnN0cmFpbnRzLCBmYWxzZSk7Cn0KCmlmIChcY291bnQoJGNvbnN0cmFpbnRzKSA9PT0gMSkgewpyZXR1cm4gJGNvbnN0cmFpbnRzWzBdOwp9CgpyZXR1cm4gbmV3IE1hdGNoTm9uZUNvbnN0cmFpbnQ7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldChDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50KQp7CiRrZXkgPSAoc3RyaW5nKSAkY29uc3RyYWludDsKCmlmICghaXNzZXQoc2VsZjo6JGludGVydmFsc0NhY2hlWyRrZXldKSkgewpzZWxmOjokaW50ZXJ2YWxzQ2FjaGVbJGtleV0gPSBzZWxmOjpnZW5lcmF0ZUludGVydmFscygkY29uc3RyYWludCk7Cn0KCnJldHVybiBzZWxmOjokaW50ZXJ2YWxzQ2FjaGVbJGtleV07Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2VuZXJhdGVJbnRlcnZhbHMoQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCwgJHN0b3BPbkZpcnN0VmFsaWRJbnRlcnZhbCA9IGZhbHNlKQp7CmlmICgkY29uc3RyYWludCBpbnN0YW5jZW9mIE1hdGNoQWxsQ29uc3RyYWludCkgewpyZXR1cm4gYXJyYXkoJ251bWVyaWMnID0+IGFycmF5KG5ldyBJbnRlcnZhbChJbnRlcnZhbDo6ZnJvbVplcm8oKSwgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKSksICdicmFuY2hlcycgPT4gSW50ZXJ2YWw6OmFueURldigpKTsKfQoKaWYgKCRjb25zdHJhaW50IGluc3RhbmNlb2YgTWF0Y2hOb25lQ29uc3RyYWludCkgewpyZXR1cm4gYXJyYXkoJ251bWVyaWMnID0+IGFycmF5KCksICdicmFuY2hlcycgPT4gYXJyYXkoJ25hbWVzJyA9PiBhcnJheSgpLCAnZXhjbHVkZScgPT4gZmFsc2UpKTsKfQoKaWYgKCRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludCkgewpyZXR1cm4gc2VsZjo6Z2VuZXJhdGVTaW5nbGVDb25zdHJhaW50SW50ZXJ2YWxzKCRjb25zdHJhaW50KTsKfQoKaWYgKCEkY29uc3RyYWludCBpbnN0YW5jZW9mIE11bHRpQ29uc3RyYWludCkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignVGhlIGNvbnN0cmFpbnQgcGFzc2VkIGluIHNob3VsZCBiZSBhbiBNYXRjaEFsbENvbnN0cmFpbnQsIENvbnN0cmFpbnQgb3IgTXVsdGlDb25zdHJhaW50IGluc3RhbmNlLCBnb3QgJy5cZ2V0X2NsYXNzKCRjb25zdHJhaW50KS4nLicpOwp9CgokY29uc3RyYWludHMgPSAkY29uc3RyYWludC0+Z2V0Q29uc3RyYWludHMoKTsKCiRudW1lcmljR3JvdXBzID0gYXJyYXkoKTsKJGNvbnN0cmFpbnRCcmFuY2hlcyA9IGFycmF5KCk7CmZvcmVhY2ggKCRjb25zdHJhaW50cyBhcyAkYykgewokcmVzID0gc2VsZjo6Z2V0KCRjKTsKJG51bWVyaWNHcm91cHNbXSA9ICRyZXNbJ251bWVyaWMnXTsKJGNvbnN0cmFpbnRCcmFuY2hlc1tdID0gJHJlc1snYnJhbmNoZXMnXTsKfQoKaWYgKCRjb25zdHJhaW50LT5pc0Rpc2p1bmN0aXZlKCkpIHsKJGJyYW5jaGVzID0gSW50ZXJ2YWw6Om5vRGV2KCk7CmZvcmVhY2ggKCRjb25zdHJhaW50QnJhbmNoZXMgYXMgJGIpIHsKaWYgKCRiWydleGNsdWRlJ10pIHsKaWYgKCRicmFuY2hlc1snZXhjbHVkZSddKSB7CgoKJGJyYW5jaGVzWyduYW1lcyddID0gYXJyYXlfaW50ZXJzZWN0KCRicmFuY2hlc1snbmFtZXMnXSwgJGJbJ25hbWVzJ10pOwp9IGVsc2UgewoKCiRicmFuY2hlc1snZXhjbHVkZSddID0gdHJ1ZTsKJGJyYW5jaGVzWyduYW1lcyddID0gYXJyYXlfZGlmZigkYlsnbmFtZXMnXSwgJGJyYW5jaGVzWyduYW1lcyddKTsKfQp9IGVsc2UgewppZiAoJGJyYW5jaGVzWydleGNsdWRlJ10pIHsKCgokYnJhbmNoZXNbJ25hbWVzJ10gPSBhcnJheV9kaWZmKCRicmFuY2hlc1snbmFtZXMnXSwgJGJbJ25hbWVzJ10pOwp9IGVsc2UgewoKCiRicmFuY2hlc1snbmFtZXMnXSA9IGFycmF5X21lcmdlKCRicmFuY2hlc1snbmFtZXMnXSwgJGJbJ25hbWVzJ10pOwp9Cn0KfQp9IGVsc2UgewokYnJhbmNoZXMgPSBJbnRlcnZhbDo6YW55RGV2KCk7CmZvcmVhY2ggKCRjb25zdHJhaW50QnJhbmNoZXMgYXMgJGIpIHsKaWYgKCRiWydleGNsdWRlJ10pIHsKaWYgKCRicmFuY2hlc1snZXhjbHVkZSddKSB7CgoKJGJyYW5jaGVzWyduYW1lcyddID0gYXJyYXlfbWVyZ2UoJGJyYW5jaGVzWyduYW1lcyddLCAkYlsnbmFtZXMnXSk7Cn0gZWxzZSB7CgoKJGJyYW5jaGVzWyduYW1lcyddID0gYXJyYXlfZGlmZigkYnJhbmNoZXNbJ25hbWVzJ10sICRiWyduYW1lcyddKTsKfQp9IGVsc2UgewppZiAoJGJyYW5jaGVzWydleGNsdWRlJ10pIHsKCgokYnJhbmNoZXNbJ25hbWVzJ10gPSBhcnJheV9kaWZmKCRiWyduYW1lcyddLCAkYnJhbmNoZXNbJ25hbWVzJ10pOwokYnJhbmNoZXNbJ2V4Y2x1ZGUnXSA9IGZhbHNlOwp9IGVsc2UgewoKCiRicmFuY2hlc1snbmFtZXMnXSA9IGFycmF5X2ludGVyc2VjdCgkYnJhbmNoZXNbJ25hbWVzJ10sICRiWyduYW1lcyddKTsKfQp9Cn0KfQoKJGJyYW5jaGVzWyduYW1lcyddID0gYXJyYXlfdW5pcXVlKCRicmFuY2hlc1snbmFtZXMnXSk7CgppZiAoXGNvdW50KCRudW1lcmljR3JvdXBzKSA9PT0gMSkgewpyZXR1cm4gYXJyYXkoJ251bWVyaWMnID0+ICRudW1lcmljR3JvdXBzWzBdLCAnYnJhbmNoZXMnID0+ICRicmFuY2hlcyk7Cn0KCiRib3JkZXJzID0gYXJyYXkoKTsKZm9yZWFjaCAoJG51bWVyaWNHcm91cHMgYXMgJGdyb3VwKSB7CmZvcmVhY2ggKCRncm91cCBhcyAkaW50ZXJ2YWwpIHsKJGJvcmRlcnNbXSA9IGFycmF5KCd2ZXJzaW9uJyA9PiAkaW50ZXJ2YWwtPmdldFN0YXJ0KCktPmdldFZlcnNpb24oKSwgJ29wZXJhdG9yJyA9PiAkaW50ZXJ2YWwtPmdldFN0YXJ0KCktPmdldE9wZXJhdG9yKCksICdzaWRlJyA9PiAnc3RhcnQnKTsKJGJvcmRlcnNbXSA9IGFycmF5KCd2ZXJzaW9uJyA9PiAkaW50ZXJ2YWwtPmdldEVuZCgpLT5nZXRWZXJzaW9uKCksICdvcGVyYXRvcicgPT4gJGludGVydmFsLT5nZXRFbmQoKS0+Z2V0T3BlcmF0b3IoKSwgJ3NpZGUnID0+ICdlbmQnKTsKfQp9Cgokb3BTb3J0T3JkZXIgPSBzZWxmOjokb3BTb3J0T3JkZXI7CnVzb3J0KCRib3JkZXJzLCBmdW5jdGlvbiAoJGEsICRiKSB1c2UgKCRvcFNvcnRPcmRlcikgewokb3JkZXIgPSB2ZXJzaW9uX2NvbXBhcmUoJGFbJ3ZlcnNpb24nXSwgJGJbJ3ZlcnNpb24nXSk7CmlmICgkb3JkZXIgPT09IDApIHsKcmV0dXJuICRvcFNvcnRPcmRlclskYVsnb3BlcmF0b3InXV0gLSAkb3BTb3J0T3JkZXJbJGJbJ29wZXJhdG9yJ11dOwp9CgpyZXR1cm4gJG9yZGVyOwp9KTsKCiRhY3RpdmVJbnRlcnZhbHMgPSAwOwokaW50ZXJ2YWxzID0gYXJyYXkoKTsKJGluZGV4ID0gMDsKJGFjdGl2YXRpb25UaHJlc2hvbGQgPSAkY29uc3RyYWludC0+aXNDb25qdW5jdGl2ZSgpID8gXGNvdW50KCRudW1lcmljR3JvdXBzKSA6IDE7CiRzdGFydCA9IG51bGw7CmZvcmVhY2ggKCRib3JkZXJzIGFzICRib3JkZXIpIHsKaWYgKCRib3JkZXJbJ3NpZGUnXSA9PT0gJ3N0YXJ0JykgewokYWN0aXZlSW50ZXJ2YWxzKys7Cn0gZWxzZSB7CiRhY3RpdmVJbnRlcnZhbHMtLTsKfQppZiAoISRzdGFydCAmJiAkYWN0aXZlSW50ZXJ2YWxzID49ICRhY3RpdmF0aW9uVGhyZXNob2xkKSB7CiRzdGFydCA9IG5ldyBDb25zdHJhaW50KCRib3JkZXJbJ29wZXJhdG9yJ10sICRib3JkZXJbJ3ZlcnNpb24nXSk7Cn0gZWxzZWlmICgkc3RhcnQgJiYgJGFjdGl2ZUludGVydmFscyA8ICRhY3RpdmF0aW9uVGhyZXNob2xkKSB7CgppZiAoCnZlcnNpb25fY29tcGFyZSgkc3RhcnQtPmdldFZlcnNpb24oKSwgJGJvcmRlclsndmVyc2lvbiddLCAnPScpCiYmICgKKCRzdGFydC0+Z2V0T3BlcmF0b3IoKSA9PT0gJz4nICYmICRib3JkZXJbJ29wZXJhdG9yJ10gPT09ICc8PScpCnx8ICgkc3RhcnQtPmdldE9wZXJhdG9yKCkgPT09ICc+PScgJiYgJGJvcmRlclsnb3BlcmF0b3InXSA9PT0gJzwnKQopCikgewp1bnNldCgkaW50ZXJ2YWxzWyRpbmRleF0pOwp9IGVsc2UgewokaW50ZXJ2YWxzWyRpbmRleF0gPSBuZXcgSW50ZXJ2YWwoJHN0YXJ0LCBuZXcgQ29uc3RyYWludCgkYm9yZGVyWydvcGVyYXRvciddLCAkYm9yZGVyWyd2ZXJzaW9uJ10pKTsKJGluZGV4Kys7CgppZiAoJHN0b3BPbkZpcnN0VmFsaWRJbnRlcnZhbCkgewpicmVhazsKfQp9Cgokc3RhcnQgPSBudWxsOwp9Cn0KCnJldHVybiBhcnJheSgnbnVtZXJpYycgPT4gJGludGVydmFscywgJ2JyYW5jaGVzJyA9PiAkYnJhbmNoZXMpOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZW5lcmF0ZVNpbmdsZUNvbnN0cmFpbnRJbnRlcnZhbHMoQ29uc3RyYWludCAkY29uc3RyYWludCkKewokb3AgPSAkY29uc3RyYWludC0+Z2V0T3BlcmF0b3IoKTsKCgppZiAoc3RycG9zKCRjb25zdHJhaW50LT5nZXRWZXJzaW9uKCksICdkZXYtJykgPT09IDApIHsKJGludGVydmFscyA9IGFycmF5KCk7CiRicmFuY2hlcyA9IGFycmF5KCduYW1lcycgPT4gYXJyYXkoKSwgJ2V4Y2x1ZGUnID0+IGZhbHNlKTsKCgppZiAoJG9wID09PSAnIT0nKSB7CiRpbnRlcnZhbHNbXSA9IG5ldyBJbnRlcnZhbChJbnRlcnZhbDo6ZnJvbVplcm8oKSwgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKTsKJGJyYW5jaGVzID0gYXJyYXkoJ25hbWVzJyA9PiBhcnJheSgkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpKSwgJ2V4Y2x1ZGUnID0+IHRydWUpOwp9IGVsc2VpZiAoJG9wID09PSAnPT0nKSB7CiRicmFuY2hlc1snbmFtZXMnXVtdID0gJGNvbnN0cmFpbnQtPmdldFZlcnNpb24oKTsKfQoKcmV0dXJuIGFycmF5KAonbnVtZXJpYycgPT4gJGludGVydmFscywKJ2JyYW5jaGVzJyA9PiAkYnJhbmNoZXMsCik7Cn0KCmlmICgkb3BbMF0gPT09ICc+JykgeyAKcmV0dXJuIGFycmF5KCdudW1lcmljJyA9PiBhcnJheShuZXcgSW50ZXJ2YWwoJGNvbnN0cmFpbnQsIEludGVydmFsOjp1bnRpbFBvc2l0aXZlSW5maW5pdHkoKSkpLCAnYnJhbmNoZXMnID0+IEludGVydmFsOjpub0RldigpKTsKfQppZiAoJG9wWzBdID09PSAnPCcpIHsgCnJldHVybiBhcnJheSgnbnVtZXJpYycgPT4gYXJyYXkobmV3IEludGVydmFsKEludGVydmFsOjpmcm9tWmVybygpLCAkY29uc3RyYWludCkpLCAnYnJhbmNoZXMnID0+IEludGVydmFsOjpub0RldigpKTsKfQppZiAoJG9wID09PSAnIT0nKSB7CgpyZXR1cm4gYXJyYXkoJ251bWVyaWMnID0+IGFycmF5KApuZXcgSW50ZXJ2YWwoSW50ZXJ2YWw6OmZyb21aZXJvKCksIG5ldyBDb25zdHJhaW50KCc8JywgJGNvbnN0cmFpbnQtPmdldFZlcnNpb24oKSkpLApuZXcgSW50ZXJ2YWwobmV3IENvbnN0cmFpbnQoJz4nLCAkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpKSwgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKSwKKSwgJ2JyYW5jaGVzJyA9PiBJbnRlcnZhbDo6YW55RGV2KCkpOwp9CgoKcmV0dXJuIGFycmF5KCdudW1lcmljJyA9PiBhcnJheSgKbmV3IEludGVydmFsKG5ldyBDb25zdHJhaW50KCc+PScsICRjb25zdHJhaW50LT5nZXRWZXJzaW9uKCkpLCBuZXcgQ29uc3RyYWludCgnPD0nLCAkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpKSksCiksICdicmFuY2hlcycgPT4gSW50ZXJ2YWw6Om5vRGV2KCkpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXI7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKCmNsYXNzIFNlbXZlcgp7CmNvbnN0IFNPUlRfQVNDID0gMTsKY29uc3QgU09SVF9ERVNDID0gLTE7CgoKcHJpdmF0ZSBzdGF0aWMgJHZlcnNpb25QYXJzZXI7CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F0aXNmaWVzKCR2ZXJzaW9uLCAkY29uc3RyYWludHMpCnsKaWYgKG51bGwgPT09IHNlbGY6OiR2ZXJzaW9uUGFyc2VyKSB7CnNlbGY6OiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKfQoKJHZlcnNpb25QYXJzZXIgPSBzZWxmOjokdmVyc2lvblBhcnNlcjsKJHByb3ZpZGVyID0gbmV3IENvbnN0cmFpbnQoJz09JywgJHZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkdmVyc2lvbikpOwokcGFyc2VkQ29uc3RyYWludHMgPSAkdmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludHMpOwoKcmV0dXJuICRwYXJzZWRDb25zdHJhaW50cy0+bWF0Y2hlcygkcHJvdmlkZXIpOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F0aXNmaWVkQnkoYXJyYXkgJHZlcnNpb25zLCAkY29uc3RyYWludHMpCnsKJHZlcnNpb25zID0gYXJyYXlfZmlsdGVyKCR2ZXJzaW9ucywgZnVuY3Rpb24gKCR2ZXJzaW9uKSB1c2UgKCRjb25zdHJhaW50cykgewpyZXR1cm4gU2VtdmVyOjpzYXRpc2ZpZXMoJHZlcnNpb24sICRjb25zdHJhaW50cyk7Cn0pOwoKcmV0dXJuIGFycmF5X3ZhbHVlcygkdmVyc2lvbnMpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzb3J0KGFycmF5ICR2ZXJzaW9ucykKewpyZXR1cm4gc2VsZjo6dXNvcnQoJHZlcnNpb25zLCBzZWxmOjpTT1JUX0FTQyk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJzb3J0KGFycmF5ICR2ZXJzaW9ucykKewpyZXR1cm4gc2VsZjo6dXNvcnQoJHZlcnNpb25zLCBzZWxmOjpTT1JUX0RFU0MpOwp9CgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB1c29ydChhcnJheSAkdmVyc2lvbnMsICRkaXJlY3Rpb24pCnsKaWYgKG51bGwgPT09IHNlbGY6OiR2ZXJzaW9uUGFyc2VyKSB7CnNlbGY6OiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKfQoKJHZlcnNpb25QYXJzZXIgPSBzZWxmOjokdmVyc2lvblBhcnNlcjsKJG5vcm1hbGl6ZWQgPSBhcnJheSgpOwoKCgpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJGtleSA9PiAkdmVyc2lvbikgewokbm9ybWFsaXplZFZlcnNpb24gPSAkdmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uKTsKJG5vcm1hbGl6ZWRWZXJzaW9uID0gJHZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZURlZmF1bHRCcmFuY2goJG5vcm1hbGl6ZWRWZXJzaW9uKTsKJG5vcm1hbGl6ZWRbXSA9IGFycmF5KCRub3JtYWxpemVkVmVyc2lvbiwgJGtleSk7Cn0KCnVzb3J0KCRub3JtYWxpemVkLCBmdW5jdGlvbiAoYXJyYXkgJGxlZnQsIGFycmF5ICRyaWdodCkgdXNlICgkZGlyZWN0aW9uKSB7CmlmICgkbGVmdFswXSA9PT0gJHJpZ2h0WzBdKSB7CnJldHVybiAwOwp9CgppZiAoQ29tcGFyYXRvcjo6bGVzc1RoYW4oJGxlZnRbMF0sICRyaWdodFswXSkpIHsKcmV0dXJuIC0kZGlyZWN0aW9uOwp9CgpyZXR1cm4gJGRpcmVjdGlvbjsKfSk7CgoKJHNvcnRlZCA9IGFycmF5KCk7CmZvcmVhY2ggKCRub3JtYWxpemVkIGFzICRpdGVtKSB7CiRzb3J0ZWRbXSA9ICR2ZXJzaW9uc1skaXRlbVsxXV07Cn0KCnJldHVybiAkc29ydGVkOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXI7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE11bHRpQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CgoKCgoKCmNsYXNzIFZlcnNpb25QYXJzZXIKewoKCgoKCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgJG1vZGlmaWVyUmVnZXggPSAnWy5fLV0/KD86KHN0YWJsZXxiZXRhfGJ8UkN8YWxwaGF8YXxwYXRjaHxwbHxwKSgoPzpbLi1dP1xkKykqKyk/KT8oWy4tXT9kZXYpPyc7CgoKcHJpdmF0ZSBzdGF0aWMgJHN0YWJpbGl0aWVzUmVnZXggPSAnc3RhYmxlfFJDfGJldGF8YWxwaGF8ZGV2JzsKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZVN0YWJpbGl0eSgkdmVyc2lvbikKewokdmVyc2lvbiA9IChzdHJpbmcpIHByZWdfcmVwbGFjZSgneyMuKyR9JywgJycsIChzdHJpbmcpICR2ZXJzaW9uKTsKCmlmIChzdHJwb3MoJHZlcnNpb24sICdkZXYtJykgPT09IDAgfHwgJy1kZXYnID09PSBzdWJzdHIoJHZlcnNpb24sIC00KSkgewpyZXR1cm4gJ2Rldic7Cn0KCnByZWdfbWF0Y2goJ3snIC4gc2VsZjo6JG1vZGlmaWVyUmVnZXggLiAnKD86XCsuKik/JH1pJywgc3RydG9sb3dlcigkdmVyc2lvbiksICRtYXRjaCk7CgppZiAoIWVtcHR5KCRtYXRjaFszXSkpIHsKcmV0dXJuICdkZXYnOwp9CgppZiAoIWVtcHR5KCRtYXRjaFsxXSkpIHsKaWYgKCdiZXRhJyA9PT0gJG1hdGNoWzFdIHx8ICdiJyA9PT0gJG1hdGNoWzFdKSB7CnJldHVybiAnYmV0YSc7Cn0KaWYgKCdhbHBoYScgPT09ICRtYXRjaFsxXSB8fCAnYScgPT09ICRtYXRjaFsxXSkgewpyZXR1cm4gJ2FscGhhJzsKfQppZiAoJ3JjJyA9PT0gJG1hdGNoWzFdKSB7CnJldHVybiAnUkMnOwp9Cn0KCnJldHVybiAnc3RhYmxlJzsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVTdGFiaWxpdHkoJHN0YWJpbGl0eSkKewokc3RhYmlsaXR5ID0gc3RydG9sb3dlcigoc3RyaW5nKSAkc3RhYmlsaXR5KTsKCmlmICghaW5fYXJyYXkoJHN0YWJpbGl0eSwgYXJyYXkoJ3N0YWJsZScsICdyYycsICdiZXRhJywgJ2FscGhhJywgJ2RldicpLCB0cnVlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBzdGFiaWxpdHkgc3RyaW5nICInLiRzdGFiaWxpdHkuJyIsIGV4cGVjdGVkIG9uZSBvZiBzdGFibGUsIFJDLCBiZXRhLCBhbHBoYSBvciBkZXYnKTsKfQoKcmV0dXJuICRzdGFiaWxpdHkgPT09ICdyYycgPyAnUkMnIDogJHN0YWJpbGl0eTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3JtYWxpemUoJHZlcnNpb24sICRmdWxsVmVyc2lvbiA9IG51bGwpCnsKJHZlcnNpb24gPSB0cmltKChzdHJpbmcpICR2ZXJzaW9uKTsKJG9yaWdWZXJzaW9uID0gJHZlcnNpb247CmlmIChudWxsID09PSAkZnVsbFZlcnNpb24pIHsKJGZ1bGxWZXJzaW9uID0gJHZlcnNpb247Cn0KCgppZiAocHJlZ19tYXRjaCgne14oW14sXHNdKyspICsrYXMgKysoW14sXHNdKyspJH0nLCAkdmVyc2lvbiwgJG1hdGNoKSkgewokdmVyc2lvbiA9ICRtYXRjaFsxXTsKfQoKCmlmIChwcmVnX21hdGNoKCd7QCg/OicgLiBzZWxmOjokc3RhYmlsaXRpZXNSZWdleCAuICcpJH1pJywgJHZlcnNpb24sICRtYXRjaCkpIHsKJHZlcnNpb24gPSBzdWJzdHIoJHZlcnNpb24sIDAsIHN0cmxlbigkdmVyc2lvbikgLSBzdHJsZW4oJG1hdGNoWzBdKSk7Cn0KCgppZiAoXGluX2FycmF5KCR2ZXJzaW9uLCBhcnJheSgnbWFzdGVyJywgJ3RydW5rJywgJ2RlZmF1bHQnKSwgdHJ1ZSkpIHsKJHZlcnNpb24gPSAnZGV2LScgLiAkdmVyc2lvbjsKfQoKCmlmIChzdHJpcG9zKCR2ZXJzaW9uLCAnZGV2LScpID09PSAwKSB7CnJldHVybiAnZGV2LScgLiBzdWJzdHIoJHZlcnNpb24sIDQpOwp9CgoKaWYgKHByZWdfbWF0Y2goJ3teKFteLFxzK10rKylcK1teXHNdKyskfScsICR2ZXJzaW9uLCAkbWF0Y2gpKSB7CiR2ZXJzaW9uID0gJG1hdGNoWzFdOwp9CgoKaWYgKHByZWdfbWF0Y2goJ3tedj8oXGR7MSw1fSspKFwuXGQrKyk/KFwuXGQrKyk/KFwuXGQrKyk/JyAuIHNlbGY6OiRtb2RpZmllclJlZ2V4IC4gJyR9aScsICR2ZXJzaW9uLCAkbWF0Y2hlcykpIHsKJHZlcnNpb24gPSAkbWF0Y2hlc1sxXQouICghZW1wdHkoJG1hdGNoZXNbMl0pID8gJG1hdGNoZXNbMl0gOiAnLjAnKQouICghZW1wdHkoJG1hdGNoZXNbM10pID8gJG1hdGNoZXNbM10gOiAnLjAnKQouICghZW1wdHkoJG1hdGNoZXNbNF0pID8gJG1hdGNoZXNbNF0gOiAnLjAnKTsKJGluZGV4ID0gNTsKCn0gZWxzZWlmIChwcmVnX21hdGNoKCd7XnY/KFxkezR9KD86Wy46LV0/XGR7Mn0pezEsNn0oPzpbLjotXT9cZHsxLDN9KXswLDJ9KScgLiBzZWxmOjokbW9kaWZpZXJSZWdleCAuICckfWknLCAkdmVyc2lvbiwgJG1hdGNoZXMpKSB7CiR2ZXJzaW9uID0gKHN0cmluZykgcHJlZ19yZXBsYWNlKCd7XER9JywgJy4nLCAkbWF0Y2hlc1sxXSk7CiRpbmRleCA9IDI7Cn0KCgppZiAoaXNzZXQoJGluZGV4KSkgewppZiAoIWVtcHR5KCRtYXRjaGVzWyRpbmRleF0pKSB7CmlmICgnc3RhYmxlJyA9PT0gJG1hdGNoZXNbJGluZGV4XSkgewpyZXR1cm4gJHZlcnNpb247Cn0KJHZlcnNpb24gLj0gJy0nIC4gJHRoaXMtPmV4cGFuZFN0YWJpbGl0eSgkbWF0Y2hlc1skaW5kZXhdKSAuIChpc3NldCgkbWF0Y2hlc1skaW5kZXggKyAxXSkgJiYgJycgIT09ICRtYXRjaGVzWyRpbmRleCArIDFdID8gbHRyaW0oJG1hdGNoZXNbJGluZGV4ICsgMV0sICcuLScpIDogJycpOwp9CgppZiAoIWVtcHR5KCRtYXRjaGVzWyRpbmRleCArIDJdKSkgewokdmVyc2lvbiAuPSAnLWRldic7Cn0KCnJldHVybiAkdmVyc2lvbjsKfQoKCmlmIChwcmVnX21hdGNoKCd7KC4qPylbLi1dP2RldiR9aScsICR2ZXJzaW9uLCAkbWF0Y2gpKSB7CnRyeSB7CiRub3JtYWxpemVkID0gJHRoaXMtPm5vcm1hbGl6ZUJyYW5jaCgkbWF0Y2hbMV0pOwoKCgppZiAoc3RycG9zKCRub3JtYWxpemVkLCAnZGV2LScpID09PSBmYWxzZSkgewpyZXR1cm4gJG5vcm1hbGl6ZWQ7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp9Cn0KCiRleHRyYU1lc3NhZ2UgPSAnJzsKaWYgKHByZWdfbWF0Y2goJ3sgK2FzICsnIC4gcHJlZ19xdW90ZSgkdmVyc2lvbikgLiAnKD86QCg/Oicuc2VsZjo6JHN0YWJpbGl0aWVzUmVnZXguJykpPyR9JywgJGZ1bGxWZXJzaW9uKSkgewokZXh0cmFNZXNzYWdlID0gJyBpbiAiJyAuICRmdWxsVmVyc2lvbiAuICciLCB0aGUgYWxpYXMgbXVzdCBiZSBhbiBleGFjdCB2ZXJzaW9uJzsKfSBlbHNlaWYgKHByZWdfbWF0Y2goJ3teJyAuIHByZWdfcXVvdGUoJHZlcnNpb24pIC4gJyg/OkAoPzonLnNlbGY6OiRzdGFiaWxpdGllc1JlZ2V4LicpKT8gK2FzICt9JywgJGZ1bGxWZXJzaW9uKSkgewokZXh0cmFNZXNzYWdlID0gJyBpbiAiJyAuICRmdWxsVmVyc2lvbiAuICciLCB0aGUgYWxpYXMgc291cmNlIG11c3QgYmUgYW4gZXhhY3QgdmVyc2lvbiwgaWYgaXQgaXMgYSBicmFuY2ggbmFtZSB5b3Ugc2hvdWxkIHByZWZpeCBpdCB3aXRoIGRldi0nOwp9Cgp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignSW52YWxpZCB2ZXJzaW9uIHN0cmluZyAiJyAuICRvcmlnVmVyc2lvbiAuICciJyAuICRleHRyYU1lc3NhZ2UpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlTnVtZXJpY0FsaWFzUHJlZml4KCRicmFuY2gpCnsKaWYgKHByZWdfbWF0Y2goJ3teKD9QPHZlcnNpb24+KFxkKytcXC4pKlxkKyspKD86XC54KT8tZGV2JH1pJywgKHN0cmluZykgJGJyYW5jaCwgJG1hdGNoZXMpKSB7CnJldHVybiAkbWF0Y2hlc1sndmVyc2lvbiddIC4gJy4nOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm9ybWFsaXplQnJhbmNoKCRuYW1lKQp7CiRuYW1lID0gdHJpbSgoc3RyaW5nKSAkbmFtZSk7CgppZiAocHJlZ19tYXRjaCgne152PyhcZCsrKShcLig/OlxkKyt8W3hYKl0pKT8oXC4oPzpcZCsrfFt4WCpdKSk/KFwuKD86XGQrK3xbeFgqXSkpPyR9aScsICRuYW1lLCAkbWF0Y2hlcykpIHsKJHZlcnNpb24gPSAnJzsKZm9yICgkaSA9IDE7ICRpIDwgNTsgKyskaSkgewokdmVyc2lvbiAuPSBpc3NldCgkbWF0Y2hlc1skaV0pID8gc3RyX3JlcGxhY2UoYXJyYXkoJyonLCAnWCcpLCAneCcsICRtYXRjaGVzWyRpXSkgOiAnLngnOwp9CgpyZXR1cm4gc3RyX3JlcGxhY2UoJ3gnLCAnOTk5OTk5OScsICR2ZXJzaW9uKSAuICctZGV2JzsKfQoKcmV0dXJuICdkZXYtJyAuICRuYW1lOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm9ybWFsaXplRGVmYXVsdEJyYW5jaCgkbmFtZSkKewppZiAoJG5hbWUgPT09ICdkZXYtbWFzdGVyJyB8fCAkbmFtZSA9PT0gJ2Rldi1kZWZhdWx0JyB8fCAkbmFtZSA9PT0gJ2Rldi10cnVuaycpIHsKcmV0dXJuICc5OTk5OTk5LWRldic7Cn0KCnJldHVybiAoc3RyaW5nKSAkbmFtZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwYXJzZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50cykKewokcHJldHR5Q29uc3RyYWludCA9IChzdHJpbmcpICRjb25zdHJhaW50czsKCiRvckNvbnN0cmFpbnRzID0gcHJlZ19zcGxpdCgne1xzKlx8XHw/XHMqfScsIHRyaW0oKHN0cmluZykgJGNvbnN0cmFpbnRzKSk7CmlmIChmYWxzZSA9PT0gJG9yQ29uc3RyYWludHMpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gcHJlZ19zcGxpdCBzdHJpbmc6ICcuJGNvbnN0cmFpbnRzKTsKfQokb3JHcm91cHMgPSBhcnJheSgpOwoKZm9yZWFjaCAoJG9yQ29uc3RyYWludHMgYXMgJG9yQ29uc3RyYWludCkgewokYW5kQ29uc3RyYWludHMgPSBwcmVnX3NwbGl0KCd7KD88IV58YXN8Wz0+PCAsXSkgKig/PCEtKVssIF0oPyEtKSAqKD8hLHxhc3wkKX0nLCAkb3JDb25zdHJhaW50KTsKaWYgKGZhbHNlID09PSAkYW5kQ29uc3RyYWludHMpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gcHJlZ19zcGxpdCBzdHJpbmc6ICcuJG9yQ29uc3RyYWludCk7Cn0KaWYgKFxjb3VudCgkYW5kQ29uc3RyYWludHMpID4gMSkgewokY29uc3RyYWludE9iamVjdHMgPSBhcnJheSgpOwpmb3JlYWNoICgkYW5kQ29uc3RyYWludHMgYXMgJGFuZENvbnN0cmFpbnQpIHsKZm9yZWFjaCAoJHRoaXMtPnBhcnNlQ29uc3RyYWludCgkYW5kQ29uc3RyYWludCkgYXMgJHBhcnNlZEFuZENvbnN0cmFpbnQpIHsKJGNvbnN0cmFpbnRPYmplY3RzW10gPSAkcGFyc2VkQW5kQ29uc3RyYWludDsKfQp9Cn0gZWxzZSB7CiRjb25zdHJhaW50T2JqZWN0cyA9ICR0aGlzLT5wYXJzZUNvbnN0cmFpbnQoJGFuZENvbnN0cmFpbnRzWzBdKTsKfQoKaWYgKDEgPT09IFxjb3VudCgkY29uc3RyYWludE9iamVjdHMpKSB7CiRjb25zdHJhaW50ID0gJGNvbnN0cmFpbnRPYmplY3RzWzBdOwp9IGVsc2UgewokY29uc3RyYWludCA9IG5ldyBNdWx0aUNvbnN0cmFpbnQoJGNvbnN0cmFpbnRPYmplY3RzKTsKfQoKJG9yR3JvdXBzW10gPSAkY29uc3RyYWludDsKfQoKJHBhcnNlZENvbnN0cmFpbnQgPSBNdWx0aUNvbnN0cmFpbnQ6OmNyZWF0ZSgkb3JHcm91cHMsIGZhbHNlKTsKCiRwYXJzZWRDb25zdHJhaW50LT5zZXRQcmV0dHlTdHJpbmcoJHByZXR0eUNvbnN0cmFpbnQpOwoKcmV0dXJuICRwYXJzZWRDb25zdHJhaW50Owp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBhcnNlQ29uc3RyYWludCgkY29uc3RyYWludCkKewoKaWYgKHByZWdfbWF0Y2goJ3teKFteLFxzXSsrKSArK2FzICsrKFteLFxzXSsrKSR9JywgJGNvbnN0cmFpbnQsICRtYXRjaCkpIHsKJGNvbnN0cmFpbnQgPSAkbWF0Y2hbMV07Cn0KCgppZiAocHJlZ19tYXRjaCgne14oW14sXHNdKj8pQCgnIC4gc2VsZjo6JHN0YWJpbGl0aWVzUmVnZXggLiAnKSR9aScsICRjb25zdHJhaW50LCAkbWF0Y2gpKSB7CiRjb25zdHJhaW50ID0gJycgIT09ICRtYXRjaFsxXSA/ICRtYXRjaFsxXSA6ICcqJzsKaWYgKCRtYXRjaFsyXSAhPT0gJ3N0YWJsZScpIHsKJHN0YWJpbGl0eU1vZGlmaWVyID0gJG1hdGNoWzJdOwp9Cn0KCgppZiAocHJlZ19tYXRjaCgne14oZGV2LVteLFxzQF0rP3xbXixcc0BdKz9cLngtZGV2KSMuKyR9aScsICRjb25zdHJhaW50LCAkbWF0Y2gpKSB7CiRjb25zdHJhaW50ID0gJG1hdGNoWzFdOwp9CgppZiAocHJlZ19tYXRjaCgne14odik/W3hYKl0oXC5beFgqXSkqJH1pJywgJGNvbnN0cmFpbnQsICRtYXRjaCkpIHsKaWYgKCFlbXB0eSgkbWF0Y2hbMV0pIHx8ICFlbXB0eSgkbWF0Y2hbMl0pKSB7CnJldHVybiBhcnJheShuZXcgQ29uc3RyYWludCgnPj0nLCAnMC4wLjAuMC1kZXYnKSk7Cn0KCnJldHVybiBhcnJheShuZXcgTWF0Y2hBbGxDb25zdHJhaW50KCkpOwp9CgokdmVyc2lvblJlZ2V4ID0gJ3Y/KFxkKyspKD86XC4oXGQrKykpPyg/OlwuKFxkKyspKT8oPzpcLihcZCsrKSk/KD86JyAuIHNlbGY6OiRtb2RpZmllclJlZ2V4IC4gJ3xcLihbeFgqXVsuLV0/ZGV2KSkoPzpcK1teXHNdKyk/JzsKCgoKCgoKaWYgKHByZWdfbWF0Y2goJ3tefj4/JyAuICR2ZXJzaW9uUmVnZXggLiAnJH1pJywgJGNvbnN0cmFpbnQsICRtYXRjaGVzKSkgewppZiAoc3RycG9zKCRjb25zdHJhaW50LCAnfj4nKSA9PT0gMCkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbigKJ0NvdWxkIG5vdCBwYXJzZSB2ZXJzaW9uIGNvbnN0cmFpbnQgJyAuICRjb25zdHJhaW50IC4gJzogJyAuCidJbnZhbGlkIG9wZXJhdG9yICJ+PiIsIHlvdSBwcm9iYWJseSBtZWFudCB0byB1c2UgdGhlICJ+IiBvcGVyYXRvcicKKTsKfQoKCmlmIChpc3NldCgkbWF0Y2hlc1s0XSkgJiYgJycgIT09ICRtYXRjaGVzWzRdICYmIG51bGwgIT09ICRtYXRjaGVzWzRdKSB7CiRwb3NpdGlvbiA9IDQ7Cn0gZWxzZWlmIChpc3NldCgkbWF0Y2hlc1szXSkgJiYgJycgIT09ICRtYXRjaGVzWzNdICYmIG51bGwgIT09ICRtYXRjaGVzWzNdKSB7CiRwb3NpdGlvbiA9IDM7Cn0gZWxzZWlmIChpc3NldCgkbWF0Y2hlc1syXSkgJiYgJycgIT09ICRtYXRjaGVzWzJdICYmIG51bGwgIT09ICRtYXRjaGVzWzJdKSB7CiRwb3NpdGlvbiA9IDI7Cn0gZWxzZSB7CiRwb3NpdGlvbiA9IDE7Cn0KCgppZiAoIWVtcHR5KCRtYXRjaGVzWzhdKSkgewokcG9zaXRpb24rKzsKfQoKCiRzdGFiaWxpdHlTdWZmaXggPSAnJzsKaWYgKGVtcHR5KCRtYXRjaGVzWzVdKSAmJiBlbXB0eSgkbWF0Y2hlc1s3XSkgJiYgZW1wdHkoJG1hdGNoZXNbOF0pKSB7CiRzdGFiaWxpdHlTdWZmaXggLj0gJy1kZXYnOwp9CgokbG93VmVyc2lvbiA9ICR0aGlzLT5ub3JtYWxpemUoc3Vic3RyKCRjb25zdHJhaW50IC4gJHN0YWJpbGl0eVN1ZmZpeCwgMSkpOwokbG93ZXJCb3VuZCA9IG5ldyBDb25zdHJhaW50KCc+PScsICRsb3dWZXJzaW9uKTsKCgoKJGhpZ2hQb3NpdGlvbiA9IG1heCgxLCAkcG9zaXRpb24gLSAxKTsKJGhpZ2hWZXJzaW9uID0gJHRoaXMtPm1hbmlwdWxhdGVWZXJzaW9uU3RyaW5nKCRtYXRjaGVzLCAkaGlnaFBvc2l0aW9uLCAxKSAuICctZGV2JzsKJHVwcGVyQm91bmQgPSBuZXcgQ29uc3RyYWludCgnPCcsICRoaWdoVmVyc2lvbik7CgpyZXR1cm4gYXJyYXkoCiRsb3dlckJvdW5kLAokdXBwZXJCb3VuZCwKKTsKfQoKCgoKCgppZiAocHJlZ19tYXRjaCgne15cXicgLiAkdmVyc2lvblJlZ2V4IC4gJygkKX1pJywgJGNvbnN0cmFpbnQsICRtYXRjaGVzKSkgewoKaWYgKCcwJyAhPT0gJG1hdGNoZXNbMV0gfHwgJycgPT09ICRtYXRjaGVzWzJdIHx8IG51bGwgPT09ICRtYXRjaGVzWzJdKSB7CiRwb3NpdGlvbiA9IDE7Cn0gZWxzZWlmICgnMCcgIT09ICRtYXRjaGVzWzJdIHx8ICcnID09PSAkbWF0Y2hlc1szXSB8fCBudWxsID09PSAkbWF0Y2hlc1szXSkgewokcG9zaXRpb24gPSAyOwp9IGVsc2UgewokcG9zaXRpb24gPSAzOwp9CgoKJHN0YWJpbGl0eVN1ZmZpeCA9ICcnOwppZiAoZW1wdHkoJG1hdGNoZXNbNV0pICYmIGVtcHR5KCRtYXRjaGVzWzddKSAmJiBlbXB0eSgkbWF0Y2hlc1s4XSkpIHsKJHN0YWJpbGl0eVN1ZmZpeCAuPSAnLWRldic7Cn0KCiRsb3dWZXJzaW9uID0gJHRoaXMtPm5vcm1hbGl6ZShzdWJzdHIoJGNvbnN0cmFpbnQgLiAkc3RhYmlsaXR5U3VmZml4LCAxKSk7CiRsb3dlckJvdW5kID0gbmV3IENvbnN0cmFpbnQoJz49JywgJGxvd1ZlcnNpb24pOwoKCgokaGlnaFZlcnNpb24gPSAkdGhpcy0+bWFuaXB1bGF0ZVZlcnNpb25TdHJpbmcoJG1hdGNoZXMsICRwb3NpdGlvbiwgMSkgLiAnLWRldic7CiR1cHBlckJvdW5kID0gbmV3IENvbnN0cmFpbnQoJzwnLCAkaGlnaFZlcnNpb24pOwoKcmV0dXJuIGFycmF5KAokbG93ZXJCb3VuZCwKJHVwcGVyQm91bmQsCik7Cn0KCgoKCgppZiAocHJlZ19tYXRjaCgne152PyhcZCsrKSg/OlwuKFxkKyspKT8oPzpcLihcZCsrKSk/KD86XC5beFgqXSkrKyR9JywgJGNvbnN0cmFpbnQsICRtYXRjaGVzKSkgewppZiAoaXNzZXQoJG1hdGNoZXNbM10pICYmICcnICE9PSAkbWF0Y2hlc1szXSAmJiBudWxsICE9PSAkbWF0Y2hlc1szXSkgewokcG9zaXRpb24gPSAzOwp9IGVsc2VpZiAoaXNzZXQoJG1hdGNoZXNbMl0pICYmICcnICE9PSAkbWF0Y2hlc1syXSAmJiBudWxsICE9PSAkbWF0Y2hlc1syXSkgewokcG9zaXRpb24gPSAyOwp9IGVsc2UgewokcG9zaXRpb24gPSAxOwp9CgokbG93VmVyc2lvbiA9ICR0aGlzLT5tYW5pcHVsYXRlVmVyc2lvblN0cmluZygkbWF0Y2hlcywgJHBvc2l0aW9uKSAuICctZGV2JzsKJGhpZ2hWZXJzaW9uID0gJHRoaXMtPm1hbmlwdWxhdGVWZXJzaW9uU3RyaW5nKCRtYXRjaGVzLCAkcG9zaXRpb24sIDEpIC4gJy1kZXYnOwoKaWYgKCRsb3dWZXJzaW9uID09PSAnMC4wLjAuMC1kZXYnKSB7CnJldHVybiBhcnJheShuZXcgQ29uc3RyYWludCgnPCcsICRoaWdoVmVyc2lvbikpOwp9CgpyZXR1cm4gYXJyYXkoCm5ldyBDb25zdHJhaW50KCc+PScsICRsb3dWZXJzaW9uKSwKbmV3IENvbnN0cmFpbnQoJzwnLCAkaGlnaFZlcnNpb24pLAopOwp9CgoKCgoKCgppZiAocHJlZ19tYXRjaCgne14oP1A8ZnJvbT4nIC4gJHZlcnNpb25SZWdleCAuICcpICstICsoP1A8dG8+JyAuICR2ZXJzaW9uUmVnZXggLiAnKSgkKX1pJywgJGNvbnN0cmFpbnQsICRtYXRjaGVzKSkgewoKJGxvd1N0YWJpbGl0eVN1ZmZpeCA9ICcnOwppZiAoZW1wdHkoJG1hdGNoZXNbNl0pICYmIGVtcHR5KCRtYXRjaGVzWzhdKSAmJiBlbXB0eSgkbWF0Y2hlc1s5XSkpIHsKJGxvd1N0YWJpbGl0eVN1ZmZpeCA9ICctZGV2JzsKfQoKJGxvd1ZlcnNpb24gPSAkdGhpcy0+bm9ybWFsaXplKCRtYXRjaGVzWydmcm9tJ10pOwokbG93ZXJCb3VuZCA9IG5ldyBDb25zdHJhaW50KCc+PScsICRsb3dWZXJzaW9uIC4gJGxvd1N0YWJpbGl0eVN1ZmZpeCk7CgokZW1wdHkgPSBmdW5jdGlvbiAoJHgpIHsKcmV0dXJuICgkeCA9PT0gMCB8fCAkeCA9PT0gJzAnKSA/IGZhbHNlIDogZW1wdHkoJHgpOwp9OwoKaWYgKCghJGVtcHR5KCRtYXRjaGVzWzEyXSkgJiYgISRlbXB0eSgkbWF0Y2hlc1sxM10pKSB8fCAhZW1wdHkoJG1hdGNoZXNbMTVdKSB8fCAhZW1wdHkoJG1hdGNoZXNbMTddKSB8fCAhZW1wdHkoJG1hdGNoZXNbMThdKSkgewokaGlnaFZlcnNpb24gPSAkdGhpcy0+bm9ybWFsaXplKCRtYXRjaGVzWyd0byddKTsKJHVwcGVyQm91bmQgPSBuZXcgQ29uc3RyYWludCgnPD0nLCAkaGlnaFZlcnNpb24pOwp9IGVsc2UgewokaGlnaE1hdGNoID0gYXJyYXkoJycsICRtYXRjaGVzWzExXSwgJG1hdGNoZXNbMTJdLCAkbWF0Y2hlc1sxM10sICRtYXRjaGVzWzE0XSk7CgoKJHRoaXMtPm5vcm1hbGl6ZSgkbWF0Y2hlc1sndG8nXSk7CgokaGlnaFZlcnNpb24gPSAkdGhpcy0+bWFuaXB1bGF0ZVZlcnNpb25TdHJpbmcoJGhpZ2hNYXRjaCwgJGVtcHR5KCRtYXRjaGVzWzEyXSkgPyAxIDogMiwgMSkgLiAnLWRldic7CiR1cHBlckJvdW5kID0gbmV3IENvbnN0cmFpbnQoJzwnLCAkaGlnaFZlcnNpb24pOwp9CgpyZXR1cm4gYXJyYXkoCiRsb3dlckJvdW5kLAokdXBwZXJCb3VuZCwKKTsKfQoKCmlmIChwcmVnX21hdGNoKCd7Xig8PnwhPXw+PT98PD0/fD09Pyk/XHMqKC4qKX0nLCAkY29uc3RyYWludCwgJG1hdGNoZXMpKSB7CnRyeSB7CnRyeSB7CiR2ZXJzaW9uID0gJHRoaXMtPm5vcm1hbGl6ZSgkbWF0Y2hlc1syXSk7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKCgppZiAoc3Vic3RyKCRtYXRjaGVzWzJdLCAtNCkgPT09ICctZGV2JyAmJiBwcmVnX21hdGNoKCd7XlswLTlhLXpBLVotLi9dKyR9JywgJG1hdGNoZXNbMl0pKSB7CiR2ZXJzaW9uID0gJHRoaXMtPm5vcm1hbGl6ZSgnZGV2LScuc3Vic3RyKCRtYXRjaGVzWzJdLCAwLCAtNCkpOwp9IGVsc2Ugewp0aHJvdyAkZTsKfQp9Cgokb3AgPSAkbWF0Y2hlc1sxXSA/OiAnPSc7CgppZiAoJG9wICE9PSAnPT0nICYmICRvcCAhPT0gJz0nICYmICFlbXB0eSgkc3RhYmlsaXR5TW9kaWZpZXIpICYmIHNlbGY6OnBhcnNlU3RhYmlsaXR5KCR2ZXJzaW9uKSA9PT0gJ3N0YWJsZScpIHsKJHZlcnNpb24gLj0gJy0nIC4gJHN0YWJpbGl0eU1vZGlmaWVyOwp9IGVsc2VpZiAoJzwnID09PSAkb3AgfHwgJz49JyA9PT0gJG9wKSB7CmlmICghcHJlZ19tYXRjaCgnLy0nIC4gc2VsZjo6JG1vZGlmaWVyUmVnZXggLiAnJC8nLCBzdHJ0b2xvd2VyKCRtYXRjaGVzWzJdKSkpIHsKaWYgKHN0cnBvcygkbWF0Y2hlc1syXSwgJ2Rldi0nKSAhPT0gMCkgewokdmVyc2lvbiAuPSAnLWRldic7Cn0KfQp9CgpyZXR1cm4gYXJyYXkobmV3IENvbnN0cmFpbnQoJG1hdGNoZXNbMV0gPzogJz0nLCAkdmVyc2lvbikpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KfQoKJG1lc3NhZ2UgPSAnQ291bGQgbm90IHBhcnNlIHZlcnNpb24gY29uc3RyYWludCAnIC4gJGNvbnN0cmFpbnQ7CmlmIChpc3NldCgkZSkpIHsKJG1lc3NhZ2UgLj0gJzogJyAuICRlLT5nZXRNZXNzYWdlKCk7Cn0KCnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCRtZXNzYWdlKTsKfQoKCgoKCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1hbmlwdWxhdGVWZXJzaW9uU3RyaW5nKGFycmF5ICRtYXRjaGVzLCAkcG9zaXRpb24sICRpbmNyZW1lbnQgPSAwLCAkcGFkID0gJzAnKQp7CmZvciAoJGkgPSA0OyAkaSA+IDA7IC0tJGkpIHsKaWYgKCRpID4gJHBvc2l0aW9uKSB7CiRtYXRjaGVzWyRpXSA9ICRwYWQ7Cn0gZWxzZWlmICgkaSA9PT0gJHBvc2l0aW9uICYmICRpbmNyZW1lbnQpIHsKJG1hdGNoZXNbJGldICs9ICRpbmNyZW1lbnQ7CgppZiAoJG1hdGNoZXNbJGldIDwgMCkgewokbWF0Y2hlc1skaV0gPSAkcGFkOwotLSRwb3NpdGlvbjsKCgppZiAoJGkgPT09IDEpIHsKcmV0dXJuIG51bGw7Cn0KfQp9Cn0KCnJldHVybiAkbWF0Y2hlc1sxXSAuICcuJyAuICRtYXRjaGVzWzJdIC4gJy4nIC4gJG1hdGNoZXNbM10gLiAnLicgLiAkbWF0Y2hlc1s0XTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXhwYW5kU3RhYmlsaXR5KCRzdGFiaWxpdHkpCnsKJHN0YWJpbGl0eSA9IHN0cnRvbG93ZXIoJHN0YWJpbGl0eSk7Cgpzd2l0Y2ggKCRzdGFiaWxpdHkpIHsKY2FzZSAnYSc6CnJldHVybiAnYWxwaGEnOwpjYXNlICdiJzoKcmV0dXJuICdiZXRhJzsKY2FzZSAncCc6CmNhc2UgJ3BsJzoKcmV0dXJuICdwYXRjaCc7CmNhc2UgJ3JjJzoKcmV0dXJuICdSQyc7CmRlZmF1bHQ6CnJldHVybiAkc3RhYmlsaXR5Owp9Cn0KfQoKQ29weXJpZ2h0IChDKSAyMDE1IENvbXBvc2VyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCnNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgoKewogICAgIjM4OS1leGNlcHRpb24iOiBbCiAgICAgICAgIjM4OSBEaXJlY3RvcnkgU2VydmVyIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiQXN0ZXJpc2stZXhjZXB0aW9uIjogWwogICAgICAgICJBc3RlcmlzayBleGNlcHRpb24iCiAgICBdLAogICAgIkFzdGVyaXNrLWxpbmtpbmctcHJvdG9jb2xzLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiQXN0ZXJpc2sgbGlua2luZyBwcm90b2NvbHMgZXhjZXB0aW9uIgogICAgXSwKICAgICJBdXRvY29uZi1leGNlcHRpb24tMi4wIjogWwogICAgICAgICJBdXRvY29uZiBleGNlcHRpb24gMi4wIgogICAgXSwKICAgICJBdXRvY29uZi1leGNlcHRpb24tMy4wIjogWwogICAgICAgICJBdXRvY29uZiBleGNlcHRpb24gMy4wIgogICAgXSwKICAgICJBdXRvY29uZi1leGNlcHRpb24tZ2VuZXJpYyI6IFsKICAgICAgICAiQXV0b2NvbmYgZ2VuZXJpYyBleGNlcHRpb24iCiAgICBdLAogICAgIkF1dG9jb25mLWV4Y2VwdGlvbi1nZW5lcmljLTMuMCI6IFsKICAgICAgICAiQXV0b2NvbmYgZ2VuZXJpYyBleGNlcHRpb24gZm9yIEdQTC0zLjAiCiAgICBdLAogICAgIkF1dG9jb25mLWV4Y2VwdGlvbi1tYWNybyI6IFsKICAgICAgICAiQXV0b2NvbmYgbWFjcm8gZXhjZXB0aW9uIgogICAgXSwKICAgICJCaXNvbi1leGNlcHRpb24tMS4yNCI6IFsKICAgICAgICAiQmlzb24gZXhjZXB0aW9uIDEuMjQiCiAgICBdLAogICAgIkJpc29uLWV4Y2VwdGlvbi0yLjIiOiBbCiAgICAgICAgIkJpc29uIGV4Y2VwdGlvbiAyLjIiCiAgICBdLAogICAgIkJvb3Rsb2FkZXItZXhjZXB0aW9uIjogWwogICAgICAgICJCb290bG9hZGVyIERpc3RyaWJ1dGlvbiBFeGNlcHRpb24iCiAgICBdLAogICAgIkNHQUwtbGlua2luZy1leGNlcHRpb24iOiBbCiAgICAgICAgIkNHQUwgTGlua2luZyBFeGNlcHRpb24iCiAgICBdLAogICAgIkNsYXNzcGF0aC1leGNlcHRpb24tMi4wIjogWwogICAgICAgICJDbGFzc3BhdGggZXhjZXB0aW9uIDIuMCIKICAgIF0sCiAgICAiQ0xJU1AtZXhjZXB0aW9uLTIuMCI6IFsKICAgICAgICAiQ0xJU1AgZXhjZXB0aW9uIDIuMCIKICAgIF0sCiAgICAiY3J5cHRzZXR1cC1PcGVuU1NMLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiY3J5cHRzZXR1cCBPcGVuU1NMIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiRGlnaWEtUXQtTEdQTC1leGNlcHRpb24tMS4xIjogWwogICAgICAgICJEaWdpYSBRdCBMR1BMIEV4Y2VwdGlvbiB2ZXJzaW9uIDEuMSIKICAgIF0sCiAgICAiRGlnaVJ1bGUtRk9TUy1leGNlcHRpb24iOiBbCiAgICAgICAgIkRpZ2lSdWxlIEZPU1MgTGljZW5zZSBFeGNlcHRpb24iCiAgICBdLAogICAgImVDb3MtZXhjZXB0aW9uLTIuMCI6IFsKICAgICAgICAiZUNvcyBleGNlcHRpb24gMi4wIgogICAgXSwKICAgICJlcmxhbmctb3RwLWxpbmtpbmctZXhjZXB0aW9uIjogWwogICAgICAgICJFcmxhbmcvT1RQIExpbmtpbmcgRXhjZXB0aW9uIgogICAgXSwKICAgICJGYXdrZXMtUnVudGltZS1leGNlcHRpb24iOiBbCiAgICAgICAgIkZhd2tlcyBSdW50aW1lIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiRkxUSy1leGNlcHRpb24iOiBbCiAgICAgICAgIkZMVEsgZXhjZXB0aW9uIgogICAgXSwKICAgICJmbXQtZXhjZXB0aW9uIjogWwogICAgICAgICJmbXQgZXhjZXB0aW9uIgogICAgXSwKICAgICJGb250LWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgIkZvbnQgZXhjZXB0aW9uIDIuMCIKICAgIF0sCiAgICAiZnJlZXJ0b3MtZXhjZXB0aW9uLTIuMCI6IFsKICAgICAgICAiRnJlZVJUT1MgRXhjZXB0aW9uIDIuMCIKICAgIF0sCiAgICAiR0NDLWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgIkdDQyBSdW50aW1lIExpYnJhcnkgZXhjZXB0aW9uIDIuMCIKICAgIF0sCiAgICAiR0NDLWV4Y2VwdGlvbi0yLjAtbm90ZSI6IFsKICAgICAgICAiR0NDICAgIFJ1bnRpbWUgTGlicmFyeSBleGNlcHRpb24gMi4wIC0gbm90ZSB2YXJpYW50IgogICAgXSwKICAgICJHQ0MtZXhjZXB0aW9uLTMuMSI6IFsKICAgICAgICAiR0NDIFJ1bnRpbWUgTGlicmFyeSBleGNlcHRpb24gMy4xIgogICAgXSwKICAgICJHbXNoLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR21zaCBleGNlcHRpb24iCiAgICBdLAogICAgIkdOQVQtZXhjZXB0aW9uIjogWwogICAgICAgICJHTkFUIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiR05PTUUtZXhhbXBsZXMtZXhjZXB0aW9uIjogWwogICAgICAgICJHTk9NRSBleGFtcGxlcyBleGNlcHRpb24iCiAgICBdLAogICAgIkdOVS1jb21waWxlci1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOVSBDb21waWxlciBFeGNlcHRpb24iCiAgICBdLAogICAgImdudS1qYXZhbWFpbC1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOVSBKYXZhTWFpbCBleGNlcHRpb24iCiAgICBdLAogICAgIkdQTC0zLjAtMzg5LWRzLWJhc2UtZXhjZXB0aW9uIjogWwogICAgICAgICJHUEwtMy4wIDM4OSBEUyBCYXNlIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiR1BMLTMuMC1pbnRlcmZhY2UtZXhjZXB0aW9uIjogWwogICAgICAgICJHUEwtMy4wIEludGVyZmFjZSBFeGNlcHRpb24iCiAgICBdLAogICAgIkdQTC0zLjAtbGlua2luZy1leGNlcHRpb24iOiBbCiAgICAgICAgIkdQTC0zLjAgTGlua2luZyBFeGNlcHRpb24iCiAgICBdLAogICAgIkdQTC0zLjAtbGlua2luZy1zb3VyY2UtZXhjZXB0aW9uIjogWwogICAgICAgICJHUEwtMy4wIExpbmtpbmcgRXhjZXB0aW9uICh3aXRoIENvcnJlc3BvbmRpbmcgU291cmNlKSIKICAgIF0sCiAgICAiR1BMLUNDLTEuMCI6IFsKICAgICAgICAiR1BMIENvb3BlcmF0aW9uIENvbW1pdG1lbnQgMS4wIgogICAgXSwKICAgICJHU3RyZWFtZXItZXhjZXB0aW9uLTIwMDUiOiBbCiAgICAgICAgIkdTdHJlYW1lciBFeGNlcHRpb24gKDIwMDUpIgogICAgXSwKICAgICJHU3RyZWFtZXItZXhjZXB0aW9uLTIwMDgiOiBbCiAgICAgICAgIkdTdHJlYW1lciBFeGNlcHRpb24gKDIwMDgpIgogICAgXSwKICAgICJoYXJib3VyLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiaGFyYm91ciBleGNlcHRpb24iCiAgICBdLAogICAgImkycC1ncGwtamF2YS1leGNlcHRpb24iOiBbCiAgICAgICAgImkycCBHUEwrSmF2YSBFeGNlcHRpb24iCiAgICBdLAogICAgIkluZGVwZW5kZW50LW1vZHVsZXMtZXhjZXB0aW9uIjogWwogICAgICAgICJJbmRlcGVuZGVudCBNb2R1bGUgTGlua2luZyBleGNlcHRpb24iCiAgICBdLAogICAgIktpQ2FkLWxpYnJhcmllcy1leGNlcHRpb24iOiBbCiAgICAgICAgIktpQ2FkIExpYnJhcmllcyBFeGNlcHRpb24iCiAgICBdLAogICAgIkxHUEwtMy4wLWxpbmtpbmctZXhjZXB0aW9uIjogWwogICAgICAgICJMR1BMLTMuMCBMaW5raW5nIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAibGlicHJpLU9wZW5IMzIzLWV4Y2VwdGlvbiI6IFsKICAgICAgICAibGlicHJpIE9wZW5IMzIzIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiTGlidG9vbC1leGNlcHRpb24iOiBbCiAgICAgICAgIkxpYnRvb2wgRXhjZXB0aW9uIgogICAgXSwKICAgICJMaW51eC1zeXNjYWxsLW5vdGUiOiBbCiAgICAgICAgIkxpbnV4IFN5c2NhbGwgTm90ZSIKICAgIF0sCiAgICAiTExHUEwiOiBbCiAgICAgICAgIkxMR1BMIFByZWFtYmxlIgogICAgXSwKICAgICJMTFZNLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiTExWTSBFeGNlcHRpb24iCiAgICBdLAogICAgIkxaTUEtZXhjZXB0aW9uIjogWwogICAgICAgICJMWk1BIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAibWlmLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiTWFjcm9zIGFuZCBJbmxpbmUgRnVuY3Rpb25zIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAibXhtbC1leGNlcHRpb24iOiBbCiAgICAgICAgIm14bWwgRXhjZXB0aW9uIgogICAgXSwKICAgICJOb2tpYS1RdC1leGNlcHRpb24tMS4xIjogWwogICAgICAgICJOb2tpYSBRdCBMR1BMIGV4Y2VwdGlvbiAxLjEiCiAgICBdLAogICAgIk9DYW1sLUxHUEwtbGlua2luZy1leGNlcHRpb24iOiBbCiAgICAgICAgIk9DYW1sIExHUEwgTGlua2luZyBFeGNlcHRpb24iCiAgICBdLAogICAgIk9DQ1QtZXhjZXB0aW9uLTEuMCI6IFsKICAgICAgICAiT3BlbiBDQVNDQURFIEV4Y2VwdGlvbiAxLjAiCiAgICBdLAogICAgIk9wZW5KREstYXNzZW1ibHktZXhjZXB0aW9uLTEuMCI6IFsKICAgICAgICAiT3BlbkpESyBBc3NlbWJseSBleGNlcHRpb24gMS4wIgogICAgXSwKICAgICJvcGVudnBuLW9wZW5zc2wtZXhjZXB0aW9uIjogWwogICAgICAgICJPcGVuVlBOIE9wZW5TU0wgRXhjZXB0aW9uIgogICAgXSwKICAgICJQQ1JFMi1leGNlcHRpb24iOiBbCiAgICAgICAgIlBDUkUyIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAicG9seXBhcnNlLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiUG9seXBhcnNlIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiUFMtb3ItUERGLWZvbnQtZXhjZXB0aW9uLTIwMTcwODE3IjogWwogICAgICAgICJQUy9QREYgZm9udCBleGNlcHRpb24gKDIwMTctMDgtMTcpIgogICAgXSwKICAgICJRUEwtMS4wLUlOUklBLTIwMDQtZXhjZXB0aW9uIjogWwogICAgICAgICJJTlJJQSBRUEwgMS4wIDIwMDQgdmFyaWFudCBleGNlcHRpb24iCiAgICBdLAogICAgIlF0LUdQTC1leGNlcHRpb24tMS4wIjogWwogICAgICAgICJRdCBHUEwgZXhjZXB0aW9uIDEuMCIKICAgIF0sCiAgICAiUXQtTEdQTC1leGNlcHRpb24tMS4xIjogWwogICAgICAgICJRdCBMR1BMIGV4Y2VwdGlvbiAxLjEiCiAgICBdLAogICAgIlF3dC1leGNlcHRpb24tMS4wIjogWwogICAgICAgICJRd3QgZXhjZXB0aW9uIDEuMCIKICAgIF0sCiAgICAicm9taWMtZXhjZXB0aW9uIjogWwogICAgICAgICJSb21pYyBFeGNlcHRpb24iCiAgICBdLAogICAgIlJSRHRvb2wtRkxPU1MtZXhjZXB0aW9uLTIuMCI6IFsKICAgICAgICAiUlJEdG9vbCBGTE9TUyBleGNlcHRpb24gMi4wIgogICAgXSwKICAgICJTQU5FLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiU0FORSBFeGNlcHRpb24iCiAgICBdLAogICAgIlNITC0yLjAiOiBbCiAgICAgICAgIlNvbGRlcnBhZCBIYXJkd2FyZSBMaWNlbnNlIHYyLjAiCiAgICBdLAogICAgIlNITC0yLjEiOiBbCiAgICAgICAgIlNvbGRlcnBhZCBIYXJkd2FyZSBMaWNlbnNlIHYyLjEiCiAgICBdLAogICAgInN0dW5uZWwtZXhjZXB0aW9uIjogWwogICAgICAgICJzdHVubmVsIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiU1dJLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiU1dJIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiU3dpZnQtZXhjZXB0aW9uIjogWwogICAgICAgICJTd2lmdCBFeGNlcHRpb24iCiAgICBdLAogICAgIlRleGluZm8tZXhjZXB0aW9uIjogWwogICAgICAgICJUZXhpbmZvIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAidS1ib290LWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgIlUtQm9vdCBleGNlcHRpb24gMi4wIgogICAgXSwKICAgICJVQkRMLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiVW5tb2RpZmllZCBCaW5hcnkgRGlzdHJpYnV0aW9uIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiVW5pdmVyc2FsLUZPU1MtZXhjZXB0aW9uLTEuMCI6IFsKICAgICAgICAiVW5pdmVyc2FsIEZPU1MgRXhjZXB0aW9uLCBWZXJzaW9uIDEuMCIKICAgIF0sCiAgICAidnNmdHBkLW9wZW5zc2wtZXhjZXB0aW9uIjogWwogICAgICAgICJ2c2Z0cGQgT3BlblNTTCBleGNlcHRpb24iCiAgICBdLAogICAgIld4V2luZG93cy1leGNlcHRpb24tMy4xIjogWwogICAgICAgICJXeFdpbmRvd3MgTGlicmFyeSBFeGNlcHRpb24gMy4xIgogICAgXSwKICAgICJ4MTF2bmMtb3BlbnNzbC1leGNlcHRpb24iOiBbCiAgICAgICAgIngxMXZuYyBPcGVuU1NMIEV4Y2VwdGlvbiIKICAgIF0KfXsKICAgICIwQlNEIjogWwogICAgICAgICJCU0QgWmVybyBDbGF1c2UgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICIzRC1TbGljZXItMS4wIjogWwogICAgICAgICIzRCBTbGljZXIgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBQUwiOiBbCiAgICAgICAgIkF0dHJpYnV0aW9uIEFzc3VyYW5jZSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFic3R5bGVzIjogWwogICAgICAgICJBYnN0eWxlcyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBZGFDb3JlLWRvYyI6IFsKICAgICAgICAiQWRhQ29yZSBEb2MgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQWRvYmUtMjAwNiI6IFsKICAgICAgICAiQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgU291cmNlIENvZGUgTGljZW5zZSBBZ3JlZW1lbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFkb2JlLURpc3BsYXktUG9zdFNjcmlwdCI6IFsKICAgICAgICAiQWRvYmUgRGlzcGxheSBQb3N0U2NyaXB0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFkb2JlLUdseXBoIjogWwogICAgICAgICJBZG9iZSBHbHlwaCBMaXN0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFkb2JlLVV0b3BpYSI6IFsKICAgICAgICAiQWRvYmUgVXRvcGlhIEZvbnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQURTTCI6IFsKICAgICAgICAiQW1hem9uIERpZ2l0YWwgU2VydmljZXMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQUZMLTEuMSI6IFsKICAgICAgICAiQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHYxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQUZMLTEuMiI6IFsKICAgICAgICAiQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHYxLjIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQUZMLTIuMCI6IFsKICAgICAgICAiQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHYyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQUZMLTIuMSI6IFsKICAgICAgICAiQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHYyLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQUZMLTMuMCI6IFsKICAgICAgICAiQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHYzLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQWZtcGFyc2UiOiBbCiAgICAgICAgIkFmbXBhcnNlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFHUEwtMS4wIjogWwogICAgICAgICJBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkFHUEwtMS4wLW9ubHkiOiBbCiAgICAgICAgIkFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYxLjAgb25seSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQUdQTC0xLjAtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYxLjAgb3IgbGF0ZXIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFHUEwtMy4wIjogWwogICAgICAgICJHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkFHUEwtMy4wLW9ubHkiOiBbCiAgICAgICAgIkdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQUdQTC0zLjAtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9yIGxhdGVyIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFsYWRkaW4iOiBbCiAgICAgICAgIkFsYWRkaW4gRnJlZSBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU1ELW5ld2xpYiI6IFsKICAgICAgICAiQU1EIG5ld2xpYiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBTURQTFBBIjogWwogICAgICAgICJBTUQncyBwbHBhX21hcC5jIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFNTCI6IFsKICAgICAgICAiQXBwbGUgTUlUIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFNTC1nbHNsYW5nIjogWwogICAgICAgICJBTUwgZ2xzbGFuZyB2YXJpYW50IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFNUEFTIjogWwogICAgICAgICJBY2FkZW15IG9mIE1vdGlvbiBQaWN0dXJlIEFydHMgYW5kIFNjaWVuY2VzIEJTRCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU5UTFItUEQiOiBbCiAgICAgICAgIkFOVExSIFNvZnR3YXJlIFJpZ2h0cyBOb3RpY2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFOVExSLVBELWZhbGxiYWNrIjogWwogICAgICAgICJBTlRMUiBTb2Z0d2FyZSBSaWdodHMgTm90aWNlIHdpdGggbGljZW5zZSBmYWxsYmFjayIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiYW55LU9TSSI6IFsKICAgICAgICAiQW55IE9TSSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJhbnktT1NJLXBlcmwtbW9kdWxlcyI6IFsKICAgICAgICAiQW55IE9TSSBMaWNlbnNlIC0gUGVybCBNb2R1bGVzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcGFjaGUtMS4wIjogWwogICAgICAgICJBcGFjaGUgTGljZW5zZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFwYWNoZS0xLjEiOiBbCiAgICAgICAgIkFwYWNoZSBMaWNlbnNlIDEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcGFjaGUtMi4wIjogWwogICAgICAgICJBcGFjaGUgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQVBBRk1MIjogWwogICAgICAgICJBZG9iZSBQb3N0c2NyaXB0IEFGTSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBUEwtMS4wIjogWwogICAgICAgICJBZGFwdGl2ZSBQdWJsaWMgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXBwLXMycCI6IFsKICAgICAgICAiQXBwOjpzMnAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQVBTTC0xLjAiOiBbCiAgICAgICAgIkFwcGxlIFB1YmxpYyBTb3VyY2UgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQVBTTC0xLjEiOiBbCiAgICAgICAgIkFwcGxlIFB1YmxpYyBTb3VyY2UgTGljZW5zZSAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQVBTTC0xLjIiOiBbCiAgICAgICAgIkFwcGxlIFB1YmxpYyBTb3VyY2UgTGljZW5zZSAxLjIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQVBTTC0yLjAiOiBbCiAgICAgICAgIkFwcGxlIFB1YmxpYyBTb3VyY2UgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXJwaGljLTE5OTkiOiBbCiAgICAgICAgIkFycGhpYyBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXJ0aXN0aWMtMS4wIjogWwogICAgICAgICJBcnRpc3RpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcnRpc3RpYy0xLjAtY2w4IjogWwogICAgICAgICJBcnRpc3RpYyBMaWNlbnNlIDEuMCB3L2NsYXVzZSA4IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFydGlzdGljLTEuMC1QZXJsIjogWwogICAgICAgICJBcnRpc3RpYyBMaWNlbnNlIDEuMCAoUGVybCkiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXJ0aXN0aWMtMi4wIjogWwogICAgICAgICJBcnRpc3RpYyBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcnRpc3RpYy1kaXN0IjogWwogICAgICAgICJBcnRpc3RpYyBMaWNlbnNlIDEuMCAoZGlzdCkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFTV0YtRGlnaXRhbC1Bc3NldHMtMS4wIjogWwogICAgICAgICJBU1dGIERpZ2l0YWwgQXNzZXRzIExpY2Vuc2UgdmVyc2lvbiAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFTV0YtRGlnaXRhbC1Bc3NldHMtMS4xIjogWwogICAgICAgICJBU1dGIERpZ2l0YWwgQXNzZXRzIExpY2Vuc2UgMS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCYWVrbXVrIjogWwogICAgICAgICJCYWVrbXVrIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJhaHlwaCI6IFsKICAgICAgICAiQmFoeXBoIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJhcnIiOiBbCiAgICAgICAgIkJhcnIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiYmNyeXB0LVNvbGFyLURlc2lnbmVyIjogWwogICAgICAgICJiY3J5cHQgU29sYXIgRGVzaWduZXIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQmVlcndhcmUiOiBbCiAgICAgICAgIkJlZXJ3YXJlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJpdHN0cmVhbS1DaGFydGVyIjogWwogICAgICAgICJCaXRzdHJlYW0gQ2hhcnRlciBGb250IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJpdHN0cmVhbS1WZXJhIjogWwogICAgICAgICJCaXRzdHJlYW0gVmVyYSBGb250IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJpdFRvcnJlbnQtMS4wIjogWwogICAgICAgICJCaXRUb3JyZW50IE9wZW4gU291cmNlIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQml0VG9ycmVudC0xLjEiOiBbCiAgICAgICAgIkJpdFRvcnJlbnQgT3BlbiBTb3VyY2UgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJibGVzc2luZyI6IFsKICAgICAgICAiU1FMaXRlIEJsZXNzaW5nIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCbHVlT2FrLTEuMC4wIjogWwogICAgICAgICJCbHVlIE9hayBNb2RlbCBMaWNlbnNlIDEuMC4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJvZWhtLUdDIjogWwogICAgICAgICJCb2VobS1EZW1lcnMtV2Vpc2VyIEdDIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJvZWhtLUdDLXdpdGhvdXQtZmVlIjogWwogICAgICAgICJCb2VobS1EZW1lcnMtV2Vpc2VyIEdDIExpY2Vuc2UgKHdpdGhvdXQgZmVlKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQm9yY2V1eCI6IFsKICAgICAgICAiQm9yY2V1eCBsaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCcmlhbi1HbGFkbWFuLTItQ2xhdXNlIjogWwogICAgICAgICJCcmlhbiBHbGFkbWFuIDItQ2xhdXNlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJyaWFuLUdsYWRtYW4tMy1DbGF1c2UiOiBbCiAgICAgICAgIkJyaWFuIEdsYWRtYW4gMy1DbGF1c2UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTEtQ2xhdXNlIjogWwogICAgICAgICJCU0QgMS1DbGF1c2UgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMi1DbGF1c2UiOiBbCiAgICAgICAgIkJTRCAyLUNsYXVzZSBcIlNpbXBsaWZpZWRcIiBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0yLUNsYXVzZS1EYXJ3aW4iOiBbCiAgICAgICAgIkJTRCAyLUNsYXVzZSAtIElhbiBEYXJ3aW4gdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTItQ2xhdXNlLWZpcnN0LWxpbmVzIjogWwogICAgICAgICJCU0QgMi1DbGF1c2UgLSBmaXJzdCBsaW5lcyByZXF1aXJlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTItQ2xhdXNlLUZyZWVCU0QiOiBbCiAgICAgICAgIkJTRCAyLUNsYXVzZSBGcmVlQlNEIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiQlNELTItQ2xhdXNlLU5ldEJTRCI6IFsKICAgICAgICAiQlNEIDItQ2xhdXNlIE5ldEJTRCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkJTRC0yLUNsYXVzZS1QYXRlbnQiOiBbCiAgICAgICAgIkJTRC0yLUNsYXVzZSBQbHVzIFBhdGVudCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0yLUNsYXVzZS1wa2djb25mLWRpc2NsYWltZXIiOiBbCiAgICAgICAgIkJTRCAyLUNsYXVzZSBwa2djb25mIGRpc2NsYWltZXIgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTItQ2xhdXNlLVZpZXdzIjogWwogICAgICAgICJCU0QgMi1DbGF1c2Ugd2l0aCB2aWV3cyBzZW50ZW5jZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlIjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgXCJOZXdcIiBvciBcIlJldmlzZWRcIiBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1hY3BpY2EiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBhY3BpY2EgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLUF0dHJpYnV0aW9uIjogWwogICAgICAgICJCU0Qgd2l0aCBhdHRyaWJ1dGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLUNsZWFyIjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgQ2xlYXIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLWZsZXgiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBGbGV4IHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1IUCI6IFsKICAgICAgICAiSGV3bGV0dC1QYWNrYXJkIEJTRCB2YXJpYW50IGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1MQk5MIjogWwogICAgICAgICJMYXdyZW5jZSBCZXJrZWxleSBOYXRpb25hbCBMYWJzIEJTRCB2YXJpYW50IGxpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLU1vZGlmaWNhdGlvbiI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIE1vZGlmaWNhdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLU5vLU1pbGl0YXJ5LUxpY2Vuc2UiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBObyBNaWxpdGFyeSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtTm8tTnVjbGVhci1MaWNlbnNlIjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgTm8gTnVjbGVhciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtTm8tTnVjbGVhci1MaWNlbnNlLTIwMTQiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBObyBOdWNsZWFyIExpY2Vuc2UgMjAxNCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLU5vLU51Y2xlYXItV2FycmFudHkiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBObyBOdWNsZWFyIFdhcnJhbnR5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtT3Blbi1NUEkiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBPcGVuIE1QSSB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtU3VuIjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgU3VuIE1pY3Jvc3lzdGVtcyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTQtQ2xhdXNlIjogWwogICAgICAgICJCU0QgNC1DbGF1c2UgXCJPcmlnaW5hbFwiIG9yIFwiT2xkXCIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTQtQ2xhdXNlLVNob3J0ZW5lZCI6IFsKICAgICAgICAiQlNEIDQgQ2xhdXNlIFNob3J0ZW5lZCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTQtQ2xhdXNlLVVDIjogWwogICAgICAgICJCU0QtNC1DbGF1c2UgKFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS1TcGVjaWZpYykiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC00LjNSRU5PIjogWwogICAgICAgICJCU0QgNC4zIFJFTk8gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTQuM1RBSE9FIjogWwogICAgICAgICJCU0QgNC4zIFRBSE9FIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC1BZHZlcnRpc2luZy1BY2tub3dsZWRnZW1lbnQiOiBbCiAgICAgICAgIkJTRCBBZHZlcnRpc2luZyBBY2tub3dsZWRnZW1lbnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELUF0dHJpYnV0aW9uLUhQTkQtZGlzY2xhaW1lciI6IFsKICAgICAgICAiQlNEIHdpdGggQXR0cmlidXRpb24gYW5kIEhQTkQgZGlzY2xhaW1lciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELUluZmVybm8tTmV0dHZlcmsiOiBbCiAgICAgICAgIkJTRC1JbmZlcm5vLU5ldHR2ZXJrIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtUHJvdGVjdGlvbiI6IFsKICAgICAgICAiQlNEIFByb3RlY3Rpb24gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELVNvdXJjZS1iZWdpbm5pbmctZmlsZSI6IFsKICAgICAgICAiQlNEIFNvdXJjZSBDb2RlIEF0dHJpYnV0aW9uIC0gYmVnaW5uaW5nIG9mIGZpbGUgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELVNvdXJjZS1Db2RlIjogWwogICAgICAgICJCU0QgU291cmNlIENvZGUgQXR0cmlidXRpb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC1TeXN0ZW1pY3MiOiBbCiAgICAgICAgIlN5c3RlbWljcyBCU0QgdmFyaWFudCBsaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtU3lzdGVtaWNzLVczV29ya3MiOiBbCiAgICAgICAgIlN5c3RlbWljcyBXM1dvcmtzIEJTRCB2YXJpYW50IGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTTC0xLjAiOiBbCiAgICAgICAgIkJvb3N0IFNvZnR3YXJlIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJVU0wtMS4xIjogWwogICAgICAgICJCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImJ6aXAyLTEuMC41IjogWwogICAgICAgICJiemlwMiBhbmQgbGliYnppcDIgTGljZW5zZSB2MS4wLjUiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiYnppcDItMS4wLjYiOiBbCiAgICAgICAgImJ6aXAyIGFuZCBsaWJiemlwMiBMaWNlbnNlIHYxLjAuNiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQy1VREEtMS4wIjogWwogICAgICAgICJDb21wdXRhdGlvbmFsIFVzZSBvZiBEYXRhIEFncmVlbWVudCB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQUwtMS4wIjogWwogICAgICAgICJDcnlwdG9ncmFwaGljIEF1dG9ub215IExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNBTC0xLjAtQ29tYmluZWQtV29yay1FeGNlcHRpb24iOiBbCiAgICAgICAgIkNyeXB0b2dyYXBoaWMgQXV0b25vbXkgTGljZW5zZSAxLjAgKENvbWJpbmVkIFdvcmsgRXhjZXB0aW9uKSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDYWxkZXJhIjogWwogICAgICAgICJDYWxkZXJhIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNhbGRlcmEtbm8tcHJlYW1ibGUiOiBbCiAgICAgICAgIkNhbGRlcmEgTGljZW5zZSAod2l0aG91dCBwcmVhbWJsZSkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNhdGhhcm9uIjogWwogICAgICAgICJDYXRoYXJvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQVRPU0wtMS4xIjogWwogICAgICAgICJDb21wdXRlciBBc3NvY2lhdGVzIFRydXN0ZWQgT3BlbiBTb3VyY2UgTGljZW5zZSAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDEuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0yLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTIuNSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjUgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMi41LUFVIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNSBBdXN0cmFsaWEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTMuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgVW5wb3J0ZWQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTMuMC1BVCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgQXVzdHJpYSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMy4wLUFVIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBBdXN0cmFsaWEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTMuMC1ERSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgR2VybWFueSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMy4wLUlHTyI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgSUdPIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0zLjAtTkwiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMy4wIE5ldGhlcmxhbmRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0zLjAtVVMiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMy4wIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTQuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiA0LjAgSW50ZXJuYXRpb25hbCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIDEuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy0yLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgMi4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLTIuNSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCAyLjUgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtMy4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIDMuMCBVbnBvcnRlZCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtMy4wLURFIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIDMuMCBHZXJtYW55IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy00LjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgNC4wIEludGVybmF0aW9uYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLU5ELTEuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAxLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtTkQtMi4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIE5vIERlcml2YXRpdmVzIDIuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1ORC0yLjUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgTm8gRGVyaXZhdGl2ZXMgMi41IEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLU5ELTMuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAzLjAgVW5wb3J0ZWQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLU5ELTMuMC1ERSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAzLjAgR2VybWFueSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtTkQtMy4wLUlHTyI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAzLjAgSUdPIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1ORC00LjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgTm8gRGVyaXZhdGl2ZXMgNC4wIEludGVybmF0aW9uYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTEuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBTaGFyZSBBbGlrZSAxLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtMi4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDIuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1TQS0yLjAtREUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgU2hhcmUgQWxpa2UgMi4wIEdlcm1hbnkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTIuMC1GUiI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1Ob25Db21tZXJjaWFsLVNoYXJlQWxpa2UgMi4wIEZyYW5jZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtMi4wLVVLIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDIuMCBFbmdsYW5kIGFuZCBXYWxlcyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtMi41IjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDIuNSBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1TQS0zLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgU2hhcmUgQWxpa2UgMy4wIFVucG9ydGVkIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1TQS0zLjAtREUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgU2hhcmUgQWxpa2UgMy4wIEdlcm1hbnkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTMuMC1JR08iOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgU2hhcmUgQWxpa2UgMy4wIElHTyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtNC4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1ORC0xLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm8gRGVyaXZhdGl2ZXMgMS4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5ELTIuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBObyBEZXJpdmF0aXZlcyAyLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkQtMi41IjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vIERlcml2YXRpdmVzIDIuNSBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1ORC0zLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm8gRGVyaXZhdGl2ZXMgMy4wIFVucG9ydGVkIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1ORC0zLjAtREUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm8gRGVyaXZhdGl2ZXMgMy4wIEdlcm1hbnkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5ELTQuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBObyBEZXJpdmF0aXZlcyA0LjAgSW50ZXJuYXRpb25hbCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktU0EtMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIFNoYXJlIEFsaWtlIDEuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS0yLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgMi4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTIuMC1VSyI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZSAyLjAgRW5nbGFuZCBhbmQgV2FsZXMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTIuMS1KUCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZSAyLjEgSmFwYW4iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTIuNSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZSAyLjUgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktU0EtMy4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIFNoYXJlIEFsaWtlIDMuMCBVbnBvcnRlZCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktU0EtMy4wLUFUIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIFNoYXJlIEFsaWtlIDMuMCBBdXN0cmlhIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS0zLjAtREUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgMy4wIEdlcm1hbnkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTMuMC1JR08iOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSAzLjAgSUdPIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS00LjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgNC4wIEludGVybmF0aW9uYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLVBEREMiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgUHVibGljIERvbWFpbiBEZWRpY2F0aW9uIGFuZCBDZXJ0aWZpY2F0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1QRE0tMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSAgICBDb21tb25zIFB1YmxpYyBEb21haW4gTWFyayAxLjAgVW5pdmVyc2FsIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1TQS0xLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgU2hhcmUgQWxpa2UgMS4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDMC0xLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgWmVybyB2MS4wIFVuaXZlcnNhbCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0RETC0xLjAiOiBbCiAgICAgICAgIkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNEREwtMS4xIjogWwogICAgICAgICJDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIDEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0RMLTEuMCI6IFsKICAgICAgICAiQ29tbW9uIERvY3VtZW50YXRpb24gTGljZW5zZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNETEEtUGVybWlzc2l2ZS0xLjAiOiBbCiAgICAgICAgIkNvbW11bml0eSBEYXRhIExpY2Vuc2UgQWdyZWVtZW50IFBlcm1pc3NpdmUgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRExBLVBlcm1pc3NpdmUtMi4wIjogWwogICAgICAgICJDb21tdW5pdHkgRGF0YSBMaWNlbnNlIEFncmVlbWVudCBQZXJtaXNzaXZlIDIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0RMQS1TaGFyaW5nLTEuMCI6IFsKICAgICAgICAiQ29tbXVuaXR5IERhdGEgTGljZW5zZSBBZ3JlZW1lbnQgU2hhcmluZyAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFQ0lMTC0xLjAiOiBbCiAgICAgICAgIkNlQ0lMTCBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFQ0lMTC0xLjEiOiBbCiAgICAgICAgIkNlQ0lMTCBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFQ0lMTC0yLjAiOiBbCiAgICAgICAgIkNlQ0lMTCBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IHYyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFQ0lMTC0yLjEiOiBbCiAgICAgICAgIkNlQ0lMTCBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IHYyLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VDSUxMLUIiOiBbCiAgICAgICAgIkNlQ0lMTC1CIEZyZWUgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFQ0lMTC1DIjogWwogICAgICAgICJDZUNJTEwtQyBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRVJOLU9ITC0xLjEiOiBbCiAgICAgICAgIkNFUk4gT3BlbiBIYXJkd2FyZSBMaWNlbmNlIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFUk4tT0hMLTEuMiI6IFsKICAgICAgICAiQ0VSTiBPcGVuIEhhcmR3YXJlIExpY2VuY2UgdjEuMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VSTi1PSEwtUC0yLjAiOiBbCiAgICAgICAgIkNFUk4gT3BlbiBIYXJkd2FyZSBMaWNlbmNlIFZlcnNpb24gMiAtIFBlcm1pc3NpdmUiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VSTi1PSEwtUy0yLjAiOiBbCiAgICAgICAgIkNFUk4gT3BlbiBIYXJkd2FyZSBMaWNlbmNlIFZlcnNpb24gMiAtIFN0cm9uZ2x5IFJlY2lwcm9jYWwiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VSTi1PSEwtVy0yLjAiOiBbCiAgICAgICAgIkNFUk4gT3BlbiBIYXJkd2FyZSBMaWNlbmNlIFZlcnNpb24gMiAtIFdlYWtseSBSZWNpcHJvY2FsIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNGSVRTSU8iOiBbCiAgICAgICAgIkNGSVRTSU8gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiY2hlY2stY3ZzIjogWwogICAgICAgICJjaGVjay1jdnMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiY2hlY2ttayI6IFsKICAgICAgICAiQ2hlY2ttayBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDbEFydGlzdGljIjogWwogICAgICAgICJDbGFyaWZpZWQgQXJ0aXN0aWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ2xpcHMiOiBbCiAgICAgICAgIkNsaXBzIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNNVS1NYWNoIjogWwogICAgICAgICJDTVUgTWFjaCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDTVUtTWFjaC1ub2RvYyI6IFsKICAgICAgICAiQ01VICAgIE1hY2ggLSBubyBub3RpY2VzLWluLWRvY3VtZW50YXRpb24gdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ05SSS1KeXRob24iOiBbCiAgICAgICAgIkNOUkkgSnl0aG9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNOUkktUHl0aG9uIjogWwogICAgICAgICJDTlJJIFB5dGhvbiBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNOUkktUHl0aG9uLUdQTC1Db21wYXRpYmxlIjogWwogICAgICAgICJDTlJJIFB5dGhvbiBPcGVuIFNvdXJjZSBHUEwgQ29tcGF0aWJsZSBMaWNlbnNlIEFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ09JTC0xLjAiOiBbCiAgICAgICAgIkNvcHlmcmVlIE9wZW4gSW5ub3ZhdGlvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDb21tdW5pdHktU3BlYy0xLjAiOiBbCiAgICAgICAgIkNvbW11bml0eSBTcGVjaWZpY2F0aW9uIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDb25kb3ItMS4xIjogWwogICAgICAgICJDb25kb3IgUHVibGljIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiY29weWxlZnQtbmV4dC0wLjMuMCI6IFsKICAgICAgICAiY29weWxlZnQtbmV4dCAwLjMuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiY29weWxlZnQtbmV4dC0wLjMuMSI6IFsKICAgICAgICAiY29weWxlZnQtbmV4dCAwLjMuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ29ybmVsbC1Mb3NzbGVzcy1KUEVHIjogWwogICAgICAgICJDb3JuZWxsIExvc3NsZXNzIEpQRUcgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ1BBTC0xLjAiOiBbCiAgICAgICAgIkNvbW1vbiBQdWJsaWMgQXR0cmlidXRpb24gTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ1BMLTEuMCI6IFsKICAgICAgICAiQ29tbW9uIFB1YmxpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDUE9MLTEuMDIiOiBbCiAgICAgICAgIkNvZGUgUHJvamVjdCBPcGVuIExpY2Vuc2UgMS4wMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ3Jvbnl4IjogWwogICAgICAgICJDcm9ueXggTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ3Jvc3N3b3JkIjogWwogICAgICAgICJDcm9zc3dvcmQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ3J5cHRvU3dpZnQiOiBbCiAgICAgICAgIkNyeXB0b1N3aWZ0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNyeXN0YWxTdGFja2VyIjogWwogICAgICAgICJDcnlzdGFsU3RhY2tlciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDVUEtT1BMLTEuMCI6IFsKICAgICAgICAiQ1VBIE9mZmljZSBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkN1YmUiOiBbCiAgICAgICAgIkN1YmUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiY3VybCI6IFsKICAgICAgICAiY3VybCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJjdmUtdG91IjogWwogICAgICAgICJDb21tb24gVnVsbmVyYWJpbGl0eSBFbnVtZXJhdGlvbiBUb1UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRC1GU0wtMS4wIjogWwogICAgICAgICJEZXV0c2NoZSBGcmVpZSBTb2Z0d2FyZSBMaXplbnoiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRFQy0zLUNsYXVzZSI6IFsKICAgICAgICAiREVDIDMtQ2xhdXNlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImRpZmZtYXJrIjogWwogICAgICAgICJkaWZmbWFyayBsaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJETC1ERS1CWS0yLjAiOiBbCiAgICAgICAgIkRhdGEgbGljZW5jZSBHZXJtYW55IFx1MjAxMyBhdHRyaWJ1dGlvbiBcdTIwMTMgdmVyc2lvbiAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRMLURFLVpFUk8tMi4wIjogWwogICAgICAgICJEYXRhIGxpY2VuY2UgR2VybWFueSBcdTIwMTMgemVybyBcdTIwMTMgdmVyc2lvbiAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRPQyI6IFsKICAgICAgICAiRE9DIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRvY0Jvb2stRFREIjogWwogICAgICAgICJEb2NCb29rIERURCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJEb2NCb29rLVNjaGVtYSI6IFsKICAgICAgICAiRG9jQm9vayBTY2hlbWEgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRG9jQm9vay1TdHlsZXNoZWV0IjogWwogICAgICAgICJEb2NCb29rIFN0eWxlc2hlZXQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRG9jQm9vay1YTUwiOiBbCiAgICAgICAgIkRvY0Jvb2sgWE1MIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRvdHNlcW4iOiBbCiAgICAgICAgIkRvdHNlcW4gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRFJMLTEuMCI6IFsKICAgICAgICAiRGV0ZWN0aW9uIFJ1bGUgTGljZW5zZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRSTC0xLjEiOiBbCiAgICAgICAgIkRldGVjdGlvbiBSdWxlIExpY2Vuc2UgMS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJEU0RQIjogWwogICAgICAgICJEU0RQIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImR0b2EiOiBbCiAgICAgICAgIkRhdmlkIE0uIEdheSBkdG9hIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImR2aXBkZm0iOiBbCiAgICAgICAgImR2aXBkZm0gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRUNMLTEuMCI6IFsKICAgICAgICAiRWR1Y2F0aW9uYWwgQ29tbXVuaXR5IExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFQ0wtMi4wIjogWwogICAgICAgICJFZHVjYXRpb25hbCBDb21tdW5pdHkgTGljZW5zZSB2Mi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImVDb3MtMi4wIjogWwogICAgICAgICJlQ29zIGxpY2Vuc2UgdmVyc2lvbiAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiRUZMLTEuMCI6IFsKICAgICAgICAiRWlmZmVsIEZvcnVtIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFRkwtMi4wIjogWwogICAgICAgICJFaWZmZWwgRm9ydW0gTGljZW5zZSB2Mi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImVHZW5peCI6IFsKICAgICAgICAiZUdlbml4LmNvbSBQdWJsaWMgTGljZW5zZSAxLjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRWxhc3RpYy0yLjAiOiBbCiAgICAgICAgIkVsYXN0aWMgTGljZW5zZSAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVudGVzc2EiOiBbCiAgICAgICAgIkVudGVzc2EgUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFUElDUyI6IFsKICAgICAgICAiRVBJQ1MgT3BlbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFUEwtMS4wIjogWwogICAgICAgICJFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFUEwtMi4wIjogWwogICAgICAgICJFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFcmxQTC0xLjEiOiBbCiAgICAgICAgIkVybGFuZyBQdWJsaWMgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJldGFsYWItMi4wIjogWwogICAgICAgICJFdGFsYWIgT3BlbiBMaWNlbnNlIDIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRVVEYXRhZ3JpZCI6IFsKICAgICAgICAiRVUgRGF0YUdyaWQgU29mdHdhcmUgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFVVBMLTEuMCI6IFsKICAgICAgICAiRXVyb3BlYW4gVW5pb24gUHVibGljIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFVVBMLTEuMSI6IFsKICAgICAgICAiRXVyb3BlYW4gVW5pb24gUHVibGljIExpY2Vuc2UgMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVVUEwtMS4yIjogWwogICAgICAgICJFdXJvcGVhbiBVbmlvbiBQdWJsaWMgTGljZW5zZSAxLjIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRXVyb3N5bSI6IFsKICAgICAgICAiRXVyb3N5bSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGYWlyIjogWwogICAgICAgICJGYWlyIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRkJNIjogWwogICAgICAgICJGdXp6eSBCaXRtYXAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRkRLLUFBQyI6IFsKICAgICAgICAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZlcmd1c29uLVR3b2Zpc2giOiBbCiAgICAgICAgIkZlcmd1c29uIFR3b2Zpc2ggTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRnJhbWV3b3J4LTEuMCI6IFsKICAgICAgICAiRnJhbWV3b3J4IE9wZW4gTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRnJlZUJTRC1ET0MiOiBbCiAgICAgICAgIkZyZWVCU0QgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGcmVlSW1hZ2UiOiBbCiAgICAgICAgIkZyZWVJbWFnZSBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGU0ZBUCI6IFsKICAgICAgICAiRlNGIEFsbCBQZXJtaXNzaXZlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZTRkFQLW5vLXdhcnJhbnR5LWRpc2NsYWltZXIiOiBbCiAgICAgICAgIkZTRiBBbGwgUGVybWlzc2l2ZSBMaWNlbnNlICh3aXRob3V0IFdhcnJhbnR5KSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRlNGVUwiOiBbCiAgICAgICAgIkZTRiBVbmxpbWl0ZWQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRlNGVUxMUiI6IFsKICAgICAgICAiRlNGIFVubGltaXRlZCBMaWNlbnNlICh3aXRoIExpY2Vuc2UgUmV0ZW50aW9uKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRlNGVUxMUldEIjogWwogICAgICAgICJGU0YgVW5saW1pdGVkIExpY2Vuc2UgKFdpdGggTGljZW5zZSBSZXRlbnRpb24gYW5kIFdhcnJhbnR5IERpc2NsYWltZXIpIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGU0wtMS4xLUFMdjIiOiBbCiAgICAgICAgIkZ1bmN0aW9uYWwgU291cmNlIExpY2Vuc2UsIFZlcnNpb24gMS4xLCBBTHYyIEZ1dHVyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGU0wtMS4xLU1JVCI6IFsKICAgICAgICAiRnVuY3Rpb25hbCBTb3VyY2UgTGljZW5zZSwgVmVyc2lvbiAxLjEsIE1JVCBGdXR1cmUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRlRMIjogWwogICAgICAgICJGcmVldHlwZSBQcm9qZWN0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZ1cnVzZXRoIjogWwogICAgICAgICJGdXJ1c2V0aCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJmd2x3IjogWwogICAgICAgICJmd2x3IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdhbWUtUHJvZ3JhbW1pbmctR2VtcyI6IFsKICAgICAgICAiR2FtZSBQcm9ncmFtbWluZyBHZW1zIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdDUi1kb2NzIjogWwogICAgICAgICJHbm9tZSBHQ1IgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRCI6IFsKICAgICAgICAiR0QgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiZ2VuZXJpYy14dHMiOiBbCiAgICAgICAgIkdlbmVyaWMgWFRTIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4xIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHRkRMLTEuMS1pbnZhcmlhbnRzLW9ubHkiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4xIG9ubHkgLSBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMS1pbnZhcmlhbnRzLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMSBvciBsYXRlciAtIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4xLW5vLWludmFyaWFudHMtb25seSI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjEgb25seSAtIG5vIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4xLW5vLWludmFyaWFudHMtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4xIG9yIGxhdGVyIC0gbm8gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjEtb25seSI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjEgb25seSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjEtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4xIG9yIGxhdGVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMiI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjIiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR0ZETC0xLjItaW52YXJpYW50cy1vbmx5IjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMiBvbmx5IC0gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjItaW52YXJpYW50cy1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjIgb3IgbGF0ZXIgLSBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMi1uby1pbnZhcmlhbnRzLW9ubHkiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4yIG9ubHkgLSBubyBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMi1uby1pbnZhcmlhbnRzLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMiBvciBsYXRlciAtIG5vIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4yLW9ubHkiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4yIG9ubHkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4yLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMiBvciBsYXRlciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjMiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4zIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdGREwtMS4zLWludmFyaWFudHMtb25seSI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjMgb25seSAtIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4zLWludmFyaWFudHMtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4zIG9yIGxhdGVyIC0gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjMtbm8taW52YXJpYW50cy1vbmx5IjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMyBvbmx5IC0gbm8gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjMtbm8taW52YXJpYW50cy1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjMgb3IgbGF0ZXIgLSBubyBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMy1vbmx5IjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMyBvbmx5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMy1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjMgb3IgbGF0ZXIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdpZnR3YXJlIjogWwogICAgICAgICJHaWZ0d2FyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHTDJQUyI6IFsKICAgICAgICAiR0wyUFMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR2xpZGUiOiBbCiAgICAgICAgIjNkZnggR2xpZGUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR2x1bHhlIjogWwogICAgICAgICJHbHVseGUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0xXVFBMIjogWwogICAgICAgICJHb29kIEx1Y2sgV2l0aCBUaGF0IFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJnbnVwbG90IjogWwogICAgICAgICJnbnVwbG90IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdQTC0xLjAiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYxLjAgb25seSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMS4wKyI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCBvciBsYXRlciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMS4wLW9ubHkiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYxLjAgb25seSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR1BMLTEuMC1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCBvciBsYXRlciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR1BMLTIuMCI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBvbmx5IiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR1BMLTIuMCsiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMi4wLW9ubHkiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHUEwtMi4wLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIG9yIGxhdGVyIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdQTC0yLjAtd2l0aC1hdXRvY29uZi1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgdy9BdXRvY29uZiBleGNlcHRpb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR1BMLTIuMC13aXRoLWJpc29uLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCB3L0Jpc29uIGV4Y2VwdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMi4wLXdpdGgtY2xhc3NwYXRoLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCB3L0NsYXNzcGF0aCBleGNlcHRpb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR1BMLTIuMC13aXRoLWZvbnQtZXhjZXB0aW9uIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIHcvRm9udCBleGNlcHRpb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR1BMLTIuMC13aXRoLUdDQy1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgdy9HQ0MgUnVudGltZSBMaWJyYXJ5IGV4Y2VwdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMy4wIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMy4wKyI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0zLjAtb25seSI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCBvbmx5IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdQTC0zLjAtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR1BMLTMuMC13aXRoLWF1dG9jb25mLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCB3L0F1dG9jb25mIGV4Y2VwdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMy4wLXdpdGgtR0NDLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCB3L0dDQyBSdW50aW1lIExpYnJhcnkgZXhjZXB0aW9uIiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR3JhcGhpY3MtR2VtcyI6IFsKICAgICAgICAiR3JhcGhpY3MgR2VtcyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJnU09BUC0xLjNiIjogWwogICAgICAgICJnU09BUCBQdWJsaWMgTGljZW5zZSB2MS4zYiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiZ3RrYm9vayI6IFsKICAgICAgICAiZ3RrYm9vayBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHdXRtYW5uIjogWwogICAgICAgICJHdXRtYW5uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhhc2tlbGxSZXBvcnQiOiBbCiAgICAgICAgIkhhc2tlbGwgTGFuZ3VhZ2UgUmVwb3J0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImhkcGFybSI6IFsKICAgICAgICAiaGRwYXJtIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhJREFQSSI6IFsKICAgICAgICAiSElEQVBJIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhpcHBvY3JhdGljLTIuMSI6IFsKICAgICAgICAiSGlwcG9jcmF0aWMgTGljZW5zZSAyLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQLTE5ODYiOiBbCiAgICAgICAgIkhld2xldHQtUGFja2FyZCAxOTg2IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQLTE5ODkiOiBbCiAgICAgICAgIkhld2xldHQtUGFja2FyZCAxOTg5IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1ERUMiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBERUMgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1kb2MiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBkb2N1bWVudGF0aW9uIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtZG9jLXNlbGwiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBkb2N1bWVudGF0aW9uIHNlbGwgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1leHBvcnQtVVMiOiBbCiAgICAgICAgIkhQTkQgd2l0aCBVUyBHb3Zlcm5tZW50IGV4cG9ydCBjb250cm9sIHdhcm5pbmciLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtZXhwb3J0LVVTLWFja25vd2xlZGdlbWVudCI6IFsKICAgICAgICAiSFBORCB3aXRoIFVTIEdvdmVybm1lbnQgZXhwb3J0IGNvbnRyb2wgd2FybmluZyBhbmQgYWNrbm93bGVkZ21lbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtZXhwb3J0LVVTLW1vZGlmeSI6IFsKICAgICAgICAiSFBORCB3aXRoIFVTIEdvdmVybm1lbnQgZXhwb3J0IGNvbnRyb2wgd2FybmluZyBhbmQgbW9kaWZpY2F0aW9uIHJxbXQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtZXhwb3J0Mi1VUyI6IFsKICAgICAgICAiSFBORCB3aXRoIFVTIEdvdmVybm1lbnQgZXhwb3J0IGNvbnRyb2wgYW5kIDIgZGlzY2xhaW1lcnMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtRmVubmViZXJnLUxpdmluZ3N0b24iOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBGZW5uZWJlcmctTGl2aW5nc3RvbiB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELUlOUklBLUlNQUciOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgICAgLSBJTlJJQS1JTUFHIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtSW50ZWwiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBJbnRlbCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELUtldmxpbi1IZW5uZXkiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBLZXZsaW4gSGVubmV5IHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtTWFya3VzLUt1aG4iOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBNYXJrdXMgS3VobiB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELW1lcmNoYW50YWJpbGl0eS12YXJpYW50IjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gbWVyY2hhbnRhYmlsaXR5IHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtTUlULWRpc2NsYWltZXIiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgd2l0aCBNSVQgZGlzY2xhaW1lciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1OZXRyZWsiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBOZXRyZWsgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1QYm1wbHVzIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gUGJtcGx1cyB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELXNlbGwtTUlULWRpc2NsYWltZXIteHNlcnZlciI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIHNlbGwgeHNlcnZlciB2YXJpYW50IHdpdGggTUlUIGRpc2NsYWltZXIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtc2VsbC1yZWdleHByIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gc2VsbCByZWdleHByIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtc2VsbC12YXJpYW50IjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gc2VsbCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELXNlbGwtdmFyaWFudC1NSVQtZGlzY2xhaW1lciI6IFsKICAgICAgICAiSFBORCBzZWxsIHZhcmlhbnQgd2l0aCBNSVQgZGlzY2xhaW1lciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1zZWxsLXZhcmlhbnQtTUlULWRpc2NsYWltZXItcmV2IjogWwogICAgICAgICJIUE5EIHNlbGwgdmFyaWFudCB3aXRoIE1JVCBkaXNjbGFpbWVyIC0gcmV2ZXJzZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1VQyI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELVVDLWV4cG9ydC1VUyI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgVVMgZXhwb3J0IHdhcm5pbmciLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhUTUxUSURZIjogWwogICAgICAgICJIVE1MIFRpZHkgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSUJNLXBpYnMiOiBbCiAgICAgICAgIklCTSBQb3dlclBDIEluaXRpYWxpemF0aW9uIGFuZCBCb290IFNvZnR3YXJlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJQ1UiOiBbCiAgICAgICAgIklDVSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklFQy1Db2RlLUNvbXBvbmVudHMtRVVMQSI6IFsKICAgICAgICAiSUVDICAgIENvZGUgQ29tcG9uZW50cyBFbmQtdXNlciBsaWNlbmNlIGFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSUpHIjogWwogICAgICAgICJJbmRlcGVuZGVudCBKUEVHIEdyb3VwIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklKRy1zaG9ydCI6IFsKICAgICAgICAiSW5kZXBlbmRlbnQgSlBFRyBHcm91cCBMaWNlbnNlIC0gc2hvcnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkltYWdlTWFnaWNrIjogWwogICAgICAgICJJbWFnZU1hZ2ljayBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJpTWF0aXgiOiBbCiAgICAgICAgImlNYXRpeCBTdGFuZGFyZCBGdW5jdGlvbiBMaWJyYXJ5IEFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSW1saWIyIjogWwogICAgICAgICJJbWxpYjIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSW5mby1aSVAiOiBbCiAgICAgICAgIkluZm8tWklQIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklubmVyLU5ldC0yLjAiOiBbCiAgICAgICAgIklubmVyIE5ldCBMaWNlbnNlIHYyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklubm9TZXR1cCI6IFsKICAgICAgICAiSW5ubyBTZXR1cCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJbnRlbCI6IFsKICAgICAgICAiSW50ZWwgT3BlbiBTb3VyY2UgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJbnRlbC1BQ1BJIjogWwogICAgICAgICJJbnRlbCBBQ1BJIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJbnRlcmJhc2UtMS4wIjogWwogICAgICAgICJJbnRlcmJhc2UgUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSVBBIjogWwogICAgICAgICJJUEEgRm9udCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklQTC0xLjAiOiBbCiAgICAgICAgIklCTSBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklTQyI6IFsKICAgICAgICAiSVNDIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSVNDLVZlaWxsYXJkIjogWwogICAgICAgICJJU0MgVmVpbGxhcmQgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSmFtIjogWwogICAgICAgICJKYW0gTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJKYXNQZXItMi4wIjogWwogICAgICAgICJKYXNQZXIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiam92ZSI6IFsKICAgICAgICAiSm92ZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJKUEwtaW1hZ2UiOiBbCiAgICAgICAgIkpQTCBJbWFnZSBVc2UgUG9saWN5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJKUE5JQyI6IFsKICAgICAgICAiSmFwYW4gTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSlNPTiI6IFsKICAgICAgICAiSlNPTiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJLYXN0cnVwIjogWwogICAgICAgICJLYXN0cnVwIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkthemxpYiI6IFsKICAgICAgICAiS2F6bGliIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIktudXRoLUNUQU4iOiBbCiAgICAgICAgIktudXRoIENUQU4gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEFMLTEuMiI6IFsKICAgICAgICAiTGljZW5jZSBBcnQgTGlicmUgMS4yIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMQUwtMS4zIjogWwogICAgICAgICJMaWNlbmNlIEFydCBMaWJyZSAxLjMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxhdGV4MmUiOiBbCiAgICAgICAgIkxhdGV4MmUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTGF0ZXgyZS10cmFuc2xhdGVkLW5vdGljZSI6IFsKICAgICAgICAiTGF0ZXgyZSB3aXRoIHRyYW5zbGF0ZWQgbm90aWNlIHBlcm1pc3Npb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxlcHRvbmljYSI6IFsKICAgICAgICAiTGVwdG9uaWNhIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxHUEwtMi4wIjogWwogICAgICAgICJHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTIuMCsiOiBbCiAgICAgICAgIkdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTIuMC1vbmx5IjogWwogICAgICAgICJHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTC0yLjAtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTC0yLjEiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4xIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTIuMSsiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4xIG9yIGxhdGVyIiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiTEdQTC0yLjEtb25seSI6IFsKICAgICAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjEgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMR1BMLTIuMS1vci1sYXRlciI6IFsKICAgICAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjEgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTC0zLjAiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTMuMCsiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9yIGxhdGVyIiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiTEdQTC0zLjAtb25seSI6IFsKICAgICAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMR1BMLTMuMC1vci1sYXRlciI6IFsKICAgICAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTExSIjogWwogICAgICAgICJMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBGb3IgTGluZ3Vpc3RpYyBSZXNvdXJjZXMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxpYnBuZyI6IFsKICAgICAgICAibGlicG5nIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImxpYnBuZy0yLjAiOiBbCiAgICAgICAgIlBORyBSZWZlcmVuY2UgTGlicmFyeSB2ZXJzaW9uIDIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImxpYnNlbGludXgtMS4wIjogWwogICAgICAgICJsaWJzZWxpbnV4IHB1YmxpYyBkb21haW4gbm90aWNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJsaWJ0aWZmIjogWwogICAgICAgICJsaWJ0aWZmIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImxpYnV0aWwtRGF2aWQtTnVnZW50IjogWwogICAgICAgICJsaWJ1dGlsIERhdmlkIE51Z2VudCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaUxpUS1QLTEuMSI6IFsKICAgICAgICAiTGljZW5jZSBMaWJyZSBkdSBRdVx1MDBlOWJlYyBcdTIwMTMgUGVybWlzc2l2ZSB2ZXJzaW9uIDEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaUxpUS1SLTEuMSI6IFsKICAgICAgICAiTGljZW5jZSBMaWJyZSBkdSBRdVx1MDBlOWJlYyBcdTIwMTMgUlx1MDBlOWNpcHJvY2l0XHUwMGU5IHZlcnNpb24gMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxpTGlRLVJwbHVzLTEuMSI6IFsKICAgICAgICAiTGljZW5jZSBMaWJyZSBkdSBRdVx1MDBlOWJlYyBcdTIwMTMgUlx1MDBlOWNpcHJvY2l0XHUwMGU5IGZvcnRlIHZlcnNpb24gMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxpbnV4LW1hbi1wYWdlcy0xLXBhcmEiOiBbCiAgICAgICAgIkxpbnV4IG1hbi1wYWdlcyAtIDEgcGFyYWdyYXBoIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaW51eC1tYW4tcGFnZXMtY29weWxlZnQiOiBbCiAgICAgICAgIkxpbnV4IG1hbi1wYWdlcyBDb3B5bGVmdCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTGludXgtbWFuLXBhZ2VzLWNvcHlsZWZ0LTItcGFyYSI6IFsKICAgICAgICAiTGludXggbWFuLXBhZ2VzIENvcHlsZWZ0IC0gMiBwYXJhZ3JhcGhzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaW51eC1tYW4tcGFnZXMtY29weWxlZnQtdmFyIjogWwogICAgICAgICJMaW51eCBtYW4tcGFnZXMgQ29weWxlZnQgVmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTGludXgtT3BlbklCIjogWwogICAgICAgICJMaW51eCBLZXJuZWwgVmFyaWFudCBvZiBPcGVuSUIub3JnIGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxPT1AiOiBbCiAgICAgICAgIkNvbW1vbiBMaXNwIExPT1AgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTFBELWRvY3VtZW50IjogWwogICAgICAgICJMUEQgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUEwtMS4wIjogWwogICAgICAgICJMdWNlbnQgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTFBMLTEuMDIiOiBbCiAgICAgICAgIkx1Y2VudCBQdWJsaWMgTGljZW5zZSB2MS4wMiIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUFBMLTEuMCI6IFsKICAgICAgICAiTGFUZVggUHJvamVjdCBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUFBMLTEuMSI6IFsKICAgICAgICAiTGFUZVggUHJvamVjdCBQdWJsaWMgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUFBMLTEuMiI6IFsKICAgICAgICAiTGFUZVggUHJvamVjdCBQdWJsaWMgTGljZW5zZSB2MS4yIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUFBMLTEuM2EiOiBbCiAgICAgICAgIkxhVGVYIFByb2plY3QgUHVibGljIExpY2Vuc2UgdjEuM2EiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxQUEwtMS4zYyI6IFsKICAgICAgICAiTGFUZVggUHJvamVjdCBQdWJsaWMgTGljZW5zZSB2MS4zYyIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJsc29mIjogWwogICAgICAgICJsc29mIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkx1Y2lkYS1CaXRtYXAtRm9udHMiOiBbCiAgICAgICAgIkx1Y2lkYSBCaXRtYXAgRm9udHMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTFpNQS1TREstOS4xMS10by05LjIwIjogWwogICAgICAgICJMWk1BIFNESyBMaWNlbnNlICh2ZXJzaW9ucyA5LjExIHRvIDkuMjApIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMWk1BLVNESy05LjIyIjogWwogICAgICAgICJMWk1BIFNESyBMaWNlbnNlICh2ZXJzaW9ucyA5LjIyIGFuZCBiZXlvbmQpIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNYWNrZXJyYXMtMy1DbGF1c2UiOiBbCiAgICAgICAgIk1hY2tlcnJhcyAzLUNsYXVzZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNYWNrZXJyYXMtMy1DbGF1c2UtYWNrbm93bGVkZ21lbnQiOiBbCiAgICAgICAgIk1hY2tlcnJhcyAzLUNsYXVzZSAtIGFja25vd2xlZGdtZW50IHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIm1hZ2F6IjogWwogICAgICAgICJtYWdheiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJtYWlscHJpbyI6IFsKICAgICAgICAibWFpbHByaW8gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTWFrZUluZGV4IjogWwogICAgICAgICJNYWtlSW5kZXggTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAibWFuMmh0bWwiOiBbCiAgICAgICAgIm1hbjJodG1sIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1hcnRpbi1CaXJnbWVpZXIiOiBbCiAgICAgICAgIk1hcnRpbiBCaXJnbWVpZXIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTWNQaGVlLXNsaWRlc2hvdyI6IFsKICAgICAgICAiTWNQaGVlIFNsaWRlc2hvdyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJtZXRhbWFpbCI6IFsKICAgICAgICAibWV0YW1haWwgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTWlucGFjayI6IFsKICAgICAgICAiTWlucGFjayBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVBTIjogWwogICAgICAgICJNSVBTIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1pck9TIjogWwogICAgICAgICJUaGUgTWlyT1MgTGljZW5jZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQiOiBbCiAgICAgICAgIk1JVCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC0wIjogWwogICAgICAgICJNSVQgTm8gQXR0cmlidXRpb24iLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULWFkdmVydGlzaW5nIjogWwogICAgICAgICJFbmxpZ2h0ZW5tZW50IExpY2Vuc2UgKGUxNikiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1DbGljayI6IFsKICAgICAgICAiTUlUIENsaWNrIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1DTVUiOiBbCiAgICAgICAgIkNNVSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtZW5uYSI6IFsKICAgICAgICAiZW5uYSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtZmVoIjogWwogICAgICAgICJmZWggTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULUZlc3RpdmFsIjogWwogICAgICAgICJNSVQgRmVzdGl2YWwgVmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULUtocm9ub3Mtb2xkIjogWwogICAgICAgICJNSVQgS2hyb25vcyAtIG9sZCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtTW9kZXJuLVZhcmlhbnQiOiBbCiAgICAgICAgIk1JVCBMaWNlbnNlIE1vZGVybiBWYXJpYW50IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1vcGVuLWdyb3VwIjogWwogICAgICAgICJNSVQgT3BlbiBHcm91cCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtdGVzdHJlZ2V4IjogWwogICAgICAgICJNSVQgdGVzdHJlZ2V4IFZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1XdSI6IFsKICAgICAgICAiTUlUIFRvbSBXdSBWYXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVRORkEiOiBbCiAgICAgICAgIk1JVCArbm8tZmFsc2UtYXR0cmlicyBsaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNTUlYd2FyZSI6IFsKICAgICAgICAiTU1JWHdhcmUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTW90b3NvdG8iOiBbCiAgICAgICAgIk1vdG9zb3RvIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTVBFRy1TU0ciOiBbCiAgICAgICAgIk1QRUcgU29mdHdhcmUgU2ltdWxhdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAibXBpLXBlcm1pc3NpdmUiOiBbCiAgICAgICAgIm1waSBQZXJtaXNzaXZlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIm1waWNoMiI6IFsKICAgICAgICAibXBpY2gyIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1QTC0xLjAiOiBbCiAgICAgICAgIk1vemlsbGEgUHVibGljIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1QTC0xLjEiOiBbCiAgICAgICAgIk1vemlsbGEgUHVibGljIExpY2Vuc2UgMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1QTC0yLjAiOiBbCiAgICAgICAgIk1vemlsbGEgUHVibGljIExpY2Vuc2UgMi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1QTC0yLjAtbm8tY29weWxlZnQtZXhjZXB0aW9uIjogWwogICAgICAgICJNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIDIuMCAobm8gY29weWxlZnQgZXhjZXB0aW9uKSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJtcGx1cyI6IFsKICAgICAgICAibXBsdXMgRm9udCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNUy1MUEwiOiBbCiAgICAgICAgIk1pY3Jvc29mdCBMaW1pdGVkIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNUy1QTCI6IFsKICAgICAgICAiTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1TLVJMIjogWwogICAgICAgICJNaWNyb3NvZnQgUmVjaXByb2NhbCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1UTEwiOiBbCiAgICAgICAgIk1hdHJpeCBUZW1wbGF0ZSBMaWJyYXJ5IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk11bGFuUFNMLTEuMCI6IFsKICAgICAgICAiTXVsYW4gUGVybWlzc2l2ZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk11bGFuUFNMLTIuMCI6IFsKICAgICAgICAiTXVsYW4gUGVybWlzc2l2ZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTXVsdGljcyI6IFsKICAgICAgICAiTXVsdGljcyBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk11cCI6IFsKICAgICAgICAiTXVwIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5BSVNULTIwMDMiOiBbCiAgICAgICAgIk5hcmEgSW5zdGl0dXRlIG9mIFNjaWVuY2UgYW5kIFRlY2hub2xvZ3kgTGljZW5zZSAoMjAwMykiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5BU0EtMS4zIjogWwogICAgICAgICJOQVNBIE9wZW4gU291cmNlIEFncmVlbWVudCAxLjMiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTmF1bWVuIjogWwogICAgICAgICJOYXVtZW4gUHVibGljIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTkJQTC0xLjAiOiBbCiAgICAgICAgIk5ldCBCb29sZWFuIFB1YmxpYyBMaWNlbnNlIHYxIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOQ0JJLVBEIjogWwogICAgICAgICJOQ0JJIFB1YmxpYyBEb21haW4gTm90aWNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOQ0dMLVVLLTIuMCI6IFsKICAgICAgICAiTm9uLUNvbW1lcmNpYWwgR292ZXJubWVudCBMaWNlbmNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOQ0wiOiBbCiAgICAgICAgIk5DTCBTb3VyY2UgQ29kZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOQ1NBIjogWwogICAgICAgICJVbml2ZXJzaXR5IG9mIElsbGlub2lzL05DU0EgT3BlbiBTb3VyY2UgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOZXQtU05NUCI6IFsKICAgICAgICAiTmV0LVNOTVAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJOZXRDREYiOiBbCiAgICAgICAgIk5ldENERiBsaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOZXdzbGV0ciI6IFsKICAgICAgICAiTmV3c2xldHIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTkdQTCI6IFsKICAgICAgICAiTmV0aGFjayBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5JQ1RBLTEuMCI6IFsKICAgICAgICAiTklDVEEgUHVibGljIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOSVNULVBEIjogWwogICAgICAgICJOSVNUIFB1YmxpYyBEb21haW4gTm90aWNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOSVNULVBELWZhbGxiYWNrIjogWwogICAgICAgICJOSVNUIFB1YmxpYyBEb21haW4gTm90aWNlIHdpdGggbGljZW5zZSBmYWxsYmFjayIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTklTVC1Tb2Z0d2FyZSI6IFsKICAgICAgICAiTklTVCBTb2Z0d2FyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOTE9ELTEuMCI6IFsKICAgICAgICAiTm9yd2VnaWFuIExpY2VuY2UgZm9yIE9wZW4gR292ZXJubWVudCBEYXRhIChOTE9EKSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5MT0QtMi4wIjogWwogICAgICAgICJOb3J3ZWdpYW4gTGljZW5jZSBmb3IgT3BlbiBHb3Zlcm5tZW50IERhdGEgKE5MT0QpIDIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTkxQTCI6IFsKICAgICAgICAiTm8gTGltaXQgUHVibGljIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5va2lhIjogWwogICAgICAgICJOb2tpYSBPcGVuIFNvdXJjZSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5PU0wiOiBbCiAgICAgICAgIk5ldGl6ZW4gT3BlbiBTb3VyY2UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTm93ZWIiOiBbCiAgICAgICAgIk5vd2ViIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5QTC0xLjAiOiBbCiAgICAgICAgIk5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5QTC0xLjEiOiBbCiAgICAgICAgIk5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5QT1NMLTMuMCI6IFsKICAgICAgICAiTm9uLVByb2ZpdCBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgMy4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5STCI6IFsKICAgICAgICAiTlJMIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5USUEtUEQiOiBbCiAgICAgICAgIk5USUEgUHVibGljIERvbWFpbiBOb3RpY2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5UUCI6IFsKICAgICAgICAiTlRQIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlRQLTAiOiBbCiAgICAgICAgIk5UUCBObyBBdHRyaWJ1dGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTnVuaXQiOiBbCiAgICAgICAgIk51bml0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiTy1VREEtMS4wIjogWwogICAgICAgICJPcGVuIFVzZSBvZiBEYXRhIEFncmVlbWVudCB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPQVIiOiBbCiAgICAgICAgIk9BUiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPQ0NULVBMIjogWwogICAgICAgICJPcGVuIENBU0NBREUgVGVjaG5vbG9neSBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0NMQy0yLjAiOiBbCiAgICAgICAgIk9DTEMgUmVzZWFyY2ggUHVibGljIExpY2Vuc2UgMi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9EYkwtMS4wIjogWwogICAgICAgICJPcGVuIERhdGEgQ29tbW9ucyBPcGVuIERhdGFiYXNlIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0RDLUJ5LTEuMCI6IFsKICAgICAgICAiT3BlbiBEYXRhIENvbW1vbnMgQXR0cmlidXRpb24gTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPRkZJUyI6IFsKICAgICAgICAiT0ZGSVMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0ZMLTEuMCI6IFsKICAgICAgICAiU0lMIE9wZW4gRm9udCBMaWNlbnNlIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0ZMLTEuMC1uby1SRk4iOiBbCiAgICAgICAgIlNJTCBPcGVuIEZvbnQgTGljZW5zZSAxLjAgd2l0aCBubyBSZXNlcnZlZCBGb250IE5hbWUiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9GTC0xLjAtUkZOIjogWwogICAgICAgICJTSUwgT3BlbiBGb250IExpY2Vuc2UgMS4wIHdpdGggUmVzZXJ2ZWQgRm9udCBOYW1lIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPRkwtMS4xIjogWwogICAgICAgICJTSUwgT3BlbiBGb250IExpY2Vuc2UgMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9GTC0xLjEtbm8tUkZOIjogWwogICAgICAgICJTSUwgT3BlbiBGb250IExpY2Vuc2UgMS4xIHdpdGggbm8gUmVzZXJ2ZWQgRm9udCBOYW1lIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9GTC0xLjEtUkZOIjogWwogICAgICAgICJTSUwgT3BlbiBGb250IExpY2Vuc2UgMS4xIHdpdGggUmVzZXJ2ZWQgRm9udCBOYW1lIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9HQy0xLjAiOiBbCiAgICAgICAgIk9HQyBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0dETC1UYWl3YW4tMS4wIjogWwogICAgICAgICJUYWl3YW4gT3BlbiBHb3Zlcm5tZW50IERhdGEgTGljZW5zZSwgdmVyc2lvbiAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9HTC1DYW5hZGEtMi4wIjogWwogICAgICAgICJPcGVuIEdvdmVybm1lbnQgTGljZW5jZSAtIENhbmFkYSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0dMLVVLLTEuMCI6IFsKICAgICAgICAiT3BlbiBHb3Zlcm5tZW50IExpY2VuY2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0dMLVVLLTIuMCI6IFsKICAgICAgICAiT3BlbiBHb3Zlcm5tZW50IExpY2VuY2UgdjIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0dMLVVLLTMuMCI6IFsKICAgICAgICAiT3BlbiBHb3Zlcm5tZW50IExpY2VuY2UgdjMuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0dUU0wiOiBbCiAgICAgICAgIk9wZW4gR3JvdXAgVGVzdCBTdWl0ZSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTEuMSI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTEuMiI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYxLjIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTEuMyI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYxLjMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTEuNCI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYxLjQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuMCI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYyLjAgKG9yIHBvc3NpYmx5IDIuMEEgYW5kIDIuMEIpIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjAuMSI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYyLjAuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi4xIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi4yIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi4yLjEiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi4yLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuMi4yIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgMi4yLjIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuMyI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYyLjMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuNCI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYyLjQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuNSI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYyLjUiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuNiI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYyLjYiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuNyI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYyLjciLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuOCI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYyLjgiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xGTC0xLjMiOiBbCiAgICAgICAgIk9wZW4gTG9naXN0aWNzIEZvdW5kYXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMyIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTUwiOiBbCiAgICAgICAgIk9wZW4gTWFya2V0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9wZW5QQlMtMi4zIjogWwogICAgICAgICJPcGVuUEJTIHYyLjMgU29mdHdhcmUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT3BlblNTTCI6IFsKICAgICAgICAiT3BlblNTTCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPcGVuU1NMLXN0YW5kYWxvbmUiOiBbCiAgICAgICAgIk9wZW5TU0wgTGljZW5zZSAtIHN0YW5kYWxvbmUiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9wZW5WaXNpb24iOiBbCiAgICAgICAgIk9wZW5WaXNpb24gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT1BMLTEuMCI6IFsKICAgICAgICAiT3BlbiBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPUEwtVUstMy4wIjogWwogICAgICAgICJVbml0ZWQgICAgS2luZ2RvbSBPcGVuIFBhcmxpYW1lbnQgTGljZW5jZSB2My4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPUFVCTC0xLjAiOiBbCiAgICAgICAgIk9wZW4gUHVibGljYXRpb24gTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPU0VULVBMLTIuMSI6IFsKICAgICAgICAiT1NFVCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPU0wtMS4wIjogWwogICAgICAgICJPcGVuIFNvZnR3YXJlIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9TTC0xLjEiOiBbCiAgICAgICAgIk9wZW4gU29mdHdhcmUgTGljZW5zZSAxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9TTC0yLjAiOiBbCiAgICAgICAgIk9wZW4gU29mdHdhcmUgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT1NMLTIuMSI6IFsKICAgICAgICAiT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIDIuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPU0wtMy4wIjogWwogICAgICAgICJPcGVuIFNvZnR3YXJlIExpY2Vuc2UgMy4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlBBREwiOiBbCiAgICAgICAgIlBBREwgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUGFyaXR5LTYuMC4wIjogWwogICAgICAgICJUaGUgUGFyaXR5IFB1YmxpYyBMaWNlbnNlIDYuMC4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQYXJpdHktNy4wLjAiOiBbCiAgICAgICAgIlRoZSBQYXJpdHkgUHVibGljIExpY2Vuc2UgNy4wLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlBEREwtMS4wIjogWwogICAgICAgICJPcGVuIERhdGEgQ29tbW9ucyBQdWJsaWMgRG9tYWluIERlZGljYXRpb24gJiBMaWNlbnNlIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUEhQLTMuMCI6IFsKICAgICAgICAiUEhQIExpY2Vuc2UgdjMuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQSFAtMy4wMSI6IFsKICAgICAgICAiUEhQIExpY2Vuc2UgdjMuMDEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUGl4YXIiOiBbCiAgICAgICAgIlBpeGFyIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInBrZ2NvbmYiOiBbCiAgICAgICAgInBrZ2NvbmYgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUGxleHVzIjogWwogICAgICAgICJQbGV4dXMgQ2xhc3N3b3JsZHMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAicG5tc3RpdGNoIjogWwogICAgICAgICJwbm1zdGl0Y2ggTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUG9seUZvcm0tTm9uY29tbWVyY2lhbC0xLjAuMCI6IFsKICAgICAgICAiUG9seUZvcm0gTm9uY29tbWVyY2lhbCBMaWNlbnNlIDEuMC4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQb2x5Rm9ybS1TbWFsbC1CdXNpbmVzcy0xLjAuMCI6IFsKICAgICAgICAiUG9seUZvcm0gU21hbGwgQnVzaW5lc3MgTGljZW5zZSAxLjAuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUG9zdGdyZVNRTCI6IFsKICAgICAgICAiUG9zdGdyZVNRTCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlBQTCI6IFsKICAgICAgICAiUGVlciBQcm9kdWN0aW9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlBTRi0yLjAiOiBbCiAgICAgICAgIlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIExpY2Vuc2UgMi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJwc2ZyYWciOiBbCiAgICAgICAgInBzZnJhZyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJwc3V0aWxzIjogWwogICAgICAgICJwc3V0aWxzIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlB5dGhvbi0yLjAiOiBbCiAgICAgICAgIlB5dGhvbiBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQeXRob24tMi4wLjEiOiBbCiAgICAgICAgIlB5dGhvbiBMaWNlbnNlIDIuMC4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJweXRob24tbGRhcCI6IFsKICAgICAgICAiUHl0aG9uIGxkYXAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUWh1bGwiOiBbCiAgICAgICAgIlFodWxsIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlFQTC0xLjAiOiBbCiAgICAgICAgIlEgUHVibGljIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlFQTC0xLjAtSU5SSUEtMjAwNCI6IFsKICAgICAgICAiUSBQdWJsaWMgTGljZW5zZSAxLjAgLSBJTlJJQSAyMDA0IHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInJhZHZkIjogWwogICAgICAgICJyYWR2ZCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSZGlzYyI6IFsKICAgICAgICAiUmRpc2MgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUkhlQ29zLTEuMSI6IFsKICAgICAgICAiUmVkIEhhdCBlQ29zIFB1YmxpYyBMaWNlbnNlIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlJQTC0xLjEiOiBbCiAgICAgICAgIlJlY2lwcm9jYWwgUHVibGljIExpY2Vuc2UgMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlJQTC0xLjUiOiBbCiAgICAgICAgIlJlY2lwcm9jYWwgUHVibGljIExpY2Vuc2UgMS41IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlJQU0wtMS4wIjogWwogICAgICAgICJSZWFsTmV0d29ya3MgUHVibGljIFNvdXJjZSBMaWNlbnNlIHYxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUlNBLU1EIjogWwogICAgICAgICJSU0EgTWVzc2FnZS1EaWdlc3QgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUlNDUEwiOiBbCiAgICAgICAgIlJpY29oIFNvdXJjZSBDb2RlIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlJ1YnkiOiBbCiAgICAgICAgIlJ1YnkgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUnVieS1wdHkiOiBbCiAgICAgICAgIlJ1YnkgcHR5IGV4dGVuc2lvbiBsaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTQVgtUEQiOiBbCiAgICAgICAgIlNheCBQdWJsaWMgRG9tYWluIE5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0FYLVBELTIuMCI6IFsKICAgICAgICAiU2F4IFB1YmxpYyBEb21haW4gTm90aWNlIDIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU2F4cGF0aCI6IFsKICAgICAgICAiU2F4cGF0aCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTQ0VBIjogWwogICAgICAgICJTQ0VBIFNoYXJlZCBTb3VyY2UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU2NoZW1lUmVwb3J0IjogWwogICAgICAgICJTY2hlbWUgTGFuZ3VhZ2UgUmVwb3J0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNlbmRtYWlsIjogWwogICAgICAgICJTZW5kbWFpbCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTZW5kbWFpbC04LjIzIjogWwogICAgICAgICJTZW5kbWFpbCBMaWNlbnNlIDguMjMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNlbmRtYWlsLU9wZW4tU291cmNlLTEuMSI6IFsKICAgICAgICAiU2VuZG1haWwgT3BlbiBTb3VyY2UgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTR0ktQi0xLjAiOiBbCiAgICAgICAgIlNHSSBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQiB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTR0ktQi0xLjEiOiBbCiAgICAgICAgIlNHSSBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQiB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTR0ktQi0yLjAiOiBbCiAgICAgICAgIlNHSSBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQiB2Mi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTR0ktT3BlbkdMIjogWwogICAgICAgICJTR0kgT3BlbkdMIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNHUDQiOiBbCiAgICAgICAgIlNHUDQgUGVybWlzc2lvbiBOb3RpY2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNITC0wLjUiOiBbCiAgICAgICAgIlNvbGRlcnBhZCBIYXJkd2FyZSBMaWNlbnNlIHYwLjUiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNITC0wLjUxIjogWwogICAgICAgICJTb2xkZXJwYWQgSGFyZHdhcmUgTGljZW5zZSwgVmVyc2lvbiAwLjUxIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTaW1QTC0yLjAiOiBbCiAgICAgICAgIlNpbXBsZSBQdWJsaWMgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0lTU0wiOiBbCiAgICAgICAgIlN1biBJbmR1c3RyeSBTdGFuZGFyZHMgU291cmNlIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTSVNTTC0xLjIiOiBbCiAgICAgICAgIlN1biBJbmR1c3RyeSBTdGFuZGFyZHMgU291cmNlIExpY2Vuc2UgdjEuMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0wiOiBbCiAgICAgICAgIlNMIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNsZWVweWNhdCI6IFsKICAgICAgICAiU2xlZXB5Y2F0IExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU01BSUwtR1BMIjogWwogICAgICAgICJTTUFJTCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTTUxOSiI6IFsKICAgICAgICAiU3RhbmRhcmQgTUwgb2YgTmV3IEplcnNleSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTTVBQTCI6IFsKICAgICAgICAiU2VjdXJlIE1lc3NhZ2luZyBQcm90b2NvbCBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU05JQSI6IFsKICAgICAgICAiU05JQSBQdWJsaWMgTGljZW5zZSAxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInNucHJpbnRmIjogWwogICAgICAgICJzbnByaW50ZiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTT0ZBIjogWwogICAgICAgICJTT0ZBIFNvZnR3YXJlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInNvZnRTdXJmZXIiOiBbCiAgICAgICAgInNvZnRTdXJmZXIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU291bmRleCI6IFsKICAgICAgICAiU291bmRleCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTcGVuY2VyLTg2IjogWwogICAgICAgICJTcGVuY2VyIExpY2Vuc2UgODYiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNwZW5jZXItOTQiOiBbCiAgICAgICAgIlNwZW5jZXIgTGljZW5zZSA5NCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU3BlbmNlci05OSI6IFsKICAgICAgICAiU3BlbmNlciBMaWNlbnNlIDk5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTUEwtMS4wIjogWwogICAgICAgICJTdW4gUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJzc2gta2V5c2NhbiI6IFsKICAgICAgICAic3NoLWtleXNjYW4gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU1NILU9wZW5TU0giOiBbCiAgICAgICAgIlNTSCBPcGVuU1NIIGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNTSC1zaG9ydCI6IFsKICAgICAgICAiU1NIIHNob3J0IG5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU1NMZWF5LXN0YW5kYWxvbmUiOiBbCiAgICAgICAgIlNTTGVheSBMaWNlbnNlIC0gc3RhbmRhbG9uZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU1NQTC0xLjAiOiBbCiAgICAgICAgIlNlcnZlciBTaWRlIFB1YmxpYyBMaWNlbnNlLCB2IDEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlN0YW5kYXJkTUwtTkoiOiBbCiAgICAgICAgIlN0YW5kYXJkIE1MIG9mIE5ldyBKZXJzZXkgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJTdWdhckNSTS0xLjEuMyI6IFsKICAgICAgICAiU3VnYXJDUk0gUHVibGljIExpY2Vuc2UgdjEuMS4zIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTdW4tUFBQIjogWwogICAgICAgICJTdW4gUFBQIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlN1bi1QUFAtMjAwMCI6IFsKICAgICAgICAiU3VuIFBQUCBMaWNlbnNlICgyMDAwKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU3VuUHJvIjogWwogICAgICAgICJTdW5Qcm8gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU1dMIjogWwogICAgICAgICJTY2hlbWUgV2lkZ2V0IExpYnJhcnkgKFNXTCkgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInN3cnVsZSI6IFsKICAgICAgICAic3dydWxlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlN5bWxpbmtzIjogWwogICAgICAgICJTeW1saW5rcyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUQVBSLU9ITC0xLjAiOiBbCiAgICAgICAgIlRBUFIgT3BlbiBIYXJkd2FyZSBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRDTCI6IFsKICAgICAgICAiVENML1RLIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRDUC13cmFwcGVycyI6IFsKICAgICAgICAiVENQIFdyYXBwZXJzIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRlcm1SZWFkS2V5IjogWwogICAgICAgICJUZXJtUmVhZEtleSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUR1BQTC0xLjAiOiBbCiAgICAgICAgIlRyYW5zaXRpdmUgR3JhY2UgUGVyaW9kIFB1YmxpYyBMaWNlbmNlIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVGhpcmRFeWUiOiBbCiAgICAgICAgIlRoaXJkRXllIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInRocmVlcGFydHRhYmxlIjogWwogICAgICAgICJ0aHJlZXBhcnR0YWJsZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUTWF0ZSI6IFsKICAgICAgICAiVE1hdGUgT3BlbiBTb3VyY2UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVE9SUVVFLTEuMSI6IFsKICAgICAgICAiVE9SUVVFIHYyLjUrIFNvZnR3YXJlIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVE9TTCI6IFsKICAgICAgICAiVHJ1c3N0ZXIgT3BlbiBTb3VyY2UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVFBETCI6IFsKICAgICAgICAiVGltZTo6UGFyc2VEYXRlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRQTC0xLjAiOiBbCiAgICAgICAgIlRIT1IgUHVibGljIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUcnVzdGVkUVNMIjogWwogICAgICAgICJUcnVzdGVkUVNMIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRUV0wiOiBbCiAgICAgICAgIlRleHQtVGFicytXcmFwIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRUWVAwIjogWwogICAgICAgICJUVFlQMCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUVS1CZXJsaW4tMS4wIjogWwogICAgICAgICJUZWNobmlzY2hlIFVuaXZlcnNpdGFldCBCZXJsaW4gTGljZW5zZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRVLUJlcmxpbi0yLjAiOiBbCiAgICAgICAgIlRlY2huaXNjaGUgVW5pdmVyc2l0YWV0IEJlcmxpbiBMaWNlbnNlIDIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVWJ1bnR1LWZvbnQtMS4wIjogWwogICAgICAgICJVYnVudHUgRm9udCBMaWNlbmNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVDQVIiOiBbCiAgICAgICAgIlVDQVIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVUNMLTEuMCI6IFsKICAgICAgICAiVXBzdHJlYW0gQ29tcGF0aWJpbGl0eSBMaWNlbnNlIHYxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAidWxlbSI6IFsKICAgICAgICAidWxlbSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVTWljaC1NZXJpdCI6IFsKICAgICAgICAiTWljaGlnYW4vTWVyaXQgTmV0d29ya3MgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVW5pY29kZS0zLjAiOiBbCiAgICAgICAgIlVuaWNvZGUgTGljZW5zZSB2MyIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVbmljb2RlLURGUy0yMDE1IjogWwogICAgICAgICJVbmljb2RlIExpY2Vuc2UgQWdyZWVtZW50IC0gRGF0YSBGaWxlcyBhbmQgU29mdHdhcmUgKDIwMTUpIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVbmljb2RlLURGUy0yMDE2IjogWwogICAgICAgICJVbmljb2RlIExpY2Vuc2UgQWdyZWVtZW50IC0gRGF0YSBGaWxlcyBhbmQgU29mdHdhcmUgKDIwMTYpIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVuaWNvZGUtVE9VIjogWwogICAgICAgICJVbmljb2RlIFRlcm1zIG9mIFVzZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVW5peENyeXB0IjogWwogICAgICAgICJVbml4Q3J5cHQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVW5saWNlbnNlIjogWwogICAgICAgICJUaGUgVW5saWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVubGljZW5zZS1saWJ0ZWxuZXQiOiBbCiAgICAgICAgIlVubGljZW5zZSAtIGxpYnRlbG5ldCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVbmxpY2Vuc2UtbGlid2hpcmxwb29sIjogWwogICAgICAgICJVbmxpY2Vuc2UgLSBsaWJ3aGlybHBvb2wgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVVBMLTEuMCI6IFsKICAgICAgICAiVW5pdmVyc2FsIFBlcm1pc3NpdmUgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVSVC1STEUiOiBbCiAgICAgICAgIlV0YWggUmFzdGVyIFRvb2xraXQgUnVuIExlbmd0aCBFbmNvZGVkIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlZpbSI6IFsKICAgICAgICAiVmltIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlZPU1RST00iOiBbCiAgICAgICAgIlZPU1RST00gUHVibGljIExpY2Vuc2UgZm9yIE9wZW4gU291cmNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJWU0wtMS4wIjogWwogICAgICAgICJWb3ZpZGEgU29mdHdhcmUgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlczQyI6IFsKICAgICAgICAiVzNDIFNvZnR3YXJlIE5vdGljZSBhbmQgTGljZW5zZSAoMjAwMi0xMi0zMSkiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVzNDLTE5OTgwNzIwIjogWwogICAgICAgICJXM0MgU29mdHdhcmUgTm90aWNlIGFuZCBMaWNlbnNlICgxOTk4LTA3LTIwKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVzNDLTIwMTUwNTEzIjogWwogICAgICAgICJXM0MgU29mdHdhcmUgTm90aWNlIGFuZCBEb2N1bWVudCBMaWNlbnNlICgyMDE1LTA1LTEzKSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ3M20iOiBbCiAgICAgICAgInczbSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJXYXRjb20tMS4wIjogWwogICAgICAgICJTeWJhc2UgT3BlbiBXYXRjb20gUHVibGljIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIldpZGdldC1Xb3Jrc2hvcCI6IFsKICAgICAgICAiV2lkZ2V0IFdvcmtzaG9wIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIldzdWlwYSI6IFsKICAgICAgICAiV3N1aXBhIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIldURlBMIjogWwogICAgICAgICJEbyBXaGF0IFRoZSBGKmNrIFlvdSBXYW50IFRvIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ3d2wiOiBbCiAgICAgICAgIldXTCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ3eFdpbmRvd3MiOiBbCiAgICAgICAgInd4V2luZG93cyBMaWJyYXJ5IExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJYMTEiOiBbCiAgICAgICAgIlgxMSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJYMTEtZGlzdHJpYnV0ZS1tb2RpZmljYXRpb25zLXZhcmlhbnQiOiBbCiAgICAgICAgIlgxMSBMaWNlbnNlIERpc3RyaWJ1dGlvbiBNb2RpZmljYXRpb24gVmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWDExLXN3YXBwZWQiOiBbCiAgICAgICAgIlgxMSBzd2FwcGVkIGZpbmFsIHBhcmFncmFwaHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlhkZWJ1Zy0xLjAzIjogWwogICAgICAgICJYZGVidWcgTGljZW5zZSB2IDEuMDMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlhlcm94IjogWwogICAgICAgICJYZXJveCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJYZmlnIjogWwogICAgICAgICJYZmlnIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlhGcmVlODYtMS4xIjogWwogICAgICAgICJYRnJlZTg2IExpY2Vuc2UgMS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ4aW5ldGQiOiBbCiAgICAgICAgInhpbmV0ZCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ4a2V5Ym9hcmQtY29uZmlnLVppbm92aWV2IjogWwogICAgICAgICJ4a2V5Ym9hcmQtY29uZmlnIFppbm92aWV2IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInhsb2NrIjogWwogICAgICAgICJ4bG9jayBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJYbmV0IjogWwogICAgICAgICJYLk5ldCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInhwcCI6IFsKICAgICAgICAiWFBQIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlhTa2F0IjogWwogICAgICAgICJYU2thdCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ4em9vbSI6IFsKICAgICAgICAieHpvb20gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWVBMLTEuMCI6IFsKICAgICAgICAiWWFob28hIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIllQTC0xLjEiOiBbCiAgICAgICAgIllhaG9vISBQdWJsaWMgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaZWQiOiBbCiAgICAgICAgIlplZCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaZWVmZiI6IFsKICAgICAgICAiWmVlZmYgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWmVuZC0yLjAiOiBbCiAgICAgICAgIlplbmQgTGljZW5zZSB2Mi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaaW1icmEtMS4zIjogWwogICAgICAgICJaaW1icmEgUHVibGljIExpY2Vuc2UgdjEuMyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWmltYnJhLTEuNCI6IFsKICAgICAgICAiWmltYnJhIFB1YmxpYyBMaWNlbnNlIHYxLjQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlpsaWIiOiBbCiAgICAgICAgInpsaWIgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ6bGliLWFja25vd2xlZGdlbWVudCI6IFsKICAgICAgICAiemxpYi9saWJwbmcgTGljZW5zZSB3aXRoIEFja25vd2xlZGdlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWlBMLTEuMSI6IFsKICAgICAgICAiWm9wZSBQdWJsaWMgTGljZW5zZSAxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlpQTC0yLjAiOiBbCiAgICAgICAgIlpvcGUgUHVibGljIExpY2Vuc2UgMi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlpQTC0yLjEiOiBbCiAgICAgICAgIlpvcGUgUHVibGljIExpY2Vuc2UgMi4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdCn08P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNwZHg7CgpjbGFzcyBTcGR4TGljZW5zZXMKewoKY29uc3QgTElDRU5TRVNfRklMRSA9ICdzcGR4LWxpY2Vuc2VzLmpzb24nOwoKCmNvbnN0IEVYQ0VQVElPTlNfRklMRSA9ICdzcGR4LWV4Y2VwdGlvbnMuanNvbic7CgoKCgoKCgoKCgoKCgoKcHJpdmF0ZSAkbGljZW5zZXM7CgoKCgpwcml2YXRlICRsaWNlbnNlc0V4cHJlc3Npb247CgoKCgoKCgoKCgoKCgoKcHJpdmF0ZSAkZXhjZXB0aW9uczsKCgoKCnByaXZhdGUgJGV4Y2VwdGlvbnNFeHByZXNzaW9uOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKewokdGhpcy0+bG9hZExpY2Vuc2VzKCk7CiR0aGlzLT5sb2FkRXhjZXB0aW9ucygpOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGljZW5zZUJ5SWRlbnRpZmllcigkaWRlbnRpZmllcikKewoka2V5ID0gc3RydG9sb3dlcigkaWRlbnRpZmllcik7CgppZiAoIWlzc2V0KCR0aGlzLT5saWNlbnNlc1ska2V5XSkpIHsKcmV0dXJuIG51bGw7Cn0KCmxpc3QoJGlkZW50aWZpZXIsICRuYW1lLCAkaXNPc2lBcHByb3ZlZCwgJGlzRGVwcmVjYXRlZExpY2Vuc2VJZCkgPSAkdGhpcy0+bGljZW5zZXNbJGtleV07CgpyZXR1cm4gYXJyYXkoCiRuYW1lLAokaXNPc2lBcHByb3ZlZCwKJ2h0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvJyAuICRpZGVudGlmaWVyIC4gJy5odG1sI2xpY2Vuc2VUZXh0JywKJGlzRGVwcmVjYXRlZExpY2Vuc2VJZCwKKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGljZW5zZXMoKQp7CnJldHVybiAkdGhpcy0+bGljZW5zZXM7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFeGNlcHRpb25CeUlkZW50aWZpZXIoJGlkZW50aWZpZXIpCnsKJGtleSA9IHN0cnRvbG93ZXIoJGlkZW50aWZpZXIpOwoKaWYgKCFpc3NldCgkdGhpcy0+ZXhjZXB0aW9uc1ska2V5XSkpIHsKcmV0dXJuIG51bGw7Cn0KCmxpc3QoJGlkZW50aWZpZXIsICRuYW1lKSA9ICR0aGlzLT5leGNlcHRpb25zWyRrZXldOwoKcmV0dXJuIGFycmF5KAokbmFtZSwKJ2h0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvJyAuICRpZGVudGlmaWVyIC4gJy5odG1sI2xpY2Vuc2VFeGNlcHRpb25UZXh0JywKKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJZGVudGlmaWVyQnlOYW1lKCRuYW1lKQp7CmZvcmVhY2ggKCR0aGlzLT5saWNlbnNlcyBhcyAkbGljZW5zZURhdGEpIHsKaWYgKCRsaWNlbnNlRGF0YVsxXSA9PT0gJG5hbWUpIHsKcmV0dXJuICRsaWNlbnNlRGF0YVswXTsKfQp9Cgpmb3JlYWNoICgkdGhpcy0+ZXhjZXB0aW9ucyBhcyAkbGljZW5zZURhdGEpIHsKaWYgKCRsaWNlbnNlRGF0YVsxXSA9PT0gJG5hbWUpIHsKcmV0dXJuICRsaWNlbnNlRGF0YVswXTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc09zaUFwcHJvdmVkQnlJZGVudGlmaWVyKCRpZGVudGlmaWVyKQp7CnJldHVybiAkdGhpcy0+bGljZW5zZXNbc3RydG9sb3dlcigkaWRlbnRpZmllcildWzJdOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVwcmVjYXRlZEJ5SWRlbnRpZmllcigkaWRlbnRpZmllcikKewpyZXR1cm4gJHRoaXMtPmxpY2Vuc2VzW3N0cnRvbG93ZXIoJGlkZW50aWZpZXIpXVszXTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgkbGljZW5zZSkKewppZiAoaXNfYXJyYXkoJGxpY2Vuc2UpKSB7CiRjb3VudCA9IGNvdW50KCRsaWNlbnNlKTsKaWYgKCRjb3VudCAhPT0gY291bnQoYXJyYXlfZmlsdGVyKCRsaWNlbnNlLCAnaXNfc3RyaW5nJykpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdBcnJheSBvZiBzdHJpbmdzIGV4cGVjdGVkLicpOwp9CiRsaWNlbnNlID0gJGNvdW50ID4gMSA/ICcoJyAuIGltcGxvZGUoJyBPUiAnLCAkbGljZW5zZSkgLiAnKScgOiAoc3RyaW5nKSByZXNldCgkbGljZW5zZSk7Cn0KCmlmICghaXNfc3RyaW5nKCRsaWNlbnNlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAonQXJyYXkgb3IgU3RyaW5nIGV4cGVjdGVkLCAlcyBnaXZlbi4nLApnZXR0eXBlKCRsaWNlbnNlKQopKTsKfQoKcmV0dXJuICR0aGlzLT5pc1ZhbGlkTGljZW5zZVN0cmluZygkbGljZW5zZSk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVzb3VyY2VzRGlyKCkKewpyZXR1cm4gZGlybmFtZShfX0RJUl9fKSAuICcvcmVzJzsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2FkTGljZW5zZXMoKQp7CmlmIChudWxsICE9PSAkdGhpcy0+bGljZW5zZXMpIHsKcmV0dXJuOwp9CgokanNvbiA9IGZpbGVfZ2V0X2NvbnRlbnRzKHNlbGY6OmdldFJlc291cmNlc0RpcigpIC4gJy8nIC4gc2VsZjo6TElDRU5TRVNfRklMRSk7CmlmIChmYWxzZSA9PT0gJGpzb24pIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdNaXNzaW5nIGxpY2Vuc2UgZmlsZSBpbiAnIC4gc2VsZjo6Z2V0UmVzb3VyY2VzRGlyKCkgLiAnLycgLiBzZWxmOjpMSUNFTlNFU19GSUxFKTsKfQokdGhpcy0+bGljZW5zZXMgPSBhcnJheSgpOwoKZm9yZWFjaCAoanNvbl9kZWNvZGUoJGpzb24sIHRydWUpIGFzICRpZGVudGlmaWVyID0+ICRsaWNlbnNlKSB7CiR0aGlzLT5saWNlbnNlc1tzdHJ0b2xvd2VyKCRpZGVudGlmaWVyKV0gPSBhcnJheSgkaWRlbnRpZmllciwgJGxpY2Vuc2VbMF0sICRsaWNlbnNlWzFdLCAkbGljZW5zZVsyXSk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2FkRXhjZXB0aW9ucygpCnsKaWYgKG51bGwgIT09ICR0aGlzLT5leGNlcHRpb25zKSB7CnJldHVybjsKfQoKJGpzb24gPSBmaWxlX2dldF9jb250ZW50cyhzZWxmOjpnZXRSZXNvdXJjZXNEaXIoKSAuICcvJyAuIHNlbGY6OkVYQ0VQVElPTlNfRklMRSk7CmlmIChmYWxzZSA9PT0gJGpzb24pIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdNaXNzaW5nIGV4Y2VwdGlvbnMgZmlsZSBpbiAnIC4gc2VsZjo6Z2V0UmVzb3VyY2VzRGlyKCkgLiAnLycgLiBzZWxmOjpFWENFUFRJT05TX0ZJTEUpOwp9CiR0aGlzLT5leGNlcHRpb25zID0gYXJyYXkoKTsKCmZvcmVhY2ggKGpzb25fZGVjb2RlKCRqc29uLCB0cnVlKSBhcyAkaWRlbnRpZmllciA9PiAkZXhjZXB0aW9uKSB7CiR0aGlzLT5leGNlcHRpb25zW3N0cnRvbG93ZXIoJGlkZW50aWZpZXIpXSA9IGFycmF5KCRpZGVudGlmaWVyLCAkZXhjZXB0aW9uWzBdKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldExpY2Vuc2VzRXhwcmVzc2lvbigpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5saWNlbnNlc0V4cHJlc3Npb24pIHsKJGxpY2Vuc2VzID0gYXJyYXlfbWFwKCdwcmVnX3F1b3RlJywgYXJyYXlfa2V5cygkdGhpcy0+bGljZW5zZXMpKTsKcnNvcnQoJGxpY2Vuc2VzKTsKJGxpY2Vuc2VzID0gaW1wbG9kZSgnfCcsICRsaWNlbnNlcyk7CiR0aGlzLT5saWNlbnNlc0V4cHJlc3Npb24gPSAkbGljZW5zZXM7Cn0KCnJldHVybiAkdGhpcy0+bGljZW5zZXNFeHByZXNzaW9uOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEV4Y2VwdGlvbnNFeHByZXNzaW9uKCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmV4Y2VwdGlvbnNFeHByZXNzaW9uKSB7CiRleGNlcHRpb25zID0gYXJyYXlfbWFwKCdwcmVnX3F1b3RlJywgYXJyYXlfa2V5cygkdGhpcy0+ZXhjZXB0aW9ucykpOwpyc29ydCgkZXhjZXB0aW9ucyk7CiRleGNlcHRpb25zID0gaW1wbG9kZSgnfCcsICRleGNlcHRpb25zKTsKJHRoaXMtPmV4Y2VwdGlvbnNFeHByZXNzaW9uID0gJGV4Y2VwdGlvbnM7Cn0KCnJldHVybiAkdGhpcy0+ZXhjZXB0aW9uc0V4cHJlc3Npb247Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzVmFsaWRMaWNlbnNlU3RyaW5nKCRsaWNlbnNlKQp7CmlmIChpc3NldCgkdGhpcy0+bGljZW5zZXNbc3RydG9sb3dlcigkbGljZW5zZSldKSkgewpyZXR1cm4gdHJ1ZTsKfQoKJGxpY2Vuc2VzID0gJHRoaXMtPmdldExpY2Vuc2VzRXhwcmVzc2lvbigpOwokZXhjZXB0aW9ucyA9ICR0aGlzLT5nZXRFeGNlcHRpb25zRXhwcmVzc2lvbigpOwoKJHJlZ2V4ID0gPDw8UkVHRVgKewooPyhERUZJTkUpCiAgICAjIGlkc3RyaW5nOiAxKiggQUxQSEEgLyBESUdJVCAvIC0gLyAuICkKICAgICg/PGlkc3RyaW5nPltccExccE4uLV17MSx9KQoKICAgICMgbGljZW5zZS1pZDogdGFrZW4gZnJvbSBsaXN0CiAgICAoPzxsaWNlbnNlaWQ+eyRsaWNlbnNlc30pCgogICAgIyBsaWNlbnNlLWV4Y2VwdGlvbi1pZDogdGFrZW4gZnJvbSBsaXN0CiAgICAoPzxsaWNlbnNlZXhjZXB0aW9uaWQ+eyRleGNlcHRpb25zfSkKCiAgICAjIGxpY2Vuc2UtcmVmOiBbRG9jdW1lbnRSZWYtMSooaWRzdHJpbmcpOl1MaWNlbnNlUmVmLTEqKGlkc3RyaW5nKQogICAgKD88bGljZW5zZXJlZj4oPzpEb2N1bWVudFJlZi0oPyZpZHN0cmluZyk6KT9MaWNlbnNlUmVmLSg/Jmlkc3RyaW5nKSkKCiAgICAjIHNpbXBsZS1leHByZXNzc2lvbjogbGljZW5zZS1pZCAvIGxpY2Vuc2UtaWQrIC8gbGljZW5zZS1yZWYKICAgICg/PHNpbXBsZV9leHByZXNzaW9uPig/JmxpY2Vuc2VpZClcKz8gfCAoPyZsaWNlbnNlaWQpIHwgKD8mbGljZW5zZXJlZikpCgogICAgIyBjb21wb3VuZC1leHByZXNzaW9uOiAxKigKICAgICMgICBzaW1wbGUtZXhwcmVzc2lvbiAvCiAgICAjICAgc2ltcGxlLWV4cHJlc3Npb24gV0lUSCBsaWNlbnNlLWV4Y2VwdGlvbi1pZCAvCiAgICAjICAgY29tcG91bmQtZXhwcmVzc2lvbiBBTkQgY29tcG91bmQtZXhwcmVzc2lvbiAvCiAgICAjICAgY29tcG91bmQtZXhwcmVzc2lvbiBPUiBjb21wb3VuZC1leHByZXNzaW9uCiAgICAjICkgLyAoIGNvbXBvdW5kLWV4cHJlc3Npb24gKSApCiAgICAoPzxjb21wb3VuZF9oZWFkPgogICAgICAgICg/JnNpbXBsZV9leHByZXNzaW9uKSAoIFxzKyBXSVRIIFxzKyAoPyZsaWNlbnNlZXhjZXB0aW9uaWQpKT8KICAgICAgICAgICAgfCBcKCBccyogKD8mY29tcG91bmRfZXhwcmVzc2lvbikgXHMqIFwpCiAgICApCiAgICAoPzxjb21wb3VuZF9leHByZXNzaW9uPgogICAgICAgICg/JmNvbXBvdW5kX2hlYWQpICg/OiBccysgKD86QU5EfE9SKSBccysgKD8mY29tcG91bmRfZXhwcmVzc2lvbikpPwogICAgKQoKICAgICMgbGljZW5zZS1leHByZXNzaW9uOiAxKjEoc2ltcGxlLWV4cHJlc3Npb24gLyBjb21wb3VuZC1leHByZXNzaW9uKQogICAgKD88bGljZW5zZV9leHByZXNzaW9uPig/JmNvbXBvdW5kX2V4cHJlc3Npb24pIHwgKD8mc2ltcGxlX2V4cHJlc3Npb24pKQopICMgZW5kIG9mIGRlZmluZQoKXihOT05FIHwgTk9BU1NFUlRJT04gfCAoPyZsaWNlbnNlX2V4cHJlc3Npb24pKSQKfXhpClJFR0VYOwoKJG1hdGNoID0gcHJlZ19tYXRjaCgkcmVnZXgsICRsaWNlbnNlKTsKCmlmICgwID09PSAkbWF0Y2gpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoZmFsc2UgPT09ICRtYXRjaCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1JlZ2V4IGZhaWxlZCB0byBjb21waWxlL3J1bi4nKTsKfQoKcmV0dXJuIHRydWU7Cn0KfQoKTUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAxNyBDb21wb3NlcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KCjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxYZGVidWdIYW5kbGVyOwoKCgoKCgpjbGFzcyBQaHBDb25maWcKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1c2VPcmlnaW5hbCgpOiBhcnJheQp7CiR0aGlzLT5nZXREYXRhQW5kUmVzZXQoKTsKcmV0dXJuIFtdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1c2VTdGFuZGFyZCgpOiBhcnJheQp7CiRkYXRhID0gJHRoaXMtPmdldERhdGFBbmRSZXNldCgpOwppZiAoJGRhdGEgIT09IG51bGwpIHsKcmV0dXJuIFsnLW4nLCAnLWMnLCAkZGF0YVsndG1wSW5pJ11dOwp9CgpyZXR1cm4gW107Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVzZVBlcnNpc3RlbnQoKTogYXJyYXkKewokZGF0YSA9ICR0aGlzLT5nZXREYXRhQW5kUmVzZXQoKTsKaWYgKCRkYXRhICE9PSBudWxsKSB7CiR0aGlzLT51cGRhdGVFbnYoJ1BIUFJDJywgJGRhdGFbJ3RtcEluaSddKTsKJHRoaXMtPnVwZGF0ZUVudignUEhQX0lOSV9TQ0FOX0RJUicsICcnKTsKfQoKcmV0dXJuIFtdOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGF0YUFuZFJlc2V0KCk6ID9hcnJheQp7CiRkYXRhID0gWGRlYnVnSGFuZGxlcjo6Z2V0UmVzdGFydFNldHRpbmdzKCk7CmlmICgkZGF0YSAhPT0gbnVsbCkgewokdGhpcy0+dXBkYXRlRW52KCdQSFBSQycsICRkYXRhWydwaHByYyddKTsKJHRoaXMtPnVwZGF0ZUVudignUEhQX0lOSV9TQ0FOX0RJUicsICRkYXRhWydzY2FuRGlyJ10pOwp9CgpyZXR1cm4gJGRhdGE7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdXBkYXRlRW52KHN0cmluZyAkbmFtZSwgJHZhbHVlKTogdm9pZAp7ClByb2Nlc3M6OnNldEVudigkbmFtZSwgZmFsc2UgIT09ICR2YWx1ZSA/ICR2YWx1ZSA6IG51bGwpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIENvbXBvc2VyXFhkZWJ1Z0hhbmRsZXI7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCgpjbGFzcyBQcm9jZXNzCnsKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXNjYXBlKHN0cmluZyAkYXJnLCBib29sICRtZXRhID0gdHJ1ZSwgYm9vbCAkbW9kdWxlID0gZmFsc2UpOiBzdHJpbmcKewppZiAoIWRlZmluZWQoJ1BIUF9XSU5ET1dTX1ZFUlNJT05fQlVJTEQnKSkgewpyZXR1cm4gIiciLnN0cl9yZXBsYWNlKCInIiwgIidcXCcnIiwgJGFyZykuIiciOwp9CgokcXVvdGUgPSBzdHJwYnJrKCRhcmcsICIgXHQiKSAhPT0gZmFsc2UgfHwgJGFyZyA9PT0gJyc7CgokYXJnID0gUHJlZzo6cmVwbGFjZSgnLyhcXFxcKikiLycsICckMSQxXFwiJywgJGFyZywgLTEsICRkcXVvdGVzKTsKJGRxdW90ZXMgPSAoYm9vbCkgJGRxdW90ZXM7CgppZiAoJG1ldGEpIHsKJG1ldGEgPSAkZHF1b3RlcyB8fCBQcmVnOjppc01hdGNoKCcvJVteJV0rJS8nLCAkYXJnKTsKCmlmICghJG1ldGEpIHsKJHF1b3RlID0gJHF1b3RlIHx8IHN0cnBicmsoJGFyZywgJ14mfDw+KCknKSAhPT0gZmFsc2U7Cn0gZWxzZWlmICgkbW9kdWxlICYmICEkZHF1b3RlcyAmJiAkcXVvdGUpIHsKJG1ldGEgPSBmYWxzZTsKfQp9CgppZiAoJHF1b3RlKSB7CiRhcmcgPSAnIicuKFByZWc6OnJlcGxhY2UoJy8oXFxcXCopJC8nLCAnJDEkMScsICRhcmcpKS4nIic7Cn0KCmlmICgkbWV0YSkgewokYXJnID0gUHJlZzo6cmVwbGFjZSgnLyhbIl4mfDw+KCklXSkvJywgJ14kMScsICRhcmcpOwp9CgpyZXR1cm4gJGFyZzsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVzY2FwZVNoZWxsQ29tbWFuZChhcnJheSAkYXJncyk6IHN0cmluZwp7CiRjb21tYW5kID0gJyc7CiRtb2R1bGUgPSBhcnJheV9zaGlmdCgkYXJncyk7CgppZiAoJG1vZHVsZSAhPT0gbnVsbCkgewokY29tbWFuZCA9IHNlbGY6OmVzY2FwZSgkbW9kdWxlLCB0cnVlLCB0cnVlKTsKCmZvcmVhY2ggKCRhcmdzIGFzICRhcmcpIHsKJGNvbW1hbmQgLj0gJyAnLnNlbGY6OmVzY2FwZSgkYXJnKTsKfQp9CgpyZXR1cm4gJGNvbW1hbmQ7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0RW52KHN0cmluZyAkbmFtZSwgP3N0cmluZyAkdmFsdWUgPSBudWxsKTogYm9vbAp7CiR1bnNldCA9IG51bGwgPT09ICR2YWx1ZTsKCmlmICghcHV0ZW52KCR1bnNldCA/ICRuYW1lIDogJG5hbWUuJz0nLiR2YWx1ZSkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHVuc2V0KSB7CnVuc2V0KCRfU0VSVkVSWyRuYW1lXSk7Cn0gZWxzZSB7CiRfU0VSVkVSWyRuYW1lXSA9ICR2YWx1ZTsKfQoKCmlmIChmYWxzZSAhPT0gc3RyaXBvcygoc3RyaW5nKSBpbmlfZ2V0KCd2YXJpYWJsZXNfb3JkZXInKSwgJ0UnKSkgewppZiAoJHVuc2V0KSB7CnVuc2V0KCRfRU5WWyRuYW1lXSk7Cn0gZWxzZSB7CiRfRU5WWyRuYW1lXSA9ICR2YWx1ZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBDb21wb3NlclxYZGVidWdIYW5kbGVyOwoKdXNlIFBzclxMb2dcTG9nZ2VySW50ZXJmYWNlOwp1c2UgUHNyXExvZ1xMb2dMZXZlbDsKCgoKCgpjbGFzcyBTdGF0dXMKewpjb25zdCBFTlZfUkVTVEFSVCA9ICdYREVCVUdfSEFORExFUl9SRVNUQVJUJzsKY29uc3QgQ0hFQ0sgPSAnQ2hlY2snOwpjb25zdCBFUlJPUiA9ICdFcnJvcic7CmNvbnN0IElORk8gPSAnSW5mbyc7CmNvbnN0IE5PUkVTVEFSVCA9ICdOb1Jlc3RhcnQnOwpjb25zdCBSRVNUQVJUID0gJ1Jlc3RhcnQnOwpjb25zdCBSRVNUQVJUSU5HID0gJ1Jlc3RhcnRpbmcnOwpjb25zdCBSRVNUQVJURUQgPSAnUmVzdGFydGVkJzsKCgpwcml2YXRlICRkZWJ1ZzsKCgpwcml2YXRlICRlbnZBbGxvd1hkZWJ1ZzsKCgpwcml2YXRlICRsb2FkZWQ7CgoKcHJpdmF0ZSAkbG9nZ2VyOwoKCnByaXZhdGUgJG1vZGVPZmY7CgoKcHJpdmF0ZSAkdGltZTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRlbnZBbGxvd1hkZWJ1ZywgYm9vbCAkZGVidWcpCnsKJHN0YXJ0ID0gZ2V0ZW52KHNlbGY6OkVOVl9SRVNUQVJUKTsKUHJvY2Vzczo6c2V0RW52KHNlbGY6OkVOVl9SRVNUQVJUKTsKJHRoaXMtPnRpbWUgPSBpc19udW1lcmljKCRzdGFydCkgPyByb3VuZCgobWljcm90aW1lKHRydWUpIC0gJHN0YXJ0KSAqIDEwMDApIDogMDsKCiR0aGlzLT5lbnZBbGxvd1hkZWJ1ZyA9ICRlbnZBbGxvd1hkZWJ1ZzsKJHRoaXMtPmRlYnVnID0gJGRlYnVnICYmIGRlZmluZWQoJ1NUREVSUicpOwokdGhpcy0+bW9kZU9mZiA9IGZhbHNlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2dnZXIoTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIpOiB2b2lkCnsKJHRoaXMtPmxvZ2dlciA9ICRsb2dnZXI7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlcG9ydChzdHJpbmcgJG9wLCA/c3RyaW5nICRkYXRhKTogdm9pZAp7CmlmICgkdGhpcy0+bG9nZ2VyICE9PSBudWxsIHx8ICR0aGlzLT5kZWJ1ZykgewokcGFyYW0gPSAoc3RyaW5nKSAkZGF0YTsKCnN3aXRjaCgkb3ApIHsKY2FzZSBzZWxmOjpDSEVDSzoKJHRoaXMtPnJlcG9ydENoZWNrKCRwYXJhbSk7CmJyZWFrOwpjYXNlIHNlbGY6OkVSUk9SOgokdGhpcy0+cmVwb3J0RXJyb3IoJHBhcmFtKTsKYnJlYWs7CmNhc2Ugc2VsZjo6SU5GTzoKJHRoaXMtPnJlcG9ydEluZm8oJHBhcmFtKTsKYnJlYWs7CmNhc2Ugc2VsZjo6Tk9SRVNUQVJUOgokdGhpcy0+cmVwb3J0Tm9SZXN0YXJ0KCk7CmJyZWFrOwpjYXNlIHNlbGY6OlJFU1RBUlQ6CiR0aGlzLT5yZXBvcnRSZXN0YXJ0KCk7CmJyZWFrOwpjYXNlIHNlbGY6OlJFU1RBUlRFRDoKJHRoaXMtPnJlcG9ydFJlc3RhcnRlZCgpOwpicmVhazsKY2FzZSBzZWxmOjpSRVNUQVJUSU5HOgokdGhpcy0+cmVwb3J0UmVzdGFydGluZygkcGFyYW0pOwpicmVhazsKZGVmYXVsdDoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vua25vd24gb3AgaGFuZGxlcjogJy4kb3ApOwp9Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdXRwdXQoc3RyaW5nICR0ZXh0LCA/c3RyaW5nICRsZXZlbCA9IG51bGwpOiB2b2lkCnsKaWYgKCR0aGlzLT5sb2dnZXIgIT09IG51bGwpIHsKJHRoaXMtPmxvZ2dlci0+bG9nKCRsZXZlbCAhPT0gbnVsbCA/ICRsZXZlbDogTG9nTGV2ZWw6OkRFQlVHLCAkdGV4dCk7Cn0KCmlmICgkdGhpcy0+ZGVidWcpIHsKZndyaXRlKFNUREVSUiwgc3ByaW50ZigneGRlYnVnLWhhbmRsZXJbJWRdICVzJywgZ2V0bXlwaWQoKSwgJHRleHQuUEhQX0VPTCkpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVwb3J0Q2hlY2soc3RyaW5nICRsb2FkZWQpOiB2b2lkCnsKbGlzdCgkdmVyc2lvbiwgJG1vZGUpID0gZXhwbG9kZSgnfCcsICRsb2FkZWQpOwoKaWYgKCR2ZXJzaW9uICE9PSAnJykgewokdGhpcy0+bG9hZGVkID0gJygnLiR2ZXJzaW9uLicpJy4oJG1vZGUgIT09ICcnID8gJyB4ZGVidWcubW9kZT0nLiRtb2RlIDogJycpOwp9CiR0aGlzLT5tb2RlT2ZmID0gJG1vZGUgPT09ICdvZmYnOwokdGhpcy0+b3V0cHV0KCdDaGVja2luZyAnLiR0aGlzLT5lbnZBbGxvd1hkZWJ1Zyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVwb3J0RXJyb3Ioc3RyaW5nICRlcnJvcik6IHZvaWQKewokdGhpcy0+b3V0cHV0KHNwcmludGYoJ05vIHJlc3RhcnQgKCVzKScsICRlcnJvciksIExvZ0xldmVsOjpXQVJOSU5HKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXBvcnRJbmZvKHN0cmluZyAkaW5mbyk6IHZvaWQKewokdGhpcy0+b3V0cHV0KCRpbmZvKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXBvcnROb1Jlc3RhcnQoKTogdm9pZAp7CiR0aGlzLT5vdXRwdXQoJHRoaXMtPmdldExvYWRlZE1lc3NhZ2UoKSk7CgppZiAoJHRoaXMtPmxvYWRlZCAhPT0gbnVsbCkgewokdGV4dCA9IHNwcmludGYoJ05vIHJlc3RhcnQgKCVzKScsICR0aGlzLT5nZXRFbnZBbGxvdygpKTsKaWYgKCEoKGJvb2wpIGdldGVudigkdGhpcy0+ZW52QWxsb3dYZGVidWcpKSkgewokdGV4dCAuPSAnIEFsbG93ZWQgYnkgJy4oJHRoaXMtPm1vZGVPZmYgPyAneGRlYnVnLm1vZGUnIDogJ2FwcGxpY2F0aW9uJyk7Cn0KJHRoaXMtPm91dHB1dCgkdGV4dCk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXBvcnRSZXN0YXJ0KCk6IHZvaWQKewokdGhpcy0+b3V0cHV0KCR0aGlzLT5nZXRMb2FkZWRNZXNzYWdlKCkpOwpQcm9jZXNzOjpzZXRFbnYoc2VsZjo6RU5WX1JFU1RBUlQsIChzdHJpbmcpIG1pY3JvdGltZSh0cnVlKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVwb3J0UmVzdGFydGVkKCk6IHZvaWQKewokbG9hZGVkID0gJHRoaXMtPmdldExvYWRlZE1lc3NhZ2UoKTsKJHRleHQgPSBzcHJpbnRmKCdSZXN0YXJ0ZWQgKCVkIG1zKS4gJXMnLCAkdGhpcy0+dGltZSwgJGxvYWRlZCk7CiRsZXZlbCA9ICR0aGlzLT5sb2FkZWQgIT09IG51bGwgPyBMb2dMZXZlbDo6V0FSTklORyA6IG51bGw7CiR0aGlzLT5vdXRwdXQoJHRleHQsICRsZXZlbCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVwb3J0UmVzdGFydGluZyhzdHJpbmcgJGNvbW1hbmQpOiB2b2lkCnsKJHRleHQgPSBzcHJpbnRmKCdQcm9jZXNzIHJlc3RhcnRpbmcgKCVzKScsICR0aGlzLT5nZXRFbnZBbGxvdygpKTsKJHRoaXMtPm91dHB1dCgkdGV4dCk7CiR0ZXh0ID0gJ1J1bm5pbmc6ICcuJGNvbW1hbmQ7CiR0aGlzLT5vdXRwdXQoJHRleHQpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEVudkFsbG93KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZW52QWxsb3dYZGVidWcuJz0nLmdldGVudigkdGhpcy0+ZW52QWxsb3dYZGVidWcpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldExvYWRlZE1lc3NhZ2UoKTogc3RyaW5nCnsKJGxvYWRlZCA9ICR0aGlzLT5sb2FkZWQgIT09IG51bGwgPyBzcHJpbnRmKCdsb2FkZWQgJXMnLCAkdGhpcy0+bG9hZGVkKSA6ICdub3QgbG9hZGVkJzsKcmV0dXJuICdUaGUgWGRlYnVnIGV4dGVuc2lvbiBpcyAnLiRsb2FkZWQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgQ29tcG9zZXJcWGRlYnVnSGFuZGxlcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBQc3JcTG9nXExvZ2dlckludGVyZmFjZTsKCgoKCgoKY2xhc3MgWGRlYnVnSGFuZGxlcgp7CmNvbnN0IFNVRkZJWF9BTExPVyA9ICdfQUxMT1dfWERFQlVHJzsKY29uc3QgU1VGRklYX0lOSVMgPSAnX09SSUdJTkFMX0lOSVMnOwpjb25zdCBSRVNUQVJUX0lEID0gJ2ludGVybmFsJzsKY29uc3QgUkVTVEFSVF9TRVRUSU5HUyA9ICdYREVCVUdfSEFORExFUl9TRVRUSU5HUyc7CmNvbnN0IERFQlVHID0gJ1hERUJVR19IQU5ETEVSX0RFQlVHJzsKCgpwcm90ZWN0ZWQgJHRtcEluaTsKCgpwcml2YXRlIHN0YXRpYyAkaW5SZXN0YXJ0OwoKCnByaXZhdGUgc3RhdGljICRuYW1lOwoKCnByaXZhdGUgc3RhdGljICRza2lwcGVkOwoKCnByaXZhdGUgc3RhdGljICR4ZGVidWdBY3RpdmU7CgoKcHJpdmF0ZSBzdGF0aWMgJHhkZWJ1Z01vZGU7CgoKcHJpdmF0ZSBzdGF0aWMgJHhkZWJ1Z1ZlcnNpb247CgoKcHJpdmF0ZSAkY2xpOwoKCnByaXZhdGUgJGRlYnVnOwoKCnByaXZhdGUgJGVudkFsbG93WGRlYnVnOwoKCnByaXZhdGUgJGVudk9yaWdpbmFsSW5pczsKCgpwcml2YXRlICRwZXJzaXN0ZW50OwoKCnByaXZhdGUgJHNjcmlwdDsKCgpwcml2YXRlICRzdGF0dXNXcml0ZXI7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZW52UHJlZml4KQp7CmlmICgkZW52UHJlZml4ID09PSAnJykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ludmFsaWQgY29uc3RydWN0b3IgcGFyYW1ldGVyJyk7Cn0KCnNlbGY6OiRuYW1lID0gc3RydG91cHBlcigkZW52UHJlZml4KTsKJHRoaXMtPmVudkFsbG93WGRlYnVnID0gc2VsZjo6JG5hbWUuc2VsZjo6U1VGRklYX0FMTE9XOwokdGhpcy0+ZW52T3JpZ2luYWxJbmlzID0gc2VsZjo6JG5hbWUuc2VsZjo6U1VGRklYX0lOSVM7CgpzZWxmOjpzZXRYZGVidWdEZXRhaWxzKCk7CnNlbGY6OiRpblJlc3RhcnQgPSBmYWxzZTsKCmlmICgkdGhpcy0+Y2xpID0gUEhQX1NBUEkgPT09ICdjbGknKSB7CiR0aGlzLT5kZWJ1ZyA9IChzdHJpbmcpIGdldGVudihzZWxmOjpERUJVRyk7Cn0KCiR0aGlzLT5zdGF0dXNXcml0ZXIgPSBuZXcgU3RhdHVzKCR0aGlzLT5lbnZBbGxvd1hkZWJ1ZywgKGJvb2wpICR0aGlzLT5kZWJ1Zyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2dnZXIoTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIpOiBzZWxmCnsKJHRoaXMtPnN0YXR1c1dyaXRlci0+c2V0TG9nZ2VyKCRsb2dnZXIpOwpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNYWluU2NyaXB0KHN0cmluZyAkc2NyaXB0KTogc2VsZgp7CiR0aGlzLT5zY3JpcHQgPSAkc2NyaXB0OwpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQZXJzaXN0ZW50KCk6IHNlbGYKewokdGhpcy0+cGVyc2lzdGVudCA9IHRydWU7CnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygpOiB2b2lkCnsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OkNIRUNLLCBzZWxmOjokeGRlYnVnVmVyc2lvbi4nfCcuc2VsZjo6JHhkZWJ1Z01vZGUpOwokZW52QXJncyA9IGV4cGxvZGUoJ3wnLCAoc3RyaW5nKSBnZXRlbnYoJHRoaXMtPmVudkFsbG93WGRlYnVnKSk7CgppZiAoISgoYm9vbCkgJGVudkFyZ3NbMF0pICYmICR0aGlzLT5yZXF1aXJlc1Jlc3RhcnQoc2VsZjo6JHhkZWJ1Z0FjdGl2ZSkpIHsKCiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpSRVNUQVJUKTsKJGNvbW1hbmQgPSAkdGhpcy0+cHJlcGFyZVJlc3RhcnQoKTsKCmlmICgkY29tbWFuZCAhPT0gbnVsbCkgewokdGhpcy0+cmVzdGFydCgkY29tbWFuZCk7Cn0KcmV0dXJuOwp9CgppZiAoc2VsZjo6UkVTVEFSVF9JRCA9PT0gJGVudkFyZ3NbMF0gJiYgY291bnQoJGVudkFyZ3MpID09PSA1KSB7CgokdGhpcy0+bm90aWZ5KFN0YXR1czo6UkVTVEFSVEVEKTsKClByb2Nlc3M6OnNldEVudigkdGhpcy0+ZW52QWxsb3dYZGVidWcpOwpzZWxmOjokaW5SZXN0YXJ0ID0gdHJ1ZTsKCmlmIChzZWxmOjokeGRlYnVnVmVyc2lvbiA9PT0gbnVsbCkgewoKc2VsZjo6JHNraXBwZWQgPSAkZW52QXJnc1sxXTsKfQoKJHRoaXMtPnRyeUVuYWJsZVNpZ25hbHMoKTsKCgokdGhpcy0+c2V0RW52UmVzdGFydFNldHRpbmdzKCRlbnZBcmdzKTsKcmV0dXJuOwp9CgokdGhpcy0+bm90aWZ5KFN0YXR1czo6Tk9SRVNUQVJUKTsKJHNldHRpbmdzID0gc2VsZjo6Z2V0UmVzdGFydFNldHRpbmdzKCk7CgppZiAoJHNldHRpbmdzICE9PSBudWxsKSB7CgokdGhpcy0+c3luY1NldHRpbmdzKCRzZXR0aW5ncyk7Cn0KfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEFsbEluaUZpbGVzKCk6IGFycmF5CnsKaWYgKHNlbGY6OiRuYW1lICE9PSBudWxsKSB7CiRlbnYgPSBnZXRlbnYoc2VsZjo6JG5hbWUuc2VsZjo6U1VGRklYX0lOSVMpOwoKaWYgKGZhbHNlICE9PSAkZW52KSB7CnJldHVybiBleHBsb2RlKFBBVEhfU0VQQVJBVE9SLCAkZW52KTsKfQp9CgokcGF0aHMgPSBbKHN0cmluZykgcGhwX2luaV9sb2FkZWRfZmlsZSgpXTsKJHNjYW5uZWQgPSBwaHBfaW5pX3NjYW5uZWRfZmlsZXMoKTsKCmlmICgkc2Nhbm5lZCAhPT0gZmFsc2UpIHsKJHBhdGhzID0gYXJyYXlfbWVyZ2UoJHBhdGhzLCBhcnJheV9tYXAoJ3RyaW0nLCBleHBsb2RlKCcsJywgJHNjYW5uZWQpKSk7Cn0KCnJldHVybiAkcGF0aHM7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSZXN0YXJ0U2V0dGluZ3MoKTogP2FycmF5CnsKJGVudkFyZ3MgPSBleHBsb2RlKCd8JywgKHN0cmluZykgZ2V0ZW52KHNlbGY6OlJFU1RBUlRfU0VUVElOR1MpKTsKCmlmIChjb3VudCgkZW52QXJncykgIT09IDYKfHwgKCFzZWxmOjokaW5SZXN0YXJ0ICYmIHBocF9pbmlfbG9hZGVkX2ZpbGUoKSAhPT0gJGVudkFyZ3NbMF0pKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gWwondG1wSW5pJyA9PiAkZW52QXJnc1swXSwKJ3NjYW5uZWRJbmlzJyA9PiAoYm9vbCkgJGVudkFyZ3NbMV0sCidzY2FuRGlyJyA9PiAnKicgPT09ICRlbnZBcmdzWzJdID8gZmFsc2UgOiAkZW52QXJnc1syXSwKJ3BocHJjJyA9PiAnKicgPT09ICRlbnZBcmdzWzNdID8gZmFsc2UgOiAkZW52QXJnc1szXSwKJ2luaXMnID0+IGV4cGxvZGUoUEFUSF9TRVBBUkFUT1IsICRlbnZBcmdzWzRdKSwKJ3NraXBwZWQnID0+ICRlbnZBcmdzWzVdLApdOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFNraXBwZWRWZXJzaW9uKCk6IHN0cmluZwp7CnJldHVybiAoc3RyaW5nKSBzZWxmOjokc2tpcHBlZDsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1hkZWJ1Z0FjdGl2ZSgpOiBib29sCnsKc2VsZjo6c2V0WGRlYnVnRGV0YWlscygpOwpyZXR1cm4gc2VsZjo6JHhkZWJ1Z0FjdGl2ZTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcmVxdWlyZXNSZXN0YXJ0KGJvb2wgJGRlZmF1bHQpOiBib29sCnsKcmV0dXJuICRkZWZhdWx0Owp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZXN0YXJ0KGFycmF5ICRjb21tYW5kKTogdm9pZAp7CiR0aGlzLT5kb1Jlc3RhcnQoJGNvbW1hbmQpOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvUmVzdGFydChhcnJheSAkY29tbWFuZCk6IHZvaWQKewppZiAoUEhQX1ZFUlNJT05fSUQgPj0gNzA0MDApIHsKJGNtZCA9ICRjb21tYW5kOwokZGlzcGxheUNtZCA9IHNwcmludGYoJ1slc10nLCBpbXBsb2RlKCcsICcsICRjbWQpKTsKfSBlbHNlIHsKJGNtZCA9IFByb2Nlc3M6OmVzY2FwZVNoZWxsQ29tbWFuZCgkY29tbWFuZCk7CmlmIChkZWZpbmVkKCdQSFBfV0lORE9XU19WRVJTSU9OX0JVSUxEJykpIHsKCiRjbWQgPSAnIicuJGNtZC4nIic7Cn0KJGRpc3BsYXlDbWQgPSAkY21kOwp9CgokdGhpcy0+dHJ5RW5hYmxlU2lnbmFscygpOwokdGhpcy0+bm90aWZ5KFN0YXR1czo6UkVTVEFSVElORywgJGRpc3BsYXlDbWQpOwoKJHByb2Nlc3MgPSBwcm9jX29wZW4oJGNtZCwgW10sICRwaXBlcyk7CmlmIChpc19yZXNvdXJjZSgkcHJvY2VzcykpIHsKJGV4aXRDb2RlID0gcHJvY19jbG9zZSgkcHJvY2Vzcyk7Cn0KCmlmICghaXNzZXQoJGV4aXRDb2RlKSkgewoKJHRoaXMtPm5vdGlmeShTdGF0dXM6OkVSUk9SLCAnVW5hYmxlIHRvIHJlc3RhcnQgcHJvY2VzcycpOwokZXhpdENvZGUgPSAtMTsKfSBlbHNlIHsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OklORk8sICdSZXN0YXJ0ZWQgcHJvY2VzcyBleGl0ZWQgJy4kZXhpdENvZGUpOwp9CgppZiAoJHRoaXMtPmRlYnVnID09PSAnMicpIHsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OklORk8sICdUZW1wIGluaSBzYXZlZDogJy4kdGhpcy0+dG1wSW5pKTsKfSBlbHNlIHsKQHVubGluaygoc3RyaW5nKSAkdGhpcy0+dG1wSW5pKTsKfQoKZXhpdCgkZXhpdENvZGUpOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwcmVwYXJlUmVzdGFydCgpOiA/YXJyYXkKewppZiAoISR0aGlzLT5jbGkpIHsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OkVSUk9SLCAnVW5zdXBwb3J0ZWQgU0FQSTogJy5QSFBfU0FQSSk7CnJldHVybiBudWxsOwp9CgppZiAoKCRhcmd2ID0gJHRoaXMtPmNoZWNrU2VydmVyQXJndigpKSA9PT0gbnVsbCkgewokdGhpcy0+bm90aWZ5KFN0YXR1czo6RVJST1IsICckX1NFUlZFUlthcmd2XSBpcyBub3QgYXMgZXhwZWN0ZWQnKTsKcmV0dXJuIG51bGw7Cn0KCmlmICghJHRoaXMtPmNoZWNrQ29uZmlndXJhdGlvbigkaW5mbykpIHsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OkVSUk9SLCAkaW5mbyk7CnJldHVybiBudWxsOwp9CgokbWFpblNjcmlwdCA9IChzdHJpbmcpICR0aGlzLT5zY3JpcHQ7CmlmICghJHRoaXMtPmNoZWNrTWFpblNjcmlwdCgkbWFpblNjcmlwdCwgJGFyZ3YpKSB7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpFUlJPUiwgJ1VuYWJsZSB0byBhY2Nlc3MgbWFpbiBzY3JpcHQ6ICcuJG1haW5TY3JpcHQpOwpyZXR1cm4gbnVsbDsKfQoKJHRtcERpciA9IHN5c19nZXRfdGVtcF9kaXIoKTsKJGluaUVycm9yID0gJ1VuYWJsZSB0byBjcmVhdGUgdGVtcCBpbmkgZmlsZSBhdDogJy4kdG1wRGlyOwoKaWYgKCgkdG1wZmlsZSA9IEB0ZW1wbmFtKCR0bXBEaXIsICcnKSkgPT09IGZhbHNlKSB7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpFUlJPUiwgJGluaUVycm9yKTsKcmV0dXJuIG51bGw7Cn0KCiRlcnJvciA9IG51bGw7CiRpbmlGaWxlcyA9IHNlbGY6OmdldEFsbEluaUZpbGVzKCk7CiRzY2FubmVkSW5pcyA9IGNvdW50KCRpbmlGaWxlcykgPiAxOwoKaWYgKCEkdGhpcy0+d3JpdGVUbXBJbmkoJHRtcGZpbGUsICRpbmlGaWxlcywgJGVycm9yKSkgewokdGhpcy0+bm90aWZ5KFN0YXR1czo6RVJST1IsICRlcnJvciA/PyAkaW5pRXJyb3IpOwpAdW5saW5rKCR0bXBmaWxlKTsKcmV0dXJuIG51bGw7Cn0KCmlmICghJHRoaXMtPnNldEVudmlyb25tZW50KCRzY2FubmVkSW5pcywgJGluaUZpbGVzLCAkdG1wZmlsZSkpIHsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OkVSUk9SLCAnVW5hYmxlIHRvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTsKQHVubGluaygkdG1wZmlsZSk7CnJldHVybiBudWxsOwp9CgokdGhpcy0+dG1wSW5pID0gJHRtcGZpbGU7CgpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoJGFyZ3YsICR0bXBmaWxlLCAkbWFpblNjcmlwdCk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZVRtcEluaShzdHJpbmcgJHRtcEZpbGUsIGFycmF5ICRpbmlGaWxlcywgP3N0cmluZyAmJGVycm9yKTogYm9vbAp7CgppZiAoJGluaUZpbGVzWzBdID09PSAnJykgewphcnJheV9zaGlmdCgkaW5pRmlsZXMpOwp9CgokY29udGVudCA9ICcnOwokc2VjdGlvblJlZ2V4ID0gJy9eXHMqXFsoPzpQQVRIfEhPU1QpXHMqPS9taSc7CiR4ZGVidWdSZWdleCA9ICcvXlxzKih6ZW5kX2V4dGVuc2lvblxzKj0uKnhkZWJ1Zy4qKSQvbWknOwoKZm9yZWFjaCAoJGluaUZpbGVzIGFzICRmaWxlKSB7CgppZiAoKCRkYXRhID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSkgPT09IGZhbHNlKSB7CiRlcnJvciA9ICdVbmFibGUgdG8gcmVhZCBpbmk6ICcuJGZpbGU7CnJldHVybiBmYWxzZTsKfQoKaWYgKFByZWc6OmlzTWF0Y2hXaXRoT2Zmc2V0cygkc2VjdGlvblJlZ2V4LCAkZGF0YSwgJG1hdGNoZXMpKSB7CiRkYXRhID0gc3Vic3RyKCRkYXRhLCAwLCAkbWF0Y2hlc1swXVsxXSk7Cn0KJGNvbnRlbnQgLj0gUHJlZzo6cmVwbGFjZSgkeGRlYnVnUmVnZXgsICc7JDEnLCAkZGF0YSkuUEhQX0VPTDsKfQoKCiRjb25maWcgPSBwYXJzZV9pbmlfc3RyaW5nKCRjb250ZW50KTsKJGxvYWRlZCA9IGluaV9nZXRfYWxsKG51bGwsIGZhbHNlKTsKCmlmIChmYWxzZSA9PT0gJGNvbmZpZyB8fCBmYWxzZSA9PT0gJGxvYWRlZCkgewokZXJyb3IgPSAnVW5hYmxlIHRvIHBhcnNlIGluaSBkYXRhJzsKcmV0dXJuIGZhbHNlOwp9CgokY29udGVudCAuPSAkdGhpcy0+bWVyZ2VMb2FkZWRDb25maWcoJGxvYWRlZCwgJGNvbmZpZyk7CgoKJGNvbnRlbnQgLj0gJ29wY2FjaGUuZW5hYmxlX2NsaT0wJy5QSFBfRU9MOwoKcmV0dXJuIChib29sKSBAZmlsZV9wdXRfY29udGVudHMoJHRtcEZpbGUsICRjb250ZW50KTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDb21tYW5kKGFycmF5ICRhcmd2LCBzdHJpbmcgJHRtcEluaSwgc3RyaW5nICRtYWluU2NyaXB0KTogYXJyYXkKewokcGhwID0gW1BIUF9CSU5BUlldOwokYXJncyA9IGFycmF5X3NsaWNlKCRhcmd2LCAxKTsKCmlmICghJHRoaXMtPnBlcnNpc3RlbnQpIHsKCmFycmF5X3B1c2goJHBocCwgJy1uJywgJy1jJywgJHRtcEluaSk7Cn0KCnJldHVybiBhcnJheV9tZXJnZSgkcGhwLCBbJG1haW5TY3JpcHRdLCAkYXJncyk7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldEVudmlyb25tZW50KGJvb2wgJHNjYW5uZWRJbmlzLCBhcnJheSAkaW5pRmlsZXMsIHN0cmluZyAkdG1wSW5pKTogYm9vbAp7CiRzY2FuRGlyID0gZ2V0ZW52KCdQSFBfSU5JX1NDQU5fRElSJyk7CiRwaHByYyA9IGdldGVudignUEhQUkMnKTsKCgppZiAoIXB1dGVudigkdGhpcy0+ZW52T3JpZ2luYWxJbmlzLic9Jy5pbXBsb2RlKFBBVEhfU0VQQVJBVE9SLCAkaW5pRmlsZXMpKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdGhpcy0+cGVyc2lzdGVudCkgewoKaWYgKCFwdXRlbnYoJ1BIUF9JTklfU0NBTl9ESVI9JykgfHwgIXB1dGVudignUEhQUkM9Jy4kdG1wSW5pKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKCiRlbnZBcmdzID0gWwpzZWxmOjpSRVNUQVJUX0lELApzZWxmOjokeGRlYnVnVmVyc2lvbiwKKGludCkgJHNjYW5uZWRJbmlzLApmYWxzZSA9PT0gJHNjYW5EaXIgPyAnKicgOiAkc2NhbkRpciwKZmFsc2UgPT09ICRwaHByYyA/ICcqJyA6ICRwaHByYywKXTsKCnJldHVybiBwdXRlbnYoJHRoaXMtPmVudkFsbG93WGRlYnVnLic9Jy5pbXBsb2RlKCd8JywgJGVudkFyZ3MpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBub3RpZnkoc3RyaW5nICRvcCwgP3N0cmluZyAkZGF0YSA9IG51bGwpOiB2b2lkCnsKJHRoaXMtPnN0YXR1c1dyaXRlci0+cmVwb3J0KCRvcCwgJGRhdGEpOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBtZXJnZUxvYWRlZENvbmZpZyhhcnJheSAkbG9hZGVkQ29uZmlnLCBhcnJheSAkaW5pQ29uZmlnKTogc3RyaW5nCnsKJGNvbnRlbnQgPSAnJzsKCmZvcmVhY2ggKCRsb2FkZWRDb25maWcgYXMgJG5hbWUgPT4gJHZhbHVlKSB7CgppZiAoIWlzX3N0cmluZygkdmFsdWUpCnx8IHN0cnBvcygkbmFtZSwgJ3hkZWJ1ZycpID09PSAwCnx8ICRuYW1lID09PSAnYXBjLm1tYXBfZmlsZV9tYXNrJykgewpjb250aW51ZTsKfQoKaWYgKCFpc3NldCgkaW5pQ29uZmlnWyRuYW1lXSkgfHwgJGluaUNvbmZpZ1skbmFtZV0gIT09ICR2YWx1ZSkgewoKJGNvbnRlbnQgLj0gJG5hbWUuJz0iJy5hZGRjc2xhc2hlcygkdmFsdWUsICdcXCInKS4nIicuUEhQX0VPTDsKfQp9CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja01haW5TY3JpcHQoc3RyaW5nICYkbWFpblNjcmlwdCwgYXJyYXkgJGFyZ3YpOiBib29sCnsKaWYgKCRtYWluU2NyaXB0ICE9PSAnJykgewoKcmV0dXJuIGZpbGVfZXhpc3RzKCRtYWluU2NyaXB0KSB8fCAnLS0nID09PSAkbWFpblNjcmlwdDsKfQoKaWYgKGZpbGVfZXhpc3RzKCRtYWluU2NyaXB0ID0gJGFyZ3ZbMF0pKSB7CnJldHVybiB0cnVlOwp9CgoKJHRyYWNlID0gZGVidWdfYmFja3RyYWNlKERFQlVHX0JBQ0tUUkFDRV9JR05PUkVfQVJHUyk7CiRtYWluID0gZW5kKCR0cmFjZSk7CgppZiAoJG1haW4gIT09IGZhbHNlICYmIGlzc2V0KCRtYWluWydmaWxlJ10pKSB7CnJldHVybiBmaWxlX2V4aXN0cygkbWFpblNjcmlwdCA9ICRtYWluWydmaWxlJ10pOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzZXRFbnZSZXN0YXJ0U2V0dGluZ3MoYXJyYXkgJGVudkFyZ3MpOiB2b2lkCnsKJHNldHRpbmdzID0gWwpwaHBfaW5pX2xvYWRlZF9maWxlKCksCiRlbnZBcmdzWzJdLAokZW52QXJnc1szXSwKJGVudkFyZ3NbNF0sCmdldGVudigkdGhpcy0+ZW52T3JpZ2luYWxJbmlzKSwKc2VsZjo6JHNraXBwZWQsCl07CgpQcm9jZXNzOjpzZXRFbnYoc2VsZjo6UkVTVEFSVF9TRVRUSU5HUywgaW1wbG9kZSgnfCcsICRzZXR0aW5ncykpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc3luY1NldHRpbmdzKGFycmF5ICRzZXR0aW5ncyk6IHZvaWQKewppZiAoZmFsc2UgPT09IGdldGVudigkdGhpcy0+ZW52T3JpZ2luYWxJbmlzKSkgewoKUHJvY2Vzczo6c2V0RW52KCR0aGlzLT5lbnZPcmlnaW5hbEluaXMsIGltcGxvZGUoUEFUSF9TRVBBUkFUT1IsICRzZXR0aW5nc1snaW5pcyddKSk7Cn0KCnNlbGY6OiRza2lwcGVkID0gJHNldHRpbmdzWydza2lwcGVkJ107CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpJTkZPLCAnUHJvY2VzcyBjYWxsZWQgd2l0aCBleGlzdGluZyByZXN0YXJ0IHNldHRpbmdzJyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tDb25maWd1cmF0aW9uKD9zdHJpbmcgJiRpbmZvKTogYm9vbAp7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewokaW5mbyA9ICdwcm9jX29wZW4gZnVuY3Rpb24gaXMgZGlzYWJsZWQnOwpyZXR1cm4gZmFsc2U7Cn0KCmlmICghZmlsZV9leGlzdHMoUEhQX0JJTkFSWSkpIHsKJGluZm8gPSAnUEhQX0JJTkFSWSBpcyBub3QgYXZhaWxhYmxlJzsKcmV0dXJuIGZhbHNlOwp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgndW9weicpICYmICEoKGJvb2wpIGluaV9nZXQoJ3VvcHouZGlzYWJsZScpKSkgewoKaWYgKGZ1bmN0aW9uX2V4aXN0cygndW9wel9hbGxvd19leGl0JykpIHsKQHVvcHpfYWxsb3dfZXhpdCh0cnVlKTsKfSBlbHNlIHsKJGluZm8gPSAndW9weiBleHRlbnNpb24gaXMgbm90IGNvbXBhdGlibGUnOwpyZXR1cm4gZmFsc2U7Cn0KfQoKCmlmIChkZWZpbmVkKCdQSFBfV0lORE9XU19WRVJTSU9OX0JVSUxEJykgJiYgUEhQX1ZFUlNJT05fSUQgPCA3MDQwMCkgewokd29ya2luZ0RpciA9IGdldGN3ZCgpOwoKaWYgKCR3b3JraW5nRGlyID09PSBmYWxzZSkgewokaW5mbyA9ICd1bmFibGUgdG8gZGV0ZXJtaW5lIHdvcmtpbmcgZGlyZWN0b3J5JzsKcmV0dXJuIGZhbHNlOwp9CgppZiAoMCA9PT0gc3RycG9zKCR3b3JraW5nRGlyLCAnXFxcXCcpKSB7CiRpbmZvID0gJ2NtZC5leGUgZG9lcyBub3Qgc3VwcG9ydCBVTkMgcGF0aHM6ICcuJHdvcmtpbmdEaXI7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHRyeUVuYWJsZVNpZ25hbHMoKTogdm9pZAp7CmlmIChmdW5jdGlvbl9leGlzdHMoJ3BjbnRsX2FzeW5jX3NpZ25hbHMnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3BjbnRsX3NpZ25hbCcpKSB7CnBjbnRsX2FzeW5jX3NpZ25hbHModHJ1ZSk7CiRtZXNzYWdlID0gJ0FzeW5jIHNpZ25hbHMgZW5hYmxlZCc7CgppZiAoIXNlbGY6OiRpblJlc3RhcnQpIHsKCnBjbnRsX3NpZ25hbChTSUdJTlQsIFNJR19JR04pOwp9IGVsc2VpZiAoaXNfaW50KHBjbnRsX3NpZ25hbF9nZXRfaGFuZGxlcihTSUdJTlQpKSkgewoKcGNudGxfc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7Cn0KfQoKaWYgKCFzZWxmOjokaW5SZXN0YXJ0ICYmIGZ1bmN0aW9uX2V4aXN0cygnc2FwaV93aW5kb3dzX3NldF9jdHJsX2hhbmRsZXInKSkgewoKCgpzYXBpX3dpbmRvd3Nfc2V0X2N0cmxfaGFuZGxlcihmdW5jdGlvbiAoJGV2dCkge30pOwp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja1NlcnZlckFyZ3YoKTogP2FycmF5CnsKJHJlc3VsdCA9IFtdOwoKaWYgKGlzc2V0KCRfU0VSVkVSWydhcmd2J10pICYmIGlzX2FycmF5KCRfU0VSVkVSWydhcmd2J10pKSB7CmZvcmVhY2ggKCRfU0VSVkVSWydhcmd2J10gYXMgJHZhbHVlKSB7CmlmICghaXNfc3RyaW5nKCR2YWx1ZSkpIHsKcmV0dXJuIG51bGw7Cn0KCiRyZXN1bHRbXSA9ICR2YWx1ZTsKfQp9CgpyZXR1cm4gY291bnQoJHJlc3VsdCkgPiAwID8gJHJlc3VsdCA6IG51bGw7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHNldFhkZWJ1Z0RldGFpbHMoKTogdm9pZAp7CmlmIChzZWxmOjokeGRlYnVnQWN0aXZlICE9PSBudWxsKSB7CnJldHVybjsKfQoKc2VsZjo6JHhkZWJ1Z0FjdGl2ZSA9IGZhbHNlOwppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ3hkZWJ1ZycpKSB7CnJldHVybjsKfQoKJHZlcnNpb24gPSBwaHB2ZXJzaW9uKCd4ZGVidWcnKTsKc2VsZjo6JHhkZWJ1Z1ZlcnNpb24gPSAkdmVyc2lvbiAhPT0gZmFsc2UgPyAkdmVyc2lvbiA6ICd1bmtub3duJzsKCmlmICh2ZXJzaW9uX2NvbXBhcmUoc2VsZjo6JHhkZWJ1Z1ZlcnNpb24sICczLjEnLCAnPj0nKSkgewokbW9kZXMgPSB4ZGVidWdfaW5mbygnbW9kZScpOwpzZWxmOjokeGRlYnVnTW9kZSA9IGNvdW50KCRtb2RlcykgPT09IDAgPyAnb2ZmJyA6IGltcGxvZGUoJywnLCAkbW9kZXMpOwpzZWxmOjokeGRlYnVnQWN0aXZlID0gc2VsZjo6JHhkZWJ1Z01vZGUgIT09ICdvZmYnOwpyZXR1cm47Cn0KCgokaW5pTW9kZSA9IGluaV9nZXQoJ3hkZWJ1Zy5tb2RlJyk7CmlmICgkaW5pTW9kZSA9PT0gZmFsc2UpIHsKc2VsZjo6JHhkZWJ1Z0FjdGl2ZSA9IHRydWU7CnJldHVybjsKfQoKCiRlbnZNb2RlID0gKHN0cmluZykgZ2V0ZW52KCdYREVCVUdfTU9ERScpOwppZiAoJGVudk1vZGUgIT09ICcnKSB7CnNlbGY6OiR4ZGVidWdNb2RlID0gJGVudk1vZGU7Cn0gZWxzZSB7CnNlbGY6OiR4ZGVidWdNb2RlID0gJGluaU1vZGUgIT09ICcnID8gJGluaU1vZGUgOiAnb2ZmJzsKfQoKCmlmIChQcmVnOjppc01hdGNoKCcvXiwrJC8nLCBzdHJfcmVwbGFjZSgnICcsICcnLCBzZWxmOjokeGRlYnVnTW9kZSkpKSB7CnNlbGY6OiR4ZGVidWdNb2RlID0gJ29mZic7Cn0KCnNlbGY6OiR4ZGVidWdBY3RpdmUgPSBzZWxmOjokeGRlYnVnTW9kZSAhPT0gJ29mZic7Cn0KfQoKTUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAxNgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KCjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hOwoKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCmNsYXNzIENvbnN0cmFpbnRFcnJvciBleHRlbmRzIEVudW0KewpwdWJsaWMgY29uc3QgQURESVRJT05BTF9JVEVNUyA9ICdhZGRpdGlvbmFsSXRlbXMnOwpwdWJsaWMgY29uc3QgQURESVRJT05BTF9QUk9QRVJUSUVTID0gJ2FkZGl0aW9uYWxQcm9wJzsKcHVibGljIGNvbnN0IEFMTF9PRiA9ICdhbGxPZic7CnB1YmxpYyBjb25zdCBBTllfT0YgPSAnYW55T2YnOwpwdWJsaWMgY29uc3QgREVQRU5ERU5DSUVTID0gJ2RlcGVuZGVuY2llcyc7CnB1YmxpYyBjb25zdCBESVNBTExPVyA9ICdkaXNhbGxvdyc7CnB1YmxpYyBjb25zdCBESVZJU0lCTEVfQlkgPSAnZGl2aXNpYmxlQnknOwpwdWJsaWMgY29uc3QgRU5VTSA9ICdlbnVtJzsKcHVibGljIGNvbnN0IENPTlNUQU5UID0gJ2NvbnN0JzsKcHVibGljIGNvbnN0IEVYQ0xVU0lWRV9NSU5JTVVNID0gJ2V4Y2x1c2l2ZU1pbmltdW0nOwpwdWJsaWMgY29uc3QgRVhDTFVTSVZFX01BWElNVU0gPSAnZXhjbHVzaXZlTWF4aW11bSc7CnB1YmxpYyBjb25zdCBGT1JNQVRfQ09MT1IgPSAnY29sb3JGb3JtYXQnOwpwdWJsaWMgY29uc3QgRk9STUFUX0RBVEUgPSAnZGF0ZUZvcm1hdCc7CnB1YmxpYyBjb25zdCBGT1JNQVRfREFURV9USU1FID0gJ2RhdGVUaW1lRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9EQVRFX1VUQyA9ICdkYXRlVXRjRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9FTUFJTCA9ICdlbWFpbEZvcm1hdCc7CnB1YmxpYyBjb25zdCBGT1JNQVRfSE9TVE5BTUUgPSAnc3R5bGVIb3N0TmFtZSc7CnB1YmxpYyBjb25zdCBGT1JNQVRfSVAgPSAnaXBGb3JtYXQnOwpwdWJsaWMgY29uc3QgRk9STUFUX1BIT05FID0gJ3Bob25lRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9SRUdFWD0gJ3JlZ2V4Rm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9TVFlMRSA9ICdzdHlsZUZvcm1hdCc7CnB1YmxpYyBjb25zdCBGT1JNQVRfVElNRSA9ICd0aW1lRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9VUkwgPSAndXJsRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9VUkxfUkVGID0gJ3VybFJlZkZvcm1hdCc7CnB1YmxpYyBjb25zdCBJTlZBTElEX1NDSEVNQSA9ICdpbnZhbGlkU2NoZW1hJzsKcHVibGljIGNvbnN0IExFTkdUSF9NQVggPSAnbWF4TGVuZ3RoJzsKcHVibGljIGNvbnN0IExFTkdUSF9NSU4gPSAnbWluTGVuZ3RoJzsKcHVibGljIGNvbnN0IE1BWElNVU0gPSAnbWF4aW11bSc7CnB1YmxpYyBjb25zdCBNSU5fSVRFTVMgPSAnbWluSXRlbXMnOwpwdWJsaWMgY29uc3QgTUlOSU1VTSA9ICdtaW5pbXVtJzsKcHVibGljIGNvbnN0IE1JU1NJTkdfRVJST1IgPSAnbWlzc2luZ0Vycm9yJzsKcHVibGljIGNvbnN0IE1JU1NJTkdfTUFYSU1VTSA9ICdtaXNzaW5nTWF4aW11bSc7CnB1YmxpYyBjb25zdCBNSVNTSU5HX01JTklNVU0gPSAnbWlzc2luZ01pbmltdW0nOwpwdWJsaWMgY29uc3QgTUFYX0lURU1TID0gJ21heEl0ZW1zJzsKcHVibGljIGNvbnN0IE1VTFRJUExFX09GID0gJ211bHRpcGxlT2YnOwpwdWJsaWMgY29uc3QgTk9UID0gJ25vdCc7CnB1YmxpYyBjb25zdCBPTkVfT0YgPSAnb25lT2YnOwpwdWJsaWMgY29uc3QgUkVRVUlSRUQgPSAncmVxdWlyZWQnOwpwdWJsaWMgY29uc3QgUkVRVUlSRVMgPSAncmVxdWlyZXMnOwpwdWJsaWMgY29uc3QgUEFUVEVSTiA9ICdwYXR0ZXJuJzsKcHVibGljIGNvbnN0IFBSRUdFWF9JTlZBTElEID0gJ3ByZWdyZXgnOwpwdWJsaWMgY29uc3QgUFJPUEVSVElFU19NSU4gPSAnbWluUHJvcGVydGllcyc7CnB1YmxpYyBjb25zdCBQUk9QRVJUSUVTX01BWCA9ICdtYXhQcm9wZXJ0aWVzJzsKcHVibGljIGNvbnN0IFRZUEUgPSAndHlwZSc7CnB1YmxpYyBjb25zdCBVTklRVUVfSVRFTVMgPSAndW5pcXVlSXRlbXMnOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE1lc3NhZ2UoKQp7CiRuYW1lID0gJHRoaXMtPmdldFZhbHVlKCk7CnN0YXRpYyAkbWVzc2FnZXMgPSBbCnNlbGY6OkFERElUSU9OQUxfSVRFTVMgPT4gJ1RoZSBpdGVtICVzWyVzXSBpcyBub3QgZGVmaW5lZCBhbmQgdGhlIGRlZmluaXRpb24gZG9lcyBub3QgYWxsb3cgYWRkaXRpb25hbCBpdGVtcycsCnNlbGY6OkFERElUSU9OQUxfUFJPUEVSVElFUyA9PiAnVGhlIHByb3BlcnR5ICVzIGlzIG5vdCBkZWZpbmVkIGFuZCB0aGUgZGVmaW5pdGlvbiBkb2VzIG5vdCBhbGxvdyBhZGRpdGlvbmFsIHByb3BlcnRpZXMnLApzZWxmOjpBTExfT0YgPT4gJ0ZhaWxlZCB0byBtYXRjaCBhbGwgc2NoZW1hcycsCnNlbGY6OkFOWV9PRiA9PiAnRmFpbGVkIHRvIG1hdGNoIGF0IGxlYXN0IG9uZSBzY2hlbWEnLApzZWxmOjpERVBFTkRFTkNJRVMgPT4gJyVzIGRlcGVuZHMgb24gJXMsIHdoaWNoIGlzIG1pc3NpbmcnLApzZWxmOjpESVNBTExPVyA9PiAnRGlzYWxsb3dlZCB2YWx1ZSB3YXMgbWF0Y2hlZCcsCnNlbGY6OkRJVklTSUJMRV9CWSA9PiAnSXMgbm90IGRpdmlzaWJsZSBieSAlZCcsCnNlbGY6OkVOVU0gPT4gJ0RvZXMgbm90IGhhdmUgYSB2YWx1ZSBpbiB0aGUgZW51bWVyYXRpb24gJXMnLApzZWxmOjpDT05TVEFOVCA9PiAnRG9lcyBub3QgaGF2ZSBhIHZhbHVlIGVxdWFsIHRvICVzJywKc2VsZjo6RVhDTFVTSVZFX01JTklNVU0gPT4gJ011c3QgaGF2ZSBhIG1pbmltdW0gdmFsdWUgZ3JlYXRlciB0aGFuICVkJywKc2VsZjo6RVhDTFVTSVZFX01BWElNVU0gPT4gJ011c3QgaGF2ZSBhIG1heGltdW0gdmFsdWUgbGVzcyB0aGFuICVkJywKc2VsZjo6Rk9STUFUX0NPTE9SID0+ICdJbnZhbGlkIGNvbG9yJywKc2VsZjo6Rk9STUFUX0RBVEUgPT4gJ0ludmFsaWQgZGF0ZSAlcywgZXhwZWN0ZWQgZm9ybWF0IFlZWVktTU0tREQnLApzZWxmOjpGT1JNQVRfREFURV9USU1FID0+ICdJbnZhbGlkIGRhdGUtdGltZSAlcywgZXhwZWN0ZWQgZm9ybWF0IFlZWVktTU0tRERUaGg6bW06c3NaIG9yIFlZWVktTU0tRERUaGg6bW06c3MraGg6bW0nLApzZWxmOjpGT1JNQVRfREFURV9VVEMgPT4gJ0ludmFsaWQgdGltZSAlcywgZXhwZWN0ZWQgaW50ZWdlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgRXBvY2gnLApzZWxmOjpGT1JNQVRfRU1BSUwgPT4gJ0ludmFsaWQgZW1haWwnLApzZWxmOjpGT1JNQVRfSE9TVE5BTUUgPT4gJ0ludmFsaWQgaG9zdG5hbWUnLApzZWxmOjpGT1JNQVRfSVAgPT4gJ0ludmFsaWQgSVAgYWRkcmVzcycsCnNlbGY6OkZPUk1BVF9QSE9ORSA9PiAnSW52YWxpZCBwaG9uZSBudW1iZXInLApzZWxmOjpGT1JNQVRfUkVHRVg9PiAnSW52YWxpZCByZWdleCBmb3JtYXQgJXMnLApzZWxmOjpGT1JNQVRfU1RZTEUgPT4gJ0ludmFsaWQgc3R5bGUnLApzZWxmOjpGT1JNQVRfVElNRSA9PiAnSW52YWxpZCB0aW1lICVzLCBleHBlY3RlZCBmb3JtYXQgaGg6bW06c3MnLApzZWxmOjpGT1JNQVRfVVJMID0+ICdJbnZhbGlkIFVSTCBmb3JtYXQnLApzZWxmOjpGT1JNQVRfVVJMX1JFRiA9PiAnSW52YWxpZCBVUkwgcmVmZXJlbmNlIGZvcm1hdCcsCnNlbGY6OkxFTkdUSF9NQVggPT4gJ011c3QgYmUgYXQgbW9zdCAlZCBjaGFyYWN0ZXJzIGxvbmcnLApzZWxmOjpJTlZBTElEX1NDSEVNQSA9PiAnU2NoZW1hIGlzIG5vdCB2YWxpZCcsCnNlbGY6OkxFTkdUSF9NSU4gPT4gJ011c3QgYmUgYXQgbGVhc3QgJWQgY2hhcmFjdGVycyBsb25nJywKc2VsZjo6TUFYX0lURU1TID0+ICdUaGVyZSBtdXN0IGJlIGEgbWF4aW11bSBvZiAlZCBpdGVtcyBpbiB0aGUgYXJyYXksICVkIGZvdW5kJywKc2VsZjo6TUFYSU1VTSA9PiAnTXVzdCBoYXZlIGEgbWF4aW11bSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJWQnLApzZWxmOjpNSU5fSVRFTVMgPT4gJ1RoZXJlIG11c3QgYmUgYSBtaW5pbXVtIG9mICVkIGl0ZW1zIGluIHRoZSBhcnJheSwgJWQgZm91bmQnLApzZWxmOjpNSU5JTVVNID0+ICdNdXN0IGhhdmUgYSBtaW5pbXVtIHZhbHVlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlZCcsCnNlbGY6Ok1JU1NJTkdfTUFYSU1VTSA9PiAnVXNlIG9mIGV4Y2x1c2l2ZU1heGltdW0gcmVxdWlyZXMgcHJlc2VuY2Ugb2YgbWF4aW11bScsCnNlbGY6Ok1JU1NJTkdfTUlOSU1VTSA9PiAnVXNlIG9mIGV4Y2x1c2l2ZU1pbmltdW0gcmVxdWlyZXMgcHJlc2VuY2Ugb2YgbWluaW11bScsCgpzZWxmOjpNVUxUSVBMRV9PRiA9PiAnTXVzdCBiZSBhIG11bHRpcGxlIG9mICVzJywKc2VsZjo6Tk9UID0+ICdNYXRjaGVkIGEgc2NoZW1hIHdoaWNoIGl0IHNob3VsZCBub3QnLApzZWxmOjpPTkVfT0YgPT4gJ0ZhaWxlZCB0byBtYXRjaCBleGFjdGx5IG9uZSBzY2hlbWEnLApzZWxmOjpSRVFVSVJFRCA9PiAnVGhlIHByb3BlcnR5ICVzIGlzIHJlcXVpcmVkJywKc2VsZjo6UkVRVUlSRVMgPT4gJ1RoZSBwcmVzZW5jZSBvZiB0aGUgcHJvcGVydHkgJXMgcmVxdWlyZXMgdGhhdCAlcyBhbHNvIGJlIHByZXNlbnQnLApzZWxmOjpQQVRURVJOID0+ICdEb2VzIG5vdCBtYXRjaCB0aGUgcmVnZXggcGF0dGVybiAlcycsCnNlbGY6OlBSRUdFWF9JTlZBTElEID0+ICdUaGUgcGF0dGVybiAlcyBpcyBpbnZhbGlkJywKc2VsZjo6UFJPUEVSVElFU19NSU4gPT4gJ011c3QgY29udGFpbiBhIG1pbmltdW0gb2YgJWQgcHJvcGVydGllcycsCnNlbGY6OlBST1BFUlRJRVNfTUFYID0+ICdNdXN0IGNvbnRhaW4gbm8gbW9yZSB0aGFuICVkIHByb3BlcnRpZXMnLApzZWxmOjpUWVBFID0+ICclcyB2YWx1ZSBmb3VuZCwgYnV0ICVzIGlzIHJlcXVpcmVkJywKc2VsZjo6VU5JUVVFX0lURU1TID0+ICdUaGVyZSBhcmUgbm8gZHVwbGljYXRlcyBhbGxvd2VkIGluIHRoZSBhcnJheScKXTsKCmlmICghaXNzZXQoJG1lc3NhZ2VzWyRuYW1lXSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignTWlzc2luZyBlcnJvciBtZXNzYWdlIGZvciAnIC4gJG5hbWUpOwp9CgpyZXR1cm4gJG1lc3NhZ2VzWyRuYW1lXTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcVmFsaWRhdG9yOwoKCgoKCmNsYXNzIEJhc2VDb25zdHJhaW50CnsKCgoKcHJvdGVjdGVkICRlcnJvcnMgPSBbXTsKCgoKCgpwcm90ZWN0ZWQgJGVycm9yTWFzayA9IFZhbGlkYXRvcjo6RVJST1JfTk9ORTsKCgoKCnByb3RlY3RlZCAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWRkRXJyb3IoQ29uc3RyYWludEVycm9yICRjb25zdHJhaW50LCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCBhcnJheSAkbW9yZSA9IFtdKTogdm9pZAp7CiRtZXNzYWdlID0gJGNvbnN0cmFpbnQtPmdldE1lc3NhZ2UoKTsKJG5hbWUgPSAkY29uc3RyYWludC0+Z2V0VmFsdWUoKTsKJGVycm9yID0gWwoncHJvcGVydHknID0+ICR0aGlzLT5jb252ZXJ0SnNvblBvaW50ZXJJbnRvUHJvcGVydHlQYXRoKCRwYXRoID86IG5ldyBKc29uUG9pbnRlcignJykpLAoncG9pbnRlcicgPT4gbHRyaW0oc3RydmFsKCRwYXRoID86IG5ldyBKc29uUG9pbnRlcignJykpLCAnIycpLAonbWVzc2FnZScgPT4gdWNmaXJzdCh2c3ByaW50ZigkbWVzc2FnZSwgYXJyYXlfbWFwKGZ1bmN0aW9uICgkdmFsKSB7CmlmIChpc19zY2FsYXIoJHZhbCkpIHsKcmV0dXJuIGlzX2Jvb2woJHZhbCkgPyB2YXJfZXhwb3J0KCR2YWwsIHRydWUpIDogJHZhbDsKfQoKcmV0dXJuIGpzb25fZW5jb2RlKCR2YWwpOwp9LCBhcnJheV92YWx1ZXMoJG1vcmUpKSkpLAonY29uc3RyYWludCcgPT4gWwonbmFtZScgPT4gJG5hbWUsCidwYXJhbXMnID0+ICRtb3JlCl0sCidjb250ZXh0JyA9PiAkdGhpcy0+ZmFjdG9yeS0+Z2V0RXJyb3JDb250ZXh0KCksCl07CgppZiAoJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhDb25zdHJhaW50OjpDSEVDS19NT0RFX0VYQ0VQVElPTlMpKSB7CnRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKHNwcmludGYoJ0Vycm9yIHZhbGlkYXRpbmcgJXM6ICVzJywgJGVycm9yWydwb2ludGVyJ10sICRlcnJvclsnbWVzc2FnZSddKSk7Cn0KCiR0aGlzLT5lcnJvcnNbXSA9ICRlcnJvcjsKJHRoaXMtPmVycm9yTWFzayB8PSAkZXJyb3JbJ2NvbnRleHQnXTsKfQoKcHVibGljIGZ1bmN0aW9uIGFkZEVycm9ycyhhcnJheSAkZXJyb3JzKTogdm9pZAp7CmlmICgkZXJyb3JzKSB7CiR0aGlzLT5lcnJvcnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+ZXJyb3JzLCAkZXJyb3JzKTsKJGVycm9yTWFzayA9ICYkdGhpcy0+ZXJyb3JNYXNrOwphcnJheV93YWxrKCRlcnJvcnMsIGZ1bmN0aW9uICgkZXJyb3IpIHVzZSAoJiRlcnJvck1hc2spIHsKaWYgKGlzc2V0KCRlcnJvclsnY29udGV4dCddKSkgewokZXJyb3JNYXNrIHw9ICRlcnJvclsnY29udGV4dCddOwp9Cn0pOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcnMoaW50ICRlcnJvckNvbnRleHQgPSBWYWxpZGF0b3I6OkVSUk9SX0FMTCk6IGFycmF5CnsKaWYgKCRlcnJvckNvbnRleHQgPT09IFZhbGlkYXRvcjo6RVJST1JfQUxMKSB7CnJldHVybiAkdGhpcy0+ZXJyb3JzOwp9CgpyZXR1cm4gYXJyYXlfZmlsdGVyKCR0aGlzLT5lcnJvcnMsIGZ1bmN0aW9uICgkZXJyb3IpIHVzZSAoJGVycm9yQ29udGV4dCkgewppZiAoJGVycm9yQ29udGV4dCAmICRlcnJvclsnY29udGV4dCddKSB7CnJldHVybiB0cnVlOwp9Cn0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbnVtRXJyb3JzKGludCAkZXJyb3JDb250ZXh0ID0gVmFsaWRhdG9yOjpFUlJPUl9BTEwpOiBpbnQKewppZiAoJGVycm9yQ29udGV4dCA9PT0gVmFsaWRhdG9yOjpFUlJPUl9BTEwpIHsKcmV0dXJuIGNvdW50KCR0aGlzLT5lcnJvcnMpOwp9CgpyZXR1cm4gY291bnQoJHRoaXMtPmdldEVycm9ycygkZXJyb3JDb250ZXh0KSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1ZhbGlkKCk6IGJvb2wKewpyZXR1cm4gISR0aGlzLT5nZXRFcnJvcnMoKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNldCgpOiB2b2lkCnsKJHRoaXMtPmVycm9ycyA9IFtdOwokdGhpcy0+ZXJyb3JNYXNrID0gVmFsaWRhdG9yOjpFUlJPUl9OT05FOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvck1hc2soKTogaW50CnsKcmV0dXJuICR0aGlzLT5lcnJvck1hc2s7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXJyYXlUb09iamVjdFJlY3Vyc2l2ZShhcnJheSAkYXJyYXkpOiBvYmplY3QKewokanNvbiA9IGpzb25fZW5jb2RlKCRhcnJheSk7CmlmIChqc29uX2xhc3RfZXJyb3IoKSAhPT0gXEpTT05fRVJST1JfTk9ORSkgewokbWVzc2FnZSA9ICdVbmFibGUgdG8gZW5jb2RlIHNjaGVtYSBhcnJheSBhcyBKU09OJzsKaWYgKGZ1bmN0aW9uX2V4aXN0cygnanNvbl9sYXN0X2Vycm9yX21zZycpKSB7CiRtZXNzYWdlIC49ICc6ICcgLiBqc29uX2xhc3RfZXJyb3JfbXNnKCk7Cn0KdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KCnJldHVybiAob2JqZWN0KSBqc29uX2RlY29kZSgkanNvbik7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24ganNvblBhdHRlcm5Ub1BocFJlZ2V4KHN0cmluZyAkcGF0dGVybik6IHN0cmluZwp7CnJldHVybiAnficgLiBzdHJfcmVwbGFjZSgnficsICdcXH4nLCAkcGF0dGVybikgLiAnfnUnOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29udmVydEpzb25Qb2ludGVySW50b1Byb3BlcnR5UGF0aChKc29uUG9pbnRlciAkcG9pbnRlcik6IHN0cmluZwp7CiRyZXN1bHQgPSBhcnJheV9tYXAoCmZ1bmN0aW9uICgkcGF0aCkgewpyZXR1cm4gc3ByaW50Zihpc19udW1lcmljKCRwYXRoKSA/ICdbJWRdJyA6ICcuJXMnLCAkcGF0aCk7Cn0sCiRwb2ludGVyLT5nZXRQcm9wZXJ0eVBhdGhzKCkKKTsKCnJldHVybiB0cmltKGltcGxvZGUoJycsICRyZXN1bHQpLCAnLicpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgoKCgoKCgpjbGFzcyBDb2xsZWN0aW9uQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewoKaWYgKGlzc2V0KCRzY2hlbWEtPm1pbkl0ZW1zKSAmJiBjb3VudCgkdmFsdWUpIDwgJHNjaGVtYS0+bWluSXRlbXMpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TUlOX0lURU1TKCksICRwYXRoLCBbJ21pbkl0ZW1zJyA9PiAkc2NoZW1hLT5taW5JdGVtcywgJ2ZvdW5kJyA9PiBjb3VudCgkdmFsdWUpXSk7Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+bWF4SXRlbXMpICYmIGNvdW50KCR2YWx1ZSkgPiAkc2NoZW1hLT5tYXhJdGVtcykgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNQVhfSVRFTVMoKSwgJHBhdGgsIFsnbWF4SXRlbXMnID0+ICRzY2hlbWEtPm1heEl0ZW1zLCAnZm91bmQnID0+IGNvdW50KCR2YWx1ZSldKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT51bmlxdWVJdGVtcykgJiYgJHNjaGVtYS0+dW5pcXVlSXRlbXMpIHsKJHVuaXF1ZSA9ICR2YWx1ZTsKaWYgKGlzX2FycmF5KCR2YWx1ZSkgJiYgY291bnQoJHZhbHVlKSkgewokdW5pcXVlID0gYXJyYXlfbWFwKGZ1bmN0aW9uICgkZSkgewpyZXR1cm4gdmFyX2V4cG9ydCgkZSwgdHJ1ZSk7Cn0sICR2YWx1ZSk7Cn0KaWYgKGNvdW50KGFycmF5X3VuaXF1ZSgkdW5pcXVlKSkgIT0gY291bnQoJHZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpVTklRVUVfSVRFTVMoKSwgJHBhdGgpOwp9Cn0KCiR0aGlzLT52YWxpZGF0ZUl0ZW1zKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZUl0ZW1zKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKFxpc19udWxsKCRzY2hlbWEpIHx8ICFpc3NldCgkc2NoZW1hLT5pdGVtcykpIHsKcmV0dXJuOwp9CgppZiAoJHNjaGVtYS0+aXRlbXMgPT09IHRydWUpIHsKcmV0dXJuOwp9CgppZiAoaXNfb2JqZWN0KCRzY2hlbWEtPml0ZW1zKSkgewoKZm9yZWFjaCAoJHZhbHVlIGFzICRrID0+ICYkdikgewokaW5pdEVycm9ycyA9ICR0aGlzLT5nZXRFcnJvcnMoKTsKCgokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHYsICRzY2hlbWEtPml0ZW1zLCAkcGF0aCwgJGspOwoKCmlmIChjb3VudCgkaW5pdEVycm9ycykgPCBjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpICYmIChpc3NldCgkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXMpICYmICRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcyAhPT0gZmFsc2UpKSB7CiRzZWNvbmRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdiwgJHNjaGVtYS0+YWRkaXRpb25hbEl0ZW1zLCAkcGF0aCwgJGspOwp9CgoKaWYgKGlzc2V0KCRzZWNvbmRFcnJvcnMpICYmIGNvdW50KCRzZWNvbmRFcnJvcnMpIDwgY291bnQoJHRoaXMtPmdldEVycm9ycygpKSkgewokdGhpcy0+ZXJyb3JzID0gJHNlY29uZEVycm9yczsKfSBlbHNlaWYgKGlzc2V0KCRzZWNvbmRFcnJvcnMpICYmIGNvdW50KCRzZWNvbmRFcnJvcnMpID09PSBjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpKSB7CiR0aGlzLT5lcnJvcnMgPSAkaW5pdEVycm9yczsKfQp9CnVuc2V0KCR2KTsgCgp9IGVsc2UgewoKZm9yZWFjaCAoJHZhbHVlIGFzICRrID0+ICYkdikgewppZiAoYXJyYXlfa2V5X2V4aXN0cygkaywgJHNjaGVtYS0+aXRlbXMpKSB7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdiwgJHNjaGVtYS0+aXRlbXNbJGtdLCAkcGF0aCwgJGspOwp9IGVsc2UgewoKaWYgKHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnYWRkaXRpb25hbEl0ZW1zJykpIHsKaWYgKCRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcyAhPT0gZmFsc2UpIHsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2LCAkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXMsICRwYXRoLCAkayk7Cn0gZWxzZSB7CiR0aGlzLT5hZGRFcnJvcigKQ29uc3RyYWludEVycm9yOjpBRERJVElPTkFMX0lURU1TKCksCiRwYXRoLApbCidpdGVtJyA9PiAkaSwKJ3Byb3BlcnR5JyA9PiAkaywKJ2FkZGl0aW9uYWxJdGVtcycgPT4gJHNjaGVtYS0+YWRkaXRpb25hbEl0ZW1zCl0KKTsKfQp9IGVsc2UgewoKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2LCBuZXcgXHN0ZENsYXNzKCksICRwYXRoLCAkayk7Cn0KfQp9CnVuc2V0KCR2KTsgCgoKCmlmIChjb3VudCgkdmFsdWUpID4gMCkgewpmb3IgKCRrID0gY291bnQoJHZhbHVlKTsgJGsgPCBjb3VudCgkc2NoZW1hLT5pdGVtcyk7ICRrKyspIHsKJHVuZGVmaW5lZEluc3RhbmNlID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCd1bmRlZmluZWQnKTsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR1bmRlZmluZWRJbnN0YW5jZSwgJHNjaGVtYS0+aXRlbXNbJGtdLCAkcGF0aCwgJGspOwp9Cn0KfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXFRvb2xcRGVlcENvbXBhcmVyOwoKCgoKCgpjbGFzcyBDb25zdENvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkZWxlbWVudCwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewoKaWYgKCRlbGVtZW50IGluc3RhbmNlb2YgVW5kZWZpbmVkQ29uc3RyYWludCAmJiAoIWlzc2V0KCRzY2hlbWEtPnJlcXVpcmVkKSB8fCAhJHNjaGVtYS0+cmVxdWlyZWQpKSB7CnJldHVybjsKfQokY29uc3QgPSAkc2NoZW1hLT5jb25zdDsKCiR0eXBlID0gZ2V0dHlwZSgkZWxlbWVudCk7CiRjb25zdFR5cGUgPSBnZXR0eXBlKCRjb25zdCk7CgppZiAoJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX1RZUEVfQ0FTVCkgJiYgJHR5cGUgPT09ICdhcnJheScgJiYgJGNvbnN0VHlwZSA9PT0gJ29iamVjdCcpIHsKaWYgKERlZXBDb21wYXJlcjo6aXNFcXVhbCgob2JqZWN0KSAkZWxlbWVudCwgJGNvbnN0KSkgewpyZXR1cm47Cn0KfQoKaWYgKERlZXBDb21wYXJlcjo6aXNFcXVhbCgkZWxlbWVudCwgJGNvbnN0KSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkNPTlNUQU5UKCksICRwYXRoLCBbJ2NvbnN0JyA9PiAkc2NoZW1hLT5jb25zdF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQ29uc3RyYWludCBleHRlbmRzIEJhc2VDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnByb3RlY3RlZCAkaW5saW5lU2NoZW1hUHJvcGVydHkgPSAnJHNjaGVtYSc7CgpwdWJsaWMgY29uc3QgQ0hFQ0tfTU9ERV9OT05FID0gMHgwMDAwMDAwMDsKcHVibGljIGNvbnN0IENIRUNLX01PREVfTk9STUFMID0gMHgwMDAwMDAwMTsKcHVibGljIGNvbnN0IENIRUNLX01PREVfVFlQRV9DQVNUID0gMHgwMDAwMDAwMjsKcHVibGljIGNvbnN0IENIRUNLX01PREVfQ09FUkNFX1RZUEVTID0gMHgwMDAwMDAwNDsKcHVibGljIGNvbnN0IENIRUNLX01PREVfQVBQTFlfREVGQVVMVFMgPSAweDAwMDAwMDA4OwpwdWJsaWMgY29uc3QgQ0hFQ0tfTU9ERV9FWENFUFRJT05TID0gMHgwMDAwMDAxMDsKcHVibGljIGNvbnN0IENIRUNLX01PREVfRElTQUJMRV9GT1JNQVQgPSAweDAwMDAwMDIwOwpwdWJsaWMgY29uc3QgQ0hFQ0tfTU9ERV9FQVJMWV9DT0VSQ0UgPSAweDAwMDAwMDQwOwpwdWJsaWMgY29uc3QgQ0hFQ0tfTU9ERV9PTkxZX1JFUVVJUkVEX0RFRkFVTFRTID0gMHgwMDAwMDA4MDsKcHVibGljIGNvbnN0IENIRUNLX01PREVfVkFMSURBVEVfU0NIRU1BID0gMHgwMDAwMDEwMDsKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbmNyZW1lbnRQYXRoKD9Kc29uUG9pbnRlciAkcGF0aCwgJGkpOiBKc29uUG9pbnRlcgp7CiRwYXRoID0gJHBhdGggPz8gbmV3IEpzb25Qb2ludGVyKCcnKTsKCmlmICgkaSA9PT0gbnVsbCB8fCAkaSA9PT0gJycpIHsKcmV0dXJuICRwYXRoOwp9CgokcGF0aCA9ICRwYXRoLT53aXRoUHJvcGVydHlQYXRocygKYXJyYXlfbWVyZ2UoCiRwYXRoLT5nZXRQcm9wZXJ0eVBhdGhzKCksClskaV0KKQopOwoKcmV0dXJuICRwYXRoOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrQXJyYXkoJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdjb2xsZWN0aW9uJyk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tPYmplY3QoJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRwcm9wZXJ0aWVzID0gbnVsbCwKJGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gbnVsbCwgJHBhdHRlcm5Qcm9wZXJ0aWVzID0gbnVsbCwgJGFwcGxpZWREZWZhdWx0cyA9IFtdKTogdm9pZAp7CgokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdvYmplY3QnKTsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJHByb3BlcnRpZXMsICRhZGRpdGlvbmFsUHJvcGVydGllcywgJHBhdHRlcm5Qcm9wZXJ0aWVzLCAkYXBwbGllZERlZmF1bHRzKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrVHlwZSgmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3R5cGUnKTsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwoKJHRoaXMtPmFkZEVycm9ycygkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tVbmRlZmluZWQoJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCwgJGZyb21EZWZhdWx0ID0gZmFsc2UpOiB2b2lkCnsKCiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3VuZGVmaW5lZCcpOwoKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkdGhpcy0+ZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpLT5yZXNvbHZlUmVmU2NoZW1hKCRzY2hlbWEpLCAkcGF0aCwgJGksICRmcm9tRGVmYXVsdCk7CgokdGhpcy0+YWRkRXJyb3JzKCR2YWxpZGF0b3ItPmdldEVycm9ycygpKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja1N0cmluZygkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc3RyaW5nJyk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrTnVtYmVyKCR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdudW1iZXInKTsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwoKJHRoaXMtPmFkZEVycm9ycygkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tFbnVtKCR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdlbnVtJyk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrQ29uc3QoJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ2NvbnN0Jyk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrRm9ybWF0KCR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdmb3JtYXQnKTsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwoKJHRoaXMtPmFkZEVycm9ycygkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRUeXBlQ2hlY2soKTogVHlwZUNoZWNrXFR5cGVDaGVja0ludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+ZmFjdG9yeS0+Z2V0VHlwZUNoZWNrKCk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCgoKCgoKaW50ZXJmYWNlIENvbnN0cmFpbnRJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCk6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEVycm9ycyhhcnJheSAkZXJyb3JzKTogdm9pZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRFcnJvcihDb25zdHJhaW50RXJyb3IgJGNvbnN0cmFpbnQsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsIGFycmF5ICRtb3JlID0gW10pOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmFsaWQoKTogYm9vbDsKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkOwp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxUb29sXERlZXBDb21wYXJlcjsKCgoKCgoKCmNsYXNzIEVudW1Db25zdHJhaW50IGV4dGVuZHMgQ29uc3RyYWludAp7CgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJGVsZW1lbnQsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKCmlmICgkZWxlbWVudCBpbnN0YW5jZW9mIFVuZGVmaW5lZENvbnN0cmFpbnQgJiYgKCFpc3NldCgkc2NoZW1hLT5yZXF1aXJlZCkgfHwgISRzY2hlbWEtPnJlcXVpcmVkKSkgewpyZXR1cm47Cn0KJHR5cGUgPSBnZXR0eXBlKCRlbGVtZW50KTsKCmZvcmVhY2ggKCRzY2hlbWEtPmVudW0gYXMgJGVudW0pIHsKJGVudW1UeXBlID0gZ2V0dHlwZSgkZW51bSk7CgppZiAoJGVudW1UeXBlID09PSAnb2JqZWN0JwomJiAkdHlwZSA9PT0gJ2FycmF5JwomJiAkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfVFlQRV9DQVNUKQomJiBEZWVwQ29tcGFyZXI6OmlzRXF1YWwoKG9iamVjdCkgJGVsZW1lbnQsICRlbnVtKQopIHsKcmV0dXJuOwp9CgppZiAoKCR0eXBlID09PSAkZW51bVR5cGUpICYmIERlZXBDb21wYXJlcjo6aXNFcXVhbCgkZWxlbWVudCwgJGVudW0pKSB7CnJldHVybjsKfQoKaWYgKGlzX251bWVyaWMoJGVsZW1lbnQpICYmIGlzX251bWVyaWMoJGVudW0pICYmIERlZXBDb21wYXJlcjo6aXNFcXVhbCgoZmxvYXQpICRlbGVtZW50LCAoZmxvYXQpICRlbnVtKSkgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RU5VTSgpLCAkcGF0aCwgWydlbnVtJyA9PiAkc2NoZW1hLT5lbnVtXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxTY2hlbWFTdG9yYWdlOwp1c2UgSnNvblNjaGVtYVxTY2hlbWFTdG9yYWdlSW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxVcmlcVXJpUmV0cmlldmVyOwp1c2UgSnNvblNjaGVtYVxVcmlSZXRyaWV2ZXJJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXFZhbGlkYXRvcjsKCgoKCmNsYXNzIEZhY3RvcnkKewoKCgpwcm90ZWN0ZWQgJHNjaGVtYVN0b3JhZ2U7CgoKCgpwcm90ZWN0ZWQgJHVyaVJldHJpZXZlcjsKCgoKCgpwcml2YXRlICRjaGVja01vZGUgPSBDb25zdHJhaW50OjpDSEVDS19NT0RFX05PUk1BTDsKCgoKCgpwcml2YXRlICR0eXBlQ2hlY2sgPSBbXTsKCgoKCnByb3RlY3RlZCAkZXJyb3JDb250ZXh0ID0gVmFsaWRhdG9yOjpFUlJPUl9ET0NVTUVOVF9WQUxJREFUSU9OOwoKCgoKcHJvdGVjdGVkICRjb25zdHJhaW50TWFwID0gWwonYXJyYXknID0+ICdKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbGxlY3Rpb25Db25zdHJhaW50JywKJ2NvbGxlY3Rpb24nID0+ICdKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbGxlY3Rpb25Db25zdHJhaW50JywKJ29iamVjdCcgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcT2JqZWN0Q29uc3RyYWludCcsCid0eXBlJyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xUeXBlQ29uc3RyYWludCcsCid1bmRlZmluZWQnID0+ICdKc29uU2NoZW1hXENvbnN0cmFpbnRzXFVuZGVmaW5lZENvbnN0cmFpbnQnLAonc3RyaW5nJyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xTdHJpbmdDb25zdHJhaW50JywKJ251bWJlcicgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcTnVtYmVyQ29uc3RyYWludCcsCidlbnVtJyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xFbnVtQ29uc3RyYWludCcsCidjb25zdCcgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RDb25zdHJhaW50JywKJ2Zvcm1hdCcgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcRm9ybWF0Q29uc3RyYWludCcsCidzY2hlbWEnID0+ICdKc29uU2NoZW1hXENvbnN0cmFpbnRzXFNjaGVtYUNvbnN0cmFpbnQnLAondmFsaWRhdG9yJyA9PiAnSnNvblNjaGVtYVxWYWxpZGF0b3InCl07CgoKCgpwcml2YXRlICRpbnN0YW5jZUNhY2hlID0gW107CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCj9TY2hlbWFTdG9yYWdlSW50ZXJmYWNlICRzY2hlbWFTdG9yYWdlID0gbnVsbCwKP1VyaVJldHJpZXZlckludGVyZmFjZSAkdXJpUmV0cmlldmVyID0gbnVsbCwKaW50ICRjaGVja01vZGUgPSBDb25zdHJhaW50OjpDSEVDS19NT0RFX05PUk1BTAopIHsKCiR0aGlzLT5zZXRDb25maWcoJGNoZWNrTW9kZSk7CgokdGhpcy0+dXJpUmV0cmlldmVyID0gJHVyaVJldHJpZXZlciA/OiBuZXcgVXJpUmV0cmlldmVyKCk7CiR0aGlzLT5zY2hlbWFTdG9yYWdlID0gJHNjaGVtYVN0b3JhZ2UgPzogbmV3IFNjaGVtYVN0b3JhZ2UoJHRoaXMtPnVyaVJldHJpZXZlcik7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25maWcoaW50ICRjaGVja01vZGUgPSBDb25zdHJhaW50OjpDSEVDS19NT0RFX05PUk1BTCk6IHZvaWQKewokdGhpcy0+Y2hlY2tNb2RlID0gJGNoZWNrTW9kZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQ29uZmlnKGludCAkb3B0aW9ucyk6IHZvaWQKewokdGhpcy0+Y2hlY2tNb2RlIHw9ICRvcHRpb25zOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVDb25maWcoaW50ICRvcHRpb25zKTogdm9pZAp7CiR0aGlzLT5jaGVja01vZGUgJj0gfiRvcHRpb25zOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25maWcoP2ludCAkb3B0aW9ucyA9IG51bGwpOiBpbnQKewppZiAoJG9wdGlvbnMgPT09IG51bGwpIHsKcmV0dXJuICR0aGlzLT5jaGVja01vZGU7Cn0KCnJldHVybiAkdGhpcy0+Y2hlY2tNb2RlICYgJG9wdGlvbnM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmlSZXRyaWV2ZXIoKTogVXJpUmV0cmlldmVySW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT51cmlSZXRyaWV2ZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTY2hlbWFTdG9yYWdlKCk6IFNjaGVtYVN0b3JhZ2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnNjaGVtYVN0b3JhZ2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlQ2hlY2soKTogVHlwZUNoZWNrXFR5cGVDaGVja0ludGVyZmFjZQp7CmlmICghaXNzZXQoJHRoaXMtPnR5cGVDaGVja1skdGhpcy0+Y2hlY2tNb2RlXSkpIHsKJHRoaXMtPnR5cGVDaGVja1skdGhpcy0+Y2hlY2tNb2RlXSA9ICgkdGhpcy0+Y2hlY2tNb2RlICYgQ29uc3RyYWludDo6Q0hFQ0tfTU9ERV9UWVBFX0NBU1QpCj8gbmV3IFR5cGVDaGVja1xMb29zZVR5cGVDaGVjaygpCjogbmV3IFR5cGVDaGVja1xTdHJpY3RUeXBlQ2hlY2soKTsKfQoKcmV0dXJuICR0aGlzLT50eXBlQ2hlY2tbJHRoaXMtPmNoZWNrTW9kZV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25zdHJhaW50Q2xhc3Moc3RyaW5nICRuYW1lLCBzdHJpbmcgJGNsYXNzKTogRmFjdG9yeQp7CgppZiAoIWNsYXNzX2V4aXN0cygkY2xhc3MpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vua25vd24gY29uc3RyYWludCAnIC4gJG5hbWUpOwp9CgppZiAoIWluX2FycmF5KCdKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2UnLCBjbGFzc19pbXBsZW1lbnRzKCRjbGFzcykpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgY2xhc3MgJyAuICRuYW1lKTsKfQokdGhpcy0+Y29uc3RyYWludE1hcFskbmFtZV0gPSAkY2xhc3M7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VGb3IoJGNvbnN0cmFpbnROYW1lKQp7CmlmICghaXNzZXQoJHRoaXMtPmNvbnN0cmFpbnRNYXBbJGNvbnN0cmFpbnROYW1lXSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVW5rbm93biBjb25zdHJhaW50ICcgLiAkY29uc3RyYWludE5hbWUpOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5pbnN0YW5jZUNhY2hlWyRjb25zdHJhaW50TmFtZV0pKSB7CiR0aGlzLT5pbnN0YW5jZUNhY2hlWyRjb25zdHJhaW50TmFtZV0gPSBuZXcgJHRoaXMtPmNvbnN0cmFpbnRNYXBbJGNvbnN0cmFpbnROYW1lXSgkdGhpcyk7Cn0KCnJldHVybiBjbG9uZSAkdGhpcy0+aW5zdGFuY2VDYWNoZVskY29uc3RyYWludE5hbWVdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvckNvbnRleHQoKTogaW50CnsKcmV0dXJuICR0aGlzLT5lcnJvckNvbnRleHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEVycm9yQ29udGV4dChpbnQgJGVycm9yQ29udGV4dCk6IHZvaWQKewokdGhpcy0+ZXJyb3JDb250ZXh0ID0gJGVycm9yQ29udGV4dDsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxSZmMzMzM5Owp1c2UgSnNvblNjaGVtYVxUb29sXFZhbGlkYXRvclxSZWxhdGl2ZVJlZmVyZW5jZVZhbGlkYXRvcjsKdXNlIEpzb25TY2hlbWFcVG9vbFxWYWxpZGF0b3JcVXJpVmFsaWRhdG9yOwoKCgoKCgoKCmNsYXNzIEZvcm1hdENvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkZWxlbWVudCwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIWlzc2V0KCRzY2hlbWEtPmZvcm1hdCkgfHwgJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX0RJU0FCTEVfRk9STUFUKSkgewpyZXR1cm47Cn0KCnN3aXRjaCAoJHNjaGVtYS0+Zm9ybWF0KSB7CmNhc2UgJ2RhdGUnOgppZiAoaXNfc3RyaW5nKCRlbGVtZW50KSAmJiAhJGRhdGUgPSAkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkZWxlbWVudCwgJ1ktbS1kJykpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0RBVEUoKSwgJHBhdGgsIFsKJ2RhdGUnID0+ICRlbGVtZW50LAonZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQKXQopOwp9CmJyZWFrOwoKY2FzZSAndGltZSc6CmlmIChpc19zdHJpbmcoJGVsZW1lbnQpICYmICEkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkZWxlbWVudCwgJ0g6aTpzJykpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1RJTUUoKSwgJHBhdGgsIFsKJ3RpbWUnID0+IGpzb25fZW5jb2RlKCRlbGVtZW50KSwKJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0LApdCik7Cn0KYnJlYWs7CgpjYXNlICdkYXRlLXRpbWUnOgppZiAoaXNfc3RyaW5nKCRlbGVtZW50KSAmJiBudWxsID09PSBSZmMzMzM5OjpjcmVhdGVGcm9tU3RyaW5nKCRlbGVtZW50KSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfREFURV9USU1FKCksICRwYXRoLCBbCidkYXRlVGltZScgPT4ganNvbl9lbmNvZGUoJGVsZW1lbnQpLAonZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQKXQopOwp9CmJyZWFrOwoKY2FzZSAndXRjLW1pbGxpc2VjJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkZWxlbWVudCwgJ1UnKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfREFURV9VVEMoKSwgJHBhdGgsIFsKJ3ZhbHVlJyA9PiAkZWxlbWVudCwKJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CgpjYXNlICdyZWdleCc6CmlmICghJHRoaXMtPnZhbGlkYXRlUmVnZXgoJGVsZW1lbnQpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9SRUdFWCgpLCAkcGF0aCwgWwondmFsdWUnID0+ICRlbGVtZW50LAonZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQKXQopOwp9CmJyZWFrOwoKY2FzZSAnY29sb3InOgppZiAoISR0aGlzLT52YWxpZGF0ZUNvbG9yKCRlbGVtZW50KSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfQ09MT1IoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKCmNhc2UgJ3N0eWxlJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVTdHlsZSgkZWxlbWVudCkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1NUWUxFKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CgpjYXNlICdwaG9uZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlUGhvbmUoJGVsZW1lbnQpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9QSE9ORSgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAndXJpJzoKaWYgKGlzX3N0cmluZygkZWxlbWVudCkgJiYgIVVyaVZhbGlkYXRvcjo6aXNWYWxpZCgkZWxlbWVudCkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1VSTCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAndXJpcmVmJzoKY2FzZSAndXJpLXJlZmVyZW5jZSc6CmlmIChpc19zdHJpbmcoJGVsZW1lbnQpICYmICEoVXJpVmFsaWRhdG9yOjppc1ZhbGlkKCRlbGVtZW50KSB8fCBSZWxhdGl2ZVJlZmVyZW5jZVZhbGlkYXRvcjo6aXNWYWxpZCgkZWxlbWVudCkpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9VUkwoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKCmNhc2UgJ2VtYWlsJzoKaWYgKGlzX3N0cmluZygkZWxlbWVudCkgJiYgbnVsbCA9PT0gZmlsdGVyX3ZhcigkZWxlbWVudCwgRklMVEVSX1ZBTElEQVRFX0VNQUlMLCBGSUxURVJfTlVMTF9PTl9GQUlMVVJFIHwgRklMVEVSX0ZMQUdfRU1BSUxfVU5JQ09ERSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0VNQUlMKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CgpjYXNlICdpcC1hZGRyZXNzJzoKY2FzZSAnaXB2NCc6CmlmIChpc19zdHJpbmcoJGVsZW1lbnQpICYmIG51bGwgPT09IGZpbHRlcl92YXIoJGVsZW1lbnQsIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX05VTExfT05fRkFJTFVSRSB8IEZJTFRFUl9GTEFHX0lQVjQpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9JUCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAnaXB2Nic6CmlmIChpc19zdHJpbmcoJGVsZW1lbnQpICYmIG51bGwgPT09IGZpbHRlcl92YXIoJGVsZW1lbnQsIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX05VTExfT05fRkFJTFVSRSB8IEZJTFRFUl9GTEFHX0lQVjYpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9JUCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAnaG9zdC1uYW1lJzoKY2FzZSAnaG9zdG5hbWUnOgppZiAoISR0aGlzLT52YWxpZGF0ZUhvc3RuYW1lKCRlbGVtZW50KSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfSE9TVE5BTUUoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKCmRlZmF1bHQ6CgoKCgoKCmJyZWFrOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZURhdGVUaW1lKCRkYXRldGltZSwgJGZvcm1hdCkKewokZHQgPSBcRGF0ZVRpbWU6OmNyZWF0ZUZyb21Gb3JtYXQoJGZvcm1hdCwgKHN0cmluZykgJGRhdGV0aW1lKTsKCmlmICghJGR0KSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCRkYXRldGltZSA9PT0gJGR0LT5mb3JtYXQoJGZvcm1hdCkpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlUmVnZXgoJHJlZ2V4KQp7CmlmICghaXNfc3RyaW5nKCRyZWdleCkpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZSAhPT0gQHByZWdfbWF0Y2goc2VsZjo6anNvblBhdHRlcm5Ub1BocFJlZ2V4KCRyZWdleCksICcnKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlQ29sb3IoJGNvbG9yKQp7CmlmICghaXNfc3RyaW5nKCRjb2xvcikpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpbl9hcnJheShzdHJ0b2xvd2VyKCRjb2xvciksIFsnYXF1YScsICdibGFjaycsICdibHVlJywgJ2Z1Y2hzaWEnLAonZ3JheScsICdncmVlbicsICdsaW1lJywgJ21hcm9vbicsICduYXZ5JywgJ29saXZlJywgJ29yYW5nZScsICdwdXJwbGUnLAoncmVkJywgJ3NpbHZlcicsICd0ZWFsJywgJ3doaXRlJywgJ3llbGxvdyddKSkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIHByZWdfbWF0Y2goJy9eIyhbYS1mMC05XXszfXxbYS1mMC05XXs2fSkkL2knLCAkY29sb3IpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVTdHlsZSgkc3R5bGUpCnsKJHByb3BlcnRpZXMgPSBleHBsb2RlKCc7JywgcnRyaW0oJHN0eWxlLCAnOycpKTsKJGludmFsaWRFbnRyaWVzID0gcHJlZ19ncmVwKCcvXlxzKlstYS16XStccyo6XHMqLiskL2knLCAkcHJvcGVydGllcywgUFJFR19HUkVQX0lOVkVSVCk7CgpyZXR1cm4gZW1wdHkoJGludmFsaWRFbnRyaWVzKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlUGhvbmUoJHBob25lKQp7CnJldHVybiBwcmVnX21hdGNoKCcvXlwrPyhcKFxkezN9XCl8XGR7M30pIFxkezN9IFxkezR9JC8nLCAkcGhvbmUpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVIb3N0bmFtZSgkaG9zdCkKewppZiAoIWlzX3N0cmluZygkaG9zdCkpIHsKcmV0dXJuIHRydWU7Cn0KCiRob3N0bmFtZVJlZ2V4ID0gJy9eKChbYS16QS1aMC05XXxbYS16QS1aMC05XVthLXpBLVowLTlcLV0qW2EtekEtWjAtOV0pXC4pKihbQS1aYS16MC05XXxbQS1aYS16MC05XVtBLVphLXowLTlcLV0qW0EtWmEtejAtOV0pJC9pJzsKCnJldHVybiBwcmVnX21hdGNoKCRob3N0bmFtZVJlZ2V4LCAkaG9zdCk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCgoKCgoKCmNsYXNzIE51bWJlckNvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkZWxlbWVudCwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewoKaWYgKGlzc2V0KCRzY2hlbWEtPmV4Y2x1c2l2ZU1pbmltdW0pKSB7CmlmIChpc3NldCgkc2NoZW1hLT5taW5pbXVtKSkgewppZiAoJHNjaGVtYS0+ZXhjbHVzaXZlTWluaW11bSAmJiAkZWxlbWVudCA8PSAkc2NoZW1hLT5taW5pbXVtKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkVYQ0xVU0lWRV9NSU5JTVVNKCksICRwYXRoLCBbJ21pbmltdW0nID0+ICRzY2hlbWEtPm1pbmltdW1dKTsKfSBlbHNlaWYgKCRlbGVtZW50IDwgJHNjaGVtYS0+bWluaW11bSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNSU5JTVVNKCksICRwYXRoLCBbJ21pbmltdW0nID0+ICRzY2hlbWEtPm1pbmltdW1dKTsKfQp9IGVsc2UgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNSVNTSU5HX01JTklNVU0oKSwgJHBhdGgpOwp9Cn0gZWxzZWlmIChpc3NldCgkc2NoZW1hLT5taW5pbXVtKSAmJiAkZWxlbWVudCA8ICRzY2hlbWEtPm1pbmltdW0pIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TUlOSU1VTSgpLCAkcGF0aCwgWydtaW5pbXVtJyA9PiAkc2NoZW1hLT5taW5pbXVtXSk7Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+ZXhjbHVzaXZlTWF4aW11bSkpIHsKaWYgKGlzc2V0KCRzY2hlbWEtPm1heGltdW0pKSB7CmlmICgkc2NoZW1hLT5leGNsdXNpdmVNYXhpbXVtICYmICRlbGVtZW50ID49ICRzY2hlbWEtPm1heGltdW0pIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RVhDTFVTSVZFX01BWElNVU0oKSwgJHBhdGgsIFsnbWF4aW11bScgPT4gJHNjaGVtYS0+bWF4aW11bV0pOwp9IGVsc2VpZiAoJGVsZW1lbnQgPiAkc2NoZW1hLT5tYXhpbXVtKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok1BWElNVU0oKSwgJHBhdGgsIFsnbWF4aW11bScgPT4gJHNjaGVtYS0+bWF4aW11bV0pOwp9Cn0gZWxzZSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok1JU1NJTkdfTUFYSU1VTSgpLCAkcGF0aCk7Cn0KfSBlbHNlaWYgKGlzc2V0KCRzY2hlbWEtPm1heGltdW0pICYmICRlbGVtZW50ID4gJHNjaGVtYS0+bWF4aW11bSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNQVhJTVVNKCksICRwYXRoLCBbJ21heGltdW0nID0+ICRzY2hlbWEtPm1heGltdW1dKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5kaXZpc2libGVCeSkgJiYgJHRoaXMtPmZtb2QoJGVsZW1lbnQsICRzY2hlbWEtPmRpdmlzaWJsZUJ5KSAhPSAwKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkRJVklTSUJMRV9CWSgpLCAkcGF0aCwgWydkaXZpc2libGVCeScgPT4gJHNjaGVtYS0+ZGl2aXNpYmxlQnldKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5tdWx0aXBsZU9mKSAmJiAkdGhpcy0+Zm1vZCgkZWxlbWVudCwgJHNjaGVtYS0+bXVsdGlwbGVPZikgIT0gMCkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNVUxUSVBMRV9PRigpLCAkcGF0aCwgWydtdWx0aXBsZU9mJyA9PiAkc2NoZW1hLT5tdWx0aXBsZU9mXSk7Cn0KCiR0aGlzLT5jaGVja0Zvcm1hdCgkZWxlbWVudCwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBmbW9kKCRudW1iZXIxLCAkbnVtYmVyMikKewokbW9kdWx1cyA9ICgkbnVtYmVyMSAtIHJvdW5kKCRudW1iZXIxIC8gJG51bWJlcjIpICogJG51bWJlcjIpOwokcHJlY2lzaW9uID0gMC4wMDAwMDAwMDAxOwoKaWYgKC0kcHJlY2lzaW9uIDwgJG1vZHVsdXMgJiYgJG1vZHVsdXMgPCAkcHJlY2lzaW9uKSB7CnJldHVybiAwLjA7Cn0KCnJldHVybiAkbW9kdWx1czsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKCgoKCgoKY2xhc3MgT2JqZWN0Q29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewoKCgpwcm90ZWN0ZWQgJGFwcGxpZWREZWZhdWx0cyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkZWxlbWVudCwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRwcm9wZXJ0aWVzID0gbnVsbCwKJGFkZGl0aW9uYWxQcm9wID0gbnVsbCwgJHBhdHRlcm5Qcm9wZXJ0aWVzID0gbnVsbCwgJGFwcGxpZWREZWZhdWx0cyA9IFtdKTogdm9pZAp7CmlmICgkZWxlbWVudCBpbnN0YW5jZW9mIFVuZGVmaW5lZENvbnN0cmFpbnQpIHsKcmV0dXJuOwp9CgokdGhpcy0+YXBwbGllZERlZmF1bHRzID0gJGFwcGxpZWREZWZhdWx0czsKCiRtYXRjaGVzID0gW107CmlmICgkcGF0dGVyblByb3BlcnRpZXMpIHsKCiRtYXRjaGVzID0gJHRoaXMtPnZhbGlkYXRlUGF0dGVyblByb3BlcnRpZXMoJGVsZW1lbnQsICRwYXRoLCAkcGF0dGVyblByb3BlcnRpZXMpOwp9CgppZiAoJHByb3BlcnRpZXMpIHsKCiR0aGlzLT52YWxpZGF0ZVByb3BlcnRpZXMoJGVsZW1lbnQsICRwcm9wZXJ0aWVzLCAkcGF0aCk7Cn0KCgokdGhpcy0+dmFsaWRhdGVFbGVtZW50KCRlbGVtZW50LCAkbWF0Y2hlcywgJHNjaGVtYSwgJHBhdGgsICRwcm9wZXJ0aWVzLCAkYWRkaXRpb25hbFByb3ApOwp9CgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVQYXR0ZXJuUHJvcGVydGllcygkZWxlbWVudCwgP0pzb25Qb2ludGVyICRwYXRoLCAkcGF0dGVyblByb3BlcnRpZXMpCnsKJG1hdGNoZXMgPSBbXTsKZm9yZWFjaCAoJHBhdHRlcm5Qcm9wZXJ0aWVzIGFzICRwcmVnZXggPT4gJHNjaGVtYSkgewokZnVsbFJlZ2V4ID0gc2VsZjo6anNvblBhdHRlcm5Ub1BocFJlZ2V4KCRwcmVnZXgpOwoKCmlmIChAcHJlZ19tYXRjaCgkZnVsbFJlZ2V4LCAnJykgPT09IGZhbHNlKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlBSRUdFWF9JTlZBTElEKCksICRwYXRoLCBbJ3ByZWdleCcgPT4gJHByZWdleF0pOwpjb250aW51ZTsKfQpmb3JlYWNoICgkZWxlbWVudCBhcyAkaSA9PiAkdmFsdWUpIHsKaWYgKHByZWdfbWF0Y2goJGZ1bGxSZWdleCwgJGkpKSB7CiRtYXRjaGVzW10gPSAkaTsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2YWx1ZSwgJHNjaGVtYSA/OiBuZXcgXHN0ZENsYXNzKCksICRwYXRoLCAkaSwgaW5fYXJyYXkoJGksICR0aGlzLT5hcHBsaWVkRGVmYXVsdHMpKTsKfQp9Cn0KCnJldHVybiAkbWF0Y2hlczsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoJGVsZW1lbnQsICRtYXRjaGVzLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwKJHByb3BlcnRpZXMgPSBudWxsLCAkYWRkaXRpb25hbFByb3AgPSBudWxsKQp7CiR0aGlzLT52YWxpZGF0ZU1pbk1heENvbnN0cmFpbnQoJGVsZW1lbnQsICRzY2hlbWEsICRwYXRoKTsKCmZvcmVhY2ggKCRlbGVtZW50IGFzICRpID0+ICR2YWx1ZSkgewokZGVmaW5pdGlvbiA9ICR0aGlzLT5nZXRQcm9wZXJ0eSgkcHJvcGVydGllcywgJGkpOwoKCmlmICghaW5fYXJyYXkoJGksICRtYXRjaGVzKSAmJiAkYWRkaXRpb25hbFByb3AgPT09IGZhbHNlICYmICR0aGlzLT5pbmxpbmVTY2hlbWFQcm9wZXJ0eSAhPT0gJGkgJiYgISRkZWZpbml0aW9uKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkFERElUSU9OQUxfUFJPUEVSVElFUygpLCAkcGF0aCwgWydwcm9wZXJ0eScgPT4gJGldKTsKfQoKCmlmICghaW5fYXJyYXkoJGksICRtYXRjaGVzKSAmJiAkYWRkaXRpb25hbFByb3AgJiYgISRkZWZpbml0aW9uKSB7CmlmICgkYWRkaXRpb25hbFByb3AgPT09IHRydWUpIHsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2YWx1ZSwgbnVsbCwgJHBhdGgsICRpLCBpbl9hcnJheSgkaSwgJHRoaXMtPmFwcGxpZWREZWZhdWx0cykpOwp9IGVsc2UgewokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCAkYWRkaXRpb25hbFByb3AsICRwYXRoLCAkaSwgaW5fYXJyYXkoJGksICR0aGlzLT5hcHBsaWVkRGVmYXVsdHMpKTsKfQp9CgoKJHJlcXVpcmUgPSAkdGhpcy0+Z2V0UHJvcGVydHkoJGRlZmluaXRpb24sICdyZXF1aXJlcycpOwppZiAoJHJlcXVpcmUgJiYgISR0aGlzLT5nZXRQcm9wZXJ0eSgkZWxlbWVudCwgJHJlcXVpcmUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlJFUVVJUkVTKCksICRwYXRoLCBbCidwcm9wZXJ0eScgPT4gJGksCidyZXF1aXJlZFByb3BlcnR5JyA9PiAkcmVxdWlyZQpdKTsKfQoKJHByb3BlcnR5ID0gJHRoaXMtPmdldFByb3BlcnR5KCRlbGVtZW50LCAkaSwgJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCd1bmRlZmluZWQnKSk7CmlmIChpc19vYmplY3QoJHByb3BlcnR5KSkgewokdGhpcy0+dmFsaWRhdGVNaW5NYXhDb25zdHJhaW50KCEoJHByb3BlcnR5IGluc3RhbmNlb2YgVW5kZWZpbmVkQ29uc3RyYWludCkgPyAkcHJvcGVydHkgOiAkZWxlbWVudCwgJGRlZmluaXRpb24sICRwYXRoKTsKfQp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzKCYkZWxlbWVudCwgJHByb3BlcnRpZXMgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsKQp7CiR1bmRlZmluZWRDb25zdHJhaW50ID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCd1bmRlZmluZWQnKTsKCmZvcmVhY2ggKCRwcm9wZXJ0aWVzIGFzICRpID0+ICR2YWx1ZSkgewokcHJvcGVydHkgPSAmJHRoaXMtPmdldFByb3BlcnR5KCRlbGVtZW50LCAkaSwgJHVuZGVmaW5lZENvbnN0cmFpbnQpOwokZGVmaW5pdGlvbiA9ICR0aGlzLT5nZXRQcm9wZXJ0eSgkcHJvcGVydGllcywgJGkpOwoKaWYgKGlzX29iamVjdCgkZGVmaW5pdGlvbikpIHsKCiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkcHJvcGVydHksICRkZWZpbml0aW9uLCAkcGF0aCwgJGksIGluX2FycmF5KCRpLCAkdGhpcy0+YXBwbGllZERlZmF1bHRzKSk7Cn0KfQp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gJmdldFByb3BlcnR5KCYkZWxlbWVudCwgJHByb3BlcnR5LCAkZmFsbGJhY2sgPSBudWxsKQp7CmlmIChpc19hcnJheSgkZWxlbWVudCkgJiYgKGlzc2V0KCRlbGVtZW50WyRwcm9wZXJ0eV0pIHx8IGFycmF5X2tleV9leGlzdHMoJHByb3BlcnR5LCAkZWxlbWVudCkpICkgewpyZXR1cm4gJGVsZW1lbnRbJHByb3BlcnR5XTsKfSBlbHNlaWYgKGlzX29iamVjdCgkZWxlbWVudCkgJiYgcHJvcGVydHlfZXhpc3RzKCRlbGVtZW50LCAoc3RyaW5nKSAkcHJvcGVydHkpKSB7CnJldHVybiAkZWxlbWVudC0+JHByb3BlcnR5Owp9CgpyZXR1cm4gJGZhbGxiYWNrOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlTWluTWF4Q29uc3RyYWludCgkZWxlbWVudCwgJG9iamVjdERlZmluaXRpb24sID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwpCnsKaWYgKCEkdGhpcy0+Z2V0VHlwZUNoZWNrKCk6OmlzT2JqZWN0KCRlbGVtZW50KSkgewpyZXR1cm47Cn0KCgppZiAoaXNzZXQoJG9iamVjdERlZmluaXRpb24tPm1pblByb3BlcnRpZXMpICYmIGlzX2ludCgkb2JqZWN0RGVmaW5pdGlvbi0+bWluUHJvcGVydGllcykpIHsKaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlDb3VudCgkZWxlbWVudCkgPCBtYXgoMCwgJG9iamVjdERlZmluaXRpb24tPm1pblByb3BlcnRpZXMpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlBST1BFUlRJRVNfTUlOKCksICRwYXRoLCBbJ21pblByb3BlcnRpZXMnID0+ICRvYmplY3REZWZpbml0aW9uLT5taW5Qcm9wZXJ0aWVzXSk7Cn0KfQoKaWYgKGlzc2V0KCRvYmplY3REZWZpbml0aW9uLT5tYXhQcm9wZXJ0aWVzKSAmJiBpc19pbnQoJG9iamVjdERlZmluaXRpb24tPm1heFByb3BlcnRpZXMpKSB7CmlmICgkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5Q291bnQoJGVsZW1lbnQpID4gbWF4KDAsICRvYmplY3REZWZpbml0aW9uLT5tYXhQcm9wZXJ0aWVzKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpQUk9QRVJUSUVTX01BWCgpLCAkcGF0aCwgWydtYXhQcm9wZXJ0aWVzJyA9PiAkb2JqZWN0RGVmaW5pdGlvbi0+bWF4UHJvcGVydGllc10pOwp9Cn0KfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZFNjaGVtYUV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFZhbGlkYXRvcjsKCgoKCgoKCmNsYXNzIFNjaGVtYUNvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKcHJpdmF0ZSBjb25zdCBERUZBVUxUX1NDSEVNQV9TUEVDID0gJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiRlbGVtZW50LCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICgkc2NoZW1hICE9PSBudWxsKSB7CgokdmFsaWRhdGlvblNjaGVtYSA9ICRzY2hlbWE7Cn0gZWxzZWlmICgkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5RXhpc3RzKCRlbGVtZW50LCAkdGhpcy0+aW5saW5lU2NoZW1hUHJvcGVydHkpKSB7CgokdmFsaWRhdGlvblNjaGVtYSA9ICR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlHZXQoJGVsZW1lbnQsICR0aGlzLT5pbmxpbmVTY2hlbWFQcm9wZXJ0eSk7Cn0gZWxzZSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ25vIHNjaGVtYSBmb3VuZCB0byB2ZXJpZnkgYWdhaW5zdCcpOwp9CgoKaWYgKGlzX2FycmF5KCR2YWxpZGF0aW9uU2NoZW1hKSkgewokdmFsaWRhdGlvblNjaGVtYSA9IEJhc2VDb25zdHJhaW50OjphcnJheVRvT2JqZWN0UmVjdXJzaXZlKCR2YWxpZGF0aW9uU2NoZW1hKTsKfQoKCgppZiAoJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX1ZBTElEQVRFX1NDSEVNQSkpIHsKaWYgKCEkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPmlzT2JqZWN0KCR2YWxpZGF0aW9uU2NoZW1hKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignQ2Fubm90IHZhbGlkYXRlIHRoZSBzY2hlbWEgb2YgYSBub24tb2JqZWN0Jyk7Cn0KaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlFeGlzdHMoJHZhbGlkYXRpb25TY2hlbWEsICckc2NoZW1hJykpIHsKJHNjaGVtYVNwZWMgPSAkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5R2V0KCR2YWxpZGF0aW9uU2NoZW1hLCAnJHNjaGVtYScpOwp9IGVsc2Ugewokc2NoZW1hU3BlYyA9IHNlbGY6OkRFRkFVTFRfU0NIRU1BX1NQRUM7Cn0KCgokc2NoZW1hU3RvcmFnZSA9ICR0aGlzLT5mYWN0b3J5LT5nZXRTY2hlbWFTdG9yYWdlKCk7CmlmICghJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc09iamVjdCgkc2NoZW1hU3BlYykpIHsKJHNjaGVtYVNwZWMgPSAkc2NoZW1hU3RvcmFnZS0+Z2V0U2NoZW1hKCRzY2hlbWFTcGVjKTsKfQoKCiRpbml0aWFsRXJyb3JDb3VudCA9ICR0aGlzLT5udW1FcnJvcnMoKTsKJGluaXRpYWxDb25maWcgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKCk7CiRpbml0aWFsQ29udGV4dCA9ICR0aGlzLT5mYWN0b3J5LT5nZXRFcnJvckNvbnRleHQoKTsKJHRoaXMtPmZhY3RvcnktPnJlbW92ZUNvbmZpZyhzZWxmOjpDSEVDS19NT0RFX1ZBTElEQVRFX1NDSEVNQSB8IHNlbGY6OkNIRUNLX01PREVfQVBQTFlfREVGQVVMVFMpOwokdGhpcy0+ZmFjdG9yeS0+YWRkQ29uZmlnKHNlbGY6OkNIRUNLX01PREVfVFlQRV9DQVNUKTsKJHRoaXMtPmZhY3RvcnktPnNldEVycm9yQ29udGV4dChWYWxpZGF0b3I6OkVSUk9SX1NDSEVNQV9WQUxJREFUSU9OKTsKCgp0cnkgewokdGhpcy0+Y2hlY2soJHZhbGlkYXRpb25TY2hlbWEsICRzY2hlbWFTcGVjKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX0VYQ0VQVElPTlMpKSB7CnRocm93IG5ldyBJbnZhbGlkU2NoZW1hRXhjZXB0aW9uKCdTY2hlbWEgZGlkIG5vdCBwYXNzIHZhbGlkYXRpb24nLCAwLCAkZSk7Cn0KfQppZiAoJHRoaXMtPm51bUVycm9ycygpID4gJGluaXRpYWxFcnJvckNvdW50KSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OklOVkFMSURfU0NIRU1BKCksICRwYXRoKTsKfQoKCiR0aGlzLT5mYWN0b3J5LT5zZXRDb25maWcoJGluaXRpYWxDb25maWcpOwokdGhpcy0+ZmFjdG9yeS0+c2V0RXJyb3JDb250ZXh0KCRpbml0aWFsQ29udGV4dCk7Cn0KCgokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJGVsZW1lbnQsICR2YWxpZGF0aW9uU2NoZW1hLCAkcGF0aCwgJGkpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgoKCgoKCgpjbGFzcyBTdHJpbmdDb25zdHJhaW50IGV4dGVuZHMgQ29uc3RyYWludAp7CgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJGVsZW1lbnQsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKCmlmIChpc3NldCgkc2NoZW1hLT5tYXhMZW5ndGgpICYmICR0aGlzLT5zdHJsZW4oJGVsZW1lbnQpID4gJHNjaGVtYS0+bWF4TGVuZ3RoKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkxFTkdUSF9NQVgoKSwgJHBhdGgsIFsKJ21heExlbmd0aCcgPT4gJHNjaGVtYS0+bWF4TGVuZ3RoLApdKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5taW5MZW5ndGgpICYmICR0aGlzLT5zdHJsZW4oJGVsZW1lbnQpIDwgJHNjaGVtYS0+bWluTGVuZ3RoKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkxFTkdUSF9NSU4oKSwgJHBhdGgsIFsKJ21pbkxlbmd0aCcgPT4gJHNjaGVtYS0+bWluTGVuZ3RoLApdKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5wYXR0ZXJuKSAmJiAhcHJlZ19tYXRjaChzZWxmOjpqc29uUGF0dGVyblRvUGhwUmVnZXgoJHNjaGVtYS0+cGF0dGVybiksICRlbGVtZW50KSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpQQVRURVJOKCksICRwYXRoLCBbCidwYXR0ZXJuJyA9PiAkc2NoZW1hLT5wYXR0ZXJuLApdKTsKfQoKJHRoaXMtPmNoZWNrRm9ybWF0KCRlbGVtZW50LCAkc2NoZW1hLCAkcGF0aCwgJGkpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHN0cmxlbigkc3RyaW5nKQp7CmlmIChleHRlbnNpb25fbG9hZGVkKCdtYnN0cmluZycpKSB7CnJldHVybiBtYl9zdHJsZW4oJHN0cmluZywgbWJfZGV0ZWN0X2VuY29kaW5nKCRzdHJpbmcpKTsKfQoKCnJldHVybiBzdHJsZW4oJHN0cmluZyk7IAp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcVHlwZUNoZWNrOwoKY2xhc3MgTG9vc2VUeXBlQ2hlY2sgaW1wbGVtZW50cyBUeXBlQ2hlY2tJbnRlcmZhY2UKewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzT2JqZWN0KCR2YWx1ZSkKewpyZXR1cm4KaXNfb2JqZWN0KCR2YWx1ZSkgfHwKKGlzX2FycmF5KCR2YWx1ZSkgJiYgKGNvdW50KCR2YWx1ZSkgPT0gMCB8fCBzZWxmOjppc0Fzc29jaWF0aXZlQXJyYXkoJHZhbHVlKSkpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQXJyYXkoJHZhbHVlKQp7CnJldHVybgppc19hcnJheSgkdmFsdWUpICYmCihjb3VudCgkdmFsdWUpID09IDAgfHwgIXNlbGY6OmlzQXNzb2NpYXRpdmVBcnJheSgkdmFsdWUpKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eUdldCgkdmFsdWUsICRwcm9wZXJ0eSkKewppZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuICR2YWx1ZS0+eyRwcm9wZXJ0eX07Cn0KCnJldHVybiAkdmFsdWVbJHByb3BlcnR5XTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eVNldCgmJHZhbHVlLCAkcHJvcGVydHksICRkYXRhKQp7CmlmIChpc19vYmplY3QoJHZhbHVlKSkgewokdmFsdWUtPnskcHJvcGVydHl9ID0gJGRhdGE7Cn0gZWxzZSB7CiR2YWx1ZVskcHJvcGVydHldID0gJGRhdGE7Cn0KfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eUV4aXN0cygkdmFsdWUsICRwcm9wZXJ0eSkKewppZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuIHByb3BlcnR5X2V4aXN0cygkdmFsdWUsICRwcm9wZXJ0eSk7Cn0KCnJldHVybiBpc19hcnJheSgkdmFsdWUpICYmIGFycmF5X2tleV9leGlzdHMoJHByb3BlcnR5LCAkdmFsdWUpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5Q291bnQoJHZhbHVlKQp7CmlmIChpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm4gY291bnQoZ2V0X29iamVjdF92YXJzKCR2YWx1ZSkpOwp9CgpyZXR1cm4gY291bnQoJHZhbHVlKTsKfQoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzQXNzb2NpYXRpdmVBcnJheSgkYXJyKQp7CnJldHVybiBhcnJheV9rZXlzKCRhcnIpICE9PSByYW5nZSgwLCBjb3VudCgkYXJyKSAtIDEpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcVHlwZUNoZWNrOwoKY2xhc3MgU3RyaWN0VHlwZUNoZWNrIGltcGxlbWVudHMgVHlwZUNoZWNrSW50ZXJmYWNlCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc09iamVjdCgkdmFsdWUpCnsKcmV0dXJuIGlzX29iamVjdCgkdmFsdWUpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQXJyYXkoJHZhbHVlKQp7CnJldHVybiBpc19hcnJheSgkdmFsdWUpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5R2V0KCR2YWx1ZSwgJHByb3BlcnR5KQp7CnJldHVybiAkdmFsdWUtPnskcHJvcGVydHl9Owp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5U2V0KCYkdmFsdWUsICRwcm9wZXJ0eSwgJGRhdGEpCnsKJHZhbHVlLT57JHByb3BlcnR5fSA9ICRkYXRhOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5RXhpc3RzKCR2YWx1ZSwgJHByb3BlcnR5KQp7CnJldHVybiBwcm9wZXJ0eV9leGlzdHMoJHZhbHVlLCAkcHJvcGVydHkpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5Q291bnQoJHZhbHVlKQp7CmlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuIDA7Cn0KCnJldHVybiBjb3VudChnZXRfb2JqZWN0X3ZhcnMoJHZhbHVlKSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xUeXBlQ2hlY2s7CgppbnRlcmZhY2UgVHlwZUNoZWNrSW50ZXJmYWNlCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc09iamVjdCgkdmFsdWUpOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0FycmF5KCR2YWx1ZSk7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5R2V0KCR2YWx1ZSwgJHByb3BlcnR5KTsKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlTZXQoJiR2YWx1ZSwgJHByb3BlcnR5LCAkZGF0YSk7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5RXhpc3RzKCR2YWx1ZSwgJHByb3BlcnR5KTsKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlDb3VudCgkdmFsdWUpOwp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uIGFzIFN0YW5kYXJkVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uOwoKCgoKCgoKY2xhc3MgVHlwZUNvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIHN0YXRpYyAkd29yZGluZyA9IFsKJ2ludGVnZXInID0+ICdhbiBpbnRlZ2VyJywKJ251bWJlcicgPT4gJ2EgbnVtYmVyJywKJ2Jvb2xlYW4nID0+ICdhIGJvb2xlYW4nLAonb2JqZWN0JyA9PiAnYW4gb2JqZWN0JywKJ2FycmF5JyA9PiAnYW4gYXJyYXknLAonc3RyaW5nJyA9PiAnYSBzdHJpbmcnLAonbnVsbCcgPT4gJ2EgbnVsbCcsCidhbnknID0+IG51bGwsIAowID0+IG51bGwsIApdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUgPSBudWxsLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CiR0eXBlID0gaXNzZXQoJHNjaGVtYS0+dHlwZSkgPyAkc2NoZW1hLT50eXBlIDogbnVsbDsKJGlzVmFsaWQgPSBmYWxzZTsKJGNvZXJjZSA9ICR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoc2VsZjo6Q0hFQ0tfTU9ERV9DT0VSQ0VfVFlQRVMpOwokZWFybHlDb2VyY2UgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfRUFSTFlfQ09FUkNFKTsKJHdvcmRpbmcgPSBbXTsKCmlmIChpc19hcnJheSgkdHlwZSkpIHsKJHRoaXMtPnZhbGlkYXRlVHlwZXNBcnJheSgkdmFsdWUsICR0eXBlLCAkd29yZGluZywgJGlzVmFsaWQsICRwYXRoLCAkY29lcmNlICYmICRlYXJseUNvZXJjZSk7CmlmICghJGlzVmFsaWQgJiYgJGNvZXJjZSAmJiAhJGVhcmx5Q29lcmNlKSB7CiR0aGlzLT52YWxpZGF0ZVR5cGVzQXJyYXkoJHZhbHVlLCAkdHlwZSwgJHdvcmRpbmcsICRpc1ZhbGlkLCAkcGF0aCwgdHJ1ZSk7Cn0KfSBlbHNlaWYgKGlzX29iamVjdCgkdHlwZSkpIHsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2YWx1ZSwgJHR5cGUsICRwYXRoKTsKCnJldHVybjsKfSBlbHNlIHsKJGlzVmFsaWQgPSAkdGhpcy0+dmFsaWRhdGVUeXBlKCR2YWx1ZSwgJHR5cGUsICRjb2VyY2UgJiYgJGVhcmx5Q29lcmNlKTsKaWYgKCEkaXNWYWxpZCAmJiAkY29lcmNlICYmICEkZWFybHlDb2VyY2UpIHsKJGlzVmFsaWQgPSAkdGhpcy0+dmFsaWRhdGVUeXBlKCR2YWx1ZSwgJHR5cGUsIHRydWUpOwp9Cn0KCmlmICgkaXNWYWxpZCA9PT0gZmFsc2UpIHsKaWYgKCFpc19hcnJheSgkdHlwZSkpIHsKJHRoaXMtPnZhbGlkYXRlVHlwZU5hbWVXb3JkaW5nKCR0eXBlKTsKJHdvcmRpbmdbXSA9IHNlbGY6OiR3b3JkaW5nWyR0eXBlXTsKfQokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpUWVBFKCksICRwYXRoLCBbCidmb3VuZCcgPT4gZ2V0dHlwZSgkdmFsdWUpLAonZXhwZWN0ZWQnID0+ICR0aGlzLT5pbXBsb2RlV2l0aCgkd29yZGluZywgJywgJywgJ29yJykKXSk7Cn0KfQoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlVHlwZXNBcnJheSgmJHZhbHVlLCBhcnJheSAkdHlwZSwgJiR2YWxpZFR5cGVzV29yZGluZywgJiRpc1ZhbGlkLCAkcGF0aCwgJGNvZXJjZSA9IGZhbHNlKQp7CmZvcmVhY2ggKCR0eXBlIGFzICR0cCkgewoKaWYgKCRpc1ZhbGlkKSB7CnJldHVybjsKfQoKCgppZiAoaXNfb2JqZWN0KCR0cCkpIHsKaWYgKCEkaXNWYWxpZCkgewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCd0eXBlJyk7CiRzdWJTY2hlbWEgPSBuZXcgXHN0ZENsYXNzKCk7CiRzdWJTY2hlbWEtPnR5cGUgPSAkdHA7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHN1YlNjaGVtYSwgJHBhdGgsIG51bGwpOwokZXJyb3IgPSAkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKTsKJGlzVmFsaWQgPSAhKGJvb2wpICRlcnJvcjsKJHZhbGlkVHlwZXNXb3JkaW5nW10gPSBzZWxmOjokd29yZGluZ1snb2JqZWN0J107Cn0KfSBlbHNlIHsKJHRoaXMtPnZhbGlkYXRlVHlwZU5hbWVXb3JkaW5nKCR0cCk7CiR2YWxpZFR5cGVzV29yZGluZ1tdID0gc2VsZjo6JHdvcmRpbmdbJHRwXTsKaWYgKCEkaXNWYWxpZCkgewokaXNWYWxpZCA9ICR0aGlzLT52YWxpZGF0ZVR5cGUoJHZhbHVlLCAkdHAsICRjb2VyY2UpOwp9Cn0KfQp9CgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbXBsb2RlV2l0aChhcnJheSAkZWxlbWVudHMsICRkZWxpbWl0ZXIgPSAnLCAnLCAkbGlzdEVuZCA9IGZhbHNlKQp7CmlmICgkbGlzdEVuZCA9PT0gZmFsc2UgfHwgIWlzc2V0KCRlbGVtZW50c1sxXSkpIHsKcmV0dXJuIGltcGxvZGUoJGRlbGltaXRlciwgJGVsZW1lbnRzKTsKfQokbGFzdEVsZW1lbnQgPSBhcnJheV9zbGljZSgkZWxlbWVudHMsIC0xKTsKJGZpcnNFbGVtZW50cyA9IGpvaW4oJGRlbGltaXRlciwgYXJyYXlfc2xpY2UoJGVsZW1lbnRzLCAwLCAtMSkpOwokaW1wbG9kZWRFbGVtZW50cyA9IGFycmF5X21lcmdlKFskZmlyc0VsZW1lbnRzXSwgJGxhc3RFbGVtZW50KTsKCnJldHVybiBqb2luKCIgJGxpc3RFbmQgIiwgJGltcGxvZGVkRWxlbWVudHMpOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZVR5cGVOYW1lV29yZGluZygkdHlwZSkKewppZiAoIWFycmF5X2tleV9leGlzdHMoJHR5cGUsIHNlbGY6OiR3b3JkaW5nKSkgewp0aHJvdyBuZXcgU3RhbmRhcmRVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oCnNwcmludGYoCidObyB3b3JkaW5nIGZvciAlcyBhdmFpbGFibGUsIGV4cGVjdGVkIHdvcmRpbmdzIGFyZTogWyVzXScsCnZhcl9leHBvcnQoJHR5cGUsIHRydWUpLAppbXBsb2RlKCcsICcsIGFycmF5X2ZpbHRlcihzZWxmOjokd29yZGluZykpKQopOwp9Cn0KCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVUeXBlKCYkdmFsdWUsICR0eXBlLCAkY29lcmNlID0gZmFsc2UpCnsKCmlmICghJHR5cGUpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgnYW55JyA9PT0gJHR5cGUpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgnb2JqZWN0JyA9PT0gJHR5cGUpIHsKcmV0dXJuICR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNPYmplY3QoJHZhbHVlKTsKfQoKaWYgKCdhcnJheScgPT09ICR0eXBlKSB7CmlmICgkY29lcmNlKSB7CiR2YWx1ZSA9ICR0aGlzLT50b0FycmF5KCR2YWx1ZSk7Cn0KCnJldHVybiAkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPmlzQXJyYXkoJHZhbHVlKTsKfQoKaWYgKCdpbnRlZ2VyJyA9PT0gJHR5cGUpIHsKaWYgKCRjb2VyY2UpIHsKJHZhbHVlID0gJHRoaXMtPnRvSW50ZWdlcigkdmFsdWUpOwp9CgpyZXR1cm4gaXNfaW50KCR2YWx1ZSk7Cn0KCmlmICgnbnVtYmVyJyA9PT0gJHR5cGUpIHsKaWYgKCRjb2VyY2UpIHsKJHZhbHVlID0gJHRoaXMtPnRvTnVtYmVyKCR2YWx1ZSk7Cn0KCnJldHVybiBpc19udW1lcmljKCR2YWx1ZSkgJiYgIWlzX3N0cmluZygkdmFsdWUpOwp9CgppZiAoJ2Jvb2xlYW4nID09PSAkdHlwZSkgewppZiAoJGNvZXJjZSkgewokdmFsdWUgPSAkdGhpcy0+dG9Cb29sZWFuKCR2YWx1ZSk7Cn0KCnJldHVybiBpc19ib29sKCR2YWx1ZSk7Cn0KCmlmICgnc3RyaW5nJyA9PT0gJHR5cGUpIHsKaWYgKCRjb2VyY2UpIHsKJHZhbHVlID0gJHRoaXMtPnRvU3RyaW5nKCR2YWx1ZSk7Cn0KCnJldHVybiBpc19zdHJpbmcoJHZhbHVlKTsKfQoKaWYgKCdudWxsJyA9PT0gJHR5cGUpIHsKaWYgKCRjb2VyY2UpIHsKJHZhbHVlID0gJHRoaXMtPnRvTnVsbCgkdmFsdWUpOwp9CgpyZXR1cm4gaXNfbnVsbCgkdmFsdWUpOwp9Cgp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKChpc19vYmplY3QoJHZhbHVlKSA/ICdvYmplY3QnIDogJHZhbHVlKSAuICcgaXMgYW4gaW52YWxpZCB0eXBlIGZvciAnIC4gJHR5cGUpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHRvQm9vbGVhbigkdmFsdWUpCnsKaWYgKCR2YWx1ZSA9PT0gMSB8fCAkdmFsdWUgPT09ICd0cnVlJykgewpyZXR1cm4gdHJ1ZTsKfQppZiAoaXNfbnVsbCgkdmFsdWUpIHx8ICR2YWx1ZSA9PT0gMCB8fCAkdmFsdWUgPT09ICdmYWxzZScpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPmlzQXJyYXkoJHZhbHVlKSAmJiBjb3VudCgkdmFsdWUpID09PSAxKSB7CnJldHVybiAkdGhpcy0+dG9Cb29sZWFuKHJlc2V0KCR2YWx1ZSkpOwp9CgpyZXR1cm4gJHZhbHVlOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHRvTnVtYmVyKCR2YWx1ZSkKewppZiAoaXNfbnVtZXJpYygkdmFsdWUpKSB7CnJldHVybiAkdmFsdWUgKyAwOyAKfQppZiAoaXNfYm9vbCgkdmFsdWUpIHx8IGlzX251bGwoJHZhbHVlKSkgewpyZXR1cm4gKGludCkgJHZhbHVlOwp9CmlmICgkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPmlzQXJyYXkoJHZhbHVlKSAmJiBjb3VudCgkdmFsdWUpID09PSAxKSB7CnJldHVybiAkdGhpcy0+dG9OdW1iZXIocmVzZXQoJHZhbHVlKSk7Cn0KCnJldHVybiAkdmFsdWU7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdG9JbnRlZ2VyKCR2YWx1ZSkKewokbnVtYmVyVmFsdWUgPSAkdGhpcy0+dG9OdW1iZXIoJHZhbHVlKTsKaWYgKGlzX251bWVyaWMoJG51bWJlclZhbHVlKSAmJiAoaW50KSAkbnVtYmVyVmFsdWUgPT0gJG51bWJlclZhbHVlKSB7CnJldHVybiAoaW50KSAkbnVtYmVyVmFsdWU7IAp9CgpyZXR1cm4gJHZhbHVlOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHRvQXJyYXkoJHZhbHVlKQp7CmlmIChpc19zY2FsYXIoJHZhbHVlKSB8fCBpc19udWxsKCR2YWx1ZSkpIHsKcmV0dXJuIFskdmFsdWVdOwp9CgpyZXR1cm4gJHZhbHVlOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHRvU3RyaW5nKCR2YWx1ZSkKewppZiAoaXNfbnVtZXJpYygkdmFsdWUpKSB7CnJldHVybiAiJHZhbHVlIjsKfQppZiAoJHZhbHVlID09PSB0cnVlKSB7CnJldHVybiAndHJ1ZSc7Cn0KaWYgKCR2YWx1ZSA9PT0gZmFsc2UpIHsKcmV0dXJuICdmYWxzZSc7Cn0KaWYgKGlzX251bGwoJHZhbHVlKSkgewpyZXR1cm4gJyc7Cn0KaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNBcnJheSgkdmFsdWUpICYmIGNvdW50KCR2YWx1ZSkgPT09IDEpIHsKcmV0dXJuICR0aGlzLT50b1N0cmluZyhyZXNldCgkdmFsdWUpKTsKfQoKcmV0dXJuICR2YWx1ZTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0b051bGwoJHZhbHVlKQp7CmlmICgkdmFsdWUgPT09IDAgfHwgJHZhbHVlID09PSBmYWxzZSB8fCAkdmFsdWUgPT09ICcnKSB7CnJldHVybiBudWxsOwp9CmlmICgkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPmlzQXJyYXkoJHZhbHVlKSAmJiBjb3VudCgkdmFsdWUpID09PSAxKSB7CnJldHVybiAkdGhpcy0+dG9OdWxsKHJlc2V0KCR2YWx1ZSkpOwp9CgpyZXR1cm4gJHZhbHVlOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xUeXBlQ2hlY2tcTG9vc2VUeXBlQ2hlY2s7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFZhbGlkYXRpb25FeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFRvb2xcRGVlcENvcHk7CnVzZSBKc29uU2NoZW1hXFVyaVxVcmlSZXNvbHZlcjsKCgoKCgoKCiNbXEFsbG93RHluYW1pY1Byb3BlcnRpZXNdCmNsYXNzIFVuZGVmaW5lZENvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHJvdGVjdGVkICRhcHBsaWVkRGVmYXVsdHMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsLCAkZnJvbURlZmF1bHQgPSBmYWxzZSk6IHZvaWQKewppZiAoaXNfbnVsbCgkc2NoZW1hKSB8fCAhaXNfb2JqZWN0KCRzY2hlbWEpKSB7CnJldHVybjsKfQoKJHBhdGggPSAkdGhpcy0+aW5jcmVtZW50UGF0aCgkcGF0aCwgJGkpOwppZiAoJGZyb21EZWZhdWx0KSB7CiRwYXRoLT5zZXRGcm9tRGVmYXVsdCgpOwp9CgoKJHRoaXMtPnZhbGlkYXRlQ29tbW9uUHJvcGVydGllcygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CgoKJHRoaXMtPnZhbGlkYXRlT2ZQcm9wZXJ0aWVzKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICcnKTsKCgokdGhpcy0+dmFsaWRhdGVUeXBlcygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlVHlwZXMoJiR2YWx1ZSwgJHNjaGVtYSwgSnNvblBvaW50ZXIgJHBhdGgsICRpID0gbnVsbCkKewoKaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNBcnJheSgkdmFsdWUpKSB7CiR0aGlzLT5jaGVja0FycmF5KCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCmlmIChMb29zZVR5cGVDaGVjazo6aXNPYmplY3QoJHZhbHVlKSkgeyAKCgokdGhpcy0+Y2hlY2tPYmplY3QoCiR2YWx1ZSwKJHNjaGVtYSwKJHBhdGgsCmlzc2V0KCRzY2hlbWEtPnByb3BlcnRpZXMpID8gJHNjaGVtYS0+cHJvcGVydGllcyA6IG51bGwsCmlzc2V0KCRzY2hlbWEtPmFkZGl0aW9uYWxQcm9wZXJ0aWVzKSA/ICRzY2hlbWEtPmFkZGl0aW9uYWxQcm9wZXJ0aWVzIDogbnVsbCwKaXNzZXQoJHNjaGVtYS0+cGF0dGVyblByb3BlcnRpZXMpID8gJHNjaGVtYS0+cGF0dGVyblByb3BlcnRpZXMgOiBudWxsLAokdGhpcy0+YXBwbGllZERlZmF1bHRzCik7Cn0KCgppZiAoaXNfc3RyaW5nKCR2YWx1ZSkpIHsKJHRoaXMtPmNoZWNrU3RyaW5nKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCmlmIChpc19udW1lcmljKCR2YWx1ZSkpIHsKJHRoaXMtPmNoZWNrTnVtYmVyKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5lbnVtKSkgewokdGhpcy0+Y2hlY2tFbnVtKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5jb25zdCkpIHsKJHRoaXMtPmNoZWNrQ29uc3QoJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwp9Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlQ29tbW9uUHJvcGVydGllcygmJHZhbHVlLCAkc2NoZW1hLCBKc29uUG9pbnRlciAkcGF0aCwgJGkgPSAnJykKewoKaWYgKGlzc2V0KCRzY2hlbWEtPmV4dGVuZHMpKSB7CmlmIChpc19zdHJpbmcoJHNjaGVtYS0+ZXh0ZW5kcykpIHsKJHNjaGVtYS0+ZXh0ZW5kcyA9ICR0aGlzLT52YWxpZGF0ZVVyaSgkc2NoZW1hLCAkc2NoZW1hLT5leHRlbmRzKTsKfQppZiAoaXNfYXJyYXkoJHNjaGVtYS0+ZXh0ZW5kcykpIHsKZm9yZWFjaCAoJHNjaGVtYS0+ZXh0ZW5kcyBhcyAkZXh0ZW5kcykgewokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCAkZXh0ZW5kcywgJHBhdGgsICRpKTsKfQp9IGVsc2UgewokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCAkc2NoZW1hLT5leHRlbmRzLCAkcGF0aCwgJGkpOwp9Cn0KCgppZiAoISRwYXRoLT5mcm9tRGVmYXVsdCgpKSB7CiR0aGlzLT5hcHBseURlZmF1bHRWYWx1ZXMoJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCk7Cn0KCgppZiAoJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc09iamVjdCgkdmFsdWUpKSB7CmlmICghKCR2YWx1ZSBpbnN0YW5jZW9mIHNlbGYpICYmIGlzc2V0KCRzY2hlbWEtPnJlcXVpcmVkKSAmJiBpc19hcnJheSgkc2NoZW1hLT5yZXF1aXJlZCkpIHsKCmZvcmVhY2ggKCRzY2hlbWEtPnJlcXVpcmVkIGFzICRyZXF1aXJlZCkgewppZiAoISR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlFeGlzdHMoJHZhbHVlLCAkcmVxdWlyZWQpKSB7CiR0aGlzLT5hZGRFcnJvcigKQ29uc3RyYWludEVycm9yOjpSRVFVSVJFRCgpLAokdGhpcy0+aW5jcmVtZW50UGF0aCgkcGF0aCwgJHJlcXVpcmVkKSwgWwoncHJvcGVydHknID0+ICRyZXF1aXJlZApdCik7Cn0KfQp9IGVsc2VpZiAoaXNzZXQoJHNjaGVtYS0+cmVxdWlyZWQpICYmICFpc19hcnJheSgkc2NoZW1hLT5yZXF1aXJlZCkpIHsKCmlmICgkc2NoZW1hLT5yZXF1aXJlZCAmJiAkdmFsdWUgaW5zdGFuY2VvZiBzZWxmKSB7CiRwcm9wZXJ0eVBhdGhzID0gJHBhdGgtPmdldFByb3BlcnR5UGF0aHMoKTsKJHByb3BlcnR5TmFtZSA9IGVuZCgkcHJvcGVydHlQYXRocyk7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlJFUVVJUkVEKCksICRwYXRoLCBbJ3Byb3BlcnR5JyA9PiAkcHJvcGVydHlOYW1lXSk7Cn0KfSBlbHNlIHsKCgppZiAoJHZhbHVlIGluc3RhbmNlb2Ygc2VsZikgewpyZXR1cm47Cn0KfQp9CgoKaWYgKCEoJHZhbHVlIGluc3RhbmNlb2Ygc2VsZikpIHsKJHRoaXMtPmNoZWNrVHlwZSgkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+ZGlzYWxsb3cpKSB7CiRpbml0RXJyb3JzID0gJHRoaXMtPmdldEVycm9ycygpOwoKJHR5cGVTY2hlbWEgPSBuZXcgXHN0ZENsYXNzKCk7CiR0eXBlU2NoZW1hLT50eXBlID0gJHNjaGVtYS0+ZGlzYWxsb3c7CiR0aGlzLT5jaGVja1R5cGUoJHZhbHVlLCAkdHlwZVNjaGVtYSwgJHBhdGgpOwoKCmlmIChjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpID09IGNvdW50KCRpbml0RXJyb3JzKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpESVNBTExPVygpLCAkcGF0aCk7Cn0gZWxzZSB7CiR0aGlzLT5lcnJvcnMgPSAkaW5pdEVycm9yczsKfQp9CgppZiAoaXNzZXQoJHNjaGVtYS0+bm90KSkgewokaW5pdEVycm9ycyA9ICR0aGlzLT5nZXRFcnJvcnMoKTsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2YWx1ZSwgJHNjaGVtYS0+bm90LCAkcGF0aCwgJGkpOwoKCmlmIChjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpID09IGNvdW50KCRpbml0RXJyb3JzKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpOT1QoKSwgJHBhdGgpOwp9IGVsc2UgewokdGhpcy0+ZXJyb3JzID0gJGluaXRFcnJvcnM7Cn0KfQoKCmlmIChpc3NldCgkc2NoZW1hLT5kZXBlbmRlbmNpZXMpICYmICR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNPYmplY3QoJHZhbHVlKSkgewokdGhpcy0+dmFsaWRhdGVEZXBlbmRlbmNpZXMoJHZhbHVlLCAkc2NoZW1hLT5kZXBlbmRlbmNpZXMsICRwYXRoKTsKfQp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNob3VsZEFwcGx5RGVmYXVsdFZhbHVlKCRyZXF1aXJlZE9ubHksICRzY2hlbWEsICRuYW1lID0gbnVsbCwgJHBhcmVudFNjaGVtYSA9IG51bGwpCnsKCmlmICghJHJlcXVpcmVkT25seSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKAokbmFtZSAhPT0gbnVsbAomJiBpc3NldCgkcGFyZW50U2NoZW1hLT5yZXF1aXJlZCkKJiYgaXNfYXJyYXkoJHBhcmVudFNjaGVtYS0+cmVxdWlyZWQpCiYmIGluX2FycmF5KCRuYW1lLCAkcGFyZW50U2NoZW1hLT5yZXF1aXJlZCkKKSB7CnJldHVybiB0cnVlOwp9CgppZiAoaXNzZXQoJHNjaGVtYS0+cmVxdWlyZWQpICYmICFpc19hcnJheSgkc2NoZW1hLT5yZXF1aXJlZCkgJiYgJHNjaGVtYS0+cmVxdWlyZWQpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhcHBseURlZmF1bHRWYWx1ZXMoJiR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgpOiB2b2lkCnsKCmlmICghJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX0FQUExZX0RFRkFVTFRTKSkgewpyZXR1cm47Cn0KCgokcmVxdWlyZWRPbmx5ID0gKGJvb2wpICR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoc2VsZjo6Q0hFQ0tfTU9ERV9PTkxZX1JFUVVJUkVEX0RFRkFVTFRTKTsKaWYgKGlzc2V0KCRzY2hlbWEtPnByb3BlcnRpZXMpICYmIExvb3NlVHlwZUNoZWNrOjppc09iamVjdCgkdmFsdWUpKSB7Cgpmb3JlYWNoICgkc2NoZW1hLT5wcm9wZXJ0aWVzIGFzICRjdXJyZW50UHJvcGVydHkgPT4gJHByb3BlcnR5RGVmaW5pdGlvbikgewokcHJvcGVydHlEZWZpbml0aW9uID0gJHRoaXMtPmZhY3RvcnktPmdldFNjaGVtYVN0b3JhZ2UoKS0+cmVzb2x2ZVJlZlNjaGVtYSgkcHJvcGVydHlEZWZpbml0aW9uKTsKaWYgKAohTG9vc2VUeXBlQ2hlY2s6OnByb3BlcnR5RXhpc3RzKCR2YWx1ZSwgJGN1cnJlbnRQcm9wZXJ0eSkKJiYgcHJvcGVydHlfZXhpc3RzKCRwcm9wZXJ0eURlZmluaXRpb24sICdkZWZhdWx0JykKJiYgJHRoaXMtPnNob3VsZEFwcGx5RGVmYXVsdFZhbHVlKCRyZXF1aXJlZE9ubHksICRwcm9wZXJ0eURlZmluaXRpb24sICRjdXJyZW50UHJvcGVydHksICRzY2hlbWEpCikgewoKaWYgKGlzX29iamVjdCgkcHJvcGVydHlEZWZpbml0aW9uLT5kZWZhdWx0KSkgewpMb29zZVR5cGVDaGVjazo6cHJvcGVydHlTZXQoJHZhbHVlLCAkY3VycmVudFByb3BlcnR5LCBjbG9uZSAkcHJvcGVydHlEZWZpbml0aW9uLT5kZWZhdWx0KTsKfSBlbHNlIHsKTG9vc2VUeXBlQ2hlY2s6OnByb3BlcnR5U2V0KCR2YWx1ZSwgJGN1cnJlbnRQcm9wZXJ0eSwgJHByb3BlcnR5RGVmaW5pdGlvbi0+ZGVmYXVsdCk7Cn0KJHRoaXMtPmFwcGxpZWREZWZhdWx0c1tdID0gJGN1cnJlbnRQcm9wZXJ0eTsKfQp9Cn0gZWxzZWlmIChpc3NldCgkc2NoZW1hLT5pdGVtcykgJiYgTG9vc2VUeXBlQ2hlY2s6OmlzQXJyYXkoJHZhbHVlKSkgewokaXRlbXMgPSBbXTsKaWYgKExvb3NlVHlwZUNoZWNrOjppc0FycmF5KCRzY2hlbWEtPml0ZW1zKSkgewokaXRlbXMgPSAkc2NoZW1hLT5pdGVtczsKfSBlbHNlaWYgKGlzc2V0KCRzY2hlbWEtPm1pbkl0ZW1zKSAmJiBjb3VudCgkdmFsdWUpIDwgJHNjaGVtYS0+bWluSXRlbXMpIHsKJGl0ZW1zID0gYXJyYXlfZmlsbChjb3VudCgkdmFsdWUpLCAkc2NoZW1hLT5taW5JdGVtcyAtIGNvdW50KCR2YWx1ZSksICRzY2hlbWEtPml0ZW1zKTsKfQoKZm9yZWFjaCAoJGl0ZW1zIGFzICRjdXJyZW50SXRlbSA9PiAkaXRlbURlZmluaXRpb24pIHsKJGl0ZW1EZWZpbml0aW9uID0gJHRoaXMtPmZhY3RvcnktPmdldFNjaGVtYVN0b3JhZ2UoKS0+cmVzb2x2ZVJlZlNjaGVtYSgkaXRlbURlZmluaXRpb24pOwppZiAoCiFhcnJheV9rZXlfZXhpc3RzKCRjdXJyZW50SXRlbSwgJHZhbHVlKQomJiBwcm9wZXJ0eV9leGlzdHMoJGl0ZW1EZWZpbml0aW9uLCAnZGVmYXVsdCcpCiYmICR0aGlzLT5zaG91bGRBcHBseURlZmF1bHRWYWx1ZSgkcmVxdWlyZWRPbmx5LCAkaXRlbURlZmluaXRpb24pKSB7CmlmIChpc19vYmplY3QoJGl0ZW1EZWZpbml0aW9uLT5kZWZhdWx0KSkgewokdmFsdWVbJGN1cnJlbnRJdGVtXSA9IGNsb25lICRpdGVtRGVmaW5pdGlvbi0+ZGVmYXVsdDsKfSBlbHNlIHsKJHZhbHVlWyRjdXJyZW50SXRlbV0gPSAkaXRlbURlZmluaXRpb24tPmRlZmF1bHQ7Cn0KfQokcGF0aC0+c2V0RnJvbURlZmF1bHQoKTsKfQp9IGVsc2VpZiAoCiR2YWx1ZSBpbnN0YW5jZW9mIHNlbGYKJiYgcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdkZWZhdWx0JykKJiYgJHRoaXMtPnNob3VsZEFwcGx5RGVmYXVsdFZhbHVlKCRyZXF1aXJlZE9ubHksICRzY2hlbWEpKSB7CgokdmFsdWUgPSBpc19vYmplY3QoJHNjaGVtYS0+ZGVmYXVsdCkgPyBjbG9uZSAkc2NoZW1hLT5kZWZhdWx0IDogJHNjaGVtYS0+ZGVmYXVsdDsKJHBhdGgtPnNldEZyb21EZWZhdWx0KCk7Cn0KfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVPZlByb3BlcnRpZXMoJiR2YWx1ZSwgJHNjaGVtYSwgSnNvblBvaW50ZXIgJHBhdGgsICRpID0gJycpCnsKCmlmICgkdmFsdWUgaW5zdGFuY2VvZiBzZWxmKSB7CnJldHVybjsKfQoKaWYgKGlzc2V0KCRzY2hlbWEtPmFsbE9mKSkgewokaXNWYWxpZCA9IHRydWU7CmZvcmVhY2ggKCRzY2hlbWEtPmFsbE9mIGFzICRhbGxPZikgewokaW5pdEVycm9ycyA9ICR0aGlzLT5nZXRFcnJvcnMoKTsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2YWx1ZSwgJGFsbE9mLCAkcGF0aCwgJGkpOwokaXNWYWxpZCA9ICRpc1ZhbGlkICYmIChjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpID09IGNvdW50KCRpbml0RXJyb3JzKSk7Cn0KaWYgKCEkaXNWYWxpZCkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpBTExfT0YoKSwgJHBhdGgpOwp9Cn0KCmlmIChpc3NldCgkc2NoZW1hLT5hbnlPZikpIHsKJGlzVmFsaWQgPSBmYWxzZTsKJHN0YXJ0RXJyb3JzID0gJHRoaXMtPmdldEVycm9ycygpOwokY29lcmNlT3JEZWZhdWx0cyA9ICR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoc2VsZjo6Q0hFQ0tfTU9ERV9DT0VSQ0VfVFlQRVMgfCBzZWxmOjpDSEVDS19NT0RFX0FQUExZX0RFRkFVTFRTKTsKCmZvcmVhY2ggKCRzY2hlbWEtPmFueU9mIGFzICRhbnlPZikgewokaW5pdEVycm9ycyA9ICR0aGlzLT5nZXRFcnJvcnMoKTsKdHJ5IHsKJGFueU9mVmFsdWUgPSAkY29lcmNlT3JEZWZhdWx0cyA/IERlZXBDb3B5Ojpjb3B5T2YoJHZhbHVlKSA6ICR2YWx1ZTsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCRhbnlPZlZhbHVlLCAkYW55T2YsICRwYXRoLCAkaSk7CmlmICgkaXNWYWxpZCA9IChjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpID09PSBjb3VudCgkaW5pdEVycm9ycykpKSB7CiR2YWx1ZSA9ICRhbnlPZlZhbHVlOwpicmVhazsKfQp9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uICRlKSB7CiRpc1ZhbGlkID0gZmFsc2U7Cn0KfQppZiAoISRpc1ZhbGlkKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkFOWV9PRigpLCAkcGF0aCk7Cn0gZWxzZSB7CiR0aGlzLT5lcnJvcnMgPSAkc3RhcnRFcnJvcnM7Cn0KfQoKaWYgKGlzc2V0KCRzY2hlbWEtPm9uZU9mKSkgewokYWxsRXJyb3JzID0gW107CiRtYXRjaGVkU2NoZW1hcyA9IFtdOwokc3RhcnRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CiRjb2VyY2VPckRlZmF1bHRzID0gJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX0NPRVJDRV9UWVBFUyB8IHNlbGY6OkNIRUNLX01PREVfQVBQTFlfREVGQVVMVFMpOwoKZm9yZWFjaCAoJHNjaGVtYS0+b25lT2YgYXMgJG9uZU9mKSB7CnRyeSB7CiR0aGlzLT5lcnJvcnMgPSBbXTsKCiRvbmVPZlZhbHVlID0gJGNvZXJjZU9yRGVmYXVsdHMgPyBEZWVwQ29weTo6Y29weU9mKCR2YWx1ZSkgOiAkdmFsdWU7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkb25lT2ZWYWx1ZSwgJG9uZU9mLCAkcGF0aCwgJGkpOwppZiAoY291bnQoJHRoaXMtPmdldEVycm9ycygpKSA9PT0gMCkgewokbWF0Y2hlZFNjaGVtYXNbXSA9IFsnc2NoZW1hJyA9PiAkb25lT2YsICd2YWx1ZScgPT4gJG9uZU9mVmFsdWVdOwp9CiRhbGxFcnJvcnMgPSBhcnJheV9tZXJnZSgkYWxsRXJyb3JzLCBhcnJheV92YWx1ZXMoJHRoaXMtPmdldEVycm9ycygpKSk7Cn0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKCgp9Cn0KaWYgKGNvdW50KCRtYXRjaGVkU2NoZW1hcykgIT09IDEpIHsKJHRoaXMtPmFkZEVycm9ycyhhcnJheV9tZXJnZSgkYWxsRXJyb3JzLCAkc3RhcnRFcnJvcnMpKTsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6T05FX09GKCksICRwYXRoKTsKfSBlbHNlIHsKJHRoaXMtPmVycm9ycyA9ICRzdGFydEVycm9yczsKJHZhbHVlID0gJG1hdGNoZWRTY2hlbWFzWzBdWyd2YWx1ZSddOwp9Cn0KfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVEZXBlbmRlbmNpZXMoJHZhbHVlLCAkZGVwZW5kZW5jaWVzLCBKc29uUG9pbnRlciAkcGF0aCwgJGkgPSAnJykKewpmb3JlYWNoICgkZGVwZW5kZW5jaWVzIGFzICRrZXkgPT4gJGRlcGVuZGVuY3kpIHsKaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlFeGlzdHMoJHZhbHVlLCAka2V5KSkgewppZiAoaXNfc3RyaW5nKCRkZXBlbmRlbmN5KSkgewoKaWYgKCEkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5RXhpc3RzKCR2YWx1ZSwgJGRlcGVuZGVuY3kpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkRFUEVOREVOQ0lFUygpLCAkcGF0aCwgWwona2V5JyA9PiAka2V5LAonZGVwZW5kZW5jeScgPT4gJGRlcGVuZGVuY3kKXSk7Cn0KfSBlbHNlaWYgKGlzX2FycmF5KCRkZXBlbmRlbmN5KSkgewoKZm9yZWFjaCAoJGRlcGVuZGVuY3kgYXMgJGQpIHsKaWYgKCEkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5RXhpc3RzKCR2YWx1ZSwgJGQpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkRFUEVOREVOQ0lFUygpLCAkcGF0aCwgWwona2V5JyA9PiAka2V5LAonZGVwZW5kZW5jeScgPT4gJGRlcGVuZGVuY3kKXSk7Cn0KfQp9IGVsc2VpZiAoaXNfb2JqZWN0KCRkZXBlbmRlbmN5KSkgewoKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2YWx1ZSwgJGRlcGVuZGVuY3ksICRwYXRoLCAkaSk7Cn0KfQp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZVVyaSgkc2NoZW1hLCAkc2NoZW1hVXJpID0gbnVsbCkKewokcmVzb2x2ZXIgPSBuZXcgVXJpUmVzb2x2ZXIoKTsKJHJldHJpZXZlciA9ICR0aGlzLT5mYWN0b3J5LT5nZXRVcmlSZXRyaWV2ZXIoKTsKCiRqc29uU2NoZW1hID0gbnVsbDsKaWYgKCRyZXNvbHZlci0+aXNWYWxpZCgkc2NoZW1hVXJpKSkgewokc2NoZW1hSWQgPSBwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2lkJykgPyAkc2NoZW1hLT5pZCA6IG51bGw7CiRqc29uU2NoZW1hID0gJHJldHJpZXZlci0+cmV0cmlldmUoJHNjaGVtYUlkLCAkc2NoZW1hVXJpKTsKfQoKcmV0dXJuICRqc29uU2NoZW1hOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEVudGl0eTsKCnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgoKCmNsYXNzIEpzb25Qb2ludGVyCnsKCnByaXZhdGUgJGZpbGVuYW1lOwoKCnByaXZhdGUgJHByb3BlcnR5UGF0aHMgPSBbXTsKCgoKCnByaXZhdGUgJGZyb21EZWZhdWx0ID0gZmFsc2U7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmFsdWUpCnsKaWYgKCFpc19zdHJpbmcoJHZhbHVlKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdSZWYgdmFsdWUgbXVzdCBiZSBhIHN0cmluZycpOwp9Cgokc3BsaXRSZWYgPSBleHBsb2RlKCcjJywgJHZhbHVlLCAyKTsKJHRoaXMtPmZpbGVuYW1lID0gJHNwbGl0UmVmWzBdOwppZiAoYXJyYXlfa2V5X2V4aXN0cygxLCAkc3BsaXRSZWYpKSB7CiR0aGlzLT5wcm9wZXJ0eVBhdGhzID0gJHRoaXMtPmRlY29kZVByb3BlcnR5UGF0aHMoJHNwbGl0UmVmWzFdKTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZGVjb2RlUHJvcGVydHlQYXRocygkcHJvcGVydHlQYXRoU3RyaW5nKQp7CiRwYXRocyA9IFtdOwpmb3JlYWNoIChleHBsb2RlKCcvJywgdHJpbSgkcHJvcGVydHlQYXRoU3RyaW5nLCAnLycpKSBhcyAkcGF0aCkgewokcGF0aCA9ICR0aGlzLT5kZWNvZGVQYXRoKCRwYXRoKTsKaWYgKGlzX3N0cmluZygkcGF0aCkgJiYgJycgIT09ICRwYXRoKSB7CiRwYXRoc1tdID0gJHBhdGg7Cn0KfQoKcmV0dXJuICRwYXRoczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBlbmNvZGVQcm9wZXJ0eVBhdGhzKCkKewpyZXR1cm4gYXJyYXlfbWFwKApbJHRoaXMsICdlbmNvZGVQYXRoJ10sCiR0aGlzLT5nZXRQcm9wZXJ0eVBhdGhzKCkKKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRlY29kZVBhdGgoJHBhdGgpCnsKcmV0dXJuIHN0cnRyKCRwYXRoLCBbJ34xJyA9PiAnLycsICd+MCcgPT4gJ34nLCAnJTI1JyA9PiAnJSddKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGVuY29kZVBhdGgoJHBhdGgpCnsKcmV0dXJuIHN0cnRyKCRwYXRoLCBbJy8nID0+ICd+MScsICd+JyA9PiAnfjAnLCAnJScgPT4gJyUyNSddKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVuYW1lKCkKewpyZXR1cm4gJHRoaXMtPmZpbGVuYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvcGVydHlQYXRocygpCnsKcmV0dXJuICR0aGlzLT5wcm9wZXJ0eVBhdGhzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoUHJvcGVydHlQYXRocyhhcnJheSAkcHJvcGVydHlQYXRocykKewokbmV3ID0gY2xvbmUgJHRoaXM7CiRuZXctPnByb3BlcnR5UGF0aHMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKCRwKTogc3RyaW5nIHsgcmV0dXJuIChzdHJpbmcpICRwOyB9LCAkcHJvcGVydHlQYXRocyk7CgpyZXR1cm4gJG5ldzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3BlcnR5UGF0aEFzU3RyaW5nKCkKewpyZXR1cm4gcnRyaW0oJyMvJyAuIGltcGxvZGUoJy8nLCAkdGhpcy0+ZW5jb2RlUHJvcGVydHlQYXRocygpKSwgJy8nKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CnJldHVybiAkdGhpcy0+Z2V0RmlsZW5hbWUoKSAuICR0aGlzLT5nZXRQcm9wZXJ0eVBhdGhBc1N0cmluZygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RnJvbURlZmF1bHQoKQp7CiR0aGlzLT5mcm9tRGVmYXVsdCA9IHRydWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZyb21EZWZhdWx0KCkKewpyZXR1cm4gJHRoaXMtPmZyb21EZWZhdWx0Owp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWE7CgphYnN0cmFjdCBjbGFzcyBFbnVtIGV4dGVuZHMgXE1hYmVFbnVtXEVudW0Kewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCmludGVyZmFjZSBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgpjbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKY2xhc3MgSW52YWxpZENvbmZpZ0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24Kewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgpjbGFzcyBJbnZhbGlkU2NoZW1hRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgp7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEludmFsaWRTY2hlbWFNZWRpYVR5cGVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKY2xhc3MgSW52YWxpZFNvdXJjZVVyaUV4Y2VwdGlvbiBleHRlbmRzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgp7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEpzb25EZWNvZGluZ0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGNvZGUgPSBKU09OX0VSUk9SX05PTkUsID9cRXhjZXB0aW9uICRwcmV2aW91cyA9IG51bGwpCnsKc3dpdGNoICgkY29kZSkgewpjYXNlIEpTT05fRVJST1JfREVQVEg6CiRtZXNzYWdlID0gJ1RoZSBtYXhpbXVtIHN0YWNrIGRlcHRoIGhhcyBiZWVuIGV4Y2VlZGVkJzsKYnJlYWs7CmNhc2UgSlNPTl9FUlJPUl9TVEFURV9NSVNNQVRDSDoKJG1lc3NhZ2UgPSAnSW52YWxpZCBvciBtYWxmb3JtZWQgSlNPTic7CmJyZWFrOwpjYXNlIEpTT05fRVJST1JfQ1RSTF9DSEFSOgokbWVzc2FnZSA9ICdDb250cm9sIGNoYXJhY3RlciBlcnJvciwgcG9zc2libHkgaW5jb3JyZWN0bHkgZW5jb2RlZCc7CmJyZWFrOwpjYXNlIEpTT05fRVJST1JfVVRGODoKJG1lc3NhZ2UgPSAnTWFsZm9ybWVkIFVURi04IGNoYXJhY3RlcnMsIHBvc3NpYmx5IGluY29ycmVjdGx5IGVuY29kZWQnOwpicmVhazsKY2FzZSBKU09OX0VSUk9SX1NZTlRBWDoKJG1lc3NhZ2UgPSAnSlNPTiBzeW50YXggaXMgbWFsZm9ybWVkJzsKYnJlYWs7CmRlZmF1bHQ6CiRtZXNzYWdlID0gJ1N5bnRheCBlcnJvcic7Cn0KcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUsICRwcmV2aW91cyk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKY2xhc3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24Kewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgpjbGFzcyBSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgoKCmNsYXNzIFVucmVzb2x2YWJsZUpzb25Qb2ludGVyRXhjZXB0aW9uIGV4dGVuZHMgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKY2xhc3MgVXJpUmVzb2x2ZXJFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKY2xhc3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24Kewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxJdGVyYXRvcjsKCgoKCgoKY2xhc3MgT2JqZWN0SXRlcmF0b3IgaW1wbGVtZW50cyBcSXRlcmF0b3IsIFxDb3VudGFibGUKewoKcHJpdmF0ZSAkb2JqZWN0OwoKCnByaXZhdGUgJHBvc2l0aW9uID0gMDsKCgpwcml2YXRlICRkYXRhID0gW107CgoKcHJpdmF0ZSAkaW5pdGlhbGl6ZWQgPSBmYWxzZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb2JqZWN0KQp7CiR0aGlzLT5vYmplY3QgPSAkb2JqZWN0Owp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGN1cnJlbnQoKQp7CiR0aGlzLT5pbml0aWFsaXplKCk7CgpyZXR1cm4gJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5leHQoKTogdm9pZAp7CiR0aGlzLT5pbml0aWFsaXplKCk7CiR0aGlzLT5wb3NpdGlvbisrOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24ga2V5KCk6IGludAp7CiR0aGlzLT5pbml0aWFsaXplKCk7CgpyZXR1cm4gJHRoaXMtPnBvc2l0aW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWQoKTogYm9vbAp7CiR0aGlzLT5pbml0aWFsaXplKCk7CgpyZXR1cm4gaXNzZXQoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXdpbmQoKTogdm9pZAp7CiR0aGlzLT5pbml0aWFsaXplKCk7CiR0aGlzLT5wb3NpdGlvbiA9IDA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewokdGhpcy0+aW5pdGlhbGl6ZSgpOwoKcmV0dXJuIGNvdW50KCR0aGlzLT5kYXRhKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpbml0aWFsaXplKCkKewppZiAoISR0aGlzLT5pbml0aWFsaXplZCkgewokdGhpcy0+ZGF0YSA9ICR0aGlzLT5idWlsZERhdGFGcm9tT2JqZWN0KCR0aGlzLT5vYmplY3QpOwokdGhpcy0+aW5pdGlhbGl6ZWQgPSB0cnVlOwp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBidWlsZERhdGFGcm9tT2JqZWN0KCRvYmplY3QpCnsKJHJlc3VsdCA9IFtdOwoKJHN0YWNrID0gbmV3IFxTcGxTdGFjaygpOwokc3RhY2stPnB1c2goJG9iamVjdCk7Cgp3aGlsZSAoISRzdGFjay0+aXNFbXB0eSgpKSB7CiRjdXJyZW50ID0gJHN0YWNrLT5wb3AoKTsKaWYgKGlzX29iamVjdCgkY3VycmVudCkpIHsKYXJyYXlfcHVzaCgkcmVzdWx0LCAkY3VycmVudCk7Cn0KCmZvcmVhY2ggKCR0aGlzLT5nZXREYXRhRnJvbUl0ZW0oJGN1cnJlbnQpIGFzICRwcm9wZXJ0eU5hbWUgPT4gJHByb3BlcnR5VmFsdWUpIHsKaWYgKGlzX29iamVjdCgkcHJvcGVydHlWYWx1ZSkgfHwgaXNfYXJyYXkoJHByb3BlcnR5VmFsdWUpKSB7CiRzdGFjay0+cHVzaCgkcHJvcGVydHlWYWx1ZSk7Cn0KfQp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldERhdGFGcm9tSXRlbSgkaXRlbSkKewppZiAoIWlzX29iamVjdCgkaXRlbSkgJiYgIWlzX2FycmF5KCRpdGVtKSkgewpyZXR1cm4gW107Cn0KCnJldHVybiBpc19vYmplY3QoJGl0ZW0pID8gZ2V0X29iamVjdF92YXJzKCRpdGVtKSA6ICRpdGVtOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWE7CgpjbGFzcyBSZmMzMzM5CnsKcHJpdmF0ZSBjb25zdCBSRUdFWCA9ICcvXihcZHs0fS1cZHsyfS1cZHsyfVtUIF17MX1cZHsyfTpcZHsyfTpcZHsyfSkoXC5cZCspPyhafChbKy1dXGR7Mn0pOj8oXGR7Mn0pKSQvJzsKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUZyb21TdHJpbmcoJHN0cmluZykKewppZiAoIXByZWdfbWF0Y2goc2VsZjo6UkVHRVgsIHN0cnRvdXBwZXIoJHN0cmluZyksICRtYXRjaGVzKSkgewpyZXR1cm4gbnVsbDsKfQoKJGRhdGVBbmRUaW1lID0gJG1hdGNoZXNbMV07CiRtaWNyb3NlY29uZHMgPSAkbWF0Y2hlc1syXSA/OiAnLjAwMDAwMCc7CiR0aW1lWm9uZSA9ICdaJyAhPT0gJG1hdGNoZXNbM10gPyAkbWF0Y2hlc1s0XSAuICc6JyAuICRtYXRjaGVzWzVdIDogJyswMDowMCc7CiRkYXRlRm9ybWF0ID0gc3RycG9zKCRkYXRlQW5kVGltZSwgJ1QnKSA9PT0gZmFsc2UgPyAnWS1tLWQgSDppOnMudVAnIDogJ1ktbS1kXFRIOmk6cy51UCc7CiRkYXRlVGltZSA9IFxEYXRlVGltZTo6Y3JlYXRlRnJvbUZvcm1hdCgkZGF0ZUZvcm1hdCwgJGRhdGVBbmRUaW1lIC4gJG1pY3Jvc2Vjb25kcyAuICR0aW1lWm9uZSwgbmV3IFxEYXRlVGltZVpvbmUoJ1VUQycpKTsKCnJldHVybiAkZGF0ZVRpbWUgPzogbnVsbDsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQmFzZUNvbnN0cmFpbnQ7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFVucmVzb2x2YWJsZUpzb25Qb2ludGVyRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxVcmlcVXJpUmVzb2x2ZXI7CnVzZSBKc29uU2NoZW1hXFVyaVxVcmlSZXRyaWV2ZXI7CgpjbGFzcyBTY2hlbWFTdG9yYWdlIGltcGxlbWVudHMgU2NoZW1hU3RvcmFnZUludGVyZmFjZQp7CnB1YmxpYyBjb25zdCBJTlRFUk5BTF9QUk9WSURFRF9TQ0hFTUFfVVJJID0gJ2ludGVybmFsOi8vcHJvdmlkZWQtc2NoZW1hLyc7Cgpwcm90ZWN0ZWQgJHVyaVJldHJpZXZlcjsKcHJvdGVjdGVkICR1cmlSZXNvbHZlcjsKcHJvdGVjdGVkICRzY2hlbWFzID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCj9VcmlSZXRyaWV2ZXJJbnRlcmZhY2UgJHVyaVJldHJpZXZlciA9IG51bGwsCj9VcmlSZXNvbHZlckludGVyZmFjZSAkdXJpUmVzb2x2ZXIgPSBudWxsCikgewokdGhpcy0+dXJpUmV0cmlldmVyID0gJHVyaVJldHJpZXZlciA/OiBuZXcgVXJpUmV0cmlldmVyKCk7CiR0aGlzLT51cmlSZXNvbHZlciA9ICR1cmlSZXNvbHZlciA/OiBuZXcgVXJpUmVzb2x2ZXIoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVyaVJldHJpZXZlcigpCnsKcmV0dXJuICR0aGlzLT51cmlSZXRyaWV2ZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmlSZXNvbHZlcigpCnsKcmV0dXJuICR0aGlzLT51cmlSZXNvbHZlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFNjaGVtYSgkaWQsICRzY2hlbWEgPSBudWxsKQp7CmlmIChpc19udWxsKCRzY2hlbWEpICYmICRpZCAhPT0gc2VsZjo6SU5URVJOQUxfUFJPVklERURfU0NIRU1BX1VSSSkgewoKCgokc2NoZW1hID0gJHRoaXMtPnVyaVJldHJpZXZlci0+cmV0cmlldmUoJGlkKTsKfQoKCmlmIChpc19hcnJheSgkc2NoZW1hKSkgewokc2NoZW1hID0gQmFzZUNvbnN0cmFpbnQ6OmFycmF5VG9PYmplY3RSZWN1cnNpdmUoJHNjaGVtYSk7Cn0KCgoKaWYgKGlzX29iamVjdCgkc2NoZW1hKSAmJiBwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2lkJykpIHsKaWYgKCRzY2hlbWEtPmlkID09ICdodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMnKSB7CiRzY2hlbWEtPnByb3BlcnRpZXMtPmlkLT5mb3JtYXQgPSAndXJpLXJlZmVyZW5jZSc7Cn0gZWxzZWlmICgkc2NoZW1hLT5pZCA9PSAnaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wMy9zY2hlbWEjJykgewokc2NoZW1hLT5wcm9wZXJ0aWVzLT5pZC0+Zm9ybWF0ID0gJ3VyaS1yZWZlcmVuY2UnOwokc2NoZW1hLT5wcm9wZXJ0aWVzLT57JyRyZWYnfS0+Zm9ybWF0ID0gJ3VyaS1yZWZlcmVuY2UnOwp9Cn0KCgokdGhpcy0+ZXhwYW5kUmVmcygkc2NoZW1hLCAkaWQpOwoKJHRoaXMtPnNjaGVtYXNbJGlkXSA9ICRzY2hlbWE7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXhwYW5kUmVmcygmJHNjaGVtYSwgJGJhc2UgPSBudWxsKQp7CmlmICghaXNfb2JqZWN0KCRzY2hlbWEpKSB7CmlmIChpc19hcnJheSgkc2NoZW1hKSkgewpmb3JlYWNoICgkc2NoZW1hIGFzICYkbWVtYmVyKSB7CiR0aGlzLT5leHBhbmRSZWZzKCRtZW1iZXIsICRiYXNlKTsKfQp9CgpyZXR1cm47Cn0KCmlmIChwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2lkJykgJiYgaXNfc3RyaW5nKCRzY2hlbWEtPmlkKSAmJiAkYmFzZSAhPSAkc2NoZW1hLT5pZCkgewokYmFzZSA9ICR0aGlzLT51cmlSZXNvbHZlci0+cmVzb2x2ZSgkc2NoZW1hLT5pZCwgJGJhc2UpOwp9CgppZiAocHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICckcmVmJykgJiYgaXNfc3RyaW5nKCRzY2hlbWEtPnsnJHJlZid9KSkgewokcmVmUG9pbnRlciA9IG5ldyBKc29uUG9pbnRlcigkdGhpcy0+dXJpUmVzb2x2ZXItPnJlc29sdmUoJHNjaGVtYS0+eyckcmVmJ30sICRiYXNlKSk7CiRzY2hlbWEtPnsnJHJlZid9ID0gKHN0cmluZykgJHJlZlBvaW50ZXI7Cn0KCmZvcmVhY2ggKCRzY2hlbWEgYXMgJiRtZW1iZXIpIHsKJHRoaXMtPmV4cGFuZFJlZnMoJG1lbWJlciwgJGJhc2UpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTY2hlbWEoJGlkKQp7CmlmICghYXJyYXlfa2V5X2V4aXN0cygkaWQsICR0aGlzLT5zY2hlbWFzKSkgewokdGhpcy0+YWRkU2NoZW1hKCRpZCk7Cn0KCnJldHVybiAkdGhpcy0+c2NoZW1hc1skaWRdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzb2x2ZVJlZigkcmVmLCAkcmVzb2x2ZVN0YWNrID0gW10pCnsKJGpzb25Qb2ludGVyID0gbmV3IEpzb25Qb2ludGVyKCRyZWYpOwoKCiRmaWxlTmFtZSA9ICRqc29uUG9pbnRlci0+Z2V0RmlsZW5hbWUoKTsKaWYgKCFzdHJsZW4oJGZpbGVOYW1lKSkgewp0aHJvdyBuZXcgVW5yZXNvbHZhYmxlSnNvblBvaW50ZXJFeGNlcHRpb24oc3ByaW50ZigKIkNvdWxkIG5vdCByZXNvbHZlIGZyYWdtZW50ICclcyc6IG5vIGZpbGUgaXMgZGVmaW5lZCIsCiRqc29uUG9pbnRlci0+Z2V0UHJvcGVydHlQYXRoQXNTdHJpbmcoKQopKTsKfQoKCiRyZWZTY2hlbWEgPSAkdGhpcy0+Z2V0U2NoZW1hKCRmaWxlTmFtZSk7CmZvcmVhY2ggKCRqc29uUG9pbnRlci0+Z2V0UHJvcGVydHlQYXRocygpIGFzICRwYXRoKSB7CmlmIChpc19vYmplY3QoJHJlZlNjaGVtYSkgJiYgcHJvcGVydHlfZXhpc3RzKCRyZWZTY2hlbWEsICRwYXRoKSkgewokcmVmU2NoZW1hID0gJHRoaXMtPnJlc29sdmVSZWZTY2hlbWEoJHJlZlNjaGVtYS0+eyRwYXRofSwgJHJlc29sdmVTdGFjayk7Cn0gZWxzZWlmIChpc19hcnJheSgkcmVmU2NoZW1hKSAmJiBhcnJheV9rZXlfZXhpc3RzKCRwYXRoLCAkcmVmU2NoZW1hKSkgewokcmVmU2NoZW1hID0gJHRoaXMtPnJlc29sdmVSZWZTY2hlbWEoJHJlZlNjaGVtYVskcGF0aF0sICRyZXNvbHZlU3RhY2spOwp9IGVsc2Ugewp0aHJvdyBuZXcgVW5yZXNvbHZhYmxlSnNvblBvaW50ZXJFeGNlcHRpb24oc3ByaW50ZigKJ0ZpbGU6ICVzIGlzIGZvdW5kLCBidXQgY291bGQgbm90IHJlc29sdmUgZnJhZ21lbnQ6ICVzJywKJGpzb25Qb2ludGVyLT5nZXRGaWxlbmFtZSgpLAokanNvblBvaW50ZXItPmdldFByb3BlcnR5UGF0aEFzU3RyaW5nKCkKKSk7Cn0KfQoKcmV0dXJuICRyZWZTY2hlbWE7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlUmVmU2NoZW1hKCRyZWZTY2hlbWEsICRyZXNvbHZlU3RhY2sgPSBbXSkKewppZiAoaXNfb2JqZWN0KCRyZWZTY2hlbWEpICYmIHByb3BlcnR5X2V4aXN0cygkcmVmU2NoZW1hLCAnJHJlZicpICYmIGlzX3N0cmluZygkcmVmU2NoZW1hLT57JyRyZWYnfSkpIHsKaWYgKGluX2FycmF5KCRyZWZTY2hlbWEsICRyZXNvbHZlU3RhY2ssIHRydWUpKSB7CnRocm93IG5ldyBVbnJlc29sdmFibGVKc29uUG9pbnRlckV4Y2VwdGlvbihzcHJpbnRmKAonRGVyZWZlcmVuY2luZyBhIHBvaW50ZXIgdG8gJXMgcmVzdWx0cyBpbiBhbiBpbmZpbml0ZSBsb29wJywKJHJlZlNjaGVtYS0+eyckcmVmJ30KKSk7Cn0KJHJlc29sdmVTdGFja1tdID0gJHJlZlNjaGVtYTsKCnJldHVybiAkdGhpcy0+cmVzb2x2ZVJlZigkcmVmU2NoZW1hLT57JyRyZWYnfSwgJHJlc29sdmVTdGFjayk7Cn0KCnJldHVybiAkcmVmU2NoZW1hOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWE7CgppbnRlcmZhY2UgU2NoZW1hU3RvcmFnZUludGVyZmFjZQp7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRTY2hlbWEoJGlkLCAkc2NoZW1hID0gbnVsbCk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNjaGVtYSgkaWQpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlUmVmKCRyZWYpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlUmVmU2NoZW1hKCRyZWZTY2hlbWEpOwp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFRvb2w7CgpjbGFzcyBEZWVwQ29tcGFyZXIKewoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0VxdWFsKCRsZWZ0LCAkcmlnaHQpOiBib29sCnsKaWYgKCRsZWZ0ID09PSBudWxsICYmICRyaWdodCA9PT0gbnVsbCkgewpyZXR1cm4gdHJ1ZTsKfQoKJGlzTGVmdFNjYWxhciA9IGlzX3NjYWxhcigkbGVmdCk7CiRpc0xlZnROdW1iZXIgPSBpc19pbnQoJGxlZnQpIHx8IGlzX2Zsb2F0KCRsZWZ0KTsKJGlzUmlnaHRTY2FsYXIgPSBpc19zY2FsYXIoJHJpZ2h0KTsKJGlzUmlnaHROdW1iZXIgPSBpc19pbnQoJHJpZ2h0KSB8fCBpc19mbG9hdCgkcmlnaHQpOwoKaWYgKCRpc0xlZnRTY2FsYXIgJiYgJGlzUmlnaHRTY2FsYXIpIHsKCgoKaWYgKCRpc0xlZnROdW1iZXIgJiYgJGlzUmlnaHROdW1iZXIgJiYgKGZsb2F0KSAkbGVmdCA9PT0gKGZsb2F0KSAkcmlnaHQpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiAkbGVmdCA9PT0gJHJpZ2h0Owp9CgppZiAoJGlzTGVmdFNjYWxhciAhPT0gJGlzUmlnaHRTY2FsYXIpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoaXNfYXJyYXkoJGxlZnQpICYmIGlzX2FycmF5KCRyaWdodCkpIHsKcmV0dXJuIHNlbGY6OmlzQXJyYXlFcXVhbCgkbGVmdCwgJHJpZ2h0KTsKfQoKaWYgKCRsZWZ0IGluc3RhbmNlb2YgXHN0ZENsYXNzICYmICRyaWdodCBpbnN0YW5jZW9mIFxzdGRDbGFzcykgewpyZXR1cm4gc2VsZjo6aXNBcnJheUVxdWFsKChhcnJheSkgJGxlZnQsIChhcnJheSkgJHJpZ2h0KTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNBcnJheUVxdWFsKGFycmF5ICRsZWZ0LCBhcnJheSAkcmlnaHQpOiBib29sCnsKaWYgKGNvdW50KCRsZWZ0KSAhPT0gY291bnQoJHJpZ2h0KSkgewpyZXR1cm4gZmFsc2U7Cn0KZm9yZWFjaCAoJGxlZnQgYXMgJGtleSA9PiAkdmFsdWUpIHsKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRrZXksICRyaWdodCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoIXNlbGY6OmlzRXF1YWwoJHZhbHVlLCAkcmlnaHRbJGtleV0pKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFRvb2w7Cgp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSnNvbkRlY29kaW5nRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCmNsYXNzIERlZXBDb3B5CnsKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvcHlPZigkaW5wdXQpCnsKJGpzb24gPSBqc29uX2VuY29kZSgkaW5wdXQpOwppZiAoSlNPTl9FUlJPUl9OT05FIDwgJGVycm9yID0ganNvbl9sYXN0X2Vycm9yKCkpIHsKdGhyb3cgbmV3IEpzb25EZWNvZGluZ0V4Y2VwdGlvbigkZXJyb3IpOwp9CgppZiAoJGpzb24gPT09IGZhbHNlKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZW5jb2RlIGlucHV0IHRvIEpTT046ICcgLiBqc29uX2xhc3RfZXJyb3JfbXNnKCkpOwp9CgpyZXR1cm4ganNvbl9kZWNvZGUoJGpzb24sIHNlbGY6OmlzQXNzb2NpYXRpdmVBcnJheSgkaW5wdXQpKTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNBc3NvY2lhdGl2ZUFycmF5KCRpbnB1dCk6IGJvb2wKewpyZXR1cm4gaXNfYXJyYXkoJGlucHV0KSAmJiBhcnJheV9rZXlzKCRpbnB1dCkgIT09IHJhbmdlKDAsIGNvdW50KCRpbnB1dCkgLSAxKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFRvb2xcVmFsaWRhdG9yOwoKY2xhc3MgUmVsYXRpdmVSZWZlcmVuY2VWYWxpZGF0b3IKewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzVmFsaWQoc3RyaW5nICRyZWYpOiBib29sCnsKCiRwYXR0ZXJuID0gJy9eKChbXlwvPyNdKyk6KT8oXC9cLyhbXlwvPyNdKikpPyhbXj8jXSopKFw/KFteI10qKSk/KCMoLiopKT8kLyc7CgppZiAocHJlZ19tYXRjaCgkcGF0dGVybiwgJHJlZikgIT09IDEpIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKHByZWdfbWF0Y2goJy9eKGh0dHB8aHR0cHMpOlwvXC8vJywgJHJlZikpIHsKcmV0dXJuIGZhbHNlOyAKfQoKaWYgKHByZWdfbWF0Y2goJy9eOlwvXC8vJywgJHJlZikpIHsKcmV0dXJuIGZhbHNlOyAKfQoKaWYgKHByZWdfbWF0Y2goJy9eOlwvLycsICRyZWYpKSB7CnJldHVybiBmYWxzZTsgCn0KCmlmIChwcmVnX21hdGNoKCcvXlwvXC8kLycsICRyZWYpKSB7CnJldHVybiBmYWxzZTsgCn0KCmlmIChwcmVnX21hdGNoKCcvXlwvXC9cL1teXC9dLycsICRyZWYpKSB7CnJldHVybiBmYWxzZTsgCn0KCmlmIChwcmVnX21hdGNoKCcvXHMvJywgJHJlZikpIHsKcmV0dXJuIGZhbHNlOyAKfQoKaWYgKHByZWdfbWF0Y2goJy9eXD8jfF4jJC8nLCAkcmVmKSkgewpyZXR1cm4gZmFsc2U7IAp9CgppZiAoJHJlZiA9PT0gJyMnIHx8ICRyZWYgPT09ICc/JykgewpyZXR1cm4gZmFsc2U7IAp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFRvb2xcVmFsaWRhdG9yOwoKY2xhc3MgVXJpVmFsaWRhdG9yCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1ZhbGlkKHN0cmluZyAkdXJpKTogYm9vbAp7CgokaGllcmFyY2hpY2FsUGF0dGVybiA9ICcvXgogICAgICAgICAgICAoW2Etel1bYS16MC05K1wtLl0qKTpcL1wvICAgICAgICAgICAgICAgICMgU2NoZW1lIChodHRwLCBodHRwcywgZnRwLCBldGMuKQogICAgICAgICAgICAoPzooW146QFwvPyNdKykoPzo6KFteQFwvPyNdKikpP0ApPyAgICAgICMgT3B0aW9uYWwgdXNlcmluZm8gKHVzZXI6cGFzc0ApCiAgICAgICAgICAgIChbYS16MC05Li1dK3xcW1thLWYwLTk6Ll0rXF0pICAgICAgICAgICAgIyBIb3N0bmFtZSBvciBJUHY2IGluIGJyYWNrZXRzCiAgICAgICAgICAgICg/OjooXGR7MSw1fSkpPyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBPcHRpb25hbCBwb3J0CiAgICAgICAgICAgIChcL1thLXpBLVowLTkuX34hJCZcJygpKissOz06QFwvJS1dKikqICAgIyBQYXRoICh2YWxpZCBjaGFyYWN0ZXJzIG9ubHkpCiAgICAgICAgICAgIChcPyhbXiNdKikpPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBPcHRpb25hbCBxdWVyeQogICAgICAgICAgICAoXCMoLiopKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwgZnJhZ21lbnQKICAgICAgICAkL2l4JzsKCgokbm9uSGllcmFyY2hpY2FsUGF0dGVybiA9ICcvXgogICAgICAgICAgICAobWFpbHRvfGRhdGF8dXJuKTogICAgICAgICAgICAgICAgICAgICAgICAjIE9ubHkgYWxsb3cga25vd24gbm9uLWhpZXJhcmNoaWNhbCBzY2hlbWVzCiAgICAgICAgICAgICguKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgYWZ0ZXIgc2NoZW1lCiAgICAgICAgJC9peCc7CgoKJGVtYWlsUGF0dGVybiA9ICcvXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXC5bYS16QS1aXXsyLH0kLyc7CgoKaWYgKHByZWdfbWF0Y2goJGhpZXJhcmNoaWNhbFBhdHRlcm4sICR1cmksICRtYXRjaGVzKSA9PT0gMSkgewoKaWYgKCFlbXB0eSgkbWF0Y2hlc1s0XSkgJiYgcHJlZ19tYXRjaCgnL1wuXC4vJywgJG1hdGNoZXNbNF0pKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmICghZW1wdHkoJG1hdGNoZXNbNV0pICYmICgkbWF0Y2hlc1s1XSA8IDEgfHwgJG1hdGNoZXNbNV0gPiA2NTUzNSkpIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKCFlbXB0eSgkbWF0Y2hlc1s2XSkgJiYgcHJlZ19tYXRjaCgnL1s8Pnt9fFxcXF5gXS8nLCAkbWF0Y2hlc1s2XSkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCmlmIChwcmVnX21hdGNoKCRub25IaWVyYXJjaGljYWxQYXR0ZXJuLCAkdXJpLCAkbWF0Y2hlcykgPT09IDEpIHsKJHNjaGVtZSA9IHN0cnRvbG93ZXIoJG1hdGNoZXNbMV0pOyAKCgppZiAoJHNjaGVtZSA9PT0gJ21haWx0bycpIHsKcmV0dXJuIHByZWdfbWF0Y2goJGVtYWlsUGF0dGVybiwgJG1hdGNoZXNbMl0pID09PSAxOwp9CgpyZXR1cm4gdHJ1ZTsgCn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFVyaVxSZXRyaWV2ZXJzOwoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXRyaWV2ZXIgaW1wbGVtZW50cyBVcmlSZXRyaWV2ZXJJbnRlcmZhY2UKewoKCgoKCnByb3RlY3RlZCAkY29udGVudFR5cGU7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZW50VHlwZSgpCnsKcmV0dXJuICR0aGlzLT5jb250ZW50VHlwZTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxVcmlcUmV0cmlldmVyczsKCnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxWYWxpZGF0b3I7CgoKCgoKCmNsYXNzIEN1cmwgZXh0ZW5kcyBBYnN0cmFjdFJldHJpZXZlcgp7CnByb3RlY3RlZCAkbWVzc2FnZUJvZHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2luaXQnKSkgewoKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ2NVUkwgbm90IGluc3RhbGxlZCcpOyAKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXRyaWV2ZSgkdXJpKQp7CiRjaCA9IGN1cmxfaW5pdCgpOwoKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVyaSk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IRUFERVIsIHRydWUpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgWydBY2NlcHQ6ICcgLiBWYWxpZGF0b3I6OlNDSEVNQV9NRURJQV9UWVBFXSk7CgokcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGNoKTsKaWYgKGZhbHNlID09PSAkcmVzcG9uc2UpIHsKdGhyb3cgbmV3IFxKc29uU2NoZW1hXEV4Y2VwdGlvblxSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCdKU09OIHNjaGVtYSBub3QgZm91bmQnKTsKfQoKJHRoaXMtPmZldGNoTWVzc2FnZUJvZHkoJHJlc3BvbnNlKTsKJHRoaXMtPmZldGNoQ29udGVudFR5cGUoJHJlc3BvbnNlKTsKCmN1cmxfY2xvc2UoJGNoKTsKCnJldHVybiAkdGhpcy0+bWVzc2FnZUJvZHk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZmV0Y2hNZXNzYWdlQm9keSgkcmVzcG9uc2UpCnsKcHJlZ19tYXRjaCgiLyg/OlxyXG4pezJ9KC4qKSQvbXMiLCAkcmVzcG9uc2UsICRtYXRjaCk7CiR0aGlzLT5tZXNzYWdlQm9keSA9ICRtYXRjaFsxXTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZmV0Y2hDb250ZW50VHlwZSgkcmVzcG9uc2UpCnsKaWYgKDAgPCBwcmVnX21hdGNoKCIvQ29udGVudC1UeXBlOihcViopL2ltcyIsICRyZXNwb25zZSwgJG1hdGNoKSkgewokdGhpcy0+Y29udGVudFR5cGUgPSB0cmltKCRtYXRjaFsxXSk7CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFVyaVxSZXRyaWV2ZXJzOwoKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CgoKCgoKCmNsYXNzIEZpbGVHZXRDb250ZW50cyBleHRlbmRzIEFic3RyYWN0UmV0cmlldmVyCnsKcHJvdGVjdGVkICRtZXNzYWdlQm9keTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlKCR1cmkpCnsKJGVycm9yTWVzc2FnZSA9IG51bGw7CnNldF9lcnJvcl9oYW5kbGVyKGZ1bmN0aW9uICgkZXJybm8sICRlcnJzdHIpIHVzZSAoJiRlcnJvck1lc3NhZ2UpIHsKJGVycm9yTWVzc2FnZSA9ICRlcnJzdHI7Cn0pOwokcmVzcG9uc2UgPSBmaWxlX2dldF9jb250ZW50cygkdXJpKTsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7CgppZiAoJGVycm9yTWVzc2FnZSkgewp0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigkZXJyb3JNZXNzYWdlKTsKfQoKaWYgKGZhbHNlID09PSAkcmVzcG9uc2UpIHsKdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oJ0pTT04gc2NoZW1hIG5vdCBmb3VuZCBhdCAnIC4gJHVyaSk7Cn0KCmlmICgkcmVzcG9uc2UgPT0gJycKJiYgc3Vic3RyKCR1cmksIDAsIDcpID09ICdmaWxlOi8vJyAmJiBzdWJzdHIoJHVyaSwgLTEpID09ICcvJwopIHsKdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oJ0pTT04gc2NoZW1hIG5vdCBmb3VuZCBhdCAnIC4gJHVyaSk7Cn0KCiR0aGlzLT5tZXNzYWdlQm9keSA9ICRyZXNwb25zZTsKaWYgKCFlbXB0eSgkaHR0cF9yZXNwb25zZV9oZWFkZXIpKSB7CgoKJHRoaXMtPmZldGNoQ29udGVudFR5cGUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKTsgCn0gZWxzZSB7IAoKJHRoaXMtPmNvbnRlbnRUeXBlID0gbnVsbDsKfQoKcmV0dXJuICR0aGlzLT5tZXNzYWdlQm9keTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZldGNoQ29udGVudFR5cGUoYXJyYXkgJGhlYWRlcnMpCnsKZm9yZWFjaCAoYXJyYXlfcmV2ZXJzZSgkaGVhZGVycykgYXMgJGhlYWRlcikgewppZiAoJHRoaXMtPmNvbnRlbnRUeXBlID0gc2VsZjo6Z2V0Q29udGVudFR5cGVNYXRjaEluSGVhZGVyKCRoZWFkZXIpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGdldENvbnRlbnRUeXBlTWF0Y2hJbkhlYWRlcigkaGVhZGVyKQp7CmlmICgwIDwgcHJlZ19tYXRjaCgiL0NvbnRlbnQtVHlwZTooXFYqKS9pbXMiLCAkaGVhZGVyLCAkbWF0Y2gpKSB7CnJldHVybiB0cmltKCRtYXRjaFsxXSk7Cn0KCnJldHVybiBudWxsOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcVXJpXFJldHJpZXZlcnM7Cgp1c2UgSnNvblNjaGVtYVxWYWxpZGF0b3I7CgoKCgoKCgoKCgoKCgpjbGFzcyBQcmVkZWZpbmVkQXJyYXkgZXh0ZW5kcyBBYnN0cmFjdFJldHJpZXZlcgp7CgoKCgoKcHJpdmF0ZSAkc2NoZW1hczsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkc2NoZW1hcywgJGNvbnRlbnRUeXBlID0gVmFsaWRhdG9yOjpTQ0hFTUFfTUVESUFfVFlQRSkKewokdGhpcy0+c2NoZW1hcyA9ICRzY2hlbWFzOwokdGhpcy0+Y29udGVudFR5cGUgPSAkY29udGVudFR5cGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlKCR1cmkpCnsKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCR1cmksICR0aGlzLT5zY2hlbWFzKSkgewp0aHJvdyBuZXcgXEpzb25TY2hlbWFcRXhjZXB0aW9uXFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZigKJ1RoZSBKU09OIHNjaGVtYSAiJXMiIHdhcyBub3QgZm91bmQuJywKJHVyaQopKTsKfQoKcmV0dXJuICR0aGlzLT5zY2hlbWFzWyR1cmldOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFVyaVxSZXRyaWV2ZXJzOwoKCgoKCgppbnRlcmZhY2UgVXJpUmV0cmlldmVySW50ZXJmYWNlCnsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlKCR1cmkpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGVudFR5cGUoKTsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcVXJpOwoKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFVyaVJlc29sdmVyRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxVcmlSZXNvbHZlckludGVyZmFjZTsKCgoKCgoKY2xhc3MgVXJpUmVzb2x2ZXIgaW1wbGVtZW50cyBVcmlSZXNvbHZlckludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2UoJHVyaSkKewpwcmVnX21hdGNoKCd8XigoW146Lz8jXSspOik/KC8vKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/fCcsIChzdHJpbmcpICR1cmksICRtYXRjaCk7CgokY29tcG9uZW50cyA9IFtdOwppZiAoNSA8IGNvdW50KCRtYXRjaCkpIHsKJGNvbXBvbmVudHMgPSBbCidzY2hlbWUnID0+ICRtYXRjaFsyXSwKJ2F1dGhvcml0eScgPT4gJG1hdGNoWzRdLAoncGF0aCcgPT4gJG1hdGNoWzVdCl07Cn0KaWYgKDcgPCBjb3VudCgkbWF0Y2gpKSB7CiRjb21wb25lbnRzWydxdWVyeSddID0gJG1hdGNoWzddOwp9CmlmICg5IDwgY291bnQoJG1hdGNoKSkgewokY29tcG9uZW50c1snZnJhZ21lbnQnXSA9ICRtYXRjaFs5XTsKfQoKcmV0dXJuICRjb21wb25lbnRzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlKGFycmF5ICRjb21wb25lbnRzKQp7CiR1cmkgPSAkY29tcG9uZW50c1snc2NoZW1lJ10gLiAnOi8vJwouICRjb21wb25lbnRzWydhdXRob3JpdHknXQouICRjb21wb25lbnRzWydwYXRoJ107CgppZiAoYXJyYXlfa2V5X2V4aXN0cygncXVlcnknLCAkY29tcG9uZW50cykgJiYgc3RybGVuKCRjb21wb25lbnRzWydxdWVyeSddKSkgewokdXJpIC49ICc/JyAuICRjb21wb25lbnRzWydxdWVyeSddOwp9CmlmIChhcnJheV9rZXlfZXhpc3RzKCdmcmFnbWVudCcsICRjb21wb25lbnRzKSkgewokdXJpIC49ICcjJyAuICRjb21wb25lbnRzWydmcmFnbWVudCddOwp9CgpyZXR1cm4gJHVyaTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc29sdmUoJHVyaSwgJGJhc2VVcmkgPSBudWxsKQp7CgppZiAoCiFpc19udWxsKCRiYXNlVXJpKSAmJgohZmlsdGVyX3ZhcigkYmFzZVVyaSwgXEZJTFRFUl9WQUxJREFURV9VUkwpICYmCiFwcmVnX21hdGNoKCd8XlteL10rOi8vfHUnLCAkYmFzZVVyaSkKKSB7CmlmIChpc19maWxlKCRiYXNlVXJpKSkgewokYmFzZVVyaSA9ICdmaWxlOi8vJyAuIHJlYWxwYXRoKCRiYXNlVXJpKTsKfSBlbHNlaWYgKGlzX2RpcigkYmFzZVVyaSkpIHsKJGJhc2VVcmkgPSAnZmlsZTovLycgLiByZWFscGF0aCgkYmFzZVVyaSkgLiAnLyc7Cn0gZWxzZSB7CiRiYXNlVXJpID0gJ2ZpbGU6Ly8nIC4gZ2V0Y3dkKCkgLiAnLycgLiAkYmFzZVVyaTsKfQp9CgppZiAoJHVyaSA9PSAnJykgewpyZXR1cm4gJGJhc2VVcmk7Cn0KCiRjb21wb25lbnRzID0gJHRoaXMtPnBhcnNlKCR1cmkpOwokcGF0aCA9ICRjb21wb25lbnRzWydwYXRoJ107CgppZiAoIWVtcHR5KCRjb21wb25lbnRzWydzY2hlbWUnXSkpIHsKcmV0dXJuICR1cmk7Cn0KJGJhc2VDb21wb25lbnRzID0gJHRoaXMtPnBhcnNlKCRiYXNlVXJpKTsKJGJhc2VQYXRoID0gJGJhc2VDb21wb25lbnRzWydwYXRoJ107CgokYmFzZUNvbXBvbmVudHNbJ3BhdGgnXSA9IHNlbGY6OmNvbWJpbmVSZWxhdGl2ZVBhdGhXaXRoQmFzZVBhdGgoJHBhdGgsICRiYXNlUGF0aCk7CmlmIChpc3NldCgkY29tcG9uZW50c1snZnJhZ21lbnQnXSkpIHsKJGJhc2VDb21wb25lbnRzWydmcmFnbWVudCddID0gJGNvbXBvbmVudHNbJ2ZyYWdtZW50J107Cn0KCnJldHVybiAkdGhpcy0+Z2VuZXJhdGUoJGJhc2VDb21wb25lbnRzKTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29tYmluZVJlbGF0aXZlUGF0aFdpdGhCYXNlUGF0aCgkcmVsYXRpdmVQYXRoLCAkYmFzZVBhdGgpCnsKJHJlbGF0aXZlUGF0aCA9IHNlbGY6Om5vcm1hbGl6ZVBhdGgoJHJlbGF0aXZlUGF0aCk7CmlmICghJHJlbGF0aXZlUGF0aCkgewpyZXR1cm4gJGJhc2VQYXRoOwp9CmlmICgkcmVsYXRpdmVQYXRoWzBdID09PSAnLycpIHsKcmV0dXJuICRyZWxhdGl2ZVBhdGg7Cn0KaWYgKCEkYmFzZVBhdGgpIHsKdGhyb3cgbmV3IFVyaVJlc29sdmVyRXhjZXB0aW9uKHNwcmludGYoIlVuYWJsZSB0byByZXNvbHZlIFVSSSAnJXMnIGZyb20gYmFzZSAnJXMnIiwgJHJlbGF0aXZlUGF0aCwgJGJhc2VQYXRoKSk7Cn0KCiRkaXJuYW1lID0gJGJhc2VQYXRoW3N0cmxlbigkYmFzZVBhdGgpIC0gMV0gPT09ICcvJyA/ICRiYXNlUGF0aCA6IGRpcm5hbWUoJGJhc2VQYXRoKTsKJGNvbWJpbmVkID0gcnRyaW0oJGRpcm5hbWUsICcvJykgLiAnLycgLiBsdHJpbSgkcmVsYXRpdmVQYXRoLCAnLycpOwokY29tYmluZWRTZWdtZW50cyA9IGV4cGxvZGUoJy8nLCAkY29tYmluZWQpOwokY29sbGFwc2VkU2VnbWVudHMgPSBbXTsKd2hpbGUgKCRjb21iaW5lZFNlZ21lbnRzKSB7CiRzZWdtZW50ID0gYXJyYXlfc2hpZnQoJGNvbWJpbmVkU2VnbWVudHMpOwppZiAoJHNlZ21lbnQgPT09ICcuLicpIHsKaWYgKGNvdW50KCRjb2xsYXBzZWRTZWdtZW50cykgPD0gMSkgewoKCgoKdGhyb3cgbmV3IFVyaVJlc29sdmVyRXhjZXB0aW9uKHNwcmludGYoIlVuYWJsZSB0byByZXNvbHZlIFVSSSAnJXMnIGZyb20gYmFzZSAnJXMnIiwgJHJlbGF0aXZlUGF0aCwgJGJhc2VQYXRoKSk7Cn0KYXJyYXlfcG9wKCRjb2xsYXBzZWRTZWdtZW50cyk7Cn0gZWxzZSB7CiRjb2xsYXBzZWRTZWdtZW50c1tdID0gJHNlZ21lbnQ7Cn0KfQoKcmV0dXJuIGltcGxvZGUoJy8nLCAkY29sbGFwc2VkU2VnbWVudHMpOwp9CgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbm9ybWFsaXplUGF0aCgkcGF0aCkKewokcGF0aCA9IHByZWdfcmVwbGFjZSgnfCgoPzwhXC4pXC4vKSp8JywgJycsICRwYXRoKTsKJHBhdGggPSBwcmVnX3JlcGxhY2UoJ3wvL3wnLCAnLycsICRwYXRoKTsKCnJldHVybiAkcGF0aDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWYWxpZCgkdXJpKQp7CiRjb21wb25lbnRzID0gJHRoaXMtPnBhcnNlKCR1cmkpOwoKcmV0dXJuICFlbXB0eSgkY29tcG9uZW50cyk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcVXJpOwoKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXEludmFsaWRTY2hlbWFNZWRpYVR5cGVFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxKc29uRGVjb2RpbmdFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxVcmlcUmV0cmlldmVyc1xGaWxlR2V0Q29udGVudHM7CnVzZSBKc29uU2NoZW1hXFVyaVxSZXRyaWV2ZXJzXFVyaVJldHJpZXZlckludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcVXJpUmV0cmlldmVySW50ZXJmYWNlIGFzIEJhc2VVcmlSZXRyaWV2ZXJJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXFZhbGlkYXRvcjsKCgoKCgoKY2xhc3MgVXJpUmV0cmlldmVyIGltcGxlbWVudHMgQmFzZVVyaVJldHJpZXZlckludGVyZmFjZQp7CgoKCnByb3RlY3RlZCAkdHJhbnNsYXRpb25NYXAgPSBbCgonfF5odHRwcz86Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtKDBbMzRdKS9zY2hlbWEjP3wnID0+ICdwYWNrYWdlOi8vZGlzdC9zY2hlbWEvanNvbi1zY2hlbWEtZHJhZnQtJDEuanNvbicKXTsKCgoKCnByb3RlY3RlZCAkYWxsb3dlZEludmFsaWRDb250ZW50VHlwZUVuZHBvaW50cyA9IFsKJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvJywKJ2h0dHBzOi8vanNvbi1zY2hlbWEub3JnLycKXTsKCgoKCnByb3RlY3RlZCAkdXJpUmV0cmlldmVyID0gbnVsbDsKCgoKCgoKcHJpdmF0ZSAkc2NoZW1hQ2FjaGUgPSBbXTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEludmFsaWRDb250ZW50VHlwZUVuZHBvaW50KCRlbmRwb2ludCkKewokdGhpcy0+YWxsb3dlZEludmFsaWRDb250ZW50VHlwZUVuZHBvaW50c1tdID0gJGVuZHBvaW50Owp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb25maXJtTWVkaWFUeXBlKCR1cmlSZXRyaWV2ZXIsICR1cmkpCnsKJGNvbnRlbnRUeXBlID0gJHVyaVJldHJpZXZlci0+Z2V0Q29udGVudFR5cGUoKTsKCmlmIChpc19udWxsKCRjb250ZW50VHlwZSkpIHsKCnJldHVybjsKfQoKaWYgKGluX2FycmF5KCRjb250ZW50VHlwZSwgW1ZhbGlkYXRvcjo6U0NIRU1BX01FRElBX1RZUEUsICdhcHBsaWNhdGlvbi9qc29uJ10pKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJHRoaXMtPmFsbG93ZWRJbnZhbGlkQ29udGVudFR5cGVFbmRwb2ludHMgYXMgJGVuZHBvaW50KSB7CmlmICghXGlzX251bGwoJHVyaSkgJiYgc3RycG9zKCR1cmksICRlbmRwb2ludCkgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KfQoKdGhyb3cgbmV3IEludmFsaWRTY2hlbWFNZWRpYVR5cGVFeGNlcHRpb24oc3ByaW50ZignTWVkaWEgdHlwZSAlcyBleHBlY3RlZCcsIFZhbGlkYXRvcjo6U0NIRU1BX01FRElBX1RZUEUpKTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJpUmV0cmlldmVyKCkKewppZiAoaXNfbnVsbCgkdGhpcy0+dXJpUmV0cmlldmVyKSkgewokdGhpcy0+c2V0VXJpUmV0cmlldmVyKG5ldyBGaWxlR2V0Q29udGVudHMoKSk7Cn0KCnJldHVybiAkdGhpcy0+dXJpUmV0cmlldmVyOwp9CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlUG9pbnRlcigkanNvblNjaGVtYSwgJHVyaSkKewokcmVzb2x2ZXIgPSBuZXcgVXJpUmVzb2x2ZXIoKTsKJHBhcnNlZCA9ICRyZXNvbHZlci0+cGFyc2UoJHVyaSk7CmlmIChlbXB0eSgkcGFyc2VkWydmcmFnbWVudCddKSkgewpyZXR1cm4gJGpzb25TY2hlbWE7Cn0KCiRwYXRoID0gZXhwbG9kZSgnLycsICRwYXJzZWRbJ2ZyYWdtZW50J10pOwp3aGlsZSAoJHBhdGgpIHsKJHBhdGhFbGVtZW50ID0gYXJyYXlfc2hpZnQoJHBhdGgpOwppZiAoIWVtcHR5KCRwYXRoRWxlbWVudCkpIHsKJHBhdGhFbGVtZW50ID0gc3RyX3JlcGxhY2UoJ34xJywgJy8nLCAkcGF0aEVsZW1lbnQpOwokcGF0aEVsZW1lbnQgPSBzdHJfcmVwbGFjZSgnfjAnLCAnficsICRwYXRoRWxlbWVudCk7CmlmICghZW1wdHkoJGpzb25TY2hlbWEtPiRwYXRoRWxlbWVudCkpIHsKJGpzb25TY2hlbWEgPSAkanNvblNjaGVtYS0+JHBhdGhFbGVtZW50Owp9IGVsc2Ugewp0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigKJ0ZyYWdtZW50ICInIC4gJHBhcnNlZFsnZnJhZ21lbnQnXSAuICciIG5vdCBmb3VuZCcKLiAnIGluICcgLiAkdXJpCik7Cn0KCmlmICghaXNfb2JqZWN0KCRqc29uU2NoZW1hKSkgewp0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigKJ0ZyYWdtZW50IHBhcnQgIicgLiAkcGF0aEVsZW1lbnQgLiAnIiBpcyBubyBvYmplY3QgJwouICcgaW4gJyAuICR1cmkKKTsKfQp9Cn0KCnJldHVybiAkanNvblNjaGVtYTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlKCR1cmksICRiYXNlVXJpID0gbnVsbCwgJHRyYW5zbGF0ZSA9IHRydWUpCnsKJHJlc29sdmVyID0gbmV3IFVyaVJlc29sdmVyKCk7CiRyZXNvbHZlZFVyaSA9ICRmZXRjaFVyaSA9ICRyZXNvbHZlci0+cmVzb2x2ZSgkdXJpLCAkYmFzZVVyaSk7CgoKJGFyUGFydHMgPSAkcmVzb2x2ZXItPnBhcnNlKCRyZXNvbHZlZFVyaSk7CmlmIChpc3NldCgkYXJQYXJ0c1snZnJhZ21lbnQnXSkpIHsKdW5zZXQoJGFyUGFydHNbJ2ZyYWdtZW50J10pOwokZmV0Y2hVcmkgPSAkcmVzb2x2ZXItPmdlbmVyYXRlKCRhclBhcnRzKTsKfQoKCmlmICgkdHJhbnNsYXRlKSB7CiRmZXRjaFVyaSA9ICR0aGlzLT50cmFuc2xhdGUoJGZldGNoVXJpKTsKfQoKJGpzb25TY2hlbWEgPSAkdGhpcy0+bG9hZFNjaGVtYSgkZmV0Y2hVcmkpOwoKCiRqc29uU2NoZW1hID0gJHRoaXMtPnJlc29sdmVQb2ludGVyKCRqc29uU2NoZW1hLCAkcmVzb2x2ZWRVcmkpOwoKaWYgKCRqc29uU2NoZW1hIGluc3RhbmNlb2YgXHN0ZENsYXNzKSB7CiRqc29uU2NoZW1hLT5pZCA9ICRyZXNvbHZlZFVyaTsKfQoKcmV0dXJuICRqc29uU2NoZW1hOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBsb2FkU2NoZW1hKCRmZXRjaFVyaSkKewppZiAoaXNzZXQoJHRoaXMtPnNjaGVtYUNhY2hlWyRmZXRjaFVyaV0pKSB7CnJldHVybiAkdGhpcy0+c2NoZW1hQ2FjaGVbJGZldGNoVXJpXTsKfQoKJHVyaVJldHJpZXZlciA9ICR0aGlzLT5nZXRVcmlSZXRyaWV2ZXIoKTsKJGNvbnRlbnRzID0gJHRoaXMtPnVyaVJldHJpZXZlci0+cmV0cmlldmUoJGZldGNoVXJpKTsKJHRoaXMtPmNvbmZpcm1NZWRpYVR5cGUoJHVyaVJldHJpZXZlciwgJGZldGNoVXJpKTsKJGpzb25TY2hlbWEgPSBqc29uX2RlY29kZSgkY29udGVudHMpOwoKaWYgKEpTT05fRVJST1JfTk9ORSA8ICRlcnJvciA9IGpzb25fbGFzdF9lcnJvcigpKSB7CnRocm93IG5ldyBKc29uRGVjb2RpbmdFeGNlcHRpb24oJGVycm9yKTsKfQoKJHRoaXMtPnNjaGVtYUNhY2hlWyRmZXRjaFVyaV0gPSAkanNvblNjaGVtYTsKCnJldHVybiAkanNvblNjaGVtYTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVcmlSZXRyaWV2ZXIoVXJpUmV0cmlldmVySW50ZXJmYWNlICR1cmlSZXRyaWV2ZXIpCnsKJHRoaXMtPnVyaVJldHJpZXZlciA9ICR1cmlSZXRyaWV2ZXI7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2UoJHVyaSkKewpwcmVnX21hdGNoKCd8XigoW146Lz8jXSspOik/KC8vKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/fCcsICR1cmksICRtYXRjaCk7CgokY29tcG9uZW50cyA9IFtdOwppZiAoNSA8IGNvdW50KCRtYXRjaCkpIHsKJGNvbXBvbmVudHMgPSBbCidzY2hlbWUnID0+ICRtYXRjaFsyXSwKJ2F1dGhvcml0eScgPT4gJG1hdGNoWzRdLAoncGF0aCcgPT4gJG1hdGNoWzVdCl07Cn0KCmlmICg3IDwgY291bnQoJG1hdGNoKSkgewokY29tcG9uZW50c1sncXVlcnknXSA9ICRtYXRjaFs3XTsKfQoKaWYgKDkgPCBjb3VudCgkbWF0Y2gpKSB7CiRjb21wb25lbnRzWydmcmFnbWVudCddID0gJG1hdGNoWzldOwp9CgpyZXR1cm4gJGNvbXBvbmVudHM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2VuZXJhdGUoYXJyYXkgJGNvbXBvbmVudHMpCnsKJHVyaSA9ICRjb21wb25lbnRzWydzY2hlbWUnXSAuICc6Ly8nCi4gJGNvbXBvbmVudHNbJ2F1dGhvcml0eSddCi4gJGNvbXBvbmVudHNbJ3BhdGgnXTsKCmlmIChhcnJheV9rZXlfZXhpc3RzKCdxdWVyeScsICRjb21wb25lbnRzKSkgewokdXJpIC49ICRjb21wb25lbnRzWydxdWVyeSddOwp9CgppZiAoYXJyYXlfa2V5X2V4aXN0cygnZnJhZ21lbnQnLCAkY29tcG9uZW50cykpIHsKJHVyaSAuPSAkY29tcG9uZW50c1snZnJhZ21lbnQnXTsKfQoKcmV0dXJuICR1cmk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc29sdmUoJHVyaSwgJGJhc2VVcmkgPSBudWxsKQp7CiRjb21wb25lbnRzID0gJHRoaXMtPnBhcnNlKCR1cmkpOwokcGF0aCA9ICRjb21wb25lbnRzWydwYXRoJ107CgppZiAoKGFycmF5X2tleV9leGlzdHMoJ3NjaGVtZScsICRjb21wb25lbnRzKSkgJiYgKCdodHRwJyA9PT0gJGNvbXBvbmVudHNbJ3NjaGVtZSddKSkgewpyZXR1cm4gJHVyaTsKfQoKJGJhc2VDb21wb25lbnRzID0gJHRoaXMtPnBhcnNlKCRiYXNlVXJpKTsKJGJhc2VQYXRoID0gJGJhc2VDb21wb25lbnRzWydwYXRoJ107CgokYmFzZUNvbXBvbmVudHNbJ3BhdGgnXSA9IFVyaVJlc29sdmVyOjpjb21iaW5lUmVsYXRpdmVQYXRoV2l0aEJhc2VQYXRoKCRwYXRoLCAkYmFzZVBhdGgpOwoKcmV0dXJuICR0aGlzLT5nZW5lcmF0ZSgkYmFzZUNvbXBvbmVudHMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZhbGlkKCR1cmkpCnsKJGNvbXBvbmVudHMgPSAkdGhpcy0+cGFyc2UoJHVyaSk7CgpyZXR1cm4gIWVtcHR5KCRjb21wb25lbnRzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFRyYW5zbGF0aW9uKCRmcm9tLCAkdG8pCnsKJHRoaXMtPnRyYW5zbGF0aW9uTWFwWyRmcm9tXSA9ICR0bzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHRyYW5zbGF0ZSgkdXJpKQp7CmZvcmVhY2ggKCR0aGlzLT50cmFuc2xhdGlvbk1hcCBhcyAkZnJvbSA9PiAkdG8pIHsKJHVyaSA9IHByZWdfcmVwbGFjZSgkZnJvbSwgJHRvLCAkdXJpKTsKfQoKCiR1cmkgPSBwcmVnX3JlcGxhY2UoJ3xecGFja2FnZTovL3wnLCBzcHJpbnRmKCdmaWxlOi8vJXMvJywgcmVhbHBhdGgoX19ESVJfXyAuICcvLi4vLi4vLi4nKSksICR1cmkpOwoKcmV0dXJuICR1cmk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWE7CgoKCgppbnRlcmZhY2UgVXJpUmVzb2x2ZXJJbnRlcmZhY2UKewoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlKCR1cmksICRiYXNlVXJpID0gbnVsbCk7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hOwoKCgoKaW50ZXJmYWNlIFVyaVJldHJpZXZlckludGVyZmFjZQp7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlKCR1cmksICRiYXNlVXJpID0gbnVsbCk7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQmFzZUNvbnN0cmFpbnQ7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnQ7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXFR5cGVDaGVja1xMb29zZVR5cGVDaGVjazsKCgoKCgoKCgoKY2xhc3MgVmFsaWRhdG9yIGV4dGVuZHMgQmFzZUNvbnN0cmFpbnQKewpwdWJsaWMgY29uc3QgU0NIRU1BX01FRElBX1RZUEUgPSAnYXBwbGljYXRpb24vc2NoZW1hK2pzb24nOwoKcHVibGljIGNvbnN0IEVSUk9SX05PTkUgPSAwOwpwdWJsaWMgY29uc3QgRVJST1JfQUxMID0gLTE7CnB1YmxpYyBjb25zdCBFUlJPUl9ET0NVTUVOVF9WQUxJREFUSU9OID0gMTsKcHVibGljIGNvbnN0IEVSUk9SX1NDSEVNQV9WQUxJREFUSU9OID0gMjsKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9pbnQgJGNoZWNrTW9kZSA9IG51bGwpOiBpbnQKewoKJHRoaXMtPnJlc2V0KCk7CgoKJGluaXRpYWxDaGVja01vZGUgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKCk7CmlmICgkY2hlY2tNb2RlICE9PSBudWxsKSB7CiR0aGlzLT5mYWN0b3J5LT5zZXRDb25maWcoJGNoZWNrTW9kZSk7Cn0KCgokc2NoZW1hVVJJID0gU2NoZW1hU3RvcmFnZTo6SU5URVJOQUxfUFJPVklERURfU0NIRU1BX1VSSTsKaWYgKExvb3NlVHlwZUNoZWNrOjpwcm9wZXJ0eUV4aXN0cygkc2NoZW1hLCAnaWQnKSkgewokc2NoZW1hVVJJID0gTG9vc2VUeXBlQ2hlY2s6OnByb3BlcnR5R2V0KCRzY2hlbWEsICdpZCcpOwp9CiR0aGlzLT5mYWN0b3J5LT5nZXRTY2hlbWFTdG9yYWdlKCktPmFkZFNjaGVtYSgkc2NoZW1hVVJJLCAkc2NoZW1hKTsKCiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwokdmFsaWRhdG9yLT5jaGVjaygKJHZhbHVlLAokdGhpcy0+ZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpLT5nZXRTY2hlbWEoJHNjaGVtYVVSSSkKKTsKCiR0aGlzLT5mYWN0b3J5LT5zZXRDb25maWcoJGluaXRpYWxDaGVja01vZGUpOwoKJHRoaXMtPmFkZEVycm9ycyhhcnJheV91bmlxdWUoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCksIFNPUlRfUkVHVUxBUikpOwoKcmV0dXJuICR2YWxpZGF0b3ItPmdldEVycm9yTWFzaygpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCR2YWx1ZSwgJHNjaGVtYSk6IGludAp7CnJldHVybiAkdGhpcy0+dmFsaWRhdGUoJHZhbHVlLCAkc2NoZW1hKTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb2VyY2UoJiR2YWx1ZSwgJHNjaGVtYSk6IGludAp7CnJldHVybiAkdGhpcy0+dmFsaWRhdGUoJHZhbHVlLCAkc2NoZW1hLCBDb25zdHJhaW50OjpDSEVDS19NT0RFX0NPRVJDRV9UWVBFUyk7Cn0KfQpDb3B5cmlnaHQgKGMpIDIwMjAsIE1hcmMgQmVubmV3aXR6CkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAphcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CgogICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAKICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogICAgCiAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXNhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORApBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRApXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIE1hYmVFbnVtOwoKdXNlIFJlZmxlY3Rpb25DbGFzczsKdXNlIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIExvZ2ljRXhjZXB0aW9uOwoKCgoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgRW51bSBpbXBsZW1lbnRzIFxTdHJpbmdhYmxlCnsKCgoKCgpwcml2YXRlICR2YWx1ZTsKCgoKCgoKcHJpdmF0ZSAkb3JkaW5hbDsKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgJGNvbnN0YW50cyA9IFtdOwoKCgoKCgpwcml2YXRlIHN0YXRpYyAkbmFtZXMgPSBbXTsKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlcyA9IFtdOwoKCgoKCgoKZmluYWwgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmFsdWUsICRvcmRpbmFsID0gbnVsbCkKewokdGhpcy0+dmFsdWUgPSAkdmFsdWU7CiR0aGlzLT5vcmRpbmFsID0gJG9yZGluYWw7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0TmFtZSgpOwp9CgoKCgoKZmluYWwgcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKQp7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignRW51bXMgYXJlIG5vdCBjbG9uZWFibGUnKTsKfQoKCgoKCgpmaW5hbCBwdWJsaWMgZnVuY3Rpb24gX19zbGVlcCgpCnsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdTZXJpYWxpemF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZGVmYXVsdCBpbiB0aGlzIHBzZXVkby1lbnVtIGltcGxlbWVudGF0aW9uJyk7Cn0KCgoKCgoKZmluYWwgcHVibGljIGZ1bmN0aW9uIF9fd2FrZXVwKCkKewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1NlcmlhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0IGluIHRoaXMgcHNldWRvLWVudW0gaW1wbGVtZW50YXRpb24nKTsKfQoKCgoKCgpmaW5hbCBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWUoKQp7CnJldHVybiAkdGhpcy0+dmFsdWU7Cn0KCgoKCgoKCgoKZmluYWwgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQp7CnJldHVybiBzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc11bJHRoaXMtPm9yZGluYWwgPz8gJHRoaXMtPmdldE9yZGluYWwoKV07Cn0KCgoKCgoKZmluYWwgcHVibGljIGZ1bmN0aW9uIGdldE9yZGluYWwoKQp7CmlmICgkdGhpcy0+b3JkaW5hbCA9PT0gbnVsbCkgewokb3JkaW5hbCA9IDA7CiR2YWx1ZSA9ICR0aGlzLT52YWx1ZTsKJGNvbnN0YW50cyA9IHNlbGY6OiRjb25zdGFudHNbc3RhdGljOjpjbGFzc10gPz8gc3RhdGljOjpnZXRDb25zdGFudHMoKTsKZm9yZWFjaCAoJGNvbnN0YW50cyBhcyAkY29uc3RWYWx1ZSkgewppZiAoJHZhbHVlID09PSAkY29uc3RWYWx1ZSkgewpicmVhazsKfQorKyRvcmRpbmFsOwp9CgokdGhpcy0+b3JkaW5hbCA9ICRvcmRpbmFsOwp9CgpyZXR1cm4gJHRoaXMtPm9yZGluYWw7Cn0KCgoKCgoKCmZpbmFsIHB1YmxpYyBmdW5jdGlvbiBpcygkZW51bWVyYXRvcikKewpyZXR1cm4gJHRoaXMgPT09ICRlbnVtZXJhdG9yIHx8ICR0aGlzLT52YWx1ZSA9PT0gJGVudW1lcmF0b3IKCgp8fCAoJGVudW1lcmF0b3IgaW5zdGFuY2VvZiBzdGF0aWMKJiYgXGdldF9jbGFzcygkZW51bWVyYXRvcikgPT09IHN0YXRpYzo6Y2xhc3MKJiYgJGVudW1lcmF0b3ItPnZhbHVlID09PSAkdGhpcy0+dmFsdWUKKTsKfQoKCgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KCRlbnVtZXJhdG9yKQp7CmlmICgkZW51bWVyYXRvciBpbnN0YW5jZW9mIHN0YXRpYykgewppZiAoXGdldF9jbGFzcygkZW51bWVyYXRvcikgIT09IHN0YXRpYzo6Y2xhc3MpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAonSW52YWxpZCB2YWx1ZSBvZiB0eXBlICVzIGZvciBlbnVtZXJhdGlvbiAlcycsClxnZXRfY2xhc3MoJGVudW1lcmF0b3IpLApzdGF0aWM6OmNsYXNzCikpOwp9CgpyZXR1cm4gJGVudW1lcmF0b3I7Cn0KCnJldHVybiBzdGF0aWM6OmJ5VmFsdWUoJGVudW1lcmF0b3IpOwp9CgoKCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBieVZhbHVlKCR2YWx1ZSkKewoKCiRjb25zdGFudHMgPSBzZWxmOjokY29uc3RhbnRzW3N0YXRpYzo6Y2xhc3NdID8/IHN0YXRpYzo6Z2V0Q29uc3RhbnRzKCk7CgokbmFtZSA9IFxhcnJheV9zZWFyY2goJHZhbHVlLCAkY29uc3RhbnRzLCB0cnVlKTsKaWYgKCRuYW1lID09PSBmYWxzZSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCidVbmtub3duIHZhbHVlICVzIGZvciBlbnVtZXJhdGlvbiAlcycsClxpc19zY2FsYXIoJHZhbHVlKQo/IFx2YXJfZXhwb3J0KCR2YWx1ZSwgdHJ1ZSkKOiAnb2YgdHlwZSAnIC4gKFxpc19vYmplY3QoJHZhbHVlKSA/IFxnZXRfY2xhc3MoJHZhbHVlKSA6IFxnZXR0eXBlKCR2YWx1ZSkpLApzdGF0aWM6OmNsYXNzCikpOwp9CgoKJGluc3RhbmNlID0gc2VsZjo6JGluc3RhbmNlc1tzdGF0aWM6OmNsYXNzXVskbmFtZV0KPz8gc2VsZjo6JGluc3RhbmNlc1tzdGF0aWM6OmNsYXNzXVskbmFtZV0gPSBuZXcgc3RhdGljKCRjb25zdGFudHNbJG5hbWVdKTsKCnJldHVybiAkaW5zdGFuY2U7Cn0KCgoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJ5TmFtZShzdHJpbmcgJG5hbWUpCnsKaWYgKGlzc2V0KHNlbGY6OiRpbnN0YW5jZXNbc3RhdGljOjpjbGFzc11bJG5hbWVdKSkgewoKJGluc3RhbmNlID0gc2VsZjo6JGluc3RhbmNlc1tzdGF0aWM6OmNsYXNzXVskbmFtZV07CnJldHVybiAkaW5zdGFuY2U7Cn0KCiRjb25zdCA9IHN0YXRpYzo6Y2xhc3MgLiAiOjp7JG5hbWV9IjsKaWYgKCFcZGVmaW5lZCgkY29uc3QpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oInskY29uc3R9IG5vdCBkZWZpbmVkIik7Cn0KCmFzc2VydCgKc2VsZjo6bm9BbWJpZ3VvdXNWYWx1ZXMoc3RhdGljOjpnZXRDb25zdGFudHMoKSksCidBbWJpZ3VvdXMgZW51bWVyYXRvciB2YWx1ZXMgZGV0ZWN0ZWQgZm9yICcgLiBzdGF0aWM6OmNsYXNzCik7CgoKJHZhbHVlID0gXGNvbnN0YW50KCRjb25zdCk7CnJldHVybiBzZWxmOjokaW5zdGFuY2VzW3N0YXRpYzo6Y2xhc3NdWyRuYW1lXSA9IG5ldyBzdGF0aWMoJHZhbHVlKTsKfQoKCgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnlPcmRpbmFsKGludCAkb3JkaW5hbCkKewokY29uc3RhbnRzID0gc2VsZjo6JGNvbnN0YW50c1tzdGF0aWM6OmNsYXNzXSA/PyBzdGF0aWM6OmdldENvbnN0YW50cygpOwoKaWYgKCFpc3NldChzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc11bJG9yZGluYWxdKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFxzcHJpbnRmKAonSW52YWxpZCBvcmRpbmFsIG51bWJlciAlcywgbXVzdCBiZXR3ZWVuIDAgYW5kICVzJywKJG9yZGluYWwsClxjb3VudChzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc10pIC0gMQopKTsKfQoKJG5hbWUgPSBzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc11bJG9yZGluYWxdOwoKCiRpbnN0YW5jZSA9IHNlbGY6OiRpbnN0YW5jZXNbc3RhdGljOjpjbGFzc11bJG5hbWVdCj8/IHNlbGY6OiRpbnN0YW5jZXNbc3RhdGljOjpjbGFzc11bJG5hbWVdID0gbmV3IHN0YXRpYygkY29uc3RhbnRzWyRuYW1lXSwgJG9yZGluYWwpOwoKcmV0dXJuICRpbnN0YW5jZTsKfQoKCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRFbnVtZXJhdG9ycygpCnsKaWYgKCFpc3NldChzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc10pKSB7CnN0YXRpYzo6Z2V0Q29uc3RhbnRzKCk7Cn0KCgokYnlOYW1lRm4gPSBbc3RhdGljOjpjbGFzcywgJ2J5TmFtZSddOwpyZXR1cm4gXGFycmF5X21hcCgkYnlOYW1lRm4sIHNlbGY6OiRuYW1lc1tzdGF0aWM6OmNsYXNzXSk7Cn0KCgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmFsdWVzKCkKewpyZXR1cm4gXGFycmF5X3ZhbHVlcyhzZWxmOjokY29uc3RhbnRzW3N0YXRpYzo6Y2xhc3NdID8/IHN0YXRpYzo6Z2V0Q29uc3RhbnRzKCkpOwp9CgoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE5hbWVzKCkKewppZiAoIWlzc2V0KHNlbGY6OiRuYW1lc1tzdGF0aWM6OmNsYXNzXSkpIHsKc3RhdGljOjpnZXRDb25zdGFudHMoKTsKfQpyZXR1cm4gc2VsZjo6JG5hbWVzW3N0YXRpYzo6Y2xhc3NdOwp9CgoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE9yZGluYWxzKCkKewokY291bnQgPSBcY291bnQoc2VsZjo6JGNvbnN0YW50c1tzdGF0aWM6OmNsYXNzXSA/PyBzdGF0aWM6OmdldENvbnN0YW50cygpKTsKcmV0dXJuICRjb3VudCA/IFxyYW5nZSgwLCAkY291bnQgLSAxKSA6IFtdOwp9CgoKCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb25zdGFudHMoKQp7CmlmIChpc3NldChzZWxmOjokY29uc3RhbnRzW3N0YXRpYzo6Y2xhc3NdKSkgewpyZXR1cm4gc2VsZjo6JGNvbnN0YW50c1tzdGF0aWM6OmNsYXNzXTsKfQoKJHJlZmxlY3Rpb24gPSBuZXcgUmVmbGVjdGlvbkNsYXNzKHN0YXRpYzo6Y2xhc3MpOwokY29uc3RhbnRzID0gW107CgpkbyB7CiRzY29wZUNvbnN0YW50cyA9IFtdOwoKZm9yZWFjaCAoJHJlZmxlY3Rpb24tPmdldFJlZmxlY3Rpb25Db25zdGFudHMoKSBhcyAkcmVmbENvbnN0YW50KSB7CmlmICgkcmVmbENvbnN0YW50LT5pc1B1YmxpYygpKSB7CiRzY29wZUNvbnN0YW50c1sgJHJlZmxDb25zdGFudC0+Z2V0TmFtZSgpIF0gPSAkcmVmbENvbnN0YW50LT5nZXRWYWx1ZSgpOwp9Cn0KCiRjb25zdGFudHMgPSAkc2NvcGVDb25zdGFudHMgKyAkY29uc3RhbnRzOwp9IHdoaWxlICgoJHJlZmxlY3Rpb24gPSAkcmVmbGVjdGlvbi0+Z2V0UGFyZW50Q2xhc3MoKSkgJiYgJHJlZmxlY3Rpb24tPm5hbWUgIT09IF9fQ0xBU1NfXyk7CgoKCmFzc2VydCgKc2VsZjo6bm9BbWJpZ3VvdXNWYWx1ZXMoJGNvbnN0YW50cyksCidBbWJpZ3VvdXMgZW51bWVyYXRvciB2YWx1ZXMgZGV0ZWN0ZWQgZm9yICcgLiBzdGF0aWM6OmNsYXNzCik7CgpzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc10gPSBcYXJyYXlfa2V5cygkY29uc3RhbnRzKTsKcmV0dXJuIHNlbGY6OiRjb25zdGFudHNbc3RhdGljOjpjbGFzc10gPSAkY29uc3RhbnRzOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG5vQW1iaWd1b3VzVmFsdWVzKCRjb25zdGFudHMpCnsKZm9yZWFjaCAoJGNvbnN0YW50cyBhcyAkdmFsdWUpIHsKJG5hbWVzID0gXGFycmF5X2tleXMoJGNvbnN0YW50cywgJHZhbHVlLCB0cnVlKTsKaWYgKFxjb3VudCgkbmFtZXMpID4gMSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXMoJGVudW1lcmF0b3IpCnsKaWYgKCRlbnVtZXJhdG9yIGluc3RhbmNlb2Ygc3RhdGljKSB7CnJldHVybiBcZ2V0X2NsYXNzKCRlbnVtZXJhdG9yKSA9PT0gc3RhdGljOjpjbGFzczsKfQoKcmV0dXJuIHN0YXRpYzo6aGFzVmFsdWUoJGVudW1lcmF0b3IpOwp9CgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGFzVmFsdWUoJHZhbHVlKQp7CnJldHVybiBcaW5fYXJyYXkoJHZhbHVlLCBzZWxmOjokY29uc3RhbnRzW3N0YXRpYzo6Y2xhc3NdID8/IHN0YXRpYzo6Z2V0Q29uc3RhbnRzKCksIHRydWUpOwp9CgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGFzTmFtZShzdHJpbmcgJG5hbWUpCnsKcmV0dXJuIFxkZWZpbmVkKCJzdGF0aWM6OnskbmFtZX0iKTsKfQoKCgoKCgoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9fY2FsbFN0YXRpYyhzdHJpbmcgJG1ldGhvZCwgYXJyYXkgJGFyZ3MpCnsKcmV0dXJuIHN0YXRpYzo6YnlOYW1lKCRtZXRob2QpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIE1hYmVFbnVtOwoKdXNlIEFycmF5QWNjZXNzOwp1c2UgQ291bnRhYmxlOwp1c2UgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgSXRlcmF0b3I7CnVzZSBJdGVyYXRvckFnZ3JlZ2F0ZTsKdXNlIFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbjsKCgoKCgoKCgoKCgoKY2xhc3MgRW51bU1hcCBpbXBsZW1lbnRzIEFycmF5QWNjZXNzLCBDb3VudGFibGUsIEl0ZXJhdG9yQWdncmVnYXRlCnsKCgoKCnByaXZhdGUgJGVudW1lcmF0aW9uOwoKCgoKCnByaXZhdGUgJG1hcCA9IFtdOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZW51bWVyYXRpb24sID9pdGVyYWJsZSAkbWFwID0gbnVsbCkKewppZiAoIVxpc19zdWJjbGFzc19vZigkZW51bWVyYXRpb24sIEVudW06OmNsYXNzKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFxzcHJpbnRmKAonJXMgY2FuIGhhbmRsZSBzdWJjbGFzc2VzIG9mICVzIG9ubHknLApfX0NMQVNTX18sCkVudW06OmNsYXNzCikpOwp9CiR0aGlzLT5lbnVtZXJhdGlvbiA9ICRlbnVtZXJhdGlvbjsKCmlmICgkbWFwKSB7CiR0aGlzLT5hZGRJdGVyYWJsZSgkbWFwKTsKfQp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2RlYnVnSW5mbygpOiBhcnJheSB7CiRkYmcgPSAoYXJyYXkpJHRoaXM7CiRkYmdbIlwwIiAuIHNlbGY6OmNsYXNzIC4gIlwwX19wYWlycyJdID0gYXJyYXlfbWFwKGZ1bmN0aW9uICgkaywgJHYpIHsKcmV0dXJuIFskaywgJHZdOwp9LCAkdGhpcy0+Z2V0S2V5cygpLCAkdGhpcy0+Z2V0VmFsdWVzKCkpOwpyZXR1cm4gJGRiZzsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZCgkZW51bWVyYXRvciwgJHZhbHVlKTogdm9pZAp7CiRvcmQgPSAoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpOwokdGhpcy0+bWFwWyRvcmRdID0gJHZhbHVlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRJdGVyYWJsZShpdGVyYWJsZSAkbWFwKTogdm9pZAp7CiRpbm5lck1hcCA9ICR0aGlzLT5tYXA7CmZvcmVhY2ggKCRtYXAgYXMgJGVudW1lcmF0b3IgPT4gJHZhbHVlKSB7CiRvcmQgPSAoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpOwokaW5uZXJNYXBbJG9yZF0gPSAkdmFsdWU7Cn0KJHRoaXMtPm1hcCA9ICRpbm5lck1hcDsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZSgkZW51bWVyYXRvcik6IHZvaWQKewokb3JkID0gKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKTsKdW5zZXQoJHRoaXMtPm1hcFskb3JkXSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUl0ZXJhYmxlKGl0ZXJhYmxlICRlbnVtZXJhdG9ycyk6IHZvaWQKewokbWFwID0gJHRoaXMtPm1hcDsKZm9yZWFjaCAoJGVudW1lcmF0b3JzIGFzICRlbnVtZXJhdG9yKSB7CiRvcmQgPSAoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpOwp1bnNldCgkbWFwWyRvcmRdKTsKfQoKJHRoaXMtPm1hcCA9ICRtYXA7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoKCRlbnVtZXJhdG9yLCAkdmFsdWUpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+YWRkKCRlbnVtZXJhdG9yLCAkdmFsdWUpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aEl0ZXJhYmxlKGl0ZXJhYmxlICRtYXApOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+YWRkSXRlcmFibGUoJG1hcCk7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRob3V0KCRlbnVtZXJhdG9yKTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwokY2xvbmUtPnJlbW92ZSgkZW51bWVyYXRvcik7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRob3V0SXRlcmFibGUoaXRlcmFibGUgJGVudW1lcmF0b3JzKTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwokY2xvbmUtPnJlbW92ZUl0ZXJhYmxlKCRlbnVtZXJhdG9ycyk7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFbnVtZXJhdGlvbigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmVudW1lcmF0aW9uOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoJGVudW1lcmF0b3IpCnsKJGVudW1lcmF0b3IgPSAoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKTsKJG9yZCA9ICRlbnVtZXJhdG9yLT5nZXRPcmRpbmFsKCk7CmlmICghXGFycmF5X2tleV9leGlzdHMoJG9yZCwgJHRoaXMtPm1hcCkpIHsKdGhyb3cgbmV3IFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbihzcHJpbnRmKAonRW51bWVyYXRvciAlcyBjb3VsZCBub3QgYmUgZm91bmQnLApcdmFyX2V4cG9ydCgkZW51bWVyYXRvci0+Z2V0VmFsdWUoKSwgdHJ1ZSkKKSk7Cn0KCnJldHVybiAkdGhpcy0+bWFwWyRvcmRdOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEtleXMoKTogYXJyYXkKewoKJGJ5T3JkaW5hbEZuID0gWyR0aGlzLT5lbnVtZXJhdGlvbiwgJ2J5T3JkaW5hbCddOwoKcmV0dXJuIFxhcnJheV9tYXAoJGJ5T3JkaW5hbEZuLCBcYXJyYXlfa2V5cygkdGhpcy0+bWFwKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVzKCk6IGFycmF5CnsKcmV0dXJuIFxhcnJheV92YWx1ZXMoJHRoaXMtPm1hcCk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWFyY2goJHZhbHVlLCBib29sICRzdHJpY3QgPSBmYWxzZSkKewoKJG9yZCA9IFxhcnJheV9zZWFyY2goJHZhbHVlLCAkdGhpcy0+bWFwLCAkc3RyaWN0KTsKaWYgKCRvcmQgIT09IGZhbHNlKSB7CnJldHVybiAoJHRoaXMtPmVudW1lcmF0aW9uKTo6YnlPcmRpbmFsKCRvcmQpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcygkZW51bWVyYXRvcik6IGJvb2wKewp0cnkgewokb3JkID0gKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKTsKcmV0dXJuIFxhcnJheV9rZXlfZXhpc3RzKCRvcmQsICR0aGlzLT5tYXApOwp9IGNhdGNoIChJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gJGUpIHsKCnJldHVybiBmYWxzZTsKfQp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb250YWlucygkZW51bWVyYXRvcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmhhcygkZW51bWVyYXRvcik7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG9mZnNldEV4aXN0cygkZW51bWVyYXRvcik6IGJvb2wKewp0cnkgewpyZXR1cm4gaXNzZXQoJHRoaXMtPm1hcFsoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpXSk7Cn0gY2F0Y2ggKEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiAkZSkgewoKcmV0dXJuIGZhbHNlOwp9Cn0KCgoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIG9mZnNldEdldCgkZW51bWVyYXRvcikKewp0cnkgewpyZXR1cm4gJHRoaXMtPmdldCgkZW51bWVyYXRvcik7Cn0gY2F0Y2ggKFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewpyZXR1cm4gbnVsbDsKfQp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvZmZzZXRTZXQoJGVudW1lcmF0b3IsICR2YWx1ZSA9IG51bGwpOiB2b2lkCnsKJHRoaXMtPmFkZCgkZW51bWVyYXRvciwgJHZhbHVlKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvZmZzZXRVbnNldCgkZW51bWVyYXRvcik6IHZvaWQKewokdGhpcy0+cmVtb3ZlKCRlbnVtZXJhdG9yKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpOiBJdGVyYXRvcgp7CiRtYXAgPSAkdGhpcy0+bWFwOwpmb3JlYWNoICgkbWFwIGFzICRvcmRpbmFsID0+ICR2YWx1ZSkgewp5aWVsZCAoJHRoaXMtPmVudW1lcmF0aW9uKTo6YnlPcmRpbmFsKCRvcmRpbmFsKSA9PiAkdmFsdWU7Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewpyZXR1cm4gXGNvdW50KCR0aGlzLT5tYXApOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCk6IGJvb2wKewpyZXR1cm4gZW1wdHkoJHRoaXMtPm1hcCk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgTWFiZUVudW07Cgp1c2UgUnVudGltZUV4Y2VwdGlvbjsKdXNlIExvZ2ljRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgoKCnRyYWl0IEVudW1TZXJpYWxpemFibGVUcmFpdAp7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWUoKTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3NlcmlhbGl6ZSgpOiBhcnJheQp7CnJldHVybiBbJ3ZhbHVlJyA9PiAkdGhpcy0+Z2V0VmFsdWUoKV07Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX191bnNlcmlhbGl6ZShhcnJheSAkZGF0YSk6IHZvaWQKewppZiAoIVxhcnJheV9rZXlfZXhpc3RzKCd2YWx1ZScsICRkYXRhKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWlzc2luZyBhcnJheSBrZXkgInZhbHVlIicpOwp9CgoKJHZhbHVlID0gJGRhdGFbJ3ZhbHVlJ107CiRjb25zdGFudHMgPSBzZWxmOjpnZXRDb25zdGFudHMoKTsKJG5hbWUgPSBcYXJyYXlfc2VhcmNoKCR2YWx1ZSwgJGNvbnN0YW50cywgdHJ1ZSk7CmlmICgkbmFtZSA9PT0gZmFsc2UpIHsKJG1lc3NhZ2UgPSBcaXNfc2NhbGFyKCR2YWx1ZSkKPyAnVW5rbm93biB2YWx1ZSAnIC4gXHZhcl9leHBvcnQoJHZhbHVlLCB0cnVlKQo6ICdJbnZhbGlkIHZhbHVlIG9mIHR5cGUgJyAuIChcaXNfb2JqZWN0KCR2YWx1ZSkgPyBcZ2V0X2NsYXNzKCR2YWx1ZSkgOiBcZ2V0dHlwZSgkdmFsdWUpKTsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJG1lc3NhZ2UpOwp9CgokY2xhc3MgPSBzdGF0aWM6OmNsYXNzOwokZW51bWVyYXRvciA9ICR0aGlzOwokY2xvc3VyZSA9IGZ1bmN0aW9uICgpIHVzZSAoJGNsYXNzLCAkbmFtZSwgJHZhbHVlLCAkZW51bWVyYXRvcikgewppZiAoJHZhbHVlICE9PSBudWxsICYmICR0aGlzLT52YWx1ZSAhPT0gbnVsbCkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0RvIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHkgLSBwbGVhc2UgdXNlIHVuc2VyaWFsaXplKCRlbnVtKSBpbnN0ZWFkJyk7Cn0KCiR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKCmlmICghaXNzZXQoc2VsZjo6JGluc3RhbmNlc1skY2xhc3NdWyRuYW1lXSkpIHsKc2VsZjo6JGluc3RhbmNlc1skY2xhc3NdWyRuYW1lXSA9ICRlbnVtZXJhdG9yOwp9Cn07CiRjbG9zdXJlLT5iaW5kVG8oJHRoaXMsIEVudW06OmNsYXNzKSgpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNlcmlhbGl6ZSgpOiBzdHJpbmcKewpyZXR1cm4gXHNlcmlhbGl6ZSgkdGhpcy0+Z2V0VmFsdWUoKSk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bnNlcmlhbGl6ZSgkc2VyaWFsaXplZCk6IHZvaWQKewokdGhpcy0+X191bnNlcmlhbGl6ZShbJ3ZhbHVlJyA9PiBcdW5zZXJpYWxpemUoJHNlcmlhbGl6ZWQpXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgTWFiZUVudW07Cgp1c2UgQ291bnRhYmxlOwp1c2UgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgSXRlcmF0b3I7CnVzZSBJdGVyYXRvckFnZ3JlZ2F0ZTsKCgoKCgoKCgoKCgoKY2xhc3MgRW51bVNldCBpbXBsZW1lbnRzIEl0ZXJhdG9yQWdncmVnYXRlLCBDb3VudGFibGUKewoKCgoKcHJpdmF0ZSAkZW51bWVyYXRpb247CgoKCgoKcHJpdmF0ZSAkZW51bWVyYXRpb25Db3VudDsKCgoKCgpwcml2YXRlICRiaXRzZXQgPSAwOwoKCgoKCgpwcml2YXRlICRlbXB0eUJpdHNldCA9IDA7CgoKCgoKCgoKCnByaXZhdGUgJGZuRG9HZXRJdGVyYXRvciA9ICdkb0dldEl0ZXJhdG9ySW50JzsKCgpwcml2YXRlICRmbkRvQ291bnQgPSAnZG9Db3VudEludCc7CgoKcHJpdmF0ZSAkZm5Eb0dldE9yZGluYWxzID0gJ2RvR2V0T3JkaW5hbHNJbnQnOwoKCnByaXZhdGUgJGZuRG9HZXRCaXQgPSAnZG9HZXRCaXRJbnQnOwoKCnByaXZhdGUgJGZuRG9TZXRCaXQgPSAnZG9TZXRCaXRJbnQnOwoKCnByaXZhdGUgJGZuRG9VbnNldEJpdCA9ICdkb1Vuc2V0Qml0SW50JzsKCgpwcml2YXRlICRmbkRvR2V0QmluYXJ5Qml0c2V0TGUgPSAnZG9HZXRCaW5hcnlCaXRzZXRMZUludCc7CgoKcHJpdmF0ZSAkZm5Eb1NldEJpbmFyeUJpdHNldExlID0gJ2RvU2V0QmluYXJ5Qml0c2V0TGVJbnQnOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRlbnVtZXJhdGlvbiwgP2l0ZXJhYmxlICRlbnVtZXJhdG9ycyA9IG51bGwpCnsKaWYgKCFcaXNfc3ViY2xhc3Nfb2YoJGVudW1lcmF0aW9uLCBFbnVtOjpjbGFzcykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihcc3ByaW50ZigKJyVzIGNhbiBoYW5kbGUgc3ViY2xhc3NlcyBvZiAlcyBvbmx5JywKX19NRVRIT0RfXywKRW51bTo6Y2xhc3MKKSk7Cn0KCiR0aGlzLT5lbnVtZXJhdGlvbiA9ICRlbnVtZXJhdGlvbjsKJHRoaXMtPmVudW1lcmF0aW9uQ291bnQgPSBcY291bnQoJGVudW1lcmF0aW9uOjpnZXRDb25zdGFudHMoKSk7CgoKCgppZiAoJHRoaXMtPmVudW1lcmF0aW9uQ291bnQgPiBcUEhQX0lOVF9TSVpFICogOCkgewoKJHRoaXMtPmJpdHNldCA9ICR0aGlzLT5lbXB0eUJpdHNldCA9IFxzdHJfcmVwZWF0KCJcMCIsIChpbnQpXGNlaWwoJHRoaXMtPmVudW1lcmF0aW9uQ291bnQgLyA4KSk7CgoKJHRoaXMtPmZuRG9HZXRJdGVyYXRvciA9ICdkb0dldEl0ZXJhdG9yQmluJzsKJHRoaXMtPmZuRG9Db3VudCA9ICdkb0NvdW50QmluJzsKJHRoaXMtPmZuRG9HZXRPcmRpbmFscyA9ICdkb0dldE9yZGluYWxzQmluJzsKJHRoaXMtPmZuRG9HZXRCaXQgPSAnZG9HZXRCaXRCaW4nOwokdGhpcy0+Zm5Eb1NldEJpdCA9ICdkb1NldEJpdEJpbic7CiR0aGlzLT5mbkRvVW5zZXRCaXQgPSAnZG9VbnNldEJpdEJpbic7CiR0aGlzLT5mbkRvR2V0QmluYXJ5Qml0c2V0TGUgPSAnZG9HZXRCaW5hcnlCaXRzZXRMZUJpbic7CiR0aGlzLT5mbkRvU2V0QmluYXJ5Qml0c2V0TGUgPSAnZG9TZXRCaW5hcnlCaXRzZXRMZUJpbic7Cn0KCmlmICgkZW51bWVyYXRvcnMgIT09IG51bGwpIHsKZm9yZWFjaCAoJGVudW1lcmF0b3JzIGFzICRlbnVtZXJhdG9yKSB7CiR0aGlzLT57JHRoaXMtPmZuRG9TZXRCaXR9KCRlbnVtZXJhdGlvbjo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpKTsKfQp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2RlYnVnSW5mbygpIHsKJGRiZyA9IChhcnJheSkkdGhpczsKJGRiZ1siXDAiIC4gc2VsZjo6Y2xhc3MgLiAiXDBfX2VudW1lcmF0b3JzIl0gPSAkdGhpcy0+Z2V0VmFsdWVzKCk7CnJldHVybiAkZGJnOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVudW1lcmF0aW9uKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZW51bWVyYXRpb247Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZCgkZW51bWVyYXRvcik6IHZvaWQKewokdGhpcy0+eyR0aGlzLT5mbkRvU2V0Qml0fSgoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEl0ZXJhYmxlKGl0ZXJhYmxlICRlbnVtZXJhdG9ycyk6IHZvaWQKewokYml0c2V0ID0gJHRoaXMtPmJpdHNldDsKCnRyeSB7CmZvcmVhY2ggKCRlbnVtZXJhdG9ycyBhcyAkZW51bWVyYXRvcikgewokdGhpcy0+eyR0aGlzLT5mbkRvU2V0Qml0fSgoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpKTsKfQp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CgokdGhpcy0+Yml0c2V0ID0gJGJpdHNldDsKdGhyb3cgJGU7Cn0KfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZSgkZW51bWVyYXRvcik6IHZvaWQKewokdGhpcy0+eyR0aGlzLT5mbkRvVW5zZXRCaXR9KCgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCkpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXR0YWNoKCRlbnVtZXJhdG9yKTogdm9pZAp7CiR0aGlzLT5hZGQoJGVudW1lcmF0b3IpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGV0YWNoKCRlbnVtZXJhdG9yKTogdm9pZAp7CiR0aGlzLT5yZW1vdmUoJGVudW1lcmF0b3IpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlSXRlcmFibGUoaXRlcmFibGUgJGVudW1lcmF0b3JzKTogdm9pZAp7CiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwoKdHJ5IHsKZm9yZWFjaCAoJGVudW1lcmF0b3JzIGFzICRlbnVtZXJhdG9yKSB7CiR0aGlzLT57JHRoaXMtPmZuRG9VbnNldEJpdH0oKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKSk7Cn0KfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewoKJHRoaXMtPmJpdHNldCA9ICRiaXRzZXQ7CnRocm93ICRlOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VW5pb24oRW51bVNldCAkb3RoZXIpOiB2b2lkCnsKaWYgKCR0aGlzLT5lbnVtZXJhdGlvbiAhPT0gJG90aGVyLT5lbnVtZXJhdGlvbikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFxzcHJpbnRmKAonT3RoZXIgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIGVudW1lcmF0aW9uIGFzIHRoaXMgJXMnLAokdGhpcy0+ZW51bWVyYXRpb24KKSk7Cn0KCiR0aGlzLT5iaXRzZXQgPSAkdGhpcy0+Yml0c2V0IHwgJG90aGVyLT5iaXRzZXQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW50ZXJzZWN0KEVudW1TZXQgJG90aGVyKTogdm9pZAp7CmlmICgkdGhpcy0+ZW51bWVyYXRpb24gIT09ICRvdGhlci0+ZW51bWVyYXRpb24pIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihcc3ByaW50ZigKJ090aGVyIHNob3VsZCBiZSBvZiB0aGUgc2FtZSBlbnVtZXJhdGlvbiBhcyB0aGlzICVzJywKJHRoaXMtPmVudW1lcmF0aW9uCikpOwp9CgokdGhpcy0+Yml0c2V0ID0gJHRoaXMtPmJpdHNldCAmICRvdGhlci0+Yml0c2V0Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERpZmYoRW51bVNldCAkb3RoZXIpOiB2b2lkCnsKaWYgKCR0aGlzLT5lbnVtZXJhdGlvbiAhPT0gJG90aGVyLT5lbnVtZXJhdGlvbikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFxzcHJpbnRmKAonT3RoZXIgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIGVudW1lcmF0aW9uIGFzIHRoaXMgJXMnLAokdGhpcy0+ZW51bWVyYXRpb24KKSk7Cn0KCiR0aGlzLT5iaXRzZXQgPSAkdGhpcy0+Yml0c2V0ICYgfiRvdGhlci0+Yml0c2V0Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN5bURpZmYoRW51bVNldCAkb3RoZXIpOiB2b2lkCnsKaWYgKCR0aGlzLT5lbnVtZXJhdGlvbiAhPT0gJG90aGVyLT5lbnVtZXJhdGlvbikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFxzcHJpbnRmKAonT3RoZXIgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIGVudW1lcmF0aW9uIGFzIHRoaXMgJXMnLAokdGhpcy0+ZW51bWVyYXRpb24KKSk7Cn0KCiR0aGlzLT5iaXRzZXQgPSAkdGhpcy0+Yml0c2V0IF4gJG90aGVyLT5iaXRzZXQ7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRCaW5hcnlCaXRzZXRMZShzdHJpbmcgJGJpdHNldCk6IHZvaWQKewokdGhpcy0+eyR0aGlzLT5mbkRvU2V0QmluYXJ5Qml0c2V0TGV9KCRiaXRzZXQpOwp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvU2V0QmluYXJ5Qml0c2V0TGVCaW4oJGJpdHNldCk6IHZvaWQKewoKJHRoaXNCaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwoKJHNpemUgPSBcc3RybGVuKCR0aGlzQml0c2V0KTsKJHNpemVJbiA9IFxzdHJsZW4oJGJpdHNldCk7CgppZiAoJHNpemVJbiA8ICRzaXplKSB7CgokYml0c2V0IC49IFxzdHJfcmVwZWF0KCJcMCIsICRzaXplIC0gJHNpemVJbik7Cn0gZWxzZWlmICgkc2l6ZUluID4gJHNpemUpIHsKaWYgKFxsdHJpbShcc3Vic3RyKCRiaXRzZXQsICRzaXplKSwgIlwwIikgIT09ICcnKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ291dC1vZi1yYW5nZSBiaXRzIGRldGVjdGVkJyk7Cn0KJGJpdHNldCA9IFxzdWJzdHIoJGJpdHNldCwgMCwgJHNpemUpOwp9CgoKJGxhc3RCeXRlTWF4T3JkID0gJHRoaXMtPmVudW1lcmF0aW9uQ291bnQgJSA4OwppZiAoJGxhc3RCeXRlTWF4T3JkICE9PSAwKSB7CiRsYXN0Qnl0ZSA9ICRiaXRzZXRbLTFdOwokbGFzdEJ5dGVFeHBlY3RlZCA9IFxjaHIoKDEgPDwgJGxhc3RCeXRlTWF4T3JkKSAtIDEpICYgJGxhc3RCeXRlOwppZiAoJGxhc3RCeXRlICE9PSAkbGFzdEJ5dGVFeHBlY3RlZCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdvdXQtb2YtcmFuZ2UgYml0cyBkZXRlY3RlZCcpOwp9CgokdGhpcy0+Yml0c2V0ID0gXHN1YnN0cigkYml0c2V0LCAwLCAtMSkgLiAkbGFzdEJ5dGVFeHBlY3RlZDsKfQoKJHRoaXMtPmJpdHNldCA9ICRiaXRzZXQ7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9TZXRCaW5hcnlCaXRzZXRMZUludCgkYml0c2V0KTogdm9pZAp7CiRsZW4gPSBcc3RybGVuKCRiaXRzZXQpOwokaW50ID0gMDsKZm9yICgkaSA9IDA7ICRpIDwgJGxlbjsgKyskaSkgewokb3JkID0gXG9yZCgkYml0c2V0WyRpXSk7CgppZiAoJG9yZCAmJiAkaSA+IFxQSFBfSU5UX1NJWkUgLSAxKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ291dC1vZi1yYW5nZSBiaXRzIGRldGVjdGVkJyk7Cn0KCiRpbnQgfD0gJG9yZCA8PCAoOCAqICRpKTsKfQoKaWYgKCRpbnQgJiAofjAgPDwgJHRoaXMtPmVudW1lcmF0aW9uQ291bnQpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ291dC1vZi1yYW5nZSBiaXRzIGRldGVjdGVkJyk7Cn0KCiR0aGlzLT5iaXRzZXQgPSAkaW50Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJpbmFyeUJpdHNldEJlKHN0cmluZyAkYml0c2V0KTogdm9pZAp7CiR0aGlzLT57JHRoaXMtPmZuRG9TZXRCaW5hcnlCaXRzZXRMZX0oXHN0cnJldigkYml0c2V0KSk7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRCaXQoaW50ICRvcmRpbmFsLCBib29sICRiaXQpOiB2b2lkCnsKaWYgKCRvcmRpbmFsIDwgMCB8fCAkb3JkaW5hbCA+ICR0aGlzLT5lbnVtZXJhdGlvbkNvdW50KSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9yZGluYWwgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCB7JHRoaXMtPmVudW1lcmF0aW9uQ291bnR9Iik7Cn0KCmlmICgkYml0KSB7CiR0aGlzLT57JHRoaXMtPmZuRG9TZXRCaXR9KCRvcmRpbmFsKTsKfSBlbHNlIHsKJHRoaXMtPnskdGhpcy0+Zm5Eb1Vuc2V0Qml0fSgkb3JkaW5hbCk7Cn0KfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9TZXRCaXRCaW4oJG9yZGluYWwpOiB2b2lkCnsKCiR0aGlzQml0c2V0ID0gJHRoaXMtPmJpdHNldDsKCiRieXRlID0gKGludCkgKCRvcmRpbmFsIC8gOCk7CiR0aGlzQml0c2V0WyRieXRlXSA9ICR0aGlzQml0c2V0WyRieXRlXSB8IFxjaHIoMSA8PCAoJG9yZGluYWwgJSA4KSk7CgokdGhpcy0+Yml0c2V0ID0gJHRoaXNCaXRzZXQ7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvU2V0Qml0SW50KCRvcmRpbmFsKTogdm9pZAp7CgokdGhpc0JpdHNldCA9ICR0aGlzLT5iaXRzZXQ7CgokdGhpcy0+Yml0c2V0ID0gJHRoaXNCaXRzZXQgfCAoMSA8PCAkb3JkaW5hbCk7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvVW5zZXRCaXRCaW4oJG9yZGluYWwpOiB2b2lkCnsKCiR0aGlzQml0c2V0ID0gJHRoaXMtPmJpdHNldDsKCiRieXRlID0gKGludCkgKCRvcmRpbmFsIC8gOCk7CiR0aGlzQml0c2V0WyRieXRlXSA9ICR0aGlzQml0c2V0WyRieXRlXSAmIFxjaHIofigxIDw8ICgkb3JkaW5hbCAlIDgpKSk7CgokdGhpcy0+Yml0c2V0ID0gJHRoaXNCaXRzZXQ7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvVW5zZXRCaXRJbnQoJG9yZGluYWwpOiB2b2lkCnsKCiR0aGlzQml0c2V0ID0gJHRoaXMtPmJpdHNldDsKCiR0aGlzLT5iaXRzZXQgPSAkdGhpc0JpdHNldCAmIH4oMSA8PCAkb3JkaW5hbCk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdpdGgoJGVudW1lcmF0b3IpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+eyR0aGlzLT5mbkRvU2V0Qml0fSgoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpKTsKcmV0dXJuICRjbG9uZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdpdGhJdGVyYWJsZShpdGVyYWJsZSAkZW51bWVyYXRvcnMpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CmZvcmVhY2ggKCRlbnVtZXJhdG9ycyBhcyAkZW51bWVyYXRvcikgewokY2xvbmUtPnskdGhpcy0+Zm5Eb1NldEJpdH0oKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKSk7Cn0KcmV0dXJuICRjbG9uZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdpdGhvdXQoJGVudW1lcmF0b3IpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+eyR0aGlzLT5mbkRvVW5zZXRCaXR9KCgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCkpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aG91dEl0ZXJhYmxlKGl0ZXJhYmxlICRlbnVtZXJhdG9ycyk6IHNlbGYKewokY2xvbmUgPSBjbG9uZSAkdGhpczsKZm9yZWFjaCAoJGVudW1lcmF0b3JzIGFzICRlbnVtZXJhdG9yKSB7CiRjbG9uZS0+eyR0aGlzLT5mbkRvVW5zZXRCaXR9KCgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCkpOwp9CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aFVuaW9uKEVudW1TZXQgJG90aGVyKTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwokY2xvbmUtPnNldFVuaW9uKCRvdGhlcik7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pb24oRW51bVNldCAkb3RoZXIpOiBzZWxmCnsKcmV0dXJuICR0aGlzLT53aXRoVW5pb24oJG90aGVyKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoSW50ZXJzZWN0KEVudW1TZXQgJG90aGVyKTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwokY2xvbmUtPnNldEludGVyc2VjdCgkb3RoZXIpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGludGVyc2VjdChFbnVtU2V0ICRvdGhlcik6IHNlbGYKewpyZXR1cm4gJHRoaXMtPndpdGhJbnRlcnNlY3QoJG90aGVyKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoRGlmZihFbnVtU2V0ICRvdGhlcik6IHNlbGYKewokY2xvbmUgPSBjbG9uZSAkdGhpczsKJGNsb25lLT5zZXREaWZmKCRvdGhlcik7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlmZihFbnVtU2V0ICRvdGhlcik6IHNlbGYKewpyZXR1cm4gJHRoaXMtPndpdGhEaWZmKCRvdGhlcik7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aFN5bURpZmYoRW51bVNldCAkb3RoZXIpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+c2V0U3ltRGlmZigkb3RoZXIpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN5bURpZmYoRW51bVNldCAkb3RoZXIpOiBzZWxmCnsKcmV0dXJuICR0aGlzLT53aXRoU3ltRGlmZigkb3RoZXIpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aEJpbmFyeUJpdHNldExlKHN0cmluZyAkYml0c2V0KTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwokY2xvbmUtPnskdGhpcy0+Zm5Eb1NldEJpbmFyeUJpdHNldExlfSgkYml0c2V0KTsKcmV0dXJuICRjbG9uZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoQmluYXJ5Qml0c2V0QmUoc3RyaW5nICRiaXRzZXQpOiBzZWxmCnsKJGNsb25lID0gJHRoaXM7CiRjbG9uZS0+eyR0aGlzLT5mbkRvU2V0QmluYXJ5Qml0c2V0TGV9KFxzdHJyZXYoJGJpdHNldCkpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aEJpdChpbnQgJG9yZGluYWwsIGJvb2wgJGJpdCk6IHNlbGYKewokY2xvbmUgPSBjbG9uZSAkdGhpczsKJGNsb25lLT5zZXRCaXQoJG9yZGluYWwsICRiaXQpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcygkZW51bWVyYXRvcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnskdGhpcy0+Zm5Eb0dldEJpdH0oKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29udGFpbnMoJGVudW1lcmF0b3IpOiBib29sCnsKcmV0dXJuICR0aGlzLT5oYXMoJGVudW1lcmF0b3IpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpOiBJdGVyYXRvcgp7CnJldHVybiAkdGhpcy0+eyR0aGlzLT5mbkRvR2V0SXRlcmF0b3J9KCk7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9HZXRJdGVyYXRvckJpbigpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwokYnl0ZUxlbiA9IFxzdHJsZW4oJGJpdHNldCk7CmZvciAoJGJ5dGVQb3MgPSAwOyAkYnl0ZVBvcyA8ICRieXRlTGVuOyArKyRieXRlUG9zKSB7CmlmICgkYml0c2V0WyRieXRlUG9zXSA9PT0gIlwwIikgewoKY29udGludWU7Cn0KCiRvcmQgPSBcb3JkKCRiaXRzZXRbJGJ5dGVQb3NdKTsKZm9yICgkYml0UG9zID0gMDsgJGJpdFBvcyA8IDg7ICsrJGJpdFBvcykgewppZiAoJG9yZCAmICgxIDw8ICRiaXRQb3MpKSB7CiRvcmRpbmFsID0gJGJ5dGVQb3MgKiA4ICsgJGJpdFBvczsKeWllbGQgJG9yZGluYWwgPT4gKCR0aGlzLT5lbnVtZXJhdGlvbik6OmJ5T3JkaW5hbCgkb3JkaW5hbCk7Cn0KfQp9Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9HZXRJdGVyYXRvckludCgpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwokY291bnQgPSAkdGhpcy0+ZW51bWVyYXRpb25Db3VudDsKZm9yICgkb3JkaW5hbCA9IDA7ICRvcmRpbmFsIDwgJGNvdW50OyArKyRvcmRpbmFsKSB7CmlmICgkYml0c2V0ICYgKDEgPDwgJG9yZGluYWwpKSB7CnlpZWxkICRvcmRpbmFsID0+ICgkdGhpcy0+ZW51bWVyYXRpb24pOjpieU9yZGluYWwoJG9yZGluYWwpOwp9Cn0KfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAp7CnJldHVybiAkdGhpcy0+eyR0aGlzLT5mbkRvQ291bnR9KCk7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9Db3VudEJpbigpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwokY291bnQgPSAwOwokYnl0ZUxlbiA9IFxzdHJsZW4oJGJpdHNldCk7CmZvciAoJGJ5dGVQb3MgPSAwOyAkYnl0ZVBvcyA8ICRieXRlTGVuOyArKyRieXRlUG9zKSB7CmlmICgkYml0c2V0WyRieXRlUG9zXSA9PT0gIlwwIikgewoKY29udGludWU7Cn0KCiRvcmQgPSBcb3JkKCRiaXRzZXRbJGJ5dGVQb3NdKTsKaWYgKCRvcmQgJiAwYjAwMDAwMDAxKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjAwMDAwMDEwKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjAwMDAwMTAwKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjAwMDAxMDAwKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjAwMDEwMDAwKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjAwMTAwMDAwKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjAxMDAwMDAwKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjEwMDAwMDAwKSArKyRjb3VudDsKfQpyZXR1cm4gJGNvdW50Owp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvQ291bnRJbnQoKQp7CgokYml0c2V0ID0gJHRoaXMtPmJpdHNldDsKJGNvdW50ID0gMDsKCgppZiAoJGJpdHNldCA8IDApIHsKJGNvdW50ID0gMTsKJGJpdHNldCA9ICRiaXRzZXQgJiBcUEhQX0lOVF9NQVg7Cn0KCgokcGhwSW50Qml0U2l6ZSA9IFxQSFBfSU5UX1NJWkUgKiA4Owpmb3IgKCRiaXRQb3MgPSAwOyAkYml0UG9zIDwgJHBocEludEJpdFNpemU7ICRiaXRQb3MgKz0gOCkgewokYml0Q2hrID0gMHhmZiA8PCAkYml0UG9zOwokYnl0ZSA9ICRiaXRzZXQgJiAkYml0Q2hrOwppZiAoJGJ5dGUpIHsKJGJ5dGUgPSAkYnl0ZSA+PiAkYml0UG9zOwppZiAoJGJ5dGUgJiAwYjAwMDAwMDAxKSArKyRjb3VudDsKaWYgKCRieXRlICYgMGIwMDAwMDAxMCkgKyskY291bnQ7CmlmICgkYnl0ZSAmIDBiMDAwMDAxMDApICsrJGNvdW50OwppZiAoJGJ5dGUgJiAwYjAwMDAxMDAwKSArKyRjb3VudDsKaWYgKCRieXRlICYgMGIwMDAxMDAwMCkgKyskY291bnQ7CmlmICgkYnl0ZSAmIDBiMDAxMDAwMDApICsrJGNvdW50OwppZiAoJGJ5dGUgJiAwYjAxMDAwMDAwKSArKyRjb3VudDsKaWYgKCRieXRlICYgMGIxMDAwMDAwMCkgKyskY291bnQ7Cn0KCmlmICgkYml0c2V0IDw9ICRiaXRDaGspIHsKYnJlYWs7Cn0KfQoKcmV0dXJuICRjb3VudDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNFcXVhbChFbnVtU2V0ICRvdGhlcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmVudW1lcmF0aW9uID09PSAkb3RoZXItPmVudW1lcmF0aW9uCiYmICR0aGlzLT5iaXRzZXQgPT09ICRvdGhlci0+Yml0c2V0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1N1YnNldChFbnVtU2V0ICRvdGhlcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmVudW1lcmF0aW9uID09PSAkb3RoZXItPmVudW1lcmF0aW9uCiYmICgkdGhpcy0+Yml0c2V0ICYgJG90aGVyLT5iaXRzZXQpID09PSAkdGhpcy0+Yml0c2V0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1N1cGVyc2V0KEVudW1TZXQgJG90aGVyKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZW51bWVyYXRpb24gPT09ICRvdGhlci0+ZW51bWVyYXRpb24KJiYgKCR0aGlzLT5iaXRzZXQgfCAkb3RoZXItPmJpdHNldCkgPT09ICR0aGlzLT5iaXRzZXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRW1wdHkoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+Yml0c2V0ID09PSAkdGhpcy0+ZW1wdHlCaXRzZXQ7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcmRpbmFscygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+eyR0aGlzLT5mbkRvR2V0T3JkaW5hbHN9KCk7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9HZXRPcmRpbmFsc0JpbigpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0Owokb3JkaW5hbHMgPSBbXTsKJGJ5dGVMZW4gPSBcc3RybGVuKCRiaXRzZXQpOwpmb3IgKCRieXRlUG9zID0gMDsgJGJ5dGVQb3MgPCAkYnl0ZUxlbjsgKyskYnl0ZVBvcykgewppZiAoJGJpdHNldFskYnl0ZVBvc10gPT09ICJcMCIpIHsKCmNvbnRpbnVlOwp9Cgokb3JkID0gXG9yZCgkYml0c2V0WyRieXRlUG9zXSk7CmZvciAoJGJpdFBvcyA9IDA7ICRiaXRQb3MgPCA4OyArKyRiaXRQb3MpIHsKaWYgKCRvcmQgJiAoMSA8PCAkYml0UG9zKSkgewokb3JkaW5hbHNbXSA9ICRieXRlUG9zICogOCArICRiaXRQb3M7Cn0KfQp9CnJldHVybiAkb3JkaW5hbHM7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9HZXRPcmRpbmFsc0ludCgpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0Owokb3JkaW5hbHMgPSBbXTsKJGNvdW50ID0gJHRoaXMtPmVudW1lcmF0aW9uQ291bnQ7CmZvciAoJG9yZGluYWwgPSAwOyAkb3JkaW5hbCA8ICRjb3VudDsgKyskb3JkaW5hbCkgewppZiAoJGJpdHNldCAmICgxIDw8ICRvcmRpbmFsKSkgewokb3JkaW5hbHNbXSA9ICRvcmRpbmFsOwp9Cn0KcmV0dXJuICRvcmRpbmFsczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZXMoKTogYXJyYXkKewokZW51bWVyYXRpb24gPSAkdGhpcy0+ZW51bWVyYXRpb247CiR2YWx1ZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmdldE9yZGluYWxzKCkgYXMgJG9yZCkgewokdmFsdWVzW10gPSAkZW51bWVyYXRpb246OmJ5T3JkaW5hbCgkb3JkKS0+Z2V0VmFsdWUoKTsKfQpyZXR1cm4gJHZhbHVlczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lcygpOiBhcnJheQp7CiRlbnVtZXJhdGlvbiA9ICR0aGlzLT5lbnVtZXJhdGlvbjsKJG5hbWVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5nZXRPcmRpbmFscygpIGFzICRvcmQpIHsKJG5hbWVzW10gPSAkZW51bWVyYXRpb246OmJ5T3JkaW5hbCgkb3JkKS0+Z2V0TmFtZSgpOwp9CnJldHVybiAkbmFtZXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RW51bWVyYXRvcnMoKTogYXJyYXkKewokZW51bWVyYXRpb24gPSAkdGhpcy0+ZW51bWVyYXRpb247CiRlbnVtZXJhdG9ycyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+Z2V0T3JkaW5hbHMoKSBhcyAkb3JkKSB7CiRlbnVtZXJhdG9yc1tdID0gJGVudW1lcmF0aW9uOjpieU9yZGluYWwoJG9yZCk7Cn0KcmV0dXJuICRlbnVtZXJhdG9yczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCaW5hcnlCaXRzZXRMZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnskdGhpcy0+Zm5Eb0dldEJpbmFyeUJpdHNldExlfSgpOwp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvR2V0QmluYXJ5Qml0c2V0TGVCaW4oKQp7CgokYml0c2V0ID0gJHRoaXMtPmJpdHNldDsKCnJldHVybiAkYml0c2V0Owp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvR2V0QmluYXJ5Qml0c2V0TGVJbnQoKQp7CiRiaW4gPSBccGFjayhcUEhQX0lOVF9TSVpFID09PSA4ID8gJ1AnIDogJ1YnLCAkdGhpcy0+Yml0c2V0KTsKcmV0dXJuIFxzdWJzdHIoJGJpbiwgMCwgKGludClcY2VpbCgkdGhpcy0+ZW51bWVyYXRpb25Db3VudCAvIDgpKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QmluYXJ5Qml0c2V0QmUoKTogc3RyaW5nCnsKcmV0dXJuIFxzdHJyZXYoJHRoaXMtPmdldEJpbmFyeUJpdHNldExlKCkpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Qml0KGludCAkb3JkaW5hbCk6IGJvb2wKewppZiAoJG9yZGluYWwgPCAwIHx8ICRvcmRpbmFsID4gJHRoaXMtPmVudW1lcmF0aW9uQ291bnQpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT3JkaW5hbCBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIHskdGhpcy0+ZW51bWVyYXRpb25Db3VudH0iKTsKfQoKcmV0dXJuICR0aGlzLT57JHRoaXMtPmZuRG9HZXRCaXR9KCRvcmRpbmFsKTsKfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9HZXRCaXRCaW4oJG9yZGluYWwpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwoKcmV0dXJuIChcb3JkKCRiaXRzZXRbKGludCkgKCRvcmRpbmFsIC8gOCldKSAmIDEgPDwgKCRvcmRpbmFsICUgOCkpICE9PSAwOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb0dldEJpdEludCgkb3JkaW5hbCkKewoKJGJpdHNldCA9ICR0aGlzLT5iaXRzZXQ7CgpyZXR1cm4gKGJvb2wpKCRiaXRzZXQgJiAoMSA8PCAkb3JkaW5hbCkpOwp9Cn0KPD9waHAKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewppbnRlcmZhY2UgU3RyaW5nYWJsZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk7Cn0KfQoKVGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiBjb250YWluZXItaW50ZXJvcApDb3B5cmlnaHQgKGMpIDIwMTYgUEhQIEZyYW1ld29yayBJbnRlcm9wZXJhYmlsaXR5IEdyb3VwCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLApzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCkNPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgpJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgpDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKPD9waHAKCm5hbWVzcGFjZSBQc3JcQ29udGFpbmVyOwoKCgoKaW50ZXJmYWNlIENvbnRhaW5lckV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIFBzclxDb250YWluZXI7CgoKCgppbnRlcmZhY2UgQ29udGFpbmVySW50ZXJmYWNlCnsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICRpZCk7CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXMoc3RyaW5nICRpZCk7Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcQ29udGFpbmVyOwoKCgoKaW50ZXJmYWNlIE5vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlIGV4dGVuZHMgQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQoKQ29weXJpZ2h0IChjKSAyMDEyIFBIUCBGcmFtZXdvcmsgSW50ZXJvcGVyYWJpbGl0eSBHcm91cAoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSAKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyAKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIApmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKCgoKCgoKCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0TG9nZ2VyIGltcGxlbWVudHMgTG9nZ2VySW50ZXJmYWNlCnsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZW1lcmdlbmN5KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6RU1FUkdFTkNZLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbGVydCgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkFMRVJULCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNyaXRpY2FsKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6Q1JJVElDQUwsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlcnJvcigkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkVSUk9SLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YXJuaW5nKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6V0FSTklORywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm90aWNlKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6Tk9USUNFLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluZm8oJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpJTkZPLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWJ1ZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkRFQlVHLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKY2xhc3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgp7Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKCgoKY2xhc3MgTG9nTGV2ZWwKewpjb25zdCBFTUVSR0VOQ1kgPSAnZW1lcmdlbmN5JzsKY29uc3QgQUxFUlQgPSAnYWxlcnQnOwpjb25zdCBDUklUSUNBTCA9ICdjcml0aWNhbCc7CmNvbnN0IEVSUk9SID0gJ2Vycm9yJzsKY29uc3QgV0FSTklORyA9ICd3YXJuaW5nJzsKY29uc3QgTk9USUNFID0gJ25vdGljZSc7CmNvbnN0IElORk8gPSAnaW5mbyc7CmNvbnN0IERFQlVHID0gJ2RlYnVnJzsKfQo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2c7CgoKCgppbnRlcmZhY2UgTG9nZ2VyQXdhcmVJbnRlcmZhY2UKewoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldExvZ2dlcihMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlcik7Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKCgoKdHJhaXQgTG9nZ2VyQXdhcmVUcmFpdAp7CgoKCgoKcHJvdGVjdGVkICRsb2dnZXI7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2dnZXIoTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIpCnsKJHRoaXMtPmxvZ2dlciA9ICRsb2dnZXI7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2c7CgoKCgoKCgoKCgoKCgoKCgppbnRlcmZhY2UgTG9nZ2VySW50ZXJmYWNlCnsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZW1lcmdlbmN5KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWxlcnQoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNyaXRpY2FsKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVycm9yKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FybmluZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdGljZSgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5mbygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRlYnVnKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9nKCRsZXZlbCwgJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKCgoKCgoKCgp0cmFpdCBMb2dnZXJUcmFpdAp7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVtZXJnZW5jeSgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkVNRVJHRU5DWSwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWxlcnQoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpBTEVSVCwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcml0aWNhbCgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkNSSVRJQ0FMLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXJyb3IoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpFUlJPUiwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FybmluZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OldBUk5JTkcsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdGljZSgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6Ok5PVElDRSwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbmZvKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6SU5GTywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVidWcoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpERUJVRywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbG9nKCRsZXZlbCwgJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKCgoKCgoKCgpjbGFzcyBOdWxsTG9nZ2VyIGV4dGVuZHMgQWJzdHJhY3RMb2dnZXIKewoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2coJGxldmVsLCAkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7Cgp9Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nXFRlc3Q7CgoKCgoKCgoKY2xhc3MgRHVtbXlUZXN0CnsKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CnJldHVybiAnRHVtbXlUZXN0JzsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZ1xUZXN0OwoKdXNlIFBzclxMb2dcTG9nZ2VySW50ZXJmYWNlOwp1c2UgUHNyXExvZ1xMb2dMZXZlbDsKdXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgTG9nZ2VySW50ZXJmYWNlVGVzdCBleHRlbmRzIFRlc3RDYXNlCnsKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGdldExvZ2dlcigpOwoKCgoKCgoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGdldExvZ3MoKTsKCnB1YmxpYyBmdW5jdGlvbiB0ZXN0SW1wbGVtZW50cygpCnsKJHRoaXMtPmFzc2VydEluc3RhbmNlT2YoJ1BzclxMb2dcTG9nZ2VySW50ZXJmYWNlJywgJHRoaXMtPmdldExvZ2dlcigpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHRlc3RMb2dzQXRBbGxMZXZlbHMoJGxldmVsLCAkbWVzc2FnZSkKewokbG9nZ2VyID0gJHRoaXMtPmdldExvZ2dlcigpOwokbG9nZ2VyLT57JGxldmVsfSgkbWVzc2FnZSwgYXJyYXkoJ3VzZXInID0+ICdCb2InKSk7CiRsb2dnZXItPmxvZygkbGV2ZWwsICRtZXNzYWdlLCBhcnJheSgndXNlcicgPT4gJ0JvYicpKTsKCiRleHBlY3RlZCA9IGFycmF5KAokbGV2ZWwuJyBtZXNzYWdlIG9mIGxldmVsICcuJGxldmVsLicgd2l0aCBjb250ZXh0OiBCb2InLAokbGV2ZWwuJyBtZXNzYWdlIG9mIGxldmVsICcuJGxldmVsLicgd2l0aCBjb250ZXh0OiBCb2InLAopOwokdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJHRoaXMtPmdldExvZ3MoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwcm92aWRlTGV2ZWxzQW5kTWVzc2FnZXMoKQp7CnJldHVybiBhcnJheSgKTG9nTGV2ZWw6OkVNRVJHRU5DWSA9PiBhcnJheShMb2dMZXZlbDo6RU1FUkdFTkNZLCAnbWVzc2FnZSBvZiBsZXZlbCBlbWVyZ2VuY3kgd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6OkFMRVJUID0+IGFycmF5KExvZ0xldmVsOjpBTEVSVCwgJ21lc3NhZ2Ugb2YgbGV2ZWwgYWxlcnQgd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6OkNSSVRJQ0FMID0+IGFycmF5KExvZ0xldmVsOjpDUklUSUNBTCwgJ21lc3NhZ2Ugb2YgbGV2ZWwgY3JpdGljYWwgd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6OkVSUk9SID0+IGFycmF5KExvZ0xldmVsOjpFUlJPUiwgJ21lc3NhZ2Ugb2YgbGV2ZWwgZXJyb3Igd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6OldBUk5JTkcgPT4gYXJyYXkoTG9nTGV2ZWw6OldBUk5JTkcsICdtZXNzYWdlIG9mIGxldmVsIHdhcm5pbmcgd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6Ok5PVElDRSA9PiBhcnJheShMb2dMZXZlbDo6Tk9USUNFLCAnbWVzc2FnZSBvZiBsZXZlbCBub3RpY2Ugd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6OklORk8gPT4gYXJyYXkoTG9nTGV2ZWw6OklORk8sICdtZXNzYWdlIG9mIGxldmVsIGluZm8gd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6OkRFQlVHID0+IGFycmF5KExvZ0xldmVsOjpERUJVRywgJ21lc3NhZ2Ugb2YgbGV2ZWwgZGVidWcgd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHRlc3RUaHJvd3NPbkludmFsaWRMZXZlbCgpCnsKJGxvZ2dlciA9ICR0aGlzLT5nZXRMb2dnZXIoKTsKJGxvZ2dlci0+bG9nKCdpbnZhbGlkIGxldmVsJywgJ0ZvbycpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdGVzdENvbnRleHRSZXBsYWNlbWVudCgpCnsKJGxvZ2dlciA9ICR0aGlzLT5nZXRMb2dnZXIoKTsKJGxvZ2dlci0+aW5mbygne01lc3NhZ2Uge25vdGhpbmd9IHt1c2VyfSB7Zm9vLmJhcn0gYX0nLCBhcnJheSgndXNlcicgPT4gJ0JvYicsICdmb28uYmFyJyA9PiAnQmFyJykpOwoKJGV4cGVjdGVkID0gYXJyYXkoJ2luZm8ge01lc3NhZ2Uge25vdGhpbmd9IEJvYiBCYXIgYX0nKTsKJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICR0aGlzLT5nZXRMb2dzKCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdGVzdE9iamVjdENhc3RUb1N0cmluZygpCnsKaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICdjcmVhdGVQYXJ0aWFsTW9jaycpKSB7CiRkdW1teSA9ICR0aGlzLT5jcmVhdGVQYXJ0aWFsTW9jaygnUHNyXExvZ1xUZXN0XER1bW15VGVzdCcsIGFycmF5KCdfX3RvU3RyaW5nJykpOwp9IGVsc2UgewokZHVtbXkgPSAkdGhpcy0+Z2V0TW9jaygnUHNyXExvZ1xUZXN0XER1bW15VGVzdCcsIGFycmF5KCdfX3RvU3RyaW5nJykpOwp9CiRkdW1teS0+ZXhwZWN0cygkdGhpcy0+b25jZSgpKQotPm1ldGhvZCgnX190b1N0cmluZycpCi0+d2lsbCgkdGhpcy0+cmV0dXJuVmFsdWUoJ0RVTU1ZJykpOwoKJHRoaXMtPmdldExvZ2dlcigpLT53YXJuaW5nKCRkdW1teSk7CgokZXhwZWN0ZWQgPSBhcnJheSgnd2FybmluZyBEVU1NWScpOwokdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJHRoaXMtPmdldExvZ3MoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0ZXN0Q29udGV4dENhbkNvbnRhaW5Bbnl0aGluZygpCnsKJGNsb3NlZCA9IGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAncicpOwpmY2xvc2UoJGNsb3NlZCk7CgokY29udGV4dCA9IGFycmF5KAonYm9vbCcgPT4gdHJ1ZSwKJ251bGwnID0+IG51bGwsCidzdHJpbmcnID0+ICdGb28nLAonaW50JyA9PiAwLAonZmxvYXQnID0+IDAuNSwKJ25lc3RlZCcgPT4gYXJyYXkoJ3dpdGggb2JqZWN0JyA9PiBuZXcgRHVtbXlUZXN0KSwKJ29iamVjdCcgPT4gbmV3IFxEYXRlVGltZSwKJ3Jlc291cmNlJyA9PiBmb3BlbigncGhwOi8vbWVtb3J5JywgJ3InKSwKJ2Nsb3NlZCcgPT4gJGNsb3NlZCwKKTsKCiR0aGlzLT5nZXRMb2dnZXIoKS0+d2FybmluZygnQ3JhenkgY29udGV4dCBkYXRhJywgJGNvbnRleHQpOwoKJGV4cGVjdGVkID0gYXJyYXkoJ3dhcm5pbmcgQ3JhenkgY29udGV4dCBkYXRhJyk7CiR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkdGhpcy0+Z2V0TG9ncygpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RDb250ZXh0RXhjZXB0aW9uS2V5Q2FuQmVFeGNlcHRpb25Pck90aGVyVmFsdWVzKCkKewokbG9nZ2VyID0gJHRoaXMtPmdldExvZ2dlcigpOwokbG9nZ2VyLT53YXJuaW5nKCdSYW5kb20gbWVzc2FnZScsIGFycmF5KCdleGNlcHRpb24nID0+ICdvb3BzJykpOwokbG9nZ2VyLT5jcml0aWNhbCgnVW5jYXVnaHQgRXhjZXB0aW9uIScsIGFycmF5KCdleGNlcHRpb24nID0+IG5ldyBcTG9naWNFeGNlcHRpb24oJ0ZhaWwnKSkpOwoKJGV4cGVjdGVkID0gYXJyYXkoCid3YXJuaW5nIFJhbmRvbSBtZXNzYWdlJywKJ2NyaXRpY2FsIFVuY2F1Z2h0IEV4Y2VwdGlvbiEnCik7CiR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkdGhpcy0+Z2V0TG9ncygpKTsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZ1xUZXN0OwoKdXNlIFBzclxMb2dcQWJzdHJhY3RMb2dnZXI7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFRlc3RMb2dnZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ2dlcgp7CgoKCnB1YmxpYyAkcmVjb3JkcyA9IFtdOwoKcHVibGljICRyZWNvcmRzQnlMZXZlbCA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGxvZygkbGV2ZWwsICRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKQp7CiRyZWNvcmQgPSBbCidsZXZlbCcgPT4gJGxldmVsLAonbWVzc2FnZScgPT4gJG1lc3NhZ2UsCidjb250ZXh0JyA9PiAkY29udGV4dCwKXTsKCiR0aGlzLT5yZWNvcmRzQnlMZXZlbFskcmVjb3JkWydsZXZlbCddXVtdID0gJHJlY29yZDsKJHRoaXMtPnJlY29yZHNbXSA9ICRyZWNvcmQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYXNSZWNvcmRzKCRsZXZlbCkKewpyZXR1cm4gaXNzZXQoJHRoaXMtPnJlY29yZHNCeUxldmVsWyRsZXZlbF0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzUmVjb3JkKCRyZWNvcmQsICRsZXZlbCkKewppZiAoaXNfc3RyaW5nKCRyZWNvcmQpKSB7CiRyZWNvcmQgPSBbJ21lc3NhZ2UnID0+ICRyZWNvcmRdOwp9CnJldHVybiAkdGhpcy0+aGFzUmVjb3JkVGhhdFBhc3NlcyhmdW5jdGlvbiAoJHJlYykgdXNlICgkcmVjb3JkKSB7CmlmICgkcmVjWydtZXNzYWdlJ10gIT09ICRyZWNvcmRbJ21lc3NhZ2UnXSkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKGlzc2V0KCRyZWNvcmRbJ2NvbnRleHQnXSkgJiYgJHJlY1snY29udGV4dCddICE9PSAkcmVjb3JkWydjb250ZXh0J10pIHsKcmV0dXJuIGZhbHNlOwp9CnJldHVybiB0cnVlOwp9LCAkbGV2ZWwpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzUmVjb3JkVGhhdENvbnRhaW5zKCRtZXNzYWdlLCAkbGV2ZWwpCnsKcmV0dXJuICR0aGlzLT5oYXNSZWNvcmRUaGF0UGFzc2VzKGZ1bmN0aW9uICgkcmVjKSB1c2UgKCRtZXNzYWdlKSB7CnJldHVybiBzdHJwb3MoJHJlY1snbWVzc2FnZSddLCAkbWVzc2FnZSkgIT09IGZhbHNlOwp9LCAkbGV2ZWwpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzUmVjb3JkVGhhdE1hdGNoZXMoJHJlZ2V4LCAkbGV2ZWwpCnsKcmV0dXJuICR0aGlzLT5oYXNSZWNvcmRUaGF0UGFzc2VzKGZ1bmN0aW9uICgkcmVjKSB1c2UgKCRyZWdleCkgewpyZXR1cm4gcHJlZ19tYXRjaCgkcmVnZXgsICRyZWNbJ21lc3NhZ2UnXSkgPiAwOwp9LCAkbGV2ZWwpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzUmVjb3JkVGhhdFBhc3NlcyhjYWxsYWJsZSAkcHJlZGljYXRlLCAkbGV2ZWwpCnsKaWYgKCFpc3NldCgkdGhpcy0+cmVjb3Jkc0J5TGV2ZWxbJGxldmVsXSkpIHsKcmV0dXJuIGZhbHNlOwp9CmZvcmVhY2ggKCR0aGlzLT5yZWNvcmRzQnlMZXZlbFskbGV2ZWxdIGFzICRpID0+ICRyZWMpIHsKaWYgKGNhbGxfdXNlcl9mdW5jKCRwcmVkaWNhdGUsICRyZWMsICRpKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CnJldHVybiBmYWxzZTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fY2FsbCgkbWV0aG9kLCAkYXJncykKewppZiAocHJlZ19tYXRjaCgnLyguKikoRGVidWd8SW5mb3xOb3RpY2V8V2FybmluZ3xFcnJvcnxDcml0aWNhbHxBbGVydHxFbWVyZ2VuY3kpKC4qKS8nLCAkbWV0aG9kLCAkbWF0Y2hlcykgPiAwKSB7CiRnZW5lcmljTWV0aG9kID0gJG1hdGNoZXNbMV0gLiAoJ1JlY29yZHMnICE9PSAkbWF0Y2hlc1szXSA/ICdSZWNvcmQnIDogJycpIC4gJG1hdGNoZXNbM107CiRsZXZlbCA9IHN0cnRvbG93ZXIoJG1hdGNoZXNbMl0pOwppZiAobWV0aG9kX2V4aXN0cygkdGhpcywgJGdlbmVyaWNNZXRob2QpKSB7CiRhcmdzW10gPSAkbGV2ZWw7CnJldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheShbJHRoaXMsICRnZW5lcmljTWV0aG9kXSwgJGFyZ3MpOwp9Cn0KdGhyb3cgbmV3IFxCYWRNZXRob2RDYWxsRXhjZXB0aW9uKCdDYWxsIHRvIHVuZGVmaW5lZCBtZXRob2QgJyAuIGdldF9jbGFzcygkdGhpcykgLiAnOjonIC4gJG1ldGhvZCAuICcoKScpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKQp7CiR0aGlzLT5yZWNvcmRzID0gW107CiR0aGlzLT5yZWNvcmRzQnlMZXZlbCA9IFtdOwp9Cn0KClRoZSBNSVQgTGljZW5zZSAoTUlUKQoKQ29weXJpZ2h0IChjKSAyMDEyIEphbiBTb3JnYWxsYSwgQ2hyaXN0aWFuIEzDvGNrLCBDZWVzLUphbiBLaWV3aWV0LCBDaHJpcyBCb2RlbgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24Kb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dApyZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlClNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCmNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQppbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELApFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwpGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCjw/cGhwCgpuYW1lc3BhY2UgUmVhY3RcUHJvbWlzZTsKCgoKCmZpbmFsIGNsYXNzIERlZmVycmVkCnsKCgoKcHJpdmF0ZSAkcHJvbWlzZTsKCgpwcml2YXRlICRyZXNvbHZlQ2FsbGJhY2s7CgoKcHJpdmF0ZSAkcmVqZWN0Q2FsbGJhY2s7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP2NhbGxhYmxlICRjYW5jZWxsZXIgPSBudWxsKQp7CiR0aGlzLT5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKCRyZXNvbHZlLCAkcmVqZWN0KTogdm9pZCB7CiR0aGlzLT5yZXNvbHZlQ2FsbGJhY2sgPSAkcmVzb2x2ZTsKJHRoaXMtPnJlamVjdENhbGxiYWNrID0gJHJlamVjdDsKfSwgJGNhbmNlbGxlcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9taXNlKCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnByb21pc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlKCR2YWx1ZSk6IHZvaWQKewooJHRoaXMtPnJlc29sdmVDYWxsYmFjaykoJHZhbHVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlamVjdChcVGhyb3dhYmxlICRyZWFzb24pOiB2b2lkCnsKKCR0aGlzLT5yZWplY3RDYWxsYmFjaykoJHJlYXNvbik7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2VcRXhjZXB0aW9uOwoKCgoKCgoKCmNsYXNzIENvbXBvc2l0ZUV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KewoKcHJpdmF0ZSAkdGhyb3dhYmxlczsKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHRocm93YWJsZXMsIHN0cmluZyAkbWVzc2FnZSA9ICcnLCBpbnQgJGNvZGUgPSAwLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlLCAkcHJldmlvdXMpOwoKJHRoaXMtPnRocm93YWJsZXMgPSAkdGhyb3dhYmxlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRocm93YWJsZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnRocm93YWJsZXM7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2VcRXhjZXB0aW9uOwoKY2xhc3MgTGVuZ3RoRXhjZXB0aW9uIGV4dGVuZHMgXExlbmd0aEV4Y2VwdGlvbgp7Cn0KPD9waHAKCm5hbWVzcGFjZSBSZWFjdFxQcm9taXNlXEludGVybmFsOwoKCgoKZmluYWwgY2xhc3MgQ2FuY2VsbGF0aW9uUXVldWUKewoKcHJpdmF0ZSAkc3RhcnRlZCA9IGZhbHNlOwoKCnByaXZhdGUgJHF1ZXVlID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19pbnZva2UoKTogdm9pZAp7CmlmICgkdGhpcy0+c3RhcnRlZCkgewpyZXR1cm47Cn0KCiR0aGlzLT5zdGFydGVkID0gdHJ1ZTsKJHRoaXMtPmRyYWluKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbnF1ZXVlKCRjYW5jZWxsYWJsZSk6IHZvaWQKewppZiAoIVxpc19vYmplY3QoJGNhbmNlbGxhYmxlKSB8fCAhXG1ldGhvZF9leGlzdHMoJGNhbmNlbGxhYmxlLCAndGhlbicpIHx8ICFcbWV0aG9kX2V4aXN0cygkY2FuY2VsbGFibGUsICdjYW5jZWwnKSkgewpyZXR1cm47Cn0KCiRsZW5ndGggPSBcYXJyYXlfcHVzaCgkdGhpcy0+cXVldWUsICRjYW5jZWxsYWJsZSk7CgppZiAoJHRoaXMtPnN0YXJ0ZWQgJiYgMSA9PT0gJGxlbmd0aCkgewokdGhpcy0+ZHJhaW4oKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRyYWluKCk6IHZvaWQKewpmb3IgKCRpID0gXGtleSgkdGhpcy0+cXVldWUpOyBpc3NldCgkdGhpcy0+cXVldWVbJGldKTsgJGkrKykgewokY2FuY2VsbGFibGUgPSAkdGhpcy0+cXVldWVbJGldOwphc3NlcnQoXG1ldGhvZF9leGlzdHMoJGNhbmNlbGxhYmxlLCAnY2FuY2VsJykpOwoKJGV4Y2VwdGlvbiA9IG51bGw7Cgp0cnkgewokY2FuY2VsbGFibGUtPmNhbmNlbCgpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRleGNlcHRpb24pIHsKfQoKdW5zZXQoJHRoaXMtPnF1ZXVlWyRpXSk7CgppZiAoJGV4Y2VwdGlvbikgewp0aHJvdyAkZXhjZXB0aW9uOwp9Cn0KCiR0aGlzLT5xdWV1ZSA9IFtdOwp9Cn0KPD9waHAKCm5hbWVzcGFjZSBSZWFjdFxQcm9taXNlXEludGVybmFsOwoKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIGZ1bmN0aW9uIFJlYWN0XFByb21pc2VccmVzb2x2ZTsKCgoKCgoKCmZpbmFsIGNsYXNzIEZ1bGZpbGxlZFByb21pc2UgaW1wbGVtZW50cyBQcm9taXNlSW50ZXJmYWNlCnsKCnByaXZhdGUgJHZhbHVlOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmFsdWUgPSBudWxsKQp7CmlmICgkdmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdZb3UgY2Fubm90IGNyZWF0ZSBSZWFjdFxQcm9taXNlXEZ1bGZpbGxlZFByb21pc2Ugd2l0aCBhIHByb21pc2UuIFVzZSBSZWFjdFxQcm9taXNlXHJlc29sdmUoJHByb21pc2VPclZhbHVlKSBpbnN0ZWFkLicpOwp9CgokdGhpcy0+dmFsdWUgPSAkdmFsdWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRoZW4oP2NhbGxhYmxlICRvbkZ1bGZpbGxlZCA9IG51bGwsID9jYWxsYWJsZSAkb25SZWplY3RlZCA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKG51bGwgPT09ICRvbkZ1bGZpbGxlZCkgewpyZXR1cm4gJHRoaXM7Cn0KCnRyeSB7CgoKCiRyZXN1bHQgPSAkb25GdWxmaWxsZWQoJHRoaXMtPnZhbHVlKTsKcmV0dXJuIHJlc29sdmUoJHJlc3VsdCk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGV4Y2VwdGlvbikgewpyZXR1cm4gbmV3IFJlamVjdGVkUHJvbWlzZSgkZXhjZXB0aW9uKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gY2F0Y2goY2FsbGFibGUgJG9uUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZmluYWxseShjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+dGhlbihmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlIHsKcmV0dXJuIHJlc29sdmUoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCgpKS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCR2YWx1ZSkgewpyZXR1cm4gJHZhbHVlOwp9KTsKfSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjYW5jZWwoKTogdm9pZAp7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gb3RoZXJ3aXNlKGNhbGxhYmxlICRvblJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+Y2F0Y2goJG9uUmVqZWN0ZWQpOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGFsd2F5cyhjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+ZmluYWxseSgkb25GdWxmaWxsZWRPclJlamVjdGVkKTsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUmVhY3RcUHJvbWlzZVxJbnRlcm5hbDsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBmdW5jdGlvbiBSZWFjdFxQcm9taXNlXF9jaGVja1R5cGVoaW50Owp1c2UgZnVuY3Rpb24gUmVhY3RcUHJvbWlzZVxyZXNvbHZlOwp1c2UgZnVuY3Rpb24gUmVhY3RcUHJvbWlzZVxzZXRfcmVqZWN0aW9uX2hhbmRsZXI7CgoKCgoKCmZpbmFsIGNsYXNzIFJlamVjdGVkUHJvbWlzZSBpbXBsZW1lbnRzIFByb21pc2VJbnRlcmZhY2UKewoKcHJpdmF0ZSAkcmVhc29uOwoKCnByaXZhdGUgJGhhbmRsZWQgPSBmYWxzZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcVGhyb3dhYmxlICRyZWFzb24pCnsKJHRoaXMtPnJlYXNvbiA9ICRyZWFzb247Cn0KCgpwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpCnsKaWYgKCR0aGlzLT5oYW5kbGVkKSB7CnJldHVybjsKfQoKJGhhbmRsZXIgPSBzZXRfcmVqZWN0aW9uX2hhbmRsZXIobnVsbCk7CmlmICgkaGFuZGxlciA9PT0gbnVsbCkgewokbWVzc2FnZSA9ICdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2l0aCAnIC4gJHRoaXMtPnJlYXNvbjsKClxlcnJvcl9sb2coJG1lc3NhZ2UpOwpyZXR1cm47Cn0KCnRyeSB7CiRoYW5kbGVyKCR0aGlzLT5yZWFzb24pOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7ClxwcmVnX21hdGNoKCcvXihbXjpcc10rKykoLiorKSQvc20nLCAoc3RyaW5nKSAkZSwgJG1hdGNoKTsKXGFzc2VydChpc3NldCgkbWF0Y2hbMV0sICRtYXRjaFsyXSkpOwokbWVzc2FnZSA9ICdGYXRhbCBlcnJvcjogVW5jYXVnaHQgJyAuICRtYXRjaFsxXSAuICcgZnJvbSB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gaGFuZGxlcicgLiAkbWF0Y2hbMl07CgpcZXJyb3JfbG9nKCRtZXNzYWdlKTsKZXhpdCgyNTUpOwp9Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0aGVuKD9jYWxsYWJsZSAkb25GdWxmaWxsZWQgPSBudWxsLCA/Y2FsbGFibGUgJG9uUmVqZWN0ZWQgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmIChudWxsID09PSAkb25SZWplY3RlZCkgewpyZXR1cm4gJHRoaXM7Cn0KCiR0aGlzLT5oYW5kbGVkID0gdHJ1ZTsKCnRyeSB7CnJldHVybiByZXNvbHZlKCRvblJlamVjdGVkKCR0aGlzLT5yZWFzb24pKTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZXhjZXB0aW9uKSB7CnJldHVybiBuZXcgUmVqZWN0ZWRQcm9taXNlKCRleGNlcHRpb24pOwp9Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjYXRjaChjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoIV9jaGVja1R5cGVoaW50KCRvblJlamVjdGVkLCAkdGhpcy0+cmVhc29uKSkgewpyZXR1cm4gJHRoaXM7Cn0KCgoKCnJldHVybiAkdGhpcy0+dGhlbihudWxsLCAkb25SZWplY3RlZCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBmaW5hbGx5KGNhbGxhYmxlICRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT50aGVuKG51bGwsIGZ1bmN0aW9uIChcVGhyb3dhYmxlICRyZWFzb24pIHVzZSAoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UgewpyZXR1cm4gcmVzb2x2ZSgkb25GdWxmaWxsZWRPclJlamVjdGVkKCkpLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJHJlYXNvbik6IFByb21pc2VJbnRlcmZhY2UgewpyZXR1cm4gbmV3IFJlamVjdGVkUHJvbWlzZSgkcmVhc29uKTsKfSk7Cn0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2FuY2VsKCk6IHZvaWQKewokdGhpcy0+aGFuZGxlZCA9IHRydWU7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gb3RoZXJ3aXNlKGNhbGxhYmxlICRvblJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+Y2F0Y2goJG9uUmVqZWN0ZWQpOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGFsd2F5cyhjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+ZmluYWxseSgkb25GdWxmaWxsZWRPclJlamVjdGVkKTsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUmVhY3RcUHJvbWlzZTsKCnVzZSBSZWFjdFxQcm9taXNlXEludGVybmFsXFJlamVjdGVkUHJvbWlzZTsKCgoKCgpmaW5hbCBjbGFzcyBQcm9taXNlIGltcGxlbWVudHMgUHJvbWlzZUludGVyZmFjZQp7Cgpwcml2YXRlICRjYW5jZWxsZXI7CgoKcHJpdmF0ZSAkcmVzdWx0OwoKCnByaXZhdGUgJGhhbmRsZXJzID0gW107CgoKcHJpdmF0ZSAkcmVxdWlyZWRDYW5jZWxSZXF1ZXN0cyA9IDA7CgoKcHJpdmF0ZSAkY2FuY2VsbGVkID0gZmFsc2U7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGNhbGxhYmxlICRyZXNvbHZlciwgP2NhbGxhYmxlICRjYW5jZWxsZXIgPSBudWxsKQp7CiR0aGlzLT5jYW5jZWxsZXIgPSAkY2FuY2VsbGVyOwoKCgoKJGNiID0gJHJlc29sdmVyOwokcmVzb2x2ZXIgPSAkY2FuY2VsbGVyID0gbnVsbDsKJHRoaXMtPmNhbGwoJGNiKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRoZW4oP2NhbGxhYmxlICRvbkZ1bGZpbGxlZCA9IG51bGwsID9jYWxsYWJsZSAkb25SZWplY3RlZCA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKG51bGwgIT09ICR0aGlzLT5yZXN1bHQpIHsKcmV0dXJuICR0aGlzLT5yZXN1bHQtPnRoZW4oJG9uRnVsZmlsbGVkLCAkb25SZWplY3RlZCk7Cn0KCmlmIChudWxsID09PSAkdGhpcy0+Y2FuY2VsbGVyKSB7CnJldHVybiBuZXcgc3RhdGljKCR0aGlzLT5yZXNvbHZlcigkb25GdWxmaWxsZWQsICRvblJlamVjdGVkKSk7Cn0KCgoKCgoKJHBhcmVudCA9ICR0aGlzOworKyRwYXJlbnQtPnJlcXVpcmVkQ2FuY2VsUmVxdWVzdHM7CgpyZXR1cm4gbmV3IHN0YXRpYygKJHRoaXMtPnJlc29sdmVyKCRvbkZ1bGZpbGxlZCwgJG9uUmVqZWN0ZWQpLApzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgmJHBhcmVudCk6IHZvaWQgewphc3NlcnQoJHBhcmVudCBpbnN0YW5jZW9mIHNlbGYpOwotLSRwYXJlbnQtPnJlcXVpcmVkQ2FuY2VsUmVxdWVzdHM7CgppZiAoJHBhcmVudC0+cmVxdWlyZWRDYW5jZWxSZXF1ZXN0cyA8PSAwKSB7CiRwYXJlbnQtPmNhbmNlbCgpOwp9CgokcGFyZW50ID0gbnVsbDsKfQopOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2F0Y2goY2FsbGFibGUgJG9uUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT50aGVuKG51bGwsIHN0YXRpYyBmdW5jdGlvbiAoXFRocm93YWJsZSAkcmVhc29uKSB1c2UgKCRvblJlamVjdGVkKSB7CmlmICghX2NoZWNrVHlwZWhpbnQoJG9uUmVqZWN0ZWQsICRyZWFzb24pKSB7CnJldHVybiBuZXcgUmVqZWN0ZWRQcm9taXNlKCRyZWFzb24pOwp9CgoKCgpyZXR1cm4gJG9uUmVqZWN0ZWQoJHJlYXNvbik7Cn0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gZmluYWxseShjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZSB7CnJldHVybiByZXNvbHZlKCRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQoKSktPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkdmFsdWUpIHsKcmV0dXJuICR2YWx1ZTsKfSk7Cn0sIHN0YXRpYyBmdW5jdGlvbiAoXFRocm93YWJsZSAkcmVhc29uKSB1c2UgKCRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlIHsKcmV0dXJuIHJlc29sdmUoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCgpKS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCRyZWFzb24pOiBSZWplY3RlZFByb21pc2UgewpyZXR1cm4gbmV3IFJlamVjdGVkUHJvbWlzZSgkcmVhc29uKTsKfSk7Cn0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2FuY2VsKCk6IHZvaWQKewokdGhpcy0+Y2FuY2VsbGVkID0gdHJ1ZTsKJGNhbmNlbGxlciA9ICR0aGlzLT5jYW5jZWxsZXI7CiR0aGlzLT5jYW5jZWxsZXIgPSBudWxsOwoKJHBhcmVudENhbmNlbGxlciA9IG51bGw7CgppZiAobnVsbCAhPT0gJHRoaXMtPnJlc3VsdCkgewoKaWYgKCR0aGlzLT5yZXN1bHQgaW5zdGFuY2VvZiBSZWplY3RlZFByb21pc2UpIHsKJHRoaXMtPnJlc3VsdC0+Y2FuY2VsKCk7Cn0KCgoKJHJvb3QgPSAkdGhpcy0+dW53cmFwKCR0aGlzLT5yZXN1bHQpOwoKCgppZiAoISRyb290IGluc3RhbmNlb2Ygc2VsZiB8fCBudWxsICE9PSAkcm9vdC0+cmVzdWx0KSB7CnJldHVybjsKfQoKJHJvb3QtPnJlcXVpcmVkQ2FuY2VsUmVxdWVzdHMtLTsKCmlmICgkcm9vdC0+cmVxdWlyZWRDYW5jZWxSZXF1ZXN0cyA8PSAwKSB7CiRwYXJlbnRDYW5jZWxsZXIgPSBbJHJvb3QsICdjYW5jZWwnXTsKfQp9CgppZiAobnVsbCAhPT0gJGNhbmNlbGxlcikgewokdGhpcy0+Y2FsbCgkY2FuY2VsbGVyKTsKfQoKCmlmICgkcGFyZW50Q2FuY2VsbGVyKSB7CiRwYXJlbnRDYW5jZWxsZXIoKTsKfQp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIG90aGVyd2lzZShjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmNhdGNoKCRvblJlamVjdGVkKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbHdheXMoY2FsbGFibGUgJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmZpbmFsbHkoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcmVzb2x2ZXIoP2NhbGxhYmxlICRvbkZ1bGZpbGxlZCA9IG51bGwsID9jYWxsYWJsZSAkb25SZWplY3RlZCA9IG51bGwpOiBjYWxsYWJsZQp7CnJldHVybiBmdW5jdGlvbiAoY2FsbGFibGUgJHJlc29sdmUsIGNhbGxhYmxlICRyZWplY3QpIHVzZSAoJG9uRnVsZmlsbGVkLCAkb25SZWplY3RlZCk6IHZvaWQgewokdGhpcy0+aGFuZGxlcnNbXSA9IHN0YXRpYyBmdW5jdGlvbiAoUHJvbWlzZUludGVyZmFjZSAkcHJvbWlzZSkgdXNlICgkb25GdWxmaWxsZWQsICRvblJlamVjdGVkLCAkcmVzb2x2ZSwgJHJlamVjdCk6IHZvaWQgewokcHJvbWlzZSA9ICRwcm9taXNlLT50aGVuKCRvbkZ1bGZpbGxlZCwgJG9uUmVqZWN0ZWQpOwoKaWYgKCRwcm9taXNlIGluc3RhbmNlb2Ygc2VsZiAmJiAkcHJvbWlzZS0+cmVzdWx0ID09PSBudWxsKSB7CiRwcm9taXNlLT5oYW5kbGVyc1tdID0gc3RhdGljIGZ1bmN0aW9uIChQcm9taXNlSW50ZXJmYWNlICRwcm9taXNlKSB1c2UgKCRyZXNvbHZlLCAkcmVqZWN0KTogdm9pZCB7CiRwcm9taXNlLT50aGVuKCRyZXNvbHZlLCAkcmVqZWN0KTsKfTsKfSBlbHNlIHsKJHByb21pc2UtPnRoZW4oJHJlc29sdmUsICRyZWplY3QpOwp9Cn07Cn07Cn0KCnByaXZhdGUgZnVuY3Rpb24gcmVqZWN0KFxUaHJvd2FibGUgJHJlYXNvbik6IHZvaWQKewppZiAobnVsbCAhPT0gJHRoaXMtPnJlc3VsdCkgewpyZXR1cm47Cn0KCiR0aGlzLT5zZXR0bGUocmVqZWN0KCRyZWFzb24pKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzZXR0bGUoUHJvbWlzZUludGVyZmFjZSAkcmVzdWx0KTogdm9pZAp7CiRyZXN1bHQgPSAkdGhpcy0+dW53cmFwKCRyZXN1bHQpOwoKaWYgKCRyZXN1bHQgPT09ICR0aGlzKSB7CiRyZXN1bHQgPSBuZXcgUmVqZWN0ZWRQcm9taXNlKApuZXcgXExvZ2ljRXhjZXB0aW9uKCdDYW5ub3QgcmVzb2x2ZSBhIHByb21pc2Ugd2l0aCBpdHNlbGYuJykKKTsKfQoKaWYgKCRyZXN1bHQgaW5zdGFuY2VvZiBzZWxmKSB7CiRyZXN1bHQtPnJlcXVpcmVkQ2FuY2VsUmVxdWVzdHMrKzsKfSBlbHNlIHsKCiR0aGlzLT5jYW5jZWxsZXIgPSBudWxsOwp9CgokaGFuZGxlcnMgPSAkdGhpcy0+aGFuZGxlcnM7CgokdGhpcy0+aGFuZGxlcnMgPSBbXTsKJHRoaXMtPnJlc3VsdCA9ICRyZXN1bHQ7Cgpmb3JlYWNoICgkaGFuZGxlcnMgYXMgJGhhbmRsZXIpIHsKJGhhbmRsZXIoJHJlc3VsdCk7Cn0KCgppZiAoJHRoaXMtPmNhbmNlbGxlZCAmJiAkcmVzdWx0IGluc3RhbmNlb2YgUmVqZWN0ZWRQcm9taXNlKSB7CiRyZXN1bHQtPmNhbmNlbCgpOwp9Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHVud3JhcChQcm9taXNlSW50ZXJmYWNlICRwcm9taXNlKTogUHJvbWlzZUludGVyZmFjZQp7CndoaWxlICgkcHJvbWlzZSBpbnN0YW5jZW9mIHNlbGYgJiYgbnVsbCAhPT0gJHByb21pc2UtPnJlc3VsdCkgewoKJHByb21pc2UgPSAkcHJvbWlzZS0+cmVzdWx0Owp9CgpyZXR1cm4gJHByb21pc2U7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2FsbChjYWxsYWJsZSAkY2IpOiB2b2lkCnsKCgokY2FsbGJhY2sgPSAkY2I7CiRjYiA9IG51bGw7CgoKCgoKCmlmIChcaXNfYXJyYXkoJGNhbGxiYWNrKSkgewokcmVmID0gbmV3IFxSZWZsZWN0aW9uTWV0aG9kKCRjYWxsYmFja1swXSwgJGNhbGxiYWNrWzFdKTsKfSBlbHNlaWYgKFxpc19vYmplY3QoJGNhbGxiYWNrKSAmJiAhJGNhbGxiYWNrIGluc3RhbmNlb2YgXENsb3N1cmUpIHsKJHJlZiA9IG5ldyBcUmVmbGVjdGlvbk1ldGhvZCgkY2FsbGJhY2ssICdfX2ludm9rZScpOwp9IGVsc2Ugewphc3NlcnQoJGNhbGxiYWNrIGluc3RhbmNlb2YgXENsb3N1cmUgfHwgXGlzX3N0cmluZygkY2FsbGJhY2spKTsKJHJlZiA9IG5ldyBcUmVmbGVjdGlvbkZ1bmN0aW9uKCRjYWxsYmFjayk7Cn0KJGFyZ3MgPSAkcmVmLT5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKTsKCnRyeSB7CmlmICgkYXJncyA9PT0gMCkgewokY2FsbGJhY2soKTsKfSBlbHNlIHsKCgoKCgoKCgokdGFyZ2V0ID0mICR0aGlzOwoKJGNhbGxiYWNrKApzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgmJHRhcmdldCk6IHZvaWQgewppZiAoJHRhcmdldCAhPT0gbnVsbCkgewokdGFyZ2V0LT5zZXR0bGUocmVzb2x2ZSgkdmFsdWUpKTsKJHRhcmdldCA9IG51bGw7Cn0KfSwKc3RhdGljIGZ1bmN0aW9uIChcVGhyb3dhYmxlICRyZWFzb24pIHVzZSAoJiR0YXJnZXQpOiB2b2lkIHsKaWYgKCR0YXJnZXQgIT09IG51bGwpIHsKJHRhcmdldC0+cmVqZWN0KCRyZWFzb24pOwokdGFyZ2V0ID0gbnVsbDsKfQp9Cik7Cn0KfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewokdGFyZ2V0ID0gbnVsbDsKJHRoaXMtPnJlamVjdCgkZSk7Cn0KfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUmVhY3RcUHJvbWlzZTsKCgoKCmludGVyZmFjZSBQcm9taXNlSW50ZXJmYWNlCnsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRoZW4oP2NhbGxhYmxlICRvbkZ1bGZpbGxlZCA9IG51bGwsID9jYWxsYWJsZSAkb25SZWplY3RlZCA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNhdGNoKGNhbGxhYmxlICRvblJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5hbGx5KGNhbGxhYmxlICRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNhbmNlbCgpOiB2b2lkOwoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gb3RoZXJ3aXNlKGNhbGxhYmxlICRvblJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbHdheXMoY2FsbGFibGUgJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2U7Cn0KPD9waHAKCm5hbWVzcGFjZSBSZWFjdFxQcm9taXNlOwoKdXNlIFJlYWN0XFByb21pc2VcRXhjZXB0aW9uXENvbXBvc2l0ZUV4Y2VwdGlvbjsKdXNlIFJlYWN0XFByb21pc2VcSW50ZXJuYWxcRnVsZmlsbGVkUHJvbWlzZTsKdXNlIFJlYWN0XFByb21pc2VcSW50ZXJuYWxcUmVqZWN0ZWRQcm9taXNlOwoKCgoKCgoKCgoKCgoKCgoKZnVuY3Rpb24gcmVzb2x2ZSgkcHJvbWlzZU9yVmFsdWUpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCRwcm9taXNlT3JWYWx1ZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKcmV0dXJuICRwcm9taXNlT3JWYWx1ZTsKfQoKaWYgKFxpc19vYmplY3QoJHByb21pc2VPclZhbHVlKSAmJiBcbWV0aG9kX2V4aXN0cygkcHJvbWlzZU9yVmFsdWUsICd0aGVuJykpIHsKJGNhbmNlbGxlciA9IG51bGw7CgppZiAoXG1ldGhvZF9leGlzdHMoJHByb21pc2VPclZhbHVlLCAnY2FuY2VsJykpIHsKJGNhbmNlbGxlciA9IFskcHJvbWlzZU9yVmFsdWUsICdjYW5jZWwnXTsKYXNzZXJ0KFxpc19jYWxsYWJsZSgkY2FuY2VsbGVyKSk7Cn0KCgpyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGNhbGxhYmxlICRyZXNvbHZlLCBjYWxsYWJsZSAkcmVqZWN0KSB1c2UgKCRwcm9taXNlT3JWYWx1ZSk6IHZvaWQgewokcHJvbWlzZU9yVmFsdWUtPnRoZW4oJHJlc29sdmUsICRyZWplY3QpOwp9LCAkY2FuY2VsbGVyKTsKfQoKcmV0dXJuIG5ldyBGdWxmaWxsZWRQcm9taXNlKCRwcm9taXNlT3JWYWx1ZSk7Cn0KCgoKCgoKCgoKCgoKCgoKCmZ1bmN0aW9uIHJlamVjdChcVGhyb3dhYmxlICRyZWFzb24pOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuIG5ldyBSZWplY3RlZFByb21pc2UoJHJlYXNvbik7Cn0KCgoKCgoKCgoKCgpmdW5jdGlvbiBhbGwoaXRlcmFibGUgJHByb21pc2VzT3JWYWx1ZXMpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGNhbmNlbGxhdGlvblF1ZXVlID0gbmV3IEludGVybmFsXENhbmNlbGxhdGlvblF1ZXVlKCk7CgoKcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChjYWxsYWJsZSAkcmVzb2x2ZSwgY2FsbGFibGUgJHJlamVjdCkgdXNlICgkcHJvbWlzZXNPclZhbHVlcywgJGNhbmNlbGxhdGlvblF1ZXVlKTogdm9pZCB7CiR0b1Jlc29sdmUgPSAwOwoKJGNvbnRpbnVlID0gdHJ1ZTsKJHZhbHVlcyA9IFtdOwoKZm9yZWFjaCAoJHByb21pc2VzT3JWYWx1ZXMgYXMgJGkgPT4gJHByb21pc2VPclZhbHVlKSB7CiRjYW5jZWxsYXRpb25RdWV1ZS0+ZW5xdWV1ZSgkcHJvbWlzZU9yVmFsdWUpOwokdmFsdWVzWyRpXSA9IG51bGw7CisrJHRvUmVzb2x2ZTsKCnJlc29sdmUoJHByb21pc2VPclZhbHVlKS0+dGhlbigKZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkaSwgJiR2YWx1ZXMsICYkdG9SZXNvbHZlLCAmJGNvbnRpbnVlLCAkcmVzb2x2ZSk6IHZvaWQgewokdmFsdWVzWyRpXSA9ICR2YWx1ZTsKCmlmICgwID09PSAtLSR0b1Jlc29sdmUgJiYgISRjb250aW51ZSkgewokcmVzb2x2ZSgkdmFsdWVzKTsKfQp9LApmdW5jdGlvbiAoXFRocm93YWJsZSAkcmVhc29uKSB1c2UgKCYkY29udGludWUsICRyZWplY3QpOiB2b2lkIHsKJGNvbnRpbnVlID0gZmFsc2U7CiRyZWplY3QoJHJlYXNvbik7Cn0KKTsKCmlmICghJGNvbnRpbnVlICYmICFcaXNfYXJyYXkoJHByb21pc2VzT3JWYWx1ZXMpKSB7CmJyZWFrOwp9Cn0KCiRjb250aW51ZSA9IGZhbHNlOwppZiAoJHRvUmVzb2x2ZSA9PT0gMCkgewokcmVzb2x2ZSgkdmFsdWVzKTsKfQp9LCAkY2FuY2VsbGF0aW9uUXVldWUpOwp9CgoKCgoKCgoKCgoKCmZ1bmN0aW9uIHJhY2UoaXRlcmFibGUgJHByb21pc2VzT3JWYWx1ZXMpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGNhbmNlbGxhdGlvblF1ZXVlID0gbmV3IEludGVybmFsXENhbmNlbGxhdGlvblF1ZXVlKCk7CgoKcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChjYWxsYWJsZSAkcmVzb2x2ZSwgY2FsbGFibGUgJHJlamVjdCkgdXNlICgkcHJvbWlzZXNPclZhbHVlcywgJGNhbmNlbGxhdGlvblF1ZXVlKTogdm9pZCB7CiRjb250aW51ZSA9IHRydWU7Cgpmb3JlYWNoICgkcHJvbWlzZXNPclZhbHVlcyBhcyAkcHJvbWlzZU9yVmFsdWUpIHsKJGNhbmNlbGxhdGlvblF1ZXVlLT5lbnF1ZXVlKCRwcm9taXNlT3JWYWx1ZSk7CgpyZXNvbHZlKCRwcm9taXNlT3JWYWx1ZSktPnRoZW4oJHJlc29sdmUsICRyZWplY3QpLT5maW5hbGx5KGZ1bmN0aW9uICgpIHVzZSAoJiRjb250aW51ZSk6IHZvaWQgewokY29udGludWUgPSBmYWxzZTsKfSk7CgppZiAoISRjb250aW51ZSAmJiAhXGlzX2FycmF5KCRwcm9taXNlc09yVmFsdWVzKSkgewpicmVhazsKfQp9Cn0sICRjYW5jZWxsYXRpb25RdWV1ZSk7Cn0KCgoKCgoKCgoKCgoKCgoKCmZ1bmN0aW9uIGFueShpdGVyYWJsZSAkcHJvbWlzZXNPclZhbHVlcyk6IFByb21pc2VJbnRlcmZhY2UKewokY2FuY2VsbGF0aW9uUXVldWUgPSBuZXcgSW50ZXJuYWxcQ2FuY2VsbGF0aW9uUXVldWUoKTsKCgpyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGNhbGxhYmxlICRyZXNvbHZlLCBjYWxsYWJsZSAkcmVqZWN0KSB1c2UgKCRwcm9taXNlc09yVmFsdWVzLCAkY2FuY2VsbGF0aW9uUXVldWUpOiB2b2lkIHsKJHRvUmVqZWN0ID0gMDsKJGNvbnRpbnVlID0gdHJ1ZTsKJHJlYXNvbnMgPSBbXTsKCmZvcmVhY2ggKCRwcm9taXNlc09yVmFsdWVzIGFzICRpID0+ICRwcm9taXNlT3JWYWx1ZSkgewokY2FuY2VsbGF0aW9uUXVldWUtPmVucXVldWUoJHByb21pc2VPclZhbHVlKTsKKyskdG9SZWplY3Q7CgpyZXNvbHZlKCRwcm9taXNlT3JWYWx1ZSktPnRoZW4oCmZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJHJlc29sdmUsICYkY29udGludWUpOiB2b2lkIHsKJGNvbnRpbnVlID0gZmFsc2U7CiRyZXNvbHZlKCR2YWx1ZSk7Cn0sCmZ1bmN0aW9uIChcVGhyb3dhYmxlICRyZWFzb24pIHVzZSAoJGksICYkcmVhc29ucywgJiR0b1JlamVjdCwgJHJlamVjdCwgJiRjb250aW51ZSk6IHZvaWQgewokcmVhc29uc1skaV0gPSAkcmVhc29uOwoKaWYgKDAgPT09IC0tJHRvUmVqZWN0ICYmICEkY29udGludWUpIHsKJHJlamVjdChuZXcgQ29tcG9zaXRlRXhjZXB0aW9uKAokcmVhc29ucywKJ0FsbCBwcm9taXNlcyByZWplY3RlZC4nCikpOwp9Cn0KKTsKCmlmICghJGNvbnRpbnVlICYmICFcaXNfYXJyYXkoJHByb21pc2VzT3JWYWx1ZXMpKSB7CmJyZWFrOwp9Cn0KCiRjb250aW51ZSA9IGZhbHNlOwppZiAoJHRvUmVqZWN0ID09PSAwICYmICEkcmVhc29ucykgewokcmVqZWN0KG5ldyBFeGNlcHRpb25cTGVuZ3RoRXhjZXB0aW9uKAonTXVzdCBjb250YWluIGF0IGxlYXN0IDEgaXRlbSBidXQgY29udGFpbnMgb25seSAwIGl0ZW1zLicKKSk7Cn0gZWxzZWlmICgkdG9SZWplY3QgPT09IDApIHsKJHJlamVjdChuZXcgQ29tcG9zaXRlRXhjZXB0aW9uKAokcmVhc29ucywKJ0FsbCBwcm9taXNlcyByZWplY3RlZC4nCikpOwp9Cn0sICRjYW5jZWxsYXRpb25RdWV1ZSk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKZnVuY3Rpb24gc2V0X3JlamVjdGlvbl9oYW5kbGVyKD9jYWxsYWJsZSAkY2FsbGJhY2spOiA/Y2FsbGFibGUKewpzdGF0aWMgJGN1cnJlbnQgPSBudWxsOwokcHJldmlvdXMgPSAkY3VycmVudDsKJGN1cnJlbnQgPSAkY2FsbGJhY2s7CgpyZXR1cm4gJHByZXZpb3VzOwp9CgoKCgpmdW5jdGlvbiBfY2hlY2tUeXBlaGludChjYWxsYWJsZSAkY2FsbGJhY2ssIFxUaHJvd2FibGUgJHJlYXNvbik6IGJvb2wKewppZiAoXGlzX2FycmF5KCRjYWxsYmFjaykpIHsKJGNhbGxiYWNrUmVmbGVjdGlvbiA9IG5ldyBcUmVmbGVjdGlvbk1ldGhvZCgkY2FsbGJhY2tbMF0sICRjYWxsYmFja1sxXSk7Cn0gZWxzZWlmIChcaXNfb2JqZWN0KCRjYWxsYmFjaykgJiYgISRjYWxsYmFjayBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CiRjYWxsYmFja1JlZmxlY3Rpb24gPSBuZXcgXFJlZmxlY3Rpb25NZXRob2QoJGNhbGxiYWNrLCAnX19pbnZva2UnKTsKfSBlbHNlIHsKYXNzZXJ0KCRjYWxsYmFjayBpbnN0YW5jZW9mIFxDbG9zdXJlIHx8IFxpc19zdHJpbmcoJGNhbGxiYWNrKSk7CiRjYWxsYmFja1JlZmxlY3Rpb24gPSBuZXcgXFJlZmxlY3Rpb25GdW5jdGlvbigkY2FsbGJhY2spOwp9CgokcGFyYW1ldGVycyA9ICRjYWxsYmFja1JlZmxlY3Rpb24tPmdldFBhcmFtZXRlcnMoKTsKCmlmICghaXNzZXQoJHBhcmFtZXRlcnNbMF0pKSB7CnJldHVybiB0cnVlOwp9CgokZXhwZWN0ZWRFeGNlcHRpb24gPSAkcGFyYW1ldGVyc1swXTsKCgokdHlwZSA9ICRleHBlY3RlZEV4Y2VwdGlvbi0+Z2V0VHlwZSgpOwoKJGlzVHlwZVVuaW9uID0gdHJ1ZTsKJHR5cGVzID0gW107Cgpzd2l0Y2ggKHRydWUpIHsKY2FzZSAkdHlwZSA9PT0gbnVsbDoKYnJlYWs7CmNhc2UgJHR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbk5hbWVkVHlwZToKJHR5cGVzID0gWyR0eXBlXTsKYnJlYWs7CmNhc2UgJHR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbkludGVyc2VjdGlvblR5cGU6CiRpc1R5cGVVbmlvbiA9IGZhbHNlOwpjYXNlICR0eXBlIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25VbmlvblR5cGU7CiR0eXBlcyA9ICR0eXBlLT5nZXRUeXBlcygpOwpicmVhazsKZGVmYXVsdDoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgb2YgUmVmbGVjdGlvblBhcmFtZXRlcjo6Z2V0VHlwZScpOwp9CgoKaWYgKGVtcHR5KCR0eXBlcykpIHsKcmV0dXJuIHRydWU7Cn0KCmZvcmVhY2ggKCR0eXBlcyBhcyAkdHlwZSkgewoKaWYgKCR0eXBlIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25JbnRlcnNlY3Rpb25UeXBlKSB7CmZvcmVhY2ggKCR0eXBlLT5nZXRUeXBlcygpIGFzICR0eXBlVG9NYXRjaCkgewphc3NlcnQoJHR5cGVUb01hdGNoIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25OYW1lZFR5cGUpOwokbmFtZSA9ICR0eXBlVG9NYXRjaC0+Z2V0TmFtZSgpOwppZiAoISgkbWF0Y2hlcyA9ICghJHR5cGVUb01hdGNoLT5pc0J1aWx0aW4oKSAmJiAkcmVhc29uIGluc3RhbmNlb2YgJG5hbWUpKSkgewpicmVhazsKfQp9CmFzc2VydChpc3NldCgkbWF0Y2hlcykpOwp9IGVsc2Ugewphc3NlcnQoJHR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbk5hbWVkVHlwZSk7CiRuYW1lID0gJHR5cGUtPmdldE5hbWUoKTsKJG1hdGNoZXMgPSAhJHR5cGUtPmlzQnVpbHRpbigpICYmICRyZWFzb24gaW5zdGFuY2VvZiAkbmFtZTsKfQoKCgppZiAoJG1hdGNoZXMpIHsKaWYgKCRpc1R5cGVVbmlvbikgewpyZXR1cm4gdHJ1ZTsKfQp9IGVsc2UgewppZiAoISRpc1R5cGVVbmlvbikgewpyZXR1cm4gZmFsc2U7Cn0KfQp9CgoKCnJldHVybiAkaXNUeXBlVW5pb24gPyBmYWxzZSA6IHRydWU7Cn0KPD9waHAKCmlmICghXGZ1bmN0aW9uX2V4aXN0cygnUmVhY3RcUHJvbWlzZVxyZXNvbHZlJykpIHsKcmVxdWlyZSBfX0RJUl9fLicvZnVuY3Rpb25zLnBocCc7Cn0KCkNvcHlyaWdodCAoYykgMjAxMSBKb3JkaSBCb2dnaWFubwoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU2VsZFxKc29uTGludDsKCmNsYXNzIER1cGxpY2F0ZUtleUV4Y2VwdGlvbiBleHRlbmRzIFBhcnNpbmdFeGNlcHRpb24KewoKCgpwcm90ZWN0ZWQgJGRldGFpbHM7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGtleSwgYXJyYXkgJGRldGFpbHMpCnsKJGRldGFpbHNbJ2tleSddID0gJGtleTsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGRldGFpbHMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0S2V5KCkKewpyZXR1cm4gJHRoaXMtPmRldGFpbHNbJ2tleSddOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV0YWlscygpCnsKcmV0dXJuICR0aGlzLT5kZXRhaWxzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTZWxkXEpzb25MaW50Owp1c2Ugc3RkQ2xhc3M7CgoKCgoKCgoKCgoKCgoKY2xhc3MgSnNvblBhcnNlcgp7CmNvbnN0IERFVEVDVF9LRVlfQ09ORkxJQ1RTID0gMTsKY29uc3QgQUxMT1dfRFVQTElDQVRFX0tFWVMgPSAyOwpjb25zdCBQQVJTRV9UT19BU1NPQyA9IDQ7CmNvbnN0IEFMTE9XX0NPTU1FTlRTID0gODsKY29uc3QgQUxMT1dfRFVQTElDQVRFX0tFWVNfVE9fQVJSQVkgPSAxNjsKCgpwcml2YXRlICRsZXhlcjsKCgoKCgpwcml2YXRlICRmbGFnczsKCnByaXZhdGUgJHN0YWNrOwoKcHJpdmF0ZSAkdnN0YWNrOyAKCnByaXZhdGUgJGxzdGFjazsgCgoKCgpwcml2YXRlICRzeW1ib2xzID0gYXJyYXkoCidlcnJvcicgPT4gMiwKJ0pTT05TdHJpbmcnID0+IDMsCidTVFJJTkcnID0+IDQsCidKU09OTnVtYmVyJyA9PiA1LAonTlVNQkVSJyA9PiA2LAonSlNPTk51bGxMaXRlcmFsJyA9PiA3LAonTlVMTCcgPT4gOCwKJ0pTT05Cb29sZWFuTGl0ZXJhbCcgPT4gOSwKJ1RSVUUnID0+IDEwLAonRkFMU0UnID0+IDExLAonSlNPTlRleHQnID0+IDEyLAonSlNPTlZhbHVlJyA9PiAxMywKJ0VPRicgPT4gMTQsCidKU09OT2JqZWN0JyA9PiAxNSwKJ0pTT05BcnJheScgPT4gMTYsCid7JyA9PiAxNywKJ30nID0+IDE4LAonSlNPTk1lbWJlckxpc3QnID0+IDE5LAonSlNPTk1lbWJlcicgPT4gMjAsCic6JyA9PiAyMSwKJywnID0+IDIyLAonWycgPT4gMjMsCiddJyA9PiAyNCwKJ0pTT05FbGVtZW50TGlzdCcgPT4gMjUsCickYWNjZXB0JyA9PiAwLAonJGVuZCcgPT4gMSwKKTsKCgoKCgpwcml2YXRlICR0ZXJtaW5hbHNfID0gYXJyYXkoCjIgPT4gImVycm9yIiwKNCA9PiAiU1RSSU5HIiwKNiA9PiAiTlVNQkVSIiwKOCA9PiAiTlVMTCIsCjEwID0+ICJUUlVFIiwKMTEgPT4gIkZBTFNFIiwKMTQgPT4gIkVPRiIsCjE3ID0+ICJ7IiwKMTggPT4gIn0iLAoyMSA9PiAiOiIsCjIyID0+ICIsIiwKMjMgPT4gIlsiLAoyNCA9PiAiXSIsCik7CgoKCgoKcHJpdmF0ZSAkcHJvZHVjdGlvbnNfID0gYXJyYXkoCjEgPT4gYXJyYXkoMywgMSksCjIgPT4gYXJyYXkoNSwgMSksCjMgPT4gYXJyYXkoNywgMSksCjQgPT4gYXJyYXkoOSwgMSksCjUgPT4gYXJyYXkoOSwgMSksCjYgPT4gYXJyYXkoMTIsIDIpLAo3ID0+IGFycmF5KDEzLCAxKSwKOCA9PiBhcnJheSgxMywgMSksCjkgPT4gYXJyYXkoMTMsIDEpLAoxMCA9PiBhcnJheSgxMywgMSksCjExID0+IGFycmF5KDEzLCAxKSwKMTIgPT4gYXJyYXkoMTMsIDEpLAoxMyA9PiBhcnJheSgxNSwgMiksCjE0ID0+IGFycmF5KDE1LCAzKSwKMTUgPT4gYXJyYXkoMjAsIDMpLAoxNiA9PiBhcnJheSgxOSwgMSksCjE3ID0+IGFycmF5KDE5LCAzKSwKMTggPT4gYXJyYXkoMTYsIDIpLAoxOSA9PiBhcnJheSgxNiwgMyksCjIwID0+IGFycmF5KDI1LCAxKSwKMjEgPT4gYXJyYXkoMjUsIDMpCik7CgoKCgoKcHJpdmF0ZSAkdGFibGUgPSBhcnJheSgKMCA9PiBhcnJheSggMyA9PiA1LCA0ID0+IGFycmF5KDEsMTIpLCA1ID0+IDYsIDYgPT4gYXJyYXkoMSwxMyksIDcgPT4gMywgOCA9PiBhcnJheSgxLDkpLCA5ID0+IDQsIDEwID0+IGFycmF5KDEsMTApLCAxMSA9PiBhcnJheSgxLDExKSwgMTIgPT4gMSwgMTMgPT4gMiwgMTUgPT4gNywgMTYgPT4gOCwgMTcgPT4gYXJyYXkoMSwxNCksIDIzID0+IGFycmF5KDEsMTUpKSwKMSA9PiBhcnJheSggMSA9PiBhcnJheSgzKSksCjIgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDEsMTYpKSwKMyA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiw3KSwgMTggPT4gYXJyYXkoMiw3KSwgMjIgPT4gYXJyYXkoMiw3KSwgMjQgPT4gYXJyYXkoMiw3KSksCjQgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsOCksIDE4ID0+IGFycmF5KDIsOCksIDIyID0+IGFycmF5KDIsOCksIDI0ID0+IGFycmF5KDIsOCkpLAo1ID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDkpLCAxOCA9PiBhcnJheSgyLDkpLCAyMiA9PiBhcnJheSgyLDkpLCAyNCA9PiBhcnJheSgyLDkpKSwKNiA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiwxMCksIDE4ID0+IGFycmF5KDIsMTApLCAyMiA9PiBhcnJheSgyLDEwKSwgMjQgPT4gYXJyYXkoMiwxMCkpLAo3ID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDExKSwgMTggPT4gYXJyYXkoMiwxMSksIDIyID0+IGFycmF5KDIsMTEpLCAyNCA9PiBhcnJheSgyLDExKSksCjggPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsMTIpLCAxOCA9PiBhcnJheSgyLDEyKSwgMjIgPT4gYXJyYXkoMiwxMiksIDI0ID0+IGFycmF5KDIsMTIpKSwKOSA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiwzKSwgMTggPT4gYXJyYXkoMiwzKSwgMjIgPT4gYXJyYXkoMiwzKSwgMjQgPT4gYXJyYXkoMiwzKSksCjEwID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDQpLCAxOCA9PiBhcnJheSgyLDQpLCAyMiA9PiBhcnJheSgyLDQpLCAyNCA9PiBhcnJheSgyLDQpKSwKMTEgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsNSksIDE4ID0+IGFycmF5KDIsNSksIDIyID0+IGFycmF5KDIsNSksIDI0ID0+IGFycmF5KDIsNSkpLAoxMiA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiwxKSwgMTggPT4gYXJyYXkoMiwxKSwgMjEgPT4gYXJyYXkoMiwxKSwgMjIgPT4gYXJyYXkoMiwxKSwgMjQgPT4gYXJyYXkoMiwxKSksCjEzID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDIpLCAxOCA9PiBhcnJheSgyLDIpLCAyMiA9PiBhcnJheSgyLDIpLCAyNCA9PiBhcnJheSgyLDIpKSwKMTQgPT4gYXJyYXkoIDMgPT4gMjAsIDQgPT4gYXJyYXkoMSwxMiksIDE4ID0+IGFycmF5KDEsMTcpLCAxOSA9PiAxOCwgMjAgPT4gMTkgKSwKMTUgPT4gYXJyYXkoIDMgPT4gNSwgNCA9PiBhcnJheSgxLDEyKSwgNSA9PiA2LCA2ID0+IGFycmF5KDEsMTMpLCA3ID0+IDMsIDggPT4gYXJyYXkoMSw5KSwgOSA9PiA0LCAxMCA9PiBhcnJheSgxLDEwKSwgMTEgPT4gYXJyYXkoMSwxMSksIDEzID0+IDIzLCAxNSA9PiA3LCAxNiA9PiA4LCAxNyA9PiBhcnJheSgxLDE0KSwgMjMgPT4gYXJyYXkoMSwxNSksIDI0ID0+IGFycmF5KDEsMjEpLCAyNSA9PiAyMiApLAoxNiA9PiBhcnJheSggMSA9PiBhcnJheSgyLDYpKSwKMTcgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsMTMpLCAxOCA9PiBhcnJheSgyLDEzKSwgMjIgPT4gYXJyYXkoMiwxMyksIDI0ID0+IGFycmF5KDIsMTMpKSwKMTggPT4gYXJyYXkoIDE4ID0+IGFycmF5KDEsMjQpLCAyMiA9PiBhcnJheSgxLDI1KSksCjE5ID0+IGFycmF5KCAxOCA9PiBhcnJheSgyLDE2KSwgMjIgPT4gYXJyYXkoMiwxNikpLAoyMCA9PiBhcnJheSggMjEgPT4gYXJyYXkoMSwyNikpLAoyMSA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiwxOCksIDE4ID0+IGFycmF5KDIsMTgpLCAyMiA9PiBhcnJheSgyLDE4KSwgMjQgPT4gYXJyYXkoMiwxOCkpLAoyMiA9PiBhcnJheSggMjIgPT4gYXJyYXkoMSwyOCksIDI0ID0+IGFycmF5KDEsMjcpKSwKMjMgPT4gYXJyYXkoIDIyID0+IGFycmF5KDIsMjApLCAyNCA9PiBhcnJheSgyLDIwKSksCjI0ID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDE0KSwgMTggPT4gYXJyYXkoMiwxNCksIDIyID0+IGFycmF5KDIsMTQpLCAyNCA9PiBhcnJheSgyLDE0KSksCjI1ID0+IGFycmF5KCAzID0+IDIwLCA0ID0+IGFycmF5KDEsMTIpLCAyMCA9PiAyOSApLAoyNiA9PiBhcnJheSggMyA9PiA1LCA0ID0+IGFycmF5KDEsMTIpLCA1ID0+IDYsIDYgPT4gYXJyYXkoMSwxMyksIDcgPT4gMywgOCA9PiBhcnJheSgxLDkpLCA5ID0+IDQsIDEwID0+IGFycmF5KDEsMTApLCAxMSA9PiBhcnJheSgxLDExKSwgMTMgPT4gMzAsIDE1ID0+IDcsIDE2ID0+IDgsIDE3ID0+IGFycmF5KDEsMTQpLCAyMyA9PiBhcnJheSgxLDE1KSksCjI3ID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDE5KSwgMTggPT4gYXJyYXkoMiwxOSksIDIyID0+IGFycmF5KDIsMTkpLCAyNCA9PiBhcnJheSgyLDE5KSksCjI4ID0+IGFycmF5KCAzID0+IDUsIDQgPT4gYXJyYXkoMSwxMiksIDUgPT4gNiwgNiA9PiBhcnJheSgxLDEzKSwgNyA9PiAzLCA4ID0+IGFycmF5KDEsOSksIDkgPT4gNCwgMTAgPT4gYXJyYXkoMSwxMCksIDExID0+IGFycmF5KDEsMTEpLCAxMyA9PiAzMSwgMTUgPT4gNywgMTYgPT4gOCwgMTcgPT4gYXJyYXkoMSwxNCksIDIzID0+IGFycmF5KDEsMTUpKSwKMjkgPT4gYXJyYXkoIDE4ID0+IGFycmF5KDIsMTcpLCAyMiA9PiBhcnJheSgyLDE3KSksCjMwID0+IGFycmF5KCAxOCA9PiBhcnJheSgyLDE1KSwgMjIgPT4gYXJyYXkoMiwxNSkpLAozMSA9PiBhcnJheSggMjIgPT4gYXJyYXkoMiwyMSksIDI0ID0+IGFycmF5KDIsMjEpKSwKKTsKCgoKCgpwcml2YXRlICRkZWZhdWx0QWN0aW9ucyA9IGFycmF5KAoxNiA9PiBhcnJheSgyLCA2KQopOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsaW50KCRpbnB1dCwgJGZsYWdzID0gMCkKewp0cnkgewokdGhpcy0+cGFyc2UoJGlucHV0LCAkZmxhZ3MpOwp9IGNhdGNoIChQYXJzaW5nRXhjZXB0aW9uICRlKSB7CnJldHVybiAkZTsKfQpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2UoJGlucHV0LCAkZmxhZ3MgPSAwKQp7CmlmICgoJGZsYWdzICYgc2VsZjo6QUxMT1dfRFVQTElDQVRFX0tFWVNfVE9fQVJSQVkpICYmICgkZmxhZ3MgJiBzZWxmOjpBTExPV19EVVBMSUNBVEVfS0VZUykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ09ubHkgb25lIG9mIEFMTE9XX0RVUExJQ0FURV9LRVlTIGFuZCBBTExPV19EVVBMSUNBVEVfS0VZU19UT19BUlJBWSBjYW4gYmUgdXNlZCwgeW91IHBhc3NlZCBpbiBib3RoLicpOwp9CgokdGhpcy0+ZmFpbE9uQk9NKCRpbnB1dCk7CgokdGhpcy0+ZmxhZ3MgPSAkZmxhZ3M7CgokdGhpcy0+c3RhY2sgPSBhcnJheSgwKTsKJHRoaXMtPnZzdGFjayA9IGFycmF5KG51bGwpOwokdGhpcy0+bHN0YWNrID0gYXJyYXkoKTsKCiR5eXRleHQgPSAnJzsKJHl5bGluZW5vID0gMDsKJHl5bGVuZyA9IDA7CgokcmVjb3ZlcmluZyA9IDA7CgokdGhpcy0+bGV4ZXIgPSBuZXcgTGV4ZXIoJGZsYWdzKTsKJHRoaXMtPmxleGVyLT5zZXRJbnB1dCgkaW5wdXQpOwoKJHl5bG9jID0gJHRoaXMtPmxleGVyLT55eWxsb2M7CiR0aGlzLT5sc3RhY2tbXSA9ICR5eWxvYzsKCiRzeW1ib2wgPSBudWxsOwokcHJlRXJyb3JTeW1ib2wgPSBudWxsOwokYWN0aW9uID0gbnVsbDsKJGEgPSBudWxsOwokciA9IG51bGw7CiRwID0gbnVsbDsKJGxlbiA9IG51bGw7CiRuZXdTdGF0ZSA9IG51bGw7CiRleHBlY3RlZCA9IG51bGw7CgokZXJyU3RyID0gbnVsbDsKCndoaWxlICh0cnVlKSB7Cgokc3RhdGUgPSAkdGhpcy0+c3RhY2tbXGNvdW50KCR0aGlzLT5zdGFjayktMV07CgoKaWYgKGlzc2V0KCR0aGlzLT5kZWZhdWx0QWN0aW9uc1skc3RhdGVdKSkgewokYWN0aW9uID0gJHRoaXMtPmRlZmF1bHRBY3Rpb25zWyRzdGF0ZV07Cn0gZWxzZSB7CmlmICgkc3ltYm9sID09PSBudWxsKSB7CiRzeW1ib2wgPSAkdGhpcy0+bGV4ZXItPmxleCgpOwp9CgoKJGFjdGlvbiA9IGlzc2V0KCR0aGlzLT50YWJsZVskc3RhdGVdWyRzeW1ib2xdKSA/ICR0aGlzLT50YWJsZVskc3RhdGVdWyRzeW1ib2xdIDogZmFsc2U7Cn0KCgppZiAoISRhY3Rpb24gfHwgISRhY3Rpb25bMF0pIHsKYXNzZXJ0KGlzc2V0KCRzeW1ib2wpKTsKaWYgKCEkcmVjb3ZlcmluZykgewoKJGV4cGVjdGVkID0gYXJyYXkoKTsKZm9yZWFjaCAoJHRoaXMtPnRhYmxlWyRzdGF0ZV0gYXMgJHAgPT4gJGlnbm9yZSkgewppZiAoaXNzZXQoJHRoaXMtPnRlcm1pbmFsc19bJHBdKSAmJiAkcCA+IDIpIHsKJGV4cGVjdGVkW10gPSAiJyIgLiAkdGhpcy0+dGVybWluYWxzX1skcF0gLiAiJyI7Cn0KfQoKJG1lc3NhZ2UgPSBudWxsOwppZiAoXGluX2FycmF5KCInU1RSSU5HJyIsICRleHBlY3RlZCkgJiYgXGluX2FycmF5KHN1YnN0cigkdGhpcy0+bGV4ZXItPm1hdGNoLCAwLCAxKSwgYXJyYXkoJyInLCAiJyIpKSkgewokbWVzc2FnZSA9ICJJbnZhbGlkIHN0cmluZyI7CmlmICgiJyIgPT09IHN1YnN0cigkdGhpcy0+bGV4ZXItPm1hdGNoLCAwLCAxKSkgewokbWVzc2FnZSAuPSAiLCBpdCBhcHBlYXJzIHlvdSB1c2VkIHNpbmdsZSBxdW90ZXMgaW5zdGVhZCBvZiBkb3VibGUgcXVvdGVzIjsKfSBlbHNlaWYgKHByZWdfbWF0Y2goJ3siLis/KFxcXFxbXiJiZm5ydC9cXFxcdV0oLi4uKT8pfScsICR0aGlzLT5sZXhlci0+Z2V0RnVsbFVwY29taW5nSW5wdXQoKSwgJG1hdGNoKSkgewokbWVzc2FnZSAuPSAiLCBpdCBhcHBlYXJzIHlvdSBoYXZlIGFuIHVuZXNjYXBlZCBiYWNrc2xhc2ggYXQ6ICIuJG1hdGNoWzFdOwp9IGVsc2VpZiAocHJlZ19tYXRjaCgneyIoPzpbXiJdK3xcXFxcIikqJH1tJywgJHRoaXMtPmxleGVyLT5nZXRGdWxsVXBjb21pbmdJbnB1dCgpKSkgewokbWVzc2FnZSAuPSAiLCBpdCBhcHBlYXJzIHlvdSBmb3Jnb3QgdG8gdGVybWluYXRlIGEgc3RyaW5nLCBvciBhdHRlbXB0ZWQgdG8gd3JpdGUgYSBtdWx0aWxpbmUgc3RyaW5nIHdoaWNoIGlzIGludmFsaWQiOwp9Cn0KCiRlcnJTdHIgPSAnUGFyc2UgZXJyb3Igb24gbGluZSAnIC4gKCR5eWxpbmVubysxKSAuICI6XG4iOwokZXJyU3RyIC49ICR0aGlzLT5sZXhlci0+c2hvd1Bvc2l0aW9uKCkgLiAiXG4iOwppZiAoJG1lc3NhZ2UpIHsKJGVyclN0ciAuPSAkbWVzc2FnZTsKfSBlbHNlIHsKJGVyclN0ciAuPSAoXGNvdW50KCRleHBlY3RlZCkgPiAxKSA/ICJFeHBlY3RlZCBvbmUgb2Y6ICIgOiAiRXhwZWN0ZWQ6ICI7CiRlcnJTdHIgLj0gaW1wbG9kZSgnLCAnLCAkZXhwZWN0ZWQpOwp9CgppZiAoJywnID09PSBzdWJzdHIodHJpbSgkdGhpcy0+bGV4ZXItPmdldFBhc3RJbnB1dCgpKSwgLTEpKSB7CiRlcnJTdHIgLj0gIiAtIEl0IGFwcGVhcnMgeW91IGhhdmUgYW4gZXh0cmEgdHJhaWxpbmcgY29tbWEiOwp9CgokdGhpcy0+cGFyc2VFcnJvcigkZXJyU3RyLCBhcnJheSgKJ3RleHQnID0+ICR0aGlzLT5sZXhlci0+bWF0Y2gsCid0b2tlbicgPT4gaXNzZXQoJHRoaXMtPnRlcm1pbmFsc19bJHN5bWJvbF0pID8gJHRoaXMtPnRlcm1pbmFsc19bJHN5bWJvbF0gOiAkc3ltYm9sLAonbGluZScgPT4gJHRoaXMtPmxleGVyLT55eWxpbmVubywKJ2xvYycgPT4gJHl5bG9jLAonZXhwZWN0ZWQnID0+ICRleHBlY3RlZCwKKSk7Cn0KCgppZiAoJHJlY292ZXJpbmcgPT0gMykgewppZiAoJHN5bWJvbCA9PT0gTGV4ZXI6OkVPRikgewp0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbigkZXJyU3RyID86ICdQYXJzaW5nIGhhbHRlZC4nKTsKfQoKCiR5eWxlbmcgPSAkdGhpcy0+bGV4ZXItPnl5bGVuZzsKJHl5dGV4dCA9ICR0aGlzLT5sZXhlci0+eXl0ZXh0OwokeXlsaW5lbm8gPSAkdGhpcy0+bGV4ZXItPnl5bGluZW5vOwokeXlsb2MgPSAkdGhpcy0+bGV4ZXItPnl5bGxvYzsKJHN5bWJvbCA9ICR0aGlzLT5sZXhlci0+bGV4KCk7Cn0KCgp3aGlsZSAodHJ1ZSkgewoKaWYgKFxhcnJheV9rZXlfZXhpc3RzKExleGVyOjpUX0VSUk9SLCAkdGhpcy0+dGFibGVbJHN0YXRlXSkpIHsKYnJlYWs7Cn0KaWYgKCRzdGF0ZSA9PSAwKSB7CnRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCRlcnJTdHIgPzogJ1BhcnNpbmcgaGFsdGVkLicpOwp9CiR0aGlzLT5wb3BTdGFjaygxKTsKJHN0YXRlID0gJHRoaXMtPnN0YWNrW1xjb3VudCgkdGhpcy0+c3RhY2spLTFdOwp9CgokcHJlRXJyb3JTeW1ib2wgPSAkc3ltYm9sOyAKJHN5bWJvbCA9IExleGVyOjpUX0VSUk9SOyAKJHN0YXRlID0gJHRoaXMtPnN0YWNrW1xjb3VudCgkdGhpcy0+c3RhY2spLTFdOwoKJGFjdGlvbiA9IGlzc2V0KCR0aGlzLT50YWJsZVskc3RhdGVdW0xleGVyOjpUX0VSUk9SXSkgPyAkdGhpcy0+dGFibGVbJHN0YXRlXVtMZXhlcjo6VF9FUlJPUl0gOiBmYWxzZTsKaWYgKCRhY3Rpb24gPT09IGZhbHNlKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ05vIHRhYmxlIHZhbHVlIGZvdW5kIGZvciAnLiRzdGF0ZS4nID0+ICcuTGV4ZXI6OlRfRVJST1IpOwp9CiRyZWNvdmVyaW5nID0gMzsgCn0KCgppZiAoXGlzX2FycmF5KCRhY3Rpb25bMF0pICYmIFxjb3VudCgkYWN0aW9uKSA+IDEpIHsKdGhyb3cgbmV3IFBhcnNpbmdFeGNlcHRpb24oJ1BhcnNlIEVycm9yOiBtdWx0aXBsZSBhY3Rpb25zIHBvc3NpYmxlIGF0IHN0YXRlOiAnIC4gJHN0YXRlIC4gJywgdG9rZW46ICcgLiAkc3ltYm9sKTsKfQoKc3dpdGNoICgkYWN0aW9uWzBdKSB7CmNhc2UgMTogCmFzc2VydChpc3NldCgkc3ltYm9sKSk7CiR0aGlzLT5zdGFja1tdID0gJHN5bWJvbDsKJHRoaXMtPnZzdGFja1tdID0gJHRoaXMtPmxleGVyLT55eXRleHQ7CiR0aGlzLT5sc3RhY2tbXSA9ICR0aGlzLT5sZXhlci0+eXlsbG9jOwokdGhpcy0+c3RhY2tbXSA9ICRhY3Rpb25bMV07IAokc3ltYm9sID0gbnVsbDsKaWYgKCEkcHJlRXJyb3JTeW1ib2wpIHsgCiR5eWxlbmcgPSAkdGhpcy0+bGV4ZXItPnl5bGVuZzsKJHl5dGV4dCA9ICR0aGlzLT5sZXhlci0+eXl0ZXh0OwokeXlsaW5lbm8gPSAkdGhpcy0+bGV4ZXItPnl5bGluZW5vOwokeXlsb2MgPSAkdGhpcy0+bGV4ZXItPnl5bGxvYzsKaWYgKCRyZWNvdmVyaW5nID4gMCkgewokcmVjb3ZlcmluZy0tOwp9Cn0gZWxzZSB7IAokc3ltYm9sID0gJHByZUVycm9yU3ltYm9sOwokcHJlRXJyb3JTeW1ib2wgPSBudWxsOwp9CmJyZWFrOwoKY2FzZSAyOiAKJGxlbiA9ICR0aGlzLT5wcm9kdWN0aW9uc19bJGFjdGlvblsxXV1bMV07CgoKJGN1cnJlbnRUb2tlbiA9ICR0aGlzLT52c3RhY2tbXGNvdW50KCR0aGlzLT52c3RhY2spIC0gJGxlbl07IAoKJHBvc2l0aW9uID0gYXJyYXkoIAonZmlyc3RfbGluZScgPT4gJHRoaXMtPmxzdGFja1tcY291bnQoJHRoaXMtPmxzdGFjaykgLSAoJGxlbiA/OiAxKV1bJ2ZpcnN0X2xpbmUnXSwKJ2xhc3RfbGluZScgPT4gJHRoaXMtPmxzdGFja1tcY291bnQoJHRoaXMtPmxzdGFjaykgLSAxXVsnbGFzdF9saW5lJ10sCidmaXJzdF9jb2x1bW4nID0+ICR0aGlzLT5sc3RhY2tbXGNvdW50KCR0aGlzLT5sc3RhY2spIC0gKCRsZW4gPzogMSldWydmaXJzdF9jb2x1bW4nXSwKJ2xhc3RfY29sdW1uJyA9PiAkdGhpcy0+bHN0YWNrW1xjb3VudCgkdGhpcy0+bHN0YWNrKSAtIDFdWydsYXN0X2NvbHVtbiddLAopOwpsaXN0KCRuZXdUb2tlbiwgJGFjdGlvblJlc3VsdCkgPSAkdGhpcy0+cGVyZm9ybUFjdGlvbigkY3VycmVudFRva2VuLCAkeXl0ZXh0LCAkeXlsZW5nLCAkeXlsaW5lbm8sICRhY3Rpb25bMV0pOwoKaWYgKCEkYWN0aW9uUmVzdWx0IGluc3RhbmNlb2YgVW5kZWZpbmVkKSB7CnJldHVybiAkYWN0aW9uUmVzdWx0Owp9CgppZiAoJGxlbikgewokdGhpcy0+cG9wU3RhY2soJGxlbik7Cn0KCiR0aGlzLT5zdGFja1tdID0gJHRoaXMtPnByb2R1Y3Rpb25zX1skYWN0aW9uWzFdXVswXTsgCiR0aGlzLT52c3RhY2tbXSA9ICRuZXdUb2tlbjsKJHRoaXMtPmxzdGFja1tdID0gJHBvc2l0aW9uOwoKJG5ld1N0YXRlID0gJHRoaXMtPnRhYmxlWyR0aGlzLT5zdGFja1tcY291bnQoJHRoaXMtPnN0YWNrKS0yXV1bJHRoaXMtPnN0YWNrW1xjb3VudCgkdGhpcy0+c3RhY2spLTFdXTsKJHRoaXMtPnN0YWNrW10gPSAkbmV3U3RhdGU7CmJyZWFrOwoKY2FzZSAzOiAKCnJldHVybiB0cnVlOwp9Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2VFcnJvcigkc3RyLCAkaGFzaCA9IG51bGwpCnsKdGhyb3cgbmV3IFBhcnNpbmdFeGNlcHRpb24oJHN0ciwgJGhhc2ggPzogYXJyYXkoKSk7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwZXJmb3JtQWN0aW9uKCRjdXJyZW50VG9rZW4sICR5eXRleHQsICR5eWxlbmcsICR5eWxpbmVubywgJHl5c3RhdGUpCnsKJHRva2VuID0gJGN1cnJlbnRUb2tlbjsKCiRsZW4gPSBcY291bnQoJHRoaXMtPnZzdGFjaykgLSAxOwpzd2l0Y2ggKCR5eXN0YXRlKSB7CmNhc2UgMToKJHl5dGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygneyg/OlxcXFxbImJmbnJ0L1xcXFxdfFxcXFx1W2EtZkEtRjAtOV17NH0pfScsIGFycmF5KCR0aGlzLCAnc3RyaW5nSW50ZXJwb2xhdGlvbicpLCAkeXl0ZXh0KTsKJHRva2VuID0gJHl5dGV4dDsKYnJlYWs7CmNhc2UgMjoKaWYgKHN0cnBvcygkeXl0ZXh0LCAnZScpICE9PSBmYWxzZSB8fCBzdHJwb3MoJHl5dGV4dCwgJ0UnKSAhPT0gZmFsc2UpIHsKJHRva2VuID0gXGZsb2F0dmFsKCR5eXRleHQpOwp9IGVsc2UgewokdG9rZW4gPSBzdHJwb3MoJHl5dGV4dCwgJy4nKSA9PT0gZmFsc2UgPyBcaW50dmFsKCR5eXRleHQpIDogXGZsb2F0dmFsKCR5eXRleHQpOwp9CmJyZWFrOwpjYXNlIDM6CiR0b2tlbiA9IG51bGw7CmJyZWFrOwpjYXNlIDQ6CiR0b2tlbiA9IHRydWU7CmJyZWFrOwpjYXNlIDU6CiR0b2tlbiA9IGZhbHNlOwpicmVhazsKY2FzZSA2OgokdG9rZW4gPSAkdGhpcy0+dnN0YWNrWyRsZW4tMV07CgpyZXR1cm4gYXJyYXkoJHRva2VuLCAkdG9rZW4pOwpjYXNlIDEzOgppZiAoJHRoaXMtPmZsYWdzICYgc2VsZjo6UEFSU0VfVE9fQVNTT0MpIHsKJHRva2VuID0gYXJyYXkoKTsKfSBlbHNlIHsKJHRva2VuID0gbmV3IHN0ZENsYXNzOwp9CmJyZWFrOwpjYXNlIDE0OgokdG9rZW4gPSAkdGhpcy0+dnN0YWNrWyRsZW4tMV07CmJyZWFrOwpjYXNlIDE1OgokdG9rZW4gPSBhcnJheSgkdGhpcy0+dnN0YWNrWyRsZW4tMl0sICR0aGlzLT52c3RhY2tbJGxlbl0pOwpicmVhazsKY2FzZSAxNjoKYXNzZXJ0KFxpc19hcnJheSgkdGhpcy0+dnN0YWNrWyRsZW5dKSk7CmlmIChQSFBfVkVSU0lPTl9JRCA8IDcwMTAwKSB7CiRwcm9wZXJ0eSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMF0gPT09ICcnID8gJ19lbXB0eV8nIDogJHRoaXMtPnZzdGFja1skbGVuXVswXTsKfSBlbHNlIHsKJHByb3BlcnR5ID0gJHRoaXMtPnZzdGFja1skbGVuXVswXTsKfQppZiAoJHRoaXMtPmZsYWdzICYgc2VsZjo6UEFSU0VfVE9fQVNTT0MpIHsKJHRva2VuID0gYXJyYXkoKTsKJHRva2VuWyRwcm9wZXJ0eV0gPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzFdOwp9IGVsc2UgewokdG9rZW4gPSBuZXcgc3RkQ2xhc3M7CiR0b2tlbi0+JHByb3BlcnR5ID0gJHRoaXMtPnZzdGFja1skbGVuXVsxXTsKfQpicmVhazsKY2FzZSAxNzoKYXNzZXJ0KFxpc19hcnJheSgkdGhpcy0+dnN0YWNrWyRsZW5dKSk7CmlmICgkdGhpcy0+ZmxhZ3MgJiBzZWxmOjpQQVJTRV9UT19BU1NPQykgewphc3NlcnQoXGlzX2FycmF5KCR0aGlzLT52c3RhY2tbJGxlbi0yXSkpOwokdG9rZW4gPSYgJHRoaXMtPnZzdGFja1skbGVuLTJdOwoka2V5ID0gJHRoaXMtPnZzdGFja1skbGVuXVswXTsKaWYgKCgkdGhpcy0+ZmxhZ3MgJiBzZWxmOjpERVRFQ1RfS0VZX0NPTkZMSUNUUykgJiYgaXNzZXQoJHRoaXMtPnZzdGFja1skbGVuLTJdWyRrZXldKSkgewokZXJyU3RyID0gJ1BhcnNlIGVycm9yIG9uIGxpbmUgJyAuICgkeXlsaW5lbm8rMSkgLiAiOlxuIjsKJGVyclN0ciAuPSAkdGhpcy0+bGV4ZXItPnNob3dQb3NpdGlvbigpIC4gIlxuIjsKJGVyclN0ciAuPSAiRHVwbGljYXRlIGtleTogIi4kdGhpcy0+dnN0YWNrWyRsZW5dWzBdOwp0aHJvdyBuZXcgRHVwbGljYXRlS2V5RXhjZXB0aW9uKCRlcnJTdHIsICR0aGlzLT52c3RhY2tbJGxlbl1bMF0sIGFycmF5KCdsaW5lJyA9PiAkeXlsaW5lbm8rMSkpOwp9CmlmICgoJHRoaXMtPmZsYWdzICYgc2VsZjo6QUxMT1dfRFVQTElDQVRFX0tFWVMpICYmIGlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXVska2V5XSkpIHsKJGR1cGxpY2F0ZUNvdW50ID0gMTsKZG8gewokZHVwbGljYXRlS2V5ID0gJGtleSAuICcuJyAuICRkdXBsaWNhdGVDb3VudCsrOwp9IHdoaWxlIChpc3NldCgkdGhpcy0+dnN0YWNrWyRsZW4tMl1bJGR1cGxpY2F0ZUtleV0pKTsKJHRoaXMtPnZzdGFja1skbGVuLTJdWyRkdXBsaWNhdGVLZXldID0gJHRoaXMtPnZzdGFja1skbGVuXVsxXTsKfSBlbHNlaWYgKCgkdGhpcy0+ZmxhZ3MgJiBzZWxmOjpBTExPV19EVVBMSUNBVEVfS0VZU19UT19BUlJBWSkgJiYgaXNzZXQoJHRoaXMtPnZzdGFja1skbGVuLTJdWyRrZXldKSkgewppZiAoIWlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXVska2V5XVsnX19kdXBsaWNhdGVzX18nXSkgfHwgIWlzX2FycmF5KCR0aGlzLT52c3RhY2tbJGxlbi0yXVska2V5XVsnX19kdXBsaWNhdGVzX18nXSkpIHsKJHRoaXMtPnZzdGFja1skbGVuLTJdWyRrZXldID0gYXJyYXkoJ19fZHVwbGljYXRlc19fJyA9PiBhcnJheSgkdGhpcy0+dnN0YWNrWyRsZW4tMl1bJGtleV0pKTsKfQokdGhpcy0+dnN0YWNrWyRsZW4tMl1bJGtleV1bJ19fZHVwbGljYXRlc19fJ11bXSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMV07Cn0gZWxzZSB7CiR0aGlzLT52c3RhY2tbJGxlbi0yXVska2V5XSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMV07Cn0KfSBlbHNlIHsKYXNzZXJ0KCR0aGlzLT52c3RhY2tbJGxlbi0yXSBpbnN0YW5jZW9mIHN0ZENsYXNzKTsKJHRva2VuID0gJHRoaXMtPnZzdGFja1skbGVuLTJdOwppZiAoUEhQX1ZFUlNJT05fSUQgPCA3MDEwMCkgewoka2V5ID0gJHRoaXMtPnZzdGFja1skbGVuXVswXSA9PT0gJycgPyAnX2VtcHR5XycgOiAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdOwp9IGVsc2Ugewoka2V5ID0gJHRoaXMtPnZzdGFja1skbGVuXVswXTsKfQppZiAoKCR0aGlzLT5mbGFncyAmIHNlbGY6OkRFVEVDVF9LRVlfQ09ORkxJQ1RTKSAmJiBpc3NldCgkdGhpcy0+dnN0YWNrWyRsZW4tMl0tPiRrZXkpKSB7CiRlcnJTdHIgPSAnUGFyc2UgZXJyb3Igb24gbGluZSAnIC4gKCR5eWxpbmVubysxKSAuICI6XG4iOwokZXJyU3RyIC49ICR0aGlzLT5sZXhlci0+c2hvd1Bvc2l0aW9uKCkgLiAiXG4iOwokZXJyU3RyIC49ICJEdXBsaWNhdGUga2V5OiAiLiR0aGlzLT52c3RhY2tbJGxlbl1bMF07CnRocm93IG5ldyBEdXBsaWNhdGVLZXlFeGNlcHRpb24oJGVyclN0ciwgJHRoaXMtPnZzdGFja1skbGVuXVswXSwgYXJyYXkoJ2xpbmUnID0+ICR5eWxpbmVubysxKSk7Cn0KaWYgKCgkdGhpcy0+ZmxhZ3MgJiBzZWxmOjpBTExPV19EVVBMSUNBVEVfS0VZUykgJiYgaXNzZXQoJHRoaXMtPnZzdGFja1skbGVuLTJdLT4ka2V5KSkgewokZHVwbGljYXRlQ291bnQgPSAxOwpkbyB7CiRkdXBsaWNhdGVLZXkgPSAka2V5IC4gJy4nIC4gJGR1cGxpY2F0ZUNvdW50Kys7Cn0gd2hpbGUgKGlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXS0+JGR1cGxpY2F0ZUtleSkpOwokdGhpcy0+dnN0YWNrWyRsZW4tMl0tPiRkdXBsaWNhdGVLZXkgPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzFdOwp9IGVsc2VpZiAoKCR0aGlzLT5mbGFncyAmIHNlbGY6OkFMTE9XX0RVUExJQ0FURV9LRVlTX1RPX0FSUkFZKSAmJiBpc3NldCgkdGhpcy0+dnN0YWNrWyRsZW4tMl0tPiRrZXkpKSB7CmlmICghaXNzZXQoJHRoaXMtPnZzdGFja1skbGVuLTJdLT4ka2V5LT5fX2R1cGxpY2F0ZXNfXykpIHsKJHRoaXMtPnZzdGFja1skbGVuLTJdLT4ka2V5ID0gKG9iamVjdCkgYXJyYXkoJ19fZHVwbGljYXRlc19fJyA9PiBhcnJheSgkdGhpcy0+dnN0YWNrWyRsZW4tMl0tPiRrZXkpKTsKfQokdGhpcy0+dnN0YWNrWyRsZW4tMl0tPiRrZXktPl9fZHVwbGljYXRlc19fW10gPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzFdOwp9IGVsc2UgewokdGhpcy0+dnN0YWNrWyRsZW4tMl0tPiRrZXkgPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzFdOwp9Cn0KYnJlYWs7CmNhc2UgMTg6CiR0b2tlbiA9IGFycmF5KCk7CmJyZWFrOwpjYXNlIDE5OgokdG9rZW4gPSAkdGhpcy0+dnN0YWNrWyRsZW4tMV07CmJyZWFrOwpjYXNlIDIwOgokdG9rZW4gPSBhcnJheSgkdGhpcy0+dnN0YWNrWyRsZW5dKTsKYnJlYWs7CmNhc2UgMjE6CmFzc2VydChcaXNfYXJyYXkoJHRoaXMtPnZzdGFja1skbGVuLTJdKSk7CiR0aGlzLT52c3RhY2tbJGxlbi0yXVtdID0gJHRoaXMtPnZzdGFja1skbGVuXTsKJHRva2VuID0gJHRoaXMtPnZzdGFja1skbGVuLTJdOwpicmVhazsKfQoKcmV0dXJuIGFycmF5KCR0b2tlbiwgbmV3IFVuZGVmaW5lZCgpKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc3RyaW5nSW50ZXJwb2xhdGlvbigkbWF0Y2gpCnsKc3dpdGNoICgkbWF0Y2hbMF0pIHsKY2FzZSAnXFxcXCc6CnJldHVybiAnXFwnOwpjYXNlICdcIic6CnJldHVybiAnIic7CmNhc2UgJ1xiJzoKcmV0dXJuIFxjaHIoOCk7CmNhc2UgJ1xmJzoKcmV0dXJuIFxjaHIoMTIpOwpjYXNlICdcbic6CnJldHVybiAiXG4iOwpjYXNlICdccic6CnJldHVybiAiXHIiOwpjYXNlICdcdCc6CnJldHVybiAiXHQiOwpjYXNlICdcLyc6CnJldHVybiAiLyI7CmRlZmF1bHQ6CnJldHVybiBodG1sX2VudGl0eV9kZWNvZGUoJyYjeCcubHRyaW0oc3Vic3RyKCRtYXRjaFswXSwgMiksICcwJykuJzsnLCBFTlRfUVVPVEVTLCAnVVRGLTgnKTsKfQp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwb3BTdGFjaygkbikKewokdGhpcy0+c3RhY2sgPSBcYXJyYXlfc2xpY2UoJHRoaXMtPnN0YWNrLCAwLCAtICgyICogJG4pKTsKJHRoaXMtPnZzdGFjayA9IFxhcnJheV9zbGljZSgkdGhpcy0+dnN0YWNrLCAwLCAtICRuKTsKJHRoaXMtPmxzdGFjayA9IFxhcnJheV9zbGljZSgkdGhpcy0+bHN0YWNrLCAwLCAtICRuKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmFpbE9uQk9NKCRpbnB1dCkKewoKJGJvbSA9ICJceEVGXHhCQlx4QkYiOwoKaWYgKHN1YnN0cigkaW5wdXQsIDAsIDMpID09PSAkYm9tKSB7CiR0aGlzLT5wYXJzZUVycm9yKCJCT00gZGV0ZWN0ZWQsIG1ha2Ugc3VyZSB5b3VyIGlucHV0IGRvZXMgbm90IGluY2x1ZGUgYSBVbmljb2RlIEJ5dGUtT3JkZXItTWFyayIpOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFNlbGRcSnNvbkxpbnQ7CgoKCgoKCmNsYXNzIExleGVyCnsKCmNvbnN0IEVPRiA9IDE7Cgpjb25zdCBUX0lOVkFMSUQgPSAtMTsKY29uc3QgVF9TS0lQX1dISVRFU1BBQ0UgPSAwOwpjb25zdCBUX0VSUk9SID0gMjsKCmNvbnN0IFRfQlJFQUtfTElORSA9IDM7Cgpjb25zdCBUX0NPTU1FTlQgPSAzMDsKCmNvbnN0IFRfT1BFTl9DT01NRU5UID0gMzE7Cgpjb25zdCBUX0NMT1NFX0NPTU1FTlQgPSAzMjsKCgoKCgpwcml2YXRlICRydWxlcyA9IGFycmF5KAowID0+ICcvXEdccypcblxyPy8nLAoxID0+ICcvXEdccysvJywKMiA9PiAnL1xHLT8oWzAtOV18WzEtOV1bMC05XSspKFwuWzAtOV0rKT8oW2VFXVsrLV0/WzAtOV0rKT9cYi8nLAozID0+ICd7XEciKD8+XFxcXFsiYmZucnQvXFxcXF18XFxcXHVbYS1mQS1GMC05XXs0fXxbXlwwLVx4MWZcXFxcIl0rKykqKyJ9JywKNCA9PiAnL1xHXHsvJywKNSA9PiAnL1xHXH0vJywKNiA9PiAnL1xHXFsvJywKNyA9PiAnL1xHXF0vJywKOCA9PiAnL1xHLC8nLAo5ID0+ICcvXEc6LycsCjEwID0+ICcvXEd0cnVlXGIvJywKMTEgPT4gJy9cR2ZhbHNlXGIvJywKMTIgPT4gJy9cR251bGxcYi8nLAoxMyA9PiAnL1xHJC8nLAoxNCA9PiAnL1xHXC9cLy8nLAoxNSA9PiAnL1xHXC9cKi8nLAoxNiA9PiAnL1xHXCpcLy8nLAoxNyA9PiAnL1xHLi8nLAopOwoKCnByaXZhdGUgJGlucHV0OwoKcHJpdmF0ZSAkbW9yZTsKCnByaXZhdGUgJGRvbmU7Cgpwcml2YXRlICRvZmZzZXQ7Cgpwcml2YXRlICRmbGFnczsKCgpwdWJsaWMgJG1hdGNoOwoKcHVibGljICR5eWxpbmVubzsKCnB1YmxpYyAkeXlsZW5nOwoKcHVibGljICR5eXRleHQ7CgpwdWJsaWMgJHl5bGxvYzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZmxhZ3MgPSAwKQp7CiR0aGlzLT5mbGFncyA9ICRmbGFnczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGxleCgpCnsKd2hpbGUgKHRydWUpIHsKJHN5bWJvbCA9ICR0aGlzLT5uZXh0KCk7CnN3aXRjaCAoJHN5bWJvbCkgewpjYXNlIHNlbGY6OlRfU0tJUF9XSElURVNQQUNFOgpjYXNlIHNlbGY6OlRfQlJFQUtfTElORToKYnJlYWs7CmNhc2Ugc2VsZjo6VF9DT01NRU5UOgpjYXNlIHNlbGY6OlRfT1BFTl9DT01NRU5UOgppZiAoISgkdGhpcy0+ZmxhZ3MgJiBKc29uUGFyc2VyOjpBTExPV19DT01NRU5UUykpIHsKJHRoaXMtPnBhcnNlRXJyb3IoJ0xleGljYWwgZXJyb3Igb24gbGluZSAnIC4gKCR0aGlzLT55eWxpbmVubysxKSAuICIuIENvbW1lbnRzIGFyZSBub3QgYWxsb3dlZC5cbiIgLiAkdGhpcy0+c2hvd1Bvc2l0aW9uKCkpOwp9CiR0aGlzLT5za2lwVW50aWwoJHN5bWJvbCA9PT0gc2VsZjo6VF9DT01NRU5UID8gc2VsZjo6VF9CUkVBS19MSU5FIDogc2VsZjo6VF9DTE9TRV9DT01NRU5UKTsKaWYgKCR0aGlzLT5kb25lKSB7CgpyZXR1cm4gMTQ7Cn0KYnJlYWs7CmNhc2Ugc2VsZjo6VF9DTE9TRV9DT01NRU5UOgokdGhpcy0+cGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgLiAoJHRoaXMtPnl5bGluZW5vKzEpIC4gIi4gVW5leHBlY3RlZCB0b2tlbi5cbiIgLiAkdGhpcy0+c2hvd1Bvc2l0aW9uKCkpOwpkZWZhdWx0OgpyZXR1cm4gJHN5bWJvbDsKfQp9Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5wdXQoJGlucHV0KQp7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKJHRoaXMtPm1vcmUgPSBmYWxzZTsKJHRoaXMtPmRvbmUgPSBmYWxzZTsKJHRoaXMtPm9mZnNldCA9IDA7CiR0aGlzLT55eWxpbmVubyA9ICR0aGlzLT55eWxlbmcgPSAwOwokdGhpcy0+eXl0ZXh0ID0gJHRoaXMtPm1hdGNoID0gJyc7CiR0aGlzLT55eWxsb2MgPSBhcnJheSgnZmlyc3RfbGluZScgPT4gMSwgJ2ZpcnN0X2NvbHVtbicgPT4gMCwgJ2xhc3RfbGluZScgPT4gMSwgJ2xhc3RfY29sdW1uJyA9PiAwKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNob3dQb3NpdGlvbigpCnsKaWYgKCR0aGlzLT55eWxpbmVubyA9PT0gMCAmJiAkdGhpcy0+b2Zmc2V0ID09PSAxICYmICR0aGlzLT5tYXRjaCAhPT0gJ3snKSB7CnJldHVybiAkdGhpcy0+bWF0Y2guJy4uLicgLiAiXG5eIjsKfQoKJHByZSA9IHN0cl9yZXBsYWNlKCJcbiIsICcnLCAkdGhpcy0+Z2V0UGFzdElucHV0KCkpOwokYyA9IHN0cl9yZXBlYXQoJy0nLCBtYXgoMCwgXHN0cmxlbigkcHJlKSAtIDEpKTsgCgpyZXR1cm4gJHByZSAuIHN0cl9yZXBsYWNlKCJcbiIsICcnLCAkdGhpcy0+Z2V0VXBjb21pbmdJbnB1dCgpKSAuICJcbiIgLiAkYyAuICJeIjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhc3RJbnB1dCgpCnsKJHBhc3RMZW5ndGggPSAkdGhpcy0+b2Zmc2V0IC0gXHN0cmxlbigkdGhpcy0+bWF0Y2gpOwoKcmV0dXJuICgkcGFzdExlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgLiBzdWJzdHIoJHRoaXMtPmlucHV0LCBtYXgoMCwgJHBhc3RMZW5ndGggLSAyMCksIG1pbigyMCwgJHBhc3RMZW5ndGgpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVwY29taW5nSW5wdXQoKQp7CiRuZXh0ID0gJHRoaXMtPm1hdGNoOwppZiAoXHN0cmxlbigkbmV4dCkgPCAyMCkgewokbmV4dCAuPSBzdWJzdHIoJHRoaXMtPmlucHV0LCAkdGhpcy0+b2Zmc2V0LCAyMCAtIFxzdHJsZW4oJG5leHQpKTsKfQoKcmV0dXJuIHN1YnN0cigkbmV4dCwgMCwgMjApIC4gKFxzdHJsZW4oJG5leHQpID4gMjAgPyAnLi4uJyA6ICcnKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZ1bGxVcGNvbWluZ0lucHV0KCkKewokbmV4dCA9ICR0aGlzLT5tYXRjaDsKaWYgKHN1YnN0cigkbmV4dCwgMCwgMSkgPT09ICciJyAmJiBzdWJzdHJfY291bnQoJG5leHQsICciJykgPT09IDEpIHsKJGxlbiA9IFxzdHJsZW4oJHRoaXMtPmlucHV0KTsKaWYgKCRsZW4gPT09ICR0aGlzLT5vZmZzZXQpIHsKJHN0ckVuZCA9ICRsZW47Cn0gZWxzZSB7CiRzdHJFbmQgPSBtaW4oc3RycG9zKCR0aGlzLT5pbnB1dCwgJyInLCAkdGhpcy0+b2Zmc2V0ICsgMSkgPzogJGxlbiwgc3RycG9zKCR0aGlzLT5pbnB1dCwgIlxuIiwgJHRoaXMtPm9mZnNldCArIDEpID86ICRsZW4pOwp9CiRuZXh0IC49IHN1YnN0cigkdGhpcy0+aW5wdXQsICR0aGlzLT5vZmZzZXQsICRzdHJFbmQgLSAkdGhpcy0+b2Zmc2V0KTsKfSBlbHNlaWYgKFxzdHJsZW4oJG5leHQpIDwgMjApIHsKJG5leHQgLj0gc3Vic3RyKCR0aGlzLT5pbnB1dCwgJHRoaXMtPm9mZnNldCwgMjAgLSBcc3RybGVuKCRuZXh0KSk7Cn0KCnJldHVybiAkbmV4dDsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZUVycm9yKCRzdHIpCnsKdGhyb3cgbmV3IFBhcnNpbmdFeGNlcHRpb24oJHN0cik7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNraXBVbnRpbCgkdG9rZW4pCnsKJHN5bWJvbCA9ICR0aGlzLT5uZXh0KCk7CndoaWxlICgkc3ltYm9sICE9PSAkdG9rZW4gJiYgZmFsc2UgPT09ICR0aGlzLT5kb25lKSB7CiRzeW1ib2wgPSAkdGhpcy0+bmV4dCgpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbmV4dCgpCnsKaWYgKCR0aGlzLT5kb25lKSB7CnJldHVybiBzZWxmOjpFT0Y7Cn0KaWYgKCR0aGlzLT5vZmZzZXQgPT09IFxzdHJsZW4oJHRoaXMtPmlucHV0KSkgewokdGhpcy0+ZG9uZSA9IHRydWU7Cn0KCiR0b2tlbiA9IG51bGw7CiRtYXRjaCA9IG51bGw7CiRjb2wgPSBudWxsOwokbGluZXMgPSBudWxsOwoKaWYgKCEkdGhpcy0+bW9yZSkgewokdGhpcy0+eXl0ZXh0ID0gJyc7CiR0aGlzLT5tYXRjaCA9ICcnOwp9CgokcnVsZXNMZW4gPSBjb3VudCgkdGhpcy0+cnVsZXMpOwoKZm9yICgkaT0wOyAkaSA8ICRydWxlc0xlbjsgJGkrKykgewppZiAocHJlZ19tYXRjaCgkdGhpcy0+cnVsZXNbJGldLCAkdGhpcy0+aW5wdXQsICRtYXRjaCwgMCwgJHRoaXMtPm9mZnNldCkpIHsKJGxpbmVzID0gZXhwbG9kZSgiXG4iLCAkbWF0Y2hbMF0pOwphcnJheV9zaGlmdCgkbGluZXMpOwokbGluZUNvdW50ID0gXGNvdW50KCRsaW5lcyk7CiR0aGlzLT55eWxpbmVubyArPSAkbGluZUNvdW50OwokdGhpcy0+eXlsbG9jID0gYXJyYXkoCidmaXJzdF9saW5lJyA9PiAkdGhpcy0+eXlsbG9jWydsYXN0X2xpbmUnXSwKJ2xhc3RfbGluZScgPT4gJHRoaXMtPnl5bGluZW5vKzEsCidmaXJzdF9jb2x1bW4nID0+ICR0aGlzLT55eWxsb2NbJ2xhc3RfY29sdW1uJ10sCidsYXN0X2NvbHVtbicgPT4gJGxpbmVDb3VudCA+IDAgPyBcc3RybGVuKCRsaW5lc1skbGluZUNvdW50IC0gMV0pIDogJHRoaXMtPnl5bGxvY1snbGFzdF9jb2x1bW4nXSArIFxzdHJsZW4oJG1hdGNoWzBdKSwKKTsKJHRoaXMtPnl5dGV4dCAuPSAkbWF0Y2hbMF07CiR0aGlzLT5tYXRjaCAuPSAkbWF0Y2hbMF07CiR0aGlzLT55eWxlbmcgPSBcc3RybGVuKCR0aGlzLT55eXRleHQpOwokdGhpcy0+bW9yZSA9IGZhbHNlOwokdGhpcy0+b2Zmc2V0ICs9IFxzdHJsZW4oJG1hdGNoWzBdKTsKcmV0dXJuICR0aGlzLT5wZXJmb3JtQWN0aW9uKCRpKTsKfQp9CgppZiAoJHRoaXMtPm9mZnNldCA9PT0gXHN0cmxlbigkdGhpcy0+aW5wdXQpKSB7CnJldHVybiBzZWxmOjpFT0Y7Cn0KCiR0aGlzLT5wYXJzZUVycm9yKAonTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgLiAoJHRoaXMtPnl5bGluZW5vKzEpIC4gIi4gVW5yZWNvZ25pemVkIHRleHQuXG4iIC4gJHRoaXMtPnNob3dQb3NpdGlvbigpCik7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBlcmZvcm1BY3Rpb24oJHJ1bGUpCnsKc3dpdGNoICgkcnVsZSkgewpjYXNlIDA6CnJldHVybiBzZWxmOjpUX0JSRUFLX0xJTkU7CmNhc2UgMToKcmV0dXJuIHNlbGY6OlRfU0tJUF9XSElURVNQQUNFOwpjYXNlIDI6CnJldHVybiA2OwpjYXNlIDM6CiR0aGlzLT55eXRleHQgPSBzdWJzdHIoJHRoaXMtPnl5dGV4dCwgMSwgJHRoaXMtPnl5bGVuZy0yKTsKcmV0dXJuIDQ7CmNhc2UgNDoKcmV0dXJuIDE3OwpjYXNlIDU6CnJldHVybiAxODsKY2FzZSA2OgpyZXR1cm4gMjM7CmNhc2UgNzoKcmV0dXJuIDI0OwpjYXNlIDg6CnJldHVybiAyMjsKY2FzZSA5OgpyZXR1cm4gMjE7CmNhc2UgMTA6CnJldHVybiAxMDsKY2FzZSAxMToKcmV0dXJuIDExOwpjYXNlIDEyOgpyZXR1cm4gODsKY2FzZSAxMzoKcmV0dXJuIDE0OwpjYXNlIDE0OgpyZXR1cm4gc2VsZjo6VF9DT01NRU5UOwpjYXNlIDE1OgpyZXR1cm4gc2VsZjo6VF9PUEVOX0NPTU1FTlQ7CmNhc2UgMTY6CnJldHVybiBzZWxmOjpUX0NMT1NFX0NPTU1FTlQ7CmNhc2UgMTc6CnJldHVybiBzZWxmOjpUX0lOVkFMSUQ7CmRlZmF1bHQ6CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1Vuc3VwcG9ydGVkIHJ1bGUgJy4kcnVsZSk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU2VsZFxKc29uTGludDsKCmNsYXNzIFBhcnNpbmdFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uCnsKCgoKcHJvdGVjdGVkICRkZXRhaWxzOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGRldGFpbHMgPSBhcnJheSgpKQp7CiR0aGlzLT5kZXRhaWxzID0gJGRldGFpbHM7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV0YWlscygpCnsKcmV0dXJuICR0aGlzLT5kZXRhaWxzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTZWxkXEpzb25MaW50OwoKY2xhc3MgVW5kZWZpbmVkCnsKfQoKQ29weXJpZ2h0IChjKSAyMDE1IEpvcmRpIEJvZ2dpYW5vCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTZWxkXFBoYXJVdGlsczsKCmNsYXNzIExpbnRlcgp7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbGludCgkcGF0aCwgYXJyYXkgJGV4Y2x1ZGVkUGF0aHMgPSBhcnJheSgpKQp7CiRwaHAgPSBkZWZpbmVkKCdQSFBfQklOQVJZJykgPyBQSFBfQklOQVJZIDogJ3BocCc7CgppZiAoJGlzV2luZG93cyA9IGRlZmluZWQoJ1BIUF9XSU5ET1dTX1ZFUlNJT05fQlVJTEQnKSkgewokdG1wRmlsZSA9IEB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgJycpOwoKaWYgKCEkdG1wRmlsZSB8fCAhaXNfd3JpdGFibGUoJHRtcEZpbGUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIGNyZWF0ZSB0ZW1wIGZpbGUnKTsKfQoKJHBocCA9IHNlbGY6OmVzY2FwZVdpbmRvd3NQYXRoKCRwaHApOwokdG1wRmlsZSA9IHNlbGY6OmVzY2FwZVdpbmRvd3NQYXRoKCR0bXBGaWxlKTsKCgppZiAoUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKJGZvcm1hdCA9ICclcyAtbCAlcyc7Cn0gZWxzZSB7CiRmb3JtYXQgPSAnIiVzIC1sICVzIic7Cn0KCiRjb21tYW5kID0gc3ByaW50ZigkZm9ybWF0LCAkcGhwLCAkdG1wRmlsZSk7Cn0gZWxzZSB7CiRjb21tYW5kID0gIiciLiRwaHAuIicgLWwiOwp9CgokZGVzY3JpcHRvcnNwZWMgPSBhcnJheSgKMCA9PiBhcnJheSgncGlwZScsICdyJyksCjEgPT4gYXJyYXkoJ3BpcGUnLCAndycpLAoyID0+IGFycmF5KCdwaXBlJywgJ3cnKQopOwoKCiRiYXNlTGVuID0gc3RybGVuKHJlYWxwYXRoKCRwYXRoKSkgKyA3ICsgMTsKZm9yZWFjaCAobmV3IFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBcUGhhcigkcGF0aCkpIGFzICRmaWxlKSB7CmlmICgkZmlsZS0+aXNEaXIoKSkgewpjb250aW51ZTsKfQppZiAoc3Vic3RyKCRmaWxlLCAtNCkgPT09ICcucGhwJykgewokZmlsZW5hbWUgPSAoc3RyaW5nKSAkZmlsZTsKaWYgKGluX2FycmF5KHN1YnN0cigkZmlsZW5hbWUsICRiYXNlTGVuKSwgJGV4Y2x1ZGVkUGF0aHMsIHRydWUpKSB7CmNvbnRpbnVlOwp9CmlmICgkaXNXaW5kb3dzKSB7CmZpbGVfcHV0X2NvbnRlbnRzKCR0bXBGaWxlLCBmaWxlX2dldF9jb250ZW50cygkZmlsZW5hbWUpKTsKfQoKJHByb2Nlc3MgPSBwcm9jX29wZW4oJGNvbW1hbmQsICRkZXNjcmlwdG9yc3BlYywgJHBpcGVzKTsKaWYgKGlzX3Jlc291cmNlKCRwcm9jZXNzKSkgewppZiAoISRpc1dpbmRvd3MpIHsKZndyaXRlKCRwaXBlc1swXSwgZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKSk7Cn0KZmNsb3NlKCRwaXBlc1swXSk7Cgokc3Rkb3V0ID0gc3RyZWFtX2dldF9jb250ZW50cygkcGlwZXNbMV0pOwpmY2xvc2UoJHBpcGVzWzFdKTsKJHN0ZGVyciA9IHN0cmVhbV9nZXRfY29udGVudHMoJHBpcGVzWzJdKTsKZmNsb3NlKCRwaXBlc1syXSk7CgokZXhpdENvZGUgPSBwcm9jX2Nsb3NlKCRwcm9jZXNzKTsKCmlmICgkZXhpdENvZGUgIT09IDApIHsKaWYgKCRpc1dpbmRvd3MpIHsKJHN0ZGVyciA9IHN0cl9yZXBsYWNlKCR0bXBGaWxlLCAkZmlsZW5hbWUsICRzdGRlcnIpOwp9CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdGYWlsZWQgbGludGluZyAnLiRmaWxlLic6ICcuJHN0ZGVycik7Cn0KfSBlbHNlIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3Qgc3RhcnQgbGludGVyIHByb2Nlc3MnKTsKfQp9Cn0KCmlmICgkaXNXaW5kb3dzKSB7CkB1bmxpbmsoJHRtcEZpbGUpOwp9Cn0KCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGVzY2FwZVdpbmRvd3NQYXRoKCRwYXRoKQp7CgppZiAoc3RycGJyaygkcGF0aCwgIiAoKSIpICE9PSBmYWxzZSkgewokcGF0aCA9ICciJy4kcGF0aC4nIic7Cn0KCnJldHVybiAkcGF0aDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU2VsZFxQaGFyVXRpbHM7CgpjbGFzcyBUaW1lc3RhbXBzCnsKcHJpdmF0ZSAkY29udGVudHM7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGZpbGUpCnsKJHRoaXMtPmNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVwZGF0ZVRpbWVzdGFtcHMoJHRpbWVzdGFtcCA9IG51bGwpCnsKaWYgKCR0aW1lc3RhbXAgaW5zdGFuY2VvZiBcRGF0ZVRpbWUgfHwgJHRpbWVzdGFtcCBpbnN0YW5jZW9mIFxEYXRlVGltZUludGVyZmFjZSkgewokdGltZXN0YW1wID0gJHRpbWVzdGFtcC0+Z2V0VGltZXN0YW1wKCk7Cn0gZWxzZWlmIChpc19zdHJpbmcoJHRpbWVzdGFtcCkpIHsKJHRpbWVzdGFtcCA9IHN0cnRvdGltZSgkdGltZXN0YW1wKTsKfSBlbHNlaWYgKCFpc19pbnQoJHRpbWVzdGFtcCkpIHsKJHRpbWVzdGFtcCA9IHN0cnRvdGltZSgnMTk4NC0xMi0yNFQwMDowMDowMFonKTsKfQoKCmlmICghcHJlZ19tYXRjaCgne19fSEFMVF9DT01QSUxFUlwoXCk7KD86ICtcPz4pP1xyP1xufScsICR0aGlzLT5jb250ZW50cywgJG1hdGNoLCBQUkVHX09GRlNFVF9DQVBUVVJFKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBkZXRlY3QgdGhlIHN0dWJcJ3MgZW5kIGluIHRoZSBwaGFyJyk7Cn0KCgokcG9zID0gJG1hdGNoWzBdWzFdICsgc3RybGVuKCRtYXRjaFswXVswXSk7CiRzdHViRW5kID0gJHBvcyArICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKJHBvcyArPSA0OwoKJG51bUZpbGVzID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQ7CgoKJHBvcyArPSAyOwoKCiRwb3MgKz0gNDsKCiRhbGlhc0xlbmd0aCA9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKJHBvcyArPSA0ICsgJGFsaWFzTGVuZ3RoOwoKJG1ldGFkYXRhTGVuZ3RoID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQgKyAkbWV0YWRhdGFMZW5ndGg7Cgp3aGlsZSAoJHBvcyA8ICRzdHViRW5kKSB7CiRmaWxlbmFtZUxlbmd0aCA9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKJHBvcyArPSA0ICsgJGZpbGVuYW1lTGVuZ3RoOwoKCiRwb3MgKz0gNDsKCgokdGltZVN0YW1wQnl0ZXMgPSBwYWNrKCdMJywgJHRpbWVzdGFtcCk7CiR0aGlzLT5jb250ZW50c1skcG9zICsgMF0gPSAkdGltZVN0YW1wQnl0ZXNbMF07CiR0aGlzLT5jb250ZW50c1skcG9zICsgMV0gPSAkdGltZVN0YW1wQnl0ZXNbMV07CiR0aGlzLT5jb250ZW50c1skcG9zICsgMl0gPSAkdGltZVN0YW1wQnl0ZXNbMl07CiR0aGlzLT5jb250ZW50c1skcG9zICsgM10gPSAkdGltZVN0YW1wQnl0ZXNbM107CgoKJHBvcyArPSA0KjQ7CgokbWV0YWRhdGFMZW5ndGggPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNCArICRtZXRhZGF0YUxlbmd0aDsKCiRudW1GaWxlcy0tOwp9CgppZiAoJG51bUZpbGVzICE9PSAwKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0FsbCBmaWxlcyB3ZXJlIG5vdCBwcm9jZXNzZWQsIHNvbWV0aGluZyBtdXN0IGhhdmUgZ29uZSB3cm9uZycpOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2F2ZSgkcGF0aCwgJHNpZ25hdHVyZUFsZ28pCnsKJHBvcyA9ICR0aGlzLT5kZXRlcm1pbmVTaWduYXR1cmVCZWdpbigpOwoKJGFsZ29zID0gYXJyYXkoClxQaGFyOjpNRDUgPT4gJ21kNScsClxQaGFyOjpTSEExID0+ICdzaGExJywKXFBoYXI6OlNIQTI1NiA9PiAnc2hhMjU2JywKXFBoYXI6OlNIQTUxMiA9PiAnc2hhNTEyJywKKTsKCmlmICghaXNzZXQoJGFsZ29zWyRzaWduYXR1cmVBbGdvXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0ludmFsaWQgaGFzaCBhbGdvcml0aG0gZ2l2ZW46ICcuJHNpZ25hdHVyZUFsZ28uJyBleHBlY3RlZCBvbmUgb2YgUGhhcjo6TUQ1LCBQaGFyOjpTSEExLCBQaGFyOjpTSEEyNTYgb3IgUGhhcjo6U0hBNTEyJyk7Cn0KJGFsZ28gPSAkYWxnb3NbJHNpZ25hdHVyZUFsZ29dOwoKCgokc2lnbmF0dXJlID0gaGFzaCgkYWxnbywgc3Vic3RyKCR0aGlzLT5jb250ZW50cywgMCwgJHBvcyksIHRydWUpCgouIHBhY2soJ0wnLCAkc2lnbmF0dXJlQWxnbykKCi4gJ0dCTUInOwoKJHRoaXMtPmNvbnRlbnRzID0gc3Vic3RyKCR0aGlzLT5jb250ZW50cywgMCwgJHBvcykgLiAkc2lnbmF0dXJlOwoKcmV0dXJuIGZpbGVfcHV0X2NvbnRlbnRzKCRwYXRoLCAkdGhpcy0+Y29udGVudHMpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJlYWRVaW50KCRwb3MsICRieXRlcykKewokcmVzID0gdW5wYWNrKCdWJywgc3Vic3RyKCR0aGlzLT5jb250ZW50cywgJHBvcywgJGJ5dGVzKSk7CgpyZXR1cm4gJHJlc1sxXTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRldGVybWluZVNpZ25hdHVyZUJlZ2luKCkKewoKaWYgKCFwcmVnX21hdGNoKCd7X19IQUxUX0NPTVBJTEVSXChcKTsoPzogK1w/Pik/XHI/XG59JywgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gsIFBSRUdfT0ZGU0VUX0NBUFRVUkUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGRldGVjdCB0aGUgc3R1YlwncyBlbmQgaW4gdGhlIHBoYXInKTsKfQoKCiRwb3MgPSAkbWF0Y2hbMF1bMV0gKyBzdHJsZW4oJG1hdGNoWzBdWzBdKTsKJG1hbmlmZXN0RW5kID0gJHBvcyArIDQgKyAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CgokcG9zICs9IDQ7CiRudW1GaWxlcyA9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKCiRwb3MgKz0gNDsKCgokcG9zICs9IDI7CgoKJHBvcyArPSA0OwoKJGFsaWFzTGVuZ3RoID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQgKyAkYWxpYXNMZW5ndGg7CgokbWV0YWRhdGFMZW5ndGggPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNCArICRtZXRhZGF0YUxlbmd0aDsKCiRjb21wcmVzc2VkU2l6ZXMgPSAwOwp3aGlsZSAoKCRudW1GaWxlcyA+IDApICYmICgkcG9zIDwgJG1hbmlmZXN0RW5kIC0gMjQpKSB7CiRmaWxlbmFtZUxlbmd0aCA9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKJHBvcyArPSA0ICsgJGZpbGVuYW1lTGVuZ3RoOwoKCiRwb3MgKz0gMio0OwoKJGNvbXByZXNzZWRTaXplcyArPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CgokcG9zICs9IDMqNDsKCiRtZXRhZGF0YUxlbmd0aCA9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKJHBvcyArPSA0ICsgJG1ldGFkYXRhTGVuZ3RoOwoKJG51bUZpbGVzLS07Cn0KCmlmICgkbnVtRmlsZXMgIT09IDApIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQWxsIGZpbGVzIHdlcmUgbm90IHByb2Nlc3NlZCwgc29tZXRoaW5nIG11c3QgaGF2ZSBnb25lIHdyb25nJyk7Cn0KCnJldHVybiAkbWFuaWZlc3RFbmQgKyAkY29tcHJlc3NlZFNpemVzOwp9Cn0KCkNvcHlyaWdodCAoYykgMjAxNSBKb3JkaSBCb2dnaWFubwoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU2VsZFxTaWduYWw7Cgp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CnVzZSBDbG9zdXJlOwp1c2UgV2Vha1JlZmVyZW5jZTsKCgoKCmZpbmFsIGNsYXNzIFNpZ25hbEhhbmRsZXIKewoKCgoKCgoKcHVibGljIGNvbnN0IFNJR0hVUCA9ICdTSUdIVVAnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBTSUdJTlQgPSAnU0lHSU5UJzsKCgoKCgpwdWJsaWMgY29uc3QgU0lHUVVJVCA9ICdTSUdRVUlUJzsKCgoKCgpwdWJsaWMgY29uc3QgU0lHSUxMID0gJ1NJR0lMTCc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdUUkFQID0gJ1NJR1RSQVAnOwoKCgoKCgpwdWJsaWMgY29uc3QgU0lHQUJSVCA9ICdTSUdBQlJUJzsKCnB1YmxpYyBjb25zdCBTSUdJT1QgPSAnU0lHSU9UJzsKCgoKCgpwdWJsaWMgY29uc3QgU0lHQlVTID0gJ1NJR0JVUyc7CgpwdWJsaWMgY29uc3QgU0lHRlBFID0gJ1NJR0ZQRSc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdLSUxMID0gJ1NJR0tJTEwnOwoKCgoKcHVibGljIGNvbnN0IFNJR1VTUjEgPSAnU0lHVVNSMSc7CgoKCgpwdWJsaWMgY29uc3QgU0lHVVNSMiA9ICdTSUdVU1IyJzsKCgoKCgpwdWJsaWMgY29uc3QgU0lHU0VHViA9ICdTSUdTRUdWJzsKCgoKCgpwdWJsaWMgY29uc3QgU0lHUElQRSA9ICdTSUdQSVBFJzsKCgoKCgoKCnB1YmxpYyBjb25zdCBTSUdBTFJNID0gJ1NJR0FMUk0nOwoKCgoKCgpwdWJsaWMgY29uc3QgU0lHVEVSTSA9ICdTSUdURVJNJzsKCnB1YmxpYyBjb25zdCBTSUdTVEtGTFQgPSAnU0lHU1RLRkxUJzsKcHVibGljIGNvbnN0IFNJR0NMRCA9ICdTSUdDTEQnOwoKCgoKCgpwdWJsaWMgY29uc3QgU0lHQ0hMRCA9ICdTSUdDSExEJzsKCgoKCgpwdWJsaWMgY29uc3QgU0lHQ09OVCA9ICdTSUdDT05UJzsKCgoKCnB1YmxpYyBjb25zdCBTSUdTVE9QID0gJ1NJR1NUT1AnOwoKCgoKCgpwdWJsaWMgY29uc3QgU0lHVFNUUCA9ICdTSUdUU1RQJzsKCgoKCgpwdWJsaWMgY29uc3QgU0lHVFRJTiA9ICdTSUdUVElOJzsKCgoKCgpwdWJsaWMgY29uc3QgU0lHVFRPVSA9ICdTSUdUVE9VJzsKCgoKCnB1YmxpYyBjb25zdCBTSUdVUkcgPSAnU0lHVVJHJzsKCgoKCgoKCnB1YmxpYyBjb25zdCBTSUdYQ1BVID0gJ1NJR1hDUFUnOwoKCgoKcHVibGljIGNvbnN0IFNJR1hGU1ogPSAnU0lHWEZTWic7CgoKCgoKcHVibGljIGNvbnN0IFNJR1ZUQUxSTSA9ICdTSUdWVEFMUk0nOwoKCgoKCgpwdWJsaWMgY29uc3QgU0lHUFJPRiA9ICdTSUdQUk9GJzsKCgoKCnB1YmxpYyBjb25zdCBTSUdXSU5DSCA9ICdTSUdXSU5DSCc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdQT0xMID0gJ1NJR1BPTEwnOwoKcHVibGljIGNvbnN0IFNJR0lPID0gJ1NJR0lPJzsKCgoKCnB1YmxpYyBjb25zdCBTSUdQV1IgPSAnU0lHUFdSJzsKCgoKCgpwdWJsaWMgY29uc3QgU0lHU1lTID0gJ1NJR1NZUyc7CgpwdWJsaWMgY29uc3QgU0lHQkFCWSA9ICdTSUdCQUJZJzsKCgoKCnB1YmxpYyBjb25zdCBTSUdCUkVBSyA9ICdTSUdCUkVBSyc7Cgpwcml2YXRlIGNvbnN0IEFMTF9TSUdOQUxTID0gWwpzZWxmOjpTSUdIVVAsIHNlbGY6OlNJR0lOVCwgc2VsZjo6U0lHUVVJVCwgc2VsZjo6U0lHSUxMLCBzZWxmOjpTSUdUUkFQLCBzZWxmOjpTSUdBQlJULCBzZWxmOjpTSUdJT1QsIHNlbGY6OlNJR0JVUywKc2VsZjo6U0lHRlBFLCBzZWxmOjpTSUdLSUxMLCBzZWxmOjpTSUdVU1IxLCBzZWxmOjpTSUdVU1IyLCBzZWxmOjpTSUdTRUdWLCBzZWxmOjpTSUdQSVBFLCBzZWxmOjpTSUdBTFJNLCBzZWxmOjpTSUdURVJNLApzZWxmOjpTSUdTVEtGTFQsIHNlbGY6OlNJR0NMRCwgc2VsZjo6U0lHQ0hMRCwgc2VsZjo6U0lHQ09OVCwgc2VsZjo6U0lHU1RPUCwgc2VsZjo6U0lHVFNUUCwgc2VsZjo6U0lHVFRJTiwgc2VsZjo6U0lHVFRPVSwKc2VsZjo6U0lHVVJHLCBzZWxmOjpTSUdYQ1BVLCBzZWxmOjpTSUdYRlNaLCBzZWxmOjpTSUdWVEFMUk0sIHNlbGY6OlNJR1BST0YsIHNlbGY6OlNJR1dJTkNILCBzZWxmOjpTSUdQT0xMLCBzZWxmOjpTSUdJTywKc2VsZjo6U0lHUFdSLCBzZWxmOjpTSUdTWVMsIHNlbGY6OlNJR0JBQlksIHNlbGY6OlNJR0JSRUFLCl07CgoKCgpwcml2YXRlICR0cmlnZ2VyZWQgPSBudWxsOwoKCgoKCnByaXZhdGUgJHNpZ25hbHM7CgoKCgoKcHJpdmF0ZSAkbG9nZ2VyT3JDYWxsYmFjazsKCgoKCnByaXZhdGUgc3RhdGljICRoYW5kbGVycyA9IFtdOwoKCnByaXZhdGUgc3RhdGljICR3aW5kb3dzSGFuZGxlciA9IG51bGw7CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkc2lnbmFscywgJGxvZ2dlck9yQ2FsbGJhY2spCnsKaWYgKCFpc19jYWxsYWJsZSgkbG9nZ2VyT3JDYWxsYmFjaykgJiYgISRsb2dnZXJPckNhbGxiYWNrIGluc3RhbmNlb2YgTG9nZ2VySW50ZXJmYWNlICYmICRsb2dnZXJPckNhbGxiYWNrICE9PSBudWxsKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckbG9nZ2VyT3JDYWxsYmFjayBtdXN0IGJlIGEgJy5Mb2dnZXJJbnRlcmZhY2U6OmNsYXNzLicgaW5zdGFuY2UsIGEgY2FsbGFibGUsIG9yIG51bGwsICcuKGlzX29iamVjdCgkbG9nZ2VyT3JDYWxsYmFjaykgPyBnZXRfY2xhc3MoJGxvZ2dlck9yQ2FsbGJhY2spIDogZ2V0dHlwZSgkbG9nZ2VyT3JDYWxsYmFjaykpLicgcmVjZWl2ZWQuJyk7Cn0KCiR0aGlzLT5zaWduYWxzID0gJHNpZ25hbHM7CiR0aGlzLT5sb2dnZXJPckNhbGxiYWNrID0gJGxvZ2dlck9yQ2FsbGJhY2s7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdHJpZ2dlcihzdHJpbmcgJHNpZ25hbE5hbWUpOiB2b2lkCnsKJHRoaXMtPnRyaWdnZXJlZCA9ICRzaWduYWxOYW1lOwoKaWYgKCR0aGlzLT5sb2dnZXJPckNhbGxiYWNrIGluc3RhbmNlb2YgTG9nZ2VySW50ZXJmYWNlKSB7CiR0aGlzLT5sb2dnZXJPckNhbGxiYWNrLT5pbmZvKCdSZWNlaXZlZCAnLiRzaWduYWxOYW1lKTsKfSBlbHNlaWYgKCR0aGlzLT5sb2dnZXJPckNhbGxiYWNrICE9PSBudWxsKSB7CigkdGhpcy0+bG9nZ2VyT3JDYWxsYmFjaykoJHNpZ25hbE5hbWUsICR0aGlzKTsKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1RyaWdnZXJlZCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT50cmlnZ2VyZWQgIT09IG51bGw7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleGl0V2l0aExhc3RTaWduYWwoKTogdm9pZAp7CiRzaWduYWwgPSAkdGhpcy0+dHJpZ2dlcmVkID8/ICdTSUdJTlQnOwokc2lnbmFsID0gZGVmaW5lZCgkc2lnbmFsKSA/IGNvbnN0YW50KCRzaWduYWwpIDogMjsKCmlmIChmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2tpbGwnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHBpZCcpKSB7CnBjbnRsX3NpZ25hbCgkc2lnbmFsLCBTSUdfREZMKTsKcG9zaXhfa2lsbChwb3NpeF9nZXRwaWQoKSwgJHNpZ25hbCk7Cn0KCgoKZXhpdCgxMjggKyAkc2lnbmFsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCk6IHZvaWQKewokdGhpcy0+dHJpZ2dlcmVkID0gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQp7CiR0aGlzLT51bnJlZ2lzdGVyKCk7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoP2FycmF5ICRzaWduYWxzID0gbnVsbCwgJGxvZ2dlck9yQ2FsbGJhY2sgPSBudWxsKTogc2VsZgp7CmlmICgkc2lnbmFscyA9PT0gbnVsbCkgewokc2lnbmFscyA9IFtzZWxmOjpTSUdJTlQsIHNlbGY6OlNJR1RFUk1dOwp9CiRzaWduYWxzID0gYXJyYXlfbWFwKGZ1bmN0aW9uICgkc2lnbmFsKSB7CmlmIChpc19pbnQoJHNpZ25hbCkpIHsKcmV0dXJuIHNlbGY6OmdldFNpZ25hbE5hbWUoJHNpZ25hbCk7Cn0gZWxzZWlmICghaW5fYXJyYXkoJHNpZ25hbCwgc2VsZjo6QUxMX1NJR05BTFMsIHRydWUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckc2lnbmFscyBtdXN0IGJlIGFuIGFycmF5IG9mIFNJRyogY29uc3RhbnRzIG9yIHNlbGY6OlNJRyogY29uc3RhbnRzLCBnb3QgJy52YXJfZXhwb3J0KCRzaWduYWwsIHRydWUpKTsKfQpyZXR1cm4gJHNpZ25hbDsKfSwgKGFycmF5KSAkc2lnbmFscyk7CgokaGFuZGxlciA9IG5ldyBzZWxmKCRzaWduYWxzLCAkbG9nZ2VyT3JDYWxsYmFjayk7CgppZiAoUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKYXJyYXlfdW5zaGlmdChzZWxmOjokaGFuZGxlcnMsIFdlYWtSZWZlcmVuY2U6OmNyZWF0ZSgkaGFuZGxlcikpOwp9IGVsc2UgewphcnJheV91bnNoaWZ0KHNlbGY6OiRoYW5kbGVycywgJGhhbmRsZXIpOwp9CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdzYXBpX3dpbmRvd3Nfc2V0X2N0cmxfaGFuZGxlcicpICYmIFBIUF9TQVBJID09PSAnY2xpJyAmJiAoaW5fYXJyYXkoc2VsZjo6U0lHSU5ULCAkc2lnbmFscywgdHJ1ZSkgfHwgaW5fYXJyYXkoc2VsZjo6U0lHQlJFQUssICRzaWduYWxzLCB0cnVlKSkpIHsKaWYgKG51bGwgPT09IHNlbGY6OiR3aW5kb3dzSGFuZGxlcikgewpzZWxmOjokd2luZG93c0hhbmRsZXIgPSBDbG9zdXJlOjpmcm9tQ2FsbGFibGUoW3NlbGY6OmNsYXNzLCAnaGFuZGxlV2luZG93c1NpZ25hbCddKTsKc2FwaV93aW5kb3dzX3NldF9jdHJsX2hhbmRsZXIoc2VsZjo6JHdpbmRvd3NIYW5kbGVyKTsKfQp9CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdwY250bF9zaWduYWwnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3BjbnRsX2FzeW5jX3NpZ25hbHMnKSkgewpwY250bF9hc3luY19zaWduYWxzKHRydWUpOwoKc2VsZjo6cmVnaXN0ZXJQY250bEhhbmRsZXIoJHNpZ25hbHMpOwp9CgpyZXR1cm4gJGhhbmRsZXI7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVucmVnaXN0ZXIoKTogdm9pZAp7CiRzaWduYWxzID0gJHRoaXMtPnNpZ25hbHM7CgokaW5kZXggPSBmYWxzZTsKZm9yZWFjaCAoc2VsZjo6JGhhbmRsZXJzIGFzICRrZXkgPT4gJGhhbmRsZXIpIHsKaWYgKCgkaGFuZGxlciBpbnN0YW5jZW9mIFdlYWtSZWZlcmVuY2UgJiYgJGhhbmRsZXItPmdldCgpID09PSAkdGhpcykgfHwgJGhhbmRsZXIgPT09ICR0aGlzKSB7CiRpbmRleCA9ICRrZXk7CmJyZWFrOwp9Cn0KaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKCnJldHVybjsKfQoKdW5zZXQoc2VsZjo6JGhhbmRsZXJzWyRpbmRleF0pOwoKaWYgKHNlbGY6OiR3aW5kb3dzSGFuZGxlciAhPT0gbnVsbCAmJiAoaW5fYXJyYXkoc2VsZjo6U0lHSU5ULCAkc2lnbmFscywgdHJ1ZSkgfHwgaW5fYXJyYXkoc2VsZjo6U0lHQlJFQUssICRzaWduYWxzLCB0cnVlKSkpIHsKaWYgKHNlbGY6OmdldEhhbmRsZXJGb3Ioc2VsZjo6U0lHSU5UKSA9PT0gbnVsbCAmJiBzZWxmOjpnZXRIYW5kbGVyRm9yKHNlbGY6OlNJR0JSRUFLKSA9PT0gbnVsbCkgewpzYXBpX3dpbmRvd3Nfc2V0X2N0cmxfaGFuZGxlcihzZWxmOjokd2luZG93c0hhbmRsZXIsIGZhbHNlKTsKc2VsZjo6JHdpbmRvd3NIYW5kbGVyID0gbnVsbDsKfQp9CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdwY250bF9zaWduYWwnKSkgewpmb3JlYWNoICgkc2lnbmFscyBhcyAkc2lnbmFsKSB7CgppZiAoIWRlZmluZWQoJHNpZ25hbCkpIHsKY29udGludWU7Cn0KCgppZiAoc2VsZjo6Z2V0SGFuZGxlckZvcigkc2lnbmFsKSAhPT0gbnVsbCkgewpjb250aW51ZTsKfQoKcGNudGxfc2lnbmFsKGNvbnN0YW50KCRzaWduYWwpLCBTSUdfREZMKTsKfQp9Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1bnJlZ2lzdGVyQWxsKCk6IHZvaWQKewppZiAoc2VsZjo6JHdpbmRvd3NIYW5kbGVyICE9PSBudWxsKSB7CnNhcGlfd2luZG93c19zZXRfY3RybF9oYW5kbGVyKHNlbGY6OiR3aW5kb3dzSGFuZGxlciwgZmFsc2UpOwpzZWxmOjokd2luZG93c0hhbmRsZXIgPSBudWxsOwp9Cgpmb3JlYWNoIChzZWxmOjokaGFuZGxlcnMgYXMgJGtleSA9PiAkaGFuZGxlcikgewppZiAoJGhhbmRsZXIgaW5zdGFuY2VvZiBXZWFrUmVmZXJlbmNlKSB7CiRoYW5kbGVyID0gJGhhbmRsZXItPmdldCgpOwppZiAoJGhhbmRsZXIgPT09IG51bGwpIHsKdW5zZXQoc2VsZjo6JGhhbmRsZXJzWyRrZXldKTsKY29udGludWU7Cn0KfQokaGFuZGxlci0+dW5yZWdpc3RlcigpOwp9Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHJlZ2lzdGVyUGNudGxIYW5kbGVyKGFycmF5ICRzaWduYWxzKTogdm9pZAp7CnN0YXRpYyAkY2FsbGFibGU7CmlmICgkY2FsbGFibGUgPT09IG51bGwpIHsKJGNhbGxhYmxlID0gQ2xvc3VyZTo6ZnJvbUNhbGxhYmxlKFtzZWxmOjpjbGFzcywgJ2hhbmRsZVBjbnRsU2lnbmFsJ10pOwp9CmZvcmVhY2ggKCRzaWduYWxzIGFzICRzaWduYWwpIHsKCmlmICghZGVmaW5lZCgkc2lnbmFsKSkgewpjb250aW51ZTsKfQoKcGNudGxfc2lnbmFsKGNvbnN0YW50KCRzaWduYWwpLCAkY2FsbGFibGUpOwp9Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd3NTaWduYWwoaW50ICRldmVudCk6IHZvaWQKewppZiAoUEhQX1dJTkRPV1NfRVZFTlRfQ1RSTF9DID09PSAkZXZlbnQpIHsKc2VsZjo6Y2FsbEhhbmRsZXJGb3Ioc2VsZjo6U0lHSU5UKTsKfSBlbHNlaWYgKFBIUF9XSU5ET1dTX0VWRU5UX0NUUkxfQlJFQUsgPT09ICRldmVudCkgewpzZWxmOjpjYWxsSGFuZGxlckZvcihzZWxmOjpTSUdCUkVBSyk7Cn0KfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFuZGxlUGNudGxTaWduYWwoaW50ICRzaWduYWwpOiB2b2lkCnsKc2VsZjo6Y2FsbEhhbmRsZXJGb3Ioc2VsZjo6Z2V0U2lnbmFsTmFtZSgkc2lnbmFsKSk7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY2FsbEhhbmRsZXJGb3Ioc3RyaW5nICRzaWduYWwpOiB2b2lkCnsKJGhhbmRsZXIgPSBzZWxmOjpnZXRIYW5kbGVyRm9yKCRzaWduYWwpOwppZiAoJGhhbmRsZXIgIT09IG51bGwpIHsKJGhhbmRsZXItPnRyaWdnZXIoJHNpZ25hbCk7Cn0KfQoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0SGFuZGxlckZvcihzdHJpbmcgJHNpZ25hbCk6ID9zZWxmCnsKZm9yZWFjaCAoc2VsZjo6JGhhbmRsZXJzIGFzICRrZXkgPT4gJGhhbmRsZXIpIHsKaWYgKCRoYW5kbGVyIGluc3RhbmNlb2YgV2Vha1JlZmVyZW5jZSkgewokaGFuZGxlciA9ICRoYW5kbGVyLT5nZXQoKTsKaWYgKCRoYW5kbGVyID09PSBudWxsKSB7CnVuc2V0KHNlbGY6OiRoYW5kbGVyc1ska2V5XSk7CmNvbnRpbnVlOwp9Cn0KaWYgKGluX2FycmF5KCRzaWduYWwsICRoYW5kbGVyLT5zaWduYWxzLCB0cnVlKSkgewpyZXR1cm4gJGhhbmRsZXI7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldFNpZ25hbE5hbWUoaW50ICRzaWdubyk6IHN0cmluZwp7CnN0YXRpYyAkc2lnbmFscyA9IG51bGw7CmlmICgkc2lnbmFscyA9PT0gbnVsbCkgewokc2lnbmFscyA9IFtdOwpmb3JlYWNoIChzZWxmOjpBTExfU0lHTkFMUyBhcyAkdmFsdWUpIHsKaWYgKGRlZmluZWQoJHZhbHVlKSkgewokc2lnbmFsc1tjb25zdGFudCgkdmFsdWUpXSA9ICR2YWx1ZTsKfQp9Cn0KCmlmIChpc3NldCgkc2lnbmFsc1skc2lnbm9dKSkgewpyZXR1cm4gJHNpZ25hbHNbJHNpZ25vXTsKfQoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vua25vd24gc2lnbmFsICMnLiRzaWdubyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGU7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tcGxldGVDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXER1bXBDb21wbGV0aW9uQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxIZWxwQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxMYXp5Q29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxMaXN0Q29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxTaWduYWxhYmxlQ29tbWFuZEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZExvYWRlclxDb21tYW5kTG9hZGVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVDb21tYW5kRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVFcnJvckV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudFxDb25zb2xlU2lnbmFsRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVUZXJtaW5hdGVFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEV4Y2VwdGlvbkludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTmFtZXNwYWNlTm90Rm91bmRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcRGVidWdGb3JtYXR0ZXJIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxGb3JtYXR0ZXJIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXJTZXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxQcm9jZXNzSGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcUXVlc3Rpb25IZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XEFyZ3ZJbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcQXJyYXlJbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBd2FyZUludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcU2lnbmFsUmVnaXN0cnlcU2lnbmFsUmVnaXN0cnk7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFN0eWxlXFN5bWZvbnlTdHlsZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEVycm9ySGFuZGxlclxFcnJvckhhbmRsZXI7CnVzZSBTeW1mb255XENvbnRyYWN0c1xFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxSZXNldEludGVyZmFjZTsKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIEFwcGxpY2F0aW9uIGltcGxlbWVudHMgUmVzZXRJbnRlcmZhY2UKewpwcml2YXRlICRjb21tYW5kcyA9IFtdOwpwcml2YXRlICR3YW50SGVscHMgPSBmYWxzZTsKcHJpdmF0ZSAkcnVubmluZ0NvbW1hbmQ7CnByaXZhdGUgJG5hbWU7CnByaXZhdGUgJHZlcnNpb247CnByaXZhdGUgJGNvbW1hbmRMb2FkZXI7CnByaXZhdGUgJGNhdGNoRXhjZXB0aW9ucyA9IHRydWU7CnByaXZhdGUgJGF1dG9FeGl0ID0gdHJ1ZTsKcHJpdmF0ZSAkZGVmaW5pdGlvbjsKcHJpdmF0ZSAkaGVscGVyU2V0Owpwcml2YXRlICRkaXNwYXRjaGVyOwpwcml2YXRlICR0ZXJtaW5hbDsKcHJpdmF0ZSAkZGVmYXVsdENvbW1hbmQ7CnByaXZhdGUgJHNpbmdsZUNvbW1hbmQgPSBmYWxzZTsKcHJpdmF0ZSAkaW5pdGlhbGl6ZWQ7CnByaXZhdGUgJHNpZ25hbFJlZ2lzdHJ5Owpwcml2YXRlICRzaWduYWxzVG9EaXNwYXRjaEV2ZW50ID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lID0gJ1VOS05PV04nLCBzdHJpbmcgJHZlcnNpb24gPSAnVU5LTk9XTicpCnsKJHRoaXMtPm5hbWUgPSAkbmFtZTsKJHRoaXMtPnZlcnNpb24gPSAkdmVyc2lvbjsKJHRoaXMtPnRlcm1pbmFsID0gbmV3IFRlcm1pbmFsKCk7CiR0aGlzLT5kZWZhdWx0Q29tbWFuZCA9ICdsaXN0JzsKaWYgKFxkZWZpbmVkKCdTSUdJTlQnKSAmJiBTaWduYWxSZWdpc3RyeTo6aXNTdXBwb3J0ZWQoKSkgewokdGhpcy0+c2lnbmFsUmVnaXN0cnkgPSBuZXcgU2lnbmFsUmVnaXN0cnkoKTsKJHRoaXMtPnNpZ25hbHNUb0Rpc3BhdGNoRXZlbnQgPSBbXFNJR0lOVCwgXFNJR1RFUk0sIFxTSUdVU1IxLCBcU0lHVVNSMl07Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERpc3BhdGNoZXIoRXZlbnREaXNwYXRjaGVySW50ZXJmYWNlICRkaXNwYXRjaGVyKQp7CiR0aGlzLT5kaXNwYXRjaGVyID0gJGRpc3BhdGNoZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRDb21tYW5kTG9hZGVyKENvbW1hbmRMb2FkZXJJbnRlcmZhY2UgJGNvbW1hbmRMb2FkZXIpCnsKJHRoaXMtPmNvbW1hbmRMb2FkZXIgPSAkY29tbWFuZExvYWRlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNpZ25hbFJlZ2lzdHJ5KCk6IFNpZ25hbFJlZ2lzdHJ5CnsKaWYgKCEkdGhpcy0+c2lnbmFsUmVnaXN0cnkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1NpZ25hbHMgYXJlIG5vdCBzdXBwb3J0ZWQuIE1ha2Ugc3VyZSB0aGF0IHRoZSBgcGNudGxgIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWQgYW5kIHRoYXQgInBjbnRsXyoiIGZ1bmN0aW9ucyBhcmUgbm90IGRpc2FibGVkIGJ5IHlvdXIgcGhwLmluaVwncyAiZGlzYWJsZV9mdW5jdGlvbnMiIGRpcmVjdGl2ZS4nKTsKfQoKcmV0dXJuICR0aGlzLT5zaWduYWxSZWdpc3RyeTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFNpZ25hbHNUb0Rpc3BhdGNoRXZlbnQoaW50IC4uLiRzaWduYWxzVG9EaXNwYXRjaEV2ZW50KQp7CiR0aGlzLT5zaWduYWxzVG9EaXNwYXRjaEV2ZW50ID0gJHNpZ25hbHNUb0Rpc3BhdGNoRXZlbnQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcnVuKD9JbnB1dEludGVyZmFjZSAkaW5wdXQgPSBudWxsLCA/T3V0cHV0SW50ZXJmYWNlICRvdXRwdXQgPSBudWxsKQp7CmlmIChcZnVuY3Rpb25fZXhpc3RzKCdwdXRlbnYnKSkgewpAcHV0ZW52KCdMSU5FUz0nLiR0aGlzLT50ZXJtaW5hbC0+Z2V0SGVpZ2h0KCkpOwpAcHV0ZW52KCdDT0xVTU5TPScuJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpKTsKfQoKaWYgKG51bGwgPT09ICRpbnB1dCkgewokaW5wdXQgPSBuZXcgQXJndklucHV0KCk7Cn0KCmlmIChudWxsID09PSAkb3V0cHV0KSB7CiRvdXRwdXQgPSBuZXcgQ29uc29sZU91dHB1dCgpOwp9CgokcmVuZGVyRXhjZXB0aW9uID0gZnVuY3Rpb24gKFxUaHJvd2FibGUgJGUpIHVzZSAoJG91dHB1dCkgewppZiAoJG91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKJHRoaXMtPnJlbmRlclRocm93YWJsZSgkZSwgJG91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0gZWxzZSB7CiR0aGlzLT5yZW5kZXJUaHJvd2FibGUoJGUsICRvdXRwdXQpOwp9Cn07CmlmICgkcGhwSGFuZGxlciA9IHNldF9leGNlcHRpb25faGFuZGxlcigkcmVuZGVyRXhjZXB0aW9uKSkgewpyZXN0b3JlX2V4Y2VwdGlvbl9oYW5kbGVyKCk7CmlmICghXGlzX2FycmF5KCRwaHBIYW5kbGVyKSB8fCAhJHBocEhhbmRsZXJbMF0gaW5zdGFuY2VvZiBFcnJvckhhbmRsZXIpIHsKJGVycm9ySGFuZGxlciA9IHRydWU7Cn0gZWxzZWlmICgkZXJyb3JIYW5kbGVyID0gJHBocEhhbmRsZXJbMF0tPnNldEV4Y2VwdGlvbkhhbmRsZXIoJHJlbmRlckV4Y2VwdGlvbikpIHsKJHBocEhhbmRsZXJbMF0tPnNldEV4Y2VwdGlvbkhhbmRsZXIoJGVycm9ySGFuZGxlcik7Cn0KfQoKdHJ5IHsKJHRoaXMtPmNvbmZpZ3VyZUlPKCRpbnB1dCwgJG91dHB1dCk7CgokZXhpdENvZGUgPSAkdGhpcy0+ZG9SdW4oJGlucHV0LCAkb3V0cHV0KTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoISR0aGlzLT5jYXRjaEV4Y2VwdGlvbnMpIHsKdGhyb3cgJGU7Cn0KCiRyZW5kZXJFeGNlcHRpb24oJGUpOwoKJGV4aXRDb2RlID0gJGUtPmdldENvZGUoKTsKaWYgKGlzX251bWVyaWMoJGV4aXRDb2RlKSkgewokZXhpdENvZGUgPSAoaW50KSAkZXhpdENvZGU7CmlmICgkZXhpdENvZGUgPD0gMCkgewokZXhpdENvZGUgPSAxOwp9Cn0gZWxzZSB7CiRleGl0Q29kZSA9IDE7Cn0KfSBmaW5hbGx5IHsKCgppZiAoISRwaHBIYW5kbGVyKSB7CmlmIChzZXRfZXhjZXB0aW9uX2hhbmRsZXIoJHJlbmRlckV4Y2VwdGlvbikgPT09ICRyZW5kZXJFeGNlcHRpb24pIHsKcmVzdG9yZV9leGNlcHRpb25faGFuZGxlcigpOwp9CnJlc3RvcmVfZXhjZXB0aW9uX2hhbmRsZXIoKTsKfSBlbHNlaWYgKCEkZXJyb3JIYW5kbGVyKSB7CiRmaW5hbEhhbmRsZXIgPSAkcGhwSGFuZGxlclswXS0+c2V0RXhjZXB0aW9uSGFuZGxlcihudWxsKTsKaWYgKCRmaW5hbEhhbmRsZXIgIT09ICRyZW5kZXJFeGNlcHRpb24pIHsKJHBocEhhbmRsZXJbMF0tPnNldEV4Y2VwdGlvbkhhbmRsZXIoJGZpbmFsSGFuZGxlcik7Cn0KfQp9CgppZiAoJHRoaXMtPmF1dG9FeGl0KSB7CmlmICgkZXhpdENvZGUgPiAyNTUpIHsKJGV4aXRDb2RlID0gMjU1Owp9CgpleGl0KCRleGl0Q29kZSk7Cn0KCnJldHVybiAkZXhpdENvZGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRvUnVuKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKFsnLS12ZXJzaW9uJywgJy1WJ10sIHRydWUpKSB7CiRvdXRwdXQtPndyaXRlbG4oJHRoaXMtPmdldExvbmdWZXJzaW9uKCkpOwoKcmV0dXJuIDA7Cn0KCnRyeSB7CgokaW5wdXQtPmJpbmQoJHRoaXMtPmdldERlZmluaXRpb24oKSk7Cn0gY2F0Y2ggKEV4Y2VwdGlvbkludGVyZmFjZSAkZSkgewoKfQoKJG5hbWUgPSAkdGhpcy0+Z2V0Q29tbWFuZE5hbWUoJGlucHV0KTsKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKFsnLS1oZWxwJywgJy1oJ10sIHRydWUpKSB7CmlmICghJG5hbWUpIHsKJG5hbWUgPSAnaGVscCc7CiRpbnB1dCA9IG5ldyBBcnJheUlucHV0KFsnY29tbWFuZF9uYW1lJyA9PiAkdGhpcy0+ZGVmYXVsdENvbW1hbmRdKTsKfSBlbHNlIHsKJHRoaXMtPndhbnRIZWxwcyA9IHRydWU7Cn0KfQoKaWYgKCEkbmFtZSkgewokbmFtZSA9ICR0aGlzLT5kZWZhdWx0Q29tbWFuZDsKJGRlZmluaXRpb24gPSAkdGhpcy0+Z2V0RGVmaW5pdGlvbigpOwokZGVmaW5pdGlvbi0+c2V0QXJndW1lbnRzKGFycmF5X21lcmdlKAokZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCksClsKJ2NvbW1hbmQnID0+IG5ldyBJbnB1dEFyZ3VtZW50KCdjb21tYW5kJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICRkZWZpbml0aW9uLT5nZXRBcmd1bWVudCgnY29tbWFuZCcpLT5nZXREZXNjcmlwdGlvbigpLCAkbmFtZSksCl0KKSk7Cn0KCnRyeSB7CiR0aGlzLT5ydW5uaW5nQ29tbWFuZCA9IG51bGw7CgokY29tbWFuZCA9ICR0aGlzLT5maW5kKCRuYW1lKTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewppZiAoISgkZSBpbnN0YW5jZW9mIENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbiAmJiAhJGUgaW5zdGFuY2VvZiBOYW1lc3BhY2VOb3RGb3VuZEV4Y2VwdGlvbikgfHwgMSAhPT0gXGNvdW50KCRhbHRlcm5hdGl2ZXMgPSAkZS0+Z2V0QWx0ZXJuYXRpdmVzKCkpIHx8ICEkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewppZiAobnVsbCAhPT0gJHRoaXMtPmRpc3BhdGNoZXIpIHsKJGV2ZW50ID0gbmV3IENvbnNvbGVFcnJvckV2ZW50KCRpbnB1dCwgJG91dHB1dCwgJGUpOwokdGhpcy0+ZGlzcGF0Y2hlci0+ZGlzcGF0Y2goJGV2ZW50LCBDb25zb2xlRXZlbnRzOjpFUlJPUik7CgppZiAoMCA9PT0gJGV2ZW50LT5nZXRFeGl0Q29kZSgpKSB7CnJldHVybiAwOwp9CgokZSA9ICRldmVudC0+Z2V0RXJyb3IoKTsKfQoKdGhyb3cgJGU7Cn0KCiRhbHRlcm5hdGl2ZSA9ICRhbHRlcm5hdGl2ZXNbMF07Cgokc3R5bGUgPSBuZXcgU3ltZm9ueVN0eWxlKCRpbnB1dCwgJG91dHB1dCk7CiRvdXRwdXQtPndyaXRlbG4oJycpOwokZm9ybWF0dGVkQmxvY2sgPSAobmV3IEZvcm1hdHRlckhlbHBlcigpKS0+Zm9ybWF0QmxvY2soc3ByaW50ZignQ29tbWFuZCAiJXMiIGlzIG5vdCBkZWZpbmVkLicsICRuYW1lKSwgJ2Vycm9yJywgdHJ1ZSk7CiRvdXRwdXQtPndyaXRlbG4oJGZvcm1hdHRlZEJsb2NrKTsKaWYgKCEkc3R5bGUtPmNvbmZpcm0oc3ByaW50ZignRG8geW91IHdhbnQgdG8gcnVuICIlcyIgaW5zdGVhZD8gJywgJGFsdGVybmF0aXZlKSwgZmFsc2UpKSB7CmlmIChudWxsICE9PSAkdGhpcy0+ZGlzcGF0Y2hlcikgewokZXZlbnQgPSBuZXcgQ29uc29sZUVycm9yRXZlbnQoJGlucHV0LCAkb3V0cHV0LCAkZSk7CiR0aGlzLT5kaXNwYXRjaGVyLT5kaXNwYXRjaCgkZXZlbnQsIENvbnNvbGVFdmVudHM6OkVSUk9SKTsKCnJldHVybiAkZXZlbnQtPmdldEV4aXRDb2RlKCk7Cn0KCnJldHVybiAxOwp9CgokY29tbWFuZCA9ICR0aGlzLT5maW5kKCRhbHRlcm5hdGl2ZSk7Cn0KCmlmICgkY29tbWFuZCBpbnN0YW5jZW9mIExhenlDb21tYW5kKSB7CiRjb21tYW5kID0gJGNvbW1hbmQtPmdldENvbW1hbmQoKTsKfQoKJHRoaXMtPnJ1bm5pbmdDb21tYW5kID0gJGNvbW1hbmQ7CiRleGl0Q29kZSA9ICR0aGlzLT5kb1J1bkNvbW1hbmQoJGNvbW1hbmQsICRpbnB1dCwgJG91dHB1dCk7CiR0aGlzLT5ydW5uaW5nQ29tbWFuZCA9IG51bGw7CgpyZXR1cm4gJGV4aXRDb2RlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKQp7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWxwZXJTZXQoSGVscGVyU2V0ICRoZWxwZXJTZXQpCnsKJHRoaXMtPmhlbHBlclNldCA9ICRoZWxwZXJTZXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlbHBlclNldCgpCnsKaWYgKCEkdGhpcy0+aGVscGVyU2V0KSB7CiR0aGlzLT5oZWxwZXJTZXQgPSAkdGhpcy0+Z2V0RGVmYXVsdEhlbHBlclNldCgpOwp9CgpyZXR1cm4gJHRoaXMtPmhlbHBlclNldDsKfQoKcHVibGljIGZ1bmN0aW9uIHNldERlZmluaXRpb24oSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uKQp7CiR0aGlzLT5kZWZpbml0aW9uID0gJGRlZmluaXRpb247Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlZmluaXRpb24oKQp7CmlmICghJHRoaXMtPmRlZmluaXRpb24pIHsKJHRoaXMtPmRlZmluaXRpb24gPSAkdGhpcy0+Z2V0RGVmYXVsdElucHV0RGVmaW5pdGlvbigpOwp9CgppZiAoJHRoaXMtPnNpbmdsZUNvbW1hbmQpIHsKJGlucHV0RGVmaW5pdGlvbiA9ICR0aGlzLT5kZWZpbml0aW9uOwokaW5wdXREZWZpbml0aW9uLT5zZXRBcmd1bWVudHMoKTsKCnJldHVybiAkaW5wdXREZWZpbml0aW9uOwp9CgpyZXR1cm4gJHRoaXMtPmRlZmluaXRpb247Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShDb21wbGV0aW9uSW5wdXQgJGlucHV0LCBDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zKTogdm9pZAp7CmlmICgKQ29tcGxldGlvbklucHV0OjpUWVBFX0FSR1VNRU5UX1ZBTFVFID09PSAkaW5wdXQtPmdldENvbXBsZXRpb25UeXBlKCkKJiYgJ2NvbW1hbmQnID09PSAkaW5wdXQtPmdldENvbXBsZXRpb25OYW1lKCkKKSB7CiRjb21tYW5kTmFtZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmFsbCgpIGFzICRuYW1lID0+ICRjb21tYW5kKSB7CgppZiAoJGNvbW1hbmQtPmlzSGlkZGVuKCkgfHwgJGNvbW1hbmQtPmdldE5hbWUoKSAhPT0gJG5hbWUpIHsKY29udGludWU7Cn0KJGNvbW1hbmROYW1lc1tdID0gJGNvbW1hbmQtPmdldE5hbWUoKTsKZm9yZWFjaCAoJGNvbW1hbmQtPmdldEFsaWFzZXMoKSBhcyAkbmFtZSkgewokY29tbWFuZE5hbWVzW10gPSAkbmFtZTsKfQp9CiRzdWdnZXN0aW9ucy0+c3VnZ2VzdFZhbHVlcyhhcnJheV9maWx0ZXIoJGNvbW1hbmROYW1lcykpOwoKcmV0dXJuOwp9CgppZiAoQ29tcGxldGlvbklucHV0OjpUWVBFX09QVElPTl9OQU1FID09PSAkaW5wdXQtPmdldENvbXBsZXRpb25UeXBlKCkpIHsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0T3B0aW9ucygkdGhpcy0+Z2V0RGVmaW5pdGlvbigpLT5nZXRPcHRpb25zKCkpOwoKcmV0dXJuOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlbHAoKQp7CnJldHVybiAkdGhpcy0+Z2V0TG9uZ1ZlcnNpb24oKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJlRXhjZXB0aW9uc0NhdWdodCgpCnsKcmV0dXJuICR0aGlzLT5jYXRjaEV4Y2VwdGlvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDYXRjaEV4Y2VwdGlvbnMoYm9vbCAkYm9vbGVhbikKewokdGhpcy0+Y2F0Y2hFeGNlcHRpb25zID0gJGJvb2xlYW47Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzQXV0b0V4aXRFbmFibGVkKCkKewpyZXR1cm4gJHRoaXMtPmF1dG9FeGl0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b0V4aXQoYm9vbCAkYm9vbGVhbikKewokdGhpcy0+YXV0b0V4aXQgPSAkYm9vbGVhbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuICR0aGlzLT5uYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TmFtZShzdHJpbmcgJG5hbWUpCnsKJHRoaXMtPm5hbWUgPSAkbmFtZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpCnsKcmV0dXJuICR0aGlzLT52ZXJzaW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmVyc2lvbihzdHJpbmcgJHZlcnNpb24pCnsKJHRoaXMtPnZlcnNpb24gPSAkdmVyc2lvbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9uZ1ZlcnNpb24oKQp7CmlmICgnVU5LTk9XTicgIT09ICR0aGlzLT5nZXROYW1lKCkpIHsKaWYgKCdVTktOT1dOJyAhPT0gJHRoaXMtPmdldFZlcnNpb24oKSkgewpyZXR1cm4gc3ByaW50ZignJXMgPGluZm8+JXM8L2luZm8+JywgJHRoaXMtPmdldE5hbWUoKSwgJHRoaXMtPmdldFZlcnNpb24oKSk7Cn0KCnJldHVybiAkdGhpcy0+Z2V0TmFtZSgpOwp9CgpyZXR1cm4gJ0NvbnNvbGUgVG9vbCc7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gJHRoaXMtPmFkZChuZXcgQ29tbWFuZCgkbmFtZSkpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENvbW1hbmRzKGFycmF5ICRjb21tYW5kcykKewpmb3JlYWNoICgkY29tbWFuZHMgYXMgJGNvbW1hbmQpIHsKJHRoaXMtPmFkZCgkY29tbWFuZCk7Cn0KfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkKENvbW1hbmQgJGNvbW1hbmQpCnsKJHRoaXMtPmluaXQoKTsKCiRjb21tYW5kLT5zZXRBcHBsaWNhdGlvbigkdGhpcyk7CgppZiAoISRjb21tYW5kLT5pc0VuYWJsZWQoKSkgewokY29tbWFuZC0+c2V0QXBwbGljYXRpb24obnVsbCk7CgpyZXR1cm4gbnVsbDsKfQoKaWYgKCEkY29tbWFuZCBpbnN0YW5jZW9mIExhenlDb21tYW5kKSB7CgokY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpOwp9CgppZiAoISRjb21tYW5kLT5nZXROYW1lKCkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ1RoZSBjb21tYW5kIGRlZmluZWQgaW4gIiVzIiBjYW5ub3QgaGF2ZSBhbiBlbXB0eSBuYW1lLicsIGdldF9kZWJ1Z190eXBlKCRjb21tYW5kKSkpOwp9CgokdGhpcy0+Y29tbWFuZHNbJGNvbW1hbmQtPmdldE5hbWUoKV0gPSAkY29tbWFuZDsKCmZvcmVhY2ggKCRjb21tYW5kLT5nZXRBbGlhc2VzKCkgYXMgJGFsaWFzKSB7CiR0aGlzLT5jb21tYW5kc1skYWxpYXNdID0gJGNvbW1hbmQ7Cn0KCnJldHVybiAkY29tbWFuZDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICRuYW1lKQp7CiR0aGlzLT5pbml0KCk7CgppZiAoISR0aGlzLT5oYXMoJG5hbWUpKSB7CnRocm93IG5ldyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignVGhlIGNvbW1hbmQgIiVzIiBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgoKaWYgKCFpc3NldCgkdGhpcy0+Y29tbWFuZHNbJG5hbWVdKSkgewp0aHJvdyBuZXcgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiJXMiIGNvbW1hbmQgY2Fubm90IGJlIGZvdW5kIGJlY2F1c2UgaXQgaXMgcmVnaXN0ZXJlZCB1bmRlciBtdWx0aXBsZSBuYW1lcy4gTWFrZSBzdXJlIHlvdSBkb25cJ3Qgc2V0IGEgZGlmZmVyZW50IG5hbWUgdmlhIGNvbnN0cnVjdG9yIG9yICJzZXROYW1lKCkiLicsICRuYW1lKSk7Cn0KCiRjb21tYW5kID0gJHRoaXMtPmNvbW1hbmRzWyRuYW1lXTsKCmlmICgkdGhpcy0+d2FudEhlbHBzKSB7CiR0aGlzLT53YW50SGVscHMgPSBmYWxzZTsKCiRoZWxwQ29tbWFuZCA9ICR0aGlzLT5nZXQoJ2hlbHAnKTsKJGhlbHBDb21tYW5kLT5zZXRDb21tYW5kKCRjb21tYW5kKTsKCnJldHVybiAkaGVscENvbW1hbmQ7Cn0KCnJldHVybiAkY29tbWFuZDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzKHN0cmluZyAkbmFtZSkKewokdGhpcy0+aW5pdCgpOwoKcmV0dXJuIGlzc2V0KCR0aGlzLT5jb21tYW5kc1skbmFtZV0pIHx8ICgkdGhpcy0+Y29tbWFuZExvYWRlciAmJiAkdGhpcy0+Y29tbWFuZExvYWRlci0+aGFzKCRuYW1lKSAmJiAkdGhpcy0+YWRkKCR0aGlzLT5jb21tYW5kTG9hZGVyLT5nZXQoJG5hbWUpKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlcygpCnsKJG5hbWVzcGFjZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmFsbCgpIGFzICRjb21tYW5kKSB7CmlmICgkY29tbWFuZC0+aXNIaWRkZW4oKSkgewpjb250aW51ZTsKfQoKJG5hbWVzcGFjZXNbXSA9ICR0aGlzLT5leHRyYWN0QWxsTmFtZXNwYWNlcygkY29tbWFuZC0+Z2V0TmFtZSgpKTsKCmZvcmVhY2ggKCRjb21tYW5kLT5nZXRBbGlhc2VzKCkgYXMgJGFsaWFzKSB7CiRuYW1lc3BhY2VzW10gPSAkdGhpcy0+ZXh0cmFjdEFsbE5hbWVzcGFjZXMoJGFsaWFzKTsKfQp9CgpyZXR1cm4gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZShhcnJheV9maWx0ZXIoYXJyYXlfbWVyZ2UoW10sIC4uLiRuYW1lc3BhY2VzKSkpKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kTmFtZXNwYWNlKHN0cmluZyAkbmFtZXNwYWNlKQp7CiRhbGxOYW1lc3BhY2VzID0gJHRoaXMtPmdldE5hbWVzcGFjZXMoKTsKJGV4cHIgPSBpbXBsb2RlKCdbXjpdKjonLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCBleHBsb2RlKCc6JywgJG5hbWVzcGFjZSkpKS4nW146XSonOwokbmFtZXNwYWNlcyA9IHByZWdfZ3JlcCgne14nLiRleHByLid9JywgJGFsbE5hbWVzcGFjZXMpOwoKaWYgKGVtcHR5KCRuYW1lc3BhY2VzKSkgewokbWVzc2FnZSA9IHNwcmludGYoJ1RoZXJlIGFyZSBubyBjb21tYW5kcyBkZWZpbmVkIGluIHRoZSAiJXMiIG5hbWVzcGFjZS4nLCAkbmFtZXNwYWNlKTsKCmlmICgkYWx0ZXJuYXRpdmVzID0gJHRoaXMtPmZpbmRBbHRlcm5hdGl2ZXMoJG5hbWVzcGFjZSwgJGFsbE5hbWVzcGFjZXMpKSB7CmlmICgxID09IFxjb3VudCgkYWx0ZXJuYXRpdmVzKSkgewokbWVzc2FnZSAuPSAiXG5cbkRpZCB5b3UgbWVhbiB0aGlzP1xuICAgICI7Cn0gZWxzZSB7CiRtZXNzYWdlIC49ICJcblxuRGlkIHlvdSBtZWFuIG9uZSBvZiB0aGVzZT9cbiAgICAiOwp9CgokbWVzc2FnZSAuPSBpbXBsb2RlKCJcbiAgICAiLCAkYWx0ZXJuYXRpdmVzKTsKfQoKdGhyb3cgbmV3IE5hbWVzcGFjZU5vdEZvdW5kRXhjZXB0aW9uKCRtZXNzYWdlLCAkYWx0ZXJuYXRpdmVzKTsKfQoKJGV4YWN0ID0gXGluX2FycmF5KCRuYW1lc3BhY2UsICRuYW1lc3BhY2VzLCB0cnVlKTsKaWYgKFxjb3VudCgkbmFtZXNwYWNlcykgPiAxICYmICEkZXhhY3QpIHsKdGhyb3cgbmV3IE5hbWVzcGFjZU5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoIlRoZSBuYW1lc3BhY2UgXCIlc1wiIGlzIGFtYmlndW91cy5cbkRpZCB5b3UgbWVhbiBvbmUgb2YgdGhlc2U/XG4lcy4iLCAkbmFtZXNwYWNlLCAkdGhpcy0+Z2V0QWJicmV2aWF0aW9uU3VnZ2VzdGlvbnMoYXJyYXlfdmFsdWVzKCRuYW1lc3BhY2VzKSkpLCBhcnJheV92YWx1ZXMoJG5hbWVzcGFjZXMpKTsKfQoKcmV0dXJuICRleGFjdCA/ICRuYW1lc3BhY2UgOiByZXNldCgkbmFtZXNwYWNlcyk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZChzdHJpbmcgJG5hbWUpCnsKJHRoaXMtPmluaXQoKTsKCiRhbGlhc2VzID0gW107Cgpmb3JlYWNoICgkdGhpcy0+Y29tbWFuZHMgYXMgJGNvbW1hbmQpIHsKZm9yZWFjaCAoJGNvbW1hbmQtPmdldEFsaWFzZXMoKSBhcyAkYWxpYXMpIHsKaWYgKCEkdGhpcy0+aGFzKCRhbGlhcykpIHsKJHRoaXMtPmNvbW1hbmRzWyRhbGlhc10gPSAkY29tbWFuZDsKfQp9Cn0KCmlmICgkdGhpcy0+aGFzKCRuYW1lKSkgewpyZXR1cm4gJHRoaXMtPmdldCgkbmFtZSk7Cn0KCiRhbGxDb21tYW5kcyA9ICR0aGlzLT5jb21tYW5kTG9hZGVyID8gYXJyYXlfbWVyZ2UoJHRoaXMtPmNvbW1hbmRMb2FkZXItPmdldE5hbWVzKCksIGFycmF5X2tleXMoJHRoaXMtPmNvbW1hbmRzKSkgOiBhcnJheV9rZXlzKCR0aGlzLT5jb21tYW5kcyk7CiRleHByID0gaW1wbG9kZSgnW146XSo6JywgYXJyYXlfbWFwKCdwcmVnX3F1b3RlJywgZXhwbG9kZSgnOicsICRuYW1lKSkpLidbXjpdKic7CiRjb21tYW5kcyA9IHByZWdfZ3JlcCgne14nLiRleHByLid9JywgJGFsbENvbW1hbmRzKTsKCmlmIChlbXB0eSgkY29tbWFuZHMpKSB7CiRjb21tYW5kcyA9IHByZWdfZ3JlcCgne14nLiRleHByLid9aScsICRhbGxDb21tYW5kcyk7Cn0KCgppZiAoZW1wdHkoJGNvbW1hbmRzKSB8fCBcY291bnQocHJlZ19ncmVwKCd7XicuJGV4cHIuJyR9aScsICRjb21tYW5kcykpIDwgMSkgewppZiAoZmFsc2UgIT09ICRwb3MgPSBzdHJycG9zKCRuYW1lLCAnOicpKSB7CgokdGhpcy0+ZmluZE5hbWVzcGFjZShzdWJzdHIoJG5hbWUsIDAsICRwb3MpKTsKfQoKJG1lc3NhZ2UgPSBzcHJpbnRmKCdDb21tYW5kICIlcyIgaXMgbm90IGRlZmluZWQuJywgJG5hbWUpOwoKaWYgKCRhbHRlcm5hdGl2ZXMgPSAkdGhpcy0+ZmluZEFsdGVybmF0aXZlcygkbmFtZSwgJGFsbENvbW1hbmRzKSkgewoKJGFsdGVybmF0aXZlcyA9IGFycmF5X2ZpbHRlcigkYWx0ZXJuYXRpdmVzLCBmdW5jdGlvbiAoJG5hbWUpIHsKcmV0dXJuICEkdGhpcy0+Z2V0KCRuYW1lKS0+aXNIaWRkZW4oKTsKfSk7CgppZiAoMSA9PSBcY291bnQoJGFsdGVybmF0aXZlcykpIHsKJG1lc3NhZ2UgLj0gIlxuXG5EaWQgeW91IG1lYW4gdGhpcz9cbiAgICAiOwp9IGVsc2UgewokbWVzc2FnZSAuPSAiXG5cbkRpZCB5b3UgbWVhbiBvbmUgb2YgdGhlc2U/XG4gICAgIjsKfQokbWVzc2FnZSAuPSBpbXBsb2RlKCJcbiAgICAiLCAkYWx0ZXJuYXRpdmVzKTsKfQoKdGhyb3cgbmV3IENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbigkbWVzc2FnZSwgYXJyYXlfdmFsdWVzKCRhbHRlcm5hdGl2ZXMpKTsKfQoKCmlmIChcY291bnQoJGNvbW1hbmRzKSA+IDEpIHsKJGNvbW1hbmRMaXN0ID0gJHRoaXMtPmNvbW1hbmRMb2FkZXIgPyBhcnJheV9tZXJnZShhcnJheV9mbGlwKCR0aGlzLT5jb21tYW5kTG9hZGVyLT5nZXROYW1lcygpKSwgJHRoaXMtPmNvbW1hbmRzKSA6ICR0aGlzLT5jb21tYW5kczsKJGNvbW1hbmRzID0gYXJyYXlfdW5pcXVlKGFycmF5X2ZpbHRlcigkY29tbWFuZHMsIGZ1bmN0aW9uICgkbmFtZU9yQWxpYXMpIHVzZSAoJiRjb21tYW5kTGlzdCwgJGNvbW1hbmRzLCAmJGFsaWFzZXMpIHsKaWYgKCEkY29tbWFuZExpc3RbJG5hbWVPckFsaWFzXSBpbnN0YW5jZW9mIENvbW1hbmQpIHsKJGNvbW1hbmRMaXN0WyRuYW1lT3JBbGlhc10gPSAkdGhpcy0+Y29tbWFuZExvYWRlci0+Z2V0KCRuYW1lT3JBbGlhcyk7Cn0KCiRjb21tYW5kTmFtZSA9ICRjb21tYW5kTGlzdFskbmFtZU9yQWxpYXNdLT5nZXROYW1lKCk7CgokYWxpYXNlc1skbmFtZU9yQWxpYXNdID0gJGNvbW1hbmROYW1lOwoKcmV0dXJuICRjb21tYW5kTmFtZSA9PT0gJG5hbWVPckFsaWFzIHx8ICFcaW5fYXJyYXkoJGNvbW1hbmROYW1lLCAkY29tbWFuZHMpOwp9KSk7Cn0KCmlmIChcY291bnQoJGNvbW1hbmRzKSA+IDEpIHsKJHVzYWJsZVdpZHRoID0gJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpIC0gMTA7CiRhYmJyZXZzID0gYXJyYXlfdmFsdWVzKCRjb21tYW5kcyk7CiRtYXhMZW4gPSAwOwpmb3JlYWNoICgkYWJicmV2cyBhcyAkYWJicmV2KSB7CiRtYXhMZW4gPSBtYXgoSGVscGVyOjp3aWR0aCgkYWJicmV2KSwgJG1heExlbik7Cn0KJGFiYnJldnMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKCRjbWQpIHVzZSAoJGNvbW1hbmRMaXN0LCAkdXNhYmxlV2lkdGgsICRtYXhMZW4sICYkY29tbWFuZHMpIHsKaWYgKCRjb21tYW5kTGlzdFskY21kXS0+aXNIaWRkZW4oKSkgewp1bnNldCgkY29tbWFuZHNbYXJyYXlfc2VhcmNoKCRjbWQsICRjb21tYW5kcyldKTsKCnJldHVybiBmYWxzZTsKfQoKJGFiYnJldiA9IHN0cl9wYWQoJGNtZCwgJG1heExlbiwgJyAnKS4nICcuJGNvbW1hbmRMaXN0WyRjbWRdLT5nZXREZXNjcmlwdGlvbigpOwoKcmV0dXJuIEhlbHBlcjo6d2lkdGgoJGFiYnJldikgPiAkdXNhYmxlV2lkdGggPyBIZWxwZXI6OnN1YnN0cigkYWJicmV2LCAwLCAkdXNhYmxlV2lkdGggLSAzKS4nLi4uJyA6ICRhYmJyZXY7Cn0sIGFycmF5X3ZhbHVlcygkY29tbWFuZHMpKTsKCmlmIChcY291bnQoJGNvbW1hbmRzKSA+IDEpIHsKJHN1Z2dlc3Rpb25zID0gJHRoaXMtPmdldEFiYnJldmlhdGlvblN1Z2dlc3Rpb25zKGFycmF5X2ZpbHRlcigkYWJicmV2cykpOwoKdGhyb3cgbmV3IENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCJDb21tYW5kIFwiJXNcIiBpcyBhbWJpZ3VvdXMuXG5EaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlP1xuJXMuIiwgJG5hbWUsICRzdWdnZXN0aW9ucyksIGFycmF5X3ZhbHVlcygkY29tbWFuZHMpKTsKfQp9CgokY29tbWFuZCA9ICR0aGlzLT5nZXQocmVzZXQoJGNvbW1hbmRzKSk7CgppZiAoJGNvbW1hbmQtPmlzSGlkZGVuKCkpIHsKdGhyb3cgbmV3IENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgY29tbWFuZCAiJXMiIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCnJldHVybiAkY29tbWFuZDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbGwoP3N0cmluZyAkbmFtZXNwYWNlID0gbnVsbCkKewokdGhpcy0+aW5pdCgpOwoKaWYgKG51bGwgPT09ICRuYW1lc3BhY2UpIHsKaWYgKCEkdGhpcy0+Y29tbWFuZExvYWRlcikgewpyZXR1cm4gJHRoaXMtPmNvbW1hbmRzOwp9CgokY29tbWFuZHMgPSAkdGhpcy0+Y29tbWFuZHM7CmZvcmVhY2ggKCR0aGlzLT5jb21tYW5kTG9hZGVyLT5nZXROYW1lcygpIGFzICRuYW1lKSB7CmlmICghaXNzZXQoJGNvbW1hbmRzWyRuYW1lXSkgJiYgJHRoaXMtPmhhcygkbmFtZSkpIHsKJGNvbW1hbmRzWyRuYW1lXSA9ICR0aGlzLT5nZXQoJG5hbWUpOwp9Cn0KCnJldHVybiAkY29tbWFuZHM7Cn0KCiRjb21tYW5kcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+Y29tbWFuZHMgYXMgJG5hbWUgPT4gJGNvbW1hbmQpIHsKaWYgKCRuYW1lc3BhY2UgPT09ICR0aGlzLT5leHRyYWN0TmFtZXNwYWNlKCRuYW1lLCBzdWJzdHJfY291bnQoJG5hbWVzcGFjZSwgJzonKSArIDEpKSB7CiRjb21tYW5kc1skbmFtZV0gPSAkY29tbWFuZDsKfQp9CgppZiAoJHRoaXMtPmNvbW1hbmRMb2FkZXIpIHsKZm9yZWFjaCAoJHRoaXMtPmNvbW1hbmRMb2FkZXItPmdldE5hbWVzKCkgYXMgJG5hbWUpIHsKaWYgKCFpc3NldCgkY29tbWFuZHNbJG5hbWVdKSAmJiAkbmFtZXNwYWNlID09PSAkdGhpcy0+ZXh0cmFjdE5hbWVzcGFjZSgkbmFtZSwgc3Vic3RyX2NvdW50KCRuYW1lc3BhY2UsICc6JykgKyAxKSAmJiAkdGhpcy0+aGFzKCRuYW1lKSkgewokY29tbWFuZHNbJG5hbWVdID0gJHRoaXMtPmdldCgkbmFtZSk7Cn0KfQp9CgpyZXR1cm4gJGNvbW1hbmRzOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QWJicmV2aWF0aW9ucyhhcnJheSAkbmFtZXMpCnsKJGFiYnJldnMgPSBbXTsKZm9yZWFjaCAoJG5hbWVzIGFzICRuYW1lKSB7CmZvciAoJGxlbiA9IFxzdHJsZW4oJG5hbWUpOyAkbGVuID4gMDsgLS0kbGVuKSB7CiRhYmJyZXYgPSBzdWJzdHIoJG5hbWUsIDAsICRsZW4pOwokYWJicmV2c1skYWJicmV2XVtdID0gJG5hbWU7Cn0KfQoKcmV0dXJuICRhYmJyZXZzOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVuZGVyVGhyb3dhYmxlKFxUaHJvd2FibGUgJGUsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiRvdXRwdXQtPndyaXRlbG4oJycsIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1FVSUVUKTsKCiR0aGlzLT5kb1JlbmRlclRocm93YWJsZSgkZSwgJG91dHB1dCk7CgppZiAobnVsbCAhPT0gJHRoaXMtPnJ1bm5pbmdDb21tYW5kKSB7CiRvdXRwdXQtPndyaXRlbG4oc3ByaW50ZignPGluZm8+JXM8L2luZm8+JywgT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoc3ByaW50ZigkdGhpcy0+cnVubmluZ0NvbW1hbmQtPmdldFN5bm9wc2lzKCksICR0aGlzLT5nZXROYW1lKCkpKSksIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1FVSUVUKTsKJG91dHB1dC0+d3JpdGVsbignJywgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQpOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBkb1JlbmRlclRocm93YWJsZShcVGhyb3dhYmxlICRlLCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewpkbyB7CiRtZXNzYWdlID0gdHJpbSgkZS0+Z2V0TWVzc2FnZSgpKTsKaWYgKCcnID09PSAkbWVzc2FnZSB8fCBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJCT1NFIDw9ICRvdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CiRjbGFzcyA9IGdldF9kZWJ1Z190eXBlKCRlKTsKJHRpdGxlID0gc3ByaW50ZignICBbJXMlc10gICcsICRjbGFzcywgMCAhPT0gKCRjb2RlID0gJGUtPmdldENvZGUoKSkgPyAnICgnLiRjb2RlLicpJyA6ICcnKTsKJGxlbiA9IEhlbHBlcjo6d2lkdGgoJHRpdGxlKTsKfSBlbHNlIHsKJGxlbiA9IDA7Cn0KCmlmIChzdHJfY29udGFpbnMoJG1lc3NhZ2UsICJAYW5vbnltb3VzXDAiKSkgewokbWVzc2FnZSA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1thLXpBLVpfXHg3Zi1ceGZmXVtcXFxcYS16QS1aMC05X1x4N2YtXHhmZl0qK0Bhbm9ueW1vdXNceDAwLio/XC5waHAoPzoweD98OlswLTldKytcJCk/WzAtOWEtZkEtRl0rKy8nLCBmdW5jdGlvbiAoJG0pIHsKcmV0dXJuIGNsYXNzX2V4aXN0cygkbVswXSwgZmFsc2UpID8gKGdldF9wYXJlbnRfY2xhc3MoJG1bMF0pID86IGtleShjbGFzc19pbXBsZW1lbnRzKCRtWzBdKSkgPzogJ2NsYXNzJykuJ0Bhbm9ueW1vdXMnIDogJG1bMF07Cn0sICRtZXNzYWdlKTsKfQoKJHdpZHRoID0gJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpID8gJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpIC0gMSA6IFxQSFBfSU5UX01BWDsKJGxpbmVzID0gW107CmZvcmVhY2ggKCcnICE9PSAkbWVzc2FnZSA/IHByZWdfc3BsaXQoJy9ccj9cbi8nLCAkbWVzc2FnZSkgOiBbXSBhcyAkbGluZSkgewpmb3JlYWNoICgkdGhpcy0+c3BsaXRTdHJpbmdCeVdpZHRoKCRsaW5lLCAkd2lkdGggLSA0KSBhcyAkbGluZSkgewoKJGxpbmVMZW5ndGggPSBIZWxwZXI6OndpZHRoKCRsaW5lKSArIDQ7CiRsaW5lc1tdID0gWyRsaW5lLCAkbGluZUxlbmd0aF07CgokbGVuID0gbWF4KCRsaW5lTGVuZ3RoLCAkbGVuKTsKfQp9CgokbWVzc2FnZXMgPSBbXTsKaWYgKCEkZSBpbnN0YW5jZW9mIEV4Y2VwdGlvbkludGVyZmFjZSB8fCBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJCT1NFIDw9ICRvdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CiRtZXNzYWdlc1tdID0gc3ByaW50ZignPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+JywgT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoc3ByaW50ZignSW4gJXMgbGluZSAlczonLCBiYXNlbmFtZSgkZS0+Z2V0RmlsZSgpKSA/OiAnbi9hJywgJGUtPmdldExpbmUoKSA/OiAnbi9hJykpKTsKfQokbWVzc2FnZXNbXSA9ICRlbXB0eUxpbmUgPSBzcHJpbnRmKCc8ZXJyb3I+JXM8L2Vycm9yPicsIHN0cl9yZXBlYXQoJyAnLCAkbGVuKSk7CmlmICgnJyA9PT0gJG1lc3NhZ2UgfHwgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRSA8PSAkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewokbWVzc2FnZXNbXSA9IHNwcmludGYoJzxlcnJvcj4lcyVzPC9lcnJvcj4nLCAkdGl0bGUsIHN0cl9yZXBlYXQoJyAnLCBtYXgoMCwgJGxlbiAtIEhlbHBlcjo6d2lkdGgoJHRpdGxlKSkpKTsKfQpmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKJG1lc3NhZ2VzW10gPSBzcHJpbnRmKCc8ZXJyb3I+ICAlcyAgJXM8L2Vycm9yPicsIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRsaW5lWzBdKSwgc3RyX3JlcGVhdCgnICcsICRsZW4gLSAkbGluZVsxXSkpOwp9CiRtZXNzYWdlc1tdID0gJGVtcHR5TGluZTsKJG1lc3NhZ2VzW10gPSAnJzsKCiRvdXRwdXQtPndyaXRlbG4oJG1lc3NhZ2VzLCBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCk7CgppZiAoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRSA8PSAkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewokb3V0cHV0LT53cml0ZWxuKCc8Y29tbWVudD5FeGNlcHRpb24gdHJhY2U6PC9jb21tZW50PicsIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1FVSUVUKTsKCgokdHJhY2UgPSAkZS0+Z2V0VHJhY2UoKTsKCmFycmF5X3Vuc2hpZnQoJHRyYWNlLCBbCidmdW5jdGlvbicgPT4gJycsCidmaWxlJyA9PiAkZS0+Z2V0RmlsZSgpID86ICduL2EnLAonbGluZScgPT4gJGUtPmdldExpbmUoKSA/OiAnbi9hJywKJ2FyZ3MnID0+IFtdLApdKTsKCmZvciAoJGkgPSAwLCAkY291bnQgPSBcY291bnQoJHRyYWNlKTsgJGkgPCAkY291bnQ7ICsrJGkpIHsKJGNsYXNzID0gJHRyYWNlWyRpXVsnY2xhc3MnXSA/PyAnJzsKJHR5cGUgPSAkdHJhY2VbJGldWyd0eXBlJ10gPz8gJyc7CiRmdW5jdGlvbiA9ICR0cmFjZVskaV1bJ2Z1bmN0aW9uJ10gPz8gJyc7CiRmaWxlID0gJHRyYWNlWyRpXVsnZmlsZSddID8/ICduL2EnOwokbGluZSA9ICR0cmFjZVskaV1bJ2xpbmUnXSA/PyAnbi9hJzsKCiRvdXRwdXQtPndyaXRlbG4oc3ByaW50ZignICVzJXMgYXQgPGluZm8+JXM6JXM8L2luZm8+JywgJGNsYXNzLCAkZnVuY3Rpb24gPyAkdHlwZS4kZnVuY3Rpb24uJygpJyA6ICcnLCAkZmlsZSwgJGxpbmUpLCBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCk7Cn0KCiRvdXRwdXQtPndyaXRlbG4oJycsIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1FVSUVUKTsKfQp9IHdoaWxlICgkZSA9ICRlLT5nZXRQcmV2aW91cygpKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZUlPKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKFsnLS1hbnNpJ10sIHRydWUpKSB7CiRvdXRwdXQtPnNldERlY29yYXRlZCh0cnVlKTsKfSBlbHNlaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKFsnLS1uby1hbnNpJ10sIHRydWUpKSB7CiRvdXRwdXQtPnNldERlY29yYXRlZChmYWxzZSk7Cn0KCmlmICh0cnVlID09PSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbihbJy0tbm8taW50ZXJhY3Rpb24nLCAnLW4nXSwgdHJ1ZSkpIHsKJGlucHV0LT5zZXRJbnRlcmFjdGl2ZShmYWxzZSk7Cn0KCnN3aXRjaCAoJHNoZWxsVmVyYm9zaXR5ID0gKGludCkgZ2V0ZW52KCdTSEVMTF9WRVJCT1NJVFknKSkgewpjYXNlIC0xOgokb3V0cHV0LT5zZXRWZXJib3NpdHkoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQpOwpicmVhazsKY2FzZSAxOgokb3V0cHV0LT5zZXRWZXJib3NpdHkoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRSk7CmJyZWFrOwpjYXNlIDI6CiRvdXRwdXQtPnNldFZlcmJvc2l0eShPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UpOwpicmVhazsKY2FzZSAzOgokb3V0cHV0LT5zZXRWZXJib3NpdHkoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfREVCVUcpOwpicmVhazsKZGVmYXVsdDoKJHNoZWxsVmVyYm9zaXR5ID0gMDsKYnJlYWs7Cn0KCmlmICh0cnVlID09PSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbihbJy0tcXVpZXQnLCAnLXEnXSwgdHJ1ZSkpIHsKJG91dHB1dC0+c2V0VmVyYm9zaXR5KE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1FVSUVUKTsKJHNoZWxsVmVyYm9zaXR5ID0gLTE7Cn0gZWxzZSB7CmlmICgkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLXZ2dicsIHRydWUpIHx8ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLXZlcmJvc2U9MycsIHRydWUpIHx8IDMgPT09ICRpbnB1dC0+Z2V0UGFyYW1ldGVyT3B0aW9uKCctLXZlcmJvc2UnLCBmYWxzZSwgdHJ1ZSkpIHsKJG91dHB1dC0+c2V0VmVyYm9zaXR5KE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX0RFQlVHKTsKJHNoZWxsVmVyYm9zaXR5ID0gMzsKfSBlbHNlaWYgKCRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctdnYnLCB0cnVlKSB8fCAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS12ZXJib3NlPTInLCB0cnVlKSB8fCAyID09PSAkaW5wdXQtPmdldFBhcmFtZXRlck9wdGlvbignLS12ZXJib3NlJywgZmFsc2UsIHRydWUpKSB7CiRvdXRwdXQtPnNldFZlcmJvc2l0eShPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UpOwokc2hlbGxWZXJib3NpdHkgPSAyOwp9IGVsc2VpZiAoJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy12JywgdHJ1ZSkgfHwgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tdmVyYm9zZT0xJywgdHJ1ZSkgfHwgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tdmVyYm9zZScsIHRydWUpIHx8ICRpbnB1dC0+Z2V0UGFyYW1ldGVyT3B0aW9uKCctLXZlcmJvc2UnLCBmYWxzZSwgdHJ1ZSkpIHsKJG91dHB1dC0+c2V0VmVyYm9zaXR5KE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UpOwokc2hlbGxWZXJib3NpdHkgPSAxOwp9Cn0KCmlmICgtMSA9PT0gJHNoZWxsVmVyYm9zaXR5KSB7CiRpbnB1dC0+c2V0SW50ZXJhY3RpdmUoZmFsc2UpOwp9CgppZiAoXGZ1bmN0aW9uX2V4aXN0cygncHV0ZW52JykpIHsKQHB1dGVudignU0hFTExfVkVSQk9TSVRZPScuJHNoZWxsVmVyYm9zaXR5KTsKfQokX0VOVlsnU0hFTExfVkVSQk9TSVRZJ10gPSAkc2hlbGxWZXJib3NpdHk7CiRfU0VSVkVSWydTSEVMTF9WRVJCT1NJVFknXSA9ICRzaGVsbFZlcmJvc2l0eTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9SdW5Db21tYW5kKENvbW1hbmQgJGNvbW1hbmQsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKZm9yZWFjaCAoJGNvbW1hbmQtPmdldEhlbHBlclNldCgpIGFzICRoZWxwZXIpIHsKaWYgKCRoZWxwZXIgaW5zdGFuY2VvZiBJbnB1dEF3YXJlSW50ZXJmYWNlKSB7CiRoZWxwZXItPnNldElucHV0KCRpbnB1dCk7Cn0KfQoKaWYgKCR0aGlzLT5zaWduYWxzVG9EaXNwYXRjaEV2ZW50KSB7CiRjb21tYW5kU2lnbmFscyA9ICRjb21tYW5kIGluc3RhbmNlb2YgU2lnbmFsYWJsZUNvbW1hbmRJbnRlcmZhY2UgPyAkY29tbWFuZC0+Z2V0U3Vic2NyaWJlZFNpZ25hbHMoKSA6IFtdOwoKaWYgKCRjb21tYW5kU2lnbmFscyB8fCBudWxsICE9PSAkdGhpcy0+ZGlzcGF0Y2hlcikgewppZiAoISR0aGlzLT5zaWduYWxSZWdpc3RyeSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIHN1YnNjcmliZSB0byBzaWduYWwgZXZlbnRzLiBNYWtlIHN1cmUgdGhhdCB0aGUgYHBjbnRsYCBleHRlbnNpb24gaXMgaW5zdGFsbGVkIGFuZCB0aGF0ICJwY250bF8qIiBmdW5jdGlvbnMgYXJlIG5vdCBkaXNhYmxlZCBieSB5b3VyIHBocC5pbmlcJ3MgImRpc2FibGVfZnVuY3Rpb25zIiBkaXJlY3RpdmUuJyk7Cn0KCmlmIChUZXJtaW5hbDo6aGFzU3R0eUF2YWlsYWJsZSgpKSB7CiRzdHR5TW9kZSA9IHNoZWxsX2V4ZWMoJ3N0dHkgLWcnKTsKCmZvcmVhY2ggKFtcU0lHSU5ULCBcU0lHVEVSTV0gYXMgJHNpZ25hbCkgewokdGhpcy0+c2lnbmFsUmVnaXN0cnktPnJlZ2lzdGVyKCRzaWduYWwsIHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRzdHR5TW9kZSkgewpzaGVsbF9leGVjKCdzdHR5ICcuJHN0dHlNb2RlKTsKfSk7Cn0KfQp9CgppZiAobnVsbCAhPT0gJHRoaXMtPmRpc3BhdGNoZXIpIHsKZm9yZWFjaCAoJHRoaXMtPnNpZ25hbHNUb0Rpc3BhdGNoRXZlbnQgYXMgJHNpZ25hbCkgewokZXZlbnQgPSBuZXcgQ29uc29sZVNpZ25hbEV2ZW50KCRjb21tYW5kLCAkaW5wdXQsICRvdXRwdXQsICRzaWduYWwpOwoKJHRoaXMtPnNpZ25hbFJlZ2lzdHJ5LT5yZWdpc3Rlcigkc2lnbmFsLCBmdW5jdGlvbiAoJHNpZ25hbCwgJGhhc05leHQpIHVzZSAoJGV2ZW50KSB7CiR0aGlzLT5kaXNwYXRjaGVyLT5kaXNwYXRjaCgkZXZlbnQsIENvbnNvbGVFdmVudHM6OlNJR05BTCk7CgoKaWYgKCEkaGFzTmV4dCkgewppZiAoIVxpbl9hcnJheSgkc2lnbmFsLCBbXFNJR1VTUjEsIFxTSUdVU1IyXSwgdHJ1ZSkpIHsKZXhpdCgwKTsKfQp9Cn0pOwp9Cn0KCmZvcmVhY2ggKCRjb21tYW5kU2lnbmFscyBhcyAkc2lnbmFsKSB7CiR0aGlzLT5zaWduYWxSZWdpc3RyeS0+cmVnaXN0ZXIoJHNpZ25hbCwgWyRjb21tYW5kLCAnaGFuZGxlU2lnbmFsJ10pOwp9Cn0KCmlmIChudWxsID09PSAkdGhpcy0+ZGlzcGF0Y2hlcikgewpyZXR1cm4gJGNvbW1hbmQtPnJ1bigkaW5wdXQsICRvdXRwdXQpOwp9CgoKdHJ5IHsKJGNvbW1hbmQtPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKCk7CiRpbnB1dC0+YmluZCgkY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpKTsKfSBjYXRjaCAoRXhjZXB0aW9uSW50ZXJmYWNlICRlKSB7Cgp9CgokZXZlbnQgPSBuZXcgQ29uc29sZUNvbW1hbmRFdmVudCgkY29tbWFuZCwgJGlucHV0LCAkb3V0cHV0KTsKJGUgPSBudWxsOwoKdHJ5IHsKJHRoaXMtPmRpc3BhdGNoZXItPmRpc3BhdGNoKCRldmVudCwgQ29uc29sZUV2ZW50czo6Q09NTUFORCk7CgppZiAoJGV2ZW50LT5jb21tYW5kU2hvdWxkUnVuKCkpIHsKJGV4aXRDb2RlID0gJGNvbW1hbmQtPnJ1bigkaW5wdXQsICRvdXRwdXQpOwp9IGVsc2UgewokZXhpdENvZGUgPSBDb25zb2xlQ29tbWFuZEV2ZW50OjpSRVRVUk5fQ09ERV9ESVNBQkxFRDsKfQp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiRldmVudCA9IG5ldyBDb25zb2xlRXJyb3JFdmVudCgkaW5wdXQsICRvdXRwdXQsICRlLCAkY29tbWFuZCk7CiR0aGlzLT5kaXNwYXRjaGVyLT5kaXNwYXRjaCgkZXZlbnQsIENvbnNvbGVFdmVudHM6OkVSUk9SKTsKJGUgPSAkZXZlbnQtPmdldEVycm9yKCk7CgppZiAoMCA9PT0gJGV4aXRDb2RlID0gJGV2ZW50LT5nZXRFeGl0Q29kZSgpKSB7CiRlID0gbnVsbDsKfQp9CgokZXZlbnQgPSBuZXcgQ29uc29sZVRlcm1pbmF0ZUV2ZW50KCRjb21tYW5kLCAkaW5wdXQsICRvdXRwdXQsICRleGl0Q29kZSk7CiR0aGlzLT5kaXNwYXRjaGVyLT5kaXNwYXRjaCgkZXZlbnQsIENvbnNvbGVFdmVudHM6OlRFUk1JTkFURSk7CgppZiAobnVsbCAhPT0gJGUpIHsKdGhyb3cgJGU7Cn0KCnJldHVybiAkZXZlbnQtPmdldEV4aXRDb2RlKCk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbW1hbmROYW1lKElucHV0SW50ZXJmYWNlICRpbnB1dCkKewpyZXR1cm4gJHRoaXMtPnNpbmdsZUNvbW1hbmQgPyAkdGhpcy0+ZGVmYXVsdENvbW1hbmQgOiAkaW5wdXQtPmdldEZpcnN0QXJndW1lbnQoKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RGVmYXVsdElucHV0RGVmaW5pdGlvbigpCnsKcmV0dXJuIG5ldyBJbnB1dERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgnY29tbWFuZCcsIElucHV0QXJndW1lbnQ6OlJFUVVJUkVELCAnVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZScpLApuZXcgSW5wdXRPcHRpb24oJy0taGVscCcsICctaCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzcGxheSBoZWxwIGZvciB0aGUgZ2l2ZW4gY29tbWFuZC4gV2hlbiBubyBjb21tYW5kIGlzIGdpdmVuIGRpc3BsYXkgaGVscCBmb3IgdGhlIDxpbmZvPicuJHRoaXMtPmRlZmF1bHRDb21tYW5kLic8L2luZm8+IGNvbW1hbmQnKSwKbmV3IElucHV0T3B0aW9uKCctLXF1aWV0JywgJy1xJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3Qgb3V0cHV0IGFueSBtZXNzYWdlJyksCm5ldyBJbnB1dE9wdGlvbignLS12ZXJib3NlJywgJy12fHZ2fHZ2dicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSW5jcmVhc2UgdGhlIHZlcmJvc2l0eSBvZiBtZXNzYWdlczogMSBmb3Igbm9ybWFsIG91dHB1dCwgMiBmb3IgbW9yZSB2ZXJib3NlIG91dHB1dCBhbmQgMyBmb3IgZGVidWcnKSwKbmV3IElucHV0T3B0aW9uKCctLXZlcnNpb24nLCAnLVYnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc3BsYXkgdGhpcyBhcHBsaWNhdGlvbiB2ZXJzaW9uJyksCm5ldyBJbnB1dE9wdGlvbignLS1hbnNpJywgJycsIElucHV0T3B0aW9uOjpWQUxVRV9ORUdBVEFCTEUsICdGb3JjZSAob3IgZGlzYWJsZSAtLW5vLWFuc2kpIEFOU0kgb3V0cHV0JywgbnVsbCksCm5ldyBJbnB1dE9wdGlvbignLS1uby1pbnRlcmFjdGlvbicsICctbicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IGFzayBhbnkgaW50ZXJhY3RpdmUgcXVlc3Rpb24nKSwKXSk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldERlZmF1bHRDb21tYW5kcygpCnsKcmV0dXJuIFtuZXcgSGVscENvbW1hbmQoKSwgbmV3IExpc3RDb21tYW5kKCksIG5ldyBDb21wbGV0ZUNvbW1hbmQoKSwgbmV3IER1bXBDb21wbGV0aW9uQ29tbWFuZCgpXTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RGVmYXVsdEhlbHBlclNldCgpCnsKcmV0dXJuIG5ldyBIZWxwZXJTZXQoWwpuZXcgRm9ybWF0dGVySGVscGVyKCksCm5ldyBEZWJ1Z0Zvcm1hdHRlckhlbHBlcigpLApuZXcgUHJvY2Vzc0hlbHBlcigpLApuZXcgUXVlc3Rpb25IZWxwZXIoKSwKXSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0QWJicmV2aWF0aW9uU3VnZ2VzdGlvbnMoYXJyYXkgJGFiYnJldnMpOiBzdHJpbmcKewpyZXR1cm4gJyAgICAnLmltcGxvZGUoIlxuICAgICIsICRhYmJyZXZzKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleHRyYWN0TmFtZXNwYWNlKHN0cmluZyAkbmFtZSwgP2ludCAkbGltaXQgPSBudWxsKQp7CiRwYXJ0cyA9IGV4cGxvZGUoJzonLCAkbmFtZSwgLTEpOwoKcmV0dXJuIGltcGxvZGUoJzonLCBudWxsID09PSAkbGltaXQgPyAkcGFydHMgOiBcYXJyYXlfc2xpY2UoJHBhcnRzLCAwLCAkbGltaXQpKTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaW5kQWx0ZXJuYXRpdmVzKHN0cmluZyAkbmFtZSwgaXRlcmFibGUgJGNvbGxlY3Rpb24pOiBhcnJheQp7CiR0aHJlc2hvbGQgPSAxZTM7CiRhbHRlcm5hdGl2ZXMgPSBbXTsKCiRjb2xsZWN0aW9uUGFydHMgPSBbXTsKZm9yZWFjaCAoJGNvbGxlY3Rpb24gYXMgJGl0ZW0pIHsKJGNvbGxlY3Rpb25QYXJ0c1skaXRlbV0gPSBleHBsb2RlKCc6JywgJGl0ZW0pOwp9Cgpmb3JlYWNoIChleHBsb2RlKCc6JywgJG5hbWUpIGFzICRpID0+ICRzdWJuYW1lKSB7CmZvcmVhY2ggKCRjb2xsZWN0aW9uUGFydHMgYXMgJGNvbGxlY3Rpb25OYW1lID0+ICRwYXJ0cykgewokZXhpc3RzID0gaXNzZXQoJGFsdGVybmF0aXZlc1skY29sbGVjdGlvbk5hbWVdKTsKaWYgKCFpc3NldCgkcGFydHNbJGldKSAmJiAkZXhpc3RzKSB7CiRhbHRlcm5hdGl2ZXNbJGNvbGxlY3Rpb25OYW1lXSArPSAkdGhyZXNob2xkOwpjb250aW51ZTsKfSBlbHNlaWYgKCFpc3NldCgkcGFydHNbJGldKSkgewpjb250aW51ZTsKfQoKJGxldiA9IGxldmVuc2h0ZWluKCRzdWJuYW1lLCAkcGFydHNbJGldKTsKaWYgKCRsZXYgPD0gXHN0cmxlbigkc3VibmFtZSkgLyAzIHx8ICcnICE9PSAkc3VibmFtZSAmJiBzdHJfY29udGFpbnMoJHBhcnRzWyRpXSwgJHN1Ym5hbWUpKSB7CiRhbHRlcm5hdGl2ZXNbJGNvbGxlY3Rpb25OYW1lXSA9ICRleGlzdHMgPyAkYWx0ZXJuYXRpdmVzWyRjb2xsZWN0aW9uTmFtZV0gKyAkbGV2IDogJGxldjsKfSBlbHNlaWYgKCRleGlzdHMpIHsKJGFsdGVybmF0aXZlc1skY29sbGVjdGlvbk5hbWVdICs9ICR0aHJlc2hvbGQ7Cn0KfQp9Cgpmb3JlYWNoICgkY29sbGVjdGlvbiBhcyAkaXRlbSkgewokbGV2ID0gbGV2ZW5zaHRlaW4oJG5hbWUsICRpdGVtKTsKaWYgKCRsZXYgPD0gXHN0cmxlbigkbmFtZSkgLyAzIHx8IHN0cl9jb250YWlucygkaXRlbSwgJG5hbWUpKSB7CiRhbHRlcm5hdGl2ZXNbJGl0ZW1dID0gaXNzZXQoJGFsdGVybmF0aXZlc1skaXRlbV0pID8gJGFsdGVybmF0aXZlc1skaXRlbV0gLSAkbGV2IDogJGxldjsKfQp9CgokYWx0ZXJuYXRpdmVzID0gYXJyYXlfZmlsdGVyKCRhbHRlcm5hdGl2ZXMsIGZ1bmN0aW9uICgkbGV2KSB1c2UgKCR0aHJlc2hvbGQpIHsgcmV0dXJuICRsZXYgPCAyICogJHRocmVzaG9sZDsgfSk7Cmtzb3J0KCRhbHRlcm5hdGl2ZXMsIFxTT1JUX05BVFVSQUwgfCBcU09SVF9GTEFHX0NBU0UpOwoKcmV0dXJuIGFycmF5X2tleXMoJGFsdGVybmF0aXZlcyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlZmF1bHRDb21tYW5kKHN0cmluZyAkY29tbWFuZE5hbWUsIGJvb2wgJGlzU2luZ2xlQ29tbWFuZCA9IGZhbHNlKQp7CiR0aGlzLT5kZWZhdWx0Q29tbWFuZCA9IGV4cGxvZGUoJ3wnLCBsdHJpbSgkY29tbWFuZE5hbWUsICd8JykpWzBdOwoKaWYgKCRpc1NpbmdsZUNvbW1hbmQpIHsKCiR0aGlzLT5maW5kKCRjb21tYW5kTmFtZSk7CgokdGhpcy0+c2luZ2xlQ29tbWFuZCA9IHRydWU7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzU2luZ2xlQ29tbWFuZCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5zaW5nbGVDb21tYW5kOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNwbGl0U3RyaW5nQnlXaWR0aChzdHJpbmcgJHN0cmluZywgaW50ICR3aWR0aCk6IGFycmF5CnsKCgoKaWYgKGZhbHNlID09PSAkZW5jb2RpbmcgPSBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZywgbnVsbCwgdHJ1ZSkpIHsKcmV0dXJuIHN0cl9zcGxpdCgkc3RyaW5nLCAkd2lkdGgpOwp9CgokdXRmOFN0cmluZyA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJHN0cmluZywgJ3V0ZjgnLCAkZW5jb2RpbmcpOwokbGluZXMgPSBbXTsKJGxpbmUgPSAnJzsKCiRvZmZzZXQgPSAwOwp3aGlsZSAocHJlZ19tYXRjaCgnLy57MSwxMDAwMH0vdScsICR1dGY4U3RyaW5nLCAkbSwgMCwgJG9mZnNldCkpIHsKJG9mZnNldCArPSBcc3RybGVuKCRtWzBdKTsKCmZvcmVhY2ggKHByZWdfc3BsaXQoJy8vdScsICRtWzBdKSBhcyAkY2hhcikgewoKaWYgKG1iX3N0cndpZHRoKCRsaW5lLiRjaGFyLCAndXRmOCcpIDw9ICR3aWR0aCkgewokbGluZSAuPSAkY2hhcjsKY29udGludWU7Cn0KCiRsaW5lc1tdID0gc3RyX3BhZCgkbGluZSwgJHdpZHRoKTsKJGxpbmUgPSAkY2hhcjsKfQp9CgokbGluZXNbXSA9IFxjb3VudCgkbGluZXMpID8gc3RyX3BhZCgkbGluZSwgJHdpZHRoKSA6ICRsaW5lOwoKbWJfY29udmVydF92YXJpYWJsZXMoJGVuY29kaW5nLCAndXRmOCcsICRsaW5lcyk7CgpyZXR1cm4gJGxpbmVzOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdEFsbE5hbWVzcGFjZXMoc3RyaW5nICRuYW1lKTogYXJyYXkKewoKJHBhcnRzID0gZXhwbG9kZSgnOicsICRuYW1lLCAtMSk7CiRuYW1lc3BhY2VzID0gW107Cgpmb3JlYWNoICgkcGFydHMgYXMgJHBhcnQpIHsKaWYgKFxjb3VudCgkbmFtZXNwYWNlcykpIHsKJG5hbWVzcGFjZXNbXSA9IGVuZCgkbmFtZXNwYWNlcykuJzonLiRwYXJ0Owp9IGVsc2UgewokbmFtZXNwYWNlc1tdID0gJHBhcnQ7Cn0KfQoKcmV0dXJuICRuYW1lc3BhY2VzOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGluaXQoKQp7CmlmICgkdGhpcy0+aW5pdGlhbGl6ZWQpIHsKcmV0dXJuOwp9CiR0aGlzLT5pbml0aWFsaXplZCA9IHRydWU7Cgpmb3JlYWNoICgkdGhpcy0+Z2V0RGVmYXVsdENvbW1hbmRzKCkgYXMgJGNvbW1hbmQpIHsKJHRoaXMtPmFkZCgkY29tbWFuZCk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBdHRyaWJ1dGU7CgoKCgojW1xBdHRyaWJ1dGUoXEF0dHJpYnV0ZTo6VEFSR0VUX0NMQVNTKV0KY2xhc3MgQXNDb21tYW5kCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KApwdWJsaWMgc3RyaW5nICRuYW1lLApwdWJsaWMgP3N0cmluZyAkZGVzY3JpcHRpb24gPSBudWxsLAphcnJheSAkYWxpYXNlcyA9IFtdLApib29sICRoaWRkZW4gPSBmYWxzZSwKKSB7CmlmICghJGhpZGRlbiAmJiAhJGFsaWFzZXMpIHsKcmV0dXJuOwp9CgokbmFtZSA9IGV4cGxvZGUoJ3wnLCAkbmFtZSk7CiRuYW1lID0gYXJyYXlfbWVyZ2UoJG5hbWUsICRhbGlhc2VzKTsKCmlmICgkaGlkZGVuICYmICcnICE9PSAkbmFtZVswXSkgewphcnJheV91bnNoaWZ0KCRuYW1lLCAnJyk7Cn0KCiR0aGlzLT5uYW1lID0gaW1wbG9kZSgnfCcsICRuYW1lKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDSTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIEdpdGh1YkFjdGlvblJlcG9ydGVyCnsKcHJpdmF0ZSAkb3V0cHV0OwoKCgoKcHJpdmF0ZSBjb25zdCBFU0NBUEVEX0RBVEEgPSBbCiclJyA9PiAnJTI1JywKIlxyIiA9PiAnJTBEJywKIlxuIiA9PiAnJTBBJywKXTsKCgoKCnByaXZhdGUgY29uc3QgRVNDQVBFRF9QUk9QRVJUSUVTID0gWwonJScgPT4gJyUyNScsCiJcciIgPT4gJyUwRCcsCiJcbiIgPT4gJyUwQScsCic6JyA9PiAnJTNBJywKJywnID0+ICclMkMnLApdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0Owp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzR2l0aHViQWN0aW9uRW52aXJvbm1lbnQoKTogYm9vbAp7CnJldHVybiBmYWxzZSAhPT0gZ2V0ZW52KCdHSVRIVUJfQUNUSU9OUycpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlcnJvcihzdHJpbmcgJG1lc3NhZ2UsID9zdHJpbmcgJGZpbGUgPSBudWxsLCA/aW50ICRsaW5lID0gbnVsbCwgP2ludCAkY29sID0gbnVsbCk6IHZvaWQKewokdGhpcy0+bG9nKCdlcnJvcicsICRtZXNzYWdlLCAkZmlsZSwgJGxpbmUsICRjb2wpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YXJuaW5nKHN0cmluZyAkbWVzc2FnZSwgP3N0cmluZyAkZmlsZSA9IG51bGwsID9pbnQgJGxpbmUgPSBudWxsLCA/aW50ICRjb2wgPSBudWxsKTogdm9pZAp7CiR0aGlzLT5sb2coJ3dhcm5pbmcnLCAkbWVzc2FnZSwgJGZpbGUsICRsaW5lLCAkY29sKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVidWcoc3RyaW5nICRtZXNzYWdlLCA/c3RyaW5nICRmaWxlID0gbnVsbCwgP2ludCAkbGluZSA9IG51bGwsID9pbnQgJGNvbCA9IG51bGwpOiB2b2lkCnsKJHRoaXMtPmxvZygnZGVidWcnLCAkbWVzc2FnZSwgJGZpbGUsICRsaW5lLCAkY29sKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBsb2coc3RyaW5nICR0eXBlLCBzdHJpbmcgJG1lc3NhZ2UsID9zdHJpbmcgJGZpbGUgPSBudWxsLCA/aW50ICRsaW5lID0gbnVsbCwgP2ludCAkY29sID0gbnVsbCk6IHZvaWQKewoKJG1lc3NhZ2UgPSBzdHJ0cigkbWVzc2FnZSwgc2VsZjo6RVNDQVBFRF9EQVRBKTsKCmlmICghJGZpbGUpIHsKCiR0aGlzLT5vdXRwdXQtPndyaXRlbG4oc3ByaW50ZignOjolczo6JXMnLCAkdHlwZSwgJG1lc3NhZ2UpKTsKCnJldHVybjsKfQoKJHRoaXMtPm91dHB1dC0+d3JpdGVsbihzcHJpbnRmKCc6OiVzIGZpbGU9JXMsbGluZT0lcyxjb2w9JXM6OiVzJywgJHR5cGUsIHN0cnRyKCRmaWxlLCBzZWxmOjpFU0NBUEVEX1BST1BFUlRJRVMpLCBzdHJ0cigkbGluZSA/PyAxLCBzZWxmOjpFU0NBUEVEX1BST1BFUlRJRVMpLCBzdHJ0cigkY29sID8/IDAsIHNlbGY6OkVTQ0FQRURfUFJPUEVSVElFUyksICRtZXNzYWdlKSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGU7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKCgoKZmluYWwgY2xhc3MgQ29sb3IKewpwcml2YXRlIGNvbnN0IENPTE9SUyA9IFsKJ2JsYWNrJyA9PiAwLAoncmVkJyA9PiAxLAonZ3JlZW4nID0+IDIsCid5ZWxsb3cnID0+IDMsCidibHVlJyA9PiA0LAonbWFnZW50YScgPT4gNSwKJ2N5YW4nID0+IDYsCid3aGl0ZScgPT4gNywKJ2RlZmF1bHQnID0+IDksCl07Cgpwcml2YXRlIGNvbnN0IEJSSUdIVF9DT0xPUlMgPSBbCidncmF5JyA9PiAwLAonYnJpZ2h0LXJlZCcgPT4gMSwKJ2JyaWdodC1ncmVlbicgPT4gMiwKJ2JyaWdodC15ZWxsb3cnID0+IDMsCidicmlnaHQtYmx1ZScgPT4gNCwKJ2JyaWdodC1tYWdlbnRhJyA9PiA1LAonYnJpZ2h0LWN5YW4nID0+IDYsCidicmlnaHQtd2hpdGUnID0+IDcsCl07Cgpwcml2YXRlIGNvbnN0IEFWQUlMQUJMRV9PUFRJT05TID0gWwonYm9sZCcgPT4gWydzZXQnID0+IDEsICd1bnNldCcgPT4gMjJdLAondW5kZXJzY29yZScgPT4gWydzZXQnID0+IDQsICd1bnNldCcgPT4gMjRdLAonYmxpbmsnID0+IFsnc2V0JyA9PiA1LCAndW5zZXQnID0+IDI1XSwKJ3JldmVyc2UnID0+IFsnc2V0JyA9PiA3LCAndW5zZXQnID0+IDI3XSwKJ2NvbmNlYWwnID0+IFsnc2V0JyA9PiA4LCAndW5zZXQnID0+IDI4XSwKXTsKCnByaXZhdGUgJGZvcmVncm91bmQ7CnByaXZhdGUgJGJhY2tncm91bmQ7CnByaXZhdGUgJG9wdGlvbnMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGZvcmVncm91bmQgPSAnJywgc3RyaW5nICRiYWNrZ3JvdW5kID0gJycsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPmZvcmVncm91bmQgPSAkdGhpcy0+cGFyc2VDb2xvcigkZm9yZWdyb3VuZCk7CiR0aGlzLT5iYWNrZ3JvdW5kID0gJHRoaXMtPnBhcnNlQ29sb3IoJGJhY2tncm91bmQsIHRydWUpOwoKZm9yZWFjaCAoJG9wdGlvbnMgYXMgJG9wdGlvbikgewppZiAoIWlzc2V0KHNlbGY6OkFWQUlMQUJMRV9PUFRJT05TWyRvcHRpb25dKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgb3B0aW9uIHNwZWNpZmllZDogIiVzIi4gRXhwZWN0ZWQgb25lIG9mICglcykuJywgJG9wdGlvbiwgaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKHNlbGY6OkFWQUlMQUJMRV9PUFRJT05TKSkpKTsKfQoKJHRoaXMtPm9wdGlvbnNbJG9wdGlvbl0gPSBzZWxmOjpBVkFJTEFCTEVfT1BUSU9OU1skb3B0aW9uXTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gYXBwbHkoc3RyaW5nICR0ZXh0KTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zZXQoKS4kdGV4dC4kdGhpcy0+dW5zZXQoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldCgpOiBzdHJpbmcKewokc2V0Q29kZXMgPSBbXTsKaWYgKCcnICE9PSAkdGhpcy0+Zm9yZWdyb3VuZCkgewokc2V0Q29kZXNbXSA9ICR0aGlzLT5mb3JlZ3JvdW5kOwp9CmlmICgnJyAhPT0gJHRoaXMtPmJhY2tncm91bmQpIHsKJHNldENvZGVzW10gPSAkdGhpcy0+YmFja2dyb3VuZDsKfQpmb3JlYWNoICgkdGhpcy0+b3B0aW9ucyBhcyAkb3B0aW9uKSB7CiRzZXRDb2Rlc1tdID0gJG9wdGlvblsnc2V0J107Cn0KaWYgKDAgPT09IFxjb3VudCgkc2V0Q29kZXMpKSB7CnJldHVybiAnJzsKfQoKcmV0dXJuIHNwcmludGYoIlwwMzNbJXNtIiwgaW1wbG9kZSgnOycsICRzZXRDb2RlcykpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdW5zZXQoKTogc3RyaW5nCnsKJHVuc2V0Q29kZXMgPSBbXTsKaWYgKCcnICE9PSAkdGhpcy0+Zm9yZWdyb3VuZCkgewokdW5zZXRDb2Rlc1tdID0gMzk7Cn0KaWYgKCcnICE9PSAkdGhpcy0+YmFja2dyb3VuZCkgewokdW5zZXRDb2Rlc1tdID0gNDk7Cn0KZm9yZWFjaCAoJHRoaXMtPm9wdGlvbnMgYXMgJG9wdGlvbikgewokdW5zZXRDb2Rlc1tdID0gJG9wdGlvblsndW5zZXQnXTsKfQppZiAoMCA9PT0gXGNvdW50KCR1bnNldENvZGVzKSkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiBzcHJpbnRmKCJcMDMzWyVzbSIsIGltcGxvZGUoJzsnLCAkdW5zZXRDb2RlcykpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHBhcnNlQ29sb3Ioc3RyaW5nICRjb2xvciwgYm9vbCAkYmFja2dyb3VuZCA9IGZhbHNlKTogc3RyaW5nCnsKaWYgKCcnID09PSAkY29sb3IpIHsKcmV0dXJuICcnOwp9CgppZiAoJyMnID09PSAkY29sb3JbMF0pIHsKJGNvbG9yID0gc3Vic3RyKCRjb2xvciwgMSk7CgppZiAoMyA9PT0gXHN0cmxlbigkY29sb3IpKSB7CiRjb2xvciA9ICRjb2xvclswXS4kY29sb3JbMF0uJGNvbG9yWzFdLiRjb2xvclsxXS4kY29sb3JbMl0uJGNvbG9yWzJdOwp9CgppZiAoNiAhPT0gXHN0cmxlbigkY29sb3IpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignSW52YWxpZCAiJXMiIGNvbG9yLicsICRjb2xvcikpOwp9CgpyZXR1cm4gKCRiYWNrZ3JvdW5kID8gJzQnIDogJzMnKS4kdGhpcy0+Y29udmVydEhleENvbG9yVG9BbnNpKGhleGRlYygkY29sb3IpKTsKfQoKaWYgKGlzc2V0KHNlbGY6OkNPTE9SU1skY29sb3JdKSkgewpyZXR1cm4gKCRiYWNrZ3JvdW5kID8gJzQnIDogJzMnKS5zZWxmOjpDT0xPUlNbJGNvbG9yXTsKfQoKaWYgKGlzc2V0KHNlbGY6OkJSSUdIVF9DT0xPUlNbJGNvbG9yXSkpIHsKcmV0dXJuICgkYmFja2dyb3VuZCA/ICcxMCcgOiAnOScpLnNlbGY6OkJSSUdIVF9DT0xPUlNbJGNvbG9yXTsKfQoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdJbnZhbGlkICIlcyIgY29sb3I7IGV4cGVjdGVkIG9uZSBvZiAoJXMpLicsICRjb2xvciwgaW1wbG9kZSgnLCAnLCBhcnJheV9tZXJnZShhcnJheV9rZXlzKHNlbGY6OkNPTE9SUyksIGFycmF5X2tleXMoc2VsZjo6QlJJR0hUX0NPTE9SUykpKSkpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNvbnZlcnRIZXhDb2xvclRvQW5zaShpbnQgJGNvbG9yKTogc3RyaW5nCnsKJHIgPSAoJGNvbG9yID4+IDE2KSAmIDI1NTsKJGcgPSAoJGNvbG9yID4+IDgpICYgMjU1OwokYiA9ICRjb2xvciAmIDI1NTsKCgppZiAoJ3RydWVjb2xvcicgIT09IGdldGVudignQ09MT1JURVJNJykpIHsKcmV0dXJuIChzdHJpbmcpICR0aGlzLT5kZWdyYWRlSGV4Q29sb3JUb0Fuc2koJHIsICRnLCAkYik7Cn0KCnJldHVybiBzcHJpbnRmKCc4OzI7JWQ7JWQ7JWQnLCAkciwgJGcsICRiKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBkZWdyYWRlSGV4Q29sb3JUb0Fuc2koaW50ICRyLCBpbnQgJGcsIGludCAkYik6IGludAp7CmlmICgwID09PSByb3VuZCgkdGhpcy0+Z2V0U2F0dXJhdGlvbigkciwgJGcsICRiKSAvIDUwKSkgewpyZXR1cm4gMDsKfQoKcmV0dXJuIChyb3VuZCgkYiAvIDI1NSkgPDwgMikgfCAocm91bmQoJGcgLyAyNTUpIDw8IDEpIHwgcm91bmQoJHIgLyAyNTUpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFNhdHVyYXRpb24oaW50ICRyLCBpbnQgJGcsIGludCAkYik6IGludAp7CiRyID0gJHIgLyAyNTU7CiRnID0gJGcgLyAyNTU7CiRiID0gJGIgLyAyNTU7CiR2ID0gbWF4KCRyLCAkZywgJGIpOwoKaWYgKDAgPT09ICRkaWZmID0gJHYgLSBtaW4oJHIsICRnLCAkYikpIHsKcmV0dXJuIDA7Cn0KCnJldHVybiAoaW50KSAkZGlmZiAqIDEwMCAvICR2Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXR0cmlidXRlXEFzQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXJTZXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0RGVmaW5pdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBDb21tYW5kCnsKCnB1YmxpYyBjb25zdCBTVUNDRVNTID0gMDsKcHVibGljIGNvbnN0IEZBSUxVUkUgPSAxOwpwdWJsaWMgY29uc3QgSU5WQUxJRCA9IDI7CgoKCgpwcm90ZWN0ZWQgc3RhdGljICRkZWZhdWx0TmFtZTsKCgoKCnByb3RlY3RlZCBzdGF0aWMgJGRlZmF1bHREZXNjcmlwdGlvbjsKCnByaXZhdGUgJGFwcGxpY2F0aW9uOwpwcml2YXRlICRuYW1lOwpwcml2YXRlICRwcm9jZXNzVGl0bGU7CnByaXZhdGUgJGFsaWFzZXMgPSBbXTsKcHJpdmF0ZSAkZGVmaW5pdGlvbjsKcHJpdmF0ZSAkaGlkZGVuID0gZmFsc2U7CnByaXZhdGUgJGhlbHAgPSAnJzsKcHJpdmF0ZSAkZGVzY3JpcHRpb24gPSAnJzsKcHJpdmF0ZSAkZnVsbERlZmluaXRpb247CnByaXZhdGUgJGlnbm9yZVZhbGlkYXRpb25FcnJvcnMgPSBmYWxzZTsKcHJpdmF0ZSAkY29kZTsKcHJpdmF0ZSAkc3lub3BzaXMgPSBbXTsKcHJpdmF0ZSAkdXNhZ2VzID0gW107CnByaXZhdGUgJGhlbHBlclNldDsKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGVmYXVsdE5hbWUoKQp7CiRjbGFzcyA9IHN0YXRpYzo6Y2xhc3M7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwICYmICRhdHRyaWJ1dGUgPSAobmV3IFxSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKSktPmdldEF0dHJpYnV0ZXMoQXNDb21tYW5kOjpjbGFzcykpIHsKcmV0dXJuICRhdHRyaWJ1dGVbMF0tPm5ld0luc3RhbmNlKCktPm5hbWU7Cn0KCiRyID0gbmV3IFxSZWZsZWN0aW9uUHJvcGVydHkoJGNsYXNzLCAnZGVmYXVsdE5hbWUnKTsKCnJldHVybiAkY2xhc3MgPT09ICRyLT5jbGFzcyA/IHN0YXRpYzo6JGRlZmF1bHROYW1lIDogbnVsbDsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXREZWZhdWx0RGVzY3JpcHRpb24oKTogP3N0cmluZwp7CiRjbGFzcyA9IHN0YXRpYzo6Y2xhc3M7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwICYmICRhdHRyaWJ1dGUgPSAobmV3IFxSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKSktPmdldEF0dHJpYnV0ZXMoQXNDb21tYW5kOjpjbGFzcykpIHsKcmV0dXJuICRhdHRyaWJ1dGVbMF0tPm5ld0luc3RhbmNlKCktPmRlc2NyaXB0aW9uOwp9CgokciA9IG5ldyBcUmVmbGVjdGlvblByb3BlcnR5KCRjbGFzcywgJ2RlZmF1bHREZXNjcmlwdGlvbicpOwoKcmV0dXJuICRjbGFzcyA9PT0gJHItPmNsYXNzID8gc3RhdGljOjokZGVmYXVsdERlc2NyaXB0aW9uIDogbnVsbDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP3N0cmluZyAkbmFtZSA9IG51bGwpCnsKJHRoaXMtPmRlZmluaXRpb24gPSBuZXcgSW5wdXREZWZpbml0aW9uKCk7CgppZiAobnVsbCA9PT0gJG5hbWUgJiYgbnVsbCAhPT0gJG5hbWUgPSBzdGF0aWM6OmdldERlZmF1bHROYW1lKCkpIHsKJGFsaWFzZXMgPSBleHBsb2RlKCd8JywgJG5hbWUpOwoKaWYgKCcnID09PSAkbmFtZSA9IGFycmF5X3NoaWZ0KCRhbGlhc2VzKSkgewokdGhpcy0+c2V0SGlkZGVuKHRydWUpOwokbmFtZSA9IGFycmF5X3NoaWZ0KCRhbGlhc2VzKTsKfQoKJHRoaXMtPnNldEFsaWFzZXMoJGFsaWFzZXMpOwp9CgppZiAobnVsbCAhPT0gJG5hbWUpIHsKJHRoaXMtPnNldE5hbWUoJG5hbWUpOwp9CgppZiAoJycgPT09ICR0aGlzLT5kZXNjcmlwdGlvbikgewokdGhpcy0+c2V0RGVzY3JpcHRpb24oc3RhdGljOjpnZXREZWZhdWx0RGVzY3JpcHRpb24oKSA/PyAnJyk7Cn0KCiR0aGlzLT5jb25maWd1cmUoKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaWdub3JlVmFsaWRhdGlvbkVycm9ycygpCnsKJHRoaXMtPmlnbm9yZVZhbGlkYXRpb25FcnJvcnMgPSB0cnVlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QXBwbGljYXRpb24oP0FwcGxpY2F0aW9uICRhcHBsaWNhdGlvbiA9IG51bGwpCnsKJHRoaXMtPmFwcGxpY2F0aW9uID0gJGFwcGxpY2F0aW9uOwppZiAoJGFwcGxpY2F0aW9uKSB7CiR0aGlzLT5zZXRIZWxwZXJTZXQoJGFwcGxpY2F0aW9uLT5nZXRIZWxwZXJTZXQoKSk7Cn0gZWxzZSB7CiR0aGlzLT5oZWxwZXJTZXQgPSBudWxsOwp9CgokdGhpcy0+ZnVsbERlZmluaXRpb24gPSBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0SGVscGVyU2V0KEhlbHBlclNldCAkaGVscGVyU2V0KQp7CiR0aGlzLT5oZWxwZXJTZXQgPSAkaGVscGVyU2V0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwZXJTZXQoKQp7CnJldHVybiAkdGhpcy0+aGVscGVyU2V0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcHBsaWNhdGlvbigpCnsKcmV0dXJuICR0aGlzLT5hcHBsaWNhdGlvbjsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNFbmFibGVkKCkKewpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpCnsKfQoKCgoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignWW91IG11c3Qgb3ZlcnJpZGUgdGhlIGV4ZWN1dGUoKSBtZXRob2QgaW4gdGhlIGNvbmNyZXRlIGNvbW1hbmQgY2xhc3MuJyk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW50ZXJhY3QoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewp9CgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewp9CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBydW4oSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewoKJHRoaXMtPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKCk7CgoKdHJ5IHsKJGlucHV0LT5iaW5kKCR0aGlzLT5nZXREZWZpbml0aW9uKCkpOwp9IGNhdGNoIChFeGNlcHRpb25JbnRlcmZhY2UgJGUpIHsKaWYgKCEkdGhpcy0+aWdub3JlVmFsaWRhdGlvbkVycm9ycykgewp0aHJvdyAkZTsKfQp9CgokdGhpcy0+aW5pdGlhbGl6ZSgkaW5wdXQsICRvdXRwdXQpOwoKaWYgKG51bGwgIT09ICR0aGlzLT5wcm9jZXNzVGl0bGUpIHsKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ2NsaV9zZXRfcHJvY2Vzc190aXRsZScpKSB7CmlmICghQGNsaV9zZXRfcHJvY2Vzc190aXRsZSgkdGhpcy0+cHJvY2Vzc1RpdGxlKSkgewppZiAoJ0RhcndpbicgPT09IFxQSFBfT1MpIHsKJG91dHB1dC0+d3JpdGVsbignPGNvbW1lbnQ+UnVubmluZyAiY2xpX3NldF9wcm9jZXNzX3RpdGxlIiBhcyBhbiB1bnByaXZpbGVnZWQgdXNlciBpcyBub3Qgc3VwcG9ydGVkIG9uIE1hY09TLjwvY29tbWVudD4nLCBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UpOwp9IGVsc2UgewpjbGlfc2V0X3Byb2Nlc3NfdGl0bGUoJHRoaXMtPnByb2Nlc3NUaXRsZSk7Cn0KfQp9IGVsc2VpZiAoXGZ1bmN0aW9uX2V4aXN0cygnc2V0cHJvY3RpdGxlJykpIHsKc2V0cHJvY3RpdGxlKCR0aGlzLT5wcm9jZXNzVGl0bGUpOwp9IGVsc2VpZiAoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFID09PSAkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewokb3V0cHV0LT53cml0ZWxuKCc8Y29tbWVudD5JbnN0YWxsIHRoZSBwcm9jdGl0bGUgUEVDTCB0byBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgcHJvY2VzcyB0aXRsZS48L2NvbW1lbnQ+Jyk7Cn0KfQoKaWYgKCRpbnB1dC0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT5pbnRlcmFjdCgkaW5wdXQsICRvdXRwdXQpOwp9CgoKCgppZiAoJGlucHV0LT5oYXNBcmd1bWVudCgnY29tbWFuZCcpICYmIG51bGwgPT09ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2NvbW1hbmQnKSkgewokaW5wdXQtPnNldEFyZ3VtZW50KCdjb21tYW5kJywgJHRoaXMtPmdldE5hbWUoKSk7Cn0KCiRpbnB1dC0+dmFsaWRhdGUoKTsKCmlmICgkdGhpcy0+Y29kZSkgewokc3RhdHVzQ29kZSA9ICgkdGhpcy0+Y29kZSkoJGlucHV0LCAkb3V0cHV0KTsKfSBlbHNlIHsKJHN0YXR1c0NvZGUgPSAkdGhpcy0+ZXhlY3V0ZSgkaW5wdXQsICRvdXRwdXQpOwoKaWYgKCFcaXNfaW50KCRzdGF0dXNDb2RlKSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdSZXR1cm4gdmFsdWUgb2YgIiVzOjpleGVjdXRlKCkiIG11c3QgYmUgb2YgdGhlIHR5cGUgaW50LCAiJXMiIHJldHVybmVkLicsIHN0YXRpYzo6Y2xhc3MsIGdldF9kZWJ1Z190eXBlKCRzdGF0dXNDb2RlKSkpOwp9Cn0KCnJldHVybiBpc19udW1lcmljKCRzdGF0dXNDb2RlKSA/IChpbnQpICRzdGF0dXNDb2RlIDogMDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKfQoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29kZShjYWxsYWJsZSAkY29kZSkKewppZiAoJGNvZGUgaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewokciA9IG5ldyBcUmVmbGVjdGlvbkZ1bmN0aW9uKCRjb2RlKTsKaWYgKG51bGwgPT09ICRyLT5nZXRDbG9zdXJlVGhpcygpKSB7CnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoKSB7fSk7CnRyeSB7CmlmICgkYyA9IFxDbG9zdXJlOjpiaW5kKCRjb2RlLCAkdGhpcykpIHsKJGNvZGUgPSAkYzsKfQp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQp9Cn0KCiR0aGlzLT5jb2RlID0gJGNvZGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbihib29sICRtZXJnZUFyZ3MgPSB0cnVlKQp7CmlmIChudWxsID09PSAkdGhpcy0+YXBwbGljYXRpb24pIHsKcmV0dXJuOwp9CgokdGhpcy0+ZnVsbERlZmluaXRpb24gPSBuZXcgSW5wdXREZWZpbml0aW9uKCk7CiR0aGlzLT5mdWxsRGVmaW5pdGlvbi0+c2V0T3B0aW9ucygkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpKTsKJHRoaXMtPmZ1bGxEZWZpbml0aW9uLT5hZGRPcHRpb25zKCR0aGlzLT5hcHBsaWNhdGlvbi0+Z2V0RGVmaW5pdGlvbigpLT5nZXRPcHRpb25zKCkpOwoKaWYgKCRtZXJnZUFyZ3MpIHsKJHRoaXMtPmZ1bGxEZWZpbml0aW9uLT5zZXRBcmd1bWVudHMoJHRoaXMtPmFwcGxpY2F0aW9uLT5nZXREZWZpbml0aW9uKCktPmdldEFyZ3VtZW50cygpKTsKJHRoaXMtPmZ1bGxEZWZpbml0aW9uLT5hZGRBcmd1bWVudHMoJHRoaXMtPmRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpKTsKfSBlbHNlIHsKJHRoaXMtPmZ1bGxEZWZpbml0aW9uLT5zZXRBcmd1bWVudHMoJHRoaXMtPmRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpKTsKfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlZmluaXRpb24oJGRlZmluaXRpb24pCnsKaWYgKCRkZWZpbml0aW9uIGluc3RhbmNlb2YgSW5wdXREZWZpbml0aW9uKSB7CiR0aGlzLT5kZWZpbml0aW9uID0gJGRlZmluaXRpb247Cn0gZWxzZSB7CiR0aGlzLT5kZWZpbml0aW9uLT5zZXREZWZpbml0aW9uKCRkZWZpbml0aW9uKTsKfQoKJHRoaXMtPmZ1bGxEZWZpbml0aW9uID0gbnVsbDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVmaW5pdGlvbigpCnsKcmV0dXJuICR0aGlzLT5mdWxsRGVmaW5pdGlvbiA/PyAkdGhpcy0+Z2V0TmF0aXZlRGVmaW5pdGlvbigpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hdGl2ZURlZmluaXRpb24oKQp7CmlmIChudWxsID09PSAkdGhpcy0+ZGVmaW5pdGlvbikgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQ29tbWFuZCBjbGFzcyAiJXMiIGlzIG5vdCBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQuIFlvdSBwcm9iYWJseSBmb3Jnb3QgdG8gY2FsbCB0aGUgcGFyZW50IGNvbnN0cnVjdG9yLicsIHN0YXRpYzo6Y2xhc3MpKTsKfQoKcmV0dXJuICR0aGlzLT5kZWZpbml0aW9uOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEFyZ3VtZW50KHN0cmluZyAkbmFtZSwgP2ludCAkbW9kZSA9IG51bGwsIHN0cmluZyAkZGVzY3JpcHRpb24gPSAnJywgJGRlZmF1bHQgPSBudWxsKQp7CiR0aGlzLT5kZWZpbml0aW9uLT5hZGRBcmd1bWVudChuZXcgSW5wdXRBcmd1bWVudCgkbmFtZSwgJG1vZGUsICRkZXNjcmlwdGlvbiwgJGRlZmF1bHQpKTsKaWYgKG51bGwgIT09ICR0aGlzLT5mdWxsRGVmaW5pdGlvbikgewokdGhpcy0+ZnVsbERlZmluaXRpb24tPmFkZEFyZ3VtZW50KG5ldyBJbnB1dEFyZ3VtZW50KCRuYW1lLCAkbW9kZSwgJGRlc2NyaXB0aW9uLCAkZGVmYXVsdCkpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZE9wdGlvbihzdHJpbmcgJG5hbWUsICRzaG9ydGN1dCA9IG51bGwsID9pbnQgJG1vZGUgPSBudWxsLCBzdHJpbmcgJGRlc2NyaXB0aW9uID0gJycsICRkZWZhdWx0ID0gbnVsbCkKewokdGhpcy0+ZGVmaW5pdGlvbi0+YWRkT3B0aW9uKG5ldyBJbnB1dE9wdGlvbigkbmFtZSwgJHNob3J0Y3V0LCAkbW9kZSwgJGRlc2NyaXB0aW9uLCAkZGVmYXVsdCkpOwppZiAobnVsbCAhPT0gJHRoaXMtPmZ1bGxEZWZpbml0aW9uKSB7CiR0aGlzLT5mdWxsRGVmaW5pdGlvbi0+YWRkT3B0aW9uKG5ldyBJbnB1dE9wdGlvbigkbmFtZSwgJHNob3J0Y3V0LCAkbW9kZSwgJGRlc2NyaXB0aW9uLCAkZGVmYXVsdCkpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXROYW1lKHN0cmluZyAkbmFtZSkKewokdGhpcy0+dmFsaWRhdGVOYW1lKCRuYW1lKTsKCiR0aGlzLT5uYW1lID0gJG5hbWU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByb2Nlc3NUaXRsZShzdHJpbmcgJHRpdGxlKQp7CiR0aGlzLT5wcm9jZXNzVGl0bGUgPSAkdGl0bGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQp7CnJldHVybiAkdGhpcy0+bmFtZTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SGlkZGVuKGJvb2wgJGhpZGRlbiApCnsKJHRoaXMtPmhpZGRlbiA9ICRoaWRkZW47CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0hpZGRlbigpCnsKcmV0dXJuICR0aGlzLT5oaWRkZW47Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlc2NyaXB0aW9uKHN0cmluZyAkZGVzY3JpcHRpb24pCnsKJHRoaXMtPmRlc2NyaXB0aW9uID0gJGRlc2NyaXB0aW9uOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXNjcmlwdGlvbigpCnsKcmV0dXJuICR0aGlzLT5kZXNjcmlwdGlvbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SGVscChzdHJpbmcgJGhlbHApCnsKJHRoaXMtPmhlbHAgPSAkaGVscDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVscCgpCnsKcmV0dXJuICR0aGlzLT5oZWxwOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvY2Vzc2VkSGVscCgpCnsKJG5hbWUgPSAkdGhpcy0+bmFtZTsKJGlzU2luZ2xlQ29tbWFuZCA9ICR0aGlzLT5hcHBsaWNhdGlvbiAmJiAkdGhpcy0+YXBwbGljYXRpb24tPmlzU2luZ2xlQ29tbWFuZCgpOwoKJHBsYWNlaG9sZGVycyA9IFsKJyVjb21tYW5kLm5hbWUlJywKJyVjb21tYW5kLmZ1bGxfbmFtZSUnLApdOwokcmVwbGFjZW1lbnRzID0gWwokbmFtZSwKJGlzU2luZ2xlQ29tbWFuZCA/ICRfU0VSVkVSWydQSFBfU0VMRiddIDogJF9TRVJWRVJbJ1BIUF9TRUxGJ10uJyAnLiRuYW1lLApdOwoKcmV0dXJuIHN0cl9yZXBsYWNlKCRwbGFjZWhvbGRlcnMsICRyZXBsYWNlbWVudHMsICR0aGlzLT5nZXRIZWxwKCkgPzogJHRoaXMtPmdldERlc2NyaXB0aW9uKCkpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QWxpYXNlcyhpdGVyYWJsZSAkYWxpYXNlcykKewokbGlzdCA9IFtdOwoKZm9yZWFjaCAoJGFsaWFzZXMgYXMgJGFsaWFzKSB7CiR0aGlzLT52YWxpZGF0ZU5hbWUoJGFsaWFzKTsKJGxpc3RbXSA9ICRhbGlhczsKfQoKJHRoaXMtPmFsaWFzZXMgPSBcaXNfYXJyYXkoJGFsaWFzZXMpID8gJGFsaWFzZXMgOiAkbGlzdDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNlcygpCnsKcmV0dXJuICR0aGlzLT5hbGlhc2VzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN5bm9wc2lzKGJvb2wgJHNob3J0ID0gZmFsc2UpCnsKJGtleSA9ICRzaG9ydCA/ICdzaG9ydCcgOiAnbG9uZyc7CgppZiAoIWlzc2V0KCR0aGlzLT5zeW5vcHNpc1ska2V5XSkpIHsKJHRoaXMtPnN5bm9wc2lzWyRrZXldID0gdHJpbShzcHJpbnRmKCclcyAlcycsICR0aGlzLT5uYW1lLCAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0U3lub3BzaXMoJHNob3J0KSkpOwp9CgpyZXR1cm4gJHRoaXMtPnN5bm9wc2lzWyRrZXldOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRVc2FnZShzdHJpbmcgJHVzYWdlKQp7CmlmICghc3RyX3N0YXJ0c193aXRoKCR1c2FnZSwgJHRoaXMtPm5hbWUpKSB7CiR1c2FnZSA9IHNwcmludGYoJyVzICVzJywgJHRoaXMtPm5hbWUsICR1c2FnZSk7Cn0KCiR0aGlzLT51c2FnZXNbXSA9ICR1c2FnZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXNhZ2VzKCkKewpyZXR1cm4gJHRoaXMtPnVzYWdlczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVscGVyKHN0cmluZyAkbmFtZSkKewppZiAobnVsbCA9PT0gJHRoaXMtPmhlbHBlclNldCkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IHJldHJpZXZlIGhlbHBlciAiJXMiIGJlY2F1c2UgdGhlcmUgaXMgbm8gSGVscGVyU2V0IGRlZmluZWQuIERpZCB5b3UgZm9yZ2V0IHRvIGFkZCB5b3VyIGNvbW1hbmQgdG8gdGhlIGFwcGxpY2F0aW9uIG9yIHRvIHNldCB0aGUgYXBwbGljYXRpb24gb24gdGhlIGNvbW1hbmQgdXNpbmcgdGhlIHNldEFwcGxpY2F0aW9uKCkgbWV0aG9kPyBZb3UgY2FuIGFsc28gc2V0IHRoZSBIZWxwZXJTZXQgZGlyZWN0bHkgdXNpbmcgdGhlIHNldEhlbHBlclNldCgpIG1ldGhvZC4nLCAkbmFtZSkpOwp9CgpyZXR1cm4gJHRoaXMtPmhlbHBlclNldC0+Z2V0KCRuYW1lKTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVOYW1lKHN0cmluZyAkbmFtZSkKewppZiAoIXByZWdfbWF0Y2goJy9eW15cOl0rKyhcOlteXDpdKyspKiQvJywgJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignQ29tbWFuZCBuYW1lICIlcyIgaXMgaW52YWxpZC4nLCAkbmFtZSkpOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxPdXRwdXRcQmFzaENvbXBsZXRpb25PdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cT3V0cHV0XENvbXBsZXRpb25PdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxDb21tYW5kTm90Rm91bmRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxFeGNlcHRpb25JbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKZmluYWwgY2xhc3MgQ29tcGxldGVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAp7CnByb3RlY3RlZCBzdGF0aWMgJGRlZmF1bHROYW1lID0gJ3xfY29tcGxldGUnOwpwcm90ZWN0ZWQgc3RhdGljICRkZWZhdWx0RGVzY3JpcHRpb24gPSAnSW50ZXJuYWwgY29tbWFuZCB0byBwcm92aWRlIHNoZWxsIGNvbXBsZXRpb24gc3VnZ2VzdGlvbnMnOwoKcHJpdmF0ZSAkY29tcGxldGlvbk91dHB1dHM7Cgpwcml2YXRlICRpc0RlYnVnID0gZmFsc2U7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGNvbXBsZXRpb25PdXRwdXRzID0gW10pCnsKCiR0aGlzLT5jb21wbGV0aW9uT3V0cHV0cyA9ICRjb21wbGV0aW9uT3V0cHV0cyArIFsnYmFzaCcgPT4gQmFzaENvbXBsZXRpb25PdXRwdXQ6OmNsYXNzXTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5hZGRPcHRpb24oJ3NoZWxsJywgJ3MnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdUaGUgc2hlbGwgdHlwZSAoIicuaW1wbG9kZSgnIiwgIicsIGFycmF5X2tleXMoJHRoaXMtPmNvbXBsZXRpb25PdXRwdXRzKSkuJyIpJykKLT5hZGRPcHRpb24oJ2lucHV0JywgJ2knLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdBbiBhcnJheSBvZiBpbnB1dCB0b2tlbnMgKGUuZy4gQ09NUF9XT1JEUyBvciBhcmd2KScpCi0+YWRkT3B0aW9uKCdjdXJyZW50JywgJ2MnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdUaGUgaW5kZXggb2YgdGhlICJpbnB1dCIgYXJyYXkgdGhhdCB0aGUgY3Vyc29yIGlzIGluIChlLmcuIENPTVBfQ1dPUkQpJykKLT5hZGRPcHRpb24oJ3N5bWZvbnknLCAnUycsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1RoZSB2ZXJzaW9uIG9mIHRoZSBjb21wbGV0aW9uIHNjcmlwdCcpCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokdGhpcy0+aXNEZWJ1ZyA9IGZpbHRlcl92YXIoZ2V0ZW52KCdTWU1GT05ZX0NPTVBMRVRJT05fREVCVUcnKSwgXEZJTFRFUl9WQUxJREFURV9CT09MRUFOKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CnRyeSB7CgoKCgoKCgoKCgoKJHNoZWxsID0gJGlucHV0LT5nZXRPcHRpb24oJ3NoZWxsJyk7CmlmICghJHNoZWxsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlICItLXNoZWxsIiBvcHRpb24gbXVzdCBiZSBzZXQuJyk7Cn0KCmlmICghJGNvbXBsZXRpb25PdXRwdXQgPSAkdGhpcy0+Y29tcGxldGlvbk91dHB1dHNbJHNoZWxsXSA/PyBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignU2hlbGwgY29tcGxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciB5b3VyIHNoZWxsOiAiJXMiIChzdXBwb3J0ZWQ6ICIlcyIpLicsICRzaGVsbCwgaW1wbG9kZSgnIiwgIicsIGFycmF5X2tleXMoJHRoaXMtPmNvbXBsZXRpb25PdXRwdXRzKSkpKTsKfQoKJGNvbXBsZXRpb25JbnB1dCA9ICR0aGlzLT5jcmVhdGVDb21wbGV0aW9uSW5wdXQoJGlucHV0KTsKJHN1Z2dlc3Rpb25zID0gbmV3IENvbXBsZXRpb25TdWdnZXN0aW9ucygpOwoKJHRoaXMtPmxvZyhbCicnLAonPGNvbW1lbnQ+Jy5kYXRlKCdZLW0tZCBIOmk6cycpLic8Lz4nLAonPGluZm8+SW5wdXQ6PC8+IDxjb21tZW50PigifCIgaW5kaWNhdGVzIHRoZSBjdXJzb3IgcG9zaXRpb24pPC8+JywKJyAgJy4oc3RyaW5nKSAkY29tcGxldGlvbklucHV0LAonPGluZm8+Q29tbWFuZDo8Lz4nLAonICAnLihzdHJpbmcpIGltcGxvZGUoJyAnLCAkX1NFUlZFUlsnYXJndiddKSwKJzxpbmZvPk1lc3NhZ2VzOjwvPicsCl0pOwoKJGNvbW1hbmQgPSAkdGhpcy0+ZmluZENvbW1hbmQoJGNvbXBsZXRpb25JbnB1dCwgJG91dHB1dCk7CmlmIChudWxsID09PSAkY29tbWFuZCkgewokdGhpcy0+bG9nKCcgIE5vIGNvbW1hbmQgZm91bmQsIGNvbXBsZXRpbmcgdXNpbmcgdGhlIEFwcGxpY2F0aW9uIGNsYXNzLicpOwoKJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmNvbXBsZXRlKCRjb21wbGV0aW9uSW5wdXQsICRzdWdnZXN0aW9ucyk7Cn0gZWxzZWlmICgKJGNvbXBsZXRpb25JbnB1dC0+bXVzdFN1Z2dlc3RBcmd1bWVudFZhbHVlc0ZvcignY29tbWFuZCcpCiYmICRjb21tYW5kLT5nZXROYW1lKCkgIT09ICRjb21wbGV0aW9uSW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpCiYmICFcaW5fYXJyYXkoJGNvbXBsZXRpb25JbnB1dC0+Z2V0Q29tcGxldGlvblZhbHVlKCksICRjb21tYW5kLT5nZXRBbGlhc2VzKCksIHRydWUpCikgewokdGhpcy0+bG9nKCcgIE5vIGNvbW1hbmQgZm91bmQsIGNvbXBsZXRpbmcgdXNpbmcgdGhlIEFwcGxpY2F0aW9uIGNsYXNzLicpOwoKCiRzdWdnZXN0aW9ucy0+c3VnZ2VzdFZhbHVlcyhhcnJheV9maWx0ZXIoYXJyYXlfbWVyZ2UoWyRjb21tYW5kLT5nZXROYW1lKCldLCAkY29tbWFuZC0+Z2V0QWxpYXNlcygpKSkpOwp9IGVsc2UgewokY29tbWFuZC0+bWVyZ2VBcHBsaWNhdGlvbkRlZmluaXRpb24oKTsKJGNvbXBsZXRpb25JbnB1dC0+YmluZCgkY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpKTsKCmlmIChDb21wbGV0aW9uSW5wdXQ6OlRZUEVfT1BUSU9OX05BTUUgPT09ICRjb21wbGV0aW9uSW5wdXQtPmdldENvbXBsZXRpb25UeXBlKCkpIHsKJHRoaXMtPmxvZygnICBDb21wbGV0aW5nIG9wdGlvbiBuYW1lcyBmb3IgdGhlIDxjb21tZW50PicuXGdldF9jbGFzcygkY29tbWFuZCBpbnN0YW5jZW9mIExhenlDb21tYW5kID8gJGNvbW1hbmQtPmdldENvbW1hbmQoKSA6ICRjb21tYW5kKS4nPC8+IGNvbW1hbmQuJyk7Cgokc3VnZ2VzdGlvbnMtPnN1Z2dlc3RPcHRpb25zKCRjb21tYW5kLT5nZXREZWZpbml0aW9uKCktPmdldE9wdGlvbnMoKSk7Cn0gZWxzZSB7CiR0aGlzLT5sb2coWwonICBDb21wbGV0aW5nIHVzaW5nIHRoZSA8Y29tbWVudD4nLlxnZXRfY2xhc3MoJGNvbW1hbmQgaW5zdGFuY2VvZiBMYXp5Q29tbWFuZCA/ICRjb21tYW5kLT5nZXRDb21tYW5kKCkgOiAkY29tbWFuZCkuJzwvPiBjbGFzcy4nLAonICBDb21wbGV0aW5nIDxjb21tZW50PicuJGNvbXBsZXRpb25JbnB1dC0+Z2V0Q29tcGxldGlvblR5cGUoKS4nPC8+IGZvciA8Y29tbWVudD4nLiRjb21wbGV0aW9uSW5wdXQtPmdldENvbXBsZXRpb25OYW1lKCkuJzwvPicsCl0pOwppZiAobnVsbCAhPT0gJGNvbXB2YWwgPSAkY29tcGxldGlvbklucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSkgewokdGhpcy0+bG9nKCcgIEN1cnJlbnQgdmFsdWU6IDxjb21tZW50PicuJGNvbXB2YWwuJzwvPicpOwp9CgokY29tbWFuZC0+Y29tcGxldGUoJGNvbXBsZXRpb25JbnB1dCwgJHN1Z2dlc3Rpb25zKTsKfQp9CgoKJGNvbXBsZXRpb25PdXRwdXQgPSBuZXcgJGNvbXBsZXRpb25PdXRwdXQoKTsKCiR0aGlzLT5sb2coJzxpbmZvPlN1Z2dlc3Rpb25zOjwvPicpOwppZiAoJG9wdGlvbnMgPSAkc3VnZ2VzdGlvbnMtPmdldE9wdGlvblN1Z2dlc3Rpb25zKCkpIHsKJHRoaXMtPmxvZygnICAtLScuaW1wbG9kZSgnIC0tJywgYXJyYXlfbWFwKGZ1bmN0aW9uICgkbykgeyByZXR1cm4gJG8tPmdldE5hbWUoKTsgfSwgJG9wdGlvbnMpKSk7Cn0gZWxzZWlmICgkdmFsdWVzID0gJHN1Z2dlc3Rpb25zLT5nZXRWYWx1ZVN1Z2dlc3Rpb25zKCkpIHsKJHRoaXMtPmxvZygnICAnLmltcGxvZGUoJyAnLCAkdmFsdWVzKSk7Cn0gZWxzZSB7CiR0aGlzLT5sb2coJyAgPGNvbW1lbnQ+Tm8gc3VnZ2VzdGlvbnMgd2VyZSBwcm92aWRlZDwvPicpOwp9CgokY29tcGxldGlvbk91dHB1dC0+d3JpdGUoJHN1Z2dlc3Rpb25zLCAkb3V0cHV0KTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewokdGhpcy0+bG9nKFsKJzxlcnJvcj5FcnJvciE8L2Vycm9yPicsCihzdHJpbmcpICRlLApdKTsKCmlmICgkb3V0cHV0LT5pc0RlYnVnKCkpIHsKdGhyb3cgJGU7Cn0KCnJldHVybiAyOwp9CgpyZXR1cm4gMDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVDb21wbGV0aW9uSW5wdXQoSW5wdXRJbnRlcmZhY2UgJGlucHV0KTogQ29tcGxldGlvbklucHV0CnsKJGN1cnJlbnRJbmRleCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdjdXJyZW50Jyk7CmlmICghJGN1cnJlbnRJbmRleCB8fCAhY3R5cGVfZGlnaXQoJGN1cnJlbnRJbmRleCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgIi0tY3VycmVudCIgb3B0aW9uIG11c3QgYmUgc2V0IGFuZCBpdCBtdXN0IGJlIGFuIGludGVnZXIuJyk7Cn0KCiRjb21wbGV0aW9uSW5wdXQgPSBDb21wbGV0aW9uSW5wdXQ6OmZyb21Ub2tlbnMoJGlucHV0LT5nZXRPcHRpb24oJ2lucHV0JyksIChpbnQpICRjdXJyZW50SW5kZXgpOwoKdHJ5IHsKJGNvbXBsZXRpb25JbnB1dC0+YmluZCgkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+Z2V0RGVmaW5pdGlvbigpKTsKfSBjYXRjaCAoRXhjZXB0aW9uSW50ZXJmYWNlICRlKSB7Cn0KCnJldHVybiAkY29tcGxldGlvbklucHV0Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIGZpbmRDb21tYW5kKENvbXBsZXRpb25JbnB1dCAkY29tcGxldGlvbklucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6ID9Db21tYW5kCnsKdHJ5IHsKJGlucHV0TmFtZSA9ICRjb21wbGV0aW9uSW5wdXQtPmdldEZpcnN0QXJndW1lbnQoKTsKaWYgKG51bGwgPT09ICRpbnB1dE5hbWUpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+ZmluZCgkaW5wdXROYW1lKTsKfSBjYXRjaCAoQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uICRlKSB7Cn0KCnJldHVybiBudWxsOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGxvZygkbWVzc2FnZXMpOiB2b2lkCnsKaWYgKCEkdGhpcy0+aXNEZWJ1ZykgewpyZXR1cm47Cn0KCiRjb21tYW5kTmFtZSA9IGJhc2VuYW1lKCRfU0VSVkVSWydhcmd2J11bMF0pOwpmaWxlX3B1dF9jb250ZW50cyhzeXNfZ2V0X3RlbXBfZGlyKCkuJy9zZl8nLiRjb21tYW5kTmFtZS4nLmxvZycsIGltcGxvZGUoXFBIUF9FT0wsIChhcnJheSkgJG1lc3NhZ2VzKS5cUEhQX0VPTCwgXEZJTEVfQVBQRU5EKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwoKCgoKCgpmaW5hbCBjbGFzcyBEdW1wQ29tcGxldGlvbkNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCnsKcHJvdGVjdGVkIHN0YXRpYyAkZGVmYXVsdE5hbWUgPSAnY29tcGxldGlvbic7CnByb3RlY3RlZCBzdGF0aWMgJGRlZmF1bHREZXNjcmlwdGlvbiA9ICdEdW1wIHRoZSBzaGVsbCBjb21wbGV0aW9uIHNjcmlwdCc7CgpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewppZiAoJGlucHV0LT5tdXN0U3VnZ2VzdEFyZ3VtZW50VmFsdWVzRm9yKCdzaGVsbCcpKSB7CiRzdWdnZXN0aW9ucy0+c3VnZ2VzdFZhbHVlcygkdGhpcy0+Z2V0U3VwcG9ydGVkU2hlbGxzKCkpOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKQp7CiRmdWxsQ29tbWFuZCA9ICRfU0VSVkVSWydQSFBfU0VMRiddOwokY29tbWFuZE5hbWUgPSBiYXNlbmFtZSgkZnVsbENvbW1hbmQpOwokZnVsbENvbW1hbmQgPSBAcmVhbHBhdGgoJGZ1bGxDb21tYW5kKSA/OiAkZnVsbENvbW1hbmQ7CgokdGhpcwotPnNldEhlbHAoPDw8RU9IClRoZSA8aW5mbz4lY29tbWFuZC5uYW1lJTwvPiBjb21tYW5kIGR1bXBzIHRoZSBzaGVsbCBjb21wbGV0aW9uIHNjcmlwdCByZXF1aXJlZAp0byB1c2Ugc2hlbGwgYXV0b2NvbXBsZXRpb24gKGN1cnJlbnRseSBvbmx5IGJhc2ggY29tcGxldGlvbiBpcyBzdXBwb3J0ZWQpLgoKPGNvbW1lbnQ+U3RhdGljIGluc3RhbGxhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tPC8+CgpEdW1wIHRoZSBzY3JpcHQgdG8gYSBnbG9iYWwgY29tcGxldGlvbiBmaWxlIGFuZCByZXN0YXJ0IHlvdXIgc2hlbGw6CgogICAgPGluZm8+JWNvbW1hbmQuZnVsbF9uYW1lJSBiYXNoIHwgc3VkbyB0ZWUgL2V0Yy9iYXNoX2NvbXBsZXRpb24uZC97JGNvbW1hbmROYW1lfTwvPgoKT3IgZHVtcCB0aGUgc2NyaXB0IHRvIGEgbG9jYWwgZmlsZSBhbmQgc291cmNlIGl0OgoKICAgIDxpbmZvPiVjb21tYW5kLmZ1bGxfbmFtZSUgYmFzaCA+IGNvbXBsZXRpb24uc2g8Lz4KCiAgICA8Y29tbWVudD4jIHNvdXJjZSB0aGUgZmlsZSB3aGVuZXZlciB5b3UgdXNlIHRoZSBwcm9qZWN0PC8+CiAgICA8aW5mbz5zb3VyY2UgY29tcGxldGlvbi5zaDwvPgoKICAgIDxjb21tZW50PiMgb3IgYWRkIHRoaXMgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgIn4vLmJhc2hyYyIgZmlsZTo8Lz4KICAgIDxpbmZvPnNvdXJjZSAvcGF0aC90by9jb21wbGV0aW9uLnNoPC8+Cgo8Y29tbWVudD5EeW5hbWljIGluc3RhbGxhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLTwvPgoKQWRkIHRoaXMgdG8gdGhlIGVuZCBvZiB5b3VyIHNoZWxsIGNvbmZpZ3VyYXRpb24gZmlsZSAoZS5nLiA8aW5mbz4ifi8uYmFzaHJjIjwvPik6CgogICAgPGluZm8+ZXZhbCAiJCh7JGZ1bGxDb21tYW5kfSBjb21wbGV0aW9uIGJhc2gpIjwvPgpFT0gKKQotPmFkZEFyZ3VtZW50KCdzaGVsbCcsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnVGhlIHNoZWxsIHR5cGUgKGUuZy4gImJhc2giKSwgdGhlIHZhbHVlIG9mIHRoZSAiJFNIRUxMIiBlbnYgdmFyIHdpbGwgYmUgdXNlZCBpZiB0aGlzIGlzIG5vdCBnaXZlbicpCi0+YWRkT3B0aW9uKCdkZWJ1ZycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVGFpbCB0aGUgY29tcGxldGlvbiBkZWJ1ZyBsb2cnKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tbWFuZE5hbWUgPSBiYXNlbmFtZSgkX1NFUlZFUlsnYXJndiddWzBdKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignZGVidWcnKSkgewokdGhpcy0+dGFpbERlYnVnTG9nKCRjb21tYW5kTmFtZSwgJG91dHB1dCk7CgpyZXR1cm4gMDsKfQoKJHNoZWxsID0gJGlucHV0LT5nZXRBcmd1bWVudCgnc2hlbGwnKSA/PyBzZWxmOjpndWVzc1NoZWxsKCk7CiRjb21wbGV0aW9uRmlsZSA9IF9fRElSX18uJy8uLi9SZXNvdXJjZXMvY29tcGxldGlvbi4nLiRzaGVsbDsKaWYgKCFmaWxlX2V4aXN0cygkY29tcGxldGlvbkZpbGUpKSB7CiRzdXBwb3J0ZWRTaGVsbHMgPSAkdGhpcy0+Z2V0U3VwcG9ydGVkU2hlbGxzKCk7CgppZiAoJG91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKJG91dHB1dCA9ICRvdXRwdXQtPmdldEVycm9yT3V0cHV0KCk7Cn0KaWYgKCRzaGVsbCkgewokb3V0cHV0LT53cml0ZWxuKHNwcmludGYoJzxlcnJvcj5EZXRlY3RlZCBzaGVsbCAiJXMiLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IFN5bWZvbnkgc2hlbGwgY29tcGxldGlvbiAoc3VwcG9ydGVkIHNoZWxsczogIiVzIikuPC8+JywgJHNoZWxsLCBpbXBsb2RlKCciLCAiJywgJHN1cHBvcnRlZFNoZWxscykpKTsKfSBlbHNlIHsKJG91dHB1dC0+d3JpdGVsbihzcHJpbnRmKCc8ZXJyb3I+U2hlbGwgbm90IGRldGVjdGVkLCBTeW1mb255IHNoZWxsIGNvbXBsZXRpb24gb25seSBzdXBwb3J0cyAiJXMiKS48Lz4nLCBpbXBsb2RlKCciLCAiJywgJHN1cHBvcnRlZFNoZWxscykpKTsKfQoKcmV0dXJuIDI7Cn0KCiRvdXRwdXQtPndyaXRlKHN0cl9yZXBsYWNlKFsne3sgQ09NTUFORF9OQU1FIH19JywgJ3t7IFZFUlNJT04gfX0nXSwgWyRjb21tYW5kTmFtZSwgJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmdldFZlcnNpb24oKV0sIGZpbGVfZ2V0X2NvbnRlbnRzKCRjb21wbGV0aW9uRmlsZSkpKTsKCnJldHVybiAwOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBndWVzc1NoZWxsKCk6IHN0cmluZwp7CnJldHVybiBiYXNlbmFtZSgkX1NFUlZFUlsnU0hFTEwnXSA/PyAnJyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdGFpbERlYnVnTG9nKHN0cmluZyAkY29tbWFuZE5hbWUsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiRkZWJ1Z0ZpbGUgPSBzeXNfZ2V0X3RlbXBfZGlyKCkuJy9zZl8nLiRjb21tYW5kTmFtZS4nLmxvZyc7CmlmICghZmlsZV9leGlzdHMoJGRlYnVnRmlsZSkpIHsKdG91Y2goJGRlYnVnRmlsZSk7Cn0KJHByb2Nlc3MgPSBuZXcgUHJvY2VzcyhbJ3RhaWwnLCAnLWYnLCAkZGVidWdGaWxlXSwgbnVsbCwgbnVsbCwgbnVsbCwgMCk7CiRwcm9jZXNzLT5ydW4oZnVuY3Rpb24gKHN0cmluZyAkdHlwZSwgc3RyaW5nICRsaW5lKSB1c2UgKCRvdXRwdXQpOiB2b2lkIHsKJG91dHB1dC0+d3JpdGUoJGxpbmUpOwp9KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRTdXBwb3J0ZWRTaGVsbHMoKTogYXJyYXkKewokc2hlbGxzID0gW107Cgpmb3JlYWNoIChuZXcgXERpcmVjdG9yeUl0ZXJhdG9yKF9fRElSX18uJy8uLi9SZXNvdXJjZXMvJykgYXMgJGZpbGUpIHsKaWYgKHN0cl9zdGFydHNfd2l0aCgkZmlsZS0+Z2V0QmFzZW5hbWUoKSwgJ2NvbXBsZXRpb24uJykgJiYgJGZpbGUtPmlzRmlsZSgpKSB7CiRzaGVsbHNbXSA9ICRmaWxlLT5nZXRFeHRlbnNpb24oKTsKfQp9CgpyZXR1cm4gJHNoZWxsczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yXEFwcGxpY2F0aW9uRGVzY3JpcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxEZXNjcmlwdG9ySGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIEhlbHBDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAp7CnByaXZhdGUgJGNvbW1hbmQ7CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCkKewokdGhpcy0+aWdub3JlVmFsaWRhdGlvbkVycm9ycygpOwoKJHRoaXMKLT5zZXROYW1lKCdoZWxwJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ2NvbW1hbmRfbmFtZScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnVGhlIGNvbW1hbmQgbmFtZScsICdoZWxwJyksCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVGhlIG91dHB1dCBmb3JtYXQgKHR4dCwgeG1sLCBqc29uLCBvciBtZCknLCAndHh0JyksCm5ldyBJbnB1dE9wdGlvbigncmF3JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdUbyBvdXRwdXQgcmF3IGNvbW1hbmQgaGVscCcpLApdKQotPnNldERlc2NyaXB0aW9uKCdEaXNwbGF5IGhlbHAgZm9yIGEgY29tbWFuZCcpCi0+c2V0SGVscCg8PDwnRU9GJwpUaGUgPGluZm8+JWNvbW1hbmQubmFtZSU8L2luZm8+IGNvbW1hbmQgZGlzcGxheXMgaGVscCBmb3IgYSBnaXZlbiBjb21tYW5kOgoKICA8aW5mbz4lY29tbWFuZC5mdWxsX25hbWUlIGxpc3Q8L2luZm8+CgpZb3UgY2FuIGFsc28gb3V0cHV0IHRoZSBoZWxwIGluIG90aGVyIGZvcm1hdHMgYnkgdXNpbmcgdGhlIDxjb21tZW50Pi0tZm9ybWF0PC9jb21tZW50PiBvcHRpb246CgogIDxpbmZvPiVjb21tYW5kLmZ1bGxfbmFtZSUgLS1mb3JtYXQ9eG1sIGxpc3Q8L2luZm8+CgpUbyBkaXNwbGF5IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjb21tYW5kcywgcGxlYXNlIHVzZSB0aGUgPGluZm8+bGlzdDwvaW5mbz4gY29tbWFuZC4KRU9GCikKOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29tbWFuZChDb21tYW5kICRjb21tYW5kKQp7CiR0aGlzLT5jb21tYW5kID0gJGNvbW1hbmQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5jb21tYW5kKSB7CiR0aGlzLT5jb21tYW5kID0gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmZpbmQoJGlucHV0LT5nZXRBcmd1bWVudCgnY29tbWFuZF9uYW1lJykpOwp9CgokaGVscGVyID0gbmV3IERlc2NyaXB0b3JIZWxwZXIoKTsKJGhlbHBlci0+ZGVzY3JpYmUoJG91dHB1dCwgJHRoaXMtPmNvbW1hbmQsIFsKJ2Zvcm1hdCcgPT4gJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpLAoncmF3X3RleHQnID0+ICRpbnB1dC0+Z2V0T3B0aW9uKCdyYXcnKSwKXSk7CgokdGhpcy0+Y29tbWFuZCA9IG51bGw7CgpyZXR1cm4gMDsKfQoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKaWYgKCRpbnB1dC0+bXVzdFN1Z2dlc3RBcmd1bWVudFZhbHVlc0ZvcignY29tbWFuZF9uYW1lJykpIHsKJGRlc2NyaXB0b3IgPSBuZXcgQXBwbGljYXRpb25EZXNjcmlwdGlvbigkdGhpcy0+Z2V0QXBwbGljYXRpb24oKSk7CiRzdWdnZXN0aW9ucy0+c3VnZ2VzdFZhbHVlcyhhcnJheV9rZXlzKCRkZXNjcmlwdG9yLT5nZXRDb21tYW5kcygpKSk7CgpyZXR1cm47Cn0KCmlmICgkaW5wdXQtPm11c3RTdWdnZXN0T3B0aW9uVmFsdWVzRm9yKCdmb3JtYXQnKSkgewokaGVscGVyID0gbmV3IERlc2NyaXB0b3JIZWxwZXIoKTsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKCRoZWxwZXItPmdldEZvcm1hdHMoKSk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlclNldDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmZpbmFsIGNsYXNzIExhenlDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAp7CnByaXZhdGUgJGNvbW1hbmQ7CnByaXZhdGUgJGlzRW5hYmxlZDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIGFycmF5ICRhbGlhc2VzLCBzdHJpbmcgJGRlc2NyaXB0aW9uLCBib29sICRpc0hpZGRlbiwgXENsb3N1cmUgJGNvbW1hbmRGYWN0b3J5LCA/Ym9vbCAkaXNFbmFibGVkID0gdHJ1ZSkKewokdGhpcy0+c2V0TmFtZSgkbmFtZSkKLT5zZXRBbGlhc2VzKCRhbGlhc2VzKQotPnNldEhpZGRlbigkaXNIaWRkZW4pCi0+c2V0RGVzY3JpcHRpb24oJGRlc2NyaXB0aW9uKTsKCiR0aGlzLT5jb21tYW5kID0gJGNvbW1hbmRGYWN0b3J5OwokdGhpcy0+aXNFbmFibGVkID0gJGlzRW5hYmxlZDsKfQoKcHVibGljIGZ1bmN0aW9uIGlnbm9yZVZhbGlkYXRpb25FcnJvcnMoKTogdm9pZAp7CiR0aGlzLT5nZXRDb21tYW5kKCktPmlnbm9yZVZhbGlkYXRpb25FcnJvcnMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEFwcGxpY2F0aW9uKD9BcHBsaWNhdGlvbiAkYXBwbGljYXRpb24gPSBudWxsKTogdm9pZAp7CmlmICgkdGhpcy0+Y29tbWFuZCBpbnN0YW5jZW9mIHBhcmVudCkgewokdGhpcy0+Y29tbWFuZC0+c2V0QXBwbGljYXRpb24oJGFwcGxpY2F0aW9uKTsKfQoKcGFyZW50OjpzZXRBcHBsaWNhdGlvbigkYXBwbGljYXRpb24pOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0SGVscGVyU2V0KEhlbHBlclNldCAkaGVscGVyU2V0KTogdm9pZAp7CmlmICgkdGhpcy0+Y29tbWFuZCBpbnN0YW5jZW9mIHBhcmVudCkgewokdGhpcy0+Y29tbWFuZC0+c2V0SGVscGVyU2V0KCRoZWxwZXJTZXQpOwp9CgpwYXJlbnQ6OnNldEhlbHBlclNldCgkaGVscGVyU2V0KTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRW5hYmxlZCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5pc0VuYWJsZWQgPz8gJHRoaXMtPmdldENvbW1hbmQoKS0+aXNFbmFibGVkKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBydW4oSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CnJldHVybiAkdGhpcy0+Z2V0Q29tbWFuZCgpLT5ydW4oJGlucHV0LCAkb3V0cHV0KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+Y29tcGxldGUoJGlucHV0LCAkc3VnZ2VzdGlvbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29kZShjYWxsYWJsZSAkY29kZSk6IHNlbGYKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5zZXRDb2RlKCRjb2RlKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKGJvb2wgJG1lcmdlQXJncyA9IHRydWUpOiB2b2lkCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+bWVyZ2VBcHBsaWNhdGlvbkRlZmluaXRpb24oJG1lcmdlQXJncyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWZpbml0aW9uKCRkZWZpbml0aW9uKTogc2VsZgp7CiR0aGlzLT5nZXRDb21tYW5kKCktPnNldERlZmluaXRpb24oJGRlZmluaXRpb24pOwoKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVmaW5pdGlvbigpOiBJbnB1dERlZmluaXRpb24KewpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoKS0+Z2V0RGVmaW5pdGlvbigpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmF0aXZlRGVmaW5pdGlvbigpOiBJbnB1dERlZmluaXRpb24KewpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoKS0+Z2V0TmF0aXZlRGVmaW5pdGlvbigpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQXJndW1lbnQoc3RyaW5nICRuYW1lLCA/aW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwpOiBzZWxmCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+YWRkQXJndW1lbnQoJG5hbWUsICRtb2RlLCAkZGVzY3JpcHRpb24sICRkZWZhdWx0KTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZE9wdGlvbihzdHJpbmcgJG5hbWUsICRzaG9ydGN1dCA9IG51bGwsID9pbnQgJG1vZGUgPSBudWxsLCBzdHJpbmcgJGRlc2NyaXB0aW9uID0gJycsICRkZWZhdWx0ID0gbnVsbCk6IHNlbGYKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5hZGRPcHRpb24oJG5hbWUsICRzaG9ydGN1dCwgJG1vZGUsICRkZXNjcmlwdGlvbiwgJGRlZmF1bHQpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJvY2Vzc1RpdGxlKHN0cmluZyAkdGl0bGUpOiBzZWxmCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+c2V0UHJvY2Vzc1RpdGxlKCR0aXRsZSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWxwKHN0cmluZyAkaGVscCk6IHNlbGYKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5zZXRIZWxwKCRoZWxwKTsKCnJldHVybiAkdGhpczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEhlbHAoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5nZXRDb21tYW5kKCktPmdldEhlbHAoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByb2Nlc3NlZEhlbHAoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5nZXRDb21tYW5kKCktPmdldFByb2Nlc3NlZEhlbHAoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFN5bm9wc2lzKGJvb2wgJHNob3J0ID0gZmFsc2UpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoKS0+Z2V0U3lub3BzaXMoJHNob3J0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFVzYWdlKHN0cmluZyAkdXNhZ2UpOiBzZWxmCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+YWRkVXNhZ2UoJHVzYWdlKTsKCnJldHVybiAkdGhpczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFVzYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Z2V0Q29tbWFuZCgpLT5nZXRVc2FnZXMoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlbHBlcihzdHJpbmcgJG5hbWUpCnsKcmV0dXJuICR0aGlzLT5nZXRDb21tYW5kKCktPmdldEhlbHBlcigkbmFtZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kKCk6IHBhcmVudAp7CmlmICghJHRoaXMtPmNvbW1hbmQgaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewpyZXR1cm4gJHRoaXMtPmNvbW1hbmQ7Cn0KCiRjb21tYW5kID0gJHRoaXMtPmNvbW1hbmQgPSAoJHRoaXMtPmNvbW1hbmQpKCk7CiRjb21tYW5kLT5zZXRBcHBsaWNhdGlvbigkdGhpcy0+Z2V0QXBwbGljYXRpb24oKSk7CgppZiAobnVsbCAhPT0gJHRoaXMtPmdldEhlbHBlclNldCgpKSB7CiRjb21tYW5kLT5zZXRIZWxwZXJTZXQoJHRoaXMtPmdldEhlbHBlclNldCgpKTsKfQoKJGNvbW1hbmQtPnNldE5hbWUoJHRoaXMtPmdldE5hbWUoKSkKLT5zZXRBbGlhc2VzKCR0aGlzLT5nZXRBbGlhc2VzKCkpCi0+c2V0SGlkZGVuKCR0aGlzLT5pc0hpZGRlbigpKQotPnNldERlc2NyaXB0aW9uKCR0aGlzLT5nZXREZXNjcmlwdGlvbigpKTsKCgokY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpOwoKcmV0dXJuICRjb21tYW5kOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3JcQXBwbGljYXRpb25EZXNjcmlwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXERlc2NyaXB0b3JIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKY2xhc3MgTGlzdENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpCnsKJHRoaXMKLT5zZXROYW1lKCdsaXN0JykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ25hbWVzcGFjZScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnVGhlIG5hbWVzcGFjZSBuYW1lJyksCm5ldyBJbnB1dE9wdGlvbigncmF3JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdUbyBvdXRwdXQgcmF3IGNvbW1hbmQgbGlzdCcpLApuZXcgSW5wdXRPcHRpb24oJ2Zvcm1hdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1RoZSBvdXRwdXQgZm9ybWF0ICh0eHQsIHhtbCwganNvbiwgb3IgbWQpJywgJ3R4dCcpLApuZXcgSW5wdXRPcHRpb24oJ3Nob3J0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdUbyBza2lwIGRlc2NyaWJpbmcgY29tbWFuZHNcJyBhcmd1bWVudHMnKSwKXSkKLT5zZXREZXNjcmlwdGlvbignTGlzdCBjb21tYW5kcycpCi0+c2V0SGVscCg8PDwnRU9GJwpUaGUgPGluZm8+JWNvbW1hbmQubmFtZSU8L2luZm8+IGNvbW1hbmQgbGlzdHMgYWxsIGNvbW1hbmRzOgoKICA8aW5mbz4lY29tbWFuZC5mdWxsX25hbWUlPC9pbmZvPgoKWW91IGNhbiBhbHNvIGRpc3BsYXkgdGhlIGNvbW1hbmRzIGZvciBhIHNwZWNpZmljIG5hbWVzcGFjZToKCiAgPGluZm8+JWNvbW1hbmQuZnVsbF9uYW1lJSB0ZXN0PC9pbmZvPgoKWW91IGNhbiBhbHNvIG91dHB1dCB0aGUgaW5mb3JtYXRpb24gaW4gb3RoZXIgZm9ybWF0cyBieSB1c2luZyB0aGUgPGNvbW1lbnQ+LS1mb3JtYXQ8L2NvbW1lbnQ+IG9wdGlvbjoKCiAgPGluZm8+JWNvbW1hbmQuZnVsbF9uYW1lJSAtLWZvcm1hdD14bWw8L2luZm8+CgpJdCdzIGFsc28gcG9zc2libGUgdG8gZ2V0IHJhdyBsaXN0IG9mIGNvbW1hbmRzICh1c2VmdWwgZm9yIGVtYmVkZGluZyBjb21tYW5kIHJ1bm5lcik6CgogIDxpbmZvPiVjb21tYW5kLmZ1bGxfbmFtZSUgLS1yYXc8L2luZm8+CkVPRgopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokaGVscGVyID0gbmV3IERlc2NyaXB0b3JIZWxwZXIoKTsKJGhlbHBlci0+ZGVzY3JpYmUoJG91dHB1dCwgJHRoaXMtPmdldEFwcGxpY2F0aW9uKCksIFsKJ2Zvcm1hdCcgPT4gJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpLAoncmF3X3RleHQnID0+ICRpbnB1dC0+Z2V0T3B0aW9uKCdyYXcnKSwKJ25hbWVzcGFjZScgPT4gJGlucHV0LT5nZXRBcmd1bWVudCgnbmFtZXNwYWNlJyksCidzaG9ydCcgPT4gJGlucHV0LT5nZXRPcHRpb24oJ3Nob3J0JyksCl0pOwoKcmV0dXJuIDA7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShDb21wbGV0aW9uSW5wdXQgJGlucHV0LCBDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zKTogdm9pZAp7CmlmICgkaW5wdXQtPm11c3RTdWdnZXN0QXJndW1lbnRWYWx1ZXNGb3IoJ25hbWVzcGFjZScpKSB7CiRkZXNjcmlwdG9yID0gbmV3IEFwcGxpY2F0aW9uRGVzY3JpcHRpb24oJHRoaXMtPmdldEFwcGxpY2F0aW9uKCkpOwokc3VnZ2VzdGlvbnMtPnN1Z2dlc3RWYWx1ZXMoYXJyYXlfa2V5cygkZGVzY3JpcHRvci0+Z2V0TmFtZXNwYWNlcygpKSk7CgpyZXR1cm47Cn0KCmlmICgkaW5wdXQtPm11c3RTdWdnZXN0T3B0aW9uVmFsdWVzRm9yKCdmb3JtYXQnKSkgewokaGVscGVyID0gbmV3IERlc2NyaXB0b3JIZWxwZXIoKTsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKCRoZWxwZXItPmdldEZvcm1hdHMoKSk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcTG9ja1xMb2NrRmFjdG9yeTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XExvY2tcTG9ja0ludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XExvY2tcU3RvcmVcRmxvY2tTdG9yZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XExvY2tcU3RvcmVcU2VtYXBob3JlU3RvcmU7CgoKCgoKCnRyYWl0IExvY2thYmxlVHJhaXQKewoKcHJpdmF0ZSAkbG9jazsKCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9jayg/c3RyaW5nICRuYW1lID0gbnVsbCwgYm9vbCAkYmxvY2tpbmcgPSBmYWxzZSk6IGJvb2wKewppZiAoIWNsYXNzX2V4aXN0cyhTZW1hcGhvcmVTdG9yZTo6Y2xhc3MpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignVG8gZW5hYmxlIHRoZSBsb2NraW5nIGZlYXR1cmUgeW91IG11c3QgaW5zdGFsbCB0aGUgc3ltZm9ueS9sb2NrIGNvbXBvbmVudC4nKTsKfQoKaWYgKG51bGwgIT09ICR0aGlzLT5sb2NrKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignQSBsb2NrIGlzIGFscmVhZHkgaW4gcGxhY2UuJyk7Cn0KCmlmIChTZW1hcGhvcmVTdG9yZTo6aXNTdXBwb3J0ZWQoKSkgewokc3RvcmUgPSBuZXcgU2VtYXBob3JlU3RvcmUoKTsKfSBlbHNlIHsKJHN0b3JlID0gbmV3IEZsb2NrU3RvcmUoKTsKfQoKJHRoaXMtPmxvY2sgPSAobmV3IExvY2tGYWN0b3J5KCRzdG9yZSkpLT5jcmVhdGVMb2NrKCRuYW1lID86ICR0aGlzLT5nZXROYW1lKCkpOwppZiAoISR0aGlzLT5sb2NrLT5hY3F1aXJlKCRibG9ja2luZykpIHsKJHRoaXMtPmxvY2sgPSBudWxsOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZWxlYXNlKCkKewppZiAoJHRoaXMtPmxvY2spIHsKJHRoaXMtPmxvY2stPnJlbGVhc2UoKTsKJHRoaXMtPmxvY2sgPSBudWxsOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZDsKCgoKCgoKaW50ZXJmYWNlIFNpZ25hbGFibGVDb21tYW5kSW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN1YnNjcmliZWRTaWduYWxzKCk6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGhhbmRsZVNpZ25hbChpbnQgJHNpZ25hbCk6IHZvaWQ7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRMb2FkZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxDb21tYW5kTm90Rm91bmRFeGNlcHRpb247CgoKCgppbnRlcmZhY2UgQ29tbWFuZExvYWRlckludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAkbmFtZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXMoc3RyaW5nICRuYW1lKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lcygpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kTG9hZGVyOwoKdXNlIFBzclxDb250YWluZXJcQ29udGFpbmVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBDb250YWluZXJDb21tYW5kTG9hZGVyIGltcGxlbWVudHMgQ29tbWFuZExvYWRlckludGVyZmFjZQp7CnByaXZhdGUgJGNvbnRhaW5lcjsKcHJpdmF0ZSAkY29tbWFuZE1hcDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb250YWluZXJJbnRlcmZhY2UgJGNvbnRhaW5lciwgYXJyYXkgJGNvbW1hbmRNYXApCnsKJHRoaXMtPmNvbnRhaW5lciA9ICRjb250YWluZXI7CiR0aGlzLT5jb21tYW5kTWFwID0gJGNvbW1hbmRNYXA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICRuYW1lKQp7CmlmICghJHRoaXMtPmhhcygkbmFtZSkpIHsKdGhyb3cgbmV3IENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCdDb21tYW5kICIlcyIgZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKcmV0dXJuICR0aGlzLT5jb250YWluZXItPmdldCgkdGhpcy0+Y29tbWFuZE1hcFskbmFtZV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gaXNzZXQoJHRoaXMtPmNvbW1hbmRNYXBbJG5hbWVdKSAmJiAkdGhpcy0+Y29udGFpbmVyLT5oYXMoJHRoaXMtPmNvbW1hbmRNYXBbJG5hbWVdKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzKCkKewpyZXR1cm4gYXJyYXlfa2V5cygkdGhpcy0+Y29tbWFuZE1hcCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZExvYWRlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxDb21tYW5kTm90Rm91bmRFeGNlcHRpb247CgoKCgoKCmNsYXNzIEZhY3RvcnlDb21tYW5kTG9hZGVyIGltcGxlbWVudHMgQ29tbWFuZExvYWRlckludGVyZmFjZQp7CnByaXZhdGUgJGZhY3RvcmllczsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkZmFjdG9yaWVzKQp7CiR0aGlzLT5mYWN0b3JpZXMgPSAkZmFjdG9yaWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gaXNzZXQoJHRoaXMtPmZhY3Rvcmllc1skbmFtZV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAkbmFtZSkKewppZiAoIWlzc2V0KCR0aGlzLT5mYWN0b3JpZXNbJG5hbWVdKSkgewp0aHJvdyBuZXcgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoJ0NvbW1hbmQgIiVzIiBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgokZmFjdG9yeSA9ICR0aGlzLT5mYWN0b3JpZXNbJG5hbWVdOwoKcmV0dXJuICRmYWN0b3J5KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lcygpCnsKcmV0dXJuIGFycmF5X2tleXMoJHRoaXMtPmZhY3Rvcmllcyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvbjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxBcmd2SW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0RGVmaW5pdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CgoKCgoKCgoKCmZpbmFsIGNsYXNzIENvbXBsZXRpb25JbnB1dCBleHRlbmRzIEFyZ3ZJbnB1dAp7CnB1YmxpYyBjb25zdCBUWVBFX0FSR1VNRU5UX1ZBTFVFID0gJ2FyZ3VtZW50X3ZhbHVlJzsKcHVibGljIGNvbnN0IFRZUEVfT1BUSU9OX1ZBTFVFID0gJ29wdGlvbl92YWx1ZSc7CnB1YmxpYyBjb25zdCBUWVBFX09QVElPTl9OQU1FID0gJ29wdGlvbl9uYW1lJzsKcHVibGljIGNvbnN0IFRZUEVfTk9ORSA9ICdub25lJzsKCnByaXZhdGUgJHRva2VuczsKcHJpdmF0ZSAkY3VycmVudEluZGV4Owpwcml2YXRlICRjb21wbGV0aW9uVHlwZTsKcHJpdmF0ZSAkY29tcGxldGlvbk5hbWUgPSBudWxsOwpwcml2YXRlICRjb21wbGV0aW9uVmFsdWUgPSAnJzsKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tU3RyaW5nKHN0cmluZyAkaW5wdXRTdHIsIGludCAkY3VycmVudEluZGV4KTogc2VsZgp7CnByZWdfbWF0Y2hfYWxsKCcvKD88PV58XHMpKFtcJyJdPykoLis/KSg/PCFcXFxcKVwxKD89JHxccykvJywgJGlucHV0U3RyLCAkdG9rZW5zKTsKCnJldHVybiBzZWxmOjpmcm9tVG9rZW5zKCR0b2tlbnNbMF0sICRjdXJyZW50SW5kZXgpOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21Ub2tlbnMoYXJyYXkgJHRva2VucywgaW50ICRjdXJyZW50SW5kZXgpOiBzZWxmCnsKJGlucHV0ID0gbmV3IHNlbGYoJHRva2Vucyk7CiRpbnB1dC0+dG9rZW5zID0gJHRva2VuczsKJGlucHV0LT5jdXJyZW50SW5kZXggPSAkY3VycmVudEluZGV4OwoKcmV0dXJuICRpbnB1dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGJpbmQoSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uKTogdm9pZAp7CnBhcmVudDo6YmluZCgkZGVmaW5pdGlvbik7CgokcmVsZXZhbnRUb2tlbiA9ICR0aGlzLT5nZXRSZWxldmFudFRva2VuKCk7CmlmICgnLScgPT09ICRyZWxldmFudFRva2VuWzBdKSB7CgpbJG9wdGlvblRva2VuLCAkb3B0aW9uVmFsdWVdID0gZXhwbG9kZSgnPScsICRyZWxldmFudFRva2VuLCAyKSArIFsnJywgJyddOwoKJG9wdGlvbiA9ICR0aGlzLT5nZXRPcHRpb25Gcm9tVG9rZW4oJG9wdGlvblRva2VuKTsKaWYgKG51bGwgPT09ICRvcHRpb24gJiYgISR0aGlzLT5pc0N1cnNvckZyZWUoKSkgewokdGhpcy0+Y29tcGxldGlvblR5cGUgPSBzZWxmOjpUWVBFX09QVElPTl9OQU1FOwokdGhpcy0+Y29tcGxldGlvblZhbHVlID0gJHJlbGV2YW50VG9rZW47CgpyZXR1cm47Cn0KCmlmIChudWxsICE9PSAkb3B0aW9uICYmICRvcHRpb24tPmFjY2VwdFZhbHVlKCkpIHsKJHRoaXMtPmNvbXBsZXRpb25UeXBlID0gc2VsZjo6VFlQRV9PUFRJT05fVkFMVUU7CiR0aGlzLT5jb21wbGV0aW9uTmFtZSA9ICRvcHRpb24tPmdldE5hbWUoKTsKJHRoaXMtPmNvbXBsZXRpb25WYWx1ZSA9ICRvcHRpb25WYWx1ZSA/OiAoIXN0cl9zdGFydHNfd2l0aCgkb3B0aW9uVG9rZW4sICctLScpID8gc3Vic3RyKCRvcHRpb25Ub2tlbiwgMikgOiAnJyk7CgpyZXR1cm47Cn0KfQoKJHByZXZpb3VzVG9rZW4gPSAkdGhpcy0+dG9rZW5zWyR0aGlzLT5jdXJyZW50SW5kZXggLSAxXTsKaWYgKCctJyA9PT0gJHByZXZpb3VzVG9rZW5bMF0gJiYgJycgIT09IHRyaW0oJHByZXZpb3VzVG9rZW4sICctJykpIHsKCiRwcmV2aW91c09wdGlvbiA9ICR0aGlzLT5nZXRPcHRpb25Gcm9tVG9rZW4oJHByZXZpb3VzVG9rZW4pOwppZiAobnVsbCAhPT0gJHByZXZpb3VzT3B0aW9uICYmICRwcmV2aW91c09wdGlvbi0+YWNjZXB0VmFsdWUoKSkgewokdGhpcy0+Y29tcGxldGlvblR5cGUgPSBzZWxmOjpUWVBFX09QVElPTl9WQUxVRTsKJHRoaXMtPmNvbXBsZXRpb25OYW1lID0gJHByZXZpb3VzT3B0aW9uLT5nZXROYW1lKCk7CiR0aGlzLT5jb21wbGV0aW9uVmFsdWUgPSAkcmVsZXZhbnRUb2tlbjsKCnJldHVybjsKfQp9CgoKJHRoaXMtPmNvbXBsZXRpb25UeXBlID0gc2VsZjo6VFlQRV9BUkdVTUVOVF9WQUxVRTsKCmZvcmVhY2ggKCR0aGlzLT5kZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSBhcyAkYXJndW1lbnROYW1lID0+ICRhcmd1bWVudCkgewppZiAoIWlzc2V0KCR0aGlzLT5hcmd1bWVudHNbJGFyZ3VtZW50TmFtZV0pKSB7CmJyZWFrOwp9CgokYXJndW1lbnRWYWx1ZSA9ICR0aGlzLT5hcmd1bWVudHNbJGFyZ3VtZW50TmFtZV07CiR0aGlzLT5jb21wbGV0aW9uTmFtZSA9ICRhcmd1bWVudE5hbWU7CmlmIChcaXNfYXJyYXkoJGFyZ3VtZW50VmFsdWUpKSB7CiR0aGlzLT5jb21wbGV0aW9uVmFsdWUgPSAkYXJndW1lbnRWYWx1ZSA/ICRhcmd1bWVudFZhbHVlW2FycmF5X2tleV9sYXN0KCRhcmd1bWVudFZhbHVlKV0gOiBudWxsOwp9IGVsc2UgewokdGhpcy0+Y29tcGxldGlvblZhbHVlID0gJGFyZ3VtZW50VmFsdWU7Cn0KfQoKaWYgKCR0aGlzLT5jdXJyZW50SW5kZXggPj0gXGNvdW50KCR0aGlzLT50b2tlbnMpKSB7CmlmICghaXNzZXQoJHRoaXMtPmFyZ3VtZW50c1skYXJndW1lbnROYW1lXSkgfHwgJHRoaXMtPmRlZmluaXRpb24tPmdldEFyZ3VtZW50KCRhcmd1bWVudE5hbWUpLT5pc0FycmF5KCkpIHsKJHRoaXMtPmNvbXBsZXRpb25OYW1lID0gJGFyZ3VtZW50TmFtZTsKJHRoaXMtPmNvbXBsZXRpb25WYWx1ZSA9ICcnOwp9IGVsc2UgewoKJHRoaXMtPmNvbXBsZXRpb25UeXBlID0gc2VsZjo6VFlQRV9OT05FOwokdGhpcy0+Y29tcGxldGlvbk5hbWUgPSBudWxsOwokdGhpcy0+Y29tcGxldGlvblZhbHVlID0gJyc7Cn0KfQp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBsZXRpb25UeXBlKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Y29tcGxldGlvblR5cGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBsZXRpb25OYW1lKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmNvbXBsZXRpb25OYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcGxldGlvblZhbHVlKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Y29tcGxldGlvblZhbHVlOwp9CgpwdWJsaWMgZnVuY3Rpb24gbXVzdFN1Z2dlc3RPcHRpb25WYWx1ZXNGb3Ioc3RyaW5nICRvcHRpb25OYW1lKTogYm9vbAp7CnJldHVybiBzZWxmOjpUWVBFX09QVElPTl9WQUxVRSA9PT0gJHRoaXMtPmdldENvbXBsZXRpb25UeXBlKCkgJiYgJG9wdGlvbk5hbWUgPT09ICR0aGlzLT5nZXRDb21wbGV0aW9uTmFtZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gbXVzdFN1Z2dlc3RBcmd1bWVudFZhbHVlc0ZvcihzdHJpbmcgJGFyZ3VtZW50TmFtZSk6IGJvb2wKewpyZXR1cm4gc2VsZjo6VFlQRV9BUkdVTUVOVF9WQUxVRSA9PT0gJHRoaXMtPmdldENvbXBsZXRpb25UeXBlKCkgJiYgJGFyZ3VtZW50TmFtZSA9PT0gJHRoaXMtPmdldENvbXBsZXRpb25OYW1lKCk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZVRva2VuKHN0cmluZyAkdG9rZW4sIGJvb2wgJHBhcnNlT3B0aW9ucyk6IGJvb2wKewp0cnkgewpyZXR1cm4gcGFyZW50OjpwYXJzZVRva2VuKCR0b2tlbiwgJHBhcnNlT3B0aW9ucyk7Cn0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKCn0KCnJldHVybiAkcGFyc2VPcHRpb25zOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldE9wdGlvbkZyb21Ub2tlbihzdHJpbmcgJG9wdGlvblRva2VuKTogP0lucHV0T3B0aW9uCnsKJG9wdGlvbk5hbWUgPSBsdHJpbSgkb3B0aW9uVG9rZW4sICctJyk7CmlmICghJG9wdGlvbk5hbWUpIHsKcmV0dXJuIG51bGw7Cn0KCmlmICgnLScgPT09ICgkb3B0aW9uVG9rZW5bMV0gPz8gJyAnKSkgewoKcmV0dXJuICR0aGlzLT5kZWZpbml0aW9uLT5oYXNPcHRpb24oJG9wdGlvbk5hbWUpID8gJHRoaXMtPmRlZmluaXRpb24tPmdldE9wdGlvbigkb3B0aW9uTmFtZSkgOiBudWxsOwp9CgoKcmV0dXJuICR0aGlzLT5kZWZpbml0aW9uLT5oYXNTaG9ydGN1dCgkb3B0aW9uTmFtZVswXSkgPyAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0T3B0aW9uRm9yU2hvcnRjdXQoJG9wdGlvbk5hbWVbMF0pIDogbnVsbDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSZWxldmFudFRva2VuKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dG9rZW5zWyR0aGlzLT5pc0N1cnNvckZyZWUoKSA/ICR0aGlzLT5jdXJyZW50SW5kZXggLSAxIDogJHRoaXMtPmN1cnJlbnRJbmRleF07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gaXNDdXJzb3JGcmVlKCk6IGJvb2wKewokbnJPZlRva2VucyA9IFxjb3VudCgkdGhpcy0+dG9rZW5zKTsKaWYgKCR0aGlzLT5jdXJyZW50SW5kZXggPiAkbnJPZlRva2Vucykgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdDdXJyZW50IGluZGV4IGlzIGludmFsaWQsIGl0IG11c3QgYmUgdGhlIG51bWJlciBvZiBpbnB1dCB0b2tlbnMgb3Igb25lIG1vcmUuJyk7Cn0KCnJldHVybiAkdGhpcy0+Y3VycmVudEluZGV4ID49ICRuck9mVG9rZW5zOwp9CgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKJHN0ciA9ICcnOwpmb3JlYWNoICgkdGhpcy0+dG9rZW5zIGFzICRpID0+ICR0b2tlbikgewokc3RyIC49ICR0b2tlbjsKCmlmICgkdGhpcy0+Y3VycmVudEluZGV4ID09PSAkaSkgewokc3RyIC49ICd8JzsKfQoKJHN0ciAuPSAnICc7Cn0KCmlmICgkdGhpcy0+Y3VycmVudEluZGV4ID4gJGkpIHsKJHN0ciAuPSAnfCc7Cn0KCnJldHVybiBydHJpbSgkc3RyKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CgoKCgoKCmZpbmFsIGNsYXNzIENvbXBsZXRpb25TdWdnZXN0aW9ucwp7CnByaXZhdGUgJHZhbHVlU3VnZ2VzdGlvbnMgPSBbXTsKcHJpdmF0ZSAkb3B0aW9uU3VnZ2VzdGlvbnMgPSBbXTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VnZ2VzdFZhbHVlKCR2YWx1ZSk6IHNlbGYKewokdGhpcy0+dmFsdWVTdWdnZXN0aW9uc1tdID0gISR2YWx1ZSBpbnN0YW5jZW9mIFN1Z2dlc3Rpb24gPyBuZXcgU3VnZ2VzdGlvbigkdmFsdWUpIDogJHZhbHVlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN1Z2dlc3RWYWx1ZXMoYXJyYXkgJHZhbHVlcyk6IHNlbGYKewpmb3JlYWNoICgkdmFsdWVzIGFzICR2YWx1ZSkgewokdGhpcy0+c3VnZ2VzdFZhbHVlKCR2YWx1ZSk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VnZ2VzdE9wdGlvbihJbnB1dE9wdGlvbiAkb3B0aW9uKTogc2VsZgp7CiR0aGlzLT5vcHRpb25TdWdnZXN0aW9uc1tdID0gJG9wdGlvbjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdWdnZXN0T3B0aW9ucyhhcnJheSAkb3B0aW9ucyk6IHNlbGYKewpmb3JlYWNoICgkb3B0aW9ucyBhcyAkb3B0aW9uKSB7CiR0aGlzLT5zdWdnZXN0T3B0aW9uKCRvcHRpb24pOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb25TdWdnZXN0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+b3B0aW9uU3VnZ2VzdGlvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZVN1Z2dlc3Rpb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT52YWx1ZVN1Z2dlc3Rpb25zOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cT3V0cHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBCYXNoQ29tcGxldGlvbk91dHB1dCBpbXBsZW1lbnRzIENvbXBsZXRpb25PdXRwdXRJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucywgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKJHZhbHVlcyA9ICRzdWdnZXN0aW9ucy0+Z2V0VmFsdWVTdWdnZXN0aW9ucygpOwpmb3JlYWNoICgkc3VnZ2VzdGlvbnMtPmdldE9wdGlvblN1Z2dlc3Rpb25zKCkgYXMgJG9wdGlvbikgewokdmFsdWVzW10gPSAnLS0nLiRvcHRpb24tPmdldE5hbWUoKTsKaWYgKCRvcHRpb24tPmlzTmVnYXRhYmxlKCkpIHsKJHZhbHVlc1tdID0gJy0tbm8tJy4kb3B0aW9uLT5nZXROYW1lKCk7Cn0KfQokb3V0cHV0LT53cml0ZWxuKGltcGxvZGUoIlxuIiwgJHZhbHVlcykpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cT3V0cHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmludGVyZmFjZSBDb21wbGV0aW9uT3V0cHV0SW50ZXJmYWNlCnsKcHVibGljIGZ1bmN0aW9uIHdyaXRlKENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZDsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvbjsKCgoKCgoKY2xhc3MgU3VnZ2VzdGlvbgp7CnByaXZhdGUgJHZhbHVlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkdmFsdWUpCnsKJHRoaXMtPnZhbHVlID0gJHZhbHVlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT52YWx1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5nZXRWYWx1ZSgpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZUNvbW1hbmRFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZUVycm9yRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVTaWduYWxFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZVRlcm1pbmF0ZUV2ZW50OwoKCgoKCgpmaW5hbCBjbGFzcyBDb25zb2xlRXZlbnRzCnsKCgoKCgoKCnB1YmxpYyBjb25zdCBDT01NQU5EID0gJ2NvbnNvbGUuY29tbWFuZCc7CgoKCgoKCgpwdWJsaWMgY29uc3QgU0lHTkFMID0gJ2NvbnNvbGUuc2lnbmFsJzsKCgoKCgoKCnB1YmxpYyBjb25zdCBURVJNSU5BVEUgPSAnY29uc29sZS50ZXJtaW5hdGUnOwoKCgoKCgoKCgpwdWJsaWMgY29uc3QgRVJST1IgPSAnY29uc29sZS5lcnJvcic7CgoKCgoKCnB1YmxpYyBjb25zdCBBTElBU0VTID0gWwpDb25zb2xlQ29tbWFuZEV2ZW50OjpjbGFzcyA9PiBzZWxmOjpDT01NQU5ELApDb25zb2xlRXJyb3JFdmVudDo6Y2xhc3MgPT4gc2VsZjo6RVJST1IsCkNvbnNvbGVTaWduYWxFdmVudDo6Y2xhc3MgPT4gc2VsZjo6U0lHTkFMLApDb25zb2xlVGVybWluYXRlRXZlbnQ6OmNsYXNzID0+IHNlbGY6OlRFUk1JTkFURSwKXTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGU7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKZmluYWwgY2xhc3MgQ3Vyc29yCnsKcHJpdmF0ZSAkb3V0cHV0Owpwcml2YXRlICRpbnB1dDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgJGlucHV0ID0gbnVsbCkKewokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKJHRoaXMtPmlucHV0ID0gJGlucHV0ID8/IChcZGVmaW5lZCgnU1RESU4nKSA/IFxTVERJTiA6IGZvcGVuKCdwaHA6Ly9pbnB1dCcsICdyKycpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG1vdmVVcChpbnQgJGxpbmVzID0gMSk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZShzcHJpbnRmKCJceDFiWyVkQSIsICRsaW5lcykpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbW92ZURvd24oaW50ICRsaW5lcyA9IDEpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoc3ByaW50ZigiXHgxYlslZEIiLCAkbGluZXMpKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG1vdmVSaWdodChpbnQgJGNvbHVtbnMgPSAxKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKHNwcmludGYoIlx4MWJbJWRDIiwgJGNvbHVtbnMpKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG1vdmVMZWZ0KGludCAkY29sdW1ucyA9IDEpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoc3ByaW50ZigiXHgxYlslZEQiLCAkY29sdW1ucykpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbW92ZVRvQ29sdW1uKGludCAkY29sdW1uKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKHNwcmludGYoIlx4MWJbJWRHIiwgJGNvbHVtbikpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbW92ZVRvUG9zaXRpb24oaW50ICRjb2x1bW4sIGludCAkcm93KTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKHNwcmludGYoIlx4MWJbJWQ7JWRIIiwgJHJvdyArIDEsICRjb2x1bW4pKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNhdmVQb3NpdGlvbigpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoIlx4MWI3Iik7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXN0b3JlUG9zaXRpb24oKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCJceDFiOCIpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGlkZSgpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoIlx4MWJbPzI1bCIpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hvdygpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoIlx4MWJbPzI1aFx4MWJbPzBjIik7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFyTGluZSgpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoIlx4MWJbMksiKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFyTGluZUFmdGVyKCk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZSgiXHgxYltLIik7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFyT3V0cHV0KCk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZSgiXHgxYlswSiIpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhclNjcmVlbigpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoIlx4MWJbMkoiKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEN1cnJlbnRQb3NpdGlvbigpOiBhcnJheQp7CnN0YXRpYyAkaXNUdHlTdXBwb3J0ZWQ7CgppZiAobnVsbCA9PT0gJGlzVHR5U3VwcG9ydGVkICYmIFxmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKSB7CiRpc1R0eVN1cHBvcnRlZCA9IChib29sKSBAcHJvY19vcGVuKCdlY2hvIDEgPi9kZXYvbnVsbCcsIFtbJ2ZpbGUnLCAnL2Rldi90dHknLCAnciddLCBbJ2ZpbGUnLCAnL2Rldi90dHknLCAndyddLCBbJ2ZpbGUnLCAnL2Rldi90dHknLCAndyddXSwgJHBpcGVzKTsKfQoKaWYgKCEkaXNUdHlTdXBwb3J0ZWQpIHsKcmV0dXJuIFsxLCAxXTsKfQoKJHN0dHlNb2RlID0gc2hlbGxfZXhlYygnc3R0eSAtZycpOwpzaGVsbF9leGVjKCdzdHR5IC1pY2Fub24gLWVjaG8nKTsKCkBmd3JpdGUoJHRoaXMtPmlucHV0LCAiXDAzM1s2biIpOwoKJGNvZGUgPSB0cmltKGZyZWFkKCR0aGlzLT5pbnB1dCwgMTAyNCkpOwoKc2hlbGxfZXhlYyhzcHJpbnRmKCdzdHR5ICVzJywgJHN0dHlNb2RlKSk7Cgpzc2NhbmYoJGNvZGUsICJcMDMzWyVkOyVkUiIsICRyb3csICRjb2wpOwoKcmV0dXJuIFskY29sLCAkcm93XTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXBlbmRlbmN5SW5qZWN0aW9uOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXExhenlDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kTG9hZGVyXENvbnRhaW5lckNvbW1hbmRMb2FkZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxEZXBlbmRlbmN5SW5qZWN0aW9uXEFyZ3VtZW50XFNlcnZpY2VDbG9zdXJlQXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxEZXBlbmRlbmN5SW5qZWN0aW9uXENvbXBpbGVyXENvbXBpbGVyUGFzc0ludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XERlcGVuZGVuY3lJbmplY3Rpb25cQ29tcGlsZXJcU2VydmljZUxvY2F0b3JUYWdQYXNzOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRGVwZW5kZW5jeUluamVjdGlvblxDb250YWluZXJCdWlsZGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRGVwZW5kZW5jeUluamVjdGlvblxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRGVwZW5kZW5jeUluamVjdGlvblxSZWZlcmVuY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxEZXBlbmRlbmN5SW5qZWN0aW9uXFR5cGVkUmVmZXJlbmNlOwoKCgoKCgpjbGFzcyBBZGRDb25zb2xlQ29tbWFuZFBhc3MgaW1wbGVtZW50cyBDb21waWxlclBhc3NJbnRlcmZhY2UKewpwcml2YXRlICRjb21tYW5kTG9hZGVyU2VydmljZUlkOwpwcml2YXRlICRjb21tYW5kVGFnOwpwcml2YXRlICRub1ByZWxvYWRUYWc7CnByaXZhdGUgJHByaXZhdGVUYWdOYW1lOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkY29tbWFuZExvYWRlclNlcnZpY2VJZCA9ICdjb25zb2xlLmNvbW1hbmRfbG9hZGVyJywgc3RyaW5nICRjb21tYW5kVGFnID0gJ2NvbnNvbGUuY29tbWFuZCcsIHN0cmluZyAkbm9QcmVsb2FkVGFnID0gJ2NvbnRhaW5lci5ub19wcmVsb2FkJywgc3RyaW5nICRwcml2YXRlVGFnTmFtZSA9ICdjb250YWluZXIucHJpdmF0ZScpCnsKaWYgKDAgPCBcZnVuY19udW1fYXJncygpKSB7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvY29uc29sZScsICc1LjMnLCAnQ29uZmlndXJpbmcgIiVzIiBpcyBkZXByZWNhdGVkLicsIF9fQ0xBU1NfXyk7Cn0KCiR0aGlzLT5jb21tYW5kTG9hZGVyU2VydmljZUlkID0gJGNvbW1hbmRMb2FkZXJTZXJ2aWNlSWQ7CiR0aGlzLT5jb21tYW5kVGFnID0gJGNvbW1hbmRUYWc7CiR0aGlzLT5ub1ByZWxvYWRUYWcgPSAkbm9QcmVsb2FkVGFnOwokdGhpcy0+cHJpdmF0ZVRhZ05hbWUgPSAkcHJpdmF0ZVRhZ05hbWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKENvbnRhaW5lckJ1aWxkZXIgJGNvbnRhaW5lcikKewokY29tbWFuZFNlcnZpY2VzID0gJGNvbnRhaW5lci0+ZmluZFRhZ2dlZFNlcnZpY2VJZHMoJHRoaXMtPmNvbW1hbmRUYWcsIHRydWUpOwokbGF6eUNvbW1hbmRNYXAgPSBbXTsKJGxhenlDb21tYW5kUmVmcyA9IFtdOwokc2VydmljZUlkcyA9IFtdOwoKZm9yZWFjaCAoJGNvbW1hbmRTZXJ2aWNlcyBhcyAkaWQgPT4gJHRhZ3MpIHsKJGRlZmluaXRpb24gPSAkY29udGFpbmVyLT5nZXREZWZpbml0aW9uKCRpZCk7CiRkZWZpbml0aW9uLT5hZGRUYWcoJHRoaXMtPm5vUHJlbG9hZFRhZyk7CiRjbGFzcyA9ICRjb250YWluZXItPmdldFBhcmFtZXRlckJhZygpLT5yZXNvbHZlVmFsdWUoJGRlZmluaXRpb24tPmdldENsYXNzKCkpOwoKaWYgKGlzc2V0KCR0YWdzWzBdWydjb21tYW5kJ10pKSB7CiRhbGlhc2VzID0gJHRhZ3NbMF1bJ2NvbW1hbmQnXTsKfSBlbHNlIHsKaWYgKCEkciA9ICRjb250YWluZXItPmdldFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignQ2xhc3MgIiVzIiB1c2VkIGZvciBzZXJ2aWNlICIlcyIgY2Fubm90IGJlIGZvdW5kLicsICRjbGFzcywgJGlkKSk7Cn0KaWYgKCEkci0+aXNTdWJjbGFzc09mKENvbW1hbmQ6OmNsYXNzKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBzZXJ2aWNlICIlcyIgdGFnZ2VkICIlcyIgbXVzdCBiZSBhIHN1YmNsYXNzIG9mICIlcyIuJywgJGlkLCAkdGhpcy0+Y29tbWFuZFRhZywgQ29tbWFuZDo6Y2xhc3MpKTsKfQokYWxpYXNlcyA9IHN0cl9yZXBsYWNlKCclJywgJyUlJywgJGNsYXNzOjpnZXREZWZhdWx0TmFtZSgpID8/ICcnKTsKfQoKJGFsaWFzZXMgPSBleHBsb2RlKCd8JywgJGFsaWFzZXMgPz8gJycpOwokY29tbWFuZE5hbWUgPSBhcnJheV9zaGlmdCgkYWxpYXNlcyk7CgppZiAoJGlzSGlkZGVuID0gJycgPT09ICRjb21tYW5kTmFtZSkgewokY29tbWFuZE5hbWUgPSBhcnJheV9zaGlmdCgkYWxpYXNlcyk7Cn0KCmlmIChudWxsID09PSAkY29tbWFuZE5hbWUpIHsKaWYgKCEkZGVmaW5pdGlvbi0+aXNQdWJsaWMoKSB8fCAkZGVmaW5pdGlvbi0+aXNQcml2YXRlKCkgfHwgJGRlZmluaXRpb24tPmhhc1RhZygkdGhpcy0+cHJpdmF0ZVRhZ05hbWUpKSB7CiRjb21tYW5kSWQgPSAnY29uc29sZS5jb21tYW5kLnB1YmxpY19hbGlhcy4nLiRpZDsKJGNvbnRhaW5lci0+c2V0QWxpYXMoJGNvbW1hbmRJZCwgJGlkKS0+c2V0UHVibGljKHRydWUpOwokaWQgPSAkY29tbWFuZElkOwp9CiRzZXJ2aWNlSWRzW10gPSAkaWQ7Cgpjb250aW51ZTsKfQoKJGRlc2NyaXB0aW9uID0gJHRhZ3NbMF1bJ2Rlc2NyaXB0aW9uJ10gPz8gbnVsbDsKCnVuc2V0KCR0YWdzWzBdKTsKJGxhenlDb21tYW5kTWFwWyRjb21tYW5kTmFtZV0gPSAkaWQ7CiRsYXp5Q29tbWFuZFJlZnNbJGlkXSA9IG5ldyBUeXBlZFJlZmVyZW5jZSgkaWQsICRjbGFzcyk7Cgpmb3JlYWNoICgkYWxpYXNlcyBhcyAkYWxpYXMpIHsKJGxhenlDb21tYW5kTWFwWyRhbGlhc10gPSAkaWQ7Cn0KCmZvcmVhY2ggKCR0YWdzIGFzICR0YWcpIHsKaWYgKGlzc2V0KCR0YWdbJ2NvbW1hbmQnXSkpIHsKJGFsaWFzZXNbXSA9ICR0YWdbJ2NvbW1hbmQnXTsKJGxhenlDb21tYW5kTWFwWyR0YWdbJ2NvbW1hbmQnXV0gPSAkaWQ7Cn0KCiRkZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbiA/PyAkdGFnWydkZXNjcmlwdGlvbiddID8/IG51bGw7Cn0KCiRkZWZpbml0aW9uLT5hZGRNZXRob2RDYWxsKCdzZXROYW1lJywgWyRjb21tYW5kTmFtZV0pOwoKaWYgKCRhbGlhc2VzKSB7CiRkZWZpbml0aW9uLT5hZGRNZXRob2RDYWxsKCdzZXRBbGlhc2VzJywgWyRhbGlhc2VzXSk7Cn0KCmlmICgkaXNIaWRkZW4pIHsKJGRlZmluaXRpb24tPmFkZE1ldGhvZENhbGwoJ3NldEhpZGRlbicsIFt0cnVlXSk7Cn0KCmlmICghJGRlc2NyaXB0aW9uKSB7CmlmICghJHIgPSAkY29udGFpbmVyLT5nZXRSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0NsYXNzICIlcyIgdXNlZCBmb3Igc2VydmljZSAiJXMiIGNhbm5vdCBiZSBmb3VuZC4nLCAkY2xhc3MsICRpZCkpOwp9CmlmICghJHItPmlzU3ViY2xhc3NPZihDb21tYW5kOjpjbGFzcykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgc2VydmljZSAiJXMiIHRhZ2dlZCAiJXMiIG11c3QgYmUgYSBzdWJjbGFzcyBvZiAiJXMiLicsICRpZCwgJHRoaXMtPmNvbW1hbmRUYWcsIENvbW1hbmQ6OmNsYXNzKSk7Cn0KJGRlc2NyaXB0aW9uID0gc3RyX3JlcGxhY2UoJyUnLCAnJSUnLCAkY2xhc3M6OmdldERlZmF1bHREZXNjcmlwdGlvbigpID8/ICcnKTsKfQoKaWYgKCRkZXNjcmlwdGlvbikgewokZGVmaW5pdGlvbi0+YWRkTWV0aG9kQ2FsbCgnc2V0RGVzY3JpcHRpb24nLCBbJGRlc2NyaXB0aW9uXSk7CgokY29udGFpbmVyLT5yZWdpc3RlcignLicuJGlkLicubGF6eScsIExhenlDb21tYW5kOjpjbGFzcykKLT5zZXRBcmd1bWVudHMoWyRjb21tYW5kTmFtZSwgJGFsaWFzZXMsICRkZXNjcmlwdGlvbiwgJGlzSGlkZGVuLCBuZXcgU2VydmljZUNsb3N1cmVBcmd1bWVudCgkbGF6eUNvbW1hbmRSZWZzWyRpZF0pXSk7CgokbGF6eUNvbW1hbmRSZWZzWyRpZF0gPSBuZXcgUmVmZXJlbmNlKCcuJy4kaWQuJy5sYXp5Jyk7Cn0KfQoKJGNvbnRhaW5lcgotPnJlZ2lzdGVyKCR0aGlzLT5jb21tYW5kTG9hZGVyU2VydmljZUlkLCBDb250YWluZXJDb21tYW5kTG9hZGVyOjpjbGFzcykKLT5zZXRQdWJsaWModHJ1ZSkKLT5hZGRUYWcoJHRoaXMtPm5vUHJlbG9hZFRhZykKLT5zZXRBcmd1bWVudHMoW1NlcnZpY2VMb2NhdG9yVGFnUGFzczo6cmVnaXN0ZXIoJGNvbnRhaW5lciwgJGxhenlDb21tYW5kUmVmcyksICRsYXp5Q29tbWFuZE1hcF0pOwoKJGNvbnRhaW5lci0+c2V0UGFyYW1ldGVyKCdjb25zb2xlLmNvbW1hbmQuaWRzJywgJHNlcnZpY2VJZHMpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uCnsKcHVibGljIGNvbnN0IEdMT0JBTF9OQU1FU1BBQ0UgPSAnX2dsb2JhbCc7Cgpwcml2YXRlICRhcHBsaWNhdGlvbjsKcHJpdmF0ZSAkbmFtZXNwYWNlOwpwcml2YXRlICRzaG93SGlkZGVuOwoKCgoKcHJpdmF0ZSAkbmFtZXNwYWNlczsKCgoKCnByaXZhdGUgJGNvbW1hbmRzOwoKCgoKcHJpdmF0ZSAkYWxpYXNlczsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24sID9zdHJpbmcgJG5hbWVzcGFjZSA9IG51bGwsIGJvb2wgJHNob3dIaWRkZW4gPSBmYWxzZSkKewokdGhpcy0+YXBwbGljYXRpb24gPSAkYXBwbGljYXRpb247CiR0aGlzLT5uYW1lc3BhY2UgPSAkbmFtZXNwYWNlOwokdGhpcy0+c2hvd0hpZGRlbiA9ICRzaG93SGlkZGVuOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlcygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+bmFtZXNwYWNlcykgewokdGhpcy0+aW5zcGVjdEFwcGxpY2F0aW9uKCk7Cn0KCnJldHVybiAkdGhpcy0+bmFtZXNwYWNlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1hbmRzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5jb21tYW5kcykgewokdGhpcy0+aW5zcGVjdEFwcGxpY2F0aW9uKCk7Cn0KCnJldHVybiAkdGhpcy0+Y29tbWFuZHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kKHN0cmluZyAkbmFtZSk6IENvbW1hbmQKewppZiAoIWlzc2V0KCR0aGlzLT5jb21tYW5kc1skbmFtZV0pICYmICFpc3NldCgkdGhpcy0+YWxpYXNlc1skbmFtZV0pKSB7CnRocm93IG5ldyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignQ29tbWFuZCAiJXMiIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCnJldHVybiAkdGhpcy0+Y29tbWFuZHNbJG5hbWVdID8/ICR0aGlzLT5hbGlhc2VzWyRuYW1lXTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBpbnNwZWN0QXBwbGljYXRpb24oKQp7CiR0aGlzLT5jb21tYW5kcyA9IFtdOwokdGhpcy0+bmFtZXNwYWNlcyA9IFtdOwoKJGFsbCA9ICR0aGlzLT5hcHBsaWNhdGlvbi0+YWxsKCR0aGlzLT5uYW1lc3BhY2UgPyAkdGhpcy0+YXBwbGljYXRpb24tPmZpbmROYW1lc3BhY2UoJHRoaXMtPm5hbWVzcGFjZSkgOiBudWxsKTsKZm9yZWFjaCAoJHRoaXMtPnNvcnRDb21tYW5kcygkYWxsKSBhcyAkbmFtZXNwYWNlID0+ICRjb21tYW5kcykgewokbmFtZXMgPSBbXTsKCgpmb3JlYWNoICgkY29tbWFuZHMgYXMgJG5hbWUgPT4gJGNvbW1hbmQpIHsKaWYgKCEkY29tbWFuZC0+Z2V0TmFtZSgpIHx8ICghJHRoaXMtPnNob3dIaWRkZW4gJiYgJGNvbW1hbmQtPmlzSGlkZGVuKCkpKSB7CmNvbnRpbnVlOwp9CgppZiAoJGNvbW1hbmQtPmdldE5hbWUoKSA9PT0gJG5hbWUpIHsKJHRoaXMtPmNvbW1hbmRzWyRuYW1lXSA9ICRjb21tYW5kOwp9IGVsc2UgewokdGhpcy0+YWxpYXNlc1skbmFtZV0gPSAkY29tbWFuZDsKfQoKJG5hbWVzW10gPSAkbmFtZTsKfQoKJHRoaXMtPm5hbWVzcGFjZXNbJG5hbWVzcGFjZV0gPSBbJ2lkJyA9PiAkbmFtZXNwYWNlLCAnY29tbWFuZHMnID0+ICRuYW1lc107Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBzb3J0Q29tbWFuZHMoYXJyYXkgJGNvbW1hbmRzKTogYXJyYXkKewokbmFtZXNwYWNlZENvbW1hbmRzID0gW107CiRnbG9iYWxDb21tYW5kcyA9IFtdOwokc29ydGVkQ29tbWFuZHMgPSBbXTsKZm9yZWFjaCAoJGNvbW1hbmRzIGFzICRuYW1lID0+ICRjb21tYW5kKSB7CiRrZXkgPSAkdGhpcy0+YXBwbGljYXRpb24tPmV4dHJhY3ROYW1lc3BhY2UoJG5hbWUsIDEpOwppZiAoXGluX2FycmF5KCRrZXksIFsnJywgc2VsZjo6R0xPQkFMX05BTUVTUEFDRV0sIHRydWUpKSB7CiRnbG9iYWxDb21tYW5kc1skbmFtZV0gPSAkY29tbWFuZDsKfSBlbHNlIHsKJG5hbWVzcGFjZWRDb21tYW5kc1ska2V5XVskbmFtZV0gPSAkY29tbWFuZDsKfQp9CgppZiAoJGdsb2JhbENvbW1hbmRzKSB7Cmtzb3J0KCRnbG9iYWxDb21tYW5kcyk7CiRzb3J0ZWRDb21tYW5kc1tzZWxmOjpHTE9CQUxfTkFNRVNQQUNFXSA9ICRnbG9iYWxDb21tYW5kczsKfQoKaWYgKCRuYW1lc3BhY2VkQ29tbWFuZHMpIHsKa3NvcnQoJG5hbWVzcGFjZWRDb21tYW5kcywgXFNPUlRfU1RSSU5HKTsKZm9yZWFjaCAoJG5hbWVzcGFjZWRDb21tYW5kcyBhcyAka2V5ID0+ICRjb21tYW5kc1NldCkgewprc29ydCgkY29tbWFuZHNTZXQpOwokc29ydGVkQ29tbWFuZHNbJGtleV0gPSAkY29tbWFuZHNTZXQ7Cn0KfQoKcmV0dXJuICRzb3J0ZWRDb21tYW5kczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgRGVzY3JpcHRvciBpbXBsZW1lbnRzIERlc2NyaXB0b3JJbnRlcmZhY2UKewoKCgpwcm90ZWN0ZWQgJG91dHB1dDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZXNjcmliZShPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgb2JqZWN0ICRvYmplY3QsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7Cgpzd2l0Y2ggKHRydWUpIHsKY2FzZSAkb2JqZWN0IGluc3RhbmNlb2YgSW5wdXRBcmd1bWVudDoKJHRoaXMtPmRlc2NyaWJlSW5wdXRBcmd1bWVudCgkb2JqZWN0LCAkb3B0aW9ucyk7CmJyZWFrOwpjYXNlICRvYmplY3QgaW5zdGFuY2VvZiBJbnB1dE9wdGlvbjoKJHRoaXMtPmRlc2NyaWJlSW5wdXRPcHRpb24oJG9iamVjdCwgJG9wdGlvbnMpOwpicmVhazsKY2FzZSAkb2JqZWN0IGluc3RhbmNlb2YgSW5wdXREZWZpbml0aW9uOgokdGhpcy0+ZGVzY3JpYmVJbnB1dERlZmluaXRpb24oJG9iamVjdCwgJG9wdGlvbnMpOwpicmVhazsKY2FzZSAkb2JqZWN0IGluc3RhbmNlb2YgQ29tbWFuZDoKJHRoaXMtPmRlc2NyaWJlQ29tbWFuZCgkb2JqZWN0LCAkb3B0aW9ucyk7CmJyZWFrOwpjYXNlICRvYmplY3QgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbjoKJHRoaXMtPmRlc2NyaWJlQXBwbGljYXRpb24oJG9iamVjdCwgJG9wdGlvbnMpOwpicmVhazsKZGVmYXVsdDoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdPYmplY3Qgb2YgdHlwZSAiJXMiIGlzIG5vdCBkZXNjcmliYWJsZS4nLCBnZXRfZGVidWdfdHlwZSgkb2JqZWN0KSkpOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB3cml0ZShzdHJpbmcgJGNvbnRlbnQsIGJvb2wgJGRlY29yYXRlZCA9IGZhbHNlKQp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCRjb250ZW50LCBmYWxzZSwgJGRlY29yYXRlZCA/IE91dHB1dEludGVyZmFjZTo6T1VUUFVUX05PUk1BTCA6IE91dHB1dEludGVyZmFjZTo6T1VUUFVUX1JBVyk7Cn0KCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0QXJndW1lbnQoSW5wdXRBcmd1bWVudCAkYXJndW1lbnQsIGFycmF5ICRvcHRpb25zID0gW10pOwoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRPcHRpb24oSW5wdXRPcHRpb24gJG9wdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSk7CgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dERlZmluaXRpb24oSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKTsKCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUNvbW1hbmQoQ29tbWFuZCAkY29tbWFuZCwgYXJyYXkgJG9wdGlvbnMgPSBbXSk7CgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIERlc2NyaXB0b3JJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gZGVzY3JpYmUoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIG9iamVjdCAkb2JqZWN0LCBhcnJheSAkb3B0aW9ucyA9IFtdKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0RGVmaW5pdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CgoKCgoKCgoKY2xhc3MgSnNvbkRlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRBcmd1bWVudChJbnB1dEFyZ3VtZW50ICRhcmd1bWVudCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEYXRhKCR0aGlzLT5nZXRJbnB1dEFyZ3VtZW50RGF0YSgkYXJndW1lbnQpLCAkb3B0aW9ucyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0T3B0aW9uKElucHV0T3B0aW9uICRvcHRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlRGF0YSgkdGhpcy0+Z2V0SW5wdXRPcHRpb25EYXRhKCRvcHRpb24pLCAkb3B0aW9ucyk7CmlmICgkb3B0aW9uLT5pc05lZ2F0YWJsZSgpKSB7CiR0aGlzLT53cml0ZURhdGEoJHRoaXMtPmdldElucHV0T3B0aW9uRGF0YSgkb3B0aW9uLCB0cnVlKSwgJG9wdGlvbnMpOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0RGVmaW5pdGlvbihJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlRGF0YSgkdGhpcy0+Z2V0SW5wdXREZWZpbml0aW9uRGF0YSgkZGVmaW5pdGlvbiksICRvcHRpb25zKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQ29tbWFuZChDb21tYW5kICRjb21tYW5kLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZURhdGEoJHRoaXMtPmdldENvbW1hbmREYXRhKCRjb21tYW5kLCAkb3B0aW9uc1snc2hvcnQnXSA/PyBmYWxzZSksICRvcHRpb25zKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQXBwbGljYXRpb24oQXBwbGljYXRpb24gJGFwcGxpY2F0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiRkZXNjcmliZWROYW1lc3BhY2UgPSAkb3B0aW9uc1snbmFtZXNwYWNlJ10gPz8gbnVsbDsKJGRlc2NyaXB0aW9uID0gbmV3IEFwcGxpY2F0aW9uRGVzY3JpcHRpb24oJGFwcGxpY2F0aW9uLCAkZGVzY3JpYmVkTmFtZXNwYWNlLCB0cnVlKTsKJGNvbW1hbmRzID0gW107Cgpmb3JlYWNoICgkZGVzY3JpcHRpb24tPmdldENvbW1hbmRzKCkgYXMgJGNvbW1hbmQpIHsKJGNvbW1hbmRzW10gPSAkdGhpcy0+Z2V0Q29tbWFuZERhdGEoJGNvbW1hbmQsICRvcHRpb25zWydzaG9ydCddID8/IGZhbHNlKTsKfQoKJGRhdGEgPSBbXTsKaWYgKCdVTktOT1dOJyAhPT0gJGFwcGxpY2F0aW9uLT5nZXROYW1lKCkpIHsKJGRhdGFbJ2FwcGxpY2F0aW9uJ11bJ25hbWUnXSA9ICRhcHBsaWNhdGlvbi0+Z2V0TmFtZSgpOwppZiAoJ1VOS05PV04nICE9PSAkYXBwbGljYXRpb24tPmdldFZlcnNpb24oKSkgewokZGF0YVsnYXBwbGljYXRpb24nXVsndmVyc2lvbiddID0gJGFwcGxpY2F0aW9uLT5nZXRWZXJzaW9uKCk7Cn0KfQoKJGRhdGFbJ2NvbW1hbmRzJ10gPSAkY29tbWFuZHM7CgppZiAoJGRlc2NyaWJlZE5hbWVzcGFjZSkgewokZGF0YVsnbmFtZXNwYWNlJ10gPSAkZGVzY3JpYmVkTmFtZXNwYWNlOwp9IGVsc2UgewokZGF0YVsnbmFtZXNwYWNlcyddID0gYXJyYXlfdmFsdWVzKCRkZXNjcmlwdGlvbi0+Z2V0TmFtZXNwYWNlcygpKTsKfQoKJHRoaXMtPndyaXRlRGF0YSgkZGF0YSwgJG9wdGlvbnMpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHdyaXRlRGF0YShhcnJheSAkZGF0YSwgYXJyYXkgJG9wdGlvbnMpCnsKJGZsYWdzID0gJG9wdGlvbnNbJ2pzb25fZW5jb2RpbmcnXSA/PyAwOwoKJHRoaXMtPndyaXRlKGpzb25fZW5jb2RlKCRkYXRhLCAkZmxhZ3MpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRJbnB1dEFyZ3VtZW50RGF0YShJbnB1dEFyZ3VtZW50ICRhcmd1bWVudCk6IGFycmF5CnsKcmV0dXJuIFsKJ25hbWUnID0+ICRhcmd1bWVudC0+Z2V0TmFtZSgpLAonaXNfcmVxdWlyZWQnID0+ICRhcmd1bWVudC0+aXNSZXF1aXJlZCgpLAonaXNfYXJyYXknID0+ICRhcmd1bWVudC0+aXNBcnJheSgpLAonZGVzY3JpcHRpb24nID0+IHByZWdfcmVwbGFjZSgnL1xzKltcclxuXVxzKi8nLCAnICcsICRhcmd1bWVudC0+Z2V0RGVzY3JpcHRpb24oKSksCidkZWZhdWx0JyA9PiBcSU5GID09PSAkYXJndW1lbnQtPmdldERlZmF1bHQoKSA/ICdJTkYnIDogJGFyZ3VtZW50LT5nZXREZWZhdWx0KCksCl07Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0SW5wdXRPcHRpb25EYXRhKElucHV0T3B0aW9uICRvcHRpb24sIGJvb2wgJG5lZ2F0ZWQgPSBmYWxzZSk6IGFycmF5CnsKcmV0dXJuICRuZWdhdGVkID8gWwonbmFtZScgPT4gJy0tbm8tJy4kb3B0aW9uLT5nZXROYW1lKCksCidzaG9ydGN1dCcgPT4gJycsCidhY2NlcHRfdmFsdWUnID0+IGZhbHNlLAonaXNfdmFsdWVfcmVxdWlyZWQnID0+IGZhbHNlLAonaXNfbXVsdGlwbGUnID0+IGZhbHNlLAonZGVzY3JpcHRpb24nID0+ICdOZWdhdGUgdGhlICItLScuJG9wdGlvbi0+Z2V0TmFtZSgpLiciIG9wdGlvbicsCidkZWZhdWx0JyA9PiBmYWxzZSwKXSA6IFsKJ25hbWUnID0+ICctLScuJG9wdGlvbi0+Z2V0TmFtZSgpLAonc2hvcnRjdXQnID0+ICRvcHRpb24tPmdldFNob3J0Y3V0KCkgPyAnLScuc3RyX3JlcGxhY2UoJ3wnLCAnfC0nLCAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKSA6ICcnLAonYWNjZXB0X3ZhbHVlJyA9PiAkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpLAonaXNfdmFsdWVfcmVxdWlyZWQnID0+ICRvcHRpb24tPmlzVmFsdWVSZXF1aXJlZCgpLAonaXNfbXVsdGlwbGUnID0+ICRvcHRpb24tPmlzQXJyYXkoKSwKJ2Rlc2NyaXB0aW9uJyA9PiBwcmVnX3JlcGxhY2UoJy9ccypbXHJcbl1ccyovJywgJyAnLCAkb3B0aW9uLT5nZXREZXNjcmlwdGlvbigpKSwKJ2RlZmF1bHQnID0+IFxJTkYgPT09ICRvcHRpb24tPmdldERlZmF1bHQoKSA/ICdJTkYnIDogJG9wdGlvbi0+Z2V0RGVmYXVsdCgpLApdOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldElucHV0RGVmaW5pdGlvbkRhdGEoSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uKTogYXJyYXkKewokaW5wdXRBcmd1bWVudHMgPSBbXTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpIGFzICRuYW1lID0+ICRhcmd1bWVudCkgewokaW5wdXRBcmd1bWVudHNbJG5hbWVdID0gJHRoaXMtPmdldElucHV0QXJndW1lbnREYXRhKCRhcmd1bWVudCk7Cn0KCiRpbnB1dE9wdGlvbnMgPSBbXTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSBhcyAkbmFtZSA9PiAkb3B0aW9uKSB7CiRpbnB1dE9wdGlvbnNbJG5hbWVdID0gJHRoaXMtPmdldElucHV0T3B0aW9uRGF0YSgkb3B0aW9uKTsKaWYgKCRvcHRpb24tPmlzTmVnYXRhYmxlKCkpIHsKJGlucHV0T3B0aW9uc1snbm8tJy4kbmFtZV0gPSAkdGhpcy0+Z2V0SW5wdXRPcHRpb25EYXRhKCRvcHRpb24sIHRydWUpOwp9Cn0KCnJldHVybiBbJ2FyZ3VtZW50cycgPT4gJGlucHV0QXJndW1lbnRzLCAnb3B0aW9ucycgPT4gJGlucHV0T3B0aW9uc107Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tbWFuZERhdGEoQ29tbWFuZCAkY29tbWFuZCwgYm9vbCAkc2hvcnQgPSBmYWxzZSk6IGFycmF5CnsKJGRhdGEgPSBbCiduYW1lJyA9PiAkY29tbWFuZC0+Z2V0TmFtZSgpLAonZGVzY3JpcHRpb24nID0+ICRjb21tYW5kLT5nZXREZXNjcmlwdGlvbigpLApdOwoKaWYgKCRzaG9ydCkgewokZGF0YSArPSBbCid1c2FnZScgPT4gJGNvbW1hbmQtPmdldEFsaWFzZXMoKSwKXTsKfSBlbHNlIHsKJGNvbW1hbmQtPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKGZhbHNlKTsKCiRkYXRhICs9IFsKJ3VzYWdlJyA9PiBhcnJheV9tZXJnZShbJGNvbW1hbmQtPmdldFN5bm9wc2lzKCldLCAkY29tbWFuZC0+Z2V0VXNhZ2VzKCksICRjb21tYW5kLT5nZXRBbGlhc2VzKCkpLAonaGVscCcgPT4gJGNvbW1hbmQtPmdldFByb2Nlc3NlZEhlbHAoKSwKJ2RlZmluaXRpb24nID0+ICR0aGlzLT5nZXRJbnB1dERlZmluaXRpb25EYXRhKCRjb21tYW5kLT5nZXREZWZpbml0aW9uKCkpLApdOwp9CgokZGF0YVsnaGlkZGVuJ10gPSAkY29tbWFuZC0+aXNIaWRkZW4oKTsKCnJldHVybiAkZGF0YTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKCgpjbGFzcyBNYXJrZG93bkRlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yCnsKCgoKcHVibGljIGZ1bmN0aW9uIGRlc2NyaWJlKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBvYmplY3QgJG9iamVjdCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokZGVjb3JhdGVkID0gJG91dHB1dC0+aXNEZWNvcmF0ZWQoKTsKJG91dHB1dC0+c2V0RGVjb3JhdGVkKGZhbHNlKTsKCnBhcmVudDo6ZGVzY3JpYmUoJG91dHB1dCwgJG9iamVjdCwgJG9wdGlvbnMpOwoKJG91dHB1dC0+c2V0RGVjb3JhdGVkKCRkZWNvcmF0ZWQpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gd3JpdGUoc3RyaW5nICRjb250ZW50LCBib29sICRkZWNvcmF0ZWQgPSB0cnVlKQp7CnBhcmVudDo6d3JpdGUoJGNvbnRlbnQsICRkZWNvcmF0ZWQpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dEFyZ3VtZW50KElucHV0QXJndW1lbnQgJGFyZ3VtZW50LCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZSgKJyMjIyMgYCcuKCRhcmd1bWVudC0+Z2V0TmFtZSgpID86ICc8bm9uZT4nKS4iYFxuXG4iCi4oJGFyZ3VtZW50LT5nZXREZXNjcmlwdGlvbigpID8gcHJlZ19yZXBsYWNlKCcvXHMqW1xyXG5dXHMqLycsICJcbiIsICRhcmd1bWVudC0+Z2V0RGVzY3JpcHRpb24oKSkuIlxuXG4iIDogJycpCi4nKiBJcyByZXF1aXJlZDogJy4oJGFyZ3VtZW50LT5pc1JlcXVpcmVkKCkgPyAneWVzJyA6ICdubycpLiJcbiIKLicqIElzIGFycmF5OiAnLigkYXJndW1lbnQtPmlzQXJyYXkoKSA/ICd5ZXMnIDogJ25vJykuIlxuIgouJyogRGVmYXVsdDogYCcuc3RyX3JlcGxhY2UoIlxuIiwgJycsIHZhcl9leHBvcnQoJGFyZ3VtZW50LT5nZXREZWZhdWx0KCksIHRydWUpKS4nYCcKKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRPcHRpb24oSW5wdXRPcHRpb24gJG9wdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokbmFtZSA9ICctLScuJG9wdGlvbi0+Z2V0TmFtZSgpOwppZiAoJG9wdGlvbi0+aXNOZWdhdGFibGUoKSkgewokbmFtZSAuPSAnfC0tbm8tJy4kb3B0aW9uLT5nZXROYW1lKCk7Cn0KaWYgKCRvcHRpb24tPmdldFNob3J0Y3V0KCkpIHsKJG5hbWUgLj0gJ3wtJy5zdHJfcmVwbGFjZSgnfCcsICd8LScsICRvcHRpb24tPmdldFNob3J0Y3V0KCkpLicnOwp9CgokdGhpcy0+d3JpdGUoCicjIyMjIGAnLiRuYW1lLidgJy4iXG5cbiIKLigkb3B0aW9uLT5nZXREZXNjcmlwdGlvbigpID8gcHJlZ19yZXBsYWNlKCcvXHMqW1xyXG5dXHMqLycsICJcbiIsICRvcHRpb24tPmdldERlc2NyaXB0aW9uKCkpLiJcblxuIiA6ICcnKQouJyogQWNjZXB0IHZhbHVlOiAnLigkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpID8gJ3llcycgOiAnbm8nKS4iXG4iCi4nKiBJcyB2YWx1ZSByZXF1aXJlZDogJy4oJG9wdGlvbi0+aXNWYWx1ZVJlcXVpcmVkKCkgPyAneWVzJyA6ICdubycpLiJcbiIKLicqIElzIG11bHRpcGxlOiAnLigkb3B0aW9uLT5pc0FycmF5KCkgPyAneWVzJyA6ICdubycpLiJcbiIKLicqIElzIG5lZ2F0YWJsZTogJy4oJG9wdGlvbi0+aXNOZWdhdGFibGUoKSA/ICd5ZXMnIDogJ25vJykuIlxuIgouJyogRGVmYXVsdDogYCcuc3RyX3JlcGxhY2UoIlxuIiwgJycsIHZhcl9leHBvcnQoJG9wdGlvbi0+Z2V0RGVmYXVsdCgpLCB0cnVlKSkuJ2AnCik7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0RGVmaW5pdGlvbihJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKaWYgKCRzaG93QXJndW1lbnRzID0gXGNvdW50KCRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSkgPiAwKSB7CiR0aGlzLT53cml0ZSgnIyMjIEFyZ3VtZW50cycpOwpmb3JlYWNoICgkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkgYXMgJGFyZ3VtZW50KSB7CiR0aGlzLT53cml0ZSgiXG5cbiIpOwppZiAobnVsbCAhPT0gJGRlc2NyaWJlSW5wdXRBcmd1bWVudCA9ICR0aGlzLT5kZXNjcmliZUlucHV0QXJndW1lbnQoJGFyZ3VtZW50KSkgewokdGhpcy0+d3JpdGUoJGRlc2NyaWJlSW5wdXRBcmd1bWVudCk7Cn0KfQp9CgppZiAoXGNvdW50KCRkZWZpbml0aW9uLT5nZXRPcHRpb25zKCkpID4gMCkgewppZiAoJHNob3dBcmd1bWVudHMpIHsKJHRoaXMtPndyaXRlKCJcblxuIik7Cn0KCiR0aGlzLT53cml0ZSgnIyMjIE9wdGlvbnMnKTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSBhcyAkb3B0aW9uKSB7CiR0aGlzLT53cml0ZSgiXG5cbiIpOwppZiAobnVsbCAhPT0gJGRlc2NyaWJlSW5wdXRPcHRpb24gPSAkdGhpcy0+ZGVzY3JpYmVJbnB1dE9wdGlvbigkb3B0aW9uKSkgewokdGhpcy0+d3JpdGUoJGRlc2NyaWJlSW5wdXRPcHRpb24pOwp9Cn0KfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVDb21tYW5kKENvbW1hbmQgJGNvbW1hbmQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKaWYgKCRvcHRpb25zWydzaG9ydCddID8/IGZhbHNlKSB7CiR0aGlzLT53cml0ZSgKJ2AnLiRjb21tYW5kLT5nZXROYW1lKCkuImBcbiIKLnN0cl9yZXBlYXQoJy0nLCBIZWxwZXI6OndpZHRoKCRjb21tYW5kLT5nZXROYW1lKCkpICsgMikuIlxuXG4iCi4oJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkgPyAkY29tbWFuZC0+Z2V0RGVzY3JpcHRpb24oKS4iXG5cbiIgOiAnJykKLicjIyMgVXNhZ2UnLiJcblxuIgouYXJyYXlfcmVkdWNlKCRjb21tYW5kLT5nZXRBbGlhc2VzKCksIGZ1bmN0aW9uICgkY2FycnksICR1c2FnZSkgewpyZXR1cm4gJGNhcnJ5LicqIGAnLiR1c2FnZS4nYCcuIlxuIjsKfSkKKTsKCnJldHVybjsKfQoKJGNvbW1hbmQtPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKGZhbHNlKTsKCiR0aGlzLT53cml0ZSgKJ2AnLiRjb21tYW5kLT5nZXROYW1lKCkuImBcbiIKLnN0cl9yZXBlYXQoJy0nLCBIZWxwZXI6OndpZHRoKCRjb21tYW5kLT5nZXROYW1lKCkpICsgMikuIlxuXG4iCi4oJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkgPyAkY29tbWFuZC0+Z2V0RGVzY3JpcHRpb24oKS4iXG5cbiIgOiAnJykKLicjIyMgVXNhZ2UnLiJcblxuIgouYXJyYXlfcmVkdWNlKGFycmF5X21lcmdlKFskY29tbWFuZC0+Z2V0U3lub3BzaXMoKV0sICRjb21tYW5kLT5nZXRBbGlhc2VzKCksICRjb21tYW5kLT5nZXRVc2FnZXMoKSksIGZ1bmN0aW9uICgkY2FycnksICR1c2FnZSkgewpyZXR1cm4gJGNhcnJ5LicqIGAnLiR1c2FnZS4nYCcuIlxuIjsKfSkKKTsKCmlmICgkaGVscCA9ICRjb21tYW5kLT5nZXRQcm9jZXNzZWRIZWxwKCkpIHsKJHRoaXMtPndyaXRlKCJcbiIpOwokdGhpcy0+d3JpdGUoJGhlbHApOwp9CgokZGVmaW5pdGlvbiA9ICRjb21tYW5kLT5nZXREZWZpbml0aW9uKCk7CmlmICgkZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpIHx8ICRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSkgewokdGhpcy0+d3JpdGUoIlxuXG4iKTsKJHRoaXMtPmRlc2NyaWJlSW5wdXREZWZpbml0aW9uKCRkZWZpbml0aW9uKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJGRlc2NyaWJlZE5hbWVzcGFjZSA9ICRvcHRpb25zWyduYW1lc3BhY2UnXSA/PyBudWxsOwokZGVzY3JpcHRpb24gPSBuZXcgQXBwbGljYXRpb25EZXNjcmlwdGlvbigkYXBwbGljYXRpb24sICRkZXNjcmliZWROYW1lc3BhY2UpOwokdGl0bGUgPSAkdGhpcy0+Z2V0QXBwbGljYXRpb25UaXRsZSgkYXBwbGljYXRpb24pOwoKJHRoaXMtPndyaXRlKCR0aXRsZS4iXG4iLnN0cl9yZXBlYXQoJz0nLCBIZWxwZXI6OndpZHRoKCR0aXRsZSkpKTsKCmZvcmVhY2ggKCRkZXNjcmlwdGlvbi0+Z2V0TmFtZXNwYWNlcygpIGFzICRuYW1lc3BhY2UpIHsKaWYgKEFwcGxpY2F0aW9uRGVzY3JpcHRpb246OkdMT0JBTF9OQU1FU1BBQ0UgIT09ICRuYW1lc3BhY2VbJ2lkJ10pIHsKJHRoaXMtPndyaXRlKCJcblxuIik7CiR0aGlzLT53cml0ZSgnKionLiRuYW1lc3BhY2VbJ2lkJ10uJzoqKicpOwp9CgokdGhpcy0+d3JpdGUoIlxuXG4iKTsKJHRoaXMtPndyaXRlKGltcGxvZGUoIlxuIiwgYXJyYXlfbWFwKGZ1bmN0aW9uICgkY29tbWFuZE5hbWUpIHVzZSAoJGRlc2NyaXB0aW9uKSB7CnJldHVybiBzcHJpbnRmKCcqIFtgJXNgXSgjJXMpJywgJGNvbW1hbmROYW1lLCBzdHJfcmVwbGFjZSgnOicsICcnLCAkZGVzY3JpcHRpb24tPmdldENvbW1hbmQoJGNvbW1hbmROYW1lKS0+Z2V0TmFtZSgpKSk7Cn0sICRuYW1lc3BhY2VbJ2NvbW1hbmRzJ10pKSk7Cn0KCmZvcmVhY2ggKCRkZXNjcmlwdGlvbi0+Z2V0Q29tbWFuZHMoKSBhcyAkY29tbWFuZCkgewokdGhpcy0+d3JpdGUoIlxuXG4iKTsKaWYgKG51bGwgIT09ICRkZXNjcmliZUNvbW1hbmQgPSAkdGhpcy0+ZGVzY3JpYmVDb21tYW5kKCRjb21tYW5kLCAkb3B0aW9ucykpIHsKJHRoaXMtPndyaXRlKCRkZXNjcmliZUNvbW1hbmQpOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRBcHBsaWNhdGlvblRpdGxlKEFwcGxpY2F0aW9uICRhcHBsaWNhdGlvbik6IHN0cmluZwp7CmlmICgnVU5LTk9XTicgIT09ICRhcHBsaWNhdGlvbi0+Z2V0TmFtZSgpKSB7CmlmICgnVU5LTk9XTicgIT09ICRhcHBsaWNhdGlvbi0+Z2V0VmVyc2lvbigpKSB7CnJldHVybiBzcHJpbnRmKCclcyAlcycsICRhcHBsaWNhdGlvbi0+Z2V0TmFtZSgpLCAkYXBwbGljYXRpb24tPmdldFZlcnNpb24oKSk7Cn0KCnJldHVybiAkYXBwbGljYXRpb24tPmdldE5hbWUoKTsKfQoKcmV0dXJuICdDb25zb2xlIFRvb2wnOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcSGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwoKCgoKCgoKCmNsYXNzIFRleHREZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvcgp7CgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0QXJndW1lbnQoSW5wdXRBcmd1bWVudCAkYXJndW1lbnQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKaWYgKG51bGwgIT09ICRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpICYmICghXGlzX2FycmF5KCRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpKSB8fCBcY291bnQoJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkpKSkgewokZGVmYXVsdCA9IHNwcmludGYoJzxjb21tZW50PiBbZGVmYXVsdDogJXNdPC9jb21tZW50PicsICR0aGlzLT5mb3JtYXREZWZhdWx0VmFsdWUoJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkpKTsKfSBlbHNlIHsKJGRlZmF1bHQgPSAnJzsKfQoKJHRvdGFsV2lkdGggPSAkb3B0aW9uc1sndG90YWxfd2lkdGgnXSA/PyBIZWxwZXI6OndpZHRoKCRhcmd1bWVudC0+Z2V0TmFtZSgpKTsKJHNwYWNpbmdXaWR0aCA9ICR0b3RhbFdpZHRoIC0gXHN0cmxlbigkYXJndW1lbnQtPmdldE5hbWUoKSk7CgokdGhpcy0+d3JpdGVUZXh0KHNwcmludGYoJyAgPGluZm8+JXM8L2luZm8+ICAlcyVzJXMnLAokYXJndW1lbnQtPmdldE5hbWUoKSwKc3RyX3JlcGVhdCgnICcsICRzcGFjaW5nV2lkdGgpLAoKcHJlZ19yZXBsYWNlKCcvXHMqW1xyXG5dXHMqLycsICJcbiIuc3RyX3JlcGVhdCgnICcsICR0b3RhbFdpZHRoICsgNCksICRhcmd1bWVudC0+Z2V0RGVzY3JpcHRpb24oKSksCiRkZWZhdWx0CiksICRvcHRpb25zKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRPcHRpb24oSW5wdXRPcHRpb24gJG9wdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewppZiAoJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSAmJiBudWxsICE9PSAkb3B0aW9uLT5nZXREZWZhdWx0KCkgJiYgKCFcaXNfYXJyYXkoJG9wdGlvbi0+Z2V0RGVmYXVsdCgpKSB8fCBcY291bnQoJG9wdGlvbi0+Z2V0RGVmYXVsdCgpKSkpIHsKJGRlZmF1bHQgPSBzcHJpbnRmKCc8Y29tbWVudD4gW2RlZmF1bHQ6ICVzXTwvY29tbWVudD4nLCAkdGhpcy0+Zm9ybWF0RGVmYXVsdFZhbHVlKCRvcHRpb24tPmdldERlZmF1bHQoKSkpOwp9IGVsc2UgewokZGVmYXVsdCA9ICcnOwp9CgokdmFsdWUgPSAnJzsKaWYgKCRvcHRpb24tPmFjY2VwdFZhbHVlKCkpIHsKJHZhbHVlID0gJz0nLnN0cnRvdXBwZXIoJG9wdGlvbi0+Z2V0TmFtZSgpKTsKCmlmICgkb3B0aW9uLT5pc1ZhbHVlT3B0aW9uYWwoKSkgewokdmFsdWUgPSAnWycuJHZhbHVlLiddJzsKfQp9CgokdG90YWxXaWR0aCA9ICRvcHRpb25zWyd0b3RhbF93aWR0aCddID8/ICR0aGlzLT5jYWxjdWxhdGVUb3RhbFdpZHRoRm9yT3B0aW9ucyhbJG9wdGlvbl0pOwokc3lub3BzaXMgPSBzcHJpbnRmKCclcyVzJywKJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSA/IHNwcmludGYoJy0lcywgJywgJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSkgOiAnICAgICcsCnNwcmludGYoJG9wdGlvbi0+aXNOZWdhdGFibGUoKSA/ICctLSUxJHN8LS1uby0lMSRzJyA6ICctLSUxJHMlMiRzJywgJG9wdGlvbi0+Z2V0TmFtZSgpLCAkdmFsdWUpCik7Cgokc3BhY2luZ1dpZHRoID0gJHRvdGFsV2lkdGggLSBIZWxwZXI6OndpZHRoKCRzeW5vcHNpcyk7CgokdGhpcy0+d3JpdGVUZXh0KHNwcmludGYoJyAgPGluZm8+JXM8L2luZm8+ICAlcyVzJXMlcycsCiRzeW5vcHNpcywKc3RyX3JlcGVhdCgnICcsICRzcGFjaW5nV2lkdGgpLAoKcHJlZ19yZXBsYWNlKCcvXHMqW1xyXG5dXHMqLycsICJcbiIuc3RyX3JlcGVhdCgnICcsICR0b3RhbFdpZHRoICsgNCksICRvcHRpb24tPmdldERlc2NyaXB0aW9uKCkpLAokZGVmYXVsdCwKJG9wdGlvbi0+aXNBcnJheSgpID8gJzxjb21tZW50PiAobXVsdGlwbGUgdmFsdWVzIGFsbG93ZWQpPC9jb21tZW50PicgOiAnJwopLCAkb3B0aW9ucyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0RGVmaW5pdGlvbihJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRvdGFsV2lkdGggPSAkdGhpcy0+Y2FsY3VsYXRlVG90YWxXaWR0aEZvck9wdGlvbnMoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSk7CmZvcmVhY2ggKCRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSBhcyAkYXJndW1lbnQpIHsKJHRvdGFsV2lkdGggPSBtYXgoJHRvdGFsV2lkdGgsIEhlbHBlcjo6d2lkdGgoJGFyZ3VtZW50LT5nZXROYW1lKCkpKTsKfQoKaWYgKCRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSkgewokdGhpcy0+d3JpdGVUZXh0KCc8Y29tbWVudD5Bcmd1bWVudHM6PC9jb21tZW50PicsICRvcHRpb25zKTsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpIGFzICRhcmd1bWVudCkgewokdGhpcy0+ZGVzY3JpYmVJbnB1dEFyZ3VtZW50KCRhcmd1bWVudCwgYXJyYXlfbWVyZ2UoJG9wdGlvbnMsIFsndG90YWxfd2lkdGgnID0+ICR0b3RhbFdpZHRoXSkpOwokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwp9Cn0KCmlmICgkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkgJiYgJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSkgewokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwp9CgppZiAoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSkgewokbGF0ZXJPcHRpb25zID0gW107CgokdGhpcy0+d3JpdGVUZXh0KCc8Y29tbWVudD5PcHRpb25zOjwvY29tbWVudD4nLCAkb3B0aW9ucyk7CmZvcmVhY2ggKCRkZWZpbml0aW9uLT5nZXRPcHRpb25zKCkgYXMgJG9wdGlvbikgewppZiAoXHN0cmxlbigkb3B0aW9uLT5nZXRTaG9ydGN1dCgpID8/ICcnKSA+IDEpIHsKJGxhdGVyT3B0aW9uc1tdID0gJG9wdGlvbjsKY29udGludWU7Cn0KJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPmRlc2NyaWJlSW5wdXRPcHRpb24oJG9wdGlvbiwgYXJyYXlfbWVyZ2UoJG9wdGlvbnMsIFsndG90YWxfd2lkdGgnID0+ICR0b3RhbFdpZHRoXSkpOwp9CmZvcmVhY2ggKCRsYXRlck9wdGlvbnMgYXMgJG9wdGlvbikgewokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokdGhpcy0+ZGVzY3JpYmVJbnB1dE9wdGlvbigkb3B0aW9uLCBhcnJheV9tZXJnZSgkb3B0aW9ucywgWyd0b3RhbF93aWR0aCcgPT4gJHRvdGFsV2lkdGhdKSk7Cn0KfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVDb21tYW5kKENvbW1hbmQgJGNvbW1hbmQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJGNvbW1hbmQtPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKGZhbHNlKTsKCmlmICgkZGVzY3JpcHRpb24gPSAkY29tbWFuZC0+Z2V0RGVzY3JpcHRpb24oKSkgewokdGhpcy0+d3JpdGVUZXh0KCc8Y29tbWVudD5EZXNjcmlwdGlvbjo8L2NvbW1lbnQ+JywgJG9wdGlvbnMpOwokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokdGhpcy0+d3JpdGVUZXh0KCcgICcuJGRlc2NyaXB0aW9uKTsKJHRoaXMtPndyaXRlVGV4dCgiXG5cbiIpOwp9CgokdGhpcy0+d3JpdGVUZXh0KCc8Y29tbWVudD5Vc2FnZTo8L2NvbW1lbnQ+JywgJG9wdGlvbnMpOwpmb3JlYWNoIChhcnJheV9tZXJnZShbJGNvbW1hbmQtPmdldFN5bm9wc2lzKHRydWUpXSwgJGNvbW1hbmQtPmdldEFsaWFzZXMoKSwgJGNvbW1hbmQtPmdldFVzYWdlcygpKSBhcyAkdXNhZ2UpIHsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPndyaXRlVGV4dCgnICAnLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCR1c2FnZSksICRvcHRpb25zKTsKfQokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwoKJGRlZmluaXRpb24gPSAkY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpOwppZiAoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSB8fCAkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkpIHsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPmRlc2NyaWJlSW5wdXREZWZpbml0aW9uKCRkZWZpbml0aW9uLCAkb3B0aW9ucyk7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7Cn0KCiRoZWxwID0gJGNvbW1hbmQtPmdldFByb2Nlc3NlZEhlbHAoKTsKaWYgKCRoZWxwICYmICRoZWxwICE9PSAkZGVzY3JpcHRpb24pIHsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPndyaXRlVGV4dCgnPGNvbW1lbnQ+SGVscDo8L2NvbW1lbnQ+JywgJG9wdGlvbnMpOwokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokdGhpcy0+d3JpdGVUZXh0KCcgICcuc3RyX3JlcGxhY2UoIlxuIiwgIlxuICAiLCAkaGVscCksICRvcHRpb25zKTsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJGRlc2NyaWJlZE5hbWVzcGFjZSA9ICRvcHRpb25zWyduYW1lc3BhY2UnXSA/PyBudWxsOwokZGVzY3JpcHRpb24gPSBuZXcgQXBwbGljYXRpb25EZXNjcmlwdGlvbigkYXBwbGljYXRpb24sICRkZXNjcmliZWROYW1lc3BhY2UpOwoKaWYgKGlzc2V0KCRvcHRpb25zWydyYXdfdGV4dCddKSAmJiAkb3B0aW9uc1sncmF3X3RleHQnXSkgewokd2lkdGggPSAkdGhpcy0+Z2V0Q29sdW1uV2lkdGgoJGRlc2NyaXB0aW9uLT5nZXRDb21tYW5kcygpKTsKCmZvcmVhY2ggKCRkZXNjcmlwdGlvbi0+Z2V0Q29tbWFuZHMoKSBhcyAkY29tbWFuZCkgewokdGhpcy0+d3JpdGVUZXh0KHNwcmludGYoIiUteyR3aWR0aH1zICVzIiwgJGNvbW1hbmQtPmdldE5hbWUoKSwgJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkpLCAkb3B0aW9ucyk7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7Cn0KfSBlbHNlIHsKaWYgKCcnICE9ICRoZWxwID0gJGFwcGxpY2F0aW9uLT5nZXRIZWxwKCkpIHsKJHRoaXMtPndyaXRlVGV4dCgiJGhlbHBcblxuIiwgJG9wdGlvbnMpOwp9CgokdGhpcy0+d3JpdGVUZXh0KCI8Y29tbWVudD5Vc2FnZTo8L2NvbW1lbnQ+XG4iLCAkb3B0aW9ucyk7CiR0aGlzLT53cml0ZVRleHQoIiAgY29tbWFuZCBbb3B0aW9uc10gW2FyZ3VtZW50c11cblxuIiwgJG9wdGlvbnMpOwoKJHRoaXMtPmRlc2NyaWJlSW5wdXREZWZpbml0aW9uKG5ldyBJbnB1dERlZmluaXRpb24oJGFwcGxpY2F0aW9uLT5nZXREZWZpbml0aW9uKCktPmdldE9wdGlvbnMoKSksICRvcHRpb25zKTsKCiR0aGlzLT53cml0ZVRleHQoIlxuIik7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CgokY29tbWFuZHMgPSAkZGVzY3JpcHRpb24tPmdldENvbW1hbmRzKCk7CiRuYW1lc3BhY2VzID0gJGRlc2NyaXB0aW9uLT5nZXROYW1lc3BhY2VzKCk7CmlmICgkZGVzY3JpYmVkTmFtZXNwYWNlICYmICRuYW1lc3BhY2VzKSB7CgokZGVzY3JpYmVkTmFtZXNwYWNlSW5mbyA9IHJlc2V0KCRuYW1lc3BhY2VzKTsKZm9yZWFjaCAoJGRlc2NyaWJlZE5hbWVzcGFjZUluZm9bJ2NvbW1hbmRzJ10gYXMgJG5hbWUpIHsKJGNvbW1hbmRzWyRuYW1lXSA9ICRkZXNjcmlwdGlvbi0+Z2V0Q29tbWFuZCgkbmFtZSk7Cn0KfQoKCiR3aWR0aCA9ICR0aGlzLT5nZXRDb2x1bW5XaWR0aChhcnJheV9tZXJnZSguLi5hcnJheV92YWx1ZXMoYXJyYXlfbWFwKGZ1bmN0aW9uICgkbmFtZXNwYWNlKSB1c2UgKCRjb21tYW5kcykgewpyZXR1cm4gYXJyYXlfaW50ZXJzZWN0KCRuYW1lc3BhY2VbJ2NvbW1hbmRzJ10sIGFycmF5X2tleXMoJGNvbW1hbmRzKSk7Cn0sIGFycmF5X3ZhbHVlcygkbmFtZXNwYWNlcykpKSkpOwoKaWYgKCRkZXNjcmliZWROYW1lc3BhY2UpIHsKJHRoaXMtPndyaXRlVGV4dChzcHJpbnRmKCc8Y29tbWVudD5BdmFpbGFibGUgY29tbWFuZHMgZm9yIHRoZSAiJXMiIG5hbWVzcGFjZTo8L2NvbW1lbnQ+JywgJGRlc2NyaWJlZE5hbWVzcGFjZSksICRvcHRpb25zKTsKfSBlbHNlIHsKJHRoaXMtPndyaXRlVGV4dCgnPGNvbW1lbnQ+QXZhaWxhYmxlIGNvbW1hbmRzOjwvY29tbWVudD4nLCAkb3B0aW9ucyk7Cn0KCmZvcmVhY2ggKCRuYW1lc3BhY2VzIGFzICRuYW1lc3BhY2UpIHsKJG5hbWVzcGFjZVsnY29tbWFuZHMnXSA9IGFycmF5X2ZpbHRlcigkbmFtZXNwYWNlWydjb21tYW5kcyddLCBmdW5jdGlvbiAoJG5hbWUpIHVzZSAoJGNvbW1hbmRzKSB7CnJldHVybiBpc3NldCgkY29tbWFuZHNbJG5hbWVdKTsKfSk7CgppZiAoISRuYW1lc3BhY2VbJ2NvbW1hbmRzJ10pIHsKY29udGludWU7Cn0KCmlmICghJGRlc2NyaWJlZE5hbWVzcGFjZSAmJiBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uOjpHTE9CQUxfTkFNRVNQQUNFICE9PSAkbmFtZXNwYWNlWydpZCddKSB7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CiR0aGlzLT53cml0ZVRleHQoJyA8Y29tbWVudD4nLiRuYW1lc3BhY2VbJ2lkJ10uJzwvY29tbWVudD4nLCAkb3B0aW9ucyk7Cn0KCmZvcmVhY2ggKCRuYW1lc3BhY2VbJ2NvbW1hbmRzJ10gYXMgJG5hbWUpIHsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHNwYWNpbmdXaWR0aCA9ICR3aWR0aCAtIEhlbHBlcjo6d2lkdGgoJG5hbWUpOwokY29tbWFuZCA9ICRjb21tYW5kc1skbmFtZV07CiRjb21tYW5kQWxpYXNlcyA9ICRuYW1lID09PSAkY29tbWFuZC0+Z2V0TmFtZSgpID8gJHRoaXMtPmdldENvbW1hbmRBbGlhc2VzVGV4dCgkY29tbWFuZCkgOiAnJzsKJHRoaXMtPndyaXRlVGV4dChzcHJpbnRmKCcgIDxpbmZvPiVzPC9pbmZvPiVzJXMnLCAkbmFtZSwgc3RyX3JlcGVhdCgnICcsICRzcGFjaW5nV2lkdGgpLCAkY29tbWFuZEFsaWFzZXMuJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkpLCAkb3B0aW9ucyk7Cn0KfQoKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHdyaXRlVGV4dChzdHJpbmcgJGNvbnRlbnQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlKAppc3NldCgkb3B0aW9uc1sncmF3X3RleHQnXSkgJiYgJG9wdGlvbnNbJ3Jhd190ZXh0J10gPyBzdHJpcF90YWdzKCRjb250ZW50KSA6ICRjb250ZW50LAppc3NldCgkb3B0aW9uc1sncmF3X291dHB1dCddKSA/ICEkb3B0aW9uc1sncmF3X291dHB1dCddIDogdHJ1ZQopOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldENvbW1hbmRBbGlhc2VzVGV4dChDb21tYW5kICRjb21tYW5kKTogc3RyaW5nCnsKJHRleHQgPSAnJzsKJGFsaWFzZXMgPSAkY29tbWFuZC0+Z2V0QWxpYXNlcygpOwoKaWYgKCRhbGlhc2VzKSB7CiR0ZXh0ID0gJ1snLmltcGxvZGUoJ3wnLCAkYWxpYXNlcykuJ10gJzsKfQoKcmV0dXJuICR0ZXh0Owp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZm9ybWF0RGVmYXVsdFZhbHVlKCRkZWZhdWx0KTogc3RyaW5nCnsKaWYgKFxJTkYgPT09ICRkZWZhdWx0KSB7CnJldHVybiAnSU5GJzsKfQoKaWYgKFxpc19zdHJpbmcoJGRlZmF1bHQpKSB7CiRkZWZhdWx0ID0gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGRlZmF1bHQpOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRkZWZhdWx0KSkgewpmb3JlYWNoICgkZGVmYXVsdCBhcyAka2V5ID0+ICR2YWx1ZSkgewppZiAoXGlzX3N0cmluZygkdmFsdWUpKSB7CiRkZWZhdWx0WyRrZXldID0gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJHZhbHVlKTsKfQp9Cn0KCnJldHVybiBzdHJfcmVwbGFjZSgnXFxcXCcsICdcXCcsIGpzb25fZW5jb2RlKCRkZWZhdWx0LCBcSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyB8IFxKU09OX1VORVNDQVBFRF9VTklDT0RFKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29sdW1uV2lkdGgoYXJyYXkgJGNvbW1hbmRzKTogaW50CnsKJHdpZHRocyA9IFtdOwoKZm9yZWFjaCAoJGNvbW1hbmRzIGFzICRjb21tYW5kKSB7CmlmICgkY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmQpIHsKJHdpZHRoc1tdID0gSGVscGVyOjp3aWR0aCgkY29tbWFuZC0+Z2V0TmFtZSgpKTsKZm9yZWFjaCAoJGNvbW1hbmQtPmdldEFsaWFzZXMoKSBhcyAkYWxpYXMpIHsKJHdpZHRoc1tdID0gSGVscGVyOjp3aWR0aCgkYWxpYXMpOwp9Cn0gZWxzZSB7CiR3aWR0aHNbXSA9IEhlbHBlcjo6d2lkdGgoJGNvbW1hbmQpOwp9Cn0KCnJldHVybiAkd2lkdGhzID8gbWF4KCR3aWR0aHMpICsgMiA6IDA7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2FsY3VsYXRlVG90YWxXaWR0aEZvck9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpOiBpbnQKewokdG90YWxXaWR0aCA9IDA7CmZvcmVhY2ggKCRvcHRpb25zIGFzICRvcHRpb24pIHsKCiRuYW1lTGVuZ3RoID0gMSArIG1heChIZWxwZXI6OndpZHRoKCRvcHRpb24tPmdldFNob3J0Y3V0KCkpLCAxKSArIDQgKyBIZWxwZXI6OndpZHRoKCRvcHRpb24tPmdldE5hbWUoKSk7CmlmICgkb3B0aW9uLT5pc05lZ2F0YWJsZSgpKSB7CiRuYW1lTGVuZ3RoICs9IDYgKyBIZWxwZXI6OndpZHRoKCRvcHRpb24tPmdldE5hbWUoKSk7IAp9IGVsc2VpZiAoJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSkgewokdmFsdWVMZW5ndGggPSAxICsgSGVscGVyOjp3aWR0aCgkb3B0aW9uLT5nZXROYW1lKCkpOyAKJHZhbHVlTGVuZ3RoICs9ICRvcHRpb24tPmlzVmFsdWVPcHRpb25hbCgpID8gMiA6IDA7IAoKJG5hbWVMZW5ndGggKz0gJHZhbHVlTGVuZ3RoOwp9CiR0b3RhbFdpZHRoID0gbWF4KCR0b3RhbFdpZHRoLCAkbmFtZUxlbmd0aCk7Cn0KCnJldHVybiAkdG90YWxXaWR0aDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKCgoKCgoKCgpjbGFzcyBYbWxEZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvcgp7CnB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dERlZmluaXRpb25Eb2N1bWVudChJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24pOiBcRE9NRG9jdW1lbnQKewokZG9tID0gbmV3IFxET01Eb2N1bWVudCgnMS4wJywgJ1VURi04Jyk7CiRkb20tPmFwcGVuZENoaWxkKCRkZWZpbml0aW9uWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnZGVmaW5pdGlvbicpKTsKCiRkZWZpbml0aW9uWE1MLT5hcHBlbmRDaGlsZCgkYXJndW1lbnRzWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnYXJndW1lbnRzJykpOwpmb3JlYWNoICgkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkgYXMgJGFyZ3VtZW50KSB7CiR0aGlzLT5hcHBlbmREb2N1bWVudCgkYXJndW1lbnRzWE1MLCAkdGhpcy0+Z2V0SW5wdXRBcmd1bWVudERvY3VtZW50KCRhcmd1bWVudCkpOwp9CgokZGVmaW5pdGlvblhNTC0+YXBwZW5kQ2hpbGQoJG9wdGlvbnNYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdvcHRpb25zJykpOwpmb3JlYWNoICgkZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpIGFzICRvcHRpb24pIHsKJHRoaXMtPmFwcGVuZERvY3VtZW50KCRvcHRpb25zWE1MLCAkdGhpcy0+Z2V0SW5wdXRPcHRpb25Eb2N1bWVudCgkb3B0aW9uKSk7Cn0KCnJldHVybiAkZG9tOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZERvY3VtZW50KENvbW1hbmQgJGNvbW1hbmQsIGJvb2wgJHNob3J0ID0gZmFsc2UpOiBcRE9NRG9jdW1lbnQKewokZG9tID0gbmV3IFxET01Eb2N1bWVudCgnMS4wJywgJ1VURi04Jyk7CiRkb20tPmFwcGVuZENoaWxkKCRjb21tYW5kWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnY29tbWFuZCcpKTsKCiRjb21tYW5kWE1MLT5zZXRBdHRyaWJ1dGUoJ2lkJywgJGNvbW1hbmQtPmdldE5hbWUoKSk7CiRjb21tYW5kWE1MLT5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAkY29tbWFuZC0+Z2V0TmFtZSgpKTsKJGNvbW1hbmRYTUwtPnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJGNvbW1hbmQtPmlzSGlkZGVuKCkgPyAxIDogMCk7CgokY29tbWFuZFhNTC0+YXBwZW5kQ2hpbGQoJHVzYWdlc1hNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ3VzYWdlcycpKTsKCiRjb21tYW5kWE1MLT5hcHBlbmRDaGlsZCgkZGVzY3JpcHRpb25YTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdkZXNjcmlwdGlvbicpKTsKJGRlc2NyaXB0aW9uWE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZShzdHJfcmVwbGFjZSgiXG4iLCAiXG4gIiwgJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkpKSk7CgppZiAoJHNob3J0KSB7CmZvcmVhY2ggKCRjb21tYW5kLT5nZXRBbGlhc2VzKCkgYXMgJHVzYWdlKSB7CiR1c2FnZXNYTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZUVsZW1lbnQoJ3VzYWdlJywgJHVzYWdlKSk7Cn0KfSBlbHNlIHsKJGNvbW1hbmQtPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKGZhbHNlKTsKCmZvcmVhY2ggKGFycmF5X21lcmdlKFskY29tbWFuZC0+Z2V0U3lub3BzaXMoKV0sICRjb21tYW5kLT5nZXRBbGlhc2VzKCksICRjb21tYW5kLT5nZXRVc2FnZXMoKSkgYXMgJHVzYWdlKSB7CiR1c2FnZXNYTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZUVsZW1lbnQoJ3VzYWdlJywgJHVzYWdlKSk7Cn0KCiRjb21tYW5kWE1MLT5hcHBlbmRDaGlsZCgkaGVscFhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2hlbHAnKSk7CiRoZWxwWE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZShzdHJfcmVwbGFjZSgiXG4iLCAiXG4gIiwgJGNvbW1hbmQtPmdldFByb2Nlc3NlZEhlbHAoKSkpKTsKCiRkZWZpbml0aW9uWE1MID0gJHRoaXMtPmdldElucHV0RGVmaW5pdGlvbkRvY3VtZW50KCRjb21tYW5kLT5nZXREZWZpbml0aW9uKCkpOwokdGhpcy0+YXBwZW5kRG9jdW1lbnQoJGNvbW1hbmRYTUwsICRkZWZpbml0aW9uWE1MLT5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZGVmaW5pdGlvbicpLT5pdGVtKDApKTsKfQoKcmV0dXJuICRkb207Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBcHBsaWNhdGlvbkRvY3VtZW50KEFwcGxpY2F0aW9uICRhcHBsaWNhdGlvbiwgP3N0cmluZyAkbmFtZXNwYWNlID0gbnVsbCwgYm9vbCAkc2hvcnQgPSBmYWxzZSk6IFxET01Eb2N1bWVudAp7CiRkb20gPSBuZXcgXERPTURvY3VtZW50KCcxLjAnLCAnVVRGLTgnKTsKJGRvbS0+YXBwZW5kQ2hpbGQoJHJvb3RYbWwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdzeW1mb255JykpOwoKaWYgKCdVTktOT1dOJyAhPT0gJGFwcGxpY2F0aW9uLT5nZXROYW1lKCkpIHsKJHJvb3RYbWwtPnNldEF0dHJpYnV0ZSgnbmFtZScsICRhcHBsaWNhdGlvbi0+Z2V0TmFtZSgpKTsKaWYgKCdVTktOT1dOJyAhPT0gJGFwcGxpY2F0aW9uLT5nZXRWZXJzaW9uKCkpIHsKJHJvb3RYbWwtPnNldEF0dHJpYnV0ZSgndmVyc2lvbicsICRhcHBsaWNhdGlvbi0+Z2V0VmVyc2lvbigpKTsKfQp9Cgokcm9vdFhtbC0+YXBwZW5kQ2hpbGQoJGNvbW1hbmRzWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnY29tbWFuZHMnKSk7CgokZGVzY3JpcHRpb24gPSBuZXcgQXBwbGljYXRpb25EZXNjcmlwdGlvbigkYXBwbGljYXRpb24sICRuYW1lc3BhY2UsIHRydWUpOwoKaWYgKCRuYW1lc3BhY2UpIHsKJGNvbW1hbmRzWE1MLT5zZXRBdHRyaWJ1dGUoJ25hbWVzcGFjZScsICRuYW1lc3BhY2UpOwp9Cgpmb3JlYWNoICgkZGVzY3JpcHRpb24tPmdldENvbW1hbmRzKCkgYXMgJGNvbW1hbmQpIHsKJHRoaXMtPmFwcGVuZERvY3VtZW50KCRjb21tYW5kc1hNTCwgJHRoaXMtPmdldENvbW1hbmREb2N1bWVudCgkY29tbWFuZCwgJHNob3J0KSk7Cn0KCmlmICghJG5hbWVzcGFjZSkgewokcm9vdFhtbC0+YXBwZW5kQ2hpbGQoJG5hbWVzcGFjZXNYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCduYW1lc3BhY2VzJykpOwoKZm9yZWFjaCAoJGRlc2NyaXB0aW9uLT5nZXROYW1lc3BhY2VzKCkgYXMgJG5hbWVzcGFjZURlc2NyaXB0aW9uKSB7CiRuYW1lc3BhY2VzWE1MLT5hcHBlbmRDaGlsZCgkbmFtZXNwYWNlQXJyYXlYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCduYW1lc3BhY2UnKSk7CiRuYW1lc3BhY2VBcnJheVhNTC0+c2V0QXR0cmlidXRlKCdpZCcsICRuYW1lc3BhY2VEZXNjcmlwdGlvblsnaWQnXSk7Cgpmb3JlYWNoICgkbmFtZXNwYWNlRGVzY3JpcHRpb25bJ2NvbW1hbmRzJ10gYXMgJG5hbWUpIHsKJG5hbWVzcGFjZUFycmF5WE1MLT5hcHBlbmRDaGlsZCgkY29tbWFuZFhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2NvbW1hbmQnKSk7CiRjb21tYW5kWE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZSgkbmFtZSkpOwp9Cn0KfQoKcmV0dXJuICRkb207Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0QXJndW1lbnQoSW5wdXRBcmd1bWVudCAkYXJndW1lbnQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlRG9jdW1lbnQoJHRoaXMtPmdldElucHV0QXJndW1lbnREb2N1bWVudCgkYXJndW1lbnQpKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRPcHRpb24oSW5wdXRPcHRpb24gJG9wdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEb2N1bWVudCgkdGhpcy0+Z2V0SW5wdXRPcHRpb25Eb2N1bWVudCgkb3B0aW9uKSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0RGVmaW5pdGlvbihJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlRG9jdW1lbnQoJHRoaXMtPmdldElucHV0RGVmaW5pdGlvbkRvY3VtZW50KCRkZWZpbml0aW9uKSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUNvbW1hbmQoQ29tbWFuZCAkY29tbWFuZCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEb2N1bWVudCgkdGhpcy0+Z2V0Q29tbWFuZERvY3VtZW50KCRjb21tYW5kLCAkb3B0aW9uc1snc2hvcnQnXSA/PyBmYWxzZSkpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlRG9jdW1lbnQoJHRoaXMtPmdldEFwcGxpY2F0aW9uRG9jdW1lbnQoJGFwcGxpY2F0aW9uLCAkb3B0aW9uc1snbmFtZXNwYWNlJ10gPz8gbnVsbCwgJG9wdGlvbnNbJ3Nob3J0J10gPz8gZmFsc2UpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhcHBlbmREb2N1bWVudChcRE9NTm9kZSAkcGFyZW50Tm9kZSwgXERPTU5vZGUgJGltcG9ydGVkUGFyZW50KQp7CmZvcmVhY2ggKCRpbXBvcnRlZFBhcmVudC0+Y2hpbGROb2RlcyBhcyAkY2hpbGROb2RlKSB7CiRwYXJlbnROb2RlLT5hcHBlbmRDaGlsZCgkcGFyZW50Tm9kZS0+b3duZXJEb2N1bWVudC0+aW1wb3J0Tm9kZSgkY2hpbGROb2RlLCB0cnVlKSk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZURvY3VtZW50KFxET01Eb2N1bWVudCAkZG9tKQp7CiRkb20tPmZvcm1hdE91dHB1dCA9IHRydWU7CiR0aGlzLT53cml0ZSgkZG9tLT5zYXZlWE1MKCkpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldElucHV0QXJndW1lbnREb2N1bWVudChJbnB1dEFyZ3VtZW50ICRhcmd1bWVudCk6IFxET01Eb2N1bWVudAp7CiRkb20gPSBuZXcgXERPTURvY3VtZW50KCcxLjAnLCAnVVRGLTgnKTsKCiRkb20tPmFwcGVuZENoaWxkKCRvYmplY3RYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdhcmd1bWVudCcpKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCduYW1lJywgJGFyZ3VtZW50LT5nZXROYW1lKCkpOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ2lzX3JlcXVpcmVkJywgJGFyZ3VtZW50LT5pc1JlcXVpcmVkKCkgPyAxIDogMCk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnaXNfYXJyYXknLCAkYXJndW1lbnQtPmlzQXJyYXkoKSA/IDEgOiAwKTsKJG9iamVjdFhNTC0+YXBwZW5kQ2hpbGQoJGRlc2NyaXB0aW9uWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnZGVzY3JpcHRpb24nKSk7CiRkZXNjcmlwdGlvblhNTC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlVGV4dE5vZGUoJGFyZ3VtZW50LT5nZXREZXNjcmlwdGlvbigpKSk7Cgokb2JqZWN0WE1MLT5hcHBlbmRDaGlsZCgkZGVmYXVsdHNYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdkZWZhdWx0cycpKTsKJGRlZmF1bHRzID0gXGlzX2FycmF5KCRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpKSA/ICRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpIDogKFxpc19ib29sKCRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpKSA/IFt2YXJfZXhwb3J0KCRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpLCB0cnVlKV0gOiAoJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkgPyBbJGFyZ3VtZW50LT5nZXREZWZhdWx0KCldIDogW10pKTsKZm9yZWFjaCAoJGRlZmF1bHRzIGFzICRkZWZhdWx0KSB7CiRkZWZhdWx0c1hNTC0+YXBwZW5kQ2hpbGQoJGRlZmF1bHRYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdkZWZhdWx0JykpOwokZGVmYXVsdFhNTC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlVGV4dE5vZGUoJGRlZmF1bHQpKTsKfQoKcmV0dXJuICRkb207Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0SW5wdXRPcHRpb25Eb2N1bWVudChJbnB1dE9wdGlvbiAkb3B0aW9uKTogXERPTURvY3VtZW50CnsKJGRvbSA9IG5ldyBcRE9NRG9jdW1lbnQoJzEuMCcsICdVVEYtOCcpOwoKJGRvbS0+YXBwZW5kQ2hpbGQoJG9iamVjdFhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCduYW1lJywgJy0tJy4kb3B0aW9uLT5nZXROYW1lKCkpOwokcG9zID0gc3RycG9zKCRvcHRpb24tPmdldFNob3J0Y3V0KCkgPz8gJycsICd8Jyk7CmlmIChmYWxzZSAhPT0gJHBvcykgewokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ3Nob3J0Y3V0JywgJy0nLnN1YnN0cigkb3B0aW9uLT5nZXRTaG9ydGN1dCgpLCAwLCAkcG9zKSk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnc2hvcnRjdXRzJywgJy0nLnN0cl9yZXBsYWNlKCd8JywgJ3wtJywgJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSkpOwp9IGVsc2Ugewokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ3Nob3J0Y3V0JywgJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSA/ICctJy4kb3B0aW9uLT5nZXRTaG9ydGN1dCgpIDogJycpOwp9CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnYWNjZXB0X3ZhbHVlJywgJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSA/IDEgOiAwKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdpc192YWx1ZV9yZXF1aXJlZCcsICRvcHRpb24tPmlzVmFsdWVSZXF1aXJlZCgpID8gMSA6IDApOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ2lzX211bHRpcGxlJywgJG9wdGlvbi0+aXNBcnJheSgpID8gMSA6IDApOwokb2JqZWN0WE1MLT5hcHBlbmRDaGlsZCgkZGVzY3JpcHRpb25YTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdkZXNjcmlwdGlvbicpKTsKJGRlc2NyaXB0aW9uWE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZSgkb3B0aW9uLT5nZXREZXNjcmlwdGlvbigpKSk7CgppZiAoJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSkgewokZGVmYXVsdHMgPSBcaXNfYXJyYXkoJG9wdGlvbi0+Z2V0RGVmYXVsdCgpKSA/ICRvcHRpb24tPmdldERlZmF1bHQoKSA6IChcaXNfYm9vbCgkb3B0aW9uLT5nZXREZWZhdWx0KCkpID8gW3Zhcl9leHBvcnQoJG9wdGlvbi0+Z2V0RGVmYXVsdCgpLCB0cnVlKV0gOiAoJG9wdGlvbi0+Z2V0RGVmYXVsdCgpID8gWyRvcHRpb24tPmdldERlZmF1bHQoKV0gOiBbXSkpOwokb2JqZWN0WE1MLT5hcHBlbmRDaGlsZCgkZGVmYXVsdHNYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdkZWZhdWx0cycpKTsKCmlmICghZW1wdHkoJGRlZmF1bHRzKSkgewpmb3JlYWNoICgkZGVmYXVsdHMgYXMgJGRlZmF1bHQpIHsKJGRlZmF1bHRzWE1MLT5hcHBlbmRDaGlsZCgkZGVmYXVsdFhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2RlZmF1bHQnKSk7CiRkZWZhdWx0WE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZSgkZGVmYXVsdCkpOwp9Cn0KfQoKaWYgKCRvcHRpb24tPmlzTmVnYXRhYmxlKCkpIHsKJGRvbS0+YXBwZW5kQ2hpbGQoJG9iamVjdFhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCduYW1lJywgJy0tbm8tJy4kb3B0aW9uLT5nZXROYW1lKCkpOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ3Nob3J0Y3V0JywgJycpOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ2FjY2VwdF92YWx1ZScsIDApOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ2lzX3ZhbHVlX3JlcXVpcmVkJywgMCk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnaXNfbXVsdGlwbGUnLCAwKTsKJG9iamVjdFhNTC0+YXBwZW5kQ2hpbGQoJGRlc2NyaXB0aW9uWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnZGVzY3JpcHRpb24nKSk7CiRkZXNjcmlwdGlvblhNTC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlVGV4dE5vZGUoJ05lZ2F0ZSB0aGUgIi0tJy4kb3B0aW9uLT5nZXROYW1lKCkuJyIgb3B0aW9uJykpOwp9CgpyZXR1cm4gJGRvbTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudDsKCgoKCgoKCgoKZmluYWwgY2xhc3MgQ29uc29sZUNvbW1hbmRFdmVudCBleHRlbmRzIENvbnNvbGVFdmVudAp7CgoKCnB1YmxpYyBjb25zdCBSRVRVUk5fQ09ERV9ESVNBQkxFRCA9IDExMzsKCgoKCnByaXZhdGUgJGNvbW1hbmRTaG91bGRSdW4gPSB0cnVlOwoKCgoKcHVibGljIGZ1bmN0aW9uIGRpc2FibGVDb21tYW5kKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmNvbW1hbmRTaG91bGRSdW4gPSBmYWxzZTsKfQoKcHVibGljIGZ1bmN0aW9uIGVuYWJsZUNvbW1hbmQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+Y29tbWFuZFNob3VsZFJ1biA9IHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21tYW5kU2hvdWxkUnVuKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmNvbW1hbmRTaG91bGRSdW47Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpmaW5hbCBjbGFzcyBDb25zb2xlRXJyb3JFdmVudCBleHRlbmRzIENvbnNvbGVFdmVudAp7CnByaXZhdGUgJGVycm9yOwpwcml2YXRlICRleGl0Q29kZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBcVGhyb3dhYmxlICRlcnJvciwgP0NvbW1hbmQgJGNvbW1hbmQgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGNvbW1hbmQsICRpbnB1dCwgJG91dHB1dCk7CgokdGhpcy0+ZXJyb3IgPSAkZXJyb3I7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcigpOiBcVGhyb3dhYmxlCnsKcmV0dXJuICR0aGlzLT5lcnJvcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEVycm9yKFxUaHJvd2FibGUgJGVycm9yKTogdm9pZAp7CiR0aGlzLT5lcnJvciA9ICRlcnJvcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEV4aXRDb2RlKGludCAkZXhpdENvZGUpOiB2b2lkCnsKJHRoaXMtPmV4aXRDb2RlID0gJGV4aXRDb2RlOwoKJHIgPSBuZXcgXFJlZmxlY3Rpb25Qcm9wZXJ0eSgkdGhpcy0+ZXJyb3IsICdjb2RlJyk7CiRyLT5zZXRBY2Nlc3NpYmxlKHRydWUpOwokci0+c2V0VmFsdWUoJHRoaXMtPmVycm9yLCAkdGhpcy0+ZXhpdENvZGUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXhpdENvZGUoKTogaW50CnsKcmV0dXJuICR0aGlzLT5leGl0Q29kZSA/PyAoXGlzX2ludCgkdGhpcy0+ZXJyb3ItPmdldENvZGUoKSkgJiYgMCAhPT0gJHRoaXMtPmVycm9yLT5nZXRDb2RlKCkgPyAkdGhpcy0+ZXJyb3ItPmdldENvZGUoKSA6IDEpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29udHJhY3RzXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKCgoKCgoKY2xhc3MgQ29uc29sZUV2ZW50IGV4dGVuZHMgRXZlbnQKewpwcm90ZWN0ZWQgJGNvbW1hbmQ7Cgpwcml2YXRlICRpbnB1dDsKcHJpdmF0ZSAkb3V0cHV0OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9Db21tYW5kICRjb21tYW5kLCBJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiR0aGlzLT5jb21tYW5kID0gJGNvbW1hbmQ7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1hbmQoKQp7CnJldHVybiAkdGhpcy0+Y29tbWFuZDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXQoKQp7CnJldHVybiAkdGhpcy0+aW5wdXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE91dHB1dCgpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKZmluYWwgY2xhc3MgQ29uc29sZVNpZ25hbEV2ZW50IGV4dGVuZHMgQ29uc29sZUV2ZW50CnsKcHJpdmF0ZSAkaGFuZGxpbmdTaWduYWw7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ29tbWFuZCAkY29tbWFuZCwgSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgaW50ICRoYW5kbGluZ1NpZ25hbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRjb21tYW5kLCAkaW5wdXQsICRvdXRwdXQpOwokdGhpcy0+aGFuZGxpbmdTaWduYWwgPSAkaGFuZGxpbmdTaWduYWw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRIYW5kbGluZ1NpZ25hbCgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmhhbmRsaW5nU2lnbmFsOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKZmluYWwgY2xhc3MgQ29uc29sZVRlcm1pbmF0ZUV2ZW50IGV4dGVuZHMgQ29uc29sZUV2ZW50CnsKcHJpdmF0ZSAkZXhpdENvZGU7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ29tbWFuZCAkY29tbWFuZCwgSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgaW50ICRleGl0Q29kZSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRjb21tYW5kLCAkaW5wdXQsICRvdXRwdXQpOwoKJHRoaXMtPnNldEV4aXRDb2RlKCRleGl0Q29kZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRFeGl0Q29kZShpbnQgJGV4aXRDb2RlKTogdm9pZAp7CiR0aGlzLT5leGl0Q29kZSA9ICRleGl0Q29kZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEV4aXRDb2RlKCk6IGludAp7CnJldHVybiAkdGhpcy0+ZXhpdENvZGU7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRMaXN0ZW5lcjsKCnVzZSBQc3JcTG9nXExvZ2dlckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29uc29sZUV2ZW50czsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZUVycm9yRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZVRlcm1pbmF0ZUV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcRXZlbnREaXNwYXRjaGVyXEV2ZW50U3Vic2NyaWJlckludGVyZmFjZTsKCgoKCgpjbGFzcyBFcnJvckxpc3RlbmVyIGltcGxlbWVudHMgRXZlbnRTdWJzY3JpYmVySW50ZXJmYWNlCnsKcHJpdmF0ZSAkbG9nZ2VyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKJHRoaXMtPmxvZ2dlciA9ICRsb2dnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBvbkNvbnNvbGVFcnJvcihDb25zb2xlRXJyb3JFdmVudCAkZXZlbnQpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5sb2dnZXIpIHsKcmV0dXJuOwp9CgokZXJyb3IgPSAkZXZlbnQtPmdldEVycm9yKCk7CgppZiAoISRpbnB1dFN0cmluZyA9ICR0aGlzLT5nZXRJbnB1dFN0cmluZygkZXZlbnQpKSB7CiR0aGlzLT5sb2dnZXItPmNyaXRpY2FsKCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB1c2luZyB0aGUgY29uc29sZS4gTWVzc2FnZTogInttZXNzYWdlfSInLCBbJ2V4Y2VwdGlvbicgPT4gJGVycm9yLCAnbWVzc2FnZScgPT4gJGVycm9yLT5nZXRNZXNzYWdlKCldKTsKCnJldHVybjsKfQoKJHRoaXMtPmxvZ2dlci0+Y3JpdGljYWwoJ0Vycm9yIHRocm93biB3aGlsZSBydW5uaW5nIGNvbW1hbmQgIntjb21tYW5kfSIuIE1lc3NhZ2U6ICJ7bWVzc2FnZX0iJywgWydleGNlcHRpb24nID0+ICRlcnJvciwgJ2NvbW1hbmQnID0+ICRpbnB1dFN0cmluZywgJ21lc3NhZ2UnID0+ICRlcnJvci0+Z2V0TWVzc2FnZSgpXSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBvbkNvbnNvbGVUZXJtaW5hdGUoQ29uc29sZVRlcm1pbmF0ZUV2ZW50ICRldmVudCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmxvZ2dlcikgewpyZXR1cm47Cn0KCiRleGl0Q29kZSA9ICRldmVudC0+Z2V0RXhpdENvZGUoKTsKCmlmICgwID09PSAkZXhpdENvZGUpIHsKcmV0dXJuOwp9CgppZiAoISRpbnB1dFN0cmluZyA9ICR0aGlzLT5nZXRJbnB1dFN0cmluZygkZXZlbnQpKSB7CiR0aGlzLT5sb2dnZXItPmRlYnVnKCdUaGUgY29uc29sZSBleGl0ZWQgd2l0aCBjb2RlICJ7Y29kZX0iJywgWydjb2RlJyA9PiAkZXhpdENvZGVdKTsKCnJldHVybjsKfQoKJHRoaXMtPmxvZ2dlci0+ZGVidWcoJ0NvbW1hbmQgIntjb21tYW5kfSIgZXhpdGVkIHdpdGggY29kZSAie2NvZGV9IicsIFsnY29tbWFuZCcgPT4gJGlucHV0U3RyaW5nLCAnY29kZScgPT4gJGV4aXRDb2RlXSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3Vic2NyaWJlZEV2ZW50cygpCnsKcmV0dXJuIFsKQ29uc29sZUV2ZW50czo6RVJST1IgPT4gWydvbkNvbnNvbGVFcnJvcicsIC0xMjhdLApDb25zb2xlRXZlbnRzOjpURVJNSU5BVEUgPT4gWydvbkNvbnNvbGVUZXJtaW5hdGUnLCAtMTI4XSwKXTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5wdXRTdHJpbmcoQ29uc29sZUV2ZW50ICRldmVudCk6ID9zdHJpbmcKewokY29tbWFuZE5hbWUgPSAkZXZlbnQtPmdldENvbW1hbmQoKSA/ICRldmVudC0+Z2V0Q29tbWFuZCgpLT5nZXROYW1lKCkgOiBudWxsOwokaW5wdXQgPSAkZXZlbnQtPmdldElucHV0KCk7CgppZiAobWV0aG9kX2V4aXN0cygkaW5wdXQsICdfX3RvU3RyaW5nJykpIHsKaWYgKCRjb21tYW5kTmFtZSkgewpyZXR1cm4gc3RyX3JlcGxhY2UoWyInJGNvbW1hbmROYW1lJyIsICJcIiRjb21tYW5kTmFtZVwiIl0sICRjb21tYW5kTmFtZSwgKHN0cmluZykgJGlucHV0KTsKfQoKcmV0dXJuIChzdHJpbmcpICRpbnB1dDsKfQoKcmV0dXJuICRjb21tYW5kTmFtZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb247CgoKCgoKCmNsYXNzIENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewpwcml2YXRlICRhbHRlcm5hdGl2ZXM7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRtZXNzYWdlLCBhcnJheSAkYWx0ZXJuYXRpdmVzID0gW10sIGludCAkY29kZSA9IDAsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUsICRwcmV2aW91cyk7CgokdGhpcy0+YWx0ZXJuYXRpdmVzID0gJGFsdGVybmF0aXZlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsdGVybmF0aXZlcygpCnsKcmV0dXJuICR0aGlzLT5hbHRlcm5hdGl2ZXM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uOwoKCgoKCgppbnRlcmZhY2UgRXhjZXB0aW9uSW50ZXJmYWNlIGV4dGVuZHMgXFRocm93YWJsZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBleHRlbmRzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb247CgoKCgoKCmNsYXNzIEludmFsaWRPcHRpb25FeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uOwoKCgoKY2xhc3MgTG9naWNFeGNlcHRpb24gZXh0ZW5kcyBcTG9naWNFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb247CgoKCgoKCmNsYXNzIE1pc3NpbmdJbnB1dEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb247CgoKCgoKCmNsYXNzIE5hbWVzcGFjZU5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uOwoKCgoKY2xhc3MgUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyOwoKCgoKZmluYWwgY2xhc3MgTnVsbE91dHB1dEZvcm1hdHRlciBpbXBsZW1lbnRzIE91dHB1dEZvcm1hdHRlckludGVyZmFjZQp7CnByaXZhdGUgJHN0eWxlOwoKCgoKcHVibGljIGZ1bmN0aW9uIGZvcm1hdCg/c3RyaW5nICRtZXNzYWdlKTogP3N0cmluZwp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3R5bGUoc3RyaW5nICRuYW1lKTogT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UKewoKcmV0dXJuICR0aGlzLT5zdHlsZSA/PyAkdGhpcy0+c3R5bGUgPSBuZXcgTnVsbE91dHB1dEZvcm1hdHRlclN0eWxlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNTdHlsZShzdHJpbmcgJG5hbWUpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKTogYm9vbAp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlY29yYXRlZChib29sICRkZWNvcmF0ZWQpOiB2b2lkCnsKCn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdHlsZShzdHJpbmcgJG5hbWUsIE91dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlICRzdHlsZSk6IHZvaWQKewoKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXI7CgoKCgpmaW5hbCBjbGFzcyBOdWxsT3V0cHV0Rm9ybWF0dGVyU3R5bGUgaW1wbGVtZW50cyBPdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBhcHBseShzdHJpbmcgJHRleHQpOiBzdHJpbmcKewpyZXR1cm4gJHRleHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRCYWNrZ3JvdW5kKD9zdHJpbmcgJGNvbG9yID0gbnVsbCk6IHZvaWQKewoKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZvcmVncm91bmQoP3N0cmluZyAkY29sb3IgPSBudWxsKTogdm9pZAp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9uKHN0cmluZyAkb3B0aW9uKTogdm9pZAp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9ucyhhcnJheSAkb3B0aW9ucyk6IHZvaWQKewoKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVuc2V0T3B0aW9uKHN0cmluZyAkb3B0aW9uKTogdm9pZAp7Cgp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Cgp1c2UgZnVuY3Rpb24gU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXGI7CgoKCgoKCgpjbGFzcyBPdXRwdXRGb3JtYXR0ZXIgaW1wbGVtZW50cyBXcmFwcGFibGVPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UKewpwcml2YXRlICRkZWNvcmF0ZWQ7CnByaXZhdGUgJHN0eWxlcyA9IFtdOwpwcml2YXRlICRzdHlsZVN0YWNrOwoKcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKQp7CiR0aGlzLT5zdHlsZVN0YWNrID0gY2xvbmUgJHRoaXMtPnN0eWxlU3RhY2s7CmZvcmVhY2ggKCR0aGlzLT5zdHlsZXMgYXMgJGtleSA9PiAkdmFsdWUpIHsKJHRoaXMtPnN0eWxlc1ska2V5XSA9IGNsb25lICR2YWx1ZTsKfQp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXNjYXBlKHN0cmluZyAkdGV4dCkKewokdGV4dCA9IHByZWdfcmVwbGFjZSgnLyhbXlxcXFxdfF4pKFs8Pl0pLycsICckMVxcXFwkMicsICR0ZXh0KTsKCnJldHVybiBzZWxmOjplc2NhcGVUcmFpbGluZ0JhY2tzbGFzaCgkdGV4dCk7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlc2NhcGVUcmFpbGluZ0JhY2tzbGFzaChzdHJpbmcgJHRleHQpOiBzdHJpbmcKewppZiAoc3RyX2VuZHNfd2l0aCgkdGV4dCwgJ1xcJykpIHsKJGxlbiA9IFxzdHJsZW4oJHRleHQpOwokdGV4dCA9IHJ0cmltKCR0ZXh0LCAnXFwnKTsKJHRleHQgPSBzdHJfcmVwbGFjZSgiXDAiLCAnJywgJHRleHQpOwokdGV4dCAuPSBzdHJfcmVwZWF0KCJcMCIsICRsZW4gLSBcc3RybGVuKCR0ZXh0KSk7Cn0KCnJldHVybiAkdGV4dDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYm9vbCAkZGVjb3JhdGVkID0gZmFsc2UsIGFycmF5ICRzdHlsZXMgPSBbXSkKewokdGhpcy0+ZGVjb3JhdGVkID0gJGRlY29yYXRlZDsKCiR0aGlzLT5zZXRTdHlsZSgnZXJyb3InLCBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ3doaXRlJywgJ3JlZCcpKTsKJHRoaXMtPnNldFN0eWxlKCdpbmZvJywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCdncmVlbicpKTsKJHRoaXMtPnNldFN0eWxlKCdjb21tZW50JywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCd5ZWxsb3cnKSk7CiR0aGlzLT5zZXRTdHlsZSgncXVlc3Rpb24nLCBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ2JsYWNrJywgJ2N5YW4nKSk7Cgpmb3JlYWNoICgkc3R5bGVzIGFzICRuYW1lID0+ICRzdHlsZSkgewokdGhpcy0+c2V0U3R5bGUoJG5hbWUsICRzdHlsZSk7Cn0KCiR0aGlzLT5zdHlsZVN0YWNrID0gbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlU3RhY2soKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlY29yYXRlZChib29sICRkZWNvcmF0ZWQpCnsKJHRoaXMtPmRlY29yYXRlZCA9ICRkZWNvcmF0ZWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpCnsKcmV0dXJuICR0aGlzLT5kZWNvcmF0ZWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdHlsZShzdHJpbmcgJG5hbWUsIE91dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlICRzdHlsZSkKewokdGhpcy0+c3R5bGVzW3N0cnRvbG93ZXIoJG5hbWUpXSA9ICRzdHlsZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1N0eWxlKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gaXNzZXQoJHRoaXMtPnN0eWxlc1tzdHJ0b2xvd2VyKCRuYW1lKV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3R5bGUoc3RyaW5nICRuYW1lKQp7CmlmICghJHRoaXMtPmhhc1N0eWxlKCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1VuZGVmaW5lZCBzdHlsZTogIiVzIi4nLCAkbmFtZSkpOwp9CgpyZXR1cm4gJHRoaXMtPnN0eWxlc1tzdHJ0b2xvd2VyKCRuYW1lKV07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXQoP3N0cmluZyAkbWVzc2FnZSkKewpyZXR1cm4gJHRoaXMtPmZvcm1hdEFuZFdyYXAoJG1lc3NhZ2UsIDApOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZm9ybWF0QW5kV3JhcCg/c3RyaW5nICRtZXNzYWdlLCBpbnQgJHdpZHRoKQp7CmlmIChudWxsID09PSAkbWVzc2FnZSkgewpyZXR1cm4gJyc7Cn0KCiRvZmZzZXQgPSAwOwokb3V0cHV0ID0gJyc7CiRvcGVuVGFnUmVnZXggPSAnW2Etel0oPzpbXlxcXFw8Pl0qKyB8IFxcXFwuKSonOwokY2xvc2VUYWdSZWdleCA9ICdbYS16XVtePD5dKisnOwokY3VycmVudExpbmVMZW5ndGggPSAwOwpwcmVnX21hdGNoX2FsbCgiIzwoKCRvcGVuVGFnUmVnZXgpIHwgLygkY2xvc2VUYWdSZWdleCk/KT4jaXgiLCAkbWVzc2FnZSwgJG1hdGNoZXMsIFxQUkVHX09GRlNFVF9DQVBUVVJFKTsKZm9yZWFjaCAoJG1hdGNoZXNbMF0gYXMgJGkgPT4gJG1hdGNoKSB7CiRwb3MgPSAkbWF0Y2hbMV07CiR0ZXh0ID0gJG1hdGNoWzBdOwoKaWYgKDAgIT0gJHBvcyAmJiAnXFwnID09ICRtZXNzYWdlWyRwb3MgLSAxXSkgewpjb250aW51ZTsKfQoKCiRvdXRwdXQgLj0gJHRoaXMtPmFwcGx5Q3VycmVudFN0eWxlKHN1YnN0cigkbWVzc2FnZSwgJG9mZnNldCwgJHBvcyAtICRvZmZzZXQpLCAkb3V0cHV0LCAkd2lkdGgsICRjdXJyZW50TGluZUxlbmd0aCk7CiRvZmZzZXQgPSAkcG9zICsgXHN0cmxlbigkdGV4dCk7CgoKaWYgKCRvcGVuID0gJy8nICE9ICR0ZXh0WzFdKSB7CiR0YWcgPSAkbWF0Y2hlc1sxXVskaV1bMF07Cn0gZWxzZSB7CiR0YWcgPSAkbWF0Y2hlc1szXVskaV1bMF0gPz8gJyc7Cn0KCmlmICghJG9wZW4gJiYgISR0YWcpIHsKCiR0aGlzLT5zdHlsZVN0YWNrLT5wb3AoKTsKfSBlbHNlaWYgKG51bGwgPT09ICRzdHlsZSA9ICR0aGlzLT5jcmVhdGVTdHlsZUZyb21TdHJpbmcoJHRhZykpIHsKJG91dHB1dCAuPSAkdGhpcy0+YXBwbHlDdXJyZW50U3R5bGUoJHRleHQsICRvdXRwdXQsICR3aWR0aCwgJGN1cnJlbnRMaW5lTGVuZ3RoKTsKfSBlbHNlaWYgKCRvcGVuKSB7CiR0aGlzLT5zdHlsZVN0YWNrLT5wdXNoKCRzdHlsZSk7Cn0gZWxzZSB7CiR0aGlzLT5zdHlsZVN0YWNrLT5wb3AoJHN0eWxlKTsKfQp9Cgokb3V0cHV0IC49ICR0aGlzLT5hcHBseUN1cnJlbnRTdHlsZShzdWJzdHIoJG1lc3NhZ2UsICRvZmZzZXQpLCAkb3V0cHV0LCAkd2lkdGgsICRjdXJyZW50TGluZUxlbmd0aCk7CgpyZXR1cm4gc3RydHIoJG91dHB1dCwgWyJcMCIgPT4gJ1xcJywgJ1xcPCcgPT4gJzwnLCAnXFw+JyA9PiAnPiddKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlU3RhY2soKQp7CnJldHVybiAkdGhpcy0+c3R5bGVTdGFjazsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVTdHlsZUZyb21TdHJpbmcoc3RyaW5nICRzdHJpbmcpOiA/T3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UKewppZiAoaXNzZXQoJHRoaXMtPnN0eWxlc1skc3RyaW5nXSkpIHsKcmV0dXJuICR0aGlzLT5zdHlsZXNbJHN0cmluZ107Cn0KCmlmICghcHJlZ19tYXRjaF9hbGwoJy8oW149XSspPShbXjtdKykoO3wkKS8nLCAkc3RyaW5nLCAkbWF0Y2hlcywgXFBSRUdfU0VUX09SREVSKSkgewpyZXR1cm4gbnVsbDsKfQoKJHN0eWxlID0gbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCk7CmZvcmVhY2ggKCRtYXRjaGVzIGFzICRtYXRjaCkgewphcnJheV9zaGlmdCgkbWF0Y2gpOwokbWF0Y2hbMF0gPSBzdHJ0b2xvd2VyKCRtYXRjaFswXSk7CgppZiAoJ2ZnJyA9PSAkbWF0Y2hbMF0pIHsKJHN0eWxlLT5zZXRGb3JlZ3JvdW5kKHN0cnRvbG93ZXIoJG1hdGNoWzFdKSk7Cn0gZWxzZWlmICgnYmcnID09ICRtYXRjaFswXSkgewokc3R5bGUtPnNldEJhY2tncm91bmQoc3RydG9sb3dlcigkbWF0Y2hbMV0pKTsKfSBlbHNlaWYgKCdocmVmJyA9PT0gJG1hdGNoWzBdKSB7CiR1cmwgPSBwcmVnX3JlcGxhY2UoJ3tcXFxcKFs8Pl0pfScsICckMScsICRtYXRjaFsxXSk7CiRzdHlsZS0+c2V0SHJlZigkdXJsKTsKfSBlbHNlaWYgKCdvcHRpb25zJyA9PT0gJG1hdGNoWzBdKSB7CnByZWdfbWF0Y2hfYWxsKCcoW14sO10rKScsIHN0cnRvbG93ZXIoJG1hdGNoWzFdKSwgJG9wdGlvbnMpOwokb3B0aW9ucyA9IGFycmF5X3NoaWZ0KCRvcHRpb25zKTsKZm9yZWFjaCAoJG9wdGlvbnMgYXMgJG9wdGlvbikgewokc3R5bGUtPnNldE9wdGlvbigkb3B0aW9uKTsKfQp9IGVsc2UgewpyZXR1cm4gbnVsbDsKfQp9CgpyZXR1cm4gJHN0eWxlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGx5Q3VycmVudFN0eWxlKHN0cmluZyAkdGV4dCwgc3RyaW5nICRjdXJyZW50LCBpbnQgJHdpZHRoLCBpbnQgJiRjdXJyZW50TGluZUxlbmd0aCk6IHN0cmluZwp7CmlmICgnJyA9PT0gJHRleHQpIHsKcmV0dXJuICcnOwp9CgppZiAoISR3aWR0aCkgewpyZXR1cm4gJHRoaXMtPmlzRGVjb3JhdGVkKCkgPyAkdGhpcy0+c3R5bGVTdGFjay0+Z2V0Q3VycmVudCgpLT5hcHBseSgkdGV4dCkgOiAkdGV4dDsKfQoKaWYgKCEkY3VycmVudExpbmVMZW5ndGggJiYgJycgIT09ICRjdXJyZW50KSB7CiR0ZXh0ID0gbHRyaW0oJHRleHQpOwp9CgppZiAoJGN1cnJlbnRMaW5lTGVuZ3RoKSB7CiRwcmVmaXggPSBzdWJzdHIoJHRleHQsIDAsICRpID0gJHdpZHRoIC0gJGN1cnJlbnRMaW5lTGVuZ3RoKS4iXG4iOwokdGV4dCA9IHN1YnN0cigkdGV4dCwgJGkpOwp9IGVsc2UgewokcHJlZml4ID0gJyc7Cn0KCnByZWdfbWF0Y2goJ34oXFxuKSR+JywgJHRleHQsICRtYXRjaGVzKTsKJHRleHQgPSAkcHJlZml4LiR0aGlzLT5hZGRMaW5lQnJlYWtzKCR0ZXh0LCAkd2lkdGgpOwokdGV4dCA9IHJ0cmltKCR0ZXh0LCAiXG4iKS4oJG1hdGNoZXNbMV0gPz8gJycpOwoKaWYgKCEkY3VycmVudExpbmVMZW5ndGggJiYgJycgIT09ICRjdXJyZW50ICYmICJcbiIgIT09IHN1YnN0cigkY3VycmVudCwgLTEpKSB7CiR0ZXh0ID0gIlxuIi4kdGV4dDsKfQoKJGxpbmVzID0gZXhwbG9kZSgiXG4iLCAkdGV4dCk7Cgpmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKJGN1cnJlbnRMaW5lTGVuZ3RoICs9IFxzdHJsZW4oJGxpbmUpOwppZiAoJHdpZHRoIDw9ICRjdXJyZW50TGluZUxlbmd0aCkgewokY3VycmVudExpbmVMZW5ndGggPSAwOwp9Cn0KCmlmICgkdGhpcy0+aXNEZWNvcmF0ZWQoKSkgewpmb3JlYWNoICgkbGluZXMgYXMgJGkgPT4gJGxpbmUpIHsKJGxpbmVzWyRpXSA9ICR0aGlzLT5zdHlsZVN0YWNrLT5nZXRDdXJyZW50KCktPmFwcGx5KCRsaW5lKTsKfQp9CgpyZXR1cm4gaW1wbG9kZSgiXG4iLCAkbGluZXMpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGFkZExpbmVCcmVha3Moc3RyaW5nICR0ZXh0LCBpbnQgJHdpZHRoKTogc3RyaW5nCnsKJGVuY29kaW5nID0gbWJfZGV0ZWN0X2VuY29kaW5nKCR0ZXh0LCBudWxsLCB0cnVlKSA/OiAnVVRGLTgnOwoKcmV0dXJuIGIoJHRleHQpLT50b0NvZGVQb2ludFN0cmluZygkZW5jb2RpbmcpLT53b3Jkd3JhcCgkd2lkdGgsICJcbiIsIHRydWUpLT50b0J5dGVTdHJpbmcoJGVuY29kaW5nKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXI7CgoKCgoKCmludGVyZmFjZSBPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVjb3JhdGVkKGJvb2wgJGRlY29yYXRlZCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0eWxlKHN0cmluZyAkbmFtZSwgT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UgJHN0eWxlKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1N0eWxlKHN0cmluZyAkbmFtZSk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlKHN0cmluZyAkbmFtZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXQoP3N0cmluZyAkbWVzc2FnZSk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbG9yOwoKCgoKCgpjbGFzcyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSBpbXBsZW1lbnRzIE91dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlCnsKcHJpdmF0ZSAkY29sb3I7CnByaXZhdGUgJGZvcmVncm91bmQ7CnByaXZhdGUgJGJhY2tncm91bmQ7CnByaXZhdGUgJG9wdGlvbnM7CnByaXZhdGUgJGhyZWY7CnByaXZhdGUgJGhhbmRsZXNIcmVmR3JhY2VmdWxseTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/c3RyaW5nICRmb3JlZ3JvdW5kID0gbnVsbCwgP3N0cmluZyAkYmFja2dyb3VuZCA9IG51bGwsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPmNvbG9yID0gbmV3IENvbG9yKCR0aGlzLT5mb3JlZ3JvdW5kID0gJGZvcmVncm91bmQgPzogJycsICR0aGlzLT5iYWNrZ3JvdW5kID0gJGJhY2tncm91bmQgPzogJycsICR0aGlzLT5vcHRpb25zID0gJG9wdGlvbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Rm9yZWdyb3VuZCg/c3RyaW5nICRjb2xvciA9IG51bGwpCnsKJHRoaXMtPmNvbG9yID0gbmV3IENvbG9yKCR0aGlzLT5mb3JlZ3JvdW5kID0gJGNvbG9yID86ICcnLCAkdGhpcy0+YmFja2dyb3VuZCwgJHRoaXMtPm9wdGlvbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QmFja2dyb3VuZCg/c3RyaW5nICRjb2xvciA9IG51bGwpCnsKJHRoaXMtPmNvbG9yID0gbmV3IENvbG9yKCR0aGlzLT5mb3JlZ3JvdW5kLCAkdGhpcy0+YmFja2dyb3VuZCA9ICRjb2xvciA/OiAnJywgJHRoaXMtPm9wdGlvbnMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0SHJlZihzdHJpbmcgJHVybCk6IHZvaWQKewokdGhpcy0+aHJlZiA9ICR1cmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb24oc3RyaW5nICRvcHRpb24pCnsKJHRoaXMtPm9wdGlvbnNbXSA9ICRvcHRpb247CiR0aGlzLT5jb2xvciA9IG5ldyBDb2xvcigkdGhpcy0+Zm9yZWdyb3VuZCwgJHRoaXMtPmJhY2tncm91bmQsICR0aGlzLT5vcHRpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVuc2V0T3B0aW9uKHN0cmluZyAkb3B0aW9uKQp7CiRwb3MgPSBhcnJheV9zZWFyY2goJG9wdGlvbiwgJHRoaXMtPm9wdGlvbnMpOwppZiAoZmFsc2UgIT09ICRwb3MpIHsKdW5zZXQoJHRoaXMtPm9wdGlvbnNbJHBvc10pOwp9CgokdGhpcy0+Y29sb3IgPSBuZXcgQ29sb3IoJHRoaXMtPmZvcmVncm91bmQsICR0aGlzLT5iYWNrZ3JvdW5kLCAkdGhpcy0+b3B0aW9ucyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb25zKGFycmF5ICRvcHRpb25zKQp7CiR0aGlzLT5jb2xvciA9IG5ldyBDb2xvcigkdGhpcy0+Zm9yZWdyb3VuZCwgJHRoaXMtPmJhY2tncm91bmQsICR0aGlzLT5vcHRpb25zID0gJG9wdGlvbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXBwbHkoc3RyaW5nICR0ZXh0KQp7CmlmIChudWxsID09PSAkdGhpcy0+aGFuZGxlc0hyZWZHcmFjZWZ1bGx5KSB7CiR0aGlzLT5oYW5kbGVzSHJlZkdyYWNlZnVsbHkgPSAnSmV0QnJhaW5zLUplZGlUZXJtJyAhPT0gZ2V0ZW52KCdURVJNSU5BTF9FTVVMQVRPUicpCiYmICghZ2V0ZW52KCdLT05TT0xFX1ZFUlNJT04nKSB8fCAoaW50KSBnZXRlbnYoJ0tPTlNPTEVfVkVSU0lPTicpID4gMjAxMTAwKQomJiAhaXNzZXQoJF9TRVJWRVJbJ0lERUFfSU5JVElBTF9ESVJFQ1RPUlknXSk7Cn0KCmlmIChudWxsICE9PSAkdGhpcy0+aHJlZiAmJiAkdGhpcy0+aGFuZGxlc0hyZWZHcmFjZWZ1bGx5KSB7CiR0ZXh0ID0gIlwwMzNdODs7JHRoaXMtPmhyZWZcMDMzXFwkdGV4dFwwMzNdODs7XDAzM1xcIjsKfQoKcmV0dXJuICR0aGlzLT5jb2xvci0+YXBwbHkoJHRleHQpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlcjsKCgoKCgoKaW50ZXJmYWNlIE91dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZvcmVncm91bmQoP3N0cmluZyAkY29sb3IgPSBudWxsKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRCYWNrZ3JvdW5kKD9zdHJpbmcgJGNvbG9yID0gbnVsbCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9uKHN0cmluZyAkb3B0aW9uKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bnNldE9wdGlvbihzdHJpbmcgJG9wdGlvbik7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9ucyhhcnJheSAkb3B0aW9ucyk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhcHBseShzdHJpbmcgJHRleHQpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxSZXNldEludGVyZmFjZTsKCgoKCmNsYXNzIE91dHB1dEZvcm1hdHRlclN0eWxlU3RhY2sgaW1wbGVtZW50cyBSZXNldEludGVyZmFjZQp7CgoKCnByaXZhdGUgJHN0eWxlczsKCnByaXZhdGUgJGVtcHR5U3R5bGU7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP091dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlICRlbXB0eVN0eWxlID0gbnVsbCkKewokdGhpcy0+ZW1wdHlTdHlsZSA9ICRlbXB0eVN0eWxlID8/IG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgpOwokdGhpcy0+cmVzZXQoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCkKewokdGhpcy0+c3R5bGVzID0gW107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwdXNoKE91dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlICRzdHlsZSkKewokdGhpcy0+c3R5bGVzW10gPSAkc3R5bGU7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcG9wKD9PdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZSAkc3R5bGUgPSBudWxsKQp7CmlmIChlbXB0eSgkdGhpcy0+c3R5bGVzKSkgewpyZXR1cm4gJHRoaXMtPmVtcHR5U3R5bGU7Cn0KCmlmIChudWxsID09PSAkc3R5bGUpIHsKcmV0dXJuIGFycmF5X3BvcCgkdGhpcy0+c3R5bGVzKTsKfQoKZm9yZWFjaCAoYXJyYXlfcmV2ZXJzZSgkdGhpcy0+c3R5bGVzLCB0cnVlKSBhcyAkaW5kZXggPT4gJHN0YWNrZWRTdHlsZSkgewppZiAoJHN0eWxlLT5hcHBseSgnJykgPT09ICRzdGFja2VkU3R5bGUtPmFwcGx5KCcnKSkgewokdGhpcy0+c3R5bGVzID0gXGFycmF5X3NsaWNlKCR0aGlzLT5zdHlsZXMsIDAsICRpbmRleCk7CgpyZXR1cm4gJHN0YWNrZWRTdHlsZTsKfQp9Cgp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbmNvcnJlY3RseSBuZXN0ZWQgc3R5bGUgdGFnIGZvdW5kLicpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDdXJyZW50KCkKewppZiAoZW1wdHkoJHRoaXMtPnN0eWxlcykpIHsKcmV0dXJuICR0aGlzLT5lbXB0eVN0eWxlOwp9CgpyZXR1cm4gJHRoaXMtPnN0eWxlc1tcY291bnQoJHRoaXMtPnN0eWxlcykgLSAxXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEVtcHR5U3R5bGUoT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UgJGVtcHR5U3R5bGUpCnsKJHRoaXMtPmVtcHR5U3R5bGUgPSAkZW1wdHlTdHlsZTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVtcHR5U3R5bGUoKQp7CnJldHVybiAkdGhpcy0+ZW1wdHlTdHlsZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXI7CgoKCgoKCmludGVyZmFjZSBXcmFwcGFibGVPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgZXh0ZW5kcyBPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gZm9ybWF0QW5kV3JhcCg/c3RyaW5nICRtZXNzYWdlLCBpbnQgJHdpZHRoKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKCgoKCgoKCmNsYXNzIERlYnVnRm9ybWF0dGVySGVscGVyIGV4dGVuZHMgSGVscGVyCnsKcHJpdmF0ZSBjb25zdCBDT0xPUlMgPSBbJ2JsYWNrJywgJ3JlZCcsICdncmVlbicsICd5ZWxsb3cnLCAnYmx1ZScsICdtYWdlbnRhJywgJ2N5YW4nLCAnd2hpdGUnLCAnZGVmYXVsdCddOwpwcml2YXRlICRzdGFydGVkID0gW107CnByaXZhdGUgJGNvdW50ID0gLTE7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdGFydChzdHJpbmcgJGlkLCBzdHJpbmcgJG1lc3NhZ2UsIHN0cmluZyAkcHJlZml4ID0gJ1JVTicpCnsKJHRoaXMtPnN0YXJ0ZWRbJGlkXSA9IFsnYm9yZGVyJyA9PiArKyR0aGlzLT5jb3VudCAlIFxjb3VudChzZWxmOjpDT0xPUlMpXTsKCnJldHVybiBzcHJpbnRmKCIlczxiZz1ibHVlO2ZnPXdoaXRlPiAlcyA8Lz4gPGZnPWJsdWU+JXM8Lz5cbiIsICR0aGlzLT5nZXRCb3JkZXIoJGlkKSwgJHByZWZpeCwgJG1lc3NhZ2UpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9ncmVzcyhzdHJpbmcgJGlkLCBzdHJpbmcgJGJ1ZmZlciwgYm9vbCAkZXJyb3IgPSBmYWxzZSwgc3RyaW5nICRwcmVmaXggPSAnT1VUJywgc3RyaW5nICRlcnJvclByZWZpeCA9ICdFUlInKQp7CiRtZXNzYWdlID0gJyc7CgppZiAoJGVycm9yKSB7CmlmIChpc3NldCgkdGhpcy0+c3RhcnRlZFskaWRdWydvdXQnXSkpIHsKJG1lc3NhZ2UgLj0gIlxuIjsKdW5zZXQoJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnb3V0J10pOwp9CmlmICghaXNzZXQoJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnZXJyJ10pKSB7CiRtZXNzYWdlIC49IHNwcmludGYoJyVzPGJnPXJlZDtmZz13aGl0ZT4gJXMgPC8+ICcsICR0aGlzLT5nZXRCb3JkZXIoJGlkKSwgJGVycm9yUHJlZml4KTsKJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnZXJyJ10gPSB0cnVlOwp9CgokbWVzc2FnZSAuPSBzdHJfcmVwbGFjZSgiXG4iLCBzcHJpbnRmKCJcbiVzPGJnPXJlZDtmZz13aGl0ZT4gJXMgPC8+ICIsICR0aGlzLT5nZXRCb3JkZXIoJGlkKSwgJGVycm9yUHJlZml4KSwgJGJ1ZmZlcik7Cn0gZWxzZSB7CmlmIChpc3NldCgkdGhpcy0+c3RhcnRlZFskaWRdWydlcnInXSkpIHsKJG1lc3NhZ2UgLj0gIlxuIjsKdW5zZXQoJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnZXJyJ10pOwp9CmlmICghaXNzZXQoJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnb3V0J10pKSB7CiRtZXNzYWdlIC49IHNwcmludGYoJyVzPGJnPWdyZWVuO2ZnPXdoaXRlPiAlcyA8Lz4gJywgJHRoaXMtPmdldEJvcmRlcigkaWQpLCAkcHJlZml4KTsKJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnb3V0J10gPSB0cnVlOwp9CgokbWVzc2FnZSAuPSBzdHJfcmVwbGFjZSgiXG4iLCBzcHJpbnRmKCJcbiVzPGJnPWdyZWVuO2ZnPXdoaXRlPiAlcyA8Lz4gIiwgJHRoaXMtPmdldEJvcmRlcigkaWQpLCAkcHJlZml4KSwgJGJ1ZmZlcik7Cn0KCnJldHVybiAkbWVzc2FnZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RvcChzdHJpbmcgJGlkLCBzdHJpbmcgJG1lc3NhZ2UsIGJvb2wgJHN1Y2Nlc3NmdWwsIHN0cmluZyAkcHJlZml4ID0gJ1JFUycpCnsKJHRyYWlsaW5nRU9MID0gaXNzZXQoJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnb3V0J10pIHx8IGlzc2V0KCR0aGlzLT5zdGFydGVkWyRpZF1bJ2VyciddKSA/ICJcbiIgOiAnJzsKCmlmICgkc3VjY2Vzc2Z1bCkgewpyZXR1cm4gc3ByaW50ZigiJXMlczxiZz1ncmVlbjtmZz13aGl0ZT4gJXMgPC8+IDxmZz1ncmVlbj4lczwvPlxuIiwgJHRyYWlsaW5nRU9MLCAkdGhpcy0+Z2V0Qm9yZGVyKCRpZCksICRwcmVmaXgsICRtZXNzYWdlKTsKfQoKJG1lc3NhZ2UgPSBzcHJpbnRmKCIlcyVzPGJnPXJlZDtmZz13aGl0ZT4gJXMgPC8+IDxmZz1yZWQ+JXM8Lz5cbiIsICR0cmFpbGluZ0VPTCwgJHRoaXMtPmdldEJvcmRlcigkaWQpLCAkcHJlZml4LCAkbWVzc2FnZSk7Cgp1bnNldCgkdGhpcy0+c3RhcnRlZFskaWRdWydvdXQnXSwgJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnZXJyJ10pOwoKcmV0dXJuICRtZXNzYWdlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldEJvcmRlcihzdHJpbmcgJGlkKTogc3RyaW5nCnsKcmV0dXJuIHNwcmludGYoJzxiZz0lcz4gPC8+Jywgc2VsZjo6Q09MT1JTWyR0aGlzLT5zdGFydGVkWyRpZF1bJ2JvcmRlciddXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKewpyZXR1cm4gJ2RlYnVnX2Zvcm1hdHRlcic7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvclxEZXNjcmlwdG9ySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yXEpzb25EZXNjcmlwdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yXE1hcmtkb3duRGVzY3JpcHRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvclxUZXh0RGVzY3JpcHRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvclxYbWxEZXNjcmlwdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBEZXNjcmlwdG9ySGVscGVyIGV4dGVuZHMgSGVscGVyCnsKCgoKcHJpdmF0ZSAkZGVzY3JpcHRvcnMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKJHRoaXMKLT5yZWdpc3RlcigndHh0JywgbmV3IFRleHREZXNjcmlwdG9yKCkpCi0+cmVnaXN0ZXIoJ3htbCcsIG5ldyBYbWxEZXNjcmlwdG9yKCkpCi0+cmVnaXN0ZXIoJ2pzb24nLCBuZXcgSnNvbkRlc2NyaXB0b3IoKSkKLT5yZWdpc3RlcignbWQnLCBuZXcgTWFya2Rvd25EZXNjcmlwdG9yKCkpCjsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRlc2NyaWJlKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCA/b2JqZWN0ICRvYmplY3QsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJG9wdGlvbnMgPSBhcnJheV9tZXJnZShbCidyYXdfdGV4dCcgPT4gZmFsc2UsCidmb3JtYXQnID0+ICd0eHQnLApdLCAkb3B0aW9ucyk7CgppZiAoIWlzc2V0KCR0aGlzLT5kZXNjcmlwdG9yc1skb3B0aW9uc1snZm9ybWF0J11dKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1Vuc3VwcG9ydGVkIGZvcm1hdCAiJXMiLicsICRvcHRpb25zWydmb3JtYXQnXSkpOwp9CgokZGVzY3JpcHRvciA9ICR0aGlzLT5kZXNjcmlwdG9yc1skb3B0aW9uc1snZm9ybWF0J11dOwokZGVzY3JpcHRvci0+ZGVzY3JpYmUoJG91dHB1dCwgJG9iamVjdCwgJG9wdGlvbnMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZWdpc3RlcihzdHJpbmcgJGZvcm1hdCwgRGVzY3JpcHRvckludGVyZmFjZSAkZGVzY3JpcHRvcikKewokdGhpcy0+ZGVzY3JpcHRvcnNbJGZvcm1hdF0gPSAkZGVzY3JpcHRvcjsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQp7CnJldHVybiAnZGVzY3JpcHRvcic7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXRzKCk6IGFycmF5CnsKcmV0dXJuIGFycmF5X2tleXMoJHRoaXMtPmRlc2NyaXB0b3JzKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcVmFyRHVtcGVyXENsb25lclxDbG9uZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxWYXJEdW1wZXJcQ2xvbmVyXFZhckNsb25lcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFZhckR1bXBlclxEdW1wZXJcQ2xpRHVtcGVyOwoKCgoKZmluYWwgY2xhc3MgRHVtcGVyCnsKcHJpdmF0ZSAkb3V0cHV0Owpwcml2YXRlICRkdW1wZXI7CnByaXZhdGUgJGNsb25lcjsKcHJpdmF0ZSAkaGFuZGxlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgP0NsaUR1bXBlciAkZHVtcGVyID0gbnVsbCwgP0Nsb25lckludGVyZmFjZSAkY2xvbmVyID0gbnVsbCkKewokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKJHRoaXMtPmR1bXBlciA9ICRkdW1wZXI7CiR0aGlzLT5jbG9uZXIgPSAkY2xvbmVyOwoKaWYgKGNsYXNzX2V4aXN0cyhDbGlEdW1wZXI6OmNsYXNzKSkgewokdGhpcy0+aGFuZGxlciA9IGZ1bmN0aW9uICgkdmFyKTogc3RyaW5nIHsKJGR1bXBlciA9ICR0aGlzLT5kdW1wZXIgPz8gJHRoaXMtPmR1bXBlciA9IG5ldyBDbGlEdW1wZXIobnVsbCwgbnVsbCwgQ2xpRHVtcGVyOjpEVU1QX0xJR0hUX0FSUkFZIHwgQ2xpRHVtcGVyOjpEVU1QX0NPTU1BX1NFUEFSQVRPUik7CiRkdW1wZXItPnNldENvbG9ycygkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpKTsKCnJldHVybiBydHJpbSgkZHVtcGVyLT5kdW1wKCgkdGhpcy0+Y2xvbmVyID8/ICR0aGlzLT5jbG9uZXIgPSBuZXcgVmFyQ2xvbmVyKCkpLT5jbG9uZVZhcigkdmFyKS0+d2l0aFJlZkhhbmRsZXMoZmFsc2UpLCB0cnVlKSk7Cn07Cn0gZWxzZSB7CiR0aGlzLT5oYW5kbGVyID0gZnVuY3Rpb24gKCR2YXIpOiBzdHJpbmcgewpzd2l0Y2ggKHRydWUpIHsKY2FzZSBudWxsID09PSAkdmFyOgpyZXR1cm4gJ251bGwnOwpjYXNlIHRydWUgPT09ICR2YXI6CnJldHVybiAndHJ1ZSc7CmNhc2UgZmFsc2UgPT09ICR2YXI6CnJldHVybiAnZmFsc2UnOwpjYXNlIFxpc19zdHJpbmcoJHZhcik6CnJldHVybiAnIicuJHZhci4nIic7CmRlZmF1bHQ6CnJldHVybiBydHJpbShwcmludF9yKCR2YXIsIHRydWUpKTsKfQp9Owp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2ludm9rZSgkdmFyKTogc3RyaW5nCnsKcmV0dXJuICgkdGhpcy0+aGFuZGxlcikoJHZhcik7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKCgoKCgoKY2xhc3MgRm9ybWF0dGVySGVscGVyIGV4dGVuZHMgSGVscGVyCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZm9ybWF0U2VjdGlvbihzdHJpbmcgJHNlY3Rpb24sIHN0cmluZyAkbWVzc2FnZSwgc3RyaW5nICRzdHlsZSA9ICdpbmZvJykKewpyZXR1cm4gc3ByaW50ZignPCVzPlslc108LyVzPiAlcycsICRzdHlsZSwgJHNlY3Rpb24sICRzdHlsZSwgJG1lc3NhZ2UpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZvcm1hdEJsb2NrKCRtZXNzYWdlcywgc3RyaW5nICRzdHlsZSwgYm9vbCAkbGFyZ2UgPSBmYWxzZSkKewppZiAoIVxpc19hcnJheSgkbWVzc2FnZXMpKSB7CiRtZXNzYWdlcyA9IFskbWVzc2FnZXNdOwp9CgokbGVuID0gMDsKJGxpbmVzID0gW107CmZvcmVhY2ggKCRtZXNzYWdlcyBhcyAkbWVzc2FnZSkgewokbWVzc2FnZSA9IE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRtZXNzYWdlKTsKJGxpbmVzW10gPSBzcHJpbnRmKCRsYXJnZSA/ICcgICVzICAnIDogJyAlcyAnLCAkbWVzc2FnZSk7CiRsZW4gPSBtYXgoc2VsZjo6d2lkdGgoJG1lc3NhZ2UpICsgKCRsYXJnZSA/IDQgOiAyKSwgJGxlbik7Cn0KCiRtZXNzYWdlcyA9ICRsYXJnZSA/IFtzdHJfcmVwZWF0KCcgJywgJGxlbildIDogW107CmZvciAoJGkgPSAwOyBpc3NldCgkbGluZXNbJGldKTsgKyskaSkgewokbWVzc2FnZXNbXSA9ICRsaW5lc1skaV0uc3RyX3JlcGVhdCgnICcsICRsZW4gLSBzZWxmOjp3aWR0aCgkbGluZXNbJGldKSk7Cn0KaWYgKCRsYXJnZSkgewokbWVzc2FnZXNbXSA9IHN0cl9yZXBlYXQoJyAnLCAkbGVuKTsKfQoKZm9yICgkaSA9IDA7IGlzc2V0KCRtZXNzYWdlc1skaV0pOyArKyRpKSB7CiRtZXNzYWdlc1skaV0gPSBzcHJpbnRmKCc8JXM+JXM8LyVzPicsICRzdHlsZSwgJG1lc3NhZ2VzWyRpXSwgJHN0eWxlKTsKfQoKcmV0dXJuIGltcGxvZGUoIlxuIiwgJG1lc3NhZ2VzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nICRtZXNzYWdlLCBpbnQgJGxlbmd0aCwgc3RyaW5nICRzdWZmaXggPSAnLi4uJykKewokY29tcHV0ZWRMZW5ndGggPSAkbGVuZ3RoIC0gc2VsZjo6d2lkdGgoJHN1ZmZpeCk7CgppZiAoJGNvbXB1dGVkTGVuZ3RoID4gc2VsZjo6d2lkdGgoJG1lc3NhZ2UpKSB7CnJldHVybiAkbWVzc2FnZTsKfQoKcmV0dXJuIHNlbGY6OnN1YnN0cigkbWVzc2FnZSwgMCwgJGxlbmd0aCkuJHN1ZmZpeDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQp7CnJldHVybiAnZm9ybWF0dGVyJzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXFVuaWNvZGVTdHJpbmc7CgoKCgoKCmFic3RyYWN0IGNsYXNzIEhlbHBlciBpbXBsZW1lbnRzIEhlbHBlckludGVyZmFjZQp7CnByb3RlY3RlZCAkaGVscGVyU2V0ID0gbnVsbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWxwZXJTZXQoP0hlbHBlclNldCAkaGVscGVyU2V0ID0gbnVsbCkKewokdGhpcy0+aGVscGVyU2V0ID0gJGhlbHBlclNldDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlbHBlclNldCgpCnsKcmV0dXJuICR0aGlzLT5oZWxwZXJTZXQ7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cmxlbig/c3RyaW5nICRzdHJpbmcpCnsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9jb25zb2xlJywgJzUuMycsICdNZXRob2QgIiVzKCkiIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBTeW1mb255IDYuMC4gVXNlIEhlbHBlcjo6d2lkdGgoKSBvciBIZWxwZXI6Omxlbmd0aCgpIGluc3RlYWQuJywgX19NRVRIT0RfXyk7CgpyZXR1cm4gc2VsZjo6d2lkdGgoJHN0cmluZyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdpZHRoKD9zdHJpbmcgJHN0cmluZyk6IGludAp7CiRzdHJpbmcgPz8gJHN0cmluZyA9ICcnOwoKaWYgKHByZWdfbWF0Y2goJy8vdScsICRzdHJpbmcpKSB7CnJldHVybiAobmV3IFVuaWNvZGVTdHJpbmcoJHN0cmluZykpLT53aWR0aChmYWxzZSk7Cn0KCmlmIChmYWxzZSA9PT0gJGVuY29kaW5nID0gbWJfZGV0ZWN0X2VuY29kaW5nKCRzdHJpbmcsIG51bGwsIHRydWUpKSB7CnJldHVybiBcc3RybGVuKCRzdHJpbmcpOwp9CgpyZXR1cm4gbWJfc3Ryd2lkdGgoJHN0cmluZywgJGVuY29kaW5nKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbGVuZ3RoKD9zdHJpbmcgJHN0cmluZyk6IGludAp7CiRzdHJpbmcgPz8gJHN0cmluZyA9ICcnOwoKaWYgKHByZWdfbWF0Y2goJy8vdScsICRzdHJpbmcpKSB7CnJldHVybiAobmV3IFVuaWNvZGVTdHJpbmcoJHN0cmluZykpLT5sZW5ndGgoKTsKfQoKaWYgKGZhbHNlID09PSAkZW5jb2RpbmcgPSBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZywgbnVsbCwgdHJ1ZSkpIHsKcmV0dXJuIFxzdHJsZW4oJHN0cmluZyk7Cn0KCnJldHVybiBtYl9zdHJsZW4oJHN0cmluZywgJGVuY29kaW5nKTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1YnN0cig/c3RyaW5nICRzdHJpbmcsIGludCAkZnJvbSwgP2ludCAkbGVuZ3RoID0gbnVsbCkKewokc3RyaW5nID8/ICRzdHJpbmcgPSAnJzsKCmlmIChmYWxzZSA9PT0gJGVuY29kaW5nID0gbWJfZGV0ZWN0X2VuY29kaW5nKCRzdHJpbmcsIG51bGwsIHRydWUpKSB7CnJldHVybiBzdWJzdHIoJHN0cmluZywgJGZyb20sICRsZW5ndGgpOwp9CgpyZXR1cm4gbWJfc3Vic3RyKCRzdHJpbmcsICRmcm9tLCAkbGVuZ3RoLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdFRpbWUoJHNlY3MpCnsKc3RhdGljICR0aW1lRm9ybWF0cyA9IFsKWzAsICc8IDEgc2VjJ10sClsxLCAnMSBzZWMnXSwKWzIsICdzZWNzJywgMV0sCls2MCwgJzEgbWluJ10sClsxMjAsICdtaW5zJywgNjBdLApbMzYwMCwgJzEgaHInXSwKWzcyMDAsICdocnMnLCAzNjAwXSwKWzg2NDAwLCAnMSBkYXknXSwKWzE3MjgwMCwgJ2RheXMnLCA4NjQwMF0sCl07Cgpmb3JlYWNoICgkdGltZUZvcm1hdHMgYXMgJGluZGV4ID0+ICRmb3JtYXQpIHsKaWYgKCRzZWNzID49ICRmb3JtYXRbMF0pIHsKaWYgKChpc3NldCgkdGltZUZvcm1hdHNbJGluZGV4ICsgMV0pICYmICRzZWNzIDwgJHRpbWVGb3JtYXRzWyRpbmRleCArIDFdWzBdKQp8fCAkaW5kZXggPT0gXGNvdW50KCR0aW1lRm9ybWF0cykgLSAxCikgewppZiAoMiA9PSBcY291bnQoJGZvcm1hdCkpIHsKcmV0dXJuICRmb3JtYXRbMV07Cn0KCnJldHVybiBmbG9vcigkc2VjcyAvICRmb3JtYXRbMl0pLicgJy4kZm9ybWF0WzFdOwp9Cn0KfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdE1lbW9yeShpbnQgJG1lbW9yeSkKewppZiAoJG1lbW9yeSA+PSAxMDI0ICogMTAyNCAqIDEwMjQpIHsKcmV0dXJuIHNwcmludGYoJyUuMWYgR2lCJywgJG1lbW9yeSAvIDEwMjQgLyAxMDI0IC8gMTAyNCk7Cn0KCmlmICgkbWVtb3J5ID49IDEwMjQgKiAxMDI0KSB7CnJldHVybiBzcHJpbnRmKCclLjFmIE1pQicsICRtZW1vcnkgLyAxMDI0IC8gMTAyNCk7Cn0KCmlmICgkbWVtb3J5ID49IDEwMjQpIHsKcmV0dXJuIHNwcmludGYoJyVkIEtpQicsICRtZW1vcnkgLyAxMDI0KTsKfQoKcmV0dXJuIHNwcmludGYoJyVkIEInLCAkbWVtb3J5KTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJsZW5XaXRob3V0RGVjb3JhdGlvbihPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlciwgP3N0cmluZyAkc3RyaW5nKQp7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvY29uc29sZScsICc1LjMnLCAnTWV0aG9kICIlcygpIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gU3ltZm9ueSA2LjAuIFVzZSBIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oKSBpbnN0ZWFkLicsIF9fTUVUSE9EX18pOwoKcmV0dXJuIHNlbGY6OndpZHRoKHNlbGY6OnJlbW92ZURlY29yYXRpb24oJGZvcm1hdHRlciwgJHN0cmluZykpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlbW92ZURlY29yYXRpb24oT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIsID9zdHJpbmcgJHN0cmluZykKewokaXNEZWNvcmF0ZWQgPSAkZm9ybWF0dGVyLT5pc0RlY29yYXRlZCgpOwokZm9ybWF0dGVyLT5zZXREZWNvcmF0ZWQoZmFsc2UpOwoKJHN0cmluZyA9ICRmb3JtYXR0ZXItPmZvcm1hdCgkc3RyaW5nID8/ICcnKTsKCiRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoIi9cMDMzXFtbXm1dKm0vIiwgJycsICRzdHJpbmcgPz8gJycpOwoKJHN0cmluZyA9IHByZWdfcmVwbGFjZSgnL1xcMDMzXTg7W147XSo7W15cXDAzM10qXFwwMzNcXFxcLycsICcnLCAkc3RyaW5nID8/ICcnKTsKJGZvcm1hdHRlci0+c2V0RGVjb3JhdGVkKCRpc0RlY29yYXRlZCk7CgpyZXR1cm4gJHN0cmluZzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7CgoKCgoKCmludGVyZmFjZSBIZWxwZXJJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SGVscGVyU2V0KD9IZWxwZXJTZXQgJGhlbHBlclNldCA9IG51bGwpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVscGVyU2V0KCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCgoKCgpjbGFzcyBIZWxwZXJTZXQgaW1wbGVtZW50cyBcSXRlcmF0b3JBZ2dyZWdhdGUKewoKcHJpdmF0ZSAkaGVscGVycyA9IFtdOwpwcml2YXRlICRjb21tYW5kOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRoZWxwZXJzID0gW10pCnsKZm9yZWFjaCAoJGhlbHBlcnMgYXMgJGFsaWFzID0+ICRoZWxwZXIpIHsKJHRoaXMtPnNldCgkaGVscGVyLCBcaXNfaW50KCRhbGlhcykgPyBudWxsIDogJGFsaWFzKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0KEhlbHBlckludGVyZmFjZSAkaGVscGVyLCA/c3RyaW5nICRhbGlhcyA9IG51bGwpCnsKJHRoaXMtPmhlbHBlcnNbJGhlbHBlci0+Z2V0TmFtZSgpXSA9ICRoZWxwZXI7CmlmIChudWxsICE9PSAkYWxpYXMpIHsKJHRoaXMtPmhlbHBlcnNbJGFsaWFzXSA9ICRoZWxwZXI7Cn0KCiRoZWxwZXItPnNldEhlbHBlclNldCgkdGhpcyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcyhzdHJpbmcgJG5hbWUpCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5oZWxwZXJzWyRuYW1lXSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAkbmFtZSkKewppZiAoISR0aGlzLT5oYXMoJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIGhlbHBlciAiJXMiIGlzIG5vdCBkZWZpbmVkLicsICRuYW1lKSk7Cn0KCnJldHVybiAkdGhpcy0+aGVscGVyc1skbmFtZV07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb21tYW5kKD9Db21tYW5kICRjb21tYW5kID0gbnVsbCkKewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2NvbnNvbGUnLCAnNS40JywgJ01ldGhvZCAiJXMoKSIgaXMgZGVwcmVjYXRlZC4nLCBfX01FVEhPRF9fKTsKCiR0aGlzLT5jb21tYW5kID0gJGNvbW1hbmQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZCgpCnsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9jb25zb2xlJywgJzUuNCcsICdNZXRob2QgIiVzKCkiIGlzIGRlcHJlY2F0ZWQuJywgX19NRVRIT0RfXyk7CgpyZXR1cm4gJHRoaXMtPmNvbW1hbmQ7Cn0KCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKQp7CnJldHVybiBuZXcgXEFycmF5SXRlcmF0b3IoJHRoaXMtPmhlbHBlcnMpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXdhcmVJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwoKCgoKCgphYnN0cmFjdCBjbGFzcyBJbnB1dEF3YXJlSGVscGVyIGV4dGVuZHMgSGVscGVyIGltcGxlbWVudHMgSW5wdXRBd2FyZUludGVyZmFjZQp7CnByb3RlY3RlZCAkaW5wdXQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5wdXQoSW5wdXRJbnRlcmZhY2UgJGlucHV0KQp7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFByb2Nlc3NGYWlsZWRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCgoKY2xhc3MgUHJvY2Vzc0hlbHBlciBleHRlbmRzIEhlbHBlcgp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcnVuKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCAkY21kLCA/c3RyaW5nICRlcnJvciA9IG51bGwsID9jYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsLCBpbnQgJHZlcmJvc2l0eSA9IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUllfVkVSQk9TRSk6IFByb2Nlc3MKewppZiAoIWNsYXNzX2V4aXN0cyhQcm9jZXNzOjpjbGFzcykpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhlIFByb2Nlc3NIZWxwZXIgY2Fubm90IGJlIHJ1biBhcyB0aGUgUHJvY2VzcyBjb21wb25lbnQgaXMgbm90IGluc3RhbGxlZC4gVHJ5IHJ1bm5pbmcgImNvbXBvc2UgcmVxdWlyZSBzeW1mb255L3Byb2Nlc3MiLicpOwp9CgppZiAoJG91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKJG91dHB1dCA9ICRvdXRwdXQtPmdldEVycm9yT3V0cHV0KCk7Cn0KCiRmb3JtYXR0ZXIgPSAkdGhpcy0+Z2V0SGVscGVyU2V0KCktPmdldCgnZGVidWdfZm9ybWF0dGVyJyk7CgppZiAoJGNtZCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKJGNtZCA9IFskY21kXTsKfQoKaWYgKCFcaXNfYXJyYXkoJGNtZCkpIHsKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignVGhlICJjb21tYW5kIiBhcmd1bWVudCBvZiAiJXMoKSIgbXVzdCBiZSBhbiBhcnJheSBvciBhICIlcyIgaW5zdGFuY2UsICIlcyIgZ2l2ZW4uJywgX19NRVRIT0RfXywgUHJvY2Vzczo6Y2xhc3MsIGdldF9kZWJ1Z190eXBlKCRjbWQpKSk7Cn0KCmlmIChcaXNfc3RyaW5nKCRjbWRbMF0gPz8gbnVsbCkpIHsKJHByb2Nlc3MgPSBuZXcgUHJvY2VzcygkY21kKTsKJGNtZCA9IFtdOwp9IGVsc2VpZiAoKCRjbWRbMF0gPz8gbnVsbCkgaW5zdGFuY2VvZiBQcm9jZXNzKSB7CiRwcm9jZXNzID0gJGNtZFswXTsKdW5zZXQoJGNtZFswXSk7Cn0gZWxzZSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgY29tbWFuZCBwcm92aWRlZCB0byAiJXMoKSI6IHRoZSBjb21tYW5kIHNob3VsZCBiZSBhbiBhcnJheSB3aG9zZSBmaXJzdCBlbGVtZW50IGlzIGVpdGhlciB0aGUgcGF0aCB0byB0aGUgYmluYXJ5IHRvIHJ1biBvciBhICJQcm9jZXNzIiBvYmplY3QuJywgX19NRVRIT0RfXykpOwp9CgppZiAoJHZlcmJvc2l0eSA8PSAkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewokb3V0cHV0LT53cml0ZSgkZm9ybWF0dGVyLT5zdGFydChzcGxfb2JqZWN0X2hhc2goJHByb2Nlc3MpLCAkdGhpcy0+ZXNjYXBlU3RyaW5nKCRwcm9jZXNzLT5nZXRDb21tYW5kTGluZSgpKSkpOwp9CgppZiAoJG91dHB1dC0+aXNEZWJ1ZygpKSB7CiRjYWxsYmFjayA9ICR0aGlzLT53cmFwQ2FsbGJhY2soJG91dHB1dCwgJHByb2Nlc3MsICRjYWxsYmFjayk7Cn0KCiRwcm9jZXNzLT5ydW4oJGNhbGxiYWNrLCAkY21kKTsKCmlmICgkdmVyYm9zaXR5IDw9ICRvdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CiRtZXNzYWdlID0gJHByb2Nlc3MtPmlzU3VjY2Vzc2Z1bCgpID8gJ0NvbW1hbmQgcmFuIHN1Y2Nlc3NmdWxseScgOiBzcHJpbnRmKCclcyBDb21tYW5kIGRpZCBub3QgcnVuIHN1Y2Nlc3NmdWxseScsICRwcm9jZXNzLT5nZXRFeGl0Q29kZSgpKTsKJG91dHB1dC0+d3JpdGUoJGZvcm1hdHRlci0+c3RvcChzcGxfb2JqZWN0X2hhc2goJHByb2Nlc3MpLCAkbWVzc2FnZSwgJHByb2Nlc3MtPmlzU3VjY2Vzc2Z1bCgpKSk7Cn0KCmlmICghJHByb2Nlc3MtPmlzU3VjY2Vzc2Z1bCgpICYmIG51bGwgIT09ICRlcnJvcikgewokb3V0cHV0LT53cml0ZWxuKHNwcmludGYoJzxlcnJvcj4lczwvZXJyb3I+JywgJHRoaXMtPmVzY2FwZVN0cmluZygkZXJyb3IpKSk7Cn0KCnJldHVybiAkcHJvY2VzczsKfQoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbXVzdFJ1bihPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgJGNtZCwgP3N0cmluZyAkZXJyb3IgPSBudWxsLCA/Y2FsbGFibGUgJGNhbGxiYWNrID0gbnVsbCk6IFByb2Nlc3MKewokcHJvY2VzcyA9ICR0aGlzLT5ydW4oJG91dHB1dCwgJGNtZCwgJGVycm9yLCAkY2FsbGJhY2spOwoKaWYgKCEkcHJvY2Vzcy0+aXNTdWNjZXNzZnVsKCkpIHsKdGhyb3cgbmV3IFByb2Nlc3NGYWlsZWRFeGNlcHRpb24oJHByb2Nlc3MpOwp9CgpyZXR1cm4gJHByb2Nlc3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cmFwQ2FsbGJhY2soT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFByb2Nlc3MgJHByb2Nlc3MsID9jYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsKTogY2FsbGFibGUKewppZiAoJG91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKJG91dHB1dCA9ICRvdXRwdXQtPmdldEVycm9yT3V0cHV0KCk7Cn0KCiRmb3JtYXR0ZXIgPSAkdGhpcy0+Z2V0SGVscGVyU2V0KCktPmdldCgnZGVidWdfZm9ybWF0dGVyJyk7CgpyZXR1cm4gZnVuY3Rpb24gKCR0eXBlLCAkYnVmZmVyKSB1c2UgKCRvdXRwdXQsICRwcm9jZXNzLCAkY2FsbGJhY2ssICRmb3JtYXR0ZXIpIHsKJG91dHB1dC0+d3JpdGUoJGZvcm1hdHRlci0+cHJvZ3Jlc3Moc3BsX29iamVjdF9oYXNoKCRwcm9jZXNzKSwgJHRoaXMtPmVzY2FwZVN0cmluZygkYnVmZmVyKSwgUHJvY2Vzczo6RVJSID09PSAkdHlwZSkpOwoKaWYgKG51bGwgIT09ICRjYWxsYmFjaykgewokY2FsbGJhY2soJHR5cGUsICRidWZmZXIpOwp9Cn07Cn0KCnByaXZhdGUgZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHN0cmluZyAkc3RyKTogc3RyaW5nCnsKcmV0dXJuIHN0cl9yZXBsYWNlKCc8JywgJ1xcPCcsICRzdHIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJ3Byb2Nlc3MnOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEN1cnNvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVTZWN0aW9uT3V0cHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXJtaW5hbDsKCgoKCgoKCmZpbmFsIGNsYXNzIFByb2dyZXNzQmFyCnsKcHVibGljIGNvbnN0IEZPUk1BVF9WRVJCT1NFID0gJ3ZlcmJvc2UnOwpwdWJsaWMgY29uc3QgRk9STUFUX1ZFUllfVkVSQk9TRSA9ICd2ZXJ5X3ZlcmJvc2UnOwpwdWJsaWMgY29uc3QgRk9STUFUX0RFQlVHID0gJ2RlYnVnJzsKcHVibGljIGNvbnN0IEZPUk1BVF9OT1JNQUwgPSAnbm9ybWFsJzsKCnByaXZhdGUgY29uc3QgRk9STUFUX1ZFUkJPU0VfTk9NQVggPSAndmVyYm9zZV9ub21heCc7CnByaXZhdGUgY29uc3QgRk9STUFUX1ZFUllfVkVSQk9TRV9OT01BWCA9ICd2ZXJ5X3ZlcmJvc2Vfbm9tYXgnOwpwcml2YXRlIGNvbnN0IEZPUk1BVF9ERUJVR19OT01BWCA9ICdkZWJ1Z19ub21heCc7CnByaXZhdGUgY29uc3QgRk9STUFUX05PUk1BTF9OT01BWCA9ICdub3JtYWxfbm9tYXgnOwoKcHJpdmF0ZSAkYmFyV2lkdGggPSAyODsKcHJpdmF0ZSAkYmFyQ2hhcjsKcHJpdmF0ZSAkZW1wdHlCYXJDaGFyID0gJy0nOwpwcml2YXRlICRwcm9ncmVzc0NoYXIgPSAnPic7CnByaXZhdGUgJGZvcm1hdDsKcHJpdmF0ZSAkaW50ZXJuYWxGb3JtYXQ7CnByaXZhdGUgJHJlZHJhd0ZyZXEgPSAxOwpwcml2YXRlICR3cml0ZUNvdW50Owpwcml2YXRlICRsYXN0V3JpdGVUaW1lOwpwcml2YXRlICRtaW5TZWNvbmRzQmV0d2VlblJlZHJhd3MgPSAwOwpwcml2YXRlICRtYXhTZWNvbmRzQmV0d2VlblJlZHJhd3MgPSAxOwpwcml2YXRlICRvdXRwdXQ7CnByaXZhdGUgJHN0ZXAgPSAwOwpwcml2YXRlICRtYXg7CnByaXZhdGUgJHN0YXJ0VGltZTsKcHJpdmF0ZSAkc3RlcFdpZHRoOwpwcml2YXRlICRwZXJjZW50ID0gMC4wOwpwcml2YXRlICRtZXNzYWdlcyA9IFtdOwpwcml2YXRlICRvdmVyd3JpdGUgPSB0cnVlOwpwcml2YXRlICR0ZXJtaW5hbDsKcHJpdmF0ZSAkcHJldmlvdXNNZXNzYWdlOwpwcml2YXRlICRjdXJzb3I7Cgpwcml2YXRlIHN0YXRpYyAkZm9ybWF0dGVyczsKcHJpdmF0ZSBzdGF0aWMgJGZvcm1hdHM7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIGludCAkbWF4ID0gMCwgZmxvYXQgJG1pblNlY29uZHNCZXR3ZWVuUmVkcmF3cyA9IDEgLyAyNSkKewppZiAoJG91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKJG91dHB1dCA9ICRvdXRwdXQtPmdldEVycm9yT3V0cHV0KCk7Cn0KCiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0OwokdGhpcy0+c2V0TWF4U3RlcHMoJG1heCk7CiR0aGlzLT50ZXJtaW5hbCA9IG5ldyBUZXJtaW5hbCgpOwoKaWYgKDAgPCAkbWluU2Vjb25kc0JldHdlZW5SZWRyYXdzKSB7CiR0aGlzLT5yZWRyYXdGcmVxID0gbnVsbDsKJHRoaXMtPm1pblNlY29uZHNCZXR3ZWVuUmVkcmF3cyA9ICRtaW5TZWNvbmRzQmV0d2VlblJlZHJhd3M7Cn0KCmlmICghJHRoaXMtPm91dHB1dC0+aXNEZWNvcmF0ZWQoKSkgewoKJHRoaXMtPm92ZXJ3cml0ZSA9IGZhbHNlOwoKCiR0aGlzLT5yZWRyYXdGcmVxID0gbnVsbDsKfQoKJHRoaXMtPnN0YXJ0VGltZSA9IHRpbWUoKTsKJHRoaXMtPmN1cnNvciA9IG5ldyBDdXJzb3IoJG91dHB1dCk7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRQbGFjZWhvbGRlckZvcm1hdHRlckRlZmluaXRpb24oc3RyaW5nICRuYW1lLCBjYWxsYWJsZSAkY2FsbGFibGUpOiB2b2lkCnsKaWYgKCFzZWxmOjokZm9ybWF0dGVycykgewpzZWxmOjokZm9ybWF0dGVycyA9IHNlbGY6OmluaXRQbGFjZWhvbGRlckZvcm1hdHRlcnMoKTsKfQoKc2VsZjo6JGZvcm1hdHRlcnNbJG5hbWVdID0gJGNhbGxhYmxlOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGxhY2Vob2xkZXJGb3JtYXR0ZXJEZWZpbml0aW9uKHN0cmluZyAkbmFtZSk6ID9jYWxsYWJsZQp7CmlmICghc2VsZjo6JGZvcm1hdHRlcnMpIHsKc2VsZjo6JGZvcm1hdHRlcnMgPSBzZWxmOjppbml0UGxhY2Vob2xkZXJGb3JtYXR0ZXJzKCk7Cn0KCnJldHVybiBzZWxmOjokZm9ybWF0dGVyc1skbmFtZV0gPz8gbnVsbDsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldEZvcm1hdERlZmluaXRpb24oc3RyaW5nICRuYW1lLCBzdHJpbmcgJGZvcm1hdCk6IHZvaWQKewppZiAoIXNlbGY6OiRmb3JtYXRzKSB7CnNlbGY6OiRmb3JtYXRzID0gc2VsZjo6aW5pdEZvcm1hdHMoKTsKfQoKc2VsZjo6JGZvcm1hdHNbJG5hbWVdID0gJGZvcm1hdDsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZvcm1hdERlZmluaXRpb24oc3RyaW5nICRuYW1lKTogP3N0cmluZwp7CmlmICghc2VsZjo6JGZvcm1hdHMpIHsKc2VsZjo6JGZvcm1hdHMgPSBzZWxmOjppbml0Rm9ybWF0cygpOwp9CgpyZXR1cm4gc2VsZjo6JGZvcm1hdHNbJG5hbWVdID8/IG51bGw7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TWVzc2FnZShzdHJpbmcgJG1lc3NhZ2UsIHN0cmluZyAkbmFtZSA9ICdtZXNzYWdlJykKewokdGhpcy0+bWVzc2FnZXNbJG5hbWVdID0gJG1lc3NhZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNZXNzYWdlKHN0cmluZyAkbmFtZSA9ICdtZXNzYWdlJykKewpyZXR1cm4gJHRoaXMtPm1lc3NhZ2VzWyRuYW1lXSA/PyBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhcnRUaW1lKCk6IGludAp7CnJldHVybiAkdGhpcy0+c3RhcnRUaW1lOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWF4U3RlcHMoKTogaW50CnsKcmV0dXJuICR0aGlzLT5tYXg7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9ncmVzcygpOiBpbnQKewpyZXR1cm4gJHRoaXMtPnN0ZXA7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0U3RlcFdpZHRoKCk6IGludAp7CnJldHVybiAkdGhpcy0+c3RlcFdpZHRoOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NQZXJjZW50KCk6IGZsb2F0CnsKcmV0dXJuICR0aGlzLT5wZXJjZW50Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QmFyT2Zmc2V0KCk6IGZsb2F0CnsKcmV0dXJuIGZsb29yKCR0aGlzLT5tYXggPyAkdGhpcy0+cGVyY2VudCAqICR0aGlzLT5iYXJXaWR0aCA6IChudWxsID09PSAkdGhpcy0+cmVkcmF3RnJlcSA/IChpbnQpIChtaW4oNSwgJHRoaXMtPmJhcldpZHRoIC8gMTUpICogJHRoaXMtPndyaXRlQ291bnQpIDogJHRoaXMtPnN0ZXApICUgJHRoaXMtPmJhcldpZHRoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEVzdGltYXRlZCgpOiBmbG9hdAp7CmlmICghJHRoaXMtPnN0ZXApIHsKcmV0dXJuIDA7Cn0KCnJldHVybiByb3VuZCgodGltZSgpIC0gJHRoaXMtPnN0YXJ0VGltZSkgLyAkdGhpcy0+c3RlcCAqICR0aGlzLT5tYXgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVtYWluaW5nKCk6IGZsb2F0CnsKaWYgKCEkdGhpcy0+c3RlcCkgewpyZXR1cm4gMDsKfQoKcmV0dXJuIHJvdW5kKCh0aW1lKCkgLSAkdGhpcy0+c3RhcnRUaW1lKSAvICR0aGlzLT5zdGVwICogKCR0aGlzLT5tYXggLSAkdGhpcy0+c3RlcCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QmFyV2lkdGgoaW50ICRzaXplKQp7CiR0aGlzLT5iYXJXaWR0aCA9IG1heCgxLCAkc2l6ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRCYXJXaWR0aCgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmJhcldpZHRoOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QmFyQ2hhcmFjdGVyKHN0cmluZyAkY2hhcikKewokdGhpcy0+YmFyQ2hhciA9ICRjaGFyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QmFyQ2hhcmFjdGVyKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+YmFyQ2hhciA/PyAoJHRoaXMtPm1heCA/ICc9JyA6ICR0aGlzLT5lbXB0eUJhckNoYXIpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RW1wdHlCYXJDaGFyYWN0ZXIoc3RyaW5nICRjaGFyKQp7CiR0aGlzLT5lbXB0eUJhckNoYXIgPSAkY2hhcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEVtcHR5QmFyQ2hhcmFjdGVyKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZW1wdHlCYXJDaGFyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJvZ3Jlc3NDaGFyYWN0ZXIoc3RyaW5nICRjaGFyKQp7CiR0aGlzLT5wcm9ncmVzc0NoYXIgPSAkY2hhcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByb2dyZXNzQ2hhcmFjdGVyKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cHJvZ3Jlc3NDaGFyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0Rm9ybWF0KHN0cmluZyAkZm9ybWF0KQp7CiR0aGlzLT5mb3JtYXQgPSBudWxsOwokdGhpcy0+aW50ZXJuYWxGb3JtYXQgPSAkZm9ybWF0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZWRyYXdGcmVxdWVuY3koP2ludCAkZnJlcSkKewokdGhpcy0+cmVkcmF3RnJlcSA9IG51bGwgIT09ICRmcmVxID8gbWF4KDEsICRmcmVxKSA6IG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBtaW5TZWNvbmRzQmV0d2VlblJlZHJhd3MoZmxvYXQgJHNlY29uZHMpOiB2b2lkCnsKJHRoaXMtPm1pblNlY29uZHNCZXR3ZWVuUmVkcmF3cyA9ICRzZWNvbmRzOwp9CgpwdWJsaWMgZnVuY3Rpb24gbWF4U2Vjb25kc0JldHdlZW5SZWRyYXdzKGZsb2F0ICRzZWNvbmRzKTogdm9pZAp7CiR0aGlzLT5tYXhTZWNvbmRzQmV0d2VlblJlZHJhd3MgPSAkc2Vjb25kczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXRlcmF0ZShpdGVyYWJsZSAkaXRlcmFibGUsID9pbnQgJG1heCA9IG51bGwpOiBpdGVyYWJsZQp7CiR0aGlzLT5zdGFydCgkbWF4ID8/IChpc19jb3VudGFibGUoJGl0ZXJhYmxlKSA/IFxjb3VudCgkaXRlcmFibGUpIDogMCkpOwoKZm9yZWFjaCAoJGl0ZXJhYmxlIGFzICRrZXkgPT4gJHZhbHVlKSB7CnlpZWxkICRrZXkgPT4gJHZhbHVlOwoKJHRoaXMtPmFkdmFuY2UoKTsKfQoKJHRoaXMtPmZpbmlzaCgpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdGFydCg/aW50ICRtYXggPSBudWxsKQp7CiR0aGlzLT5zdGFydFRpbWUgPSB0aW1lKCk7CiR0aGlzLT5zdGVwID0gMDsKJHRoaXMtPnBlcmNlbnQgPSAwLjA7CgppZiAobnVsbCAhPT0gJG1heCkgewokdGhpcy0+c2V0TWF4U3RlcHMoJG1heCk7Cn0KCiR0aGlzLT5kaXNwbGF5KCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkdmFuY2UoaW50ICRzdGVwID0gMSkKewokdGhpcy0+c2V0UHJvZ3Jlc3MoJHRoaXMtPnN0ZXAgKyAkc3RlcCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPdmVyd3JpdGUoYm9vbCAkb3ZlcndyaXRlKQp7CiR0aGlzLT5vdmVyd3JpdGUgPSAkb3ZlcndyaXRlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJvZ3Jlc3MoaW50ICRzdGVwKQp7CmlmICgkdGhpcy0+bWF4ICYmICRzdGVwID4gJHRoaXMtPm1heCkgewokdGhpcy0+bWF4ID0gJHN0ZXA7Cn0gZWxzZWlmICgkc3RlcCA8IDApIHsKJHN0ZXAgPSAwOwp9CgokcmVkcmF3RnJlcSA9ICR0aGlzLT5yZWRyYXdGcmVxID8/ICgoJHRoaXMtPm1heCA/OiAxMCkgLyAxMCk7CiRwcmV2UGVyaW9kID0gKGludCkgKCR0aGlzLT5zdGVwIC8gJHJlZHJhd0ZyZXEpOwokY3VyclBlcmlvZCA9IChpbnQpICgkc3RlcCAvICRyZWRyYXdGcmVxKTsKJHRoaXMtPnN0ZXAgPSAkc3RlcDsKJHRoaXMtPnBlcmNlbnQgPSAkdGhpcy0+bWF4ID8gKGZsb2F0KSAkdGhpcy0+c3RlcCAvICR0aGlzLT5tYXggOiAwOwokdGltZUludGVydmFsID0gbWljcm90aW1lKHRydWUpIC0gJHRoaXMtPmxhc3RXcml0ZVRpbWU7CgoKaWYgKCR0aGlzLT5tYXggPT09ICRzdGVwKSB7CiR0aGlzLT5kaXNwbGF5KCk7CgpyZXR1cm47Cn0KCgppZiAoJHRpbWVJbnRlcnZhbCA8ICR0aGlzLT5taW5TZWNvbmRzQmV0d2VlblJlZHJhd3MpIHsKcmV0dXJuOwp9CgoKaWYgKCRwcmV2UGVyaW9kICE9PSAkY3VyclBlcmlvZCB8fCAkdGltZUludGVydmFsID49ICR0aGlzLT5tYXhTZWNvbmRzQmV0d2VlblJlZHJhd3MpIHsKJHRoaXMtPmRpc3BsYXkoKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0TWF4U3RlcHMoaW50ICRtYXgpCnsKJHRoaXMtPmZvcm1hdCA9IG51bGw7CiR0aGlzLT5tYXggPSBtYXgoMCwgJG1heCk7CiR0aGlzLT5zdGVwV2lkdGggPSAkdGhpcy0+bWF4ID8gSGVscGVyOjp3aWR0aCgoc3RyaW5nKSAkdGhpcy0+bWF4KSA6IDQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5pc2goKTogdm9pZAp7CmlmICghJHRoaXMtPm1heCkgewokdGhpcy0+bWF4ID0gJHRoaXMtPnN0ZXA7Cn0KCmlmICgkdGhpcy0+c3RlcCA9PT0gJHRoaXMtPm1heCAmJiAhJHRoaXMtPm92ZXJ3cml0ZSkgewoKcmV0dXJuOwp9CgokdGhpcy0+c2V0UHJvZ3Jlc3MoJHRoaXMtPm1heCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXNwbGF5KCk6IHZvaWQKewppZiAoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQgPT09ICR0aGlzLT5vdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CnJldHVybjsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5mb3JtYXQpIHsKJHRoaXMtPnNldFJlYWxGb3JtYXQoJHRoaXMtPmludGVybmFsRm9ybWF0ID86ICR0aGlzLT5kZXRlcm1pbmVCZXN0Rm9ybWF0KCkpOwp9CgokdGhpcy0+b3ZlcndyaXRlKCR0aGlzLT5idWlsZExpbmUoKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKTogdm9pZAp7CmlmICghJHRoaXMtPm92ZXJ3cml0ZSkgewpyZXR1cm47Cn0KCmlmIChudWxsID09PSAkdGhpcy0+Zm9ybWF0KSB7CiR0aGlzLT5zZXRSZWFsRm9ybWF0KCR0aGlzLT5pbnRlcm5hbEZvcm1hdCA/OiAkdGhpcy0+ZGV0ZXJtaW5lQmVzdEZvcm1hdCgpKTsKfQoKJHRoaXMtPm92ZXJ3cml0ZSgnJyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2V0UmVhbEZvcm1hdChzdHJpbmcgJGZvcm1hdCkKewoKaWYgKCEkdGhpcy0+bWF4ICYmIG51bGwgIT09IHNlbGY6OmdldEZvcm1hdERlZmluaXRpb24oJGZvcm1hdC4nX25vbWF4JykpIHsKJHRoaXMtPmZvcm1hdCA9IHNlbGY6OmdldEZvcm1hdERlZmluaXRpb24oJGZvcm1hdC4nX25vbWF4Jyk7Cn0gZWxzZWlmIChudWxsICE9PSBzZWxmOjpnZXRGb3JtYXREZWZpbml0aW9uKCRmb3JtYXQpKSB7CiR0aGlzLT5mb3JtYXQgPSBzZWxmOjpnZXRGb3JtYXREZWZpbml0aW9uKCRmb3JtYXQpOwp9IGVsc2UgewokdGhpcy0+Zm9ybWF0ID0gJGZvcm1hdDsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG92ZXJ3cml0ZShzdHJpbmcgJG1lc3NhZ2UpOiB2b2lkCnsKaWYgKCR0aGlzLT5wcmV2aW91c01lc3NhZ2UgPT09ICRtZXNzYWdlKSB7CnJldHVybjsKfQoKJG9yaWdpbmFsTWVzc2FnZSA9ICRtZXNzYWdlOwoKaWYgKCR0aGlzLT5vdmVyd3JpdGUpIHsKaWYgKG51bGwgIT09ICR0aGlzLT5wcmV2aW91c01lc3NhZ2UpIHsKaWYgKCR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlU2VjdGlvbk91dHB1dCkgewokbWVzc2FnZUxpbmVzID0gZXhwbG9kZSgiXG4iLCAkdGhpcy0+cHJldmlvdXNNZXNzYWdlKTsKJGxpbmVDb3VudCA9IFxjb3VudCgkbWVzc2FnZUxpbmVzKTsKZm9yZWFjaCAoJG1lc3NhZ2VMaW5lcyBhcyAkbWVzc2FnZUxpbmUpIHsKJG1lc3NhZ2VMaW5lTGVuZ3RoID0gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCksICRtZXNzYWdlTGluZSkpOwppZiAoJG1lc3NhZ2VMaW5lTGVuZ3RoID4gJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpKSB7CiRsaW5lQ291bnQgKz0gZmxvb3IoJG1lc3NhZ2VMaW5lTGVuZ3RoIC8gJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpKTsKfQp9CiR0aGlzLT5vdXRwdXQtPmNsZWFyKCRsaW5lQ291bnQpOwp9IGVsc2UgewokbGluZUNvdW50ID0gc3Vic3RyX2NvdW50KCR0aGlzLT5wcmV2aW91c01lc3NhZ2UsICJcbiIpOwpmb3IgKCRpID0gMDsgJGkgPCAkbGluZUNvdW50OyArKyRpKSB7CiR0aGlzLT5jdXJzb3ItPm1vdmVUb0NvbHVtbigxKTsKJHRoaXMtPmN1cnNvci0+Y2xlYXJMaW5lKCk7CiR0aGlzLT5jdXJzb3ItPm1vdmVVcCgpOwp9CgokdGhpcy0+Y3Vyc29yLT5tb3ZlVG9Db2x1bW4oMSk7CiR0aGlzLT5jdXJzb3ItPmNsZWFyTGluZSgpOwp9Cn0KfSBlbHNlaWYgKCR0aGlzLT5zdGVwID4gMCkgewokbWVzc2FnZSA9IFxQSFBfRU9MLiRtZXNzYWdlOwp9CgokdGhpcy0+cHJldmlvdXNNZXNzYWdlID0gJG9yaWdpbmFsTWVzc2FnZTsKJHRoaXMtPmxhc3RXcml0ZVRpbWUgPSBtaWNyb3RpbWUodHJ1ZSk7CgokdGhpcy0+b3V0cHV0LT53cml0ZSgkbWVzc2FnZSk7CisrJHRoaXMtPndyaXRlQ291bnQ7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZGV0ZXJtaW5lQmVzdEZvcm1hdCgpOiBzdHJpbmcKewpzd2l0Y2ggKCR0aGlzLT5vdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CgpjYXNlIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0U6CnJldHVybiAkdGhpcy0+bWF4ID8gc2VsZjo6Rk9STUFUX1ZFUkJPU0UgOiBzZWxmOjpGT1JNQVRfVkVSQk9TRV9OT01BWDsKY2FzZSBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0U6CnJldHVybiAkdGhpcy0+bWF4ID8gc2VsZjo6Rk9STUFUX1ZFUllfVkVSQk9TRSA6IHNlbGY6OkZPUk1BVF9WRVJZX1ZFUkJPU0VfTk9NQVg7CmNhc2UgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfREVCVUc6CnJldHVybiAkdGhpcy0+bWF4ID8gc2VsZjo6Rk9STUFUX0RFQlVHIDogc2VsZjo6Rk9STUFUX0RFQlVHX05PTUFYOwpkZWZhdWx0OgpyZXR1cm4gJHRoaXMtPm1heCA/IHNlbGY6OkZPUk1BVF9OT1JNQUwgOiBzZWxmOjpGT1JNQVRfTk9STUFMX05PTUFYOwp9Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluaXRQbGFjZWhvbGRlckZvcm1hdHRlcnMoKTogYXJyYXkKewpyZXR1cm4gWwonYmFyJyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyLCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkgewokY29tcGxldGVCYXJzID0gJGJhci0+Z2V0QmFyT2Zmc2V0KCk7CiRkaXNwbGF5ID0gc3RyX3JlcGVhdCgkYmFyLT5nZXRCYXJDaGFyYWN0ZXIoKSwgJGNvbXBsZXRlQmFycyk7CmlmICgkY29tcGxldGVCYXJzIDwgJGJhci0+Z2V0QmFyV2lkdGgoKSkgewokZW1wdHlCYXJzID0gJGJhci0+Z2V0QmFyV2lkdGgoKSAtICRjb21wbGV0ZUJhcnMgLSBIZWxwZXI6Omxlbmd0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJG91dHB1dC0+Z2V0Rm9ybWF0dGVyKCksICRiYXItPmdldFByb2dyZXNzQ2hhcmFjdGVyKCkpKTsKJGRpc3BsYXkgLj0gJGJhci0+Z2V0UHJvZ3Jlc3NDaGFyYWN0ZXIoKS5zdHJfcmVwZWF0KCRiYXItPmdldEVtcHR5QmFyQ2hhcmFjdGVyKCksICRlbXB0eUJhcnMpOwp9CgpyZXR1cm4gJGRpc3BsYXk7Cn0sCidlbGFwc2VkJyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyKSB7CnJldHVybiBIZWxwZXI6OmZvcm1hdFRpbWUodGltZSgpIC0gJGJhci0+Z2V0U3RhcnRUaW1lKCkpOwp9LAoncmVtYWluaW5nJyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyKSB7CmlmICghJGJhci0+Z2V0TWF4U3RlcHMoKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1VuYWJsZSB0byBkaXNwbGF5IHRoZSByZW1haW5pbmcgdGltZSBpZiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RlcHMgaXMgbm90IHNldC4nKTsKfQoKcmV0dXJuIEhlbHBlcjo6Zm9ybWF0VGltZSgkYmFyLT5nZXRSZW1haW5pbmcoKSk7Cn0sCidlc3RpbWF0ZWQnID0+IGZ1bmN0aW9uIChzZWxmICRiYXIpIHsKaWYgKCEkYmFyLT5nZXRNYXhTdGVwcygpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignVW5hYmxlIHRvIGRpc3BsYXkgdGhlIGVzdGltYXRlZCB0aW1lIGlmIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGVwcyBpcyBub3Qgc2V0LicpOwp9CgpyZXR1cm4gSGVscGVyOjpmb3JtYXRUaW1lKCRiYXItPmdldEVzdGltYXRlZCgpKTsKfSwKJ21lbW9yeScgPT4gZnVuY3Rpb24gKHNlbGYgJGJhcikgewpyZXR1cm4gSGVscGVyOjpmb3JtYXRNZW1vcnkobWVtb3J5X2dldF91c2FnZSh0cnVlKSk7Cn0sCidjdXJyZW50JyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyKSB7CnJldHVybiBzdHJfcGFkKCRiYXItPmdldFByb2dyZXNzKCksICRiYXItPmdldFN0ZXBXaWR0aCgpLCAnICcsIFxTVFJfUEFEX0xFRlQpOwp9LAonbWF4JyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyKSB7CnJldHVybiAkYmFyLT5nZXRNYXhTdGVwcygpOwp9LAoncGVyY2VudCcgPT4gZnVuY3Rpb24gKHNlbGYgJGJhcikgewpyZXR1cm4gZmxvb3IoJGJhci0+Z2V0UHJvZ3Jlc3NQZXJjZW50KCkgKiAxMDApOwp9LApdOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0Rm9ybWF0cygpOiBhcnJheQp7CnJldHVybiBbCnNlbGY6OkZPUk1BVF9OT1JNQUwgPT4gJyAlY3VycmVudCUvJW1heCUgWyViYXIlXSAlcGVyY2VudDozcyUlJywKc2VsZjo6Rk9STUFUX05PUk1BTF9OT01BWCA9PiAnICVjdXJyZW50JSBbJWJhciVdJywKCnNlbGY6OkZPUk1BVF9WRVJCT1NFID0+ICcgJWN1cnJlbnQlLyVtYXglIFslYmFyJV0gJXBlcmNlbnQ6M3MlJSAlZWxhcHNlZDo2cyUnLApzZWxmOjpGT1JNQVRfVkVSQk9TRV9OT01BWCA9PiAnICVjdXJyZW50JSBbJWJhciVdICVlbGFwc2VkOjZzJScsCgpzZWxmOjpGT1JNQVRfVkVSWV9WRVJCT1NFID0+ICcgJWN1cnJlbnQlLyVtYXglIFslYmFyJV0gJXBlcmNlbnQ6M3MlJSAlZWxhcHNlZDo2cyUvJWVzdGltYXRlZDotNnMlJywKc2VsZjo6Rk9STUFUX1ZFUllfVkVSQk9TRV9OT01BWCA9PiAnICVjdXJyZW50JSBbJWJhciVdICVlbGFwc2VkOjZzJScsCgpzZWxmOjpGT1JNQVRfREVCVUcgPT4gJyAlY3VycmVudCUvJW1heCUgWyViYXIlXSAlcGVyY2VudDozcyUlICVlbGFwc2VkOjZzJS8lZXN0aW1hdGVkOi02cyUgJW1lbW9yeTo2cyUnLApzZWxmOjpGT1JNQVRfREVCVUdfTk9NQVggPT4gJyAlY3VycmVudCUgWyViYXIlXSAlZWxhcHNlZDo2cyUgJW1lbW9yeTo2cyUnLApdOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkTGluZSgpOiBzdHJpbmcKewokcmVnZXggPSAieyUoW2EtelwtX10rKSg/Olw6KFteJV0rKSk/JX1pIjsKJGNhbGxiYWNrID0gZnVuY3Rpb24gKCRtYXRjaGVzKSB7CmlmICgkZm9ybWF0dGVyID0gJHRoaXM6OmdldFBsYWNlaG9sZGVyRm9ybWF0dGVyRGVmaW5pdGlvbigkbWF0Y2hlc1sxXSkpIHsKJHRleHQgPSAkZm9ybWF0dGVyKCR0aGlzLCAkdGhpcy0+b3V0cHV0KTsKfSBlbHNlaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlc1skbWF0Y2hlc1sxXV0pKSB7CiR0ZXh0ID0gJHRoaXMtPm1lc3NhZ2VzWyRtYXRjaGVzWzFdXTsKfSBlbHNlIHsKcmV0dXJuICRtYXRjaGVzWzBdOwp9CgppZiAoaXNzZXQoJG1hdGNoZXNbMl0pKSB7CiR0ZXh0ID0gc3ByaW50ZignJScuJG1hdGNoZXNbMl0sICR0ZXh0KTsKfQoKcmV0dXJuICR0ZXh0Owp9OwokbGluZSA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygkcmVnZXgsICRjYWxsYmFjaywgJHRoaXMtPmZvcm1hdCk7CgoKJGxpbmVzTGVuZ3RoID0gYXJyYXlfbWFwKGZ1bmN0aW9uICgkc3ViTGluZSkgewpyZXR1cm4gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCksIHJ0cmltKCRzdWJMaW5lLCAiXHIiKSkpOwp9LCBleHBsb2RlKCJcbiIsICRsaW5lKSk7CgokbGluZXNXaWR0aCA9IG1heCgkbGluZXNMZW5ndGgpOwoKJHRlcm1pbmFsV2lkdGggPSAkdGhpcy0+dGVybWluYWwtPmdldFdpZHRoKCk7CmlmICgkbGluZXNXaWR0aCA8PSAkdGVybWluYWxXaWR0aCkgewpyZXR1cm4gJGxpbmU7Cn0KCiR0aGlzLT5zZXRCYXJXaWR0aCgkdGhpcy0+YmFyV2lkdGggLSAkbGluZXNXaWR0aCArICR0ZXJtaW5hbFdpZHRoKTsKCnJldHVybiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJHJlZ2V4LCAkY2FsbGJhY2ssICR0aGlzLT5mb3JtYXQpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIFByb2dyZXNzSW5kaWNhdG9yCnsKcHJpdmF0ZSBjb25zdCBGT1JNQVRTID0gWwonbm9ybWFsJyA9PiAnICVpbmRpY2F0b3IlICVtZXNzYWdlJScsCidub3JtYWxfbm9fYW5zaScgPT4gJyAlbWVzc2FnZSUnLAoKJ3ZlcmJvc2UnID0+ICcgJWluZGljYXRvciUgJW1lc3NhZ2UlICglZWxhcHNlZDo2cyUpJywKJ3ZlcmJvc2Vfbm9fYW5zaScgPT4gJyAlbWVzc2FnZSUgKCVlbGFwc2VkOjZzJSknLAoKJ3ZlcnlfdmVyYm9zZScgPT4gJyAlaW5kaWNhdG9yJSAlbWVzc2FnZSUgKCVlbGFwc2VkOjZzJSwgJW1lbW9yeTo2cyUpJywKJ3ZlcnlfdmVyYm9zZV9ub19hbnNpJyA9PiAnICVtZXNzYWdlJSAoJWVsYXBzZWQ6NnMlLCAlbWVtb3J5OjZzJSknLApdOwoKcHJpdmF0ZSAkb3V0cHV0Owpwcml2YXRlICRzdGFydFRpbWU7CnByaXZhdGUgJGZvcm1hdDsKcHJpdmF0ZSAkbWVzc2FnZTsKcHJpdmF0ZSAkaW5kaWNhdG9yVmFsdWVzOwpwcml2YXRlICRpbmRpY2F0b3JDdXJyZW50Owpwcml2YXRlICRpbmRpY2F0b3JDaGFuZ2VJbnRlcnZhbDsKcHJpdmF0ZSAkaW5kaWNhdG9yVXBkYXRlVGltZTsKcHJpdmF0ZSAkc3RhcnRlZCA9IGZhbHNlOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJGZvcm1hdHRlcnM7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCA/c3RyaW5nICRmb3JtYXQgPSBudWxsLCBpbnQgJGluZGljYXRvckNoYW5nZUludGVydmFsID0gMTAwLCA/YXJyYXkgJGluZGljYXRvclZhbHVlcyA9IG51bGwpCnsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7CgppZiAobnVsbCA9PT0gJGZvcm1hdCkgewokZm9ybWF0ID0gJHRoaXMtPmRldGVybWluZUJlc3RGb3JtYXQoKTsKfQoKaWYgKG51bGwgPT09ICRpbmRpY2F0b3JWYWx1ZXMpIHsKJGluZGljYXRvclZhbHVlcyA9IFsnLScsICdcXCcsICd8JywgJy8nXTsKfQoKJGluZGljYXRvclZhbHVlcyA9IGFycmF5X3ZhbHVlcygkaW5kaWNhdG9yVmFsdWVzKTsKCmlmICgyID4gXGNvdW50KCRpbmRpY2F0b3JWYWx1ZXMpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ011c3QgaGF2ZSBhdCBsZWFzdCAyIGluZGljYXRvciB2YWx1ZSBjaGFyYWN0ZXJzLicpOwp9CgokdGhpcy0+Zm9ybWF0ID0gc2VsZjo6Z2V0Rm9ybWF0RGVmaW5pdGlvbigkZm9ybWF0KTsKJHRoaXMtPmluZGljYXRvckNoYW5nZUludGVydmFsID0gJGluZGljYXRvckNoYW5nZUludGVydmFsOwokdGhpcy0+aW5kaWNhdG9yVmFsdWVzID0gJGluZGljYXRvclZhbHVlczsKJHRoaXMtPnN0YXJ0VGltZSA9IHRpbWUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE1lc3NhZ2UoP3N0cmluZyAkbWVzc2FnZSkKewokdGhpcy0+bWVzc2FnZSA9ICRtZXNzYWdlOwoKJHRoaXMtPmRpc3BsYXkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHN0YXJ0KHN0cmluZyAkbWVzc2FnZSkKewppZiAoJHRoaXMtPnN0YXJ0ZWQpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdQcm9ncmVzcyBpbmRpY2F0b3IgYWxyZWFkeSBzdGFydGVkLicpOwp9CgokdGhpcy0+bWVzc2FnZSA9ICRtZXNzYWdlOwokdGhpcy0+c3RhcnRlZCA9IHRydWU7CiR0aGlzLT5zdGFydFRpbWUgPSB0aW1lKCk7CiR0aGlzLT5pbmRpY2F0b3JVcGRhdGVUaW1lID0gJHRoaXMtPmdldEN1cnJlbnRUaW1lSW5NaWxsaXNlY29uZHMoKSArICR0aGlzLT5pbmRpY2F0b3JDaGFuZ2VJbnRlcnZhbDsKJHRoaXMtPmluZGljYXRvckN1cnJlbnQgPSAwOwoKJHRoaXMtPmRpc3BsYXkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkdmFuY2UoKQp7CmlmICghJHRoaXMtPnN0YXJ0ZWQpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdQcm9ncmVzcyBpbmRpY2F0b3IgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkLicpOwp9CgppZiAoISR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCkpIHsKcmV0dXJuOwp9CgokY3VycmVudFRpbWUgPSAkdGhpcy0+Z2V0Q3VycmVudFRpbWVJbk1pbGxpc2Vjb25kcygpOwoKaWYgKCRjdXJyZW50VGltZSA8ICR0aGlzLT5pbmRpY2F0b3JVcGRhdGVUaW1lKSB7CnJldHVybjsKfQoKJHRoaXMtPmluZGljYXRvclVwZGF0ZVRpbWUgPSAkY3VycmVudFRpbWUgKyAkdGhpcy0+aW5kaWNhdG9yQ2hhbmdlSW50ZXJ2YWw7CisrJHRoaXMtPmluZGljYXRvckN1cnJlbnQ7CgokdGhpcy0+ZGlzcGxheSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluaXNoKHN0cmluZyAkbWVzc2FnZSkKewppZiAoISR0aGlzLT5zdGFydGVkKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignUHJvZ3Jlc3MgaW5kaWNhdG9yIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZC4nKTsKfQoKJHRoaXMtPm1lc3NhZ2UgPSAkbWVzc2FnZTsKJHRoaXMtPmRpc3BsYXkoKTsKJHRoaXMtPm91dHB1dC0+d3JpdGVsbignJyk7CiR0aGlzLT5zdGFydGVkID0gZmFsc2U7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRGb3JtYXREZWZpbml0aW9uKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gc2VsZjo6Rk9STUFUU1skbmFtZV0gPz8gbnVsbDsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFBsYWNlaG9sZGVyRm9ybWF0dGVyRGVmaW5pdGlvbihzdHJpbmcgJG5hbWUsIGNhbGxhYmxlICRjYWxsYWJsZSkKewppZiAoIXNlbGY6OiRmb3JtYXR0ZXJzKSB7CnNlbGY6OiRmb3JtYXR0ZXJzID0gc2VsZjo6aW5pdFBsYWNlaG9sZGVyRm9ybWF0dGVycygpOwp9CgpzZWxmOjokZm9ybWF0dGVyc1skbmFtZV0gPSAkY2FsbGFibGU7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQbGFjZWhvbGRlckZvcm1hdHRlckRlZmluaXRpb24oc3RyaW5nICRuYW1lKQp7CmlmICghc2VsZjo6JGZvcm1hdHRlcnMpIHsKc2VsZjo6JGZvcm1hdHRlcnMgPSBzZWxmOjppbml0UGxhY2Vob2xkZXJGb3JtYXR0ZXJzKCk7Cn0KCnJldHVybiBzZWxmOjokZm9ybWF0dGVyc1skbmFtZV0gPz8gbnVsbDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBkaXNwbGF5KCkKewppZiAoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQgPT09ICR0aGlzLT5vdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CnJldHVybjsKfQoKJHRoaXMtPm92ZXJ3cml0ZShwcmVnX3JlcGxhY2VfY2FsbGJhY2soInslKFthLXpcLV9dKykoPzpcOihbXiVdKykpPyV9aSIsIGZ1bmN0aW9uICgkbWF0Y2hlcykgewppZiAoJGZvcm1hdHRlciA9IHNlbGY6OmdldFBsYWNlaG9sZGVyRm9ybWF0dGVyRGVmaW5pdGlvbigkbWF0Y2hlc1sxXSkpIHsKcmV0dXJuICRmb3JtYXR0ZXIoJHRoaXMpOwp9CgpyZXR1cm4gJG1hdGNoZXNbMF07Cn0sICR0aGlzLT5mb3JtYXQgPz8gJycpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBkZXRlcm1pbmVCZXN0Rm9ybWF0KCk6IHN0cmluZwp7CnN3aXRjaCAoJHRoaXMtPm91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKCmNhc2UgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRToKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCkgPyAndmVyYm9zZScgOiAndmVyYm9zZV9ub19hbnNpJzsKY2FzZSBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0U6CmNhc2UgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfREVCVUc6CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpID8gJ3ZlcnlfdmVyYm9zZScgOiAndmVyeV92ZXJib3NlX25vX2Fuc2knOwpkZWZhdWx0OgpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNEZWNvcmF0ZWQoKSA/ICdub3JtYWwnIDogJ25vcm1hbF9ub19hbnNpJzsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG92ZXJ3cml0ZShzdHJpbmcgJG1lc3NhZ2UpCnsKaWYgKCR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCkpIHsKJHRoaXMtPm91dHB1dC0+d3JpdGUoIlx4MERceDFCWzJLIik7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCRtZXNzYWdlKTsKfSBlbHNlIHsKJHRoaXMtPm91dHB1dC0+d3JpdGVsbigkbWVzc2FnZSk7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDdXJyZW50VGltZUluTWlsbGlzZWNvbmRzKCk6IGZsb2F0CnsKcmV0dXJuIHJvdW5kKG1pY3JvdGltZSh0cnVlKSAqIDEwMDApOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0UGxhY2Vob2xkZXJGb3JtYXR0ZXJzKCk6IGFycmF5CnsKcmV0dXJuIFsKJ2luZGljYXRvcicgPT4gZnVuY3Rpb24gKHNlbGYgJGluZGljYXRvcikgewpyZXR1cm4gJGluZGljYXRvci0+aW5kaWNhdG9yVmFsdWVzWyRpbmRpY2F0b3ItPmluZGljYXRvckN1cnJlbnQgJSBcY291bnQoJGluZGljYXRvci0+aW5kaWNhdG9yVmFsdWVzKV07Cn0sCidtZXNzYWdlJyA9PiBmdW5jdGlvbiAoc2VsZiAkaW5kaWNhdG9yKSB7CnJldHVybiAkaW5kaWNhdG9yLT5tZXNzYWdlOwp9LAonZWxhcHNlZCcgPT4gZnVuY3Rpb24gKHNlbGYgJGluZGljYXRvcikgewpyZXR1cm4gSGVscGVyOjpmb3JtYXRUaW1lKHRpbWUoKSAtICRpbmRpY2F0b3ItPnN0YXJ0VGltZSk7Cn0sCidtZW1vcnknID0+IGZ1bmN0aW9uICgpIHsKcmV0dXJuIEhlbHBlcjo6Zm9ybWF0TWVtb3J5KG1lbW9yeV9nZXRfdXNhZ2UodHJ1ZSkpOwp9LApdOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEN1cnNvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXE1pc3NpbmdJbnB1dEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJTdHlsZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XFN0cmVhbWFibGVJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlU2VjdGlvbk91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cQ2hvaWNlUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXFF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXJtaW5hbDsKCnVzZSBmdW5jdGlvbiBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcczsKCgoKCgoKY2xhc3MgUXVlc3Rpb25IZWxwZXIgZXh0ZW5kcyBIZWxwZXIKewoKCgpwcml2YXRlICRpbnB1dFN0cmVhbTsKCnByaXZhdGUgc3RhdGljICRzdHR5ID0gdHJ1ZTsKcHJpdmF0ZSBzdGF0aWMgJHN0ZGluSXNJbnRlcmFjdGl2ZTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFF1ZXN0aW9uICRxdWVzdGlvbikKewppZiAoJG91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKJG91dHB1dCA9ICRvdXRwdXQtPmdldEVycm9yT3V0cHV0KCk7Cn0KCmlmICghJGlucHV0LT5pc0ludGVyYWN0aXZlKCkpIHsKcmV0dXJuICR0aGlzLT5nZXREZWZhdWx0QW5zd2VyKCRxdWVzdGlvbik7Cn0KCmlmICgkaW5wdXQgaW5zdGFuY2VvZiBTdHJlYW1hYmxlSW5wdXRJbnRlcmZhY2UgJiYgJHN0cmVhbSA9ICRpbnB1dC0+Z2V0U3RyZWFtKCkpIHsKJHRoaXMtPmlucHV0U3RyZWFtID0gJHN0cmVhbTsKfQoKdHJ5IHsKaWYgKCEkcXVlc3Rpb24tPmdldFZhbGlkYXRvcigpKSB7CnJldHVybiAkdGhpcy0+ZG9Bc2soJG91dHB1dCwgJHF1ZXN0aW9uKTsKfQoKJGludGVydmlld2VyID0gZnVuY3Rpb24gKCkgdXNlICgkb3V0cHV0LCAkcXVlc3Rpb24pIHsKcmV0dXJuICR0aGlzLT5kb0Fzaygkb3V0cHV0LCAkcXVlc3Rpb24pOwp9OwoKcmV0dXJuICR0aGlzLT52YWxpZGF0ZUF0dGVtcHRzKCRpbnRlcnZpZXdlciwgJG91dHB1dCwgJHF1ZXN0aW9uKTsKfSBjYXRjaCAoTWlzc2luZ0lucHV0RXhjZXB0aW9uICRleGNlcHRpb24pIHsKJGlucHV0LT5zZXRJbnRlcmFjdGl2ZShmYWxzZSk7CgppZiAobnVsbCA9PT0gJGZhbGxiYWNrT3V0cHV0ID0gJHRoaXMtPmdldERlZmF1bHRBbnN3ZXIoJHF1ZXN0aW9uKSkgewp0aHJvdyAkZXhjZXB0aW9uOwp9CgpyZXR1cm4gJGZhbGxiYWNrT3V0cHV0Owp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKewpyZXR1cm4gJ3F1ZXN0aW9uJzsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkaXNhYmxlU3R0eSgpCnsKc2VsZjo6JHN0dHkgPSBmYWxzZTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9Bc2soT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFF1ZXN0aW9uICRxdWVzdGlvbikKewokdGhpcy0+d3JpdGVQcm9tcHQoJG91dHB1dCwgJHF1ZXN0aW9uKTsKCiRpbnB1dFN0cmVhbSA9ICR0aGlzLT5pbnB1dFN0cmVhbSA/OiBcU1RESU47CiRhdXRvY29tcGxldGUgPSAkcXVlc3Rpb24tPmdldEF1dG9jb21wbGV0ZXJDYWxsYmFjaygpOwoKaWYgKG51bGwgPT09ICRhdXRvY29tcGxldGUgfHwgIXNlbGY6OiRzdHR5IHx8ICFUZXJtaW5hbDo6aGFzU3R0eUF2YWlsYWJsZSgpKSB7CiRyZXQgPSBmYWxzZTsKaWYgKCRxdWVzdGlvbi0+aXNIaWRkZW4oKSkgewp0cnkgewokaGlkZGVuUmVzcG9uc2UgPSAkdGhpcy0+Z2V0SGlkZGVuUmVzcG9uc2UoJG91dHB1dCwgJGlucHV0U3RyZWFtLCAkcXVlc3Rpb24tPmlzVHJpbW1hYmxlKCkpOwokcmV0ID0gJHF1ZXN0aW9uLT5pc1RyaW1tYWJsZSgpID8gdHJpbSgkaGlkZGVuUmVzcG9uc2UpIDogJGhpZGRlblJlc3BvbnNlOwp9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uICRlKSB7CmlmICghJHF1ZXN0aW9uLT5pc0hpZGRlbkZhbGxiYWNrKCkpIHsKdGhyb3cgJGU7Cn0KfQp9CgppZiAoZmFsc2UgPT09ICRyZXQpIHsKJGlzQmxvY2tlZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCRpbnB1dFN0cmVhbSlbJ2Jsb2NrZWQnXSA/PyB0cnVlOwoKaWYgKCEkaXNCbG9ja2VkKSB7CnN0cmVhbV9zZXRfYmxvY2tpbmcoJGlucHV0U3RyZWFtLCB0cnVlKTsKfQoKJHJldCA9ICR0aGlzLT5yZWFkSW5wdXQoJGlucHV0U3RyZWFtLCAkcXVlc3Rpb24pOwoKaWYgKCEkaXNCbG9ja2VkKSB7CnN0cmVhbV9zZXRfYmxvY2tpbmcoJGlucHV0U3RyZWFtLCBmYWxzZSk7Cn0KCmlmIChmYWxzZSA9PT0gJHJldCkgewp0aHJvdyBuZXcgTWlzc2luZ0lucHV0RXhjZXB0aW9uKCdBYm9ydGVkLicpOwp9CmlmICgkcXVlc3Rpb24tPmlzVHJpbW1hYmxlKCkpIHsKJHJldCA9IHRyaW0oJHJldCk7Cn0KfQp9IGVsc2UgewokYXV0b2NvbXBsZXRlID0gJHRoaXMtPmF1dG9jb21wbGV0ZSgkb3V0cHV0LCAkcXVlc3Rpb24sICRpbnB1dFN0cmVhbSwgJGF1dG9jb21wbGV0ZSk7CiRyZXQgPSAkcXVlc3Rpb24tPmlzVHJpbW1hYmxlKCkgPyB0cmltKCRhdXRvY29tcGxldGUpIDogJGF1dG9jb21wbGV0ZTsKfQoKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlU2VjdGlvbk91dHB1dCkgewokb3V0cHV0LT5hZGRDb250ZW50KCRyZXQpOwp9CgokcmV0ID0gXHN0cmxlbigkcmV0KSA+IDAgPyAkcmV0IDogJHF1ZXN0aW9uLT5nZXREZWZhdWx0KCk7CgppZiAoJG5vcm1hbGl6ZXIgPSAkcXVlc3Rpb24tPmdldE5vcm1hbGl6ZXIoKSkgewpyZXR1cm4gJG5vcm1hbGl6ZXIoJHJldCk7Cn0KCnJldHVybiAkcmV0Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldERlZmF1bHRBbnN3ZXIoUXVlc3Rpb24gJHF1ZXN0aW9uKQp7CiRkZWZhdWx0ID0gJHF1ZXN0aW9uLT5nZXREZWZhdWx0KCk7CgppZiAobnVsbCA9PT0gJGRlZmF1bHQpIHsKcmV0dXJuICRkZWZhdWx0Owp9CgppZiAoJHZhbGlkYXRvciA9ICRxdWVzdGlvbi0+Z2V0VmFsaWRhdG9yKCkpIHsKcmV0dXJuIFxjYWxsX3VzZXJfZnVuYygkcXVlc3Rpb24tPmdldFZhbGlkYXRvcigpLCAkZGVmYXVsdCk7Cn0gZWxzZWlmICgkcXVlc3Rpb24gaW5zdGFuY2VvZiBDaG9pY2VRdWVzdGlvbikgewokY2hvaWNlcyA9ICRxdWVzdGlvbi0+Z2V0Q2hvaWNlcygpOwoKaWYgKCEkcXVlc3Rpb24tPmlzTXVsdGlzZWxlY3QoKSkgewpyZXR1cm4gJGNob2ljZXNbJGRlZmF1bHRdID8/ICRkZWZhdWx0Owp9CgokZGVmYXVsdCA9IGV4cGxvZGUoJywnLCAkZGVmYXVsdCk7CmZvcmVhY2ggKCRkZWZhdWx0IGFzICRrID0+ICR2KSB7CiR2ID0gJHF1ZXN0aW9uLT5pc1RyaW1tYWJsZSgpID8gdHJpbSgkdikgOiAkdjsKJGRlZmF1bHRbJGtdID0gJGNob2ljZXNbJHZdID8/ICR2Owp9Cn0KCnJldHVybiAkZGVmYXVsdDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHdyaXRlUHJvbXB0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBRdWVzdGlvbiAkcXVlc3Rpb24pCnsKJG1lc3NhZ2UgPSAkcXVlc3Rpb24tPmdldFF1ZXN0aW9uKCk7CgppZiAoJHF1ZXN0aW9uIGluc3RhbmNlb2YgQ2hvaWNlUXVlc3Rpb24pIHsKJG91dHB1dC0+d3JpdGVsbihhcnJheV9tZXJnZShbCiRxdWVzdGlvbi0+Z2V0UXVlc3Rpb24oKSwKXSwgJHRoaXMtPmZvcm1hdENob2ljZVF1ZXN0aW9uQ2hvaWNlcygkcXVlc3Rpb24sICdpbmZvJykpKTsKCiRtZXNzYWdlID0gJHF1ZXN0aW9uLT5nZXRQcm9tcHQoKTsKfQoKJG91dHB1dC0+d3JpdGUoJG1lc3NhZ2UpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZm9ybWF0Q2hvaWNlUXVlc3Rpb25DaG9pY2VzKENob2ljZVF1ZXN0aW9uICRxdWVzdGlvbiwgc3RyaW5nICR0YWcpCnsKJG1lc3NhZ2VzID0gW107CgokbWF4V2lkdGggPSBtYXgoYXJyYXlfbWFwKFtfX0NMQVNTX18sICd3aWR0aCddLCBhcnJheV9rZXlzKCRjaG9pY2VzID0gJHF1ZXN0aW9uLT5nZXRDaG9pY2VzKCkpKSk7Cgpmb3JlYWNoICgkY2hvaWNlcyBhcyAka2V5ID0+ICR2YWx1ZSkgewokcGFkZGluZyA9IHN0cl9yZXBlYXQoJyAnLCAkbWF4V2lkdGggLSBzZWxmOjp3aWR0aCgka2V5KSk7CgokbWVzc2FnZXNbXSA9IHNwcmludGYoIiAgWzwkdGFnPiVzJHBhZGRpbmc8LyR0YWc+XSAlcyIsICRrZXksICR2YWx1ZSk7Cn0KCnJldHVybiAkbWVzc2FnZXM7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB3cml0ZUVycm9yKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBcRXhjZXB0aW9uICRlcnJvcikKewppZiAobnVsbCAhPT0gJHRoaXMtPmdldEhlbHBlclNldCgpICYmICR0aGlzLT5nZXRIZWxwZXJTZXQoKS0+aGFzKCdmb3JtYXR0ZXInKSkgewokbWVzc2FnZSA9ICR0aGlzLT5nZXRIZWxwZXJTZXQoKS0+Z2V0KCdmb3JtYXR0ZXInKS0+Zm9ybWF0QmxvY2soJGVycm9yLT5nZXRNZXNzYWdlKCksICdlcnJvcicpOwp9IGVsc2UgewokbWVzc2FnZSA9ICc8ZXJyb3I+Jy4kZXJyb3ItPmdldE1lc3NhZ2UoKS4nPC9lcnJvcj4nOwp9Cgokb3V0cHV0LT53cml0ZWxuKCRtZXNzYWdlKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGF1dG9jb21wbGV0ZShPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgUXVlc3Rpb24gJHF1ZXN0aW9uLCAkaW5wdXRTdHJlYW0sIGNhbGxhYmxlICRhdXRvY29tcGxldGUpOiBzdHJpbmcKewokY3Vyc29yID0gbmV3IEN1cnNvcigkb3V0cHV0LCAkaW5wdXRTdHJlYW0pOwoKJGZ1bGxDaG9pY2UgPSAnJzsKJHJldCA9ICcnOwoKJGkgPSAwOwokb2ZzID0gLTE7CiRtYXRjaGVzID0gJGF1dG9jb21wbGV0ZSgkcmV0KTsKJG51bU1hdGNoZXMgPSBcY291bnQoJG1hdGNoZXMpOwoKJHN0dHlNb2RlID0gc2hlbGxfZXhlYygnc3R0eSAtZycpOwokaXNTdGRpbiA9ICdwaHA6Ly9zdGRpbicgPT09IChzdHJlYW1fZ2V0X21ldGFfZGF0YSgkaW5wdXRTdHJlYW0pWyd1cmknXSA/PyBudWxsKTsKJHIgPSBbJGlucHV0U3RyZWFtXTsKJHcgPSBbXTsKCgpzaGVsbF9leGVjKCdzdHR5IC1pY2Fub24gLWVjaG8nKTsKCgokb3V0cHV0LT5nZXRGb3JtYXR0ZXIoKS0+c2V0U3R5bGUoJ2hsJywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCdibGFjaycsICd3aGl0ZScpKTsKCgp3aGlsZSAoIWZlb2YoJGlucHV0U3RyZWFtKSkgewp3aGlsZSAoJGlzU3RkaW4gJiYgMCA9PT0gQHN0cmVhbV9zZWxlY3QoJHIsICR3LCAkdywgMCwgMTAwKSkgewoKJHIgPSBbJGlucHV0U3RyZWFtXTsKfQokYyA9IGZyZWFkKCRpbnB1dFN0cmVhbSwgMSk7CgoKaWYgKGZhbHNlID09PSAkYyB8fCAoJycgPT09ICRyZXQgJiYgJycgPT09ICRjICYmIG51bGwgPT09ICRxdWVzdGlvbi0+Z2V0RGVmYXVsdCgpKSkgewpzaGVsbF9leGVjKCdzdHR5ICcuJHN0dHlNb2RlKTsKdGhyb3cgbmV3IE1pc3NpbmdJbnB1dEV4Y2VwdGlvbignQWJvcnRlZC4nKTsKfSBlbHNlaWYgKCJcMTc3IiA9PT0gJGMpIHsgCmlmICgwID09PSAkbnVtTWF0Y2hlcyAmJiAwICE9PSAkaSkgewotLSRpOwokY3Vyc29yLT5tb3ZlTGVmdChzKCRmdWxsQ2hvaWNlKS0+c2xpY2UoLTEpLT53aWR0aChmYWxzZSkpOwoKJGZ1bGxDaG9pY2UgPSBzZWxmOjpzdWJzdHIoJGZ1bGxDaG9pY2UsIDAsICRpKTsKfQoKaWYgKDAgPT09ICRpKSB7CiRvZnMgPSAtMTsKJG1hdGNoZXMgPSAkYXV0b2NvbXBsZXRlKCRyZXQpOwokbnVtTWF0Y2hlcyA9IFxjb3VudCgkbWF0Y2hlcyk7Cn0gZWxzZSB7CiRudW1NYXRjaGVzID0gMDsKfQoKCiRyZXQgPSBzZWxmOjpzdWJzdHIoJHJldCwgMCwgJGkpOwp9IGVsc2VpZiAoIlwwMzMiID09PSAkYykgewoKJGMgLj0gZnJlYWQoJGlucHV0U3RyZWFtLCAyKTsKCgppZiAoaXNzZXQoJGNbMl0pICYmICgnQScgPT09ICRjWzJdIHx8ICdCJyA9PT0gJGNbMl0pKSB7CmlmICgnQScgPT09ICRjWzJdICYmIC0xID09PSAkb2ZzKSB7CiRvZnMgPSAwOwp9CgppZiAoMCA9PT0gJG51bU1hdGNoZXMpIHsKY29udGludWU7Cn0KCiRvZnMgKz0gKCdBJyA9PT0gJGNbMl0pID8gLTEgOiAxOwokb2ZzID0gKCRudW1NYXRjaGVzICsgJG9mcykgJSAkbnVtTWF0Y2hlczsKfQp9IGVsc2VpZiAoXG9yZCgkYykgPCAzMikgewppZiAoIlx0IiA9PT0gJGMgfHwgIlxuIiA9PT0gJGMpIHsKaWYgKCRudW1NYXRjaGVzID4gMCAmJiAtMSAhPT0gJG9mcykgewokcmV0ID0gKHN0cmluZykgJG1hdGNoZXNbJG9mc107CgokcmVtYWluaW5nQ2hhcmFjdGVycyA9IHN1YnN0cigkcmV0LCBcc3RybGVuKHRyaW0oJHRoaXMtPm1vc3RSZWNlbnRseUVudGVyZWRWYWx1ZSgkZnVsbENob2ljZSkpKSk7CiRvdXRwdXQtPndyaXRlKCRyZW1haW5pbmdDaGFyYWN0ZXJzKTsKJGZ1bGxDaG9pY2UgLj0gJHJlbWFpbmluZ0NoYXJhY3RlcnM7CiRpID0gKGZhbHNlID09PSAkZW5jb2RpbmcgPSBtYl9kZXRlY3RfZW5jb2RpbmcoJGZ1bGxDaG9pY2UsIG51bGwsIHRydWUpKSA/IFxzdHJsZW4oJGZ1bGxDaG9pY2UpIDogbWJfc3RybGVuKCRmdWxsQ2hvaWNlLCAkZW5jb2RpbmcpOwoKJG1hdGNoZXMgPSBhcnJheV9maWx0ZXIoCiRhdXRvY29tcGxldGUoJHJldCksCmZ1bmN0aW9uICgkbWF0Y2gpIHVzZSAoJHJldCkgewpyZXR1cm4gJycgPT09ICRyZXQgfHwgc3RyX3N0YXJ0c193aXRoKCRtYXRjaCwgJHJldCk7Cn0KKTsKJG51bU1hdGNoZXMgPSBcY291bnQoJG1hdGNoZXMpOwokb2ZzID0gLTE7Cn0KCmlmICgiXG4iID09PSAkYykgewokb3V0cHV0LT53cml0ZSgkYyk7CmJyZWFrOwp9CgokbnVtTWF0Y2hlcyA9IDA7Cn0KCmNvbnRpbnVlOwp9IGVsc2UgewppZiAoIlx4ODAiIDw9ICRjKSB7CiRjIC49IGZyZWFkKCRpbnB1dFN0cmVhbSwgWyJceEMwIiA9PiAxLCAiXHhEMCIgPT4gMSwgIlx4RTAiID0+IDIsICJceEYwIiA9PiAzXVskYyAmICJceEYwIl0pOwp9Cgokb3V0cHV0LT53cml0ZSgkYyk7CiRyZXQgLj0gJGM7CiRmdWxsQ2hvaWNlIC49ICRjOworKyRpOwoKJHRlbXBSZXQgPSAkcmV0OwoKaWYgKCRxdWVzdGlvbiBpbnN0YW5jZW9mIENob2ljZVF1ZXN0aW9uICYmICRxdWVzdGlvbi0+aXNNdWx0aXNlbGVjdCgpKSB7CiR0ZW1wUmV0ID0gJHRoaXMtPm1vc3RSZWNlbnRseUVudGVyZWRWYWx1ZSgkZnVsbENob2ljZSk7Cn0KCiRudW1NYXRjaGVzID0gMDsKJG9mcyA9IDA7Cgpmb3JlYWNoICgkYXV0b2NvbXBsZXRlKCRyZXQpIGFzICR2YWx1ZSkgewoKaWYgKHN0cl9zdGFydHNfd2l0aCgkdmFsdWUsICR0ZW1wUmV0KSkgewokbWF0Y2hlc1skbnVtTWF0Y2hlcysrXSA9ICR2YWx1ZTsKfQp9Cn0KCiRjdXJzb3ItPmNsZWFyTGluZUFmdGVyKCk7CgppZiAoJG51bU1hdGNoZXMgPiAwICYmIC0xICE9PSAkb2ZzKSB7CiRjdXJzb3ItPnNhdmVQb3NpdGlvbigpOwoKJGNoYXJhY3RlcnNFbnRlcmVkID0gXHN0cmxlbih0cmltKCR0aGlzLT5tb3N0UmVjZW50bHlFbnRlcmVkVmFsdWUoJGZ1bGxDaG9pY2UpKSk7CiRvdXRwdXQtPndyaXRlKCc8aGw+Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZVRyYWlsaW5nQmFja3NsYXNoKHN1YnN0cigkbWF0Y2hlc1skb2ZzXSwgJGNoYXJhY3RlcnNFbnRlcmVkKSkuJzwvaGw+Jyk7CiRjdXJzb3ItPnJlc3RvcmVQb3NpdGlvbigpOwp9Cn0KCgpzaGVsbF9leGVjKCdzdHR5ICcuJHN0dHlNb2RlKTsKCnJldHVybiAkZnVsbENob2ljZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBtb3N0UmVjZW50bHlFbnRlcmVkVmFsdWUoc3RyaW5nICRlbnRlcmVkKTogc3RyaW5nCnsKCmlmICghc3RyX2NvbnRhaW5zKCRlbnRlcmVkLCAnLCcpKSB7CnJldHVybiAkZW50ZXJlZDsKfQoKJGNob2ljZXMgPSBleHBsb2RlKCcsJywgJGVudGVyZWQpOwppZiAoJycgIT09ICRsYXN0Q2hvaWNlID0gdHJpbSgkY2hvaWNlc1tcY291bnQoJGNob2ljZXMpIC0gMV0pKSB7CnJldHVybiAkbGFzdENob2ljZTsKfQoKcmV0dXJuICRlbnRlcmVkOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0SGlkZGVuUmVzcG9uc2UoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsICRpbnB1dFN0cmVhbSwgYm9vbCAkdHJpbW1hYmxlID0gdHJ1ZSk6IHN0cmluZwp7CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokZXhlID0gX19ESVJfXy4nLy4uL1Jlc291cmNlcy9iaW4vaGlkZGVuaW5wdXQuZXhlJzsKCgppZiAoJ3BoYXI6JyA9PT0gc3Vic3RyKF9fRklMRV9fLCAwLCA1KSkgewokdG1wRXhlID0gc3lzX2dldF90ZW1wX2RpcigpLicvaGlkZGVuaW5wdXQuZXhlJzsKY29weSgkZXhlLCAkdG1wRXhlKTsKJGV4ZSA9ICR0bXBFeGU7Cn0KCiRzRXhlYyA9IHNoZWxsX2V4ZWMoJyInLiRleGUuJyInKTsKJHZhbHVlID0gJHRyaW1tYWJsZSA/IHJ0cmltKCRzRXhlYykgOiAkc0V4ZWM7CiRvdXRwdXQtPndyaXRlbG4oJycpOwoKaWYgKGlzc2V0KCR0bXBFeGUpKSB7CnVubGluaygkdG1wRXhlKTsKfQoKcmV0dXJuICR2YWx1ZTsKfQoKaWYgKHNlbGY6OiRzdHR5ICYmIFRlcm1pbmFsOjpoYXNTdHR5QXZhaWxhYmxlKCkpIHsKJHN0dHlNb2RlID0gc2hlbGxfZXhlYygnc3R0eSAtZycpOwpzaGVsbF9leGVjKCdzdHR5IC1lY2hvJyk7Cn0gZWxzZWlmICgkdGhpcy0+aXNJbnRlcmFjdGl2ZUlucHV0KCRpbnB1dFN0cmVhbSkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1VuYWJsZSB0byBoaWRlIHRoZSByZXNwb25zZS4nKTsKfQoKJHZhbHVlID0gZmdldHMoJGlucHV0U3RyZWFtLCA0MDk2KTsKCmlmIChzZWxmOjokc3R0eSAmJiBUZXJtaW5hbDo6aGFzU3R0eUF2YWlsYWJsZSgpKSB7CnNoZWxsX2V4ZWMoJ3N0dHkgJy4kc3R0eU1vZGUpOwp9CgppZiAoZmFsc2UgPT09ICR2YWx1ZSkgewp0aHJvdyBuZXcgTWlzc2luZ0lucHV0RXhjZXB0aW9uKCdBYm9ydGVkLicpOwp9CmlmICgkdHJpbW1hYmxlKSB7CiR2YWx1ZSA9IHRyaW0oJHZhbHVlKTsKfQokb3V0cHV0LT53cml0ZWxuKCcnKTsKCnJldHVybiAkdmFsdWU7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVBdHRlbXB0cyhjYWxsYWJsZSAkaW50ZXJ2aWV3ZXIsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBRdWVzdGlvbiAkcXVlc3Rpb24pCnsKJGVycm9yID0gbnVsbDsKJGF0dGVtcHRzID0gJHF1ZXN0aW9uLT5nZXRNYXhBdHRlbXB0cygpOwoKd2hpbGUgKG51bGwgPT09ICRhdHRlbXB0cyB8fCAkYXR0ZW1wdHMtLSkgewppZiAobnVsbCAhPT0gJGVycm9yKSB7CiR0aGlzLT53cml0ZUVycm9yKCRvdXRwdXQsICRlcnJvcik7Cn0KCnRyeSB7CnJldHVybiAkcXVlc3Rpb24tPmdldFZhbGlkYXRvcigpKCRpbnRlcnZpZXdlcigpKTsKfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiAkZSkgewp0aHJvdyAkZTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZXJyb3IpIHsKfQp9Cgp0aHJvdyAkZXJyb3I7Cn0KCnByaXZhdGUgZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZUlucHV0KCRpbnB1dFN0cmVhbSk6IGJvb2wKewppZiAoJ3BocDovL3N0ZGluJyAhPT0gKHN0cmVhbV9nZXRfbWV0YV9kYXRhKCRpbnB1dFN0cmVhbSlbJ3VyaSddID8/IG51bGwpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKG51bGwgIT09IHNlbGY6OiRzdGRpbklzSW50ZXJhY3RpdmUpIHsKcmV0dXJuIHNlbGY6OiRzdGRpbklzSW50ZXJhY3RpdmU7Cn0KCnJldHVybiBzZWxmOjokc3RkaW5Jc0ludGVyYWN0aXZlID0gQHN0cmVhbV9pc2F0dHkoZm9wZW4oJ3BocDovL3N0ZGluJywgJ3InKSk7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZWFkSW5wdXQoJGlucHV0U3RyZWFtLCBRdWVzdGlvbiAkcXVlc3Rpb24pCnsKaWYgKCEkcXVlc3Rpb24tPmlzTXVsdGlsaW5lKCkpIHsKJGNwID0gJHRoaXMtPnNldElPQ29kZXBhZ2UoKTsKJHJldCA9IGZnZXRzKCRpbnB1dFN0cmVhbSwgNDA5Nik7CgpyZXR1cm4gJHRoaXMtPnJlc2V0SU9Db2RlcGFnZSgkY3AsICRyZXQpOwp9CgokbXVsdGlMaW5lU3RyZWFtUmVhZGVyID0gJHRoaXMtPmNsb25lSW5wdXRTdHJlYW0oJGlucHV0U3RyZWFtKTsKaWYgKG51bGwgPT09ICRtdWx0aUxpbmVTdHJlYW1SZWFkZXIpIHsKcmV0dXJuIGZhbHNlOwp9CgokcmV0ID0gJyc7CiRjcCA9ICR0aGlzLT5zZXRJT0NvZGVwYWdlKCk7CndoaWxlIChmYWxzZSAhPT0gKCRjaGFyID0gZmdldGMoJG11bHRpTGluZVN0cmVhbVJlYWRlcikpKSB7CmlmIChcUEhQX0VPTCA9PT0gInskcmV0fXskY2hhcn0iKSB7CmJyZWFrOwp9CiRyZXQgLj0gJGNoYXI7Cn0KCnJldHVybiAkdGhpcy0+cmVzZXRJT0NvZGVwYWdlKCRjcCwgJHJldCk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzZXRJT0NvZGVwYWdlKCk6IGludAp7CmlmIChcZnVuY3Rpb25fZXhpc3RzKCdzYXBpX3dpbmRvd3NfY3Bfc2V0JykpIHsKJGNwID0gc2FwaV93aW5kb3dzX2NwX2dldCgpOwpzYXBpX3dpbmRvd3NfY3Bfc2V0KHNhcGlfd2luZG93c19jcF9nZXQoJ29lbScpKTsKCnJldHVybiAkY3A7Cn0KCnJldHVybiAwOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXNldElPQ29kZXBhZ2UoaW50ICRjcCwgJGlucHV0KQp7CmlmICgwICE9PSAkY3ApIHsKc2FwaV93aW5kb3dzX2NwX3NldCgkY3ApOwoKaWYgKGZhbHNlICE9PSAkaW5wdXQgJiYgJycgIT09ICRpbnB1dCkgewokaW5wdXQgPSBzYXBpX3dpbmRvd3NfY3BfY29udihzYXBpX3dpbmRvd3NfY3BfZ2V0KCdvZW0nKSwgJGNwLCAkaW5wdXQpOwp9Cn0KCnJldHVybiAkaW5wdXQ7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjbG9uZUlucHV0U3RyZWFtKCRpbnB1dFN0cmVhbSkKewokc3RyZWFtTWV0YURhdGEgPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkaW5wdXRTdHJlYW0pOwokc2Vla2FibGUgPSAkc3RyZWFtTWV0YURhdGFbJ3NlZWthYmxlJ10gPz8gZmFsc2U7CiRtb2RlID0gJHN0cmVhbU1ldGFEYXRhWydtb2RlJ10gPz8gJ3JiJzsKJHVyaSA9ICRzdHJlYW1NZXRhRGF0YVsndXJpJ10gPz8gbnVsbDsKCmlmIChudWxsID09PSAkdXJpKSB7CnJldHVybiBudWxsOwp9CgokY2xvbmVTdHJlYW0gPSBmb3BlbigkdXJpLCAkbW9kZSk7CgoKCmlmICh0cnVlID09PSAkc2Vla2FibGUgJiYgIVxpbl9hcnJheSgkbW9kZSwgWydyJywgJ3JiJywgJ3J0J10pKSB7CiRvZmZzZXQgPSBmdGVsbCgkaW5wdXRTdHJlYW0pOwpyZXdpbmQoJGlucHV0U3RyZWFtKTsKc3RyZWFtX2NvcHlfdG9fc3RyZWFtKCRpbnB1dFN0cmVhbSwgJGNsb25lU3RyZWFtKTsKZnNlZWsoJGlucHV0U3RyZWFtLCAkb2Zmc2V0KTsKZnNlZWsoJGNsb25lU3RyZWFtLCAkb2Zmc2V0KTsKfQoKcmV0dXJuICRjbG9uZVN0cmVhbTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxDaG9pY2VRdWVzdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cQ29uZmlybWF0aW9uUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXFF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxTdHlsZVxTeW1mb255U3R5bGU7CgoKCgoKCmNsYXNzIFN5bWZvbnlRdWVzdGlvbkhlbHBlciBleHRlbmRzIFF1ZXN0aW9uSGVscGVyCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHdyaXRlUHJvbXB0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBRdWVzdGlvbiAkcXVlc3Rpb24pCnsKJHRleHQgPSBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZVRyYWlsaW5nQmFja3NsYXNoKCRxdWVzdGlvbi0+Z2V0UXVlc3Rpb24oKSk7CiRkZWZhdWx0ID0gJHF1ZXN0aW9uLT5nZXREZWZhdWx0KCk7CgppZiAoJHF1ZXN0aW9uLT5pc011bHRpbGluZSgpKSB7CiR0ZXh0IC49IHNwcmludGYoJyAocHJlc3MgJXMgdG8gY29udGludWUpJywgJHRoaXMtPmdldEVvZlNob3J0Y3V0KCkpOwp9Cgpzd2l0Y2ggKHRydWUpIHsKY2FzZSBudWxsID09PSAkZGVmYXVsdDoKJHRleHQgPSBzcHJpbnRmKCcgPGluZm8+JXM8L2luZm8+OicsICR0ZXh0KTsKCmJyZWFrOwoKY2FzZSAkcXVlc3Rpb24gaW5zdGFuY2VvZiBDb25maXJtYXRpb25RdWVzdGlvbjoKJHRleHQgPSBzcHJpbnRmKCcgPGluZm8+JXMgKHllcy9ubyk8L2luZm8+IFs8Y29tbWVudD4lczwvY29tbWVudD5dOicsICR0ZXh0LCAkZGVmYXVsdCA/ICd5ZXMnIDogJ25vJyk7CgpicmVhazsKCmNhc2UgJHF1ZXN0aW9uIGluc3RhbmNlb2YgQ2hvaWNlUXVlc3Rpb24gJiYgJHF1ZXN0aW9uLT5pc011bHRpc2VsZWN0KCk6CiRjaG9pY2VzID0gJHF1ZXN0aW9uLT5nZXRDaG9pY2VzKCk7CiRkZWZhdWx0ID0gZXhwbG9kZSgnLCcsICRkZWZhdWx0KTsKCmZvcmVhY2ggKCRkZWZhdWx0IGFzICRrZXkgPT4gJHZhbHVlKSB7CiRkZWZhdWx0WyRrZXldID0gJGNob2ljZXNbdHJpbSgkdmFsdWUpXTsKfQoKJHRleHQgPSBzcHJpbnRmKCcgPGluZm8+JXM8L2luZm8+IFs8Y29tbWVudD4lczwvY29tbWVudD5dOicsICR0ZXh0LCBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZShpbXBsb2RlKCcsICcsICRkZWZhdWx0KSkpOwoKYnJlYWs7CgpjYXNlICRxdWVzdGlvbiBpbnN0YW5jZW9mIENob2ljZVF1ZXN0aW9uOgokY2hvaWNlcyA9ICRxdWVzdGlvbi0+Z2V0Q2hvaWNlcygpOwokdGV4dCA9IHNwcmludGYoJyA8aW5mbz4lczwvaW5mbz4gWzxjb21tZW50PiVzPC9jb21tZW50Pl06JywgJHRleHQsIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRjaG9pY2VzWyRkZWZhdWx0XSA/PyAkZGVmYXVsdCkpOwoKYnJlYWs7CgpkZWZhdWx0OgokdGV4dCA9IHNwcmludGYoJyA8aW5mbz4lczwvaW5mbz4gWzxjb21tZW50PiVzPC9jb21tZW50Pl06JywgJHRleHQsIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRkZWZhdWx0KSk7Cn0KCiRvdXRwdXQtPndyaXRlbG4oJHRleHQpOwoKJHByb21wdCA9ICcgPiAnOwoKaWYgKCRxdWVzdGlvbiBpbnN0YW5jZW9mIENob2ljZVF1ZXN0aW9uKSB7CiRvdXRwdXQtPndyaXRlbG4oJHRoaXMtPmZvcm1hdENob2ljZVF1ZXN0aW9uQ2hvaWNlcygkcXVlc3Rpb24sICdjb21tZW50JykpOwoKJHByb21wdCA9ICRxdWVzdGlvbi0+Z2V0UHJvbXB0KCk7Cn0KCiRvdXRwdXQtPndyaXRlKCRwcm9tcHQpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gd3JpdGVFcnJvcihPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgXEV4Y2VwdGlvbiAkZXJyb3IpCnsKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBTeW1mb255U3R5bGUpIHsKJG91dHB1dC0+bmV3TGluZSgpOwokb3V0cHV0LT5lcnJvcigkZXJyb3ItPmdldE1lc3NhZ2UoKSk7CgpyZXR1cm47Cn0KCnBhcmVudDo6d3JpdGVFcnJvcigkb3V0cHV0LCAkZXJyb3IpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldEVvZlNob3J0Y3V0KCk6IHN0cmluZwp7CmlmICgnV2luZG93cycgPT09IFxQSFBfT1NfRkFNSUxZKSB7CnJldHVybiAnPGNvbW1lbnQ+Q3RybCtaPC9jb21tZW50PiB0aGVuIDxjb21tZW50PkVudGVyPC9jb21tZW50Pic7Cn0KCnJldHVybiAnPGNvbW1lbnQ+Q3RybCtEPC9jb21tZW50Pic7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxXcmFwcGFibGVPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlU2VjdGlvbk91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKCgoKCmNsYXNzIFRhYmxlCnsKcHJpdmF0ZSBjb25zdCBTRVBBUkFUT1JfVE9QID0gMDsKcHJpdmF0ZSBjb25zdCBTRVBBUkFUT1JfVE9QX0JPVFRPTSA9IDE7CnByaXZhdGUgY29uc3QgU0VQQVJBVE9SX01JRCA9IDI7CnByaXZhdGUgY29uc3QgU0VQQVJBVE9SX0JPVFRPTSA9IDM7CnByaXZhdGUgY29uc3QgQk9SREVSX09VVFNJREUgPSAwOwpwcml2YXRlIGNvbnN0IEJPUkRFUl9JTlNJREUgPSAxOwoKcHJpdmF0ZSAkaGVhZGVyVGl0bGU7CnByaXZhdGUgJGZvb3RlclRpdGxlOwoKCgoKcHJpdmF0ZSAkaGVhZGVycyA9IFtdOwoKCgoKcHJpdmF0ZSAkcm93cyA9IFtdOwpwcml2YXRlICRob3Jpem9udGFsID0gZmFsc2U7CgoKCgpwcml2YXRlICRlZmZlY3RpdmVDb2x1bW5XaWR0aHMgPSBbXTsKCgoKCgoKcHJpdmF0ZSAkbnVtYmVyT2ZDb2x1bW5zOwoKCgoKcHJpdmF0ZSAkb3V0cHV0OwoKCgoKcHJpdmF0ZSAkc3R5bGU7CgoKCgpwcml2YXRlICRjb2x1bW5TdHlsZXMgPSBbXTsKCgoKCgoKcHJpdmF0ZSAkY29sdW1uV2lkdGhzID0gW107CnByaXZhdGUgJGNvbHVtbk1heFdpZHRocyA9IFtdOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJHN0eWxlczsKCnByaXZhdGUgJHJlbmRlcmVkID0gZmFsc2U7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7CgppZiAoIXNlbGY6OiRzdHlsZXMpIHsKc2VsZjo6JHN0eWxlcyA9IHNlbGY6OmluaXRTdHlsZXMoKTsKfQoKJHRoaXMtPnNldFN0eWxlKCdkZWZhdWx0Jyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0U3R5bGVEZWZpbml0aW9uKHN0cmluZyAkbmFtZSwgVGFibGVTdHlsZSAkc3R5bGUpCnsKaWYgKCFzZWxmOjokc3R5bGVzKSB7CnNlbGY6OiRzdHlsZXMgPSBzZWxmOjppbml0U3R5bGVzKCk7Cn0KCnNlbGY6OiRzdHlsZXNbJG5hbWVdID0gJHN0eWxlOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3R5bGVEZWZpbml0aW9uKHN0cmluZyAkbmFtZSkKewppZiAoIXNlbGY6OiRzdHlsZXMpIHsKc2VsZjo6JHN0eWxlcyA9IHNlbGY6OmluaXRTdHlsZXMoKTsKfQoKaWYgKGlzc2V0KHNlbGY6OiRzdHlsZXNbJG5hbWVdKSkgewpyZXR1cm4gc2VsZjo6JHN0eWxlc1skbmFtZV07Cn0KCnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignU3R5bGUgIiVzIiBpcyBub3QgZGVmaW5lZC4nLCAkbmFtZSkpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0eWxlKCRuYW1lKQp7CiR0aGlzLT5zdHlsZSA9ICR0aGlzLT5yZXNvbHZlU3R5bGUoJG5hbWUpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZSgpCnsKcmV0dXJuICR0aGlzLT5zdHlsZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb2x1bW5TdHlsZShpbnQgJGNvbHVtbkluZGV4LCAkbmFtZSkKewokdGhpcy0+Y29sdW1uU3R5bGVzWyRjb2x1bW5JbmRleF0gPSAkdGhpcy0+cmVzb2x2ZVN0eWxlKCRuYW1lKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb2x1bW5TdHlsZShpbnQgJGNvbHVtbkluZGV4KQp7CnJldHVybiAkdGhpcy0+Y29sdW1uU3R5bGVzWyRjb2x1bW5JbmRleF0gPz8gJHRoaXMtPmdldFN0eWxlKCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbHVtbldpZHRoKGludCAkY29sdW1uSW5kZXgsIGludCAkd2lkdGgpCnsKJHRoaXMtPmNvbHVtbldpZHRoc1skY29sdW1uSW5kZXhdID0gJHdpZHRoOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb2x1bW5XaWR0aHMoYXJyYXkgJHdpZHRocykKewokdGhpcy0+Y29sdW1uV2lkdGhzID0gW107CmZvcmVhY2ggKCR3aWR0aHMgYXMgJGluZGV4ID0+ICR3aWR0aCkgewokdGhpcy0+c2V0Q29sdW1uV2lkdGgoJGluZGV4LCAkd2lkdGgpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbHVtbk1heFdpZHRoKGludCAkY29sdW1uSW5kZXgsIGludCAkd2lkdGgpOiBzZWxmCnsKaWYgKCEkdGhpcy0+b3V0cHV0LT5nZXRGb3JtYXR0ZXIoKSBpbnN0YW5jZW9mIFdyYXBwYWJsZU91dHB1dEZvcm1hdHRlckludGVyZmFjZSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ1NldHRpbmcgYSBtYXhpbXVtIGNvbHVtbiB3aWR0aCBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIHVzaW5nIGEgIiVzIiBmb3JtYXR0ZXIsIGdvdCAiJXMiLicsIFdyYXBwYWJsZU91dHB1dEZvcm1hdHRlckludGVyZmFjZTo6Y2xhc3MsIGdldF9kZWJ1Z190eXBlKCR0aGlzLT5vdXRwdXQtPmdldEZvcm1hdHRlcigpKSkpOwp9CgokdGhpcy0+Y29sdW1uTWF4V2lkdGhzWyRjb2x1bW5JbmRleF0gPSAkd2lkdGg7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWFkZXJzKGFycmF5ICRoZWFkZXJzKQp7CiRoZWFkZXJzID0gYXJyYXlfdmFsdWVzKCRoZWFkZXJzKTsKaWYgKCFlbXB0eSgkaGVhZGVycykgJiYgIVxpc19hcnJheSgkaGVhZGVyc1swXSkpIHsKJGhlYWRlcnMgPSBbJGhlYWRlcnNdOwp9CgokdGhpcy0+aGVhZGVycyA9ICRoZWFkZXJzOwoKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0Um93cyhhcnJheSAkcm93cykKewokdGhpcy0+cm93cyA9IFtdOwoKcmV0dXJuICR0aGlzLT5hZGRSb3dzKCRyb3dzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJvd3MoYXJyYXkgJHJvd3MpCnsKZm9yZWFjaCAoJHJvd3MgYXMgJHJvdykgewokdGhpcy0+YWRkUm93KCRyb3cpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSb3coJHJvdykKewppZiAoJHJvdyBpbnN0YW5jZW9mIFRhYmxlU2VwYXJhdG9yKSB7CiR0aGlzLT5yb3dzW10gPSAkcm93OwoKcmV0dXJuICR0aGlzOwp9CgppZiAoIVxpc19hcnJheSgkcm93KSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdBIHJvdyBtdXN0IGJlIGFuIGFycmF5IG9yIGEgVGFibGVTZXBhcmF0b3IgaW5zdGFuY2UuJyk7Cn0KCiR0aGlzLT5yb3dzW10gPSBhcnJheV92YWx1ZXMoJHJvdyk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFwcGVuZFJvdygkcm93KTogc2VsZgp7CmlmICghJHRoaXMtPm91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVTZWN0aW9uT3V0cHV0KSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ091dHB1dCBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgIiVzIiB3aGVuIGNhbGxpbmcgIiVzIi4nLCBDb25zb2xlU2VjdGlvbk91dHB1dDo6Y2xhc3MsIF9fTUVUSE9EX18pKTsKfQoKaWYgKCR0aGlzLT5yZW5kZXJlZCkgewokdGhpcy0+b3V0cHV0LT5jbGVhcigkdGhpcy0+Y2FsY3VsYXRlUm93Q291bnQoKSk7Cn0KCiR0aGlzLT5hZGRSb3coJHJvdyk7CiR0aGlzLT5yZW5kZXIoKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJvdygkY29sdW1uLCBhcnJheSAkcm93KQp7CiR0aGlzLT5yb3dzWyRjb2x1bW5dID0gJHJvdzsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhlYWRlclRpdGxlKD9zdHJpbmcgJHRpdGxlKTogc2VsZgp7CiR0aGlzLT5oZWFkZXJUaXRsZSA9ICR0aXRsZTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZvb3RlclRpdGxlKD9zdHJpbmcgJHRpdGxlKTogc2VsZgp7CiR0aGlzLT5mb290ZXJUaXRsZSA9ICR0aXRsZTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhvcml6b250YWwoYm9vbCAkaG9yaXpvbnRhbCA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPmhvcml6b250YWwgPSAkaG9yaXpvbnRhbDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW5kZXIoKQp7CiRkaXZpZGVyID0gbmV3IFRhYmxlU2VwYXJhdG9yKCk7CmlmICgkdGhpcy0+aG9yaXpvbnRhbCkgewokcm93cyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+aGVhZGVyc1swXSA/PyBbXSBhcyAkaSA9PiAkaGVhZGVyKSB7CiRyb3dzWyRpXSA9IFskaGVhZGVyXTsKZm9yZWFjaCAoJHRoaXMtPnJvd3MgYXMgJHJvdykgewppZiAoJHJvdyBpbnN0YW5jZW9mIFRhYmxlU2VwYXJhdG9yKSB7CmNvbnRpbnVlOwp9CmlmIChpc3NldCgkcm93WyRpXSkpIHsKJHJvd3NbJGldW10gPSAkcm93WyRpXTsKfSBlbHNlaWYgKCRyb3dzWyRpXVswXSBpbnN0YW5jZW9mIFRhYmxlQ2VsbCAmJiAkcm93c1skaV1bMF0tPmdldENvbHNwYW4oKSA+PSAyKSB7Cgp9IGVsc2Ugewokcm93c1skaV1bXSA9IG51bGw7Cn0KfQp9Cn0gZWxzZSB7CiRyb3dzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmhlYWRlcnMsIFskZGl2aWRlcl0sICR0aGlzLT5yb3dzKTsKfQoKJHRoaXMtPmNhbGN1bGF0ZU51bWJlck9mQ29sdW1ucygkcm93cyk7Cgokcm93R3JvdXBzID0gJHRoaXMtPmJ1aWxkVGFibGVSb3dzKCRyb3dzKTsKJHRoaXMtPmNhbGN1bGF0ZUNvbHVtbnNXaWR0aCgkcm93R3JvdXBzKTsKCiRpc0hlYWRlciA9ICEkdGhpcy0+aG9yaXpvbnRhbDsKJGlzRmlyc3RSb3cgPSAkdGhpcy0+aG9yaXpvbnRhbDsKJGhhc1RpdGxlID0gKGJvb2wpICR0aGlzLT5oZWFkZXJUaXRsZTsKCmZvcmVhY2ggKCRyb3dHcm91cHMgYXMgJHJvd0dyb3VwKSB7CiRpc0hlYWRlclNlcGFyYXRvclJlbmRlcmVkID0gZmFsc2U7Cgpmb3JlYWNoICgkcm93R3JvdXAgYXMgJHJvdykgewppZiAoJGRpdmlkZXIgPT09ICRyb3cpIHsKJGlzSGVhZGVyID0gZmFsc2U7CiRpc0ZpcnN0Um93ID0gdHJ1ZTsKCmNvbnRpbnVlOwp9CgppZiAoJHJvdyBpbnN0YW5jZW9mIFRhYmxlU2VwYXJhdG9yKSB7CiR0aGlzLT5yZW5kZXJSb3dTZXBhcmF0b3IoKTsKCmNvbnRpbnVlOwp9CgppZiAoISRyb3cpIHsKY29udGludWU7Cn0KCmlmICgkaXNIZWFkZXIgJiYgISRpc0hlYWRlclNlcGFyYXRvclJlbmRlcmVkKSB7CiR0aGlzLT5yZW5kZXJSb3dTZXBhcmF0b3IoCiRpc0hlYWRlciA/IHNlbGY6OlNFUEFSQVRPUl9UT1AgOiBzZWxmOjpTRVBBUkFUT1JfVE9QX0JPVFRPTSwKJGhhc1RpdGxlID8gJHRoaXMtPmhlYWRlclRpdGxlIDogbnVsbCwKJGhhc1RpdGxlID8gJHRoaXMtPnN0eWxlLT5nZXRIZWFkZXJUaXRsZUZvcm1hdCgpIDogbnVsbAopOwokaGFzVGl0bGUgPSBmYWxzZTsKJGlzSGVhZGVyU2VwYXJhdG9yUmVuZGVyZWQgPSB0cnVlOwp9CgppZiAoJGlzRmlyc3RSb3cpIHsKJHRoaXMtPnJlbmRlclJvd1NlcGFyYXRvcigKJGlzSGVhZGVyID8gc2VsZjo6U0VQQVJBVE9SX1RPUCA6IHNlbGY6OlNFUEFSQVRPUl9UT1BfQk9UVE9NLAokaGFzVGl0bGUgPyAkdGhpcy0+aGVhZGVyVGl0bGUgOiBudWxsLAokaGFzVGl0bGUgPyAkdGhpcy0+c3R5bGUtPmdldEhlYWRlclRpdGxlRm9ybWF0KCkgOiBudWxsCik7CiRpc0ZpcnN0Um93ID0gZmFsc2U7CiRoYXNUaXRsZSA9IGZhbHNlOwp9CgppZiAoJHRoaXMtPmhvcml6b250YWwpIHsKJHRoaXMtPnJlbmRlclJvdygkcm93LCAkdGhpcy0+c3R5bGUtPmdldENlbGxSb3dGb3JtYXQoKSwgJHRoaXMtPnN0eWxlLT5nZXRDZWxsSGVhZGVyRm9ybWF0KCkpOwp9IGVsc2UgewokdGhpcy0+cmVuZGVyUm93KCRyb3csICRpc0hlYWRlciA/ICR0aGlzLT5zdHlsZS0+Z2V0Q2VsbEhlYWRlckZvcm1hdCgpIDogJHRoaXMtPnN0eWxlLT5nZXRDZWxsUm93Rm9ybWF0KCkpOwp9Cn0KfQokdGhpcy0+cmVuZGVyUm93U2VwYXJhdG9yKHNlbGY6OlNFUEFSQVRPUl9CT1RUT00sICR0aGlzLT5mb290ZXJUaXRsZSwgJHRoaXMtPnN0eWxlLT5nZXRGb290ZXJUaXRsZUZvcm1hdCgpKTsKCiR0aGlzLT5jbGVhbnVwKCk7CiR0aGlzLT5yZW5kZXJlZCA9IHRydWU7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlbmRlclJvd1NlcGFyYXRvcihpbnQgJHR5cGUgPSBzZWxmOjpTRVBBUkFUT1JfTUlELCA/c3RyaW5nICR0aXRsZSA9IG51bGwsID9zdHJpbmcgJHRpdGxlRm9ybWF0ID0gbnVsbCkKewppZiAoMCA9PT0gJGNvdW50ID0gJHRoaXMtPm51bWJlck9mQ29sdW1ucykgewpyZXR1cm47Cn0KCiRib3JkZXJzID0gJHRoaXMtPnN0eWxlLT5nZXRCb3JkZXJDaGFycygpOwppZiAoISRib3JkZXJzWzBdICYmICEkYm9yZGVyc1syXSAmJiAhJHRoaXMtPnN0eWxlLT5nZXRDcm9zc2luZ0NoYXIoKSkgewpyZXR1cm47Cn0KCiRjcm9zc2luZ3MgPSAkdGhpcy0+c3R5bGUtPmdldENyb3NzaW5nQ2hhcnMoKTsKaWYgKHNlbGY6OlNFUEFSQVRPUl9NSUQgPT09ICR0eXBlKSB7ClskaG9yaXpvbnRhbCwgJGxlZnRDaGFyLCAkbWlkQ2hhciwgJHJpZ2h0Q2hhcl0gPSBbJGJvcmRlcnNbMl0sICRjcm9zc2luZ3NbOF0sICRjcm9zc2luZ3NbMF0sICRjcm9zc2luZ3NbNF1dOwp9IGVsc2VpZiAoc2VsZjo6U0VQQVJBVE9SX1RPUCA9PT0gJHR5cGUpIHsKWyRob3Jpem9udGFsLCAkbGVmdENoYXIsICRtaWRDaGFyLCAkcmlnaHRDaGFyXSA9IFskYm9yZGVyc1swXSwgJGNyb3NzaW5nc1sxXSwgJGNyb3NzaW5nc1syXSwgJGNyb3NzaW5nc1szXV07Cn0gZWxzZWlmIChzZWxmOjpTRVBBUkFUT1JfVE9QX0JPVFRPTSA9PT0gJHR5cGUpIHsKWyRob3Jpem9udGFsLCAkbGVmdENoYXIsICRtaWRDaGFyLCAkcmlnaHRDaGFyXSA9IFskYm9yZGVyc1swXSwgJGNyb3NzaW5nc1s5XSwgJGNyb3NzaW5nc1sxMF0sICRjcm9zc2luZ3NbMTFdXTsKfSBlbHNlIHsKWyRob3Jpem9udGFsLCAkbGVmdENoYXIsICRtaWRDaGFyLCAkcmlnaHRDaGFyXSA9IFskYm9yZGVyc1swXSwgJGNyb3NzaW5nc1s3XSwgJGNyb3NzaW5nc1s2XSwgJGNyb3NzaW5nc1s1XV07Cn0KCiRtYXJrdXAgPSAkbGVmdENoYXI7CmZvciAoJGNvbHVtbiA9IDA7ICRjb2x1bW4gPCAkY291bnQ7ICsrJGNvbHVtbikgewokbWFya3VwIC49IHN0cl9yZXBlYXQoJGhvcml6b250YWwsICR0aGlzLT5lZmZlY3RpdmVDb2x1bW5XaWR0aHNbJGNvbHVtbl0pOwokbWFya3VwIC49ICRjb2x1bW4gPT09ICRjb3VudCAtIDEgPyAkcmlnaHRDaGFyIDogJG1pZENoYXI7Cn0KCmlmIChudWxsICE9PSAkdGl0bGUpIHsKJHRpdGxlTGVuZ3RoID0gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJGZvcm1hdHRlciA9ICR0aGlzLT5vdXRwdXQtPmdldEZvcm1hdHRlcigpLCAkZm9ybWF0dGVkVGl0bGUgPSBzcHJpbnRmKCR0aXRsZUZvcm1hdCwgJHRpdGxlKSkpOwokbWFya3VwTGVuZ3RoID0gSGVscGVyOjp3aWR0aCgkbWFya3VwKTsKaWYgKCR0aXRsZUxlbmd0aCA+ICRsaW1pdCA9ICRtYXJrdXBMZW5ndGggLSA0KSB7CiR0aXRsZUxlbmd0aCA9ICRsaW1pdDsKJGZvcm1hdExlbmd0aCA9IEhlbHBlcjo6d2lkdGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCRmb3JtYXR0ZXIsIHNwcmludGYoJHRpdGxlRm9ybWF0LCAnJykpKTsKJGZvcm1hdHRlZFRpdGxlID0gc3ByaW50ZigkdGl0bGVGb3JtYXQsIEhlbHBlcjo6c3Vic3RyKCR0aXRsZSwgMCwgJGxpbWl0IC0gJGZvcm1hdExlbmd0aCAtIDMpLicuLi4nKTsKfQoKJHRpdGxlU3RhcnQgPSBpbnRkaXYoJG1hcmt1cExlbmd0aCAtICR0aXRsZUxlbmd0aCwgMik7CmlmIChmYWxzZSA9PT0gbWJfZGV0ZWN0X2VuY29kaW5nKCRtYXJrdXAsIG51bGwsIHRydWUpKSB7CiRtYXJrdXAgPSBzdWJzdHJfcmVwbGFjZSgkbWFya3VwLCAkZm9ybWF0dGVkVGl0bGUsICR0aXRsZVN0YXJ0LCAkdGl0bGVMZW5ndGgpOwp9IGVsc2UgewokbWFya3VwID0gbWJfc3Vic3RyKCRtYXJrdXAsIDAsICR0aXRsZVN0YXJ0KS4kZm9ybWF0dGVkVGl0bGUubWJfc3Vic3RyKCRtYXJrdXAsICR0aXRsZVN0YXJ0ICsgJHRpdGxlTGVuZ3RoKTsKfQp9CgokdGhpcy0+b3V0cHV0LT53cml0ZWxuKHNwcmludGYoJHRoaXMtPnN0eWxlLT5nZXRCb3JkZXJGb3JtYXQoKSwgJG1hcmt1cCkpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlbmRlckNvbHVtblNlcGFyYXRvcihpbnQgJHR5cGUgPSBzZWxmOjpCT1JERVJfT1VUU0lERSk6IHN0cmluZwp7CiRib3JkZXJzID0gJHRoaXMtPnN0eWxlLT5nZXRCb3JkZXJDaGFycygpOwoKcmV0dXJuIHNwcmludGYoJHRoaXMtPnN0eWxlLT5nZXRCb3JkZXJGb3JtYXQoKSwgc2VsZjo6Qk9SREVSX09VVFNJREUgPT09ICR0eXBlID8gJGJvcmRlcnNbMV0gOiAkYm9yZGVyc1szXSk7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlbmRlclJvdyhhcnJheSAkcm93LCBzdHJpbmcgJGNlbGxGb3JtYXQsID9zdHJpbmcgJGZpcnN0Q2VsbEZvcm1hdCA9IG51bGwpCnsKJHJvd0NvbnRlbnQgPSAkdGhpcy0+cmVuZGVyQ29sdW1uU2VwYXJhdG9yKHNlbGY6OkJPUkRFUl9PVVRTSURFKTsKJGNvbHVtbnMgPSAkdGhpcy0+Z2V0Um93Q29sdW1ucygkcm93KTsKJGxhc3QgPSBcY291bnQoJGNvbHVtbnMpIC0gMTsKZm9yZWFjaCAoJGNvbHVtbnMgYXMgJGkgPT4gJGNvbHVtbikgewppZiAoJGZpcnN0Q2VsbEZvcm1hdCAmJiAwID09PSAkaSkgewokcm93Q29udGVudCAuPSAkdGhpcy0+cmVuZGVyQ2VsbCgkcm93LCAkY29sdW1uLCAkZmlyc3RDZWxsRm9ybWF0KTsKfSBlbHNlIHsKJHJvd0NvbnRlbnQgLj0gJHRoaXMtPnJlbmRlckNlbGwoJHJvdywgJGNvbHVtbiwgJGNlbGxGb3JtYXQpOwp9CiRyb3dDb250ZW50IC49ICR0aGlzLT5yZW5kZXJDb2x1bW5TZXBhcmF0b3IoJGxhc3QgPT09ICRpID8gc2VsZjo6Qk9SREVSX09VVFNJREUgOiBzZWxmOjpCT1JERVJfSU5TSURFKTsKfQokdGhpcy0+b3V0cHV0LT53cml0ZWxuKCRyb3dDb250ZW50KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZW5kZXJDZWxsKGFycmF5ICRyb3csIGludCAkY29sdW1uLCBzdHJpbmcgJGNlbGxGb3JtYXQpOiBzdHJpbmcKewokY2VsbCA9ICRyb3dbJGNvbHVtbl0gPz8gJyc7CiR3aWR0aCA9ICR0aGlzLT5lZmZlY3RpdmVDb2x1bW5XaWR0aHNbJGNvbHVtbl07CmlmICgkY2VsbCBpbnN0YW5jZW9mIFRhYmxlQ2VsbCAmJiAkY2VsbC0+Z2V0Q29sc3BhbigpID4gMSkgewoKZm9yZWFjaCAocmFuZ2UoJGNvbHVtbiArIDEsICRjb2x1bW4gKyAkY2VsbC0+Z2V0Q29sc3BhbigpIC0gMSkgYXMgJG5leHRDb2x1bW4pIHsKJHdpZHRoICs9ICR0aGlzLT5nZXRDb2x1bW5TZXBhcmF0b3JXaWR0aCgpICsgJHRoaXMtPmVmZmVjdGl2ZUNvbHVtbldpZHRoc1skbmV4dENvbHVtbl07Cn0KfQoKCmlmIChmYWxzZSAhPT0gJGVuY29kaW5nID0gbWJfZGV0ZWN0X2VuY29kaW5nKCRjZWxsLCBudWxsLCB0cnVlKSkgewokd2lkdGggKz0gXHN0cmxlbigkY2VsbCkgLSBtYl9zdHJ3aWR0aCgkY2VsbCwgJGVuY29kaW5nKTsKfQoKJHN0eWxlID0gJHRoaXMtPmdldENvbHVtblN0eWxlKCRjb2x1bW4pOwoKaWYgKCRjZWxsIGluc3RhbmNlb2YgVGFibGVTZXBhcmF0b3IpIHsKcmV0dXJuIHNwcmludGYoJHN0eWxlLT5nZXRCb3JkZXJGb3JtYXQoKSwgc3RyX3JlcGVhdCgkc3R5bGUtPmdldEJvcmRlckNoYXJzKClbMl0sICR3aWR0aCkpOwp9Cgokd2lkdGggKz0gSGVscGVyOjpsZW5ndGgoJGNlbGwpIC0gSGVscGVyOjpsZW5ndGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCR0aGlzLT5vdXRwdXQtPmdldEZvcm1hdHRlcigpLCAkY2VsbCkpOwokY29udGVudCA9IHNwcmludGYoJHN0eWxlLT5nZXRDZWxsUm93Q29udGVudEZvcm1hdCgpLCAkY2VsbCk7CgokcGFkVHlwZSA9ICRzdHlsZS0+Z2V0UGFkVHlwZSgpOwppZiAoJGNlbGwgaW5zdGFuY2VvZiBUYWJsZUNlbGwgJiYgJGNlbGwtPmdldFN0eWxlKCkgaW5zdGFuY2VvZiBUYWJsZUNlbGxTdHlsZSkgewokaXNOb3RTdHlsZWRCeVRhZyA9ICFwcmVnX21hdGNoKCcvXjwoXHcrfChcdys9W1x3LF0rOz8pKik+Lis8XC8oXHcrfChcdys9XHcrOz8pKik/PiQvJywgJGNlbGwpOwppZiAoJGlzTm90U3R5bGVkQnlUYWcpIHsKJGNlbGxGb3JtYXQgPSAkY2VsbC0+Z2V0U3R5bGUoKS0+Z2V0Q2VsbEZvcm1hdCgpOwppZiAoIVxpc19zdHJpbmcoJGNlbGxGb3JtYXQpKSB7CiR0YWcgPSBodHRwX2J1aWxkX3F1ZXJ5KCRjZWxsLT5nZXRTdHlsZSgpLT5nZXRUYWdPcHRpb25zKCksICcnLCAnOycpOwokY2VsbEZvcm1hdCA9ICc8Jy4kdGFnLic+JXM8Lz4nOwp9CgppZiAoc3Ryc3RyKCRjb250ZW50LCAnPC8+JykpIHsKJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgnPC8+JywgJycsICRjb250ZW50KTsKJHdpZHRoIC09IDM7Cn0KaWYgKHN0cnN0cigkY29udGVudCwgJzxmZz1kZWZhdWx0O2JnPWRlZmF1bHQ+JykpIHsKJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgnPGZnPWRlZmF1bHQ7Ymc9ZGVmYXVsdD4nLCAnJywgJGNvbnRlbnQpOwokd2lkdGggLT0gXHN0cmxlbignPGZnPWRlZmF1bHQ7Ymc9ZGVmYXVsdD4nKTsKfQp9CgokcGFkVHlwZSA9ICRjZWxsLT5nZXRTdHlsZSgpLT5nZXRQYWRCeUFsaWduKCk7Cn0KCnJldHVybiBzcHJpbnRmKCRjZWxsRm9ybWF0LCBzdHJfcGFkKCRjb250ZW50LCAkd2lkdGgsICRzdHlsZS0+Z2V0UGFkZGluZ0NoYXIoKSwgJHBhZFR5cGUpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjYWxjdWxhdGVOdW1iZXJPZkNvbHVtbnMoYXJyYXkgJHJvd3MpCnsKJGNvbHVtbnMgPSBbMF07CmZvcmVhY2ggKCRyb3dzIGFzICRyb3cpIHsKaWYgKCRyb3cgaW5zdGFuY2VvZiBUYWJsZVNlcGFyYXRvcikgewpjb250aW51ZTsKfQoKJGNvbHVtbnNbXSA9ICR0aGlzLT5nZXROdW1iZXJPZkNvbHVtbnMoJHJvdyk7Cn0KCiR0aGlzLT5udW1iZXJPZkNvbHVtbnMgPSBtYXgoJGNvbHVtbnMpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkVGFibGVSb3dzKGFycmF5ICRyb3dzKTogVGFibGVSb3dzCnsKCiRmb3JtYXR0ZXIgPSAkdGhpcy0+b3V0cHV0LT5nZXRGb3JtYXR0ZXIoKTsKJHVubWVyZ2VkUm93cyA9IFtdOwpmb3IgKCRyb3dLZXkgPSAwOyAkcm93S2V5IDwgXGNvdW50KCRyb3dzKTsgKyskcm93S2V5KSB7CiRyb3dzID0gJHRoaXMtPmZpbGxOZXh0Um93cygkcm93cywgJHJvd0tleSk7CgoKZm9yZWFjaCAoJHJvd3NbJHJvd0tleV0gYXMgJGNvbHVtbiA9PiAkY2VsbCkgewokY29sc3BhbiA9ICRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsID8gJGNlbGwtPmdldENvbHNwYW4oKSA6IDE7CgppZiAoaXNzZXQoJHRoaXMtPmNvbHVtbk1heFdpZHRoc1skY29sdW1uXSkgJiYgSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJGZvcm1hdHRlciwgJGNlbGwpKSA+ICR0aGlzLT5jb2x1bW5NYXhXaWR0aHNbJGNvbHVtbl0pIHsKJGNlbGwgPSAkZm9ybWF0dGVyLT5mb3JtYXRBbmRXcmFwKCRjZWxsLCAkdGhpcy0+Y29sdW1uTWF4V2lkdGhzWyRjb2x1bW5dICogJGNvbHNwYW4pOwp9CmlmICghc3Ryc3RyKCRjZWxsID8/ICcnLCAiXG4iKSkgewpjb250aW51ZTsKfQokZW9sID0gc3RyX2NvbnRhaW5zKCRjZWxsID8/ICcnLCAiXHJcbiIpID8gIlxyXG4iIDogIlxuIjsKJGVzY2FwZWQgPSBpbXBsb2RlKCRlb2wsIGFycmF5X21hcChbT3V0cHV0Rm9ybWF0dGVyOjpjbGFzcywgJ2VzY2FwZVRyYWlsaW5nQmFja3NsYXNoJ10sIGV4cGxvZGUoJGVvbCwgJGNlbGwpKSk7CiRjZWxsID0gJGNlbGwgaW5zdGFuY2VvZiBUYWJsZUNlbGwgPyBuZXcgVGFibGVDZWxsKCRlc2NhcGVkLCBbJ2NvbHNwYW4nID0+ICRjZWxsLT5nZXRDb2xzcGFuKCldKSA6ICRlc2NhcGVkOwokbGluZXMgPSBleHBsb2RlKCRlb2wsIHN0cl9yZXBsYWNlKCRlb2wsICc8Zmc9ZGVmYXVsdDtiZz1kZWZhdWx0PjwvPicuJGVvbCwgJGNlbGwpKTsKZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lS2V5ID0+ICRsaW5lKSB7CmlmICgkY29sc3BhbiA+IDEpIHsKJGxpbmUgPSBuZXcgVGFibGVDZWxsKCRsaW5lLCBbJ2NvbHNwYW4nID0+ICRjb2xzcGFuXSk7Cn0KaWYgKDAgPT09ICRsaW5lS2V5KSB7CiRyb3dzWyRyb3dLZXldWyRjb2x1bW5dID0gJGxpbmU7Cn0gZWxzZSB7CmlmICghXGFycmF5X2tleV9leGlzdHMoJHJvd0tleSwgJHVubWVyZ2VkUm93cykgfHwgIVxhcnJheV9rZXlfZXhpc3RzKCRsaW5lS2V5LCAkdW5tZXJnZWRSb3dzWyRyb3dLZXldKSkgewokdW5tZXJnZWRSb3dzWyRyb3dLZXldWyRsaW5lS2V5XSA9ICR0aGlzLT5jb3B5Um93KCRyb3dzLCAkcm93S2V5KTsKfQokdW5tZXJnZWRSb3dzWyRyb3dLZXldWyRsaW5lS2V5XVskY29sdW1uXSA9ICRsaW5lOwp9Cn0KfQp9CgpyZXR1cm4gbmV3IFRhYmxlUm93cyhmdW5jdGlvbiAoKSB1c2UgKCRyb3dzLCAkdW5tZXJnZWRSb3dzKTogXFRyYXZlcnNhYmxlIHsKZm9yZWFjaCAoJHJvd3MgYXMgJHJvd0tleSA9PiAkcm93KSB7CiRyb3dHcm91cCA9IFskcm93IGluc3RhbmNlb2YgVGFibGVTZXBhcmF0b3IgPyAkcm93IDogJHRoaXMtPmZpbGxDZWxscygkcm93KV07CgppZiAoaXNzZXQoJHVubWVyZ2VkUm93c1skcm93S2V5XSkpIHsKZm9yZWFjaCAoJHVubWVyZ2VkUm93c1skcm93S2V5XSBhcyAkcm93KSB7CiRyb3dHcm91cFtdID0gJHJvdyBpbnN0YW5jZW9mIFRhYmxlU2VwYXJhdG9yID8gJHJvdyA6ICR0aGlzLT5maWxsQ2VsbHMoJHJvdyk7Cn0KfQp5aWVsZCAkcm93R3JvdXA7Cn0KfSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY2FsY3VsYXRlUm93Q291bnQoKTogaW50CnsKJG51bWJlck9mUm93cyA9IFxjb3VudChpdGVyYXRvcl90b19hcnJheSgkdGhpcy0+YnVpbGRUYWJsZVJvd3MoYXJyYXlfbWVyZ2UoJHRoaXMtPmhlYWRlcnMsIFtuZXcgVGFibGVTZXBhcmF0b3IoKV0sICR0aGlzLT5yb3dzKSkpKTsKCmlmICgkdGhpcy0+aGVhZGVycykgeworKyRudW1iZXJPZlJvd3M7IAp9CgppZiAoXGNvdW50KCR0aGlzLT5yb3dzKSA+IDApIHsKKyskbnVtYmVyT2ZSb3dzOyAKfQoKcmV0dXJuICRudW1iZXJPZlJvd3M7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaWxsTmV4dFJvd3MoYXJyYXkgJHJvd3MsIGludCAkbGluZSk6IGFycmF5CnsKJHVubWVyZ2VkUm93cyA9IFtdOwpmb3JlYWNoICgkcm93c1skbGluZV0gYXMgJGNvbHVtbiA9PiAkY2VsbCkgewppZiAobnVsbCAhPT0gJGNlbGwgJiYgISRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsICYmICFcaXNfc2NhbGFyKCRjZWxsKSAmJiAhKFxpc19vYmplY3QoJGNlbGwpICYmIG1ldGhvZF9leGlzdHMoJGNlbGwsICdfX3RvU3RyaW5nJykpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignQSBjZWxsIG11c3QgYmUgYSBUYWJsZUNlbGwsIGEgc2NhbGFyIG9yIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgIl9fdG9TdHJpbmcoKSIsICIlcyIgZ2l2ZW4uJywgZ2V0X2RlYnVnX3R5cGUoJGNlbGwpKSk7Cn0KaWYgKCRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsICYmICRjZWxsLT5nZXRSb3dzcGFuKCkgPiAxKSB7CiRuYkxpbmVzID0gJGNlbGwtPmdldFJvd3NwYW4oKSAtIDE7CiRsaW5lcyA9IFskY2VsbF07CmlmIChzdHJzdHIoJGNlbGwsICJcbiIpKSB7CiRlb2wgPSBzdHJfY29udGFpbnMoJGNlbGwsICJcclxuIikgPyAiXHJcbiIgOiAiXG4iOwokbGluZXMgPSBleHBsb2RlKCRlb2wsIHN0cl9yZXBsYWNlKCRlb2wsICc8Zmc9ZGVmYXVsdDtiZz1kZWZhdWx0PicuJGVvbC4nPC8+JywgJGNlbGwpKTsKJG5iTGluZXMgPSBcY291bnQoJGxpbmVzKSA+ICRuYkxpbmVzID8gc3Vic3RyX2NvdW50KCRjZWxsLCAkZW9sKSA6ICRuYkxpbmVzOwoKJHJvd3NbJGxpbmVdWyRjb2x1bW5dID0gbmV3IFRhYmxlQ2VsbCgkbGluZXNbMF0sIFsnY29sc3BhbicgPT4gJGNlbGwtPmdldENvbHNwYW4oKSwgJ3N0eWxlJyA9PiAkY2VsbC0+Z2V0U3R5bGUoKV0pOwp1bnNldCgkbGluZXNbMF0pOwp9CgoKJHVubWVyZ2VkUm93cyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKGFycmF5X2ZpbGwoJGxpbmUgKyAxLCAkbmJMaW5lcywgW10pLCAkdW5tZXJnZWRSb3dzKTsKZm9yZWFjaCAoJHVubWVyZ2VkUm93cyBhcyAkdW5tZXJnZWRSb3dLZXkgPT4gJHVubWVyZ2VkUm93KSB7CiR2YWx1ZSA9ICRsaW5lc1skdW5tZXJnZWRSb3dLZXkgLSAkbGluZV0gPz8gJyc7CiR1bm1lcmdlZFJvd3NbJHVubWVyZ2VkUm93S2V5XVskY29sdW1uXSA9IG5ldyBUYWJsZUNlbGwoJHZhbHVlLCBbJ2NvbHNwYW4nID0+ICRjZWxsLT5nZXRDb2xzcGFuKCksICdzdHlsZScgPT4gJGNlbGwtPmdldFN0eWxlKCldKTsKaWYgKCRuYkxpbmVzID09PSAkdW5tZXJnZWRSb3dLZXkgLSAkbGluZSkgewpicmVhazsKfQp9Cn0KfQoKZm9yZWFjaCAoJHVubWVyZ2VkUm93cyBhcyAkdW5tZXJnZWRSb3dLZXkgPT4gJHVubWVyZ2VkUm93KSB7CgppZiAoaXNzZXQoJHJvd3NbJHVubWVyZ2VkUm93S2V5XSkgJiYgXGlzX2FycmF5KCRyb3dzWyR1bm1lcmdlZFJvd0tleV0pICYmICgkdGhpcy0+Z2V0TnVtYmVyT2ZDb2x1bW5zKCRyb3dzWyR1bm1lcmdlZFJvd0tleV0pICsgJHRoaXMtPmdldE51bWJlck9mQ29sdW1ucygkdW5tZXJnZWRSb3dzWyR1bm1lcmdlZFJvd0tleV0pIDw9ICR0aGlzLT5udW1iZXJPZkNvbHVtbnMpKSB7CmZvcmVhY2ggKCR1bm1lcmdlZFJvdyBhcyAkY2VsbEtleSA9PiAkY2VsbCkgewoKYXJyYXlfc3BsaWNlKCRyb3dzWyR1bm1lcmdlZFJvd0tleV0sICRjZWxsS2V5LCAwLCBbJGNlbGxdKTsKfQp9IGVsc2Ugewokcm93ID0gJHRoaXMtPmNvcHlSb3coJHJvd3MsICR1bm1lcmdlZFJvd0tleSAtIDEpOwpmb3JlYWNoICgkdW5tZXJnZWRSb3cgYXMgJGNvbHVtbiA9PiAkY2VsbCkgewppZiAoIWVtcHR5KCRjZWxsKSkgewokcm93WyRjb2x1bW5dID0gJHVubWVyZ2VkUm93WyRjb2x1bW5dOwp9Cn0KYXJyYXlfc3BsaWNlKCRyb3dzLCAkdW5tZXJnZWRSb3dLZXksIDAsIFskcm93XSk7Cn0KfQoKcmV0dXJuICRyb3dzOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbGxDZWxscyhpdGVyYWJsZSAkcm93KQp7CiRuZXdSb3cgPSBbXTsKCmZvcmVhY2ggKCRyb3cgYXMgJGNvbHVtbiA9PiAkY2VsbCkgewokbmV3Um93W10gPSAkY2VsbDsKaWYgKCRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsICYmICRjZWxsLT5nZXRDb2xzcGFuKCkgPiAxKSB7CmZvcmVhY2ggKHJhbmdlKCRjb2x1bW4gKyAxLCAkY29sdW1uICsgJGNlbGwtPmdldENvbHNwYW4oKSAtIDEpIGFzICRwb3NpdGlvbikgewoKJG5ld1Jvd1tdID0gJyc7Cn0KfQp9CgpyZXR1cm4gJG5ld1JvdyA/OiAkcm93Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNvcHlSb3coYXJyYXkgJHJvd3MsIGludCAkbGluZSk6IGFycmF5CnsKJHJvdyA9ICRyb3dzWyRsaW5lXTsKZm9yZWFjaCAoJHJvdyBhcyAkY2VsbEtleSA9PiAkY2VsbFZhbHVlKSB7CiRyb3dbJGNlbGxLZXldID0gJyc7CmlmICgkY2VsbFZhbHVlIGluc3RhbmNlb2YgVGFibGVDZWxsKSB7CiRyb3dbJGNlbGxLZXldID0gbmV3IFRhYmxlQ2VsbCgnJywgWydjb2xzcGFuJyA9PiAkY2VsbFZhbHVlLT5nZXRDb2xzcGFuKCldKTsKfQp9CgpyZXR1cm4gJHJvdzsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXROdW1iZXJPZkNvbHVtbnMoYXJyYXkgJHJvdyk6IGludAp7CiRjb2x1bW5zID0gXGNvdW50KCRyb3cpOwpmb3JlYWNoICgkcm93IGFzICRjb2x1bW4pIHsKJGNvbHVtbnMgKz0gJGNvbHVtbiBpbnN0YW5jZW9mIFRhYmxlQ2VsbCA/ICgkY29sdW1uLT5nZXRDb2xzcGFuKCkgLSAxKSA6IDA7Cn0KCnJldHVybiAkY29sdW1uczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSb3dDb2x1bW5zKGFycmF5ICRyb3cpOiBhcnJheQp7CiRjb2x1bW5zID0gcmFuZ2UoMCwgJHRoaXMtPm51bWJlck9mQ29sdW1ucyAtIDEpOwpmb3JlYWNoICgkcm93IGFzICRjZWxsS2V5ID0+ICRjZWxsKSB7CmlmICgkY2VsbCBpbnN0YW5jZW9mIFRhYmxlQ2VsbCAmJiAkY2VsbC0+Z2V0Q29sc3BhbigpID4gMSkgewoKJGNvbHVtbnMgPSBhcnJheV9kaWZmKCRjb2x1bW5zLCByYW5nZSgkY2VsbEtleSArIDEsICRjZWxsS2V5ICsgJGNlbGwtPmdldENvbHNwYW4oKSAtIDEpKTsKfQp9CgpyZXR1cm4gJGNvbHVtbnM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2FsY3VsYXRlQ29sdW1uc1dpZHRoKGl0ZXJhYmxlICRncm91cHMpCnsKZm9yICgkY29sdW1uID0gMDsgJGNvbHVtbiA8ICR0aGlzLT5udW1iZXJPZkNvbHVtbnM7ICsrJGNvbHVtbikgewokbGVuZ3RocyA9IFtdOwpmb3JlYWNoICgkZ3JvdXBzIGFzICRncm91cCkgewpmb3JlYWNoICgkZ3JvdXAgYXMgJHJvdykgewppZiAoJHJvdyBpbnN0YW5jZW9mIFRhYmxlU2VwYXJhdG9yKSB7CmNvbnRpbnVlOwp9Cgpmb3JlYWNoICgkcm93IGFzICRpID0+ICRjZWxsKSB7CmlmICgkY2VsbCBpbnN0YW5jZW9mIFRhYmxlQ2VsbCkgewokdGV4dENvbnRlbnQgPSBIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCksICRjZWxsKTsKJHRleHRMZW5ndGggPSBIZWxwZXI6OndpZHRoKCR0ZXh0Q29udGVudCk7CmlmICgkdGV4dExlbmd0aCA+IDApIHsKJGNvbnRlbnRDb2x1bW5zID0gbWJfc3RyX3NwbGl0KCR0ZXh0Q29udGVudCwgY2VpbCgkdGV4dExlbmd0aCAvICRjZWxsLT5nZXRDb2xzcGFuKCkpKTsKZm9yZWFjaCAoJGNvbnRlbnRDb2x1bW5zIGFzICRwb3NpdGlvbiA9PiAkY29udGVudCkgewokcm93WyRpICsgJHBvc2l0aW9uXSA9ICRjb250ZW50Owp9Cn0KfQp9CgokbGVuZ3Roc1tdID0gJHRoaXMtPmdldENlbGxXaWR0aCgkcm93LCAkY29sdW1uKTsKfQp9CgokdGhpcy0+ZWZmZWN0aXZlQ29sdW1uV2lkdGhzWyRjb2x1bW5dID0gbWF4KCRsZW5ndGhzKSArIEhlbHBlcjo6d2lkdGgoJHRoaXMtPnN0eWxlLT5nZXRDZWxsUm93Q29udGVudEZvcm1hdCgpKSAtIDI7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDb2x1bW5TZXBhcmF0b3JXaWR0aCgpOiBpbnQKewpyZXR1cm4gSGVscGVyOjp3aWR0aChzcHJpbnRmKCR0aGlzLT5zdHlsZS0+Z2V0Qm9yZGVyRm9ybWF0KCksICR0aGlzLT5zdHlsZS0+Z2V0Qm9yZGVyQ2hhcnMoKVszXSkpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldENlbGxXaWR0aChhcnJheSAkcm93LCBpbnQgJGNvbHVtbik6IGludAp7CiRjZWxsV2lkdGggPSAwOwoKaWYgKGlzc2V0KCRyb3dbJGNvbHVtbl0pKSB7CiRjZWxsID0gJHJvd1skY29sdW1uXTsKJGNlbGxXaWR0aCA9IEhlbHBlcjo6d2lkdGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCR0aGlzLT5vdXRwdXQtPmdldEZvcm1hdHRlcigpLCAkY2VsbCkpOwp9CgokY29sdW1uV2lkdGggPSAkdGhpcy0+Y29sdW1uV2lkdGhzWyRjb2x1bW5dID8/IDA7CiRjZWxsV2lkdGggPSBtYXgoJGNlbGxXaWR0aCwgJGNvbHVtbldpZHRoKTsKCnJldHVybiBpc3NldCgkdGhpcy0+Y29sdW1uTWF4V2lkdGhzWyRjb2x1bW5dKSA/IG1pbigkdGhpcy0+Y29sdW1uTWF4V2lkdGhzWyRjb2x1bW5dLCAkY2VsbFdpZHRoKSA6ICRjZWxsV2lkdGg7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2xlYW51cCgpCnsKJHRoaXMtPmVmZmVjdGl2ZUNvbHVtbldpZHRocyA9IFtdOwokdGhpcy0+bnVtYmVyT2ZDb2x1bW5zID0gbnVsbDsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdFN0eWxlcygpOiBhcnJheQp7CiRib3JkZXJsZXNzID0gbmV3IFRhYmxlU3R5bGUoKTsKJGJvcmRlcmxlc3MKLT5zZXRIb3Jpem9udGFsQm9yZGVyQ2hhcnMoJz0nKQotPnNldFZlcnRpY2FsQm9yZGVyQ2hhcnMoJyAnKQotPnNldERlZmF1bHRDcm9zc2luZ0NoYXIoJyAnKQo7CgokY29tcGFjdCA9IG5ldyBUYWJsZVN0eWxlKCk7CiRjb21wYWN0Ci0+c2V0SG9yaXpvbnRhbEJvcmRlckNoYXJzKCcnKQotPnNldFZlcnRpY2FsQm9yZGVyQ2hhcnMoJycpCi0+c2V0RGVmYXVsdENyb3NzaW5nQ2hhcignJykKLT5zZXRDZWxsUm93Q29udGVudEZvcm1hdCgnJXMgJykKOwoKJHN0eWxlR3VpZGUgPSBuZXcgVGFibGVTdHlsZSgpOwokc3R5bGVHdWlkZQotPnNldEhvcml6b250YWxCb3JkZXJDaGFycygnLScpCi0+c2V0VmVydGljYWxCb3JkZXJDaGFycygnICcpCi0+c2V0RGVmYXVsdENyb3NzaW5nQ2hhcignICcpCi0+c2V0Q2VsbEhlYWRlckZvcm1hdCgnJXMnKQo7CgokYm94ID0gKG5ldyBUYWJsZVN0eWxlKCkpCi0+c2V0SG9yaXpvbnRhbEJvcmRlckNoYXJzKCfilIAnKQotPnNldFZlcnRpY2FsQm9yZGVyQ2hhcnMoJ+KUgicpCi0+c2V0Q3Jvc3NpbmdDaGFycygn4pS8JywgJ+KUjCcsICfilKwnLCAn4pSQJywgJ+KUpCcsICfilJgnLCAn4pS0JywgJ+KUlCcsICfilJwnKQo7CgokYm94RG91YmxlID0gKG5ldyBUYWJsZVN0eWxlKCkpCi0+c2V0SG9yaXpvbnRhbEJvcmRlckNoYXJzKCfilZAnLCAn4pSAJykKLT5zZXRWZXJ0aWNhbEJvcmRlckNoYXJzKCfilZEnLCAn4pSCJykKLT5zZXRDcm9zc2luZ0NoYXJzKCfilLwnLCAn4pWUJywgJ+KVpCcsICfilZcnLCAn4pWiJywgJ+KVnScsICfilacnLCAn4pWaJywgJ+KVnycsICfilaAnLCAn4pWqJywgJ+KVoycpCjsKCnJldHVybiBbCidkZWZhdWx0JyA9PiBuZXcgVGFibGVTdHlsZSgpLAonYm9yZGVybGVzcycgPT4gJGJvcmRlcmxlc3MsCidjb21wYWN0JyA9PiAkY29tcGFjdCwKJ3N5bWZvbnktc3R5bGUtZ3VpZGUnID0+ICRzdHlsZUd1aWRlLAonYm94JyA9PiAkYm94LAonYm94LWRvdWJsZScgPT4gJGJveERvdWJsZSwKXTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZXNvbHZlU3R5bGUoJG5hbWUpOiBUYWJsZVN0eWxlCnsKaWYgKCRuYW1lIGluc3RhbmNlb2YgVGFibGVTdHlsZSkgewpyZXR1cm4gJG5hbWU7Cn0KCmlmIChpc3NldChzZWxmOjokc3R5bGVzWyRuYW1lXSkpIHsKcmV0dXJuIHNlbGY6OiRzdHlsZXNbJG5hbWVdOwp9Cgp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1N0eWxlICIlcyIgaXMgbm90IGRlZmluZWQuJywgJG5hbWUpKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKCgoKY2xhc3MgVGFibGVDZWxsCnsKcHJpdmF0ZSAkdmFsdWU7CnByaXZhdGUgJG9wdGlvbnMgPSBbCidyb3dzcGFuJyA9PiAxLAonY29sc3BhbicgPT4gMSwKJ3N0eWxlJyA9PiBudWxsLApdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkdmFsdWUgPSAnJywgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+dmFsdWUgPSAkdmFsdWU7CgoKaWYgKCRkaWZmID0gYXJyYXlfZGlmZihhcnJheV9rZXlzKCRvcHRpb25zKSwgYXJyYXlfa2V5cygkdGhpcy0+b3B0aW9ucykpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIFRhYmxlQ2VsbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgb3B0aW9uczogXCclc1wnLicsIGltcGxvZGUoJ1wnLCBcJycsICRkaWZmKSkpOwp9CgppZiAoaXNzZXQoJG9wdGlvbnNbJ3N0eWxlJ10pICYmICEkb3B0aW9uc1snc3R5bGUnXSBpbnN0YW5jZW9mIFRhYmxlQ2VsbFN0eWxlKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBzdHlsZSBvcHRpb24gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiAiVGFibGVDZWxsU3R5bGUiLicpOwp9CgokdGhpcy0+b3B0aW9ucyA9IGFycmF5X21lcmdlKCR0aGlzLT5vcHRpb25zLCAkb3B0aW9ucyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CnJldHVybiAkdGhpcy0+dmFsdWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbHNwYW4oKQp7CnJldHVybiAoaW50KSAkdGhpcy0+b3B0aW9uc1snY29sc3BhbiddOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb3dzcGFuKCkKewpyZXR1cm4gKGludCkgJHRoaXMtPm9wdGlvbnNbJ3Jvd3NwYW4nXTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlKCk6ID9UYWJsZUNlbGxTdHlsZQp7CnJldHVybiAkdGhpcy0+b3B0aW9uc1snc3R5bGUnXTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKCgoKY2xhc3MgVGFibGVDZWxsU3R5bGUKewpwdWJsaWMgY29uc3QgREVGQVVMVF9BTElHTiA9ICdsZWZ0JzsKCnByaXZhdGUgY29uc3QgVEFHX09QVElPTlMgPSBbCidmZycsCidiZycsCidvcHRpb25zJywKXTsKCnByaXZhdGUgY29uc3QgQUxJR05fTUFQID0gWwonbGVmdCcgPT4gXFNUUl9QQURfUklHSFQsCidjZW50ZXInID0+IFxTVFJfUEFEX0JPVEgsCidyaWdodCcgPT4gXFNUUl9QQURfTEVGVCwKXTsKCnByaXZhdGUgJG9wdGlvbnMgPSBbCidmZycgPT4gJ2RlZmF1bHQnLAonYmcnID0+ICdkZWZhdWx0JywKJ29wdGlvbnMnID0+IG51bGwsCidhbGlnbicgPT4gc2VsZjo6REVGQVVMVF9BTElHTiwKJ2NlbGxGb3JtYXQnID0+IG51bGwsCl07CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJG9wdGlvbnMgPSBbXSkKewppZiAoJGRpZmYgPSBhcnJheV9kaWZmKGFycmF5X2tleXMoJG9wdGlvbnMpLCBhcnJheV9rZXlzKCR0aGlzLT5vcHRpb25zKSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgVGFibGVDZWxsU3R5bGUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IFwnJXNcJy4nLCBpbXBsb2RlKCdcJywgXCcnLCAkZGlmZikpKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydhbGlnbiddKSAmJiAhXGFycmF5X2tleV9leGlzdHMoJG9wdGlvbnNbJ2FsaWduJ10sIHNlbGY6OkFMSUdOX01BUCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdXcm9uZyBhbGlnbiB2YWx1ZS4gVmFsdWUgbXVzdCBiZSBmb2xsb3dpbmc6IFwnJXNcJy4nLCBpbXBsb2RlKCdcJywgXCcnLCBhcnJheV9rZXlzKHNlbGY6OkFMSUdOX01BUCkpKSk7Cn0KCiR0aGlzLT5vcHRpb25zID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm9wdGlvbnMsICRvcHRpb25zKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPm9wdGlvbnM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ09wdGlvbnMoKQp7CnJldHVybiBhcnJheV9maWx0ZXIoCiR0aGlzLT5nZXRPcHRpb25zKCksCmZ1bmN0aW9uICgka2V5KSB7CnJldHVybiBcaW5fYXJyYXkoJGtleSwgc2VsZjo6VEFHX09QVElPTlMpICYmIGlzc2V0KCR0aGlzLT5vcHRpb25zWyRrZXldKTsKfSwKXEFSUkFZX0ZJTFRFUl9VU0VfS0VZCik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWRCeUFsaWduKCkKewpyZXR1cm4gc2VsZjo6QUxJR05fTUFQWyR0aGlzLT5nZXRPcHRpb25zKClbJ2FsaWduJ11dOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2VsbEZvcm1hdCgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5nZXRPcHRpb25zKClbJ2NlbGxGb3JtYXQnXTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7CgoKCgpjbGFzcyBUYWJsZVJvd3MgaW1wbGVtZW50cyBcSXRlcmF0b3JBZ2dyZWdhdGUKewpwcml2YXRlICRnZW5lcmF0b3I7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXENsb3N1cmUgJGdlbmVyYXRvcikKewokdGhpcy0+Z2VuZXJhdG9yID0gJGdlbmVyYXRvcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKCk6IFxUcmF2ZXJzYWJsZQp7CnJldHVybiAoJHRoaXMtPmdlbmVyYXRvcikoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7CgoKCgoKCmNsYXNzIFRhYmxlU2VwYXJhdG9yIGV4dGVuZHMgVGFibGVDZWxsCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRvcHRpb25zID0gW10pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgnJywgJG9wdGlvbnMpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKCgoKCgoKCgpjbGFzcyBUYWJsZVN0eWxlCnsKcHJpdmF0ZSAkcGFkZGluZ0NoYXIgPSAnICc7CnByaXZhdGUgJGhvcml6b250YWxPdXRzaWRlQm9yZGVyQ2hhciA9ICctJzsKcHJpdmF0ZSAkaG9yaXpvbnRhbEluc2lkZUJvcmRlckNoYXIgPSAnLSc7CnByaXZhdGUgJHZlcnRpY2FsT3V0c2lkZUJvcmRlckNoYXIgPSAnfCc7CnByaXZhdGUgJHZlcnRpY2FsSW5zaWRlQm9yZGVyQ2hhciA9ICd8JzsKcHJpdmF0ZSAkY3Jvc3NpbmdDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ1RvcFJpZ2h0Q2hhciA9ICcrJzsKcHJpdmF0ZSAkY3Jvc3NpbmdUb3BNaWRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ1RvcExlZnRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ01pZFJpZ2h0Q2hhciA9ICcrJzsKcHJpdmF0ZSAkY3Jvc3NpbmdCb3R0b21SaWdodENoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nQm90dG9tTWlkQ2hhciA9ICcrJzsKcHJpdmF0ZSAkY3Jvc3NpbmdCb3R0b21MZWZ0Q2hhciA9ICcrJzsKcHJpdmF0ZSAkY3Jvc3NpbmdNaWRMZWZ0Q2hhciA9ICcrJzsKcHJpdmF0ZSAkY3Jvc3NpbmdUb3BMZWZ0Qm90dG9tQ2hhciA9ICcrJzsKcHJpdmF0ZSAkY3Jvc3NpbmdUb3BNaWRCb3R0b21DaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ1RvcFJpZ2h0Qm90dG9tQ2hhciA9ICcrJzsKcHJpdmF0ZSAkaGVhZGVyVGl0bGVGb3JtYXQgPSAnPGZnPWJsYWNrO2JnPXdoaXRlO29wdGlvbnM9Ym9sZD4gJXMgPC8+JzsKcHJpdmF0ZSAkZm9vdGVyVGl0bGVGb3JtYXQgPSAnPGZnPWJsYWNrO2JnPXdoaXRlO29wdGlvbnM9Ym9sZD4gJXMgPC8+JzsKcHJpdmF0ZSAkY2VsbEhlYWRlckZvcm1hdCA9ICc8aW5mbz4lczwvaW5mbz4nOwpwcml2YXRlICRjZWxsUm93Rm9ybWF0ID0gJyVzJzsKcHJpdmF0ZSAkY2VsbFJvd0NvbnRlbnRGb3JtYXQgPSAnICVzICc7CnByaXZhdGUgJGJvcmRlckZvcm1hdCA9ICclcyc7CnByaXZhdGUgJHBhZFR5cGUgPSBcU1RSX1BBRF9SSUdIVDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFBhZGRpbmdDaGFyKHN0cmluZyAkcGFkZGluZ0NoYXIpCnsKaWYgKCEkcGFkZGluZ0NoYXIpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdUaGUgcGFkZGluZyBjaGFyIG11c3Qgbm90IGJlIGVtcHR5LicpOwp9CgokdGhpcy0+cGFkZGluZ0NoYXIgPSAkcGFkZGluZ0NoYXI7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhZGRpbmdDaGFyKCkKewpyZXR1cm4gJHRoaXMtPnBhZGRpbmdDaGFyOwp9CgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhvcml6b250YWxCb3JkZXJDaGFycyhzdHJpbmcgJG91dHNpZGUsID9zdHJpbmcgJGluc2lkZSA9IG51bGwpOiBzZWxmCnsKJHRoaXMtPmhvcml6b250YWxPdXRzaWRlQm9yZGVyQ2hhciA9ICRvdXRzaWRlOwokdGhpcy0+aG9yaXpvbnRhbEluc2lkZUJvcmRlckNoYXIgPSAkaW5zaWRlID8/ICRvdXRzaWRlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJ0aWNhbEJvcmRlckNoYXJzKHN0cmluZyAkb3V0c2lkZSwgP3N0cmluZyAkaW5zaWRlID0gbnVsbCk6IHNlbGYKewokdGhpcy0+dmVydGljYWxPdXRzaWRlQm9yZGVyQ2hhciA9ICRvdXRzaWRlOwokdGhpcy0+dmVydGljYWxJbnNpZGVCb3JkZXJDaGFyID0gJGluc2lkZSA/PyAkb3V0c2lkZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Qm9yZGVyQ2hhcnMoKTogYXJyYXkKewpyZXR1cm4gWwokdGhpcy0+aG9yaXpvbnRhbE91dHNpZGVCb3JkZXJDaGFyLAokdGhpcy0+dmVydGljYWxPdXRzaWRlQm9yZGVyQ2hhciwKJHRoaXMtPmhvcml6b250YWxJbnNpZGVCb3JkZXJDaGFyLAokdGhpcy0+dmVydGljYWxJbnNpZGVCb3JkZXJDaGFyLApdOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENyb3NzaW5nQ2hhcnMoc3RyaW5nICRjcm9zcywgc3RyaW5nICR0b3BMZWZ0LCBzdHJpbmcgJHRvcE1pZCwgc3RyaW5nICR0b3BSaWdodCwgc3RyaW5nICRtaWRSaWdodCwgc3RyaW5nICRib3R0b21SaWdodCwgc3RyaW5nICRib3R0b21NaWQsIHN0cmluZyAkYm90dG9tTGVmdCwgc3RyaW5nICRtaWRMZWZ0LCA/c3RyaW5nICR0b3BMZWZ0Qm90dG9tID0gbnVsbCwgP3N0cmluZyAkdG9wTWlkQm90dG9tID0gbnVsbCwgP3N0cmluZyAkdG9wUmlnaHRCb3R0b20gPSBudWxsKTogc2VsZgp7CiR0aGlzLT5jcm9zc2luZ0NoYXIgPSAkY3Jvc3M7CiR0aGlzLT5jcm9zc2luZ1RvcExlZnRDaGFyID0gJHRvcExlZnQ7CiR0aGlzLT5jcm9zc2luZ1RvcE1pZENoYXIgPSAkdG9wTWlkOwokdGhpcy0+Y3Jvc3NpbmdUb3BSaWdodENoYXIgPSAkdG9wUmlnaHQ7CiR0aGlzLT5jcm9zc2luZ01pZFJpZ2h0Q2hhciA9ICRtaWRSaWdodDsKJHRoaXMtPmNyb3NzaW5nQm90dG9tUmlnaHRDaGFyID0gJGJvdHRvbVJpZ2h0OwokdGhpcy0+Y3Jvc3NpbmdCb3R0b21NaWRDaGFyID0gJGJvdHRvbU1pZDsKJHRoaXMtPmNyb3NzaW5nQm90dG9tTGVmdENoYXIgPSAkYm90dG9tTGVmdDsKJHRoaXMtPmNyb3NzaW5nTWlkTGVmdENoYXIgPSAkbWlkTGVmdDsKJHRoaXMtPmNyb3NzaW5nVG9wTGVmdEJvdHRvbUNoYXIgPSAkdG9wTGVmdEJvdHRvbSA/PyAkbWlkTGVmdDsKJHRoaXMtPmNyb3NzaW5nVG9wTWlkQm90dG9tQ2hhciA9ICR0b3BNaWRCb3R0b20gPz8gJGNyb3NzOwokdGhpcy0+Y3Jvc3NpbmdUb3BSaWdodEJvdHRvbUNoYXIgPSAkdG9wUmlnaHRCb3R0b20gPz8gJG1pZFJpZ2h0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWZhdWx0Q3Jvc3NpbmdDaGFyKHN0cmluZyAkY2hhcik6IHNlbGYKewpyZXR1cm4gJHRoaXMtPnNldENyb3NzaW5nQ2hhcnMoJGNoYXIsICRjaGFyLCAkY2hhciwgJGNoYXIsICRjaGFyLCAkY2hhciwgJGNoYXIsICRjaGFyLCAkY2hhcik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENyb3NzaW5nQ2hhcigpCnsKcmV0dXJuICR0aGlzLT5jcm9zc2luZ0NoYXI7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENyb3NzaW5nQ2hhcnMoKTogYXJyYXkKewpyZXR1cm4gWwokdGhpcy0+Y3Jvc3NpbmdDaGFyLAokdGhpcy0+Y3Jvc3NpbmdUb3BMZWZ0Q2hhciwKJHRoaXMtPmNyb3NzaW5nVG9wTWlkQ2hhciwKJHRoaXMtPmNyb3NzaW5nVG9wUmlnaHRDaGFyLAokdGhpcy0+Y3Jvc3NpbmdNaWRSaWdodENoYXIsCiR0aGlzLT5jcm9zc2luZ0JvdHRvbVJpZ2h0Q2hhciwKJHRoaXMtPmNyb3NzaW5nQm90dG9tTWlkQ2hhciwKJHRoaXMtPmNyb3NzaW5nQm90dG9tTGVmdENoYXIsCiR0aGlzLT5jcm9zc2luZ01pZExlZnRDaGFyLAokdGhpcy0+Y3Jvc3NpbmdUb3BMZWZ0Qm90dG9tQ2hhciwKJHRoaXMtPmNyb3NzaW5nVG9wTWlkQm90dG9tQ2hhciwKJHRoaXMtPmNyb3NzaW5nVG9wUmlnaHRCb3R0b21DaGFyLApdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDZWxsSGVhZGVyRm9ybWF0KHN0cmluZyAkY2VsbEhlYWRlckZvcm1hdCkKewokdGhpcy0+Y2VsbEhlYWRlckZvcm1hdCA9ICRjZWxsSGVhZGVyRm9ybWF0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsSGVhZGVyRm9ybWF0KCkKewpyZXR1cm4gJHRoaXMtPmNlbGxIZWFkZXJGb3JtYXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENlbGxSb3dGb3JtYXQoc3RyaW5nICRjZWxsUm93Rm9ybWF0KQp7CiR0aGlzLT5jZWxsUm93Rm9ybWF0ID0gJGNlbGxSb3dGb3JtYXQ7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENlbGxSb3dGb3JtYXQoKQp7CnJldHVybiAkdGhpcy0+Y2VsbFJvd0Zvcm1hdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q2VsbFJvd0NvbnRlbnRGb3JtYXQoc3RyaW5nICRjZWxsUm93Q29udGVudEZvcm1hdCkKewokdGhpcy0+Y2VsbFJvd0NvbnRlbnRGb3JtYXQgPSAkY2VsbFJvd0NvbnRlbnRGb3JtYXQ7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENlbGxSb3dDb250ZW50Rm9ybWF0KCkKewpyZXR1cm4gJHRoaXMtPmNlbGxSb3dDb250ZW50Rm9ybWF0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRCb3JkZXJGb3JtYXQoc3RyaW5nICRib3JkZXJGb3JtYXQpCnsKJHRoaXMtPmJvcmRlckZvcm1hdCA9ICRib3JkZXJGb3JtYXQ7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJvcmRlckZvcm1hdCgpCnsKcmV0dXJuICR0aGlzLT5ib3JkZXJGb3JtYXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFBhZFR5cGUoaW50ICRwYWRUeXBlKQp7CmlmICghXGluX2FycmF5KCRwYWRUeXBlLCBbXFNUUl9QQURfTEVGVCwgXFNUUl9QQURfUklHSFQsIFxTVFJfUEFEX0JPVEhdLCB0cnVlKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIHBhZGRpbmcgdHlwZS4gRXhwZWN0ZWQgb25lIG9mIChTVFJfUEFEX0xFRlQsIFNUUl9QQURfUklHSFQsIFNUUl9QQURfQk9USCkuJyk7Cn0KCiR0aGlzLT5wYWRUeXBlID0gJHBhZFR5cGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhZFR5cGUoKQp7CnJldHVybiAkdGhpcy0+cGFkVHlwZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlclRpdGxlRm9ybWF0KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+aGVhZGVyVGl0bGVGb3JtYXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWFkZXJUaXRsZUZvcm1hdChzdHJpbmcgJGZvcm1hdCk6IHNlbGYKewokdGhpcy0+aGVhZGVyVGl0bGVGb3JtYXQgPSAkZm9ybWF0OwoKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9vdGVyVGl0bGVGb3JtYXQoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5mb290ZXJUaXRsZUZvcm1hdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZvb3RlclRpdGxlRm9ybWF0KHN0cmluZyAkZm9ybWF0KTogc2VsZgp7CiR0aGlzLT5mb290ZXJUaXRsZUZvcm1hdCA9ICRmb3JtYXQ7CgpyZXR1cm4gJHRoaXM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBBcmd2SW5wdXQgZXh0ZW5kcyBJbnB1dAp7CnByaXZhdGUgJHRva2VuczsKcHJpdmF0ZSAkcGFyc2VkOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9hcnJheSAkYXJndiA9IG51bGwsID9JbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24gPSBudWxsKQp7CiRhcmd2ID0gJGFyZ3YgPz8gJF9TRVJWRVJbJ2FyZ3YnXSA/PyBbXTsKCgphcnJheV9zaGlmdCgkYXJndik7CgokdGhpcy0+dG9rZW5zID0gJGFyZ3Y7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRkZWZpbml0aW9uKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNldFRva2VucyhhcnJheSAkdG9rZW5zKQp7CiR0aGlzLT50b2tlbnMgPSAkdG9rZW5zOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2UoKQp7CiRwYXJzZU9wdGlvbnMgPSB0cnVlOwokdGhpcy0+cGFyc2VkID0gJHRoaXMtPnRva2VuczsKd2hpbGUgKG51bGwgIT09ICR0b2tlbiA9IGFycmF5X3NoaWZ0KCR0aGlzLT5wYXJzZWQpKSB7CiRwYXJzZU9wdGlvbnMgPSAkdGhpcy0+cGFyc2VUb2tlbigkdG9rZW4sICRwYXJzZU9wdGlvbnMpOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZVRva2VuKHN0cmluZyAkdG9rZW4sIGJvb2wgJHBhcnNlT3B0aW9ucyk6IGJvb2wKewppZiAoJHBhcnNlT3B0aW9ucyAmJiAnJyA9PSAkdG9rZW4pIHsKJHRoaXMtPnBhcnNlQXJndW1lbnQoJHRva2VuKTsKfSBlbHNlaWYgKCRwYXJzZU9wdGlvbnMgJiYgJy0tJyA9PSAkdG9rZW4pIHsKcmV0dXJuIGZhbHNlOwp9IGVsc2VpZiAoJHBhcnNlT3B0aW9ucyAmJiBzdHJfc3RhcnRzX3dpdGgoJHRva2VuLCAnLS0nKSkgewokdGhpcy0+cGFyc2VMb25nT3B0aW9uKCR0b2tlbik7Cn0gZWxzZWlmICgkcGFyc2VPcHRpb25zICYmICctJyA9PT0gJHRva2VuWzBdICYmICctJyAhPT0gJHRva2VuKSB7CiR0aGlzLT5wYXJzZVNob3J0T3B0aW9uKCR0b2tlbik7Cn0gZWxzZSB7CiR0aGlzLT5wYXJzZUFyZ3VtZW50KCR0b2tlbik7Cn0KCnJldHVybiAkcGFyc2VPcHRpb25zOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBhcnNlU2hvcnRPcHRpb24oc3RyaW5nICR0b2tlbikKewokbmFtZSA9IHN1YnN0cigkdG9rZW4sIDEpOwoKaWYgKFxzdHJsZW4oJG5hbWUpID4gMSkgewppZiAoJHRoaXMtPmRlZmluaXRpb24tPmhhc1Nob3J0Y3V0KCRuYW1lWzBdKSAmJiAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0T3B0aW9uRm9yU2hvcnRjdXQoJG5hbWVbMF0pLT5hY2NlcHRWYWx1ZSgpKSB7CgokdGhpcy0+YWRkU2hvcnRPcHRpb24oJG5hbWVbMF0sIHN1YnN0cigkbmFtZSwgMSkpOwp9IGVsc2UgewokdGhpcy0+cGFyc2VTaG9ydE9wdGlvblNldCgkbmFtZSk7Cn0KfSBlbHNlIHsKJHRoaXMtPmFkZFNob3J0T3B0aW9uKCRuYW1lLCBudWxsKTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcGFyc2VTaG9ydE9wdGlvblNldChzdHJpbmcgJG5hbWUpCnsKJGxlbiA9IFxzdHJsZW4oJG5hbWUpOwpmb3IgKCRpID0gMDsgJGkgPCAkbGVuOyArKyRpKSB7CmlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc1Nob3J0Y3V0KCRuYW1lWyRpXSkpIHsKJGVuY29kaW5nID0gbWJfZGV0ZWN0X2VuY29kaW5nKCRuYW1lLCBudWxsLCB0cnVlKTsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVGhlICItJXMiIG9wdGlvbiBkb2VzIG5vdCBleGlzdC4nLCBmYWxzZSA9PT0gJGVuY29kaW5nID8gJG5hbWVbJGldIDogbWJfc3Vic3RyKCRuYW1lLCAkaSwgMSwgJGVuY29kaW5nKSkpOwp9Cgokb3B0aW9uID0gJHRoaXMtPmRlZmluaXRpb24tPmdldE9wdGlvbkZvclNob3J0Y3V0KCRuYW1lWyRpXSk7CmlmICgkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpKSB7CiR0aGlzLT5hZGRMb25nT3B0aW9uKCRvcHRpb24tPmdldE5hbWUoKSwgJGkgPT09ICRsZW4gLSAxID8gbnVsbCA6IHN1YnN0cigkbmFtZSwgJGkgKyAxKSk7CgpicmVhazsKfSBlbHNlIHsKJHRoaXMtPmFkZExvbmdPcHRpb24oJG9wdGlvbi0+Z2V0TmFtZSgpLCBudWxsKTsKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcGFyc2VMb25nT3B0aW9uKHN0cmluZyAkdG9rZW4pCnsKJG5hbWUgPSBzdWJzdHIoJHRva2VuLCAyKTsKCmlmIChmYWxzZSAhPT0gJHBvcyA9IHN0cnBvcygkbmFtZSwgJz0nKSkgewppZiAoJycgPT09ICR2YWx1ZSA9IHN1YnN0cigkbmFtZSwgJHBvcyArIDEpKSB7CmFycmF5X3Vuc2hpZnQoJHRoaXMtPnBhcnNlZCwgJHZhbHVlKTsKfQokdGhpcy0+YWRkTG9uZ09wdGlvbihzdWJzdHIoJG5hbWUsIDAsICRwb3MpLCAkdmFsdWUpOwp9IGVsc2UgewokdGhpcy0+YWRkTG9uZ09wdGlvbigkbmFtZSwgbnVsbCk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBhcnNlQXJndW1lbnQoc3RyaW5nICR0b2tlbikKewokYyA9IFxjb3VudCgkdGhpcy0+YXJndW1lbnRzKTsKCgppZiAoJHRoaXMtPmRlZmluaXRpb24tPmhhc0FyZ3VtZW50KCRjKSkgewokYXJnID0gJHRoaXMtPmRlZmluaXRpb24tPmdldEFyZ3VtZW50KCRjKTsKJHRoaXMtPmFyZ3VtZW50c1skYXJnLT5nZXROYW1lKCldID0gJGFyZy0+aXNBcnJheSgpID8gWyR0b2tlbl0gOiAkdG9rZW47CgoKfSBlbHNlaWYgKCR0aGlzLT5kZWZpbml0aW9uLT5oYXNBcmd1bWVudCgkYyAtIDEpICYmICR0aGlzLT5kZWZpbml0aW9uLT5nZXRBcmd1bWVudCgkYyAtIDEpLT5pc0FycmF5KCkpIHsKJGFyZyA9ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRBcmd1bWVudCgkYyAtIDEpOwokdGhpcy0+YXJndW1lbnRzWyRhcmctPmdldE5hbWUoKV1bXSA9ICR0b2tlbjsKCgp9IGVsc2UgewokYWxsID0gJHRoaXMtPmRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpOwokc3ltZm9ueUNvbW1hbmROYW1lID0gbnVsbDsKaWYgKCgkaW5wdXRBcmd1bWVudCA9ICRhbGxbJGtleSA9IGFycmF5X2tleV9maXJzdCgkYWxsKV0gPz8gbnVsbCkgJiYgJ2NvbW1hbmQnID09PSAkaW5wdXRBcmd1bWVudC0+Z2V0TmFtZSgpKSB7CiRzeW1mb255Q29tbWFuZE5hbWUgPSAkdGhpcy0+YXJndW1lbnRzWydjb21tYW5kJ10gPz8gbnVsbDsKdW5zZXQoJGFsbFska2V5XSk7Cn0KCmlmIChcY291bnQoJGFsbCkpIHsKaWYgKCRzeW1mb255Q29tbWFuZE5hbWUpIHsKJG1lc3NhZ2UgPSBzcHJpbnRmKCdUb28gbWFueSBhcmd1bWVudHMgdG8gIiVzIiBjb21tYW5kLCBleHBlY3RlZCBhcmd1bWVudHMgIiVzIi4nLCAkc3ltZm9ueUNvbW1hbmROYW1lLCBpbXBsb2RlKCciICInLCBhcnJheV9rZXlzKCRhbGwpKSk7Cn0gZWxzZSB7CiRtZXNzYWdlID0gc3ByaW50ZignVG9vIG1hbnkgYXJndW1lbnRzLCBleHBlY3RlZCBhcmd1bWVudHMgIiVzIi4nLCBpbXBsb2RlKCciICInLCBhcnJheV9rZXlzKCRhbGwpKSk7Cn0KfSBlbHNlaWYgKCRzeW1mb255Q29tbWFuZE5hbWUpIHsKJG1lc3NhZ2UgPSBzcHJpbnRmKCdObyBhcmd1bWVudHMgZXhwZWN0ZWQgZm9yICIlcyIgY29tbWFuZCwgZ290ICIlcyIuJywgJHN5bWZvbnlDb21tYW5kTmFtZSwgJHRva2VuKTsKfSBlbHNlIHsKJG1lc3NhZ2UgPSBzcHJpbnRmKCdObyBhcmd1bWVudHMgZXhwZWN0ZWQsIGdvdCAiJXMiLicsICR0b2tlbik7Cn0KCnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCRtZXNzYWdlKTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkU2hvcnRPcHRpb24oc3RyaW5nICRzaG9ydGN1dCwgJHZhbHVlKQp7CmlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc1Nob3J0Y3V0KCRzaG9ydGN1dCkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVGhlICItJXMiIG9wdGlvbiBkb2VzIG5vdCBleGlzdC4nLCAkc2hvcnRjdXQpKTsKfQoKJHRoaXMtPmFkZExvbmdPcHRpb24oJHRoaXMtPmRlZmluaXRpb24tPmdldE9wdGlvbkZvclNob3J0Y3V0KCRzaG9ydGN1dCktPmdldE5hbWUoKSwgJHZhbHVlKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFkZExvbmdPcHRpb24oc3RyaW5nICRuYW1lLCAkdmFsdWUpCnsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzT3B0aW9uKCRuYW1lKSkgewppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNOZWdhdGlvbigkbmFtZSkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVGhlICItLSVzIiBvcHRpb24gZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKJG9wdGlvbk5hbWUgPSAkdGhpcy0+ZGVmaW5pdGlvbi0+bmVnYXRpb25Ub05hbWUoJG5hbWUpOwppZiAobnVsbCAhPT0gJHZhbHVlKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiLS0lcyIgb3B0aW9uIGRvZXMgbm90IGFjY2VwdCBhIHZhbHVlLicsICRuYW1lKSk7Cn0KJHRoaXMtPm9wdGlvbnNbJG9wdGlvbk5hbWVdID0gZmFsc2U7CgpyZXR1cm47Cn0KCiRvcHRpb24gPSAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0T3B0aW9uKCRuYW1lKTsKCmlmIChudWxsICE9PSAkdmFsdWUgJiYgISRvcHRpb24tPmFjY2VwdFZhbHVlKCkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVGhlICItLSVzIiBvcHRpb24gZG9lcyBub3QgYWNjZXB0IGEgdmFsdWUuJywgJG5hbWUpKTsKfQoKaWYgKFxpbl9hcnJheSgkdmFsdWUsIFsnJywgbnVsbF0sIHRydWUpICYmICRvcHRpb24tPmFjY2VwdFZhbHVlKCkgJiYgXGNvdW50KCR0aGlzLT5wYXJzZWQpKSB7CgoKJG5leHQgPSBhcnJheV9zaGlmdCgkdGhpcy0+cGFyc2VkKTsKaWYgKChpc3NldCgkbmV4dFswXSkgJiYgJy0nICE9PSAkbmV4dFswXSkgfHwgXGluX2FycmF5KCRuZXh0LCBbJycsIG51bGxdLCB0cnVlKSkgewokdmFsdWUgPSAkbmV4dDsKfSBlbHNlIHsKYXJyYXlfdW5zaGlmdCgkdGhpcy0+cGFyc2VkLCAkbmV4dCk7Cn0KfQoKaWYgKG51bGwgPT09ICR2YWx1ZSkgewppZiAoJG9wdGlvbi0+aXNWYWx1ZVJlcXVpcmVkKCkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVGhlICItLSVzIiBvcHRpb24gcmVxdWlyZXMgYSB2YWx1ZS4nLCAkbmFtZSkpOwp9CgppZiAoISRvcHRpb24tPmlzQXJyYXkoKSAmJiAhJG9wdGlvbi0+aXNWYWx1ZU9wdGlvbmFsKCkpIHsKJHZhbHVlID0gdHJ1ZTsKfQp9CgppZiAoJG9wdGlvbi0+aXNBcnJheSgpKSB7CiR0aGlzLT5vcHRpb25zWyRuYW1lXVtdID0gJHZhbHVlOwp9IGVsc2UgewokdGhpcy0+b3B0aW9uc1skbmFtZV0gPSAkdmFsdWU7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpcnN0QXJndW1lbnQoKQp7CiRpc09wdGlvbiA9IGZhbHNlOwpmb3JlYWNoICgkdGhpcy0+dG9rZW5zIGFzICRpID0+ICR0b2tlbikgewppZiAoJHRva2VuICYmICctJyA9PT0gJHRva2VuWzBdKSB7CmlmIChzdHJfY29udGFpbnMoJHRva2VuLCAnPScpIHx8ICFpc3NldCgkdGhpcy0+dG9rZW5zWyRpICsgMV0pKSB7CmNvbnRpbnVlOwp9CgoKCiRuYW1lID0gJy0nID09PSAkdG9rZW5bMV0gPyBzdWJzdHIoJHRva2VuLCAyKSA6IHN1YnN0cigkdG9rZW4sIC0xKTsKaWYgKCFpc3NldCgkdGhpcy0+b3B0aW9uc1skbmFtZV0pICYmICEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzU2hvcnRjdXQoJG5hbWUpKSB7Cgp9IGVsc2VpZiAoKGlzc2V0KCR0aGlzLT5vcHRpb25zWyRuYW1lXSkgfHwgaXNzZXQoJHRoaXMtPm9wdGlvbnNbJG5hbWUgPSAkdGhpcy0+ZGVmaW5pdGlvbi0+c2hvcnRjdXRUb05hbWUoJG5hbWUpXSkpICYmICR0aGlzLT50b2tlbnNbJGkgKyAxXSA9PT0gJHRoaXMtPm9wdGlvbnNbJG5hbWVdKSB7CiRpc09wdGlvbiA9IHRydWU7Cn0KCmNvbnRpbnVlOwp9CgppZiAoJGlzT3B0aW9uKSB7CiRpc09wdGlvbiA9IGZhbHNlOwpjb250aW51ZTsKfQoKcmV0dXJuICR0b2tlbjsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNQYXJhbWV0ZXJPcHRpb24oJHZhbHVlcywgYm9vbCAkb25seVBhcmFtcyA9IGZhbHNlKQp7CiR2YWx1ZXMgPSAoYXJyYXkpICR2YWx1ZXM7Cgpmb3JlYWNoICgkdGhpcy0+dG9rZW5zIGFzICR0b2tlbikgewppZiAoJG9ubHlQYXJhbXMgJiYgJy0tJyA9PT0gJHRva2VuKSB7CnJldHVybiBmYWxzZTsKfQpmb3JlYWNoICgkdmFsdWVzIGFzICR2YWx1ZSkgewoKCgokbGVhZGluZyA9IHN0cl9zdGFydHNfd2l0aCgkdmFsdWUsICctLScpID8gJHZhbHVlLic9JyA6ICR2YWx1ZTsKaWYgKCR0b2tlbiA9PT0gJHZhbHVlIHx8ICcnICE9PSAkbGVhZGluZyAmJiBzdHJfc3RhcnRzX3dpdGgoJHRva2VuLCAkbGVhZGluZykpIHsKcmV0dXJuIHRydWU7Cn0KfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYXJhbWV0ZXJPcHRpb24oJHZhbHVlcywgJGRlZmF1bHQgPSBmYWxzZSwgYm9vbCAkb25seVBhcmFtcyA9IGZhbHNlKQp7CiR2YWx1ZXMgPSAoYXJyYXkpICR2YWx1ZXM7CiR0b2tlbnMgPSAkdGhpcy0+dG9rZW5zOwoKd2hpbGUgKDAgPCBcY291bnQoJHRva2VucykpIHsKJHRva2VuID0gYXJyYXlfc2hpZnQoJHRva2Vucyk7CmlmICgkb25seVBhcmFtcyAmJiAnLS0nID09PSAkdG9rZW4pIHsKcmV0dXJuICRkZWZhdWx0Owp9Cgpmb3JlYWNoICgkdmFsdWVzIGFzICR2YWx1ZSkgewppZiAoJHRva2VuID09PSAkdmFsdWUpIHsKcmV0dXJuIGFycmF5X3NoaWZ0KCR0b2tlbnMpOwp9CgoKCiRsZWFkaW5nID0gc3RyX3N0YXJ0c193aXRoKCR2YWx1ZSwgJy0tJykgPyAkdmFsdWUuJz0nIDogJHZhbHVlOwppZiAoJycgIT09ICRsZWFkaW5nICYmIHN0cl9zdGFydHNfd2l0aCgkdG9rZW4sICRsZWFkaW5nKSkgewpyZXR1cm4gc3Vic3RyKCR0b2tlbiwgXHN0cmxlbigkbGVhZGluZykpOwp9Cn0KfQoKcmV0dXJuICRkZWZhdWx0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewokdG9rZW5zID0gYXJyYXlfbWFwKGZ1bmN0aW9uICgkdG9rZW4pIHsKaWYgKHByZWdfbWF0Y2goJ3teKC1bXj1dKz0pKC4rKX0nLCAkdG9rZW4sICRtYXRjaCkpIHsKcmV0dXJuICRtYXRjaFsxXS4kdGhpcy0+ZXNjYXBlVG9rZW4oJG1hdGNoWzJdKTsKfQoKaWYgKCR0b2tlbiAmJiAnLScgIT09ICR0b2tlblswXSkgewpyZXR1cm4gJHRoaXMtPmVzY2FwZVRva2VuKCR0b2tlbik7Cn0KCnJldHVybiAkdG9rZW47Cn0sICR0aGlzLT50b2tlbnMpOwoKcmV0dXJuIGltcGxvZGUoJyAnLCAkdG9rZW5zKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkT3B0aW9uRXhjZXB0aW9uOwoKCgoKCgoKCgoKY2xhc3MgQXJyYXlJbnB1dCBleHRlbmRzIElucHV0CnsKcHJpdmF0ZSAkcGFyYW1ldGVyczsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcGFyYW1ldGVycywgP0lucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbiA9IG51bGwpCnsKJHRoaXMtPnBhcmFtZXRlcnMgPSAkcGFyYW1ldGVyczsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGRlZmluaXRpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rmlyc3RBcmd1bWVudCgpCnsKZm9yZWFjaCAoJHRoaXMtPnBhcmFtZXRlcnMgYXMgJHBhcmFtID0+ICR2YWx1ZSkgewppZiAoJHBhcmFtICYmIFxpc19zdHJpbmcoJHBhcmFtKSAmJiAnLScgPT09ICRwYXJhbVswXSkgewpjb250aW51ZTsKfQoKcmV0dXJuICR2YWx1ZTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNQYXJhbWV0ZXJPcHRpb24oJHZhbHVlcywgYm9vbCAkb25seVBhcmFtcyA9IGZhbHNlKQp7CiR2YWx1ZXMgPSAoYXJyYXkpICR2YWx1ZXM7Cgpmb3JlYWNoICgkdGhpcy0+cGFyYW1ldGVycyBhcyAkayA9PiAkdikgewppZiAoIVxpc19pbnQoJGspKSB7CiR2ID0gJGs7Cn0KCmlmICgkb25seVBhcmFtcyAmJiAnLS0nID09PSAkdikgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChcaW5fYXJyYXkoJHYsICR2YWx1ZXMpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhcmFtZXRlck9wdGlvbigkdmFsdWVzLCAkZGVmYXVsdCA9IGZhbHNlLCBib29sICRvbmx5UGFyYW1zID0gZmFsc2UpCnsKJHZhbHVlcyA9IChhcnJheSkgJHZhbHVlczsKCmZvcmVhY2ggKCR0aGlzLT5wYXJhbWV0ZXJzIGFzICRrID0+ICR2KSB7CmlmICgkb25seVBhcmFtcyAmJiAoJy0tJyA9PT0gJGsgfHwgKFxpc19pbnQoJGspICYmICctLScgPT09ICR2KSkpIHsKcmV0dXJuICRkZWZhdWx0Owp9CgppZiAoXGlzX2ludCgkaykpIHsKaWYgKFxpbl9hcnJheSgkdiwgJHZhbHVlcykpIHsKcmV0dXJuIHRydWU7Cn0KfSBlbHNlaWYgKFxpbl9hcnJheSgkaywgJHZhbHVlcykpIHsKcmV0dXJuICR2Owp9Cn0KCnJldHVybiAkZGVmYXVsdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKJHBhcmFtcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cGFyYW1ldGVycyBhcyAkcGFyYW0gPT4gJHZhbCkgewppZiAoJHBhcmFtICYmIFxpc19zdHJpbmcoJHBhcmFtKSAmJiAnLScgPT09ICRwYXJhbVswXSkgewokZ2x1ZSA9ICgnLScgPT09ICRwYXJhbVsxXSkgPyAnPScgOiAnICc7CmlmIChcaXNfYXJyYXkoJHZhbCkpIHsKZm9yZWFjaCAoJHZhbCBhcyAkdikgewokcGFyYW1zW10gPSAkcGFyYW0uKCcnICE9ICR2ID8gJGdsdWUuJHRoaXMtPmVzY2FwZVRva2VuKCR2KSA6ICcnKTsKfQp9IGVsc2UgewokcGFyYW1zW10gPSAkcGFyYW0uKCcnICE9ICR2YWwgPyAkZ2x1ZS4kdGhpcy0+ZXNjYXBlVG9rZW4oJHZhbCkgOiAnJyk7Cn0KfSBlbHNlIHsKJHBhcmFtc1tdID0gXGlzX2FycmF5KCR2YWwpID8gaW1wbG9kZSgnICcsIGFycmF5X21hcChbJHRoaXMsICdlc2NhcGVUb2tlbiddLCAkdmFsKSkgOiAkdGhpcy0+ZXNjYXBlVG9rZW4oJHZhbCk7Cn0KfQoKcmV0dXJuIGltcGxvZGUoJyAnLCAkcGFyYW1zKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlKCkKewpmb3JlYWNoICgkdGhpcy0+cGFyYW1ldGVycyBhcyAka2V5ID0+ICR2YWx1ZSkgewppZiAoJy0tJyA9PT0gJGtleSkgewpyZXR1cm47Cn0KaWYgKHN0cl9zdGFydHNfd2l0aCgka2V5LCAnLS0nKSkgewokdGhpcy0+YWRkTG9uZ09wdGlvbihzdWJzdHIoJGtleSwgMiksICR2YWx1ZSk7Cn0gZWxzZWlmIChzdHJfc3RhcnRzX3dpdGgoJGtleSwgJy0nKSkgewokdGhpcy0+YWRkU2hvcnRPcHRpb24oc3Vic3RyKCRrZXksIDEpLCAkdmFsdWUpOwp9IGVsc2UgewokdGhpcy0+YWRkQXJndW1lbnQoJGtleSwgJHZhbHVlKTsKfQp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhZGRTaG9ydE9wdGlvbihzdHJpbmcgJHNob3J0Y3V0LCAkdmFsdWUpCnsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzU2hvcnRjdXQoJHNob3J0Y3V0KSkgewp0aHJvdyBuZXcgSW52YWxpZE9wdGlvbkV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0lcyIgb3B0aW9uIGRvZXMgbm90IGV4aXN0LicsICRzaG9ydGN1dCkpOwp9CgokdGhpcy0+YWRkTG9uZ09wdGlvbigkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0T3B0aW9uRm9yU2hvcnRjdXQoJHNob3J0Y3V0KS0+Z2V0TmFtZSgpLCAkdmFsdWUpOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFkZExvbmdPcHRpb24oc3RyaW5nICRuYW1lLCAkdmFsdWUpCnsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzT3B0aW9uKCRuYW1lKSkgewppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNOZWdhdGlvbigkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRPcHRpb25FeGNlcHRpb24oc3ByaW50ZignVGhlICItLSVzIiBvcHRpb24gZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKJG9wdGlvbk5hbWUgPSAkdGhpcy0+ZGVmaW5pdGlvbi0+bmVnYXRpb25Ub05hbWUoJG5hbWUpOwokdGhpcy0+b3B0aW9uc1skb3B0aW9uTmFtZV0gPSBmYWxzZTsKCnJldHVybjsKfQoKJG9wdGlvbiA9ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb24oJG5hbWUpOwoKaWYgKG51bGwgPT09ICR2YWx1ZSkgewppZiAoJG9wdGlvbi0+aXNWYWx1ZVJlcXVpcmVkKCkpIHsKdGhyb3cgbmV3IEludmFsaWRPcHRpb25FeGNlcHRpb24oc3ByaW50ZignVGhlICItLSVzIiBvcHRpb24gcmVxdWlyZXMgYSB2YWx1ZS4nLCAkbmFtZSkpOwp9CgppZiAoISRvcHRpb24tPmlzVmFsdWVPcHRpb25hbCgpKSB7CiR2YWx1ZSA9IHRydWU7Cn0KfQoKJHRoaXMtPm9wdGlvbnNbJG5hbWVdID0gJHZhbHVlOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkQXJndW1lbnQoJG5hbWUsICR2YWx1ZSkKewppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNBcmd1bWVudCgkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIiVzIiBhcmd1bWVudCBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgokdGhpcy0+YXJndW1lbnRzWyRuYW1lXSA9ICR2YWx1ZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBJbnB1dCBpbXBsZW1lbnRzIElucHV0SW50ZXJmYWNlLCBTdHJlYW1hYmxlSW5wdXRJbnRlcmZhY2UKewpwcm90ZWN0ZWQgJGRlZmluaXRpb247CnByb3RlY3RlZCAkc3RyZWFtOwpwcm90ZWN0ZWQgJG9wdGlvbnMgPSBbXTsKcHJvdGVjdGVkICRhcmd1bWVudHMgPSBbXTsKcHJvdGVjdGVkICRpbnRlcmFjdGl2ZSA9IHRydWU7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0lucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbiA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRkZWZpbml0aW9uKSB7CiR0aGlzLT5kZWZpbml0aW9uID0gbmV3IElucHV0RGVmaW5pdGlvbigpOwp9IGVsc2UgewokdGhpcy0+YmluZCgkZGVmaW5pdGlvbik7CiR0aGlzLT52YWxpZGF0ZSgpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBiaW5kKElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbikKewokdGhpcy0+YXJndW1lbnRzID0gW107CiR0aGlzLT5vcHRpb25zID0gW107CiR0aGlzLT5kZWZpbml0aW9uID0gJGRlZmluaXRpb247CgokdGhpcy0+cGFyc2UoKTsKfQoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlKCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKQp7CiRkZWZpbml0aW9uID0gJHRoaXMtPmRlZmluaXRpb247CiRnaXZlbkFyZ3VtZW50cyA9ICR0aGlzLT5hcmd1bWVudHM7CgokbWlzc2luZ0FyZ3VtZW50cyA9IGFycmF5X2ZpbHRlcihhcnJheV9rZXlzKCRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSksIGZ1bmN0aW9uICgkYXJndW1lbnQpIHVzZSAoJGRlZmluaXRpb24sICRnaXZlbkFyZ3VtZW50cykgewpyZXR1cm4gIVxhcnJheV9rZXlfZXhpc3RzKCRhcmd1bWVudCwgJGdpdmVuQXJndW1lbnRzKSAmJiAkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnQoJGFyZ3VtZW50KS0+aXNSZXF1aXJlZCgpOwp9KTsKCmlmIChcY291bnQoJG1pc3NpbmdBcmd1bWVudHMpID4gMCkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyAobWlzc2luZzogIiVzIikuJywgaW1wbG9kZSgnLCAnLCAkbWlzc2luZ0FyZ3VtZW50cykpKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSgpCnsKcmV0dXJuICR0aGlzLT5pbnRlcmFjdGl2ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEludGVyYWN0aXZlKGJvb2wgJGludGVyYWN0aXZlKQp7CiR0aGlzLT5pbnRlcmFjdGl2ZSA9ICRpbnRlcmFjdGl2ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50cygpCnsKcmV0dXJuIGFycmF5X21lcmdlKCR0aGlzLT5kZWZpbml0aW9uLT5nZXRBcmd1bWVudERlZmF1bHRzKCksICR0aGlzLT5hcmd1bWVudHMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnQoc3RyaW5nICRuYW1lKQp7CmlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc0FyZ3VtZW50KCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiJXMiIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCnJldHVybiAkdGhpcy0+YXJndW1lbnRzWyRuYW1lXSA/PyAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnQoJG5hbWUpLT5nZXREZWZhdWx0KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmd1bWVudChzdHJpbmcgJG5hbWUsICR2YWx1ZSkKewppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNBcmd1bWVudCgkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIiVzIiBhcmd1bWVudCBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgokdGhpcy0+YXJndW1lbnRzWyRuYW1lXSA9ICR2YWx1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0FyZ3VtZW50KHN0cmluZyAkbmFtZSkKewpyZXR1cm4gJHRoaXMtPmRlZmluaXRpb24tPmhhc0FyZ3VtZW50KCRuYW1lKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbnMoKQp7CnJldHVybiBhcnJheV9tZXJnZSgkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0T3B0aW9uRGVmYXVsdHMoKSwgJHRoaXMtPm9wdGlvbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9uKHN0cmluZyAkbmFtZSkKewppZiAoJHRoaXMtPmRlZmluaXRpb24tPmhhc05lZ2F0aW9uKCRuYW1lKSkgewppZiAobnVsbCA9PT0gJHZhbHVlID0gJHRoaXMtPmdldE9wdGlvbigkdGhpcy0+ZGVmaW5pdGlvbi0+bmVnYXRpb25Ub05hbWUoJG5hbWUpKSkgewpyZXR1cm4gJHZhbHVlOwp9CgpyZXR1cm4gISR2YWx1ZTsKfQoKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzT3B0aW9uKCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiJXMiIG9wdGlvbiBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgpyZXR1cm4gXGFycmF5X2tleV9leGlzdHMoJG5hbWUsICR0aGlzLT5vcHRpb25zKSA/ICR0aGlzLT5vcHRpb25zWyRuYW1lXSA6ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb24oJG5hbWUpLT5nZXREZWZhdWx0KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb24oc3RyaW5nICRuYW1lLCAkdmFsdWUpCnsKaWYgKCR0aGlzLT5kZWZpbml0aW9uLT5oYXNOZWdhdGlvbigkbmFtZSkpIHsKJHRoaXMtPm9wdGlvbnNbJHRoaXMtPmRlZmluaXRpb24tPm5lZ2F0aW9uVG9OYW1lKCRuYW1lKV0gPSAhJHZhbHVlOwoKcmV0dXJuOwp9IGVsc2VpZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNPcHRpb24oJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcyIgb3B0aW9uIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCiR0aGlzLT5vcHRpb25zWyRuYW1lXSA9ICR2YWx1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc09wdGlvbihzdHJpbmcgJG5hbWUpCnsKcmV0dXJuICR0aGlzLT5kZWZpbml0aW9uLT5oYXNPcHRpb24oJG5hbWUpIHx8ICR0aGlzLT5kZWZpbml0aW9uLT5oYXNOZWdhdGlvbigkbmFtZSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVzY2FwZVRva2VuKHN0cmluZyAkdG9rZW4pCnsKcmV0dXJuIHByZWdfbWF0Y2goJ3teW1x3LV0rJH0nLCAkdG9rZW4pID8gJHRva2VuIDogZXNjYXBlc2hlbGxhcmcoJHRva2VuKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0cmVhbSgkc3RyZWFtKQp7CiR0aGlzLT5zdHJlYW0gPSAkc3RyZWFtOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RyZWFtKCkKewpyZXR1cm4gJHRoaXMtPnN0cmVhbTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgSW5wdXRBcmd1bWVudAp7CnB1YmxpYyBjb25zdCBSRVFVSVJFRCA9IDE7CnB1YmxpYyBjb25zdCBPUFRJT05BTCA9IDI7CnB1YmxpYyBjb25zdCBJU19BUlJBWSA9IDQ7Cgpwcml2YXRlICRuYW1lOwpwcml2YXRlICRtb2RlOwpwcml2YXRlICRkZWZhdWx0Owpwcml2YXRlICRkZXNjcmlwdGlvbjsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgP2ludCAkbW9kZSA9IG51bGwsIHN0cmluZyAkZGVzY3JpcHRpb24gPSAnJywgJGRlZmF1bHQgPSBudWxsKQp7CmlmIChudWxsID09PSAkbW9kZSkgewokbW9kZSA9IHNlbGY6Ok9QVElPTkFMOwp9IGVsc2VpZiAoJG1vZGUgPiA3IHx8ICRtb2RlIDwgMSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0FyZ3VtZW50IG1vZGUgIiVzIiBpcyBub3QgdmFsaWQuJywgJG1vZGUpKTsKfQoKJHRoaXMtPm5hbWUgPSAkbmFtZTsKJHRoaXMtPm1vZGUgPSAkbW9kZTsKJHRoaXMtPmRlc2NyaXB0aW9uID0gJGRlc2NyaXB0aW9uOwoKJHRoaXMtPnNldERlZmF1bHQoJGRlZmF1bHQpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKewpyZXR1cm4gJHRoaXMtPm5hbWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUmVxdWlyZWQoKQp7CnJldHVybiBzZWxmOjpSRVFVSVJFRCA9PT0gKHNlbGY6OlJFUVVJUkVEICYgJHRoaXMtPm1vZGUpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0FycmF5KCkKewpyZXR1cm4gc2VsZjo6SVNfQVJSQVkgPT09IChzZWxmOjpJU19BUlJBWSAmICR0aGlzLT5tb2RlKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWZhdWx0KCRkZWZhdWx0ID0gbnVsbCkKewppZiAoJHRoaXMtPmlzUmVxdWlyZWQoKSAmJiBudWxsICE9PSAkZGVmYXVsdCkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0Nhbm5vdCBzZXQgYSBkZWZhdWx0IHZhbHVlIGV4Y2VwdCBmb3IgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwgbW9kZS4nKTsKfQoKaWYgKCR0aGlzLT5pc0FycmF5KCkpIHsKaWYgKG51bGwgPT09ICRkZWZhdWx0KSB7CiRkZWZhdWx0ID0gW107Cn0gZWxzZWlmICghXGlzX2FycmF5KCRkZWZhdWx0KSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0EgZGVmYXVsdCB2YWx1ZSBmb3IgYW4gYXJyYXkgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheS4nKTsKfQp9CgokdGhpcy0+ZGVmYXVsdCA9ICRkZWZhdWx0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZWZhdWx0KCkKewpyZXR1cm4gJHRoaXMtPmRlZmF1bHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0aW9uKCkKewpyZXR1cm4gJHRoaXMtPmRlc2NyaXB0aW9uOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0OwoKCgoKCgoKaW50ZXJmYWNlIElucHV0QXdhcmVJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5wdXQoSW5wdXRJbnRlcmZhY2UgJGlucHV0KTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CgoKCgoKCgoKCgoKCgpjbGFzcyBJbnB1dERlZmluaXRpb24Kewpwcml2YXRlICRhcmd1bWVudHM7CnByaXZhdGUgJHJlcXVpcmVkQ291bnQ7CnByaXZhdGUgJGxhc3RBcnJheUFyZ3VtZW50Owpwcml2YXRlICRsYXN0T3B0aW9uYWxBcmd1bWVudDsKcHJpdmF0ZSAkb3B0aW9uczsKcHJpdmF0ZSAkbmVnYXRpb25zOwpwcml2YXRlICRzaG9ydGN1dHM7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGRlZmluaXRpb24gPSBbXSkKewokdGhpcy0+c2V0RGVmaW5pdGlvbigkZGVmaW5pdGlvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWZpbml0aW9uKGFycmF5ICRkZWZpbml0aW9uKQp7CiRhcmd1bWVudHMgPSBbXTsKJG9wdGlvbnMgPSBbXTsKZm9yZWFjaCAoJGRlZmluaXRpb24gYXMgJGl0ZW0pIHsKaWYgKCRpdGVtIGluc3RhbmNlb2YgSW5wdXRPcHRpb24pIHsKJG9wdGlvbnNbXSA9ICRpdGVtOwp9IGVsc2UgewokYXJndW1lbnRzW10gPSAkaXRlbTsKfQp9CgokdGhpcy0+c2V0QXJndW1lbnRzKCRhcmd1bWVudHMpOwokdGhpcy0+c2V0T3B0aW9ucygkb3B0aW9ucyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFyZ3VtZW50cyhhcnJheSAkYXJndW1lbnRzID0gW10pCnsKJHRoaXMtPmFyZ3VtZW50cyA9IFtdOwokdGhpcy0+cmVxdWlyZWRDb3VudCA9IDA7CiR0aGlzLT5sYXN0T3B0aW9uYWxBcmd1bWVudCA9IG51bGw7CiR0aGlzLT5sYXN0QXJyYXlBcmd1bWVudCA9IG51bGw7CiR0aGlzLT5hZGRBcmd1bWVudHMoJGFyZ3VtZW50cyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEFyZ3VtZW50cyg/YXJyYXkgJGFyZ3VtZW50cyA9IFtdKQp7CmlmIChudWxsICE9PSAkYXJndW1lbnRzKSB7CmZvcmVhY2ggKCRhcmd1bWVudHMgYXMgJGFyZ3VtZW50KSB7CiR0aGlzLT5hZGRBcmd1bWVudCgkYXJndW1lbnQpOwp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEFyZ3VtZW50KElucHV0QXJndW1lbnQgJGFyZ3VtZW50KQp7CmlmIChpc3NldCgkdGhpcy0+YXJndW1lbnRzWyRhcmd1bWVudC0+Z2V0TmFtZSgpXSkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0FuIGFyZ3VtZW50IHdpdGggbmFtZSAiJXMiIGFscmVhZHkgZXhpc3RzLicsICRhcmd1bWVudC0+Z2V0TmFtZSgpKSk7Cn0KCmlmIChudWxsICE9PSAkdGhpcy0+bGFzdEFycmF5QXJndW1lbnQpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0Nhbm5vdCBhZGQgYSByZXF1aXJlZCBhcmd1bWVudCAiJXMiIGFmdGVyIGFuIGFycmF5IGFyZ3VtZW50ICIlcyIuJywgJGFyZ3VtZW50LT5nZXROYW1lKCksICR0aGlzLT5sYXN0QXJyYXlBcmd1bWVudC0+Z2V0TmFtZSgpKSk7Cn0KCmlmICgkYXJndW1lbnQtPmlzUmVxdWlyZWQoKSAmJiBudWxsICE9PSAkdGhpcy0+bGFzdE9wdGlvbmFsQXJndW1lbnQpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0Nhbm5vdCBhZGQgYSByZXF1aXJlZCBhcmd1bWVudCAiJXMiIGFmdGVyIGFuIG9wdGlvbmFsIG9uZSAiJXMiLicsICRhcmd1bWVudC0+Z2V0TmFtZSgpLCAkdGhpcy0+bGFzdE9wdGlvbmFsQXJndW1lbnQtPmdldE5hbWUoKSkpOwp9CgppZiAoJGFyZ3VtZW50LT5pc0FycmF5KCkpIHsKJHRoaXMtPmxhc3RBcnJheUFyZ3VtZW50ID0gJGFyZ3VtZW50Owp9CgppZiAoJGFyZ3VtZW50LT5pc1JlcXVpcmVkKCkpIHsKKyskdGhpcy0+cmVxdWlyZWRDb3VudDsKfSBlbHNlIHsKJHRoaXMtPmxhc3RPcHRpb25hbEFyZ3VtZW50ID0gJGFyZ3VtZW50Owp9CgokdGhpcy0+YXJndW1lbnRzWyRhcmd1bWVudC0+Z2V0TmFtZSgpXSA9ICRhcmd1bWVudDsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50KCRuYW1lKQp7CmlmICghJHRoaXMtPmhhc0FyZ3VtZW50KCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiJXMiIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCiRhcmd1bWVudHMgPSBcaXNfaW50KCRuYW1lKSA/IGFycmF5X3ZhbHVlcygkdGhpcy0+YXJndW1lbnRzKSA6ICR0aGlzLT5hcmd1bWVudHM7CgpyZXR1cm4gJGFyZ3VtZW50c1skbmFtZV07Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQXJndW1lbnQoJG5hbWUpCnsKJGFyZ3VtZW50cyA9IFxpc19pbnQoJG5hbWUpID8gYXJyYXlfdmFsdWVzKCR0aGlzLT5hcmd1bWVudHMpIDogJHRoaXMtPmFyZ3VtZW50czsKCnJldHVybiBpc3NldCgkYXJndW1lbnRzWyRuYW1lXSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50cygpCnsKcmV0dXJuICR0aGlzLT5hcmd1bWVudHM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50Q291bnQoKQp7CnJldHVybiBudWxsICE9PSAkdGhpcy0+bGFzdEFycmF5QXJndW1lbnQgPyBcUEhQX0lOVF9NQVggOiBcY291bnQoJHRoaXMtPmFyZ3VtZW50cyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50UmVxdWlyZWRDb3VudCgpCnsKcmV0dXJuICR0aGlzLT5yZXF1aXJlZENvdW50Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnREZWZhdWx0cygpCnsKJHZhbHVlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+YXJndW1lbnRzIGFzICRhcmd1bWVudCkgewokdmFsdWVzWyRhcmd1bWVudC0+Z2V0TmFtZSgpXSA9ICRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpOwp9CgpyZXR1cm4gJHZhbHVlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9ucyhhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT5vcHRpb25zID0gW107CiR0aGlzLT5zaG9ydGN1dHMgPSBbXTsKJHRoaXMtPm5lZ2F0aW9ucyA9IFtdOwokdGhpcy0+YWRkT3B0aW9ucygkb3B0aW9ucyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMgPSBbXSkKewpmb3JlYWNoICgkb3B0aW9ucyBhcyAkb3B0aW9uKSB7CiR0aGlzLT5hZGRPcHRpb24oJG9wdGlvbik7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZE9wdGlvbihJbnB1dE9wdGlvbiAkb3B0aW9uKQp7CmlmIChpc3NldCgkdGhpcy0+b3B0aW9uc1skb3B0aW9uLT5nZXROYW1lKCldKSAmJiAhJG9wdGlvbi0+ZXF1YWxzKCR0aGlzLT5vcHRpb25zWyRvcHRpb24tPmdldE5hbWUoKV0pKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdBbiBvcHRpb24gbmFtZWQgIiVzIiBhbHJlYWR5IGV4aXN0cy4nLCAkb3B0aW9uLT5nZXROYW1lKCkpKTsKfQppZiAoaXNzZXQoJHRoaXMtPm5lZ2F0aW9uc1skb3B0aW9uLT5nZXROYW1lKCldKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQW4gb3B0aW9uIG5hbWVkICIlcyIgYWxyZWFkeSBleGlzdHMuJywgJG9wdGlvbi0+Z2V0TmFtZSgpKSk7Cn0KCmlmICgkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKSB7CmZvcmVhY2ggKGV4cGxvZGUoJ3wnLCAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKSBhcyAkc2hvcnRjdXQpIHsKaWYgKGlzc2V0KCR0aGlzLT5zaG9ydGN1dHNbJHNob3J0Y3V0XSkgJiYgISRvcHRpb24tPmVxdWFscygkdGhpcy0+b3B0aW9uc1skdGhpcy0+c2hvcnRjdXRzWyRzaG9ydGN1dF1dKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQW4gb3B0aW9uIHdpdGggc2hvcnRjdXQgIiVzIiBhbHJlYWR5IGV4aXN0cy4nLCAkc2hvcnRjdXQpKTsKfQp9Cn0KCiR0aGlzLT5vcHRpb25zWyRvcHRpb24tPmdldE5hbWUoKV0gPSAkb3B0aW9uOwppZiAoJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSkgewpmb3JlYWNoIChleHBsb2RlKCd8JywgJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSkgYXMgJHNob3J0Y3V0KSB7CiR0aGlzLT5zaG9ydGN1dHNbJHNob3J0Y3V0XSA9ICRvcHRpb24tPmdldE5hbWUoKTsKfQp9CgppZiAoJG9wdGlvbi0+aXNOZWdhdGFibGUoKSkgewokbmVnYXRlZE5hbWUgPSAnbm8tJy4kb3B0aW9uLT5nZXROYW1lKCk7CmlmIChpc3NldCgkdGhpcy0+b3B0aW9uc1skbmVnYXRlZE5hbWVdKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQW4gb3B0aW9uIG5hbWVkICIlcyIgYWxyZWFkeSBleGlzdHMuJywgJG5lZ2F0ZWROYW1lKSk7Cn0KJHRoaXMtPm5lZ2F0aW9uc1skbmVnYXRlZE5hbWVdID0gJG9wdGlvbi0+Z2V0TmFtZSgpOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9uKHN0cmluZyAkbmFtZSkKewppZiAoISR0aGlzLT5oYXNPcHRpb24oJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlICItLSVzIiBvcHRpb24gZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKcmV0dXJuICR0aGlzLT5vcHRpb25zWyRuYW1lXTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzT3B0aW9uKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gaXNzZXQoJHRoaXMtPm9wdGlvbnNbJG5hbWVdKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9ucygpCnsKcmV0dXJuICR0aGlzLT5vcHRpb25zOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNTaG9ydGN1dChzdHJpbmcgJG5hbWUpCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5zaG9ydGN1dHNbJG5hbWVdKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc05lZ2F0aW9uKHN0cmluZyAkbmFtZSk6IGJvb2wKewpyZXR1cm4gaXNzZXQoJHRoaXMtPm5lZ2F0aW9uc1skbmFtZV0pOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb25Gb3JTaG9ydGN1dChzdHJpbmcgJHNob3J0Y3V0KQp7CnJldHVybiAkdGhpcy0+Z2V0T3B0aW9uKCR0aGlzLT5zaG9ydGN1dFRvTmFtZSgkc2hvcnRjdXQpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbkRlZmF1bHRzKCkKewokdmFsdWVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5vcHRpb25zIGFzICRvcHRpb24pIHsKJHZhbHVlc1skb3B0aW9uLT5nZXROYW1lKCldID0gJG9wdGlvbi0+Z2V0RGVmYXVsdCgpOwp9CgpyZXR1cm4gJHZhbHVlczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzaG9ydGN1dFRvTmFtZShzdHJpbmcgJHNob3J0Y3V0KTogc3RyaW5nCnsKaWYgKCFpc3NldCgkdGhpcy0+c2hvcnRjdXRzWyRzaG9ydGN1dF0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlICItJXMiIG9wdGlvbiBkb2VzIG5vdCBleGlzdC4nLCAkc2hvcnRjdXQpKTsKfQoKcmV0dXJuICR0aGlzLT5zaG9ydGN1dHNbJHNob3J0Y3V0XTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBuZWdhdGlvblRvTmFtZShzdHJpbmcgJG5lZ2F0aW9uKTogc3RyaW5nCnsKaWYgKCFpc3NldCgkdGhpcy0+bmVnYXRpb25zWyRuZWdhdGlvbl0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlICItLSVzIiBvcHRpb24gZG9lcyBub3QgZXhpc3QuJywgJG5lZ2F0aW9uKSk7Cn0KCnJldHVybiAkdGhpcy0+bmVnYXRpb25zWyRuZWdhdGlvbl07Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN5bm9wc2lzKGJvb2wgJHNob3J0ID0gZmFsc2UpCnsKJGVsZW1lbnRzID0gW107CgppZiAoJHNob3J0ICYmICR0aGlzLT5nZXRPcHRpb25zKCkpIHsKJGVsZW1lbnRzW10gPSAnW29wdGlvbnNdJzsKfSBlbHNlaWYgKCEkc2hvcnQpIHsKZm9yZWFjaCAoJHRoaXMtPmdldE9wdGlvbnMoKSBhcyAkb3B0aW9uKSB7CiR2YWx1ZSA9ICcnOwppZiAoJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSkgewokdmFsdWUgPSBzcHJpbnRmKAonICVzJXMlcycsCiRvcHRpb24tPmlzVmFsdWVPcHRpb25hbCgpID8gJ1snIDogJycsCnN0cnRvdXBwZXIoJG9wdGlvbi0+Z2V0TmFtZSgpKSwKJG9wdGlvbi0+aXNWYWx1ZU9wdGlvbmFsKCkgPyAnXScgOiAnJwopOwp9Cgokc2hvcnRjdXQgPSAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpID8gc3ByaW50ZignLSVzfCcsICRvcHRpb24tPmdldFNob3J0Y3V0KCkpIDogJyc7CiRuZWdhdGlvbiA9ICRvcHRpb24tPmlzTmVnYXRhYmxlKCkgPyBzcHJpbnRmKCd8LS1uby0lcycsICRvcHRpb24tPmdldE5hbWUoKSkgOiAnJzsKJGVsZW1lbnRzW10gPSBzcHJpbnRmKCdbJXMtLSVzJXMlc10nLCAkc2hvcnRjdXQsICRvcHRpb24tPmdldE5hbWUoKSwgJHZhbHVlLCAkbmVnYXRpb24pOwp9Cn0KCmlmIChcY291bnQoJGVsZW1lbnRzKSAmJiAkdGhpcy0+Z2V0QXJndW1lbnRzKCkpIHsKJGVsZW1lbnRzW10gPSAnWy0tXSc7Cn0KCiR0YWlsID0gJyc7CmZvcmVhY2ggKCR0aGlzLT5nZXRBcmd1bWVudHMoKSBhcyAkYXJndW1lbnQpIHsKJGVsZW1lbnQgPSAnPCcuJGFyZ3VtZW50LT5nZXROYW1lKCkuJz4nOwppZiAoJGFyZ3VtZW50LT5pc0FycmF5KCkpIHsKJGVsZW1lbnQgLj0gJy4uLic7Cn0KCmlmICghJGFyZ3VtZW50LT5pc1JlcXVpcmVkKCkpIHsKJGVsZW1lbnQgPSAnWycuJGVsZW1lbnQ7CiR0YWlsIC49ICddJzsKfQoKJGVsZW1lbnRzW10gPSAkZWxlbWVudDsKfQoKcmV0dXJuIGltcGxvZGUoJyAnLCAkZWxlbWVudHMpLiR0YWlsOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CgoKCgoKCmludGVyZmFjZSBJbnB1dEludGVyZmFjZQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpcnN0QXJndW1lbnQoKTsKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUGFyYW1ldGVyT3B0aW9uKCR2YWx1ZXMsIGJvb2wgJG9ubHlQYXJhbXMgPSBmYWxzZSk7CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYXJhbWV0ZXJPcHRpb24oJHZhbHVlcywgJGRlZmF1bHQgPSBmYWxzZSwgYm9vbCAkb25seVBhcmFtcyA9IGZhbHNlKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGJpbmQoSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudHMoKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnQoc3RyaW5nICRuYW1lKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXJndW1lbnQoc3RyaW5nICRuYW1lLCAkdmFsdWUpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQXJndW1lbnQoc3RyaW5nICRuYW1lKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbnMoKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9uKHN0cmluZyAkbmFtZSk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbihzdHJpbmcgJG5hbWUsICR2YWx1ZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNPcHRpb24oc3RyaW5nICRuYW1lKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUoKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnRlcmFjdGl2ZShib29sICRpbnRlcmFjdGl2ZSk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBJbnB1dE9wdGlvbgp7CgoKCnB1YmxpYyBjb25zdCBWQUxVRV9OT05FID0gMTsKCgoKCnB1YmxpYyBjb25zdCBWQUxVRV9SRVFVSVJFRCA9IDI7CgoKCgpwdWJsaWMgY29uc3QgVkFMVUVfT1BUSU9OQUwgPSA0OwoKCgoKcHVibGljIGNvbnN0IFZBTFVFX0lTX0FSUkFZID0gODsKCgoKCnB1YmxpYyBjb25zdCBWQUxVRV9ORUdBVEFCTEUgPSAxNjsKCnByaXZhdGUgJG5hbWU7CnByaXZhdGUgJHNob3J0Y3V0Owpwcml2YXRlICRtb2RlOwpwcml2YXRlICRkZWZhdWx0Owpwcml2YXRlICRkZXNjcmlwdGlvbjsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCAkc2hvcnRjdXQgPSBudWxsLCA/aW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwpCnsKaWYgKHN0cl9zdGFydHNfd2l0aCgkbmFtZSwgJy0tJykpIHsKJG5hbWUgPSBzdWJzdHIoJG5hbWUsIDIpOwp9CgppZiAoZW1wdHkoJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0FuIG9wdGlvbiBuYW1lIGNhbm5vdCBiZSBlbXB0eS4nKTsKfQoKaWYgKCcnID09PSAkc2hvcnRjdXQgfHwgW10gPT09ICRzaG9ydGN1dCB8fCBmYWxzZSA9PT0gJHNob3J0Y3V0KSB7CiRzaG9ydGN1dCA9IG51bGw7Cn0KCmlmIChudWxsICE9PSAkc2hvcnRjdXQpIHsKaWYgKFxpc19hcnJheSgkc2hvcnRjdXQpKSB7CiRzaG9ydGN1dCA9IGltcGxvZGUoJ3wnLCAkc2hvcnRjdXQpOwp9CiRzaG9ydGN1dHMgPSBwcmVnX3NwbGl0KCd7KFx8KS0/fScsIGx0cmltKCRzaG9ydGN1dCwgJy0nKSk7CiRzaG9ydGN1dHMgPSBhcnJheV9maWx0ZXIoJHNob3J0Y3V0cywgJ3N0cmxlbicpOwokc2hvcnRjdXQgPSBpbXBsb2RlKCd8JywgJHNob3J0Y3V0cyk7CgppZiAoJycgPT09ICRzaG9ydGN1dCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdBbiBvcHRpb24gc2hvcnRjdXQgY2Fubm90IGJlIGVtcHR5LicpOwp9Cn0KCmlmIChudWxsID09PSAkbW9kZSkgewokbW9kZSA9IHNlbGY6OlZBTFVFX05PTkU7Cn0gZWxzZWlmICgkbW9kZSA+PSAoc2VsZjo6VkFMVUVfTkVHQVRBQkxFIDw8IDEpIHx8ICRtb2RlIDwgMSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ09wdGlvbiBtb2RlICIlcyIgaXMgbm90IHZhbGlkLicsICRtb2RlKSk7Cn0KCiR0aGlzLT5uYW1lID0gJG5hbWU7CiR0aGlzLT5zaG9ydGN1dCA9ICRzaG9ydGN1dDsKJHRoaXMtPm1vZGUgPSAkbW9kZTsKJHRoaXMtPmRlc2NyaXB0aW9uID0gJGRlc2NyaXB0aW9uOwoKaWYgKCR0aGlzLT5pc0FycmF5KCkgJiYgISR0aGlzLT5hY2NlcHRWYWx1ZSgpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ltcG9zc2libGUgdG8gaGF2ZSBhbiBvcHRpb24gbW9kZSBWQUxVRV9JU19BUlJBWSBpZiB0aGUgb3B0aW9uIGRvZXMgbm90IGFjY2VwdCBhIHZhbHVlLicpOwp9CmlmICgkdGhpcy0+aXNOZWdhdGFibGUoKSAmJiAkdGhpcy0+YWNjZXB0VmFsdWUoKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbXBvc3NpYmxlIHRvIGhhdmUgYW4gb3B0aW9uIG1vZGUgVkFMVUVfTkVHQVRBQkxFIGlmIHRoZSBvcHRpb24gYWxzbyBhY2NlcHRzIGEgdmFsdWUuJyk7Cn0KCiR0aGlzLT5zZXREZWZhdWx0KCRkZWZhdWx0KTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2hvcnRjdXQoKQp7CnJldHVybiAkdGhpcy0+c2hvcnRjdXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQp7CnJldHVybiAkdGhpcy0+bmFtZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0VmFsdWUoKQp7CnJldHVybiAkdGhpcy0+aXNWYWx1ZVJlcXVpcmVkKCkgfHwgJHRoaXMtPmlzVmFsdWVPcHRpb25hbCgpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZhbHVlUmVxdWlyZWQoKQp7CnJldHVybiBzZWxmOjpWQUxVRV9SRVFVSVJFRCA9PT0gKHNlbGY6OlZBTFVFX1JFUVVJUkVEICYgJHRoaXMtPm1vZGUpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZhbHVlT3B0aW9uYWwoKQp7CnJldHVybiBzZWxmOjpWQUxVRV9PUFRJT05BTCA9PT0gKHNlbGY6OlZBTFVFX09QVElPTkFMICYgJHRoaXMtPm1vZGUpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0FycmF5KCkKewpyZXR1cm4gc2VsZjo6VkFMVUVfSVNfQVJSQVkgPT09IChzZWxmOjpWQUxVRV9JU19BUlJBWSAmICR0aGlzLT5tb2RlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzTmVnYXRhYmxlKCk6IGJvb2wKewpyZXR1cm4gc2VsZjo6VkFMVUVfTkVHQVRBQkxFID09PSAoc2VsZjo6VkFMVUVfTkVHQVRBQkxFICYgJHRoaXMtPm1vZGUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVmYXVsdCgkZGVmYXVsdCA9IG51bGwpCnsKaWYgKHNlbGY6OlZBTFVFX05PTkUgPT09IChzZWxmOjpWQUxVRV9OT05FICYgJHRoaXMtPm1vZGUpICYmIG51bGwgIT09ICRkZWZhdWx0KSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignQ2Fubm90IHNldCBhIGRlZmF1bHQgdmFsdWUgd2hlbiB1c2luZyBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSBtb2RlLicpOwp9CgppZiAoJHRoaXMtPmlzQXJyYXkoKSkgewppZiAobnVsbCA9PT0gJGRlZmF1bHQpIHsKJGRlZmF1bHQgPSBbXTsKfSBlbHNlaWYgKCFcaXNfYXJyYXkoJGRlZmF1bHQpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignQSBkZWZhdWx0IHZhbHVlIGZvciBhbiBhcnJheSBvcHRpb24gbXVzdCBiZSBhbiBhcnJheS4nKTsKfQp9CgokdGhpcy0+ZGVmYXVsdCA9ICR0aGlzLT5hY2NlcHRWYWx1ZSgpIHx8ICR0aGlzLT5pc05lZ2F0YWJsZSgpID8gJGRlZmF1bHQgOiBmYWxzZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVmYXVsdCgpCnsKcmV0dXJuICR0aGlzLT5kZWZhdWx0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXNjcmlwdGlvbigpCnsKcmV0dXJuICR0aGlzLT5kZXNjcmlwdGlvbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKHNlbGYgJG9wdGlvbikKewpyZXR1cm4gJG9wdGlvbi0+Z2V0TmFtZSgpID09PSAkdGhpcy0+Z2V0TmFtZSgpCiYmICRvcHRpb24tPmdldFNob3J0Y3V0KCkgPT09ICR0aGlzLT5nZXRTaG9ydGN1dCgpCiYmICRvcHRpb24tPmdldERlZmF1bHQoKSA9PT0gJHRoaXMtPmdldERlZmF1bHQoKQomJiAkb3B0aW9uLT5pc05lZ2F0YWJsZSgpID09PSAkdGhpcy0+aXNOZWdhdGFibGUoKQomJiAkb3B0aW9uLT5pc0FycmF5KCkgPT09ICR0aGlzLT5pc0FycmF5KCkKJiYgJG9wdGlvbi0+aXNWYWx1ZVJlcXVpcmVkKCkgPT09ICR0aGlzLT5pc1ZhbHVlUmVxdWlyZWQoKQomJiAkb3B0aW9uLT5pc1ZhbHVlT3B0aW9uYWwoKSA9PT0gJHRoaXMtPmlzVmFsdWVPcHRpb25hbCgpCjsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dDsKCgoKCgoKCmludGVyZmFjZSBTdHJlYW1hYmxlSW5wdXRJbnRlcmZhY2UgZXh0ZW5kcyBJbnB1dEludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3RyZWFtKCRzdHJlYW0pOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RyZWFtKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCgoKCgoKCmNsYXNzIFN0cmluZ0lucHV0IGV4dGVuZHMgQXJndklucHV0CnsKcHVibGljIGNvbnN0IFJFR0VYX1NUUklORyA9ICcoW15cc10rPykoPzpcc3woPzwhXFxcXCkifCg/PCFcXFxcKVwnfCQpJzsKcHVibGljIGNvbnN0IFJFR0VYX1VOUVVPVEVEX1NUUklORyA9ICcoW15cc1xcXFxdKz8pJzsKcHVibGljIGNvbnN0IFJFR0VYX1FVT1RFRF9TVFJJTkcgPSAnKD86IihbXiJcXFxcXSooPzpcXFxcLlteIlxcXFxdKikqKSJ8XCcoW15cJ1xcXFxdKig/OlxcXFwuW15cJ1xcXFxdKikqKVwnKSc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRpbnB1dCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KFtdKTsKCiR0aGlzLT5zZXRUb2tlbnMoJHRoaXMtPnRva2VuaXplKCRpbnB1dCkpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdG9rZW5pemUoc3RyaW5nICRpbnB1dCk6IGFycmF5CnsKJHRva2VucyA9IFtdOwokbGVuZ3RoID0gXHN0cmxlbigkaW5wdXQpOwokY3Vyc29yID0gMDsKJHRva2VuID0gbnVsbDsKd2hpbGUgKCRjdXJzb3IgPCAkbGVuZ3RoKSB7CmlmICgnXFwnID09PSAkaW5wdXRbJGN1cnNvcl0pIHsKJHRva2VuIC49ICRpbnB1dFsrKyRjdXJzb3JdID8/ICcnOworKyRjdXJzb3I7CmNvbnRpbnVlOwp9CgppZiAocHJlZ19tYXRjaCgnL1xzKy9BJywgJGlucHV0LCAkbWF0Y2gsIDAsICRjdXJzb3IpKSB7CmlmIChudWxsICE9PSAkdG9rZW4pIHsKJHRva2Vuc1tdID0gJHRva2VuOwokdG9rZW4gPSBudWxsOwp9Cn0gZWxzZWlmIChwcmVnX21hdGNoKCcvKFtePSJcJ1xzXSs/KSg9PykoJy5zZWxmOjpSRUdFWF9RVU9URURfU1RSSU5HLicrKS9BJywgJGlucHV0LCAkbWF0Y2gsIDAsICRjdXJzb3IpKSB7CiR0b2tlbiAuPSAkbWF0Y2hbMV0uJG1hdGNoWzJdLnN0cmlwY3NsYXNoZXMoc3RyX3JlcGxhY2UoWyciXCcnLCAnXCciJywgJ1wnXCcnLCAnIiInXSwgJycsIHN1YnN0cigkbWF0Y2hbM10sIDEsIC0xKSkpOwp9IGVsc2VpZiAocHJlZ19tYXRjaCgnLycuc2VsZjo6UkVHRVhfUVVPVEVEX1NUUklORy4nL0EnLCAkaW5wdXQsICRtYXRjaCwgMCwgJGN1cnNvcikpIHsKJHRva2VuIC49IHN0cmlwY3NsYXNoZXMoc3Vic3RyKCRtYXRjaFswXSwgMSwgLTEpKTsKfSBlbHNlaWYgKHByZWdfbWF0Y2goJy8nLnNlbGY6OlJFR0VYX1VOUVVPVEVEX1NUUklORy4nL0EnLCAkaW5wdXQsICRtYXRjaCwgMCwgJGN1cnNvcikpIHsKJHRva2VuIC49ICRtYXRjaFsxXTsKfSBlbHNlIHsKCnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVW5hYmxlIHRvIHBhcnNlIGlucHV0IG5lYXIgIi4uLiAlcyAuLi4iLicsIHN1YnN0cigkaW5wdXQsICRjdXJzb3IsIDEwKSkpOwp9CgokY3Vyc29yICs9IFxzdHJsZW4oJG1hdGNoWzBdKTsKfQoKaWYgKG51bGwgIT09ICR0b2tlbikgewokdG9rZW5zW10gPSAkdG9rZW47Cn0KCnJldHVybiAkdG9rZW5zOwp9Cn0KCkNvcHlyaWdodCAoYykgMjAwNC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcTG9nZ2VyOwoKdXNlIFBzclxMb2dcQWJzdHJhY3RMb2dnZXI7CnVzZSBQc3JcTG9nXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFBzclxMb2dcTG9nTGV2ZWw7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgoKCmNsYXNzIENvbnNvbGVMb2dnZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ2dlcgp7CnB1YmxpYyBjb25zdCBJTkZPID0gJ2luZm8nOwpwdWJsaWMgY29uc3QgRVJST1IgPSAnZXJyb3InOwoKcHJpdmF0ZSAkb3V0cHV0Owpwcml2YXRlICR2ZXJib3NpdHlMZXZlbE1hcCA9IFsKTG9nTGV2ZWw6OkVNRVJHRU5DWSA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9OT1JNQUwsCkxvZ0xldmVsOjpBTEVSVCA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9OT1JNQUwsCkxvZ0xldmVsOjpDUklUSUNBTCA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9OT1JNQUwsCkxvZ0xldmVsOjpFUlJPUiA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9OT1JNQUwsCkxvZ0xldmVsOjpXQVJOSU5HID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX05PUk1BTCwKTG9nTGV2ZWw6Ok5PVElDRSA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJCT1NFLApMb2dMZXZlbDo6SU5GTyA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UsCkxvZ0xldmVsOjpERUJVRyA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9ERUJVRywKXTsKcHJpdmF0ZSAkZm9ybWF0TGV2ZWxNYXAgPSBbCkxvZ0xldmVsOjpFTUVSR0VOQ1kgPT4gc2VsZjo6RVJST1IsCkxvZ0xldmVsOjpBTEVSVCA9PiBzZWxmOjpFUlJPUiwKTG9nTGV2ZWw6OkNSSVRJQ0FMID0+IHNlbGY6OkVSUk9SLApMb2dMZXZlbDo6RVJST1IgPT4gc2VsZjo6RVJST1IsCkxvZ0xldmVsOjpXQVJOSU5HID0+IHNlbGY6OklORk8sCkxvZ0xldmVsOjpOT1RJQ0UgPT4gc2VsZjo6SU5GTywKTG9nTGV2ZWw6OklORk8gPT4gc2VsZjo6SU5GTywKTG9nTGV2ZWw6OkRFQlVHID0+IHNlbGY6OklORk8sCl07CnByaXZhdGUgJGVycm9yZWQgPSBmYWxzZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgYXJyYXkgJHZlcmJvc2l0eUxldmVsTWFwID0gW10sIGFycmF5ICRmb3JtYXRMZXZlbE1hcCA9IFtdKQp7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0OwokdGhpcy0+dmVyYm9zaXR5TGV2ZWxNYXAgPSAkdmVyYm9zaXR5TGV2ZWxNYXAgKyAkdGhpcy0+dmVyYm9zaXR5TGV2ZWxNYXA7CiR0aGlzLT5mb3JtYXRMZXZlbE1hcCA9ICRmb3JtYXRMZXZlbE1hcCArICR0aGlzLT5mb3JtYXRMZXZlbE1hcDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9nKCRsZXZlbCwgJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gW10pCnsKaWYgKCFpc3NldCgkdGhpcy0+dmVyYm9zaXR5TGV2ZWxNYXBbJGxldmVsXSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgbG9nIGxldmVsICIlcyIgZG9lcyBub3QgZXhpc3QuJywgJGxldmVsKSk7Cn0KCiRvdXRwdXQgPSAkdGhpcy0+b3V0cHV0OwoKCmlmIChzZWxmOjpFUlJPUiA9PT0gJHRoaXMtPmZvcm1hdExldmVsTWFwWyRsZXZlbF0pIHsKaWYgKCR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CiRvdXRwdXQgPSAkb3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9CiR0aGlzLT5lcnJvcmVkID0gdHJ1ZTsKfQoKCgppZiAoJG91dHB1dC0+Z2V0VmVyYm9zaXR5KCkgPj0gJHRoaXMtPnZlcmJvc2l0eUxldmVsTWFwWyRsZXZlbF0pIHsKJG91dHB1dC0+d3JpdGVsbihzcHJpbnRmKCc8JTEkcz5bJTIkc10gJTMkczwvJTEkcz4nLCAkdGhpcy0+Zm9ybWF0TGV2ZWxNYXBbJGxldmVsXSwgJGxldmVsLCAkdGhpcy0+aW50ZXJwb2xhdGUoJG1lc3NhZ2UsICRjb250ZXh0KSksICR0aGlzLT52ZXJib3NpdHlMZXZlbE1hcFskbGV2ZWxdKTsKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNFcnJvcmVkKCkKewpyZXR1cm4gJHRoaXMtPmVycm9yZWQ7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpbnRlcnBvbGF0ZShzdHJpbmcgJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0KTogc3RyaW5nCnsKaWYgKCFzdHJfY29udGFpbnMoJG1lc3NhZ2UsICd7JykpIHsKcmV0dXJuICRtZXNzYWdlOwp9CgokcmVwbGFjZW1lbnRzID0gW107CmZvcmVhY2ggKCRjb250ZXh0IGFzICRrZXkgPT4gJHZhbCkgewppZiAobnVsbCA9PT0gJHZhbCB8fCBcaXNfc2NhbGFyKCR2YWwpIHx8IChcaXNfb2JqZWN0KCR2YWwpICYmIG1ldGhvZF9leGlzdHMoJHZhbCwgJ19fdG9TdHJpbmcnKSkpIHsKJHJlcGxhY2VtZW50c1sie3ska2V5fX0iXSA9ICR2YWw7Cn0gZWxzZWlmICgkdmFsIGluc3RhbmNlb2YgXERhdGVUaW1lSW50ZXJmYWNlKSB7CiRyZXBsYWNlbWVudHNbInt7JGtleX19Il0gPSAkdmFsLT5mb3JtYXQoXERhdGVUaW1lOjpSRkMzMzM5KTsKfSBlbHNlaWYgKFxpc19vYmplY3QoJHZhbCkpIHsKJHJlcGxhY2VtZW50c1sie3ska2V5fX0iXSA9ICdbb2JqZWN0ICcuXGdldF9jbGFzcygkdmFsKS4nXSc7Cn0gZWxzZSB7CiRyZXBsYWNlbWVudHNbInt7JGtleX19Il0gPSAnWycuXGdldHR5cGUoJHZhbCkuJ10nOwp9Cn0KCnJldHVybiBzdHJ0cigkbWVzc2FnZSwgJHJlcGxhY2VtZW50cyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0OwoKCgoKY2xhc3MgQnVmZmVyZWRPdXRwdXQgZXh0ZW5kcyBPdXRwdXQKewpwcml2YXRlICRidWZmZXIgPSAnJzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZldGNoKCkKewokY29udGVudCA9ICR0aGlzLT5idWZmZXI7CiR0aGlzLT5idWZmZXIgPSAnJzsKCnJldHVybiAkY29udGVudDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvV3JpdGUoc3RyaW5nICRtZXNzYWdlLCBib29sICRuZXdsaW5lKQp7CiR0aGlzLT5idWZmZXIgLj0gJG1lc3NhZ2U7CgppZiAoJG5ld2xpbmUpIHsKJHRoaXMtPmJ1ZmZlciAuPSBcUEhQX0VPTDsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgoKCmNsYXNzIENvbnNvbGVPdXRwdXQgZXh0ZW5kcyBTdHJlYW1PdXRwdXQgaW1wbGVtZW50cyBDb25zb2xlT3V0cHV0SW50ZXJmYWNlCnsKcHJpdmF0ZSAkc3RkZXJyOwpwcml2YXRlICRjb25zb2xlU2VjdGlvbk91dHB1dHMgPSBbXTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkdmVyYm9zaXR5ID0gc2VsZjo6VkVSQk9TSVRZX05PUk1BTCwgP2Jvb2wgJGRlY29yYXRlZCA9IG51bGwsID9PdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlciA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkdGhpcy0+b3Blbk91dHB1dFN0cmVhbSgpLCAkdmVyYm9zaXR5LCAkZGVjb3JhdGVkLCAkZm9ybWF0dGVyKTsKCmlmIChudWxsID09PSAkZm9ybWF0dGVyKSB7CgokdGhpcy0+c3RkZXJyID0gbmV3IFN0cmVhbU91dHB1dCgkdGhpcy0+b3BlbkVycm9yU3RyZWFtKCksICR2ZXJib3NpdHksICRkZWNvcmF0ZWQpOwoKcmV0dXJuOwp9CgokYWN0dWFsRGVjb3JhdGVkID0gJHRoaXMtPmlzRGVjb3JhdGVkKCk7CiR0aGlzLT5zdGRlcnIgPSBuZXcgU3RyZWFtT3V0cHV0KCR0aGlzLT5vcGVuRXJyb3JTdHJlYW0oKSwgJHZlcmJvc2l0eSwgJGRlY29yYXRlZCwgJHRoaXMtPmdldEZvcm1hdHRlcigpKTsKCmlmIChudWxsID09PSAkZGVjb3JhdGVkKSB7CiR0aGlzLT5zZXREZWNvcmF0ZWQoJGFjdHVhbERlY29yYXRlZCAmJiAkdGhpcy0+c3RkZXJyLT5pc0RlY29yYXRlZCgpKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VjdGlvbigpOiBDb25zb2xlU2VjdGlvbk91dHB1dAp7CnJldHVybiBuZXcgQ29uc29sZVNlY3Rpb25PdXRwdXQoJHRoaXMtPmdldFN0cmVhbSgpLCAkdGhpcy0+Y29uc29sZVNlY3Rpb25PdXRwdXRzLCAkdGhpcy0+Z2V0VmVyYm9zaXR5KCksICR0aGlzLT5pc0RlY29yYXRlZCgpLCAkdGhpcy0+Z2V0Rm9ybWF0dGVyKCkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVjb3JhdGVkKGJvb2wgJGRlY29yYXRlZCkKewpwYXJlbnQ6OnNldERlY29yYXRlZCgkZGVjb3JhdGVkKTsKJHRoaXMtPnN0ZGVyci0+c2V0RGVjb3JhdGVkKCRkZWNvcmF0ZWQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Rm9ybWF0dGVyKE91dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyKQp7CnBhcmVudDo6c2V0Rm9ybWF0dGVyKCRmb3JtYXR0ZXIpOwokdGhpcy0+c3RkZXJyLT5zZXRGb3JtYXR0ZXIoJGZvcm1hdHRlcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJib3NpdHkoaW50ICRsZXZlbCkKewpwYXJlbnQ6OnNldFZlcmJvc2l0eSgkbGV2ZWwpOwokdGhpcy0+c3RkZXJyLT5zZXRWZXJib3NpdHkoJGxldmVsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9yT3V0cHV0KCkKewpyZXR1cm4gJHRoaXMtPnN0ZGVycjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEVycm9yT3V0cHV0KE91dHB1dEludGVyZmFjZSAkZXJyb3IpCnsKJHRoaXMtPnN0ZGVyciA9ICRlcnJvcjsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc1N0ZG91dFN1cHBvcnQoKQp7CnJldHVybiBmYWxzZSA9PT0gJHRoaXMtPmlzUnVubmluZ09TNDAwKCk7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNTdGRlcnJTdXBwb3J0KCkKewpyZXR1cm4gZmFsc2UgPT09ICR0aGlzLT5pc1J1bm5pbmdPUzQwMCgpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpc1J1bm5pbmdPUzQwMCgpOiBib29sCnsKJGNoZWNrcyA9IFsKXGZ1bmN0aW9uX2V4aXN0cygncGhwX3VuYW1lJykgPyBwaHBfdW5hbWUoJ3MnKSA6ICcnLApnZXRlbnYoJ09TVFlQRScpLApcUEhQX09TLApdOwoKcmV0dXJuIGZhbHNlICE9PSBzdHJpcG9zKGltcGxvZGUoJzsnLCAkY2hlY2tzKSwgJ09TNDAwJyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3Blbk91dHB1dFN0cmVhbSgpCnsKaWYgKCEkdGhpcy0+aGFzU3Rkb3V0U3VwcG9ydCgpKSB7CnJldHVybiBmb3BlbigncGhwOi8vb3V0cHV0JywgJ3cnKTsKfQoKCnJldHVybiBcZGVmaW5lZCgnU1RET1VUJykgPyBcU1RET1VUIDogKEBmb3BlbigncGhwOi8vc3Rkb3V0JywgJ3cnKSA/OiBmb3BlbigncGhwOi8vb3V0cHV0JywgJ3cnKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3BlbkVycm9yU3RyZWFtKCkKewppZiAoISR0aGlzLT5oYXNTdGRlcnJTdXBwb3J0KCkpIHsKcmV0dXJuIGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpOwp9CgoKcmV0dXJuIFxkZWZpbmVkKCdTVERFUlInKSA/IFxTVERFUlIgOiAoQGZvcGVuKCdwaHA6Ly9zdGRlcnInLCAndycpID86IGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7CgoKCgoKCgppbnRlcmZhY2UgQ29uc29sZU91dHB1dEludGVyZmFjZSBleHRlbmRzIE91dHB1dEludGVyZmFjZQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9yT3V0cHV0KCk7CgpwdWJsaWMgZnVuY3Rpb24gc2V0RXJyb3JPdXRwdXQoT3V0cHV0SW50ZXJmYWNlICRlcnJvcik7CgpwdWJsaWMgZnVuY3Rpb24gc2VjdGlvbigpOiBDb25zb2xlU2VjdGlvbk91dHB1dDsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVybWluYWw7CgoKCgoKY2xhc3MgQ29uc29sZVNlY3Rpb25PdXRwdXQgZXh0ZW5kcyBTdHJlYW1PdXRwdXQKewpwcml2YXRlICRjb250ZW50ID0gW107CnByaXZhdGUgJGxpbmVzID0gMDsKcHJpdmF0ZSAkc2VjdGlvbnM7CnByaXZhdGUgJHRlcm1pbmFsOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3RyZWFtLCBhcnJheSAmJHNlY3Rpb25zLCBpbnQgJHZlcmJvc2l0eSwgYm9vbCAkZGVjb3JhdGVkLCBPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlcikKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRzdHJlYW0sICR2ZXJib3NpdHksICRkZWNvcmF0ZWQsICRmb3JtYXR0ZXIpOwphcnJheV91bnNoaWZ0KCRzZWN0aW9ucywgJHRoaXMpOwokdGhpcy0+c2VjdGlvbnMgPSAmJHNlY3Rpb25zOwokdGhpcy0+dGVybWluYWwgPSBuZXcgVGVybWluYWwoKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXIoP2ludCAkbGluZXMgPSBudWxsKQp7CmlmIChlbXB0eSgkdGhpcy0+Y29udGVudCkgfHwgISR0aGlzLT5pc0RlY29yYXRlZCgpKSB7CnJldHVybjsKfQoKaWYgKCRsaW5lcykgewphcnJheV9zcGxpY2UoJHRoaXMtPmNvbnRlbnQsIC0oJGxpbmVzICogMikpOyAKfSBlbHNlIHsKJGxpbmVzID0gJHRoaXMtPmxpbmVzOwokdGhpcy0+Y29udGVudCA9IFtdOwp9CgokdGhpcy0+bGluZXMgLT0gJGxpbmVzOwoKcGFyZW50Ojpkb1dyaXRlKCR0aGlzLT5wb3BTdHJlYW1Db250ZW50VW50aWxDdXJyZW50U2VjdGlvbigkbGluZXMpLCBmYWxzZSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIG92ZXJ3cml0ZSgkbWVzc2FnZSkKewokdGhpcy0+Y2xlYXIoKTsKJHRoaXMtPndyaXRlbG4oJG1lc3NhZ2UpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGVudCgpOiBzdHJpbmcKewpyZXR1cm4gaW1wbG9kZSgnJywgJHRoaXMtPmNvbnRlbnQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQ29udGVudChzdHJpbmcgJGlucHV0KQp7CmZvcmVhY2ggKGV4cGxvZGUoXFBIUF9FT0wsICRpbnB1dCkgYXMgJGxpbmVDb250ZW50KSB7CiR0aGlzLT5saW5lcyArPSBjZWlsKCR0aGlzLT5nZXREaXNwbGF5TGVuZ3RoKCRsaW5lQ29udGVudCkgLyAkdGhpcy0+dGVybWluYWwtPmdldFdpZHRoKCkpID86IDE7CiR0aGlzLT5jb250ZW50W10gPSAkbGluZUNvbnRlbnQ7CiR0aGlzLT5jb250ZW50W10gPSBcUEhQX0VPTDsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9Xcml0ZShzdHJpbmcgJG1lc3NhZ2UsIGJvb2wgJG5ld2xpbmUpCnsKaWYgKCEkdGhpcy0+aXNEZWNvcmF0ZWQoKSkgewpwYXJlbnQ6OmRvV3JpdGUoJG1lc3NhZ2UsICRuZXdsaW5lKTsKCnJldHVybjsKfQoKJGVyYXNlZENvbnRlbnQgPSAkdGhpcy0+cG9wU3RyZWFtQ29udGVudFVudGlsQ3VycmVudFNlY3Rpb24oKTsKCiR0aGlzLT5hZGRDb250ZW50KCRtZXNzYWdlKTsKCnBhcmVudDo6ZG9Xcml0ZSgkbWVzc2FnZSwgdHJ1ZSk7CnBhcmVudDo6ZG9Xcml0ZSgkZXJhc2VkQ29udGVudCwgZmFsc2UpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwb3BTdHJlYW1Db250ZW50VW50aWxDdXJyZW50U2VjdGlvbihpbnQgJG51bWJlck9mTGluZXNUb0NsZWFyRnJvbUN1cnJlbnRTZWN0aW9uID0gMCk6IHN0cmluZwp7CiRudW1iZXJPZkxpbmVzVG9DbGVhciA9ICRudW1iZXJPZkxpbmVzVG9DbGVhckZyb21DdXJyZW50U2VjdGlvbjsKJGVyYXNlZENvbnRlbnQgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5zZWN0aW9ucyBhcyAkc2VjdGlvbikgewppZiAoJHNlY3Rpb24gPT09ICR0aGlzKSB7CmJyZWFrOwp9CgokbnVtYmVyT2ZMaW5lc1RvQ2xlYXIgKz0gJHNlY3Rpb24tPmxpbmVzOwokZXJhc2VkQ29udGVudFtdID0gJHNlY3Rpb24tPmdldENvbnRlbnQoKTsKfQoKaWYgKCRudW1iZXJPZkxpbmVzVG9DbGVhciA+IDApIHsKCnBhcmVudDo6ZG9Xcml0ZShzcHJpbnRmKCJceDFiWyVkQSIsICRudW1iZXJPZkxpbmVzVG9DbGVhciksIGZhbHNlKTsKCnBhcmVudDo6ZG9Xcml0ZSgiXHgxYlswSiIsIGZhbHNlKTsKfQoKcmV0dXJuIGltcGxvZGUoJycsIGFycmF5X3JldmVyc2UoJGVyYXNlZENvbnRlbnQpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREaXNwbGF5TGVuZ3RoKHN0cmluZyAkdGV4dCk6IGludAp7CnJldHVybiBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+Z2V0Rm9ybWF0dGVyKCksIHN0cl9yZXBsYWNlKCJcdCIsICcgICAgICAgICcsICR0ZXh0KSkpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxOdWxsT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwoKCgoKCgoKCgpjbGFzcyBOdWxsT3V0cHV0IGltcGxlbWVudHMgT3V0cHV0SW50ZXJmYWNlCnsKcHJpdmF0ZSAkZm9ybWF0dGVyOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZvcm1hdHRlcihPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlcikKewoKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZvcm1hdHRlcigpCnsKaWYgKCR0aGlzLT5mb3JtYXR0ZXIpIHsKcmV0dXJuICR0aGlzLT5mb3JtYXR0ZXI7Cn0KCnJldHVybiAkdGhpcy0+Zm9ybWF0dGVyID0gbmV3IE51bGxPdXRwdXRGb3JtYXR0ZXIoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlY29yYXRlZChib29sICRkZWNvcmF0ZWQpCnsKCn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmVyYm9zaXR5KGludCAkbGV2ZWwpCnsKCn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJib3NpdHkoKQp7CnJldHVybiBzZWxmOjpWRVJCT1NJVFlfUVVJRVQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1F1aWV0KCkKewpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyYm9zZSgpCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJ5VmVyYm9zZSgpCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWJ1ZygpCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVsbigkbWVzc2FnZXMsIGludCAkb3B0aW9ucyA9IHNlbGY6Ok9VVFBVVF9OT1JNQUwpCnsKCn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSBmYWxzZSwgaW50ICRvcHRpb25zID0gc2VsZjo6T1VUUFVUX05PUk1BTCkKewoKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCmFic3RyYWN0IGNsYXNzIE91dHB1dCBpbXBsZW1lbnRzIE91dHB1dEludGVyZmFjZQp7CnByaXZhdGUgJHZlcmJvc2l0eTsKcHJpdmF0ZSAkZm9ybWF0dGVyOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP2ludCAkdmVyYm9zaXR5ID0gc2VsZjo6VkVSQk9TSVRZX05PUk1BTCwgYm9vbCAkZGVjb3JhdGVkID0gZmFsc2UsID9PdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlciA9IG51bGwpCnsKJHRoaXMtPnZlcmJvc2l0eSA9ICR2ZXJib3NpdHkgPz8gc2VsZjo6VkVSQk9TSVRZX05PUk1BTDsKJHRoaXMtPmZvcm1hdHRlciA9ICRmb3JtYXR0ZXIgPz8gbmV3IE91dHB1dEZvcm1hdHRlcigpOwokdGhpcy0+Zm9ybWF0dGVyLT5zZXREZWNvcmF0ZWQoJGRlY29yYXRlZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXR0ZXIoT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIpCnsKJHRoaXMtPmZvcm1hdHRlciA9ICRmb3JtYXR0ZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXR0ZXIoKQp7CnJldHVybiAkdGhpcy0+Zm9ybWF0dGVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVjb3JhdGVkKGJvb2wgJGRlY29yYXRlZCkKewokdGhpcy0+Zm9ybWF0dGVyLT5zZXREZWNvcmF0ZWQoJGRlY29yYXRlZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpCnsKcmV0dXJuICR0aGlzLT5mb3JtYXR0ZXItPmlzRGVjb3JhdGVkKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJib3NpdHkoaW50ICRsZXZlbCkKewokdGhpcy0+dmVyYm9zaXR5ID0gJGxldmVsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyYm9zaXR5KCkKewpyZXR1cm4gJHRoaXMtPnZlcmJvc2l0eTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUXVpZXQoKQp7CnJldHVybiBzZWxmOjpWRVJCT1NJVFlfUVVJRVQgPT09ICR0aGlzLT52ZXJib3NpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcmJvc2UoKQp7CnJldHVybiBzZWxmOjpWRVJCT1NJVFlfVkVSQk9TRSA8PSAkdGhpcy0+dmVyYm9zaXR5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJ5VmVyYm9zZSgpCnsKcmV0dXJuIHNlbGY6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UgPD0gJHRoaXMtPnZlcmJvc2l0eTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVidWcoKQp7CnJldHVybiBzZWxmOjpWRVJCT1NJVFlfREVCVUcgPD0gJHRoaXMtPnZlcmJvc2l0eTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlbG4oJG1lc3NhZ2VzLCBpbnQgJG9wdGlvbnMgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7CiR0aGlzLT53cml0ZSgkbWVzc2FnZXMsIHRydWUsICRvcHRpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IGZhbHNlLCBpbnQgJG9wdGlvbnMgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7CmlmICghaXNfaXRlcmFibGUoJG1lc3NhZ2VzKSkgewokbWVzc2FnZXMgPSBbJG1lc3NhZ2VzXTsKfQoKJHR5cGVzID0gc2VsZjo6T1VUUFVUX05PUk1BTCB8IHNlbGY6Ok9VVFBVVF9SQVcgfCBzZWxmOjpPVVRQVVRfUExBSU47CiR0eXBlID0gJHR5cGVzICYgJG9wdGlvbnMgPzogc2VsZjo6T1VUUFVUX05PUk1BTDsKCiR2ZXJib3NpdGllcyA9IHNlbGY6OlZFUkJPU0lUWV9RVUlFVCB8IHNlbGY6OlZFUkJPU0lUWV9OT1JNQUwgfCBzZWxmOjpWRVJCT1NJVFlfVkVSQk9TRSB8IHNlbGY6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UgfCBzZWxmOjpWRVJCT1NJVFlfREVCVUc7CiR2ZXJib3NpdHkgPSAkdmVyYm9zaXRpZXMgJiAkb3B0aW9ucyA/OiBzZWxmOjpWRVJCT1NJVFlfTk9STUFMOwoKaWYgKCR2ZXJib3NpdHkgPiAkdGhpcy0+Z2V0VmVyYm9zaXR5KCkpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJG1lc3NhZ2UpIHsKc3dpdGNoICgkdHlwZSkgewpjYXNlIE91dHB1dEludGVyZmFjZTo6T1VUUFVUX05PUk1BTDoKJG1lc3NhZ2UgPSAkdGhpcy0+Zm9ybWF0dGVyLT5mb3JtYXQoJG1lc3NhZ2UpOwpicmVhazsKY2FzZSBPdXRwdXRJbnRlcmZhY2U6Ok9VVFBVVF9SQVc6CmJyZWFrOwpjYXNlIE91dHB1dEludGVyZmFjZTo6T1VUUFVUX1BMQUlOOgokbWVzc2FnZSA9IHN0cmlwX3RhZ3MoJHRoaXMtPmZvcm1hdHRlci0+Zm9ybWF0KCRtZXNzYWdlKSk7CmJyZWFrOwp9CgokdGhpcy0+ZG9Xcml0ZSgkbWVzc2FnZSA/PyAnJywgJG5ld2xpbmUpOwp9Cn0KCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkb1dyaXRlKHN0cmluZyAkbWVzc2FnZSwgYm9vbCAkbmV3bGluZSk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CgoKCgoKCmludGVyZmFjZSBPdXRwdXRJbnRlcmZhY2UKewpwdWJsaWMgY29uc3QgVkVSQk9TSVRZX1FVSUVUID0gMTY7CnB1YmxpYyBjb25zdCBWRVJCT1NJVFlfTk9STUFMID0gMzI7CnB1YmxpYyBjb25zdCBWRVJCT1NJVFlfVkVSQk9TRSA9IDY0OwpwdWJsaWMgY29uc3QgVkVSQk9TSVRZX1ZFUllfVkVSQk9TRSA9IDEyODsKcHVibGljIGNvbnN0IFZFUkJPU0lUWV9ERUJVRyA9IDI1NjsKCnB1YmxpYyBjb25zdCBPVVRQVVRfTk9STUFMID0gMTsKcHVibGljIGNvbnN0IE9VVFBVVF9SQVcgPSAyOwpwdWJsaWMgY29uc3QgT1VUUFVUX1BMQUlOID0gNDsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gZmFsc2UsIGludCAkb3B0aW9ucyA9IDApOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlbG4oJG1lc3NhZ2VzLCBpbnQgJG9wdGlvbnMgPSAwKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJib3NpdHkoaW50ICRsZXZlbCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJib3NpdHkoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUXVpZXQoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyYm9zZSgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJ5VmVyYm9zZSgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWJ1ZygpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlY29yYXRlZChib29sICRkZWNvcmF0ZWQpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKTsKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXR0ZXIoT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVyKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgoKY2xhc3MgU3RyZWFtT3V0cHV0IGV4dGVuZHMgT3V0cHV0CnsKcHJpdmF0ZSAkc3RyZWFtOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHN0cmVhbSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpWRVJCT1NJVFlfTk9STUFMLCA/Ym9vbCAkZGVjb3JhdGVkID0gbnVsbCwgP091dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyID0gbnVsbCkKewppZiAoIVxpc19yZXNvdXJjZSgkc3RyZWFtKSB8fCAnc3RyZWFtJyAhPT0gZ2V0X3Jlc291cmNlX3R5cGUoJHN0cmVhbSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIFN0cmVhbU91dHB1dCBjbGFzcyBuZWVkcyBhIHN0cmVhbSBhcyBpdHMgZmlyc3QgYXJndW1lbnQuJyk7Cn0KCiR0aGlzLT5zdHJlYW0gPSAkc3RyZWFtOwoKaWYgKG51bGwgPT09ICRkZWNvcmF0ZWQpIHsKJGRlY29yYXRlZCA9ICR0aGlzLT5oYXNDb2xvclN1cHBvcnQoKTsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkdmVyYm9zaXR5LCAkZGVjb3JhdGVkLCAkZm9ybWF0dGVyKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RyZWFtKCkKewpyZXR1cm4gJHRoaXMtPnN0cmVhbTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvV3JpdGUoc3RyaW5nICRtZXNzYWdlLCBib29sICRuZXdsaW5lKQp7CmlmICgkbmV3bGluZSkgewokbWVzc2FnZSAuPSBcUEhQX0VPTDsKfQoKQGZ3cml0ZSgkdGhpcy0+c3RyZWFtLCAkbWVzc2FnZSk7CgpmZmx1c2goJHRoaXMtPnN0cmVhbSk7Cn0KCgoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzQ29sb3JTdXBwb3J0KCkKewoKaWYgKCcnICE9PSAoKCRfU0VSVkVSWydOT19DT0xPUiddID8/IGdldGVudignTk9fQ09MT1InKSlbMF0gPz8gJycpKSB7CnJldHVybiBmYWxzZTsKfQoKCgppZiAoIUBzdHJlYW1faXNhdHR5KCR0aGlzLT5zdHJlYW0pICYmICFcaW5fYXJyYXkoc3RydG91cHBlcigoc3RyaW5nKSBnZXRlbnYoJ01TWVNURU0nKSksIFsnTUlOR1czMicsICdNSU5HVzY0J10sIHRydWUpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SICYmIEBzYXBpX3dpbmRvd3NfdnQxMDBfc3VwcG9ydCgkdGhpcy0+c3RyZWFtKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCdIeXBlcicgPT09IGdldGVudignVEVSTV9QUk9HUkFNJykKfHwgZmFsc2UgIT09IGdldGVudignQ09MT1JURVJNJykKfHwgZmFsc2UgIT09IGdldGVudignQU5TSUNPTicpCnx8ICdPTicgPT09IGdldGVudignQ29uRW11QU5TSScpCikgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCdkdW1iJyA9PT0gJHRlcm0gPSAoc3RyaW5nKSBnZXRlbnYoJ1RFUk0nKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgpyZXR1cm4gcHJlZ19tYXRjaCgnL14oKHNjcmVlbnx4dGVybXx2dDEwMHx2dDIyMHxwdXR0eXxyeHZ0fGFuc2l8Y3lnd2lufGxpbnV4KS4qKXwoLiotMjU2KGNvbG9yKT8oLWJjZSk/KSQvJywgJHRlcm0pOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIFRyaW1tZWRCdWZmZXJPdXRwdXQgZXh0ZW5kcyBPdXRwdXQKewpwcml2YXRlICRtYXhMZW5ndGg7CnByaXZhdGUgJGJ1ZmZlciA9ICcnOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkbWF4TGVuZ3RoLCA/aW50ICR2ZXJib3NpdHkgPSBzZWxmOjpWRVJCT1NJVFlfTk9STUFMLCBib29sICRkZWNvcmF0ZWQgPSBmYWxzZSwgP091dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyID0gbnVsbCkKewppZiAoJG1heExlbmd0aCA8PSAwKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignIiVzKCkiIGV4cGVjdHMgYSBzdHJpY3RseSBwb3NpdGl2ZSBtYXhMZW5ndGguIEdvdCAlZC4nLCBfX01FVEhPRF9fLCAkbWF4TGVuZ3RoKSk7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJHZlcmJvc2l0eSwgJGRlY29yYXRlZCwgJGZvcm1hdHRlcik7CiR0aGlzLT5tYXhMZW5ndGggPSAkbWF4TGVuZ3RoOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmZXRjaCgpCnsKJGNvbnRlbnQgPSAkdGhpcy0+YnVmZmVyOwokdGhpcy0+YnVmZmVyID0gJyc7CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1dyaXRlKHN0cmluZyAkbWVzc2FnZSwgYm9vbCAkbmV3bGluZSkKewokdGhpcy0+YnVmZmVyIC49ICRtZXNzYWdlOwoKaWYgKCRuZXdsaW5lKSB7CiR0aGlzLT5idWZmZXIgLj0gXFBIUF9FT0w7Cn0KCiR0aGlzLT5idWZmZXIgPSBzdWJzdHIoJHRoaXMtPmJ1ZmZlciwgMCAtICR0aGlzLT5tYXhMZW5ndGgpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgQ2hvaWNlUXVlc3Rpb24gZXh0ZW5kcyBRdWVzdGlvbgp7CnByaXZhdGUgJGNob2ljZXM7CnByaXZhdGUgJG11bHRpc2VsZWN0ID0gZmFsc2U7CnByaXZhdGUgJHByb21wdCA9ICcgPiAnOwpwcml2YXRlICRlcnJvck1lc3NhZ2UgPSAnVmFsdWUgIiVzIiBpcyBpbnZhbGlkJzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcXVlc3Rpb24sIGFycmF5ICRjaG9pY2VzLCAkZGVmYXVsdCA9IG51bGwpCnsKaWYgKCEkY2hvaWNlcykgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdDaG9pY2UgcXVlc3Rpb24gbXVzdCBoYXZlIGF0IGxlYXN0IDEgY2hvaWNlIGF2YWlsYWJsZS4nKTsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkcXVlc3Rpb24sICRkZWZhdWx0KTsKCiR0aGlzLT5jaG9pY2VzID0gJGNob2ljZXM7CiR0aGlzLT5zZXRWYWxpZGF0b3IoJHRoaXMtPmdldERlZmF1bHRWYWxpZGF0b3IoKSk7CiR0aGlzLT5zZXRBdXRvY29tcGxldGVyVmFsdWVzKCRjaG9pY2VzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hvaWNlcygpCnsKcmV0dXJuICR0aGlzLT5jaG9pY2VzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE11bHRpc2VsZWN0KGJvb2wgJG11bHRpc2VsZWN0KQp7CiR0aGlzLT5tdWx0aXNlbGVjdCA9ICRtdWx0aXNlbGVjdDsKJHRoaXMtPnNldFZhbGlkYXRvcigkdGhpcy0+Z2V0RGVmYXVsdFZhbGlkYXRvcigpKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNNdWx0aXNlbGVjdCgpCnsKcmV0dXJuICR0aGlzLT5tdWx0aXNlbGVjdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvbXB0KCkKewpyZXR1cm4gJHRoaXMtPnByb21wdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJvbXB0KHN0cmluZyAkcHJvbXB0KQp7CiR0aGlzLT5wcm9tcHQgPSAkcHJvbXB0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEVycm9yTWVzc2FnZShzdHJpbmcgJGVycm9yTWVzc2FnZSkKewokdGhpcy0+ZXJyb3JNZXNzYWdlID0gJGVycm9yTWVzc2FnZTsKJHRoaXMtPnNldFZhbGlkYXRvcigkdGhpcy0+Z2V0RGVmYXVsdFZhbGlkYXRvcigpKTsKCnJldHVybiAkdGhpczsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREZWZhdWx0VmFsaWRhdG9yKCk6IGNhbGxhYmxlCnsKJGNob2ljZXMgPSAkdGhpcy0+Y2hvaWNlczsKJGVycm9yTWVzc2FnZSA9ICR0aGlzLT5lcnJvck1lc3NhZ2U7CiRtdWx0aXNlbGVjdCA9ICR0aGlzLT5tdWx0aXNlbGVjdDsKJGlzQXNzb2MgPSAkdGhpcy0+aXNBc3NvYygkY2hvaWNlcyk7CgpyZXR1cm4gZnVuY3Rpb24gKCRzZWxlY3RlZCkgdXNlICgkY2hvaWNlcywgJGVycm9yTWVzc2FnZSwgJG11bHRpc2VsZWN0LCAkaXNBc3NvYykgewppZiAoJG11bHRpc2VsZWN0KSB7CgppZiAoIXByZWdfbWF0Y2goJy9eW14sXSsoPzosW14sXSspKiQvJywgKHN0cmluZykgJHNlbGVjdGVkLCAkbWF0Y2hlcykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCRlcnJvck1lc3NhZ2UsICRzZWxlY3RlZCkpOwp9Cgokc2VsZWN0ZWRDaG9pY2VzID0gZXhwbG9kZSgnLCcsIChzdHJpbmcpICRzZWxlY3RlZCk7Cn0gZWxzZSB7CiRzZWxlY3RlZENob2ljZXMgPSBbJHNlbGVjdGVkXTsKfQoKaWYgKCR0aGlzLT5pc1RyaW1tYWJsZSgpKSB7CmZvcmVhY2ggKCRzZWxlY3RlZENob2ljZXMgYXMgJGsgPT4gJHYpIHsKJHNlbGVjdGVkQ2hvaWNlc1ska10gPSB0cmltKChzdHJpbmcpICR2KTsKfQp9CgokbXVsdGlzZWxlY3RDaG9pY2VzID0gW107CmZvcmVhY2ggKCRzZWxlY3RlZENob2ljZXMgYXMgJHZhbHVlKSB7CiRyZXN1bHRzID0gW107CmZvcmVhY2ggKCRjaG9pY2VzIGFzICRrZXkgPT4gJGNob2ljZSkgewppZiAoJGNob2ljZSA9PT0gJHZhbHVlKSB7CiRyZXN1bHRzW10gPSAka2V5Owp9Cn0KCmlmIChcY291bnQoJHJlc3VsdHMpID4gMSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBwcm92aWRlZCBhbnN3ZXIgaXMgYW1iaWd1b3VzLiBWYWx1ZSBzaG91bGQgYmUgb25lIG9mICIlcyIuJywgaW1wbG9kZSgnIiBvciAiJywgJHJlc3VsdHMpKSk7Cn0KCiRyZXN1bHQgPSBhcnJheV9zZWFyY2goJHZhbHVlLCAkY2hvaWNlcyk7CgppZiAoISRpc0Fzc29jKSB7CmlmIChmYWxzZSAhPT0gJHJlc3VsdCkgewokcmVzdWx0ID0gJGNob2ljZXNbJHJlc3VsdF07Cn0gZWxzZWlmIChpc3NldCgkY2hvaWNlc1skdmFsdWVdKSkgewokcmVzdWx0ID0gJGNob2ljZXNbJHZhbHVlXTsKfQp9IGVsc2VpZiAoZmFsc2UgPT09ICRyZXN1bHQgJiYgaXNzZXQoJGNob2ljZXNbJHZhbHVlXSkpIHsKJHJlc3VsdCA9ICR2YWx1ZTsKfQoKaWYgKGZhbHNlID09PSAkcmVzdWx0KSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigkZXJyb3JNZXNzYWdlLCAkdmFsdWUpKTsKfQoKCiRtdWx0aXNlbGVjdENob2ljZXNbXSA9ICRpc0Fzc29jID8gKHN0cmluZykgJHJlc3VsdCA6ICRyZXN1bHQ7Cn0KCmlmICgkbXVsdGlzZWxlY3QpIHsKcmV0dXJuICRtdWx0aXNlbGVjdENob2ljZXM7Cn0KCnJldHVybiBjdXJyZW50KCRtdWx0aXNlbGVjdENob2ljZXMpOwp9Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uOwoKCgoKCgpjbGFzcyBDb25maXJtYXRpb25RdWVzdGlvbiBleHRlbmRzIFF1ZXN0aW9uCnsKcHJpdmF0ZSAkdHJ1ZUFuc3dlclJlZ2V4OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRxdWVzdGlvbiwgYm9vbCAkZGVmYXVsdCA9IHRydWUsIHN0cmluZyAkdHJ1ZUFuc3dlclJlZ2V4ID0gJy9eeS9pJykKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRxdWVzdGlvbiwgJGRlZmF1bHQpOwoKJHRoaXMtPnRydWVBbnN3ZXJSZWdleCA9ICR0cnVlQW5zd2VyUmVnZXg7CiR0aGlzLT5zZXROb3JtYWxpemVyKCR0aGlzLT5nZXREZWZhdWx0Tm9ybWFsaXplcigpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREZWZhdWx0Tm9ybWFsaXplcigpOiBjYWxsYWJsZQp7CiRkZWZhdWx0ID0gJHRoaXMtPmdldERlZmF1bHQoKTsKJHJlZ2V4ID0gJHRoaXMtPnRydWVBbnN3ZXJSZWdleDsKCnJldHVybiBmdW5jdGlvbiAoJGFuc3dlcikgdXNlICgkZGVmYXVsdCwgJHJlZ2V4KSB7CmlmIChcaXNfYm9vbCgkYW5zd2VyKSkgewpyZXR1cm4gJGFuc3dlcjsKfQoKJGFuc3dlcklzVHJ1ZSA9IChib29sKSBwcmVnX21hdGNoKCRyZWdleCwgJGFuc3dlcik7CmlmIChmYWxzZSA9PT0gJGRlZmF1bHQpIHsKcmV0dXJuICRhbnN3ZXIgJiYgJGFuc3dlcklzVHJ1ZTsKfQoKcmV0dXJuICcnID09PSAkYW5zd2VyIHx8ICRhbnN3ZXJJc1RydWU7Cn07Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb247Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CgoKCgoKCmNsYXNzIFF1ZXN0aW9uCnsKcHJpdmF0ZSAkcXVlc3Rpb247CnByaXZhdGUgJGF0dGVtcHRzOwpwcml2YXRlICRoaWRkZW4gPSBmYWxzZTsKcHJpdmF0ZSAkaGlkZGVuRmFsbGJhY2sgPSB0cnVlOwpwcml2YXRlICRhdXRvY29tcGxldGVyQ2FsbGJhY2s7CnByaXZhdGUgJHZhbGlkYXRvcjsKcHJpdmF0ZSAkZGVmYXVsdDsKcHJpdmF0ZSAkbm9ybWFsaXplcjsKcHJpdmF0ZSAkdHJpbW1hYmxlID0gdHJ1ZTsKcHJpdmF0ZSAkbXVsdGlsaW5lID0gZmFsc2U7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcXVlc3Rpb24sICRkZWZhdWx0ID0gbnVsbCkKewokdGhpcy0+cXVlc3Rpb24gPSAkcXVlc3Rpb247CiR0aGlzLT5kZWZhdWx0ID0gJGRlZmF1bHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFF1ZXN0aW9uKCkKewpyZXR1cm4gJHRoaXMtPnF1ZXN0aW9uOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZWZhdWx0KCkKewpyZXR1cm4gJHRoaXMtPmRlZmF1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc011bHRpbGluZSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5tdWx0aWxpbmU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE11bHRpbGluZShib29sICRtdWx0aWxpbmUpOiBzZWxmCnsKJHRoaXMtPm11bHRpbGluZSA9ICRtdWx0aWxpbmU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSGlkZGVuKCkKewpyZXR1cm4gJHRoaXMtPmhpZGRlbjsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIaWRkZW4oYm9vbCAkaGlkZGVuKQp7CmlmICgkdGhpcy0+YXV0b2NvbXBsZXRlckNhbGxiYWNrKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignQSBoaWRkZW4gcXVlc3Rpb24gY2Fubm90IHVzZSB0aGUgYXV0b2NvbXBsZXRlci4nKTsKfQoKJHRoaXMtPmhpZGRlbiA9ICRoaWRkZW47CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSGlkZGVuRmFsbGJhY2soKQp7CnJldHVybiAkdGhpcy0+aGlkZGVuRmFsbGJhY2s7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhpZGRlbkZhbGxiYWNrKGJvb2wgJGZhbGxiYWNrKQp7CiR0aGlzLT5oaWRkZW5GYWxsYmFjayA9ICRmYWxsYmFjazsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0b2NvbXBsZXRlclZhbHVlcygpCnsKJGNhbGxiYWNrID0gJHRoaXMtPmdldEF1dG9jb21wbGV0ZXJDYWxsYmFjaygpOwoKcmV0dXJuICRjYWxsYmFjayA/ICRjYWxsYmFjaygnJykgOiBudWxsOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9jb21wbGV0ZXJWYWx1ZXMoP2l0ZXJhYmxlICR2YWx1ZXMpCnsKaWYgKFxpc19hcnJheSgkdmFsdWVzKSkgewokdmFsdWVzID0gJHRoaXMtPmlzQXNzb2MoJHZhbHVlcykgPyBhcnJheV9tZXJnZShhcnJheV9rZXlzKCR2YWx1ZXMpLCBhcnJheV92YWx1ZXMoJHZhbHVlcykpIDogYXJyYXlfdmFsdWVzKCR2YWx1ZXMpOwoKJGNhbGxiYWNrID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJHZhbHVlcykgewpyZXR1cm4gJHZhbHVlczsKfTsKfSBlbHNlaWYgKCR2YWx1ZXMgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKJHZhbHVlQ2FjaGUgPSBudWxsOwokY2FsbGJhY2sgPSBzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkdmFsdWVzLCAmJHZhbHVlQ2FjaGUpIHsKcmV0dXJuICR2YWx1ZUNhY2hlID8/ICR2YWx1ZUNhY2hlID0gaXRlcmF0b3JfdG9fYXJyYXkoJHZhbHVlcywgZmFsc2UpOwp9Owp9IGVsc2UgewokY2FsbGJhY2sgPSBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPnNldEF1dG9jb21wbGV0ZXJDYWxsYmFjaygkY2FsbGJhY2spOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0b2NvbXBsZXRlckNhbGxiYWNrKCk6ID9jYWxsYWJsZQp7CnJldHVybiAkdGhpcy0+YXV0b2NvbXBsZXRlckNhbGxiYWNrOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9jb21wbGV0ZXJDYWxsYmFjayg/Y2FsbGFibGUgJGNhbGxiYWNrID0gbnVsbCk6IHNlbGYKewppZiAoJHRoaXMtPmhpZGRlbiAmJiBudWxsICE9PSAkY2FsbGJhY2spIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdBIGhpZGRlbiBxdWVzdGlvbiBjYW5ub3QgdXNlIHRoZSBhdXRvY29tcGxldGVyLicpOwp9CgokdGhpcy0+YXV0b2NvbXBsZXRlckNhbGxiYWNrID0gJGNhbGxiYWNrOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWYWxpZGF0b3IoP2NhbGxhYmxlICR2YWxpZGF0b3IgPSBudWxsKQp7CiR0aGlzLT52YWxpZGF0b3IgPSAkdmFsaWRhdG9yOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWYWxpZGF0b3IoKQp7CnJldHVybiAkdGhpcy0+dmFsaWRhdG9yOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TWF4QXR0ZW1wdHMoP2ludCAkYXR0ZW1wdHMpCnsKaWYgKG51bGwgIT09ICRhdHRlbXB0cyAmJiAkYXR0ZW1wdHMgPCAxKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ01heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIG11c3QgYmUgYSBwb3NpdGl2ZSB2YWx1ZS4nKTsKfQoKJHRoaXMtPmF0dGVtcHRzID0gJGF0dGVtcHRzOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE1heEF0dGVtcHRzKCkKewpyZXR1cm4gJHRoaXMtPmF0dGVtcHRzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE5vcm1hbGl6ZXIoY2FsbGFibGUgJG5vcm1hbGl6ZXIpCnsKJHRoaXMtPm5vcm1hbGl6ZXIgPSAkbm9ybWFsaXplcjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROb3JtYWxpemVyKCkKewpyZXR1cm4gJHRoaXMtPm5vcm1hbGl6ZXI7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpc0Fzc29jKGFycmF5ICRhcnJheSkKewpyZXR1cm4gKGJvb2wpIFxjb3VudChhcnJheV9maWx0ZXIoYXJyYXlfa2V5cygkYXJyYXkpLCAnaXNfc3RyaW5nJykpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNUcmltbWFibGUoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+dHJpbW1hYmxlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VHJpbW1hYmxlKGJvb2wgJHRyaW1tYWJsZSk6IHNlbGYKewokdGhpcy0+dHJpbW1hYmxlID0gJHRyaW1tYWJsZTsKCnJldHVybiAkdGhpczsKfQp9Ck1akAADAAAABAAAAP//AAC4AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAAAOH7oOALQJzSG4AUzNIVRoaXMgcHJvZ3JhbSBjYW5ub3QgYmUgcnVuIGluIERPUyBtb2RlLg0NCiQAAAAAAAAAf8YszTunQp47p0KeO6dCnjLf1546p0KeMt/Bni2nQp4y38aeOadCnjLf0Z4/p0KeHGE5njinQp47p0OeCKdCnjLfyJ46p0KeMt/WnjqnQp4y39OeOqdCnlJpY2g7p0KeAAAAAAAAAABQRQAATAEFAKxNb08AAAAAAAAAAOAAAgELAQkAAAoAAAAWAAAAAAAAOBMAAAAQAAAAIAAAAABAAAAQAAAAAgAABQAAAAAAAAAFAAAAAAAAAABgAAAABAAAP5wAAAMAQIEAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAJAiAABQAAAAAEAAACAGAAAAAAAAAAAAAAAAAAAAAAAAAFAAAHABAAAAIQAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADghAABAAAAAAAAAAAAAAAAAIAAA2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAACwkAAAAQAAAACgAAAAQAAAAAAAAAAAAAAAAAACAAAGAucmRhdGEAAM4JAAAAIAAAAAoAAAAOAAAAAAAAAAAAAAAAAABAAABALmRhdGEAAACQAwAAADAAAAACAAAAGAAAAAAAAAAAAAAAAAAAQAAAwC5yc3JjAAAAIAYAAABAAAAACAAAABoAAAAAAAAAAAAAAAAAAEAAAEAucmVsb2MAAMwBAAAAUAAAAAIAAAAiAAAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqJLjmGEAA6HgIAABq9v8VCCBAAINl0ACL8I1F0FBW/xUAIEAAi0XQg+D7UFb/FQQgQACNTdT/FVggQACDZfwAjUXUUP81SCBAAP8VTCBAAFlZ/zVcIEAAjUXUUP81YCBAAP8VRCBAAFlZi8j/FVAgQACDTfz/jU3U/xVUIEAAM8DoSAgAAMM7DQAwQAB1AvPD6awCAABogBVAAOijBAAAoWwzQADHBCQ0MEAA/zVoM0AAozQwQABoJDBAAGgoMEAAaCAwQAD/FaAgQACDxBSjMDBAAIXAfQhqCOi5AwAAWcNqEGgIIkAA6B8GAAAz24ld/GShGAAAAItwBIld5L+AM0AAU1ZX/xUwIEAAO8N0GTvGdQgz9kaJdeTrEGjoAwAA/xU0IEAA69oz9kahfDNAADvGdQpqH+hcAwAAWes7oXwzQACFwHUsiTV8M0AAaPAgQABo5CBAAOinBQAAWVmFwHQXx0X8/v///7j/AAAA6d0AAACJNTwwQAChfDNAADvGdRto4CBAAGjYIEAA6GwFAABZWccFfDNAAAIAAAA5XeR1CFNX/xU4IEAAOR2MM0AAdBlojDNAAOiDBAAAWYXAdApTagJT/xWMM0AAoSQwQACLDbwgQACJAf81JDBAAP81KDBAAP81IDBAAOgQ/v//g8QMozgwQAA5HSwwQAB1N1D/FcAgQACLReyLCIsJiU3gUFHojgMAAFlZw4tl6ItF4KM4MEAAM9s5HSwwQAB1B1D/FWggQAA5HTwwQAB1Bv8VnCBAAMdF/P7///+hODBAAOj7BAAAw7hNWgAAZjkFAABAAHQEM8DrTaE8AEAAjYAAAEAAgThQRQAAdekPt0gYgfkLAQAAdBuB+QsCAAB11YO4hAAAAA52zDPJOYj4AAAA6w6DeHQOdrwzyTmI6AAAAA+VwYvBagGjLDBAAP8VcCBAAGr//xVsIEAAWVmjhDNAAKOIM0AA/xXMIEAAiw10M0AAiQj/FYggQACLDXAzQACJCKGoIEAAiwCjeDNAAOhWAgAA6KwEAACDPRQwQAAAdQxotRdAAP8VrCBAAFnoZwQAAIM9EDBAAP91CWr//xWwIEAAWTPAw+h7BAAA6Z/9//+L/1WL7IHsKAMAAKNIMUAAiQ1EMUAAiRVAMUAAiR08MUAAiTU4MUAAiT00MUAAZowVYDFAAGaMDVQxQABmjB0wMUAAZowFLDFAAGaMJSgxQABmjC0kMUAAnI8FWDFAAItFAKNMMUAAi0UEo1AxQACNRQijXDFAAIuF4Pz//8cFmDBAAAEAAQChUDFAAKNMMEAAxwVAMEAACQQAwMcFRDBAAAEAAAChADBAAImF2Pz//6EEMEAAiYXc/P///xUcIEAAo5AwQABqAeg/BAAAWWoA/xUgIEAAaBwhQAD/FSQgQACDPZAwQAAAdQhqAegbBAAAWWgJBADA/xUoIEAAUP8VLCBAAMnDi/9Vi+yLRQiLAIE4Y3Nt4HUqg3gQA3Uki0AUPSAFkxl0FT0hBZMZdA49IgWTGXQHPQBAmQF1BejQAwAAM8BdwgQAaEgUQAD/FSAgQAAzwMP/JaQgQABqFGgoIkAA6GICAAD/NYgzQACLNYwgQAD/1lmJReSD+P91DP91CP8VxCBAAFnrZ2oI6JIDAABZg2X8AP81iDNAAP/WiUXk/zWEM0AA/9ZZWYlF4I1F4FCNReRQ/3UIizVsIEAA/9ZZUOhVAwAAiUXc/3Xk/9ajiDNAAP914P/Wg8QUo4QzQADHRfz+////6AkAAACLRdzoGAIAAMNqCOgZAwAAWcOL/1WL7P91COhO////99gbwPfYWUhdw4v/Vrj8IUAAvvwhQABXi/g7xnMPiweFwHQC/9CDxwQ7/nLxX17Di/9WuAQiQAC+BCJAAFeL+DvGcw+LB4XAdAL/0IPHBDv+cvFfXsP/JcggQADMzMzMi/9Vi+yLTQi4TVoAAGY5AXQEM8Bdw4tBPAPBgThQRQAAde8z0rkLAQAAZjlIGA+UwovCXcPMzMzMzMzMzMzMzIv/VYvsi0UIi0g8A8gPt0EUU1YPt3EGM9JXjUQIGIX2dhuLfQyLSAw7+XIJi1gIA9k7+3IKQoPAKDvWcugzwF9eW13DzMzMzMzMzMzMzMzMi/9Vi+xq/mhIIkAAaGUXQABkoQAAAABQg+wIU1ZXoQAwQAAxRfgzxVCNRfBkowAAAACJZejHRfwAAAAAaAAAQADoKv///4PEBIXAdFWLRQgtAABAAFBoAABAAOhQ////g8QIhcB0O4tAJMHoH/fQg+ABx0X8/v///4tN8GSJDQAAAABZX15bi+Vdw4tF7IsIiwEz0j0FAADAD5TCi8LDi2Xox0X8/v///zPAi03wZIkNAAAAAFlfXluL5V3DzP8luCBAAP8ltCBAAMzMaGUXQABk/zUAAAAAi0QkEIlsJBCNbCQQK+BTVlehADBAADFF/DPFUIll6P91+ItF/MdF/P7///+JRfiNRfBkowAAAADDi03wZIkNAAAAAFlfX15bi+VdUcOL/1WL7P91FP91EP91DP91CGiHEEAAaAAwQADo5wAAAIPEGF3Di/9WaAAAAwBoAAABADP2VujZAAAAg8QMhcB0DVZWVlZW6MIAAACDxBRewzPAw4v/VYvsg+wQoQAwQACDZfgAg2X8AFNXv07mQLu7AAD//zvHdA2Fw3QJ99CjBDBAAOtgVo1F+FD/FTwgQACLdfwzdfj/FQwgQAAz8P8VECBAADPw/xUUIEAAM/CNRfBQ/xUYIEAAi0X0M0XwM/A793UHvk/mQLvrC4XzdQeLxsHgEAvwiTUAMEAA99aJNQQwQABeX1vJw/8ldCBAAP8leCBAAP8lfCBAAP8lgCBAAP8lhCBAAP8lkCBAAP8llCBAAP8lmCBAAP8l0CBAAFBk/zUAAAAAjUQkDCtkJAxTVleJKIvooQAwQAAzxVCJRfD/dfzHRfz/////jUX0ZKMAAAAAw4tN9GSJDQAAAABZX19eW4vlXVHDi03wM83or/f//+nd////jU3U/yVUIEAAi1QkCI1CDItKzDPI6JD3//+LSvwzyOiG9///uGwiQADpc////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuCMAAMojAADcIwAAiCkAAHIpAABiKQAASCkAADQpAAAWKQAA+igAAOYoAADSKAAAtCgAAKwoAACWKAAAnikAAAAAAAD6IwAA4CQAABolAADKJQAAGiYAAGQmAACuJgAApCQAAAAAAAAoJwAAxCcAANYnAADoJwAA/icAAB4oAAAoKAAANigAAKYnAABIKAAAWigAAHQoAACGKAAAHicAAA4nAAAAJwAAlicAAIInAABsJwAAXicAAFInAABGJwAAPicAAD4oAAAwJwAAticAALgpAAAAAAAAAAAAAJYQQAAAAAAAAAAAAFcSQACKFEAAAAAAAAAAAAAAAAAAAAAAAAAAAACsTW9PAAAAAAIAAABsAAAAgCEAAIAPAABAMEAAmDBAAGJhZCBhbGxvY2F0aW9uAAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBAAPAhQAACAAAAUlNEU9GMsxC0jwFKqCH2zOtMWgABAAAAYzpcdXNlcnNcc2VsZFxkb2N1bWVudHNcdmlzdWFsIHN0dWRpbyAyMDEwXFByb2plY3RzXGhpZGRlbmlucFxSZWxlYXNlXGhpZGRlbmlucC5wZGIAAAAAAGUXAADmGAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA0P///wAAAAD+////BxJAABsSQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAOhVAAAAAAAD+////AAAAANj///8AAAAA/v///8sWQADfFkAA/////90YQAAiBZMZAQAAAGQiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAADgIgAAAAAAAAAAAADsIwAAACAAACQjAAAAAAAAAAAAAPQmAABEIAAASCMAAAAAAAAAAAAAEigAAGggAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgjAADKIwAA3CMAAIgpAAByKQAAYikAAEgpAAA0KQAAFikAAPooAADmKAAA0igAALQoAACsKAAAligAAJ4pAAAAAAAA+iMAAOAkAAAaJQAAyiUAABomAABkJgAAriYAAKQkAAAAAAAAKCcAAMQnAADWJwAA6CcAAP4nAAAeKAAAKCgAADYoAACmJwAASCgAAFooAAB0KAAAhigAAB4nAAAOJwAAACcAAJYnAACCJwAAbCcAAF4nAABSJwAARicAAD4nAAA+KAAAMCcAALYnAAC4KQAAAAAAAJUBR2V0Q29uc29sZU1vZGUAALcDU2V0Q29uc29sZU1vZGUAADsCR2V0U3RkSGFuZGxlAABLRVJORUwzMi5kbGwAABYAPz8kPzZEVT8kY2hhcl90cmFpdHNAREBzdGRAQFY/JGFsbG9jYXRvckBEQDFAQHN0ZEBAWUFBQVY/JGJhc2ljX29zdHJlYW1ARFU/JGNoYXJfdHJhaXRzQERAc3RkQEBAMEBBQVYxMEBBQlY/JGJhc2ljX3N0cmluZ0BEVT8kY2hhcl90cmFpdHNAREBzdGRAQFY/JGFsbG9jYXRvckBEQDJAQDBAQFoAkQY/Y291dEBzdGRAQDNWPyRiYXNpY19vc3RyZWFtQERVPyRjaGFyX3RyYWl0c0BEQHN0ZEBAQDFAQQAASgY/Y2luQHN0ZEBAM1Y/JGJhc2ljX2lzdHJlYW1ARFU/JGNoYXJfdHJhaXRzQERAc3RkQEBAMUBBAMIAPz8kZ2V0bGluZUBEVT8kY2hhcl90cmFpdHNAREBzdGRAQFY/JGFsbG9jYXRvckBEQDJAQHN0ZEBAWUFBQVY/JGJhc2ljX2lzdHJlYW1ARFU/JGNoYXJfdHJhaXRzQERAc3RkQEBAMEBBQVYxMEBBQVY/JGJhc2ljX3N0cmluZ0BEVT8kY2hhcl90cmFpdHNAREBzdGRAQFY/JGFsbG9jYXRvckBEQDJAQDBAQFoAHQM/PzY/JGJhc2ljX29zdHJlYW1ARFU/JGNoYXJfdHJhaXRzQERAc3RkQEBAc3RkQEBRQUVBQVYwMUBQNkFBQVYwMUBBQVYwMUBAWkBaAABfAj8/MT8kYmFzaWNfc3RyaW5nQERVPyRjaGFyX3RyYWl0c0BEQHN0ZEBAVj8kYWxsb2NhdG9yQERAMkBAc3RkQEBRQUVAWFoAAHsBPz8wPyRiYXNpY19zdHJpbmdARFU/JGNoYXJfdHJhaXRzQERAc3RkQEBWPyRhbGxvY2F0b3JAREAyQEBzdGRAQFFBRUBYWgAAswc/ZW5kbEBzdGRAQFlBQUFWPyRiYXNpY19vc3RyZWFtQERVPyRjaGFyX3RyYWl0c0BEQHN0ZEBAQDFAQUFWMjFAQFoAAE1TVkNQOTAuZGxsABUBX2Ftc2dfZXhpdAAAnwBfX2dldG1haW5hcmdzACwBX2NleGl0AAB8AV9leGl0AGYAX1hjcHRGaWx0ZXIAzARleGl0AACgAF9faW5pdGVudgAEAl9pbml0dGVybQAFAl9pbml0dGVybV9lADwBX2NvbmZpZ3RocmVhZGxvY2FsZQDjAF9fc2V0dXNlcm1hdGhlcnIAAAsBX2FkanVzdF9mZGl2AADLAF9fcF9fY29tbW9kZQAAzwBfX3BfX2Ztb2RlAABqAV9lbmNvZGVfcG9pbnRlcgDgAF9fc2V0X2FwcF90eXBlAABLAV9jcnRfZGVidWdnZXJfaG9vawAAQwA/dGVybWluYXRlQEBZQVhYWgBNU1ZDUjkwLmRsbADmA191bmxvY2sAlgBfX2RsbG9uZXhpdAB2Al9sb2NrABwDX29uZXhpdABgAV9kZWNvZGVfcG9pbnRlcgBzAV9leGNlcHRfaGFuZGxlcjRfY29tbW9uAAsCX2ludm9rZV93YXRzb24AAD8BX2NvbnRyb2xmcF9zAAC9AkludGVybG9ja2VkRXhjaGFuZ2UAIQRTbGVlcAC6AkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlAAAtBFRlcm1pbmF0ZVByb2Nlc3MAAKkBR2V0Q3VycmVudFByb2Nlc3MAPgRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAABUEU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANECSXNEZWJ1Z2dlclByZXNlbnQAVANRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgBmAkdldFRpY2tDb3VudAAArQFHZXRDdXJyZW50VGhyZWFkSWQAAKoBR2V0Q3VycmVudFByb2Nlc3NJZABPAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAHMAX19DeHhGcmFtZUhhbmRsZXIzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE7mQLuxGb9E///////////+////AQAAACQhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAACABAAAAAgAACAGAAAADgAAIAAAAAAAAAAAAQAAAAAAAEAAQAAAFAAAIAAAAAAAAAAAAQAAAAAAAEAAQAAAGgAAIAAAAAAAAAAAAQAAAAAAAEACQQAAIAAAAAAAAAAAAAAAAQAAAAAAAEACQQAAJAAAACgQAAAKAMAAOQEAAAAAAAAyEMAAFYCAADkBAAAAAAAACgDNAAAAFYAUwBfAFYARQBSAFMASQBPAE4AXwBJAE4ARgBPAAAAAAC9BO/+AAABAAAAAQAAAAAAAAABAAAAAAAXAAAAAAAAAAQAAAABAAAAAAAAAAAAAAAAAAAAhgIAAAEAUwB0AHIAaQBuAGcARgBpAGwAZQBJAG4AZgBvAAAAYgIAAAEAMAA0ADAAOQAwADQAYgAwAAAAygBRAAEARgBpAGwAZQBEAGUAcwBjAHIAaQBwAHQAaQBvAG4AAAAAAFIAZQBhAGQAcwAgAGYAcgBvAG0AIABzAHQAZABpAG4AIAB3AGkAdABoAG8AdQB0ACAAbABlAGEAawBpAG4AZwAgAGkAbgBmAG8AIAB0AG8AIAB0AGgAZQAgAHQAZQByAG0AaQBuAGEAbAAgAGEAbgBkACAAbwB1AHQAcAB1AHQAcwAgAGIAYQBjAGsAIAB0AG8AIABzAHQAZABvAHUAdAAAAAAANgALAAEARgBpAGwAZQBWAGUAcgBzAGkAbwBuAAAAAAAxACwAIAAwACwAIAAwACwAIAAwAAAAAAA4AAwAAQBJAG4AdABlAHIAbgBhAGwATgBhAG0AZQAAAGgAaQBkAGQAZQBuAGkAbgBwAHUAdAAAAFAAFgABAEwAZQBnAGEAbABDAG8AcAB5AHIAaQBnAGgAdAAAAEoAbwByAGQAaQAgAEIAbwBnAGcAaQBhAG4AbwAgAC0AIAAyADAAMQAyAAAASAAQAAEATwByAGkAZwBpAG4AYQBsAEYAaQBsAGUAbgBhAG0AZQAAAGgAaQBkAGQAZQBuAGkAbgBwAHUAdAAuAGUAeABlAAAAOgANAAEAUAByAG8AZAB1AGMAdABOAGEAbQBlAAAAAABIAGkAZABkAGUAbgAgAEkAbgBwAHUAdAAAAAAAOgALAAEAUAByAG8AZAB1AGMAdABWAGUAcgBzAGkAbwBuAAAAMQAsACAAMAAsACAAMAAsACAAMAAAAAAARAAAAAEAVgBhAHIARgBpAGwAZQBJAG4AZgBvAAAAAAAkAAQAAABUAHIAYQBuAHMAbABhAHQAaQBvAG4AAAAAAAkEsAQ8YXNzZW1ibHkgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIiBtYW5pZmVzdFZlcnNpb249IjEuMCI+DQogIDx0cnVzdEluZm8geG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYzIj4NCiAgICA8c2VjdXJpdHk+DQogICAgICA8cmVxdWVzdGVkUHJpdmlsZWdlcz4NCiAgICAgICAgPHJlcXVlc3RlZEV4ZWN1dGlvbkxldmVsIGxldmVsPSJhc0ludm9rZXIiIHVpQWNjZXNzPSJmYWxzZSI+PC9yZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbD4NCiAgICAgIDwvcmVxdWVzdGVkUHJpdmlsZWdlcz4NCiAgICA8L3NlY3VyaXR5Pg0KICA8L3RydXN0SW5mbz4NCiAgPGRlcGVuZGVuY3k+DQogICAgPGRlcGVuZGVudEFzc2VtYmx5Pg0KICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgdHlwZT0id2luMzIiIG5hbWU9Ik1pY3Jvc29mdC5WQzkwLkNSVCIgdmVyc2lvbj0iOS4wLjIxMDIyLjgiIHByb2Nlc3NvckFyY2hpdGVjdHVyZT0ieDg2IiBwdWJsaWNLZXlUb2tlbj0iMWZjOGIzYjlhMWUxOGUzYiI+PC9hc3NlbWJseUlkZW50aXR5Pg0KICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQogIDwvZGVwZW5kZW5jeT4NCjwvYXNzZW1ibHk+UEFQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkcAEAAAQAEAAAMwEDAhMC8wODBGMEwwVDBeMGQwbjB7MIkwlzChMKgwrjCzMLgwvTDCMMgw0DDkMP8wCDEjMS0xQDFKMU8xVDF2MXsxhDGJMZYxpzGtMbQxyDHNMdMx2zHhMecx9DH6MQMyIjIqMjMyOTJBMk0yXzJqMnAyuTK/MscyzjLTMtky3zLnMu0y9DL7MgszEzMZMyUzMDNOM1QzWjNgM2YzbDNzM3ozgTOIM48zljOdM6UzrTO1M8EzyjPPM9Uz3zPoM/Mz/zMENBQ0GTQfNCU0OzRCNIs0kTSaNKE0rDSyNMY02zTmNP40FDUhNV41YzWENYk1qDVINk02XzZ9NpE2lzYANwY3DTcqN3c3fDfBN+Q38Tf9NwU4DTgZOD04RThQOFY4XDhiOGg4bjh0OHo4gDicOOI4AjkAAAAgAAAkAAAA3DDoMOwwHDEgMXQxeDEcMiAyQDJcMmAyaDJ0MgAwAAAMAAAAGDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFN5bWZvbnkgcGFja2FnZS4KIwojIChjKSBGYWJpZW4gUG90ZW5jaWVyIDxmYWJpZW5Ac3ltZm9ueS5jb20+CiMKIyBGb3IgdGhlIGZ1bGwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIGluZm9ybWF0aW9uLCBwbGVhc2UgdmlldwojIGh0dHBzOi8vc3ltZm9ueS5jb20vZG9jL2N1cnJlbnQvY29udHJpYnV0aW5nL2NvZGUvbGljZW5zZS5odG1sCgpfc2Zfe3sgQ09NTUFORF9OQU1FIH19KCkgewogICAgIyBVc2UgbmV3bGluZSBhcyBvbmx5IHNlcGFyYXRvciB0byBhbGxvdyBzcGFjZSBpbiBjb21wbGV0aW9uIHZhbHVlcwogICAgbG9jYWwgSUZTPSQnXG4nCiAgICBsb2NhbCBzZl9jbWQ9IiR7Q09NUF9XT1JEU1swXX0iCgogICAgIyBmb3IgYW4gYWxpYXMsIGdldCB0aGUgcmVhbCBzY3JpcHQgYmVoaW5kIGl0CiAgICBzZl9jbWRfdHlwZT0kKHR5cGUgLXQgJHNmX2NtZCkKICAgIGlmIFtbICRzZl9jbWRfdHlwZSA9PSAiYWxpYXMiIF1dOyB0aGVuCiAgICAgICAgc2ZfY21kPSQoYWxpYXMgJHNmX2NtZCB8IHNlZCAtRSAicy9hbGlhcyAkc2ZfY21kPScoLiopJy9cMS8iKQogICAgZWxpZiBbWyAkc2ZfY21kX3R5cGUgPT0gImZpbGUiIF1dOyB0aGVuCiAgICAgICAgc2ZfY21kPSQodHlwZSAtcCAkc2ZfY21kKQogICAgZmkKCiAgICBpZiBbWyAkc2ZfY21kX3R5cGUgIT0gImZ1bmN0aW9uIiAmJiAhIC14ICRzZl9jbWQgXV07IHRoZW4KICAgICAgICByZXR1cm4gMQogICAgZmkKCiAgICBsb2NhbCBjdXIgcHJldiB3b3JkcyBjd29yZAogICAgX2dldF9jb21wX3dvcmRzX2J5X3JlZiAtbiA6PSBjdXIgcHJldiB3b3JkcyBjd29yZAoKICAgIGxvY2FsIGNvbXBsZXRlY21kPSgiJHNmX2NtZCIgIl9jb21wbGV0ZSIgIi0tbm8taW50ZXJhY3Rpb24iICItc2Jhc2giICItYyRjd29yZCIgIi1Te3sgVkVSU0lPTiB9fSIpCiAgICBmb3IgdyBpbiAke3dvcmRzW0BdfTsgZG8KICAgICAgICB3PSQocHJpbnRmIC0tICclYicgIiR3IikKICAgICAgICAjIHJlbW92ZSBxdW90ZXMgZnJvbSB0eXBlZCB2YWx1ZXMKICAgICAgICBxdW90ZT0iJHt3OjA6MX0iCiAgICAgICAgaWYgWyAiJHF1b3RlIiA9PSBcJyBdOyB0aGVuCiAgICAgICAgICAgIHc9IiR7dyVcJ30iCiAgICAgICAgICAgIHc9IiR7dyNcJ30iCiAgICAgICAgZWxpZiBbICIkcXVvdGUiID09IFwiIF07IHRoZW4KICAgICAgICAgICAgdz0iJHt3JVwifSIKICAgICAgICAgICAgdz0iJHt3I1wifSIKICAgICAgICBmaQogICAgICAgICMgZW1wdHkgdmFsdWVzIGFyZSBpZ25vcmVkCiAgICAgICAgaWYgWyAhIC16ICIkdyIgXTsgdGhlbgogICAgICAgICAgICBjb21wbGV0ZWNtZCs9KCItaSR3IikKICAgICAgICBmaQogICAgZG9uZQoKICAgIGxvY2FsIHNmY29tcGxldGUKICAgIGlmIHNmY29tcGxldGU9JCgke2NvbXBsZXRlY21kW0BdfSAyPiYxKTsgdGhlbgogICAgICAgIGxvY2FsIHF1b3RlIHN1Z2dlc3Rpb25zCiAgICAgICAgcXVvdGU9JHtjdXI6MDoxfQoKICAgICAgICAjIFVzZSBzaW5nbGUgcXVvdGVzIGJ5IGRlZmF1bHQgaWYgc3VnZ2VzdGlvbnMgY29udGFpbnMgYmFja3NsYXNoIChGUUNOKQogICAgICAgIGlmIFsgIiRxdW90ZSIgPT0gJycgXSAmJiBbWyAiJHNmY29tcGxldGUiID1+IFxcIF1dOyB0aGVuCiAgICAgICAgICAgIHF1b3RlPVwnCiAgICAgICAgZmkKCiAgICAgICAgaWYgWyAiJHF1b3RlIiA9PSBcJyBdOyB0aGVuCiAgICAgICAgICAgICMgc2luZ2xlIHF1b3Rlczogbm8gYWRkaXRpb25hbCBlc2NhcGluZyAoZG9lcyBub3QgYWNjZXB0ICcgaW4gdmFsdWVzKQogICAgICAgICAgICBzdWdnZXN0aW9ucz0kKGZvciBzIGluICRzZmNvbXBsZXRlOyBkbyBwcmludGYgJCclcSVxJXFcbicgIiRxdW90ZSIgIiRzIiAiJHF1b3RlIjsgZG9uZSkKICAgICAgICBlbGlmIFsgIiRxdW90ZSIgPT0gXCIgXTsgdGhlbgogICAgICAgICAgICAjIGRvdWJsZSBxdW90ZXM6IGRvdWJsZSBlc2NhcGluZyBmb3IgXCAkIGAgIgogICAgICAgICAgICBzdWdnZXN0aW9ucz0kKGZvciBzIGluICRzZmNvbXBsZXRlOyBkbwogICAgICAgICAgICAgICAgcz0ke3MvL1xcL1xcXFx9CiAgICAgICAgICAgICAgICBzPSR7cy8vXCQvXFxcJH0KICAgICAgICAgICAgICAgIHM9JHtzLy9cYC9cXFxgfQogICAgICAgICAgICAgICAgcz0ke3MvL1wiL1xcXCJ9CiAgICAgICAgICAgICAgICBwcmludGYgJCclcSVxJXFcbicgIiRxdW90ZSIgIiRzIiAiJHF1b3RlIjsKICAgICAgICAgICAgZG9uZSkKICAgICAgICBlbHNlCiAgICAgICAgICAgICMgbm8gcXVvdGVzOiBkb3VibGUgZXNjYXBpbmcKICAgICAgICAgICAgc3VnZ2VzdGlvbnM9JChmb3IgcyBpbiAkc2Zjb21wbGV0ZTsgZG8gcHJpbnRmICQnJXFcbicgJChwcmludGYgJyVxJyAiJHMiKTsgZG9uZSkKICAgICAgICBmaQogICAgICAgIENPTVBSRVBMWT0oJChJRlM9JCdcbicgY29tcGdlbiAtVyAiJHN1Z2dlc3Rpb25zIiAtLSAkKHByaW50ZiAtLSAiJXEiICIkY3VyIikpKQogICAgICAgIF9fbHRyaW1fY29sb25fY29tcGxldGlvbnMgIiRjdXIiCiAgICBlbHNlCiAgICAgICAgaWYgW1sgIiRzZmNvbXBsZXRlIiAhPSAqIkNvbW1hbmQgXCJfY29tcGxldGVcIiBpcyBub3QgZGVmaW5lZC4iKiBdXTsgdGhlbgogICAgICAgICAgICA+JjIgZWNobwogICAgICAgICAgICA+JjIgZWNobyAkc2Zjb21wbGV0ZQogICAgICAgIGZpCgogICAgICAgIHJldHVybiAxCiAgICBmaQp9Cgpjb21wbGV0ZSAtRiBfc2Zfe3sgQ09NTUFORF9OQU1FIH19IHt7IENPTU1BTkRfTkFNRSB9fQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcU2lnbmFsUmVnaXN0cnk7CgpmaW5hbCBjbGFzcyBTaWduYWxSZWdpc3RyeQp7CnByaXZhdGUgJHNpZ25hbEhhbmRsZXJzID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CmlmIChcZnVuY3Rpb25fZXhpc3RzKCdwY250bF9hc3luY19zaWduYWxzJykpIHsKcGNudGxfYXN5bmNfc2lnbmFscyh0cnVlKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXIoaW50ICRzaWduYWwsIGNhbGxhYmxlICRzaWduYWxIYW5kbGVyKTogdm9pZAp7CmlmICghaXNzZXQoJHRoaXMtPnNpZ25hbEhhbmRsZXJzWyRzaWduYWxdKSkgewokcHJldmlvdXNDYWxsYmFjayA9IHBjbnRsX3NpZ25hbF9nZXRfaGFuZGxlcigkc2lnbmFsKTsKCmlmIChcaXNfY2FsbGFibGUoJHByZXZpb3VzQ2FsbGJhY2spKSB7CiR0aGlzLT5zaWduYWxIYW5kbGVyc1skc2lnbmFsXVtdID0gJHByZXZpb3VzQ2FsbGJhY2s7Cn0KfQoKJHRoaXMtPnNpZ25hbEhhbmRsZXJzWyRzaWduYWxdW10gPSAkc2lnbmFsSGFuZGxlcjsKCnBjbnRsX3NpZ25hbCgkc2lnbmFsLCBbJHRoaXMsICdoYW5kbGUnXSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNTdXBwb3J0ZWQoKTogYm9vbAp7CmlmICghXGZ1bmN0aW9uX2V4aXN0cygncGNudGxfc2lnbmFsJykpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoXGluX2FycmF5KCdwY250bF9zaWduYWwnLCBleHBsb2RlKCcsJywgXGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykpKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFuZGxlKGludCAkc2lnbmFsKTogdm9pZAp7CiRjb3VudCA9IFxjb3VudCgkdGhpcy0+c2lnbmFsSGFuZGxlcnNbJHNpZ25hbF0pOwoKZm9yZWFjaCAoJHRoaXMtPnNpZ25hbEhhbmRsZXJzWyRzaWduYWxdIGFzICRpID0+ICRzaWduYWxIYW5kbGVyKSB7CiRoYXNOZXh0ID0gJGkgIT09ICRjb3VudCAtIDE7CiRzaWduYWxIYW5kbGVyKCRzaWduYWwsICRoYXNOZXh0KTsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIFNpbmdsZUNvbW1hbmRBcHBsaWNhdGlvbiBleHRlbmRzIENvbW1hbmQKewpwcml2YXRlICR2ZXJzaW9uID0gJ1VOS05PV04nOwpwcml2YXRlICRhdXRvRXhpdCA9IHRydWU7CnByaXZhdGUgJHJ1bm5pbmcgPSBmYWxzZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJzaW9uKHN0cmluZyAkdmVyc2lvbik6IHNlbGYKewokdGhpcy0+dmVyc2lvbiA9ICR2ZXJzaW9uOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRvRXhpdChib29sICRhdXRvRXhpdCk6IHNlbGYKewokdGhpcy0+YXV0b0V4aXQgPSAkYXV0b0V4aXQ7CgpyZXR1cm4gJHRoaXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBydW4oP0lucHV0SW50ZXJmYWNlICRpbnB1dCA9IG51bGwsID9PdXRwdXRJbnRlcmZhY2UgJG91dHB1dCA9IG51bGwpOiBpbnQKewppZiAoJHRoaXMtPnJ1bm5pbmcpIHsKcmV0dXJuIHBhcmVudDo6cnVuKCRpbnB1dCwgJG91dHB1dCk7Cn0KCgokYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb24oJHRoaXMtPmdldE5hbWUoKSA/OiAnVU5LTk9XTicsICR0aGlzLT52ZXJzaW9uKTsKJGFwcGxpY2F0aW9uLT5zZXRBdXRvRXhpdCgkdGhpcy0+YXV0b0V4aXQpOwoKJHRoaXMtPnNldE5hbWUoJF9TRVJWRVJbJ2FyZ3YnXVswXSk7CiRhcHBsaWNhdGlvbi0+YWRkKCR0aGlzKTsKJGFwcGxpY2F0aW9uLT5zZXREZWZhdWx0Q29tbWFuZCgkdGhpcy0+Z2V0TmFtZSgpLCB0cnVlKTsKCiR0aGlzLT5ydW5uaW5nID0gdHJ1ZTsKdHJ5IHsKJHJldCA9ICRhcHBsaWNhdGlvbi0+cnVuKCRpbnB1dCwgJG91dHB1dCk7Cn0gZmluYWxseSB7CiR0aGlzLT5ydW5uaW5nID0gZmFsc2U7Cn0KCnJldHVybiAkcmV0ID8/IDE7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcU3R5bGU7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcUHJvZ3Jlc3NCYXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgphYnN0cmFjdCBjbGFzcyBPdXRwdXRTdHlsZSBpbXBsZW1lbnRzIE91dHB1dEludGVyZmFjZSwgU3R5bGVJbnRlcmZhY2UKewpwcml2YXRlICRvdXRwdXQ7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBuZXdMaW5lKGludCAkY291bnQgPSAxKQp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKHN0cl9yZXBlYXQoXFBIUF9FT0wsICRjb3VudCkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlUHJvZ3Jlc3NCYXIoaW50ICRtYXggPSAwKQp7CnJldHVybiBuZXcgUHJvZ3Jlc3NCYXIoJHRoaXMtPm91dHB1dCwgJG1heCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSBmYWxzZSwgaW50ICR0eXBlID0gc2VsZjo6T1VUUFVUX05PUk1BTCkKewokdGhpcy0+b3V0cHV0LT53cml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCAkdHlwZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZWxuKCRtZXNzYWdlcywgaW50ICR0eXBlID0gc2VsZjo6T1VUUFVUX05PUk1BTCkKewokdGhpcy0+b3V0cHV0LT53cml0ZWxuKCRtZXNzYWdlcywgJHR5cGUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmVyYm9zaXR5KGludCAkbGV2ZWwpCnsKJHRoaXMtPm91dHB1dC0+c2V0VmVyYm9zaXR5KCRsZXZlbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJib3NpdHkoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5nZXRWZXJib3NpdHkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlY29yYXRlZChib29sICRkZWNvcmF0ZWQpCnsKJHRoaXMtPm91dHB1dC0+c2V0RGVjb3JhdGVkKCRkZWNvcmF0ZWQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Rm9ybWF0dGVyKE91dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyKQp7CiR0aGlzLT5vdXRwdXQtPnNldEZvcm1hdHRlcigkZm9ybWF0dGVyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZvcm1hdHRlcigpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmdldEZvcm1hdHRlcigpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNRdWlldCgpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzUXVpZXQoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyYm9zZSgpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzVmVyYm9zZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJ5VmVyYm9zZSgpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzVmVyeVZlcmJvc2UoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVidWcoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc0RlYnVnKCk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRFcnJvck91dHB1dCgpCnsKaWYgKCEkdGhpcy0+b3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewpyZXR1cm4gJHRoaXMtPm91dHB1dDsKfQoKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmdldEVycm9yT3V0cHV0KCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcU3R5bGU7CgoKCgoKCmludGVyZmFjZSBTdHlsZUludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiB0aXRsZShzdHJpbmcgJG1lc3NhZ2UpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNlY3Rpb24oc3RyaW5nICRtZXNzYWdlKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBsaXN0aW5nKGFycmF5ICRlbGVtZW50cyk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0ZXh0KCRtZXNzYWdlKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN1Y2Nlc3MoJG1lc3NhZ2UpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXJyb3IoJG1lc3NhZ2UpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FybmluZygkbWVzc2FnZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3RlKCRtZXNzYWdlKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNhdXRpb24oJG1lc3NhZ2UpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHRhYmxlKGFycmF5ICRoZWFkZXJzLCBhcnJheSAkcm93cyk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2soc3RyaW5nICRxdWVzdGlvbiwgP3N0cmluZyAkZGVmYXVsdCA9IG51bGwsID9jYWxsYWJsZSAkdmFsaWRhdG9yID0gbnVsbCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tIaWRkZW4oc3RyaW5nICRxdWVzdGlvbiwgP2NhbGxhYmxlICR2YWxpZGF0b3IgPSBudWxsKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbmZpcm0oc3RyaW5nICRxdWVzdGlvbiwgYm9vbCAkZGVmYXVsdCA9IHRydWUpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaG9pY2Uoc3RyaW5nICRxdWVzdGlvbiwgYXJyYXkgJGNob2ljZXMsICRkZWZhdWx0ID0gbnVsbCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gbmV3TGluZShpbnQgJGNvdW50ID0gMSk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvZ3Jlc3NTdGFydChpbnQgJG1heCA9IDApOwoKCgoKcHVibGljIGZ1bmN0aW9uIHByb2dyZXNzQWR2YW5jZShpbnQgJHN0ZXAgPSAxKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9ncmVzc0ZpbmlzaCgpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxTdHlsZTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcSGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcUHJvZ3Jlc3NCYXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxTeW1mb255UXVlc3Rpb25IZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxUYWJsZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlQ2VsbDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlU2VwYXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxUcmltbWVkQnVmZmVyT3V0cHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxDaG9pY2VRdWVzdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cQ29uZmlybWF0aW9uUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXFF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXJtaW5hbDsKCgoKCgoKY2xhc3MgU3ltZm9ueVN0eWxlIGV4dGVuZHMgT3V0cHV0U3R5bGUKewpwdWJsaWMgY29uc3QgTUFYX0xJTkVfTEVOR1RIID0gMTIwOwoKcHJpdmF0ZSAkaW5wdXQ7CnByaXZhdGUgJG91dHB1dDsKcHJpdmF0ZSAkcXVlc3Rpb25IZWxwZXI7CnByaXZhdGUgJHByb2dyZXNzQmFyOwpwcml2YXRlICRsaW5lTGVuZ3RoOwpwcml2YXRlICRidWZmZXJlZE91dHB1dDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKJHRoaXMtPmJ1ZmZlcmVkT3V0cHV0ID0gbmV3IFRyaW1tZWRCdWZmZXJPdXRwdXQoXERJUkVDVE9SWV9TRVBBUkFUT1IgPT09ICdcXCcgPyA0IDogMiwgJG91dHB1dC0+Z2V0VmVyYm9zaXR5KCksIGZhbHNlLCBjbG9uZSAkb3V0cHV0LT5nZXRGb3JtYXR0ZXIoKSk7Cgokd2lkdGggPSAobmV3IFRlcm1pbmFsKCkpLT5nZXRXaWR0aCgpID86IHNlbGY6Ok1BWF9MSU5FX0xFTkdUSDsKJHRoaXMtPmxpbmVMZW5ndGggPSBtaW4oJHdpZHRoIC0gKGludCkgKFxESVJFQ1RPUllfU0VQQVJBVE9SID09PSAnXFwnKSwgc2VsZjo6TUFYX0xJTkVfTEVOR1RIKTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBibG9jaygkbWVzc2FnZXMsID9zdHJpbmcgJHR5cGUgPSBudWxsLCA/c3RyaW5nICRzdHlsZSA9IG51bGwsIHN0cmluZyAkcHJlZml4ID0gJyAnLCBib29sICRwYWRkaW5nID0gZmFsc2UsIGJvb2wgJGVzY2FwZSA9IHRydWUpCnsKJG1lc3NhZ2VzID0gXGlzX2FycmF5KCRtZXNzYWdlcykgPyBhcnJheV92YWx1ZXMoJG1lc3NhZ2VzKSA6IFskbWVzc2FnZXNdOwoKJHRoaXMtPmF1dG9QcmVwZW5kQmxvY2soKTsKJHRoaXMtPndyaXRlbG4oJHRoaXMtPmNyZWF0ZUJsb2NrKCRtZXNzYWdlcywgJHR5cGUsICRzdHlsZSwgJHByZWZpeCwgJHBhZGRpbmcsICRlc2NhcGUpKTsKJHRoaXMtPm5ld0xpbmUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHRpdGxlKHN0cmluZyAkbWVzc2FnZSkKewokdGhpcy0+YXV0b1ByZXBlbmRCbG9jaygpOwokdGhpcy0+d3JpdGVsbihbCnNwcmludGYoJzxjb21tZW50PiVzPC8+JywgT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGVUcmFpbGluZ0JhY2tzbGFzaCgkbWVzc2FnZSkpLApzcHJpbnRmKCc8Y29tbWVudD4lczwvPicsIHN0cl9yZXBlYXQoJz0nLCBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+Z2V0Rm9ybWF0dGVyKCksICRtZXNzYWdlKSkpKSwKXSk7CiR0aGlzLT5uZXdMaW5lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWN0aW9uKHN0cmluZyAkbWVzc2FnZSkKewokdGhpcy0+YXV0b1ByZXBlbmRCbG9jaygpOwokdGhpcy0+d3JpdGVsbihbCnNwcmludGYoJzxjb21tZW50PiVzPC8+JywgT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGVUcmFpbGluZ0JhY2tzbGFzaCgkbWVzc2FnZSkpLApzcHJpbnRmKCc8Y29tbWVudD4lczwvPicsIHN0cl9yZXBlYXQoJy0nLCBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+Z2V0Rm9ybWF0dGVyKCksICRtZXNzYWdlKSkpKSwKXSk7CiR0aGlzLT5uZXdMaW5lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsaXN0aW5nKGFycmF5ICRlbGVtZW50cykKewokdGhpcy0+YXV0b1ByZXBlbmRUZXh0KCk7CiRlbGVtZW50cyA9IGFycmF5X21hcChmdW5jdGlvbiAoJGVsZW1lbnQpIHsKcmV0dXJuIHNwcmludGYoJyAqICVzJywgJGVsZW1lbnQpOwp9LCAkZWxlbWVudHMpOwoKJHRoaXMtPndyaXRlbG4oJGVsZW1lbnRzKTsKJHRoaXMtPm5ld0xpbmUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHRleHQoJG1lc3NhZ2UpCnsKJHRoaXMtPmF1dG9QcmVwZW5kVGV4dCgpOwoKJG1lc3NhZ2VzID0gXGlzX2FycmF5KCRtZXNzYWdlKSA/IGFycmF5X3ZhbHVlcygkbWVzc2FnZSkgOiBbJG1lc3NhZ2VdOwpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJG1lc3NhZ2UpIHsKJHRoaXMtPndyaXRlbG4oc3ByaW50ZignICVzJywgJG1lc3NhZ2UpKTsKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21tZW50KCRtZXNzYWdlKQp7CiR0aGlzLT5ibG9jaygkbWVzc2FnZSwgbnVsbCwgbnVsbCwgJzxmZz1kZWZhdWx0O2JnPWRlZmF1bHQ+IC8vIDwvPicsIGZhbHNlLCBmYWxzZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdWNjZXNzKCRtZXNzYWdlKQp7CiR0aGlzLT5ibG9jaygkbWVzc2FnZSwgJ09LJywgJ2ZnPWJsYWNrO2JnPWdyZWVuJywgJyAnLCB0cnVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVycm9yKCRtZXNzYWdlKQp7CiR0aGlzLT5ibG9jaygkbWVzc2FnZSwgJ0VSUk9SJywgJ2ZnPXdoaXRlO2JnPXJlZCcsICcgJywgdHJ1ZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3YXJuaW5nKCRtZXNzYWdlKQp7CiR0aGlzLT5ibG9jaygkbWVzc2FnZSwgJ1dBUk5JTkcnLCAnZmc9YmxhY2s7Ymc9eWVsbG93JywgJyAnLCB0cnVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdGUoJG1lc3NhZ2UpCnsKJHRoaXMtPmJsb2NrKCRtZXNzYWdlLCAnTk9URScsICdmZz15ZWxsb3cnLCAnICEgJyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluZm8oJG1lc3NhZ2UpCnsKJHRoaXMtPmJsb2NrKCRtZXNzYWdlLCAnSU5GTycsICdmZz1ncmVlbicsICcgJywgdHJ1ZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjYXV0aW9uKCRtZXNzYWdlKQp7CiR0aGlzLT5ibG9jaygkbWVzc2FnZSwgJ0NBVVRJT04nLCAnZmc9d2hpdGU7Ymc9cmVkJywgJyAhICcsIHRydWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdGFibGUoYXJyYXkgJGhlYWRlcnMsIGFycmF5ICRyb3dzKQp7CiR0aGlzLT5jcmVhdGVUYWJsZSgpCi0+c2V0SGVhZGVycygkaGVhZGVycykKLT5zZXRSb3dzKCRyb3dzKQotPnJlbmRlcigpCjsKCiR0aGlzLT5uZXdMaW5lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBob3Jpem9udGFsVGFibGUoYXJyYXkgJGhlYWRlcnMsIGFycmF5ICRyb3dzKQp7CiR0aGlzLT5jcmVhdGVUYWJsZSgpCi0+c2V0SG9yaXpvbnRhbCh0cnVlKQotPnNldEhlYWRlcnMoJGhlYWRlcnMpCi0+c2V0Um93cygkcm93cykKLT5yZW5kZXIoKQo7CgokdGhpcy0+bmV3TGluZSgpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRlZmluaXRpb25MaXN0KC4uLiRsaXN0KQp7CiRoZWFkZXJzID0gW107CiRyb3cgPSBbXTsKZm9yZWFjaCAoJGxpc3QgYXMgJHZhbHVlKSB7CmlmICgkdmFsdWUgaW5zdGFuY2VvZiBUYWJsZVNlcGFyYXRvcikgewokaGVhZGVyc1tdID0gJHZhbHVlOwokcm93W10gPSAkdmFsdWU7CmNvbnRpbnVlOwp9CmlmIChcaXNfc3RyaW5nKCR2YWx1ZSkpIHsKJGhlYWRlcnNbXSA9IG5ldyBUYWJsZUNlbGwoJHZhbHVlLCBbJ2NvbHNwYW4nID0+IDJdKTsKJHJvd1tdID0gbnVsbDsKY29udGludWU7Cn0KaWYgKCFcaXNfYXJyYXkoJHZhbHVlKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdWYWx1ZSBzaG91bGQgYmUgYW4gYXJyYXksIHN0cmluZywgb3IgYW4gaW5zdGFuY2Ugb2YgVGFibGVTZXBhcmF0b3IuJyk7Cn0KJGhlYWRlcnNbXSA9IGtleSgkdmFsdWUpOwokcm93W10gPSBjdXJyZW50KCR2YWx1ZSk7Cn0KCiR0aGlzLT5ob3Jpem9udGFsVGFibGUoJGhlYWRlcnMsIFskcm93XSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2soc3RyaW5nICRxdWVzdGlvbiwgP3N0cmluZyAkZGVmYXVsdCA9IG51bGwsID9jYWxsYWJsZSAkdmFsaWRhdG9yID0gbnVsbCkKewokcXVlc3Rpb24gPSBuZXcgUXVlc3Rpb24oJHF1ZXN0aW9uLCAkZGVmYXVsdCk7CiRxdWVzdGlvbi0+c2V0VmFsaWRhdG9yKCR2YWxpZGF0b3IpOwoKcmV0dXJuICR0aGlzLT5hc2tRdWVzdGlvbigkcXVlc3Rpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrSGlkZGVuKHN0cmluZyAkcXVlc3Rpb24sID9jYWxsYWJsZSAkdmFsaWRhdG9yID0gbnVsbCkKewokcXVlc3Rpb24gPSBuZXcgUXVlc3Rpb24oJHF1ZXN0aW9uKTsKCiRxdWVzdGlvbi0+c2V0SGlkZGVuKHRydWUpOwokcXVlc3Rpb24tPnNldFZhbGlkYXRvcigkdmFsaWRhdG9yKTsKCnJldHVybiAkdGhpcy0+YXNrUXVlc3Rpb24oJHF1ZXN0aW9uKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbmZpcm0oc3RyaW5nICRxdWVzdGlvbiwgYm9vbCAkZGVmYXVsdCA9IHRydWUpCnsKcmV0dXJuICR0aGlzLT5hc2tRdWVzdGlvbihuZXcgQ29uZmlybWF0aW9uUXVlc3Rpb24oJHF1ZXN0aW9uLCAkZGVmYXVsdCkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hvaWNlKHN0cmluZyAkcXVlc3Rpb24sIGFycmF5ICRjaG9pY2VzLCAkZGVmYXVsdCA9IG51bGwpCnsKaWYgKG51bGwgIT09ICRkZWZhdWx0KSB7CiR2YWx1ZXMgPSBhcnJheV9mbGlwKCRjaG9pY2VzKTsKJGRlZmF1bHQgPSAkdmFsdWVzWyRkZWZhdWx0XSA/PyAkZGVmYXVsdDsKfQoKcmV0dXJuICR0aGlzLT5hc2tRdWVzdGlvbihuZXcgQ2hvaWNlUXVlc3Rpb24oJHF1ZXN0aW9uLCAkY2hvaWNlcywgJGRlZmF1bHQpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByb2dyZXNzU3RhcnQoaW50ICRtYXggPSAwKQp7CiR0aGlzLT5wcm9ncmVzc0JhciA9ICR0aGlzLT5jcmVhdGVQcm9ncmVzc0JhcigkbWF4KTsKJHRoaXMtPnByb2dyZXNzQmFyLT5zdGFydCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvZ3Jlc3NBZHZhbmNlKGludCAkc3RlcCA9IDEpCnsKJHRoaXMtPmdldFByb2dyZXNzQmFyKCktPmFkdmFuY2UoJHN0ZXApOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvZ3Jlc3NGaW5pc2goKQp7CiR0aGlzLT5nZXRQcm9ncmVzc0JhcigpLT5maW5pc2goKTsKJHRoaXMtPm5ld0xpbmUoMik7CiR0aGlzLT5wcm9ncmVzc0JhciA9IG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVQcm9ncmVzc0JhcihpbnQgJG1heCA9IDApCnsKJHByb2dyZXNzQmFyID0gcGFyZW50OjpjcmVhdGVQcm9ncmVzc0JhcigkbWF4KTsKCmlmICgnXFwnICE9PSBcRElSRUNUT1JZX1NFUEFSQVRPUiB8fCAnSHlwZXInID09PSBnZXRlbnYoJ1RFUk1fUFJPR1JBTScpKSB7CiRwcm9ncmVzc0Jhci0+c2V0RW1wdHlCYXJDaGFyYWN0ZXIoJ+KWkScpOyAKJHByb2dyZXNzQmFyLT5zZXRQcm9ncmVzc0NoYXJhY3RlcignJyk7CiRwcm9ncmVzc0Jhci0+c2V0QmFyQ2hhcmFjdGVyKCfilpMnKTsgCn0KCnJldHVybiAkcHJvZ3Jlc3NCYXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9ncmVzc0l0ZXJhdGUoaXRlcmFibGUgJGl0ZXJhYmxlLCA/aW50ICRtYXggPSBudWxsKTogaXRlcmFibGUKewp5aWVsZCBmcm9tICR0aGlzLT5jcmVhdGVQcm9ncmVzc0JhcigpLT5pdGVyYXRlKCRpdGVyYWJsZSwgJG1heCk7CgokdGhpcy0+bmV3TGluZSgyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFza1F1ZXN0aW9uKFF1ZXN0aW9uICRxdWVzdGlvbikKewppZiAoJHRoaXMtPmlucHV0LT5pc0ludGVyYWN0aXZlKCkpIHsKJHRoaXMtPmF1dG9QcmVwZW5kQmxvY2soKTsKfQoKaWYgKCEkdGhpcy0+cXVlc3Rpb25IZWxwZXIpIHsKJHRoaXMtPnF1ZXN0aW9uSGVscGVyID0gbmV3IFN5bWZvbnlRdWVzdGlvbkhlbHBlcigpOwp9CgokYW5zd2VyID0gJHRoaXMtPnF1ZXN0aW9uSGVscGVyLT5hc2soJHRoaXMtPmlucHV0LCAkdGhpcywgJHF1ZXN0aW9uKTsKCmlmICgkdGhpcy0+aW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewokdGhpcy0+bmV3TGluZSgpOwokdGhpcy0+YnVmZmVyZWRPdXRwdXQtPndyaXRlKCJcbiIpOwp9CgpyZXR1cm4gJGFuc3dlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlbG4oJG1lc3NhZ2VzLCBpbnQgJHR5cGUgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7CmlmICghaXNfaXRlcmFibGUoJG1lc3NhZ2VzKSkgewokbWVzc2FnZXMgPSBbJG1lc3NhZ2VzXTsKfQoKZm9yZWFjaCAoJG1lc3NhZ2VzIGFzICRtZXNzYWdlKSB7CnBhcmVudDo6d3JpdGVsbigkbWVzc2FnZSwgJHR5cGUpOwokdGhpcy0+d3JpdGVCdWZmZXIoJG1lc3NhZ2UsIHRydWUsICR0eXBlKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gZmFsc2UsIGludCAkdHlwZSA9IHNlbGY6Ok9VVFBVVF9OT1JNQUwpCnsKaWYgKCFpc19pdGVyYWJsZSgkbWVzc2FnZXMpKSB7CiRtZXNzYWdlcyA9IFskbWVzc2FnZXNdOwp9Cgpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJG1lc3NhZ2UpIHsKcGFyZW50Ojp3cml0ZSgkbWVzc2FnZSwgJG5ld2xpbmUsICR0eXBlKTsKJHRoaXMtPndyaXRlQnVmZmVyKCRtZXNzYWdlLCAkbmV3bGluZSwgJHR5cGUpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBuZXdMaW5lKGludCAkY291bnQgPSAxKQp7CnBhcmVudDo6bmV3TGluZSgkY291bnQpOwokdGhpcy0+YnVmZmVyZWRPdXRwdXQtPndyaXRlKHN0cl9yZXBlYXQoIlxuIiwgJGNvdW50KSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9yU3R5bGUoKQp7CnJldHVybiBuZXcgc2VsZigkdGhpcy0+aW5wdXQsICR0aGlzLT5nZXRFcnJvck91dHB1dCgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVRhYmxlKCk6IFRhYmxlCnsKJG91dHB1dCA9ICR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlID8gJHRoaXMtPm91dHB1dC0+c2VjdGlvbigpIDogJHRoaXMtPm91dHB1dDsKJHN0eWxlID0gY2xvbmUgVGFibGU6OmdldFN0eWxlRGVmaW5pdGlvbignc3ltZm9ueS1zdHlsZS1ndWlkZScpOwokc3R5bGUtPnNldENlbGxIZWFkZXJGb3JtYXQoJzxpbmZvPiVzPC9pbmZvPicpOwoKcmV0dXJuIChuZXcgVGFibGUoJG91dHB1dCkpLT5zZXRTdHlsZSgkc3R5bGUpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFByb2dyZXNzQmFyKCk6IFByb2dyZXNzQmFyCnsKaWYgKCEkdGhpcy0+cHJvZ3Jlc3NCYXIpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBQcm9ncmVzc0JhciBpcyBub3Qgc3RhcnRlZC4nKTsKfQoKcmV0dXJuICR0aGlzLT5wcm9ncmVzc0JhcjsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBhdXRvUHJlcGVuZEJsb2NrKCk6IHZvaWQKewokY2hhcnMgPSBzdWJzdHIoc3RyX3JlcGxhY2UoXFBIUF9FT0wsICJcbiIsICR0aGlzLT5idWZmZXJlZE91dHB1dC0+ZmV0Y2goKSksIC0yKTsKCmlmICghaXNzZXQoJGNoYXJzWzBdKSkgewokdGhpcy0+bmV3TGluZSgpOyAKCnJldHVybjsKfQoKJHRoaXMtPm5ld0xpbmUoMiAtIHN1YnN0cl9jb3VudCgkY2hhcnMsICJcbiIpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBhdXRvUHJlcGVuZFRleHQoKTogdm9pZAp7CiRmZXRjaGVkID0gJHRoaXMtPmJ1ZmZlcmVkT3V0cHV0LT5mZXRjaCgpOwoKaWYgKCFzdHJfZW5kc193aXRoKCRmZXRjaGVkLCAiXG4iKSkgewokdGhpcy0+bmV3TGluZSgpOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gd3JpdGVCdWZmZXIoc3RyaW5nICRtZXNzYWdlLCBib29sICRuZXdMaW5lLCBpbnQgJHR5cGUpOiB2b2lkCnsKCiR0aGlzLT5idWZmZXJlZE91dHB1dC0+d3JpdGUoJG1lc3NhZ2UsICRuZXdMaW5lLCAkdHlwZSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlQmxvY2soaXRlcmFibGUgJG1lc3NhZ2VzLCA/c3RyaW5nICR0eXBlID0gbnVsbCwgP3N0cmluZyAkc3R5bGUgPSBudWxsLCBzdHJpbmcgJHByZWZpeCA9ICcgJywgYm9vbCAkcGFkZGluZyA9IGZhbHNlLCBib29sICRlc2NhcGUgPSBmYWxzZSk6IGFycmF5CnsKJGluZGVudExlbmd0aCA9IDA7CiRwcmVmaXhMZW5ndGggPSBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+Z2V0Rm9ybWF0dGVyKCksICRwcmVmaXgpKTsKJGxpbmVzID0gW107CgppZiAobnVsbCAhPT0gJHR5cGUpIHsKJHR5cGUgPSBzcHJpbnRmKCdbJXNdICcsICR0eXBlKTsKJGluZGVudExlbmd0aCA9IFxzdHJsZW4oJHR5cGUpOwokbGluZUluZGVudGF0aW9uID0gc3RyX3JlcGVhdCgnICcsICRpbmRlbnRMZW5ndGgpOwp9CgoKZm9yZWFjaCAoJG1lc3NhZ2VzIGFzICRrZXkgPT4gJG1lc3NhZ2UpIHsKaWYgKCRlc2NhcGUpIHsKJG1lc3NhZ2UgPSBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkbWVzc2FnZSk7Cn0KCiRkZWNvcmF0aW9uTGVuZ3RoID0gSGVscGVyOjp3aWR0aCgkbWVzc2FnZSkgLSBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+Z2V0Rm9ybWF0dGVyKCksICRtZXNzYWdlKSk7CiRtZXNzYWdlTGluZUxlbmd0aCA9IG1pbigkdGhpcy0+bGluZUxlbmd0aCAtICRwcmVmaXhMZW5ndGggLSAkaW5kZW50TGVuZ3RoICsgJGRlY29yYXRpb25MZW5ndGgsICR0aGlzLT5saW5lTGVuZ3RoKTsKJG1lc3NhZ2VMaW5lcyA9IGV4cGxvZGUoXFBIUF9FT0wsIHdvcmR3cmFwKCRtZXNzYWdlLCAkbWVzc2FnZUxpbmVMZW5ndGgsIFxQSFBfRU9MLCB0cnVlKSk7CmZvcmVhY2ggKCRtZXNzYWdlTGluZXMgYXMgJG1lc3NhZ2VMaW5lKSB7CiRsaW5lc1tdID0gJG1lc3NhZ2VMaW5lOwp9CgppZiAoXGNvdW50KCRtZXNzYWdlcykgPiAxICYmICRrZXkgPCBcY291bnQoJG1lc3NhZ2VzKSAtIDEpIHsKJGxpbmVzW10gPSAnJzsKfQp9CgokZmlyc3RMaW5lSW5kZXggPSAwOwppZiAoJHBhZGRpbmcgJiYgJHRoaXMtPmlzRGVjb3JhdGVkKCkpIHsKJGZpcnN0TGluZUluZGV4ID0gMTsKYXJyYXlfdW5zaGlmdCgkbGluZXMsICcnKTsKJGxpbmVzW10gPSAnJzsKfQoKZm9yZWFjaCAoJGxpbmVzIGFzICRpID0+ICYkbGluZSkgewppZiAobnVsbCAhPT0gJHR5cGUpIHsKJGxpbmUgPSAkZmlyc3RMaW5lSW5kZXggPT09ICRpID8gJHR5cGUuJGxpbmUgOiAkbGluZUluZGVudGF0aW9uLiRsaW5lOwp9CgokbGluZSA9ICRwcmVmaXguJGxpbmU7CiRsaW5lIC49IHN0cl9yZXBlYXQoJyAnLCBtYXgoJHRoaXMtPmxpbmVMZW5ndGggLSBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+Z2V0Rm9ybWF0dGVyKCksICRsaW5lKSksIDApKTsKCmlmICgkc3R5bGUpIHsKJGxpbmUgPSBzcHJpbnRmKCc8JXM+JXM8Lz4nLCAkc3R5bGUsICRsaW5lKTsKfQp9CgpyZXR1cm4gJGxpbmVzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlOwoKY2xhc3MgVGVybWluYWwKewpwcml2YXRlIHN0YXRpYyAkd2lkdGg7CnByaXZhdGUgc3RhdGljICRoZWlnaHQ7CnByaXZhdGUgc3RhdGljICRzdHR5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0V2lkdGgoKQp7CiR3aWR0aCA9IGdldGVudignQ09MVU1OUycpOwppZiAoZmFsc2UgIT09ICR3aWR0aCkgewpyZXR1cm4gKGludCkgdHJpbSgkd2lkdGgpOwp9CgppZiAobnVsbCA9PT0gc2VsZjo6JHdpZHRoKSB7CnNlbGY6OmluaXREaW1lbnNpb25zKCk7Cn0KCnJldHVybiBzZWxmOjokd2lkdGggPzogODA7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlaWdodCgpCnsKJGhlaWdodCA9IGdldGVudignTElORVMnKTsKaWYgKGZhbHNlICE9PSAkaGVpZ2h0KSB7CnJldHVybiAoaW50KSB0cmltKCRoZWlnaHQpOwp9CgppZiAobnVsbCA9PT0gc2VsZjo6JGhlaWdodCkgewpzZWxmOjppbml0RGltZW5zaW9ucygpOwp9CgpyZXR1cm4gc2VsZjo6JGhlaWdodCA/OiA1MDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXNTdHR5QXZhaWxhYmxlKCk6IGJvb2wKewppZiAobnVsbCAhPT0gc2VsZjo6JHN0dHkpIHsKcmV0dXJuIHNlbGY6OiRzdHR5Owp9CgoKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gc2VsZjo6JHN0dHkgPSAoYm9vbCkgc2hlbGxfZXhlYygnc3R0eSAyPiAnLignXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiA/ICdOVUwnIDogJy9kZXYvbnVsbCcpKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdERpbWVuc2lvbnMoKQp7CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokYW5zaWNvbiA9IGdldGVudignQU5TSUNPTicpOwppZiAoZmFsc2UgIT09ICRhbnNpY29uICYmIHByZWdfbWF0Y2goJy9eKFxkKyl4KFxkKykoPzogXCgoXGQrKXgoXGQrKVwpKT8kLycsIHRyaW0oJGFuc2ljb24pLCAkbWF0Y2hlcykpIHsKCgpzZWxmOjokd2lkdGggPSAoaW50KSAkbWF0Y2hlc1sxXTsKc2VsZjo6JGhlaWdodCA9IGlzc2V0KCRtYXRjaGVzWzRdKSA/IChpbnQpICRtYXRjaGVzWzRdIDogKGludCkgJG1hdGNoZXNbMl07Cn0gZWxzZWlmICghc2VsZjo6aGFzVnQxMDBTdXBwb3J0KCkgJiYgc2VsZjo6aGFzU3R0eUF2YWlsYWJsZSgpKSB7CgoKc2VsZjo6aW5pdERpbWVuc2lvbnNVc2luZ1N0dHkoKTsKfSBlbHNlaWYgKG51bGwgIT09ICRkaW1lbnNpb25zID0gc2VsZjo6Z2V0Q29uc29sZU1vZGUoKSkgewoKc2VsZjo6JHdpZHRoID0gKGludCkgJGRpbWVuc2lvbnNbMF07CnNlbGY6OiRoZWlnaHQgPSAoaW50KSAkZGltZW5zaW9uc1sxXTsKfQp9IGVsc2UgewpzZWxmOjppbml0RGltZW5zaW9uc1VzaW5nU3R0eSgpOwp9Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhc1Z0MTAwU3VwcG9ydCgpOiBib29sCnsKcmV0dXJuIFxmdW5jdGlvbl9leGlzdHMoJ3NhcGlfd2luZG93c192dDEwMF9zdXBwb3J0JykgJiYgc2FwaV93aW5kb3dzX3Z0MTAwX3N1cHBvcnQoZm9wZW4oJ3BocDovL3N0ZG91dCcsICd3JykpOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0RGltZW5zaW9uc1VzaW5nU3R0eSgpCnsKaWYgKCRzdHR5U3RyaW5nID0gc2VsZjo6Z2V0U3R0eUNvbHVtbnMoKSkgewppZiAocHJlZ19tYXRjaCgnL3Jvd3MuKFxkKyk7LmNvbHVtbnMuKFxkKyk7L2knLCAkc3R0eVN0cmluZywgJG1hdGNoZXMpKSB7CgpzZWxmOjokd2lkdGggPSAoaW50KSAkbWF0Y2hlc1syXTsKc2VsZjo6JGhlaWdodCA9IChpbnQpICRtYXRjaGVzWzFdOwp9IGVsc2VpZiAocHJlZ19tYXRjaCgnLzsuKFxkKykucm93czsuKFxkKykuY29sdW1ucy9pJywgJHN0dHlTdHJpbmcsICRtYXRjaGVzKSkgewoKc2VsZjo6JHdpZHRoID0gKGludCkgJG1hdGNoZXNbMl07CnNlbGY6OiRoZWlnaHQgPSAoaW50KSAkbWF0Y2hlc1sxXTsKfQp9Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29uc29sZU1vZGUoKTogP2FycmF5CnsKJGluZm8gPSBzZWxmOjpyZWFkRnJvbVByb2Nlc3MoJ21vZGUgQ09OJyk7CgppZiAobnVsbCA9PT0gJGluZm8gfHwgIXByZWdfbWF0Y2goJy8tLS0tLS0tLStccj9cbi4rPyhcZCspXHI/XG4uKz8oXGQrKVxyP1xuLycsICRpbmZvLCAkbWF0Y2hlcykpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBbKGludCkgJG1hdGNoZXNbMl0sIChpbnQpICRtYXRjaGVzWzFdXTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0U3R0eUNvbHVtbnMoKTogP3N0cmluZwp7CnJldHVybiBzZWxmOjpyZWFkRnJvbVByb2Nlc3MoJ3N0dHkgLWEgfCBncmVwIGNvbHVtbnMnKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcmVhZEZyb21Qcm9jZXNzKHN0cmluZyAkY29tbWFuZCk6ID9zdHJpbmcKewppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKSB7CnJldHVybiBudWxsOwp9CgokZGVzY3JpcHRvcnNwZWMgPSBbCjEgPT4gWydwaXBlJywgJ3cnXSwKMiA9PiBbJ3BpcGUnLCAndyddLApdOwoKJGNwID0gXGZ1bmN0aW9uX2V4aXN0cygnc2FwaV93aW5kb3dzX2NwX3NldCcpID8gc2FwaV93aW5kb3dzX2NwX2dldCgpIDogMDsKCmlmICghJHByb2Nlc3MgPSBAcHJvY19vcGVuKCRjb21tYW5kLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcywgbnVsbCwgbnVsbCwgWydzdXBwcmVzc19lcnJvcnMnID0+IHRydWVdKSkgewpyZXR1cm4gbnVsbDsKfQoKJGluZm8gPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1sxXSk7CmZjbG9zZSgkcGlwZXNbMV0pOwpmY2xvc2UoJHBpcGVzWzJdKTsKcHJvY19jbG9zZSgkcHJvY2Vzcyk7CgppZiAoJGNwKSB7CnNhcGlfd2luZG93c19jcF9zZXQoJGNwKTsKfQoKcmV0dXJuICRpbmZvOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFRlc3RlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxBcnJheUlucHV0OwoKCgoKCgoKCgoKCmNsYXNzIEFwcGxpY2F0aW9uVGVzdGVyCnsKdXNlIFRlc3RlclRyYWl0OwoKcHJpdmF0ZSAkYXBwbGljYXRpb247CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQXBwbGljYXRpb24gJGFwcGxpY2F0aW9uKQp7CiR0aGlzLT5hcHBsaWNhdGlvbiA9ICRhcHBsaWNhdGlvbjsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJ1bihhcnJheSAkaW5wdXQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHByZXZTaGVsbFZlcmJvc2l0eSA9IGdldGVudignU0hFTExfVkVSQk9TSVRZJyk7Cgp0cnkgewokdGhpcy0+aW5wdXQgPSBuZXcgQXJyYXlJbnB1dCgkaW5wdXQpOwppZiAoaXNzZXQoJG9wdGlvbnNbJ2ludGVyYWN0aXZlJ10pKSB7CiR0aGlzLT5pbnB1dC0+c2V0SW50ZXJhY3RpdmUoJG9wdGlvbnNbJ2ludGVyYWN0aXZlJ10pOwp9CgppZiAoJHRoaXMtPmlucHV0cykgewokdGhpcy0+aW5wdXQtPnNldFN0cmVhbShzZWxmOjpjcmVhdGVTdHJlYW0oJHRoaXMtPmlucHV0cykpOwp9CgokdGhpcy0+aW5pdE91dHB1dCgkb3B0aW9ucyk7CgpyZXR1cm4gJHRoaXMtPnN0YXR1c0NvZGUgPSAkdGhpcy0+YXBwbGljYXRpb24tPnJ1bigkdGhpcy0+aW5wdXQsICR0aGlzLT5vdXRwdXQpOwp9IGZpbmFsbHkgewoKCmlmIChmYWxzZSA9PT0gJHByZXZTaGVsbFZlcmJvc2l0eSkgewppZiAoXGZ1bmN0aW9uX2V4aXN0cygncHV0ZW52JykpIHsKQHB1dGVudignU0hFTExfVkVSQk9TSVRZJyk7Cn0KdW5zZXQoJF9FTlZbJ1NIRUxMX1ZFUkJPU0lUWSddKTsKdW5zZXQoJF9TRVJWRVJbJ1NIRUxMX1ZFUkJPU0lUWSddKTsKfSBlbHNlIHsKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3B1dGVudicpKSB7CkBwdXRlbnYoJ1NIRUxMX1ZFUkJPU0lUWT0nLiRwcmV2U2hlbGxWZXJib3NpdHkpOwp9CiRfRU5WWydTSEVMTF9WRVJCT1NJVFknXSA9ICRwcmV2U2hlbGxWZXJib3NpdHk7CiRfU0VSVkVSWydTSEVMTF9WRVJCT1NJVFknXSA9ICRwcmV2U2hlbGxWZXJib3NpdHk7Cn0KfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFRlc3RlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwoKCgoKCgpjbGFzcyBDb21tYW5kQ29tcGxldGlvblRlc3Rlcgp7CnByaXZhdGUgJGNvbW1hbmQ7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ29tbWFuZCAkY29tbWFuZCkKewokdGhpcy0+Y29tbWFuZCA9ICRjb21tYW5kOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoYXJyYXkgJGlucHV0KTogYXJyYXkKewokY3VycmVudEluZGV4ID0gXGNvdW50KCRpbnB1dCk7CmlmICgnJyA9PT0gZW5kKCRpbnB1dCkpIHsKYXJyYXlfcG9wKCRpbnB1dCk7Cn0KYXJyYXlfdW5zaGlmdCgkaW5wdXQsICR0aGlzLT5jb21tYW5kLT5nZXROYW1lKCkpOwoKJGNvbXBsZXRpb25JbnB1dCA9IENvbXBsZXRpb25JbnB1dDo6ZnJvbVRva2VucygkaW5wdXQsICRjdXJyZW50SW5kZXgpOwokY29tcGxldGlvbklucHV0LT5iaW5kKCR0aGlzLT5jb21tYW5kLT5nZXREZWZpbml0aW9uKCkpOwokc3VnZ2VzdGlvbnMgPSBuZXcgQ29tcGxldGlvblN1Z2dlc3Rpb25zKCk7CgokdGhpcy0+Y29tbWFuZC0+Y29tcGxldGUoJGNvbXBsZXRpb25JbnB1dCwgJHN1Z2dlc3Rpb25zKTsKCiRvcHRpb25zID0gW107CmZvcmVhY2ggKCRzdWdnZXN0aW9ucy0+Z2V0T3B0aW9uU3VnZ2VzdGlvbnMoKSBhcyAkb3B0aW9uKSB7CiRvcHRpb25zW10gPSAnLS0nLiRvcHRpb24tPmdldE5hbWUoKTsKfQoKcmV0dXJuIGFycmF5X21hcCgnc3RydmFsJywgYXJyYXlfbWVyZ2UoJG9wdGlvbnMsICRzdWdnZXN0aW9ucy0+Z2V0VmFsdWVTdWdnZXN0aW9ucygpKSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVzdGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxBcnJheUlucHV0OwoKCgoKCgoKY2xhc3MgQ29tbWFuZFRlc3Rlcgp7CnVzZSBUZXN0ZXJUcmFpdDsKCnByaXZhdGUgJGNvbW1hbmQ7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ29tbWFuZCAkY29tbWFuZCkKewokdGhpcy0+Y29tbWFuZCA9ICRjb21tYW5kOwp9CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZShhcnJheSAkaW5wdXQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKCgppZiAoIWlzc2V0KCRpbnB1dFsnY29tbWFuZCddKQomJiAobnVsbCAhPT0gJGFwcGxpY2F0aW9uID0gJHRoaXMtPmNvbW1hbmQtPmdldEFwcGxpY2F0aW9uKCkpCiYmICRhcHBsaWNhdGlvbi0+Z2V0RGVmaW5pdGlvbigpLT5oYXNBcmd1bWVudCgnY29tbWFuZCcpCikgewokaW5wdXQgPSBhcnJheV9tZXJnZShbJ2NvbW1hbmQnID0+ICR0aGlzLT5jb21tYW5kLT5nZXROYW1lKCldLCAkaW5wdXQpOwp9CgokdGhpcy0+aW5wdXQgPSBuZXcgQXJyYXlJbnB1dCgkaW5wdXQpOwoKJHRoaXMtPmlucHV0LT5zZXRTdHJlYW0oc2VsZjo6Y3JlYXRlU3RyZWFtKCR0aGlzLT5pbnB1dHMpKTsKCmlmIChpc3NldCgkb3B0aW9uc1snaW50ZXJhY3RpdmUnXSkpIHsKJHRoaXMtPmlucHV0LT5zZXRJbnRlcmFjdGl2ZSgkb3B0aW9uc1snaW50ZXJhY3RpdmUnXSk7Cn0KCmlmICghaXNzZXQoJG9wdGlvbnNbJ2RlY29yYXRlZCddKSkgewokb3B0aW9uc1snZGVjb3JhdGVkJ10gPSBmYWxzZTsKfQoKJHRoaXMtPmluaXRPdXRwdXQoJG9wdGlvbnMpOwoKcmV0dXJuICR0aGlzLT5zdGF0dXNDb2RlID0gJHRoaXMtPmNvbW1hbmQtPnJ1bigkdGhpcy0+aW5wdXQsICR0aGlzLT5vdXRwdXQpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFRlc3RlclxDb25zdHJhaW50OwoKdXNlIFBIUFVuaXRcRnJhbWV3b3JrXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwoKZmluYWwgY2xhc3MgQ29tbWFuZElzU3VjY2Vzc2Z1bCBleHRlbmRzIENvbnN0cmFpbnQKewoKCgpwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICdpcyBzdWNjZXNzZnVsJzsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIG1hdGNoZXMoJG90aGVyKTogYm9vbAp7CnJldHVybiBDb21tYW5kOjpTVUNDRVNTID09PSAkb3RoZXI7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBmYWlsdXJlRGVzY3JpcHRpb24oJG90aGVyKTogc3RyaW5nCnsKcmV0dXJuICd0aGUgY29tbWFuZCAnLiR0aGlzLT50b1N0cmluZygpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkaXRpb25hbEZhaWx1cmVEZXNjcmlwdGlvbigkb3RoZXIpOiBzdHJpbmcKewokbWFwcGluZyA9IFsKQ29tbWFuZDo6RkFJTFVSRSA9PiAnQ29tbWFuZCBmYWlsZWQuJywKQ29tbWFuZDo6SU5WQUxJRCA9PiAnQ29tbWFuZCB3YXMgaW52YWxpZC4nLApdOwoKcmV0dXJuICRtYXBwaW5nWyRvdGhlcl0gPz8gc3ByaW50ZignQ29tbWFuZCByZXR1cm5lZCBleGl0IHN0YXR1cyAlZC4nLCAkb3RoZXIpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFRlc3RlcjsKCnVzZSBQSFBVbml0XEZyYW1ld29ya1xBc3NlcnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XFN0cmVhbU91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVzdGVyXENvbnN0cmFpbnRcQ29tbWFuZElzU3VjY2Vzc2Z1bDsKCgoKCnRyYWl0IFRlc3RlclRyYWl0CnsKCnByaXZhdGUgJG91dHB1dDsKcHJpdmF0ZSAkaW5wdXRzID0gW107CnByaXZhdGUgJGNhcHR1cmVTdHJlYW1zSW5kZXBlbmRlbnRseSA9IGZhbHNlOwoKcHJpdmF0ZSAkaW5wdXQ7Cgpwcml2YXRlICRzdGF0dXNDb2RlOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXNwbGF5KGJvb2wgJG5vcm1hbGl6ZSA9IGZhbHNlKQp7CmlmIChudWxsID09PSAkdGhpcy0+b3V0cHV0KSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignT3V0cHV0IG5vdCBpbml0aWFsaXplZCwgZGlkIHlvdSBleGVjdXRlIHRoZSBjb21tYW5kIGJlZm9yZSByZXF1ZXN0aW5nIHRoZSBkaXNwbGF5PycpOwp9CgpyZXdpbmQoJHRoaXMtPm91dHB1dC0+Z2V0U3RyZWFtKCkpOwoKJGRpc3BsYXkgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCR0aGlzLT5vdXRwdXQtPmdldFN0cmVhbSgpKTsKCmlmICgkbm9ybWFsaXplKSB7CiRkaXNwbGF5ID0gc3RyX3JlcGxhY2UoXFBIUF9FT0wsICJcbiIsICRkaXNwbGF5KTsKfQoKcmV0dXJuICRkaXNwbGF5Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9yT3V0cHV0KGJvb2wgJG5vcm1hbGl6ZSA9IGZhbHNlKQp7CmlmICghJHRoaXMtPmNhcHR1cmVTdHJlYW1zSW5kZXBlbmRlbnRseSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdUaGUgZXJyb3Igb3V0cHV0IGlzIG5vdCBhdmFpbGFibGUgd2hlbiB0aGUgdGVzdGVyIGlzIHJ1biB3aXRob3V0ICJjYXB0dXJlX3N0ZGVycl9zZXBhcmF0ZWx5IiBvcHRpb24gc2V0LicpOwp9CgpyZXdpbmQoJHRoaXMtPm91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKS0+Z2V0U3RyZWFtKCkpOwoKJGRpc3BsYXkgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCR0aGlzLT5vdXRwdXQtPmdldEVycm9yT3V0cHV0KCktPmdldFN0cmVhbSgpKTsKCmlmICgkbm9ybWFsaXplKSB7CiRkaXNwbGF5ID0gc3RyX3JlcGxhY2UoXFBIUF9FT0wsICJcbiIsICRkaXNwbGF5KTsKfQoKcmV0dXJuICRkaXNwbGF5Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dCgpCnsKcmV0dXJuICR0aGlzLT5pbnB1dDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0KCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGF0dXNDb2RlKCkKewppZiAobnVsbCA9PT0gJHRoaXMtPnN0YXR1c0NvZGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdTdGF0dXMgY29kZSBub3QgaW5pdGlhbGl6ZWQsIGRpZCB5b3UgZXhlY3V0ZSB0aGUgY29tbWFuZCBiZWZvcmUgcmVxdWVzdGluZyB0aGUgc3RhdHVzIGNvZGU/Jyk7Cn0KCnJldHVybiAkdGhpcy0+c3RhdHVzQ29kZTsKfQoKcHVibGljIGZ1bmN0aW9uIGFzc2VydENvbW1hbmRJc1N1Y2Nlc3NmdWwoc3RyaW5nICRtZXNzYWdlID0gJycpOiB2b2lkCnsKQXNzZXJ0Ojphc3NlcnRUaGF0KCR0aGlzLT5zdGF0dXNDb2RlLCBuZXcgQ29tbWFuZElzU3VjY2Vzc2Z1bCgpLCAkbWVzc2FnZSk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElucHV0cyhhcnJheSAkaW5wdXRzKQp7CiR0aGlzLT5pbnB1dHMgPSAkaW5wdXRzOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGluaXRPdXRwdXQoYXJyYXkgJG9wdGlvbnMpCnsKJHRoaXMtPmNhcHR1cmVTdHJlYW1zSW5kZXBlbmRlbnRseSA9IFxhcnJheV9rZXlfZXhpc3RzKCdjYXB0dXJlX3N0ZGVycl9zZXBhcmF0ZWx5JywgJG9wdGlvbnMpICYmICRvcHRpb25zWydjYXB0dXJlX3N0ZGVycl9zZXBhcmF0ZWx5J107CmlmICghJHRoaXMtPmNhcHR1cmVTdHJlYW1zSW5kZXBlbmRlbnRseSkgewokdGhpcy0+b3V0cHV0ID0gbmV3IFN0cmVhbU91dHB1dChmb3BlbigncGhwOi8vbWVtb3J5JywgJ3cnLCBmYWxzZSkpOwppZiAoaXNzZXQoJG9wdGlvbnNbJ2RlY29yYXRlZCddKSkgewokdGhpcy0+b3V0cHV0LT5zZXREZWNvcmF0ZWQoJG9wdGlvbnNbJ2RlY29yYXRlZCddKTsKfQppZiAoaXNzZXQoJG9wdGlvbnNbJ3ZlcmJvc2l0eSddKSkgewokdGhpcy0+b3V0cHV0LT5zZXRWZXJib3NpdHkoJG9wdGlvbnNbJ3ZlcmJvc2l0eSddKTsKfQp9IGVsc2UgewokdGhpcy0+b3V0cHV0ID0gbmV3IENvbnNvbGVPdXRwdXQoCiRvcHRpb25zWyd2ZXJib3NpdHknXSA/PyBDb25zb2xlT3V0cHV0OjpWRVJCT1NJVFlfTk9STUFMLAokb3B0aW9uc1snZGVjb3JhdGVkJ10gPz8gbnVsbAopOwoKJGVycm9yT3V0cHV0ID0gbmV3IFN0cmVhbU91dHB1dChmb3BlbigncGhwOi8vbWVtb3J5JywgJ3cnLCBmYWxzZSkpOwokZXJyb3JPdXRwdXQtPnNldEZvcm1hdHRlcigkdGhpcy0+b3V0cHV0LT5nZXRGb3JtYXR0ZXIoKSk7CiRlcnJvck91dHB1dC0+c2V0VmVyYm9zaXR5KCR0aGlzLT5vdXRwdXQtPmdldFZlcmJvc2l0eSgpKTsKJGVycm9yT3V0cHV0LT5zZXREZWNvcmF0ZWQoJHRoaXMtPm91dHB1dC0+aXNEZWNvcmF0ZWQoKSk7CgokcmVmbGVjdGVkT3V0cHV0ID0gbmV3IFxSZWZsZWN0aW9uT2JqZWN0KCR0aGlzLT5vdXRwdXQpOwokc3RyRXJyUHJvcGVydHkgPSAkcmVmbGVjdGVkT3V0cHV0LT5nZXRQcm9wZXJ0eSgnc3RkZXJyJyk7CiRzdHJFcnJQcm9wZXJ0eS0+c2V0QWNjZXNzaWJsZSh0cnVlKTsKJHN0ckVyclByb3BlcnR5LT5zZXRWYWx1ZSgkdGhpcy0+b3V0cHV0LCAkZXJyb3JPdXRwdXQpOwoKJHJlZmxlY3RlZFBhcmVudCA9ICRyZWZsZWN0ZWRPdXRwdXQtPmdldFBhcmVudENsYXNzKCk7CiRzdHJlYW1Qcm9wZXJ0eSA9ICRyZWZsZWN0ZWRQYXJlbnQtPmdldFByb3BlcnR5KCdzdHJlYW0nKTsKJHN0cmVhbVByb3BlcnR5LT5zZXRBY2Nlc3NpYmxlKHRydWUpOwokc3RyZWFtUHJvcGVydHktPnNldFZhbHVlKCR0aGlzLT5vdXRwdXQsIGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAndycsIGZhbHNlKSk7Cn0KfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlU3RyZWFtKGFycmF5ICRpbnB1dHMpCnsKJHN0cmVhbSA9IGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAncisnLCBmYWxzZSk7Cgpmb3JlYWNoICgkaW5wdXRzIGFzICRpbnB1dCkgewpmd3JpdGUoJHN0cmVhbSwgJGlucHV0LlxQSFBfRU9MKTsKfQoKcmV3aW5kKCRzdHJlYW0pOwoKcmV0dXJuICRzdHJlYW07Cn0KfQoKQ29weXJpZ2h0IChjKSAyMDIwLXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgppZiAoIWZ1bmN0aW9uX2V4aXN0cygndHJpZ2dlcl9kZXByZWNhdGlvbicpKSB7CgoKCgoKCgoKCgpmdW5jdGlvbiB0cmlnZ2VyX2RlcHJlY2F0aW9uKHN0cmluZyAkcGFja2FnZSwgc3RyaW5nICR2ZXJzaW9uLCBzdHJpbmcgJG1lc3NhZ2UsIC4uLiRhcmdzKTogdm9pZAp7CkB0cmlnZ2VyX2Vycm9yKCgkcGFja2FnZSB8fCAkdmVyc2lvbiA/ICJTaW5jZSAkcGFja2FnZSAkdmVyc2lvbjogIiA6ICcnKS4oJGFyZ3MgPyB2c3ByaW50ZigkbWVzc2FnZSwgJGFyZ3MpIDogJG1lc3NhZ2UpLCBcRV9VU0VSX0RFUFJFQ0FURUQpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvbjsKCgoKCgoKaW50ZXJmYWNlIEV4Y2VwdGlvbkludGVyZmFjZSBleHRlbmRzIFxUaHJvd2FibGUKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb247CgoKCgoKCgpjbGFzcyBGaWxlTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbgp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/c3RyaW5nICRtZXNzYWdlID0gbnVsbCwgaW50ICRjb2RlID0gMCwgP1xUaHJvd2FibGUgJHByZXZpb3VzID0gbnVsbCwgP3N0cmluZyAkcGF0aCA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRtZXNzYWdlKSB7CmlmIChudWxsID09PSAkcGF0aCkgewokbWVzc2FnZSA9ICdGaWxlIGNvdWxkIG5vdCBiZSBmb3VuZC4nOwp9IGVsc2UgewokbWVzc2FnZSA9IHNwcmludGYoJ0ZpbGUgIiVzIiBjb3VsZCBub3QgYmUgZm91bmQuJywgJHBhdGgpOwp9Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlLCAkcHJldmlvdXMsICRwYXRoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb247CgoKCgoKCgoKY2xhc3MgSU9FeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIElPRXhjZXB0aW9uSW50ZXJmYWNlCnsKcHJpdmF0ZSAkcGF0aDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG1lc3NhZ2UsIGludCAkY29kZSA9IDAsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwsID9zdHJpbmcgJHBhdGggPSBudWxsKQp7CiR0aGlzLT5wYXRoID0gJHBhdGg7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSwgJHByZXZpb3VzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhdGgoKQp7CnJldHVybiAkdGhpcy0+cGF0aDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb247CgoKCgoKCmludGVyZmFjZSBJT0V4Y2VwdGlvbkludGVyZmFjZSBleHRlbmRzIEV4Y2VwdGlvbkludGVyZmFjZQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhdGgoKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uOwoKCgoKY2xhc3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uXEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uXElPRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBGaWxlc3lzdGVtCnsKcHJpdmF0ZSBzdGF0aWMgJGxhc3RFcnJvcjsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weShzdHJpbmcgJG9yaWdpbkZpbGUsIHN0cmluZyAkdGFyZ2V0RmlsZSwgYm9vbCAkb3ZlcndyaXRlTmV3ZXJGaWxlcyA9IGZhbHNlKQp7CiRvcmlnaW5Jc0xvY2FsID0gc3RyZWFtX2lzX2xvY2FsKCRvcmlnaW5GaWxlKSB8fCAwID09PSBzdHJpcG9zKCRvcmlnaW5GaWxlLCAnZmlsZTovLycpOwppZiAoJG9yaWdpbklzTG9jYWwgJiYgIWlzX2ZpbGUoJG9yaWdpbkZpbGUpKSB7CnRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNvcHkgIiVzIiBiZWNhdXNlIGZpbGUgZG9lcyBub3QgZXhpc3QuJywgJG9yaWdpbkZpbGUpLCAwLCBudWxsLCAkb3JpZ2luRmlsZSk7Cn0KCiR0aGlzLT5ta2RpcihcZGlybmFtZSgkdGFyZ2V0RmlsZSkpOwoKJGRvQ29weSA9IHRydWU7CmlmICghJG92ZXJ3cml0ZU5ld2VyRmlsZXMgJiYgIXBhcnNlX3VybCgkb3JpZ2luRmlsZSwgXFBIUF9VUkxfSE9TVCkgJiYgaXNfZmlsZSgkdGFyZ2V0RmlsZSkpIHsKJGRvQ29weSA9IGZpbGVtdGltZSgkb3JpZ2luRmlsZSkgPiBmaWxlbXRpbWUoJHRhcmdldEZpbGUpOwp9CgppZiAoJGRvQ29weSkgewoKaWYgKCEkc291cmNlID0gc2VsZjo6Ym94KCdmb3BlbicsICRvcmlnaW5GaWxlLCAncicpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY29weSAiJXMiIHRvICIlcyIgYmVjYXVzZSBzb3VyY2UgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIGZvciByZWFkaW5nOiAnLCAkb3JpZ2luRmlsZSwgJHRhcmdldEZpbGUpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICRvcmlnaW5GaWxlKTsKfQoKCmlmICghJHRhcmdldCA9IHNlbGY6OmJveCgnZm9wZW4nLCAkdGFyZ2V0RmlsZSwgJ3cnLCBmYWxzZSwgc3RyZWFtX2NvbnRleHRfY3JlYXRlKFsnZnRwJyA9PiBbJ292ZXJ3cml0ZScgPT4gdHJ1ZV1dKSkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjb3B5ICIlcyIgdG8gIiVzIiBiZWNhdXNlIHRhcmdldCBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmc6ICcsICRvcmlnaW5GaWxlLCAkdGFyZ2V0RmlsZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJG9yaWdpbkZpbGUpOwp9CgokYnl0ZXNDb3BpZWQgPSBzdHJlYW1fY29weV90b19zdHJlYW0oJHNvdXJjZSwgJHRhcmdldCk7CmZjbG9zZSgkc291cmNlKTsKZmNsb3NlKCR0YXJnZXQpOwp1bnNldCgkc291cmNlLCAkdGFyZ2V0KTsKCmlmICghaXNfZmlsZSgkdGFyZ2V0RmlsZSkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjb3B5ICIlcyIgdG8gIiVzIi4nLCAkb3JpZ2luRmlsZSwgJHRhcmdldEZpbGUpLCAwLCBudWxsLCAkb3JpZ2luRmlsZSk7Cn0KCmlmICgkb3JpZ2luSXNMb2NhbCkgewoKc2VsZjo6Ym94KCdjaG1vZCcsICR0YXJnZXRGaWxlLCBmaWxlcGVybXMoJHRhcmdldEZpbGUpIHwgKGZpbGVwZXJtcygkb3JpZ2luRmlsZSkgJiAwMTExKSk7CgoKc2VsZjo6Ym94KCd0b3VjaCcsICR0YXJnZXRGaWxlLCBmaWxlbXRpbWUoJG9yaWdpbkZpbGUpKTsKCmlmICgkYnl0ZXNDb3BpZWQgIT09ICRieXRlc09yaWdpbiA9IGZpbGVzaXplKCRvcmlnaW5GaWxlKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNvcHkgdGhlIHdob2xlIGNvbnRlbnQgb2YgIiVzIiB0byAiJXMiICglZyBvZiAlZyBieXRlcyBjb3BpZWQpLicsICRvcmlnaW5GaWxlLCAkdGFyZ2V0RmlsZSwgJGJ5dGVzQ29waWVkLCAkYnl0ZXNPcmlnaW4pLCAwLCBudWxsLCAkb3JpZ2luRmlsZSk7Cn0KfQp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbWtkaXIoJGRpcnMsIGludCAkbW9kZSA9IDA3NzcpCnsKZm9yZWFjaCAoJHRoaXMtPnRvSXRlcmFibGUoJGRpcnMpIGFzICRkaXIpIHsKaWYgKGlzX2RpcigkZGlyKSkgewpjb250aW51ZTsKfQoKaWYgKCFzZWxmOjpib3goJ21rZGlyJywgJGRpciwgJG1vZGUsIHRydWUpICYmICFpc19kaXIoJGRpcikpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjcmVhdGUgIiVzIjogJywgJGRpcikuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGRpcik7Cn0KfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGV4aXN0cygkZmlsZXMpCnsKJG1heFBhdGhMZW5ndGggPSBcUEhQX01BWFBBVEhMRU4gLSAyOwoKZm9yZWFjaCAoJHRoaXMtPnRvSXRlcmFibGUoJGZpbGVzKSBhcyAkZmlsZSkgewppZiAoXHN0cmxlbigkZmlsZSkgPiAkbWF4UGF0aExlbmd0aCkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignQ291bGQgbm90IGNoZWNrIGlmIGZpbGUgZXhpc3QgYmVjYXVzZSBwYXRoIGxlbmd0aCBleGNlZWRzICVkIGNoYXJhY3RlcnMuJywgJG1heFBhdGhMZW5ndGgpLCAwLCBudWxsLCAkZmlsZSk7Cn0KCmlmICghZmlsZV9leGlzdHMoJGZpbGUpKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRvdWNoKCRmaWxlcywgP2ludCAkdGltZSA9IG51bGwsID9pbnQgJGF0aW1lID0gbnVsbCkKewpmb3JlYWNoICgkdGhpcy0+dG9JdGVyYWJsZSgkZmlsZXMpIGFzICRmaWxlKSB7CmlmICghKCR0aW1lID8gc2VsZjo6Ym94KCd0b3VjaCcsICRmaWxlLCAkdGltZSwgJGF0aW1lKSA6IHNlbGY6OmJveCgndG91Y2gnLCAkZmlsZSkpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gdG91Y2ggIiVzIjogJywgJGZpbGUpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICRmaWxlKTsKfQp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKCRmaWxlcykKewppZiAoJGZpbGVzIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CiRmaWxlcyA9IGl0ZXJhdG9yX3RvX2FycmF5KCRmaWxlcywgZmFsc2UpOwp9IGVsc2VpZiAoIVxpc19hcnJheSgkZmlsZXMpKSB7CiRmaWxlcyA9IFskZmlsZXNdOwp9CgpzZWxmOjpkb1JlbW92ZSgkZmlsZXMsIGZhbHNlKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZG9SZW1vdmUoYXJyYXkgJGZpbGVzLCBib29sICRpc1JlY3Vyc2l2ZSk6IHZvaWQKewokZmlsZXMgPSBhcnJheV9yZXZlcnNlKCRmaWxlcyk7CmZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZSkgewppZiAoaXNfbGluaygkZmlsZSkpIHsKCmlmICghKHNlbGY6OmJveCgndW5saW5rJywgJGZpbGUpIHx8ICdcXCcgIT09IFxESVJFQ1RPUllfU0VQQVJBVE9SIHx8IHNlbGY6OmJveCgncm1kaXInLCAkZmlsZSkpICYmIGZpbGVfZXhpc3RzKCRmaWxlKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIHJlbW92ZSBzeW1saW5rICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yKTsKfQp9IGVsc2VpZiAoaXNfZGlyKCRmaWxlKSkgewppZiAoISRpc1JlY3Vyc2l2ZSkgewokdG1wTmFtZSA9IFxkaXJuYW1lKHJlYWxwYXRoKCRmaWxlKSkuJy8uIScuc3RycmV2KHN0cnRyKGJhc2U2NF9lbmNvZGUocmFuZG9tX2J5dGVzKDIpKSwgJy89JywgJy0hJykpOwoKaWYgKGZpbGVfZXhpc3RzKCR0bXBOYW1lKSkgewp0cnkgewpzZWxmOjpkb1JlbW92ZShbJHRtcE5hbWVdLCB0cnVlKTsKfSBjYXRjaCAoSU9FeGNlcHRpb24gJGUpIHsKfQp9CgppZiAoIWZpbGVfZXhpc3RzKCR0bXBOYW1lKSAmJiBzZWxmOjpib3goJ3JlbmFtZScsICRmaWxlLCAkdG1wTmFtZSkpIHsKJG9yaWdGaWxlID0gJGZpbGU7CiRmaWxlID0gJHRtcE5hbWU7Cn0gZWxzZSB7CiRvcmlnRmlsZSA9IG51bGw7Cn0KfQoKJGZpbGVzID0gbmV3IFxGaWxlc3lzdGVtSXRlcmF0b3IoJGZpbGUsIFxGaWxlc3lzdGVtSXRlcmF0b3I6OkNVUlJFTlRfQVNfUEFUSE5BTUUgfCBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFMpOwpzZWxmOjpkb1JlbW92ZShpdGVyYXRvcl90b19hcnJheSgkZmlsZXMsIHRydWUpLCB0cnVlKTsKCmlmICghc2VsZjo6Ym94KCdybWRpcicsICRmaWxlKSAmJiBmaWxlX2V4aXN0cygkZmlsZSkgJiYgISRpc1JlY3Vyc2l2ZSkgewokbGFzdEVycm9yID0gc2VsZjo6JGxhc3RFcnJvcjsKCmlmIChudWxsICE9PSAkb3JpZ0ZpbGUgJiYgc2VsZjo6Ym94KCdyZW5hbWUnLCAkZmlsZSwgJG9yaWdGaWxlKSkgewokZmlsZSA9ICRvcmlnRmlsZTsKfQoKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byByZW1vdmUgZGlyZWN0b3J5ICIlcyI6ICcsICRmaWxlKS4kbGFzdEVycm9yKTsKfQp9IGVsc2VpZiAoIXNlbGY6OmJveCgndW5saW5rJywgJGZpbGUpICYmICgoc2VsZjo6JGxhc3RFcnJvciAmJiBzdHJfY29udGFpbnMoc2VsZjo6JGxhc3RFcnJvciwgJ1Blcm1pc3Npb24gZGVuaWVkJykpIHx8IGZpbGVfZXhpc3RzKCRmaWxlKSkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byByZW1vdmUgZmlsZSAiJXMiOiAnLCAkZmlsZSkuc2VsZjo6JGxhc3RFcnJvcik7Cn0KfQp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNobW9kKCRmaWxlcywgaW50ICRtb2RlLCBpbnQgJHVtYXNrID0gMDAwMCwgYm9vbCAkcmVjdXJzaXZlID0gZmFsc2UpCnsKZm9yZWFjaCAoJHRoaXMtPnRvSXRlcmFibGUoJGZpbGVzKSBhcyAkZmlsZSkgewppZiAoKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwIHx8IFxpc19pbnQoJG1vZGUpKSAmJiAhc2VsZjo6Ym94KCdjaG1vZCcsICRmaWxlLCAkbW9kZSAmIH4kdW1hc2spKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY2htb2QgZmlsZSAiJXMiOiAnLCAkZmlsZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGZpbGUpOwp9CmlmICgkcmVjdXJzaXZlICYmIGlzX2RpcigkZmlsZSkgJiYgIWlzX2xpbmsoJGZpbGUpKSB7CiR0aGlzLT5jaG1vZChuZXcgXEZpbGVzeXN0ZW1JdGVyYXRvcigkZmlsZSksICRtb2RlLCAkdW1hc2ssIHRydWUpOwp9Cn0KfQoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaG93bigkZmlsZXMsICR1c2VyLCBib29sICRyZWN1cnNpdmUgPSBmYWxzZSkKewpmb3JlYWNoICgkdGhpcy0+dG9JdGVyYWJsZSgkZmlsZXMpIGFzICRmaWxlKSB7CmlmICgkcmVjdXJzaXZlICYmIGlzX2RpcigkZmlsZSkgJiYgIWlzX2xpbmsoJGZpbGUpKSB7CiR0aGlzLT5jaG93bihuZXcgXEZpbGVzeXN0ZW1JdGVyYXRvcigkZmlsZSksICR1c2VyLCB0cnVlKTsKfQppZiAoaXNfbGluaygkZmlsZSkgJiYgXGZ1bmN0aW9uX2V4aXN0cygnbGNob3duJykpIHsKaWYgKCFzZWxmOjpib3goJ2xjaG93bicsICRmaWxlLCAkdXNlcikpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjaG93biBmaWxlICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZSk7Cn0KfSBlbHNlIHsKaWYgKCFzZWxmOjpib3goJ2Nob3duJywgJGZpbGUsICR1c2VyKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNob3duIGZpbGUgIiVzIjogJywgJGZpbGUpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICRmaWxlKTsKfQp9Cn0KfQoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGdycCgkZmlsZXMsICRncm91cCwgYm9vbCAkcmVjdXJzaXZlID0gZmFsc2UpCnsKZm9yZWFjaCAoJHRoaXMtPnRvSXRlcmFibGUoJGZpbGVzKSBhcyAkZmlsZSkgewppZiAoJHJlY3Vyc2l2ZSAmJiBpc19kaXIoJGZpbGUpICYmICFpc19saW5rKCRmaWxlKSkgewokdGhpcy0+Y2hncnAobmV3IFxGaWxlc3lzdGVtSXRlcmF0b3IoJGZpbGUpLCAkZ3JvdXAsIHRydWUpOwp9CmlmIChpc19saW5rKCRmaWxlKSAmJiBcZnVuY3Rpb25fZXhpc3RzKCdsY2hncnAnKSkgewppZiAoIXNlbGY6OmJveCgnbGNoZ3JwJywgJGZpbGUsICRncm91cCkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjaGdycCBmaWxlICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZSk7Cn0KfSBlbHNlIHsKaWYgKCFzZWxmOjpib3goJ2NoZ3JwJywgJGZpbGUsICRncm91cCkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjaGdycCBmaWxlICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZSk7Cn0KfQp9Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW5hbWUoc3RyaW5nICRvcmlnaW4sIHN0cmluZyAkdGFyZ2V0LCBib29sICRvdmVyd3JpdGUgPSBmYWxzZSkKewoKaWYgKCEkb3ZlcndyaXRlICYmICR0aGlzLT5pc1JlYWRhYmxlKCR0YXJnZXQpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdDYW5ub3QgcmVuYW1lIGJlY2F1c2UgdGhlIHRhcmdldCAiJXMiIGFscmVhZHkgZXhpc3RzLicsICR0YXJnZXQpLCAwLCBudWxsLCAkdGFyZ2V0KTsKfQoKaWYgKCFzZWxmOjpib3goJ3JlbmFtZScsICRvcmlnaW4sICR0YXJnZXQpKSB7CmlmIChpc19kaXIoJG9yaWdpbikpIHsKCiR0aGlzLT5taXJyb3IoJG9yaWdpbiwgJHRhcmdldCwgbnVsbCwgWydvdmVycmlkZScgPT4gJG92ZXJ3cml0ZSwgJ2RlbGV0ZScgPT4gJG92ZXJ3cml0ZV0pOwokdGhpcy0+cmVtb3ZlKCRvcmlnaW4pOwoKcmV0dXJuOwp9CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdDYW5ub3QgcmVuYW1lICIlcyIgdG8gIiVzIjogJywgJG9yaWdpbiwgJHRhcmdldCkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJHRhcmdldCk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzUmVhZGFibGUoc3RyaW5nICRmaWxlbmFtZSk6IGJvb2wKewokbWF4UGF0aExlbmd0aCA9IFxQSFBfTUFYUEFUSExFTiAtIDI7CgppZiAoXHN0cmxlbigkZmlsZW5hbWUpID4gJG1heFBhdGhMZW5ndGgpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0NvdWxkIG5vdCBjaGVjayBpZiBmaWxlIGlzIHJlYWRhYmxlIGJlY2F1c2UgcGF0aCBsZW5ndGggZXhjZWVkcyAlZCBjaGFyYWN0ZXJzLicsICRtYXhQYXRoTGVuZ3RoKSwgMCwgbnVsbCwgJGZpbGVuYW1lKTsKfQoKcmV0dXJuIGlzX3JlYWRhYmxlKCRmaWxlbmFtZSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN5bWxpbmsoc3RyaW5nICRvcmlnaW5EaXIsIHN0cmluZyAkdGFyZ2V0RGlyLCBib29sICRjb3B5T25XaW5kb3dzID0gZmFsc2UpCnsKc2VsZjo6YXNzZXJ0RnVuY3Rpb25FeGlzdHMoJ3N5bWxpbmsnKTsKCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokb3JpZ2luRGlyID0gc3RydHIoJG9yaWdpbkRpciwgJy8nLCAnXFwnKTsKJHRhcmdldERpciA9IHN0cnRyKCR0YXJnZXREaXIsICcvJywgJ1xcJyk7CgppZiAoJGNvcHlPbldpbmRvd3MpIHsKJHRoaXMtPm1pcnJvcigkb3JpZ2luRGlyLCAkdGFyZ2V0RGlyKTsKCnJldHVybjsKfQp9CgokdGhpcy0+bWtkaXIoXGRpcm5hbWUoJHRhcmdldERpcikpOwoKaWYgKGlzX2xpbmsoJHRhcmdldERpcikpIHsKaWYgKHJlYWRsaW5rKCR0YXJnZXREaXIpID09PSAkb3JpZ2luRGlyKSB7CnJldHVybjsKfQokdGhpcy0+cmVtb3ZlKCR0YXJnZXREaXIpOwp9CgppZiAoIXNlbGY6OmJveCgnc3ltbGluaycsICRvcmlnaW5EaXIsICR0YXJnZXREaXIpKSB7CiR0aGlzLT5saW5rRXhjZXB0aW9uKCRvcmlnaW5EaXIsICR0YXJnZXREaXIsICdzeW1ib2xpYycpOwp9Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcmRsaW5rKHN0cmluZyAkb3JpZ2luRmlsZSwgJHRhcmdldEZpbGVzKQp7CnNlbGY6OmFzc2VydEZ1bmN0aW9uRXhpc3RzKCdsaW5rJyk7CgppZiAoISR0aGlzLT5leGlzdHMoJG9yaWdpbkZpbGUpKSB7CnRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24obnVsbCwgMCwgbnVsbCwgJG9yaWdpbkZpbGUpOwp9CgppZiAoIWlzX2ZpbGUoJG9yaWdpbkZpbGUpKSB7CnRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignT3JpZ2luIGZpbGUgIiVzIiBpcyBub3QgYSBmaWxlLicsICRvcmlnaW5GaWxlKSk7Cn0KCmZvcmVhY2ggKCR0aGlzLT50b0l0ZXJhYmxlKCR0YXJnZXRGaWxlcykgYXMgJHRhcmdldEZpbGUpIHsKaWYgKGlzX2ZpbGUoJHRhcmdldEZpbGUpKSB7CmlmIChmaWxlaW5vZGUoJG9yaWdpbkZpbGUpID09PSBmaWxlaW5vZGUoJHRhcmdldEZpbGUpKSB7CmNvbnRpbnVlOwp9CiR0aGlzLT5yZW1vdmUoJHRhcmdldEZpbGUpOwp9CgppZiAoIXNlbGY6OmJveCgnbGluaycsICRvcmlnaW5GaWxlLCAkdGFyZ2V0RmlsZSkpIHsKJHRoaXMtPmxpbmtFeGNlcHRpb24oJG9yaWdpbkZpbGUsICR0YXJnZXRGaWxlLCAnaGFyZCcpOwp9Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsaW5rRXhjZXB0aW9uKHN0cmluZyAkb3JpZ2luLCBzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRsaW5rVHlwZSkKewppZiAoc2VsZjo6JGxhc3RFcnJvcikgewppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgJiYgc3RyX2NvbnRhaW5zKHNlbGY6OiRsYXN0RXJyb3IsICdlcnJvciBjb2RlKDEzMTQpJykpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ1VuYWJsZSB0byBjcmVhdGUgIiVzIiBsaW5rIGR1ZSB0byBlcnJvciBjb2RlIDEzMTQ6IFwnQSByZXF1aXJlZCBwcml2aWxlZ2UgaXMgbm90IGhlbGQgYnkgdGhlIGNsaWVudFwnLiBEbyB5b3UgaGF2ZSB0aGUgcmVxdWlyZWQgQWRtaW5pc3RyYXRvci1yaWdodHM/JywgJGxpbmtUeXBlKSwgMCwgbnVsbCwgJHRhcmdldCk7Cn0KfQp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNyZWF0ZSAiJXMiIGxpbmsgZnJvbSAiJXMiIHRvICIlcyI6ICcsICRsaW5rVHlwZSwgJG9yaWdpbiwgJHRhcmdldCkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJHRhcmdldCk7Cn0KCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVhZGxpbmsoc3RyaW5nICRwYXRoLCBib29sICRjYW5vbmljYWxpemUgPSBmYWxzZSkKewppZiAoISRjYW5vbmljYWxpemUgJiYgIWlzX2xpbmsoJHBhdGgpKSB7CnJldHVybiBudWxsOwp9CgppZiAoJGNhbm9uaWNhbGl6ZSkgewppZiAoISR0aGlzLT5leGlzdHMoJHBhdGgpKSB7CnJldHVybiBudWxsOwp9CgppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgJiYgXFBIUF9WRVJTSU9OX0lEIDwgNzA0MTApIHsKJHBhdGggPSByZWFkbGluaygkcGF0aCk7Cn0KCnJldHVybiByZWFscGF0aCgkcGF0aCk7Cn0KCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiAmJiBcUEhQX1ZFUlNJT05fSUQgPCA3MDQwMCkgewpyZXR1cm4gcmVhbHBhdGgoJHBhdGgpOwp9CgpyZXR1cm4gcmVhZGxpbmsoJHBhdGgpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtYWtlUGF0aFJlbGF0aXZlKHN0cmluZyAkZW5kUGF0aCwgc3RyaW5nICRzdGFydFBhdGgpCnsKaWYgKCEkdGhpcy0+aXNBYnNvbHV0ZVBhdGgoJHN0YXJ0UGF0aCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgc3RhcnQgcGF0aCAiJXMiIGlzIG5vdCBhYnNvbHV0ZS4nLCAkc3RhcnRQYXRoKSk7Cn0KCmlmICghJHRoaXMtPmlzQWJzb2x1dGVQYXRoKCRlbmRQYXRoKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBlbmQgcGF0aCAiJXMiIGlzIG5vdCBhYnNvbHV0ZS4nLCAkZW5kUGF0aCkpOwp9CgoKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CiRlbmRQYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkZW5kUGF0aCk7CiRzdGFydFBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRzdGFydFBhdGgpOwp9Cgokc3BsaXREcml2ZUxldHRlciA9IGZ1bmN0aW9uICgkcGF0aCkgewpyZXR1cm4gKFxzdHJsZW4oJHBhdGgpID4gMiAmJiAnOicgPT09ICRwYXRoWzFdICYmICcvJyA9PT0gJHBhdGhbMl0gJiYgY3R5cGVfYWxwaGEoJHBhdGhbMF0pKQo/IFtzdWJzdHIoJHBhdGgsIDIpLCBzdHJ0b3VwcGVyKCRwYXRoWzBdKV0KOiBbJHBhdGgsIG51bGxdOwp9OwoKJHNwbGl0UGF0aCA9IGZ1bmN0aW9uICgkcGF0aCkgewokcmVzdWx0ID0gW107Cgpmb3JlYWNoIChleHBsb2RlKCcvJywgdHJpbSgkcGF0aCwgJy8nKSkgYXMgJHNlZ21lbnQpIHsKaWYgKCcuLicgPT09ICRzZWdtZW50KSB7CmFycmF5X3BvcCgkcmVzdWx0KTsKfSBlbHNlaWYgKCcuJyAhPT0gJHNlZ21lbnQgJiYgJycgIT09ICRzZWdtZW50KSB7CiRyZXN1bHRbXSA9ICRzZWdtZW50Owp9Cn0KCnJldHVybiAkcmVzdWx0Owp9OwoKWyRlbmRQYXRoLCAkZW5kRHJpdmVMZXR0ZXJdID0gJHNwbGl0RHJpdmVMZXR0ZXIoJGVuZFBhdGgpOwpbJHN0YXJ0UGF0aCwgJHN0YXJ0RHJpdmVMZXR0ZXJdID0gJHNwbGl0RHJpdmVMZXR0ZXIoJHN0YXJ0UGF0aCk7Cgokc3RhcnRQYXRoQXJyID0gJHNwbGl0UGF0aCgkc3RhcnRQYXRoKTsKJGVuZFBhdGhBcnIgPSAkc3BsaXRQYXRoKCRlbmRQYXRoKTsKCmlmICgkZW5kRHJpdmVMZXR0ZXIgJiYgJHN0YXJ0RHJpdmVMZXR0ZXIgJiYgJGVuZERyaXZlTGV0dGVyICE9ICRzdGFydERyaXZlTGV0dGVyKSB7CgpyZXR1cm4gJGVuZERyaXZlTGV0dGVyLic6LycuKCRlbmRQYXRoQXJyID8gaW1wbG9kZSgnLycsICRlbmRQYXRoQXJyKS4nLycgOiAnJyk7Cn0KCgokaW5kZXggPSAwOwp3aGlsZSAoaXNzZXQoJHN0YXJ0UGF0aEFyclskaW5kZXhdKSAmJiBpc3NldCgkZW5kUGF0aEFyclskaW5kZXhdKSAmJiAkc3RhcnRQYXRoQXJyWyRpbmRleF0gPT09ICRlbmRQYXRoQXJyWyRpbmRleF0pIHsKKyskaW5kZXg7Cn0KCgppZiAoMSA9PT0gXGNvdW50KCRzdGFydFBhdGhBcnIpICYmICcnID09PSAkc3RhcnRQYXRoQXJyWzBdKSB7CiRkZXB0aCA9IDA7Cn0gZWxzZSB7CiRkZXB0aCA9IFxjb3VudCgkc3RhcnRQYXRoQXJyKSAtICRpbmRleDsKfQoKCiR0cmF2ZXJzZXIgPSBzdHJfcmVwZWF0KCcuLi8nLCAkZGVwdGgpOwoKJGVuZFBhdGhSZW1haW5kZXIgPSBpbXBsb2RlKCcvJywgXGFycmF5X3NsaWNlKCRlbmRQYXRoQXJyLCAkaW5kZXgpKTsKCgokcmVsYXRpdmVQYXRoID0gJHRyYXZlcnNlci4oJycgIT09ICRlbmRQYXRoUmVtYWluZGVyID8gJGVuZFBhdGhSZW1haW5kZXIuJy8nIDogJycpOwoKcmV0dXJuICcnID09PSAkcmVsYXRpdmVQYXRoID8gJy4vJyA6ICRyZWxhdGl2ZVBhdGg7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1pcnJvcihzdHJpbmcgJG9yaWdpbkRpciwgc3RyaW5nICR0YXJnZXREaXIsID9cVHJhdmVyc2FibGUgJGl0ZXJhdG9yID0gbnVsbCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGFyZ2V0RGlyID0gcnRyaW0oJHRhcmdldERpciwgJy9cXCcpOwokb3JpZ2luRGlyID0gcnRyaW0oJG9yaWdpbkRpciwgJy9cXCcpOwokb3JpZ2luRGlyTGVuID0gXHN0cmxlbigkb3JpZ2luRGlyKTsKCmlmICghJHRoaXMtPmV4aXN0cygkb3JpZ2luRGlyKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignVGhlIG9yaWdpbiBkaXJlY3Rvcnkgc3BlY2lmaWVkICIlcyIgd2FzIG5vdCBmb3VuZC4nLCAkb3JpZ2luRGlyKSwgMCwgbnVsbCwgJG9yaWdpbkRpcik7Cn0KCgppZiAoJHRoaXMtPmV4aXN0cygkdGFyZ2V0RGlyKSAmJiBpc3NldCgkb3B0aW9uc1snZGVsZXRlJ10pICYmICRvcHRpb25zWydkZWxldGUnXSkgewokZGVsZXRlSXRlcmF0b3IgPSAkaXRlcmF0b3I7CmlmIChudWxsID09PSAkZGVsZXRlSXRlcmF0b3IpIHsKJGZsYWdzID0gXEZpbGVzeXN0ZW1JdGVyYXRvcjo6U0tJUF9ET1RTOwokZGVsZXRlSXRlcmF0b3IgPSBuZXcgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IobmV3IFxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkdGFyZ2V0RGlyLCAkZmxhZ3MpLCBcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6Q0hJTERfRklSU1QpOwp9CiR0YXJnZXREaXJMZW4gPSBcc3RybGVuKCR0YXJnZXREaXIpOwpmb3JlYWNoICgkZGVsZXRlSXRlcmF0b3IgYXMgJGZpbGUpIHsKJG9yaWdpbiA9ICRvcmlnaW5EaXIuc3Vic3RyKCRmaWxlLT5nZXRQYXRobmFtZSgpLCAkdGFyZ2V0RGlyTGVuKTsKaWYgKCEkdGhpcy0+ZXhpc3RzKCRvcmlnaW4pKSB7CiR0aGlzLT5yZW1vdmUoJGZpbGUpOwp9Cn0KfQoKJGNvcHlPbldpbmRvd3MgPSAkb3B0aW9uc1snY29weV9vbl93aW5kb3dzJ10gPz8gZmFsc2U7CgppZiAobnVsbCA9PT0gJGl0ZXJhdG9yKSB7CiRmbGFncyA9ICRjb3B5T25XaW5kb3dzID8gXEZpbGVzeXN0ZW1JdGVyYXRvcjo6U0tJUF9ET1RTIHwgXEZpbGVzeXN0ZW1JdGVyYXRvcjo6Rk9MTE9XX1NZTUxJTktTIDogXEZpbGVzeXN0ZW1JdGVyYXRvcjo6U0tJUF9ET1RTOwokaXRlcmF0b3IgPSBuZXcgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IobmV3IFxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkb3JpZ2luRGlyLCAkZmxhZ3MpLCBcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6U0VMRl9GSVJTVCk7Cn0KCiR0aGlzLT5ta2RpcigkdGFyZ2V0RGlyKTsKJGZpbGVzQ3JlYXRlZFdoaWxlTWlycm9yaW5nID0gW107Cgpmb3JlYWNoICgkaXRlcmF0b3IgYXMgJGZpbGUpIHsKaWYgKCRmaWxlLT5nZXRQYXRobmFtZSgpID09PSAkdGFyZ2V0RGlyIHx8ICRmaWxlLT5nZXRSZWFsUGF0aCgpID09PSAkdGFyZ2V0RGlyIHx8IGlzc2V0KCRmaWxlc0NyZWF0ZWRXaGlsZU1pcnJvcmluZ1skZmlsZS0+Z2V0UmVhbFBhdGgoKV0pKSB7CmNvbnRpbnVlOwp9CgokdGFyZ2V0ID0gJHRhcmdldERpci5zdWJzdHIoJGZpbGUtPmdldFBhdGhuYW1lKCksICRvcmlnaW5EaXJMZW4pOwokZmlsZXNDcmVhdGVkV2hpbGVNaXJyb3JpbmdbJHRhcmdldF0gPSB0cnVlOwoKaWYgKCEkY29weU9uV2luZG93cyAmJiBpc19saW5rKCRmaWxlKSkgewokdGhpcy0+c3ltbGluaygkZmlsZS0+Z2V0TGlua1RhcmdldCgpLCAkdGFyZ2V0KTsKfSBlbHNlaWYgKGlzX2RpcigkZmlsZSkpIHsKJHRoaXMtPm1rZGlyKCR0YXJnZXQpOwp9IGVsc2VpZiAoaXNfZmlsZSgkZmlsZSkpIHsKJHRoaXMtPmNvcHkoJGZpbGUsICR0YXJnZXQsICRvcHRpb25zWydvdmVycmlkZSddID8/IGZhbHNlKTsKfSBlbHNlIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ1VuYWJsZSB0byBndWVzcyAiJXMiIGZpbGUgdHlwZS4nLCAkZmlsZSksIDAsIG51bGwsICRmaWxlKTsKfQp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzQWJzb2x1dGVQYXRoKHN0cmluZyAkZmlsZSkKewpyZXR1cm4gJycgIT09ICRmaWxlICYmIChzdHJzcG4oJGZpbGUsICcvXFwnLCAwLCAxKQp8fCAoXHN0cmxlbigkZmlsZSkgPiAzICYmIGN0eXBlX2FscGhhKCRmaWxlWzBdKQomJiAnOicgPT09ICRmaWxlWzFdCiYmIHN0cnNwbigkZmlsZSwgJy9cXCcsIDIsIDEpCikKfHwgbnVsbCAhPT0gcGFyc2VfdXJsKCRmaWxlLCBcUEhQX1VSTF9TQ0hFTUUpCik7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0ZW1wbmFtKHN0cmluZyAkZGlyLCBzdHJpbmcgJHByZWZpeCkKewokc3VmZml4ID0gXGZ1bmNfbnVtX2FyZ3MoKSA+IDIgPyBmdW5jX2dldF9hcmcoMikgOiAnJzsKWyRzY2hlbWUsICRoaWVyYXJjaHldID0gJHRoaXMtPmdldFNjaGVtZUFuZEhpZXJhcmNoeSgkZGlyKTsKCgppZiAoKG51bGwgPT09ICRzY2hlbWUgfHwgJ2ZpbGUnID09PSAkc2NoZW1lIHx8ICdncycgPT09ICRzY2hlbWUpICYmICcnID09PSAkc3VmZml4KSB7CgppZiAoJHRtcEZpbGUgPSBzZWxmOjpib3goJ3RlbXBuYW0nLCAkaGllcmFyY2h5LCAkcHJlZml4KSkgewppZiAobnVsbCAhPT0gJHNjaGVtZSAmJiAnZ3MnICE9PSAkc2NoZW1lKSB7CnJldHVybiAkc2NoZW1lLic6Ly8nLiR0bXBGaWxlOwp9CgpyZXR1cm4gJHRtcEZpbGU7Cn0KCnRocm93IG5ldyBJT0V4Y2VwdGlvbignQSB0ZW1wb3JhcnkgZmlsZSBjb3VsZCBub3QgYmUgY3JlYXRlZDogJy5zZWxmOjokbGFzdEVycm9yKTsKfQoKCmZvciAoJGkgPSAwOyAkaSA8IDEwOyArKyRpKSB7CgokdG1wRmlsZSA9ICRkaXIuJy8nLiRwcmVmaXgudW5pcWlkKG10X3JhbmQoKSwgdHJ1ZSkuJHN1ZmZpeDsKCgoKaWYgKCEkaGFuZGxlID0gc2VsZjo6Ym94KCdmb3BlbicsICR0bXBGaWxlLCAneCsnKSkgewpjb250aW51ZTsKfQoKCnNlbGY6OmJveCgnZmNsb3NlJywgJGhhbmRsZSk7CgpyZXR1cm4gJHRtcEZpbGU7Cn0KCnRocm93IG5ldyBJT0V4Y2VwdGlvbignQSB0ZW1wb3JhcnkgZmlsZSBjb3VsZCBub3QgYmUgY3JlYXRlZDogJy5zZWxmOjokbGFzdEVycm9yKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkdW1wRmlsZShzdHJpbmcgJGZpbGVuYW1lLCAkY29udGVudCkKewppZiAoXGlzX2FycmF5KCRjb250ZW50KSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAyIHBhc3NlZCB0byAiJXMoKSIgbXVzdCBiZSBzdHJpbmcgb3IgcmVzb3VyY2UsIGFycmF5IGdpdmVuLicsIF9fTUVUSE9EX18pKTsKfQoKJGRpciA9IFxkaXJuYW1lKCRmaWxlbmFtZSk7CgppZiAoaXNfbGluaygkZmlsZW5hbWUpICYmICRsaW5rVGFyZ2V0ID0gJHRoaXMtPnJlYWRsaW5rKCRmaWxlbmFtZSkpIHsKJHRoaXMtPmR1bXBGaWxlKFBhdGg6Om1ha2VBYnNvbHV0ZSgkbGlua1RhcmdldCwgJGRpciksICRjb250ZW50KTsKCnJldHVybjsKfQoKaWYgKCFpc19kaXIoJGRpcikpIHsKJHRoaXMtPm1rZGlyKCRkaXIpOwp9CgoKCiR0bXBGaWxlID0gJHRoaXMtPnRlbXBuYW0oJGRpciwgYmFzZW5hbWUoJGZpbGVuYW1lKSk7Cgp0cnkgewppZiAoZmFsc2UgPT09IHNlbGY6OmJveCgnZmlsZV9wdXRfY29udGVudHMnLCAkdG1wRmlsZSwgJGNvbnRlbnQpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gd3JpdGUgZmlsZSAiJXMiOiAnLCAkZmlsZW5hbWUpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICRmaWxlbmFtZSk7Cn0KCnNlbGY6OmJveCgnY2htb2QnLCAkdG1wRmlsZSwgc2VsZjo6Ym94KCdmaWxlcGVybXMnLCAkZmlsZW5hbWUpID86IDA2NjYgJiB+dW1hc2soKSk7CgokdGhpcy0+cmVuYW1lKCR0bXBGaWxlLCAkZmlsZW5hbWUsIHRydWUpOwp9IGZpbmFsbHkgewppZiAoZmlsZV9leGlzdHMoJHRtcEZpbGUpKSB7CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiAmJiAhaXNfd3JpdGFibGUoJHRtcEZpbGUpKSB7CnNlbGY6OmJveCgnY2htb2QnLCAkdG1wRmlsZSwgc2VsZjo6Ym94KCdmaWxlcGVybXMnLCAkdG1wRmlsZSkgfCAwMjAwKTsKfQoKc2VsZjo6Ym94KCd1bmxpbmsnLCAkdG1wRmlsZSk7Cn0KfQp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhcHBlbmRUb0ZpbGUoc3RyaW5nICRmaWxlbmFtZSwgJGNvbnRlbnQpCnsKaWYgKFxpc19hcnJheSgkY29udGVudCkpIHsKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignQXJndW1lbnQgMiBwYXNzZWQgdG8gIiVzKCkiIG11c3QgYmUgc3RyaW5nIG9yIHJlc291cmNlLCBhcnJheSBnaXZlbi4nLCBfX01FVEhPRF9fKSk7Cn0KCiRkaXIgPSBcZGlybmFtZSgkZmlsZW5hbWUpOwoKaWYgKCFpc19kaXIoJGRpcikpIHsKJHRoaXMtPm1rZGlyKCRkaXIpOwp9CgokbG9jayA9IFxmdW5jX251bV9hcmdzKCkgPiAyICYmIGZ1bmNfZ2V0X2FyZygyKTsKCmlmIChmYWxzZSA9PT0gc2VsZjo6Ym94KCdmaWxlX3B1dF9jb250ZW50cycsICRmaWxlbmFtZSwgJGNvbnRlbnQsIFxGSUxFX0FQUEVORCB8ICgkbG9jayA/IFxMT0NLX0VYIDogMCkpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gd3JpdGUgZmlsZSAiJXMiOiAnLCAkZmlsZW5hbWUpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICRmaWxlbmFtZSk7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiB0b0l0ZXJhYmxlKCRmaWxlcyk6IGl0ZXJhYmxlCnsKcmV0dXJuIGlzX2l0ZXJhYmxlKCRmaWxlcykgPyAkZmlsZXMgOiBbJGZpbGVzXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRTY2hlbWVBbmRIaWVyYXJjaHkoc3RyaW5nICRmaWxlbmFtZSk6IGFycmF5CnsKJGNvbXBvbmVudHMgPSBleHBsb2RlKCc6Ly8nLCAkZmlsZW5hbWUsIDIpOwoKcmV0dXJuIDIgPT09IFxjb3VudCgkY29tcG9uZW50cykgPyBbJGNvbXBvbmVudHNbMF0sICRjb21wb25lbnRzWzFdXSA6IFtudWxsLCAkY29tcG9uZW50c1swXV07Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGFzc2VydEZ1bmN0aW9uRXhpc3RzKHN0cmluZyAkZnVuYyk6IHZvaWQKewppZiAoIVxmdW5jdGlvbl9leGlzdHMoJGZ1bmMpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdVbmFibGUgdG8gcGVyZm9ybSBmaWxlc3lzdGVtIG9wZXJhdGlvbiBiZWNhdXNlIHRoZSAiJXMoKSIgZnVuY3Rpb24gaGFzIGJlZW4gZGlzYWJsZWQuJywgJGZ1bmMpKTsKfQp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGJveChzdHJpbmcgJGZ1bmMsIC4uLiRhcmdzKQp7CnNlbGY6OmFzc2VydEZ1bmN0aW9uRXhpc3RzKCRmdW5jKTsKCnNlbGY6OiRsYXN0RXJyb3IgPSBudWxsOwpzZXRfZXJyb3JfaGFuZGxlcihfX0NMQVNTX18uJzo6aGFuZGxlRXJyb3InKTsKdHJ5IHsKcmV0dXJuICRmdW5jKC4uLiRhcmdzKTsKfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYW5kbGVFcnJvcihpbnQgJHR5cGUsIHN0cmluZyAkbXNnKQp7CnNlbGY6OiRsYXN0RXJyb3IgPSAkbXNnOwp9Cn0KCkNvcHlyaWdodCAoYykgMjAwNC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW07Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCgoKCgoKCgoKCgoKZmluYWwgY2xhc3MgUGF0aAp7CgoKCnByaXZhdGUgY29uc3QgQ0xFQU5VUF9USFJFU0hPTEQgPSAxMjUwOwoKCgoKcHJpdmF0ZSBjb25zdCBDTEVBTlVQX1NJWkUgPSAxMDAwOwoKCgoKCgpwcml2YXRlIHN0YXRpYyAkYnVmZmVyID0gW107CgoKCgpwcml2YXRlIHN0YXRpYyAkYnVmZmVyU2l6ZSA9IDA7CgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2Fub25pY2FsaXplKHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuICcnOwp9CgoKCgppZiAoaXNzZXQoc2VsZjo6JGJ1ZmZlclskcGF0aF0pKSB7CnJldHVybiBzZWxmOjokYnVmZmVyWyRwYXRoXTsKfQoKCmlmICgnficgPT09ICRwYXRoWzBdKSB7CiRwYXRoID0gc2VsZjo6Z2V0SG9tZURpcmVjdG9yeSgpLnN1YnN0cigkcGF0aCwgMSk7Cn0KCiRwYXRoID0gc2VsZjo6bm9ybWFsaXplKCRwYXRoKTsKClskcm9vdCwgJHBhdGhXaXRob3V0Um9vdF0gPSBzZWxmOjpzcGxpdCgkcGF0aCk7CgokY2Fub25pY2FsUGFydHMgPSBzZWxmOjpmaW5kQ2Fub25pY2FsUGFydHMoJHJvb3QsICRwYXRoV2l0aG91dFJvb3QpOwoKCnNlbGY6OiRidWZmZXJbJHBhdGhdID0gJGNhbm9uaWNhbFBhdGggPSAkcm9vdC5pbXBsb2RlKCcvJywgJGNhbm9uaWNhbFBhcnRzKTsKKytzZWxmOjokYnVmZmVyU2l6ZTsKCgppZiAoc2VsZjo6JGJ1ZmZlclNpemUgPiBzZWxmOjpDTEVBTlVQX1RIUkVTSE9MRCkgewpzZWxmOjokYnVmZmVyID0gXGFycmF5X3NsaWNlKHNlbGY6OiRidWZmZXIsIC1zZWxmOjpDTEVBTlVQX1NJWkUsIG51bGwsIHRydWUpOwpzZWxmOjokYnVmZmVyU2l6ZSA9IHNlbGY6OkNMRUFOVVBfU0laRTsKfQoKcmV0dXJuICRjYW5vbmljYWxQYXRoOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbm9ybWFsaXplKHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CnJldHVybiBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldERpcmVjdG9yeShzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewppZiAoJycgPT09ICRwYXRoKSB7CnJldHVybiAnJzsKfQoKJHBhdGggPSBzZWxmOjpjYW5vbmljYWxpemUoJHBhdGgpOwoKCmlmIChmYWxzZSAhPT0gJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uID0gc3RycG9zKCRwYXRoLCAnOi8vJykpIHsKJHNjaGVtZSA9IHN1YnN0cigkcGF0aCwgMCwgJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uICsgMyk7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKfSBlbHNlIHsKJHNjaGVtZSA9ICcnOwp9CgppZiAoZmFsc2UgPT09ICRkaXJTZXBhcmF0b3JQb3NpdGlvbiA9IHN0cnJwb3MoJHBhdGgsICcvJykpIHsKcmV0dXJuICcnOwp9CgoKaWYgKDAgPT09ICRkaXJTZXBhcmF0b3JQb3NpdGlvbikgewpyZXR1cm4gJHNjaGVtZS4nLyc7Cn0KCgppZiAoMiA9PT0gJGRpclNlcGFyYXRvclBvc2l0aW9uICYmIGN0eXBlX2FscGhhKCRwYXRoWzBdKSAmJiAnOicgPT09ICRwYXRoWzFdKSB7CnJldHVybiAkc2NoZW1lLnN1YnN0cigkcGF0aCwgMCwgMyk7Cn0KCnJldHVybiAkc2NoZW1lLnN1YnN0cigkcGF0aCwgMCwgJGRpclNlcGFyYXRvclBvc2l0aW9uKTsKfQoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEhvbWVEaXJlY3RvcnkoKTogc3RyaW5nCnsKCmlmIChnZXRlbnYoJ0hPTUUnKSkgewpyZXR1cm4gc2VsZjo6Y2Fub25pY2FsaXplKGdldGVudignSE9NRScpKTsKfQoKCmlmIChnZXRlbnYoJ0hPTUVEUklWRScpICYmIGdldGVudignSE9NRVBBVEgnKSkgewpyZXR1cm4gc2VsZjo6Y2Fub25pY2FsaXplKGdldGVudignSE9NRURSSVZFJykuZ2V0ZW52KCdIT01FUEFUSCcpKTsKfQoKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHRoZSBob21lIGRpcmVjdG9yeSBwYXRoOiBZb3VyIGVudmlyb25tZW50IG9yIG9wZXJhdGluZyBzeXN0ZW0gaXNuJ3Qgc3VwcG9ydGVkLiIpOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Um9vdChzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewppZiAoJycgPT09ICRwYXRoKSB7CnJldHVybiAnJzsKfQoKCmlmIChmYWxzZSAhPT0gJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uID0gc3RycG9zKCRwYXRoLCAnOi8vJykpIHsKJHNjaGVtZSA9IHN1YnN0cigkcGF0aCwgMCwgJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uICsgMyk7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKfSBlbHNlIHsKJHNjaGVtZSA9ICcnOwp9CgokZmlyc3RDaGFyYWN0ZXIgPSAkcGF0aFswXTsKCgppZiAoJy8nID09PSAkZmlyc3RDaGFyYWN0ZXIgfHwgJ1xcJyA9PT0gJGZpcnN0Q2hhcmFjdGVyKSB7CnJldHVybiAkc2NoZW1lLicvJzsKfQoKJGxlbmd0aCA9IFxzdHJsZW4oJHBhdGgpOwoKCmlmICgkbGVuZ3RoID4gMSAmJiAnOicgPT09ICRwYXRoWzFdICYmIGN0eXBlX2FscGhhKCRmaXJzdENoYXJhY3RlcikpIHsKCmlmICgyID09PSAkbGVuZ3RoKSB7CnJldHVybiAkc2NoZW1lLiRwYXRoLicvJzsKfQoKCmlmICgnLycgPT09ICRwYXRoWzJdIHx8ICdcXCcgPT09ICRwYXRoWzJdKSB7CnJldHVybiAkc2NoZW1lLiRmaXJzdENoYXJhY3Rlci4kcGF0aFsxXS4nLyc7Cn0KfQoKcmV0dXJuICcnOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZpbGVuYW1lV2l0aG91dEV4dGVuc2lvbihzdHJpbmcgJHBhdGgsID9zdHJpbmcgJGV4dGVuc2lvbiA9IG51bGwpOiBzdHJpbmcKewppZiAoJycgPT09ICRwYXRoKSB7CnJldHVybiAnJzsKfQoKaWYgKG51bGwgIT09ICRleHRlbnNpb24pIHsKCnJldHVybiBydHJpbShiYXNlbmFtZSgkcGF0aCwgJGV4dGVuc2lvbiksICcuJyk7Cn0KCnJldHVybiBwYXRoaW5mbygkcGF0aCwgXFBBVEhJTkZPX0ZJTEVOQU1FKTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEV4dGVuc2lvbihzdHJpbmcgJHBhdGgsIGJvb2wgJGZvcmNlTG93ZXJDYXNlID0gZmFsc2UpOiBzdHJpbmcKewppZiAoJycgPT09ICRwYXRoKSB7CnJldHVybiAnJzsKfQoKJGV4dGVuc2lvbiA9IHBhdGhpbmZvKCRwYXRoLCBcUEFUSElORk9fRVhURU5TSU9OKTsKCmlmICgkZm9yY2VMb3dlckNhc2UpIHsKJGV4dGVuc2lvbiA9IHNlbGY6OnRvTG93ZXIoJGV4dGVuc2lvbik7Cn0KCnJldHVybiAkZXh0ZW5zaW9uOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGFzRXh0ZW5zaW9uKHN0cmluZyAkcGF0aCwgJGV4dGVuc2lvbnMgPSBudWxsLCBib29sICRpZ25vcmVDYXNlID0gZmFsc2UpOiBib29sCnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gZmFsc2U7Cn0KCiRhY3R1YWxFeHRlbnNpb24gPSBzZWxmOjpnZXRFeHRlbnNpb24oJHBhdGgsICRpZ25vcmVDYXNlKTsKCgppZiAoW10gPT09ICRleHRlbnNpb25zIHx8IG51bGwgPT09ICRleHRlbnNpb25zKSB7CnJldHVybiAnJyAhPT0gJGFjdHVhbEV4dGVuc2lvbjsKfQoKaWYgKFxpc19zdHJpbmcoJGV4dGVuc2lvbnMpKSB7CiRleHRlbnNpb25zID0gWyRleHRlbnNpb25zXTsKfQoKZm9yZWFjaCAoJGV4dGVuc2lvbnMgYXMgJGtleSA9PiAkZXh0ZW5zaW9uKSB7CmlmICgkaWdub3JlQ2FzZSkgewokZXh0ZW5zaW9uID0gc2VsZjo6dG9Mb3dlcigkZXh0ZW5zaW9uKTsKfQoKCiRleHRlbnNpb25zWyRrZXldID0gbHRyaW0oJGV4dGVuc2lvbiwgJy4nKTsKfQoKcmV0dXJuIFxpbl9hcnJheSgkYWN0dWFsRXh0ZW5zaW9uLCAkZXh0ZW5zaW9ucywgdHJ1ZSk7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGFuZ2VFeHRlbnNpb24oc3RyaW5nICRwYXRoLCBzdHJpbmcgJGV4dGVuc2lvbik6IHN0cmluZwp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuICcnOwp9CgokYWN0dWFsRXh0ZW5zaW9uID0gc2VsZjo6Z2V0RXh0ZW5zaW9uKCRwYXRoKTsKJGV4dGVuc2lvbiA9IGx0cmltKCRleHRlbnNpb24sICcuJyk7CgoKaWYgKCcvJyA9PT0gc3Vic3RyKCRwYXRoLCAtMSkpIHsKcmV0dXJuICRwYXRoOwp9CgoKaWYgKGVtcHR5KCRhY3R1YWxFeHRlbnNpb24pKSB7CnJldHVybiAkcGF0aC4oJy4nID09PSBzdWJzdHIoJHBhdGgsIC0xKSA/ICcnIDogJy4nKS4kZXh0ZW5zaW9uOwp9CgpyZXR1cm4gc3Vic3RyKCRwYXRoLCAwLCAtXHN0cmxlbigkYWN0dWFsRXh0ZW5zaW9uKSkuJGV4dGVuc2lvbjsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0Fic29sdXRlKHN0cmluZyAkcGF0aCk6IGJvb2wKewppZiAoJycgPT09ICRwYXRoKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmIChmYWxzZSAhPT0gKCRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiA9IHN0cnBvcygkcGF0aCwgJzovLycpKSAmJiAxICE9PSAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24pIHsKJHBhdGggPSBzdWJzdHIoJHBhdGgsICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiArIDMpOwp9CgokZmlyc3RDaGFyYWN0ZXIgPSAkcGF0aFswXTsKCgppZiAoJy8nID09PSAkZmlyc3RDaGFyYWN0ZXIgfHwgJ1xcJyA9PT0gJGZpcnN0Q2hhcmFjdGVyKSB7CnJldHVybiB0cnVlOwp9CgoKaWYgKFxzdHJsZW4oJHBhdGgpID4gMSAmJiBjdHlwZV9hbHBoYSgkZmlyc3RDaGFyYWN0ZXIpICYmICc6JyA9PT0gJHBhdGhbMV0pIHsKCmlmICgyID09PSBcc3RybGVuKCRwYXRoKSkgewpyZXR1cm4gdHJ1ZTsKfQoKCmlmICgnLycgPT09ICRwYXRoWzJdIHx8ICdcXCcgPT09ICRwYXRoWzJdKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1JlbGF0aXZlKHN0cmluZyAkcGF0aCk6IGJvb2wKewpyZXR1cm4gIXNlbGY6OmlzQWJzb2x1dGUoJHBhdGgpOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYWtlQWJzb2x1dGUoc3RyaW5nICRwYXRoLCBzdHJpbmcgJGJhc2VQYXRoKTogc3RyaW5nCnsKaWYgKCcnID09PSAkYmFzZVBhdGgpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgYmFzZSBwYXRoIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLiBHb3Q6ICIlcyIuJywgJGJhc2VQYXRoKSk7Cn0KCmlmICghc2VsZjo6aXNBYnNvbHV0ZSgkYmFzZVBhdGgpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIGJhc2UgcGF0aCAiJXMiIGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoLicsICRiYXNlUGF0aCkpOwp9CgppZiAoc2VsZjo6aXNBYnNvbHV0ZSgkcGF0aCkpIHsKcmV0dXJuIHNlbGY6OmNhbm9uaWNhbGl6ZSgkcGF0aCk7Cn0KCmlmIChmYWxzZSAhPT0gJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uID0gc3RycG9zKCRiYXNlUGF0aCwgJzovLycpKSB7CiRzY2hlbWUgPSBzdWJzdHIoJGJhc2VQYXRoLCAwLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKJGJhc2VQYXRoID0gc3Vic3RyKCRiYXNlUGF0aCwgJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uICsgMyk7Cn0gZWxzZSB7CiRzY2hlbWUgPSAnJzsKfQoKcmV0dXJuICRzY2hlbWUuc2VsZjo6Y2Fub25pY2FsaXplKHJ0cmltKCRiYXNlUGF0aCwgJy9cXCcpLicvJy4kcGF0aCk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYWtlUmVsYXRpdmUoc3RyaW5nICRwYXRoLCBzdHJpbmcgJGJhc2VQYXRoKTogc3RyaW5nCnsKJHBhdGggPSBzZWxmOjpjYW5vbmljYWxpemUoJHBhdGgpOwokYmFzZVBhdGggPSBzZWxmOjpjYW5vbmljYWxpemUoJGJhc2VQYXRoKTsKClskcm9vdCwgJHJlbGF0aXZlUGF0aF0gPSBzZWxmOjpzcGxpdCgkcGF0aCk7ClskYmFzZVJvb3QsICRyZWxhdGl2ZUJhc2VQYXRoXSA9IHNlbGY6OnNwbGl0KCRiYXNlUGF0aCk7CgoKCgppZiAoJycgPT09ICRyb290ICYmICcnICE9PSAkYmFzZVJvb3QpIHsKCmlmICgnJyA9PT0gJHJlbGF0aXZlQmFzZVBhdGgpIHsKJHJlbGF0aXZlUGF0aCA9IGx0cmltKCRyZWxhdGl2ZVBhdGgsICcuL1xcJyk7Cn0KCnJldHVybiAkcmVsYXRpdmVQYXRoOwp9CgoKCmlmICgnJyAhPT0gJHJvb3QgJiYgJycgPT09ICRiYXNlUm9vdCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBhYnNvbHV0ZSBwYXRoICIlcyIgY2Fubm90IGJlIG1hZGUgcmVsYXRpdmUgdG8gdGhlIHJlbGF0aXZlIHBhdGggIiVzIi4gWW91IHNob3VsZCBwcm92aWRlIGFuIGFic29sdXRlIGJhc2UgcGF0aCBpbnN0ZWFkLicsICRwYXRoLCAkYmFzZVBhdGgpKTsKfQoKCmlmICgkYmFzZVJvb3QgJiYgJHJvb3QgIT09ICRiYXNlUm9vdCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBwYXRoICIlcyIgY2Fubm90IGJlIG1hZGUgcmVsYXRpdmUgdG8gIiVzIiwgYmVjYXVzZSB0aGV5IGhhdmUgZGlmZmVyZW50IHJvb3RzICgiJXMiIGFuZCAiJXMiKS4nLCAkcGF0aCwgJGJhc2VQYXRoLCAkcm9vdCwgJGJhc2VSb290KSk7Cn0KCmlmICgnJyA9PT0gJHJlbGF0aXZlQmFzZVBhdGgpIHsKcmV0dXJuICRyZWxhdGl2ZVBhdGg7Cn0KCgokcGFydHMgPSBleHBsb2RlKCcvJywgJHJlbGF0aXZlUGF0aCk7CiRiYXNlUGFydHMgPSBleHBsb2RlKCcvJywgJHJlbGF0aXZlQmFzZVBhdGgpOwokZG90RG90UHJlZml4ID0gJyc7CgoKCiRtYXRjaCA9IHRydWU7Cgpmb3JlYWNoICgkYmFzZVBhcnRzIGFzICRpbmRleCA9PiAkYmFzZVBhcnQpIHsKaWYgKCRtYXRjaCAmJiBpc3NldCgkcGFydHNbJGluZGV4XSkgJiYgJGJhc2VQYXJ0ID09PSAkcGFydHNbJGluZGV4XSkgewp1bnNldCgkcGFydHNbJGluZGV4XSk7Cgpjb250aW51ZTsKfQoKJG1hdGNoID0gZmFsc2U7CiRkb3REb3RQcmVmaXggLj0gJy4uLyc7Cn0KCnJldHVybiBydHJpbSgkZG90RG90UHJlZml4LmltcGxvZGUoJy8nLCAkcGFydHMpLCAnLycpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTG9jYWwoc3RyaW5nICRwYXRoKTogYm9vbAp7CnJldHVybiAnJyAhPT0gJHBhdGggJiYgZmFsc2UgPT09IHN0cnBvcygkcGF0aCwgJzovLycpOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldExvbmdlc3RDb21tb25CYXNlUGF0aChzdHJpbmcgLi4uJHBhdGhzKTogP3N0cmluZwp7ClskYnBSb290LCAkYmFzZVBhdGhdID0gc2VsZjo6c3BsaXQoc2VsZjo6Y2Fub25pY2FsaXplKHJlc2V0KCRwYXRocykpKTsKCmZvciAobmV4dCgkcGF0aHMpOyBudWxsICE9PSBrZXkoJHBhdGhzKSAmJiAnJyAhPT0gJGJhc2VQYXRoOyBuZXh0KCRwYXRocykpIHsKWyRyb290LCAkcGF0aF0gPSBzZWxmOjpzcGxpdChzZWxmOjpjYW5vbmljYWxpemUoY3VycmVudCgkcGF0aHMpKSk7CgoKCmlmICgkcm9vdCAhPT0gJGJwUm9vdCkgewpyZXR1cm4gbnVsbDsKfQoKCndoaWxlICh0cnVlKSB7CmlmICgnLicgPT09ICRiYXNlUGF0aCkgewoKJGJhc2VQYXRoID0gJyc7CgoKY29udGludWUgMjsKfQoKCgppZiAoMCA9PT0gc3RycG9zKCRwYXRoLicvJywgJGJhc2VQYXRoLicvJykpIHsKCmNvbnRpbnVlIDI7Cn0KCiRiYXNlUGF0aCA9IFxkaXJuYW1lKCRiYXNlUGF0aCk7Cn0KfQoKcmV0dXJuICRicFJvb3QuJGJhc2VQYXRoOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGpvaW4oc3RyaW5nIC4uLiRwYXRocyk6IHN0cmluZwp7CiRmaW5hbFBhdGggPSBudWxsOwokd2FzU2NoZW1lID0gZmFsc2U7Cgpmb3JlYWNoICgkcGF0aHMgYXMgJHBhdGgpIHsKaWYgKCcnID09PSAkcGF0aCkgewpjb250aW51ZTsKfQoKaWYgKG51bGwgPT09ICRmaW5hbFBhdGgpIHsKCiRmaW5hbFBhdGggPSAkcGF0aDsKJHdhc1NjaGVtZSA9IChmYWxzZSAhPT0gc3RycG9zKCRwYXRoLCAnOi8vJykpOwpjb250aW51ZTsKfQoKCmlmICghXGluX2FycmF5KHN1YnN0cigkZmluYWxQYXRoLCAtMSksIFsnLycsICdcXCddKSkgewokZmluYWxQYXRoIC49ICcvJzsKfQoKCiRmaW5hbFBhdGggLj0gJHdhc1NjaGVtZSA/ICRwYXRoIDogbHRyaW0oJHBhdGgsICcvJyk7CiR3YXNTY2hlbWUgPSBmYWxzZTsKfQoKaWYgKG51bGwgPT09ICRmaW5hbFBhdGgpIHsKcmV0dXJuICcnOwp9CgpyZXR1cm4gc2VsZjo6Y2Fub25pY2FsaXplKCRmaW5hbFBhdGgpOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNCYXNlUGF0aChzdHJpbmcgJGJhc2VQYXRoLCBzdHJpbmcgJG9mUGF0aCk6IGJvb2wKewokYmFzZVBhdGggPSBzZWxmOjpjYW5vbmljYWxpemUoJGJhc2VQYXRoKTsKJG9mUGF0aCA9IHNlbGY6OmNhbm9uaWNhbGl6ZSgkb2ZQYXRoKTsKCgoKCgoKcmV0dXJuIDAgPT09IHN0cnBvcygkb2ZQYXRoLicvJywgcnRyaW0oJGJhc2VQYXRoLCAnLycpLicvJyk7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZpbmRDYW5vbmljYWxQYXJ0cyhzdHJpbmcgJHJvb3QsIHN0cmluZyAkcGF0aFdpdGhvdXRSb290KTogYXJyYXkKewokcGFydHMgPSBleHBsb2RlKCcvJywgJHBhdGhXaXRob3V0Um9vdCk7CgokY2Fub25pY2FsUGFydHMgPSBbXTsKCgpmb3JlYWNoICgkcGFydHMgYXMgJHBhcnQpIHsKaWYgKCcuJyA9PT0gJHBhcnQgfHwgJycgPT09ICRwYXJ0KSB7CmNvbnRpbnVlOwp9CgoKCmlmICgnLi4nID09PSAkcGFydCAmJiBcY291bnQoJGNhbm9uaWNhbFBhcnRzKSA+IDAgJiYgJy4uJyAhPT0gJGNhbm9uaWNhbFBhcnRzW1xjb3VudCgkY2Fub25pY2FsUGFydHMpIC0gMV0pIHsKYXJyYXlfcG9wKCRjYW5vbmljYWxQYXJ0cyk7Cgpjb250aW51ZTsKfQoKCmlmICgnLi4nICE9PSAkcGFydCB8fCAnJyA9PT0gJHJvb3QpIHsKJGNhbm9uaWNhbFBhcnRzW10gPSAkcGFydDsKfQp9CgpyZXR1cm4gJGNhbm9uaWNhbFBhcnRzOwp9CgoKCgoKCgoKCgoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHNwbGl0KHN0cmluZyAkcGF0aCk6IGFycmF5CnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gWycnLCAnJ107Cn0KCgppZiAoZmFsc2UgIT09ICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiA9IHN0cnBvcygkcGF0aCwgJzovLycpKSB7CiRyb290ID0gc3Vic3RyKCRwYXRoLCAwLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKJHBhdGggPSBzdWJzdHIoJHBhdGgsICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiArIDMpOwp9IGVsc2Ugewokcm9vdCA9ICcnOwp9CgokbGVuZ3RoID0gXHN0cmxlbigkcGF0aCk7CgoKaWYgKDAgPT09IHN0cnBvcygkcGF0aCwgJy8nKSkgewokcm9vdCAuPSAnLyc7CiRwYXRoID0gJGxlbmd0aCA+IDEgPyBzdWJzdHIoJHBhdGgsIDEpIDogJyc7Cn0gZWxzZWlmICgkbGVuZ3RoID4gMSAmJiBjdHlwZV9hbHBoYSgkcGF0aFswXSkgJiYgJzonID09PSAkcGF0aFsxXSkgewppZiAoMiA9PT0gJGxlbmd0aCkgewoKJHJvb3QgLj0gJHBhdGguJy8nOwokcGF0aCA9ICcnOwp9IGVsc2VpZiAoJy8nID09PSAkcGF0aFsyXSkgewoKJHJvb3QgLj0gc3Vic3RyKCRwYXRoLCAwLCAzKTsKJHBhdGggPSAkbGVuZ3RoID4gMyA/IHN1YnN0cigkcGF0aCwgMykgOiAnJzsKfQp9CgpyZXR1cm4gWyRyb290LCAkcGF0aF07Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHRvTG93ZXIoc3RyaW5nICRzdHJpbmcpOiBzdHJpbmcKewppZiAoZmFsc2UgIT09ICRlbmNvZGluZyA9IG1iX2RldGVjdF9lbmNvZGluZygkc3RyaW5nLCBudWxsLCB0cnVlKSkgewpyZXR1cm4gbWJfc3RydG9sb3dlcigkc3RyaW5nLCAkZW5jb2RpbmcpOwp9CgpyZXR1cm4gc3RydG9sb3dlcigkc3RyaW5nKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXENvbXBhcmF0b3I7CgoKCgpjbGFzcyBDb21wYXJhdG9yCnsKcHJpdmF0ZSAkdGFyZ2V0Owpwcml2YXRlICRvcGVyYXRvciA9ICc9PSc7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP3N0cmluZyAkdGFyZ2V0ID0gbnVsbCwgc3RyaW5nICRvcGVyYXRvciA9ICc9PScpCnsKaWYgKG51bGwgPT09ICR0YXJnZXQpIHsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9maW5kZXInLCAnNS40JywgJ0NvbnN0cnVjdGluZyBhICIlcyIgd2l0aG91dCBzZXR0aW5nICIkdGFyZ2V0IiBpcyBkZXByZWNhdGVkLicsIF9fQ0xBU1NfXyk7Cn0KCiR0aGlzLT50YXJnZXQgPSAkdGFyZ2V0OwokdGhpcy0+ZG9TZXRPcGVyYXRvcigkb3BlcmF0b3IpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYXJnZXQoKQp7CmlmIChudWxsID09PSAkdGhpcy0+dGFyZ2V0KSB7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvZmluZGVyJywgJzUuNCcsICdDYWxsaW5nICIlcyIgd2l0aG91dCBpbml0aWFsaXppbmcgdGhlIHRhcmdldCBpcyBkZXByZWNhdGVkLicsIF9fTUVUSE9EX18pOwp9CgpyZXR1cm4gJHRoaXMtPnRhcmdldDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFRhcmdldChzdHJpbmcgJHRhcmdldCkKewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2ZpbmRlcicsICc1LjQnLCAnIiVzIiBpcyBkZXByZWNhdGVkLiBTZXQgdGhlIHRhcmdldCB2aWEgdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuJywgX19NRVRIT0RfXyk7CgokdGhpcy0+dGFyZ2V0ID0gJHRhcmdldDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3BlcmF0b3IoKQp7CnJldHVybiAkdGhpcy0+b3BlcmF0b3I7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3BlcmF0b3Ioc3RyaW5nICRvcGVyYXRvcikKewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2ZpbmRlcicsICc1LjQnLCAnIiVzIiBpcyBkZXByZWNhdGVkLiBTZXQgdGhlIG9wZXJhdG9yIHZpYSB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC4nLCBfX01FVEhPRF9fKTsKCiR0aGlzLT5kb1NldE9wZXJhdG9yKCcnID09PSAkb3BlcmF0b3IgPyAnPT0nIDogJG9wZXJhdG9yKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0ZXN0KCR0ZXN0KQp7CmlmIChudWxsID09PSAkdGhpcy0+dGFyZ2V0KSB7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvZmluZGVyJywgJzUuNCcsICdDYWxsaW5nICIlcyIgd2l0aG91dCBpbml0aWFsaXppbmcgdGhlIHRhcmdldCBpcyBkZXByZWNhdGVkLicsIF9fTUVUSE9EX18pOwp9Cgpzd2l0Y2ggKCR0aGlzLT5vcGVyYXRvcikgewpjYXNlICc+JzoKcmV0dXJuICR0ZXN0ID4gJHRoaXMtPnRhcmdldDsKY2FzZSAnPj0nOgpyZXR1cm4gJHRlc3QgPj0gJHRoaXMtPnRhcmdldDsKY2FzZSAnPCc6CnJldHVybiAkdGVzdCA8ICR0aGlzLT50YXJnZXQ7CmNhc2UgJzw9JzoKcmV0dXJuICR0ZXN0IDw9ICR0aGlzLT50YXJnZXQ7CmNhc2UgJyE9JzoKcmV0dXJuICR0ZXN0ICE9ICR0aGlzLT50YXJnZXQ7Cn0KCnJldHVybiAkdGVzdCA9PSAkdGhpcy0+dGFyZ2V0Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRvU2V0T3BlcmF0b3Ioc3RyaW5nICRvcGVyYXRvcik6IHZvaWQKewppZiAoIVxpbl9hcnJheSgkb3BlcmF0b3IsIFsnPicsICc8JywgJz49JywgJzw9JywgJz09JywgJyE9J10pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgb3BlcmF0b3IgIiVzIi4nLCAkb3BlcmF0b3IpKTsKfQoKJHRoaXMtPm9wZXJhdG9yID0gJG9wZXJhdG9yOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcQ29tcGFyYXRvcjsKCgoKCgoKY2xhc3MgRGF0ZUNvbXBhcmF0b3IgZXh0ZW5kcyBDb21wYXJhdG9yCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICR0ZXN0KQp7CmlmICghcHJlZ19tYXRjaCgnI15ccyooPT18IT18Wzw+XT0/fGFmdGVyfHNpbmNlfGJlZm9yZXx1bnRpbCk/XHMqKC4rPylccyokI2knLCAkdGVzdCwgJG1hdGNoZXMpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0RvblwndCB1bmRlcnN0YW5kICIlcyIgYXMgYSBkYXRlIHRlc3QuJywgJHRlc3QpKTsKfQoKdHJ5IHsKJGRhdGUgPSBuZXcgXERhdGVUaW1lKCRtYXRjaGVzWzJdKTsKJHRhcmdldCA9ICRkYXRlLT5mb3JtYXQoJ1UnKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCciJXMiIGlzIG5vdCBhIHZhbGlkIGRhdGUuJywgJG1hdGNoZXNbMl0pKTsKfQoKJG9wZXJhdG9yID0gJG1hdGNoZXNbMV0gPz8gJz09JzsKaWYgKCdzaW5jZScgPT09ICRvcGVyYXRvciB8fCAnYWZ0ZXInID09PSAkb3BlcmF0b3IpIHsKJG9wZXJhdG9yID0gJz4nOwp9CgppZiAoJ3VudGlsJyA9PT0gJG9wZXJhdG9yIHx8ICdiZWZvcmUnID09PSAkb3BlcmF0b3IpIHsKJG9wZXJhdG9yID0gJzwnOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCR0YXJnZXQsICRvcGVyYXRvcik7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxDb21wYXJhdG9yOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgTnVtYmVyQ29tcGFyYXRvciBleHRlbmRzIENvbXBhcmF0b3IKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/c3RyaW5nICR0ZXN0KQp7CmlmIChudWxsID09PSAkdGVzdCB8fCAhcHJlZ19tYXRjaCgnI15ccyooPT18IT18Wzw+XT0/KT9ccyooWzAtOVwuXSspXHMqKFtrbWddaT8pP1xzKiQjaScsICR0ZXN0LCAkbWF0Y2hlcykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignRG9uXCd0IHVuZGVyc3RhbmQgIiVzIiBhcyBhIG51bWJlciB0ZXN0LicsICR0ZXN0ID8/ICdudWxsJykpOwp9CgokdGFyZ2V0ID0gJG1hdGNoZXNbMl07CmlmICghaXNfbnVtZXJpYygkdGFyZ2V0KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdJbnZhbGlkIG51bWJlciAiJXMiLicsICR0YXJnZXQpKTsKfQppZiAoaXNzZXQoJG1hdGNoZXNbM10pKSB7Cgpzd2l0Y2ggKHN0cnRvbG93ZXIoJG1hdGNoZXNbM10pKSB7CmNhc2UgJ2snOgokdGFyZ2V0ICo9IDEwMDA7CmJyZWFrOwpjYXNlICdraSc6CiR0YXJnZXQgKj0gMTAyNDsKYnJlYWs7CmNhc2UgJ20nOgokdGFyZ2V0ICo9IDEwMDAwMDA7CmJyZWFrOwpjYXNlICdtaSc6CiR0YXJnZXQgKj0gMTAyNCAqIDEwMjQ7CmJyZWFrOwpjYXNlICdnJzoKJHRhcmdldCAqPSAxMDAwMDAwMDAwOwpicmVhazsKY2FzZSAnZ2knOgokdGFyZ2V0ICo9IDEwMjQgKiAxMDI0ICogMTAyNDsKYnJlYWs7Cn0KfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkdGFyZ2V0LCAkbWF0Y2hlc1sxXSA/OiAnPT0nKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEFjY2Vzc0RlbmllZEV4Y2VwdGlvbiBleHRlbmRzIFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24Kewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIERpcmVjdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXENvbXBhcmF0b3JcRGF0ZUNvbXBhcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcQ29tcGFyYXRvclxOdW1iZXJDb21wYXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEV4Y2VwdGlvblxEaXJlY3RvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxDdXN0b21GaWx0ZXJJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxEYXRlUmFuZ2VGaWx0ZXJJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxEZXB0aFJhbmdlRmlsdGVySXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcRXhjbHVkZURpcmVjdG9yeUZpbHRlckl0ZXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yXEZpbGVjb250ZW50RmlsdGVySXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcRmlsZW5hbWVGaWx0ZXJJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxMYXp5SXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcU2l6ZVJhbmdlRmlsdGVySXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcU29ydGFibGVJdGVyYXRvcjsKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIEZpbmRlciBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZSwgXENvdW50YWJsZQp7CnB1YmxpYyBjb25zdCBJR05PUkVfVkNTX0ZJTEVTID0gMTsKcHVibGljIGNvbnN0IElHTk9SRV9ET1RfRklMRVMgPSAyOwpwdWJsaWMgY29uc3QgSUdOT1JFX1ZDU19JR05PUkVEX0ZJTEVTID0gNDsKCnByaXZhdGUgJG1vZGUgPSAwOwpwcml2YXRlICRuYW1lcyA9IFtdOwpwcml2YXRlICRub3ROYW1lcyA9IFtdOwpwcml2YXRlICRleGNsdWRlID0gW107CnByaXZhdGUgJGZpbHRlcnMgPSBbXTsKcHJpdmF0ZSAkZGVwdGhzID0gW107CnByaXZhdGUgJHNpemVzID0gW107CnByaXZhdGUgJGZvbGxvd0xpbmtzID0gZmFsc2U7CnByaXZhdGUgJHJldmVyc2VTb3J0aW5nID0gZmFsc2U7CnByaXZhdGUgJHNvcnQgPSBmYWxzZTsKcHJpdmF0ZSAkaWdub3JlID0gMDsKcHJpdmF0ZSAkZGlycyA9IFtdOwpwcml2YXRlICRkYXRlcyA9IFtdOwpwcml2YXRlICRpdGVyYXRvcnMgPSBbXTsKcHJpdmF0ZSAkY29udGFpbnMgPSBbXTsKcHJpdmF0ZSAkbm90Q29udGFpbnMgPSBbXTsKcHJpdmF0ZSAkcGF0aHMgPSBbXTsKcHJpdmF0ZSAkbm90UGF0aHMgPSBbXTsKcHJpdmF0ZSAkaWdub3JlVW5yZWFkYWJsZURpcnMgPSBmYWxzZTsKCnByaXZhdGUgc3RhdGljICR2Y3NQYXR0ZXJucyA9IFsnLnN2bicsICdfc3ZuJywgJ0NWUycsICdfZGFyY3MnLCAnLmFyY2gtcGFyYW1zJywgJy5tb25vdG9uZScsICcuYnpyJywgJy5naXQnLCAnLmhnJ107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CiR0aGlzLT5pZ25vcmUgPSBzdGF0aWM6OklHTk9SRV9WQ1NfRklMRVMgfCBzdGF0aWM6OklHTk9SRV9ET1RfRklMRVM7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoKQp7CnJldHVybiBuZXcgc3RhdGljKCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRpcmVjdG9yaWVzKCkKewokdGhpcy0+bW9kZSA9IEl0ZXJhdG9yXEZpbGVUeXBlRmlsdGVySXRlcmF0b3I6Ok9OTFlfRElSRUNUT1JJRVM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbGVzKCkKewokdGhpcy0+bW9kZSA9IEl0ZXJhdG9yXEZpbGVUeXBlRmlsdGVySXRlcmF0b3I6Ok9OTFlfRklMRVM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVwdGgoJGxldmVscykKewpmb3JlYWNoICgoYXJyYXkpICRsZXZlbHMgYXMgJGxldmVsKSB7CiR0aGlzLT5kZXB0aHNbXSA9IG5ldyBDb21wYXJhdG9yXE51bWJlckNvbXBhcmF0b3IoJGxldmVsKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRhdGUoJGRhdGVzKQp7CmZvcmVhY2ggKChhcnJheSkgJGRhdGVzIGFzICRkYXRlKSB7CiR0aGlzLT5kYXRlc1tdID0gbmV3IENvbXBhcmF0b3JcRGF0ZUNvbXBhcmF0b3IoJGRhdGUpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbmFtZSgkcGF0dGVybnMpCnsKJHRoaXMtPm5hbWVzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm5hbWVzLCAoYXJyYXkpICRwYXR0ZXJucyk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3ROYW1lKCRwYXR0ZXJucykKewokdGhpcy0+bm90TmFtZXMgPSBhcnJheV9tZXJnZSgkdGhpcy0+bm90TmFtZXMsIChhcnJheSkgJHBhdHRlcm5zKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zKCRwYXR0ZXJucykKewokdGhpcy0+Y29udGFpbnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+Y29udGFpbnMsIChhcnJheSkgJHBhdHRlcm5zKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdENvbnRhaW5zKCRwYXR0ZXJucykKewokdGhpcy0+bm90Q29udGFpbnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+bm90Q29udGFpbnMsIChhcnJheSkgJHBhdHRlcm5zKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGF0aCgkcGF0dGVybnMpCnsKJHRoaXMtPnBhdGhzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPnBhdGhzLCAoYXJyYXkpICRwYXR0ZXJucyk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdFBhdGgoJHBhdHRlcm5zKQp7CiR0aGlzLT5ub3RQYXRocyA9IGFycmF5X21lcmdlKCR0aGlzLT5ub3RQYXRocywgKGFycmF5KSAkcGF0dGVybnMpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2l6ZSgkc2l6ZXMpCnsKZm9yZWFjaCAoKGFycmF5KSAkc2l6ZXMgYXMgJHNpemUpIHsKJHRoaXMtPnNpemVzW10gPSBuZXcgQ29tcGFyYXRvclxOdW1iZXJDb21wYXJhdG9yKCRzaXplKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGV4Y2x1ZGUoJGRpcnMpCnsKJHRoaXMtPmV4Y2x1ZGUgPSBhcnJheV9tZXJnZSgkdGhpcy0+ZXhjbHVkZSwgKGFycmF5KSAkZGlycyk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpZ25vcmVEb3RGaWxlcyhib29sICRpZ25vcmVEb3RGaWxlcykKewppZiAoJGlnbm9yZURvdEZpbGVzKSB7CiR0aGlzLT5pZ25vcmUgfD0gc3RhdGljOjpJR05PUkVfRE9UX0ZJTEVTOwp9IGVsc2UgewokdGhpcy0+aWdub3JlICY9IH5zdGF0aWM6OklHTk9SRV9ET1RfRklMRVM7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlnbm9yZVZDUyhib29sICRpZ25vcmVWQ1MpCnsKaWYgKCRpZ25vcmVWQ1MpIHsKJHRoaXMtPmlnbm9yZSB8PSBzdGF0aWM6OklHTk9SRV9WQ1NfRklMRVM7Cn0gZWxzZSB7CiR0aGlzLT5pZ25vcmUgJj0gfnN0YXRpYzo6SUdOT1JFX1ZDU19GSUxFUzsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlnbm9yZVZDU0lnbm9yZWQoYm9vbCAkaWdub3JlVkNTSWdub3JlZCkKewppZiAoJGlnbm9yZVZDU0lnbm9yZWQpIHsKJHRoaXMtPmlnbm9yZSB8PSBzdGF0aWM6OklHTk9SRV9WQ1NfSUdOT1JFRF9GSUxFUzsKfSBlbHNlIHsKJHRoaXMtPmlnbm9yZSAmPSB+c3RhdGljOjpJR05PUkVfVkNTX0lHTk9SRURfRklMRVM7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRkVkNTUGF0dGVybigkcGF0dGVybikKewpmb3JlYWNoICgoYXJyYXkpICRwYXR0ZXJuIGFzICRwKSB7CnNlbGY6OiR2Y3NQYXR0ZXJuc1tdID0gJHA7Cn0KCnNlbGY6OiR2Y3NQYXR0ZXJucyA9IGFycmF5X3VuaXF1ZShzZWxmOjokdmNzUGF0dGVybnMpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0KFxDbG9zdXJlICRjbG9zdXJlKQp7CiR0aGlzLT5zb3J0ID0gJGNsb3N1cmU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0QnlOYW1lKGJvb2wgJHVzZU5hdHVyYWxTb3J0ID0gZmFsc2UpCnsKJHRoaXMtPnNvcnQgPSAkdXNlTmF0dXJhbFNvcnQgPyBJdGVyYXRvclxTb3J0YWJsZUl0ZXJhdG9yOjpTT1JUX0JZX05BTUVfTkFUVVJBTCA6IEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3I6OlNPUlRfQllfTkFNRTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNvcnRCeVR5cGUoKQp7CiR0aGlzLT5zb3J0ID0gSXRlcmF0b3JcU29ydGFibGVJdGVyYXRvcjo6U09SVF9CWV9UWVBFOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0QnlBY2Nlc3NlZFRpbWUoKQp7CiR0aGlzLT5zb3J0ID0gSXRlcmF0b3JcU29ydGFibGVJdGVyYXRvcjo6U09SVF9CWV9BQ0NFU1NFRF9USU1FOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXZlcnNlU29ydGluZygpCnsKJHRoaXMtPnJldmVyc2VTb3J0aW5nID0gdHJ1ZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0QnlDaGFuZ2VkVGltZSgpCnsKJHRoaXMtPnNvcnQgPSBJdGVyYXRvclxTb3J0YWJsZUl0ZXJhdG9yOjpTT1JUX0JZX0NIQU5HRURfVElNRTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc29ydEJ5TW9kaWZpZWRUaW1lKCkKewokdGhpcy0+c29ydCA9IEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3I6OlNPUlRfQllfTU9ESUZJRURfVElNRTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaWx0ZXIoXENsb3N1cmUgJGNsb3N1cmUpCnsKJHRoaXMtPmZpbHRlcnNbXSA9ICRjbG9zdXJlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmb2xsb3dMaW5rcygpCnsKJHRoaXMtPmZvbGxvd0xpbmtzID0gdHJ1ZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpZ25vcmVVbnJlYWRhYmxlRGlycyhib29sICRpZ25vcmUgPSB0cnVlKQp7CiR0aGlzLT5pZ25vcmVVbnJlYWRhYmxlRGlycyA9ICRpZ25vcmU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbigkZGlycykKewokcmVzb2x2ZWREaXJzID0gW107Cgpmb3JlYWNoICgoYXJyYXkpICRkaXJzIGFzICRkaXIpIHsKaWYgKGlzX2RpcigkZGlyKSkgewokcmVzb2x2ZWREaXJzW10gPSBbJHRoaXMtPm5vcm1hbGl6ZURpcigkZGlyKV07Cn0gZWxzZWlmICgkZ2xvYiA9IGdsb2IoJGRpciwgKFxkZWZpbmVkKCdHTE9CX0JSQUNFJykgPyBcR0xPQl9CUkFDRSA6IDApIHwgXEdMT0JfT05MWURJUiB8IFxHTE9CX05PU09SVCkpIHsKc29ydCgkZ2xvYik7CiRyZXNvbHZlZERpcnNbXSA9IGFycmF5X21hcChbJHRoaXMsICdub3JtYWxpemVEaXInXSwgJGdsb2IpOwp9IGVsc2Ugewp0aHJvdyBuZXcgRGlyZWN0b3J5Tm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcyIgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LicsICRkaXIpKTsKfQp9CgokdGhpcy0+ZGlycyA9IGFycmF5X21lcmdlKCR0aGlzLT5kaXJzLCAuLi4kcmVzb2x2ZWREaXJzKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpCnsKaWYgKDAgPT09IFxjb3VudCgkdGhpcy0+ZGlycykgJiYgMCA9PT0gXGNvdW50KCR0aGlzLT5pdGVyYXRvcnMpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1lvdSBtdXN0IGNhbGwgb25lIG9mIGluKCkgb3IgYXBwZW5kKCkgbWV0aG9kcyBiZWZvcmUgaXRlcmF0aW5nIG92ZXIgYSBGaW5kZXIuJyk7Cn0KCmlmICgxID09PSBcY291bnQoJHRoaXMtPmRpcnMpICYmIDAgPT09IFxjb3VudCgkdGhpcy0+aXRlcmF0b3JzKSkgewokaXRlcmF0b3IgPSAkdGhpcy0+c2VhcmNoSW5EaXJlY3RvcnkoJHRoaXMtPmRpcnNbMF0pOwoKaWYgKCR0aGlzLT5zb3J0IHx8ICR0aGlzLT5yZXZlcnNlU29ydGluZykgewokaXRlcmF0b3IgPSAobmV3IEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3IoJGl0ZXJhdG9yLCAkdGhpcy0+c29ydCwgJHRoaXMtPnJldmVyc2VTb3J0aW5nKSktPmdldEl0ZXJhdG9yKCk7Cn0KCnJldHVybiAkaXRlcmF0b3I7Cn0KCiRpdGVyYXRvciA9IG5ldyBcQXBwZW5kSXRlcmF0b3IoKTsKZm9yZWFjaCAoJHRoaXMtPmRpcnMgYXMgJGRpcikgewokaXRlcmF0b3ItPmFwcGVuZChuZXcgXEl0ZXJhdG9ySXRlcmF0b3IobmV3IExhenlJdGVyYXRvcihmdW5jdGlvbiAoKSB1c2UgKCRkaXIpIHsKcmV0dXJuICR0aGlzLT5zZWFyY2hJbkRpcmVjdG9yeSgkZGlyKTsKfSkpKTsKfQoKZm9yZWFjaCAoJHRoaXMtPml0ZXJhdG9ycyBhcyAkaXQpIHsKJGl0ZXJhdG9yLT5hcHBlbmQoJGl0KTsKfQoKaWYgKCR0aGlzLT5zb3J0IHx8ICR0aGlzLT5yZXZlcnNlU29ydGluZykgewokaXRlcmF0b3IgPSAobmV3IEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3IoJGl0ZXJhdG9yLCAkdGhpcy0+c29ydCwgJHRoaXMtPnJldmVyc2VTb3J0aW5nKSktPmdldEl0ZXJhdG9yKCk7Cn0KCnJldHVybiAkaXRlcmF0b3I7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhcHBlbmQoaXRlcmFibGUgJGl0ZXJhdG9yKQp7CmlmICgkaXRlcmF0b3IgaW5zdGFuY2VvZiBcSXRlcmF0b3JBZ2dyZWdhdGUpIHsKJHRoaXMtPml0ZXJhdG9yc1tdID0gJGl0ZXJhdG9yLT5nZXRJdGVyYXRvcigpOwp9IGVsc2VpZiAoJGl0ZXJhdG9yIGluc3RhbmNlb2YgXEl0ZXJhdG9yKSB7CiR0aGlzLT5pdGVyYXRvcnNbXSA9ICRpdGVyYXRvcjsKfSBlbHNlaWYgKGlzX2l0ZXJhYmxlKCRpdGVyYXRvcikpIHsKJGl0ID0gbmV3IFxBcnJheUl0ZXJhdG9yKCk7CmZvcmVhY2ggKCRpdGVyYXRvciBhcyAkZmlsZSkgewokZmlsZSA9ICRmaWxlIGluc3RhbmNlb2YgXFNwbEZpbGVJbmZvID8gJGZpbGUgOiBuZXcgXFNwbEZpbGVJbmZvKCRmaWxlKTsKJGl0WyRmaWxlLT5nZXRQYXRobmFtZSgpXSA9ICRmaWxlOwp9CiR0aGlzLT5pdGVyYXRvcnNbXSA9ICRpdDsKfSBlbHNlIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ZpbmRlcjo6YXBwZW5kKCkgbWV0aG9kIHdyb25nIGFyZ3VtZW50IHR5cGUuJyk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUmVzdWx0cygpCnsKZm9yZWFjaCAoJHRoaXMtPmdldEl0ZXJhdG9yKCkgYXMgJF8pIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGNvdW50KCkKewpyZXR1cm4gaXRlcmF0b3JfY291bnQoJHRoaXMtPmdldEl0ZXJhdG9yKCkpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNlYXJjaEluRGlyZWN0b3J5KHN0cmluZyAkZGlyKTogXEl0ZXJhdG9yCnsKJGV4Y2x1ZGUgPSAkdGhpcy0+ZXhjbHVkZTsKJG5vdFBhdGhzID0gJHRoaXMtPm5vdFBhdGhzOwoKaWYgKHN0YXRpYzo6SUdOT1JFX1ZDU19GSUxFUyA9PT0gKHN0YXRpYzo6SUdOT1JFX1ZDU19GSUxFUyAmICR0aGlzLT5pZ25vcmUpKSB7CiRleGNsdWRlID0gYXJyYXlfbWVyZ2UoJGV4Y2x1ZGUsIHNlbGY6OiR2Y3NQYXR0ZXJucyk7Cn0KCmlmIChzdGF0aWM6OklHTk9SRV9ET1RfRklMRVMgPT09IChzdGF0aWM6OklHTk9SRV9ET1RfRklMRVMgJiAkdGhpcy0+aWdub3JlKSkgewokbm90UGF0aHNbXSA9ICcjKF58LylcLi4rKC98JCkjJzsKfQoKJG1pbkRlcHRoID0gMDsKJG1heERlcHRoID0gXFBIUF9JTlRfTUFYOwoKZm9yZWFjaCAoJHRoaXMtPmRlcHRocyBhcyAkY29tcGFyYXRvcikgewpzd2l0Y2ggKCRjb21wYXJhdG9yLT5nZXRPcGVyYXRvcigpKSB7CmNhc2UgJz4nOgokbWluRGVwdGggPSAkY29tcGFyYXRvci0+Z2V0VGFyZ2V0KCkgKyAxOwpicmVhazsKY2FzZSAnPj0nOgokbWluRGVwdGggPSAkY29tcGFyYXRvci0+Z2V0VGFyZ2V0KCk7CmJyZWFrOwpjYXNlICc8JzoKJG1heERlcHRoID0gJGNvbXBhcmF0b3ItPmdldFRhcmdldCgpIC0gMTsKYnJlYWs7CmNhc2UgJzw9JzoKJG1heERlcHRoID0gJGNvbXBhcmF0b3ItPmdldFRhcmdldCgpOwpicmVhazsKZGVmYXVsdDoKJG1pbkRlcHRoID0gJG1heERlcHRoID0gJGNvbXBhcmF0b3ItPmdldFRhcmdldCgpOwp9Cn0KCiRmbGFncyA9IFxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTOwoKaWYgKCR0aGlzLT5mb2xsb3dMaW5rcykgewokZmxhZ3MgfD0gXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yOjpGT0xMT1dfU1lNTElOS1M7Cn0KCiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyLCAkZmxhZ3MsICR0aGlzLT5pZ25vcmVVbnJlYWRhYmxlRGlycyk7CgppZiAoJGV4Y2x1ZGUpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXEV4Y2x1ZGVEaXJlY3RvcnlGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICRleGNsdWRlKTsKfQoKJGl0ZXJhdG9yID0gbmV3IFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKCRpdGVyYXRvciwgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OlNFTEZfRklSU1QpOwoKaWYgKCRtaW5EZXB0aCA+IDAgfHwgJG1heERlcHRoIDwgXFBIUF9JTlRfTUFYKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxEZXB0aFJhbmdlRmlsdGVySXRlcmF0b3IoJGl0ZXJhdG9yLCAkbWluRGVwdGgsICRtYXhEZXB0aCk7Cn0KCmlmICgkdGhpcy0+bW9kZSkgewokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcRmlsZVR5cGVGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5tb2RlKTsKfQoKaWYgKCR0aGlzLT5uYW1lcyB8fCAkdGhpcy0+bm90TmFtZXMpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXEZpbGVuYW1lRmlsdGVySXRlcmF0b3IoJGl0ZXJhdG9yLCAkdGhpcy0+bmFtZXMsICR0aGlzLT5ub3ROYW1lcyk7Cn0KCmlmICgkdGhpcy0+Y29udGFpbnMgfHwgJHRoaXMtPm5vdENvbnRhaW5zKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxGaWxlY29udGVudEZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJHRoaXMtPmNvbnRhaW5zLCAkdGhpcy0+bm90Q29udGFpbnMpOwp9CgppZiAoJHRoaXMtPnNpemVzKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxTaXplUmFuZ2VGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5zaXplcyk7Cn0KCmlmICgkdGhpcy0+ZGF0ZXMpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXERhdGVSYW5nZUZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJHRoaXMtPmRhdGVzKTsKfQoKaWYgKCR0aGlzLT5maWx0ZXJzKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxDdXN0b21GaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5maWx0ZXJzKTsKfQoKaWYgKCR0aGlzLT5wYXRocyB8fCAkbm90UGF0aHMpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXFBhdGhGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5wYXRocywgJG5vdFBhdGhzKTsKfQoKaWYgKHN0YXRpYzo6SUdOT1JFX1ZDU19JR05PUkVEX0ZJTEVTID09PSAoc3RhdGljOjpJR05PUkVfVkNTX0lHTk9SRURfRklMRVMgJiAkdGhpcy0+aWdub3JlKSkgewokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcVmNzSWdub3JlZEZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJGRpcik7Cn0KCnJldHVybiAkaXRlcmF0b3I7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBub3JtYWxpemVEaXIoc3RyaW5nICRkaXIpOiBzdHJpbmcKewppZiAoJy8nID09PSAkZGlyKSB7CnJldHVybiAkZGlyOwp9CgokZGlyID0gcnRyaW0oJGRpciwgJy8nLlxESVJFQ1RPUllfU0VQQVJBVE9SKTsKCmlmIChwcmVnX21hdGNoKCcjXihzc2gyXC4pP3M/ZnRwOi8vIycsICRkaXIpKSB7CiRkaXIgLj0gJy8nOwp9CgpyZXR1cm4gJGRpcjsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyOwoKCgoKCgoKY2xhc3MgR2l0aWdub3JlCnsKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRvUmVnZXgoc3RyaW5nICRnaXRpZ25vcmVGaWxlQ29udGVudCk6IHN0cmluZwp7CnJldHVybiBzZWxmOjpidWlsZFJlZ2V4KCRnaXRpZ25vcmVGaWxlQ29udGVudCwgZmFsc2UpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRvUmVnZXhNYXRjaGluZ05lZ2F0ZWRQYXR0ZXJucyhzdHJpbmcgJGdpdGlnbm9yZUZpbGVDb250ZW50KTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6OmJ1aWxkUmVnZXgoJGdpdGlnbm9yZUZpbGVDb250ZW50LCB0cnVlKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gYnVpbGRSZWdleChzdHJpbmcgJGdpdGlnbm9yZUZpbGVDb250ZW50LCBib29sICRpbnZlcnRlZCk6IHN0cmluZwp7CiRnaXRpZ25vcmVGaWxlQ29udGVudCA9IHByZWdfcmVwbGFjZSgnfig/PCFcXFxcKSNbXlxuXHJdKn4nLCAnJywgJGdpdGlnbm9yZUZpbGVDb250ZW50KTsKJGdpdGlnbm9yZUxpbmVzID0gcHJlZ19zcGxpdCgnflxyXG4/fFxuficsICRnaXRpZ25vcmVGaWxlQ29udGVudCk7CgokcmVzID0gc2VsZjo6bGluZVRvUmVnZXgoJycpOwpmb3JlYWNoICgkZ2l0aWdub3JlTGluZXMgYXMgJGxpbmUpIHsKJGxpbmUgPSBwcmVnX3JlcGxhY2UoJ34oPzwhXFxcXClbIFx0XSskficsICcnLCAkbGluZSk7CgppZiAoJyEnID09PSBzdWJzdHIoJGxpbmUsIDAsIDEpKSB7CiRsaW5lID0gc3Vic3RyKCRsaW5lLCAxKTsKJGlzTmVnYXRpdmUgPSB0cnVlOwp9IGVsc2UgewokaXNOZWdhdGl2ZSA9IGZhbHNlOwp9CgppZiAoJycgIT09ICRsaW5lKSB7CmlmICgkaXNOZWdhdGl2ZSB4b3IgJGludmVydGVkKSB7CiRyZXMgPSAnKD8hJy5zZWxmOjpsaW5lVG9SZWdleCgkbGluZSkuJyQpJy4kcmVzOwp9IGVsc2UgewokcmVzID0gJyg/OicuJHJlcy4nfCcuc2VsZjo6bGluZVRvUmVnZXgoJGxpbmUpLicpJzsKfQp9Cn0KCnJldHVybiAnfl4oPzonLiRyZXMuJyl+cyc7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGxpbmVUb1JlZ2V4KHN0cmluZyAkZ2l0aWdub3JlTGluZSk6IHN0cmluZwp7CmlmICgnJyA9PT0gJGdpdGlnbm9yZUxpbmUpIHsKcmV0dXJuICckZic7IAp9Cgokc2xhc2hQb3MgPSBzdHJwb3MoJGdpdGlnbm9yZUxpbmUsICcvJyk7CmlmIChmYWxzZSAhPT0gJHNsYXNoUG9zICYmIFxzdHJsZW4oJGdpdGlnbm9yZUxpbmUpIC0gMSAhPT0gJHNsYXNoUG9zKSB7CmlmICgwID09PSAkc2xhc2hQb3MpIHsKJGdpdGlnbm9yZUxpbmUgPSBzdWJzdHIoJGdpdGlnbm9yZUxpbmUsIDEpOwp9CiRpc0Fic29sdXRlID0gdHJ1ZTsKfSBlbHNlIHsKJGlzQWJzb2x1dGUgPSBmYWxzZTsKfQoKJHJlZ2V4ID0gcHJlZ19xdW90ZShzdHJfcmVwbGFjZSgnXFwnLCAnJywgJGdpdGlnbm9yZUxpbmUpLCAnficpOwokcmVnZXggPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ35cXFxcXFsoKD86XFxcXCEpPykoW15cW1xdXSopXFxcXFxdficsIGZ1bmN0aW9uIChhcnJheSAkbWF0Y2hlcyk6IHN0cmluZyB7CnJldHVybiAnWycuKCcnICE9PSAkbWF0Y2hlc1sxXSA/ICdeJyA6ICcnKS5zdHJfcmVwbGFjZSgnXFwtJywgJy0nLCAkbWF0Y2hlc1syXSkuJ10nOwp9LCAkcmVnZXgpOwokcmVnZXggPSBwcmVnX3JlcGxhY2UoJ34oPzooPzpcXFxcXCopezIsfSgvPykpK34nLCAnKD86KD86KD8hLy8pLig/PCEvLykpKyQxKT8nLCAkcmVnZXgpOwokcmVnZXggPSBwcmVnX3JlcGxhY2UoJ35cXFxcXCp+JywgJ1teL10qJywgJHJlZ2V4KTsKJHJlZ2V4ID0gcHJlZ19yZXBsYWNlKCd+XFxcXFw/ficsICdbXi9dJywgJHJlZ2V4KTsKCnJldHVybiAoJGlzQWJzb2x1dGUgPyAnJyA6ICcoPzpbXi9dKy8pKicpCi4kcmVnZXgKLighc3RyX2VuZHNfd2l0aCgkZ2l0aWdub3JlTGluZSwgJy8nKSA/ICcoPzokfC8pJyA6ICcnKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIEdsb2IKewoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdG9SZWdleChzdHJpbmcgJGdsb2IsIGJvb2wgJHN0cmljdExlYWRpbmdEb3QgPSB0cnVlLCBib29sICRzdHJpY3RXaWxkY2FyZFNsYXNoID0gdHJ1ZSwgc3RyaW5nICRkZWxpbWl0ZXIgPSAnIycpCnsKJGZpcnN0Qnl0ZSA9IHRydWU7CiRlc2NhcGluZyA9IGZhbHNlOwokaW5DdXJsaWVzID0gMDsKJHJlZ2V4ID0gJyc7CiRzaXplR2xvYiA9IFxzdHJsZW4oJGdsb2IpOwpmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZUdsb2I7ICsrJGkpIHsKJGNhciA9ICRnbG9iWyRpXTsKaWYgKCRmaXJzdEJ5dGUgJiYgJHN0cmljdExlYWRpbmdEb3QgJiYgJy4nICE9PSAkY2FyKSB7CiRyZWdleCAuPSAnKD89W15cLl0pJzsKfQoKJGZpcnN0Qnl0ZSA9ICcvJyA9PT0gJGNhcjsKCmlmICgkZmlyc3RCeXRlICYmICRzdHJpY3RXaWxkY2FyZFNsYXNoICYmIGlzc2V0KCRnbG9iWyRpICsgMl0pICYmICcqKicgPT09ICRnbG9iWyRpICsgMV0uJGdsb2JbJGkgKyAyXSAmJiAoIWlzc2V0KCRnbG9iWyRpICsgM10pIHx8ICcvJyA9PT0gJGdsb2JbJGkgKyAzXSkpIHsKJGNhciA9ICdbXi9dKysvJzsKaWYgKCFpc3NldCgkZ2xvYlskaSArIDNdKSkgewokY2FyIC49ICc/JzsKfQoKaWYgKCRzdHJpY3RMZWFkaW5nRG90KSB7CiRjYXIgPSAnKD89W15cLl0pJy4kY2FyOwp9CgokY2FyID0gJy8oPzonLiRjYXIuJykqJzsKJGkgKz0gMiArIGlzc2V0KCRnbG9iWyRpICsgM10pOwoKaWYgKCcvJyA9PT0gJGRlbGltaXRlcikgewokY2FyID0gc3RyX3JlcGxhY2UoJy8nLCAnXFwvJywgJGNhcik7Cn0KfQoKaWYgKCRkZWxpbWl0ZXIgPT09ICRjYXIgfHwgJy4nID09PSAkY2FyIHx8ICcoJyA9PT0gJGNhciB8fCAnKScgPT09ICRjYXIgfHwgJ3wnID09PSAkY2FyIHx8ICcrJyA9PT0gJGNhciB8fCAnXicgPT09ICRjYXIgfHwgJyQnID09PSAkY2FyKSB7CiRyZWdleCAuPSAiXFwkY2FyIjsKfSBlbHNlaWYgKCcqJyA9PT0gJGNhcikgewokcmVnZXggLj0gJGVzY2FwaW5nID8gJ1xcKicgOiAoJHN0cmljdFdpbGRjYXJkU2xhc2ggPyAnW14vXSonIDogJy4qJyk7Cn0gZWxzZWlmICgnPycgPT09ICRjYXIpIHsKJHJlZ2V4IC49ICRlc2NhcGluZyA/ICdcXD8nIDogKCRzdHJpY3RXaWxkY2FyZFNsYXNoID8gJ1teL10nIDogJy4nKTsKfSBlbHNlaWYgKCd7JyA9PT0gJGNhcikgewokcmVnZXggLj0gJGVzY2FwaW5nID8gJ1xceycgOiAnKCc7CmlmICghJGVzY2FwaW5nKSB7CisrJGluQ3VybGllczsKfQp9IGVsc2VpZiAoJ30nID09PSAkY2FyICYmICRpbkN1cmxpZXMpIHsKJHJlZ2V4IC49ICRlc2NhcGluZyA/ICd9JyA6ICcpJzsKaWYgKCEkZXNjYXBpbmcpIHsKLS0kaW5DdXJsaWVzOwp9Cn0gZWxzZWlmICgnLCcgPT09ICRjYXIgJiYgJGluQ3VybGllcykgewokcmVnZXggLj0gJGVzY2FwaW5nID8gJywnIDogJ3wnOwp9IGVsc2VpZiAoJ1xcJyA9PT0gJGNhcikgewppZiAoJGVzY2FwaW5nKSB7CiRyZWdleCAuPSAnXFxcXCc7CiRlc2NhcGluZyA9IGZhbHNlOwp9IGVsc2UgewokZXNjYXBpbmcgPSB0cnVlOwp9Cgpjb250aW51ZTsKfSBlbHNlIHsKJHJlZ2V4IC49ICRjYXI7Cn0KJGVzY2FwaW5nID0gZmFsc2U7Cn0KCnJldHVybiAkZGVsaW1pdGVyLideJy4kcmVnZXguJyQnLiRkZWxpbWl0ZXI7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCgoKCgoKCgoKCgpjbGFzcyBDdXN0b21GaWx0ZXJJdGVyYXRvciBleHRlbmRzIFxGaWx0ZXJJdGVyYXRvcgp7CnByaXZhdGUgJGZpbHRlcnMgPSBbXTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcSXRlcmF0b3IgJGl0ZXJhdG9yLCBhcnJheSAkZmlsdGVycykKewpmb3JlYWNoICgkZmlsdGVycyBhcyAkZmlsdGVyKSB7CmlmICghXGlzX2NhbGxhYmxlKCRmaWx0ZXIpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFBIUCBjYWxsYmFjay4nKTsKfQp9CiR0aGlzLT5maWx0ZXJzID0gJGZpbHRlcnM7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvcik7Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CiRmaWxlaW5mbyA9ICR0aGlzLT5jdXJyZW50KCk7Cgpmb3JlYWNoICgkdGhpcy0+ZmlsdGVycyBhcyAkZmlsdGVyKSB7CmlmIChmYWxzZSA9PT0gJGZpbHRlcigkZmlsZWluZm8pKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxDb21wYXJhdG9yXERhdGVDb21wYXJhdG9yOwoKCgoKCgoKCmNsYXNzIERhdGVSYW5nZUZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgXEZpbHRlckl0ZXJhdG9yCnsKcHJpdmF0ZSAkY29tcGFyYXRvcnMgPSBbXTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXEl0ZXJhdG9yICRpdGVyYXRvciwgYXJyYXkgJGNvbXBhcmF0b3JzKQp7CiR0aGlzLT5jb21wYXJhdG9ycyA9ICRjb21wYXJhdG9yczsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGl0ZXJhdG9yKTsKfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCnsKJGZpbGVpbmZvID0gJHRoaXMtPmN1cnJlbnQoKTsKCmlmICghZmlsZV9leGlzdHMoJGZpbGVpbmZvLT5nZXRQYXRobmFtZSgpKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRmaWxlZGF0ZSA9ICRmaWxlaW5mby0+Z2V0TVRpbWUoKTsKZm9yZWFjaCAoJHRoaXMtPmNvbXBhcmF0b3JzIGFzICRjb21wYXJlKSB7CmlmICghJGNvbXBhcmUtPnRlc3QoJGZpbGVkYXRlKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCgoKCgoKCgoKCgpjbGFzcyBEZXB0aFJhbmdlRmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBcRmlsdGVySXRlcmF0b3IKewpwcml2YXRlICRtaW5EZXB0aCA9IDA7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvciAkaXRlcmF0b3IsIGludCAkbWluRGVwdGggPSAwLCBpbnQgJG1heERlcHRoID0gXFBIUF9JTlRfTUFYKQp7CiR0aGlzLT5taW5EZXB0aCA9ICRtaW5EZXB0aDsKJGl0ZXJhdG9yLT5zZXRNYXhEZXB0aChcUEhQX0lOVF9NQVggPT09ICRtYXhEZXB0aCA/IC0xIDogJG1heERlcHRoKTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGl0ZXJhdG9yKTsKfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCnsKcmV0dXJuICR0aGlzLT5nZXRJbm5lckl0ZXJhdG9yKCktPmdldERlcHRoKCkgPj0gJHRoaXMtPm1pbkRlcHRoOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7CgoKCgoKCgoKCgpjbGFzcyBFeGNsdWRlRGlyZWN0b3J5RmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBcRmlsdGVySXRlcmF0b3IgaW1wbGVtZW50cyBcUmVjdXJzaXZlSXRlcmF0b3IKewpwcml2YXRlICRpdGVyYXRvcjsKcHJpdmF0ZSAkaXNSZWN1cnNpdmU7CnByaXZhdGUgJGV4Y2x1ZGVkRGlycyA9IFtdOwpwcml2YXRlICRleGNsdWRlZFBhdHRlcm47CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxJdGVyYXRvciAkaXRlcmF0b3IsIGFycmF5ICRkaXJlY3RvcmllcykKewokdGhpcy0+aXRlcmF0b3IgPSAkaXRlcmF0b3I7CiR0aGlzLT5pc1JlY3Vyc2l2ZSA9ICRpdGVyYXRvciBpbnN0YW5jZW9mIFxSZWN1cnNpdmVJdGVyYXRvcjsKJHBhdHRlcm5zID0gW107CmZvcmVhY2ggKCRkaXJlY3RvcmllcyBhcyAkZGlyZWN0b3J5KSB7CiRkaXJlY3RvcnkgPSBydHJpbSgkZGlyZWN0b3J5LCAnLycpOwppZiAoISR0aGlzLT5pc1JlY3Vyc2l2ZSB8fCBzdHJfY29udGFpbnMoJGRpcmVjdG9yeSwgJy8nKSkgewokcGF0dGVybnNbXSA9IHByZWdfcXVvdGUoJGRpcmVjdG9yeSwgJyMnKTsKfSBlbHNlIHsKJHRoaXMtPmV4Y2x1ZGVkRGlyc1skZGlyZWN0b3J5XSA9IHRydWU7Cn0KfQppZiAoJHBhdHRlcm5zKSB7CiR0aGlzLT5leGNsdWRlZFBhdHRlcm4gPSAnIyg/Ol58LykoPzonLmltcGxvZGUoJ3wnLCAkcGF0dGVybnMpLicpKD86L3wkKSMnOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvcik7Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CmlmICgkdGhpcy0+aXNSZWN1cnNpdmUgJiYgaXNzZXQoJHRoaXMtPmV4Y2x1ZGVkRGlyc1skdGhpcy0+Z2V0RmlsZW5hbWUoKV0pICYmICR0aGlzLT5pc0RpcigpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5leGNsdWRlZFBhdHRlcm4pIHsKJHBhdGggPSAkdGhpcy0+aXNEaXIoKSA/ICR0aGlzLT5jdXJyZW50KCktPmdldFJlbGF0aXZlUGF0aG5hbWUoKSA6ICR0aGlzLT5jdXJyZW50KCktPmdldFJlbGF0aXZlUGF0aCgpOwokcGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHBhdGgpOwoKcmV0dXJuICFwcmVnX21hdGNoKCR0aGlzLT5leGNsdWRlZFBhdHRlcm4sICRwYXRoKTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gaGFzQ2hpbGRyZW4oKQp7CnJldHVybiAkdGhpcy0+aXNSZWN1cnNpdmUgJiYgJHRoaXMtPml0ZXJhdG9yLT5oYXNDaGlsZHJlbigpOwp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGdldENoaWxkcmVuKCkKewokY2hpbGRyZW4gPSBuZXcgc2VsZigkdGhpcy0+aXRlcmF0b3ItPmdldENoaWxkcmVuKCksIFtdKTsKJGNoaWxkcmVuLT5leGNsdWRlZERpcnMgPSAkdGhpcy0+ZXhjbHVkZWREaXJzOwokY2hpbGRyZW4tPmV4Y2x1ZGVkUGF0dGVybiA9ICR0aGlzLT5leGNsdWRlZFBhdHRlcm47CgpyZXR1cm4gJGNoaWxkcmVuOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7CgoKCgoKCgoKY2xhc3MgRmlsZVR5cGVGaWx0ZXJJdGVyYXRvciBleHRlbmRzIFxGaWx0ZXJJdGVyYXRvcgp7CnB1YmxpYyBjb25zdCBPTkxZX0ZJTEVTID0gMTsKcHVibGljIGNvbnN0IE9OTFlfRElSRUNUT1JJRVMgPSAyOwoKcHJpdmF0ZSAkbW9kZTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXEl0ZXJhdG9yICRpdGVyYXRvciwgaW50ICRtb2RlKQp7CiR0aGlzLT5tb2RlID0gJG1vZGU7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvcik7Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CiRmaWxlaW5mbyA9ICR0aGlzLT5jdXJyZW50KCk7CmlmIChzZWxmOjpPTkxZX0RJUkVDVE9SSUVTID09PSAoc2VsZjo6T05MWV9ESVJFQ1RPUklFUyAmICR0aGlzLT5tb2RlKSAmJiAkZmlsZWluZm8tPmlzRmlsZSgpKSB7CnJldHVybiBmYWxzZTsKfSBlbHNlaWYgKHNlbGY6Ok9OTFlfRklMRVMgPT09IChzZWxmOjpPTkxZX0ZJTEVTICYgJHRoaXMtPm1vZGUpICYmICRmaWxlaW5mby0+aXNEaXIoKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7CgoKCgoKCgoKCmNsYXNzIEZpbGVjb250ZW50RmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBNdWx0aXBsZVBjcmVGaWx0ZXJJdGVyYXRvcgp7CgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CmlmICghJHRoaXMtPm1hdGNoUmVnZXhwcyAmJiAhJHRoaXMtPm5vTWF0Y2hSZWdleHBzKSB7CnJldHVybiB0cnVlOwp9CgokZmlsZWluZm8gPSAkdGhpcy0+Y3VycmVudCgpOwoKaWYgKCRmaWxlaW5mby0+aXNEaXIoKSB8fCAhJGZpbGVpbmZvLT5pc1JlYWRhYmxlKCkpIHsKcmV0dXJuIGZhbHNlOwp9CgokY29udGVudCA9ICRmaWxlaW5mby0+Z2V0Q29udGVudHMoKTsKaWYgKCEkY29udGVudCkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiAkdGhpcy0+aXNBY2NlcHRlZCgkY29udGVudCk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdG9SZWdleChzdHJpbmcgJHN0cikKewpyZXR1cm4gJHRoaXMtPmlzUmVnZXgoJHN0cikgPyAkc3RyIDogJy8nLnByZWdfcXVvdGUoJHN0ciwgJy8nKS4nLyc7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcR2xvYjsKCgoKCgoKCgpjbGFzcyBGaWxlbmFtZUZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgTXVsdGlwbGVQY3JlRmlsdGVySXRlcmF0b3IKewoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKewpyZXR1cm4gJHRoaXMtPmlzQWNjZXB0ZWQoJHRoaXMtPmN1cnJlbnQoKS0+Z2V0RmlsZW5hbWUoKSk7Cn0KCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdG9SZWdleChzdHJpbmcgJHN0cikKewpyZXR1cm4gJHRoaXMtPmlzUmVnZXgoJHN0cikgPyAkc3RyIDogR2xvYjo6dG9SZWdleCgkc3RyKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKCgoKCgpjbGFzcyBMYXp5SXRlcmF0b3IgaW1wbGVtZW50cyBcSXRlcmF0b3JBZ2dyZWdhdGUKewpwcml2YXRlICRpdGVyYXRvckZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoY2FsbGFibGUgJGl0ZXJhdG9yRmFjdG9yeSkKewokdGhpcy0+aXRlcmF0b3JGYWN0b3J5ID0gJGl0ZXJhdG9yRmFjdG9yeTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKCk6IFxUcmF2ZXJzYWJsZQp7CnlpZWxkIGZyb20gKCR0aGlzLT5pdGVyYXRvckZhY3RvcnkpKCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCgoKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBNdWx0aXBsZVBjcmVGaWx0ZXJJdGVyYXRvciBleHRlbmRzIFxGaWx0ZXJJdGVyYXRvcgp7CnByb3RlY3RlZCAkbWF0Y2hSZWdleHBzID0gW107CnByb3RlY3RlZCAkbm9NYXRjaFJlZ2V4cHMgPSBbXTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxJdGVyYXRvciAkaXRlcmF0b3IsIGFycmF5ICRtYXRjaFBhdHRlcm5zLCBhcnJheSAkbm9NYXRjaFBhdHRlcm5zKQp7CmZvcmVhY2ggKCRtYXRjaFBhdHRlcm5zIGFzICRwYXR0ZXJuKSB7CiR0aGlzLT5tYXRjaFJlZ2V4cHNbXSA9ICR0aGlzLT50b1JlZ2V4KCRwYXR0ZXJuKTsKfQoKZm9yZWFjaCAoJG5vTWF0Y2hQYXR0ZXJucyBhcyAkcGF0dGVybikgewokdGhpcy0+bm9NYXRjaFJlZ2V4cHNbXSA9ICR0aGlzLT50b1JlZ2V4KCRwYXR0ZXJuKTsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkaXRlcmF0b3IpOwp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaXNBY2NlcHRlZChzdHJpbmcgJHN0cmluZykKewoKZm9yZWFjaCAoJHRoaXMtPm5vTWF0Y2hSZWdleHBzIGFzICRyZWdleCkgewppZiAocHJlZ19tYXRjaCgkcmVnZXgsICRzdHJpbmcpKSB7CnJldHVybiBmYWxzZTsKfQp9CgoKaWYgKCR0aGlzLT5tYXRjaFJlZ2V4cHMpIHsKZm9yZWFjaCAoJHRoaXMtPm1hdGNoUmVnZXhwcyBhcyAkcmVnZXgpIHsKaWYgKHByZWdfbWF0Y2goJHJlZ2V4LCAkc3RyaW5nKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaXNSZWdleChzdHJpbmcgJHN0cikKewokYXZhaWxhYmxlTW9kaWZpZXJzID0gJ2ltc3h1QURVJzsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAyMDApIHsKJGF2YWlsYWJsZU1vZGlmaWVycyAuPSAnbic7Cn0KCmlmIChwcmVnX21hdGNoKCcvXiguezMsfT8pWycuJGF2YWlsYWJsZU1vZGlmaWVycy4nXSokLycsICRzdHIsICRtKSkgewokc3RhcnQgPSBzdWJzdHIoJG1bMV0sIDAsIDEpOwokZW5kID0gc3Vic3RyKCRtWzFdLCAtMSk7CgppZiAoJHN0YXJ0ID09PSAkZW5kKSB7CnJldHVybiAhcHJlZ19tYXRjaCgnL1sqP1s6YWxudW06XSBcXFxcXS8nLCAkc3RhcnQpOwp9Cgpmb3JlYWNoIChbWyd7JywgJ30nXSwgWycoJywgJyknXSwgWydbJywgJ10nXSwgWyc8JywgJz4nXV0gYXMgJGRlbGltaXRlcnMpIHsKaWYgKCRzdGFydCA9PT0gJGRlbGltaXRlcnNbMF0gJiYgJGVuZCA9PT0gJGRlbGltaXRlcnNbMV0pIHsKcmV0dXJuIHRydWU7Cn0KfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIHRvUmVnZXgoc3RyaW5nICRzdHIpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKCgoKCgoKCgpjbGFzcyBQYXRoRmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBNdWx0aXBsZVBjcmVGaWx0ZXJJdGVyYXRvcgp7CgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CiRmaWxlbmFtZSA9ICR0aGlzLT5jdXJyZW50KCktPmdldFJlbGF0aXZlUGF0aG5hbWUoKTsKCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokZmlsZW5hbWUgPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRmaWxlbmFtZSk7Cn0KCnJldHVybiAkdGhpcy0+aXNBY2NlcHRlZCgkZmlsZW5hbWUpOwp9CgoKCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0b1JlZ2V4KHN0cmluZyAkc3RyKQp7CnJldHVybiAkdGhpcy0+aXNSZWdleCgkc3RyKSA/ICRzdHIgOiAnLycucHJlZ19xdW90ZSgkc3RyLCAnLycpLicvJzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxFeGNlcHRpb25cQWNjZXNzRGVuaWVkRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXFNwbEZpbGVJbmZvOwoKCgoKCgpjbGFzcyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvciBleHRlbmRzIFxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcgp7CgoKCnByaXZhdGUgJGlnbm9yZVVucmVhZGFibGVEaXJzOwoKCgoKcHJpdmF0ZSAkaWdub3JlRmlyc3RSZXdpbmQgPSB0cnVlOwoKCnByaXZhdGUgJHJvb3RQYXRoOwpwcml2YXRlICRzdWJQYXRoOwpwcml2YXRlICRkaXJlY3RvcnlTZXBhcmF0b3IgPSAnLyc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRwYXRoLCBpbnQgJGZsYWdzLCBib29sICRpZ25vcmVVbnJlYWRhYmxlRGlycyA9IGZhbHNlKQp7CmlmICgkZmxhZ3MgJiAoc2VsZjo6Q1VSUkVOVF9BU19QQVRITkFNRSB8IHNlbGY6OkNVUlJFTlRfQVNfU0VMRikpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGlzIGl0ZXJhdG9yIG9ubHkgc3VwcG9ydCByZXR1cm5pbmcgY3VycmVudCBhcyBmaWxlaW5mby4nKTsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkcGF0aCwgJGZsYWdzKTsKJHRoaXMtPmlnbm9yZVVucmVhZGFibGVEaXJzID0gJGlnbm9yZVVucmVhZGFibGVEaXJzOwokdGhpcy0+cm9vdFBhdGggPSAkcGF0aDsKaWYgKCcvJyAhPT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgJiYgISgkZmxhZ3MgJiBzZWxmOjpVTklYX1BBVEhTKSkgewokdGhpcy0+ZGlyZWN0b3J5U2VwYXJhdG9yID0gXERJUkVDVE9SWV9TRVBBUkFUT1I7Cn0KfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGN1cnJlbnQoKQp7CgoKaWYgKG51bGwgPT09ICRzdWJQYXRobmFtZSA9ICR0aGlzLT5zdWJQYXRoKSB7CiRzdWJQYXRobmFtZSA9ICR0aGlzLT5zdWJQYXRoID0gJHRoaXMtPmdldFN1YlBhdGgoKTsKfQppZiAoJycgIT09ICRzdWJQYXRobmFtZSkgewokc3ViUGF0aG5hbWUgLj0gJHRoaXMtPmRpcmVjdG9yeVNlcGFyYXRvcjsKfQokc3ViUGF0aG5hbWUgLj0gJHRoaXMtPmdldEZpbGVuYW1lKCk7CiRiYXNlUGF0aCA9ICR0aGlzLT5yb290UGF0aDsKCmlmICgnLycgIT09ICRiYXNlUGF0aCAmJiAhc3RyX2VuZHNfd2l0aCgkYmFzZVBhdGgsICR0aGlzLT5kaXJlY3RvcnlTZXBhcmF0b3IpICYmICFzdHJfZW5kc193aXRoKCRiYXNlUGF0aCwgJy8nKSkgewokYmFzZVBhdGggLj0gJHRoaXMtPmRpcmVjdG9yeVNlcGFyYXRvcjsKfQoKcmV0dXJuIG5ldyBTcGxGaWxlSW5mbygkYmFzZVBhdGguJHN1YlBhdGhuYW1lLCAkdGhpcy0+c3ViUGF0aCwgJHN1YlBhdGhuYW1lKTsKfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGhhc0NoaWxkcmVuKCRhbGxvd0xpbmtzID0gZmFsc2UpCnsKJGhhc0NoaWxkcmVuID0gcGFyZW50OjpoYXNDaGlsZHJlbigkYWxsb3dMaW5rcyk7CgppZiAoISRoYXNDaGlsZHJlbiB8fCAhJHRoaXMtPmlnbm9yZVVucmVhZGFibGVEaXJzKSB7CnJldHVybiAkaGFzQ2hpbGRyZW47Cn0KCnRyeSB7CnBhcmVudDo6Z2V0Q2hpbGRyZW4oKTsKCnJldHVybiB0cnVlOwp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CgpyZXR1cm4gZmFsc2U7Cn0KfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGdldENoaWxkcmVuKCkKewp0cnkgewokY2hpbGRyZW4gPSBwYXJlbnQ6OmdldENoaWxkcmVuKCk7CgppZiAoJGNoaWxkcmVuIGluc3RhbmNlb2Ygc2VsZikgewoKJGNoaWxkcmVuLT5pZ25vcmVVbnJlYWRhYmxlRGlycyA9ICR0aGlzLT5pZ25vcmVVbnJlYWRhYmxlRGlyczsKCgokY2hpbGRyZW4tPnJvb3RQYXRoID0gJHRoaXMtPnJvb3RQYXRoOwp9CgpyZXR1cm4gJGNoaWxkcmVuOwp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBBY2Nlc3NEZW5pZWRFeGNlcHRpb24oJGUtPmdldE1lc3NhZ2UoKSwgJGUtPmdldENvZGUoKSwgJGUpOwp9Cn0KCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gbmV4dCgpCnsKJHRoaXMtPmlnbm9yZUZpcnN0UmV3aW5kID0gZmFsc2U7CgpwYXJlbnQ6Om5leHQoKTsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiByZXdpbmQoKQp7CgoKaWYgKCR0aGlzLT5pZ25vcmVGaXJzdFJld2luZCkgewokdGhpcy0+aWdub3JlRmlyc3RSZXdpbmQgPSBmYWxzZTsKCnJldHVybjsKfQoKcGFyZW50OjpyZXdpbmQoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxDb21wYXJhdG9yXE51bWJlckNvbXBhcmF0b3I7CgoKCgoKCgoKY2xhc3MgU2l6ZVJhbmdlRmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBcRmlsdGVySXRlcmF0b3IKewpwcml2YXRlICRjb21wYXJhdG9ycyA9IFtdOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcSXRlcmF0b3IgJGl0ZXJhdG9yLCBhcnJheSAkY29tcGFyYXRvcnMpCnsKJHRoaXMtPmNvbXBhcmF0b3JzID0gJGNvbXBhcmF0b3JzOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkaXRlcmF0b3IpOwp9CgoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKewokZmlsZWluZm8gPSAkdGhpcy0+Y3VycmVudCgpOwppZiAoISRmaWxlaW5mby0+aXNGaWxlKCkpIHsKcmV0dXJuIHRydWU7Cn0KCiRmaWxlc2l6ZSA9ICRmaWxlaW5mby0+Z2V0U2l6ZSgpOwpmb3JlYWNoICgkdGhpcy0+Y29tcGFyYXRvcnMgYXMgJGNvbXBhcmUpIHsKaWYgKCEkY29tcGFyZS0+dGVzdCgkZmlsZXNpemUpKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKCgoKCgoKCmNsYXNzIFNvcnRhYmxlSXRlcmF0b3IgaW1wbGVtZW50cyBcSXRlcmF0b3JBZ2dyZWdhdGUKewpwdWJsaWMgY29uc3QgU09SVF9CWV9OT05FID0gMDsKcHVibGljIGNvbnN0IFNPUlRfQllfTkFNRSA9IDE7CnB1YmxpYyBjb25zdCBTT1JUX0JZX1RZUEUgPSAyOwpwdWJsaWMgY29uc3QgU09SVF9CWV9BQ0NFU1NFRF9USU1FID0gMzsKcHVibGljIGNvbnN0IFNPUlRfQllfQ0hBTkdFRF9USU1FID0gNDsKcHVibGljIGNvbnN0IFNPUlRfQllfTU9ESUZJRURfVElNRSA9IDU7CnB1YmxpYyBjb25zdCBTT1JUX0JZX05BTUVfTkFUVVJBTCA9IDY7Cgpwcml2YXRlICRpdGVyYXRvcjsKcHJpdmF0ZSAkc29ydDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcVHJhdmVyc2FibGUgJGl0ZXJhdG9yLCAkc29ydCwgYm9vbCAkcmV2ZXJzZU9yZGVyID0gZmFsc2UpCnsKJHRoaXMtPml0ZXJhdG9yID0gJGl0ZXJhdG9yOwokb3JkZXIgPSAkcmV2ZXJzZU9yZGVyID8gLTEgOiAxOwoKaWYgKHNlbGY6OlNPUlRfQllfTkFNRSA9PT0gJHNvcnQpIHsKJHRoaXMtPnNvcnQgPSBzdGF0aWMgZnVuY3Rpb24gKFxTcGxGaWxlSW5mbyAkYSwgXFNwbEZpbGVJbmZvICRiKSB1c2UgKCRvcmRlcikgewpyZXR1cm4gJG9yZGVyICogc3RyY21wKCRhLT5nZXRSZWFsUGF0aCgpID86ICRhLT5nZXRQYXRobmFtZSgpLCAkYi0+Z2V0UmVhbFBhdGgoKSA/OiAkYi0+Z2V0UGF0aG5hbWUoKSk7Cn07Cn0gZWxzZWlmIChzZWxmOjpTT1JUX0JZX05BTUVfTkFUVVJBTCA9PT0gJHNvcnQpIHsKJHRoaXMtPnNvcnQgPSBzdGF0aWMgZnVuY3Rpb24gKFxTcGxGaWxlSW5mbyAkYSwgXFNwbEZpbGVJbmZvICRiKSB1c2UgKCRvcmRlcikgewpyZXR1cm4gJG9yZGVyICogc3RybmF0Y21wKCRhLT5nZXRSZWFsUGF0aCgpID86ICRhLT5nZXRQYXRobmFtZSgpLCAkYi0+Z2V0UmVhbFBhdGgoKSA/OiAkYi0+Z2V0UGF0aG5hbWUoKSk7Cn07Cn0gZWxzZWlmIChzZWxmOjpTT1JUX0JZX1RZUEUgPT09ICRzb3J0KSB7CiR0aGlzLT5zb3J0ID0gc3RhdGljIGZ1bmN0aW9uIChcU3BsRmlsZUluZm8gJGEsIFxTcGxGaWxlSW5mbyAkYikgdXNlICgkb3JkZXIpIHsKaWYgKCRhLT5pc0RpcigpICYmICRiLT5pc0ZpbGUoKSkgewpyZXR1cm4gLSRvcmRlcjsKfSBlbHNlaWYgKCRhLT5pc0ZpbGUoKSAmJiAkYi0+aXNEaXIoKSkgewpyZXR1cm4gJG9yZGVyOwp9CgpyZXR1cm4gJG9yZGVyICogc3RyY21wKCRhLT5nZXRSZWFsUGF0aCgpID86ICRhLT5nZXRQYXRobmFtZSgpLCAkYi0+Z2V0UmVhbFBhdGgoKSA/OiAkYi0+Z2V0UGF0aG5hbWUoKSk7Cn07Cn0gZWxzZWlmIChzZWxmOjpTT1JUX0JZX0FDQ0VTU0VEX1RJTUUgPT09ICRzb3J0KSB7CiR0aGlzLT5zb3J0ID0gc3RhdGljIGZ1bmN0aW9uIChcU3BsRmlsZUluZm8gJGEsIFxTcGxGaWxlSW5mbyAkYikgdXNlICgkb3JkZXIpIHsKcmV0dXJuICRvcmRlciAqICgkYS0+Z2V0QVRpbWUoKSAtICRiLT5nZXRBVGltZSgpKTsKfTsKfSBlbHNlaWYgKHNlbGY6OlNPUlRfQllfQ0hBTkdFRF9USU1FID09PSAkc29ydCkgewokdGhpcy0+c29ydCA9IHN0YXRpYyBmdW5jdGlvbiAoXFNwbEZpbGVJbmZvICRhLCBcU3BsRmlsZUluZm8gJGIpIHVzZSAoJG9yZGVyKSB7CnJldHVybiAkb3JkZXIgKiAoJGEtPmdldENUaW1lKCkgLSAkYi0+Z2V0Q1RpbWUoKSk7Cn07Cn0gZWxzZWlmIChzZWxmOjpTT1JUX0JZX01PRElGSUVEX1RJTUUgPT09ICRzb3J0KSB7CiR0aGlzLT5zb3J0ID0gc3RhdGljIGZ1bmN0aW9uIChcU3BsRmlsZUluZm8gJGEsIFxTcGxGaWxlSW5mbyAkYikgdXNlICgkb3JkZXIpIHsKcmV0dXJuICRvcmRlciAqICgkYS0+Z2V0TVRpbWUoKSAtICRiLT5nZXRNVGltZSgpKTsKfTsKfSBlbHNlaWYgKHNlbGY6OlNPUlRfQllfTk9ORSA9PT0gJHNvcnQpIHsKJHRoaXMtPnNvcnQgPSAkb3JkZXI7Cn0gZWxzZWlmIChcaXNfY2FsbGFibGUoJHNvcnQpKSB7CiR0aGlzLT5zb3J0ID0gJHJldmVyc2VPcmRlciA/IHN0YXRpYyBmdW5jdGlvbiAoXFNwbEZpbGVJbmZvICRhLCBcU3BsRmlsZUluZm8gJGIpIHVzZSAoJHNvcnQpIHsgcmV0dXJuIC0kc29ydCgkYSwgJGIpOyB9IDogJHNvcnQ7Cn0gZWxzZSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgU29ydGFibGVJdGVyYXRvciB0YWtlcyBhIFBIUCBjYWxsYWJsZSBvciBhIHZhbGlkIGJ1aWx0LWluIHNvcnQgYWxnb3JpdGhtIGFzIGFuIGFyZ3VtZW50LicpOwp9Cn0KCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKQp7CmlmICgxID09PSAkdGhpcy0+c29ydCkgewpyZXR1cm4gJHRoaXMtPml0ZXJhdG9yOwp9CgokYXJyYXkgPSBpdGVyYXRvcl90b19hcnJheSgkdGhpcy0+aXRlcmF0b3IsIHRydWUpOwoKaWYgKC0xID09PSAkdGhpcy0+c29ydCkgewokYXJyYXkgPSBhcnJheV9yZXZlcnNlKCRhcnJheSk7Cn0gZWxzZSB7CnVhc29ydCgkYXJyYXksICR0aGlzLT5zb3J0KTsKfQoKcmV0dXJuIG5ldyBcQXJyYXlJdGVyYXRvcigkYXJyYXkpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEdpdGlnbm9yZTsKCmZpbmFsIGNsYXNzIFZjc0lnbm9yZWRGaWx0ZXJJdGVyYXRvciBleHRlbmRzIFxGaWx0ZXJJdGVyYXRvcgp7CgoKCnByaXZhdGUgJGJhc2VEaXI7CgoKCgpwcml2YXRlICRnaXRpZ25vcmVGaWxlc0NhY2hlID0gW107CgoKCgpwcml2YXRlICRpZ25vcmVkUGF0aHNDYWNoZSA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxJdGVyYXRvciAkaXRlcmF0b3IsIHN0cmluZyAkYmFzZURpcikKewokdGhpcy0+YmFzZURpciA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRiYXNlRGlyKTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGl0ZXJhdG9yKTsKfQoKcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpOiBib29sCnsKJGZpbGUgPSAkdGhpcy0+Y3VycmVudCgpOwoKJGZpbGVSZWFsUGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRmaWxlLT5nZXRSZWFsUGF0aCgpKTsKCnJldHVybiAhJHRoaXMtPmlzSWdub3JlZCgkZmlsZVJlYWxQYXRoKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBpc0lnbm9yZWQoc3RyaW5nICRmaWxlUmVhbFBhdGgpOiBib29sCnsKaWYgKGlzX2RpcigkZmlsZVJlYWxQYXRoKSAmJiAhc3RyX2VuZHNfd2l0aCgkZmlsZVJlYWxQYXRoLCAnLycpKSB7CiRmaWxlUmVhbFBhdGggLj0gJy8nOwp9CgppZiAoaXNzZXQoJHRoaXMtPmlnbm9yZWRQYXRoc0NhY2hlWyRmaWxlUmVhbFBhdGhdKSkgewpyZXR1cm4gJHRoaXMtPmlnbm9yZWRQYXRoc0NhY2hlWyRmaWxlUmVhbFBhdGhdOwp9CgokaWdub3JlZCA9IGZhbHNlOwoKZm9yZWFjaCAoJHRoaXMtPnBhcmVudHNEaXJlY3RvcnlEb3dud2FyZCgkZmlsZVJlYWxQYXRoKSBhcyAkcGFyZW50RGlyZWN0b3J5KSB7CmlmICgkdGhpcy0+aXNJZ25vcmVkKCRwYXJlbnREaXJlY3RvcnkpKSB7CgpicmVhazsKfQoKJGZpbGVSZWxhdGl2ZVBhdGggPSBzdWJzdHIoJGZpbGVSZWFsUGF0aCwgXHN0cmxlbigkcGFyZW50RGlyZWN0b3J5KSArIDEpOwoKaWYgKG51bGwgPT09ICRyZWdleHBzID0gJHRoaXMtPnJlYWRHaXRpZ25vcmVGaWxlKCJ7JHBhcmVudERpcmVjdG9yeX0vLmdpdGlnbm9yZSIpKSB7CmNvbnRpbnVlOwp9CgpbJGV4Y2x1c2lvblJlZ2V4LCAkaW5jbHVzaW9uUmVnZXhdID0gJHJlZ2V4cHM7CgppZiAocHJlZ19tYXRjaCgkZXhjbHVzaW9uUmVnZXgsICRmaWxlUmVsYXRpdmVQYXRoKSkgewokaWdub3JlZCA9IHRydWU7Cgpjb250aW51ZTsKfQoKaWYgKHByZWdfbWF0Y2goJGluY2x1c2lvblJlZ2V4LCAkZmlsZVJlbGF0aXZlUGF0aCkpIHsKJGlnbm9yZWQgPSBmYWxzZTsKfQp9CgpyZXR1cm4gJHRoaXMtPmlnbm9yZWRQYXRoc0NhY2hlWyRmaWxlUmVhbFBhdGhdID0gJGlnbm9yZWQ7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcGFyZW50c0RpcmVjdG9yeURvd253YXJkKHN0cmluZyAkZmlsZVJlYWxQYXRoKTogYXJyYXkKewokcGFyZW50RGlyZWN0b3JpZXMgPSBbXTsKCiRwYXJlbnREaXJlY3RvcnkgPSAkZmlsZVJlYWxQYXRoOwoKd2hpbGUgKHRydWUpIHsKJG5ld1BhcmVudERpcmVjdG9yeSA9IFxkaXJuYW1lKCRwYXJlbnREaXJlY3RvcnkpOwoKCmlmICgkbmV3UGFyZW50RGlyZWN0b3J5ID09PSAkcGFyZW50RGlyZWN0b3J5KSB7CmJyZWFrOwp9CgokcGFyZW50RGlyZWN0b3J5ID0gJG5ld1BhcmVudERpcmVjdG9yeTsKCmlmICgwICE9PSBzdHJwb3MoJHBhcmVudERpcmVjdG9yeSwgJHRoaXMtPmJhc2VEaXIpKSB7CmJyZWFrOwp9CgokcGFyZW50RGlyZWN0b3JpZXNbXSA9ICRwYXJlbnREaXJlY3Rvcnk7Cn0KCnJldHVybiBhcnJheV9yZXZlcnNlKCRwYXJlbnREaXJlY3Rvcmllcyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVhZEdpdGlnbm9yZUZpbGUoc3RyaW5nICRwYXRoKTogP2FycmF5CnsKaWYgKFxhcnJheV9rZXlfZXhpc3RzKCRwYXRoLCAkdGhpcy0+Z2l0aWdub3JlRmlsZXNDYWNoZSkpIHsKcmV0dXJuICR0aGlzLT5naXRpZ25vcmVGaWxlc0NhY2hlWyRwYXRoXTsKfQoKaWYgKCFmaWxlX2V4aXN0cygkcGF0aCkpIHsKcmV0dXJuICR0aGlzLT5naXRpZ25vcmVGaWxlc0NhY2hlWyRwYXRoXSA9IG51bGw7Cn0KCmlmICghaXNfZmlsZSgkcGF0aCkgfHwgIWlzX3JlYWRhYmxlKCRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBcImlnbm9yZVZDU0lnbm9yZWRcIiBvcHRpb24gY2Fubm90IGJlIHVzZWQgYnkgdGhlIEZpbmRlciBhcyB0aGUgXCJ7JHBhdGh9XCIgZmlsZSBpcyBub3QgcmVhZGFibGUuIik7Cn0KCiRnaXRpZ25vcmVGaWxlQ29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKTsKCnJldHVybiAkdGhpcy0+Z2l0aWdub3JlRmlsZXNDYWNoZVskcGF0aF0gPSBbCkdpdGlnbm9yZTo6dG9SZWdleCgkZ2l0aWdub3JlRmlsZUNvbnRlbnQpLApHaXRpZ25vcmU6OnRvUmVnZXhNYXRjaGluZ05lZ2F0ZWRQYXR0ZXJucygkZ2l0aWdub3JlRmlsZUNvbnRlbnQpLApdOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CnJldHVybiBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsKfQoKcmV0dXJuICRwYXRoOwp9Cn0KCkNvcHlyaWdodCAoYykgMjAwNC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlcjsKCgoKCgoKY2xhc3MgU3BsRmlsZUluZm8gZXh0ZW5kcyBcU3BsRmlsZUluZm8Kewpwcml2YXRlICRyZWxhdGl2ZVBhdGg7CnByaXZhdGUgJHJlbGF0aXZlUGF0aG5hbWU7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGZpbGUsIHN0cmluZyAkcmVsYXRpdmVQYXRoLCBzdHJpbmcgJHJlbGF0aXZlUGF0aG5hbWUpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkZmlsZSk7CiR0aGlzLT5yZWxhdGl2ZVBhdGggPSAkcmVsYXRpdmVQYXRoOwokdGhpcy0+cmVsYXRpdmVQYXRobmFtZSA9ICRyZWxhdGl2ZVBhdGhuYW1lOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlbGF0aXZlUGF0aCgpCnsKcmV0dXJuICR0aGlzLT5yZWxhdGl2ZVBhdGg7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVsYXRpdmVQYXRobmFtZSgpCnsKcmV0dXJuICR0aGlzLT5yZWxhdGl2ZVBhdGhuYW1lOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZW5hbWVXaXRob3V0RXh0ZW5zaW9uKCk6IHN0cmluZwp7CiRmaWxlbmFtZSA9ICR0aGlzLT5nZXRGaWxlbmFtZSgpOwoKcmV0dXJuIHBhdGhpbmZvKCRmaWxlbmFtZSwgXFBBVEhJTkZPX0ZJTEVOQU1FKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZW50cygpCnsKc2V0X2Vycm9yX2hhbmRsZXIoZnVuY3Rpb24gKCR0eXBlLCAkbXNnKSB1c2UgKCYkZXJyb3IpIHsgJGVycm9yID0gJG1zZzsgfSk7CnRyeSB7CiRjb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPmdldFBhdGhuYW1lKCkpOwp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQppZiAoZmFsc2UgPT09ICRjb250ZW50KSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkZXJyb3IpOwp9CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcUG9seWZpbGxcQ3R5cGU7CgoKCgoKCgoKZmluYWwgY2xhc3MgQ3R5cGUKewoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGN0eXBlX2FsbnVtKCR0ZXh0KQp7CiR0ZXh0ID0gc2VsZjo6Y29udmVydF9pbnRfdG9fY2hhcl9mb3JfY3R5cGUoJHRleHQsIF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gXGlzX3N0cmluZygkdGV4dCkgJiYgJycgIT09ICR0ZXh0ICYmICFwcmVnX21hdGNoKCcvW15BLVphLXowLTldLycsICR0ZXh0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjdHlwZV9hbHBoYSgkdGV4dCkKewokdGV4dCA9IHNlbGY6OmNvbnZlcnRfaW50X3RvX2NoYXJfZm9yX2N0eXBlKCR0ZXh0LCBfX0ZVTkNUSU9OX18pOwoKcmV0dXJuIFxpc19zdHJpbmcoJHRleHQpICYmICcnICE9PSAkdGV4dCAmJiAhcHJlZ19tYXRjaCgnL1teQS1aYS16XS8nLCAkdGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3R5cGVfY250cmwoJHRleHQpCnsKJHRleHQgPSBzZWxmOjpjb252ZXJ0X2ludF90b19jaGFyX2Zvcl9jdHlwZSgkdGV4dCwgX19GVU5DVElPTl9fKTsKCnJldHVybiBcaXNfc3RyaW5nKCR0ZXh0KSAmJiAnJyAhPT0gJHRleHQgJiYgIXByZWdfbWF0Y2goJy9bXlx4MDAtXHgxZlx4N2ZdLycsICR0ZXh0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjdHlwZV9kaWdpdCgkdGV4dCkKewokdGV4dCA9IHNlbGY6OmNvbnZlcnRfaW50X3RvX2NoYXJfZm9yX2N0eXBlKCR0ZXh0LCBfX0ZVTkNUSU9OX18pOwoKcmV0dXJuIFxpc19zdHJpbmcoJHRleHQpICYmICcnICE9PSAkdGV4dCAmJiAhcHJlZ19tYXRjaCgnL1teMC05XS8nLCAkdGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3R5cGVfZ3JhcGgoJHRleHQpCnsKJHRleHQgPSBzZWxmOjpjb252ZXJ0X2ludF90b19jaGFyX2Zvcl9jdHlwZSgkdGV4dCwgX19GVU5DVElPTl9fKTsKCnJldHVybiBcaXNfc3RyaW5nKCR0ZXh0KSAmJiAnJyAhPT0gJHRleHQgJiYgIXByZWdfbWF0Y2goJy9bXiEtfl0vJywgJHRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGN0eXBlX2xvd2VyKCR0ZXh0KQp7CiR0ZXh0ID0gc2VsZjo6Y29udmVydF9pbnRfdG9fY2hhcl9mb3JfY3R5cGUoJHRleHQsIF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gXGlzX3N0cmluZygkdGV4dCkgJiYgJycgIT09ICR0ZXh0ICYmICFwcmVnX21hdGNoKCcvW15hLXpdLycsICR0ZXh0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjdHlwZV9wcmludCgkdGV4dCkKewokdGV4dCA9IHNlbGY6OmNvbnZlcnRfaW50X3RvX2NoYXJfZm9yX2N0eXBlKCR0ZXh0LCBfX0ZVTkNUSU9OX18pOwoKcmV0dXJuIFxpc19zdHJpbmcoJHRleHQpICYmICcnICE9PSAkdGV4dCAmJiAhcHJlZ19tYXRjaCgnL1teIC1+XS8nLCAkdGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3R5cGVfcHVuY3QoJHRleHQpCnsKJHRleHQgPSBzZWxmOjpjb252ZXJ0X2ludF90b19jaGFyX2Zvcl9jdHlwZSgkdGV4dCwgX19GVU5DVElPTl9fKTsKCnJldHVybiBcaXNfc3RyaW5nKCR0ZXh0KSAmJiAnJyAhPT0gJHRleHQgJiYgIXByZWdfbWF0Y2goJy9bXiEtXC9cOi1AXFstYFx7LX5dLycsICR0ZXh0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjdHlwZV9zcGFjZSgkdGV4dCkKewokdGV4dCA9IHNlbGY6OmNvbnZlcnRfaW50X3RvX2NoYXJfZm9yX2N0eXBlKCR0ZXh0LCBfX0ZVTkNUSU9OX18pOwoKcmV0dXJuIFxpc19zdHJpbmcoJHRleHQpICYmICcnICE9PSAkdGV4dCAmJiAhcHJlZ19tYXRjaCgnL1teXHNdLycsICR0ZXh0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjdHlwZV91cHBlcigkdGV4dCkKewokdGV4dCA9IHNlbGY6OmNvbnZlcnRfaW50X3RvX2NoYXJfZm9yX2N0eXBlKCR0ZXh0LCBfX0ZVTkNUSU9OX18pOwoKcmV0dXJuIFxpc19zdHJpbmcoJHRleHQpICYmICcnICE9PSAkdGV4dCAmJiAhcHJlZ19tYXRjaCgnL1teQS1aXS8nLCAkdGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3R5cGVfeGRpZ2l0KCR0ZXh0KQp7CiR0ZXh0ID0gc2VsZjo6Y29udmVydF9pbnRfdG9fY2hhcl9mb3JfY3R5cGUoJHRleHQsIF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gXGlzX3N0cmluZygkdGV4dCkgJiYgJycgIT09ICR0ZXh0ICYmICFwcmVnX21hdGNoKCcvW15BLUZhLWYwLTldLycsICR0ZXh0KTsKfQoKCgoKCgoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvbnZlcnRfaW50X3RvX2NoYXJfZm9yX2N0eXBlKCRpbnQsICRmdW5jdGlvbikKewppZiAoIVxpc19pbnQoJGludCkpIHsKcmV0dXJuICRpbnQ7Cn0KCmlmICgkaW50IDwgLTEyOCB8fCAkaW50ID4gMjU1KSB7CnJldHVybiAoc3RyaW5nKSAkaW50Owp9CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMTAwKSB7CkB0cmlnZ2VyX2Vycm9yKCRmdW5jdGlvbi4nKCk6IEFyZ3VtZW50IG9mIHR5cGUgaW50IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgc3RyaW5nIGluIHRoZSBmdXR1cmUnLCBcRV9VU0VSX0RFUFJFQ0FURUQpOwp9CgppZiAoJGludCA8IDApIHsKJGludCArPSAyNTY7Cn0KCnJldHVybiBcY2hyKCRpbnQpOwp9Cn0KCkNvcHlyaWdodCAoYykgMjAxOC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcQ3R5cGUgYXMgcDsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKcmV0dXJuIHJlcXVpcmUgX19ESVJfXy4nL2Jvb3RzdHJhcDgwLnBocCc7Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9hbG51bScpKSB7CmZ1bmN0aW9uIGN0eXBlX2FsbnVtKCR0ZXh0KSB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9hbG51bSgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfYWxwaGEnKSkgewpmdW5jdGlvbiBjdHlwZV9hbHBoYSgkdGV4dCkgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfYWxwaGEoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX2NudHJsJykpIHsKZnVuY3Rpb24gY3R5cGVfY250cmwoJHRleHQpIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX2NudHJsKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9kaWdpdCcpKSB7CmZ1bmN0aW9uIGN0eXBlX2RpZ2l0KCR0ZXh0KSB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9kaWdpdCgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfZ3JhcGgnKSkgewpmdW5jdGlvbiBjdHlwZV9ncmFwaCgkdGV4dCkgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfZ3JhcGgoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX2xvd2VyJykpIHsKZnVuY3Rpb24gY3R5cGVfbG93ZXIoJHRleHQpIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX2xvd2VyKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9wcmludCcpKSB7CmZ1bmN0aW9uIGN0eXBlX3ByaW50KCR0ZXh0KSB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9wcmludCgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfcHVuY3QnKSkgewpmdW5jdGlvbiBjdHlwZV9wdW5jdCgkdGV4dCkgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfcHVuY3QoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX3NwYWNlJykpIHsKZnVuY3Rpb24gY3R5cGVfc3BhY2UoJHRleHQpIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX3NwYWNlKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV91cHBlcicpKSB7CmZ1bmN0aW9uIGN0eXBlX3VwcGVyKCR0ZXh0KSB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV91cHBlcigkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfeGRpZ2l0JykpIHsKZnVuY3Rpb24gY3R5cGVfeGRpZ2l0KCR0ZXh0KSB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV94ZGlnaXQoJHRleHQpOyB9Cn0KPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXEN0eXBlIGFzIHA7CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfYWxudW0nKSkgewpmdW5jdGlvbiBjdHlwZV9hbG51bShtaXhlZCAkdGV4dCk6IGJvb2wgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfYWxudW0oJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX2FscGhhJykpIHsKZnVuY3Rpb24gY3R5cGVfYWxwaGEobWl4ZWQgJHRleHQpOiBib29sIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX2FscGhhKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9jbnRybCcpKSB7CmZ1bmN0aW9uIGN0eXBlX2NudHJsKG1peGVkICR0ZXh0KTogYm9vbCB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9jbnRybCgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfZGlnaXQnKSkgewpmdW5jdGlvbiBjdHlwZV9kaWdpdChtaXhlZCAkdGV4dCk6IGJvb2wgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfZGlnaXQoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX2dyYXBoJykpIHsKZnVuY3Rpb24gY3R5cGVfZ3JhcGgobWl4ZWQgJHRleHQpOiBib29sIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX2dyYXBoKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9sb3dlcicpKSB7CmZ1bmN0aW9uIGN0eXBlX2xvd2VyKG1peGVkICR0ZXh0KTogYm9vbCB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9sb3dlcigkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfcHJpbnQnKSkgewpmdW5jdGlvbiBjdHlwZV9wcmludChtaXhlZCAkdGV4dCk6IGJvb2wgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfcHJpbnQoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX3B1bmN0JykpIHsKZnVuY3Rpb24gY3R5cGVfcHVuY3QobWl4ZWQgJHRleHQpOiBib29sIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX3B1bmN0KCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9zcGFjZScpKSB7CmZ1bmN0aW9uIGN0eXBlX3NwYWNlKG1peGVkICR0ZXh0KTogYm9vbCB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9zcGFjZSgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfdXBwZXInKSkgewpmdW5jdGlvbiBjdHlwZV91cHBlcihtaXhlZCAkdGV4dCk6IGJvb2wgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfdXBwZXIoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX3hkaWdpdCcpKSB7CmZ1bmN0aW9uIGN0eXBlX3hkaWdpdChtaXhlZCAkdGV4dCk6IGJvb2wgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfeGRpZ2l0KCR0ZXh0KTsgfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxQb2x5ZmlsbFxJbnRsXEdyYXBoZW1lOwoKXGRlZmluZSgnU1lNRk9OWV9HUkFQSEVNRV9DTFVTVEVSX1JYJywgKChmbG9hdCkgXFBDUkVfVkVSU0lPTiA8IDEwID8gKGZsb2F0KSBcUENSRV9WRVJTSU9OID49IDguMzIgOiAoZmxvYXQpIFxQQ1JFX1ZFUlNJT04gPj0gMTAuMzkpID8gJ1xYJyA6IEdyYXBoZW1lOjpHUkFQSEVNRV9DTFVTVEVSX1JYKTsKCgoKCgoKCgoKCgoKCgoKCgoKCmZpbmFsIGNsYXNzIEdyYXBoZW1lCnsKCgpwdWJsaWMgY29uc3QgR1JBUEhFTUVfQ0xVU1RFUl9SWCA9ICcoPzpcclxufCg/OlsgLX5ceHsyMDBDfVx4ezIwMER9XXxb4YaoLeGHuV0rfFvhhIAt4YWfXSooPzpb6rCA6rCc6rC46rGU6rGw6rKM6rKo6rOE6rOg6rO86rSY6rS06rWQ6rWs6raI6rak6reA6rec6re46riU6riw6rmM6rmo6rqE6rqg6rq86ruY6ru06ryQ6rys6r2I6r2k6r6A6r6c6r646r+U6r+w64CM64Co64GE64Gg64G864KY64K064OQ64Os64SI64Sk64WA64Wc64W464aU64aw64eM64eo64iE64ig64i864mY64m064qQ64qs64uI64uk64yA64yc64y4642U642w646M646o64+E64+g64+865CY65C065GQ65Gs65KI65Kk65OA65Oc65O465SU65Sw65WM65Wo65aE65ag65a865eY65e065iQ65is65mI65mk65qA65qc65q465uU65uw65yM65yo652E652g6528656Y656065+Q65+s66CI66Ck66GA66Gc66G466KU66Kw66OM66Oo66SE66Sg66S866WY66W066aQ66as66eI66ek66iA66ic66i466mU66mw66qM66qo66uE66ug66u866yY66y0662Q662s666I666k66+A66+c66+467CU67Cw67GM67Go67KE67Kg67K867OY67O067SQ67Ss67WI67Wk67aA67ac67a467eU67ew67iM67io67mE67mg67m867qY67q067uQ67us67yI67yk672A672c6724676U676w67+M67+o7ICE7ICg7IC87IGY7IG07IKQ7IKs7IOI7IOk7ISA7ISc7IS47IWU7IWw7IaM7Iao7IeE7Ieg7Ie87IiY7Ii07ImQ7Ims7IqI7Iqk7IuA7Iuc7Iu47IyU7Iyw7I2M7I2o7I6E7I6g7I687I+Y7I+07JCQ7JCs7JGI7JGk7JKA7JKc7JK47JOU7JOw7JSM7JSo7JWE7JWg7JW87JaY7Ja07JeQ7Jes7JiI7Jik7JmA7Jmc7Jm47JqU7Jqw7JuM7Juo7JyE7Jyg7Jy87J2Y7J207J6Q7J6s7J+I7J+k7KCA7KCc7KC47KGU7KGw7KKM7KKo7KOE7KOg7KO87KSY7KS07KWQ7KWs7KaI7Kak7KeA7Kec7Ke47KiU7Kiw7KmM7Kmo7KqE7Kqg7Kq87KuY7Ku07KyQ7Kys7K2I7K2k7K6A7K6c7K647K+U7K+w7LCM7LCo7LGE7LGg7LG87LKY7LK07LOQ7LOs7LSI7LSk7LWA7LWc7LW47LaU7Law7LeM7Leo7LiE7Lig7Li87LmY7Lm07LqQ7Lqs7LuI7Luk7LyA7Lyc7Ly47L2U7L2w7L6M7L6o7L+E7L+g7L+87YCY7YC07YGQ7YGs7YKI7YKk7YOA7YOc7YO47YSU7YSw7YWM7YWo7YaE7Yag7Ya87YeY7Ye07YiQ7Yis7YmI7Ymk7YqA7Yqc7Yq47YuU7Yuw7YyM7Yyo7Y2E7Y2g7Y287Y6Y7Y607Y+Q7Y+s7ZCI7ZCk7ZGA7ZGc7ZG47ZKU7ZKw7ZOM7ZOo7ZSE7ZSg7ZS87ZWY7ZW07ZaQ7Zas7ZeI7Zek7ZiA7Zic7Zi47ZmU7Zmw7ZqM7Zqo7ZuE7Zug7Zu87ZyY7Zy07Z2Q7Z2s7Z6IXT9b4YWgLeGGol0rfFvqsIAt7Z6jXSlb4YaoLeGHuV0qfFvhhIAt4YWfXSt8W15ccHtDY31ccHtDZn1ccHtabH1ccHtacH1dKVtccHtNbn1ccHtNZX1ceHswOUJFfVx4ezA5RDd9XHh7MEIzRX1ceHswQjU3fVx4ezBCQkV9XHh7MEJEN31ceHswQ0MyfVx4ezBDRDV9XHh7MENENn1ceHswRDNFfVx4ezBENTd9XHh7MERDRn1ceHswRERGfVx4ezIwMEN9XHh7MjAwRH1ceHsxRDE2NX1ceHsxRDE2RX0tXHh7MUQxNzJ9XSp8W1xwe0NjfVxwe0NmfVxwe1psfVxwe1pwfV0pJzsKCnByaXZhdGUgY29uc3QgQ0FTRV9GT0xEID0gWwpbJ8K1JywgJ8W/JywgIlx4Q0RceDg1IiwgJ8+CJywgIlx4Q0ZceDkwIiwgIlx4Q0ZceDkxIiwgIlx4Q0ZceDk1IiwgIlx4Q0ZceDk2IiwgIlx4Q0ZceEIwIiwgIlx4Q0ZceEIxIiwgIlx4Q0ZceEI1IiwgIlx4RTFceEJBXHg5QiIsICJceEUxXHhCRVx4QkUiXSwKWyfOvCcsICdzJywgJ865JywgJ8+DJywgJ86yJywgJ864JywgJ8+GJywgJ8+AJywgJ866JywgJ8+BJywgJ861JywgIlx4RTFceEI5XHhBMSIsICfOuSddLApdOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9leHRyYWN0KCRzLCAkc2l6ZSwgJHR5cGUgPSBcR1JBUEhFTUVfRVhUUl9DT1VOVCwgJHN0YXJ0ID0gMCwgJiRuZXh0ID0gMCkKewppZiAoMCA+ICRzdGFydCkgewokc3RhcnQgPSBcc3RybGVuKCRzKSArICRzdGFydDsKfQoKaWYgKCFcaXNfc2NhbGFyKCRzKSkgewokaGFzRXJyb3IgPSBmYWxzZTsKc2V0X2Vycm9yX2hhbmRsZXIoZnVuY3Rpb24gKCkgdXNlICgmJGhhc0Vycm9yKSB7ICRoYXNFcnJvciA9IHRydWU7IH0pOwokbmV4dCA9IHN1YnN0cigkcywgJHN0YXJ0KTsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7CmlmICgkaGFzRXJyb3IpIHsKc3Vic3RyKCRzLCAkc3RhcnQpOwokcyA9ICcnOwp9IGVsc2UgewokcyA9ICRuZXh0Owp9Cn0gZWxzZSB7CiRzID0gc3Vic3RyKCRzLCAkc3RhcnQpOwp9CiRzaXplID0gKGludCkgJHNpemU7CiR0eXBlID0gKGludCkgJHR5cGU7CiRzdGFydCA9IChpbnQpICRzdGFydDsKCmlmIChcR1JBUEhFTUVfRVhUUl9DT1VOVCAhPT0gJHR5cGUgJiYgXEdSQVBIRU1FX0VYVFJfTUFYQllURVMgIT09ICR0eXBlICYmIFxHUkFQSEVNRV9FWFRSX01BWENIQVJTICE9PSAkdHlwZSkgewppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoJ2dyYXBoZW1lX2V4dHJhY3QoKTogQXJndW1lbnQgIzMgKCR0eXBlKSBtdXN0IGJlIG9uZSBvZiBHUkFQSEVNRV9FWFRSX0NPVU5ULCBHUkFQSEVNRV9FWFRSX01BWEJZVEVTLCBvciBHUkFQSEVNRV9FWFRSX01BWENIQVJTJyk7Cn0KCmlmICghaXNzZXQoJHNbMF0pIHx8IDAgPiAkc2l6ZSB8fCAwID4gJHN0YXJ0KSB7CnJldHVybiBmYWxzZTsKfQppZiAoMCA9PT0gJHNpemUpIHsKcmV0dXJuICcnOwp9CgokbmV4dCA9ICRzdGFydDsKCiRzID0gcHJlZ19zcGxpdCgnLygnLlNZTUZPTllfR1JBUEhFTUVfQ0xVU1RFUl9SWC4nKS91JywgIlxyXG4iLiRzLCAkc2l6ZSArIDEsIFxQUkVHX1NQTElUX05PX0VNUFRZIHwgXFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRSk7CgppZiAoIWlzc2V0KCRzWzFdKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRpID0gMTsKJHJldCA9ICcnOwoKZG8gewppZiAoXEdSQVBIRU1FX0VYVFJfQ09VTlQgPT09ICR0eXBlKSB7Ci0tJHNpemU7Cn0gZWxzZWlmIChcR1JBUEhFTUVfRVhUUl9NQVhCWVRFUyA9PT0gJHR5cGUpIHsKJHNpemUgLT0gXHN0cmxlbigkc1skaV0pOwp9IGVsc2Ugewokc2l6ZSAtPSBpY29udl9zdHJsZW4oJHNbJGldLCAnVVRGLTgvL0lHTk9SRScpOwp9CgppZiAoJHNpemUgPj0gMCkgewokcmV0IC49ICRzWyRpXTsKfQp9IHdoaWxlIChpc3NldCgkc1srKyRpXSkgJiYgJHNpemUgPiAwKTsKCiRuZXh0ICs9IFxzdHJsZW4oJHJldCk7CgpyZXR1cm4gJHJldDsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9zdHJsZW4oJHMpCnsKcHJlZ19yZXBsYWNlKCcvJy5TWU1GT05ZX0dSQVBIRU1FX0NMVVNURVJfUlguJy91JywgJycsICRzLCAtMSwgJGxlbik7CgpyZXR1cm4gMCA9PT0gJGxlbiAmJiAnJyAhPT0gJHMgPyBudWxsIDogJGxlbjsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9zdWJzdHIoJHMsICRzdGFydCwgJGxlbiA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRsZW4pIHsKJGxlbiA9IDIxNDc0ODM2NDc7Cn0KCnByZWdfbWF0Y2hfYWxsKCcvJy5TWU1GT05ZX0dSQVBIRU1FX0NMVVNURVJfUlguJy91JywgJHMsICRzKTsKCiRzbGVuID0gXGNvdW50KCRzWzBdKTsKJHN0YXJ0ID0gKGludCkgJHN0YXJ0OwoKaWYgKDAgPiAkc3RhcnQpIHsKJHN0YXJ0ICs9ICRzbGVuOwp9CmlmICgwID4gJHN0YXJ0KSB7CmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewpyZXR1cm4gZmFsc2U7Cn0KCiRzdGFydCA9IDA7Cn0KaWYgKCRzdGFydCA+PSAkc2xlbikgewpyZXR1cm4gXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwID8gJycgOiBmYWxzZTsKfQoKJHJlbSA9ICRzbGVuIC0gJHN0YXJ0OwoKaWYgKDAgPiAkbGVuKSB7CiRsZW4gKz0gJHJlbTsKfQppZiAoMCA9PT0gJGxlbikgewpyZXR1cm4gJyc7Cn0KaWYgKDAgPiAkbGVuKSB7CnJldHVybiBcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDAgPyAnJyA6IGZhbHNlOwp9CmlmICgkbGVuID4gJHJlbSkgewokbGVuID0gJHJlbTsKfQoKcmV0dXJuIGltcGxvZGUoJycsIFxhcnJheV9zbGljZSgkc1swXSwgJHN0YXJ0LCAkbGVuKSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3RycG9zKCRzLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkKewpyZXR1cm4gc2VsZjo6Z3JhcGhlbWVfcG9zaXRpb24oJHMsICRuZWVkbGUsICRvZmZzZXQsIDApOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX3N0cmlwb3MoJHMsICRuZWVkbGUsICRvZmZzZXQgPSAwKQp7CnJldHVybiBzZWxmOjpncmFwaGVtZV9wb3NpdGlvbigkcywgJG5lZWRsZSwgJG9mZnNldCwgMSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3RycnBvcygkcywgJG5lZWRsZSwgJG9mZnNldCA9IDApCnsKcmV0dXJuIHNlbGY6OmdyYXBoZW1lX3Bvc2l0aW9uKCRzLCAkbmVlZGxlLCAkb2Zmc2V0LCAyKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9zdHJyaXBvcygkcywgJG5lZWRsZSwgJG9mZnNldCA9IDApCnsKcmV0dXJuIHNlbGY6OmdyYXBoZW1lX3Bvc2l0aW9uKCRzLCAkbmVlZGxlLCAkb2Zmc2V0LCAzKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9zdHJpc3RyKCRzLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlID0gZmFsc2UpCnsKcmV0dXJuIG1iX3N0cmlzdHIoJHMsICRuZWVkbGUsICRiZWZvcmVOZWVkbGUsICdVVEYtOCcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX3N0cnN0cigkcywgJG5lZWRsZSwgJGJlZm9yZU5lZWRsZSA9IGZhbHNlKQp7CnJldHVybiBtYl9zdHJzdHIoJHMsICRuZWVkbGUsICRiZWZvcmVOZWVkbGUsICdVVEYtOCcpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9wb3NpdGlvbigkcywgJG5lZWRsZSwgJG9mZnNldCwgJG1vZGUpCnsKJG5lZWRsZSA9IChzdHJpbmcpICRuZWVkbGU7CmlmICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCAmJiAhcHJlZ19tYXRjaCgnLy4vdXMnLCAkbmVlZGxlKSkgewpyZXR1cm4gZmFsc2U7Cn0KJHMgPSAoc3RyaW5nKSAkczsKaWYgKCFwcmVnX21hdGNoKCcvLi91cycsICRzKSkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCRvZmZzZXQgPiAwKSB7CiRzID0gc2VsZjo6Z3JhcGhlbWVfc3Vic3RyKCRzLCAkb2Zmc2V0KTsKfSBlbHNlaWYgKCRvZmZzZXQgPCAwKSB7CmlmICgyID4gJG1vZGUpIHsKJG9mZnNldCArPSBzZWxmOjpncmFwaGVtZV9zdHJsZW4oJHMpOwokcyA9IHNlbGY6OmdyYXBoZW1lX3N1YnN0cigkcywgJG9mZnNldCk7CmlmICgwID4gJG9mZnNldCkgewokb2Zmc2V0ID0gMDsKfQp9IGVsc2VpZiAoMCA+ICRvZmZzZXQgKz0gc2VsZjo6Z3JhcGhlbWVfc3RybGVuKCRuZWVkbGUpKSB7CiRzID0gc2VsZjo6Z3JhcGhlbWVfc3Vic3RyKCRzLCAwLCAkb2Zmc2V0KTsKJG9mZnNldCA9IDA7Cn0gZWxzZSB7CiRvZmZzZXQgPSAwOwp9Cn0KCgoKCiRjYXNlSW5zZW5zaXRpdmUgPSAkbW9kZSAmIDE7CiRyZXZlcnNlID0gJG1vZGUgJiAyOwppZiAoJGNhc2VJbnNlbnNpdGl2ZSkgewoKCgokbW9kZSA9IFxkZWZpbmVkKCdNQl9DQVNFX0ZPTERfU0lNUExFJykgPyBcTUJfQ0FTRV9GT0xEX1NJTVBMRSA6IFxNQl9DQVNFX0xPV0VSOwokcyA9IG1iX2NvbnZlcnRfY2FzZSgkcywgJG1vZGUsICdVVEYtOCcpOwokbmVlZGxlID0gbWJfY29udmVydF9jYXNlKCRuZWVkbGUsICRtb2RlLCAnVVRGLTgnKTsKCmlmICghXGRlZmluZWQoJ01CX0NBU0VfRk9MRF9TSU1QTEUnKSkgewokcyA9IHN0cl9yZXBsYWNlKHNlbGY6OkNBU0VfRk9MRFswXSwgc2VsZjo6Q0FTRV9GT0xEWzFdLCAkcyk7CiRuZWVkbGUgPSBzdHJfcmVwbGFjZShzZWxmOjpDQVNFX0ZPTERbMF0sIHNlbGY6OkNBU0VfRk9MRFsxXSwgJG5lZWRsZSk7Cn0KfQppZiAoJHJldmVyc2UpIHsKJG5lZWRsZVBvcyA9IHN0cnJwb3MoJHMsICRuZWVkbGUpOwp9IGVsc2UgewokbmVlZGxlUG9zID0gc3RycG9zKCRzLCAkbmVlZGxlKTsKfQoKcmV0dXJuIGZhbHNlICE9PSAkbmVlZGxlUG9zID8gc2VsZjo6Z3JhcGhlbWVfc3RybGVuKHN1YnN0cigkcywgMCwgJG5lZWRsZVBvcykpICsgJG9mZnNldCA6IGZhbHNlOwp9Cn0KCkNvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcSW50bFxHcmFwaGVtZSBhcyBwOwoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ2ludGwnKSkgewpyZXR1cm47Cn0KCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKcmV0dXJuIHJlcXVpcmUgX19ESVJfXy4nL2Jvb3RzdHJhcDgwLnBocCc7Cn0KCmlmICghZGVmaW5lZCgnR1JBUEhFTUVfRVhUUl9DT1VOVCcpKSB7CmRlZmluZSgnR1JBUEhFTUVfRVhUUl9DT1VOVCcsIDApOwp9CmlmICghZGVmaW5lZCgnR1JBUEhFTUVfRVhUUl9NQVhCWVRFUycpKSB7CmRlZmluZSgnR1JBUEhFTUVfRVhUUl9NQVhCWVRFUycsIDEpOwp9CmlmICghZGVmaW5lZCgnR1JBUEhFTUVfRVhUUl9NQVhDSEFSUycpKSB7CmRlZmluZSgnR1JBUEhFTUVfRVhUUl9NQVhDSEFSUycsIDIpOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfZXh0cmFjdCcpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX2V4dHJhY3QoJGhheXN0YWNrLCAkc2l6ZSwgJHR5cGUgPSAwLCAkc3RhcnQgPSAwLCAmJG5leHQgPSAwKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9leHRyYWN0KCRoYXlzdGFjaywgJHNpemUsICR0eXBlLCAkc3RhcnQsICRuZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJpcG9zJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RyaXN0cicpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cmlzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlID0gZmFsc2UpIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cmlzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJsZW4nKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJsZW4oJGlucHV0KSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJsZW4oJGlucHV0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3Rycmlwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cnJwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDApIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJzdHInKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlID0gZmFsc2UpIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cnN0cigkaGF5c3RhY2ssICRuZWVkbGUsICRiZWZvcmVOZWVkbGUpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N1YnN0cicpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N1YnN0cigkc3RyaW5nLCAkb2Zmc2V0LCAkbGVuZ3RoID0gbnVsbCkgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3Vic3RyKCRzdHJpbmcsICRvZmZzZXQsICRsZW5ndGgpOyB9Cn0KPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXEludGxcR3JhcGhlbWUgYXMgcDsKCmlmICghZGVmaW5lZCgnR1JBUEhFTUVfRVhUUl9DT1VOVCcpKSB7CmRlZmluZSgnR1JBUEhFTUVfRVhUUl9DT1VOVCcsIDApOwp9CmlmICghZGVmaW5lZCgnR1JBUEhFTUVfRVhUUl9NQVhCWVRFUycpKSB7CmRlZmluZSgnR1JBUEhFTUVfRVhUUl9NQVhCWVRFUycsIDEpOwp9CmlmICghZGVmaW5lZCgnR1JBUEhFTUVfRVhUUl9NQVhDSEFSUycpKSB7CmRlZmluZSgnR1JBUEhFTUVfRVhUUl9NQVhDSEFSUycsIDIpOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfZXh0cmFjdCcpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX2V4dHJhY3QoP3N0cmluZyAkaGF5c3RhY2ssID9pbnQgJHNpemUsID9pbnQgJHR5cGUgPSBHUkFQSEVNRV9FWFRSX0NPVU5ULCA/aW50ICRvZmZzZXQgPSAwLCAmJG5leHQgPSBudWxsKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX2V4dHJhY3QoKHN0cmluZykgJGhheXN0YWNrLCAoaW50KSAkc2l6ZSwgKGludCkgJHR5cGUsIChpbnQpICRvZmZzZXQsICRuZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJpcG9zJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RyaXBvcyg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/aW50ICRvZmZzZXQgPSAwKTogaW50fGZhbHNlIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cmlwb3MoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoaW50KSAkb2Zmc2V0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJpc3RyJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RyaXN0cig/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/Ym9vbCAkYmVmb3JlTmVlZGxlID0gZmFsc2UpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RyaXN0cigoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChib29sKSAkYmVmb3JlTmVlZGxlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJsZW4nKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJsZW4oP3N0cmluZyAkc3RyaW5nKTogaW50fGZhbHNlfG51bGwgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RybGVuKChzdHJpbmcpICRzdHJpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cnBvcycpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cnBvcyg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/aW50ICRvZmZzZXQgPSAwKTogaW50fGZhbHNlIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cnBvcygoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChpbnQpICRvZmZzZXQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cnJpcG9zJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3Rycmlwb3MoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2ludCAkb2Zmc2V0ID0gMCk6IGludHxmYWxzZSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJyaXBvcygoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChpbnQpICRvZmZzZXQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cnJwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJycG9zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9pbnQgJG9mZnNldCA9IDApOiBpbnR8ZmFsc2UgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RycnBvcygoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChpbnQpICRvZmZzZXQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cnN0cicpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cnN0cig/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/Ym9vbCAkYmVmb3JlTmVlZGxlID0gZmFsc2UpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3Ryc3RyKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGJvb2wpICRiZWZvcmVOZWVkbGUpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N1YnN0cicpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N1YnN0cig/c3RyaW5nICRzdHJpbmcsID9pbnQgJG9mZnNldCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdWJzdHIoKHN0cmluZykgJHN0cmluZywgKGludCkgJG9mZnNldCwgJGxlbmd0aCk7IH0KfQoKQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxQb2x5ZmlsbFxJbnRsXE5vcm1hbGl6ZXI7CgoKCgoKCgoKCgoKY2xhc3MgTm9ybWFsaXplcgp7CnB1YmxpYyBjb25zdCBGT1JNX0QgPSBcTm9ybWFsaXplcjo6Rk9STV9EOwpwdWJsaWMgY29uc3QgRk9STV9LRCA9IFxOb3JtYWxpemVyOjpGT1JNX0tEOwpwdWJsaWMgY29uc3QgRk9STV9DID0gXE5vcm1hbGl6ZXI6OkZPUk1fQzsKcHVibGljIGNvbnN0IEZPUk1fS0MgPSBcTm9ybWFsaXplcjo6Rk9STV9LQzsKcHVibGljIGNvbnN0IE5GRCA9IFxOb3JtYWxpemVyOjpORkQ7CnB1YmxpYyBjb25zdCBORktEID0gXE5vcm1hbGl6ZXI6Ok5GS0Q7CnB1YmxpYyBjb25zdCBORkMgPSBcTm9ybWFsaXplcjo6TkZDOwpwdWJsaWMgY29uc3QgTkZLQyA9IFxOb3JtYWxpemVyOjpORktDOwoKcHJpdmF0ZSBzdGF0aWMgJEM7CnByaXZhdGUgc3RhdGljICREOwpwcml2YXRlIHN0YXRpYyAkS0Q7CnByaXZhdGUgc3RhdGljICRjQzsKcHJpdmF0ZSBzdGF0aWMgJHVsZW5NYXNrID0gWyJceEMwIiA9PiAyLCAiXHhEMCIgPT4gMiwgIlx4RTAiID0+IDMsICJceEYwIiA9PiA0XTsKcHJpdmF0ZSBzdGF0aWMgJEFTQ0lJID0gIlx4MjBceDY1XHg2OVx4NjFceDczXHg2RVx4NzRceDcyXHg2Rlx4NkNceDc1XHg2NFx4NURceDVCXHg2M1x4NkRceDcwXHgyN1x4MEFceDY3XHg3Q1x4NjhceDc2XHgyRVx4NjZceDYyXHgyQ1x4M0FceDNEXHgyRFx4NzFceDMxXHgzMFx4NDNceDMyXHgyQVx4NzlceDc4XHgyOVx4MjhceDRDXHgzOVx4NDFceDUzXHgyRlx4NTBceDIyXHg0NVx4NkFceDREXHg0OVx4NkJceDMzXHgzRVx4MzVceDU0XHgzQ1x4NDRceDM0XHg3RFx4NDJceDdCXHgzOFx4NDZceDc3XHg1Mlx4MzZceDM3XHg1NVx4NDdceDRFXHgzQlx4NEFceDdBXHg1Nlx4MjNceDQ4XHg0Rlx4NTdceDVGXHgyNlx4MjFceDRCXHgzRlx4NThceDUxXHgyNVx4NTlceDVDXHgwOVx4NUFceDJCXHg3RVx4NUVceDI0XHg0MFx4NjBceDdGXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwQlx4MENceDBEXHgwRVx4MEZceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5XHgxQVx4MUJceDFDXHgxRFx4MUVceDFGIjsKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNOb3JtYWxpemVkKHN0cmluZyAkcywgaW50ICRmb3JtID0gc2VsZjo6Rk9STV9DKQp7CmlmICghXGluX2FycmF5KCRmb3JtLCBbc2VsZjo6TkZELCBzZWxmOjpORktELCBzZWxmOjpORkMsIHNlbGY6Ok5GS0NdKSkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCFpc3NldCgkc1tzdHJzcG4oJHMsIHNlbGY6OiRBU0NJSSldKSkgewpyZXR1cm4gdHJ1ZTsKfQppZiAoc2VsZjo6TkZDID09ICRmb3JtICYmIHByZWdfbWF0Y2goJy8vdScsICRzKSAmJiAhcHJlZ19tYXRjaCgnL1teXHgwMC1ceHsyRkZ9XS91JywgJHMpKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gc2VsZjo6bm9ybWFsaXplKCRzLCAkZm9ybSkgPT09ICRzOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZShzdHJpbmcgJHMsIGludCAkZm9ybSA9IHNlbGY6OkZPUk1fQykKewppZiAoIXByZWdfbWF0Y2goJy8vdScsICRzKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnN3aXRjaCAoJGZvcm0pIHsKY2FzZSBzZWxmOjpORkM6ICRDID0gdHJ1ZTsgJEsgPSBmYWxzZTsgYnJlYWs7CmNhc2Ugc2VsZjo6TkZEOiAkQyA9IGZhbHNlOyAkSyA9IGZhbHNlOyBicmVhazsKY2FzZSBzZWxmOjpORktDOiAkQyA9IHRydWU7ICRLID0gdHJ1ZTsgYnJlYWs7CmNhc2Ugc2VsZjo6TkZLRDogJEMgPSBmYWxzZTsgJEsgPSB0cnVlOyBicmVhazsKZGVmYXVsdDoKaWYgKFxkZWZpbmVkKCdOb3JtYWxpemVyOjpOT05FJykgJiYgXE5vcm1hbGl6ZXI6Ok5PTkUgPT0gJGZvcm0pIHsKcmV0dXJuICRzOwp9CgppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoJ25vcm1hbGl6ZXJfbm9ybWFsaXplKCk6IEFyZ3VtZW50ICMyICgkZm9ybSkgbXVzdCBiZSBhIGEgdmFsaWQgbm9ybWFsaXphdGlvbiBmb3JtJyk7Cn0KCmlmICgnJyA9PT0gJHMpIHsKcmV0dXJuICcnOwp9CgppZiAoJEsgJiYgbnVsbCA9PT0gc2VsZjo6JEtEKSB7CnNlbGY6OiRLRCA9IHNlbGY6OmdldERhdGEoJ2NvbXBhdGliaWxpdHlEZWNvbXBvc2l0aW9uJyk7Cn0KCmlmIChudWxsID09PSBzZWxmOjokRCkgewpzZWxmOjokRCA9IHNlbGY6OmdldERhdGEoJ2Nhbm9uaWNhbERlY29tcG9zaXRpb24nKTsKc2VsZjo6JGNDID0gc2VsZjo6Z2V0RGF0YSgnY29tYmluaW5nQ2xhc3MnKTsKfQoKaWYgKG51bGwgIT09ICRtYkVuY29kaW5nID0gKDIgICYgKGludCkgXGluaV9nZXQoJ21ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQnKSkgPyBtYl9pbnRlcm5hbF9lbmNvZGluZygpIDogbnVsbCkgewptYl9pbnRlcm5hbF9lbmNvZGluZygnOGJpdCcpOwp9CgokciA9IHNlbGY6OmRlY29tcG9zZSgkcywgJEspOwoKaWYgKCRDKSB7CmlmIChudWxsID09PSBzZWxmOjokQykgewpzZWxmOjokQyA9IHNlbGY6OmdldERhdGEoJ2Nhbm9uaWNhbENvbXBvc2l0aW9uJyk7Cn0KCiRyID0gc2VsZjo6cmVjb21wb3NlKCRyKTsKfQppZiAobnVsbCAhPT0gJG1iRW5jb2RpbmcpIHsKbWJfaW50ZXJuYWxfZW5jb2RpbmcoJG1iRW5jb2RpbmcpOwp9CgpyZXR1cm4gJHI7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHJlY29tcG9zZSgkcykKewokQVNDSUkgPSBzZWxmOjokQVNDSUk7CiRjb21wTWFwID0gc2VsZjo6JEM7CiRjb21iQ2xhc3MgPSBzZWxmOjokY0M7CiR1bGVuTWFzayA9IHNlbGY6OiR1bGVuTWFzazsKCiRyZXN1bHQgPSAkdGFpbCA9ICcnOwoKJGkgPSAkc1swXSA8ICJceDgwIiA/IDEgOiAkdWxlbk1hc2tbJHNbMF0gJiAiXHhGMCJdOwokbGVuID0gXHN0cmxlbigkcyk7CgokbGFzdFVjaHIgPSBzdWJzdHIoJHMsIDAsICRpKTsKJGxhc3RVY2xzID0gaXNzZXQoJGNvbWJDbGFzc1skbGFzdFVjaHJdKSA/IDI1NiA6IDA7Cgp3aGlsZSAoJGkgPCAkbGVuKSB7CmlmICgkc1skaV0gPCAiXHg4MCIpIHsKCgppZiAoJHRhaWwpIHsKJGxhc3RVY2hyIC49ICR0YWlsOwokdGFpbCA9ICcnOwp9CgppZiAoJGogPSBzdHJzcG4oJHMsICRBU0NJSSwgJGkgKyAxKSkgewokbGFzdFVjaHIgLj0gc3Vic3RyKCRzLCAkaSwgJGopOwokaSArPSAkajsKfQoKJHJlc3VsdCAuPSAkbGFzdFVjaHI7CiRsYXN0VWNociA9ICRzWyRpXTsKJGxhc3RVY2xzID0gMDsKKyskaTsKY29udGludWU7Cn0KCiR1bGVuID0gJHVsZW5NYXNrWyRzWyRpXSAmICJceEYwIl07CiR1Y2hyID0gc3Vic3RyKCRzLCAkaSwgJHVsZW4pOwoKaWYgKCRsYXN0VWNociA8ICJceEUxXHg4NFx4ODAiIHx8ICJceEUxXHg4NFx4OTIiIDwgJGxhc3RVY2hyCnx8ICR1Y2hyIDwgIlx4RTFceDg1XHhBMSIgfHwgIlx4RTFceDg1XHhCNSIgPCAkdWNocgp8fCAkbGFzdFVjbHMpIHsKCgokdWNscyA9ICRjb21iQ2xhc3NbJHVjaHJdID8/IDA7CgppZiAoaXNzZXQoJGNvbXBNYXBbJGxhc3RVY2hyLiR1Y2hyXSkgJiYgKCEkbGFzdFVjbHMgfHwgJGxhc3RVY2xzIDwgJHVjbHMpKSB7CiRsYXN0VWNociA9ICRjb21wTWFwWyRsYXN0VWNoci4kdWNocl07Cn0gZWxzZWlmICgkbGFzdFVjbHMgPSAkdWNscykgewokdGFpbCAuPSAkdWNocjsKfSBlbHNlIHsKaWYgKCR0YWlsKSB7CiRsYXN0VWNociAuPSAkdGFpbDsKJHRhaWwgPSAnJzsKfQoKJHJlc3VsdCAuPSAkbGFzdFVjaHI7CiRsYXN0VWNociA9ICR1Y2hyOwp9Cn0gZWxzZSB7CgoKJEwgPSBcb3JkKCRsYXN0VWNoclsyXSkgLSAweDgwOwokViA9IFxvcmQoJHVjaHJbMl0pIC0gMHhBMTsKJFQgPSAwOwoKJHVjaHIgPSBzdWJzdHIoJHMsICRpICsgJHVsZW4sIDMpOwoKaWYgKCJceEUxXHg4Nlx4QTciIDw9ICR1Y2hyICYmICR1Y2hyIDw9ICJceEUxXHg4N1x4ODIiKSB7CiRUID0gXG9yZCgkdWNoclsyXSkgLSAweEE3OwowID4gJFQgJiYgJFQgKz0gMHg0MDsKJHVsZW4gKz0gMzsKfQoKJEwgPSAweEFDMDAgKyAoJEwgKiAyMSArICRWKSAqIDI4ICsgJFQ7CiRsYXN0VWNociA9IFxjaHIoMHhFMCB8ICRMID4+IDEyKS5cY2hyKDB4ODAgfCAkTCA+PiA2ICYgMHgzRikuXGNocigweDgwIHwgJEwgJiAweDNGKTsKfQoKJGkgKz0gJHVsZW47Cn0KCnJldHVybiAkcmVzdWx0LiRsYXN0VWNoci4kdGFpbDsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZGVjb21wb3NlKCRzLCAkYykKewokcmVzdWx0ID0gJyc7CgokQVNDSUkgPSBzZWxmOjokQVNDSUk7CiRkZWNvbXBNYXAgPSBzZWxmOjokRDsKJGNvbWJDbGFzcyA9IHNlbGY6OiRjQzsKJHVsZW5NYXNrID0gc2VsZjo6JHVsZW5NYXNrOwppZiAoJGMpIHsKJGNvbXBhdE1hcCA9IHNlbGY6OiRLRDsKfQoKJGMgPSBbXTsKJGkgPSAwOwokbGVuID0gXHN0cmxlbigkcyk7Cgp3aGlsZSAoJGkgPCAkbGVuKSB7CmlmICgkc1skaV0gPCAiXHg4MCIpIHsKCgppZiAoJGMpIHsKa3NvcnQoJGMpOwokcmVzdWx0IC49IGltcGxvZGUoJycsICRjKTsKJGMgPSBbXTsKfQoKJGogPSAxICsgc3Ryc3BuKCRzLCAkQVNDSUksICRpICsgMSk7CiRyZXN1bHQgLj0gc3Vic3RyKCRzLCAkaSwgJGopOwokaSArPSAkajsKY29udGludWU7Cn0KCiR1bGVuID0gJHVsZW5NYXNrWyRzWyRpXSAmICJceEYwIl07CiR1Y2hyID0gc3Vic3RyKCRzLCAkaSwgJHVsZW4pOwokaSArPSAkdWxlbjsKCmlmICgkdWNociA8ICJceEVBXHhCMFx4ODAiIHx8ICJceEVEXHg5RVx4QTMiIDwgJHVjaHIpIHsKCgppZiAoJHVjaHIgIT09ICRqID0gJGNvbXBhdE1hcFskdWNocl0gPz8gKCRkZWNvbXBNYXBbJHVjaHJdID8/ICR1Y2hyKSkgewokdWNociA9ICRqOwoKJGogPSBcc3RybGVuKCR1Y2hyKTsKJHVsZW4gPSAkdWNoclswXSA8ICJceDgwIiA/IDEgOiAkdWxlbk1hc2tbJHVjaHJbMF0gJiAiXHhGMCJdOwoKaWYgKCR1bGVuICE9ICRqKSB7CgoKJGogLT0gJHVsZW47CiRpIC09ICRqOwoKaWYgKDAgPiAkaSkgewokcyA9IHN0cl9yZXBlYXQoJyAnLCAtJGkpLiRzOwokbGVuIC09ICRpOwokaSA9IDA7Cn0KCndoaWxlICgkai0tKSB7CiRzWyRpICsgJGpdID0gJHVjaHJbJHVsZW4gKyAkal07Cn0KCiR1Y2hyID0gc3Vic3RyKCR1Y2hyLCAwLCAkdWxlbik7Cn0KfQppZiAoaXNzZXQoJGNvbWJDbGFzc1skdWNocl0pKSB7CgoKaWYgKCFpc3NldCgkY1skY29tYkNsYXNzWyR1Y2hyXV0pKSB7CiRjWyRjb21iQ2xhc3NbJHVjaHJdXSA9ICcnOwp9CiRjWyRjb21iQ2xhc3NbJHVjaHJdXSAuPSAkdWNocjsKY29udGludWU7Cn0KfSBlbHNlIHsKCgokdWNociA9IHVucGFjaygnQyonLCAkdWNocik7CiRqID0gKCgkdWNoclsxXSAtIDIyNCkgPDwgMTIpICsgKCgkdWNoclsyXSAtIDEyOCkgPDwgNikgKyAkdWNoclszXSAtIDB4QUM4MDsKCiR1Y2hyID0gIlx4RTFceDg0Ii5cY2hyKDB4ODAgKyAoaW50KSAoJGogLyA1ODgpKQouIlx4RTFceDg1Ii5cY2hyKDB4QTEgKyAoaW50KSAoKCRqICUgNTg4KSAvIDI4KSk7CgppZiAoJGogJT0gMjgpIHsKJHVjaHIgLj0gJGogPCAyNQo/ICgiXHhFMVx4ODYiLlxjaHIoMHhBNyArICRqKSkKOiAoIlx4RTFceDg3Ii5cY2hyKDB4NjcgKyAkaikpOwp9Cn0KaWYgKCRjKSB7Cmtzb3J0KCRjKTsKJHJlc3VsdCAuPSBpbXBsb2RlKCcnLCAkYyk7CiRjID0gW107Cn0KCiRyZXN1bHQgLj0gJHVjaHI7Cn0KCmlmICgkYykgewprc29ydCgkYyk7CiRyZXN1bHQgLj0gaW1wbG9kZSgnJywgJGMpOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0RGF0YSgkZmlsZSkKewppZiAoZmlsZV9leGlzdHMoJGZpbGUgPSBfX0RJUl9fLicvUmVzb3VyY2VzL3VuaWRhdGEvJy4kZmlsZS4nLnBocCcpKSB7CnJldHVybiByZXF1aXJlICRmaWxlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocAoKY2xhc3MgTm9ybWFsaXplciBleHRlbmRzIFN5bWZvbnlcUG9seWZpbGxcSW50bFxOb3JtYWxpemVyXE5vcm1hbGl6ZXIKewoKCgpwdWJsaWMgY29uc3QgTk9ORSA9IDI7CnB1YmxpYyBjb25zdCBGT1JNX0QgPSA0OwpwdWJsaWMgY29uc3QgRk9STV9LRCA9IDg7CnB1YmxpYyBjb25zdCBGT1JNX0MgPSAxNjsKcHVibGljIGNvbnN0IEZPUk1fS0MgPSAzMjsKcHVibGljIGNvbnN0IE5GRCA9IDQ7CnB1YmxpYyBjb25zdCBORktEID0gODsKcHVibGljIGNvbnN0IE5GQyA9IDE2OwpwdWJsaWMgY29uc3QgTkZLQyA9IDMyOwp9Cjw/cGhwCgpyZXR1cm4gYXJyYXkgKAonQcyAJyA9PiAnw4AnLAonQcyBJyA9PiAnw4EnLAonQcyCJyA9PiAnw4InLAonQcyDJyA9PiAnw4MnLAonQcyIJyA9PiAnw4QnLAonQcyKJyA9PiAnw4UnLAonQ8ynJyA9PiAnw4cnLAonRcyAJyA9PiAnw4gnLAonRcyBJyA9PiAnw4knLAonRcyCJyA9PiAnw4onLAonRcyIJyA9PiAnw4snLAonScyAJyA9PiAnw4wnLAonScyBJyA9PiAnw40nLAonScyCJyA9PiAnw44nLAonScyIJyA9PiAnw48nLAonTsyDJyA9PiAnw5EnLAonT8yAJyA9PiAnw5InLAonT8yBJyA9PiAnw5MnLAonT8yCJyA9PiAnw5QnLAonT8yDJyA9PiAnw5UnLAonT8yIJyA9PiAnw5YnLAonVcyAJyA9PiAnw5knLAonVcyBJyA9PiAnw5onLAonVcyCJyA9PiAnw5snLAonVcyIJyA9PiAnw5wnLAonWcyBJyA9PiAnw50nLAonYcyAJyA9PiAnw6AnLAonYcyBJyA9PiAnw6EnLAonYcyCJyA9PiAnw6InLAonYcyDJyA9PiAnw6MnLAonYcyIJyA9PiAnw6QnLAonYcyKJyA9PiAnw6UnLAonY8ynJyA9PiAnw6cnLAonZcyAJyA9PiAnw6gnLAonZcyBJyA9PiAnw6knLAonZcyCJyA9PiAnw6onLAonZcyIJyA9PiAnw6snLAonacyAJyA9PiAnw6wnLAonacyBJyA9PiAnw60nLAonacyCJyA9PiAnw64nLAonacyIJyA9PiAnw68nLAonbsyDJyA9PiAnw7EnLAonb8yAJyA9PiAnw7InLAonb8yBJyA9PiAnw7MnLAonb8yCJyA9PiAnw7QnLAonb8yDJyA9PiAnw7UnLAonb8yIJyA9PiAnw7YnLAondcyAJyA9PiAnw7knLAondcyBJyA9PiAnw7onLAondcyCJyA9PiAnw7snLAondcyIJyA9PiAnw7wnLAonecyBJyA9PiAnw70nLAonecyIJyA9PiAnw78nLAonQcyEJyA9PiAnxIAnLAonYcyEJyA9PiAnxIEnLAonQcyGJyA9PiAnxIInLAonYcyGJyA9PiAnxIMnLAonQcyoJyA9PiAnxIQnLAonYcyoJyA9PiAnxIUnLAonQ8yBJyA9PiAnxIYnLAonY8yBJyA9PiAnxIcnLAonQ8yCJyA9PiAnxIgnLAonY8yCJyA9PiAnxIknLAonQ8yHJyA9PiAnxIonLAonY8yHJyA9PiAnxIsnLAonQ8yMJyA9PiAnxIwnLAonY8yMJyA9PiAnxI0nLAonRMyMJyA9PiAnxI4nLAonZMyMJyA9PiAnxI8nLAonRcyEJyA9PiAnxJInLAonZcyEJyA9PiAnxJMnLAonRcyGJyA9PiAnxJQnLAonZcyGJyA9PiAnxJUnLAonRcyHJyA9PiAnxJYnLAonZcyHJyA9PiAnxJcnLAonRcyoJyA9PiAnxJgnLAonZcyoJyA9PiAnxJknLAonRcyMJyA9PiAnxJonLAonZcyMJyA9PiAnxJsnLAonR8yCJyA9PiAnxJwnLAonZ8yCJyA9PiAnxJ0nLAonR8yGJyA9PiAnxJ4nLAonZ8yGJyA9PiAnxJ8nLAonR8yHJyA9PiAnxKAnLAonZ8yHJyA9PiAnxKEnLAonR8ynJyA9PiAnxKInLAonZ8ynJyA9PiAnxKMnLAonSMyCJyA9PiAnxKQnLAonaMyCJyA9PiAnxKUnLAonScyDJyA9PiAnxKgnLAonacyDJyA9PiAnxKknLAonScyEJyA9PiAnxKonLAonacyEJyA9PiAnxKsnLAonScyGJyA9PiAnxKwnLAonacyGJyA9PiAnxK0nLAonScyoJyA9PiAnxK4nLAonacyoJyA9PiAnxK8nLAonScyHJyA9PiAnxLAnLAonSsyCJyA9PiAnxLQnLAonasyCJyA9PiAnxLUnLAonS8ynJyA9PiAnxLYnLAona8ynJyA9PiAnxLcnLAonTMyBJyA9PiAnxLknLAonbMyBJyA9PiAnxLonLAonTMynJyA9PiAnxLsnLAonbMynJyA9PiAnxLwnLAonTMyMJyA9PiAnxL0nLAonbMyMJyA9PiAnxL4nLAonTsyBJyA9PiAnxYMnLAonbsyBJyA9PiAnxYQnLAonTsynJyA9PiAnxYUnLAonbsynJyA9PiAnxYYnLAonTsyMJyA9PiAnxYcnLAonbsyMJyA9PiAnxYgnLAonT8yEJyA9PiAnxYwnLAonb8yEJyA9PiAnxY0nLAonT8yGJyA9PiAnxY4nLAonb8yGJyA9PiAnxY8nLAonT8yLJyA9PiAnxZAnLAonb8yLJyA9PiAnxZEnLAonUsyBJyA9PiAnxZQnLAoncsyBJyA9PiAnxZUnLAonUsynJyA9PiAnxZYnLAoncsynJyA9PiAnxZcnLAonUsyMJyA9PiAnxZgnLAoncsyMJyA9PiAnxZknLAonU8yBJyA9PiAnxZonLAonc8yBJyA9PiAnxZsnLAonU8yCJyA9PiAnxZwnLAonc8yCJyA9PiAnxZ0nLAonU8ynJyA9PiAnxZ4nLAonc8ynJyA9PiAnxZ8nLAonU8yMJyA9PiAnxaAnLAonc8yMJyA9PiAnxaEnLAonVMynJyA9PiAnxaInLAondMynJyA9PiAnxaMnLAonVMyMJyA9PiAnxaQnLAondMyMJyA9PiAnxaUnLAonVcyDJyA9PiAnxagnLAondcyDJyA9PiAnxaknLAonVcyEJyA9PiAnxaonLAondcyEJyA9PiAnxasnLAonVcyGJyA9PiAnxawnLAondcyGJyA9PiAnxa0nLAonVcyKJyA9PiAnxa4nLAondcyKJyA9PiAnxa8nLAonVcyLJyA9PiAnxbAnLAondcyLJyA9PiAnxbEnLAonVcyoJyA9PiAnxbInLAondcyoJyA9PiAnxbMnLAonV8yCJyA9PiAnxbQnLAond8yCJyA9PiAnxbUnLAonWcyCJyA9PiAnxbYnLAonecyCJyA9PiAnxbcnLAonWcyIJyA9PiAnxbgnLAonWsyBJyA9PiAnxbknLAonesyBJyA9PiAnxbonLAonWsyHJyA9PiAnxbsnLAonesyHJyA9PiAnxbwnLAonWsyMJyA9PiAnxb0nLAonesyMJyA9PiAnxb4nLAonT8ybJyA9PiAnxqAnLAonb8ybJyA9PiAnxqEnLAonVcybJyA9PiAnxq8nLAondcybJyA9PiAnxrAnLAonQcyMJyA9PiAnx40nLAonYcyMJyA9PiAnx44nLAonScyMJyA9PiAnx48nLAonacyMJyA9PiAnx5AnLAonT8yMJyA9PiAnx5EnLAonb8yMJyA9PiAnx5InLAonVcyMJyA9PiAnx5MnLAondcyMJyA9PiAnx5QnLAonw5zMhCcgPT4gJ8eVJywKJ8O8zIQnID0+ICfHlicsCifDnMyBJyA9PiAnx5cnLAonw7zMgScgPT4gJ8eYJywKJ8OczIwnID0+ICfHmScsCifDvMyMJyA9PiAnx5onLAonw5zMgCcgPT4gJ8ebJywKJ8O8zIAnID0+ICfHnCcsCifDhMyEJyA9PiAnx54nLAonw6TMhCcgPT4gJ8efJywKJ8imzIQnID0+ICfHoCcsCifIp8yEJyA9PiAnx6EnLAonw4bMhCcgPT4gJ8eiJywKJ8OmzIQnID0+ICfHoycsCidHzIwnID0+ICfHpicsCidnzIwnID0+ICfHpycsCidLzIwnID0+ICfHqCcsCidrzIwnID0+ICfHqScsCidPzKgnID0+ICfHqicsCidvzKgnID0+ICfHqycsCifHqsyEJyA9PiAnx6wnLAonx6vMhCcgPT4gJ8etJywKJ8a3zIwnID0+ICfHricsCifKksyMJyA9PiAnx68nLAonasyMJyA9PiAnx7AnLAonR8yBJyA9PiAnx7QnLAonZ8yBJyA9PiAnx7UnLAonTsyAJyA9PiAnx7gnLAonbsyAJyA9PiAnx7knLAonw4XMgScgPT4gJ8e6JywKJ8OlzIEnID0+ICfHuycsCifDhsyBJyA9PiAnx7wnLAonw6bMgScgPT4gJ8e9JywKJ8OYzIEnID0+ICfHvicsCifDuMyBJyA9PiAnx78nLAonQcyPJyA9PiAnyIAnLAonYcyPJyA9PiAnyIEnLAonQcyRJyA9PiAnyIInLAonYcyRJyA9PiAnyIMnLAonRcyPJyA9PiAnyIQnLAonZcyPJyA9PiAnyIUnLAonRcyRJyA9PiAnyIYnLAonZcyRJyA9PiAnyIcnLAonScyPJyA9PiAnyIgnLAonacyPJyA9PiAnyIknLAonScyRJyA9PiAnyIonLAonacyRJyA9PiAnyIsnLAonT8yPJyA9PiAnyIwnLAonb8yPJyA9PiAnyI0nLAonT8yRJyA9PiAnyI4nLAonb8yRJyA9PiAnyI8nLAonUsyPJyA9PiAnyJAnLAoncsyPJyA9PiAnyJEnLAonUsyRJyA9PiAnyJInLAoncsyRJyA9PiAnyJMnLAonVcyPJyA9PiAnyJQnLAondcyPJyA9PiAnyJUnLAonVcyRJyA9PiAnyJYnLAondcyRJyA9PiAnyJcnLAonU8ymJyA9PiAnyJgnLAonc8ymJyA9PiAnyJknLAonVMymJyA9PiAnyJonLAondMymJyA9PiAnyJsnLAonSMyMJyA9PiAnyJ4nLAonaMyMJyA9PiAnyJ8nLAonQcyHJyA9PiAnyKYnLAonYcyHJyA9PiAnyKcnLAonRcynJyA9PiAnyKgnLAonZcynJyA9PiAnyKknLAonw5bMhCcgPT4gJ8iqJywKJ8O2zIQnID0+ICfIqycsCifDlcyEJyA9PiAnyKwnLAonw7XMhCcgPT4gJ8itJywKJ0/MhycgPT4gJ8iuJywKJ2/MhycgPT4gJ8ivJywKJ8iuzIQnID0+ICfIsCcsCifIr8yEJyA9PiAnyLEnLAonWcyEJyA9PiAnyLInLAonecyEJyA9PiAnyLMnLAonwqjMgScgPT4gJ86FJywKJ86RzIEnID0+ICfOhicsCifOlcyBJyA9PiAnzognLAonzpfMgScgPT4gJ86JJywKJ86ZzIEnID0+ICfOiicsCifOn8yBJyA9PiAnzownLAonzqXMgScgPT4gJ86OJywKJ86pzIEnID0+ICfOjycsCifPisyBJyA9PiAnzpAnLAonzpnMiCcgPT4gJ86qJywKJ86lzIgnID0+ICfOqycsCifOscyBJyA9PiAnzqwnLAonzrXMgScgPT4gJ86tJywKJ863zIEnID0+ICfOricsCifOucyBJyA9PiAnzq8nLAonz4vMgScgPT4gJ86wJywKJ865zIgnID0+ICfPiicsCifPhcyIJyA9PiAnz4snLAonzr/MgScgPT4gJ8+MJywKJ8+FzIEnID0+ICfPjScsCifPicyBJyA9PiAnz44nLAonz5LMgScgPT4gJ8+TJywKJ8+SzIgnID0+ICfPlCcsCifQlcyAJyA9PiAn0IAnLAon0JXMiCcgPT4gJ9CBJywKJ9CTzIEnID0+ICfQgycsCifQhsyIJyA9PiAn0IcnLAon0JrMgScgPT4gJ9CMJywKJ9CYzIAnID0+ICfQjScsCifQo8yGJyA9PiAn0I4nLAon0JjMhicgPT4gJ9CZJywKJ9C4zIYnID0+ICfQuScsCifQtcyAJyA9PiAn0ZAnLAon0LXMiCcgPT4gJ9GRJywKJ9CzzIEnID0+ICfRkycsCifRlsyIJyA9PiAn0ZcnLAon0LrMgScgPT4gJ9GcJywKJ9C4zIAnID0+ICfRnScsCifRg8yGJyA9PiAn0Z4nLAon0bTMjycgPT4gJ9G2JywKJ9G1zI8nID0+ICfRtycsCifQlsyGJyA9PiAn04EnLAon0LbMhicgPT4gJ9OCJywKJ9CQzIYnID0+ICfTkCcsCifQsMyGJyA9PiAn05EnLAon0JDMiCcgPT4gJ9OSJywKJ9CwzIgnID0+ICfTkycsCifQlcyGJyA9PiAn05YnLAon0LXMhicgPT4gJ9OXJywKJ9OYzIgnID0+ICfTmicsCifTmcyIJyA9PiAn05snLAon0JbMiCcgPT4gJ9OcJywKJ9C2zIgnID0+ICfTnScsCifQl8yIJyA9PiAn054nLAon0LfMiCcgPT4gJ9OfJywKJ9CYzIQnID0+ICfToicsCifQuMyEJyA9PiAn06MnLAon0JjMiCcgPT4gJ9OkJywKJ9C4zIgnID0+ICfTpScsCifQnsyIJyA9PiAn06YnLAon0L7MiCcgPT4gJ9OnJywKJ9OozIgnID0+ICfTqicsCifTqcyIJyA9PiAn06snLAon0K3MiCcgPT4gJ9OsJywKJ9GNzIgnID0+ICfTrScsCifQo8yEJyA9PiAn064nLAon0YPMhCcgPT4gJ9OvJywKJ9CjzIgnID0+ICfTsCcsCifRg8yIJyA9PiAn07EnLAon0KPMiycgPT4gJ9OyJywKJ9GDzIsnID0+ICfTsycsCifQp8yIJyA9PiAn07QnLAon0YfMiCcgPT4gJ9O1JywKJ9CrzIgnID0+ICfTuCcsCifRi8yIJyA9PiAn07knLAon2KfZkycgPT4gJ9iiJywKJ9in2ZQnID0+ICfYoycsCifZiNmUJyA9PiAn2KQnLAon2KfZlScgPT4gJ9ilJywKJ9mK2ZQnID0+ICfYpicsCifbldmUJyA9PiAn24AnLAon24HZlCcgPT4gJ9uCJywKJ9uS2ZQnID0+ICfbkycsCifgpKjgpLwnID0+ICfgpKknLAon4KSw4KS8JyA9PiAn4KSxJywKJ+Cks+CkvCcgPT4gJ+CktCcsCifgp4fgpr4nID0+ICfgp4snLAon4KeH4KeXJyA9PiAn4KeMJywKJ+Cth+CtlicgPT4gJ+CtiCcsCifgrYfgrL4nID0+ICfgrYsnLAon4K2H4K2XJyA9PiAn4K2MJywKJ+CukuCvlycgPT4gJ+CulCcsCifgr4bgrr4nID0+ICfgr4onLAon4K+H4K6+JyA9PiAn4K+LJywKJ+CvhuCvlycgPT4gJ+CvjCcsCifgsYbgsZYnID0+ICfgsYgnLAon4LK/4LOVJyA9PiAn4LOAJywKJ+CzhuCzlScgPT4gJ+CzhycsCifgs4bgs5YnID0+ICfgs4gnLAon4LOG4LOCJyA9PiAn4LOKJywKJ+CziuCzlScgPT4gJ+CziycsCifgtYbgtL4nID0+ICfgtYonLAon4LWH4LS+JyA9PiAn4LWLJywKJ+C1huC1lycgPT4gJ+C1jCcsCifgt5ngt4onID0+ICfgt5onLAon4LeZ4LePJyA9PiAn4LecJywKJ+C3nOC3iicgPT4gJ+C3nScsCifgt5ngt58nID0+ICfgt54nLAon4YCl4YCuJyA9PiAn4YCmJywKJ+GsheGstScgPT4gJ+GshicsCifhrIfhrLUnID0+ICfhrIgnLAon4ayJ4ay1JyA9PiAn4ayKJywKJ+Gsi+GstScgPT4gJ+GsjCcsCifhrI3hrLUnID0+ICfhrI4nLAon4ayR4ay1JyA9PiAn4aySJywKJ+GsuuGstScgPT4gJ+GsuycsCifhrLzhrLUnID0+ICfhrL0nLAon4ay+4ay1JyA9PiAn4a2AJywKJ+Gsv+GstScgPT4gJ+GtgScsCifhrYLhrLUnID0+ICfhrYMnLAonQcylJyA9PiAn4biAJywKJ2HMpScgPT4gJ+G4gScsCidCzIcnID0+ICfhuIInLAonYsyHJyA9PiAn4biDJywKJ0LMoycgPT4gJ+G4hCcsCidizKMnID0+ICfhuIUnLAonQsyxJyA9PiAn4biGJywKJ2LMsScgPT4gJ+G4hycsCifDh8yBJyA9PiAn4biIJywKJ8OnzIEnID0+ICfhuIknLAonRMyHJyA9PiAn4biKJywKJ2TMhycgPT4gJ+G4iycsCidEzKMnID0+ICfhuIwnLAonZMyjJyA9PiAn4biNJywKJ0TMsScgPT4gJ+G4jicsCidkzLEnID0+ICfhuI8nLAonRMynJyA9PiAn4biQJywKJ2TMpycgPT4gJ+G4kScsCidEzK0nID0+ICfhuJInLAonZMytJyA9PiAn4biTJywKJ8SSzIAnID0+ICfhuJQnLAonxJPMgCcgPT4gJ+G4lScsCifEksyBJyA9PiAn4biWJywKJ8STzIEnID0+ICfhuJcnLAonRcytJyA9PiAn4biYJywKJ2XMrScgPT4gJ+G4mScsCidFzLAnID0+ICfhuJonLAonZcywJyA9PiAn4bibJywKJ8iozIYnID0+ICfhuJwnLAonyKnMhicgPT4gJ+G4nScsCidGzIcnID0+ICfhuJ4nLAonZsyHJyA9PiAn4bifJywKJ0fMhCcgPT4gJ+G4oCcsCidnzIQnID0+ICfhuKEnLAonSMyHJyA9PiAn4biiJywKJ2jMhycgPT4gJ+G4oycsCidIzKMnID0+ICfhuKQnLAonaMyjJyA9PiAn4bilJywKJ0jMiCcgPT4gJ+G4picsCidozIgnID0+ICfhuKcnLAonSMynJyA9PiAn4bioJywKJ2jMpycgPT4gJ+G4qScsCidIzK4nID0+ICfhuKonLAonaMyuJyA9PiAn4birJywKJ0nMsCcgPT4gJ+G4rCcsCidpzLAnID0+ICfhuK0nLAonw4/MgScgPT4gJ+G4ricsCifDr8yBJyA9PiAn4bivJywKJ0vMgScgPT4gJ+G4sCcsCidrzIEnID0+ICfhuLEnLAonS8yjJyA9PiAn4biyJywKJ2vMoycgPT4gJ+G4sycsCidLzLEnID0+ICfhuLQnLAona8yxJyA9PiAn4bi1JywKJ0zMoycgPT4gJ+G4ticsCidszKMnID0+ICfhuLcnLAon4bi2zIQnID0+ICfhuLgnLAon4bi3zIQnID0+ICfhuLknLAonTMyxJyA9PiAn4bi6JywKJ2zMsScgPT4gJ+G4uycsCidMzK0nID0+ICfhuLwnLAonbMytJyA9PiAn4bi9JywKJ03MgScgPT4gJ+G4vicsCidtzIEnID0+ICfhuL8nLAonTcyHJyA9PiAn4bmAJywKJ23MhycgPT4gJ+G5gScsCidNzKMnID0+ICfhuYInLAonbcyjJyA9PiAn4bmDJywKJ07MhycgPT4gJ+G5hCcsCiduzIcnID0+ICfhuYUnLAonTsyjJyA9PiAn4bmGJywKJ27MoycgPT4gJ+G5hycsCidOzLEnID0+ICfhuYgnLAonbsyxJyA9PiAn4bmJJywKJ07MrScgPT4gJ+G5iicsCiduzK0nID0+ICfhuYsnLAonw5XMgScgPT4gJ+G5jCcsCifDtcyBJyA9PiAn4bmNJywKJ8OVzIgnID0+ICfhuY4nLAonw7XMiCcgPT4gJ+G5jycsCifFjMyAJyA9PiAn4bmQJywKJ8WNzIAnID0+ICfhuZEnLAonxYzMgScgPT4gJ+G5kicsCifFjcyBJyA9PiAn4bmTJywKJ1DMgScgPT4gJ+G5lCcsCidwzIEnID0+ICfhuZUnLAonUMyHJyA9PiAn4bmWJywKJ3DMhycgPT4gJ+G5lycsCidSzIcnID0+ICfhuZgnLAoncsyHJyA9PiAn4bmZJywKJ1LMoycgPT4gJ+G5micsCidyzKMnID0+ICfhuZsnLAon4bmazIQnID0+ICfhuZwnLAon4bmbzIQnID0+ICfhuZ0nLAonUsyxJyA9PiAn4bmeJywKJ3LMsScgPT4gJ+G5nycsCidTzIcnID0+ICfhuaAnLAonc8yHJyA9PiAn4bmhJywKJ1PMoycgPT4gJ+G5oicsCidzzKMnID0+ICfhuaMnLAonxZrMhycgPT4gJ+G5pCcsCifFm8yHJyA9PiAn4bmlJywKJ8WgzIcnID0+ICfhuaYnLAonxaHMhycgPT4gJ+G5pycsCifhuaLMhycgPT4gJ+G5qCcsCifhuaPMhycgPT4gJ+G5qScsCidUzIcnID0+ICfhuaonLAondMyHJyA9PiAn4bmrJywKJ1TMoycgPT4gJ+G5rCcsCid0zKMnID0+ICfhua0nLAonVMyxJyA9PiAn4bmuJywKJ3TMsScgPT4gJ+G5rycsCidUzK0nID0+ICfhubAnLAondMytJyA9PiAn4bmxJywKJ1XMpCcgPT4gJ+G5sicsCid1zKQnID0+ICfhubMnLAonVcywJyA9PiAn4bm0JywKJ3XMsCcgPT4gJ+G5tScsCidVzK0nID0+ICfhubYnLAondcytJyA9PiAn4bm3JywKJ8WozIEnID0+ICfhubgnLAonxanMgScgPT4gJ+G5uScsCifFqsyIJyA9PiAn4bm6JywKJ8WrzIgnID0+ICfhubsnLAonVsyDJyA9PiAn4bm8JywKJ3bMgycgPT4gJ+G5vScsCidWzKMnID0+ICfhub4nLAondsyjJyA9PiAn4bm/JywKJ1fMgCcgPT4gJ+G6gCcsCid3zIAnID0+ICfhuoEnLAonV8yBJyA9PiAn4bqCJywKJ3fMgScgPT4gJ+G6gycsCidXzIgnID0+ICfhuoQnLAond8yIJyA9PiAn4bqFJywKJ1fMhycgPT4gJ+G6hicsCid3zIcnID0+ICfhuocnLAonV8yjJyA9PiAn4bqIJywKJ3fMoycgPT4gJ+G6iScsCidYzIcnID0+ICfhuoonLAoneMyHJyA9PiAn4bqLJywKJ1jMiCcgPT4gJ+G6jCcsCid4zIgnID0+ICfhuo0nLAonWcyHJyA9PiAn4bqOJywKJ3nMhycgPT4gJ+G6jycsCidazIInID0+ICfhupAnLAonesyCJyA9PiAn4bqRJywKJ1rMoycgPT4gJ+G6kicsCid6zKMnID0+ICfhupMnLAonWsyxJyA9PiAn4bqUJywKJ3rMsScgPT4gJ+G6lScsCidozLEnID0+ICfhupYnLAondMyIJyA9PiAn4bqXJywKJ3fMiicgPT4gJ+G6mCcsCid5zIonID0+ICfhupknLAonxb/MhycgPT4gJ+G6mycsCidBzKMnID0+ICfhuqAnLAonYcyjJyA9PiAn4bqhJywKJ0HMiScgPT4gJ+G6oicsCidhzIknID0+ICfhuqMnLAonw4LMgScgPT4gJ+G6pCcsCifDosyBJyA9PiAn4bqlJywKJ8OCzIAnID0+ICfhuqYnLAonw6LMgCcgPT4gJ+G6pycsCifDgsyJJyA9PiAn4bqoJywKJ8OizIknID0+ICfhuqknLAonw4LMgycgPT4gJ+G6qicsCifDosyDJyA9PiAn4bqrJywKJ+G6oMyCJyA9PiAn4bqsJywKJ+G6ocyCJyA9PiAn4bqtJywKJ8SCzIEnID0+ICfhuq4nLAonxIPMgScgPT4gJ+G6rycsCifEgsyAJyA9PiAn4bqwJywKJ8SDzIAnID0+ICfhurEnLAonxILMiScgPT4gJ+G6sicsCifEg8yJJyA9PiAn4bqzJywKJ8SCzIMnID0+ICfhurQnLAonxIPMgycgPT4gJ+G6tScsCifhuqDMhicgPT4gJ+G6ticsCifhuqHMhicgPT4gJ+G6tycsCidFzKMnID0+ICfhurgnLAonZcyjJyA9PiAn4bq5JywKJ0XMiScgPT4gJ+G6uicsCidlzIknID0+ICfhursnLAonRcyDJyA9PiAn4bq8JywKJ2XMgycgPT4gJ+G6vScsCifDisyBJyA9PiAn4bq+JywKJ8OqzIEnID0+ICfhur8nLAonw4rMgCcgPT4gJ+G7gCcsCifDqsyAJyA9PiAn4buBJywKJ8OKzIknID0+ICfhu4InLAonw6rMiScgPT4gJ+G7gycsCifDisyDJyA9PiAn4buEJywKJ8OqzIMnID0+ICfhu4UnLAon4bq4zIInID0+ICfhu4YnLAon4bq5zIInID0+ICfhu4cnLAonScyJJyA9PiAn4buIJywKJ2nMiScgPT4gJ+G7iScsCidJzKMnID0+ICfhu4onLAonacyjJyA9PiAn4buLJywKJ0/MoycgPT4gJ+G7jCcsCidvzKMnID0+ICfhu40nLAonT8yJJyA9PiAn4buOJywKJ2/MiScgPT4gJ+G7jycsCifDlMyBJyA9PiAn4buQJywKJ8O0zIEnID0+ICfhu5EnLAonw5TMgCcgPT4gJ+G7kicsCifDtMyAJyA9PiAn4buTJywKJ8OUzIknID0+ICfhu5QnLAonw7TMiScgPT4gJ+G7lScsCifDlMyDJyA9PiAn4buWJywKJ8O0zIMnID0+ICfhu5cnLAon4buMzIInID0+ICfhu5gnLAon4buNzIInID0+ICfhu5knLAonxqDMgScgPT4gJ+G7micsCifGocyBJyA9PiAn4bubJywKJ8agzIAnID0+ICfhu5wnLAonxqHMgCcgPT4gJ+G7nScsCifGoMyJJyA9PiAn4bueJywKJ8ahzIknID0+ICfhu58nLAonxqDMgycgPT4gJ+G7oCcsCifGocyDJyA9PiAn4buhJywKJ8agzKMnID0+ICfhu6InLAonxqHMoycgPT4gJ+G7oycsCidVzKMnID0+ICfhu6QnLAondcyjJyA9PiAn4bulJywKJ1XMiScgPT4gJ+G7picsCid1zIknID0+ICfhu6cnLAonxq/MgScgPT4gJ+G7qCcsCifGsMyBJyA9PiAn4bupJywKJ8avzIAnID0+ICfhu6onLAonxrDMgCcgPT4gJ+G7qycsCifGr8yJJyA9PiAn4busJywKJ8awzIknID0+ICfhu60nLAonxq/MgycgPT4gJ+G7ricsCifGsMyDJyA9PiAn4buvJywKJ8avzKMnID0+ICfhu7AnLAonxrDMoycgPT4gJ+G7sScsCidZzIAnID0+ICfhu7InLAonecyAJyA9PiAn4buzJywKJ1nMoycgPT4gJ+G7tCcsCid5zKMnID0+ICfhu7UnLAonWcyJJyA9PiAn4bu2JywKJ3nMiScgPT4gJ+G7tycsCidZzIMnID0+ICfhu7gnLAonecyDJyA9PiAn4bu5JywKJ86xzJMnID0+ICfhvIAnLAonzrHMlCcgPT4gJ+G8gScsCifhvIDMgCcgPT4gJ+G8gicsCifhvIHMgCcgPT4gJ+G8gycsCifhvIDMgScgPT4gJ+G8hCcsCifhvIHMgScgPT4gJ+G8hScsCifhvIDNgicgPT4gJ+G8hicsCifhvIHNgicgPT4gJ+G8hycsCifOkcyTJyA9PiAn4byIJywKJ86RzJQnID0+ICfhvIknLAon4byIzIAnID0+ICfhvIonLAon4byJzIAnID0+ICfhvIsnLAon4byIzIEnID0+ICfhvIwnLAon4byJzIEnID0+ICfhvI0nLAon4byIzYInID0+ICfhvI4nLAon4byJzYInID0+ICfhvI8nLAonzrXMkycgPT4gJ+G8kCcsCifOtcyUJyA9PiAn4byRJywKJ+G8kMyAJyA9PiAn4bySJywKJ+G8kcyAJyA9PiAn4byTJywKJ+G8kMyBJyA9PiAn4byUJywKJ+G8kcyBJyA9PiAn4byVJywKJ86VzJMnID0+ICfhvJgnLAonzpXMlCcgPT4gJ+G8mScsCifhvJjMgCcgPT4gJ+G8micsCifhvJnMgCcgPT4gJ+G8mycsCifhvJjMgScgPT4gJ+G8nCcsCifhvJnMgScgPT4gJ+G8nScsCifOt8yTJyA9PiAn4bygJywKJ863zJQnID0+ICfhvKEnLAon4bygzIAnID0+ICfhvKInLAon4byhzIAnID0+ICfhvKMnLAon4bygzIEnID0+ICfhvKQnLAon4byhzIEnID0+ICfhvKUnLAon4bygzYInID0+ICfhvKYnLAon4byhzYInID0+ICfhvKcnLAonzpfMkycgPT4gJ+G8qCcsCifOl8yUJyA9PiAn4bypJywKJ+G8qMyAJyA9PiAn4byqJywKJ+G8qcyAJyA9PiAn4byrJywKJ+G8qMyBJyA9PiAn4bysJywKJ+G8qcyBJyA9PiAn4bytJywKJ+G8qM2CJyA9PiAn4byuJywKJ+G8qc2CJyA9PiAn4byvJywKJ865zJMnID0+ICfhvLAnLAonzrnMlCcgPT4gJ+G8sScsCifhvLDMgCcgPT4gJ+G8sicsCifhvLHMgCcgPT4gJ+G8sycsCifhvLDMgScgPT4gJ+G8tCcsCifhvLHMgScgPT4gJ+G8tScsCifhvLDNgicgPT4gJ+G8ticsCifhvLHNgicgPT4gJ+G8tycsCifOmcyTJyA9PiAn4by4JywKJ86ZzJQnID0+ICfhvLknLAon4by4zIAnID0+ICfhvLonLAon4by5zIAnID0+ICfhvLsnLAon4by4zIEnID0+ICfhvLwnLAon4by5zIEnID0+ICfhvL0nLAon4by4zYInID0+ICfhvL4nLAon4by5zYInID0+ICfhvL8nLAonzr/MkycgPT4gJ+G9gCcsCifOv8yUJyA9PiAn4b2BJywKJ+G9gMyAJyA9PiAn4b2CJywKJ+G9gcyAJyA9PiAn4b2DJywKJ+G9gMyBJyA9PiAn4b2EJywKJ+G9gcyBJyA9PiAn4b2FJywKJ86fzJMnID0+ICfhvYgnLAonzp/MlCcgPT4gJ+G9iScsCifhvYjMgCcgPT4gJ+G9iicsCifhvYnMgCcgPT4gJ+G9iycsCifhvYjMgScgPT4gJ+G9jCcsCifhvYnMgScgPT4gJ+G9jScsCifPhcyTJyA9PiAn4b2QJywKJ8+FzJQnID0+ICfhvZEnLAon4b2QzIAnID0+ICfhvZInLAon4b2RzIAnID0+ICfhvZMnLAon4b2QzIEnID0+ICfhvZQnLAon4b2RzIEnID0+ICfhvZUnLAon4b2QzYInID0+ICfhvZYnLAon4b2RzYInID0+ICfhvZcnLAonzqXMlCcgPT4gJ+G9mScsCifhvZnMgCcgPT4gJ+G9mycsCifhvZnMgScgPT4gJ+G9nScsCifhvZnNgicgPT4gJ+G9nycsCifPicyTJyA9PiAn4b2gJywKJ8+JzJQnID0+ICfhvaEnLAon4b2gzIAnID0+ICfhvaInLAon4b2hzIAnID0+ICfhvaMnLAon4b2gzIEnID0+ICfhvaQnLAon4b2hzIEnID0+ICfhvaUnLAon4b2gzYInID0+ICfhvaYnLAon4b2hzYInID0+ICfhvacnLAonzqnMkycgPT4gJ+G9qCcsCifOqcyUJyA9PiAn4b2pJywKJ+G9qMyAJyA9PiAn4b2qJywKJ+G9qcyAJyA9PiAn4b2rJywKJ+G9qMyBJyA9PiAn4b2sJywKJ+G9qcyBJyA9PiAn4b2tJywKJ+G9qM2CJyA9PiAn4b2uJywKJ+G9qc2CJyA9PiAn4b2vJywKJ86xzIAnID0+ICfhvbAnLAonzrXMgCcgPT4gJ+G9sicsCifOt8yAJyA9PiAn4b20JywKJ865zIAnID0+ICfhvbYnLAonzr/MgCcgPT4gJ+G9uCcsCifPhcyAJyA9PiAn4b26JywKJ8+JzIAnID0+ICfhvbwnLAon4byAzYUnID0+ICfhvoAnLAon4byBzYUnID0+ICfhvoEnLAon4byCzYUnID0+ICfhvoInLAon4byDzYUnID0+ICfhvoMnLAon4byEzYUnID0+ICfhvoQnLAon4byFzYUnID0+ICfhvoUnLAon4byGzYUnID0+ICfhvoYnLAon4byHzYUnID0+ICfhvocnLAon4byIzYUnID0+ICfhvognLAon4byJzYUnID0+ICfhvoknLAon4byKzYUnID0+ICfhvoonLAon4byLzYUnID0+ICfhvosnLAon4byMzYUnID0+ICfhvownLAon4byNzYUnID0+ICfhvo0nLAon4byOzYUnID0+ICfhvo4nLAon4byPzYUnID0+ICfhvo8nLAon4bygzYUnID0+ICfhvpAnLAon4byhzYUnID0+ICfhvpEnLAon4byizYUnID0+ICfhvpInLAon4byjzYUnID0+ICfhvpMnLAon4bykzYUnID0+ICfhvpQnLAon4bylzYUnID0+ICfhvpUnLAon4bymzYUnID0+ICfhvpYnLAon4bynzYUnID0+ICfhvpcnLAon4byozYUnID0+ICfhvpgnLAon4bypzYUnID0+ICfhvpknLAon4byqzYUnID0+ICfhvponLAon4byrzYUnID0+ICfhvpsnLAon4byszYUnID0+ICfhvpwnLAon4bytzYUnID0+ICfhvp0nLAon4byuzYUnID0+ICfhvp4nLAon4byvzYUnID0+ICfhvp8nLAon4b2gzYUnID0+ICfhvqAnLAon4b2hzYUnID0+ICfhvqEnLAon4b2izYUnID0+ICfhvqInLAon4b2jzYUnID0+ICfhvqMnLAon4b2kzYUnID0+ICfhvqQnLAon4b2lzYUnID0+ICfhvqUnLAon4b2mzYUnID0+ICfhvqYnLAon4b2nzYUnID0+ICfhvqcnLAon4b2ozYUnID0+ICfhvqgnLAon4b2pzYUnID0+ICfhvqknLAon4b2qzYUnID0+ICfhvqonLAon4b2rzYUnID0+ICfhvqsnLAon4b2szYUnID0+ICfhvqwnLAon4b2tzYUnID0+ICfhvq0nLAon4b2uzYUnID0+ICfhvq4nLAon4b2vzYUnID0+ICfhvq8nLAonzrHMhicgPT4gJ+G+sCcsCifOscyEJyA9PiAn4b6xJywKJ+G9sM2FJyA9PiAn4b6yJywKJ86xzYUnID0+ICfhvrMnLAonzqzNhScgPT4gJ+G+tCcsCifOsc2CJyA9PiAn4b62JywKJ+G+ts2FJyA9PiAn4b63JywKJ86RzIYnID0+ICfhvrgnLAonzpHMhCcgPT4gJ+G+uScsCifOkcyAJyA9PiAn4b66JywKJ86RzYUnID0+ICfhvrwnLAonwqjNgicgPT4gJ+G/gScsCifhvbTNhScgPT4gJ+G/gicsCifOt82FJyA9PiAn4b+DJywKJ86uzYUnID0+ICfhv4QnLAonzrfNgicgPT4gJ+G/hicsCifhv4bNhScgPT4gJ+G/hycsCifOlcyAJyA9PiAn4b+IJywKJ86XzIAnID0+ICfhv4onLAonzpfNhScgPT4gJ+G/jCcsCifhvr/MgCcgPT4gJ+G/jScsCifhvr/MgScgPT4gJ+G/jicsCifhvr/NgicgPT4gJ+G/jycsCifOucyGJyA9PiAn4b+QJywKJ865zIQnID0+ICfhv5EnLAonz4rMgCcgPT4gJ+G/kicsCifOuc2CJyA9PiAn4b+WJywKJ8+KzYInID0+ICfhv5cnLAonzpnMhicgPT4gJ+G/mCcsCifOmcyEJyA9PiAn4b+ZJywKJ86ZzIAnID0+ICfhv5onLAon4b++zIAnID0+ICfhv50nLAon4b++zIEnID0+ICfhv54nLAon4b++zYInID0+ICfhv58nLAonz4XMhicgPT4gJ+G/oCcsCifPhcyEJyA9PiAn4b+hJywKJ8+LzIAnID0+ICfhv6InLAonz4HMkycgPT4gJ+G/pCcsCifPgcyUJyA9PiAn4b+lJywKJ8+FzYInID0+ICfhv6YnLAonz4vNgicgPT4gJ+G/pycsCifOpcyGJyA9PiAn4b+oJywKJ86lzIQnID0+ICfhv6knLAonzqXMgCcgPT4gJ+G/qicsCifOocyUJyA9PiAn4b+sJywKJ8KozIAnID0+ICfhv60nLAon4b28zYUnID0+ICfhv7InLAonz4nNhScgPT4gJ+G/sycsCifPjs2FJyA9PiAn4b+0JywKJ8+JzYInID0+ICfhv7YnLAon4b+2zYUnID0+ICfhv7cnLAonzp/MgCcgPT4gJ+G/uCcsCifOqcyAJyA9PiAn4b+6JywKJ86pzYUnID0+ICfhv7wnLAon4oaQzLgnID0+ICfihponLAon4oaSzLgnID0+ICfihpsnLAon4oaUzLgnID0+ICfihq4nLAon4oeQzLgnID0+ICfih40nLAon4oeUzLgnID0+ICfih44nLAon4oeSzLgnID0+ICfih48nLAon4oiDzLgnID0+ICfiiIQnLAon4oiIzLgnID0+ICfiiIknLAon4oiLzLgnID0+ICfiiIwnLAon4oijzLgnID0+ICfiiKQnLAon4oilzLgnID0+ICfiiKYnLAon4oi8zLgnID0+ICfiiYEnLAon4omDzLgnID0+ICfiiYQnLAon4omFzLgnID0+ICfiiYcnLAon4omIzLgnID0+ICfiiYknLAonPcy4JyA9PiAn4omgJywKJ+KJocy4JyA9PiAn4omiJywKJ+KJjcy4JyA9PiAn4omtJywKJzzMuCcgPT4gJ+KJricsCic+zLgnID0+ICfiia8nLAon4omkzLgnID0+ICfiibAnLAon4omlzLgnID0+ICfiibEnLAon4omyzLgnID0+ICfiibQnLAon4omzzLgnID0+ICfiibUnLAon4om2zLgnID0+ICfiibgnLAon4om3zLgnID0+ICfiibknLAon4om6zLgnID0+ICfiioAnLAon4om7zLgnID0+ICfiioEnLAon4oqCzLgnID0+ICfiioQnLAon4oqDzLgnID0+ICfiioUnLAon4oqGzLgnID0+ICfiiognLAon4oqHzLgnID0+ICfiioknLAon4oqizLgnID0+ICfiiqwnLAon4oqozLgnID0+ICfiiq0nLAon4oqpzLgnID0+ICfiiq4nLAon4oqrzLgnID0+ICfiiq8nLAon4om8zLgnID0+ICfii6AnLAon4om9zLgnID0+ICfii6EnLAon4oqRzLgnID0+ICfii6InLAon4oqSzLgnID0+ICfii6MnLAon4oqyzLgnID0+ICfii6onLAon4oqzzLgnID0+ICfii6snLAon4oq0zLgnID0+ICfii6wnLAon4oq1zLgnID0+ICfii60nLAon44GL44KZJyA9PiAn44GMJywKJ+OBjeOCmScgPT4gJ+OBjicsCifjgY/jgpknID0+ICfjgZAnLAon44GR44KZJyA9PiAn44GSJywKJ+OBk+OCmScgPT4gJ+OBlCcsCifjgZXjgpknID0+ICfjgZYnLAon44GX44KZJyA9PiAn44GYJywKJ+OBmeOCmScgPT4gJ+OBmicsCifjgZvjgpknID0+ICfjgZwnLAon44Gd44KZJyA9PiAn44GeJywKJ+OBn+OCmScgPT4gJ+OBoCcsCifjgaHjgpknID0+ICfjgaInLAon44Gk44KZJyA9PiAn44GlJywKJ+OBpuOCmScgPT4gJ+OBpycsCifjgajjgpknID0+ICfjgaknLAon44Gv44KZJyA9PiAn44GwJywKJ+OBr+OCmicgPT4gJ+OBsScsCifjgbLjgpknID0+ICfjgbMnLAon44Gy44KaJyA9PiAn44G0JywKJ+OBteOCmScgPT4gJ+OBticsCifjgbXjgponID0+ICfjgbcnLAon44G444KZJyA9PiAn44G5JywKJ+OBuOOCmicgPT4gJ+OBuicsCifjgbvjgpknID0+ICfjgbwnLAon44G744KaJyA9PiAn44G9JywKJ+OBhuOCmScgPT4gJ+OClCcsCifjgp3jgpknID0+ICfjgp4nLAon44Kr44KZJyA9PiAn44KsJywKJ+OCreOCmScgPT4gJ+OCricsCifjgq/jgpknID0+ICfjgrAnLAon44Kx44KZJyA9PiAn44KyJywKJ+OCs+OCmScgPT4gJ+OCtCcsCifjgrXjgpknID0+ICfjgrYnLAon44K344KZJyA9PiAn44K4JywKJ+OCueOCmScgPT4gJ+OCuicsCifjgrvjgpknID0+ICfjgrwnLAon44K944KZJyA9PiAn44K+JywKJ+OCv+OCmScgPT4gJ+ODgCcsCifjg4HjgpknID0+ICfjg4InLAon44OE44KZJyA9PiAn44OFJywKJ+ODhuOCmScgPT4gJ+ODhycsCifjg4jjgpknID0+ICfjg4knLAon44OP44KZJyA9PiAn44OQJywKJ+ODj+OCmicgPT4gJ+ODkScsCifjg5LjgpknID0+ICfjg5MnLAon44OS44KaJyA9PiAn44OUJywKJ+ODleOCmScgPT4gJ+ODlicsCifjg5XjgponID0+ICfjg5cnLAon44OY44KZJyA9PiAn44OZJywKJ+ODmOOCmicgPT4gJ+ODmicsCifjg5vjgpknID0+ICfjg5wnLAon44Ob44KaJyA9PiAn44OdJywKJ+OCpuOCmScgPT4gJ+ODtCcsCifjg6/jgpknID0+ICfjg7cnLAon44Ow44KZJyA9PiAn44O4JywKJ+ODseOCmScgPT4gJ+ODuScsCifjg7LjgpknID0+ICfjg7onLAon44O944KZJyA9PiAn44O+JywKJ/CRgpnwkYK6JyA9PiAn8JGCmicsCifwkYKb8JGCuicgPT4gJ/CRgpwnLAon8JGCpfCRgronID0+ICfwkYKrJywKJ/CRhLHwkYSnJyA9PiAn8JGEricsCifwkYSy8JGEpycgPT4gJ/CRhK8nLAon8JGNh/CRjL4nID0+ICfwkY2LJywKJ/CRjYfwkY2XJyA9PiAn8JGNjCcsCifwkZK58JGSuicgPT4gJ/CRkrsnLAon8JGSufCRkrAnID0+ICfwkZK8JywKJ/CRkrnwkZK9JyA9PiAn8JGSvicsCifwkZa48JGWrycgPT4gJ/CRlronLAon8JGWufCRlq8nID0+ICfwkZa7JywKJ/CRpLXwkaSwJyA9PiAn8JGkuCcsCik7Cjw/cGhwCgpyZXR1cm4gYXJyYXkgKAonw4AnID0+ICdBzIAnLAonw4EnID0+ICdBzIEnLAonw4InID0+ICdBzIInLAonw4MnID0+ICdBzIMnLAonw4QnID0+ICdBzIgnLAonw4UnID0+ICdBzIonLAonw4cnID0+ICdDzKcnLAonw4gnID0+ICdFzIAnLAonw4knID0+ICdFzIEnLAonw4onID0+ICdFzIInLAonw4snID0+ICdFzIgnLAonw4wnID0+ICdJzIAnLAonw40nID0+ICdJzIEnLAonw44nID0+ICdJzIInLAonw48nID0+ICdJzIgnLAonw5EnID0+ICdOzIMnLAonw5InID0+ICdPzIAnLAonw5MnID0+ICdPzIEnLAonw5QnID0+ICdPzIInLAonw5UnID0+ICdPzIMnLAonw5YnID0+ICdPzIgnLAonw5knID0+ICdVzIAnLAonw5onID0+ICdVzIEnLAonw5snID0+ICdVzIInLAonw5wnID0+ICdVzIgnLAonw50nID0+ICdZzIEnLAonw6AnID0+ICdhzIAnLAonw6EnID0+ICdhzIEnLAonw6InID0+ICdhzIInLAonw6MnID0+ICdhzIMnLAonw6QnID0+ICdhzIgnLAonw6UnID0+ICdhzIonLAonw6cnID0+ICdjzKcnLAonw6gnID0+ICdlzIAnLAonw6knID0+ICdlzIEnLAonw6onID0+ICdlzIInLAonw6snID0+ICdlzIgnLAonw6wnID0+ICdpzIAnLAonw60nID0+ICdpzIEnLAonw64nID0+ICdpzIInLAonw68nID0+ICdpzIgnLAonw7EnID0+ICduzIMnLAonw7InID0+ICdvzIAnLAonw7MnID0+ICdvzIEnLAonw7QnID0+ICdvzIInLAonw7UnID0+ICdvzIMnLAonw7YnID0+ICdvzIgnLAonw7knID0+ICd1zIAnLAonw7onID0+ICd1zIEnLAonw7snID0+ICd1zIInLAonw7wnID0+ICd1zIgnLAonw70nID0+ICd5zIEnLAonw78nID0+ICd5zIgnLAonxIAnID0+ICdBzIQnLAonxIEnID0+ICdhzIQnLAonxIInID0+ICdBzIYnLAonxIMnID0+ICdhzIYnLAonxIQnID0+ICdBzKgnLAonxIUnID0+ICdhzKgnLAonxIYnID0+ICdDzIEnLAonxIcnID0+ICdjzIEnLAonxIgnID0+ICdDzIInLAonxIknID0+ICdjzIInLAonxIonID0+ICdDzIcnLAonxIsnID0+ICdjzIcnLAonxIwnID0+ICdDzIwnLAonxI0nID0+ICdjzIwnLAonxI4nID0+ICdEzIwnLAonxI8nID0+ICdkzIwnLAonxJInID0+ICdFzIQnLAonxJMnID0+ICdlzIQnLAonxJQnID0+ICdFzIYnLAonxJUnID0+ICdlzIYnLAonxJYnID0+ICdFzIcnLAonxJcnID0+ICdlzIcnLAonxJgnID0+ICdFzKgnLAonxJknID0+ICdlzKgnLAonxJonID0+ICdFzIwnLAonxJsnID0+ICdlzIwnLAonxJwnID0+ICdHzIInLAonxJ0nID0+ICdnzIInLAonxJ4nID0+ICdHzIYnLAonxJ8nID0+ICdnzIYnLAonxKAnID0+ICdHzIcnLAonxKEnID0+ICdnzIcnLAonxKInID0+ICdHzKcnLAonxKMnID0+ICdnzKcnLAonxKQnID0+ICdIzIInLAonxKUnID0+ICdozIInLAonxKgnID0+ICdJzIMnLAonxKknID0+ICdpzIMnLAonxKonID0+ICdJzIQnLAonxKsnID0+ICdpzIQnLAonxKwnID0+ICdJzIYnLAonxK0nID0+ICdpzIYnLAonxK4nID0+ICdJzKgnLAonxK8nID0+ICdpzKgnLAonxLAnID0+ICdJzIcnLAonxLQnID0+ICdKzIInLAonxLUnID0+ICdqzIInLAonxLYnID0+ICdLzKcnLAonxLcnID0+ICdrzKcnLAonxLknID0+ICdMzIEnLAonxLonID0+ICdszIEnLAonxLsnID0+ICdMzKcnLAonxLwnID0+ICdszKcnLAonxL0nID0+ICdMzIwnLAonxL4nID0+ICdszIwnLAonxYMnID0+ICdOzIEnLAonxYQnID0+ICduzIEnLAonxYUnID0+ICdOzKcnLAonxYYnID0+ICduzKcnLAonxYcnID0+ICdOzIwnLAonxYgnID0+ICduzIwnLAonxYwnID0+ICdPzIQnLAonxY0nID0+ICdvzIQnLAonxY4nID0+ICdPzIYnLAonxY8nID0+ICdvzIYnLAonxZAnID0+ICdPzIsnLAonxZEnID0+ICdvzIsnLAonxZQnID0+ICdSzIEnLAonxZUnID0+ICdyzIEnLAonxZYnID0+ICdSzKcnLAonxZcnID0+ICdyzKcnLAonxZgnID0+ICdSzIwnLAonxZknID0+ICdyzIwnLAonxZonID0+ICdTzIEnLAonxZsnID0+ICdzzIEnLAonxZwnID0+ICdTzIInLAonxZ0nID0+ICdzzIInLAonxZ4nID0+ICdTzKcnLAonxZ8nID0+ICdzzKcnLAonxaAnID0+ICdTzIwnLAonxaEnID0+ICdzzIwnLAonxaInID0+ICdUzKcnLAonxaMnID0+ICd0zKcnLAonxaQnID0+ICdUzIwnLAonxaUnID0+ICd0zIwnLAonxagnID0+ICdVzIMnLAonxaknID0+ICd1zIMnLAonxaonID0+ICdVzIQnLAonxasnID0+ICd1zIQnLAonxawnID0+ICdVzIYnLAonxa0nID0+ICd1zIYnLAonxa4nID0+ICdVzIonLAonxa8nID0+ICd1zIonLAonxbAnID0+ICdVzIsnLAonxbEnID0+ICd1zIsnLAonxbInID0+ICdVzKgnLAonxbMnID0+ICd1zKgnLAonxbQnID0+ICdXzIInLAonxbUnID0+ICd3zIInLAonxbYnID0+ICdZzIInLAonxbcnID0+ICd5zIInLAonxbgnID0+ICdZzIgnLAonxbknID0+ICdazIEnLAonxbonID0+ICd6zIEnLAonxbsnID0+ICdazIcnLAonxbwnID0+ICd6zIcnLAonxb0nID0+ICdazIwnLAonxb4nID0+ICd6zIwnLAonxqAnID0+ICdPzJsnLAonxqEnID0+ICdvzJsnLAonxq8nID0+ICdVzJsnLAonxrAnID0+ICd1zJsnLAonx40nID0+ICdBzIwnLAonx44nID0+ICdhzIwnLAonx48nID0+ICdJzIwnLAonx5AnID0+ICdpzIwnLAonx5EnID0+ICdPzIwnLAonx5InID0+ICdvzIwnLAonx5MnID0+ICdVzIwnLAonx5QnID0+ICd1zIwnLAonx5UnID0+ICdVzIjMhCcsCifHlicgPT4gJ3XMiMyEJywKJ8eXJyA9PiAnVcyIzIEnLAonx5gnID0+ICd1zIjMgScsCifHmScgPT4gJ1XMiMyMJywKJ8eaJyA9PiAndcyIzIwnLAonx5snID0+ICdVzIjMgCcsCifHnCcgPT4gJ3XMiMyAJywKJ8eeJyA9PiAnQcyIzIQnLAonx58nID0+ICdhzIjMhCcsCifHoCcgPT4gJ0HMh8yEJywKJ8ehJyA9PiAnYcyHzIQnLAonx6InID0+ICfDhsyEJywKJ8ejJyA9PiAnw6bMhCcsCifHpicgPT4gJ0fMjCcsCifHpycgPT4gJ2fMjCcsCifHqCcgPT4gJ0vMjCcsCifHqScgPT4gJ2vMjCcsCifHqicgPT4gJ0/MqCcsCifHqycgPT4gJ2/MqCcsCifHrCcgPT4gJ0/MqMyEJywKJ8etJyA9PiAnb8yozIQnLAonx64nID0+ICfGt8yMJywKJ8evJyA9PiAnypLMjCcsCifHsCcgPT4gJ2rMjCcsCifHtCcgPT4gJ0fMgScsCifHtScgPT4gJ2fMgScsCifHuCcgPT4gJ07MgCcsCifHuScgPT4gJ27MgCcsCifHuicgPT4gJ0HMisyBJywKJ8e7JyA9PiAnYcyKzIEnLAonx7wnID0+ICfDhsyBJywKJ8e9JyA9PiAnw6bMgScsCifHvicgPT4gJ8OYzIEnLAonx78nID0+ICfDuMyBJywKJ8iAJyA9PiAnQcyPJywKJ8iBJyA9PiAnYcyPJywKJ8iCJyA9PiAnQcyRJywKJ8iDJyA9PiAnYcyRJywKJ8iEJyA9PiAnRcyPJywKJ8iFJyA9PiAnZcyPJywKJ8iGJyA9PiAnRcyRJywKJ8iHJyA9PiAnZcyRJywKJ8iIJyA9PiAnScyPJywKJ8iJJyA9PiAnacyPJywKJ8iKJyA9PiAnScyRJywKJ8iLJyA9PiAnacyRJywKJ8iMJyA9PiAnT8yPJywKJ8iNJyA9PiAnb8yPJywKJ8iOJyA9PiAnT8yRJywKJ8iPJyA9PiAnb8yRJywKJ8iQJyA9PiAnUsyPJywKJ8iRJyA9PiAncsyPJywKJ8iSJyA9PiAnUsyRJywKJ8iTJyA9PiAncsyRJywKJ8iUJyA9PiAnVcyPJywKJ8iVJyA9PiAndcyPJywKJ8iWJyA9PiAnVcyRJywKJ8iXJyA9PiAndcyRJywKJ8iYJyA9PiAnU8ymJywKJ8iZJyA9PiAnc8ymJywKJ8iaJyA9PiAnVMymJywKJ8ibJyA9PiAndMymJywKJ8ieJyA9PiAnSMyMJywKJ8ifJyA9PiAnaMyMJywKJ8imJyA9PiAnQcyHJywKJ8inJyA9PiAnYcyHJywKJ8ioJyA9PiAnRcynJywKJ8ipJyA9PiAnZcynJywKJ8iqJyA9PiAnT8yIzIQnLAonyKsnID0+ICdvzIjMhCcsCifIrCcgPT4gJ0/Mg8yEJywKJ8itJyA9PiAnb8yDzIQnLAonyK4nID0+ICdPzIcnLAonyK8nID0+ICdvzIcnLAonyLAnID0+ICdPzIfMhCcsCifIsScgPT4gJ2/Mh8yEJywKJ8iyJyA9PiAnWcyEJywKJ8izJyA9PiAnecyEJywKJ82AJyA9PiAnzIAnLAonzYEnID0+ICfMgScsCifNgycgPT4gJ8yTJywKJ82EJyA9PiAnzIjMgScsCifNtCcgPT4gJ8q5JywKJ82+JyA9PiAnOycsCifOhScgPT4gJ8KozIEnLAonzoYnID0+ICfOkcyBJywKJ86HJyA9PiAnwrcnLAonzognID0+ICfOlcyBJywKJ86JJyA9PiAnzpfMgScsCifOiicgPT4gJ86ZzIEnLAonzownID0+ICfOn8yBJywKJ86OJyA9PiAnzqXMgScsCifOjycgPT4gJ86pzIEnLAonzpAnID0+ICfOucyIzIEnLAonzqonID0+ICfOmcyIJywKJ86rJyA9PiAnzqXMiCcsCifOrCcgPT4gJ86xzIEnLAonzq0nID0+ICfOtcyBJywKJ86uJyA9PiAnzrfMgScsCifOrycgPT4gJ865zIEnLAonzrAnID0+ICfPhcyIzIEnLAonz4onID0+ICfOucyIJywKJ8+LJyA9PiAnz4XMiCcsCifPjCcgPT4gJ86/zIEnLAonz40nID0+ICfPhcyBJywKJ8+OJyA9PiAnz4nMgScsCifPkycgPT4gJ8+SzIEnLAonz5QnID0+ICfPksyIJywKJ9CAJyA9PiAn0JXMgCcsCifQgScgPT4gJ9CVzIgnLAon0IMnID0+ICfQk8yBJywKJ9CHJyA9PiAn0IbMiCcsCifQjCcgPT4gJ9CazIEnLAon0I0nID0+ICfQmMyAJywKJ9COJyA9PiAn0KPMhicsCifQmScgPT4gJ9CYzIYnLAon0LknID0+ICfQuMyGJywKJ9GQJyA9PiAn0LXMgCcsCifRkScgPT4gJ9C1zIgnLAon0ZMnID0+ICfQs8yBJywKJ9GXJyA9PiAn0ZbMiCcsCifRnCcgPT4gJ9C6zIEnLAon0Z0nID0+ICfQuMyAJywKJ9GeJyA9PiAn0YPMhicsCifRticgPT4gJ9G0zI8nLAon0bcnID0+ICfRtcyPJywKJ9OBJyA9PiAn0JbMhicsCifTgicgPT4gJ9C2zIYnLAon05AnID0+ICfQkMyGJywKJ9ORJyA9PiAn0LDMhicsCifTkicgPT4gJ9CQzIgnLAon05MnID0+ICfQsMyIJywKJ9OWJyA9PiAn0JXMhicsCifTlycgPT4gJ9C1zIYnLAon05onID0+ICfTmMyIJywKJ9ObJyA9PiAn05nMiCcsCifTnCcgPT4gJ9CWzIgnLAon050nID0+ICfQtsyIJywKJ9OeJyA9PiAn0JfMiCcsCifTnycgPT4gJ9C3zIgnLAon06InID0+ICfQmMyEJywKJ9OjJyA9PiAn0LjMhCcsCifTpCcgPT4gJ9CYzIgnLAon06UnID0+ICfQuMyIJywKJ9OmJyA9PiAn0J7MiCcsCifTpycgPT4gJ9C+zIgnLAon06onID0+ICfTqMyIJywKJ9OrJyA9PiAn06nMiCcsCifTrCcgPT4gJ9CtzIgnLAon060nID0+ICfRjcyIJywKJ9OuJyA9PiAn0KPMhCcsCifTrycgPT4gJ9GDzIQnLAon07AnID0+ICfQo8yIJywKJ9OxJyA9PiAn0YPMiCcsCifTsicgPT4gJ9CjzIsnLAon07MnID0+ICfRg8yLJywKJ9O0JyA9PiAn0KfMiCcsCifTtScgPT4gJ9GHzIgnLAon07gnID0+ICfQq8yIJywKJ9O5JyA9PiAn0YvMiCcsCifYoicgPT4gJ9in2ZMnLAon2KMnID0+ICfYp9mUJywKJ9ikJyA9PiAn2YjZlCcsCifYpScgPT4gJ9in2ZUnLAon2KYnID0+ICfZitmUJywKJ9uAJyA9PiAn25XZlCcsCifbgicgPT4gJ9uB2ZQnLAon25MnID0+ICfbktmUJywKJ+CkqScgPT4gJ+CkqOCkvCcsCifgpLEnID0+ICfgpLDgpLwnLAon4KS0JyA9PiAn4KSz4KS8JywKJ+ClmCcgPT4gJ+CkleCkvCcsCifgpZknID0+ICfgpJbgpLwnLAon4KWaJyA9PiAn4KSX4KS8JywKJ+ClmycgPT4gJ+CknOCkvCcsCifgpZwnID0+ICfgpKHgpLwnLAon4KWdJyA9PiAn4KSi4KS8JywKJ+ClnicgPT4gJ+Ckq+CkvCcsCifgpZ8nID0+ICfgpK/gpLwnLAon4KeLJyA9PiAn4KeH4Ka+JywKJ+CnjCcgPT4gJ+Cnh+CnlycsCifgp5wnID0+ICfgpqHgprwnLAon4KedJyA9PiAn4Kai4Ka8JywKJ+CnnycgPT4gJ+Cmr+CmvCcsCifgqLMnID0+ICfgqLLgqLwnLAon4Ki2JyA9PiAn4Ki44Ki8JywKJ+CpmScgPT4gJ+ColuCovCcsCifgqZonID0+ICfgqJfgqLwnLAon4KmbJyA9PiAn4Kic4Ki8JywKJ+CpnicgPT4gJ+Coq+CovCcsCifgrYgnID0+ICfgrYfgrZYnLAon4K2LJyA9PiAn4K2H4Ky+JywKJ+CtjCcgPT4gJ+Cth+CtlycsCifgrZwnID0+ICfgrKHgrLwnLAon4K2dJyA9PiAn4Kyi4Ky8JywKJ+CulCcgPT4gJ+CukuCvlycsCifgr4onID0+ICfgr4bgrr4nLAon4K+LJyA9PiAn4K+H4K6+JywKJ+CvjCcgPT4gJ+CvhuCvlycsCifgsYgnID0+ICfgsYbgsZYnLAon4LOAJyA9PiAn4LK/4LOVJywKJ+CzhycgPT4gJ+CzhuCzlScsCifgs4gnID0+ICfgs4bgs5YnLAon4LOKJyA9PiAn4LOG4LOCJywKJ+CziycgPT4gJ+CzhuCzguCzlScsCifgtYonID0+ICfgtYbgtL4nLAon4LWLJyA9PiAn4LWH4LS+JywKJ+C1jCcgPT4gJ+C1huC1lycsCifgt5onID0+ICfgt5ngt4onLAon4LecJyA9PiAn4LeZ4LePJywKJ+C3nScgPT4gJ+C3meC3j+C3iicsCifgt54nID0+ICfgt5ngt58nLAon4L2DJyA9PiAn4L2C4L63JywKJ+C9jScgPT4gJ+C9jOC+tycsCifgvZInID0+ICfgvZHgvrcnLAon4L2XJyA9PiAn4L2W4L63JywKJ+C9nCcgPT4gJ+C9m+C+tycsCifgvaknID0+ICfgvYDgvrUnLAon4L2zJyA9PiAn4L2x4L2yJywKJ+C9tScgPT4gJ+C9seC9tCcsCifgvbYnID0+ICfgvrLgvoAnLAon4L24JyA9PiAn4L6z4L6AJywKJ+C+gScgPT4gJ+C9seC+gCcsCifgvpMnID0+ICfgvpLgvrcnLAon4L6dJyA9PiAn4L6c4L63JywKJ+C+oicgPT4gJ+C+oeC+tycsCifgvqcnID0+ICfgvqbgvrcnLAon4L6sJyA9PiAn4L6r4L63JywKJ+C+uScgPT4gJ+C+kOC+tScsCifhgKYnID0+ICfhgKXhgK4nLAon4ayGJyA9PiAn4ayF4ay1JywKJ+GsiCcgPT4gJ+Gsh+GstScsCifhrIonID0+ICfhrInhrLUnLAon4ayMJyA9PiAn4ayL4ay1JywKJ+GsjicgPT4gJ+GsjeGstScsCifhrJInID0+ICfhrJHhrLUnLAon4ay7JyA9PiAn4ay64ay1JywKJ+GsvScgPT4gJ+GsvOGstScsCifhrYAnID0+ICfhrL7hrLUnLAon4a2BJyA9PiAn4ay/4ay1JywKJ+GtgycgPT4gJ+GtguGstScsCifhuIAnID0+ICdBzKUnLAon4biBJyA9PiAnYcylJywKJ+G4gicgPT4gJ0LMhycsCifhuIMnID0+ICdizIcnLAon4biEJyA9PiAnQsyjJywKJ+G4hScgPT4gJ2LMoycsCifhuIYnID0+ICdCzLEnLAon4biHJyA9PiAnYsyxJywKJ+G4iCcgPT4gJ0PMp8yBJywKJ+G4iScgPT4gJ2PMp8yBJywKJ+G4iicgPT4gJ0TMhycsCifhuIsnID0+ICdkzIcnLAon4biMJyA9PiAnRMyjJywKJ+G4jScgPT4gJ2TMoycsCifhuI4nID0+ICdEzLEnLAon4biPJyA9PiAnZMyxJywKJ+G4kCcgPT4gJ0TMpycsCifhuJEnID0+ICdkzKcnLAon4biSJyA9PiAnRMytJywKJ+G4kycgPT4gJ2TMrScsCifhuJQnID0+ICdFzITMgCcsCifhuJUnID0+ICdlzITMgCcsCifhuJYnID0+ICdFzITMgScsCifhuJcnID0+ICdlzITMgScsCifhuJgnID0+ICdFzK0nLAon4biZJyA9PiAnZcytJywKJ+G4micgPT4gJ0XMsCcsCifhuJsnID0+ICdlzLAnLAon4bicJyA9PiAnRcynzIYnLAon4bidJyA9PiAnZcynzIYnLAon4bieJyA9PiAnRsyHJywKJ+G4nycgPT4gJ2bMhycsCifhuKAnID0+ICdHzIQnLAon4bihJyA9PiAnZ8yEJywKJ+G4oicgPT4gJ0jMhycsCifhuKMnID0+ICdozIcnLAon4bikJyA9PiAnSMyjJywKJ+G4pScgPT4gJ2jMoycsCifhuKYnID0+ICdIzIgnLAon4binJyA9PiAnaMyIJywKJ+G4qCcgPT4gJ0jMpycsCifhuKknID0+ICdozKcnLAon4biqJyA9PiAnSMyuJywKJ+G4qycgPT4gJ2jMricsCifhuKwnID0+ICdJzLAnLAon4bitJyA9PiAnacywJywKJ+G4ricgPT4gJ0nMiMyBJywKJ+G4rycgPT4gJ2nMiMyBJywKJ+G4sCcgPT4gJ0vMgScsCifhuLEnID0+ICdrzIEnLAon4biyJyA9PiAnS8yjJywKJ+G4sycgPT4gJ2vMoycsCifhuLQnID0+ICdLzLEnLAon4bi1JyA9PiAna8yxJywKJ+G4ticgPT4gJ0zMoycsCifhuLcnID0+ICdszKMnLAon4bi4JyA9PiAnTMyjzIQnLAon4bi5JyA9PiAnbMyjzIQnLAon4bi6JyA9PiAnTMyxJywKJ+G4uycgPT4gJ2zMsScsCifhuLwnID0+ICdMzK0nLAon4bi9JyA9PiAnbMytJywKJ+G4vicgPT4gJ03MgScsCifhuL8nID0+ICdtzIEnLAon4bmAJyA9PiAnTcyHJywKJ+G5gScgPT4gJ23MhycsCifhuYInID0+ICdNzKMnLAon4bmDJyA9PiAnbcyjJywKJ+G5hCcgPT4gJ07MhycsCifhuYUnID0+ICduzIcnLAon4bmGJyA9PiAnTsyjJywKJ+G5hycgPT4gJ27MoycsCifhuYgnID0+ICdOzLEnLAon4bmJJyA9PiAnbsyxJywKJ+G5iicgPT4gJ07MrScsCifhuYsnID0+ICduzK0nLAon4bmMJyA9PiAnT8yDzIEnLAon4bmNJyA9PiAnb8yDzIEnLAon4bmOJyA9PiAnT8yDzIgnLAon4bmPJyA9PiAnb8yDzIgnLAon4bmQJyA9PiAnT8yEzIAnLAon4bmRJyA9PiAnb8yEzIAnLAon4bmSJyA9PiAnT8yEzIEnLAon4bmTJyA9PiAnb8yEzIEnLAon4bmUJyA9PiAnUMyBJywKJ+G5lScgPT4gJ3DMgScsCifhuZYnID0+ICdQzIcnLAon4bmXJyA9PiAncMyHJywKJ+G5mCcgPT4gJ1LMhycsCifhuZknID0+ICdyzIcnLAon4bmaJyA9PiAnUsyjJywKJ+G5mycgPT4gJ3LMoycsCifhuZwnID0+ICdSzKPMhCcsCifhuZ0nID0+ICdyzKPMhCcsCifhuZ4nID0+ICdSzLEnLAon4bmfJyA9PiAncsyxJywKJ+G5oCcgPT4gJ1PMhycsCifhuaEnID0+ICdzzIcnLAon4bmiJyA9PiAnU8yjJywKJ+G5oycgPT4gJ3PMoycsCifhuaQnID0+ICdTzIHMhycsCifhuaUnID0+ICdzzIHMhycsCifhuaYnID0+ICdTzIzMhycsCifhuacnID0+ICdzzIzMhycsCifhuagnID0+ICdTzKPMhycsCifhuaknID0+ICdzzKPMhycsCifhuaonID0+ICdUzIcnLAon4bmrJyA9PiAndMyHJywKJ+G5rCcgPT4gJ1TMoycsCifhua0nID0+ICd0zKMnLAon4bmuJyA9PiAnVMyxJywKJ+G5rycgPT4gJ3TMsScsCifhubAnID0+ICdUzK0nLAon4bmxJyA9PiAndMytJywKJ+G5sicgPT4gJ1XMpCcsCifhubMnID0+ICd1zKQnLAon4bm0JyA9PiAnVcywJywKJ+G5tScgPT4gJ3XMsCcsCifhubYnID0+ICdVzK0nLAon4bm3JyA9PiAndcytJywKJ+G5uCcgPT4gJ1XMg8yBJywKJ+G5uScgPT4gJ3XMg8yBJywKJ+G5uicgPT4gJ1XMhMyIJywKJ+G5uycgPT4gJ3XMhMyIJywKJ+G5vCcgPT4gJ1bMgycsCifhub0nID0+ICd2zIMnLAon4bm+JyA9PiAnVsyjJywKJ+G5vycgPT4gJ3bMoycsCifhuoAnID0+ICdXzIAnLAon4bqBJyA9PiAnd8yAJywKJ+G6gicgPT4gJ1fMgScsCifhuoMnID0+ICd3zIEnLAon4bqEJyA9PiAnV8yIJywKJ+G6hScgPT4gJ3fMiCcsCifhuoYnID0+ICdXzIcnLAon4bqHJyA9PiAnd8yHJywKJ+G6iCcgPT4gJ1fMoycsCifhuoknID0+ICd3zKMnLAon4bqKJyA9PiAnWMyHJywKJ+G6iycgPT4gJ3jMhycsCifhuownID0+ICdYzIgnLAon4bqNJyA9PiAneMyIJywKJ+G6jicgPT4gJ1nMhycsCifhuo8nID0+ICd5zIcnLAon4bqQJyA9PiAnWsyCJywKJ+G6kScgPT4gJ3rMgicsCifhupInID0+ICdazKMnLAon4bqTJyA9PiAnesyjJywKJ+G6lCcgPT4gJ1rMsScsCifhupUnID0+ICd6zLEnLAon4bqWJyA9PiAnaMyxJywKJ+G6lycgPT4gJ3TMiCcsCifhupgnID0+ICd3zIonLAon4bqZJyA9PiAnecyKJywKJ+G6mycgPT4gJ8W/zIcnLAon4bqgJyA9PiAnQcyjJywKJ+G6oScgPT4gJ2HMoycsCifhuqInID0+ICdBzIknLAon4bqjJyA9PiAnYcyJJywKJ+G6pCcgPT4gJ0HMgsyBJywKJ+G6pScgPT4gJ2HMgsyBJywKJ+G6picgPT4gJ0HMgsyAJywKJ+G6pycgPT4gJ2HMgsyAJywKJ+G6qCcgPT4gJ0HMgsyJJywKJ+G6qScgPT4gJ2HMgsyJJywKJ+G6qicgPT4gJ0HMgsyDJywKJ+G6qycgPT4gJ2HMgsyDJywKJ+G6rCcgPT4gJ0HMo8yCJywKJ+G6rScgPT4gJ2HMo8yCJywKJ+G6ricgPT4gJ0HMhsyBJywKJ+G6rycgPT4gJ2HMhsyBJywKJ+G6sCcgPT4gJ0HMhsyAJywKJ+G6sScgPT4gJ2HMhsyAJywKJ+G6sicgPT4gJ0HMhsyJJywKJ+G6sycgPT4gJ2HMhsyJJywKJ+G6tCcgPT4gJ0HMhsyDJywKJ+G6tScgPT4gJ2HMhsyDJywKJ+G6ticgPT4gJ0HMo8yGJywKJ+G6tycgPT4gJ2HMo8yGJywKJ+G6uCcgPT4gJ0XMoycsCifhurknID0+ICdlzKMnLAon4bq6JyA9PiAnRcyJJywKJ+G6uycgPT4gJ2XMiScsCifhurwnID0+ICdFzIMnLAon4bq9JyA9PiAnZcyDJywKJ+G6vicgPT4gJ0XMgsyBJywKJ+G6vycgPT4gJ2XMgsyBJywKJ+G7gCcgPT4gJ0XMgsyAJywKJ+G7gScgPT4gJ2XMgsyAJywKJ+G7gicgPT4gJ0XMgsyJJywKJ+G7gycgPT4gJ2XMgsyJJywKJ+G7hCcgPT4gJ0XMgsyDJywKJ+G7hScgPT4gJ2XMgsyDJywKJ+G7hicgPT4gJ0XMo8yCJywKJ+G7hycgPT4gJ2XMo8yCJywKJ+G7iCcgPT4gJ0nMiScsCifhu4knID0+ICdpzIknLAon4buKJyA9PiAnScyjJywKJ+G7iycgPT4gJ2nMoycsCifhu4wnID0+ICdPzKMnLAon4buNJyA9PiAnb8yjJywKJ+G7jicgPT4gJ0/MiScsCifhu48nID0+ICdvzIknLAon4buQJyA9PiAnT8yCzIEnLAon4buRJyA9PiAnb8yCzIEnLAon4buSJyA9PiAnT8yCzIAnLAon4buTJyA9PiAnb8yCzIAnLAon4buUJyA9PiAnT8yCzIknLAon4buVJyA9PiAnb8yCzIknLAon4buWJyA9PiAnT8yCzIMnLAon4buXJyA9PiAnb8yCzIMnLAon4buYJyA9PiAnT8yjzIInLAon4buZJyA9PiAnb8yjzIInLAon4buaJyA9PiAnT8ybzIEnLAon4bubJyA9PiAnb8ybzIEnLAon4bucJyA9PiAnT8ybzIAnLAon4budJyA9PiAnb8ybzIAnLAon4bueJyA9PiAnT8ybzIknLAon4bufJyA9PiAnb8ybzIknLAon4bugJyA9PiAnT8ybzIMnLAon4buhJyA9PiAnb8ybzIMnLAon4buiJyA9PiAnT8ybzKMnLAon4bujJyA9PiAnb8ybzKMnLAon4bukJyA9PiAnVcyjJywKJ+G7pScgPT4gJ3XMoycsCifhu6YnID0+ICdVzIknLAon4bunJyA9PiAndcyJJywKJ+G7qCcgPT4gJ1XMm8yBJywKJ+G7qScgPT4gJ3XMm8yBJywKJ+G7qicgPT4gJ1XMm8yAJywKJ+G7qycgPT4gJ3XMm8yAJywKJ+G7rCcgPT4gJ1XMm8yJJywKJ+G7rScgPT4gJ3XMm8yJJywKJ+G7ricgPT4gJ1XMm8yDJywKJ+G7rycgPT4gJ3XMm8yDJywKJ+G7sCcgPT4gJ1XMm8yjJywKJ+G7sScgPT4gJ3XMm8yjJywKJ+G7sicgPT4gJ1nMgCcsCifhu7MnID0+ICd5zIAnLAon4bu0JyA9PiAnWcyjJywKJ+G7tScgPT4gJ3nMoycsCifhu7YnID0+ICdZzIknLAon4bu3JyA9PiAnecyJJywKJ+G7uCcgPT4gJ1nMgycsCifhu7knID0+ICd5zIMnLAon4byAJyA9PiAnzrHMkycsCifhvIEnID0+ICfOscyUJywKJ+G8gicgPT4gJ86xzJPMgCcsCifhvIMnID0+ICfOscyUzIAnLAon4byEJyA9PiAnzrHMk8yBJywKJ+G8hScgPT4gJ86xzJTMgScsCifhvIYnID0+ICfOscyTzYInLAon4byHJyA9PiAnzrHMlM2CJywKJ+G8iCcgPT4gJ86RzJMnLAon4byJJyA9PiAnzpHMlCcsCifhvIonID0+ICfOkcyTzIAnLAon4byLJyA9PiAnzpHMlMyAJywKJ+G8jCcgPT4gJ86RzJPMgScsCifhvI0nID0+ICfOkcyUzIEnLAon4byOJyA9PiAnzpHMk82CJywKJ+G8jycgPT4gJ86RzJTNgicsCifhvJAnID0+ICfOtcyTJywKJ+G8kScgPT4gJ861zJQnLAon4bySJyA9PiAnzrXMk8yAJywKJ+G8kycgPT4gJ861zJTMgCcsCifhvJQnID0+ICfOtcyTzIEnLAon4byVJyA9PiAnzrXMlMyBJywKJ+G8mCcgPT4gJ86VzJMnLAon4byZJyA9PiAnzpXMlCcsCifhvJonID0+ICfOlcyTzIAnLAon4bybJyA9PiAnzpXMlMyAJywKJ+G8nCcgPT4gJ86VzJPMgScsCifhvJ0nID0+ICfOlcyUzIEnLAon4bygJyA9PiAnzrfMkycsCifhvKEnID0+ICfOt8yUJywKJ+G8oicgPT4gJ863zJPMgCcsCifhvKMnID0+ICfOt8yUzIAnLAon4bykJyA9PiAnzrfMk8yBJywKJ+G8pScgPT4gJ863zJTMgScsCifhvKYnID0+ICfOt8yTzYInLAon4bynJyA9PiAnzrfMlM2CJywKJ+G8qCcgPT4gJ86XzJMnLAon4bypJyA9PiAnzpfMlCcsCifhvKonID0+ICfOl8yTzIAnLAon4byrJyA9PiAnzpfMlMyAJywKJ+G8rCcgPT4gJ86XzJPMgScsCifhvK0nID0+ICfOl8yUzIEnLAon4byuJyA9PiAnzpfMk82CJywKJ+G8rycgPT4gJ86XzJTNgicsCifhvLAnID0+ICfOucyTJywKJ+G8sScgPT4gJ865zJQnLAon4byyJyA9PiAnzrnMk8yAJywKJ+G8sycgPT4gJ865zJTMgCcsCifhvLQnID0+ICfOucyTzIEnLAon4by1JyA9PiAnzrnMlMyBJywKJ+G8ticgPT4gJ865zJPNgicsCifhvLcnID0+ICfOucyUzYInLAon4by4JyA9PiAnzpnMkycsCifhvLknID0+ICfOmcyUJywKJ+G8uicgPT4gJ86ZzJPMgCcsCifhvLsnID0+ICfOmcyUzIAnLAon4by8JyA9PiAnzpnMk8yBJywKJ+G8vScgPT4gJ86ZzJTMgScsCifhvL4nID0+ICfOmcyTzYInLAon4by/JyA9PiAnzpnMlM2CJywKJ+G9gCcgPT4gJ86/zJMnLAon4b2BJyA9PiAnzr/MlCcsCifhvYInID0+ICfOv8yTzIAnLAon4b2DJyA9PiAnzr/MlMyAJywKJ+G9hCcgPT4gJ86/zJPMgScsCifhvYUnID0+ICfOv8yUzIEnLAon4b2IJyA9PiAnzp/MkycsCifhvYknID0+ICfOn8yUJywKJ+G9iicgPT4gJ86fzJPMgCcsCifhvYsnID0+ICfOn8yUzIAnLAon4b2MJyA9PiAnzp/Mk8yBJywKJ+G9jScgPT4gJ86fzJTMgScsCifhvZAnID0+ICfPhcyTJywKJ+G9kScgPT4gJ8+FzJQnLAon4b2SJyA9PiAnz4XMk8yAJywKJ+G9kycgPT4gJ8+FzJTMgCcsCifhvZQnID0+ICfPhcyTzIEnLAon4b2VJyA9PiAnz4XMlMyBJywKJ+G9licgPT4gJ8+FzJPNgicsCifhvZcnID0+ICfPhcyUzYInLAon4b2ZJyA9PiAnzqXMlCcsCifhvZsnID0+ICfOpcyUzIAnLAon4b2dJyA9PiAnzqXMlMyBJywKJ+G9nycgPT4gJ86lzJTNgicsCifhvaAnID0+ICfPicyTJywKJ+G9oScgPT4gJ8+JzJQnLAon4b2iJyA9PiAnz4nMk8yAJywKJ+G9oycgPT4gJ8+JzJTMgCcsCifhvaQnID0+ICfPicyTzIEnLAon4b2lJyA9PiAnz4nMlMyBJywKJ+G9picgPT4gJ8+JzJPNgicsCifhvacnID0+ICfPicyUzYInLAon4b2oJyA9PiAnzqnMkycsCifhvaknID0+ICfOqcyUJywKJ+G9qicgPT4gJ86pzJPMgCcsCifhvasnID0+ICfOqcyUzIAnLAon4b2sJyA9PiAnzqnMk8yBJywKJ+G9rScgPT4gJ86pzJTMgScsCifhva4nID0+ICfOqcyTzYInLAon4b2vJyA9PiAnzqnMlM2CJywKJ+G9sCcgPT4gJ86xzIAnLAon4b2xJyA9PiAnzrHMgScsCifhvbInID0+ICfOtcyAJywKJ+G9sycgPT4gJ861zIEnLAon4b20JyA9PiAnzrfMgCcsCifhvbUnID0+ICfOt8yBJywKJ+G9ticgPT4gJ865zIAnLAon4b23JyA9PiAnzrnMgScsCifhvbgnID0+ICfOv8yAJywKJ+G9uScgPT4gJ86/zIEnLAon4b26JyA9PiAnz4XMgCcsCifhvbsnID0+ICfPhcyBJywKJ+G9vCcgPT4gJ8+JzIAnLAon4b29JyA9PiAnz4nMgScsCifhvoAnID0+ICfOscyTzYUnLAon4b6BJyA9PiAnzrHMlM2FJywKJ+G+gicgPT4gJ86xzJPMgM2FJywKJ+G+gycgPT4gJ86xzJTMgM2FJywKJ+G+hCcgPT4gJ86xzJPMgc2FJywKJ+G+hScgPT4gJ86xzJTMgc2FJywKJ+G+hicgPT4gJ86xzJPNgs2FJywKJ+G+hycgPT4gJ86xzJTNgs2FJywKJ+G+iCcgPT4gJ86RzJPNhScsCifhvoknID0+ICfOkcyUzYUnLAon4b6KJyA9PiAnzpHMk8yAzYUnLAon4b6LJyA9PiAnzpHMlMyAzYUnLAon4b6MJyA9PiAnzpHMk8yBzYUnLAon4b6NJyA9PiAnzpHMlMyBzYUnLAon4b6OJyA9PiAnzpHMk82CzYUnLAon4b6PJyA9PiAnzpHMlM2CzYUnLAon4b6QJyA9PiAnzrfMk82FJywKJ+G+kScgPT4gJ863zJTNhScsCifhvpInID0+ICfOt8yTzIDNhScsCifhvpMnID0+ICfOt8yUzIDNhScsCifhvpQnID0+ICfOt8yTzIHNhScsCifhvpUnID0+ICfOt8yUzIHNhScsCifhvpYnID0+ICfOt8yTzYLNhScsCifhvpcnID0+ICfOt8yUzYLNhScsCifhvpgnID0+ICfOl8yTzYUnLAon4b6ZJyA9PiAnzpfMlM2FJywKJ+G+micgPT4gJ86XzJPMgM2FJywKJ+G+mycgPT4gJ86XzJTMgM2FJywKJ+G+nCcgPT4gJ86XzJPMgc2FJywKJ+G+nScgPT4gJ86XzJTMgc2FJywKJ+G+nicgPT4gJ86XzJPNgs2FJywKJ+G+nycgPT4gJ86XzJTNgs2FJywKJ+G+oCcgPT4gJ8+JzJPNhScsCifhvqEnID0+ICfPicyUzYUnLAon4b6iJyA9PiAnz4nMk8yAzYUnLAon4b6jJyA9PiAnz4nMlMyAzYUnLAon4b6kJyA9PiAnz4nMk8yBzYUnLAon4b6lJyA9PiAnz4nMlMyBzYUnLAon4b6mJyA9PiAnz4nMk82CzYUnLAon4b6nJyA9PiAnz4nMlM2CzYUnLAon4b6oJyA9PiAnzqnMk82FJywKJ+G+qScgPT4gJ86pzJTNhScsCifhvqonID0+ICfOqcyTzIDNhScsCifhvqsnID0+ICfOqcyUzIDNhScsCifhvqwnID0+ICfOqcyTzIHNhScsCifhvq0nID0+ICfOqcyUzIHNhScsCifhvq4nID0+ICfOqcyTzYLNhScsCifhvq8nID0+ICfOqcyUzYLNhScsCifhvrAnID0+ICfOscyGJywKJ+G+sScgPT4gJ86xzIQnLAon4b6yJyA9PiAnzrHMgM2FJywKJ+G+sycgPT4gJ86xzYUnLAon4b60JyA9PiAnzrHMgc2FJywKJ+G+ticgPT4gJ86xzYInLAon4b63JyA9PiAnzrHNgs2FJywKJ+G+uCcgPT4gJ86RzIYnLAon4b65JyA9PiAnzpHMhCcsCifhvronID0+ICfOkcyAJywKJ+G+uycgPT4gJ86RzIEnLAon4b68JyA9PiAnzpHNhScsCifhvr4nID0+ICfOuScsCifhv4EnID0+ICfCqM2CJywKJ+G/gicgPT4gJ863zIDNhScsCifhv4MnID0+ICfOt82FJywKJ+G/hCcgPT4gJ863zIHNhScsCifhv4YnID0+ICfOt82CJywKJ+G/hycgPT4gJ863zYLNhScsCifhv4gnID0+ICfOlcyAJywKJ+G/iScgPT4gJ86VzIEnLAon4b+KJyA9PiAnzpfMgCcsCifhv4snID0+ICfOl8yBJywKJ+G/jCcgPT4gJ86XzYUnLAon4b+NJyA9PiAn4b6/zIAnLAon4b+OJyA9PiAn4b6/zIEnLAon4b+PJyA9PiAn4b6/zYInLAon4b+QJyA9PiAnzrnMhicsCifhv5EnID0+ICfOucyEJywKJ+G/kicgPT4gJ865zIjMgCcsCifhv5MnID0+ICfOucyIzIEnLAon4b+WJyA9PiAnzrnNgicsCifhv5cnID0+ICfOucyIzYInLAon4b+YJyA9PiAnzpnMhicsCifhv5knID0+ICfOmcyEJywKJ+G/micgPT4gJ86ZzIAnLAon4b+bJyA9PiAnzpnMgScsCifhv50nID0+ICfhv77MgCcsCifhv54nID0+ICfhv77MgScsCifhv58nID0+ICfhv77NgicsCifhv6AnID0+ICfPhcyGJywKJ+G/oScgPT4gJ8+FzIQnLAon4b+iJyA9PiAnz4XMiMyAJywKJ+G/oycgPT4gJ8+FzIjMgScsCifhv6QnID0+ICfPgcyTJywKJ+G/pScgPT4gJ8+BzJQnLAon4b+mJyA9PiAnz4XNgicsCifhv6cnID0+ICfPhcyIzYInLAon4b+oJyA9PiAnzqXMhicsCifhv6knID0+ICfOpcyEJywKJ+G/qicgPT4gJ86lzIAnLAon4b+rJyA9PiAnzqXMgScsCifhv6wnID0+ICfOocyUJywKJ+G/rScgPT4gJ8KozIAnLAon4b+uJyA9PiAnwqjMgScsCifhv68nID0+ICdgJywKJ+G/sicgPT4gJ8+JzIDNhScsCifhv7MnID0+ICfPic2FJywKJ+G/tCcgPT4gJ8+JzIHNhScsCifhv7YnID0+ICfPic2CJywKJ+G/tycgPT4gJ8+JzYLNhScsCifhv7gnID0+ICfOn8yAJywKJ+G/uScgPT4gJ86fzIEnLAon4b+6JyA9PiAnzqnMgCcsCifhv7snID0+ICfOqcyBJywKJ+G/vCcgPT4gJ86pzYUnLAon4b+9JyA9PiAnwrQnLAon4oCAJyA9PiAn4oCCJywKJ+KAgScgPT4gJ+KAgycsCifihKYnID0+ICfOqScsCifihKonID0+ICdLJywKJ+KEqycgPT4gJ0HMiicsCifihponID0+ICfihpDMuCcsCifihpsnID0+ICfihpLMuCcsCifihq4nID0+ICfihpTMuCcsCifih40nID0+ICfih5DMuCcsCifih44nID0+ICfih5TMuCcsCifih48nID0+ICfih5LMuCcsCifiiIQnID0+ICfiiIPMuCcsCifiiIknID0+ICfiiIjMuCcsCifiiIwnID0+ICfiiIvMuCcsCifiiKQnID0+ICfiiKPMuCcsCifiiKYnID0+ICfiiKXMuCcsCifiiYEnID0+ICfiiLzMuCcsCifiiYQnID0+ICfiiYPMuCcsCifiiYcnID0+ICfiiYXMuCcsCifiiYknID0+ICfiiYjMuCcsCifiiaAnID0+ICc9zLgnLAon4omiJyA9PiAn4omhzLgnLAon4omtJyA9PiAn4omNzLgnLAon4omuJyA9PiAnPMy4JywKJ+KJrycgPT4gJz7MuCcsCifiibAnID0+ICfiiaTMuCcsCifiibEnID0+ICfiiaXMuCcsCifiibQnID0+ICfiibLMuCcsCifiibUnID0+ICfiibPMuCcsCifiibgnID0+ICfiibbMuCcsCifiibknID0+ICfiibfMuCcsCifiioAnID0+ICfiibrMuCcsCifiioEnID0+ICfiibvMuCcsCifiioQnID0+ICfiioLMuCcsCifiioUnID0+ICfiioPMuCcsCifiiognID0+ICfiiobMuCcsCifiioknID0+ICfiiofMuCcsCifiiqwnID0+ICfiiqLMuCcsCifiiq0nID0+ICfiiqjMuCcsCifiiq4nID0+ICfiiqnMuCcsCifiiq8nID0+ICfiiqvMuCcsCifii6AnID0+ICfiibzMuCcsCifii6EnID0+ICfiib3MuCcsCifii6InID0+ICfiipHMuCcsCifii6MnID0+ICfiipLMuCcsCifii6onID0+ICfiirLMuCcsCifii6snID0+ICfiirPMuCcsCifii6wnID0+ICfiirTMuCcsCifii60nID0+ICfiirXMuCcsCifijKknID0+ICfjgIgnLAon4oyqJyA9PiAn44CJJywKJ+KrnCcgPT4gJ+Krncy4JywKJ+OBjCcgPT4gJ+OBi+OCmScsCifjgY4nID0+ICfjgY3jgpknLAon44GQJyA9PiAn44GP44KZJywKJ+OBkicgPT4gJ+OBkeOCmScsCifjgZQnID0+ICfjgZPjgpknLAon44GWJyA9PiAn44GV44KZJywKJ+OBmCcgPT4gJ+OBl+OCmScsCifjgZonID0+ICfjgZnjgpknLAon44GcJyA9PiAn44Gb44KZJywKJ+OBnicgPT4gJ+OBneOCmScsCifjgaAnID0+ICfjgZ/jgpknLAon44GiJyA9PiAn44Gh44KZJywKJ+OBpScgPT4gJ+OBpOOCmScsCifjgacnID0+ICfjgabjgpknLAon44GpJyA9PiAn44Go44KZJywKJ+OBsCcgPT4gJ+OBr+OCmScsCifjgbEnID0+ICfjga/jgponLAon44GzJyA9PiAn44Gy44KZJywKJ+OBtCcgPT4gJ+OBsuOCmicsCifjgbYnID0+ICfjgbXjgpknLAon44G3JyA9PiAn44G144KaJywKJ+OBuScgPT4gJ+OBuOOCmScsCifjgbonID0+ICfjgbjjgponLAon44G8JyA9PiAn44G744KZJywKJ+OBvScgPT4gJ+OBu+OCmicsCifjgpQnID0+ICfjgYbjgpknLAon44KeJyA9PiAn44Kd44KZJywKJ+OCrCcgPT4gJ+OCq+OCmScsCifjgq4nID0+ICfjgq3jgpknLAon44KwJyA9PiAn44Kv44KZJywKJ+OCsicgPT4gJ+OCseOCmScsCifjgrQnID0+ICfjgrPjgpknLAon44K2JyA9PiAn44K144KZJywKJ+OCuCcgPT4gJ+OCt+OCmScsCifjgronID0+ICfjgrnjgpknLAon44K8JyA9PiAn44K744KZJywKJ+OCvicgPT4gJ+OCveOCmScsCifjg4AnID0+ICfjgr/jgpknLAon44OCJyA9PiAn44OB44KZJywKJ+ODhScgPT4gJ+ODhOOCmScsCifjg4cnID0+ICfjg4bjgpknLAon44OJJyA9PiAn44OI44KZJywKJ+ODkCcgPT4gJ+ODj+OCmScsCifjg5EnID0+ICfjg4/jgponLAon44OTJyA9PiAn44OS44KZJywKJ+ODlCcgPT4gJ+ODkuOCmicsCifjg5YnID0+ICfjg5XjgpknLAon44OXJyA9PiAn44OV44KaJywKJ+ODmScgPT4gJ+ODmOOCmScsCifjg5onID0+ICfjg5jjgponLAon44OcJyA9PiAn44Ob44KZJywKJ+ODnScgPT4gJ+ODm+OCmicsCifjg7QnID0+ICfjgqbjgpknLAon44O3JyA9PiAn44Ov44KZJywKJ+ODuCcgPT4gJ+ODsOOCmScsCifjg7knID0+ICfjg7HjgpknLAon44O6JyA9PiAn44Oy44KZJywKJ+ODvicgPT4gJ+ODveOCmScsCifvpIAnID0+ICfosYgnLAon76SBJyA9PiAn5pu0JywKJ++kgicgPT4gJ+i7iicsCifvpIMnID0+ICfos4gnLAon76SEJyA9PiAn5ruRJywKJ++khScgPT4gJ+S4sicsCifvpIYnID0+ICflj6UnLAon76SHJyA9PiAn6b6cJywKJ++kiCcgPT4gJ+m+nCcsCifvpIknID0+ICflpZEnLAon76SKJyA9PiAn6YeRJywKJ++kiycgPT4gJ+WWhycsCifvpIwnID0+ICflpYgnLAon76SNJyA9PiAn5oe2JywKJ++kjicgPT4gJ+eZqScsCifvpI8nID0+ICfnvoUnLAon76SQJyA9PiAn6Ji/JywKJ++kkScgPT4gJ+ieuicsCifvpJInID0+ICfoo7gnLAon76STJyA9PiAn6YKPJywKJ++klCcgPT4gJ+aogicsCifvpJUnID0+ICfmtJsnLAon76SWJyA9PiAn54OZJywKJ++klycgPT4gJ+ePnicsCifvpJgnID0+ICfokL0nLAon76SZJyA9PiAn6YWqJywKJ++kmicgPT4gJ+mnsScsCifvpJsnID0+ICfkuoInLAon76ScJyA9PiAn5Y21JywKJ++knScgPT4gJ+ashCcsCifvpJ4nID0+ICfniJsnLAon76SfJyA9PiAn6JitJywKJ++koCcgPT4gJ+m4nicsCifvpKEnID0+ICfltZAnLAon76SiJyA9PiAn5r+rJywKJ++koycgPT4gJ+iXjScsCifvpKQnID0+ICfopaQnLAon76SlJyA9PiAn5ouJJywKJ++kpicgPT4gJ+iHmCcsCifvpKcnID0+ICfooJ8nLAon76SoJyA9PiAn5buKJywKJ++kqScgPT4gJ+aclycsCifvpKonID0+ICfmtaonLAon76SrJyA9PiAn54u8JywKJ++krCcgPT4gJ+mDjicsCifvpK0nID0+ICfkvoYnLAon76SuJyA9PiAn5Ya3JywKJ++krycgPT4gJ+WLnicsCifvpLAnID0+ICfmk4QnLAon76SxJyA9PiAn5quTJywKJ++ksicgPT4gJ+eIkCcsCifvpLMnID0+ICfnm6cnLAon76S0JyA9PiAn6ICBJywKJ++ktScgPT4gJ+iYhicsCifvpLYnID0+ICfomZwnLAon76S3JyA9PiAn6LevJywKJ++kuCcgPT4gJ+mcsicsCifvpLknID0+ICfpra8nLAon76S6JyA9PiAn6be6JywKJ++kuycgPT4gJ+eijCcsCifvpLwnID0+ICfnpb8nLAon76S9JyA9PiAn57agJywKJ++kvicgPT4gJ+iPiScsCifvpL8nID0+ICfpjIQnLAon76WAJyA9PiAn6bm/JywKJ++lgScgPT4gJ+irlicsCifvpYInID0+ICflo58nLAon76WDJyA9PiAn5byEJywKJ++lhCcgPT4gJ+exoCcsCifvpYUnID0+ICfogb4nLAon76WGJyA9PiAn54miJywKJ++lhycgPT4gJ+ejiicsCifvpYgnID0+ICfos4InLAon76WJJyA9PiAn6Zu3JywKJ++liicgPT4gJ+WjmCcsCifvpYsnID0+ICflsaInLAon76WMJyA9PiAn5qiTJywKJ++ljScgPT4gJ+a3micsCifvpY4nID0+ICfmvI8nLAon76WPJyA9PiAn57SvJywKJ++lkCcgPT4gJ+e4tycsCifvpZEnID0+ICfpmYsnLAon76WSJyA9PiAn5YuSJywKJ++lkycgPT4gJ+iCiycsCifvpZQnID0+ICflh5wnLAon76WVJyA9PiAn5YeMJywKJ++llicgPT4gJ+eonCcsCifvpZcnID0+ICfntr4nLAon76WYJyA9PiAn6I+xJywKJ++lmScgPT4gJ+mZtScsCifvpZonID0+ICforoAnLAon76WbJyA9PiAn5ouPJywKJ++lnCcgPT4gJ+aogicsCifvpZ0nID0+ICfoq74nLAon76WeJyA9PiAn5Li5JywKJ++lnycgPT4gJ+WvpycsCifvpaAnID0+ICfmgJInLAon76WhJyA9PiAn546HJywKJ++loicgPT4gJ+eVsCcsCifvpaMnID0+ICfljJcnLAon76WkJyA9PiAn56O7JywKJ++lpScgPT4gJ+S+vycsCifvpaYnID0+ICflvqknLAon76WnJyA9PiAn5LiNJywKJ++lqCcgPT4gJ+azjCcsCifvpaknID0+ICfmlbgnLAon76WqJyA9PiAn57SiJywKJ++lqycgPT4gJ+WPgycsCifvpawnID0+ICfloZ4nLAon76WtJyA9PiAn55yBJywKJ++lricgPT4gJ+iRiScsCifvpa8nID0+ICfoqqonLAon76WwJyA9PiAn5q66JywKJ++lsScgPT4gJ+i+sCcsCifvpbInID0+ICfmsognLAon76WzJyA9PiAn5ou+JywKJ++ltCcgPT4gJ+iLpScsCifvpbUnID0+ICfmjqAnLAon76W2JyA9PiAn55WlJywKJ++ltycgPT4gJ+S6ricsCifvpbgnID0+ICflhaknLAon76W5JyA9PiAn5YeJJywKJ++luicgPT4gJ+aigScsCifvpbsnID0+ICfns6cnLAon76W8JyA9PiAn6ImvJywKJ++lvScgPT4gJ+irkicsCifvpb4nID0+ICfph48nLAon76W/JyA9PiAn5Yu1JywKJ++mgCcgPT4gJ+WRgicsCifvpoEnID0+ICflpbMnLAon76aCJyA9PiAn5busJywKJ++mgycgPT4gJ+aXhScsCifvpoQnID0+ICfmv74nLAon76aFJyA9PiAn56SqJywKJ++mhicgPT4gJ+mWrScsCifvpocnID0+ICfpqaonLAon76aIJyA9PiAn6bqXJywKJ++miScgPT4gJ+m7jicsCifvpoonID0+ICflipsnLAon76aLJyA9PiAn5puGJywKJ++mjCcgPT4gJ+attycsCifvpo0nID0+ICfovaInLAon76aOJyA9PiAn5bm0JywKJ++mjycgPT4gJ+aGkCcsCifvppAnID0+ICfmiIAnLAon76aRJyA9PiAn5pKaJywKJ++mkicgPT4gJ+a8oycsCifvppMnID0+ICfnhYknLAon76aUJyA9PiAn55KJJywKJ++mlScgPT4gJ+eniicsCifvppYnID0+ICfnt7QnLAon76aXJyA9PiAn6IGvJywKJ++mmCcgPT4gJ+i8picsCifvppknID0+ICfok64nLAon76aaJyA9PiAn6YCjJywKJ++mmycgPT4gJ+mNiicsCifvppwnID0+ICfliJcnLAon76adJyA9PiAn5YqjJywKJ++mnicgPT4gJ+WSvScsCifvpp8nID0+ICfng4gnLAon76agJyA9PiAn6KOCJywKJ++moScgPT4gJ+iqqicsCifvpqInID0+ICflu4knLAon76ajJyA9PiAn5b+1JywKJ++mpCcgPT4gJ+aNuycsCifvpqUnID0+ICfmrq4nLAon76amJyA9PiAn57C+JywKJ++mpycgPT4gJ+eNtScsCifvpqgnID0+ICfku6QnLAon76apJyA9PiAn5Zu5JywKJ++mqicgPT4gJ+WvpycsCifvpqsnID0+ICfltronLAon76asJyA9PiAn5oCcJywKJ++mrScgPT4gJ+eOsicsCifvpq4nID0+ICfnkaknLAon76avJyA9PiAn576aJywKJ++msCcgPT4gJ+iBhicsCifvprEnID0+ICfpiLQnLAon76ayJyA9PiAn6Zu2JywKJ++msycgPT4gJ+mdiCcsCifvprQnID0+ICfpoJgnLAon76a1JyA9PiAn5L6LJywKJ++mticgPT4gJ+emricsCifvprcnID0+ICfphrQnLAon76a4JyA9PiAn6Zq4JywKJ++muScgPT4gJ+aDoScsCifvpronID0+ICfkuoYnLAon76a7JyA9PiAn5YOaJywKJ++mvCcgPT4gJ+WvricsCifvpr0nID0+ICflsL8nLAon76a+JyA9PiAn5paZJywKJ++mvycgPT4gJ+aogicsCifvp4AnID0+ICfnh44nLAon76eBJyA9PiAn55mCJywKJ++ngicgPT4gJ+iTvCcsCifvp4MnID0+ICfpgbwnLAon76eEJyA9PiAn6b6NJywKJ++nhScgPT4gJ+aaiCcsCifvp4YnID0+ICfpmK4nLAon76eHJyA9PiAn5YqJJywKJ++niCcgPT4gJ+aduycsCifvp4knID0+ICfmn7MnLAon76eKJyA9PiAn5rWBJywKJ++niycgPT4gJ+a6nCcsCifvp4wnID0+ICfnkIknLAon76eNJyA9PiAn55WZJywKJ++njicgPT4gJ+ehqycsCifvp48nID0+ICfntJAnLAon76eQJyA9PiAn6aGeJywKJ++nkScgPT4gJ+WFrScsCifvp5InID0+ICfmiK4nLAon76eTJyA9PiAn6Zm4JywKJ++nlCcgPT4gJ+WAqycsCifvp5UnID0+ICfltJknLAon76eWJyA9PiAn5reqJywKJ++nlycgPT4gJ+i8qicsCifvp5gnID0+ICflvosnLAon76eZJyA9PiAn5oWEJywKJ++nmicgPT4gJ+aglycsCifvp5snID0+ICfnjocnLAon76ecJyA9PiAn6ZqGJywKJ++nnScgPT4gJ+WIqScsCifvp54nID0+ICflkI8nLAon76efJyA9PiAn5bGlJywKJ++noCcgPT4gJ+aYkycsCifvp6EnID0+ICfmnY4nLAon76eiJyA9PiAn5qKoJywKJ++noycgPT4gJ+azpScsCifvp6QnID0+ICfnkIYnLAon76elJyA9PiAn55eiJywKJ++npicgPT4gJ+e9uScsCifvp6cnID0+ICfoo48nLAon76eoJyA9PiAn6KOhJywKJ++nqScgPT4gJ+mHjCcsCifvp6onID0+ICfpm6InLAon76erJyA9PiAn5Yy/JywKJ++nrCcgPT4gJ+a6uicsCifvp60nID0+ICflkJ0nLAon76euJyA9PiAn54eQJywKJ++nrycgPT4gJ+eSmCcsCifvp7AnID0+ICfol7onLAon76exJyA9PiAn6ZqjJywKJ++nsicgPT4gJ+mxlycsCifvp7MnID0+ICfpup8nLAon76e0JyA9PiAn5p6XJywKJ++ntScgPT4gJ+a3iycsCifvp7YnID0+ICfoh6gnLAon76e3JyA9PiAn56uLJywKJ++nuCcgPT4gJ+esoCcsCifvp7knID0+ICfnspInLAon76e6JyA9PiAn54uAJywKJ++nuycgPT4gJ+eCmScsCifvp7wnID0+ICforZgnLAon76e9JyA9PiAn5LuAJywKJ++nvicgPT4gJ+iMticsCifvp78nID0+ICfliLonLAon76iAJyA9PiAn5YiHJywKJ++ogScgPT4gJ+W6picsCifvqIInID0+ICfmi5MnLAon76iDJyA9PiAn57OWJywKJ++ohCcgPT4gJ+WuhScsCifvqIUnID0+ICfmtJ4nLAon76iGJyA9PiAn5pq0JywKJ++ohycgPT4gJ+i8uycsCifvqIgnID0+ICfooYwnLAon76iJJyA9PiAn6ZmNJywKJ++oiicgPT4gJ+imiycsCifvqIsnID0+ICflu5MnLAon76iMJyA9PiAn5YWAJywKJ++ojScgPT4gJ+WXgCcsCifvqJAnID0+ICfloZonLAon76iSJyA9PiAn5pm0JywKJ++olScgPT4gJ+WHnicsCifvqJYnID0+ICfnjKonLAon76iXJyA9PiAn55uKJywKJ++omCcgPT4gJ+ekvCcsCifvqJknID0+ICfnpZ4nLAon76iaJyA9PiAn56WlJywKJ++omycgPT4gJ+emjycsCifvqJwnID0+ICfpnZYnLAon76idJyA9PiAn57K+JywKJ++onicgPT4gJ+e+vScsCifvqKAnID0+ICfomJInLAon76iiJyA9PiAn6Ku4JywKJ++opScgPT4gJ+mAuCcsCifvqKYnID0+ICfpg70nLAon76iqJyA9PiAn6aOvJywKJ++oqycgPT4gJ+mjvCcsCifvqKwnID0+ICfppKgnLAon76itJyA9PiAn6ba0JywKJ++oricgPT4gJ+mDnicsCifvqK8nID0+ICfpmrcnLAon76iwJyA9PiAn5L6uJywKJ++osScgPT4gJ+WDpycsCifvqLInID0+ICflhY0nLAon76izJyA9PiAn5YuJJywKJ++otCcgPT4gJ+WLpCcsCifvqLUnID0+ICfljZEnLAon76i2JyA9PiAn5ZadJywKJ++otycgPT4gJ+WYhicsCifvqLgnID0+ICflmagnLAon76i5JyA9PiAn5aGAJywKJ++ouicgPT4gJ+WiqCcsCifvqLsnID0+ICflsaQnLAon76i8JyA9PiAn5bGuJywKJ++ovScgPT4gJ+aClCcsCifvqL4nID0+ICfmhagnLAon76i/JyA9PiAn5oaOJywKJ++pgCcgPT4gJ+aHsicsCifvqYEnID0+ICfmlY8nLAon76mCJyA9PiAn5peiJywKJ++pgycgPT4gJ+aakScsCifvqYQnID0+ICfmooUnLAon76mFJyA9PiAn5rW3JywKJ++phicgPT4gJ+a4micsCifvqYcnID0+ICfmvKInLAon76mIJyA9PiAn54WuJywKJ++piScgPT4gJ+eIqycsCifvqYonID0+ICfnkKInLAon76mLJyA9PiAn56KRJywKJ++pjCcgPT4gJ+ekvicsCifvqY0nID0+ICfnpYknLAon76mOJyA9PiAn56WIJywKJ++pjycgPT4gJ+elkCcsCifvqZAnID0+ICfnpZYnLAon76mRJyA9PiAn56WdJywKJ++pkicgPT4gJ+emjScsCifvqZMnID0+ICfnpo4nLAon76mUJyA9PiAn56mAJywKJ++plScgPT4gJ+eqgScsCifvqZYnID0+ICfnr4AnLAon76mXJyA9PiAn57e0JywKJ++pmCcgPT4gJ+e4iScsCifvqZknID0+ICfnuYEnLAon76maJyA9PiAn572yJywKJ++pmycgPT4gJ+iAhScsCifvqZwnID0+ICfoh60nLAon76mdJyA9PiAn6Im5JywKJ++pnicgPT4gJ+iJuScsCifvqZ8nID0+ICfokZcnLAon76mgJyA9PiAn6KSQJywKJ++poScgPT4gJ+imlicsCifvqaInID0+ICforIEnLAon76mjJyA9PiAn6Ky5JywKJ++ppCcgPT4gJ+izkycsCifvqaUnID0+ICfotIgnLAon76mmJyA9PiAn6L62JywKJ++ppycgPT4gJ+mAuCcsCifvqagnID0+ICfpm6MnLAon76mpJyA9PiAn6Z+/JywKJ++pqicgPT4gJ+mguycsCifvqasnID0+ICfmgbUnLAon76msJyA9PiAn8KSLricsCifvqa0nID0+ICfoiJgnLAon76mwJyA9PiAn5LimJywKJ++psScgPT4gJ+WGtScsCifvqbInID0+ICflhagnLAon76mzJyA9PiAn5L6AJywKJ++ptCcgPT4gJ+WFhScsCifvqbUnID0+ICflhoAnLAon76m2JyA9PiAn5YuHJywKJ++ptycgPT4gJ+WLuicsCifvqbgnID0+ICfllp0nLAon76m5JyA9PiAn5ZWVJywKJ++puicgPT4gJ+WWmScsCifvqbsnID0+ICfll6InLAon76m8JyA9PiAn5aGaJywKJ++pvScgPT4gJ+WisycsCifvqb4nID0+ICflpYQnLAon76m/JyA9PiAn5aWUJywKJ++qgCcgPT4gJ+WpoicsCifvqoEnID0+ICflrKgnLAon76qCJyA9PiAn5buSJywKJ++qgycgPT4gJ+W7mScsCifvqoQnID0+ICflvaknLAon76qFJyA9PiAn5b6tJywKJ++qhicgPT4gJ+aDmCcsCifvqocnID0+ICfmhY4nLAon76qIJyA9PiAn5oSIJywKJ++qiScgPT4gJ+aGjicsCifvqoonID0+ICfmhaAnLAon76qLJyA9PiAn5oeyJywKJ++qjCcgPT4gJ+aItCcsCifvqo0nID0+ICfmj4QnLAon76qOJyA9PiAn5pCcJywKJ++qjycgPT4gJ+aRkicsCifvqpAnID0+ICfmlZYnLAon76qRJyA9PiAn5pm0JywKJ++qkicgPT4gJ+aclycsCifvqpMnID0+ICfmnJsnLAon76qUJyA9PiAn5p2WJywKJ++qlScgPT4gJ+atuScsCifvqpYnID0+ICfmrronLAon76qXJyA9PiAn5rWBJywKJ++qmCcgPT4gJ+a7mycsCifvqpknID0+ICfmu4snLAon76qaJyA9PiAn5ryiJywKJ++qmycgPT4gJ+eAnicsCifvqpwnID0+ICfnha4nLAon76qdJyA9PiAn556nJywKJ++qnicgPT4gJ+eItScsCifvqp8nID0+ICfniq8nLAon76qgJyA9PiAn54yqJywKJ++qoScgPT4gJ+eRsScsCifvqqInID0+ICfnlIYnLAon76qjJyA9PiAn55S7JywKJ++qpCcgPT4gJ+eYnScsCifvqqUnID0+ICfnmJ8nLAon76qmJyA9PiAn55uKJywKJ++qpycgPT4gJ+ebmycsCifvqqgnID0+ICfnm7QnLAon76qpJyA9PiAn552KJywKJ++qqicgPT4gJ+edgCcsCifvqqsnID0+ICfno4wnLAon76qsJyA9PiAn56qxJywKJ++qrScgPT4gJ+evgCcsCifvqq4nID0+ICfnsbsnLAon76qvJyA9PiAn57WbJywKJ++qsCcgPT4gJ+e3tCcsCifvqrEnID0+ICfnvL4nLAon76qyJyA9PiAn6ICFJywKJ++qsycgPT4gJ+iNkicsCifvqrQnID0+ICfoj68nLAon76q1JyA9PiAn6J25JywKJ++qticgPT4gJ+ilgScsCifvqrcnID0+ICfopoYnLAon76q4JyA9PiAn6KaWJywKJ++quScgPT4gJ+iqvycsCifvqronID0+ICfoq7gnLAon76q7JyA9PiAn6KuLJywKJ++qvCcgPT4gJ+isgScsCifvqr0nID0+ICfoq74nLAon76q+JyA9PiAn6KutJywKJ++qvycgPT4gJ+isuScsCifvq4AnID0+ICforoonLAon76uBJyA9PiAn6LSIJywKJ++rgicgPT4gJ+i8uCcsCifvq4MnID0+ICfpgbInLAon76uEJyA9PiAn6YaZJywKJ++rhScgPT4gJ+mJticsCifvq4YnID0+ICfpmbwnLAon76uHJyA9PiAn6ZujJywKJ++riCcgPT4gJ+mdlicsCifvq4knID0+ICfpn5snLAon76uKJyA9PiAn6Z+/JywKJ++riycgPT4gJ+mgiycsCifvq4wnID0+ICfpoLsnLAon76uNJyA9PiAn6aySJywKJ++rjicgPT4gJ+m+nCcsCifvq48nID0+ICfwoqGKJywKJ++rkCcgPT4gJ/CioYQnLAon76uRJyA9PiAn8KOPlScsCifvq5InID0+ICfjrp0nLAon76uTJyA9PiAn5ICYJywKJ++rlCcgPT4gJ+SAuScsCifvq5UnID0+ICfwpYmJJywKJ++rlicgPT4gJ/Cls5AnLAon76uXJyA9PiAn8Ke7kycsCifvq5gnID0+ICfpvYMnLAon76uZJyA9PiAn6b6OJywKJ++snScgPT4gJ9eZ1rQnLAon76yfJyA9PiAn17LWtycsCifvrKonID0+ICfXqdeBJywKJ++sqycgPT4gJ9ep14InLAon76ysJyA9PiAn16nWvNeBJywKJ++srScgPT4gJ9ep1rzXgicsCifvrK4nID0+ICfXkNa3JywKJ++srycgPT4gJ9eQ1rgnLAon76ywJyA9PiAn15DWvCcsCifvrLEnID0+ICfXkda8JywKJ++ssicgPT4gJ9eS1rwnLAon76yzJyA9PiAn15PWvCcsCifvrLQnID0+ICfXlNa8JywKJ++stScgPT4gJ9eV1rwnLAon76y2JyA9PiAn15bWvCcsCifvrLgnID0+ICfXmNa8JywKJ++suScgPT4gJ9eZ1rwnLAon76y6JyA9PiAn15rWvCcsCifvrLsnID0+ICfXm9a8JywKJ++svCcgPT4gJ9ec1rwnLAon76y+JyA9PiAn157WvCcsCifvrYAnID0+ICfXoNa8JywKJ++tgScgPT4gJ9eh1rwnLAon762DJyA9PiAn16PWvCcsCifvrYQnID0+ICfXpNa8JywKJ++thicgPT4gJ9em1rwnLAon762HJyA9PiAn16fWvCcsCifvrYgnID0+ICfXqNa8JywKJ++tiScgPT4gJ9ep1rwnLAon762KJyA9PiAn16rWvCcsCifvrYsnID0+ICfXlda5JywKJ++tjCcgPT4gJ9eR1r8nLAon762NJyA9PiAn15vWvycsCifvrY4nID0+ICfXpNa/JywKJ/CRgponID0+ICfwkYKZ8JGCuicsCifwkYKcJyA9PiAn8JGCm/CRgronLAon8JGCqycgPT4gJ/CRgqXwkYK6JywKJ/CRhK4nID0+ICfwkYSx8JGEpycsCifwkYSvJyA9PiAn8JGEsvCRhKcnLAon8JGNiycgPT4gJ/CRjYfwkYy+JywKJ/CRjYwnID0+ICfwkY2H8JGNlycsCifwkZK7JyA9PiAn8JGSufCRkronLAon8JGSvCcgPT4gJ/CRkrnwkZKwJywKJ/CRkr4nID0+ICfwkZK58JGSvScsCifwkZa6JyA9PiAn8JGWuPCRlq8nLAon8JGWuycgPT4gJ/CRlrnwkZavJywKJ/CRpLgnID0+ICfwkaS18JGksCcsCifwnYWeJyA9PiAn8J2Fl/CdhaUnLAon8J2FnycgPT4gJ/CdhZjwnYWlJywKJ/CdhaAnID0+ICfwnYWY8J2FpfCdha4nLAon8J2FoScgPT4gJ/CdhZjwnYWl8J2FrycsCifwnYWiJyA9PiAn8J2FmPCdhaXwnYWwJywKJ/CdhaMnID0+ICfwnYWY8J2FpfCdhbEnLAon8J2FpCcgPT4gJ/CdhZjwnYWl8J2FsicsCifwnYa7JyA9PiAn8J2GufCdhaUnLAon8J2GvCcgPT4gJ/CdhrrwnYWlJywKJ/Cdhr0nID0+ICfwnYa58J2FpfCdha4nLAon8J2GvicgPT4gJ/CdhrrwnYWl8J2FricsCifwnYa/JyA9PiAn8J2GufCdhaXwnYWvJywKJ/Cdh4AnID0+ICfwnYa68J2FpfCdha8nLAon8K+ggCcgPT4gJ+S4vScsCifwr6CBJyA9PiAn5Li4JywKJ/CvoIInID0+ICfkuYEnLAon8K+ggycgPT4gJ/CghKInLAon8K+ghCcgPT4gJ+S9oCcsCifwr6CFJyA9PiAn5L6uJywKJ/CvoIYnID0+ICfkvrsnLAon8K+ghycgPT4gJ+WAgicsCifwr6CIJyA9PiAn5YG6JywKJ/CvoIknID0+ICflgpknLAon8K+giicgPT4gJ+WDpycsCifwr6CLJyA9PiAn5YOPJywKJ/CvoIwnID0+ICfjkp4nLAon8K+gjScgPT4gJ/CgmLonLAon8K+gjicgPT4gJ+WFjScsCifwr6CPJyA9PiAn5YWUJywKJ/CvoJAnID0+ICflhaQnLAon8K+gkScgPT4gJ+WFtycsCifwr6CSJyA9PiAn8KCUnCcsCifwr6CTJyA9PiAn45K5JywKJ/CvoJQnID0+ICflhacnLAon8K+glScgPT4gJ+WGjScsCifwr6CWJyA9PiAn8KCViycsCifwr6CXJyA9PiAn5YaXJywKJ/CvoJgnID0+ICflhqQnLAon8K+gmScgPT4gJ+S7jCcsCifwr6CaJyA9PiAn5YasJywKJ/CvoJsnID0+ICflhrUnLAon8K+gnCcgPT4gJ/Cph58nLAon8K+gnScgPT4gJ+WHtScsCifwr6CeJyA9PiAn5YiDJywKJ/CvoJ8nID0+ICfjk58nLAon8K+goCcgPT4gJ+WIuycsCifwr6ChJyA9PiAn5YmGJywKJ/CvoKInID0+ICflibInLAon8K+goycgPT4gJ+WJtycsCifwr6CkJyA9PiAn45SVJywKJ/CvoKUnID0+ICfli4cnLAon8K+gpicgPT4gJ+WLiScsCifwr6CnJyA9PiAn5YukJywKJ/CvoKgnID0+ICfli7onLAon8K+gqScgPT4gJ+WMhScsCifwr6CqJyA9PiAn5YyGJywKJ/CvoKsnID0+ICfljJcnLAon8K+grCcgPT4gJ+WNiScsCifwr6CtJyA9PiAn5Y2RJywKJ/CvoK4nID0+ICfljZonLAon8K+grycgPT4gJ+WNsycsCifwr6CwJyA9PiAn5Y29JywKJ/CvoLEnID0+ICfljb8nLAon8K+gsicgPT4gJ+WNvycsCifwr6CzJyA9PiAn5Y2/JywKJ/CvoLQnID0+ICfwoKisJywKJ/CvoLUnID0+ICfngbAnLAon8K+gticgPT4gJ+WPiicsCifwr6C3JyA9PiAn5Y+fJywKJ/CvoLgnID0+ICfwoK2jJywKJ/CvoLknID0+ICflj6snLAon8K+guicgPT4gJ+WPsScsCifwr6C7JyA9PiAn5ZCGJywKJ/CvoLwnID0+ICflkp4nLAon8K+gvScgPT4gJ+WQuCcsCifwr6C+JyA9PiAn5ZGIJywKJ/CvoL8nID0+ICflkagnLAon8K+hgCcgPT4gJ+WSoicsCifwr6GBJyA9PiAn5ZO2JywKJ/CvoYInID0+ICfllJAnLAon8K+hgycgPT4gJ+WVkycsCifwr6GEJyA9PiAn5ZWjJywKJ/CvoYUnID0+ICflloQnLAon8K+hhicgPT4gJ+WWhCcsCifwr6GHJyA9PiAn5ZaZJywKJ/CvoYgnID0+ICfllqsnLAon8K+hiScgPT4gJ+WWsycsCifwr6GKJyA9PiAn5ZeCJywKJ/CvoYsnID0+ICflnJYnLAon8K+hjCcgPT4gJ+WYhicsCifwr6GNJyA9PiAn5ZyXJywKJ/CvoY4nID0+ICflmZEnLAon8K+hjycgPT4gJ+WZtCcsCifwr6GQJyA9PiAn5YiHJywKJ/CvoZEnID0+ICflo64nLAon8K+hkicgPT4gJ+WfjicsCifwr6GTJyA9PiAn5Z+0JywKJ/CvoZQnID0+ICfloI0nLAon8K+hlScgPT4gJ+WeiycsCifwr6GWJyA9PiAn5aCyJywKJ/CvoZcnID0+ICfloLEnLAon8K+hmCcgPT4gJ+WirCcsCifwr6GZJyA9PiAn8KGTpCcsCifwr6GaJyA9PiAn5aOyJywKJ/CvoZsnID0+ICflo7cnLAon8K+hnCcgPT4gJ+WkhicsCifwr6GdJyA9PiAn5aSaJywKJ/CvoZ4nID0+ICflpKInLAon8K+hnycgPT4gJ+WloicsCifwr6GgJyA9PiAn8KGaqCcsCifwr6GhJyA9PiAn8KGbqicsCifwr6GiJyA9PiAn5aesJywKJ/CvoaMnID0+ICflqJsnLAon8K+hpCcgPT4gJ+WopycsCifwr6GlJyA9PiAn5aeYJywKJ/CvoaYnID0+ICflqaYnLAon8K+hpycgPT4gJ+ObricsCifwr6GoJyA9PiAn45u8JywKJ/CvoaknID0+ICflrIgnLAon8K+hqicgPT4gJ+WsvicsCifwr6GrJyA9PiAn5ay+JywKJ/CvoawnID0+ICfwoaeIJywKJ/Cvoa0nID0+ICflr4MnLAon8K+hricgPT4gJ+WvmCcsCifwr6GvJyA9PiAn5a+nJywKJ/CvobAnID0+ICflr7MnLAon8K+hsScgPT4gJ/ChrJgnLAon8K+hsicgPT4gJ+WvvycsCifwr6GzJyA9PiAn5bCGJywKJ/CvobQnID0+ICflvZMnLAon8K+htScgPT4gJ+WwoicsCifwr6G2JyA9PiAn456BJywKJ/CvobcnID0+ICflsaAnLAon8K+huCcgPT4gJ+WxricsCifwr6G5JyA9PiAn5bOAJywKJ/CvobonID0+ICflso0nLAon8K+huycgPT4gJ/Cht6QnLAon8K+hvCcgPT4gJ+W1gycsCifwr6G9JyA9PiAn8KG3picsCifwr6G+JyA9PiAn5bWuJywKJ/Cvob8nID0+ICfltasnLAon8K+igCcgPT4gJ+W1vCcsCifwr6KBJyA9PiAn5behJywKJ/CvooInID0+ICflt6InLAon8K+igycgPT4gJ+OgrycsCifwr6KEJyA9PiAn5be9JywKJ/CvooUnID0+ICfluKgnLAon8K+ihicgPT4gJ+W4vScsCifwr6KHJyA9PiAn5bmpJywKJ/CvoognID0+ICfjoaInLAon8K+iiScgPT4gJ/CihoMnLAon8K+iiicgPT4gJ+OhvCcsCifwr6KLJyA9PiAn5bqwJywKJ/CvoownID0+ICflurMnLAon8K+ijScgPT4gJ+W6ticsCifwr6KOJyA9PiAn5buKJywKJ/Cvoo8nID0+ICfwqo6SJywKJ/CvopAnID0+ICflu74nLAon8K+ikScgPT4gJ/CijLEnLAon8K+ikicgPT4gJ/CijLEnLAon8K+ikycgPT4gJ+iIgScsCifwr6KUJyA9PiAn5byiJywKJ/CvopUnID0+ICflvKInLAon8K+ilicgPT4gJ+OjhycsCifwr6KXJyA9PiAn8KOKuCcsCifwr6KYJyA9PiAn8KaHmicsCifwr6KZJyA9PiAn5b2iJywKJ/CvoponID0+ICflvasnLAon8K+imycgPT4gJ+OjoycsCifwr6KcJyA9PiAn5b6aJywKJ/Cvop0nID0+ICflv40nLAon8K+inicgPT4gJ+W/lycsCifwr6KfJyA9PiAn5b+5JywKJ/CvoqAnID0+ICfmgoEnLAon8K+ioScgPT4gJ+OkuicsCifwr6KiJyA9PiAn46ScJywKJ/CvoqMnID0+ICfmgpQnLAon8K+ipCcgPT4gJ/Cim5QnLAon8K+ipScgPT4gJ+aDhycsCifwr6KmJyA9PiAn5oWIJywKJ/CvoqcnID0+ICfmhYwnLAon8K+iqCcgPT4gJ+aFjicsCifwr6KpJyA9PiAn5oWMJywKJ/CvoqonID0+ICfmhbonLAon8K+iqycgPT4gJ+aGjicsCifwr6KsJyA9PiAn5oayJywKJ/Cvoq0nID0+ICfmhqQnLAon8K+iricgPT4gJ+aGrycsCifwr6KvJyA9PiAn5oeeJywKJ/CvorAnID0+ICfmh7InLAon8K+isScgPT4gJ+aHticsCifwr6KyJyA9PiAn5oiQJywKJ/CvorMnID0+ICfmiJsnLAon8K+itCcgPT4gJ+aJnScsCifwr6K1JyA9PiAn5oqxJywKJ/CvorYnID0+ICfmi5QnLAon8K+itycgPT4gJ+aNkCcsCifwr6K4JyA9PiAn8KKsjCcsCifwr6K5JyA9PiAn5oy9JywKJ/CvoronID0+ICfmi7wnLAon8K+iuycgPT4gJ+aNqCcsCifwr6K8JyA9PiAn5o6DJywKJ/Cvor0nID0+ICfmj6QnLAon8K+ivicgPT4gJ/Cir7EnLAon8K+ivycgPT4gJ+aQoicsCifwr6OAJyA9PiAn5o+FJywKJ/Cvo4EnID0+ICfmjqknLAon8K+jgicgPT4gJ+OoricsCifwr6ODJyA9PiAn5pGpJywKJ/Cvo4QnID0+ICfmkb4nLAon8K+jhScgPT4gJ+aSnScsCifwr6OGJyA9PiAn5pG3JywKJ/Cvo4cnID0+ICfjqawnLAon8K+jiCcgPT4gJ+aVjycsCifwr6OJJyA9PiAn5pWsJywKJ/Cvo4onID0+ICfwo4CKJywKJ/Cvo4snID0+ICfml6MnLAon8K+jjCcgPT4gJ+abuCcsCifwr6ONJyA9PiAn5pmJJywKJ/Cvo44nID0+ICfjrJknLAon8K+jjycgPT4gJ+aakScsCifwr6OQJyA9PiAn46yIJywKJ/Cvo5EnID0+ICfjq6QnLAon8K+jkicgPT4gJ+WGkicsCifwr6OTJyA9PiAn5YaVJywKJ/Cvo5QnID0+ICfmnIAnLAon8K+jlScgPT4gJ+aanCcsCifwr6OWJyA9PiAn6IKtJywKJ/Cvo5cnID0+ICfkj5knLAon8K+jmCcgPT4gJ+aclycsCifwr6OZJyA9PiAn5pybJywKJ/Cvo5onID0+ICfmnKEnLAon8K+jmycgPT4gJ+adnicsCifwr6OcJyA9PiAn5p2TJywKJ/Cvo50nID0+ICfwo4+DJywKJ/Cvo54nID0+ICfjrYknLAon8K+jnycgPT4gJ+afuicsCifwr6OgJyA9PiAn5p6FJywKJ/Cvo6EnID0+ICfmoZInLAon8K+joicgPT4gJ+aihScsCifwr6OjJyA9PiAn8KORrScsCifwr6OkJyA9PiAn5qKOJywKJ/Cvo6UnID0+ICfmoJ8nLAon8K+jpicgPT4gJ+aklCcsCifwr6OnJyA9PiAn466dJywKJ/Cvo6gnID0+ICfmpYInLAon8K+jqScgPT4gJ+amoycsCifwr6OqJyA9PiAn5qeqJywKJ/Cvo6snID0+ICfmqqgnLAon8K+jrCcgPT4gJ/CjmqMnLAon8K+jrScgPT4gJ+armycsCifwr6OuJyA9PiAn47CYJywKJ/Cvo68nID0+ICfmrKEnLAon8K+jsCcgPT4gJ/CjoqcnLAon8K+jsScgPT4gJ+atlCcsCifwr6OyJyA9PiAn47GOJywKJ/Cvo7MnID0+ICfmrbInLAon8K+jtCcgPT4gJ+aunycsCifwr6O1JyA9PiAn5q66JywKJ/Cvo7YnID0+ICfmrrsnLAon8K+jtycgPT4gJ/Cjqo0nLAon8K+juCcgPT4gJ/ChtIsnLAon8K+juScgPT4gJ/Cjq7onLAon8K+juicgPT4gJ+axjicsCifwr6O7JyA9PiAn8KOyvCcsCifwr6O8JyA9PiAn5rK/JywKJ/Cvo70nID0+ICfms40nLAon8K+jvicgPT4gJ+axpycsCifwr6O/JyA9PiAn5rSWJywKJ/CvpIAnID0+ICfmtL4nLAon8K+kgScgPT4gJ+a1tycsCifwr6SCJyA9PiAn5rWBJywKJ/CvpIMnID0+ICfmtaknLAon8K+khCcgPT4gJ+a1uCcsCifwr6SFJyA9PiAn5raFJywKJ/CvpIYnID0+ICfwo7SeJywKJ/CvpIcnID0+ICfmtLQnLAon8K+kiCcgPT4gJ+a4rycsCifwr6SJJyA9PiAn5rmuJywKJ/CvpIonID0+ICfjtLMnLAon8K+kiycgPT4gJ+a7iycsCifwr6SMJyA9PiAn5ruHJywKJ/CvpI0nID0+ICfwo7uRJywKJ/CvpI4nID0+ICfmt7knLAon8K+kjycgPT4gJ+a9ricsCifwr6SQJyA9PiAn8KO9nicsCifwr6SRJyA9PiAn8KO+jicsCifwr6SSJyA9PiAn5r+GJywKJ/CvpJMnID0+ICfngLknLAon8K+klCcgPT4gJ+eAnicsCifwr6SVJyA9PiAn54CbJywKJ/CvpJYnID0+ICfjtpYnLAon8K+klycgPT4gJ+eBiicsCifwr6SYJyA9PiAn54G9JywKJ/CvpJknID0+ICfngbcnLAon8K+kmicgPT4gJ+eCrScsCifwr6SbJyA9PiAn8KCUpScsCifwr6ScJyA9PiAn54WFJywKJ/CvpJ0nID0+ICfwpImjJywKJ/CvpJ4nID0+ICfnhpwnLAon8K+knycgPT4gJ/CkjqsnLAon8K+koCcgPT4gJ+eIqCcsCifwr6ShJyA9PiAn54i1JywKJ/CvpKInID0+ICfniZAnLAon8K+koycgPT4gJ/CkmIgnLAon8K+kpCcgPT4gJ+eKgCcsCifwr6SlJyA9PiAn54qVJywKJ/CvpKYnID0+ICfwpJy1JywKJ/CvpKcnID0+ICfwpKCUJywKJ/CvpKgnID0+ICfnjbonLAon8K+kqScgPT4gJ+eOiycsCifwr6SqJyA9PiAn47qsJywKJ/CvpKsnID0+ICfnjqUnLAon8K+krCcgPT4gJ+O6uCcsCifwr6StJyA9PiAn47q4JywKJ/CvpK4nID0+ICfnkYcnLAon8K+krycgPT4gJ+eRnCcsCifwr6SwJyA9PiAn55GxJywKJ/CvpLEnID0+ICfnkoUnLAon8K+ksicgPT4gJ+eTiicsCifwr6SzJyA9PiAn47ybJywKJ/CvpLQnID0+ICfnlKQnLAon8K+ktScgPT4gJ/CksLYnLAon8K+kticgPT4gJ+eUvicsCifwr6S3JyA9PiAn8KSykicsCifwr6S4JyA9PiAn55WwJywKJ/CvpLknID0+ICfwooafJywKJ/CvpLonID0+ICfnmJAnLAon8K+kuycgPT4gJ/CkvqEnLAon8K+kvCcgPT4gJ/CkvrgnLAon8K+kvScgPT4gJ/ClgYQnLAon8K+kvicgPT4gJ+O/vCcsCifwr6S/JyA9PiAn5ICIJywKJ/CvpYAnID0+ICfnm7QnLAon8K+lgScgPT4gJ/Clg7MnLAon8K+lgicgPT4gJ/Clg7InLAon8K+lgycgPT4gJ/ClhJknLAon8K+lhCcgPT4gJ/ClhLMnLAon8K+lhScgPT4gJ+ecnicsCifwr6WGJyA9PiAn55yfJywKJ/CvpYcnID0+ICfnnJ8nLAon8K+liCcgPT4gJ+ediicsCifwr6WJJyA9PiAn5IC5JywKJ/CvpYonID0+ICfnnosnLAon8K+liycgPT4gJ+SBhicsCifwr6WMJyA9PiAn5IKWJywKJ/CvpY0nID0+ICfwpZCdJywKJ/CvpY4nID0+ICfnoY4nLAon8K+ljycgPT4gJ+eijCcsCifwr6WQJyA9PiAn56OMJywKJ/CvpZEnID0+ICfkg6MnLAon8K+lkicgPT4gJ/ClmKYnLAon8K+lkycgPT4gJ+ellicsCifwr6WUJyA9PiAn8KWamicsCifwr6WVJyA9PiAn8KWbhScsCifwr6WWJyA9PiAn56aPJywKJ/CvpZcnID0+ICfnp6snLAon8K+lmCcgPT4gJ+SErycsCifwr6WZJyA9PiAn56mAJywKJ/CvpZonID0+ICfnqYonLAon8K+lmycgPT4gJ+epjycsCifwr6WcJyA9PiAn8KWlvCcsCifwr6WdJyA9PiAn8KWqpycsCifwr6WeJyA9PiAn8KWqpycsCifwr6WfJyA9PiAn56uuJywKJ/CvpaAnID0+ICfkiIInLAon8K+loScgPT4gJ/ClrqsnLAon8K+loicgPT4gJ+evhicsCifwr6WjJyA9PiAn56+JJywKJ/CvpaQnID0+ICfkiKcnLAon8K+lpScgPT4gJ/ClsoAnLAon8K+lpicgPT4gJ+ezkicsCifwr6WnJyA9PiAn5IqgJywKJ/CvpagnID0+ICfns6gnLAon8K+lqScgPT4gJ+ezoycsCifwr6WqJyA9PiAn57SAJywKJ/CvpasnID0+ICfwpb6GJywKJ/CvpawnID0+ICfntaMnLAon8K+lrScgPT4gJ+SMgScsCifwr6WuJyA9PiAn57eHJywKJ/Cvpa8nID0+ICfnuIInLAon8K+lsCcgPT4gJ+e5hScsCifwr6WxJyA9PiAn5Iy0JywKJ/CvpbInID0+ICfwpoioJywKJ/CvpbMnID0+ICfwpomHJywKJ/CvpbQnID0+ICfkjZknLAon8K+ltScgPT4gJ/Cmi5knLAon8K+lticgPT4gJ+e9uicsCifwr6W3JyA9PiAn8KaMvicsCifwr6W4JyA9PiAn576VJywKJ/CvpbknID0+ICfnv7onLAon8K+luicgPT4gJ+iAhScsCifwr6W7JyA9PiAn8KaTmicsCifwr6W8JyA9PiAn8KaUoycsCifwr6W9JyA9PiAn6IGgJywKJ/Cvpb4nID0+ICfwppaoJywKJ/Cvpb8nID0+ICfogbAnLAon8K+mgCcgPT4gJ/CjjZ8nLAon8K+mgScgPT4gJ+SPlScsCifwr6aCJyA9PiAn6IKyJywKJ/CvpoMnID0+ICfohIMnLAon8K+mhCcgPT4gJ+SQiycsCifwr6aFJyA9PiAn6IS+JywKJ/CvpoYnID0+ICflqrUnLAon8K+mhycgPT4gJ/CmnqcnLAon8K+miCcgPT4gJ/CmnrUnLAon8K+miScgPT4gJ/CjjpMnLAon8K+miicgPT4gJ/CjjpwnLAon8K+miycgPT4gJ+iIgScsCifwr6aMJyA9PiAn6IiEJywKJ/Cvpo0nID0+ICfovp4nLAon8K+mjicgPT4gJ+SRqycsCifwr6aPJyA9PiAn6IqRJywKJ/CvppAnID0+ICfoiosnLAon8K+mkScgPT4gJ+iKnScsCifwr6aSJyA9PiAn5YqzJywKJ/CvppMnID0+ICfoirEnLAon8K+mlCcgPT4gJ+iKsycsCifwr6aVJyA9PiAn6Iq9JywKJ/CvppYnID0+ICfoi6YnLAon8K+mlycgPT4gJ/CmrLwnLAon8K+mmCcgPT4gJ+iLpScsCifwr6aZJyA9PiAn6IydJywKJ/CvpponID0+ICfojaMnLAon8K+mmycgPT4gJ+iOrScsCifwr6acJyA9PiAn6IyjJywKJ/Cvpp0nID0+ICfojr0nLAon8K+mnicgPT4gJ+iPpycsCifwr6afJyA9PiAn6JGXJywKJ/CvpqAnID0+ICfojZMnLAon8K+moScgPT4gJ+iPiicsCifwr6aiJyA9PiAn6I+MJywKJ/CvpqMnID0+ICfoj5wnLAon8K+mpCcgPT4gJ/CmsLYnLAon8K+mpScgPT4gJ/CmtasnLAon8K+mpicgPT4gJ/Cms5UnLAon8K+mpycgPT4gJ+SUqycsCifwr6aoJyA9PiAn6JOxJywKJ/CvpqknID0+ICfok7MnLAon8K+mqicgPT4gJ+iUlicsCifwr6arJyA9PiAn8KePiicsCifwr6asJyA9PiAn6JWkJywKJ/Cvpq0nID0+ICfwprysJywKJ/Cvpq4nID0+ICfklZ0nLAon8K+mrycgPT4gJ+SVoScsCifwr6awJyA9PiAn8Ka+sScsCifwr6axJyA9PiAn8KeDkicsCifwr6ayJyA9PiAn5JWrJywKJ/CvprMnID0+ICfomZAnLAon8K+mtCcgPT4gJ+iZnCcsCifwr6a1JyA9PiAn6JmnJywKJ/CvprYnID0+ICfomaknLAon8K+mtycgPT4gJ+iaqScsCifwr6a4JyA9PiAn6JqIJywKJ/CvprknID0+ICfonI4nLAon8K+muicgPT4gJ+iboicsCifwr6a7JyA9PiAn6J25JywKJ/CvprwnID0+ICfonKgnLAon8K+mvScgPT4gJ+idqycsCifwr6a+JyA9PiAn6J6GJywKJ/Cvpr8nID0+ICfkl5cnLAon8K+ngCcgPT4gJ+ifoScsCifwr6eBJyA9PiAn6KCBJywKJ/Cvp4InID0+ICfkl7knLAon8K+ngycgPT4gJ+ihoCcsCifwr6eEJyA9PiAn6KGjJywKJ/Cvp4UnID0+ICfwp5mnJywKJ/Cvp4YnID0+ICfoo5cnLAon8K+nhycgPT4gJ+ijnicsCifwr6eIJyA9PiAn5Ji1JywKJ/Cvp4knID0+ICfoo7onLAon8K+niicgPT4gJ+OSuycsCifwr6eLJyA9PiAn8KeiricsCifwr6eMJyA9PiAn8KelpicsCifwr6eNJyA9PiAn5Jq+JywKJ/Cvp44nID0+ICfkm4cnLAon8K+njycgPT4gJ+iqoCcsCifwr6eQJyA9PiAn6KutJywKJ/Cvp5EnID0+ICforoonLAon8K+nkicgPT4gJ+ixlScsCifwr6eTJyA9PiAn8KeyqCcsCifwr6eUJyA9PiAn6LKrJywKJ/Cvp5UnID0+ICfos4EnLAon8K+nlicgPT4gJ+i0mycsCifwr6eXJyA9PiAn6LW3JywKJ/Cvp5gnID0+ICfwp7yvJywKJ/Cvp5knID0+ICfwoKCEJywKJ/Cvp5onID0+ICfot4snLAon8K+nmycgPT4gJ+i2vCcsCifwr6ecJyA9PiAn6LewJywKJ/Cvp50nID0+ICfwoKOeJywKJ/Cvp54nID0+ICfou5QnLAon8K+nnycgPT4gJ+i8uCcsCifwr6egJyA9PiAn8KiXkicsCifwr6ehJyA9PiAn8KiXrScsCifwr6eiJyA9PiAn6YKUJywKJ/Cvp6MnID0+ICfpg7EnLAon8K+npCcgPT4gJ+mEkScsCifwr6elJyA9PiAn8KicricsCifwr6emJyA9PiAn6YSbJywKJ/Cvp6cnID0+ICfpiLgnLAon8K+nqCcgPT4gJ+mLlycsCifwr6epJyA9PiAn6YuYJywKJ/Cvp6onID0+ICfpibwnLAon8K+nqycgPT4gJ+mPuScsCifwr6esJyA9PiAn6ZCVJywKJ/Cvp60nID0+ICfwqK+6JywKJ/Cvp64nID0+ICfplosnLAon8K+nrycgPT4gJ+SmlScsCifwr6ewJyA9PiAn6Za3JywKJ/Cvp7EnID0+ICfwqLW3JywKJ/Cvp7InID0+ICfkp6YnLAon8K+nsycgPT4gJ+mbgycsCifwr6e0JyA9PiAn5bayJywKJ/Cvp7UnID0+ICfpnKMnLAon8K+nticgPT4gJ/CphYUnLAon8K+ntycgPT4gJ/CpiJonLAon8K+nuCcgPT4gJ+SpricsCifwr6e5JyA9PiAn5Km2JywKJ/Cvp7onID0+ICfpn6AnLAon8K+nuycgPT4gJ/CpkIonLAon8K+nvCcgPT4gJ+SqsicsCifwr6e9JyA9PiAn8KmSlicsCifwr6e+JyA9PiAn6aCLJywKJ/Cvp78nID0+ICfpoIsnLAon8K+ogCcgPT4gJ+mgqScsCifwr6iBJyA9PiAn8KmWticsCifwr6iCJyA9PiAn6aOiJywKJ/CvqIMnID0+ICfkrLMnLAon8K+ohCcgPT4gJ+mkqScsCifwr6iFJyA9PiAn6aanJywKJ/CvqIYnID0+ICfpp4InLAon8K+ohycgPT4gJ+mnvicsCifwr6iIJyA9PiAn5K+OJywKJ/CvqIknID0+ICfwqaywJywKJ/CvqIonID0+ICfprJInLAon8K+oiycgPT4gJ+mxgCcsCifwr6iMJyA9PiAn6bO9JywKJ/CvqI0nID0+ICfks44nLAon8K+ojicgPT4gJ+SzrScsCifwr6iPJyA9PiAn6bWnJywKJ/CvqJAnID0+ICfwqoOOJywKJ/CvqJEnID0+ICfks7gnLAon8K+okicgPT4gJ/CqhIUnLAon8K+okycgPT4gJ/CqiI4nLAon8K+olCcgPT4gJ/CqipEnLAon8K+olScgPT4gJ+m6uycsCifwr6iWJyA9PiAn5LWWJywKJ/CvqJcnID0+ICfpu7knLAon8K+omCcgPT4gJ+m7vicsCifwr6iZJyA9PiAn6byFJywKJ/CvqJonID0+ICfpvI8nLAon8K+omycgPT4gJ+m8licsCifwr6icJyA9PiAn6by7JywKJ/CvqJ0nID0+ICfwqpiAJywKKTsKPD9waHAKCnJldHVybiBhcnJheSAoCifMgCcgPT4gMjMwLAonzIEnID0+IDIzMCwKJ8yCJyA9PiAyMzAsCifMgycgPT4gMjMwLAonzIQnID0+IDIzMCwKJ8yFJyA9PiAyMzAsCifMhicgPT4gMjMwLAonzIcnID0+IDIzMCwKJ8yIJyA9PiAyMzAsCifMiScgPT4gMjMwLAonzIonID0+IDIzMCwKJ8yLJyA9PiAyMzAsCifMjCcgPT4gMjMwLAonzI0nID0+IDIzMCwKJ8yOJyA9PiAyMzAsCifMjycgPT4gMjMwLAonzJAnID0+IDIzMCwKJ8yRJyA9PiAyMzAsCifMkicgPT4gMjMwLAonzJMnID0+IDIzMCwKJ8yUJyA9PiAyMzAsCifMlScgPT4gMjMyLAonzJYnID0+IDIyMCwKJ8yXJyA9PiAyMjAsCifMmCcgPT4gMjIwLAonzJknID0+IDIyMCwKJ8yaJyA9PiAyMzIsCifMmycgPT4gMjE2LAonzJwnID0+IDIyMCwKJ8ydJyA9PiAyMjAsCifMnicgPT4gMjIwLAonzJ8nID0+IDIyMCwKJ8ygJyA9PiAyMjAsCifMoScgPT4gMjAyLAonzKInID0+IDIwMiwKJ8yjJyA9PiAyMjAsCifMpCcgPT4gMjIwLAonzKUnID0+IDIyMCwKJ8ymJyA9PiAyMjAsCifMpycgPT4gMjAyLAonzKgnID0+IDIwMiwKJ8ypJyA9PiAyMjAsCifMqicgPT4gMjIwLAonzKsnID0+IDIyMCwKJ8ysJyA9PiAyMjAsCifMrScgPT4gMjIwLAonzK4nID0+IDIyMCwKJ8yvJyA9PiAyMjAsCifMsCcgPT4gMjIwLAonzLEnID0+IDIyMCwKJ8yyJyA9PiAyMjAsCifMsycgPT4gMjIwLAonzLQnID0+IDEsCifMtScgPT4gMSwKJ8y2JyA9PiAxLAonzLcnID0+IDEsCifMuCcgPT4gMSwKJ8y5JyA9PiAyMjAsCifMuicgPT4gMjIwLAonzLsnID0+IDIyMCwKJ8y8JyA9PiAyMjAsCifMvScgPT4gMjMwLAonzL4nID0+IDIzMCwKJ8y/JyA9PiAyMzAsCifNgCcgPT4gMjMwLAonzYEnID0+IDIzMCwKJ82CJyA9PiAyMzAsCifNgycgPT4gMjMwLAonzYQnID0+IDIzMCwKJ82FJyA9PiAyNDAsCifNhicgPT4gMjMwLAonzYcnID0+IDIyMCwKJ82IJyA9PiAyMjAsCifNiScgPT4gMjIwLAonzYonID0+IDIzMCwKJ82LJyA9PiAyMzAsCifNjCcgPT4gMjMwLAonzY0nID0+IDIyMCwKJ82OJyA9PiAyMjAsCifNkCcgPT4gMjMwLAonzZEnID0+IDIzMCwKJ82SJyA9PiAyMzAsCifNkycgPT4gMjIwLAonzZQnID0+IDIyMCwKJ82VJyA9PiAyMjAsCifNlicgPT4gMjIwLAonzZcnID0+IDIzMCwKJ82YJyA9PiAyMzIsCifNmScgPT4gMjIwLAonzZonID0+IDIyMCwKJ82bJyA9PiAyMzAsCifNnCcgPT4gMjMzLAonzZ0nID0+IDIzNCwKJ82eJyA9PiAyMzQsCifNnycgPT4gMjMzLAonzaAnID0+IDIzNCwKJ82hJyA9PiAyMzQsCifNoicgPT4gMjMzLAonzaMnID0+IDIzMCwKJ82kJyA9PiAyMzAsCifNpScgPT4gMjMwLAonzaYnID0+IDIzMCwKJ82nJyA9PiAyMzAsCifNqCcgPT4gMjMwLAonzaknID0+IDIzMCwKJ82qJyA9PiAyMzAsCifNqycgPT4gMjMwLAonzawnID0+IDIzMCwKJ82tJyA9PiAyMzAsCifNricgPT4gMjMwLAonza8nID0+IDIzMCwKJ9KDJyA9PiAyMzAsCifShCcgPT4gMjMwLAon0oUnID0+IDIzMCwKJ9KGJyA9PiAyMzAsCifShycgPT4gMjMwLAon1pEnID0+IDIyMCwKJ9aSJyA9PiAyMzAsCifWkycgPT4gMjMwLAon1pQnID0+IDIzMCwKJ9aVJyA9PiAyMzAsCifWlicgPT4gMjIwLAon1pcnID0+IDIzMCwKJ9aYJyA9PiAyMzAsCifWmScgPT4gMjMwLAon1ponID0+IDIyMiwKJ9abJyA9PiAyMjAsCifWnCcgPT4gMjMwLAon1p0nID0+IDIzMCwKJ9aeJyA9PiAyMzAsCifWnycgPT4gMjMwLAon1qAnID0+IDIzMCwKJ9ahJyA9PiAyMzAsCifWoicgPT4gMjIwLAon1qMnID0+IDIyMCwKJ9akJyA9PiAyMjAsCifWpScgPT4gMjIwLAon1qYnID0+IDIyMCwKJ9anJyA9PiAyMjAsCifWqCcgPT4gMjMwLAon1qknID0+IDIzMCwKJ9aqJyA9PiAyMjAsCifWqycgPT4gMjMwLAon1qwnID0+IDIzMCwKJ9atJyA9PiAyMjIsCifWricgPT4gMjI4LAon1q8nID0+IDIzMCwKJ9awJyA9PiAxMCwKJ9axJyA9PiAxMSwKJ9ayJyA9PiAxMiwKJ9azJyA9PiAxMywKJ9a0JyA9PiAxNCwKJ9a1JyA9PiAxNSwKJ9a2JyA9PiAxNiwKJ9a3JyA9PiAxNywKJ9a4JyA9PiAxOCwKJ9a5JyA9PiAxOSwKJ9a6JyA9PiAxOSwKJ9a7JyA9PiAyMCwKJ9a8JyA9PiAyMSwKJ9a9JyA9PiAyMiwKJ9a/JyA9PiAyMywKJ9eBJyA9PiAyNCwKJ9eCJyA9PiAyNSwKJ9eEJyA9PiAyMzAsCifXhScgPT4gMjIwLAon14cnID0+IDE4LAon2JAnID0+IDIzMCwKJ9iRJyA9PiAyMzAsCifYkicgPT4gMjMwLAon2JMnID0+IDIzMCwKJ9iUJyA9PiAyMzAsCifYlScgPT4gMjMwLAon2JYnID0+IDIzMCwKJ9iXJyA9PiAyMzAsCifYmCcgPT4gMzAsCifYmScgPT4gMzEsCifYmicgPT4gMzIsCifZiycgPT4gMjcsCifZjCcgPT4gMjgsCifZjScgPT4gMjksCifZjicgPT4gMzAsCifZjycgPT4gMzEsCifZkCcgPT4gMzIsCifZkScgPT4gMzMsCifZkicgPT4gMzQsCifZkycgPT4gMjMwLAon2ZQnID0+IDIzMCwKJ9mVJyA9PiAyMjAsCifZlicgPT4gMjIwLAon2ZcnID0+IDIzMCwKJ9mYJyA9PiAyMzAsCifZmScgPT4gMjMwLAon2ZonID0+IDIzMCwKJ9mbJyA9PiAyMzAsCifZnCcgPT4gMjIwLAon2Z0nID0+IDIzMCwKJ9meJyA9PiAyMzAsCifZnycgPT4gMjIwLAon2bAnID0+IDM1LAon25YnID0+IDIzMCwKJ9uXJyA9PiAyMzAsCifbmCcgPT4gMjMwLAon25knID0+IDIzMCwKJ9uaJyA9PiAyMzAsCifbmycgPT4gMjMwLAon25wnID0+IDIzMCwKJ9ufJyA9PiAyMzAsCifboCcgPT4gMjMwLAon26EnID0+IDIzMCwKJ9uiJyA9PiAyMzAsCifboycgPT4gMjIwLAon26QnID0+IDIzMCwKJ9unJyA9PiAyMzAsCifbqCcgPT4gMjMwLAon26onID0+IDIyMCwKJ9urJyA9PiAyMzAsCifbrCcgPT4gMjMwLAon260nID0+IDIyMCwKJ9yRJyA9PiAzNiwKJ9ywJyA9PiAyMzAsCifcsScgPT4gMjIwLAon3LInID0+IDIzMCwKJ9yzJyA9PiAyMzAsCifctCcgPT4gMjIwLAon3LUnID0+IDIzMCwKJ9y2JyA9PiAyMzAsCifctycgPT4gMjIwLAon3LgnID0+IDIyMCwKJ9y5JyA9PiAyMjAsCifcuicgPT4gMjMwLAon3LsnID0+IDIyMCwKJ9y8JyA9PiAyMjAsCifcvScgPT4gMjMwLAon3L4nID0+IDIyMCwKJ9y/JyA9PiAyMzAsCifdgCcgPT4gMjMwLAon3YEnID0+IDIzMCwKJ92CJyA9PiAyMjAsCifdgycgPT4gMjMwLAon3YQnID0+IDIyMCwKJ92FJyA9PiAyMzAsCifdhicgPT4gMjIwLAon3YcnID0+IDIzMCwKJ92IJyA9PiAyMjAsCifdiScgPT4gMjMwLAon3YonID0+IDIzMCwKJ9+rJyA9PiAyMzAsCiffrCcgPT4gMjMwLAon360nID0+IDIzMCwKJ9+uJyA9PiAyMzAsCiffrycgPT4gMjMwLAon37AnID0+IDIzMCwKJ9+xJyA9PiAyMzAsCiffsicgPT4gMjIwLAon37MnID0+IDIzMCwKJ9+9JyA9PiAyMjAsCifgoJYnID0+IDIzMCwKJ+CglycgPT4gMjMwLAon4KCYJyA9PiAyMzAsCifgoJknID0+IDIzMCwKJ+CgmycgPT4gMjMwLAon4KCcJyA9PiAyMzAsCifgoJ0nID0+IDIzMCwKJ+CgnicgPT4gMjMwLAon4KCfJyA9PiAyMzAsCifgoKAnID0+IDIzMCwKJ+CgoScgPT4gMjMwLAon4KCiJyA9PiAyMzAsCifgoKMnID0+IDIzMCwKJ+CgpScgPT4gMjMwLAon4KCmJyA9PiAyMzAsCifgoKcnID0+IDIzMCwKJ+CgqScgPT4gMjMwLAon4KCqJyA9PiAyMzAsCifgoKsnID0+IDIzMCwKJ+CgrCcgPT4gMjMwLAon4KCtJyA9PiAyMzAsCifgoZknID0+IDIyMCwKJ+ChmicgPT4gMjIwLAon4KGbJyA9PiAyMjAsCifgo5MnID0+IDIyMCwKJ+CjlCcgPT4gMjMwLAon4KOVJyA9PiAyMzAsCifgo5YnID0+IDIzMCwKJ+CjlycgPT4gMjMwLAon4KOYJyA9PiAyMzAsCifgo5knID0+IDIzMCwKJ+CjmicgPT4gMjMwLAon4KObJyA9PiAyMzAsCifgo5wnID0+IDIzMCwKJ+CjnScgPT4gMjMwLAon4KOeJyA9PiAyMzAsCifgo58nID0+IDIzMCwKJ+CjoCcgPT4gMjMwLAon4KOhJyA9PiAyMzAsCifgo6MnID0+IDIyMCwKJ+CjpCcgPT4gMjMwLAon4KOlJyA9PiAyMzAsCifgo6YnID0+IDIyMCwKJ+CjpycgPT4gMjMwLAon4KOoJyA9PiAyMzAsCifgo6knID0+IDIyMCwKJ+CjqicgPT4gMjMwLAon4KOrJyA9PiAyMzAsCifgo6wnID0+IDIzMCwKJ+CjrScgPT4gMjIwLAon4KOuJyA9PiAyMjAsCifgo68nID0+IDIyMCwKJ+CjsCcgPT4gMjcsCifgo7EnID0+IDI4LAon4KOyJyA9PiAyOSwKJ+CjsycgPT4gMjMwLAon4KO0JyA9PiAyMzAsCifgo7UnID0+IDIzMCwKJ+CjticgPT4gMjIwLAon4KO3JyA9PiAyMzAsCifgo7gnID0+IDIzMCwKJ+CjuScgPT4gMjIwLAon4KO6JyA9PiAyMjAsCifgo7snID0+IDIzMCwKJ+CjvCcgPT4gMjMwLAon4KO9JyA9PiAyMzAsCifgo74nID0+IDIzMCwKJ+CjvycgPT4gMjMwLAon4KS8JyA9PiA3LAon4KWNJyA9PiA5LAon4KWRJyA9PiAyMzAsCifgpZInID0+IDIyMCwKJ+ClkycgPT4gMjMwLAon4KWUJyA9PiAyMzAsCifgprwnID0+IDcsCifgp40nID0+IDksCifgp74nID0+IDIzMCwKJ+CovCcgPT4gNywKJ+CpjScgPT4gOSwKJ+CqvCcgPT4gNywKJ+CrjScgPT4gOSwKJ+CsvCcgPT4gNywKJ+CtjScgPT4gOSwKJ+CvjScgPT4gOSwKJ+CxjScgPT4gOSwKJ+CxlScgPT4gODQsCifgsZYnID0+IDkxLAon4LK8JyA9PiA3LAon4LONJyA9PiA5LAon4LS7JyA9PiA5LAon4LS8JyA9PiA5LAon4LWNJyA9PiA5LAon4LeKJyA9PiA5LAon4Li4JyA9PiAxMDMsCifguLknID0+IDEwMywKJ+C4uicgPT4gOSwKJ+C5iCcgPT4gMTA3LAon4LmJJyA9PiAxMDcsCifguYonID0+IDEwNywKJ+C5iycgPT4gMTA3LAon4Lq4JyA9PiAxMTgsCifgurknID0+IDExOCwKJ+C6uicgPT4gOSwKJ+C7iCcgPT4gMTIyLAon4LuJJyA9PiAxMjIsCifgu4onID0+IDEyMiwKJ+C7iycgPT4gMTIyLAon4LyYJyA9PiAyMjAsCifgvJknID0+IDIyMCwKJ+C8tScgPT4gMjIwLAon4Ly3JyA9PiAyMjAsCifgvLknID0+IDIxNiwKJ+C9sScgPT4gMTI5LAon4L2yJyA9PiAxMzAsCifgvbQnID0+IDEzMiwKJ+C9uicgPT4gMTMwLAon4L27JyA9PiAxMzAsCifgvbwnID0+IDEzMCwKJ+C9vScgPT4gMTMwLAon4L6AJyA9PiAxMzAsCifgvoInID0+IDIzMCwKJ+C+gycgPT4gMjMwLAon4L6EJyA9PiA5LAon4L6GJyA9PiAyMzAsCifgvocnID0+IDIzMCwKJ+C/hicgPT4gMjIwLAon4YC3JyA9PiA3LAon4YC5JyA9PiA5LAon4YC6JyA9PiA5LAon4YKNJyA9PiAyMjAsCifhjZ0nID0+IDIzMCwKJ+GNnicgPT4gMjMwLAon4Y2fJyA9PiAyMzAsCifhnJQnID0+IDksCifhnLQnID0+IDksCifhn5InID0+IDksCifhn50nID0+IDIzMCwKJ+GiqScgPT4gMjI4LAon4aS5JyA9PiAyMjIsCifhpLonID0+IDIzMCwKJ+GkuycgPT4gMjIwLAon4aiXJyA9PiAyMzAsCifhqJgnID0+IDIyMCwKJ+GpoCcgPT4gOSwKJ+GptScgPT4gMjMwLAon4am2JyA9PiAyMzAsCifhqbcnID0+IDIzMCwKJ+GpuCcgPT4gMjMwLAon4am5JyA9PiAyMzAsCifhqbonID0+IDIzMCwKJ+GpuycgPT4gMjMwLAon4am8JyA9PiAyMzAsCifhqb8nID0+IDIyMCwKJ+GqsCcgPT4gMjMwLAon4aqxJyA9PiAyMzAsCifhqrInID0+IDIzMCwKJ+GqsycgPT4gMjMwLAon4aq0JyA9PiAyMzAsCifhqrUnID0+IDIyMCwKJ+GqticgPT4gMjIwLAon4aq3JyA9PiAyMjAsCifhqrgnID0+IDIyMCwKJ+GquScgPT4gMjIwLAon4aq6JyA9PiAyMjAsCifhqrsnID0+IDIzMCwKJ+GqvCcgPT4gMjMwLAon4aq9JyA9PiAyMjAsCifhqr8nID0+IDIyMCwKJ+GrgCcgPT4gMjIwLAon4ay0JyA9PiA3LAon4a2EJyA9PiA5LAon4a2rJyA9PiAyMzAsCifhrawnID0+IDIyMCwKJ+GtrScgPT4gMjMwLAon4a2uJyA9PiAyMzAsCifhra8nID0+IDIzMCwKJ+GtsCcgPT4gMjMwLAon4a2xJyA9PiAyMzAsCifhrbInID0+IDIzMCwKJ+GtsycgPT4gMjMwLAon4a6qJyA9PiA5LAon4a6rJyA9PiA5LAon4a+mJyA9PiA3LAon4a+yJyA9PiA5LAon4a+zJyA9PiA5LAon4bC3JyA9PiA3LAon4bOQJyA9PiAyMzAsCifhs5EnID0+IDIzMCwKJ+GzkicgPT4gMjMwLAon4bOUJyA9PiAxLAon4bOVJyA9PiAyMjAsCifhs5YnID0+IDIyMCwKJ+GzlycgPT4gMjIwLAon4bOYJyA9PiAyMjAsCifhs5knID0+IDIyMCwKJ+GzmicgPT4gMjMwLAon4bObJyA9PiAyMzAsCifhs5wnID0+IDIyMCwKJ+GznScgPT4gMjIwLAon4bOeJyA9PiAyMjAsCifhs58nID0+IDIyMCwKJ+GzoCcgPT4gMjMwLAon4bOiJyA9PiAxLAon4bOjJyA9PiAxLAon4bOkJyA9PiAxLAon4bOlJyA9PiAxLAon4bOmJyA9PiAxLAon4bOnJyA9PiAxLAon4bOoJyA9PiAxLAon4bOtJyA9PiAyMjAsCifhs7QnID0+IDIzMCwKJ+GzuCcgPT4gMjMwLAon4bO5JyA9PiAyMzAsCifht4AnID0+IDIzMCwKJ+G3gScgPT4gMjMwLAon4beCJyA9PiAyMjAsCifht4MnID0+IDIzMCwKJ+G3hCcgPT4gMjMwLAon4beFJyA9PiAyMzAsCifht4YnID0+IDIzMCwKJ+G3hycgPT4gMjMwLAon4beIJyA9PiAyMzAsCifht4knID0+IDIzMCwKJ+G3iicgPT4gMjIwLAon4beLJyA9PiAyMzAsCifht4wnID0+IDIzMCwKJ+G3jScgPT4gMjM0LAon4beOJyA9PiAyMTQsCifht48nID0+IDIyMCwKJ+G3kCcgPT4gMjAyLAon4beRJyA9PiAyMzAsCifht5InID0+IDIzMCwKJ+G3kycgPT4gMjMwLAon4beUJyA9PiAyMzAsCifht5UnID0+IDIzMCwKJ+G3licgPT4gMjMwLAon4beXJyA9PiAyMzAsCifht5gnID0+IDIzMCwKJ+G3mScgPT4gMjMwLAon4beaJyA9PiAyMzAsCifht5snID0+IDIzMCwKJ+G3nCcgPT4gMjMwLAon4bedJyA9PiAyMzAsCifht54nID0+IDIzMCwKJ+G3nycgPT4gMjMwLAon4begJyA9PiAyMzAsCifht6EnID0+IDIzMCwKJ+G3oicgPT4gMjMwLAon4bejJyA9PiAyMzAsCifht6QnID0+IDIzMCwKJ+G3pScgPT4gMjMwLAon4bemJyA9PiAyMzAsCifht6cnID0+IDIzMCwKJ+G3qCcgPT4gMjMwLAon4bepJyA9PiAyMzAsCifht6onID0+IDIzMCwKJ+G3qycgPT4gMjMwLAon4besJyA9PiAyMzAsCifht60nID0+IDIzMCwKJ+G3ricgPT4gMjMwLAon4bevJyA9PiAyMzAsCifht7AnID0+IDIzMCwKJ+G3sScgPT4gMjMwLAon4beyJyA9PiAyMzAsCifht7MnID0+IDIzMCwKJ+G3tCcgPT4gMjMwLAon4be1JyA9PiAyMzAsCifht7YnID0+IDIzMiwKJ+G3tycgPT4gMjI4LAon4be4JyA9PiAyMjgsCifht7knID0+IDIyMCwKJ+G3uycgPT4gMjMwLAon4be8JyA9PiAyMzMsCifht70nID0+IDIyMCwKJ+G3vicgPT4gMjMwLAon4be/JyA9PiAyMjAsCifig5AnID0+IDIzMCwKJ+KDkScgPT4gMjMwLAon4oOSJyA9PiAxLAon4oOTJyA9PiAxLAon4oOUJyA9PiAyMzAsCifig5UnID0+IDIzMCwKJ+KDlicgPT4gMjMwLAon4oOXJyA9PiAyMzAsCifig5gnID0+IDEsCifig5knID0+IDEsCifig5onID0+IDEsCifig5snID0+IDIzMCwKJ+KDnCcgPT4gMjMwLAon4oOhJyA9PiAyMzAsCifig6UnID0+IDEsCifig6YnID0+IDEsCifig6cnID0+IDIzMCwKJ+KDqCcgPT4gMjIwLAon4oOpJyA9PiAyMzAsCifig6onID0+IDEsCifig6snID0+IDEsCifig6wnID0+IDIyMCwKJ+KDrScgPT4gMjIwLAon4oOuJyA9PiAyMjAsCifig68nID0+IDIyMCwKJ+KDsCcgPT4gMjMwLAon4rOvJyA9PiAyMzAsCifis7AnID0+IDIzMCwKJ+KzsScgPT4gMjMwLAon4rW/JyA9PiA5LAon4regJyA9PiAyMzAsCifit6EnID0+IDIzMCwKJ+K3oicgPT4gMjMwLAon4rejJyA9PiAyMzAsCifit6QnID0+IDIzMCwKJ+K3pScgPT4gMjMwLAon4remJyA9PiAyMzAsCifit6cnID0+IDIzMCwKJ+K3qCcgPT4gMjMwLAon4repJyA9PiAyMzAsCifit6onID0+IDIzMCwKJ+K3qycgPT4gMjMwLAon4resJyA9PiAyMzAsCifit60nID0+IDIzMCwKJ+K3ricgPT4gMjMwLAon4revJyA9PiAyMzAsCifit7AnID0+IDIzMCwKJ+K3sScgPT4gMjMwLAon4reyJyA9PiAyMzAsCifit7MnID0+IDIzMCwKJ+K3tCcgPT4gMjMwLAon4re1JyA9PiAyMzAsCifit7YnID0+IDIzMCwKJ+K3tycgPT4gMjMwLAon4re4JyA9PiAyMzAsCifit7knID0+IDIzMCwKJ+K3uicgPT4gMjMwLAon4re7JyA9PiAyMzAsCifit7wnID0+IDIzMCwKJ+K3vScgPT4gMjMwLAon4re+JyA9PiAyMzAsCifit78nID0+IDIzMCwKJ+OAqicgPT4gMjE4LAon44CrJyA9PiAyMjgsCifjgKwnID0+IDIzMiwKJ+OArScgPT4gMjIyLAon44CuJyA9PiAyMjQsCifjgK8nID0+IDIyNCwKJ+OCmScgPT4gOCwKJ+OCmicgPT4gOCwKJ+qZrycgPT4gMjMwLAon6pm0JyA9PiAyMzAsCifqmbUnID0+IDIzMCwKJ+qZticgPT4gMjMwLAon6pm3JyA9PiAyMzAsCifqmbgnID0+IDIzMCwKJ+qZuScgPT4gMjMwLAon6pm6JyA9PiAyMzAsCifqmbsnID0+IDIzMCwKJ+qZvCcgPT4gMjMwLAon6pm9JyA9PiAyMzAsCifqmp4nID0+IDIzMCwKJ+qanycgPT4gMjMwLAon6puwJyA9PiAyMzAsCifqm7EnID0+IDIzMCwKJ+qghicgPT4gOSwKJ+qgrCcgPT4gOSwKJ+qjhCcgPT4gOSwKJ+qjoCcgPT4gMjMwLAon6qOhJyA9PiAyMzAsCifqo6InID0+IDIzMCwKJ+qjoycgPT4gMjMwLAon6qOkJyA9PiAyMzAsCifqo6UnID0+IDIzMCwKJ+qjpicgPT4gMjMwLAon6qOnJyA9PiAyMzAsCifqo6gnID0+IDIzMCwKJ+qjqScgPT4gMjMwLAon6qOqJyA9PiAyMzAsCifqo6snID0+IDIzMCwKJ+qjrCcgPT4gMjMwLAon6qOtJyA9PiAyMzAsCifqo64nID0+IDIzMCwKJ+qjrycgPT4gMjMwLAon6qOwJyA9PiAyMzAsCifqo7EnID0+IDIzMCwKJ+qkqycgPT4gMjIwLAon6qSsJyA9PiAyMjAsCifqpK0nID0+IDIyMCwKJ+qlkycgPT4gOSwKJ+qmsycgPT4gNywKJ+qngCcgPT4gOSwKJ+qqsCcgPT4gMjMwLAon6qqyJyA9PiAyMzAsCifqqrMnID0+IDIzMCwKJ+qqtCcgPT4gMjIwLAon6qq3JyA9PiAyMzAsCifqqrgnID0+IDIzMCwKJ+qqvicgPT4gMjMwLAon6qq/JyA9PiAyMzAsCifqq4EnID0+IDIzMCwKJ+qrticgPT4gOSwKJ+qvrScgPT4gOSwKJ++snicgPT4gMjYsCifvuKAnID0+IDIzMCwKJ++4oScgPT4gMjMwLAon77iiJyA9PiAyMzAsCifvuKMnID0+IDIzMCwKJ++4pCcgPT4gMjMwLAon77ilJyA9PiAyMzAsCifvuKYnID0+IDIzMCwKJ++4pycgPT4gMjIwLAon77ioJyA9PiAyMjAsCifvuKknID0+IDIyMCwKJ++4qicgPT4gMjIwLAon77irJyA9PiAyMjAsCifvuKwnID0+IDIyMCwKJ++4rScgPT4gMjIwLAon77iuJyA9PiAyMzAsCifvuK8nID0+IDIzMCwKJ/CQh70nID0+IDIyMCwKJ/CQi6AnID0+IDIyMCwKJ/CQjbYnID0+IDIzMCwKJ/CQjbcnID0+IDIzMCwKJ/CQjbgnID0+IDIzMCwKJ/CQjbknID0+IDIzMCwKJ/CQjbonID0+IDIzMCwKJ/CQqI0nID0+IDIyMCwKJ/CQqI8nID0+IDIzMCwKJ/CQqLgnID0+IDIzMCwKJ/CQqLknID0+IDEsCifwkKi6JyA9PiAyMjAsCifwkKi/JyA9PiA5LAon8JCrpScgPT4gMjMwLAon8JCrpicgPT4gMjIwLAon8JC0pCcgPT4gMjMwLAon8JC0pScgPT4gMjMwLAon8JC0picgPT4gMjMwLAon8JC0pycgPT4gMjMwLAon8JC6qycgPT4gMjMwLAon8JC6rCcgPT4gMjMwLAon8JC9hicgPT4gMjIwLAon8JC9hycgPT4gMjIwLAon8JC9iCcgPT4gMjMwLAon8JC9iScgPT4gMjMwLAon8JC9iicgPT4gMjMwLAon8JC9iycgPT4gMjIwLAon8JC9jCcgPT4gMjMwLAon8JC9jScgPT4gMjIwLAon8JC9jicgPT4gMjIwLAon8JC9jycgPT4gMjIwLAon8JC9kCcgPT4gMjIwLAon8JGBhicgPT4gOSwKJ/CRgb8nID0+IDksCifwkYK5JyA9PiA5LAon8JGCuicgPT4gNywKJ/CRhIAnID0+IDIzMCwKJ/CRhIEnID0+IDIzMCwKJ/CRhIInID0+IDIzMCwKJ/CRhLMnID0+IDksCifwkYS0JyA9PiA5LAon8JGFsycgPT4gNywKJ/CRh4AnID0+IDksCifwkYeKJyA9PiA3LAon8JGItScgPT4gOSwKJ/CRiLYnID0+IDcsCifwkYupJyA9PiA3LAon8JGLqicgPT4gOSwKJ/CRjLsnID0+IDcsCifwkYy8JyA9PiA3LAon8JGNjScgPT4gOSwKJ/CRjaYnID0+IDIzMCwKJ/CRjacnID0+IDIzMCwKJ/CRjagnID0+IDIzMCwKJ/CRjaknID0+IDIzMCwKJ/CRjaonID0+IDIzMCwKJ/CRjasnID0+IDIzMCwKJ/CRjawnID0+IDIzMCwKJ/CRjbAnID0+IDIzMCwKJ/CRjbEnID0+IDIzMCwKJ/CRjbInID0+IDIzMCwKJ/CRjbMnID0+IDIzMCwKJ/CRjbQnID0+IDIzMCwKJ/CRkYInID0+IDksCifwkZGGJyA9PiA3LAon8JGRnicgPT4gMjMwLAon8JGTgicgPT4gOSwKJ/CRk4MnID0+IDcsCifwkZa/JyA9PiA5LAon8JGXgCcgPT4gNywKJ/CRmL8nID0+IDksCifwkZq2JyA9PiA5LAon8JGatycgPT4gNywKJ/CRnKsnID0+IDksCifwkaC5JyA9PiA5LAon8JGguicgPT4gNywKJ/CRpL0nID0+IDksCifwkaS+JyA9PiA5LAon8JGlgycgPT4gNywKJ/CRp6AnID0+IDksCifwkai0JyA9PiA5LAon8JGphycgPT4gOSwKJ/CRqpknID0+IDksCifwkbC/JyA9PiA5LAon8JG1gicgPT4gNywKJ/CRtYQnID0+IDksCifwkbWFJyA9PiA5LAon8JG2lycgPT4gOSwKJ/CWq7AnID0+IDEsCifwlquxJyA9PiAxLAon8JarsicgPT4gMSwKJ/CWq7MnID0+IDEsCifwlqu0JyA9PiAxLAon8JassCcgPT4gMjMwLAon8JassScgPT4gMjMwLAon8JassicgPT4gMjMwLAon8JassycgPT4gMjMwLAon8JastCcgPT4gMjMwLAon8JastScgPT4gMjMwLAon8JasticgPT4gMjMwLAon8Ja/sCcgPT4gNiwKJ/CWv7EnID0+IDYsCifwm7KeJyA9PiAxLAon8J2FpScgPT4gMjE2LAon8J2FpicgPT4gMjE2LAon8J2FpycgPT4gMSwKJ/CdhagnID0+IDEsCifwnYWpJyA9PiAxLAon8J2FrScgPT4gMjI2LAon8J2FricgPT4gMjE2LAon8J2FrycgPT4gMjE2LAon8J2FsCcgPT4gMjE2LAon8J2FsScgPT4gMjE2LAon8J2FsicgPT4gMjE2LAon8J2FuycgPT4gMjIwLAon8J2FvCcgPT4gMjIwLAon8J2FvScgPT4gMjIwLAon8J2FvicgPT4gMjIwLAon8J2FvycgPT4gMjIwLAon8J2GgCcgPT4gMjIwLAon8J2GgScgPT4gMjIwLAon8J2GgicgPT4gMjIwLAon8J2GhScgPT4gMjMwLAon8J2GhicgPT4gMjMwLAon8J2GhycgPT4gMjMwLAon8J2GiCcgPT4gMjMwLAon8J2GiScgPT4gMjMwLAon8J2GiicgPT4gMjIwLAon8J2GiycgPT4gMjIwLAon8J2GqicgPT4gMjMwLAon8J2GqycgPT4gMjMwLAon8J2GrCcgPT4gMjMwLAon8J2GrScgPT4gMjMwLAon8J2JgicgPT4gMjMwLAon8J2JgycgPT4gMjMwLAon8J2JhCcgPT4gMjMwLAon8J6AgCcgPT4gMjMwLAon8J6AgScgPT4gMjMwLAon8J6AgicgPT4gMjMwLAon8J6AgycgPT4gMjMwLAon8J6AhCcgPT4gMjMwLAon8J6AhScgPT4gMjMwLAon8J6AhicgPT4gMjMwLAon8J6AiCcgPT4gMjMwLAon8J6AiScgPT4gMjMwLAon8J6AiicgPT4gMjMwLAon8J6AiycgPT4gMjMwLAon8J6AjCcgPT4gMjMwLAon8J6AjScgPT4gMjMwLAon8J6AjicgPT4gMjMwLAon8J6AjycgPT4gMjMwLAon8J6AkCcgPT4gMjMwLAon8J6AkScgPT4gMjMwLAon8J6AkicgPT4gMjMwLAon8J6AkycgPT4gMjMwLAon8J6AlCcgPT4gMjMwLAon8J6AlScgPT4gMjMwLAon8J6AlicgPT4gMjMwLAon8J6AlycgPT4gMjMwLAon8J6AmCcgPT4gMjMwLAon8J6AmycgPT4gMjMwLAon8J6AnCcgPT4gMjMwLAon8J6AnScgPT4gMjMwLAon8J6AnicgPT4gMjMwLAon8J6AnycgPT4gMjMwLAon8J6AoCcgPT4gMjMwLAon8J6AoScgPT4gMjMwLAon8J6AoycgPT4gMjMwLAon8J6ApCcgPT4gMjMwLAon8J6ApicgPT4gMjMwLAon8J6ApycgPT4gMjMwLAon8J6AqCcgPT4gMjMwLAon8J6AqScgPT4gMjMwLAon8J6AqicgPT4gMjMwLAon8J6EsCcgPT4gMjMwLAon8J6EsScgPT4gMjMwLAon8J6EsicgPT4gMjMwLAon8J6EsycgPT4gMjMwLAon8J6EtCcgPT4gMjMwLAon8J6EtScgPT4gMjMwLAon8J6EticgPT4gMjMwLAon8J6LrCcgPT4gMjMwLAon8J6LrScgPT4gMjMwLAon8J6LricgPT4gMjMwLAon8J6LrycgPT4gMjMwLAon8J6jkCcgPT4gMjIwLAon8J6jkScgPT4gMjIwLAon8J6jkicgPT4gMjIwLAon8J6jkycgPT4gMjIwLAon8J6jlCcgPT4gMjIwLAon8J6jlScgPT4gMjIwLAon8J6jlicgPT4gMjIwLAon8J6lhCcgPT4gMjMwLAon8J6lhScgPT4gMjMwLAon8J6lhicgPT4gMjMwLAon8J6lhycgPT4gMjMwLAon8J6liCcgPT4gMjMwLAon8J6liScgPT4gMjMwLAon8J6liicgPT4gNywKKTsKPD9waHAKCnJldHVybiBhcnJheSAoCifCoCcgPT4gJyAnLAonwqgnID0+ICcgzIgnLAonwqonID0+ICdhJywKJ8KvJyA9PiAnIMyEJywKJ8KyJyA9PiAnMicsCifCsycgPT4gJzMnLAonwrQnID0+ICcgzIEnLAonwrUnID0+ICfOvCcsCifCuCcgPT4gJyDMpycsCifCuScgPT4gJzEnLAonwronID0+ICdvJywKJ8K8JyA9PiAnMeKBhDQnLAonwr0nID0+ICcx4oGEMicsCifCvicgPT4gJzPigYQ0JywKJ8SyJyA9PiAnSUonLAonxLMnID0+ICdpaicsCifEvycgPT4gJ0zCtycsCifFgCcgPT4gJ2zCtycsCifFiScgPT4gJ8q8bicsCifFvycgPT4gJ3MnLAonx4QnID0+ICdEWsyMJywKJ8eFJyA9PiAnRHrMjCcsCifHhicgPT4gJ2R6zIwnLAonx4cnID0+ICdMSicsCifHiCcgPT4gJ0xqJywKJ8eJJyA9PiAnbGonLAonx4onID0+ICdOSicsCifHiycgPT4gJ05qJywKJ8eMJyA9PiAnbmonLAonx7EnID0+ICdEWicsCifHsicgPT4gJ0R6JywKJ8ezJyA9PiAnZHonLAonyrAnID0+ICdoJywKJ8qxJyA9PiAnyaYnLAonyrInID0+ICdqJywKJ8qzJyA9PiAncicsCifKtCcgPT4gJ8m5JywKJ8q1JyA9PiAnybsnLAonyrYnID0+ICfKgScsCifKtycgPT4gJ3cnLAonyrgnID0+ICd5JywKJ8uYJyA9PiAnIMyGJywKJ8uZJyA9PiAnIMyHJywKJ8uaJyA9PiAnIMyKJywKJ8ubJyA9PiAnIMyoJywKJ8ucJyA9PiAnIMyDJywKJ8udJyA9PiAnIMyLJywKJ8ugJyA9PiAnyaMnLAony6EnID0+ICdsJywKJ8uiJyA9PiAncycsCifLoycgPT4gJ3gnLAony6QnID0+ICfKlScsCifNuicgPT4gJyDNhScsCifOhCcgPT4gJyDMgScsCifOhScgPT4gJyDMiMyBJywKJ8+QJyA9PiAnzrInLAonz5EnID0+ICfOuCcsCifPkicgPT4gJ86lJywKJ8+TJyA9PiAnzqXMgScsCifPlCcgPT4gJ86lzIgnLAonz5UnID0+ICfPhicsCifPlicgPT4gJ8+AJywKJ8+wJyA9PiAnzronLAonz7EnID0+ICfPgScsCifPsicgPT4gJ8+CJywKJ8+0JyA9PiAnzpgnLAonz7UnID0+ICfOtScsCifPuScgPT4gJ86jJywKJ9aHJyA9PiAn1aXWgicsCifZtScgPT4gJ9in2bQnLAon2bYnID0+ICfZiNm0JywKJ9m3JyA9PiAn24fZtCcsCifZuCcgPT4gJ9mK2bQnLAon4LizJyA9PiAn4LmN4LiyJywKJ+C6sycgPT4gJ+C7jeC6sicsCifgu5wnID0+ICfguqvgupknLAon4LudJyA9PiAn4Lqr4LqhJywKJ+C8jCcgPT4gJ+C8iycsCifgvbcnID0+ICfgvrLgvbHgvoAnLAon4L25JyA9PiAn4L6z4L2x4L6AJywKJ+GDvCcgPT4gJ+GDnCcsCifhtKwnID0+ICdBJywKJ+G0rScgPT4gJ8OGJywKJ+G0ricgPT4gJ0InLAon4bSwJyA9PiAnRCcsCifhtLEnID0+ICdFJywKJ+G0sicgPT4gJ8aOJywKJ+G0sycgPT4gJ0cnLAon4bS0JyA9PiAnSCcsCifhtLUnID0+ICdJJywKJ+G0ticgPT4gJ0onLAon4bS3JyA9PiAnSycsCifhtLgnID0+ICdMJywKJ+G0uScgPT4gJ00nLAon4bS6JyA9PiAnTicsCifhtLwnID0+ICdPJywKJ+G0vScgPT4gJ8iiJywKJ+G0vicgPT4gJ1AnLAon4bS/JyA9PiAnUicsCifhtYAnID0+ICdUJywKJ+G1gScgPT4gJ1UnLAon4bWCJyA9PiAnVycsCifhtYMnID0+ICdhJywKJ+G1hCcgPT4gJ8mQJywKJ+G1hScgPT4gJ8mRJywKJ+G1hicgPT4gJ+G0gicsCifhtYcnID0+ICdiJywKJ+G1iCcgPT4gJ2QnLAon4bWJJyA9PiAnZScsCifhtYonID0+ICfJmScsCifhtYsnID0+ICfJmycsCifhtYwnID0+ICfJnCcsCifhtY0nID0+ICdnJywKJ+G1jycgPT4gJ2snLAon4bWQJyA9PiAnbScsCifhtZEnID0+ICfFiycsCifhtZInID0+ICdvJywKJ+G1kycgPT4gJ8mUJywKJ+G1lCcgPT4gJ+G0licsCifhtZUnID0+ICfhtJcnLAon4bWWJyA9PiAncCcsCifhtZcnID0+ICd0JywKJ+G1mCcgPT4gJ3UnLAon4bWZJyA9PiAn4bSdJywKJ+G1micgPT4gJ8mvJywKJ+G1mycgPT4gJ3YnLAon4bWcJyA9PiAn4bSlJywKJ+G1nScgPT4gJ86yJywKJ+G1nicgPT4gJ86zJywKJ+G1nycgPT4gJ860JywKJ+G1oCcgPT4gJ8+GJywKJ+G1oScgPT4gJ8+HJywKJ+G1oicgPT4gJ2knLAon4bWjJyA9PiAncicsCifhtaQnID0+ICd1JywKJ+G1pScgPT4gJ3YnLAon4bWmJyA9PiAnzrInLAon4bWnJyA9PiAnzrMnLAon4bWoJyA9PiAnz4EnLAon4bWpJyA9PiAnz4YnLAon4bWqJyA9PiAnz4cnLAon4bW4JyA9PiAn0L0nLAon4babJyA9PiAnyZInLAon4bacJyA9PiAnYycsCifhtp0nID0+ICfJlScsCifhtp4nID0+ICfDsCcsCifhtp8nID0+ICfJnCcsCifhtqAnID0+ICdmJywKJ+G2oScgPT4gJ8mfJywKJ+G2oicgPT4gJ8mhJywKJ+G2oycgPT4gJ8mlJywKJ+G2pCcgPT4gJ8moJywKJ+G2pScgPT4gJ8mpJywKJ+G2picgPT4gJ8mqJywKJ+G2pycgPT4gJ+G1uycsCifhtqgnID0+ICfKnScsCifhtqknID0+ICfJrScsCifhtqonID0+ICfhtoUnLAon4barJyA9PiAnyp8nLAon4basJyA9PiAnybEnLAon4batJyA9PiAnybAnLAon4bauJyA9PiAnybInLAon4bavJyA9PiAnybMnLAon4bawJyA9PiAnybQnLAon4baxJyA9PiAnybUnLAon4bayJyA9PiAnybgnLAon4bazJyA9PiAnyoInLAon4ba0JyA9PiAnyoMnLAon4ba1JyA9PiAnxqsnLAon4ba2JyA9PiAnyoknLAon4ba3JyA9PiAnyoonLAon4ba4JyA9PiAn4bScJywKJ+G2uScgPT4gJ8qLJywKJ+G2uicgPT4gJ8qMJywKJ+G2uycgPT4gJ3onLAon4ba8JyA9PiAnypAnLAon4ba9JyA9PiAnypEnLAon4ba+JyA9PiAnypInLAon4ba/JyA9PiAnzrgnLAon4bqaJyA9PiAnYcq+JywKJ+G6mycgPT4gJ3PMhycsCifhvr0nID0+ICcgzJMnLAon4b6/JyA9PiAnIMyTJywKJ+G/gCcgPT4gJyDNgicsCifhv4EnID0+ICcgzIjNgicsCifhv40nID0+ICcgzJPMgCcsCifhv44nID0+ICcgzJPMgScsCifhv48nID0+ICcgzJPNgicsCifhv50nID0+ICcgzJTMgCcsCifhv54nID0+ICcgzJTMgScsCifhv58nID0+ICcgzJTNgicsCifhv60nID0+ICcgzIjMgCcsCifhv64nID0+ICcgzIjMgScsCifhv70nID0+ICcgzIEnLAon4b++JyA9PiAnIMyUJywKJ+KAgCcgPT4gJyAnLAon4oCBJyA9PiAnICcsCifigIInID0+ICcgJywKJ+KAgycgPT4gJyAnLAon4oCEJyA9PiAnICcsCifigIUnID0+ICcgJywKJ+KAhicgPT4gJyAnLAon4oCHJyA9PiAnICcsCifigIgnID0+ICcgJywKJ+KAiScgPT4gJyAnLAon4oCKJyA9PiAnICcsCifigJEnID0+ICfigJAnLAon4oCXJyA9PiAnIMyzJywKJ+KApCcgPT4gJy4nLAon4oClJyA9PiAnLi4nLAon4oCmJyA9PiAnLi4uJywKJ+KArycgPT4gJyAnLAon4oCzJyA9PiAn4oCy4oCyJywKJ+KAtCcgPT4gJ+KAsuKAsuKAsicsCifigLYnID0+ICfigLXigLUnLAon4oC3JyA9PiAn4oC14oC14oC1JywKJ+KAvCcgPT4gJyEhJywKJ+KAvicgPT4gJyDMhScsCifigYcnID0+ICc/PycsCifigYgnID0+ICc/IScsCifigYknID0+ICchPycsCifigZcnID0+ICfigLLigLLigLLigLInLAon4oGfJyA9PiAnICcsCifigbAnID0+ICcwJywKJ+KBsScgPT4gJ2knLAon4oG0JyA9PiAnNCcsCifigbUnID0+ICc1JywKJ+KBticgPT4gJzYnLAon4oG3JyA9PiAnNycsCifigbgnID0+ICc4JywKJ+KBuScgPT4gJzknLAon4oG6JyA9PiAnKycsCifigbsnID0+ICfiiJInLAon4oG8JyA9PiAnPScsCifigb0nID0+ICcoJywKJ+KBvicgPT4gJyknLAon4oG/JyA9PiAnbicsCifigoAnID0+ICcwJywKJ+KCgScgPT4gJzEnLAon4oKCJyA9PiAnMicsCifigoMnID0+ICczJywKJ+KChCcgPT4gJzQnLAon4oKFJyA9PiAnNScsCifigoYnID0+ICc2JywKJ+KChycgPT4gJzcnLAon4oKIJyA9PiAnOCcsCifigoknID0+ICc5JywKJ+KCiicgPT4gJysnLAon4oKLJyA9PiAn4oiSJywKJ+KCjCcgPT4gJz0nLAon4oKNJyA9PiAnKCcsCifigo4nID0+ICcpJywKJ+KCkCcgPT4gJ2EnLAon4oKRJyA9PiAnZScsCifigpInID0+ICdvJywKJ+KCkycgPT4gJ3gnLAon4oKUJyA9PiAnyZknLAon4oKVJyA9PiAnaCcsCifigpYnID0+ICdrJywKJ+KClycgPT4gJ2wnLAon4oKYJyA9PiAnbScsCifigpknID0+ICduJywKJ+KCmicgPT4gJ3AnLAon4oKbJyA9PiAncycsCifigpwnID0+ICd0JywKJ+KCqCcgPT4gJ1JzJywKJ+KEgCcgPT4gJ2EvYycsCifihIEnID0+ICdhL3MnLAon4oSCJyA9PiAnQycsCifihIMnID0+ICfCsEMnLAon4oSFJyA9PiAnYy9vJywKJ+KEhicgPT4gJ2MvdScsCifihIcnID0+ICfGkCcsCifihIknID0+ICfCsEYnLAon4oSKJyA9PiAnZycsCifihIsnID0+ICdIJywKJ+KEjCcgPT4gJ0gnLAon4oSNJyA9PiAnSCcsCifihI4nID0+ICdoJywKJ+KEjycgPT4gJ8SnJywKJ+KEkCcgPT4gJ0knLAon4oSRJyA9PiAnSScsCifihJInID0+ICdMJywKJ+KEkycgPT4gJ2wnLAon4oSVJyA9PiAnTicsCifihJYnID0+ICdObycsCifihJknID0+ICdQJywKJ+KEmicgPT4gJ1EnLAon4oSbJyA9PiAnUicsCifihJwnID0+ICdSJywKJ+KEnScgPT4gJ1InLAon4oSgJyA9PiAnU00nLAon4oShJyA9PiAnVEVMJywKJ+KEoicgPT4gJ1RNJywKJ+KEpCcgPT4gJ1onLAon4oSoJyA9PiAnWicsCifihKwnID0+ICdCJywKJ+KErScgPT4gJ0MnLAon4oSvJyA9PiAnZScsCifihLAnID0+ICdFJywKJ+KEsScgPT4gJ0YnLAon4oSzJyA9PiAnTScsCifihLQnID0+ICdvJywKJ+KEtScgPT4gJ9eQJywKJ+KEticgPT4gJ9eRJywKJ+KEtycgPT4gJ9eSJywKJ+KEuCcgPT4gJ9eTJywKJ+KEuScgPT4gJ2knLAon4oS7JyA9PiAnRkFYJywKJ+KEvCcgPT4gJ8+AJywKJ+KEvScgPT4gJ86zJywKJ+KEvicgPT4gJ86TJywKJ+KEvycgPT4gJ86gJywKJ+KFgCcgPT4gJ+KIkScsCifihYUnID0+ICdEJywKJ+KFhicgPT4gJ2QnLAon4oWHJyA9PiAnZScsCifihYgnID0+ICdpJywKJ+KFiScgPT4gJ2onLAon4oWQJyA9PiAnMeKBhDcnLAon4oWRJyA9PiAnMeKBhDknLAon4oWSJyA9PiAnMeKBhDEwJywKJ+KFkycgPT4gJzHigYQzJywKJ+KFlCcgPT4gJzLigYQzJywKJ+KFlScgPT4gJzHigYQ1JywKJ+KFlicgPT4gJzLigYQ1JywKJ+KFlycgPT4gJzPigYQ1JywKJ+KFmCcgPT4gJzTigYQ1JywKJ+KFmScgPT4gJzHigYQ2JywKJ+KFmicgPT4gJzXigYQ2JywKJ+KFmycgPT4gJzHigYQ4JywKJ+KFnCcgPT4gJzPigYQ4JywKJ+KFnScgPT4gJzXigYQ4JywKJ+KFnicgPT4gJzfigYQ4JywKJ+KFnycgPT4gJzHigYQnLAon4oWgJyA9PiAnSScsCifihaEnID0+ICdJSScsCifihaInID0+ICdJSUknLAon4oWjJyA9PiAnSVYnLAon4oWkJyA9PiAnVicsCifihaUnID0+ICdWSScsCifihaYnID0+ICdWSUknLAon4oWnJyA9PiAnVklJSScsCifihagnID0+ICdJWCcsCifihaknID0+ICdYJywKJ+KFqicgPT4gJ1hJJywKJ+KFqycgPT4gJ1hJSScsCifihawnID0+ICdMJywKJ+KFrScgPT4gJ0MnLAon4oWuJyA9PiAnRCcsCifiha8nID0+ICdNJywKJ+KFsCcgPT4gJ2knLAon4oWxJyA9PiAnaWknLAon4oWyJyA9PiAnaWlpJywKJ+KFsycgPT4gJ2l2JywKJ+KFtCcgPT4gJ3YnLAon4oW1JyA9PiAndmknLAon4oW2JyA9PiAndmlpJywKJ+KFtycgPT4gJ3ZpaWknLAon4oW4JyA9PiAnaXgnLAon4oW5JyA9PiAneCcsCifihbonID0+ICd4aScsCifihbsnID0+ICd4aWknLAon4oW8JyA9PiAnbCcsCifihb0nID0+ICdjJywKJ+KFvicgPT4gJ2QnLAon4oW/JyA9PiAnbScsCifihoknID0+ICcw4oGEMycsCifiiKwnID0+ICfiiKviiKsnLAon4oitJyA9PiAn4oir4oir4oirJywKJ+KIrycgPT4gJ+KIruKIricsCifiiLAnID0+ICfiiK7iiK7iiK4nLAon4pGgJyA9PiAnMScsCifikaEnID0+ICcyJywKJ+KRoicgPT4gJzMnLAon4pGjJyA9PiAnNCcsCifikaQnID0+ICc1JywKJ+KRpScgPT4gJzYnLAon4pGmJyA9PiAnNycsCifikacnID0+ICc4JywKJ+KRqCcgPT4gJzknLAon4pGpJyA9PiAnMTAnLAon4pGqJyA9PiAnMTEnLAon4pGrJyA9PiAnMTInLAon4pGsJyA9PiAnMTMnLAon4pGtJyA9PiAnMTQnLAon4pGuJyA9PiAnMTUnLAon4pGvJyA9PiAnMTYnLAon4pGwJyA9PiAnMTcnLAon4pGxJyA9PiAnMTgnLAon4pGyJyA9PiAnMTknLAon4pGzJyA9PiAnMjAnLAon4pG0JyA9PiAnKDEpJywKJ+KRtScgPT4gJygyKScsCifikbYnID0+ICcoMyknLAon4pG3JyA9PiAnKDQpJywKJ+KRuCcgPT4gJyg1KScsCifikbknID0+ICcoNiknLAon4pG6JyA9PiAnKDcpJywKJ+KRuycgPT4gJyg4KScsCifikbwnID0+ICcoOSknLAon4pG9JyA9PiAnKDEwKScsCifikb4nID0+ICcoMTEpJywKJ+KRvycgPT4gJygxMiknLAon4pKAJyA9PiAnKDEzKScsCifikoEnID0+ICcoMTQpJywKJ+KSgicgPT4gJygxNSknLAon4pKDJyA9PiAnKDE2KScsCifikoQnID0+ICcoMTcpJywKJ+KShScgPT4gJygxOCknLAon4pKGJyA9PiAnKDE5KScsCifikocnID0+ICcoMjApJywKJ+KSiCcgPT4gJzEuJywKJ+KSiScgPT4gJzIuJywKJ+KSiicgPT4gJzMuJywKJ+KSiycgPT4gJzQuJywKJ+KSjCcgPT4gJzUuJywKJ+KSjScgPT4gJzYuJywKJ+KSjicgPT4gJzcuJywKJ+KSjycgPT4gJzguJywKJ+KSkCcgPT4gJzkuJywKJ+KSkScgPT4gJzEwLicsCifikpInID0+ICcxMS4nLAon4pKTJyA9PiAnMTIuJywKJ+KSlCcgPT4gJzEzLicsCifikpUnID0+ICcxNC4nLAon4pKWJyA9PiAnMTUuJywKJ+KSlycgPT4gJzE2LicsCifikpgnID0+ICcxNy4nLAon4pKZJyA9PiAnMTguJywKJ+KSmicgPT4gJzE5LicsCifikpsnID0+ICcyMC4nLAon4pKcJyA9PiAnKGEpJywKJ+KSnScgPT4gJyhiKScsCifikp4nID0+ICcoYyknLAon4pKfJyA9PiAnKGQpJywKJ+KSoCcgPT4gJyhlKScsCifikqEnID0+ICcoZiknLAon4pKiJyA9PiAnKGcpJywKJ+KSoycgPT4gJyhoKScsCifikqQnID0+ICcoaSknLAon4pKlJyA9PiAnKGopJywKJ+KSpicgPT4gJyhrKScsCifikqcnID0+ICcobCknLAon4pKoJyA9PiAnKG0pJywKJ+KSqScgPT4gJyhuKScsCifikqonID0+ICcobyknLAon4pKrJyA9PiAnKHApJywKJ+KSrCcgPT4gJyhxKScsCifikq0nID0+ICcociknLAon4pKuJyA9PiAnKHMpJywKJ+KSrycgPT4gJyh0KScsCifikrAnID0+ICcodSknLAon4pKxJyA9PiAnKHYpJywKJ+KSsicgPT4gJyh3KScsCifikrMnID0+ICcoeCknLAon4pK0JyA9PiAnKHkpJywKJ+KStScgPT4gJyh6KScsCifikrYnID0+ICdBJywKJ+KStycgPT4gJ0InLAon4pK4JyA9PiAnQycsCifikrknID0+ICdEJywKJ+KSuicgPT4gJ0UnLAon4pK7JyA9PiAnRicsCifikrwnID0+ICdHJywKJ+KSvScgPT4gJ0gnLAon4pK+JyA9PiAnSScsCifikr8nID0+ICdKJywKJ+KTgCcgPT4gJ0snLAon4pOBJyA9PiAnTCcsCifik4InID0+ICdNJywKJ+KTgycgPT4gJ04nLAon4pOEJyA9PiAnTycsCifik4UnID0+ICdQJywKJ+KThicgPT4gJ1EnLAon4pOHJyA9PiAnUicsCifik4gnID0+ICdTJywKJ+KTiScgPT4gJ1QnLAon4pOKJyA9PiAnVScsCifik4snID0+ICdWJywKJ+KTjCcgPT4gJ1cnLAon4pONJyA9PiAnWCcsCifik44nID0+ICdZJywKJ+KTjycgPT4gJ1onLAon4pOQJyA9PiAnYScsCifik5EnID0+ICdiJywKJ+KTkicgPT4gJ2MnLAon4pOTJyA9PiAnZCcsCifik5QnID0+ICdlJywKJ+KTlScgPT4gJ2YnLAon4pOWJyA9PiAnZycsCifik5cnID0+ICdoJywKJ+KTmCcgPT4gJ2knLAon4pOZJyA9PiAnaicsCifik5onID0+ICdrJywKJ+KTmycgPT4gJ2wnLAon4pOcJyA9PiAnbScsCifik50nID0+ICduJywKJ+KTnicgPT4gJ28nLAon4pOfJyA9PiAncCcsCifik6AnID0+ICdxJywKJ+KToScgPT4gJ3InLAon4pOiJyA9PiAncycsCifik6MnID0+ICd0JywKJ+KTpCcgPT4gJ3UnLAon4pOlJyA9PiAndicsCifik6YnID0+ICd3JywKJ+KTpycgPT4gJ3gnLAon4pOoJyA9PiAneScsCifik6knID0+ICd6JywKJ+KTqicgPT4gJzAnLAon4qiMJyA9PiAn4oir4oir4oir4oirJywKJ+KptCcgPT4gJzo6PScsCifiqbUnID0+ICc9PScsCifiqbYnID0+ICc9PT0nLAon4rG8JyA9PiAnaicsCifisb0nID0+ICdWJywKJ+K1rycgPT4gJ+K1oScsCifiup8nID0+ICfmr40nLAon4ruzJyA9PiAn6b6fJywKJ+K8gCcgPT4gJ+S4gCcsCifivIEnID0+ICfkuKgnLAon4ryCJyA9PiAn5Li2JywKJ+K8gycgPT4gJ+S4vycsCifivIQnID0+ICfkuZknLAon4ryFJyA9PiAn5LqFJywKJ+K8hicgPT4gJ+S6jCcsCifivIcnID0+ICfkuqAnLAon4ryIJyA9PiAn5Lq6JywKJ+K8iScgPT4gJ+WEvycsCifivIonID0+ICflhaUnLAon4ryLJyA9PiAn5YWrJywKJ+K8jCcgPT4gJ+WGgicsCifivI0nID0+ICflhpYnLAon4ryOJyA9PiAn5YarJywKJ+K8jycgPT4gJ+WHoCcsCifivJAnID0+ICflh7UnLAon4ryRJyA9PiAn5YiAJywKJ+K8kicgPT4gJ+WKmycsCifivJMnID0+ICfli7knLAon4ryUJyA9PiAn5YyVJywKJ+K8lScgPT4gJ+WMmicsCifivJYnID0+ICfljLgnLAon4ryXJyA9PiAn5Y2BJywKJ+K8mCcgPT4gJ+WNnCcsCifivJknID0+ICfljaknLAon4ryaJyA9PiAn5Y6CJywKJ+K8mycgPT4gJ+WOticsCifivJwnID0+ICflj4gnLAon4rydJyA9PiAn5Y+jJywKJ+K8nicgPT4gJ+WblycsCifivJ8nID0+ICflnJ8nLAon4rygJyA9PiAn5aOrJywKJ+K8oScgPT4gJ+WkgicsCifivKInID0+ICflpIonLAon4ryjJyA9PiAn5aSVJywKJ+K8pCcgPT4gJ+WkpycsCifivKUnID0+ICflpbMnLAon4rymJyA9PiAn5a2QJywKJ+K8pycgPT4gJ+WugCcsCifivKgnID0+ICflr7gnLAon4rypJyA9PiAn5bCPJywKJ+K8qicgPT4gJ+WwoicsCifivKsnID0+ICflsLgnLAon4rysJyA9PiAn5bGuJywKJ+K8rScgPT4gJ+WxsScsCifivK4nID0+ICflt5snLAon4ryvJyA9PiAn5belJywKJ+K8sCcgPT4gJ+W3sScsCifivLEnID0+ICflt74nLAon4ryyJyA9PiAn5bmyJywKJ+K8sycgPT4gJ+W5uicsCifivLQnID0+ICflub8nLAon4ry1JyA9PiAn5bu0JywKJ+K8ticgPT4gJ+W7vicsCifivLcnID0+ICflvIsnLAon4ry4JyA9PiAn5byTJywKJ+K8uScgPT4gJ+W9kCcsCifivLonID0+ICflvaEnLAon4ry7JyA9PiAn5b2zJywKJ+K8vCcgPT4gJ+W/gycsCifivL0nID0+ICfmiIgnLAon4ry+JyA9PiAn5oi2JywKJ+K8vycgPT4gJ+aJiycsCifivYAnID0+ICfmlK8nLAon4r2BJyA9PiAn5pS0JywKJ+K9gicgPT4gJ+aWhycsCifivYMnID0+ICfmlpcnLAon4r2EJyA9PiAn5pakJywKJ+K9hScgPT4gJ+aWuScsCifivYYnID0+ICfml6AnLAon4r2HJyA9PiAn5pelJywKJ+K9iCcgPT4gJ+absCcsCifivYknID0+ICfmnIgnLAon4r2KJyA9PiAn5pyoJywKJ+K9iycgPT4gJ+asoCcsCifivYwnID0+ICfmraInLAon4r2NJyA9PiAn5q25JywKJ+K9jicgPT4gJ+ausycsCifivY8nID0+ICfmr4snLAon4r2QJyA9PiAn5q+UJywKJ+K9kScgPT4gJ+avmycsCifivZInID0+ICfmsI8nLAon4r2TJyA9PiAn5rCUJywKJ+K9lCcgPT4gJ+awtCcsCifivZUnID0+ICfngasnLAon4r2WJyA9PiAn54iqJywKJ+K9lycgPT4gJ+eIticsCifivZgnID0+ICfniLsnLAon4r2ZJyA9PiAn54i/JywKJ+K9micgPT4gJ+eJhycsCifivZsnID0+ICfniZknLAon4r2cJyA9PiAn54mbJywKJ+K9nScgPT4gJ+eKrCcsCifivZ4nID0+ICfnjoQnLAon4r2fJyA9PiAn546JJywKJ+K9oCcgPT4gJ+eTnCcsCifivaEnID0+ICfnk6YnLAon4r2iJyA9PiAn55SYJywKJ+K9oycgPT4gJ+eUnycsCifivaQnID0+ICfnlKgnLAon4r2lJyA9PiAn55SwJywKJ+K9picgPT4gJ+eWiycsCifivacnID0+ICfnlpInLAon4r2oJyA9PiAn55m2JywKJ+K9qScgPT4gJ+eZvScsCifivaonID0+ICfnmq4nLAon4r2rJyA9PiAn55q/JywKJ+K9rCcgPT4gJ+ebricsCifiva0nID0+ICfnn5snLAon4r2uJyA9PiAn55+iJywKJ+K9rycgPT4gJ+efsycsCifivbAnID0+ICfnpLonLAon4r2xJyA9PiAn56a4JywKJ+K9sicgPT4gJ+emvicsCifivbMnID0+ICfnqbQnLAon4r20JyA9PiAn56uLJywKJ+K9tScgPT4gJ+eruScsCifivbYnID0+ICfnsbMnLAon4r23JyA9PiAn57O4JywKJ+K9uCcgPT4gJ+e8ticsCifivbknID0+ICfnvZEnLAon4r26JyA9PiAn576KJywKJ+K9uycgPT4gJ+e+vScsCifivbwnID0+ICfogIEnLAon4r29JyA9PiAn6ICMJywKJ+K9vicgPT4gJ+iAkicsCifivb8nID0+ICfogLMnLAon4r6AJyA9PiAn6IG/JywKJ+K+gScgPT4gJ+iCiScsCifivoInID0+ICfoh6MnLAon4r6DJyA9PiAn6IeqJywKJ+K+hCcgPT4gJ+iHsycsCifivoUnID0+ICfoh7wnLAon4r6GJyA9PiAn6IiMJywKJ+K+hycgPT4gJ+iImycsCifivognID0+ICfoiJ8nLAon4r6JJyA9PiAn6ImuJywKJ+K+iicgPT4gJ+iJsicsCifivosnID0+ICfoibgnLAon4r6MJyA9PiAn6JmNJywKJ+K+jScgPT4gJ+iZqycsCifivo4nID0+ICfooYAnLAon4r6PJyA9PiAn6KGMJywKJ+K+kCcgPT4gJ+ihoycsCifivpEnID0+ICfopb4nLAon4r6SJyA9PiAn6KaLJywKJ+K+kycgPT4gJ+inkicsCifivpQnID0+ICfoqIAnLAon4r6VJyA9PiAn6LC3JywKJ+K+licgPT4gJ+ixhicsCifivpcnID0+ICfosZUnLAon4r6YJyA9PiAn6LG4JywKJ+K+mScgPT4gJ+iynScsCifivponID0+ICfotaQnLAon4r6bJyA9PiAn6LWwJywKJ+K+nCcgPT4gJ+i2sycsCifivp0nID0+ICfouqsnLAon4r6eJyA9PiAn6LuKJywKJ+K+nycgPT4gJ+i+mycsCifivqAnID0+ICfovrAnLAon4r6hJyA9PiAn6L61JywKJ+K+oicgPT4gJ+mCkScsCifivqMnID0+ICfphYknLAon4r6kJyA9PiAn6YeGJywKJ+K+pScgPT4gJ+mHjCcsCifivqYnID0+ICfph5EnLAon4r6nJyA9PiAn6ZW3JywKJ+K+qCcgPT4gJ+mWgCcsCifivqknID0+ICfpmJwnLAon4r6qJyA9PiAn6Zq2JywKJ+K+qycgPT4gJ+mauScsCifivqwnID0+ICfpm6gnLAon4r6tJyA9PiAn6Z2RJywKJ+K+ricgPT4gJ+mdnicsCifivq8nID0+ICfpnaInLAon4r6wJyA9PiAn6Z2pJywKJ+K+sScgPT4gJ+mfiycsCifivrInID0+ICfpn60nLAon4r6zJyA9PiAn6Z+zJywKJ+K+tCcgPT4gJ+mggScsCifivrUnID0+ICfpoqgnLAon4r62JyA9PiAn6aObJywKJ+K+tycgPT4gJ+mjnycsCifivrgnID0+ICfpppYnLAon4r65JyA9PiAn6aaZJywKJ+K+uicgPT4gJ+mmrCcsCifivrsnID0+ICfpqqgnLAon4r68JyA9PiAn6auYJywKJ+K+vScgPT4gJ+mrnycsCifivr4nID0+ICfprKUnLAon4r6/JyA9PiAn6ayvJywKJ+K/gCcgPT4gJ+mssicsCifiv4EnID0+ICfprLwnLAon4r+CJyA9PiAn6a2aJywKJ+K/gycgPT4gJ+mzpScsCifiv4QnID0+ICfpubUnLAon4r+FJyA9PiAn6bm/JywKJ+K/hicgPT4gJ+m6pScsCifiv4cnID0+ICfpursnLAon4r+IJyA9PiAn6buDJywKJ+K/iScgPT4gJ+m7jScsCifiv4onID0+ICfpu5EnLAon4r+LJyA9PiAn6bu5JywKJ+K/jCcgPT4gJ+m7vScsCifiv40nID0+ICfpvI4nLAon4r+OJyA9PiAn6byTJywKJ+K/jycgPT4gJ+m8oCcsCifiv5AnID0+ICfpvLsnLAon4r+RJyA9PiAn6b2KJywKJ+K/kicgPT4gJ+m9kicsCifiv5MnID0+ICfpvo0nLAon4r+UJyA9PiAn6b6cJywKJ+K/lScgPT4gJ+m+oCcsCifjgIAnID0+ICcgJywKJ+OAticgPT4gJ+OAkicsCifjgLgnID0+ICfljYEnLAon44C5JyA9PiAn5Y2EJywKJ+OAuicgPT4gJ+WNhScsCifjgpsnID0+ICcg44KZJywKJ+OCnCcgPT4gJyDjgponLAon44KfJyA9PiAn44KI44KKJywKJ+ODvycgPT4gJ+OCs+ODiCcsCifjhLEnID0+ICfhhIAnLAon44SyJyA9PiAn4YSBJywKJ+OEsycgPT4gJ+GGqicsCifjhLQnID0+ICfhhIInLAon44S1JyA9PiAn4YasJywKJ+OEticgPT4gJ+GGrScsCifjhLcnID0+ICfhhIMnLAon44S4JyA9PiAn4YSEJywKJ+OEuScgPT4gJ+GEhScsCifjhLonID0+ICfhhrAnLAon44S7JyA9PiAn4YaxJywKJ+OEvCcgPT4gJ+GGsicsCifjhL0nID0+ICfhhrMnLAon44S+JyA9PiAn4Ya0JywKJ+OEvycgPT4gJ+GGtScsCifjhYAnID0+ICfhhJonLAon44WBJyA9PiAn4YSGJywKJ+OFgicgPT4gJ+GEhycsCifjhYMnID0+ICfhhIgnLAon44WEJyA9PiAn4YShJywKJ+OFhScgPT4gJ+GEiScsCifjhYYnID0+ICfhhIonLAon44WHJyA9PiAn4YSLJywKJ+OFiCcgPT4gJ+GEjCcsCifjhYknID0+ICfhhI0nLAon44WKJyA9PiAn4YSOJywKJ+OFiycgPT4gJ+GEjycsCifjhYwnID0+ICfhhJAnLAon44WNJyA9PiAn4YSRJywKJ+OFjicgPT4gJ+GEkicsCifjhY8nID0+ICfhhaEnLAon44WQJyA9PiAn4YWiJywKJ+OFkScgPT4gJ+GFoycsCifjhZInID0+ICfhhaQnLAon44WTJyA9PiAn4YWlJywKJ+OFlCcgPT4gJ+GFpicsCifjhZUnID0+ICfhhacnLAon44WWJyA9PiAn4YWoJywKJ+OFlycgPT4gJ+GFqScsCifjhZgnID0+ICfhhaonLAon44WZJyA9PiAn4YWrJywKJ+OFmicgPT4gJ+GFrCcsCifjhZsnID0+ICfhha0nLAon44WcJyA9PiAn4YWuJywKJ+OFnScgPT4gJ+GFrycsCifjhZ4nID0+ICfhhbAnLAon44WfJyA9PiAn4YWxJywKJ+OFoCcgPT4gJ+GFsicsCifjhaEnID0+ICfhhbMnLAon44WiJyA9PiAn4YW0JywKJ+OFoycgPT4gJ+GFtScsCifjhaQnID0+ICfhhaAnLAon44WlJyA9PiAn4YSUJywKJ+OFpicgPT4gJ+GElScsCifjhacnID0+ICfhh4cnLAon44WoJyA9PiAn4YeIJywKJ+OFqScgPT4gJ+GHjCcsCifjhaonID0+ICfhh44nLAon44WrJyA9PiAn4YeTJywKJ+OFrCcgPT4gJ+GHlycsCifjha0nID0+ICfhh5knLAon44WuJyA9PiAn4YScJywKJ+OFrycgPT4gJ+GHnScsCifjhbAnID0+ICfhh58nLAon44WxJyA9PiAn4YSdJywKJ+OFsicgPT4gJ+GEnicsCifjhbMnID0+ICfhhKAnLAon44W0JyA9PiAn4YSiJywKJ+OFtScgPT4gJ+GEoycsCifjhbYnID0+ICfhhKcnLAon44W3JyA9PiAn4YSpJywKJ+OFuCcgPT4gJ+GEqycsCifjhbknID0+ICfhhKwnLAon44W6JyA9PiAn4YStJywKJ+OFuycgPT4gJ+GEricsCifjhbwnID0+ICfhhK8nLAon44W9JyA9PiAn4YSyJywKJ+OFvicgPT4gJ+GEticsCifjhb8nID0+ICfhhYAnLAon44aAJyA9PiAn4YWHJywKJ+OGgScgPT4gJ+GFjCcsCifjhoInID0+ICfhh7EnLAon44aDJyA9PiAn4YeyJywKJ+OGhCcgPT4gJ+GFlycsCifjhoUnID0+ICfhhZgnLAon44aGJyA9PiAn4YWZJywKJ+OGhycgPT4gJ+GGhCcsCifjhognID0+ICfhhoUnLAon44aJJyA9PiAn4YaIJywKJ+OGiicgPT4gJ+GGkScsCifjhosnID0+ICfhhpInLAon44aMJyA9PiAn4YaUJywKJ+OGjScgPT4gJ+GGnicsCifjho4nID0+ICfhhqEnLAon44aSJyA9PiAn5LiAJywKJ+OGkycgPT4gJ+S6jCcsCifjhpQnID0+ICfkuIknLAon44aVJyA9PiAn5ZubJywKJ+OGlicgPT4gJ+S4iicsCifjhpcnID0+ICfkuK0nLAon44aYJyA9PiAn5LiLJywKJ+OGmScgPT4gJ+eUsicsCifjhponID0+ICfkuZknLAon44abJyA9PiAn5LiZJywKJ+OGnCcgPT4gJ+S4gScsCifjhp0nID0+ICflpKknLAon44aeJyA9PiAn5ZywJywKJ+OGnycgPT4gJ+S6uicsCifjiIAnID0+ICco4YSAKScsCifjiIEnID0+ICco4YSCKScsCifjiIInID0+ICco4YSDKScsCifjiIMnID0+ICco4YSFKScsCifjiIQnID0+ICco4YSGKScsCifjiIUnID0+ICco4YSHKScsCifjiIYnID0+ICco4YSJKScsCifjiIcnID0+ICco4YSLKScsCifjiIgnID0+ICco4YSMKScsCifjiIknID0+ICco4YSOKScsCifjiIonID0+ICco4YSPKScsCifjiIsnID0+ICco4YSQKScsCifjiIwnID0+ICco4YSRKScsCifjiI0nID0+ICco4YSSKScsCifjiI4nID0+ICco4YSA4YWhKScsCifjiI8nID0+ICco4YSC4YWhKScsCifjiJAnID0+ICco4YSD4YWhKScsCifjiJEnID0+ICco4YSF4YWhKScsCifjiJInID0+ICco4YSG4YWhKScsCifjiJMnID0+ICco4YSH4YWhKScsCifjiJQnID0+ICco4YSJ4YWhKScsCifjiJUnID0+ICco4YSL4YWhKScsCifjiJYnID0+ICco4YSM4YWhKScsCifjiJcnID0+ICco4YSO4YWhKScsCifjiJgnID0+ICco4YSP4YWhKScsCifjiJknID0+ICco4YSQ4YWhKScsCifjiJonID0+ICco4YSR4YWhKScsCifjiJsnID0+ICco4YSS4YWhKScsCifjiJwnID0+ICco4YSM4YWuKScsCifjiJ0nID0+ICco4YSL4YWp4YSM4YWl4YarKScsCifjiJ4nID0+ICco4YSL4YWp4YSS4YWuKScsCifjiKAnID0+ICco5LiAKScsCifjiKEnID0+ICco5LqMKScsCifjiKInID0+ICco5LiJKScsCifjiKMnID0+ICco5ZubKScsCifjiKQnID0+ICco5LqUKScsCifjiKUnID0+ICco5YWtKScsCifjiKYnID0+ICco5LiDKScsCifjiKcnID0+ICco5YWrKScsCifjiKgnID0+ICco5LmdKScsCifjiKknID0+ICco5Y2BKScsCifjiKonID0+ICco5pyIKScsCifjiKsnID0+ICco54GrKScsCifjiKwnID0+ICco5rC0KScsCifjiK0nID0+ICco5pyoKScsCifjiK4nID0+ICco6YeRKScsCifjiK8nID0+ICco5ZyfKScsCifjiLAnID0+ICco5pelKScsCifjiLEnID0+ICco5qCqKScsCifjiLInID0+ICco5pyJKScsCifjiLMnID0+ICco56S+KScsCifjiLQnID0+ICco5ZCNKScsCifjiLUnID0+ICco54m5KScsCifjiLYnID0+ICco6LKhKScsCifjiLcnID0+ICco56WdKScsCifjiLgnID0+ICco5Yq0KScsCifjiLknID0+ICco5LujKScsCifjiLonID0+ICco5ZG8KScsCifjiLsnID0+ICco5a2mKScsCifjiLwnID0+ICco55ujKScsCifjiL0nID0+ICco5LyBKScsCifjiL4nID0+ICco6LOHKScsCifjiL8nID0+ICco5Y2UKScsCifjiYAnID0+ICco56WtKScsCifjiYEnID0+ICco5LyRKScsCifjiYInID0+ICco6IeqKScsCifjiYMnID0+ICco6IezKScsCifjiYQnID0+ICfllY8nLAon44mFJyA9PiAn5bm8JywKJ+OJhicgPT4gJ+aWhycsCifjiYcnID0+ICfnro8nLAon44mQJyA9PiAnUFRFJywKJ+OJkScgPT4gJzIxJywKJ+OJkicgPT4gJzIyJywKJ+OJkycgPT4gJzIzJywKJ+OJlCcgPT4gJzI0JywKJ+OJlScgPT4gJzI1JywKJ+OJlicgPT4gJzI2JywKJ+OJlycgPT4gJzI3JywKJ+OJmCcgPT4gJzI4JywKJ+OJmScgPT4gJzI5JywKJ+OJmicgPT4gJzMwJywKJ+OJmycgPT4gJzMxJywKJ+OJnCcgPT4gJzMyJywKJ+OJnScgPT4gJzMzJywKJ+OJnicgPT4gJzM0JywKJ+OJnycgPT4gJzM1JywKJ+OJoCcgPT4gJ+GEgCcsCifjiaEnID0+ICfhhIInLAon44miJyA9PiAn4YSDJywKJ+OJoycgPT4gJ+GEhScsCifjiaQnID0+ICfhhIYnLAon44mlJyA9PiAn4YSHJywKJ+OJpicgPT4gJ+GEiScsCifjiacnID0+ICfhhIsnLAon44moJyA9PiAn4YSMJywKJ+OJqScgPT4gJ+GEjicsCifjiaonID0+ICfhhI8nLAon44mrJyA9PiAn4YSQJywKJ+OJrCcgPT4gJ+GEkScsCifjia0nID0+ICfhhJInLAon44muJyA9PiAn4YSA4YWhJywKJ+OJrycgPT4gJ+GEguGFoScsCifjibAnID0+ICfhhIPhhaEnLAon44mxJyA9PiAn4YSF4YWhJywKJ+OJsicgPT4gJ+GEhuGFoScsCifjibMnID0+ICfhhIfhhaEnLAon44m0JyA9PiAn4YSJ4YWhJywKJ+OJtScgPT4gJ+GEi+GFoScsCifjibYnID0+ICfhhIzhhaEnLAon44m3JyA9PiAn4YSO4YWhJywKJ+OJuCcgPT4gJ+GEj+GFoScsCifjibknID0+ICfhhJDhhaEnLAon44m6JyA9PiAn4YSR4YWhJywKJ+OJuycgPT4gJ+GEkuGFoScsCifjibwnID0+ICfhhI7hhaHhhrfhhIDhhaknLAon44m9JyA9PiAn4YSM4YWu4YSL4YW0JywKJ+OJvicgPT4gJ+GEi+GFricsCifjioAnID0+ICfkuIAnLAon44qBJyA9PiAn5LqMJywKJ+OKgicgPT4gJ+S4iScsCifjioMnID0+ICflm5snLAon44qEJyA9PiAn5LqUJywKJ+OKhScgPT4gJ+WFrScsCifjioYnID0+ICfkuIMnLAon44qHJyA9PiAn5YWrJywKJ+OKiCcgPT4gJ+S5nScsCifjioknID0+ICfljYEnLAon44qKJyA9PiAn5pyIJywKJ+OKiycgPT4gJ+eBqycsCifjiownID0+ICfmsLQnLAon44qNJyA9PiAn5pyoJywKJ+OKjicgPT4gJ+mHkScsCifjio8nID0+ICflnJ8nLAon44qQJyA9PiAn5pelJywKJ+OKkScgPT4gJ+agqicsCifjipInID0+ICfmnIknLAon44qTJyA9PiAn56S+JywKJ+OKlCcgPT4gJ+WQjScsCifjipUnID0+ICfnibknLAon44qWJyA9PiAn6LKhJywKJ+OKlycgPT4gJ+elnScsCifjipgnID0+ICflirQnLAon44qZJyA9PiAn56eYJywKJ+OKmicgPT4gJ+eUtycsCifjipsnID0+ICflpbMnLAon44qcJyA9PiAn6YGpJywKJ+OKnScgPT4gJ+WEqicsCifjip4nID0+ICfljbAnLAon44qfJyA9PiAn5rOoJywKJ+OKoCcgPT4gJ+mghScsCifjiqEnID0+ICfkvJEnLAon44qiJyA9PiAn5YaZJywKJ+OKoycgPT4gJ+atoycsCifjiqQnID0+ICfkuIonLAon44qlJyA9PiAn5LitJywKJ+OKpicgPT4gJ+S4iycsCifjiqcnID0+ICflt6YnLAon44qoJyA9PiAn5Y+zJywKJ+OKqScgPT4gJ+WMuycsCifjiqonID0+ICflrpcnLAon44qrJyA9PiAn5a2mJywKJ+OKrCcgPT4gJ+eboycsCifjiq0nID0+ICfkvIEnLAon44quJyA9PiAn6LOHJywKJ+OKrycgPT4gJ+WNlCcsCifjirAnID0+ICflpJwnLAon44qxJyA9PiAnMzYnLAon44qyJyA9PiAnMzcnLAon44qzJyA9PiAnMzgnLAon44q0JyA9PiAnMzknLAon44q1JyA9PiAnNDAnLAon44q2JyA9PiAnNDEnLAon44q3JyA9PiAnNDInLAon44q4JyA9PiAnNDMnLAon44q5JyA9PiAnNDQnLAon44q6JyA9PiAnNDUnLAon44q7JyA9PiAnNDYnLAon44q8JyA9PiAnNDcnLAon44q9JyA9PiAnNDgnLAon44q+JyA9PiAnNDknLAon44q/JyA9PiAnNTAnLAon44uAJyA9PiAnMeaciCcsCifji4EnID0+ICcy5pyIJywKJ+OLgicgPT4gJzPmnIgnLAon44uDJyA9PiAnNOaciCcsCifji4QnID0+ICc15pyIJywKJ+OLhScgPT4gJzbmnIgnLAon44uGJyA9PiAnN+aciCcsCifji4cnID0+ICc45pyIJywKJ+OLiCcgPT4gJznmnIgnLAon44uJJyA9PiAnMTDmnIgnLAon44uKJyA9PiAnMTHmnIgnLAon44uLJyA9PiAnMTLmnIgnLAon44uMJyA9PiAnSGcnLAon44uNJyA9PiAnZXJnJywKJ+OLjicgPT4gJ2VWJywKJ+OLjycgPT4gJ0xURCcsCifji5AnID0+ICfjgqInLAon44uRJyA9PiAn44KkJywKJ+OLkicgPT4gJ+OCpicsCifji5MnID0+ICfjgqgnLAon44uUJyA9PiAn44KqJywKJ+OLlScgPT4gJ+OCqycsCifji5YnID0+ICfjgq0nLAon44uXJyA9PiAn44KvJywKJ+OLmCcgPT4gJ+OCsScsCifji5knID0+ICfjgrMnLAon44uaJyA9PiAn44K1JywKJ+OLmycgPT4gJ+OCtycsCifji5wnID0+ICfjgrknLAon44udJyA9PiAn44K7JywKJ+OLnicgPT4gJ+OCvScsCifji58nID0+ICfjgr8nLAon44ugJyA9PiAn44OBJywKJ+OLoScgPT4gJ+ODhCcsCifji6InID0+ICfjg4YnLAon44ujJyA9PiAn44OIJywKJ+OLpCcgPT4gJ+ODiicsCifji6UnID0+ICfjg4snLAon44umJyA9PiAn44OMJywKJ+OLpycgPT4gJ+ODjScsCifji6gnID0+ICfjg44nLAon44upJyA9PiAn44OPJywKJ+OLqicgPT4gJ+ODkicsCifji6snID0+ICfjg5UnLAon44usJyA9PiAn44OYJywKJ+OLrScgPT4gJ+ODmycsCifji64nID0+ICfjg54nLAon44uvJyA9PiAn44OfJywKJ+OLsCcgPT4gJ+ODoCcsCifji7EnID0+ICfjg6EnLAon44uyJyA9PiAn44OiJywKJ+OLsycgPT4gJ+ODpCcsCifji7QnID0+ICfjg6YnLAon44u1JyA9PiAn44OoJywKJ+OLticgPT4gJ+ODqScsCifji7cnID0+ICfjg6onLAon44u4JyA9PiAn44OrJywKJ+OLuScgPT4gJ+ODrCcsCifji7onID0+ICfjg60nLAon44u7JyA9PiAn44OvJywKJ+OLvCcgPT4gJ+ODsCcsCifji70nID0+ICfjg7EnLAon44u+JyA9PiAn44OyJywKJ+OLvycgPT4gJ+S7pOWSjCcsCifjjIAnID0+ICfjgqLjg4/jgprjg7zjg4gnLAon44yBJyA9PiAn44Ki44Or44OV44KhJywKJ+OMgicgPT4gJ+OCouODs+ODmOOCmuOCoicsCifjjIMnID0+ICfjgqLjg7zjg6snLAon44yEJyA9PiAn44Kk44OL44Oz44Kv44KZJywKJ+OMhScgPT4gJ+OCpOODs+ODgScsCifjjIYnID0+ICfjgqbjgqnjg7MnLAon44yHJyA9PiAn44Ko44K544Kv44O844OI44KZJywKJ+OMiCcgPT4gJ+OCqOODvOOCq+ODvCcsCifjjIknID0+ICfjgqrjg7PjgrknLAon44yKJyA9PiAn44Kq44O844OgJywKJ+OMiycgPT4gJ+OCq+OCpOODqicsCifjjIwnID0+ICfjgqvjg6njg4Pjg4gnLAon44yNJyA9PiAn44Kr44Ot44Oq44O8JywKJ+OMjicgPT4gJ+OCq+OCmeODreODsycsCifjjI8nID0+ICfjgqvjgpnjg7Pjg54nLAon44yQJyA9PiAn44Kt44KZ44Kr44KZJywKJ+OMkScgPT4gJ+OCreOCmeODi+ODvCcsCifjjJInID0+ICfjgq3jg6Xjg6rjg7wnLAon44yTJyA9PiAn44Kt44KZ44Or44K/44KZ44O8JywKJ+OMlCcgPT4gJ+OCreODrScsCifjjJUnID0+ICfjgq3jg63jgq/jgpnjg6njg6AnLAon44yWJyA9PiAn44Kt44Ot44Oh44O844OI44OrJywKJ+OMlycgPT4gJ+OCreODreODr+ODg+ODiCcsCifjjJgnID0+ICfjgq/jgpnjg6njg6AnLAon44yZJyA9PiAn44Kv44KZ44Op44Og44OI44OzJywKJ+OMmicgPT4gJ+OCr+ODq+OCu+OCmeOCpOODrScsCifjjJsnID0+ICfjgq/jg63jg7zjg40nLAon44ycJyA9PiAn44Kx44O844K5JywKJ+OMnScgPT4gJ+OCs+ODq+ODiicsCifjjJ4nID0+ICfjgrPjg7zjg5vjgponLAon44yfJyA9PiAn44K144Kk44Kv44OrJywKJ+OMoCcgPT4gJ+OCteODs+ODgeODvOODoCcsCifjjKEnID0+ICfjgrfjg6rjg7Pjgq/jgpknLAon44yiJyA9PiAn44K744Oz44OBJywKJ+OMoycgPT4gJ+OCu+ODs+ODiCcsCifjjKQnID0+ICfjgr/jgpnjg7zjgrknLAon44ylJyA9PiAn44OG44KZ44K3JywKJ+OMpicgPT4gJ+ODiOOCmeODqycsCifjjKcnID0+ICfjg4jjg7MnLAon44yoJyA9PiAn44OK44OOJywKJ+OMqScgPT4gJ+ODjuODg+ODiCcsCifjjKonID0+ICfjg4/jgqTjg4QnLAon44yrJyA9PiAn44OP44Ka44O844K744Oz44OIJywKJ+OMrCcgPT4gJ+ODj+OCmuODvOODhCcsCifjjK0nID0+ICfjg4/jgpnjg7zjg6zjg6snLAon44yuJyA9PiAn44OS44Ka44Ki44K544OI44OrJywKJ+OMrycgPT4gJ+ODkuOCmuOCr+ODqycsCifjjLAnID0+ICfjg5LjgprjgrMnLAon44yxJyA9PiAn44OS44KZ44OrJywKJ+OMsicgPT4gJ+ODleOCoeODqeODg+ODiOOCmScsCifjjLMnID0+ICfjg5XjgqPjg7zjg4gnLAon44y0JyA9PiAn44OV44KZ44OD44K344Kn44OrJywKJ+OMtScgPT4gJ+ODleODqeODsycsCifjjLYnID0+ICfjg5jjgq/jgr/jg7zjg6snLAon44y3JyA9PiAn44OY44Ka44K9JywKJ+OMuCcgPT4gJ+ODmOOCmuODi+ODkicsCifjjLknID0+ICfjg5jjg6vjg4QnLAon44y6JyA9PiAn44OY44Ka44Oz44K5JywKJ+OMuycgPT4gJ+ODmOOCmuODvOOCt+OCmScsCifjjLwnID0+ICfjg5jjgpnjg7zjgr8nLAon44y9JyA9PiAn44Ob44Ka44Kk44Oz44OIJywKJ+OMvicgPT4gJ+ODm+OCmeODq+ODiCcsCifjjL8nID0+ICfjg5vjg7MnLAon442AJyA9PiAn44Ob44Ka44Oz44OI44KZJywKJ+ONgScgPT4gJ+ODm+ODvOODqycsCifjjYInID0+ICfjg5vjg7zjg7MnLAon442DJyA9PiAn44Oe44Kk44Kv44OtJywKJ+ONhCcgPT4gJ+ODnuOCpOODqycsCifjjYUnID0+ICfjg57jg4Pjg48nLAon442GJyA9PiAn44Oe44Or44KvJywKJ+ONhycgPT4gJ+ODnuODs+OCt+ODp+ODsycsCifjjYgnID0+ICfjg5/jgq/jg63jg7MnLAon442JJyA9PiAn44Of44OqJywKJ+ONiicgPT4gJ+ODn+ODquODj+OCmeODvOODqycsCifjjYsnID0+ICfjg6HjgqvjgpknLAon442MJyA9PiAn44Oh44Kr44KZ44OI44OzJywKJ+ONjScgPT4gJ+ODoeODvOODiOODqycsCifjjY4nID0+ICfjg6Tjg7zjg4jjgpknLAon442PJyA9PiAn44Ok44O844OrJywKJ+ONkCcgPT4gJ+ODpuOCouODsycsCifjjZEnID0+ICfjg6rjg4Pjg4jjg6snLAon442SJyA9PiAn44Oq44OpJywKJ+ONkycgPT4gJ+ODq+ODkuOCmuODvCcsCifjjZQnID0+ICfjg6vjg7zjg5Xjgpnjg6snLAon442VJyA9PiAn44Os44OgJywKJ+ONlicgPT4gJ+ODrOODs+ODiOOCseOCmeODsycsCifjjZcnID0+ICfjg6/jg4Pjg4gnLAon442YJyA9PiAnMOeCuScsCifjjZknID0+ICcx54K5JywKJ+ONmicgPT4gJzLngrknLAon442bJyA9PiAnM+eCuScsCifjjZwnID0+ICc054K5JywKJ+ONnScgPT4gJzXngrknLAon442eJyA9PiAnNueCuScsCifjjZ8nID0+ICc354K5JywKJ+ONoCcgPT4gJzjngrknLAon442hJyA9PiAnOeeCuScsCifjjaInID0+ICcxMOeCuScsCifjjaMnID0+ICcxMeeCuScsCifjjaQnID0+ICcxMueCuScsCifjjaUnID0+ICcxM+eCuScsCifjjaYnID0+ICcxNOeCuScsCifjjacnID0+ICcxNeeCuScsCifjjagnID0+ICcxNueCuScsCifjjaknID0+ICcxN+eCuScsCifjjaonID0+ICcxOOeCuScsCifjjasnID0+ICcxOeeCuScsCifjjawnID0+ICcyMOeCuScsCifjja0nID0+ICcyMeeCuScsCifjja4nID0+ICcyMueCuScsCifjja8nID0+ICcyM+eCuScsCifjjbAnID0+ICcyNOeCuScsCifjjbEnID0+ICdoUGEnLAon442yJyA9PiAnZGEnLAon442zJyA9PiAnQVUnLAon4420JyA9PiAnYmFyJywKJ+ONtScgPT4gJ29WJywKJ+ONticgPT4gJ3BjJywKJ+ONtycgPT4gJ2RtJywKJ+ONuCcgPT4gJ2RtMicsCifjjbknID0+ICdkbTMnLAon4426JyA9PiAnSVUnLAon4427JyA9PiAn5bmz5oiQJywKJ+ONvCcgPT4gJ+aYreWSjCcsCifjjb0nID0+ICflpKfmraMnLAon442+JyA9PiAn5piO5rK7JywKJ+ONvycgPT4gJ+agquW8j+S8muekvicsCifjjoAnID0+ICdwQScsCifjjoEnID0+ICduQScsCifjjoInID0+ICfOvEEnLAon446DJyA9PiAnbUEnLAon446EJyA9PiAna0EnLAon446FJyA9PiAnS0InLAon446GJyA9PiAnTUInLAon446HJyA9PiAnR0InLAon446IJyA9PiAnY2FsJywKJ+OOiScgPT4gJ2tjYWwnLAon446KJyA9PiAncEYnLAon446LJyA9PiAnbkYnLAon446MJyA9PiAnzrxGJywKJ+OOjScgPT4gJ868ZycsCifjjo4nID0+ICdtZycsCifjjo8nID0+ICdrZycsCifjjpAnID0+ICdIeicsCifjjpEnID0+ICdrSHonLAon446SJyA9PiAnTUh6JywKJ+OOkycgPT4gJ0dIeicsCifjjpQnID0+ICdUSHonLAon446VJyA9PiAnzrxsJywKJ+OOlicgPT4gJ21sJywKJ+OOlycgPT4gJ2RsJywKJ+OOmCcgPT4gJ2tsJywKJ+OOmScgPT4gJ2ZtJywKJ+OOmicgPT4gJ25tJywKJ+OOmycgPT4gJ868bScsCifjjpwnID0+ICdtbScsCifjjp0nID0+ICdjbScsCifjjp4nID0+ICdrbScsCifjjp8nID0+ICdtbTInLAon446gJyA9PiAnY20yJywKJ+OOoScgPT4gJ20yJywKJ+OOoicgPT4gJ2ttMicsCifjjqMnID0+ICdtbTMnLAon446kJyA9PiAnY20zJywKJ+OOpScgPT4gJ20zJywKJ+OOpicgPT4gJ2ttMycsCifjjqcnID0+ICdt4oiVcycsCifjjqgnID0+ICdt4oiVczInLAon446pJyA9PiAnUGEnLAon446qJyA9PiAna1BhJywKJ+OOqycgPT4gJ01QYScsCifjjqwnID0+ICdHUGEnLAon446tJyA9PiAncmFkJywKJ+OOricgPT4gJ3JhZOKIlXMnLAon446vJyA9PiAncmFk4oiVczInLAon446wJyA9PiAncHMnLAon446xJyA9PiAnbnMnLAon446yJyA9PiAnzrxzJywKJ+OOsycgPT4gJ21zJywKJ+OOtCcgPT4gJ3BWJywKJ+OOtScgPT4gJ25WJywKJ+OOticgPT4gJ868VicsCifjjrcnID0+ICdtVicsCifjjrgnID0+ICdrVicsCifjjrknID0+ICdNVicsCifjjronID0+ICdwVycsCifjjrsnID0+ICduVycsCifjjrwnID0+ICfOvFcnLAon4469JyA9PiAnbVcnLAon446+JyA9PiAna1cnLAon446/JyA9PiAnTVcnLAon44+AJyA9PiAna86pJywKJ+OPgScgPT4gJ03OqScsCifjj4InID0+ICdhLm0uJywKJ+OPgycgPT4gJ0JxJywKJ+OPhCcgPT4gJ2NjJywKJ+OPhScgPT4gJ2NkJywKJ+OPhicgPT4gJ0PiiJVrZycsCifjj4cnID0+ICdDby4nLAon44+IJyA9PiAnZEInLAon44+JJyA9PiAnR3knLAon44+KJyA9PiAnaGEnLAon44+LJyA9PiAnSFAnLAon44+MJyA9PiAnaW4nLAon44+NJyA9PiAnS0snLAon44+OJyA9PiAnS00nLAon44+PJyA9PiAna3QnLAon44+QJyA9PiAnbG0nLAon44+RJyA9PiAnbG4nLAon44+SJyA9PiAnbG9nJywKJ+OPkycgPT4gJ2x4JywKJ+OPlCcgPT4gJ21iJywKJ+OPlScgPT4gJ21pbCcsCifjj5YnID0+ICdtb2wnLAon44+XJyA9PiAnUEgnLAon44+YJyA9PiAncC5tLicsCifjj5knID0+ICdQUE0nLAon44+aJyA9PiAnUFInLAon44+bJyA9PiAnc3InLAon44+cJyA9PiAnU3YnLAon44+dJyA9PiAnV2InLAon44+eJyA9PiAnVuKIlW0nLAon44+fJyA9PiAnQeKIlW0nLAon44+gJyA9PiAnMeaXpScsCifjj6EnID0+ICcy5pelJywKJ+OPoicgPT4gJzPml6UnLAon44+jJyA9PiAnNOaXpScsCifjj6QnID0+ICc15pelJywKJ+OPpScgPT4gJzbml6UnLAon44+mJyA9PiAnN+aXpScsCifjj6cnID0+ICc45pelJywKJ+OPqCcgPT4gJznml6UnLAon44+pJyA9PiAnMTDml6UnLAon44+qJyA9PiAnMTHml6UnLAon44+rJyA9PiAnMTLml6UnLAon44+sJyA9PiAnMTPml6UnLAon44+tJyA9PiAnMTTml6UnLAon44+uJyA9PiAnMTXml6UnLAon44+vJyA9PiAnMTbml6UnLAon44+wJyA9PiAnMTfml6UnLAon44+xJyA9PiAnMTjml6UnLAon44+yJyA9PiAnMTnml6UnLAon44+zJyA9PiAnMjDml6UnLAon44+0JyA9PiAnMjHml6UnLAon44+1JyA9PiAnMjLml6UnLAon44+2JyA9PiAnMjPml6UnLAon44+3JyA9PiAnMjTml6UnLAon44+4JyA9PiAnMjXml6UnLAon44+5JyA9PiAnMjbml6UnLAon44+6JyA9PiAnMjfml6UnLAon44+7JyA9PiAnMjjml6UnLAon44+8JyA9PiAnMjnml6UnLAon44+9JyA9PiAnMzDml6UnLAon44++JyA9PiAnMzHml6UnLAon44+/JyA9PiAnZ2FsJywKJ+qanCcgPT4gJ9GKJywKJ+qanScgPT4gJ9GMJywKJ+qdsCcgPT4gJ+qdrycsCifqn7gnID0+ICfEpicsCifqn7knID0+ICfFkycsCifqrZwnID0+ICfqnKcnLAon6q2dJyA9PiAn6qy3JywKJ+qtnicgPT4gJ8mrJywKJ+qtnycgPT4gJ+qtkicsCifqraknID0+ICfKjScsCifvrIAnID0+ICdmZicsCifvrIEnID0+ICdmaScsCifvrIInID0+ICdmbCcsCifvrIMnID0+ICdmZmknLAon76yEJyA9PiAnZmZsJywKJ++shScgPT4gJ3N0JywKJ++shicgPT4gJ3N0JywKJ++skycgPT4gJ9W01bYnLAon76yUJyA9PiAn1bTVpScsCifvrJUnID0+ICfVtNWrJywKJ++slicgPT4gJ9W+1bYnLAon76yXJyA9PiAn1bTVrScsCifvrKAnID0+ICfXoicsCifvrKEnID0+ICfXkCcsCifvrKInID0+ICfXkycsCifvrKMnID0+ICfXlCcsCifvrKQnID0+ICfXmycsCifvrKUnID0+ICfXnCcsCifvrKYnID0+ICfXnScsCifvrKcnID0+ICfXqCcsCifvrKgnID0+ICfXqicsCifvrKknID0+ICcrJywKJ++tjycgPT4gJ9eQ15wnLAon762QJyA9PiAn2bEnLAon762RJyA9PiAn2bEnLAon762SJyA9PiAn2bsnLAon762TJyA9PiAn2bsnLAon762UJyA9PiAn2bsnLAon762VJyA9PiAn2bsnLAon762WJyA9PiAn2b4nLAon762XJyA9PiAn2b4nLAon762YJyA9PiAn2b4nLAon762ZJyA9PiAn2b4nLAon762aJyA9PiAn2oAnLAon762bJyA9PiAn2oAnLAon762cJyA9PiAn2oAnLAon762dJyA9PiAn2oAnLAon762eJyA9PiAn2bonLAon762fJyA9PiAn2bonLAon762gJyA9PiAn2bonLAon762hJyA9PiAn2bonLAon762iJyA9PiAn2b8nLAon762jJyA9PiAn2b8nLAon762kJyA9PiAn2b8nLAon762lJyA9PiAn2b8nLAon762mJyA9PiAn2bknLAon762nJyA9PiAn2bknLAon762oJyA9PiAn2bknLAon762pJyA9PiAn2bknLAon762qJyA9PiAn2qQnLAon762rJyA9PiAn2qQnLAon762sJyA9PiAn2qQnLAon762tJyA9PiAn2qQnLAon762uJyA9PiAn2qYnLAon762vJyA9PiAn2qYnLAon762wJyA9PiAn2qYnLAon762xJyA9PiAn2qYnLAon762yJyA9PiAn2oQnLAon762zJyA9PiAn2oQnLAon7620JyA9PiAn2oQnLAon7621JyA9PiAn2oQnLAon7622JyA9PiAn2oMnLAon7623JyA9PiAn2oMnLAon7624JyA9PiAn2oMnLAon7625JyA9PiAn2oMnLAon7626JyA9PiAn2oYnLAon7627JyA9PiAn2oYnLAon7628JyA9PiAn2oYnLAon7629JyA9PiAn2oYnLAon762+JyA9PiAn2ocnLAon762/JyA9PiAn2ocnLAon766AJyA9PiAn2ocnLAon766BJyA9PiAn2ocnLAon766CJyA9PiAn2o0nLAon766DJyA9PiAn2o0nLAon766EJyA9PiAn2ownLAon766FJyA9PiAn2ownLAon766GJyA9PiAn2o4nLAon766HJyA9PiAn2o4nLAon766IJyA9PiAn2ognLAon766JJyA9PiAn2ognLAon766KJyA9PiAn2pgnLAon766LJyA9PiAn2pgnLAon766MJyA9PiAn2pEnLAon766NJyA9PiAn2pEnLAon766OJyA9PiAn2qknLAon766PJyA9PiAn2qknLAon766QJyA9PiAn2qknLAon766RJyA9PiAn2qknLAon766SJyA9PiAn2q8nLAon766TJyA9PiAn2q8nLAon766UJyA9PiAn2q8nLAon766VJyA9PiAn2q8nLAon766WJyA9PiAn2rMnLAon766XJyA9PiAn2rMnLAon766YJyA9PiAn2rMnLAon766ZJyA9PiAn2rMnLAon766aJyA9PiAn2rEnLAon766bJyA9PiAn2rEnLAon766cJyA9PiAn2rEnLAon766dJyA9PiAn2rEnLAon766eJyA9PiAn2ronLAon766fJyA9PiAn2ronLAon766gJyA9PiAn2rsnLAon766hJyA9PiAn2rsnLAon766iJyA9PiAn2rsnLAon766jJyA9PiAn2rsnLAon766kJyA9PiAn25XZlCcsCifvrqUnID0+ICfbldmUJywKJ++upicgPT4gJ9uBJywKJ++upycgPT4gJ9uBJywKJ++uqCcgPT4gJ9uBJywKJ++uqScgPT4gJ9uBJywKJ++uqicgPT4gJ9q+JywKJ++uqycgPT4gJ9q+JywKJ++urCcgPT4gJ9q+JywKJ++urScgPT4gJ9q+JywKJ++uricgPT4gJ9uSJywKJ++urycgPT4gJ9uSJywKJ++usCcgPT4gJ9uS2ZQnLAon766xJyA9PiAn25LZlCcsCifvr5MnID0+ICfarScsCifvr5QnID0+ICfarScsCifvr5UnID0+ICfarScsCifvr5YnID0+ICfarScsCifvr5cnID0+ICfbhycsCifvr5gnID0+ICfbhycsCifvr5knID0+ICfbhicsCifvr5onID0+ICfbhicsCifvr5snID0+ICfbiCcsCifvr5wnID0+ICfbiCcsCifvr50nID0+ICfbh9m0JywKJ++vnicgPT4gJ9uLJywKJ++vnycgPT4gJ9uLJywKJ++voCcgPT4gJ9uFJywKJ++voScgPT4gJ9uFJywKJ++voicgPT4gJ9uJJywKJ++voycgPT4gJ9uJJywKJ++vpCcgPT4gJ9uQJywKJ++vpScgPT4gJ9uQJywKJ++vpicgPT4gJ9uQJywKJ++vpycgPT4gJ9uQJywKJ++vqCcgPT4gJ9mJJywKJ++vqScgPT4gJ9mJJywKJ++vqicgPT4gJ9mK2ZTYpycsCifvr6snID0+ICfZitmU2KcnLAon76+sJyA9PiAn2YrZlNuVJywKJ++vrScgPT4gJ9mK2ZTblScsCifvr64nID0+ICfZitmU2YgnLAon76+vJyA9PiAn2YrZlNmIJywKJ++vsCcgPT4gJ9mK2ZTbhycsCifvr7EnID0+ICfZitmU24cnLAon76+yJyA9PiAn2YrZlNuGJywKJ++vsycgPT4gJ9mK2ZTbhicsCifvr7QnID0+ICfZitmU24gnLAon76+1JyA9PiAn2YrZlNuIJywKJ++vticgPT4gJ9mK2ZTbkCcsCifvr7cnID0+ICfZitmU25AnLAon76+4JyA9PiAn2YrZlNuQJywKJ++vuScgPT4gJ9mK2ZTZiScsCifvr7onID0+ICfZitmU2YknLAon76+7JyA9PiAn2YrZlNmJJywKJ++vvCcgPT4gJ9uMJywKJ++vvScgPT4gJ9uMJywKJ++vvicgPT4gJ9uMJywKJ++vvycgPT4gJ9uMJywKJ++wgCcgPT4gJ9mK2ZTYrCcsCifvsIEnID0+ICfZitmU2K0nLAon77CCJyA9PiAn2YrZlNmFJywKJ++wgycgPT4gJ9mK2ZTZiScsCifvsIQnID0+ICfZitmU2YonLAon77CFJyA9PiAn2KjYrCcsCifvsIYnID0+ICfYqNitJywKJ++whycgPT4gJ9io2K4nLAon77CIJyA9PiAn2KjZhScsCifvsIknID0+ICfYqNmJJywKJ++wiicgPT4gJ9io2YonLAon77CLJyA9PiAn2KrYrCcsCifvsIwnID0+ICfYqtitJywKJ++wjScgPT4gJ9iq2K4nLAon77COJyA9PiAn2KrZhScsCifvsI8nID0+ICfYqtmJJywKJ++wkCcgPT4gJ9iq2YonLAon77CRJyA9PiAn2KvYrCcsCifvsJInID0+ICfYq9mFJywKJ++wkycgPT4gJ9ir2YknLAon77CUJyA9PiAn2KvZiicsCifvsJUnID0+ICfYrNitJywKJ++wlicgPT4gJ9is2YUnLAon77CXJyA9PiAn2K3YrCcsCifvsJgnID0+ICfYrdmFJywKJ++wmScgPT4gJ9iu2KwnLAon77CaJyA9PiAn2K7YrScsCifvsJsnID0+ICfYrtmFJywKJ++wnCcgPT4gJ9iz2KwnLAon77CdJyA9PiAn2LPYrScsCifvsJ4nID0+ICfYs9iuJywKJ++wnycgPT4gJ9iz2YUnLAon77CgJyA9PiAn2LXYrScsCifvsKEnID0+ICfYtdmFJywKJ++woicgPT4gJ9i22KwnLAon77CjJyA9PiAn2LbYrScsCifvsKQnID0+ICfYttiuJywKJ++wpScgPT4gJ9i22YUnLAon77CmJyA9PiAn2LfYrScsCifvsKcnID0+ICfYt9mFJywKJ++wqCcgPT4gJ9i42YUnLAon77CpJyA9PiAn2LnYrCcsCifvsKonID0+ICfYudmFJywKJ++wqycgPT4gJ9i62KwnLAon77CsJyA9PiAn2LrZhScsCifvsK0nID0+ICfZgdisJywKJ++wricgPT4gJ9mB2K0nLAon77CvJyA9PiAn2YHYricsCifvsLAnID0+ICfZgdmFJywKJ++wsScgPT4gJ9mB2YknLAon77CyJyA9PiAn2YHZiicsCifvsLMnID0+ICfZgtitJywKJ++wtCcgPT4gJ9mC2YUnLAon77C1JyA9PiAn2YLZiScsCifvsLYnID0+ICfZgtmKJywKJ++wtycgPT4gJ9mD2KcnLAon77C4JyA9PiAn2YPYrCcsCifvsLknID0+ICfZg9itJywKJ++wuicgPT4gJ9mD2K4nLAon77C7JyA9PiAn2YPZhCcsCifvsLwnID0+ICfZg9mFJywKJ++wvScgPT4gJ9mD2YknLAon77C+JyA9PiAn2YPZiicsCifvsL8nID0+ICfZhNisJywKJ++xgCcgPT4gJ9mE2K0nLAon77GBJyA9PiAn2YTYricsCifvsYInID0+ICfZhNmFJywKJ++xgycgPT4gJ9mE2YknLAon77GEJyA9PiAn2YTZiicsCifvsYUnID0+ICfZhdisJywKJ++xhicgPT4gJ9mF2K0nLAon77GHJyA9PiAn2YXYricsCifvsYgnID0+ICfZhdmFJywKJ++xiScgPT4gJ9mF2YknLAon77GKJyA9PiAn2YXZiicsCifvsYsnID0+ICfZhtisJywKJ++xjCcgPT4gJ9mG2K0nLAon77GNJyA9PiAn2YbYricsCifvsY4nID0+ICfZhtmFJywKJ++xjycgPT4gJ9mG2YknLAon77GQJyA9PiAn2YbZiicsCifvsZEnID0+ICfZh9isJywKJ++xkicgPT4gJ9mH2YUnLAon77GTJyA9PiAn2YfZiScsCifvsZQnID0+ICfZh9mKJywKJ++xlScgPT4gJ9mK2KwnLAon77GWJyA9PiAn2YrYrScsCifvsZcnID0+ICfZitiuJywKJ++xmCcgPT4gJ9mK2YUnLAon77GZJyA9PiAn2YrZiScsCifvsZonID0+ICfZitmKJywKJ++xmycgPT4gJ9iw2bAnLAon77GcJyA9PiAn2LHZsCcsCifvsZ0nID0+ICfZidmwJywKJ++xnicgPT4gJyDZjNmRJywKJ++xnycgPT4gJyDZjdmRJywKJ++xoCcgPT4gJyDZjtmRJywKJ++xoScgPT4gJyDZj9mRJywKJ++xoicgPT4gJyDZkNmRJywKJ++xoycgPT4gJyDZkdmwJywKJ++xpCcgPT4gJ9mK2ZTYsScsCifvsaUnID0+ICfZitmU2LInLAon77GmJyA9PiAn2YrZlNmFJywKJ++xpycgPT4gJ9mK2ZTZhicsCifvsagnID0+ICfZitmU2YknLAon77GpJyA9PiAn2YrZlNmKJywKJ++xqicgPT4gJ9io2LEnLAon77GrJyA9PiAn2KjYsicsCifvsawnID0+ICfYqNmFJywKJ++xrScgPT4gJ9io2YYnLAon77GuJyA9PiAn2KjZiScsCifvsa8nID0+ICfYqNmKJywKJ++xsCcgPT4gJ9iq2LEnLAon77GxJyA9PiAn2KrYsicsCifvsbInID0+ICfYqtmFJywKJ++xsycgPT4gJ9iq2YYnLAon77G0JyA9PiAn2KrZiScsCifvsbUnID0+ICfYqtmKJywKJ++xticgPT4gJ9ir2LEnLAon77G3JyA9PiAn2KvYsicsCifvsbgnID0+ICfYq9mFJywKJ++xuScgPT4gJ9ir2YYnLAon77G6JyA9PiAn2KvZiScsCifvsbsnID0+ICfYq9mKJywKJ++xvCcgPT4gJ9mB2YknLAon77G9JyA9PiAn2YHZiicsCifvsb4nID0+ICfZgtmJJywKJ++xvycgPT4gJ9mC2YonLAon77KAJyA9PiAn2YPYpycsCifvsoEnID0+ICfZg9mEJywKJ++ygicgPT4gJ9mD2YUnLAon77KDJyA9PiAn2YPZiScsCifvsoQnID0+ICfZg9mKJywKJ++yhScgPT4gJ9mE2YUnLAon77KGJyA9PiAn2YTZiScsCifvsocnID0+ICfZhNmKJywKJ++yiCcgPT4gJ9mF2KcnLAon77KJJyA9PiAn2YXZhScsCifvsoonID0+ICfZhtixJywKJ++yiycgPT4gJ9mG2LInLAon77KMJyA9PiAn2YbZhScsCifvso0nID0+ICfZhtmGJywKJ++yjicgPT4gJ9mG2YknLAon77KPJyA9PiAn2YbZiicsCifvspAnID0+ICfZidmwJywKJ++ykScgPT4gJ9mK2LEnLAon77KSJyA9PiAn2YrYsicsCifvspMnID0+ICfZitmFJywKJ++ylCcgPT4gJ9mK2YYnLAon77KVJyA9PiAn2YrZiScsCifvspYnID0+ICfZitmKJywKJ++ylycgPT4gJ9mK2ZTYrCcsCifvspgnID0+ICfZitmU2K0nLAon77KZJyA9PiAn2YrZlNiuJywKJ++ymicgPT4gJ9mK2ZTZhScsCifvspsnID0+ICfZitmU2YcnLAon77KcJyA9PiAn2KjYrCcsCifvsp0nID0+ICfYqNitJywKJ++ynicgPT4gJ9io2K4nLAon77KfJyA9PiAn2KjZhScsCifvsqAnID0+ICfYqNmHJywKJ++yoScgPT4gJ9iq2KwnLAon77KiJyA9PiAn2KrYrScsCifvsqMnID0+ICfYqtiuJywKJ++ypCcgPT4gJ9iq2YUnLAon77KlJyA9PiAn2KrZhycsCifvsqYnID0+ICfYq9mFJywKJ++ypycgPT4gJ9is2K0nLAon77KoJyA9PiAn2KzZhScsCifvsqknID0+ICfYrdisJywKJ++yqicgPT4gJ9it2YUnLAon77KrJyA9PiAn2K7YrCcsCifvsqwnID0+ICfYrtmFJywKJ++yrScgPT4gJ9iz2KwnLAon77KuJyA9PiAn2LPYrScsCifvsq8nID0+ICfYs9iuJywKJ++ysCcgPT4gJ9iz2YUnLAon77KxJyA9PiAn2LXYrScsCifvsrInID0+ICfYtdiuJywKJ++ysycgPT4gJ9i12YUnLAon77K0JyA9PiAn2LbYrCcsCifvsrUnID0+ICfYttitJywKJ++yticgPT4gJ9i22K4nLAon77K3JyA9PiAn2LbZhScsCifvsrgnID0+ICfYt9itJywKJ++yuScgPT4gJ9i42YUnLAon77K6JyA9PiAn2LnYrCcsCifvsrsnID0+ICfYudmFJywKJ++yvCcgPT4gJ9i62KwnLAon77K9JyA9PiAn2LrZhScsCifvsr4nID0+ICfZgdisJywKJ++yvycgPT4gJ9mB2K0nLAon77OAJyA9PiAn2YHYricsCifvs4EnID0+ICfZgdmFJywKJ++zgicgPT4gJ9mC2K0nLAon77ODJyA9PiAn2YLZhScsCifvs4QnID0+ICfZg9isJywKJ++zhScgPT4gJ9mD2K0nLAon77OGJyA9PiAn2YPYricsCifvs4cnID0+ICfZg9mEJywKJ++ziCcgPT4gJ9mD2YUnLAon77OJJyA9PiAn2YTYrCcsCifvs4onID0+ICfZhNitJywKJ++ziycgPT4gJ9mE2K4nLAon77OMJyA9PiAn2YTZhScsCifvs40nID0+ICfZhNmHJywKJ++zjicgPT4gJ9mF2KwnLAon77OPJyA9PiAn2YXYrScsCifvs5AnID0+ICfZhdiuJywKJ++zkScgPT4gJ9mF2YUnLAon77OSJyA9PiAn2YbYrCcsCifvs5MnID0+ICfZhtitJywKJ++zlCcgPT4gJ9mG2K4nLAon77OVJyA9PiAn2YbZhScsCifvs5YnID0+ICfZhtmHJywKJ++zlycgPT4gJ9mH2KwnLAon77OYJyA9PiAn2YfZhScsCifvs5knID0+ICfZh9mwJywKJ++zmicgPT4gJ9mK2KwnLAon77ObJyA9PiAn2YrYrScsCifvs5wnID0+ICfZitiuJywKJ++znScgPT4gJ9mK2YUnLAon77OeJyA9PiAn2YrZhycsCifvs58nID0+ICfZitmU2YUnLAon77OgJyA9PiAn2YrZlNmHJywKJ++zoScgPT4gJ9io2YUnLAon77OiJyA9PiAn2KjZhycsCifvs6MnID0+ICfYqtmFJywKJ++zpCcgPT4gJ9iq2YcnLAon77OlJyA9PiAn2KvZhScsCifvs6YnID0+ICfYq9mHJywKJ++zpycgPT4gJ9iz2YUnLAon77OoJyA9PiAn2LPZhycsCifvs6knID0+ICfYtNmFJywKJ++zqicgPT4gJ9i02YcnLAon77OrJyA9PiAn2YPZhCcsCifvs6wnID0+ICfZg9mFJywKJ++zrScgPT4gJ9mE2YUnLAon77OuJyA9PiAn2YbZhScsCifvs68nID0+ICfZhtmHJywKJ++zsCcgPT4gJ9mK2YUnLAon77OxJyA9PiAn2YrZhycsCifvs7InID0+ICfZgNmO2ZEnLAon77OzJyA9PiAn2YDZj9mRJywKJ++ztCcgPT4gJ9mA2ZDZkScsCifvs7UnID0+ICfYt9mJJywKJ++zticgPT4gJ9i32YonLAon77O3JyA9PiAn2LnZiScsCifvs7gnID0+ICfYudmKJywKJ++zuScgPT4gJ9i62YknLAon77O6JyA9PiAn2LrZiicsCifvs7snID0+ICfYs9mJJywKJ++zvCcgPT4gJ9iz2YonLAon77O9JyA9PiAn2LTZiScsCifvs74nID0+ICfYtNmKJywKJ++zvycgPT4gJ9it2YknLAon77SAJyA9PiAn2K3ZiicsCifvtIEnID0+ICfYrNmJJywKJ++0gicgPT4gJ9is2YonLAon77SDJyA9PiAn2K7ZiScsCifvtIQnID0+ICfYrtmKJywKJ++0hScgPT4gJ9i12YknLAon77SGJyA9PiAn2LXZiicsCifvtIcnID0+ICfYttmJJywKJ++0iCcgPT4gJ9i22YonLAon77SJJyA9PiAn2LTYrCcsCifvtIonID0+ICfYtNitJywKJ++0iycgPT4gJ9i02K4nLAon77SMJyA9PiAn2LTZhScsCifvtI0nID0+ICfYtNixJywKJ++0jicgPT4gJ9iz2LEnLAon77SPJyA9PiAn2LXYsScsCifvtJAnID0+ICfYttixJywKJ++0kScgPT4gJ9i32YknLAon77SSJyA9PiAn2LfZiicsCifvtJMnID0+ICfYudmJJywKJ++0lCcgPT4gJ9i52YonLAon77SVJyA9PiAn2LrZiScsCifvtJYnID0+ICfYutmKJywKJ++0lycgPT4gJ9iz2YknLAon77SYJyA9PiAn2LPZiicsCifvtJknID0+ICfYtNmJJywKJ++0micgPT4gJ9i02YonLAon77SbJyA9PiAn2K3ZiScsCifvtJwnID0+ICfYrdmKJywKJ++0nScgPT4gJ9is2YknLAon77SeJyA9PiAn2KzZiicsCifvtJ8nID0+ICfYrtmJJywKJ++0oCcgPT4gJ9iu2YonLAon77ShJyA9PiAn2LXZiScsCifvtKInID0+ICfYtdmKJywKJ++0oycgPT4gJ9i22YknLAon77SkJyA9PiAn2LbZiicsCifvtKUnID0+ICfYtNisJywKJ++0picgPT4gJ9i02K0nLAon77SnJyA9PiAn2LTYricsCifvtKgnID0+ICfYtNmFJywKJ++0qScgPT4gJ9i02LEnLAon77SqJyA9PiAn2LPYsScsCifvtKsnID0+ICfYtdixJywKJ++0rCcgPT4gJ9i22LEnLAon77StJyA9PiAn2LTYrCcsCifvtK4nID0+ICfYtNitJywKJ++0rycgPT4gJ9i02K4nLAon77SwJyA9PiAn2LTZhScsCifvtLEnID0+ICfYs9mHJywKJ++0sicgPT4gJ9i02YcnLAon77SzJyA9PiAn2LfZhScsCifvtLQnID0+ICfYs9isJywKJ++0tScgPT4gJ9iz2K0nLAon77S2JyA9PiAn2LPYricsCifvtLcnID0+ICfYtNisJywKJ++0uCcgPT4gJ9i02K0nLAon77S5JyA9PiAn2LTYricsCifvtLonID0+ICfYt9mFJywKJ++0uycgPT4gJ9i42YUnLAon77S8JyA9PiAn2KfZiycsCifvtL0nID0+ICfYp9mLJywKJ++1kCcgPT4gJ9iq2KzZhScsCifvtZEnID0+ICfYqtit2KwnLAon77WSJyA9PiAn2KrYrdisJywKJ++1kycgPT4gJ9iq2K3ZhScsCifvtZQnID0+ICfYqtiu2YUnLAon77WVJyA9PiAn2KrZhdisJywKJ++1licgPT4gJ9iq2YXYrScsCifvtZcnID0+ICfYqtmF2K4nLAon77WYJyA9PiAn2KzZhditJywKJ++1mScgPT4gJ9is2YXYrScsCifvtZonID0+ICfYrdmF2YonLAon77WbJyA9PiAn2K3ZhdmJJywKJ++1nCcgPT4gJ9iz2K3YrCcsCifvtZ0nID0+ICfYs9is2K0nLAon77WeJyA9PiAn2LPYrNmJJywKJ++1nycgPT4gJ9iz2YXYrScsCifvtaAnID0+ICfYs9mF2K0nLAon77WhJyA9PiAn2LPZhdisJywKJ++1oicgPT4gJ9iz2YXZhScsCifvtaMnID0+ICfYs9mF2YUnLAon77WkJyA9PiAn2LXYrditJywKJ++1pScgPT4gJ9i12K3YrScsCifvtaYnID0+ICfYtdmF2YUnLAon77WnJyA9PiAn2LTYrdmFJywKJ++1qCcgPT4gJ9i02K3ZhScsCifvtaknID0+ICfYtNis2YonLAon77WqJyA9PiAn2LTZhdiuJywKJ++1qycgPT4gJ9i02YXYricsCifvtawnID0+ICfYtNmF2YUnLAon77WtJyA9PiAn2LTZhdmFJywKJ++1ricgPT4gJ9i22K3ZiScsCifvta8nID0+ICfYttiu2YUnLAon77WwJyA9PiAn2LbYrtmFJywKJ++1sScgPT4gJ9i32YXYrScsCifvtbInID0+ICfYt9mF2K0nLAon77WzJyA9PiAn2LfZhdmFJywKJ++1tCcgPT4gJ9i32YXZiicsCifvtbUnID0+ICfYudis2YUnLAon77W2JyA9PiAn2LnZhdmFJywKJ++1tycgPT4gJ9i52YXZhScsCifvtbgnID0+ICfYudmF2YknLAon77W5JyA9PiAn2LrZhdmFJywKJ++1uicgPT4gJ9i62YXZiicsCifvtbsnID0+ICfYutmF2YknLAon77W8JyA9PiAn2YHYrtmFJywKJ++1vScgPT4gJ9mB2K7ZhScsCifvtb4nID0+ICfZgtmF2K0nLAon77W/JyA9PiAn2YLZhdmFJywKJ++2gCcgPT4gJ9mE2K3ZhScsCifvtoEnID0+ICfZhNit2YonLAon77aCJyA9PiAn2YTYrdmJJywKJ++2gycgPT4gJ9mE2KzYrCcsCifvtoQnID0+ICfZhNis2KwnLAon77aFJyA9PiAn2YTYrtmFJywKJ++2hicgPT4gJ9mE2K7ZhScsCifvtocnID0+ICfZhNmF2K0nLAon77aIJyA9PiAn2YTZhditJywKJ++2iScgPT4gJ9mF2K3YrCcsCifvtoonID0+ICfZhdit2YUnLAon77aLJyA9PiAn2YXYrdmKJywKJ++2jCcgPT4gJ9mF2KzYrScsCifvto0nID0+ICfZhdis2YUnLAon77aOJyA9PiAn2YXYrtisJywKJ++2jycgPT4gJ9mF2K7ZhScsCifvtpInID0+ICfZhdis2K4nLAon77aTJyA9PiAn2YfZhdisJywKJ++2lCcgPT4gJ9mH2YXZhScsCifvtpUnID0+ICfZhtit2YUnLAon77aWJyA9PiAn2YbYrdmJJywKJ++2lycgPT4gJ9mG2KzZhScsCifvtpgnID0+ICfZhtis2YUnLAon77aZJyA9PiAn2YbYrNmJJywKJ++2micgPT4gJ9mG2YXZiicsCifvtpsnID0+ICfZhtmF2YknLAon77acJyA9PiAn2YrZhdmFJywKJ++2nScgPT4gJ9mK2YXZhScsCifvtp4nID0+ICfYqNiu2YonLAon77afJyA9PiAn2KrYrNmKJywKJ++2oCcgPT4gJ9iq2KzZiScsCifvtqEnID0+ICfYqtiu2YonLAon77aiJyA9PiAn2KrYrtmJJywKJ++2oycgPT4gJ9iq2YXZiicsCifvtqQnID0+ICfYqtmF2YknLAon77alJyA9PiAn2KzZhdmKJywKJ++2picgPT4gJ9is2K3ZiScsCifvtqcnID0+ICfYrNmF2YknLAon77aoJyA9PiAn2LPYrtmJJywKJ++2qScgPT4gJ9i12K3ZiicsCifvtqonID0+ICfYtNit2YonLAon77arJyA9PiAn2LbYrdmKJywKJ++2rCcgPT4gJ9mE2KzZiicsCifvtq0nID0+ICfZhNmF2YonLAon77auJyA9PiAn2YrYrdmKJywKJ++2rycgPT4gJ9mK2KzZiicsCifvtrAnID0+ICfZitmF2YonLAon77axJyA9PiAn2YXZhdmKJywKJ++2sicgPT4gJ9mC2YXZiicsCifvtrMnID0+ICfZhtit2YonLAon77a0JyA9PiAn2YLZhditJywKJ++2tScgPT4gJ9mE2K3ZhScsCifvtrYnID0+ICfYudmF2YonLAon77a3JyA9PiAn2YPZhdmKJywKJ++2uCcgPT4gJ9mG2KzYrScsCifvtrknID0+ICfZhdiu2YonLAon77a6JyA9PiAn2YTYrNmFJywKJ++2uycgPT4gJ9mD2YXZhScsCifvtrwnID0+ICfZhNis2YUnLAon77a9JyA9PiAn2YbYrNitJywKJ++2vicgPT4gJ9is2K3ZiicsCifvtr8nID0+ICfYrdis2YonLAon77eAJyA9PiAn2YXYrNmKJywKJ++3gScgPT4gJ9mB2YXZiicsCifvt4InID0+ICfYqNit2YonLAon77eDJyA9PiAn2YPZhdmFJywKJ++3hCcgPT4gJ9i52KzZhScsCifvt4UnID0+ICfYtdmF2YUnLAon77eGJyA9PiAn2LPYrtmKJywKJ++3hycgPT4gJ9mG2KzZiicsCifvt7AnID0+ICfYtdmE25InLAon77exJyA9PiAn2YLZhNuSJywKJ++3sicgPT4gJ9in2YTZhNmHJywKJ++3sycgPT4gJ9in2YPYqNixJywKJ++3tCcgPT4gJ9mF2K3ZhdivJywKJ++3tScgPT4gJ9i12YTYudmFJywKJ++3ticgPT4gJ9ix2LPZiNmEJywKJ++3tycgPT4gJ9i52YTZitmHJywKJ++3uCcgPT4gJ9mI2LPZhNmFJywKJ++3uScgPT4gJ9i12YTZiScsCifvt7onID0+ICfYtdmE2Ykg2KfZhNmE2Ycg2LnZhNmK2Ycg2YjYs9mE2YUnLAon77e7JyA9PiAn2KzZhCDYrNmE2KfZhNmHJywKJ++3vCcgPT4gJ9ix24zYp9mEJywKJ++4kCcgPT4gJywnLAon77iRJyA9PiAn44CBJywKJ++4kicgPT4gJ+OAgicsCifvuJMnID0+ICc6JywKJ++4lCcgPT4gJzsnLAon77iVJyA9PiAnIScsCifvuJYnID0+ICc/JywKJ++4lycgPT4gJ+OAlicsCifvuJgnID0+ICfjgJcnLAon77iZJyA9PiAnLi4uJywKJ++4sCcgPT4gJy4uJywKJ++4sScgPT4gJ+KAlCcsCifvuLInID0+ICfigJMnLAon77izJyA9PiAnXycsCifvuLQnID0+ICdfJywKJ++4tScgPT4gJygnLAon77i2JyA9PiAnKScsCifvuLcnID0+ICd7JywKJ++4uCcgPT4gJ30nLAon77i5JyA9PiAn44CUJywKJ++4uicgPT4gJ+OAlScsCifvuLsnID0+ICfjgJAnLAon77i8JyA9PiAn44CRJywKJ++4vScgPT4gJ+OAiicsCifvuL4nID0+ICfjgIsnLAon77i/JyA9PiAn44CIJywKJ++5gCcgPT4gJ+OAiScsCifvuYEnID0+ICfjgIwnLAon77mCJyA9PiAn44CNJywKJ++5gycgPT4gJ+OAjicsCifvuYQnID0+ICfjgI8nLAon77mHJyA9PiAnWycsCifvuYgnID0+ICddJywKJ++5iScgPT4gJyDMhScsCifvuYonID0+ICcgzIUnLAon77mLJyA9PiAnIMyFJywKJ++5jCcgPT4gJyDMhScsCifvuY0nID0+ICdfJywKJ++5jicgPT4gJ18nLAon77mPJyA9PiAnXycsCifvuZAnID0+ICcsJywKJ++5kScgPT4gJ+OAgScsCifvuZInID0+ICcuJywKJ++5lCcgPT4gJzsnLAon77mVJyA9PiAnOicsCifvuZYnID0+ICc/JywKJ++5lycgPT4gJyEnLAon77mYJyA9PiAn4oCUJywKJ++5mScgPT4gJygnLAon77maJyA9PiAnKScsCifvuZsnID0+ICd7JywKJ++5nCcgPT4gJ30nLAon77mdJyA9PiAn44CUJywKJ++5nicgPT4gJ+OAlScsCifvuZ8nID0+ICcjJywKJ++5oCcgPT4gJyYnLAon77mhJyA9PiAnKicsCifvuaInID0+ICcrJywKJ++5oycgPT4gJy0nLAon77mkJyA9PiAnPCcsCifvuaUnID0+ICc+JywKJ++5picgPT4gJz0nLAon77moJyA9PiAnXFwnLAon77mpJyA9PiAnJCcsCifvuaonID0+ICclJywKJ++5qycgPT4gJ0AnLAon77mwJyA9PiAnINmLJywKJ++5sScgPT4gJ9mA2YsnLAon77myJyA9PiAnINmMJywKJ++5tCcgPT4gJyDZjScsCifvubYnID0+ICcg2Y4nLAon77m3JyA9PiAn2YDZjicsCifvubgnID0+ICcg2Y8nLAon77m5JyA9PiAn2YDZjycsCifvubonID0+ICcg2ZAnLAon77m7JyA9PiAn2YDZkCcsCifvubwnID0+ICcg2ZEnLAon77m9JyA9PiAn2YDZkScsCifvub4nID0+ICcg2ZInLAon77m/JyA9PiAn2YDZkicsCifvuoAnID0+ICfYoScsCifvuoEnID0+ICfYp9mTJywKJ++6gicgPT4gJ9in2ZMnLAon77qDJyA9PiAn2KfZlCcsCifvuoQnID0+ICfYp9mUJywKJ++6hScgPT4gJ9mI2ZQnLAon77qGJyA9PiAn2YjZlCcsCifvuocnID0+ICfYp9mVJywKJ++6iCcgPT4gJ9in2ZUnLAon77qJJyA9PiAn2YrZlCcsCifvuoonID0+ICfZitmUJywKJ++6iycgPT4gJ9mK2ZQnLAon77qMJyA9PiAn2YrZlCcsCifvuo0nID0+ICfYpycsCifvuo4nID0+ICfYpycsCifvuo8nID0+ICfYqCcsCifvupAnID0+ICfYqCcsCifvupEnID0+ICfYqCcsCifvupInID0+ICfYqCcsCifvupMnID0+ICfYqScsCifvupQnID0+ICfYqScsCifvupUnID0+ICfYqicsCifvupYnID0+ICfYqicsCifvupcnID0+ICfYqicsCifvupgnID0+ICfYqicsCifvupknID0+ICfYqycsCifvuponID0+ICfYqycsCifvupsnID0+ICfYqycsCifvupwnID0+ICfYqycsCifvup0nID0+ICfYrCcsCifvup4nID0+ICfYrCcsCifvup8nID0+ICfYrCcsCifvuqAnID0+ICfYrCcsCifvuqEnID0+ICfYrScsCifvuqInID0+ICfYrScsCifvuqMnID0+ICfYrScsCifvuqQnID0+ICfYrScsCifvuqUnID0+ICfYricsCifvuqYnID0+ICfYricsCifvuqcnID0+ICfYricsCifvuqgnID0+ICfYricsCifvuqknID0+ICfYrycsCifvuqonID0+ICfYrycsCifvuqsnID0+ICfYsCcsCifvuqwnID0+ICfYsCcsCifvuq0nID0+ICfYsScsCifvuq4nID0+ICfYsScsCifvuq8nID0+ICfYsicsCifvurAnID0+ICfYsicsCifvurEnID0+ICfYsycsCifvurInID0+ICfYsycsCifvurMnID0+ICfYsycsCifvurQnID0+ICfYsycsCifvurUnID0+ICfYtCcsCifvurYnID0+ICfYtCcsCifvurcnID0+ICfYtCcsCifvurgnID0+ICfYtCcsCifvurknID0+ICfYtScsCifvuronID0+ICfYtScsCifvursnID0+ICfYtScsCifvurwnID0+ICfYtScsCifvur0nID0+ICfYticsCifvur4nID0+ICfYticsCifvur8nID0+ICfYticsCifvu4AnID0+ICfYticsCifvu4EnID0+ICfYtycsCifvu4InID0+ICfYtycsCifvu4MnID0+ICfYtycsCifvu4QnID0+ICfYtycsCifvu4UnID0+ICfYuCcsCifvu4YnID0+ICfYuCcsCifvu4cnID0+ICfYuCcsCifvu4gnID0+ICfYuCcsCifvu4knID0+ICfYuScsCifvu4onID0+ICfYuScsCifvu4snID0+ICfYuScsCifvu4wnID0+ICfYuScsCifvu40nID0+ICfYuicsCifvu44nID0+ICfYuicsCifvu48nID0+ICfYuicsCifvu5AnID0+ICfYuicsCifvu5EnID0+ICfZgScsCifvu5InID0+ICfZgScsCifvu5MnID0+ICfZgScsCifvu5QnID0+ICfZgScsCifvu5UnID0+ICfZgicsCifvu5YnID0+ICfZgicsCifvu5cnID0+ICfZgicsCifvu5gnID0+ICfZgicsCifvu5knID0+ICfZgycsCifvu5onID0+ICfZgycsCifvu5snID0+ICfZgycsCifvu5wnID0+ICfZgycsCifvu50nID0+ICfZhCcsCifvu54nID0+ICfZhCcsCifvu58nID0+ICfZhCcsCifvu6AnID0+ICfZhCcsCifvu6EnID0+ICfZhScsCifvu6InID0+ICfZhScsCifvu6MnID0+ICfZhScsCifvu6QnID0+ICfZhScsCifvu6UnID0+ICfZhicsCifvu6YnID0+ICfZhicsCifvu6cnID0+ICfZhicsCifvu6gnID0+ICfZhicsCifvu6knID0+ICfZhycsCifvu6onID0+ICfZhycsCifvu6snID0+ICfZhycsCifvu6wnID0+ICfZhycsCifvu60nID0+ICfZiCcsCifvu64nID0+ICfZiCcsCifvu68nID0+ICfZiScsCifvu7AnID0+ICfZiScsCifvu7EnID0+ICfZiicsCifvu7InID0+ICfZiicsCifvu7MnID0+ICfZiicsCifvu7QnID0+ICfZiicsCifvu7UnID0+ICfZhNin2ZMnLAon77u2JyA9PiAn2YTYp9mTJywKJ++7tycgPT4gJ9mE2KfZlCcsCifvu7gnID0+ICfZhNin2ZQnLAon77u5JyA9PiAn2YTYp9mVJywKJ++7uicgPT4gJ9mE2KfZlScsCifvu7snID0+ICfZhNinJywKJ++7vCcgPT4gJ9mE2KcnLAon77yBJyA9PiAnIScsCifvvIInID0+ICciJywKJ++8gycgPT4gJyMnLAon77yEJyA9PiAnJCcsCifvvIUnID0+ICclJywKJ++8hicgPT4gJyYnLAon77yHJyA9PiAnXCcnLAon77yIJyA9PiAnKCcsCifvvIknID0+ICcpJywKJ++8iicgPT4gJyonLAon77yLJyA9PiAnKycsCifvvIwnID0+ICcsJywKJ++8jScgPT4gJy0nLAon77yOJyA9PiAnLicsCifvvI8nID0+ICcvJywKJ++8kCcgPT4gJzAnLAon77yRJyA9PiAnMScsCifvvJInID0+ICcyJywKJ++8kycgPT4gJzMnLAon77yUJyA9PiAnNCcsCifvvJUnID0+ICc1JywKJ++8licgPT4gJzYnLAon77yXJyA9PiAnNycsCifvvJgnID0+ICc4JywKJ++8mScgPT4gJzknLAon77yaJyA9PiAnOicsCifvvJsnID0+ICc7JywKJ++8nCcgPT4gJzwnLAon77ydJyA9PiAnPScsCifvvJ4nID0+ICc+JywKJ++8nycgPT4gJz8nLAon77ygJyA9PiAnQCcsCifvvKEnID0+ICdBJywKJ++8oicgPT4gJ0InLAon77yjJyA9PiAnQycsCifvvKQnID0+ICdEJywKJ++8pScgPT4gJ0UnLAon77ymJyA9PiAnRicsCifvvKcnID0+ICdHJywKJ++8qCcgPT4gJ0gnLAon77ypJyA9PiAnSScsCifvvKonID0+ICdKJywKJ++8qycgPT4gJ0snLAon77ysJyA9PiAnTCcsCifvvK0nID0+ICdNJywKJ++8ricgPT4gJ04nLAon77yvJyA9PiAnTycsCifvvLAnID0+ICdQJywKJ++8sScgPT4gJ1EnLAon77yyJyA9PiAnUicsCifvvLMnID0+ICdTJywKJ++8tCcgPT4gJ1QnLAon77y1JyA9PiAnVScsCifvvLYnID0+ICdWJywKJ++8tycgPT4gJ1cnLAon77y4JyA9PiAnWCcsCifvvLknID0+ICdZJywKJ++8uicgPT4gJ1onLAon77y7JyA9PiAnWycsCifvvLwnID0+ICdcXCcsCifvvL0nID0+ICddJywKJ++8vicgPT4gJ14nLAon77y/JyA9PiAnXycsCifvvYAnID0+ICdgJywKJ++9gScgPT4gJ2EnLAon772CJyA9PiAnYicsCifvvYMnID0+ICdjJywKJ++9hCcgPT4gJ2QnLAon772FJyA9PiAnZScsCifvvYYnID0+ICdmJywKJ++9hycgPT4gJ2cnLAon772IJyA9PiAnaCcsCifvvYknID0+ICdpJywKJ++9iicgPT4gJ2onLAon772LJyA9PiAnaycsCifvvYwnID0+ICdsJywKJ++9jScgPT4gJ20nLAon772OJyA9PiAnbicsCifvvY8nID0+ICdvJywKJ++9kCcgPT4gJ3AnLAon772RJyA9PiAncScsCifvvZInID0+ICdyJywKJ++9kycgPT4gJ3MnLAon772UJyA9PiAndCcsCifvvZUnID0+ICd1JywKJ++9licgPT4gJ3YnLAon772XJyA9PiAndycsCifvvZgnID0+ICd4JywKJ++9mScgPT4gJ3knLAon772aJyA9PiAneicsCifvvZsnID0+ICd7JywKJ++9nCcgPT4gJ3wnLAon772dJyA9PiAnfScsCifvvZ4nID0+ICd+JywKJ++9nycgPT4gJ+KmhScsCifvvaAnID0+ICfipoYnLAon772hJyA9PiAn44CCJywKJ++9oicgPT4gJ+OAjCcsCifvvaMnID0+ICfjgI0nLAon772kJyA9PiAn44CBJywKJ++9pScgPT4gJ+ODuycsCifvvaYnID0+ICfjg7InLAon772nJyA9PiAn44KhJywKJ++9qCcgPT4gJ+OCoycsCifvvaknID0+ICfjgqUnLAon772qJyA9PiAn44KnJywKJ++9qycgPT4gJ+OCqScsCifvvawnID0+ICfjg6MnLAon772tJyA9PiAn44OlJywKJ++9ricgPT4gJ+ODpycsCifvva8nID0+ICfjg4MnLAon772wJyA9PiAn44O8JywKJ++9sScgPT4gJ+OCoicsCifvvbInID0+ICfjgqQnLAon772zJyA9PiAn44KmJywKJ++9tCcgPT4gJ+OCqCcsCifvvbUnID0+ICfjgqonLAon7722JyA9PiAn44KrJywKJ++9tycgPT4gJ+OCrScsCifvvbgnID0+ICfjgq8nLAon7725JyA9PiAn44KxJywKJ++9uicgPT4gJ+OCsycsCifvvbsnID0+ICfjgrUnLAon7728JyA9PiAn44K3JywKJ++9vScgPT4gJ+OCuScsCifvvb4nID0+ICfjgrsnLAon772/JyA9PiAn44K9JywKJ+++gCcgPT4gJ+OCvycsCifvvoEnID0+ICfjg4EnLAon776CJyA9PiAn44OEJywKJ+++gycgPT4gJ+ODhicsCifvvoQnID0+ICfjg4gnLAon776FJyA9PiAn44OKJywKJ+++hicgPT4gJ+ODiycsCifvvocnID0+ICfjg4wnLAon776IJyA9PiAn44ONJywKJ+++iScgPT4gJ+ODjicsCifvvoonID0+ICfjg48nLAon776LJyA9PiAn44OSJywKJ+++jCcgPT4gJ+ODlScsCifvvo0nID0+ICfjg5gnLAon776OJyA9PiAn44ObJywKJ+++jycgPT4gJ+ODnicsCifvvpAnID0+ICfjg58nLAon776RJyA9PiAn44OgJywKJ+++kicgPT4gJ+ODoScsCifvvpMnID0+ICfjg6InLAon776UJyA9PiAn44OkJywKJ+++lScgPT4gJ+ODpicsCifvvpYnID0+ICfjg6gnLAon776XJyA9PiAn44OpJywKJ+++mCcgPT4gJ+ODqicsCifvvpknID0+ICfjg6snLAon776aJyA9PiAn44OsJywKJ+++mycgPT4gJ+ODrScsCifvvpwnID0+ICfjg68nLAon776dJyA9PiAn44OzJywKJ+++nicgPT4gJ+OCmScsCifvvp8nID0+ICfjgponLAon776gJyA9PiAn4YWgJywKJ+++oScgPT4gJ+GEgCcsCifvvqInID0+ICfhhIEnLAon776jJyA9PiAn4YaqJywKJ+++pCcgPT4gJ+GEgicsCifvvqUnID0+ICfhhqwnLAon776mJyA9PiAn4YatJywKJ+++pycgPT4gJ+GEgycsCifvvqgnID0+ICfhhIQnLAon776pJyA9PiAn4YSFJywKJ+++qicgPT4gJ+GGsCcsCifvvqsnID0+ICfhhrEnLAon776sJyA9PiAn4YayJywKJ+++rScgPT4gJ+GGsycsCifvvq4nID0+ICfhhrQnLAon776vJyA9PiAn4Ya1JywKJ+++sCcgPT4gJ+GEmicsCifvvrEnID0+ICfhhIYnLAon776yJyA9PiAn4YSHJywKJ+++sycgPT4gJ+GEiCcsCifvvrQnID0+ICfhhKEnLAon7761JyA9PiAn4YSJJywKJ+++ticgPT4gJ+GEiicsCifvvrcnID0+ICfhhIsnLAon7764JyA9PiAn4YSMJywKJ+++uScgPT4gJ+GEjScsCifvvronID0+ICfhhI4nLAon7767JyA9PiAn4YSPJywKJ+++vCcgPT4gJ+GEkCcsCifvvr0nID0+ICfhhJEnLAon776+JyA9PiAn4YSSJywKJ++/gicgPT4gJ+GFoScsCifvv4MnID0+ICfhhaInLAon77+EJyA9PiAn4YWjJywKJ++/hScgPT4gJ+GFpCcsCifvv4YnID0+ICfhhaUnLAon77+HJyA9PiAn4YWmJywKJ++/iicgPT4gJ+GFpycsCifvv4snID0+ICfhhagnLAon77+MJyA9PiAn4YWpJywKJ++/jScgPT4gJ+GFqicsCifvv44nID0+ICfhhasnLAon77+PJyA9PiAn4YWsJywKJ++/kicgPT4gJ+GFrScsCifvv5MnID0+ICfhha4nLAon77+UJyA9PiAn4YWvJywKJ++/lScgPT4gJ+GFsCcsCifvv5YnID0+ICfhhbEnLAon77+XJyA9PiAn4YWyJywKJ++/micgPT4gJ+GFsycsCifvv5snID0+ICfhhbQnLAon77+cJyA9PiAn4YW1JywKJ++/oCcgPT4gJ8KiJywKJ++/oScgPT4gJ8KjJywKJ++/oicgPT4gJ8KsJywKJ++/oycgPT4gJyDMhCcsCifvv6QnID0+ICfCpicsCifvv6UnID0+ICfCpScsCifvv6YnID0+ICfigqknLAon77+oJyA9PiAn4pSCJywKJ++/qScgPT4gJ+KGkCcsCifvv6onID0+ICfihpEnLAon77+rJyA9PiAn4oaSJywKJ++/rCcgPT4gJ+KGkycsCifvv60nID0+ICfilqAnLAon77+uJyA9PiAn4peLJywKJ/CdkIAnID0+ICdBJywKJ/CdkIEnID0+ICdCJywKJ/CdkIInID0+ICdDJywKJ/CdkIMnID0+ICdEJywKJ/CdkIQnID0+ICdFJywKJ/CdkIUnID0+ICdGJywKJ/CdkIYnID0+ICdHJywKJ/CdkIcnID0+ICdIJywKJ/CdkIgnID0+ICdJJywKJ/CdkIknID0+ICdKJywKJ/CdkIonID0+ICdLJywKJ/CdkIsnID0+ICdMJywKJ/CdkIwnID0+ICdNJywKJ/CdkI0nID0+ICdOJywKJ/CdkI4nID0+ICdPJywKJ/CdkI8nID0+ICdQJywKJ/CdkJAnID0+ICdRJywKJ/CdkJEnID0+ICdSJywKJ/CdkJInID0+ICdTJywKJ/CdkJMnID0+ICdUJywKJ/CdkJQnID0+ICdVJywKJ/CdkJUnID0+ICdWJywKJ/CdkJYnID0+ICdXJywKJ/CdkJcnID0+ICdYJywKJ/CdkJgnID0+ICdZJywKJ/CdkJknID0+ICdaJywKJ/CdkJonID0+ICdhJywKJ/CdkJsnID0+ICdiJywKJ/CdkJwnID0+ICdjJywKJ/CdkJ0nID0+ICdkJywKJ/CdkJ4nID0+ICdlJywKJ/CdkJ8nID0+ICdmJywKJ/CdkKAnID0+ICdnJywKJ/CdkKEnID0+ICdoJywKJ/CdkKInID0+ICdpJywKJ/CdkKMnID0+ICdqJywKJ/CdkKQnID0+ICdrJywKJ/CdkKUnID0+ICdsJywKJ/CdkKYnID0+ICdtJywKJ/CdkKcnID0+ICduJywKJ/CdkKgnID0+ICdvJywKJ/CdkKknID0+ICdwJywKJ/CdkKonID0+ICdxJywKJ/CdkKsnID0+ICdyJywKJ/CdkKwnID0+ICdzJywKJ/CdkK0nID0+ICd0JywKJ/CdkK4nID0+ICd1JywKJ/CdkK8nID0+ICd2JywKJ/CdkLAnID0+ICd3JywKJ/CdkLEnID0+ICd4JywKJ/CdkLInID0+ICd5JywKJ/CdkLMnID0+ICd6JywKJ/CdkLQnID0+ICdBJywKJ/CdkLUnID0+ICdCJywKJ/CdkLYnID0+ICdDJywKJ/CdkLcnID0+ICdEJywKJ/CdkLgnID0+ICdFJywKJ/CdkLknID0+ICdGJywKJ/CdkLonID0+ICdHJywKJ/CdkLsnID0+ICdIJywKJ/CdkLwnID0+ICdJJywKJ/CdkL0nID0+ICdKJywKJ/CdkL4nID0+ICdLJywKJ/CdkL8nID0+ICdMJywKJ/CdkYAnID0+ICdNJywKJ/CdkYEnID0+ICdOJywKJ/CdkYInID0+ICdPJywKJ/CdkYMnID0+ICdQJywKJ/CdkYQnID0+ICdRJywKJ/CdkYUnID0+ICdSJywKJ/CdkYYnID0+ICdTJywKJ/CdkYcnID0+ICdUJywKJ/CdkYgnID0+ICdVJywKJ/CdkYknID0+ICdWJywKJ/CdkYonID0+ICdXJywKJ/CdkYsnID0+ICdYJywKJ/CdkYwnID0+ICdZJywKJ/CdkY0nID0+ICdaJywKJ/CdkY4nID0+ICdhJywKJ/CdkY8nID0+ICdiJywKJ/CdkZAnID0+ICdjJywKJ/CdkZEnID0+ICdkJywKJ/CdkZInID0+ICdlJywKJ/CdkZMnID0+ICdmJywKJ/CdkZQnID0+ICdnJywKJ/CdkZYnID0+ICdpJywKJ/CdkZcnID0+ICdqJywKJ/CdkZgnID0+ICdrJywKJ/CdkZknID0+ICdsJywKJ/CdkZonID0+ICdtJywKJ/CdkZsnID0+ICduJywKJ/CdkZwnID0+ICdvJywKJ/CdkZ0nID0+ICdwJywKJ/CdkZ4nID0+ICdxJywKJ/CdkZ8nID0+ICdyJywKJ/CdkaAnID0+ICdzJywKJ/CdkaEnID0+ICd0JywKJ/CdkaInID0+ICd1JywKJ/CdkaMnID0+ICd2JywKJ/CdkaQnID0+ICd3JywKJ/CdkaUnID0+ICd4JywKJ/CdkaYnID0+ICd5JywKJ/CdkacnID0+ICd6JywKJ/CdkagnID0+ICdBJywKJ/CdkaknID0+ICdCJywKJ/CdkaonID0+ICdDJywKJ/CdkasnID0+ICdEJywKJ/CdkawnID0+ICdFJywKJ/Cdka0nID0+ICdGJywKJ/Cdka4nID0+ICdHJywKJ/Cdka8nID0+ICdIJywKJ/CdkbAnID0+ICdJJywKJ/CdkbEnID0+ICdKJywKJ/CdkbInID0+ICdLJywKJ/CdkbMnID0+ICdMJywKJ/CdkbQnID0+ICdNJywKJ/CdkbUnID0+ICdOJywKJ/CdkbYnID0+ICdPJywKJ/CdkbcnID0+ICdQJywKJ/CdkbgnID0+ICdRJywKJ/CdkbknID0+ICdSJywKJ/CdkbonID0+ICdTJywKJ/CdkbsnID0+ICdUJywKJ/CdkbwnID0+ICdVJywKJ/Cdkb0nID0+ICdWJywKJ/Cdkb4nID0+ICdXJywKJ/Cdkb8nID0+ICdYJywKJ/CdkoAnID0+ICdZJywKJ/CdkoEnID0+ICdaJywKJ/CdkoInID0+ICdhJywKJ/CdkoMnID0+ICdiJywKJ/CdkoQnID0+ICdjJywKJ/CdkoUnID0+ICdkJywKJ/CdkoYnID0+ICdlJywKJ/CdkocnID0+ICdmJywKJ/CdkognID0+ICdnJywKJ/CdkoknID0+ICdoJywKJ/CdkoonID0+ICdpJywKJ/CdkosnID0+ICdqJywKJ/CdkownID0+ICdrJywKJ/Cdko0nID0+ICdsJywKJ/Cdko4nID0+ICdtJywKJ/Cdko8nID0+ICduJywKJ/CdkpAnID0+ICdvJywKJ/CdkpEnID0+ICdwJywKJ/CdkpInID0+ICdxJywKJ/CdkpMnID0+ICdyJywKJ/CdkpQnID0+ICdzJywKJ/CdkpUnID0+ICd0JywKJ/CdkpYnID0+ICd1JywKJ/CdkpcnID0+ICd2JywKJ/CdkpgnID0+ICd3JywKJ/CdkpknID0+ICd4JywKJ/CdkponID0+ICd5JywKJ/CdkpsnID0+ICd6JywKJ/CdkpwnID0+ICdBJywKJ/Cdkp4nID0+ICdDJywKJ/Cdkp8nID0+ICdEJywKJ/CdkqInID0+ICdHJywKJ/CdkqUnID0+ICdKJywKJ/CdkqYnID0+ICdLJywKJ/CdkqknID0+ICdOJywKJ/CdkqonID0+ICdPJywKJ/CdkqsnID0+ICdQJywKJ/CdkqwnID0+ICdRJywKJ/Cdkq4nID0+ICdTJywKJ/Cdkq8nID0+ICdUJywKJ/CdkrAnID0+ICdVJywKJ/CdkrEnID0+ICdWJywKJ/CdkrInID0+ICdXJywKJ/CdkrMnID0+ICdYJywKJ/CdkrQnID0+ICdZJywKJ/CdkrUnID0+ICdaJywKJ/CdkrYnID0+ICdhJywKJ/CdkrcnID0+ICdiJywKJ/CdkrgnID0+ICdjJywKJ/CdkrknID0+ICdkJywKJ/CdkrsnID0+ICdmJywKJ/Cdkr0nID0+ICdoJywKJ/Cdkr4nID0+ICdpJywKJ/Cdkr8nID0+ICdqJywKJ/Cdk4AnID0+ICdrJywKJ/Cdk4EnID0+ICdsJywKJ/Cdk4InID0+ICdtJywKJ/Cdk4MnID0+ICduJywKJ/Cdk4UnID0+ICdwJywKJ/Cdk4YnID0+ICdxJywKJ/Cdk4cnID0+ICdyJywKJ/Cdk4gnID0+ICdzJywKJ/Cdk4knID0+ICd0JywKJ/Cdk4onID0+ICd1JywKJ/Cdk4snID0+ICd2JywKJ/Cdk4wnID0+ICd3JywKJ/Cdk40nID0+ICd4JywKJ/Cdk44nID0+ICd5JywKJ/Cdk48nID0+ICd6JywKJ/Cdk5AnID0+ICdBJywKJ/Cdk5EnID0+ICdCJywKJ/Cdk5InID0+ICdDJywKJ/Cdk5MnID0+ICdEJywKJ/Cdk5QnID0+ICdFJywKJ/Cdk5UnID0+ICdGJywKJ/Cdk5YnID0+ICdHJywKJ/Cdk5cnID0+ICdIJywKJ/Cdk5gnID0+ICdJJywKJ/Cdk5knID0+ICdKJywKJ/Cdk5onID0+ICdLJywKJ/Cdk5snID0+ICdMJywKJ/Cdk5wnID0+ICdNJywKJ/Cdk50nID0+ICdOJywKJ/Cdk54nID0+ICdPJywKJ/Cdk58nID0+ICdQJywKJ/Cdk6AnID0+ICdRJywKJ/Cdk6EnID0+ICdSJywKJ/Cdk6InID0+ICdTJywKJ/Cdk6MnID0+ICdUJywKJ/Cdk6QnID0+ICdVJywKJ/Cdk6UnID0+ICdWJywKJ/Cdk6YnID0+ICdXJywKJ/Cdk6cnID0+ICdYJywKJ/Cdk6gnID0+ICdZJywKJ/Cdk6knID0+ICdaJywKJ/Cdk6onID0+ICdhJywKJ/Cdk6snID0+ICdiJywKJ/Cdk6wnID0+ICdjJywKJ/Cdk60nID0+ICdkJywKJ/Cdk64nID0+ICdlJywKJ/Cdk68nID0+ICdmJywKJ/Cdk7AnID0+ICdnJywKJ/Cdk7EnID0+ICdoJywKJ/Cdk7InID0+ICdpJywKJ/Cdk7MnID0+ICdqJywKJ/Cdk7QnID0+ICdrJywKJ/Cdk7UnID0+ICdsJywKJ/Cdk7YnID0+ICdtJywKJ/Cdk7cnID0+ICduJywKJ/Cdk7gnID0+ICdvJywKJ/Cdk7knID0+ICdwJywKJ/Cdk7onID0+ICdxJywKJ/Cdk7snID0+ICdyJywKJ/Cdk7wnID0+ICdzJywKJ/Cdk70nID0+ICd0JywKJ/Cdk74nID0+ICd1JywKJ/Cdk78nID0+ICd2JywKJ/CdlIAnID0+ICd3JywKJ/CdlIEnID0+ICd4JywKJ/CdlIInID0+ICd5JywKJ/CdlIMnID0+ICd6JywKJ/CdlIQnID0+ICdBJywKJ/CdlIUnID0+ICdCJywKJ/CdlIcnID0+ICdEJywKJ/CdlIgnID0+ICdFJywKJ/CdlIknID0+ICdGJywKJ/CdlIonID0+ICdHJywKJ/CdlI0nID0+ICdKJywKJ/CdlI4nID0+ICdLJywKJ/CdlI8nID0+ICdMJywKJ/CdlJAnID0+ICdNJywKJ/CdlJEnID0+ICdOJywKJ/CdlJInID0+ICdPJywKJ/CdlJMnID0+ICdQJywKJ/CdlJQnID0+ICdRJywKJ/CdlJYnID0+ICdTJywKJ/CdlJcnID0+ICdUJywKJ/CdlJgnID0+ICdVJywKJ/CdlJknID0+ICdWJywKJ/CdlJonID0+ICdXJywKJ/CdlJsnID0+ICdYJywKJ/CdlJwnID0+ICdZJywKJ/CdlJ4nID0+ICdhJywKJ/CdlJ8nID0+ICdiJywKJ/CdlKAnID0+ICdjJywKJ/CdlKEnID0+ICdkJywKJ/CdlKInID0+ICdlJywKJ/CdlKMnID0+ICdmJywKJ/CdlKQnID0+ICdnJywKJ/CdlKUnID0+ICdoJywKJ/CdlKYnID0+ICdpJywKJ/CdlKcnID0+ICdqJywKJ/CdlKgnID0+ICdrJywKJ/CdlKknID0+ICdsJywKJ/CdlKonID0+ICdtJywKJ/CdlKsnID0+ICduJywKJ/CdlKwnID0+ICdvJywKJ/CdlK0nID0+ICdwJywKJ/CdlK4nID0+ICdxJywKJ/CdlK8nID0+ICdyJywKJ/CdlLAnID0+ICdzJywKJ/CdlLEnID0+ICd0JywKJ/CdlLInID0+ICd1JywKJ/CdlLMnID0+ICd2JywKJ/CdlLQnID0+ICd3JywKJ/CdlLUnID0+ICd4JywKJ/CdlLYnID0+ICd5JywKJ/CdlLcnID0+ICd6JywKJ/CdlLgnID0+ICdBJywKJ/CdlLknID0+ICdCJywKJ/CdlLsnID0+ICdEJywKJ/CdlLwnID0+ICdFJywKJ/CdlL0nID0+ICdGJywKJ/CdlL4nID0+ICdHJywKJ/CdlYAnID0+ICdJJywKJ/CdlYEnID0+ICdKJywKJ/CdlYInID0+ICdLJywKJ/CdlYMnID0+ICdMJywKJ/CdlYQnID0+ICdNJywKJ/CdlYYnID0+ICdPJywKJ/CdlYonID0+ICdTJywKJ/CdlYsnID0+ICdUJywKJ/CdlYwnID0+ICdVJywKJ/CdlY0nID0+ICdWJywKJ/CdlY4nID0+ICdXJywKJ/CdlY8nID0+ICdYJywKJ/CdlZAnID0+ICdZJywKJ/CdlZInID0+ICdhJywKJ/CdlZMnID0+ICdiJywKJ/CdlZQnID0+ICdjJywKJ/CdlZUnID0+ICdkJywKJ/CdlZYnID0+ICdlJywKJ/CdlZcnID0+ICdmJywKJ/CdlZgnID0+ICdnJywKJ/CdlZknID0+ICdoJywKJ/CdlZonID0+ICdpJywKJ/CdlZsnID0+ICdqJywKJ/CdlZwnID0+ICdrJywKJ/CdlZ0nID0+ICdsJywKJ/CdlZ4nID0+ICdtJywKJ/CdlZ8nID0+ICduJywKJ/CdlaAnID0+ICdvJywKJ/CdlaEnID0+ICdwJywKJ/CdlaInID0+ICdxJywKJ/CdlaMnID0+ICdyJywKJ/CdlaQnID0+ICdzJywKJ/CdlaUnID0+ICd0JywKJ/CdlaYnID0+ICd1JywKJ/CdlacnID0+ICd2JywKJ/CdlagnID0+ICd3JywKJ/CdlaknID0+ICd4JywKJ/CdlaonID0+ICd5JywKJ/CdlasnID0+ICd6JywKJ/CdlawnID0+ICdBJywKJ/Cdla0nID0+ICdCJywKJ/Cdla4nID0+ICdDJywKJ/Cdla8nID0+ICdEJywKJ/CdlbAnID0+ICdFJywKJ/CdlbEnID0+ICdGJywKJ/CdlbInID0+ICdHJywKJ/CdlbMnID0+ICdIJywKJ/CdlbQnID0+ICdJJywKJ/CdlbUnID0+ICdKJywKJ/CdlbYnID0+ICdLJywKJ/CdlbcnID0+ICdMJywKJ/CdlbgnID0+ICdNJywKJ/CdlbknID0+ICdOJywKJ/CdlbonID0+ICdPJywKJ/CdlbsnID0+ICdQJywKJ/CdlbwnID0+ICdRJywKJ/Cdlb0nID0+ICdSJywKJ/Cdlb4nID0+ICdTJywKJ/Cdlb8nID0+ICdUJywKJ/CdloAnID0+ICdVJywKJ/CdloEnID0+ICdWJywKJ/CdloInID0+ICdXJywKJ/CdloMnID0+ICdYJywKJ/CdloQnID0+ICdZJywKJ/CdloUnID0+ICdaJywKJ/CdloYnID0+ICdhJywKJ/CdlocnID0+ICdiJywKJ/CdlognID0+ICdjJywKJ/CdloknID0+ICdkJywKJ/CdloonID0+ICdlJywKJ/CdlosnID0+ICdmJywKJ/CdlownID0+ICdnJywKJ/Cdlo0nID0+ICdoJywKJ/Cdlo4nID0+ICdpJywKJ/Cdlo8nID0+ICdqJywKJ/CdlpAnID0+ICdrJywKJ/CdlpEnID0+ICdsJywKJ/CdlpInID0+ICdtJywKJ/CdlpMnID0+ICduJywKJ/CdlpQnID0+ICdvJywKJ/CdlpUnID0+ICdwJywKJ/CdlpYnID0+ICdxJywKJ/CdlpcnID0+ICdyJywKJ/CdlpgnID0+ICdzJywKJ/CdlpknID0+ICd0JywKJ/CdlponID0+ICd1JywKJ/CdlpsnID0+ICd2JywKJ/CdlpwnID0+ICd3JywKJ/Cdlp0nID0+ICd4JywKJ/Cdlp4nID0+ICd5JywKJ/Cdlp8nID0+ICd6JywKJ/CdlqAnID0+ICdBJywKJ/CdlqEnID0+ICdCJywKJ/CdlqInID0+ICdDJywKJ/CdlqMnID0+ICdEJywKJ/CdlqQnID0+ICdFJywKJ/CdlqUnID0+ICdGJywKJ/CdlqYnID0+ICdHJywKJ/CdlqcnID0+ICdIJywKJ/CdlqgnID0+ICdJJywKJ/CdlqknID0+ICdKJywKJ/CdlqonID0+ICdLJywKJ/CdlqsnID0+ICdMJywKJ/CdlqwnID0+ICdNJywKJ/Cdlq0nID0+ICdOJywKJ/Cdlq4nID0+ICdPJywKJ/Cdlq8nID0+ICdQJywKJ/CdlrAnID0+ICdRJywKJ/CdlrEnID0+ICdSJywKJ/CdlrInID0+ICdTJywKJ/CdlrMnID0+ICdUJywKJ/CdlrQnID0+ICdVJywKJ/CdlrUnID0+ICdWJywKJ/CdlrYnID0+ICdXJywKJ/CdlrcnID0+ICdYJywKJ/CdlrgnID0+ICdZJywKJ/CdlrknID0+ICdaJywKJ/CdlronID0+ICdhJywKJ/CdlrsnID0+ICdiJywKJ/CdlrwnID0+ICdjJywKJ/Cdlr0nID0+ICdkJywKJ/Cdlr4nID0+ICdlJywKJ/Cdlr8nID0+ICdmJywKJ/Cdl4AnID0+ICdnJywKJ/Cdl4EnID0+ICdoJywKJ/Cdl4InID0+ICdpJywKJ/Cdl4MnID0+ICdqJywKJ/Cdl4QnID0+ICdrJywKJ/Cdl4UnID0+ICdsJywKJ/Cdl4YnID0+ICdtJywKJ/Cdl4cnID0+ICduJywKJ/Cdl4gnID0+ICdvJywKJ/Cdl4knID0+ICdwJywKJ/Cdl4onID0+ICdxJywKJ/Cdl4snID0+ICdyJywKJ/Cdl4wnID0+ICdzJywKJ/Cdl40nID0+ICd0JywKJ/Cdl44nID0+ICd1JywKJ/Cdl48nID0+ICd2JywKJ/Cdl5AnID0+ICd3JywKJ/Cdl5EnID0+ICd4JywKJ/Cdl5InID0+ICd5JywKJ/Cdl5MnID0+ICd6JywKJ/Cdl5QnID0+ICdBJywKJ/Cdl5UnID0+ICdCJywKJ/Cdl5YnID0+ICdDJywKJ/Cdl5cnID0+ICdEJywKJ/Cdl5gnID0+ICdFJywKJ/Cdl5knID0+ICdGJywKJ/Cdl5onID0+ICdHJywKJ/Cdl5snID0+ICdIJywKJ/Cdl5wnID0+ICdJJywKJ/Cdl50nID0+ICdKJywKJ/Cdl54nID0+ICdLJywKJ/Cdl58nID0+ICdMJywKJ/Cdl6AnID0+ICdNJywKJ/Cdl6EnID0+ICdOJywKJ/Cdl6InID0+ICdPJywKJ/Cdl6MnID0+ICdQJywKJ/Cdl6QnID0+ICdRJywKJ/Cdl6UnID0+ICdSJywKJ/Cdl6YnID0+ICdTJywKJ/Cdl6cnID0+ICdUJywKJ/Cdl6gnID0+ICdVJywKJ/Cdl6knID0+ICdWJywKJ/Cdl6onID0+ICdXJywKJ/Cdl6snID0+ICdYJywKJ/Cdl6wnID0+ICdZJywKJ/Cdl60nID0+ICdaJywKJ/Cdl64nID0+ICdhJywKJ/Cdl68nID0+ICdiJywKJ/Cdl7AnID0+ICdjJywKJ/Cdl7EnID0+ICdkJywKJ/Cdl7InID0+ICdlJywKJ/Cdl7MnID0+ICdmJywKJ/Cdl7QnID0+ICdnJywKJ/Cdl7UnID0+ICdoJywKJ/Cdl7YnID0+ICdpJywKJ/Cdl7cnID0+ICdqJywKJ/Cdl7gnID0+ICdrJywKJ/Cdl7knID0+ICdsJywKJ/Cdl7onID0+ICdtJywKJ/Cdl7snID0+ICduJywKJ/Cdl7wnID0+ICdvJywKJ/Cdl70nID0+ICdwJywKJ/Cdl74nID0+ICdxJywKJ/Cdl78nID0+ICdyJywKJ/CdmIAnID0+ICdzJywKJ/CdmIEnID0+ICd0JywKJ/CdmIInID0+ICd1JywKJ/CdmIMnID0+ICd2JywKJ/CdmIQnID0+ICd3JywKJ/CdmIUnID0+ICd4JywKJ/CdmIYnID0+ICd5JywKJ/CdmIcnID0+ICd6JywKJ/CdmIgnID0+ICdBJywKJ/CdmIknID0+ICdCJywKJ/CdmIonID0+ICdDJywKJ/CdmIsnID0+ICdEJywKJ/CdmIwnID0+ICdFJywKJ/CdmI0nID0+ICdGJywKJ/CdmI4nID0+ICdHJywKJ/CdmI8nID0+ICdIJywKJ/CdmJAnID0+ICdJJywKJ/CdmJEnID0+ICdKJywKJ/CdmJInID0+ICdLJywKJ/CdmJMnID0+ICdMJywKJ/CdmJQnID0+ICdNJywKJ/CdmJUnID0+ICdOJywKJ/CdmJYnID0+ICdPJywKJ/CdmJcnID0+ICdQJywKJ/CdmJgnID0+ICdRJywKJ/CdmJknID0+ICdSJywKJ/CdmJonID0+ICdTJywKJ/CdmJsnID0+ICdUJywKJ/CdmJwnID0+ICdVJywKJ/CdmJ0nID0+ICdWJywKJ/CdmJ4nID0+ICdXJywKJ/CdmJ8nID0+ICdYJywKJ/CdmKAnID0+ICdZJywKJ/CdmKEnID0+ICdaJywKJ/CdmKInID0+ICdhJywKJ/CdmKMnID0+ICdiJywKJ/CdmKQnID0+ICdjJywKJ/CdmKUnID0+ICdkJywKJ/CdmKYnID0+ICdlJywKJ/CdmKcnID0+ICdmJywKJ/CdmKgnID0+ICdnJywKJ/CdmKknID0+ICdoJywKJ/CdmKonID0+ICdpJywKJ/CdmKsnID0+ICdqJywKJ/CdmKwnID0+ICdrJywKJ/CdmK0nID0+ICdsJywKJ/CdmK4nID0+ICdtJywKJ/CdmK8nID0+ICduJywKJ/CdmLAnID0+ICdvJywKJ/CdmLEnID0+ICdwJywKJ/CdmLInID0+ICdxJywKJ/CdmLMnID0+ICdyJywKJ/CdmLQnID0+ICdzJywKJ/CdmLUnID0+ICd0JywKJ/CdmLYnID0+ICd1JywKJ/CdmLcnID0+ICd2JywKJ/CdmLgnID0+ICd3JywKJ/CdmLknID0+ICd4JywKJ/CdmLonID0+ICd5JywKJ/CdmLsnID0+ICd6JywKJ/CdmLwnID0+ICdBJywKJ/CdmL0nID0+ICdCJywKJ/CdmL4nID0+ICdDJywKJ/CdmL8nID0+ICdEJywKJ/CdmYAnID0+ICdFJywKJ/CdmYEnID0+ICdGJywKJ/CdmYInID0+ICdHJywKJ/CdmYMnID0+ICdIJywKJ/CdmYQnID0+ICdJJywKJ/CdmYUnID0+ICdKJywKJ/CdmYYnID0+ICdLJywKJ/CdmYcnID0+ICdMJywKJ/CdmYgnID0+ICdNJywKJ/CdmYknID0+ICdOJywKJ/CdmYonID0+ICdPJywKJ/CdmYsnID0+ICdQJywKJ/CdmYwnID0+ICdRJywKJ/CdmY0nID0+ICdSJywKJ/CdmY4nID0+ICdTJywKJ/CdmY8nID0+ICdUJywKJ/CdmZAnID0+ICdVJywKJ/CdmZEnID0+ICdWJywKJ/CdmZInID0+ICdXJywKJ/CdmZMnID0+ICdYJywKJ/CdmZQnID0+ICdZJywKJ/CdmZUnID0+ICdaJywKJ/CdmZYnID0+ICdhJywKJ/CdmZcnID0+ICdiJywKJ/CdmZgnID0+ICdjJywKJ/CdmZknID0+ICdkJywKJ/CdmZonID0+ICdlJywKJ/CdmZsnID0+ICdmJywKJ/CdmZwnID0+ICdnJywKJ/CdmZ0nID0+ICdoJywKJ/CdmZ4nID0+ICdpJywKJ/CdmZ8nID0+ICdqJywKJ/CdmaAnID0+ICdrJywKJ/CdmaEnID0+ICdsJywKJ/CdmaInID0+ICdtJywKJ/CdmaMnID0+ICduJywKJ/CdmaQnID0+ICdvJywKJ/CdmaUnID0+ICdwJywKJ/CdmaYnID0+ICdxJywKJ/CdmacnID0+ICdyJywKJ/CdmagnID0+ICdzJywKJ/CdmaknID0+ICd0JywKJ/CdmaonID0+ICd1JywKJ/CdmasnID0+ICd2JywKJ/CdmawnID0+ICd3JywKJ/Cdma0nID0+ICd4JywKJ/Cdma4nID0+ICd5JywKJ/Cdma8nID0+ICd6JywKJ/CdmbAnID0+ICdBJywKJ/CdmbEnID0+ICdCJywKJ/CdmbInID0+ICdDJywKJ/CdmbMnID0+ICdEJywKJ/CdmbQnID0+ICdFJywKJ/CdmbUnID0+ICdGJywKJ/CdmbYnID0+ICdHJywKJ/CdmbcnID0+ICdIJywKJ/CdmbgnID0+ICdJJywKJ/CdmbknID0+ICdKJywKJ/CdmbonID0+ICdLJywKJ/CdmbsnID0+ICdMJywKJ/CdmbwnID0+ICdNJywKJ/Cdmb0nID0+ICdOJywKJ/Cdmb4nID0+ICdPJywKJ/Cdmb8nID0+ICdQJywKJ/CdmoAnID0+ICdRJywKJ/CdmoEnID0+ICdSJywKJ/CdmoInID0+ICdTJywKJ/CdmoMnID0+ICdUJywKJ/CdmoQnID0+ICdVJywKJ/CdmoUnID0+ICdWJywKJ/CdmoYnID0+ICdXJywKJ/CdmocnID0+ICdYJywKJ/CdmognID0+ICdZJywKJ/CdmoknID0+ICdaJywKJ/CdmoonID0+ICdhJywKJ/CdmosnID0+ICdiJywKJ/CdmownID0+ICdjJywKJ/Cdmo0nID0+ICdkJywKJ/Cdmo4nID0+ICdlJywKJ/Cdmo8nID0+ICdmJywKJ/CdmpAnID0+ICdnJywKJ/CdmpEnID0+ICdoJywKJ/CdmpInID0+ICdpJywKJ/CdmpMnID0+ICdqJywKJ/CdmpQnID0+ICdrJywKJ/CdmpUnID0+ICdsJywKJ/CdmpYnID0+ICdtJywKJ/CdmpcnID0+ICduJywKJ/CdmpgnID0+ICdvJywKJ/CdmpknID0+ICdwJywKJ/CdmponID0+ICdxJywKJ/CdmpsnID0+ICdyJywKJ/CdmpwnID0+ICdzJywKJ/Cdmp0nID0+ICd0JywKJ/Cdmp4nID0+ICd1JywKJ/Cdmp8nID0+ICd2JywKJ/CdmqAnID0+ICd3JywKJ/CdmqEnID0+ICd4JywKJ/CdmqInID0+ICd5JywKJ/CdmqMnID0+ICd6JywKJ/CdmqQnID0+ICfEsScsCifwnZqlJyA9PiAnyLcnLAon8J2aqCcgPT4gJ86RJywKJ/CdmqknID0+ICfOkicsCifwnZqqJyA9PiAnzpMnLAon8J2aqycgPT4gJ86UJywKJ/CdmqwnID0+ICfOlScsCifwnZqtJyA9PiAnzpYnLAon8J2aricgPT4gJ86XJywKJ/Cdmq8nID0+ICfOmCcsCifwnZqwJyA9PiAnzpknLAon8J2asScgPT4gJ86aJywKJ/CdmrInID0+ICfOmycsCifwnZqzJyA9PiAnzpwnLAon8J2atCcgPT4gJ86dJywKJ/CdmrUnID0+ICfOnicsCifwnZq2JyA9PiAnzp8nLAon8J2atycgPT4gJ86gJywKJ/CdmrgnID0+ICfOoScsCifwnZq5JyA9PiAnzpgnLAon8J2auicgPT4gJ86jJywKJ/CdmrsnID0+ICfOpCcsCifwnZq8JyA9PiAnzqUnLAon8J2avScgPT4gJ86mJywKJ/Cdmr4nID0+ICfOpycsCifwnZq/JyA9PiAnzqgnLAon8J2bgCcgPT4gJ86pJywKJ/Cdm4EnID0+ICfiiIcnLAon8J2bgicgPT4gJ86xJywKJ/Cdm4MnID0+ICfOsicsCifwnZuEJyA9PiAnzrMnLAon8J2bhScgPT4gJ860JywKJ/Cdm4YnID0+ICfOtScsCifwnZuHJyA9PiAnzrYnLAon8J2biCcgPT4gJ863JywKJ/Cdm4knID0+ICfOuCcsCifwnZuKJyA9PiAnzrknLAon8J2biycgPT4gJ866JywKJ/Cdm4wnID0+ICfOuycsCifwnZuNJyA9PiAnzrwnLAon8J2bjicgPT4gJ869JywKJ/Cdm48nID0+ICfOvicsCifwnZuQJyA9PiAnzr8nLAon8J2bkScgPT4gJ8+AJywKJ/Cdm5InID0+ICfPgScsCifwnZuTJyA9PiAnz4InLAon8J2blCcgPT4gJ8+DJywKJ/Cdm5UnID0+ICfPhCcsCifwnZuWJyA9PiAnz4UnLAon8J2blycgPT4gJ8+GJywKJ/Cdm5gnID0+ICfPhycsCifwnZuZJyA9PiAnz4gnLAon8J2bmicgPT4gJ8+JJywKJ/Cdm5snID0+ICfiiIInLAon8J2bnCcgPT4gJ861JywKJ/Cdm50nID0+ICfOuCcsCifwnZueJyA9PiAnzronLAon8J2bnycgPT4gJ8+GJywKJ/Cdm6AnID0+ICfPgScsCifwnZuhJyA9PiAnz4AnLAon8J2boicgPT4gJ86RJywKJ/Cdm6MnID0+ICfOkicsCifwnZukJyA9PiAnzpMnLAon8J2bpScgPT4gJ86UJywKJ/Cdm6YnID0+ICfOlScsCifwnZunJyA9PiAnzpYnLAon8J2bqCcgPT4gJ86XJywKJ/Cdm6knID0+ICfOmCcsCifwnZuqJyA9PiAnzpknLAon8J2bqycgPT4gJ86aJywKJ/Cdm6wnID0+ICfOmycsCifwnZutJyA9PiAnzpwnLAon8J2bricgPT4gJ86dJywKJ/Cdm68nID0+ICfOnicsCifwnZuwJyA9PiAnzp8nLAon8J2bsScgPT4gJ86gJywKJ/Cdm7InID0+ICfOoScsCifwnZuzJyA9PiAnzpgnLAon8J2btCcgPT4gJ86jJywKJ/Cdm7UnID0+ICfOpCcsCifwnZu2JyA9PiAnzqUnLAon8J2btycgPT4gJ86mJywKJ/Cdm7gnID0+ICfOpycsCifwnZu5JyA9PiAnzqgnLAon8J2buicgPT4gJ86pJywKJ/Cdm7snID0+ICfiiIcnLAon8J2bvCcgPT4gJ86xJywKJ/Cdm70nID0+ICfOsicsCifwnZu+JyA9PiAnzrMnLAon8J2bvycgPT4gJ860JywKJ/CdnIAnID0+ICfOtScsCifwnZyBJyA9PiAnzrYnLAon8J2cgicgPT4gJ863JywKJ/CdnIMnID0+ICfOuCcsCifwnZyEJyA9PiAnzrknLAon8J2chScgPT4gJ866JywKJ/CdnIYnID0+ICfOuycsCifwnZyHJyA9PiAnzrwnLAon8J2ciCcgPT4gJ869JywKJ/CdnIknID0+ICfOvicsCifwnZyKJyA9PiAnzr8nLAon8J2ciycgPT4gJ8+AJywKJ/CdnIwnID0+ICfPgScsCifwnZyNJyA9PiAnz4InLAon8J2cjicgPT4gJ8+DJywKJ/CdnI8nID0+ICfPhCcsCifwnZyQJyA9PiAnz4UnLAon8J2ckScgPT4gJ8+GJywKJ/CdnJInID0+ICfPhycsCifwnZyTJyA9PiAnz4gnLAon8J2clCcgPT4gJ8+JJywKJ/CdnJUnID0+ICfiiIInLAon8J2clicgPT4gJ861JywKJ/CdnJcnID0+ICfOuCcsCifwnZyYJyA9PiAnzronLAon8J2cmScgPT4gJ8+GJywKJ/CdnJonID0+ICfPgScsCifwnZybJyA9PiAnz4AnLAon8J2cnCcgPT4gJ86RJywKJ/CdnJ0nID0+ICfOkicsCifwnZyeJyA9PiAnzpMnLAon8J2cnycgPT4gJ86UJywKJ/CdnKAnID0+ICfOlScsCifwnZyhJyA9PiAnzpYnLAon8J2coicgPT4gJ86XJywKJ/CdnKMnID0+ICfOmCcsCifwnZykJyA9PiAnzpknLAon8J2cpScgPT4gJ86aJywKJ/CdnKYnID0+ICfOmycsCifwnZynJyA9PiAnzpwnLAon8J2cqCcgPT4gJ86dJywKJ/CdnKknID0+ICfOnicsCifwnZyqJyA9PiAnzp8nLAon8J2cqycgPT4gJ86gJywKJ/CdnKwnID0+ICfOoScsCifwnZytJyA9PiAnzpgnLAon8J2cricgPT4gJ86jJywKJ/CdnK8nID0+ICfOpCcsCifwnZywJyA9PiAnzqUnLAon8J2csScgPT4gJ86mJywKJ/CdnLInID0+ICfOpycsCifwnZyzJyA9PiAnzqgnLAon8J2ctCcgPT4gJ86pJywKJ/CdnLUnID0+ICfiiIcnLAon8J2cticgPT4gJ86xJywKJ/CdnLcnID0+ICfOsicsCifwnZy4JyA9PiAnzrMnLAon8J2cuScgPT4gJ860JywKJ/CdnLonID0+ICfOtScsCifwnZy7JyA9PiAnzrYnLAon8J2cvCcgPT4gJ863JywKJ/CdnL0nID0+ICfOuCcsCifwnZy+JyA9PiAnzrknLAon8J2cvycgPT4gJ866JywKJ/CdnYAnID0+ICfOuycsCifwnZ2BJyA9PiAnzrwnLAon8J2dgicgPT4gJ869JywKJ/CdnYMnID0+ICfOvicsCifwnZ2EJyA9PiAnzr8nLAon8J2dhScgPT4gJ8+AJywKJ/CdnYYnID0+ICfPgScsCifwnZ2HJyA9PiAnz4InLAon8J2diCcgPT4gJ8+DJywKJ/CdnYknID0+ICfPhCcsCifwnZ2KJyA9PiAnz4UnLAon8J2diycgPT4gJ8+GJywKJ/CdnYwnID0+ICfPhycsCifwnZ2NJyA9PiAnz4gnLAon8J2djicgPT4gJ8+JJywKJ/CdnY8nID0+ICfiiIInLAon8J2dkCcgPT4gJ861JywKJ/CdnZEnID0+ICfOuCcsCifwnZ2SJyA9PiAnzronLAon8J2dkycgPT4gJ8+GJywKJ/CdnZQnID0+ICfPgScsCifwnZ2VJyA9PiAnz4AnLAon8J2dlicgPT4gJ86RJywKJ/CdnZcnID0+ICfOkicsCifwnZ2YJyA9PiAnzpMnLAon8J2dmScgPT4gJ86UJywKJ/CdnZonID0+ICfOlScsCifwnZ2bJyA9PiAnzpYnLAon8J2dnCcgPT4gJ86XJywKJ/CdnZ0nID0+ICfOmCcsCifwnZ2eJyA9PiAnzpknLAon8J2dnycgPT4gJ86aJywKJ/CdnaAnID0+ICfOmycsCifwnZ2hJyA9PiAnzpwnLAon8J2doicgPT4gJ86dJywKJ/CdnaMnID0+ICfOnicsCifwnZ2kJyA9PiAnzp8nLAon8J2dpScgPT4gJ86gJywKJ/CdnaYnID0+ICfOoScsCifwnZ2nJyA9PiAnzpgnLAon8J2dqCcgPT4gJ86jJywKJ/CdnaknID0+ICfOpCcsCifwnZ2qJyA9PiAnzqUnLAon8J2dqycgPT4gJ86mJywKJ/CdnawnID0+ICfOpycsCifwnZ2tJyA9PiAnzqgnLAon8J2dricgPT4gJ86pJywKJ/Cdna8nID0+ICfiiIcnLAon8J2dsCcgPT4gJ86xJywKJ/CdnbEnID0+ICfOsicsCifwnZ2yJyA9PiAnzrMnLAon8J2dsycgPT4gJ860JywKJ/CdnbQnID0+ICfOtScsCifwnZ21JyA9PiAnzrYnLAon8J2dticgPT4gJ863JywKJ/CdnbcnID0+ICfOuCcsCifwnZ24JyA9PiAnzrknLAon8J2duScgPT4gJ866JywKJ/CdnbonID0+ICfOuycsCifwnZ27JyA9PiAnzrwnLAon8J2dvCcgPT4gJ869JywKJ/Cdnb0nID0+ICfOvicsCifwnZ2+JyA9PiAnzr8nLAon8J2dvycgPT4gJ8+AJywKJ/CdnoAnID0+ICfPgScsCifwnZ6BJyA9PiAnz4InLAon8J2egicgPT4gJ8+DJywKJ/CdnoMnID0+ICfPhCcsCifwnZ6EJyA9PiAnz4UnLAon8J2ehScgPT4gJ8+GJywKJ/CdnoYnID0+ICfPhycsCifwnZ6HJyA9PiAnz4gnLAon8J2eiCcgPT4gJ8+JJywKJ/CdnoknID0+ICfiiIInLAon8J2eiicgPT4gJ861JywKJ/CdnosnID0+ICfOuCcsCifwnZ6MJyA9PiAnzronLAon8J2ejScgPT4gJ8+GJywKJ/Cdno4nID0+ICfPgScsCifwnZ6PJyA9PiAnz4AnLAon8J2ekCcgPT4gJ86RJywKJ/CdnpEnID0+ICfOkicsCifwnZ6SJyA9PiAnzpMnLAon8J2ekycgPT4gJ86UJywKJ/CdnpQnID0+ICfOlScsCifwnZ6VJyA9PiAnzpYnLAon8J2elicgPT4gJ86XJywKJ/CdnpcnID0+ICfOmCcsCifwnZ6YJyA9PiAnzpknLAon8J2emScgPT4gJ86aJywKJ/CdnponID0+ICfOmycsCifwnZ6bJyA9PiAnzpwnLAon8J2enCcgPT4gJ86dJywKJ/Cdnp0nID0+ICfOnicsCifwnZ6eJyA9PiAnzp8nLAon8J2enycgPT4gJ86gJywKJ/CdnqAnID0+ICfOoScsCifwnZ6hJyA9PiAnzpgnLAon8J2eoicgPT4gJ86jJywKJ/CdnqMnID0+ICfOpCcsCifwnZ6kJyA9PiAnzqUnLAon8J2epScgPT4gJ86mJywKJ/CdnqYnID0+ICfOpycsCifwnZ6nJyA9PiAnzqgnLAon8J2eqCcgPT4gJ86pJywKJ/CdnqknID0+ICfiiIcnLAon8J2eqicgPT4gJ86xJywKJ/CdnqsnID0+ICfOsicsCifwnZ6sJyA9PiAnzrMnLAon8J2erScgPT4gJ860JywKJ/Cdnq4nID0+ICfOtScsCifwnZ6vJyA9PiAnzrYnLAon8J2esCcgPT4gJ863JywKJ/CdnrEnID0+ICfOuCcsCifwnZ6yJyA9PiAnzrknLAon8J2esycgPT4gJ866JywKJ/CdnrQnID0+ICfOuycsCifwnZ61JyA9PiAnzrwnLAon8J2eticgPT4gJ869JywKJ/CdnrcnID0+ICfOvicsCifwnZ64JyA9PiAnzr8nLAon8J2euScgPT4gJ8+AJywKJ/CdnronID0+ICfPgScsCifwnZ67JyA9PiAnz4InLAon8J2evCcgPT4gJ8+DJywKJ/Cdnr0nID0+ICfPhCcsCifwnZ6+JyA9PiAnz4UnLAon8J2evycgPT4gJ8+GJywKJ/Cdn4AnID0+ICfPhycsCifwnZ+BJyA9PiAnz4gnLAon8J2fgicgPT4gJ8+JJywKJ/Cdn4MnID0+ICfiiIInLAon8J2fhCcgPT4gJ861JywKJ/Cdn4UnID0+ICfOuCcsCifwnZ+GJyA9PiAnzronLAon8J2fhycgPT4gJ8+GJywKJ/Cdn4gnID0+ICfPgScsCifwnZ+JJyA9PiAnz4AnLAon8J2fiicgPT4gJ8+cJywKJ/Cdn4snID0+ICfPnScsCifwnZ+OJyA9PiAnMCcsCifwnZ+PJyA9PiAnMScsCifwnZ+QJyA9PiAnMicsCifwnZ+RJyA9PiAnMycsCifwnZ+SJyA9PiAnNCcsCifwnZ+TJyA9PiAnNScsCifwnZ+UJyA9PiAnNicsCifwnZ+VJyA9PiAnNycsCifwnZ+WJyA9PiAnOCcsCifwnZ+XJyA9PiAnOScsCifwnZ+YJyA9PiAnMCcsCifwnZ+ZJyA9PiAnMScsCifwnZ+aJyA9PiAnMicsCifwnZ+bJyA9PiAnMycsCifwnZ+cJyA9PiAnNCcsCifwnZ+dJyA9PiAnNScsCifwnZ+eJyA9PiAnNicsCifwnZ+fJyA9PiAnNycsCifwnZ+gJyA9PiAnOCcsCifwnZ+hJyA9PiAnOScsCifwnZ+iJyA9PiAnMCcsCifwnZ+jJyA9PiAnMScsCifwnZ+kJyA9PiAnMicsCifwnZ+lJyA9PiAnMycsCifwnZ+mJyA9PiAnNCcsCifwnZ+nJyA9PiAnNScsCifwnZ+oJyA9PiAnNicsCifwnZ+pJyA9PiAnNycsCifwnZ+qJyA9PiAnOCcsCifwnZ+rJyA9PiAnOScsCifwnZ+sJyA9PiAnMCcsCifwnZ+tJyA9PiAnMScsCifwnZ+uJyA9PiAnMicsCifwnZ+vJyA9PiAnMycsCifwnZ+wJyA9PiAnNCcsCifwnZ+xJyA9PiAnNScsCifwnZ+yJyA9PiAnNicsCifwnZ+zJyA9PiAnNycsCifwnZ+0JyA9PiAnOCcsCifwnZ+1JyA9PiAnOScsCifwnZ+2JyA9PiAnMCcsCifwnZ+3JyA9PiAnMScsCifwnZ+4JyA9PiAnMicsCifwnZ+5JyA9PiAnMycsCifwnZ+6JyA9PiAnNCcsCifwnZ+7JyA9PiAnNScsCifwnZ+8JyA9PiAnNicsCifwnZ+9JyA9PiAnNycsCifwnZ++JyA9PiAnOCcsCifwnZ+/JyA9PiAnOScsCifwnriAJyA9PiAn2KcnLAon8J64gScgPT4gJ9ioJywKJ/CeuIInID0+ICfYrCcsCifwnriDJyA9PiAn2K8nLAon8J64hScgPT4gJ9mIJywKJ/CeuIYnID0+ICfYsicsCifwnriHJyA9PiAn2K0nLAon8J64iCcgPT4gJ9i3JywKJ/CeuIknID0+ICfZiicsCifwnriKJyA9PiAn2YMnLAon8J64iycgPT4gJ9mEJywKJ/CeuIwnID0+ICfZhScsCifwnriNJyA9PiAn2YYnLAon8J64jicgPT4gJ9izJywKJ/CeuI8nID0+ICfYuScsCifwnriQJyA9PiAn2YEnLAon8J64kScgPT4gJ9i1JywKJ/CeuJInID0+ICfZgicsCifwnriTJyA9PiAn2LEnLAon8J64lCcgPT4gJ9i0JywKJ/CeuJUnID0+ICfYqicsCifwnriWJyA9PiAn2KsnLAon8J64lycgPT4gJ9iuJywKJ/CeuJgnID0+ICfYsCcsCifwnriZJyA9PiAn2LYnLAon8J64micgPT4gJ9i4JywKJ/CeuJsnID0+ICfYuicsCifwnricJyA9PiAn2a4nLAon8J64nScgPT4gJ9q6JywKJ/CeuJ4nID0+ICfaoScsCifwnrifJyA9PiAn2a8nLAon8J64oScgPT4gJ9ioJywKJ/CeuKInID0+ICfYrCcsCifwnrikJyA9PiAn2YcnLAon8J64pycgPT4gJ9itJywKJ/CeuKknID0+ICfZiicsCifwnriqJyA9PiAn2YMnLAon8J64qycgPT4gJ9mEJywKJ/CeuKwnID0+ICfZhScsCifwnritJyA9PiAn2YYnLAon8J64ricgPT4gJ9izJywKJ/CeuK8nID0+ICfYuScsCifwnriwJyA9PiAn2YEnLAon8J64sScgPT4gJ9i1JywKJ/CeuLInID0+ICfZgicsCifwnri0JyA9PiAn2LQnLAon8J64tScgPT4gJ9iqJywKJ/CeuLYnID0+ICfYqycsCifwnri3JyA9PiAn2K4nLAon8J64uScgPT4gJ9i2JywKJ/CeuLsnID0+ICfYuicsCifwnrmCJyA9PiAn2KwnLAon8J65hycgPT4gJ9itJywKJ/CeuYknID0+ICfZiicsCifwnrmLJyA9PiAn2YQnLAon8J65jScgPT4gJ9mGJywKJ/CeuY4nID0+ICfYsycsCifwnrmPJyA9PiAn2LknLAon8J65kScgPT4gJ9i1JywKJ/CeuZInID0+ICfZgicsCifwnrmUJyA9PiAn2LQnLAon8J65lycgPT4gJ9iuJywKJ/CeuZknID0+ICfYticsCifwnrmbJyA9PiAn2LonLAon8J65nScgPT4gJ9q6JywKJ/CeuZ8nID0+ICfZrycsCifwnrmhJyA9PiAn2KgnLAon8J65oicgPT4gJ9isJywKJ/CeuaQnID0+ICfZhycsCifwnrmnJyA9PiAn2K0nLAon8J65qCcgPT4gJ9i3JywKJ/CeuaknID0+ICfZiicsCifwnrmqJyA9PiAn2YMnLAon8J65rCcgPT4gJ9mFJywKJ/Ceua0nID0+ICfZhicsCifwnrmuJyA9PiAn2LMnLAon8J65rycgPT4gJ9i5JywKJ/CeubAnID0+ICfZgScsCifwnrmxJyA9PiAn2LUnLAon8J65sicgPT4gJ9mCJywKJ/CeubQnID0+ICfYtCcsCifwnrm1JyA9PiAn2KonLAon8J65ticgPT4gJ9irJywKJ/CeubcnID0+ICfYricsCifwnrm5JyA9PiAn2LYnLAon8J65uicgPT4gJ9i4JywKJ/CeubsnID0+ICfYuicsCifwnrm8JyA9PiAn2a4nLAon8J65vicgPT4gJ9qhJywKJ/CeuoAnID0+ICfYpycsCifwnrqBJyA9PiAn2KgnLAon8J66gicgPT4gJ9isJywKJ/CeuoMnID0+ICfYrycsCifwnrqEJyA9PiAn2YcnLAon8J66hScgPT4gJ9mIJywKJ/CeuoYnID0+ICfYsicsCifwnrqHJyA9PiAn2K0nLAon8J66iCcgPT4gJ9i3JywKJ/CeuoknID0+ICfZiicsCifwnrqLJyA9PiAn2YQnLAon8J66jCcgPT4gJ9mFJywKJ/Ceuo0nID0+ICfZhicsCifwnrqOJyA9PiAn2LMnLAon8J66jycgPT4gJ9i5JywKJ/CeupAnID0+ICfZgScsCifwnrqRJyA9PiAn2LUnLAon8J66kicgPT4gJ9mCJywKJ/CeupMnID0+ICfYsScsCifwnrqUJyA9PiAn2LQnLAon8J66lScgPT4gJ9iqJywKJ/CeupYnID0+ICfYqycsCifwnrqXJyA9PiAn2K4nLAon8J66mCcgPT4gJ9iwJywKJ/CeupknID0+ICfYticsCifwnrqaJyA9PiAn2LgnLAon8J66mycgPT4gJ9i6JywKJ/CeuqEnID0+ICfYqCcsCifwnrqiJyA9PiAn2KwnLAon8J66oycgPT4gJ9ivJywKJ/CeuqUnID0+ICfZiCcsCifwnrqmJyA9PiAn2LInLAon8J66pycgPT4gJ9itJywKJ/CeuqgnID0+ICfYtycsCifwnrqpJyA9PiAn2YonLAon8J66qycgPT4gJ9mEJywKJ/CeuqwnID0+ICfZhScsCifwnrqtJyA9PiAn2YYnLAon8J66ricgPT4gJ9izJywKJ/Ceuq8nID0+ICfYuScsCifwnrqwJyA9PiAn2YEnLAon8J66sScgPT4gJ9i1JywKJ/CeurInID0+ICfZgicsCifwnrqzJyA9PiAn2LEnLAon8J66tCcgPT4gJ9i0JywKJ/CeurUnID0+ICfYqicsCifwnrq2JyA9PiAn2KsnLAon8J66tycgPT4gJ9iuJywKJ/CeurgnID0+ICfYsCcsCifwnrq5JyA9PiAn2LYnLAon8J66uicgPT4gJ9i4JywKJ/CeursnID0+ICfYuicsCifwn4SAJyA9PiAnMC4nLAon8J+EgScgPT4gJzAsJywKJ/CfhIInID0+ICcxLCcsCifwn4SDJyA9PiAnMiwnLAon8J+EhCcgPT4gJzMsJywKJ/CfhIUnID0+ICc0LCcsCifwn4SGJyA9PiAnNSwnLAon8J+EhycgPT4gJzYsJywKJ/CfhIgnID0+ICc3LCcsCifwn4SJJyA9PiAnOCwnLAon8J+EiicgPT4gJzksJywKJ/CfhJAnID0+ICcoQSknLAon8J+EkScgPT4gJyhCKScsCifwn4SSJyA9PiAnKEMpJywKJ/CfhJMnID0+ICcoRCknLAon8J+ElCcgPT4gJyhFKScsCifwn4SVJyA9PiAnKEYpJywKJ/CfhJYnID0+ICcoRyknLAon8J+ElycgPT4gJyhIKScsCifwn4SYJyA9PiAnKEkpJywKJ/CfhJknID0+ICcoSiknLAon8J+EmicgPT4gJyhLKScsCifwn4SbJyA9PiAnKEwpJywKJ/CfhJwnID0+ICcoTSknLAon8J+EnScgPT4gJyhOKScsCifwn4SeJyA9PiAnKE8pJywKJ/CfhJ8nID0+ICcoUCknLAon8J+EoCcgPT4gJyhRKScsCifwn4ShJyA9PiAnKFIpJywKJ/CfhKInID0+ICcoUyknLAon8J+EoycgPT4gJyhUKScsCifwn4SkJyA9PiAnKFUpJywKJ/CfhKUnID0+ICcoViknLAon8J+EpicgPT4gJyhXKScsCifwn4SnJyA9PiAnKFgpJywKJ/CfhKgnID0+ICcoWSknLAon8J+EqScgPT4gJyhaKScsCifwn4SqJyA9PiAn44CUU+OAlScsCifwn4SrJyA9PiAnQycsCifwn4SsJyA9PiAnUicsCifwn4StJyA9PiAnQ0QnLAon8J+EricgPT4gJ1daJywKJ/CfhLAnID0+ICdBJywKJ/CfhLEnID0+ICdCJywKJ/CfhLInID0+ICdDJywKJ/CfhLMnID0+ICdEJywKJ/CfhLQnID0+ICdFJywKJ/CfhLUnID0+ICdGJywKJ/CfhLYnID0+ICdHJywKJ/CfhLcnID0+ICdIJywKJ/CfhLgnID0+ICdJJywKJ/CfhLknID0+ICdKJywKJ/CfhLonID0+ICdLJywKJ/CfhLsnID0+ICdMJywKJ/CfhLwnID0+ICdNJywKJ/CfhL0nID0+ICdOJywKJ/CfhL4nID0+ICdPJywKJ/CfhL8nID0+ICdQJywKJ/CfhYAnID0+ICdRJywKJ/CfhYEnID0+ICdSJywKJ/CfhYInID0+ICdTJywKJ/CfhYMnID0+ICdUJywKJ/CfhYQnID0+ICdVJywKJ/CfhYUnID0+ICdWJywKJ/CfhYYnID0+ICdXJywKJ/CfhYcnID0+ICdYJywKJ/CfhYgnID0+ICdZJywKJ/CfhYknID0+ICdaJywKJ/CfhYonID0+ICdIVicsCifwn4WLJyA9PiAnTVYnLAon8J+FjCcgPT4gJ1NEJywKJ/CfhY0nID0+ICdTUycsCifwn4WOJyA9PiAnUFBWJywKJ/CfhY8nID0+ICdXQycsCifwn4WqJyA9PiAnTUMnLAon8J+FqycgPT4gJ01EJywKJ/CfhawnID0+ICdNUicsCifwn4aQJyA9PiAnREonLAon8J+IgCcgPT4gJ+OBu+OBiycsCifwn4iBJyA9PiAn44Kz44KzJywKJ/CfiIInID0+ICfjgrUnLAon8J+IkCcgPT4gJ+aJiycsCifwn4iRJyA9PiAn5a2XJywKJ/CfiJInID0+ICflj4wnLAon8J+IkycgPT4gJ+ODhuOCmScsCifwn4iUJyA9PiAn5LqMJywKJ/CfiJUnID0+ICflpJonLAon8J+IlicgPT4gJ+inoycsCifwn4iXJyA9PiAn5aSpJywKJ/CfiJgnID0+ICfkuqQnLAon8J+ImScgPT4gJ+aYoCcsCifwn4iaJyA9PiAn54ShJywKJ/CfiJsnID0+ICfmlpknLAon8J+InCcgPT4gJ+WJjScsCifwn4idJyA9PiAn5b6MJywKJ/CfiJ4nID0+ICflho0nLAon8J+InycgPT4gJ+aWsCcsCifwn4igJyA9PiAn5YidJywKJ/CfiKEnID0+ICfntYInLAon8J+IoicgPT4gJ+eUnycsCifwn4ijJyA9PiAn6LKpJywKJ/CfiKQnID0+ICflo7AnLAon8J+IpScgPT4gJ+WQuScsCifwn4imJyA9PiAn5ryUJywKJ/CfiKcnID0+ICfmipUnLAon8J+IqCcgPT4gJ+aNlScsCifwn4ipJyA9PiAn5LiAJywKJ/CfiKonID0+ICfkuIknLAon8J+IqycgPT4gJ+mBiicsCifwn4isJyA9PiAn5bemJywKJ/CfiK0nID0+ICfkuK0nLAon8J+IricgPT4gJ+WPsycsCifwn4ivJyA9PiAn5oyHJywKJ/CfiLAnID0+ICfotbAnLAon8J+IsScgPT4gJ+aJkycsCifwn4iyJyA9PiAn56aBJywKJ/CfiLMnID0+ICfnqbonLAon8J+ItCcgPT4gJ+WQiCcsCifwn4i1JyA9PiAn5rqAJywKJ/CfiLYnID0+ICfmnIknLAon8J+ItycgPT4gJ+aciCcsCifwn4i4JyA9PiAn55SzJywKJ/CfiLknID0+ICflibInLAon8J+IuicgPT4gJ+WWticsCifwn4i7JyA9PiAn6YWNJywKJ/CfiYAnID0+ICfjgJTmnKzjgJUnLAon8J+JgScgPT4gJ+OAlOS4ieOAlScsCifwn4mCJyA9PiAn44CU5LqM44CVJywKJ/CfiYMnID0+ICfjgJTlronjgJUnLAon8J+JhCcgPT4gJ+OAlOeCueOAlScsCifwn4mFJyA9PiAn44CU5omT44CVJywKJ/CfiYYnID0+ICfjgJTnm5fjgJUnLAon8J+JhycgPT4gJ+OAlOWLneOAlScsCifwn4mIJyA9PiAn44CU5pWX44CVJywKJ/CfiZAnID0+ICflvpcnLAon8J+JkScgPT4gJ+WPrycsCifwn6+wJyA9PiAnMCcsCifwn6+xJyA9PiAnMScsCifwn6+yJyA9PiAnMicsCifwn6+zJyA9PiAnMycsCifwn6+0JyA9PiAnNCcsCifwn6+1JyA9PiAnNScsCifwn6+2JyA9PiAnNicsCifwn6+3JyA9PiAnNycsCifwn6+4JyA9PiAnOCcsCifwn6+5JyA9PiAnOScsCik7Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxJbnRsXE5vcm1hbGl6ZXIgYXMgcDsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKcmV0dXJuIHJlcXVpcmUgX19ESVJfXy4nL2Jvb3RzdHJhcDgwLnBocCc7Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQnKSkgewpmdW5jdGlvbiBub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0cmluZywgJGZvcm0gPSBwXE5vcm1hbGl6ZXI6OkZPUk1fQykgeyByZXR1cm4gcFxOb3JtYWxpemVyOjppc05vcm1hbGl6ZWQoJHN0cmluZywgJGZvcm0pOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ25vcm1hbGl6ZXJfbm9ybWFsaXplJykpIHsKZnVuY3Rpb24gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0cmluZywgJGZvcm0gPSBwXE5vcm1hbGl6ZXI6OkZPUk1fQykgeyByZXR1cm4gcFxOb3JtYWxpemVyOjpub3JtYWxpemUoJHN0cmluZywgJGZvcm0pOyB9Cn0KPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXEludGxcTm9ybWFsaXplciBhcyBwOwoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ25vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCcpKSB7CmZ1bmN0aW9uIG5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCg/c3RyaW5nICRzdHJpbmcsID9pbnQgJGZvcm0gPSBwXE5vcm1hbGl6ZXI6OkZPUk1fQyk6IGJvb2wgeyByZXR1cm4gcFxOb3JtYWxpemVyOjppc05vcm1hbGl6ZWQoKHN0cmluZykgJHN0cmluZywgKGludCkgJGZvcm0pOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ25vcm1hbGl6ZXJfbm9ybWFsaXplJykpIHsKZnVuY3Rpb24gbm9ybWFsaXplcl9ub3JtYWxpemUoP3N0cmluZyAkc3RyaW5nLCA/aW50ICRmb3JtID0gcFxOb3JtYWxpemVyOjpGT1JNX0MpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxOb3JtYWxpemVyOjpub3JtYWxpemUoKHN0cmluZykgJHN0cmluZywgKGludCkgJGZvcm0pOyB9Cn0KCkNvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcUG9seWZpbGxcTWJzdHJpbmc7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmZpbmFsIGNsYXNzIE1ic3RyaW5nCnsKcHVibGljIGNvbnN0IE1CX0NBU0VfRk9MRCA9IFxQSFBfSU5UX01BWDsKCnByaXZhdGUgY29uc3QgU0lNUExFX0NBU0VfRk9MRCA9IFsKWyfCtScsICfFvycsICJceENEXHg4NSIsICfPgicsICJceENGXHg5MCIsICJceENGXHg5MSIsICJceENGXHg5NSIsICJceENGXHg5NiIsICJceENGXHhCMCIsICJceENGXHhCMSIsICJceENGXHhCNSIsICJceEUxXHhCQVx4OUIiLCAiXHhFMVx4QkVceEJFIl0sClsnzrwnLCAncycsICfOuScsICfPgycsICfOsicsICfOuCcsICfPhicsICfPgCcsICfOuicsICfPgScsICfOtScsICJceEUxXHhCOVx4QTEiLCAnzrknXSwKXTsKCnByaXZhdGUgc3RhdGljICRlbmNvZGluZ0xpc3QgPSBbJ0FTQ0lJJywgJ1VURi04J107CnByaXZhdGUgc3RhdGljICRsYW5ndWFnZSA9ICduZXV0cmFsJzsKcHJpdmF0ZSBzdGF0aWMgJGludGVybmFsRW5jb2RpbmcgPSAnVVRGLTgnOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9jb252ZXJ0X2VuY29kaW5nKCRzLCAkdG9FbmNvZGluZywgJGZyb21FbmNvZGluZyA9IG51bGwpCnsKaWYgKFxpc19hcnJheSgkcykpIHsKJHIgPSBbXTsKZm9yZWFjaCAoJHMgYXMgJHN0cikgewokcltdID0gc2VsZjo6bWJfY29udmVydF9lbmNvZGluZygkc3RyLCAkdG9FbmNvZGluZywgJGZyb21FbmNvZGluZyk7Cn0KCnJldHVybiAkcjsKfQoKaWYgKFxpc19hcnJheSgkZnJvbUVuY29kaW5nKSB8fCAobnVsbCAhPT0gJGZyb21FbmNvZGluZyAmJiBmYWxzZSAhPT0gc3RycG9zKCRmcm9tRW5jb2RpbmcsICcsJykpKSB7CiRmcm9tRW5jb2RpbmcgPSBzZWxmOjptYl9kZXRlY3RfZW5jb2RpbmcoJHMsICRmcm9tRW5jb2RpbmcpOwp9IGVsc2UgewokZnJvbUVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGZyb21FbmNvZGluZyk7Cn0KCiR0b0VuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJHRvRW5jb2RpbmcpOwoKaWYgKCdCQVNFNjQnID09PSAkZnJvbUVuY29kaW5nKSB7CiRzID0gYmFzZTY0X2RlY29kZSgkcyk7CiRmcm9tRW5jb2RpbmcgPSAkdG9FbmNvZGluZzsKfQoKaWYgKCdCQVNFNjQnID09PSAkdG9FbmNvZGluZykgewpyZXR1cm4gYmFzZTY0X2VuY29kZSgkcyk7Cn0KCmlmICgnSFRNTC1FTlRJVElFUycgPT09ICR0b0VuY29kaW5nIHx8ICdIVE1MJyA9PT0gJHRvRW5jb2RpbmcpIHsKaWYgKCdIVE1MLUVOVElUSUVTJyA9PT0gJGZyb21FbmNvZGluZyB8fCAnSFRNTCcgPT09ICRmcm9tRW5jb2RpbmcpIHsKJGZyb21FbmNvZGluZyA9ICdXaW5kb3dzLTEyNTInOwp9CmlmICgnVVRGLTgnICE9PSAkZnJvbUVuY29kaW5nKSB7CiRzID0gaWNvbnYoJGZyb21FbmNvZGluZywgJ1VURi04Ly9JR05PUkUnLCAkcyk7Cn0KCnJldHVybiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9bXHg4MC1ceEZGXSsvJywgW19fQ0xBU1NfXywgJ2h0bWxfZW5jb2RpbmdfY2FsbGJhY2snXSwgJHMpOwp9CgppZiAoJ0hUTUwtRU5USVRJRVMnID09PSAkZnJvbUVuY29kaW5nKSB7CiRzID0gaHRtbF9lbnRpdHlfZGVjb2RlKCRzLCBcRU5UX0NPTVBBVCwgJ1VURi04Jyk7CiRmcm9tRW5jb2RpbmcgPSAnVVRGLTgnOwp9CgpyZXR1cm4gaWNvbnYoJGZyb21FbmNvZGluZywgJHRvRW5jb2RpbmcuJy8vSUdOT1JFJywgJHMpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2NvbnZlcnRfdmFyaWFibGVzKCR0b0VuY29kaW5nLCAkZnJvbUVuY29kaW5nLCAmLi4uJHZhcnMpCnsKJG9rID0gdHJ1ZTsKYXJyYXlfd2Fsa19yZWN1cnNpdmUoJHZhcnMsIGZ1bmN0aW9uICgmJHYpIHVzZSAoJiRvaywgJHRvRW5jb2RpbmcsICRmcm9tRW5jb2RpbmcpIHsKaWYgKGZhbHNlID09PSAkdiA9IHNlbGY6Om1iX2NvbnZlcnRfZW5jb2RpbmcoJHYsICR0b0VuY29kaW5nLCAkZnJvbUVuY29kaW5nKSkgewokb2sgPSBmYWxzZTsKfQp9KTsKCnJldHVybiAkb2sgPyAkZnJvbUVuY29kaW5nIDogZmFsc2U7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZGVjb2RlX21pbWVoZWFkZXIoJHMpCnsKcmV0dXJuIGljb252X21pbWVfZGVjb2RlKCRzLCAyLCBzZWxmOjokaW50ZXJuYWxFbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZW5jb2RlX21pbWVoZWFkZXIoJHMsICRjaGFyc2V0ID0gbnVsbCwgJHRyYW5zZmVyRW5jb2RpbmcgPSBudWxsLCAkbGluZWZlZWQgPSBudWxsLCAkaW5kZW50ID0gbnVsbCkKewp0cmlnZ2VyX2Vycm9yKCdtYl9lbmNvZGVfbWltZWhlYWRlcigpIGlzIGJ1Z2dlZC4gUGxlYXNlIHVzZSBpY29udl9taW1lX2VuY29kZSgpIGluc3RlYWQnLCBcRV9VU0VSX1dBUk5JTkcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2RlY29kZV9udW1lcmljZW50aXR5KCRzLCAkY29udm1hcCwgJGVuY29kaW5nID0gbnVsbCkKewppZiAobnVsbCAhPT0gJHMgJiYgIVxpc19zY2FsYXIoJHMpICYmICEoXGlzX29iamVjdCgkcykgJiYgbWV0aG9kX2V4aXN0cygkcywgJ19fdG9TdHJpbmcnKSkpIHsKdHJpZ2dlcl9lcnJvcignbWJfZGVjb2RlX251bWVyaWNlbnRpdHkoKSBleHBlY3RzIHBhcmFtZXRlciAxIHRvIGJlIHN0cmluZywgJy5cZ2V0dHlwZSgkcykuJyBnaXZlbicsIFxFX1VTRVJfV0FSTklORyk7CgpyZXR1cm4gbnVsbDsKfQoKaWYgKCFcaXNfYXJyYXkoJGNvbnZtYXApIHx8ICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCAmJiAhJGNvbnZtYXApKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKG51bGwgIT09ICRlbmNvZGluZyAmJiAhXGlzX3NjYWxhcigkZW5jb2RpbmcpKSB7CnRyaWdnZXJfZXJyb3IoJ21iX2RlY29kZV9udW1lcmljZW50aXR5KCkgZXhwZWN0cyBwYXJhbWV0ZXIgMyB0byBiZSBzdHJpbmcsICcuXGdldHR5cGUoJHMpLicgZ2l2ZW4nLCBcRV9VU0VSX1dBUk5JTkcpOwoKcmV0dXJuICcnOyAKfQoKJHMgPSAoc3RyaW5nKSAkczsKaWYgKCcnID09PSAkcykgewpyZXR1cm4gJyc7Cn0KCiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CgppZiAoJ1VURi04JyA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IG51bGw7CmlmICghcHJlZ19tYXRjaCgnLy91JywgJHMpKSB7CiRzID0gQGljb252KCdVVEYtOCcsICdVVEYtOC8vSUdOT1JFJywgJHMpOwp9Cn0gZWxzZSB7CiRzID0gaWNvbnYoJGVuY29kaW5nLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQoKJGNudCA9IGZsb29yKFxjb3VudCgkY29udm1hcCkgLyA0KSAqIDQ7Cgpmb3IgKCRpID0gMDsgJGkgPCAkY250OyAkaSArPSA0KSB7CgokY29udm1hcFskaV0gKz0gJGNvbnZtYXBbJGkgKyAyXTsKJGNvbnZtYXBbJGkgKyAxXSArPSAkY29udm1hcFskaSArIDJdOwp9CgokcyA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnLyYjKD86MCooWzAtOV0rKXx4MCooWzAtOWEtZkEtRl0rKSkoPyEmKTs/LycsIGZ1bmN0aW9uIChhcnJheSAkbSkgdXNlICgkY250LCAkY29udm1hcCkgewokYyA9IGlzc2V0KCRtWzJdKSA/IChpbnQpIGhleGRlYygkbVsyXSkgOiAkbVsxXTsKZm9yICgkaSA9IDA7ICRpIDwgJGNudDsgJGkgKz0gNCkgewppZiAoJGMgPj0gJGNvbnZtYXBbJGldICYmICRjIDw9ICRjb252bWFwWyRpICsgMV0pIHsKcmV0dXJuIHNlbGY6Om1iX2NocigkYyAtICRjb252bWFwWyRpICsgMl0pOwp9Cn0KCnJldHVybiAkbVswXTsKfSwgJHMpOwoKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewpyZXR1cm4gJHM7Cn0KCnJldHVybiBpY29udignVVRGLTgnLCAkZW5jb2RpbmcuJy8vSUdOT1JFJywgJHMpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2VuY29kZV9udW1lcmljZW50aXR5KCRzLCAkY29udm1hcCwgJGVuY29kaW5nID0gbnVsbCwgJGlzX2hleCA9IGZhbHNlKQp7CmlmIChudWxsICE9PSAkcyAmJiAhXGlzX3NjYWxhcigkcykgJiYgIShcaXNfb2JqZWN0KCRzKSAmJiBtZXRob2RfZXhpc3RzKCRzLCAnX190b1N0cmluZycpKSkgewp0cmlnZ2VyX2Vycm9yKCdtYl9lbmNvZGVfbnVtZXJpY2VudGl0eSgpIGV4cGVjdHMgcGFyYW1ldGVyIDEgdG8gYmUgc3RyaW5nLCAnLlxnZXR0eXBlKCRzKS4nIGdpdmVuJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBudWxsOwp9CgppZiAoIVxpc19hcnJheSgkY29udm1hcCkgfHwgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEICYmICEkY29udm1hcCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAobnVsbCAhPT0gJGVuY29kaW5nICYmICFcaXNfc2NhbGFyKCRlbmNvZGluZykpIHsKdHJpZ2dlcl9lcnJvcignbWJfZW5jb2RlX251bWVyaWNlbnRpdHkoKSBleHBlY3RzIHBhcmFtZXRlciAzIHRvIGJlIHN0cmluZywgJy5cZ2V0dHlwZSgkcykuJyBnaXZlbicsIFxFX1VTRVJfV0FSTklORyk7CgpyZXR1cm4gbnVsbDsgCn0KCmlmIChudWxsICE9PSAkaXNfaGV4ICYmICFcaXNfc2NhbGFyKCRpc19oZXgpKSB7CnRyaWdnZXJfZXJyb3IoJ21iX2VuY29kZV9udW1lcmljZW50aXR5KCkgZXhwZWN0cyBwYXJhbWV0ZXIgNCB0byBiZSBib29sZWFuLCAnLlxnZXR0eXBlKCRzKS4nIGdpdmVuJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBudWxsOwp9CgokcyA9IChzdHJpbmcpICRzOwppZiAoJycgPT09ICRzKSB7CnJldHVybiAnJzsKfQoKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKCmlmICgnVVRGLTgnID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gbnVsbDsKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkcykpIHsKJHMgPSBAaWNvbnYoJ1VURi04JywgJ1VURi04Ly9JR05PUkUnLCAkcyk7Cn0KfSBlbHNlIHsKJHMgPSBpY29udigkZW5jb2RpbmcsICdVVEYtOC8vSUdOT1JFJywgJHMpOwp9CgpzdGF0aWMgJHVsZW5NYXNrID0gWyJceEMwIiA9PiAyLCAiXHhEMCIgPT4gMiwgIlx4RTAiID0+IDMsICJceEYwIiA9PiA0XTsKCiRjbnQgPSBmbG9vcihcY291bnQoJGNvbnZtYXApIC8gNCkgKiA0OwokaSA9IDA7CiRsZW4gPSBcc3RybGVuKCRzKTsKJHJlc3VsdCA9ICcnOwoKd2hpbGUgKCRpIDwgJGxlbikgewokdWxlbiA9ICRzWyRpXSA8ICJceDgwIiA/IDEgOiAkdWxlbk1hc2tbJHNbJGldICYgIlx4RjAiXTsKJHVjaHIgPSBzdWJzdHIoJHMsICRpLCAkdWxlbik7CiRpICs9ICR1bGVuOwokYyA9IHNlbGY6Om1iX29yZCgkdWNocik7Cgpmb3IgKCRqID0gMDsgJGogPCAkY250OyAkaiArPSA0KSB7CmlmICgkYyA+PSAkY29udm1hcFskal0gJiYgJGMgPD0gJGNvbnZtYXBbJGogKyAxXSkgewokY09mZnNldCA9ICgkYyArICRjb252bWFwWyRqICsgMl0pICYgJGNvbnZtYXBbJGogKyAzXTsKJHJlc3VsdCAuPSAkaXNfaGV4ID8gc3ByaW50ZignJiN4JVg7JywgJGNPZmZzZXQpIDogJyYjJy4kY09mZnNldC4nOyc7CmNvbnRpbnVlIDI7Cn0KfQokcmVzdWx0IC49ICR1Y2hyOwp9CgppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CnJldHVybiAkcmVzdWx0Owp9CgpyZXR1cm4gaWNvbnYoJ1VURi04JywgJGVuY29kaW5nLicvL0lHTk9SRScsICRyZXN1bHQpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2NvbnZlcnRfY2FzZSgkcywgJG1vZGUsICRlbmNvZGluZyA9IG51bGwpCnsKJHMgPSAoc3RyaW5nKSAkczsKaWYgKCcnID09PSAkcykgewpyZXR1cm4gJyc7Cn0KCiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CgppZiAoJ1VURi04JyA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IG51bGw7CmlmICghcHJlZ19tYXRjaCgnLy91JywgJHMpKSB7CiRzID0gQGljb252KCdVVEYtOCcsICdVVEYtOC8vSUdOT1JFJywgJHMpOwp9Cn0gZWxzZSB7CiRzID0gaWNvbnYoJGVuY29kaW5nLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQoKaWYgKFxNQl9DQVNFX1RJVExFID09ICRtb2RlKSB7CnN0YXRpYyAkdGl0bGVSZWdleHAgPSBudWxsOwppZiAobnVsbCA9PT0gJHRpdGxlUmVnZXhwKSB7CiR0aXRsZVJlZ2V4cCA9IHNlbGY6OmdldERhdGEoJ3RpdGxlQ2FzZVJlZ2V4cCcpOwp9CiRzID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCR0aXRsZVJlZ2V4cCwgW19fQ0xBU1NfXywgJ3RpdGxlX2Nhc2UnXSwgJHMpOwp9IGVsc2UgewppZiAoXE1CX0NBU0VfVVBQRVIgPT0gJG1vZGUpIHsKc3RhdGljICR1cHBlciA9IG51bGw7CmlmIChudWxsID09PSAkdXBwZXIpIHsKJHVwcGVyID0gc2VsZjo6Z2V0RGF0YSgndXBwZXJDYXNlJyk7Cn0KJG1hcCA9ICR1cHBlcjsKfSBlbHNlIHsKaWYgKHNlbGY6Ok1CX0NBU0VfRk9MRCA9PT0gJG1vZGUpIHsKc3RhdGljICRjYXNlRm9sZGluZyA9IG51bGw7CmlmIChudWxsID09PSAkY2FzZUZvbGRpbmcpIHsKJGNhc2VGb2xkaW5nID0gc2VsZjo6Z2V0RGF0YSgnY2FzZUZvbGRpbmcnKTsKfQokcyA9IHN0cnRyKCRzLCAkY2FzZUZvbGRpbmcpOwp9CgpzdGF0aWMgJGxvd2VyID0gbnVsbDsKaWYgKG51bGwgPT09ICRsb3dlcikgewokbG93ZXIgPSBzZWxmOjpnZXREYXRhKCdsb3dlckNhc2UnKTsKfQokbWFwID0gJGxvd2VyOwp9CgpzdGF0aWMgJHVsZW5NYXNrID0gWyJceEMwIiA9PiAyLCAiXHhEMCIgPT4gMiwgIlx4RTAiID0+IDMsICJceEYwIiA9PiA0XTsKCiRpID0gMDsKJGxlbiA9IFxzdHJsZW4oJHMpOwoKd2hpbGUgKCRpIDwgJGxlbikgewokdWxlbiA9ICRzWyRpXSA8ICJceDgwIiA/IDEgOiAkdWxlbk1hc2tbJHNbJGldICYgIlx4RjAiXTsKJHVjaHIgPSBzdWJzdHIoJHMsICRpLCAkdWxlbik7CiRpICs9ICR1bGVuOwoKaWYgKGlzc2V0KCRtYXBbJHVjaHJdKSkgewokdWNociA9ICRtYXBbJHVjaHJdOwokbmxlbiA9IFxzdHJsZW4oJHVjaHIpOwoKaWYgKCRubGVuID09ICR1bGVuKSB7CiRubGVuID0gJGk7CmRvIHsKJHNbLS0kbmxlbl0gPSAkdWNoclstLSR1bGVuXTsKfSB3aGlsZSAoJHVsZW4pOwp9IGVsc2UgewokcyA9IHN1YnN0cl9yZXBsYWNlKCRzLCAkdWNociwgJGkgLSAkdWxlbiwgJHVsZW4pOwokbGVuICs9ICRubGVuIC0gJHVsZW47CiRpICs9ICRubGVuIC0gJHVsZW47Cn0KfQp9Cn0KCmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuICRzOwp9CgpyZXR1cm4gaWNvbnYoJ1VURi04JywgJGVuY29kaW5nLicvL0lHTk9SRScsICRzKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9pbnRlcm5hbF9lbmNvZGluZygkZW5jb2RpbmcgPSBudWxsKQp7CmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuIHNlbGY6OiRpbnRlcm5hbEVuY29kaW5nOwp9Cgokbm9ybWFsaXplZEVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKCmlmICgnVVRGLTgnID09PSAkbm9ybWFsaXplZEVuY29kaW5nIHx8IGZhbHNlICE9PSBAaWNvbnYoJG5vcm1hbGl6ZWRFbmNvZGluZywgJG5vcm1hbGl6ZWRFbmNvZGluZywgJyAnKSkgewpzZWxmOjokaW50ZXJuYWxFbmNvZGluZyA9ICRub3JtYWxpemVkRW5jb2Rpbmc7CgpyZXR1cm4gdHJ1ZTsKfQoKaWYgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEKSB7CnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50ICMxICgkZW5jb2RpbmcpIG11c3QgYmUgYSB2YWxpZCBlbmNvZGluZywgIiVzIiBnaXZlbicsICRlbmNvZGluZykpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2xhbmd1YWdlKCRsYW5nID0gbnVsbCkKewppZiAobnVsbCA9PT0gJGxhbmcpIHsKcmV0dXJuIHNlbGY6OiRsYW5ndWFnZTsKfQoKc3dpdGNoICgkbm9ybWFsaXplZExhbmcgPSBzdHJ0b2xvd2VyKCRsYW5nKSkgewpjYXNlICd1bmknOgpjYXNlICduZXV0cmFsJzoKc2VsZjo6JGxhbmd1YWdlID0gJG5vcm1hbGl6ZWRMYW5nOwoKcmV0dXJuIHRydWU7Cn0KCmlmICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCkgewpyZXR1cm4gZmFsc2U7Cn0KCnRocm93IG5ldyBcVmFsdWVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAjMSAoJGxhbmd1YWdlKSBtdXN0IGJlIGEgdmFsaWQgbGFuZ3VhZ2UsICIlcyIgZ2l2ZW4nLCAkbGFuZykpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2xpc3RfZW5jb2RpbmdzKCkKewpyZXR1cm4gWydVVEYtOCddOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2VuY29kaW5nX2FsaWFzZXMoJGVuY29kaW5nKQp7CnN3aXRjaCAoc3RydG91cHBlcigkZW5jb2RpbmcpKSB7CmNhc2UgJ1VURjgnOgpjYXNlICdVVEYtOCc6CnJldHVybiBbJ3V0ZjgnXTsKfQoKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2NoZWNrX2VuY29kaW5nKCR2YXIgPSBudWxsLCAkZW5jb2RpbmcgPSBudWxsKQp7CmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKaWYgKG51bGwgPT09ICR2YXIpIHsKcmV0dXJuIGZhbHNlOwp9CiRlbmNvZGluZyA9IHNlbGY6OiRpbnRlcm5hbEVuY29kaW5nOwp9CgppZiAoIVxpc19hcnJheSgkdmFyKSkgewpyZXR1cm4gc2VsZjo6bWJfZGV0ZWN0X2VuY29kaW5nKCR2YXIsIFskZW5jb2RpbmddKSB8fCBmYWxzZSAhPT0gQGljb252KCRlbmNvZGluZywgJGVuY29kaW5nLCAkdmFyKTsKfQoKZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWx1ZSkgewppZiAoIXNlbGY6Om1iX2NoZWNrX2VuY29kaW5nKCRrZXksICRlbmNvZGluZykpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICghc2VsZjo6bWJfY2hlY2tfZW5jb2RpbmcoJHZhbHVlLCAkZW5jb2RpbmcpKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0ciwgJGVuY29kaW5nTGlzdCA9IG51bGwsICRzdHJpY3QgPSBmYWxzZSkKewppZiAobnVsbCA9PT0gJGVuY29kaW5nTGlzdCkgewokZW5jb2RpbmdMaXN0ID0gc2VsZjo6JGVuY29kaW5nTGlzdDsKfSBlbHNlIHsKaWYgKCFcaXNfYXJyYXkoJGVuY29kaW5nTGlzdCkpIHsKJGVuY29kaW5nTGlzdCA9IGFycmF5X21hcCgndHJpbScsIGV4cGxvZGUoJywnLCAkZW5jb2RpbmdMaXN0KSk7Cn0KJGVuY29kaW5nTGlzdCA9IGFycmF5X21hcCgnc3RydG91cHBlcicsICRlbmNvZGluZ0xpc3QpOwp9Cgpmb3JlYWNoICgkZW5jb2RpbmdMaXN0IGFzICRlbmMpIHsKc3dpdGNoICgkZW5jKSB7CmNhc2UgJ0FTQ0lJJzoKaWYgKCFwcmVnX21hdGNoKCcvW1x4ODAtXHhGRl0vJywgJHN0cikpIHsKcmV0dXJuICRlbmM7Cn0KYnJlYWs7CgpjYXNlICdVVEY4JzoKY2FzZSAnVVRGLTgnOgppZiAocHJlZ19tYXRjaCgnLy91JywgJHN0cikpIHsKcmV0dXJuICdVVEYtOCc7Cn0KYnJlYWs7CgpkZWZhdWx0OgppZiAoMCA9PT0gc3RybmNtcCgkZW5jLCAnSVNPLTg4NTktJywgOSkpIHsKcmV0dXJuICRlbmM7Cn0KfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZGV0ZWN0X29yZGVyKCRlbmNvZGluZ0xpc3QgPSBudWxsKQp7CmlmIChudWxsID09PSAkZW5jb2RpbmdMaXN0KSB7CnJldHVybiBzZWxmOjokZW5jb2RpbmdMaXN0Owp9CgppZiAoIVxpc19hcnJheSgkZW5jb2RpbmdMaXN0KSkgewokZW5jb2RpbmdMaXN0ID0gYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgnLCcsICRlbmNvZGluZ0xpc3QpKTsKfQokZW5jb2RpbmdMaXN0ID0gYXJyYXlfbWFwKCdzdHJ0b3VwcGVyJywgJGVuY29kaW5nTGlzdCk7Cgpmb3JlYWNoICgkZW5jb2RpbmdMaXN0IGFzICRlbmMpIHsKc3dpdGNoICgkZW5jKSB7CmRlZmF1bHQ6CmlmIChzdHJuY21wKCRlbmMsICdJU08tODg1OS0nLCA5KSkgewpyZXR1cm4gZmFsc2U7Cn0KCmNhc2UgJ0FTQ0lJJzoKY2FzZSAnVVRGOCc6CmNhc2UgJ1VURi04JzoKfQp9CgpzZWxmOjokZW5jb2RpbmdMaXN0ID0gJGVuY29kaW5nTGlzdDsKCnJldHVybiB0cnVlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cmxlbigkcywgJGVuY29kaW5nID0gbnVsbCkKewokZW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpOwppZiAoJ0NQODUwJyA9PT0gJGVuY29kaW5nIHx8ICdBU0NJSScgPT09ICRlbmNvZGluZykgewpyZXR1cm4gXHN0cmxlbigkcyk7Cn0KCnJldHVybiBAaWNvbnZfc3RybGVuKCRzLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CmlmICgnQ1A4NTAnID09PSAkZW5jb2RpbmcgfHwgJ0FTQ0lJJyA9PT0gJGVuY29kaW5nKSB7CnJldHVybiBzdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0KTsKfQoKJG5lZWRsZSA9IChzdHJpbmcpICRuZWVkbGU7CmlmICgnJyA9PT0gJG5lZWRsZSkgewppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKdHJpZ2dlcl9lcnJvcihfX01FVEhPRF9fLic6IEVtcHR5IGRlbGltaXRlcicsIFxFX1VTRVJfV0FSTklORyk7CgpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiAwOwp9CgpyZXR1cm4gaWNvbnZfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCwgJGVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDAsICRlbmNvZGluZyA9IG51bGwpCnsKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKaWYgKCdDUDg1MCcgPT09ICRlbmNvZGluZyB8fCAnQVNDSUknID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuIHN0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0KTsKfQoKaWYgKCRvZmZzZXQgIT0gKGludCkgJG9mZnNldCkgewokb2Zmc2V0ID0gMDsKfSBlbHNlaWYgKCRvZmZzZXQgPSAoaW50KSAkb2Zmc2V0KSB7CmlmICgkb2Zmc2V0IDwgMCkgewppZiAoMCA+ICRvZmZzZXQgKz0gc2VsZjo6bWJfc3RybGVuKCRuZWVkbGUpKSB7CiRoYXlzdGFjayA9IHNlbGY6Om1iX3N1YnN0cigkaGF5c3RhY2ssIDAsICRvZmZzZXQsICRlbmNvZGluZyk7Cn0KJG9mZnNldCA9IDA7Cn0gZWxzZSB7CiRoYXlzdGFjayA9IHNlbGY6Om1iX3N1YnN0cigkaGF5c3RhY2ssICRvZmZzZXQsIDIxNDc0ODM2NDcsICRlbmNvZGluZyk7Cn0KfQoKJHBvcyA9ICcnICE9PSAkbmVlZGxlIHx8IDgwMDAwID4gXFBIUF9WRVJTSU9OX0lECj8gaWNvbnZfc3RycnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRlbmNvZGluZykKOiBzZWxmOjptYl9zdHJsZW4oJGhheXN0YWNrLCAkZW5jb2RpbmcpOwoKcmV0dXJuIGZhbHNlICE9PSAkcG9zID8gJG9mZnNldCArICRwb3MgOiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdHJfc3BsaXQoJHN0cmluZywgJHNwbGl0X2xlbmd0aCA9IDEsICRlbmNvZGluZyA9IG51bGwpCnsKaWYgKG51bGwgIT09ICRzdHJpbmcgJiYgIVxpc19zY2FsYXIoJHN0cmluZykgJiYgIShcaXNfb2JqZWN0KCRzdHJpbmcpICYmIG1ldGhvZF9leGlzdHMoJHN0cmluZywgJ19fdG9TdHJpbmcnKSkpIHsKdHJpZ2dlcl9lcnJvcignbWJfc3RyX3NwbGl0KCkgZXhwZWN0cyBwYXJhbWV0ZXIgMSB0byBiZSBzdHJpbmcsICcuXGdldHR5cGUoJHN0cmluZykuJyBnaXZlbicsIFxFX1VTRVJfV0FSTklORyk7CgpyZXR1cm4gbnVsbDsKfQoKaWYgKDEgPiAkc3BsaXRfbGVuZ3RoID0gKGludCkgJHNwbGl0X2xlbmd0aCkgewppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKdHJpZ2dlcl9lcnJvcignVGhlIGxlbmd0aCBvZiBlYWNoIHNlZ21lbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybycsIFxFX1VTRVJfV0FSTklORyk7CgpyZXR1cm4gZmFsc2U7Cn0KCnRocm93IG5ldyBcVmFsdWVFcnJvcignQXJndW1lbnQgIzIgKCRsZW5ndGgpIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTsKfQoKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewokZW5jb2RpbmcgPSBtYl9pbnRlcm5hbF9lbmNvZGluZygpOwp9CgppZiAoJ1VURi04JyA9PT0gJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKSkgewokcnggPSAnLygnOwp3aGlsZSAoNjU1MzUgPCAkc3BsaXRfbGVuZ3RoKSB7CiRyeCAuPSAnLns2NTUzNX0nOwokc3BsaXRfbGVuZ3RoIC09IDY1NTM1Owp9CiRyeCAuPSAnLnsnLiRzcGxpdF9sZW5ndGguJ30pL3VzJzsKCnJldHVybiBwcmVnX3NwbGl0KCRyeCwgJHN0cmluZywgLTEsIFxQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUgfCBcUFJFR19TUExJVF9OT19FTVBUWSk7Cn0KCiRyZXN1bHQgPSBbXTsKJGxlbmd0aCA9IG1iX3N0cmxlbigkc3RyaW5nLCAkZW5jb2RpbmcpOwoKZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgJGkgKz0gJHNwbGl0X2xlbmd0aCkgewokcmVzdWx0W10gPSBtYl9zdWJzdHIoJHN0cmluZywgJGksICRzcGxpdF9sZW5ndGgsICRlbmNvZGluZyk7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cnRvbG93ZXIoJHMsICRlbmNvZGluZyA9IG51bGwpCnsKcmV0dXJuIHNlbGY6Om1iX2NvbnZlcnRfY2FzZSgkcywgXE1CX0NBU0VfTE9XRVIsICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RydG91cHBlcigkcywgJGVuY29kaW5nID0gbnVsbCkKewpyZXR1cm4gc2VsZjo6bWJfY29udmVydF9jYXNlKCRzLCBcTUJfQ0FTRV9VUFBFUiwgJGVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdWJzdGl0dXRlX2NoYXJhY3RlcigkYyA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRjKSB7CnJldHVybiAnbm9uZSc7Cn0KaWYgKDAgPT09IHN0cmNhc2VjbXAoJGMsICdub25lJykpIHsKcmV0dXJuIHRydWU7Cn0KaWYgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEKSB7CnJldHVybiBmYWxzZTsKfQppZiAoXGlzX2ludCgkYykgfHwgJ2xvbmcnID09PSAkYyB8fCAnZW50aXR5JyA9PT0gJGMpIHsKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoJ0FyZ3VtZW50ICMxICgkc3Vic3RpdHV0ZV9jaGFyYWN0ZXIpIG11c3QgYmUgIm5vbmUiLCAibG9uZyIsICJlbnRpdHkiIG9yIGEgdmFsaWQgY29kZXBvaW50Jyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3Vic3RyKCRzLCAkc3RhcnQsICRsZW5ndGggPSBudWxsLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CmlmICgnQ1A4NTAnID09PSAkZW5jb2RpbmcgfHwgJ0FTQ0lJJyA9PT0gJGVuY29kaW5nKSB7CnJldHVybiAoc3RyaW5nKSBzdWJzdHIoJHMsICRzdGFydCwgbnVsbCA9PT0gJGxlbmd0aCA/IDIxNDc0ODM2NDcgOiAkbGVuZ3RoKTsKfQoKaWYgKCRzdGFydCA8IDApIHsKJHN0YXJ0ID0gaWNvbnZfc3RybGVuKCRzLCAkZW5jb2RpbmcpICsgJHN0YXJ0OwppZiAoJHN0YXJ0IDwgMCkgewokc3RhcnQgPSAwOwp9Cn0KCmlmIChudWxsID09PSAkbGVuZ3RoKSB7CiRsZW5ndGggPSAyMTQ3NDgzNjQ3Owp9IGVsc2VpZiAoJGxlbmd0aCA8IDApIHsKJGxlbmd0aCA9IGljb252X3N0cmxlbigkcywgJGVuY29kaW5nKSArICRsZW5ndGggLSAkc3RhcnQ7CmlmICgkbGVuZ3RoIDwgMCkgewpyZXR1cm4gJyc7Cn0KfQoKcmV0dXJuIChzdHJpbmcpIGljb252X3N1YnN0cigkcywgJHN0YXJ0LCAkbGVuZ3RoLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkKewpbJGhheXN0YWNrLCAkbmVlZGxlXSA9IHN0cl9yZXBsYWNlKHNlbGY6OlNJTVBMRV9DQVNFX0ZPTERbMF0sIHNlbGY6OlNJTVBMRV9DQVNFX0ZPTERbMV0sIFsKc2VsZjo6bWJfY29udmVydF9jYXNlKCRoYXlzdGFjaywgXE1CX0NBU0VfTE9XRVIsICRlbmNvZGluZyksCnNlbGY6Om1iX2NvbnZlcnRfY2FzZSgkbmVlZGxlLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKSwKXSk7CgpyZXR1cm4gc2VsZjo6bWJfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCwgJGVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdHJpc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJHBhcnQgPSBmYWxzZSwgJGVuY29kaW5nID0gbnVsbCkKewokcG9zID0gc2VsZjo6bWJfc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsIDAsICRlbmNvZGluZyk7CgpyZXR1cm4gc2VsZjo6Z2V0U3VicGFydCgkcG9zLCAkcGFydCwgJGhheXN0YWNrLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cnJjaHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkcGFydCA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CmlmICgnQ1A4NTAnID09PSAkZW5jb2RpbmcgfHwgJ0FTQ0lJJyA9PT0gJGVuY29kaW5nKSB7CiRwb3MgPSBzdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSk7Cn0gZWxzZSB7CiRuZWVkbGUgPSBzZWxmOjptYl9zdWJzdHIoJG5lZWRsZSwgMCwgMSwgJGVuY29kaW5nKTsKJHBvcyA9IGljb252X3N0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkZW5jb2RpbmcpOwp9CgpyZXR1cm4gc2VsZjo6Z2V0U3VicGFydCgkcG9zLCAkcGFydCwgJGhheXN0YWNrLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cnJpY2hyKCRoYXlzdGFjaywgJG5lZWRsZSwgJHBhcnQgPSBmYWxzZSwgJGVuY29kaW5nID0gbnVsbCkKewokbmVlZGxlID0gc2VsZjo6bWJfc3Vic3RyKCRuZWVkbGUsIDAsIDEsICRlbmNvZGluZyk7CiRwb3MgPSBzZWxmOjptYl9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRlbmNvZGluZyk7CgpyZXR1cm4gc2VsZjo6Z2V0U3VicGFydCgkcG9zLCAkcGFydCwgJGhheXN0YWNrLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cnJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDAsICRlbmNvZGluZyA9IG51bGwpCnsKJGhheXN0YWNrID0gc2VsZjo6bWJfY29udmVydF9jYXNlKCRoYXlzdGFjaywgXE1CX0NBU0VfTE9XRVIsICRlbmNvZGluZyk7CiRuZWVkbGUgPSBzZWxmOjptYl9jb252ZXJ0X2Nhc2UoJG5lZWRsZSwgXE1CX0NBU0VfTE9XRVIsICRlbmNvZGluZyk7CgokaGF5c3RhY2sgPSBzdHJfcmVwbGFjZShzZWxmOjpTSU1QTEVfQ0FTRV9GT0xEWzBdLCBzZWxmOjpTSU1QTEVfQ0FTRV9GT0xEWzFdLCAkaGF5c3RhY2spOwokbmVlZGxlID0gc3RyX3JlcGxhY2Uoc2VsZjo6U0lNUExFX0NBU0VfRk9MRFswXSwgc2VsZjo6U0lNUExFX0NBU0VfRk9MRFsxXSwgJG5lZWRsZSk7CgpyZXR1cm4gc2VsZjo6bWJfc3RycnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3Ryc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJHBhcnQgPSBmYWxzZSwgJGVuY29kaW5nID0gbnVsbCkKewokcG9zID0gc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSk7CmlmIChmYWxzZSA9PT0gJHBvcykgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCRwYXJ0KSB7CnJldHVybiBzdWJzdHIoJGhheXN0YWNrLCAwLCAkcG9zKTsKfQoKcmV0dXJuIHN1YnN0cigkaGF5c3RhY2ssICRwb3MpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2dldF9pbmZvKCR0eXBlID0gJ2FsbCcpCnsKJGluZm8gPSBbCidpbnRlcm5hbF9lbmNvZGluZycgPT4gc2VsZjo6JGludGVybmFsRW5jb2RpbmcsCidodHRwX291dHB1dCcgPT4gJ3Bhc3MnLAonaHR0cF9vdXRwdXRfY29udl9taW1ldHlwZXMnID0+ICdeKHRleHQvfGFwcGxpY2F0aW9uL3hodG1sXCt4bWwpJywKJ2Z1bmNfb3ZlcmxvYWQnID0+IDAsCidmdW5jX292ZXJsb2FkX2xpc3QnID0+ICdubyBvdmVybG9hZCcsCidtYWlsX2NoYXJzZXQnID0+ICdVVEYtOCcsCidtYWlsX2hlYWRlcl9lbmNvZGluZycgPT4gJ0JBU0U2NCcsCidtYWlsX2JvZHlfZW5jb2RpbmcnID0+ICdCQVNFNjQnLAonaWxsZWdhbF9jaGFycycgPT4gMCwKJ2VuY29kaW5nX3RyYW5zbGF0aW9uJyA9PiAnT2ZmJywKJ2xhbmd1YWdlJyA9PiBzZWxmOjokbGFuZ3VhZ2UsCidkZXRlY3Rfb3JkZXInID0+IHNlbGY6OiRlbmNvZGluZ0xpc3QsCidzdWJzdGl0dXRlX2NoYXJhY3RlcicgPT4gJ25vbmUnLAonc3RyaWN0X2RldGVjdGlvbicgPT4gJ09mZicsCl07CgppZiAoJ2FsbCcgPT09ICR0eXBlKSB7CnJldHVybiAkaW5mbzsKfQppZiAoaXNzZXQoJGluZm9bJHR5cGVdKSkgewpyZXR1cm4gJGluZm9bJHR5cGVdOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfaHR0cF9pbnB1dCgkdHlwZSA9ICcnKQp7CnJldHVybiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9odHRwX291dHB1dCgkZW5jb2RpbmcgPSBudWxsKQp7CnJldHVybiBudWxsICE9PSAkZW5jb2RpbmcgPyAncGFzcycgPT09ICRlbmNvZGluZyA6ICdwYXNzJzsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdHJ3aWR0aCgkcywgJGVuY29kaW5nID0gbnVsbCkKewokZW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpOwoKaWYgKCdVVEYtOCcgIT09ICRlbmNvZGluZykgewokcyA9IGljb252KCRlbmNvZGluZywgJ1VURi04Ly9JR05PUkUnLCAkcyk7Cn0KCiRzID0gcHJlZ19yZXBsYWNlKCcvW1x4ezExMDB9LVx4ezExNUZ9XHh7MjMyOX1ceHsyMzJBfVx4ezJFODB9LVx4ezMwM0V9XHh7MzA0MH0tXHh7QTRDRn1ceHtBQzAwfS1ceHtEN0EzfVx4e0Y5MDB9LVx4e0ZBRkZ9XHh7RkUxMH0tXHh7RkUxOX1ceHtGRTMwfS1ceHtGRTZGfVx4e0ZGMDB9LVx4e0ZGNjB9XHh7RkZFMH0tXHh7RkZFNn1ceHsyMDAwMH0tXHh7MkZGRkR9XHh7MzAwMDB9LVx4ezNGRkZEfV0vdScsICcnLCAkcywgLTEsICR3aWRlKTsKCnJldHVybiAoJHdpZGUgPDwgMSkgKyBpY29udl9zdHJsZW4oJHMsICdVVEYtOCcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N1YnN0cl9jb3VudCgkaGF5c3RhY2ssICRuZWVkbGUsICRlbmNvZGluZyA9IG51bGwpCnsKcmV0dXJuIHN1YnN0cl9jb3VudCgkaGF5c3RhY2ssICRuZWVkbGUpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX291dHB1dF9oYW5kbGVyKCRjb250ZW50cywgJHN0YXR1cykKewpyZXR1cm4gJGNvbnRlbnRzOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2NocigkY29kZSwgJGVuY29kaW5nID0gbnVsbCkKewppZiAoMHg4MCA+ICRjb2RlICU9IDB4MjAwMDAwKSB7CiRzID0gXGNocigkY29kZSk7Cn0gZWxzZWlmICgweDgwMCA+ICRjb2RlKSB7CiRzID0gXGNocigweEMwIHwgJGNvZGUgPj4gNikuXGNocigweDgwIHwgJGNvZGUgJiAweDNGKTsKfSBlbHNlaWYgKDB4MTAwMDAgPiAkY29kZSkgewokcyA9IFxjaHIoMHhFMCB8ICRjb2RlID4+IDEyKS5cY2hyKDB4ODAgfCAkY29kZSA+PiA2ICYgMHgzRikuXGNocigweDgwIHwgJGNvZGUgJiAweDNGKTsKfSBlbHNlIHsKJHMgPSBcY2hyKDB4RjAgfCAkY29kZSA+PiAxOCkuXGNocigweDgwIHwgJGNvZGUgPj4gMTIgJiAweDNGKS5cY2hyKDB4ODAgfCAkY29kZSA+PiA2ICYgMHgzRikuXGNocigweDgwIHwgJGNvZGUgJiAweDNGKTsKfQoKaWYgKCdVVEYtOCcgIT09ICRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZykpIHsKJHMgPSBtYl9jb252ZXJ0X2VuY29kaW5nKCRzLCAkZW5jb2RpbmcsICdVVEYtOCcpOwp9CgpyZXR1cm4gJHM7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfb3JkKCRzLCAkZW5jb2RpbmcgPSBudWxsKQp7CmlmICgnVVRGLTgnICE9PSAkZW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpKSB7CiRzID0gbWJfY29udmVydF9lbmNvZGluZygkcywgJ1VURi04JywgJGVuY29kaW5nKTsKfQoKaWYgKDEgPT09IFxzdHJsZW4oJHMpKSB7CnJldHVybiBcb3JkKCRzKTsKfQoKJGNvZGUgPSAoJHMgPSB1bnBhY2soJ0MqJywgc3Vic3RyKCRzLCAwLCA0KSkpID8gJHNbMV0gOiAwOwppZiAoMHhGMCA8PSAkY29kZSkgewpyZXR1cm4gKCgkY29kZSAtIDB4RjApIDw8IDE4KSArICgoJHNbMl0gLSAweDgwKSA8PCAxMikgKyAoKCRzWzNdIC0gMHg4MCkgPDwgNikgKyAkc1s0XSAtIDB4ODA7Cn0KaWYgKDB4RTAgPD0gJGNvZGUpIHsKcmV0dXJuICgoJGNvZGUgLSAweEUwKSA8PCAxMikgKyAoKCRzWzJdIC0gMHg4MCkgPDwgNikgKyAkc1szXSAtIDB4ODA7Cn0KaWYgKDB4QzAgPD0gJGNvZGUpIHsKcmV0dXJuICgoJGNvZGUgLSAweEMwKSA8PCA2KSArICRzWzJdIC0gMHg4MDsKfQoKcmV0dXJuICRjb2RlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cl9wYWQoc3RyaW5nICRzdHJpbmcsIGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZF9zdHJpbmcgPSAnICcsIGludCAkcGFkX3R5cGUgPSBcU1RSX1BBRF9SSUdIVCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nCnsKaWYgKCFcaW5fYXJyYXkoJHBhZF90eXBlLCBbXFNUUl9QQURfUklHSFQsIFxTVFJfUEFEX0xFRlQsIFxTVFJfUEFEX0JPVEhdLCB0cnVlKSkgewp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoJ21iX3N0cl9wYWQoKTogQXJndW1lbnQgIzQgKCRwYWRfdHlwZSkgbXVzdCBiZSBTVFJfUEFEX0xFRlQsIFNUUl9QQURfUklHSFQsIG9yIFNUUl9QQURfQk9USCcpOwp9CgppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IHNlbGY6Om1iX2ludGVybmFsX2VuY29kaW5nKCk7Cn0gZWxzZSB7CnNlbGY6OmFzc2VydEVuY29kaW5nKCRlbmNvZGluZywgJ21iX3N0cl9wYWQoKTogQXJndW1lbnQgIzUgKCRlbmNvZGluZykgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nLCAiJXMiIGdpdmVuJyk7Cn0KCmlmIChzZWxmOjptYl9zdHJsZW4oJHBhZF9zdHJpbmcsICRlbmNvZGluZykgPD0gMCkgewp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoJ21iX3N0cl9wYWQoKTogQXJndW1lbnQgIzMgKCRwYWRfc3RyaW5nKSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpOwp9CgokcGFkZGluZ1JlcXVpcmVkID0gJGxlbmd0aCAtIHNlbGY6Om1iX3N0cmxlbigkc3RyaW5nLCAkZW5jb2RpbmcpOwoKaWYgKCRwYWRkaW5nUmVxdWlyZWQgPCAxKSB7CnJldHVybiAkc3RyaW5nOwp9Cgpzd2l0Y2ggKCRwYWRfdHlwZSkgewpjYXNlIFxTVFJfUEFEX0xFRlQ6CnJldHVybiBzZWxmOjptYl9zdWJzdHIoc3RyX3JlcGVhdCgkcGFkX3N0cmluZywgJHBhZGRpbmdSZXF1aXJlZCksIDAsICRwYWRkaW5nUmVxdWlyZWQsICRlbmNvZGluZykuJHN0cmluZzsKY2FzZSBcU1RSX1BBRF9SSUdIVDoKcmV0dXJuICRzdHJpbmcuc2VsZjo6bWJfc3Vic3RyKHN0cl9yZXBlYXQoJHBhZF9zdHJpbmcsICRwYWRkaW5nUmVxdWlyZWQpLCAwLCAkcGFkZGluZ1JlcXVpcmVkLCAkZW5jb2RpbmcpOwpkZWZhdWx0OgokbGVmdFBhZGRpbmdMZW5ndGggPSBmbG9vcigkcGFkZGluZ1JlcXVpcmVkIC8gMik7CiRyaWdodFBhZGRpbmdMZW5ndGggPSAkcGFkZGluZ1JlcXVpcmVkIC0gJGxlZnRQYWRkaW5nTGVuZ3RoOwoKcmV0dXJuIHNlbGY6Om1iX3N1YnN0cihzdHJfcmVwZWF0KCRwYWRfc3RyaW5nLCAkbGVmdFBhZGRpbmdMZW5ndGgpLCAwLCAkbGVmdFBhZGRpbmdMZW5ndGgsICRlbmNvZGluZykuJHN0cmluZy5zZWxmOjptYl9zdWJzdHIoc3RyX3JlcGVhdCgkcGFkX3N0cmluZywgJHJpZ2h0UGFkZGluZ0xlbmd0aCksIDAsICRyaWdodFBhZGRpbmdMZW5ndGgsICRlbmNvZGluZyk7Cn0KfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl91Y2ZpcnN0KHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcKewppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IHNlbGY6Om1iX2ludGVybmFsX2VuY29kaW5nKCk7Cn0gZWxzZSB7CnNlbGY6OmFzc2VydEVuY29kaW5nKCRlbmNvZGluZywgJ21iX3VjZmlyc3QoKTogQXJndW1lbnQgIzIgKCRlbmNvZGluZykgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nLCAiJXMiIGdpdmVuJyk7Cn0KCiRmaXJzdENoYXIgPSBtYl9zdWJzdHIoJHN0cmluZywgMCwgMSwgJGVuY29kaW5nKTsKJGZpcnN0Q2hhciA9IG1iX2NvbnZlcnRfY2FzZSgkZmlyc3RDaGFyLCBcTUJfQ0FTRV9USVRMRSwgJGVuY29kaW5nKTsKCnJldHVybiAkZmlyc3RDaGFyLm1iX3N1YnN0cigkc3RyaW5nLCAxLCBudWxsLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2xjZmlyc3Qoc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZwp7CmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gc2VsZjo6bWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsKfSBlbHNlIHsKc2VsZjo6YXNzZXJ0RW5jb2RpbmcoJGVuY29kaW5nLCAnbWJfbGNmaXJzdCgpOiBBcmd1bWVudCAjMiAoJGVuY29kaW5nKSBtdXN0IGJlIGEgdmFsaWQgZW5jb2RpbmcsICIlcyIgZ2l2ZW4nKTsKfQoKJGZpcnN0Q2hhciA9IG1iX3N1YnN0cigkc3RyaW5nLCAwLCAxLCAkZW5jb2RpbmcpOwokZmlyc3RDaGFyID0gbWJfY29udmVydF9jYXNlKCRmaXJzdENoYXIsIFxNQl9DQVNFX0xPV0VSLCAkZW5jb2RpbmcpOwoKcmV0dXJuICRmaXJzdENoYXIubWJfc3Vic3RyKCRzdHJpbmcsIDEsIG51bGwsICRlbmNvZGluZyk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldFN1YnBhcnQoJHBvcywgJHBhcnQsICRoYXlzdGFjaywgJGVuY29kaW5nKQp7CmlmIChmYWxzZSA9PT0gJHBvcykgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCRwYXJ0KSB7CnJldHVybiBzZWxmOjptYl9zdWJzdHIoJGhheXN0YWNrLCAwLCAkcG9zLCAkZW5jb2RpbmcpOwp9CgpyZXR1cm4gc2VsZjo6bWJfc3Vic3RyKCRoYXlzdGFjaywgJHBvcywgbnVsbCwgJGVuY29kaW5nKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaHRtbF9lbmNvZGluZ19jYWxsYmFjayhhcnJheSAkbSkKewokaSA9IDE7CiRlbnRpdGllcyA9ICcnOwokbSA9IHVucGFjaygnQyonLCBodG1sZW50aXRpZXMoJG1bMF0sIFxFTlRfQ09NUEFULCAnVVRGLTgnKSk7Cgp3aGlsZSAoaXNzZXQoJG1bJGldKSkgewppZiAoMHg4MCA+ICRtWyRpXSkgewokZW50aXRpZXMgLj0gXGNocigkbVskaSsrXSk7CmNvbnRpbnVlOwp9CmlmICgweEYwIDw9ICRtWyRpXSkgewokYyA9ICgoJG1bJGkrK10gLSAweEYwKSA8PCAxOCkgKyAoKCRtWyRpKytdIC0gMHg4MCkgPDwgMTIpICsgKCgkbVskaSsrXSAtIDB4ODApIDw8IDYpICsgJG1bJGkrK10gLSAweDgwOwp9IGVsc2VpZiAoMHhFMCA8PSAkbVskaV0pIHsKJGMgPSAoKCRtWyRpKytdIC0gMHhFMCkgPDwgMTIpICsgKCgkbVskaSsrXSAtIDB4ODApIDw8IDYpICsgJG1bJGkrK10gLSAweDgwOwp9IGVsc2UgewokYyA9ICgoJG1bJGkrK10gLSAweEMwKSA8PCA2KSArICRtWyRpKytdIC0gMHg4MDsKfQoKJGVudGl0aWVzIC49ICcmIycuJGMuJzsnOwp9CgpyZXR1cm4gJGVudGl0aWVzOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB0aXRsZV9jYXNlKGFycmF5ICRzKQp7CnJldHVybiBzZWxmOjptYl9jb252ZXJ0X2Nhc2UoJHNbMV0sIFxNQl9DQVNFX1VQUEVSLCAnVVRGLTgnKS5zZWxmOjptYl9jb252ZXJ0X2Nhc2UoJHNbMl0sIFxNQl9DQVNFX0xPV0VSLCAnVVRGLTgnKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0RGF0YSgkZmlsZSkKewppZiAoZmlsZV9leGlzdHMoJGZpbGUgPSBfX0RJUl9fLicvUmVzb3VyY2VzL3VuaWRhdGEvJy4kZmlsZS4nLnBocCcpKSB7CnJldHVybiByZXF1aXJlICRmaWxlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEVuY29kaW5nKCRlbmNvZGluZykKewppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CnJldHVybiBzZWxmOjokaW50ZXJuYWxFbmNvZGluZzsKfQoKaWYgKCdVVEYtOCcgPT09ICRlbmNvZGluZykgewpyZXR1cm4gJ1VURi04JzsKfQoKJGVuY29kaW5nID0gc3RydG91cHBlcigkZW5jb2RpbmcpOwoKaWYgKCc4QklUJyA9PT0gJGVuY29kaW5nIHx8ICdCSU5BUlknID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuICdDUDg1MCc7Cn0KCmlmICgnVVRGOCcgPT09ICRlbmNvZGluZykgewpyZXR1cm4gJ1VURi04JzsKfQoKcmV0dXJuICRlbmNvZGluZzsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl90cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6Om1iX2ludGVybmFsX3RyaW0oJ3teWyVzXSt8WyUxJHNdKyR9RHUnLCAkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nLCBfX0ZVTkNUSU9OX18pOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2x0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6Om1iX2ludGVybmFsX3RyaW0oJ3teWyVzXSt9RHUnLCAkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nLCBfX0ZVTkNUSU9OX18pOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3J0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6Om1iX2ludGVybmFsX3RyaW0oJ3tbJXNdKyR9RHUnLCAkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nLCBfX0ZVTkNUSU9OX18pOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBtYl9pbnRlcm5hbF90cmltKHN0cmluZyAkcmVnZXgsIHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzLCA/c3RyaW5nICRlbmNvZGluZywgc3RyaW5nICRmdW5jdGlvbik6IHN0cmluZwp7CmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gc2VsZjo6bWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsKfSBlbHNlIHsKc2VsZjo6YXNzZXJ0RW5jb2RpbmcoJGVuY29kaW5nLCAkZnVuY3Rpb24uJygpOiBBcmd1bWVudCAjMyAoJGVuY29kaW5nKSBtdXN0IGJlIGEgdmFsaWQgZW5jb2RpbmcsICIlcyIgZ2l2ZW4nKTsKfQoKaWYgKCcnID09PSAkY2hhcmFjdGVycykgewpyZXR1cm4gbnVsbCA9PT0gJGVuY29kaW5nID8gJHN0cmluZyA6IHNlbGY6Om1iX2NvbnZlcnRfZW5jb2RpbmcoJHN0cmluZywgJGVuY29kaW5nKTsKfQoKaWYgKCdVVEYtOCcgPT09ICRlbmNvZGluZykgewokZW5jb2RpbmcgPSBudWxsOwppZiAoIXByZWdfbWF0Y2goJy8vdScsICRzdHJpbmcpKSB7CiRzdHJpbmcgPSBAaWNvbnYoJ1VURi04JywgJ1VURi04Ly9JR05PUkUnLCAkc3RyaW5nKTsKfQppZiAobnVsbCAhPT0gJGNoYXJhY3RlcnMgJiYgIXByZWdfbWF0Y2goJy8vdScsICRjaGFyYWN0ZXJzKSkgewokY2hhcmFjdGVycyA9IEBpY29udignVVRGLTgnLCAnVVRGLTgvL0lHTk9SRScsICRjaGFyYWN0ZXJzKTsKfQp9IGVsc2Ugewokc3RyaW5nID0gaWNvbnYoJGVuY29kaW5nLCAnVVRGLTgvL0lHTk9SRScsICRzdHJpbmcpOwoKaWYgKG51bGwgIT09ICRjaGFyYWN0ZXJzKSB7CiRjaGFyYWN0ZXJzID0gaWNvbnYoJGVuY29kaW5nLCAnVVRGLTgvL0lHTk9SRScsICRjaGFyYWN0ZXJzKTsKfQp9CgppZiAobnVsbCA9PT0gJGNoYXJhY3RlcnMpIHsKJGNoYXJhY3RlcnMgPSAiXFwwIFxmXG5cclx0XHZcdXswMEEwfVx1ezE2ODB9XHV7MjAwMH1cdXsyMDAxfVx1ezIwMDJ9XHV7MjAwM31cdXsyMDA0fVx1ezIwMDV9XHV7MjAwNn1cdXsyMDA3fVx1ezIwMDh9XHV7MjAwOX1cdXsyMDBBfVx1ezIwMjh9XHV7MjAyOX1cdXsyMDJGfVx1ezIwNUZ9XHV7MzAwMH1cdXswMDg1fVx1ezE4MEV9IjsKfSBlbHNlIHsKJGNoYXJhY3RlcnMgPSBwcmVnX3F1b3RlKCRjaGFyYWN0ZXJzKTsKfQoKJHN0cmluZyA9IHByZWdfcmVwbGFjZShzcHJpbnRmKCRyZWdleCwgJGNoYXJhY3RlcnMpLCAnJywgJHN0cmluZyk7CgppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CnJldHVybiAkc3RyaW5nOwp9CgpyZXR1cm4gaWNvbnYoJ1VURi04JywgJGVuY29kaW5nLicvL0lHTk9SRScsICRzdHJpbmcpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnRFbmNvZGluZyhzdHJpbmcgJGVuY29kaW5nLCBzdHJpbmcgJGVycm9yRm9ybWF0KTogdm9pZAp7CnRyeSB7CiR2YWxpZEVuY29kaW5nID0gQHNlbGY6Om1iX2NoZWNrX2VuY29kaW5nKCcnLCAkZW5jb2RpbmcpOwp9IGNhdGNoIChcVmFsdWVFcnJvciAkZSkgewp0aHJvdyBuZXcgXFZhbHVlRXJyb3Ioc3ByaW50ZigkZXJyb3JGb3JtYXQsICRlbmNvZGluZykpOwp9CgoKaWYgKCEkdmFsaWRFbmNvZGluZykgewp0aHJvdyBuZXcgXFZhbHVlRXJyb3Ioc3ByaW50ZigkZXJyb3JGb3JtYXQsICRlbmNvZGluZykpOwp9Cn0KfQo8P3BocAoKcmV0dXJuIFsKJ8SwJyA9PiAnacyHJywKJ8K1JyA9PiAnzrwnLAonxb8nID0+ICdzJywKJ82FJyA9PiAnzrknLAonz4InID0+ICfPgycsCifPkCcgPT4gJ86yJywKJ8+RJyA9PiAnzrgnLAonz5UnID0+ICfPhicsCifPlicgPT4gJ8+AJywKJ8+wJyA9PiAnzronLAonz7EnID0+ICfPgScsCifPtScgPT4gJ861JywKJ+G6mycgPT4gJ+G5oScsCifhvr4nID0+ICfOuScsCifDnycgPT4gJ3NzJywKJ8WJJyA9PiAnyrxuJywKJ8ewJyA9PiAnx7AnLAonzpAnID0+ICfOkCcsCifOsCcgPT4gJ86wJywKJ9aHJyA9PiAn1aXWgicsCifhupYnID0+ICfhupYnLAon4bqXJyA9PiAn4bqXJywKJ+G6mCcgPT4gJ+G6mCcsCifhupknID0+ICfhupknLAon4bqaJyA9PiAnYcq+JywKJ+G6nicgPT4gJ3NzJywKJ+G9kCcgPT4gJ+G9kCcsCifhvZInID0+ICfhvZInLAon4b2UJyA9PiAn4b2UJywKJ+G9licgPT4gJ+G9licsCifhvoAnID0+ICfhvIDOuScsCifhvoEnID0+ICfhvIHOuScsCifhvoInID0+ICfhvILOuScsCifhvoMnID0+ICfhvIPOuScsCifhvoQnID0+ICfhvITOuScsCifhvoUnID0+ICfhvIXOuScsCifhvoYnID0+ICfhvIbOuScsCifhvocnID0+ICfhvIfOuScsCifhvognID0+ICfhvIDOuScsCifhvoknID0+ICfhvIHOuScsCifhvoonID0+ICfhvILOuScsCifhvosnID0+ICfhvIPOuScsCifhvownID0+ICfhvITOuScsCifhvo0nID0+ICfhvIXOuScsCifhvo4nID0+ICfhvIbOuScsCifhvo8nID0+ICfhvIfOuScsCifhvpAnID0+ICfhvKDOuScsCifhvpEnID0+ICfhvKHOuScsCifhvpInID0+ICfhvKLOuScsCifhvpMnID0+ICfhvKPOuScsCifhvpQnID0+ICfhvKTOuScsCifhvpUnID0+ICfhvKXOuScsCifhvpYnID0+ICfhvKbOuScsCifhvpcnID0+ICfhvKfOuScsCifhvpgnID0+ICfhvKDOuScsCifhvpknID0+ICfhvKHOuScsCifhvponID0+ICfhvKLOuScsCifhvpsnID0+ICfhvKPOuScsCifhvpwnID0+ICfhvKTOuScsCifhvp0nID0+ICfhvKXOuScsCifhvp4nID0+ICfhvKbOuScsCifhvp8nID0+ICfhvKfOuScsCifhvqAnID0+ICfhvaDOuScsCifhvqEnID0+ICfhvaHOuScsCifhvqInID0+ICfhvaLOuScsCifhvqMnID0+ICfhvaPOuScsCifhvqQnID0+ICfhvaTOuScsCifhvqUnID0+ICfhvaXOuScsCifhvqYnID0+ICfhvabOuScsCifhvqcnID0+ICfhvafOuScsCifhvqgnID0+ICfhvaDOuScsCifhvqknID0+ICfhvaHOuScsCifhvqonID0+ICfhvaLOuScsCifhvqsnID0+ICfhvaPOuScsCifhvqwnID0+ICfhvaTOuScsCifhvq0nID0+ICfhvaXOuScsCifhvq4nID0+ICfhvabOuScsCifhvq8nID0+ICfhvafOuScsCifhvrInID0+ICfhvbDOuScsCifhvrMnID0+ICfOsc65JywKJ+G+tCcgPT4gJ86szrknLAon4b62JyA9PiAn4b62JywKJ+G+tycgPT4gJ+G+ts65JywKJ+G+vCcgPT4gJ86xzrknLAon4b+CJyA9PiAn4b20zrknLAon4b+DJyA9PiAnzrfOuScsCifhv4QnID0+ICfOrs65JywKJ+G/hicgPT4gJ+G/hicsCifhv4cnID0+ICfhv4bOuScsCifhv4wnID0+ICfOt865JywKJ+G/kicgPT4gJ+G/kicsCifhv5YnID0+ICfhv5YnLAon4b+XJyA9PiAn4b+XJywKJ+G/oicgPT4gJ+G/oicsCifhv6QnID0+ICfhv6QnLAon4b+mJyA9PiAn4b+mJywKJ+G/pycgPT4gJ+G/pycsCifhv7InID0+ICfhvbzOuScsCifhv7MnID0+ICfPic65JywKJ+G/tCcgPT4gJ8+OzrknLAon4b+2JyA9PiAn4b+2JywKJ+G/tycgPT4gJ+G/ts65JywKJ+G/vCcgPT4gJ8+JzrknLAon76yAJyA9PiAnZmYnLAon76yBJyA9PiAnZmknLAon76yCJyA9PiAnZmwnLAon76yDJyA9PiAnZmZpJywKJ++shCcgPT4gJ2ZmbCcsCifvrIUnID0+ICdzdCcsCifvrIYnID0+ICdzdCcsCifvrJMnID0+ICfVtNW2JywKJ++slCcgPT4gJ9W01aUnLAon76yVJyA9PiAn1bTVqycsCifvrJYnID0+ICfVvtW2JywKJ++slycgPT4gJ9W01a0nLApdOwo8P3BocAoKcmV0dXJuIGFycmF5ICgKJ0EnID0+ICdhJywKJ0InID0+ICdiJywKJ0MnID0+ICdjJywKJ0QnID0+ICdkJywKJ0UnID0+ICdlJywKJ0YnID0+ICdmJywKJ0cnID0+ICdnJywKJ0gnID0+ICdoJywKJ0knID0+ICdpJywKJ0onID0+ICdqJywKJ0snID0+ICdrJywKJ0wnID0+ICdsJywKJ00nID0+ICdtJywKJ04nID0+ICduJywKJ08nID0+ICdvJywKJ1AnID0+ICdwJywKJ1EnID0+ICdxJywKJ1InID0+ICdyJywKJ1MnID0+ICdzJywKJ1QnID0+ICd0JywKJ1UnID0+ICd1JywKJ1YnID0+ICd2JywKJ1cnID0+ICd3JywKJ1gnID0+ICd4JywKJ1knID0+ICd5JywKJ1onID0+ICd6JywKJ8OAJyA9PiAnw6AnLAonw4EnID0+ICfDoScsCifDgicgPT4gJ8OiJywKJ8ODJyA9PiAnw6MnLAonw4QnID0+ICfDpCcsCifDhScgPT4gJ8OlJywKJ8OGJyA9PiAnw6YnLAonw4cnID0+ICfDpycsCifDiCcgPT4gJ8OoJywKJ8OJJyA9PiAnw6knLAonw4onID0+ICfDqicsCifDiycgPT4gJ8OrJywKJ8OMJyA9PiAnw6wnLAonw40nID0+ICfDrScsCifDjicgPT4gJ8OuJywKJ8OPJyA9PiAnw68nLAonw5AnID0+ICfDsCcsCifDkScgPT4gJ8OxJywKJ8OSJyA9PiAnw7InLAonw5MnID0+ICfDsycsCifDlCcgPT4gJ8O0JywKJ8OVJyA9PiAnw7UnLAonw5YnID0+ICfDticsCifDmCcgPT4gJ8O4JywKJ8OZJyA9PiAnw7knLAonw5onID0+ICfDuicsCifDmycgPT4gJ8O7JywKJ8OcJyA9PiAnw7wnLAonw50nID0+ICfDvScsCifDnicgPT4gJ8O+JywKJ8SAJyA9PiAnxIEnLAonxIInID0+ICfEgycsCifEhCcgPT4gJ8SFJywKJ8SGJyA9PiAnxIcnLAonxIgnID0+ICfEiScsCifEiicgPT4gJ8SLJywKJ8SMJyA9PiAnxI0nLAonxI4nID0+ICfEjycsCifEkCcgPT4gJ8SRJywKJ8SSJyA9PiAnxJMnLAonxJQnID0+ICfElScsCifElicgPT4gJ8SXJywKJ8SYJyA9PiAnxJknLAonxJonID0+ICfEmycsCifEnCcgPT4gJ8SdJywKJ8SeJyA9PiAnxJ8nLAonxKAnID0+ICfEoScsCifEoicgPT4gJ8SjJywKJ8SkJyA9PiAnxKUnLAonxKYnID0+ICfEpycsCifEqCcgPT4gJ8SpJywKJ8SqJyA9PiAnxKsnLAonxKwnID0+ICfErScsCifEricgPT4gJ8SvJywKJ8SwJyA9PiAnacyHJywKJ8SyJyA9PiAnxLMnLAonxLQnID0+ICfEtScsCifEticgPT4gJ8S3JywKJ8S5JyA9PiAnxLonLAonxLsnID0+ICfEvCcsCifEvScgPT4gJ8S+JywKJ8S/JyA9PiAnxYAnLAonxYEnID0+ICfFgicsCifFgycgPT4gJ8WEJywKJ8WFJyA9PiAnxYYnLAonxYcnID0+ICfFiCcsCifFiicgPT4gJ8WLJywKJ8WMJyA9PiAnxY0nLAonxY4nID0+ICfFjycsCifFkCcgPT4gJ8WRJywKJ8WSJyA9PiAnxZMnLAonxZQnID0+ICfFlScsCifFlicgPT4gJ8WXJywKJ8WYJyA9PiAnxZknLAonxZonID0+ICfFmycsCifFnCcgPT4gJ8WdJywKJ8WeJyA9PiAnxZ8nLAonxaAnID0+ICfFoScsCifFoicgPT4gJ8WjJywKJ8WkJyA9PiAnxaUnLAonxaYnID0+ICfFpycsCifFqCcgPT4gJ8WpJywKJ8WqJyA9PiAnxasnLAonxawnID0+ICfFrScsCifFricgPT4gJ8WvJywKJ8WwJyA9PiAnxbEnLAonxbInID0+ICfFsycsCifFtCcgPT4gJ8W1JywKJ8W2JyA9PiAnxbcnLAonxbgnID0+ICfDvycsCifFuScgPT4gJ8W6JywKJ8W7JyA9PiAnxbwnLAonxb0nID0+ICfFvicsCifGgScgPT4gJ8mTJywKJ8aCJyA9PiAnxoMnLAonxoQnID0+ICfGhScsCifGhicgPT4gJ8mUJywKJ8aHJyA9PiAnxognLAonxoknID0+ICfJlicsCifGiicgPT4gJ8mXJywKJ8aLJyA9PiAnxownLAonxo4nID0+ICfHnScsCifGjycgPT4gJ8mZJywKJ8aQJyA9PiAnyZsnLAonxpEnID0+ICfGkicsCifGkycgPT4gJ8mgJywKJ8aUJyA9PiAnyaMnLAonxpYnID0+ICfJqScsCifGlycgPT4gJ8moJywKJ8aYJyA9PiAnxpknLAonxpwnID0+ICfJrycsCifGnScgPT4gJ8myJywKJ8afJyA9PiAnybUnLAonxqAnID0+ICfGoScsCifGoicgPT4gJ8ajJywKJ8akJyA9PiAnxqUnLAonxqYnID0+ICfKgCcsCifGpycgPT4gJ8aoJywKJ8apJyA9PiAnyoMnLAonxqwnID0+ICfGrScsCifGricgPT4gJ8qIJywKJ8avJyA9PiAnxrAnLAonxrEnID0+ICfKiicsCifGsicgPT4gJ8qLJywKJ8azJyA9PiAnxrQnLAonxrUnID0+ICfGticsCifGtycgPT4gJ8qSJywKJ8a4JyA9PiAnxrknLAonxrwnID0+ICfGvScsCifHhCcgPT4gJ8eGJywKJ8eFJyA9PiAnx4YnLAonx4cnID0+ICfHiScsCifHiCcgPT4gJ8eJJywKJ8eKJyA9PiAnx4wnLAonx4snID0+ICfHjCcsCifHjScgPT4gJ8eOJywKJ8ePJyA9PiAnx5AnLAonx5EnID0+ICfHkicsCifHkycgPT4gJ8eUJywKJ8eVJyA9PiAnx5YnLAonx5cnID0+ICfHmCcsCifHmScgPT4gJ8eaJywKJ8ebJyA9PiAnx5wnLAonx54nID0+ICfHnycsCifHoCcgPT4gJ8ehJywKJ8eiJyA9PiAnx6MnLAonx6QnID0+ICfHpScsCifHpicgPT4gJ8enJywKJ8eoJyA9PiAnx6knLAonx6onID0+ICfHqycsCifHrCcgPT4gJ8etJywKJ8euJyA9PiAnx68nLAonx7EnID0+ICfHsycsCifHsicgPT4gJ8ezJywKJ8e0JyA9PiAnx7UnLAonx7YnID0+ICfGlScsCifHtycgPT4gJ8a/JywKJ8e4JyA9PiAnx7knLAonx7onID0+ICfHuycsCifHvCcgPT4gJ8e9JywKJ8e+JyA9PiAnx78nLAonyIAnID0+ICfIgScsCifIgicgPT4gJ8iDJywKJ8iEJyA9PiAnyIUnLAonyIYnID0+ICfIhycsCifIiCcgPT4gJ8iJJywKJ8iKJyA9PiAnyIsnLAonyIwnID0+ICfIjScsCifIjicgPT4gJ8iPJywKJ8iQJyA9PiAnyJEnLAonyJInID0+ICfIkycsCifIlCcgPT4gJ8iVJywKJ8iWJyA9PiAnyJcnLAonyJgnID0+ICfImScsCifImicgPT4gJ8ibJywKJ8icJyA9PiAnyJ0nLAonyJ4nID0+ICfInycsCifIoCcgPT4gJ8aeJywKJ8iiJyA9PiAnyKMnLAonyKQnID0+ICfIpScsCifIpicgPT4gJ8inJywKJ8ioJyA9PiAnyKknLAonyKonID0+ICfIqycsCifIrCcgPT4gJ8itJywKJ8iuJyA9PiAnyK8nLAonyLAnID0+ICfIsScsCifIsicgPT4gJ8izJywKJ8i6JyA9PiAn4rGlJywKJ8i7JyA9PiAnyLwnLAonyL0nID0+ICfGmicsCifIvicgPT4gJ+KxpicsCifJgScgPT4gJ8mCJywKJ8mDJyA9PiAnxoAnLAonyYQnID0+ICfKiScsCifJhScgPT4gJ8qMJywKJ8mGJyA9PiAnyYcnLAonyYgnID0+ICfJiScsCifJiicgPT4gJ8mLJywKJ8mMJyA9PiAnyY0nLAonyY4nID0+ICfJjycsCifNsCcgPT4gJ82xJywKJ82yJyA9PiAnzbMnLAonzbYnID0+ICfNtycsCifNvycgPT4gJ8+zJywKJ86GJyA9PiAnzqwnLAonzognID0+ICfOrScsCifOiScgPT4gJ86uJywKJ86KJyA9PiAnzq8nLAonzownID0+ICfPjCcsCifOjicgPT4gJ8+NJywKJ86PJyA9PiAnz44nLAonzpEnID0+ICfOsScsCifOkicgPT4gJ86yJywKJ86TJyA9PiAnzrMnLAonzpQnID0+ICfOtCcsCifOlScgPT4gJ861JywKJ86WJyA9PiAnzrYnLAonzpcnID0+ICfOtycsCifOmCcgPT4gJ864JywKJ86ZJyA9PiAnzrknLAonzponID0+ICfOuicsCifOmycgPT4gJ867JywKJ86cJyA9PiAnzrwnLAonzp0nID0+ICfOvScsCifOnicgPT4gJ86+JywKJ86fJyA9PiAnzr8nLAonzqAnID0+ICfPgCcsCifOoScgPT4gJ8+BJywKJ86jJyA9PiAnz4MnLAonzqQnID0+ICfPhCcsCifOpScgPT4gJ8+FJywKJ86mJyA9PiAnz4YnLAonzqcnID0+ICfPhycsCifOqCcgPT4gJ8+IJywKJ86pJyA9PiAnz4knLAonzqonID0+ICfPiicsCifOqycgPT4gJ8+LJywKJ8+PJyA9PiAnz5cnLAonz5gnID0+ICfPmScsCifPmicgPT4gJ8+bJywKJ8+cJyA9PiAnz50nLAonz54nID0+ICfPnycsCifPoCcgPT4gJ8+hJywKJ8+iJyA9PiAnz6MnLAonz6QnID0+ICfPpScsCifPpicgPT4gJ8+nJywKJ8+oJyA9PiAnz6knLAonz6onID0+ICfPqycsCifPrCcgPT4gJ8+tJywKJ8+uJyA9PiAnz68nLAonz7QnID0+ICfOuCcsCifPtycgPT4gJ8+4JywKJ8+5JyA9PiAnz7InLAonz7onID0+ICfPuycsCifPvScgPT4gJ827JywKJ8++JyA9PiAnzbwnLAonz78nID0+ICfNvScsCifQgCcgPT4gJ9GQJywKJ9CBJyA9PiAn0ZEnLAon0IInID0+ICfRkicsCifQgycgPT4gJ9GTJywKJ9CEJyA9PiAn0ZQnLAon0IUnID0+ICfRlScsCifQhicgPT4gJ9GWJywKJ9CHJyA9PiAn0ZcnLAon0IgnID0+ICfRmCcsCifQiScgPT4gJ9GZJywKJ9CKJyA9PiAn0ZonLAon0IsnID0+ICfRmycsCifQjCcgPT4gJ9GcJywKJ9CNJyA9PiAn0Z0nLAon0I4nID0+ICfRnicsCifQjycgPT4gJ9GfJywKJ9CQJyA9PiAn0LAnLAon0JEnID0+ICfQsScsCifQkicgPT4gJ9CyJywKJ9CTJyA9PiAn0LMnLAon0JQnID0+ICfQtCcsCifQlScgPT4gJ9C1JywKJ9CWJyA9PiAn0LYnLAon0JcnID0+ICfQtycsCifQmCcgPT4gJ9C4JywKJ9CZJyA9PiAn0LknLAon0JonID0+ICfQuicsCifQmycgPT4gJ9C7JywKJ9CcJyA9PiAn0LwnLAon0J0nID0+ICfQvScsCifQnicgPT4gJ9C+JywKJ9CfJyA9PiAn0L8nLAon0KAnID0+ICfRgCcsCifQoScgPT4gJ9GBJywKJ9CiJyA9PiAn0YInLAon0KMnID0+ICfRgycsCifQpCcgPT4gJ9GEJywKJ9ClJyA9PiAn0YUnLAon0KYnID0+ICfRhicsCifQpycgPT4gJ9GHJywKJ9CoJyA9PiAn0YgnLAon0KknID0+ICfRiScsCifQqicgPT4gJ9GKJywKJ9CrJyA9PiAn0YsnLAon0KwnID0+ICfRjCcsCifQrScgPT4gJ9GNJywKJ9CuJyA9PiAn0Y4nLAon0K8nID0+ICfRjycsCifRoCcgPT4gJ9GhJywKJ9GiJyA9PiAn0aMnLAon0aQnID0+ICfRpScsCifRpicgPT4gJ9GnJywKJ9GoJyA9PiAn0aknLAon0aonID0+ICfRqycsCifRrCcgPT4gJ9GtJywKJ9GuJyA9PiAn0a8nLAon0bAnID0+ICfRsScsCifRsicgPT4gJ9GzJywKJ9G0JyA9PiAn0bUnLAon0bYnID0+ICfRtycsCifRuCcgPT4gJ9G5JywKJ9G6JyA9PiAn0bsnLAon0bwnID0+ICfRvScsCifRvicgPT4gJ9G/JywKJ9KAJyA9PiAn0oEnLAon0oonID0+ICfSiycsCifSjCcgPT4gJ9KNJywKJ9KOJyA9PiAn0o8nLAon0pAnID0+ICfSkScsCifSkicgPT4gJ9KTJywKJ9KUJyA9PiAn0pUnLAon0pYnID0+ICfSlycsCifSmCcgPT4gJ9KZJywKJ9KaJyA9PiAn0psnLAon0pwnID0+ICfSnScsCifSnicgPT4gJ9KfJywKJ9KgJyA9PiAn0qEnLAon0qInID0+ICfSoycsCifSpCcgPT4gJ9KlJywKJ9KmJyA9PiAn0qcnLAon0qgnID0+ICfSqScsCifSqicgPT4gJ9KrJywKJ9KsJyA9PiAn0q0nLAon0q4nID0+ICfSrycsCifSsCcgPT4gJ9KxJywKJ9KyJyA9PiAn0rMnLAon0rQnID0+ICfStScsCifSticgPT4gJ9K3JywKJ9K4JyA9PiAn0rknLAon0ronID0+ICfSuycsCifSvCcgPT4gJ9K9JywKJ9K+JyA9PiAn0r8nLAon04AnID0+ICfTjycsCifTgScgPT4gJ9OCJywKJ9ODJyA9PiAn04QnLAon04UnID0+ICfThicsCifThycgPT4gJ9OIJywKJ9OJJyA9PiAn04onLAon04snID0+ICfTjCcsCifTjScgPT4gJ9OOJywKJ9OQJyA9PiAn05EnLAon05InID0+ICfTkycsCifTlCcgPT4gJ9OVJywKJ9OWJyA9PiAn05cnLAon05gnID0+ICfTmScsCifTmicgPT4gJ9ObJywKJ9OcJyA9PiAn050nLAon054nID0+ICfTnycsCifToCcgPT4gJ9OhJywKJ9OiJyA9PiAn06MnLAon06QnID0+ICfTpScsCifTpicgPT4gJ9OnJywKJ9OoJyA9PiAn06knLAon06onID0+ICfTqycsCifTrCcgPT4gJ9OtJywKJ9OuJyA9PiAn068nLAon07AnID0+ICfTsScsCifTsicgPT4gJ9OzJywKJ9O0JyA9PiAn07UnLAon07YnID0+ICfTtycsCifTuCcgPT4gJ9O5JywKJ9O6JyA9PiAn07snLAon07wnID0+ICfTvScsCifTvicgPT4gJ9O/JywKJ9SAJyA9PiAn1IEnLAon1IInID0+ICfUgycsCifUhCcgPT4gJ9SFJywKJ9SGJyA9PiAn1IcnLAon1IgnID0+ICfUiScsCifUiicgPT4gJ9SLJywKJ9SMJyA9PiAn1I0nLAon1I4nID0+ICfUjycsCifUkCcgPT4gJ9SRJywKJ9SSJyA9PiAn1JMnLAon1JQnID0+ICfUlScsCifUlicgPT4gJ9SXJywKJ9SYJyA9PiAn1JknLAon1JonID0+ICfUmycsCifUnCcgPT4gJ9SdJywKJ9SeJyA9PiAn1J8nLAon1KAnID0+ICfUoScsCifUoicgPT4gJ9SjJywKJ9SkJyA9PiAn1KUnLAon1KYnID0+ICfUpycsCifUqCcgPT4gJ9SpJywKJ9SqJyA9PiAn1KsnLAon1KwnID0+ICfUrScsCifUricgPT4gJ9SvJywKJ9SxJyA9PiAn1aEnLAon1LInID0+ICfVoicsCifUsycgPT4gJ9WjJywKJ9S0JyA9PiAn1aQnLAon1LUnID0+ICfVpScsCifUticgPT4gJ9WmJywKJ9S3JyA9PiAn1acnLAon1LgnID0+ICfVqCcsCifUuScgPT4gJ9WpJywKJ9S6JyA9PiAn1aonLAon1LsnID0+ICfVqycsCifUvCcgPT4gJ9WsJywKJ9S9JyA9PiAn1a0nLAon1L4nID0+ICfVricsCifUvycgPT4gJ9WvJywKJ9WAJyA9PiAn1bAnLAon1YEnID0+ICfVsScsCifVgicgPT4gJ9WyJywKJ9WDJyA9PiAn1bMnLAon1YQnID0+ICfVtCcsCifVhScgPT4gJ9W1JywKJ9WGJyA9PiAn1bYnLAon1YcnID0+ICfVtycsCifViCcgPT4gJ9W4JywKJ9WJJyA9PiAn1bknLAon1YonID0+ICfVuicsCifViycgPT4gJ9W7JywKJ9WMJyA9PiAn1bwnLAon1Y0nID0+ICfVvScsCifVjicgPT4gJ9W+JywKJ9WPJyA9PiAn1b8nLAon1ZAnID0+ICfWgCcsCifVkScgPT4gJ9aBJywKJ9WSJyA9PiAn1oInLAon1ZMnID0+ICfWgycsCifVlCcgPT4gJ9aEJywKJ9WVJyA9PiAn1oUnLAon1ZYnID0+ICfWhicsCifhgqAnID0+ICfitIAnLAon4YKhJyA9PiAn4rSBJywKJ+GCoicgPT4gJ+K0gicsCifhgqMnID0+ICfitIMnLAon4YKkJyA9PiAn4rSEJywKJ+GCpScgPT4gJ+K0hScsCifhgqYnID0+ICfitIYnLAon4YKnJyA9PiAn4rSHJywKJ+GCqCcgPT4gJ+K0iCcsCifhgqknID0+ICfitIknLAon4YKqJyA9PiAn4rSKJywKJ+GCqycgPT4gJ+K0iycsCifhgqwnID0+ICfitIwnLAon4YKtJyA9PiAn4rSNJywKJ+GCricgPT4gJ+K0jicsCifhgq8nID0+ICfitI8nLAon4YKwJyA9PiAn4rSQJywKJ+GCsScgPT4gJ+K0kScsCifhgrInID0+ICfitJInLAon4YKzJyA9PiAn4rSTJywKJ+GCtCcgPT4gJ+K0lCcsCifhgrUnID0+ICfitJUnLAon4YK2JyA9PiAn4rSWJywKJ+GCtycgPT4gJ+K0lycsCifhgrgnID0+ICfitJgnLAon4YK5JyA9PiAn4rSZJywKJ+GCuicgPT4gJ+K0micsCifhgrsnID0+ICfitJsnLAon4YK8JyA9PiAn4rScJywKJ+GCvScgPT4gJ+K0nScsCifhgr4nID0+ICfitJ4nLAon4YK/JyA9PiAn4rSfJywKJ+GDgCcgPT4gJ+K0oCcsCifhg4EnID0+ICfitKEnLAon4YOCJyA9PiAn4rSiJywKJ+GDgycgPT4gJ+K0oycsCifhg4QnID0+ICfitKQnLAon4YOFJyA9PiAn4rSlJywKJ+GDhycgPT4gJ+K0pycsCifhg40nID0+ICfitK0nLAon4Y6gJyA9PiAn6q2wJywKJ+GOoScgPT4gJ+qtsScsCifhjqInID0+ICfqrbInLAon4Y6jJyA9PiAn6q2zJywKJ+GOpCcgPT4gJ+qttCcsCifhjqUnID0+ICfqrbUnLAon4Y6mJyA9PiAn6q22JywKJ+GOpycgPT4gJ+qttycsCifhjqgnID0+ICfqrbgnLAon4Y6pJyA9PiAn6q25JywKJ+GOqicgPT4gJ+qtuicsCifhjqsnID0+ICfqrbsnLAon4Y6sJyA9PiAn6q28JywKJ+GOrScgPT4gJ+qtvScsCifhjq4nID0+ICfqrb4nLAon4Y6vJyA9PiAn6q2/JywKJ+GOsCcgPT4gJ+qugCcsCifhjrEnID0+ICfqroEnLAon4Y6yJyA9PiAn6q6CJywKJ+GOsycgPT4gJ+qugycsCifhjrQnID0+ICfqroQnLAon4Y61JyA9PiAn6q6FJywKJ+GOticgPT4gJ+quhicsCifhjrcnID0+ICfqrocnLAon4Y64JyA9PiAn6q6IJywKJ+GOuScgPT4gJ+quiScsCifhjronID0+ICfqroonLAon4Y67JyA9PiAn6q6LJywKJ+GOvCcgPT4gJ+qujCcsCifhjr0nID0+ICfqro0nLAon4Y6+JyA9PiAn6q6OJywKJ+GOvycgPT4gJ+qujycsCifhj4AnID0+ICfqrpAnLAon4Y+BJyA9PiAn6q6RJywKJ+GPgicgPT4gJ+qukicsCifhj4MnID0+ICfqrpMnLAon4Y+EJyA9PiAn6q6UJywKJ+GPhScgPT4gJ+qulScsCifhj4YnID0+ICfqrpYnLAon4Y+HJyA9PiAn6q6XJywKJ+GPiCcgPT4gJ+qumCcsCifhj4knID0+ICfqrpknLAon4Y+KJyA9PiAn6q6aJywKJ+GPiycgPT4gJ+qumycsCifhj4wnID0+ICfqrpwnLAon4Y+NJyA9PiAn6q6dJywKJ+GPjicgPT4gJ+qunicsCifhj48nID0+ICfqrp8nLAon4Y+QJyA9PiAn6q6gJywKJ+GPkScgPT4gJ+quoScsCifhj5InID0+ICfqrqInLAon4Y+TJyA9PiAn6q6jJywKJ+GPlCcgPT4gJ+qupCcsCifhj5UnID0+ICfqrqUnLAon4Y+WJyA9PiAn6q6mJywKJ+GPlycgPT4gJ+qupycsCifhj5gnID0+ICfqrqgnLAon4Y+ZJyA9PiAn6q6pJywKJ+GPmicgPT4gJ+quqicsCifhj5snID0+ICfqrqsnLAon4Y+cJyA9PiAn6q6sJywKJ+GPnScgPT4gJ+qurScsCifhj54nID0+ICfqrq4nLAon4Y+fJyA9PiAn6q6vJywKJ+GPoCcgPT4gJ+qusCcsCifhj6EnID0+ICfqrrEnLAon4Y+iJyA9PiAn6q6yJywKJ+GPoycgPT4gJ+qusycsCifhj6QnID0+ICfqrrQnLAon4Y+lJyA9PiAn6q61JywKJ+GPpicgPT4gJ+quticsCifhj6cnID0+ICfqrrcnLAon4Y+oJyA9PiAn6q64JywKJ+GPqScgPT4gJ+quuScsCifhj6onID0+ICfqrronLAon4Y+rJyA9PiAn6q67JywKJ+GPrCcgPT4gJ+quvCcsCifhj60nID0+ICfqrr0nLAon4Y+uJyA9PiAn6q6+JywKJ+GPrycgPT4gJ+quvycsCifhj7AnID0+ICfhj7gnLAon4Y+xJyA9PiAn4Y+5JywKJ+GPsicgPT4gJ+GPuicsCifhj7MnID0+ICfhj7snLAon4Y+0JyA9PiAn4Y+8JywKJ+GPtScgPT4gJ+GPvScsCifhspAnID0+ICfhg5AnLAon4bKRJyA9PiAn4YORJywKJ+GykicgPT4gJ+GDkicsCifhspMnID0+ICfhg5MnLAon4bKUJyA9PiAn4YOUJywKJ+GylScgPT4gJ+GDlScsCifhspYnID0+ICfhg5YnLAon4bKXJyA9PiAn4YOXJywKJ+GymCcgPT4gJ+GDmCcsCifhspknID0+ICfhg5knLAon4bKaJyA9PiAn4YOaJywKJ+GymycgPT4gJ+GDmycsCifhspwnID0+ICfhg5wnLAon4bKdJyA9PiAn4YOdJywKJ+GynicgPT4gJ+GDnicsCifhsp8nID0+ICfhg58nLAon4bKgJyA9PiAn4YOgJywKJ+GyoScgPT4gJ+GDoScsCifhsqInID0+ICfhg6InLAon4bKjJyA9PiAn4YOjJywKJ+GypCcgPT4gJ+GDpCcsCifhsqUnID0+ICfhg6UnLAon4bKmJyA9PiAn4YOmJywKJ+GypycgPT4gJ+GDpycsCifhsqgnID0+ICfhg6gnLAon4bKpJyA9PiAn4YOpJywKJ+GyqicgPT4gJ+GDqicsCifhsqsnID0+ICfhg6snLAon4bKsJyA9PiAn4YOsJywKJ+GyrScgPT4gJ+GDrScsCifhsq4nID0+ICfhg64nLAon4bKvJyA9PiAn4YOvJywKJ+GysCcgPT4gJ+GDsCcsCifhsrEnID0+ICfhg7EnLAon4bKyJyA9PiAn4YOyJywKJ+GysycgPT4gJ+GDsycsCifhsrQnID0+ICfhg7QnLAon4bK1JyA9PiAn4YO1JywKJ+GyticgPT4gJ+GDticsCifhsrcnID0+ICfhg7cnLAon4bK4JyA9PiAn4YO4JywKJ+GyuScgPT4gJ+GDuScsCifhsronID0+ICfhg7onLAon4bK9JyA9PiAn4YO9JywKJ+GyvicgPT4gJ+GDvicsCifhsr8nID0+ICfhg78nLAon4biAJyA9PiAn4biBJywKJ+G4gicgPT4gJ+G4gycsCifhuIQnID0+ICfhuIUnLAon4biGJyA9PiAn4biHJywKJ+G4iCcgPT4gJ+G4iScsCifhuIonID0+ICfhuIsnLAon4biMJyA9PiAn4biNJywKJ+G4jicgPT4gJ+G4jycsCifhuJAnID0+ICfhuJEnLAon4biSJyA9PiAn4biTJywKJ+G4lCcgPT4gJ+G4lScsCifhuJYnID0+ICfhuJcnLAon4biYJyA9PiAn4biZJywKJ+G4micgPT4gJ+G4mycsCifhuJwnID0+ICfhuJ0nLAon4bieJyA9PiAn4bifJywKJ+G4oCcgPT4gJ+G4oScsCifhuKInID0+ICfhuKMnLAon4bikJyA9PiAn4bilJywKJ+G4picgPT4gJ+G4pycsCifhuKgnID0+ICfhuKknLAon4biqJyA9PiAn4birJywKJ+G4rCcgPT4gJ+G4rScsCifhuK4nID0+ICfhuK8nLAon4biwJyA9PiAn4bixJywKJ+G4sicgPT4gJ+G4sycsCifhuLQnID0+ICfhuLUnLAon4bi2JyA9PiAn4bi3JywKJ+G4uCcgPT4gJ+G4uScsCifhuLonID0+ICfhuLsnLAon4bi8JyA9PiAn4bi9JywKJ+G4vicgPT4gJ+G4vycsCifhuYAnID0+ICfhuYEnLAon4bmCJyA9PiAn4bmDJywKJ+G5hCcgPT4gJ+G5hScsCifhuYYnID0+ICfhuYcnLAon4bmIJyA9PiAn4bmJJywKJ+G5iicgPT4gJ+G5iycsCifhuYwnID0+ICfhuY0nLAon4bmOJyA9PiAn4bmPJywKJ+G5kCcgPT4gJ+G5kScsCifhuZInID0+ICfhuZMnLAon4bmUJyA9PiAn4bmVJywKJ+G5licgPT4gJ+G5lycsCifhuZgnID0+ICfhuZknLAon4bmaJyA9PiAn4bmbJywKJ+G5nCcgPT4gJ+G5nScsCifhuZ4nID0+ICfhuZ8nLAon4bmgJyA9PiAn4bmhJywKJ+G5oicgPT4gJ+G5oycsCifhuaQnID0+ICfhuaUnLAon4bmmJyA9PiAn4bmnJywKJ+G5qCcgPT4gJ+G5qScsCifhuaonID0+ICfhuasnLAon4bmsJyA9PiAn4bmtJywKJ+G5ricgPT4gJ+G5rycsCifhubAnID0+ICfhubEnLAon4bmyJyA9PiAn4bmzJywKJ+G5tCcgPT4gJ+G5tScsCifhubYnID0+ICfhubcnLAon4bm4JyA9PiAn4bm5JywKJ+G5uicgPT4gJ+G5uycsCifhubwnID0+ICfhub0nLAon4bm+JyA9PiAn4bm/JywKJ+G6gCcgPT4gJ+G6gScsCifhuoInID0+ICfhuoMnLAon4bqEJyA9PiAn4bqFJywKJ+G6hicgPT4gJ+G6hycsCifhuognID0+ICfhuoknLAon4bqKJyA9PiAn4bqLJywKJ+G6jCcgPT4gJ+G6jScsCifhuo4nID0+ICfhuo8nLAon4bqQJyA9PiAn4bqRJywKJ+G6kicgPT4gJ+G6kycsCifhupQnID0+ICfhupUnLAon4bqeJyA9PiAnw58nLAon4bqgJyA9PiAn4bqhJywKJ+G6oicgPT4gJ+G6oycsCifhuqQnID0+ICfhuqUnLAon4bqmJyA9PiAn4bqnJywKJ+G6qCcgPT4gJ+G6qScsCifhuqonID0+ICfhuqsnLAon4bqsJyA9PiAn4bqtJywKJ+G6ricgPT4gJ+G6rycsCifhurAnID0+ICfhurEnLAon4bqyJyA9PiAn4bqzJywKJ+G6tCcgPT4gJ+G6tScsCifhurYnID0+ICfhurcnLAon4bq4JyA9PiAn4bq5JywKJ+G6uicgPT4gJ+G6uycsCifhurwnID0+ICfhur0nLAon4bq+JyA9PiAn4bq/JywKJ+G7gCcgPT4gJ+G7gScsCifhu4InID0+ICfhu4MnLAon4buEJyA9PiAn4buFJywKJ+G7hicgPT4gJ+G7hycsCifhu4gnID0+ICfhu4knLAon4buKJyA9PiAn4buLJywKJ+G7jCcgPT4gJ+G7jScsCifhu44nID0+ICfhu48nLAon4buQJyA9PiAn4buRJywKJ+G7kicgPT4gJ+G7kycsCifhu5QnID0+ICfhu5UnLAon4buWJyA9PiAn4buXJywKJ+G7mCcgPT4gJ+G7mScsCifhu5onID0+ICfhu5snLAon4bucJyA9PiAn4budJywKJ+G7nicgPT4gJ+G7nycsCifhu6AnID0+ICfhu6EnLAon4buiJyA9PiAn4bujJywKJ+G7pCcgPT4gJ+G7pScsCifhu6YnID0+ICfhu6cnLAon4buoJyA9PiAn4bupJywKJ+G7qicgPT4gJ+G7qycsCifhu6wnID0+ICfhu60nLAon4buuJyA9PiAn4buvJywKJ+G7sCcgPT4gJ+G7sScsCifhu7InID0+ICfhu7MnLAon4bu0JyA9PiAn4bu1JywKJ+G7ticgPT4gJ+G7tycsCifhu7gnID0+ICfhu7knLAon4bu6JyA9PiAn4bu7JywKJ+G7vCcgPT4gJ+G7vScsCifhu74nID0+ICfhu78nLAon4byIJyA9PiAn4byAJywKJ+G8iScgPT4gJ+G8gScsCifhvIonID0+ICfhvIInLAon4byLJyA9PiAn4byDJywKJ+G8jCcgPT4gJ+G8hCcsCifhvI0nID0+ICfhvIUnLAon4byOJyA9PiAn4byGJywKJ+G8jycgPT4gJ+G8hycsCifhvJgnID0+ICfhvJAnLAon4byZJyA9PiAn4byRJywKJ+G8micgPT4gJ+G8kicsCifhvJsnID0+ICfhvJMnLAon4bycJyA9PiAn4byUJywKJ+G8nScgPT4gJ+G8lScsCifhvKgnID0+ICfhvKAnLAon4bypJyA9PiAn4byhJywKJ+G8qicgPT4gJ+G8oicsCifhvKsnID0+ICfhvKMnLAon4bysJyA9PiAn4bykJywKJ+G8rScgPT4gJ+G8pScsCifhvK4nID0+ICfhvKYnLAon4byvJyA9PiAn4bynJywKJ+G8uCcgPT4gJ+G8sCcsCifhvLknID0+ICfhvLEnLAon4by6JyA9PiAn4byyJywKJ+G8uycgPT4gJ+G8sycsCifhvLwnID0+ICfhvLQnLAon4by9JyA9PiAn4by1JywKJ+G8vicgPT4gJ+G8ticsCifhvL8nID0+ICfhvLcnLAon4b2IJyA9PiAn4b2AJywKJ+G9iScgPT4gJ+G9gScsCifhvYonID0+ICfhvYInLAon4b2LJyA9PiAn4b2DJywKJ+G9jCcgPT4gJ+G9hCcsCifhvY0nID0+ICfhvYUnLAon4b2ZJyA9PiAn4b2RJywKJ+G9mycgPT4gJ+G9kycsCifhvZ0nID0+ICfhvZUnLAon4b2fJyA9PiAn4b2XJywKJ+G9qCcgPT4gJ+G9oCcsCifhvaknID0+ICfhvaEnLAon4b2qJyA9PiAn4b2iJywKJ+G9qycgPT4gJ+G9oycsCifhvawnID0+ICfhvaQnLAon4b2tJyA9PiAn4b2lJywKJ+G9ricgPT4gJ+G9picsCifhva8nID0+ICfhvacnLAon4b6IJyA9PiAn4b6AJywKJ+G+iScgPT4gJ+G+gScsCifhvoonID0+ICfhvoInLAon4b6LJyA9PiAn4b6DJywKJ+G+jCcgPT4gJ+G+hCcsCifhvo0nID0+ICfhvoUnLAon4b6OJyA9PiAn4b6GJywKJ+G+jycgPT4gJ+G+hycsCifhvpgnID0+ICfhvpAnLAon4b6ZJyA9PiAn4b6RJywKJ+G+micgPT4gJ+G+kicsCifhvpsnID0+ICfhvpMnLAon4b6cJyA9PiAn4b6UJywKJ+G+nScgPT4gJ+G+lScsCifhvp4nID0+ICfhvpYnLAon4b6fJyA9PiAn4b6XJywKJ+G+qCcgPT4gJ+G+oCcsCifhvqknID0+ICfhvqEnLAon4b6qJyA9PiAn4b6iJywKJ+G+qycgPT4gJ+G+oycsCifhvqwnID0+ICfhvqQnLAon4b6tJyA9PiAn4b6lJywKJ+G+ricgPT4gJ+G+picsCifhvq8nID0+ICfhvqcnLAon4b64JyA9PiAn4b6wJywKJ+G+uScgPT4gJ+G+sScsCifhvronID0+ICfhvbAnLAon4b67JyA9PiAn4b2xJywKJ+G+vCcgPT4gJ+G+sycsCifhv4gnID0+ICfhvbInLAon4b+JJyA9PiAn4b2zJywKJ+G/iicgPT4gJ+G9tCcsCifhv4snID0+ICfhvbUnLAon4b+MJyA9PiAn4b+DJywKJ+G/mCcgPT4gJ+G/kCcsCifhv5knID0+ICfhv5EnLAon4b+aJyA9PiAn4b22JywKJ+G/mycgPT4gJ+G9tycsCifhv6gnID0+ICfhv6AnLAon4b+pJyA9PiAn4b+hJywKJ+G/qicgPT4gJ+G9uicsCifhv6snID0+ICfhvbsnLAon4b+sJyA9PiAn4b+lJywKJ+G/uCcgPT4gJ+G9uCcsCifhv7knID0+ICfhvbknLAon4b+6JyA9PiAn4b28JywKJ+G/uycgPT4gJ+G9vScsCifhv7wnID0+ICfhv7MnLAon4oSmJyA9PiAnz4knLAon4oSqJyA9PiAnaycsCifihKsnID0+ICfDpScsCifihLInID0+ICfihY4nLAon4oWgJyA9PiAn4oWwJywKJ+KFoScgPT4gJ+KFsScsCifihaInID0+ICfihbInLAon4oWjJyA9PiAn4oWzJywKJ+KFpCcgPT4gJ+KFtCcsCifihaUnID0+ICfihbUnLAon4oWmJyA9PiAn4oW2JywKJ+KFpycgPT4gJ+KFtycsCifihagnID0+ICfihbgnLAon4oWpJyA9PiAn4oW5JywKJ+KFqicgPT4gJ+KFuicsCifihasnID0+ICfihbsnLAon4oWsJyA9PiAn4oW8JywKJ+KFrScgPT4gJ+KFvScsCifiha4nID0+ICfihb4nLAon4oWvJyA9PiAn4oW/JywKJ+KGgycgPT4gJ+KGhCcsCifikrYnID0+ICfik5AnLAon4pK3JyA9PiAn4pORJywKJ+KSuCcgPT4gJ+KTkicsCifikrknID0+ICfik5MnLAon4pK6JyA9PiAn4pOUJywKJ+KSuycgPT4gJ+KTlScsCifikrwnID0+ICfik5YnLAon4pK9JyA9PiAn4pOXJywKJ+KSvicgPT4gJ+KTmCcsCifikr8nID0+ICfik5knLAon4pOAJyA9PiAn4pOaJywKJ+KTgScgPT4gJ+KTmycsCifik4InID0+ICfik5wnLAon4pODJyA9PiAn4pOdJywKJ+KThCcgPT4gJ+KTnicsCifik4UnID0+ICfik58nLAon4pOGJyA9PiAn4pOgJywKJ+KThycgPT4gJ+KToScsCifik4gnID0+ICfik6InLAon4pOJJyA9PiAn4pOjJywKJ+KTiicgPT4gJ+KTpCcsCifik4snID0+ICfik6UnLAon4pOMJyA9PiAn4pOmJywKJ+KTjScgPT4gJ+KTpycsCifik44nID0+ICfik6gnLAon4pOPJyA9PiAn4pOpJywKJ+KwgCcgPT4gJ+KwsCcsCifisIEnID0+ICfisLEnLAon4rCCJyA9PiAn4rCyJywKJ+KwgycgPT4gJ+KwsycsCifisIQnID0+ICfisLQnLAon4rCFJyA9PiAn4rC1JywKJ+KwhicgPT4gJ+KwticsCifisIcnID0+ICfisLcnLAon4rCIJyA9PiAn4rC4JywKJ+KwiScgPT4gJ+KwuScsCifisIonID0+ICfisLonLAon4rCLJyA9PiAn4rC7JywKJ+KwjCcgPT4gJ+KwvCcsCifisI0nID0+ICfisL0nLAon4rCOJyA9PiAn4rC+JywKJ+KwjycgPT4gJ+KwvycsCifisJAnID0+ICfisYAnLAon4rCRJyA9PiAn4rGBJywKJ+KwkicgPT4gJ+KxgicsCifisJMnID0+ICfisYMnLAon4rCUJyA9PiAn4rGEJywKJ+KwlScgPT4gJ+KxhScsCifisJYnID0+ICfisYYnLAon4rCXJyA9PiAn4rGHJywKJ+KwmCcgPT4gJ+KxiCcsCifisJknID0+ICfisYknLAon4rCaJyA9PiAn4rGKJywKJ+KwmycgPT4gJ+KxiycsCifisJwnID0+ICfisYwnLAon4rCdJyA9PiAn4rGNJywKJ+KwnicgPT4gJ+KxjicsCifisJ8nID0+ICfisY8nLAon4rCgJyA9PiAn4rGQJywKJ+KwoScgPT4gJ+KxkScsCifisKInID0+ICfisZInLAon4rCjJyA9PiAn4rGTJywKJ+KwpCcgPT4gJ+KxlCcsCifisKUnID0+ICfisZUnLAon4rCmJyA9PiAn4rGWJywKJ+KwpycgPT4gJ+KxlycsCifisKgnID0+ICfisZgnLAon4rCpJyA9PiAn4rGZJywKJ+KwqicgPT4gJ+KxmicsCifisKsnID0+ICfisZsnLAon4rCsJyA9PiAn4rGcJywKJ+KwrScgPT4gJ+KxnScsCifisK4nID0+ICfisZ4nLAon4rGgJyA9PiAn4rGhJywKJ+KxoicgPT4gJ8mrJywKJ+KxoycgPT4gJ+G1vScsCifisaQnID0+ICfJvScsCifisacnID0+ICfisagnLAon4rGpJyA9PiAn4rGqJywKJ+KxqycgPT4gJ+KxrCcsCifisa0nID0+ICfJkScsCifisa4nID0+ICfJsScsCifisa8nID0+ICfJkCcsCifisbAnID0+ICfJkicsCifisbInID0+ICfisbMnLAon4rG1JyA9PiAn4rG2JywKJ+KxvicgPT4gJ8i/JywKJ+KxvycgPT4gJ8mAJywKJ+KygCcgPT4gJ+KygScsCifisoInID0+ICfisoMnLAon4rKEJyA9PiAn4rKFJywKJ+KyhicgPT4gJ+KyhycsCifisognID0+ICfisoknLAon4rKKJyA9PiAn4rKLJywKJ+KyjCcgPT4gJ+KyjScsCifiso4nID0+ICfiso8nLAon4rKQJyA9PiAn4rKRJywKJ+KykicgPT4gJ+KykycsCifispQnID0+ICfispUnLAon4rKWJyA9PiAn4rKXJywKJ+KymCcgPT4gJ+KymScsCifisponID0+ICfispsnLAon4rKcJyA9PiAn4rKdJywKJ+KynicgPT4gJ+KynycsCifisqAnID0+ICfisqEnLAon4rKiJyA9PiAn4rKjJywKJ+KypCcgPT4gJ+KypScsCifisqYnID0+ICfisqcnLAon4rKoJyA9PiAn4rKpJywKJ+KyqicgPT4gJ+KyqycsCifisqwnID0+ICfisq0nLAon4rKuJyA9PiAn4rKvJywKJ+KysCcgPT4gJ+KysScsCifisrInID0+ICfisrMnLAon4rK0JyA9PiAn4rK1JywKJ+KyticgPT4gJ+KytycsCifisrgnID0+ICfisrknLAon4rK6JyA9PiAn4rK7JywKJ+KyvCcgPT4gJ+KyvScsCifisr4nID0+ICfisr8nLAon4rOAJyA9PiAn4rOBJywKJ+KzgicgPT4gJ+KzgycsCifis4QnID0+ICfis4UnLAon4rOGJyA9PiAn4rOHJywKJ+KziCcgPT4gJ+KziScsCifis4onID0+ICfis4snLAon4rOMJyA9PiAn4rONJywKJ+KzjicgPT4gJ+KzjycsCifis5AnID0+ICfis5EnLAon4rOSJyA9PiAn4rOTJywKJ+KzlCcgPT4gJ+KzlScsCifis5YnID0+ICfis5cnLAon4rOYJyA9PiAn4rOZJywKJ+KzmicgPT4gJ+KzmycsCifis5wnID0+ICfis50nLAon4rOeJyA9PiAn4rOfJywKJ+KzoCcgPT4gJ+KzoScsCifis6InID0+ICfis6MnLAon4rOrJyA9PiAn4rOsJywKJ+KzrScgPT4gJ+KzricsCifis7InID0+ICfis7MnLAon6pmAJyA9PiAn6pmBJywKJ+qZgicgPT4gJ+qZgycsCifqmYQnID0+ICfqmYUnLAon6pmGJyA9PiAn6pmHJywKJ+qZiCcgPT4gJ+qZiScsCifqmYonID0+ICfqmYsnLAon6pmMJyA9PiAn6pmNJywKJ+qZjicgPT4gJ+qZjycsCifqmZAnID0+ICfqmZEnLAon6pmSJyA9PiAn6pmTJywKJ+qZlCcgPT4gJ+qZlScsCifqmZYnID0+ICfqmZcnLAon6pmYJyA9PiAn6pmZJywKJ+qZmicgPT4gJ+qZmycsCifqmZwnID0+ICfqmZ0nLAon6pmeJyA9PiAn6pmfJywKJ+qZoCcgPT4gJ+qZoScsCifqmaInID0+ICfqmaMnLAon6pmkJyA9PiAn6pmlJywKJ+qZpicgPT4gJ+qZpycsCifqmagnID0+ICfqmaknLAon6pmqJyA9PiAn6pmrJywKJ+qZrCcgPT4gJ+qZrScsCifqmoAnID0+ICfqmoEnLAon6pqCJyA9PiAn6pqDJywKJ+qahCcgPT4gJ+qahScsCifqmoYnID0+ICfqmocnLAon6pqIJyA9PiAn6pqJJywKJ+qaiicgPT4gJ+qaiycsCifqmownID0+ICfqmo0nLAon6pqOJyA9PiAn6pqPJywKJ+qakCcgPT4gJ+qakScsCifqmpInID0+ICfqmpMnLAon6pqUJyA9PiAn6pqVJywKJ+qalicgPT4gJ+qalycsCifqmpgnID0+ICfqmpknLAon6pqaJyA9PiAn6pqbJywKJ+qcoicgPT4gJ+qcoycsCifqnKQnID0+ICfqnKUnLAon6pymJyA9PiAn6pynJywKJ+qcqCcgPT4gJ+qcqScsCifqnKonID0+ICfqnKsnLAon6pysJyA9PiAn6pytJywKJ+qcricgPT4gJ+qcrycsCifqnLInID0+ICfqnLMnLAon6py0JyA9PiAn6py1JywKJ+qcticgPT4gJ+qctycsCifqnLgnID0+ICfqnLknLAon6py6JyA9PiAn6py7JywKJ+qcvCcgPT4gJ+qcvScsCifqnL4nID0+ICfqnL8nLAon6p2AJyA9PiAn6p2BJywKJ+qdgicgPT4gJ+qdgycsCifqnYQnID0+ICfqnYUnLAon6p2GJyA9PiAn6p2HJywKJ+qdiCcgPT4gJ+qdiScsCifqnYonID0+ICfqnYsnLAon6p2MJyA9PiAn6p2NJywKJ+qdjicgPT4gJ+qdjycsCifqnZAnID0+ICfqnZEnLAon6p2SJyA9PiAn6p2TJywKJ+qdlCcgPT4gJ+qdlScsCifqnZYnID0+ICfqnZcnLAon6p2YJyA9PiAn6p2ZJywKJ+qdmicgPT4gJ+qdmycsCifqnZwnID0+ICfqnZ0nLAon6p2eJyA9PiAn6p2fJywKJ+qdoCcgPT4gJ+qdoScsCifqnaInID0+ICfqnaMnLAon6p2kJyA9PiAn6p2lJywKJ+qdpicgPT4gJ+qdpycsCifqnagnID0+ICfqnaknLAon6p2qJyA9PiAn6p2rJywKJ+qdrCcgPT4gJ+qdrScsCifqna4nID0+ICfqna8nLAon6p25JyA9PiAn6p26JywKJ+qduycgPT4gJ+qdvCcsCifqnb0nID0+ICfhtbknLAon6p2+JyA9PiAn6p2/JywKJ+qegCcgPT4gJ+qegScsCifqnoInID0+ICfqnoMnLAon6p6EJyA9PiAn6p6FJywKJ+qehicgPT4gJ+qehycsCifqnosnID0+ICfqnownLAon6p6NJyA9PiAnyaUnLAon6p6QJyA9PiAn6p6RJywKJ+qekicgPT4gJ+qekycsCifqnpYnID0+ICfqnpcnLAon6p6YJyA9PiAn6p6ZJywKJ+qemicgPT4gJ+qemycsCifqnpwnID0+ICfqnp0nLAon6p6eJyA9PiAn6p6fJywKJ+qeoCcgPT4gJ+qeoScsCifqnqInID0+ICfqnqMnLAon6p6kJyA9PiAn6p6lJywKJ+qepicgPT4gJ+qepycsCifqnqgnID0+ICfqnqknLAon6p6qJyA9PiAnyaYnLAon6p6rJyA9PiAnyZwnLAon6p6sJyA9PiAnyaEnLAon6p6tJyA9PiAnyawnLAon6p6uJyA9PiAnyaonLAon6p6wJyA9PiAnyp4nLAon6p6xJyA9PiAnyocnLAon6p6yJyA9PiAnyp0nLAon6p6zJyA9PiAn6q2TJywKJ+qetCcgPT4gJ+qetScsCifqnrYnID0+ICfqnrcnLAon6p64JyA9PiAn6p65JywKJ+qeuicgPT4gJ+qeuycsCifqnrwnID0+ICfqnr0nLAon6p6+JyA9PiAn6p6/JywKJ+qfgicgPT4gJ+qfgycsCifqn4QnID0+ICfqnpQnLAon6p+FJyA9PiAnyoInLAon6p+GJyA9PiAn4baOJywKJ+qfhycgPT4gJ+qfiCcsCifqn4knID0+ICfqn4onLAon6p+1JyA9PiAn6p+2JywKJ++8oScgPT4gJ++9gScsCifvvKInID0+ICfvvYInLAon77yjJyA9PiAn772DJywKJ++8pCcgPT4gJ++9hCcsCifvvKUnID0+ICfvvYUnLAon77ymJyA9PiAn772GJywKJ++8pycgPT4gJ++9hycsCifvvKgnID0+ICfvvYgnLAon77ypJyA9PiAn772JJywKJ++8qicgPT4gJ++9iicsCifvvKsnID0+ICfvvYsnLAon77ysJyA9PiAn772MJywKJ++8rScgPT4gJ++9jScsCifvvK4nID0+ICfvvY4nLAon77yvJyA9PiAn772PJywKJ++8sCcgPT4gJ++9kCcsCifvvLEnID0+ICfvvZEnLAon77yyJyA9PiAn772SJywKJ++8sycgPT4gJ++9kycsCifvvLQnID0+ICfvvZQnLAon77y1JyA9PiAn772VJywKJ++8ticgPT4gJ++9licsCifvvLcnID0+ICfvvZcnLAon77y4JyA9PiAn772YJywKJ++8uScgPT4gJ++9mScsCifvvLonID0+ICfvvZonLAon8JCQgCcgPT4gJ/CQkKgnLAon8JCQgScgPT4gJ/CQkKknLAon8JCQgicgPT4gJ/CQkKonLAon8JCQgycgPT4gJ/CQkKsnLAon8JCQhCcgPT4gJ/CQkKwnLAon8JCQhScgPT4gJ/CQkK0nLAon8JCQhicgPT4gJ/CQkK4nLAon8JCQhycgPT4gJ/CQkK8nLAon8JCQiCcgPT4gJ/CQkLAnLAon8JCQiScgPT4gJ/CQkLEnLAon8JCQiicgPT4gJ/CQkLInLAon8JCQiycgPT4gJ/CQkLMnLAon8JCQjCcgPT4gJ/CQkLQnLAon8JCQjScgPT4gJ/CQkLUnLAon8JCQjicgPT4gJ/CQkLYnLAon8JCQjycgPT4gJ/CQkLcnLAon8JCQkCcgPT4gJ/CQkLgnLAon8JCQkScgPT4gJ/CQkLknLAon8JCQkicgPT4gJ/CQkLonLAon8JCQkycgPT4gJ/CQkLsnLAon8JCQlCcgPT4gJ/CQkLwnLAon8JCQlScgPT4gJ/CQkL0nLAon8JCQlicgPT4gJ/CQkL4nLAon8JCQlycgPT4gJ/CQkL8nLAon8JCQmCcgPT4gJ/CQkYAnLAon8JCQmScgPT4gJ/CQkYEnLAon8JCQmicgPT4gJ/CQkYInLAon8JCQmycgPT4gJ/CQkYMnLAon8JCQnCcgPT4gJ/CQkYQnLAon8JCQnScgPT4gJ/CQkYUnLAon8JCQnicgPT4gJ/CQkYYnLAon8JCQnycgPT4gJ/CQkYcnLAon8JCQoCcgPT4gJ/CQkYgnLAon8JCQoScgPT4gJ/CQkYknLAon8JCQoicgPT4gJ/CQkYonLAon8JCQoycgPT4gJ/CQkYsnLAon8JCQpCcgPT4gJ/CQkYwnLAon8JCQpScgPT4gJ/CQkY0nLAon8JCQpicgPT4gJ/CQkY4nLAon8JCQpycgPT4gJ/CQkY8nLAon8JCSsCcgPT4gJ/CQk5gnLAon8JCSsScgPT4gJ/CQk5knLAon8JCSsicgPT4gJ/CQk5onLAon8JCSsycgPT4gJ/CQk5snLAon8JCStCcgPT4gJ/CQk5wnLAon8JCStScgPT4gJ/CQk50nLAon8JCSticgPT4gJ/CQk54nLAon8JCStycgPT4gJ/CQk58nLAon8JCSuCcgPT4gJ/CQk6AnLAon8JCSuScgPT4gJ/CQk6EnLAon8JCSuicgPT4gJ/CQk6InLAon8JCSuycgPT4gJ/CQk6MnLAon8JCSvCcgPT4gJ/CQk6QnLAon8JCSvScgPT4gJ/CQk6UnLAon8JCSvicgPT4gJ/CQk6YnLAon8JCSvycgPT4gJ/CQk6cnLAon8JCTgCcgPT4gJ/CQk6gnLAon8JCTgScgPT4gJ/CQk6knLAon8JCTgicgPT4gJ/CQk6onLAon8JCTgycgPT4gJ/CQk6snLAon8JCThCcgPT4gJ/CQk6wnLAon8JCThScgPT4gJ/CQk60nLAon8JCThicgPT4gJ/CQk64nLAon8JCThycgPT4gJ/CQk68nLAon8JCTiCcgPT4gJ/CQk7AnLAon8JCTiScgPT4gJ/CQk7EnLAon8JCTiicgPT4gJ/CQk7InLAon8JCTiycgPT4gJ/CQk7MnLAon8JCTjCcgPT4gJ/CQk7QnLAon8JCTjScgPT4gJ/CQk7UnLAon8JCTjicgPT4gJ/CQk7YnLAon8JCTjycgPT4gJ/CQk7cnLAon8JCTkCcgPT4gJ/CQk7gnLAon8JCTkScgPT4gJ/CQk7knLAon8JCTkicgPT4gJ/CQk7onLAon8JCTkycgPT4gJ/CQk7snLAon8JCygCcgPT4gJ/CQs4AnLAon8JCygScgPT4gJ/CQs4EnLAon8JCygicgPT4gJ/CQs4InLAon8JCygycgPT4gJ/CQs4MnLAon8JCyhCcgPT4gJ/CQs4QnLAon8JCyhScgPT4gJ/CQs4UnLAon8JCyhicgPT4gJ/CQs4YnLAon8JCyhycgPT4gJ/CQs4cnLAon8JCyiCcgPT4gJ/CQs4gnLAon8JCyiScgPT4gJ/CQs4knLAon8JCyiicgPT4gJ/CQs4onLAon8JCyiycgPT4gJ/CQs4snLAon8JCyjCcgPT4gJ/CQs4wnLAon8JCyjScgPT4gJ/CQs40nLAon8JCyjicgPT4gJ/CQs44nLAon8JCyjycgPT4gJ/CQs48nLAon8JCykCcgPT4gJ/CQs5AnLAon8JCykScgPT4gJ/CQs5EnLAon8JCykicgPT4gJ/CQs5InLAon8JCykycgPT4gJ/CQs5MnLAon8JCylCcgPT4gJ/CQs5QnLAon8JCylScgPT4gJ/CQs5UnLAon8JCylicgPT4gJ/CQs5YnLAon8JCylycgPT4gJ/CQs5cnLAon8JCymCcgPT4gJ/CQs5gnLAon8JCymScgPT4gJ/CQs5knLAon8JCymicgPT4gJ/CQs5onLAon8JCymycgPT4gJ/CQs5snLAon8JCynCcgPT4gJ/CQs5wnLAon8JCynScgPT4gJ/CQs50nLAon8JCynicgPT4gJ/CQs54nLAon8JCynycgPT4gJ/CQs58nLAon8JCyoCcgPT4gJ/CQs6AnLAon8JCyoScgPT4gJ/CQs6EnLAon8JCyoicgPT4gJ/CQs6InLAon8JCyoycgPT4gJ/CQs6MnLAon8JCypCcgPT4gJ/CQs6QnLAon8JCypScgPT4gJ/CQs6UnLAon8JCypicgPT4gJ/CQs6YnLAon8JCypycgPT4gJ/CQs6cnLAon8JCyqCcgPT4gJ/CQs6gnLAon8JCyqScgPT4gJ/CQs6knLAon8JCyqicgPT4gJ/CQs6onLAon8JCyqycgPT4gJ/CQs6snLAon8JCyrCcgPT4gJ/CQs6wnLAon8JCyrScgPT4gJ/CQs60nLAon8JCyricgPT4gJ/CQs64nLAon8JCyrycgPT4gJ/CQs68nLAon8JCysCcgPT4gJ/CQs7AnLAon8JCysScgPT4gJ/CQs7EnLAon8JCysicgPT4gJ/CQs7InLAon8JGioCcgPT4gJ/CRo4AnLAon8JGioScgPT4gJ/CRo4EnLAon8JGioicgPT4gJ/CRo4InLAon8JGioycgPT4gJ/CRo4MnLAon8JGipCcgPT4gJ/CRo4QnLAon8JGipScgPT4gJ/CRo4UnLAon8JGipicgPT4gJ/CRo4YnLAon8JGipycgPT4gJ/CRo4cnLAon8JGiqCcgPT4gJ/CRo4gnLAon8JGiqScgPT4gJ/CRo4knLAon8JGiqicgPT4gJ/CRo4onLAon8JGiqycgPT4gJ/CRo4snLAon8JGirCcgPT4gJ/CRo4wnLAon8JGirScgPT4gJ/CRo40nLAon8JGiricgPT4gJ/CRo44nLAon8JGirycgPT4gJ/CRo48nLAon8JGisCcgPT4gJ/CRo5AnLAon8JGisScgPT4gJ/CRo5EnLAon8JGisicgPT4gJ/CRo5InLAon8JGisycgPT4gJ/CRo5MnLAon8JGitCcgPT4gJ/CRo5QnLAon8JGitScgPT4gJ/CRo5UnLAon8JGiticgPT4gJ/CRo5YnLAon8JGitycgPT4gJ/CRo5cnLAon8JGiuCcgPT4gJ/CRo5gnLAon8JGiuScgPT4gJ/CRo5knLAon8JGiuicgPT4gJ/CRo5onLAon8JGiuycgPT4gJ/CRo5snLAon8JGivCcgPT4gJ/CRo5wnLAon8JGivScgPT4gJ/CRo50nLAon8JGivicgPT4gJ/CRo54nLAon8JGivycgPT4gJ/CRo58nLAon8Ja5gCcgPT4gJ/CWuaAnLAon8Ja5gScgPT4gJ/CWuaEnLAon8Ja5gicgPT4gJ/CWuaInLAon8Ja5gycgPT4gJ/CWuaMnLAon8Ja5hCcgPT4gJ/CWuaQnLAon8Ja5hScgPT4gJ/CWuaUnLAon8Ja5hicgPT4gJ/CWuaYnLAon8Ja5hycgPT4gJ/CWuacnLAon8Ja5iCcgPT4gJ/CWuagnLAon8Ja5iScgPT4gJ/CWuaknLAon8Ja5iicgPT4gJ/CWuaonLAon8Ja5iycgPT4gJ/CWuasnLAon8Ja5jCcgPT4gJ/CWuawnLAon8Ja5jScgPT4gJ/CWua0nLAon8Ja5jicgPT4gJ/CWua4nLAon8Ja5jycgPT4gJ/CWua8nLAon8Ja5kCcgPT4gJ/CWubAnLAon8Ja5kScgPT4gJ/CWubEnLAon8Ja5kicgPT4gJ/CWubInLAon8Ja5kycgPT4gJ/CWubMnLAon8Ja5lCcgPT4gJ/CWubQnLAon8Ja5lScgPT4gJ/CWubUnLAon8Ja5licgPT4gJ/CWubYnLAon8Ja5lycgPT4gJ/CWubcnLAon8Ja5mCcgPT4gJ/CWubgnLAon8Ja5mScgPT4gJ/CWubknLAon8Ja5micgPT4gJ/CWubonLAon8Ja5mycgPT4gJ/CWubsnLAon8Ja5nCcgPT4gJ/CWubwnLAon8Ja5nScgPT4gJ/CWub0nLAon8Ja5nicgPT4gJ/CWub4nLAon8Ja5nycgPT4gJ/CWub8nLAon8J6kgCcgPT4gJ/CepKInLAon8J6kgScgPT4gJ/CepKMnLAon8J6kgicgPT4gJ/CepKQnLAon8J6kgycgPT4gJ/CepKUnLAon8J6khCcgPT4gJ/CepKYnLAon8J6khScgPT4gJ/CepKcnLAon8J6khicgPT4gJ/CepKgnLAon8J6khycgPT4gJ/CepKknLAon8J6kiCcgPT4gJ/CepKonLAon8J6kiScgPT4gJ/CepKsnLAon8J6kiicgPT4gJ/CepKwnLAon8J6kiycgPT4gJ/CepK0nLAon8J6kjCcgPT4gJ/CepK4nLAon8J6kjScgPT4gJ/CepK8nLAon8J6kjicgPT4gJ/CepLAnLAon8J6kjycgPT4gJ/CepLEnLAon8J6kkCcgPT4gJ/CepLInLAon8J6kkScgPT4gJ/CepLMnLAon8J6kkicgPT4gJ/CepLQnLAon8J6kkycgPT4gJ/CepLUnLAon8J6klCcgPT4gJ/CepLYnLAon8J6klScgPT4gJ/CepLcnLAon8J6klicgPT4gJ/CepLgnLAon8J6klycgPT4gJ/CepLknLAon8J6kmCcgPT4gJ/CepLonLAon8J6kmScgPT4gJ/CepLsnLAon8J6kmicgPT4gJ/CepLwnLAon8J6kmycgPT4gJ/CepL0nLAon8J6knCcgPT4gJ/CepL4nLAon8J6knScgPT4gJ/CepL8nLAon8J6knicgPT4gJ/CepYAnLAon8J6knycgPT4gJ/CepYEnLAon8J6koCcgPT4gJ/CepYInLAon8J6koScgPT4gJ/CepYMnLAopOwo8P3BocAoKCgpyZXR1cm4gJy8oPzwhW1x4ezAwMjd9XHh7MDAyRX1ceHswMDNBfVx4ezAwNUV9XHh7MDA2MH1ceHswMEE4fVx4ezAwQUR9XHh7MDBBRn1ceHswMEI0fVx4ezAwQjd9XHh7MDBCOH1ceHswMkIwfS1ceHswMkMxfVx4ezAyQzJ9LVx4ezAyQzV9XHh7MDJDNn0tXHh7MDJEMX1ceHswMkQyfS1ceHswMkRGfVx4ezAyRTB9LVx4ezAyRTR9XHh7MDJFNX0tXHh7MDJFQn1ceHswMkVDfVx4ezAyRUR9XHh7MDJFRX1ceHswMkVGfS1ceHswMkZGfVx4ezAzMDB9LVx4ezAzNkZ9XHh7MDM3NH1ceHswMzc1fVx4ezAzN0F9XHh7MDM4NH0tXHh7MDM4NX1ceHswMzg3fVx4ezA0ODN9LVx4ezA0ODd9XHh7MDQ4OH0tXHh7MDQ4OX1ceHswNTU5fVx4ezA1OTF9LVx4ezA1QkR9XHh7MDVCRn1ceHswNUMxfS1ceHswNUMyfVx4ezA1QzR9LVx4ezA1QzV9XHh7MDVDN31ceHswNUY0fVx4ezA2MDB9LVx4ezA2MDV9XHh7MDYxMH0tXHh7MDYxQX1ceHswNjFDfVx4ezA2NDB9XHh7MDY0Qn0tXHh7MDY1Rn1ceHswNjcwfVx4ezA2RDZ9LVx4ezA2REN9XHh7MDZERH1ceHswNkRGfS1ceHswNkU0fVx4ezA2RTV9LVx4ezA2RTZ9XHh7MDZFN30tXHh7MDZFOH1ceHswNkVBfS1ceHswNkVEfVx4ezA3MEZ9XHh7MDcxMX1ceHswNzMwfS1ceHswNzRBfVx4ezA3QTZ9LVx4ezA3QjB9XHh7MDdFQn0tXHh7MDdGM31ceHswN0Y0fS1ceHswN0Y1fVx4ezA3RkF9XHh7MDdGRH1ceHswODE2fS1ceHswODE5fVx4ezA4MUF9XHh7MDgxQn0tXHh7MDgyM31ceHswODI0fVx4ezA4MjV9LVx4ezA4Mjd9XHh7MDgyOH1ceHswODI5fS1ceHswODJEfVx4ezA4NTl9LVx4ezA4NUJ9XHh7MDhEM30tXHh7MDhFMX1ceHswOEUyfVx4ezA4RTN9LVx4ezA5MDJ9XHh7MDkzQX1ceHswOTNDfVx4ezA5NDF9LVx4ezA5NDh9XHh7MDk0RH1ceHswOTUxfS1ceHswOTU3fVx4ezA5NjJ9LVx4ezA5NjN9XHh7MDk3MX1ceHswOTgxfVx4ezA5QkN9XHh7MDlDMX0tXHh7MDlDNH1ceHswOUNEfVx4ezA5RTJ9LVx4ezA5RTN9XHh7MDlGRX1ceHswQTAxfS1ceHswQTAyfVx4ezBBM0N9XHh7MEE0MX0tXHh7MEE0Mn1ceHswQTQ3fS1ceHswQTQ4fVx4ezBBNEJ9LVx4ezBBNER9XHh7MEE1MX1ceHswQTcwfS1ceHswQTcxfVx4ezBBNzV9XHh7MEE4MX0tXHh7MEE4Mn1ceHswQUJDfVx4ezBBQzF9LVx4ezBBQzV9XHh7MEFDN30tXHh7MEFDOH1ceHswQUNEfVx4ezBBRTJ9LVx4ezBBRTN9XHh7MEFGQX0tXHh7MEFGRn1ceHswQjAxfVx4ezBCM0N9XHh7MEIzRn1ceHswQjQxfS1ceHswQjQ0fVx4ezBCNER9XHh7MEI1Nn1ceHswQjYyfS1ceHswQjYzfVx4ezBCODJ9XHh7MEJDMH1ceHswQkNEfVx4ezBDMDB9XHh7MEMwNH1ceHswQzNFfS1ceHswQzQwfVx4ezBDNDZ9LVx4ezBDNDh9XHh7MEM0QX0tXHh7MEM0RH1ceHswQzU1fS1ceHswQzU2fVx4ezBDNjJ9LVx4ezBDNjN9XHh7MEM4MX1ceHswQ0JDfVx4ezBDQkZ9XHh7MENDNn1ceHswQ0NDfS1ceHswQ0NEfVx4ezBDRTJ9LVx4ezBDRTN9XHh7MEQwMH0tXHh7MEQwMX1ceHswRDNCfS1ceHswRDNDfVx4ezBENDF9LVx4ezBENDR9XHh7MEQ0RH1ceHswRDYyfS1ceHswRDYzfVx4ezBEQ0F9XHh7MEREMn0tXHh7MERENH1ceHswREQ2fVx4ezBFMzF9XHh7MEUzNH0tXHh7MEUzQX1ceHswRTQ2fVx4ezBFNDd9LVx4ezBFNEV9XHh7MEVCMX1ceHswRUI0fS1ceHswRUI5fVx4ezBFQkJ9LVx4ezBFQkN9XHh7MEVDNn1ceHswRUM4fS1ceHswRUNEfVx4ezBGMTh9LVx4ezBGMTl9XHh7MEYzNX1ceHswRjM3fVx4ezBGMzl9XHh7MEY3MX0tXHh7MEY3RX1ceHswRjgwfS1ceHswRjg0fVx4ezBGODZ9LVx4ezBGODd9XHh7MEY4RH0tXHh7MEY5N31ceHswRjk5fS1ceHswRkJDfVx4ezBGQzZ9XHh7MTAyRH0tXHh7MTAzMH1ceHsxMDMyfS1ceHsxMDM3fVx4ezEwMzl9LVx4ezEwM0F9XHh7MTAzRH0tXHh7MTAzRX1ceHsxMDU4fS1ceHsxMDU5fVx4ezEwNUV9LVx4ezEwNjB9XHh7MTA3MX0tXHh7MTA3NH1ceHsxMDgyfVx4ezEwODV9LVx4ezEwODZ9XHh7MTA4RH1ceHsxMDlEfVx4ezEwRkN9XHh7MTM1RH0tXHh7MTM1Rn1ceHsxNzEyfS1ceHsxNzE0fVx4ezE3MzJ9LVx4ezE3MzR9XHh7MTc1Mn0tXHh7MTc1M31ceHsxNzcyfS1ceHsxNzczfVx4ezE3QjR9LVx4ezE3QjV9XHh7MTdCN30tXHh7MTdCRH1ceHsxN0M2fVx4ezE3Qzl9LVx4ezE3RDN9XHh7MTdEN31ceHsxN0REfVx4ezE4MEJ9LVx4ezE4MER9XHh7MTgwRX1ceHsxODQzfVx4ezE4ODV9LVx4ezE4ODZ9XHh7MThBOX1ceHsxOTIwfS1ceHsxOTIyfVx4ezE5Mjd9LVx4ezE5Mjh9XHh7MTkzMn1ceHsxOTM5fS1ceHsxOTNCfVx4ezFBMTd9LVx4ezFBMTh9XHh7MUExQn1ceHsxQTU2fVx4ezFBNTh9LVx4ezFBNUV9XHh7MUE2MH1ceHsxQTYyfVx4ezFBNjV9LVx4ezFBNkN9XHh7MUE3M30tXHh7MUE3Q31ceHsxQTdGfVx4ezFBQTd9XHh7MUFCMH0tXHh7MUFCRH1ceHsxQUJFfVx4ezFCMDB9LVx4ezFCMDN9XHh7MUIzNH1ceHsxQjM2fS1ceHsxQjNBfVx4ezFCM0N9XHh7MUI0Mn1ceHsxQjZCfS1ceHsxQjczfVx4ezFCODB9LVx4ezFCODF9XHh7MUJBMn0tXHh7MUJBNX1ceHsxQkE4fS1ceHsxQkE5fVx4ezFCQUJ9LVx4ezFCQUR9XHh7MUJFNn1ceHsxQkU4fS1ceHsxQkU5fVx4ezFCRUR9XHh7MUJFRn0tXHh7MUJGMX1ceHsxQzJDfS1ceHsxQzMzfVx4ezFDMzZ9LVx4ezFDMzd9XHh7MUM3OH0tXHh7MUM3RH1ceHsxQ0QwfS1ceHsxQ0QyfVx4ezFDRDR9LVx4ezFDRTB9XHh7MUNFMn0tXHh7MUNFOH1ceHsxQ0VEfVx4ezFDRjR9XHh7MUNGOH0tXHh7MUNGOX1ceHsxRDJDfS1ceHsxRDZBfVx4ezFENzh9XHh7MUQ5Qn0tXHh7MURCRn1ceHsxREMwfS1ceHsxREY5fVx4ezFERkJ9LVx4ezFERkZ9XHh7MUZCRH1ceHsxRkJGfS1ceHsxRkMxfVx4ezFGQ0R9LVx4ezFGQ0Z9XHh7MUZERH0tXHh7MUZERn1ceHsxRkVEfS1ceHsxRkVGfVx4ezFGRkR9LVx4ezFGRkV9XHh7MjAwQn0tXHh7MjAwRn1ceHsyMDE4fVx4ezIwMTl9XHh7MjAyNH1ceHsyMDI3fVx4ezIwMkF9LVx4ezIwMkV9XHh7MjA2MH0tXHh7MjA2NH1ceHsyMDY2fS1ceHsyMDZGfVx4ezIwNzF9XHh7MjA3Rn1ceHsyMDkwfS1ceHsyMDlDfVx4ezIwRDB9LVx4ezIwREN9XHh7MjBERH0tXHh7MjBFMH1ceHsyMEUxfVx4ezIwRTJ9LVx4ezIwRTR9XHh7MjBFNX0tXHh7MjBGMH1ceHsyQzdDfS1ceHsyQzdEfVx4ezJDRUZ9LVx4ezJDRjF9XHh7MkQ2Rn1ceHsyRDdGfVx4ezJERTB9LVx4ezJERkZ9XHh7MkUyRn1ceHszMDA1fVx4ezMwMkF9LVx4ezMwMkR9XHh7MzAzMX0tXHh7MzAzNX1ceHszMDNCfVx4ezMwOTl9LVx4ezMwOUF9XHh7MzA5Qn0tXHh7MzA5Q31ceHszMDlEfS1ceHszMDlFfVx4ezMwRkN9LVx4ezMwRkV9XHh7QTAxNX1ceHtBNEY4fS1ceHtBNEZEfVx4e0E2MEN9XHh7QTY2Rn1ceHtBNjcwfS1ceHtBNjcyfVx4e0E2NzR9LVx4e0E2N0R9XHh7QTY3Rn1ceHtBNjlDfS1ceHtBNjlEfVx4e0E2OUV9LVx4e0E2OUZ9XHh7QTZGMH0tXHh7QTZGMX1ceHtBNzAwfS1ceHtBNzE2fVx4e0E3MTd9LVx4e0E3MUZ9XHh7QTcyMH0tXHh7QTcyMX1ceHtBNzcwfVx4e0E3ODh9XHh7QTc4OX0tXHh7QTc4QX1ceHtBN0Y4fS1ceHtBN0Y5fVx4e0E4MDJ9XHh7QTgwNn1ceHtBODBCfVx4e0E4MjV9LVx4e0E4MjZ9XHh7QThDNH0tXHh7QThDNX1ceHtBOEUwfS1ceHtBOEYxfVx4e0E4RkZ9XHh7QTkyNn0tXHh7QTkyRH1ceHtBOTQ3fS1ceHtBOTUxfVx4e0E5ODB9LVx4e0E5ODJ9XHh7QTlCM31ceHtBOUI2fS1ceHtBOUI5fVx4e0E5QkN9XHh7QTlDRn1ceHtBOUU1fVx4e0E5RTZ9XHh7QUEyOX0tXHh7QUEyRX1ceHtBQTMxfS1ceHtBQTMyfVx4e0FBMzV9LVx4e0FBMzZ9XHh7QUE0M31ceHtBQTRDfVx4e0FBNzB9XHh7QUE3Q31ceHtBQUIwfVx4e0FBQjJ9LVx4e0FBQjR9XHh7QUFCN30tXHh7QUFCOH1ceHtBQUJFfS1ceHtBQUJGfVx4e0FBQzF9XHh7QUFERH1ceHtBQUVDfS1ceHtBQUVEfVx4e0FBRjN9LVx4e0FBRjR9XHh7QUFGNn1ceHtBQjVCfVx4e0FCNUN9LVx4e0FCNUZ9XHh7QUJFNX1ceHtBQkU4fVx4e0FCRUR9XHh7RkIxRX1ceHtGQkIyfS1ceHtGQkMxfVx4e0ZFMDB9LVx4e0ZFMEZ9XHh7RkUxM31ceHtGRTIwfS1ceHtGRTJGfVx4e0ZFNTJ9XHh7RkU1NX1ceHtGRUZGfVx4e0ZGMDd9XHh7RkYwRX1ceHtGRjFBfVx4e0ZGM0V9XHh7RkY0MH1ceHtGRjcwfVx4e0ZGOUV9LVx4e0ZGOUZ9XHh7RkZFM31ceHtGRkY5fS1ceHtGRkZCfVx4ezEwMUZEfVx4ezEwMkUwfVx4ezEwMzc2fS1ceHsxMDM3QX1ceHsxMEEwMX0tXHh7MTBBMDN9XHh7MTBBMDV9LVx4ezEwQTA2fVx4ezEwQTBDfS1ceHsxMEEwRn1ceHsxMEEzOH0tXHh7MTBBM0F9XHh7MTBBM0Z9XHh7MTBBRTV9LVx4ezEwQUU2fVx4ezEwRDI0fS1ceHsxMEQyN31ceHsxMEY0Nn0tXHh7MTBGNTB9XHh7MTEwMDF9XHh7MTEwMzh9LVx4ezExMDQ2fVx4ezExMDdGfS1ceHsxMTA4MX1ceHsxMTBCM30tXHh7MTEwQjZ9XHh7MTEwQjl9LVx4ezExMEJBfVx4ezExMEJEfVx4ezExMENEfVx4ezExMTAwfS1ceHsxMTEwMn1ceHsxMTEyN30tXHh7MTExMkJ9XHh7MTExMkR9LVx4ezExMTM0fVx4ezExMTczfVx4ezExMTgwfS1ceHsxMTE4MX1ceHsxMTFCNn0tXHh7MTExQkV9XHh7MTExQzl9LVx4ezExMUNDfVx4ezExMjJGfS1ceHsxMTIzMX1ceHsxMTIzNH1ceHsxMTIzNn0tXHh7MTEyMzd9XHh7MTEyM0V9XHh7MTEyREZ9XHh7MTEyRTN9LVx4ezExMkVBfVx4ezExMzAwfS1ceHsxMTMwMX1ceHsxMTMzQn0tXHh7MTEzM0N9XHh7MTEzNDB9XHh7MTEzNjZ9LVx4ezExMzZDfVx4ezExMzcwfS1ceHsxMTM3NH1ceHsxMTQzOH0tXHh7MTE0M0Z9XHh7MTE0NDJ9LVx4ezExNDQ0fVx4ezExNDQ2fVx4ezExNDVFfVx4ezExNEIzfS1ceHsxMTRCOH1ceHsxMTRCQX1ceHsxMTRCRn0tXHh7MTE0QzB9XHh7MTE0QzJ9LVx4ezExNEMzfVx4ezExNUIyfS1ceHsxMTVCNX1ceHsxMTVCQ30tXHh7MTE1QkR9XHh7MTE1QkZ9LVx4ezExNUMwfVx4ezExNURDfS1ceHsxMTVERH1ceHsxMTYzM30tXHh7MTE2M0F9XHh7MTE2M0R9XHh7MTE2M0Z9LVx4ezExNjQwfVx4ezExNkFCfVx4ezExNkFEfVx4ezExNkIwfS1ceHsxMTZCNX1ceHsxMTZCN31ceHsxMTcxRH0tXHh7MTE3MUZ9XHh7MTE3MjJ9LVx4ezExNzI1fVx4ezExNzI3fS1ceHsxMTcyQn1ceHsxMTgyRn0tXHh7MTE4Mzd9XHh7MTE4Mzl9LVx4ezExODNBfVx4ezExQTAxfS1ceHsxMUEwQX1ceHsxMUEzM30tXHh7MTFBMzh9XHh7MTFBM0J9LVx4ezExQTNFfVx4ezExQTQ3fVx4ezExQTUxfS1ceHsxMUE1Nn1ceHsxMUE1OX0tXHh7MTFBNUJ9XHh7MTFBOEF9LVx4ezExQTk2fVx4ezExQTk4fS1ceHsxMUE5OX1ceHsxMUMzMH0tXHh7MTFDMzZ9XHh7MTFDMzh9LVx4ezExQzNEfVx4ezExQzNGfVx4ezExQzkyfS1ceHsxMUNBN31ceHsxMUNBQX0tXHh7MTFDQjB9XHh7MTFDQjJ9LVx4ezExQ0IzfVx4ezExQ0I1fS1ceHsxMUNCNn1ceHsxMUQzMX0tXHh7MTFEMzZ9XHh7MTFEM0F9XHh7MTFEM0N9LVx4ezExRDNEfVx4ezExRDNGfS1ceHsxMUQ0NX1ceHsxMUQ0N31ceHsxMUQ5MH0tXHh7MTFEOTF9XHh7MTFEOTV9XHh7MTFEOTd9XHh7MTFFRjN9LVx4ezExRUY0fVx4ezE2QUYwfS1ceHsxNkFGNH1ceHsxNkIzMH0tXHh7MTZCMzZ9XHh7MTZCNDB9LVx4ezE2QjQzfVx4ezE2RjhGfS1ceHsxNkY5Mn1ceHsxNkY5M30tXHh7MTZGOUZ9XHh7MTZGRTB9LVx4ezE2RkUxfVx4ezFCQzlEfS1ceHsxQkM5RX1ceHsxQkNBMH0tXHh7MUJDQTN9XHh7MUQxNjd9LVx4ezFEMTY5fVx4ezFEMTczfS1ceHsxRDE3QX1ceHsxRDE3Qn0tXHh7MUQxODJ9XHh7MUQxODV9LVx4ezFEMThCfVx4ezFEMUFBfS1ceHsxRDFBRH1ceHsxRDI0Mn0tXHh7MUQyNDR9XHh7MURBMDB9LVx4ezFEQTM2fVx4ezFEQTNCfS1ceHsxREE2Q31ceHsxREE3NX1ceHsxREE4NH1ceHsxREE5Qn0tXHh7MURBOUZ9XHh7MURBQTF9LVx4ezFEQUFGfVx4ezFFMDAwfS1ceHsxRTAwNn1ceHsxRTAwOH0tXHh7MUUwMTh9XHh7MUUwMUJ9LVx4ezFFMDIxfVx4ezFFMDIzfS1ceHsxRTAyNH1ceHsxRTAyNn0tXHh7MUUwMkF9XHh7MUU4RDB9LVx4ezFFOEQ2fVx4ezFFOTQ0fS1ceHsxRTk0QX1ceHsxRjNGQn0tXHh7MUYzRkZ9XHh7RTAwMDF9XHh7RTAwMjB9LVx4e0UwMDdGfVx4e0UwMTAwfS1ceHtFMDFFRn1dKShccEwpKFxwTCorKS91JzsKPD9waHAKCnJldHVybiBhcnJheSAoCidhJyA9PiAnQScsCidiJyA9PiAnQicsCidjJyA9PiAnQycsCidkJyA9PiAnRCcsCidlJyA9PiAnRScsCidmJyA9PiAnRicsCidnJyA9PiAnRycsCidoJyA9PiAnSCcsCidpJyA9PiAnSScsCidqJyA9PiAnSicsCidrJyA9PiAnSycsCidsJyA9PiAnTCcsCidtJyA9PiAnTScsCiduJyA9PiAnTicsCidvJyA9PiAnTycsCidwJyA9PiAnUCcsCidxJyA9PiAnUScsCidyJyA9PiAnUicsCidzJyA9PiAnUycsCid0JyA9PiAnVCcsCid1JyA9PiAnVScsCid2JyA9PiAnVicsCid3JyA9PiAnVycsCid4JyA9PiAnWCcsCid5JyA9PiAnWScsCid6JyA9PiAnWicsCifCtScgPT4gJ86cJywKJ8OgJyA9PiAnw4AnLAonw6EnID0+ICfDgScsCifDoicgPT4gJ8OCJywKJ8OjJyA9PiAnw4MnLAonw6QnID0+ICfDhCcsCifDpScgPT4gJ8OFJywKJ8OmJyA9PiAnw4YnLAonw6cnID0+ICfDhycsCifDqCcgPT4gJ8OIJywKJ8OpJyA9PiAnw4knLAonw6onID0+ICfDiicsCifDqycgPT4gJ8OLJywKJ8OsJyA9PiAnw4wnLAonw60nID0+ICfDjScsCifDricgPT4gJ8OOJywKJ8OvJyA9PiAnw48nLAonw7AnID0+ICfDkCcsCifDsScgPT4gJ8ORJywKJ8OyJyA9PiAnw5InLAonw7MnID0+ICfDkycsCifDtCcgPT4gJ8OUJywKJ8O1JyA9PiAnw5UnLAonw7YnID0+ICfDlicsCifDuCcgPT4gJ8OYJywKJ8O5JyA9PiAnw5knLAonw7onID0+ICfDmicsCifDuycgPT4gJ8ObJywKJ8O8JyA9PiAnw5wnLAonw70nID0+ICfDnScsCifDvicgPT4gJ8OeJywKJ8O/JyA9PiAnxbgnLAonxIEnID0+ICfEgCcsCifEgycgPT4gJ8SCJywKJ8SFJyA9PiAnxIQnLAonxIcnID0+ICfEhicsCifEiScgPT4gJ8SIJywKJ8SLJyA9PiAnxIonLAonxI0nID0+ICfEjCcsCifEjycgPT4gJ8SOJywKJ8SRJyA9PiAnxJAnLAonxJMnID0+ICfEkicsCifElScgPT4gJ8SUJywKJ8SXJyA9PiAnxJYnLAonxJknID0+ICfEmCcsCifEmycgPT4gJ8SaJywKJ8SdJyA9PiAnxJwnLAonxJ8nID0+ICfEnicsCifEoScgPT4gJ8SgJywKJ8SjJyA9PiAnxKInLAonxKUnID0+ICfEpCcsCifEpycgPT4gJ8SmJywKJ8SpJyA9PiAnxKgnLAonxKsnID0+ICfEqicsCifErScgPT4gJ8SsJywKJ8SvJyA9PiAnxK4nLAonxLEnID0+ICdJJywKJ8SzJyA9PiAnxLInLAonxLUnID0+ICfEtCcsCifEtycgPT4gJ8S2JywKJ8S6JyA9PiAnxLknLAonxLwnID0+ICfEuycsCifEvicgPT4gJ8S9JywKJ8WAJyA9PiAnxL8nLAonxYInID0+ICfFgScsCifFhCcgPT4gJ8WDJywKJ8WGJyA9PiAnxYUnLAonxYgnID0+ICfFhycsCifFiycgPT4gJ8WKJywKJ8WNJyA9PiAnxYwnLAonxY8nID0+ICfFjicsCifFkScgPT4gJ8WQJywKJ8WTJyA9PiAnxZInLAonxZUnID0+ICfFlCcsCifFlycgPT4gJ8WWJywKJ8WZJyA9PiAnxZgnLAonxZsnID0+ICfFmicsCifFnScgPT4gJ8WcJywKJ8WfJyA9PiAnxZ4nLAonxaEnID0+ICfFoCcsCifFoycgPT4gJ8WiJywKJ8WlJyA9PiAnxaQnLAonxacnID0+ICfFpicsCifFqScgPT4gJ8WoJywKJ8WrJyA9PiAnxaonLAonxa0nID0+ICfFrCcsCifFrycgPT4gJ8WuJywKJ8WxJyA9PiAnxbAnLAonxbMnID0+ICfFsicsCifFtScgPT4gJ8W0JywKJ8W3JyA9PiAnxbYnLAonxbonID0+ICfFuScsCifFvCcgPT4gJ8W7JywKJ8W+JyA9PiAnxb0nLAonxb8nID0+ICdTJywKJ8aAJyA9PiAnyYMnLAonxoMnID0+ICfGgicsCifGhScgPT4gJ8aEJywKJ8aIJyA9PiAnxocnLAonxownID0+ICfGiycsCifGkicgPT4gJ8aRJywKJ8aVJyA9PiAnx7YnLAonxpknID0+ICfGmCcsCifGmicgPT4gJ8i9JywKJ8aeJyA9PiAnyKAnLAonxqEnID0+ICfGoCcsCifGoycgPT4gJ8aiJywKJ8alJyA9PiAnxqQnLAonxqgnID0+ICfGpycsCifGrScgPT4gJ8asJywKJ8awJyA9PiAnxq8nLAonxrQnID0+ICfGsycsCifGticgPT4gJ8a1JywKJ8a5JyA9PiAnxrgnLAonxr0nID0+ICfGvCcsCifGvycgPT4gJ8e3JywKJ8eFJyA9PiAnx4QnLAonx4YnID0+ICfHhCcsCifHiCcgPT4gJ8eHJywKJ8eJJyA9PiAnx4cnLAonx4snID0+ICfHiicsCifHjCcgPT4gJ8eKJywKJ8eOJyA9PiAnx40nLAonx5AnID0+ICfHjycsCifHkicgPT4gJ8eRJywKJ8eUJyA9PiAnx5MnLAonx5YnID0+ICfHlScsCifHmCcgPT4gJ8eXJywKJ8eaJyA9PiAnx5knLAonx5wnID0+ICfHmycsCifHnScgPT4gJ8aOJywKJ8efJyA9PiAnx54nLAonx6EnID0+ICfHoCcsCifHoycgPT4gJ8eiJywKJ8elJyA9PiAnx6QnLAonx6cnID0+ICfHpicsCifHqScgPT4gJ8eoJywKJ8erJyA9PiAnx6onLAonx60nID0+ICfHrCcsCifHrycgPT4gJ8euJywKJ8eyJyA9PiAnx7EnLAonx7MnID0+ICfHsScsCifHtScgPT4gJ8e0JywKJ8e5JyA9PiAnx7gnLAonx7snID0+ICfHuicsCifHvScgPT4gJ8e8JywKJ8e/JyA9PiAnx74nLAonyIEnID0+ICfIgCcsCifIgycgPT4gJ8iCJywKJ8iFJyA9PiAnyIQnLAonyIcnID0+ICfIhicsCifIiScgPT4gJ8iIJywKJ8iLJyA9PiAnyIonLAonyI0nID0+ICfIjCcsCifIjycgPT4gJ8iOJywKJ8iRJyA9PiAnyJAnLAonyJMnID0+ICfIkicsCifIlScgPT4gJ8iUJywKJ8iXJyA9PiAnyJYnLAonyJknID0+ICfImCcsCifImycgPT4gJ8iaJywKJ8idJyA9PiAnyJwnLAonyJ8nID0+ICfInicsCifIoycgPT4gJ8iiJywKJ8ilJyA9PiAnyKQnLAonyKcnID0+ICfIpicsCifIqScgPT4gJ8ioJywKJ8irJyA9PiAnyKonLAonyK0nID0+ICfIrCcsCifIrycgPT4gJ8iuJywKJ8ixJyA9PiAnyLAnLAonyLMnID0+ICfIsicsCifIvCcgPT4gJ8i7JywKJ8i/JyA9PiAn4rG+JywKJ8mAJyA9PiAn4rG/JywKJ8mCJyA9PiAnyYEnLAonyYcnID0+ICfJhicsCifJiScgPT4gJ8mIJywKJ8mLJyA9PiAnyYonLAonyY0nID0+ICfJjCcsCifJjycgPT4gJ8mOJywKJ8mQJyA9PiAn4rGvJywKJ8mRJyA9PiAn4rGtJywKJ8mSJyA9PiAn4rGwJywKJ8mTJyA9PiAnxoEnLAonyZQnID0+ICfGhicsCifJlicgPT4gJ8aJJywKJ8mXJyA9PiAnxoonLAonyZknID0+ICfGjycsCifJmycgPT4gJ8aQJywKJ8mcJyA9PiAn6p6rJywKJ8mgJyA9PiAnxpMnLAonyaEnID0+ICfqnqwnLAonyaMnID0+ICfGlCcsCifJpScgPT4gJ+qejScsCifJpicgPT4gJ+qeqicsCifJqCcgPT4gJ8aXJywKJ8mpJyA9PiAnxpYnLAonyaonID0+ICfqnq4nLAonyasnID0+ICfisaInLAonyawnID0+ICfqnq0nLAonya8nID0+ICfGnCcsCifJsScgPT4gJ+KxricsCifJsicgPT4gJ8adJywKJ8m1JyA9PiAnxp8nLAonyb0nID0+ICfisaQnLAonyoAnID0+ICfGpicsCifKgicgPT4gJ+qfhScsCifKgycgPT4gJ8apJywKJ8qHJyA9PiAn6p6xJywKJ8qIJyA9PiAnxq4nLAonyoknID0+ICfJhCcsCifKiicgPT4gJ8axJywKJ8qLJyA9PiAnxrInLAonyownID0+ICfJhScsCifKkicgPT4gJ8a3JywKJ8qdJyA9PiAn6p6yJywKJ8qeJyA9PiAn6p6wJywKJ82FJyA9PiAnzpknLAonzbEnID0+ICfNsCcsCifNsycgPT4gJ82yJywKJ823JyA9PiAnzbYnLAonzbsnID0+ICfPvScsCifNvCcgPT4gJ8++JywKJ829JyA9PiAnz78nLAonzqwnID0+ICfOhicsCifOrScgPT4gJ86IJywKJ86uJyA9PiAnzoknLAonzq8nID0+ICfOiicsCifOsScgPT4gJ86RJywKJ86yJyA9PiAnzpInLAonzrMnID0+ICfOkycsCifOtCcgPT4gJ86UJywKJ861JyA9PiAnzpUnLAonzrYnID0+ICfOlicsCifOtycgPT4gJ86XJywKJ864JyA9PiAnzpgnLAonzrknID0+ICfOmScsCifOuicgPT4gJ86aJywKJ867JyA9PiAnzpsnLAonzrwnID0+ICfOnCcsCifOvScgPT4gJ86dJywKJ86+JyA9PiAnzp4nLAonzr8nID0+ICfOnycsCifPgCcgPT4gJ86gJywKJ8+BJyA9PiAnzqEnLAonz4InID0+ICfOoycsCifPgycgPT4gJ86jJywKJ8+EJyA9PiAnzqQnLAonz4UnID0+ICfOpScsCifPhicgPT4gJ86mJywKJ8+HJyA9PiAnzqcnLAonz4gnID0+ICfOqCcsCifPiScgPT4gJ86pJywKJ8+KJyA9PiAnzqonLAonz4snID0+ICfOqycsCifPjCcgPT4gJ86MJywKJ8+NJyA9PiAnzo4nLAonz44nID0+ICfOjycsCifPkCcgPT4gJ86SJywKJ8+RJyA9PiAnzpgnLAonz5UnID0+ICfOpicsCifPlicgPT4gJ86gJywKJ8+XJyA9PiAnz48nLAonz5knID0+ICfPmCcsCifPmycgPT4gJ8+aJywKJ8+dJyA9PiAnz5wnLAonz58nID0+ICfPnicsCifPoScgPT4gJ8+gJywKJ8+jJyA9PiAnz6InLAonz6UnID0+ICfPpCcsCifPpycgPT4gJ8+mJywKJ8+pJyA9PiAnz6gnLAonz6snID0+ICfPqicsCifPrScgPT4gJ8+sJywKJ8+vJyA9PiAnz64nLAonz7AnID0+ICfOmicsCifPsScgPT4gJ86hJywKJ8+yJyA9PiAnz7knLAonz7MnID0+ICfNvycsCifPtScgPT4gJ86VJywKJ8+4JyA9PiAnz7cnLAonz7snID0+ICfPuicsCifQsCcgPT4gJ9CQJywKJ9CxJyA9PiAn0JEnLAon0LInID0+ICfQkicsCifQsycgPT4gJ9CTJywKJ9C0JyA9PiAn0JQnLAon0LUnID0+ICfQlScsCifQticgPT4gJ9CWJywKJ9C3JyA9PiAn0JcnLAon0LgnID0+ICfQmCcsCifQuScgPT4gJ9CZJywKJ9C6JyA9PiAn0JonLAon0LsnID0+ICfQmycsCifQvCcgPT4gJ9CcJywKJ9C9JyA9PiAn0J0nLAon0L4nID0+ICfQnicsCifQvycgPT4gJ9CfJywKJ9GAJyA9PiAn0KAnLAon0YEnID0+ICfQoScsCifRgicgPT4gJ9CiJywKJ9GDJyA9PiAn0KMnLAon0YQnID0+ICfQpCcsCifRhScgPT4gJ9ClJywKJ9GGJyA9PiAn0KYnLAon0YcnID0+ICfQpycsCifRiCcgPT4gJ9CoJywKJ9GJJyA9PiAn0KknLAon0YonID0+ICfQqicsCifRiycgPT4gJ9CrJywKJ9GMJyA9PiAn0KwnLAon0Y0nID0+ICfQrScsCifRjicgPT4gJ9CuJywKJ9GPJyA9PiAn0K8nLAon0ZAnID0+ICfQgCcsCifRkScgPT4gJ9CBJywKJ9GSJyA9PiAn0IInLAon0ZMnID0+ICfQgycsCifRlCcgPT4gJ9CEJywKJ9GVJyA9PiAn0IUnLAon0ZYnID0+ICfQhicsCifRlycgPT4gJ9CHJywKJ9GYJyA9PiAn0IgnLAon0ZknID0+ICfQiScsCifRmicgPT4gJ9CKJywKJ9GbJyA9PiAn0IsnLAon0ZwnID0+ICfQjCcsCifRnScgPT4gJ9CNJywKJ9GeJyA9PiAn0I4nLAon0Z8nID0+ICfQjycsCifRoScgPT4gJ9GgJywKJ9GjJyA9PiAn0aInLAon0aUnID0+ICfRpCcsCifRpycgPT4gJ9GmJywKJ9GpJyA9PiAn0agnLAon0asnID0+ICfRqicsCifRrScgPT4gJ9GsJywKJ9GvJyA9PiAn0a4nLAon0bEnID0+ICfRsCcsCifRsycgPT4gJ9GyJywKJ9G1JyA9PiAn0bQnLAon0bcnID0+ICfRticsCifRuScgPT4gJ9G4JywKJ9G7JyA9PiAn0bonLAon0b0nID0+ICfRvCcsCifRvycgPT4gJ9G+JywKJ9KBJyA9PiAn0oAnLAon0osnID0+ICfSiicsCifSjScgPT4gJ9KMJywKJ9KPJyA9PiAn0o4nLAon0pEnID0+ICfSkCcsCifSkycgPT4gJ9KSJywKJ9KVJyA9PiAn0pQnLAon0pcnID0+ICfSlicsCifSmScgPT4gJ9KYJywKJ9KbJyA9PiAn0ponLAon0p0nID0+ICfSnCcsCifSnycgPT4gJ9KeJywKJ9KhJyA9PiAn0qAnLAon0qMnID0+ICfSoicsCifSpScgPT4gJ9KkJywKJ9KnJyA9PiAn0qYnLAon0qknID0+ICfSqCcsCifSqycgPT4gJ9KqJywKJ9KtJyA9PiAn0qwnLAon0q8nID0+ICfSricsCifSsScgPT4gJ9KwJywKJ9KzJyA9PiAn0rInLAon0rUnID0+ICfStCcsCifStycgPT4gJ9K2JywKJ9K5JyA9PiAn0rgnLAon0rsnID0+ICfSuicsCifSvScgPT4gJ9K8JywKJ9K/JyA9PiAn0r4nLAon04InID0+ICfTgScsCifThCcgPT4gJ9ODJywKJ9OGJyA9PiAn04UnLAon04gnID0+ICfThycsCifTiicgPT4gJ9OJJywKJ9OMJyA9PiAn04snLAon044nID0+ICfTjScsCifTjycgPT4gJ9OAJywKJ9ORJyA9PiAn05AnLAon05MnID0+ICfTkicsCifTlScgPT4gJ9OUJywKJ9OXJyA9PiAn05YnLAon05knID0+ICfTmCcsCifTmycgPT4gJ9OaJywKJ9OdJyA9PiAn05wnLAon058nID0+ICfTnicsCifToScgPT4gJ9OgJywKJ9OjJyA9PiAn06InLAon06UnID0+ICfTpCcsCifTpycgPT4gJ9OmJywKJ9OpJyA9PiAn06gnLAon06snID0+ICfTqicsCifTrScgPT4gJ9OsJywKJ9OvJyA9PiAn064nLAon07EnID0+ICfTsCcsCifTsycgPT4gJ9OyJywKJ9O1JyA9PiAn07QnLAon07cnID0+ICfTticsCifTuScgPT4gJ9O4JywKJ9O7JyA9PiAn07onLAon070nID0+ICfTvCcsCifTvycgPT4gJ9O+JywKJ9SBJyA9PiAn1IAnLAon1IMnID0+ICfUgicsCifUhScgPT4gJ9SEJywKJ9SHJyA9PiAn1IYnLAon1IknID0+ICfUiCcsCifUiycgPT4gJ9SKJywKJ9SNJyA9PiAn1IwnLAon1I8nID0+ICfUjicsCifUkScgPT4gJ9SQJywKJ9STJyA9PiAn1JInLAon1JUnID0+ICfUlCcsCifUlycgPT4gJ9SWJywKJ9SZJyA9PiAn1JgnLAon1JsnID0+ICfUmicsCifUnScgPT4gJ9ScJywKJ9SfJyA9PiAn1J4nLAon1KEnID0+ICfUoCcsCifUoycgPT4gJ9SiJywKJ9SlJyA9PiAn1KQnLAon1KcnID0+ICfUpicsCifUqScgPT4gJ9SoJywKJ9SrJyA9PiAn1KonLAon1K0nID0+ICfUrCcsCifUrycgPT4gJ9SuJywKJ9WhJyA9PiAn1LEnLAon1aInID0+ICfUsicsCifVoycgPT4gJ9SzJywKJ9WkJyA9PiAn1LQnLAon1aUnID0+ICfUtScsCifVpicgPT4gJ9S2JywKJ9WnJyA9PiAn1LcnLAon1agnID0+ICfUuCcsCifVqScgPT4gJ9S5JywKJ9WqJyA9PiAn1LonLAon1asnID0+ICfUuycsCifVrCcgPT4gJ9S8JywKJ9WtJyA9PiAn1L0nLAon1a4nID0+ICfUvicsCifVrycgPT4gJ9S/JywKJ9WwJyA9PiAn1YAnLAon1bEnID0+ICfVgScsCifVsicgPT4gJ9WCJywKJ9WzJyA9PiAn1YMnLAon1bQnID0+ICfVhCcsCifVtScgPT4gJ9WFJywKJ9W2JyA9PiAn1YYnLAon1bcnID0+ICfVhycsCifVuCcgPT4gJ9WIJywKJ9W5JyA9PiAn1YknLAon1bonID0+ICfViicsCifVuycgPT4gJ9WLJywKJ9W8JyA9PiAn1YwnLAon1b0nID0+ICfVjScsCifVvicgPT4gJ9WOJywKJ9W/JyA9PiAn1Y8nLAon1oAnID0+ICfVkCcsCifWgScgPT4gJ9WRJywKJ9aCJyA9PiAn1ZInLAon1oMnID0+ICfVkycsCifWhCcgPT4gJ9WUJywKJ9aFJyA9PiAn1ZUnLAon1oYnID0+ICfVlicsCifhg5AnID0+ICfhspAnLAon4YORJyA9PiAn4bKRJywKJ+GDkicgPT4gJ+GykicsCifhg5MnID0+ICfhspMnLAon4YOUJyA9PiAn4bKUJywKJ+GDlScgPT4gJ+GylScsCifhg5YnID0+ICfhspYnLAon4YOXJyA9PiAn4bKXJywKJ+GDmCcgPT4gJ+GymCcsCifhg5knID0+ICfhspknLAon4YOaJyA9PiAn4bKaJywKJ+GDmycgPT4gJ+GymycsCifhg5wnID0+ICfhspwnLAon4YOdJyA9PiAn4bKdJywKJ+GDnicgPT4gJ+GynicsCifhg58nID0+ICfhsp8nLAon4YOgJyA9PiAn4bKgJywKJ+GDoScgPT4gJ+GyoScsCifhg6InID0+ICfhsqInLAon4YOjJyA9PiAn4bKjJywKJ+GDpCcgPT4gJ+GypCcsCifhg6UnID0+ICfhsqUnLAon4YOmJyA9PiAn4bKmJywKJ+GDpycgPT4gJ+GypycsCifhg6gnID0+ICfhsqgnLAon4YOpJyA9PiAn4bKpJywKJ+GDqicgPT4gJ+GyqicsCifhg6snID0+ICfhsqsnLAon4YOsJyA9PiAn4bKsJywKJ+GDrScgPT4gJ+GyrScsCifhg64nID0+ICfhsq4nLAon4YOvJyA9PiAn4bKvJywKJ+GDsCcgPT4gJ+GysCcsCifhg7EnID0+ICfhsrEnLAon4YOyJyA9PiAn4bKyJywKJ+GDsycgPT4gJ+GysycsCifhg7QnID0+ICfhsrQnLAon4YO1JyA9PiAn4bK1JywKJ+GDticgPT4gJ+GyticsCifhg7cnID0+ICfhsrcnLAon4YO4JyA9PiAn4bK4JywKJ+GDuScgPT4gJ+GyuScsCifhg7onID0+ICfhsronLAon4YO9JyA9PiAn4bK9JywKJ+GDvicgPT4gJ+GyvicsCifhg78nID0+ICfhsr8nLAon4Y+4JyA9PiAn4Y+wJywKJ+GPuScgPT4gJ+GPsScsCifhj7onID0+ICfhj7InLAon4Y+7JyA9PiAn4Y+zJywKJ+GPvCcgPT4gJ+GPtCcsCifhj70nID0+ICfhj7UnLAon4bKAJyA9PiAn0JInLAon4bKBJyA9PiAn0JQnLAon4bKCJyA9PiAn0J4nLAon4bKDJyA9PiAn0KEnLAon4bKEJyA9PiAn0KInLAon4bKFJyA9PiAn0KInLAon4bKGJyA9PiAn0KonLAon4bKHJyA9PiAn0aInLAon4bKIJyA9PiAn6pmKJywKJ+G1uScgPT4gJ+qdvScsCifhtb0nID0+ICfisaMnLAon4baOJyA9PiAn6p+GJywKJ+G4gScgPT4gJ+G4gCcsCifhuIMnID0+ICfhuIInLAon4biFJyA9PiAn4biEJywKJ+G4hycgPT4gJ+G4hicsCifhuIknID0+ICfhuIgnLAon4biLJyA9PiAn4biKJywKJ+G4jScgPT4gJ+G4jCcsCifhuI8nID0+ICfhuI4nLAon4biRJyA9PiAn4biQJywKJ+G4kycgPT4gJ+G4kicsCifhuJUnID0+ICfhuJQnLAon4biXJyA9PiAn4biWJywKJ+G4mScgPT4gJ+G4mCcsCifhuJsnID0+ICfhuJonLAon4bidJyA9PiAn4bicJywKJ+G4nycgPT4gJ+G4nicsCifhuKEnID0+ICfhuKAnLAon4bijJyA9PiAn4biiJywKJ+G4pScgPT4gJ+G4pCcsCifhuKcnID0+ICfhuKYnLAon4bipJyA9PiAn4bioJywKJ+G4qycgPT4gJ+G4qicsCifhuK0nID0+ICfhuKwnLAon4bivJyA9PiAn4biuJywKJ+G4sScgPT4gJ+G4sCcsCifhuLMnID0+ICfhuLInLAon4bi1JyA9PiAn4bi0JywKJ+G4tycgPT4gJ+G4ticsCifhuLknID0+ICfhuLgnLAon4bi7JyA9PiAn4bi6JywKJ+G4vScgPT4gJ+G4vCcsCifhuL8nID0+ICfhuL4nLAon4bmBJyA9PiAn4bmAJywKJ+G5gycgPT4gJ+G5gicsCifhuYUnID0+ICfhuYQnLAon4bmHJyA9PiAn4bmGJywKJ+G5iScgPT4gJ+G5iCcsCifhuYsnID0+ICfhuYonLAon4bmNJyA9PiAn4bmMJywKJ+G5jycgPT4gJ+G5jicsCifhuZEnID0+ICfhuZAnLAon4bmTJyA9PiAn4bmSJywKJ+G5lScgPT4gJ+G5lCcsCifhuZcnID0+ICfhuZYnLAon4bmZJyA9PiAn4bmYJywKJ+G5mycgPT4gJ+G5micsCifhuZ0nID0+ICfhuZwnLAon4bmfJyA9PiAn4bmeJywKJ+G5oScgPT4gJ+G5oCcsCifhuaMnID0+ICfhuaInLAon4bmlJyA9PiAn4bmkJywKJ+G5pycgPT4gJ+G5picsCifhuaknID0+ICfhuagnLAon4bmrJyA9PiAn4bmqJywKJ+G5rScgPT4gJ+G5rCcsCifhua8nID0+ICfhua4nLAon4bmxJyA9PiAn4bmwJywKJ+G5sycgPT4gJ+G5sicsCifhubUnID0+ICfhubQnLAon4bm3JyA9PiAn4bm2JywKJ+G5uScgPT4gJ+G5uCcsCifhubsnID0+ICfhubonLAon4bm9JyA9PiAn4bm8JywKJ+G5vycgPT4gJ+G5vicsCifhuoEnID0+ICfhuoAnLAon4bqDJyA9PiAn4bqCJywKJ+G6hScgPT4gJ+G6hCcsCifhuocnID0+ICfhuoYnLAon4bqJJyA9PiAn4bqIJywKJ+G6iycgPT4gJ+G6iicsCifhuo0nID0+ICfhuownLAon4bqPJyA9PiAn4bqOJywKJ+G6kScgPT4gJ+G6kCcsCifhupMnID0+ICfhupInLAon4bqVJyA9PiAn4bqUJywKJ+G6mycgPT4gJ+G5oCcsCifhuqEnID0+ICfhuqAnLAon4bqjJyA9PiAn4bqiJywKJ+G6pScgPT4gJ+G6pCcsCifhuqcnID0+ICfhuqYnLAon4bqpJyA9PiAn4bqoJywKJ+G6qycgPT4gJ+G6qicsCifhuq0nID0+ICfhuqwnLAon4bqvJyA9PiAn4bquJywKJ+G6sScgPT4gJ+G6sCcsCifhurMnID0+ICfhurInLAon4bq1JyA9PiAn4bq0JywKJ+G6tycgPT4gJ+G6ticsCifhurknID0+ICfhurgnLAon4bq7JyA9PiAn4bq6JywKJ+G6vScgPT4gJ+G6vCcsCifhur8nID0+ICfhur4nLAon4buBJyA9PiAn4buAJywKJ+G7gycgPT4gJ+G7gicsCifhu4UnID0+ICfhu4QnLAon4buHJyA9PiAn4buGJywKJ+G7iScgPT4gJ+G7iCcsCifhu4snID0+ICfhu4onLAon4buNJyA9PiAn4buMJywKJ+G7jycgPT4gJ+G7jicsCifhu5EnID0+ICfhu5AnLAon4buTJyA9PiAn4buSJywKJ+G7lScgPT4gJ+G7lCcsCifhu5cnID0+ICfhu5YnLAon4buZJyA9PiAn4buYJywKJ+G7mycgPT4gJ+G7micsCifhu50nID0+ICfhu5wnLAon4bufJyA9PiAn4bueJywKJ+G7oScgPT4gJ+G7oCcsCifhu6MnID0+ICfhu6InLAon4bulJyA9PiAn4bukJywKJ+G7pycgPT4gJ+G7picsCifhu6knID0+ICfhu6gnLAon4burJyA9PiAn4buqJywKJ+G7rScgPT4gJ+G7rCcsCifhu68nID0+ICfhu64nLAon4buxJyA9PiAn4buwJywKJ+G7sycgPT4gJ+G7sicsCifhu7UnID0+ICfhu7QnLAon4bu3JyA9PiAn4bu2JywKJ+G7uScgPT4gJ+G7uCcsCifhu7snID0+ICfhu7onLAon4bu9JyA9PiAn4bu8JywKJ+G7vycgPT4gJ+G7vicsCifhvIAnID0+ICfhvIgnLAon4byBJyA9PiAn4byJJywKJ+G8gicgPT4gJ+G8iicsCifhvIMnID0+ICfhvIsnLAon4byEJyA9PiAn4byMJywKJ+G8hScgPT4gJ+G8jScsCifhvIYnID0+ICfhvI4nLAon4byHJyA9PiAn4byPJywKJ+G8kCcgPT4gJ+G8mCcsCifhvJEnID0+ICfhvJknLAon4bySJyA9PiAn4byaJywKJ+G8kycgPT4gJ+G8mycsCifhvJQnID0+ICfhvJwnLAon4byVJyA9PiAn4bydJywKJ+G8oCcgPT4gJ+G8qCcsCifhvKEnID0+ICfhvKknLAon4byiJyA9PiAn4byqJywKJ+G8oycgPT4gJ+G8qycsCifhvKQnID0+ICfhvKwnLAon4bylJyA9PiAn4bytJywKJ+G8picgPT4gJ+G8ricsCifhvKcnID0+ICfhvK8nLAon4bywJyA9PiAn4by4JywKJ+G8sScgPT4gJ+G8uScsCifhvLInID0+ICfhvLonLAon4byzJyA9PiAn4by7JywKJ+G8tCcgPT4gJ+G8vCcsCifhvLUnID0+ICfhvL0nLAon4by2JyA9PiAn4by+JywKJ+G8tycgPT4gJ+G8vycsCifhvYAnID0+ICfhvYgnLAon4b2BJyA9PiAn4b2JJywKJ+G9gicgPT4gJ+G9iicsCifhvYMnID0+ICfhvYsnLAon4b2EJyA9PiAn4b2MJywKJ+G9hScgPT4gJ+G9jScsCifhvZEnID0+ICfhvZknLAon4b2TJyA9PiAn4b2bJywKJ+G9lScgPT4gJ+G9nScsCifhvZcnID0+ICfhvZ8nLAon4b2gJyA9PiAn4b2oJywKJ+G9oScgPT4gJ+G9qScsCifhvaInID0+ICfhvaonLAon4b2jJyA9PiAn4b2rJywKJ+G9pCcgPT4gJ+G9rCcsCifhvaUnID0+ICfhva0nLAon4b2mJyA9PiAn4b2uJywKJ+G9pycgPT4gJ+G9rycsCifhvbAnID0+ICfhvronLAon4b2xJyA9PiAn4b67JywKJ+G9sicgPT4gJ+G/iCcsCifhvbMnID0+ICfhv4knLAon4b20JyA9PiAn4b+KJywKJ+G9tScgPT4gJ+G/iycsCifhvbYnID0+ICfhv5onLAon4b23JyA9PiAn4b+bJywKJ+G9uCcgPT4gJ+G/uCcsCifhvbknID0+ICfhv7knLAon4b26JyA9PiAn4b+qJywKJ+G9uycgPT4gJ+G/qycsCifhvbwnID0+ICfhv7onLAon4b29JyA9PiAn4b+7JywKJ+G+gCcgPT4gJ+G8iM6ZJywKJ+G+gScgPT4gJ+G8ic6ZJywKJ+G+gicgPT4gJ+G8is6ZJywKJ+G+gycgPT4gJ+G8i86ZJywKJ+G+hCcgPT4gJ+G8jM6ZJywKJ+G+hScgPT4gJ+G8jc6ZJywKJ+G+hicgPT4gJ+G8js6ZJywKJ+G+hycgPT4gJ+G8j86ZJywKJ+G+kCcgPT4gJ+G8qM6ZJywKJ+G+kScgPT4gJ+G8qc6ZJywKJ+G+kicgPT4gJ+G8qs6ZJywKJ+G+kycgPT4gJ+G8q86ZJywKJ+G+lCcgPT4gJ+G8rM6ZJywKJ+G+lScgPT4gJ+G8rc6ZJywKJ+G+licgPT4gJ+G8rs6ZJywKJ+G+lycgPT4gJ+G8r86ZJywKJ+G+oCcgPT4gJ+G9qM6ZJywKJ+G+oScgPT4gJ+G9qc6ZJywKJ+G+oicgPT4gJ+G9qs6ZJywKJ+G+oycgPT4gJ+G9q86ZJywKJ+G+pCcgPT4gJ+G9rM6ZJywKJ+G+pScgPT4gJ+G9rc6ZJywKJ+G+picgPT4gJ+G9rs6ZJywKJ+G+pycgPT4gJ+G9r86ZJywKJ+G+sCcgPT4gJ+G+uCcsCifhvrEnID0+ICfhvrknLAon4b6zJyA9PiAnzpHOmScsCifhvr4nID0+ICfOmScsCifhv4MnID0+ICfOl86ZJywKJ+G/kCcgPT4gJ+G/mCcsCifhv5EnID0+ICfhv5knLAon4b+gJyA9PiAn4b+oJywKJ+G/oScgPT4gJ+G/qScsCifhv6UnID0+ICfhv6wnLAon4b+zJyA9PiAnzqnOmScsCifihY4nID0+ICfihLInLAon4oWwJyA9PiAn4oWgJywKJ+KFsScgPT4gJ+KFoScsCifihbInID0+ICfihaInLAon4oWzJyA9PiAn4oWjJywKJ+KFtCcgPT4gJ+KFpCcsCifihbUnID0+ICfihaUnLAon4oW2JyA9PiAn4oWmJywKJ+KFtycgPT4gJ+KFpycsCifihbgnID0+ICfihagnLAon4oW5JyA9PiAn4oWpJywKJ+KFuicgPT4gJ+KFqicsCifihbsnID0+ICfihasnLAon4oW8JyA9PiAn4oWsJywKJ+KFvScgPT4gJ+KFrScsCifihb4nID0+ICfiha4nLAon4oW/JyA9PiAn4oWvJywKJ+KGhCcgPT4gJ+KGgycsCifik5AnID0+ICfikrYnLAon4pORJyA9PiAn4pK3JywKJ+KTkicgPT4gJ+KSuCcsCifik5MnID0+ICfikrknLAon4pOUJyA9PiAn4pK6JywKJ+KTlScgPT4gJ+KSuycsCifik5YnID0+ICfikrwnLAon4pOXJyA9PiAn4pK9JywKJ+KTmCcgPT4gJ+KSvicsCifik5knID0+ICfikr8nLAon4pOaJyA9PiAn4pOAJywKJ+KTmycgPT4gJ+KTgScsCifik5wnID0+ICfik4InLAon4pOdJyA9PiAn4pODJywKJ+KTnicgPT4gJ+KThCcsCifik58nID0+ICfik4UnLAon4pOgJyA9PiAn4pOGJywKJ+KToScgPT4gJ+KThycsCifik6InID0+ICfik4gnLAon4pOjJyA9PiAn4pOJJywKJ+KTpCcgPT4gJ+KTiicsCifik6UnID0+ICfik4snLAon4pOmJyA9PiAn4pOMJywKJ+KTpycgPT4gJ+KTjScsCifik6gnID0+ICfik44nLAon4pOpJyA9PiAn4pOPJywKJ+KwsCcgPT4gJ+KwgCcsCifisLEnID0+ICfisIEnLAon4rCyJyA9PiAn4rCCJywKJ+KwsycgPT4gJ+KwgycsCifisLQnID0+ICfisIQnLAon4rC1JyA9PiAn4rCFJywKJ+KwticgPT4gJ+KwhicsCifisLcnID0+ICfisIcnLAon4rC4JyA9PiAn4rCIJywKJ+KwuScgPT4gJ+KwiScsCifisLonID0+ICfisIonLAon4rC7JyA9PiAn4rCLJywKJ+KwvCcgPT4gJ+KwjCcsCifisL0nID0+ICfisI0nLAon4rC+JyA9PiAn4rCOJywKJ+KwvycgPT4gJ+KwjycsCifisYAnID0+ICfisJAnLAon4rGBJyA9PiAn4rCRJywKJ+KxgicgPT4gJ+KwkicsCifisYMnID0+ICfisJMnLAon4rGEJyA9PiAn4rCUJywKJ+KxhScgPT4gJ+KwlScsCifisYYnID0+ICfisJYnLAon4rGHJyA9PiAn4rCXJywKJ+KxiCcgPT4gJ+KwmCcsCifisYknID0+ICfisJknLAon4rGKJyA9PiAn4rCaJywKJ+KxiycgPT4gJ+KwmycsCifisYwnID0+ICfisJwnLAon4rGNJyA9PiAn4rCdJywKJ+KxjicgPT4gJ+KwnicsCifisY8nID0+ICfisJ8nLAon4rGQJyA9PiAn4rCgJywKJ+KxkScgPT4gJ+KwoScsCifisZInID0+ICfisKInLAon4rGTJyA9PiAn4rCjJywKJ+KxlCcgPT4gJ+KwpCcsCifisZUnID0+ICfisKUnLAon4rGWJyA9PiAn4rCmJywKJ+KxlycgPT4gJ+KwpycsCifisZgnID0+ICfisKgnLAon4rGZJyA9PiAn4rCpJywKJ+KxmicgPT4gJ+KwqicsCifisZsnID0+ICfisKsnLAon4rGcJyA9PiAn4rCsJywKJ+KxnScgPT4gJ+KwrScsCifisZ4nID0+ICfisK4nLAon4rGhJyA9PiAn4rGgJywKJ+KxpScgPT4gJ8i6JywKJ+KxpicgPT4gJ8i+JywKJ+KxqCcgPT4gJ+KxpycsCifisaonID0+ICfisaknLAon4rGsJyA9PiAn4rGrJywKJ+KxsycgPT4gJ+KxsicsCifisbYnID0+ICfisbUnLAon4rKBJyA9PiAn4rKAJywKJ+KygycgPT4gJ+KygicsCifisoUnID0+ICfisoQnLAon4rKHJyA9PiAn4rKGJywKJ+KyiScgPT4gJ+KyiCcsCifisosnID0+ICfisoonLAon4rKNJyA9PiAn4rKMJywKJ+KyjycgPT4gJ+KyjicsCifispEnID0+ICfispAnLAon4rKTJyA9PiAn4rKSJywKJ+KylScgPT4gJ+KylCcsCifispcnID0+ICfispYnLAon4rKZJyA9PiAn4rKYJywKJ+KymycgPT4gJ+KymicsCifisp0nID0+ICfispwnLAon4rKfJyA9PiAn4rKeJywKJ+KyoScgPT4gJ+KyoCcsCifisqMnID0+ICfisqInLAon4rKlJyA9PiAn4rKkJywKJ+KypycgPT4gJ+KypicsCifisqknID0+ICfisqgnLAon4rKrJyA9PiAn4rKqJywKJ+KyrScgPT4gJ+KyrCcsCifisq8nID0+ICfisq4nLAon4rKxJyA9PiAn4rKwJywKJ+KysycgPT4gJ+KysicsCifisrUnID0+ICfisrQnLAon4rK3JyA9PiAn4rK2JywKJ+KyuScgPT4gJ+KyuCcsCifisrsnID0+ICfisronLAon4rK9JyA9PiAn4rK8JywKJ+KyvycgPT4gJ+KyvicsCifis4EnID0+ICfis4AnLAon4rODJyA9PiAn4rOCJywKJ+KzhScgPT4gJ+KzhCcsCifis4cnID0+ICfis4YnLAon4rOJJyA9PiAn4rOIJywKJ+KziycgPT4gJ+KziicsCifis40nID0+ICfis4wnLAon4rOPJyA9PiAn4rOOJywKJ+KzkScgPT4gJ+KzkCcsCifis5MnID0+ICfis5InLAon4rOVJyA9PiAn4rOUJywKJ+KzlycgPT4gJ+KzlicsCifis5knID0+ICfis5gnLAon4rObJyA9PiAn4rOaJywKJ+KznScgPT4gJ+KznCcsCifis58nID0+ICfis54nLAon4rOhJyA9PiAn4rOgJywKJ+KzoycgPT4gJ+KzoicsCifis6wnID0+ICfis6snLAon4rOuJyA9PiAn4rOtJywKJ+KzsycgPT4gJ+KzsicsCifitIAnID0+ICfhgqAnLAon4rSBJyA9PiAn4YKhJywKJ+K0gicgPT4gJ+GCoicsCifitIMnID0+ICfhgqMnLAon4rSEJyA9PiAn4YKkJywKJ+K0hScgPT4gJ+GCpScsCifitIYnID0+ICfhgqYnLAon4rSHJyA9PiAn4YKnJywKJ+K0iCcgPT4gJ+GCqCcsCifitIknID0+ICfhgqknLAon4rSKJyA9PiAn4YKqJywKJ+K0iycgPT4gJ+GCqycsCifitIwnID0+ICfhgqwnLAon4rSNJyA9PiAn4YKtJywKJ+K0jicgPT4gJ+GCricsCifitI8nID0+ICfhgq8nLAon4rSQJyA9PiAn4YKwJywKJ+K0kScgPT4gJ+GCsScsCifitJInID0+ICfhgrInLAon4rSTJyA9PiAn4YKzJywKJ+K0lCcgPT4gJ+GCtCcsCifitJUnID0+ICfhgrUnLAon4rSWJyA9PiAn4YK2JywKJ+K0lycgPT4gJ+GCtycsCifitJgnID0+ICfhgrgnLAon4rSZJyA9PiAn4YK5JywKJ+K0micgPT4gJ+GCuicsCifitJsnID0+ICfhgrsnLAon4rScJyA9PiAn4YK8JywKJ+K0nScgPT4gJ+GCvScsCifitJ4nID0+ICfhgr4nLAon4rSfJyA9PiAn4YK/JywKJ+K0oCcgPT4gJ+GDgCcsCifitKEnID0+ICfhg4EnLAon4rSiJyA9PiAn4YOCJywKJ+K0oycgPT4gJ+GDgycsCifitKQnID0+ICfhg4QnLAon4rSlJyA9PiAn4YOFJywKJ+K0pycgPT4gJ+GDhycsCifitK0nID0+ICfhg40nLAon6pmBJyA9PiAn6pmAJywKJ+qZgycgPT4gJ+qZgicsCifqmYUnID0+ICfqmYQnLAon6pmHJyA9PiAn6pmGJywKJ+qZiScgPT4gJ+qZiCcsCifqmYsnID0+ICfqmYonLAon6pmNJyA9PiAn6pmMJywKJ+qZjycgPT4gJ+qZjicsCifqmZEnID0+ICfqmZAnLAon6pmTJyA9PiAn6pmSJywKJ+qZlScgPT4gJ+qZlCcsCifqmZcnID0+ICfqmZYnLAon6pmZJyA9PiAn6pmYJywKJ+qZmycgPT4gJ+qZmicsCifqmZ0nID0+ICfqmZwnLAon6pmfJyA9PiAn6pmeJywKJ+qZoScgPT4gJ+qZoCcsCifqmaMnID0+ICfqmaInLAon6pmlJyA9PiAn6pmkJywKJ+qZpycgPT4gJ+qZpicsCifqmaknID0+ICfqmagnLAon6pmrJyA9PiAn6pmqJywKJ+qZrScgPT4gJ+qZrCcsCifqmoEnID0+ICfqmoAnLAon6pqDJyA9PiAn6pqCJywKJ+qahScgPT4gJ+qahCcsCifqmocnID0+ICfqmoYnLAon6pqJJyA9PiAn6pqIJywKJ+qaiycgPT4gJ+qaiicsCifqmo0nID0+ICfqmownLAon6pqPJyA9PiAn6pqOJywKJ+qakScgPT4gJ+qakCcsCifqmpMnID0+ICfqmpInLAon6pqVJyA9PiAn6pqUJywKJ+qalycgPT4gJ+qalicsCifqmpknID0+ICfqmpgnLAon6pqbJyA9PiAn6pqaJywKJ+qcoycgPT4gJ+qcoicsCifqnKUnID0+ICfqnKQnLAon6pynJyA9PiAn6pymJywKJ+qcqScgPT4gJ+qcqCcsCifqnKsnID0+ICfqnKonLAon6pytJyA9PiAn6pysJywKJ+qcrycgPT4gJ+qcricsCifqnLMnID0+ICfqnLInLAon6py1JyA9PiAn6py0JywKJ+qctycgPT4gJ+qcticsCifqnLknID0+ICfqnLgnLAon6py7JyA9PiAn6py6JywKJ+qcvScgPT4gJ+qcvCcsCifqnL8nID0+ICfqnL4nLAon6p2BJyA9PiAn6p2AJywKJ+qdgycgPT4gJ+qdgicsCifqnYUnID0+ICfqnYQnLAon6p2HJyA9PiAn6p2GJywKJ+qdiScgPT4gJ+qdiCcsCifqnYsnID0+ICfqnYonLAon6p2NJyA9PiAn6p2MJywKJ+qdjycgPT4gJ+qdjicsCifqnZEnID0+ICfqnZAnLAon6p2TJyA9PiAn6p2SJywKJ+qdlScgPT4gJ+qdlCcsCifqnZcnID0+ICfqnZYnLAon6p2ZJyA9PiAn6p2YJywKJ+qdmycgPT4gJ+qdmicsCifqnZ0nID0+ICfqnZwnLAon6p2fJyA9PiAn6p2eJywKJ+qdoScgPT4gJ+qdoCcsCifqnaMnID0+ICfqnaInLAon6p2lJyA9PiAn6p2kJywKJ+qdpycgPT4gJ+qdpicsCifqnaknID0+ICfqnagnLAon6p2rJyA9PiAn6p2qJywKJ+qdrScgPT4gJ+qdrCcsCifqna8nID0+ICfqna4nLAon6p26JyA9PiAn6p25JywKJ+qdvCcgPT4gJ+qduycsCifqnb8nID0+ICfqnb4nLAon6p6BJyA9PiAn6p6AJywKJ+qegycgPT4gJ+qegicsCifqnoUnID0+ICfqnoQnLAon6p6HJyA9PiAn6p6GJywKJ+qejCcgPT4gJ+qeiycsCifqnpEnID0+ICfqnpAnLAon6p6TJyA9PiAn6p6SJywKJ+qelCcgPT4gJ+qfhCcsCifqnpcnID0+ICfqnpYnLAon6p6ZJyA9PiAn6p6YJywKJ+qemycgPT4gJ+qemicsCifqnp0nID0+ICfqnpwnLAon6p6fJyA9PiAn6p6eJywKJ+qeoScgPT4gJ+qeoCcsCifqnqMnID0+ICfqnqInLAon6p6lJyA9PiAn6p6kJywKJ+qepycgPT4gJ+qepicsCifqnqknID0+ICfqnqgnLAon6p61JyA9PiAn6p60JywKJ+qetycgPT4gJ+qeticsCifqnrknID0+ICfqnrgnLAon6p67JyA9PiAn6p66JywKJ+qevScgPT4gJ+qevCcsCifqnr8nID0+ICfqnr4nLAon6p+DJyA9PiAn6p+CJywKJ+qfiCcgPT4gJ+qfhycsCifqn4onID0+ICfqn4knLAon6p+2JyA9PiAn6p+1JywKJ+qtkycgPT4gJ+qesycsCifqrbAnID0+ICfhjqAnLAon6q2xJyA9PiAn4Y6hJywKJ+qtsicgPT4gJ+GOoicsCifqrbMnID0+ICfhjqMnLAon6q20JyA9PiAn4Y6kJywKJ+qttScgPT4gJ+GOpScsCifqrbYnID0+ICfhjqYnLAon6q23JyA9PiAn4Y6nJywKJ+qtuCcgPT4gJ+GOqCcsCifqrbknID0+ICfhjqknLAon6q26JyA9PiAn4Y6qJywKJ+qtuycgPT4gJ+GOqycsCifqrbwnID0+ICfhjqwnLAon6q29JyA9PiAn4Y6tJywKJ+qtvicgPT4gJ+GOricsCifqrb8nID0+ICfhjq8nLAon6q6AJyA9PiAn4Y6wJywKJ+qugScgPT4gJ+GOsScsCifqroInID0+ICfhjrInLAon6q6DJyA9PiAn4Y6zJywKJ+quhCcgPT4gJ+GOtCcsCifqroUnID0+ICfhjrUnLAon6q6GJyA9PiAn4Y62JywKJ+quhycgPT4gJ+GOtycsCifqrognID0+ICfhjrgnLAon6q6JJyA9PiAn4Y65JywKJ+quiicgPT4gJ+GOuicsCifqrosnID0+ICfhjrsnLAon6q6MJyA9PiAn4Y68JywKJ+qujScgPT4gJ+GOvScsCifqro4nID0+ICfhjr4nLAon6q6PJyA9PiAn4Y6/JywKJ+qukCcgPT4gJ+GPgCcsCifqrpEnID0+ICfhj4EnLAon6q6SJyA9PiAn4Y+CJywKJ+qukycgPT4gJ+GPgycsCifqrpQnID0+ICfhj4QnLAon6q6VJyA9PiAn4Y+FJywKJ+qulicgPT4gJ+GPhicsCifqrpcnID0+ICfhj4cnLAon6q6YJyA9PiAn4Y+IJywKJ+qumScgPT4gJ+GPiScsCifqrponID0+ICfhj4onLAon6q6bJyA9PiAn4Y+LJywKJ+qunCcgPT4gJ+GPjCcsCifqrp0nID0+ICfhj40nLAon6q6eJyA9PiAn4Y+OJywKJ+qunycgPT4gJ+GPjycsCifqrqAnID0+ICfhj5AnLAon6q6hJyA9PiAn4Y+RJywKJ+quoicgPT4gJ+GPkicsCifqrqMnID0+ICfhj5MnLAon6q6kJyA9PiAn4Y+UJywKJ+qupScgPT4gJ+GPlScsCifqrqYnID0+ICfhj5YnLAon6q6nJyA9PiAn4Y+XJywKJ+quqCcgPT4gJ+GPmCcsCifqrqknID0+ICfhj5knLAon6q6qJyA9PiAn4Y+aJywKJ+quqycgPT4gJ+GPmycsCifqrqwnID0+ICfhj5wnLAon6q6tJyA9PiAn4Y+dJywKJ+quricgPT4gJ+GPnicsCifqrq8nID0+ICfhj58nLAon6q6wJyA9PiAn4Y+gJywKJ+qusScgPT4gJ+GPoScsCifqrrInID0+ICfhj6InLAon6q6zJyA9PiAn4Y+jJywKJ+qutCcgPT4gJ+GPpCcsCifqrrUnID0+ICfhj6UnLAon6q62JyA9PiAn4Y+mJywKJ+qutycgPT4gJ+GPpycsCifqrrgnID0+ICfhj6gnLAon6q65JyA9PiAn4Y+pJywKJ+quuicgPT4gJ+GPqicsCifqrrsnID0+ICfhj6snLAon6q68JyA9PiAn4Y+sJywKJ+quvScgPT4gJ+GPrScsCifqrr4nID0+ICfhj64nLAon6q6/JyA9PiAn4Y+vJywKJ++9gScgPT4gJ++8oScsCifvvYInID0+ICfvvKInLAon772DJyA9PiAn77yjJywKJ++9hCcgPT4gJ++8pCcsCifvvYUnID0+ICfvvKUnLAon772GJyA9PiAn77ymJywKJ++9hycgPT4gJ++8pycsCifvvYgnID0+ICfvvKgnLAon772JJyA9PiAn77ypJywKJ++9iicgPT4gJ++8qicsCifvvYsnID0+ICfvvKsnLAon772MJyA9PiAn77ysJywKJ++9jScgPT4gJ++8rScsCifvvY4nID0+ICfvvK4nLAon772PJyA9PiAn77yvJywKJ++9kCcgPT4gJ++8sCcsCifvvZEnID0+ICfvvLEnLAon772SJyA9PiAn77yyJywKJ++9kycgPT4gJ++8sycsCifvvZQnID0+ICfvvLQnLAon772VJyA9PiAn77y1JywKJ++9licgPT4gJ++8ticsCifvvZcnID0+ICfvvLcnLAon772YJyA9PiAn77y4JywKJ++9mScgPT4gJ++8uScsCifvvZonID0+ICfvvLonLAon8JCQqCcgPT4gJ/CQkIAnLAon8JCQqScgPT4gJ/CQkIEnLAon8JCQqicgPT4gJ/CQkIInLAon8JCQqycgPT4gJ/CQkIMnLAon8JCQrCcgPT4gJ/CQkIQnLAon8JCQrScgPT4gJ/CQkIUnLAon8JCQricgPT4gJ/CQkIYnLAon8JCQrycgPT4gJ/CQkIcnLAon8JCQsCcgPT4gJ/CQkIgnLAon8JCQsScgPT4gJ/CQkIknLAon8JCQsicgPT4gJ/CQkIonLAon8JCQsycgPT4gJ/CQkIsnLAon8JCQtCcgPT4gJ/CQkIwnLAon8JCQtScgPT4gJ/CQkI0nLAon8JCQticgPT4gJ/CQkI4nLAon8JCQtycgPT4gJ/CQkI8nLAon8JCQuCcgPT4gJ/CQkJAnLAon8JCQuScgPT4gJ/CQkJEnLAon8JCQuicgPT4gJ/CQkJInLAon8JCQuycgPT4gJ/CQkJMnLAon8JCQvCcgPT4gJ/CQkJQnLAon8JCQvScgPT4gJ/CQkJUnLAon8JCQvicgPT4gJ/CQkJYnLAon8JCQvycgPT4gJ/CQkJcnLAon8JCRgCcgPT4gJ/CQkJgnLAon8JCRgScgPT4gJ/CQkJknLAon8JCRgicgPT4gJ/CQkJonLAon8JCRgycgPT4gJ/CQkJsnLAon8JCRhCcgPT4gJ/CQkJwnLAon8JCRhScgPT4gJ/CQkJ0nLAon8JCRhicgPT4gJ/CQkJ4nLAon8JCRhycgPT4gJ/CQkJ8nLAon8JCRiCcgPT4gJ/CQkKAnLAon8JCRiScgPT4gJ/CQkKEnLAon8JCRiicgPT4gJ/CQkKInLAon8JCRiycgPT4gJ/CQkKMnLAon8JCRjCcgPT4gJ/CQkKQnLAon8JCRjScgPT4gJ/CQkKUnLAon8JCRjicgPT4gJ/CQkKYnLAon8JCRjycgPT4gJ/CQkKcnLAon8JCTmCcgPT4gJ/CQkrAnLAon8JCTmScgPT4gJ/CQkrEnLAon8JCTmicgPT4gJ/CQkrInLAon8JCTmycgPT4gJ/CQkrMnLAon8JCTnCcgPT4gJ/CQkrQnLAon8JCTnScgPT4gJ/CQkrUnLAon8JCTnicgPT4gJ/CQkrYnLAon8JCTnycgPT4gJ/CQkrcnLAon8JCToCcgPT4gJ/CQkrgnLAon8JCToScgPT4gJ/CQkrknLAon8JCToicgPT4gJ/CQkronLAon8JCToycgPT4gJ/CQkrsnLAon8JCTpCcgPT4gJ/CQkrwnLAon8JCTpScgPT4gJ/CQkr0nLAon8JCTpicgPT4gJ/CQkr4nLAon8JCTpycgPT4gJ/CQkr8nLAon8JCTqCcgPT4gJ/CQk4AnLAon8JCTqScgPT4gJ/CQk4EnLAon8JCTqicgPT4gJ/CQk4InLAon8JCTqycgPT4gJ/CQk4MnLAon8JCTrCcgPT4gJ/CQk4QnLAon8JCTrScgPT4gJ/CQk4UnLAon8JCTricgPT4gJ/CQk4YnLAon8JCTrycgPT4gJ/CQk4cnLAon8JCTsCcgPT4gJ/CQk4gnLAon8JCTsScgPT4gJ/CQk4knLAon8JCTsicgPT4gJ/CQk4onLAon8JCTsycgPT4gJ/CQk4snLAon8JCTtCcgPT4gJ/CQk4wnLAon8JCTtScgPT4gJ/CQk40nLAon8JCTticgPT4gJ/CQk44nLAon8JCTtycgPT4gJ/CQk48nLAon8JCTuCcgPT4gJ/CQk5AnLAon8JCTuScgPT4gJ/CQk5EnLAon8JCTuicgPT4gJ/CQk5InLAon8JCTuycgPT4gJ/CQk5MnLAon8JCzgCcgPT4gJ/CQsoAnLAon8JCzgScgPT4gJ/CQsoEnLAon8JCzgicgPT4gJ/CQsoInLAon8JCzgycgPT4gJ/CQsoMnLAon8JCzhCcgPT4gJ/CQsoQnLAon8JCzhScgPT4gJ/CQsoUnLAon8JCzhicgPT4gJ/CQsoYnLAon8JCzhycgPT4gJ/CQsocnLAon8JCziCcgPT4gJ/CQsognLAon8JCziScgPT4gJ/CQsoknLAon8JCziicgPT4gJ/CQsoonLAon8JCziycgPT4gJ/CQsosnLAon8JCzjCcgPT4gJ/CQsownLAon8JCzjScgPT4gJ/CQso0nLAon8JCzjicgPT4gJ/CQso4nLAon8JCzjycgPT4gJ/CQso8nLAon8JCzkCcgPT4gJ/CQspAnLAon8JCzkScgPT4gJ/CQspEnLAon8JCzkicgPT4gJ/CQspInLAon8JCzkycgPT4gJ/CQspMnLAon8JCzlCcgPT4gJ/CQspQnLAon8JCzlScgPT4gJ/CQspUnLAon8JCzlicgPT4gJ/CQspYnLAon8JCzlycgPT4gJ/CQspcnLAon8JCzmCcgPT4gJ/CQspgnLAon8JCzmScgPT4gJ/CQspknLAon8JCzmicgPT4gJ/CQsponLAon8JCzmycgPT4gJ/CQspsnLAon8JCznCcgPT4gJ/CQspwnLAon8JCznScgPT4gJ/CQsp0nLAon8JCznicgPT4gJ/CQsp4nLAon8JCznycgPT4gJ/CQsp8nLAon8JCzoCcgPT4gJ/CQsqAnLAon8JCzoScgPT4gJ/CQsqEnLAon8JCzoicgPT4gJ/CQsqInLAon8JCzoycgPT4gJ/CQsqMnLAon8JCzpCcgPT4gJ/CQsqQnLAon8JCzpScgPT4gJ/CQsqUnLAon8JCzpicgPT4gJ/CQsqYnLAon8JCzpycgPT4gJ/CQsqcnLAon8JCzqCcgPT4gJ/CQsqgnLAon8JCzqScgPT4gJ/CQsqknLAon8JCzqicgPT4gJ/CQsqonLAon8JCzqycgPT4gJ/CQsqsnLAon8JCzrCcgPT4gJ/CQsqwnLAon8JCzrScgPT4gJ/CQsq0nLAon8JCzricgPT4gJ/CQsq4nLAon8JCzrycgPT4gJ/CQsq8nLAon8JCzsCcgPT4gJ/CQsrAnLAon8JCzsScgPT4gJ/CQsrEnLAon8JCzsicgPT4gJ/CQsrInLAon8JGjgCcgPT4gJ/CRoqAnLAon8JGjgScgPT4gJ/CRoqEnLAon8JGjgicgPT4gJ/CRoqInLAon8JGjgycgPT4gJ/CRoqMnLAon8JGjhCcgPT4gJ/CRoqQnLAon8JGjhScgPT4gJ/CRoqUnLAon8JGjhicgPT4gJ/CRoqYnLAon8JGjhycgPT4gJ/CRoqcnLAon8JGjiCcgPT4gJ/CRoqgnLAon8JGjiScgPT4gJ/CRoqknLAon8JGjiicgPT4gJ/CRoqonLAon8JGjiycgPT4gJ/CRoqsnLAon8JGjjCcgPT4gJ/CRoqwnLAon8JGjjScgPT4gJ/CRoq0nLAon8JGjjicgPT4gJ/CRoq4nLAon8JGjjycgPT4gJ/CRoq8nLAon8JGjkCcgPT4gJ/CRorAnLAon8JGjkScgPT4gJ/CRorEnLAon8JGjkicgPT4gJ/CRorInLAon8JGjkycgPT4gJ/CRorMnLAon8JGjlCcgPT4gJ/CRorQnLAon8JGjlScgPT4gJ/CRorUnLAon8JGjlicgPT4gJ/CRorYnLAon8JGjlycgPT4gJ/CRorcnLAon8JGjmCcgPT4gJ/CRorgnLAon8JGjmScgPT4gJ/CRorknLAon8JGjmicgPT4gJ/CRoronLAon8JGjmycgPT4gJ/CRorsnLAon8JGjnCcgPT4gJ/CRorwnLAon8JGjnScgPT4gJ/CRor0nLAon8JGjnicgPT4gJ/CRor4nLAon8JGjnycgPT4gJ/CRor8nLAon8Ja5oCcgPT4gJ/CWuYAnLAon8Ja5oScgPT4gJ/CWuYEnLAon8Ja5oicgPT4gJ/CWuYInLAon8Ja5oycgPT4gJ/CWuYMnLAon8Ja5pCcgPT4gJ/CWuYQnLAon8Ja5pScgPT4gJ/CWuYUnLAon8Ja5picgPT4gJ/CWuYYnLAon8Ja5pycgPT4gJ/CWuYcnLAon8Ja5qCcgPT4gJ/CWuYgnLAon8Ja5qScgPT4gJ/CWuYknLAon8Ja5qicgPT4gJ/CWuYonLAon8Ja5qycgPT4gJ/CWuYsnLAon8Ja5rCcgPT4gJ/CWuYwnLAon8Ja5rScgPT4gJ/CWuY0nLAon8Ja5ricgPT4gJ/CWuY4nLAon8Ja5rycgPT4gJ/CWuY8nLAon8Ja5sCcgPT4gJ/CWuZAnLAon8Ja5sScgPT4gJ/CWuZEnLAon8Ja5sicgPT4gJ/CWuZInLAon8Ja5sycgPT4gJ/CWuZMnLAon8Ja5tCcgPT4gJ/CWuZQnLAon8Ja5tScgPT4gJ/CWuZUnLAon8Ja5ticgPT4gJ/CWuZYnLAon8Ja5tycgPT4gJ/CWuZcnLAon8Ja5uCcgPT4gJ/CWuZgnLAon8Ja5uScgPT4gJ/CWuZknLAon8Ja5uicgPT4gJ/CWuZonLAon8Ja5uycgPT4gJ/CWuZsnLAon8Ja5vCcgPT4gJ/CWuZwnLAon8Ja5vScgPT4gJ/CWuZ0nLAon8Ja5vicgPT4gJ/CWuZ4nLAon8Ja5vycgPT4gJ/CWuZ8nLAon8J6koicgPT4gJ/CepIAnLAon8J6koycgPT4gJ/CepIEnLAon8J6kpCcgPT4gJ/CepIInLAon8J6kpScgPT4gJ/CepIMnLAon8J6kpicgPT4gJ/CepIQnLAon8J6kpycgPT4gJ/CepIUnLAon8J6kqCcgPT4gJ/CepIYnLAon8J6kqScgPT4gJ/CepIcnLAon8J6kqicgPT4gJ/CepIgnLAon8J6kqycgPT4gJ/CepIknLAon8J6krCcgPT4gJ/CepIonLAon8J6krScgPT4gJ/CepIsnLAon8J6kricgPT4gJ/CepIwnLAon8J6krycgPT4gJ/CepI0nLAon8J6ksCcgPT4gJ/CepI4nLAon8J6ksScgPT4gJ/CepI8nLAon8J6ksicgPT4gJ/CepJAnLAon8J6ksycgPT4gJ/CepJEnLAon8J6ktCcgPT4gJ/CepJInLAon8J6ktScgPT4gJ/CepJMnLAon8J6kticgPT4gJ/CepJQnLAon8J6ktycgPT4gJ/CepJUnLAon8J6kuCcgPT4gJ/CepJYnLAon8J6kuScgPT4gJ/CepJcnLAon8J6kuicgPT4gJ/CepJgnLAon8J6kuycgPT4gJ/CepJknLAon8J6kvCcgPT4gJ/CepJonLAon8J6kvScgPT4gJ/CepJsnLAon8J6kvicgPT4gJ/CepJwnLAon8J6kvycgPT4gJ/CepJ0nLAon8J6lgCcgPT4gJ/CepJ4nLAon8J6lgScgPT4gJ/CepJ8nLAon8J6lgicgPT4gJ/CepKAnLAon8J6lgycgPT4gJ/CepKEnLAonw58nID0+ICdTUycsCifvrIAnID0+ICdGRicsCifvrIEnID0+ICdGSScsCifvrIInID0+ICdGTCcsCifvrIMnID0+ICdGRkknLAon76yEJyA9PiAnRkZMJywKJ++shScgPT4gJ1NUJywKJ++shicgPT4gJ1NUJywKJ9aHJyA9PiAn1LXVkicsCifvrJMnID0+ICfVhNWGJywKJ++slCcgPT4gJ9WE1LUnLAon76yVJyA9PiAn1YTUuycsCifvrJYnID0+ICfVjtWGJywKJ++slycgPT4gJ9WE1L0nLAonxYknID0+ICfKvE4nLAonzpAnID0+ICfOmcyIzIEnLAonzrAnID0+ICfOpcyIzIEnLAonx7AnID0+ICdKzIwnLAon4bqWJyA9PiAnSMyxJywKJ+G6lycgPT4gJ1TMiCcsCifhupgnID0+ICdXzIonLAon4bqZJyA9PiAnWcyKJywKJ+G6micgPT4gJ0HKvicsCifhvZAnID0+ICfOpcyTJywKJ+G9kicgPT4gJ86lzJPMgCcsCifhvZQnID0+ICfOpcyTzIEnLAon4b2WJyA9PiAnzqXMk82CJywKJ+G+ticgPT4gJ86RzYInLAon4b+GJyA9PiAnzpfNgicsCifhv5InID0+ICfOmcyIzIAnLAon4b+TJyA9PiAnzpnMiMyBJywKJ+G/licgPT4gJ86ZzYInLAon4b+XJyA9PiAnzpnMiM2CJywKJ+G/oicgPT4gJ86lzIjMgCcsCifhv6MnID0+ICfOpcyIzIEnLAon4b+kJyA9PiAnzqHMkycsCifhv6YnID0+ICfOpc2CJywKJ+G/pycgPT4gJ86lzIjNgicsCifhv7YnID0+ICfOqc2CJywKJ+G+iCcgPT4gJ+G8iM6ZJywKJ+G+iScgPT4gJ+G8ic6ZJywKJ+G+iicgPT4gJ+G8is6ZJywKJ+G+iycgPT4gJ+G8i86ZJywKJ+G+jCcgPT4gJ+G8jM6ZJywKJ+G+jScgPT4gJ+G8jc6ZJywKJ+G+jicgPT4gJ+G8js6ZJywKJ+G+jycgPT4gJ+G8j86ZJywKJ+G+mCcgPT4gJ+G8qM6ZJywKJ+G+mScgPT4gJ+G8qc6ZJywKJ+G+micgPT4gJ+G8qs6ZJywKJ+G+mycgPT4gJ+G8q86ZJywKJ+G+nCcgPT4gJ+G8rM6ZJywKJ+G+nScgPT4gJ+G8rc6ZJywKJ+G+nicgPT4gJ+G8rs6ZJywKJ+G+nycgPT4gJ+G8r86ZJywKJ+G+qCcgPT4gJ+G9qM6ZJywKJ+G+qScgPT4gJ+G9qc6ZJywKJ+G+qicgPT4gJ+G9qs6ZJywKJ+G+qycgPT4gJ+G9q86ZJywKJ+G+rCcgPT4gJ+G9rM6ZJywKJ+G+rScgPT4gJ+G9rc6ZJywKJ+G+ricgPT4gJ+G9rs6ZJywKJ+G+rycgPT4gJ+G9r86ZJywKJ+G+vCcgPT4gJ86RzpknLAon4b+MJyA9PiAnzpfOmScsCifhv7wnID0+ICfOqc6ZJywKJ+G+sicgPT4gJ+G+us6ZJywKJ+G+tCcgPT4gJ86GzpknLAon4b+CJyA9PiAn4b+KzpknLAon4b+EJyA9PiAnzonOmScsCifhv7InID0+ICfhv7rOmScsCifhv7QnID0+ICfOj86ZJywKJ+G+tycgPT4gJ86RzYLOmScsCifhv4cnID0+ICfOl82CzpknLAon4b+3JyA9PiAnzqnNgs6ZJywKKTsKPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXE1ic3RyaW5nIGFzIHA7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwKSB7CnJldHVybiByZXF1aXJlIF9fRElSX18uJy9ib290c3RyYXA4MC5waHAnOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpKSB7CmZ1bmN0aW9uIG1iX2NvbnZlcnRfZW5jb2RpbmcoJHN0cmluZywgJHRvX2VuY29kaW5nLCAkZnJvbV9lbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NvbnZlcnRfZW5jb2RpbmcoJHN0cmluZywgJHRvX2VuY29kaW5nLCAkZnJvbV9lbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZGVjb2RlX21pbWVoZWFkZXInKSkgewpmdW5jdGlvbiBtYl9kZWNvZGVfbWltZWhlYWRlcigkc3RyaW5nKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZWNvZGVfbWltZWhlYWRlcigkc3RyaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9lbmNvZGVfbWltZWhlYWRlcicpKSB7CmZ1bmN0aW9uIG1iX2VuY29kZV9taW1laGVhZGVyKCRzdHJpbmcsICRjaGFyc2V0ID0gbnVsbCwgJHRyYW5zZmVyX2VuY29kaW5nID0gbnVsbCwgJG5ld2xpbmUgPSAiXHJcbiIsICRpbmRlbnQgPSAwKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9lbmNvZGVfbWltZWhlYWRlcigkc3RyaW5nLCAkY2hhcnNldCwgJHRyYW5zZmVyX2VuY29kaW5nLCAkbmV3bGluZSwgJGluZGVudCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZGVjb2RlX251bWVyaWNlbnRpdHknKSkgewpmdW5jdGlvbiBtYl9kZWNvZGVfbnVtZXJpY2VudGl0eSgkc3RyaW5nLCAkbWFwLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZWNvZGVfbnVtZXJpY2VudGl0eSgkc3RyaW5nLCAkbWFwLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2VuY29kZV9udW1lcmljZW50aXR5JykpIHsKZnVuY3Rpb24gbWJfZW5jb2RlX251bWVyaWNlbnRpdHkoJHN0cmluZywgJG1hcCwgJGVuY29kaW5nID0gbnVsbCwgJGhleCA9IGZhbHNlKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9lbmNvZGVfbnVtZXJpY2VudGl0eSgkc3RyaW5nLCAkbWFwLCAkZW5jb2RpbmcsICRoZXgpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfY2FzZScpKSB7CmZ1bmN0aW9uIG1iX2NvbnZlcnRfY2FzZSgkc3RyaW5nLCAkbW9kZSwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY29udmVydF9jYXNlKCRzdHJpbmcsICRtb2RlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2ludGVybmFsX2VuY29kaW5nJykpIHsKZnVuY3Rpb24gbWJfaW50ZXJuYWxfZW5jb2RpbmcoJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfaW50ZXJuYWxfZW5jb2RpbmcoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9sYW5ndWFnZScpKSB7CmZ1bmN0aW9uIG1iX2xhbmd1YWdlKCRsYW5ndWFnZSA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2xhbmd1YWdlKCRsYW5ndWFnZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfbGlzdF9lbmNvZGluZ3MnKSkgewpmdW5jdGlvbiBtYl9saXN0X2VuY29kaW5ncygpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2xpc3RfZW5jb2RpbmdzKCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZW5jb2RpbmdfYWxpYXNlcycpKSB7CmZ1bmN0aW9uIG1iX2VuY29kaW5nX2FsaWFzZXMoJGVuY29kaW5nKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9lbmNvZGluZ19hbGlhc2VzKCRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY2hlY2tfZW5jb2RpbmcnKSkgewpmdW5jdGlvbiBtYl9jaGVja19lbmNvZGluZygkdmFsdWUgPSBudWxsLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jaGVja19lbmNvZGluZygkdmFsdWUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZGV0ZWN0X2VuY29kaW5nJykpIHsKZnVuY3Rpb24gbWJfZGV0ZWN0X2VuY29kaW5nKCRzdHJpbmcsICRlbmNvZGluZ3MgPSBudWxsLCAkc3RyaWN0ID0gZmFsc2UpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2RldGVjdF9lbmNvZGluZygkc3RyaW5nLCAkZW5jb2RpbmdzLCAkc3RyaWN0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZXRlY3Rfb3JkZXInKSkgewpmdW5jdGlvbiBtYl9kZXRlY3Rfb3JkZXIoJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZGV0ZWN0X29yZGVyKCRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfcGFyc2Vfc3RyJykpIHsKZnVuY3Rpb24gbWJfcGFyc2Vfc3RyKCRzdHJpbmcsICYkcmVzdWx0ID0gW10pIHsgcGFyc2Vfc3RyKCRzdHJpbmcsICRyZXN1bHQpOyByZXR1cm4gKGJvb2wpICRyZXN1bHQ7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykpIHsKZnVuY3Rpb24gbWJfc3RybGVuKCRzdHJpbmcsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cmxlbigkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0LCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnRvbG93ZXInKSkgewpmdW5jdGlvbiBtYl9zdHJ0b2xvd2VyKCRzdHJpbmcsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnRvbG93ZXIoJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b3VwcGVyJykpIHsKZnVuY3Rpb24gbWJfc3RydG91cHBlcigkc3RyaW5nLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJ0b3VwcGVyKCRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RpdHV0ZV9jaGFyYWN0ZXInKSkgewpmdW5jdGlvbiBtYl9zdWJzdGl0dXRlX2NoYXJhY3Rlcigkc3Vic3RpdHV0ZV9jaGFyYWN0ZXIgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdWJzdGl0dXRlX2NoYXJhY3Rlcigkc3Vic3RpdHV0ZV9jaGFyYWN0ZXIpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N1YnN0cicpKSB7CmZ1bmN0aW9uIG1iX3N1YnN0cigkc3RyaW5nLCAkc3RhcnQsICRsZW5ndGggPSAyMTQ3NDgzNjQ3LCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdWJzdHIoJHN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cmlwb3MnKSkgewpmdW5jdGlvbiBtYl9zdHJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDAsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0LCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cmlzdHInKSkgewpmdW5jdGlvbiBtYl9zdHJpc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUgPSBmYWxzZSwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyaXN0cigkaGF5c3RhY2ssICRuZWVkbGUsICRiZWZvcmVfbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnJjaHInKSkgewpmdW5jdGlvbiBtYl9zdHJyY2hyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUgPSBmYWxzZSwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RycmNocigkaGF5c3RhY2ssICRuZWVkbGUsICRiZWZvcmVfbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnJpY2hyJykpIHsKZnVuY3Rpb24gbWJfc3RycmljaHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJyaWNocigkaGF5c3RhY2ssICRuZWVkbGUsICRiZWZvcmVfbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnJpcG9zJykpIHsKZnVuY3Rpb24gbWJfc3Rycmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Rycmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0LCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnJwb3MnKSkgewpmdW5jdGlvbiBtYl9zdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDAsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0LCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnN0cicpKSB7CmZ1bmN0aW9uIG1iX3N0cnN0cigkaGF5c3RhY2ssICRuZWVkbGUsICRiZWZvcmVfbmVlZGxlID0gZmFsc2UsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnN0cigkaGF5c3RhY2ssICRuZWVkbGUsICRiZWZvcmVfbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2dldF9pbmZvJykpIHsKZnVuY3Rpb24gbWJfZ2V0X2luZm8oJHR5cGUgPSAnYWxsJykgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZ2V0X2luZm8oJHR5cGUpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2h0dHBfb3V0cHV0JykpIHsKZnVuY3Rpb24gbWJfaHR0cF9vdXRwdXQoJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfaHR0cF9vdXRwdXQoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ3aWR0aCcpKSB7CmZ1bmN0aW9uIG1iX3N0cndpZHRoKCRzdHJpbmcsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cndpZHRoKCRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyX2NvdW50JykpIHsKZnVuY3Rpb24gbWJfc3Vic3RyX2NvdW50KCRoYXlzdGFjaywgJG5lZWRsZSwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Vic3RyX2NvdW50KCRoYXlzdGFjaywgJG5lZWRsZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9vdXRwdXRfaGFuZGxlcicpKSB7CmZ1bmN0aW9uIG1iX291dHB1dF9oYW5kbGVyKCRzdHJpbmcsICRzdGF0dXMpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX291dHB1dF9oYW5kbGVyKCRzdHJpbmcsICRzdGF0dXMpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2h0dHBfaW5wdXQnKSkgewpmdW5jdGlvbiBtYl9odHRwX2lucHV0KCR0eXBlID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfaHR0cF9pbnB1dCgkdHlwZSk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfdmFyaWFibGVzJykpIHsKZnVuY3Rpb24gbWJfY29udmVydF92YXJpYWJsZXMoJHRvX2VuY29kaW5nLCAkZnJvbV9lbmNvZGluZywgJi4uLiR2YXJzKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jb252ZXJ0X3ZhcmlhYmxlcygkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nLCAuLi4kdmFycyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX29yZCcpKSB7CmZ1bmN0aW9uIG1iX29yZCgkc3RyaW5nLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9vcmQoJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jaHInKSkgewpmdW5jdGlvbiBtYl9jaHIoJGNvZGVwb2ludCwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY2hyKCRjb2RlcG9pbnQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc2NydWInKSkgewpmdW5jdGlvbiBtYl9zY3J1Yigkc3RyaW5nLCAkZW5jb2RpbmcgPSBudWxsKSB7ICRlbmNvZGluZyA9IG51bGwgPT09ICRlbmNvZGluZyA/IG1iX2ludGVybmFsX2VuY29kaW5nKCkgOiAkZW5jb2Rpbmc7IHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKCRzdHJpbmcsICRlbmNvZGluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJfc3BsaXQnKSkgewpmdW5jdGlvbiBtYl9zdHJfc3BsaXQoJHN0cmluZywgJGxlbmd0aCA9IDEsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cl9zcGxpdCgkc3RyaW5nLCAkbGVuZ3RoLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJfcGFkJykpIHsKZnVuY3Rpb24gbWJfc3RyX3BhZChzdHJpbmcgJHN0cmluZywgaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkX3N0cmluZyA9ICcgJywgaW50ICRwYWRfdHlwZSA9IFNUUl9QQURfUklHSFQsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJfcGFkKCRzdHJpbmcsICRsZW5ndGgsICRwYWRfc3RyaW5nLCAkcGFkX3R5cGUsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3VjZmlyc3QnKSkgewpmdW5jdGlvbiBtYl91Y2ZpcnN0KHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfdWNmaXJzdCgkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9sY2ZpcnN0JykpIHsKZnVuY3Rpb24gbWJfbGNmaXJzdChzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2xjZmlyc3QoJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfdHJpbScpKSB7CmZ1bmN0aW9uIG1iX3RyaW0oc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGNoYXJhY3RlcnMgPSBudWxsLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfdHJpbSgkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfbHRyaW0nKSkgewpmdW5jdGlvbiBtYl9sdHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9sdHJpbSgkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfcnRyaW0nKSkgewpmdW5jdGlvbiBtYl9ydHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9ydHJpbSgkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nKTsgfQp9CgoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ21ic3RyaW5nJykpIHsKcmV0dXJuOwp9CgppZiAoIWRlZmluZWQoJ01CX0NBU0VfVVBQRVInKSkgewpkZWZpbmUoJ01CX0NBU0VfVVBQRVInLCAwKTsKfQppZiAoIWRlZmluZWQoJ01CX0NBU0VfTE9XRVInKSkgewpkZWZpbmUoJ01CX0NBU0VfTE9XRVInLCAxKTsKfQppZiAoIWRlZmluZWQoJ01CX0NBU0VfVElUTEUnKSkgewpkZWZpbmUoJ01CX0NBU0VfVElUTEUnLCAyKTsKfQo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcTWJzdHJpbmcgYXMgcDsKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2VuY29kaW5nJykpIHsKZnVuY3Rpb24gbWJfY29udmVydF9lbmNvZGluZyhhcnJheXxzdHJpbmd8bnVsbCAkc3RyaW5nLCA/c3RyaW5nICR0b19lbmNvZGluZywgYXJyYXl8c3RyaW5nfG51bGwgJGZyb21fZW5jb2RpbmcgPSBudWxsKTogYXJyYXl8c3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NvbnZlcnRfZW5jb2RpbmcoJHN0cmluZyA/PyAnJywgKHN0cmluZykgJHRvX2VuY29kaW5nLCAkZnJvbV9lbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZGVjb2RlX21pbWVoZWFkZXInKSkgewpmdW5jdGlvbiBtYl9kZWNvZGVfbWltZWhlYWRlcig/c3RyaW5nICRzdHJpbmcpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZGVjb2RlX21pbWVoZWFkZXIoKHN0cmluZykgJHN0cmluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZW5jb2RlX21pbWVoZWFkZXInKSkgewpmdW5jdGlvbiBtYl9lbmNvZGVfbWltZWhlYWRlcig/c3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGNoYXJzZXQgPSBudWxsLCA/c3RyaW5nICR0cmFuc2Zlcl9lbmNvZGluZyA9IG51bGwsID9zdHJpbmcgJG5ld2xpbmUgPSAiXHJcbiIsID9pbnQgJGluZGVudCA9IDApOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZW5jb2RlX21pbWVoZWFkZXIoKHN0cmluZykgJHN0cmluZywgJGNoYXJzZXQsICR0cmFuc2Zlcl9lbmNvZGluZywgKHN0cmluZykgJG5ld2xpbmUsIChpbnQpICRpbmRlbnQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2RlY29kZV9udW1lcmljZW50aXR5JykpIHsKZnVuY3Rpb24gbWJfZGVjb2RlX251bWVyaWNlbnRpdHkoP3N0cmluZyAkc3RyaW5nLCBhcnJheSAkbWFwLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZGVjb2RlX251bWVyaWNlbnRpdHkoKHN0cmluZykgJHN0cmluZywgJG1hcCwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9lbmNvZGVfbnVtZXJpY2VudGl0eScpKSB7CmZ1bmN0aW9uIG1iX2VuY29kZV9udW1lcmljZW50aXR5KD9zdHJpbmcgJHN0cmluZywgYXJyYXkgJG1hcCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsLCA/Ym9vbCAkaGV4ID0gZmFsc2UpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZW5jb2RlX251bWVyaWNlbnRpdHkoKHN0cmluZykgJHN0cmluZywgJG1hcCwgJGVuY29kaW5nLCAoYm9vbCkgJGhleCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9jYXNlJykpIHsKZnVuY3Rpb24gbWJfY29udmVydF9jYXNlKD9zdHJpbmcgJHN0cmluZywgP2ludCAkbW9kZSwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NvbnZlcnRfY2FzZSgoc3RyaW5nKSAkc3RyaW5nLCAoaW50KSAkbW9kZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9pbnRlcm5hbF9lbmNvZGluZycpKSB7CmZ1bmN0aW9uIG1iX2ludGVybmFsX2VuY29kaW5nKD9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZ3xib29sIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2ludGVybmFsX2VuY29kaW5nKCRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfbGFuZ3VhZ2UnKSkgewpmdW5jdGlvbiBtYl9sYW5ndWFnZSg/c3RyaW5nICRsYW5ndWFnZSA9IG51bGwpOiBzdHJpbmd8Ym9vbCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9sYW5ndWFnZSgkbGFuZ3VhZ2UpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2xpc3RfZW5jb2RpbmdzJykpIHsKZnVuY3Rpb24gbWJfbGlzdF9lbmNvZGluZ3MoKTogYXJyYXkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbGlzdF9lbmNvZGluZ3MoKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9lbmNvZGluZ19hbGlhc2VzJykpIHsKZnVuY3Rpb24gbWJfZW5jb2RpbmdfYWxpYXNlcyg/c3RyaW5nICRlbmNvZGluZyk6IGFycmF5IHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2VuY29kaW5nX2FsaWFzZXMoKHN0cmluZykgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jaGVja19lbmNvZGluZycpKSB7CmZ1bmN0aW9uIG1iX2NoZWNrX2VuY29kaW5nKGFycmF5fHN0cmluZ3xudWxsICR2YWx1ZSA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGJvb2wgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY2hlY2tfZW5jb2RpbmcoJHZhbHVlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2RldGVjdF9lbmNvZGluZycpKSB7CmZ1bmN0aW9uIG1iX2RldGVjdF9lbmNvZGluZyg/c3RyaW5nICRzdHJpbmcsIGFycmF5fHN0cmluZ3xudWxsICRlbmNvZGluZ3MgPSBudWxsLCA/Ym9vbCAkc3RyaWN0ID0gZmFsc2UpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZGV0ZWN0X2VuY29kaW5nKChzdHJpbmcpICRzdHJpbmcsICRlbmNvZGluZ3MsIChib29sKSAkc3RyaWN0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZXRlY3Rfb3JkZXInKSkgewpmdW5jdGlvbiBtYl9kZXRlY3Rfb3JkZXIoYXJyYXl8c3RyaW5nfG51bGwgJGVuY29kaW5nID0gbnVsbCk6IGFycmF5fGJvb2wgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZGV0ZWN0X29yZGVyKCRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfcGFyc2Vfc3RyJykpIHsKZnVuY3Rpb24gbWJfcGFyc2Vfc3RyKD9zdHJpbmcgJHN0cmluZywgJiRyZXN1bHQgPSBbXSk6IGJvb2wgeyBwYXJzZV9zdHIoKHN0cmluZykgJHN0cmluZywgJHJlc3VsdCk7IHJldHVybiAoYm9vbCkgJHJlc3VsdDsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSkgewpmdW5jdGlvbiBtYl9zdHJsZW4oP3N0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBpbnQgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RybGVuKChzdHJpbmcpICRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycG9zJykpIHsKZnVuY3Rpb24gbWJfc3RycG9zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9pbnQgJG9mZnNldCA9IDAsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGludHxmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJwb3MoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoaW50KSAkb2Zmc2V0LCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnRvbG93ZXInKSkgewpmdW5jdGlvbiBtYl9zdHJ0b2xvd2VyKD9zdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnRvbG93ZXIoKHN0cmluZykgJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b3VwcGVyJykpIHsKZnVuY3Rpb24gbWJfc3RydG91cHBlcig/c3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJ0b3VwcGVyKChzdHJpbmcpICRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RpdHV0ZV9jaGFyYWN0ZXInKSkgewpmdW5jdGlvbiBtYl9zdWJzdGl0dXRlX2NoYXJhY3RlcihzdHJpbmd8aW50fG51bGwgJHN1YnN0aXR1dGVfY2hhcmFjdGVyID0gbnVsbCk6IHN0cmluZ3xpbnR8Ym9vbCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdWJzdGl0dXRlX2NoYXJhY3Rlcigkc3Vic3RpdHV0ZV9jaGFyYWN0ZXIpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N1YnN0cicpKSB7CmZ1bmN0aW9uIG1iX3N1YnN0cig/c3RyaW5nICRzdHJpbmcsID9pbnQgJHN0YXJ0LCA/aW50ICRsZW5ndGggPSBudWxsLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Vic3RyKChzdHJpbmcpICRzdHJpbmcsIChpbnQpICRzdGFydCwgJGxlbmd0aCwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJpcG9zJykpIHsKZnVuY3Rpb24gbWJfc3RyaXBvcyg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/aW50ICRvZmZzZXQgPSAwLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBpbnR8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyaXBvcygoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChpbnQpICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyaXN0cicpKSB7CmZ1bmN0aW9uIG1iX3N0cmlzdHIoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2Jvb2wgJGJlZm9yZV9uZWVkbGUgPSBmYWxzZSwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cmlzdHIoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoYm9vbCkgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycmNocicpKSB7CmZ1bmN0aW9uIG1iX3N0cnJjaHIoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2Jvb2wgJGJlZm9yZV9uZWVkbGUgPSBmYWxzZSwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnJjaHIoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoYm9vbCkgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycmljaHInKSkgewpmdW5jdGlvbiBtYl9zdHJyaWNocig/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/Ym9vbCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RycmljaHIoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoYm9vbCkgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Rycmlwb3MnKSkgewpmdW5jdGlvbiBtYl9zdHJyaXBvcyg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/aW50ICRvZmZzZXQgPSAwLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBpbnR8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Rycmlwb3MoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoaW50KSAkb2Zmc2V0LCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnJwb3MnKSkgewpmdW5jdGlvbiBtYl9zdHJycG9zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9pbnQgJG9mZnNldCA9IDAsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGludHxmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJycG9zKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGludCkgJG9mZnNldCwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJzdHInKSkgewpmdW5jdGlvbiBtYl9zdHJzdHIoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2Jvb2wgJGJlZm9yZV9uZWVkbGUgPSBmYWxzZSwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnN0cigoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChib29sKSAkYmVmb3JlX25lZWRsZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9nZXRfaW5mbycpKSB7CmZ1bmN0aW9uIG1iX2dldF9pbmZvKD9zdHJpbmcgJHR5cGUgPSAnYWxsJyk6IGFycmF5fHN0cmluZ3xpbnR8ZmFsc2V8bnVsbCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9nZXRfaW5mbygoc3RyaW5nKSAkdHlwZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaHR0cF9vdXRwdXQnKSkgewpmdW5jdGlvbiBtYl9odHRwX291dHB1dCg/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmd8Ym9vbCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9odHRwX291dHB1dCgkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cndpZHRoJykpIHsKZnVuY3Rpb24gbWJfc3Ryd2lkdGgoP3N0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBpbnQgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Ryd2lkdGgoKHN0cmluZykgJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHJfY291bnQnKSkgewpmdW5jdGlvbiBtYl9zdWJzdHJfY291bnQoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogaW50IHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N1YnN0cl9jb3VudCgoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfb3V0cHV0X2hhbmRsZXInKSkgewpmdW5jdGlvbiBtYl9vdXRwdXRfaGFuZGxlcig/c3RyaW5nICRzdHJpbmcsID9pbnQgJHN0YXR1cyk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9vdXRwdXRfaGFuZGxlcigoc3RyaW5nKSAkc3RyaW5nLCAoaW50KSAkc3RhdHVzKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9odHRwX2lucHV0JykpIHsKZnVuY3Rpb24gbWJfaHR0cF9pbnB1dCg/c3RyaW5nICR0eXBlID0gbnVsbCk6IGFycmF5fHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9odHRwX2lucHV0KCR0eXBlKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF92YXJpYWJsZXMnKSkgewpmdW5jdGlvbiBtYl9jb252ZXJ0X3ZhcmlhYmxlcyg/c3RyaW5nICR0b19lbmNvZGluZywgYXJyYXl8c3RyaW5nfG51bGwgJGZyb21fZW5jb2RpbmcsIG1peGVkICYkdmFyLCBtaXhlZCAmLi4uJHZhcnMpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY29udmVydF92YXJpYWJsZXMoKHN0cmluZykgJHRvX2VuY29kaW5nLCAkZnJvbV9lbmNvZGluZyA/PyAnJywgJHZhciwgLi4uJHZhcnMpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9vcmQnKSkgewpmdW5jdGlvbiBtYl9vcmQoP3N0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBpbnR8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfb3JkKChzdHJpbmcpICRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY2hyJykpIHsKZnVuY3Rpb24gbWJfY2hyKD9pbnQgJGNvZGVwb2ludCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NocigoaW50KSAkY29kZXBvaW50LCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3NjcnViJykpIHsKZnVuY3Rpb24gbWJfc2NydWIoP3N0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyAkZW5jb2RpbmcgPz89IG1iX2ludGVybmFsX2VuY29kaW5nKCk7IHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKChzdHJpbmcpICRzdHJpbmcsICRlbmNvZGluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJfc3BsaXQnKSkgewpmdW5jdGlvbiBtYl9zdHJfc3BsaXQoP3N0cmluZyAkc3RyaW5nLCA/aW50ICRsZW5ndGggPSAxLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBhcnJheSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJfc3BsaXQoKHN0cmluZykgJHN0cmluZywgKGludCkgJGxlbmd0aCwgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyX3BhZCcpKSB7CmZ1bmN0aW9uIG1iX3N0cl9wYWQoc3RyaW5nICRzdHJpbmcsIGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZF9zdHJpbmcgPSAnICcsIGludCAkcGFkX3R5cGUgPSBTVFJfUEFEX1JJR0hULCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyX3BhZCgkc3RyaW5nLCAkbGVuZ3RoLCAkcGFkX3N0cmluZywgJHBhZF90eXBlLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl91Y2ZpcnN0JykpIHsKZnVuY3Rpb24gbWJfdWNmaXJzdChzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3VjZmlyc3QoJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfbGNmaXJzdCcpKSB7CmZ1bmN0aW9uIG1iX2xjZmlyc3Qoc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9sY2ZpcnN0KCRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3RyaW0nKSkgewpmdW5jdGlvbiBtYl90cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3RyaW0oJHN0cmluZywgJGNoYXJhY3RlcnMsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2x0cmltJykpIHsKZnVuY3Rpb24gbWJfbHRyaW0oc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGNoYXJhY3RlcnMgPSBudWxsLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbHRyaW0oJHN0cmluZywgJGNoYXJhY3RlcnMsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3J0cmltJykpIHsKZnVuY3Rpb24gbWJfcnRyaW0oc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGNoYXJhY3RlcnMgPSBudWxsLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfcnRyaW0oJHN0cmluZywgJGNoYXJhY3RlcnMsICRlbmNvZGluZyk7IH0KfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ21ic3RyaW5nJykpIHsKcmV0dXJuOwp9CgppZiAoIWRlZmluZWQoJ01CX0NBU0VfVVBQRVInKSkgewpkZWZpbmUoJ01CX0NBU0VfVVBQRVInLCAwKTsKfQppZiAoIWRlZmluZWQoJ01CX0NBU0VfTE9XRVInKSkgewpkZWZpbmUoJ01CX0NBU0VfTE9XRVInLCAxKTsKfQppZiAoIWRlZmluZWQoJ01CX0NBU0VfVElUTEUnKSkgewpkZWZpbmUoJ01CX0NBU0VfVElUTEUnLCAyKTsKfQoKQ29weXJpZ2h0IChjKSAyMDE4LXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA3MzsKCgoKCgoKCmZpbmFsIGNsYXNzIFBocDczCnsKcHVibGljIHN0YXRpYyAkc3RhcnRBdCA9IDE1MzM0NjI2MDM7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaHJ0aW1lKCRhc051bSA9IGZhbHNlKQp7CiRucyA9IG1pY3JvdGltZShmYWxzZSk7CiRzID0gc3Vic3RyKCRucywgMTEpIC0gc2VsZjo6JHN0YXJ0QXQ7CiRucyA9IDFFOSAqIChmbG9hdCkgJG5zOwoKaWYgKCRhc051bSkgewokbnMgKz0gJHMgKiAxRTk7CgpyZXR1cm4gXFBIUF9JTlRfU0laRSA9PT0gNCA/ICRucyA6IChpbnQpICRuczsKfQoKcmV0dXJuIFskcywgKGludCkgJG5zXTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgNzAzMDApIHsKY2xhc3MgSnNvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7Cn0KfQo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcUGhwNzMgYXMgcDsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gNzAzMDApIHsKcmV0dXJuOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnaXNfY291bnRhYmxlJykpIHsKZnVuY3Rpb24gaXNfY291bnRhYmxlKCR2YWx1ZSkgeyByZXR1cm4gaXNfYXJyYXkoJHZhbHVlKSB8fCAkdmFsdWUgaW5zdGFuY2VvZiBDb3VudGFibGUgfHwgJHZhbHVlIGluc3RhbmNlb2YgUmVzb3VyY2VCdW5kbGUgfHwgJHZhbHVlIGluc3RhbmNlb2YgU2ltcGxlWG1sRWxlbWVudDsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdocnRpbWUnKSkgewpyZXF1aXJlX29uY2UgX19ESVJfXy4nL1BocDczLnBocCc7CnBcUGhwNzM6OiRzdGFydEF0ID0gKGludCkgbWljcm90aW1lKHRydWUpOwpmdW5jdGlvbiBocnRpbWUoJGFzX251bWJlciA9IGZhbHNlKSB7IHJldHVybiBwXFBocDczOjpocnRpbWUoJGFzX251bWJlcik7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXJyYXlfa2V5X2ZpcnN0JykpIHsKZnVuY3Rpb24gYXJyYXlfa2V5X2ZpcnN0KGFycmF5ICRhcnJheSkgeyBmb3JlYWNoICgkYXJyYXkgYXMgJGtleSA9PiAkdmFsdWUpIHsgcmV0dXJuICRrZXk7IH0gfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcnJheV9rZXlfbGFzdCcpKSB7CmZ1bmN0aW9uIGFycmF5X2tleV9sYXN0KGFycmF5ICRhcnJheSkgeyByZXR1cm4ga2V5KGFycmF5X3NsaWNlKCRhcnJheSwgLTEsIDEsIHRydWUpKTsgfQp9CgpDb3B5cmlnaHQgKGMpIDIwMjAtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XFBvbHlmaWxsXFBocDgwOwoKCgoKCgoKCmZpbmFsIGNsYXNzIFBocDgwCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmZGl2KGZsb2F0ICRkaXZpZGVuZCwgZmxvYXQgJGRpdmlzb3IpOiBmbG9hdAp7CnJldHVybiBAKCRkaXZpZGVuZCAvICRkaXZpc29yKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfZGVidWdfdHlwZSgkdmFsdWUpOiBzdHJpbmcKewpzd2l0Y2ggKHRydWUpIHsKY2FzZSBudWxsID09PSAkdmFsdWU6IHJldHVybiAnbnVsbCc7CmNhc2UgXGlzX2Jvb2woJHZhbHVlKTogcmV0dXJuICdib29sJzsKY2FzZSBcaXNfc3RyaW5nKCR2YWx1ZSk6IHJldHVybiAnc3RyaW5nJzsKY2FzZSBcaXNfYXJyYXkoJHZhbHVlKTogcmV0dXJuICdhcnJheSc7CmNhc2UgXGlzX2ludCgkdmFsdWUpOiByZXR1cm4gJ2ludCc7CmNhc2UgXGlzX2Zsb2F0KCR2YWx1ZSk6IHJldHVybiAnZmxvYXQnOwpjYXNlIFxpc19vYmplY3QoJHZhbHVlKTogYnJlYWs7CmNhc2UgJHZhbHVlIGluc3RhbmNlb2YgXF9fUEhQX0luY29tcGxldGVfQ2xhc3M6IHJldHVybiAnX19QSFBfSW5jb21wbGV0ZV9DbGFzcyc7CmRlZmF1bHQ6CmlmIChudWxsID09PSAkdHlwZSA9IEBnZXRfcmVzb3VyY2VfdHlwZSgkdmFsdWUpKSB7CnJldHVybiAndW5rbm93bic7Cn0KCmlmICgnVW5rbm93bicgPT09ICR0eXBlKSB7CiR0eXBlID0gJ2Nsb3NlZCc7Cn0KCnJldHVybiAicmVzb3VyY2UgKCR0eXBlKSI7Cn0KCiRjbGFzcyA9IFxnZXRfY2xhc3MoJHZhbHVlKTsKCmlmIChmYWxzZSA9PT0gc3RycG9zKCRjbGFzcywgJ0AnKSkgewpyZXR1cm4gJGNsYXNzOwp9CgpyZXR1cm4gKGdldF9wYXJlbnRfY2xhc3MoJGNsYXNzKSA/OiBrZXkoY2xhc3NfaW1wbGVtZW50cygkY2xhc3MpKSA/OiAnY2xhc3MnKS4nQGFub255bW91cyc7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X3Jlc291cmNlX2lkKCRyZXMpOiBpbnQKewppZiAoIVxpc19yZXNvdXJjZSgkcmVzKSAmJiBudWxsID09PSBAZ2V0X3Jlc291cmNlX3R5cGUoJHJlcykpIHsKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignQXJndW1lbnQgMSBwYXNzZWQgdG8gZ2V0X3Jlc291cmNlX2lkKCkgbXVzdCBiZSBvZiB0aGUgdHlwZSByZXNvdXJjZSwgJXMgZ2l2ZW4nLCBnZXRfZGVidWdfdHlwZSgkcmVzKSkpOwp9CgpyZXR1cm4gKGludCkgJHJlczsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcmVnX2xhc3RfZXJyb3JfbXNnKCk6IHN0cmluZwp7CnN3aXRjaCAocHJlZ19sYXN0X2Vycm9yKCkpIHsKY2FzZSBcUFJFR19JTlRFUk5BTF9FUlJPUjoKcmV0dXJuICdJbnRlcm5hbCBlcnJvcic7CmNhc2UgXFBSRUdfQkFEX1VURjhfRVJST1I6CnJldHVybiAnTWFsZm9ybWVkIFVURi04IGNoYXJhY3RlcnMsIHBvc3NpYmx5IGluY29ycmVjdGx5IGVuY29kZWQnOwpjYXNlIFxQUkVHX0JBRF9VVEY4X09GRlNFVF9FUlJPUjoKcmV0dXJuICdUaGUgb2Zmc2V0IGRpZCBub3QgY29ycmVzcG9uZCB0byB0aGUgYmVnaW5uaW5nIG9mIGEgdmFsaWQgVVRGLTggY29kZSBwb2ludCc7CmNhc2UgXFBSRUdfQkFDS1RSQUNLX0xJTUlUX0VSUk9SOgpyZXR1cm4gJ0JhY2t0cmFjayBsaW1pdCBleGhhdXN0ZWQnOwpjYXNlIFxQUkVHX1JFQ1VSU0lPTl9MSU1JVF9FUlJPUjoKcmV0dXJuICdSZWN1cnNpb24gbGltaXQgZXhoYXVzdGVkJzsKY2FzZSBcUFJFR19KSVRfU1RBQ0tMSU1JVF9FUlJPUjoKcmV0dXJuICdKSVQgc3RhY2sgbGltaXQgZXhoYXVzdGVkJzsKY2FzZSBcUFJFR19OT19FUlJPUjoKcmV0dXJuICdObyBlcnJvcic7CmRlZmF1bHQ6CnJldHVybiAnVW5rbm93biBlcnJvcic7Cn0KfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJfY29udGFpbnMoc3RyaW5nICRoYXlzdGFjaywgc3RyaW5nICRuZWVkbGUpOiBib29sCnsKcmV0dXJuICcnID09PSAkbmVlZGxlIHx8IGZhbHNlICE9PSBzdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJfc3RhcnRzX3dpdGgoc3RyaW5nICRoYXlzdGFjaywgc3RyaW5nICRuZWVkbGUpOiBib29sCnsKcmV0dXJuIDAgPT09IHN0cm5jbXAoJGhheXN0YWNrLCAkbmVlZGxlLCBcc3RybGVuKCRuZWVkbGUpKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJfZW5kc193aXRoKHN0cmluZyAkaGF5c3RhY2ssIHN0cmluZyAkbmVlZGxlKTogYm9vbAp7CmlmICgnJyA9PT0gJG5lZWRsZSB8fCAkbmVlZGxlID09PSAkaGF5c3RhY2spIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgnJyA9PT0gJGhheXN0YWNrKSB7CnJldHVybiBmYWxzZTsKfQoKJG5lZWRsZUxlbmd0aCA9IFxzdHJsZW4oJG5lZWRsZSk7CgpyZXR1cm4gJG5lZWRsZUxlbmd0aCA8PSBcc3RybGVuKCRoYXlzdGFjaykgJiYgMCA9PT0gc3Vic3RyX2NvbXBhcmUoJGhheXN0YWNrLCAkbmVlZGxlLCAtJG5lZWRsZUxlbmd0aCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcUG9seWZpbGxcUGhwODA7CgoKCgoKCmNsYXNzIFBocFRva2VuIGltcGxlbWVudHMgXFN0cmluZ2FibGUKewoKCgpwdWJsaWMgJGlkOwoKCgoKcHVibGljICR0ZXh0OwoKCgoKcHVibGljICRsaW5lOwoKCgoKcHVibGljICRwb3M7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRpZCwgc3RyaW5nICR0ZXh0LCBpbnQgJGxpbmUgPSAtMSwgaW50ICRwb3NpdGlvbiA9IC0xKQp7CiR0aGlzLT5pZCA9ICRpZDsKJHRoaXMtPnRleHQgPSAkdGV4dDsKJHRoaXMtPmxpbmUgPSAkbGluZTsKJHRoaXMtPnBvcyA9ICRwb3NpdGlvbjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFRva2VuTmFtZSgpOiA/c3RyaW5nCnsKaWYgKCdVTktOT1dOJyA9PT0gJG5hbWUgPSB0b2tlbl9uYW1lKCR0aGlzLT5pZCkpIHsKJG5hbWUgPSBcc3RybGVuKCR0aGlzLT50ZXh0KSA+IDEgfHwgXG9yZCgkdGhpcy0+dGV4dCkgPCAzMiA/IG51bGwgOiAkdGhpcy0+dGV4dDsKfQoKcmV0dXJuICRuYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXMoJGtpbmQpOiBib29sCnsKZm9yZWFjaCAoKGFycmF5KSAka2luZCBhcyAkdmFsdWUpIHsKaWYgKFxpbl9hcnJheSgkdmFsdWUsIFskdGhpcy0+aWQsICR0aGlzLT50ZXh0XSwgdHJ1ZSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNJZ25vcmFibGUoKTogYm9vbAp7CnJldHVybiBcaW5fYXJyYXkoJHRoaXMtPmlkLCBbXFRfV0hJVEVTUEFDRSwgXFRfQ09NTUVOVCwgXFRfRE9DX0NPTU1FTlQsIFxUX09QRU5fVEFHXSwgdHJ1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CnJldHVybiAoc3RyaW5nKSAkdGhpcy0+dGV4dDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0b2tlbml6ZShzdHJpbmcgJGNvZGUsIGludCAkZmxhZ3MgPSAwKTogYXJyYXkKewokbGluZSA9IDE7CiRwb3NpdGlvbiA9IDA7CiR0b2tlbnMgPSB0b2tlbl9nZXRfYWxsKCRjb2RlLCAkZmxhZ3MpOwpmb3JlYWNoICgkdG9rZW5zIGFzICRpbmRleCA9PiAkdG9rZW4pIHsKaWYgKFxpc19zdHJpbmcoJHRva2VuKSkgewokaWQgPSBcb3JkKCR0b2tlbik7CiR0ZXh0ID0gJHRva2VuOwp9IGVsc2UgewpbJGlkLCAkdGV4dCwgJGxpbmVdID0gJHRva2VuOwp9CiR0b2tlbnNbJGluZGV4XSA9IG5ldyBzdGF0aWMoJGlkLCAkdGV4dCwgJGxpbmUsICRwb3NpdGlvbik7CiRwb3NpdGlvbiArPSBcc3RybGVuKCR0ZXh0KTsKfQoKcmV0dXJuICR0b2tlbnM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKI1tBdHRyaWJ1dGUoQXR0cmlidXRlOjpUQVJHRVRfQ0xBU1MpXQpmaW5hbCBjbGFzcyBBdHRyaWJ1dGUKewpwdWJsaWMgY29uc3QgVEFSR0VUX0NMQVNTID0gMTsKcHVibGljIGNvbnN0IFRBUkdFVF9GVU5DVElPTiA9IDI7CnB1YmxpYyBjb25zdCBUQVJHRVRfTUVUSE9EID0gNDsKcHVibGljIGNvbnN0IFRBUkdFVF9QUk9QRVJUWSA9IDg7CnB1YmxpYyBjb25zdCBUQVJHRVRfQ0xBU1NfQ09OU1RBTlQgPSAxNjsKcHVibGljIGNvbnN0IFRBUkdFVF9QQVJBTUVURVIgPSAzMjsKcHVibGljIGNvbnN0IFRBUkdFVF9BTEwgPSA2MzsKcHVibGljIGNvbnN0IElTX1JFUEVBVEFCTEUgPSA2NDsKCgpwdWJsaWMgJGZsYWdzOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkZmxhZ3MgPSBzZWxmOjpUQVJHRVRfQUxMKQp7CiR0aGlzLT5mbGFncyA9ICRmbGFnczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAwMDAgJiYgZXh0ZW5zaW9uX2xvYWRlZCgndG9rZW5pemVyJykpIHsKY2xhc3MgUGhwVG9rZW4gZXh0ZW5kcyBTeW1mb255XFBvbHlmaWxsXFBocDgwXFBocFRva2VuCnsKfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAwMDApIHsKaW50ZXJmYWNlIFN0cmluZ2FibGUKewoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewpjbGFzcyBVbmhhbmRsZWRNYXRjaEVycm9yIGV4dGVuZHMgRXJyb3IKewp9Cn0KPD9waHAKCgoKCgoKCgoKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewpjbGFzcyBWYWx1ZUVycm9yIGV4dGVuZHMgRXJyb3IKewp9Cn0KPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXFBocDgwIGFzIHA7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwKSB7CnJldHVybjsKfQoKaWYgKCFkZWZpbmVkKCdGSUxURVJfVkFMSURBVEVfQk9PTCcpICYmIGRlZmluZWQoJ0ZJTFRFUl9WQUxJREFURV9CT09MRUFOJykpIHsKZGVmaW5lKCdGSUxURVJfVkFMSURBVEVfQk9PTCcsIFxGSUxURVJfVkFMSURBVEVfQk9PTEVBTik7Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdmZGl2JykpIHsKZnVuY3Rpb24gZmRpdihmbG9hdCAkbnVtMSwgZmxvYXQgJG51bTIpOiBmbG9hdCB7IHJldHVybiBwXFBocDgwOjpmZGl2KCRudW0xLCAkbnVtMik7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygncHJlZ19sYXN0X2Vycm9yX21zZycpKSB7CmZ1bmN0aW9uIHByZWdfbGFzdF9lcnJvcl9tc2coKTogc3RyaW5nIHsgcmV0dXJuIHBcUGhwODA6OnByZWdfbGFzdF9lcnJvcl9tc2coKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdzdHJfY29udGFpbnMnKSkgewpmdW5jdGlvbiBzdHJfY29udGFpbnMoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSk6IGJvb2wgeyByZXR1cm4gcFxQaHA4MDo6c3RyX2NvbnRhaW5zKCRoYXlzdGFjayA/PyAnJywgJG5lZWRsZSA/PyAnJyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnc3RyX3N0YXJ0c193aXRoJykpIHsKZnVuY3Rpb24gc3RyX3N0YXJ0c193aXRoKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUpOiBib29sIHsgcmV0dXJuIHBcUGhwODA6OnN0cl9zdGFydHNfd2l0aCgkaGF5c3RhY2sgPz8gJycsICRuZWVkbGUgPz8gJycpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3N0cl9lbmRzX3dpdGgnKSkgewpmdW5jdGlvbiBzdHJfZW5kc193aXRoKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUpOiBib29sIHsgcmV0dXJuIHBcUGhwODA6OnN0cl9lbmRzX3dpdGgoJGhheXN0YWNrID8/ICcnLCAkbmVlZGxlID8/ICcnKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdnZXRfZGVidWdfdHlwZScpKSB7CmZ1bmN0aW9uIGdldF9kZWJ1Z190eXBlKCR2YWx1ZSk6IHN0cmluZyB7IHJldHVybiBwXFBocDgwOjpnZXRfZGVidWdfdHlwZSgkdmFsdWUpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9yZXNvdXJjZV9pZCcpKSB7CmZ1bmN0aW9uIGdldF9yZXNvdXJjZV9pZCgkcmVzb3VyY2UpOiBpbnQgeyByZXR1cm4gcFxQaHA4MDo6Z2V0X3Jlc291cmNlX2lkKCRyZXNvdXJjZSk7IH0KfQoKQ29weXJpZ2h0IChjKSAyMDIxLXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA4MTsKCgoKCgoKZmluYWwgY2xhc3MgUGhwODEKewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5X2lzX2xpc3QoYXJyYXkgJGFycmF5KTogYm9vbAp7CmlmIChbXSA9PT0gJGFycmF5IHx8ICRhcnJheSA9PT0gYXJyYXlfdmFsdWVzKCRhcnJheSkpIHsKcmV0dXJuIHRydWU7Cn0KCiRuZXh0S2V5ID0gLTE7Cgpmb3JlYWNoICgkYXJyYXkgYXMgJGsgPT4gJHYpIHsKaWYgKCRrICE9PSArKyRuZXh0S2V5KSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDcwNDAwICYmIGV4dGVuc2lvbl9sb2FkZWQoJ2N1cmwnKSkgewoKCgpjbGFzcyBDVVJMU3RyaW5nRmlsZSBleHRlbmRzIENVUkxGaWxlCnsKcHJpdmF0ZSAkZGF0YTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGRhdGEsIHN0cmluZyAkcG9zdG5hbWUsIHN0cmluZyAkbWltZSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKQp7CiR0aGlzLT5kYXRhID0gJGRhdGE7CnBhcmVudDo6X19jb25zdHJ1Y3QoJ2RhdGE6Ly9hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCcuYmFzZTY0X2VuY29kZSgkZGF0YSksICRtaW1lLCAkcG9zdG5hbWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19zZXQoc3RyaW5nICRuYW1lLCAkdmFsdWUpOiB2b2lkCnsKaWYgKCdkYXRhJyAhPT0gJG5hbWUpIHsKJHRoaXMtPiRuYW1lID0gJHZhbHVlOwoKcmV0dXJuOwp9CgppZiAoaXNfb2JqZWN0KCR2YWx1ZSkgPyAhbWV0aG9kX2V4aXN0cygkdmFsdWUsICdfX3RvU3RyaW5nJykgOiAhaXNfc2NhbGFyKCR2YWx1ZSkpIHsKdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGFzc2lnbiAnLmdldHR5cGUoJHZhbHVlKS4nIHRvIHByb3BlcnR5IENVUkxTdHJpbmdGaWxlOjokZGF0YSBvZiB0eXBlIHN0cmluZycpOwp9CgokdGhpcy0+bmFtZSA9ICdkYXRhOi8vYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwnLmJhc2U2NF9lbmNvZGUoJHZhbHVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9faXNzZXQoc3RyaW5nICRuYW1lKTogYm9vbAp7CnJldHVybiBpc3NldCgkdGhpcy0+JG5hbWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gJl9fZ2V0KHN0cmluZyAkbmFtZSkKewpyZXR1cm4gJHRoaXMtPiRuYW1lOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMTAwKSB7CiNbQXR0cmlidXRlKEF0dHJpYnV0ZTo6VEFSR0VUX01FVEhPRCldCmZpbmFsIGNsYXNzIFJldHVyblR5cGVXaWxsQ2hhbmdlCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKewp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcUGhwODEgYXMgcDsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAxMDApIHsKcmV0dXJuOwp9CgppZiAoZGVmaW5lZCgnTVlTUUxJX1JFRlJFU0hfU0xBVkUnKSAmJiAhZGVmaW5lZCgnTVlTUUxJX1JFRlJFU0hfUkVQTElDQScpKSB7CmRlZmluZSgnTVlTUUxJX1JFRlJFU0hfUkVQTElDQScsIDY0KTsKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FycmF5X2lzX2xpc3QnKSkgewpmdW5jdGlvbiBhcnJheV9pc19saXN0KGFycmF5ICRhcnJheSk6IGJvb2wgeyByZXR1cm4gcFxQaHA4MTo6YXJyYXlfaXNfbGlzdCgkYXJyYXkpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdlbnVtX2V4aXN0cycpKSB7CmZ1bmN0aW9uIGVudW1fZXhpc3RzKHN0cmluZyAkZW51bSwgYm9vbCAkYXV0b2xvYWQgPSB0cnVlKTogYm9vbCB7IHJldHVybiAkYXV0b2xvYWQgJiYgY2xhc3NfZXhpc3RzKCRlbnVtKSAmJiBmYWxzZTsgfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb247CgoKCgoKCmludGVyZmFjZSBFeGNlcHRpb25JbnRlcmZhY2UgZXh0ZW5kcyBcVGhyb3dhYmxlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBMb2dpY0V4Y2VwdGlvbiBleHRlbmRzIFxMb2dpY0V4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvbjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCmNsYXNzIFByb2Nlc3NGYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKcHJpdmF0ZSAkcHJvY2VzczsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQcm9jZXNzICRwcm9jZXNzKQp7CmlmICgkcHJvY2Vzcy0+aXNTdWNjZXNzZnVsKCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignRXhwZWN0ZWQgYSBmYWlsZWQgcHJvY2VzcywgYnV0IHRoZSBnaXZlbiBwcm9jZXNzIHdhcyBzdWNjZXNzZnVsLicpOwp9CgokZXJyb3IgPSBzcHJpbnRmKCdUaGUgY29tbWFuZCAiJXMiIGZhaWxlZC4nLiJcblxuRXhpdCBDb2RlOiAlcyglcylcblxuV29ya2luZyBkaXJlY3Rvcnk6ICVzIiwKJHByb2Nlc3MtPmdldENvbW1hbmRMaW5lKCksCiRwcm9jZXNzLT5nZXRFeGl0Q29kZSgpLAokcHJvY2Vzcy0+Z2V0RXhpdENvZGVUZXh0KCksCiRwcm9jZXNzLT5nZXRXb3JraW5nRGlyZWN0b3J5KCkKKTsKCmlmICghJHByb2Nlc3MtPmlzT3V0cHV0RGlzYWJsZWQoKSkgewokZXJyb3IgLj0gc3ByaW50ZigiXG5cbk91dHB1dDpcbj09PT09PT09PT09PT09PT1cbiVzXG5cbkVycm9yIE91dHB1dDpcbj09PT09PT09PT09PT09PT1cbiVzIiwKJHByb2Nlc3MtPmdldE91dHB1dCgpLAokcHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKQopOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRlcnJvcik7CgokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvY2VzcygpCnsKcmV0dXJuICR0aGlzLT5wcm9jZXNzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvbjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCmZpbmFsIGNsYXNzIFByb2Nlc3NTaWduYWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24Kewpwcml2YXRlICRwcm9jZXNzOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFByb2Nlc3MgJHByb2Nlc3MpCnsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzczsKCnBhcmVudDo6X19jb25zdHJ1Y3Qoc3ByaW50ZignVGhlIHByb2Nlc3MgaGFzIGJlZW4gc2lnbmFsZWQgd2l0aCBzaWduYWwgIiVzIi4nLCAkcHJvY2Vzcy0+Z2V0VGVybVNpZ25hbCgpKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9jZXNzKCk6IFByb2Nlc3MKewpyZXR1cm4gJHRoaXMtPnByb2Nlc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTaWduYWwoKTogaW50CnsKcmV0dXJuICR0aGlzLT5nZXRQcm9jZXNzKCktPmdldFRlcm1TaWduYWwoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb247Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwoKCgoKCgpjbGFzcyBQcm9jZXNzVGltZWRPdXRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKcHVibGljIGNvbnN0IFRZUEVfR0VORVJBTCA9IDE7CnB1YmxpYyBjb25zdCBUWVBFX0lETEUgPSAyOwoKcHJpdmF0ZSAkcHJvY2VzczsKcHJpdmF0ZSAkdGltZW91dFR5cGU7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUHJvY2VzcyAkcHJvY2VzcywgaW50ICR0aW1lb3V0VHlwZSkKewokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzOwokdGhpcy0+dGltZW91dFR5cGUgPSAkdGltZW91dFR5cGU7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KHNwcmludGYoCidUaGUgcHJvY2VzcyAiJXMiIGV4Y2VlZGVkIHRoZSB0aW1lb3V0IG9mICVzIHNlY29uZHMuJywKJHByb2Nlc3MtPmdldENvbW1hbmRMaW5lKCksCiR0aGlzLT5nZXRFeGNlZWRlZFRpbWVvdXQoKQopKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByb2Nlc3MoKQp7CnJldHVybiAkdGhpcy0+cHJvY2VzczsKfQoKcHVibGljIGZ1bmN0aW9uIGlzR2VuZXJhbFRpbWVvdXQoKQp7CnJldHVybiBzZWxmOjpUWVBFX0dFTkVSQUwgPT09ICR0aGlzLT50aW1lb3V0VHlwZTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzSWRsZVRpbWVvdXQoKQp7CnJldHVybiBzZWxmOjpUWVBFX0lETEUgPT09ICR0aGlzLT50aW1lb3V0VHlwZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEV4Y2VlZGVkVGltZW91dCgpCnsKc3dpdGNoICgkdGhpcy0+dGltZW91dFR5cGUpIHsKY2FzZSBzZWxmOjpUWVBFX0dFTkVSQUw6CnJldHVybiAkdGhpcy0+cHJvY2Vzcy0+Z2V0VGltZW91dCgpOwoKY2FzZSBzZWxmOjpUWVBFX0lETEU6CnJldHVybiAkdGhpcy0+cHJvY2Vzcy0+Z2V0SWRsZVRpbWVvdXQoKTsKCmRlZmF1bHQ6CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZignVW5rbm93biB0aW1lb3V0IHR5cGUgIiVkIi4nLCAkdGhpcy0+dGltZW91dFR5cGUpKTsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3M7CgoKCgoKCgpjbGFzcyBFeGVjdXRhYmxlRmluZGVyCnsKcHJpdmF0ZSBjb25zdCBDTURfQlVJTFRJTlMgPSBbCidhc3NvYycsICdicmVhaycsICdjYWxsJywgJ2NkJywgJ2NoZGlyJywgJ2NscycsICdjb2xvcicsICdjb3B5JywgJ2RhdGUnLAonZGVsJywgJ2RpcicsICdlY2hvJywgJ2VuZGxvY2FsJywgJ2VyYXNlJywgJ2V4aXQnLCAnZm9yJywgJ2Z0eXBlJywgJ2dvdG8nLAonaGVscCcsICdpZicsICdsYWJlbCcsICdtZCcsICdta2RpcicsICdta2xpbmsnLCAnbW92ZScsICdwYXRoJywgJ3BhdXNlJywKJ3BvcGQnLCAncHJvbXB0JywgJ3B1c2hkJywgJ3JkJywgJ3JlbScsICdyZW4nLCAncmVuYW1lJywgJ3JtZGlyJywgJ3NldCcsCidzZXRsb2NhbCcsICdzaGlmdCcsICdzdGFydCcsICd0aW1lJywgJ3RpdGxlJywgJ3R5cGUnLCAndmVyJywgJ3ZvbCcsCl07Cgpwcml2YXRlICRzdWZmaXhlcyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN1ZmZpeGVzKGFycmF5ICRzdWZmaXhlcykKewokdGhpcy0+c3VmZml4ZXMgPSAkc3VmZml4ZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRTdWZmaXgoc3RyaW5nICRzdWZmaXgpCnsKJHRoaXMtPnN1ZmZpeGVzW10gPSAkc3VmZml4Owp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZChzdHJpbmcgJG5hbWUsID9zdHJpbmcgJGRlZmF1bHQgPSBudWxsLCBhcnJheSAkZXh0cmFEaXJzID0gW10pCnsKCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiAmJiBcaW5fYXJyYXkoc3RydG9sb3dlcigkbmFtZSksIHNlbGY6OkNNRF9CVUlMVElOUywgdHJ1ZSkpIHsKcmV0dXJuICRuYW1lOwp9CgokZGlycyA9IGFycmF5X21lcmdlKApleHBsb2RlKFxQQVRIX1NFUEFSQVRPUiwgZ2V0ZW52KCdQQVRIJykgPzogZ2V0ZW52KCdQYXRoJykpLAokZXh0cmFEaXJzCik7Cgokc3VmZml4ZXMgPSBbXTsKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CiRwYXRoRXh0ID0gZ2V0ZW52KCdQQVRIRVhUJyk7CiRzdWZmaXhlcyA9ICR0aGlzLT5zdWZmaXhlczsKJHN1ZmZpeGVzID0gYXJyYXlfbWVyZ2UoJHN1ZmZpeGVzLCAkcGF0aEV4dCA/IGV4cGxvZGUoXFBBVEhfU0VQQVJBVE9SLCAkcGF0aEV4dCkgOiBbJy5leGUnLCAnLmJhdCcsICcuY21kJywgJy5jb20nXSk7Cn0KJHN1ZmZpeGVzID0gJycgIT09IHBhdGhpbmZvKCRuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pID8gYXJyYXlfbWVyZ2UoWycnXSwgJHN1ZmZpeGVzKSA6IGFycmF5X21lcmdlKCRzdWZmaXhlcywgWycnXSk7CmZvcmVhY2ggKCRzdWZmaXhlcyBhcyAkc3VmZml4KSB7CmZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKaWYgKCcnID09PSAkZGlyKSB7CiRkaXIgPSAnLic7Cn0KaWYgKEBpc19maWxlKCRmaWxlID0gJGRpci5cRElSRUNUT1JZX1NFUEFSQVRPUi4kbmFtZS4kc3VmZml4KSAmJiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgfHwgQGlzX2V4ZWN1dGFibGUoJGZpbGUpKSkgewpyZXR1cm4gJGZpbGU7Cn0KCmlmICghQGlzX2RpcigkZGlyKSAmJiBiYXNlbmFtZSgkZGlyKSA9PT0gJG5hbWUuJHN1ZmZpeCAmJiBAaXNfZXhlY3V0YWJsZSgkZGlyKSkgewpyZXR1cm4gJGRpcjsKfQp9Cn0KCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiB8fCAhXGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpIHx8IFxzdHJsZW4oJG5hbWUpICE9PSBzdHJjc3BuKCRuYW1lLCAnLycuXERJUkVDVE9SWV9TRVBBUkFUT1IpKSB7CnJldHVybiAkZGVmYXVsdDsKfQoKJGV4ZWNSZXN1bHQgPSBleGVjKCdjb21tYW5kIC12IC0tICcuZXNjYXBlc2hlbGxhcmcoJG5hbWUpKTsKCmlmICgoJGV4ZWN1dGFibGVQYXRoID0gc3Vic3RyKCRleGVjUmVzdWx0LCAwLCBzdHJwb3MoJGV4ZWNSZXN1bHQsIFxQSFBfRU9MKSA/OiBudWxsKSkgJiYgQGlzX2V4ZWN1dGFibGUoJGV4ZWN1dGFibGVQYXRoKSkgewpyZXR1cm4gJGV4ZWN1dGFibGVQYXRoOwp9CgpyZXR1cm4gJGRlZmF1bHQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3M7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCgoKCgoKCgpjbGFzcyBJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZQp7Cgpwcml2YXRlICRvbkVtcHR5ID0gbnVsbDsKcHJpdmF0ZSAkaW5wdXQgPSBbXTsKcHJpdmF0ZSAkb3BlbiA9IHRydWU7CgoKCgpwdWJsaWMgZnVuY3Rpb24gb25FbXB0eSg/Y2FsbGFibGUgJG9uRW1wdHkgPSBudWxsKQp7CiR0aGlzLT5vbkVtcHR5ID0gJG9uRW1wdHk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkaW5wdXQpCnsKaWYgKG51bGwgPT09ICRpbnB1dCkgewpyZXR1cm47Cn0KaWYgKCR0aGlzLT5pc0Nsb3NlZCgpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJyIlcyIgaXMgY2xvc2VkLicsIHN0YXRpYzo6Y2xhc3MpKTsKfQokdGhpcy0+aW5wdXRbXSA9IFByb2Nlc3NVdGlsczo6dmFsaWRhdGVJbnB1dChfX01FVEhPRF9fLCAkaW5wdXQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQp7CiR0aGlzLT5vcGVuID0gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0Nsb3NlZCgpCnsKcmV0dXJuICEkdGhpcy0+b3BlbjsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpCnsKJHRoaXMtPm9wZW4gPSB0cnVlOwoKd2hpbGUgKCR0aGlzLT5vcGVuIHx8ICR0aGlzLT5pbnB1dCkgewppZiAoISR0aGlzLT5pbnB1dCkgewp5aWVsZCAnJzsKY29udGludWU7Cn0KJGN1cnJlbnQgPSBhcnJheV9zaGlmdCgkdGhpcy0+aW5wdXQpOwoKaWYgKCRjdXJyZW50IGluc3RhbmNlb2YgXEl0ZXJhdG9yKSB7CnlpZWxkIGZyb20gJGN1cnJlbnQ7Cn0gZWxzZSB7CnlpZWxkICRjdXJyZW50Owp9CmlmICghJHRoaXMtPmlucHV0ICYmICR0aGlzLT5vcGVuICYmIG51bGwgIT09ICRvbkVtcHR5ID0gJHRoaXMtPm9uRW1wdHkpIHsKJHRoaXMtPndyaXRlKCRvbkVtcHR5KCR0aGlzKSk7Cn0KfQp9Cn0KCkNvcHlyaWdodCAoYykgMjAwNC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3M7CgoKCgoKCgpjbGFzcyBQaHBFeGVjdXRhYmxlRmluZGVyCnsKcHJpdmF0ZSAkZXhlY3V0YWJsZUZpbmRlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKJHRoaXMtPmV4ZWN1dGFibGVGaW5kZXIgPSBuZXcgRXhlY3V0YWJsZUZpbmRlcigpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kKGJvb2wgJGluY2x1ZGVBcmdzID0gdHJ1ZSkKewppZiAoJHBocCA9IGdldGVudignUEhQX0JJTkFSWScpKSB7CmlmICghaXNfZXhlY3V0YWJsZSgkcGhwKSAmJiAhJHBocCA9ICR0aGlzLT5leGVjdXRhYmxlRmluZGVyLT5maW5kKCRwaHApKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKEBpc19kaXIoJHBocCkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gJHBocDsKfQoKJGFyZ3MgPSAkdGhpcy0+ZmluZEFyZ3VtZW50cygpOwokYXJncyA9ICRpbmNsdWRlQXJncyAmJiAkYXJncyA/ICcgJy5pbXBsb2RlKCcgJywgJGFyZ3MpIDogJyc7CgoKaWYgKFxQSFBfQklOQVJZICYmIFxpbl9hcnJheShcUEhQX1NBUEksIFsnY2xpJywgJ2NsaS1zZXJ2ZXInLCAncGhwZGJnJ10sIHRydWUpKSB7CnJldHVybiBcUEhQX0JJTkFSWS4kYXJnczsKfQoKaWYgKCRwaHAgPSBnZXRlbnYoJ1BIUF9QQVRIJykpIHsKaWYgKCFAaXNfZXhlY3V0YWJsZSgkcGhwKSB8fCBAaXNfZGlyKCRwaHApKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuICRwaHA7Cn0KCmlmICgkcGhwID0gZ2V0ZW52KCdQSFBfUEVBUl9QSFBfQklOJykpIHsKaWYgKEBpc19leGVjdXRhYmxlKCRwaHApICYmICFAaXNfZGlyKCRwaHApKSB7CnJldHVybiAkcGhwOwp9Cn0KCmlmIChAaXNfZXhlY3V0YWJsZSgkcGhwID0gXFBIUF9CSU5ESVIuKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gJ1xccGhwLmV4ZScgOiAnL3BocCcpKSAmJiAhQGlzX2RpcigkcGhwKSkgewpyZXR1cm4gJHBocDsKfQoKJGRpcnMgPSBbXFBIUF9CSU5ESVJdOwppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKJGRpcnNbXSA9ICdDOlx4YW1wcFxwaHBcXCc7Cn0KCnJldHVybiAkdGhpcy0+ZXhlY3V0YWJsZUZpbmRlci0+ZmluZCgncGhwJywgZmFsc2UsICRkaXJzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZEFyZ3VtZW50cygpCnsKJGFyZ3VtZW50cyA9IFtdOwppZiAoJ3BocGRiZycgPT09IFxQSFBfU0FQSSkgewokYXJndW1lbnRzW10gPSAnLXFycic7Cn0KCnJldHVybiAkYXJndW1lbnRzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCgoKCgoKCgoKCmNsYXNzIFBocFByb2Nlc3MgZXh0ZW5kcyBQcm9jZXNzCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHNjcmlwdCwgP3N0cmluZyAkY3dkID0gbnVsbCwgP2FycmF5ICRlbnYgPSBudWxsLCBpbnQgJHRpbWVvdXQgPSA2MCwgP2FycmF5ICRwaHAgPSBudWxsKQp7CmlmIChudWxsID09PSAkcGhwKSB7CiRleGVjdXRhYmxlRmluZGVyID0gbmV3IFBocEV4ZWN1dGFibGVGaW5kZXIoKTsKJHBocCA9ICRleGVjdXRhYmxlRmluZGVyLT5maW5kKGZhbHNlKTsKJHBocCA9IGZhbHNlID09PSAkcGhwID8gbnVsbCA6IGFycmF5X21lcmdlKFskcGhwXSwgJGV4ZWN1dGFibGVGaW5kZXItPmZpbmRBcmd1bWVudHMoKSk7Cn0KaWYgKCdwaHBkYmcnID09PSBcUEhQX1NBUEkpIHsKJGZpbGUgPSB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgJ2RiZycpOwpmaWxlX3B1dF9jb250ZW50cygkZmlsZSwgJHNjcmlwdCk7CnJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKCd1bmxpbmsnLCAkZmlsZSk7CiRwaHBbXSA9ICRmaWxlOwokc2NyaXB0ID0gbnVsbDsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkcGhwLCAkY3dkLCAkZW52LCAkc2NyaXB0LCAkdGltZW91dCk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVNoZWxsQ29tbWFuZGxpbmUoc3RyaW5nICRjb21tYW5kLCA/c3RyaW5nICRjd2QgPSBudWxsLCA/YXJyYXkgJGVudiA9IG51bGwsICRpbnB1dCA9IG51bGwsID9mbG9hdCAkdGltZW91dCA9IDYwKQp7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIiVzKCkiIG1ldGhvZCBjYW5ub3QgYmUgY2FsbGVkIHdoZW4gdXNpbmcgIiVzIi4nLCBfX01FVEhPRF9fLCBzZWxmOjpjbGFzcykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RhcnQoP2NhbGxhYmxlICRjYWxsYmFjayA9IG51bGwsIGFycmF5ICRlbnYgPSBbXSkKewppZiAobnVsbCA9PT0gJHRoaXMtPmdldENvbW1hbmRMaW5lKCkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1VuYWJsZSB0byBmaW5kIHRoZSBQSFAgZXhlY3V0YWJsZS4nKTsKfQoKcGFyZW50OjpzdGFydCgkY2FsbGJhY2ssICRlbnYpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBpcGVzOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQaXBlcyBpbXBsZW1lbnRzIFBpcGVzSW50ZXJmYWNlCnsKcHVibGljICRwaXBlcyA9IFtdOwoKcHJpdmF0ZSAkaW5wdXRCdWZmZXIgPSAnJzsKcHJpdmF0ZSAkaW5wdXQ7CnByaXZhdGUgJGJsb2NrZWQgPSB0cnVlOwpwcml2YXRlICRsYXN0RXJyb3I7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlucHV0KQp7CmlmIChcaXNfcmVzb3VyY2UoJGlucHV0KSB8fCAkaW5wdXQgaW5zdGFuY2VvZiBcSXRlcmF0b3IpIHsKJHRoaXMtPmlucHV0ID0gJGlucHV0Owp9IGVsc2VpZiAoXGlzX3N0cmluZygkaW5wdXQpKSB7CiR0aGlzLT5pbnB1dEJ1ZmZlciA9ICRpbnB1dDsKfSBlbHNlIHsKJHRoaXMtPmlucHV0QnVmZmVyID0gKHN0cmluZykgJGlucHV0Owp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCnsKZm9yZWFjaCAoJHRoaXMtPnBpcGVzIGFzICRwaXBlKSB7CmlmIChcaXNfcmVzb3VyY2UoJHBpcGUpKSB7CmZjbG9zZSgkcGlwZSk7Cn0KfQokdGhpcy0+cGlwZXMgPSBbXTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc1N5c3RlbUNhbGxCZWVuSW50ZXJydXB0ZWQoKTogYm9vbAp7CiRsYXN0RXJyb3IgPSAkdGhpcy0+bGFzdEVycm9yOwokdGhpcy0+bGFzdEVycm9yID0gbnVsbDsKCgpyZXR1cm4gbnVsbCAhPT0gJGxhc3RFcnJvciAmJiBmYWxzZSAhPT0gc3RyaXBvcygkbGFzdEVycm9yLCAnaW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwnKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHVuYmxvY2soKQp7CmlmICghJHRoaXMtPmJsb2NrZWQpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkdGhpcy0+cGlwZXMgYXMgJHBpcGUpIHsKc3RyZWFtX3NldF9ibG9ja2luZygkcGlwZSwgMCk7Cn0KaWYgKFxpc19yZXNvdXJjZSgkdGhpcy0+aW5wdXQpKSB7CnN0cmVhbV9zZXRfYmxvY2tpbmcoJHRoaXMtPmlucHV0LCAwKTsKfQoKJHRoaXMtPmJsb2NrZWQgPSBmYWxzZTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gd3JpdGUoKTogP2FycmF5CnsKaWYgKCFpc3NldCgkdGhpcy0+cGlwZXNbMF0pKSB7CnJldHVybiBudWxsOwp9CiRpbnB1dCA9ICR0aGlzLT5pbnB1dDsKCmlmICgkaW5wdXQgaW5zdGFuY2VvZiBcSXRlcmF0b3IpIHsKaWYgKCEkaW5wdXQtPnZhbGlkKCkpIHsKJGlucHV0ID0gbnVsbDsKfSBlbHNlaWYgKFxpc19yZXNvdXJjZSgkaW5wdXQgPSAkaW5wdXQtPmN1cnJlbnQoKSkpIHsKc3RyZWFtX3NldF9ibG9ja2luZygkaW5wdXQsIDApOwp9IGVsc2VpZiAoIWlzc2V0KCR0aGlzLT5pbnB1dEJ1ZmZlclswXSkpIHsKaWYgKCFcaXNfc3RyaW5nKCRpbnB1dCkpIHsKaWYgKCFcaXNfc2NhbGFyKCRpbnB1dCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCciJXMiIHlpZWxkZWQgYSB2YWx1ZSBvZiB0eXBlICIlcyIsIGJ1dCBvbmx5IHNjYWxhcnMgYW5kIHN0cmVhbSByZXNvdXJjZXMgYXJlIHN1cHBvcnRlZC4nLCBnZXRfZGVidWdfdHlwZSgkdGhpcy0+aW5wdXQpLCBnZXRfZGVidWdfdHlwZSgkaW5wdXQpKSk7Cn0KJGlucHV0ID0gKHN0cmluZykgJGlucHV0Owp9CiR0aGlzLT5pbnB1dEJ1ZmZlciA9ICRpbnB1dDsKJHRoaXMtPmlucHV0LT5uZXh0KCk7CiRpbnB1dCA9IG51bGw7Cn0gZWxzZSB7CiRpbnB1dCA9IG51bGw7Cn0KfQoKJHIgPSAkZSA9IFtdOwokdyA9IFskdGhpcy0+cGlwZXNbMF1dOwoKCmlmIChmYWxzZSA9PT0gQHN0cmVhbV9zZWxlY3QoJHIsICR3LCAkZSwgMCwgMCkpIHsKcmV0dXJuIG51bGw7Cn0KCmZvcmVhY2ggKCR3IGFzICRzdGRpbikgewppZiAoaXNzZXQoJHRoaXMtPmlucHV0QnVmZmVyWzBdKSkgewokd3JpdHRlbiA9IGZ3cml0ZSgkc3RkaW4sICR0aGlzLT5pbnB1dEJ1ZmZlcik7CiR0aGlzLT5pbnB1dEJ1ZmZlciA9IHN1YnN0cigkdGhpcy0+aW5wdXRCdWZmZXIsICR3cml0dGVuKTsKaWYgKGlzc2V0KCR0aGlzLT5pbnB1dEJ1ZmZlclswXSkpIHsKcmV0dXJuIFskdGhpcy0+cGlwZXNbMF1dOwp9Cn0KCmlmICgkaW5wdXQpIHsKd2hpbGUgKHRydWUpIHsKJGRhdGEgPSBmcmVhZCgkaW5wdXQsIHNlbGY6OkNIVU5LX1NJWkUpOwppZiAoIWlzc2V0KCRkYXRhWzBdKSkgewpicmVhazsKfQokd3JpdHRlbiA9IGZ3cml0ZSgkc3RkaW4sICRkYXRhKTsKJGRhdGEgPSBzdWJzdHIoJGRhdGEsICR3cml0dGVuKTsKaWYgKGlzc2V0KCRkYXRhWzBdKSkgewokdGhpcy0+aW5wdXRCdWZmZXIgPSAkZGF0YTsKCnJldHVybiBbJHRoaXMtPnBpcGVzWzBdXTsKfQp9CmlmIChmZW9mKCRpbnB1dCkpIHsKaWYgKCR0aGlzLT5pbnB1dCBpbnN0YW5jZW9mIFxJdGVyYXRvcikgewokdGhpcy0+aW5wdXQtPm5leHQoKTsKfSBlbHNlIHsKJHRoaXMtPmlucHV0ID0gbnVsbDsKfQp9Cn0KfQoKCmlmICghaXNzZXQoJHRoaXMtPmlucHV0QnVmZmVyWzBdKSAmJiAhKCR0aGlzLT5pbnB1dCBpbnN0YW5jZW9mIFxJdGVyYXRvciA/ICR0aGlzLT5pbnB1dC0+dmFsaWQoKSA6ICR0aGlzLT5pbnB1dCkpIHsKJHRoaXMtPmlucHV0ID0gbnVsbDsKZmNsb3NlKCR0aGlzLT5waXBlc1swXSk7CnVuc2V0KCR0aGlzLT5waXBlc1swXSk7Cn0gZWxzZWlmICghJHcpIHsKcmV0dXJuIFskdGhpcy0+cGlwZXNbMF1dOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhbmRsZUVycm9yKGludCAkdHlwZSwgc3RyaW5nICRtc2cpCnsKJHRoaXMtPmxhc3RFcnJvciA9ICRtc2c7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUGlwZXM7CgoKCgoKCgoKaW50ZXJmYWNlIFBpcGVzSW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IENIVU5LX1NJWkUgPSAxNjM4NDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXNjcmlwdG9ycygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVzKCk6IGFycmF5OwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVhZEFuZFdyaXRlKGJvb2wgJGJsb2NraW5nLCBib29sICRjbG9zZSA9IGZhbHNlKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJlT3BlbigpOiBib29sOwoKCgoKcHVibGljIGZ1bmN0aW9uIGhhdmVSZWFkU3VwcG9ydCgpOiBib29sOwoKCgoKcHVibGljIGZ1bmN0aW9uIGNsb3NlKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBpcGVzOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKCgoKCgoKCgpjbGFzcyBVbml4UGlwZXMgZXh0ZW5kcyBBYnN0cmFjdFBpcGVzCnsKcHJpdmF0ZSAkdHR5TW9kZTsKcHJpdmF0ZSAkcHR5TW9kZTsKcHJpdmF0ZSAkaGF2ZVJlYWRTdXBwb3J0OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9ib29sICR0dHlNb2RlLCBib29sICRwdHlNb2RlLCAkaW5wdXQsIGJvb2wgJGhhdmVSZWFkU3VwcG9ydCkKewokdGhpcy0+dHR5TW9kZSA9ICR0dHlNb2RlOwokdGhpcy0+cHR5TW9kZSA9ICRwdHlNb2RlOwokdGhpcy0+aGF2ZVJlYWRTdXBwb3J0ID0gJGhhdmVSZWFkU3VwcG9ydDsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGlucHV0KTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fc2xlZXAoKTogYXJyYXkKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCBzZXJpYWxpemUgJy5fX0NMQVNTX18pOwp9CgpwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQp7CnRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignQ2Fubm90IHVuc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQp7CiR0aGlzLT5jbG9zZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRvcnMoKTogYXJyYXkKewppZiAoISR0aGlzLT5oYXZlUmVhZFN1cHBvcnQpIHsKJG51bGxzdHJlYW0gPSBmb3BlbignL2Rldi9udWxsJywgJ2MnKTsKCnJldHVybiBbClsncGlwZScsICdyJ10sCiRudWxsc3RyZWFtLAokbnVsbHN0cmVhbSwKXTsKfQoKaWYgKCR0aGlzLT50dHlNb2RlKSB7CnJldHVybiBbClsnZmlsZScsICcvZGV2L3R0eScsICdyJ10sClsnZmlsZScsICcvZGV2L3R0eScsICd3J10sClsnZmlsZScsICcvZGV2L3R0eScsICd3J10sCl07Cn0KCmlmICgkdGhpcy0+cHR5TW9kZSAmJiBQcm9jZXNzOjppc1B0eVN1cHBvcnRlZCgpKSB7CnJldHVybiBbClsncHR5J10sClsncHR5J10sClsncHR5J10sCl07Cn0KCnJldHVybiBbClsncGlwZScsICdyJ10sClsncGlwZScsICd3J10sIApbJ3BpcGUnLCAndyddLCAKXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVzKCk6IGFycmF5CnsKcmV0dXJuIFtdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVhZEFuZFdyaXRlKGJvb2wgJGJsb2NraW5nLCBib29sICRjbG9zZSA9IGZhbHNlKTogYXJyYXkKewokdGhpcy0+dW5ibG9jaygpOwokdyA9ICR0aGlzLT53cml0ZSgpOwoKJHJlYWQgPSAkZSA9IFtdOwokciA9ICR0aGlzLT5waXBlczsKdW5zZXQoJHJbMF0pOwoKCnNldF9lcnJvcl9oYW5kbGVyKFskdGhpcywgJ2hhbmRsZUVycm9yJ10pOwppZiAoKCRyIHx8ICR3KSAmJiBmYWxzZSA9PT0gc3RyZWFtX3NlbGVjdCgkciwgJHcsICRlLCAwLCAkYmxvY2tpbmcgPyBQcm9jZXNzOjpUSU1FT1VUX1BSRUNJU0lPTiAqIDFFNiA6IDApKSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwoKCmlmICghJHRoaXMtPmhhc1N5c3RlbUNhbGxCZWVuSW50ZXJydXB0ZWQoKSkgewokdGhpcy0+cGlwZXMgPSBbXTsKfQoKcmV0dXJuICRyZWFkOwp9CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwoKZm9yZWFjaCAoJHIgYXMgJHBpcGUpIHsKCgokcmVhZFskdHlwZSA9IGFycmF5X3NlYXJjaCgkcGlwZSwgJHRoaXMtPnBpcGVzLCB0cnVlKV0gPSAnJzsKCmRvIHsKJGRhdGEgPSBAZnJlYWQoJHBpcGUsIHNlbGY6OkNIVU5LX1NJWkUpOwokcmVhZFskdHlwZV0gLj0gJGRhdGE7Cn0gd2hpbGUgKGlzc2V0KCRkYXRhWzBdKSAmJiAoJGNsb3NlIHx8IGlzc2V0KCRkYXRhW3NlbGY6OkNIVU5LX1NJWkUgLSAxXSkpKTsKCmlmICghaXNzZXQoJHJlYWRbJHR5cGVdWzBdKSkgewp1bnNldCgkcmVhZFskdHlwZV0pOwp9CgppZiAoJGNsb3NlICYmIGZlb2YoJHBpcGUpKSB7CmZjbG9zZSgkcGlwZSk7CnVuc2V0KCR0aGlzLT5waXBlc1skdHlwZV0pOwp9Cn0KCnJldHVybiAkcmVhZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhdmVSZWFkU3VwcG9ydCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5oYXZlUmVhZFN1cHBvcnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhcmVPcGVuKCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpICR0aGlzLT5waXBlczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQaXBlczsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwoKCgoKCgoKCgoKCmNsYXNzIFdpbmRvd3NQaXBlcyBleHRlbmRzIEFic3RyYWN0UGlwZXMKewpwcml2YXRlICRmaWxlcyA9IFtdOwpwcml2YXRlICRmaWxlSGFuZGxlcyA9IFtdOwpwcml2YXRlICRsb2NrSGFuZGxlcyA9IFtdOwpwcml2YXRlICRyZWFkQnl0ZXMgPSBbClByb2Nlc3M6OlNURE9VVCA9PiAwLApQcm9jZXNzOjpTVERFUlIgPT4gMCwKXTsKcHJpdmF0ZSAkaGF2ZVJlYWRTdXBwb3J0OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbnB1dCwgYm9vbCAkaGF2ZVJlYWRTdXBwb3J0KQp7CiR0aGlzLT5oYXZlUmVhZFN1cHBvcnQgPSAkaGF2ZVJlYWRTdXBwb3J0OwoKaWYgKCR0aGlzLT5oYXZlUmVhZFN1cHBvcnQpIHsKCgoKCiRwaXBlcyA9IFsKUHJvY2Vzczo6U1RET1VUID0+IFByb2Nlc3M6Ok9VVCwKUHJvY2Vzczo6U1RERVJSID0+IFByb2Nlc3M6OkVSUiwKXTsKJHRtcERpciA9IHN5c19nZXRfdGVtcF9kaXIoKTsKJGxhc3RFcnJvciA9ICd1bmtub3duIHJlYXNvbic7CnNldF9lcnJvcl9oYW5kbGVyKGZ1bmN0aW9uICgkdHlwZSwgJG1zZykgdXNlICgmJGxhc3RFcnJvcikgeyAkbGFzdEVycm9yID0gJG1zZzsgfSk7CmZvciAoJGkgPSAwOzsgKyskaSkgewpmb3JlYWNoICgkcGlwZXMgYXMgJHBpcGUgPT4gJG5hbWUpIHsKJGZpbGUgPSBzcHJpbnRmKCclc1xcc2ZfcHJvY18lMDJYLiVzJywgJHRtcERpciwgJGksICRuYW1lKTsKCmlmICghJGggPSBmb3BlbigkZmlsZS4nLmxvY2snLCAndycpKSB7CmlmIChmaWxlX2V4aXN0cygkZmlsZS4nLmxvY2snKSkgewpjb250aW51ZSAyOwp9CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignQSB0ZW1wb3JhcnkgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIHRvIHdyaXRlIHRoZSBwcm9jZXNzIG91dHB1dDogJy4kbGFzdEVycm9yKTsKfQppZiAoIWZsb2NrKCRoLCBcTE9DS19FWCB8IFxMT0NLX05CKSkgewpjb250aW51ZSAyOwp9CmlmIChpc3NldCgkdGhpcy0+bG9ja0hhbmRsZXNbJHBpcGVdKSkgewpmbG9jaygkdGhpcy0+bG9ja0hhbmRsZXNbJHBpcGVdLCBcTE9DS19VTik7CmZjbG9zZSgkdGhpcy0+bG9ja0hhbmRsZXNbJHBpcGVdKTsKfQokdGhpcy0+bG9ja0hhbmRsZXNbJHBpcGVdID0gJGg7CgppZiAoISgkaCA9IGZvcGVuKCRmaWxlLCAndycpKSB8fCAhZmNsb3NlKCRoKSB8fCAhJGggPSBmb3BlbigkZmlsZSwgJ3InKSkgewpmbG9jaygkdGhpcy0+bG9ja0hhbmRsZXNbJHBpcGVdLCBcTE9DS19VTik7CmZjbG9zZSgkdGhpcy0+bG9ja0hhbmRsZXNbJHBpcGVdKTsKdW5zZXQoJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSk7CmNvbnRpbnVlIDI7Cn0KJHRoaXMtPmZpbGVIYW5kbGVzWyRwaXBlXSA9ICRoOwokdGhpcy0+ZmlsZXNbJHBpcGVdID0gJGZpbGU7Cn0KYnJlYWs7Cn0KcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJGlucHV0KTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fc2xlZXAoKTogYXJyYXkKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCBzZXJpYWxpemUgJy5fX0NMQVNTX18pOwp9CgpwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQp7CnRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignQ2Fubm90IHVuc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQp7CiR0aGlzLT5jbG9zZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRvcnMoKTogYXJyYXkKewppZiAoISR0aGlzLT5oYXZlUmVhZFN1cHBvcnQpIHsKJG51bGxzdHJlYW0gPSBmb3BlbignTlVMJywgJ2MnKTsKCnJldHVybiBbClsncGlwZScsICdyJ10sCiRudWxsc3RyZWFtLAokbnVsbHN0cmVhbSwKXTsKfQoKCgoKcmV0dXJuIFsKWydwaXBlJywgJ3InXSwKWydmaWxlJywgJ05VTCcsICd3J10sClsnZmlsZScsICdOVUwnLCAndyddLApdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmZpbGVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVhZEFuZFdyaXRlKGJvb2wgJGJsb2NraW5nLCBib29sICRjbG9zZSA9IGZhbHNlKTogYXJyYXkKewokdGhpcy0+dW5ibG9jaygpOwokdyA9ICR0aGlzLT53cml0ZSgpOwokcmVhZCA9ICRyID0gJGUgPSBbXTsKCmlmICgkYmxvY2tpbmcpIHsKaWYgKCR3KSB7CkBzdHJlYW1fc2VsZWN0KCRyLCAkdywgJGUsIDAsIFByb2Nlc3M6OlRJTUVPVVRfUFJFQ0lTSU9OICogMUU2KTsKfSBlbHNlaWYgKCR0aGlzLT5maWxlSGFuZGxlcykgewp1c2xlZXAoKGludCkgKFByb2Nlc3M6OlRJTUVPVVRfUFJFQ0lTSU9OICogMUU2KSk7Cn0KfQpmb3JlYWNoICgkdGhpcy0+ZmlsZUhhbmRsZXMgYXMgJHR5cGUgPT4gJGZpbGVIYW5kbGUpIHsKJGRhdGEgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmaWxlSGFuZGxlLCAtMSwgJHRoaXMtPnJlYWRCeXRlc1skdHlwZV0pOwoKaWYgKGlzc2V0KCRkYXRhWzBdKSkgewokdGhpcy0+cmVhZEJ5dGVzWyR0eXBlXSArPSBcc3RybGVuKCRkYXRhKTsKJHJlYWRbJHR5cGVdID0gJGRhdGE7Cn0KaWYgKCRjbG9zZSkgewpmdHJ1bmNhdGUoJGZpbGVIYW5kbGUsIDApOwpmY2xvc2UoJGZpbGVIYW5kbGUpOwpmbG9jaygkdGhpcy0+bG9ja0hhbmRsZXNbJHR5cGVdLCBcTE9DS19VTik7CmZjbG9zZSgkdGhpcy0+bG9ja0hhbmRsZXNbJHR5cGVdKTsKdW5zZXQoJHRoaXMtPmZpbGVIYW5kbGVzWyR0eXBlXSwgJHRoaXMtPmxvY2tIYW5kbGVzWyR0eXBlXSk7Cn0KfQoKcmV0dXJuICRyZWFkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGF2ZVJlYWRTdXBwb3J0KCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmhhdmVSZWFkU3VwcG9ydDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFyZU9wZW4oKTogYm9vbAp7CnJldHVybiAkdGhpcy0+cGlwZXMgJiYgJHRoaXMtPmZpbGVIYW5kbGVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQp7CnBhcmVudDo6Y2xvc2UoKTsKZm9yZWFjaCAoJHRoaXMtPmZpbGVIYW5kbGVzIGFzICR0eXBlID0+ICRoYW5kbGUpIHsKZnRydW5jYXRlKCRoYW5kbGUsIDApOwpmY2xvc2UoJGhhbmRsZSk7CmZsb2NrKCR0aGlzLT5sb2NrSGFuZGxlc1skdHlwZV0sIFxMT0NLX1VOKTsKZmNsb3NlKCR0aGlzLT5sb2NrSGFuZGxlc1skdHlwZV0pOwp9CiR0aGlzLT5maWxlSGFuZGxlcyA9ICR0aGlzLT5sb2NrSGFuZGxlcyA9IFtdOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUHJvY2Vzc0ZhaWxlZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFByb2Nlc3NTaWduYWxlZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFByb2Nlc3NUaW1lZE91dEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBpcGVzXFBpcGVzSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQaXBlc1xVbml4UGlwZXM7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBpcGVzXFdpbmRvd3NQaXBlczsKCgoKCgoKCgoKCmNsYXNzIFByb2Nlc3MgaW1wbGVtZW50cyBcSXRlcmF0b3JBZ2dyZWdhdGUKewpwdWJsaWMgY29uc3QgRVJSID0gJ2Vycic7CnB1YmxpYyBjb25zdCBPVVQgPSAnb3V0JzsKCnB1YmxpYyBjb25zdCBTVEFUVVNfUkVBRFkgPSAncmVhZHknOwpwdWJsaWMgY29uc3QgU1RBVFVTX1NUQVJURUQgPSAnc3RhcnRlZCc7CnB1YmxpYyBjb25zdCBTVEFUVVNfVEVSTUlOQVRFRCA9ICd0ZXJtaW5hdGVkJzsKCnB1YmxpYyBjb25zdCBTVERJTiA9IDA7CnB1YmxpYyBjb25zdCBTVERPVVQgPSAxOwpwdWJsaWMgY29uc3QgU1RERVJSID0gMjsKCgpwdWJsaWMgY29uc3QgVElNRU9VVF9QUkVDSVNJT04gPSAwLjI7CgpwdWJsaWMgY29uc3QgSVRFUl9OT05fQkxPQ0tJTkcgPSAxOyAKcHVibGljIGNvbnN0IElURVJfS0VFUF9PVVRQVVQgPSAyOyAKcHVibGljIGNvbnN0IElURVJfU0tJUF9PVVQgPSA0OyAKcHVibGljIGNvbnN0IElURVJfU0tJUF9FUlIgPSA4OyAKCnByaXZhdGUgJGNhbGxiYWNrOwpwcml2YXRlICRoYXNDYWxsYmFjayA9IGZhbHNlOwpwcml2YXRlICRjb21tYW5kbGluZTsKcHJpdmF0ZSAkY3dkOwpwcml2YXRlICRlbnYgPSBbXTsKcHJpdmF0ZSAkaW5wdXQ7CnByaXZhdGUgJHN0YXJ0dGltZTsKcHJpdmF0ZSAkbGFzdE91dHB1dFRpbWU7CnByaXZhdGUgJHRpbWVvdXQ7CnByaXZhdGUgJGlkbGVUaW1lb3V0Owpwcml2YXRlICRleGl0Y29kZTsKcHJpdmF0ZSAkZmFsbGJhY2tTdGF0dXMgPSBbXTsKcHJpdmF0ZSAkcHJvY2Vzc0luZm9ybWF0aW9uOwpwcml2YXRlICRvdXRwdXREaXNhYmxlZCA9IGZhbHNlOwpwcml2YXRlICRzdGRvdXQ7CnByaXZhdGUgJHN0ZGVycjsKcHJpdmF0ZSAkcHJvY2VzczsKcHJpdmF0ZSAkc3RhdHVzID0gc2VsZjo6U1RBVFVTX1JFQURZOwpwcml2YXRlICRpbmNyZW1lbnRhbE91dHB1dE9mZnNldCA9IDA7CnByaXZhdGUgJGluY3JlbWVudGFsRXJyb3JPdXRwdXRPZmZzZXQgPSAwOwpwcml2YXRlICR0dHkgPSBmYWxzZTsKcHJpdmF0ZSAkcHR5Owpwcml2YXRlICRvcHRpb25zID0gWydzdXBwcmVzc19lcnJvcnMnID0+IHRydWUsICdieXBhc3Nfc2hlbGwnID0+IHRydWVdOwoKcHJpdmF0ZSAkdXNlRmlsZUhhbmRsZXMgPSBmYWxzZTsKCnByaXZhdGUgJHByb2Nlc3NQaXBlczsKCnByaXZhdGUgJGxhdGVzdFNpZ25hbDsKcHJpdmF0ZSAkY2FjaGVkRXhpdENvZGU7Cgpwcml2YXRlIHN0YXRpYyAkc2lnY2hpbGQ7CgoKCgoKCnB1YmxpYyBzdGF0aWMgJGV4aXRDb2RlcyA9IFsKMCA9PiAnT0snLAoxID0+ICdHZW5lcmFsIGVycm9yJywKMiA9PiAnTWlzdXNlIG9mIHNoZWxsIGJ1aWx0aW5zJywKCjEyNiA9PiAnSW52b2tlZCBjb21tYW5kIGNhbm5vdCBleGVjdXRlJywKMTI3ID0+ICdDb21tYW5kIG5vdCBmb3VuZCcsCjEyOCA9PiAnSW52YWxpZCBleGl0IGFyZ3VtZW50JywKCgoxMjkgPT4gJ0hhbmd1cCcsCjEzMCA9PiAnSW50ZXJydXB0JywKMTMxID0+ICdRdWl0IGFuZCBkdW1wIGNvcmUnLAoxMzIgPT4gJ0lsbGVnYWwgaW5zdHJ1Y3Rpb24nLAoxMzMgPT4gJ1RyYWNlL2JyZWFrcG9pbnQgdHJhcCcsCjEzNCA9PiAnUHJvY2VzcyBhYm9ydGVkJywKMTM1ID0+ICdCdXMgZXJyb3I6ICJhY2Nlc3MgdG8gdW5kZWZpbmVkIHBvcnRpb24gb2YgbWVtb3J5IG9iamVjdCInLAoxMzYgPT4gJ0Zsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbjogImVycm9uZW91cyBhcml0aG1ldGljIG9wZXJhdGlvbiInLAoxMzcgPT4gJ0tpbGwgKHRlcm1pbmF0ZSBpbW1lZGlhdGVseSknLAoxMzggPT4gJ1VzZXItZGVmaW5lZCAxJywKMTM5ID0+ICdTZWdtZW50YXRpb24gdmlvbGF0aW9uJywKMTQwID0+ICdVc2VyLWRlZmluZWQgMicsCjE0MSA9PiAnV3JpdGUgdG8gcGlwZSB3aXRoIG5vIG9uZSByZWFkaW5nJywKMTQyID0+ICdTaWduYWwgcmFpc2VkIGJ5IGFsYXJtJywKMTQzID0+ICdUZXJtaW5hdGlvbiAocmVxdWVzdCB0byB0ZXJtaW5hdGUpJywKCjE0NSA9PiAnQ2hpbGQgcHJvY2VzcyB0ZXJtaW5hdGVkLCBzdG9wcGVkIChvciBjb250aW51ZWQqKScsCjE0NiA9PiAnQ29udGludWUgaWYgc3RvcHBlZCcsCjE0NyA9PiAnU3RvcCBleGVjdXRpbmcgdGVtcG9yYXJpbHknLAoxNDggPT4gJ1Rlcm1pbmFsIHN0b3Agc2lnbmFsJywKMTQ5ID0+ICdCYWNrZ3JvdW5kIHByb2Nlc3MgYXR0ZW1wdGluZyB0byByZWFkIGZyb20gdHR5ICgiaW4iKScsCjE1MCA9PiAnQmFja2dyb3VuZCBwcm9jZXNzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdHR5ICgib3V0IiknLAoxNTEgPT4gJ1VyZ2VudCBkYXRhIGF2YWlsYWJsZSBvbiBzb2NrZXQnLAoxNTIgPT4gJ0NQVSB0aW1lIGxpbWl0IGV4Y2VlZGVkJywKMTUzID0+ICdGaWxlIHNpemUgbGltaXQgZXhjZWVkZWQnLAoxNTQgPT4gJ1NpZ25hbCByYWlzZWQgYnkgdGltZXIgY291bnRpbmcgdmlydHVhbCB0aW1lOiAidmlydHVhbCB0aW1lciBleHBpcmVkIicsCjE1NSA9PiAnUHJvZmlsaW5nIHRpbWVyIGV4cGlyZWQnLAoKMTU3ID0+ICdQb2xsYWJsZSBldmVudCcsCgoxNTkgPT4gJ0JhZCBzeXNjYWxsJywKXTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY29tbWFuZCwgP3N0cmluZyAkY3dkID0gbnVsbCwgP2FycmF5ICRlbnYgPSBudWxsLCAkaW5wdXQgPSBudWxsLCA/ZmxvYXQgJHRpbWVvdXQgPSA2MCkKewppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignVGhlIFByb2Nlc3MgY2xhc3MgcmVsaWVzIG9uIHByb2Nfb3Blbiwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBvbiB5b3VyIFBIUCBpbnN0YWxsYXRpb24uJyk7Cn0KCiR0aGlzLT5jb21tYW5kbGluZSA9ICRjb21tYW5kOwokdGhpcy0+Y3dkID0gJGN3ZDsKCgoKCgppZiAobnVsbCA9PT0gJHRoaXMtPmN3ZCAmJiAoXGRlZmluZWQoJ1pFTkRfVEhSRUFEX1NBRkUnKSB8fCAnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikpIHsKJHRoaXMtPmN3ZCA9IGdldGN3ZCgpOwp9CmlmIChudWxsICE9PSAkZW52KSB7CiR0aGlzLT5zZXRFbnYoJGVudik7Cn0KCiR0aGlzLT5zZXRJbnB1dCgkaW5wdXQpOwokdGhpcy0+c2V0VGltZW91dCgkdGltZW91dCk7CiR0aGlzLT51c2VGaWxlSGFuZGxlcyA9ICdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SOwokdGhpcy0+cHR5ID0gZmFsc2U7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tU2hlbGxDb21tYW5kbGluZShzdHJpbmcgJGNvbW1hbmQsID9zdHJpbmcgJGN3ZCA9IG51bGwsID9hcnJheSAkZW52ID0gbnVsbCwgJGlucHV0ID0gbnVsbCwgP2Zsb2F0ICR0aW1lb3V0ID0gNjApCnsKJHByb2Nlc3MgPSBuZXcgc3RhdGljKFtdLCAkY3dkLCAkZW52LCAkaW5wdXQsICR0aW1lb3V0KTsKJHByb2Nlc3MtPmNvbW1hbmRsaW5lID0gJGNvbW1hbmQ7CgpyZXR1cm4gJHByb2Nlc3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3NsZWVwKCkKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCBzZXJpYWxpemUgJy5fX0NMQVNTX18pOwp9CgpwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQp7CnRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignQ2Fubm90IHVuc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQp7CmlmICgkdGhpcy0+b3B0aW9uc1snY3JlYXRlX25ld19jb25zb2xlJ10gPz8gZmFsc2UpIHsKJHRoaXMtPnByb2Nlc3NQaXBlcy0+Y2xvc2UoKTsKfSBlbHNlIHsKJHRoaXMtPnN0b3AoMCk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKQp7CiR0aGlzLT5yZXNldFByb2Nlc3NEYXRhKCk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJ1big/Y2FsbGFibGUgJGNhbGxiYWNrID0gbnVsbCwgYXJyYXkgJGVudiA9IFtdKTogaW50CnsKJHRoaXMtPnN0YXJ0KCRjYWxsYmFjaywgJGVudik7CgpyZXR1cm4gJHRoaXMtPndhaXQoKTsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG11c3RSdW4oP2NhbGxhYmxlICRjYWxsYmFjayA9IG51bGwsIGFycmF5ICRlbnYgPSBbXSk6IHNlbGYKewppZiAoMCAhPT0gJHRoaXMtPnJ1bigkY2FsbGJhY2ssICRlbnYpKSB7CnRocm93IG5ldyBQcm9jZXNzRmFpbGVkRXhjZXB0aW9uKCR0aGlzKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN0YXJ0KD9jYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsLCBhcnJheSAkZW52ID0gW10pCnsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignUHJvY2VzcyBpcyBhbHJlYWR5IHJ1bm5pbmcuJyk7Cn0KCiR0aGlzLT5yZXNldFByb2Nlc3NEYXRhKCk7CiR0aGlzLT5zdGFydHRpbWUgPSAkdGhpcy0+bGFzdE91dHB1dFRpbWUgPSBtaWNyb3RpbWUodHJ1ZSk7CiR0aGlzLT5jYWxsYmFjayA9ICR0aGlzLT5idWlsZENhbGxiYWNrKCRjYWxsYmFjayk7CiR0aGlzLT5oYXNDYWxsYmFjayA9IG51bGwgIT09ICRjYWxsYmFjazsKJGRlc2NyaXB0b3JzID0gJHRoaXMtPmdldERlc2NyaXB0b3JzKCk7CgppZiAoJHRoaXMtPmVudikgewokZW52ICs9ICdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gYXJyYXlfZGlmZl91a2V5KCR0aGlzLT5lbnYsICRlbnYsICdzdHJjYXNlY21wJykgOiAkdGhpcy0+ZW52Owp9CgokZW52ICs9ICdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gYXJyYXlfZGlmZl91a2V5KCR0aGlzLT5nZXREZWZhdWx0RW52KCksICRlbnYsICdzdHJjYXNlY21wJykgOiAkdGhpcy0+Z2V0RGVmYXVsdEVudigpOwoKaWYgKFxpc19hcnJheSgkY29tbWFuZGxpbmUgPSAkdGhpcy0+Y29tbWFuZGxpbmUpKSB7CiRjb21tYW5kbGluZSA9IGltcGxvZGUoJyAnLCBhcnJheV9tYXAoWyR0aGlzLCAnZXNjYXBlQXJndW1lbnQnXSwgJGNvbW1hbmRsaW5lKSk7CgppZiAoJ1xcJyAhPT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKCiRjb21tYW5kbGluZSA9ICdleGVjICcuJGNvbW1hbmRsaW5lOwp9Cn0gZWxzZSB7CiRjb21tYW5kbGluZSA9ICR0aGlzLT5yZXBsYWNlUGxhY2Vob2xkZXJzKCRjb21tYW5kbGluZSwgJGVudik7Cn0KCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokY29tbWFuZGxpbmUgPSAkdGhpcy0+cHJlcGFyZVdpbmRvd3NDb21tYW5kTGluZSgkY29tbWFuZGxpbmUsICRlbnYpOwp9IGVsc2VpZiAoISR0aGlzLT51c2VGaWxlSGFuZGxlcyAmJiAkdGhpcy0+aXNTaWdjaGlsZEVuYWJsZWQoKSkgewoKJGRlc2NyaXB0b3JzWzNdID0gWydwaXBlJywgJ3cnXTsKCgokY29tbWFuZGxpbmUgPSAneyAoJy4kY29tbWFuZGxpbmUuJykgPCYzIDM8Ji0gMz4vZGV2L251bGwgJiB9IDM8JjA7JzsKJGNvbW1hbmRsaW5lIC49ICdwaWQ9JCE7IGVjaG8gJHBpZCA+JjM7IHdhaXQgJHBpZCAyPi9kZXYvbnVsbDsgY29kZT0kPzsgZWNobyAkY29kZSA+JjM7IGV4aXQgJGNvZGUnOwoKCgokcHRzV29ya2Fyb3VuZCA9IGZvcGVuKF9fRklMRV9fLCAncicpOwp9CgokZW52UGFpcnMgPSBbXTsKZm9yZWFjaCAoJGVudiBhcyAkayA9PiAkdikgewppZiAoZmFsc2UgIT09ICR2ICYmIGZhbHNlID09PSBcaW5fYXJyYXkoJGssIFsnYXJnYycsICdhcmd2JywgJ0FSR0MnLCAnQVJHViddLCB0cnVlKSkgewokZW52UGFpcnNbXSA9ICRrLic9Jy4kdjsKfQp9CgppZiAoIWlzX2RpcigkdGhpcy0+Y3dkKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgcHJvdmlkZWQgY3dkICIlcyIgZG9lcyBub3QgZXhpc3QuJywgJHRoaXMtPmN3ZCkpOwp9CgokdGhpcy0+cHJvY2VzcyA9IEBwcm9jX29wZW4oJGNvbW1hbmRsaW5lLCAkZGVzY3JpcHRvcnMsICR0aGlzLT5wcm9jZXNzUGlwZXMtPnBpcGVzLCAkdGhpcy0+Y3dkLCAkZW52UGFpcnMsICR0aGlzLT5vcHRpb25zKTsKCmlmICghJHRoaXMtPnByb2Nlc3MpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1VuYWJsZSB0byBsYXVuY2ggYSBuZXcgcHJvY2Vzcy4nKTsKfQokdGhpcy0+c3RhdHVzID0gc2VsZjo6U1RBVFVTX1NUQVJURUQ7CgppZiAoaXNzZXQoJGRlc2NyaXB0b3JzWzNdKSkgewokdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ3BpZCddID0gKGludCkgZmdldHMoJHRoaXMtPnByb2Nlc3NQaXBlcy0+cGlwZXNbM10pOwp9CgppZiAoJHRoaXMtPnR0eSkgewpyZXR1cm47Cn0KCiR0aGlzLT51cGRhdGVTdGF0dXMoZmFsc2UpOwokdGhpcy0+Y2hlY2tUaW1lb3V0KCk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc3RhcnQoP2NhbGxhYmxlICRjYWxsYmFjayA9IG51bGwsIGFycmF5ICRlbnYgPSBbXSk6IHNlbGYKewppZiAoJHRoaXMtPmlzUnVubmluZygpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdQcm9jZXNzIGlzIGFscmVhZHkgcnVubmluZy4nKTsKfQoKJHByb2Nlc3MgPSBjbG9uZSAkdGhpczsKJHByb2Nlc3MtPnN0YXJ0KCRjYWxsYmFjaywgJGVudik7CgpyZXR1cm4gJHByb2Nlc3M7Cn0KCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YWl0KD9jYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsKQp7CiR0aGlzLT5yZXF1aXJlUHJvY2Vzc0lzU3RhcnRlZChfX0ZVTkNUSU9OX18pOwoKJHRoaXMtPnVwZGF0ZVN0YXR1cyhmYWxzZSk7CgppZiAobnVsbCAhPT0gJGNhbGxiYWNrKSB7CmlmICghJHRoaXMtPnByb2Nlc3NQaXBlcy0+aGF2ZVJlYWRTdXBwb3J0KCkpIHsKJHRoaXMtPnN0b3AoMCk7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignUGFzcyB0aGUgY2FsbGJhY2sgdG8gdGhlICJQcm9jZXNzOjpzdGFydCIgbWV0aG9kIG9yIGNhbGwgZW5hYmxlT3V0cHV0IHRvIHVzZSBhIGNhbGxiYWNrIHdpdGggIlByb2Nlc3M6OndhaXQiLicpOwp9CiR0aGlzLT5jYWxsYmFjayA9ICR0aGlzLT5idWlsZENhbGxiYWNrKCRjYWxsYmFjayk7Cn0KCmRvIHsKJHRoaXMtPmNoZWNrVGltZW91dCgpOwokcnVubmluZyA9ICR0aGlzLT5pc1J1bm5pbmcoKSAmJiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgfHwgJHRoaXMtPnByb2Nlc3NQaXBlcy0+YXJlT3BlbigpKTsKJHRoaXMtPnJlYWRQaXBlcygkcnVubmluZywgJ1xcJyAhPT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgfHwgISRydW5uaW5nKTsKfSB3aGlsZSAoJHJ1bm5pbmcpOwoKd2hpbGUgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewokdGhpcy0+Y2hlY2tUaW1lb3V0KCk7CnVzbGVlcCgxMDAwKTsKfQoKaWYgKCR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3NpZ25hbGVkJ10gJiYgJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsndGVybXNpZyddICE9PSAkdGhpcy0+bGF0ZXN0U2lnbmFsKSB7CnRocm93IG5ldyBQcm9jZXNzU2lnbmFsZWRFeGNlcHRpb24oJHRoaXMpOwp9CgpyZXR1cm4gJHRoaXMtPmV4aXRjb2RlOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YWl0VW50aWwoY2FsbGFibGUgJGNhbGxiYWNrKTogYm9vbAp7CiR0aGlzLT5yZXF1aXJlUHJvY2Vzc0lzU3RhcnRlZChfX0ZVTkNUSU9OX18pOwokdGhpcy0+dXBkYXRlU3RhdHVzKGZhbHNlKTsKCmlmICghJHRoaXMtPnByb2Nlc3NQaXBlcy0+aGF2ZVJlYWRTdXBwb3J0KCkpIHsKJHRoaXMtPnN0b3AoMCk7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignUGFzcyB0aGUgY2FsbGJhY2sgdG8gdGhlICJQcm9jZXNzOjpzdGFydCIgbWV0aG9kIG9yIGNhbGwgZW5hYmxlT3V0cHV0IHRvIHVzZSBhIGNhbGxiYWNrIHdpdGggIlByb2Nlc3M6OndhaXRVbnRpbCIuJyk7Cn0KJGNhbGxiYWNrID0gJHRoaXMtPmJ1aWxkQ2FsbGJhY2soJGNhbGxiYWNrKTsKCiRyZWFkeSA9IGZhbHNlOwp3aGlsZSAodHJ1ZSkgewokdGhpcy0+Y2hlY2tUaW1lb3V0KCk7CiRydW5uaW5nID0gJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgPyAkdGhpcy0+aXNSdW5uaW5nKCkgOiAkdGhpcy0+cHJvY2Vzc1BpcGVzLT5hcmVPcGVuKCk7CiRvdXRwdXQgPSAkdGhpcy0+cHJvY2Vzc1BpcGVzLT5yZWFkQW5kV3JpdGUoJHJ1bm5pbmcsICdcXCcgIT09IFxESVJFQ1RPUllfU0VQQVJBVE9SIHx8ICEkcnVubmluZyk7Cgpmb3JlYWNoICgkb3V0cHV0IGFzICR0eXBlID0+ICRkYXRhKSB7CmlmICgzICE9PSAkdHlwZSkgewokcmVhZHkgPSAkY2FsbGJhY2soc2VsZjo6U1RET1VUID09PSAkdHlwZSA/IHNlbGY6Ok9VVCA6IHNlbGY6OkVSUiwgJGRhdGEpIHx8ICRyZWFkeTsKfSBlbHNlaWYgKCFpc3NldCgkdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ3NpZ25hbGVkJ10pKSB7CiR0aGlzLT5mYWxsYmFja1N0YXR1c1snZXhpdGNvZGUnXSA9IChpbnQpICRkYXRhOwp9Cn0KaWYgKCRyZWFkeSkgewpyZXR1cm4gdHJ1ZTsKfQppZiAoISRydW5uaW5nKSB7CnJldHVybiBmYWxzZTsKfQoKdXNsZWVwKDEwMDApOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBpZCgpCnsKcmV0dXJuICR0aGlzLT5pc1J1bm5pbmcoKSA/ICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3BpZCddIDogbnVsbDsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2lnbmFsKGludCAkc2lnbmFsKQp7CiR0aGlzLT5kb1NpZ25hbCgkc2lnbmFsLCB0cnVlKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZU91dHB1dCgpCnsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignRGlzYWJsaW5nIG91dHB1dCB3aGlsZSB0aGUgcHJvY2VzcyBpcyBydW5uaW5nIGlzIG5vdCBwb3NzaWJsZS4nKTsKfQppZiAobnVsbCAhPT0gJHRoaXMtPmlkbGVUaW1lb3V0KSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignT3V0cHV0IGNhbm5vdCBiZSBkaXNhYmxlZCB3aGlsZSBhbiBpZGxlIHRpbWVvdXQgaXMgc2V0LicpOwp9CgokdGhpcy0+b3V0cHV0RGlzYWJsZWQgPSB0cnVlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVuYWJsZU91dHB1dCgpCnsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignRW5hYmxpbmcgb3V0cHV0IHdoaWxlIHRoZSBwcm9jZXNzIGlzIHJ1bm5pbmcgaXMgbm90IHBvc3NpYmxlLicpOwp9CgokdGhpcy0+b3V0cHV0RGlzYWJsZWQgPSBmYWxzZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNPdXRwdXREaXNhYmxlZCgpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXREaXNhYmxlZDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0KCkKewokdGhpcy0+cmVhZFBpcGVzRm9yT3V0cHV0KF9fRlVOQ1RJT05fXyk7CgppZiAoZmFsc2UgPT09ICRyZXQgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCR0aGlzLT5zdGRvdXQsIC0xLCAwKSkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAkcmV0Owp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbmNyZW1lbnRhbE91dHB1dCgpCnsKJHRoaXMtPnJlYWRQaXBlc0Zvck91dHB1dChfX0ZVTkNUSU9OX18pOwoKJGxhdGVzdCA9IHN0cmVhbV9nZXRfY29udGVudHMoJHRoaXMtPnN0ZG91dCwgLTEsICR0aGlzLT5pbmNyZW1lbnRhbE91dHB1dE9mZnNldCk7CiR0aGlzLT5pbmNyZW1lbnRhbE91dHB1dE9mZnNldCA9IGZ0ZWxsKCR0aGlzLT5zdGRvdXQpOwoKaWYgKGZhbHNlID09PSAkbGF0ZXN0KSB7CnJldHVybiAnJzsKfQoKcmV0dXJuICRsYXRlc3Q7Cn0KCgoKCgoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKGludCAkZmxhZ3MgPSAwKQp7CiR0aGlzLT5yZWFkUGlwZXNGb3JPdXRwdXQoX19GVU5DVElPTl9fLCBmYWxzZSk7CgokY2xlYXJPdXRwdXQgPSAhKHNlbGY6OklURVJfS0VFUF9PVVRQVVQgJiAkZmxhZ3MpOwokYmxvY2tpbmcgPSAhKHNlbGY6OklURVJfTk9OX0JMT0NLSU5HICYgJGZsYWdzKTsKJHlpZWxkT3V0ID0gIShzZWxmOjpJVEVSX1NLSVBfT1VUICYgJGZsYWdzKTsKJHlpZWxkRXJyID0gIShzZWxmOjpJVEVSX1NLSVBfRVJSICYgJGZsYWdzKTsKCndoaWxlIChudWxsICE9PSAkdGhpcy0+Y2FsbGJhY2sgfHwgKCR5aWVsZE91dCAmJiAhZmVvZigkdGhpcy0+c3Rkb3V0KSkgfHwgKCR5aWVsZEVyciAmJiAhZmVvZigkdGhpcy0+c3RkZXJyKSkpIHsKaWYgKCR5aWVsZE91dCkgewokb3V0ID0gc3RyZWFtX2dldF9jb250ZW50cygkdGhpcy0+c3Rkb3V0LCAtMSwgJHRoaXMtPmluY3JlbWVudGFsT3V0cHV0T2Zmc2V0KTsKCmlmIChpc3NldCgkb3V0WzBdKSkgewppZiAoJGNsZWFyT3V0cHV0KSB7CiR0aGlzLT5jbGVhck91dHB1dCgpOwp9IGVsc2UgewokdGhpcy0+aW5jcmVtZW50YWxPdXRwdXRPZmZzZXQgPSBmdGVsbCgkdGhpcy0+c3Rkb3V0KTsKfQoKeWllbGQgc2VsZjo6T1VUID0+ICRvdXQ7Cn0KfQoKaWYgKCR5aWVsZEVycikgewokZXJyID0gc3RyZWFtX2dldF9jb250ZW50cygkdGhpcy0+c3RkZXJyLCAtMSwgJHRoaXMtPmluY3JlbWVudGFsRXJyb3JPdXRwdXRPZmZzZXQpOwoKaWYgKGlzc2V0KCRlcnJbMF0pKSB7CmlmICgkY2xlYXJPdXRwdXQpIHsKJHRoaXMtPmNsZWFyRXJyb3JPdXRwdXQoKTsKfSBlbHNlIHsKJHRoaXMtPmluY3JlbWVudGFsRXJyb3JPdXRwdXRPZmZzZXQgPSBmdGVsbCgkdGhpcy0+c3RkZXJyKTsKfQoKeWllbGQgc2VsZjo6RVJSID0+ICRlcnI7Cn0KfQoKaWYgKCEkYmxvY2tpbmcgJiYgIWlzc2V0KCRvdXRbMF0pICYmICFpc3NldCgkZXJyWzBdKSkgewp5aWVsZCBzZWxmOjpPVVQgPT4gJyc7Cn0KCiR0aGlzLT5jaGVja1RpbWVvdXQoKTsKJHRoaXMtPnJlYWRQaXBlc0Zvck91dHB1dChfX0ZVTkNUSU9OX18sICRibG9ja2luZyk7Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXJPdXRwdXQoKQp7CmZ0cnVuY2F0ZSgkdGhpcy0+c3Rkb3V0LCAwKTsKZnNlZWsoJHRoaXMtPnN0ZG91dCwgMCk7CiR0aGlzLT5pbmNyZW1lbnRhbE91dHB1dE9mZnNldCA9IDA7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9yT3V0cHV0KCkKewokdGhpcy0+cmVhZFBpcGVzRm9yT3V0cHV0KF9fRlVOQ1RJT05fXyk7CgppZiAoZmFsc2UgPT09ICRyZXQgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCR0aGlzLT5zdGRlcnIsIC0xLCAwKSkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAkcmV0Owp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5jcmVtZW50YWxFcnJvck91dHB1dCgpCnsKJHRoaXMtPnJlYWRQaXBlc0Zvck91dHB1dChfX0ZVTkNUSU9OX18pOwoKJGxhdGVzdCA9IHN0cmVhbV9nZXRfY29udGVudHMoJHRoaXMtPnN0ZGVyciwgLTEsICR0aGlzLT5pbmNyZW1lbnRhbEVycm9yT3V0cHV0T2Zmc2V0KTsKJHRoaXMtPmluY3JlbWVudGFsRXJyb3JPdXRwdXRPZmZzZXQgPSBmdGVsbCgkdGhpcy0+c3RkZXJyKTsKCmlmIChmYWxzZSA9PT0gJGxhdGVzdCkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAkbGF0ZXN0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhckVycm9yT3V0cHV0KCkKewpmdHJ1bmNhdGUoJHRoaXMtPnN0ZGVyciwgMCk7CmZzZWVrKCR0aGlzLT5zdGRlcnIsIDApOwokdGhpcy0+aW5jcmVtZW50YWxFcnJvck91dHB1dE9mZnNldCA9IDA7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEV4aXRDb2RlKCkKewokdGhpcy0+dXBkYXRlU3RhdHVzKGZhbHNlKTsKCnJldHVybiAkdGhpcy0+ZXhpdGNvZGU7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEV4aXRDb2RlVGV4dCgpCnsKaWYgKG51bGwgPT09ICRleGl0Y29kZSA9ICR0aGlzLT5nZXRFeGl0Q29kZSgpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gc2VsZjo6JGV4aXRDb2Rlc1skZXhpdGNvZGVdID8/ICdVbmtub3duIGVycm9yJzsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNTdWNjZXNzZnVsKCkKewpyZXR1cm4gMCA9PT0gJHRoaXMtPmdldEV4aXRDb2RlKCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNCZWVuU2lnbmFsZWQoKQp7CiR0aGlzLT5yZXF1aXJlUHJvY2Vzc0lzVGVybWluYXRlZChfX0ZVTkNUSU9OX18pOwoKcmV0dXJuICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3NpZ25hbGVkJ107Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGVybVNpZ25hbCgpCnsKJHRoaXMtPnJlcXVpcmVQcm9jZXNzSXNUZXJtaW5hdGVkKF9fRlVOQ1RJT05fXyk7CgppZiAoJHRoaXMtPmlzU2lnY2hpbGRFbmFibGVkKCkgJiYgLTEgPT09ICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3Rlcm1zaWcnXSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignVGhpcyBQSFAgaGFzIGJlZW4gY29tcGlsZWQgd2l0aCAtLWVuYWJsZS1zaWdjaGlsZC4gVGVybSBzaWduYWwgY2Fubm90IGJlIHJldHJpZXZlZC4nKTsKfQoKcmV0dXJuICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3Rlcm1zaWcnXTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0JlZW5TdG9wcGVkKCkKewokdGhpcy0+cmVxdWlyZVByb2Nlc3NJc1Rlcm1pbmF0ZWQoX19GVU5DVElPTl9fKTsKCnJldHVybiAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydzdG9wcGVkJ107Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdG9wU2lnbmFsKCkKewokdGhpcy0+cmVxdWlyZVByb2Nlc3NJc1Rlcm1pbmF0ZWQoX19GVU5DVElPTl9fKTsKCnJldHVybiAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydzdG9wc2lnJ107Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUnVubmluZygpCnsKaWYgKHNlbGY6OlNUQVRVU19TVEFSVEVEICE9PSAkdGhpcy0+c3RhdHVzKSB7CnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPnVwZGF0ZVN0YXR1cyhmYWxzZSk7CgpyZXR1cm4gJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsncnVubmluZyddOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1N0YXJ0ZWQoKQp7CnJldHVybiBzZWxmOjpTVEFUVVNfUkVBRFkgIT0gJHRoaXMtPnN0YXR1czsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNUZXJtaW5hdGVkKCkKewokdGhpcy0+dXBkYXRlU3RhdHVzKGZhbHNlKTsKCnJldHVybiBzZWxmOjpTVEFUVVNfVEVSTUlOQVRFRCA9PSAkdGhpcy0+c3RhdHVzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXR1cygpCnsKJHRoaXMtPnVwZGF0ZVN0YXR1cyhmYWxzZSk7CgpyZXR1cm4gJHRoaXMtPnN0YXR1czsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RvcChmbG9hdCAkdGltZW91dCA9IDEwLCA/aW50ICRzaWduYWwgPSBudWxsKQp7CiR0aW1lb3V0TWljcm8gPSBtaWNyb3RpbWUodHJ1ZSkgKyAkdGltZW91dDsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewoKJHRoaXMtPmRvU2lnbmFsKDE1LCBmYWxzZSk7CmRvIHsKdXNsZWVwKDEwMDApOwp9IHdoaWxlICgkdGhpcy0+aXNSdW5uaW5nKCkgJiYgbWljcm90aW1lKHRydWUpIDwgJHRpbWVvdXRNaWNybyk7CgppZiAoJHRoaXMtPmlzUnVubmluZygpKSB7CgoKJHRoaXMtPmRvU2lnbmFsKCRzaWduYWwgPzogOSwgZmFsc2UpOwp9Cn0KCmlmICgkdGhpcy0+aXNSdW5uaW5nKCkpIHsKaWYgKGlzc2V0KCR0aGlzLT5mYWxsYmFja1N0YXR1c1sncGlkJ10pKSB7CnVuc2V0KCR0aGlzLT5mYWxsYmFja1N0YXR1c1sncGlkJ10pOwoKcmV0dXJuICR0aGlzLT5zdG9wKDAsICRzaWduYWwpOwp9CiR0aGlzLT5jbG9zZSgpOwp9CgpyZXR1cm4gJHRoaXMtPmV4aXRjb2RlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRPdXRwdXQoc3RyaW5nICRsaW5lKQp7CiR0aGlzLT5sYXN0T3V0cHV0VGltZSA9IG1pY3JvdGltZSh0cnVlKTsKCmZzZWVrKCR0aGlzLT5zdGRvdXQsIDAsIFxTRUVLX0VORCk7CmZ3cml0ZSgkdGhpcy0+c3Rkb3V0LCAkbGluZSk7CmZzZWVrKCR0aGlzLT5zdGRvdXQsICR0aGlzLT5pbmNyZW1lbnRhbE91dHB1dE9mZnNldCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEVycm9yT3V0cHV0KHN0cmluZyAkbGluZSkKewokdGhpcy0+bGFzdE91dHB1dFRpbWUgPSBtaWNyb3RpbWUodHJ1ZSk7Cgpmc2VlaygkdGhpcy0+c3RkZXJyLCAwLCBcU0VFS19FTkQpOwpmd3JpdGUoJHRoaXMtPnN0ZGVyciwgJGxpbmUpOwpmc2VlaygkdGhpcy0+c3RkZXJyLCAkdGhpcy0+aW5jcmVtZW50YWxFcnJvck91dHB1dE9mZnNldCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMYXN0T3V0cHV0VGltZSgpOiA/ZmxvYXQKewpyZXR1cm4gJHRoaXMtPmxhc3RPdXRwdXRUaW1lOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kTGluZSgpCnsKcmV0dXJuIFxpc19hcnJheSgkdGhpcy0+Y29tbWFuZGxpbmUpID8gaW1wbG9kZSgnICcsIGFycmF5X21hcChbJHRoaXMsICdlc2NhcGVBcmd1bWVudCddLCAkdGhpcy0+Y29tbWFuZGxpbmUpKSA6ICR0aGlzLT5jb21tYW5kbGluZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGltZW91dCgpCnsKcmV0dXJuICR0aGlzLT50aW1lb3V0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJZGxlVGltZW91dCgpCnsKcmV0dXJuICR0aGlzLT5pZGxlVGltZW91dDsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXQoP2Zsb2F0ICR0aW1lb3V0KQp7CiR0aGlzLT50aW1lb3V0ID0gJHRoaXMtPnZhbGlkYXRlVGltZW91dCgkdGltZW91dCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SWRsZVRpbWVvdXQoP2Zsb2F0ICR0aW1lb3V0KQp7CmlmIChudWxsICE9PSAkdGltZW91dCAmJiAkdGhpcy0+b3V0cHV0RGlzYWJsZWQpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdJZGxlIHRpbWVvdXQgY2Fubm90IGJlIHNldCB3aGlsZSB0aGUgb3V0cHV0IGlzIGRpc2FibGVkLicpOwp9CgokdGhpcy0+aWRsZVRpbWVvdXQgPSAkdGhpcy0+dmFsaWRhdGVUaW1lb3V0KCR0aW1lb3V0KTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUdHkoYm9vbCAkdHR5KQp7CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiAmJiAkdHR5KSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdUVFkgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgcGxhdGZvcm0uJyk7Cn0KCmlmICgkdHR5ICYmICFzZWxmOjppc1R0eVN1cHBvcnRlZCgpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdUVFkgbW9kZSByZXF1aXJlcyAvZGV2L3R0eSB0byBiZSByZWFkL3dyaXRhYmxlLicpOwp9CgokdGhpcy0+dHR5ID0gJHR0eTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNUdHkoKQp7CnJldHVybiAkdGhpcy0+dHR5Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQdHkoYm9vbCAkYm9vbCkKewokdGhpcy0+cHR5ID0gJGJvb2w7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUHR5KCkKewpyZXR1cm4gJHRoaXMtPnB0eTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0V29ya2luZ0RpcmVjdG9yeSgpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5jd2QpIHsKCgpyZXR1cm4gZ2V0Y3dkKCkgPzogbnVsbDsKfQoKcmV0dXJuICR0aGlzLT5jd2Q7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFdvcmtpbmdEaXJlY3Rvcnkoc3RyaW5nICRjd2QpCnsKJHRoaXMtPmN3ZCA9ICRjd2Q7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVudigpCnsKcmV0dXJuICR0aGlzLT5lbnY7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RW52KGFycmF5ICRlbnYpCnsKJHRoaXMtPmVudiA9ICRlbnY7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElucHV0KCkKewpyZXR1cm4gJHRoaXMtPmlucHV0Owp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnB1dCgkaW5wdXQpCnsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0lucHV0IGNhbm5vdCBiZSBzZXQgd2hpbGUgdGhlIHByb2Nlc3MgaXMgcnVubmluZy4nKTsKfQoKJHRoaXMtPmlucHV0ID0gUHJvY2Vzc1V0aWxzOjp2YWxpZGF0ZUlucHV0KF9fTUVUSE9EX18sICRpbnB1dCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrVGltZW91dCgpCnsKaWYgKHNlbGY6OlNUQVRVU19TVEFSVEVEICE9PSAkdGhpcy0+c3RhdHVzKSB7CnJldHVybjsKfQoKaWYgKG51bGwgIT09ICR0aGlzLT50aW1lb3V0ICYmICR0aGlzLT50aW1lb3V0IDwgbWljcm90aW1lKHRydWUpIC0gJHRoaXMtPnN0YXJ0dGltZSkgewokdGhpcy0+c3RvcCgwKTsKCnRocm93IG5ldyBQcm9jZXNzVGltZWRPdXRFeGNlcHRpb24oJHRoaXMsIFByb2Nlc3NUaW1lZE91dEV4Y2VwdGlvbjo6VFlQRV9HRU5FUkFMKTsKfQoKaWYgKG51bGwgIT09ICR0aGlzLT5pZGxlVGltZW91dCAmJiAkdGhpcy0+aWRsZVRpbWVvdXQgPCBtaWNyb3RpbWUodHJ1ZSkgLSAkdGhpcy0+bGFzdE91dHB1dFRpbWUpIHsKJHRoaXMtPnN0b3AoMCk7Cgp0aHJvdyBuZXcgUHJvY2Vzc1RpbWVkT3V0RXhjZXB0aW9uKCR0aGlzLCBQcm9jZXNzVGltZWRPdXRFeGNlcHRpb246OlRZUEVfSURMRSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXJ0VGltZSgpOiBmbG9hdAp7CmlmICghJHRoaXMtPmlzU3RhcnRlZCgpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignU3RhcnQgdGltZSBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciBwcm9jZXNzIHN0YXJ0LicpOwp9CgpyZXR1cm4gJHRoaXMtPnN0YXJ0dGltZTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9ucyhhcnJheSAkb3B0aW9ucykKewppZiAoJHRoaXMtPmlzUnVubmluZygpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdTZXR0aW5nIG9wdGlvbnMgd2hpbGUgdGhlIHByb2Nlc3MgaXMgcnVubmluZyBpcyBub3QgcG9zc2libGUuJyk7Cn0KCiRkZWZhdWx0T3B0aW9ucyA9ICR0aGlzLT5vcHRpb25zOwokZXhpc3RpbmdPcHRpb25zID0gWydibG9ja2luZ19waXBlcycsICdjcmVhdGVfcHJvY2Vzc19ncm91cCcsICdjcmVhdGVfbmV3X2NvbnNvbGUnXTsKCmZvcmVhY2ggKCRvcHRpb25zIGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmICghXGluX2FycmF5KCRrZXksICRleGlzdGluZ09wdGlvbnMpKSB7CiR0aGlzLT5vcHRpb25zID0gJGRlZmF1bHRPcHRpb25zOwp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignSW52YWxpZCBvcHRpb24gIiVzIiBwYXNzZWQgdG8gIiVzKCkiLiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmUgIiVzIi4nLCAka2V5LCBfX01FVEhPRF9fLCBpbXBsb2RlKCciLCAiJywgJGV4aXN0aW5nT3B0aW9ucykpKTsKfQokdGhpcy0+b3B0aW9uc1ska2V5XSA9ICR2YWx1ZTsKfQp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzVHR5U3VwcG9ydGVkKCk6IGJvb2wKewpzdGF0aWMgJGlzVHR5U3VwcG9ydGVkOwoKaWYgKG51bGwgPT09ICRpc1R0eVN1cHBvcnRlZCkgewokaXNUdHlTdXBwb3J0ZWQgPSAoYm9vbCkgQHByb2Nfb3BlbignZWNobyAxID4vZGV2L251bGwnLCBbWydmaWxlJywgJy9kZXYvdHR5JywgJ3InXSwgWydmaWxlJywgJy9kZXYvdHR5JywgJ3cnXSwgWydmaWxlJywgJy9kZXYvdHR5JywgJ3cnXV0sICRwaXBlcyk7Cn0KCnJldHVybiAkaXNUdHlTdXBwb3J0ZWQ7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1B0eVN1cHBvcnRlZCgpCnsKc3RhdGljICRyZXN1bHQ7CgppZiAobnVsbCAhPT0gJHJlc3VsdCkgewpyZXR1cm4gJHJlc3VsdDsKfQoKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CnJldHVybiAkcmVzdWx0ID0gZmFsc2U7Cn0KCnJldHVybiAkcmVzdWx0ID0gKGJvb2wpIEBwcm9jX29wZW4oJ2VjaG8gMSA+L2Rldi9udWxsJywgW1sncHR5J10sIFsncHR5J10sIFsncHR5J11dLCAkcGlwZXMpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldERlc2NyaXB0b3JzKCk6IGFycmF5CnsKaWYgKCR0aGlzLT5pbnB1dCBpbnN0YW5jZW9mIFxJdGVyYXRvcikgewokdGhpcy0+aW5wdXQtPnJld2luZCgpOwp9CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokdGhpcy0+cHJvY2Vzc1BpcGVzID0gbmV3IFdpbmRvd3NQaXBlcygkdGhpcy0+aW5wdXQsICEkdGhpcy0+b3V0cHV0RGlzYWJsZWQgfHwgJHRoaXMtPmhhc0NhbGxiYWNrKTsKfSBlbHNlIHsKJHRoaXMtPnByb2Nlc3NQaXBlcyA9IG5ldyBVbml4UGlwZXMoJHRoaXMtPmlzVHR5KCksICR0aGlzLT5pc1B0eSgpLCAkdGhpcy0+aW5wdXQsICEkdGhpcy0+b3V0cHV0RGlzYWJsZWQgfHwgJHRoaXMtPmhhc0NhbGxiYWNrKTsKfQoKcmV0dXJuICR0aGlzLT5wcm9jZXNzUGlwZXMtPmdldERlc2NyaXB0b3JzKCk7Cn0KCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYnVpbGRDYWxsYmFjayg/Y2FsbGFibGUgJGNhbGxiYWNrID0gbnVsbCkKewppZiAoJHRoaXMtPm91dHB1dERpc2FibGVkKSB7CnJldHVybiBmdW5jdGlvbiAoJHR5cGUsICRkYXRhKSB1c2UgKCRjYWxsYmFjayk6IGJvb2wgewpyZXR1cm4gbnVsbCAhPT0gJGNhbGxiYWNrICYmICRjYWxsYmFjaygkdHlwZSwgJGRhdGEpOwp9Owp9Cgokb3V0ID0gc2VsZjo6T1VUOwoKcmV0dXJuIGZ1bmN0aW9uICgkdHlwZSwgJGRhdGEpIHVzZSAoJGNhbGxiYWNrLCAkb3V0KTogYm9vbCB7CmlmICgkb3V0ID09ICR0eXBlKSB7CiR0aGlzLT5hZGRPdXRwdXQoJGRhdGEpOwp9IGVsc2UgewokdGhpcy0+YWRkRXJyb3JPdXRwdXQoJGRhdGEpOwp9CgpyZXR1cm4gbnVsbCAhPT0gJGNhbGxiYWNrICYmICRjYWxsYmFjaygkdHlwZSwgJGRhdGEpOwp9Owp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB1cGRhdGVTdGF0dXMoYm9vbCAkYmxvY2tpbmcpCnsKaWYgKHNlbGY6OlNUQVRVU19TVEFSVEVEICE9PSAkdGhpcy0+c3RhdHVzKSB7CnJldHVybjsKfQoKJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvbiA9IHByb2NfZ2V0X3N0YXR1cygkdGhpcy0+cHJvY2Vzcyk7CiRydW5uaW5nID0gJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsncnVubmluZyddOwoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMzAwKSB7CmlmICghaXNzZXQoJHRoaXMtPmNhY2hlZEV4aXRDb2RlKSAmJiAhJHJ1bm5pbmcgJiYgLTEgIT09ICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ2V4aXRjb2RlJ10pIHsKJHRoaXMtPmNhY2hlZEV4aXRDb2RlID0gJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsnZXhpdGNvZGUnXTsKfQoKaWYgKGlzc2V0KCR0aGlzLT5jYWNoZWRFeGl0Q29kZSkgJiYgISRydW5uaW5nICYmIC0xID09PSAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydleGl0Y29kZSddKSB7CiR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ2V4aXRjb2RlJ10gPSAkdGhpcy0+Y2FjaGVkRXhpdENvZGU7Cn0KfQoKJHRoaXMtPnJlYWRQaXBlcygkcnVubmluZyAmJiAkYmxvY2tpbmcsICdcXCcgIT09IFxESVJFQ1RPUllfU0VQQVJBVE9SIHx8ICEkcnVubmluZyk7CgppZiAoJHRoaXMtPmZhbGxiYWNrU3RhdHVzICYmICR0aGlzLT5pc1NpZ2NoaWxkRW5hYmxlZCgpKSB7CiR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb24gPSAkdGhpcy0+ZmFsbGJhY2tTdGF0dXMgKyAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uOwp9CgppZiAoISRydW5uaW5nKSB7CiR0aGlzLT5jbG9zZSgpOwp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGlzU2lnY2hpbGRFbmFibGVkKCkKewppZiAobnVsbCAhPT0gc2VsZjo6JHNpZ2NoaWxkKSB7CnJldHVybiBzZWxmOjokc2lnY2hpbGQ7Cn0KCmlmICghXGZ1bmN0aW9uX2V4aXN0cygncGhwaW5mbycpKSB7CnJldHVybiBzZWxmOjokc2lnY2hpbGQgPSBmYWxzZTsKfQoKb2Jfc3RhcnQoKTsKcGhwaW5mbyhcSU5GT19HRU5FUkFMKTsKCnJldHVybiBzZWxmOjokc2lnY2hpbGQgPSBzdHJfY29udGFpbnMob2JfZ2V0X2NsZWFuKCksICctLWVuYWJsZS1zaWdjaGlsZCcpOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVhZFBpcGVzRm9yT3V0cHV0KHN0cmluZyAkY2FsbGVyLCBib29sICRibG9ja2luZyA9IGZhbHNlKQp7CmlmICgkdGhpcy0+b3V0cHV0RGlzYWJsZWQpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdPdXRwdXQgaGFzIGJlZW4gZGlzYWJsZWQuJyk7Cn0KCiR0aGlzLT5yZXF1aXJlUHJvY2Vzc0lzU3RhcnRlZCgkY2FsbGVyKTsKCiR0aGlzLT51cGRhdGVTdGF0dXMoJGJsb2NraW5nKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlVGltZW91dCg/ZmxvYXQgJHRpbWVvdXQpOiA/ZmxvYXQKewokdGltZW91dCA9IChmbG9hdCkgJHRpbWVvdXQ7CgppZiAoMC4wID09PSAkdGltZW91dCkgewokdGltZW91dCA9IG51bGw7Cn0gZWxzZWlmICgkdGltZW91dCA8IDApIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIHRpbWVvdXQgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIHBvc2l0aXZlIGludGVnZXIgb3IgZmxvYXQgbnVtYmVyLicpOwp9CgpyZXR1cm4gJHRpbWVvdXQ7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVhZFBpcGVzKGJvb2wgJGJsb2NraW5nLCBib29sICRjbG9zZSkKewokcmVzdWx0ID0gJHRoaXMtPnByb2Nlc3NQaXBlcy0+cmVhZEFuZFdyaXRlKCRibG9ja2luZywgJGNsb3NlKTsKCiRjYWxsYmFjayA9ICR0aGlzLT5jYWxsYmFjazsKZm9yZWFjaCAoJHJlc3VsdCBhcyAkdHlwZSA9PiAkZGF0YSkgewppZiAoMyAhPT0gJHR5cGUpIHsKJGNhbGxiYWNrKHNlbGY6OlNURE9VVCA9PT0gJHR5cGUgPyBzZWxmOjpPVVQgOiBzZWxmOjpFUlIsICRkYXRhKTsKfSBlbHNlaWYgKCFpc3NldCgkdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ3NpZ25hbGVkJ10pKSB7CiR0aGlzLT5mYWxsYmFja1N0YXR1c1snZXhpdGNvZGUnXSA9IChpbnQpICRkYXRhOwp9Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNsb3NlKCk6IGludAp7CiR0aGlzLT5wcm9jZXNzUGlwZXMtPmNsb3NlKCk7CmlmICgkdGhpcy0+cHJvY2Vzcykgewpwcm9jX2Nsb3NlKCR0aGlzLT5wcm9jZXNzKTsKJHRoaXMtPnByb2Nlc3MgPSBudWxsOwp9CiR0aGlzLT5leGl0Y29kZSA9ICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ2V4aXRjb2RlJ107CiR0aGlzLT5zdGF0dXMgPSBzZWxmOjpTVEFUVVNfVEVSTUlOQVRFRDsKCmlmICgtMSA9PT0gJHRoaXMtPmV4aXRjb2RlKSB7CmlmICgkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydzaWduYWxlZCddICYmIDAgPCAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWyd0ZXJtc2lnJ10pIHsKCiR0aGlzLT5leGl0Y29kZSA9IDEyOCArICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3Rlcm1zaWcnXTsKfSBlbHNlaWYgKCR0aGlzLT5pc1NpZ2NoaWxkRW5hYmxlZCgpKSB7CiR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3NpZ25hbGVkJ10gPSB0cnVlOwokdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWyd0ZXJtc2lnJ10gPSAtMTsKfQp9CgoKCgokdGhpcy0+Y2FsbGJhY2sgPSBudWxsOwoKcmV0dXJuICR0aGlzLT5leGl0Y29kZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXNldFByb2Nlc3NEYXRhKCkKewokdGhpcy0+c3RhcnR0aW1lID0gbnVsbDsKJHRoaXMtPmNhbGxiYWNrID0gbnVsbDsKJHRoaXMtPmV4aXRjb2RlID0gbnVsbDsKJHRoaXMtPmZhbGxiYWNrU3RhdHVzID0gW107CiR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb24gPSBudWxsOwokdGhpcy0+c3Rkb3V0ID0gZm9wZW4oJ3BocDovL3RlbXAvbWF4bWVtb3J5OicuKDEwMjQgKiAxMDI0KSwgJ3crJyk7CiR0aGlzLT5zdGRlcnIgPSBmb3BlbigncGhwOi8vdGVtcC9tYXhtZW1vcnk6Jy4oMTAyNCAqIDEwMjQpLCAndysnKTsKJHRoaXMtPnByb2Nlc3MgPSBudWxsOwokdGhpcy0+bGF0ZXN0U2lnbmFsID0gbnVsbDsKJHRoaXMtPnN0YXR1cyA9IHNlbGY6OlNUQVRVU19SRUFEWTsKJHRoaXMtPmluY3JlbWVudGFsT3V0cHV0T2Zmc2V0ID0gMDsKJHRoaXMtPmluY3JlbWVudGFsRXJyb3JPdXRwdXRPZmZzZXQgPSAwOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb1NpZ25hbChpbnQgJHNpZ25hbCwgYm9vbCAkdGhyb3dFeGNlcHRpb24pOiBib29sCnsKaWYgKG51bGwgPT09ICRwaWQgPSAkdGhpcy0+Z2V0UGlkKCkpIHsKaWYgKCR0aHJvd0V4Y2VwdGlvbikgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0Nhbm5vdCBzZW5kIHNpZ25hbCBvbiBhIG5vbiBydW5uaW5nIHByb2Nlc3MuJyk7Cn0KCnJldHVybiBmYWxzZTsKfQoKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CmV4ZWMoc3ByaW50ZigndGFza2tpbGwgL0YgL1QgL1BJRCAlZCAyPiYxJywgJHBpZCksICRvdXRwdXQsICRleGl0Q29kZSk7CmlmICgkZXhpdENvZGUgJiYgJHRoaXMtPmlzUnVubmluZygpKSB7CmlmICgkdGhyb3dFeGNlcHRpb24pIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVW5hYmxlIHRvIGtpbGwgdGhlIHByb2Nlc3MgKCVzKS4nLCBpbXBsb2RlKCcgJywgJG91dHB1dCkpKTsKfQoKcmV0dXJuIGZhbHNlOwp9Cn0gZWxzZSB7CmlmICghJHRoaXMtPmlzU2lnY2hpbGRFbmFibGVkKCkpIHsKJG9rID0gQHByb2NfdGVybWluYXRlKCR0aGlzLT5wcm9jZXNzLCAkc2lnbmFsKTsKfSBlbHNlaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2tpbGwnKSkgewokb2sgPSBAcG9zaXhfa2lsbCgkcGlkLCAkc2lnbmFsKTsKfSBlbHNlaWYgKCRvayA9IHByb2Nfb3BlbihzcHJpbnRmKCdraWxsIC0lZCAlZCcsICRzaWduYWwsICRwaWQpLCBbMiA9PiBbJ3BpcGUnLCAndyddXSwgJHBpcGVzKSkgewokb2sgPSBmYWxzZSA9PT0gZmdldHMoJHBpcGVzWzJdKTsKfQppZiAoISRvaykgewppZiAoJHRocm93RXhjZXB0aW9uKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ0Vycm9yIHdoaWxlIHNlbmRpbmcgc2lnbmFsICIlcyIuJywgJHNpZ25hbCkpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KfQoKJHRoaXMtPmxhdGVzdFNpZ25hbCA9ICRzaWduYWw7CiR0aGlzLT5mYWxsYmFja1N0YXR1c1snc2lnbmFsZWQnXSA9IHRydWU7CiR0aGlzLT5mYWxsYmFja1N0YXR1c1snZXhpdGNvZGUnXSA9IC0xOwokdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ3Rlcm1zaWcnXSA9ICR0aGlzLT5sYXRlc3RTaWduYWw7CgpyZXR1cm4gdHJ1ZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBwcmVwYXJlV2luZG93c0NvbW1hbmRMaW5lKHN0cmluZyAkY21kLCBhcnJheSAmJGVudik6IHN0cmluZwp7CiR1aWQgPSB1bmlxaWQoJycsIHRydWUpOwokdmFyQ291bnQgPSAwOwokdmFyQ2FjaGUgPSBbXTsKJGNtZCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygKJy8iKD86KAogICAgICAgICAgICAgICAgW14iJSFeXSorCiAgICAgICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICAgICAoPzogIUxGISB8ICIoPzpcXlslIV5dKT8rIiApCiAgICAgICAgICAgICAgICAgICAgW14iJSFeXSorCiAgICAgICAgICAgICAgICApKysKICAgICAgICAgICAgKSB8IFteIl0qKyApIi94JywKZnVuY3Rpb24gKCRtKSB1c2UgKCYkZW52LCAmJHZhckNhY2hlLCAmJHZhckNvdW50LCAkdWlkKSB7CmlmICghaXNzZXQoJG1bMV0pKSB7CnJldHVybiAkbVswXTsKfQppZiAoaXNzZXQoJHZhckNhY2hlWyRtWzBdXSkpIHsKcmV0dXJuICR2YXJDYWNoZVskbVswXV07Cn0KaWYgKHN0cl9jb250YWlucygkdmFsdWUgPSAkbVsxXSwgIlwwIikpIHsKJHZhbHVlID0gc3RyX3JlcGxhY2UoIlwwIiwgJz8nLCAkdmFsdWUpOwp9CmlmIChmYWxzZSA9PT0gc3RycGJyaygkdmFsdWUsICJcIiUhXG4iKSkgewpyZXR1cm4gJyInLiR2YWx1ZS4nIic7Cn0KCiR2YWx1ZSA9IHN0cl9yZXBsYWNlKFsnIUxGIScsICciXiEiJywgJyJeJSInLCAnIl5eIicsICciIiddLCBbIlxuIiwgJyEnLCAnJScsICdeJywgJyInXSwgJHZhbHVlKTsKJHZhbHVlID0gJyInLnByZWdfcmVwbGFjZSgnLyhcXFxcKikiLycsICckMSQxXFwiJywgJHZhbHVlKS4nIic7CiR2YXIgPSAkdWlkLisrJHZhckNvdW50OwoKJGVudlskdmFyXSA9ICR2YWx1ZTsKCnJldHVybiAkdmFyQ2FjaGVbJG1bMF1dID0gJyEnLiR2YXIuJyEnOwp9LAokY21kCik7CgpzdGF0aWMgJGNvbVNwZWM7CgppZiAoISRjb21TcGVjICYmICRjb21TcGVjID0gKG5ldyBFeGVjdXRhYmxlRmluZGVyKCkpLT5maW5kKCdjbWQuZXhlJykpIHsKCiRjb21TcGVjID0gJyInLnByZWdfcmVwbGFjZSgneyhcXFxcKispIn0nLCAnJDEkMVwiJywgJGNvbVNwZWMpIC4nIic7Cn0KCiRjbWQgPSAoJGNvbVNwZWMgPz8gJ2NtZCcpLicgL1Y6T04gL0U6T04gL0QgL0MgKCcuc3RyX3JlcGxhY2UoIlxuIiwgJyAnLCAkY21kKS4nKSc7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzUGlwZXMtPmdldEZpbGVzKCkgYXMgJG9mZnNldCA9PiAkZmlsZW5hbWUpIHsKJGNtZCAuPSAnICcuJG9mZnNldC4nPiInLiRmaWxlbmFtZS4nIic7Cn0KCnJldHVybiAkY21kOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVxdWlyZVByb2Nlc3NJc1N0YXJ0ZWQoc3RyaW5nICRmdW5jdGlvbk5hbWUpCnsKaWYgKCEkdGhpcy0+aXNTdGFydGVkKCkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ1Byb2Nlc3MgbXVzdCBiZSBzdGFydGVkIGJlZm9yZSBjYWxsaW5nICIlcygpIi4nLCAkZnVuY3Rpb25OYW1lKSk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcXVpcmVQcm9jZXNzSXNUZXJtaW5hdGVkKHN0cmluZyAkZnVuY3Rpb25OYW1lKQp7CmlmICghJHRoaXMtPmlzVGVybWluYXRlZCgpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdQcm9jZXNzIG11c3QgYmUgdGVybWluYXRlZCBiZWZvcmUgY2FsbGluZyAiJXMoKSIuJywgJGZ1bmN0aW9uTmFtZSkpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZXNjYXBlQXJndW1lbnQoP3N0cmluZyAkYXJndW1lbnQpOiBzdHJpbmcKewppZiAoJycgPT09ICRhcmd1bWVudCB8fCBudWxsID09PSAkYXJndW1lbnQpIHsKcmV0dXJuICciIic7Cn0KaWYgKCdcXCcgIT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CnJldHVybiAiJyIuc3RyX3JlcGxhY2UoIiciLCAiJ1xcJyciLCAkYXJndW1lbnQpLiInIjsKfQppZiAoc3RyX2NvbnRhaW5zKCRhcmd1bWVudCwgIlwwIikpIHsKJGFyZ3VtZW50ID0gc3RyX3JlcGxhY2UoIlwwIiwgJz8nLCAkYXJndW1lbnQpOwp9CmlmICghcHJlZ19tYXRjaCgnL1soKSUhXiI8PiZ8XHNdLycsICRhcmd1bWVudCkpIHsKcmV0dXJuICRhcmd1bWVudDsKfQokYXJndW1lbnQgPSBwcmVnX3JlcGxhY2UoJy8oXFxcXCspJC8nLCAnJDEkMScsICRhcmd1bWVudCk7CgpyZXR1cm4gJyInLnN0cl9yZXBsYWNlKFsnIicsICdeJywgJyUnLCAnIScsICJcbiJdLCBbJyIiJywgJyJeXiInLCAnIl4lIicsICciXiEiJywgJyFMRiEnXSwgJGFyZ3VtZW50KS4nIic7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcmVwbGFjZVBsYWNlaG9sZGVycyhzdHJpbmcgJGNvbW1hbmRsaW5lLCBhcnJheSAkZW52KQp7CnJldHVybiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy8iXCRcezooW19hLXpBLVpdKytbX2EtekEtWjAtOV0qKylcfSIvJywgZnVuY3Rpb24gKCRtYXRjaGVzKSB1c2UgKCRjb21tYW5kbGluZSwgJGVudikgewppZiAoIWlzc2V0KCRlbnZbJG1hdGNoZXNbMV1dKSB8fCBmYWxzZSA9PT0gJGVudlskbWF0Y2hlc1sxXV0pIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdDb21tYW5kIGxpbmUgaXMgbWlzc2luZyBhIHZhbHVlIGZvciBwYXJhbWV0ZXIgIiVzIjogJywgJG1hdGNoZXNbMV0pLiRjb21tYW5kbGluZSk7Cn0KCnJldHVybiAkdGhpcy0+ZXNjYXBlQXJndW1lbnQoJGVudlskbWF0Y2hlc1sxXV0pOwp9LCAkY29tbWFuZGxpbmUpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldERlZmF1bHRFbnYoKTogYXJyYXkKewokZW52ID0gZ2V0ZW52KCk7CiRlbnYgPSAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgPyBhcnJheV9pbnRlcnNlY3RfdWtleSgkZW52LCAkX1NFUlZFUiwgJ3N0cmNhc2VjbXAnKSA6IGFycmF5X2ludGVyc2VjdF9rZXkoJGVudiwgJF9TRVJWRVIpKSA/OiAkZW52OwoKcmV0dXJuICRfRU5WICsgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gYXJyYXlfZGlmZl91a2V5KCRlbnYsICRfRU5WLCAnc3RyY2FzZWNtcCcpIDogJGVudik7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3M7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKCgoKCgoKCmNsYXNzIFByb2Nlc3NVdGlscwp7CgoKCnByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQoc3RyaW5nICRjYWxsZXIsICRpbnB1dCkKewppZiAobnVsbCAhPT0gJGlucHV0KSB7CmlmIChcaXNfcmVzb3VyY2UoJGlucHV0KSkgewpyZXR1cm4gJGlucHV0Owp9CmlmIChcaXNfc3RyaW5nKCRpbnB1dCkpIHsKcmV0dXJuICRpbnB1dDsKfQppZiAoXGlzX3NjYWxhcigkaW5wdXQpKSB7CnJldHVybiAoc3RyaW5nKSAkaW5wdXQ7Cn0KaWYgKCRpbnB1dCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKcmV0dXJuICRpbnB1dC0+Z2V0SXRlcmF0b3IoJGlucHV0OjpJVEVSX1NLSVBfRVJSKTsKfQppZiAoJGlucHV0IGluc3RhbmNlb2YgXEl0ZXJhdG9yKSB7CnJldHVybiAkaW5wdXQ7Cn0KaWYgKCRpbnB1dCBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpyZXR1cm4gbmV3IFxJdGVyYXRvckl0ZXJhdG9yKCRpbnB1dCk7Cn0KCnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignIiVzIiBvbmx5IGFjY2VwdHMgc3RyaW5ncywgVHJhdmVyc2FibGUgb2JqZWN0cyBvciBzdHJlYW0gcmVzb3VyY2VzLicsICRjYWxsZXIpKTsKfQoKcmV0dXJuICRpbnB1dDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxBdHRyaWJ1dGU7CgoKCgoKCgoKCiNbXEF0dHJpYnV0ZShcQXR0cmlidXRlOjpUQVJHRVRfTUVUSE9EIHwgXEF0dHJpYnV0ZTo6VEFSR0VUX1BST1BFUlRZKV0KZmluYWwgY2xhc3MgUmVxdWlyZWQKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxBdHRyaWJ1dGU7Cgp1c2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxTZXJ2aWNlU3Vic2NyaWJlclRyYWl0OwoKCgoKCgoKI1tcQXR0cmlidXRlKFxBdHRyaWJ1dGU6OlRBUkdFVF9NRVRIT0QpXQpmaW5hbCBjbGFzcyBTdWJzY3JpYmVkU2VydmljZQp7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCnB1YmxpYyA/c3RyaW5nICRrZXkgPSBudWxsCikgewp9Cn0KCkNvcHlyaWdodCAoYykgMjAxOC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2U7CgoKCgoKCgoKCgoKCgoKaW50ZXJmYWNlIFJlc2V0SW50ZXJmYWNlCnsKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlOwoKdXNlIFBzclxDb250YWluZXJcQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgUHNyXENvbnRhaW5lclxOb3RGb3VuZEV4Y2VwdGlvbkludGVyZmFjZTsKCgpjbGFzc19leGlzdHMoQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlOjpjbGFzcyk7CmNsYXNzX2V4aXN0cyhOb3RGb3VuZEV4Y2VwdGlvbkludGVyZmFjZTo6Y2xhc3MpOwoKCgoKCgoKdHJhaXQgU2VydmljZUxvY2F0b3JUcmFpdAp7CnByaXZhdGUgJGZhY3RvcmllczsKcHJpdmF0ZSAkbG9hZGluZyA9IFtdOwpwcml2YXRlICRwcm92aWRlZFR5cGVzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRmYWN0b3JpZXMpCnsKJHRoaXMtPmZhY3RvcmllcyA9ICRmYWN0b3JpZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcyhzdHJpbmcgJGlkKQp7CnJldHVybiBpc3NldCgkdGhpcy0+ZmFjdG9yaWVzWyRpZF0pOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICRpZCkKewppZiAoIWlzc2V0KCR0aGlzLT5mYWN0b3JpZXNbJGlkXSkpIHsKdGhyb3cgJHRoaXMtPmNyZWF0ZU5vdEZvdW5kRXhjZXB0aW9uKCRpZCk7Cn0KCmlmIChpc3NldCgkdGhpcy0+bG9hZGluZ1skaWRdKSkgewokaWRzID0gYXJyYXlfdmFsdWVzKCR0aGlzLT5sb2FkaW5nKTsKJGlkcyA9IFxhcnJheV9zbGljZSgkdGhpcy0+bG9hZGluZywgYXJyYXlfc2VhcmNoKCRpZCwgJGlkcykpOwokaWRzW10gPSAkaWQ7Cgp0aHJvdyAkdGhpcy0+Y3JlYXRlQ2lyY3VsYXJSZWZlcmVuY2VFeGNlcHRpb24oJGlkLCAkaWRzKTsKfQoKJHRoaXMtPmxvYWRpbmdbJGlkXSA9ICRpZDsKdHJ5IHsKcmV0dXJuICR0aGlzLT5mYWN0b3JpZXNbJGlkXSgkdGhpcyk7Cn0gZmluYWxseSB7CnVuc2V0KCR0aGlzLT5sb2FkaW5nWyRpZF0pOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlZFNlcnZpY2VzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5wcm92aWRlZFR5cGVzKSB7CiR0aGlzLT5wcm92aWRlZFR5cGVzID0gW107Cgpmb3JlYWNoICgkdGhpcy0+ZmFjdG9yaWVzIGFzICRuYW1lID0+ICRmYWN0b3J5KSB7CmlmICghXGlzX2NhbGxhYmxlKCRmYWN0b3J5KSkgewokdGhpcy0+cHJvdmlkZWRUeXBlc1skbmFtZV0gPSAnPyc7Cn0gZWxzZSB7CiR0eXBlID0gKG5ldyBcUmVmbGVjdGlvbkZ1bmN0aW9uKCRmYWN0b3J5KSktPmdldFJldHVyblR5cGUoKTsKCiR0aGlzLT5wcm92aWRlZFR5cGVzWyRuYW1lXSA9ICR0eXBlID8gKCR0eXBlLT5hbGxvd3NOdWxsKCkgPyAnPycgOiAnJykuKCR0eXBlIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25OYW1lZFR5cGUgPyAkdHlwZS0+Z2V0TmFtZSgpIDogJHR5cGUpIDogJz8nOwp9Cn0KfQoKcmV0dXJuICR0aGlzLT5wcm92aWRlZFR5cGVzOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZU5vdEZvdW5kRXhjZXB0aW9uKHN0cmluZyAkaWQpOiBOb3RGb3VuZEV4Y2VwdGlvbkludGVyZmFjZQp7CmlmICghJGFsdGVybmF0aXZlcyA9IGFycmF5X2tleXMoJHRoaXMtPmZhY3RvcmllcykpIHsKJG1lc3NhZ2UgPSAnaXMgZW1wdHkuLi4nOwp9IGVsc2UgewokbGFzdCA9IGFycmF5X3BvcCgkYWx0ZXJuYXRpdmVzKTsKaWYgKCRhbHRlcm5hdGl2ZXMpIHsKJG1lc3NhZ2UgPSBzcHJpbnRmKCdvbmx5IGtub3dzIGFib3V0IHRoZSAiJXMiIGFuZCAiJXMiIHNlcnZpY2VzLicsIGltcGxvZGUoJyIsICInLCAkYWx0ZXJuYXRpdmVzKSwgJGxhc3QpOwp9IGVsc2UgewokbWVzc2FnZSA9IHNwcmludGYoJ29ubHkga25vd3MgYWJvdXQgdGhlICIlcyIgc2VydmljZS4nLCAkbGFzdCk7Cn0KfQoKaWYgKCR0aGlzLT5sb2FkaW5nKSB7CiRtZXNzYWdlID0gc3ByaW50ZignVGhlIHNlcnZpY2UgIiVzIiBoYXMgYSBkZXBlbmRlbmN5IG9uIGEgbm9uLWV4aXN0ZW50IHNlcnZpY2UgIiVzIi4gVGhpcyBsb2NhdG9yICVzJywgZW5kKCR0aGlzLT5sb2FkaW5nKSwgJGlkLCAkbWVzc2FnZSk7Cn0gZWxzZSB7CiRtZXNzYWdlID0gc3ByaW50ZignU2VydmljZSAiJXMiIG5vdCBmb3VuZDogdGhlIGN1cnJlbnQgc2VydmljZSBsb2NhdG9yICVzJywgJGlkLCAkbWVzc2FnZSk7Cn0KCnJldHVybiBuZXcgY2xhc3MoJG1lc3NhZ2UpIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzIE5vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlIHsKfTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVDaXJjdWxhclJlZmVyZW5jZUV4Y2VwdGlvbihzdHJpbmcgJGlkLCBhcnJheSAkcGF0aCk6IENvbnRhaW5lckV4Y2VwdGlvbkludGVyZmFjZQp7CnJldHVybiBuZXcgY2xhc3Moc3ByaW50ZignQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzZXJ2aWNlICIlcyIsIHBhdGg6ICIlcyIuJywgJGlkLCBpbXBsb2RlKCcgLT4gJywgJHBhdGgpKSkgZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIENvbnRhaW5lckV4Y2VwdGlvbkludGVyZmFjZSB7Cn07Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2U7Cgp1c2UgUHNyXENvbnRhaW5lclxDb250YWluZXJJbnRlcmZhY2U7CgoKCgoKCgppbnRlcmZhY2UgU2VydmljZVByb3ZpZGVySW50ZXJmYWNlIGV4dGVuZHMgQ29udGFpbmVySW50ZXJmYWNlCnsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdmlkZWRTZXJ2aWNlcygpOiBhcnJheTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2U7CgoKCgoKCgoKCgoKCgoKCgppbnRlcmZhY2UgU2VydmljZVN1YnNjcmliZXJJbnRlcmZhY2UKewoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFN1YnNjcmliZWRTZXJ2aWNlcygpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZTsKCnVzZSBQc3JcQ29udGFpbmVyXENvbnRhaW5lckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2VcQXR0cmlidXRlXFN1YnNjcmliZWRTZXJ2aWNlOwoKCgoKCgoKdHJhaXQgU2VydmljZVN1YnNjcmliZXJUcmFpdAp7Cgpwcm90ZWN0ZWQgJGNvbnRhaW5lcjsKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3Vic2NyaWJlZFNlcnZpY2VzKCk6IGFycmF5CnsKJHNlcnZpY2VzID0gbWV0aG9kX2V4aXN0cyhnZXRfcGFyZW50X2NsYXNzKHNlbGY6OmNsYXNzKSA/OiAnJywgX19GVU5DVElPTl9fKSA/IHBhcmVudDo6Z2V0U3Vic2NyaWJlZFNlcnZpY2VzKCkgOiBbXTsKJGF0dHJpYnV0ZU9wdEluID0gZmFsc2U7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwKSB7CmZvcmVhY2ggKChuZXcgXFJlZmxlY3Rpb25DbGFzcyhzZWxmOjpjbGFzcykpLT5nZXRNZXRob2RzKCkgYXMgJG1ldGhvZCkgewppZiAoc2VsZjo6Y2xhc3MgIT09ICRtZXRob2QtPmdldERlY2xhcmluZ0NsYXNzKCktPm5hbWUpIHsKY29udGludWU7Cn0KCmlmICghJGF0dHJpYnV0ZSA9ICRtZXRob2QtPmdldEF0dHJpYnV0ZXMoU3Vic2NyaWJlZFNlcnZpY2U6OmNsYXNzKVswXSA/PyBudWxsKSB7CmNvbnRpbnVlOwp9CgppZiAoJG1ldGhvZC0+aXNTdGF0aWMoKSB8fCAkbWV0aG9kLT5pc0Fic3RyYWN0KCkgfHwgJG1ldGhvZC0+aXNHZW5lcmF0b3IoKSB8fCAkbWV0aG9kLT5pc0ludGVybmFsKCkgfHwgJG1ldGhvZC0+Z2V0TnVtYmVyT2ZSZXF1aXJlZFBhcmFtZXRlcnMoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0Nhbm5vdCB1c2UgIiVzIiBvbiBtZXRob2QgIiVzOjolcygpIiAoY2FuIG9ubHkgYmUgdXNlZCBvbiBub24tc3RhdGljLCBub24tYWJzdHJhY3QgbWV0aG9kcyB3aXRoIG5vIHBhcmFtZXRlcnMpLicsIFN1YnNjcmliZWRTZXJ2aWNlOjpjbGFzcywgc2VsZjo6Y2xhc3MsICRtZXRob2QtPm5hbWUpKTsKfQoKaWYgKCEkcmV0dXJuVHlwZSA9ICRtZXRob2QtPmdldFJldHVyblR5cGUoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0Nhbm5vdCB1c2UgIiVzIiBvbiBtZXRob2RzIHdpdGhvdXQgYSByZXR1cm4gdHlwZSBpbiAiJXM6OiVzKCkiLicsIFN1YnNjcmliZWRTZXJ2aWNlOjpjbGFzcywgJG1ldGhvZC0+bmFtZSwgc2VsZjo6Y2xhc3MpKTsKfQoKJHNlcnZpY2VJZCA9ICRyZXR1cm5UeXBlIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25OYW1lZFR5cGUgPyAkcmV0dXJuVHlwZS0+Z2V0TmFtZSgpIDogKHN0cmluZykgJHJldHVyblR5cGU7CgppZiAoJHJldHVyblR5cGUtPmFsbG93c051bGwoKSkgewokc2VydmljZUlkID0gJz8nLiRzZXJ2aWNlSWQ7Cn0KCiRzZXJ2aWNlc1skYXR0cmlidXRlLT5uZXdJbnN0YW5jZSgpLT5rZXkgPz8gc2VsZjo6Y2xhc3MuJzo6Jy4kbWV0aG9kLT5uYW1lXSA9ICRzZXJ2aWNlSWQ7CiRhdHRyaWJ1dGVPcHRJbiA9IHRydWU7Cn0KfQoKaWYgKCEkYXR0cmlidXRlT3B0SW4pIHsKZm9yZWFjaCAoKG5ldyBcUmVmbGVjdGlvbkNsYXNzKHNlbGY6OmNsYXNzKSktPmdldE1ldGhvZHMoKSBhcyAkbWV0aG9kKSB7CmlmICgkbWV0aG9kLT5pc1N0YXRpYygpIHx8ICRtZXRob2QtPmlzQWJzdHJhY3QoKSB8fCAkbWV0aG9kLT5pc0dlbmVyYXRvcigpIHx8ICRtZXRob2QtPmlzSW50ZXJuYWwoKSB8fCAkbWV0aG9kLT5nZXROdW1iZXJPZlJlcXVpcmVkUGFyYW1ldGVycygpKSB7CmNvbnRpbnVlOwp9CgppZiAoc2VsZjo6Y2xhc3MgIT09ICRtZXRob2QtPmdldERlY2xhcmluZ0NsYXNzKCktPm5hbWUpIHsKY29udGludWU7Cn0KCmlmICghKCRyZXR1cm5UeXBlID0gJG1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpKSBpbnN0YW5jZW9mIFxSZWZsZWN0aW9uTmFtZWRUeXBlKSB7CmNvbnRpbnVlOwp9CgppZiAoJHJldHVyblR5cGUtPmlzQnVpbHRpbigpKSB7CmNvbnRpbnVlOwp9CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwKSB7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMnLCAnMi41JywgJ1VzaW5nICIlcyIgaW4gIiVzIiB3aXRob3V0IHVzaW5nIHRoZSAiJXMiIGF0dHJpYnV0ZSBvbiBhbnkgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuJywgU2VydmljZVN1YnNjcmliZXJUcmFpdDo6Y2xhc3MsIHNlbGY6OmNsYXNzLCBTdWJzY3JpYmVkU2VydmljZTo6Y2xhc3MpOwp9Cgokc2VydmljZXNbc2VsZjo6Y2xhc3MuJzo6Jy4kbWV0aG9kLT5uYW1lXSA9ICc/Jy4oJHJldHVyblR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbk5hbWVkVHlwZSA/ICRyZXR1cm5UeXBlLT5nZXROYW1lKCkgOiAkcmV0dXJuVHlwZSk7Cn0KfQoKcmV0dXJuICRzZXJ2aWNlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29udGFpbmVyKENvbnRhaW5lckludGVyZmFjZSAkY29udGFpbmVyKQp7CiRyZXQgPSBudWxsOwppZiAobWV0aG9kX2V4aXN0cyhnZXRfcGFyZW50X2NsYXNzKHNlbGY6OmNsYXNzKSA/OiAnJywgX19GVU5DVElPTl9fKSkgewokcmV0ID0gcGFyZW50OjpzZXRDb250YWluZXIoJGNvbnRhaW5lcik7Cn0KCiR0aGlzLT5jb250YWluZXIgPSAkY29udGFpbmVyOwoKcmV0dXJuICRyZXQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2VcVGVzdDsKCmNsYXNzX2FsaWFzKFNlcnZpY2VMb2NhdG9yVGVzdENhc2U6OmNsYXNzLCBTZXJ2aWNlTG9jYXRvclRlc3Q6OmNsYXNzKTsKCmlmIChmYWxzZSkgewoKCgpjbGFzcyBTZXJ2aWNlTG9jYXRvclRlc3QKewp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlXFRlc3Q7Cgp1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7CnVzZSBQc3JcQ29udGFpbmVyXENvbnRhaW5lckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2VcU2VydmljZUxvY2F0b3JUcmFpdDsKCmFic3RyYWN0IGNsYXNzIFNlcnZpY2VMb2NhdG9yVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZQp7CgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRTZXJ2aWNlTG9jYXRvcihhcnJheSAkZmFjdG9yaWVzKQp7CnJldHVybiBuZXcgY2xhc3MoJGZhY3RvcmllcykgaW1wbGVtZW50cyBDb250YWluZXJJbnRlcmZhY2Ugewp1c2UgU2VydmljZUxvY2F0b3JUcmFpdDsKfTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RIYXMoKQp7CiRsb2NhdG9yID0gJHRoaXMtPmdldFNlcnZpY2VMb2NhdG9yKFsKJ2ZvbycgPT4gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ2Jhcic7IH0sCidiYXInID0+IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdiYXonOyB9LApmdW5jdGlvbiAoKSB7IHJldHVybiAnZHVtbXknOyB9LApdKTsKCiR0aGlzLT5hc3NlcnRUcnVlKCRsb2NhdG9yLT5oYXMoJ2ZvbycpKTsKJHRoaXMtPmFzc2VydFRydWUoJGxvY2F0b3ItPmhhcygnYmFyJykpOwokdGhpcy0+YXNzZXJ0RmFsc2UoJGxvY2F0b3ItPmhhcygnZHVtbXknKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0ZXN0R2V0KCkKewokbG9jYXRvciA9ICR0aGlzLT5nZXRTZXJ2aWNlTG9jYXRvcihbCidmb28nID0+IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdiYXInOyB9LAonYmFyJyA9PiBmdW5jdGlvbiAoKSB7IHJldHVybiAnYmF6JzsgfSwKXSk7CgokdGhpcy0+YXNzZXJ0U2FtZSgnYmFyJywgJGxvY2F0b3ItPmdldCgnZm9vJykpOwokdGhpcy0+YXNzZXJ0U2FtZSgnYmF6JywgJGxvY2F0b3ItPmdldCgnYmFyJykpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdGVzdEdldERvZXNOb3RNZW1vaXplKCkKewokaSA9IDA7CiRsb2NhdG9yID0gJHRoaXMtPmdldFNlcnZpY2VMb2NhdG9yKFsKJ2ZvbycgPT4gZnVuY3Rpb24gKCkgdXNlICgmJGkpIHsKKyskaTsKCnJldHVybiAnYmFyJzsKfSwKXSk7CgokdGhpcy0+YXNzZXJ0U2FtZSgnYmFyJywgJGxvY2F0b3ItPmdldCgnZm9vJykpOwokdGhpcy0+YXNzZXJ0U2FtZSgnYmFyJywgJGxvY2F0b3ItPmdldCgnZm9vJykpOwokdGhpcy0+YXNzZXJ0U2FtZSgyLCAkaSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0ZXN0VGhyb3dzT25VbmRlZmluZWRJbnRlcm5hbFNlcnZpY2UoKQp7CmlmICghJHRoaXMtPmdldEV4cGVjdGVkRXhjZXB0aW9uKCkpIHsKJHRoaXMtPmV4cGVjdEV4Y2VwdGlvbihcUHNyXENvbnRhaW5lclxOb3RGb3VuZEV4Y2VwdGlvbkludGVyZmFjZTo6Y2xhc3MpOwokdGhpcy0+ZXhwZWN0RXhjZXB0aW9uTWVzc2FnZSgnVGhlIHNlcnZpY2UgImZvbyIgaGFzIGEgZGVwZW5kZW5jeSBvbiBhIG5vbi1leGlzdGVudCBzZXJ2aWNlICJiYXIiLiBUaGlzIGxvY2F0b3Igb25seSBrbm93cyBhYm91dCB0aGUgImZvbyIgc2VydmljZS4nKTsKfQokbG9jYXRvciA9ICR0aGlzLT5nZXRTZXJ2aWNlTG9jYXRvcihbCidmb28nID0+IGZ1bmN0aW9uICgpIHVzZSAoJiRsb2NhdG9yKSB7IHJldHVybiAkbG9jYXRvci0+Z2V0KCdiYXInKTsgfSwKXSk7CgokbG9jYXRvci0+Z2V0KCdmb28nKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RUaHJvd3NPbkNpcmN1bGFyUmVmZXJlbmNlKCkKewokdGhpcy0+ZXhwZWN0RXhjZXB0aW9uKFxQc3JcQ29udGFpbmVyXENvbnRhaW5lckV4Y2VwdGlvbkludGVyZmFjZTo6Y2xhc3MpOwokdGhpcy0+ZXhwZWN0RXhjZXB0aW9uTWVzc2FnZSgnQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzZXJ2aWNlICJiYXIiLCBwYXRoOiAiYmFyIC0+IGJheiAtPiBiYXIiLicpOwokbG9jYXRvciA9ICR0aGlzLT5nZXRTZXJ2aWNlTG9jYXRvcihbCidmb28nID0+IGZ1bmN0aW9uICgpIHVzZSAoJiRsb2NhdG9yKSB7IHJldHVybiAkbG9jYXRvci0+Z2V0KCdiYXInKTsgfSwKJ2JhcicgPT4gZnVuY3Rpb24gKCkgdXNlICgmJGxvY2F0b3IpIHsgcmV0dXJuICRsb2NhdG9yLT5nZXQoJ2JheicpOyB9LAonYmF6JyA9PiBmdW5jdGlvbiAoKSB1c2UgKCYkbG9jYXRvcikgeyByZXR1cm4gJGxvY2F0b3ItPmdldCgnYmFyJyk7IH0sCl0pOwoKJGxvY2F0b3ItPmdldCgnZm9vJyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZzsKCnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXEV4Y2VwdGlvbkludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdHJpbmcgaW1wbGVtZW50cyBcU3RyaW5nYWJsZSwgXEpzb25TZXJpYWxpemFibGUKewpwdWJsaWMgY29uc3QgUFJFR19QQVRURVJOX09SREVSID0gXFBSRUdfUEFUVEVSTl9PUkRFUjsKcHVibGljIGNvbnN0IFBSRUdfU0VUX09SREVSID0gXFBSRUdfU0VUX09SREVSOwpwdWJsaWMgY29uc3QgUFJFR19PRkZTRVRfQ0FQVFVSRSA9IFxQUkVHX09GRlNFVF9DQVBUVVJFOwpwdWJsaWMgY29uc3QgUFJFR19VTk1BVENIRURfQVNfTlVMTCA9IFxQUkVHX1VOTUFUQ0hFRF9BU19OVUxMOwoKcHVibGljIGNvbnN0IFBSRUdfU1BMSVQgPSAwOwpwdWJsaWMgY29uc3QgUFJFR19TUExJVF9OT19FTVBUWSA9IFxQUkVHX1NQTElUX05PX0VNUFRZOwpwdWJsaWMgY29uc3QgUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFID0gXFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRTsKcHVibGljIGNvbnN0IFBSRUdfU1BMSVRfT0ZGU0VUX0NBUFRVUkUgPSBcUFJFR19TUExJVF9PRkZTRVRfQ0FQVFVSRTsKCnByb3RlY3RlZCAkc3RyaW5nID0gJyc7CnByb3RlY3RlZCAkaWdub3JlQ2FzZSA9IGZhbHNlOwoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc3RyaW5nID0gJycpOwoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVud3JhcChhcnJheSAkdmFsdWVzKTogYXJyYXkKewpmb3JlYWNoICgkdmFsdWVzIGFzICRrID0+ICR2KSB7CmlmICgkdiBpbnN0YW5jZW9mIHNlbGYpIHsKJHZhbHVlc1ska10gPSAkdi0+X190b1N0cmluZygpOwp9IGVsc2VpZiAoXGlzX2FycmF5KCR2KSAmJiAkdmFsdWVzWyRrXSAhPT0gJHYgPSBzdGF0aWM6OnVud3JhcCgkdikpIHsKJHZhbHVlc1ska10gPSAkdjsKfQp9CgpyZXR1cm4gJHZhbHVlczsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdyYXAoYXJyYXkgJHZhbHVlcyk6IGFycmF5CnsKJGkgPSAwOwoka2V5cyA9IG51bGw7Cgpmb3JlYWNoICgkdmFsdWVzIGFzICRrID0+ICR2KSB7CmlmIChcaXNfc3RyaW5nKCRrKSAmJiAnJyAhPT0gJGsgJiYgJGsgIT09ICRqID0gKHN0cmluZykgbmV3IHN0YXRpYygkaykpIHsKJGtleXMgPSAka2V5cyA/PyBhcnJheV9rZXlzKCR2YWx1ZXMpOwoka2V5c1skaV0gPSAkajsKfQoKaWYgKFxpc19zdHJpbmcoJHYpKSB7CiR2YWx1ZXNbJGtdID0gbmV3IHN0YXRpYygkdik7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJHYpICYmICR2YWx1ZXNbJGtdICE9PSAkdiA9IHN0YXRpYzo6d3JhcCgkdikpIHsKJHZhbHVlc1ska10gPSAkdjsKfQoKKyskaTsKfQoKcmV0dXJuIG51bGwgIT09ICRrZXlzID8gYXJyYXlfY29tYmluZSgka2V5cywgJHZhbHVlcykgOiAkdmFsdWVzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZnRlcigkbmVlZGxlLCBib29sICRpbmNsdWRlTmVlZGxlID0gZmFsc2UsIGludCAkb2Zmc2V0ID0gMCk6IHNlbGYKewokc3RyID0gY2xvbmUgJHRoaXM7CiRpID0gXFBIUF9JTlRfTUFYOwoKZm9yZWFjaCAoKGFycmF5KSAkbmVlZGxlIGFzICRuKSB7CiRuID0gKHN0cmluZykgJG47CiRqID0gJHRoaXMtPmluZGV4T2YoJG4sICRvZmZzZXQpOwoKaWYgKG51bGwgIT09ICRqICYmICRqIDwgJGkpIHsKJGkgPSAkajsKJHN0ci0+c3RyaW5nID0gJG47Cn0KfQoKaWYgKFxQSFBfSU5UX01BWCA9PT0gJGkpIHsKcmV0dXJuICRzdHI7Cn0KCmlmICghJGluY2x1ZGVOZWVkbGUpIHsKJGkgKz0gJHN0ci0+bGVuZ3RoKCk7Cn0KCnJldHVybiAkdGhpcy0+c2xpY2UoJGkpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZnRlckxhc3QoJG5lZWRsZSwgYm9vbCAkaW5jbHVkZU5lZWRsZSA9IGZhbHNlLCBpbnQgJG9mZnNldCA9IDApOiBzZWxmCnsKJHN0ciA9IGNsb25lICR0aGlzOwokaSA9IG51bGw7Cgpmb3JlYWNoICgoYXJyYXkpICRuZWVkbGUgYXMgJG4pIHsKJG4gPSAoc3RyaW5nKSAkbjsKJGogPSAkdGhpcy0+aW5kZXhPZkxhc3QoJG4sICRvZmZzZXQpOwoKaWYgKG51bGwgIT09ICRqICYmICRqID49ICRpKSB7CiRpID0gJG9mZnNldCA9ICRqOwokc3RyLT5zdHJpbmcgPSAkbjsKfQp9CgppZiAobnVsbCA9PT0gJGkpIHsKcmV0dXJuICRzdHI7Cn0KCmlmICghJGluY2x1ZGVOZWVkbGUpIHsKJGkgKz0gJHN0ci0+bGVuZ3RoKCk7Cn0KCnJldHVybiAkdGhpcy0+c2xpY2UoJGkpOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gYXBwZW5kKHN0cmluZyAuLi4kc3VmZml4KTogc2VsZjsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGJlZm9yZSgkbmVlZGxlLCBib29sICRpbmNsdWRlTmVlZGxlID0gZmFsc2UsIGludCAkb2Zmc2V0ID0gMCk6IHNlbGYKewokc3RyID0gY2xvbmUgJHRoaXM7CiRpID0gXFBIUF9JTlRfTUFYOwoKZm9yZWFjaCAoKGFycmF5KSAkbmVlZGxlIGFzICRuKSB7CiRuID0gKHN0cmluZykgJG47CiRqID0gJHRoaXMtPmluZGV4T2YoJG4sICRvZmZzZXQpOwoKaWYgKG51bGwgIT09ICRqICYmICRqIDwgJGkpIHsKJGkgPSAkajsKJHN0ci0+c3RyaW5nID0gJG47Cn0KfQoKaWYgKFxQSFBfSU5UX01BWCA9PT0gJGkpIHsKcmV0dXJuICRzdHI7Cn0KCmlmICgkaW5jbHVkZU5lZWRsZSkgewokaSArPSAkc3RyLT5sZW5ndGgoKTsKfQoKcmV0dXJuICR0aGlzLT5zbGljZSgwLCAkaSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGJlZm9yZUxhc3QoJG5lZWRsZSwgYm9vbCAkaW5jbHVkZU5lZWRsZSA9IGZhbHNlLCBpbnQgJG9mZnNldCA9IDApOiBzZWxmCnsKJHN0ciA9IGNsb25lICR0aGlzOwokaSA9IG51bGw7Cgpmb3JlYWNoICgoYXJyYXkpICRuZWVkbGUgYXMgJG4pIHsKJG4gPSAoc3RyaW5nKSAkbjsKJGogPSAkdGhpcy0+aW5kZXhPZkxhc3QoJG4sICRvZmZzZXQpOwoKaWYgKG51bGwgIT09ICRqICYmICRqID49ICRpKSB7CiRpID0gJG9mZnNldCA9ICRqOwokc3RyLT5zdHJpbmcgPSAkbjsKfQp9CgppZiAobnVsbCA9PT0gJGkpIHsKcmV0dXJuICRzdHI7Cn0KCmlmICgkaW5jbHVkZU5lZWRsZSkgewokaSArPSAkc3RyLT5sZW5ndGgoKTsKfQoKcmV0dXJuICR0aGlzLT5zbGljZSgwLCAkaSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBieXRlc0F0KGludCAkb2Zmc2V0KTogYXJyYXkKewokc3RyID0gJHRoaXMtPnNsaWNlKCRvZmZzZXQsIDEpOwoKcmV0dXJuICcnID09PSAkc3RyLT5zdHJpbmcgPyBbXSA6IGFycmF5X3ZhbHVlcyh1bnBhY2soJ0MqJywgJHN0ci0+c3RyaW5nKSk7Cn0KCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjYW1lbCgpOiBzZWxmOwoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNodW5rKGludCAkbGVuZ3RoID0gMSk6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbGxhcHNlV2hpdGVzcGFjZSgpOiBzZWxmCnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSB0cmltKHByZWdfcmVwbGFjZSgiLyg/OlsgXG5cclx0XHgwQ117Mix9K3xbXG5cclx0XHgwQ10pLyIsICcgJywgJHN0ci0+c3RyaW5nKSwgIiBcblxyXHRceDBDIik7CgpyZXR1cm4gJHN0cjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zQW55KCRuZWVkbGUpOiBib29sCnsKcmV0dXJuIG51bGwgIT09ICR0aGlzLT5pbmRleE9mKCRuZWVkbGUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5kc1dpdGgoJHN1ZmZpeCk6IGJvb2wKewppZiAoIVxpc19hcnJheSgkc3VmZml4KSAmJiAhJHN1ZmZpeCBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdNZXRob2QgIiVzKCkiIG11c3QgYmUgb3ZlcnJpZGRlbiBieSBjbGFzcyAiJXMiIHRvIGRlYWwgd2l0aCBub24taXRlcmFibGUgdmFsdWVzLicsIF9fRlVOQ1RJT05fXywgc3RhdGljOjpjbGFzcykpOwp9Cgpmb3JlYWNoICgkc3VmZml4IGFzICRzKSB7CmlmICgkdGhpcy0+ZW5kc1dpdGgoKHN0cmluZykgJHMpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVuc3VyZUVuZChzdHJpbmcgJHN1ZmZpeCk6IHNlbGYKewppZiAoISR0aGlzLT5lbmRzV2l0aCgkc3VmZml4KSkgewpyZXR1cm4gJHRoaXMtPmFwcGVuZCgkc3VmZml4KTsKfQoKJHN1ZmZpeCA9IHByZWdfcXVvdGUoJHN1ZmZpeCk7CiRyZWdleCA9ICd7KCcuJHN1ZmZpeC4nKSg/OicuJHN1ZmZpeC4nKSsrJH1EJzsKCnJldHVybiAkdGhpcy0+cmVwbGFjZU1hdGNoZXMoJHJlZ2V4LigkdGhpcy0+aWdub3JlQ2FzZSA/ICdpJyA6ICcnKSwgJyQxJyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbnN1cmVTdGFydChzdHJpbmcgJHByZWZpeCk6IHNlbGYKewokcHJlZml4ID0gbmV3IHN0YXRpYygkcHJlZml4KTsKCmlmICghJHRoaXMtPnN0YXJ0c1dpdGgoJHByZWZpeCkpIHsKcmV0dXJuICR0aGlzLT5wcmVwZW5kKCRwcmVmaXgpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRpID0gJHByZWZpeExlbiA9ICRwcmVmaXgtPmxlbmd0aCgpOwoKd2hpbGUgKCR0aGlzLT5pbmRleE9mKCRwcmVmaXgsICRpKSA9PT0gJGkpIHsKJHN0ciA9ICRzdHItPnNsaWNlKCRwcmVmaXhMZW4pOwokaSArPSAkcHJlZml4TGVuOwp9CgpyZXR1cm4gJHN0cjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVxdWFsc1RvKCRzdHJpbmcpOiBib29sCnsKaWYgKCFcaXNfYXJyYXkoJHN0cmluZykgJiYgISRzdHJpbmcgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignTWV0aG9kICIlcygpIiBtdXN0IGJlIG92ZXJyaWRkZW4gYnkgY2xhc3MgIiVzIiB0byBkZWFsIHdpdGggbm9uLWl0ZXJhYmxlIHZhbHVlcy4nLCBfX0ZVTkNUSU9OX18sIHN0YXRpYzo6Y2xhc3MpKTsKfQoKZm9yZWFjaCAoJHN0cmluZyBhcyAkcykgewppZiAoJHRoaXMtPmVxdWFsc1RvKChzdHJpbmcpICRzKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBmb2xkZWQoKTogc2VsZjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpZ25vcmVDYXNlKCk6IHNlbGYKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPmlnbm9yZUNhc2UgPSB0cnVlOwoKcmV0dXJuICRzdHI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbmRleE9mKCRuZWVkbGUsIGludCAkb2Zmc2V0ID0gMCk6ID9pbnQKewppZiAoIVxpc19hcnJheSgkbmVlZGxlKSAmJiAhJG5lZWRsZSBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdNZXRob2QgIiVzKCkiIG11c3QgYmUgb3ZlcnJpZGRlbiBieSBjbGFzcyAiJXMiIHRvIGRlYWwgd2l0aCBub24taXRlcmFibGUgdmFsdWVzLicsIF9fRlVOQ1RJT05fXywgc3RhdGljOjpjbGFzcykpOwp9CgokaSA9IFxQSFBfSU5UX01BWDsKCmZvcmVhY2ggKCRuZWVkbGUgYXMgJG4pIHsKJGogPSAkdGhpcy0+aW5kZXhPZigoc3RyaW5nKSAkbiwgJG9mZnNldCk7CgppZiAobnVsbCAhPT0gJGogJiYgJGogPCAkaSkgewokaSA9ICRqOwp9Cn0KCnJldHVybiBcUEhQX0lOVF9NQVggPT09ICRpID8gbnVsbCA6ICRpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZkxhc3QoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICghXGlzX2FycmF5KCRuZWVkbGUpICYmICEkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ01ldGhvZCAiJXMoKSIgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IGNsYXNzICIlcyIgdG8gZGVhbCB3aXRoIG5vbi1pdGVyYWJsZSB2YWx1ZXMuJywgX19GVU5DVElPTl9fLCBzdGF0aWM6OmNsYXNzKSk7Cn0KCiRpID0gbnVsbDsKCmZvcmVhY2ggKCRuZWVkbGUgYXMgJG4pIHsKJGogPSAkdGhpcy0+aW5kZXhPZkxhc3QoKHN0cmluZykgJG4sICRvZmZzZXQpOwoKaWYgKG51bGwgIT09ICRqICYmICRqID49ICRpKSB7CiRpID0gJG9mZnNldCA9ICRqOwp9Cn0KCnJldHVybiAkaTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRW1wdHkoKTogYm9vbAp7CnJldHVybiAnJyA9PT0gJHRoaXMtPnN0cmluZzsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGpvaW4oYXJyYXkgJHN0cmluZ3MsID9zdHJpbmcgJGxhc3RHbHVlID0gbnVsbCk6IHNlbGY7CgpwdWJsaWMgZnVuY3Rpb24ganNvblNlcmlhbGl6ZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnN0cmluZzsKfQoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGxlbmd0aCgpOiBpbnQ7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbG93ZXIoKTogc2VsZjsKCgoKCgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbWF0Y2goc3RyaW5nICRyZWdleHAsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBhcnJheTsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBwYWRCb3RoKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcGFkRW5kKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcGFkU3RhcnQoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBwcmVwZW5kKHN0cmluZyAuLi4kcHJlZml4KTogc2VsZjsKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXBlYXQoaW50ICRtdWx0aXBsaWVyKTogc2VsZgp7CmlmICgwID4gJG11bHRpcGxpZXIpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdNdWx0aXBsaWVyIG11c3QgYmUgcG9zaXRpdmUsICVkIGdpdmVuLicsICRtdWx0aXBsaWVyKSk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RyX3JlcGVhdCgkc3RyLT5zdHJpbmcsICRtdWx0aXBsaWVyKTsKCnJldHVybiAkc3RyOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZShzdHJpbmcgJGZyb20sIHN0cmluZyAkdG8pOiBzZWxmOwoKCgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZU1hdGNoZXMoc3RyaW5nICRmcm9tUmVnZXhwLCAkdG8pOiBzZWxmOwoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJldmVyc2UoKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzbGljZShpbnQgJHN0YXJ0ID0gMCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc25ha2UoKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzcGxpY2Uoc3RyaW5nICRyZXBsYWNlbWVudCwgaW50ICRzdGFydCA9IDAsID9pbnQgJGxlbmd0aCA9IG51bGwpOiBzZWxmOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNwbGl0KHN0cmluZyAkZGVsaW1pdGVyLCA/aW50ICRsaW1pdCA9IG51bGwsID9pbnQgJGZsYWdzID0gbnVsbCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICRmbGFncykgewp0aHJvdyBuZXcgXFR5cGVFcnJvcignU3BsaXQgYmVoYXZpb3Igd2hlbiAkZmxhZ3MgaXMgbnVsbCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGNoaWxkIGNsYXNzZXMuJyk7Cn0KCmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewokZGVsaW1pdGVyIC49ICdpJzsKfQoKc2V0X2Vycm9yX2hhbmRsZXIoc3RhdGljIGZ1bmN0aW9uICgkdCwgJG0pIHsgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkbSk7IH0pOwoKdHJ5IHsKaWYgKGZhbHNlID09PSAkY2h1bmtzID0gcHJlZ19zcGxpdCgkZGVsaW1pdGVyLCAkdGhpcy0+c3RyaW5nLCAkbGltaXQsICRmbGFncykpIHsKJGxhc3RFcnJvciA9IHByZWdfbGFzdF9lcnJvcigpOwoKZm9yZWFjaCAoZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpWydwY3JlJ10gYXMgJGsgPT4gJHYpIHsKaWYgKCRsYXN0RXJyb3IgPT09ICR2ICYmICdfRVJST1InID09PSBzdWJzdHIoJGssIC02KSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignU3BsaXR0aW5nIGZhaWxlZCB3aXRoICcuJGsuJy4nKTsKfQp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignU3BsaXR0aW5nIGZhaWxlZCB3aXRoIHVua25vd24gZXJyb3IgY29kZS4nKTsKfQp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKHNlbGY6OlBSRUdfU1BMSVRfT0ZGU0VUX0NBUFRVUkUgJiAkZmxhZ3MpIHsKZm9yZWFjaCAoJGNodW5rcyBhcyAmJGNodW5rKSB7CiRzdHItPnN0cmluZyA9ICRjaHVua1swXTsKJGNodW5rWzBdID0gY2xvbmUgJHN0cjsKfQp9IGVsc2Ugewpmb3JlYWNoICgkY2h1bmtzIGFzICYkY2h1bmspIHsKJHN0ci0+c3RyaW5nID0gJGNodW5rOwokY2h1bmsgPSBjbG9uZSAkc3RyOwp9Cn0KCnJldHVybiAkY2h1bmtzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RhcnRzV2l0aCgkcHJlZml4KTogYm9vbAp7CmlmICghXGlzX2FycmF5KCRwcmVmaXgpICYmICEkcHJlZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ01ldGhvZCAiJXMoKSIgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IGNsYXNzICIlcyIgdG8gZGVhbCB3aXRoIG5vbi1pdGVyYWJsZSB2YWx1ZXMuJywgX19GVU5DVElPTl9fLCBzdGF0aWM6OmNsYXNzKSk7Cn0KCmZvcmVhY2ggKCRwcmVmaXggYXMgJHByZWZpeCkgewppZiAoJHRoaXMtPnN0YXJ0c1dpdGgoKHN0cmluZykgJHByZWZpeCkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gdGl0bGUoYm9vbCAkYWxsV29yZHMgPSBmYWxzZSk6IHNlbGY7CgpwdWJsaWMgZnVuY3Rpb24gdG9CeXRlU3RyaW5nKD9zdHJpbmcgJHRvRW5jb2RpbmcgPSBudWxsKTogQnl0ZVN0cmluZwp7CiRiID0gbmV3IEJ5dGVTdHJpbmcoKTsKCiR0b0VuY29kaW5nID0gXGluX2FycmF5KCR0b0VuY29kaW5nLCBbJ3V0ZjgnLCAndXRmLTgnLCAnVVRGOCddLCB0cnVlKSA/ICdVVEYtOCcgOiAkdG9FbmNvZGluZzsKCmlmIChudWxsID09PSAkdG9FbmNvZGluZyB8fCAkdG9FbmNvZGluZyA9PT0gJGZyb21FbmNvZGluZyA9ICR0aGlzIGluc3RhbmNlb2YgQWJzdHJhY3RVbmljb2RlU3RyaW5nIHx8IHByZWdfbWF0Y2goJy8vdScsICRiLT5zdHJpbmcpID8gJ1VURi04JyA6ICdXaW5kb3dzLTEyNTInKSB7CiRiLT5zdHJpbmcgPSAkdGhpcy0+c3RyaW5nOwoKcmV0dXJuICRiOwp9CgpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCR0LCAkbSkgeyB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRtKTsgfSk7Cgp0cnkgewp0cnkgewokYi0+c3RyaW5nID0gbWJfY29udmVydF9lbmNvZGluZygkdGhpcy0+c3RyaW5nLCAkdG9FbmNvZGluZywgJ1VURi04Jyk7Cn0gY2F0Y2ggKEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbnxcVmFsdWVFcnJvciAkZSkgewppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsKaWYgKCRlIGluc3RhbmNlb2YgXFZhbHVlRXJyb3IpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkZS0+Z2V0TWVzc2FnZSgpLCAkZS0+Z2V0Q29kZSgpLCAkZSk7Cn0KdGhyb3cgJGU7Cn0KCiRiLT5zdHJpbmcgPSBpY29udignVVRGLTgnLCAkdG9FbmNvZGluZywgJHRoaXMtPnN0cmluZyk7Cn0KfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KCnJldHVybiAkYjsKfQoKcHVibGljIGZ1bmN0aW9uIHRvQ29kZVBvaW50U3RyaW5nKCk6IENvZGVQb2ludFN0cmluZwp7CnJldHVybiBuZXcgQ29kZVBvaW50U3RyaW5nKCR0aGlzLT5zdHJpbmcpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zdHJpbmc7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0b1VuaWNvZGVTdHJpbmcoKTogVW5pY29kZVN0cmluZwp7CnJldHVybiBuZXcgVW5pY29kZVN0cmluZygkdGhpcy0+c3RyaW5nKTsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHRyaW0oc3RyaW5nICRjaGFycyA9ICIgXHRcblxyXDBceDBCXHgwQ1x1e0EwfVx1e0ZFRkZ9Iik6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gdHJpbUVuZChzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iKTogc2VsZjsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRyaW1QcmVmaXgoJHByZWZpeCk6IHNlbGYKewppZiAoXGlzX2FycmF5KCRwcmVmaXgpIHx8ICRwcmVmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKZm9yZWFjaCAoJHByZWZpeCBhcyAkcykgewokdCA9ICR0aGlzLT50cmltUHJlZml4KCRzKTsKCmlmICgkdC0+c3RyaW5nICE9PSAkdGhpcy0+c3RyaW5nKSB7CnJldHVybiAkdDsKfQp9CgpyZXR1cm4gY2xvbmUgJHRoaXM7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmICgkcHJlZml4IGluc3RhbmNlb2Ygc2VsZikgewokcHJlZml4ID0gJHByZWZpeC0+c3RyaW5nOwp9IGVsc2UgewokcHJlZml4ID0gKHN0cmluZykgJHByZWZpeDsKfQoKaWYgKCcnICE9PSAkcHJlZml4ICYmIFxzdHJsZW4oJHRoaXMtPnN0cmluZykgPj0gXHN0cmxlbigkcHJlZml4KSAmJiAwID09PSBzdWJzdHJfY29tcGFyZSgkdGhpcy0+c3RyaW5nLCAkcHJlZml4LCAwLCBcc3RybGVuKCRwcmVmaXgpLCAkdGhpcy0+aWdub3JlQ2FzZSkpIHsKJHN0ci0+c3RyaW5nID0gc3Vic3RyKCR0aGlzLT5zdHJpbmcsIFxzdHJsZW4oJHByZWZpeCkpOwp9CgpyZXR1cm4gJHN0cjsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHRyaW1TdGFydChzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iKTogc2VsZjsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRyaW1TdWZmaXgoJHN1ZmZpeCk6IHNlbGYKewppZiAoXGlzX2FycmF5KCRzdWZmaXgpIHx8ICRzdWZmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKZm9yZWFjaCAoJHN1ZmZpeCBhcyAkcykgewokdCA9ICR0aGlzLT50cmltU3VmZml4KCRzKTsKCmlmICgkdC0+c3RyaW5nICE9PSAkdGhpcy0+c3RyaW5nKSB7CnJldHVybiAkdDsKfQp9CgpyZXR1cm4gY2xvbmUgJHRoaXM7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmICgkc3VmZml4IGluc3RhbmNlb2Ygc2VsZikgewokc3VmZml4ID0gJHN1ZmZpeC0+c3RyaW5nOwp9IGVsc2Ugewokc3VmZml4ID0gKHN0cmluZykgJHN1ZmZpeDsKfQoKaWYgKCcnICE9PSAkc3VmZml4ICYmIFxzdHJsZW4oJHRoaXMtPnN0cmluZykgPj0gXHN0cmxlbigkc3VmZml4KSAmJiAwID09PSBzdWJzdHJfY29tcGFyZSgkdGhpcy0+c3RyaW5nLCAkc3VmZml4LCAtXHN0cmxlbigkc3VmZml4KSwgbnVsbCwgJHRoaXMtPmlnbm9yZUNhc2UpKSB7CiRzdHItPnN0cmluZyA9IHN1YnN0cigkdGhpcy0+c3RyaW5nLCAwLCAtXHN0cmxlbigkc3VmZml4KSk7Cn0KCnJldHVybiAkc3RyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdHJ1bmNhdGUoaW50ICRsZW5ndGgsIHN0cmluZyAkZWxsaXBzaXMgPSAnJywgYm9vbCAkY3V0ID0gdHJ1ZSk6IHNlbGYKewokc3RyaW5nTGVuZ3RoID0gJHRoaXMtPmxlbmd0aCgpOwoKaWYgKCRzdHJpbmdMZW5ndGggPD0gJGxlbmd0aCkgewpyZXR1cm4gY2xvbmUgJHRoaXM7Cn0KCiRlbGxpcHNpc0xlbmd0aCA9ICcnICE9PSAkZWxsaXBzaXMgPyAobmV3IHN0YXRpYygkZWxsaXBzaXMpKS0+bGVuZ3RoKCkgOiAwOwoKaWYgKCRsZW5ndGggPCAkZWxsaXBzaXNMZW5ndGgpIHsKJGVsbGlwc2lzTGVuZ3RoID0gMDsKfQoKaWYgKCEkY3V0KSB7CmlmIChudWxsID09PSAkbGVuZ3RoID0gJHRoaXMtPmluZGV4T2YoWycgJywgIlxyIiwgIlxuIiwgIlx0Il0sICgkbGVuZ3RoID86IDEpIC0gMSkpIHsKcmV0dXJuIGNsb25lICR0aGlzOwp9CgokbGVuZ3RoICs9ICRlbGxpcHNpc0xlbmd0aDsKfQoKJHN0ciA9ICR0aGlzLT5zbGljZSgwLCAkbGVuZ3RoIC0gJGVsbGlwc2lzTGVuZ3RoKTsKCnJldHVybiAkZWxsaXBzaXNMZW5ndGggPyAkc3RyLT50cmltRW5kKCktPmFwcGVuZCgkZWxsaXBzaXMpIDogJHN0cjsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHVwcGVyKCk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd2lkdGgoYm9vbCAkaWdub3JlQW5zaURlY29yYXRpb24gPSB0cnVlKTogaW50OwoKCgoKcHVibGljIGZ1bmN0aW9uIHdvcmR3cmFwKGludCAkd2lkdGggPSA3NSwgc3RyaW5nICRicmVhayA9ICJcbiIsIGJvb2wgJGN1dCA9IGZhbHNlKTogc2VsZgp7CiRsaW5lcyA9ICcnICE9PSAkYnJlYWsgPyAkdGhpcy0+c3BsaXQoJGJyZWFrKSA6IFtjbG9uZSAkdGhpc107CiRjaGFycyA9IFtdOwokbWFzayA9ICcnOwoKaWYgKDEgPT09IFxjb3VudCgkbGluZXMpICYmICcnID09PSAkbGluZXNbMF0tPnN0cmluZykgewpyZXR1cm4gJGxpbmVzWzBdOwp9Cgpmb3JlYWNoICgkbGluZXMgYXMgJGkgPT4gJGxpbmUpIHsKaWYgKCRpKSB7CiRjaGFyc1tdID0gJGJyZWFrOwokbWFzayAuPSAnIyc7Cn0KCmZvcmVhY2ggKCRsaW5lLT5jaHVuaygpIGFzICRjaGFyKSB7CiRjaGFyc1tdID0gJGNoYXItPnN0cmluZzsKJG1hc2sgLj0gJyAnID09PSAkY2hhci0+c3RyaW5nID8gJyAnIDogJz8nOwp9Cn0KCiRzdHJpbmcgPSAnJzsKJGogPSAwOwokYiA9ICRpID0gLTE7CiRtYXNrID0gd29yZHdyYXAoJG1hc2ssICR3aWR0aCwgJyMnLCAkY3V0KTsKCndoaWxlIChmYWxzZSAhPT0gJGIgPSBzdHJwb3MoJG1hc2ssICcjJywgJGIgKyAxKSkgewpmb3IgKCsrJGk7ICRpIDwgJGI7ICsrJGkpIHsKJHN0cmluZyAuPSAkY2hhcnNbJGpdOwp1bnNldCgkY2hhcnNbJGorK10pOwp9CgppZiAoJGJyZWFrID09PSAkY2hhcnNbJGpdIHx8ICcgJyA9PT0gJGNoYXJzWyRqXSkgewp1bnNldCgkY2hhcnNbJGorK10pOwp9Cgokc3RyaW5nIC49ICRicmVhazsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAkc3RyaW5nLmltcGxvZGUoJycsICRjaGFycyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIF9fc2xlZXAoKTogYXJyYXkKewpyZXR1cm4gWydzdHJpbmcnXTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKQp7CiR0aGlzLT5pZ25vcmVDYXNlID0gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+c3RyaW5nOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmc7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxFeGNlcHRpb25JbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCgoKCgoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVbmljb2RlU3RyaW5nIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmcKewpwdWJsaWMgY29uc3QgTkZDID0gXE5vcm1hbGl6ZXI6Ok5GQzsKcHVibGljIGNvbnN0IE5GRCA9IFxOb3JtYWxpemVyOjpORkQ7CnB1YmxpYyBjb25zdCBORktDID0gXE5vcm1hbGl6ZXI6Ok5GS0M7CnB1YmxpYyBjb25zdCBORktEID0gXE5vcm1hbGl6ZXI6Ok5GS0Q7CgoKcHJpdmF0ZSBjb25zdCBBU0NJSSA9ICJceDIwXHg2NVx4NjlceDYxXHg3M1x4NkVceDc0XHg3Mlx4NkZceDZDXHg3NVx4NjRceDVEXHg1Qlx4NjNceDZEXHg3MFx4MjdceDBBXHg2N1x4N0NceDY4XHg3Nlx4MkVceDY2XHg2Mlx4MkNceDNBXHgzRFx4MkRceDcxXHgzMVx4MzBceDQzXHgzMlx4MkFceDc5XHg3OFx4MjlceDI4XHg0Q1x4MzlceDQxXHg1M1x4MkZceDUwXHgyMlx4NDVceDZBXHg0RFx4NDlceDZCXHgzM1x4M0VceDM1XHg1NFx4M0NceDQ0XHgzNFx4N0RceDQyXHg3Qlx4MzhceDQ2XHg3N1x4NTJceDM2XHgzN1x4NTVceDQ3XHg0RVx4M0JceDRBXHg3QVx4NTZceDIzXHg0OFx4NEZceDU3XHg1Rlx4MjZceDIxXHg0Qlx4M0ZceDU4XHg1MVx4MjVceDU5XHg1Q1x4MDlceDVBXHgyQlx4N0VceDVFXHgyNFx4NDBceDYwXHg3Rlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MEJceDBDXHgwRFx4MEVceDBGXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOVx4MUFceDFCXHgxQ1x4MURceDFFXHgxRiI7CgoKcHJpdmF0ZSBjb25zdCBGT0xEX0ZST00gPSBbJ8SwJywgJ8K1JywgJ8W/JywgIlx4Q0RceDg1IiwgJ8+CJywgJ8+QJywgJ8+RJywgJ8+VJywgJ8+WJywgJ8+wJywgJ8+xJywgJ8+1JywgJ+G6mycsICJceEUxXHhCRVx4QkUiLCAnw58nLCAnxYknLCAnx7AnLCAnzpAnLCAnzrAnLCAn1ocnLCAn4bqWJywgJ+G6lycsICfhupgnLCAn4bqZJywgJ+G6micsICfhup4nLCAn4b2QJywgJ+G9kicsICfhvZQnLCAn4b2WJywgJ+G+gCcsICfhvoEnLCAn4b6CJywgJ+G+gycsICfhvoQnLCAn4b6FJywgJ+G+hicsICfhvocnLCAn4b6IJywgJ+G+iScsICfhvoonLCAn4b6LJywgJ+G+jCcsICfhvo0nLCAn4b6OJywgJ+G+jycsICfhvpAnLCAn4b6RJywgJ+G+kicsICfhvpMnLCAn4b6UJywgJ+G+lScsICfhvpYnLCAn4b6XJywgJ+G+mCcsICfhvpknLCAn4b6aJywgJ+G+mycsICfhvpwnLCAn4b6dJywgJ+G+nicsICfhvp8nLCAn4b6gJywgJ+G+oScsICfhvqInLCAn4b6jJywgJ+G+pCcsICfhvqUnLCAn4b6mJywgJ+G+pycsICfhvqgnLCAn4b6pJywgJ+G+qicsICfhvqsnLCAn4b6sJywgJ+G+rScsICfhvq4nLCAn4b6vJywgJ+G+sicsICfhvrMnLCAn4b60JywgJ+G+ticsICfhvrcnLCAn4b68JywgJ+G/gicsICfhv4MnLCAn4b+EJywgJ+G/hicsICfhv4cnLCAn4b+MJywgJ+G/kicsICfhv5YnLCAn4b+XJywgJ+G/oicsICfhv6QnLCAn4b+mJywgJ+G/pycsICfhv7InLCAn4b+zJywgJ+G/tCcsICfhv7YnLCAn4b+3JywgJ+G/vCcsICfvrIAnLCAn76yBJywgJ++sgicsICfvrIMnLCAn76yEJywgJ++shScsICfvrIYnLCAn76yTJywgJ++slCcsICfvrJUnLCAn76yWJywgJ++slyddOwpwcml2YXRlIGNvbnN0IEZPTERfVE8gPSBbJ2nMhycsICfOvCcsICdzJywgJ865JywgJ8+DJywgJ86yJywgJ864JywgJ8+GJywgJ8+AJywgJ866JywgJ8+BJywgJ861JywgJ+G5oScsICfOuScsICdzcycsICfKvG4nLCAnx7AnLCAnzpAnLCAnzrAnLCAn1aXWgicsICfhupYnLCAn4bqXJywgJ+G6mCcsICfhupknLCAnYcq+JywgJ3NzJywgJ+G9kCcsICfhvZInLCAn4b2UJywgJ+G9licsICfhvIDOuScsICfhvIHOuScsICfhvILOuScsICfhvIPOuScsICfhvITOuScsICfhvIXOuScsICfhvIbOuScsICfhvIfOuScsICfhvIDOuScsICfhvIHOuScsICfhvILOuScsICfhvIPOuScsICfhvITOuScsICfhvIXOuScsICfhvIbOuScsICfhvIfOuScsICfhvKDOuScsICfhvKHOuScsICfhvKLOuScsICfhvKPOuScsICfhvKTOuScsICfhvKXOuScsICfhvKbOuScsICfhvKfOuScsICfhvKDOuScsICfhvKHOuScsICfhvKLOuScsICfhvKPOuScsICfhvKTOuScsICfhvKXOuScsICfhvKbOuScsICfhvKfOuScsICfhvaDOuScsICfhvaHOuScsICfhvaLOuScsICfhvaPOuScsICfhvaTOuScsICfhvaXOuScsICfhvabOuScsICfhvafOuScsICfhvaDOuScsICfhvaHOuScsICfhvaLOuScsICfhvaPOuScsICfhvaTOuScsICfhvaXOuScsICfhvabOuScsICfhvafOuScsICfhvbDOuScsICfOsc65JywgJ86szrknLCAn4b62JywgJ+G+ts65JywgJ86xzrknLCAn4b20zrknLCAnzrfOuScsICfOrs65JywgJ+G/hicsICfhv4bOuScsICfOt865JywgJ+G/kicsICfhv5YnLCAn4b+XJywgJ+G/oicsICfhv6QnLCAn4b+mJywgJ+G/pycsICfhvbzOuScsICfPic65JywgJ8+OzrknLCAn4b+2JywgJ+G/ts65JywgJ8+JzrknLCAnZmYnLCAnZmknLCAnZmwnLCAnZmZpJywgJ2ZmbCcsICdzdCcsICdzdCcsICfVtNW2JywgJ9W01aUnLCAn1bTVqycsICfVvtW2JywgJ9W01a0nXTsKCgpwcml2YXRlIGNvbnN0IFVQUEVSX0ZST00gPSBbJ8OfJywgJ++sgCcsICfvrIEnLCAn76yCJywgJ++sgycsICfvrIQnLCAn76yFJywgJ++shicsICfWhycsICfvrJMnLCAn76yUJywgJ++slScsICfvrJYnLCAn76yXJywgJ8WJJywgJ86QJywgJ86wJywgJ8ewJywgJ+G6licsICfhupcnLCAn4bqYJywgJ+G6mScsICfhuponLCAn4b2QJywgJ+G9kicsICfhvZQnLCAn4b2WJywgJ+G+ticsICfhv4YnLCAn4b+SJywgJ+G/kycsICfhv5YnLCAn4b+XJywgJ+G/oicsICfhv6MnLCAn4b+kJywgJ+G/picsICfhv6cnLCAn4b+2J107CnByaXZhdGUgY29uc3QgVVBQRVJfVE8gPSBbJ1NTJywgJ0ZGJywgJ0ZJJywgJ0ZMJywgJ0ZGSScsICdGRkwnLCAnU1QnLCAnU1QnLCAn1LXVkicsICfVhNWGJywgJ9WE1LUnLCAn1YTUuycsICfVjtWGJywgJ9WE1L0nLCAnyrxOJywgJ86ZzIjMgScsICfOpcyIzIEnLCAnSsyMJywgJ0jMsScsICdUzIgnLCAnV8yKJywgJ1nMiicsICdByr4nLCAnzqXMkycsICfOpcyTzIAnLCAnzqXMk8yBJywgJ86lzJPNgicsICfOkc2CJywgJ86XzYInLCAnzpnMiMyAJywgJ86ZzIjMgScsICfOmc2CJywgJ86ZzIjNgicsICfOpcyIzIAnLCAnzqXMiMyBJywgJ86hzJMnLCAnzqXNgicsICfOpcyIzYInLCAnzqnNgiddOwoKCnByaXZhdGUgY29uc3QgVFJBTlNMSVRfRlJPTSA9IFsnw4YnLCAnw5AnLCAnw5gnLCAnw54nLCAnw58nLCAnw6YnLCAnw7AnLCAnw7gnLCAnw74nLCAnxJAnLCAnxJEnLCAnxKYnLCAnxKcnLCAnxLEnLCAnxLgnLCAnxL8nLCAnxYAnLCAnxYEnLCAnxYInLCAnxYknLCAnxYonLCAnxYsnLCAnxZInLCAnxZMnLCAnxaYnLCAnxacnLCAnxoAnLCAnxoEnLCAnxoInLCAnxoMnLCAnxocnLCAnxognLCAnxoknLCAnxoonLCAnxosnLCAnxownLCAnxpAnLCAnxpEnLCAnxpInLCAnxpMnLCAnxpUnLCAnxpYnLCAnxpcnLCAnxpgnLCAnxpknLCAnxponLCAnxp0nLCAnxp4nLCAnxqInLCAnxqMnLCAnxqQnLCAnxqUnLCAnxqsnLCAnxqwnLCAnxq0nLCAnxq4nLCAnxrInLCAnxrMnLCAnxrQnLCAnxrUnLCAnxrYnLCAnx4QnLCAnx4UnLCAnx4YnLCAnx6QnLCAnx6UnLCAnyKEnLCAnyKQnLCAnyKUnLCAnyLQnLCAnyLUnLCAnyLYnLCAnyLcnLCAnyLgnLCAnyLknLCAnyLonLCAnyLsnLCAnyLwnLCAnyL0nLCAnyL4nLCAnyL8nLCAnyYAnLCAnyYMnLCAnyYQnLCAnyYYnLCAnyYcnLCAnyYgnLCAnyYknLCAnyYwnLCAnyY0nLCAnyY4nLCAnyY8nLCAnyZMnLCAnyZUnLCAnyZYnLCAnyZcnLCAnyZsnLCAnyZ8nLCAnyaAnLCAnyaEnLCAnyaInLCAnyaYnLCAnyacnLCAnyagnLCAnyaonLCAnyasnLCAnyawnLCAnya0nLCAnybEnLCAnybInLCAnybMnLCAnybQnLCAnybYnLCAnybwnLCAnyb0nLCAnyb4nLCAnyoAnLCAnyoInLCAnyognLCAnyoknLCAnyosnLCAnyo8nLCAnypAnLCAnypEnLCAnypknLCAnypsnLCAnypwnLCAnyp0nLCAnyp8nLCAnyqAnLCAnyqMnLCAnyqUnLCAnyqYnLCAnyqonLCAnyqsnLCAn4bSAJywgJ+G0gScsICfhtIMnLCAn4bSEJywgJ+G0hScsICfhtIYnLCAn4bSHJywgJ+G0iicsICfhtIsnLCAn4bSMJywgJ+G0jScsICfhtI8nLCAn4bSYJywgJ+G0mycsICfhtJwnLCAn4bSgJywgJ+G0oScsICfhtKInLCAn4bWrJywgJ+G1rCcsICfhta0nLCAn4bWuJywgJ+G1rycsICfhtbAnLCAn4bWxJywgJ+G1sicsICfhtbMnLCAn4bW0JywgJ+G1tScsICfhtbYnLCAn4bW6JywgJ+G1uycsICfhtb0nLCAn4bW+JywgJ+G2gCcsICfhtoEnLCAn4baCJywgJ+G2gycsICfhtoQnLCAn4baFJywgJ+G2hicsICfhtocnLCAn4baIJywgJ+G2iScsICfhtoonLCAn4baMJywgJ+G2jScsICfhto4nLCAn4baPJywgJ+G2kScsICfhtpInLCAn4baTJywgJ+G2licsICfhtpknLCAn4bqaJywgJ+G6nCcsICfhup0nLCAn4bqeJywgJ+G7uicsICfhu7snLCAn4bu8JywgJ+G7vScsICfhu74nLCAn4bu/JywgJ8KpJywgJ8KuJywgJ+KCoCcsICfigqInLCAn4oKjJywgJ+KCpCcsICfigqcnLCAn4oK6JywgJ+KCuScsICfihIwnLCAn4oSeJywgJ+OOpycsICfjjq4nLCAn44+GJywgJ+OPlycsICfjj54nLCAn44+fJywgJ8K8JywgJ8K9JywgJ8K+JywgJ+KFkycsICfihZQnLCAn4oWVJywgJ+KFlicsICfihZcnLCAn4oWYJywgJ+KFmScsICfihZonLCAn4oWbJywgJ+KFnCcsICfihZ0nLCAn4oWeJywgJ+KFnycsICfjgIcnLCAn4oCYJywgJ+KAmScsICfigJonLCAn4oCbJywgJ+KAnCcsICfigJ0nLCAn4oCeJywgJ+KAnycsICfigLInLCAn4oCzJywgJ+OAnScsICfjgJ4nLCAnwqsnLCAnwrsnLCAn4oC5JywgJ+KAuicsICfigJAnLCAn4oCRJywgJ+KAkicsICfigJMnLCAn4oCUJywgJ+KAlScsICfvuLEnLCAn77iyJywgJ++5mCcsICfigJYnLCAn4oGEJywgJ+KBhScsICfigYYnLCAn4oGOJywgJ+OAgScsICfjgIInLCAn44CIJywgJ+OAiScsICfjgIonLCAn44CLJywgJ+OAlCcsICfjgJUnLCAn44CYJywgJ+OAmScsICfjgJonLCAn44CbJywgJ++4kScsICfvuJInLCAn77i5JywgJ++4uicsICfvuL0nLCAn77i+JywgJ++4vycsICfvuYAnLCAn77mRJywgJ++5nScsICfvuZ4nLCAn772fJywgJ++9oCcsICfvvaEnLCAn772kJywgJ8OXJywgJ8O3JywgJ+KIkicsICfiiJUnLCAn4oiWJywgJ+KIoycsICfiiKUnLCAn4omqJywgJ+KJqycsICfipoUnLCAn4qaGJ107CnByaXZhdGUgY29uc3QgVFJBTlNMSVRfVE8gPSBbJ0FFJywgJ0QnLCAnTycsICdUSCcsICdzcycsICdhZScsICdkJywgJ28nLCAndGgnLCAnRCcsICdkJywgJ0gnLCAnaCcsICdpJywgJ3EnLCAnTCcsICdsJywgJ0wnLCAnbCcsICdcJ24nLCAnTicsICduJywgJ09FJywgJ29lJywgJ1QnLCAndCcsICdiJywgJ0InLCAnQicsICdiJywgJ0MnLCAnYycsICdEJywgJ0QnLCAnRCcsICdkJywgJ0UnLCAnRicsICdmJywgJ0cnLCAnaHYnLCAnSScsICdJJywgJ0snLCAnaycsICdsJywgJ04nLCAnbicsICdPSScsICdvaScsICdQJywgJ3AnLCAndCcsICdUJywgJ3QnLCAnVCcsICdWJywgJ1knLCAneScsICdaJywgJ3onLCAnRFonLCAnRHonLCAnZHonLCAnRycsICdnJywgJ2QnLCAnWicsICd6JywgJ2wnLCAnbicsICd0JywgJ2onLCAnZGInLCAncXAnLCAnQScsICdDJywgJ2MnLCAnTCcsICdUJywgJ3MnLCAneicsICdCJywgJ1UnLCAnRScsICdlJywgJ0onLCAnaicsICdSJywgJ3InLCAnWScsICd5JywgJ2InLCAnYycsICdkJywgJ2QnLCAnZScsICdqJywgJ2cnLCAnZycsICdHJywgJ2gnLCAnaCcsICdpJywgJ0knLCAnbCcsICdsJywgJ2wnLCAnbScsICduJywgJ24nLCAnTicsICdPRScsICdyJywgJ3InLCAncicsICdSJywgJ3MnLCAndCcsICd1JywgJ3YnLCAnWScsICd6JywgJ3onLCAnQicsICdHJywgJ0gnLCAnaicsICdMJywgJ3EnLCAnZHonLCAnZHonLCAndHMnLCAnbHMnLCAnbHonLCAnQScsICdBRScsICdCJywgJ0MnLCAnRCcsICdEJywgJ0UnLCAnSicsICdLJywgJ0wnLCAnTScsICdPJywgJ1AnLCAnVCcsICdVJywgJ1YnLCAnVycsICdaJywgJ3VlJywgJ2InLCAnZCcsICdmJywgJ20nLCAnbicsICdwJywgJ3InLCAncicsICdzJywgJ3QnLCAneicsICd0aCcsICdJJywgJ3AnLCAnVScsICdiJywgJ2QnLCAnZicsICdnJywgJ2snLCAnbCcsICdtJywgJ24nLCAncCcsICdyJywgJ3MnLCAndicsICd4JywgJ3onLCAnYScsICdkJywgJ2UnLCAnZScsICdpJywgJ3UnLCAnYScsICdzJywgJ3MnLCAnU1MnLCAnTEwnLCAnbGwnLCAnVicsICd2JywgJ1knLCAneScsICcoQyknLCAnKFIpJywgJ0NFJywgJ0NyJywgJ0ZyLicsICdMLicsICdQdHMnLCAnVEwnLCAnUnMnLCAneCcsICdSeCcsICdtL3MnLCAncmFkL3MnLCAnQy9rZycsICdwSCcsICdWL20nLCAnQS9tJywgJyAxLzQnLCAnIDEvMicsICcgMy80JywgJyAxLzMnLCAnIDIvMycsICcgMS81JywgJyAyLzUnLCAnIDMvNScsICcgNC81JywgJyAxLzYnLCAnIDUvNicsICcgMS84JywgJyAzLzgnLCAnIDUvOCcsICcgNy84JywgJyAxLycsICcwJywgJ1wnJywgJ1wnJywgJywnLCAnXCcnLCAnIicsICciJywgJywsJywgJyInLCAnXCcnLCAnIicsICciJywgJyInLCAnPDwnLCAnPj4nLCAnPCcsICc+JywgJy0nLCAnLScsICctJywgJy0nLCAnLScsICctJywgJy0nLCAnLScsICctJywgJ3x8JywgJy8nLCAnWycsICddJywgJyonLCAnLCcsICcuJywgJzwnLCAnPicsICc8PCcsICc+PicsICdbJywgJ10nLCAnWycsICddJywgJ1snLCAnXScsICcsJywgJy4nLCAnWycsICddJywgJzw8JywgJz4+JywgJzwnLCAnPicsICcsJywgJ1snLCAnXScsICcoKCcsICcpKScsICcuJywgJywnLCAnKicsICcvJywgJy0nLCAnLycsICdcXCcsICd8JywgJ3x8JywgJzw8JywgJz4+JywgJygoJywgJykpJ107Cgpwcml2YXRlIHN0YXRpYyAkdHJhbnNsaXRlcmF0b3JzID0gW107CnByaXZhdGUgc3RhdGljICR0YWJsZVplcm87CnByaXZhdGUgc3RhdGljICR0YWJsZVdpZGU7CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21Db2RlUG9pbnRzKGludCAuLi4kY29kZXMpOiBzZWxmCnsKJHN0cmluZyA9ICcnOwoKZm9yZWFjaCAoJGNvZGVzIGFzICRjb2RlKSB7CmlmICgweDgwID4gJGNvZGUgJT0gMHgyMDAwMDApIHsKJHN0cmluZyAuPSBcY2hyKCRjb2RlKTsKfSBlbHNlaWYgKDB4ODAwID4gJGNvZGUpIHsKJHN0cmluZyAuPSBcY2hyKDB4QzAgfCAkY29kZSA+PiA2KS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9IGVsc2VpZiAoMHgxMDAwMCA+ICRjb2RlKSB7CiRzdHJpbmcgLj0gXGNocigweEUwIHwgJGNvZGUgPj4gMTIpLlxjaHIoMHg4MCB8ICRjb2RlID4+IDYgJiAweDNGKS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9IGVsc2Ugewokc3RyaW5nIC49IFxjaHIoMHhGMCB8ICRjb2RlID4+IDE4KS5cY2hyKDB4ODAgfCAkY29kZSA+PiAxMiAmIDB4M0YpLlxjaHIoMHg4MCB8ICRjb2RlID4+IDYgJiAweDNGKS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9Cn0KCnJldHVybiBuZXcgc3RhdGljKCRzdHJpbmcpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFzY2lpKGFycmF5ICRydWxlcyA9IFtdKTogc2VsZgp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHMgPSAkc3RyLT5zdHJpbmc7CiRzdHItPnN0cmluZyA9ICcnOwoKYXJyYXlfdW5zaGlmdCgkcnVsZXMsICduZmQnKTsKJHJ1bGVzW10gPSAnbGF0aW4tYXNjaWknOwoKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3RyYW5zbGl0ZXJhdG9yX3RyYW5zbGl0ZXJhdGUnKSkgewokcnVsZXNbXSA9ICdhbnktbGF0aW4vYmduJzsKfQoKJHJ1bGVzW10gPSAnbmZrZCc7CiRydWxlc1tdID0gJ1s6bm9uc3BhY2luZyBtYXJrOl0gcmVtb3ZlJzsKCndoaWxlIChcc3RybGVuKCRzKSAtIDEgPiAkaSA9IHN0cnNwbigkcywgc2VsZjo6QVNDSUkpKSB7CmlmICgwIDwgLS0kaSkgewokc3RyLT5zdHJpbmcgLj0gc3Vic3RyKCRzLCAwLCAkaSk7CiRzID0gc3Vic3RyKCRzLCAkaSk7Cn0KCmlmICghJHJ1bGUgPSBhcnJheV9zaGlmdCgkcnVsZXMpKSB7CiRydWxlcyA9IFtdOyAKfQoKaWYgKCRydWxlIGluc3RhbmNlb2YgXFRyYW5zbGl0ZXJhdG9yKSB7CiRzID0gJHJ1bGUtPnRyYW5zbGl0ZXJhdGUoJHMpOwp9IGVsc2VpZiAoJHJ1bGUgaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewokcyA9ICRydWxlKCRzKTsKfSBlbHNlaWYgKCRydWxlKSB7CmlmICgnbmZkJyA9PT0gJHJ1bGUgPSBzdHJ0b2xvd2VyKCRydWxlKSkgewpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHMsIHNlbGY6Ok5GRCkgPzogJHMgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkcywgc2VsZjo6TkZEKTsKfSBlbHNlaWYgKCduZmtkJyA9PT0gJHJ1bGUpIHsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzLCBzZWxmOjpORktEKSA/OiAkcyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzLCBzZWxmOjpORktEKTsKfSBlbHNlaWYgKCdbOm5vbnNwYWNpbmcgbWFyazpdIHJlbW92ZScgPT09ICRydWxlKSB7CiRzID0gcHJlZ19yZXBsYWNlKCcvXHB7TW59KysvdScsICcnLCAkcyk7Cn0gZWxzZWlmICgnbGF0aW4tYXNjaWknID09PSAkcnVsZSkgewokcyA9IHN0cl9yZXBsYWNlKHNlbGY6OlRSQU5TTElUX0ZST00sIHNlbGY6OlRSQU5TTElUX1RPLCAkcyk7Cn0gZWxzZWlmICgnZGUtYXNjaWknID09PSAkcnVsZSkgewokcyA9IHByZWdfcmVwbGFjZSgiLyhbQVVPXSlcdXswMzA4fSg/PVxwe0xsfSkvdSIsICckMWUnLCAkcyk7CiRzID0gc3RyX3JlcGxhY2UoWyJhXHV7MDMwOH0iLCAib1x1ezAzMDh9IiwgInVcdXswMzA4fSIsICJBXHV7MDMwOH0iLCAiT1x1ezAzMDh9IiwgIlVcdXswMzA4fSJdLCBbJ2FlJywgJ29lJywgJ3VlJywgJ0FFJywgJ09FJywgJ1VFJ10sICRzKTsKfSBlbHNlaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3RyYW5zbGl0ZXJhdG9yX3RyYW5zbGl0ZXJhdGUnKSkgewppZiAobnVsbCA9PT0gJHRyYW5zbGl0ZXJhdG9yID0gc2VsZjo6JHRyYW5zbGl0ZXJhdG9yc1skcnVsZV0gPz8gc2VsZjo6JHRyYW5zbGl0ZXJhdG9yc1skcnVsZV0gPSBcVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZSgkcnVsZSkpIHsKaWYgKCdhbnktbGF0aW4vYmduJyA9PT0gJHJ1bGUpIHsKJHJ1bGUgPSAnYW55LWxhdGluJzsKJHRyYW5zbGl0ZXJhdG9yID0gc2VsZjo6JHRyYW5zbGl0ZXJhdG9yc1skcnVsZV0gPz8gc2VsZjo6JHRyYW5zbGl0ZXJhdG9yc1skcnVsZV0gPSBcVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZSgkcnVsZSk7Cn0KCmlmIChudWxsID09PSAkdHJhbnNsaXRlcmF0b3IpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdVbmtub3duIHRyYW5zbGl0ZXJhdGlvbiBydWxlICIlcyIuJywgJHJ1bGUpKTsKfQoKc2VsZjo6JHRyYW5zbGl0ZXJhdG9yc1snYW55LWxhdGluL2JnbiddID0gJHRyYW5zbGl0ZXJhdG9yOwp9CgokcyA9ICR0cmFuc2xpdGVyYXRvci0+dHJhbnNsaXRlcmF0ZSgkcyk7Cn0KfSBlbHNlaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCdpY29udicpKSB7CiRzID0gcHJlZ19yZXBsYWNlKCcvW15ceDAwLVx4N0ZdL3UnLCAnPycsICRzKTsKfSBlbHNlIHsKJHMgPSBAcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvW15ceDAwLVx4N0ZdL3UnLCBzdGF0aWMgZnVuY3Rpb24gKCRjKSB7CiRjID0gKHN0cmluZykgaWNvbnYoJ1VURi04JywgJ0FTQ0lJLy9UUkFOU0xJVCcsICRjWzBdKTsKCmlmICgnJyA9PT0gJGMgJiYgJycgPT09IGljb252KCdVVEYtOCcsICdBU0NJSS8vVFJBTlNMSVQnLCAnwrInKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJyIlcyIgcmVxdWlyZXMgYSB0cmFuc2xpdC1hYmxlIGljb252IGltcGxlbWVudGF0aW9uLCB0cnkgaW5zdGFsbGluZyAiZ251LWxpYmljb252IiBpZiB5b3VcJ3JlIHVzaW5nIEFscGluZSBMaW51eC4nLCBzdGF0aWM6OmNsYXNzKSk7Cn0KCnJldHVybiAxIDwgXHN0cmxlbigkYykgPyBsdHJpbSgkYywgJ1wnYCJeficpIDogKCcnICE9PSAkYyA/ICRjIDogJz8nKTsKfSwgJHMpOwp9Cn0KCiRzdHItPnN0cmluZyAuPSAkczsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2FtZWwoKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBzdHJfcmVwbGFjZSgnICcsICcnLCBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9cYi4oPyFccHtMdX0pL3UnLCBzdGF0aWMgZnVuY3Rpb24gKCRtKSB1c2UgKCYkaSkgewpyZXR1cm4gMSA9PT0gKyskaSA/ICgnxLAnID09PSAkbVswXSA/ICdpzIcnIDogbWJfc3RydG9sb3dlcigkbVswXSwgJ1VURi04JykpIDogbWJfY29udmVydF9jYXNlKCRtWzBdLCBcTUJfQ0FTRV9USVRMRSwgJ1VURi04Jyk7Cn0sIHByZWdfcmVwbGFjZSgnL1teXHBMMC05XSsrL3UnLCAnICcsICR0aGlzLT5zdHJpbmcpKSk7CgpyZXR1cm4gJHN0cjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvZGVQb2ludHNBdChpbnQgJG9mZnNldCk6IGFycmF5CnsKJHN0ciA9ICR0aGlzLT5zbGljZSgkb2Zmc2V0LCAxKTsKCmlmICgnJyA9PT0gJHN0ci0+c3RyaW5nKSB7CnJldHVybiBbXTsKfQoKJGNvZGVQb2ludHMgPSBbXTsKCmZvcmVhY2ggKHByZWdfc3BsaXQoJy8vdScsICRzdHItPnN0cmluZywgLTEsIFxQUkVHX1NQTElUX05PX0VNUFRZKSBhcyAkYykgewokY29kZVBvaW50c1tdID0gbWJfb3JkKCRjLCAnVVRGLTgnKTsKfQoKcmV0dXJuICRjb2RlUG9pbnRzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZm9sZGVkKGJvb2wgJGNvbXBhdCA9IHRydWUpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CgppZiAoISRjb21wYXQgfHwgXFBIUF9WRVJTSU9OX0lEIDwgNzAzMDAgfHwgIVxkZWZpbmVkKCdOb3JtYWxpemVyOjpORktDX0NGJykpIHsKJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nLCAkY29tcGF0ID8gXE5vcm1hbGl6ZXI6Ok5GS0MgOiBcTm9ybWFsaXplcjo6TkZDKTsKJHN0ci0+c3RyaW5nID0gbWJfc3RydG9sb3dlcihzdHJfcmVwbGFjZShzZWxmOjpGT0xEX0ZST00sIHNlbGY6OkZPTERfVE8sICRzdHItPnN0cmluZyksICdVVEYtOCcpOwp9IGVsc2Ugewokc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcsIFxOb3JtYWxpemVyOjpORktDX0NGKTsKfQoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBqb2luKGFycmF5ICRzdHJpbmdzLCA/c3RyaW5nICRsYXN0R2x1ZSA9IG51bGwpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CgokdGFpbCA9IG51bGwgIT09ICRsYXN0R2x1ZSAmJiAxIDwgXGNvdW50KCRzdHJpbmdzKSA/ICRsYXN0R2x1ZS5hcnJheV9wb3AoJHN0cmluZ3MpIDogJyc7CiRzdHItPnN0cmluZyA9IGltcGxvZGUoJHRoaXMtPnN0cmluZywgJHN0cmluZ3MpLiR0YWlsOwoKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkc3RyLT5zdHJpbmcpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGxvd2VyKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gbWJfc3RydG9sb3dlcihzdHJfcmVwbGFjZSgnxLAnLCAnacyHJywgJHN0ci0+c3RyaW5nKSwgJ1VURi04Jyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIG1hdGNoKHN0cmluZyAkcmVnZXhwLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogYXJyYXkKewokbWF0Y2ggPSAoKFxQUkVHX1BBVFRFUk5fT1JERVIgfCBcUFJFR19TRVRfT1JERVIpICYgJGZsYWdzKSA/ICdwcmVnX21hdGNoX2FsbCcgOiAncHJlZ19tYXRjaCc7CgppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKJHJlZ2V4cCAuPSAnaSc7Cn0KCnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHQsICRtKSB7IHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG0pOyB9KTsKCnRyeSB7CmlmIChmYWxzZSA9PT0gJG1hdGNoKCRyZWdleHAuJ3UnLCAkdGhpcy0+c3RyaW5nLCAkbWF0Y2hlcywgJGZsYWdzIHwgXFBSRUdfVU5NQVRDSEVEX0FTX05VTEwsICRvZmZzZXQpKSB7CiRsYXN0RXJyb3IgPSBwcmVnX2xhc3RfZXJyb3IoKTsKCmZvcmVhY2ggKGdldF9kZWZpbmVkX2NvbnN0YW50cyh0cnVlKVsncGNyZSddIGFzICRrID0+ICR2KSB7CmlmICgkbGFzdEVycm9yID09PSAkdiAmJiAnX0VSUk9SJyA9PT0gc3Vic3RyKCRrLCAtNikpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01hdGNoaW5nIGZhaWxlZCB3aXRoICcuJGsuJy4nKTsKfQp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggdW5rbm93biBlcnJvciBjb2RlLicpOwp9Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9CgpyZXR1cm4gJG1hdGNoZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBub3JtYWxpemUoaW50ICRmb3JtID0gc2VsZjo6TkZDKTogc2VsZgp7CmlmICghXGluX2FycmF5KCRmb3JtLCBbc2VsZjo6TkZDLCBzZWxmOjpORkQsIHNlbGY6Ok5GS0MsIHNlbGY6Ok5GS0RdKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdVbnN1cHBvcnRlZCBub3JtYWxpemF0aW9uIGZvcm0uJyk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZywgJGZvcm0pID86ICRzdHItPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHItPnN0cmluZywgJGZvcm0pOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwYWRCb3RoKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CmlmICgnJyA9PT0gJHBhZFN0ciB8fCAhcHJlZ19tYXRjaCgnLy91JywgJHBhZFN0cikpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCiRwYWQgPSBjbG9uZSAkdGhpczsKJHBhZC0+c3RyaW5nID0gJHBhZFN0cjsKCnJldHVybiAkdGhpcy0+cGFkKCRsZW5ndGgsICRwYWQsIFxTVFJfUEFEX0JPVEgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcGFkRW5kKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CmlmICgnJyA9PT0gJHBhZFN0ciB8fCAhcHJlZ19tYXRjaCgnLy91JywgJHBhZFN0cikpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCiRwYWQgPSBjbG9uZSAkdGhpczsKJHBhZC0+c3RyaW5nID0gJHBhZFN0cjsKCnJldHVybiAkdGhpcy0+cGFkKCRsZW5ndGgsICRwYWQsIFxTVFJfUEFEX1JJR0hUKTsKfQoKcHVibGljIGZ1bmN0aW9uIHBhZFN0YXJ0KGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CmlmICgnJyA9PT0gJHBhZFN0ciB8fCAhcHJlZ19tYXRjaCgnLy91JywgJHBhZFN0cikpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCiRwYWQgPSBjbG9uZSAkdGhpczsKJHBhZC0+c3RyaW5nID0gJHBhZFN0cjsKCnJldHVybiAkdGhpcy0+cGFkKCRsZW5ndGgsICRwYWQsIFxTVFJfUEFEX0xFRlQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZU1hdGNoZXMoc3RyaW5nICRmcm9tUmVnZXhwLCAkdG8pOiBwYXJlbnQKewppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKJGZyb21SZWdleHAgLj0gJ2knOwp9CgppZiAoXGlzX2FycmF5KCR0bykgfHwgJHRvIGluc3RhbmNlb2YgXENsb3N1cmUpIHsKaWYgKCFcaXNfY2FsbGFibGUoJHRvKSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAyIHBhc3NlZCB0byAiJXM6OnJlcGxhY2VNYXRjaGVzKCkiIG11c3QgYmUgY2FsbGFibGUsIGFycmF5IGdpdmVuLicsIHN0YXRpYzo6Y2xhc3MpKTsKfQoKJHJlcGxhY2UgPSAncHJlZ19yZXBsYWNlX2NhbGxiYWNrJzsKJHRvID0gc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkbSkgdXNlICgkdG8pOiBzdHJpbmcgewokdG8gPSAkdG8oJG0pOwoKaWYgKCcnICE9PSAkdG8gJiYgKCFcaXNfc3RyaW5nKCR0bykgfHwgIXByZWdfbWF0Y2goJy8vdScsICR0bykpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1JlcGxhY2UgY2FsbGJhY2sgbXVzdCByZXR1cm4gYSB2YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCnJldHVybiAkdG87Cn07Cn0gZWxzZWlmICgnJyAhPT0gJHRvICYmICFwcmVnX21hdGNoKCcvL3UnLCAkdG8pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9IGVsc2UgewokcmVwbGFjZSA9ICdwcmVnX3JlcGxhY2UnOwp9CgpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCR0LCAkbSkgeyB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRtKTsgfSk7Cgp0cnkgewppZiAobnVsbCA9PT0gJHN0cmluZyA9ICRyZXBsYWNlKCRmcm9tUmVnZXhwLid1JywgJHRvLCAkdGhpcy0+c3RyaW5nKSkgewokbGFzdEVycm9yID0gcHJlZ19sYXN0X2Vycm9yKCk7Cgpmb3JlYWNoIChnZXRfZGVmaW5lZF9jb25zdGFudHModHJ1ZSlbJ3BjcmUnXSBhcyAkayA9PiAkdikgewppZiAoJGxhc3RFcnJvciA9PT0gJHYgJiYgJ19FUlJPUicgPT09IHN1YnN0cigkaywgLTYpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdNYXRjaGluZyBmYWlsZWQgd2l0aCAnLiRrLicuJyk7Cn0KfQoKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01hdGNoaW5nIGZhaWxlZCB3aXRoIHVua25vd24gZXJyb3IgY29kZS4nKTsKfQp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAkc3RyaW5nOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXZlcnNlKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gaW1wbG9kZSgnJywgYXJyYXlfcmV2ZXJzZShwcmVnX3NwbGl0KCcvKFxYKS91JywgJHN0ci0+c3RyaW5nLCAtMSwgXFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRSB8IFxQUkVHX1NQTElUX05PX0VNUFRZKSkpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzbmFrZSgpOiBwYXJlbnQKewokc3RyID0gJHRoaXMtPmNhbWVsKCk7CiRzdHItPnN0cmluZyA9IG1iX3N0cnRvbG93ZXIocHJlZ19yZXBsYWNlKFsnLyhccHtMdX0rKShccHtMdX1ccHtMbH0pL3UnLCAnLyhbXHB7TGx9MC05XSkoXHB7THV9KS91J10sICdcMV9cMicsICRzdHItPnN0cmluZyksICdVVEYtOCcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0aXRsZShib29sICRhbGxXb3JkcyA9IGZhbHNlKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwoKJGxpbWl0ID0gJGFsbFdvcmRzID8gLTEgOiAxOwoKJHN0ci0+c3RyaW5nID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvXGIuL3UnLCBzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRtKTogc3RyaW5nIHsKcmV0dXJuIG1iX2NvbnZlcnRfY2FzZSgkbVswXSwgXE1CX0NBU0VfVElUTEUsICdVVEYtOCcpOwp9LCAkc3RyLT5zdHJpbmcsICRsaW1pdCk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW0oc3RyaW5nICRjaGFycyA9ICIgXHRcblxyXDBceDBCXHgwQ1x1e0EwfVx1e0ZFRkZ9Iik6IHBhcmVudAp7CmlmICgiIFx0XG5cclwwXHgwQlx4MENcdXtBMH1cdXtGRUZGfSIgIT09ICRjaGFycyAmJiAhcHJlZ19tYXRjaCgnLy91JywgJGNoYXJzKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IGNoYXJzLicpOwp9CiRjaGFycyA9IHByZWdfcXVvdGUoJGNoYXJzKTsKCiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gcHJlZ19yZXBsYWNlKCJ7XlskY2hhcnNdKyt8WyRjaGFyc10rKyR9dUQiLCAnJywgJHN0ci0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gdHJpbUVuZChzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iKTogcGFyZW50CnsKaWYgKCIgXHRcblxyXDBceDBCXHgwQ1x1e0EwfVx1e0ZFRkZ9IiAhPT0gJGNoYXJzICYmICFwcmVnX21hdGNoKCcvL3UnLCAkY2hhcnMpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggY2hhcnMuJyk7Cn0KJGNoYXJzID0gcHJlZ19xdW90ZSgkY2hhcnMpOwoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBwcmVnX3JlcGxhY2UoIntbJGNoYXJzXSsrJH11RCIsICcnLCAkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0cmltUHJlZml4KCRwcmVmaXgpOiBwYXJlbnQKewppZiAoISR0aGlzLT5pZ25vcmVDYXNlKSB7CnJldHVybiBwYXJlbnQ6OnRyaW1QcmVmaXgoJHByZWZpeCk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmICgkcHJlZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CiRwcmVmaXggPSBpdGVyYXRvcl90b19hcnJheSgkcHJlZml4LCBmYWxzZSk7Cn0gZWxzZWlmICgkcHJlZml4IGluc3RhbmNlb2YgcGFyZW50KSB7CiRwcmVmaXggPSAkcHJlZml4LT5zdHJpbmc7Cn0KCiRwcmVmaXggPSBpbXBsb2RlKCd8JywgYXJyYXlfbWFwKCdwcmVnX3F1b3RlJywgKGFycmF5KSAkcHJlZml4KSk7CiRzdHItPnN0cmluZyA9IHByZWdfcmVwbGFjZSgie14oPzokcHJlZml4KX1pdUQiLCAnJywgJHRoaXMtPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW1TdGFydChzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iKTogcGFyZW50CnsKaWYgKCIgXHRcblxyXDBceDBCXHgwQ1x1e0EwfVx1e0ZFRkZ9IiAhPT0gJGNoYXJzICYmICFwcmVnX21hdGNoKCcvL3UnLCAkY2hhcnMpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggY2hhcnMuJyk7Cn0KJGNoYXJzID0gcHJlZ19xdW90ZSgkY2hhcnMpOwoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBwcmVnX3JlcGxhY2UoInteWyRjaGFyc10rK311RCIsICcnLCAkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0cmltU3VmZml4KCRzdWZmaXgpOiBwYXJlbnQKewppZiAoISR0aGlzLT5pZ25vcmVDYXNlKSB7CnJldHVybiBwYXJlbnQ6OnRyaW1TdWZmaXgoJHN1ZmZpeCk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmICgkc3VmZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CiRzdWZmaXggPSBpdGVyYXRvcl90b19hcnJheSgkc3VmZml4LCBmYWxzZSk7Cn0gZWxzZWlmICgkc3VmZml4IGluc3RhbmNlb2YgcGFyZW50KSB7CiRzdWZmaXggPSAkc3VmZml4LT5zdHJpbmc7Cn0KCiRzdWZmaXggPSBpbXBsb2RlKCd8JywgYXJyYXlfbWFwKCdwcmVnX3F1b3RlJywgKGFycmF5KSAkc3VmZml4KSk7CiRzdHItPnN0cmluZyA9IHByZWdfcmVwbGFjZSgieyg/OiRzdWZmaXgpJH1pdUQiLCAnJywgJHRoaXMtPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHVwcGVyKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gbWJfc3RydG91cHBlcigkc3RyLT5zdHJpbmcsICdVVEYtOCcpOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDcwMzAwKSB7CiRzdHItPnN0cmluZyA9IHN0cl9yZXBsYWNlKHNlbGY6OlVQUEVSX0ZST00sIHNlbGY6OlVQUEVSX1RPLCAkc3RyLT5zdHJpbmcpOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHdpZHRoKGJvb2wgJGlnbm9yZUFuc2lEZWNvcmF0aW9uID0gdHJ1ZSk6IGludAp7CiR3aWR0aCA9IDA7CiRzID0gc3RyX3JlcGxhY2UoWyJceDAwIiwgIlx4MDUiLCAiXHgwNyJdLCAnJywgJHRoaXMtPnN0cmluZyk7CgppZiAoZmFsc2UgIT09IHN0cnBvcygkcywgIlxyIikpIHsKJHMgPSBzdHJfcmVwbGFjZShbIlxyXG4iLCAiXHIiXSwgIlxuIiwgJHMpOwp9CgppZiAoISRpZ25vcmVBbnNpRGVjb3JhdGlvbikgewokcyA9IHByZWdfcmVwbGFjZSgnL1tccHtDY31ceDdGXSsrL3UnLCAnJywgJHMpOwp9Cgpmb3JlYWNoIChleHBsb2RlKCJcbiIsICRzKSBhcyAkcykgewppZiAoJGlnbm9yZUFuc2lEZWNvcmF0aW9uKSB7CiRzID0gcHJlZ19yZXBsYWNlKCcvKD86XHgxQig/OgogICAgICAgICAgICAgICAgICAgIFxbIFtceDMwLVx4M0ZdKisgW1x4MjAtXHgyRl0qKyBbXHg0MC1ceDdFXQogICAgICAgICAgICAgICAgICAgIHwgW1BcXVheX10gLio/IFx4MUJcXFxcCiAgICAgICAgICAgICAgICAgICAgfCBbXHg0MS1ceDdFXQogICAgICAgICAgICAgICAgKXxbXHB7Q2N9XHg3Rl0rKykveHUnLCAnJywgJHMpOwp9CgokbGluZVdpZHRoID0gJHRoaXMtPndjc3dpZHRoKCRzKTsKCmlmICgkbGluZVdpZHRoID4gJHdpZHRoKSB7CiR3aWR0aCA9ICRsaW5lV2lkdGg7Cn0KfQoKcmV0dXJuICR3aWR0aDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwYWQoaW50ICRsZW4sIHNlbGYgJHBhZCwgaW50ICR0eXBlKTogcGFyZW50CnsKJHNMZW4gPSAkdGhpcy0+bGVuZ3RoKCk7CgppZiAoJGxlbiA8PSAkc0xlbikgewpyZXR1cm4gY2xvbmUgJHRoaXM7Cn0KCiRwYWRMZW4gPSAkcGFkLT5sZW5ndGgoKTsKJGZyZWVMZW4gPSAkbGVuIC0gJHNMZW47CiRsZW4gPSAkZnJlZUxlbiAlICRwYWRMZW47Cgpzd2l0Y2ggKCR0eXBlKSB7CmNhc2UgXFNUUl9QQURfUklHSFQ6CnJldHVybiAkdGhpcy0+YXBwZW5kKHN0cl9yZXBlYXQoJHBhZC0+c3RyaW5nLCBpbnRkaXYoJGZyZWVMZW4sICRwYWRMZW4pKS4oJGxlbiA/ICRwYWQtPnNsaWNlKDAsICRsZW4pIDogJycpKTsKCmNhc2UgXFNUUl9QQURfTEVGVDoKcmV0dXJuICR0aGlzLT5wcmVwZW5kKHN0cl9yZXBlYXQoJHBhZC0+c3RyaW5nLCBpbnRkaXYoJGZyZWVMZW4sICRwYWRMZW4pKS4oJGxlbiA/ICRwYWQtPnNsaWNlKDAsICRsZW4pIDogJycpKTsKCmNhc2UgXFNUUl9QQURfQk9USDoKJGZyZWVMZW4gLz0gMjsKCiRyaWdodExlbiA9IGNlaWwoJGZyZWVMZW4pOwokbGVuID0gJHJpZ2h0TGVuICUgJHBhZExlbjsKJHN0ciA9ICR0aGlzLT5hcHBlbmQoc3RyX3JlcGVhdCgkcGFkLT5zdHJpbmcsIGludGRpdigkcmlnaHRMZW4sICRwYWRMZW4pKS4oJGxlbiA/ICRwYWQtPnNsaWNlKDAsICRsZW4pIDogJycpKTsKCiRsZWZ0TGVuID0gZmxvb3IoJGZyZWVMZW4pOwokbGVuID0gJGxlZnRMZW4gJSAkcGFkTGVuOwoKcmV0dXJuICRzdHItPnByZXBlbmQoc3RyX3JlcGVhdCgkcGFkLT5zdHJpbmcsIGludGRpdigkbGVmdExlbiwgJHBhZExlbikpLigkbGVuID8gJHBhZC0+c2xpY2UoMCwgJGxlbikgOiAnJykpOwoKZGVmYXVsdDoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBwYWRkaW5nIHR5cGUuJyk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB3Y3N3aWR0aChzdHJpbmcgJHN0cmluZyk6IGludAp7CiR3aWR0aCA9IDA7Cgpmb3JlYWNoIChwcmVnX3NwbGl0KCcvL3UnLCAkc3RyaW5nLCAtMSwgXFBSRUdfU1BMSVRfTk9fRU1QVFkpIGFzICRjKSB7CiRjb2RlUG9pbnQgPSBtYl9vcmQoJGMsICdVVEYtOCcpOwoKaWYgKDAgPT09ICRjb2RlUG9pbnQgCnx8IDB4MDM0RiA9PT0gJGNvZGVQb2ludCAKfHwgKDB4MjAwQiA8PSAkY29kZVBvaW50ICYmIDB4MjAwRiA+PSAkY29kZVBvaW50KSAKfHwgMHgyMDI4ID09PSAkY29kZVBvaW50IAp8fCAweDIwMjkgPT09ICRjb2RlUG9pbnQgCnx8ICgweDIwMkEgPD0gJGNvZGVQb2ludCAmJiAweDIwMkUgPj0gJGNvZGVQb2ludCkgCnx8ICgweDIwNjAgPD0gJGNvZGVQb2ludCAmJiAweDIwNjMgPj0gJGNvZGVQb2ludCkgCikgewpjb250aW51ZTsKfQoKCmlmICgzMiA+ICRjb2RlUG9pbnQgCnx8ICgweDA3RiA8PSAkY29kZVBvaW50ICYmIDB4MEEwID4gJGNvZGVQb2ludCkgCikgewpyZXR1cm4gLTE7Cn0KCmlmIChudWxsID09PSBzZWxmOjokdGFibGVaZXJvKSB7CnNlbGY6OiR0YWJsZVplcm8gPSByZXF1aXJlIF9fRElSX18uJy9SZXNvdXJjZXMvZGF0YS93Y3N3aWR0aF90YWJsZV96ZXJvLnBocCc7Cn0KCmlmICgkY29kZVBvaW50ID49IHNlbGY6OiR0YWJsZVplcm9bMF1bMF0gJiYgJGNvZGVQb2ludCA8PSBzZWxmOjokdGFibGVaZXJvWyR1Ym91bmQgPSBcY291bnQoc2VsZjo6JHRhYmxlWmVybykgLSAxXVsxXSkgewokbGJvdW5kID0gMDsKd2hpbGUgKCR1Ym91bmQgPj0gJGxib3VuZCkgewokbWlkID0gZmxvb3IoKCRsYm91bmQgKyAkdWJvdW5kKSAvIDIpOwoKaWYgKCRjb2RlUG9pbnQgPiBzZWxmOjokdGFibGVaZXJvWyRtaWRdWzFdKSB7CiRsYm91bmQgPSAkbWlkICsgMTsKfSBlbHNlaWYgKCRjb2RlUG9pbnQgPCBzZWxmOjokdGFibGVaZXJvWyRtaWRdWzBdKSB7CiR1Ym91bmQgPSAkbWlkIC0gMTsKfSBlbHNlIHsKY29udGludWUgMjsKfQp9Cn0KCmlmIChudWxsID09PSBzZWxmOjokdGFibGVXaWRlKSB7CnNlbGY6OiR0YWJsZVdpZGUgPSByZXF1aXJlIF9fRElSX18uJy9SZXNvdXJjZXMvZGF0YS93Y3N3aWR0aF90YWJsZV93aWRlLnBocCc7Cn0KCmlmICgkY29kZVBvaW50ID49IHNlbGY6OiR0YWJsZVdpZGVbMF1bMF0gJiYgJGNvZGVQb2ludCA8PSBzZWxmOjokdGFibGVXaWRlWyR1Ym91bmQgPSBcY291bnQoc2VsZjo6JHRhYmxlV2lkZSkgLSAxXVsxXSkgewokbGJvdW5kID0gMDsKd2hpbGUgKCR1Ym91bmQgPj0gJGxib3VuZCkgewokbWlkID0gZmxvb3IoKCRsYm91bmQgKyAkdWJvdW5kKSAvIDIpOwoKaWYgKCRjb2RlUG9pbnQgPiBzZWxmOjokdGFibGVXaWRlWyRtaWRdWzFdKSB7CiRsYm91bmQgPSAkbWlkICsgMTsKfSBlbHNlaWYgKCRjb2RlUG9pbnQgPCBzZWxmOjokdGFibGVXaWRlWyRtaWRdWzBdKSB7CiR1Ym91bmQgPSAkbWlkIC0gMTsKfSBlbHNlIHsKJHdpZHRoICs9IDI7Cgpjb250aW51ZSAyOwp9Cn0KfQoKKyskd2lkdGg7Cn0KCnJldHVybiAkd2lkdGg7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZzsKCnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXEV4Y2VwdGlvbkludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgoKCgpjbGFzcyBCeXRlU3RyaW5nIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmcKewpwcml2YXRlIGNvbnN0IEFMUEhBQkVUX0FMUEhBTlVNRVJJQyA9ICcxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6JzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHN0cmluZyA9ICcnKQp7CiR0aGlzLT5zdHJpbmcgPSAkc3RyaW5nOwp9CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tUmFuZG9tKGludCAkbGVuZ3RoID0gMTYsID9zdHJpbmcgJGFscGhhYmV0ID0gbnVsbCk6IHNlbGYKewppZiAoJGxlbmd0aCA8PSAwKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignQSBzdHJpY3RseSBwb3NpdGl2ZSBsZW5ndGggaXMgZXhwZWN0ZWQsICIlZCIgZ2l2ZW4uJywgJGxlbmd0aCkpOwp9CgokYWxwaGFiZXQgPSAkYWxwaGFiZXQgPz8gc2VsZjo6QUxQSEFCRVRfQUxQSEFOVU1FUklDOwokYWxwaGFiZXRTaXplID0gXHN0cmxlbigkYWxwaGFiZXQpOwokYml0cyA9IChpbnQpIGNlaWwobG9nKCRhbHBoYWJldFNpemUsIDIuMCkpOwppZiAoJGJpdHMgPD0gMCB8fCAkYml0cyA+IDU2KSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBsZW5ndGggb2YgdGhlIGFscGhhYmV0IG11c3QgaW4gdGhlIFsyXjEsIDJeNTZdIHJhbmdlLicpOwp9CgokcmV0ID0gJyc7CndoaWxlICgkbGVuZ3RoID4gMCkgewokdXJhbmRvbUxlbmd0aCA9IChpbnQpIGNlaWwoMiAqICRsZW5ndGggKiAkYml0cyAvIDguMCk7CiRkYXRhID0gcmFuZG9tX2J5dGVzKCR1cmFuZG9tTGVuZ3RoKTsKJHVucGFja2VkRGF0YSA9IDA7CiR1bnBhY2tlZEJpdHMgPSAwOwpmb3IgKCRpID0gMDsgJGkgPCAkdXJhbmRvbUxlbmd0aCAmJiAkbGVuZ3RoID4gMDsgKyskaSkgewoKJHVucGFja2VkRGF0YSA9ICgkdW5wYWNrZWREYXRhIDw8IDgpIHwgXG9yZCgkZGF0YVskaV0pOwokdW5wYWNrZWRCaXRzICs9IDg7CgoKCmZvciAoOyAkdW5wYWNrZWRCaXRzID49ICRiaXRzICYmICRsZW5ndGggPiAwOyAkdW5wYWNrZWRCaXRzIC09ICRiaXRzKSB7CiRpbmRleCA9ICgkdW5wYWNrZWREYXRhICYgKCgxIDw8ICRiaXRzKSAtIDEpKTsKJHVucGFja2VkRGF0YSA+Pj0gJGJpdHM7CgoKCmlmICgkaW5kZXggPCAkYWxwaGFiZXRTaXplKSB7CiRyZXQgLj0gJGFscGhhYmV0WyRpbmRleF07Ci0tJGxlbmd0aDsKfQp9Cn0KfQoKcmV0dXJuIG5ldyBzdGF0aWMoJHJldCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBieXRlc0F0KGludCAkb2Zmc2V0KTogYXJyYXkKewokc3RyID0gJHRoaXMtPnN0cmluZ1skb2Zmc2V0XSA/PyAnJzsKCnJldHVybiAnJyA9PT0gJHN0ciA/IFtdIDogW1xvcmQoJHN0cildOwp9CgpwdWJsaWMgZnVuY3Rpb24gYXBwZW5kKHN0cmluZyAuLi4kc3VmZml4KTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgLj0gMSA+PSBcY291bnQoJHN1ZmZpeCkgPyAoJHN1ZmZpeFswXSA/PyAnJykgOiBpbXBsb2RlKCcnLCAkc3VmZml4KTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2FtZWwoKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwoKJHBhcnRzID0gZXhwbG9kZSgnICcsIHRyaW0odWN3b3JkcyhwcmVnX3JlcGxhY2UoJy9bXmEtekEtWjAtOVx4N2YtXHhmZl0rKy8nLCAnICcsICR0aGlzLT5zdHJpbmcpKSkpOwokcGFydHNbMF0gPSAxICE9PSBcc3RybGVuKCRwYXJ0c1swXSkgJiYgY3R5cGVfdXBwZXIoJHBhcnRzWzBdKSA/ICRwYXJ0c1swXSA6IGxjZmlyc3QoJHBhcnRzWzBdKTsKJHN0ci0+c3RyaW5nID0gaW1wbG9kZSgnJywgJHBhcnRzKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2h1bmsoaW50ICRsZW5ndGggPSAxKTogYXJyYXkKewppZiAoMSA+ICRsZW5ndGgpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIGNodW5rIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOwp9CgppZiAoJycgPT09ICR0aGlzLT5zdHJpbmcpIHsKcmV0dXJuIFtdOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRjaHVua3MgPSBbXTsKCmZvcmVhY2ggKHN0cl9zcGxpdCgkdGhpcy0+c3RyaW5nLCAkbGVuZ3RoKSBhcyAkY2h1bmspIHsKJHN0ci0+c3RyaW5nID0gJGNodW5rOwokY2h1bmtzW10gPSBjbG9uZSAkc3RyOwp9CgpyZXR1cm4gJGNodW5rczsKfQoKcHVibGljIGZ1bmN0aW9uIGVuZHNXaXRoKCRzdWZmaXgpOiBib29sCnsKaWYgKCRzdWZmaXggaW5zdGFuY2VvZiBwYXJlbnQpIHsKJHN1ZmZpeCA9ICRzdWZmaXgtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkc3VmZml4KSB8fCAkc3VmZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmVuZHNXaXRoKCRzdWZmaXgpOwp9IGVsc2Ugewokc3VmZml4ID0gKHN0cmluZykgJHN1ZmZpeDsKfQoKcmV0dXJuICcnICE9PSAkc3VmZml4ICYmIFxzdHJsZW4oJHRoaXMtPnN0cmluZykgPj0gXHN0cmxlbigkc3VmZml4KSAmJiAwID09PSBzdWJzdHJfY29tcGFyZSgkdGhpcy0+c3RyaW5nLCAkc3VmZml4LCAtXHN0cmxlbigkc3VmZml4KSwgbnVsbCwgJHRoaXMtPmlnbm9yZUNhc2UpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzVG8oJHN0cmluZyk6IGJvb2wKewppZiAoJHN0cmluZyBpbnN0YW5jZW9mIHBhcmVudCkgewokc3RyaW5nID0gJHN0cmluZy0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRzdHJpbmcpIHx8ICRzdHJpbmcgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6ZXF1YWxzVG8oJHN0cmluZyk7Cn0gZWxzZSB7CiRzdHJpbmcgPSAoc3RyaW5nKSAkc3RyaW5nOwp9CgppZiAoJycgIT09ICRzdHJpbmcgJiYgJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIDAgPT09IHN0cmNhc2VjbXAoJHN0cmluZywgJHRoaXMtPnN0cmluZyk7Cn0KCnJldHVybiAkc3RyaW5nID09PSAkdGhpcy0+c3RyaW5nOwp9CgpwdWJsaWMgZnVuY3Rpb24gZm9sZGVkKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RydG9sb3dlcigkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpbmRleE9mKCRuZWVkbGUsIGludCAkb2Zmc2V0ID0gMCk6ID9pbnQKewppZiAoJG5lZWRsZSBpbnN0YW5jZW9mIHBhcmVudCkgewokbmVlZGxlID0gJG5lZWRsZS0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRuZWVkbGUpIHx8ICRuZWVkbGUgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6aW5kZXhPZigkbmVlZGxlLCAkb2Zmc2V0KTsKfSBlbHNlIHsKJG5lZWRsZSA9IChzdHJpbmcpICRuZWVkbGU7Cn0KCmlmICgnJyA9PT0gJG5lZWRsZSkgewpyZXR1cm4gbnVsbDsKfQoKJGkgPSAkdGhpcy0+aWdub3JlQ2FzZSA/IHN0cmlwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCkgOiBzdHJwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCk7CgpyZXR1cm4gZmFsc2UgPT09ICRpID8gbnVsbCA6ICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZkxhc3QoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICgkbmVlZGxlIGluc3RhbmNlb2YgcGFyZW50KSB7CiRuZWVkbGUgPSAkbmVlZGxlLT5zdHJpbmc7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJG5lZWRsZSkgfHwgJG5lZWRsZSBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpyZXR1cm4gcGFyZW50OjppbmRleE9mTGFzdCgkbmVlZGxlLCAkb2Zmc2V0KTsKfSBlbHNlIHsKJG5lZWRsZSA9IChzdHJpbmcpICRuZWVkbGU7Cn0KCmlmICgnJyA9PT0gJG5lZWRsZSkgewpyZXR1cm4gbnVsbDsKfQoKJGkgPSAkdGhpcy0+aWdub3JlQ2FzZSA/IHN0cnJpcG9zKCR0aGlzLT5zdHJpbmcsICRuZWVkbGUsICRvZmZzZXQpIDogc3RycnBvcygkdGhpcy0+c3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0KTsKCnJldHVybiBmYWxzZSA9PT0gJGkgPyBudWxsIDogJGk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1V0ZjgoKTogYm9vbAp7CnJldHVybiAnJyA9PT0gJHRoaXMtPnN0cmluZyB8fCBwcmVnX21hdGNoKCcvL3UnLCAkdGhpcy0+c3RyaW5nKTsKfQoKcHVibGljIGZ1bmN0aW9uIGpvaW4oYXJyYXkgJHN0cmluZ3MsID9zdHJpbmcgJGxhc3RHbHVlID0gbnVsbCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCiR0YWlsID0gbnVsbCAhPT0gJGxhc3RHbHVlICYmIDEgPCBcY291bnQoJHN0cmluZ3MpID8gJGxhc3RHbHVlLmFycmF5X3BvcCgkc3RyaW5ncykgOiAnJzsKJHN0ci0+c3RyaW5nID0gaW1wbG9kZSgkdGhpcy0+c3RyaW5nLCAkc3RyaW5ncykuJHRhaWw7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGxlbmd0aCgpOiBpbnQKewpyZXR1cm4gXHN0cmxlbigkdGhpcy0+c3RyaW5nKTsKfQoKcHVibGljIGZ1bmN0aW9uIGxvd2VyKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RydG9sb3dlcigkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBtYXRjaChzdHJpbmcgJHJlZ2V4cCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGFycmF5CnsKJG1hdGNoID0gKChcUFJFR19QQVRURVJOX09SREVSIHwgXFBSRUdfU0VUX09SREVSKSAmICRmbGFncykgPyAncHJlZ19tYXRjaF9hbGwnIDogJ3ByZWdfbWF0Y2gnOwoKaWYgKCR0aGlzLT5pZ25vcmVDYXNlKSB7CiRyZWdleHAgLj0gJ2knOwp9CgpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCR0LCAkbSkgeyB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRtKTsgfSk7Cgp0cnkgewppZiAoZmFsc2UgPT09ICRtYXRjaCgkcmVnZXhwLCAkdGhpcy0+c3RyaW5nLCAkbWF0Y2hlcywgJGZsYWdzIHwgXFBSRUdfVU5NQVRDSEVEX0FTX05VTEwsICRvZmZzZXQpKSB7CiRsYXN0RXJyb3IgPSBwcmVnX2xhc3RfZXJyb3IoKTsKCmZvcmVhY2ggKGdldF9kZWZpbmVkX2NvbnN0YW50cyh0cnVlKVsncGNyZSddIGFzICRrID0+ICR2KSB7CmlmICgkbGFzdEVycm9yID09PSAkdiAmJiAnX0VSUk9SJyA9PT0gc3Vic3RyKCRrLCAtNikpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01hdGNoaW5nIGZhaWxlZCB3aXRoICcuJGsuJy4nKTsKfQp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggdW5rbm93biBlcnJvciBjb2RlLicpOwp9Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9CgpyZXR1cm4gJG1hdGNoZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwYWRCb3RoKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RyX3BhZCgkdGhpcy0+c3RyaW5nLCAkbGVuZ3RoLCAkcGFkU3RyLCBcU1RSX1BBRF9CT1RIKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcGFkRW5kKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RyX3BhZCgkdGhpcy0+c3RyaW5nLCAkbGVuZ3RoLCAkcGFkU3RyLCBcU1RSX1BBRF9SSUdIVCk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHBhZFN0YXJ0KGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RyX3BhZCgkdGhpcy0+c3RyaW5nLCAkbGVuZ3RoLCAkcGFkU3RyLCBcU1RSX1BBRF9MRUZUKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcHJlcGVuZChzdHJpbmcgLi4uJHByZWZpeCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gKDEgPj0gXGNvdW50KCRwcmVmaXgpID8gKCRwcmVmaXhbMF0gPz8gJycpIDogaW1wbG9kZSgnJywgJHByZWZpeCkpLiRzdHItPnN0cmluZzsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZShzdHJpbmcgJGZyb20sIHN0cmluZyAkdG8pOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CgppZiAoJycgIT09ICRmcm9tKSB7CiRzdHItPnN0cmluZyA9ICR0aGlzLT5pZ25vcmVDYXNlID8gc3RyX2lyZXBsYWNlKCRmcm9tLCAkdG8sICR0aGlzLT5zdHJpbmcpIDogc3RyX3JlcGxhY2UoJGZyb20sICR0bywgJHRoaXMtPnN0cmluZyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZU1hdGNoZXMoc3RyaW5nICRmcm9tUmVnZXhwLCAkdG8pOiBwYXJlbnQKewppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKJGZyb21SZWdleHAgLj0gJ2knOwp9CgppZiAoXGlzX2FycmF5KCR0bykpIHsKaWYgKCFcaXNfY2FsbGFibGUoJHRvKSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAyIHBhc3NlZCB0byAiJXM6OnJlcGxhY2VNYXRjaGVzKCkiIG11c3QgYmUgY2FsbGFibGUsIGFycmF5IGdpdmVuLicsIHN0YXRpYzo6Y2xhc3MpKTsKfQoKJHJlcGxhY2UgPSAncHJlZ19yZXBsYWNlX2NhbGxiYWNrJzsKfSBlbHNlIHsKJHJlcGxhY2UgPSAkdG8gaW5zdGFuY2VvZiBcQ2xvc3VyZSA/ICdwcmVnX3JlcGxhY2VfY2FsbGJhY2snIDogJ3ByZWdfcmVwbGFjZSc7Cn0KCnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHQsICRtKSB7IHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG0pOyB9KTsKCnRyeSB7CmlmIChudWxsID09PSAkc3RyaW5nID0gJHJlcGxhY2UoJGZyb21SZWdleHAsICR0bywgJHRoaXMtPnN0cmluZykpIHsKJGxhc3RFcnJvciA9IHByZWdfbGFzdF9lcnJvcigpOwoKZm9yZWFjaCAoZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpWydwY3JlJ10gYXMgJGsgPT4gJHYpIHsKaWYgKCRsYXN0RXJyb3IgPT09ICR2ICYmICdfRVJST1InID09PSBzdWJzdHIoJGssIC02KSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggJy4kay4nLicpOwp9Cn0KCnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdNYXRjaGluZyBmYWlsZWQgd2l0aCB1bmtub3duIGVycm9yIGNvZGUuJyk7Cn0KfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gJHN0cmluZzsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmV2ZXJzZSgpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHN0cnJldigkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzbGljZShpbnQgJHN0YXJ0ID0gMCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gKHN0cmluZykgc3Vic3RyKCR0aGlzLT5zdHJpbmcsICRzdGFydCwgJGxlbmd0aCA/PyBcUEhQX0lOVF9NQVgpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzbmFrZSgpOiBwYXJlbnQKewokc3RyID0gJHRoaXMtPmNhbWVsKCk7CiRzdHItPnN0cmluZyA9IHN0cnRvbG93ZXIocHJlZ19yZXBsYWNlKFsnLyhbQS1aXSspKFtBLVpdW2Etel0pLycsICcvKFthLXpcZF0pKFtBLVpdKS8nXSwgJ1wxX1wyJywgJHN0ci0+c3RyaW5nKSk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNwbGljZShzdHJpbmcgJHJlcGxhY2VtZW50LCBpbnQgJHN0YXJ0ID0gMCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3Vic3RyX3JlcGxhY2UoJHRoaXMtPnN0cmluZywgJHJlcGxhY2VtZW50LCAkc3RhcnQsICRsZW5ndGggPz8gXFBIUF9JTlRfTUFYKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3BsaXQoc3RyaW5nICRkZWxpbWl0ZXIsID9pbnQgJGxpbWl0ID0gbnVsbCwgP2ludCAkZmxhZ3MgPSBudWxsKTogYXJyYXkKewppZiAoMSA+ICRsaW1pdCA9ICRsaW1pdCA/PyBcUEhQX0lOVF9NQVgpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgbGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuJyk7Cn0KCmlmICgnJyA9PT0gJGRlbGltaXRlcikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdTcGxpdCBkZWxpbWl0ZXIgaXMgZW1wdHkuJyk7Cn0KCmlmIChudWxsICE9PSAkZmxhZ3MpIHsKcmV0dXJuIHBhcmVudDo6c3BsaXQoJGRlbGltaXRlciwgJGxpbWl0LCAkZmxhZ3MpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRjaHVua3MgPSAkdGhpcy0+aWdub3JlQ2FzZQo/IHByZWdfc3BsaXQoJ3snLnByZWdfcXVvdGUoJGRlbGltaXRlcikuJ31pRCcsICR0aGlzLT5zdHJpbmcsICRsaW1pdCkKOiBleHBsb2RlKCRkZWxpbWl0ZXIsICR0aGlzLT5zdHJpbmcsICRsaW1pdCk7Cgpmb3JlYWNoICgkY2h1bmtzIGFzICYkY2h1bmspIHsKJHN0ci0+c3RyaW5nID0gJGNodW5rOwokY2h1bmsgPSBjbG9uZSAkc3RyOwp9CgpyZXR1cm4gJGNodW5rczsKfQoKcHVibGljIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoJHByZWZpeCk6IGJvb2wKewppZiAoJHByZWZpeCBpbnN0YW5jZW9mIHBhcmVudCkgewokcHJlZml4ID0gJHByZWZpeC0+c3RyaW5nOwp9IGVsc2VpZiAoIVxpc19zdHJpbmcoJHByZWZpeCkpIHsKcmV0dXJuIHBhcmVudDo6c3RhcnRzV2l0aCgkcHJlZml4KTsKfQoKcmV0dXJuICcnICE9PSAkcHJlZml4ICYmIDAgPT09ICgkdGhpcy0+aWdub3JlQ2FzZSA/IHN0cm5jYXNlY21wKCR0aGlzLT5zdHJpbmcsICRwcmVmaXgsIFxzdHJsZW4oJHByZWZpeCkpIDogc3RybmNtcCgkdGhpcy0+c3RyaW5nLCAkcHJlZml4LCBcc3RybGVuKCRwcmVmaXgpKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0aXRsZShib29sICRhbGxXb3JkcyA9IGZhbHNlKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAkYWxsV29yZHMgPyB1Y3dvcmRzKCRzdHItPnN0cmluZykgOiB1Y2ZpcnN0KCRzdHItPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRvVW5pY29kZVN0cmluZyg/c3RyaW5nICRmcm9tRW5jb2RpbmcgPSBudWxsKTogVW5pY29kZVN0cmluZwp7CnJldHVybiBuZXcgVW5pY29kZVN0cmluZygkdGhpcy0+dG9Db2RlUG9pbnRTdHJpbmcoJGZyb21FbmNvZGluZyktPnN0cmluZyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0b0NvZGVQb2ludFN0cmluZyg/c3RyaW5nICRmcm9tRW5jb2RpbmcgPSBudWxsKTogQ29kZVBvaW50U3RyaW5nCnsKJHUgPSBuZXcgQ29kZVBvaW50U3RyaW5nKCk7CgppZiAoXGluX2FycmF5KCRmcm9tRW5jb2RpbmcsIFtudWxsLCAndXRmOCcsICd1dGYtOCcsICdVVEY4JywgJ1VURi04J10sIHRydWUpICYmIHByZWdfbWF0Y2goJy8vdScsICR0aGlzLT5zdHJpbmcpKSB7CiR1LT5zdHJpbmcgPSAkdGhpcy0+c3RyaW5nOwoKcmV0dXJuICR1Owp9CgpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCR0LCAkbSkgeyB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRtKTsgfSk7Cgp0cnkgewp0cnkgewokdmFsaWRFbmNvZGluZyA9IGZhbHNlICE9PSBtYl9kZXRlY3RfZW5jb2RpbmcoJHRoaXMtPnN0cmluZywgJGZyb21FbmNvZGluZyA/PyAnV2luZG93cy0xMjUyJywgdHJ1ZSk7Cn0gY2F0Y2ggKEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiAkZSkgewppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsKdGhyb3cgJGU7Cn0KCiR1LT5zdHJpbmcgPSBpY29udigkZnJvbUVuY29kaW5nID8/ICdXaW5kb3dzLTEyNTInLCAnVVRGLTgnLCAkdGhpcy0+c3RyaW5nKTsKCnJldHVybiAkdTsKfQp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKaWYgKCEkdmFsaWRFbmNvZGluZykgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgIiVzIiBzdHJpbmcuJywgJGZyb21FbmNvZGluZyA/PyAnV2luZG93cy0xMjUyJykpOwp9CgokdS0+c3RyaW5nID0gbWJfY29udmVydF9lbmNvZGluZygkdGhpcy0+c3RyaW5nLCAnVVRGLTgnLCAkZnJvbUVuY29kaW5nID8/ICdXaW5kb3dzLTEyNTInKTsKCnJldHVybiAkdTsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW0oc3RyaW5nICRjaGFycyA9ICIgXHRcblxyXDBceDBCXHgwQyIpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHRyaW0oJHN0ci0+c3RyaW5nLCAkY2hhcnMpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0cmltRW5kKHN0cmluZyAkY2hhcnMgPSAiIFx0XG5cclwwXHgwQlx4MEMiKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBydHJpbSgkc3RyLT5zdHJpbmcsICRjaGFycyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW1TdGFydChzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDIik6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gbHRyaW0oJHN0ci0+c3RyaW5nLCAkY2hhcnMpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB1cHBlcigpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHN0cnRvdXBwZXIoJHN0ci0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gd2lkdGgoYm9vbCAkaWdub3JlQW5zaURlY29yYXRpb24gPSB0cnVlKTogaW50CnsKJHN0cmluZyA9IHByZWdfbWF0Y2goJy8vdScsICR0aGlzLT5zdHJpbmcpID8gJHRoaXMtPnN0cmluZyA6IHByZWdfcmVwbGFjZSgnL1tceDgwLVx4RkZdLycsICc/JywgJHRoaXMtPnN0cmluZyk7CgpyZXR1cm4gKG5ldyBDb2RlUG9pbnRTdHJpbmcoJHN0cmluZykpLT53aWR0aCgkaWdub3JlQW5zaURlY29yYXRpb24pOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmc7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxFeGNlcHRpb25JbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCgoKCgoKY2xhc3MgQ29kZVBvaW50U3RyaW5nIGV4dGVuZHMgQWJzdHJhY3RVbmljb2RlU3RyaW5nCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc3RyaW5nID0gJycpCnsKaWYgKCcnICE9PSAkc3RyaW5nICYmICFwcmVnX21hdGNoKCcvL3UnLCAkc3RyaW5nKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHRoaXMtPnN0cmluZyA9ICRzdHJpbmc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBhcHBlbmQoc3RyaW5nIC4uLiRzdWZmaXgpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nIC49IDEgPj0gXGNvdW50KCRzdWZmaXgpID8gKCRzdWZmaXhbMF0gPz8gJycpIDogaW1wbG9kZSgnJywgJHN1ZmZpeCk7CgppZiAoIXByZWdfbWF0Y2goJy8vdScsICRzdHItPnN0cmluZykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2h1bmsoaW50ICRsZW5ndGggPSAxKTogYXJyYXkKewppZiAoMSA+ICRsZW5ndGgpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIGNodW5rIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOwp9CgppZiAoJycgPT09ICR0aGlzLT5zdHJpbmcpIHsKcmV0dXJuIFtdOwp9CgokcnggPSAnLygnOwp3aGlsZSAoNjU1MzUgPCAkbGVuZ3RoKSB7CiRyeCAuPSAnLns2NTUzNX0nOwokbGVuZ3RoIC09IDY1NTM1Owp9CiRyeCAuPSAnLnsnLiRsZW5ndGguJ30pL3VzJzsKCiRzdHIgPSBjbG9uZSAkdGhpczsKJGNodW5rcyA9IFtdOwoKZm9yZWFjaCAocHJlZ19zcGxpdCgkcngsICR0aGlzLT5zdHJpbmcsIC0xLCBcUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFIHwgXFBSRUdfU1BMSVRfTk9fRU1QVFkpIGFzICRjaHVuaykgewokc3RyLT5zdHJpbmcgPSAkY2h1bms7CiRjaHVua3NbXSA9IGNsb25lICRzdHI7Cn0KCnJldHVybiAkY2h1bmtzOwp9CgpwdWJsaWMgZnVuY3Rpb24gY29kZVBvaW50c0F0KGludCAkb2Zmc2V0KTogYXJyYXkKewokc3RyID0gJG9mZnNldCA/ICR0aGlzLT5zbGljZSgkb2Zmc2V0LCAxKSA6ICR0aGlzOwoKcmV0dXJuICcnID09PSAkc3RyLT5zdHJpbmcgPyBbXSA6IFttYl9vcmQoJHN0ci0+c3RyaW5nLCAnVVRGLTgnKV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBlbmRzV2l0aCgkc3VmZml4KTogYm9vbAp7CmlmICgkc3VmZml4IGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJHN1ZmZpeCA9ICRzdWZmaXgtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkc3VmZml4KSB8fCAkc3VmZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmVuZHNXaXRoKCRzdWZmaXgpOwp9IGVsc2Ugewokc3VmZml4ID0gKHN0cmluZykgJHN1ZmZpeDsKfQoKaWYgKCcnID09PSAkc3VmZml4IHx8ICFwcmVnX21hdGNoKCcvL3UnLCAkc3VmZml4KSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewpyZXR1cm4gcHJlZ19tYXRjaCgneycucHJlZ19xdW90ZSgkc3VmZml4KS4nJH1pdUQnLCAkdGhpcy0+c3RyaW5nKTsKfQoKcmV0dXJuIFxzdHJsZW4oJHRoaXMtPnN0cmluZykgPj0gXHN0cmxlbigkc3VmZml4KSAmJiAwID09PSBzdWJzdHJfY29tcGFyZSgkdGhpcy0+c3RyaW5nLCAkc3VmZml4LCAtXHN0cmxlbigkc3VmZml4KSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBlcXVhbHNUbygkc3RyaW5nKTogYm9vbAp7CmlmICgkc3RyaW5nIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJHN0cmluZyA9ICRzdHJpbmctPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkc3RyaW5nKSB8fCAkc3RyaW5nIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmVxdWFsc1RvKCRzdHJpbmcpOwp9IGVsc2Ugewokc3RyaW5nID0gKHN0cmluZykgJHN0cmluZzsKfQoKaWYgKCcnICE9PSAkc3RyaW5nICYmICR0aGlzLT5pZ25vcmVDYXNlKSB7CnJldHVybiBcc3RybGVuKCRzdHJpbmcpID09PSBcc3RybGVuKCR0aGlzLT5zdHJpbmcpICYmIDAgPT09IG1iX3N0cmlwb3MoJHRoaXMtPnN0cmluZywgJHN0cmluZywgMCwgJ1VURi04Jyk7Cn0KCnJldHVybiAkc3RyaW5nID09PSAkdGhpcy0+c3RyaW5nOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZigkbmVlZGxlLCBpbnQgJG9mZnNldCA9IDApOiA/aW50CnsKaWYgKCRuZWVkbGUgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokbmVlZGxlID0gJG5lZWRsZS0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRuZWVkbGUpIHx8ICRuZWVkbGUgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6aW5kZXhPZigkbmVlZGxlLCAkb2Zmc2V0KTsKfSBlbHNlIHsKJG5lZWRsZSA9IChzdHJpbmcpICRuZWVkbGU7Cn0KCmlmICgnJyA9PT0gJG5lZWRsZSkgewpyZXR1cm4gbnVsbDsKfQoKJGkgPSAkdGhpcy0+aWdub3JlQ2FzZSA/IG1iX3N0cmlwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCwgJ1VURi04JykgOiBtYl9zdHJwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCwgJ1VURi04Jyk7CgpyZXR1cm4gZmFsc2UgPT09ICRpID8gbnVsbCA6ICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZkxhc3QoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICgkbmVlZGxlIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJG5lZWRsZSA9ICRuZWVkbGUtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkbmVlZGxlKSB8fCAkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmluZGV4T2ZMYXN0KCRuZWVkbGUsICRvZmZzZXQpOwp9IGVsc2UgewokbmVlZGxlID0gKHN0cmluZykgJG5lZWRsZTsKfQoKaWYgKCcnID09PSAkbmVlZGxlKSB7CnJldHVybiBudWxsOwp9CgokaSA9ICR0aGlzLT5pZ25vcmVDYXNlID8gbWJfc3Rycmlwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCwgJ1VURi04JykgOiBtYl9zdHJycG9zKCR0aGlzLT5zdHJpbmcsICRuZWVkbGUsICRvZmZzZXQsICdVVEYtOCcpOwoKcmV0dXJuIGZhbHNlID09PSAkaSA/IG51bGwgOiAkaTsKfQoKcHVibGljIGZ1bmN0aW9uIGxlbmd0aCgpOiBpbnQKewpyZXR1cm4gbWJfc3RybGVuKCR0aGlzLT5zdHJpbmcsICdVVEYtOCcpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcHJlcGVuZChzdHJpbmcgLi4uJHByZWZpeCk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAoMSA+PSBcY291bnQoJHByZWZpeCkgPyAoJHByZWZpeFswXSA/PyAnJykgOiBpbXBsb2RlKCcnLCAkcHJlZml4KSkuJHRoaXMtPnN0cmluZzsKCmlmICghcHJlZ19tYXRjaCgnLy91JywgJHN0ci0+c3RyaW5nKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXBsYWNlKHN0cmluZyAkZnJvbSwgc3RyaW5nICR0byk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKCcnID09PSAkZnJvbSB8fCAhcHJlZ19tYXRjaCgnLy91JywgJGZyb20pKSB7CnJldHVybiAkc3RyOwp9CgppZiAoJycgIT09ICR0byAmJiAhcHJlZ19tYXRjaCgnLy91JywgJHRvKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKaWYgKCR0aGlzLT5pZ25vcmVDYXNlKSB7CiRzdHItPnN0cmluZyA9IGltcGxvZGUoJHRvLCBwcmVnX3NwbGl0KCd7Jy5wcmVnX3F1b3RlKCRmcm9tKS4nfWl1RCcsICR0aGlzLT5zdHJpbmcpKTsKfSBlbHNlIHsKJHN0ci0+c3RyaW5nID0gc3RyX3JlcGxhY2UoJGZyb20sICR0bywgJHRoaXMtPnN0cmluZyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2xpY2UoaW50ICRzdGFydCA9IDAsID9pbnQgJGxlbmd0aCA9IG51bGwpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gbWJfc3Vic3RyKCR0aGlzLT5zdHJpbmcsICRzdGFydCwgJGxlbmd0aCwgJ1VURi04Jyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNwbGljZShzdHJpbmcgJHJlcGxhY2VtZW50LCBpbnQgJHN0YXJ0ID0gMCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IEFic3RyYWN0U3RyaW5nCnsKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkcmVwbGFjZW1lbnQpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRzdGFydCA9ICRzdGFydCA/IFxzdHJsZW4obWJfc3Vic3RyKCR0aGlzLT5zdHJpbmcsIDAsICRzdGFydCwgJ1VURi04JykpIDogMDsKJGxlbmd0aCA9ICRsZW5ndGggPyBcc3RybGVuKG1iX3N1YnN0cigkdGhpcy0+c3RyaW5nLCAkc3RhcnQsICRsZW5ndGgsICdVVEYtOCcpKSA6ICRsZW5ndGg7CiRzdHItPnN0cmluZyA9IHN1YnN0cl9yZXBsYWNlKCR0aGlzLT5zdHJpbmcsICRyZXBsYWNlbWVudCwgJHN0YXJ0LCAkbGVuZ3RoID8/IFxQSFBfSU5UX01BWCk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNwbGl0KHN0cmluZyAkZGVsaW1pdGVyLCA/aW50ICRsaW1pdCA9IG51bGwsID9pbnQgJGZsYWdzID0gbnVsbCk6IGFycmF5CnsKaWYgKDEgPiAkbGltaXQgPSAkbGltaXQgPz8gXFBIUF9JTlRfTUFYKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1NwbGl0IGxpbWl0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLicpOwp9CgppZiAoJycgPT09ICRkZWxpbWl0ZXIpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgZGVsaW1pdGVyIGlzIGVtcHR5LicpOwp9CgppZiAobnVsbCAhPT0gJGZsYWdzKSB7CnJldHVybiBwYXJlbnQ6OnNwbGl0KCRkZWxpbWl0ZXIuJ3UnLCAkbGltaXQsICRmbGFncyk7Cn0KCmlmICghcHJlZ19tYXRjaCgnLy91JywgJGRlbGltaXRlcikpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgZGVsaW1pdGVyIGlzIG5vdCBhIHZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwokY2h1bmtzID0gJHRoaXMtPmlnbm9yZUNhc2UKPyBwcmVnX3NwbGl0KCd7Jy5wcmVnX3F1b3RlKCRkZWxpbWl0ZXIpLid9aXVEJywgJHRoaXMtPnN0cmluZywgJGxpbWl0KQo6IGV4cGxvZGUoJGRlbGltaXRlciwgJHRoaXMtPnN0cmluZywgJGxpbWl0KTsKCmZvcmVhY2ggKCRjaHVua3MgYXMgJiRjaHVuaykgewokc3RyLT5zdHJpbmcgPSAkY2h1bms7CiRjaHVuayA9IGNsb25lICRzdHI7Cn0KCnJldHVybiAkY2h1bmtzOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3RhcnRzV2l0aCgkcHJlZml4KTogYm9vbAp7CmlmICgkcHJlZml4IGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJHByZWZpeCA9ICRwcmVmaXgtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkcHJlZml4KSB8fCAkcHJlZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OnN0YXJ0c1dpdGgoJHByZWZpeCk7Cn0gZWxzZSB7CiRwcmVmaXggPSAoc3RyaW5nKSAkcHJlZml4Owp9CgppZiAoJycgPT09ICRwcmVmaXggfHwgIXByZWdfbWF0Y2goJy8vdScsICRwcmVmaXgpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5pZ25vcmVDYXNlKSB7CnJldHVybiAwID09PSBtYl9zdHJpcG9zKCR0aGlzLT5zdHJpbmcsICRwcmVmaXgsIDAsICdVVEYtOCcpOwp9CgpyZXR1cm4gMCA9PT0gc3RybmNtcCgkdGhpcy0+c3RyaW5nLCAkcHJlZml4LCBcc3RybGVuKCRwcmVmaXgpKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvbjsKCmludGVyZmFjZSBFeGNlcHRpb25JbnRlcmZhY2UgZXh0ZW5kcyBcVGhyb3dhYmxlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb247CgpjbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb247CgpjbGFzcyBSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEluZmxlY3RvcjsKCmZpbmFsIGNsYXNzIEVuZ2xpc2hJbmZsZWN0b3IgaW1wbGVtZW50cyBJbmZsZWN0b3JJbnRlcmZhY2UKewoKCgoKCnByaXZhdGUgY29uc3QgUExVUkFMX01BUCA9IFsKCgoKCgoKClsnYWlyZXRjYWInLCA4LCB0cnVlLCB0cnVlLCAnYmFjdGVyaXVtJ10sCgoKWydhcm9wcm9jJywgNywgdHJ1ZSwgdHJ1ZSwgJ2NvcnB1cyddLAoKClsnYWlyZXRpcmMnLCA4LCB0cnVlLCB0cnVlLCAnY3JpdGVyaW9uJ10sCgoKWydhbHVjaXJydWMnLCA5LCB0cnVlLCB0cnVlLCAnY3VycmljdWx1bSddLAoKClsnYXJlbmVnJywgNiwgdHJ1ZSwgdHJ1ZSwgJ2dlbnVzJ10sCgoKWydhaWRlbScsIDUsIHRydWUsIHRydWUsICdtZWRpdW0nXSwKCgpbJ2FkbmFyb21lbScsIDksIHRydWUsIHRydWUsICdtZW1vcmFuZHVtJ10sCgoKWydhbmVtb25laHAnLCA5LCB0cnVlLCB0cnVlLCAncGhlbm9tZW5vbiddLAoKClsnYXRhcnRzJywgNiwgdHJ1ZSwgdHJ1ZSwgJ3N0cmF0dW0nXSwKCgpbJ2VhJywgMiwgdHJ1ZSwgdHJ1ZSwgJ2EnXSwKCgpbJ3NlY2l2cmVzJywgOCwgdHJ1ZSwgdHJ1ZSwgJ3NlcnZpY2UnXSwKCgpbJ2VjaScsIDMsIGZhbHNlLCB0cnVlLCAnb3VzZSddLAoKClsnZXNlZScsIDQsIGZhbHNlLCB0cnVlLCAnb29zZSddLAoKClsnaScsIDEsIHRydWUsIHRydWUsICd1cyddLAoKClsnbmVtJywgMywgdHJ1ZSwgdHJ1ZSwgJ21hbiddLAoKClsnbmVyZGxpaGMnLCA4LCB0cnVlLCB0cnVlLCAnY2hpbGQnXSwKCgpbJ25leG8nLCA0LCBmYWxzZSwgZmFsc2UsICdveCddLAoKClsnc2VjaScsIDQsIGZhbHNlLCB0cnVlLCBbJ2V4JywgJ2l4JywgJ2ljZSddXSwKCgpbJ3NlZG9jJywgNSwgZmFsc2UsIHRydWUsICdjb2RlJ10sCgoKWydzZWlmbGVzJywgNywgdHJ1ZSwgdHJ1ZSwgJ3NlbGZpZSddLAoKClsnc2VpYm1veicsIDcsIHRydWUsIHRydWUsICd6b21iaWUnXSwKCgpbJ3NlaXZvbScsIDYsIHRydWUsIHRydWUsICdtb3ZpZSddLAoKClsnc2VtYW4nLCA1LCB0cnVlLCBmYWxzZSwgJ25hbWUnXSwKCgpbJ3Nlc3V0Y2VwJywgOCwgdHJ1ZSwgdHJ1ZSwgJ3BlY3R1cyddLAoKClsndGVlZicsIDQsIHRydWUsIHRydWUsICdmb290J10sCgoKWydlc2VlZycsIDUsIHRydWUsIHRydWUsICdnb29zZSddLAoKClsnaHRlZXQnLCA1LCB0cnVlLCB0cnVlLCAndG9vdGgnXSwKCgpbJ3N3ZW4nLCA0LCB0cnVlLCB0cnVlLCAnbmV3cyddLAoKClsnc2VpcmVzJywgNiwgdHJ1ZSwgdHJ1ZSwgJ3NlcmllcyddLAoKClsnc2VpJywgMywgZmFsc2UsIHRydWUsICd5J10sCgoKWydzZXNzJywgNCwgdHJ1ZSwgZmFsc2UsICdzcyddLAoKClsnc2VzdXRhdHMnLCA4LCB0cnVlLCB0cnVlLCAnc3RhdHVzJ10sCgoKWydzZWwnLCAzLCB0cnVlLCB0cnVlLCAnbGUnXSwKCgoKCgpbJ3NlcycsIDMsIHRydWUsIHRydWUsIFsncycsICdzZScsICdzaXMnXV0sCgoKWydzZXZpdCcsIDUsIHRydWUsIHRydWUsICd0aXZlJ10sCgoKWydzZXZpcmQnLCA2LCBmYWxzZSwgdHJ1ZSwgJ2RyaXZlJ10sCgoKWydzZXZpJywgNCwgZmFsc2UsIHRydWUsICdpZmUnXSwKCgpbJ3Nldm9tJywgNSwgdHJ1ZSwgdHJ1ZSwgJ21vdmUnXSwKCgpbJ3NldicsIDMsIHRydWUsIHRydWUsIFsnZicsICd2ZScsICdmZiddXSwKCgpbJ3NleGEnLCA0LCBmYWxzZSwgZmFsc2UsIFsnYXgnLCAnYXhlJywgJ2F4aXMnXV0sCgoKWydzZXgnLCAzLCB0cnVlLCBmYWxzZSwgJ3gnXSwKCgpbJ3NlenonLCA0LCB0cnVlLCBmYWxzZSwgJ3onXSwKCgpbJ3N1YWUnLCA0LCBmYWxzZSwgdHJ1ZSwgJ2VhdSddLAoKClsnc2VlJywgMywgdHJ1ZSwgdHJ1ZSwgJ2VlJ10sCgoKWydzZWdkJywgNCwgdHJ1ZSwgdHJ1ZSwgJ2RnZSddLAoKCgoKWydzZScsIDIsIHRydWUsIHRydWUsIFsnJywgJ2UnXV0sCgoKWydzdXRhdHMnLCA2LCB0cnVlLCB0cnVlLCAnc3RhdHVzJ10sCgoKWydzJywgMSwgdHJ1ZSwgdHJ1ZSwgJyddLAoKClsneHVhZScsIDQsIGZhbHNlLCB0cnVlLCAnZWF1J10sCgoKWydlbHBvZXAnLCA2LCB0cnVlLCB0cnVlLCAncGVyc29uJ10sCl07CgoKCgoKCnByaXZhdGUgY29uc3QgU0lOR1VMQVJfTUFQID0gWwoKCgoKCgoKWydzaXhhJywgNCwgZmFsc2UsIGZhbHNlLCAnYXhlcyddLAoKClsnYWlyZXRpcmMnLCA4LCBmYWxzZSwgZmFsc2UsICdjcml0ZXJpb24nXSwKCgpbJ2FsdWJlbicsIDYsIGZhbHNlLCBmYWxzZSwgJ25lYnVsYWUnXSwKCgpbJ2RsaWhjJywgNSwgdHJ1ZSwgdHJ1ZSwgJ2NoaWxkcmVuJ10sCgoKWydlY2knLCAzLCBmYWxzZSwgdHJ1ZSwgJ2ljZXMnXSwKCgpbJ2VjaXZyZXMnLCA3LCB0cnVlLCB0cnVlLCAnc2VydmljZXMnXSwKCgpbJ2VmaScsIDMsIGZhbHNlLCB0cnVlLCAnaXZlcyddLAoKClsnZWlmbGVzJywgNiwgdHJ1ZSwgdHJ1ZSwgJ3NlbGZpZXMnXSwKCgpbJ2Vpdm9tJywgNSwgdHJ1ZSwgdHJ1ZSwgJ21vdmllcyddLAoKClsnZXN1b2wnLCA1LCBmYWxzZSwgdHJ1ZSwgJ2xpY2UnXSwKCgpbJ2VzdW9tJywgNSwgZmFsc2UsIHRydWUsICdtaWNlJ10sCgoKWydlc29vJywgNCwgZmFsc2UsIHRydWUsICdlZXNlJ10sCgoKWydlcycsIDIsIHRydWUsIHRydWUsICdzZXMnXSwKCgpbJ2Vzb29nJywgNSwgdHJ1ZSwgdHJ1ZSwgJ2dlZXNlJ10sCgoKWydldicsIDIsIHRydWUsIHRydWUsICd2ZXMnXSwKCgpbJ2V2aXJkJywgNSwgZmFsc2UsIHRydWUsICdkcml2ZXMnXSwKCgpbJ2V2aXQnLCA0LCB0cnVlLCB0cnVlLCAndGl2ZXMnXSwKCgpbJ2V2b20nLCA0LCB0cnVlLCB0cnVlLCAnbW92ZXMnXSwKCgpbJ2ZmYXRzJywgNSwgdHJ1ZSwgdHJ1ZSwgJ3N0YXZlcyddLAoKClsnZmYnLCAyLCB0cnVlLCB0cnVlLCAnZmZzJ10sCgoKWydmJywgMSwgdHJ1ZSwgdHJ1ZSwgWydmcycsICd2ZXMnXV0sCgoKWydoYycsIDIsIHRydWUsIHRydWUsICdjaGVzJ10sCgoKWydocycsIDIsIHRydWUsIHRydWUsICdzaGVzJ10sCgoKWydodG9vdCcsIDUsIHRydWUsIHRydWUsICd0ZWV0aCddLAoKClsnbXVibGEnLCA1LCB0cnVlLCB0cnVlLCAnYWxidW1zJ10sCgoKWydtdScsIDIsIHRydWUsIHRydWUsICdhJ10sCgoKWyduYW0nLCAzLCB0cnVlLCB0cnVlLCAnbWVuJ10sCgoKWydub3NyZXAnLCA2LCB0cnVlLCB0cnVlLCBbJ3BlcnNvbnMnLCAncGVvcGxlJ11dLAoKClsnbm9pcmV0aXJjJywgOSwgdHJ1ZSwgdHJ1ZSwgJ2NyaXRlcmlhJ10sCgoKWydub25lbW9uZWhwJywgMTAsIHRydWUsIHRydWUsICdwaGVub21lbmEnXSwKCgpbJ29oY2UnLCA0LCB0cnVlLCB0cnVlLCAnZWNob2VzJ10sCgoKWydvcmVoJywgNCwgdHJ1ZSwgdHJ1ZSwgJ2hlcm9lcyddLAoKClsnc2FsdGEnLCA1LCB0cnVlLCB0cnVlLCAnYXRsYXNlcyddLAoKClsnc2FpbGEnLCA1LCB0cnVlLCB0cnVlLCAnYWxpYXNlcyddLAoKClsnc2lyaScsIDQsIHRydWUsIHRydWUsICdpcmlzZXMnXSwKCgoKClsnc2lzJywgMywgdHJ1ZSwgdHJ1ZSwgJ3NlcyddLAoKClsnc3MnLCAyLCB0cnVlLCBmYWxzZSwgJ3NzZXMnXSwKCgpbJ3N1YmFsbHlzJywgOCwgdHJ1ZSwgdHJ1ZSwgJ3N5bGxhYmknXSwKCgpbJ3N1YicsIDMsIHRydWUsIHRydWUsICdidXNlcyddLAoKClsnc3VjJywgMywgdHJ1ZSwgdHJ1ZSwgJ2N1c2VzJ10sCgoKWydzdXBtYWNvcHBpaCcsIDExLCBmYWxzZSwgZmFsc2UsICdoaXBwb2NhbXBpJ10sCgoKWydzdXAnLCAzLCB0cnVlLCB0cnVlLCAncHVzZXMnXSwKCgpbJ3N1dGF0cycsIDYsIHRydWUsIHRydWUsIFsnc3RhdHVzJywgJ3N0YXR1c2VzJ11dLAoKClsnc3V0Y2VwJywgNiwgdHJ1ZSwgdHJ1ZSwgJ3BlY3R1c2VzJ10sCgoKWydzdScsIDIsIHRydWUsIHRydWUsICdpJ10sCgoKWydzd2VuJywgNCwgdHJ1ZSwgdHJ1ZSwgJ25ld3MnXSwKCgpbJ3Rvb2YnLCA0LCB0cnVlLCB0cnVlLCAnZmVldCddLAoKClsndWFlJywgMywgZmFsc2UsIHRydWUsIFsnZWF1cycsICdlYXV4J11dLAoKClsneG8nLCAyLCBmYWxzZSwgZmFsc2UsICdveGVuJ10sCgoKWyd4YW9oJywgNCwgdHJ1ZSwgZmFsc2UsICdob2F4ZXMnXSwKCgpbJ3hlZG5pJywgNSwgZmFsc2UsIHRydWUsIFsnaW5kaWNpZXMnLCAnaW5kZXhlcyddXSwKCgpbJ3hhZicsIDMsIHRydWUsIHRydWUsIFsnZmF4ZXMnLCAnZmF4eGVzJ11dLAoKClsneG8nLCAyLCBmYWxzZSwgdHJ1ZSwgJ294ZXMnXSwKCgpbJ3gnLCAxLCB0cnVlLCBmYWxzZSwgWydjZXMnLCAneGVzJ11dLAoKClsneScsIDEsIGZhbHNlLCB0cnVlLCAnaWVzJ10sCgoKWyd6aXVxJywgNCwgdHJ1ZSwgZmFsc2UsICdxdWl6emVzJ10sCgoKWyd6JywgMSwgdHJ1ZSwgdHJ1ZSwgJ3plcyddLApdOwoKCgoKcHJpdmF0ZSBjb25zdCBVTklORkxFQ1RFRCA9IFsKJycsCgoKJ2F0YWQnLAoKCidyZWVkJywKCgondG5lbXBpdXFlJywKCgona2NhYmRlZWYnLAoKCidoc2lmJywKCgonaHRsYWVoJywKCgoneXJvdHNpaCcsCgoKJ29mbmknLAoKCidub2l0YW1yb2ZuaScsCgoKJ3llbm9tJywKCgonZXNvb20nLAoKCidzZWlyZXMnLAoKCidwZWVocycsCgoKJ3NlaWNlcHMnLAoKCidjaWZmYXJ0JywKCgondGZhcmNyaWEnLAoKCidlcmF3ZHJhaCcsCl07CgpwdWJsaWMgZnVuY3Rpb24gc2luZ3VsYXJpemUoc3RyaW5nICRwbHVyYWwpOiBhcnJheQp7CiRwbHVyYWxSZXYgPSBzdHJyZXYoJHBsdXJhbCk7CiRsb3dlclBsdXJhbFJldiA9IHN0cnRvbG93ZXIoJHBsdXJhbFJldik7CiRwbHVyYWxMZW5ndGggPSBcc3RybGVuKCRsb3dlclBsdXJhbFJldik7CgoKaWYgKFxpbl9hcnJheSgkbG93ZXJQbHVyYWxSZXYsIHNlbGY6OlVOSU5GTEVDVEVELCB0cnVlKSkgewpyZXR1cm4gWyRwbHVyYWxdOwp9CgoKCgoKZm9yZWFjaCAoc2VsZjo6UExVUkFMX01BUCBhcyAkbWFwKSB7CiRzdWZmaXggPSAkbWFwWzBdOwokc3VmZml4TGVuZ3RoID0gJG1hcFsxXTsKJGogPSAwOwoKCgp3aGlsZSAoJHN1ZmZpeFskal0gPT09ICRsb3dlclBsdXJhbFJldlskal0pIHsKCisrJGo7CgoKCmlmICgkaiA9PT0gJHN1ZmZpeExlbmd0aCkgewoKaWYgKCRqIDwgJHBsdXJhbExlbmd0aCkgewokbmV4dElzVm93ZWwgPSBzdHJfY29udGFpbnMoJ2FlaW91JywgJGxvd2VyUGx1cmFsUmV2WyRqXSk7CgppZiAoISRtYXBbMl0gJiYgJG5leHRJc1Zvd2VsKSB7CgpicmVhazsKfQoKaWYgKCEkbWFwWzNdICYmICEkbmV4dElzVm93ZWwpIHsKCmJyZWFrOwp9Cn0KCiRuZXdCYXNlID0gc3Vic3RyKCRwbHVyYWwsIDAsICRwbHVyYWxMZW5ndGggLSAkc3VmZml4TGVuZ3RoKTsKJG5ld1N1ZmZpeCA9ICRtYXBbNF07CgoKCgokZmlyc3RVcHBlciA9IGN0eXBlX3VwcGVyKCRwbHVyYWxSZXZbJGogLSAxXSk7CgppZiAoXGlzX2FycmF5KCRuZXdTdWZmaXgpKSB7CiRzaW5ndWxhcnMgPSBbXTsKCmZvcmVhY2ggKCRuZXdTdWZmaXggYXMgJG5ld1N1ZmZpeEVudHJ5KSB7CiRzaW5ndWxhcnNbXSA9ICRuZXdCYXNlLigkZmlyc3RVcHBlciA/IHVjZmlyc3QoJG5ld1N1ZmZpeEVudHJ5KSA6ICRuZXdTdWZmaXhFbnRyeSk7Cn0KCnJldHVybiAkc2luZ3VsYXJzOwp9CgpyZXR1cm4gWyRuZXdCYXNlLigkZmlyc3RVcHBlciA/IHVjZmlyc3QoJG5ld1N1ZmZpeCkgOiAkbmV3U3VmZml4KV07Cn0KCgppZiAoJGogPT09ICRwbHVyYWxMZW5ndGgpIHsKYnJlYWs7Cn0KfQp9CgoKcmV0dXJuIFskcGx1cmFsXTsKfQoKcHVibGljIGZ1bmN0aW9uIHBsdXJhbGl6ZShzdHJpbmcgJHNpbmd1bGFyKTogYXJyYXkKewokc2luZ3VsYXJSZXYgPSBzdHJyZXYoJHNpbmd1bGFyKTsKJGxvd2VyU2luZ3VsYXJSZXYgPSBzdHJ0b2xvd2VyKCRzaW5ndWxhclJldik7CiRzaW5ndWxhckxlbmd0aCA9IFxzdHJsZW4oJGxvd2VyU2luZ3VsYXJSZXYpOwoKCmlmIChcaW5fYXJyYXkoJGxvd2VyU2luZ3VsYXJSZXYsIHNlbGY6OlVOSU5GTEVDVEVELCB0cnVlKSkgewpyZXR1cm4gWyRzaW5ndWxhcl07Cn0KCgoKCgpmb3JlYWNoIChzZWxmOjpTSU5HVUxBUl9NQVAgYXMgJG1hcCkgewokc3VmZml4ID0gJG1hcFswXTsKJHN1ZmZpeExlbmd0aCA9ICRtYXBbMV07CiRqID0gMDsKCgoKCndoaWxlICgkc3VmZml4WyRqXSA9PT0gJGxvd2VyU2luZ3VsYXJSZXZbJGpdKSB7CgorKyRqOwoKCgppZiAoJGogPT09ICRzdWZmaXhMZW5ndGgpIHsKCmlmICgkaiA8ICRzaW5ndWxhckxlbmd0aCkgewokbmV4dElzVm93ZWwgPSBzdHJfY29udGFpbnMoJ2FlaW91JywgJGxvd2VyU2luZ3VsYXJSZXZbJGpdKTsKCmlmICghJG1hcFsyXSAmJiAkbmV4dElzVm93ZWwpIHsKCmJyZWFrOwp9CgppZiAoISRtYXBbM10gJiYgISRuZXh0SXNWb3dlbCkgewoKYnJlYWs7Cn0KfQoKJG5ld0Jhc2UgPSBzdWJzdHIoJHNpbmd1bGFyLCAwLCAkc2luZ3VsYXJMZW5ndGggLSAkc3VmZml4TGVuZ3RoKTsKJG5ld1N1ZmZpeCA9ICRtYXBbNF07CgoKCgokZmlyc3RVcHBlciA9IGN0eXBlX3VwcGVyKCRzaW5ndWxhclJldlskaiAtIDFdKTsKCmlmIChcaXNfYXJyYXkoJG5ld1N1ZmZpeCkpIHsKJHBsdXJhbHMgPSBbXTsKCmZvcmVhY2ggKCRuZXdTdWZmaXggYXMgJG5ld1N1ZmZpeEVudHJ5KSB7CiRwbHVyYWxzW10gPSAkbmV3QmFzZS4oJGZpcnN0VXBwZXIgPyB1Y2ZpcnN0KCRuZXdTdWZmaXhFbnRyeSkgOiAkbmV3U3VmZml4RW50cnkpOwp9CgpyZXR1cm4gJHBsdXJhbHM7Cn0KCnJldHVybiBbJG5ld0Jhc2UuKCRmaXJzdFVwcGVyID8gdWNmaXJzdCgkbmV3U3VmZml4KSA6ICRuZXdTdWZmaXgpXTsKfQoKCmlmICgkaiA9PT0gJHNpbmd1bGFyTGVuZ3RoKSB7CmJyZWFrOwp9Cn0KfQoKCnJldHVybiBbJHNpbmd1bGFyLidzJ107Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xJbmZsZWN0b3I7CgoKCgoKCmZpbmFsIGNsYXNzIEZyZW5jaEluZmxlY3RvciBpbXBsZW1lbnRzIEluZmxlY3RvckludGVyZmFjZQp7CgoKCgoKcHJpdmF0ZSBjb25zdCBQTFVSQUxJWkVfUkVHRVhQID0gWwoKCgoKClsnLyhzfHh8eikkL2knLCAnXDEnXSwKCgoKWycvKGVhdSkkL2knLCAnXDF4J10sCgoKClsnL14obGFuZGF1KSQvaScsICdcMXMnXSwKWycvKGF1KSQvaScsICdcMXgnXSwKCgoKWycvXihwbmV1fGJsZXV8w6ltZXUpJC9pJywgJ1wxcyddLApbJy8oZXUpJC9pJywgJ1wxeCddLAoKCgpbJy9eKGJhbHxjYXJuYXZhbHxjYXJhY2FsfGNoYWNhbHxjaG9yYWx8Y29ycmFsfMOpdGFsfGZlc3RpdmFsfHLDqWNpdGFsfHZhbCkkL2knLCAnXDFzJ10sClsnL2FsJC9pJywgJ1wxYXV4J10sCgoKWycvXihhc3BpcnxifGNvcnzDqW18ZmVybXxzb3VwaXJ8dHJhdnx2YW50fHZpdHIpYWlsJC9pJywgJ1wxYXV4J10sCgoKWycvXihiaWp8Y2FpbGx8Y2h8Z2VufGhpYnxqb3VqfHApb3UkL2knLCAnXDFvdXgnXSwKCgpbJy9eKGNpbnF1YW50ZXxzb2l4YW50ZXxtaWxsZSkkL2knLCAnXDEnXSwKCgpbJy9eKG1vbnxtYSkoc2lldXJ8ZGFtZXxkZW1vaXNlbGxlfHNlaWduZXVyKSQvJywgJ21lc1wycyddLApbJy9eKE1vbnxNYSkoc2lldXJ8ZGFtZXxkZW1vaXNlbGxlfHNlaWduZXVyKSQvJywgJ01lc1wycyddLApdOwoKCgoKcHJpdmF0ZSBjb25zdCBTSU5HVUxBUklaRV9SRUdFWFAgPSBbCgoKCgpbJy8oKGFzcGlyfGJ8Y29yfMOpbXxmZXJtfHNvdXBpcnx0cmF2fHZhbnR8dml0cikpYXV4JC9pJywgJ1wxYWlsJ10sCgoKClsnLyhlYXUpeCQvaScsICdcMSddLAoKCgpbJy8oYW1pcnxhbmltfGFyc2VufGJvY3xjYW58Y2FwaXR8Y2Fwb3J8Y2hldnxjcmlzdHxnw6luw6lyfGhvcGl0fGjDtHBpdHxpZMOpfGpvdXJufGxpdHRvcnxsb2N8bXxtw6l0fG1pbsOpcnxwcmluY2lwfHJhZGljfHRlcm1pbilhdXgkL2knLCAnXDFhbCddLAoKCgpbJy8oYXUpeCQvaScsICdcMSddLAoKCgpbJy8oZXUpeCQvaScsICdcMSddLAoKCgpbJy8oYmlqfGNhaWxsfGNofGdlbnxoaWJ8am91anxwKW91eCQvaScsICdcMW91J10sCgoKWycvXm1lcyhkYW1lfGRlbW9pc2VsbGUpcyQvJywgJ21hXDEnXSwKWycvXk1lcyhkYW1lfGRlbW9pc2VsbGUpcyQvJywgJ01hXDEnXSwKWycvXm1lcyhzaWV1cnxzZWlnbmV1cilzJC8nLCAnbW9uXDEnXSwKWycvXk1lcyhzaWV1cnxzZWlnbmV1cilzJC8nLCAnTW9uXDEnXSwKCgpbJy9zJC9pJywgJyddLApdOwoKCgoKCnByaXZhdGUgY29uc3QgVU5JTkZMRUNURUQgPSAnL14oYWJjw6hzfGFjY8Ooc3xhYnVzfGFsYmF0cm9zfGFuY2hvaXN8YW5nbGFpc3xhdXRvYnVzfGJvaXN8YnJlYmlzfGNhcnF1b2lzfGNhc3xjaGFzfGNvbGlzfGNvbmNvdXJzfGNvcnBzfGNvdXJzfGN5cHLDqHN8ZMOpY8Ooc3xkZXZpc3xkaXNjb3Vyc3xkb3N8ZW1iYXJyYXN8ZW5ncmFpc3xlbnRyZWxhY3N8ZXhjw6hzfGZpbHN8Zm9pc3xnw6JjaGlzfGdhcnN8Z2xhc3xow6lyb3N8aW50cnVzfGphcnN8anVzfGtlcm3DqHN8bGFjaXN8bGVnc3xsaWxhc3xtYXJhaXN8bWFyc3xtYXRlbGFzfG3DqXByaXN8bWV0c3xtb2lzfG1vcnN8b2J1c3xvc3xwYWxhaXN8cGFyYWRpc3xwYXJjb3Vyc3xwYXJkZXNzdXN8cGF5c3xwbHVzaWV1cnN8cG9pZHN8cG9pc3xwb3Vsc3xwcmludGVtcHN8cHJvY2Vzc3VzfHByb2dyw6hzfHB1aXRzfHB1c3xyYWJhaXN8cmFkaXN8cmVjb3JzfHJlY291cnN8cmVmdXN8cmVsYWlzfHJlbW9yZHN8cmVtb3VzfHJpY3R1c3xyaGlub2PDqXJvc3xyZXBhc3xydWJpc3xzYW5zfHNhc3xzZWNvdXJzfHNlbnN8c291cmlzfHN1Y2PDqHN8dGFsdXN8dGFwaXN8dGFzfHRhdWRpc3x0ZW1wc3x0aWVyc3x1bml2ZXJzfHZlbG91cnN8dmVyZ2xhc3x2ZXJuaXN8dmlydXMpJC9pJzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzaW5ndWxhcml6ZShzdHJpbmcgJHBsdXJhbCk6IGFycmF5CnsKaWYgKCR0aGlzLT5pc0luZmxlY3RlZFdvcmQoJHBsdXJhbCkpIHsKcmV0dXJuIFskcGx1cmFsXTsKfQoKZm9yZWFjaCAoc2VsZjo6U0lOR1VMQVJJWkVfUkVHRVhQIGFzICRydWxlKSB7ClskcmVnZXhwLCAkcmVwbGFjZV0gPSAkcnVsZTsKCmlmICgxID09PSBwcmVnX21hdGNoKCRyZWdleHAsICRwbHVyYWwpKSB7CnJldHVybiBbcHJlZ19yZXBsYWNlKCRyZWdleHAsICRyZXBsYWNlLCAkcGx1cmFsKV07Cn0KfQoKcmV0dXJuIFskcGx1cmFsXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHBsdXJhbGl6ZShzdHJpbmcgJHNpbmd1bGFyKTogYXJyYXkKewppZiAoJHRoaXMtPmlzSW5mbGVjdGVkV29yZCgkc2luZ3VsYXIpKSB7CnJldHVybiBbJHNpbmd1bGFyXTsKfQoKZm9yZWFjaCAoc2VsZjo6UExVUkFMSVpFX1JFR0VYUCBhcyAkcnVsZSkgewpbJHJlZ2V4cCwgJHJlcGxhY2VdID0gJHJ1bGU7CgppZiAoMSA9PT0gcHJlZ19tYXRjaCgkcmVnZXhwLCAkc2luZ3VsYXIpKSB7CnJldHVybiBbcHJlZ19yZXBsYWNlKCRyZWdleHAsICRyZXBsYWNlLCAkc2luZ3VsYXIpXTsKfQp9CgpyZXR1cm4gWyRzaW5ndWxhci4ncyddOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGlzSW5mbGVjdGVkV29yZChzdHJpbmcgJHdvcmQpOiBib29sCnsKcmV0dXJuIDEgPT09IHByZWdfbWF0Y2goc2VsZjo6VU5JTkZMRUNURUQsICR3b3JkKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEluZmxlY3RvcjsKCmludGVyZmFjZSBJbmZsZWN0b3JJbnRlcmZhY2UKewoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNpbmd1bGFyaXplKHN0cmluZyAkcGx1cmFsKTogYXJyYXk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBsdXJhbGl6ZShzdHJpbmcgJHNpbmd1bGFyKTogYXJyYXk7Cn0KCkNvcHlyaWdodCAoYykgMjAxOS1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZzsKCgoKCgoKY2xhc3MgTGF6eVN0cmluZyBpbXBsZW1lbnRzIFxTdHJpbmdhYmxlLCBcSnNvblNlcmlhbGl6YWJsZQp7CnByaXZhdGUgJHZhbHVlOwoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21DYWxsYWJsZSgkY2FsbGJhY2ssIC4uLiRhcmd1bWVudHMpOiBzZWxmCnsKaWYgKCFcaXNfY2FsbGFibGUoJGNhbGxiYWNrKSAmJiAhKFxpc19hcnJheSgkY2FsbGJhY2spICYmIGlzc2V0KCRjYWxsYmFja1swXSkgJiYgJGNhbGxiYWNrWzBdIGluc3RhbmNlb2YgXENsb3N1cmUgJiYgMiA+PSBcY291bnQoJGNhbGxiYWNrKSkpIHsKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignQXJndW1lbnQgMSBwYXNzZWQgdG8gIiVzKCkiIG11c3QgYmUgYSBjYWxsYWJsZSBvciBhIFtDbG9zdXJlLCBtZXRob2RdIGxhenktY2FsbGFibGUsICIlcyIgZ2l2ZW4uJywgX19NRVRIT0RfXywgZ2V0X2RlYnVnX3R5cGUoJGNhbGxiYWNrKSkpOwp9CgokbGF6eVN0cmluZyA9IG5ldyBzdGF0aWMoKTsKJGxhenlTdHJpbmctPnZhbHVlID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJiRjYWxsYmFjaywgJiRhcmd1bWVudHMsICYkdmFsdWUpOiBzdHJpbmcgewppZiAobnVsbCAhPT0gJGFyZ3VtZW50cykgewppZiAoIVxpc19jYWxsYWJsZSgkY2FsbGJhY2spKSB7CiRjYWxsYmFja1swXSA9ICRjYWxsYmFja1swXSgpOwokY2FsbGJhY2tbMV0gPSAkY2FsbGJhY2tbMV0gPz8gJ19faW52b2tlJzsKfQokdmFsdWUgPSAkY2FsbGJhY2soLi4uJGFyZ3VtZW50cyk7CiRjYWxsYmFjayA9IHNlbGY6OmdldFByZXR0eU5hbWUoJGNhbGxiYWNrKTsKJGFyZ3VtZW50cyA9IG51bGw7Cn0KCnJldHVybiAkdmFsdWUgPz8gJyc7Cn07CgpyZXR1cm4gJGxhenlTdHJpbmc7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tU3RyaW5nYWJsZSgkdmFsdWUpOiBzZWxmCnsKaWYgKCFzZWxmOjppc1N0cmluZ2FibGUoJHZhbHVlKSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAxIHBhc3NlZCB0byAiJXMoKSIgbXVzdCBiZSBhIHNjYWxhciBvciBhIHN0cmluZ2FibGUgb2JqZWN0LCAiJXMiIGdpdmVuLicsIF9fTUVUSE9EX18sIGdldF9kZWJ1Z190eXBlKCR2YWx1ZSkpKTsKfQoKaWYgKFxpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm4gc3RhdGljOjpmcm9tQ2FsbGFibGUoWyR2YWx1ZSwgJ19fdG9TdHJpbmcnXSk7Cn0KCiRsYXp5U3RyaW5nID0gbmV3IHN0YXRpYygpOwokbGF6eVN0cmluZy0+dmFsdWUgPSAoc3RyaW5nKSAkdmFsdWU7CgpyZXR1cm4gJGxhenlTdHJpbmc7Cn0KCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNTdHJpbmdhYmxlKCR2YWx1ZSk6IGJvb2wKewpyZXR1cm4gXGlzX3N0cmluZygkdmFsdWUpIHx8ICR2YWx1ZSBpbnN0YW5jZW9mIHNlbGYgfHwgKFxpc19vYmplY3QoJHZhbHVlKSA/IG1ldGhvZF9leGlzdHMoJHZhbHVlLCAnX190b1N0cmluZycpIDogXGlzX3NjYWxhcigkdmFsdWUpKTsKfQoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzb2x2ZSgkdmFsdWUpOiBzdHJpbmcKewpyZXR1cm4gJHZhbHVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKaWYgKFxpc19zdHJpbmcoJHRoaXMtPnZhbHVlKSkgewpyZXR1cm4gJHRoaXMtPnZhbHVlOwp9Cgp0cnkgewpyZXR1cm4gJHRoaXMtPnZhbHVlID0gKCR0aGlzLT52YWx1ZSkoKTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewppZiAoXFR5cGVFcnJvcjo6Y2xhc3MgPT09IFxnZXRfY2xhc3MoJGUpICYmIF9fRklMRV9fID09PSAkZS0+Z2V0RmlsZSgpKSB7CiR0eXBlID0gZXhwbG9kZSgnLCAnLCAkZS0+Z2V0TWVzc2FnZSgpKTsKJHR5cGUgPSBzdWJzdHIoYXJyYXlfcG9wKCR0eXBlKSwgMCwgLVxzdHJsZW4oJyByZXR1cm5lZCcpKTsKJHIgPSBuZXcgXFJlZmxlY3Rpb25GdW5jdGlvbigkdGhpcy0+dmFsdWUpOwokY2FsbGJhY2sgPSAkci0+Z2V0U3RhdGljVmFyaWFibGVzKClbJ2NhbGxiYWNrJ107CgokZSA9IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ1JldHVybiB2YWx1ZSBvZiAlcygpIHBhc3NlZCB0byAlczo6ZnJvbUNhbGxhYmxlKCkgbXVzdCBiZSBvZiB0aGUgdHlwZSBzdHJpbmcsICVzIHJldHVybmVkLicsICRjYWxsYmFjaywgc3RhdGljOjpjbGFzcywgJHR5cGUpKTsKfQoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDcwNDAwKSB7CgpyZXR1cm4gdHJpZ2dlcl9lcnJvcigkZSwgXEVfVVNFUl9FUlJPUik7Cn0KCnRocm93ICRlOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3NsZWVwKCk6IGFycmF5CnsKJHRoaXMtPl9fdG9TdHJpbmcoKTsKCnJldHVybiBbJ3ZhbHVlJ107Cn0KCnB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+X190b1N0cmluZygpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKewp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRQcmV0dHlOYW1lKGNhbGxhYmxlICRjYWxsYmFjayk6IHN0cmluZwp7CmlmIChcaXNfc3RyaW5nKCRjYWxsYmFjaykpIHsKcmV0dXJuICRjYWxsYmFjazsKfQoKaWYgKFxpc19hcnJheSgkY2FsbGJhY2spKSB7CiRjbGFzcyA9IFxpc19vYmplY3QoJGNhbGxiYWNrWzBdKSA/IGdldF9kZWJ1Z190eXBlKCRjYWxsYmFja1swXSkgOiAkY2FsbGJhY2tbMF07CiRtZXRob2QgPSAkY2FsbGJhY2tbMV07Cn0gZWxzZWlmICgkY2FsbGJhY2sgaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewokciA9IG5ldyBcUmVmbGVjdGlvbkZ1bmN0aW9uKCRjYWxsYmFjayk7CgppZiAoc3RyX2NvbnRhaW5zKCRyLT5uYW1lLCAne2Nsb3N1cmUnKSB8fCAhJGNsYXNzID0gXFBIUF9WRVJTSU9OX0lEID49IDgwMTExID8gJHItPmdldENsb3N1cmVDYWxsZWRDbGFzcygpIDogJHItPmdldENsb3N1cmVTY29wZUNsYXNzKCkpIHsKcmV0dXJuICRyLT5uYW1lOwp9CgokY2xhc3MgPSAkY2xhc3MtPm5hbWU7CiRtZXRob2QgPSAkci0+bmFtZTsKfSBlbHNlIHsKJGNsYXNzID0gZ2V0X2RlYnVnX3R5cGUoJGNhbGxiYWNrKTsKJG1ldGhvZCA9ICdfX2ludm9rZSc7Cn0KCnJldHVybiAkY2xhc3MuJzo6Jy4kbWV0aG9kOwp9Cn0KPD9waHAKCgoKCgoKCgpyZXR1cm4gWwpbCjQzNTIsCjQ0NDcsCl0sClsKODk4NiwKODk4NywKXSwKWwo5MDAxLAo5MDAxLApdLApbCjkwMDIsCjkwMDIsCl0sClsKOTE5MywKOTE5NiwKXSwKWwo5MjAwLAo5MjAwLApdLApbCjkyMDMsCjkyMDMsCl0sClsKOTcyNSwKOTcyNiwKXSwKWwo5NzQ4LAo5NzQ5LApdLApbCjk3NzYsCjk3ODMsCl0sClsKOTgwMCwKOTgxMSwKXSwKWwo5ODU1LAo5ODU1LApdLApbCjk4NjYsCjk4NzEsCl0sClsKOTg3NSwKOTg3NSwKXSwKWwo5ODg5LAo5ODg5LApdLApbCjk4OTgsCjk4OTksCl0sClsKOTkxNywKOTkxOCwKXSwKWwo5OTI0LAo5OTI1LApdLApbCjk5MzQsCjk5MzQsCl0sClsKOTk0MCwKOTk0MCwKXSwKWwo5OTYyLAo5OTYyLApdLApbCjk5NzAsCjk5NzEsCl0sClsKOTk3MywKOTk3MywKXSwKWwo5OTc4LAo5OTc4LApdLApbCjk5ODEsCjk5ODEsCl0sClsKOTk4OSwKOTk4OSwKXSwKWwo5OTk0LAo5OTk1LApdLApbCjEwMDI0LAoxMDAyNCwKXSwKWwoxMDA2MCwKMTAwNjAsCl0sClsKMTAwNjIsCjEwMDYyLApdLApbCjEwMDY3LAoxMDA2OSwKXSwKWwoxMDA3MSwKMTAwNzEsCl0sClsKMTAxMzMsCjEwMTM1LApdLApbCjEwMTYwLAoxMDE2MCwKXSwKWwoxMDE3NSwKMTAxNzUsCl0sClsKMTEwMzUsCjExMDM2LApdLApbCjExMDg4LAoxMTA4OCwKXSwKWwoxMTA5MywKMTEwOTMsCl0sClsKMTE5MDQsCjExOTI5LApdLApbCjExOTMxLAoxMjAxOSwKXSwKWwoxMjAzMiwKMTIyNDUsCl0sClsKMTIyNzIsCjEyMjg3LApdLApbCjEyMjg4LAoxMjI4OCwKXSwKWwoxMjI4OSwKMTIyOTEsCl0sClsKMTIyOTIsCjEyMjkyLApdLApbCjEyMjkzLAoxMjI5MywKXSwKWwoxMjI5NCwKMTIyOTQsCl0sClsKMTIyOTUsCjEyMjk1LApdLApbCjEyMjk2LAoxMjI5NiwKXSwKWwoxMjI5NywKMTIyOTcsCl0sClsKMTIyOTgsCjEyMjk4LApdLApbCjEyMjk5LAoxMjI5OSwKXSwKWwoxMjMwMCwKMTIzMDAsCl0sClsKMTIzMDEsCjEyMzAxLApdLApbCjEyMzAyLAoxMjMwMiwKXSwKWwoxMjMwMywKMTIzMDMsCl0sClsKMTIzMDQsCjEyMzA0LApdLApbCjEyMzA1LAoxMjMwNSwKXSwKWwoxMjMwNiwKMTIzMDcsCl0sClsKMTIzMDgsCjEyMzA4LApdLApbCjEyMzA5LAoxMjMwOSwKXSwKWwoxMjMxMCwKMTIzMTAsCl0sClsKMTIzMTEsCjEyMzExLApdLApbCjEyMzEyLAoxMjMxMiwKXSwKWwoxMjMxMywKMTIzMTMsCl0sClsKMTIzMTQsCjEyMzE0LApdLApbCjEyMzE1LAoxMjMxNSwKXSwKWwoxMjMxNiwKMTIzMTYsCl0sClsKMTIzMTcsCjEyMzE3LApdLApbCjEyMzE4LAoxMjMxOSwKXSwKWwoxMjMyMCwKMTIzMjAsCl0sClsKMTIzMjEsCjEyMzI5LApdLApbCjEyMzMwLAoxMjMzMywKXSwKWwoxMjMzNCwKMTIzMzUsCl0sClsKMTIzMzYsCjEyMzM2LApdLApbCjEyMzM3LAoxMjM0MSwKXSwKWwoxMjM0MiwKMTIzNDMsCl0sClsKMTIzNDQsCjEyMzQ2LApdLApbCjEyMzQ3LAoxMjM0NywKXSwKWwoxMjM0OCwKMTIzNDgsCl0sClsKMTIzNDksCjEyMzQ5LApdLApbCjEyMzUwLAoxMjM1MCwKXSwKWwoxMjM1MywKMTI0MzgsCl0sClsKMTI0NDEsCjEyNDQyLApdLApbCjEyNDQzLAoxMjQ0NCwKXSwKWwoxMjQ0NSwKMTI0NDYsCl0sClsKMTI0NDcsCjEyNDQ3LApdLApbCjEyNDQ4LAoxMjQ0OCwKXSwKWwoxMjQ0OSwKMTI1MzgsCl0sClsKMTI1MzksCjEyNTM5LApdLApbCjEyNTQwLAoxMjU0MiwKXSwKWwoxMjU0MywKMTI1NDMsCl0sClsKMTI1NDksCjEyNTkxLApdLApbCjEyNTkzLAoxMjY4NiwKXSwKWwoxMjY4OCwKMTI2ODksCl0sClsKMTI2OTAsCjEyNjkzLApdLApbCjEyNjk0LAoxMjcwMywKXSwKWwoxMjcwNCwKMTI3MzUsCl0sClsKMTI3MzYsCjEyNzczLApdLApbCjEyNzgzLAoxMjc4MywKXSwKWwoxMjc4NCwKMTI3OTksCl0sClsKMTI4MDAsCjEyODMwLApdLApbCjEyODMyLAoxMjg0MSwKXSwKWwoxMjg0MiwKMTI4NzEsCl0sClsKMTI4ODAsCjEyODgwLApdLApbCjEyODgxLAoxMjg5NSwKXSwKWwoxMjg5NiwKMTI5MjcsCl0sClsKMTI5MjgsCjEyOTM3LApdLApbCjEyOTM4LAoxMjk3NiwKXSwKWwoxMjk3NywKMTI5OTEsCl0sClsKMTI5OTIsCjEzMDU1LApdLApbCjEzMDU2LAoxMzMxMSwKXSwKWwoxMzMxMiwKMTk5MDMsCl0sClsKMTk5MDQsCjE5OTY3LApdLApbCjE5OTY4LAo0MDk1OSwKXSwKWwo0MDk2MCwKNDA5ODAsCl0sClsKNDA5ODEsCjQwOTgxLApdLApbCjQwOTgyLAo0MjEyNCwKXSwKWwo0MjEyOCwKNDIxODIsCl0sClsKNDMzNjAsCjQzMzg4LApdLApbCjQ0MDMyLAo1NTIwMywKXSwKWwo2Mzc0NCwKNjQxMDksCl0sClsKNjQxMTAsCjY0MTExLApdLApbCjY0MTEyLAo2NDIxNywKXSwKWwo2NDIxOCwKNjQyNTUsCl0sClsKNjUwNDAsCjY1MDQ2LApdLApbCjY1MDQ3LAo2NTA0NywKXSwKWwo2NTA0OCwKNjUwNDgsCl0sClsKNjUwNDksCjY1MDQ5LApdLApbCjY1MDcyLAo2NTA3MiwKXSwKWwo2NTA3MywKNjUwNzQsCl0sClsKNjUwNzUsCjY1MDc2LApdLApbCjY1MDc3LAo2NTA3NywKXSwKWwo2NTA3OCwKNjUwNzgsCl0sClsKNjUwNzksCjY1MDc5LApdLApbCjY1MDgwLAo2NTA4MCwKXSwKWwo2NTA4MSwKNjUwODEsCl0sClsKNjUwODIsCjY1MDgyLApdLApbCjY1MDgzLAo2NTA4MywKXSwKWwo2NTA4NCwKNjUwODQsCl0sClsKNjUwODUsCjY1MDg1LApdLApbCjY1MDg2LAo2NTA4NiwKXSwKWwo2NTA4NywKNjUwODcsCl0sClsKNjUwODgsCjY1MDg4LApdLApbCjY1MDg5LAo2NTA4OSwKXSwKWwo2NTA5MCwKNjUwOTAsCl0sClsKNjUwOTEsCjY1MDkxLApdLApbCjY1MDkyLAo2NTA5MiwKXSwKWwo2NTA5MywKNjUwOTQsCl0sClsKNjUwOTUsCjY1MDk1LApdLApbCjY1MDk2LAo2NTA5NiwKXSwKWwo2NTA5NywKNjUxMDAsCl0sClsKNjUxMDEsCjY1MTAzLApdLApbCjY1MTA0LAo2NTEwNiwKXSwKWwo2NTEwOCwKNjUxMTEsCl0sClsKNjUxMTIsCjY1MTEyLApdLApbCjY1MTEzLAo2NTExMywKXSwKWwo2NTExNCwKNjUxMTQsCl0sClsKNjUxMTUsCjY1MTE1LApdLApbCjY1MTE2LAo2NTExNiwKXSwKWwo2NTExNywKNjUxMTcsCl0sClsKNjUxMTgsCjY1MTE4LApdLApbCjY1MTE5LAo2NTEyMSwKXSwKWwo2NTEyMiwKNjUxMjIsCl0sClsKNjUxMjMsCjY1MTIzLApdLApbCjY1MTI0LAo2NTEyNiwKXSwKWwo2NTEyOCwKNjUxMjgsCl0sClsKNjUxMjksCjY1MTI5LApdLApbCjY1MTMwLAo2NTEzMSwKXSwKWwo2NTI4MSwKNjUyODMsCl0sClsKNjUyODQsCjY1Mjg0LApdLApbCjY1Mjg1LAo2NTI4NywKXSwKWwo2NTI4OCwKNjUyODgsCl0sClsKNjUyODksCjY1Mjg5LApdLApbCjY1MjkwLAo2NTI5MCwKXSwKWwo2NTI5MSwKNjUyOTEsCl0sClsKNjUyOTIsCjY1MjkyLApdLApbCjY1MjkzLAo2NTI5MywKXSwKWwo2NTI5NCwKNjUyOTUsCl0sClsKNjUyOTYsCjY1MzA1LApdLApbCjY1MzA2LAo2NTMwNywKXSwKWwo2NTMwOCwKNjUzMTAsCl0sClsKNjUzMTEsCjY1MzEyLApdLApbCjY1MzEzLAo2NTMzOCwKXSwKWwo2NTMzOSwKNjUzMzksCl0sClsKNjUzNDAsCjY1MzQwLApdLApbCjY1MzQxLAo2NTM0MSwKXSwKWwo2NTM0MiwKNjUzNDIsCl0sClsKNjUzNDMsCjY1MzQzLApdLApbCjY1MzQ0LAo2NTM0NCwKXSwKWwo2NTM0NSwKNjUzNzAsCl0sClsKNjUzNzEsCjY1MzcxLApdLApbCjY1MzcyLAo2NTM3MiwKXSwKWwo2NTM3MywKNjUzNzMsCl0sClsKNjUzNzQsCjY1Mzc0LApdLApbCjY1Mzc1LAo2NTM3NSwKXSwKWwo2NTM3NiwKNjUzNzYsCl0sClsKNjU1MDQsCjY1NTA1LApdLApbCjY1NTA2LAo2NTUwNiwKXSwKWwo2NTUwNywKNjU1MDcsCl0sClsKNjU1MDgsCjY1NTA4LApdLApbCjY1NTA5LAo2NTUxMCwKXSwKWwo5NDE3NiwKOTQxNzcsCl0sClsKOTQxNzgsCjk0MTc4LApdLApbCjk0MTc5LAo5NDE3OSwKXSwKWwo5NDE4MCwKOTQxODAsCl0sClsKOTQxOTIsCjk0MTkzLApdLApbCjk0MjA4LAoxMDAzNDMsCl0sClsKMTAwMzUyLAoxMDExMTksCl0sClsKMTAxMTIwLAoxMDE1ODksCl0sClsKMTAxNjMxLAoxMDE2MzEsCl0sClsKMTAxNjMyLAoxMDE2NDAsCl0sClsKMTEwNTc2LAoxMTA1NzksCl0sClsKMTEwNTgxLAoxMTA1ODcsCl0sClsKMTEwNTg5LAoxMTA1OTAsCl0sClsKMTEwNTkyLAoxMTA4NDcsCl0sClsKMTEwODQ4LAoxMTA4ODIsCl0sClsKMTEwODk4LAoxMTA4OTgsCl0sClsKMTEwOTI4LAoxMTA5MzAsCl0sClsKMTEwOTMzLAoxMTA5MzMsCl0sClsKMTEwOTQ4LAoxMTA5NTEsCl0sClsKMTEwOTYwLAoxMTEzNTUsCl0sClsKMTE5NTUyLAoxMTk2MzgsCl0sClsKMTE5NjQ4LAoxMTk2NzAsCl0sClsKMTI2OTgwLAoxMjY5ODAsCl0sClsKMTI3MTgzLAoxMjcxODMsCl0sClsKMTI3Mzc0LAoxMjczNzQsCl0sClsKMTI3Mzc3LAoxMjczODYsCl0sClsKMTI3NDg4LAoxMjc0OTAsCl0sClsKMTI3NTA0LAoxMjc1NDcsCl0sClsKMTI3NTUyLAoxMjc1NjAsCl0sClsKMTI3NTY4LAoxMjc1NjksCl0sClsKMTI3NTg0LAoxMjc1ODksCl0sClsKMTI3NzQ0LAoxMjc3NzYsCl0sClsKMTI3Nzg5LAoxMjc3OTcsCl0sClsKMTI3Nzk5LAoxMjc4NjgsCl0sClsKMTI3ODcwLAoxMjc4OTEsCl0sClsKMTI3OTA0LAoxMjc5NDYsCl0sClsKMTI3OTUxLAoxMjc5NTUsCl0sClsKMTI3OTY4LAoxMjc5ODQsCl0sClsKMTI3OTg4LAoxMjc5ODgsCl0sClsKMTI3OTkyLAoxMjc5OTQsCl0sClsKMTI3OTk1LAoxMjc5OTksCl0sClsKMTI4MDAwLAoxMjgwNjIsCl0sClsKMTI4MDY0LAoxMjgwNjQsCl0sClsKMTI4MDY2LAoxMjgyNTIsCl0sClsKMTI4MjU1LAoxMjgzMTcsCl0sClsKMTI4MzMxLAoxMjgzMzQsCl0sClsKMTI4MzM2LAoxMjgzNTksCl0sClsKMTI4Mzc4LAoxMjgzNzgsCl0sClsKMTI4NDA1LAoxMjg0MDYsCl0sClsKMTI4NDIwLAoxMjg0MjAsCl0sClsKMTI4NTA3LAoxMjg1MTEsCl0sClsKMTI4NTEyLAoxMjg1OTEsCl0sClsKMTI4NjQwLAoxMjg3MDksCl0sClsKMTI4NzE2LAoxMjg3MTYsCl0sClsKMTI4NzIwLAoxMjg3MjIsCl0sClsKMTI4NzI1LAoxMjg3MjcsCl0sClsKMTI4NzMyLAoxMjg3MzUsCl0sClsKMTI4NzQ3LAoxMjg3NDgsCl0sClsKMTI4NzU2LAoxMjg3NjQsCl0sClsKMTI4OTkyLAoxMjkwMDMsCl0sClsKMTI5MDA4LAoxMjkwMDgsCl0sClsKMTI5MjkyLAoxMjkzMzgsCl0sClsKMTI5MzQwLAoxMjkzNDksCl0sClsKMTI5MzUxLAoxMjk1MzUsCl0sClsKMTI5NjQ4LAoxMjk2NjAsCl0sClsKMTI5NjY0LAoxMjk2NzMsCl0sClsKMTI5Njc5LAoxMjk3MzQsCl0sClsKMTI5NzQyLAoxMjk3NTYsCl0sClsKMTI5NzU5LAoxMjk3NjksCl0sClsKMTI5Nzc2LAoxMjk3ODQsCl0sClsKMTMxMDcyLAoxNzM3OTEsCl0sClsKMTczNzkyLAoxNzM4MjMsCl0sClsKMTczODI0LAoxNzc5NzcsCl0sClsKMTc3OTc4LAoxNzc5ODMsCl0sClsKMTc3OTg0LAoxNzgyMDUsCl0sClsKMTc4MjA2LAoxNzgyMDcsCl0sClsKMTc4MjA4LAoxODM5NjksCl0sClsKMTgzOTcwLAoxODM5ODMsCl0sClsKMTgzOTg0LAoxOTE0NTYsCl0sClsKMTkxNDU3LAoxOTE0NzEsCl0sClsKMTkxNDcyLAoxOTIwOTMsCl0sClsKMTkyMDk0LAoxOTQ1NTksCl0sClsKMTk0NTYwLAoxOTUxMDEsCl0sClsKMTk1MTAyLAoxOTUxMDMsCl0sClsKMTk1MTA0LAoxOTY2MDUsCl0sClsKMTk2NjA4LAoyMDE1NDYsCl0sClsKMjAxNTQ3LAoyMDE1NTEsCl0sClsKMjAxNTUyLAoyMDU3NDMsCl0sClsKMjA1NzQ0LAoyNjIxNDEsCl0sCl07Cjw/cGhwCgoKCgoKCgoKcmV0dXJuIFsKWwo3NjgsCjg3OSwKXSwKWwoxMTU1LAoxMTU5LApdLApbCjExNjAsCjExNjEsCl0sClsKMTQyNSwKMTQ2OSwKXSwKWwoxNDcxLAoxNDcxLApdLApbCjE0NzMsCjE0NzQsCl0sClsKMTQ3NiwKMTQ3NywKXSwKWwoxNDc5LAoxNDc5LApdLApbCjE1NTIsCjE1NjIsCl0sClsKMTYxMSwKMTYzMSwKXSwKWwoxNjQ4LAoxNjQ4LApdLApbCjE3NTAsCjE3NTYsCl0sClsKMTc1OSwKMTc2NCwKXSwKWwoxNzY3LAoxNzY4LApdLApbCjE3NzAsCjE3NzMsCl0sClsKMTgwOSwKMTgwOSwKXSwKWwoxODQwLAoxODY2LApdLApbCjE5NTgsCjE5NjgsCl0sClsKMjAyNywKMjAzNSwKXSwKWwoyMDQ1LAoyMDQ1LApdLApbCjIwNzAsCjIwNzMsCl0sClsKMjA3NSwKMjA4MywKXSwKWwoyMDg1LAoyMDg3LApdLApbCjIwODksCjIwOTMsCl0sClsKMjEzNywKMjEzOSwKXSwKWwoyMTk5LAoyMjA3LApdLApbCjIyNTAsCjIyNzMsCl0sClsKMjI3NSwKMjMwNiwKXSwKWwoyMzYyLAoyMzYyLApdLApbCjIzNjQsCjIzNjQsCl0sClsKMjM2OSwKMjM3NiwKXSwKWwoyMzgxLAoyMzgxLApdLApbCjIzODUsCjIzOTEsCl0sClsKMjQwMiwKMjQwMywKXSwKWwoyNDMzLAoyNDMzLApdLApbCjI0OTIsCjI0OTIsCl0sClsKMjQ5NywKMjUwMCwKXSwKWwoyNTA5LAoyNTA5LApdLApbCjI1MzAsCjI1MzEsCl0sClsKMjU1OCwKMjU1OCwKXSwKWwoyNTYxLAoyNTYyLApdLApbCjI2MjAsCjI2MjAsCl0sClsKMjYyNSwKMjYyNiwKXSwKWwoyNjMxLAoyNjMyLApdLApbCjI2MzUsCjI2MzcsCl0sClsKMjY0MSwKMjY0MSwKXSwKWwoyNjcyLAoyNjczLApdLApbCjI2NzcsCjI2NzcsCl0sClsKMjY4OSwKMjY5MCwKXSwKWwoyNzQ4LAoyNzQ4LApdLApbCjI3NTMsCjI3NTcsCl0sClsKMjc1OSwKMjc2MCwKXSwKWwoyNzY1LAoyNzY1LApdLApbCjI3ODYsCjI3ODcsCl0sClsKMjgxMCwKMjgxNSwKXSwKWwoyODE3LAoyODE3LApdLApbCjI4NzYsCjI4NzYsCl0sClsKMjg3OSwKMjg3OSwKXSwKWwoyODgxLAoyODg0LApdLApbCjI4OTMsCjI4OTMsCl0sClsKMjkwMSwKMjkwMiwKXSwKWwoyOTE0LAoyOTE1LApdLApbCjI5NDYsCjI5NDYsCl0sClsKMzAwOCwKMzAwOCwKXSwKWwozMDIxLAozMDIxLApdLApbCjMwNzIsCjMwNzIsCl0sClsKMzA3NiwKMzA3NiwKXSwKWwozMTMyLAozMTMyLApdLApbCjMxMzQsCjMxMzYsCl0sClsKMzE0MiwKMzE0NCwKXSwKWwozMTQ2LAozMTQ5LApdLApbCjMxNTcsCjMxNTgsCl0sClsKMzE3MCwKMzE3MSwKXSwKWwozMjAxLAozMjAxLApdLApbCjMyNjAsCjMyNjAsCl0sClsKMzI2MywKMzI2MywKXSwKWwozMjcwLAozMjcwLApdLApbCjMyNzYsCjMyNzcsCl0sClsKMzI5OCwKMzI5OSwKXSwKWwozMzI4LAozMzI5LApdLApbCjMzODcsCjMzODgsCl0sClsKMzM5MywKMzM5NiwKXSwKWwozNDA1LAozNDA1LApdLApbCjM0MjYsCjM0MjcsCl0sClsKMzQ1NywKMzQ1NywKXSwKWwozNTMwLAozNTMwLApdLApbCjM1MzgsCjM1NDAsCl0sClsKMzU0MiwKMzU0MiwKXSwKWwozNjMzLAozNjMzLApdLApbCjM2MzYsCjM2NDIsCl0sClsKMzY1NSwKMzY2MiwKXSwKWwozNzYxLAozNzYxLApdLApbCjM3NjQsCjM3NzIsCl0sClsKMzc4NCwKMzc5MCwKXSwKWwozODY0LAozODY1LApdLApbCjM4OTMsCjM4OTMsCl0sClsKMzg5NSwKMzg5NSwKXSwKWwozODk3LAozODk3LApdLApbCjM5NTMsCjM5NjYsCl0sClsKMzk2OCwKMzk3MiwKXSwKWwozOTc0LAozOTc1LApdLApbCjM5ODEsCjM5OTEsCl0sClsKMzk5MywKNDAyOCwKXSwKWwo0MDM4LAo0MDM4LApdLApbCjQxNDEsCjQxNDQsCl0sClsKNDE0NiwKNDE1MSwKXSwKWwo0MTUzLAo0MTU0LApdLApbCjQxNTcsCjQxNTgsCl0sClsKNDE4NCwKNDE4NSwKXSwKWwo0MTkwLAo0MTkyLApdLApbCjQyMDksCjQyMTIsCl0sClsKNDIyNiwKNDIyNiwKXSwKWwo0MjI5LAo0MjMwLApdLApbCjQyMzcsCjQyMzcsCl0sClsKNDI1MywKNDI1MywKXSwKWwo0OTU3LAo0OTU5LApdLApbCjU5MDYsCjU5MDgsCl0sClsKNTkzOCwKNTkzOSwKXSwKWwo1OTcwLAo1OTcxLApdLApbCjYwMDIsCjYwMDMsCl0sClsKNjA2OCwKNjA2OSwKXSwKWwo2MDcxLAo2MDc3LApdLApbCjYwODYsCjYwODYsCl0sClsKNjA4OSwKNjA5OSwKXSwKWwo2MTA5LAo2MTA5LApdLApbCjYxNTUsCjYxNTcsCl0sClsKNjE1OSwKNjE1OSwKXSwKWwo2Mjc3LAo2Mjc4LApdLApbCjYzMTMsCjYzMTMsCl0sClsKNjQzMiwKNjQzNCwKXSwKWwo2NDM5LAo2NDQwLApdLApbCjY0NTAsCjY0NTAsCl0sClsKNjQ1NywKNjQ1OSwKXSwKWwo2Njc5LAo2NjgwLApdLApbCjY2ODMsCjY2ODMsCl0sClsKNjc0MiwKNjc0MiwKXSwKWwo2NzQ0LAo2NzUwLApdLApbCjY3NTIsCjY3NTIsCl0sClsKNjc1NCwKNjc1NCwKXSwKWwo2NzU3LAo2NzY0LApdLApbCjY3NzEsCjY3ODAsCl0sClsKNjc4MywKNjc4MywKXSwKWwo2ODMyLAo2ODQ1LApdLApbCjY4NDYsCjY4NDYsCl0sClsKNjg0NywKNjg2MiwKXSwKWwo2OTEyLAo2OTE1LApdLApbCjY5NjQsCjY5NjQsCl0sClsKNjk2NiwKNjk3MCwKXSwKWwo2OTcyLAo2OTcyLApdLApbCjY5NzgsCjY5NzgsCl0sClsKNzAxOSwKNzAyNywKXSwKWwo3MDQwLAo3MDQxLApdLApbCjcwNzQsCjcwNzcsCl0sClsKNzA4MCwKNzA4MSwKXSwKWwo3MDgzLAo3MDg1LApdLApbCjcxNDIsCjcxNDIsCl0sClsKNzE0NCwKNzE0NSwKXSwKWwo3MTQ5LAo3MTQ5LApdLApbCjcxNTEsCjcxNTMsCl0sClsKNzIxMiwKNzIxOSwKXSwKWwo3MjIyLAo3MjIzLApdLApbCjczNzYsCjczNzgsCl0sClsKNzM4MCwKNzM5MiwKXSwKWwo3Mzk0LAo3NDAwLApdLApbCjc0MDUsCjc0MDUsCl0sClsKNzQxMiwKNzQxMiwKXSwKWwo3NDE2LAo3NDE3LApdLApbCjc2MTYsCjc2NzksCl0sClsKODQwMCwKODQxMiwKXSwKWwo4NDEzLAo4NDE2LApdLApbCjg0MTcsCjg0MTcsCl0sClsKODQxOCwKODQyMCwKXSwKWwo4NDIxLAo4NDMyLApdLApbCjExNTAzLAoxMTUwNSwKXSwKWwoxMTY0NywKMTE2NDcsCl0sClsKMTE3NDQsCjExNzc1LApdLApbCjEyMzMwLAoxMjMzMywKXSwKWwoxMjQ0MSwKMTI0NDIsCl0sClsKNDI2MDcsCjQyNjA3LApdLApbCjQyNjA4LAo0MjYxMCwKXSwKWwo0MjYxMiwKNDI2MjEsCl0sClsKNDI2NTQsCjQyNjU1LApdLApbCjQyNzM2LAo0MjczNywKXSwKWwo0MzAxMCwKNDMwMTAsCl0sClsKNDMwMTQsCjQzMDE0LApdLApbCjQzMDE5LAo0MzAxOSwKXSwKWwo0MzA0NSwKNDMwNDYsCl0sClsKNDMwNTIsCjQzMDUyLApdLApbCjQzMjA0LAo0MzIwNSwKXSwKWwo0MzIzMiwKNDMyNDksCl0sClsKNDMyNjMsCjQzMjYzLApdLApbCjQzMzAyLAo0MzMwOSwKXSwKWwo0MzMzNSwKNDMzNDUsCl0sClsKNDMzOTIsCjQzMzk0LApdLApbCjQzNDQzLAo0MzQ0MywKXSwKWwo0MzQ0NiwKNDM0NDksCl0sClsKNDM0NTIsCjQzNDUzLApdLApbCjQzNDkzLAo0MzQ5MywKXSwKWwo0MzU2MSwKNDM1NjYsCl0sClsKNDM1NjksCjQzNTcwLApdLApbCjQzNTczLAo0MzU3NCwKXSwKWwo0MzU4NywKNDM1ODcsCl0sClsKNDM1OTYsCjQzNTk2LApdLApbCjQzNjQ0LAo0MzY0NCwKXSwKWwo0MzY5NiwKNDM2OTYsCl0sClsKNDM2OTgsCjQzNzAwLApdLApbCjQzNzAzLAo0MzcwNCwKXSwKWwo0MzcxMCwKNDM3MTEsCl0sClsKNDM3MTMsCjQzNzEzLApdLApbCjQzNzU2LAo0Mzc1NywKXSwKWwo0Mzc2NiwKNDM3NjYsCl0sClsKNDQwMDUsCjQ0MDA1LApdLApbCjQ0MDA4LAo0NDAwOCwKXSwKWwo0NDAxMywKNDQwMTMsCl0sClsKNjQyODYsCjY0Mjg2LApdLApbCjY1MDI0LAo2NTAzOSwKXSwKWwo2NTA1NiwKNjUwNzEsCl0sClsKNjYwNDUsCjY2MDQ1LApdLApbCjY2MjcyLAo2NjI3MiwKXSwKWwo2NjQyMiwKNjY0MjYsCl0sClsKNjgwOTcsCjY4MDk5LApdLApbCjY4MTAxLAo2ODEwMiwKXSwKWwo2ODEwOCwKNjgxMTEsCl0sClsKNjgxNTIsCjY4MTU0LApdLApbCjY4MTU5LAo2ODE1OSwKXSwKWwo2ODMyNSwKNjgzMjYsCl0sClsKNjg5MDAsCjY4OTAzLApdLApbCjY4OTY5LAo2ODk3MywKXSwKWwo2OTI5MSwKNjkyOTIsCl0sClsKNjkzNzIsCjY5Mzc1LApdLApbCjY5NDQ2LAo2OTQ1NiwKXSwKWwo2OTUwNiwKNjk1MDksCl0sClsKNjk2MzMsCjY5NjMzLApdLApbCjY5Njg4LAo2OTcwMiwKXSwKWwo2OTc0NCwKNjk3NDQsCl0sClsKNjk3NDcsCjY5NzQ4LApdLApbCjY5NzU5LAo2OTc2MSwKXSwKWwo2OTgxMSwKNjk4MTQsCl0sClsKNjk4MTcsCjY5ODE4LApdLApbCjY5ODI2LAo2OTgyNiwKXSwKWwo2OTg4OCwKNjk4OTAsCl0sClsKNjk5MjcsCjY5OTMxLApdLApbCjY5OTMzLAo2OTk0MCwKXSwKWwo3MDAwMywKNzAwMDMsCl0sClsKNzAwMTYsCjcwMDE3LApdLApbCjcwMDcwLAo3MDA3OCwKXSwKWwo3MDA4OSwKNzAwOTIsCl0sClsKNzAwOTUsCjcwMDk1LApdLApbCjcwMTkxLAo3MDE5MywKXSwKWwo3MDE5NiwKNzAxOTYsCl0sClsKNzAxOTgsCjcwMTk5LApdLApbCjcwMjA2LAo3MDIwNiwKXSwKWwo3MDIwOSwKNzAyMDksCl0sClsKNzAzNjcsCjcwMzY3LApdLApbCjcwMzcxLAo3MDM3OCwKXSwKWwo3MDQwMCwKNzA0MDEsCl0sClsKNzA0NTksCjcwNDYwLApdLApbCjcwNDY0LAo3MDQ2NCwKXSwKWwo3MDUwMiwKNzA1MDgsCl0sClsKNzA1MTIsCjcwNTE2LApdLApbCjcwNTg3LAo3MDU5MiwKXSwKWwo3MDYwNiwKNzA2MDYsCl0sClsKNzA2MDgsCjcwNjA4LApdLApbCjcwNjEwLAo3MDYxMCwKXSwKWwo3MDYyNSwKNzA2MjYsCl0sClsKNzA3MTIsCjcwNzE5LApdLApbCjcwNzIyLAo3MDcyNCwKXSwKWwo3MDcyNiwKNzA3MjYsCl0sClsKNzA3NTAsCjcwNzUwLApdLApbCjcwODM1LAo3MDg0MCwKXSwKWwo3MDg0MiwKNzA4NDIsCl0sClsKNzA4NDcsCjcwODQ4LApdLApbCjcwODUwLAo3MDg1MSwKXSwKWwo3MTA5MCwKNzEwOTMsCl0sClsKNzExMDAsCjcxMTAxLApdLApbCjcxMTAzLAo3MTEwNCwKXSwKWwo3MTEzMiwKNzExMzMsCl0sClsKNzEyMTksCjcxMjI2LApdLApbCjcxMjI5LAo3MTIyOSwKXSwKWwo3MTIzMSwKNzEyMzIsCl0sClsKNzEzMzksCjcxMzM5LApdLApbCjcxMzQxLAo3MTM0MSwKXSwKWwo3MTM0NCwKNzEzNDksCl0sClsKNzEzNTEsCjcxMzUxLApdLApbCjcxNDUzLAo3MTQ1MywKXSwKWwo3MTQ1NSwKNzE0NTUsCl0sClsKNzE0NTgsCjcxNDYxLApdLApbCjcxNDYzLAo3MTQ2NywKXSwKWwo3MTcyNywKNzE3MzUsCl0sClsKNzE3MzcsCjcxNzM4LApdLApbCjcxOTk1LAo3MTk5NiwKXSwKWwo3MTk5OCwKNzE5OTgsCl0sClsKNzIwMDMsCjcyMDAzLApdLApbCjcyMTQ4LAo3MjE1MSwKXSwKWwo3MjE1NCwKNzIxNTUsCl0sClsKNzIxNjAsCjcyMTYwLApdLApbCjcyMTkzLAo3MjIwMiwKXSwKWwo3MjI0MywKNzIyNDgsCl0sClsKNzIyNTEsCjcyMjU0LApdLApbCjcyMjYzLAo3MjI2MywKXSwKWwo3MjI3MywKNzIyNzgsCl0sClsKNzIyODEsCjcyMjgzLApdLApbCjcyMzMwLAo3MjM0MiwKXSwKWwo3MjM0NCwKNzIzNDUsCl0sClsKNzI3NTIsCjcyNzU4LApdLApbCjcyNzYwLAo3Mjc2NSwKXSwKWwo3Mjc2NywKNzI3NjcsCl0sClsKNzI4NTAsCjcyODcxLApdLApbCjcyODc0LAo3Mjg4MCwKXSwKWwo3Mjg4MiwKNzI4ODMsCl0sClsKNzI4ODUsCjcyODg2LApdLApbCjczMDA5LAo3MzAxNCwKXSwKWwo3MzAxOCwKNzMwMTgsCl0sClsKNzMwMjAsCjczMDIxLApdLApbCjczMDIzLAo3MzAyOSwKXSwKWwo3MzAzMSwKNzMwMzEsCl0sClsKNzMxMDQsCjczMTA1LApdLApbCjczMTA5LAo3MzEwOSwKXSwKWwo3MzExMSwKNzMxMTEsCl0sClsKNzM0NTksCjczNDYwLApdLApbCjczNDcyLAo3MzQ3MywKXSwKWwo3MzUyNiwKNzM1MzAsCl0sClsKNzM1MzYsCjczNTM2LApdLApbCjczNTM4LAo3MzUzOCwKXSwKWwo3MzU2MiwKNzM1NjIsCl0sClsKNzg5MTIsCjc4OTEyLApdLApbCjc4OTE5LAo3ODkzMywKXSwKWwo5MDM5OCwKOTA0MDksCl0sClsKOTA0MTMsCjkwNDE1LApdLApbCjkyOTEyLAo5MjkxNiwKXSwKWwo5Mjk3NiwKOTI5ODIsCl0sClsKOTQwMzEsCjk0MDMxLApdLApbCjk0MDk1LAo5NDA5OCwKXSwKWwo5NDE4MCwKOTQxODAsCl0sClsKMTEzODIxLAoxMTM4MjIsCl0sClsKMTE4NTI4LAoxMTg1NzMsCl0sClsKMTE4NTc2LAoxMTg1OTgsCl0sClsKMTE5MTQzLAoxMTkxNDUsCl0sClsKMTE5MTYzLAoxMTkxNzAsCl0sClsKMTE5MTczLAoxMTkxNzksCl0sClsKMTE5MjEwLAoxMTkyMTMsCl0sClsKMTE5MzYyLAoxMTkzNjQsCl0sClsKMTIxMzQ0LAoxMjEzOTgsCl0sClsKMTIxNDAzLAoxMjE0NTIsCl0sClsKMTIxNDYxLAoxMjE0NjEsCl0sClsKMTIxNDc2LAoxMjE0NzYsCl0sClsKMTIxNDk5LAoxMjE1MDMsCl0sClsKMTIxNTA1LAoxMjE1MTksCl0sClsKMTIyODgwLAoxMjI4ODYsCl0sClsKMTIyODg4LAoxMjI5MDQsCl0sClsKMTIyOTA3LAoxMjI5MTMsCl0sClsKMTIyOTE1LAoxMjI5MTYsCl0sClsKMTIyOTE4LAoxMjI5MjIsCl0sClsKMTIzMDIzLAoxMjMwMjMsCl0sClsKMTIzMTg0LAoxMjMxOTAsCl0sClsKMTIzNTY2LAoxMjM1NjYsCl0sClsKMTIzNjI4LAoxMjM2MzEsCl0sClsKMTI0MTQwLAoxMjQxNDMsCl0sClsKMTI0Mzk4LAoxMjQzOTksCl0sClsKMTI1MTM2LAoxMjUxNDIsCl0sClsKMTI1MjUyLAoxMjUyNTgsCl0sClsKOTE3NzYwLAo5MTc5OTksCl0sCl07Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nOwoKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKHU6OmNsYXNzKSkgewpmdW5jdGlvbiB1KD9zdHJpbmcgJHN0cmluZyA9ICcnKTogVW5pY29kZVN0cmluZwp7CnJldHVybiBuZXcgVW5pY29kZVN0cmluZygkc3RyaW5nID8/ICcnKTsKfQp9CgppZiAoIVxmdW5jdGlvbl9leGlzdHMoYjo6Y2xhc3MpKSB7CmZ1bmN0aW9uIGIoP3N0cmluZyAkc3RyaW5nID0gJycpOiBCeXRlU3RyaW5nCnsKcmV0dXJuIG5ldyBCeXRlU3RyaW5nKCRzdHJpbmcgPz8gJycpOwp9Cn0KCmlmICghXGZ1bmN0aW9uX2V4aXN0cyhzOjpjbGFzcykpIHsKCgoKZnVuY3Rpb24gcyg/c3RyaW5nICRzdHJpbmcgPSAnJyk6IEFic3RyYWN0U3RyaW5nCnsKJHN0cmluZyA9ICRzdHJpbmcgPz8gJyc7CgpyZXR1cm4gcHJlZ19tYXRjaCgnLy91JywgJHN0cmluZykgPyBuZXcgVW5pY29kZVN0cmluZygkc3RyaW5nKSA6IG5ldyBCeXRlU3RyaW5nKCRzdHJpbmcpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcU2x1Z2dlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcQWJzdHJhY3RVbmljb2RlU3RyaW5nOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXFVuaWNvZGVTdHJpbmc7CnVzZSBTeW1mb255XENvbnRyYWN0c1xUcmFuc2xhdGlvblxMb2NhbGVBd2FyZUludGVyZmFjZTsKCmlmICghaW50ZXJmYWNlX2V4aXN0cyhMb2NhbGVBd2FyZUludGVyZmFjZTo6Y2xhc3MpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1lvdSBjYW5ub3QgdXNlIHRoZSAiU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXFNsdWdnZXJcQXNjaWlTbHVnZ2VyIiBhcyB0aGUgInN5bWZvbnkvdHJhbnNsYXRpb24tY29udHJhY3RzIiBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQuIFRyeSBydW5uaW5nICJjb21wb3NlciByZXF1aXJlIHN5bWZvbnkvdHJhbnNsYXRpb24tY29udHJhY3RzIi4nKTsKfQoKCgoKY2xhc3MgQXNjaWlTbHVnZ2VyIGltcGxlbWVudHMgU2x1Z2dlckludGVyZmFjZSwgTG9jYWxlQXdhcmVJbnRlcmZhY2UKewpwcml2YXRlIGNvbnN0IExPQ0FMRV9UT19UUkFOU0xJVEVSQVRPUl9JRCA9IFsKJ2FtJyA9PiAnQW1oYXJpYy1MYXRpbicsCidhcicgPT4gJ0FyYWJpYy1MYXRpbicsCidheicgPT4gJ0F6ZXJiYWlqYW5pLUxhdGluJywKJ2JlJyA9PiAnQmVsYXJ1c2lhbi1MYXRpbicsCidiZycgPT4gJ0J1bGdhcmlhbi1MYXRpbicsCidibicgPT4gJ0JlbmdhbGktTGF0aW4nLAonZGUnID0+ICdkZS1BU0NJSScsCidlbCcgPT4gJ0dyZWVrLUxhdGluJywKJ2ZhJyA9PiAnUGVyc2lhbi1MYXRpbicsCidoZScgPT4gJ0hlYnJldy1MYXRpbicsCidoeScgPT4gJ0FybWVuaWFuLUxhdGluJywKJ2thJyA9PiAnR2VvcmdpYW4tTGF0aW4nLAona2snID0+ICdLYXpha2gtTGF0aW4nLAona3knID0+ICdLaXJnaGl6LUxhdGluJywKJ2tvJyA9PiAnS29yZWFuLUxhdGluJywKJ21rJyA9PiAnTWFjZWRvbmlhbi1MYXRpbicsCidtbicgPT4gJ01vbmdvbGlhbi1MYXRpbicsCidvcicgPT4gJ09yaXlhLUxhdGluJywKJ3BzJyA9PiAnUGFzaHRvLUxhdGluJywKJ3J1JyA9PiAnUnVzc2lhbi1MYXRpbicsCidzcicgPT4gJ1NlcmJpYW4tTGF0aW4nLAonc3JfQ3lybCcgPT4gJ1NlcmJpYW4tTGF0aW4nLAondGgnID0+ICdUaGFpLUxhdGluJywKJ3RrJyA9PiAnVHVya21lbi1MYXRpbicsCid1aycgPT4gJ1VrcmFpbmlhbi1MYXRpbicsCid1eicgPT4gJ1V6YmVrLUxhdGluJywKJ3poJyA9PiAnSGFuLUxhdGluJywKXTsKCnByaXZhdGUgJGRlZmF1bHRMb2NhbGU7CnByaXZhdGUgJHN5bWJvbHNNYXAgPSBbCidlbicgPT4gWydAJyA9PiAnYXQnLCAnJicgPT4gJ2FuZCddLApdOwoKCgoKCgpwcml2YXRlICR0cmFuc2xpdGVyYXRvcnMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/c3RyaW5nICRkZWZhdWx0TG9jYWxlID0gbnVsbCwgJHN5bWJvbHNNYXAgPSBudWxsKQp7CmlmIChudWxsICE9PSAkc3ltYm9sc01hcCAmJiAhXGlzX2FycmF5KCRzeW1ib2xzTWFwKSAmJiAhJHN5bWJvbHNNYXAgaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAyIHBhc3NlZCB0byAiJXMoKSIgbXVzdCBiZSBhcnJheSwgQ2xvc3VyZSBvciBudWxsLCAiJXMiIGdpdmVuLicsIF9fTUVUSE9EX18sIFxnZXR0eXBlKCRzeW1ib2xzTWFwKSkpOwp9CgokdGhpcy0+ZGVmYXVsdExvY2FsZSA9ICRkZWZhdWx0TG9jYWxlOwokdGhpcy0+c3ltYm9sc01hcCA9ICRzeW1ib2xzTWFwID8/ICR0aGlzLT5zeW1ib2xzTWFwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9jYWxlKCRsb2NhbGUpCnsKJHRoaXMtPmRlZmF1bHRMb2NhbGUgPSAkbG9jYWxlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxlKCkKewpyZXR1cm4gJHRoaXMtPmRlZmF1bHRMb2NhbGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzbHVnKHN0cmluZyAkc3RyaW5nLCBzdHJpbmcgJHNlcGFyYXRvciA9ICctJywgP3N0cmluZyAkbG9jYWxlID0gbnVsbCk6IEFic3RyYWN0VW5pY29kZVN0cmluZwp7CiRsb2NhbGUgPSAkbG9jYWxlID8/ICR0aGlzLT5kZWZhdWx0TG9jYWxlOwoKJHRyYW5zbGl0ZXJhdG9yID0gW107CmlmICgkbG9jYWxlICYmICgnZGUnID09PSAkbG9jYWxlIHx8IDAgPT09IHN0cnBvcygkbG9jYWxlLCAnZGVfJykpKSB7CgokdHJhbnNsaXRlcmF0b3IgPSBbJ2RlLUFTQ0lJJ107Cn0gZWxzZWlmIChcZnVuY3Rpb25fZXhpc3RzKCd0cmFuc2xpdGVyYXRvcl90cmFuc2xpdGVyYXRlJykgJiYgJGxvY2FsZSkgewokdHJhbnNsaXRlcmF0b3IgPSAoYXJyYXkpICR0aGlzLT5jcmVhdGVUcmFuc2xpdGVyYXRvcigkbG9jYWxlKTsKfQoKaWYgKCR0aGlzLT5zeW1ib2xzTWFwIGluc3RhbmNlb2YgXENsb3N1cmUpIHsKCgokc3ltYm9sc01hcCA9ICR0aGlzLT5zeW1ib2xzTWFwOwphcnJheV91bnNoaWZ0KCR0cmFuc2xpdGVyYXRvciwgc3RhdGljIGZ1bmN0aW9uICgkcykgdXNlICgkc3ltYm9sc01hcCwgJGxvY2FsZSkgewpyZXR1cm4gJHN5bWJvbHNNYXAoJHMsICRsb2NhbGUpOwp9KTsKfQoKJHVuaWNvZGVTdHJpbmcgPSAobmV3IFVuaWNvZGVTdHJpbmcoJHN0cmluZykpLT5hc2NpaSgkdHJhbnNsaXRlcmF0b3IpOwoKaWYgKFxpc19hcnJheSgkdGhpcy0+c3ltYm9sc01hcCkpIHsKJG1hcCA9IG51bGw7CmlmIChpc3NldCgkdGhpcy0+c3ltYm9sc01hcFskbG9jYWxlXSkpIHsKJG1hcCA9ICR0aGlzLT5zeW1ib2xzTWFwWyRsb2NhbGVdOwp9IGVsc2UgewokcGFyZW50ID0gc2VsZjo6Z2V0UGFyZW50TG9jYWxlKCRsb2NhbGUpOwppZiAoJHBhcmVudCAmJiBpc3NldCgkdGhpcy0+c3ltYm9sc01hcFskcGFyZW50XSkpIHsKJG1hcCA9ICR0aGlzLT5zeW1ib2xzTWFwWyRwYXJlbnRdOwp9Cn0KaWYgKCRtYXApIHsKZm9yZWFjaCAoJG1hcCBhcyAkY2hhciA9PiAkcmVwbGFjZSkgewokdW5pY29kZVN0cmluZyA9ICR1bmljb2RlU3RyaW5nLT5yZXBsYWNlKCRjaGFyLCAnICcuJHJlcGxhY2UuJyAnKTsKfQp9Cn0KCnJldHVybiAkdW5pY29kZVN0cmluZwotPnJlcGxhY2VNYXRjaGVzKCcvW15BLVphLXowLTldKysvJywgJHNlcGFyYXRvcikKLT50cmltKCRzZXBhcmF0b3IpCjsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVUcmFuc2xpdGVyYXRvcihzdHJpbmcgJGxvY2FsZSk6ID9cVHJhbnNsaXRlcmF0b3IKewppZiAoXGFycmF5X2tleV9leGlzdHMoJGxvY2FsZSwgJHRoaXMtPnRyYW5zbGl0ZXJhdG9ycykpIHsKcmV0dXJuICR0aGlzLT50cmFuc2xpdGVyYXRvcnNbJGxvY2FsZV07Cn0KCgppZiAoJGlkID0gc2VsZjo6TE9DQUxFX1RPX1RSQU5TTElURVJBVE9SX0lEWyRsb2NhbGVdID8/IG51bGwpIHsKcmV0dXJuICR0aGlzLT50cmFuc2xpdGVyYXRvcnNbJGxvY2FsZV0gPSBcVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZSgkaWQuJy9CR04nKSA/PyBcVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZSgkaWQpOwp9CgoKaWYgKCEkcGFyZW50ID0gc2VsZjo6Z2V0UGFyZW50TG9jYWxlKCRsb2NhbGUpKSB7CnJldHVybiAkdGhpcy0+dHJhbnNsaXRlcmF0b3JzWyRsb2NhbGVdID0gbnVsbDsKfQoKCmlmICgkaWQgPSBzZWxmOjpMT0NBTEVfVE9fVFJBTlNMSVRFUkFUT1JfSURbJHBhcmVudF0gPz8gbnVsbCkgewokdHJhbnNsaXRlcmF0b3IgPSBcVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZSgkaWQuJy9CR04nKSA/PyBcVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZSgkaWQpOwp9CgpyZXR1cm4gJHRoaXMtPnRyYW5zbGl0ZXJhdG9yc1skbG9jYWxlXSA9ICR0aGlzLT50cmFuc2xpdGVyYXRvcnNbJHBhcmVudF0gPSAkdHJhbnNsaXRlcmF0b3IgPz8gbnVsbDsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0UGFyZW50TG9jYWxlKD9zdHJpbmcgJGxvY2FsZSk6ID9zdHJpbmcKewppZiAoISRsb2NhbGUpIHsKcmV0dXJuIG51bGw7Cn0KaWYgKGZhbHNlID09PSAkc3RyID0gc3RycmNocigkbG9jYWxlLCAnXycpKSB7CgpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIHN1YnN0cigkbG9jYWxlLCAwLCAtXHN0cmxlbigkc3RyKSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xTbHVnZ2VyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xBYnN0cmFjdFVuaWNvZGVTdHJpbmc7CgoKCgoKCmludGVyZmFjZSBTbHVnZ2VySW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIHNsdWcoc3RyaW5nICRzdHJpbmcsIHN0cmluZyAkc2VwYXJhdG9yID0gJy0nLCA/c3RyaW5nICRsb2NhbGUgPSBudWxsKTogQWJzdHJhY3RVbmljb2RlU3RyaW5nOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgVW5pY29kZVN0cmluZyBleHRlbmRzIEFic3RyYWN0VW5pY29kZVN0cmluZwp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHN0cmluZyA9ICcnKQp7CiR0aGlzLT5zdHJpbmcgPSBub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0cmluZykgPyAkc3RyaW5nIDogbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0cmluZyk7CgppZiAoZmFsc2UgPT09ICR0aGlzLT5zdHJpbmcpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGFwcGVuZChzdHJpbmcgLi4uJHN1ZmZpeCk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAkdGhpcy0+c3RyaW5nLigxID49IFxjb3VudCgkc3VmZml4KSA/ICgkc3VmZml4WzBdID8/ICcnKSA6IGltcGxvZGUoJycsICRzdWZmaXgpKTsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZykgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nKTsKCmlmIChmYWxzZSA9PT0gJHN0ci0+c3RyaW5nKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGNodW5rKGludCAkbGVuZ3RoID0gMSk6IGFycmF5CnsKaWYgKDEgPiAkbGVuZ3RoKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBjaHVuayBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsKfQoKaWYgKCcnID09PSAkdGhpcy0+c3RyaW5nKSB7CnJldHVybiBbXTsKfQoKJHJ4ID0gJy8oJzsKd2hpbGUgKDY1NTM1IDwgJGxlbmd0aCkgewokcnggLj0gJ1xYezY1NTM1fSc7CiRsZW5ndGggLT0gNjU1MzU7Cn0KJHJ4IC49ICdcWHsnLiRsZW5ndGguJ30pL3UnOwoKJHN0ciA9IGNsb25lICR0aGlzOwokY2h1bmtzID0gW107Cgpmb3JlYWNoIChwcmVnX3NwbGl0KCRyeCwgJHRoaXMtPnN0cmluZywgLTEsIFxQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUgfCBcUFJFR19TUExJVF9OT19FTVBUWSkgYXMgJGNodW5rKSB7CiRzdHItPnN0cmluZyA9ICRjaHVuazsKJGNodW5rc1tdID0gY2xvbmUgJHN0cjsKfQoKcmV0dXJuICRjaHVua3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBlbmRzV2l0aCgkc3VmZml4KTogYm9vbAp7CmlmICgkc3VmZml4IGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJHN1ZmZpeCA9ICRzdWZmaXgtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkc3VmZml4KSB8fCAkc3VmZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmVuZHNXaXRoKCRzdWZmaXgpOwp9IGVsc2Ugewokc3VmZml4ID0gKHN0cmluZykgJHN1ZmZpeDsKfQoKJGZvcm0gPSBudWxsID09PSAkdGhpcy0+aWdub3JlQ2FzZSA/IFxOb3JtYWxpemVyOjpORkQgOiBcTm9ybWFsaXplcjo6TkZDOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN1ZmZpeCwgJGZvcm0pID86ICRzdWZmaXggPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3VmZml4LCAkZm9ybSk7CgppZiAoJycgPT09ICRzdWZmaXggfHwgZmFsc2UgPT09ICRzdWZmaXgpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIDAgPT09IG1iX3N0cmlwb3MoZ3JhcGhlbWVfZXh0cmFjdCgkdGhpcy0+c3RyaW5nLCBcc3RybGVuKCRzdWZmaXgpLCBcR1JBUEhFTUVfRVhUUl9NQVhCWVRFUywgXHN0cmxlbigkdGhpcy0+c3RyaW5nKSAtIFxzdHJsZW4oJHN1ZmZpeCkpLCAkc3VmZml4LCAwLCAnVVRGLTgnKTsKfQoKcmV0dXJuICRzdWZmaXggPT09IGdyYXBoZW1lX2V4dHJhY3QoJHRoaXMtPnN0cmluZywgXHN0cmxlbigkc3VmZml4KSwgXEdSQVBIRU1FX0VYVFJfTUFYQllURVMsIFxzdHJsZW4oJHRoaXMtPnN0cmluZykgLSBcc3RybGVuKCRzdWZmaXgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGVxdWFsc1RvKCRzdHJpbmcpOiBib29sCnsKaWYgKCRzdHJpbmcgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokc3RyaW5nID0gJHN0cmluZy0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRzdHJpbmcpIHx8ICRzdHJpbmcgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6ZXF1YWxzVG8oJHN0cmluZyk7Cn0gZWxzZSB7CiRzdHJpbmcgPSAoc3RyaW5nKSAkc3RyaW5nOwp9CgokZm9ybSA9IG51bGwgPT09ICR0aGlzLT5pZ25vcmVDYXNlID8gXE5vcm1hbGl6ZXI6Ok5GRCA6IFxOb3JtYWxpemVyOjpORkM7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyaW5nLCAkZm9ybSkgPzogJHN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHJpbmcsICRmb3JtKTsKCmlmICgnJyAhPT0gJHN0cmluZyAmJiBmYWxzZSAhPT0gJHN0cmluZyAmJiAkdGhpcy0+aWdub3JlQ2FzZSkgewpyZXR1cm4gXHN0cmxlbigkc3RyaW5nKSA9PT0gXHN0cmxlbigkdGhpcy0+c3RyaW5nKSAmJiAwID09PSBtYl9zdHJpcG9zKCR0aGlzLT5zdHJpbmcsICRzdHJpbmcsIDAsICdVVEYtOCcpOwp9CgpyZXR1cm4gJHN0cmluZyA9PT0gJHRoaXMtPnN0cmluZzsKfQoKcHVibGljIGZ1bmN0aW9uIGluZGV4T2YoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICgkbmVlZGxlIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJG5lZWRsZSA9ICRuZWVkbGUtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkbmVlZGxlKSB8fCAkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmluZGV4T2YoJG5lZWRsZSwgJG9mZnNldCk7Cn0gZWxzZSB7CiRuZWVkbGUgPSAoc3RyaW5nKSAkbmVlZGxlOwp9CgokZm9ybSA9IG51bGwgPT09ICR0aGlzLT5pZ25vcmVDYXNlID8gXE5vcm1hbGl6ZXI6Ok5GRCA6IFxOb3JtYWxpemVyOjpORkM7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkbmVlZGxlLCAkZm9ybSkgPzogJG5lZWRsZSA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRuZWVkbGUsICRmb3JtKTsKCmlmICgnJyA9PT0gJG5lZWRsZSB8fCBmYWxzZSA9PT0gJG5lZWRsZSkgewpyZXR1cm4gbnVsbDsKfQoKdHJ5IHsKJGkgPSAkdGhpcy0+aWdub3JlQ2FzZSA/IGdyYXBoZW1lX3N0cmlwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCkgOiBncmFwaGVtZV9zdHJwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCk7Cn0gY2F0Y2ggKFxWYWx1ZUVycm9yICRlKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gZmFsc2UgPT09ICRpID8gbnVsbCA6ICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZkxhc3QoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICgkbmVlZGxlIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJG5lZWRsZSA9ICRuZWVkbGUtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkbmVlZGxlKSB8fCAkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmluZGV4T2ZMYXN0KCRuZWVkbGUsICRvZmZzZXQpOwp9IGVsc2UgewokbmVlZGxlID0gKHN0cmluZykgJG5lZWRsZTsKfQoKJGZvcm0gPSBudWxsID09PSAkdGhpcy0+aWdub3JlQ2FzZSA/IFxOb3JtYWxpemVyOjpORkQgOiBcTm9ybWFsaXplcjo6TkZDOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJG5lZWRsZSwgJGZvcm0pID86ICRuZWVkbGUgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkbmVlZGxlLCAkZm9ybSk7CgppZiAoJycgPT09ICRuZWVkbGUgfHwgZmFsc2UgPT09ICRuZWVkbGUpIHsKcmV0dXJuIG51bGw7Cn0KCiRzdHJpbmcgPSAkdGhpcy0+c3RyaW5nOwoKaWYgKDAgPiAkb2Zmc2V0KSB7CgppZiAoMCA+ICRvZmZzZXQgKz0gZ3JhcGhlbWVfc3RybGVuKCRuZWVkbGUpKSB7CiRzdHJpbmcgPSBncmFwaGVtZV9zdWJzdHIoJHN0cmluZywgMCwgJG9mZnNldCk7Cn0KJG9mZnNldCA9IDA7Cn0KCiRpID0gJHRoaXMtPmlnbm9yZUNhc2UgPyBncmFwaGVtZV9zdHJyaXBvcygkc3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0KSA6IGdyYXBoZW1lX3N0cnJwb3MoJHN0cmluZywgJG5lZWRsZSwgJG9mZnNldCk7CgpyZXR1cm4gZmFsc2UgPT09ICRpID8gbnVsbCA6ICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gam9pbihhcnJheSAkc3RyaW5ncywgP3N0cmluZyAkbGFzdEdsdWUgPSBudWxsKTogQWJzdHJhY3RTdHJpbmcKewokc3RyID0gcGFyZW50Ojpqb2luKCRzdHJpbmdzLCAkbGFzdEdsdWUpOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nKSA/OiAkc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBsZW5ndGgoKTogaW50CnsKcmV0dXJuIGdyYXBoZW1lX3N0cmxlbigkdGhpcy0+c3RyaW5nKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5vcm1hbGl6ZShpbnQgJGZvcm0gPSBzZWxmOjpORkMpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CgppZiAoXGluX2FycmF5KCRmb3JtLCBbc2VsZjo6TkZDLCBzZWxmOjpORktDXSwgdHJ1ZSkpIHsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZywgJGZvcm0pID86ICRzdHItPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHItPnN0cmluZywgJGZvcm0pOwp9IGVsc2VpZiAoIVxpbl9hcnJheSgkZm9ybSwgW3NlbGY6Ok5GRCwgc2VsZjo6TkZLRF0sIHRydWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vuc3VwcG9ydGVkIG5vcm1hbGl6YXRpb24gZm9ybS4nKTsKfSBlbHNlaWYgKCFub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nLCAkZm9ybSkpIHsKJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nLCAkZm9ybSk7CiRzdHItPmlnbm9yZUNhc2UgPSBudWxsOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHByZXBlbmQoc3RyaW5nIC4uLiRwcmVmaXgpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gKDEgPj0gXGNvdW50KCRwcmVmaXgpID8gKCRwcmVmaXhbMF0gPz8gJycpIDogaW1wbG9kZSgnJywgJHByZWZpeCkpLiR0aGlzLT5zdHJpbmc7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyLT5zdHJpbmcpID86ICRzdHItPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHItPnN0cmluZyk7CgppZiAoZmFsc2UgPT09ICRzdHItPnN0cmluZykgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXBsYWNlKHN0cmluZyAkZnJvbSwgc3RyaW5nICR0byk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJGZyb20pID86ICRmcm9tID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJGZyb20pOwoKaWYgKCcnICE9PSAkZnJvbSAmJiBmYWxzZSAhPT0gJGZyb20pIHsKJHRhaWwgPSAkc3RyLT5zdHJpbmc7CiRyZXN1bHQgPSAnJzsKJGluZGV4T2YgPSAkdGhpcy0+aWdub3JlQ2FzZSA/ICdncmFwaGVtZV9zdHJpcG9zJyA6ICdncmFwaGVtZV9zdHJwb3MnOwoKd2hpbGUgKCcnICE9PSAkdGFpbCAmJiBmYWxzZSAhPT0gJGkgPSAkaW5kZXhPZigkdGFpbCwgJGZyb20pKSB7CiRzbGljZSA9IGdyYXBoZW1lX3N1YnN0cigkdGFpbCwgMCwgJGkpOwokcmVzdWx0IC49ICRzbGljZS4kdG87CiR0YWlsID0gc3Vic3RyKCR0YWlsLCBcc3RybGVuKCRzbGljZSkgKyBcc3RybGVuKCRmcm9tKSk7Cn0KCiRzdHItPnN0cmluZyA9ICRyZXN1bHQuJHRhaWw7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyLT5zdHJpbmcpID86ICRzdHItPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHItPnN0cmluZyk7CgppZiAoZmFsc2UgPT09ICRzdHItPnN0cmluZykgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHJlcGxhY2VNYXRjaGVzKHN0cmluZyAkZnJvbVJlZ2V4cCwgJHRvKTogQWJzdHJhY3RTdHJpbmcKewokc3RyID0gcGFyZW50OjpyZXBsYWNlTWF0Y2hlcygkZnJvbVJlZ2V4cCwgJHRvKTsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZykgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2xpY2UoaW50ICRzdGFydCA9IDAsID9pbnQgJGxlbmd0aCA9IG51bGwpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCAmJiAwID4gJHN0YXJ0ICYmIGdyYXBoZW1lX3N0cmxlbigkdGhpcy0+c3RyaW5nKSA8IC0kc3RhcnQpIHsKJHN0YXJ0ID0gMDsKfQokc3RyLT5zdHJpbmcgPSAoc3RyaW5nKSBncmFwaGVtZV9zdWJzdHIoJHRoaXMtPnN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoID8/IDIxNDc0ODM2NDcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzcGxpY2Uoc3RyaW5nICRyZXBsYWNlbWVudCwgaW50ICRzdGFydCA9IDAsID9pbnQgJGxlbmd0aCA9IG51bGwpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCAmJiAwID4gJHN0YXJ0ICYmIGdyYXBoZW1lX3N0cmxlbigkdGhpcy0+c3RyaW5nKSA8IC0kc3RhcnQpIHsKJHN0YXJ0ID0gMDsKfQokc3RhcnQgPSAkc3RhcnQgPyBcc3RybGVuKGdyYXBoZW1lX3N1YnN0cigkdGhpcy0+c3RyaW5nLCAwLCAkc3RhcnQpKSA6IDA7CiRsZW5ndGggPSAkbGVuZ3RoID8gXHN0cmxlbihncmFwaGVtZV9zdWJzdHIoJHRoaXMtPnN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoID8/IDIxNDc0ODM2NDcpKSA6ICRsZW5ndGg7CiRzdHItPnN0cmluZyA9IHN1YnN0cl9yZXBsYWNlKCR0aGlzLT5zdHJpbmcsICRyZXBsYWNlbWVudCwgJHN0YXJ0LCAkbGVuZ3RoID8/IDIxNDc0ODM2NDcpOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nKSA/OiAkc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcpOwoKaWYgKGZhbHNlID09PSAkc3RyLT5zdHJpbmcpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3BsaXQoc3RyaW5nICRkZWxpbWl0ZXIsID9pbnQgJGxpbWl0ID0gbnVsbCwgP2ludCAkZmxhZ3MgPSBudWxsKTogYXJyYXkKewppZiAoMSA+ICRsaW1pdCA9ICRsaW1pdCA/PyAyMTQ3NDgzNjQ3KSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1NwbGl0IGxpbWl0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLicpOwp9CgppZiAoJycgPT09ICRkZWxpbWl0ZXIpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgZGVsaW1pdGVyIGlzIGVtcHR5LicpOwp9CgppZiAobnVsbCAhPT0gJGZsYWdzKSB7CnJldHVybiBwYXJlbnQ6OnNwbGl0KCRkZWxpbWl0ZXIuJ3UnLCAkbGltaXQsICRmbGFncyk7Cn0KCm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkZGVsaW1pdGVyKSA/OiAkZGVsaW1pdGVyID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJGRlbGltaXRlcik7CgppZiAoZmFsc2UgPT09ICRkZWxpbWl0ZXIpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgZGVsaW1pdGVyIGlzIG5vdCBhIHZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwokdGFpbCA9ICR0aGlzLT5zdHJpbmc7CiRjaHVua3MgPSBbXTsKJGluZGV4T2YgPSAkdGhpcy0+aWdub3JlQ2FzZSA/ICdncmFwaGVtZV9zdHJpcG9zJyA6ICdncmFwaGVtZV9zdHJwb3MnOwoKd2hpbGUgKDEgPCAkbGltaXQgJiYgZmFsc2UgIT09ICRpID0gJGluZGV4T2YoJHRhaWwsICRkZWxpbWl0ZXIpKSB7CiRzdHItPnN0cmluZyA9IGdyYXBoZW1lX3N1YnN0cigkdGFpbCwgMCwgJGkpOwokY2h1bmtzW10gPSBjbG9uZSAkc3RyOwokdGFpbCA9IHN1YnN0cigkdGFpbCwgXHN0cmxlbigkc3RyLT5zdHJpbmcpICsgXHN0cmxlbigkZGVsaW1pdGVyKSk7Ci0tJGxpbWl0Owp9Cgokc3RyLT5zdHJpbmcgPSAkdGFpbDsKJGNodW5rc1tdID0gY2xvbmUgJHN0cjsKCnJldHVybiAkY2h1bmtzOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3RhcnRzV2l0aCgkcHJlZml4KTogYm9vbAp7CmlmICgkcHJlZml4IGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJHByZWZpeCA9ICRwcmVmaXgtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkcHJlZml4KSB8fCAkcHJlZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OnN0YXJ0c1dpdGgoJHByZWZpeCk7Cn0gZWxzZSB7CiRwcmVmaXggPSAoc3RyaW5nKSAkcHJlZml4Owp9CgokZm9ybSA9IG51bGwgPT09ICR0aGlzLT5pZ25vcmVDYXNlID8gXE5vcm1hbGl6ZXI6Ok5GRCA6IFxOb3JtYWxpemVyOjpORkM7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkcHJlZml4LCAkZm9ybSkgPzogJHByZWZpeCA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRwcmVmaXgsICRmb3JtKTsKCmlmICgnJyA9PT0gJHByZWZpeCB8fCBmYWxzZSA9PT0gJHByZWZpeCkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewpyZXR1cm4gMCA9PT0gbWJfc3RyaXBvcyhncmFwaGVtZV9leHRyYWN0KCR0aGlzLT5zdHJpbmcsIFxzdHJsZW4oJHByZWZpeCksIFxHUkFQSEVNRV9FWFRSX01BWEJZVEVTKSwgJHByZWZpeCwgMCwgJ1VURi04Jyk7Cn0KCnJldHVybiAkcHJlZml4ID09PSBncmFwaGVtZV9leHRyYWN0KCR0aGlzLT5zdHJpbmcsIFxzdHJsZW4oJHByZWZpeCksIFxHUkFQSEVNRV9FWFRSX01BWEJZVEVTKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fd2FrZXVwKCkKewppZiAoIVxpc19zdHJpbmcoJHRoaXMtPnN0cmluZykpIHsKdGhyb3cgbmV3IFxCYWRNZXRob2RDYWxsRXhjZXB0aW9uKCdDYW5ub3QgdW5zZXJpYWxpemUgJy5fX0NMQVNTX18pOwp9Cgpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHRoaXMtPnN0cmluZykgPzogJHRoaXMtPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCR0aGlzLT5zdHJpbmcpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5pZ25vcmVDYXNlKSB7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkdGhpcy0+c3RyaW5nKSA/OiAkdGhpcy0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHRoaXMtPnN0cmluZyk7Cn0KCiR0aGlzLT5pZ25vcmVDYXNlID0gZmFsc2U7Cn0KfQo8P3BocAoKaWYgKFBIUF9TQVBJICE9PSAnY2xpJyAmJiBQSFBfU0FQSSAhPT0gJ3BocGRiZycpIHsKICAgIGlmICgwID09PSBzdHJwb3MoX19GSUxFX18sICdwaGFyOicpICYmIGluaV9nZXQoJ3JlZ2lzdGVyX2FyZ2NfYXJndicpKSB7CiAgICAgICAgZWNobyAnQ29tcG9zZXIgY2Fubm90IGJlIHJ1biBzYWZlbHkgb24gbm9uLUNMSSBTQVBJcyB3aXRoIHJlZ2lzdGVyX2FyZ2NfYXJndj1Pbi4gQWJvcnRpbmcuJy5QSFBfRU9MOwogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgZWNobyAnV2FybmluZzogQ29tcG9zZXIgc2hvdWxkIGJlIGludm9rZWQgdmlhIHRoZSBDTEkgdmVyc2lvbiBvZiBQSFAsIG5vdCB0aGUgJy5QSFBfU0FQSS4nIFNBUEknLlBIUF9FT0w7Cn0KCmlmIChQSFBfVkVSU0lPTl9JRCA8IDcwMjA1KSB7CiAgICBlY2hvICdDb21wb3NlciAyLjMuMCBkcm9wcGVkIHN1cHBvcnQgZm9yIFBIUCA8Ny4yLjUgYW5kIHlvdSBhcmUgcnVubmluZyAnLlBIUF9WRVJTSU9OLicsIHBsZWFzZSB1cGdyYWRlIFBIUCBvciB1c2UgQ29tcG9zZXIgMi4yIExUUyB2aWEgImNvbXBvc2VyIHNlbGYtdXBkYXRlIC0tMi4yIi4gQWJvcnRpbmcuJy5QSFBfRU9MOwogICAgZXhpdCgxKTsKfQoKc2V0bG9jYWxlKExDX0FMTCwgJ0MnKTsKcmVxdWlyZSBfX0RJUl9fLicvLi4vc3JjL2Jvb3RzdHJhcC5waHAnOwoKdXNlIENvbXBvc2VyXENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBDb21wb3NlclxYZGVidWdIYW5kbGVyXFhkZWJ1Z0hhbmRsZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxFcnJvckhhbmRsZXI7CgplcnJvcl9yZXBvcnRpbmcoLTEpOwoKLy8gUmVzdGFydCB3aXRob3V0IFhkZWJ1ZwokeGRlYnVnID0gbmV3IFhkZWJ1Z0hhbmRsZXIoJ0NvbXBvc2VyJyk7CiR4ZGVidWctPmNoZWNrKCk7CnVuc2V0KCR4ZGVidWcpOwoKaWYgKGRlZmluZWQoJ0hIVk1fVkVSU0lPTicpICYmIHZlcnNpb25fY29tcGFyZShISFZNX1ZFUlNJT04sICc0LjAnLCAnPj0nKSkgewogICAgZWNobyAnSEhWTSA0LjAgaGFzIGRyb3BwZWQgc3VwcG9ydCBmb3IgQ29tcG9zZXIsIHBsZWFzZSB1c2UgUEhQIGluc3RlYWQuIEFib3J0aW5nLicuUEhQX0VPTDsKICAgIGV4aXQoMSk7Cn0KaWYgKCFleHRlbnNpb25fbG9hZGVkKCdpY29udicpICYmICFleHRlbnNpb25fbG9hZGVkKCdtYnN0cmluZycpKSB7CiAgICBlY2hvICdUaGUgaWNvbnYgT1IgbWJzdHJpbmcgZXh0ZW5zaW9uIGlzIHJlcXVpcmVkIGFuZCBib3RoIGFyZSBtaXNzaW5nLicKICAgICAgICAuUEhQX0VPTC4nSW5zdGFsbCBlaXRoZXIgb2YgdGhlbSBvciByZWNvbXBpbGUgcGhwIHdpdGhvdXQgLS1kaXNhYmxlLWljb252LicKICAgICAgICAuUEhQX0VPTC4nQWJvcnRpbmcuJy5QSFBfRU9MOwogICAgZXhpdCgxKTsKfQoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnaW5pX3NldCcpKSB7CiAgICAvLyBjaGVjayBpZiBlcnJvciBsb2dnaW5nIGlzIG9uLCBidXQgdG8gYW4gZW1wdHkgZGVzdGluYXRpb24gLSBmb3IgdGhlIENMSSBTQVBJLCB0aGF0IG1lYW5zIHN0ZGVycgogICAgJGxvZ3NUb1NhcGlEZWZhdWx0ID0gKCcnID09PSBpbmlfZ2V0KCdlcnJvcl9sb2cnKSAmJiAoYm9vbCkgaW5pX2dldCgnbG9nX2Vycm9ycycpKTsKICAgIC8vIG9uIHRoZSBDTEkgU0FQSSwgZW5zdXJlIGVycm9ycyBhcmUgZGlzcGxheWVkIG9uIHN0ZGVyciwgZWl0aGVyIHZpYSBkaXNwbGF5X2Vycm9ycyBvciB2aWEgZXJyb3JfbG9nCiAgICBpZiAoUEhQX1NBUEkgPT09ICdjbGknKSB7CiAgICAgICAgQGluaV9zZXQoJ2Rpc3BsYXlfZXJyb3JzJywgJGxvZ3NUb1NhcGlEZWZhdWx0ID8gJzAnIDogJ3N0ZGVycicpOwogICAgfQoKICAgIC8vIFNldCB1c2VyIGRlZmluZWQgbWVtb3J5IGxpbWl0CiAgICBpZiAoJG1lbW9yeUxpbWl0ID0gZ2V0ZW52KCdDT01QT1NFUl9NRU1PUllfTElNSVQnKSkgewogICAgICAgIEBpbmlfc2V0KCdtZW1vcnlfbGltaXQnLCAkbWVtb3J5TGltaXQpOwogICAgfSBlbHNlIHsKICAgICAgICAkbWVtb3J5SW5CeXRlcyA9IGZ1bmN0aW9uICgkdmFsdWUpIHsKICAgICAgICAgICAgJHVuaXQgPSBzdHJ0b2xvd2VyKHN1YnN0cigkdmFsdWUsIC0xLCAxKSk7CiAgICAgICAgICAgICR2YWx1ZSA9IChpbnQpICR2YWx1ZTsKICAgICAgICAgICAgc3dpdGNoKCR1bml0KSB7CiAgICAgICAgICAgICAgICBjYXNlICdnJzoKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgKj0gMTAyNDsKICAgICAgICAgICAgICAgICAgICAvLyBubyBicmVhayAoY3VtdWxhdGl2ZSBtdWx0aXBsaWVyKQogICAgICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlICo9IDEwMjQ7CiAgICAgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWsgKGN1bXVsYXRpdmUgbXVsdGlwbGllcikKICAgICAgICAgICAgICAgIGNhc2UgJ2snOgogICAgICAgICAgICAgICAgICAgICR2YWx1ZSAqPSAxMDI0OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgICAgIH07CgogICAgICAgICRtZW1vcnlMaW1pdCA9IHRyaW0oaW5pX2dldCgnbWVtb3J5X2xpbWl0JykpOwogICAgICAgIC8vIEluY3JlYXNlIG1lbW9yeV9saW1pdCBpZiBpdCBpcyBsb3dlciB0aGFuIDEuNUdCCiAgICAgICAgaWYgKCRtZW1vcnlMaW1pdCAhPSAtMSAmJiAkbWVtb3J5SW5CeXRlcygkbWVtb3J5TGltaXQpIDwgMTAyNCAqIDEwMjQgKiAxNTM2KSB7CiAgICAgICAgICAgIEBpbmlfc2V0KCdtZW1vcnlfbGltaXQnLCAnMTUzNk0nKTsKICAgICAgICB9CiAgICAgICAgdW5zZXQoJG1lbW9yeUluQnl0ZXMpOwogICAgfQogICAgdW5zZXQoJG1lbW9yeUxpbWl0KTsKfQoKLy8gV29ya2Fyb3VuZCBQSFAgYnVnIG9uIFdpbmRvd3Mgd2hlcmUgZW52IHZhcnMgY29udGFpbmluZyBVbmljb2RlIGNoYXJzIGFyZSBtYW5nbGVkIGluICRfU0VSVkVSCi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGhwL3BocC1zcmMvaXNzdWVzLzc4OTYKaWYgKFBIUF9WRVJTSU9OX0lEID49IDcwMTEzICYmIChQSFBfVkVSU0lPTl9JRCA8IDgwMDE2IHx8IChQSFBfVkVSU0lPTl9JRCA+PSA4MDEwMCAmJiBQSFBfVkVSU0lPTl9JRCA8IDgwMTAzKSkgJiYgUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiAgICBmb3JlYWNoICgkX1NFUlZFUiBhcyAkc2VydmVyVmFyID0+ICRzZXJ2ZXJWYWwpIHsKICAgICAgICBpZiAoKCRzZXJ2ZXJWYWwgPSBnZXRlbnYoJHNlcnZlclZhcikpICE9PSBmYWxzZSkgewogICAgICAgICAgICAkX1NFUlZFUlskc2VydmVyVmFyXSA9ICRzZXJ2ZXJWYWw7CiAgICAgICAgfQogICAgfQp9CgpQbGF0Zm9ybTo6cHV0RW52KCdDT01QT1NFUl9CSU5BUlknLCByZWFscGF0aCgkX1NFUlZFUlsnYXJndiddWzBdKSk7CgpFcnJvckhhbmRsZXI6OnJlZ2lzdGVyKCk7CgovLyBydW4gdGhlIGNvbW1hbmQgYXBwbGljYXRpb24KJGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uKCk7CiRhcHBsaWNhdGlvbi0+cnVuKCk7CgpDb3B5cmlnaHQgKGMpIE5pbHMgQWRlcm1hbm4sIEpvcmRpIEJvZ2dpYW5vCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKS/63HgW7Rffs92ixFwu2M1vdPkKTAsPbq5g+FW05Bx1H4kq6vimW13J1tQnNZdefOhOAWlHCLMaQVbn9/DaskgQAAABHQk1C
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 14
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
composer
403 B
lrwxr-xr-x
2025-06-04 10:45:46
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
composer.phar
2.98 MB
lrw-r--r--
2025-06-04 10:45:46
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
lsphp
6.11 MB
lrwxr-xr-x
2026-03-08 19:43:42
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
newrelic-daemon
14.11 MB
lrwxr-xr-x
2025-07-10 11:25:06
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
pear
1.44 KB
lrwxr-xr-x
2025-05-12 17:50:56
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
peardev
428 B
lrwxr-xr-x
2025-05-12 17:50:56
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
pecl
319 B
lrwxr-xr-x
2025-05-12 17:50:56
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
phar
14.90 KB
lrwxr-xr-x
2026-03-08 19:43:26
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
phar.phar
14.90 KB
lrwxr-xr-x
2026-03-08 19:43:26
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
php
6.11 MB
lrwxr-xr-x
2026-03-08 19:43:42
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
php-cgi
6.11 MB
lrwxr-xr-x
2026-03-08 19:43:42
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
php-config
7.78 KB
lrwxr-xr-x
2026-03-08 19:43:26
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
phpdbg
6.11 MB
lrwxr-xr-x
2026-03-08 19:43:42
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
phpize
4.71 KB
lrwxr-xr-x
2026-03-08 19:43:26
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).