tx · HE6SaebEzmf4qpwmYyBwfAWYnYZvyaZvKztUCzoVE9cx
3NAxHUEaM6RAG7rVDPL9L6DFZWkrqFtY98t: -0.14200000 Waves
2019.12.27 20:26 [827741] data 3NAxHUEaM6RAG7rVDPL9L6DFZWkrqFtY98t > SELF 0.00000000 Waves
3NAxHUEaM6RAG7rVDPL9L6DFZWkrqFtY98t: jquery.dataTables.js?4?4?2: "base64:ZCAiWC5ZIiBhcmUgYWxzbyBhY2NlcHRhYmxlLgoJICogIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoaXMgdmVyc2lvbiBvZiBEYXRhVGFibGVzIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8KCSAqICAgIHRoZSByZXF1aXJlZCB2ZXJzaW9uLCBvciBmYWxzZSBpZiB0aGlzIHZlcnNpb24gb2YgRGF0YVRhbGVzIGlzIG5vdAoJICogICAgc3VpdGFibGUKCSAqICBAc3RhdGljCgkgKiAgQGR0b3B0IEFQSS1TdGF0aWMKCSAqCgkgKiAgQGV4YW1wbGUKCSAqICAgIGFsZXJ0KCAkLmZuLmRhdGFUYWJsZS52ZXJzaW9uQ2hlY2soICcxLjkuMCcgKSApOwoJICovCglEYXRhVGFibGUudmVyc2lvbkNoZWNrID0gRGF0YVRhYmxlLmZuVmVyc2lvbkNoZWNrID0gZnVuY3Rpb24oIHZlcnNpb24gKQoJewoJCXZhciBhVGhpcyA9IERhdGFUYWJsZS52ZXJzaW9uLnNwbGl0KCcuJyk7CgkJdmFyIGFUaGF0ID0gdmVyc2lvbi5zcGxpdCgnLicpOwoJCXZhciBpVGhpcywgaVRoYXQ7CgkKCQlmb3IgKCB2YXIgaT0wLCBpTGVuPWFUaGF0Lmxlbmd0aCA7IGk8aUxlbiA7IGkrKyApIHsKCQkJaVRoaXMgPSBwYXJzZUludCggYVRoaXNbaV0sIDEwICkgfHwgMDsKCQkJaVRoYXQgPSBwYXJzZUludCggYVRoYXRbaV0sIDEwICkgfHwgMDsKCQoJCQkvLyBQYXJ0cyBhcmUgdGhlIHNhbWUsIGtlZXAgY29tcGFyaW5nCgkJCWlmIChpVGhpcyA9PT0gaVRoYXQpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkKCQkJLy8gUGFydHMgYXJlIGRpZmZlcmVudCwgcmV0dXJuIGltbWVkaWF0ZWx5CgkJCXJldHVybiBpVGhpcyA+IGlUaGF0OwoJCX0KCQoJCXJldHVybiB0cnVlOwoJfTsKCQoJCgkvKioKCSAqIENoZWNrIGlmIGEgYDx0YWJsZT5gIG5vZGUgaXMgYSBEYXRhVGFibGUgdGFibGUgYWxyZWFkeSBvciBub3QuCgkgKgoJICogIEBwYXJhbSB7bm9kZXxqcXVlcnl8c3RyaW5nfSB0YWJsZSBUYWJsZSBub2RlLCBqUXVlcnkgb2JqZWN0IG9yIGpRdWVyeQoJICogICAgICBzZWxlY3RvciBmb3IgdGhlIHRhYmxlIHRvIHRlc3QuIE5vdGUgdGhhdCBpZiBtb3JlIHRoYW4gbW9yZSB0aGFuIG9uZQoJICogICAgICB0YWJsZSBpcyBwYXNzZWQgb24sIG9ubHkgdGhlIGZpcnN0IHdpbGwgYmUgY2hlY2tlZAoJICogIEByZXR1cm5zIHtib29sZWFufSB0cnVlIHRoZSB0YWJsZSBnaXZlbiBpcyBhIERhdGFUYWJsZSwgb3IgZmFsc2Ugb3RoZXJ3aXNlCgkgKiAgQHN0YXRpYwoJICogIEBkdG9wdCBBUEktU3RhdGljCgkgKgoJICogIEBleGFtcGxlCgkgKiAgICBpZiAoICEgJC5mbi5EYXRhVGFibGUuaXNEYXRhVGFibGUoICcjZXhhbXBsZScgKSApIHsKCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKTsKCSAqICAgIH0KCSAqLwoJRGF0YVRhYmxlLmlzRGF0YVRhYmxlID0gRGF0YVRhYmxlLmZuSXNEYXRhVGFibGUgPSBmdW5jdGlvbiAoIHRhYmxlICkKCXsKCQl2YXIgdCA9ICQodGFibGUpLmdldCgwKTsKCQl2YXIgaXMgPSBmYWxzZTsKCQoJCWlmICggdGFibGUgaW5zdGFuY2VvZiBEYXRhVGFibGUuQXBpICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkKCQkkLmVhY2goIERhdGFUYWJsZS5zZXR0aW5ncywgZnVuY3Rpb24gKGksIG8pIHsKCQkJdmFyIGhlYWQgPSBvLm5TY3JvbGxIZWFkID8gJCgndGFibGUnLCBvLm5TY3JvbGxIZWFkKVswXSA6IG51bGw7CgkJCXZhciBmb290ID0gby5uU2Nyb2xsRm9vdCA/ICQoJ3RhYmxlJywgby5uU2Nyb2xsRm9vdClbMF0gOiBudWxsOwoJCgkJCWlmICggby5uVGFibGUgPT09IHQgfHwgaGVhZCA9PT0gdCB8fCBmb290ID09PSB0ICkgewoJCQkJaXMgPSB0cnVlOwoJCQl9CgkJfSApOwoJCgkJcmV0dXJuIGlzOwoJfTsKCQoJCgkvKioKCSAqIEdldCBhbGwgRGF0YVRhYmxlIHRhYmxlcyB0aGF0IGhhdmUgYmVlbiBpbml0aWFsaXNlZCAtIG9wdGlvbmFsbHkgeW91IGNhbgoJICogc2VsZWN0IHRvIGdldCBvbmx5IGN1cnJlbnRseSB2aXNpYmxlIHRhYmxlcy4KCSAqCgkgKiAgQHBhcmFtIHtib29sZWFufSBbdmlzaWJsZT1mYWxzZV0gRmxhZyB0byBpbmRpY2F0ZSBpZiB5b3Ugd2FudCBhbGwgKGRlZmF1bHQpCgkgKiAgICBvciB2aXNpYmxlIHRhYmxlcyBvbmx5LgoJICogIEByZXR1cm5zIHthcnJheX0gQXJyYXkgb2YgYHRhYmxlYCBub2RlcyAobm90IERhdGFUYWJsZSBpbnN0YW5jZXMpIHdoaWNoIGFyZQoJICogICAgRGF0YVRhYmxlcwoJICogIEBzdGF0aWMKCSAqICBAZHRvcHQgQVBJLVN0YXRpYwoJICoKCSAqICBAZXhhbXBsZQoJICogICAgJC5lYWNoKCAkLmZuLmRhdGFUYWJsZS50YWJsZXModHJ1ZSksIGZ1bmN0aW9uICgpIHsKCSAqICAgICAgJCh0YWJsZSkuRGF0YVRhYmxlKCkuY29sdW1ucy5hZGp1c3QoKTsKCSAqICAgIH0gKTsKCSAqLwoJRGF0YVRhYmxlLnRhYmxlcyA9IERhdGFUYWJsZS5mblRhYmxlcyA9IGZ1bmN0aW9uICggdmlzaWJsZSApCgl7CgkJdmFyIGFwaSA9IGZhbHNlOwoJCgkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHZpc2libGUgKSApIHsKCQkJYXBpID0gdmlzaWJsZS5hcGk7CgkJCXZpc2libGUgPSB2aXNpYmxlLnZpc2libGU7CgkJfQoJCgkJdmFyIGEgPSAkLm1hcCggRGF0YVRhYmxlLnNldHRpbmdzLCBmdW5jdGlvbiAobykgewoJCQlpZiAoICF2aXNpYmxlIHx8ICh2aXNpYmxlICYmICQoby5uVGFibGUpLmlzKCc6dmlzaWJsZScpKSApIHsKCQkJCXJldHVybiBvLm5UYWJsZTsKCQkJfQoJCX0gKTsKCQoJCXJldHVybiBhcGkgPwoJCQluZXcgX0FwaSggYSApIDoKCQkJYTsKCX07CgkKCQoJLyoqCgkgKiBDb252ZXJ0IGZyb20gY2FtZWwgY2FzZSBwYXJhbWV0ZXJzIHRvIEh1bmdhcmlhbiBub3RhdGlvbi4gVGhpcyBpcyBtYWRlIHB1YmxpYwoJICogZm9yIHRoZSBleHRlbnNpb25zIHRvIHByb3ZpZGUgdGhlIHNhbWUgYWJpbGl0eSBhcyBEYXRhVGFibGVzIGNvcmUgdG8gYWNjZXB0CgkgKiBlaXRoZXIgdGhlIDEuOSBzdHlsZSBIdW5nYXJpYW4gbm90YXRpb24sIG9yIHRoZSAxLjEwKyBzdHlsZSBjYW1lbENhc2UKCSAqIHBhcmFtZXRlcnMuCgkgKgoJICogIEBwYXJhbSB7b2JqZWN0fSBzcmMgVGhlIG1vZGVsIG9iamVjdCB3aGljaCBob2xkcyBhbGwgcGFyYW1ldGVycyB0aGF0IGNhbiBiZQoJICogICAgbWFwcGVkLgoJICogIEBwYXJhbSB7b2JqZWN0fSB1c2VyIFRoZSBvYmplY3QgdG8gY29udmVydCBmcm9tIGNhbWVsIGNhc2UgdG8gSHVuZ2FyaWFuLgoJICogIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgV2hlbiBzZXQgdG8gYHRydWVgLCBwcm9wZXJ0aWVzIHdoaWNoIGFscmVhZHkgaGF2ZSBhCgkgKiAgICBIdW5nYXJpYW4gdmFsdWUgaW4gdGhlIGB1c2VyYCBvYmplY3Qgd2lsbCBiZSBvdmVyd3JpdHRlbi4gT3RoZXJ3aXNlIHRoZXkKCSAqICAgIHdvbid0IGJlLgoJICovCglEYXRhVGFibGUuY2FtZWxUb0h1bmdhcmlhbiA9IF9mbkNhbWVsVG9IdW5nYXJpYW47CgkKCQoJCgkvKioKCSAqCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICckKCknLCBmdW5jdGlvbiAoIHNlbGVjdG9yLCBvcHRzICkgewoJCXZhcgoJCQlyb3dzICAgPSB0aGlzLnJvd3MoIG9wdHMgKS5ub2RlcygpLCAvLyBHZXQgYWxsIHJvd3MKCQkJanFSb3dzID0gJChyb3dzKTsKCQoJCXJldHVybiAkKCBbXS5jb25jYXQoCgkJCWpxUm93cy5maWx0ZXIoIHNlbGVjdG9yICkudG9BcnJheSgpLAoJCQlqcVJvd3MuZmluZCggc2VsZWN0b3IgKS50b0FycmF5KCkKCQkpICk7Cgl9ICk7CgkKCQoJLy8galF1ZXJ5IGZ1bmN0aW9ucyB0byBvcGVyYXRlIG9uIHRoZSB0YWJsZXMKCSQuZWFjaCggWyAnb24nLCAnb25lJywgJ29mZicgXSwgZnVuY3Rpb24gKGksIGtleSkgewoJCV9hcGlfcmVnaXN0ZXIoIGtleSsnKCknLCBmdW5jdGlvbiAoIC8qIGV2ZW50LCBoYW5kbGVyICovICkgewoJCQl2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CgkKCQkJLy8gQWRkIHRoZSBgZHRgIG5hbWVzcGFjZSBhdXRvbWF0aWNhbGx5IGlmIGl0IGlzbid0IGFscmVhZHkgcHJlc2VudAoJCQlhcmdzWzBdID0gJC5tYXAoIGFyZ3NbMF0uc3BsaXQoIC9ccy8gKSwgZnVuY3Rpb24gKCBlICkgewoJCQkJcmV0dXJuICEgZS5tYXRjaCgvXC5kdFxiLykgPwoJCQkJCWUrJy5kdCcgOgoJCQkJCWU7CgkJCQl9ICkuam9pbiggJyAnICk7CgkKCQkJdmFyIGluc3QgPSAkKCB0aGlzLnRhYmxlcygpLm5vZGVzKCkgKTsKCQkJaW5zdFtrZXldLmFwcGx5KCBpbnN0LCBhcmdzICk7CgkJCXJldHVybiB0aGlzOwoJCX0gKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnY2xlYXIoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJX2ZuQ2xlYXJUYWJsZSggc2V0dGluZ3MgKTsKCQl9ICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3NldHRpbmdzKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIG5ldyBfQXBpKCB0aGlzLmNvbnRleHQsIHRoaXMuY29udGV4dCApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXIoICdpbml0KCknLCBmdW5jdGlvbiAoKSB7CgkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQlyZXR1cm4gY3R4Lmxlbmd0aCA/IGN0eFswXS5vSW5pdCA6IG51bGw7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ2RhdGEoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJcmV0dXJuIF9wbHVjayggc2V0dGluZ3MuYW9EYXRhLCAnX2FEYXRhJyApOwoJCX0gKS5mbGF0dGVuKCk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ2Rlc3Ryb3koKScsIGZ1bmN0aW9uICggcmVtb3ZlICkgewoJCXJlbW92ZSA9IHJlbW92ZSB8fCBmYWxzZTsKCQoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQl2YXIgb3JpZyAgICAgID0gc2V0dGluZ3MublRhYmxlV3JhcHBlci5wYXJlbnROb2RlOwoJCQl2YXIgY2xhc3NlcyAgID0gc2V0dGluZ3Mub0NsYXNzZXM7CgkJCXZhciB0YWJsZSAgICAgPSBzZXR0aW5ncy5uVGFibGU7CgkJCXZhciB0Ym9keSAgICAgPSBzZXR0aW5ncy5uVEJvZHk7CgkJCXZhciB0aGVhZCAgICAgPSBzZXR0aW5ncy5uVEhlYWQ7CgkJCXZhciB0Zm9vdCAgICAgPSBzZXR0aW5ncy5uVEZvb3Q7CgkJCXZhciBqcVRhYmxlICAgPSAkKHRhYmxlKTsKCQkJdmFyIGpxVGJvZHkgICA9ICQodGJvZHkpOwoJCQl2YXIganFXcmFwcGVyID0gJChzZXR0aW5ncy5uVGFibGVXcmFwcGVyKTsKCQkJdmFyIHJvd3MgICAgICA9ICQubWFwKCBzZXR0aW5ncy5hb0RhdGEsIGZ1bmN0aW9uIChyKSB7IHJldHVybiByLm5UcjsgfSApOwoJCQl2YXIgaSwgaWVuOwoJCgkJCS8vIEZsYWcgdG8gbm90ZSB0aGF0IHRoZSB0YWJsZSBpcyBjdXJyZW50bHkgYmVpbmcgZGVzdHJveWVkIC0gbm8gYWN0aW9uCgkJCS8vIHNob3VsZCBiZSB0YWtlbgoJCQlzZXR0aW5ncy5iRGVzdHJveWluZyA9IHRydWU7CgkKCQkJLy8gRmlyZSBvZmYgdGhlIGRlc3Ryb3kgY2FsbGJhY2tzIGZvciBwbHVnLWlucyBldGMKCQkJX2ZuQ2FsbGJhY2tGaXJlKCBzZXR0aW5ncywgImFvRGVzdHJveUNhbGxiYWNrIiwgImRlc3Ryb3kiLCBbc2V0dGluZ3NdICk7CgkKCQkJLy8gSWYgbm90IGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQsIG1ha2UgYWxsIGNvbHVtbnMgdmlzaWJsZQoJCQlpZiAoICEgcmVtb3ZlICkgewoJCQkJbmV3IF9BcGkoIHNldHRpbmdzICkuY29sdW1ucygpLnZpc2libGUoIHRydWUgKTsKCQkJfQoJCgkJCS8vIEJsaXR6IGFsbCBgRFRgIG5hbWVzcGFjZWQgZXZlbnRzICh0aGVzZSBhcmUgaW50ZXJuYWwgZXZlbnRzLCB0aGUKCQkJLy8gbG93ZXJjYXNlLCBgZHRgIGV2ZW50cyBhcmUgdXNlciBzdWJzY3JpYmVkIGFuZCB0aGV5IGFyZSByZXNwb25zaWJsZQoJCQkvLyBmb3IgcmVtb3ZpbmcgdGhlbQoJCQlqcVdyYXBwZXIub2ZmKCcuRFQnKS5maW5kKCc6bm90KHRib2R5ICopJykub2ZmKCcuRFQnKTsKCQkJJCh3aW5kb3cpLm9mZignLkRULScrc2V0dGluZ3Muc0luc3RhbmNlKTsKCQoJCQkvLyBXaGVuIHNjcm9sbGluZyB3ZSBoYWQgdG8gYnJlYWsgdGhlIHRhYmxlIHVwIC0gcmVzdG9yZSBpdAoJCQlpZiAoIHRhYmxlICE9IHRoZWFkLnBhcmVudE5vZGUgKSB7CgkJCQlqcVRhYmxlLmNoaWxkcmVuKCd0aGVhZCcpLmRldGFjaCgpOwoJCQkJanFUYWJsZS5hcHBlbmQoIHRoZWFkICk7CgkJCX0KCQoJCQlpZiAoIHRmb290ICYmIHRhYmxlICE9IHRmb290LnBhcmVudE5vZGUgKSB7CgkJCQlqcVRhYmxlLmNoaWxkcmVuKCd0Zm9vdCcpLmRldGFjaCgpOwoJCQkJanFUYWJsZS5hcHBlbmQoIHRmb290ICk7CgkJCX0KCQoJCQlzZXR0aW5ncy5hYVNvcnRpbmcgPSBbXTsKCQkJc2V0dGluZ3MuYWFTb3J0aW5nRml4ZWQgPSBbXTsKCQkJX2ZuU29ydGluZ0NsYXNzZXMoIHNldHRpbmdzICk7CgkKCQkJJCggcm93cyApLnJlbW92ZUNsYXNzKCBzZXR0aW5ncy5hc1N0cmlwZUNsYXNzZXMuam9pbignICcpICk7CgkKCQkJJCgndGgsIHRkJywgdGhlYWQpLnJlbW92ZUNsYXNzKCBjbGFzc2VzLnNTb3J0YWJsZSsnICcrCgkJCQljbGFzc2VzLnNTb3J0YWJsZUFzYysnICcrY2xhc3Nlcy5zU29ydGFibGVEZXNjKycgJytjbGFzc2VzLnNTb3J0YWJsZU5vbmUKCQkJKTsKCQoJCQkvLyBBZGQgdGhlIFRSIGVsZW1lbnRzIGJhY2sgaW50byB0aGUgdGFibGUgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIKCQkJanFUYm9keS5jaGlsZHJlbigpLmRldGFjaCgpOwoJCQlqcVRib2R5LmFwcGVuZCggcm93cyApOwoJCgkJCS8vIFJlbW92ZSB0aGUgRGF0YVRhYmxlcyBnZW5lcmF0ZWQgbm9kZXMsIGV2ZW50cyBhbmQgY2xhc3NlcwoJCQl2YXIgcmVtb3ZlZE1ldGhvZCA9IHJlbW92ZSA/ICdyZW1vdmUnIDogJ2RldGFjaCc7CgkJCWpxVGFibGVbIHJlbW92ZWRNZXRob2QgXSgpOwoJCQlqcVdyYXBwZXJbIHJlbW92ZWRNZXRob2QgXSgpOwoJCgkJCS8vIElmIHdlIG5lZWQgdG8gcmVhdHRhY2ggdGhlIHRhYmxlIHRvIHRoZSBkb2N1bWVudAoJCQlpZiAoICEgcmVtb3ZlICYmIG9yaWcgKSB7CgkJCQkvLyBpbnNlcnRCZWZvcmUgYWN0cyBsaWtlIGFwcGVuZENoaWxkIGlmICFhcmdbMV0KCQkJCW9yaWcuaW5zZXJ0QmVmb3JlKCB0YWJsZSwgc2V0dGluZ3MublRhYmxlUmVpbnNlcnRCZWZvcmUgKTsKCQoJCQkJLy8gUmVzdG9yZSB0aGUgd2lkdGggb2YgdGhlIG9yaWdpbmFsIHRhYmxlIC0gd2FzIHJlYWQgZnJvbSB0aGUgc3R5bGUgcHJvcGVydHksCgkJCQkvLyBzbyB3ZSBjYW4gcmVzdG9yZSBkaXJlY3RseSB0byB0aGF0CgkJCQlqcVRhYmxlCgkJCQkJLmNzcyggJ3dpZHRoJywgc2V0dGluZ3Muc0Rlc3Ryb3lXaWR0aCApCgkJCQkJLnJlbW92ZUNsYXNzKCBjbGFzc2VzLnNUYWJsZSApOwoJCgkJCQkvLyBJZiB0aGUgd2VyZSBvcmlnaW5hbGx5IHN0cmlwZSBjbGFzc2VzIC0gdGhlbiB3ZSBhZGQgdGhlbSBiYWNrIGhlcmUuCgkJCQkvLyBOb3RlIHRoaXMgaXMgbm90IGZvb2wgcHJvb2YgKGZvciBleGFtcGxlIGlmIG5vdCBhbGwgcm93cyBoYWQgc3RyaXBlCgkJCQkvLyBjbGFzc2VzIC0gYnV0IGl0J3MgYSBnb29kIGVmZm9ydCB3aXRob3V0IGdldHRpbmcgY2FycmllZCBhd2F5CgkJCQlpZW4gPSBzZXR0aW5ncy5hc0Rlc3Ryb3lTdHJpcGVzLmxlbmd0aDsKCQoJCQkJaWYgKCBpZW4gKSB7CgkJCQkJanFUYm9keS5jaGlsZHJlbigpLmVhY2goIGZ1bmN0aW9uIChpKSB7CgkJCQkJCSQodGhpcykuYWRkQ2xhc3MoIHNldHRpbmdzLmFzRGVzdHJveVN0cmlwZXNbaSAlIGllbl0gKTsKCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQoJCQkvKiBSZW1vdmUgdGhlIHNldHRpbmdzIG9iamVjdCBmcm9tIHRoZSBzZXR0aW5ncyBhcnJheSAqLwoJCQl2YXIgaWR4ID0gJC5pbkFycmF5KCBzZXR0aW5ncywgRGF0YVRhYmxlLnNldHRpbmdzICk7CgkJCWlmICggaWR4ICE9PSAtMSApIHsKCQkJCURhdGFUYWJsZS5zZXR0aW5ncy5zcGxpY2UoIGlkeCwgMSApOwoJCQl9CgkJfSApOwoJfSApOwoJCgkKCS8vIEFkZCB0aGUgYGV2ZXJ5KClgIG1ldGhvZCBmb3Igcm93cywgY29sdW1ucyBhbmQgY2VsbHMgaW4gYSBjb21wYWN0IGZvcm0KCSQuZWFjaCggWyAnY29sdW1uJywgJ3JvdycsICdjZWxsJyBdLCBmdW5jdGlvbiAoIGksIHR5cGUgKSB7CgkJX2FwaV9yZWdpc3RlciggdHlwZSsncygpLmV2ZXJ5KCknLCBmdW5jdGlvbiAoIGZuICkgewoJCQl2YXIgb3B0cyA9IHRoaXMuc2VsZWN0b3Iub3B0czsKCQkJdmFyIGFwaSA9IHRoaXM7CgkKCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoIHR5cGUsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQgKSB7CgkJCQkvLyBSb3dzIGFuZCBjb2x1bW5zOgoJCQkJLy8gIGFyZzEgLSBpbmRleAoJCQkJLy8gIGFyZzIgLSB0YWJsZSBjb3VudGVyCgkJCQkvLyAgYXJnMyAtIGxvb3AgY291bnRlcgoJCQkJLy8gIGFyZzQgLSB1bmRlZmluZWQKCQkJCS8vIENlbGxzOgoJCQkJLy8gIGFyZzEgLSByb3cgaW5kZXgKCQkJCS8vICBhcmcyIC0gY29sdW1uIGluZGV4CgkJCQkvLyAgYXJnMyAtIHRhYmxlIGNvdW50ZXIKCQkJCS8vICBhcmc0IC0gbG9vcCBjb3VudGVyCgkJCQlmbi5jYWxsKAoJCQkJCWFwaVsgdHlwZSBdKAoJCQkJCQlhcmcxLAoJCQkJCQl0eXBlPT09J2NlbGwnID8gYXJnMiA6IG9wdHMsCgkJCQkJCXR5cGU9PT0nY2VsbCcgPyBvcHRzIDogdW5kZWZpbmVkCgkJCQkJKSwKCQkJCQlhcmcxLCBhcmcyLCBhcmczLCBhcmc0CgkJCQkpOwoJCQl9ICk7CgkJfSApOwoJfSApOwoJCgkKCS8vIGkxOG4gbWV0aG9kIGZvciBleHRlbnNpb25zIHRvIGJlIGFibGUgdG8gdXNlIHRoZSBsYW5ndWFnZSBvYmplY3QgZnJvbSB0aGUKCS8vIERhdGFUYWJsZQoJX2FwaV9yZWdpc3RlciggJ2kxOG4oKScsIGZ1bmN0aW9uICggdG9rZW4sIGRlZiwgcGx1cmFsICkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHRbMF07CgkJdmFyIHJlc29sdmVkID0gX2ZuR2V0T2JqZWN0RGF0YUZuKCB0b2tlbiApKCBjdHgub0xhbmd1YWdlICk7CgkKCQlpZiAoIHJlc29sdmVkID09PSB1bmRlZmluZWQgKSB7CgkJCXJlc29sdmVkID0gZGVmOwoJCX0KCQoJCWlmICggcGx1cmFsICE9PSB1bmRlZmluZWQgJiYgJC5pc1BsYWluT2JqZWN0KCByZXNvbHZlZCApICkgewoJCQlyZXNvbHZlZCA9IHJlc29sdmVkWyBwbHVyYWwgXSAhPT0gdW5kZWZpbmVkID8KCQkJCXJlc29sdmVkWyBwbHVyYWwgXSA6CgkJCQlyZXNvbHZlZC5fOwoJCX0KCQoJCXJldHVybiByZXNvbHZlZC5yZXBsYWNlKCAnJWQnLCBwbHVyYWwgKTsgLy8gbmI6IHBsdXJhbCBtaWdodCBiZSB1bmRlZmluZWQsCgl9ICk7CgkvKioKCSAqIFZlcnNpb24gc3RyaW5nIGZvciBwbHVnLWlucyB0byBjaGVjayBjb21wYXRpYmlsaXR5LiBBbGxvd2VkIGZvcm1hdCBpcwoJICogYGEuYi5jLWRgIHdoZXJlOiBhOmludCwgYjppbnQsIGM6aW50LCBkOnN0cmluZyhkZXZ8YmV0YXxhbHBoYSkuIGBkYCBpcyB1c2VkCgkgKiBvbmx5IGZvciBub24tcmVsZWFzZSBidWlsZHMuIFNlZSBodHRwOi8vc2VtdmVyLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCgkgKiAgQG1lbWJlcgoJICogIEB0eXBlIHN0cmluZwoJICogIEBkZWZhdWx0IFZlcnNpb24gbnVtYmVyCgkgKi8KCURhdGFUYWJsZS52ZXJzaW9uID0gIjEuMTAuMTkiOwoKCS8qKgoJICogUHJpdmF0ZSBkYXRhIHN0b3JlLCBjb250YWluaW5nIGFsbCBvZiB0aGUgc2V0dGluZ3Mgb2JqZWN0cyB0aGF0IGFyZQoJICogY3JlYXRlZCBmb3IgdGhlIHRhYmxlcyBvbiBhIGdpdmVuIHBhZ2UuCgkgKgoJICogTm90ZSB0aGF0IHRoZSBgRGF0YVRhYmxlLnNldHRpbmdzYCBvYmplY3QgaXMgYWxpYXNlZCB0bwoJICogYGpRdWVyeS5mbi5kYXRhVGFibGVFeHRgIHRocm91Z2ggd2hpY2ggaXQgbWF5IGJlIGFjY2Vzc2VkIGFuZAoJICogbWFuaXB1bGF0ZWQsIG9yIGBqUXVlcnkuZm4uZGF0YVRhYmxlLnNldHRpbmdzYC4KCSAqICBAbWVtYmVyCgkgKiAgQHR5cGUgYXJyYXkKCSAqICBAZGVmYXVsdCBbXQoJICogIEBwcml2YXRlCgkgKi8KCURhdGFUYWJsZS5zZXR0aW5ncyA9IFtdOwoKCS8qKgoJICogT2JqZWN0IG1vZGVscyBjb250YWluZXIsIGZvciB0aGUgdmFyaW91cyBtb2RlbHMgdGhhdCBEYXRhVGFibGVzIGhhcwoJICogYXZhaWxhYmxlIHRvIGl0LiBUaGVzZSBtb2RlbHMgZGVmaW5lIHRoZSBvYmplY3RzIHRoYXQgYXJlIHVzZWQgdG8gaG9sZAoJICogdGhlIGFjdGl2ZSBzdGF0ZSBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFibGUuCgkgKiAgQG5hbWVzcGFjZQoJICovCglEYXRhVGFibGUubW9kZWxzID0ge307CgkKCQoJCgkvKioKCSAqIFRlbXBsYXRlIG9iamVjdCBmb3IgdGhlIHdheSBpbiB3aGljaCBEYXRhVGFibGVzIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0CgkgKiBzZWFyY2ggaW5mb3JtYXRpb24gZm9yIHRoZSBnbG9iYWwgZmlsdGVyIGFuZCBpbmRpdmlkdWFsIGNvbHVtbiBmaWx0ZXJzLgoJICogIEBuYW1lc3BhY2UKCSAqLwoJRGF0YVRhYmxlLm1vZGVscy5vU2VhcmNoID0gewoJCS8qKgoJCSAqIEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGZpbHRlcmluZyBzaG91bGQgYmUgY2FzZSBpbnNlbnNpdGl2ZSBvciBub3QKCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqICBAZGVmYXVsdCB0cnVlCgkJICovCgkJImJDYXNlSW5zZW5zaXRpdmUiOiB0cnVlLAoJCgkJLyoqCgkJICogQXBwbGllZCBzZWFyY2ggdGVybQoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgPGk+RW1wdHkgc3RyaW5nPC9pPgoJCSAqLwoJCSJzU2VhcmNoIjogIiIsCgkKCQkvKioKCQkgKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBzZWFyY2ggdGVybSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYQoJCSAqIHJlZ3VsYXIgZXhwcmVzc2lvbiAodHJ1ZSkgb3Igbm90IChmYWxzZSkgYW5kIHRoZXJlZm9yZSBhbmQgc3BlY2lhbAoJCSAqIHJlZ2V4IGNoYXJhY3RlcnMgZXNjYXBlZC4KCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqICBAZGVmYXVsdCBmYWxzZQoJCSAqLwoJCSJiUmVnZXgiOiBmYWxzZSwKCQoJCS8qKgoJCSAqIEZsYWcgdG8gaW5kaWNhdGUgaWYgRGF0YVRhYmxlcyBpcyB0byB1c2UgaXRzIHNtYXJ0IGZpbHRlcmluZyBvciBub3QuCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgdHJ1ZQoJCSAqLwoJCSJiU21hcnQiOiB0cnVlCgl9OwoJCgkKCQoJCgkvKioKCSAqIFRlbXBsYXRlIG9iamVjdCBmb3IgdGhlIHdheSBpbiB3aGljaCBEYXRhVGFibGVzIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0CgkgKiBlYWNoIGluZGl2aWR1YWwgcm93LiBUaGlzIGlzIHRoZSBvYmplY3QgZm9ybWF0IHVzZWQgZm9yIHRoZSBzZXR0aW5ncwoJICogYW9EYXRhIGFycmF5LgoJICogIEBuYW1lc3BhY2UKCSAqLwoJRGF0YVRhYmxlLm1vZGVscy5vUm93ID0gewoJCS8qKgoJCSA="
3NAxHUEaM6RAG7rVDPL9L6DFZWkrqFtY98t: jquery.dataTables.js?4?3?2: "base64:dmUoIHRoaXMgKTsKCQlyZXR1cm4gdGhpczsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCBfY2hpbGRfb2JqKycuaXNTaG93bigpJywgZnVuY3Rpb24gKCkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlpZiAoIGN0eC5sZW5ndGggJiYgdGhpcy5sZW5ndGggKSB7CgkJCS8vIF9kZXRhaWxzU2hvd24gYXMgZmFsc2Ugb3IgdW5kZWZpbmVkIHdpbGwgZmFsbCB0aHJvdWdoIHRvIHJldHVybiBmYWxzZQoJCQlyZXR1cm4gY3R4WzBdLmFvRGF0YVsgdGhpc1swXSBdLl9kZXRhaWxzU2hvdyB8fCBmYWxzZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfSApOwoJCgkKCQoJLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqCgkgKiBDb2x1bW5zCgkgKgoJICoge2ludGVnZXJ9ICAgICAgICAgICAtIGNvbHVtbiBpbmRleCAoPj0wIGNvdW50IGZyb20gbGVmdCwgPDAgY291bnQgZnJvbSByaWdodCkKCSAqICJ7aW50ZWdlcn06dmlzSWR4IiAgLSB2aXNpYmxlIGNvbHVtbiBpbmRleCAoaS5lLiB0cmFuc2xhdGUgdG8gY29sdW1uIGluZGV4KSAgKD49MCBjb3VudCBmcm9tIGxlZnQsIDwwIGNvdW50IGZyb20gcmlnaHQpCgkgKiAie2ludGVnZXJ9OnZpc2libGUiIC0gYWxpYXMgZm9yIHtpbnRlZ2VyfTp2aXNJZHggICg+PTAgY291bnQgZnJvbSBsZWZ0LCA8MCBjb3VudCBmcm9tIHJpZ2h0KQoJICogIntzdHJpbmd9Om5hbWUiICAgICAtIGNvbHVtbiBuYW1lCgkgKiAie3N0cmluZ30iICAgICAgICAgIC0galF1ZXJ5IHNlbGVjdG9yIG9uIGNvbHVtbiBoZWFkZXIgbm9kZXMKCSAqCgkgKi8KCQoJLy8gY2FuIGJlIGFuIGFycmF5IG9mIHRoZXNlIGl0ZW1zLCBjb21tYSBzZXBhcmF0ZWQgbGlzdCwgb3IgYW4gYXJyYXkgb2YgY29tbWEKCS8vIHNlcGFyYXRlZCBsaXN0cwoJCgl2YXIgX19yZV9jb2x1bW5fc2VsZWN0b3IgPSAvXihbXjpdKyk6KG5hbWV8dmlzSWR4fHZpc2libGUpJC87CgkKCQoJLy8gcjEgYW5kIHIyIGFyZSByZWR1bmRhbnQgLSBidXQgaXQgbWVhbnMgdGhhdCB0aGUgcGFyYW1ldGVycyBtYXRjaCBmb3IgdGhlCgkvLyBpdGVyYXRvciBjYWxsYmFjayBpbiBjb2x1bW5zKCkuZGF0YSgpCgl2YXIgX19jb2x1bW5EYXRhID0gZnVuY3Rpb24gKCBzZXR0aW5ncywgY29sdW1uLCByMSwgcjIsIHJvd3MgKSB7CgkJdmFyIGEgPSBbXTsKCQlmb3IgKCB2YXIgcm93PTAsIGllbj1yb3dzLmxlbmd0aCA7IHJvdzxpZW4gOyByb3crKyApIHsKCQkJYS5wdXNoKCBfZm5HZXRDZWxsRGF0YSggc2V0dGluZ3MsIHJvd3Nbcm93XSwgY29sdW1uICkgKTsKCQl9CgkJcmV0dXJuIGE7Cgl9OwoJCgkKCXZhciBfX2NvbHVtbl9zZWxlY3RvciA9IGZ1bmN0aW9uICggc2V0dGluZ3MsIHNlbGVjdG9yLCBvcHRzICkKCXsKCQl2YXIKCQkJY29sdW1ucyA9IHNldHRpbmdzLmFvQ29sdW1ucywKCQkJbmFtZXMgPSBfcGx1Y2soIGNvbHVtbnMsICdzTmFtZScgKSwKCQkJbm9kZXMgPSBfcGx1Y2soIGNvbHVtbnMsICduVGgnICk7CgkKCQl2YXIgcnVuID0gZnVuY3Rpb24gKCBzICkgewoJCQl2YXIgc2VsSW50ID0gX2ludFZhbCggcyApOwoJCgkJCS8vIFNlbGVjdG9yIC0gYWxsCgkJCWlmICggcyA9PT0gJycgKSB7CgkJCQlyZXR1cm4gX3JhbmdlKCBjb2x1bW5zLmxlbmd0aCApOwoJCQl9CgkKCQkJLy8gU2VsZWN0b3IgLSBpbmRleAoJCQlpZiAoIHNlbEludCAhPT0gbnVsbCApIHsKCQkJCXJldHVybiBbIHNlbEludCA+PSAwID8KCQkJCQlzZWxJbnQgOiAvLyBDb3VudCBmcm9tIGxlZnQKCQkJCQljb2x1bW5zLmxlbmd0aCArIHNlbEludCAvLyBDb3VudCBmcm9tIHJpZ2h0ICgrIGJlY2F1c2UgaXRzIGEgbmVnYXRpdmUgdmFsdWUpCgkJCQldOwoJCQl9CgkKCQkJLy8gU2VsZWN0b3IgPSBmdW5jdGlvbgoJCQlpZiAoIHR5cGVvZiBzID09PSAnZnVuY3Rpb24nICkgewoJCQkJdmFyIHJvd3MgPSBfc2VsZWN0b3Jfcm93X2luZGV4ZXMoIHNldHRpbmdzLCBvcHRzICk7CgkKCQkJCXJldHVybiAkLm1hcCggY29sdW1ucywgZnVuY3Rpb24gKGNvbCwgaWR4KSB7CgkJCQkJcmV0dXJuIHMoCgkJCQkJCQlpZHgsCgkJCQkJCQlfX2NvbHVtbkRhdGEoIHNldHRpbmdzLCBpZHgsIDAsIDAsIHJvd3MgKSwKCQkJCQkJCW5vZGVzWyBpZHggXQoJCQkJCQkpID8gaWR4IDogbnVsbDsKCQkJCX0gKTsKCQkJfQoJCgkJCS8vIGpRdWVyeSBvciBzdHJpbmcgc2VsZWN0b3IKCQkJdmFyIG1hdGNoID0gdHlwZW9mIHMgPT09ICdzdHJpbmcnID8KCQkJCXMubWF0Y2goIF9fcmVfY29sdW1uX3NlbGVjdG9yICkgOgoJCQkJJyc7CgkKCQkJaWYgKCBtYXRjaCApIHsKCQkJCXN3aXRjaCggbWF0Y2hbMl0gKSB7CgkJCQkJY2FzZSAndmlzSWR4JzoKCQkJCQljYXNlICd2aXNpYmxlJzoKCQkJCQkJdmFyIGlkeCA9IHBhcnNlSW50KCBtYXRjaFsxXSwgMTAgKTsKCQkJCQkJLy8gVmlzaWJsZSBpbmRleCBnaXZlbiwgY29udmVydCB0byBjb2x1bW4gaW5kZXgKCQkJCQkJaWYgKCBpZHggPCAwICkgewoJCQkJCQkJLy8gQ291bnRpbmcgZnJvbSB0aGUgcmlnaHQKCQkJCQkJCXZhciB2aXNDb2x1bW5zID0gJC5tYXAoIGNvbHVtbnMsIGZ1bmN0aW9uIChjb2wsaSkgewoJCQkJCQkJCXJldHVybiBjb2wuYlZpc2libGUgPyBpIDogbnVsbDsKCQkJCQkJCX0gKTsKCQkJCQkJCXJldHVybiBbIHZpc0NvbHVtbnNbIHZpc0NvbHVtbnMubGVuZ3RoICsgaWR4IF0gXTsKCQkJCQkJfQoJCQkJCQkvLyBDb3VudGluZyBmcm9tIHRoZSBsZWZ0CgkJCQkJCXJldHVybiBbIF9mblZpc2libGVUb0NvbHVtbkluZGV4KCBzZXR0aW5ncywgaWR4ICkgXTsKCQoJCQkJCWNhc2UgJ25hbWUnOgoJCQkJCQkvLyBtYXRjaCBieSBuYW1lLiBgbmFtZXNgIGlzIGNvbHVtbiBpbmRleCBjb21wbGV0ZSBhbmQgaW4gb3JkZXIKCQkJCQkJcmV0dXJuICQubWFwKCBuYW1lcywgZnVuY3Rpb24gKG5hbWUsIGkpIHsKCQkJCQkJCXJldHVybiBuYW1lID09PSBtYXRjaFsxXSA/IGkgOiBudWxsOwoJCQkJCQl9ICk7CgkKCQkJCQlkZWZhdWx0OgoJCQkJCQlyZXR1cm4gW107CgkJCQl9CgkJCX0KCQoJCQkvLyBDZWxsIGluIHRoZSB0YWJsZSBib2R5CgkJCWlmICggcy5ub2RlTmFtZSAmJiBzLl9EVF9DZWxsSW5kZXggKSB7CgkJCQlyZXR1cm4gWyBzLl9EVF9DZWxsSW5kZXguY29sdW1uIF07CgkJCX0KCQoJCQkvLyBqUXVlcnkgc2VsZWN0b3Igb24gdGhlIFRIIGVsZW1lbnRzIGZvciB0aGUgY29sdW1ucwoJCQl2YXIganFSZXN1bHQgPSAkKCBub2RlcyApCgkJCQkuZmlsdGVyKCBzICkKCQkJCS5tYXAoIGZ1bmN0aW9uICgpIHsKCQkJCQlyZXR1cm4gJC5pbkFycmF5KCB0aGlzLCBub2RlcyApOyAvLyBgbm9kZXNgIGlzIGNvbHVtbiBpbmRleCBjb21wbGV0ZSBhbmQgaW4gb3JkZXIKCQkJCX0gKQoJCQkJLnRvQXJyYXkoKTsKCQoJCQlpZiAoIGpxUmVzdWx0Lmxlbmd0aCB8fCAhIHMubm9kZU5hbWUgKSB7CgkJCQlyZXR1cm4ganFSZXN1bHQ7CgkJCX0KCQoJCQkvLyBPdGhlcndpc2UgYSBub2RlIHdoaWNoIG1pZ2h0IGhhdmUgYSBgZHQtY29sdW1uYCBkYXRhIGF0dHJpYnV0ZSwgb3IgYmUKCQkJLy8gYSBjaGlsZCBvciBzdWNoIGFuIGVsZW1lbnQKCQkJdmFyIGhvc3QgPSAkKHMpLmNsb3Nlc3QoJypbZGF0YS1kdC1jb2x1bW5dJyk7CgkJCXJldHVybiBob3N0Lmxlbmd0aCA/CgkJCQlbIGhvc3QuZGF0YSgnZHQtY29sdW1uJykgXSA6CgkJCQlbXTsKCQl9OwoJCgkJcmV0dXJuIF9zZWxlY3Rvcl9ydW4oICdjb2x1bW4nLCBzZWxlY3RvciwgcnVuLCBzZXR0aW5ncywgb3B0cyApOwoJfTsKCQoJCgl2YXIgX19zZXRDb2x1bW5WaXMgPSBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4sIHZpcyApIHsKCQl2YXIKCQkJY29scyA9IHNldHRpbmdzLmFvQ29sdW1ucywKCQkJY29sICA9IGNvbHNbIGNvbHVtbiBdLAoJCQlkYXRhID0gc2V0dGluZ3MuYW9EYXRhLAoJCQlyb3csIGNlbGxzLCBpLCBpZW4sIHRyOwoJCgkJLy8gR2V0CgkJaWYgKCB2aXMgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIGNvbC5iVmlzaWJsZTsKCQl9CgkKCQkvLyBTZXQKCQkvLyBObyBjaGFuZ2UKCQlpZiAoIGNvbC5iVmlzaWJsZSA9PT0gdmlzICkgewoJCQlyZXR1cm47CgkJfQoJCgkJaWYgKCB2aXMgKSB7CgkJCS8vIEluc2VydCBjb2x1bW4KCQkJLy8gTmVlZCB0byBkZWNpZGUgaWYgd2Ugc2hvdWxkIHVzZSBhcHBlbmRDaGlsZCBvciBpbnNlcnRCZWZvcmUKCQkJdmFyIGluc2VydEJlZm9yZSA9ICQuaW5BcnJheSggdHJ1ZSwgX3BsdWNrKGNvbHMsICdiVmlzaWJsZScpLCBjb2x1bW4rMSApOwoJCgkJCWZvciAoIGk9MCwgaWVuPWRhdGEubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQl0ciA9IGRhdGFbaV0ublRyOwoJCQkJY2VsbHMgPSBkYXRhW2ldLmFuQ2VsbHM7CgkKCQkJCWlmICggdHIgKSB7CgkJCQkJLy8gaW5zZXJ0QmVmb3JlIGNhbiBhY3QgbGlrZSBhcHBlbmRDaGlsZCBpZiAybmQgYXJnIGlzIG51bGwKCQkJCQl0ci5pbnNlcnRCZWZvcmUoIGNlbGxzWyBjb2x1bW4gXSwgY2VsbHNbIGluc2VydEJlZm9yZSBdIHx8IG51bGwgKTsKCQkJCX0KCQkJfQoJCX0KCQllbHNlIHsKCQkJLy8gUmVtb3ZlIGNvbHVtbgoJCQkkKCBfcGx1Y2soIHNldHRpbmdzLmFvRGF0YSwgJ2FuQ2VsbHMnLCBjb2x1bW4gKSApLmRldGFjaCgpOwoJCX0KCQoJCS8vIENvbW1vbiBhY3Rpb25zCgkJY29sLmJWaXNpYmxlID0gdmlzOwoJCV9mbkRyYXdIZWFkKCBzZXR0aW5ncywgc2V0dGluZ3MuYW9IZWFkZXIgKTsKCQlfZm5EcmF3SGVhZCggc2V0dGluZ3MsIHNldHRpbmdzLmFvRm9vdGVyICk7CgkKCQkvLyBVcGRhdGUgY29sc3BhbiBmb3Igbm8gcmVjb3JkcyBkaXNwbGF5LiBDaGlsZCByb3dzIGFuZCBleHRlbnNpb25zIHdpbGwgdXNlIHRoZWlyIG93bgoJCS8vIGxpc3RlbmVycyB0byBkbyB0aGlzIC0gb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgZW1wdHkgdGFibGUgaXRlbSBoZXJlCgkJaWYgKCAhIHNldHRpbmdzLmFpRGlzcGxheS5sZW5ndGggKSB7CgkJCSQoc2V0dGluZ3MublRCb2R5KS5maW5kKCd0ZFtjb2xzcGFuXScpLmF0dHIoJ2NvbHNwYW4nLCBfZm5WaXNibGVDb2x1bW5zKHNldHRpbmdzKSk7CgkJfQoJCgkJX2ZuU2F2ZVN0YXRlKCBzZXR0aW5ncyApOwoJfTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnY29sdW1ucygpJywgZnVuY3Rpb24gKCBzZWxlY3Rvciwgb3B0cyApIHsKCQkvLyBhcmd1bWVudCBzaGlmdGluZwoJCWlmICggc2VsZWN0b3IgPT09IHVuZGVmaW5lZCApIHsKCQkJc2VsZWN0b3IgPSAnJzsKCQl9CgkJZWxzZSBpZiAoICQuaXNQbGFpbk9iamVjdCggc2VsZWN0b3IgKSApIHsKCQkJb3B0cyA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9ICcnOwoJCX0KCQoJCW9wdHMgPSBfc2VsZWN0b3Jfb3B0cyggb3B0cyApOwoJCgkJdmFyIGluc3QgPSB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlyZXR1cm4gX19jb2x1bW5fc2VsZWN0b3IoIHNldHRpbmdzLCBzZWxlY3Rvciwgb3B0cyApOwoJCX0sIDEgKTsKCQoJCS8vIFdhbnQgYXJndW1lbnQgc2hpZnRpbmcgaGVyZSBhbmQgaW4gX3Jvd19zZWxlY3Rvcj8KCQlpbnN0LnNlbGVjdG9yLmNvbHMgPSBzZWxlY3RvcjsKCQlpbnN0LnNlbGVjdG9yLm9wdHMgPSBvcHRzOwoJCgkJcmV0dXJuIGluc3Q7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdjb2x1bW5zKCkuaGVhZGVyKCknLCAnY29sdW1uKCkuaGVhZGVyKCknLCBmdW5jdGlvbiAoIHNlbGVjdG9yLCBvcHRzICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY29sdW1uJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgY29sdW1uICkgewoJCQlyZXR1cm4gc2V0dGluZ3MuYW9Db2x1bW5zW2NvbHVtbl0ublRoOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ2NvbHVtbnMoKS5mb290ZXIoKScsICdjb2x1bW4oKS5mb290ZXIoKScsIGZ1bmN0aW9uICggc2VsZWN0b3IsIG9wdHMgKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4nLCBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4gKSB7CgkJCXJldHVybiBzZXR0aW5ncy5hb0NvbHVtbnNbY29sdW1uXS5uVGY7CgkJfSwgMSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY29sdW1ucygpLmRhdGEoKScsICdjb2x1bW4oKS5kYXRhKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4tcm93cycsIF9fY29sdW1uRGF0YSwgMSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY29sdW1ucygpLmRhdGFTcmMoKScsICdjb2x1bW4oKS5kYXRhU3JjKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4nLCBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4gKSB7CgkJCXJldHVybiBzZXR0aW5ncy5hb0NvbHVtbnNbY29sdW1uXS5tRGF0YTsKCQl9LCAxICk7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdjb2x1bW5zKCkuY2FjaGUoKScsICdjb2x1bW4oKS5jYWNoZSgpJywgZnVuY3Rpb24gKCB0eXBlICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY29sdW1uLXJvd3MnLCBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4sIGksIGosIHJvd3MgKSB7CgkJCXJldHVybiBfcGx1Y2tfb3JkZXIoIHNldHRpbmdzLmFvRGF0YSwgcm93cywKCQkJCXR5cGUgPT09ICdzZWFyY2gnID8gJ19hRmlsdGVyRGF0YScgOiAnX2FTb3J0RGF0YScsIGNvbHVtbgoJCQkpOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ2NvbHVtbnMoKS5ub2RlcygpJywgJ2NvbHVtbigpLm5vZGVzKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4tcm93cycsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGNvbHVtbiwgaSwgaiwgcm93cyApIHsKCQkJcmV0dXJuIF9wbHVja19vcmRlciggc2V0dGluZ3MuYW9EYXRhLCByb3dzLCAnYW5DZWxscycsIGNvbHVtbiApIDsKCQl9LCAxICk7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdjb2x1bW5zKCkudmlzaWJsZSgpJywgJ2NvbHVtbigpLnZpc2libGUoKScsIGZ1bmN0aW9uICggdmlzLCBjYWxjICkgewoJCXZhciByZXQgPSB0aGlzLml0ZXJhdG9yKCAnY29sdW1uJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgY29sdW1uICkgewoJCQlpZiAoIHZpcyA9PT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIHNldHRpbmdzLmFvQ29sdW1uc1sgY29sdW1uIF0uYlZpc2libGU7CgkJCX0gLy8gZWxzZQoJCQlfX3NldENvbHVtblZpcyggc2V0dGluZ3MsIGNvbHVtbiwgdmlzICk7CgkJfSApOwoJCgkJLy8gR3JvdXAgdGhlIGNvbHVtbiB2aXNpYmlsaXR5IGNoYW5nZXMKCQlpZiAoIHZpcyAhPT0gdW5kZWZpbmVkICkgewoJCQkvLyBTZWNvbmQgbG9vcCBvbmNlIHRoZSBmaXJzdCBpcyBkb25lIGZvciBldmVudHMKCQkJdGhpcy5pdGVyYXRvciggJ2NvbHVtbicsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGNvbHVtbiApIHsKCQkJCV9mbkNhbGxiYWNrRmlyZSggc2V0dGluZ3MsIG51bGwsICdjb2x1bW4tdmlzaWJpbGl0eScsIFtzZXR0aW5ncywgY29sdW1uLCB2aXMsIGNhbGNdICk7CgkJCX0gKTsKCQoJCQlpZiAoIGNhbGMgPT09IHVuZGVmaW5lZCB8fCBjYWxjICkgewoJCQkJdGhpcy5jb2x1bW5zLmFkanVzdCgpOwoJCQl9CgkJfQoJCgkJcmV0dXJuIHJldDsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ2NvbHVtbnMoKS5pbmRleGVzKCknLCAnY29sdW1uKCkuaW5kZXgoKScsIGZ1bmN0aW9uICggdHlwZSApIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ2NvbHVtbicsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGNvbHVtbiApIHsKCQkJcmV0dXJuIHR5cGUgPT09ICd2aXNpYmxlJyA/CgkJCQlfZm5Db2x1bW5JbmRleFRvVmlzaWJsZSggc2V0dGluZ3MsIGNvbHVtbiApIDoKCQkJCWNvbHVtbjsKCQl9LCAxICk7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXIoICdjb2x1bW5zLmFkanVzdCgpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlfZm5BZGp1c3RDb2x1bW5TaXppbmcoIHNldHRpbmdzICk7CgkJfSwgMSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyKCAnY29sdW1uLmluZGV4KCknLCBmdW5jdGlvbiAoIHR5cGUsIGlkeCApIHsKCQlpZiAoIHRoaXMuY29udGV4dC5sZW5ndGggIT09IDAgKSB7CgkJCXZhciBjdHggPSB0aGlzLmNvbnRleHRbMF07CgkKCQkJaWYgKCB0eXBlID09PSAnZnJvbVZpc2libGUnIHx8IHR5cGUgPT09ICd0b0RhdGEnICkgewoJCQkJcmV0dXJuIF9mblZpc2libGVUb0NvbHVtbkluZGV4KCBjdHgsIGlkeCApOwoJCQl9CgkJCWVsc2UgaWYgKCB0eXBlID09PSAnZnJvbURhdGEnIHx8IHR5cGUgPT09ICd0b1Zpc2libGUnICkgewoJCQkJcmV0dXJuIF9mbkNvbHVtbkluZGV4VG9WaXNpYmxlKCBjdHgsIGlkeCApOwoJCQl9CgkJfQoJfSApOwoJCglfYXBpX3JlZ2lzdGVyKCAnY29sdW1uKCknLCBmdW5jdGlvbiAoIHNlbGVjdG9yLCBvcHRzICkgewoJCXJldHVybiBfc2VsZWN0b3JfZmlyc3QoIHRoaXMuY29sdW1ucyggc2VsZWN0b3IsIG9wdHMgKSApOwoJfSApOwoJCgkKCQoJdmFyIF9fY2VsbF9zZWxlY3RvciA9IGZ1bmN0aW9uICggc2V0dGluZ3MsIHNlbGVjdG9yLCBvcHRzICkKCXsKCQl2YXIgZGF0YSA9IHNldHRpbmdzLmFvRGF0YTsKCQl2YXIgcm93cyA9IF9zZWxlY3Rvcl9yb3dfaW5kZXhlcyggc2V0dGluZ3MsIG9wdHMgKTsKCQl2YXIgY2VsbHMgPSBfcmVtb3ZlRW1wdHkoIF9wbHVja19vcmRlciggZGF0YSwgcm93cywgJ2FuQ2VsbHMnICkgKTsKCQl2YXIgYWxsQ2VsbHMgPSAkKCBbXS5jb25jYXQuYXBwbHkoW10sIGNlbGxzKSApOwoJCXZhciByb3c7CgkJdmFyIGNvbHVtbnMgPSBzZXR0aW5ncy5hb0NvbHVtbnMubGVuZ3RoOwoJCXZhciBhLCBpLCBpZW4sIGosIG8sIGhvc3Q7CgkKCQl2YXIgcnVuID0gZnVuY3Rpb24gKCBzICkgewoJCQl2YXIgZm5TZWxlY3RvciA9IHR5cGVvZiBzID09PSAnZnVuY3Rpb24nOwoJCgkJCWlmICggcyA9PT0gbnVsbCB8fCBzID09PSB1bmRlZmluZWQgfHwgZm5TZWxlY3RvciApIHsKCQkJCS8vIEFsbCBjZWxscyBhbmQgZnVuY3Rpb24gc2VsZWN0b3JzCgkJCQlhID0gW107CgkKCQkJCWZvciAoIGk9MCwgaWVuPXJvd3MubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQkJcm93ID0gcm93c1tpXTsKCQoJCQkJCWZvciAoIGo9MCA7IGo8Y29sdW1ucyA7IGorKyApIHsKCQkJCQkJbyA9IHsKCQkJCQkJCXJvdzogcm93LAoJCQkJCQkJY29sdW1uOiBqCgkJCQkJCX07CgkKCQkJCQkJaWYgKCBmblNlbGVjdG9yICkgewoJCQkJCQkJLy8gU2VsZWN0b3IgLSBmdW5jdGlvbgoJCQkJCQkJaG9zdCA9IGRhdGFbIHJvdyBdOwoJCgkJCQkJCQlpZiAoIHMoIG8sIF9mbkdldENlbGxEYXRhKHNldHRpbmdzLCByb3csIGopLCBob3N0LmFuQ2VsbHMgPyBob3N0LmFuQ2VsbHNbal0gOiBudWxsICkgKSB7CgkJCQkJCQkJYS5wdXNoKCBvICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZSB7CgkJCQkJCQkvLyBTZWxlY3RvciAtIGFsbAoJCQkJCQkJYS5wdXNoKCBvICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkKCQkJCXJldHVybiBhOwoJCQl9CgkJCQoJCQkvLyBTZWxlY3RvciAtIGluZGV4CgkJCWlmICggJC5pc1BsYWluT2JqZWN0KCBzICkgKSB7CgkJCQkvLyBWYWxpZCBjZWxsIGluZGV4IGFuZCBpdHMgaW4gdGhlIGFycmF5IG9mIHNlbGVjdGFibGUgcm93cwoJCQkJcmV0dXJuIHMuY29sdW1uICE9PSB1bmRlZmluZWQgJiYgcy5yb3cgIT09IHVuZGVmaW5lZCAmJiAkLmluQXJyYXkoIHMucm93LCByb3dzICkgIT09IC0xID8KCQkJCQlbc10gOgoJCQkJCVtdOwoJCQl9CgkKCQkJLy8gU2VsZWN0b3IgLSBqUXVlcnkgZmlsdGVyZWQgY2VsbHMKCQkJdmFyIGpxUmVzdWx0ID0gYWxsQ2VsbHMKCQkJCS5maWx0ZXIoIHMgKQoJCQkJLm1hcCggZnVuY3Rpb24gKGksIGVsKSB7CgkJCQkJcmV0dXJuIHsgLy8gdXNlIGEgbmV3IG9iamVjdCwgaW4gY2FzZSBzb21lb25lIGNoYW5nZXMgdGhlIHZhbHVlcwoJCQkJCQlyb3c6ICAgIGVsLl9EVF9DZWxsSW5kZXgucm93LAoJCQkJCQljb2x1bW46IGVsLl9EVF9DZWxsSW5kZXguY29sdW1uCgkgCQkJCX07CgkJCQl9ICkKCQkJCS50b0FycmF5KCk7CgkKCQkJaWYgKCBqcVJlc3VsdC5sZW5ndGggfHwgISBzLm5vZGVOYW1lICkgewoJCQkJcmV0dXJuIGpxUmVzdWx0OwoJCQl9CgkKCQkJLy8gT3RoZXJ3aXNlIHRoZSBzZWxlY3RvciBpcyBhIG5vZGUsIGFuZCB0aGVyZSBpcyBvbmUgbGFzdCBvcHRpb24gLSB0aGUKCQkJLy8gZWxlbWVudCBtaWdodCBiZSBhIGNoaWxkIG9mIGFuIGVsZW1lbnQgd2hpY2ggaGFzIGR0LXJvdyBhbmQgZHQtY29sdW1uCgkJCS8vIGRhdGEgYXR0cmlidXRlcwoJCQlob3N0ID0gJChzKS5jbG9zZXN0KCcqW2RhdGEtZHQtcm93XScpOwoJCQlyZXR1cm4gaG9zdC5sZW5ndGggPwoJCQkJWyB7CgkJCQkJcm93OiBob3N0LmRhdGEoJ2R0LXJvdycpLAoJCQkJCWNvbHVtbjogaG9zdC5kYXRhKCdkdC1jb2x1bW4nKQoJCQkJfSBdIDoKCQkJCVtdOwoJCX07CgkKCQlyZXR1cm4gX3NlbGVjdG9yX3J1biggJ2NlbGwnLCBzZWxlY3RvciwgcnVuLCBzZXR0aW5ncywgb3B0cyApOwoJfTsKCQoJCgkKCQoJX2FwaV9yZWdpc3RlciggJ2NlbGxzKCknLCBmdW5jdGlvbiAoIHJvd1NlbGVjdG9yLCBjb2x1bW5TZWxlY3Rvciwgb3B0cyApIHsKCQkvLyBBcmd1bWVudCBzaGlmdGluZwoJCWlmICggJC5pc1BsYWluT2JqZWN0KCByb3dTZWxlY3RvciApICkgewoJCQkvLyBJbmRleGVzCgkJCWlmICggcm93U2VsZWN0b3Iucm93ID09PSB1bmRlZmluZWQgKSB7CgkJCQkvLyBTZWxlY3RvciBvcHRpb25zIGluIGZpcnN0IHBhcmFtZXRlcgoJCQkJb3B0cyA9IHJvd1NlbGVjdG9yOwoJCQkJcm93U2VsZWN0b3IgPSBudWxsOwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gQ2VsbCBpbmRleCBvYmplY3RzIGluIGZpcnN0IHBhcmFtZXRlcgoJCQkJb3B0cyA9IGNvbHVtblNlbGVjdG9yOwoJCQkJY29sdW1uU2VsZWN0b3IgPSBudWxsOwoJCQl9CgkJfQoJCWlmICggJC5pc1BsYWluT2JqZWN0KCBjb2x1bW5TZWxlY3RvciApICkgewoJCQlvcHRzID0gY29sdW1uU2VsZWN0b3I7CgkJCWNvbHVtblNlbGVjdG9yID0gbnVsbDsKCQl9CgkKCQkvLyBDZWxsIHNlbGVjdG9yCgkJaWYgKCBjb2x1bW5TZWxlY3RvciA9PT0gbnVsbCB8fCBjb2x1bW5TZWxlY3RvciA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJCXJldHVybiBfX2NlbGxfc2VsZWN0b3IoIHNldHRpbmdzLCByb3dTZWxlY3RvciwgX3NlbGVjdG9yX29wdHMoIG9wdHMgKSApOwoJCQl9ICk7CgkJfQoJCgkJLy8gUm93ICsgY29sdW1uIHNlbGVjdG9yCgkJdmFyIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMoIGNvbHVtblNlbGVjdG9yICk7CgkJdmFyIHJvd3MgPSB0aGlzLnJvd3MoIHJvd1NlbGVjdG9yICk7CgkJdmFyIGEsIGksIGllbiwgaiwgamVuOwoJCgkJdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgaWR4ICkgewoJCQlhID0gW107CgkKCQkJZm9yICggaT0wLCBpZW49cm93c1tpZHhdLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJZm9yICggaj0wLCBqZW49Y29sdW1uc1tpZHhdLmxlbmd0aCA7IGo8amVuIDsgaisrICkgewoJCQkJCWEucHVzaCggewoJCQkJCQlyb3c6ICAgIHJvd3NbaWR4XVtpXSwKCQkJCQkJY29sdW1uOiBjb2x1bW5zW2lkeF1bal0KCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQl9LCAxICk7CgkKCSAgICAvLyBOb3cgcGFzcyB0aHJvdWdoIHRoZSBjZWxsIHNlbGVjdG9yIGZvciBvcHRpb25zCgkgICAgdmFyIGNlbGxzID0gdGhpcy5jZWxscyggYSwgb3B0cyApOwoJCgkJJC5leHRlbmQoIGNlbGxzLnNlbGVjdG9yLCB7CgkJCWNvbHM6IGNvbHVtblNlbGVjdG9yLAoJCQlyb3dzOiByb3dTZWxlY3RvciwKCQkJb3B0czogb3B0cwoJCX0gKTsKCQoJCXJldHVybiBjZWxsczsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY2VsbHMoKS5ub2RlcygpJywgJ2NlbGwoKS5ub2RlKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjZWxsJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93LCBjb2x1bW4gKSB7CgkJCXZhciBkYXRhID0gc2V0dGluZ3MuYW9EYXRhWyByb3cgXTsKCQoJCQlyZXR1cm4gZGF0YSAmJiBkYXRhLmFuQ2VsbHMgPwoJCQkJZGF0YS5hbkNlbGxzWyBjb2x1bW4gXSA6CgkJCQl1bmRlZmluZWQ7CgkJfSwgMSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXIoICdjZWxscygpLmRhdGEoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ2NlbGwnLCBmdW5jdGlvbiAoIHNldHRpbmdzLCByb3csIGNvbHVtbiApIHsKCQkJcmV0dXJuIF9mbkdldENlbGxEYXRhKCBzZXR0aW5ncywgcm93LCBjb2x1bW4gKTsKCQl9LCAxICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ2NlbGxzKCkuY2FjaGUoKScsICdjZWxsKCkuY2FjaGUoKScsIGZ1bmN0aW9uICggdHlwZSApIHsKCQl0eXBlID0gdHlwZSA9PT0gJ3NlYXJjaCcgPyAnX2FGaWx0ZXJEYXRhJyA6ICdfYVNvcnREYXRhJzsKCQoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY2VsbCcsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdywgY29sdW1uICkgewoJCQlyZXR1cm4gc2V0dGluZ3MuYW9EYXRhWyByb3cgXVsgdHlwZSBdWyBjb2x1bW4gXTsKCQl9LCAxICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ2NlbGxzKCkucmVuZGVyKCknLCAnY2VsbCgpLnJlbmRlcigpJywgZnVuY3Rpb24gKCB0eXBlICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY2VsbCcsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdywgY29sdW1uICkgewoJCQlyZXR1cm4gX2ZuR2V0Q2VsbERhdGEoIHNldHRpbmdzLCByb3csIGNvbHVtbiwgdHlwZSApOwoJCX0sIDEgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY2VsbHMoKS5pbmRleGVzKCknLCAnY2VsbCgpLmluZGV4KCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjZWxsJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93LCBjb2x1bW4gKSB7CgkJCXJldHVybiB7CgkJCQlyb3c6IHJvdywKCQkJCWNvbHVtbjogY29sdW1uLAoJCQkJY29sdW1uVmlzaWJsZTogX2ZuQ29sdW1uSW5kZXhUb1Zpc2libGUoIHNldHRpbmdzLCBjb2x1bW4gKQoJCQl9OwoJCX0sIDEgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY2VsbHMoKS5pbnZhbGlkYXRlKCknLCAnY2VsbCgpLmludmFsaWRhdGUoKScsIGZ1bmN0aW9uICggc3JjICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY2VsbCcsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdywgY29sdW1uICkgewoJCQlfZm5JbnZhbGlkYXRlKCBzZXR0aW5ncywgcm93LCBzcmMsIGNvbHVtbiApOwoJCX0gKTsKCX0gKTsKCQoJCgkKCV9hcGlfcmVnaXN0ZXIoICdjZWxsKCknLCBmdW5jdGlvbiAoIHJvd1NlbGVjdG9yLCBjb2x1bW5TZWxlY3Rvciwgb3B0cyApIHsKCQlyZXR1cm4gX3NlbGVjdG9yX2ZpcnN0KCB0aGlzLmNlbGxzKCByb3dTZWxlY3RvciwgY29sdW1uU2VsZWN0b3IsIG9wdHMgKSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXIoICdjZWxsKCkuZGF0YSgpJywgZnVuY3Rpb24gKCBkYXRhICkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkJdmFyIGNlbGwgPSB0aGlzWzBdOwoJCgkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7CgkJCS8vIEdldAoJCQlyZXR1cm4gY3R4Lmxlbmd0aCAmJiBjZWxsLmxlbmd0aCA/CgkJCQlfZm5HZXRDZWxsRGF0YSggY3R4WzBdLCBjZWxsWzBdLnJvdywgY2VsbFswXS5jb2x1bW4gKSA6CgkJCQl1bmRlZmluZWQ7CgkJfQoJCgkJLy8gU2V0CgkJX2ZuU2V0Q2VsbERhdGEoIGN0eFswXSwgY2VsbFswXS5yb3csIGNlbGxbMF0uY29sdW1uLCBkYXRhICk7CgkJX2ZuSW52YWxpZGF0ZSggY3R4WzBdLCBjZWxsWzBdLnJvdywgJ2RhdGEnLCBjZWxsWzBdLmNvbHVtbiApOwoJCgkJcmV0dXJuIHRoaXM7Cgl9ICk7CgkKCQoJCgkvKioKCSAqIEdldCBjdXJyZW50IG9yZGVyaW5nIChzb3J0aW5nKSB0aGF0IGhhcyBiZWVuIGFwcGxpZWQgdG8gdGhlIHRhYmxlLgoJICoKCSAqIEByZXR1cm5zIHthcnJheX0gMkQgYXJyYXkgY29udGFpbmluZyB0aGUgc29ydGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpcnN0CgkgKiAgIHRhYmxlIGluIHRoZSBjdXJyZW50IGNvbnRleHQuIEVhY2ggZWxlbWVudCBpbiB0aGUgcGFyZW50IGFycmF5IHJlcHJlc2VudHMKCSAqICAgYSBjb2x1bW4gYmVpbmcgc29ydGVkIHVwb24gKGkuZS4gbXVsdGktc29ydGluZyB3aXRoIHR3byBjb2x1bW5zIHdvdWxkIGhhdmUKCSAqICAgMiBpbm5lciBhcnJheXMpLiBUaGUgaW5uZXIgYXJyYXlzIG1heSBoYXZlIDIgb3IgMyBlbGVtZW50cy4gVGhlIGZpcnN0IGlzCgkgKiAgIHRoZSBjb2x1bW4gaW5kZXggdGhhdCB0aGUgc29ydGluZyBjb25kaXRpb24gYXBwbGllcyB0bywgdGhlIHNlY29uZCBpcyB0aGUKCSAqICAgZGlyZWN0aW9uIG9mIHRoZSBzb3J0IChgZGVzY2Agb3IgYGFzY2ApIGFuZCwgb3B0aW9uYWxseSwgdGhlIHRoaXJkIGlzIHRoZQoJICogICBpbmRleCBvZiB0aGUgc29ydGluZyBvcmRlciBmcm9tIHRoZSBgY29sdW1uLnNvcnRpbmdgIGluaXRpYWxpc2F0aW9uIGFycmF5LgoJICovLyoqCgkgKiBTZXQgdGhlIG9yZGVyaW5nIGZvciB0aGUgdGFibGUuCgkgKgoJICogQHBhcmFtIHtpbnRlZ2VyfSBvcmRlciBDb2x1bW4gaW5kZXggdG8gc29ydCB1cG9uLgoJICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdGlvbiBEaXJlY3Rpb24gb2YgdGhlIHNvcnQgdG8gYmUgYXBwbGllZCAoYGFzY2Agb3IgYGRlc2NgKQoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8vKioKCSAqIFNldCB0aGUgb3JkZXJpbmcgZm9yIHRoZSB0YWJsZS4KCSAqCgkgKiBAcGFyYW0ge2FycmF5fSBvcmRlciAxRCBhcnJheSBvZiBzb3J0aW5nIGluZm9ybWF0aW9uIHRvIGJlIGFwcGxpZWQuCgkgKiBAcGFyYW0ge2FycmF5fSBbLi4uXSBPcHRpb25hbCBhZGRpdGlvbmFsIHNvcnRpbmcgY29uZGl0aW9ucwoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8vKioKCSAqIFNldCB0aGUgb3JkZXJpbmcgZm9yIHRoZSB0YWJsZS4KCSAqCgkgKiBAcGFyYW0ge2FycmF5fSBvcmRlciAyRCBhcnJheSBvZiBzb3J0aW5nIGluZm9ybWF0aW9uIHRvIGJlIGFwcGxpZWQuCgkgKiBAcmV0dXJucyB7RGF0YVRhYmxlcy5BcGl9IHRoaXMKCSAqLwoJX2FwaV9yZWdpc3RlciggJ29yZGVyKCknLCBmdW5jdGlvbiAoIG9yZGVyLCBkaXIgKSB7CgkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQoJCWlmICggb3JkZXIgPT09IHVuZGVmaW5lZCApIHsKCQkJLy8gZ2V0CgkJCXJldHVybiBjdHgubGVuZ3RoICE9PSAwID8KCQkJCWN0eFswXS5hYVNvcnRpbmcgOgoJCQkJdW5kZWZpbmVkOwoJCX0KCQoJCS8vIHNldAoJCWlmICggdHlwZW9mIG9yZGVyID09PSAnbnVtYmVyJyApIHsKCQkJLy8gU2ltcGxlIGNvbHVtbiAvIGRpcmVjdGlvbiBwYXNzZWQgaW4KCQkJb3JkZXIgPSBbIFsgb3JkZXIsIGRpciBdIF07CgkJfQoJCWVsc2UgaWYgKCBvcmRlci5sZW5ndGggJiYgISAkLmlzQXJyYXkoIG9yZGVyWzBdICkgKSB7CgkJCS8vIEFyZ3VtZW50cyBwYXNzZWQgaW4gKGxpc3Qgb2YgMUQgYXJyYXlzKQoJCQlvcmRlciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKTsKCQl9CgkJLy8gb3RoZXJ3aXNlIGEgMkQgYXJyYXkgd2FzIHBhc3NlZCBpbgoJCgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MgKSB7CgkJCXNldHRpbmdzLmFhU29ydGluZyA9IG9yZGVyLnNsaWNlKCk7CgkJfSApOwoJfSApOwoJCgkKCS8qKgoJICogQXR0YWNoIGEgc29ydCBsaXN0ZW5lciB0byBhbiBlbGVtZW50IGZvciBhIGdpdmVuIGNvbHVtbgoJICoKCSAqIEBwYXJhbSB7bm9kZXxqUXVlcnl8c3RyaW5nfSBub2RlIElkZW50aWZpZXIgZm9yIHRoZSBlbGVtZW50KHMpIHRvIGF0dGFjaCB0aGUKCSAqICAgbGlzdGVuZXIgdG8uIFRoaXMgY2FuIHRha2UgdGhlIGZvcm0gb2YgYSBzaW5nbGUgRE9NIG5vZGUsIGEgalF1ZXJ5CgkgKiAgIGNvbGxlY3Rpb24gb2Ygbm9kZXMgb3IgYSBqUXVlcnkgc2VsZWN0b3Igd2hpY2ggd2lsbCBpZGVudGlmeSB0aGUgbm9kZShzKS4KCSAqIEBwYXJhbSB7aW50ZWdlcn0gY29sdW1uIHRoZSBjb2x1bW4gdGhhdCBhIGNsaWNrIG9uIHRoaXMgbm9kZSB3aWxsIHNvcnQgb24KCSAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiBzb3J0IGlzIHJ1bgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdvcmRlci5saXN0ZW5lcigpJywgZnVuY3Rpb24gKCBub2RlLCBjb2x1bW4sIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlfZm5Tb3J0QXR0YWNoTGlzdGVuZXIoIHNldHRpbmdzLCBub2RlLCBjb2x1bW4sIGNhbGxiYWNrICk7CgkJfSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXIoICdvcmRlci5maXhlZCgpJywgZnVuY3Rpb24gKCBzZXQgKSB7CgkJaWYgKCAhIHNldCApIHsKCQkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQkJdmFyIGZpeGVkID0gY3R4Lmxlbmd0aCA/CgkJCQljdHhbMF0uYWFTb3J0aW5nRml4ZWQgOgoJCQkJdW5kZWZpbmVkOwoJCgkJCXJldHVybiAkLmlzQXJyYXkoIGZpeGVkICkgPwoJCQkJeyBwcmU6IGZpeGVkIH0gOgoJCQkJZml4ZWQ7CgkJfQoJCgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MgKSB7CgkJCXNldHRpbmdzLmFhU29ydGluZ0ZpeGVkID0gJC5leHRlbmQoIHRydWUsIHt9LCBzZXQgKTsKCQl9ICk7Cgl9ICk7CgkKCQoJLy8gT3JkZXIgYnkgdGhlIHNlbGVjdGVkIGNvbHVtbihzKQoJX2FwaV9yZWdpc3RlciggWwoJCSdjb2x1bW5zKCkub3JkZXIoKScsCgkJJ2NvbHVtbigpLm9yZGVyKCknCgldLCBmdW5jdGlvbiAoIGRpciApIHsKCQl2YXIgdGhhdCA9IHRoaXM7CgkKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgaSApIHsKCQkJdmFyIHNvcnQgPSBbXTsKCQoJCQkkLmVhY2goIHRoYXRbaV0sIGZ1bmN0aW9uIChqLCBjb2wpIHsKCQkJCXNvcnQucHVzaCggWyBjb2wsIGRpciBdICk7CgkJCX0gKTsKCQoJCQlzZXR0aW5ncy5hYVNvcnRpbmcgPSBzb3J0OwoJCX0gKTsKCX0gKTsKCQoJCgkKCV9hcGlfcmVnaXN0ZXIoICdzZWFyY2goKScsIGZ1bmN0aW9uICggaW5wdXQsIHJlZ2V4LCBzbWFydCwgY2FzZUluc2VuICkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlpZiAoIGlucHV0ID09PSB1bmRlZmluZWQgKSB7CgkJCS8vIGdldAoJCQlyZXR1cm4gY3R4Lmxlbmd0aCAhPT0gMCA/CgkJCQljdHhbMF0ub1ByZXZpb3VzU2VhcmNoLnNTZWFyY2ggOgoJCQkJdW5kZWZpbmVkOwoJCX0KCQoJCS8vIHNldAoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlpZiAoICEgc2V0dGluZ3Mub0ZlYXR1cmVzLmJGaWx0ZXIgKSB7CgkJCQlyZXR1cm47CgkJCX0KCQoJCQlfZm5GaWx0ZXJDb21wbGV0ZSggc2V0dGluZ3MsICQuZXh0ZW5kKCB7fSwgc2V0dGluZ3Mub1ByZXZpb3VzU2VhcmNoLCB7CgkJCQkic1NlYXJjaCI6IGlucHV0KyIiLAoJCQkJImJSZWdleCI6ICByZWdleCA9PT0gbnVsbCA/IGZhbHNlIDogcmVnZXgsCgkJCQkiYlNtYXJ0IjogIHNtYXJ0ID09PSBudWxsID8gdHJ1ZSAgOiBzbWFydCwKCQkJCSJiQ2FzZUluc2Vuc2l0aXZlIjogY2FzZUluc2VuID09PSBudWxsID8gdHJ1ZSA6IGNhc2VJbnNlbgoJCQl9ICksIDEgKTsKCQl9ICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCgKCQknY29sdW1ucygpLnNlYXJjaCgpJywKCQknY29sdW1uKCkuc2VhcmNoKCknLAoJCWZ1bmN0aW9uICggaW5wdXQsIHJlZ2V4LCBzbWFydCwgY2FzZUluc2VuICkgewoJCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ2NvbHVtbicsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGNvbHVtbiApIHsKCQkJCXZhciBwcmVTZWFyY2ggPSBzZXR0aW5ncy5hb1ByZVNlYXJjaENvbHM7CgkKCQkJCWlmICggaW5wdXQgPT09IHVuZGVmaW5lZCApIHsKCQkJCQkvLyBnZXQKCQkJCQlyZXR1cm4gcHJlU2VhcmNoWyBjb2x1bW4gXS5zU2VhcmNoOwoJCQkJfQoJCgkJCQkvLyBzZXQKCQkJCWlmICggISBzZXR0aW5ncy5vRmVhdHVyZXMuYkZpbHRlciApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkKCQkJCSQuZXh0ZW5kKCBwcmVTZWFyY2hbIGNvbHVtbiBdLCB7CgkJCQkJInNTZWFyY2giOiBpbnB1dCsiIiwKCQkJCQkiYlJlZ2V4IjogIHJlZ2V4ID09PSBudWxsID8gZmFsc2UgOiByZWdleCwKCQkJCQkiYlNtYXJ0IjogIHNtYXJ0ID09PSBudWxsID8gdHJ1ZSAgOiBzbWFydCwKCQkJCQkiYkNhc2VJbnNlbnNpdGl2ZSI6IGNhc2VJbnNlbiA9PT0gbnVsbCA/IHRydWUgOiBjYXNlSW5zZW4KCQkJCX0gKTsKCQoJCQkJX2ZuRmlsdGVyQ29tcGxldGUoIHNldHRpbmdzLCBzZXR0aW5ncy5vUHJldmlvdXNTZWFyY2gsIDEgKTsKCQkJfSApOwoJCX0KCSk7CgkKCS8qCgkgKiBTdGF0ZSBBUEkgbWV0aG9kcwoJICovCgkKCV9hcGlfcmVnaXN0ZXIoICdzdGF0ZSgpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLmNvbnRleHQubGVuZ3RoID8KCQkJdGhpcy5jb250ZXh0WzBdLm9TYXZlZFN0YXRlIDoKCQkJbnVsbDsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnc3RhdGUuY2xlYXIoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJLy8gU2F2ZSBhbiBlbXB0eSBvYmplY3QKCQkJc2V0dGluZ3MuZm5TdGF0ZVNhdmVDYWxsYmFjay5jYWxsKCBzZXR0aW5ncy5vSW5zdGFuY2UsIHNldHRpbmdzLCB7fSApOwoJCX0gKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnc3RhdGUubG9hZGVkKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuY29udGV4dC5sZW5ndGggPwoJCQl0aGlzLmNvbnRleHRbMF0ub0xvYWRlZFN0YXRlIDoKCQkJbnVsbDsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnc3RhdGUuc2F2ZSgpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlfZm5TYXZlU3RhdGUoIHNldHRpbmdzICk7CgkJfSApOwoJfSApOwoJCgkKCQoJLyoqCgkgKiBQcm92aWRlIGEgY29tbW9uIG1ldGhvZCBmb3IgcGx1Zy1pbnMgdG8gY2hlY2sgdGhlIHZlcnNpb24gb2YgRGF0YVRhYmxlcyBiZWluZwoJICogdXNlZCwgaW4gb3JkZXIgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkuCgkgKgoJICogIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIFZlcnNpb24gc3RyaW5nIHRvIGNoZWNrIGZvciwgaW4gdGhlIGZvcm1hdCAiWC5ZLloiLgoJICogICAgTm90ZSB0aGF0IHRoZSBmb3JtYXRzICJYIiBhbg=="
3NAxHUEaM6RAG7rVDPL9L6DFZWkrqFtY98t: jquery.dataTables.js?4?2?2: "base64:YWxzZSwgY2FsbGJhY2sgKTsKCQl9ICk7Cgl9ICk7CgkKCQoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnQgQWpheCBVUkwuIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgdGhlIFVSTCBmcm9tIHRoZSBmaXJzdAoJICogdGFibGUgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4KCSAqCgkgKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgQWpheCBzb3VyY2UgVVJMCgkgKi8vKioKCSAqIFNldCB0aGUgQWpheCBVUkwuIE5vdGUgdGhhdCB0aGlzIHdpbGwgc2V0IHRoZSBVUkwgZm9yIGFsbCB0YWJsZXMgaW4gdGhlCgkgKiBjdXJyZW50IGNvbnRleHQuCgkgKgoJICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgdG8gc2V0LgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdhamF4LnVybCgpJywgZnVuY3Rpb24gKCB1cmwgKSB7CgkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQoJCWlmICggdXJsID09PSB1bmRlZmluZWQgKSB7CgkJCS8vIGdldAoJCQlpZiAoIGN0eC5sZW5ndGggPT09IDAgKSB7CgkJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCQl9CgkJCWN0eCA9IGN0eFswXTsKCQoJCQlyZXR1cm4gY3R4LmFqYXggPwoJCQkJJC5pc1BsYWluT2JqZWN0KCBjdHguYWpheCApID8KCQkJCQljdHguYWpheC51cmwgOgoJCQkJCWN0eC5hamF4IDoKCQkJCWN0eC5zQWpheFNvdXJjZTsKCQl9CgkKCQkvLyBzZXQKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHNldHRpbmdzLmFqYXggKSApIHsKCQkJCXNldHRpbmdzLmFqYXgudXJsID0gdXJsOwoJCQl9CgkJCWVsc2UgewoJCQkJc2V0dGluZ3MuYWpheCA9IHVybDsKCQkJfQoJCQkvLyBObyBuZWVkIHRvIGNvbnNpZGVyIHNBamF4U291cmNlIGhlcmUgc2luY2UgRGF0YVRhYmxlcyBnaXZlcyBwcmlvcml0eQoJCQkvLyB0byBgYWpheGAgb3ZlciBgc0FqYXhTb3VyY2VgLiBTbyBzZXR0aW5nIGBhamF4YCBoZXJlLCByZW5kZXJzIGFueQoJCQkvLyB2YWx1ZSBvZiBgc0FqYXhTb3VyY2VgIHJlZHVuZGFudC4KCQl9ICk7Cgl9ICk7CgkKCQoJLyoqCgkgKiBMb2FkIGRhdGEgZnJvbSB0aGUgbmV3bHkgc2V0IEFqYXggVVJMLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgb25seQoJICogYXZhaWxhYmxlIHdoZW4gYGFqYXgudXJsKClgIGlzIHVzZWQgdG8gc2V0IGEgVVJMLiBBZGRpdGlvbmFsbHksIHRoaXMgbWV0aG9kCgkgKiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcgYGFqYXgucmVsb2FkKClgIGJ1dCBpcyBwcm92aWRlZCBmb3IKCSAqIGNvbnZlbmllbmNlIHdoZW4gc2V0dGluZyBhIG5ldyBVUkwuIExpa2UgYGFqYXgucmVsb2FkKClgIGl0IHdpbGwKCSAqIGF1dG9tYXRpY2FsbHkgcmVkcmF3IHRoZSB0YWJsZSBvbmNlIHRoZSByZW1vdGUgZGF0YSBoYXMgYmVlbiBsb2FkZWQuCgkgKgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdhamF4LnVybCgpLmxvYWQoKScsIGZ1bmN0aW9uICggY2FsbGJhY2ssIHJlc2V0UGFnaW5nICkgewoJCS8vIFNhbWUgYXMgYSByZWxvYWQsIGJ1dCBtYWtlcyBzZW5zZSB0byBwcmVzZW50IGl0IGZvciBlYXN5IGFjY2VzcyBhZnRlciBhCgkJLy8gdXJsIGNoYW5nZQoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIGN0eCApIHsKCQkJX19yZWxvYWQoIGN0eCwgcmVzZXRQYWdpbmc9PT1mYWxzZSwgY2FsbGJhY2sgKTsKCQl9ICk7Cgl9ICk7CgkKCQoJCgkKCXZhciBfc2VsZWN0b3JfcnVuID0gZnVuY3Rpb24gKCB0eXBlLCBzZWxlY3Rvciwgc2VsZWN0Rm4sIHNldHRpbmdzLCBvcHRzICkKCXsKCQl2YXIKCQkJb3V0ID0gW10sIHJlcywKCQkJYSwgaSwgaWVuLCBqLCBqZW4sCgkJCXNlbGVjdG9yVHlwZSA9IHR5cGVvZiBzZWxlY3RvcjsKCQoJCS8vIENhbid0IGp1c3QgY2hlY2sgZm9yIGlzQXJyYXkgaGVyZSwgYXMgYW4gQVBJIG9yIGpRdWVyeSBpbnN0YW5jZSBtaWdodCBiZQoJCS8vIGdpdmVuIHdpdGggdGhlaXIgYXJyYXkgbGlrZSBsb29rCgkJaWYgKCAhIHNlbGVjdG9yIHx8IHNlbGVjdG9yVHlwZSA9PT0gJ3N0cmluZycgfHwgc2VsZWN0b3JUeXBlID09PSAnZnVuY3Rpb24nIHx8IHNlbGVjdG9yLmxlbmd0aCA9PT0gdW5kZWZpbmVkICkgewoJCQlzZWxlY3RvciA9IFsgc2VsZWN0b3IgXTsKCQl9CgkKCQlmb3IgKCBpPTAsIGllbj1zZWxlY3Rvci5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJLy8gT25seSBzcGxpdCBvbiBzaW1wbGUgc3RyaW5ncyAtIGNvbXBsZXggZXhwcmVzc2lvbnMgd2lsbCBiZSBqUXVlcnkgc2VsZWN0b3JzCgkJCWEgPSBzZWxlY3RvcltpXSAmJiBzZWxlY3RvcltpXS5zcGxpdCAmJiAhIHNlbGVjdG9yW2ldLm1hdGNoKC9bXFtcKDpdLykgPwoJCQkJc2VsZWN0b3JbaV0uc3BsaXQoJywnKSA6CgkJCQlbIHNlbGVjdG9yW2ldIF07CgkKCQkJZm9yICggaj0wLCBqZW49YS5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCXJlcyA9IHNlbGVjdEZuKCB0eXBlb2YgYVtqXSA9PT0gJ3N0cmluZycgPyAkLnRyaW0oYVtqXSkgOiBhW2pdICk7CgkKCQkJCWlmICggcmVzICYmIHJlcy5sZW5ndGggKSB7CgkJCQkJb3V0ID0gb3V0LmNvbmNhdCggcmVzICk7CgkJCQl9CgkJCX0KCQl9CgkKCQkvLyBzZWxlY3RvciBleHRlbnNpb25zCgkJdmFyIGV4dCA9IF9leHQuc2VsZWN0b3JbIHR5cGUgXTsKCQlpZiAoIGV4dC5sZW5ndGggKSB7CgkJCWZvciAoIGk9MCwgaWVuPWV4dC5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCW91dCA9IGV4dFtpXSggc2V0dGluZ3MsIG9wdHMsIG91dCApOwoJCQl9CgkJfQoJCgkJcmV0dXJuIF91bmlxdWUoIG91dCApOwoJfTsKCQoJCgl2YXIgX3NlbGVjdG9yX29wdHMgPSBmdW5jdGlvbiAoIG9wdHMgKQoJewoJCWlmICggISBvcHRzICkgewoJCQlvcHRzID0ge307CgkJfQoJCgkJLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIDEuOS0gd2hpY2ggdXNlZCB0aGUgdGVybWlub2xvZ3kgZmlsdGVyIHJhdGhlcgoJCS8vIHRoYW4gc2VhcmNoCgkJaWYgKCBvcHRzLmZpbHRlciAmJiBvcHRzLnNlYXJjaCA9PT0gdW5kZWZpbmVkICkgewoJCQlvcHRzLnNlYXJjaCA9IG9wdHMuZmlsdGVyOwoJCX0KCQoJCXJldHVybiAkLmV4dGVuZCggewoJCQlzZWFyY2g6ICdub25lJywKCQkJb3JkZXI6ICdjdXJyZW50JywKCQkJcGFnZTogJ2FsbCcKCQl9LCBvcHRzICk7Cgl9OwoJCgkKCXZhciBfc2VsZWN0b3JfZmlyc3QgPSBmdW5jdGlvbiAoIGluc3QgKQoJewoJCS8vIFJlZHVjZSB0aGUgQVBJIGluc3RhbmNlIHRvIHRoZSBmaXJzdCBpdGVtIGZvdW5kCgkJZm9yICggdmFyIGk9MCwgaWVuPWluc3QubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCWlmICggaW5zdFtpXS5sZW5ndGggPiAwICkgewoJCQkJLy8gQXNzaWduIHRoZSBmaXJzdCBlbGVtZW50IHRvIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBpbnN0YW5jZQoJCQkJLy8gYW5kIHRydW5jYXRlIHRoZSBpbnN0YW5jZSBhbmQgY29udGV4dAoJCQkJaW5zdFswXSA9IGluc3RbaV07CgkJCQlpbnN0WzBdLmxlbmd0aCA9IDE7CgkJCQlpbnN0Lmxlbmd0aCA9IDE7CgkJCQlpbnN0LmNvbnRleHQgPSBbIGluc3QuY29udGV4dFtpXSBdOwoJCgkJCQlyZXR1cm4gaW5zdDsKCQkJfQoJCX0KCQoJCS8vIE5vdCBmb3VuZCAtIHJldHVybiBhbiBlbXB0eSBpbnN0YW5jZQoJCWluc3QubGVuZ3RoID0gMDsKCQlyZXR1cm4gaW5zdDsKCX07CgkKCQoJdmFyIF9zZWxlY3Rvcl9yb3dfaW5kZXhlcyA9IGZ1bmN0aW9uICggc2V0dGluZ3MsIG9wdHMgKQoJewoJCXZhcgoJCQlpLCBpZW4sIHRtcCwgYT1bXSwKCQkJZGlzcGxheUZpbHRlcmVkID0gc2V0dGluZ3MuYWlEaXNwbGF5LAoJCQlkaXNwbGF5TWFzdGVyID0gc2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyOwoJCgkJdmFyCgkJCXNlYXJjaCA9IG9wdHMuc2VhcmNoLCAgLy8gbm9uZSwgYXBwbGllZCwgcmVtb3ZlZAoJCQlvcmRlciAgPSBvcHRzLm9yZGVyLCAgIC8vIGFwcGxpZWQsIGN1cnJlbnQsIGluZGV4IChvcmlnaW5hbCAtIGNvbXBhdGliaWxpdHkgd2l0aCAxLjkpCgkJCXBhZ2UgICA9IG9wdHMucGFnZTsgICAgLy8gYWxsLCBjdXJyZW50CgkKCQlpZiAoIF9mbkRhdGFTb3VyY2UoIHNldHRpbmdzICkgPT0gJ3NzcCcgKSB7CgkJCS8vIEluIHNlcnZlci1zaWRlIHByb2Nlc3NpbmcgbW9kZSwgbW9zdCBvcHRpb25zIGFyZSBpcnJlbGV2YW50IHNpbmNlCgkJCS8vIHJvd3Mgbm90IHNob3duIGRvbid0IGV4aXN0IGFuZCB0aGUgaW5kZXggb3JkZXIgaXMgdGhlIGFwcGxpZWQgb3JkZXIKCQkJLy8gUmVtb3ZlZCBpcyBhIHNwZWNpYWwgY2FzZSAtIGZvciBjb25zaXN0ZW5jeSBqdXN0IHJldHVybiBhbiBlbXB0eQoJCQkvLyBhcnJheQoJCQlyZXR1cm4gc2VhcmNoID09PSAncmVtb3ZlZCcgPwoJCQkJW10gOgoJCQkJX3JhbmdlKCAwLCBkaXNwbGF5TWFzdGVyLmxlbmd0aCApOwoJCX0KCQllbHNlIGlmICggcGFnZSA9PSAnY3VycmVudCcgKSB7CgkJCS8vIEN1cnJlbnQgcGFnZSBpbXBsaWVzIHRoYXQgb3JkZXI9Y3VycmVudCBhbmQgZml0bGVyPWFwcGxpZWQsIHNpbmNlIGl0IGlzCgkJCS8vIGZhaXJseSBzZW5zZWxlc3Mgb3RoZXJ3aXNlLCByZWdhcmRsZXNzIG9mIHdoYXQgb3JkZXIgYW5kIHNlYXJjaCBhY3R1YWxseQoJCQkvLyBhcmUKCQkJZm9yICggaT1zZXR0aW5ncy5faURpc3BsYXlTdGFydCwgaWVuPXNldHRpbmdzLmZuRGlzcGxheUVuZCgpIDsgaTxpZW4gOyBpKysgKSB7CgkJCQlhLnB1c2goIGRpc3BsYXlGaWx0ZXJlZFtpXSApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBvcmRlciA9PSAnY3VycmVudCcgfHwgb3JkZXIgPT0gJ2FwcGxpZWQnICkgewoJCQlpZiAoIHNlYXJjaCA9PSAnbm9uZScpIHsKCQkJCWEgPSBkaXNwbGF5TWFzdGVyLnNsaWNlKCk7CgkJCX0KCQkJZWxzZSBpZiAoIHNlYXJjaCA9PSAnYXBwbGllZCcgKSB7CgkJCQlhID0gZGlzcGxheUZpbHRlcmVkLnNsaWNlKCk7CgkJCX0KCQkJZWxzZSBpZiAoIHNlYXJjaCA9PSAncmVtb3ZlZCcgKSB7CgkJCQkvLyBPKG4rbSkgc29sdXRpb24gYnkgY3JlYXRpbmcgYSBoYXNoIG1hcAoJCQkJdmFyIGRpc3BsYXlGaWx0ZXJlZE1hcCA9IHt9OwoJCgkJCQlmb3IgKCB2YXIgaT0wLCBpZW49ZGlzcGxheUZpbHRlcmVkLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCWRpc3BsYXlGaWx0ZXJlZE1hcFtkaXNwbGF5RmlsdGVyZWRbaV1dID0gbnVsbDsKCQkJCX0KCQoJCQkJYSA9ICQubWFwKCBkaXNwbGF5TWFzdGVyLCBmdW5jdGlvbiAoZWwpIHsKCQkJCQlyZXR1cm4gISBkaXNwbGF5RmlsdGVyZWRNYXAuaGFzT3duUHJvcGVydHkoZWwpID8KCQkJCQkJZWwgOgoJCQkJCQludWxsOwoJCQkJfSApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBvcmRlciA9PSAnaW5kZXgnIHx8IG9yZGVyID09ICdvcmlnaW5hbCcgKSB7CgkJCWZvciAoIGk9MCwgaWVuPXNldHRpbmdzLmFvRGF0YS5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCWlmICggc2VhcmNoID09ICdub25lJyApIHsKCQkJCQlhLnB1c2goIGkgKTsKCQkJCX0KCQkJCWVsc2UgeyAvLyBhcHBsaWVkIHwgcmVtb3ZlZAoJCQkJCXRtcCA9ICQuaW5BcnJheSggaSwgZGlzcGxheUZpbHRlcmVkICk7CgkKCQkJCQlpZiAoKHRtcCA9PT0gLTEgJiYgc2VhcmNoID09ICdyZW1vdmVkJykgfHwKCQkJCQkJKHRtcCA+PSAwICAgJiYgc2VhcmNoID09ICdhcHBsaWVkJykgKQoJCQkJCXsKCQkJCQkJYS5wdXNoKCBpICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCgkJcmV0dXJuIGE7Cgl9OwoJCgkKCS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgoJICogUm93cwoJICoKCSAqIHt9ICAgICAgICAgIC0gbm8gc2VsZWN0b3IgLSB1c2UgYWxsIGF2YWlsYWJsZSByb3dzCgkgKiB7aW50ZWdlcn0gICAtIHJvdyBhb0RhdGEgaW5kZXgKCSAqIHtub2RlfSAgICAgIC0gVFIgbm9kZQoJICoge3N0cmluZ30gICAgLSBqUXVlcnkgc2VsZWN0b3IgdG8gYXBwbHkgdG8gdGhlIFRSIGVsZW1lbnRzCgkgKiB7YXJyYXl9ICAgICAtIGpRdWVyeSBhcnJheSBvZiBub2Rlcywgb3Igc2ltcGx5IGFuIGFycmF5IG9mIFRSIG5vZGVzCgkgKgoJICovCgl2YXIgX19yb3dfc2VsZWN0b3IgPSBmdW5jdGlvbiAoIHNldHRpbmdzLCBzZWxlY3Rvciwgb3B0cyApCgl7CgkJdmFyIHJvd3M7CgkJdmFyIHJ1biA9IGZ1bmN0aW9uICggc2VsICkgewoJCQl2YXIgc2VsSW50ID0gX2ludFZhbCggc2VsICk7CgkJCXZhciBpLCBpZW47CgkJCXZhciBhb0RhdGEgPSBzZXR0aW5ncy5hb0RhdGE7CgkKCQkJLy8gU2hvcnQgY3V0IC0gc2VsZWN0b3IgaXMgYSBudW1iZXIgYW5kIG5vIG9wdGlvbnMgcHJvdmlkZWQgKGRlZmF1bHQgaXMKCQkJLy8gYWxsIHJlY29yZHMsIHNvIG5vIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGluZGV4IGlzIGluIHRoZXJlLCBzaW5jZSBpdAoJCQkvLyBtdXN0IGJlIC0gZGV2IGVycm9yIGlmIHRoZSBpbmRleCBkb2Vzbid0IGV4aXN0KS4KCQkJaWYgKCBzZWxJbnQgIT09IG51bGwgJiYgISBvcHRzICkgewoJCQkJcmV0dXJuIFsgc2VsSW50IF07CgkJCX0KCQoJCQlpZiAoICEgcm93cyApIHsKCQkJCXJvd3MgPSBfc2VsZWN0b3Jfcm93X2luZGV4ZXMoIHNldHRpbmdzLCBvcHRzICk7CgkJCX0KCQoJCQlpZiAoIHNlbEludCAhPT0gbnVsbCAmJiAkLmluQXJyYXkoIHNlbEludCwgcm93cyApICE9PSAtMSApIHsKCQkJCS8vIFNlbGVjdG9yIC0gaW50ZWdlcgoJCQkJcmV0dXJuIFsgc2VsSW50IF07CgkJCX0KCQkJZWxzZSBpZiAoIHNlbCA9PT0gbnVsbCB8fCBzZWwgPT09IHVuZGVmaW5lZCB8fCBzZWwgPT09ICcnICkgewoJCQkJLy8gU2VsZWN0b3IgLSBub25lCgkJCQlyZXR1cm4gcm93czsKCQkJfQoJCgkJCS8vIFNlbGVjdG9yIC0gZnVuY3Rpb24KCQkJaWYgKCB0eXBlb2Ygc2VsID09PSAnZnVuY3Rpb24nICkgewoJCQkJcmV0dXJuICQubWFwKCByb3dzLCBmdW5jdGlvbiAoaWR4KSB7CgkJCQkJdmFyIHJvdyA9IGFvRGF0YVsgaWR4IF07CgkJCQkJcmV0dXJuIHNlbCggaWR4LCByb3cuX2FEYXRhLCByb3cublRyICkgPyBpZHggOiBudWxsOwoJCQkJfSApOwoJCQl9CgkKCQkJLy8gU2VsZWN0b3IgLSBub2RlCgkJCWlmICggc2VsLm5vZGVOYW1lICkgewoJCQkJdmFyIHJvd0lkeCA9IHNlbC5fRFRfUm93SW5kZXg7ICAvLyBQcm9wZXJ0eSBhZGRlZCBieSBEVCBmb3IgZmFzdCBsb29rdXAKCQkJCXZhciBjZWxsSWR4ID0gc2VsLl9EVF9DZWxsSW5kZXg7CgkKCQkJCWlmICggcm93SWR4ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJvdyBpcyBhY3R1YWxseSBzdGlsbCBwcmVzZW50IGluIHRoZSB0YWJsZQoJCQkJCXJldHVybiBhb0RhdGFbIHJvd0lkeCBdICYmIGFvRGF0YVsgcm93SWR4IF0ublRyID09PSBzZWwgPwoJCQkJCQlbIHJvd0lkeCBdIDoKCQkJCQkJW107CgkJCQl9CgkJCQllbHNlIGlmICggY2VsbElkeCApIHsKCQkJCQlyZXR1cm4gYW9EYXRhWyBjZWxsSWR4LnJvdyBdICYmIGFvRGF0YVsgY2VsbElkeC5yb3cgXS5uVHIgPT09IHNlbCA/CgkJCQkJCVsgY2VsbElkeC5yb3cgXSA6CgkJCQkJCVtdOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJdmFyIGhvc3QgPSAkKHNlbCkuY2xvc2VzdCgnKltkYXRhLWR0LXJvd10nKTsKCQkJCQlyZXR1cm4gaG9zdC5sZW5ndGggPwoJCQkJCQlbIGhvc3QuZGF0YSgnZHQtcm93JykgXSA6CgkJCQkJCVtdOwoJCQkJfQoJCQl9CgkKCQkJLy8gSUQgc2VsZWN0b3IuIFdhbnQgdG8gYWx3YXlzIGJlIGFibGUgdG8gc2VsZWN0IHJvd3MgYnkgaWQsIHJlZ2FyZGxlc3MKCQkJLy8gb2YgaWYgdGhlIHRyIGVsZW1lbnQgaGFzIGJlZW4gY3JlYXRlZCBvciBub3QsIHNvIGNhbid0IHJlbHkgdXBvbgoJCQkvLyBqUXVlcnkgaGVyZSAtIGhlbmNlIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLiBUaGlzIGRvZXMgbm90IG1hdGNoCgkJCS8vIFNpenpsZSdzIGZhc3Qgc2VsZWN0b3Igb3IgSFRNTDQgLSBpbiBIVE1MNSB0aGUgSUQgY2FuIGJlIGFueXRoaW5nLAoJCQkvLyBidXQgdG8gc2VsZWN0IGl0IHVzaW5nIGEgQ1NTIHNlbGVjdG9yIGVuZ2luZSAobGlrZSBTaXp6bGUgb3IKCQkJLy8gcXVlcnlTZWxlY3QpIGl0IHdvdWxkIG5lZWQgdG8gbmVlZCB0byBiZSBlc2NhcGVkIGZvciBzb21lIGNoYXJhY3RlcnMuCgkJCS8vIERhdGFUYWJsZXMgc2ltcGxpZmllcyB0aGlzIGZvciByb3cgc2VsZWN0b3JzIHNpbmNlIHlvdSBjYW4gc2VsZWN0CgkJCS8vIG9ubHkgYSByb3cuIEEgIyBpbmRpY2F0ZXMgYW4gaWQgYW55IGFueXRoaW5nIHRoYXQgZm9sbG93cyBpcyB0aGUgaWQgLQoJCQkvLyB1bmVzY2FwZWQuCgkJCWlmICggdHlwZW9mIHNlbCA9PT0gJ3N0cmluZycgJiYgc2VsLmNoYXJBdCgwKSA9PT0gJyMnICkgewoJCQkJLy8gZ2V0IHJvdyBpbmRleCBmcm9tIGlkCgkJCQl2YXIgcm93T2JqID0gc2V0dGluZ3MuYUlkc1sgc2VsLnJlcGxhY2UoIC9eIy8sICcnICkgXTsKCQkJCWlmICggcm93T2JqICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIFsgcm93T2JqLmlkeCBdOwoJCQkJfQoJCgkJCQkvLyBuZWVkIHRvIGZhbGwgdGhyb3VnaCB0byBqUXVlcnkgaW4gY2FzZSB0aGVyZSBpcyBET00gaWQgdGhhdAoJCQkJLy8gbWF0Y2hlcwoJCQl9CgkJCQoJCQkvLyBHZXQgbm9kZXMgaW4gdGhlIG9yZGVyIGZyb20gdGhlIGByb3dzYCBhcnJheSB3aXRoIG51bGwgdmFsdWVzIHJlbW92ZWQKCQkJdmFyIG5vZGVzID0gX3JlbW92ZUVtcHR5KAoJCQkJX3BsdWNrX29yZGVyKCBzZXR0aW5ncy5hb0RhdGEsIHJvd3MsICduVHInICkKCQkJKTsKCQoJCQkvLyBTZWxlY3RvciAtIGpRdWVyeSBzZWxlY3RvciBzdHJpbmcsIGFycmF5IG9mIG5vZGVzIG9yIGpRdWVyeSBvYmplY3QvCgkJCS8vIEFzIGpRdWVyeSdzIC5maWx0ZXIoKSBhbGxvd3MgalF1ZXJ5IG9iamVjdHMgdG8gYmUgcGFzc2VkIGluIGZpbHRlciwKCQkJLy8gaXQgYWxzbyBhbGxvd3MgYXJyYXlzLCBzbyB0aGlzIHdpbGwgY29wZSB3aXRoIGFsbCB0aHJlZSBvcHRpb25zCgkJCXJldHVybiAkKG5vZGVzKQoJCQkJLmZpbHRlciggc2VsICkKCQkJCS5tYXAoIGZ1bmN0aW9uICgpIHsKCQkJCQlyZXR1cm4gdGhpcy5fRFRfUm93SW5kZXg7CgkJCQl9ICkKCQkJCS50b0FycmF5KCk7CgkJfTsKCQoJCXJldHVybiBfc2VsZWN0b3JfcnVuKCAncm93Jywgc2VsZWN0b3IsIHJ1biwgc2V0dGluZ3MsIG9wdHMgKTsKCX07CgkKCQoJX2FwaV9yZWdpc3RlciggJ3Jvd3MoKScsIGZ1bmN0aW9uICggc2VsZWN0b3IsIG9wdHMgKSB7CgkJLy8gYXJndW1lbnQgc2hpZnRpbmcKCQlpZiAoIHNlbGVjdG9yID09PSB1bmRlZmluZWQgKSB7CgkJCXNlbGVjdG9yID0gJyc7CgkJfQoJCWVsc2UgaWYgKCAkLmlzUGxhaW5PYmplY3QoIHNlbGVjdG9yICkgKSB7CgkJCW9wdHMgPSBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSAnJzsKCQl9CgkKCQlvcHRzID0gX3NlbGVjdG9yX29wdHMoIG9wdHMgKTsKCQoJCXZhciBpbnN0ID0gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJcmV0dXJuIF9fcm93X3NlbGVjdG9yKCBzZXR0aW5ncywgc2VsZWN0b3IsIG9wdHMgKTsKCQl9LCAxICk7CgkKCQkvLyBXYW50IGFyZ3VtZW50IHNoaWZ0aW5nIGhlcmUgYW5kIGluIF9fcm93X3NlbGVjdG9yPwoJCWluc3Quc2VsZWN0b3Iucm93cyA9IHNlbGVjdG9yOwoJCWluc3Quc2VsZWN0b3Iub3B0cyA9IG9wdHM7CgkKCQlyZXR1cm4gaW5zdDsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlciggJ3Jvd3MoKS5ub2RlcygpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAncm93JywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93ICkgewoJCQlyZXR1cm4gc2V0dGluZ3MuYW9EYXRhWyByb3cgXS5uVHIgfHwgdW5kZWZpbmVkOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlciggJ3Jvd3MoKS5kYXRhKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoIHRydWUsICdyb3dzJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93cyApIHsKCQkJcmV0dXJuIF9wbHVja19vcmRlciggc2V0dGluZ3MuYW9EYXRhLCByb3dzLCAnX2FEYXRhJyApOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ3Jvd3MoKS5jYWNoZSgpJywgJ3JvdygpLmNhY2hlKCknLCBmdW5jdGlvbiAoIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdyb3cnLCBmdW5jdGlvbiAoIHNldHRpbmdzLCByb3cgKSB7CgkJCXZhciByID0gc2V0dGluZ3MuYW9EYXRhWyByb3cgXTsKCQkJcmV0dXJuIHR5cGUgPT09ICdzZWFyY2gnID8gci5fYUZpbHRlckRhdGEgOiByLl9hU29ydERhdGE7CgkJfSwgMSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAncm93cygpLmludmFsaWRhdGUoKScsICdyb3coKS5pbnZhbGlkYXRlKCknLCBmdW5jdGlvbiAoIHNyYyApIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3JvdycsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdyApIHsKCQkJX2ZuSW52YWxpZGF0ZSggc2V0dGluZ3MsIHJvdywgc3JjICk7CgkJfSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAncm93cygpLmluZGV4ZXMoKScsICdyb3coKS5pbmRleCgpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAncm93JywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93ICkgewoJCQlyZXR1cm4gcm93OwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ3Jvd3MoKS5pZHMoKScsICdyb3coKS5pZCgpJywgZnVuY3Rpb24gKCBoYXNoICkgewoJCXZhciBhID0gW107CgkJdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CgkKCQkvLyBgaXRlcmF0b3JgIHdpbGwgZHJvcCB1bmRlZmluZWQgdmFsdWVzLCBidXQgaW4gdGhpcyBjYXNlIHdlIHdhbnQgdGhlbQoJCWZvciAoIHZhciBpPTAsIGllbj1jb250ZXh0Lmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQlmb3IgKCB2YXIgaj0wLCBqZW49dGhpc1tpXS5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCXZhciBpZCA9IGNvbnRleHRbaV0ucm93SWRGbiggY29udGV4dFtpXS5hb0RhdGFbIHRoaXNbaV1bal0gXS5fYURhdGEgKTsKCQkJCWEucHVzaCggKGhhc2ggPT09IHRydWUgPyAnIycgOiAnJyApKyBpZCApOwoJCQl9CgkJfQoJCgkJcmV0dXJuIG5ldyBfQXBpKCBjb250ZXh0LCBhICk7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdyb3dzKCkucmVtb3ZlKCknLCAncm93KCkucmVtb3ZlKCknLCBmdW5jdGlvbiAoKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoJCgkJdGhpcy5pdGVyYXRvciggJ3JvdycsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdywgdGhhdElkeCApIHsKCQkJdmFyIGRhdGEgPSBzZXR0aW5ncy5hb0RhdGE7CgkJCXZhciByb3dEYXRhID0gZGF0YVsgcm93IF07CgkJCXZhciBpLCBpZW4sIGosIGplbjsKCQkJdmFyIGxvb3BSb3csIGxvb3BDZWxsczsKCQoJCQlkYXRhLnNwbGljZSggcm93LCAxICk7CgkKCQkJLy8gVXBkYXRlIHRoZSBjYWNoZWQgaW5kZXhlcwoJCQlmb3IgKCBpPTAsIGllbj1kYXRhLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJbG9vcFJvdyA9IGRhdGFbaV07CgkJCQlsb29wQ2VsbHMgPSBsb29wUm93LmFuQ2VsbHM7CgkKCQkJCS8vIFJvd3MKCQkJCWlmICggbG9vcFJvdy5uVHIgIT09IG51bGwgKSB7CgkJCQkJbG9vcFJvdy5uVHIuX0RUX1Jvd0luZGV4ID0gaTsKCQkJCX0KCQoJCQkJLy8gQ2VsbHMKCQkJCWlmICggbG9vcENlbGxzICE9PSBudWxsICkgewoJCQkJCWZvciAoIGo9MCwgamVuPWxvb3BDZWxscy5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCQkJbG9vcENlbGxzW2pdLl9EVF9DZWxsSW5kZXgucm93ID0gaTsKCQkJCQl9CgkJCQl9CgkJCX0KCQoJCQkvLyBEZWxldGUgZnJvbSB0aGUgZGlzcGxheSBhcnJheXMKCQkJX2ZuRGVsZXRlSW5kZXgoIHNldHRpbmdzLmFpRGlzcGxheU1hc3Rlciwgcm93ICk7CgkJCV9mbkRlbGV0ZUluZGV4KCBzZXR0aW5ncy5haURpc3BsYXksIHJvdyApOwoJCQlfZm5EZWxldGVJbmRleCggdGhhdFsgdGhhdElkeCBdLCByb3csIGZhbHNlICk7IC8vIG1haW50YWluIGxvY2FsIGluZGV4ZXMKCQoJCQkvLyBGb3Igc2VydmVyLXNpZGUgcHJvY2Vzc2luZyB0YWJsZXMgLSBzdWJ0cmFjdCB0aGUgZGVsZXRlZCByb3cgZnJvbSB0aGUgY291bnQKCQkJaWYgKCBzZXR0aW5ncy5faVJlY29yZHNEaXNwbGF5ID4gMCApIHsKCQkJCXNldHRpbmdzLl9pUmVjb3Jkc0Rpc3BsYXktLTsKCQkJfQoJCgkJCS8vIENoZWNrIGZvciBhbiAnb3ZlcmZsb3cnIHRoZXkgY2FzZSBmb3IgZGlzcGxheWluZyB0aGUgdGFibGUKCQkJX2ZuTGVuZ3RoT3ZlcmZsb3coIHNldHRpbmdzICk7CgkKCQkJLy8gUmVtb3ZlIHRoZSByb3cncyBJRCByZWZlcmVuY2UgaWYgdGhlcmUgaXMgb25lCgkJCXZhciBpZCA9IHNldHRpbmdzLnJvd0lkRm4oIHJvd0RhdGEuX2FEYXRhICk7CgkJCWlmICggaWQgIT09IHVuZGVmaW5lZCApIHsKCQkJCWRlbGV0ZSBzZXR0aW5ncy5hSWRzWyBpZCBdOwoJCQl9CgkJfSApOwoJCgkJdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJZm9yICggdmFyIGk9MCwgaWVuPXNldHRpbmdzLmFvRGF0YS5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCXNldHRpbmdzLmFvRGF0YVtpXS5pZHggPSBpOwoJCQl9CgkJfSApOwoJCgkJcmV0dXJuIHRoaXM7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3Jvd3MuYWRkKCknLCBmdW5jdGlvbiAoIHJvd3MgKSB7CgkJdmFyIG5ld1Jvd3MgPSB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQkJdmFyIHJvdywgaSwgaWVuOwoJCQkJdmFyIG91dCA9IFtdOwoJCgkJCQlmb3IgKCBpPTAsIGllbj1yb3dzLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCXJvdyA9IHJvd3NbaV07CgkKCQkJCQlpZiAoIHJvdy5ub2RlTmFtZSAmJiByb3cubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1RSJyApIHsKCQkJCQkJb3V0LnB1c2goIF9mbkFkZFRyKCBzZXR0aW5ncywgcm93IClbMF0gKTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCW91dC5wdXNoKCBfZm5BZGREYXRhKCBzZXR0aW5ncywgcm93ICkgKTsKCQkJCQl9CgkJCQl9CgkKCQkJCXJldHVybiBvdXQ7CgkJCX0sIDEgKTsKCQoJCS8vIFJldHVybiBhbiBBcGkucm93cygpIGV4dGVuZGVkIGluc3RhbmNlLCBzbyByb3dzKCkubm9kZXMoKSBldGMgY2FuIGJlIHVzZWQKCQl2YXIgbW9kUm93cyA9IHRoaXMucm93cyggLTEgKTsKCQltb2RSb3dzLnBvcCgpOwoJCSQubWVyZ2UoIG1vZFJvd3MsIG5ld1Jvd3MgKTsKCQoJCXJldHVybiBtb2RSb3dzOwoJfSApOwoJCgkKCQoJCgkKCS8qKgoJICoKCSAqLwoJX2FwaV9yZWdpc3RlciggJ3JvdygpJywgZnVuY3Rpb24gKCBzZWxlY3Rvciwgb3B0cyApIHsKCQlyZXR1cm4gX3NlbGVjdG9yX2ZpcnN0KCB0aGlzLnJvd3MoIHNlbGVjdG9yLCBvcHRzICkgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAncm93KCkuZGF0YSgpJywgZnVuY3Rpb24gKCBkYXRhICkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKCQkJLy8gR2V0CgkJCXJldHVybiBjdHgubGVuZ3RoICYmIHRoaXMubGVuZ3RoID8KCQkJCWN0eFswXS5hb0RhdGFbIHRoaXNbMF0gXS5fYURhdGEgOgoJCQkJdW5kZWZpbmVkOwoJCX0KCQoJCS8vIFNldAoJCXZhciByb3cgPSBjdHhbMF0uYW9EYXRhWyB0aGlzWzBdIF07CgkJcm93Ll9hRGF0YSA9IGRhdGE7CgkKCQkvLyBJZiB0aGUgRE9NIGhhcyBhbiBpZCwgYW5kIHRoZSBkYXRhIHNvdXJjZSBpcyBhbiBhcnJheQoJCWlmICggJC5pc0FycmF5KCBkYXRhICkgJiYgcm93Lm5Uci5pZCApIHsKCQkJX2ZuU2V0T2JqZWN0RGF0YUZuKCBjdHhbMF0ucm93SWQgKSggZGF0YSwgcm93Lm5Uci5pZCApOwoJCX0KCQoJCS8vIEF1dG9tYXRpY2FsbHkgaW52YWxpZGF0ZQoJCV9mbkludmFsaWRhdGUoIGN0eFswXSwgdGhpc1swXSwgJ2RhdGEnICk7CgkKCQlyZXR1cm4gdGhpczsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAncm93KCkubm9kZSgpJywgZnVuY3Rpb24gKCkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlyZXR1cm4gY3R4Lmxlbmd0aCAmJiB0aGlzLmxlbmd0aCA/CgkJCWN0eFswXS5hb0RhdGFbIHRoaXNbMF0gXS5uVHIgfHwgbnVsbCA6CgkJCW51bGw7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3Jvdy5hZGQoKScsIGZ1bmN0aW9uICggcm93ICkgewoJCS8vIEFsbG93IGEgalF1ZXJ5IG9iamVjdCB0byBiZSBwYXNzZWQgaW4gLSBvbmx5IGEgc2luZ2xlIHJvdyBpcyBhZGRlZCBmcm9tCgkJLy8gaXQgdGhvdWdoIC0gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNldAoJCWlmICggcm93IGluc3RhbmNlb2YgJCAmJiByb3cubGVuZ3RoICkgewoJCQlyb3cgPSByb3dbMF07CgkJfQoJCgkJdmFyIHJvd3MgPSB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlpZiAoIHJvdy5ub2RlTmFtZSAmJiByb3cubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1RSJyApIHsKCQkJCXJldHVybiBfZm5BZGRUciggc2V0dGluZ3MsIHJvdyApWzBdOwoJCQl9CgkJCXJldHVybiBfZm5BZGREYXRhKCBzZXR0aW5ncywgcm93ICk7CgkJfSApOwoJCgkJLy8gUmV0dXJuIGFuIEFwaS5yb3dzKCkgZXh0ZW5kZWQgaW5zdGFuY2UsIHdpdGggdGhlIG5ld2x5IGFkZGVkIHJvdyBzZWxlY3RlZAoJCXJldHVybiB0aGlzLnJvdyggcm93c1swXSApOwoJfSApOwoJCgkKCQoJdmFyIF9fZGV0YWlsc19hZGQgPSBmdW5jdGlvbiAoIGN0eCwgcm93LCBkYXRhLCBrbGFzcyApCgl7CgkJLy8gQ29udmVydCB0byBhcnJheSBvZiBUUiBlbGVtZW50cwoJCXZhciByb3dzID0gW107CgkJdmFyIGFkZFJvdyA9IGZ1bmN0aW9uICggciwgayApIHsKCQkJLy8gUmVjdXJzaW9uIHRvIGFsbG93IGZvciBhcnJheXMgb2YgalF1ZXJ5IG9iamVjdHMKCQkJaWYgKCAkLmlzQXJyYXkoIHIgKSB8fCByIGluc3RhbmNlb2YgJCApIHsKCQkJCWZvciAoIHZhciBpPTAsIGllbj1yLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCWFkZFJvdyggcltpXSwgayApOwoJCQkJfQoJCQkJcmV0dXJuOwoJCQl9CgkKCQkJLy8gSWYgd2UgZ2V0IGEgVFIgZWxlbWVudCwgdGhlbiBqdXN0IGFkZCBpdCBkaXJlY3RseSAtIHVwIHRvIHRoZSBkZXYKCQkJLy8gdG8gYWRkIHRoZSBjb3JyZWN0IG51bWJlciBvZiBjb2x1bW5zIGV0YwoJCQlpZiAoIHIubm9kZU5hbWUgJiYgci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndHInICkgewoJCQkJcm93cy5wdXNoKCByICk7CgkJCX0KCQkJZWxzZSB7CgkJCQkvLyBPdGhlcndpc2UgY3JlYXRlIGEgcm93IHdpdGggYSB3cmFwcGVyCgkJCQl2YXIgY3JlYXRlZCA9ICQoJzx0cj48dGQvPjwvdHI+JykuYWRkQ2xhc3MoIGsgKTsKCQkJCSQoJ3RkJywgY3JlYXRlZCkKCQkJCQkuYWRkQ2xhc3MoIGsgKQoJCQkJCS5odG1sKCByICkKCQkJCQlbMF0uY29sU3BhbiA9IF9mblZpc2JsZUNvbHVtbnMoIGN0eCApOwoJCgkJCQlyb3dzLnB1c2goIGNyZWF0ZWRbMF0gKTsKCQkJfQoJCX07CgkKCQlhZGRSb3coIGRhdGEsIGtsYXNzICk7CgkKCQlpZiAoIHJvdy5fZGV0YWlscyApIHsKCQkJcm93Ll9kZXRhaWxzLmRldGFjaCgpOwoJCX0KCQoJCXJvdy5fZGV0YWlscyA9ICQocm93cyk7CgkKCQkvLyBJZiB0aGUgY2hpbGRyZW4gd2VyZSBhbHJlYWR5IHNob3duLCB0aGF0IHN0YXRlIHNob3VsZCBiZSByZXRhaW5lZAoJCWlmICggcm93Ll9kZXRhaWxzU2hvdyApIHsKCQkJcm93Ll9kZXRhaWxzLmluc2VydEFmdGVyKCByb3cublRyICk7CgkJfQoJfTsKCQoJCgl2YXIgX19kZXRhaWxzX3JlbW92ZSA9IGZ1bmN0aW9uICggYXBpLCBpZHggKQoJewoJCXZhciBjdHggPSBhcGkuY29udGV4dDsKCQoJCWlmICggY3R4Lmxlbmd0aCApIHsKCQkJdmFyIHJvdyA9IGN0eFswXS5hb0RhdGFbIGlkeCAhPT0gdW5kZWZpbmVkID8gaWR4IDogYXBpWzBdIF07CgkKCQkJaWYgKCByb3cgJiYgcm93Ll9kZXRhaWxzICkgewoJCQkJcm93Ll9kZXRhaWxzLnJlbW92ZSgpOwoJCgkJCQlyb3cuX2RldGFpbHNTaG93ID0gdW5kZWZpbmVkOwoJCQkJcm93Ll9kZXRhaWxzID0gdW5kZWZpbmVkOwoJCQl9CgkJfQoJfTsKCQoJCgl2YXIgX19kZXRhaWxzX2Rpc3BsYXkgPSBmdW5jdGlvbiAoIGFwaSwgc2hvdyApIHsKCQl2YXIgY3R4ID0gYXBpLmNvbnRleHQ7CgkKCQlpZiAoIGN0eC5sZW5ndGggJiYgYXBpLmxlbmd0aCApIHsKCQkJdmFyIHJvdyA9IGN0eFswXS5hb0RhdGFbIGFwaVswXSBdOwoJCgkJCWlmICggcm93Ll9kZXRhaWxzICkgewoJCQkJcm93Ll9kZXRhaWxzU2hvdyA9IHNob3c7CgkKCQkJCWlmICggc2hvdyApIHsKCQkJCQlyb3cuX2RldGFpbHMuaW5zZXJ0QWZ0ZXIoIHJvdy5uVHIgKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXJvdy5fZGV0YWlscy5kZXRhY2goKTsKCQkJCX0KCQoJCQkJX19kZXRhaWxzX2V2ZW50cyggY3R4WzBdICk7CgkJCX0KCQl9Cgl9OwoJCgkKCXZhciBfX2RldGFpbHNfZXZlbnRzID0gZnVuY3Rpb24gKCBzZXR0aW5ncyApCgl7CgkJdmFyIGFwaSA9IG5ldyBfQXBpKCBzZXR0aW5ncyApOwoJCXZhciBuYW1lc3BhY2UgPSAnLmR0LkRUX2RldGFpbHMnOwoJCXZhciBkcmF3RXZlbnQgPSAnZHJhdycrbmFtZXNwYWNlOwoJCXZhciBjb2x2aXNFdmVudCA9ICdjb2x1bW4tdmlzaWJpbGl0eScrbmFtZXNwYWNlOwoJCXZhciBkZXN0cm95RXZlbnQgPSAnZGVzdHJveScrbmFtZXNwYWNlOwoJCXZhciBkYXRhID0gc2V0dGluZ3MuYW9EYXRhOwoJCgkJYXBpLm9mZiggZHJhd0V2ZW50ICsnICcrIGNvbHZpc0V2ZW50ICsnICcrIGRlc3Ryb3lFdmVudCApOwoJCgkJaWYgKCBfcGx1Y2soIGRhdGEsICdfZGV0YWlscycgKS5sZW5ndGggPiAwICkgewoJCQkvLyBPbiBlYWNoIGRyYXcsIGluc2VydCB0aGUgcmVxdWlyZWQgZWxlbWVudHMgaW50byB0aGUgZG9jdW1lbnQKCQkJYXBpLm9uKCBkcmF3RXZlbnQsIGZ1bmN0aW9uICggZSwgY3R4ICkgewoJCQkJaWYgKCBzZXR0aW5ncyAhPT0gY3R4ICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQoJCQkJYXBpLnJvd3MoIHtwYWdlOidjdXJyZW50J30gKS5lcSgwKS5lYWNoKCBmdW5jdGlvbiAoaWR4KSB7CgkJCQkJLy8gSW50ZXJuYWwgZGF0YSBncmFiCgkJCQkJdmFyIHJvdyA9IGRhdGFbIGlkeCBdOwoJCgkJCQkJaWYgKCByb3cuX2RldGFpbHNTaG93ICkgewoJCQkJCQlyb3cuX2RldGFpbHMuaW5zZXJ0QWZ0ZXIoIHJvdy5uVHIgKTsKCQkJCQl9CgkJCQl9ICk7CgkJCX0gKTsKCQoJCQkvLyBDb2x1bW4gdmlzaWJpbGl0eSBjaGFuZ2UgLSB1cGRhdGUgdGhlIGNvbHNwYW4KCQkJYXBpLm9uKCBjb2x2aXNFdmVudCwgZnVuY3Rpb24gKCBlLCBjdHgsIGlkeCwgdmlzICkgewoJCQkJaWYgKCBzZXR0aW5ncyAhPT0gY3R4ICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQoJCQkJLy8gVXBkYXRlIHRoZSBjb2xzcGFuIGZvciB0aGUgZGV0YWlscyByb3dzIChub3RlLCBvbmx5IGlmIGl0IGFscmVhZHkgaGFzCgkJCQkvLyBhIGNvbHNwYW4pCgkJCQl2YXIgcm93LCB2aXNpYmxlID0gX2ZuVmlzYmxlQ29sdW1ucyggY3R4ICk7CgkKCQkJCWZvciAoIHZhciBpPTAsIGllbj1kYXRhLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCXJvdyA9IGRhdGFbaV07CgkKCQkJCQlpZiAoIHJvdy5fZGV0YWlscyApIHsKCQkJCQkJcm93Ll9kZXRhaWxzLmNoaWxkcmVuKCd0ZFtjb2xzcGFuXScpLmF0dHIoJ2NvbHNwYW4nLCB2aXNpYmxlICk7CgkJCQkJfQoJCQkJfQoJCQl9ICk7CgkKCQkJLy8gVGFibGUgZGVzdHJveWVkIC0gbnVrZSBhbnkgY2hpbGQgcm93cwoJCQlhcGkub24oIGRlc3Ryb3lFdmVudCwgZnVuY3Rpb24gKCBlLCBjdHggKSB7CgkJCQlpZiAoIHNldHRpbmdzICE9PSBjdHggKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCgkJCQlmb3IgKCB2YXIgaT0wLCBpZW49ZGF0YS5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCQlpZiAoIGRhdGFbaV0uX2RldGFpbHMgKSB7CgkJCQkJCV9fZGV0YWlsc19yZW1vdmUoIGFwaSwgaSApOwoJCQkJCX0KCQkJCX0KCQkJfSApOwoJCX0KCX07CgkKCS8vIFN0cmluZ3MgZm9yIHRoZSBtZXRob2QgbmFtZXMgdG8gaGVscCBtaW5pZmljYXRpb24KCXZhciBfZW1wID0gJyc7Cgl2YXIgX2NoaWxkX29iaiA9IF9lbXArJ3JvdygpLmNoaWxkJzsKCXZhciBfY2hpbGRfbXRoID0gX2NoaWxkX29iaisnKCknOwoJCgkvLyBkYXRhIGNhbiBiZToKCS8vICB0cgoJLy8gIHN0cmluZwoJLy8gIGpRdWVyeSBvciBhcnJheSBvZiBhbnkgb2YgdGhlIGFib3ZlCglfYXBpX3JlZ2lzdGVyKCBfY2hpbGRfbXRoLCBmdW5jdGlvbiAoIGRhdGEsIGtsYXNzICkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKCQkJLy8gZ2V0CgkJCXJldHVybiBjdHgubGVuZ3RoICYmIHRoaXMubGVuZ3RoID8KCQkJCWN0eFswXS5hb0RhdGFbIHRoaXNbMF0gXS5fZGV0YWlscyA6CgkJCQl1bmRlZmluZWQ7CgkJfQoJCWVsc2UgaWYgKCBkYXRhID09PSB0cnVlICkgewoJCQkvLyBzaG93CgkJCXRoaXMuY2hpbGQuc2hvdygpOwoJCX0KCQllbHNlIGlmICggZGF0YSA9PT0gZmFsc2UgKSB7CgkJCS8vIHJlbW92ZQoJCQlfX2RldGFpbHNfcmVtb3ZlKCB0aGlzICk7CgkJfQoJCWVsc2UgaWYgKCBjdHgubGVuZ3RoICYmIHRoaXMubGVuZ3RoICkgewoJCQkvLyBzZXQKCQkJX19kZXRhaWxzX2FkZCggY3R4WzBdLCBjdHhbMF0uYW9EYXRhWyB0aGlzWzBdIF0sIGRhdGEsIGtsYXNzICk7CgkJfQoJCgkJcmV0dXJuIHRoaXM7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggWwoJCV9jaGlsZF9vYmorJy5zaG93KCknLAoJCV9jaGlsZF9tdGgrJy5zaG93KCknIC8vIG9ubHkgd2hlbiBgY2hpbGQoKWAgd2FzIGNhbGxlZCB3aXRoIHBhcmFtZXRlcnMgKHdpdGhvdXQKCV0sIGZ1bmN0aW9uICggc2hvdyApIHsgICAvLyBpdCByZXR1cm5zIGFuIG9iamVjdCBhbmQgdGhpcyBtZXRob2QgaXMgbm90IGV4ZWN1dGVkKQoJCV9fZGV0YWlsc19kaXNwbGF5KCB0aGlzLCB0cnVlICk7CgkJcmV0dXJuIHRoaXM7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggWwoJCV9jaGlsZF9vYmorJy5oaWRlKCknLAoJCV9jaGlsZF9tdGgrJy5oaWRlKCknIC8vIG9ubHkgd2hlbiBgY2hpbGQoKWAgd2FzIGNhbGxlZCB3aXRoIHBhcmFtZXRlcnMgKHdpdGhvdXQKCV0sIGZ1bmN0aW9uICgpIHsgICAgICAgICAvLyBpdCByZXR1cm5zIGFuIG9iamVjdCBhbmQgdGhpcyBtZXRob2QgaXMgbm90IGV4ZWN1dGVkKQoJCV9fZGV0YWlsc19kaXNwbGF5KCB0aGlzLCBmYWxzZSApOwoJCXJldHVybiB0aGlzOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXIoIFsKCQlfY2hpbGRfb2JqKycucmVtb3ZlKCknLAoJCV9jaGlsZF9tdGgrJy5yZW1vdmUoKScgLy8gb25seSB3aGVuIGBjaGlsZCgpYCB3YXMgY2FsbGVkIHdpdGggcGFyYW1ldGVycyAod2l0aG91dAoJXSwgZnVuY3Rpb24gKCkgeyAgICAgICAgICAgLy8gaXQgcmV0dXJucyBhbiBvYmplY3QgYW5kIHRoaXMgbWV0aG9kIGlzIG5vdCBleGVjdXRlZCkKCQlfX2RldGFpbHNfcmVtbw=="
3NAxHUEaM6RAG7rVDPL9L6DFZWkrqFtY98t: jquery.dataTables.js?4?1?2: "base64:ZWFzaWx5IHdvcmsgd2l0aCB0aGUgZGF0YSBpbgoJICogdGhlIHRhYmxlcywgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGl0IGFzIHJlcXVpcmVkLiBUaGlzIGlzIGRvbmUgYnkKCSAqIHByZXNlbnRpbmcgdGhlIEFQSSBjbGFzcyBhcyBhbiBhcnJheSBsaWtlIGludGVyZmFjZS4gVGhlIGNvbnRlbnRzIG9mIHRoZQoJICogYXJyYXkgZGVwZW5kIHVwb24gdGhlIGFjdGlvbnMgcmVxdWVzdGVkIGJ5IGVhY2ggbWV0aG9kIChmb3IgZXhhbXBsZQoJICogYHJvd3MoKS5ub2RlcygpYCB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBub2Rlcywgd2hpbGUgYHJvd3MoKS5kYXRhKClgIHdpbGwKCSAqIHJldHVybiBhbiBhcnJheSBvZiBvYmplY3RzIG9yIGFycmF5cyBkZXBlbmRpbmcgdXBvbiB5b3VyIHRhYmxlJ3MKCSAqIGNvbmZpZ3VyYXRpb24pLiBUaGUgQVBJIG9iamVjdCBoYXMgYSBudW1iZXIgb2YgYXJyYXkgbGlrZSBtZXRob2RzIChgcHVzaGAsCgkgKiBgcG9wYCwgYHJldmVyc2VgIGV0YykgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGhlbHBlciBtZXRob2RzIChgZWFjaGAsIGBwbHVja2AsCgkgKiBgdW5pcXVlYCBldGMpIHRvIGFzc2lzdCB5b3VyIHdvcmtpbmcgd2l0aCB0aGUgZGF0YSBoZWxkIGluIGEgdGFibGUuCgkgKgoJICogTW9zdCBtZXRob2RzICh0aG9zZSB3aGljaCByZXR1cm4gYW4gQXBpIGluc3RhbmNlKSBhcmUgY2hhaW5hYmxlLCB3aGljaCBtZWFucwoJICogdGhlIHJldHVybiBmcm9tIGEgbWV0aG9kIGNhbGwgYWxzbyBoYXMgYWxsIG9mIHRoZSBtZXRob2RzIGF2YWlsYWJsZSB0aGF0IHRoZQoJICogdG9wIGxldmVsIG9iamVjdCBoYWQuIEZvciBleGFtcGxlLCB0aGVzZSB0d28gY2FsbHMgYXJlIGVxdWl2YWxlbnQ6CgkgKgoJICogICAgIC8vIE5vdCBjaGFpbmVkCgkgKiAgICAgYXBpLnJvdy5hZGQoIHsuLi59ICk7CgkgKiAgICAgYXBpLmRyYXcoKTsKCSAqCgkgKiAgICAgLy8gQ2hhaW5lZAoJICogICAgIGFwaS5yb3cuYWRkKCB7Li4ufSApLmRyYXcoKTsKCSAqCgkgKiBAY2xhc3MgRGF0YVRhYmxlLkFwaQoJICogQHBhcmFtIHthcnJheXxvYmplY3R8c3RyaW5nfGpRdWVyeX0gY29udGV4dCBEYXRhVGFibGUgaWRlbnRpZmllci4gVGhpcyBpcwoJICogICB1c2VkIHRvIGRlZmluZSB3aGljaCBEYXRhVGFibGVzIGVuaGFuY2VkIHRhYmxlcyB0aGlzIEFQSSB3aWxsIG9wZXJhdGUgb24uCgkgKiAgIENhbiBiZSBvbmUgb2Y6CgkgKgoJICogICAqIGBzdHJpbmdgIC0galF1ZXJ5IHNlbGVjdG9yLiBBbnkgRGF0YVRhYmxlcycgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yCgkgKiAgICAgd2l0aCBiZSBmb3VuZCBhbmQgdXNlZC4KCSAqICAgKiBgbm9kZWAgLSBgVEFCTEVgIG5vZGUgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBmb3JtZWQgaW50byBhIERhdGFUYWJsZS4KCSAqICAgKiBgalF1ZXJ5YCAtIEEgalF1ZXJ5IG9iamVjdCBvZiBgVEFCTEVgIG5vZGVzLgoJICogICAqIGBvYmplY3RgIC0gRGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqIEBwYXJhbSB7YXJyYXl9IFtkYXRhXSBEYXRhIHRvIGluaXRpYWxpc2UgdGhlIEFwaSBpbnN0YW5jZSB3aXRoLgoJICoKCSAqIEBleGFtcGxlCgkgKiAgIC8vIERpcmVjdCBpbml0aWFsaXNhdGlvbiBkdXJpbmcgRGF0YVRhYmxlcyBjb25zdHJ1Y3Rpb24KCSAqICAgdmFyIGFwaSA9ICQoJyNleGFtcGxlJykuRGF0YVRhYmxlKCk7CgkgKgoJICogQGV4YW1wbGUKCSAqICAgLy8gSW5pdGlhbGlzYXRpb24gdXNpbmcgYSBEYXRhVGFibGVzIGpRdWVyeSBvYmplY3QKCSAqICAgdmFyIGFwaSA9ICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCkuYXBpKCk7CgkgKgoJICogQGV4YW1wbGUKCSAqICAgLy8gSW5pdGlhbGlzYXRpb24gYXMgYSBjb25zdHJ1Y3RvcgoJICogICB2YXIgYXBpID0gbmV3ICQuZm4uRGF0YVRhYmxlLkFwaSggJ3RhYmxlLmRhdGFUYWJsZScgKTsKCSAqLwoJX0FwaSA9IGZ1bmN0aW9uICggY29udGV4dCwgZGF0YSApCgl7CgkJaWYgKCAhICh0aGlzIGluc3RhbmNlb2YgX0FwaSkgKSB7CgkJCXJldHVybiBuZXcgX0FwaSggY29udGV4dCwgZGF0YSApOwoJCX0KCQoJCXZhciBzZXR0aW5ncyA9IFtdOwoJCXZhciBjdHhTZXR0aW5ncyA9IGZ1bmN0aW9uICggbyApIHsKCQkJdmFyIGEgPSBfdG9TZXR0aW5ncyggbyApOwoJCQlpZiAoIGEgKSB7CgkJCQlzZXR0aW5ncyA9IHNldHRpbmdzLmNvbmNhdCggYSApOwoJCQl9CgkJfTsKCQoJCWlmICggJC5pc0FycmF5KCBjb250ZXh0ICkgKSB7CgkJCWZvciAoIHZhciBpPTAsIGllbj1jb250ZXh0Lmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJY3R4U2V0dGluZ3MoIGNvbnRleHRbaV0gKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJY3R4U2V0dGluZ3MoIGNvbnRleHQgKTsKCQl9CgkKCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCXRoaXMuY29udGV4dCA9IF91bmlxdWUoIHNldHRpbmdzICk7CgkKCQkvLyBJbml0aWFsIGRhdGEKCQlpZiAoIGRhdGEgKSB7CgkJCSQubWVyZ2UoIHRoaXMsIGRhdGEgKTsKCQl9CgkKCQkvLyBzZWxlY3RvcgoJCXRoaXMuc2VsZWN0b3IgPSB7CgkJCXJvd3M6IG51bGwsCgkJCWNvbHM6IG51bGwsCgkJCW9wdHM6IG51bGwKCQl9OwoJCgkJX0FwaS5leHRlbmQoIHRoaXMsIHRoaXMsIF9fYXBpU3RydWN0ICk7Cgl9OwoJCglEYXRhVGFibGUuQXBpID0gX0FwaTsKCQoJLy8gRG9uJ3QgZGVzdHJveSB0aGUgZXhpc3RpbmcgcHJvdG90eXBlLCBqdXN0IGV4dGVuZCBpdC4gUmVxdWlyZWQgZm9yIGpRdWVyeSAyJ3MKCS8vIGlzUGxhaW5PYmplY3QuCgkkLmV4dGVuZCggX0FwaS5wcm90b3R5cGUsIHsKCQlhbnk6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gdGhpcy5jb3VudCgpICE9PSAwOwoJCX0sCgkKCQoJCWNvbmNhdDogIF9fYXJyYXlQcm90by5jb25jYXQsCgkKCQoJCWNvbnRleHQ6IFtdLCAvLyBhcnJheSBvZiB0YWJsZSBzZXR0aW5ncyBvYmplY3RzCgkKCQoJCWNvdW50OiBmdW5jdGlvbiAoKQoJCXsKCQkJcmV0dXJuIHRoaXMuZmxhdHRlbigpLmxlbmd0aDsKCQl9LAoJCgkKCQllYWNoOiBmdW5jdGlvbiAoIGZuICkKCQl7CgkJCWZvciAoIHZhciBpPTAsIGllbj10aGlzLmxlbmd0aCA7IGk8aWVuOyBpKysgKSB7CgkJCQlmbi5jYWxsKCB0aGlzLCB0aGlzW2ldLCBpLCB0aGlzICk7CgkJCX0KCQoJCQlyZXR1cm4gdGhpczsKCQl9LAoJCgkKCQllcTogZnVuY3Rpb24gKCBpZHggKQoJCXsKCQkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQoJCQlyZXR1cm4gY3R4Lmxlbmd0aCA+IGlkeCA/CgkJCQluZXcgX0FwaSggY3R4W2lkeF0sIHRoaXNbaWR4XSApIDoKCQkJCW51bGw7CgkJfSwKCQoJCgkJZmlsdGVyOiBmdW5jdGlvbiAoIGZuICkKCQl7CgkJCXZhciBhID0gW107CgkKCQkJaWYgKCBfX2FycmF5UHJvdG8uZmlsdGVyICkgewoJCQkJYSA9IF9fYXJyYXlQcm90by5maWx0ZXIuY2FsbCggdGhpcywgZm4sIHRoaXMgKTsKCQkJfQoJCQllbHNlIHsKCQkJCS8vIENvbXBhdGliaWxpdHkgZm9yIGJyb3dzZXJzIHdpdGhvdXQgRU1DQS0yNTItNSAoSlMgMS42KQoJCQkJZm9yICggdmFyIGk9MCwgaWVuPXRoaXMubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQkJaWYgKCBmbi5jYWxsKCB0aGlzLCB0aGlzW2ldLCBpLCB0aGlzICkgKSB7CgkJCQkJCWEucHVzaCggdGhpc1tpXSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCgkJCXJldHVybiBuZXcgX0FwaSggdGhpcy5jb250ZXh0LCBhICk7CgkJfSwKCQoJCgkJZmxhdHRlbjogZnVuY3Rpb24gKCkKCQl7CgkJCXZhciBhID0gW107CgkJCXJldHVybiBuZXcgX0FwaSggdGhpcy5jb250ZXh0LCBhLmNvbmNhdC5hcHBseSggYSwgdGhpcy50b0FycmF5KCkgKSApOwoJCX0sCgkKCQoJCWpvaW46ICAgIF9fYXJyYXlQcm90by5qb2luLAoJCgkKCQlpbmRleE9mOiBfX2FycmF5UHJvdG8uaW5kZXhPZiB8fCBmdW5jdGlvbiAob2JqLCBzdGFydCkKCQl7CgkJCWZvciAoIHZhciBpPShzdGFydCB8fCAwKSwgaWVuPXRoaXMubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQlpZiAoIHRoaXNbaV0gPT09IG9iaiApIHsKCQkJCQlyZXR1cm4gaTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gLTE7CgkJfSwKCQoJCWl0ZXJhdG9yOiBmdW5jdGlvbiAoIGZsYXR0ZW4sIHR5cGUsIGZuLCBhbHdheXNOZXcgKSB7CgkJCXZhcgoJCQkJYSA9IFtdLCByZXQsCgkJCQlpLCBpZW4sIGosIGplbiwKCQkJCWNvbnRleHQgPSB0aGlzLmNvbnRleHQsCgkJCQlyb3dzLCBpdGVtcywgaXRlbSwKCQkJCXNlbGVjdG9yID0gdGhpcy5zZWxlY3RvcjsKCQoJCQkvLyBBcmd1bWVudCBzaGlmdGluZwoJCQlpZiAoIHR5cGVvZiBmbGF0dGVuID09PSAnc3RyaW5nJyApIHsKCQkJCWFsd2F5c05ldyA9IGZuOwoJCQkJZm4gPSB0eXBlOwoJCQkJdHlwZSA9IGZsYXR0ZW47CgkJCQlmbGF0dGVuID0gZmFsc2U7CgkJCX0KCQoJCQlmb3IgKCBpPTAsIGllbj1jb250ZXh0Lmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJdmFyIGFwaUluc3QgPSBuZXcgX0FwaSggY29udGV4dFtpXSApOwoJCgkJCQlpZiAoIHR5cGUgPT09ICd0YWJsZScgKSB7CgkJCQkJcmV0ID0gZm4uY2FsbCggYXBpSW5zdCwgY29udGV4dFtpXSwgaSApOwoJCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJYS5wdXNoKCByZXQgKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIGlmICggdHlwZSA9PT0gJ2NvbHVtbnMnIHx8IHR5cGUgPT09ICdyb3dzJyApIHsKCQkJCQkvLyB0aGlzIGhhcyBzYW1lIGxlbmd0aCBhcyBjb250ZXh0IC0gb25lIGVudHJ5IGZvciBlYWNoIHRhYmxlCgkJCQkJcmV0ID0gZm4uY2FsbCggYXBpSW5zdCwgY29udGV4dFtpXSwgdGhpc1tpXSwgaSApOwoJCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJYS5wdXNoKCByZXQgKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIGlmICggdHlwZSA9PT0gJ2NvbHVtbicgfHwgdHlwZSA9PT0gJ2NvbHVtbi1yb3dzJyB8fCB0eXBlID09PSAncm93JyB8fCB0eXBlID09PSAnY2VsbCcgKSB7CgkJCQkJLy8gY29sdW1ucyBhbmQgcm93cyBzaGFyZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCgkJCQkJLy8gJ3RoaXMnIGlzIGFuIGFycmF5IG9mIGNvbHVtbiBpbmRleGVzIGZvciBlYWNoIGNvbnRleHQKCQkJCQlpdGVtcyA9IHRoaXNbaV07CgkKCQkJCQlpZiAoIHR5cGUgPT09ICdjb2x1bW4tcm93cycgKSB7CgkJCQkJCXJvd3MgPSBfc2VsZWN0b3Jfcm93X2luZGV4ZXMoIGNvbnRleHRbaV0sIHNlbGVjdG9yLm9wdHMgKTsKCQkJCQl9CgkKCQkJCQlmb3IgKCBqPTAsIGplbj1pdGVtcy5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCQkJaXRlbSA9IGl0ZW1zW2pdOwoJCgkJCQkJCWlmICggdHlwZSA9PT0gJ2NlbGwnICkgewoJCQkJCQkJcmV0ID0gZm4uY2FsbCggYXBpSW5zdCwgY29udGV4dFtpXSwgaXRlbS5yb3csIGl0ZW0uY29sdW1uLCBpLCBqICk7CgkJCQkJCX0KCQkJCQkJZWxzZSB7CgkJCQkJCQlyZXQgPSBmbi5jYWxsKCBhcGlJbnN0LCBjb250ZXh0W2ldLCBpdGVtLCBpLCBqLCByb3dzICk7CgkJCQkJCX0KCQoJCQkJCQlpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkgewoJCQkJCQkJYS5wdXNoKCByZXQgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCgkJCWlmICggYS5sZW5ndGggfHwgYWx3YXlzTmV3ICkgewoJCQkJdmFyIGFwaSA9IG5ldyBfQXBpKCBjb250ZXh0LCBmbGF0dGVuID8gYS5jb25jYXQuYXBwbHkoIFtdLCBhICkgOiBhICk7CgkJCQl2YXIgYXBpU2VsZWN0b3IgPSBhcGkuc2VsZWN0b3I7CgkJCQlhcGlTZWxlY3Rvci5yb3dzID0gc2VsZWN0b3Iucm93czsKCQkJCWFwaVNlbGVjdG9yLmNvbHMgPSBzZWxlY3Rvci5jb2xzOwoJCQkJYXBpU2VsZWN0b3Iub3B0cyA9IHNlbGVjdG9yLm9wdHM7CgkJCQlyZXR1cm4gYXBpOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0sCgkKCQoJCWxhc3RJbmRleE9mOiBfX2FycmF5UHJvdG8ubGFzdEluZGV4T2YgfHwgZnVuY3Rpb24gKG9iaiwgc3RhcnQpCgkJewoJCQkvLyBCaXQgY2hlZWt5Li4uCgkJCXJldHVybiB0aGlzLmluZGV4T2YuYXBwbHkoIHRoaXMudG9BcnJheS5yZXZlcnNlKCksIGFyZ3VtZW50cyApOwoJCX0sCgkKCQoJCWxlbmd0aDogIDAsCgkKCQoJCW1hcDogZnVuY3Rpb24gKCBmbiApCgkJewoJCQl2YXIgYSA9IFtdOwoJCgkJCWlmICggX19hcnJheVByb3RvLm1hcCApIHsKCQkJCWEgPSBfX2FycmF5UHJvdG8ubWFwLmNhbGwoIHRoaXMsIGZuLCB0aGlzICk7CgkJCX0KCQkJZWxzZSB7CgkJCQkvLyBDb21wYXRpYmlsaXR5IGZvciBicm93c2VycyB3aXRob3V0IEVNQ0EtMjUyLTUgKEpTIDEuNikKCQkJCWZvciAoIHZhciBpPTAsIGllbj10aGlzLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCWEucHVzaCggZm4uY2FsbCggdGhpcywgdGhpc1tpXSwgaSApICk7CgkJCQl9CgkJCX0KCQoJCQlyZXR1cm4gbmV3IF9BcGkoIHRoaXMuY29udGV4dCwgYSApOwoJCX0sCgkKCQoJCXBsdWNrOiBmdW5jdGlvbiAoIHByb3AgKQoJCXsKCQkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbiAoIGVsICkgewoJCQkJcmV0dXJuIGVsWyBwcm9wIF07CgkJCX0gKTsKCQl9LAoJCgkJcG9wOiAgICAgX19hcnJheVByb3RvLnBvcCwKCQoJCgkJcHVzaDogICAgX19hcnJheVByb3RvLnB1c2gsCgkKCQoJCS8vIERvZXMgbm90IHJldHVybiBhbiBBUEkgaW5zdGFuY2UKCQlyZWR1Y2U6IF9fYXJyYXlQcm90by5yZWR1Y2UgfHwgZnVuY3Rpb24gKCBmbiwgaW5pdCApCgkJewoJCQlyZXR1cm4gX2ZuUmVkdWNlKCB0aGlzLCBmbiwgaW5pdCwgMCwgdGhpcy5sZW5ndGgsIDEgKTsKCQl9LAoJCgkKCQlyZWR1Y2VSaWdodDogX19hcnJheVByb3RvLnJlZHVjZVJpZ2h0IHx8IGZ1bmN0aW9uICggZm4sIGluaXQgKQoJCXsKCQkJcmV0dXJuIF9mblJlZHVjZSggdGhpcywgZm4sIGluaXQsIHRoaXMubGVuZ3RoLTEsIC0xLCAtMSApOwoJCX0sCgkKCQoJCXJldmVyc2U6IF9fYXJyYXlQcm90by5yZXZlcnNlLAoJCgkKCQkvLyBPYmplY3Qgd2l0aCByb3dzLCBjb2x1bW5zIGFuZCBvcHRzCgkJc2VsZWN0b3I6IG51bGwsCgkKCQoJCXNoaWZ0OiAgIF9fYXJyYXlQcm90by5zaGlmdCwKCQoJCgkJc2xpY2U6IGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIG5ldyBfQXBpKCB0aGlzLmNvbnRleHQsIHRoaXMgKTsKCQl9LAoJCgkKCQlzb3J0OiAgICBfX2FycmF5UHJvdG8uc29ydCwgLy8gPyBuYW1lIC0gb3JkZXI/CgkKCQoJCXNwbGljZTogIF9fYXJyYXlQcm90by5zcGxpY2UsCgkKCQoJCXRvQXJyYXk6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gX19hcnJheVByb3RvLnNsaWNlLmNhbGwoIHRoaXMgKTsKCQl9LAoJCgkKCQl0byQ6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gJCggdGhpcyApOwoJCX0sCgkKCQoJCXRvSlF1ZXJ5OiBmdW5jdGlvbiAoKQoJCXsKCQkJcmV0dXJuICQoIHRoaXMgKTsKCQl9LAoJCgkKCQl1bmlxdWU6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gbmV3IF9BcGkoIHRoaXMuY29udGV4dCwgX3VuaXF1ZSh0aGlzKSApOwoJCX0sCgkKCQoJCXVuc2hpZnQ6IF9fYXJyYXlQcm90by51bnNoaWZ0Cgl9ICk7CgkKCQoJX0FwaS5leHRlbmQgPSBmdW5jdGlvbiAoIHNjb3BlLCBvYmosIGV4dCApCgl7CgkJLy8gT25seSBleHRlbmQgQVBJIGluc3RhbmNlcyBhbmQgc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIEFQSQoJCWlmICggISBleHQubGVuZ3RoIHx8ICEgb2JqIHx8ICggISAob2JqIGluc3RhbmNlb2YgX0FwaSkgJiYgISBvYmouX19kdF93cmFwcGVyICkgKSB7CgkJCXJldHVybjsKCQl9CgkKCQl2YXIKCQkJaSwgaWVuLAoJCQlqLCBqZW4sCgkJCXN0cnVjdCwgaW5uZXIsCgkJCW1ldGhvZFNjb3BpbmcgPSBmdW5jdGlvbiAoIHNjb3BlLCBmbiwgc3RydWMgKSB7CgkJCQlyZXR1cm4gZnVuY3Rpb24gKCkgewoJCQkJCXZhciByZXQgPSBmbi5hcHBseSggc2NvcGUsIGFyZ3VtZW50cyApOwoJCgkJCQkJLy8gTWV0aG9kIGV4dGVuc2lvbgoJCQkJCV9BcGkuZXh0ZW5kKCByZXQsIHJldCwgc3RydWMubWV0aG9kRXh0ICk7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX07CgkJCX07CgkKCQlmb3IgKCBpPTAsIGllbj1leHQubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCXN0cnVjdCA9IGV4dFtpXTsKCQoJCQkvLyBWYWx1ZQoJCQlvYmpbIHN0cnVjdC5uYW1lIF0gPSB0eXBlb2Ygc3RydWN0LnZhbCA9PT0gJ2Z1bmN0aW9uJyA/CgkJCQltZXRob2RTY29waW5nKCBzY29wZSwgc3RydWN0LnZhbCwgc3RydWN0ICkgOgoJCQkJJC5pc1BsYWluT2JqZWN0KCBzdHJ1Y3QudmFsICkgPwoJCQkJCXt9IDoKCQkJCQlzdHJ1Y3QudmFsOwoJCgkJCW9ialsgc3RydWN0Lm5hbWUgXS5fX2R0X3dyYXBwZXIgPSB0cnVlOwoJCgkJCS8vIFByb3BlcnR5IGV4dGVuc2lvbgoJCQlfQXBpLmV4dGVuZCggc2NvcGUsIG9ialsgc3RydWN0Lm5hbWUgXSwgc3RydWN0LnByb3BFeHQgKTsKCQl9Cgl9OwoJCgkKCS8vIEB0b2RvIC0gSXMgdGhlcmUgbmVlZCBmb3IgYW4gYXVnbWVudCBmdW5jdGlvbj8KCS8vIF9BcGkuYXVnbWVudCA9IGZ1bmN0aW9uICggaW5zdCwgbmFtZSApCgkvLyB7CgkvLyAJLy8gRmluZCBzcmMgb2JqZWN0IGluIHRoZSBzdHJ1Y3R1cmUgZnJvbSB0aGUgbmFtZQoJLy8gCXZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoJy4nKTsKCQoJLy8gCV9BcGkuZXh0ZW5kKCBpbnN0LCBvYmogKTsKCS8vIH07CgkKCQoJLy8gICAgIFsKCS8vICAgICAgIHsKCS8vICAgICAgICAgbmFtZTogICAgICAnZGF0YScgICAgICAgICAgICAgICAgLS0gc3RyaW5nICAgLSBQcm9wZXJ0eSBuYW1lCgkvLyAgICAgICAgIHZhbDogICAgICAgZnVuY3Rpb24gKCkge30sICAgICAgIC0tIGZ1bmN0aW9uIC0gQXBpIG1ldGhvZCAob3IgdW5kZWZpbmVkIGlmIGp1c3QgYW4gb2JqZWN0CgkvLyAgICAgICAgIG1ldGhvZEV4dDogWyAuLi4gXSwgICAgICAgICAgICAgIC0tIGFycmF5ICAgIC0gQXJyYXkgb2YgQXBpIG9iamVjdCBkZWZpbml0aW9ucyB0byBleHRlbmQgdGhlIG1ldGhvZCByZXN1bHQKCS8vICAgICAgICAgcHJvcEV4dDogICBbIC4uLiBdICAgICAgICAgICAgICAgLS0gYXJyYXkgICAgLSBBcnJheSBvZiBBcGkgb2JqZWN0IGRlZmluaXRpb25zIHRvIGV4dGVuZCB0aGUgcHJvcGVydHkKCS8vICAgICAgIH0sCgkvLyAgICAgICB7CgkvLyAgICAgICAgIG5hbWU6ICAgICAncm93JwoJLy8gICAgICAgICB2YWw6ICAgICAgIHt9LAoJLy8gICAgICAgICBtZXRob2RFeHQ6IFsgLi4uIF0sCgkvLyAgICAgICAgIHByb3BFeHQ6ICAgWwoJLy8gICAgICAgICAgIHsKCS8vICAgICAgICAgICAgIG5hbWU6ICAgICAgJ2RhdGEnCgkvLyAgICAgICAgICAgICB2YWw6ICAgICAgIGZ1bmN0aW9uICgpIHt9LAoJLy8gICAgICAgICAgICAgbWV0aG9kRXh0OiBbIC4uLiBdLAoJLy8gICAgICAgICAgICAgcHJvcEV4dDogICBbIC4uLiBdCgkvLyAgICAgICAgICAgfSwKCS8vICAgICAgICAgICAuLi4KCS8vICAgICAgICAgXQoJLy8gICAgICAgfQoJLy8gICAgIF0KCQoJX0FwaS5yZWdpc3RlciA9IF9hcGlfcmVnaXN0ZXIgPSBmdW5jdGlvbiAoIG5hbWUsIHZhbCApCgl7CgkJaWYgKCAkLmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJZm9yICggdmFyIGo9MCwgamVuPW5hbWUubGVuZ3RoIDsgajxqZW4gOyBqKysgKSB7CgkJCQlfQXBpLnJlZ2lzdGVyKCBuYW1lW2pdLCB2YWwgKTsKCQkJfQoJCQlyZXR1cm47CgkJfQoJCgkJdmFyCgkJCWksIGllbiwKCQkJaGVpciA9IG5hbWUuc3BsaXQoJy4nKSwKCQkJc3RydWN0ID0gX19hcGlTdHJ1Y3QsCgkJCWtleSwgbWV0aG9kOwoJCgkJdmFyIGZpbmQgPSBmdW5jdGlvbiAoIHNyYywgbmFtZSApIHsKCQkJZm9yICggdmFyIGk9MCwgaWVuPXNyYy5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCWlmICggc3JjW2ldLm5hbWUgPT09IG5hbWUgKSB7CgkJCQkJcmV0dXJuIHNyY1tpXTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9OwoJCgkJZm9yICggaT0wLCBpZW49aGVpci5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJbWV0aG9kID0gaGVpcltpXS5pbmRleE9mKCcoKScpICE9PSAtMTsKCQkJa2V5ID0gbWV0aG9kID8KCQkJCWhlaXJbaV0ucmVwbGFjZSgnKCknLCAnJykgOgoJCQkJaGVpcltpXTsKCQoJCQl2YXIgc3JjID0gZmluZCggc3RydWN0LCBrZXkgKTsKCQkJaWYgKCAhIHNyYyApIHsKCQkJCXNyYyA9IHsKCQkJCQluYW1lOiAgICAgIGtleSwKCQkJCQl2YWw6ICAgICAgIHt9LAoJCQkJCW1ldGhvZEV4dDogW10sCgkJCQkJcHJvcEV4dDogICBbXQoJCQkJfTsKCQkJCXN0cnVjdC5wdXNoKCBzcmMgKTsKCQkJfQoJCgkJCWlmICggaSA9PT0gaWVuLTEgKSB7CgkJCQlzcmMudmFsID0gdmFsOwoJCQl9CgkJCWVsc2UgewoJCQkJc3RydWN0ID0gbWV0aG9kID8KCQkJCQlzcmMubWV0aG9kRXh0IDoKCQkJCQlzcmMucHJvcEV4dDsKCQkJfQoJCX0KCX07CgkKCQoJX0FwaS5yZWdpc3RlclBsdXJhbCA9IF9hcGlfcmVnaXN0ZXJQbHVyYWwgPSBmdW5jdGlvbiAoIHBsdXJhbE5hbWUsIHNpbmd1bGFyTmFtZSwgdmFsICkgewoJCV9BcGkucmVnaXN0ZXIoIHBsdXJhbE5hbWUsIHZhbCApOwoJCgkJX0FwaS5yZWdpc3Rlciggc2luZ3VsYXJOYW1lLCBmdW5jdGlvbiAoKSB7CgkJCXZhciByZXQgPSB2YWwuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCgkJCWlmICggcmV0ID09PSB0aGlzICkgewoJCQkJLy8gUmV0dXJuZWQgaXRlbSBpcyB0aGUgQVBJIGluc3RhbmNlIHRoYXQgd2FzIHBhc3NlZCBpbiwgcmV0dXJuIGl0CgkJCQlyZXR1cm4gdGhpczsKCQkJfQoJCQllbHNlIGlmICggcmV0IGluc3RhbmNlb2YgX0FwaSApIHsKCQkJCS8vIE5ldyBBUEkgaW5zdGFuY2UgcmV0dXJuZWQsIHdhbnQgdGhlIHZhbHVlIGZyb20gdGhlIGZpcnN0IGl0ZW0KCQkJCS8vIGluIHRoZSByZXR1cm5lZCBhcnJheSBmb3IgdGhlIHNpbmd1bGFyIHJlc3VsdC4KCQkJCXJldHVybiByZXQubGVuZ3RoID8KCQkJCQkkLmlzQXJyYXkoIHJldFswXSApID8KCQkJCQkJbmV3IF9BcGkoIHJldC5jb250ZXh0LCByZXRbMF0gKSA6IC8vIEFycmF5IHJlc3VsdHMgYXJlICdlbmhhbmNlZCcKCQkJCQkJcmV0WzBdIDoKCQkJCQl1bmRlZmluZWQ7CgkJCX0KCQoJCQkvLyBOb24tQVBJIHJldHVybiAtIGp1c3QgZmlyZSBpdCBiYWNrCgkJCXJldHVybiByZXQ7CgkJfSApOwoJfTsKCQoJCgkvKioKCSAqIFNlbGVjdG9yIGZvciBIVE1MIHRhYmxlcy4gQXBwbHkgdGhlIGdpdmVuIHNlbGVjdG9yIHRvIHRoZSBnaXZlIGFycmF5IG9mCgkgKiBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdHMuCgkgKgoJICogQHBhcmFtIHtzdHJpbmd8aW50ZWdlcn0gW3NlbGVjdG9yXSBqUXVlcnkgc2VsZWN0b3Igc3RyaW5nIG9yIGludGVnZXIKCSAqIEBwYXJhbSAge2FycmF5fSBBcnJheSBvZiBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdHMgdG8gYmUgZmlsdGVyZWQKCSAqIEByZXR1cm4ge2FycmF5fQoJICogQGlnbm9yZQoJICovCgl2YXIgX190YWJsZV9zZWxlY3RvciA9IGZ1bmN0aW9uICggc2VsZWN0b3IsIGEgKQoJewoJCS8vIEludGVnZXIgaXMgdXNlZCB0byBwaWNrIG91dCBhIHRhYmxlIGJ5IGluZGV4CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICdudW1iZXInICkgewoJCQlyZXR1cm4gWyBhWyBzZWxlY3RvciBdIF07CgkJfQoJCgkJLy8gUGVyZm9ybSBhIGpRdWVyeSBzZWxlY3RvciBvbiB0aGUgdGFibGUgbm9kZXMKCQl2YXIgbm9kZXMgPSAkLm1hcCggYSwgZnVuY3Rpb24gKGVsLCBpKSB7CgkJCXJldHVybiBlbC5uVGFibGU7CgkJfSApOwoJCgkJcmV0dXJuICQobm9kZXMpCgkJCS5maWx0ZXIoIHNlbGVjdG9yICkKCQkJLm1hcCggZnVuY3Rpb24gKGkpIHsKCQkJCS8vIE5lZWQgdG8gdHJhbnNsYXRlIGJhY2sgZnJvbSB0aGUgdGFibGUgbm9kZSB0byB0aGUgc2V0dGluZ3MKCQkJCXZhciBpZHggPSAkLmluQXJyYXkoIHRoaXMsIG5vZGVzICk7CgkJCQlyZXR1cm4gYVsgaWR4IF07CgkJCX0gKQoJCQkudG9BcnJheSgpOwoJfTsKCQoJCgkKCS8qKgoJICogQ29udGV4dCBzZWxlY3RvciBmb3IgdGhlIEFQSSdzIGNvbnRleHQgKGkuZS4gdGhlIHRhYmxlcyB0aGUgQVBJIGluc3RhbmNlCgkgKiByZWZlcnMgdG8uCgkgKgoJICogQG5hbWUgICAgRGF0YVRhYmxlLkFwaSN0YWJsZXMKCSAqIEBwYXJhbSB7c3RyaW5nfGludGVnZXJ9IFtzZWxlY3Rvcl0gU2VsZWN0b3IgdG8gcGljayB3aGljaCB0YWJsZXMgdGhlIGl0ZXJhdG9yCgkgKiAgIHNob3VsZCBvcGVyYXRlIG9uLiBJZiBub3QgZ2l2ZW4sIGFsbCB0YWJsZXMgaW4gdGhlIGN1cnJlbnQgY29udGV4dCBhcmUKCSAqICAgdXNlZC4gVGhpcyBjYW4gYmUgZ2l2ZW4gYXMgYSBqUXVlcnkgc2VsZWN0b3IgKGZvciBleGFtcGxlIGAnOmd0KDApJ2ApIHRvCgkgKiAgIHNlbGVjdCBtdWx0aXBsZSB0YWJsZXMgb3IgYXMgYW4gaW50ZWdlciB0byBzZWxlY3QgYSBzaW5nbGUgdGFibGUuCgkgKiBAcmV0dXJucyB7RGF0YVRhYmxlLkFwaX0gUmV0dXJucyBhIG5ldyBBUEkgaW5zdGFuY2UgaWYgYSBzZWxlY3RvciBpcyBnaXZlbi4KCSAqLwoJX2FwaV9yZWdpc3RlciggJ3RhYmxlcygpJywgZnVuY3Rpb24gKCBzZWxlY3RvciApIHsKCQkvLyBBIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkIGlmIHRoZXJlIHdhcyBhIHNlbGVjdG9yIHNwZWNpZmllZAoJCXJldHVybiBzZWxlY3RvciA/CgkJCW5ldyBfQXBpKCBfX3RhYmxlX3NlbGVjdG9yKCBzZWxlY3RvciwgdGhpcy5jb250ZXh0ICkgKSA6CgkJCXRoaXM7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3RhYmxlKCknLCBmdW5jdGlvbiAoIHNlbGVjdG9yICkgewoJCXZhciB0YWJsZXMgPSB0aGlzLnRhYmxlcyggc2VsZWN0b3IgKTsKCQl2YXIgY3R4ID0gdGFibGVzLmNvbnRleHQ7CgkKCQkvLyBUcnVuY2F0ZSB0byB0aGUgZmlyc3QgbWF0Y2hlZCB0YWJsZQoJCXJldHVybiBjdHgubGVuZ3RoID8KCQkJbmV3IF9BcGkoIGN0eFswXSApIDoKCQkJdGFibGVzOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICd0YWJsZXMoKS5ub2RlcygpJywgJ3RhYmxlKCkubm9kZSgpJyAsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBjdHggKSB7CgkJCXJldHVybiBjdHgublRhYmxlOwoJCX0sIDEgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAndGFibGVzKCkuYm9keSgpJywgJ3RhYmxlKCkuYm9keSgpJyAsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBjdHggKSB7CgkJCXJldHVybiBjdHgublRCb2R5OwoJCX0sIDEgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAndGFibGVzKCkuaGVhZGVyKCknLCAndGFibGUoKS5oZWFkZXIoKScgLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggY3R4ICkgewoJCQlyZXR1cm4gY3R4Lm5USGVhZDsKCQl9LCAxICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ3RhYmxlcygpLmZvb3RlcigpJywgJ3RhYmxlKCkuZm9vdGVyKCknICwgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIGN0eCApIHsKCQkJcmV0dXJuIGN0eC5uVEZvb3Q7CgkJfSwgMSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICd0YWJsZXMoKS5jb250YWluZXJzKCknLCAndGFibGUoKS5jb250YWluZXIoKScgLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggY3R4ICkgewoJCQlyZXR1cm4gY3R4Lm5UYWJsZVdyYXBwZXI7CgkJfSwgMSApOwoJfSApOwoJCgkKCQoJLyoqCgkgKiBSZWRyYXcgdGhlIHRhYmxlcyBpbiB0aGUgY3VycmVudCBjb250ZXh0LgoJICovCglfYXBpX3JlZ2lzdGVyKCAnZHJhdygpJywgZnVuY3Rpb24gKCBwYWdpbmcgKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MgKSB7CgkJCWlmICggcGFnaW5nID09PSAncGFnZScgKSB7CgkJCQlfZm5EcmF3KCBzZXR0aW5ncyApOwoJCQl9CgkJCWVsc2UgewoJCQkJaWYgKCB0eXBlb2YgcGFnaW5nID09PSAnc3RyaW5nJyApIHsKCQkJCQlwYWdpbmcgPSBwYWdpbmcgPT09ICdmdWxsLWhvbGQnID8KCQkJCQkJZmFsc2UgOgoJCQkJCQl0cnVlOwoJCQkJfQoJCgkJCQlfZm5SZURyYXcoIHNldHRpbmdzLCBwYWdpbmc9PT1mYWxzZSApOwoJCQl9CgkJfSApOwoJfSApOwoJCgkKCQoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnQgcGFnZSBpbmRleC4KCSAqCgkgKiBAcmV0dXJuIHtpbnRlZ2VyfSBDdXJyZW50IHBhZ2UgaW5kZXggKHplcm8gYmFzZWQpCgkgKi8vKioKCSAqIFNldCB0aGUgY3VycmVudCBwYWdlLgoJICoKCSAqIE5vdGUgdGhhdCBpZiB5b3UgYXR0ZW1wdCB0byBzaG93IGEgcGFnZSB3aGljaCBkb2VzIG5vdCBleGlzdCwgRGF0YVRhYmxlcyB3aWxsCgkgKiBub3QgdGhyb3cgYW4gZXJyb3IsIGJ1dCByYXRoZXIgcmVzZXQgdGhlIHBhZ2luZy4KCSAqCgkgKiBAcGFyYW0ge2ludGVnZXJ8c3RyaW5nfSBhY3Rpb24gVGhlIHBhZ2luZyBhY3Rpb24gdG8gdGFrZS4gVGhpcyBjYW4gYmUgb25lIG9mOgoJICogICogYGludGVnZXJgIC0gVGhlIHBhZ2UgaW5kZXggdG8ganVtcCB0bwoJICogICogYHN0cmluZ2AgLSBBbiBhY3Rpb24gdG8gdGFrZToKCSAqICAgICogYGZpcnN0YCAtIEp1bXAgdG8gZmlyc3QgcGFnZS4KCSAqICAgICogYG5leHRgIC0gSnVtcCB0byB0aGUgbmV4dCBwYWdlCgkgKiAgICAqIGBwcmV2aW91c2AgLSBKdW1wIHRvIHByZXZpb3VzIHBhZ2UKCSAqICAgICogYGxhc3RgIC0gSnVtcCB0byB0aGUgbGFzdCBwYWdlLgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdwYWdlKCknLCBmdW5jdGlvbiAoIGFjdGlvbiApIHsKCQlpZiAoIGFjdGlvbiA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4gdGhpcy5wYWdlLmluZm8oKS5wYWdlOyAvLyBub3QgYW4gZXhwZW5zaXZlIGNhbGwKCQl9CgkKCQkvLyBlbHNlLCBoYXZlIGFuIGFjdGlvbiB0byB0YWtlIG9uIGFsbCB0YWJsZXMKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJX2ZuUGFnZUNoYW5nZSggc2V0dGluZ3MsIGFjdGlvbiApOwoJCX0gKTsKCX0gKTsKCQoJCgkvKioKCSAqIFBhZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpcnN0IHRhYmxlIGluIHRoZSBjdXJyZW50IGNvbnRleHQuCgkgKgoJICogSWYgeW91IHJlcXVpcmUgcGFnaW5nIGluZm9ybWF0aW9uIGZvciBhbm90aGVyIHRhYmxlLCB1c2UgdGhlIGB0YWJsZSgpYCBtZXRob2QKCSAqIHdpdGggYSBzdWl0YWJsZSBzZWxlY3Rvci4KCSAqCgkgKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBzZXQ6CgkgKiAgKiBgcGFnZWAgLSBDdXJyZW50IHBhZ2UgaW5kZXggKHplcm8gYmFzZWQgLSBpLmUuIHRoZSBmaXJzdCBwYWdlIGlzIGAwYCkKCSAqICAqIGBwYWdlc2AgLSBUb3RhbCBudW1iZXIgb2YgcGFnZXMKCSAqICAqIGBzdGFydGAgLSBEaXNwbGF5IGluZGV4IGZvciB0aGUgZmlyc3QgcmVjb3JkIHNob3duIG9uIHRoZSBjdXJyZW50IHBhZ2UKCSAqICAqIGBlbmRgIC0gRGlzcGxheSBpbmRleCBmb3IgdGhlIGxhc3QgcmVjb3JkIHNob3duIG9uIHRoZSBjdXJyZW50IHBhZ2UKCSAqICAqIGBsZW5ndGhgIC0gRGlzcGxheSBsZW5ndGggKG51bWJlciBvZiByZWNvcmRzKS4gTm90ZSB0aGF0IGdlbmVyYWxseSBgc3RhcnQKCSAqICAgICsgbGVuZ3RoID0gZW5kYCwgYnV0IHRoaXMgaXMgbm90IGFsd2F5cyB0cnVlLCBmb3IgZXhhbXBsZSBpZiB0aGVyZSBhcmUKCSAqICAgIG9ubHkgMiByZWNvcmRzIHRvIHNob3cgb24gdGhlIGZpbmFsIHBhZ2UsIHdpdGggYSBsZW5ndGggb2YgMTAuCgkgKiAgKiBgcmVjb3Jkc1RvdGFsYCAtIEZ1bGwgZGF0YSBzZXQgbGVuZ3RoCgkgKiAgKiBgcmVjb3Jkc0Rpc3BsYXlgIC0gRGF0YSBzZXQgbGVuZ3RoIG9uY2UgdGhlIGN1cnJlbnQgZmlsdGVyaW5nIGNyaXRlcmlvbgoJICogICAgYXJlIGFwcGxpZWQuCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdwYWdlLmluZm8oKScsIGZ1bmN0aW9uICggYWN0aW9uICkgewoJCWlmICggdGhpcy5jb250ZXh0Lmxlbmd0aCA9PT0gMCApIHsKCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQl9CgkKCQl2YXIKCQkJc2V0dGluZ3MgICA9IHRoaXMuY29udGV4dFswXSwKCQkJc3RhcnQgICAgICA9IHNldHRpbmdzLl9pRGlzcGxheVN0YXJ0LAoJCQlsZW4gICAgICAgID0gc2V0dGluZ3Mub0ZlYXR1cmVzLmJQYWdpbmF0ZSA/IHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCA6IC0xLAoJCQl2aXNSZWNvcmRzID0gc2V0dGluZ3MuZm5SZWNvcmRzRGlzcGxheSgpLAoJCQlhbGwgICAgICAgID0gbGVuID09PSAtMTsKCQoJCXJldHVybiB7CgkJCSJwYWdlIjogICAgICAgICAgIGFsbCA/IDAgOiBNYXRoLmZsb29yKCBzdGFydCAvIGxlbiApLAoJCQkicGFnZXMiOiAgICAgICAgICBhbGwgPyAxIDogTWF0aC5jZWlsKCB2aXNSZWNvcmRzIC8gbGVuICksCgkJCSJzdGFydCI6ICAgICAgICAgIHN0YXJ0LAoJCQkiZW5kIjogICAgICAgICAgICBzZXR0aW5ncy5mbkRpc3BsYXlFbmQoKSwKCQkJImxlbmd0aCI6ICAgICAgICAgbGVuLAoJCQkicmVjb3Jkc1RvdGFsIjogICBzZXR0aW5ncy5mblJlY29yZHNUb3RhbCgpLAoJCQkicmVjb3Jkc0Rpc3BsYXkiOiB2aXNSZWNvcmRzLAoJCQkic2VydmVyU2lkZSI6ICAgICBfZm5EYXRhU291cmNlKCBzZXR0aW5ncyApID09PSAnc3NwJwoJCX07Cgl9ICk7CgkKCQoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnQgcGFnZSBsZW5ndGguCgkgKgoJICogQHJldHVybiB7aW50ZWdlcn0gQ3VycmVudCBwYWdlIGxlbmd0aC4gTm90ZSBgLTFgIGluZGljYXRlcyB0aGF0IGFsbCByZWNvcmRzCgkgKiAgIGFyZSB0byBiZSBzaG93bi4KCSAqLy8qKgoJICogU2V0IHRoZSBjdXJyZW50IHBhZ2UgbGVuZ3RoLgoJICoKCSAqIEBwYXJhbSB7aW50ZWdlcn0gUGFnZSBsZW5ndGggdG8gc2V0LiBVc2UgYC0xYCB0byBzaG93IGFsbCByZWNvcmRzLgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdwYWdlLmxlbigpJywgZnVuY3Rpb24gKCBsZW4gKSB7CgkJLy8gTm90ZSB0aGF0IHdlIGNhbid0IGNhbGwgdGhpcyBmdW5jdGlvbiAnbGVuZ3RoKCknIGJlY2F1c2UgYGxlbmd0aGAKCQkvLyBpcyBhIEphdmFzY3JpcHQgcHJvcGVydHkgb2YgZnVuY3Rpb25zIHdoaWNoIGRlZmluZXMgaG93IG1hbnkgYXJndW1lbnRzCgkJLy8gdGhlIGZ1bmN0aW9uIGV4cGVjdHMuCgkJaWYgKCBsZW4gPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIHRoaXMuY29udGV4dC5sZW5ndGggIT09IDAgPwoJCQkJdGhpcy5jb250ZXh0WzBdLl9pRGlzcGxheUxlbmd0aCA6CgkJCQl1bmRlZmluZWQ7CgkJfQoJCgkJLy8gZWxzZSwgc2V0IHRoZSBwYWdlIGxlbmd0aAoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlfZm5MZW5ndGhDaGFuZ2UoIHNldHRpbmdzLCBsZW4gKTsKCQl9ICk7Cgl9ICk7CgkKCQoJCgl2YXIgX19yZWxvYWQgPSBmdW5jdGlvbiAoIHNldHRpbmdzLCBob2xkUG9zaXRpb24sIGNhbGxiYWNrICkgewoJCS8vIFVzZSB0aGUgZHJhdyBldmVudCB0byB0cmlnZ2VyIGEgY2FsbGJhY2sKCQlpZiAoIGNhbGxiYWNrICkgewoJCQl2YXIgYXBpID0gbmV3IF9BcGkoIHNldHRpbmdzICk7CgkKCQkJYXBpLm9uZSggJ2RyYXcnLCBmdW5jdGlvbiAoKSB7CgkJCQljYWxsYmFjayggYXBpLmFqYXguanNvbigpICk7CgkJCX0gKTsKCQl9CgkKCQlpZiAoIF9mbkRhdGFTb3VyY2UoIHNldHRpbmdzICkgPT0gJ3NzcCcgKSB7CgkJCV9mblJlRHJhdyggc2V0dGluZ3MsIGhvbGRQb3NpdGlvbiApOwoJCX0KCQllbHNlIHsKCQkJX2ZuUHJvY2Vzc2luZ0Rpc3BsYXkoIHNldHRpbmdzLCB0cnVlICk7CgkKCQkJLy8gQ2FuY2VsIGFuIGV4aXN0aW5nIHJlcXVlc3QKCQkJdmFyIHhociA9IHNldHRpbmdzLmpxWEhSOwoJCQlpZiAoIHhociAmJiB4aHIucmVhZHlTdGF0ZSAhPT0gNCApIHsKCQkJCXhoci5hYm9ydCgpOwoJCQl9CgkKCQkJLy8gVHJpZ2dlciB4aHIKCQkJX2ZuQnVpbGRBamF4KCBzZXR0aW5ncywgW10sIGZ1bmN0aW9uKCBqc29uICkgewoJCQkJX2ZuQ2xlYXJUYWJsZSggc2V0dGluZ3MgKTsKCQoJCQkJdmFyIGRhdGEgPSBfZm5BamF4RGF0YVNyYyggc2V0dGluZ3MsIGpzb24gKTsKCQkJCWZvciAoIHZhciBpPTAsIGllbj1kYXRhLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCV9mbkFkZERhdGEoIHNldHRpbmdzLCBkYXRhW2ldICk7CgkJCQl9CgkKCQkJCV9mblJlRHJhdyggc2V0dGluZ3MsIGhvbGRQb3NpdGlvbiApOwoJCQkJX2ZuUHJvY2Vzc2luZ0Rpc3BsYXkoIHNldHRpbmdzLCBmYWxzZSApOwoJCQl9ICk7CgkJfQoJfTsKCQoJCgkvKioKCSAqIEdldCB0aGUgSlNPTiByZXNwb25zZSBmcm9tIHRoZSBsYXN0IEFqYXggcmVxdWVzdCB0aGF0IERhdGFUYWJsZXMgbWFkZSB0byB0aGUKCSAqIHNlcnZlci4gTm90ZSB0aGF0IHRoaXMgcmV0dXJucyB0aGUgSlNPTiBmcm9tIHRoZSBmaXJzdCB0YWJsZSBpbiB0aGUgY3VycmVudAoJICogY29udGV4dC4KCSAqCgkgKiBAcmV0dXJuIHtvYmplY3R9IEpTT04gcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLgoJICovCglfYXBpX3JlZ2lzdGVyKCAnYWpheC5qc29uKCknLCBmdW5jdGlvbiAoKSB7CgkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQoJCWlmICggY3R4Lmxlbmd0aCA+IDAgKSB7CgkJCXJldHVybiBjdHhbMF0uanNvbjsKCQl9CgkKCQkvLyBlbHNlIHJldHVybiB1bmRlZmluZWQ7Cgl9ICk7CgkKCQoJLyoqCgkgKiBHZXQgdGhlIGRhdGEgc3VibWl0dGVkIGluIHRoZSBsYXN0IEFqYXggcmVxdWVzdAoJICovCglfYXBpX3JlZ2lzdGVyKCAnYWpheC5wYXJhbXMoKScsIGZ1bmN0aW9uICgpIHsKCQl2YXIgY3R4ID0gdGhpcy5jb250ZXh0OwoJCgkJaWYgKCBjdHgubGVuZ3RoID4gMCApIHsKCQkJcmV0dXJuIGN0eFswXS5vQWpheERhdGE7CgkJfQoJCgkJLy8gZWxzZSByZXR1cm4gdW5kZWZpbmVkOwoJfSApOwoJCgkKCS8qKgoJICogUmVsb2FkIHRhYmxlcyBmcm9tIHRoZSBBamF4IGRhdGEgc291cmNlLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsCgkgKiBhdXRvbWF0aWNhbGx5IHJlLWRyYXcgdGhlIHRhYmxlIHdoZW4gdGhlIHJlbW90ZSBkYXRhIGhhcyBiZWVuIGxvYWRlZC4KCSAqCgkgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXNldD10cnVlXSBSZXNldCAoZGVmYXVsdCkgb3IgaG9sZCB0aGUgY3VycmVudCBwYWdpbmcKCSAqICAgcG9zaXRpb24uIEEgZnVsbCByZS1zb3J0IGFuZCByZS1maWx0ZXIgaXMgcGVyZm9ybWVkIHdoZW4gdGhpcyBtZXRob2QgaXMKCSAqICAgY2FsbGVkLCB3aGljaCBpcyB3aHkgdGhlIHBhZ2luYXRpb24gcmVzZXQgaXMgdGhlIGRlZmF1bHQgYWN0aW9uLgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdhamF4LnJlbG9hZCgpJywgZnVuY3Rpb24gKCBjYWxsYmFjaywgcmVzZXRQYWdpbmcgKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uIChzZXR0aW5ncykgewoJCQlfX3JlbG9hZCggc2V0dGluZ3MsIHJlc2V0UGFnaW5nPT09Zg=="
3NAxHUEaM6RAG7rVDPL9L6DFZWkrqFtY98t: jquery.dataTables.js?4?0?2: "base64:IHRoaXMgY29sdW1uPwoJCQl2YXIgc29ydElkeCA9ICQuaW5BcnJheSggY29sSWR4LCBfcGx1Y2soc29ydGluZywgJzAnKSApOwoJCgkJCWlmICggc29ydElkeCAhPT0gLTEgKSB7CgkJCQkvLyBZZXMsIG1vZGlmeSB0aGUgc29ydAoJCQkJbmV4dFNvcnRJZHggPSBuZXh0KCBzb3J0aW5nW3NvcnRJZHhdLCB0cnVlICk7CgkKCQkJCWlmICggbmV4dFNvcnRJZHggPT09IG51bGwgJiYgc29ydGluZy5sZW5ndGggPT09IDEgKSB7CgkJCQkJbmV4dFNvcnRJZHggPSAwOyAvLyBjYW4ndCByZW1vdmUgc29ydGluZyBjb21wbGV0ZWx5CgkJCQl9CgkKCQkJCWlmICggbmV4dFNvcnRJZHggPT09IG51bGwgKSB7CgkJCQkJc29ydGluZy5zcGxpY2UoIHNvcnRJZHgsIDEgKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXNvcnRpbmdbc29ydElkeF1bMV0gPSBhc1NvcnRpbmdbIG5leHRTb3J0SWR4IF07CgkJCQkJc29ydGluZ1tzb3J0SWR4XS5faWR4ID0gbmV4dFNvcnRJZHg7CgkJCQl9CgkJCX0KCQkJZWxzZSB7CgkJCQkvLyBObyBzb3J0IG9uIHRoaXMgY29sdW1uIHlldAoJCQkJc29ydGluZy5wdXNoKCBbIGNvbElkeCwgYXNTb3J0aW5nWzBdLCAwIF0gKTsKCQkJCXNvcnRpbmdbc29ydGluZy5sZW5ndGgtMV0uX2lkeCA9IDA7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIHNvcnRpbmcubGVuZ3RoICYmIHNvcnRpbmdbMF1bMF0gPT0gY29sSWR4ICkgewoJCQkvLyBTaW5nbGUgY29sdW1uIC0gYWxyZWFkeSBzb3J0aW5nIG9uIHRoaXMgY29sdW1uLCBtb2RpZnkgdGhlIHNvcnQKCQkJbmV4dFNvcnRJZHggPSBuZXh0KCBzb3J0aW5nWzBdICk7CgkKCQkJc29ydGluZy5sZW5ndGggPSAxOwoJCQlzb3J0aW5nWzBdWzFdID0gYXNTb3J0aW5nWyBuZXh0U29ydElkeCBdOwoJCQlzb3J0aW5nWzBdLl9pZHggPSBuZXh0U29ydElkeDsKCQl9CgkJZWxzZSB7CgkJCS8vIFNpbmdsZSBjb2x1bW4gLSBzb3J0IG9ubHkgb24gdGhpcyBjb2x1bW4KCQkJc29ydGluZy5sZW5ndGggPSAwOwoJCQlzb3J0aW5nLnB1c2goIFsgY29sSWR4LCBhc1NvcnRpbmdbMF0gXSApOwoJCQlzb3J0aW5nWzBdLl9pZHggPSAwOwoJCX0KCQoJCS8vIFJ1biB0aGUgc29ydCBieSBjYWxsaW5nIGEgZnVsbCByZWRyYXcKCQlfZm5SZURyYXcoIHNldHRpbmdzICk7CgkKCQkvLyBjYWxsYmFjayB1c2VkIGZvciBhc3luYyB1c2VyIGludGVyYWN0aW9uCgkJaWYgKCB0eXBlb2YgY2FsbGJhY2sgPT0gJ2Z1bmN0aW9uJyApIHsKCQkJY2FsbGJhY2soIHNldHRpbmdzICk7CgkJfQoJfQoJCgkKCS8qKgoJICogQXR0YWNoIGEgc29ydCBoYW5kbGVyIChjbGljaykgdG8gYSBub2RlCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtub2RlfSBhdHRhY2hUbyBub2RlIHRvIGF0dGFjaCB0aGUgaGFuZGxlciB0bwoJICogIEBwYXJhbSB7aW50fSBjb2xJZHggY29sdW1uIHNvcnRpbmcgaW5kZXgKCSAqICBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIGNhbGxiYWNrIGZ1bmN0aW9uCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mblNvcnRBdHRhY2hMaXN0ZW5lciAoIHNldHRpbmdzLCBhdHRhY2hUbywgY29sSWR4LCBjYWxsYmFjayApCgl7CgkJdmFyIGNvbCA9IHNldHRpbmdzLmFvQ29sdW1uc1sgY29sSWR4IF07CgkKCQlfZm5CaW5kQWN0aW9uKCBhdHRhY2hUbywge30sIGZ1bmN0aW9uIChlKSB7CgkJCS8qIElmIHRoZSBjb2x1bW4gaXMgbm90IHNvcnRhYmxlIC0gZG9uJ3QgdG8gYW55dGhpbmcgKi8KCQkJaWYgKCBjb2wuYlNvcnRhYmxlID09PSBmYWxzZSApIHsKCQkJCXJldHVybjsKCQkJfQoJCgkJCS8vIElmIHByb2Nlc3NpbmcgaXMgZW5hYmxlZCB1c2UgYSB0aW1lb3V0IHRvIGFsbG93IHRoZSBwcm9jZXNzaW5nCgkJCS8vIGRpc3BsYXkgdG8gYmUgc2hvd24gLSBvdGhlcndpc2UgdG8gaXQgc3luY2hyb25vdXNseQoJCQlpZiAoIHNldHRpbmdzLm9GZWF0dXJlcy5iUHJvY2Vzc2luZyApIHsKCQkJCV9mblByb2Nlc3NpbmdEaXNwbGF5KCBzZXR0aW5ncywgdHJ1ZSApOwoJCgkJCQlzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQkJCQlfZm5Tb3J0TGlzdGVuZXIoIHNldHRpbmdzLCBjb2xJZHgsIGUuc2hpZnRLZXksIGNhbGxiYWNrICk7CgkKCQkJCQkvLyBJbiBzZXJ2ZXItc2lkZSBwcm9jZXNzaW5nLCB0aGUgZHJhdyBjYWxsYmFjayB3aWxsIHJlbW92ZSB0aGUKCQkJCQkvLyBwcm9jZXNzaW5nIGRpc3BsYXkKCQkJCQlpZiAoIF9mbkRhdGFTb3VyY2UoIHNldHRpbmdzICkgIT09ICdzc3AnICkgewoJCQkJCQlfZm5Qcm9jZXNzaW5nRGlzcGxheSggc2V0dGluZ3MsIGZhbHNlICk7CgkJCQkJfQoJCQkJfSwgMCApOwoJCQl9CgkJCWVsc2UgewoJCQkJX2ZuU29ydExpc3RlbmVyKCBzZXR0aW5ncywgY29sSWR4LCBlLnNoaWZ0S2V5LCBjYWxsYmFjayApOwoJCQl9CgkJfSApOwoJfQoJCgkKCS8qKgoJICogU2V0IHRoZSBzb3J0aW5nIGNsYXNzZXMgb24gdGFibGUncyBib2R5LCBOb3RlOiBpdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbgoJICogd2hlbiBiU29ydCBhbmQgYlNvcnRDbGFzc2VzIGFyZSBmYWxzZQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuU29ydGluZ0NsYXNzZXMoIHNldHRpbmdzICkKCXsKCQl2YXIgb2xkU29ydCA9IHNldHRpbmdzLmFMYXN0U29ydDsKCQl2YXIgc29ydENsYXNzID0gc2V0dGluZ3Mub0NsYXNzZXMuc1NvcnRDb2x1bW47CgkJdmFyIHNvcnQgPSBfZm5Tb3J0RmxhdHRlbiggc2V0dGluZ3MgKTsKCQl2YXIgZmVhdHVyZXMgPSBzZXR0aW5ncy5vRmVhdHVyZXM7CgkJdmFyIGksIGllbiwgY29sSWR4OwoJCgkJaWYgKCBmZWF0dXJlcy5iU29ydCAmJiBmZWF0dXJlcy5iU29ydENsYXNzZXMgKSB7CgkJCS8vIFJlbW92ZSBvbGQgc29ydGluZyBjbGFzc2VzCgkJCWZvciAoIGk9MCwgaWVuPW9sZFNvcnQubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQljb2xJZHggPSBvbGRTb3J0W2ldLnNyYzsKCQoJCQkJLy8gUmVtb3ZlIGNvbHVtbiBzb3J0aW5nCgkJCQkkKCBfcGx1Y2soIHNldHRpbmdzLmFvRGF0YSwgJ2FuQ2VsbHMnLCBjb2xJZHggKSApCgkJCQkJLnJlbW92ZUNsYXNzKCBzb3J0Q2xhc3MgKyAoaTwyID8gaSsxIDogMykgKTsKCQkJfQoJCgkJCS8vIEFkZCBuZXcgY29sdW1uIHNvcnRpbmcKCQkJZm9yICggaT0wLCBpZW49c29ydC5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCWNvbElkeCA9IHNvcnRbaV0uc3JjOwoJCgkJCQkkKCBfcGx1Y2soIHNldHRpbmdzLmFvRGF0YSwgJ2FuQ2VsbHMnLCBjb2xJZHggKSApCgkJCQkJLmFkZENsYXNzKCBzb3J0Q2xhc3MgKyAoaTwyID8gaSsxIDogMykgKTsKCQkJfQoJCX0KCQoJCXNldHRpbmdzLmFMYXN0U29ydCA9IHNvcnQ7Cgl9CgkKCQoJLy8gR2V0IHRoZSBkYXRhIHRvIHNvcnQgYSBjb2x1bW4sIGJlIGl0IGZyb20gY2FjaGUsIGZyZXNoIChwb3B1bGF0aW5nIHRoZQoJLy8gY2FjaGUpLCBvciBmcm9tIGEgc29ydCBmb3JtYXR0ZXIKCWZ1bmN0aW9uIF9mblNvcnREYXRhKCBzZXR0aW5ncywgaWR4ICkKCXsKCQkvLyBDdXN0b20gc29ydGluZyBmdW5jdGlvbiAtIHByb3ZpZGVkIGJ5IHRoZSBzb3J0IGRhdGEgdHlwZQoJCXZhciBjb2x1bW4gPSBzZXR0aW5ncy5hb0NvbHVtbnNbIGlkeCBdOwoJCXZhciBjdXN0b21Tb3J0ID0gRGF0YVRhYmxlLmV4dC5vcmRlclsgY29sdW1uLnNTb3J0RGF0YVR5cGUgXTsKCQl2YXIgY3VzdG9tRGF0YTsKCQoJCWlmICggY3VzdG9tU29ydCApIHsKCQkJY3VzdG9tRGF0YSA9IGN1c3RvbVNvcnQuY2FsbCggc2V0dGluZ3Mub0luc3RhbmNlLCBzZXR0aW5ncywgaWR4LAoJCQkJX2ZuQ29sdW1uSW5kZXhUb1Zpc2libGUoIHNldHRpbmdzLCBpZHggKQoJCQkpOwoJCX0KCQoJCS8vIFVzZSAvIHBvcHVsYXRlIGNhY2hlCgkJdmFyIHJvdywgY2VsbERhdGE7CgkJdmFyIGZvcm1hdHRlciA9IERhdGFUYWJsZS5leHQudHlwZS5vcmRlclsgY29sdW1uLnNUeXBlKyItcHJlIiBdOwoJCgkJZm9yICggdmFyIGk9MCwgaWVuPXNldHRpbmdzLmFvRGF0YS5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJcm93ID0gc2V0dGluZ3MuYW9EYXRhW2ldOwoJCgkJCWlmICggISByb3cuX2FTb3J0RGF0YSApIHsKCQkJCXJvdy5fYVNvcnREYXRhID0gW107CgkJCX0KCQoJCQlpZiAoICEgcm93Ll9hU29ydERhdGFbaWR4XSB8fCBjdXN0b21Tb3J0ICkgewoJCQkJY2VsbERhdGEgPSBjdXN0b21Tb3J0ID8KCQkJCQljdXN0b21EYXRhW2ldIDogLy8gSWYgdGhlcmUgd2FzIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSBkYXRhIGZyb20gdGhlcmUKCQkJCQlfZm5HZXRDZWxsRGF0YSggc2V0dGluZ3MsIGksIGlkeCwgJ3NvcnQnICk7CgkKCQkJCXJvdy5fYVNvcnREYXRhWyBpZHggXSA9IGZvcm1hdHRlciA/CgkJCQkJZm9ybWF0dGVyKCBjZWxsRGF0YSApIDoKCQkJCQljZWxsRGF0YTsKCQkJfQoJCX0KCX0KCQoJCgkKCS8qKgoJICogU2F2ZSB0aGUgc3RhdGUgb2YgYSB0YWJsZQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuU2F2ZVN0YXRlICggc2V0dGluZ3MgKQoJewoJCWlmICggIXNldHRpbmdzLm9GZWF0dXJlcy5iU3RhdGVTYXZlIHx8IHNldHRpbmdzLmJEZXN0cm95aW5nICkKCQl7CgkJCXJldHVybjsKCQl9CgkKCQkvKiBTdG9yZSB0aGUgaW50ZXJlc3RpbmcgdmFyaWFibGVzICovCgkJdmFyIHN0YXRlID0gewoJCQl0aW1lOiAgICArbmV3IERhdGUoKSwKCQkJc3RhcnQ6ICAgc2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQsCgkJCWxlbmd0aDogIHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCwKCQkJb3JkZXI6ICAgJC5leHRlbmQoIHRydWUsIFtdLCBzZXR0aW5ncy5hYVNvcnRpbmcgKSwKCQkJc2VhcmNoOiAgX2ZuU2VhcmNoVG9DYW1lbCggc2V0dGluZ3Mub1ByZXZpb3VzU2VhcmNoICksCgkJCWNvbHVtbnM6ICQubWFwKCBzZXR0aW5ncy5hb0NvbHVtbnMsIGZ1bmN0aW9uICggY29sLCBpICkgewoJCQkJcmV0dXJuIHsKCQkJCQl2aXNpYmxlOiBjb2wuYlZpc2libGUsCgkJCQkJc2VhcmNoOiBfZm5TZWFyY2hUb0NhbWVsKCBzZXR0aW5ncy5hb1ByZVNlYXJjaENvbHNbaV0gKQoJCQkJfTsKCQkJfSApCgkJfTsKCQoJCV9mbkNhbGxiYWNrRmlyZSggc2V0dGluZ3MsICJhb1N0YXRlU2F2ZVBhcmFtcyIsICdzdGF0ZVNhdmVQYXJhbXMnLCBbc2V0dGluZ3MsIHN0YXRlXSApOwoJCgkJc2V0dGluZ3Mub1NhdmVkU3RhdGUgPSBzdGF0ZTsKCQlzZXR0aW5ncy5mblN0YXRlU2F2ZUNhbGxiYWNrLmNhbGwoIHNldHRpbmdzLm9JbnN0YW5jZSwgc2V0dGluZ3MsIHN0YXRlICk7Cgl9CgkKCQoJLyoqCgkgKiBBdHRlbXB0IHRvIGxvYWQgYSBzYXZlZCB0YWJsZSBzdGF0ZQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0ge29iamVjdH0gb0luaXQgRGF0YVRhYmxlcyBpbml0IG9iamVjdCBzbyB3ZSBjYW4gb3ZlcnJpZGUgc2V0dGluZ3MKCSAqICBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIHN0YXRlIGhhcyBiZWVuIGxvYWRlZAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5Mb2FkU3RhdGUgKCBzZXR0aW5ncywgb0luaXQsIGNhbGxiYWNrICkKCXsKCQl2YXIgaSwgaWVuOwoJCXZhciBjb2x1bW5zID0gc2V0dGluZ3MuYW9Db2x1bW5zOwoJCXZhciBsb2FkZWQgPSBmdW5jdGlvbiAoIHMgKSB7CgkJCWlmICggISBzIHx8ICEgcy50aW1lICkgewoJCQkJY2FsbGJhY2soKTsKCQkJCXJldHVybjsKCQkJfQoJCgkJCS8vIEFsbG93IGN1c3RvbSBhbmQgcGx1Zy1pbiBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIHRvIGFsdGVyIHRoZSBzYXZlZCBkYXRhIHNldCBhbmQKCQkJLy8gY2FuY2VsbGluZyBvZiBsb2FkaW5nIGJ5IHJldHVybmluZyBmYWxzZQoJCQl2YXIgYWJTdGF0ZUxvYWQgPSBfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCAnYW9TdGF0ZUxvYWRQYXJhbXMnLCAnc3RhdGVMb2FkUGFyYW1zJywgW3NldHRpbmdzLCBzXSApOwoJCQlpZiAoICQuaW5BcnJheSggZmFsc2UsIGFiU3RhdGVMb2FkICkgIT09IC0xICkgewoJCQkJY2FsbGJhY2soKTsKCQkJCXJldHVybjsKCQkJfQoJCgkJCS8vIFJlamVjdCBvbGQgZGF0YQoJCQl2YXIgZHVyYXRpb24gPSBzZXR0aW5ncy5pU3RhdGVEdXJhdGlvbjsKCQkJaWYgKCBkdXJhdGlvbiA+IDAgJiYgcy50aW1lIDwgK25ldyBEYXRlKCkgLSAoZHVyYXRpb24qMTAwMCkgKSB7CgkJCQljYWxsYmFjaygpOwoJCQkJcmV0dXJuOwoJCQl9CgkKCQkJLy8gTnVtYmVyIG9mIGNvbHVtbnMgaGF2ZSBjaGFuZ2VkIC0gYWxsIGJldHMgYXJlIG9mZiwgbm8gcmVzdG9yZSBvZiBzZXR0aW5ncwoJCQlpZiAoIHMuY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCAhPT0gcy5jb2x1bW5zLmxlbmd0aCApIHsKCQkJCWNhbGxiYWNrKCk7CgkJCQlyZXR1cm47CgkJCX0KCQoJCQkvLyBTdG9yZSB0aGUgc2F2ZWQgc3RhdGUgc28gaXQgbWlnaHQgYmUgYWNjZXNzZWQgYXQgYW55IHRpbWUKCQkJc2V0dGluZ3Mub0xvYWRlZFN0YXRlID0gJC5leHRlbmQoIHRydWUsIHt9LCBzICk7CgkKCQkJLy8gUmVzdG9yZSBrZXkgZmVhdHVyZXMgLSB0b2RvIC0gZm9yIDEuMTEgdGhpcyBuZWVkcyB0byBiZSBkb25lIGJ5CgkJCS8vIHN1YnNjcmliZWQgZXZlbnRzCgkJCWlmICggcy5zdGFydCAhPT0gdW5kZWZpbmVkICkgewoJCQkJc2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQgICAgPSBzLnN0YXJ0OwoJCQkJc2V0dGluZ3MuaUluaXREaXNwbGF5U3RhcnQgPSBzLnN0YXJ0OwoJCQl9CgkJCWlmICggcy5sZW5ndGggIT09IHVuZGVmaW5lZCApIHsKCQkJCXNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCAgID0gcy5sZW5ndGg7CgkJCX0KCQoJCQkvLyBPcmRlcgoJCQlpZiAoIHMub3JkZXIgIT09IHVuZGVmaW5lZCApIHsKCQkJCXNldHRpbmdzLmFhU29ydGluZyA9IFtdOwoJCQkJJC5lYWNoKCBzLm9yZGVyLCBmdW5jdGlvbiAoIGksIGNvbCApIHsKCQkJCQlzZXR0aW5ncy5hYVNvcnRpbmcucHVzaCggY29sWzBdID49IGNvbHVtbnMubGVuZ3RoID8KCQkJCQkJWyAwLCBjb2xbMV0gXSA6CgkJCQkJCWNvbAoJCQkJCSk7CgkJCQl9ICk7CgkJCX0KCQoJCQkvLyBTZWFyY2gKCQkJaWYgKCBzLnNlYXJjaCAhPT0gdW5kZWZpbmVkICkgewoJCQkJJC5leHRlbmQoIHNldHRpbmdzLm9QcmV2aW91c1NlYXJjaCwgX2ZuU2VhcmNoVG9IdW5nKCBzLnNlYXJjaCApICk7CgkJCX0KCQoJCQkvLyBDb2x1bW5zCgkJCS8vCgkJCWlmICggcy5jb2x1bW5zICkgewoJCQkJZm9yICggaT0wLCBpZW49cy5jb2x1bW5zLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCXZhciBjb2wgPSBzLmNvbHVtbnNbaV07CgkKCQkJCQkvLyBWaXNpYmlsaXR5CgkJCQkJaWYgKCBjb2wudmlzaWJsZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCQljb2x1bW5zW2ldLmJWaXNpYmxlID0gY29sLnZpc2libGU7CgkJCQkJfQoJCgkJCQkJLy8gU2VhcmNoCgkJCQkJaWYgKCBjb2wuc2VhcmNoICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJCSQuZXh0ZW5kKCBzZXR0aW5ncy5hb1ByZVNlYXJjaENvbHNbaV0sIF9mblNlYXJjaFRvSHVuZyggY29sLnNlYXJjaCApICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkKCQkJX2ZuQ2FsbGJhY2tGaXJlKCBzZXR0aW5ncywgJ2FvU3RhdGVMb2FkZWQnLCAnc3RhdGVMb2FkZWQnLCBbc2V0dGluZ3MsIHNdICk7CgkJCWNhbGxiYWNrKCk7CgkJfQoJCgkJaWYgKCAhIHNldHRpbmdzLm9GZWF0dXJlcy5iU3RhdGVTYXZlICkgewoJCQljYWxsYmFjaygpOwoJCQlyZXR1cm47CgkJfQoJCgkJdmFyIHN0YXRlID0gc2V0dGluZ3MuZm5TdGF0ZUxvYWRDYWxsYmFjay5jYWxsKCBzZXR0aW5ncy5vSW5zdGFuY2UsIHNldHRpbmdzLCBsb2FkZWQgKTsKCQoJCWlmICggc3RhdGUgIT09IHVuZGVmaW5lZCApIHsKCQkJbG9hZGVkKCBzdGF0ZSApOwoJCX0KCQkvLyBvdGhlcndpc2UsIHdhaXQgZm9yIHRoZSBsb2FkZWQgY2FsbGJhY2sgdG8gYmUgZXhlY3V0ZWQKCX0KCQoJCgkvKioKCSAqIFJldHVybiB0aGUgc2V0dGluZ3Mgb2JqZWN0IGZvciBhIHBhcnRpY3VsYXIgdGFibGUKCSAqICBAcGFyYW0ge25vZGV9IHRhYmxlIHRhYmxlIHdlIGFyZSB1c2luZyBhcyBhIGRhdGFUYWJsZQoJICogIEByZXR1cm5zIHtvYmplY3R9IFNldHRpbmdzIG9iamVjdCAtIG9yIG51bGwgaWYgbm90IGZvdW5kCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mblNldHRpbmdzRnJvbU5vZGUgKCB0YWJsZSApCgl7CgkJdmFyIHNldHRpbmdzID0gRGF0YVRhYmxlLnNldHRpbmdzOwoJCXZhciBpZHggPSAkLmluQXJyYXkoIHRhYmxlLCBfcGx1Y2soIHNldHRpbmdzLCAnblRhYmxlJyApICk7CgkKCQlyZXR1cm4gaWR4ICE9PSAtMSA/CgkJCXNldHRpbmdzWyBpZHggXSA6CgkJCW51bGw7Cgl9CgkKCQoJLyoqCgkgKiBMb2cgYW4gZXJyb3IgbWVzc2FnZQoJICogIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7aW50fSBsZXZlbCBsb2cgZXJyb3IgbWVzc2FnZXMsIG9yIGRpc3BsYXkgdGhlbSB0byB0aGUgdXNlcgoJICogIEBwYXJhbSB7c3RyaW5nfSBtc2cgZXJyb3IgbWVzc2FnZQoJICogIEBwYXJhbSB7aW50fSB0biBUZWNobmljYWwgbm90ZSBpZCB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkxvZyggc2V0dGluZ3MsIGxldmVsLCBtc2csIHRuICkKCXsKCQltc2cgPSAnRGF0YVRhYmxlcyB3YXJuaW5nOiAnKwoJCQkoc2V0dGluZ3MgPyAndGFibGUgaWQ9JytzZXR0aW5ncy5zVGFibGVJZCsnIC0gJyA6ICcnKSttc2c7CgkKCQlpZiAoIHRuICkgewoJCQltc2cgKz0gJy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlcnJvciwgcGxlYXNlIHNlZSAnKwoJCQknaHR0cDovL2RhdGF0YWJsZXMubmV0L3RuLycrdG47CgkJfQoJCgkJaWYgKCAhIGxldmVsICApIHsKCQkJLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcHJlIDEuMTAKCQkJdmFyIGV4dCA9IERhdGFUYWJsZS5leHQ7CgkJCXZhciB0eXBlID0gZXh0LnNFcnJNb2RlIHx8IGV4dC5lcnJNb2RlOwoJCgkJCWlmICggc2V0dGluZ3MgKSB7CgkJCQlfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCBudWxsLCAnZXJyb3InLCBbIHNldHRpbmdzLCB0biwgbXNnIF0gKTsKCQkJfQoJCgkJCWlmICggdHlwZSA9PSAnYWxlcnQnICkgewoJCQkJYWxlcnQoIG1zZyApOwoJCQl9CgkJCWVsc2UgaWYgKCB0eXBlID09ICd0aHJvdycgKSB7CgkJCQl0aHJvdyBuZXcgRXJyb3IobXNnKTsKCQkJfQoJCQllbHNlIGlmICggdHlwZW9mIHR5cGUgPT0gJ2Z1bmN0aW9uJyApIHsKCQkJCXR5cGUoIHNldHRpbmdzLCB0biwgbXNnICk7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICkgewoJCQljb25zb2xlLmxvZyggbXNnICk7CgkJfQoJfQoJCgkKCS8qKgoJICogU2VlIGlmIGEgcHJvcGVydHkgaXMgZGVmaW5lZCBvbiBvbmUgb2JqZWN0LCBpZiBzbyBhc3NpZ24gaXQgdG8gdGhlIG90aGVyIG9iamVjdAoJICogIEBwYXJhbSB7b2JqZWN0fSByZXQgdGFyZ2V0IG9iamVjdAoJICogIEBwYXJhbSB7b2JqZWN0fSBzcmMgc291cmNlIG9iamVjdAoJICogIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHByb3BlcnR5CgkgKiAgQHBhcmFtIHtzdHJpbmd9IFttYXBwZWROYW1lXSBuYW1lIHRvIG1hcCB0b28gLSBvcHRpb25hbCwgbmFtZSB1c2VkIGlmIG5vdCBnaXZlbgoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5NYXAoIHJldCwgc3JjLCBuYW1lLCBtYXBwZWROYW1lICkKCXsKCQlpZiAoICQuaXNBcnJheSggbmFtZSApICkgewoJCQkkLmVhY2goIG5hbWUsIGZ1bmN0aW9uIChpLCB2YWwpIHsKCQkJCWlmICggJC5pc0FycmF5KCB2YWwgKSApIHsKCQkJCQlfZm5NYXAoIHJldCwgc3JjLCB2YWxbMF0sIHZhbFsxXSApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJX2ZuTWFwKCByZXQsIHNyYywgdmFsICk7CgkJCQl9CgkJCX0gKTsKCQoJCQlyZXR1cm47CgkJfQoJCgkJaWYgKCBtYXBwZWROYW1lID09PSB1bmRlZmluZWQgKSB7CgkJCW1hcHBlZE5hbWUgPSBuYW1lOwoJCX0KCQoJCWlmICggc3JjW25hbWVdICE9PSB1bmRlZmluZWQgKSB7CgkJCXJldFttYXBwZWROYW1lXSA9IHNyY1tuYW1lXTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBFeHRlbmQgb2JqZWN0cyAtIHZlcnkgc2ltaWxhciB0byBqUXVlcnkuZXh0ZW5kLCBidXQgZGVlcCBjb3B5IG9iamVjdHMsIGFuZAoJICogc2hhbGxvdyBjb3B5IGFycmF5cy4gVGhlIHJlYXNvbiB3ZSBuZWVkIHRvIGRvIHRoaXMsIGlzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0bwoJICogZGVlcCBjb3B5IGFycmF5IGluaXQgdmFsdWVzIChzdWNoIGFzIGFhU29ydGluZykgc2luY2UgdGhlIGRldiB3b3VsZG4ndCBiZQoJICogYWJsZSB0byBvdmVycmlkZSB0aGVtLCBidXQgd2UgZG8gd2FudCB0byBkZWVwIGNvcHkgYXJyYXlzLgoJICogIEBwYXJhbSB7b2JqZWN0fSBvdXQgT2JqZWN0IHRvIGV4dGVuZAoJICogIEBwYXJhbSB7b2JqZWN0fSBleHRlbmRlciBPYmplY3QgZnJvbSB3aGljaCB0aGUgcHJvcGVydGllcyB3aWxsIGJlIGFwcGxpZWQgdG8KCSAqICAgICAgb3V0CgkgKiAgQHBhcmFtIHtib29sZWFufSBicmVha1JlZnMgSWYgdHJ1ZSwgdGhlbiBhcnJheXMgd2lsbCBiZSBzbGljZWQgdG8gdGFrZSBhbgoJICogICAgICBpbmRlcGVuZGVudCBjb3B5IHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgYGRhdGFgIG9yIGBhYURhdGFgIHBhcmFtZXRlcnMKCSAqICAgICAgaWYgdGhleSBhcmUgcHJlc2VudC4gVGhpcyBpcyBzbyB5b3UgY2FuIHBhc3MgaW4gYSBjb2xsZWN0aW9uIHRvCgkgKiAgICAgIERhdGFUYWJsZXMgYW5kIGhhdmUgdGhhdCB1c2VkIGFzIHlvdXIgZGF0YSBzb3VyY2Ugd2l0aG91dCBicmVha2luZyB0aGUKCSAqICAgICAgcmVmZXJlbmNlcwoJICogIEByZXR1cm5zIHtvYmplY3R9IG91dCBSZWZlcmVuY2UsIGp1c3QgZm9yIGNvbnZlbmllbmNlIC0gb3V0ID09PSB0aGUgcmV0dXJuLgoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICogIEB0b2RvIFRoaXMgZG9lc24ndCB0YWtlIGFjY291bnQgb2YgYXJyYXlzIGluc2lkZSB0aGUgZGVlcCBjb3BpZWQgb2JqZWN0cy4KCSAqLwoJZnVuY3Rpb24gX2ZuRXh0ZW5kKCBvdXQsIGV4dGVuZGVyLCBicmVha1JlZnMgKQoJewoJCXZhciB2YWw7CgkKCQlmb3IgKCB2YXIgcHJvcCBpbiBleHRlbmRlciApIHsKCQkJaWYgKCBleHRlbmRlci5oYXNPd25Qcm9wZXJ0eShwcm9wKSApIHsKCQkJCXZhbCA9IGV4dGVuZGVyW3Byb3BdOwoJCgkJCQlpZiAoICQuaXNQbGFpbk9iamVjdCggdmFsICkgKSB7CgkJCQkJaWYgKCAhICQuaXNQbGFpbk9iamVjdCggb3V0W3Byb3BdICkgKSB7CgkJCQkJCW91dFtwcm9wXSA9IHt9OwoJCQkJCX0KCQkJCQkkLmV4dGVuZCggdHJ1ZSwgb3V0W3Byb3BdLCB2YWwgKTsKCQkJCX0KCQkJCWVsc2UgaWYgKCBicmVha1JlZnMgJiYgcHJvcCAhPT0gJ2RhdGEnICYmIHByb3AgIT09ICdhYURhdGEnICYmICQuaXNBcnJheSh2YWwpICkgewoJCQkJCW91dFtwcm9wXSA9IHZhbC5zbGljZSgpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJb3V0W3Byb3BdID0gdmFsOwoJCQkJfQoJCQl9CgkJfQoJCgkJcmV0dXJuIG91dDsKCX0KCQoJCgkvKioKCSAqIEJpbmQgYW4gZXZlbnQgaGFuZGVycyB0byBhbGxvdyBhIGNsaWNrIG9yIHJldHVybiBrZXkgdG8gYWN0aXZhdGUgdGhlIGNhbGxiYWNrLgoJICogVGhpcyBpcyBnb29kIGZvciBhY2Nlc3NpYmlsaXR5IHNpbmNlIGEgcmV0dXJuIG9uIHRoZSBrZXlib2FyZCB3aWxsIGhhdmUgdGhlCgkgKiBzYW1lIGVmZmVjdCBhcyBhIGNsaWNrLCBpZiB0aGUgZWxlbWVudCBoYXMgZm9jdXMuCgkgKiAgQHBhcmFtIHtlbGVtZW50fSBuIEVsZW1lbnQgdG8gYmluZCB0aGUgYWN0aW9uIHRvCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9EYXRhIERhdGEgb2JqZWN0IHRvIHBhc3MgdG8gdGhlIHRyaWdnZXJlZCBmdW5jdGlvbgoJICogIEBwYXJhbSB7ZnVuY3Rpb259IGZuIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuQmluZEFjdGlvbiggbiwgb0RhdGEsIGZuICkKCXsKCQkkKG4pCgkJCS5vbiggJ2NsaWNrLkRUJywgb0RhdGEsIGZ1bmN0aW9uIChlKSB7CgkJCQkJJChuKS5ibHVyKCk7IC8vIFJlbW92ZSBmb2N1cyBvdXRsaW5lIGZvciBtb3VzZSB1c2VycwoJCQkJCWZuKGUpOwoJCQkJfSApCgkJCS5vbiggJ2tleXByZXNzLkRUJywgb0RhdGEsIGZ1bmN0aW9uIChlKXsKCQkJCQlpZiAoIGUud2hpY2ggPT09IDEzICkgewoJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCWZuKGUpOwoJCQkJCX0KCQkJCX0gKQoJCQkub24oICdzZWxlY3RzdGFydC5EVCcsIGZ1bmN0aW9uICgpIHsKCQkJCQkvKiBUYWtlIHRoZSBicnV0YWwgYXBwcm9hY2ggdG8gY2FuY2VsbGluZyB0ZXh0IHNlbGVjdGlvbiAqLwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0gKTsKCX0KCQoJCgkvKioKCSAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24uIEVhc2lseSBhbGxvd3MgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBhZGRlZCB0bwoJICogYW4gYXJyYXkgc3RvcmUgb2YgY2FsbGJhY2sgZnVuY3Rpb25zIHRoYXQgY2FuIHRoZW4gYWxsIGJlIGNhbGxlZCB0b2dldGhlci4KCSAqICBAcGFyYW0ge29iamVjdH0gb1NldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtzdHJpbmd9IHNTdG9yZSBOYW1lIG9mIHRoZSBhcnJheSBzdG9yYWdlIGZvciB0aGUgY2FsbGJhY2tzIGluIG9TZXR0aW5ncwoJICogIEBwYXJhbSB7ZnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiYWNrCgkgKiAgQHBhcmFtIHtzdHJpbmd9IHNOYW1lIElkZW50aWZ5aW5nIG5hbWUgZm9yIHRoZSBjYWxsYmFjayAoaS5lLiBhIGxhYmVsKQoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5DYWxsYmFja1JlZyggb1NldHRpbmdzLCBzU3RvcmUsIGZuLCBzTmFtZSApCgl7CgkJaWYgKCBmbiApCgkJewoJCQlvU2V0dGluZ3Nbc1N0b3JlXS5wdXNoKCB7CgkJCQkiZm4iOiBmbiwKCQkJCSJzTmFtZSI6IHNOYW1lCgkJCX0gKTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBGaXJlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhbmQgdHJpZ2dlciBldmVudHMuIE5vdGUgdGhhdCB0aGUgbG9vcCBvdmVyIHRoZQoJICogY2FsbGJhY2sgYXJyYXkgc3RvcmUgaXMgZG9uZSBiYWNrd2FyZHMhIEZ1cnRoZXIgbm90ZSB0aGF0IHlvdSBkbyBub3Qgd2FudCB0bwoJICogZmlyZSBvZmYgdHJpZ2dlcnMgaW4gdGltZSBzZW5zaXRpdmUgYXBwbGljYXRpb25zIChmb3IgZXhhbXBsZSBjZWxsIGNyZWF0aW9uKQoJICogYXMgaXRzIHNsb3cuCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrQXJyIE5hbWUgb2YgdGhlIGFycmF5IHN0b3JhZ2UgZm9yIHRoZSBjYWxsYmFja3MgaW4KCSAqICAgICAgb1NldHRpbmdzCgkgKiAgQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBqUXVlcnkgY3VzdG9tIGV2ZW50IHRvIHRyaWdnZXIuIElmCgkgKiAgICAgIG51bGwgbm8gdHJpZ2dlciBpcyBmaXJlZAoJICogIEBwYXJhbSB7YXJyYXl9IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIC8KCSAqICAgICAgdHJpZ2dlcgoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCBjYWxsYmFja0FyciwgZXZlbnROYW1lLCBhcmdzICkKCXsKCQl2YXIgcmV0ID0gW107CgkKCQlpZiAoIGNhbGxiYWNrQXJyICkgewoJCQlyZXQgPSAkLm1hcCggc2V0dGluZ3NbY2FsbGJhY2tBcnJdLnNsaWNlKCkucmV2ZXJzZSgpLCBmdW5jdGlvbiAodmFsLCBpKSB7CgkJCQlyZXR1cm4gdmFsLmZuLmFwcGx5KCBzZXR0aW5ncy5vSW5zdGFuY2UsIGFyZ3MgKTsKCQkJfSApOwoJCX0KCQoJCWlmICggZXZlbnROYW1lICE9PSBudWxsICkgewoJCQl2YXIgZSA9ICQuRXZlbnQoIGV2ZW50TmFtZSsnLmR0JyApOwoJCgkJCSQoc2V0dGluZ3MublRhYmxlKS50cmlnZ2VyKCBlLCBhcmdzICk7CgkKCQkJcmV0LnB1c2goIGUucmVzdWx0ICk7CgkJfQoJCgkJcmV0dXJuIHJldDsKCX0KCQoJCglmdW5jdGlvbiBfZm5MZW5ndGhPdmVyZmxvdyAoIHNldHRpbmdzICkKCXsKCQl2YXIKCQkJc3RhcnQgPSBzZXR0aW5ncy5faURpc3BsYXlTdGFydCwKCQkJZW5kID0gc2V0dGluZ3MuZm5EaXNwbGF5RW5kKCksCgkJCWxlbiA9IHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aDsKCQoJCS8qIElmIHdlIGhhdmUgc3BhY2UgdG8gc2hvdyBleHRyYSByb3dzIChiYWNraW5nIHVwIGZyb20gdGhlIGVuZCBwb2ludCAtIHRoZW4gZG8gc28gKi8KCQlpZiAoIHN0YXJ0ID49IGVuZCApCgkJewoJCQlzdGFydCA9IGVuZCAtIGxlbjsKCQl9CgkKCQkvLyBLZWVwIHRoZSBzdGFydCByZWNvcmQgb24gdGhlIGN1cnJlbnQgcGFnZQoJCXN0YXJ0IC09IChzdGFydCAlIGxlbik7CgkKCQlpZiAoIGxlbiA9PT0gLTEgfHwgc3RhcnQgPCAwICkKCQl7CgkJCXN0YXJ0ID0gMDsKCQl9CgkKCQlzZXR0aW5ncy5faURpc3BsYXlTdGFydCA9IHN0YXJ0OwoJfQoJCgkKCWZ1bmN0aW9uIF9mblJlbmRlcmVyKCBzZXR0aW5ncywgdHlwZSApCgl7CgkJdmFyIHJlbmRlcmVyID0gc2V0dGluZ3MucmVuZGVyZXI7CgkJdmFyIGhvc3QgPSBEYXRhVGFibGUuZXh0LnJlbmRlcmVyW3R5cGVdOwoJCgkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHJlbmRlcmVyICkgJiYgcmVuZGVyZXJbdHlwZV0gKSB7CgkJCS8vIFNwZWNpZmljIHJlbmRlcmVyIGZvciB0aGlzIHR5cGUuIElmIGF2YWlsYWJsZSB1c2UgaXQsIG90aGVyd2lzZSB1c2UKCQkJLy8gdGhlIGRlZmF1bHQuCgkJCXJldHVybiBob3N0W3JlbmRlcmVyW3R5cGVdXSB8fCBob3N0Ll87CgkJfQoJCWVsc2UgaWYgKCB0eXBlb2YgcmVuZGVyZXIgPT09ICdzdHJpbmcnICkgewoJCQkvLyBDb21tb24gcmVuZGVyZXIgLSBpZiB0aGVyZSBpcyBvbmUgYXZhaWxhYmxlIGZvciB0aGlzIHR5cGUgdXNlIGl0LAoJCQkvLyBvdGhlcndpc2UgdXNlIHRoZSBkZWZhdWx0CgkJCXJldHVybiBob3N0W3JlbmRlcmVyXSB8fCBob3N0Ll87CgkJfQoJCgkJLy8gVXNlIHRoZSBkZWZhdWx0CgkJcmV0dXJuIGhvc3QuXzsKCX0KCQoJCgkvKioKCSAqIERldGVjdCB0aGUgZGF0YSBzb3VyY2UgYmVpbmcgdXNlZCBmb3IgdGhlIHRhYmxlLiBVc2VkIHRvIHNpbXBsaWZ5IHRoZSBjb2RlCgkgKiBhIGxpdHRsZSAoYWpheCkgYW5kIHRvIG1ha2UgaXQgY29tcHJlc3MgYSBsaXR0bGUgc21hbGxlci4KCSAqCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHJldHVybnMge3N0cmluZ30gRGF0YSBzb3VyY2UKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuRGF0YVNvdXJjZSAoIHNldHRpbmdzICkKCXsKCQlpZiAoIHNldHRpbmdzLm9GZWF0dXJlcy5iU2VydmVyU2lkZSApIHsKCQkJcmV0dXJuICdzc3AnOwoJCX0KCQllbHNlIGlmICggc2V0dGluZ3MuYWpheCB8fCBzZXR0aW5ncy5zQWpheFNvdXJjZSApIHsKCQkJcmV0dXJuICdhamF4JzsKCQl9CgkJcmV0dXJuICdkb20nOwoJfQoJCgoJCgkKCS8qKgoJICogQ29tcHV0ZWQgc3RydWN0dXJlIG9mIHRoZSBEYXRhVGFibGVzIEFQSSwgZGVmaW5lZCBieSB0aGUgb3B0aW9ucyBwYXNzZWQgdG8KCSAqIGBEYXRhVGFibGUuQXBpLnJlZ2lzdGVyKClgIHdoZW4gYnVpbGRpbmcgdGhlIEFQSS4KCSAqCgkgKiBUaGUgc3RydWN0dXJlIGlzIGJ1aWx0IGluIG9yZGVyIHRvIHNwZWVkIGNyZWF0aW9uIGFuZCBleHRlbnNpb24gb2YgdGhlIEFwaQoJICogb2JqZWN0cyBzaW5jZSB0aGUgZXh0ZW5zaW9ucyBhcmUgZWZmZWN0aXZlbHkgcHJlLXBhcnNlZC4KCSAqCgkgKiBUaGUgYXJyYXkgaXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLCB3aGVyZSB0aGlzCgkgKiBiYXNlIGFycmF5IHJlcHJlc2VudHMgdGhlIEFwaSBwcm90b3R5cGUgYmFzZToKCSAqCgkgKiAgICAgWwoJICogICAgICAgewoJICogICAgICAgICBuYW1lOiAgICAgICdkYXRhJyAgICAgICAgICAgICAgICAtLSBzdHJpbmcgICAtIFByb3BlcnR5IG5hbWUKCSAqICAgICAgICAgdmFsOiAgICAgICBmdW5jdGlvbiAoKSB7fSwgICAgICAgLS0gZnVuY3Rpb24gLSBBcGkgbWV0aG9kIChvciB1bmRlZmluZWQgaWYganVzdCBhbiBvYmplY3QKCSAqICAgICAgICAgbWV0aG9kRXh0OiBbIC4uLiBdLCAgICAgICAgICAgICAgLS0gYXJyYXkgICAgLSBBcnJheSBvZiBBcGkgb2JqZWN0IGRlZmluaXRpb25zIHRvIGV4dGVuZCB0aGUgbWV0aG9kIHJlc3VsdAoJICogICAgICAgICBwcm9wRXh0OiAgIFsgLi4uIF0gICAgICAgICAgICAgICAtLSBhcnJheSAgICAtIEFycmF5IG9mIEFwaSBvYmplY3QgZGVmaW5pdGlvbnMgdG8gZXh0ZW5kIHRoZSBwcm9wZXJ0eQoJICogICAgICAgfSwKCSAqICAgICAgIHsKCSAqICAgICAgICAgbmFtZTogICAgICdyb3cnCgkgKiAgICAgICAgIHZhbDogICAgICAge30sCgkgKiAgICAgICAgIG1ldGhvZEV4dDogWyAuLi4gXSwKCSAqICAgICAgICAgcHJvcEV4dDogICBbCgkgKiAgICAgICAgICAgewoJICogICAgICAgICAgICAgbmFtZTogICAgICAnZGF0YScKCSAqICAgICAgICAgICAgIHZhbDogICAgICAgZnVuY3Rpb24gKCkge30sCgkgKiAgICAgICAgICAgICBtZXRob2RFeHQ6IFsgLi4uIF0sCgkgKiAgICAgICAgICAgICBwcm9wRXh0OiAgIFsgLi4uIF0KCSAqICAgICAgICAgICB9LAoJICogICAgICAgICAgIC4uLgoJICogICAgICAgICBdCgkgKiAgICAgICB9CgkgKiAgICAgXQoJICoKCSAqIEB0eXBlIHtBcnJheX0KCSAqIEBpZ25vcmUKCSAqLwoJdmFyIF9fYXBpU3RydWN0ID0gW107CgkKCQoJLyoqCgkgKiBgQXJyYXkucHJvdG90eXBlYCByZWZlcmVuY2UuCgkgKgoJICogQHR5cGUgb2JqZWN0CgkgKiBAaWdub3JlCgkgKi8KCXZhciBfX2FycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7CgkKCQoJLyoqCgkgKiBBYnN0cmFjdGlvbiBmb3IgYGNvbnRleHRgIHBhcmFtZXRlciBvZiB0aGUgYEFwaWAgY29uc3RydWN0b3IgdG8gYWxsb3cgaXQgdG8KCSAqIHRha2Ugc2V2ZXJhbCBkaWZmZXJlbnQgZm9ybXMgZm9yIGVhc2Ugb2YgdXNlLgoJICoKCSAqIEVhY2ggb2YgdGhlIGlucHV0IHBhcmFtZXRlciB0eXBlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIERhdGFUYWJsZXMgc2V0dGluZ3MKCSAqIG9iamVjdCB3aGVyZSBwb3NzaWJsZS4KCSAqCgkgKiBAcGFyYW0gIHtzdHJpbmd8bm9kZXxqUXVlcnl8b2JqZWN0fSBtaXhlZCBEYXRhVGFibGUgaWRlbnRpZmllci4gQ2FuIGJlIG9uZQoJICogICBvZjoKCSAqCgkgKiAgICogYHN0cmluZ2AgLSBqUXVlcnkgc2VsZWN0b3IuIEFueSBEYXRhVGFibGVzJyBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IKCSAqICAgICB3aXRoIGJlIGZvdW5kIGFuZCB1c2VkLgoJICogICAqIGBub2RlYCAtIGBUQUJMRWAgbm9kZSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGZvcm1lZCBpbnRvIGEgRGF0YVRhYmxlLgoJICogICAqIGBqUXVlcnlgIC0gQSBqUXVlcnkgb2JqZWN0IG9mIGBUQUJMRWAgbm9kZXMuCgkgKiAgICogYG9iamVjdGAgLSBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogICAqIGBEYXRhVGFibGVzLkFwaWAgLSBBUEkgaW5zdGFuY2UKCSAqIEByZXR1cm4ge2FycmF5fG51bGx9IE1hdGNoaW5nIERhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0cy4gYG51bGxgIG9yCgkgKiAgIGB1bmRlZmluZWRgIGlzIHJldHVybmVkIGlmIG5vIG1hdGNoaW5nIERhdGFUYWJsZSBpcyBmb3VuZC4KCSAqIEBpZ25vcmUKCSAqLwoJdmFyIF90b1NldHRpbmdzID0gZnVuY3Rpb24gKCBtaXhlZCApCgl7CgkJdmFyIGlkeCwganE7CgkJdmFyIHNldHRpbmdzID0gRGF0YVRhYmxlLnNldHRpbmdzOwoJCXZhciB0YWJsZXMgPSAkLm1hcCggc2V0dGluZ3MsIGZ1bmN0aW9uIChlbCwgaSkgewoJCQlyZXR1cm4gZWwublRhYmxlOwoJCX0gKTsKCQoJCWlmICggISBtaXhlZCApIHsKCQkJcmV0dXJuIFtdOwoJCX0KCQllbHNlIGlmICggbWl4ZWQublRhYmxlICYmIG1peGVkLm9BcGkgKSB7CgkJCS8vIERhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkJCXJldHVybiBbIG1peGVkIF07CgkJfQoJCWVsc2UgaWYgKCBtaXhlZC5ub2RlTmFtZSAmJiBtaXhlZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGFibGUnICkgewoJCQkvLyBUYWJsZSBub2RlCgkJCWlkeCA9ICQuaW5BcnJheSggbWl4ZWQsIHRhYmxlcyApOwoJCQlyZXR1cm4gaWR4ICE9PSAtMSA/IFsgc2V0dGluZ3NbaWR4XSBdIDogbnVsbDsKCQl9CgkJZWxzZSBpZiAoIG1peGVkICYmIHR5cGVvZiBtaXhlZC5zZXR0aW5ncyA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJcmV0dXJuIG1peGVkLnNldHRpbmdzKCkudG9BcnJheSgpOwoJCX0KCQllbHNlIGlmICggdHlwZW9mIG1peGVkID09PSAnc3RyaW5nJyApIHsKCQkJLy8galF1ZXJ5IHNlbGVjdG9yCgkJCWpxID0gJChtaXhlZCk7CgkJfQoJCWVsc2UgaWYgKCBtaXhlZCBpbnN0YW5jZW9mICQgKSB7CgkJCS8vIGpRdWVyeSBvYmplY3QgKGFsc28gRGF0YVRhYmxlcyBpbnN0YW5jZSkKCQkJanEgPSBtaXhlZDsKCQl9CgkKCQlpZiAoIGpxICkgewoJCQlyZXR1cm4ganEubWFwKCBmdW5jdGlvbihpKSB7CgkJCQlpZHggPSAkLmluQXJyYXkoIHRoaXMsIHRhYmxlcyApOwoJCQkJcmV0dXJuIGlkeCAhPT0gLTEgPyBzZXR0aW5nc1tpZHhdIDogbnVsbDsKCQkJfSApLnRvQXJyYXkoKTsKCQl9Cgl9OwoJCgkKCS8qKgoJICogRGF0YVRhYmxlcyBBUEkgY2xhc3MgLSB1c2VkIHRvIGNvbnRyb2wgYW5kIGludGVyZmFjZSB3aXRoICBvbmUgb3IgbW9yZQoJICogRGF0YVRhYmxlcyBlbmhhbmNlZCB0YWJsZXMuCgkgKgoJICogVGhlIEFQSSBjbGFzcyBpcyBoZWF2aWx5IGJhc2VkIG9uIGpRdWVyeSwgcHJlc2VudGluZyBhIGNoYWluYWJsZSBpbnRlcmZhY2UKCSAqIHRoYXQgeW91IGNhbiB1c2UgdG8gaW50ZXJhY3Qgd2l0aCB0YWJsZXMuIEVhY2ggaW5zdGFuY2Ugb2YgdGhlIEFQSSBjbGFzcyBoYXMKCSAqIGEgImNvbnRleHQiIC0gaS5lLiB0aGUgdGFibGVzIHRoYXQgaXQgd2lsbCBvcGVyYXRlIG9uLiBUaGlzIGNvdWxkIGJlIGEgc2luZ2xlCgkgKiB0YWJsZSwgYWxsIHRhYmxlcyBvbiBhIHBhZ2Ugb3IgYSBzdWItc2V0IHRoZXJlb2YuCgkgKgoJICogQWRkaXRpb25hbGx5IHRoZSBBUEkgaXMgZGVzaWduZWQgdG8gYWxsb3cgeW91IHRvIA=="
{
"type": 12,
"id": "HE6SaebEzmf4qpwmYyBwfAWYnYZvyaZvKztUCzoVE9cx",
"fee": 14200000,
"feeAssetId": null,
"timestamp": 1577467381480,
"version": 1,
"sender": "3NAxHUEaM6RAG7rVDPL9L6DFZWkrqFtY98t",
"senderPublicKey": "4Jwx6yN9LNc5XbrqwrSdp2hok5niFKzGzfZwSxFH6FsV",
"proofs": [
"3BdYcdUcMsdtaKJDcqjsGNb3Uy1SiCGpYo1xh3GHLy5rEqh3TwVVFSAQFWgDjYbCTrFBq3NaU1crTKepq8V3jAya"
],
"data": [
{
"key": "jquery.dataTables.js?4?0?2",
"type": "binary",
"value": "base64:IHRoaXMgY29sdW1uPwoJCQl2YXIgc29ydElkeCA9ICQuaW5BcnJheSggY29sSWR4LCBfcGx1Y2soc29ydGluZywgJzAnKSApOwoJCgkJCWlmICggc29ydElkeCAhPT0gLTEgKSB7CgkJCQkvLyBZZXMsIG1vZGlmeSB0aGUgc29ydAoJCQkJbmV4dFNvcnRJZHggPSBuZXh0KCBzb3J0aW5nW3NvcnRJZHhdLCB0cnVlICk7CgkKCQkJCWlmICggbmV4dFNvcnRJZHggPT09IG51bGwgJiYgc29ydGluZy5sZW5ndGggPT09IDEgKSB7CgkJCQkJbmV4dFNvcnRJZHggPSAwOyAvLyBjYW4ndCByZW1vdmUgc29ydGluZyBjb21wbGV0ZWx5CgkJCQl9CgkKCQkJCWlmICggbmV4dFNvcnRJZHggPT09IG51bGwgKSB7CgkJCQkJc29ydGluZy5zcGxpY2UoIHNvcnRJZHgsIDEgKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXNvcnRpbmdbc29ydElkeF1bMV0gPSBhc1NvcnRpbmdbIG5leHRTb3J0SWR4IF07CgkJCQkJc29ydGluZ1tzb3J0SWR4XS5faWR4ID0gbmV4dFNvcnRJZHg7CgkJCQl9CgkJCX0KCQkJZWxzZSB7CgkJCQkvLyBObyBzb3J0IG9uIHRoaXMgY29sdW1uIHlldAoJCQkJc29ydGluZy5wdXNoKCBbIGNvbElkeCwgYXNTb3J0aW5nWzBdLCAwIF0gKTsKCQkJCXNvcnRpbmdbc29ydGluZy5sZW5ndGgtMV0uX2lkeCA9IDA7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIHNvcnRpbmcubGVuZ3RoICYmIHNvcnRpbmdbMF1bMF0gPT0gY29sSWR4ICkgewoJCQkvLyBTaW5nbGUgY29sdW1uIC0gYWxyZWFkeSBzb3J0aW5nIG9uIHRoaXMgY29sdW1uLCBtb2RpZnkgdGhlIHNvcnQKCQkJbmV4dFNvcnRJZHggPSBuZXh0KCBzb3J0aW5nWzBdICk7CgkKCQkJc29ydGluZy5sZW5ndGggPSAxOwoJCQlzb3J0aW5nWzBdWzFdID0gYXNTb3J0aW5nWyBuZXh0U29ydElkeCBdOwoJCQlzb3J0aW5nWzBdLl9pZHggPSBuZXh0U29ydElkeDsKCQl9CgkJZWxzZSB7CgkJCS8vIFNpbmdsZSBjb2x1bW4gLSBzb3J0IG9ubHkgb24gdGhpcyBjb2x1bW4KCQkJc29ydGluZy5sZW5ndGggPSAwOwoJCQlzb3J0aW5nLnB1c2goIFsgY29sSWR4LCBhc1NvcnRpbmdbMF0gXSApOwoJCQlzb3J0aW5nWzBdLl9pZHggPSAwOwoJCX0KCQoJCS8vIFJ1biB0aGUgc29ydCBieSBjYWxsaW5nIGEgZnVsbCByZWRyYXcKCQlfZm5SZURyYXcoIHNldHRpbmdzICk7CgkKCQkvLyBjYWxsYmFjayB1c2VkIGZvciBhc3luYyB1c2VyIGludGVyYWN0aW9uCgkJaWYgKCB0eXBlb2YgY2FsbGJhY2sgPT0gJ2Z1bmN0aW9uJyApIHsKCQkJY2FsbGJhY2soIHNldHRpbmdzICk7CgkJfQoJfQoJCgkKCS8qKgoJICogQXR0YWNoIGEgc29ydCBoYW5kbGVyIChjbGljaykgdG8gYSBub2RlCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtub2RlfSBhdHRhY2hUbyBub2RlIHRvIGF0dGFjaCB0aGUgaGFuZGxlciB0bwoJICogIEBwYXJhbSB7aW50fSBjb2xJZHggY29sdW1uIHNvcnRpbmcgaW5kZXgKCSAqICBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIGNhbGxiYWNrIGZ1bmN0aW9uCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mblNvcnRBdHRhY2hMaXN0ZW5lciAoIHNldHRpbmdzLCBhdHRhY2hUbywgY29sSWR4LCBjYWxsYmFjayApCgl7CgkJdmFyIGNvbCA9IHNldHRpbmdzLmFvQ29sdW1uc1sgY29sSWR4IF07CgkKCQlfZm5CaW5kQWN0aW9uKCBhdHRhY2hUbywge30sIGZ1bmN0aW9uIChlKSB7CgkJCS8qIElmIHRoZSBjb2x1bW4gaXMgbm90IHNvcnRhYmxlIC0gZG9uJ3QgdG8gYW55dGhpbmcgKi8KCQkJaWYgKCBjb2wuYlNvcnRhYmxlID09PSBmYWxzZSApIHsKCQkJCXJldHVybjsKCQkJfQoJCgkJCS8vIElmIHByb2Nlc3NpbmcgaXMgZW5hYmxlZCB1c2UgYSB0aW1lb3V0IHRvIGFsbG93IHRoZSBwcm9jZXNzaW5nCgkJCS8vIGRpc3BsYXkgdG8gYmUgc2hvd24gLSBvdGhlcndpc2UgdG8gaXQgc3luY2hyb25vdXNseQoJCQlpZiAoIHNldHRpbmdzLm9GZWF0dXJlcy5iUHJvY2Vzc2luZyApIHsKCQkJCV9mblByb2Nlc3NpbmdEaXNwbGF5KCBzZXR0aW5ncywgdHJ1ZSApOwoJCgkJCQlzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQkJCQlfZm5Tb3J0TGlzdGVuZXIoIHNldHRpbmdzLCBjb2xJZHgsIGUuc2hpZnRLZXksIGNhbGxiYWNrICk7CgkKCQkJCQkvLyBJbiBzZXJ2ZXItc2lkZSBwcm9jZXNzaW5nLCB0aGUgZHJhdyBjYWxsYmFjayB3aWxsIHJlbW92ZSB0aGUKCQkJCQkvLyBwcm9jZXNzaW5nIGRpc3BsYXkKCQkJCQlpZiAoIF9mbkRhdGFTb3VyY2UoIHNldHRpbmdzICkgIT09ICdzc3AnICkgewoJCQkJCQlfZm5Qcm9jZXNzaW5nRGlzcGxheSggc2V0dGluZ3MsIGZhbHNlICk7CgkJCQkJfQoJCQkJfSwgMCApOwoJCQl9CgkJCWVsc2UgewoJCQkJX2ZuU29ydExpc3RlbmVyKCBzZXR0aW5ncywgY29sSWR4LCBlLnNoaWZ0S2V5LCBjYWxsYmFjayApOwoJCQl9CgkJfSApOwoJfQoJCgkKCS8qKgoJICogU2V0IHRoZSBzb3J0aW5nIGNsYXNzZXMgb24gdGFibGUncyBib2R5LCBOb3RlOiBpdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbgoJICogd2hlbiBiU29ydCBhbmQgYlNvcnRDbGFzc2VzIGFyZSBmYWxzZQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuU29ydGluZ0NsYXNzZXMoIHNldHRpbmdzICkKCXsKCQl2YXIgb2xkU29ydCA9IHNldHRpbmdzLmFMYXN0U29ydDsKCQl2YXIgc29ydENsYXNzID0gc2V0dGluZ3Mub0NsYXNzZXMuc1NvcnRDb2x1bW47CgkJdmFyIHNvcnQgPSBfZm5Tb3J0RmxhdHRlbiggc2V0dGluZ3MgKTsKCQl2YXIgZmVhdHVyZXMgPSBzZXR0aW5ncy5vRmVhdHVyZXM7CgkJdmFyIGksIGllbiwgY29sSWR4OwoJCgkJaWYgKCBmZWF0dXJlcy5iU29ydCAmJiBmZWF0dXJlcy5iU29ydENsYXNzZXMgKSB7CgkJCS8vIFJlbW92ZSBvbGQgc29ydGluZyBjbGFzc2VzCgkJCWZvciAoIGk9MCwgaWVuPW9sZFNvcnQubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQljb2xJZHggPSBvbGRTb3J0W2ldLnNyYzsKCQoJCQkJLy8gUmVtb3ZlIGNvbHVtbiBzb3J0aW5nCgkJCQkkKCBfcGx1Y2soIHNldHRpbmdzLmFvRGF0YSwgJ2FuQ2VsbHMnLCBjb2xJZHggKSApCgkJCQkJLnJlbW92ZUNsYXNzKCBzb3J0Q2xhc3MgKyAoaTwyID8gaSsxIDogMykgKTsKCQkJfQoJCgkJCS8vIEFkZCBuZXcgY29sdW1uIHNvcnRpbmcKCQkJZm9yICggaT0wLCBpZW49c29ydC5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCWNvbElkeCA9IHNvcnRbaV0uc3JjOwoJCgkJCQkkKCBfcGx1Y2soIHNldHRpbmdzLmFvRGF0YSwgJ2FuQ2VsbHMnLCBjb2xJZHggKSApCgkJCQkJLmFkZENsYXNzKCBzb3J0Q2xhc3MgKyAoaTwyID8gaSsxIDogMykgKTsKCQkJfQoJCX0KCQoJCXNldHRpbmdzLmFMYXN0U29ydCA9IHNvcnQ7Cgl9CgkKCQoJLy8gR2V0IHRoZSBkYXRhIHRvIHNvcnQgYSBjb2x1bW4sIGJlIGl0IGZyb20gY2FjaGUsIGZyZXNoIChwb3B1bGF0aW5nIHRoZQoJLy8gY2FjaGUpLCBvciBmcm9tIGEgc29ydCBmb3JtYXR0ZXIKCWZ1bmN0aW9uIF9mblNvcnREYXRhKCBzZXR0aW5ncywgaWR4ICkKCXsKCQkvLyBDdXN0b20gc29ydGluZyBmdW5jdGlvbiAtIHByb3ZpZGVkIGJ5IHRoZSBzb3J0IGRhdGEgdHlwZQoJCXZhciBjb2x1bW4gPSBzZXR0aW5ncy5hb0NvbHVtbnNbIGlkeCBdOwoJCXZhciBjdXN0b21Tb3J0ID0gRGF0YVRhYmxlLmV4dC5vcmRlclsgY29sdW1uLnNTb3J0RGF0YVR5cGUgXTsKCQl2YXIgY3VzdG9tRGF0YTsKCQoJCWlmICggY3VzdG9tU29ydCApIHsKCQkJY3VzdG9tRGF0YSA9IGN1c3RvbVNvcnQuY2FsbCggc2V0dGluZ3Mub0luc3RhbmNlLCBzZXR0aW5ncywgaWR4LAoJCQkJX2ZuQ29sdW1uSW5kZXhUb1Zpc2libGUoIHNldHRpbmdzLCBpZHggKQoJCQkpOwoJCX0KCQoJCS8vIFVzZSAvIHBvcHVsYXRlIGNhY2hlCgkJdmFyIHJvdywgY2VsbERhdGE7CgkJdmFyIGZvcm1hdHRlciA9IERhdGFUYWJsZS5leHQudHlwZS5vcmRlclsgY29sdW1uLnNUeXBlKyItcHJlIiBdOwoJCgkJZm9yICggdmFyIGk9MCwgaWVuPXNldHRpbmdzLmFvRGF0YS5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJcm93ID0gc2V0dGluZ3MuYW9EYXRhW2ldOwoJCgkJCWlmICggISByb3cuX2FTb3J0RGF0YSApIHsKCQkJCXJvdy5fYVNvcnREYXRhID0gW107CgkJCX0KCQoJCQlpZiAoICEgcm93Ll9hU29ydERhdGFbaWR4XSB8fCBjdXN0b21Tb3J0ICkgewoJCQkJY2VsbERhdGEgPSBjdXN0b21Tb3J0ID8KCQkJCQljdXN0b21EYXRhW2ldIDogLy8gSWYgdGhlcmUgd2FzIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSBkYXRhIGZyb20gdGhlcmUKCQkJCQlfZm5HZXRDZWxsRGF0YSggc2V0dGluZ3MsIGksIGlkeCwgJ3NvcnQnICk7CgkKCQkJCXJvdy5fYVNvcnREYXRhWyBpZHggXSA9IGZvcm1hdHRlciA/CgkJCQkJZm9ybWF0dGVyKCBjZWxsRGF0YSApIDoKCQkJCQljZWxsRGF0YTsKCQkJfQoJCX0KCX0KCQoJCgkKCS8qKgoJICogU2F2ZSB0aGUgc3RhdGUgb2YgYSB0YWJsZQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuU2F2ZVN0YXRlICggc2V0dGluZ3MgKQoJewoJCWlmICggIXNldHRpbmdzLm9GZWF0dXJlcy5iU3RhdGVTYXZlIHx8IHNldHRpbmdzLmJEZXN0cm95aW5nICkKCQl7CgkJCXJldHVybjsKCQl9CgkKCQkvKiBTdG9yZSB0aGUgaW50ZXJlc3RpbmcgdmFyaWFibGVzICovCgkJdmFyIHN0YXRlID0gewoJCQl0aW1lOiAgICArbmV3IERhdGUoKSwKCQkJc3RhcnQ6ICAgc2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQsCgkJCWxlbmd0aDogIHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCwKCQkJb3JkZXI6ICAgJC5leHRlbmQoIHRydWUsIFtdLCBzZXR0aW5ncy5hYVNvcnRpbmcgKSwKCQkJc2VhcmNoOiAgX2ZuU2VhcmNoVG9DYW1lbCggc2V0dGluZ3Mub1ByZXZpb3VzU2VhcmNoICksCgkJCWNvbHVtbnM6ICQubWFwKCBzZXR0aW5ncy5hb0NvbHVtbnMsIGZ1bmN0aW9uICggY29sLCBpICkgewoJCQkJcmV0dXJuIHsKCQkJCQl2aXNpYmxlOiBjb2wuYlZpc2libGUsCgkJCQkJc2VhcmNoOiBfZm5TZWFyY2hUb0NhbWVsKCBzZXR0aW5ncy5hb1ByZVNlYXJjaENvbHNbaV0gKQoJCQkJfTsKCQkJfSApCgkJfTsKCQoJCV9mbkNhbGxiYWNrRmlyZSggc2V0dGluZ3MsICJhb1N0YXRlU2F2ZVBhcmFtcyIsICdzdGF0ZVNhdmVQYXJhbXMnLCBbc2V0dGluZ3MsIHN0YXRlXSApOwoJCgkJc2V0dGluZ3Mub1NhdmVkU3RhdGUgPSBzdGF0ZTsKCQlzZXR0aW5ncy5mblN0YXRlU2F2ZUNhbGxiYWNrLmNhbGwoIHNldHRpbmdzLm9JbnN0YW5jZSwgc2V0dGluZ3MsIHN0YXRlICk7Cgl9CgkKCQoJLyoqCgkgKiBBdHRlbXB0IHRvIGxvYWQgYSBzYXZlZCB0YWJsZSBzdGF0ZQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0ge29iamVjdH0gb0luaXQgRGF0YVRhYmxlcyBpbml0IG9iamVjdCBzbyB3ZSBjYW4gb3ZlcnJpZGUgc2V0dGluZ3MKCSAqICBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIHN0YXRlIGhhcyBiZWVuIGxvYWRlZAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5Mb2FkU3RhdGUgKCBzZXR0aW5ncywgb0luaXQsIGNhbGxiYWNrICkKCXsKCQl2YXIgaSwgaWVuOwoJCXZhciBjb2x1bW5zID0gc2V0dGluZ3MuYW9Db2x1bW5zOwoJCXZhciBsb2FkZWQgPSBmdW5jdGlvbiAoIHMgKSB7CgkJCWlmICggISBzIHx8ICEgcy50aW1lICkgewoJCQkJY2FsbGJhY2soKTsKCQkJCXJldHVybjsKCQkJfQoJCgkJCS8vIEFsbG93IGN1c3RvbSBhbmQgcGx1Zy1pbiBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIHRvIGFsdGVyIHRoZSBzYXZlZCBkYXRhIHNldCBhbmQKCQkJLy8gY2FuY2VsbGluZyBvZiBsb2FkaW5nIGJ5IHJldHVybmluZyBmYWxzZQoJCQl2YXIgYWJTdGF0ZUxvYWQgPSBfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCAnYW9TdGF0ZUxvYWRQYXJhbXMnLCAnc3RhdGVMb2FkUGFyYW1zJywgW3NldHRpbmdzLCBzXSApOwoJCQlpZiAoICQuaW5BcnJheSggZmFsc2UsIGFiU3RhdGVMb2FkICkgIT09IC0xICkgewoJCQkJY2FsbGJhY2soKTsKCQkJCXJldHVybjsKCQkJfQoJCgkJCS8vIFJlamVjdCBvbGQgZGF0YQoJCQl2YXIgZHVyYXRpb24gPSBzZXR0aW5ncy5pU3RhdGVEdXJhdGlvbjsKCQkJaWYgKCBkdXJhdGlvbiA+IDAgJiYgcy50aW1lIDwgK25ldyBEYXRlKCkgLSAoZHVyYXRpb24qMTAwMCkgKSB7CgkJCQljYWxsYmFjaygpOwoJCQkJcmV0dXJuOwoJCQl9CgkKCQkJLy8gTnVtYmVyIG9mIGNvbHVtbnMgaGF2ZSBjaGFuZ2VkIC0gYWxsIGJldHMgYXJlIG9mZiwgbm8gcmVzdG9yZSBvZiBzZXR0aW5ncwoJCQlpZiAoIHMuY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCAhPT0gcy5jb2x1bW5zLmxlbmd0aCApIHsKCQkJCWNhbGxiYWNrKCk7CgkJCQlyZXR1cm47CgkJCX0KCQoJCQkvLyBTdG9yZSB0aGUgc2F2ZWQgc3RhdGUgc28gaXQgbWlnaHQgYmUgYWNjZXNzZWQgYXQgYW55IHRpbWUKCQkJc2V0dGluZ3Mub0xvYWRlZFN0YXRlID0gJC5leHRlbmQoIHRydWUsIHt9LCBzICk7CgkKCQkJLy8gUmVzdG9yZSBrZXkgZmVhdHVyZXMgLSB0b2RvIC0gZm9yIDEuMTEgdGhpcyBuZWVkcyB0byBiZSBkb25lIGJ5CgkJCS8vIHN1YnNjcmliZWQgZXZlbnRzCgkJCWlmICggcy5zdGFydCAhPT0gdW5kZWZpbmVkICkgewoJCQkJc2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQgICAgPSBzLnN0YXJ0OwoJCQkJc2V0dGluZ3MuaUluaXREaXNwbGF5U3RhcnQgPSBzLnN0YXJ0OwoJCQl9CgkJCWlmICggcy5sZW5ndGggIT09IHVuZGVmaW5lZCApIHsKCQkJCXNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCAgID0gcy5sZW5ndGg7CgkJCX0KCQoJCQkvLyBPcmRlcgoJCQlpZiAoIHMub3JkZXIgIT09IHVuZGVmaW5lZCApIHsKCQkJCXNldHRpbmdzLmFhU29ydGluZyA9IFtdOwoJCQkJJC5lYWNoKCBzLm9yZGVyLCBmdW5jdGlvbiAoIGksIGNvbCApIHsKCQkJCQlzZXR0aW5ncy5hYVNvcnRpbmcucHVzaCggY29sWzBdID49IGNvbHVtbnMubGVuZ3RoID8KCQkJCQkJWyAwLCBjb2xbMV0gXSA6CgkJCQkJCWNvbAoJCQkJCSk7CgkJCQl9ICk7CgkJCX0KCQoJCQkvLyBTZWFyY2gKCQkJaWYgKCBzLnNlYXJjaCAhPT0gdW5kZWZpbmVkICkgewoJCQkJJC5leHRlbmQoIHNldHRpbmdzLm9QcmV2aW91c1NlYXJjaCwgX2ZuU2VhcmNoVG9IdW5nKCBzLnNlYXJjaCApICk7CgkJCX0KCQoJCQkvLyBDb2x1bW5zCgkJCS8vCgkJCWlmICggcy5jb2x1bW5zICkgewoJCQkJZm9yICggaT0wLCBpZW49cy5jb2x1bW5zLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCXZhciBjb2wgPSBzLmNvbHVtbnNbaV07CgkKCQkJCQkvLyBWaXNpYmlsaXR5CgkJCQkJaWYgKCBjb2wudmlzaWJsZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCQljb2x1bW5zW2ldLmJWaXNpYmxlID0gY29sLnZpc2libGU7CgkJCQkJfQoJCgkJCQkJLy8gU2VhcmNoCgkJCQkJaWYgKCBjb2wuc2VhcmNoICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJCSQuZXh0ZW5kKCBzZXR0aW5ncy5hb1ByZVNlYXJjaENvbHNbaV0sIF9mblNlYXJjaFRvSHVuZyggY29sLnNlYXJjaCApICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkKCQkJX2ZuQ2FsbGJhY2tGaXJlKCBzZXR0aW5ncywgJ2FvU3RhdGVMb2FkZWQnLCAnc3RhdGVMb2FkZWQnLCBbc2V0dGluZ3MsIHNdICk7CgkJCWNhbGxiYWNrKCk7CgkJfQoJCgkJaWYgKCAhIHNldHRpbmdzLm9GZWF0dXJlcy5iU3RhdGVTYXZlICkgewoJCQljYWxsYmFjaygpOwoJCQlyZXR1cm47CgkJfQoJCgkJdmFyIHN0YXRlID0gc2V0dGluZ3MuZm5TdGF0ZUxvYWRDYWxsYmFjay5jYWxsKCBzZXR0aW5ncy5vSW5zdGFuY2UsIHNldHRpbmdzLCBsb2FkZWQgKTsKCQoJCWlmICggc3RhdGUgIT09IHVuZGVmaW5lZCApIHsKCQkJbG9hZGVkKCBzdGF0ZSApOwoJCX0KCQkvLyBvdGhlcndpc2UsIHdhaXQgZm9yIHRoZSBsb2FkZWQgY2FsbGJhY2sgdG8gYmUgZXhlY3V0ZWQKCX0KCQoJCgkvKioKCSAqIFJldHVybiB0aGUgc2V0dGluZ3Mgb2JqZWN0IGZvciBhIHBhcnRpY3VsYXIgdGFibGUKCSAqICBAcGFyYW0ge25vZGV9IHRhYmxlIHRhYmxlIHdlIGFyZSB1c2luZyBhcyBhIGRhdGFUYWJsZQoJICogIEByZXR1cm5zIHtvYmplY3R9IFNldHRpbmdzIG9iamVjdCAtIG9yIG51bGwgaWYgbm90IGZvdW5kCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mblNldHRpbmdzRnJvbU5vZGUgKCB0YWJsZSApCgl7CgkJdmFyIHNldHRpbmdzID0gRGF0YVRhYmxlLnNldHRpbmdzOwoJCXZhciBpZHggPSAkLmluQXJyYXkoIHRhYmxlLCBfcGx1Y2soIHNldHRpbmdzLCAnblRhYmxlJyApICk7CgkKCQlyZXR1cm4gaWR4ICE9PSAtMSA/CgkJCXNldHRpbmdzWyBpZHggXSA6CgkJCW51bGw7Cgl9CgkKCQoJLyoqCgkgKiBMb2cgYW4gZXJyb3IgbWVzc2FnZQoJICogIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7aW50fSBsZXZlbCBsb2cgZXJyb3IgbWVzc2FnZXMsIG9yIGRpc3BsYXkgdGhlbSB0byB0aGUgdXNlcgoJICogIEBwYXJhbSB7c3RyaW5nfSBtc2cgZXJyb3IgbWVzc2FnZQoJICogIEBwYXJhbSB7aW50fSB0biBUZWNobmljYWwgbm90ZSBpZCB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkxvZyggc2V0dGluZ3MsIGxldmVsLCBtc2csIHRuICkKCXsKCQltc2cgPSAnRGF0YVRhYmxlcyB3YXJuaW5nOiAnKwoJCQkoc2V0dGluZ3MgPyAndGFibGUgaWQ9JytzZXR0aW5ncy5zVGFibGVJZCsnIC0gJyA6ICcnKSttc2c7CgkKCQlpZiAoIHRuICkgewoJCQltc2cgKz0gJy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlcnJvciwgcGxlYXNlIHNlZSAnKwoJCQknaHR0cDovL2RhdGF0YWJsZXMubmV0L3RuLycrdG47CgkJfQoJCgkJaWYgKCAhIGxldmVsICApIHsKCQkJLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcHJlIDEuMTAKCQkJdmFyIGV4dCA9IERhdGFUYWJsZS5leHQ7CgkJCXZhciB0eXBlID0gZXh0LnNFcnJNb2RlIHx8IGV4dC5lcnJNb2RlOwoJCgkJCWlmICggc2V0dGluZ3MgKSB7CgkJCQlfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCBudWxsLCAnZXJyb3InLCBbIHNldHRpbmdzLCB0biwgbXNnIF0gKTsKCQkJfQoJCgkJCWlmICggdHlwZSA9PSAnYWxlcnQnICkgewoJCQkJYWxlcnQoIG1zZyApOwoJCQl9CgkJCWVsc2UgaWYgKCB0eXBlID09ICd0aHJvdycgKSB7CgkJCQl0aHJvdyBuZXcgRXJyb3IobXNnKTsKCQkJfQoJCQllbHNlIGlmICggdHlwZW9mIHR5cGUgPT0gJ2Z1bmN0aW9uJyApIHsKCQkJCXR5cGUoIHNldHRpbmdzLCB0biwgbXNnICk7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICkgewoJCQljb25zb2xlLmxvZyggbXNnICk7CgkJfQoJfQoJCgkKCS8qKgoJICogU2VlIGlmIGEgcHJvcGVydHkgaXMgZGVmaW5lZCBvbiBvbmUgb2JqZWN0LCBpZiBzbyBhc3NpZ24gaXQgdG8gdGhlIG90aGVyIG9iamVjdAoJICogIEBwYXJhbSB7b2JqZWN0fSByZXQgdGFyZ2V0IG9iamVjdAoJICogIEBwYXJhbSB7b2JqZWN0fSBzcmMgc291cmNlIG9iamVjdAoJICogIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHByb3BlcnR5CgkgKiAgQHBhcmFtIHtzdHJpbmd9IFttYXBwZWROYW1lXSBuYW1lIHRvIG1hcCB0b28gLSBvcHRpb25hbCwgbmFtZSB1c2VkIGlmIG5vdCBnaXZlbgoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5NYXAoIHJldCwgc3JjLCBuYW1lLCBtYXBwZWROYW1lICkKCXsKCQlpZiAoICQuaXNBcnJheSggbmFtZSApICkgewoJCQkkLmVhY2goIG5hbWUsIGZ1bmN0aW9uIChpLCB2YWwpIHsKCQkJCWlmICggJC5pc0FycmF5KCB2YWwgKSApIHsKCQkJCQlfZm5NYXAoIHJldCwgc3JjLCB2YWxbMF0sIHZhbFsxXSApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJX2ZuTWFwKCByZXQsIHNyYywgdmFsICk7CgkJCQl9CgkJCX0gKTsKCQoJCQlyZXR1cm47CgkJfQoJCgkJaWYgKCBtYXBwZWROYW1lID09PSB1bmRlZmluZWQgKSB7CgkJCW1hcHBlZE5hbWUgPSBuYW1lOwoJCX0KCQoJCWlmICggc3JjW25hbWVdICE9PSB1bmRlZmluZWQgKSB7CgkJCXJldFttYXBwZWROYW1lXSA9IHNyY1tuYW1lXTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBFeHRlbmQgb2JqZWN0cyAtIHZlcnkgc2ltaWxhciB0byBqUXVlcnkuZXh0ZW5kLCBidXQgZGVlcCBjb3B5IG9iamVjdHMsIGFuZAoJICogc2hhbGxvdyBjb3B5IGFycmF5cy4gVGhlIHJlYXNvbiB3ZSBuZWVkIHRvIGRvIHRoaXMsIGlzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0bwoJICogZGVlcCBjb3B5IGFycmF5IGluaXQgdmFsdWVzIChzdWNoIGFzIGFhU29ydGluZykgc2luY2UgdGhlIGRldiB3b3VsZG4ndCBiZQoJICogYWJsZSB0byBvdmVycmlkZSB0aGVtLCBidXQgd2UgZG8gd2FudCB0byBkZWVwIGNvcHkgYXJyYXlzLgoJICogIEBwYXJhbSB7b2JqZWN0fSBvdXQgT2JqZWN0IHRvIGV4dGVuZAoJICogIEBwYXJhbSB7b2JqZWN0fSBleHRlbmRlciBPYmplY3QgZnJvbSB3aGljaCB0aGUgcHJvcGVydGllcyB3aWxsIGJlIGFwcGxpZWQgdG8KCSAqICAgICAgb3V0CgkgKiAgQHBhcmFtIHtib29sZWFufSBicmVha1JlZnMgSWYgdHJ1ZSwgdGhlbiBhcnJheXMgd2lsbCBiZSBzbGljZWQgdG8gdGFrZSBhbgoJICogICAgICBpbmRlcGVuZGVudCBjb3B5IHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgYGRhdGFgIG9yIGBhYURhdGFgIHBhcmFtZXRlcnMKCSAqICAgICAgaWYgdGhleSBhcmUgcHJlc2VudC4gVGhpcyBpcyBzbyB5b3UgY2FuIHBhc3MgaW4gYSBjb2xsZWN0aW9uIHRvCgkgKiAgICAgIERhdGFUYWJsZXMgYW5kIGhhdmUgdGhhdCB1c2VkIGFzIHlvdXIgZGF0YSBzb3VyY2Ugd2l0aG91dCBicmVha2luZyB0aGUKCSAqICAgICAgcmVmZXJlbmNlcwoJICogIEByZXR1cm5zIHtvYmplY3R9IG91dCBSZWZlcmVuY2UsIGp1c3QgZm9yIGNvbnZlbmllbmNlIC0gb3V0ID09PSB0aGUgcmV0dXJuLgoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICogIEB0b2RvIFRoaXMgZG9lc24ndCB0YWtlIGFjY291bnQgb2YgYXJyYXlzIGluc2lkZSB0aGUgZGVlcCBjb3BpZWQgb2JqZWN0cy4KCSAqLwoJZnVuY3Rpb24gX2ZuRXh0ZW5kKCBvdXQsIGV4dGVuZGVyLCBicmVha1JlZnMgKQoJewoJCXZhciB2YWw7CgkKCQlmb3IgKCB2YXIgcHJvcCBpbiBleHRlbmRlciApIHsKCQkJaWYgKCBleHRlbmRlci5oYXNPd25Qcm9wZXJ0eShwcm9wKSApIHsKCQkJCXZhbCA9IGV4dGVuZGVyW3Byb3BdOwoJCgkJCQlpZiAoICQuaXNQbGFpbk9iamVjdCggdmFsICkgKSB7CgkJCQkJaWYgKCAhICQuaXNQbGFpbk9iamVjdCggb3V0W3Byb3BdICkgKSB7CgkJCQkJCW91dFtwcm9wXSA9IHt9OwoJCQkJCX0KCQkJCQkkLmV4dGVuZCggdHJ1ZSwgb3V0W3Byb3BdLCB2YWwgKTsKCQkJCX0KCQkJCWVsc2UgaWYgKCBicmVha1JlZnMgJiYgcHJvcCAhPT0gJ2RhdGEnICYmIHByb3AgIT09ICdhYURhdGEnICYmICQuaXNBcnJheSh2YWwpICkgewoJCQkJCW91dFtwcm9wXSA9IHZhbC5zbGljZSgpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJb3V0W3Byb3BdID0gdmFsOwoJCQkJfQoJCQl9CgkJfQoJCgkJcmV0dXJuIG91dDsKCX0KCQoJCgkvKioKCSAqIEJpbmQgYW4gZXZlbnQgaGFuZGVycyB0byBhbGxvdyBhIGNsaWNrIG9yIHJldHVybiBrZXkgdG8gYWN0aXZhdGUgdGhlIGNhbGxiYWNrLgoJICogVGhpcyBpcyBnb29kIGZvciBhY2Nlc3NpYmlsaXR5IHNpbmNlIGEgcmV0dXJuIG9uIHRoZSBrZXlib2FyZCB3aWxsIGhhdmUgdGhlCgkgKiBzYW1lIGVmZmVjdCBhcyBhIGNsaWNrLCBpZiB0aGUgZWxlbWVudCBoYXMgZm9jdXMuCgkgKiAgQHBhcmFtIHtlbGVtZW50fSBuIEVsZW1lbnQgdG8gYmluZCB0aGUgYWN0aW9uIHRvCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9EYXRhIERhdGEgb2JqZWN0IHRvIHBhc3MgdG8gdGhlIHRyaWdnZXJlZCBmdW5jdGlvbgoJICogIEBwYXJhbSB7ZnVuY3Rpb259IGZuIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuQmluZEFjdGlvbiggbiwgb0RhdGEsIGZuICkKCXsKCQkkKG4pCgkJCS5vbiggJ2NsaWNrLkRUJywgb0RhdGEsIGZ1bmN0aW9uIChlKSB7CgkJCQkJJChuKS5ibHVyKCk7IC8vIFJlbW92ZSBmb2N1cyBvdXRsaW5lIGZvciBtb3VzZSB1c2VycwoJCQkJCWZuKGUpOwoJCQkJfSApCgkJCS5vbiggJ2tleXByZXNzLkRUJywgb0RhdGEsIGZ1bmN0aW9uIChlKXsKCQkJCQlpZiAoIGUud2hpY2ggPT09IDEzICkgewoJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCWZuKGUpOwoJCQkJCX0KCQkJCX0gKQoJCQkub24oICdzZWxlY3RzdGFydC5EVCcsIGZ1bmN0aW9uICgpIHsKCQkJCQkvKiBUYWtlIHRoZSBicnV0YWwgYXBwcm9hY2ggdG8gY2FuY2VsbGluZyB0ZXh0IHNlbGVjdGlvbiAqLwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0gKTsKCX0KCQoJCgkvKioKCSAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24uIEVhc2lseSBhbGxvd3MgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBhZGRlZCB0bwoJICogYW4gYXJyYXkgc3RvcmUgb2YgY2FsbGJhY2sgZnVuY3Rpb25zIHRoYXQgY2FuIHRoZW4gYWxsIGJlIGNhbGxlZCB0b2dldGhlci4KCSAqICBAcGFyYW0ge29iamVjdH0gb1NldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtzdHJpbmd9IHNTdG9yZSBOYW1lIG9mIHRoZSBhcnJheSBzdG9yYWdlIGZvciB0aGUgY2FsbGJhY2tzIGluIG9TZXR0aW5ncwoJICogIEBwYXJhbSB7ZnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiYWNrCgkgKiAgQHBhcmFtIHtzdHJpbmd9IHNOYW1lIElkZW50aWZ5aW5nIG5hbWUgZm9yIHRoZSBjYWxsYmFjayAoaS5lLiBhIGxhYmVsKQoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5DYWxsYmFja1JlZyggb1NldHRpbmdzLCBzU3RvcmUsIGZuLCBzTmFtZSApCgl7CgkJaWYgKCBmbiApCgkJewoJCQlvU2V0dGluZ3Nbc1N0b3JlXS5wdXNoKCB7CgkJCQkiZm4iOiBmbiwKCQkJCSJzTmFtZSI6IHNOYW1lCgkJCX0gKTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBGaXJlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhbmQgdHJpZ2dlciBldmVudHMuIE5vdGUgdGhhdCB0aGUgbG9vcCBvdmVyIHRoZQoJICogY2FsbGJhY2sgYXJyYXkgc3RvcmUgaXMgZG9uZSBiYWNrd2FyZHMhIEZ1cnRoZXIgbm90ZSB0aGF0IHlvdSBkbyBub3Qgd2FudCB0bwoJICogZmlyZSBvZmYgdHJpZ2dlcnMgaW4gdGltZSBzZW5zaXRpdmUgYXBwbGljYXRpb25zIChmb3IgZXhhbXBsZSBjZWxsIGNyZWF0aW9uKQoJICogYXMgaXRzIHNsb3cuCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrQXJyIE5hbWUgb2YgdGhlIGFycmF5IHN0b3JhZ2UgZm9yIHRoZSBjYWxsYmFja3MgaW4KCSAqICAgICAgb1NldHRpbmdzCgkgKiAgQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBqUXVlcnkgY3VzdG9tIGV2ZW50IHRvIHRyaWdnZXIuIElmCgkgKiAgICAgIG51bGwgbm8gdHJpZ2dlciBpcyBmaXJlZAoJICogIEBwYXJhbSB7YXJyYXl9IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIC8KCSAqICAgICAgdHJpZ2dlcgoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCBjYWxsYmFja0FyciwgZXZlbnROYW1lLCBhcmdzICkKCXsKCQl2YXIgcmV0ID0gW107CgkKCQlpZiAoIGNhbGxiYWNrQXJyICkgewoJCQlyZXQgPSAkLm1hcCggc2V0dGluZ3NbY2FsbGJhY2tBcnJdLnNsaWNlKCkucmV2ZXJzZSgpLCBmdW5jdGlvbiAodmFsLCBpKSB7CgkJCQlyZXR1cm4gdmFsLmZuLmFwcGx5KCBzZXR0aW5ncy5vSW5zdGFuY2UsIGFyZ3MgKTsKCQkJfSApOwoJCX0KCQoJCWlmICggZXZlbnROYW1lICE9PSBudWxsICkgewoJCQl2YXIgZSA9ICQuRXZlbnQoIGV2ZW50TmFtZSsnLmR0JyApOwoJCgkJCSQoc2V0dGluZ3MublRhYmxlKS50cmlnZ2VyKCBlLCBhcmdzICk7CgkKCQkJcmV0LnB1c2goIGUucmVzdWx0ICk7CgkJfQoJCgkJcmV0dXJuIHJldDsKCX0KCQoJCglmdW5jdGlvbiBfZm5MZW5ndGhPdmVyZmxvdyAoIHNldHRpbmdzICkKCXsKCQl2YXIKCQkJc3RhcnQgPSBzZXR0aW5ncy5faURpc3BsYXlTdGFydCwKCQkJZW5kID0gc2V0dGluZ3MuZm5EaXNwbGF5RW5kKCksCgkJCWxlbiA9IHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aDsKCQoJCS8qIElmIHdlIGhhdmUgc3BhY2UgdG8gc2hvdyBleHRyYSByb3dzIChiYWNraW5nIHVwIGZyb20gdGhlIGVuZCBwb2ludCAtIHRoZW4gZG8gc28gKi8KCQlpZiAoIHN0YXJ0ID49IGVuZCApCgkJewoJCQlzdGFydCA9IGVuZCAtIGxlbjsKCQl9CgkKCQkvLyBLZWVwIHRoZSBzdGFydCByZWNvcmQgb24gdGhlIGN1cnJlbnQgcGFnZQoJCXN0YXJ0IC09IChzdGFydCAlIGxlbik7CgkKCQlpZiAoIGxlbiA9PT0gLTEgfHwgc3RhcnQgPCAwICkKCQl7CgkJCXN0YXJ0ID0gMDsKCQl9CgkKCQlzZXR0aW5ncy5faURpc3BsYXlTdGFydCA9IHN0YXJ0OwoJfQoJCgkKCWZ1bmN0aW9uIF9mblJlbmRlcmVyKCBzZXR0aW5ncywgdHlwZSApCgl7CgkJdmFyIHJlbmRlcmVyID0gc2V0dGluZ3MucmVuZGVyZXI7CgkJdmFyIGhvc3QgPSBEYXRhVGFibGUuZXh0LnJlbmRlcmVyW3R5cGVdOwoJCgkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHJlbmRlcmVyICkgJiYgcmVuZGVyZXJbdHlwZV0gKSB7CgkJCS8vIFNwZWNpZmljIHJlbmRlcmVyIGZvciB0aGlzIHR5cGUuIElmIGF2YWlsYWJsZSB1c2UgaXQsIG90aGVyd2lzZSB1c2UKCQkJLy8gdGhlIGRlZmF1bHQuCgkJCXJldHVybiBob3N0W3JlbmRlcmVyW3R5cGVdXSB8fCBob3N0Ll87CgkJfQoJCWVsc2UgaWYgKCB0eXBlb2YgcmVuZGVyZXIgPT09ICdzdHJpbmcnICkgewoJCQkvLyBDb21tb24gcmVuZGVyZXIgLSBpZiB0aGVyZSBpcyBvbmUgYXZhaWxhYmxlIGZvciB0aGlzIHR5cGUgdXNlIGl0LAoJCQkvLyBvdGhlcndpc2UgdXNlIHRoZSBkZWZhdWx0CgkJCXJldHVybiBob3N0W3JlbmRlcmVyXSB8fCBob3N0Ll87CgkJfQoJCgkJLy8gVXNlIHRoZSBkZWZhdWx0CgkJcmV0dXJuIGhvc3QuXzsKCX0KCQoJCgkvKioKCSAqIERldGVjdCB0aGUgZGF0YSBzb3VyY2UgYmVpbmcgdXNlZCBmb3IgdGhlIHRhYmxlLiBVc2VkIHRvIHNpbXBsaWZ5IHRoZSBjb2RlCgkgKiBhIGxpdHRsZSAoYWpheCkgYW5kIHRvIG1ha2UgaXQgY29tcHJlc3MgYSBsaXR0bGUgc21hbGxlci4KCSAqCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHJldHVybnMge3N0cmluZ30gRGF0YSBzb3VyY2UKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuRGF0YVNvdXJjZSAoIHNldHRpbmdzICkKCXsKCQlpZiAoIHNldHRpbmdzLm9GZWF0dXJlcy5iU2VydmVyU2lkZSApIHsKCQkJcmV0dXJuICdzc3AnOwoJCX0KCQllbHNlIGlmICggc2V0dGluZ3MuYWpheCB8fCBzZXR0aW5ncy5zQWpheFNvdXJjZSApIHsKCQkJcmV0dXJuICdhamF4JzsKCQl9CgkJcmV0dXJuICdkb20nOwoJfQoJCgoJCgkKCS8qKgoJICogQ29tcHV0ZWQgc3RydWN0dXJlIG9mIHRoZSBEYXRhVGFibGVzIEFQSSwgZGVmaW5lZCBieSB0aGUgb3B0aW9ucyBwYXNzZWQgdG8KCSAqIGBEYXRhVGFibGUuQXBpLnJlZ2lzdGVyKClgIHdoZW4gYnVpbGRpbmcgdGhlIEFQSS4KCSAqCgkgKiBUaGUgc3RydWN0dXJlIGlzIGJ1aWx0IGluIG9yZGVyIHRvIHNwZWVkIGNyZWF0aW9uIGFuZCBleHRlbnNpb24gb2YgdGhlIEFwaQoJICogb2JqZWN0cyBzaW5jZSB0aGUgZXh0ZW5zaW9ucyBhcmUgZWZmZWN0aXZlbHkgcHJlLXBhcnNlZC4KCSAqCgkgKiBUaGUgYXJyYXkgaXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLCB3aGVyZSB0aGlzCgkgKiBiYXNlIGFycmF5IHJlcHJlc2VudHMgdGhlIEFwaSBwcm90b3R5cGUgYmFzZToKCSAqCgkgKiAgICAgWwoJICogICAgICAgewoJICogICAgICAgICBuYW1lOiAgICAgICdkYXRhJyAgICAgICAgICAgICAgICAtLSBzdHJpbmcgICAtIFByb3BlcnR5IG5hbWUKCSAqICAgICAgICAgdmFsOiAgICAgICBmdW5jdGlvbiAoKSB7fSwgICAgICAgLS0gZnVuY3Rpb24gLSBBcGkgbWV0aG9kIChvciB1bmRlZmluZWQgaWYganVzdCBhbiBvYmplY3QKCSAqICAgICAgICAgbWV0aG9kRXh0OiBbIC4uLiBdLCAgICAgICAgICAgICAgLS0gYXJyYXkgICAgLSBBcnJheSBvZiBBcGkgb2JqZWN0IGRlZmluaXRpb25zIHRvIGV4dGVuZCB0aGUgbWV0aG9kIHJlc3VsdAoJICogICAgICAgICBwcm9wRXh0OiAgIFsgLi4uIF0gICAgICAgICAgICAgICAtLSBhcnJheSAgICAtIEFycmF5IG9mIEFwaSBvYmplY3QgZGVmaW5pdGlvbnMgdG8gZXh0ZW5kIHRoZSBwcm9wZXJ0eQoJICogICAgICAgfSwKCSAqICAgICAgIHsKCSAqICAgICAgICAgbmFtZTogICAgICdyb3cnCgkgKiAgICAgICAgIHZhbDogICAgICAge30sCgkgKiAgICAgICAgIG1ldGhvZEV4dDogWyAuLi4gXSwKCSAqICAgICAgICAgcHJvcEV4dDogICBbCgkgKiAgICAgICAgICAgewoJICogICAgICAgICAgICAgbmFtZTogICAgICAnZGF0YScKCSAqICAgICAgICAgICAgIHZhbDogICAgICAgZnVuY3Rpb24gKCkge30sCgkgKiAgICAgICAgICAgICBtZXRob2RFeHQ6IFsgLi4uIF0sCgkgKiAgICAgICAgICAgICBwcm9wRXh0OiAgIFsgLi4uIF0KCSAqICAgICAgICAgICB9LAoJICogICAgICAgICAgIC4uLgoJICogICAgICAgICBdCgkgKiAgICAgICB9CgkgKiAgICAgXQoJICoKCSAqIEB0eXBlIHtBcnJheX0KCSAqIEBpZ25vcmUKCSAqLwoJdmFyIF9fYXBpU3RydWN0ID0gW107CgkKCQoJLyoqCgkgKiBgQXJyYXkucHJvdG90eXBlYCByZWZlcmVuY2UuCgkgKgoJICogQHR5cGUgb2JqZWN0CgkgKiBAaWdub3JlCgkgKi8KCXZhciBfX2FycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7CgkKCQoJLyoqCgkgKiBBYnN0cmFjdGlvbiBmb3IgYGNvbnRleHRgIHBhcmFtZXRlciBvZiB0aGUgYEFwaWAgY29uc3RydWN0b3IgdG8gYWxsb3cgaXQgdG8KCSAqIHRha2Ugc2V2ZXJhbCBkaWZmZXJlbnQgZm9ybXMgZm9yIGVhc2Ugb2YgdXNlLgoJICoKCSAqIEVhY2ggb2YgdGhlIGlucHV0IHBhcmFtZXRlciB0eXBlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIERhdGFUYWJsZXMgc2V0dGluZ3MKCSAqIG9iamVjdCB3aGVyZSBwb3NzaWJsZS4KCSAqCgkgKiBAcGFyYW0gIHtzdHJpbmd8bm9kZXxqUXVlcnl8b2JqZWN0fSBtaXhlZCBEYXRhVGFibGUgaWRlbnRpZmllci4gQ2FuIGJlIG9uZQoJICogICBvZjoKCSAqCgkgKiAgICogYHN0cmluZ2AgLSBqUXVlcnkgc2VsZWN0b3IuIEFueSBEYXRhVGFibGVzJyBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IKCSAqICAgICB3aXRoIGJlIGZvdW5kIGFuZCB1c2VkLgoJICogICAqIGBub2RlYCAtIGBUQUJMRWAgbm9kZSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGZvcm1lZCBpbnRvIGEgRGF0YVRhYmxlLgoJICogICAqIGBqUXVlcnlgIC0gQSBqUXVlcnkgb2JqZWN0IG9mIGBUQUJMRWAgbm9kZXMuCgkgKiAgICogYG9iamVjdGAgLSBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogICAqIGBEYXRhVGFibGVzLkFwaWAgLSBBUEkgaW5zdGFuY2UKCSAqIEByZXR1cm4ge2FycmF5fG51bGx9IE1hdGNoaW5nIERhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0cy4gYG51bGxgIG9yCgkgKiAgIGB1bmRlZmluZWRgIGlzIHJldHVybmVkIGlmIG5vIG1hdGNoaW5nIERhdGFUYWJsZSBpcyBmb3VuZC4KCSAqIEBpZ25vcmUKCSAqLwoJdmFyIF90b1NldHRpbmdzID0gZnVuY3Rpb24gKCBtaXhlZCApCgl7CgkJdmFyIGlkeCwganE7CgkJdmFyIHNldHRpbmdzID0gRGF0YVRhYmxlLnNldHRpbmdzOwoJCXZhciB0YWJsZXMgPSAkLm1hcCggc2V0dGluZ3MsIGZ1bmN0aW9uIChlbCwgaSkgewoJCQlyZXR1cm4gZWwublRhYmxlOwoJCX0gKTsKCQoJCWlmICggISBtaXhlZCApIHsKCQkJcmV0dXJuIFtdOwoJCX0KCQllbHNlIGlmICggbWl4ZWQublRhYmxlICYmIG1peGVkLm9BcGkgKSB7CgkJCS8vIERhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkJCXJldHVybiBbIG1peGVkIF07CgkJfQoJCWVsc2UgaWYgKCBtaXhlZC5ub2RlTmFtZSAmJiBtaXhlZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGFibGUnICkgewoJCQkvLyBUYWJsZSBub2RlCgkJCWlkeCA9ICQuaW5BcnJheSggbWl4ZWQsIHRhYmxlcyApOwoJCQlyZXR1cm4gaWR4ICE9PSAtMSA/IFsgc2V0dGluZ3NbaWR4XSBdIDogbnVsbDsKCQl9CgkJZWxzZSBpZiAoIG1peGVkICYmIHR5cGVvZiBtaXhlZC5zZXR0aW5ncyA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJcmV0dXJuIG1peGVkLnNldHRpbmdzKCkudG9BcnJheSgpOwoJCX0KCQllbHNlIGlmICggdHlwZW9mIG1peGVkID09PSAnc3RyaW5nJyApIHsKCQkJLy8galF1ZXJ5IHNlbGVjdG9yCgkJCWpxID0gJChtaXhlZCk7CgkJfQoJCWVsc2UgaWYgKCBtaXhlZCBpbnN0YW5jZW9mICQgKSB7CgkJCS8vIGpRdWVyeSBvYmplY3QgKGFsc28gRGF0YVRhYmxlcyBpbnN0YW5jZSkKCQkJanEgPSBtaXhlZDsKCQl9CgkKCQlpZiAoIGpxICkgewoJCQlyZXR1cm4ganEubWFwKCBmdW5jdGlvbihpKSB7CgkJCQlpZHggPSAkLmluQXJyYXkoIHRoaXMsIHRhYmxlcyApOwoJCQkJcmV0dXJuIGlkeCAhPT0gLTEgPyBzZXR0aW5nc1tpZHhdIDogbnVsbDsKCQkJfSApLnRvQXJyYXkoKTsKCQl9Cgl9OwoJCgkKCS8qKgoJICogRGF0YVRhYmxlcyBBUEkgY2xhc3MgLSB1c2VkIHRvIGNvbnRyb2wgYW5kIGludGVyZmFjZSB3aXRoICBvbmUgb3IgbW9yZQoJICogRGF0YVRhYmxlcyBlbmhhbmNlZCB0YWJsZXMuCgkgKgoJICogVGhlIEFQSSBjbGFzcyBpcyBoZWF2aWx5IGJhc2VkIG9uIGpRdWVyeSwgcHJlc2VudGluZyBhIGNoYWluYWJsZSBpbnRlcmZhY2UKCSAqIHRoYXQgeW91IGNhbiB1c2UgdG8gaW50ZXJhY3Qgd2l0aCB0YWJsZXMuIEVhY2ggaW5zdGFuY2Ugb2YgdGhlIEFQSSBjbGFzcyBoYXMKCSAqIGEgImNvbnRleHQiIC0gaS5lLiB0aGUgdGFibGVzIHRoYXQgaXQgd2lsbCBvcGVyYXRlIG9uLiBUaGlzIGNvdWxkIGJlIGEgc2luZ2xlCgkgKiB0YWJsZSwgYWxsIHRhYmxlcyBvbiBhIHBhZ2Ugb3IgYSBzdWItc2V0IHRoZXJlb2YuCgkgKgoJICogQWRkaXRpb25hbGx5IHRoZSBBUEkgaXMgZGVzaWduZWQgdG8gYWxsb3cgeW91IHRvIA=="
},
{
"key": "jquery.dataTables.js?4?1?2",
"type": "binary",
"value": "base64:ZWFzaWx5IHdvcmsgd2l0aCB0aGUgZGF0YSBpbgoJICogdGhlIHRhYmxlcywgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGl0IGFzIHJlcXVpcmVkLiBUaGlzIGlzIGRvbmUgYnkKCSAqIHByZXNlbnRpbmcgdGhlIEFQSSBjbGFzcyBhcyBhbiBhcnJheSBsaWtlIGludGVyZmFjZS4gVGhlIGNvbnRlbnRzIG9mIHRoZQoJICogYXJyYXkgZGVwZW5kIHVwb24gdGhlIGFjdGlvbnMgcmVxdWVzdGVkIGJ5IGVhY2ggbWV0aG9kIChmb3IgZXhhbXBsZQoJICogYHJvd3MoKS5ub2RlcygpYCB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBub2Rlcywgd2hpbGUgYHJvd3MoKS5kYXRhKClgIHdpbGwKCSAqIHJldHVybiBhbiBhcnJheSBvZiBvYmplY3RzIG9yIGFycmF5cyBkZXBlbmRpbmcgdXBvbiB5b3VyIHRhYmxlJ3MKCSAqIGNvbmZpZ3VyYXRpb24pLiBUaGUgQVBJIG9iamVjdCBoYXMgYSBudW1iZXIgb2YgYXJyYXkgbGlrZSBtZXRob2RzIChgcHVzaGAsCgkgKiBgcG9wYCwgYHJldmVyc2VgIGV0YykgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGhlbHBlciBtZXRob2RzIChgZWFjaGAsIGBwbHVja2AsCgkgKiBgdW5pcXVlYCBldGMpIHRvIGFzc2lzdCB5b3VyIHdvcmtpbmcgd2l0aCB0aGUgZGF0YSBoZWxkIGluIGEgdGFibGUuCgkgKgoJICogTW9zdCBtZXRob2RzICh0aG9zZSB3aGljaCByZXR1cm4gYW4gQXBpIGluc3RhbmNlKSBhcmUgY2hhaW5hYmxlLCB3aGljaCBtZWFucwoJICogdGhlIHJldHVybiBmcm9tIGEgbWV0aG9kIGNhbGwgYWxzbyBoYXMgYWxsIG9mIHRoZSBtZXRob2RzIGF2YWlsYWJsZSB0aGF0IHRoZQoJICogdG9wIGxldmVsIG9iamVjdCBoYWQuIEZvciBleGFtcGxlLCB0aGVzZSB0d28gY2FsbHMgYXJlIGVxdWl2YWxlbnQ6CgkgKgoJICogICAgIC8vIE5vdCBjaGFpbmVkCgkgKiAgICAgYXBpLnJvdy5hZGQoIHsuLi59ICk7CgkgKiAgICAgYXBpLmRyYXcoKTsKCSAqCgkgKiAgICAgLy8gQ2hhaW5lZAoJICogICAgIGFwaS5yb3cuYWRkKCB7Li4ufSApLmRyYXcoKTsKCSAqCgkgKiBAY2xhc3MgRGF0YVRhYmxlLkFwaQoJICogQHBhcmFtIHthcnJheXxvYmplY3R8c3RyaW5nfGpRdWVyeX0gY29udGV4dCBEYXRhVGFibGUgaWRlbnRpZmllci4gVGhpcyBpcwoJICogICB1c2VkIHRvIGRlZmluZSB3aGljaCBEYXRhVGFibGVzIGVuaGFuY2VkIHRhYmxlcyB0aGlzIEFQSSB3aWxsIG9wZXJhdGUgb24uCgkgKiAgIENhbiBiZSBvbmUgb2Y6CgkgKgoJICogICAqIGBzdHJpbmdgIC0galF1ZXJ5IHNlbGVjdG9yLiBBbnkgRGF0YVRhYmxlcycgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yCgkgKiAgICAgd2l0aCBiZSBmb3VuZCBhbmQgdXNlZC4KCSAqICAgKiBgbm9kZWAgLSBgVEFCTEVgIG5vZGUgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBmb3JtZWQgaW50byBhIERhdGFUYWJsZS4KCSAqICAgKiBgalF1ZXJ5YCAtIEEgalF1ZXJ5IG9iamVjdCBvZiBgVEFCTEVgIG5vZGVzLgoJICogICAqIGBvYmplY3RgIC0gRGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqIEBwYXJhbSB7YXJyYXl9IFtkYXRhXSBEYXRhIHRvIGluaXRpYWxpc2UgdGhlIEFwaSBpbnN0YW5jZSB3aXRoLgoJICoKCSAqIEBleGFtcGxlCgkgKiAgIC8vIERpcmVjdCBpbml0aWFsaXNhdGlvbiBkdXJpbmcgRGF0YVRhYmxlcyBjb25zdHJ1Y3Rpb24KCSAqICAgdmFyIGFwaSA9ICQoJyNleGFtcGxlJykuRGF0YVRhYmxlKCk7CgkgKgoJICogQGV4YW1wbGUKCSAqICAgLy8gSW5pdGlhbGlzYXRpb24gdXNpbmcgYSBEYXRhVGFibGVzIGpRdWVyeSBvYmplY3QKCSAqICAgdmFyIGFwaSA9ICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCkuYXBpKCk7CgkgKgoJICogQGV4YW1wbGUKCSAqICAgLy8gSW5pdGlhbGlzYXRpb24gYXMgYSBjb25zdHJ1Y3RvcgoJICogICB2YXIgYXBpID0gbmV3ICQuZm4uRGF0YVRhYmxlLkFwaSggJ3RhYmxlLmRhdGFUYWJsZScgKTsKCSAqLwoJX0FwaSA9IGZ1bmN0aW9uICggY29udGV4dCwgZGF0YSApCgl7CgkJaWYgKCAhICh0aGlzIGluc3RhbmNlb2YgX0FwaSkgKSB7CgkJCXJldHVybiBuZXcgX0FwaSggY29udGV4dCwgZGF0YSApOwoJCX0KCQoJCXZhciBzZXR0aW5ncyA9IFtdOwoJCXZhciBjdHhTZXR0aW5ncyA9IGZ1bmN0aW9uICggbyApIHsKCQkJdmFyIGEgPSBfdG9TZXR0aW5ncyggbyApOwoJCQlpZiAoIGEgKSB7CgkJCQlzZXR0aW5ncyA9IHNldHRpbmdzLmNvbmNhdCggYSApOwoJCQl9CgkJfTsKCQoJCWlmICggJC5pc0FycmF5KCBjb250ZXh0ICkgKSB7CgkJCWZvciAoIHZhciBpPTAsIGllbj1jb250ZXh0Lmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJY3R4U2V0dGluZ3MoIGNvbnRleHRbaV0gKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJY3R4U2V0dGluZ3MoIGNvbnRleHQgKTsKCQl9CgkKCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCXRoaXMuY29udGV4dCA9IF91bmlxdWUoIHNldHRpbmdzICk7CgkKCQkvLyBJbml0aWFsIGRhdGEKCQlpZiAoIGRhdGEgKSB7CgkJCSQubWVyZ2UoIHRoaXMsIGRhdGEgKTsKCQl9CgkKCQkvLyBzZWxlY3RvcgoJCXRoaXMuc2VsZWN0b3IgPSB7CgkJCXJvd3M6IG51bGwsCgkJCWNvbHM6IG51bGwsCgkJCW9wdHM6IG51bGwKCQl9OwoJCgkJX0FwaS5leHRlbmQoIHRoaXMsIHRoaXMsIF9fYXBpU3RydWN0ICk7Cgl9OwoJCglEYXRhVGFibGUuQXBpID0gX0FwaTsKCQoJLy8gRG9uJ3QgZGVzdHJveSB0aGUgZXhpc3RpbmcgcHJvdG90eXBlLCBqdXN0IGV4dGVuZCBpdC4gUmVxdWlyZWQgZm9yIGpRdWVyeSAyJ3MKCS8vIGlzUGxhaW5PYmplY3QuCgkkLmV4dGVuZCggX0FwaS5wcm90b3R5cGUsIHsKCQlhbnk6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gdGhpcy5jb3VudCgpICE9PSAwOwoJCX0sCgkKCQoJCWNvbmNhdDogIF9fYXJyYXlQcm90by5jb25jYXQsCgkKCQoJCWNvbnRleHQ6IFtdLCAvLyBhcnJheSBvZiB0YWJsZSBzZXR0aW5ncyBvYmplY3RzCgkKCQoJCWNvdW50OiBmdW5jdGlvbiAoKQoJCXsKCQkJcmV0dXJuIHRoaXMuZmxhdHRlbigpLmxlbmd0aDsKCQl9LAoJCgkKCQllYWNoOiBmdW5jdGlvbiAoIGZuICkKCQl7CgkJCWZvciAoIHZhciBpPTAsIGllbj10aGlzLmxlbmd0aCA7IGk8aWVuOyBpKysgKSB7CgkJCQlmbi5jYWxsKCB0aGlzLCB0aGlzW2ldLCBpLCB0aGlzICk7CgkJCX0KCQoJCQlyZXR1cm4gdGhpczsKCQl9LAoJCgkKCQllcTogZnVuY3Rpb24gKCBpZHggKQoJCXsKCQkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQoJCQlyZXR1cm4gY3R4Lmxlbmd0aCA+IGlkeCA/CgkJCQluZXcgX0FwaSggY3R4W2lkeF0sIHRoaXNbaWR4XSApIDoKCQkJCW51bGw7CgkJfSwKCQoJCgkJZmlsdGVyOiBmdW5jdGlvbiAoIGZuICkKCQl7CgkJCXZhciBhID0gW107CgkKCQkJaWYgKCBfX2FycmF5UHJvdG8uZmlsdGVyICkgewoJCQkJYSA9IF9fYXJyYXlQcm90by5maWx0ZXIuY2FsbCggdGhpcywgZm4sIHRoaXMgKTsKCQkJfQoJCQllbHNlIHsKCQkJCS8vIENvbXBhdGliaWxpdHkgZm9yIGJyb3dzZXJzIHdpdGhvdXQgRU1DQS0yNTItNSAoSlMgMS42KQoJCQkJZm9yICggdmFyIGk9MCwgaWVuPXRoaXMubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQkJaWYgKCBmbi5jYWxsKCB0aGlzLCB0aGlzW2ldLCBpLCB0aGlzICkgKSB7CgkJCQkJCWEucHVzaCggdGhpc1tpXSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCgkJCXJldHVybiBuZXcgX0FwaSggdGhpcy5jb250ZXh0LCBhICk7CgkJfSwKCQoJCgkJZmxhdHRlbjogZnVuY3Rpb24gKCkKCQl7CgkJCXZhciBhID0gW107CgkJCXJldHVybiBuZXcgX0FwaSggdGhpcy5jb250ZXh0LCBhLmNvbmNhdC5hcHBseSggYSwgdGhpcy50b0FycmF5KCkgKSApOwoJCX0sCgkKCQoJCWpvaW46ICAgIF9fYXJyYXlQcm90by5qb2luLAoJCgkKCQlpbmRleE9mOiBfX2FycmF5UHJvdG8uaW5kZXhPZiB8fCBmdW5jdGlvbiAob2JqLCBzdGFydCkKCQl7CgkJCWZvciAoIHZhciBpPShzdGFydCB8fCAwKSwgaWVuPXRoaXMubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQlpZiAoIHRoaXNbaV0gPT09IG9iaiApIHsKCQkJCQlyZXR1cm4gaTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gLTE7CgkJfSwKCQoJCWl0ZXJhdG9yOiBmdW5jdGlvbiAoIGZsYXR0ZW4sIHR5cGUsIGZuLCBhbHdheXNOZXcgKSB7CgkJCXZhcgoJCQkJYSA9IFtdLCByZXQsCgkJCQlpLCBpZW4sIGosIGplbiwKCQkJCWNvbnRleHQgPSB0aGlzLmNvbnRleHQsCgkJCQlyb3dzLCBpdGVtcywgaXRlbSwKCQkJCXNlbGVjdG9yID0gdGhpcy5zZWxlY3RvcjsKCQoJCQkvLyBBcmd1bWVudCBzaGlmdGluZwoJCQlpZiAoIHR5cGVvZiBmbGF0dGVuID09PSAnc3RyaW5nJyApIHsKCQkJCWFsd2F5c05ldyA9IGZuOwoJCQkJZm4gPSB0eXBlOwoJCQkJdHlwZSA9IGZsYXR0ZW47CgkJCQlmbGF0dGVuID0gZmFsc2U7CgkJCX0KCQoJCQlmb3IgKCBpPTAsIGllbj1jb250ZXh0Lmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJdmFyIGFwaUluc3QgPSBuZXcgX0FwaSggY29udGV4dFtpXSApOwoJCgkJCQlpZiAoIHR5cGUgPT09ICd0YWJsZScgKSB7CgkJCQkJcmV0ID0gZm4uY2FsbCggYXBpSW5zdCwgY29udGV4dFtpXSwgaSApOwoJCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJYS5wdXNoKCByZXQgKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIGlmICggdHlwZSA9PT0gJ2NvbHVtbnMnIHx8IHR5cGUgPT09ICdyb3dzJyApIHsKCQkJCQkvLyB0aGlzIGhhcyBzYW1lIGxlbmd0aCBhcyBjb250ZXh0IC0gb25lIGVudHJ5IGZvciBlYWNoIHRhYmxlCgkJCQkJcmV0ID0gZm4uY2FsbCggYXBpSW5zdCwgY29udGV4dFtpXSwgdGhpc1tpXSwgaSApOwoJCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJYS5wdXNoKCByZXQgKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIGlmICggdHlwZSA9PT0gJ2NvbHVtbicgfHwgdHlwZSA9PT0gJ2NvbHVtbi1yb3dzJyB8fCB0eXBlID09PSAncm93JyB8fCB0eXBlID09PSAnY2VsbCcgKSB7CgkJCQkJLy8gY29sdW1ucyBhbmQgcm93cyBzaGFyZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCgkJCQkJLy8gJ3RoaXMnIGlzIGFuIGFycmF5IG9mIGNvbHVtbiBpbmRleGVzIGZvciBlYWNoIGNvbnRleHQKCQkJCQlpdGVtcyA9IHRoaXNbaV07CgkKCQkJCQlpZiAoIHR5cGUgPT09ICdjb2x1bW4tcm93cycgKSB7CgkJCQkJCXJvd3MgPSBfc2VsZWN0b3Jfcm93X2luZGV4ZXMoIGNvbnRleHRbaV0sIHNlbGVjdG9yLm9wdHMgKTsKCQkJCQl9CgkKCQkJCQlmb3IgKCBqPTAsIGplbj1pdGVtcy5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCQkJaXRlbSA9IGl0ZW1zW2pdOwoJCgkJCQkJCWlmICggdHlwZSA9PT0gJ2NlbGwnICkgewoJCQkJCQkJcmV0ID0gZm4uY2FsbCggYXBpSW5zdCwgY29udGV4dFtpXSwgaXRlbS5yb3csIGl0ZW0uY29sdW1uLCBpLCBqICk7CgkJCQkJCX0KCQkJCQkJZWxzZSB7CgkJCQkJCQlyZXQgPSBmbi5jYWxsKCBhcGlJbnN0LCBjb250ZXh0W2ldLCBpdGVtLCBpLCBqLCByb3dzICk7CgkJCQkJCX0KCQoJCQkJCQlpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkgewoJCQkJCQkJYS5wdXNoKCByZXQgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCgkJCWlmICggYS5sZW5ndGggfHwgYWx3YXlzTmV3ICkgewoJCQkJdmFyIGFwaSA9IG5ldyBfQXBpKCBjb250ZXh0LCBmbGF0dGVuID8gYS5jb25jYXQuYXBwbHkoIFtdLCBhICkgOiBhICk7CgkJCQl2YXIgYXBpU2VsZWN0b3IgPSBhcGkuc2VsZWN0b3I7CgkJCQlhcGlTZWxlY3Rvci5yb3dzID0gc2VsZWN0b3Iucm93czsKCQkJCWFwaVNlbGVjdG9yLmNvbHMgPSBzZWxlY3Rvci5jb2xzOwoJCQkJYXBpU2VsZWN0b3Iub3B0cyA9IHNlbGVjdG9yLm9wdHM7CgkJCQlyZXR1cm4gYXBpOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0sCgkKCQoJCWxhc3RJbmRleE9mOiBfX2FycmF5UHJvdG8ubGFzdEluZGV4T2YgfHwgZnVuY3Rpb24gKG9iaiwgc3RhcnQpCgkJewoJCQkvLyBCaXQgY2hlZWt5Li4uCgkJCXJldHVybiB0aGlzLmluZGV4T2YuYXBwbHkoIHRoaXMudG9BcnJheS5yZXZlcnNlKCksIGFyZ3VtZW50cyApOwoJCX0sCgkKCQoJCWxlbmd0aDogIDAsCgkKCQoJCW1hcDogZnVuY3Rpb24gKCBmbiApCgkJewoJCQl2YXIgYSA9IFtdOwoJCgkJCWlmICggX19hcnJheVByb3RvLm1hcCApIHsKCQkJCWEgPSBfX2FycmF5UHJvdG8ubWFwLmNhbGwoIHRoaXMsIGZuLCB0aGlzICk7CgkJCX0KCQkJZWxzZSB7CgkJCQkvLyBDb21wYXRpYmlsaXR5IGZvciBicm93c2VycyB3aXRob3V0IEVNQ0EtMjUyLTUgKEpTIDEuNikKCQkJCWZvciAoIHZhciBpPTAsIGllbj10aGlzLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCWEucHVzaCggZm4uY2FsbCggdGhpcywgdGhpc1tpXSwgaSApICk7CgkJCQl9CgkJCX0KCQoJCQlyZXR1cm4gbmV3IF9BcGkoIHRoaXMuY29udGV4dCwgYSApOwoJCX0sCgkKCQoJCXBsdWNrOiBmdW5jdGlvbiAoIHByb3AgKQoJCXsKCQkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbiAoIGVsICkgewoJCQkJcmV0dXJuIGVsWyBwcm9wIF07CgkJCX0gKTsKCQl9LAoJCgkJcG9wOiAgICAgX19hcnJheVByb3RvLnBvcCwKCQoJCgkJcHVzaDogICAgX19hcnJheVByb3RvLnB1c2gsCgkKCQoJCS8vIERvZXMgbm90IHJldHVybiBhbiBBUEkgaW5zdGFuY2UKCQlyZWR1Y2U6IF9fYXJyYXlQcm90by5yZWR1Y2UgfHwgZnVuY3Rpb24gKCBmbiwgaW5pdCApCgkJewoJCQlyZXR1cm4gX2ZuUmVkdWNlKCB0aGlzLCBmbiwgaW5pdCwgMCwgdGhpcy5sZW5ndGgsIDEgKTsKCQl9LAoJCgkKCQlyZWR1Y2VSaWdodDogX19hcnJheVByb3RvLnJlZHVjZVJpZ2h0IHx8IGZ1bmN0aW9uICggZm4sIGluaXQgKQoJCXsKCQkJcmV0dXJuIF9mblJlZHVjZSggdGhpcywgZm4sIGluaXQsIHRoaXMubGVuZ3RoLTEsIC0xLCAtMSApOwoJCX0sCgkKCQoJCXJldmVyc2U6IF9fYXJyYXlQcm90by5yZXZlcnNlLAoJCgkKCQkvLyBPYmplY3Qgd2l0aCByb3dzLCBjb2x1bW5zIGFuZCBvcHRzCgkJc2VsZWN0b3I6IG51bGwsCgkKCQoJCXNoaWZ0OiAgIF9fYXJyYXlQcm90by5zaGlmdCwKCQoJCgkJc2xpY2U6IGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIG5ldyBfQXBpKCB0aGlzLmNvbnRleHQsIHRoaXMgKTsKCQl9LAoJCgkKCQlzb3J0OiAgICBfX2FycmF5UHJvdG8uc29ydCwgLy8gPyBuYW1lIC0gb3JkZXI/CgkKCQoJCXNwbGljZTogIF9fYXJyYXlQcm90by5zcGxpY2UsCgkKCQoJCXRvQXJyYXk6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gX19hcnJheVByb3RvLnNsaWNlLmNhbGwoIHRoaXMgKTsKCQl9LAoJCgkKCQl0byQ6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gJCggdGhpcyApOwoJCX0sCgkKCQoJCXRvSlF1ZXJ5OiBmdW5jdGlvbiAoKQoJCXsKCQkJcmV0dXJuICQoIHRoaXMgKTsKCQl9LAoJCgkKCQl1bmlxdWU6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gbmV3IF9BcGkoIHRoaXMuY29udGV4dCwgX3VuaXF1ZSh0aGlzKSApOwoJCX0sCgkKCQoJCXVuc2hpZnQ6IF9fYXJyYXlQcm90by51bnNoaWZ0Cgl9ICk7CgkKCQoJX0FwaS5leHRlbmQgPSBmdW5jdGlvbiAoIHNjb3BlLCBvYmosIGV4dCApCgl7CgkJLy8gT25seSBleHRlbmQgQVBJIGluc3RhbmNlcyBhbmQgc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIEFQSQoJCWlmICggISBleHQubGVuZ3RoIHx8ICEgb2JqIHx8ICggISAob2JqIGluc3RhbmNlb2YgX0FwaSkgJiYgISBvYmouX19kdF93cmFwcGVyICkgKSB7CgkJCXJldHVybjsKCQl9CgkKCQl2YXIKCQkJaSwgaWVuLAoJCQlqLCBqZW4sCgkJCXN0cnVjdCwgaW5uZXIsCgkJCW1ldGhvZFNjb3BpbmcgPSBmdW5jdGlvbiAoIHNjb3BlLCBmbiwgc3RydWMgKSB7CgkJCQlyZXR1cm4gZnVuY3Rpb24gKCkgewoJCQkJCXZhciByZXQgPSBmbi5hcHBseSggc2NvcGUsIGFyZ3VtZW50cyApOwoJCgkJCQkJLy8gTWV0aG9kIGV4dGVuc2lvbgoJCQkJCV9BcGkuZXh0ZW5kKCByZXQsIHJldCwgc3RydWMubWV0aG9kRXh0ICk7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX07CgkJCX07CgkKCQlmb3IgKCBpPTAsIGllbj1leHQubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCXN0cnVjdCA9IGV4dFtpXTsKCQoJCQkvLyBWYWx1ZQoJCQlvYmpbIHN0cnVjdC5uYW1lIF0gPSB0eXBlb2Ygc3RydWN0LnZhbCA9PT0gJ2Z1bmN0aW9uJyA/CgkJCQltZXRob2RTY29waW5nKCBzY29wZSwgc3RydWN0LnZhbCwgc3RydWN0ICkgOgoJCQkJJC5pc1BsYWluT2JqZWN0KCBzdHJ1Y3QudmFsICkgPwoJCQkJCXt9IDoKCQkJCQlzdHJ1Y3QudmFsOwoJCgkJCW9ialsgc3RydWN0Lm5hbWUgXS5fX2R0X3dyYXBwZXIgPSB0cnVlOwoJCgkJCS8vIFByb3BlcnR5IGV4dGVuc2lvbgoJCQlfQXBpLmV4dGVuZCggc2NvcGUsIG9ialsgc3RydWN0Lm5hbWUgXSwgc3RydWN0LnByb3BFeHQgKTsKCQl9Cgl9OwoJCgkKCS8vIEB0b2RvIC0gSXMgdGhlcmUgbmVlZCBmb3IgYW4gYXVnbWVudCBmdW5jdGlvbj8KCS8vIF9BcGkuYXVnbWVudCA9IGZ1bmN0aW9uICggaW5zdCwgbmFtZSApCgkvLyB7CgkvLyAJLy8gRmluZCBzcmMgb2JqZWN0IGluIHRoZSBzdHJ1Y3R1cmUgZnJvbSB0aGUgbmFtZQoJLy8gCXZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoJy4nKTsKCQoJLy8gCV9BcGkuZXh0ZW5kKCBpbnN0LCBvYmogKTsKCS8vIH07CgkKCQoJLy8gICAgIFsKCS8vICAgICAgIHsKCS8vICAgICAgICAgbmFtZTogICAgICAnZGF0YScgICAgICAgICAgICAgICAgLS0gc3RyaW5nICAgLSBQcm9wZXJ0eSBuYW1lCgkvLyAgICAgICAgIHZhbDogICAgICAgZnVuY3Rpb24gKCkge30sICAgICAgIC0tIGZ1bmN0aW9uIC0gQXBpIG1ldGhvZCAob3IgdW5kZWZpbmVkIGlmIGp1c3QgYW4gb2JqZWN0CgkvLyAgICAgICAgIG1ldGhvZEV4dDogWyAuLi4gXSwgICAgICAgICAgICAgIC0tIGFycmF5ICAgIC0gQXJyYXkgb2YgQXBpIG9iamVjdCBkZWZpbml0aW9ucyB0byBleHRlbmQgdGhlIG1ldGhvZCByZXN1bHQKCS8vICAgICAgICAgcHJvcEV4dDogICBbIC4uLiBdICAgICAgICAgICAgICAgLS0gYXJyYXkgICAgLSBBcnJheSBvZiBBcGkgb2JqZWN0IGRlZmluaXRpb25zIHRvIGV4dGVuZCB0aGUgcHJvcGVydHkKCS8vICAgICAgIH0sCgkvLyAgICAgICB7CgkvLyAgICAgICAgIG5hbWU6ICAgICAncm93JwoJLy8gICAgICAgICB2YWw6ICAgICAgIHt9LAoJLy8gICAgICAgICBtZXRob2RFeHQ6IFsgLi4uIF0sCgkvLyAgICAgICAgIHByb3BFeHQ6ICAgWwoJLy8gICAgICAgICAgIHsKCS8vICAgICAgICAgICAgIG5hbWU6ICAgICAgJ2RhdGEnCgkvLyAgICAgICAgICAgICB2YWw6ICAgICAgIGZ1bmN0aW9uICgpIHt9LAoJLy8gICAgICAgICAgICAgbWV0aG9kRXh0OiBbIC4uLiBdLAoJLy8gICAgICAgICAgICAgcHJvcEV4dDogICBbIC4uLiBdCgkvLyAgICAgICAgICAgfSwKCS8vICAgICAgICAgICAuLi4KCS8vICAgICAgICAgXQoJLy8gICAgICAgfQoJLy8gICAgIF0KCQoJX0FwaS5yZWdpc3RlciA9IF9hcGlfcmVnaXN0ZXIgPSBmdW5jdGlvbiAoIG5hbWUsIHZhbCApCgl7CgkJaWYgKCAkLmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJZm9yICggdmFyIGo9MCwgamVuPW5hbWUubGVuZ3RoIDsgajxqZW4gOyBqKysgKSB7CgkJCQlfQXBpLnJlZ2lzdGVyKCBuYW1lW2pdLCB2YWwgKTsKCQkJfQoJCQlyZXR1cm47CgkJfQoJCgkJdmFyCgkJCWksIGllbiwKCQkJaGVpciA9IG5hbWUuc3BsaXQoJy4nKSwKCQkJc3RydWN0ID0gX19hcGlTdHJ1Y3QsCgkJCWtleSwgbWV0aG9kOwoJCgkJdmFyIGZpbmQgPSBmdW5jdGlvbiAoIHNyYywgbmFtZSApIHsKCQkJZm9yICggdmFyIGk9MCwgaWVuPXNyYy5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCWlmICggc3JjW2ldLm5hbWUgPT09IG5hbWUgKSB7CgkJCQkJcmV0dXJuIHNyY1tpXTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9OwoJCgkJZm9yICggaT0wLCBpZW49aGVpci5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJbWV0aG9kID0gaGVpcltpXS5pbmRleE9mKCcoKScpICE9PSAtMTsKCQkJa2V5ID0gbWV0aG9kID8KCQkJCWhlaXJbaV0ucmVwbGFjZSgnKCknLCAnJykgOgoJCQkJaGVpcltpXTsKCQoJCQl2YXIgc3JjID0gZmluZCggc3RydWN0LCBrZXkgKTsKCQkJaWYgKCAhIHNyYyApIHsKCQkJCXNyYyA9IHsKCQkJCQluYW1lOiAgICAgIGtleSwKCQkJCQl2YWw6ICAgICAgIHt9LAoJCQkJCW1ldGhvZEV4dDogW10sCgkJCQkJcHJvcEV4dDogICBbXQoJCQkJfTsKCQkJCXN0cnVjdC5wdXNoKCBzcmMgKTsKCQkJfQoJCgkJCWlmICggaSA9PT0gaWVuLTEgKSB7CgkJCQlzcmMudmFsID0gdmFsOwoJCQl9CgkJCWVsc2UgewoJCQkJc3RydWN0ID0gbWV0aG9kID8KCQkJCQlzcmMubWV0aG9kRXh0IDoKCQkJCQlzcmMucHJvcEV4dDsKCQkJfQoJCX0KCX07CgkKCQoJX0FwaS5yZWdpc3RlclBsdXJhbCA9IF9hcGlfcmVnaXN0ZXJQbHVyYWwgPSBmdW5jdGlvbiAoIHBsdXJhbE5hbWUsIHNpbmd1bGFyTmFtZSwgdmFsICkgewoJCV9BcGkucmVnaXN0ZXIoIHBsdXJhbE5hbWUsIHZhbCApOwoJCgkJX0FwaS5yZWdpc3Rlciggc2luZ3VsYXJOYW1lLCBmdW5jdGlvbiAoKSB7CgkJCXZhciByZXQgPSB2YWwuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCgkJCWlmICggcmV0ID09PSB0aGlzICkgewoJCQkJLy8gUmV0dXJuZWQgaXRlbSBpcyB0aGUgQVBJIGluc3RhbmNlIHRoYXQgd2FzIHBhc3NlZCBpbiwgcmV0dXJuIGl0CgkJCQlyZXR1cm4gdGhpczsKCQkJfQoJCQllbHNlIGlmICggcmV0IGluc3RhbmNlb2YgX0FwaSApIHsKCQkJCS8vIE5ldyBBUEkgaW5zdGFuY2UgcmV0dXJuZWQsIHdhbnQgdGhlIHZhbHVlIGZyb20gdGhlIGZpcnN0IGl0ZW0KCQkJCS8vIGluIHRoZSByZXR1cm5lZCBhcnJheSBmb3IgdGhlIHNpbmd1bGFyIHJlc3VsdC4KCQkJCXJldHVybiByZXQubGVuZ3RoID8KCQkJCQkkLmlzQXJyYXkoIHJldFswXSApID8KCQkJCQkJbmV3IF9BcGkoIHJldC5jb250ZXh0LCByZXRbMF0gKSA6IC8vIEFycmF5IHJlc3VsdHMgYXJlICdlbmhhbmNlZCcKCQkJCQkJcmV0WzBdIDoKCQkJCQl1bmRlZmluZWQ7CgkJCX0KCQoJCQkvLyBOb24tQVBJIHJldHVybiAtIGp1c3QgZmlyZSBpdCBiYWNrCgkJCXJldHVybiByZXQ7CgkJfSApOwoJfTsKCQoJCgkvKioKCSAqIFNlbGVjdG9yIGZvciBIVE1MIHRhYmxlcy4gQXBwbHkgdGhlIGdpdmVuIHNlbGVjdG9yIHRvIHRoZSBnaXZlIGFycmF5IG9mCgkgKiBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdHMuCgkgKgoJICogQHBhcmFtIHtzdHJpbmd8aW50ZWdlcn0gW3NlbGVjdG9yXSBqUXVlcnkgc2VsZWN0b3Igc3RyaW5nIG9yIGludGVnZXIKCSAqIEBwYXJhbSAge2FycmF5fSBBcnJheSBvZiBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdHMgdG8gYmUgZmlsdGVyZWQKCSAqIEByZXR1cm4ge2FycmF5fQoJICogQGlnbm9yZQoJICovCgl2YXIgX190YWJsZV9zZWxlY3RvciA9IGZ1bmN0aW9uICggc2VsZWN0b3IsIGEgKQoJewoJCS8vIEludGVnZXIgaXMgdXNlZCB0byBwaWNrIG91dCBhIHRhYmxlIGJ5IGluZGV4CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICdudW1iZXInICkgewoJCQlyZXR1cm4gWyBhWyBzZWxlY3RvciBdIF07CgkJfQoJCgkJLy8gUGVyZm9ybSBhIGpRdWVyeSBzZWxlY3RvciBvbiB0aGUgdGFibGUgbm9kZXMKCQl2YXIgbm9kZXMgPSAkLm1hcCggYSwgZnVuY3Rpb24gKGVsLCBpKSB7CgkJCXJldHVybiBlbC5uVGFibGU7CgkJfSApOwoJCgkJcmV0dXJuICQobm9kZXMpCgkJCS5maWx0ZXIoIHNlbGVjdG9yICkKCQkJLm1hcCggZnVuY3Rpb24gKGkpIHsKCQkJCS8vIE5lZWQgdG8gdHJhbnNsYXRlIGJhY2sgZnJvbSB0aGUgdGFibGUgbm9kZSB0byB0aGUgc2V0dGluZ3MKCQkJCXZhciBpZHggPSAkLmluQXJyYXkoIHRoaXMsIG5vZGVzICk7CgkJCQlyZXR1cm4gYVsgaWR4IF07CgkJCX0gKQoJCQkudG9BcnJheSgpOwoJfTsKCQoJCgkKCS8qKgoJICogQ29udGV4dCBzZWxlY3RvciBmb3IgdGhlIEFQSSdzIGNvbnRleHQgKGkuZS4gdGhlIHRhYmxlcyB0aGUgQVBJIGluc3RhbmNlCgkgKiByZWZlcnMgdG8uCgkgKgoJICogQG5hbWUgICAgRGF0YVRhYmxlLkFwaSN0YWJsZXMKCSAqIEBwYXJhbSB7c3RyaW5nfGludGVnZXJ9IFtzZWxlY3Rvcl0gU2VsZWN0b3IgdG8gcGljayB3aGljaCB0YWJsZXMgdGhlIGl0ZXJhdG9yCgkgKiAgIHNob3VsZCBvcGVyYXRlIG9uLiBJZiBub3QgZ2l2ZW4sIGFsbCB0YWJsZXMgaW4gdGhlIGN1cnJlbnQgY29udGV4dCBhcmUKCSAqICAgdXNlZC4gVGhpcyBjYW4gYmUgZ2l2ZW4gYXMgYSBqUXVlcnkgc2VsZWN0b3IgKGZvciBleGFtcGxlIGAnOmd0KDApJ2ApIHRvCgkgKiAgIHNlbGVjdCBtdWx0aXBsZSB0YWJsZXMgb3IgYXMgYW4gaW50ZWdlciB0byBzZWxlY3QgYSBzaW5nbGUgdGFibGUuCgkgKiBAcmV0dXJucyB7RGF0YVRhYmxlLkFwaX0gUmV0dXJucyBhIG5ldyBBUEkgaW5zdGFuY2UgaWYgYSBzZWxlY3RvciBpcyBnaXZlbi4KCSAqLwoJX2FwaV9yZWdpc3RlciggJ3RhYmxlcygpJywgZnVuY3Rpb24gKCBzZWxlY3RvciApIHsKCQkvLyBBIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkIGlmIHRoZXJlIHdhcyBhIHNlbGVjdG9yIHNwZWNpZmllZAoJCXJldHVybiBzZWxlY3RvciA/CgkJCW5ldyBfQXBpKCBfX3RhYmxlX3NlbGVjdG9yKCBzZWxlY3RvciwgdGhpcy5jb250ZXh0ICkgKSA6CgkJCXRoaXM7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3RhYmxlKCknLCBmdW5jdGlvbiAoIHNlbGVjdG9yICkgewoJCXZhciB0YWJsZXMgPSB0aGlzLnRhYmxlcyggc2VsZWN0b3IgKTsKCQl2YXIgY3R4ID0gdGFibGVzLmNvbnRleHQ7CgkKCQkvLyBUcnVuY2F0ZSB0byB0aGUgZmlyc3QgbWF0Y2hlZCB0YWJsZQoJCXJldHVybiBjdHgubGVuZ3RoID8KCQkJbmV3IF9BcGkoIGN0eFswXSApIDoKCQkJdGFibGVzOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICd0YWJsZXMoKS5ub2RlcygpJywgJ3RhYmxlKCkubm9kZSgpJyAsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBjdHggKSB7CgkJCXJldHVybiBjdHgublRhYmxlOwoJCX0sIDEgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAndGFibGVzKCkuYm9keSgpJywgJ3RhYmxlKCkuYm9keSgpJyAsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBjdHggKSB7CgkJCXJldHVybiBjdHgublRCb2R5OwoJCX0sIDEgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAndGFibGVzKCkuaGVhZGVyKCknLCAndGFibGUoKS5oZWFkZXIoKScgLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggY3R4ICkgewoJCQlyZXR1cm4gY3R4Lm5USGVhZDsKCQl9LCAxICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ3RhYmxlcygpLmZvb3RlcigpJywgJ3RhYmxlKCkuZm9vdGVyKCknICwgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIGN0eCApIHsKCQkJcmV0dXJuIGN0eC5uVEZvb3Q7CgkJfSwgMSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICd0YWJsZXMoKS5jb250YWluZXJzKCknLCAndGFibGUoKS5jb250YWluZXIoKScgLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggY3R4ICkgewoJCQlyZXR1cm4gY3R4Lm5UYWJsZVdyYXBwZXI7CgkJfSwgMSApOwoJfSApOwoJCgkKCQoJLyoqCgkgKiBSZWRyYXcgdGhlIHRhYmxlcyBpbiB0aGUgY3VycmVudCBjb250ZXh0LgoJICovCglfYXBpX3JlZ2lzdGVyKCAnZHJhdygpJywgZnVuY3Rpb24gKCBwYWdpbmcgKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MgKSB7CgkJCWlmICggcGFnaW5nID09PSAncGFnZScgKSB7CgkJCQlfZm5EcmF3KCBzZXR0aW5ncyApOwoJCQl9CgkJCWVsc2UgewoJCQkJaWYgKCB0eXBlb2YgcGFnaW5nID09PSAnc3RyaW5nJyApIHsKCQkJCQlwYWdpbmcgPSBwYWdpbmcgPT09ICdmdWxsLWhvbGQnID8KCQkJCQkJZmFsc2UgOgoJCQkJCQl0cnVlOwoJCQkJfQoJCgkJCQlfZm5SZURyYXcoIHNldHRpbmdzLCBwYWdpbmc9PT1mYWxzZSApOwoJCQl9CgkJfSApOwoJfSApOwoJCgkKCQoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnQgcGFnZSBpbmRleC4KCSAqCgkgKiBAcmV0dXJuIHtpbnRlZ2VyfSBDdXJyZW50IHBhZ2UgaW5kZXggKHplcm8gYmFzZWQpCgkgKi8vKioKCSAqIFNldCB0aGUgY3VycmVudCBwYWdlLgoJICoKCSAqIE5vdGUgdGhhdCBpZiB5b3UgYXR0ZW1wdCB0byBzaG93IGEgcGFnZSB3aGljaCBkb2VzIG5vdCBleGlzdCwgRGF0YVRhYmxlcyB3aWxsCgkgKiBub3QgdGhyb3cgYW4gZXJyb3IsIGJ1dCByYXRoZXIgcmVzZXQgdGhlIHBhZ2luZy4KCSAqCgkgKiBAcGFyYW0ge2ludGVnZXJ8c3RyaW5nfSBhY3Rpb24gVGhlIHBhZ2luZyBhY3Rpb24gdG8gdGFrZS4gVGhpcyBjYW4gYmUgb25lIG9mOgoJICogICogYGludGVnZXJgIC0gVGhlIHBhZ2UgaW5kZXggdG8ganVtcCB0bwoJICogICogYHN0cmluZ2AgLSBBbiBhY3Rpb24gdG8gdGFrZToKCSAqICAgICogYGZpcnN0YCAtIEp1bXAgdG8gZmlyc3QgcGFnZS4KCSAqICAgICogYG5leHRgIC0gSnVtcCB0byB0aGUgbmV4dCBwYWdlCgkgKiAgICAqIGBwcmV2aW91c2AgLSBKdW1wIHRvIHByZXZpb3VzIHBhZ2UKCSAqICAgICogYGxhc3RgIC0gSnVtcCB0byB0aGUgbGFzdCBwYWdlLgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdwYWdlKCknLCBmdW5jdGlvbiAoIGFjdGlvbiApIHsKCQlpZiAoIGFjdGlvbiA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4gdGhpcy5wYWdlLmluZm8oKS5wYWdlOyAvLyBub3QgYW4gZXhwZW5zaXZlIGNhbGwKCQl9CgkKCQkvLyBlbHNlLCBoYXZlIGFuIGFjdGlvbiB0byB0YWtlIG9uIGFsbCB0YWJsZXMKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJX2ZuUGFnZUNoYW5nZSggc2V0dGluZ3MsIGFjdGlvbiApOwoJCX0gKTsKCX0gKTsKCQoJCgkvKioKCSAqIFBhZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpcnN0IHRhYmxlIGluIHRoZSBjdXJyZW50IGNvbnRleHQuCgkgKgoJICogSWYgeW91IHJlcXVpcmUgcGFnaW5nIGluZm9ybWF0aW9uIGZvciBhbm90aGVyIHRhYmxlLCB1c2UgdGhlIGB0YWJsZSgpYCBtZXRob2QKCSAqIHdpdGggYSBzdWl0YWJsZSBzZWxlY3Rvci4KCSAqCgkgKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBzZXQ6CgkgKiAgKiBgcGFnZWAgLSBDdXJyZW50IHBhZ2UgaW5kZXggKHplcm8gYmFzZWQgLSBpLmUuIHRoZSBmaXJzdCBwYWdlIGlzIGAwYCkKCSAqICAqIGBwYWdlc2AgLSBUb3RhbCBudW1iZXIgb2YgcGFnZXMKCSAqICAqIGBzdGFydGAgLSBEaXNwbGF5IGluZGV4IGZvciB0aGUgZmlyc3QgcmVjb3JkIHNob3duIG9uIHRoZSBjdXJyZW50IHBhZ2UKCSAqICAqIGBlbmRgIC0gRGlzcGxheSBpbmRleCBmb3IgdGhlIGxhc3QgcmVjb3JkIHNob3duIG9uIHRoZSBjdXJyZW50IHBhZ2UKCSAqICAqIGBsZW5ndGhgIC0gRGlzcGxheSBsZW5ndGggKG51bWJlciBvZiByZWNvcmRzKS4gTm90ZSB0aGF0IGdlbmVyYWxseSBgc3RhcnQKCSAqICAgICsgbGVuZ3RoID0gZW5kYCwgYnV0IHRoaXMgaXMgbm90IGFsd2F5cyB0cnVlLCBmb3IgZXhhbXBsZSBpZiB0aGVyZSBhcmUKCSAqICAgIG9ubHkgMiByZWNvcmRzIHRvIHNob3cgb24gdGhlIGZpbmFsIHBhZ2UsIHdpdGggYSBsZW5ndGggb2YgMTAuCgkgKiAgKiBgcmVjb3Jkc1RvdGFsYCAtIEZ1bGwgZGF0YSBzZXQgbGVuZ3RoCgkgKiAgKiBgcmVjb3Jkc0Rpc3BsYXlgIC0gRGF0YSBzZXQgbGVuZ3RoIG9uY2UgdGhlIGN1cnJlbnQgZmlsdGVyaW5nIGNyaXRlcmlvbgoJICogICAgYXJlIGFwcGxpZWQuCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdwYWdlLmluZm8oKScsIGZ1bmN0aW9uICggYWN0aW9uICkgewoJCWlmICggdGhpcy5jb250ZXh0Lmxlbmd0aCA9PT0gMCApIHsKCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQl9CgkKCQl2YXIKCQkJc2V0dGluZ3MgICA9IHRoaXMuY29udGV4dFswXSwKCQkJc3RhcnQgICAgICA9IHNldHRpbmdzLl9pRGlzcGxheVN0YXJ0LAoJCQlsZW4gICAgICAgID0gc2V0dGluZ3Mub0ZlYXR1cmVzLmJQYWdpbmF0ZSA/IHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCA6IC0xLAoJCQl2aXNSZWNvcmRzID0gc2V0dGluZ3MuZm5SZWNvcmRzRGlzcGxheSgpLAoJCQlhbGwgICAgICAgID0gbGVuID09PSAtMTsKCQoJCXJldHVybiB7CgkJCSJwYWdlIjogICAgICAgICAgIGFsbCA/IDAgOiBNYXRoLmZsb29yKCBzdGFydCAvIGxlbiApLAoJCQkicGFnZXMiOiAgICAgICAgICBhbGwgPyAxIDogTWF0aC5jZWlsKCB2aXNSZWNvcmRzIC8gbGVuICksCgkJCSJzdGFydCI6ICAgICAgICAgIHN0YXJ0LAoJCQkiZW5kIjogICAgICAgICAgICBzZXR0aW5ncy5mbkRpc3BsYXlFbmQoKSwKCQkJImxlbmd0aCI6ICAgICAgICAgbGVuLAoJCQkicmVjb3Jkc1RvdGFsIjogICBzZXR0aW5ncy5mblJlY29yZHNUb3RhbCgpLAoJCQkicmVjb3Jkc0Rpc3BsYXkiOiB2aXNSZWNvcmRzLAoJCQkic2VydmVyU2lkZSI6ICAgICBfZm5EYXRhU291cmNlKCBzZXR0aW5ncyApID09PSAnc3NwJwoJCX07Cgl9ICk7CgkKCQoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnQgcGFnZSBsZW5ndGguCgkgKgoJICogQHJldHVybiB7aW50ZWdlcn0gQ3VycmVudCBwYWdlIGxlbmd0aC4gTm90ZSBgLTFgIGluZGljYXRlcyB0aGF0IGFsbCByZWNvcmRzCgkgKiAgIGFyZSB0byBiZSBzaG93bi4KCSAqLy8qKgoJICogU2V0IHRoZSBjdXJyZW50IHBhZ2UgbGVuZ3RoLgoJICoKCSAqIEBwYXJhbSB7aW50ZWdlcn0gUGFnZSBsZW5ndGggdG8gc2V0LiBVc2UgYC0xYCB0byBzaG93IGFsbCByZWNvcmRzLgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdwYWdlLmxlbigpJywgZnVuY3Rpb24gKCBsZW4gKSB7CgkJLy8gTm90ZSB0aGF0IHdlIGNhbid0IGNhbGwgdGhpcyBmdW5jdGlvbiAnbGVuZ3RoKCknIGJlY2F1c2UgYGxlbmd0aGAKCQkvLyBpcyBhIEphdmFzY3JpcHQgcHJvcGVydHkgb2YgZnVuY3Rpb25zIHdoaWNoIGRlZmluZXMgaG93IG1hbnkgYXJndW1lbnRzCgkJLy8gdGhlIGZ1bmN0aW9uIGV4cGVjdHMuCgkJaWYgKCBsZW4gPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIHRoaXMuY29udGV4dC5sZW5ndGggIT09IDAgPwoJCQkJdGhpcy5jb250ZXh0WzBdLl9pRGlzcGxheUxlbmd0aCA6CgkJCQl1bmRlZmluZWQ7CgkJfQoJCgkJLy8gZWxzZSwgc2V0IHRoZSBwYWdlIGxlbmd0aAoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlfZm5MZW5ndGhDaGFuZ2UoIHNldHRpbmdzLCBsZW4gKTsKCQl9ICk7Cgl9ICk7CgkKCQoJCgl2YXIgX19yZWxvYWQgPSBmdW5jdGlvbiAoIHNldHRpbmdzLCBob2xkUG9zaXRpb24sIGNhbGxiYWNrICkgewoJCS8vIFVzZSB0aGUgZHJhdyBldmVudCB0byB0cmlnZ2VyIGEgY2FsbGJhY2sKCQlpZiAoIGNhbGxiYWNrICkgewoJCQl2YXIgYXBpID0gbmV3IF9BcGkoIHNldHRpbmdzICk7CgkKCQkJYXBpLm9uZSggJ2RyYXcnLCBmdW5jdGlvbiAoKSB7CgkJCQljYWxsYmFjayggYXBpLmFqYXguanNvbigpICk7CgkJCX0gKTsKCQl9CgkKCQlpZiAoIF9mbkRhdGFTb3VyY2UoIHNldHRpbmdzICkgPT0gJ3NzcCcgKSB7CgkJCV9mblJlRHJhdyggc2V0dGluZ3MsIGhvbGRQb3NpdGlvbiApOwoJCX0KCQllbHNlIHsKCQkJX2ZuUHJvY2Vzc2luZ0Rpc3BsYXkoIHNldHRpbmdzLCB0cnVlICk7CgkKCQkJLy8gQ2FuY2VsIGFuIGV4aXN0aW5nIHJlcXVlc3QKCQkJdmFyIHhociA9IHNldHRpbmdzLmpxWEhSOwoJCQlpZiAoIHhociAmJiB4aHIucmVhZHlTdGF0ZSAhPT0gNCApIHsKCQkJCXhoci5hYm9ydCgpOwoJCQl9CgkKCQkJLy8gVHJpZ2dlciB4aHIKCQkJX2ZuQnVpbGRBamF4KCBzZXR0aW5ncywgW10sIGZ1bmN0aW9uKCBqc29uICkgewoJCQkJX2ZuQ2xlYXJUYWJsZSggc2V0dGluZ3MgKTsKCQoJCQkJdmFyIGRhdGEgPSBfZm5BamF4RGF0YVNyYyggc2V0dGluZ3MsIGpzb24gKTsKCQkJCWZvciAoIHZhciBpPTAsIGllbj1kYXRhLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCV9mbkFkZERhdGEoIHNldHRpbmdzLCBkYXRhW2ldICk7CgkJCQl9CgkKCQkJCV9mblJlRHJhdyggc2V0dGluZ3MsIGhvbGRQb3NpdGlvbiApOwoJCQkJX2ZuUHJvY2Vzc2luZ0Rpc3BsYXkoIHNldHRpbmdzLCBmYWxzZSApOwoJCQl9ICk7CgkJfQoJfTsKCQoJCgkvKioKCSAqIEdldCB0aGUgSlNPTiByZXNwb25zZSBmcm9tIHRoZSBsYXN0IEFqYXggcmVxdWVzdCB0aGF0IERhdGFUYWJsZXMgbWFkZSB0byB0aGUKCSAqIHNlcnZlci4gTm90ZSB0aGF0IHRoaXMgcmV0dXJucyB0aGUgSlNPTiBmcm9tIHRoZSBmaXJzdCB0YWJsZSBpbiB0aGUgY3VycmVudAoJICogY29udGV4dC4KCSAqCgkgKiBAcmV0dXJuIHtvYmplY3R9IEpTT04gcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLgoJICovCglfYXBpX3JlZ2lzdGVyKCAnYWpheC5qc29uKCknLCBmdW5jdGlvbiAoKSB7CgkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQoJCWlmICggY3R4Lmxlbmd0aCA+IDAgKSB7CgkJCXJldHVybiBjdHhbMF0uanNvbjsKCQl9CgkKCQkvLyBlbHNlIHJldHVybiB1bmRlZmluZWQ7Cgl9ICk7CgkKCQoJLyoqCgkgKiBHZXQgdGhlIGRhdGEgc3VibWl0dGVkIGluIHRoZSBsYXN0IEFqYXggcmVxdWVzdAoJICovCglfYXBpX3JlZ2lzdGVyKCAnYWpheC5wYXJhbXMoKScsIGZ1bmN0aW9uICgpIHsKCQl2YXIgY3R4ID0gdGhpcy5jb250ZXh0OwoJCgkJaWYgKCBjdHgubGVuZ3RoID4gMCApIHsKCQkJcmV0dXJuIGN0eFswXS5vQWpheERhdGE7CgkJfQoJCgkJLy8gZWxzZSByZXR1cm4gdW5kZWZpbmVkOwoJfSApOwoJCgkKCS8qKgoJICogUmVsb2FkIHRhYmxlcyBmcm9tIHRoZSBBamF4IGRhdGEgc291cmNlLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsCgkgKiBhdXRvbWF0aWNhbGx5IHJlLWRyYXcgdGhlIHRhYmxlIHdoZW4gdGhlIHJlbW90ZSBkYXRhIGhhcyBiZWVuIGxvYWRlZC4KCSAqCgkgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXNldD10cnVlXSBSZXNldCAoZGVmYXVsdCkgb3IgaG9sZCB0aGUgY3VycmVudCBwYWdpbmcKCSAqICAgcG9zaXRpb24uIEEgZnVsbCByZS1zb3J0IGFuZCByZS1maWx0ZXIgaXMgcGVyZm9ybWVkIHdoZW4gdGhpcyBtZXRob2QgaXMKCSAqICAgY2FsbGVkLCB3aGljaCBpcyB3aHkgdGhlIHBhZ2luYXRpb24gcmVzZXQgaXMgdGhlIGRlZmF1bHQgYWN0aW9uLgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdhamF4LnJlbG9hZCgpJywgZnVuY3Rpb24gKCBjYWxsYmFjaywgcmVzZXRQYWdpbmcgKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uIChzZXR0aW5ncykgewoJCQlfX3JlbG9hZCggc2V0dGluZ3MsIHJlc2V0UGFnaW5nPT09Zg=="
},
{
"key": "jquery.dataTables.js?4?2?2",
"type": "binary",
"value": "base64:YWxzZSwgY2FsbGJhY2sgKTsKCQl9ICk7Cgl9ICk7CgkKCQoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnQgQWpheCBVUkwuIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgdGhlIFVSTCBmcm9tIHRoZSBmaXJzdAoJICogdGFibGUgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4KCSAqCgkgKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgQWpheCBzb3VyY2UgVVJMCgkgKi8vKioKCSAqIFNldCB0aGUgQWpheCBVUkwuIE5vdGUgdGhhdCB0aGlzIHdpbGwgc2V0IHRoZSBVUkwgZm9yIGFsbCB0YWJsZXMgaW4gdGhlCgkgKiBjdXJyZW50IGNvbnRleHQuCgkgKgoJICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgdG8gc2V0LgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdhamF4LnVybCgpJywgZnVuY3Rpb24gKCB1cmwgKSB7CgkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQoJCWlmICggdXJsID09PSB1bmRlZmluZWQgKSB7CgkJCS8vIGdldAoJCQlpZiAoIGN0eC5sZW5ndGggPT09IDAgKSB7CgkJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCQl9CgkJCWN0eCA9IGN0eFswXTsKCQoJCQlyZXR1cm4gY3R4LmFqYXggPwoJCQkJJC5pc1BsYWluT2JqZWN0KCBjdHguYWpheCApID8KCQkJCQljdHguYWpheC51cmwgOgoJCQkJCWN0eC5hamF4IDoKCQkJCWN0eC5zQWpheFNvdXJjZTsKCQl9CgkKCQkvLyBzZXQKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHNldHRpbmdzLmFqYXggKSApIHsKCQkJCXNldHRpbmdzLmFqYXgudXJsID0gdXJsOwoJCQl9CgkJCWVsc2UgewoJCQkJc2V0dGluZ3MuYWpheCA9IHVybDsKCQkJfQoJCQkvLyBObyBuZWVkIHRvIGNvbnNpZGVyIHNBamF4U291cmNlIGhlcmUgc2luY2UgRGF0YVRhYmxlcyBnaXZlcyBwcmlvcml0eQoJCQkvLyB0byBgYWpheGAgb3ZlciBgc0FqYXhTb3VyY2VgLiBTbyBzZXR0aW5nIGBhamF4YCBoZXJlLCByZW5kZXJzIGFueQoJCQkvLyB2YWx1ZSBvZiBgc0FqYXhTb3VyY2VgIHJlZHVuZGFudC4KCQl9ICk7Cgl9ICk7CgkKCQoJLyoqCgkgKiBMb2FkIGRhdGEgZnJvbSB0aGUgbmV3bHkgc2V0IEFqYXggVVJMLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgb25seQoJICogYXZhaWxhYmxlIHdoZW4gYGFqYXgudXJsKClgIGlzIHVzZWQgdG8gc2V0IGEgVVJMLiBBZGRpdGlvbmFsbHksIHRoaXMgbWV0aG9kCgkgKiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcgYGFqYXgucmVsb2FkKClgIGJ1dCBpcyBwcm92aWRlZCBmb3IKCSAqIGNvbnZlbmllbmNlIHdoZW4gc2V0dGluZyBhIG5ldyBVUkwuIExpa2UgYGFqYXgucmVsb2FkKClgIGl0IHdpbGwKCSAqIGF1dG9tYXRpY2FsbHkgcmVkcmF3IHRoZSB0YWJsZSBvbmNlIHRoZSByZW1vdGUgZGF0YSBoYXMgYmVlbiBsb2FkZWQuCgkgKgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdhamF4LnVybCgpLmxvYWQoKScsIGZ1bmN0aW9uICggY2FsbGJhY2ssIHJlc2V0UGFnaW5nICkgewoJCS8vIFNhbWUgYXMgYSByZWxvYWQsIGJ1dCBtYWtlcyBzZW5zZSB0byBwcmVzZW50IGl0IGZvciBlYXN5IGFjY2VzcyBhZnRlciBhCgkJLy8gdXJsIGNoYW5nZQoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIGN0eCApIHsKCQkJX19yZWxvYWQoIGN0eCwgcmVzZXRQYWdpbmc9PT1mYWxzZSwgY2FsbGJhY2sgKTsKCQl9ICk7Cgl9ICk7CgkKCQoJCgkKCXZhciBfc2VsZWN0b3JfcnVuID0gZnVuY3Rpb24gKCB0eXBlLCBzZWxlY3Rvciwgc2VsZWN0Rm4sIHNldHRpbmdzLCBvcHRzICkKCXsKCQl2YXIKCQkJb3V0ID0gW10sIHJlcywKCQkJYSwgaSwgaWVuLCBqLCBqZW4sCgkJCXNlbGVjdG9yVHlwZSA9IHR5cGVvZiBzZWxlY3RvcjsKCQoJCS8vIENhbid0IGp1c3QgY2hlY2sgZm9yIGlzQXJyYXkgaGVyZSwgYXMgYW4gQVBJIG9yIGpRdWVyeSBpbnN0YW5jZSBtaWdodCBiZQoJCS8vIGdpdmVuIHdpdGggdGhlaXIgYXJyYXkgbGlrZSBsb29rCgkJaWYgKCAhIHNlbGVjdG9yIHx8IHNlbGVjdG9yVHlwZSA9PT0gJ3N0cmluZycgfHwgc2VsZWN0b3JUeXBlID09PSAnZnVuY3Rpb24nIHx8IHNlbGVjdG9yLmxlbmd0aCA9PT0gdW5kZWZpbmVkICkgewoJCQlzZWxlY3RvciA9IFsgc2VsZWN0b3IgXTsKCQl9CgkKCQlmb3IgKCBpPTAsIGllbj1zZWxlY3Rvci5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJLy8gT25seSBzcGxpdCBvbiBzaW1wbGUgc3RyaW5ncyAtIGNvbXBsZXggZXhwcmVzc2lvbnMgd2lsbCBiZSBqUXVlcnkgc2VsZWN0b3JzCgkJCWEgPSBzZWxlY3RvcltpXSAmJiBzZWxlY3RvcltpXS5zcGxpdCAmJiAhIHNlbGVjdG9yW2ldLm1hdGNoKC9bXFtcKDpdLykgPwoJCQkJc2VsZWN0b3JbaV0uc3BsaXQoJywnKSA6CgkJCQlbIHNlbGVjdG9yW2ldIF07CgkKCQkJZm9yICggaj0wLCBqZW49YS5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCXJlcyA9IHNlbGVjdEZuKCB0eXBlb2YgYVtqXSA9PT0gJ3N0cmluZycgPyAkLnRyaW0oYVtqXSkgOiBhW2pdICk7CgkKCQkJCWlmICggcmVzICYmIHJlcy5sZW5ndGggKSB7CgkJCQkJb3V0ID0gb3V0LmNvbmNhdCggcmVzICk7CgkJCQl9CgkJCX0KCQl9CgkKCQkvLyBzZWxlY3RvciBleHRlbnNpb25zCgkJdmFyIGV4dCA9IF9leHQuc2VsZWN0b3JbIHR5cGUgXTsKCQlpZiAoIGV4dC5sZW5ndGggKSB7CgkJCWZvciAoIGk9MCwgaWVuPWV4dC5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCW91dCA9IGV4dFtpXSggc2V0dGluZ3MsIG9wdHMsIG91dCApOwoJCQl9CgkJfQoJCgkJcmV0dXJuIF91bmlxdWUoIG91dCApOwoJfTsKCQoJCgl2YXIgX3NlbGVjdG9yX29wdHMgPSBmdW5jdGlvbiAoIG9wdHMgKQoJewoJCWlmICggISBvcHRzICkgewoJCQlvcHRzID0ge307CgkJfQoJCgkJLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIDEuOS0gd2hpY2ggdXNlZCB0aGUgdGVybWlub2xvZ3kgZmlsdGVyIHJhdGhlcgoJCS8vIHRoYW4gc2VhcmNoCgkJaWYgKCBvcHRzLmZpbHRlciAmJiBvcHRzLnNlYXJjaCA9PT0gdW5kZWZpbmVkICkgewoJCQlvcHRzLnNlYXJjaCA9IG9wdHMuZmlsdGVyOwoJCX0KCQoJCXJldHVybiAkLmV4dGVuZCggewoJCQlzZWFyY2g6ICdub25lJywKCQkJb3JkZXI6ICdjdXJyZW50JywKCQkJcGFnZTogJ2FsbCcKCQl9LCBvcHRzICk7Cgl9OwoJCgkKCXZhciBfc2VsZWN0b3JfZmlyc3QgPSBmdW5jdGlvbiAoIGluc3QgKQoJewoJCS8vIFJlZHVjZSB0aGUgQVBJIGluc3RhbmNlIHRvIHRoZSBmaXJzdCBpdGVtIGZvdW5kCgkJZm9yICggdmFyIGk9MCwgaWVuPWluc3QubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCWlmICggaW5zdFtpXS5sZW5ndGggPiAwICkgewoJCQkJLy8gQXNzaWduIHRoZSBmaXJzdCBlbGVtZW50IHRvIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBpbnN0YW5jZQoJCQkJLy8gYW5kIHRydW5jYXRlIHRoZSBpbnN0YW5jZSBhbmQgY29udGV4dAoJCQkJaW5zdFswXSA9IGluc3RbaV07CgkJCQlpbnN0WzBdLmxlbmd0aCA9IDE7CgkJCQlpbnN0Lmxlbmd0aCA9IDE7CgkJCQlpbnN0LmNvbnRleHQgPSBbIGluc3QuY29udGV4dFtpXSBdOwoJCgkJCQlyZXR1cm4gaW5zdDsKCQkJfQoJCX0KCQoJCS8vIE5vdCBmb3VuZCAtIHJldHVybiBhbiBlbXB0eSBpbnN0YW5jZQoJCWluc3QubGVuZ3RoID0gMDsKCQlyZXR1cm4gaW5zdDsKCX07CgkKCQoJdmFyIF9zZWxlY3Rvcl9yb3dfaW5kZXhlcyA9IGZ1bmN0aW9uICggc2V0dGluZ3MsIG9wdHMgKQoJewoJCXZhcgoJCQlpLCBpZW4sIHRtcCwgYT1bXSwKCQkJZGlzcGxheUZpbHRlcmVkID0gc2V0dGluZ3MuYWlEaXNwbGF5LAoJCQlkaXNwbGF5TWFzdGVyID0gc2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyOwoJCgkJdmFyCgkJCXNlYXJjaCA9IG9wdHMuc2VhcmNoLCAgLy8gbm9uZSwgYXBwbGllZCwgcmVtb3ZlZAoJCQlvcmRlciAgPSBvcHRzLm9yZGVyLCAgIC8vIGFwcGxpZWQsIGN1cnJlbnQsIGluZGV4IChvcmlnaW5hbCAtIGNvbXBhdGliaWxpdHkgd2l0aCAxLjkpCgkJCXBhZ2UgICA9IG9wdHMucGFnZTsgICAgLy8gYWxsLCBjdXJyZW50CgkKCQlpZiAoIF9mbkRhdGFTb3VyY2UoIHNldHRpbmdzICkgPT0gJ3NzcCcgKSB7CgkJCS8vIEluIHNlcnZlci1zaWRlIHByb2Nlc3NpbmcgbW9kZSwgbW9zdCBvcHRpb25zIGFyZSBpcnJlbGV2YW50IHNpbmNlCgkJCS8vIHJvd3Mgbm90IHNob3duIGRvbid0IGV4aXN0IGFuZCB0aGUgaW5kZXggb3JkZXIgaXMgdGhlIGFwcGxpZWQgb3JkZXIKCQkJLy8gUmVtb3ZlZCBpcyBhIHNwZWNpYWwgY2FzZSAtIGZvciBjb25zaXN0ZW5jeSBqdXN0IHJldHVybiBhbiBlbXB0eQoJCQkvLyBhcnJheQoJCQlyZXR1cm4gc2VhcmNoID09PSAncmVtb3ZlZCcgPwoJCQkJW10gOgoJCQkJX3JhbmdlKCAwLCBkaXNwbGF5TWFzdGVyLmxlbmd0aCApOwoJCX0KCQllbHNlIGlmICggcGFnZSA9PSAnY3VycmVudCcgKSB7CgkJCS8vIEN1cnJlbnQgcGFnZSBpbXBsaWVzIHRoYXQgb3JkZXI9Y3VycmVudCBhbmQgZml0bGVyPWFwcGxpZWQsIHNpbmNlIGl0IGlzCgkJCS8vIGZhaXJseSBzZW5zZWxlc3Mgb3RoZXJ3aXNlLCByZWdhcmRsZXNzIG9mIHdoYXQgb3JkZXIgYW5kIHNlYXJjaCBhY3R1YWxseQoJCQkvLyBhcmUKCQkJZm9yICggaT1zZXR0aW5ncy5faURpc3BsYXlTdGFydCwgaWVuPXNldHRpbmdzLmZuRGlzcGxheUVuZCgpIDsgaTxpZW4gOyBpKysgKSB7CgkJCQlhLnB1c2goIGRpc3BsYXlGaWx0ZXJlZFtpXSApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBvcmRlciA9PSAnY3VycmVudCcgfHwgb3JkZXIgPT0gJ2FwcGxpZWQnICkgewoJCQlpZiAoIHNlYXJjaCA9PSAnbm9uZScpIHsKCQkJCWEgPSBkaXNwbGF5TWFzdGVyLnNsaWNlKCk7CgkJCX0KCQkJZWxzZSBpZiAoIHNlYXJjaCA9PSAnYXBwbGllZCcgKSB7CgkJCQlhID0gZGlzcGxheUZpbHRlcmVkLnNsaWNlKCk7CgkJCX0KCQkJZWxzZSBpZiAoIHNlYXJjaCA9PSAncmVtb3ZlZCcgKSB7CgkJCQkvLyBPKG4rbSkgc29sdXRpb24gYnkgY3JlYXRpbmcgYSBoYXNoIG1hcAoJCQkJdmFyIGRpc3BsYXlGaWx0ZXJlZE1hcCA9IHt9OwoJCgkJCQlmb3IgKCB2YXIgaT0wLCBpZW49ZGlzcGxheUZpbHRlcmVkLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCWRpc3BsYXlGaWx0ZXJlZE1hcFtkaXNwbGF5RmlsdGVyZWRbaV1dID0gbnVsbDsKCQkJCX0KCQoJCQkJYSA9ICQubWFwKCBkaXNwbGF5TWFzdGVyLCBmdW5jdGlvbiAoZWwpIHsKCQkJCQlyZXR1cm4gISBkaXNwbGF5RmlsdGVyZWRNYXAuaGFzT3duUHJvcGVydHkoZWwpID8KCQkJCQkJZWwgOgoJCQkJCQludWxsOwoJCQkJfSApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBvcmRlciA9PSAnaW5kZXgnIHx8IG9yZGVyID09ICdvcmlnaW5hbCcgKSB7CgkJCWZvciAoIGk9MCwgaWVuPXNldHRpbmdzLmFvRGF0YS5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCWlmICggc2VhcmNoID09ICdub25lJyApIHsKCQkJCQlhLnB1c2goIGkgKTsKCQkJCX0KCQkJCWVsc2UgeyAvLyBhcHBsaWVkIHwgcmVtb3ZlZAoJCQkJCXRtcCA9ICQuaW5BcnJheSggaSwgZGlzcGxheUZpbHRlcmVkICk7CgkKCQkJCQlpZiAoKHRtcCA9PT0gLTEgJiYgc2VhcmNoID09ICdyZW1vdmVkJykgfHwKCQkJCQkJKHRtcCA+PSAwICAgJiYgc2VhcmNoID09ICdhcHBsaWVkJykgKQoJCQkJCXsKCQkJCQkJYS5wdXNoKCBpICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCgkJcmV0dXJuIGE7Cgl9OwoJCgkKCS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgoJICogUm93cwoJICoKCSAqIHt9ICAgICAgICAgIC0gbm8gc2VsZWN0b3IgLSB1c2UgYWxsIGF2YWlsYWJsZSByb3dzCgkgKiB7aW50ZWdlcn0gICAtIHJvdyBhb0RhdGEgaW5kZXgKCSAqIHtub2RlfSAgICAgIC0gVFIgbm9kZQoJICoge3N0cmluZ30gICAgLSBqUXVlcnkgc2VsZWN0b3IgdG8gYXBwbHkgdG8gdGhlIFRSIGVsZW1lbnRzCgkgKiB7YXJyYXl9ICAgICAtIGpRdWVyeSBhcnJheSBvZiBub2Rlcywgb3Igc2ltcGx5IGFuIGFycmF5IG9mIFRSIG5vZGVzCgkgKgoJICovCgl2YXIgX19yb3dfc2VsZWN0b3IgPSBmdW5jdGlvbiAoIHNldHRpbmdzLCBzZWxlY3Rvciwgb3B0cyApCgl7CgkJdmFyIHJvd3M7CgkJdmFyIHJ1biA9IGZ1bmN0aW9uICggc2VsICkgewoJCQl2YXIgc2VsSW50ID0gX2ludFZhbCggc2VsICk7CgkJCXZhciBpLCBpZW47CgkJCXZhciBhb0RhdGEgPSBzZXR0aW5ncy5hb0RhdGE7CgkKCQkJLy8gU2hvcnQgY3V0IC0gc2VsZWN0b3IgaXMgYSBudW1iZXIgYW5kIG5vIG9wdGlvbnMgcHJvdmlkZWQgKGRlZmF1bHQgaXMKCQkJLy8gYWxsIHJlY29yZHMsIHNvIG5vIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGluZGV4IGlzIGluIHRoZXJlLCBzaW5jZSBpdAoJCQkvLyBtdXN0IGJlIC0gZGV2IGVycm9yIGlmIHRoZSBpbmRleCBkb2Vzbid0IGV4aXN0KS4KCQkJaWYgKCBzZWxJbnQgIT09IG51bGwgJiYgISBvcHRzICkgewoJCQkJcmV0dXJuIFsgc2VsSW50IF07CgkJCX0KCQoJCQlpZiAoICEgcm93cyApIHsKCQkJCXJvd3MgPSBfc2VsZWN0b3Jfcm93X2luZGV4ZXMoIHNldHRpbmdzLCBvcHRzICk7CgkJCX0KCQoJCQlpZiAoIHNlbEludCAhPT0gbnVsbCAmJiAkLmluQXJyYXkoIHNlbEludCwgcm93cyApICE9PSAtMSApIHsKCQkJCS8vIFNlbGVjdG9yIC0gaW50ZWdlcgoJCQkJcmV0dXJuIFsgc2VsSW50IF07CgkJCX0KCQkJZWxzZSBpZiAoIHNlbCA9PT0gbnVsbCB8fCBzZWwgPT09IHVuZGVmaW5lZCB8fCBzZWwgPT09ICcnICkgewoJCQkJLy8gU2VsZWN0b3IgLSBub25lCgkJCQlyZXR1cm4gcm93czsKCQkJfQoJCgkJCS8vIFNlbGVjdG9yIC0gZnVuY3Rpb24KCQkJaWYgKCB0eXBlb2Ygc2VsID09PSAnZnVuY3Rpb24nICkgewoJCQkJcmV0dXJuICQubWFwKCByb3dzLCBmdW5jdGlvbiAoaWR4KSB7CgkJCQkJdmFyIHJvdyA9IGFvRGF0YVsgaWR4IF07CgkJCQkJcmV0dXJuIHNlbCggaWR4LCByb3cuX2FEYXRhLCByb3cublRyICkgPyBpZHggOiBudWxsOwoJCQkJfSApOwoJCQl9CgkKCQkJLy8gU2VsZWN0b3IgLSBub2RlCgkJCWlmICggc2VsLm5vZGVOYW1lICkgewoJCQkJdmFyIHJvd0lkeCA9IHNlbC5fRFRfUm93SW5kZXg7ICAvLyBQcm9wZXJ0eSBhZGRlZCBieSBEVCBmb3IgZmFzdCBsb29rdXAKCQkJCXZhciBjZWxsSWR4ID0gc2VsLl9EVF9DZWxsSW5kZXg7CgkKCQkJCWlmICggcm93SWR4ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJvdyBpcyBhY3R1YWxseSBzdGlsbCBwcmVzZW50IGluIHRoZSB0YWJsZQoJCQkJCXJldHVybiBhb0RhdGFbIHJvd0lkeCBdICYmIGFvRGF0YVsgcm93SWR4IF0ublRyID09PSBzZWwgPwoJCQkJCQlbIHJvd0lkeCBdIDoKCQkJCQkJW107CgkJCQl9CgkJCQllbHNlIGlmICggY2VsbElkeCApIHsKCQkJCQlyZXR1cm4gYW9EYXRhWyBjZWxsSWR4LnJvdyBdICYmIGFvRGF0YVsgY2VsbElkeC5yb3cgXS5uVHIgPT09IHNlbCA/CgkJCQkJCVsgY2VsbElkeC5yb3cgXSA6CgkJCQkJCVtdOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJdmFyIGhvc3QgPSAkKHNlbCkuY2xvc2VzdCgnKltkYXRhLWR0LXJvd10nKTsKCQkJCQlyZXR1cm4gaG9zdC5sZW5ndGggPwoJCQkJCQlbIGhvc3QuZGF0YSgnZHQtcm93JykgXSA6CgkJCQkJCVtdOwoJCQkJfQoJCQl9CgkKCQkJLy8gSUQgc2VsZWN0b3IuIFdhbnQgdG8gYWx3YXlzIGJlIGFibGUgdG8gc2VsZWN0IHJvd3MgYnkgaWQsIHJlZ2FyZGxlc3MKCQkJLy8gb2YgaWYgdGhlIHRyIGVsZW1lbnQgaGFzIGJlZW4gY3JlYXRlZCBvciBub3QsIHNvIGNhbid0IHJlbHkgdXBvbgoJCQkvLyBqUXVlcnkgaGVyZSAtIGhlbmNlIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLiBUaGlzIGRvZXMgbm90IG1hdGNoCgkJCS8vIFNpenpsZSdzIGZhc3Qgc2VsZWN0b3Igb3IgSFRNTDQgLSBpbiBIVE1MNSB0aGUgSUQgY2FuIGJlIGFueXRoaW5nLAoJCQkvLyBidXQgdG8gc2VsZWN0IGl0IHVzaW5nIGEgQ1NTIHNlbGVjdG9yIGVuZ2luZSAobGlrZSBTaXp6bGUgb3IKCQkJLy8gcXVlcnlTZWxlY3QpIGl0IHdvdWxkIG5lZWQgdG8gbmVlZCB0byBiZSBlc2NhcGVkIGZvciBzb21lIGNoYXJhY3RlcnMuCgkJCS8vIERhdGFUYWJsZXMgc2ltcGxpZmllcyB0aGlzIGZvciByb3cgc2VsZWN0b3JzIHNpbmNlIHlvdSBjYW4gc2VsZWN0CgkJCS8vIG9ubHkgYSByb3cuIEEgIyBpbmRpY2F0ZXMgYW4gaWQgYW55IGFueXRoaW5nIHRoYXQgZm9sbG93cyBpcyB0aGUgaWQgLQoJCQkvLyB1bmVzY2FwZWQuCgkJCWlmICggdHlwZW9mIHNlbCA9PT0gJ3N0cmluZycgJiYgc2VsLmNoYXJBdCgwKSA9PT0gJyMnICkgewoJCQkJLy8gZ2V0IHJvdyBpbmRleCBmcm9tIGlkCgkJCQl2YXIgcm93T2JqID0gc2V0dGluZ3MuYUlkc1sgc2VsLnJlcGxhY2UoIC9eIy8sICcnICkgXTsKCQkJCWlmICggcm93T2JqICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIFsgcm93T2JqLmlkeCBdOwoJCQkJfQoJCgkJCQkvLyBuZWVkIHRvIGZhbGwgdGhyb3VnaCB0byBqUXVlcnkgaW4gY2FzZSB0aGVyZSBpcyBET00gaWQgdGhhdAoJCQkJLy8gbWF0Y2hlcwoJCQl9CgkJCQoJCQkvLyBHZXQgbm9kZXMgaW4gdGhlIG9yZGVyIGZyb20gdGhlIGByb3dzYCBhcnJheSB3aXRoIG51bGwgdmFsdWVzIHJlbW92ZWQKCQkJdmFyIG5vZGVzID0gX3JlbW92ZUVtcHR5KAoJCQkJX3BsdWNrX29yZGVyKCBzZXR0aW5ncy5hb0RhdGEsIHJvd3MsICduVHInICkKCQkJKTsKCQoJCQkvLyBTZWxlY3RvciAtIGpRdWVyeSBzZWxlY3RvciBzdHJpbmcsIGFycmF5IG9mIG5vZGVzIG9yIGpRdWVyeSBvYmplY3QvCgkJCS8vIEFzIGpRdWVyeSdzIC5maWx0ZXIoKSBhbGxvd3MgalF1ZXJ5IG9iamVjdHMgdG8gYmUgcGFzc2VkIGluIGZpbHRlciwKCQkJLy8gaXQgYWxzbyBhbGxvd3MgYXJyYXlzLCBzbyB0aGlzIHdpbGwgY29wZSB3aXRoIGFsbCB0aHJlZSBvcHRpb25zCgkJCXJldHVybiAkKG5vZGVzKQoJCQkJLmZpbHRlciggc2VsICkKCQkJCS5tYXAoIGZ1bmN0aW9uICgpIHsKCQkJCQlyZXR1cm4gdGhpcy5fRFRfUm93SW5kZXg7CgkJCQl9ICkKCQkJCS50b0FycmF5KCk7CgkJfTsKCQoJCXJldHVybiBfc2VsZWN0b3JfcnVuKCAncm93Jywgc2VsZWN0b3IsIHJ1biwgc2V0dGluZ3MsIG9wdHMgKTsKCX07CgkKCQoJX2FwaV9yZWdpc3RlciggJ3Jvd3MoKScsIGZ1bmN0aW9uICggc2VsZWN0b3IsIG9wdHMgKSB7CgkJLy8gYXJndW1lbnQgc2hpZnRpbmcKCQlpZiAoIHNlbGVjdG9yID09PSB1bmRlZmluZWQgKSB7CgkJCXNlbGVjdG9yID0gJyc7CgkJfQoJCWVsc2UgaWYgKCAkLmlzUGxhaW5PYmplY3QoIHNlbGVjdG9yICkgKSB7CgkJCW9wdHMgPSBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSAnJzsKCQl9CgkKCQlvcHRzID0gX3NlbGVjdG9yX29wdHMoIG9wdHMgKTsKCQoJCXZhciBpbnN0ID0gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJcmV0dXJuIF9fcm93X3NlbGVjdG9yKCBzZXR0aW5ncywgc2VsZWN0b3IsIG9wdHMgKTsKCQl9LCAxICk7CgkKCQkvLyBXYW50IGFyZ3VtZW50IHNoaWZ0aW5nIGhlcmUgYW5kIGluIF9fcm93X3NlbGVjdG9yPwoJCWluc3Quc2VsZWN0b3Iucm93cyA9IHNlbGVjdG9yOwoJCWluc3Quc2VsZWN0b3Iub3B0cyA9IG9wdHM7CgkKCQlyZXR1cm4gaW5zdDsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlciggJ3Jvd3MoKS5ub2RlcygpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAncm93JywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93ICkgewoJCQlyZXR1cm4gc2V0dGluZ3MuYW9EYXRhWyByb3cgXS5uVHIgfHwgdW5kZWZpbmVkOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlciggJ3Jvd3MoKS5kYXRhKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoIHRydWUsICdyb3dzJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93cyApIHsKCQkJcmV0dXJuIF9wbHVja19vcmRlciggc2V0dGluZ3MuYW9EYXRhLCByb3dzLCAnX2FEYXRhJyApOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ3Jvd3MoKS5jYWNoZSgpJywgJ3JvdygpLmNhY2hlKCknLCBmdW5jdGlvbiAoIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdyb3cnLCBmdW5jdGlvbiAoIHNldHRpbmdzLCByb3cgKSB7CgkJCXZhciByID0gc2V0dGluZ3MuYW9EYXRhWyByb3cgXTsKCQkJcmV0dXJuIHR5cGUgPT09ICdzZWFyY2gnID8gci5fYUZpbHRlckRhdGEgOiByLl9hU29ydERhdGE7CgkJfSwgMSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAncm93cygpLmludmFsaWRhdGUoKScsICdyb3coKS5pbnZhbGlkYXRlKCknLCBmdW5jdGlvbiAoIHNyYyApIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3JvdycsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdyApIHsKCQkJX2ZuSW52YWxpZGF0ZSggc2V0dGluZ3MsIHJvdywgc3JjICk7CgkJfSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAncm93cygpLmluZGV4ZXMoKScsICdyb3coKS5pbmRleCgpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAncm93JywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93ICkgewoJCQlyZXR1cm4gcm93OwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ3Jvd3MoKS5pZHMoKScsICdyb3coKS5pZCgpJywgZnVuY3Rpb24gKCBoYXNoICkgewoJCXZhciBhID0gW107CgkJdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CgkKCQkvLyBgaXRlcmF0b3JgIHdpbGwgZHJvcCB1bmRlZmluZWQgdmFsdWVzLCBidXQgaW4gdGhpcyBjYXNlIHdlIHdhbnQgdGhlbQoJCWZvciAoIHZhciBpPTAsIGllbj1jb250ZXh0Lmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQlmb3IgKCB2YXIgaj0wLCBqZW49dGhpc1tpXS5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCXZhciBpZCA9IGNvbnRleHRbaV0ucm93SWRGbiggY29udGV4dFtpXS5hb0RhdGFbIHRoaXNbaV1bal0gXS5fYURhdGEgKTsKCQkJCWEucHVzaCggKGhhc2ggPT09IHRydWUgPyAnIycgOiAnJyApKyBpZCApOwoJCQl9CgkJfQoJCgkJcmV0dXJuIG5ldyBfQXBpKCBjb250ZXh0LCBhICk7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdyb3dzKCkucmVtb3ZlKCknLCAncm93KCkucmVtb3ZlKCknLCBmdW5jdGlvbiAoKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoJCgkJdGhpcy5pdGVyYXRvciggJ3JvdycsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdywgdGhhdElkeCApIHsKCQkJdmFyIGRhdGEgPSBzZXR0aW5ncy5hb0RhdGE7CgkJCXZhciByb3dEYXRhID0gZGF0YVsgcm93IF07CgkJCXZhciBpLCBpZW4sIGosIGplbjsKCQkJdmFyIGxvb3BSb3csIGxvb3BDZWxsczsKCQoJCQlkYXRhLnNwbGljZSggcm93LCAxICk7CgkKCQkJLy8gVXBkYXRlIHRoZSBjYWNoZWQgaW5kZXhlcwoJCQlmb3IgKCBpPTAsIGllbj1kYXRhLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJbG9vcFJvdyA9IGRhdGFbaV07CgkJCQlsb29wQ2VsbHMgPSBsb29wUm93LmFuQ2VsbHM7CgkKCQkJCS8vIFJvd3MKCQkJCWlmICggbG9vcFJvdy5uVHIgIT09IG51bGwgKSB7CgkJCQkJbG9vcFJvdy5uVHIuX0RUX1Jvd0luZGV4ID0gaTsKCQkJCX0KCQoJCQkJLy8gQ2VsbHMKCQkJCWlmICggbG9vcENlbGxzICE9PSBudWxsICkgewoJCQkJCWZvciAoIGo9MCwgamVuPWxvb3BDZWxscy5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCQkJbG9vcENlbGxzW2pdLl9EVF9DZWxsSW5kZXgucm93ID0gaTsKCQkJCQl9CgkJCQl9CgkJCX0KCQoJCQkvLyBEZWxldGUgZnJvbSB0aGUgZGlzcGxheSBhcnJheXMKCQkJX2ZuRGVsZXRlSW5kZXgoIHNldHRpbmdzLmFpRGlzcGxheU1hc3Rlciwgcm93ICk7CgkJCV9mbkRlbGV0ZUluZGV4KCBzZXR0aW5ncy5haURpc3BsYXksIHJvdyApOwoJCQlfZm5EZWxldGVJbmRleCggdGhhdFsgdGhhdElkeCBdLCByb3csIGZhbHNlICk7IC8vIG1haW50YWluIGxvY2FsIGluZGV4ZXMKCQoJCQkvLyBGb3Igc2VydmVyLXNpZGUgcHJvY2Vzc2luZyB0YWJsZXMgLSBzdWJ0cmFjdCB0aGUgZGVsZXRlZCByb3cgZnJvbSB0aGUgY291bnQKCQkJaWYgKCBzZXR0aW5ncy5faVJlY29yZHNEaXNwbGF5ID4gMCApIHsKCQkJCXNldHRpbmdzLl9pUmVjb3Jkc0Rpc3BsYXktLTsKCQkJfQoJCgkJCS8vIENoZWNrIGZvciBhbiAnb3ZlcmZsb3cnIHRoZXkgY2FzZSBmb3IgZGlzcGxheWluZyB0aGUgdGFibGUKCQkJX2ZuTGVuZ3RoT3ZlcmZsb3coIHNldHRpbmdzICk7CgkKCQkJLy8gUmVtb3ZlIHRoZSByb3cncyBJRCByZWZlcmVuY2UgaWYgdGhlcmUgaXMgb25lCgkJCXZhciBpZCA9IHNldHRpbmdzLnJvd0lkRm4oIHJvd0RhdGEuX2FEYXRhICk7CgkJCWlmICggaWQgIT09IHVuZGVmaW5lZCApIHsKCQkJCWRlbGV0ZSBzZXR0aW5ncy5hSWRzWyBpZCBdOwoJCQl9CgkJfSApOwoJCgkJdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJZm9yICggdmFyIGk9MCwgaWVuPXNldHRpbmdzLmFvRGF0YS5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCXNldHRpbmdzLmFvRGF0YVtpXS5pZHggPSBpOwoJCQl9CgkJfSApOwoJCgkJcmV0dXJuIHRoaXM7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3Jvd3MuYWRkKCknLCBmdW5jdGlvbiAoIHJvd3MgKSB7CgkJdmFyIG5ld1Jvd3MgPSB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQkJdmFyIHJvdywgaSwgaWVuOwoJCQkJdmFyIG91dCA9IFtdOwoJCgkJCQlmb3IgKCBpPTAsIGllbj1yb3dzLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCXJvdyA9IHJvd3NbaV07CgkKCQkJCQlpZiAoIHJvdy5ub2RlTmFtZSAmJiByb3cubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1RSJyApIHsKCQkJCQkJb3V0LnB1c2goIF9mbkFkZFRyKCBzZXR0aW5ncywgcm93IClbMF0gKTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCW91dC5wdXNoKCBfZm5BZGREYXRhKCBzZXR0aW5ncywgcm93ICkgKTsKCQkJCQl9CgkJCQl9CgkKCQkJCXJldHVybiBvdXQ7CgkJCX0sIDEgKTsKCQoJCS8vIFJldHVybiBhbiBBcGkucm93cygpIGV4dGVuZGVkIGluc3RhbmNlLCBzbyByb3dzKCkubm9kZXMoKSBldGMgY2FuIGJlIHVzZWQKCQl2YXIgbW9kUm93cyA9IHRoaXMucm93cyggLTEgKTsKCQltb2RSb3dzLnBvcCgpOwoJCSQubWVyZ2UoIG1vZFJvd3MsIG5ld1Jvd3MgKTsKCQoJCXJldHVybiBtb2RSb3dzOwoJfSApOwoJCgkKCQoJCgkKCS8qKgoJICoKCSAqLwoJX2FwaV9yZWdpc3RlciggJ3JvdygpJywgZnVuY3Rpb24gKCBzZWxlY3Rvciwgb3B0cyApIHsKCQlyZXR1cm4gX3NlbGVjdG9yX2ZpcnN0KCB0aGlzLnJvd3MoIHNlbGVjdG9yLCBvcHRzICkgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAncm93KCkuZGF0YSgpJywgZnVuY3Rpb24gKCBkYXRhICkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKCQkJLy8gR2V0CgkJCXJldHVybiBjdHgubGVuZ3RoICYmIHRoaXMubGVuZ3RoID8KCQkJCWN0eFswXS5hb0RhdGFbIHRoaXNbMF0gXS5fYURhdGEgOgoJCQkJdW5kZWZpbmVkOwoJCX0KCQoJCS8vIFNldAoJCXZhciByb3cgPSBjdHhbMF0uYW9EYXRhWyB0aGlzWzBdIF07CgkJcm93Ll9hRGF0YSA9IGRhdGE7CgkKCQkvLyBJZiB0aGUgRE9NIGhhcyBhbiBpZCwgYW5kIHRoZSBkYXRhIHNvdXJjZSBpcyBhbiBhcnJheQoJCWlmICggJC5pc0FycmF5KCBkYXRhICkgJiYgcm93Lm5Uci5pZCApIHsKCQkJX2ZuU2V0T2JqZWN0RGF0YUZuKCBjdHhbMF0ucm93SWQgKSggZGF0YSwgcm93Lm5Uci5pZCApOwoJCX0KCQoJCS8vIEF1dG9tYXRpY2FsbHkgaW52YWxpZGF0ZQoJCV9mbkludmFsaWRhdGUoIGN0eFswXSwgdGhpc1swXSwgJ2RhdGEnICk7CgkKCQlyZXR1cm4gdGhpczsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAncm93KCkubm9kZSgpJywgZnVuY3Rpb24gKCkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlyZXR1cm4gY3R4Lmxlbmd0aCAmJiB0aGlzLmxlbmd0aCA/CgkJCWN0eFswXS5hb0RhdGFbIHRoaXNbMF0gXS5uVHIgfHwgbnVsbCA6CgkJCW51bGw7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3Jvdy5hZGQoKScsIGZ1bmN0aW9uICggcm93ICkgewoJCS8vIEFsbG93IGEgalF1ZXJ5IG9iamVjdCB0byBiZSBwYXNzZWQgaW4gLSBvbmx5IGEgc2luZ2xlIHJvdyBpcyBhZGRlZCBmcm9tCgkJLy8gaXQgdGhvdWdoIC0gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNldAoJCWlmICggcm93IGluc3RhbmNlb2YgJCAmJiByb3cubGVuZ3RoICkgewoJCQlyb3cgPSByb3dbMF07CgkJfQoJCgkJdmFyIHJvd3MgPSB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlpZiAoIHJvdy5ub2RlTmFtZSAmJiByb3cubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1RSJyApIHsKCQkJCXJldHVybiBfZm5BZGRUciggc2V0dGluZ3MsIHJvdyApWzBdOwoJCQl9CgkJCXJldHVybiBfZm5BZGREYXRhKCBzZXR0aW5ncywgcm93ICk7CgkJfSApOwoJCgkJLy8gUmV0dXJuIGFuIEFwaS5yb3dzKCkgZXh0ZW5kZWQgaW5zdGFuY2UsIHdpdGggdGhlIG5ld2x5IGFkZGVkIHJvdyBzZWxlY3RlZAoJCXJldHVybiB0aGlzLnJvdyggcm93c1swXSApOwoJfSApOwoJCgkKCQoJdmFyIF9fZGV0YWlsc19hZGQgPSBmdW5jdGlvbiAoIGN0eCwgcm93LCBkYXRhLCBrbGFzcyApCgl7CgkJLy8gQ29udmVydCB0byBhcnJheSBvZiBUUiBlbGVtZW50cwoJCXZhciByb3dzID0gW107CgkJdmFyIGFkZFJvdyA9IGZ1bmN0aW9uICggciwgayApIHsKCQkJLy8gUmVjdXJzaW9uIHRvIGFsbG93IGZvciBhcnJheXMgb2YgalF1ZXJ5IG9iamVjdHMKCQkJaWYgKCAkLmlzQXJyYXkoIHIgKSB8fCByIGluc3RhbmNlb2YgJCApIHsKCQkJCWZvciAoIHZhciBpPTAsIGllbj1yLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCWFkZFJvdyggcltpXSwgayApOwoJCQkJfQoJCQkJcmV0dXJuOwoJCQl9CgkKCQkJLy8gSWYgd2UgZ2V0IGEgVFIgZWxlbWVudCwgdGhlbiBqdXN0IGFkZCBpdCBkaXJlY3RseSAtIHVwIHRvIHRoZSBkZXYKCQkJLy8gdG8gYWRkIHRoZSBjb3JyZWN0IG51bWJlciBvZiBjb2x1bW5zIGV0YwoJCQlpZiAoIHIubm9kZU5hbWUgJiYgci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndHInICkgewoJCQkJcm93cy5wdXNoKCByICk7CgkJCX0KCQkJZWxzZSB7CgkJCQkvLyBPdGhlcndpc2UgY3JlYXRlIGEgcm93IHdpdGggYSB3cmFwcGVyCgkJCQl2YXIgY3JlYXRlZCA9ICQoJzx0cj48dGQvPjwvdHI+JykuYWRkQ2xhc3MoIGsgKTsKCQkJCSQoJ3RkJywgY3JlYXRlZCkKCQkJCQkuYWRkQ2xhc3MoIGsgKQoJCQkJCS5odG1sKCByICkKCQkJCQlbMF0uY29sU3BhbiA9IF9mblZpc2JsZUNvbHVtbnMoIGN0eCApOwoJCgkJCQlyb3dzLnB1c2goIGNyZWF0ZWRbMF0gKTsKCQkJfQoJCX07CgkKCQlhZGRSb3coIGRhdGEsIGtsYXNzICk7CgkKCQlpZiAoIHJvdy5fZGV0YWlscyApIHsKCQkJcm93Ll9kZXRhaWxzLmRldGFjaCgpOwoJCX0KCQoJCXJvdy5fZGV0YWlscyA9ICQocm93cyk7CgkKCQkvLyBJZiB0aGUgY2hpbGRyZW4gd2VyZSBhbHJlYWR5IHNob3duLCB0aGF0IHN0YXRlIHNob3VsZCBiZSByZXRhaW5lZAoJCWlmICggcm93Ll9kZXRhaWxzU2hvdyApIHsKCQkJcm93Ll9kZXRhaWxzLmluc2VydEFmdGVyKCByb3cublRyICk7CgkJfQoJfTsKCQoJCgl2YXIgX19kZXRhaWxzX3JlbW92ZSA9IGZ1bmN0aW9uICggYXBpLCBpZHggKQoJewoJCXZhciBjdHggPSBhcGkuY29udGV4dDsKCQoJCWlmICggY3R4Lmxlbmd0aCApIHsKCQkJdmFyIHJvdyA9IGN0eFswXS5hb0RhdGFbIGlkeCAhPT0gdW5kZWZpbmVkID8gaWR4IDogYXBpWzBdIF07CgkKCQkJaWYgKCByb3cgJiYgcm93Ll9kZXRhaWxzICkgewoJCQkJcm93Ll9kZXRhaWxzLnJlbW92ZSgpOwoJCgkJCQlyb3cuX2RldGFpbHNTaG93ID0gdW5kZWZpbmVkOwoJCQkJcm93Ll9kZXRhaWxzID0gdW5kZWZpbmVkOwoJCQl9CgkJfQoJfTsKCQoJCgl2YXIgX19kZXRhaWxzX2Rpc3BsYXkgPSBmdW5jdGlvbiAoIGFwaSwgc2hvdyApIHsKCQl2YXIgY3R4ID0gYXBpLmNvbnRleHQ7CgkKCQlpZiAoIGN0eC5sZW5ndGggJiYgYXBpLmxlbmd0aCApIHsKCQkJdmFyIHJvdyA9IGN0eFswXS5hb0RhdGFbIGFwaVswXSBdOwoJCgkJCWlmICggcm93Ll9kZXRhaWxzICkgewoJCQkJcm93Ll9kZXRhaWxzU2hvdyA9IHNob3c7CgkKCQkJCWlmICggc2hvdyApIHsKCQkJCQlyb3cuX2RldGFpbHMuaW5zZXJ0QWZ0ZXIoIHJvdy5uVHIgKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXJvdy5fZGV0YWlscy5kZXRhY2goKTsKCQkJCX0KCQoJCQkJX19kZXRhaWxzX2V2ZW50cyggY3R4WzBdICk7CgkJCX0KCQl9Cgl9OwoJCgkKCXZhciBfX2RldGFpbHNfZXZlbnRzID0gZnVuY3Rpb24gKCBzZXR0aW5ncyApCgl7CgkJdmFyIGFwaSA9IG5ldyBfQXBpKCBzZXR0aW5ncyApOwoJCXZhciBuYW1lc3BhY2UgPSAnLmR0LkRUX2RldGFpbHMnOwoJCXZhciBkcmF3RXZlbnQgPSAnZHJhdycrbmFtZXNwYWNlOwoJCXZhciBjb2x2aXNFdmVudCA9ICdjb2x1bW4tdmlzaWJpbGl0eScrbmFtZXNwYWNlOwoJCXZhciBkZXN0cm95RXZlbnQgPSAnZGVzdHJveScrbmFtZXNwYWNlOwoJCXZhciBkYXRhID0gc2V0dGluZ3MuYW9EYXRhOwoJCgkJYXBpLm9mZiggZHJhd0V2ZW50ICsnICcrIGNvbHZpc0V2ZW50ICsnICcrIGRlc3Ryb3lFdmVudCApOwoJCgkJaWYgKCBfcGx1Y2soIGRhdGEsICdfZGV0YWlscycgKS5sZW5ndGggPiAwICkgewoJCQkvLyBPbiBlYWNoIGRyYXcsIGluc2VydCB0aGUgcmVxdWlyZWQgZWxlbWVudHMgaW50byB0aGUgZG9jdW1lbnQKCQkJYXBpLm9uKCBkcmF3RXZlbnQsIGZ1bmN0aW9uICggZSwgY3R4ICkgewoJCQkJaWYgKCBzZXR0aW5ncyAhPT0gY3R4ICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQoJCQkJYXBpLnJvd3MoIHtwYWdlOidjdXJyZW50J30gKS5lcSgwKS5lYWNoKCBmdW5jdGlvbiAoaWR4KSB7CgkJCQkJLy8gSW50ZXJuYWwgZGF0YSBncmFiCgkJCQkJdmFyIHJvdyA9IGRhdGFbIGlkeCBdOwoJCgkJCQkJaWYgKCByb3cuX2RldGFpbHNTaG93ICkgewoJCQkJCQlyb3cuX2RldGFpbHMuaW5zZXJ0QWZ0ZXIoIHJvdy5uVHIgKTsKCQkJCQl9CgkJCQl9ICk7CgkJCX0gKTsKCQoJCQkvLyBDb2x1bW4gdmlzaWJpbGl0eSBjaGFuZ2UgLSB1cGRhdGUgdGhlIGNvbHNwYW4KCQkJYXBpLm9uKCBjb2x2aXNFdmVudCwgZnVuY3Rpb24gKCBlLCBjdHgsIGlkeCwgdmlzICkgewoJCQkJaWYgKCBzZXR0aW5ncyAhPT0gY3R4ICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQoJCQkJLy8gVXBkYXRlIHRoZSBjb2xzcGFuIGZvciB0aGUgZGV0YWlscyByb3dzIChub3RlLCBvbmx5IGlmIGl0IGFscmVhZHkgaGFzCgkJCQkvLyBhIGNvbHNwYW4pCgkJCQl2YXIgcm93LCB2aXNpYmxlID0gX2ZuVmlzYmxlQ29sdW1ucyggY3R4ICk7CgkKCQkJCWZvciAoIHZhciBpPTAsIGllbj1kYXRhLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCXJvdyA9IGRhdGFbaV07CgkKCQkJCQlpZiAoIHJvdy5fZGV0YWlscyApIHsKCQkJCQkJcm93Ll9kZXRhaWxzLmNoaWxkcmVuKCd0ZFtjb2xzcGFuXScpLmF0dHIoJ2NvbHNwYW4nLCB2aXNpYmxlICk7CgkJCQkJfQoJCQkJfQoJCQl9ICk7CgkKCQkJLy8gVGFibGUgZGVzdHJveWVkIC0gbnVrZSBhbnkgY2hpbGQgcm93cwoJCQlhcGkub24oIGRlc3Ryb3lFdmVudCwgZnVuY3Rpb24gKCBlLCBjdHggKSB7CgkJCQlpZiAoIHNldHRpbmdzICE9PSBjdHggKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCgkJCQlmb3IgKCB2YXIgaT0wLCBpZW49ZGF0YS5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCQlpZiAoIGRhdGFbaV0uX2RldGFpbHMgKSB7CgkJCQkJCV9fZGV0YWlsc19yZW1vdmUoIGFwaSwgaSApOwoJCQkJCX0KCQkJCX0KCQkJfSApOwoJCX0KCX07CgkKCS8vIFN0cmluZ3MgZm9yIHRoZSBtZXRob2QgbmFtZXMgdG8gaGVscCBtaW5pZmljYXRpb24KCXZhciBfZW1wID0gJyc7Cgl2YXIgX2NoaWxkX29iaiA9IF9lbXArJ3JvdygpLmNoaWxkJzsKCXZhciBfY2hpbGRfbXRoID0gX2NoaWxkX29iaisnKCknOwoJCgkvLyBkYXRhIGNhbiBiZToKCS8vICB0cgoJLy8gIHN0cmluZwoJLy8gIGpRdWVyeSBvciBhcnJheSBvZiBhbnkgb2YgdGhlIGFib3ZlCglfYXBpX3JlZ2lzdGVyKCBfY2hpbGRfbXRoLCBmdW5jdGlvbiAoIGRhdGEsIGtsYXNzICkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKCQkJLy8gZ2V0CgkJCXJldHVybiBjdHgubGVuZ3RoICYmIHRoaXMubGVuZ3RoID8KCQkJCWN0eFswXS5hb0RhdGFbIHRoaXNbMF0gXS5fZGV0YWlscyA6CgkJCQl1bmRlZmluZWQ7CgkJfQoJCWVsc2UgaWYgKCBkYXRhID09PSB0cnVlICkgewoJCQkvLyBzaG93CgkJCXRoaXMuY2hpbGQuc2hvdygpOwoJCX0KCQllbHNlIGlmICggZGF0YSA9PT0gZmFsc2UgKSB7CgkJCS8vIHJlbW92ZQoJCQlfX2RldGFpbHNfcmVtb3ZlKCB0aGlzICk7CgkJfQoJCWVsc2UgaWYgKCBjdHgubGVuZ3RoICYmIHRoaXMubGVuZ3RoICkgewoJCQkvLyBzZXQKCQkJX19kZXRhaWxzX2FkZCggY3R4WzBdLCBjdHhbMF0uYW9EYXRhWyB0aGlzWzBdIF0sIGRhdGEsIGtsYXNzICk7CgkJfQoJCgkJcmV0dXJuIHRoaXM7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggWwoJCV9jaGlsZF9vYmorJy5zaG93KCknLAoJCV9jaGlsZF9tdGgrJy5zaG93KCknIC8vIG9ubHkgd2hlbiBgY2hpbGQoKWAgd2FzIGNhbGxlZCB3aXRoIHBhcmFtZXRlcnMgKHdpdGhvdXQKCV0sIGZ1bmN0aW9uICggc2hvdyApIHsgICAvLyBpdCByZXR1cm5zIGFuIG9iamVjdCBhbmQgdGhpcyBtZXRob2QgaXMgbm90IGV4ZWN1dGVkKQoJCV9fZGV0YWlsc19kaXNwbGF5KCB0aGlzLCB0cnVlICk7CgkJcmV0dXJuIHRoaXM7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggWwoJCV9jaGlsZF9vYmorJy5oaWRlKCknLAoJCV9jaGlsZF9tdGgrJy5oaWRlKCknIC8vIG9ubHkgd2hlbiBgY2hpbGQoKWAgd2FzIGNhbGxlZCB3aXRoIHBhcmFtZXRlcnMgKHdpdGhvdXQKCV0sIGZ1bmN0aW9uICgpIHsgICAgICAgICAvLyBpdCByZXR1cm5zIGFuIG9iamVjdCBhbmQgdGhpcyBtZXRob2QgaXMgbm90IGV4ZWN1dGVkKQoJCV9fZGV0YWlsc19kaXNwbGF5KCB0aGlzLCBmYWxzZSApOwoJCXJldHVybiB0aGlzOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXIoIFsKCQlfY2hpbGRfb2JqKycucmVtb3ZlKCknLAoJCV9jaGlsZF9tdGgrJy5yZW1vdmUoKScgLy8gb25seSB3aGVuIGBjaGlsZCgpYCB3YXMgY2FsbGVkIHdpdGggcGFyYW1ldGVycyAod2l0aG91dAoJXSwgZnVuY3Rpb24gKCkgeyAgICAgICAgICAgLy8gaXQgcmV0dXJucyBhbiBvYmplY3QgYW5kIHRoaXMgbWV0aG9kIGlzIG5vdCBleGVjdXRlZCkKCQlfX2RldGFpbHNfcmVtbw=="
},
{
"key": "jquery.dataTables.js?4?3?2",
"type": "binary",
"value": "base64:dmUoIHRoaXMgKTsKCQlyZXR1cm4gdGhpczsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCBfY2hpbGRfb2JqKycuaXNTaG93bigpJywgZnVuY3Rpb24gKCkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlpZiAoIGN0eC5sZW5ndGggJiYgdGhpcy5sZW5ndGggKSB7CgkJCS8vIF9kZXRhaWxzU2hvd24gYXMgZmFsc2Ugb3IgdW5kZWZpbmVkIHdpbGwgZmFsbCB0aHJvdWdoIHRvIHJldHVybiBmYWxzZQoJCQlyZXR1cm4gY3R4WzBdLmFvRGF0YVsgdGhpc1swXSBdLl9kZXRhaWxzU2hvdyB8fCBmYWxzZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfSApOwoJCgkKCQoJLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqCgkgKiBDb2x1bW5zCgkgKgoJICoge2ludGVnZXJ9ICAgICAgICAgICAtIGNvbHVtbiBpbmRleCAoPj0wIGNvdW50IGZyb20gbGVmdCwgPDAgY291bnQgZnJvbSByaWdodCkKCSAqICJ7aW50ZWdlcn06dmlzSWR4IiAgLSB2aXNpYmxlIGNvbHVtbiBpbmRleCAoaS5lLiB0cmFuc2xhdGUgdG8gY29sdW1uIGluZGV4KSAgKD49MCBjb3VudCBmcm9tIGxlZnQsIDwwIGNvdW50IGZyb20gcmlnaHQpCgkgKiAie2ludGVnZXJ9OnZpc2libGUiIC0gYWxpYXMgZm9yIHtpbnRlZ2VyfTp2aXNJZHggICg+PTAgY291bnQgZnJvbSBsZWZ0LCA8MCBjb3VudCBmcm9tIHJpZ2h0KQoJICogIntzdHJpbmd9Om5hbWUiICAgICAtIGNvbHVtbiBuYW1lCgkgKiAie3N0cmluZ30iICAgICAgICAgIC0galF1ZXJ5IHNlbGVjdG9yIG9uIGNvbHVtbiBoZWFkZXIgbm9kZXMKCSAqCgkgKi8KCQoJLy8gY2FuIGJlIGFuIGFycmF5IG9mIHRoZXNlIGl0ZW1zLCBjb21tYSBzZXBhcmF0ZWQgbGlzdCwgb3IgYW4gYXJyYXkgb2YgY29tbWEKCS8vIHNlcGFyYXRlZCBsaXN0cwoJCgl2YXIgX19yZV9jb2x1bW5fc2VsZWN0b3IgPSAvXihbXjpdKyk6KG5hbWV8dmlzSWR4fHZpc2libGUpJC87CgkKCQoJLy8gcjEgYW5kIHIyIGFyZSByZWR1bmRhbnQgLSBidXQgaXQgbWVhbnMgdGhhdCB0aGUgcGFyYW1ldGVycyBtYXRjaCBmb3IgdGhlCgkvLyBpdGVyYXRvciBjYWxsYmFjayBpbiBjb2x1bW5zKCkuZGF0YSgpCgl2YXIgX19jb2x1bW5EYXRhID0gZnVuY3Rpb24gKCBzZXR0aW5ncywgY29sdW1uLCByMSwgcjIsIHJvd3MgKSB7CgkJdmFyIGEgPSBbXTsKCQlmb3IgKCB2YXIgcm93PTAsIGllbj1yb3dzLmxlbmd0aCA7IHJvdzxpZW4gOyByb3crKyApIHsKCQkJYS5wdXNoKCBfZm5HZXRDZWxsRGF0YSggc2V0dGluZ3MsIHJvd3Nbcm93XSwgY29sdW1uICkgKTsKCQl9CgkJcmV0dXJuIGE7Cgl9OwoJCgkKCXZhciBfX2NvbHVtbl9zZWxlY3RvciA9IGZ1bmN0aW9uICggc2V0dGluZ3MsIHNlbGVjdG9yLCBvcHRzICkKCXsKCQl2YXIKCQkJY29sdW1ucyA9IHNldHRpbmdzLmFvQ29sdW1ucywKCQkJbmFtZXMgPSBfcGx1Y2soIGNvbHVtbnMsICdzTmFtZScgKSwKCQkJbm9kZXMgPSBfcGx1Y2soIGNvbHVtbnMsICduVGgnICk7CgkKCQl2YXIgcnVuID0gZnVuY3Rpb24gKCBzICkgewoJCQl2YXIgc2VsSW50ID0gX2ludFZhbCggcyApOwoJCgkJCS8vIFNlbGVjdG9yIC0gYWxsCgkJCWlmICggcyA9PT0gJycgKSB7CgkJCQlyZXR1cm4gX3JhbmdlKCBjb2x1bW5zLmxlbmd0aCApOwoJCQl9CgkKCQkJLy8gU2VsZWN0b3IgLSBpbmRleAoJCQlpZiAoIHNlbEludCAhPT0gbnVsbCApIHsKCQkJCXJldHVybiBbIHNlbEludCA+PSAwID8KCQkJCQlzZWxJbnQgOiAvLyBDb3VudCBmcm9tIGxlZnQKCQkJCQljb2x1bW5zLmxlbmd0aCArIHNlbEludCAvLyBDb3VudCBmcm9tIHJpZ2h0ICgrIGJlY2F1c2UgaXRzIGEgbmVnYXRpdmUgdmFsdWUpCgkJCQldOwoJCQl9CgkKCQkJLy8gU2VsZWN0b3IgPSBmdW5jdGlvbgoJCQlpZiAoIHR5cGVvZiBzID09PSAnZnVuY3Rpb24nICkgewoJCQkJdmFyIHJvd3MgPSBfc2VsZWN0b3Jfcm93X2luZGV4ZXMoIHNldHRpbmdzLCBvcHRzICk7CgkKCQkJCXJldHVybiAkLm1hcCggY29sdW1ucywgZnVuY3Rpb24gKGNvbCwgaWR4KSB7CgkJCQkJcmV0dXJuIHMoCgkJCQkJCQlpZHgsCgkJCQkJCQlfX2NvbHVtbkRhdGEoIHNldHRpbmdzLCBpZHgsIDAsIDAsIHJvd3MgKSwKCQkJCQkJCW5vZGVzWyBpZHggXQoJCQkJCQkpID8gaWR4IDogbnVsbDsKCQkJCX0gKTsKCQkJfQoJCgkJCS8vIGpRdWVyeSBvciBzdHJpbmcgc2VsZWN0b3IKCQkJdmFyIG1hdGNoID0gdHlwZW9mIHMgPT09ICdzdHJpbmcnID8KCQkJCXMubWF0Y2goIF9fcmVfY29sdW1uX3NlbGVjdG9yICkgOgoJCQkJJyc7CgkKCQkJaWYgKCBtYXRjaCApIHsKCQkJCXN3aXRjaCggbWF0Y2hbMl0gKSB7CgkJCQkJY2FzZSAndmlzSWR4JzoKCQkJCQljYXNlICd2aXNpYmxlJzoKCQkJCQkJdmFyIGlkeCA9IHBhcnNlSW50KCBtYXRjaFsxXSwgMTAgKTsKCQkJCQkJLy8gVmlzaWJsZSBpbmRleCBnaXZlbiwgY29udmVydCB0byBjb2x1bW4gaW5kZXgKCQkJCQkJaWYgKCBpZHggPCAwICkgewoJCQkJCQkJLy8gQ291bnRpbmcgZnJvbSB0aGUgcmlnaHQKCQkJCQkJCXZhciB2aXNDb2x1bW5zID0gJC5tYXAoIGNvbHVtbnMsIGZ1bmN0aW9uIChjb2wsaSkgewoJCQkJCQkJCXJldHVybiBjb2wuYlZpc2libGUgPyBpIDogbnVsbDsKCQkJCQkJCX0gKTsKCQkJCQkJCXJldHVybiBbIHZpc0NvbHVtbnNbIHZpc0NvbHVtbnMubGVuZ3RoICsgaWR4IF0gXTsKCQkJCQkJfQoJCQkJCQkvLyBDb3VudGluZyBmcm9tIHRoZSBsZWZ0CgkJCQkJCXJldHVybiBbIF9mblZpc2libGVUb0NvbHVtbkluZGV4KCBzZXR0aW5ncywgaWR4ICkgXTsKCQoJCQkJCWNhc2UgJ25hbWUnOgoJCQkJCQkvLyBtYXRjaCBieSBuYW1lLiBgbmFtZXNgIGlzIGNvbHVtbiBpbmRleCBjb21wbGV0ZSBhbmQgaW4gb3JkZXIKCQkJCQkJcmV0dXJuICQubWFwKCBuYW1lcywgZnVuY3Rpb24gKG5hbWUsIGkpIHsKCQkJCQkJCXJldHVybiBuYW1lID09PSBtYXRjaFsxXSA/IGkgOiBudWxsOwoJCQkJCQl9ICk7CgkKCQkJCQlkZWZhdWx0OgoJCQkJCQlyZXR1cm4gW107CgkJCQl9CgkJCX0KCQoJCQkvLyBDZWxsIGluIHRoZSB0YWJsZSBib2R5CgkJCWlmICggcy5ub2RlTmFtZSAmJiBzLl9EVF9DZWxsSW5kZXggKSB7CgkJCQlyZXR1cm4gWyBzLl9EVF9DZWxsSW5kZXguY29sdW1uIF07CgkJCX0KCQoJCQkvLyBqUXVlcnkgc2VsZWN0b3Igb24gdGhlIFRIIGVsZW1lbnRzIGZvciB0aGUgY29sdW1ucwoJCQl2YXIganFSZXN1bHQgPSAkKCBub2RlcyApCgkJCQkuZmlsdGVyKCBzICkKCQkJCS5tYXAoIGZ1bmN0aW9uICgpIHsKCQkJCQlyZXR1cm4gJC5pbkFycmF5KCB0aGlzLCBub2RlcyApOyAvLyBgbm9kZXNgIGlzIGNvbHVtbiBpbmRleCBjb21wbGV0ZSBhbmQgaW4gb3JkZXIKCQkJCX0gKQoJCQkJLnRvQXJyYXkoKTsKCQoJCQlpZiAoIGpxUmVzdWx0Lmxlbmd0aCB8fCAhIHMubm9kZU5hbWUgKSB7CgkJCQlyZXR1cm4ganFSZXN1bHQ7CgkJCX0KCQoJCQkvLyBPdGhlcndpc2UgYSBub2RlIHdoaWNoIG1pZ2h0IGhhdmUgYSBgZHQtY29sdW1uYCBkYXRhIGF0dHJpYnV0ZSwgb3IgYmUKCQkJLy8gYSBjaGlsZCBvciBzdWNoIGFuIGVsZW1lbnQKCQkJdmFyIGhvc3QgPSAkKHMpLmNsb3Nlc3QoJypbZGF0YS1kdC1jb2x1bW5dJyk7CgkJCXJldHVybiBob3N0Lmxlbmd0aCA/CgkJCQlbIGhvc3QuZGF0YSgnZHQtY29sdW1uJykgXSA6CgkJCQlbXTsKCQl9OwoJCgkJcmV0dXJuIF9zZWxlY3Rvcl9ydW4oICdjb2x1bW4nLCBzZWxlY3RvciwgcnVuLCBzZXR0aW5ncywgb3B0cyApOwoJfTsKCQoJCgl2YXIgX19zZXRDb2x1bW5WaXMgPSBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4sIHZpcyApIHsKCQl2YXIKCQkJY29scyA9IHNldHRpbmdzLmFvQ29sdW1ucywKCQkJY29sICA9IGNvbHNbIGNvbHVtbiBdLAoJCQlkYXRhID0gc2V0dGluZ3MuYW9EYXRhLAoJCQlyb3csIGNlbGxzLCBpLCBpZW4sIHRyOwoJCgkJLy8gR2V0CgkJaWYgKCB2aXMgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIGNvbC5iVmlzaWJsZTsKCQl9CgkKCQkvLyBTZXQKCQkvLyBObyBjaGFuZ2UKCQlpZiAoIGNvbC5iVmlzaWJsZSA9PT0gdmlzICkgewoJCQlyZXR1cm47CgkJfQoJCgkJaWYgKCB2aXMgKSB7CgkJCS8vIEluc2VydCBjb2x1bW4KCQkJLy8gTmVlZCB0byBkZWNpZGUgaWYgd2Ugc2hvdWxkIHVzZSBhcHBlbmRDaGlsZCBvciBpbnNlcnRCZWZvcmUKCQkJdmFyIGluc2VydEJlZm9yZSA9ICQuaW5BcnJheSggdHJ1ZSwgX3BsdWNrKGNvbHMsICdiVmlzaWJsZScpLCBjb2x1bW4rMSApOwoJCgkJCWZvciAoIGk9MCwgaWVuPWRhdGEubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQl0ciA9IGRhdGFbaV0ublRyOwoJCQkJY2VsbHMgPSBkYXRhW2ldLmFuQ2VsbHM7CgkKCQkJCWlmICggdHIgKSB7CgkJCQkJLy8gaW5zZXJ0QmVmb3JlIGNhbiBhY3QgbGlrZSBhcHBlbmRDaGlsZCBpZiAybmQgYXJnIGlzIG51bGwKCQkJCQl0ci5pbnNlcnRCZWZvcmUoIGNlbGxzWyBjb2x1bW4gXSwgY2VsbHNbIGluc2VydEJlZm9yZSBdIHx8IG51bGwgKTsKCQkJCX0KCQkJfQoJCX0KCQllbHNlIHsKCQkJLy8gUmVtb3ZlIGNvbHVtbgoJCQkkKCBfcGx1Y2soIHNldHRpbmdzLmFvRGF0YSwgJ2FuQ2VsbHMnLCBjb2x1bW4gKSApLmRldGFjaCgpOwoJCX0KCQoJCS8vIENvbW1vbiBhY3Rpb25zCgkJY29sLmJWaXNpYmxlID0gdmlzOwoJCV9mbkRyYXdIZWFkKCBzZXR0aW5ncywgc2V0dGluZ3MuYW9IZWFkZXIgKTsKCQlfZm5EcmF3SGVhZCggc2V0dGluZ3MsIHNldHRpbmdzLmFvRm9vdGVyICk7CgkKCQkvLyBVcGRhdGUgY29sc3BhbiBmb3Igbm8gcmVjb3JkcyBkaXNwbGF5LiBDaGlsZCByb3dzIGFuZCBleHRlbnNpb25zIHdpbGwgdXNlIHRoZWlyIG93bgoJCS8vIGxpc3RlbmVycyB0byBkbyB0aGlzIC0gb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgZW1wdHkgdGFibGUgaXRlbSBoZXJlCgkJaWYgKCAhIHNldHRpbmdzLmFpRGlzcGxheS5sZW5ndGggKSB7CgkJCSQoc2V0dGluZ3MublRCb2R5KS5maW5kKCd0ZFtjb2xzcGFuXScpLmF0dHIoJ2NvbHNwYW4nLCBfZm5WaXNibGVDb2x1bW5zKHNldHRpbmdzKSk7CgkJfQoJCgkJX2ZuU2F2ZVN0YXRlKCBzZXR0aW5ncyApOwoJfTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnY29sdW1ucygpJywgZnVuY3Rpb24gKCBzZWxlY3Rvciwgb3B0cyApIHsKCQkvLyBhcmd1bWVudCBzaGlmdGluZwoJCWlmICggc2VsZWN0b3IgPT09IHVuZGVmaW5lZCApIHsKCQkJc2VsZWN0b3IgPSAnJzsKCQl9CgkJZWxzZSBpZiAoICQuaXNQbGFpbk9iamVjdCggc2VsZWN0b3IgKSApIHsKCQkJb3B0cyA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9ICcnOwoJCX0KCQoJCW9wdHMgPSBfc2VsZWN0b3Jfb3B0cyggb3B0cyApOwoJCgkJdmFyIGluc3QgPSB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlyZXR1cm4gX19jb2x1bW5fc2VsZWN0b3IoIHNldHRpbmdzLCBzZWxlY3Rvciwgb3B0cyApOwoJCX0sIDEgKTsKCQoJCS8vIFdhbnQgYXJndW1lbnQgc2hpZnRpbmcgaGVyZSBhbmQgaW4gX3Jvd19zZWxlY3Rvcj8KCQlpbnN0LnNlbGVjdG9yLmNvbHMgPSBzZWxlY3RvcjsKCQlpbnN0LnNlbGVjdG9yLm9wdHMgPSBvcHRzOwoJCgkJcmV0dXJuIGluc3Q7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdjb2x1bW5zKCkuaGVhZGVyKCknLCAnY29sdW1uKCkuaGVhZGVyKCknLCBmdW5jdGlvbiAoIHNlbGVjdG9yLCBvcHRzICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY29sdW1uJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgY29sdW1uICkgewoJCQlyZXR1cm4gc2V0dGluZ3MuYW9Db2x1bW5zW2NvbHVtbl0ublRoOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ2NvbHVtbnMoKS5mb290ZXIoKScsICdjb2x1bW4oKS5mb290ZXIoKScsIGZ1bmN0aW9uICggc2VsZWN0b3IsIG9wdHMgKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4nLCBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4gKSB7CgkJCXJldHVybiBzZXR0aW5ncy5hb0NvbHVtbnNbY29sdW1uXS5uVGY7CgkJfSwgMSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY29sdW1ucygpLmRhdGEoKScsICdjb2x1bW4oKS5kYXRhKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4tcm93cycsIF9fY29sdW1uRGF0YSwgMSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY29sdW1ucygpLmRhdGFTcmMoKScsICdjb2x1bW4oKS5kYXRhU3JjKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4nLCBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4gKSB7CgkJCXJldHVybiBzZXR0aW5ncy5hb0NvbHVtbnNbY29sdW1uXS5tRGF0YTsKCQl9LCAxICk7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdjb2x1bW5zKCkuY2FjaGUoKScsICdjb2x1bW4oKS5jYWNoZSgpJywgZnVuY3Rpb24gKCB0eXBlICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY29sdW1uLXJvd3MnLCBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4sIGksIGosIHJvd3MgKSB7CgkJCXJldHVybiBfcGx1Y2tfb3JkZXIoIHNldHRpbmdzLmFvRGF0YSwgcm93cywKCQkJCXR5cGUgPT09ICdzZWFyY2gnID8gJ19hRmlsdGVyRGF0YScgOiAnX2FTb3J0RGF0YScsIGNvbHVtbgoJCQkpOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ2NvbHVtbnMoKS5ub2RlcygpJywgJ2NvbHVtbigpLm5vZGVzKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4tcm93cycsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGNvbHVtbiwgaSwgaiwgcm93cyApIHsKCQkJcmV0dXJuIF9wbHVja19vcmRlciggc2V0dGluZ3MuYW9EYXRhLCByb3dzLCAnYW5DZWxscycsIGNvbHVtbiApIDsKCQl9LCAxICk7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdjb2x1bW5zKCkudmlzaWJsZSgpJywgJ2NvbHVtbigpLnZpc2libGUoKScsIGZ1bmN0aW9uICggdmlzLCBjYWxjICkgewoJCXZhciByZXQgPSB0aGlzLml0ZXJhdG9yKCAnY29sdW1uJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgY29sdW1uICkgewoJCQlpZiAoIHZpcyA9PT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIHNldHRpbmdzLmFvQ29sdW1uc1sgY29sdW1uIF0uYlZpc2libGU7CgkJCX0gLy8gZWxzZQoJCQlfX3NldENvbHVtblZpcyggc2V0dGluZ3MsIGNvbHVtbiwgdmlzICk7CgkJfSApOwoJCgkJLy8gR3JvdXAgdGhlIGNvbHVtbiB2aXNpYmlsaXR5IGNoYW5nZXMKCQlpZiAoIHZpcyAhPT0gdW5kZWZpbmVkICkgewoJCQkvLyBTZWNvbmQgbG9vcCBvbmNlIHRoZSBmaXJzdCBpcyBkb25lIGZvciBldmVudHMKCQkJdGhpcy5pdGVyYXRvciggJ2NvbHVtbicsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGNvbHVtbiApIHsKCQkJCV9mbkNhbGxiYWNrRmlyZSggc2V0dGluZ3MsIG51bGwsICdjb2x1bW4tdmlzaWJpbGl0eScsIFtzZXR0aW5ncywgY29sdW1uLCB2aXMsIGNhbGNdICk7CgkJCX0gKTsKCQoJCQlpZiAoIGNhbGMgPT09IHVuZGVmaW5lZCB8fCBjYWxjICkgewoJCQkJdGhpcy5jb2x1bW5zLmFkanVzdCgpOwoJCQl9CgkJfQoJCgkJcmV0dXJuIHJldDsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ2NvbHVtbnMoKS5pbmRleGVzKCknLCAnY29sdW1uKCkuaW5kZXgoKScsIGZ1bmN0aW9uICggdHlwZSApIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ2NvbHVtbicsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGNvbHVtbiApIHsKCQkJcmV0dXJuIHR5cGUgPT09ICd2aXNpYmxlJyA/CgkJCQlfZm5Db2x1bW5JbmRleFRvVmlzaWJsZSggc2V0dGluZ3MsIGNvbHVtbiApIDoKCQkJCWNvbHVtbjsKCQl9LCAxICk7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXIoICdjb2x1bW5zLmFkanVzdCgpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlfZm5BZGp1c3RDb2x1bW5TaXppbmcoIHNldHRpbmdzICk7CgkJfSwgMSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyKCAnY29sdW1uLmluZGV4KCknLCBmdW5jdGlvbiAoIHR5cGUsIGlkeCApIHsKCQlpZiAoIHRoaXMuY29udGV4dC5sZW5ndGggIT09IDAgKSB7CgkJCXZhciBjdHggPSB0aGlzLmNvbnRleHRbMF07CgkKCQkJaWYgKCB0eXBlID09PSAnZnJvbVZpc2libGUnIHx8IHR5cGUgPT09ICd0b0RhdGEnICkgewoJCQkJcmV0dXJuIF9mblZpc2libGVUb0NvbHVtbkluZGV4KCBjdHgsIGlkeCApOwoJCQl9CgkJCWVsc2UgaWYgKCB0eXBlID09PSAnZnJvbURhdGEnIHx8IHR5cGUgPT09ICd0b1Zpc2libGUnICkgewoJCQkJcmV0dXJuIF9mbkNvbHVtbkluZGV4VG9WaXNpYmxlKCBjdHgsIGlkeCApOwoJCQl9CgkJfQoJfSApOwoJCglfYXBpX3JlZ2lzdGVyKCAnY29sdW1uKCknLCBmdW5jdGlvbiAoIHNlbGVjdG9yLCBvcHRzICkgewoJCXJldHVybiBfc2VsZWN0b3JfZmlyc3QoIHRoaXMuY29sdW1ucyggc2VsZWN0b3IsIG9wdHMgKSApOwoJfSApOwoJCgkKCQoJdmFyIF9fY2VsbF9zZWxlY3RvciA9IGZ1bmN0aW9uICggc2V0dGluZ3MsIHNlbGVjdG9yLCBvcHRzICkKCXsKCQl2YXIgZGF0YSA9IHNldHRpbmdzLmFvRGF0YTsKCQl2YXIgcm93cyA9IF9zZWxlY3Rvcl9yb3dfaW5kZXhlcyggc2V0dGluZ3MsIG9wdHMgKTsKCQl2YXIgY2VsbHMgPSBfcmVtb3ZlRW1wdHkoIF9wbHVja19vcmRlciggZGF0YSwgcm93cywgJ2FuQ2VsbHMnICkgKTsKCQl2YXIgYWxsQ2VsbHMgPSAkKCBbXS5jb25jYXQuYXBwbHkoW10sIGNlbGxzKSApOwoJCXZhciByb3c7CgkJdmFyIGNvbHVtbnMgPSBzZXR0aW5ncy5hb0NvbHVtbnMubGVuZ3RoOwoJCXZhciBhLCBpLCBpZW4sIGosIG8sIGhvc3Q7CgkKCQl2YXIgcnVuID0gZnVuY3Rpb24gKCBzICkgewoJCQl2YXIgZm5TZWxlY3RvciA9IHR5cGVvZiBzID09PSAnZnVuY3Rpb24nOwoJCgkJCWlmICggcyA9PT0gbnVsbCB8fCBzID09PSB1bmRlZmluZWQgfHwgZm5TZWxlY3RvciApIHsKCQkJCS8vIEFsbCBjZWxscyBhbmQgZnVuY3Rpb24gc2VsZWN0b3JzCgkJCQlhID0gW107CgkKCQkJCWZvciAoIGk9MCwgaWVuPXJvd3MubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQkJcm93ID0gcm93c1tpXTsKCQoJCQkJCWZvciAoIGo9MCA7IGo8Y29sdW1ucyA7IGorKyApIHsKCQkJCQkJbyA9IHsKCQkJCQkJCXJvdzogcm93LAoJCQkJCQkJY29sdW1uOiBqCgkJCQkJCX07CgkKCQkJCQkJaWYgKCBmblNlbGVjdG9yICkgewoJCQkJCQkJLy8gU2VsZWN0b3IgLSBmdW5jdGlvbgoJCQkJCQkJaG9zdCA9IGRhdGFbIHJvdyBdOwoJCgkJCQkJCQlpZiAoIHMoIG8sIF9mbkdldENlbGxEYXRhKHNldHRpbmdzLCByb3csIGopLCBob3N0LmFuQ2VsbHMgPyBob3N0LmFuQ2VsbHNbal0gOiBudWxsICkgKSB7CgkJCQkJCQkJYS5wdXNoKCBvICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZSB7CgkJCQkJCQkvLyBTZWxlY3RvciAtIGFsbAoJCQkJCQkJYS5wdXNoKCBvICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkKCQkJCXJldHVybiBhOwoJCQl9CgkJCQoJCQkvLyBTZWxlY3RvciAtIGluZGV4CgkJCWlmICggJC5pc1BsYWluT2JqZWN0KCBzICkgKSB7CgkJCQkvLyBWYWxpZCBjZWxsIGluZGV4IGFuZCBpdHMgaW4gdGhlIGFycmF5IG9mIHNlbGVjdGFibGUgcm93cwoJCQkJcmV0dXJuIHMuY29sdW1uICE9PSB1bmRlZmluZWQgJiYgcy5yb3cgIT09IHVuZGVmaW5lZCAmJiAkLmluQXJyYXkoIHMucm93LCByb3dzICkgIT09IC0xID8KCQkJCQlbc10gOgoJCQkJCVtdOwoJCQl9CgkKCQkJLy8gU2VsZWN0b3IgLSBqUXVlcnkgZmlsdGVyZWQgY2VsbHMKCQkJdmFyIGpxUmVzdWx0ID0gYWxsQ2VsbHMKCQkJCS5maWx0ZXIoIHMgKQoJCQkJLm1hcCggZnVuY3Rpb24gKGksIGVsKSB7CgkJCQkJcmV0dXJuIHsgLy8gdXNlIGEgbmV3IG9iamVjdCwgaW4gY2FzZSBzb21lb25lIGNoYW5nZXMgdGhlIHZhbHVlcwoJCQkJCQlyb3c6ICAgIGVsLl9EVF9DZWxsSW5kZXgucm93LAoJCQkJCQljb2x1bW46IGVsLl9EVF9DZWxsSW5kZXguY29sdW1uCgkgCQkJCX07CgkJCQl9ICkKCQkJCS50b0FycmF5KCk7CgkKCQkJaWYgKCBqcVJlc3VsdC5sZW5ndGggfHwgISBzLm5vZGVOYW1lICkgewoJCQkJcmV0dXJuIGpxUmVzdWx0OwoJCQl9CgkKCQkJLy8gT3RoZXJ3aXNlIHRoZSBzZWxlY3RvciBpcyBhIG5vZGUsIGFuZCB0aGVyZSBpcyBvbmUgbGFzdCBvcHRpb24gLSB0aGUKCQkJLy8gZWxlbWVudCBtaWdodCBiZSBhIGNoaWxkIG9mIGFuIGVsZW1lbnQgd2hpY2ggaGFzIGR0LXJvdyBhbmQgZHQtY29sdW1uCgkJCS8vIGRhdGEgYXR0cmlidXRlcwoJCQlob3N0ID0gJChzKS5jbG9zZXN0KCcqW2RhdGEtZHQtcm93XScpOwoJCQlyZXR1cm4gaG9zdC5sZW5ndGggPwoJCQkJWyB7CgkJCQkJcm93OiBob3N0LmRhdGEoJ2R0LXJvdycpLAoJCQkJCWNvbHVtbjogaG9zdC5kYXRhKCdkdC1jb2x1bW4nKQoJCQkJfSBdIDoKCQkJCVtdOwoJCX07CgkKCQlyZXR1cm4gX3NlbGVjdG9yX3J1biggJ2NlbGwnLCBzZWxlY3RvciwgcnVuLCBzZXR0aW5ncywgb3B0cyApOwoJfTsKCQoJCgkKCQoJX2FwaV9yZWdpc3RlciggJ2NlbGxzKCknLCBmdW5jdGlvbiAoIHJvd1NlbGVjdG9yLCBjb2x1bW5TZWxlY3Rvciwgb3B0cyApIHsKCQkvLyBBcmd1bWVudCBzaGlmdGluZwoJCWlmICggJC5pc1BsYWluT2JqZWN0KCByb3dTZWxlY3RvciApICkgewoJCQkvLyBJbmRleGVzCgkJCWlmICggcm93U2VsZWN0b3Iucm93ID09PSB1bmRlZmluZWQgKSB7CgkJCQkvLyBTZWxlY3RvciBvcHRpb25zIGluIGZpcnN0IHBhcmFtZXRlcgoJCQkJb3B0cyA9IHJvd1NlbGVjdG9yOwoJCQkJcm93U2VsZWN0b3IgPSBudWxsOwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gQ2VsbCBpbmRleCBvYmplY3RzIGluIGZpcnN0IHBhcmFtZXRlcgoJCQkJb3B0cyA9IGNvbHVtblNlbGVjdG9yOwoJCQkJY29sdW1uU2VsZWN0b3IgPSBudWxsOwoJCQl9CgkJfQoJCWlmICggJC5pc1BsYWluT2JqZWN0KCBjb2x1bW5TZWxlY3RvciApICkgewoJCQlvcHRzID0gY29sdW1uU2VsZWN0b3I7CgkJCWNvbHVtblNlbGVjdG9yID0gbnVsbDsKCQl9CgkKCQkvLyBDZWxsIHNlbGVjdG9yCgkJaWYgKCBjb2x1bW5TZWxlY3RvciA9PT0gbnVsbCB8fCBjb2x1bW5TZWxlY3RvciA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJCXJldHVybiBfX2NlbGxfc2VsZWN0b3IoIHNldHRpbmdzLCByb3dTZWxlY3RvciwgX3NlbGVjdG9yX29wdHMoIG9wdHMgKSApOwoJCQl9ICk7CgkJfQoJCgkJLy8gUm93ICsgY29sdW1uIHNlbGVjdG9yCgkJdmFyIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMoIGNvbHVtblNlbGVjdG9yICk7CgkJdmFyIHJvd3MgPSB0aGlzLnJvd3MoIHJvd1NlbGVjdG9yICk7CgkJdmFyIGEsIGksIGllbiwgaiwgamVuOwoJCgkJdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgaWR4ICkgewoJCQlhID0gW107CgkKCQkJZm9yICggaT0wLCBpZW49cm93c1tpZHhdLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJZm9yICggaj0wLCBqZW49Y29sdW1uc1tpZHhdLmxlbmd0aCA7IGo8amVuIDsgaisrICkgewoJCQkJCWEucHVzaCggewoJCQkJCQlyb3c6ICAgIHJvd3NbaWR4XVtpXSwKCQkJCQkJY29sdW1uOiBjb2x1bW5zW2lkeF1bal0KCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQl9LCAxICk7CgkKCSAgICAvLyBOb3cgcGFzcyB0aHJvdWdoIHRoZSBjZWxsIHNlbGVjdG9yIGZvciBvcHRpb25zCgkgICAgdmFyIGNlbGxzID0gdGhpcy5jZWxscyggYSwgb3B0cyApOwoJCgkJJC5leHRlbmQoIGNlbGxzLnNlbGVjdG9yLCB7CgkJCWNvbHM6IGNvbHVtblNlbGVjdG9yLAoJCQlyb3dzOiByb3dTZWxlY3RvciwKCQkJb3B0czogb3B0cwoJCX0gKTsKCQoJCXJldHVybiBjZWxsczsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY2VsbHMoKS5ub2RlcygpJywgJ2NlbGwoKS5ub2RlKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjZWxsJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93LCBjb2x1bW4gKSB7CgkJCXZhciBkYXRhID0gc2V0dGluZ3MuYW9EYXRhWyByb3cgXTsKCQoJCQlyZXR1cm4gZGF0YSAmJiBkYXRhLmFuQ2VsbHMgPwoJCQkJZGF0YS5hbkNlbGxzWyBjb2x1bW4gXSA6CgkJCQl1bmRlZmluZWQ7CgkJfSwgMSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXIoICdjZWxscygpLmRhdGEoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ2NlbGwnLCBmdW5jdGlvbiAoIHNldHRpbmdzLCByb3csIGNvbHVtbiApIHsKCQkJcmV0dXJuIF9mbkdldENlbGxEYXRhKCBzZXR0aW5ncywgcm93LCBjb2x1bW4gKTsKCQl9LCAxICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ2NlbGxzKCkuY2FjaGUoKScsICdjZWxsKCkuY2FjaGUoKScsIGZ1bmN0aW9uICggdHlwZSApIHsKCQl0eXBlID0gdHlwZSA9PT0gJ3NlYXJjaCcgPyAnX2FGaWx0ZXJEYXRhJyA6ICdfYVNvcnREYXRhJzsKCQoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY2VsbCcsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdywgY29sdW1uICkgewoJCQlyZXR1cm4gc2V0dGluZ3MuYW9EYXRhWyByb3cgXVsgdHlwZSBdWyBjb2x1bW4gXTsKCQl9LCAxICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ2NlbGxzKCkucmVuZGVyKCknLCAnY2VsbCgpLnJlbmRlcigpJywgZnVuY3Rpb24gKCB0eXBlICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY2VsbCcsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdywgY29sdW1uICkgewoJCQlyZXR1cm4gX2ZuR2V0Q2VsbERhdGEoIHNldHRpbmdzLCByb3csIGNvbHVtbiwgdHlwZSApOwoJCX0sIDEgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY2VsbHMoKS5pbmRleGVzKCknLCAnY2VsbCgpLmluZGV4KCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjZWxsJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93LCBjb2x1bW4gKSB7CgkJCXJldHVybiB7CgkJCQlyb3c6IHJvdywKCQkJCWNvbHVtbjogY29sdW1uLAoJCQkJY29sdW1uVmlzaWJsZTogX2ZuQ29sdW1uSW5kZXhUb1Zpc2libGUoIHNldHRpbmdzLCBjb2x1bW4gKQoJCQl9OwoJCX0sIDEgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY2VsbHMoKS5pbnZhbGlkYXRlKCknLCAnY2VsbCgpLmludmFsaWRhdGUoKScsIGZ1bmN0aW9uICggc3JjICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY2VsbCcsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdywgY29sdW1uICkgewoJCQlfZm5JbnZhbGlkYXRlKCBzZXR0aW5ncywgcm93LCBzcmMsIGNvbHVtbiApOwoJCX0gKTsKCX0gKTsKCQoJCgkKCV9hcGlfcmVnaXN0ZXIoICdjZWxsKCknLCBmdW5jdGlvbiAoIHJvd1NlbGVjdG9yLCBjb2x1bW5TZWxlY3Rvciwgb3B0cyApIHsKCQlyZXR1cm4gX3NlbGVjdG9yX2ZpcnN0KCB0aGlzLmNlbGxzKCByb3dTZWxlY3RvciwgY29sdW1uU2VsZWN0b3IsIG9wdHMgKSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXIoICdjZWxsKCkuZGF0YSgpJywgZnVuY3Rpb24gKCBkYXRhICkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkJdmFyIGNlbGwgPSB0aGlzWzBdOwoJCgkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7CgkJCS8vIEdldAoJCQlyZXR1cm4gY3R4Lmxlbmd0aCAmJiBjZWxsLmxlbmd0aCA/CgkJCQlfZm5HZXRDZWxsRGF0YSggY3R4WzBdLCBjZWxsWzBdLnJvdywgY2VsbFswXS5jb2x1bW4gKSA6CgkJCQl1bmRlZmluZWQ7CgkJfQoJCgkJLy8gU2V0CgkJX2ZuU2V0Q2VsbERhdGEoIGN0eFswXSwgY2VsbFswXS5yb3csIGNlbGxbMF0uY29sdW1uLCBkYXRhICk7CgkJX2ZuSW52YWxpZGF0ZSggY3R4WzBdLCBjZWxsWzBdLnJvdywgJ2RhdGEnLCBjZWxsWzBdLmNvbHVtbiApOwoJCgkJcmV0dXJuIHRoaXM7Cgl9ICk7CgkKCQoJCgkvKioKCSAqIEdldCBjdXJyZW50IG9yZGVyaW5nIChzb3J0aW5nKSB0aGF0IGhhcyBiZWVuIGFwcGxpZWQgdG8gdGhlIHRhYmxlLgoJICoKCSAqIEByZXR1cm5zIHthcnJheX0gMkQgYXJyYXkgY29udGFpbmluZyB0aGUgc29ydGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpcnN0CgkgKiAgIHRhYmxlIGluIHRoZSBjdXJyZW50IGNvbnRleHQuIEVhY2ggZWxlbWVudCBpbiB0aGUgcGFyZW50IGFycmF5IHJlcHJlc2VudHMKCSAqICAgYSBjb2x1bW4gYmVpbmcgc29ydGVkIHVwb24gKGkuZS4gbXVsdGktc29ydGluZyB3aXRoIHR3byBjb2x1bW5zIHdvdWxkIGhhdmUKCSAqICAgMiBpbm5lciBhcnJheXMpLiBUaGUgaW5uZXIgYXJyYXlzIG1heSBoYXZlIDIgb3IgMyBlbGVtZW50cy4gVGhlIGZpcnN0IGlzCgkgKiAgIHRoZSBjb2x1bW4gaW5kZXggdGhhdCB0aGUgc29ydGluZyBjb25kaXRpb24gYXBwbGllcyB0bywgdGhlIHNlY29uZCBpcyB0aGUKCSAqICAgZGlyZWN0aW9uIG9mIHRoZSBzb3J0IChgZGVzY2Agb3IgYGFzY2ApIGFuZCwgb3B0aW9uYWxseSwgdGhlIHRoaXJkIGlzIHRoZQoJICogICBpbmRleCBvZiB0aGUgc29ydGluZyBvcmRlciBmcm9tIHRoZSBgY29sdW1uLnNvcnRpbmdgIGluaXRpYWxpc2F0aW9uIGFycmF5LgoJICovLyoqCgkgKiBTZXQgdGhlIG9yZGVyaW5nIGZvciB0aGUgdGFibGUuCgkgKgoJICogQHBhcmFtIHtpbnRlZ2VyfSBvcmRlciBDb2x1bW4gaW5kZXggdG8gc29ydCB1cG9uLgoJICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdGlvbiBEaXJlY3Rpb24gb2YgdGhlIHNvcnQgdG8gYmUgYXBwbGllZCAoYGFzY2Agb3IgYGRlc2NgKQoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8vKioKCSAqIFNldCB0aGUgb3JkZXJpbmcgZm9yIHRoZSB0YWJsZS4KCSAqCgkgKiBAcGFyYW0ge2FycmF5fSBvcmRlciAxRCBhcnJheSBvZiBzb3J0aW5nIGluZm9ybWF0aW9uIHRvIGJlIGFwcGxpZWQuCgkgKiBAcGFyYW0ge2FycmF5fSBbLi4uXSBPcHRpb25hbCBhZGRpdGlvbmFsIHNvcnRpbmcgY29uZGl0aW9ucwoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8vKioKCSAqIFNldCB0aGUgb3JkZXJpbmcgZm9yIHRoZSB0YWJsZS4KCSAqCgkgKiBAcGFyYW0ge2FycmF5fSBvcmRlciAyRCBhcnJheSBvZiBzb3J0aW5nIGluZm9ybWF0aW9uIHRvIGJlIGFwcGxpZWQuCgkgKiBAcmV0dXJucyB7RGF0YVRhYmxlcy5BcGl9IHRoaXMKCSAqLwoJX2FwaV9yZWdpc3RlciggJ29yZGVyKCknLCBmdW5jdGlvbiAoIG9yZGVyLCBkaXIgKSB7CgkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQoJCWlmICggb3JkZXIgPT09IHVuZGVmaW5lZCApIHsKCQkJLy8gZ2V0CgkJCXJldHVybiBjdHgubGVuZ3RoICE9PSAwID8KCQkJCWN0eFswXS5hYVNvcnRpbmcgOgoJCQkJdW5kZWZpbmVkOwoJCX0KCQoJCS8vIHNldAoJCWlmICggdHlwZW9mIG9yZGVyID09PSAnbnVtYmVyJyApIHsKCQkJLy8gU2ltcGxlIGNvbHVtbiAvIGRpcmVjdGlvbiBwYXNzZWQgaW4KCQkJb3JkZXIgPSBbIFsgb3JkZXIsIGRpciBdIF07CgkJfQoJCWVsc2UgaWYgKCBvcmRlci5sZW5ndGggJiYgISAkLmlzQXJyYXkoIG9yZGVyWzBdICkgKSB7CgkJCS8vIEFyZ3VtZW50cyBwYXNzZWQgaW4gKGxpc3Qgb2YgMUQgYXJyYXlzKQoJCQlvcmRlciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKTsKCQl9CgkJLy8gb3RoZXJ3aXNlIGEgMkQgYXJyYXkgd2FzIHBhc3NlZCBpbgoJCgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MgKSB7CgkJCXNldHRpbmdzLmFhU29ydGluZyA9IG9yZGVyLnNsaWNlKCk7CgkJfSApOwoJfSApOwoJCgkKCS8qKgoJICogQXR0YWNoIGEgc29ydCBsaXN0ZW5lciB0byBhbiBlbGVtZW50IGZvciBhIGdpdmVuIGNvbHVtbgoJICoKCSAqIEBwYXJhbSB7bm9kZXxqUXVlcnl8c3RyaW5nfSBub2RlIElkZW50aWZpZXIgZm9yIHRoZSBlbGVtZW50KHMpIHRvIGF0dGFjaCB0aGUKCSAqICAgbGlzdGVuZXIgdG8uIFRoaXMgY2FuIHRha2UgdGhlIGZvcm0gb2YgYSBzaW5nbGUgRE9NIG5vZGUsIGEgalF1ZXJ5CgkgKiAgIGNvbGxlY3Rpb24gb2Ygbm9kZXMgb3IgYSBqUXVlcnkgc2VsZWN0b3Igd2hpY2ggd2lsbCBpZGVudGlmeSB0aGUgbm9kZShzKS4KCSAqIEBwYXJhbSB7aW50ZWdlcn0gY29sdW1uIHRoZSBjb2x1bW4gdGhhdCBhIGNsaWNrIG9uIHRoaXMgbm9kZSB3aWxsIHNvcnQgb24KCSAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiBzb3J0IGlzIHJ1bgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdvcmRlci5saXN0ZW5lcigpJywgZnVuY3Rpb24gKCBub2RlLCBjb2x1bW4sIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlfZm5Tb3J0QXR0YWNoTGlzdGVuZXIoIHNldHRpbmdzLCBub2RlLCBjb2x1bW4sIGNhbGxiYWNrICk7CgkJfSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXIoICdvcmRlci5maXhlZCgpJywgZnVuY3Rpb24gKCBzZXQgKSB7CgkJaWYgKCAhIHNldCApIHsKCQkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQkJdmFyIGZpeGVkID0gY3R4Lmxlbmd0aCA/CgkJCQljdHhbMF0uYWFTb3J0aW5nRml4ZWQgOgoJCQkJdW5kZWZpbmVkOwoJCgkJCXJldHVybiAkLmlzQXJyYXkoIGZpeGVkICkgPwoJCQkJeyBwcmU6IGZpeGVkIH0gOgoJCQkJZml4ZWQ7CgkJfQoJCgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MgKSB7CgkJCXNldHRpbmdzLmFhU29ydGluZ0ZpeGVkID0gJC5leHRlbmQoIHRydWUsIHt9LCBzZXQgKTsKCQl9ICk7Cgl9ICk7CgkKCQoJLy8gT3JkZXIgYnkgdGhlIHNlbGVjdGVkIGNvbHVtbihzKQoJX2FwaV9yZWdpc3RlciggWwoJCSdjb2x1bW5zKCkub3JkZXIoKScsCgkJJ2NvbHVtbigpLm9yZGVyKCknCgldLCBmdW5jdGlvbiAoIGRpciApIHsKCQl2YXIgdGhhdCA9IHRoaXM7CgkKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgaSApIHsKCQkJdmFyIHNvcnQgPSBbXTsKCQoJCQkkLmVhY2goIHRoYXRbaV0sIGZ1bmN0aW9uIChqLCBjb2wpIHsKCQkJCXNvcnQucHVzaCggWyBjb2wsIGRpciBdICk7CgkJCX0gKTsKCQoJCQlzZXR0aW5ncy5hYVNvcnRpbmcgPSBzb3J0OwoJCX0gKTsKCX0gKTsKCQoJCgkKCV9hcGlfcmVnaXN0ZXIoICdzZWFyY2goKScsIGZ1bmN0aW9uICggaW5wdXQsIHJlZ2V4LCBzbWFydCwgY2FzZUluc2VuICkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlpZiAoIGlucHV0ID09PSB1bmRlZmluZWQgKSB7CgkJCS8vIGdldAoJCQlyZXR1cm4gY3R4Lmxlbmd0aCAhPT0gMCA/CgkJCQljdHhbMF0ub1ByZXZpb3VzU2VhcmNoLnNTZWFyY2ggOgoJCQkJdW5kZWZpbmVkOwoJCX0KCQoJCS8vIHNldAoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlpZiAoICEgc2V0dGluZ3Mub0ZlYXR1cmVzLmJGaWx0ZXIgKSB7CgkJCQlyZXR1cm47CgkJCX0KCQoJCQlfZm5GaWx0ZXJDb21wbGV0ZSggc2V0dGluZ3MsICQuZXh0ZW5kKCB7fSwgc2V0dGluZ3Mub1ByZXZpb3VzU2VhcmNoLCB7CgkJCQkic1NlYXJjaCI6IGlucHV0KyIiLAoJCQkJImJSZWdleCI6ICByZWdleCA9PT0gbnVsbCA/IGZhbHNlIDogcmVnZXgsCgkJCQkiYlNtYXJ0IjogIHNtYXJ0ID09PSBudWxsID8gdHJ1ZSAgOiBzbWFydCwKCQkJCSJiQ2FzZUluc2Vuc2l0aXZlIjogY2FzZUluc2VuID09PSBudWxsID8gdHJ1ZSA6IGNhc2VJbnNlbgoJCQl9ICksIDEgKTsKCQl9ICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCgKCQknY29sdW1ucygpLnNlYXJjaCgpJywKCQknY29sdW1uKCkuc2VhcmNoKCknLAoJCWZ1bmN0aW9uICggaW5wdXQsIHJlZ2V4LCBzbWFydCwgY2FzZUluc2VuICkgewoJCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ2NvbHVtbicsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGNvbHVtbiApIHsKCQkJCXZhciBwcmVTZWFyY2ggPSBzZXR0aW5ncy5hb1ByZVNlYXJjaENvbHM7CgkKCQkJCWlmICggaW5wdXQgPT09IHVuZGVmaW5lZCApIHsKCQkJCQkvLyBnZXQKCQkJCQlyZXR1cm4gcHJlU2VhcmNoWyBjb2x1bW4gXS5zU2VhcmNoOwoJCQkJfQoJCgkJCQkvLyBzZXQKCQkJCWlmICggISBzZXR0aW5ncy5vRmVhdHVyZXMuYkZpbHRlciApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkKCQkJCSQuZXh0ZW5kKCBwcmVTZWFyY2hbIGNvbHVtbiBdLCB7CgkJCQkJInNTZWFyY2giOiBpbnB1dCsiIiwKCQkJCQkiYlJlZ2V4IjogIHJlZ2V4ID09PSBudWxsID8gZmFsc2UgOiByZWdleCwKCQkJCQkiYlNtYXJ0IjogIHNtYXJ0ID09PSBudWxsID8gdHJ1ZSAgOiBzbWFydCwKCQkJCQkiYkNhc2VJbnNlbnNpdGl2ZSI6IGNhc2VJbnNlbiA9PT0gbnVsbCA/IHRydWUgOiBjYXNlSW5zZW4KCQkJCX0gKTsKCQoJCQkJX2ZuRmlsdGVyQ29tcGxldGUoIHNldHRpbmdzLCBzZXR0aW5ncy5vUHJldmlvdXNTZWFyY2gsIDEgKTsKCQkJfSApOwoJCX0KCSk7CgkKCS8qCgkgKiBTdGF0ZSBBUEkgbWV0aG9kcwoJICovCgkKCV9hcGlfcmVnaXN0ZXIoICdzdGF0ZSgpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLmNvbnRleHQubGVuZ3RoID8KCQkJdGhpcy5jb250ZXh0WzBdLm9TYXZlZFN0YXRlIDoKCQkJbnVsbDsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnc3RhdGUuY2xlYXIoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJLy8gU2F2ZSBhbiBlbXB0eSBvYmplY3QKCQkJc2V0dGluZ3MuZm5TdGF0ZVNhdmVDYWxsYmFjay5jYWxsKCBzZXR0aW5ncy5vSW5zdGFuY2UsIHNldHRpbmdzLCB7fSApOwoJCX0gKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnc3RhdGUubG9hZGVkKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuY29udGV4dC5sZW5ndGggPwoJCQl0aGlzLmNvbnRleHRbMF0ub0xvYWRlZFN0YXRlIDoKCQkJbnVsbDsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnc3RhdGUuc2F2ZSgpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlfZm5TYXZlU3RhdGUoIHNldHRpbmdzICk7CgkJfSApOwoJfSApOwoJCgkKCQoJLyoqCgkgKiBQcm92aWRlIGEgY29tbW9uIG1ldGhvZCBmb3IgcGx1Zy1pbnMgdG8gY2hlY2sgdGhlIHZlcnNpb24gb2YgRGF0YVRhYmxlcyBiZWluZwoJICogdXNlZCwgaW4gb3JkZXIgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkuCgkgKgoJICogIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIFZlcnNpb24gc3RyaW5nIHRvIGNoZWNrIGZvciwgaW4gdGhlIGZvcm1hdCAiWC5ZLloiLgoJICogICAgTm90ZSB0aGF0IHRoZSBmb3JtYXRzICJYIiBhbg=="
},
{
"key": "jquery.dataTables.js?4?4?2",
"type": "binary",
"value": "base64:ZCAiWC5ZIiBhcmUgYWxzbyBhY2NlcHRhYmxlLgoJICogIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoaXMgdmVyc2lvbiBvZiBEYXRhVGFibGVzIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8KCSAqICAgIHRoZSByZXF1aXJlZCB2ZXJzaW9uLCBvciBmYWxzZSBpZiB0aGlzIHZlcnNpb24gb2YgRGF0YVRhbGVzIGlzIG5vdAoJICogICAgc3VpdGFibGUKCSAqICBAc3RhdGljCgkgKiAgQGR0b3B0IEFQSS1TdGF0aWMKCSAqCgkgKiAgQGV4YW1wbGUKCSAqICAgIGFsZXJ0KCAkLmZuLmRhdGFUYWJsZS52ZXJzaW9uQ2hlY2soICcxLjkuMCcgKSApOwoJICovCglEYXRhVGFibGUudmVyc2lvbkNoZWNrID0gRGF0YVRhYmxlLmZuVmVyc2lvbkNoZWNrID0gZnVuY3Rpb24oIHZlcnNpb24gKQoJewoJCXZhciBhVGhpcyA9IERhdGFUYWJsZS52ZXJzaW9uLnNwbGl0KCcuJyk7CgkJdmFyIGFUaGF0ID0gdmVyc2lvbi5zcGxpdCgnLicpOwoJCXZhciBpVGhpcywgaVRoYXQ7CgkKCQlmb3IgKCB2YXIgaT0wLCBpTGVuPWFUaGF0Lmxlbmd0aCA7IGk8aUxlbiA7IGkrKyApIHsKCQkJaVRoaXMgPSBwYXJzZUludCggYVRoaXNbaV0sIDEwICkgfHwgMDsKCQkJaVRoYXQgPSBwYXJzZUludCggYVRoYXRbaV0sIDEwICkgfHwgMDsKCQoJCQkvLyBQYXJ0cyBhcmUgdGhlIHNhbWUsIGtlZXAgY29tcGFyaW5nCgkJCWlmIChpVGhpcyA9PT0gaVRoYXQpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkKCQkJLy8gUGFydHMgYXJlIGRpZmZlcmVudCwgcmV0dXJuIGltbWVkaWF0ZWx5CgkJCXJldHVybiBpVGhpcyA+IGlUaGF0OwoJCX0KCQoJCXJldHVybiB0cnVlOwoJfTsKCQoJCgkvKioKCSAqIENoZWNrIGlmIGEgYDx0YWJsZT5gIG5vZGUgaXMgYSBEYXRhVGFibGUgdGFibGUgYWxyZWFkeSBvciBub3QuCgkgKgoJICogIEBwYXJhbSB7bm9kZXxqcXVlcnl8c3RyaW5nfSB0YWJsZSBUYWJsZSBub2RlLCBqUXVlcnkgb2JqZWN0IG9yIGpRdWVyeQoJICogICAgICBzZWxlY3RvciBmb3IgdGhlIHRhYmxlIHRvIHRlc3QuIE5vdGUgdGhhdCBpZiBtb3JlIHRoYW4gbW9yZSB0aGFuIG9uZQoJICogICAgICB0YWJsZSBpcyBwYXNzZWQgb24sIG9ubHkgdGhlIGZpcnN0IHdpbGwgYmUgY2hlY2tlZAoJICogIEByZXR1cm5zIHtib29sZWFufSB0cnVlIHRoZSB0YWJsZSBnaXZlbiBpcyBhIERhdGFUYWJsZSwgb3IgZmFsc2Ugb3RoZXJ3aXNlCgkgKiAgQHN0YXRpYwoJICogIEBkdG9wdCBBUEktU3RhdGljCgkgKgoJICogIEBleGFtcGxlCgkgKiAgICBpZiAoICEgJC5mbi5EYXRhVGFibGUuaXNEYXRhVGFibGUoICcjZXhhbXBsZScgKSApIHsKCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKTsKCSAqICAgIH0KCSAqLwoJRGF0YVRhYmxlLmlzRGF0YVRhYmxlID0gRGF0YVRhYmxlLmZuSXNEYXRhVGFibGUgPSBmdW5jdGlvbiAoIHRhYmxlICkKCXsKCQl2YXIgdCA9ICQodGFibGUpLmdldCgwKTsKCQl2YXIgaXMgPSBmYWxzZTsKCQoJCWlmICggdGFibGUgaW5zdGFuY2VvZiBEYXRhVGFibGUuQXBpICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkKCQkkLmVhY2goIERhdGFUYWJsZS5zZXR0aW5ncywgZnVuY3Rpb24gKGksIG8pIHsKCQkJdmFyIGhlYWQgPSBvLm5TY3JvbGxIZWFkID8gJCgndGFibGUnLCBvLm5TY3JvbGxIZWFkKVswXSA6IG51bGw7CgkJCXZhciBmb290ID0gby5uU2Nyb2xsRm9vdCA/ICQoJ3RhYmxlJywgby5uU2Nyb2xsRm9vdClbMF0gOiBudWxsOwoJCgkJCWlmICggby5uVGFibGUgPT09IHQgfHwgaGVhZCA9PT0gdCB8fCBmb290ID09PSB0ICkgewoJCQkJaXMgPSB0cnVlOwoJCQl9CgkJfSApOwoJCgkJcmV0dXJuIGlzOwoJfTsKCQoJCgkvKioKCSAqIEdldCBhbGwgRGF0YVRhYmxlIHRhYmxlcyB0aGF0IGhhdmUgYmVlbiBpbml0aWFsaXNlZCAtIG9wdGlvbmFsbHkgeW91IGNhbgoJICogc2VsZWN0IHRvIGdldCBvbmx5IGN1cnJlbnRseSB2aXNpYmxlIHRhYmxlcy4KCSAqCgkgKiAgQHBhcmFtIHtib29sZWFufSBbdmlzaWJsZT1mYWxzZV0gRmxhZyB0byBpbmRpY2F0ZSBpZiB5b3Ugd2FudCBhbGwgKGRlZmF1bHQpCgkgKiAgICBvciB2aXNpYmxlIHRhYmxlcyBvbmx5LgoJICogIEByZXR1cm5zIHthcnJheX0gQXJyYXkgb2YgYHRhYmxlYCBub2RlcyAobm90IERhdGFUYWJsZSBpbnN0YW5jZXMpIHdoaWNoIGFyZQoJICogICAgRGF0YVRhYmxlcwoJICogIEBzdGF0aWMKCSAqICBAZHRvcHQgQVBJLVN0YXRpYwoJICoKCSAqICBAZXhhbXBsZQoJICogICAgJC5lYWNoKCAkLmZuLmRhdGFUYWJsZS50YWJsZXModHJ1ZSksIGZ1bmN0aW9uICgpIHsKCSAqICAgICAgJCh0YWJsZSkuRGF0YVRhYmxlKCkuY29sdW1ucy5hZGp1c3QoKTsKCSAqICAgIH0gKTsKCSAqLwoJRGF0YVRhYmxlLnRhYmxlcyA9IERhdGFUYWJsZS5mblRhYmxlcyA9IGZ1bmN0aW9uICggdmlzaWJsZSApCgl7CgkJdmFyIGFwaSA9IGZhbHNlOwoJCgkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHZpc2libGUgKSApIHsKCQkJYXBpID0gdmlzaWJsZS5hcGk7CgkJCXZpc2libGUgPSB2aXNpYmxlLnZpc2libGU7CgkJfQoJCgkJdmFyIGEgPSAkLm1hcCggRGF0YVRhYmxlLnNldHRpbmdzLCBmdW5jdGlvbiAobykgewoJCQlpZiAoICF2aXNpYmxlIHx8ICh2aXNpYmxlICYmICQoby5uVGFibGUpLmlzKCc6dmlzaWJsZScpKSApIHsKCQkJCXJldHVybiBvLm5UYWJsZTsKCQkJfQoJCX0gKTsKCQoJCXJldHVybiBhcGkgPwoJCQluZXcgX0FwaSggYSApIDoKCQkJYTsKCX07CgkKCQoJLyoqCgkgKiBDb252ZXJ0IGZyb20gY2FtZWwgY2FzZSBwYXJhbWV0ZXJzIHRvIEh1bmdhcmlhbiBub3RhdGlvbi4gVGhpcyBpcyBtYWRlIHB1YmxpYwoJICogZm9yIHRoZSBleHRlbnNpb25zIHRvIHByb3ZpZGUgdGhlIHNhbWUgYWJpbGl0eSBhcyBEYXRhVGFibGVzIGNvcmUgdG8gYWNjZXB0CgkgKiBlaXRoZXIgdGhlIDEuOSBzdHlsZSBIdW5nYXJpYW4gbm90YXRpb24sIG9yIHRoZSAxLjEwKyBzdHlsZSBjYW1lbENhc2UKCSAqIHBhcmFtZXRlcnMuCgkgKgoJICogIEBwYXJhbSB7b2JqZWN0fSBzcmMgVGhlIG1vZGVsIG9iamVjdCB3aGljaCBob2xkcyBhbGwgcGFyYW1ldGVycyB0aGF0IGNhbiBiZQoJICogICAgbWFwcGVkLgoJICogIEBwYXJhbSB7b2JqZWN0fSB1c2VyIFRoZSBvYmplY3QgdG8gY29udmVydCBmcm9tIGNhbWVsIGNhc2UgdG8gSHVuZ2FyaWFuLgoJICogIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgV2hlbiBzZXQgdG8gYHRydWVgLCBwcm9wZXJ0aWVzIHdoaWNoIGFscmVhZHkgaGF2ZSBhCgkgKiAgICBIdW5nYXJpYW4gdmFsdWUgaW4gdGhlIGB1c2VyYCBvYmplY3Qgd2lsbCBiZSBvdmVyd3JpdHRlbi4gT3RoZXJ3aXNlIHRoZXkKCSAqICAgIHdvbid0IGJlLgoJICovCglEYXRhVGFibGUuY2FtZWxUb0h1bmdhcmlhbiA9IF9mbkNhbWVsVG9IdW5nYXJpYW47CgkKCQoJCgkvKioKCSAqCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICckKCknLCBmdW5jdGlvbiAoIHNlbGVjdG9yLCBvcHRzICkgewoJCXZhcgoJCQlyb3dzICAgPSB0aGlzLnJvd3MoIG9wdHMgKS5ub2RlcygpLCAvLyBHZXQgYWxsIHJvd3MKCQkJanFSb3dzID0gJChyb3dzKTsKCQoJCXJldHVybiAkKCBbXS5jb25jYXQoCgkJCWpxUm93cy5maWx0ZXIoIHNlbGVjdG9yICkudG9BcnJheSgpLAoJCQlqcVJvd3MuZmluZCggc2VsZWN0b3IgKS50b0FycmF5KCkKCQkpICk7Cgl9ICk7CgkKCQoJLy8galF1ZXJ5IGZ1bmN0aW9ucyB0byBvcGVyYXRlIG9uIHRoZSB0YWJsZXMKCSQuZWFjaCggWyAnb24nLCAnb25lJywgJ29mZicgXSwgZnVuY3Rpb24gKGksIGtleSkgewoJCV9hcGlfcmVnaXN0ZXIoIGtleSsnKCknLCBmdW5jdGlvbiAoIC8qIGV2ZW50LCBoYW5kbGVyICovICkgewoJCQl2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CgkKCQkJLy8gQWRkIHRoZSBgZHRgIG5hbWVzcGFjZSBhdXRvbWF0aWNhbGx5IGlmIGl0IGlzbid0IGFscmVhZHkgcHJlc2VudAoJCQlhcmdzWzBdID0gJC5tYXAoIGFyZ3NbMF0uc3BsaXQoIC9ccy8gKSwgZnVuY3Rpb24gKCBlICkgewoJCQkJcmV0dXJuICEgZS5tYXRjaCgvXC5kdFxiLykgPwoJCQkJCWUrJy5kdCcgOgoJCQkJCWU7CgkJCQl9ICkuam9pbiggJyAnICk7CgkKCQkJdmFyIGluc3QgPSAkKCB0aGlzLnRhYmxlcygpLm5vZGVzKCkgKTsKCQkJaW5zdFtrZXldLmFwcGx5KCBpbnN0LCBhcmdzICk7CgkJCXJldHVybiB0aGlzOwoJCX0gKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnY2xlYXIoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJX2ZuQ2xlYXJUYWJsZSggc2V0dGluZ3MgKTsKCQl9ICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3NldHRpbmdzKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIG5ldyBfQXBpKCB0aGlzLmNvbnRleHQsIHRoaXMuY29udGV4dCApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXIoICdpbml0KCknLCBmdW5jdGlvbiAoKSB7CgkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQlyZXR1cm4gY3R4Lmxlbmd0aCA/IGN0eFswXS5vSW5pdCA6IG51bGw7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ2RhdGEoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJcmV0dXJuIF9wbHVjayggc2V0dGluZ3MuYW9EYXRhLCAnX2FEYXRhJyApOwoJCX0gKS5mbGF0dGVuKCk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ2Rlc3Ryb3koKScsIGZ1bmN0aW9uICggcmVtb3ZlICkgewoJCXJlbW92ZSA9IHJlbW92ZSB8fCBmYWxzZTsKCQoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQl2YXIgb3JpZyAgICAgID0gc2V0dGluZ3MublRhYmxlV3JhcHBlci5wYXJlbnROb2RlOwoJCQl2YXIgY2xhc3NlcyAgID0gc2V0dGluZ3Mub0NsYXNzZXM7CgkJCXZhciB0YWJsZSAgICAgPSBzZXR0aW5ncy5uVGFibGU7CgkJCXZhciB0Ym9keSAgICAgPSBzZXR0aW5ncy5uVEJvZHk7CgkJCXZhciB0aGVhZCAgICAgPSBzZXR0aW5ncy5uVEhlYWQ7CgkJCXZhciB0Zm9vdCAgICAgPSBzZXR0aW5ncy5uVEZvb3Q7CgkJCXZhciBqcVRhYmxlICAgPSAkKHRhYmxlKTsKCQkJdmFyIGpxVGJvZHkgICA9ICQodGJvZHkpOwoJCQl2YXIganFXcmFwcGVyID0gJChzZXR0aW5ncy5uVGFibGVXcmFwcGVyKTsKCQkJdmFyIHJvd3MgICAgICA9ICQubWFwKCBzZXR0aW5ncy5hb0RhdGEsIGZ1bmN0aW9uIChyKSB7IHJldHVybiByLm5UcjsgfSApOwoJCQl2YXIgaSwgaWVuOwoJCgkJCS8vIEZsYWcgdG8gbm90ZSB0aGF0IHRoZSB0YWJsZSBpcyBjdXJyZW50bHkgYmVpbmcgZGVzdHJveWVkIC0gbm8gYWN0aW9uCgkJCS8vIHNob3VsZCBiZSB0YWtlbgoJCQlzZXR0aW5ncy5iRGVzdHJveWluZyA9IHRydWU7CgkKCQkJLy8gRmlyZSBvZmYgdGhlIGRlc3Ryb3kgY2FsbGJhY2tzIGZvciBwbHVnLWlucyBldGMKCQkJX2ZuQ2FsbGJhY2tGaXJlKCBzZXR0aW5ncywgImFvRGVzdHJveUNhbGxiYWNrIiwgImRlc3Ryb3kiLCBbc2V0dGluZ3NdICk7CgkKCQkJLy8gSWYgbm90IGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQsIG1ha2UgYWxsIGNvbHVtbnMgdmlzaWJsZQoJCQlpZiAoICEgcmVtb3ZlICkgewoJCQkJbmV3IF9BcGkoIHNldHRpbmdzICkuY29sdW1ucygpLnZpc2libGUoIHRydWUgKTsKCQkJfQoJCgkJCS8vIEJsaXR6IGFsbCBgRFRgIG5hbWVzcGFjZWQgZXZlbnRzICh0aGVzZSBhcmUgaW50ZXJuYWwgZXZlbnRzLCB0aGUKCQkJLy8gbG93ZXJjYXNlLCBgZHRgIGV2ZW50cyBhcmUgdXNlciBzdWJzY3JpYmVkIGFuZCB0aGV5IGFyZSByZXNwb25zaWJsZQoJCQkvLyBmb3IgcmVtb3ZpbmcgdGhlbQoJCQlqcVdyYXBwZXIub2ZmKCcuRFQnKS5maW5kKCc6bm90KHRib2R5ICopJykub2ZmKCcuRFQnKTsKCQkJJCh3aW5kb3cpLm9mZignLkRULScrc2V0dGluZ3Muc0luc3RhbmNlKTsKCQoJCQkvLyBXaGVuIHNjcm9sbGluZyB3ZSBoYWQgdG8gYnJlYWsgdGhlIHRhYmxlIHVwIC0gcmVzdG9yZSBpdAoJCQlpZiAoIHRhYmxlICE9IHRoZWFkLnBhcmVudE5vZGUgKSB7CgkJCQlqcVRhYmxlLmNoaWxkcmVuKCd0aGVhZCcpLmRldGFjaCgpOwoJCQkJanFUYWJsZS5hcHBlbmQoIHRoZWFkICk7CgkJCX0KCQoJCQlpZiAoIHRmb290ICYmIHRhYmxlICE9IHRmb290LnBhcmVudE5vZGUgKSB7CgkJCQlqcVRhYmxlLmNoaWxkcmVuKCd0Zm9vdCcpLmRldGFjaCgpOwoJCQkJanFUYWJsZS5hcHBlbmQoIHRmb290ICk7CgkJCX0KCQoJCQlzZXR0aW5ncy5hYVNvcnRpbmcgPSBbXTsKCQkJc2V0dGluZ3MuYWFTb3J0aW5nRml4ZWQgPSBbXTsKCQkJX2ZuU29ydGluZ0NsYXNzZXMoIHNldHRpbmdzICk7CgkKCQkJJCggcm93cyApLnJlbW92ZUNsYXNzKCBzZXR0aW5ncy5hc1N0cmlwZUNsYXNzZXMuam9pbignICcpICk7CgkKCQkJJCgndGgsIHRkJywgdGhlYWQpLnJlbW92ZUNsYXNzKCBjbGFzc2VzLnNTb3J0YWJsZSsnICcrCgkJCQljbGFzc2VzLnNTb3J0YWJsZUFzYysnICcrY2xhc3Nlcy5zU29ydGFibGVEZXNjKycgJytjbGFzc2VzLnNTb3J0YWJsZU5vbmUKCQkJKTsKCQoJCQkvLyBBZGQgdGhlIFRSIGVsZW1lbnRzIGJhY2sgaW50byB0aGUgdGFibGUgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIKCQkJanFUYm9keS5jaGlsZHJlbigpLmRldGFjaCgpOwoJCQlqcVRib2R5LmFwcGVuZCggcm93cyApOwoJCgkJCS8vIFJlbW92ZSB0aGUgRGF0YVRhYmxlcyBnZW5lcmF0ZWQgbm9kZXMsIGV2ZW50cyBhbmQgY2xhc3NlcwoJCQl2YXIgcmVtb3ZlZE1ldGhvZCA9IHJlbW92ZSA/ICdyZW1vdmUnIDogJ2RldGFjaCc7CgkJCWpxVGFibGVbIHJlbW92ZWRNZXRob2QgXSgpOwoJCQlqcVdyYXBwZXJbIHJlbW92ZWRNZXRob2QgXSgpOwoJCgkJCS8vIElmIHdlIG5lZWQgdG8gcmVhdHRhY2ggdGhlIHRhYmxlIHRvIHRoZSBkb2N1bWVudAoJCQlpZiAoICEgcmVtb3ZlICYmIG9yaWcgKSB7CgkJCQkvLyBpbnNlcnRCZWZvcmUgYWN0cyBsaWtlIGFwcGVuZENoaWxkIGlmICFhcmdbMV0KCQkJCW9yaWcuaW5zZXJ0QmVmb3JlKCB0YWJsZSwgc2V0dGluZ3MublRhYmxlUmVpbnNlcnRCZWZvcmUgKTsKCQoJCQkJLy8gUmVzdG9yZSB0aGUgd2lkdGggb2YgdGhlIG9yaWdpbmFsIHRhYmxlIC0gd2FzIHJlYWQgZnJvbSB0aGUgc3R5bGUgcHJvcGVydHksCgkJCQkvLyBzbyB3ZSBjYW4gcmVzdG9yZSBkaXJlY3RseSB0byB0aGF0CgkJCQlqcVRhYmxlCgkJCQkJLmNzcyggJ3dpZHRoJywgc2V0dGluZ3Muc0Rlc3Ryb3lXaWR0aCApCgkJCQkJLnJlbW92ZUNsYXNzKCBjbGFzc2VzLnNUYWJsZSApOwoJCgkJCQkvLyBJZiB0aGUgd2VyZSBvcmlnaW5hbGx5IHN0cmlwZSBjbGFzc2VzIC0gdGhlbiB3ZSBhZGQgdGhlbSBiYWNrIGhlcmUuCgkJCQkvLyBOb3RlIHRoaXMgaXMgbm90IGZvb2wgcHJvb2YgKGZvciBleGFtcGxlIGlmIG5vdCBhbGwgcm93cyBoYWQgc3RyaXBlCgkJCQkvLyBjbGFzc2VzIC0gYnV0IGl0J3MgYSBnb29kIGVmZm9ydCB3aXRob3V0IGdldHRpbmcgY2FycmllZCBhd2F5CgkJCQlpZW4gPSBzZXR0aW5ncy5hc0Rlc3Ryb3lTdHJpcGVzLmxlbmd0aDsKCQoJCQkJaWYgKCBpZW4gKSB7CgkJCQkJanFUYm9keS5jaGlsZHJlbigpLmVhY2goIGZ1bmN0aW9uIChpKSB7CgkJCQkJCSQodGhpcykuYWRkQ2xhc3MoIHNldHRpbmdzLmFzRGVzdHJveVN0cmlwZXNbaSAlIGllbl0gKTsKCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQoJCQkvKiBSZW1vdmUgdGhlIHNldHRpbmdzIG9iamVjdCBmcm9tIHRoZSBzZXR0aW5ncyBhcnJheSAqLwoJCQl2YXIgaWR4ID0gJC5pbkFycmF5KCBzZXR0aW5ncywgRGF0YVRhYmxlLnNldHRpbmdzICk7CgkJCWlmICggaWR4ICE9PSAtMSApIHsKCQkJCURhdGFUYWJsZS5zZXR0aW5ncy5zcGxpY2UoIGlkeCwgMSApOwoJCQl9CgkJfSApOwoJfSApOwoJCgkKCS8vIEFkZCB0aGUgYGV2ZXJ5KClgIG1ldGhvZCBmb3Igcm93cywgY29sdW1ucyBhbmQgY2VsbHMgaW4gYSBjb21wYWN0IGZvcm0KCSQuZWFjaCggWyAnY29sdW1uJywgJ3JvdycsICdjZWxsJyBdLCBmdW5jdGlvbiAoIGksIHR5cGUgKSB7CgkJX2FwaV9yZWdpc3RlciggdHlwZSsncygpLmV2ZXJ5KCknLCBmdW5jdGlvbiAoIGZuICkgewoJCQl2YXIgb3B0cyA9IHRoaXMuc2VsZWN0b3Iub3B0czsKCQkJdmFyIGFwaSA9IHRoaXM7CgkKCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoIHR5cGUsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQgKSB7CgkJCQkvLyBSb3dzIGFuZCBjb2x1bW5zOgoJCQkJLy8gIGFyZzEgLSBpbmRleAoJCQkJLy8gIGFyZzIgLSB0YWJsZSBjb3VudGVyCgkJCQkvLyAgYXJnMyAtIGxvb3AgY291bnRlcgoJCQkJLy8gIGFyZzQgLSB1bmRlZmluZWQKCQkJCS8vIENlbGxzOgoJCQkJLy8gIGFyZzEgLSByb3cgaW5kZXgKCQkJCS8vICBhcmcyIC0gY29sdW1uIGluZGV4CgkJCQkvLyAgYXJnMyAtIHRhYmxlIGNvdW50ZXIKCQkJCS8vICBhcmc0IC0gbG9vcCBjb3VudGVyCgkJCQlmbi5jYWxsKAoJCQkJCWFwaVsgdHlwZSBdKAoJCQkJCQlhcmcxLAoJCQkJCQl0eXBlPT09J2NlbGwnID8gYXJnMiA6IG9wdHMsCgkJCQkJCXR5cGU9PT0nY2VsbCcgPyBvcHRzIDogdW5kZWZpbmVkCgkJCQkJKSwKCQkJCQlhcmcxLCBhcmcyLCBhcmczLCBhcmc0CgkJCQkpOwoJCQl9ICk7CgkJfSApOwoJfSApOwoJCgkKCS8vIGkxOG4gbWV0aG9kIGZvciBleHRlbnNpb25zIHRvIGJlIGFibGUgdG8gdXNlIHRoZSBsYW5ndWFnZSBvYmplY3QgZnJvbSB0aGUKCS8vIERhdGFUYWJsZQoJX2FwaV9yZWdpc3RlciggJ2kxOG4oKScsIGZ1bmN0aW9uICggdG9rZW4sIGRlZiwgcGx1cmFsICkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHRbMF07CgkJdmFyIHJlc29sdmVkID0gX2ZuR2V0T2JqZWN0RGF0YUZuKCB0b2tlbiApKCBjdHgub0xhbmd1YWdlICk7CgkKCQlpZiAoIHJlc29sdmVkID09PSB1bmRlZmluZWQgKSB7CgkJCXJlc29sdmVkID0gZGVmOwoJCX0KCQoJCWlmICggcGx1cmFsICE9PSB1bmRlZmluZWQgJiYgJC5pc1BsYWluT2JqZWN0KCByZXNvbHZlZCApICkgewoJCQlyZXNvbHZlZCA9IHJlc29sdmVkWyBwbHVyYWwgXSAhPT0gdW5kZWZpbmVkID8KCQkJCXJlc29sdmVkWyBwbHVyYWwgXSA6CgkJCQlyZXNvbHZlZC5fOwoJCX0KCQoJCXJldHVybiByZXNvbHZlZC5yZXBsYWNlKCAnJWQnLCBwbHVyYWwgKTsgLy8gbmI6IHBsdXJhbCBtaWdodCBiZSB1bmRlZmluZWQsCgl9ICk7CgkvKioKCSAqIFZlcnNpb24gc3RyaW5nIGZvciBwbHVnLWlucyB0byBjaGVjayBjb21wYXRpYmlsaXR5LiBBbGxvd2VkIGZvcm1hdCBpcwoJICogYGEuYi5jLWRgIHdoZXJlOiBhOmludCwgYjppbnQsIGM6aW50LCBkOnN0cmluZyhkZXZ8YmV0YXxhbHBoYSkuIGBkYCBpcyB1c2VkCgkgKiBvbmx5IGZvciBub24tcmVsZWFzZSBidWlsZHMuIFNlZSBodHRwOi8vc2VtdmVyLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCgkgKiAgQG1lbWJlcgoJICogIEB0eXBlIHN0cmluZwoJICogIEBkZWZhdWx0IFZlcnNpb24gbnVtYmVyCgkgKi8KCURhdGFUYWJsZS52ZXJzaW9uID0gIjEuMTAuMTkiOwoKCS8qKgoJICogUHJpdmF0ZSBkYXRhIHN0b3JlLCBjb250YWluaW5nIGFsbCBvZiB0aGUgc2V0dGluZ3Mgb2JqZWN0cyB0aGF0IGFyZQoJICogY3JlYXRlZCBmb3IgdGhlIHRhYmxlcyBvbiBhIGdpdmVuIHBhZ2UuCgkgKgoJICogTm90ZSB0aGF0IHRoZSBgRGF0YVRhYmxlLnNldHRpbmdzYCBvYmplY3QgaXMgYWxpYXNlZCB0bwoJICogYGpRdWVyeS5mbi5kYXRhVGFibGVFeHRgIHRocm91Z2ggd2hpY2ggaXQgbWF5IGJlIGFjY2Vzc2VkIGFuZAoJICogbWFuaXB1bGF0ZWQsIG9yIGBqUXVlcnkuZm4uZGF0YVRhYmxlLnNldHRpbmdzYC4KCSAqICBAbWVtYmVyCgkgKiAgQHR5cGUgYXJyYXkKCSAqICBAZGVmYXVsdCBbXQoJICogIEBwcml2YXRlCgkgKi8KCURhdGFUYWJsZS5zZXR0aW5ncyA9IFtdOwoKCS8qKgoJICogT2JqZWN0IG1vZGVscyBjb250YWluZXIsIGZvciB0aGUgdmFyaW91cyBtb2RlbHMgdGhhdCBEYXRhVGFibGVzIGhhcwoJICogYXZhaWxhYmxlIHRvIGl0LiBUaGVzZSBtb2RlbHMgZGVmaW5lIHRoZSBvYmplY3RzIHRoYXQgYXJlIHVzZWQgdG8gaG9sZAoJICogdGhlIGFjdGl2ZSBzdGF0ZSBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFibGUuCgkgKiAgQG5hbWVzcGFjZQoJICovCglEYXRhVGFibGUubW9kZWxzID0ge307CgkKCQoJCgkvKioKCSAqIFRlbXBsYXRlIG9iamVjdCBmb3IgdGhlIHdheSBpbiB3aGljaCBEYXRhVGFibGVzIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0CgkgKiBzZWFyY2ggaW5mb3JtYXRpb24gZm9yIHRoZSBnbG9iYWwgZmlsdGVyIGFuZCBpbmRpdmlkdWFsIGNvbHVtbiBmaWx0ZXJzLgoJICogIEBuYW1lc3BhY2UKCSAqLwoJRGF0YVRhYmxlLm1vZGVscy5vU2VhcmNoID0gewoJCS8qKgoJCSAqIEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGZpbHRlcmluZyBzaG91bGQgYmUgY2FzZSBpbnNlbnNpdGl2ZSBvciBub3QKCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqICBAZGVmYXVsdCB0cnVlCgkJICovCgkJImJDYXNlSW5zZW5zaXRpdmUiOiB0cnVlLAoJCgkJLyoqCgkJICogQXBwbGllZCBzZWFyY2ggdGVybQoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgPGk+RW1wdHkgc3RyaW5nPC9pPgoJCSAqLwoJCSJzU2VhcmNoIjogIiIsCgkKCQkvKioKCQkgKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBzZWFyY2ggdGVybSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYQoJCSAqIHJlZ3VsYXIgZXhwcmVzc2lvbiAodHJ1ZSkgb3Igbm90IChmYWxzZSkgYW5kIHRoZXJlZm9yZSBhbmQgc3BlY2lhbAoJCSAqIHJlZ2V4IGNoYXJhY3RlcnMgZXNjYXBlZC4KCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqICBAZGVmYXVsdCBmYWxzZQoJCSAqLwoJCSJiUmVnZXgiOiBmYWxzZSwKCQoJCS8qKgoJCSAqIEZsYWcgdG8gaW5kaWNhdGUgaWYgRGF0YVRhYmxlcyBpcyB0byB1c2UgaXRzIHNtYXJ0IGZpbHRlcmluZyBvciBub3QuCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgdHJ1ZQoJCSAqLwoJCSJiU21hcnQiOiB0cnVlCgl9OwoJCgkKCQoJCgkvKioKCSAqIFRlbXBsYXRlIG9iamVjdCBmb3IgdGhlIHdheSBpbiB3aGljaCBEYXRhVGFibGVzIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0CgkgKiBlYWNoIGluZGl2aWR1YWwgcm93LiBUaGlzIGlzIHRoZSBvYmplY3QgZm9ybWF0IHVzZWQgZm9yIHRoZSBzZXR0aW5ncwoJICogYW9EYXRhIGFycmF5LgoJICogIEBuYW1lc3BhY2UKCSAqLwoJRGF0YVRhYmxlLm1vZGVscy5vUm93ID0gewoJCS8qKgoJCSA="
}
],
"height": 827741,
"spentComplexity": 0
}