@vitessce/neuroglancer-workers 3.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,35 @@
1
+ function decodeBase64(base64, enableUnicode) {
2
+ var binaryString = atob(base64);
3
+ if (enableUnicode) {
4
+ var binaryView = new Uint8Array(binaryString.length);
5
+ for (var i = 0, n = binaryString.length; i < n; ++i) {
6
+ binaryView[i] = binaryString.charCodeAt(i);
7
+ }
8
+ return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer));
9
+ }
10
+ return binaryString;
11
+ }
12
+
13
+ function createURL(base64, sourcemapArg, enableUnicodeArg) {
14
+ var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;
15
+ var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;
16
+ var source = decodeBase64(base64, enableUnicode);
17
+ var start = source.indexOf('\n', 10) + 1;
18
+ var body = source.substring(start) + (sourcemap ? '\/\/# sourceMappingURL=' + sourcemap : '');
19
+ var blob = new Blob([body], { type: 'application/javascript' });
20
+ return URL.createObjectURL(blob);
21
+ }
22
+
23
+ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
24
+ var url;
25
+ return function WorkerFactory(options) {
26
+ url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
27
+ return new Worker(url, options);
28
+ };
29
+ }
30
+
31
+ var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gcmVxdWlyZSh4KSB7IHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlcXVpcmUgJyArIHgpIH0KICAoKCkgPT4gewogICAgdmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTsKICAgIHZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgICB2YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICB2YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczsKICAgIHZhciBfX2dldFByb3RvT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7CiAgICB2YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgIHZhciBfX21hcmtBc01vZHVsZSA9ICh0YXJnZXQpID0+IF9fZGVmUHJvcCh0YXJnZXQsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciBfX3JlcXVpcmUgPSAoeCkgPT4gewogICAgICBpZiAodHlwZW9mIHJlcXVpcmUgIT09ICJ1bmRlZmluZWQiKQogICAgICAgIHJldHVybiByZXF1aXJlKHgpOwogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiAiJyArIHggKyAnIiBpcyBub3Qgc3VwcG9ydGVkJyk7CiAgICB9OwogICAgdmFyIF9fZXNtID0gKGZuLCByZXMpID0+IGZ1bmN0aW9uIF9faW5pdCgpIHsKICAgICAgcmV0dXJuIGZuICYmIChyZXMgPSAoMCwgZm5bT2JqZWN0LmtleXMoZm4pWzBdXSkoZm4gPSAwKSksIHJlczsKICAgIH07CiAgICB2YXIgX19jb21tb25KUyA9IChjYiwgbW9kKSA9PiBmdW5jdGlvbiBfX3JlcXVpcmUyKCkgewogICAgICByZXR1cm4gbW9kIHx8ICgwLCBjYltPYmplY3Qua2V5cyhjYilbMF1dKSgobW9kID0geyBleHBvcnRzOiB7fSB9KS5leHBvcnRzLCBtb2QpLCBtb2QuZXhwb3J0czsKICAgIH07CiAgICB2YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHsKICAgICAgX19tYXJrQXNNb2R1bGUodGFyZ2V0KTsKICAgICAgZm9yICh2YXIgbmFtZSBpbiBhbGwpCiAgICAgICAgX19kZWZQcm9wKHRhcmdldCwgbmFtZSwgeyBnZXQ6IGFsbFtuYW1lXSwgZW51bWVyYWJsZTogdHJ1ZSB9KTsKICAgIH07CiAgICB2YXIgX19yZUV4cG9ydCA9ICh0YXJnZXQsIG1vZHVsZSwgZGVzYykgPT4gewogICAgICBpZiAobW9kdWxlICYmIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBtb2R1bGUgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBmb3IgKGxldCBrZXkgb2YgX19nZXRPd25Qcm9wTmFtZXMobW9kdWxlKSkKICAgICAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodGFyZ2V0LCBrZXkpICYmIGtleSAhPT0gImRlZmF1bHQiKQogICAgICAgICAgICBfX2RlZlByb3AodGFyZ2V0LCBrZXksIHsgZ2V0OiAoKSA9PiBtb2R1bGVba2V5XSwgZW51bWVyYWJsZTogIShkZXNjID0gX19nZXRPd25Qcm9wRGVzYyhtb2R1bGUsIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTsKICAgICAgfQogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfTsKICAgIHZhciBfX3RvTW9kdWxlID0gKG1vZHVsZSkgPT4gewogICAgICByZXR1cm4gX19yZUV4cG9ydChfX21hcmtBc01vZHVsZShfX2RlZlByb3AobW9kdWxlICE9IG51bGwgPyBfX2NyZWF0ZShfX2dldFByb3RvT2YobW9kdWxlKSkgOiB7fSwgImRlZmF1bHQiLCBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgJiYgImRlZmF1bHQiIGluIG1vZHVsZSA/IHsgZ2V0OiAoKSA9PiBtb2R1bGUuZGVmYXVsdCwgZW51bWVyYWJsZTogdHJ1ZSB9IDogeyB2YWx1ZTogbW9kdWxlLCBlbnVtZXJhYmxlOiB0cnVlIH0pKSwgbW9kdWxlKTsKICAgIH07CiAgICB2YXIgX19kZWNvcmF0ZUNsYXNzID0gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBraW5kKSA9PiB7CiAgICAgIHZhciByZXN1bHQgPSBraW5kID4gMSA/IHZvaWQgMCA6IGtpbmQgPyBfX2dldE93blByb3BEZXNjKHRhcmdldCwga2V5KSA6IHRhcmdldDsKICAgICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMSwgZGVjb3JhdG9yOyBpID49IDA7IGktLSkKICAgICAgICBpZiAoZGVjb3JhdG9yID0gZGVjb3JhdG9yc1tpXSkKICAgICAgICAgIHJlc3VsdCA9IChraW5kID8gZGVjb3JhdG9yKHRhcmdldCwga2V5LCByZXN1bHQpIDogZGVjb3JhdG9yKHJlc3VsdCkpIHx8IHJlc3VsdDsKICAgICAgaWYgKGtpbmQgJiYgcmVzdWx0KQogICAgICAgIF9fZGVmUHJvcCh0YXJnZXQsIGtleSwgcmVzdWx0KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgLy8gbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdC5qcwogICAgdmFyIHJlcXVpcmVfaXNPYmplY3QgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7CiAgICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICJvYmplY3QiIHx8IHR5cGUgPT0gImZ1bmN0aW9uIik7CiAgICAgICAgfQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIG5vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMKICAgIHZhciByZXF1aXJlX2ZyZWVHbG9iYWwgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIHdpbmRvdyA9PSAib2JqZWN0IiAmJiB3aW5kb3cgJiYgd2luZG93Lk9iamVjdCA9PT0gT2JqZWN0ICYmIHdpbmRvdzsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIG5vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMKICAgIHZhciByZXF1aXJlX3Jvb3QgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIHZhciBmcmVlR2xvYmFsID0gcmVxdWlyZV9mcmVlR2xvYmFsKCk7CiAgICAgICAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gIm9iamVjdCIgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7CiAgICAgICAgdmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSByb290OwogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvbG9kYXNoL25vdy5qcwogICAgdmFyIHJlcXVpcmVfbm93ID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvbG9kYXNoL25vdy5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICAgdmFyIHJvb3QgPSByZXF1aXJlX3Jvb3QoKTsKICAgICAgICB2YXIgbm93ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gcm9vdC5EYXRlLm5vdygpOwogICAgICAgIH07CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBub3c7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIG5vZGVfbW9kdWxlcy9sb2Rhc2gvX3RyaW1tZWRFbmRJbmRleC5qcwogICAgdmFyIHJlcXVpcmVfdHJpbW1lZEVuZEluZGV4ID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvbG9kYXNoL190cmltbWVkRW5kSW5kZXguanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIHZhciByZVdoaXRlc3BhY2UgPSAvXHMvOwogICAgICAgIGZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHsKICAgICAgICAgIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBpbmRleDsKICAgICAgICB9CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB0cmltbWVkRW5kSW5kZXg7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIG5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUcmltLmpzCiAgICB2YXIgcmVxdWlyZV9iYXNlVHJpbSA9IF9fY29tbW9uSlMoewogICAgICAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRyaW0uanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIHZhciB0cmltbWVkRW5kSW5kZXggPSByZXF1aXJlX3RyaW1tZWRFbmRJbmRleCgpOwogICAgICAgIHZhciByZVRyaW1TdGFydCA9IC9eXHMrLzsKICAgICAgICBmdW5jdGlvbiBiYXNlVHJpbShzdHJpbmcpIHsKICAgICAgICAgIHJldHVybiBzdHJpbmcgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAiIikgOiBzdHJpbmc7CiAgICAgICAgfQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gYmFzZVRyaW07CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIG5vZGVfbW9kdWxlcy9sb2Rhc2gvX1N5bWJvbC5qcwogICAgdmFyIHJlcXVpcmVfU3ltYm9sID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIHZhciByb290ID0gcmVxdWlyZV9yb290KCk7CiAgICAgICAgdmFyIFN5bWJvbDIgPSByb290LlN5bWJvbDsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IFN5bWJvbDI7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIG5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcwogICAgdmFyIHJlcXVpcmVfZ2V0UmF3VGFnID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRSYXdUYWcuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIHZhciBTeW1ib2wyID0gcmVxdWlyZV9TeW1ib2woKTsKICAgICAgICB2YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlOwogICAgICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5OwogICAgICAgIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nOwogICAgICAgIHZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbDIgPyBTeW1ib2wyLnRvU3RyaW5nVGFnIDogdm9pZCAwOwogICAgICAgIGZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkgewogICAgICAgICAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLCB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB2b2lkIDA7CiAgICAgICAgICAgIHZhciB1bm1hc2tlZCA9IHRydWU7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7CiAgICAgICAgICBpZiAodW5tYXNrZWQpIHsKICAgICAgICAgICAgaWYgKGlzT3duKSB7CiAgICAgICAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZ2V0UmF3VGFnOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcwogICAgdmFyIHJlcXVpcmVfb2JqZWN0VG9TdHJpbmcgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX29iamVjdFRvU3RyaW5nLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICAgICB2YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlOwogICAgICAgIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nOwogICAgICAgIGZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gb2JqZWN0VG9TdHJpbmc7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIG5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMKICAgIHZhciByZXF1aXJlX2Jhc2VHZXRUYWcgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIHZhciBTeW1ib2wyID0gcmVxdWlyZV9TeW1ib2woKTsKICAgICAgICB2YXIgZ2V0UmF3VGFnID0gcmVxdWlyZV9nZXRSYXdUYWcoKTsKICAgICAgICB2YXIgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlX29iamVjdFRvU3RyaW5nKCk7CiAgICAgICAgdmFyIG51bGxUYWcgPSAiW29iamVjdCBOdWxsXSI7CiAgICAgICAgdmFyIHVuZGVmaW5lZFRhZyA9ICJbb2JqZWN0IFVuZGVmaW5lZF0iOwogICAgICAgIHZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbDIgPyBTeW1ib2wyLnRvU3RyaW5nVGFnIDogdm9pZCAwOwogICAgICAgIGZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHsKICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdm9pZCAwID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZzsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpID8gZ2V0UmF3VGFnKHZhbHVlKSA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcwogICAgdmFyIHJlcXVpcmVfaXNPYmplY3RMaWtlID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICAgZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gIm9iamVjdCI7CiAgICAgICAgfQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gaXNPYmplY3RMaWtlOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvbG9kYXNoL2lzU3ltYm9sLmpzCiAgICB2YXIgcmVxdWlyZV9pc1N5bWJvbCA9IF9fY29tbW9uSlMoewogICAgICAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N5bWJvbC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICAgdmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlX2Jhc2VHZXRUYWcoKTsKICAgICAgICB2YXIgaXNPYmplY3RMaWtlID0gcmVxdWlyZV9pc09iamVjdExpa2UoKTsKICAgICAgICB2YXIgc3ltYm9sVGFnID0gIltvYmplY3QgU3ltYm9sXSI7CiAgICAgICAgZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHsKICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gInN5bWJvbCIgfHwgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzeW1ib2xUYWc7CiAgICAgICAgfQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gaXNTeW1ib2w7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIG5vZGVfbW9kdWxlcy9sb2Rhc2gvdG9OdW1iZXIuanMKICAgIHZhciByZXF1aXJlX3RvTnVtYmVyID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICAgICB2YXIgYmFzZVRyaW0gPSByZXF1aXJlX2Jhc2VUcmltKCk7CiAgICAgICAgdmFyIGlzT2JqZWN0ID0gcmVxdWlyZV9pc09iamVjdCgpOwogICAgICAgIHZhciBpc1N5bWJvbCA9IHJlcXVpcmVfaXNTeW1ib2woKTsKICAgICAgICB2YXIgTkFOID0gMCAvIDA7CiAgICAgICAgdmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTsKICAgICAgICB2YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTsKICAgICAgICB2YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTsKICAgICAgICB2YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7CiAgICAgICAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHsKICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gIm51bWJlciIpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gTkFOOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkgewogICAgICAgICAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAiZnVuY3Rpb24iID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7CiAgICAgICAgICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gb3RoZXIgKyAiIiA6IG90aGVyOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAic3RyaW5nIikgewogICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpOwogICAgICAgICAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTsKICAgICAgICAgIHJldHVybiBpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpIDogcmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZTsKICAgICAgICB9CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB0b051bWJlcjsKICAgICAgfQogICAgfSk7CgogICAgLy8gbm9kZV9tb2R1bGVzL2xvZGFzaC9kZWJvdW5jZS5qcwogICAgdmFyIHJlcXVpcmVfZGVib3VuY2UgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZGVib3VuY2UuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIHZhciBpc09iamVjdCA9IHJlcXVpcmVfaXNPYmplY3QoKTsKICAgICAgICB2YXIgbm93ID0gcmVxdWlyZV9ub3coKTsKICAgICAgICB2YXIgdG9OdW1iZXIgPSByZXF1aXJlX3RvTnVtYmVyKCk7CiAgICAgICAgdmFyIEZVTkNfRVJST1JfVEVYVCA9ICJFeHBlY3RlZCBhIGZ1bmN0aW9uIjsKICAgICAgICB2YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7CiAgICAgICAgdmFyIG5hdGl2ZU1pbiA9IE1hdGgubWluOwogICAgICAgIGZ1bmN0aW9uIGRlYm91bmNlMyhmdW5jLCB3YWl0LCBvcHRpb25zKSB7CiAgICAgICAgICB2YXIgbGFzdEFyZ3MsIGxhc3RUaGlzLCBtYXhXYWl0LCByZXN1bHQsIHRpbWVySWQsIGxhc3RDYWxsVGltZSwgbGFzdEludm9rZVRpbWUgPSAwLCBsZWFkaW5nID0gZmFsc2UsIG1heGluZyA9IGZhbHNlLCB0cmFpbGluZyA9IHRydWU7CiAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7CiAgICAgICAgICB9CiAgICAgICAgICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDsKICAgICAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkgewogICAgICAgICAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7CiAgICAgICAgICAgIG1heGluZyA9ICJtYXhXYWl0IiBpbiBvcHRpb25zOwogICAgICAgICAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0OwogICAgICAgICAgICB0cmFpbGluZyA9ICJ0cmFpbGluZyIgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7CiAgICAgICAgICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsIHRoaXNBcmcgPSBsYXN0VGhpczsKICAgICAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHZvaWQgMDsKICAgICAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lOwogICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkgewogICAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7CiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7CiAgICAgICAgICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkgewogICAgICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLCB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLCB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDsKICAgICAgICAgICAgcmV0dXJuIG1heGluZyA/IG5hdGl2ZU1pbih0aW1lV2FpdGluZywgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpIDogdGltZVdhaXRpbmc7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkgewogICAgICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLCB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lOwogICAgICAgICAgICByZXR1cm4gbGFzdENhbGxUaW1lID09PSB2b2lkIDAgfHwgdGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCB8fCB0aW1lU2luY2VMYXN0Q2FsbCA8IDAgfHwgbWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdDsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHsKICAgICAgICAgICAgdmFyIHRpbWUgPSBub3coKTsKICAgICAgICAgICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkgewogICAgICAgICAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7CiAgICAgICAgICAgIHRpbWVySWQgPSB2b2lkIDA7CiAgICAgICAgICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykgewogICAgICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB2b2lkIDA7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7CiAgICAgICAgICAgIGlmICh0aW1lcklkICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdEludm9rZVRpbWUgPSAwOwogICAgICAgICAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGZsdXNoKCkgewogICAgICAgICAgICByZXR1cm4gdGltZXJJZCA9PT0gdm9pZCAwID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHsKICAgICAgICAgICAgdmFyIHRpbWUgPSBub3coKSwgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTsKICAgICAgICAgICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgIGxhc3RUaGlzID0gdGhpczsKICAgICAgICAgICAgbGFzdENhbGxUaW1lID0gdGltZTsKICAgICAgICAgICAgaWYgKGlzSW52b2tpbmcpIHsKICAgICAgICAgICAgICBpZiAodGltZXJJZCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKG1heGluZykgewogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpOwogICAgICAgICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTsKICAgICAgICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aW1lcklkID09PSB2b2lkIDApIHsKICAgICAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsOwogICAgICAgICAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7CiAgICAgICAgICByZXR1cm4gZGVib3VuY2VkOwogICAgICAgIH0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlMzsKICAgICAgfQogICAgfSk7CgogICAgLy8gbm9kZV9tb2R1bGVzL2xvZGFzaC90aHJvdHRsZS5qcwogICAgdmFyIHJlcXVpcmVfdGhyb3R0bGUgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdGhyb3R0bGUuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIHZhciBkZWJvdW5jZTMgPSByZXF1aXJlX2RlYm91bmNlKCk7CiAgICAgICAgdmFyIGlzT2JqZWN0ID0gcmVxdWlyZV9pc09iamVjdCgpOwogICAgICAgIHZhciBGVU5DX0VSUk9SX1RFWFQgPSAiRXhwZWN0ZWQgYSBmdW5jdGlvbiI7CiAgICAgICAgZnVuY3Rpb24gdGhyb3R0bGUyKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHsKICAgICAgICAgIHZhciBsZWFkaW5nID0gdHJ1ZSwgdHJhaWxpbmcgPSB0cnVlOwogICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7CiAgICAgICAgICAgIGxlYWRpbmcgPSAibGVhZGluZyIgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZzsKICAgICAgICAgICAgdHJhaWxpbmcgPSAidHJhaWxpbmciIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZzsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBkZWJvdW5jZTMoZnVuYywgd2FpdCwgewogICAgICAgICAgICAibGVhZGluZyI6IGxlYWRpbmcsCiAgICAgICAgICAgICJtYXhXYWl0Ijogd2FpdCwKICAgICAgICAgICAgInRyYWlsaW5nIjogdHJhaWxpbmcKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHRocm90dGxlMjsKICAgICAgfQogICAgfSk7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9tZXNoL2RyYWNvL25ldXJvZ2xhbmNlcl9kcmFjby53YXNtCiAgICB2YXIgbmV1cm9nbGFuY2VyX2RyYWNvX2RlZmF1bHQ7CiAgICB2YXIgaW5pdF9uZXVyb2dsYW5jZXJfZHJhY28gPSBfX2VzbSh7CiAgICAgICJzcmMvbmV1cm9nbGFuY2VyL21lc2gvZHJhY28vbmV1cm9nbGFuY2VyX2RyYWNvLndhc20iKCkgewogICAgICAgIG5ldXJvZ2xhbmNlcl9kcmFjb19kZWZhdWx0ID0gImRhdGE6YXBwbGljYXRpb24vd2FzbTtiYXNlNjQsQUdGemJRRUFBQUFCVXcxZ0FYOEJmMkFDZjM4QmYyQUJmd0JnQTM5L2Z3Ri9ZQUovZndCZ0EzOS9md0JnQm45L2YzOS9md0YvWUFBQVlBUi9mMzkvQUdBRWYzOS9md0YvWUFBQmYyQUZmMzkvZjM4QVlBVi9mMzkvZndGL0FuZ0RBMlZ1ZGlkdVpYVnliMmRzWVc1alpYSmZaSEpoWTI5ZmNtVmpaV2wyWlY5a1pXTnZaR1ZrWDIxbGMyZ0FDeFozWVhOcFgzTnVZWEJ6YUc5MFgzQnlaWFpwWlhjeENYQnliMk5mWlhocGRBQUNBMlZ1ZGg5bGJYTmpjbWx3ZEdWdVgyNXZkR2xtZVY5dFpXMXZjbmxmWjNKdmQzUm9BQUlEL3dIOUFRY01CQVFFQ0FFRUJBa0RBUU1EQVFVREFRTUZBZ0VBQVFFREFRTURBUUFCQXdFRUFRRUJBUUFCQVFNREF3a0RBUU1EQXdFQUFRVUFBQUVBQUFBQkFRRUJCUUFGQkFBQ0JBSUVBd0VFQVFFQ0JBUUNCQUVDQlFRQ0NBSUZBQUFEQUFRQUJBQUVBUUlCQkFRQUFBRUJBd1FGQkFJQkFRQUNBUUFBQVFBQ0FBSUJBQUlBQUFJQUFBSUFBUUVBQWdBQ0FBSUFBZ0FDQUFJRkJBSUFBZ0FDQVFBSUNBSUFBUUVHQUFBR0FBSUFBUVlBQWdBQUFRRUdBQUlBQVFZR0JnQUNCZ0FDQmdBQ0JnWUVCUUFBQWdFQUFRVUNBQUlBQUFJQkFBRUNBQUlCQUFFRUJ3TUFDZ2NIQlFBQ0JRQUVBQU1IQUFBREFBSUNCd01EQXdBS0FnQUVCd0Z3QWVVQjVRRUZCZ0VCQVlDQUFnWUlBWDhCUWVDcEFnc0htZ0VKQm0xbGJXOXllUUlBR1c1bGRYSnZaMnhoYm1ObGNsOWtjbUZqYjE5a1pXTnZaR1VBQkFadFlXeHNiMk1BOVFFWlgxOXBibVJwY21WamRGOW1kVzVqZEdsdmJsOTBZV0pzWlFFQUMxOXBibWwwYVdGc2FYcGxBT01CRUY5ZlpYSnlibTlmYkc5allYUnBiMjRBNWdFSmMzUmhZMnRUWVhabEFQMEJESE4wWVdOclVtVnpkRzl5WlFEK0FRcHpkR0ZqYTBGc2JHOWpBUDhCQ2VFQ0FRQkJBUXZrQVhoNUV4UW5lbnQ4ZmZFQklEdCtmeHdkSGg4Z0lpT0FBWUVCSkNhQ0FTZ3BLaXVEQVlRQkhDd3RMeTZGQVRLR0FZY0JNelUwTmpjNGlRR0tBVHM5UERwdGJqK0xBWXdCalFFK2pnR1BBVUJCUWtOSU8xOWdrQUdSQVVCQlFrTmlPMTlna2dHVEFVQkJRa05rTzE5Z2xBR1ZBVHRvTzRnQmZYMW1lWWdCTzVnQm1RR2FBWnNCbGdHWEFYTjBHWFU3Q1FzTURRNFBFSFozUlp3QlJKMEJuZ0dmQWFBQm9RR2lBYW9CcFFFN1g2WUJpQUduQVgySUFUdW9BYWtCZWFVQnF3R21BYXdCclFHdUFhOEJwZ0d3QWJFQnNnR3pBYlFCdFFFN2ZiWUJ0d0c0QWJrQnVnRzdBYlVCTzMyMkFid0J2UUdsQVR1bUFiNEJwUUdyQWFZQnZ3SEFBY0VCcndHbUFiQUJ3Z0hEQWNRQnRBRzFBVHQ5dGdHM0FjVUJ4Z0hIQWJzQnRRRTdmYllCdkFISUFhVUJpQUU3eVFITkFjNEJ6d0hRQWN3QjB3SExBZFFCMVFIWEFkZ0IyUUhhQWRZQjNBSGRBZDRCM3dIZ0FRTUt0SUFKL1FFN0FRTi9BMEFnQUVFRWRDSUJRZFFoYWlBQlFkQWhhaUlDTmdJQUlBRkIyQ0ZxSUFJMkFnQWdBRUVCYWlJQVFjQUFSdzBBQzBFd0VQSUJHZ3U4THdFUmZ5TUFRYkFCYXlJSEpBQWdCeUFETmdLc0FTQUhRZ0EzQTVnQklBZENBRGNBblFFZ0IwRUFPd0dtQVNBSFFnQTNBNUFCSUFjZ0FhMDNBNGdCSUFjZ0FEWUNnQUVnQjBINEFHb2lBVUlBTndNQUlBZENBRGNDYkNBSElBZEI2QUJxUVFSeU5nSm9JQWNnQVRZQ2RDQUVCRUFqQUVGQWFpSUZKQUFnQlVFQU5nSVVJQVZCSUJEcUFTSUJOZ0lJSUFWQ21JQ0FnSUNFZ0lDQWZ6Y0NEQ0FCUVFBNkFCZ2dBVUhsQ0NrQUFEY0FFQ0FCUWQwSUtRQUFOd0FJSUFGQjFRZ3BBQUEzQUFBakFFRWdheUlJSkFBZ0JTZ0NGQ0VMQWtBQ1FDQUhRZWdBYWlJSlFSQnFJZ01vQWdBaUFVVU5BQ0FESVFZZ0FTRUVBMEFnQmlBRUlBUW9BaEFnQzBnaUNoc2hCaUFFSUFwQkFuUnFLQUlBSWdRTkFBc2dBeUFHUmcwQUlBc2dCaWdDRUU0TkFRc2dDRUlBTndJVUlBZ2dDRUVRYWtFRWNqWUNFQ0FJUVFocUlnUkNBRGNEQUNBSUlBczJBZ0FnQ0NBRU5nSUVBa0FnQVFSQUlBbEJFR29oQXdOQUFrQWdBU2dDRUNJRUlBdEtCRUFnQVNnQ0FDSUVEUUVnQVNFRERBUUxJQVFnQzA0TkF5QUJRUVJxSVFNZ0FTZ0NCQ0lFUlEwRElBTWhBUXNnQVNFRElBUWhBUXdBQ3dBTElBTWhBUXNnQ0VFRWNpQURLQUlBSWdZRWYwRUFCVUVnRU9vQklnWWdDellDRUNBR0lBRTJBZ2dnQmtJQU53SUFJQVpCR0dvaUFVSUFOd0lBSUFZZ0FUWUNGQ0FESUFZMkFnQWdDU2dDRENnQ0FDSUJCSDhnQ1NBQk5nSU1JQU1vQWdBRklBWUxJUUVnQ1NnQ0VDQUJFTW9CSUFrZ0NTZ0NGRUVCYWpZQ0ZDQUlLQUlJQ3hBR0lBaEJFR29nQ0NnQ0ZCQUdDeUFJUVNCcUpBQWdCa0VVYWlFR0l3QkJJR3NpQkNRQUlBUUNmd0pBSUFSQklHb2lBeUFFUVJWcUlnRnJJZ2hCQ1V3RVFDQUlRUUZCZ0I0b0FnQkJBVXRyU0EwQkN5QUJRVEU2QUFBZ0JDQUJRUUZxTmdJSVFRQU1BUXNnQkNBRE5nSUlRVDBMTmdJTUlBUW9BZ2doQ2lNQVFSQnJJZ3drQUNBRlFSaHFJUUVqQUVFUWF5SUpKQUFDUUNBS0lBUkJGV29pQzJzaUNFRnZUUVJBQWtBZ0NFRUtUUVJBSUFFZ0NEb0FDeUFCSVFNTUFRc2dBU0FJUVF0UEJIOGdDRUVRYWtGd2NTSURJQU5CQVdzaUF5QURRUXRHR3dWQkNndEJBV29pRFJEcUFTSUROZ0lBSUFFZ0RVR0FnSUNBZUhJMkFnZ2dBU0FJTmdJRUN3TkFJQW9nQzBjRVFDQURJQXN0QUFBNkFBQWdBMEVCYWlFRElBdEJBV29oQ3d3QkN3c2dDVUVBT2dBUElBTWdDUzBBRHpvQUFDQUpRUkJxSkFBTUFRc1E1d0VBQ3lBTVFSQnFKQUFnQkVFZ2FpUUFJQVVnQlVFSWFqWUNNQ0FGUVFocUlRTUNRQUpBSUFZb0FnUWlBUVJBSUFNb0FnQWdBeUFETFFBTElnUkJHSFJCR0hWQkFFZ2lDQnNoQ3lBREtBSUVJQVFnQ0JzaENDQUdRUVJxSVFNRFFBSkFBa0FDUUFKQUFrQUNRQ0FCS0FJVUlBRXRBQnNpQkNBRVFSaDBRUmgxUVFCSUlnb2JJZ1FnQ0NBRUlBaEpJZ3diSWdrRVFDQUxJQUZCRUdvaURTZ0NBQ0FOSUFvYklnb2dDUkRrQVNJTlJRUkFJQVFnQ0VzTkFnd0RDeUFOUVg5S0RRSU1BUXNnQkNBSVRRMENDeUFCS0FJQUlnUU5CQXdIQ3lBS0lBc2dDUkRrQVNJRURRRUxJQXdOQVF3R0N5QUVRWDlLRFFVTElBRkJCR29oQXlBQktBSUVJZ1JGRFFRZ0F5RUJDeUFCSVFNZ0JDRUJEQUFMQUFzZ0JrRUVhaUVCQ3lBQklRTUxJQVVnQXlnQ0FDSUVCSDlCQUFWQktCRHFBU0lFUVJCcUlRc0NRQ0FGS0FJd0lnZ3NBQXRCQUU0RVFDQUxJQWdwQWdBM0FnQWdDeUFJS0FJSU5nSUlEQUVMSUFzZ0NDZ0NBQ0FJS0FJRUVPd0JDeUFFSUFFMkFnZ2dCRUlBTndJQUlBUkJBRFlDSkNBRVFnQTNBaHdnQXlBRU5nSUFJQVlvQWdBb0FnQWlBUVIvSUFZZ0FUWUNBQ0FES0FJQUJTQUVDeUVCSUFZb0FnUWdBUkRLQVNBR0lBWW9BZ2hCQVdvMkFnaEJBUXM2QUR3Z0JTQUVOZ0k0SUFVb0FqZ2lBeUVCSUFNc0FDZEJmMHdFUUNBQktBSWNFT3NCQ3lBQklBVXBBeGczQWh3Z0FTQUZLQUlnTmdJa0lBVXNBQk5CZjB3RVFDQUZLQUlJRU9zQkN5QUZRVUJySkFBTElBZEIwQUJxSVE4akFFRVFheUlCSkFCQjdBQVE2Z0VpQ2tFRWFrRUFRZEFBRVBvQkdpQUtRZ0EzQWxRZ0NrSGNFRFlDQUNBS1FnQTNBbHdnQ2tJQU53SmtJQWRCNkFCcUlRa2pBRUhRQUdzaUF5UUFJQU1nQjBHQUFXb2lCU2tESURjRFNDQURRVUJySUFVcEF4ZzNBd0FnQXlBRktRTVFOd000SUFNZ0JTa0RDRGNETUNBRElBVXBBd0EzQXlnZ0FTQURRU2hxSUFOQkdHb1FPUUpBSUFFb0FnQU5BQ0FCUVFScUlSQWdBU3dBRDBGL1RBUkFJQkFvQWdBUTl3RUxJQU10QUI5QkFVY0VRRUVnRU9vQklnUkIrd29vQUFBMkFCQWdCRUh6Q2lrQUFEY0FDQ0FFUWVzS0tRQUFOd0FBSUFSQkFEb0FGQ0FCUVg4MkFnQWdFQ0FFUVJRUTdBRWdCQkQzQVF3QkN5QURMUUFnSVFZakFFRVFheUlFSkFBQ1FBSkFBa0FDUUNBR0RnSUFBUUlMUVRBUTZnRWlCa0lBTndJRUlBWkNBRGNDS0NBR1FjZ1BOZ0lBSUFaQ0FEY0NEQ0FHUWdBM0FoUWdCa0lBTndJY0lBWkJBRHNCSkNBRFFnQTNBZ2dnQTBJQU53SUFJQU1nQmpZQ0VBd0NDMEUwRU9vQklnWkNBRGNDQkNBR1FnQTNBaWdnQmtFQU5nSXdJQVpCK0EwMkFnQWdCa0lBTndJTUlBWkNBRGNDRkNBR1FnQTNBaHdnQmtFQU93RWtJQU5DQURjQ0NDQURRZ0EzQWdBZ0F5QUdOZ0lRREFFTFFTQVE2Z0VpQmtHcUN5Z0FBRFlBR0NBR1FhSUxLUUFBTndBUUlBWkJtZ3NwQUFBM0FBZ2dCa0dTQ3lrQUFEY0FBQ0FHUVFBNkFCd2dCRUYvTmdJQUlBUkJCSElpQ3lBR1FSd1E3QUVnQkN3QUR5RU1JQU1nQkNnQ0FEWUNBQ0FEUVFScUlRZ0NRQ0FNUVFCT0JFQWdDQ0FMS1FJQU53SUFJQWdnQ3lnQ0NEWUNDQXdCQ3lBSUlBUW9BZ1FnQkNnQ0NCRHNBUXNnQTBFQU5nSVFJQVFzQUE5QmYwd0VRQ0FFS0FJRUVPc0JDeUFHRU9zQkN5QUVRUkJxSkFBQ1FDQURLQUlBSWdRRVFDQUJJQVEyQWdBZ0F5d0FEMEVBVGdSQUlCQWdBMEVFY2lJRUtRSUFOd0lBSUJBZ0JDZ0NDRFlDQ0F3Q0N5QVFJQU1vQWdRZ0F5Z0NDQkRzQVF3QkN5QURLQUlRSVFZZ0EwRUFOZ0lRSUFZZ0NqWUNMQ01BUVNCcklnc2tBQ0FHSUFVMkFpQWdCaUFKTmdJb0lBWWdDallDQkNBQklBVWdDMEVRYWhBNUFrQWdBU2dDQUEwQUlBRkJCR29oQ0NBQkxBQVBRWDlNQkVBZ0NDZ0NBQkRyQVFzZ0N5MEFGeUlKSUFZZ0JpZ0NBQ2dDQ0JFQUFFY0VRRUhBQUJEcUFTSUVRZlVKTHdBQU93QXdJQVJCN1FrcEFBQTNBQ2dnQkVIbENTa0FBRGNBSUNBRVFkMEpLUUFBTndBWUlBUkIxUWtwQUFBM0FCQWdCRUhOQ1NrQUFEY0FDQ0FFUWNVSktRQUFOd0FBSUFSQkFEb0FNaUFCUVg4MkFnQWdDQ0FFUVRJUTdBRWdCQkRyQVF3QkN5QUdJQXN0QUJVaUJEb0FKQ0FHSUFzdEFCWWlCVG9BSlNBRVFRRnJRZjhCY1VFQ1R3UkFRU0FRNmdFaUJFSGlDaWtBQURjQURpQUVRZHdLS1FBQU53QUlJQVJCMUFvcEFBQTNBQUFnQkVFQU9nQVdJQUZCZXpZQ0FDQUlJQVJCRmhEc0FTQUVFT3NCREFFTEFrQWdCRUVDUncwQVFRSkJBeUFKR3lBRlR3MEFRU0FRNmdFaUJFSExDaWtBQURjQURpQUVRY1VLS1FBQU53QUlJQVJCdlFvcEFBQTNBQUFnQkVFQU9nQVdJQUZCZXpZQ0FDQUlJQVJCRmhEc0FTQUVFT3NCREFFTElBWW9BaUFnQkVFSWRDQUZjaUlFT3dFbUFrQWdCRUgvL3dOeFFZTUNTUTBBSUFzdUFScEJmMG9OQUNNQVFSQnJJZzBrQUVFa0VPb0JJZ1JDQURjQ0JDQUVRZ0EzQWhnZ0JFRVFhaUlGUWdBM0FnQWdCQ0FFUVFScU5nSUFJQVJCQURZQ0lDQUVJQVUyQWd3Z0RTQUVOZ0lJSUExQkFEWUNBQUpBQW44Z0JpZ0NJQ0VGSXdCQkVHc2lDU1FBQW44Q1FDQUVSUTBBSUEwZ0JUWUNBQ0FKUVFBMkFnUkJBRUVCSUFsQkJHb2dCUkFWUlEwQkdnSkFJQWtvQWdRaUV3UkFBMEJCQVNBSklBMG9BZ0FRRlVVTkEwRWNFT29CSWdWQ0FEY0NCQ0FGUVJCcUlneENBRGNDQUNBRklBVkJCR28yQWdBZ0JTQU1OZ0lNSUFVZ0NTZ0NBRFlDR0NBTklBVVFha1VOQWlBSklBVTJBZ2dDUUNBRUtBSWNJZ3dnQkNnQ0lFa0VRQ0FKUVFBMkFnZ2dEQ0FGTmdJQUlBUWdERUVFYWpZQ0hBd0JDMEVBSVFVQ1FBSkFBa0FnQkNnQ0hDQUVLQUlZSWc1clFRSjFJaEZCQVdvaURFR0FnSUNBQkVrRVFDQU1JQVFvQWlBZ0Rtc2lEa0VCZFNJU0lBd2dFa3NiUWYvLy8vOERJQTVCQW5WQi8vLy8vd0ZKR3lJT0JFQWdEa0dBZ0lDQUJFOE5BaUFPUVFKMEVPb0JJUVVMSUFrb0FnZ2hFaUFKUVFBMkFnZ2dCU0FSUVFKMGFpSU1JQkkyQWdBZ0JTQU9RUUowYWlFUklBeEJCR29oRWlBRUtBSWNJZ1VnQkNnQ0dDSU9SZzBDQTBBZ0JVRUVheUlGS0FJQUlSUWdCVUVBTmdJQUlBeEJCR3NpRENBVU5nSUFJQVVnRGtjTkFBc2dCQ0FSTmdJZ0lBUW9BaHdoQlNBRUlCSTJBaHdnQkNnQ0dDRU9JQVFnRERZQ0dDQUZJQTVHRFFNRFFDQUZRUVJySWdVb0FnQWhEQ0FGUVFBMkFnQWdEQVJBSUF4QkRHb2dEQ2dDRUJCcklBd2dEQ2dDQkJCc0lBd1E5d0VMSUFVZ0RrY05BQXNNQXdzUTV3RUFDeEQ0QVFBTElBUWdFVFlDSUNBRUlCSTJBaHdnQkNBTU5nSVlDeUFPQkVBZ0RoRDNBUXNMSUFrb0FnZ2hCU0FKUVFBMkFnZ2dCUVJBSUFWQkRHb2dCU2dDRUJCcklBVWdCU2dDQkJCc0lBVVE2d0VMSUJWQkFXb2lGU0FUUncwQUN3c2dEU0FFRUdvTUFnc2dCVUVNYWlBRktBSVFFR3NnQlNBRktBSUVFR3dnQlJEckFRdEJBQXNoQlNBSlFSQnFKQUFnQlFzRVFDQUdLQUlFSWdrb0FnUWhCU0FKSUFRMkFnUWdCUVJBSUFVUWFRc2dBVUlBTndJQUlBRkNBRGNDQ0F3QkMwRWdFT29CSWdWQnh3c3ZBQUE3QUJnZ0JVRy9DeWtBQURjQUVDQUZRYmNMS1FBQU53QUlJQVZCcndzcEFBQTNBQUFnQlVFQU9nQWFJQUZCZnpZQ0FDQUJRUVJxSUFWQkdoRHNBU0FGRVBjQklBMUJBRFlDQ0NBRUVHa0xJQTFCRUdva0FDQUJLQUlBRFFFZ0NDd0FDMEYvU2cwQUlBZ29BZ0FRNndFTElBWWdCaWdDQUNnQ0RCRUFBRVVFUUVFd0VPb0JJZ1JCdXdvdEFBQTZBQ0FnQkVHekNpa0FBRGNBR0NBRVFhc0tLUUFBTndBUUlBUkJvd29wQUFBM0FBZ2dCRUdiQ2lrQUFEY0FBQ0FFUVFBNkFDRWdBVUYvTmdJQUlBZ2dCRUVoRU93QklBUVE2d0VNQVFzZ0JpQUdLQUlBS0FJVUVRQUFSUVJBSUF0Qnlnc1FHeUVFSUFGQmZ6WUNBQ0FFTEFBTFFRQk9CRUFnQ0NBTEtRTUFOd0lBSUFnZ0N5Z0NDRFlDQ0F3Q0N5QUlJQVFvQWdBZ0JDZ0NCQkRzQVNBRUxBQUxRWDlLRFFFZ0JDZ0NBQkRyQVF3QkN5QUdJQVlvQWdBb0FoZ1JBQUJGQkVBZ0MwSDRDUkFiSVFRZ0FVRi9OZ0lBSUFRc0FBdEJBRTRFUUNBSUlBc3BBd0EzQWdBZ0NDQUxLQUlJTmdJSURBSUxJQWdnQkNnQ0FDQUVLQUlFRU93QklBUXNBQXRCZjBvTkFTQUVLQUlBRU9zQkRBRUxJQUZDQURjQ0FDQUJRZ0EzQWdnTElBdEJJR29rQUNBQktBSUFSUVJBSUJBc0FBdEJmMHdFUUNBUUtBSUFFUGNCQ3lBQlFnQTNBZ0FnQVVJQU53SUlDeUFHSUFZb0FnQW9BZ1FSQWdBTElBTW9BaEFoQkNBRFFRQTJBaEFnQkFSQUlBUWdCQ2dDQUNnQ0JCRUNBQXNnQXl3QUQwRi9TZzBBSUFNb0FnUVE5d0VMSUFOQjBBQnFKQUFDUUFKQUlBRW9BZ0FpQXdSQUlBOGdBellDQUNBUFFRUnFJUU1nQVN3QUQwRUFUZ1JBSUFNZ0FVRUVjaUlFS1FJQU53SUFJQU1nQkNnQ0NEWUNDQ0FQUVFBMkFoQU1BZ3NnQXlBQktBSUVJQUVvQWdnUTdBRWdBU3dBRHlFRElBOUJBRFlDRUNBRFFYOUtEUUVnQVNnQ0JCRHJBUXdCQ3lBQkxBQVBRWDlNQkVBZ0FTZ0NCQkRyQVFzZ0QwSUFOd0lBSUE4Z0NqWUNFQ0FQUWdBM0FnZ01BUXNnQ2lBS0tBSUFLQUlFRVFJQUN5QUJRUkJxSkFCQkFTRUJBa0FnQnlnQ1VBMEFJQWNvQW1BaUF5Z0NVQ0VMSUFjZ0F5Z0NaQ0FES0FKZ0lncHJJZ2xCREcwaUNEWUNURUVESVFFZ0F5Z0NHQ0FES0FJVUlnUnJRUUZJRFFBZ0JDZ0NBQ0lFUVg5R0RRQWdBeWdDQ0NBRVFRSjBhaWdDQUNJRlJRMEFRUVFoQVNBRkxRQVlRUU5IRFFCQkJTRUJBa0FnQlNnQ0hFRUZhdzRGQUFFQkFRQUJDMEVMSVFFZ0F5Z0NWQ0FGS0FJOFFRSjBhaWdDQUVFQlJ3MEFJQXNnQlNnQ1VDSUJSd1JBSUFGQjZBZHFJUUVNQVFzZ0J5QUpFUE1CSWdNMkFrZ0NRQ0FKUlEwQVFRQWhCQU5BSUFNZ0JFRU1iQ0lHYWlJQklBWWdDbW9pQmlnQ0FEWUNBQ0FCSUFZb0FnUTJBZ1FnQVNBR0tBSUlOZ0lJSUFSQkFXb2lCQ0FJUncwQUN5QUZMUUJVRFFBZ0NFRURiQ0lHUVFOeElRd2dCU2dDUkNFQlFRQWhCQ0FHUVFGclFRTlBCRUFnQmtGOGNTRUdBMEFnQXlBRVFRSjBJZ3BxSWcwZ0FTQU5LQUlBUVFKMGFpZ0NBRFlDQUNBRElBcEJCSEpxSWcwZ0FTQU5LQUlBUVFKMGFpZ0NBRFlDQUNBRElBcEJDSEpxSWcwZ0FTQU5LQUlBUVFKMGFpZ0NBRFlDQUNBRElBcEJESEpxSWdvZ0FTQUtLQUlBUVFKMGFpZ0NBRFlDQUNBRVFRUnFJUVFnQmtFRWF5SUdEUUFMQ3lBTVJRMEFBMEFnQXlBRVFRSjBhaUlHSUFFZ0JpZ0NBRUVDZEdvb0FnQTJBZ0FnQkVFQmFpRUVJQXhCQVdzaURBMEFDd3NnQnlBRktBSUFLQUlBSUFVb0FqQnFJZ0UyQWtRQ1FDQUNCRUFnQnlBSFFhd0JhallDUUNBSElBa1E4d0UyQWpnZ0J5QUhRY2dBYWpZQ05DQUhJQWRCeEFCcU5nSXdJQWNnQjBGQWF6WUNMQ0FISUFkQnpBQnFOZ0lvSUFkQkFEWUNJQ0FIUWdBM0F4Z2dCMElBTndNUUlBZENBRGNEQ0NBSFFnQTNBd0JCQUNFRUlBY29BaWdpQ1NnQ0FFRURiQVJBSUFjb0Fpd29BZ0FoQ2lBSEtBSTBLQUlBSVF3Z0J5Z0NNQ2dDQUNFREEwQkJxZ0ZCL3dGQmYwRWdJQW9vQWdCcmRrRUJkaUlCUVFGcUlnSWdBeUFNSUFSQkFuUnFJZ1lvQWdoQkRHeHFJZ1VvQWdBaUNFa2JRZFVBSUFFZ0NFa2JJZ2hCekFGeElBZ2dBaUFGS0FJRUlnMUpHeUFJUVROeElBRWdEVWtiSWdoQjhBRnhJQWdnQWlBRktBSUlJZ1ZKR3lBSVFROXhJQUVnQlVrYlFhb0JRZjhCSUFJZ0F5QUdLQUlFUVF4c2FpSUZLQUlBSWdoSkcwSFZBQ0FCSUFoSkd5SUlRY3dCY1NBSUlBSWdCU2dDQkNJTlNSc2dDRUV6Y1NBQklBMUpHeUlJUWZBQmNTQUlJQUlnQlNnQ0NDSUZTUnNnQ0VFUGNTQUJJQVZKRzBHcUFVSC9BU0FDSUFNZ0JpZ0NBRUVNYkdvaUJpZ0NBQ0lGU1J0QjFRQWdBU0FGU1JzaUJVSE1BWEVnQlNBQ0lBWW9BZ1FpQ0VrYklBVkJNM0VnQVNBSVNSc2lCVUh3QVhFZ0JTQUNJQVlvQWdnaUJra2JJQVZCRDNFZ0FTQUdTUnR4Y1VIQUVXb3RBQUJCQW5RZ0Iyb2lBU0FCS0FJRVFRTnFOZ0lFSUFSQkEyb2lCQ0FKS0FJQVFRTnNTUTBBQ3dzZ0J5Z0NEQ0VCSUFjZ0J5Z0NCQ0lDSUFjb0FnaHFJZ00yQWd3Z0J5Z0NFQ0VFSUFjZ0FTQURhaUlCTmdJUUlBY29BaFFoQXlBSElBRWdCR29pQVRZQ0ZDQUhLQUlZSVFRZ0J5QUJJQU5xSWdFMkFoZ2dCeWdDSENFRElBY2dBU0FFYWlJQk5nSWNJQWNnQVNBRGFqWUNJQ0FIUVFBMkFnUWdCeUFDTmdJSVFRQWhBeUFIS0FJb0lnd29BZ0JCQTJ3RVFDQUhLQUk0SVEwZ0J5Z0NTQ0VFSUFjb0Fpd29BZ0FoRHlBSEtBSTBLQUlBSVFZZ0J5Z0NNQ2dDQUNFRkEwQkJxZ0ZCL3dGQmYwRWdJQThvQWdCcmRrRUJkaUlCUVFGcUlnSWdCU0FHSUFOQkFuUWlDRUVJYWlJUWFpZ0NBRUVNYkdvaUNTZ0NBQ0lLU1J0QjFRQWdBU0FLU1JzaUNrSE1BWEVnQ2lBQ0lBa29BZ1FpRGtrYklBcEJNM0VnQVNBT1NSc2lDa0h3QVhFZ0NpQUNJQWtvQWdnaUNVa2JJQXBCRDNFZ0FTQUpTUnRCcWdGQi93RWdBaUFGSUFZZ0NFRUVhaUlPYWlnQ0FFRU1iR29pQ1NnQ0FDSUtTUnRCMVFBZ0FTQUtTUnNpQ2tITUFYRWdDaUFDSUFrb0FnUWlFVWtiSUFwQk0zRWdBU0FSU1JzaUNrSHdBWEVnQ2lBQ0lBa29BZ2dpQ1VrYklBcEJEM0VnQVNBSlNSdEJxZ0ZCL3dFZ0FpQUZJQVlnQ0dvb0FnQkJER3hxSWdrb0FnQWlDa2tiUWRVQUlBRWdDa2tiSWdwQnpBRnhJQW9nQWlBSktBSUVJaEZKR3lBS1FUTnhJQUVnRVVrYklncEI4QUZ4SUFvZ0FpQUpLQUlJSWdsSkd5QUtRUTl4SUFFZ0NVa2JjWEZCd0JGcUxRQUFRUUowSUFkcUlnRWdBU2dDQkNJQlFRTnFOZ0lFSUEwZ0FVRUNkR29pQVNBRUlBaHFLQUlBTmdJQUlBRWdCQ0FPYWlnQ0FEWUNCQ0FCSUFRZ0VHb29BZ0EyQWdnZ0EwRURhaUlESUF3b0FnQkJBMnhKRFFBTEN5QUhLQUpNSUFzZ0J5Z0NPQ0FIS0FKRUlBY1FBQ0FIS0FJNElRRWdCMEVBTmdJNElBRUVRQ0FCRVBZQkN5QUhLQUpJSVFNTUFRc2dCMEVBTmdJQUlBY2dDRUVEYkRZQ0JDQUlJQXNnQXlBQklBY1FBQXRCQUNFQklBZEJBRFlDU0NBRFJRMEFJQU1ROWdFTElBY29BbUFoQWlBSFFRQTJBbUFnQWdSQUlBSWdBaWdDQUNnQ0JCRUNBQXNnQnl3QVgwRi9UQVJBSUFjb0FsUVE5d0VMSUFkQjlBQnFJQWNvQW5nUUJTQUhRZWdBYWlBSEtBSnNFQVlnQUFSQUlBQVE5Z0VMSUFkQnNBRnFKQUFnQVFzcUFDQUJCRUFnQUNBQktBSUFFQVVnQUNBQktBSUVFQVVnQVVFVWFpQUJLQUlZRUFZZ0FSRDNBUXNMUkFBZ0FRUkFJQUFnQVNnQ0FCQUdJQUFnQVNnQ0JCQUdJQUVzQUNkQmYwd0VRQ0FCS0FJY0VQY0JDeUFCTEFBYlFYOU1CRUFnQVNnQ0VCRDNBUXNnQVJEM0FRc0w2UUVCQm44Q1FBSkFJQUVnQUNnQ0JDSUNJQUFvQWdBaUJHc2lCVXNFUUNBQklBVnJJZ1lnQUNnQ0NDSURJQUpyVFFSQUlBQWdCZ1IvSUFKQkFDQUdFUG9CSUFacUJTQUNDellDQkE4TElBRkJmMHdOQWtFQUlRSUNmeUFCSUFNZ0JHc2lBMEVCZENJSElBRWdCMHNiUWYvLy8vOEhJQU5CLy8vLy93TkpHeUlEQkVBZ0F4RHFBU0VDQ3lBQ0lBVnFDMEVBSUFZUStnRWFJQVZCQVU0RVFDQUNJQVFnQlJENUFSb0xJQUFnQWlBRGFqWUNDQ0FBSUFFZ0FtbzJBZ1FnQUNBQ05nSUFJQVJGRFFFZ0JCRDNBUThMSUFFZ0JVOE5BQ0FBSUFFZ0JHbzJBZ1FMRHdzUTV3RUFDOHdEQVFaL0lBTWdBbXNpQ0VFQlNBUkFEd3NDUUNBQUtBSUlJZ1lnQUNnQ0JDSUhheUFJVGdSQUlBY2dBV3NpQ1NBSVRnUkFJQWNoQlNBRElRWU1BZ3NnQnlFRklBTWdBaUFKYWlJR1J3UkFJQVloQkFOQUlBVWdCQzBBQURvQUFDQUZRUUZxSVFVZ0JFRUJhaUlFSUFOSERRQUxDeUFBSUFVMkFnUWdDVUVCVGcwQkR3c2dCeUFBS0FJQUlnUnJJQWhxSWdWQmYwb0VRQ0FCSUFScklRTWdBeUFGSUFZZ0JHc2lCa0VCZENJSklBVWdDVXNiUWYvLy8vOEhJQVpCLy8vLy93TkpHeUlHQkg4Z0JoRHFBUVZCQUFzaUJXb2dBaUFJRVBrQklRSWdBMEVCVGdSQUlBVWdCQ0FERVBrQkdnc2dBaUFJYWlFQ0lBRWdCMGNFUUFOQUlBSWdBUzBBQURvQUFDQUNRUUZxSVFJZ0FVRUJhaUlCSUFkSERRQUxJQUFvQWdBaEJBc2dBQ0FGSUFacU5nSUlJQUFnQWpZQ0JDQUFJQVUyQWdBZ0JBUkFJQVFROXdFTER3c1E1d0VBQ3lBSElBVWlCQ0FJYXlJRFN3UkFBMEFnQkNBRExRQUFPZ0FBSUFSQkFXb2hCQ0FEUVFGcUlnTWdCMGtOQUFzTElBQWdCRFlDQkNBRklBRWdDR3BySWdBRVFDQUZJQUJySUFFZ0FCRDdBUm9MSUFJZ0JrWUVRQThMSUFFaEJBTkFJQVFnQWkwQUFEb0FBQ0FFUVFGcUlRUWdBa0VCYWlJQ0lBWkhEUUFMQytRQ0FRaC9Ba0FnQVNnQ1dDSURSUTBBSUFNb0FnQkJBVWNOQUNBQUlBTW9BZ2dvQUFBMkFnUUNRQ0FBS0FJTUlBQW9BZ2dpQkd0QkFuVWlCU0FCTEFBWUlnSkpCRUFnQUVFSWFpQUNJQVZyRUFvZ0FTd0FHQ0VDSUFBb0FnZ2hCQXdCQ3lBQ0lBVlBEUUFnQUNBRUlBSkJBblJxTmdJTUMwRUJJUWdnQXlnQ0NDRURBa0FnQWtFQlNBUkFRUVFoQVF3QkN5QUNRUU54SVFVQ1FDQUNRUUZyUVFOSkJFQkJCQ0VCUVFBaEFnd0JDeUFDUVh4eElRbEJBQ0VDUVFRaEFRTkFJQVFnQWtFQ2RDSUdhaUFCSUFOcUlnY3FBQUE0QWdBZ0JDQUdRUVJ5YWlBSEtnQUVPQUlBSUFRZ0JrRUljbW9nQnlvQUNEZ0NBQ0FFSUFaQkRISnFJQWNxQUF3NEFnQWdBa0VFYWlFQ0lBRkJFR29oQVNBSlFRUnJJZ2tOQUFzTElBVkZEUUFEUUNBRUlBSkJBblJxSUFFZ0Eyb3FBQUE0QWdBZ0FrRUJhaUVDSUFGQkJHb2hBU0FGUVFGcklnVU5BQXNMSUFBZ0FTQURhaW9BQURnQ0ZBc2dDQXYvQVFFSGZ5QUJJQUFvQWdnaUJTQUFLQUlFSWdKclFRSjFUUVJBSUFBZ0FRUi9JQUpCQUNBQlFRSjBJZ0FRK2dFZ0FHb0ZJQUlMTmdJRUR3c0NRQ0FDSUFBb0FnQWlCR3NpQmtFQ2RTSUhJQUZxSWdOQmdJQ0FnQVJKQkVCQkFDRUNBbjhnQXlBRklBUnJJZ1ZCQVhVaUNDQURJQWhMRzBILy8vLy9BeUFGUVFKMVFmLy8vLzhCU1JzaUF3UkFJQU5CZ0lDQWdBUlBEUU1nQTBFQ2RCRHFBU0VDQ3lBSFFRSjBJQUpxQzBFQUlBRkJBblFpQVJENkFTQUJhaUVCSUFaQkFVNEVRQ0FDSUFRZ0JoRDVBUm9MSUFBZ0FpQURRUUowYWpZQ0NDQUFJQUUyQWdRZ0FDQUNOZ0lBSUFRRVFDQUVFUGNCQ3c4TEVPY0JBQXNRK0FFQUM0Y0NBUVYvSUFGQkFUWUNBQ0FCUVFocUlRUWdBU2dDRENBQktBSUlJZ05ySWdKQmUwMEVmeUFFSUFKQkJHb1FCeUFCSUFFcEF5QkNBWHczQXlBZ0FTZ0NDQVVnQXdzZ0Ftb2dBQ2dDQkRZQUFDQUFLQUlJSWdJZ0FDZ0NERWNFUUVFQUlRTURRQ0FDSUFOQkFuUnFJUVlnQVNnQ0RDQUJLQUlJSWdKcklnVkJlMDBFZnlBRUlBVkJCR29RQnlBQklBRXBBeUJDQVh3M0F5QWdBU2dDQ0FVZ0Fnc2dCV29nQmlnQ0FEWUFBQ0FEUVFGcUlnTWdBQ2dDRENBQUtBSUlJZ0pyUVFKMVNRMEFDd3NnQVNnQ0RDQUJLQUlJSWdOcklnSkJlMDBFZnlBRUlBSkJCR29RQnlBQklBRXBBeUJDQVh3M0F5QWdBU2dDQ0FVZ0F3c2dBbW9nQUNnQ0ZEWUFBQXVBRWdNUGZ3SjlCWDRnQWlnQ0FDQUNLQUlFUmdSQUlBTW9BbEFoQlNBREtBSXdJUVFnQXlnQ0FDZ0NBQ0VESUFBaUFpZ0NCQ0VHSUFJcUFoUWhGRUYvSUFFc0FCZ2lCMEVDZENBSFFmLy8vLzhEY1NBSFJ4c1E2Z0VoQ3dKQUFrQWdCVVVOQUNBQktBSUFJUWtnQVNrRE1DRVZJQUVvQWtRaENDQUJMUUJVSVFBZ0FTa0RLQ0lXcHlFS0lBZEJBVTRFUUNBRElBUnFJUTVCZnlBR2RFRi9jN0lnRkpVaEZDQUFSUVJBSUFkQmZuRWhBU0FIUVFGeElSQkJBQ0VEQTBBZ0N5QUpLQUlBSUJZZ0NDQU1RUUowYWpVQ0FINGdGWHluYWlBS0VQa0JJUVlnQWlnQ0NDRVBRUUFoQkNBQklRQWdCMEVCUndSQUEwQWdEaUFEUVFKMGFpSVJBbjhnRkNBR0lBUkJBblFpRFdvcUFnQWdEU0FQYWlvQ0FKT1VRd0FBQUQrU2ppSVRpME1BQUFCUFhRUkFJQk9vREFFTFFZQ0FnSUI0Q3pZQ0FDQVJBbjhnRkNBR0lBMUJCSElpRFdvcUFnQWdEU0FQYWlvQ0FKT1VRd0FBQUQrU2ppSVRpME1BQUFCUFhRUkFJQk9vREFFTFFZQ0FnSUI0Q3pZQ0JDQUVRUUpxSVFRZ0EwRUNhaUVESUFCQkFtc2lBQTBBQ3dzZ0VBUkFJQTRnQTBFQ2RHb0NmeUFVSUFZZ0JFRUNkQ0lBYWlvQ0FDQUFJQTlxS2dJQWs1UkRBQUFBUDVLT0loT0xRd0FBQUU5ZEJFQWdFNmdNQVF0QmdJQ0FnSGdMTmdJQUlBTkJBV29oQXdzZ0RFRUJhaUlNSUFWSERRQUxEQUlMSUFkQmZuRWhBU0FIUVFGeElROGdCYTBoR0VFQUlRTURRQ0FMSUFrb0FnQWdGaUFYZmlBVmZLZHFJQW9RK1FFaEJTQUNLQUlJSVFoQkFDRUVJQUVoQUNBSFFRRkhCRUFEUUNBT0lBTkJBblJxSWd3Q2Z5QVVJQVVnQkVFQ2RDSUdhaW9DQUNBR0lBaHFLZ0lBazVSREFBQUFQNUtPSWhPTFF3QUFBRTlkQkVBZ0U2Z01BUXRCZ0lDQWdIZ0xOZ0lBSUF3Q2Z5QVVJQVVnQmtFRWNpSUdhaW9DQUNBR0lBaHFLZ0lBazVSREFBQUFQNUtPSWhPTFF3QUFBRTlkQkVBZ0U2Z01BUXRCZ0lDQWdIZ0xOZ0lFSUFSQkFtb2hCQ0FEUVFKcUlRTWdBRUVDYXlJQURRQUxDeUFQQkVBZ0RpQURRUUowYWdKL0lCUWdCU0FFUVFKMElnQnFLZ0lBSUFBZ0NHb3FBZ0NUbEVNQUFBQS9rbzRpRTR0REFBQUFUMTBFUUNBVHFBd0JDMEdBZ0lDQWVBczJBZ0FnQTBFQmFpRURDeUFYUWdGOEloY2dHRklOQUFzTUFRc2dBRVVFUUVFQUlRTWdCVUVCUndSQUlBVkJmbkVoQkFOQUlBc2dDU2dDQUNBV0lBZ2dBMEVDZENJQWFqVUNBSDRnRlh5bmFpQUtFUGtCSUFrb0FnQWdGaUFJSUFCQkJISnFOUUlBZmlBVmZLZHFJQW9RK1FFYUlBTkJBbW9oQXlBRVFRSnJJZ1FOQUFzTElBVkJBWEZGRFFFZ0N5QUpLQUlBSUJZZ0NDQURRUUowYWpVQ0FINGdGWHluYWlBS0VQa0JFS0FCREFJTElBV3RJaGhDQVlNaEdTQUZRUUZIQkVBZ0dFTCsvLy8vRDRNaEdBTkFJQXNnQ1NnQ0FDQVdJQmQrSUJWOHAyb2dDaEQ1QVNBSktBSUFJQllnRjBJQmhINGdGWHluYWlBS0VQa0JHaUFYUWdKOElSY2dHRUlDZlNJWVVFVU5BQXNMSUJsUURRQWdDeUFKS0FJQUlCWWdGMzRnRlh5bmFpQUtFUGtCR2dzZ0N4Q2dBUXRCQVE4TElBTW9BakFoQkNBREtBSUFLQUlBSVFnZ0FDSURLQUlFSVF3Z0F5b0NGQ0VVUVg4Z0FTd0FHQ0lIUVFKMElBZEIvLy8vL3dOeElBZEhHeERxQVNFTEFrQUNRQ0FDS0FJRUlBSW9BZ0FpQldzaUFFVU5BQ0FCS0FJQUlRa2dBU2tETUNFVklBRW9Ba1FoQmlBQkxRQlVJUUlnQVNrREtDSVdweUVLSUFCQkFuVWlBRUVCSUFCQkFVc2JJUTRDUUNBSFFRRk9CRUFnQkNBSWFpRVBRWDhnREhSQmYzT3lJQlNWSVJRZ0FrVU5BU0FIUVg1eElRRWdCMEVCY1NFUVFRQWhBa0VBSVFnRFFDQUxJQWtvQWdBZ0ZpQUZJQWhCQW5ScU5RSUFmaUFWZktkcUlBb1ErUUVoQmlBREtBSUlJUXhCQUNFRUlBRWhBQ0FIUVFGSEJFQURRQ0FQSUFKQkFuUnFJaEVDZnlBVUlBWWdCRUVDZENJTmFpb0NBQ0FNSUExcUtnSUFrNVJEQUFBQVA1S09JaE9MUXdBQUFFOWRCRUFnRTZnTUFRdEJnSUNBZ0hnTE5nSUFJQkVDZnlBVUlBWWdEVUVFY2lJTmFpb0NBQ0FNSUExcUtnSUFrNVJEQUFBQVA1S09JaE9MUXdBQUFFOWRCRUFnRTZnTUFRdEJnSUNBZ0hnTE5nSUVJQVJCQW1vaEJDQUNRUUpxSVFJZ0FFRUNheUlBRFFBTEN5QVFCRUFnRHlBQ1FRSjBhZ0ovSUJRZ0JpQUVRUUowSWdCcUtnSUFJQUFnREdvcUFnQ1RsRU1BQUFBL2tvNGlFNHREQUFBQVQxMEVRQ0FUcUF3QkMwR0FnSUNBZUFzMkFnQWdBa0VCYWlFQ0N5QUlRUUZxSWdnZ0RrY05BQXNNQWdzZ0FnUkFRUUFoQWlBQVFRSlBCRUFnRGtGK2NTRUVBMEFnQ3lBSktBSUFJQllnQlNBQ1FRSjBJZ0JxTlFJQWZpQVZmS2RxSUFvUStRRWdDU2dDQUNBV0lBVWdBRUVFY21vMUFnQitJQlY4cDJvZ0NoRDVBUm9nQWtFQ2FpRUNJQVJCQW1zaUJBMEFDd3NnRGtFQmNVVU5BaUFMSUFrb0FnQWdGaUFGSUFKQkFuUnFOUUlBZmlBVmZLZHFJQW9RK1FFUW9BRU1Bd3RCQUNFQ0lBQkJBazhFUUNBT1FYNXhJUVFEUUNBTElBa29BZ0FnRmlBR0lBVWdBa0VDZENJQWFpZ0NBRUVDZEdvMUFnQitJQlY4cDJvZ0NoRDVBU0FKS0FJQUlCWWdCaUFGSUFCQkJISnFLQUlBUVFKMGFqVUNBSDRnRlh5bmFpQUtFUGtCR2lBQ1FRSnFJUUlnQkVFQ2F5SUVEUUFMQ3lBT1FRRnhSUTBCSUFzZ0NTZ0NBQ0FXSUFZZ0JTQUNRUUowYWlnQ0FFRUNkR28xQWdCK0lCVjhwMm9nQ2hENUFSb01BUXNnQjBGK2NTRUJJQWRCQVhFaEVVRUFJUUpCQUNFSUEwQWdDeUFKS0FJQUlCWWdCaUFGSUFoQkFuUnFLQUlBUVFKMGFqVUNBSDRnRlh5bmFpQUtFUGtCSVF3Z0F5Z0NDQ0VOUVFBaEJDQUJJUUFnQjBFQlJ3UkFBMEFnRHlBQ1FRSjBhaUlTQW44Z0ZDQU1JQVJCQW5RaUVHb3FBZ0FnRFNBUWFpb0NBSk9VUXdBQUFEK1NqaUlUaTBNQUFBQlBYUVJBSUJPb0RBRUxRWUNBZ0lCNEN6WUNBQ0FTQW44Z0ZDQU1JQkJCQkhJaUVHb3FBZ0FnRFNBUWFpb0NBSk9VUXdBQUFEK1NqaUlUaTBNQUFBQlBYUVJBSUJPb0RBRUxRWUNBZ0lCNEN6WUNCQ0FFUVFKcUlRUWdBa0VDYWlFQ0lBQkJBbXNpQUEwQUN3c2dFUVJBSUE4Z0FrRUNkR29DZnlBVUlBd2dCRUVDZENJQWFpb0NBQ0FBSUExcUtnSUFrNVJEQUFBQVA1S09JaE9MUXdBQUFFOWRCRUFnRTZnTUFRdEJnSUNBZ0hnTE5nSUFJQUpCQVdvaEFnc2dDRUVCYWlJSUlBNUhEUUFMQ3lBTEVLQUJDMEVCQzlZREFnNS9BWDBnQWlnQ0hFRUpSZ1JBSUFBb0FnUWhDRUYvSUFJc0FCZ2lCMEVDZENJR0lBZEIvLy8vL3dOeElBZEhHeERxQVNFRUFrQkJmeUFJZENJSVFYNUtEUUFnQWlnQ1VDSUpSUVJBUVFFaEJRd0JDeUFIUVFCTUJFQkJBU0VGSUFsQkFVY0VRQ0FKUVg1eElRRURRQ0FDS0FKQUtBSUFJQU5xSUFRZ0JoRDVBUm9nQXlBR2FpSUFJQUlvQWtBb0FnQnFJQVFnQmhENUFSb2dBQ0FHYWlFRElBRkJBbXNpQVEwQUN3c2dDVUVCY1VVTkFTQUNLQUpBS0FJQUlBTnFJQVFnQmhENUFSb01BUXNnQVNnQ0FDZ0NBQ0FCS0FJd2FpRU1JQUFxQWhRZ0NFRi9jN0tWSVJFZ0IwRitjU0VJSUFkQkFYRWhEZ05BSUFBb0FnZ2hDMEVBSVFVZ0NDRUJJQWRCQVVjRVFBTkFJQVFnQlVFQ2RDSUthaUFSSUF3Z0EwRUNkR29pRHlnQ0FMS1VJQW9nQzJvcUFnQ1NPQUlBSUFRZ0NrRUVjaUlLYWlBUklBOG9BZ1N5bENBS0lBdHFLZ0lBa2pnQ0FDQUZRUUpxSVFVZ0EwRUNhaUVESUFGQkFtc2lBUTBBQ3dzZ0RnUkFJQVFnQlVFQ2RDSUJhaUFSSUF3Z0EwRUNkR29vQWdDeWxDQUJJQXRxS2dJQWtqZ0NBQ0FEUVFGcUlRTUxJQUlvQWtBb0FnQWdEV29nQkNBR0VQa0JHaUFHSUExcUlRMUJBU0VGSUJCQkFXb2lFQ0FKUncwQUN3c2dCQkRyQVFzZ0JRdVJBUUlEZndGK0l3QkJFR3NpQWlRQUFrQWdBQ2dDQkNJRFFYOUdEUUFnQVNrREVFSUFWUTBBSUFFZ0FTZ0NCQ0FBS0FJSUlBQW9BZ3dRQ0NBQktRTVFRZ0ZaRFFBZ0FTQUJLQUlFSUFCQkZHb2lCQ0FFUVFScUVBZ2dBU2tERUNFRklBSWdBQ2dDQkRvQUR5QUZRZ0JWRFFBZ0FTQUJLQUlFSUFKQkQyb2dBa0VRYWhBSUN5QUNRUkJxSkFBZ0EwRi9Sd3VEQWdJRGZ3SitBa0FnQUNnQ0RDSUVJQUFvQWdnaUEydEJBblVpQlNBQkxBQVlJZ0ZKQkVBZ0FFRUlhaUFCSUFWckVBb2dBQ2dDQ0NFRElBQW9BZ3doQkF3QkN5QUJJQVZQRFFBZ0FDQURJQUZCQW5ScUlnUTJBZ3dMUVFBaEFRSkFJQUlwQXdnZ0Fpa0RFQ0lHSUFRZ0Eyc2lCSzBpQjN4VERRQWdBeUFDS0FJQUlBYW5haUFFRVBrQkdpQUNJQUlwQXhBZ0Izd2lCamNERUNBQ0tRTUlJQVpDQkh4VERRQWdBQ0FDS0FJQUlBYW5haWdBQURZQ0ZDQUNJQUlwQXhBaUIwSUVmQ0lHTndNUUlBSXBBd2dnQmxjTkFDQUNLQUlBSUFhbmFpMEFBQ0VESUFJZ0IwSUZmRGNERUNBRFFRRnJRUjFMRFFBZ0FDQUROZ0lFUVFFaEFRc2dBUXVDQWdFRWZ5TUFRU0JySWdNa0FDQUFJQUVnQUNnQ0FDZ0NMQkVCQUNFRUlBQWdBU0FBS0FJQUtBSW9FUUVBSVFVZ0EwSUFOd0lZSUFOQ0FEY0NFQ0FCS0FJNElRWWdCVUVCYXlJQVFRdFBCSDlCQUNBRWF3VWdBRUVDZEVINEcyb29BZ0FnQkd3TElRRkI0QUFRNmdFaUFFRUFOZ0lBSUFBZ0F5a0NERGNDQkNBQUlBTXBBaFEzQWd3Z0FDQURLQUljTmdJVUlBQkJBRFlDV0NBQVFRQTJBandnQUNBR05nSTRJQUJDQURjRE1DQUFJQUdzTndNb0lBQkJBRG9BSUNBQUlBVTJBaHdnQUNBRU9nQVlJQUJDQURjRFFDQUFRZ0EzQTBnZ0FFSUFOd0JOSUFBZ0FoQVJHaUFBUVFFNkFGUWdBQ0FBS0FKRU5nSklJQU5CSUdva0FDQUFDOHdCQWdKL0FuNGdBQ2dDUUNJQ1JRUkFRU0FRNmdFaUFrSUFOd01RSUFKQkFEWUNDQ0FDUWdBM0F3QWdBa0lBTndNWUlBQWdBallDUUF0Q2dJQ0FnSEFoQkNBQUtBSWNRUUZySWdOQkNrMEVmaUFEUVFOMFFjZ2FhaWtEQUFWQ2dJQ0FnSEFMSUFBd0FCaCtRaUNISWdVZ0FhMStJZ1JDQUZrRVFDQUNJQVNuRUFjZ0FrRVlhaUFDS1FNWVFnRjhOd01BSUFBZ0FDZ0NRQ0lDTmdJQUlBQWdBaWtERURjRENDQUFJQUlwQXhnM0F4QWdBQ0FGTndNb0lBQkNBRGNETUNBQUlBRTJBbEFMSUFSQ2YxVUx1UUlCQlg4Z0FpQUJheUlEUVFKMUlnWWdBQ2dDQ0NJRklBQW9BZ0FpQkd0QkFuVk5CRUFnQVNBQklBQW9BZ1FpQlNBRWF5SURhaUFDSUFZZ0EwRUNkU0lIU3hzaUEwY0VRQU5BSUFRZ0FTZ0NBRFlDQUNBRVFRUnFJUVFnQVVFRWFpSUJJQU5IRFFBTEN5QUdJQWRMQkVBZ0FDQUNJQU5ySWdCQkFVNEVmeUFGSUFNZ0FCRDVBU0FBYWdVZ0JRczJBZ1FQQ3lBQUlBUTJBZ1FQQ3lBRUJFQWdBQ0FFTmdJRUlBUVE5d0VnQUVFQU5nSUlJQUJDQURjQ0FFRUFJUVVMQWtBZ0EwRi9UQTBBSUFZZ0JVRUJkU0lDSUFJZ0Jra2JRZi8vLy84RElBVkJBblZCLy8vLy93RkpHeUlDUVlDQWdJQUVUdzBBSUFBZ0FrRUNkQ0lFRU9vQklnSTJBZ0FnQUNBQ05nSUVJQUFnQWlBRWFqWUNDQ0FBSUFOQkFVNEVmeUFDSUFFZ0F4RDVBU0FEYWdVZ0FnczJBZ1FQQ3hEbkFRQUxFZ0FnQUNBQ05nSWdJQUFnQVRZQ0hFRUJDOU1HQWd4L0JINGpBRUVnYXlJREpBQUNRQUpBSUFBb0Fod3RBQ1JCQVUwRVFDQUJLUU1RSWc5Q0JId2lFQ0FCS1FNSVZRMENJQUVvQWdBZ0Q2ZHFLQUFBSVFZZ0FTQVFOd01RREFFTFFRRWdBMEVjYWlBQkVCVkZEUUVnQXlnQ0hDRUdDeUFHUlEwQUlBYXRJQUVwQXdnZ0FTa0RFSDFDQlg1VkRRQUNRQ0FBS0FJSUlBQW9BZ1FpQjJ0QkFuVWlBaUFHU1FSQUlBQkJCR29nQmlBQ2F4QUtEQUVMSUFJZ0JrME5BQ0FBSUFjZ0JrRUNkR28yQWdnTElBQkJFR29oQ2lBQUtBSWdJUWNEUUFKQUlBRXBBd2dpRUNBQktRTVFJZzlYRFFBZ0FTZ0NBQ0lDSUErbmFpMEFBQ0VKSUFFZ0QwSUJmQ0lPTndNUUlBNGdFRmtOQUNBQ0lBNm5haTBBQUNFTElBRWdEMElDZkNJT053TVFJQTRnRUZrTkFDQUNJQTZuYWkwQUFDRUZJQUVnRDBJRGZDSU9Od01RSUE0Z0VGa05BQ0FDSUE2bmFpMEFBQ0VNSUFFZ0QwSUVmQ0lSTndNUUlBbEJCRXNOQUNBTFFRRnJJZ1JCL3dGeFFRcExJZzBOQUNBRlJRMEFJQU5DQURjQ0RDQURRZ0EzQWhSQ2Z5RU9JQTFGQkVBZ0JFRVlkRUVZZFVFRGRFR2dHMm9wQXdBaERnc0NRQ0FBS0FJY0x3RWtJZ1JCQ0hRZ0JFRUlkbkpCLy84RGNVR0NBazBFUUNBUUlBOUNCbndpRDFNTkFpQUNJQkduYWk4QUFDRUVJQUVnRHpjREVDQURJQVEyQWdRTUFRdEJBU0FEUVFScUlBRVFGVVVOQVNBREtBSUVJUVFMUWVBQUVPb0JJZ0pCQURZQ0FDQUNJQU1wQWdnM0FnUWdBaUFES1FJUU53SU1JQUlnQXlnQ0dEWUNGQ0FDUVFBMkFsZ2dBaUFFTmdJOElBSWdDVFlDT0NBQ1FnQTNBekFnQWlBRnJVTC9BWU1nRG41Q0lJWkNJSWMzQXlnZ0FpQU1RUUJIT2dBZ0lBSWdDellDSENBQ0lBVTZBQmdnQWtJQU53TkFJQUpDQURjRFNDQUNRZ0EzQUUwZ0J5QUhLQUlNSUFjb0FnaHJRUUoxSUFJZ0J5Z0NBQ2dDQ0JFRkFDQUhLQUlJSWdJZ0J5Z0NEQ0FDYTBFQ2RTSUNRUUZySWdWQkFuUWlDV29vQWdBZ0JEWUNQQ0FBS0FJRUlBaEJBblJxSUFVMkFnQUNRQ0FDSUFBb0FoUWdBQ2dDRUNJRWEwRUNkU0lGVEEwQUlBTkJmellDQUNBQ0lBVkxCRUFnQ2lBQ0lBVnJJQU1RRmlBS0tBSUFJUVFNQVFzZ0FpQUZUdzBBSUFBZ0JDQUNRUUowYWpZQ0ZBc2dCQ0FKYWlBSU5nSUFRUUVoQWlBSVFRRnFJZ2dnQmtrTkFRd0NDd3RCQUNFQ0N5QURRU0JxSkFBZ0FndHJBZ0ovQVg0Q1FDQUFRUVZMRFFBZ0Fpa0RFQ0lGSUFJcEF3aFpEUUFnQWlnQ0FDQUZwMm90QUFBaEF5QUNJQVZDQVh3M0F4QWdBU0FEUVlBQmNRUi9JQUJCQVdvZ0FTQUNFQlZGRFFFZ0EwSC9BSEVnQVNnQ0FFRUhkSElGSUFNTE5nSUFRUUVoQkFzZ0JBdXpCQUVJZnlBQklBQW9BZ2dpQlNBQUtBSUVJZ1JyUVFKMVRRUkFBa0FnQVVVTkFDQUJRUUowSVFZZ0JDRURJQUZCQW5SQkJHc2lCVUVDZGtFQmFrRUhjU0lCQkVBRFFDQURJQUlvQWdBMkFnQWdBMEVFYWlFRElBRkJBV3NpQVEwQUN3c2dCQ0FHYWlFRUlBVkJIRWtOQUFOQUlBTWdBaWdDQURZQ0FDQURJQUlvQWdBMkFnUWdBeUFDS0FJQU5nSUlJQU1nQWlnQ0FEWUNEQ0FESUFJb0FnQTJBaEFnQXlBQ0tBSUFOZ0lVSUFNZ0FpZ0NBRFlDR0NBRElBSW9BZ0EyQWh3Z0EwRWdhaUlESUFSSERRQUxDeUFBSUFRMkFnUVBDd0pBSUFRZ0FDZ0NBQ0lHYXlJSVFRSjFJZ1FnQVdvaUEwR0FnSUNBQkVrRVFDQURJQVVnQm1zaUJVRUJkU0lISUFNZ0Iwc2JRZi8vLy84RElBVkJBblZCLy8vLy93RkpHeUlGQkg4Z0JVR0FnSUNBQkU4TkFpQUZRUUowRU9vQkJVRUFDeUlISUFSQkFuUnFJZ1FoQXlBQlFRSjBJZ2xCQkdzaUNrRUNka0VCYWtFSGNTSUJCRUFnQkNFREEwQWdBeUFDS0FJQU5nSUFJQU5CQkdvaEF5QUJRUUZySWdFTkFBc0xJQVFnQ1dvaEFTQUtRUnhQQkVBRFFDQURJQUlvQWdBMkFnQWdBeUFDS0FJQU5nSUVJQU1nQWlnQ0FEWUNDQ0FESUFJb0FnQTJBZ3dnQXlBQ0tBSUFOZ0lRSUFNZ0FpZ0NBRFlDRkNBRElBSW9BZ0EyQWhnZ0F5QUNLQUlBTmdJY0lBTkJJR29pQXlBQlJ3MEFDd3NnQ0VFQlRnUkFJQWNnQmlBSUVQa0JHZ3NnQUNBSElBVkJBblJxTmdJSUlBQWdBVFlDQkNBQUlBYzJBZ0FnQmdSQUlBWVE5d0VMRHdzUTV3RUFDeEQ0QVFBTGdBRUJBbjhnQUFSQUlBQW9BbGdoQVNBQVFRQTJBbGdnQVFSQUlBRW9BZ2dpQWdSQUlBRWdBallDRENBQ0VQY0JDeUFCRVBjQkN5QUFLQUpFSWdFRVFDQUFJQUUyQWtnZ0FSRDNBUXNnQUNnQ1FDRUJJQUJCQURZQ1FDQUJCRUFnQVNnQ0FDSUNCRUFnQVNBQ05nSUVJQUlROXdFTElBRVE5d0VMSUFBUTl3RUxDNDREQWdkL0EzNGpBRUVRYXlJRUpBQUNRQ0FCS1FNUUlna2dBU2tEQ0ZrTkFDQUFJQUVvQWdBZ0NhZHFMUUFBT2dBTUlBRWdBU2tERUNJSlFnRjhJZ28zQXhBQ1FDQUJMd0VtUVlFRVRRUkFJQUVwQXdnaUN5QUpRZ1Y4SWdsVERRSWdBU2dDQUNBS3Ayb29BQUFoQWlBQklBazNBeEFNQVF0QkFTQUVRUXhxSUFFUUZVVU5BU0FCS1FNUUlRa2dBU2tEQ0NFTElBUW9BZ3doQWdzZ0FxMGlDaUFMSUFsOVZRMEFJQUpCQVVnTkFDQUFJQUVvQWdBZ0NhZHFJZ1UyQWdBZ0FBSi9JQVVnQWtFQmF5SUdhaUlITFFBQUlnaEJQMDBFUUNBQUlBWTJBZ1FnQnkwQUFFRS9jUXdCQ3dKQUFrQWdDRUVHZGtFQmF3NENBQUVEQ3lBQ1FRSklEUUlnQUNBQ1FRSnJOZ0lFSUFJZ0JXcEJBbXNpQWkwQUFVRUlkRUdBL2dCeElBSXRBQUJ5REFFTElBSkJBMGdOQVNBQUlBSkJBMnMyQWdRZ0FpQUZha0VEYXlJQ0xRQUNRUkIwUVlDQS9BRnhJQUl0QUFGQkNIUnlJQUl0QUFCeUMwR0FJR29pQURZQ0NDQUFRZi8vUDBzTkFDQUJJQWtnQ253M0F4QkJBU0VEQ3lBRVFSQnFKQUFnQXdza0FRRi9JQUJCakJFMkFnQWdBQ2dDQ0NJQkJFQWdBQ0FCTmdJTUlBRVE5d0VMSUFBTG53SUJDSDhnQUVFRWFpRUdBa0FDUUNBQUtBSUVJZ0JGRFFBZ0FTZ0NBQ0FCSUFFdEFBc2lCRUVZZEVFWWRVRUFTQ0lDR3lFSElBRW9BZ1FnQkNBQ0d5RURJQVloQWdOQUFrQWdBeUFBS0FJVUlBQXRBQnNpQVNBQlFSaDBRUmgxUVFCSUlna2JJZ2dnQXlBSVNTSUZHeUlFQkVBZ0FFRVFhaUlCS0FJQUlBRWdDUnNnQnlBRUVPUUJJZ0VOQVF0QmZ5QUZJQU1nQ0VzYklRRUxJQUlnQUNBQlFRQklHeUVDSUFBZ0FVRWRka0VFY1dvb0FnQWlBQTBBQ3lBQ0lBWkdEUUFDUUNBQ0tBSVVJQUl0QUJzaUFDQUFRUmgwUVJoMVFRQklJZ1FiSWdVZ0F5QURJQVZMR3lJQkJFQWdCeUFDUVJCcUlnQW9BZ0FnQUNBRUd5QUJFT1FCSWdBTkFRc2dBeUFGU1EwQkRBSUxJQUJCZjBvTkFRc2dCaUVDQ3lBQ0MzY0JBMzhnQVJEOEFTSUNRWEJKQkVBQ1FBSkFJQUpCQzA4RVFDQUNRUkJxUVhCeElnUVE2Z0VoQXlBQUlBUkJnSUNBZ0hoeU5nSUlJQUFnQXpZQ0FDQUFJQUkyQWdRTUFRc2dBQ0FDT2dBTElBQWhBeUFDUlEwQkN5QURJQUVnQWhENUFSb0xJQUlnQTJwQkFEb0FBQ0FBRHdzUTV3RUFDeXdBSUFBZ0FUWUNCQ0FCS0FJRUtBSUlJQUpCQW5ScUtBSUFJUUVnQUNBQ05nSU1JQUFnQVRZQ0NFRUJDeElBSUFCQmZ6WUNEQ0FBSUFFMkFnaEJBUXRBQVFKL0FrQWdBQ2dDQ0NJRUxBQVlRUUZJRFFBZ0JDQUJLQUlFSUFFb0FnQnJRUUoxRUJGRkRRQWdBQ0FCSUFJZ0FDZ0NBQ2dDSUJFREFDRURDeUFEQ3dRQVFRRUxCQUJCQVF2MkFRRUZmd0pBSUFBb0FnZ2lBaTBBVkEwQUlBQW9BaEFpQVVVTkFDQUJMUUJVUlEwQUlBSW9Ba2doQXlBQ0tBSkVJUVFnQVVFQU9nQlVBa0FnQXlBRWEwRUNkU0lESUFFb0FrZ2dBU2dDUkNJRmEwRUNkU0lFU3dSQUlBRkJ4QUJxSUFNZ0JHdEJ3Qk1RRmlBQUtBSUlJUUlNQVFzZ0F5QUVUdzBBSUFFZ0JTQURRUUowYWpZQ1NBc2dBaTBBVkNJQkRRQWdBaWdDUkNJRElBSW9Ba2hHRFFBZ0FDZ0NFQ2dDUkNFRUlBRkZCRUJCQUNFQkEwQWdCQ0FCUVFKMElnVnFJQU1nQldvb0FnQTJBZ0FnQVVFQmFpSUJJQUlvQWtnZ0FpZ0NSQ0lEYTBFQ2RVa05BQXNNQVFzZ0JFRUFOZ0lBQ3lBQUtBSVFDNklDQVFWL1FRRWhCQUpBSUFFZ0FTZ0NBQ2dDRkJFQUFFRUJTQTBBQTBBZ0FDZ0NCQ2dDQkNFRFFRQWhCQ0FCSUFVZ0FTZ0NBQ2dDR0JFQkFDSUNRWDlHRFFFZ0FrRUVTZzBCSUFNZ0FrRU1iR29pQWlnQ0dDQUNLQUlVSWdKclFRRklEUUVnQWlnQ0FDSUNRWDlHRFFFQ1FDQUFLQUlFSWdNdEFDUkJBVTBFUUNBQklBTW9BZ1FvQWdnZ0FrRUNkR29vQWdBZ0FTZ0NBQ2dDSEJFQkFBMEJEQU1MSUFKQkFFZ05BaUFES0FJRUlnWW9BZ3dnQmlnQ0NHdEJBblVnQWt3TkFpQURLQUlJSUFNb0FoUWdBa0VDZEdvb0FnQkJBblJxS0FJQUlnTWdBaUFES0FJQUtBSWdFUUVBSWdKRkRRSWdBU0FDSUFFb0FnQW9BaHdSQVFCRkRRSUxRUUVoQkNBQklBRW9BZ0FvQWhRUkFBQWdCVUVCYWlJRlNnMEFDd3NnQkF2ZkFRSUdmd04rSUFFb0FnQWhBeUFCS0FJRUlRRWdBQ2dDQ0NrREtDSUpweUlFRU9vQklRVUNmMEVCSUFFZ0Eyc2lBVUVCU0EwQUdrRUFJQUlwQXhBaUNpQUpRdi8vLy84UGd5SUxmQ0lKSUFJcEF3aFZEUUFhSUFGQkFuVWlCa0VCSUFaQkFVb2JJUWRCQUNFRFFRRWhBUU5BQWtBZ0JTQUNLQUlBSUFxbmFpQUVFUGtCSVFnZ0FpQUpOd01RSUFBb0FnZ29Ba0FvQWdBZ0Eyb2dDQ0FFRVBrQkdpQUJJQWRHRFFBZ0Fpa0RFQ0lLSUF0OElna2dBaWtEQ0ZVTkFDQURJQVJxSVFNZ0FVRUJhaUVCREFFTEN5QUJJQVpPQ3lFQUlBVVE2d0VnQUF1QUF3SUlmd0YrSUFBZ0FSQVVCSDhnQUVFa2FpRUdBa0FnQUNBQUtBSUFLQUlZRVFBQUlnVWdBQ2dDS0NJQ0lBQW9BaVFpQTJ0QkFuVWlCRXNFUUNBR0lBVWdCR3NRSlF3QkN5QUVJQVZORFFBZ0F5QUZRUUowYWlJRElBSkhCRUFEUUNBQ1FRUnJJZ0lvQWdBaEJDQUNRUUEyQWdBZ0JBUkFJQVFnQkNnQ0FDZ0NCQkVDQUFzZ0FpQURSdzBBQ3dzZ0FDQUROZ0lvQ3dKQUlBVkJBVWdFUUVFQUlRUU1BUXRCQVNFRUlBRXBBeEFpQ2lBQktRTUlXUTBBUVFBaEFnTkFJQUVvQWdBZ0NxZHFMUUFBSVFNZ0FTQUtRZ0Y4TndNUUlBQWdBeUFBS0FJQUtBSXdFUUVBSVFjZ0FrRUNkQ0lJSUFBb0FpUnFJZ2tvQWdBaEF5QUpJQWMyQWdBZ0F3UkFJQU1nQXlnQ0FDZ0NCQkVDQUFzZ0JpZ0NBQ0FJYWlnQ0FDSURSUTBCSUFNZ0FDQUFLQUlBS0FJY0VRQUFJQUFnQWlBQUtBSUFLQUlVRVFFQUlBTW9BZ0FvQWdnUkF3QkZEUUVnQWtFQmFpSUNJQVZJSVFRZ0FpQUZSZzBCSUFFcEF4QWlDaUFCS1FNSVV3MEFDd3NnQkVVRlFRQUxRUUZ4Qy84Q0FRZC9JQUVnQUNnQ0NDSUVJQUFvQWdRaUFtdEJBblZOQkVBZ0FDQUJCSDhnQWtFQUlBRkJBblFpQUJENkFTQUFhZ1VnQWdzMkFnUVBDd0pBQWtBQ1FDQUNJQUFvQWdBaUJtdEJBblVpQlNBQmFpSURRWUNBZ0lBRVNRUkFBbjhnQXlBRUlBWnJJZ1JCQVhVaUJ5QURJQWRMRzBILy8vLy9BeUFFUVFKMVFmLy8vLzhCU1JzaUF3UkFJQU5CZ0lDQWdBUlBEUU1nQTBFQ2RCRHFBU0VJQ3lBSUlBVkJBblJxSWdRTFFRQWdBVUVDZENJQkVQb0JJZ2NnQVdvaEJTQUlJQU5CQW5ScUlRRWdBaUFHUmcwQ0EwQWdBa0VFYXlJQ0tBSUFJUU1nQWtFQU5nSUFJQVJCQkdzaUJDQUROZ0lBSUFJZ0JrY05BQXNnQUNBQk5nSUlJQUFvQWdRaEFTQUFJQVUyQWdRZ0FDZ0NBQ0VDSUFBZ0JEWUNBQ0FCSUFKR0RRTURRQ0FCUVFScklnRW9BZ0FoQUNBQlFRQTJBZ0FnQUFSQUlBQWdBQ2dDQUNnQ0JCRUNBQXNnQVNBQ1J3MEFDd3dEQ3hEbkFRQUxFUGdCQUFzZ0FDQUJOZ0lJSUFBZ0JUWUNCQ0FBSUFjMkFnQUxJQUlFUUNBQ0VQY0JDd3ZZQVFFRmZ3SkFJQUFvQWp3aUEwVU5BQ0FESUFCQk1HbzJBZ1FnQXlBREtBSUFLQUlNRVFBQVJRMEFBa0FnQUNBQUtBSUFLQUlZRVFBQUlnTkJBRXdOQUFOQUFrQWdBQ0FBS0FJQUtBSWNFUUFBS0FJRUlRUWdBQ0FDSUFBb0FnQW9BaFFSQVFBaEJTQUFLQUk4SWdZZ0JDZ0NDQ0FGUVFKMGFpZ0NBQ0FHS0FJQUtBSUlFUUVBUlEwQUlBTWdBa0VCYWlJQ1J3MEJEQUlMQzBFQUR3dEJBQ0VDSUFBZ0FTQUFLQUlBS0FJa0VRRUFSUTBBSUFBZ0FTQUFLQUlBS0FJb0VRRUFSUTBBSUFBZ0FDZ0NBQ2dDTEJFQUFDRUNDeUFDQ3p3QkFYOENRQ0FBSUFFZ0FDZ0NBQ2dDSkJFQkFFVU5BQ0FBSUFFZ0FDZ0NBQ2dDS0JFQkFFVU5BQ0FBSUFBb0FnQW9BaXdSQUFBaEFnc2dBZ3VBQVFFRmZ3Si9RUUVnQUNBQUtBSUFLQUlZRVFBQUlnUkJBVWdOQUJwQkFDQUFLQUlrS0FJQUlnSWdBRUV3YWlJRklBRWdBaWdDQUNnQ0VCRURBRVVOQUJwQkFTRUNBMEFnQkNBQ0lnTkhCRUFnQTBFQmFpRUNJQUFvQWlRZ0EwRUNkR29vQWdBaUJpQUZJQUVnQmlnQ0FDZ0NFQkVEQUEwQkN3c2dBeUFFVGdzTGdBRUJCWDhDZjBFQklBQWdBQ2dDQUNnQ0dCRUFBQ0lFUVFGSURRQWFRUUFnQUNnQ0pDZ0NBQ0lDSUFCQk1Hb2lCU0FCSUFJb0FnQW9BaFFSQXdCRkRRQWFRUUVoQWdOQUlBUWdBaUlEUndSQUlBTkJBV29oQWlBQUtBSWtJQU5CQW5ScUtBSUFJZ1lnQlNBQklBWW9BZ0FvQWhRUkF3QU5BUXNMSUFNZ0JFNExDNm9LQVJOL0l3QkJFR3NpQnlRQVFRRWhDd0pBSUFBZ0FDZ0NBQ2dDR0JFQUFDSU9RUUZJQkVCQkFDRUxEQUVMSUFCQk1Hb2hFZ05BQWtBQ1FDQUFJQUFvQWdBb0Fod1JBQUFvQWloRkRRQWdDVUVDZENJVElBQW9BaVJxS0FJQUlnSW9BZ2doQVNBQ0VDRWlBa1VOQUNBQUlBQW9BZ0FvQWh3UkFBQW9BaWdoRENBSElBRW9BamcyQWd3Z0IwRWdFT29CSWdFMkFnQWdCMEtZZ0lDQWdJU0FnSUIvTndJRUlBRkJBRG9BR0NBQlFlVUlLUUFBTndBUUlBRkIzUWdwQUFBM0FBZ2dBVUhWQ0NrQUFEY0FBQUovUVFBaER3SkFBa0FnREVFUWFpSUJLQUlBSWdoRkRRQWdCeWdDRENFRUlBRWhCUU5BSUFVZ0NDQUlLQUlRSUFSSUlnWWJJUVVnQ0NBR1FRSjBhaWdDQUNJSURRQUxJQUVnQlVZTkFDQUVJQVVvQWhCSURRQWdCU2dDR0NJSVJRMEFJQWNvQWdBZ0J5QUhMUUFMSWdaQkdIUkJHSFZCQUVnaUFSc2hFQ0FIS0FJRUlBWWdBUnNoQ2lBRlFSaHFJUU1nQlVFVWFpRUVBMEFDUUFKQUFrQUNRQ0FJS0FJVUlBZ3RBQnNpQVNBQlFSaDBRUmgxUVFCSUlnVWJJZzBnQ2lBS0lBMUxJZ1liSWhFRVFBSkFJQkFnQ0VFUWFpSUJLQUlBSUFFZ0JSc2lCU0FSRU9RQklnRkZCRUFnQ2lBTlR3MEJEQVlMSUFGQmYwd05CUXNnQlNBUUlCRVE1QUVpQVVVTkFTQUJRWDlLRFFJTUF3c2dDaUFOU1EwREN5QUdEUUVMSUFRZ0J4QWFJZ0VnQTBZTkJDQUJLQUljSUFGQkhHb2dBU3dBSjBFQVNCc1E1UUVpQVVGL1JnMEVJQUZCQUVjTUJRc2dDRUVFYWlFSUN5QUlLQUlBSWdnTkFBc0xJQXdnQnhBYUlnRWdERUVFYWtZTkFDQUJLQUljSUFGQkhHb2dBU3dBSjBFQVNCc1E1UUVpQVVGL1JnMEFJQUZCQUVjaER3c2dEd3NoQVNBSExBQUxRWDlNQkVBZ0J5Z0NBQkQzQVFzZ0FVVU5BQ0FBS0FJa0lCTnFLQUlBS0FJSUlnTW9Ba0JGQkVCQklCRHFBU0lCUWdBM0F4QWdBVUVBTmdJSUlBRkNBRGNEQUNBQlFnQTNBeGdnQTBJQU53TUlJQU1nQVRZQ0FDQURJQUUyQWtBZ0EwSUFOd01RSUFOQ0FEY0RLQ0FEUWdBM0F6QUxJQU1nQWkwQUdEb0FHQ0FESUFJb0FodzJBaHdnQXlBQ0xRQWdPZ0FnSUFNZ0Fpa0RLRGNES0NBRElBSXBBekEzQXpBZ0F5QUNLQUk0TmdJNElBTWdBaWtEQ0RjRENDQURJQUlwQXhBM0F4QWdBeUFDS0FJOE5nSThBa0FDUUNBQ0tBSUFJZ0ZGQkVBZ0EwRUFOZ0lBREFFTElBTW9BZ0FpQkVVTkFTQUJLQUlFSUFFb0FnQWlCV3NoQmdKQUlBVkZCRUFnQkNBR0VBY01BUXNDUUNBR0lBUW9BZ1FnQkNnQ0FDSUJhMHNFUUNBRUlBWVFCeUFFS0FJQUlRRU1BUXNnQmtVTkFRc2dBU0FGSUFZUSt3RWFDeUFFSUFRcEF4aENBWHczQXhnTElBTWdBaTBBVkRvQVZDQURJQUlvQWxBMkFsQWdBaUFEUndSQUlBTkJ4QUJxSUFJb0FrUWdBaWdDU0JBU0N3SkFBa0FnQWlnQ1dDSUdCRUJCS0JEcUFTRUVJQVlvQWdBaEFpQUVRUUEyQWhBZ0JFSUFOd01JSUFRZ0FqWUNBQ0FHS0FJTUlBWW9BZ2hySWdJRVFDQUNRWDlNRFFNZ0JDQUNFT29CSWdVMkFnZ2dCQ0FGTmdJTUlBUWdBaUFGYWpZQ0VDQUVJQVlvQWd3Z0JpZ0NDQ0lDYXlJQlFRRk9CSDhnQlNBQ0lBRVErUUVnQVdvRklBVUxOZ0lNQ3lBRUlBWXBBeUEzQXlBZ0JDQUdLUU1ZTndNWUlBTW9BbGdoQVNBRElBUTJBbGdnQVEwQkRBTUxJQU1vQWxnaEFTQURRUUEyQWxnZ0FVVU5BZ3NnQVNnQ0NDSUNCRUFnQVNBQ05nSU1JQUlROXdFTElBRVE5d0VNQVFzUTV3RUFDd3dCQ3lBQUtBSWtJQWxCQW5ScUtBSUFJZ0lnRWlBQ0tBSUFLQUlZRVFFQVJRMENDeUFKUVFGcUlna2dEa2doQ3lBSklBNUhEUUFMQ3lBSFFSQnFKQUFnQzBGL2MwRUJjUXVxQVFCQkFDRUFBa0FDUUFKQUFrQWdBUTREQUFFQ0F3dEJGQkRxQVNJQVF2Ly8vLzhQTndJTUlBQkNBRGNDQkNBQVFaQU1OZ0lBSUFBUEMwRVlFT29CSWdCQy8vLy8vdzgzQWd3Z0FFSUFOd0lFSUFCQkFEWUNGQ0FBUWZnTU5nSUFJQUFQQzBFd0VPb0JJZ0JCQURZQ0ZDQUFRdi8vLy84UE53SU1JQUJDQURjQ0JDQUFRWXdSTmdJWUlBQkJ0QTAyQWdBZ0FFSUFOd0lnSUFCQmZ6WUNIQ0FBUWdBM0FpZ0xJQUFMT1FFQmZ3Si9JQUFvQWdRaUFnUkFRUUVnQWkwQUpFRUNTUTBCR2dzZ0FDQUJLQUlFSUFFb0FnQnJRUUoxSUFBb0FnQW9BakFSQVFBTEM0Z0NBZ04vQTM0Q1FDQUNLUU1JSWdnZ0Fpa0RFQ0lHVncwQUlBSW9BZ0FpQkNBR3Ayb3NBQUFoQXlBQ0lBWkNBWHdpQnpjREVBSkFJQU5CZmtZTkFDQUhJQWhaRFFFZ0JDQUhwMm9zQUFBaEJDQUNJQVpDQW53M0F4QWdCRUVCYWtIL0FYRkJCRXNOQVNBQUlBTWdCQ0FBS0FJQUtBSW9FUU1BSVFRZ0FDZ0NGQ0VESUFBZ0JEWUNGQ0FEUlEwQUlBTWdBeWdDQUNnQ0JCRUNBQXNnQUNnQ0ZDSURCRUFnQUNBRElBQW9BZ0FvQWh3UkFRQkZEUUVMSUFBZ0FTQUNJQUFvQWdBb0FpUVJBd0JGRFFBQ1FDQUFLQUlFSWdKRkRRQWdBaTBBSkVFQlN3MEFJQUFnQVNnQ0JDQUJLQUlBYTBFQ2RTQUFLQUlBS0FJd0VRRUFSUTBCQzBFQklRVUxJQVVMM2hVQ0NYOERmaU1BUVRCcklnY2tBQUpBSUFKQkFVY05BQ0FBS0FJRUlRSWdBQ2dDRENFQUlBZEJBRFlDS0NBSFFnQTNBeUFnQjBJQU53TVlJQWRDQURjREVDQUhRZ0EzQXdnQ2Z5QUhRUWhxSVFRQ1FBSkFJQUZCZmtZTkFDQUNLQUlFS0FJSUlBQkJBblJxS0FJQUlRc2dBaUFDS0FJQUtBSUlFUUFBUVFGR0JFQWdBaThCSkNJRFFRaDBJQU5CQ0haeVFmLy9BM0VoQ1VFQUlRTWpBRUVnYXlJRkpBQWdBaWdDQkNnQ0NDQUFRUUowYWlnQ0FDRUdBa0FnQWlBQ0tBSUFLQUlJRVFBQVFRRkhEUUFnQVVFQmEwRUZTdzBBSUFJZ0FpZ0NBQ2dDSkJFQUFDRUtJQUlnQUNBQ0tBSUFLQUlzRVFFQUlRZ2dDa1VOQUNBSVJRMEFJQUlnQUNBQ0tBSUFLQUlvRVFFQUlnTUVRQ0FDS0FJc0lRQWdCU0FETmdJTUlBVWdBRFlDQ0NBRklBZzJBaFFnQlNBSVFReHFOZ0lRQW45QkFDRURBa0FDUUFKQUFrQUNRQUpBQWtBZ0FVRUJhdzRGQUFFREFnUUZDMEU4RU9vQklnTWdCallDQkNBRFFkd1VOZ0lBSUFRcEFnZ2hEU0FFS1FJUUlRNGdCQ2tDQUNFTUlBTkJBRFlDS0NBRFFnQTNBaUFnQXlBT053SVlJQU1nRFRjQ0VDQURJQXczQWdnZ0JDZ0NIQ0FFS0FJWUlnQnJJZ0lFUUNBQ1FYOU1EUVlnQXlBQ0VPb0JJZ0UyQWlBZ0F5QUJOZ0lrSUFNZ0FTQUNRUUoxUVFKMGFqWUNLQ0FESUFFZ0FDQUNFUGtCSUFKcU5nSWtDeUFESUFVcEFnZzNBaXdnQXlBRktRSVFOd0kwSUFOQnBCUTJBZ0FnQXd3R0MwRThFT29CSWdNZ0JqWUNCQ0FEUWR3VU5nSUFJQVFwQWdnaERTQUVLUUlRSVE0Z0JDa0NBQ0VNSUFOQkFEWUNLQ0FEUWdBM0FpQWdBeUFPTndJWUlBTWdEVGNDRUNBRElBdzNBZ2dnQkNnQ0hDQUVLQUlZSWdCcklnSUVRQ0FDUVg5TURRVWdBeUFDRU9vQklnRTJBaUFnQXlBQk5nSWtJQU1nQVNBQ1FRSjFRUUowYWpZQ0tDQURJQUVnQUNBQ0VQa0JJQUpxTmdJa0N5QURJQVVwQWdnM0Fpd2dBeUFGS1FJUU53STBJQU5CbEJVMkFnQWdBd3dGQzBId0FCRHFBU0lESUFZMkFnUWdBMEhjRkRZQ0FDQUVLUUlJSVEwZ0JDa0NFQ0VPSUFRcEFnQWhEQ0FEUVFBMkFpZ2dBMElBTndJZ0lBTWdEamNDR0NBRElBMDNBaEFnQXlBTU53SUlJQVFvQWh3Z0JDZ0NHQ0lBYXlJQ0JFQWdBa0YvVEEwRUlBTWdBaERxQVNJQk5nSWdJQU1nQVRZQ0pDQURJQUVnQWtFQ2RVRUNkR28yQWlnZ0F5QUJJQUFnQWhENUFTQUNhallDSkFzZ0F5QUZLUUlJTndJc0lBTWdCU2tDRURjQ05DQURRZ0EzQWp3Z0EwSE1GVFlDQUNBRFFnQTNBa1FnQTBJQU53Sk1JQU5DQURjQ1ZDQURRZ0EzQWx3Z0EwSUFOd0prSUFOQkFEWUNiQ0FEREFRTFFkd0FFT29CSWdNZ0JqWUNCQ0FEUWR3VU5nSUFJQVFwQWdnaERTQUVLUUlRSVE0Z0JDa0NBQ0VNSUFOQkFEWUNLQ0FEUWdBM0FpQWdBeUFPTndJWUlBTWdEVGNDRUNBRElBdzNBZ2dnQkNnQ0hDQUVLQUlZSWdCcklnSUVRQ0FDUVg5TURRTWdBeUFDRU9vQklnRTJBaUFnQXlBQk5nSWtJQU1nQVNBQ1FRSjFRUUowYWpZQ0tDQURJQUVnQUNBQ0VQa0JJQUpxTmdJa0N5QURJQVVwQWdnM0Fpd2dBeUFGS1FJUU53STBJQU5DQURjQ1BDQURRWVFXTmdJQUlBTkNBRGNDUkNBRFFnQTNBa3dnQTBFQU5nSlVJQU1nQ1RZQ1dDQUREQU1MUWVnQUVPb0JJZ01nQmpZQ0JDQURRZHdVTmdJQUlBUXBBZ2doRFNBRUtRSVFJUTRnQkNrQ0FDRU1JQU5CQURZQ0tDQURRZ0EzQWlBZ0F5QU9Od0lZSUFNZ0RUY0NFQ0FESUF3M0FnZ2dCQ2dDSENBRUtBSVlJZ0JySWdJRVFDQUNRWDlNRFFJZ0F5QUNFT29CSWdFMkFpQWdBeUFCTmdJa0lBTWdBU0FDUVFKMVFRSjBhallDS0NBRElBRWdBQ0FDRVBrQklBSnFOZ0lrQ3lBRElBVXBBZ2czQWl3Z0JTa0NFQ0VNSUFOQkFEWUNWQ0FEUWdBM0Frd2dBMElBTndJOElBTkJ2QlkyQWdBZ0F5QU1Od0kwSUFNZ0JTa0NDRGNDV0NBRElBVXBBaEEzQW1BTElBTU1BUXNRNXdFQUN5RUREQUVMSUFJb0Fpd2hBQ0FGSUFvMkFnd2dCU0FBTmdJSUlBVWdDRFlDRkNBRklBaEJER28yQWhBQ2YwRUFJUU1DUUFKQUFrQUNRQUpBQWtBQ1FDQUJRUUZyRGdVQUFRTUNCQVVMUVR3UTZnRWlBeUFHTmdJRUlBTkIzQlEyQWdBZ0JDa0NDQ0VOSUFRcEFoQWhEaUFFS1FJQUlRd2dBMEVBTmdJb0lBTkNBRGNDSUNBRElBNDNBaGdnQXlBTk53SVFJQU1nRERjQ0NDQUVLQUljSUFRb0FoZ2lBR3NpQWdSQUlBSkJmMHdOQmlBRElBSVE2Z0VpQVRZQ0lDQURJQUUyQWlRZ0F5QUJJQUpCQW5WQkFuUnFOZ0lvSUFNZ0FTQUFJQUlRK1FFZ0FtbzJBaVFMSUFNZ0JTa0NDRGNDTENBRElBVXBBaEEzQWpRZ0EwSDBGallDQUNBRERBWUxRVHdRNmdFaUF5QUdOZ0lFSUFOQjNCUTJBZ0FnQkNrQ0NDRU5JQVFwQWhBaERpQUVLUUlBSVF3Z0EwRUFOZ0lvSUFOQ0FEY0NJQ0FESUE0M0FoZ2dBeUFOTndJUUlBTWdERGNDQ0NBRUtBSWNJQVFvQWhnaUFHc2lBZ1JBSUFKQmYwd05CU0FESUFJUTZnRWlBVFlDSUNBRElBRTJBaVFnQXlBQklBSkJBblZCQW5ScU5nSW9JQU1nQVNBQUlBSVErUUVnQW1vMkFpUUxJQU1nQlNrQ0NEY0NMQ0FESUFVcEFoQTNBalFnQTBHc0Z6WUNBQ0FEREFVTFFmQUFFT29CSWdNZ0JqWUNCQ0FEUWR3VU5nSUFJQVFwQWdnaERTQUVLUUlRSVE0Z0JDa0NBQ0VNSUFOQkFEWUNLQ0FEUWdBM0FpQWdBeUFPTndJWUlBTWdEVGNDRUNBRElBdzNBZ2dnQkNnQ0hDQUVLQUlZSWdCcklnSUVRQ0FDUVg5TURRUWdBeUFDRU9vQklnRTJBaUFnQXlBQk5nSWtJQU1nQVNBQ1FRSjFRUUowYWpZQ0tDQURJQUVnQUNBQ0VQa0JJQUpxTmdJa0N5QURJQVVwQWdnM0Fpd2dBeUFGS1FJUU53STBJQU5DQURjQ1BDQURRZVFYTmdJQUlBTkNBRGNDUkNBRFFnQTNBa3dnQTBJQU53SlVJQU5DQURjQ1hDQURRZ0EzQW1RZ0EwRUFOZ0pzSUFNTUJBdEIzQUFRNmdFaUF5QUdOZ0lFSUFOQjNCUTJBZ0FnQkNrQ0NDRU5JQVFwQWhBaERpQUVLUUlBSVF3Z0EwRUFOZ0lvSUFOQ0FEY0NJQ0FESUE0M0FoZ2dBeUFOTndJUUlBTWdERGNDQ0NBRUtBSWNJQVFvQWhnaUFHc2lBZ1JBSUFKQmYwd05BeUFESUFJUTZnRWlBVFlDSUNBRElBRTJBaVFnQXlBQklBSkJBblZCQW5ScU5nSW9JQU1nQVNBQUlBSVErUUVnQW1vMkFpUUxJQU1nQlNrQ0NEY0NMQ0FESUFVcEFoQTNBalFnQTBJQU53SThJQU5CbkJnMkFnQWdBMElBTndKRUlBTkNBRGNDVENBRFFRQTJBbFFnQXlBSk5nSllJQU1NQXd0QjZBQVE2Z0VpQXlBR05nSUVJQU5CM0JRMkFnQWdCQ2tDQ0NFTklBUXBBaEFoRGlBRUtRSUFJUXdnQTBFQU5nSW9JQU5DQURjQ0lDQURJQTQzQWhnZ0F5QU5Od0lRSUFNZ0REY0NDQ0FFS0FJY0lBUW9BaGdpQUdzaUFnUkFJQUpCZjB3TkFpQURJQUlRNmdFaUFUWUNJQ0FESUFFMkFpUWdBeUFCSUFKQkFuVkJBblJxTmdJb0lBTWdBU0FBSUFJUStRRWdBbW8yQWlRTElBTWdCU2tDQ0RjQ0xDQUZLUUlRSVF3Z0EwRUFOZ0pVSUFOQ0FEY0NUQ0FEUWdBM0Fqd2dBMEhVR0RZQ0FDQURJQXczQWpRZ0F5QUZLUUlJTndKWUlBTWdCU2tDRURjQ1lBc2dBd3dCQ3hEbkFRQUxJUU1MSUFWQklHb2tBQ0FERFFFTFFTd1E2Z0VpQXlBTE5nSUVJQU5CM0JRMkFnQWdCQ2tDQ0NFTklBUXBBaEFoRGlBRUtRSUFJUXdnQTBFQU5nSW9JQU5DQURjQ0lDQURJQTQzQWhnZ0F5QU5Od0lRSUFNZ0REY0NDQ0FFS0FJY0lBUW9BaGdpQUdzaUFnUkFJQUpCZjB3TkFpQURJQUlRNmdFaUFUWUNJQ0FESUFFMkFpUWdBeUFCSUFKQkFuVkJBblJxTmdJb0lBTWdBU0FBSUFJUStRRWdBbW8yQWlRTElBTkJqQmsyQWdBTElBTU1BUXNRNXdFQUN5RUVJQWNvQWlBaUFFVU5BQ0FISUFBMkFpUWdBQkQzQVFzZ0IwRXdhaVFBSUFRTHFBZ0NDWDhEZmlNQVFTQnJJZ2drQUFKQUlBQWdBQ2dDQUNnQ0xCRUFBQ0lKUVFGSUJFQU1BUXNnQVNnQ0FDRUVJQUVvQWdRaEJpQUlRZ0EzQWhnZ0NFSUFOd0lRSUFBb0FnZ29BamdoQlVIZ0FCRHFBU0lEUVFBMkFnQWdDQ2dDSENFSElBZ3BBaFFoRENBSUtRSU1JUTRnQTBISUFHcENBRGNEQUNBRFFnQTNBRTBnQXlBT053SUVJQU1nRERjQ0RDQURJQWMyQWhRZ0EwRUFOZ0pZSUFOQkFEWUNQQ0FESUFVMkFqZ2dBMElBTndNd0lBTWdDVUVDZEt3M0F5Z2dBMEVBT2dBZ0lBTkJCVFlDSENBRElBazZBQmdnQTBJQU53TkFJQU5CQURZQ1NDQURRUUU2QUZRZ0F5QUdJQVJyUVFKMUlnWVFFUm9nQUNnQ0VDRUVJQUFnQXpZQ0VBSi9JQVFFUUNBRUVCY2dBQ2dDRUNFREN5QURLQUpRUlFzRVFFRUFJUU1NQVFzZ0F5Z0NBQ2dDQUNJRlJRUkFRUUFoQXd3QkN5QUNLUU1JSWc0Z0Fpa0RFQ0lNVndSQVFRQWhBd3dCQ3lBR0lBbHNJUVFnQlNBREtBSXdhaUVHSUFJb0FnQWlCeUFNcDJvdEFBQWhCU0FDSUF4Q0FYd2lEVGNERUFKQUFrQWdCUVJBSUFSRkJFQkJBU0VGREFNTElBMGdEbGtFUUVFQUlRTU1CQXNnQnlBTnAyb3RBQUFoQlNBQ0lBeENBbnczQXhCQkFDRURBa0FDUUNBRkRnSUFBUVVMSUFRZ0NTQUNJQVlRTUEwQ0RBUUxJQVFnQWlBR0VERU5BUXdEQ3lBTklBNVpCRUJCQUNFRERBTUxJQWNnRGFkcUxRQUFJUVVnQWlBTVFnSjhJZ3czQXhBZ0F5Z0NRQ0lES0FJRUlBTW9BZ0JySVFNQ1FBSkFJQVZCQkVZRVFDQURJQVJCQW5RaUEwa0VRRUVBSVFNTUJnc2dEaUFNSUFPdElnMThXUTBCUVFBaEF3d0ZDeUFFSUFWc0lBTkxCRUJCQUNFRERBVUxJQTRnREgwZ0JhMGlEU0FFclg1VEJFQkJBQ0VEREFVTElBUkZCRUJCQVNFRkRBUUxRUUFoQXlBT0lBd2dEWHhURFFSQkFDRUhBMEFnQmlBSFFRSjBhaUFDS0FJQUlBeW5haUFGRVBrQkdpQUNJQUlwQXhBZ0RYd2lERGNERUNBSFFRRnFJZ2NnQkVZTkFpQUNLUU1JSUF3Z0RYeFpEUUFMREFRTElBWWdCeUFNcDJvZ0F4RDVBUm9nQWlBQ0tRTVFJQTE4TndNUUN5QUVEUUJCQVNFRkRBRUxBa0FnQUNnQ0ZDSURCRUJCQUNFRklBTWdBeWdDQUNnQ0lCRUFBQTBDSUFSQkFFd05BZ3dCQ3lBRVFRRk9EUUJCQUNFRkRBRUxRUUFoQlVFQUlRTWdCRUVCUndSQUlBUkJmbkVoQndOQUlBWWdBMEVDZENJS2FpSUxRUUFnQ3lnQ0FDSUxRUUZ4YXlBTFFRRjJjellDQUNBR0lBcEJCSEpxSWdwQkFDQUtLQUlBSWdwQkFYRnJJQXBCQVhaek5nSUFJQU5CQW1vaEF5QUhRUUpySWdjTkFBc0xJQVJCQVhGRkRRQWdCaUFEUVFKMGFpSURRUUFnQXlnQ0FDSURRUUZ4YXlBRFFRRjJjellDQUFzQ1FDQUFLQUlVSWdORkRRQWdBeUFDSUFNb0FnQW9BaWdSQVFCRkJFQkJBQ0VEREFJTElBVU5BRUVBSVFNZ0FDZ0NGQ0lBSUFZZ0JpQUVJQWtnQVNnQ0FDQUFLQUlBS0FJc0VRWUFSUTBCQzBFQklRTUxJQWhCSUdva0FDQURDNzRIQWhSL0FYNGpBRUZBYWlJRUpBQWdCRUVBTmdJNElBUkNBRGNETUNBRVFnQTNBeWdnQkVJQU53TWdJQVJDQURjREdDQUVRZ0EzQXhBZ0JFSUFOd01JQWtBZ0JFRUlhaUFDRUc5RkRRQWdCRUVJYWlBQ0VIQkZEUUFnQUFSQUlBUW9BaFJGRFFFTElBSkJBVG9BSkNBQ1FRQTJBaUFnQWlBQ0tBSUFJQUlwQXhBaUdLZHFJZ1UyQWhnZ0FpQUZJQUlwQXdnZ0dIMm5hallDSEFKQUlBQkZEUUFnQkNnQ0pDRVFJQVFvQWpBaEVTQUVLQUlZSVJJZ0FVRUFUQVJBSUFRb0FqZ2hCZ05BQWtBZ0JrSC8vd0JMRFFBZ0JDZ0NOQ0VGQTBBZ0JVRUJTQTBCSUFRZ0JVRUJheUlGTmdJMElBUWdCU0FSYWkwQUFDQUdRUWgwY2lJR05nSTRJQVpCZ0lBQlNRMEFDd3NnQkNBUUlCSWdCa0gvSDNFaUEwRUNkR29vQWdCQkEzUnFJZ1VvQWdBZ0JrRU1kbXdnQTJvZ0JTZ0NCR3NpQmpZQ09DQUJJQWhxSWdnZ0FFa05BQXNNQVFzZ0FVRUNkQ0VVSUFRb0FqZ2hDZ05BQWtBZ0NrSC8vd0JMRFFBZ0JDZ0NOQ0VGQTBBZ0JVRUJTQTBCSUFRZ0JVRUJheUlGTmdJMElBUWdCU0FSYWkwQUFDQUtRUWgwY2lJS05nSTRJQXBCZ0lBQlNRMEFDd3NnQkNBUUlCSWdDa0gvSDNFaUJVRUNkR29vQWdBaURVRURkR29pQ1NnQ0FDQUtRUXgyYkNBRmFpQUpLQUlFYXlJS05nSTRBa0FnRFVFQVRBUkFJQU1nREVFQ2RHcEJBQ0FVRVBvQkdpQUJJQXhxSVF3TUFRc2dEVUYrY1NFVklBMUJBWEVoRmlBQ0tBSWdJUWxCQUNFVEEwQWdBaWdDSENFT0lBSW9BaGdoRHlBSklRVkJBQ0VHUVFBaENDQVZJUXNnRFVFQlJ3UkFBMEFDUUNBT0lBOGdCVUVEZG1vaUIwMEVRRUVBSVFjTUFRc2dCeTBBQUNFSElBSWdCVUVCYWlJSk5nSWdJQWNnQlVFSGNYWkJBWEVnQm5RaEJ5QUpJUVVMSUFjZ0NISWhDQUpBSUE0Z0R5QUZRUU4yYWlJSFRRUkFRUUFoQnd3QkN5QUhMUUFBSVFjZ0FpQUZRUUZxSWdrMkFpQWdCeUFGUVFkeGRrRUJjU0FHUVFGeWRDRUhJQWtoQlFzZ0JrRUNhaUVHSUFjZ0NISWhDQ0FMUVFKcklnc05BQXNMSUFNZ0RFRUNkR29nRmdSL0lBNGdEeUFGUVFOMmFpSUxUUVIvUVFBRklBc3RBQUFoQ3lBQ0lBVkJBV29pQ1RZQ0lDQUxJQVZCQjNGMlFRRnhJQVowQ3lBSWNnVWdDQXMyQWdBZ0RFRUJhaUVNSUJOQkFXb2lFeUFCUncwQUN3c2dBU0FYYWlJWElBQkpEUUFMSUFJMUFpQkNCM3hDQTRnZ0dId2hHQXNnQWlBWU53TVFJQUpCQURvQUpFRUJJUVlMSUFRb0FpUWlBQVJBSUFRZ0FEWUNLQ0FBRVBjQkN5QUVLQUlZSWdBRVFDQUVJQUEyQWh3Z0FCRDNBUXNnQkNnQ0NDSUFCRUFnQkNBQU5nSU1JQUFROXdFTElBUkJRR3NrQUNBR0M5WkNBZzEvQTM0Q1FBSkFBa0FDUUNBQktRTVFJaEFnQVNrRENGa05BQ0FCS0FJQUlCQ25haTBBQUNFRElBRWdFRUlCZkRjREVBSkFBa0FDUUFKQUFrQUNRQUpBSUFOQkFXc09FZ2dJQ0FnQUNBZ0lBUUlEQkFVSkNRa0pCZ2NMSXdCQlFHb2lBeVFBSUFOQkFEWUNPQ0FEUWdBM0F6QWdBMElBTndNb0lBTkNBRGNESUNBRFFnQTNBeGdnQTBJQU53TVFJQU5DQURjRENBSkFJQU5CQ0dvZ0FSQnZSUTBBSUFBRVFDQURLQUlVUlEwQkN5QURRUWhxSUFFUWNFVU5BQ0FBUlFSQVFRRWhCQXdCQ3lBREtBSWtJUVlnQXlnQ01DRUhJQU1vQWhnaEN5QURLQUk0SVFFRFFBSkFJQUZCLy84QVN3MEFJQU1vQWpRaEJBTkFJQVJCQVVnTkFTQURJQVJCQVdzaUJEWUNOQ0FESUFRZ0Iyb3RBQUFnQVVFSWRISWlBVFlDT0NBQlFZQ0FBVWtOQUFzTElBTWdCaUFMSUFGQi94OXhJZ1JCQW5ScUtBSUFJZ2hCQTNScUlna29BZ0FnQVVFTWRtd2dCR29nQ1NnQ0JHc2lBVFlDT0NBQ0lBVkJBblJxSUFnMkFnQkJBU0VFSUFWQkFXb2lCU0FBUncwQUN3c2dBeWdDSkNJQUJFQWdBeUFBTmdJb0lBQVE2d0VMSUFNb0FoZ2lBQVJBSUFNZ0FEWUNIQ0FBRU9zQkN5QURLQUlJSWdBRVFDQURJQUEyQWd3Z0FCRHJBUXNnQTBGQWF5UUFJQVFQQ3lNQVFVQnFJZ01rQUNBRFFRQTJBakFnQTBJQU53TW9JQU5DQURjRElDQURRZ0EzQXhnZ0EwSUFOd01RSUFOQ0FEY0RDQ0FEUWdBM0F3QUNRQUovQWtBZ0FTSUVMd0VtSWdGRkRRQUNRQ0FCUWY4RFRRUkFJQVFwQXdnZ0JDa0RFQ0lRUWdSOFV3MENJQU1nQkNnQ0FDQVFwMm9vQUFBaUNEWUNEQ0FFSUFRcEF4QkNCSHczQXhBTUFRdEJBU0FEUVF4cUlBUVFGVVVOQVNBREtBSU1JUWdMQWtBZ0F5Z0NCQ0FES0FJQUlnVnJRUUoxSWdFZ0NFa0VRQ0FESUFnZ0FXc1FDaUFES0FJTUlRZ01BUXNnQVNBSVRRMEFJQU1nQlNBSVFRSjBhallDQkF0QkFTQUlSUTBCR2lBRUtRTUlJUkVnQXlnQ0FDRUpRUUFoQlFOQVFRQWdCQ2tERUNJUUlCRlpEUUlhSUFRb0FnQWlEU0FRcDJvdEFBQWhCaUFFSUJCQ0FYd2lFRGNERUNBR1FRSjJJUUZCQUNFSEFrQUNRQUpBQWtBZ0JrRURjU0lLRGdRQ0FRRUFBUXRCQUNBSUlBRWdCV29pQVUwTkJSb2dDU0FGUVFKMGFrRUFJQVpCL0FGeFFRUnFFUG9CR2lBQklRVU1BZ3NEUUNBUUlCRlpEUVFnRFNBUXAyb3RBQUFoQmlBRUlCQkNBWHdpRURjREVDQUdJQWRCQTNSQkJuSjBJQUZ5SVFFZ0IwRUJhaUlISUFwSERRQUxDeUFKSUFWQkFuUnFJQUUyQWdBTElBVkJBV29pQlNBREtBSU1JZ2hKRFFBTElBTkJFR29oRFNBREtBSUFJUThDUUNBREtBSVVJQU1vQWhBaUFXc2lCVUVDZFNJR1FmOC9UUVJBSUExQmdNQUFJQVpyRUFvTUFRc2dCVUdBZ0FKR0RRQWdBeUFCUVlDQUFtbzJBaFFMQWtBZ0F5Z0NJQ0FEUVJ4cUlnRW9BZ0FpQld0QkEzVWlCaUFJU1FSQUlBRWdDQ0FHYXhEaUFTQUJLQUlBSVFVTUFRc2dCaUFJU3dSQUlBTWdCU0FJUVFOMGFqWUNJQXNnQ0VVTkFRdEJBQ0VIUVFBaEJnTkFJQThnQjBFQ2RHb2lDU2dDQUNFS0lBVWdCMEVEZEdvaURpQUdJZ0UyQWdRZ0RpQUtOZ0lBSUFrb0FnQWlDU0FCYWlJR1FZREFBRXNOQVFKQUlBRWdCazhOQUNBTktBSUFJUW9nQ1VFSGNTSU9CRUFEUUNBS0lBRkJBblJxSUFjMkFnQWdBVUVCYWlFQklBNUJBV3NpRGcwQUN3c2dDVUVCYTBFR1RRMEFBMEFnQ2lBQlFRSjBhaUlKSUFjMkFnQWdDU0FITmdJY0lBa2dCellDR0NBSklBYzJBaFFnQ1NBSE5nSVFJQWtnQnpZQ0RDQUpJQWMyQWdnZ0NTQUhOZ0lFSUFGQkNHb2lBU0FHUncwQUN3c2dCMEVCYWlJSElBaEhEUUFMSUFaQmdNQUFSaUVNQ3lBTUMwVU5BQ0FBQkVBZ0F5Z0NERVVOQVFzQ1FDQUVMd0VtUWY4RFRRUkFJQVFwQXdnaUVpQUVLUU1RSWhGQ0NId2lFRk1OQWlBRUtBSUFJQkduYWlrQUFDRVJJQVFnRURjREVBd0JDMEVCSUFOQk9Hb2dCQkJoUlEwQklBUXBBeEFoRUNBRUtRTUlJUklnQXlrRE9DRVJDeUFSSUJJZ0VIMVdEUUFnQkNBUUlCRjhOd01RSUJHbklnVkJBVWdOQUNBRElBUW9BZ0FnRUtkcUlnWTJBaWdnQXdKL0lBWWdCVUVCYXlJQmFpSUVMUUFBSWdkQlAwMEVRQ0FESUFFMkFpd2dCQzBBQUVFL2NRd0JDd0pBQWtBQ1FDQUhRUVoyUVFGckRnTUFBUUlFQ3lBRlFRSklEUU1nQXlBRlFRSnJJZ0UyQWl3Z0JTQUdha0VDYXlJRUxRQUJRUWgwUVlEK0FIRWdCQzBBQUhJTUFnc2dCVUVEU0EwQ0lBTWdCVUVEYXlJQk5nSXNJQVVnQm1wQkEyc2lCQzBBQWtFUWRFR0FnUHdCY1NBRUxRQUJRUWgwY2lBRUxRQUFjZ3dCQ3lBRElBVkJCR3NpQVRZQ0xDQUZJQVpxUVFScklnUXRBQUpCRUhRZ0JDMEFBMEVZZEVHQWdJRDRBM0Z5SUFRdEFBRkJDSFJ5SUFRdEFBQnlDMEdBZ0FKcUlnUTJBakFnQkVILy8vOERTdzBBSUFCRkJFQkJBU0VMREFFTElBTW9BaHdoQjBFQUlRVWdBeWdDRUNFSUEwQUNRQ0FFUWYvL0FVc05BQU5BSUFGQkFVZ05BU0FESUFGQkFXc2lBVFlDTENBRElBRWdCbW90QUFBZ0JFRUlkSElpQkRZQ01DQUVRWUNBQWtrTkFBc0xJQU1nQnlBSUlBUkIvejl4SWd0QkFuUnFLQUlBSWdsQkEzUnFJZ3dvQWdBZ0JFRU5kbXdnQzJvZ0RDZ0NCR3NpQkRZQ01DQUNJQVZCQW5ScUlBazJBZ0JCQVNFTElBVkJBV29pQlNBQVJ3MEFDd3NNQ0FzakFFRkFhaUlESkFBZ0EwRUFOZ0l3SUFOQ0FEY0RLQ0FEUWdBM0F5QWdBMElBTndNWUlBTkNBRGNERUNBRFFnQTNBd2dnQTBJQU53TUFBa0FDZndKQUlBRWlCQzhCSmlJQlJRMEFBa0FnQVVIL0EwMEVRQ0FFS1FNSUlBUXBBeEFpRUVJRWZGTU5BaUFESUFRb0FnQWdFS2RxS0FBQUlnZzJBZ3dnQkNBRUtRTVFRZ1I4TndNUURBRUxRUUVnQTBFTWFpQUVFQlZGRFFFZ0F5Z0NEQ0VJQ3dKQUlBTW9BZ1FnQXlnQ0FDSUZhMEVDZFNJQklBaEpCRUFnQXlBSUlBRnJFQW9nQXlnQ0RDRUlEQUVMSUFFZ0NFME5BQ0FESUFVZ0NFRUNkR28yQWdRTFFRRWdDRVVOQVJvZ0JDa0RDQ0VSSUFNb0FnQWhDVUVBSVFVRFFFRUFJQVFwQXhBaUVDQVJXUTBDR2lBRUtBSUFJZzBnRUtkcUxRQUFJUVlnQkNBUVFnRjhJaEEzQXhBZ0JrRUNkaUVCUVFBaEJ3SkFBa0FDUUFKQUlBWkJBM0VpQ2c0RUFnRUJBQUVMUVFBZ0NDQUJJQVZxSWdGTkRRVWFJQWtnQlVFQ2RHcEJBQ0FHUWZ3QmNVRUVhaEQ2QVJvZ0FTRUZEQUlMQTBBZ0VDQVJXUTBFSUEwZ0VLZHFMUUFBSVFZZ0JDQVFRZ0Y4SWhBM0F4QWdCaUFIUVFOMFFRWnlkQ0FCY2lFQklBZEJBV29pQnlBS1J3MEFDd3NnQ1NBRlFRSjBhaUFCTmdJQUN5QUZRUUZxSWdVZ0F5Z0NEQ0lJU1EwQUN5QURRUkJxSVEwZ0F5Z0NBQ0VQQWtBZ0F5Z0NGQ0FES0FJUUlnRnJJZ1ZCQW5VaUJrSC8vd0ZOQkVBZ0RVR0FnQUlnQm1zUUNnd0JDeUFGUVlDQUNFWU5BQ0FESUFGQmdJQUlhallDRkFzQ1FDQURLQUlnSUFOQkhHb2lBU2dDQUNJRmEwRURkU0lHSUFoSkJFQWdBU0FJSUFackVPSUJJQUVvQWdBaEJRd0JDeUFHSUFoTEJFQWdBeUFGSUFoQkEzUnFOZ0lnQ3lBSVJRMEJDMEVBSVFkQkFDRUdBMEFnRHlBSFFRSjBhaUlKS0FJQUlRb2dCU0FIUVFOMGFpSU9JQVlpQVRZQ0JDQU9JQW8yQWdBZ0NTZ0NBQ0lKSUFGcUlnWkJnSUFDU3cwQkFrQWdBU0FHVHcwQUlBMG9BZ0FoQ2lBSlFRZHhJZzRFUUFOQUlBb2dBVUVDZEdvZ0J6WUNBQ0FCUVFGcUlRRWdEa0VCYXlJT0RRQUxDeUFKUVFGclFRWk5EUUFEUUNBS0lBRkJBblJxSWdrZ0J6WUNBQ0FKSUFjMkFod2dDU0FITmdJWUlBa2dCellDRkNBSklBYzJBaEFnQ1NBSE5nSU1JQWtnQnpZQ0NDQUpJQWMyQWdRZ0FVRUlhaUlCSUFaSERRQUxDeUFIUVFGcUlnY2dDRWNOQUFzZ0JrR0FnQUpHSVF3TElBd0xSUTBBSUFBRVFDQURLQUlNUlEwQkN3SkFJQVF2QVNaQi93Tk5CRUFnQkNrRENDSVNJQVFwQXhBaUVVSUlmQ0lRVXcwQ0lBUW9BZ0FnRWFkcUtRQUFJUkVnQkNBUU53TVFEQUVMUVFFZ0EwRTRhaUFFRUdGRkRRRWdCQ2tERUNFUUlBUXBBd2doRWlBREtRTTRJUkVMSUJFZ0VpQVFmVllOQUNBRUlCQWdFWHczQXhBZ0VhY2lCVUVCU0EwQUlBTWdCQ2dDQUNBUXAyb2lCallDS0NBREFuOGdCaUFGUVFGcklnRnFJZ1F0QUFBaUIwRS9UUVJBSUFNZ0FUWUNMQ0FFTFFBQVFUOXhEQUVMQWtBQ1FBSkFJQWRCQm5aQkFXc09Bd0FCQWdRTElBVkJBa2dOQXlBRElBVkJBbXNpQVRZQ0xDQUZJQVpxUVFKcklnUXRBQUZCQ0hSQmdQNEFjU0FFTFFBQWNnd0NDeUFGUVFOSURRSWdBeUFGUVFOcklnRTJBaXdnQlNBR2FrRURheUlFTFFBQ1FSQjBRWUNBL0FGeElBUXRBQUZCQ0hSeUlBUXRBQUJ5REFFTElBTWdCVUVFYXlJQk5nSXNJQVVnQm1wQkJHc2lCQzBBQWtFUWRDQUVMUUFEUVJoMFFZQ0FnUGdEY1hJZ0JDMEFBVUVJZEhJZ0JDMEFBSElMUVlDQUNHb2lCRFlDTUNBRVFmLy8vdzlMRFFBZ0FFVUVRRUVCSVFzTUFRc2dBeWdDSENFSFFRQWhCU0FES0FJUUlRZ0RRQUpBSUFSQi8vOEhTdzBBQTBBZ0FVRUJTQTBCSUFNZ0FVRUJheUlCTmdJc0lBTWdBU0FHYWkwQUFDQUVRUWgwY2lJRU5nSXdJQVJCZ0lBSVNRMEFDd3NnQXlBSElBZ2dCRUgvL3dGeElndEJBblJxS0FJQUlnbEJBM1JxSWd3b0FnQWdCRUVQZG13Z0Myb2dEQ2dDQkdzaUJEWUNNQ0FDSUFWQkFuUnFJQWsyQWdCQkFTRUxJQVZCQVdvaUJTQUFSdzBBQ3dzTUJ3c2pBRUZBYWlJREpBQWdBMEVBTmdJd0lBTkNBRGNES0NBRFFnQTNBeUFnQTBJQU53TVlJQU5DQURjREVDQURRZ0EzQXdnZ0EwSUFOd01BQWtBQ2Z3SkFJQUVpQkM4QkppSUJSUTBBQWtBZ0FVSC9BMDBFUUNBRUtRTUlJQVFwQXhBaUVFSUVmRk1OQWlBRElBUW9BZ0FnRUtkcUtBQUFJZ2cyQWd3Z0JDQUVLUU1RUWdSOE53TVFEQUVMUVFFZ0EwRU1haUFFRUJWRkRRRWdBeWdDRENFSUN3SkFJQU1vQWdRZ0F5Z0NBQ0lGYTBFQ2RTSUJJQWhKQkVBZ0F5QUlJQUZyRUFvZ0F5Z0NEQ0VJREFFTElBRWdDRTBOQUNBRElBVWdDRUVDZEdvMkFnUUxRUUVnQ0VVTkFSb2dCQ2tEQ0NFUklBTW9BZ0FoQ1VFQUlRVURRRUVBSUFRcEF4QWlFQ0FSV1EwQ0dpQUVLQUlBSWcwZ0VLZHFMUUFBSVFZZ0JDQVFRZ0Y4SWhBM0F4QWdCa0VDZGlFQlFRQWhCd0pBQWtBQ1FBSkFJQVpCQTNFaUNnNEVBZ0VCQUFFTFFRQWdDQ0FCSUFWcUlnRk5EUVVhSUFrZ0JVRUNkR3BCQUNBR1Fmd0JjVUVFYWhENkFSb2dBU0VGREFJTEEwQWdFQ0FSV1EwRUlBMGdFS2RxTFFBQUlRWWdCQ0FRUWdGOEloQTNBeEFnQmlBSFFRTjBRUVp5ZENBQmNpRUJJQWRCQVdvaUJ5QUtSdzBBQ3dzZ0NTQUZRUUowYWlBQk5nSUFDeUFGUVFGcUlnVWdBeWdDRENJSVNRMEFDeUFEUVJCcUlRMGdBeWdDQUNFUEFrQWdBeWdDRkNBREtBSVFJZ0ZySWdWQkFuVWlCa0gvL3dOTkJFQWdEVUdBZ0FRZ0Jtc1FDZ3dCQ3lBRlFZQ0FFRVlOQUNBRElBRkJnSUFRYWpZQ0ZBc0NRQ0FES0FJZ0lBTkJIR29pQVNnQ0FDSUZhMEVEZFNJR0lBaEpCRUFnQVNBSUlBWnJFT0lCSUFFb0FnQWhCUXdCQ3lBR0lBaExCRUFnQXlBRklBaEJBM1JxTmdJZ0N5QUlSUTBCQzBFQUlRZEJBQ0VHQTBBZ0R5QUhRUUowYWlJSktBSUFJUW9nQlNBSFFRTjBhaUlPSUFZaUFUWUNCQ0FPSUFvMkFnQWdDU2dDQUNJSklBRnFJZ1pCZ0lBRVN3MEJBa0FnQVNBR1R3MEFJQTBvQWdBaENpQUpRUWR4SWc0RVFBTkFJQW9nQVVFQ2RHb2dCellDQUNBQlFRRnFJUUVnRGtFQmF5SU9EUUFMQ3lBSlFRRnJRUVpORFFBRFFDQUtJQUZCQW5ScUlna2dCellDQUNBSklBYzJBaHdnQ1NBSE5nSVlJQWtnQnpZQ0ZDQUpJQWMyQWhBZ0NTQUhOZ0lNSUFrZ0J6WUNDQ0FKSUFjMkFnUWdBVUVJYWlJQklBWkhEUUFMQ3lBSFFRRnFJZ2NnQ0VjTkFBc2dCa0dBZ0FSR0lRd0xJQXdMUlEwQUlBQUVRQ0FES0FJTVJRMEJDd0pBSUFRdkFTWkIvd05OQkVBZ0JDa0RDQ0lTSUFRcEF4QWlFVUlJZkNJUVV3MENJQVFvQWdBZ0VhZHFLUUFBSVJFZ0JDQVFOd01RREFFTFFRRWdBMEU0YWlBRUVHRkZEUUVnQkNrREVDRVFJQVFwQXdnaEVpQURLUU00SVJFTElCRWdFaUFRZlZZTkFDQUVJQkFnRVh3M0F4QWdFYWNpQlVFQlNBMEFJQU1nQkNnQ0FDQVFwMm9pQmpZQ0tDQURBbjhnQmlBRlFRRnJJZ0ZxSWdRdEFBQWlCMEUvVFFSQUlBTWdBVFlDTENBRUxRQUFRVDl4REFFTEFrQUNRQUpBSUFkQkJuWkJBV3NPQXdBQkFnUUxJQVZCQWtnTkF5QURJQVZCQW1zaUFUWUNMQ0FGSUFacVFRSnJJZ1F0QUFGQkNIUkJnUDRBY1NBRUxRQUFjZ3dDQ3lBRlFRTklEUUlnQXlBRlFRTnJJZ0UyQWl3Z0JTQUdha0VEYXlJRUxRQUNRUkIwUVlDQS9BRnhJQVF0QUFGQkNIUnlJQVF0QUFCeURBRUxJQU1nQlVFRWF5SUJOZ0lzSUFVZ0JtcEJCR3NpQkMwQUFrRVFkQ0FFTFFBRFFSaDBRWUNBZ1BnRGNYSWdCQzBBQVVFSWRISWdCQzBBQUhJTFFZQ0FFR29pQkRZQ01DQUVRZi8vL3g5TERRQWdBRVVFUUVFQklRc01BUXNnQXlnQ0hDRUhRUUFoQlNBREtBSVFJUWdEUUFKQUlBUkIvLzhQU3cwQUEwQWdBVUVCU0EwQklBTWdBVUVCYXlJQk5nSXNJQU1nQVNBR2FpMEFBQ0FFUVFoMGNpSUVOZ0l3SUFSQmdJQVFTUTBBQ3dzZ0F5QUhJQWdnQkVILy93TnhJZ3RCQW5ScUtBSUFJZ2xCQTNScUlnd29BZ0FnQkVFUWRtd2dDMm9nRENnQ0JHc2lCRFlDTUNBQ0lBVkJBblJxSUFrMkFnQkJBU0VMSUFWQkFXb2lCU0FBUncwQUN3c01CZ3NqQUVGQWFpSURKQUFnQTBFQU5nSXdJQU5DQURjREtDQURRZ0EzQXlBZ0EwSUFOd01ZSUFOQ0FEY0RFQ0FEUWdBM0F3Z2dBMElBTndNQUFrQUNmd0pBSUFFaUJDOEJKaUlCUlEwQUFrQWdBVUgvQTAwRVFDQUVLUU1JSUFRcEF4QWlFRUlFZkZNTkFpQURJQVFvQWdBZ0VLZHFLQUFBSWdnMkFnd2dCQ0FFS1FNUVFnUjhOd01RREFFTFFRRWdBMEVNYWlBRUVCVkZEUUVnQXlnQ0RDRUlDd0pBSUFNb0FnUWdBeWdDQUNJRmEwRUNkU0lCSUFoSkJFQWdBeUFJSUFGckVBb2dBeWdDRENFSURBRUxJQUVnQ0UwTkFDQURJQVVnQ0VFQ2RHbzJBZ1FMUVFFZ0NFVU5BUm9nQkNrRENDRVJJQU1vQWdBaENVRUFJUVVEUUVFQUlBUXBBeEFpRUNBUldRMENHaUFFS0FJQUlnMGdFS2RxTFFBQUlRWWdCQ0FRUWdGOEloQTNBeEFnQmtFQ2RpRUJRUUFoQndKQUFrQUNRQUpBSUFaQkEzRWlDZzRFQWdFQkFBRUxRUUFnQ0NBQklBVnFJZ0ZORFFVYUlBa2dCVUVDZEdwQkFDQUdRZndCY1VFRWFoRDZBUm9nQVNFRkRBSUxBMEFnRUNBUldRMEVJQTBnRUtkcUxRQUFJUVlnQkNBUVFnRjhJaEEzQXhBZ0JpQUhRUU4wUVFaeWRDQUJjaUVCSUFkQkFXb2lCeUFLUncwQUN3c2dDU0FGUVFKMGFpQUJOZ0lBQ3lBRlFRRnFJZ1VnQXlnQ0RDSUlTUTBBQ3lBRFFSQnFJUTBnQXlnQ0FDRVBBa0FnQXlnQ0ZDQURLQUlRSWdGcklnVkJBblVpQmtILy93OU5CRUFnRFVHQWdCQWdCbXNRQ2d3QkN5QUZRWUNBd0FCR0RRQWdBeUFCUVlDQVFHczJBaFFMQWtBZ0F5Z0NJQ0FEUVJ4cUlnRW9BZ0FpQld0QkEzVWlCaUFJU1FSQUlBRWdDQ0FHYXhEaUFTQUJLQUlBSVFVTUFRc2dCaUFJU3dSQUlBTWdCU0FJUVFOMGFqWUNJQXNnQ0VVTkFRdEJBQ0VIUVFBaEJnTkFJQThnQjBFQ2RHb2lDU2dDQUNFS0lBVWdCMEVEZEdvaURpQUdJZ0UyQWdRZ0RpQUtOZ0lBSUFrb0FnQWlDU0FCYWlJR1FZQ0FFRXNOQVFKQUlBRWdCazhOQUNBTktBSUFJUW9nQ1VFSGNTSU9CRUFEUUNBS0lBRkJBblJxSUFjMkFnQWdBVUVCYWlFQklBNUJBV3NpRGcwQUN3c2dDVUVCYTBFR1RRMEFBMEFnQ2lBQlFRSjBhaUlKSUFjMkFnQWdDU0FITmdJY0lBa2dCellDR0NBSklBYzJBaFFnQ1NBSE5nSVFJQWtnQnpZQ0RDQUpJQWMyQWdnZ0NTQUhOZ0lFSUFGQkNHb2lBU0FHUncwQUN3c2dCMEVCYWlJSElBaEhEUUFMSUFaQmdJQVFSaUVNQ3lBTUMwVU5BQ0FBQkVBZ0F5Z0NERVVOQVFzQ1FDQUVMd0VtUWY4RFRRUkFJQVFwQXdnaUVpQUVLUU1RSWhGQ0NId2lFRk1OQWlBRUtBSUFJQkduYWlrQUFDRVJJQVFnRURjREVBd0JDMEVCSUFOQk9Hb2dCQkJoUlEwQklBUXBBeEFoRUNBRUtRTUlJUklnQXlrRE9DRVJDeUFSSUJJZ0VIMVdEUUFnQkNBUUlCRjhOd01RSUJHbklnVkJBVWdOQUNBRElBUW9BZ0FnRUtkcUlnWTJBaWdnQXdKL0lBWWdCVUVCYXlJQmFpSUVMUUFBSWdkQlAwMEVRQ0FESUFFMkFpd2dCQzBBQUVFL2NRd0JDd0pBQWtBQ1FDQUhRUVoyUVFGckRnTUFBUUlFQ3lBRlFRSklEUU1nQXlBRlFRSnJJZ0UyQWl3Z0JTQUdha0VDYXlJRUxRQUJRUWgwUVlEK0FIRWdCQzBBQUhJTUFnc2dCVUVEU0EwQ0lBTWdCVUVEYXlJQk5nSXNJQVVnQm1wQkEyc2lCQzBBQWtFUWRFR0FnUHdCY1NBRUxRQUJRUWgwY2lBRUxRQUFjZ3dCQ3lBRElBVkJCR3NpQVRZQ0xDQUZJQVpxUVFScklnUXRBQUpCRUhRZ0JDMEFBMEVZZEVHQWdJRDRBM0Z5SUFRdEFBRkJDSFJ5SUFRdEFBQnlDMEdBZ0VCcklnUTJBakFnQkVILy8vLy9BRXNOQUNBQVJRUkFRUUVoQ3d3QkN5QURLQUljSVFkQkFDRUZJQU1vQWhBaENBTkFBa0FnQkVILy96OUxEUUFEUUNBQlFRRklEUUVnQXlBQlFRRnJJZ0UyQWl3Z0F5QUJJQVpxTFFBQUlBUkJDSFJ5SWdRMkFqQWdCRUdBZ01BQVNRMEFDd3NnQXlBSElBZ2dCRUgvL3c5eElndEJBblJxS0FJQUlnbEJBM1JxSWd3b0FnQWdCRUVTZG13Z0Myb2dEQ2dDQkdzaUJEWUNNQ0FDSUFWQkFuUnFJQWsyQWdCQkFTRUxJQVZCQVdvaUJTQUFSdzBBQ3dzTUJRc2pBRUZBYWlJREpBQWdBMEVBTmdJd0lBTkNBRGNES0NBRFFnQTNBeUFnQTBJQU53TVlJQU5DQURjREVDQURRZ0EzQXdnZ0EwSUFOd01BQWtBQ2Z3SkFJQUVpQkM4QkppSUJSUTBBQWtBZ0FVSC9BMDBFUUNBRUtRTUlJQVFwQXhBaUVFSUVmRk1OQWlBRElBUW9BZ0FnRUtkcUtBQUFJZ2cyQWd3Z0JDQUVLUU1RUWdSOE53TVFEQUVMUVFFZ0EwRU1haUFFRUJWRkRRRWdBeWdDRENFSUN3SkFJQU1vQWdRZ0F5Z0NBQ0lGYTBFQ2RTSUJJQWhKQkVBZ0F5QUlJQUZyRUFvZ0F5Z0NEQ0VJREFFTElBRWdDRTBOQUNBRElBVWdDRUVDZEdvMkFnUUxRUUVnQ0VVTkFSb2dCQ2tEQ0NFUklBTW9BZ0FoQ1VFQUlRVURRRUVBSUFRcEF4QWlFQ0FSV1EwQ0dpQUVLQUlBSWcwZ0VLZHFMUUFBSVFZZ0JDQVFRZ0Y4SWhBM0F4QWdCa0VDZGlFQlFRQWhCd0pBQWtBQ1FBSkFJQVpCQTNFaUNnNEVBZ0VCQUFFTFFRQWdDQ0FCSUFWcUlnRk5EUVVhSUFrZ0JVRUNkR3BCQUNBR1Fmd0JjVUVFYWhENkFSb2dBU0VGREFJTEEwQWdFQ0FSV1EwRUlBMGdFS2RxTFFBQUlRWWdCQ0FRUWdGOEloQTNBeEFnQmlBSFFRTjBRUVp5ZENBQmNpRUJJQWRCQVdvaUJ5QUtSdzBBQ3dzZ0NTQUZRUUowYWlBQk5nSUFDeUFGUVFGcUlnVWdBeWdDRENJSVNRMEFDeUFEUVJCcUlRMGdBeWdDQUNFUEFrQWdBeWdDRkNBREtBSVFJZ0ZySWdWQkFuVWlCa0gvL3g5TkJFQWdEVUdBZ0NBZ0Jtc1FDZ3dCQ3lBRlFZQ0FnQUZHRFFBZ0F5QUJRWUNBZ0FGcU5nSVVDd0pBSUFNb0FpQWdBMEVjYWlJQktBSUFJZ1ZyUVFOMUlnWWdDRWtFUUNBQklBZ2dCbXNRNGdFZ0FTZ0NBQ0VGREFFTElBWWdDRXNFUUNBRElBVWdDRUVEZEdvMkFpQUxJQWhGRFFFTFFRQWhCMEVBSVFZRFFDQVBJQWRCQW5ScUlna29BZ0FoQ2lBRklBZEJBM1JxSWc0Z0JpSUJOZ0lFSUE0Z0NqWUNBQ0FKS0FJQUlna2dBV29pQmtHQWdDQkxEUUVDUUNBQklBWlBEUUFnRFNnQ0FDRUtJQWxCQjNFaURnUkFBMEFnQ2lBQlFRSjBhaUFITmdJQUlBRkJBV29oQVNBT1FRRnJJZzROQUFzTElBbEJBV3RCQmswTkFBTkFJQW9nQVVFQ2RHb2lDU0FITmdJQUlBa2dCellDSENBSklBYzJBaGdnQ1NBSE5nSVVJQWtnQnpZQ0VDQUpJQWMyQWd3Z0NTQUhOZ0lJSUFrZ0J6WUNCQ0FCUVFocUlnRWdCa2NOQUFzTElBZEJBV29pQnlBSVJ3MEFDeUFHUVlDQUlFWWhEQXNnREF0RkRRQWdBQVJBSUFNb0FneEZEUUVMQWtBZ0JDOEJKa0gvQTAwRVFDQUVLUU1JSWhJZ0JDa0RFQ0lSUWdoOEloQlREUUlnQkNnQ0FDQVJwMm9wQUFBaEVTQUVJQkEzQXhBTUFRdEJBU0FEUVRocUlBUVFZVVVOQVNBRUtRTVFJUkFnQkNrRENDRVNJQU1wQXpnaEVRc2dFU0FTSUJCOVZnMEFJQVFnRUNBUmZEY0RFQ0FScHlJRlFRRklEUUFnQXlBRUtBSUFJQkNuYWlJR05nSW9JQU1DZnlBR0lBVkJBV3NpQVdvaUJDMEFBQ0lIUVQ5TkJFQWdBeUFCTmdJc0lBUXRBQUJCUDNFTUFRc0NRQUpBQWtBZ0IwRUdka0VCYXc0REFBRUNCQXNnQlVFQ1NBMERJQU1nQlVFQ2F5SUJOZ0lzSUFVZ0JtcEJBbXNpQkMwQUFVRUlkRUdBL2dCeElBUXRBQUJ5REFJTElBVkJBMGdOQWlBRElBVkJBMnNpQVRZQ0xDQUZJQVpxUVFOcklnUXRBQUpCRUhSQmdJRDhBWEVnQkMwQUFVRUlkSElnQkMwQUFISU1BUXNnQXlBRlFRUnJJZ0UyQWl3Z0JTQUdha0VFYXlJRUxRQUNRUkIwSUFRdEFBTkJHSFJCZ0lDQStBTnhjaUFFTFFBQlFRaDBjaUFFTFFBQWNndEJnSUNBQVdvaUJEWUNNQ0FFUWYvLy8vOEJTdzBBSUFCRkJFQkJBU0VMREFFTElBTW9BaHdoQjBFQUlRVWdBeWdDRUNFSUEwQUNRQ0FFUWYvLy93QkxEUUFEUUNBQlFRRklEUUVnQXlBQlFRRnJJZ0UyQWl3Z0F5QUJJQVpxTFFBQUlBUkJDSFJ5SWdRMkFqQWdCRUdBZ0lBQlNRMEFDd3NnQXlBSElBZ2dCRUgvL3g5eElndEJBblJxS0FJQUlnbEJBM1JxSWd3b0FnQWdCRUVUZG13Z0Myb2dEQ2dDQkdzaUJEWUNNQ0FDSUFWQkFuUnFJQWsyQWdCQkFTRUxJQVZCQVdvaUJTQUFSdzBBQ3dzTUJBc2dBQ0FCSUFJUWNTRUVDeUFFRHdzakFFRkFhaUlESkFBZ0EwRUFOZ0l3SUFOQ0FEY0RLQ0FEUWdBM0F5QWdBMElBTndNWUlBTkNBRGNERUNBRFFnQTNBd2dnQTBJQU53TUFBa0FnQXlBQkVHOUZEUUFnQUFSQUlBTW9BZ3hGRFFFTEFrQWdBUzhCSmtIL0EwMEVRQ0FCS1FNSUloSWdBU2tERUNJUlFnaDhJaEJURFFJZ0FTZ0NBQ0FScDJvcEFBQWhFU0FCSUJBM0F4QU1BUXRCQVNBRFFUaHFJQUVRWVVVTkFTQUJLUU1RSVJBZ0FTa0RDQ0VTSUFNcEF6Z2hFUXNnRVNBU0lCQjlWZzBBSUFFZ0VDQVJmRGNERUNBUnB5SUVRUUZJRFFBZ0F5QUJLQUlBSUJDbmFpSUdOZ0lvSUFNQ2Z5QUdJQVJCQVdzaUFXb2lCUzBBQUNJSFFUOU5CRUFnQXlBQk5nSXNJQVV0QUFCQlAzRU1BUXNDUUFKQUFrQWdCMEVHZGtFQmF3NERBQUVDQkFzZ0JFRUNTQTBESUFNZ0JFRUNheUlCTmdJc0lBUWdCbXBCQW1zaUJDMEFBVUVJZEVHQS9nQnhJQVF0QUFCeURBSUxJQVJCQTBnTkFpQURJQVJCQTJzaUFUWUNMQ0FFSUFacVFRTnJJZ1F0QUFKQkVIUkJnSUQ4QVhFZ0JDMEFBVUVJZEhJZ0JDMEFBSElNQVFzZ0F5QUVRUVJySWdFMkFpd2dCQ0FHYWtFRWF5SUVMUUFDUVJCMElBUXRBQU5CR0hSQmdJQ0ErQU54Y2lBRUxRQUJRUWgwY2lBRUxRQUFjZ3RCZ0lBQmFpSUVOZ0l3SUFSQi8vLy9BVXNOQUNBQVJRUkFRUUVoQ3d3QkN5QURLQUljSVFkQkFDRUZJQU1vQWhBaENBTkFBa0FnQkVILy93QkxEUUFEUUNBQlFRRklEUUVnQXlBQlFRRnJJZ0UyQWl3Z0F5QUJJQVpxTFFBQUlBUkJDSFJ5SWdRMkFqQWdCRUdBZ0FGSkRRQUxDeUFESUFjZ0NDQUVRZjhmY1NJTFFRSjBhaWdDQUNJSlFRTjBhaUlNS0FJQUlBUkJESFpzSUF0cUlBd29BZ1JySWdRMkFqQWdBaUFGUVFKMGFpQUpOZ0lBUVFFaEN5QUZRUUZxSWdVZ0FFY05BQXNMREFFTElBQWdBU0FDRUhFUEN5QURLQUljSWdBRVFDQURJQUEyQWlBZ0FCRHJBUXNnQXlnQ0VDSUFCRUFnQXlBQU5nSVVJQUFRNndFTElBTW9BZ0FpQUFSQUlBTWdBRFlDQkNBQUVPc0JDeUFEUVVCckpBQWdDd3ZORmdFT2Z3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBQ0lIS0FJSUlnWW9BaHhCQVdzT0JnRUFBd0lGQkEwTElBWXNBQmdpQXhEcUFTRUVJQWNvQWhBaUFDZ0NVQVIvSUFBb0FnQW9BZ0FnQUNnQ01Hb0ZRUUFMSVFrZ0FVVU5DeUFEUVFGT0JFQWdBMEY4Y1NFS0lBTkJBM0VoQ3lBRFFRRnJRUU5KSVF4QkFDRUdBMEJCQUNFQUlBb2hBaUFNUlFSQUEwQWdBQ0FFYWlBSklBVkJBblJxSWdnb0FnQTZBQUFnQkNBQVFRRnlhaUFJS0FJRU9nQUFJQVFnQUVFQ2Ntb2dDQ2dDQ0RvQUFDQUVJQUJCQTNKcUlBZ29BZ3c2QUFBZ0FFRUVhaUVBSUFWQkJHb2hCU0FDUVFScklnSU5BQXNMSUFzaUFnUkFBMEFnQUNBRWFpQUpJQVZCQW5ScUtBSUFPZ0FBSUFCQkFXb2hBQ0FGUVFGcUlRVWdBa0VCYXlJQ0RRQUxDeUFIS0FJSUtBSkFLQUlBSUFacUlBUWdBeEQ1QVJvZ0F5QUdhaUVHSUE5QkFXb2lEeUFCUncwQUN3d01DeUFHS0FKQUtBSUFJQVFnQXhENUFSb2dBVUVCUmcwTElBRkJBV3NpQmtFQmNTRUNRUUFoQUNBQlFRSkdEUVVnQmtGK2NTRUZJQU1oQUFOQUlBY29BZ2dvQWtBb0FnQWdBR29nQkNBREVQa0JHaUFBSUFOcUlnQWdCeWdDQ0NnQ1FDZ0NBR29nQkNBREVQa0JHaUFGUVFKcklnVkZEUVlnQUNBRGFpRUFEQUFMQUFzZ0Jpd0FHQ0lERU9vQklRUWdCeWdDRUNJQUtBSlFCSDhnQUNnQ0FDZ0NBQ0FBS0FJd2FnVkJBQXNoQ1NBQlJRMEtJQU5CQVU0RVFDQURRWHh4SVFvZ0EwRURjU0VMSUFOQkFXdEJBMGtoREVFQUlRWURRRUVBSVFBZ0NpRUNJQXhGQkVBRFFDQUFJQVJxSUFrZ0JVRUNkR29pQ0NnQ0FEb0FBQ0FFSUFCQkFYSnFJQWdvQWdRNkFBQWdCQ0FBUVFKeWFpQUlLQUlJT2dBQUlBUWdBRUVEY21vZ0NDZ0NERG9BQUNBQVFRUnFJUUFnQlVFRWFpRUZJQUpCQkdzaUFnMEFDd3NnQ3lJQ0JFQURRQ0FBSUFScUlBa2dCVUVDZEdvb0FnQTZBQUFnQUVFQmFpRUFJQVZCQVdvaEJTQUNRUUZySWdJTkFBc0xJQWNvQWdnb0FrQW9BZ0FnQm1vZ0JDQURFUGtCR2lBRElBWnFJUVlnRDBFQmFpSVBJQUZIRFFBTERBc0xJQVlvQWtBb0FnQWdCQ0FERVBrQkdpQUJRUUZHRFFvZ0FVRUJheUlHUVFGeElRSkJBQ0VBSUFGQkFrWU5CU0FHUVg1eElRVWdBeUVBQTBBZ0J5Z0NDQ2dDUUNnQ0FDQUFhaUFFSUFNUStRRWFJQUFnQTJvaUFDQUhLQUlJS0FKQUtBSUFhaUFFSUFNUStRRWFJQVZCQW1zaUJVVU5CaUFBSUFOcUlRQU1BQXNBQzBGL0lBWXNBQmdpQWlBQ2FpSUFJQUFnQWtrYkVPb0JJUVFnQnlnQ0VDSUFLQUpRQkg4Z0FDZ0NBQ2dDQUNBQUtBSXdhZ1ZCQUFzaENTQUJSUTBKSUFKQkFYUWhBeUFDUVFGT0JFQWdBa0Y4Y1NFS0lBSkJBM0VoQ3lBQ1FRRnJRUU5KSVF3RFFFRUFJUUFnQ2lFR0lBeEZCRUFEUUNBRUlBQkJBWFFpQ0dvZ0NTQUZRUUowYWlJQ0tBSUFPd0VBSUFRZ0NFRUNjbW9nQWlnQ0JEc0JBQ0FFSUFoQkJISnFJQUlvQWdnN0FRQWdCQ0FJUVFaeWFpQUNLQUlNT3dFQUlBQkJCR29oQUNBRlFRUnFJUVVnQmtFRWF5SUdEUUFMQ3lBTElnSUVRQU5BSUFRZ0FFRUJkR29nQ1NBRlFRSjBhaWdDQURzQkFDQUFRUUZxSVFBZ0JVRUJhaUVGSUFKQkFXc2lBZzBBQ3dzZ0J5Z0NDQ2dDUUNnQ0FDQU5haUFFSUFNUStRRWFJQU1nRFdvaERTQU9RUUZxSWc0Z0FVY05BQXNNQ2dzZ0JpZ0NRQ2dDQUNBRUlBTVErUUVhSUFGQkFVWU5DU0FCUVFGcklnWkJBWEVoQWtFQUlRQWdBVUVDUmcwRklBWkJmbkVoQlNBRElRQURRQ0FIS0FJSUtBSkFLQUlBSUFCcUlBUWdBeEQ1QVJvZ0FDQURhaUlBSUFjb0FnZ29Ba0FvQWdCcUlBUWdBeEQ1QVJvZ0JVRUNheUlGUlEwR0lBQWdBMm9oQUF3QUN3QUxRWDhnQml3QUdDSUNJQUpxSWdBZ0FDQUNTUnNRNmdFaEJDQUhLQUlRSWdBb0FsQUVmeUFBS0FJQUtBSUFJQUFvQWpCcUJVRUFDeUVKSUFGRkRRZ2dBa0VCZENFRElBSkJBVTRFUUNBQ1FYeHhJUW9nQWtFRGNTRUxJQUpCQVd0QkEwa2hEQU5BUVFBaEFDQUtJUVlnREVVRVFBTkFJQVFnQUVFQmRDSUlhaUFKSUFWQkFuUnFJZ0lvQWdBN0FRQWdCQ0FJUVFKeWFpQUNLQUlFT3dFQUlBUWdDRUVFY21vZ0FpZ0NDRHNCQUNBRUlBaEJCbkpxSUFJb0FndzdBUUFnQUVFRWFpRUFJQVZCQkdvaEJTQUdRUVJySWdZTkFBc0xJQXNpQWdSQUEwQWdCQ0FBUVFGMGFpQUpJQVZCQW5ScUtBSUFPd0VBSUFCQkFXb2hBQ0FGUVFGcUlRVWdBa0VCYXlJQ0RRQUxDeUFIS0FJSUtBSkFLQUlBSUExcUlBUWdBeEQ1QVJvZ0F5QU5haUVOSUE1QkFXb2lEaUFCUncwQUN3d0pDeUFHS0FKQUtBSUFJQVFnQXhENUFSb2dBVUVCUmcwSUlBRkJBV3NpQmtFQmNTRUNRUUFoQUNBQlFRSkdEUVVnQmtGK2NTRUZJQU1oQUFOQUlBY29BZ2dvQWtBb0FnQWdBR29nQkNBREVQa0JHaUFBSUFOcUlnQWdCeWdDQ0NnQ1FDZ0NBR29nQkNBREVQa0JHaUFGUVFKcklnVkZEUVlnQUNBRGFpRUFEQUFMQUF0QmZ5QUdMQUFZSWdKQkFuUWlBeUFDUWYvLy8vOERjU0FDUnhzUTZnRWhCQ0FIS0FJUUlnQW9BbEFFZnlBQUtBSUFLQUlBSUFBb0FqQnFCVUVBQ3lFSklBRkZEUWNnQWtFQlRnUkFJQUpCZkhFaENpQUNRUU54SVFzZ0FrRUJhMEVEU1NFTUEwQkJBQ0VBSUFvaEJpQU1SUVJBQTBBZ0JDQUFRUUowSWdocUlBa2dCVUVDZEdvaUFpZ0NBRFlDQUNBRUlBaEJCSEpxSUFJb0FnUTJBZ0FnQkNBSVFRaHlhaUFDS0FJSU5nSUFJQVFnQ0VFTWNtb2dBaWdDRERZQ0FDQUFRUVJxSVFBZ0JVRUVhaUVGSUFaQkJHc2lCZzBBQ3dzZ0N5SUNCRUFEUUNBRUlBQkJBblJxSUFrZ0JVRUNkR29vQWdBMkFnQWdBRUVCYWlFQUlBVkJBV29oQlNBQ1FRRnJJZ0lOQUFzTElBY29BZ2dvQWtBb0FnQWdEV29nQkNBREVQa0JHaUFESUExcUlRMGdEa0VCYWlJT0lBRkhEUUFMREFnTElBWW9Ba0FvQWdBZ0JDQURFUGtCR2lBQlFRRkdEUWNnQVVFQmF5SUdRUUZ4SVFKQkFDRUFJQUZCQWtZTkJTQUdRWDV4SVFVZ0F5RUFBMEFnQnlnQ0NDZ0NRQ2dDQUNBQWFpQUVJQU1RK1FFYUlBQWdBMm9pQUNBSEtBSUlLQUpBS0FJQWFpQUVJQU1RK1FFYUlBVkJBbXNpQlVVTkJpQUFJQU5xSVFBTUFBc0FDMEYvSUFZc0FCZ2lBa0VDZENJRElBSkIvLy8vL3dOeElBSkhHeERxQVNFRUlBY29BaEFpQUNnQ1VBUi9JQUFvQWdBb0FnQWdBQ2dDTUdvRlFRQUxJUWtnQVVVTkJpQUNRUUZPQkVBZ0FrRjhjU0VLSUFKQkEzRWhDeUFDUVFGclFRTkpJUXdEUUVFQUlRQWdDaUVHSUF4RkJFQURRQ0FFSUFCQkFuUWlDR29nQ1NBRlFRSjBhaUlDS0FJQU5nSUFJQVFnQ0VFRWNtb2dBaWdDQkRZQ0FDQUVJQWhCQ0hKcUlBSW9BZ2cyQWdBZ0JDQUlRUXh5YWlBQ0tBSU1OZ0lBSUFCQkJHb2hBQ0FGUVFScUlRVWdCa0VFYXlJR0RRQUxDeUFMSWdJRVFBTkFJQVFnQUVFQ2RHb2dDU0FGUVFKMGFpZ0NBRFlDQUNBQVFRRnFJUUFnQlVFQmFpRUZJQUpCQVdzaUFnMEFDd3NnQnlnQ0NDZ0NRQ2dDQUNBTmFpQUVJQU1RK1FFYUlBTWdEV29oRFNBT1FRRnFJZzRnQVVjTkFBc01Cd3NnQmlnQ1FDZ0NBQ0FFSUFNUStRRWFJQUZCQVVZTkJpQUJRUUZySWdaQkFYRWhBa0VBSVFBZ0FVRUNSZzBGSUFaQmZuRWhCU0FESVFBRFFDQUhLQUlJS0FKQUtBSUFJQUJxSUFRZ0F4RDVBUm9nQUNBRGFpSUFJQWNvQWdnb0FrQW9BZ0JxSUFRZ0F4RDVBUm9nQlVFQ2F5SUZSUTBHSUFBZ0Eyb2hBQXdBQ3dBTElBSkZEUVVnQnlnQ0NDZ0NRQ2dDQUNBQUlBTnFhaUFFSUFNUStRRWFEQVVMSUFKRkRRUWdCeWdDQ0NnQ1FDZ0NBQ0FBSUFOcWFpQUVJQU1RK1FFYURBUUxJQUpGRFFNZ0J5Z0NDQ2dDUUNnQ0FDQUFJQU5xYWlBRUlBTVErUUVhREFNTElBSkZEUUlnQnlnQ0NDZ0NRQ2dDQUNBQUlBTnFhaUFFSUFNUStRRWFEQUlMSUFKRkRRRWdCeWdDQ0NnQ1FDZ0NBQ0FBSUFOcWFpQUVJQU1RK1FFYURBRUxJQUpGRFFBZ0J5Z0NDQ2dDUUNnQ0FDQUFJQU5xYWlBRUlBTVErUUVhQ3lBRUVPc0JRUUVoQkFzZ0JBczVBUUYvSUFBZ0FUWUNCQ0FCS0FJRUtBSUlJQUpCQW5ScUlnRW9BZ0FoQXlBQUlBSTJBZ3dnQUNBRE5nSUlJQUVvQWdBb0FoeEJDVVlMTGdBQ2Z5QUFLQUlFTFFBa1FRRk5CRUJCQUNBQUlBQW9BZ0FvQWpRUkFBQkZEUUVhQ3lBQUlBRWdBaEF2Q3d1Y0FRQUNRQ0FBS0FJRUxRQWtRUUpQQkVCQkFDRUJJQUFnQUNnQ0FDZ0NOQkVBQUVVTkFRc2dBQ2dDRUNFQ1FTZ1E2Z0VpQVVJQU53TUlJQUZCZnpZQ0FDQUJRZ0EzQXhnZ0FVRUFOZ0lRSUFGQ0FEY0RJQ0FBUVJocUlBRWdBQ2dDR0NnQ0VCRUVBQ0FDS0FKWUlRQWdBaUFCTmdKWVFRRWhBU0FBUlEwQUlBQW9BZ2dpQWdSQUlBQWdBallDRENBQ0VQY0JDeUFBRVBjQkN5QUJDeEVBSUFBZ0FTQUFLQUlBS0FJNEVRRUFDNTBDQWdaL0FuNGdBQkFoSVFJZ0FDZ0NCQ2dDSUNFQkFrQWdBQ2dDSkNJRUlBQkJJR29pQmlnQ0FDSURhMEVDZFNJRklBSWdBQ2dDQ0NBQ0d5d0FHQ0lDU1FSQUlBWWdBaUFGYXhBS0lBQW9BaUFoQXlBQUtBSWtJUVFNQVFzZ0FpQUZUdzBBSUFBZ0F5QUNRUUowYWlJRU5nSWtDMEVBSVFJQ1FDQUJLUU1JSUFFcEF4QWlCeUFFSUFOcklnU3RJZ2g4VXcwQUlBTWdBU2dDQUNBSHAyb2dCQkQ1QVJvZ0FTQUJLUU1RSUFoOElnYzNBeEFnQVNrRENDQUhRZ1I4VXcwQUlBQWdBU2dDQUNBSHAyb29BQUEyQWl3Z0FTQUJLUU1RSWdoQ0JId2lCemNERUNBQktRTUlJQWRYRFFBZ0FTZ0NBQ0FIcDJvdEFBQWhBeUFCSUFoQ0JYdzNBeEFnQTBFQmEwRWRTdzBBSUFBZ0F6WUNIRUVCSVFJTElBSUxFZ0FnQUVFWWFpQUFFQ0VnQUNnQ0NCQU5DK0lLQWdKL0FuNGpBRUV3YXlJREpBQWdBMEhHRUNrQkFEY0JKaUFEUWNBUUtRTUFOd01nSUFOQnVCQXBBd0EzQXhnZ0EwR3dFQ2tEQURjREVBSkFBa0FnQVNrRENDQUJLUU1RSWdWQ0JYeFRCRUFnQTBFUWFoRDhBU0lCUVhCUERRSUNRQUpBSUFGQkMwOEVRQ0FCUVJCcVFYQnhJZ1FRNmdFaEFpQURJQVJCZ0lDQWdIaHlOZ0lJSUFNZ0FqWUNBQ0FESUFFMkFnUU1BUXNnQXlBQk9nQUxJQU1oQWlBQlJRMEJDeUFDSUFOQkVHb2dBUkQ1QVJvTElBRWdBbXBCQURvQUFDQUFRWDQyQWdBZ0FFRUVhaUVBSUFNc0FBdEJBRTRFUUNBQUlBTXBBd0EzQWdBZ0FDQURLQUlJTmdJSURBSUxJQUFnQXlnQ0FDSUFJQU1vQWdRUTdBRWdBQkQzQVF3QkN5QUNJQUVvQWdBZ0JhZHFJZ1FvQUFBMkFBQWdBaUFFTFFBRU9nQUVJQUVnQVNrREVFSUZmQ0lGTndNUUlBSkJ2d2xCQlJEa0FRUkFRU0FRNmdFaUFVR1FDeTBBQURvQUVDQUJRWWdMS1FBQU53QUlJQUZCZ0FzcEFBQTNBQUFnQVVFQU9nQVJJQUJCZnpZQ0FDQUFRUVJxSUFGQkVSRHNBU0FCRVBjQkRBRUxJQVVnQVNrRENGa0VRQ0FEUVJCcUVQd0JJZ0ZCY0U4TkFnSkFBa0FnQVVFTFR3UkFJQUZCRUdwQmNIRWlCQkRxQVNFQ0lBTWdCRUdBZ0lDQWVISTJBZ2dnQXlBQ05nSUFJQU1nQVRZQ0JBd0JDeUFESUFFNkFBc2dBeUVDSUFGRkRRRUxJQUlnQTBFUWFpQUJFUGtCR2dzZ0FTQUNha0VBT2dBQUlBQkJmallDQUNBQVFRUnFJUUFnQXl3QUMwRUFUZ1JBSUFBZ0F5a0RBRGNDQUNBQUlBTW9BZ2cyQWdnTUFnc2dBQ0FES0FJQUlnQWdBeWdDQkJEc0FTQUFFUGNCREFFTElBSWdBU2dDQUNBRnAyb3RBQUE2QUFVZ0FTQUJLUU1RUWdGOElnVTNBeEFnQlNBQktRTUlXUVJBSUFOQkVHb1EvQUVpQVVGd1R3MENBa0FDUUNBQlFRdFBCRUFnQVVFUWFrRndjU0lFRU9vQklRSWdBeUFFUVlDQWdJQjRjallDQ0NBRElBSTJBZ0FnQXlBQk5nSUVEQUVMSUFNZ0FUb0FDeUFESVFJZ0FVVU5BUXNnQWlBRFFSQnFJQUVRK1FFYUN5QUJJQUpxUVFBNkFBQWdBRUYrTmdJQUlBQkJCR29oQUNBRExBQUxRUUJPQkVBZ0FDQURLUU1BTndJQUlBQWdBeWdDQ0RZQ0NBd0NDeUFBSUFNb0FnQWlBQ0FES0FJRUVPd0JJQUFROXdFTUFRc2dBaUFCS0FJQUlBV25haTBBQURvQUJpQUJJQUVwQXhCQ0FYd2lCVGNERUNBRklBRXBBd2haQkVBZ0EwRVFhaEQ4QVNJQlFYQlBEUUlDUUFKQUlBRkJDMDhFUUNBQlFSQnFRWEJ4SWdRUTZnRWhBaUFESUFSQmdJQ0FnSGh5TmdJSUlBTWdBallDQUNBRElBRTJBZ1FNQVFzZ0F5QUJPZ0FMSUFNaEFpQUJSUTBCQ3lBQ0lBTkJFR29nQVJENUFSb0xJQUVnQW1wQkFEb0FBQ0FBUVg0MkFnQWdBRUVFYWlFQUlBTXNBQXRCQUU0RVFDQUFJQU1wQXdBM0FnQWdBQ0FES0FJSU5nSUlEQUlMSUFBZ0F5Z0NBQ0lBSUFNb0FnUVE3QUVnQUJEM0FRd0JDeUFDSUFFb0FnQWdCYWRxTFFBQU9nQUhJQUVnQVNrREVFSUJmQ0lGTndNUUlBVWdBU2tEQ0ZrRVFDQURJQU5CRUdvUUd5RUJJQUJCZmpZQ0FDQUFRUVJxSVFBZ0FTd0FDMEVBVGdSQUlBQWdBeWtEQURjQ0FDQUFJQU1vQWdnMkFnZ01BZ3NnQUNBQktBSUFJQUVvQWdRUTdBRWdBU3dBQzBGL1NnMEJJQUVvQWdBUTl3RU1BUXNnQWlBQktBSUFJQVduYWkwQUFEb0FDQ0FCSUFFcEF4QWlCVUlCZkNJR053TVFJQUVwQXdnZ0JVSURmRk1FUUNBRElBTkJFR29RR3lFQklBQkJmallDQUNBQVFRUnFJUUFnQVN3QUMwRUFUZ1JBSUFBZ0F5a0RBRGNDQUNBQUlBTW9BZ2cyQWdnTUFnc2dBQ0FCS0FJQUlBRW9BZ1FRN0FFZ0FTd0FDMEYvU2cwQklBRW9BZ0FROXdFTUFRc2dBaUFCS0FJQUlBYW5haThBQURzQkNpQUJJQUVwQXhCQ0FudzNBeEFnQUVJQU53SUlJQUJDQURjQ0FBc2dBMEV3YWlRQUR3c1E1d0VBQ3hvQUlBQW9BaXdFUUNBQUlBQW9BZ0FvQWpBUkFBQVBDMEVBQ3dRQVFRRUxGZ0FnQUNnQ01DSUFJQUVnQUNnQ0FDZ0NGQkVCQUF1ZUNnSUNmd0YrSUFBb0FpQWlBU2tEQ0NBQktRTVFJZ05WQkg4Z0FTZ0NBQ0FEcDJvdEFBQWhBaUFCSUFOQ0FYdzNBeEFnQUNnQ01DRUJJQUJCQURZQ01DQUJCRUFnQVNBQktBSUFLQUlFRVFJQUN3SkFBa0FDUUFKQUFrQUNRQ0FDRGdNQUFRSUVDMEdBQXhEcUFTSUJRYlFPTmdJQUlBRkJCR3BCQUVIUUFCRDZBUm9nQVVJQU53TmdJQUZCZnpZQ1hDQUJRbjgzQWxRZ0FVSUFOd05vSUFGQ0FEY0RjQ0FCUWdBM0EzZ2dBVUlBTndPQUFTQUJRZ0EzQTRnQklBRkNBRGNEa0FFZ0FVSUFOd0tjQVNBQlFZQ0FnUHdETmdLWUFTQUJRZ0EzQXFRQklBRkNBRGNDckFFZ0FVSUFOd0swQVNBQlFnQTNBcndCSUFGQ0FEY0N4QUVnQVVJQU53TE1BU0FCUVFBMkF1Z0JJQUZCQURzQmpnSWdBVUwvLy8vL0R6Y0MxQUVnQVVJQU53TGNBU0FCUWdBM0FJVUNJQUZDQURjRGdBSWdBVUlBTndQNEFTQUJRZ0EzQS9BQklBRkNBRGNEbUFJZ0FVRUFOZ0tRQWlBQlFnQTNBNkFDSUFGQ0FEY0RxQUlnQVVJQU53Q3RBaUFCUWdBM0E5QUNJQUZCQURZQ3lBSWdBVUlBTndQWUFpQUJRZ0EzQStBQ0lBRkNBRGNBNVFJZ0FVSUFOd0cyQWlBQlFnQTNBTDBDSUFGQ0FEY0I5QUlnQVVJQU53SHVBZ3dDQzBHb0F4RHFBU0lCUWVnT05nSUFJQUZCQkdwQkFFSFFBQkQ2QVJvZ0FVSUFOd05nSUFGQmZ6WUNYQ0FCUW44M0FsUWdBVUlBTndOb0lBRkNBRGNEY0NBQlFnQTNBM2dnQVVJQU53T0FBU0FCUWdBM0E0Z0JJQUZDQURjRGtBRWdBVUlBTndLY0FTQUJRWUNBZ1B3RE5nS1lBU0FCUWdBM0FxUUJJQUZDQURjQ3JBRWdBVUlBTndLMEFTQUJRZ0EzQXJ3QklBRkNBRGNDeEFFZ0FVSUFOd0xNQVNBQlFRQTJBdWdCSUFGQkFEc0JqZ0lnQVVMLy8vLy9EemNDMUFFZ0FVSUFOd0xjQVNBQlFnQTNBSVVDSUFGQ0FEY0RnQUlnQVVJQU53UDRBU0FCUWdBM0EvQUJJQUZDQURjRG1BSWdBVUVBTmdLUUFpQUJRZ0EzQTZBQ0lBRkNBRGNEcUFJZ0FVSUFOd0N0QWlBQlFnQTNBOUFDSUFGQkFEWUN5QUlnQVVJQU53UFlBaUFCUWdBM0ErQUNJQUZDQURjQTVRSWdBVUlBTndHMkFpQUJRZ0EzQUwwQ0lBRkNBRGNBbFFNZ0FVSUFOd0dPQXlBQlFnQTNBWVlESUFGQ0FEY0IvZ0lnQVVJQU53SDJBaUFCUWdBM0FlNENJQUZDZnpjRG9BTU1BUXRCdUFNUTZnRWlBVUdZRHpZQ0FDQUJRUVJxUVFCQjBBQVErZ0VhSUFGQ0FEY0RZQ0FCUVg4MkFsd2dBVUovTndKVUlBRkNBRGNEYUNBQlFnQTNBM0FnQVVJQU53TjRJQUZDQURjRGdBRWdBVUlBTndPSUFTQUJRZ0EzQTVBQklBRkNBRGNDbkFFZ0FVR0FnSUQ4QXpZQ21BRWdBVUlBTndLa0FTQUJRZ0EzQXF3QklBRkNBRGNDdEFFZ0FVSUFOd0s4QVNBQlFnQTNBc1FCSUFGQ0FEY0N6QUVnQVVFQU5nTG9BU0FCUVFBN0FZNENJQUZDLy8vLy93ODNBdFFCSUFGQ0FEY0MzQUVnQVVJQU53Q0ZBaUFCUWdBM0E0QUNJQUZDQURjRCtBRWdBVUlBTndQd0FTQUJRZ0EzQTVnQ0lBRkJBRFlDa0FJZ0FVSUFOd09nQWlBQlFnQTNBNmdDSUFGQ0FEY0FyUUlnQVVJQU53UFFBaUFCUVFBMkFzZ0NJQUZDQURjRDJBSWdBVUlBTndQZ0FpQUJRZ0EzQU9VQ0lBRkNBRGNCdGdJZ0FVSUFOd0M5QWlBQlFRQTdBWTRESUFGQ0FEY0JoZ01nQVVJQU53SCtBaUFCUWdBM0FmWUNJQUZDQURjQjdnSWdBVUtDZ0lDQThBQTNBNWdESUFGQ2Z6Y0RrQU1nQVVJQU53T3dBeUFCUWdBM0E2Z0RJQUZDQURjRG9BTUxJQUFvQWpBaEFpQUFJQUUyQWpBZ0FrVU5BU0FDSUFJb0FnQW9BZ1FSQWdBTElBQW9BakFpQVEwQVFRQVBDeUFCSUFBZ0FTZ0NBQ2dDQ0JFQkFBVkJBQXNMRkFBZ0FDZ0NNQ0lBSUFBb0FnQW9BaGdSQUFBTEZBQWdBQ2dDTUNJQUlBQW9BZ0FvQWh3UkFBQUxDd0FnQUNBQk5nSUVRUUVMMVFFQkJIOGdBQ2dDMkFFaUFpQUFLQUxjQVVjRVFBTkFBa0FnQWlBRVFaQUJiR29vQWdBaUFrRUFTQTBBSUFJZ0FDZ0NCQ0lES0FJTUlBTW9BZ2dpQld0QkFuVk9EUUJCQUNFRElBVWdBa0VDZEdvb0FnQWlBaUFDS0FJQUtBSVlFUUFBUVFCTURRQURRQ0FDSUFNZ0FpZ0NBQ2dDRkJFQkFDQUJSd1JBSUFJZ0FpZ0NBQ2dDR0JFQUFDQURRUUZxSWdOS0RRRU1BZ3NMSUFBb0F0Z0JJQVJCa0FGc2FpSUFRUVJxUVFBZ0FDMEFaQnNQQ3lBRVFRRnFJZ1FnQUNnQzNBRWdBQ2dDMkFFaUFtdEJrQUZ0U1EwQUN3dEJBQXZRQVFFRWZ5QUFLQUxZQVNJQ0lBQW9BdHdCUndSQUEwQUNRQ0FDSUFSQmtBRnNhaWdDQUNJQ1FRQklEUUFnQWlBQUtBSUVJZ01vQWd3Z0F5Z0NDQ0lGYTBFQ2RVNE5BRUVBSVFNZ0JTQUNRUUowYWlnQ0FDSUNJQUlvQWdBb0FoZ1JBQUJCQUV3TkFBTkFJQUlnQXlBQ0tBSUFLQUlVRVFFQUlBRkhCRUFnQWlBQ0tBSUFLQUlZRVFBQUlBTkJBV29pQTBvTkFRd0NDd3NnQUNnQzJBRWdCRUdRQVd4cVFlZ0FhZzhMSUFSQkFXb2lCQ0FBS0FMY0FTQUFLQUxZQVNJQ2EwR1FBVzFKRFFBTEN5QUFRYmdCYWd2QUVnSUxmd04rSXdCQjRBQnJJZ1lrQUFKQUlBQW9BZ1FpQlNnQ0lDSUNLUU1JSWc4Z0Fpa0RFQ0lPVncwQUlBSW9BZ0FpQnlBT3Ayb3RBQUFoQkNBQ0lBNUNBWHdpRFRjREVDQU5JQTlaRFFBZ0J5QU5wMm90QUFBaENDQUNJQTVDQW53aURUY0RFQUpBSUFSQkdIUkJHSFVpQ1VFQVRnUkFJQUFvQXR3QklBQW9BdGdCSWdOclFaQUJiU0FFVFEwQ0lBTWdCRUdRQVd4cUlnTW9BZ0JCZjB3TkFRd0NDeUFBS0FMVUFVRi9TZzBCSUFCQjFBRnFJUU1MSUFNZ0FUWUNBRUVBSVFNZ0JTOEJKQ0lLUVFoMElBcEJDSFp5UWYvL0EzRkJnZ0pQQkVCQkFDRUtJQTBnRDFrTkFTQUhJQTJuYWkwQUFDRURJQUlnRGtJRGZEY0RFQ0FEUVFGTElnSU5BVUVBSUFNZ0Foc2hBd3NDUUFKL0FrQWdDRVVFUUNBSlFYOU1CSDhnQUVHNEFXb0ZJQUFvQXRnQklBUkJrQUZzYWlJQ1FRQTZBR1FnQWtIb0FHb0xJUVJCQUNFS0FrQWdBdzRDQUFJRkN5TUFRVUJxSWdJa0FDQUFLQUlFS0FJc0lRZEIwQUFRNmdFaUEwR0VHallDQUNBRFFRQTJBZ1FnQTBFQU5nSk1JQU1nQkRZQ1NDQURJQWMyQWtRZ0EwR2NHallDQ0NBRFFnQTNBZ3dnQTBJQU53SVVJQU5DQURjQ0hDQURRZ0EzQWlRZ0EwSUFOd0lzSUFOQkFEWUNOQ0FEUVVCclFRQTJBZ0FnQTBFNGFpSUpRZ0EzQWdBZ0FDZ0NDQ0VGSUFKQ0FEY0RLQ0FDUWdBM0F5QWdBa0VZYWlJSVFnQTNBd0FnQWtJQU53TVFJQUpDQURjRENDQUNRUUEyQWpnZ0FrSUFOd013SUFKQm5CbzJBZ0FnQWlBRk5nSUVJQVVvQWdBaEN5QUZLQUlFSVF3Z0FrRUFPZ0EvSUFnZ0RDQUxhMEVDZFVFRGJpQUNRVDlxRUVZZ0FpZ0NCQ0lJS0FJY0lRc2dDQ2dDR0NFSUlBSkJBRG9BUHlBQ1FTUnFJQXNnQ0d0QkFuVWdBa0UvYWhCR0lBSWdBellDRkNBQ0lBYzJBaEFnQWlBRU5nSU1JQUlnQlRZQ0NDQURRUWhxSUFJUVJ5QUpJQUlvQWpBZ0FpZ0NOQkFTSUFKQm5CbzJBZ0FnQWlnQ01DSUVCRUFnQWlBRU5nSTBJQVFRNndFTElBSkI4QmsyQWdBZ0FpZ0NKQ0lFQkVBZ0JCRHJBUXNnQWlnQ0dDSUVCRUFnQkJEckFRc2dBa0ZBYXlRQUlBTU1BZ3RCQUNFS0lBTU5BeUFKUVFCSURRTWdCU2dDTENFQ0lBQW9BdGdCSVFwQjBBQVE2Z0VpQTBFQU5nSk1JQU1nQWpZQ1JDQURRY3dUTmdJSUlBTkJzQm8yQWdBZ0EwRUFOZ0lFSUFNZ0NpQUVRWkFCYkdvaUJFSG9BR29pQ2pZQ1NDQURRVUJyUVFBMkFnQWdBMElBTndJNElBTkJBRFlDTkNBRFFnQTNBaXdnQTBJQU53SWtJQU5DQURjQ0hDQURRZ0EzQWhRZ0EwSUFOd0lNSUFZZ0FqWUNHQ0FHUWdBM0FrUWdCa0lBTndJOElBWkNBRGNDTkNBR1FnQTNBaXdnQmtJQU53SlVJQVpDQURjQ1RDQUdJQU0yQWh3Z0JpQUdLUU1ZTndNSUlBWWdCRUVFYWlJQ05nSVFJQVlnQ2pZQ0ZDQUdRZ0EzQWlRZ0JrSE1FellDSUNBR0lBWXBBeEEzQXdBZ0JrRWdhaUFDSUFZUVJDQURRUWhxSWdRZ0JrRWdhaUlDRUVjZ0FpQUVSd1JBSUFOQk9Hb2dBaWdDTUNBQ0tBSTBFQklMSUFaQklHb1FSUm9NQWdzakFFSHdBR3NpQXlRQUlBQW9BZ1FvQWl3aEIwSDRBQkRxQVNJQ1FjUVpOZ0lBSUFKQkFEWUNCQ0FDUVFBMkFuUWdBaUFFTmdKd0lBSWdCellDYkNBQ1FnQTNBZ3dnQWtJQU53SVVJQUpDQURjQ0hDQUNRZ0EzQWlRZ0FrSUFOd0lzSUFKQkFEWUNOQ0FDUWdBM0FqZ2dBa0hjR1RZQ0NDQUNRVUJyUWdBM0FnQWdBa0lBTndKSUlBSkNBRGNDVUNBQ1FRQTJBbGdnQWtFQU5nSm9JQUpDQURjQ1lDQUFLQUlJSVFVZ0EwSUFOd013SUFOQ0FEY0RLQ0FEUVNCcUlnbENBRGNEQUNBRFFnQTNBeGdnQTBJQU53TVFJQU5CUUd0Q0FEY0RBQ0FEUWdBM0EwZ2dBMElBTndOUUlBTkJBRFlDV0NBRFFRQTJBbWdnQTBJQU53TTRJQU5CM0JrMkFnZ2dBMElBTndOZ0lBTWdCVFlDRENBRktBSUFJUWdnQlNnQ0JDRUxJQU5CQURvQWJ5QUpJQXNnQ0d0QkFuVkJBMjRnQTBIdkFHb1FSaUFES0FJTUlna29BaHdoQ0NBSktBSVlJUWtnQTBFQU9nQnZJQU5CTEdvZ0NDQUphMEVDZFNBRFFlOEFhaEJHSUFNZ0FqWUNIQ0FESUFjMkFoZ2dBeUFFTmdJVUlBTWdCVFlDRUNBQ1FRaHFJZ1VnQTBFSWFpSUVFRWNDUUNBRUlBVkdCRUFnQWlBRUtBSlVOZ0pjREFFTElBSkJPR29nQkNnQ01DQUVLQUkwRUJJZ0FrSEVBR29nQkNnQ1BDQUVRVUJyS0FJQUVCSWdBa0hRQUdvZ0JDZ0NTQ0FFS0FKTUVCSWdBaUFFS0FKVU5nSmNBa0FnQkNnQ1hDSUxJQVFvQWxnaUJXc2lCMEVDZFNJSklBSW9BbWdpQ0NBQ0tBSmdJZ1JyUVFKMVRRUkFJQVVnQWlnQ1pDQUVheUlIYWlBTElBa2dCMEVDZFNJTVN4c2lCeUFGYXlJSUJFQWdCQ0FGSUFnUSt3RWFDeUFKSUF4TEJFQWdBaWdDWkNFRUlBSWdDeUFIYXlJRlFRRk9CSDhnQkNBSElBVVErUUVnQldvRklBUUxOZ0prREFJTElBSWdCQ0FJYWpZQ1pBd0JDeUFFQkVBZ0FpQUVOZ0prSUFRUTZ3RWdBa0VBTmdKb0lBSkNBRGNDWUVFQUlRZ0xBa0FnQjBGL1RBMEFJQWtnQ0VFQmRTSUVJQVFnQ1VrYlFmLy8vLzhESUFoQkFuVkIvLy8vL3dGSkd5SUVRWUNBZ0lBRVR3MEFJQUlnQkVFQ2RDSUpFT29CSWdRMkFtQWdBaUFFTmdKa0lBSWdCQ0FKYWpZQ2FDQUNJQWRCQVU0RWZ5QUVJQVVnQnhENUFTQUhhZ1VnQkFzMkFtUU1BUXNRNXdFQUN3c2dBMEhjR1RZQ0NDQURLQUpnSWdRRVFDQURJQVEyQW1RZ0JCRHJBUXNnQXlnQ1VDSUVCRUFnQXlBRU5nSlVJQVFRNndFTElBTW9Ba1FpQkFSQUlBTWdCRFlDU0NBRUVPc0JDeUFES0FJNElnUUVRQ0FESUFRMkFqd2dCQkRyQVFzZ0EwSHdHVFlDQ0NBREtBSXNJZ1FFUUNBRUVPc0JDeUFES0FJZ0lnUUVRQ0FFRU9zQkN5QURRZkFBYWlRQUlBSUxJZ05GRFFFTFFjQUFFT29CSWdKQ0FEY0NCQ0FDUWdBM0FpUWdBa0c4RERZQ0FDQUNJQU0yQWp3Z0FrSUFOd0ljSUFKQ0FEY0NGQ0FDUWdBM0Fnd2dBa0lBTndJc0lBSkNBRGNDTkNBQUtBSUVJUU1nQWlFQUFrQUNRQ0FCSWdKQkFFNEVRQ0FEUVFocUlRVUNRQ0FES0FJTUlnRWdBeWdDQ0NJSGEwRUNkU0lFSUFKS0RRQWdBa0VCYWlFS0lBSWdCRThFUUNBRklBb2dCR3NRSlF3QkN5QUVJQXBORFFBZ0J5QUtRUUowYWlJS0lBRkhCRUFEUUNBQlFRUnJJZ0VvQWdBaEJDQUJRUUEyQWdBZ0JBUkFJQVFnQkNnQ0FDZ0NCQkVDQUFzZ0FTQUtSdzBBQ3dzZ0F5QUtOZ0lNQ3lBRktBSUFJQUpCQW5ScUlnTW9BZ0FoQVNBRElBQTJBZ0FnQVEwQkRBSUxJQUFpQVVVTkFRc2dBU0FCS0FJQUtBSUVFUUlBQ3lBQ1FYOXpRUjkySVFvTElBWkI0QUJxSkFBZ0NndU9BUUVDZnlNQVFSQnJJZ01rQUNBQUlBRTJBZ1FnQVNnQ1FDSUJLQUlBSVFRZ0FTZ0NCQ0VCSUFOQkFEb0FEeUFBUVJocUlBRWdCR3RCQW5WQkEyNGdBMEVQYWhCR0lBQW9BZ1FpQVNnQ09DRUVJQUVvQWpRaEFTQURRUUE2QUE0Z0FFRWthaUFFSUFGclFRSjFJQU5CRG1vUVJpQUFJQUlwQWdnM0FoQWdBQ0FDS1FJQU53SUlJQU5CRUdva0FBdEtBUUYvSUFCQnpCTTJBZ0FnQUNnQ01DSUJCRUFnQUNBQk5nSTBJQUVROXdFTElBQkI0Qk0yQWdBZ0FDZ0NKQ0lCQkVBZ0FSRDNBUXNnQUNnQ0dDSUJCRUFnQVJEM0FRc2dBQXZjQWdFRGZ5TUFRUkJySWdVa0FDQUFRUUEyQWdRQ1FBSkFJQUZGRFFBQ1FDQUJJQUFvQWdnaUEwRUZkQ0lFVFFSQUlBQWdBVFlDQkF3QkN5QUZRUUEyQWdnZ0JVSUFOd01BSUFGQmYwd05BaUFGSUFSQi92Ly8vd05OQkg4Z0FVRWZha0ZnY1NJRUlBTkJCblFpQXlBRElBUkpHd1ZCLy8vLy93Y0xFRm9nQUNnQ0FDRURJQUFnQlNnQ0FEWUNBQ0FGSUFNMkFnQWdBQ2dDQkNFRUlBQWdBVFlDQkNBRklBUTJBZ1FnQUNnQ0NDRUVJQUFnQlNnQ0NEWUNDQ0FGSUFRMkFnZ2dBMFVOQUNBREVQY0JDeUFCUVFWMklnTkJBblFoQkNBQUtBSUFJUUFnQWkwQUFBUkFJQUJCL3dFZ0JCRDZBU0VBSUFGQkgzRWlBVVVOQVNBQUlBTkJBblJxSWdBZ0FDZ0NBRUYvUVNBZ0FXdDJjallDQUF3QkN5QUFRUUFnQkJENkFTRUFJQUZCSDNFaUFVVU5BQ0FBSUFOQkFuUnFJZ0FnQUNnQ0FFRi9RU0FnQVd0MlFYOXpjVFlDQUFzZ0JVRVFhaVFBRHdzUTV3RUFDNDBEQVFKL0lBQWdBU2tDQkRjQ0JDQUFJQUVvQWhRMkFoUWdBQ0FCS1FJTU53SU1Ba0FDUUNBQUlBRkhCRUFnQUNBQktBSWNJZ0lFZndKQUlBQW9BaUJCQlhRZ0FrOEVRQ0FBS0FJWUlRTU1BUXNnQUNnQ0dDSURCRUFnQXhEM0FTQUFRUUEyQWlBZ0FFSUFOd0lZSUFFb0Fod2hBZ3NnQWtGL1RBMERJQUpCQVd0QkJYWkJBV29pQWtFQ2RCRHFBU0VESUFBZ0FqWUNJQ0FBUVFBMkFod2dBQ0FETmdJWUlBRW9BaHdoQWdzZ0F5QUJLQUlZSUFKQkFXdEJBM1pCL1AvLy93RnhRUVJxRVBzQkdpQUJLQUljQlVFQUN6WUNIQ0FBSUFFb0FpZ2lBZ1IvQWtBZ0FDZ0NMRUVGZENBQ1R3UkFJQUFvQWlRaEF3d0JDeUFBS0FJa0lnTUVRQ0FERVBjQklBQkJBRFlDTENBQVFnQTNBaVFnQVNnQ0tDRUNDeUFDUVg5TURRUWdBa0VCYTBFRmRrRUJhaUlDUVFKMEVPb0JJUU1nQUNBQ05nSXNJQUJCQURZQ0tDQUFJQU0yQWlRZ0FTZ0NLQ0VDQ3lBRElBRW9BaVFnQWtFQmEwRURka0g4Ly8vL0FYRkJCR29RK3dFYUlBRW9BaWdGUVFBTE5nSW9DdzhMRU9jQkFBc1E1d0VBQy9WQ0FoMS9CSDRqQUVGQWFpSUtKQUFnQUVFQU5nS0VBU0FBS0FLVUFRUkFJQUFvQXBBQklnSUVRQU5BSUFJb0FnQWhBU0FDRVBjQklBRWlBZzBBQ3d0QkFDRUNJQUJCQURZQ2tBRUNRQ0FBS0FLTUFTSURSUTBBSUFOQkEzRWhBU0FEUVFGclFRTlBCRUFnQTBGOGNTRUxBMEFnQWtFQ2RDSURJQUFvQW9nQmFrRUFOZ0lBSUFBb0FvZ0JJQU5CQkhKcVFRQTJBZ0FnQUNnQ2lBRWdBMEVJY21wQkFEWUNBQ0FBS0FLSUFTQURRUXh5YWtFQU5nSUFJQUpCQkdvaEFpQUxRUVJySWdzTkFBc0xJQUZGRFFBRFFDQUFLQUtJQVNBQ1FRSjBha0VBTmdJQUlBSkJBV29oQWlBQlFRRnJJZ0VOQUFzTElBQkJBRFlDbEFFTEFrQUNRQUpBSUFBb0FnUWlBaTBBSkNJVVFRaDBJQUl0QUNWeUlnTkJnUVJMRFFBZ0FpZ0NJQ0VCSUFOQi93Tk5CRUFnQVNrREVDSWVRZ1I4SWg4Z0FTa0RDRlVOQWlBQktBSUFJQjZuYWlnQUFDRURJQUVnSHpjREVDQUFJQU0yQW9RQkRBRUxRUUVnQ2lBQkVCVkZEUUVnQUNnQ0JDSUNMUUFrSVJRZ0FDQUtLQUlBTmdLRUFRc2dBaWdDSUNFQkFrQUNRQUpBSUJSQi93RnhRUUZOQkVCQkFDRVVJQUVwQXhBaUhrSUVmQ0lmSUFFcEF3aFZEUVVnQ2lBQktBSUFJQjZuYWlnQUFDSUROZ0k4SUFFZ0h6Y0RFQ0FBSUFNMkFwd0JJQUJCbkFGcUlRc01BUXRCQUNFVVFRRWdDa0U4YWlBQkVCVkZEUVFnQUNnQ0JDSUNMUUFrSVFFZ0FDQUtLQUk4TmdLY0FTQUFRWndCYWlFTElBRkJBVXNOQVFzZ0FpZ0NJQ0lDS1FNSUlBSXBBeEFpSGtJRWZDSWZVdzBESUFvZ0FpZ0NBQ0FlcDJvb0FBQWlBVFlDT0NBQ0lCODNBeEFNQVF0QkFTQUtRVGhxSUFJb0FpQVFGVVVOQWlBS0tBSTRJUUVMSUFGQjFhclZxZ1ZMRFFFZ0N5Z0NBQ0FCUVFOc1N3MEJJQUFvQWdRaUF5Z0NJQ0lDS1FNSUloOGdBaWtERUNJZVZ3MEJJQUlvQWdBaUJ5QWVwMm90QUFBaERTQUNJQjVDQVh3aUlUY0RFQUpBSUFNdEFDUkJBVTBFUUNBZklCNUNCWHdpSGxNTkF5QUtJQWNnSWFkcUtBQUFJZ3MyQWpRZ0FpQWVOd01RSUFFZ0MwOE5BUXdEQzBFQklBcEJOR29nQWhBVlJRMENJQUVnQ2lnQ05DSUxTUTBDQ3lBQklBdEJBMjRnQzJwTERRRWdBQ2dDQkNJREtBSWdJUUlDUUNBRExRQWtRUUZOQkVBZ0Fpa0RFQ0llUWdSOEloOGdBaWtEQ0ZVTkF5QUtJQUlvQWdBZ0hxZHFLQUFBSWdNMkFqQWdBaUFmTndNUUlBTWdDMDBOQVF3REMwRUJJQXBCTUdvZ0FoQVZSUTBDSUFvb0FqQWlBeUFMU3cwQ0N5QUFJQUFvQWhnMkFoeEIyQUFRNmdFaUFrSUFOd0lBSUFKQkFEWUNPQ0FDUWdBM0FqQWdBa0lBTndJb0lBSkNBRGNDSUNBQ1FnQTNBaGdnQWtJQU53SVFJQUpDQURjQ0NDQUNRVUJyUWdBM0FnQWdBa0lBTndKSUlBSkNBRGNDVUNBQ0lBSTJBandnQUNnQ0NDRUhJQUFnQWpZQ0NDQUhCRUFnQnhCSklBQW9BZ2hGRFFJTElBQWdBQ2dDb0FFMkFxUUJJQUJCb0FGcUlBRVFTaUFBSUFBb0Fxd0JOZ0t3QVNBQVFhd0JhaUFCRUVvZ0FFRkFhMEVBTmdJQUlBQkJmellDWENBQVFuODNBbFFnQUNBQUtBSWtOZ0lvSUFBZ0FDZ0NNRFlDTkNBQUlBQW9Ba2cyQWt3Z0FFSFlBV29pR3hCTElCc2dEUkJNSUFBb0FnZ2dBU0FBS0FLY0FTQURhaEJOUlEwQklBQW9BcHdCSVFJZ0NrRUJPZ0FBSUFCQitBQnFJQUlnQTJvZ0NoQkdBa0FnQUNnQ0JDSUNMd0VrSWdGQkNIUWdBVUVJZG5KQi8vOERjU0lCUVlFRVRRUkFJQUlvQWlBaEFnSkFJQUZCL3dOTkJFQWdBaWtERUNJZVFnUjhJaDhnQWlrRENGVU5CU0FDS0FJQUlCNm5haWdBQUNFQklBSWdIemNERUF3QkMwRUJJQXBCTEdvZ0FoQVZSUTBFSUFvb0Fpd2hBUXNnQVVVTkF5QUJyU0FBS0FJRUlnSW9BaUFpQXlrRENDQURLUU1RZlZVTkF5QUtRZ0EzQXhBZ0NrSUFOd01ZSUFwQ0FEY0FIU0FLUVFBN0FTWWdDa0VBTmdJQUlBcENBRGNEQ0NBQ0tBSWdJZ0lwQXdnaEh5QUNLQUlBSVFNZ0Fpa0RFQ0VlSUFJdkFTWWhBaUFLUWdBM0F4QWdDaUFDT3dFbUlBb2dBeUFlcDJvZ0FXbzJBZ0FnQ2lBZklCNTlweUFCYTYwM0F3Z2dBQ0FLRUU0aUFrRi9SZzBESUFLc0lTRU1BUXRDZnlFaElBQWdBaWdDSUJCT1FYOUdEUUlMSUFCQjZBRnFJZ2NnQUJCUElBQWdEVFlDOUFJZ0NrSUFOd01RSUFwQ0FEY0RHQ0FLUWdBM0FCMGdDa0VBT3dFbUlBcEJBRFlDQUNBS1FnQTNBd2hCQUNFQ0l3QkJFR3NpQXlRQUlBY2dCeWtESURjRFNDQUhJQWNwQXdBM0F5Z2dCMEZBYXlBSEtRTVlOd01BSUFjZ0J5a0RFRGNET0NBSElBY3BBd2czQXpBZ0IwRW9haUVCQW44Q1FDQUhMd0ZPUVlFRVRRUkFRUUFnQnlrRE1DSWdJQWNwQXpnaUgwSUlmQ0llVXcwQ0dpQURJQWNvQWlnaURTQWZwMm9wQUFBaUh6Y0RDQ0FISUI0M0F6Z01BUXRCQUVFQklBTkJDR29nQVJCaFJRMEJHaUFIS1FNd0lTQWdCeWtET0NFZUlBY29BaWdoRFNBREtRTUlJUjhMSUFkQkFEWUNTQ0FIUVFFNkFFd2dCMEZBYXlBTklCNm5haUlOTmdJQUlBY2dEU0FnSUI1OXAybzJBa1FnQnlBQktRTUFOd01BSUFjZ0FTa0RDQ0lnTndNSUlBY2dBU2tERUNJZU53TVFJQWNnQVNrREdEY0RHQ0FISUFFcEF5QTNBeUJCQUNBZklDQWdIbjFXRFFBYUlBY2dIaUFmZkRjREVFRUJDeUVCSUFOQkVHb2tBQUpBSUFGRkRRQWpBRUVRYXlJREpBQUNmeUFITHdFbVFZRUVUUVJBSUFjZ0J5a0RBRGNEWUNBSElBY3BBeUEzQTRBQklBY2dCeWtER0RjRGVDQUhJQWNwQXhBM0EzQWdCeUFIS1FNSU53Tm9JQWRCNEFCcUlRRUNRQ0FITHdHR0FVR0JCRTBFUUVFQUlBY3BBMmdpSUNBSEtRTndJaDlDQ0h3aUhsTU5BeG9nQXlBSEtBSmdJZzBnSDZkcUtRQUFJaDgzQXdnZ0J5QWVOd053REFFTFFRQkJBU0FEUVFocUlBRVFZVVVOQWhvZ0J5a0RhQ0VnSUFjcEEzQWhIaUFIS0FKZ0lRMGdBeWtEQ0NFZkN5QUhRUUEyQW9BQklBZEJBVG9BaEFFZ0J5QU5JQjZuYWlJTk5nSjRJQWNnRFNBZ0lCNTlwMm8yQW53Z0J5QUJLUU1BTndNQUlBY2dBU2tEQ0NJZ053TUlJQWNnQVNrREVDSWVOd01RSUFjZ0FTa0RHRGNER0NBSElBRXBBeUEzQXlCQkFDQWZJQ0FnSG4xV0RRRWFJQWNnSGlBZmZEY0RFRUVCREFFTElBZEIwQUJxSUFjUUdBc2hBU0FEUVJCcUpBQWdBVVVOQUVFQklRMENRQ0FIS0FLTUFTSU9RUUZJRFFCQmZ5QU9RUVIwSWdsQkJISWdEa0gvLy8vL0FIRWdEa2NiRU9vQklnRWdEallDQUNBQlFRUnFJZ01oQVNBSlFSQnJJZ1JCQkhaQkFXcEJCM0VpRFFSQUlBTWhBUU5BSUFGQ0FEY0NBQ0FCUWdBM0FBVWdBVUVRYWlFQklBMUJBV3NpRFEwQUN3c2dCRUh3QUU4RVFDQURJQWxxSVEwRFFDQUJRZ0EzQWdBZ0FVSUFOd0lRSUFGQ0FEY0NJQ0FCUWdBM0FqQWdBVUlBTndKQUlBRkNBRGNDVUNBQlFnQTNBbUFnQVVJQU53SndJQUZDQURjQUJTQUJRZ0EzQUJVZ0FVSUFOd0FsSUFGQ0FEY0FOU0FCUWdBM0FFVWdBVUlBTndCVklBRkNBRGNBWlNBQlFnQTNBSFVnQVVHQUFXb2lBU0FOUncwQUN3c2dCeWdDaUFFaEFTQUhJQU0yQW9nQlFRRWhEU0FCQkg4Z0FVRUVheERyQVNBSEtBS01BUVVnRGd0QkFVZ05BRUVBSVFFRFFDQUhLQUtJQVNBQlFRUjBhaUFIRUJnaURVVU5BU0FCUVFGcUlnRWdCeWdDakFGSURRQUxDeUFOUlEwQUlBb2dCeWtEQURjREFDQUtJQWNwQXlBM0F5QWdDaUFIS1FNWU53TVlJQW9nQnlrREVEY0RFQ0FLSUFjcEF3ZzNBd2hCQVNFQ0N5QUNSUTBCQW45QkFDRUJRUUFoQTBFQUlRSkJBQ0VPUVFBaERTTUFRZUFBYXlJTUpBQWdERUVBTmdKSUlBeENBRGNEUUNBTVFnQTNBekFnREVJQU53TW9JQXhCZ0lDQS9BTTJBamdnREVFQU5nSWdJQXhDQURjREdFRUJJUkFnQUNJRUtBSjhJUmdDUUFKQUFrQUNRQUpBQWtBZ0MwRUJTQTBBSUFRb0F0Z0JJQVFvQXR3QlJ5RWRBMEFnRGlJSlFRRnFJUTRDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQkMwQXRBSkZEUUFDUUFKQUlBUW9BcWdDSWc4Z0JDZ0NzQUlpQmtFRGRtb2lBQ0FFS0FLc0FpSVJUdzBBSUFBdEFBQWhCU0FFSUFaQkFXb2lBRFlDc0FJZ0JTQUdRUWR4ZGtFQmNVVU5BRUVBSVFVQ1FDQVJJQThnQUVFRGRpSUlhaUlWVFFSQUlBQWhCZ3dCQ3lBVkxRQUFJUVVnQkNBR1FRSnFJZ1kyQXJBQ0lBWkJBM1loQ0NBRklBQkJCM0YyUVFGeElRVUxJQkVnQ0NBUGFpSUFTd1IvSUFBdEFBQWhBQ0FFSUFaQkFXbzJBckFDSUFBZ0JrRUhjWFpCQVhSQkFuRWdCWElGSUFVTFFRRjBJZ0JCQVdzT0JoRUJFUUVSQXdJTElBSWdBMFlFUUVGL0lRWU1EUXRCZnlFSUlBUW9BZ2dpQlNnQ0dDSVJBbjlCZnlBQ1FRUnJJaFVvQWdBaUFVRi9SZzBBR2tGL0lBRkJBV29pQUNBQlFRSnJJQUJCQTNBYklnQkJmMFlOQUJvZ0JTZ0NBQ0FBUVFKMGFpZ0NBQXNpRUVFQ2RHb29BZ0FpQUVGL1J3UkFJQUJCQVdvaUJpQUFRUUpySUFaQkEzQWJJUWdMSUFVb0Fnd2lBQ0FCUVFKMGFpQUpRUU5zSWdsQkFXb2lCallDQUNBQUlBWkJBblFpRjJvZ0FUWUNBQ0FBSUFoQkFuUnFJQWxCQW1vaUR6WUNBQ0FBSUE5QkFuUWlHV29nQ0RZQ0FFRi9JUUFDZjBGL0lBRkJmMFlOQUJwQmYwRi9RUUlnQVVFRGNCc2dBV29pQVVGL1JnMEFHaUFGS0FJQUlBRkJBblJxS0FJQUN5RUJBa0FnQ0VGL1JnMEFJQWhCQVdvaUJpQUlRUUpySUFaQkEzQWJJZ1pCZjBZTkFDQUZLQUlBSUFaQkFuUnFLQUlBSVFBTFFYOGhCaUFCSUJCR0RRd2dBQ0FRUmcwTUlBVW9BZ0FpQmlBSlFRSjBhaUFRTmdJQUlBWWdGMm9nQURZQ0FDQUdJQmxxSUFFMkFnQWdBVUYvUndSQUlCRWdBVUVDZEdvZ0R6WUNBQXNnQkNnQ2VDQVFRUU4yUWZ6Ly8vOEJjV29pQUNBQUtBSUFRWDRnRUhkeE5nSUFJQlVnQ1RZQ0FDQURJUUVNQ1FzZ0FpQURSZ1JBUVg4aEJnd01DeUFFS0FJSUlnZ29BZ3dpQVNBSlFRTnNJZ1ZCQWtFQklBQkJBWEpCQlVZaUR4dHFJaEZCQW5RaUYyb2dBa0VFYXlJWktBSUFJZ0EyQWdBZ0FTQUFRUUowYWlBUk5nSUFJQWhCR0dvUVcwRi9JUVlnQkNnQ0NDSUJLQUljSUFFb0FoZ2lGV3RCQW5VZ0dFb05DeUFCS0FJQUlnRWdGMm9nQ0NnQ0hDQUlLQUlZYXlJR1FRSjFRUUZySWdnMkFnQWdCZ1JBSUJVZ0NFRUNkR29nRVRZQ0FBc2dCU0FGUVFKcUlBOGJJUVlnQVNBRklBOXFRUUowYWdKL0FrQUNRQ0FBUVg5SEJFQkJmMEVDSUFCQkEzQWJJQUJxSWdoQmYwWU5BU0FCSUFaQkFuUnFJQUVnQ0VFQ2RHb29BZ0FpQ0RZQ0FDQUlRWDlHRFFJZ0ZTQUlRUUowYWlBR05nSUFEQUlMSUFFZ0JrRUNkR3BCZnpZQ0FFRi9EQUlMSUFFZ0JrRUNkR3BCZnpZQ0FBdEJmeUFBUVFGcUlnWWdBRUVDYXlBR1FRTndHeUlBUVg5R0RRQWFJQUVnQUVFQ2RHb29BZ0FMTmdJQUlCa2dCVFlDQUNBRElRRU1BZ3NnQWlBRFJnUkFRWDhoQmd3TEN5QUNRUVJySWdBb0FnQWhEeUFNSUFBMkFrUUNRQ0FNS0FJc0lnVkZCRUFnQUNFQ0RBRUxBa0FnQldsQkFVc2lDRVVFUUNBRlFmLy8vLzhIYWlBSmNTRUJEQUVMSUFVZ0NTSUJTdzBBSUFrZ0JYQWhBUXNnRENnQ0tDQUJRUUowYWlnQ0FDSUdSUVJBSUFBaEFnd0JDeUFHS0FJQUlnWkZCRUFnQUNFQ0RBRUxBa0FnQ0VVRVFDQUZRUUZySVFVRFFBSkFJQWtnQmlnQ0JDSUlSd1JBSUFVZ0NIRWdBVVlOQVNBQUlRSU1CUXNnQmlnQ0NDQUpSZzBEQ3lBR0tBSUFJZ1lOQUFzZ0FDRUNEQUlMQTBBQ1FDQUpJQVlvQWdRaUNFY0VRQ0FGSUFoTkJIOGdDQ0FGY0FVZ0NBc2dBVVlOQVNBQUlRSU1CQXNnQmlnQ0NDQUpSZzBDQ3lBR0tBSUFJZ1lOQUFzZ0FDRUNEQUVMSUFBZ0VrY0VRQ0FBSUFZb0FndzJBZ0FnRENBQ05nSkVEQUVMSUJJZ0Eyc2lBRUVDZFNJQlFRRnFJZ0pCZ0lDQWdBUlBEUVFnQWlBQVFRRjFJaE1nQWlBVFN4dEIvLy8vL3dNZ0FVSC8vLy8vQVVrYklnSUVmeUFDUVlDQWdJQUVUdzBOSUFKQkFuUVE2Z0VGUVFBTEloTWdBVUVDZEdvaUFTQUdLQUlNTmdJQUlCTWdBa0VDZEdvaEVpQUJRUVJxSVFJZ0FFRUJUZ1JBSUJNZ0F5QUFFUGtCR2dzZ0RDQVNOZ0pJSUF3Z0FqWUNSQ0FNSUJNMkFrQWdBMFVOQUNBREVPc0JDeUFDSUJOR0RRSWdCQ2dDQ0NFRElBSkJCR3NpRlNnQ0FDSUFRWDlHSWdGRkJFQWdBeWdDRENBQVFRSjBhaWdDQUVGL1J3MERDeUFES0FJTUlSRWdEMEYvUmlJWFJRUkFJQkVnRDBFQ2RHb29BZ0JCZjBjTkF3c2dFU0FBUVFKMGFpQUpRUU5zSWdsQkFtb2lFRFlDQUNBUklCQkJBblFpQm1vZ0FEWUNBQ0FSSUE5QkFuUnFJQWxCQVdvaUJUWUNBQ0FSSUFWQkFuUWlHV29nRHpZQ0FDQUJEUVJCZnlFRlFYOGhBU0FES0FJQUlnZ2dDVUVDZEdvQ2YwRi9RUUlnQUVFRGNCc2dBR29pSEVGL1J3UkFJQWdnSEVFQ2RHb29BZ0FoQVFzZ0FRczJBZ0FnQUVFQmFpSWNJQUJCQW1zZ0hFRURjQnNpQUVGL1JnMEdJQWdnQUVFQ2RHb29BZ0FoQlF3R0N5QUVLQUlJSWdoQkdHb1FXMEYvSVFZZ0JDZ0NDQ0lBS0FJQUlBbEJBMndpQlVFQ2RHb2dDQ2dDSENBSUtBSVlheUlQUVFKMUlnaEJBV3NpRlRZQ0FDQUFRUmhxRUZzZ0FDZ0NBQ0FGUVFGcUloRkJBblJxSUFBb0Fod2dBQ2dDR0d0QkFuVkJBV3MyQWdBZ0JDZ0NDQ0lBUVJocUVGc2dBQ2dDQUNBRlFRSnFJaGRCQW5ScUlBQW9BaHdnQUNnQ0dHdEJBblZCQVdzMkFnQWdCQ2dDQ0NJQUtBSWNJQUFvQWhnaUFHdEJBblVnR0VvTkNRSkFBa0FnRDBVRVFDQUFJQWhCQW5ScUlCRTJBZ0FnQUVFRWFpRUFEQUVMSUFBZ0ZVRUNkR29nQlRZQ0FDQVBRWHhHRFFBZ0FDQUlRUUowYWlBUk5nSUFJQWhCQVdvaUJrRi9SZzBCSUFBZ0JrRUNkR29oQUFzZ0FDQVhOZ0lBQ3lBQ0lCSkhCRUFnQWlBRk5nSUFJQXdnQWtFRWFpSUNOZ0pFREFFTElBSWdBV3NpQUVFQ2RTSURRUUZxSWdKQmdJQ0FnQVJQRFFRZ0FpQUFRUUYxSWhNZ0FpQVRTeHRCLy8vLy93TWdBMEgvLy8vL0FVa2JJZ0lFZnlBQ1FZQ0FnSUFFVHcwTElBSkJBblFRNmdFRlFRQUxJaE1nQTBFQ2RHb2lBeUFGTmdJQUlCTWdBa0VDZEdvaEVpQURRUVJxSVFJZ0FFRUJUZ1JBSUJNZ0FTQUFFUGtCR2dzZ0RDQVNOZ0pJSUF3Z0FqWUNSQ0FNSUJNMkFrQWdBUVJBSUFFUTZ3RUxJQk1pQXlFQkN5QUVLQUlvSWdZZ0JDZ0NKRVlOQlNBSlFYOXpJQXRxSVFrZ0FrRUVheUVGQTBBZ0JrRUlheWdDQUNJQUlBbExEUUVnQUNBSlJ3MEdJQVpCQkdzdEFBQWhDQ0FHUVF4cklnQW9BZ0FoQmlBRUlBQTJBaWdnQmtFQVNBMEJJQVVvQWdBaEFDQU1JQVpCZjNNZ0MybzJBaFFnRENBTVFSUnFOZ0pZSUF3Z0RFRW9haUFNUVJScUlBeEIyQUJxRUZ3Z0RDZ0NBQUovSUFoQkFYRUVRRUYvSUFCQmYwWU5BUm9nQUVFQmFpSUdJQUJCQW1zZ0JrRURjQnNNQVF0QmZ5QUFRWDlHRFFBYUlBQkJBV3NnQUVFRGNBMEFHaUFBUVFKcUN6WUNEQ0FFS0FJb0lnWWdCQ2dDSkVjTkFBc01CUXRCZnlFR0lCQkJBWEVOQnd3R0N4RG5BUUFMUVg4aEFTQURLQUlBSWdnZ0NVRUNkR3BCZnpZQ0FFRi9JUVVNQVFzUTV3RUFDeUFJSUJscUlBVTJBZ0FDZndKQUFrQWdGMFVFUUVGL1FRSWdEMEVEY0JzZ0Qyb2lBRUYvUmcwQklBWWdDR29nQ0NBQVFRSjBhaWdDQUNJQU5nSUFJQUJCZjBZTkFpQURLQUlZSUFCQkFuUnFJQkEyQWdBTUFnc2dCaUFJYWtGL05nSUFRWDhoRUVGL0RBSUxJQVlnQ0dwQmZ6WUNBQXRCZnlFUVFYOGdEMEVCYWlJQUlBOUJBbXNnQUVFRGNCc2lBRUYvUmcwQUdpQUlJQUJCQW5ScUtBSUFJUkFnQUFzaEJpQURLQUlZSWdNZ0VFRUNkR29oQUNBQlFYOUhCRUFnQXlBQlFRSjBhaUFBS0FJQU5nSUFDd0pBSUFaQmYwWU5BQU5BSUFnZ0JrRUNkR29nQVRZQ0FDQUdRUUZxSWdNZ0JrRUNheUFEUVFOd0d5SURRWDlHRFFFZ0VTQURRUUowYWlnQ0FDSURRWDlHRFFFZ0EwRUJhaUlHSUFOQkFtc2dCa0VEY0JzaUJrRi9SdzBBQ3dzZ0FFRi9OZ0lBQWtBZ0hRMEFJQllnR2tjRVFDQVdJQkEyQWdBZ0RDQVdRUVJxSWhZMkFod01BUXNnR2lBTmF5SUJRUUoxSWdaQkFXb2lBRUdBZ0lDQUJFa0VRQ0FBSUFGQkFYVWlBeUFBSUFOTEcwSC8vLy8vQXlBR1FmLy8vLzhCU1JzaUF3Ui9JQU5CZ0lDQWdBUlBEUWNnQTBFQ2RCRHFBUVZCQUFzaUFDQUdRUUowYWlJR0lCQTJBZ0FnQUNBRFFRSjBhaUVhSUFaQkJHb2hGaUFCUVFGT0JFQWdBQ0FOSUFFUStRRWFDeUFNSUJvMkFpQWdEQ0FXTmdJY0lBd2dBRFlDR0NBTkJFQWdEUkRyQVFzZ0FDRU5EQUVMRU9jQkFBc2dGU0FKTmdJQUlCTWlBeUVCQ3lBTElBNUtJUkFnQ3lBT1J3MEFDeUFMSVE0TFFYOGhCaUFFS0FJSUlnVW9BaHdnQlNnQ0dHdEJBblVnR0VvTkFDQUNJQk5IQkVBZ0JFRThhaUVQQTBBZ0FrRUVheUlDS0FJQUlRa2dEQ0FDTmdKRUFrQUNRQUpBQWtBZ0JDOEJqZ0pCZ1FSTkJFQWdCQzBBN0FKRkRRSWdCQ2dDNEFJZ0JDZ0M2QUlpQUVFRGRtb2lBU0FFS0FMa0FrOE5BeUFCTFFBQUlRRWdCQ0FBUVFGcU5nTG9BaUFCSUFCQkIzRjJRUUZ4SVFBTUFRc2dCQzBBeEFJaEFRSkFJQVFvQXNBQ0lnQkIveDlMRFFBZ0JDZ0N2QUlpQTBFQlNBMEFJQVFnQTBFQmF5SUROZ0s4QWlBRUtBSzRBaUFEYWkwQUFDQUFRUWgwY2lFQUN5QUVRUUFnQVd0Qi93RnhJZ0VnQUVFSWRtd2lBeUFBUWY4QmNTSUxhaUFBSUFFZ0EycHJJQUVnQzBzaUFCczJBc0FDQ3lBQVJRMEJDeUFFS0FJSUlnVW9BZ1FnQlNnQ0FDSUxhMEVDZFVFRGJpQU9UQTBFUVg4aEFFRi9JUUVDUUNBRktBSVlJaElDZjBGL0lBbEJmMFlOQUJwQmZ5QUpRUUZxSWdNZ0NVRUNheUFEUVFOd0d5SURRWDlHRFFBYUlBc2dBMEVDZEdvb0FnQUxJaEZCQW5ScUtBSUFJZ05CZjBZTkFDQURRUUZxSWdnZ0EwRUNheUFJUVFOd0d5SURRWDlHRFFBZ0EwRUJhaUlBSUFOQkFtc2dBRUVEY0JzaUFFRi9Sd1JBSUFzZ0FFRUNkR29vQWdBaEFRc2dBeUVBQzBGL0lSQkJmeUVJQW45QmZ5QVNJQUZCQW5ScUtBSUFJZ05CZjBZTkFCcEJmeUFEUVFGcUloSWdBMEVDYXlBU1FRTndHeUlEUVg5R0RRQWFJQU5CQVdvaUVpQURRUUpySUJKQkEzQWJJaEpCZjBjRVFDQUxJQkpCQW5ScUtBSUFJUWdMSUFNTElSSWdCU2dDRENJRklBNUJBMndpQTBFQ2RDSVlhaUFKTmdJQUlBVWdDVUVDZEdvZ0F6WUNBQ0FGSUFOQkFXb2lDVUVDZENJYWFpQUFOZ0lBSUFVZ0FFRUNkR29nQ1RZQ0FDQUZJQU5CQW1vaUFFRUNkQ0lWYWlBU05nSUFJQVVnRWtFQ2RHb2dBRFlDQUNBTElCaHFJQUUyQWdBZ0N5QWFhaUlGSUFnMkFnQWdDeUFWYWlJSUlCRTJBZ0FnQkNnQ2VDSUxRWDhnQVNBRElBbExHeUlCUVFOMlFmei8vLzhCY1dvaUVpQVNLQUlBUVg0Z0FYZHhOZ0lBSUFsQmYwY0VRQ0FGS0FJQUlSQUxJQXNnRUVFRGRrSDgvLy8vQVhGcUlnRWdBU2dDQUVGK0lCQjNjVFlDQUVGL0lRVWdBRUYvUndSQUlBZ29BZ0FoQlFzZ0N5QUZRUU4yUWZ6Ly8vOEJjV29pQUNBQUtBSUFRWDRnQlhkeE5nSUFJQVFvQWtBaUJTQUVLQUpFSWdCQkJYUkdCRUFnQlVFQmFrRi9UQTBISUE4Z0JVSCsvLy8vQTAwRWZ5QUZRU0JxUVdCeElnRWdBRUVHZENJQUlBQWdBVWtiQlVILy8vLy9Cd3NRV2lBRUtBSkFJUVVMSUE1QkFXb2hEaUFFSUFWQkFXbzJBa0FnQkNnQ1BDQUZRUU4yUWZ6Ly8vOEJjV29pQUNBQUtBSUFRUUVnQlhSeU5nSUFJQVFvQWt3aUFDQUVLQUpRUndSQUlBQWdBellDQUNBRUlBQkJCR28yQWt3TUFnc2dBQ0FFS0FKSUlnQnJJZ0ZCQW5VaUJVRUJhaUlKUVlDQWdJQUVUdzBISUFrZ0FVRUJkU0lMSUFrZ0Mwc2JRZi8vLy84RElBVkIvLy8vL3dGSkd5SUpCSDhnQ1VHQWdJQ0FCRThOQmlBSlFRSjBFT29CQlVFQUN5SUxJQVZCQW5ScUlnVWdBellDQUNBQlFRRk9CRUFnQ3lBQUlBRVErUUVhQ3lBRUlBc2dDVUVDZEdvMkFsQWdCQ0FGUVFScU5nSk1JQVFnQ3pZQ1NDQUFSUTBCSUFBUTZ3RU1BUXNnQkNnQ1FDSUFJQVFvQWtRaUFVRUZkRVlFUUNBQVFRRnFRWDlNRFFZZ0R5QUFRZjcvLy84RFRRUi9JQUJCSUdwQllIRWlBQ0FCUVFaMElnRWdBQ0FCU3hzRlFmLy8vLzhIQ3hCYUlBUW9Ba0FoQUFzZ0JDQUFRUUZxTmdKQUlBUW9BandnQUVFRGRrSDgvLy8vQVhGcUlnRWdBU2dDQUVGK0lBQjNjVFlDQUNBRUtBSk1JZ0FnQkNnQ1VFY0VRQ0FBSUFrMkFnQWdCQ0FBUVFScU5nSk1EQUVMSUFBZ0JDZ0NTQ0lBYXlJQlFRSjFJZ1ZCQVdvaUEwR0FnSUNBQkU4TkJpQURJQUZCQVhVaUN5QURJQXRMRzBILy8vLy9BeUFGUWYvLy8vOEJTUnNpQXdSL0lBTkJnSUNBZ0FSUERRVWdBMEVDZEJEcUFRVkJBQXNpQ3lBRlFRSjBhaUlGSUFrMkFnQWdBVUVCVGdSQUlBc2dBQ0FCRVBrQkdnc2dCQ0FMSUFOQkFuUnFOZ0pRSUFRZ0JVRUVhallDVENBRUlBczJBa2dnQUVVTkFDQUFFT3NCQ3lBQ0lCTkhEUUFMSUFRb0FnZ2hCUXNnRGlBRktBSUVJQVVvQWdCclFRSjFRUU51UncwQUlBVW9BaHdnQlNnQ0dDSU9hMEVDZFNFR0lBMGdGa1lFUUNBV0lRME1BUXNnRFNFQkEwQWdBU2dDQUNFQUlBNGdCa0VCYXlJQ1FRSjBhaUlJS0FJQVFYOUdCRUFEUUNBR1FRSnJJUUlnQmtFQmF5RUdJQTRnQWtFQ2RHb2lDQ2dDQUVGL1JnMEFDd3NnQUNBQ1RRUkFJQXdnQlRZQ0FDQUlLQUlBSVE0Z0RFRUJPZ0FNSUF3Z0RqWUNDQ0FNSUE0MkFnUWdEa0YvUndSQUEwQWdCU2dDQUNBT1FRSjBhaUFBTmdJQUlBd1FYU0FFS0FJSUlRVWdEQ2dDQ0NJT1FYOUhEUUFMQ3lBRktBSVlJZzRnQWtFQ2RHb2hBeUFBUVg5SEJFQWdEaUFBUVFKMGFpQURLQUlBTmdJQUN5QURRWDgyQWdCQkFTQUFkQ0VESUFRb0FuZ2lDU0FBUVFOMlFmei8vLzhCY1dvaUFBSi9RUUVnQW5RaUN5QUpJQUpCQTNaQi9QLy8vd0Z4YWlJQ0tBSUFjUVJBSUFBb0FnQWdBM0lNQVFzZ0FDZ0NBQ0FEUVg5emNRczJBZ0FnQWlBQ0tBSUFJQXRCZjNOeE5nSUFJQVpCQVdzaEJnc2dBVUVFYWlJQklCWkhEUUFMQ3lBTkJFQWdEQ0FOTmdJY0lBMFE2d0VMSUF3b0FqQWlBQVJBQTBBZ0FDZ0NBQ0VDSUFBUTZ3RWdBaUlBRFFBTEN5QU1LQUlvSVFBZ0RFRUFOZ0lvSUFBRVFDQUFFT3NCQ3lBVEJFQWdEQ0FUTmdKRUlCTVE2d0VMSUF4QjRBQnFKQUFnQmd3RUN4RDRBUUFMRU9jQkFBc1E1d0VMQUFzaUEwRi9SZzBCSUFvb0FnQWhBaUFLS1FNSUlSOGdDaWtERUNFZUlBUW9BZ1FpQVNnQ0lDSUFRZ0EzQXhBZ0FDQWZJQjU5UXYvLy8vOFBnemNEQ0NBQUlBSWdIcWRxTmdJQUlBRXZBU1FpQWtFSWRDQUNRUWgyY2lJQlFmLy9BM0ZCZ1FSTkJFQWdBQ0FoTndNUUN3SkFJQVFvQXR3QklBUW9BdGdCUmcwQUlBUW9BZ2dpQWlnQ0FDRUFJQUlvQWdRaEFnSkFJQUZCLy84RGNVR0JCRThFUUNBQUlBSkdEUUpCQUNFQ0RBRUxJQUFnQWtZTkFVRUFJUUlEUUNBRUlBSVFVQVJBSUFKQkEyb2lBaUFFS0FJSUlnQW9BZ1FnQUNnQ0FHdEJBblZKRFFFTUF3c0xEQU1MQTBBZ0JDQUNFRkVFUUNBQ1FRTnFJZ0lnQkNnQ0NDSUFLQUlFSUFBb0FnQnJRUUoxU1EwQkRBSUxDd3dDQ3lBSEVGSWdCQ2dDMkFFaUFpQUVLQUxjQVVjRVFFRUFJUUVEUUNBQ0lBRkJrQUZzSWdCcVFRUnFJQVFvQWdnUVV5QWJLQUlBSWhRZ0FHb2lEU2dDaEFFaUFpQU5LQUtJQVNJTlJ3UkFBMEFnQUNBVWFrRUVhaUFDS0FJQUVGUWdHeWdDQUNFVUlBSkJCR29pQWlBTlJ3MEFDd3NnQUNBVWFrRUVhaEJWSUFGQkFXb2lBU0FFS0FMY0FTQUVLQUxZQVNJQ2EwR1FBVzFKRFFBTEN5QUVRYmdCYWlBRUtBSUlJZ0FvQWh3Z0FDZ0NHR3RCQW5VUVZpQUVLQUxZQVNJVUlBUW9BdHdCUndSQVFRQWhBZ05BSUJRZ0FrR1FBV3hxSWdCQjZBQnFJQVFvQWdnaUFTZ0NIQ0FCS0FJWWEwRUNkU0lCSUFBb0Fqd2dBQ2dDT0d0QkFuVWlBQ0FBSUFGSUd4QldJQUpCQVdvaUFpQUVLQUxjQVNBRUtBTFlBU0lVYTBHUUFXMUpEUUFMQ3lBRUlBTVFWeUVVREFFTFFRQWhGQXNnQ2tGQWF5UUFJQlFMbFFFQkFYOGdBQVJBSUFBb0Frd2lBUVJBSUFBZ0FUWUNVQ0FCRVBjQkN5QUFRVUJyS0FJQUlnRUVRQ0FBSUFFMkFrUWdBUkQzQVFzZ0FDZ0NNQ0lCQkVBZ0FDQUJOZ0kwSUFFUTl3RUxJQUFvQWhnaUFRUkFJQUFnQVRZQ0hDQUJFUGNCQ3lBQUtBSU1JZ0VFUUNBQUlBRTJBaEFnQVJEM0FRc2dBQ2dDQUNJQkJFQWdBQ0FCTmdJRUlBRVE5d0VMSUFBUTl3RUxDNFFCQVFSL0FrQUNRQ0FBS0FJSUlBQW9BZ0FpQW10QkFuVWdBVThOQUNBQlFZQ0FnSUFFVHcwQklBQW9BZ1FoQXlBQlFRSjBJZ1FRNmdFaUFTQUVhaUVFSUFFZ0F5QUNheUlEYWlFRklBTkJBVTRFUUNBQklBSWdBeEQ1QVJvTElBQWdCRFlDQ0NBQUlBVTJBZ1FnQUNBQk5nSUFJQUpGRFFBZ0FoRDNBUXNQQ3hENEFRQUxqUUVCQTM4Z0FDZ0NCQ0lDSUFBb0FnQWlBMGNFUUFOQUlBSkJER3NvQWdBaUFRUkFJQUpCQ0dzZ0FUWUNBQ0FCRVBjQkN5QUNRUnhyS0FJQUlnRUVRQ0FDUVJocklBRTJBZ0FnQVJEM0FRc2dBa0VvYXlnQ0FDSUJCRUFnQWtFa2F5QUJOZ0lBSUFFUTl3RUxJQUpCakFGckVGZ2dBa0dRQVdzaUFTRUNJQUVnQTBjTkFBc0xJQUFnQXpZQ0JBdUdFZ0VHZnlBQklBQW9BZ1FpQWlBQUtBSUFJZ1JyUVpBQmJTSURTd1JBQWtBZ0FTQURheUlESUFBb0FnZ2lCQ0FBS0FJRUlnSnJRWkFCYlUwRVFBSkFJQU5GRFFBZ0FpRUJJQU5Ca0FGc1FaQUJheUlFUVpBQmJrRUJjVVVFUUNBQ1FnQTNBZ1FnQWtGL05nSUFJQUpDQURjQ2FDQUNRUUU2QUdRZ0FrSUFOd0lNSUFKQ0FEY0NGQ0FDUWdBM0FpQWdBa0VCT2dBY0lBSkNBRGNDS0NBQ1FnQTNBakFnQWtJQU53STRJQUpCUUd0Q0FEY0NBQ0FDUWdBM0Frd2dBaUFDUVFScU5nSklJQUpDQURjQ1ZDQUNRZ0EzQWx3Z0FrSUFOd0p3SUFKQ0FEY0NlQ0FDUWdBM0FvQUJJQUpDQURjQ2lBRWdBa0dRQVdvaEFRc2dBMEdRQVd3Z0Ftb2hBaUFFUVpBQlNRMEFBMEFnQVVJQU53SUVJQUZCZnpZQ0FDQUJRZ0EzQW1nZ0FVRUJPZ0JrSUFGQ0FEY0NEQ0FCUWdBM0FoUWdBVUlBTndJZ0lBRkJBVG9BSENBQlFnQTNBaWdnQVVJQU53SXdJQUZDQURjQ09DQUJRVUJyUWdBM0FnQWdBVUlBTndKTUlBRWdBVUVFYWpZQ1NDQUJRZ0EzQWxRZ0FVSUFOd0pjSUFGQ0FEY0NjQ0FCUWdBM0FuZ2dBVUlBTndLQUFTQUJRZ0EzQW9nQklBRkJsQUZxSWdOQ0FEY0NBQ0FCUVg4MkFwQUJJQUZDQURjQ25BRWdBVUlBTndLa0FTQUJRUUU2QUt3QklBRkNBRGNDc0FFZ0FVSUFOd0s0QVNBQlFnQTNBc0FCSUFGQ0FEY0N5QUVnQVVJQU53TFFBU0FCUWdBM0F0d0JJQUVnQXpZQzJBRWdBVUlBTndMa0FTQUJRZ0EzQXV3QklBRkJBVG9BOUFFZ0FVSUFOd0w0QVNBQlFnQTNBb0FDSUFGQ0FEY0NpQUlnQVVJQU53S1FBaUFCUWdBM0FwZ0NJQUZCb0FKcUlnRWdBa2NOQUFzTElBQWdBallDQkF3QkN3SkFBa0FDUUNBQ0lBQW9BZ0FpQW10QmtBRnRJZ1lnQTJvaUFVSHl1SndPU1FSQUlBRWdCQ0FDYTBHUUFXMGlBa0VCZENJRUlBRWdCRXNiUWZHNG5BNGdBa0c0bkk0SFNSc2lCQVIvSUFSQjhyaWNEazhOQWlBRVFaQUJiQkRxQVFWQkFBc2lCeUFHUVpBQmJHb2lBaUVCSUFOQmtBRnNJZ05Ca0FGcklnVkJrQUZ1UVFGeFJRUkFJQUpCZnpZQ0FDQUhJQVpCa0FGc2FpSUJRZ0EzQWdRZ0FVSUFOd0pvSUFGQkFUb0FaQ0FCUWdBM0FoUWdBVUlBTndJTUlBRkNBRGNDSUNBQlFRRTZBQndnQVVJQU53SW9JQUZDQURjQ01DQUJRZ0EzQWpnZ0FVRkFhMElBTndJQUlBRkNBRGNDVENBQklBRkJCR28yQWtnZ0FVSUFOd0pVSUFGQ0FEY0NYQ0FCUWdBM0FuQWdBVUlBTndKNElBRkNBRGNDZ0FFZ0FVSUFOd0tJQVNBQ1FaQUJhaUVCQ3lBQ0lBTnFJUVlnQlVHUUFVOEVRQU5BSUFGQ0FEY0NCQ0FCUVg4MkFnQWdBVUlBTndKb0lBRkJBVG9BWkNBQlFnQTNBZ3dnQVVJQU53SVVJQUZDQURjQ0lDQUJRUUU2QUJ3Z0FVSUFOd0lvSUFGQ0FEY0NNQ0FCUWdBM0FqZ2dBVUZBYTBJQU53SUFJQUZDQURjQ1RDQUJJQUZCQkdvMkFrZ2dBVUlBTndKVUlBRkNBRGNDWENBQlFnQTNBbkFnQVVJQU53SjRJQUZDQURjQ2dBRWdBVUlBTndLSUFTQUJRWlFCYWlJRFFnQTNBZ0FnQVVGL05nS1FBU0FCUWdBM0Fwd0JJQUZDQURjQ3BBRWdBVUVCT2dDc0FTQUJRZ0EzQXJBQklBRkNBRGNDdUFFZ0FVSUFOd0xBQVNBQlFnQTNBc2dCSUFGQ0FEY0MwQUVnQVVJQU53TGNBU0FCSUFNMkF0Z0JJQUZDQURjQzVBRWdBVUlBTndMc0FTQUJRUUU2QVBRQklBRkNBRGNDK0FFZ0FVSUFOd0tBQWlBQlFnQTNBb2dDSUFGQ0FEY0NrQUlnQVVJQU53S1lBaUFCUWFBQ2FpSUJJQVpIRFFBTEN5QUhJQVJCa0FGc2FpRUhJQUFvQWdRaUFTQUFLQUlBSWdSR0RRSURRQ0FDUVpBQmF5SURJQUZCa0FGcklnRWlBaWdDQURZQ0FDQURJQUlvQWdRMkFnUWdBeUFDS0FJSU5nSUlJQU1nQWlnQ0REWUNEQ0FDUVFBMkFnd2dBa0lBTndJRUlBTWdBaWdDRURZQ0VDQURJQUlvQWhRMkFoUWdBeUFDS0FJWU5nSVlJQUpCQURZQ0dDQUNRZ0EzQWhBZ0FpMEFIQ0VGSUFOQkFEWUNLQ0FEUWdBM0FpQWdBeUFGT2dBY0lBTWdBaWdDSURZQ0lDQURJQUlvQWlRMkFpUWdBeUFDS0FJb05nSW9JQUpCQURZQ0tDQUNRZ0EzQWlBZ0EwRUFOZ0kwSUFOQ0FEY0NMQ0FESUFJb0FpdzJBaXdnQXlBQ0tBSXdOZ0l3SUFNZ0FpZ0NORFlDTkNBQ1FRQTJBalFnQWtJQU53SXNJQU5CUUdzaUJVRUFOZ0lBSUFOQ0FEY0NPQ0FESUFJb0FqZzJBamdnQXlBQ0tBSThOZ0k4SUFVZ0FrRkFheUlGS0FJQU5nSUFJQVZCQURZQ0FDQUNRZ0EzQWpnZ0F5QUNLQUpFTmdKRUlBSW9Ba2doQlNBRFFRQTJBbFFnQTBJQU53Sk1JQU1nQlRZQ1NDQURJQUlvQWt3MkFrd2dBeUFDS0FKUU5nSlFJQU1nQWlnQ1ZEWUNWQ0FDUVFBMkFsUWdBa0lBTndKTUlBTkJBRFlDWUNBRFFnQTNBbGdnQXlBQ0tBSllOZ0pZSUFNZ0FpZ0NYRFlDWENBRElBSW9BbUEyQW1BZ0FrRUFOZ0pnSUFKQ0FEY0NXQ0FDTFFCa0lRVWdBMEVBTmdKd0lBTkNBRGNDYUNBRElBVTZBR1FnQXlBQ0tBSm9OZ0pvSUFNZ0FpZ0NiRFlDYkNBRElBSW9BbkEyQW5BZ0FrRUFOZ0p3SUFKQ0FEY0NhQ0FEUVFBMkFud2dBMElBTndKMElBTWdBaWdDZERZQ2RDQURJQUlvQW5nMkFuZ2dBeUFDS0FKOE5nSjhJQUpCQURZQ2ZDQUNRZ0EzQW5RZ0FpZ0NnQUVoQlNBRFFRQTJBb3dCSUFOQ0FEY0NoQUVnQXlBRk5nS0FBU0FESUFJb0FvUUJOZ0tFQVNBRElBSW9Bb2dCTmdLSUFTQURJQUlvQW93Qk5nS01BU0FDUVFBMkFvd0JJQUpDQURjQ2hBRWdBeUVDSUFFZ0JFY05BQXNnQUNBSE5nSUlJQUFvQWdRaEFTQUFJQVkyQWdRZ0FDZ0NBQ0VFSUFBZ0FqWUNBQ0FCSUFSR0RRTURRQ0FCUVF4cktBSUFJZ0FFUUNBQlFRaHJJQUEyQWdBZ0FCRHJBUXNnQVVFY2F5Z0NBQ0lBQkVBZ0FVRVlheUFBTmdJQUlBQVE2d0VMSUFGQktHc29BZ0FpQUFSQUlBRkJKR3NnQURZQ0FDQUFFT3NCQ3lBQlFZd0JheEJZSUFGQmtBRnJJZ0FoQVNBQUlBUkhEUUFMREFNTEVPY0JBQXNRK0FFQUN5QUFJQWMyQWdnZ0FDQUdOZ0lFSUFBZ0FqWUNBQXNnQkFSQUlBUVE2d0VMQ3c4TElBRWdBMGtFUUNBRUlBRkJrQUZzYWlJQklBSkhCRUFEUUNBQ1FReHJLQUlBSWdNRVFDQUNRUWhySUFNMkFnQWdBeEQzQVFzZ0FrRWNheWdDQUNJREJFQWdBa0VZYXlBRE5nSUFJQU1ROXdFTElBSkJLR3NvQWdBaUF3UkFJQUpCSkdzZ0F6WUNBQ0FERVBjQkN5QUNRWXdCYXhCWUlBSkJrQUZySWdNaEFpQUJJQU5IRFFBTEN5QUFJQUUyQWdRTEM0MENBUVIvQWtBQ1FDQUJRUUJJRFFBZ0FrRUFTQTBBQWtBZ0FVSFZxdFdxQlVzTkFDQUFJQUZCQTJ3aUEwSFFFQkJaSUFCQkRHb2dBMEhjRGhCWkFrQWdBQ2dDSUNBQUtBSVlJZ05yUVFKMUlBSlBEUUFnQWtHQWdJQ0FCRThOQXlBQUtBSWNJUVFnQWtFQ2RDSUZFT29CSWdJZ0JXb2hCU0FDSUFRZ0Eyc2lCR29oQmlBRVFRRk9CRUFnQWlBRElBUVErUUVhQ3lBQUlBVTJBaUFnQUNBR05nSWNJQUFnQWpZQ0dDQURSUTBBSUFNUTl3RUxJQUJDQURjQ1VDQUFLQUpNSVFJZ0FFRUFOZ0pNSUFJRVFDQUNFUGNCQ3lBQVFnQTNBa1FnQUVGQWF5SUNLQUlBSVFBZ0FrRUFOZ0lBSUFCRkRRQWdBQkQzQVFzZ0FVSFdxdFdxQlVraEF3c2dBdzhMRVBnQkFBdUNEd0lNZndSK0l3QkJFR3NpQ1NRQUFrQUNRQUpBQWtBZ0FDZ0NCQzBBSkVFQlRRUkFRWDhoQ3lBQktRTVFJZzVDQkh3aUR5QUJLUU1JVlEwQ0lBa2dBU2dDQUNBT3Ayb29BQUFpQXpZQ0RDQUJJQTgzQXhBTUFRdEJmeUVMUVFFZ0NVRU1haUFCRUJWRkRRRWdDU2dDRENFREN3SkFBa0FDUUFKQUFrQUNRQ0FEUlEwQUlBTWdBQ2dDQ0NJQ0tBSUVJQUlvQWdCclFRSjFRUU51U3cwR0lBQW9BZ1F2QVNRaUFrRUlkQ0FDUVFoMmNrSC8vd054UVlJQ1R3UkFBa0FEUUVFQklBbEJDR29nQVJBVlJRMEpJQWtvQWdnaEFrRUJJQWxCQ0dvZ0FSQVZSUTBKSUFJZ0JXb2lCU0FKS0FJSUlnSkpEUWtnQlNBQ2F5RUdBa0FnQUNnQ0tDSUVJQUFvQWl4SEJFQWdCQ0FGTmdJRUlBUWdCallDQUNBQUlBUkJER28yQWlnTUFRc2dCQ0FBS0FJa0lnSnJJZ2RCREcwaUJFRUJhaUlLUWRhcTFhb0JUdzBDSUFvZ0JFRUJkQ0lNSUFvZ0RFc2JRZFdxMWFvQklBUkJxdFdxMVFCSkd5SUtRZGFxMWFvQlR3MExJQXBCREd3aUNoRHFBU0lNSUFSQkRHeHFJZ1FnQlRZQ0JDQUVJQVkyQWdBZ0JDQUhRWFJ0UVF4c2FpRUdJQVJCREdvaEJDQUhRUUZPQkVBZ0JpQUNJQWNRK1FFYUN5QUFJQW9nREdvMkFpd2dBQ0FFTmdJb0lBQWdCallDSkNBQ1JRMEFJQUlROXdFTElBaEJBV29pQ0NBRFJ3MEFDeUFCUVFFNkFDUkJBQ0VGSUFGQkFEWUNJQ0FCSUFFb0FnQWdBU2tERUNJT3Ayb2lBallDR0NBQklBSWdBU2tEQ0NBT2ZhZHFOZ0ljSUFOQkFTQURRUUZMR3lFSUEwQWdBUzBBSkNFREFrQUNRQ0FBS0FJRUx3RWtJZ0pCQ0hRZ0FrRUlkbkpCLy84RGNVR0JCRTBFUUNBRFJRMENRUUFoQkFKQUlBRW9BaGdpQmlBQktBSWdJZ0pCQTNZaUIyb2lBeUFCS0FJY0lncFBCRUFnQWlFRERBRUxJQU10QUFBaEJDQUJJQUpCQVdvaUF6WUNJQ0FEUVFOMklRY2dCQ0FDUVFkeGRrRUJjU0VFQ3lBR0lBZHFJQXBKRFFFTUFnc2dBMFVOQVVFQUlRUWdBU2dDR0NBQktBSWdJZ05CQTNacUlnSWdBU2dDSEU4TkFTQUNMUUFBSUFOQkIzRjJRUUZ4SVFRTElBRWdBMEVCYWpZQ0lBc2dBQ2dDSkNBRlFReHNhaUlESUFNdEFBaEIvZ0Z4SUFSQkFYRnlPZ0FJSUFWQkFXb2lCU0FJUncwQUN5QUJRUUE2QUNRZ0FTQUJLUU1RSUFFMUFpQkNCM3hDQTRoOE53TVFEQUlMRU9jQkFBc0RRQ0FCS1FNSUloQWdBU2tERUNJT1FnUjhJaEZURFFjZ0FTZ0NBQ0lDSUE2bmFpZ0FBQ0VHSUFFZ0VUY0RFQ0FRSUE1Q0NId2lEMU1OQnlBQ0lCR25haWdBQUNFS0lBRWdEemNERUNBUElCQlpEUWNnQWlBUHAyb3RBQUFoQWlBQklBNUNDWHczQXhBZ0FrRUJjU0FFUVg1eGNpRUVBa0FnQUNnQ0tDSUNJQUFvQWl4SEJFQWdBaUFFT2dBSUlBSWdDallDQkNBQ0lBWTJBZ0FnQUNBQ1FReHFOZ0lvREFFTElBSWdBQ2dDSkNJRmF5SUhRUXh0SWdKQkFXb2lERUhXcXRXcUFVOE5BeUFNSUFKQkFYUWlEU0FNSUExTEcwSFZxdFdxQVNBQ1FhclZxdFVBU1JzaURFSFdxdFdxQVU4TkNTQU1RUXhzSWd3UTZnRWlEU0FDUVF4c2FpSUNJQVE2QUFnZ0FpQUtOZ0lFSUFJZ0JqWUNBQ0FDSUFkQmRHMUJER3hxSVFZZ0IwRUJUZ1JBSUFZZ0JTQUhFUGtCR2dzZ0FDQU1JQTFxTmdJc0lBQWdBa0VNYWpZQ0tDQUFJQVkyQWlRZ0JVVU5BQ0FGRVBjQkN5QUlRUUZxSWdnZ0EwY05BQXNMSUFsQkFEWUNDQUpBSUFBb0FnUXZBU1FpQTBFSWRDQURRUWgyY2tILy93TnhJZ05CL3dOTkJFQWdBU2tERUNJT1FnUjhJZzhnQVNrRENGVU5CeUFCS0FJQUlBNm5haWdBQUNFTElBRWdEemNERUF3QkN5QURRWUFFUncwRlFRRWdDVUVJYWlBQkVCVkZEUVlnQ1NnQ0NDRUxDeUFMUlEwRUlBQW9BZ1F2QVNRaUEwRUlkQ0FEUVFoMmNrSC8vd054UVlJQ1NRMERRUUFoQkVFQUlRVURRRUVCSUFsQkJHb2dBUkFWUlEwRElBa29BZ1FnQldvaEJRSkFJQUFvQWpRaUF5QUFLQUk0UndSQUlBTWdCVFlDQUNBQUlBTkJCR28yQWpRTUFRc2dBeUFBS0FJd0lnTnJJZ0pCQW5VaUJrRUJhaUlIUVlDQWdJQUVUdzBESUFjZ0FrRUJkU0lJSUFjZ0NFc2JRZi8vLy84RElBWkIvLy8vL3dGSkd5SUhCSDhnQjBHQWdJQ0FCRThOQ1NBSFFRSjBFT29CQlVFQUN5SUlJQVpCQW5ScUlnWWdCVFlDQUNBQ1FRRk9CRUFnQ0NBRElBSVErUUVhQ3lBQUlBZ2dCMEVDZEdvMkFqZ2dBQ0FHUVFScU5nSTBJQUFnQ0RZQ01DQURSUTBBSUFNUTl3RUxJQVJCQVdvaUJDQUxSdzBBQ3d3RUN4RG5BUUFMRU9jQkFBdEJmeUVMREFJTFFRQWhBd05BSUFFcEF4QWlEa0lFZkNJUElBRXBBd2hWQkVCQmZ5RUxEQU1MSUFFb0FnQWdEcWRxS0FBQUlRZ2dBU0FQTndNUUFrQWdBQ2dDTkNJQ0lBQW9BamhIQkVBZ0FpQUlOZ0lBSUFBZ0FrRUVhallDTkF3QkN5QUNJQUFvQWpBaUFtc2lCRUVDZFNJR1FRRnFJZ1ZCZ0lDQWdBUlBEUVVnQlNBRVFRRjFJZ2NnQlNBSFN4dEIvLy8vL3dNZ0JrSC8vLy8vQVVrYklnVUVmeUFGUVlDQWdJQUVUdzBGSUFWQkFuUVE2Z0VGUVFBTElnY2dCa0VDZEdvaUJpQUlOZ0lBSUFSQkFVNEVRQ0FISUFJZ0JCRDVBUm9MSUFBZ0J5QUZRUUowYWpZQ09DQUFJQVpCQkdvMkFqUWdBQ0FITmdJd0lBSkZEUUFnQWhEM0FRc2dBMEVCYWlJRElBdEhEUUFMQ3lBQktBSVFJUXNMSUFsQkVHb2tBQ0FMRHdzUStBRUFDeERuQVFBTGhBRUNBMzhDZmlBQUlBRTJBcEFCSUFFZ0FTZ0NBQ2dDSUJFQUFDZ0NJQ0lDS0FJUUlRTWdBaWdDQUNFQ0lBRWdBU2dDQUNnQ0lCRUFBQ2dDSUNJRUtRTVFJUVVnQkNrRENDRUdJQUFnQVNBQktBSUFLQUlnRVFBQUtBSWdMd0VtT3dFbUlBQWdCaUFGZlVMLy8vLy9ENE0zQXdnZ0FDQUNJQU5xTmdJQUlBQkNBRGNERUF1REJ3RUxmeU1BUVJCcklnb2tBQ0FLSUFFMkFnQkJmeUVEQWtBZ0FVRi9SZ1JBSUFwQmZ6WUNCQXdCQ3lBS0lBRkJBV29pQXlBQlFRSnJJQU5CQTNBYk5nSUVJQUZCQTNBRVFDQUJRUUZySVFNTUFRc2dBVUVDYWlFREN5QUtJQU0yQWdnQ1FBSkFBMEFDUUFKQUlBRkJmMFlOQUNBQUtBSUlLQUlNSUFGQkFuUnFLQUlBUVg5R0RRQkJBQ0VHSUFBb0F0Z0JJZ1VnQUNnQzNBRkdEUUVEUUNBQUtBTHdBaUFHUVFSMGFpSUNJUVFnQWkwQURDRUhBa0FnQWlnQ0NDSURRZjhmU3cwQUlBSW9BZ1FpQ1VFQlNBMEFJQUlvQWdBaENDQUNJQWxCQVdzaUFqWUNCQ0FDSUFocUxRQUFJQU5CQ0hSeUlRTUxJQVJCQUNBSGEwSC9BWEVpQWlBRFFRaDJiQ0lISUFOQi93RnhJZ1JxSUFNZ0FpQUhhbXNnQWlBRVN4czJBZ2dDUUFKQUlBSWdCRTBOQUNBRklBWkJrQUZzYWlJRElnY29Bb2dCSWdJZ0F5Z0NqQUVpQkVrRVFDQUNJQUUyQWdBZ0J5QUNRUVJxTmdLSUFRd0JDeUFDSUFNb0FvUUJJZ0pySWdsQkFuVWlDRUVCYWlJRlFZQ0FnSUFFVHcwQklBVWdCQ0FDYXlJRVFRRjFJZ3NnQlNBTFN4dEIvLy8vL3dNZ0JFRUNkVUgvLy8vL0FVa2JJZ1VFZnlBRlFZQ0FnSUFFVHcwSUlBVkJBblFRNmdFRlFRQUxJZ1FnQ0VFQ2RHb2lDQ0FCTmdJQUlBbEJBVTRFUUNBRUlBSWdDUkQ1QVJvTElBTWdCRFlDaEFFZ0J5QUlRUVJxTmdLSUFTQURJQVFnQlVFQ2RHbzJBb3dCSUFKRkRRQWdBaEQzQVFzZ0JrRUJhaUlHSUFBb0F0d0JJQUFvQXRnQklnVnJRWkFCYlVrTkFRd0RDd3NRNXdFQUMwRUFJUU1nQUNnQzJBRWlBaUFBS0FMY0FVWU5BQU5BQWtBZ0FpQURRWkFCYkdvaUFpSUhLQUtJQVNJR0lBSW9Bb3dCSWdSSkJFQWdCaUFCTmdJQUlBY2dCa0VFYWpZQ2lBRU1BUXNnQmlBQ0tBS0VBU0lHYXlJSlFRSjFJZ2hCQVdvaUJVR0FnSUNBQkU4TkJDQUZJQVFnQm1zaUJFRUJkU0lMSUFVZ0Mwc2JRZi8vLy84RElBUkJBblZCLy8vLy93RkpHeUlGQkg4Z0JVR0FnSUNBQkU4TkJpQUZRUUowRU9vQkJVRUFDeUlFSUFoQkFuUnFJZ2dnQVRZQ0FDQUpRUUZPQkVBZ0JDQUdJQWtRK1FFYUN5QUNJQVEyQW9RQklBY2dDRUVFYWpZQ2lBRWdBaUFFSUFWQkFuUnFOZ0tNQVNBR1JRMEFJQVlROXdFTElBTkJBV29pQXlBQUtBTGNBU0FBS0FMWUFTSUNhMEdRQVcxSkRRQUxDeUFNUVFGcUlneEJBMGNFUUNBS0lBeEJBblJxS0FJQUlRRU1BUXNMSUFwQkVHb2tBRUVCRHdzUTV3RUFDeEQ0QVFBTG53Y0JESDhqQUVFUWF5SUtKQUFnQ2lBQk5nSUFRWDhoQXdKQUlBRkJmMFlFUUNBS1FYODJBZ1FNQVFzZ0NpQUJRUUZxSWdNZ0FVRUNheUFEUVFOd0d6WUNCQ0FCUVFOd0JFQWdBVUVCYXlFRERBRUxJQUZCQW1vaEF3c2dDaUFETmdJSVFYOGdBVUVEYmlBQlFYOUdHeUVOQWtBQ1FBSkFBMEFDUUFKQUlBRkJmMGNFUUNBQUtBSUlLQUlNSUFGQkFuUnFLQUlBSWdOQmYwY05BUXRCQUNFRElBQW9BdGdCSWdJZ0FDZ0MzQUZHRFFFRFFBSkFJQUlnQTBHUUFXeHFJZ0lpQnlnQ2lBRWlCaUFDS0FLTUFTSUVTUVJBSUFZZ0FUWUNBQ0FISUFaQkJHbzJBb2dCREFFTElBWWdBaWdDaEFFaUJtc2lDVUVDZFNJSVFRRnFJZ1ZCZ0lDQWdBUlBEUVVnQlNBRUlBWnJJZ1JCQVhVaUN5QUZJQXRMRzBILy8vLy9BeUFFUVFKMVFmLy8vLzhCU1JzaUJRUi9JQVZCZ0lDQWdBUlBEUWNnQlVFQ2RCRHFBUVZCQUFzaUJDQUlRUUowYWlJSUlBRTJBZ0FnQ1VFQlRnUkFJQVFnQmlBSkVQa0JHZ3NnQWlBRU5nS0VBU0FISUFoQkJHbzJBb2dCSUFJZ0JDQUZRUUowYWpZQ2pBRWdCa1VOQUNBR0VQY0JDeUFEUVFGcUlnTWdBQ2dDM0FFZ0FDZ0MyQUVpQW10QmtBRnRTUTBBQ3d3QkN5QURRUU51SUExSkRRQkJBQ0VHSUFBb0F0Z0JJZ1VnQUNnQzNBRkdEUUFEUUNBQUtBTHdBaUFHUVFSMGFpSUNJUVFnQWkwQURDRUhBa0FnQWlnQ0NDSURRZjhmU3cwQUlBSW9BZ1FpQ1VFQlNBMEFJQUlvQWdBaENDQUNJQWxCQVdzaUFqWUNCQ0FDSUFocUxRQUFJQU5CQ0hSeUlRTUxJQVJCQUNBSGEwSC9BWEVpQWlBRFFRaDJiQ0lISUFOQi93RnhJZ1JxSUFNZ0FpQUhhbXNnQWlBRVN4czJBZ2dDUUNBQ0lBUk5EUUFnQlNBR1FaQUJiR29pQXlJSEtBS0lBU0lDSUFNb0Fvd0JJZ1JKQkVBZ0FpQUJOZ0lBSUFjZ0FrRUVhallDaUFFTUFRc2dBaUFES0FLRUFTSUNheUlKUVFKMUlnaEJBV29pQlVHQWdJQ0FCRThOQmlBRklBUWdBbXNpQkVFQmRTSUxJQVVnQzBzYlFmLy8vLzhESUFSQkFuVkIvLy8vL3dGSkd5SUZCSDhnQlVHQWdJQ0FCRThOQmlBRlFRSjBFT29CQlVFQUN5SUVJQWhCQW5ScUlnZ2dBVFlDQUNBSlFRRk9CRUFnQkNBQ0lBa1ErUUVhQ3lBRElBUTJBb1FCSUFjZ0NFRUVhallDaUFFZ0F5QUVJQVZCQW5ScU5nS01BU0FDUlEwQUlBSVE5d0VMSUFaQkFXb2lCaUFBS0FMY0FTQUFLQUxZQVNJRmEwR1FBVzFKRFFBTEN5QU1RUUZxSWd4QkEwY0VRQ0FLSUF4QkFuUnFLQUlBSVFFTUFRc0xJQXBCRUdva0FFRUJEd3NRNXdFQUN4RDRBUUFMRU9jQkFBdFNBQ0FBTFFCTUJFQWdBRUVBT2dCTUlBQWdBQ2tET0NBQU5RSklRZ2Q4UWdPSWZEY0RPQXNnQUM4QkprR0JCRTBFUUNBQVFRQTZBSVFCSUFBZ0FDa0RjQ0FBTlFLQUFVSUhmRUlEaUh3M0EzQUxDOWdEQVFaL0l3QkJFR3NpQmlRQUFrQWdBUVJBSUFCQ0FEY0NXQ0FBS0FKVUlRSWdBRUVBTmdKVUlBSUVRQ0FDRVBjQkN5QUFRZ0EzQWt3Z0FDZ0NTQ0VDSUFCQkFEWUNTQ0FDQkVBZ0FoRDNBUXNnQVNnQ0FDRUNJQUVvQWdRaEF5QUdRUUE2QUE4Z0FDQURJQUpyUVFKMUlBWkJEMm9RUmlBQktBSWNJUUlnQVNnQ0dDRURJQVpCQURvQURpQUFRUXhxSUFJZ0EydEJBblVnQmtFT2FoQkdJQUJCSEdvZ0FTZ0NCQ0FCS0FJQWEwRUNkVUhRRUJCWkFrQWdBU2dDSENBQktBSVlheUlEUVFKMUlnUWdBQ2dDUENBQUtBSTBJZ0pyUVFKMVRRMEFJQU5CZjB3TkFpQUFLQUk0SVFVZ0F4RHFBU0lESUFSQkFuUnFJUWNnQXlBRklBSnJJZ1JxSVFVZ0JFRUJUZ1JBSUFNZ0FpQUVFUGtCR2dzZ0FDQUhOZ0k4SUFBZ0JUWUNPQ0FBSUFNMkFqUWdBa1VOQUNBQ0VQY0JDd0pBSUFFb0Fod2dBU2dDR0dzaUEwRUNkU0lFSUFBb0FqQWdBQ2dDS0NJQ2EwRUNkVTBOQUNBRFFYOU1EUUlnQUNnQ0xDRUZJQU1RNmdFaUF5QUVRUUowYWlFSElBTWdCU0FDYXlJRWFpRUZJQVJCQVU0RVFDQURJQUlnQkJENUFSb0xJQUFnQnpZQ01DQUFJQVUyQWl3Z0FDQUROZ0lvSUFKRkRRQWdBaEQzQVFzZ0FFRUJPZ0FZSUFBZ0FUWUNRQXNnQmtFUWFpUUFEd3NRK0FFQUM5TURBUVovSUFBb0FnQWlCQ0FCUVFOMlFmei8vLzhCY1dvaUFpQUNLQUlBUVFFZ0FYUnlOZ0lBSUFBb0FrQWhCUUovUVg4Z0FVRi9SaUlHRFFBYVFYOGdBVUVCYWlJRElBRkJBbXNnQTBFRGNCc2lBMEYvUmcwQUdpQUZLQUlBSUFOQkFuUnFLQUlBQ3lFQ0lBQW9BZ3dpQXlBQ1FRTjJRZnovLy84QmNXb2lCeUFIS0FJQVFRRWdBblJ5TmdJQUFrQUNmeUFHUlFSQVFYOGhBa0YvUVFJZ0FVRURjQnNnQVdvaUJrRi9Sd1JBSUFVb0FnQWdCa0VDZEdvb0FnQWhBZ3NnQXlBQ1FRTjJRZnovLy84QmNXb2lCaUFHS0FJQVFRRWdBblJ5TmdJQUlBVW9BZ3dnQVVFQ2RHb29BZ0FpQVVGL1JnMENJQUJCQURvQUdDQUVJQUZCQTNaQi9QLy8vd0Z4YWlJQUlBQW9BZ0JCQVNBQmRISTJBZ0JCZnlFQVFYOGhBaUFCUVFGcUlnUWdBVUVDYXlBRVFRTndHeUlFUVg5SEJFQWdCU2dDQUNBRVFRSjBhaWdDQUNFQ0N5QURJQUpCQTNaQi9QLy8vd0Z4YWlJRUlBUW9BZ0JCQVNBQ2RISTJBZ0JCZjBFQ0lBRkJBM0FiSUFGcUlnRkJmMGNFUUNBRktBSUFJQUZCQW5ScUtBSUFJUUFMSUFNZ0FFRURka0g4Ly8vL0FYRnFJZ0VvQWdCQkFTQUFkSElNQVFzZ0EwSDgvLy8vQVdvaEFTQURLQUw4Ly8vL0FVR0FnSUNBZUhJTElRQWdBU0FBTmdJQUN3dVFDd0VMZnlBQUlBQW9BalEyQWpnZ0FDQUFLQUlvTmdJc0FrQUNRQUpBSUFBb0FrQWlBU2dDSENBQktBSVlJZ05IQkVCQkFDRUJBMEFnQVNFRUFrQWdBeUFLUVFKMGFpZ0NBQ0lJUVg5R0RRQUNRQ0FBS0FJNElnRWdBQ2dDUEVjRVFDQUJJQVEyQWdBZ0FDQUJRUVJxTmdJNERBRUxJQUVnQUNnQ05DSUdheUlIUVFKMUlnTkJBV29pQWtHQWdJQ0FCRThOQkNBQ0lBZEJBWFVpQVNBQklBSkpHMEgvLy8vL0F5QURRZi8vLy84QlNSc2lCUVIvSUFWQmdJQ0FnQVJQRFFZZ0JVRUNkQkRxQVFWQkFBc2lBaUFEUVFKMGFpSUJJQVEyQWdBZ0IwRUJUZ1JBSUFJZ0JpQUhFUGtCR2dzZ0FDQUNJQVZCQW5ScU5nSThJQUFnQVVFRWFqWUNPQ0FBSUFJMkFqUWdCa1VOQUNBR0VQY0JDd0pBSUFBb0Fnd2dDa0VEZGtIOC8vLy9BWEZxS0FJQUlBcDJRUUZ4UlEwQUlBaEJBV29pQVNBSVFRSnJJQUZCQTNBYklnRkJmMFlOQUNBQUtBSUFJZ1VnQVVFRGRrSDgvLy8vQVhGcUtBSUFJQUYyUVFGeERRQWdBQ2dDUUNnQ0RDQUJRUUowYWlnQ0FDSUNRWDlHRFFBZ0FrRUJhaUlCSUFKQkFtc2dBVUVEY0JzaUEwRi9SZzBBSUFBb0FrQWhBZ05BSUFNaUNFRUJhaUlCSUFOQkFtc2dBVUVEY0JzaUFVRi9SZzBCSUFVZ0FVRURka0g4Ly8vL0FYRnFLQUlBSUFGMlFRRnhEUUVnQWlnQ0RDQUJRUUowYWlnQ0FDSURRWDlHRFFFZ0EwRUJhaUlCSUFOQkFtc2dBVUVEY0JzaUEwRi9SdzBBQ3dzZ0FDZ0NIQ0FJUVFKMGFpQUVOZ0lBQWtBZ0FDZ0NMQ0lCSUFBb0FqQkhCRUFnQVNBSU5nSUFJQUFnQVVFRWFqWUNMQXdCQ3lBQklBQW9BaWdpQm1zaUIwRUNkU0lEUVFGcUlnSkJnSUNBZ0FSUERRWWdBaUFIUVFGMUlnRWdBU0FDU1J0Qi8vLy8vd01nQTBILy8vLy9BVWtiSWdVRWZ5QUZRWUNBZ0lBRVR3MEdJQVZCQW5RUTZnRUZRUUFMSWdJZ0EwRUNkR29pQVNBSU5nSUFJQWRCQVU0RVFDQUNJQVlnQnhENUFSb0xJQUFnQWlBRlFRSjBhallDTUNBQUlBRkJCR28yQWl3Z0FDQUNOZ0lvSUFaRkRRQWdCaEQzQVFzZ0JFRUJhaUVCUVg5QkFpQUlRUU53R3lBSWFpSUNRWDlHRFFBZ0FDZ0NRQ2dDRENBQ1FRSjBhaWdDQUNJQ1FYOUdEUUFnQWtGL1FRSWdBa0VEY0J0cUlnTkJmMFlOQUNBRElBaEdEUUFEUUNBQUtBSUFJQU5CQVdvaUFpQURRUUpySUFKQkEzQWJJZ0pCQTNaQi9QLy8vd0Z4YWlnQ0FDQUNka0VCY1FSQUFrQWdBQ2dDT0NJRUlBQW9BanhIQkVBZ0JDQUJOZ0lBSUFBZ0JFRUVhallDT0F3QkN5QUVJQUFvQWpRaUNXc2lCa0VDZFNJRlFRRnFJZ0pCZ0lDQWdBUlBEUVlnQWlBR1FRRjFJZ1FnQWlBRVN4dEIvLy8vL3dNZ0JVSC8vLy8vQVVrYklnY0VmeUFIUVlDQWdJQUVUdzBJSUFkQkFuUVE2Z0VGUVFBTElnSWdCVUVDZEdvaUJDQUJOZ0lBSUFaQkFVNEVRQ0FDSUFrZ0JoRDVBUm9MSUFBZ0FpQUhRUUowYWpZQ1BDQUFJQVJCQkdvMkFqZ2dBQ0FDTmdJMElBbEZEUUFnQ1JEM0FRc2dBVUVCYWlFQ0FrQWdBQ2dDTENJRUlBQW9BakJIQkVBZ0JDQUROZ0lBSUFBZ0JFRUVhallDTEF3QkN5QUVJQUFvQWlnaUMyc2lDVUVDZFNJSFFRRnFJZ1ZCZ0lDQWdBUlBEUWdnQlNBSlFRRjFJZ1FnQkNBRlNSdEIvLy8vL3dNZ0IwSC8vLy8vQVVrYklnWUVmeUFHUVlDQWdJQUVUdzBJSUFaQkFuUVE2Z0VGUVFBTElnVWdCMEVDZEdvaUJDQUROZ0lBSUFsQkFVNEVRQ0FGSUFzZ0NSRDVBUm9MSUFBZ0JTQUdRUUowYWpZQ01DQUFJQVJCQkdvMkFpd2dBQ0FGTmdJb0lBdEZEUUFnQ3hEM0FRc2dBU0VFSUFJaEFRc2dBQ2dDSENBRFFRSjBhaUFFTmdJQVFYOUJBaUFEUVFOd0d5QURhaUlDUVg5R0RRRWdBQ2dDUUNnQ0RDQUNRUUowYWlnQ0FDSUNRWDlHRFFFZ0FrRi9RUUlnQWtFRGNCdHFJZ05CZjBZTkFTQURJQWhIRFFBTEN5QUtRUUZxSWdvZ0FDZ0NRQ0lFS0FJY0lBUW9BaGdpQTJ0QkFuVkpEUUFMQ3c4TEVPY0JBQXNRK0FFQUN4RG5BUUFMd1FFQkJIOENRQ0FCSUFBb0FoQWdBQ2dDRENJRGEwRUNkU0lDU3dSQUlBQkJER29nQVNBQ2F4QUtEQUVMSUFFZ0FrOE5BQ0FBSUFNZ0FVRUNkR28yQWhBTEFrQUNRQ0FBS0FJSUlBQW9BZ0FpQW10QkFuVWdBVThOQUNBQlFZQ0FnSUFFVHcwQklBQW9BZ1FoQXlBQlFRSjBJZ1FRNmdFaUFTQUVhaUVFSUFFZ0F5QUNheUlEYWlFRklBTkJBVTRFUUNBQklBSWdBeEQ1QVJvTElBQWdCRFlDQ0NBQUlBVTJBZ1FnQUNBQk5nSUFJQUpGRFFBZ0FoRDNBUXNQQ3hENEFRQUxsaEFCRDM4akFFRXdheUlHSkFBZ0FDZ0NCQ2dDTENFQ0lBQW9BZ2dpQXlnQ0FDRUZJQU1vQWdRaEF5QUdRUUEyQWlnZ0JrSUFOd01nQWtBZ0F5QUZhMEVDZFVFRGJpSURJQUlvQW1RZ0FpZ0NZQ0lFYTBFTWJTSUZTd1JBSUFKQjRBQnFJQU1nQldzZ0JrRWdhaEJlREFFTElBTWdCVThOQUNBQ0lBUWdBMEVNYkdvMkFtUUxBa0FnQUNnQzJBRWdBQ2dDM0FGR0JFQWdBQ2dDQkNJSktBSXNJZ2dvQW1RaUF5QUlLQUpnUndSQVFRQWhBZ05BSUFBb0FnZ2hCUUovQWtBZ0FrRURiQ0lFUVg5R0JFQWdCU2dDQUNBRVFRSjBhaWdDQkNFSFFYOGhDa0VCSVFRTUFRdEJmeUVISUFVb0FnQWdCRUVDZEdvb0FnQWhDaUFFUVFGcUlndEJmMFlFUUVFQUlRUU1BUXNnQlNnQ0FDQUxRUUowYWlnQ0FDRUhRWDhnQkVFQ2FpSUVRWDlHRFFFYUN5QUZLQUlBSUFSQkFuUnFLQUlBQ3lFRUlBSkJBV29oQlNBQ0lBTWdDQ2dDWUNJRGEwRU1iU0lMVHdSL0lBWkJBRFlDS0NBR1FnQTNBeUFnQ0VIZ0FHb2dCU0FMYXlBR1FTQnFFRjRnQUNnQ0JDRUpJQWdvQW1BRklBTUxJQUpCREd4cUlnSWdCRFlDQ0NBQ0lBYzJBZ1FnQWlBS05nSUFJQVVpQWlBSktBSXNJZ2dvQW1RaUF5QUlLQUpnYTBFTWJVa05BQXNMSUFrb0FnUWdBVFlDVUVFQklRSU1BUXNnQmtFQU5nSVlJQVpDQURjREVDQUFLQUlJSWdrb0FnQWhBU0FKS0FJRUlRSWdCa0VBTmdJSUlBWkNBRGNEQUFKL0FrQUNRQUpBQWtBQ1FDQUNJQUZySWdFRVFDQUJRWDlNRFFFZ0JpQUJFT29CSWdzMkFnQWdCaUFMSUFGQkFuVkJBblJxTmdJSUlBWWdDMEVBSUFFUStnRWdBV28yQWdRTElBa29BaHdnQ1NnQ0dDSUNhMEVBVEFSQVFRQWhBMEVBSVFFTUJRdEJBQ0VEUVFBaEJVRUFJUUVEUUFKQUlBSWdERUVDZEdvb0FnQWlCRUYvUmcwQUFrQWdBQ2dDZUNBTVFRTjJRZnovLy84QmNXb29BZ0FnREhaQkFYRU5BQ0FBS0FMY0FTQUFLQUxZQVNJTmF5SUNSUTBBUVg5QkFpQUVRUU53R3lBRWFpRUtJQUpCa0FGdElnSkJBU0FDUVFGTEd5RU9RUUFoQndOQUFrQWdEU0FIUVpBQmJHb2lBaWdDRUNBRVFRSjBJZzhnQWlnQ1JDZ0NBR29vQWdBaUVFRURka0g4Ly8vL0FYRnFLQUlBSUJCMlFRRnhSUTBBSUE4Z0FpZ0NJQ0lQYWlnQ0FDRVFJQVFDZjBGL0lBcEJmMFlOQUJwQmZ5QUpLQUlNSUFwQkFuUnFLQUlBSWdKQmYwWU5BQm9nQWtFQmF5QUNRUU53RFFBYUlBSkJBbW9MSWdKR0RRQURRRUVBSUFKQmYwWU5DeG9nRUNBUElBSkJBblJxS0FJQVJ3UkFJQUloQkF3RUN5QUVBbjlCZjBGL1FRSWdBa0VEY0JzZ0Ftb2lBa0YvUmcwQUdrRi9JQWtvQWd3Z0FrRUNkR29vQWdBaUFrRi9SZzBBR2lBQ1FRRnJJQUpCQTNBTkFCb2dBa0VDYWdzaUFrY05BQXNMSUFkQkFXb2lCeUFPUncwQUN3c2dDeUFFUVFKMGFpQUJJQVZySWdKQkFuVWlCellDQUFKQUlBRWdDRWtFUUNBQklBUTJBZ0FnQmlBQlFRUnFJZ0UyQWhRTUFRc2dCMEVCYWlJQlFZQ0FnSUFFVHcwRUlBRWdDQ0FGYXlJRFFRRjFJZ29nQVNBS1N4dEIvLy8vL3dNZ0EwRUNkVUgvLy8vL0FVa2JJZ0VFZnlBQlFZQ0FnSUFFVHcwR0lBRkJBblFRNmdFRlFRQUxJZ01nQjBFQ2RHb2lCeUFFTmdJQUlBTWdBVUVDZEdvaENDQUhRUVJxSVFFZ0FrRUJUZ1JBSUFNZ0JTQUNFUGtCR2dzZ0JpQUlOZ0lZSUFZZ0FUWUNGQ0FHSUFNMkFoQWdCUVJBSUFVUTl3RWdBQ2dDQ0NFSkN5QURJUVVMSUFSQmYwWU5BRUYvUVFJZ0JFRURjQnNnQkdvaUFrRi9SZzBBSUFrb0Fnd2dBa0VDZEdvb0FnQWlBa0YvUmcwQUlBSkJmMEVDSUFKQkEzQWJhaUlDUVg5R0RRQWdCQ0VISUFJZ0JFWU5BQU5BSUFJaENnSkFBa0FnQUNnQzNBRWdBQ2dDMkFFaURXc2lBa1VOQUNBQ1FaQUJiU0lDUVFFZ0FrRUJTeHNoRGtFQUlRSURRQ0FOSUFKQmtBRnNhaWdDSUNJUElBcEJBblFpRUdvb0FnQWdEeUFIUVFKMGFpZ0NBRVlFUUNBT0lBSkJBV29pQWtjTkFRd0NDd3NnQ3lBUWFpQUJJQU5ySWdKQkFuVWlCellDQUNBQklBaEpCRUFnQVNBS05nSUFJQVlnQVVFRWFpSUJOZ0lVSUFNaEJRd0NDeUFIUVFGcUlnRkJnSUNBZ0FSUERRZ2dBU0FJSUFOcklnVkJBWFVpQ0NBQklBaExHMEgvLy8vL0F5QUZRUUoxUWYvLy8vOEJTUnNpQVFSL0lBRkJnSUNBZ0FSUERRZ2dBVUVDZEJEcUFRVkJBQXNpQlNBSFFRSjBhaUlISUFvMkFnQWdCU0FCUVFKMGFpRUlJQWRCQkdvaEFTQUNRUUZPQkVBZ0JTQURJQUlRK1FFYUN5QUdJQWcyQWhnZ0JpQUJOZ0lVSUFZZ0JUWUNFQ0FEUlFSQUlBVWhBd3dDQ3lBREVQY0JJQUFvQWdnaENTQUZJUU1NQVFzZ0N5QUtRUUowYWlBTElBZEJBblJxS0FJQU5nSUFDeUFLUVg5R0RRRkJmMEVDSUFwQkEzQWJJQXBxSWdKQmYwWU5BU0FKS0FJTUlBSkJBblJxS0FJQUlnSkJmMFlOQVNBQ1FYOUJBaUFDUVFOd0cyb2lBa0YvUmcwQklBb2hCeUFDSUFSSERRQUxDeUFNUVFGcUlnd2dDU2dDSENBSktBSVlJZ0pyUVFKMVNBMEFDd3dFQ3hEbkFRQUxFT2NCQUFzUStBRUFDeERuQVFBTElBQW9BZ1FpRENnQ0xDSUlLQUprSWdjZ0NDZ0NZRWNFUUVFQUlRSURRQ0FDUVFGcUlRVWdDeUFDUVF4c0lncHFJZ1FvQWdnaENTQUVLQUlFSVEwZ0JDZ0NBQ0VFSUFJZ0J5QUlLQUpnSWdkclFReHRJZzVQQkg4Z0JrRUFOZ0lvSUFaQ0FEY0RJQ0FJUWVBQWFpQUZJQTVySUFaQklHb1FYaUFBS0FJRUlRd2dDQ2dDWUFVZ0J3c2dDbW9pQWlBSk5nSUlJQUlnRFRZQ0JDQUNJQVEyQWdBZ0JTSUNJQXdvQWl3aUNDZ0NaQ0lISUFnb0FtQnJRUXh0U1EwQUN3c2dEQ2dDQkNBQklBTnJRUUoxTmdKUVFRRUxJUUlnQ3dSQUlBWWdDellDQkNBTEVQY0JDeUFEUlEwQUlBWWdBellDRkNBREVQY0JDeUFHUVRCcUpBQWdBZ3VRQVFFQmZ5QUFLQUpVSWdFRVFDQUFJQUUyQWxnZ0FSRDNBUXNnQUNnQ1NDSUJCRUFnQUNBQk5nSk1JQUVROXdFTElBQW9BalFpQVFSQUlBQWdBVFlDT0NBQkVQY0JDeUFBS0FJb0lnRUVRQ0FBSUFFMkFpd2dBUkQzQVFzZ0FDZ0NIQ0lCQkVBZ0FDQUJOZ0lnSUFFUTl3RUxJQUFvQWd3aUFRUkFJQUVROXdFTElBQW9BZ0FpQUFSQUlBQVE5d0VMQzlBRUFRZC9JQUVnQUNnQ0NDSURJQUFvQWdBaUJHdEJBblZOQkVBQ1FDQUFLQUlFSWdZZ0JHdEJBblVpQnlBQklBRWdCMHNiSWdWRkRRQWdCVUVCYXlFSkFrQWdCVUVIY1NJSVJRUkFJQVFoQXd3QkN5QUVJUU1EUUNBRElBSW9BZ0EyQWdBZ0JVRUJheUVGSUFOQkJHb2hBeUFJUVFGcklnZ05BQXNMSUFsQkIwa05BQU5BSUFNZ0FpZ0NBRFlDQUNBRElBSW9BZ0EyQWdRZ0F5QUNLQUlBTmdJSUlBTWdBaWdDQURZQ0RDQURJQUlvQWdBMkFoQWdBeUFDS0FJQU5nSVVJQU1nQWlnQ0FEWUNHQ0FESUFJb0FnQTJBaHdnQTBFZ2FpRURJQVZCQ0dzaUJRMEFDd3NnQVNBSFN3UkFJQUFnQVNBSGF5SUFCSDhnQmlBQVFRSjBhaUVBQTBBZ0JpQUNLQUlBTmdJQUlBWkJCR29pQmlBQVJ3MEFDeUFBQlNBR0N6WUNCQThMSUFBZ0JDQUJRUUowYWpZQ0JBOExJQVFFUUNBQUlBUTJBZ1FnQkJEM0FTQUFRUUEyQWdnZ0FFSUFOd0lBUVFBaEF3c0NRQ0FCUVlDQWdJQUVUdzBBSUFFZ0EwRUJkU0lFSUFFZ0JFc2JRZi8vLy84RElBTkJBblZCLy8vLy93RkpHeUlEUVlDQWdJQUVUdzBBSUFBZ0EwRUNkQ0lERU9vQklnUTJBZ0FnQUNBRElBUnFOZ0lJSUFJb0FnQWhBaUFFSVFNZ0FVRUNkQ0lCUVFScklnWkJBblpCQVdwQkIzRWlCUVJBQTBBZ0F5QUNOZ0lBSUFOQkJHb2hBeUFGUVFGcklnVU5BQXNMSUFFZ0JHb2hBU0FHUVJ4UEJFQURRQ0FESUFJMkFod2dBeUFDTmdJWUlBTWdBallDRkNBRElBSTJBaEFnQXlBQ05nSU1JQU1nQWpZQ0NDQURJQUkyQWdRZ0F5QUNOZ0lBSUFOQklHb2lBeUFCUncwQUN3c2dBQ0FCTmdJRUR3c1E1d0VBQzRnQ0FRZC9Jd0JCRUdzaUF5UUFBa0FDUUNBQUtBSUlRUVYwSUFGUERRQWdBMEVBTmdJSUlBTkNBRGNEQUNBQlFYOU1EUUVnQVVFQmEwRUZka0VCYWlJR1FRSjBFT29CSVFFZ0F5QUdOZ0lJSUFNZ0FUWUNBQ0FBS0FJQUlRUWdBeUFBS0FJRUlnSTJBZ1FnQVNBQklBSkJBV3RCQTNaQi9QLy8vd0Z4YWlBQ1FTRkpHMEVBTmdJQUFrQWdBa0VCU0EwQUlBRWdCQ0FDUVFWMklnZEJBblFpQlJEN0FTRUlJQUlnQjBFRmRHc2lBa0VCU0EwQUlBVWdDR29pQlNBRktBSUFRWDlCSUNBQ2EzWWlBa0YvYzNFZ0JDQUhRUUowYWlnQ0FDQUNjWEkyQWdBTElBQWdCallDQ0NBQUlBRTJBZ0FnQkVVTkFDQUVFUGNCQ3lBRFFSQnFKQUFQQ3hEbkFRQUwzUUVCQlg4Z0FDZ0NCQ0lCSUFBb0FnaEhCRUFnQVVIY0RpZ0NBRFlDQUNBQUlBRkJCR28yQWdRUEN3SkFJQUVnQUNnQ0FDSUJheUlGUVFKMUlnUkJBV29pQWtHQWdJQ0FCRWtFUUNBQ0lBVkJBWFVpQXlBQ0lBTkxHMEgvLy8vL0F5QUVRZi8vLy84QlNSc2lBZ1IvSUFKQmdJQ0FnQVJQRFFJZ0FrRUNkQkRxQVFWQkFBc2lBeUFFUVFKMGFpSUVRZHdPS0FJQU5nSUFJQVZCQVU0RVFDQURJQUVnQlJENUFSb0xJQUFnQXlBQ1FRSjBhallDQ0NBQUlBUkJCR28yQWdRZ0FDQUROZ0lBSUFFRVFDQUJFUGNCQ3c4TEVPY0JBQXNRK0FFQUM3SUxBZ2gvQW4wZ0FpZ0NBQ0VJSUFBQ2Z3SkFJQUVvQWdRaUJFVU5BQUpBSUFScElnWkJBazhFUUNBSUlnVWdCRThFUUNBSUlBUndJUVVMSUFFb0FnQWdCVUVDZEdvb0FnQWlBa1VOQWlBR1FRRk5EUUVEUUNBQ0tBSUFJZ0pGRFFNZ0NDQUNLQUlFSWdaSEJFQWdCQ0FHVFFSL0lBWWdCSEFGSUFZTElBVkhEUVFMSUFJb0FnZ2dDRWNOQUF0QkFBd0RDeUFCS0FJQUlBUkJBV3NnQ0hFaUJVRUNkR29vQWdBaUFrVU5BUXNnQkVFQmF5RUpBMEFnQWlnQ0FDSUNSUTBCSUFnZ0FpZ0NCQ0lHUjBFQUlBWWdDWEVnQlVjYkRRRWdBaWdDQ0NBSVJ3MEFDMEVBREFFTFFSQVE2Z0VoQWlBREtBSUFLQUlBSVFNZ0FrRUFOZ0lNSUFJZ0F6WUNDQ0FDSUFnMkFnUWdBa0VBTmdJQUFrQWdBU2dDREVFQmFyTWlEU0FCS2dJUUlnd2dCTE9VWGtFQklBUWJSUTBBSUFRZ0JFRUJhM0ZCQUVjZ0JFRURTWElnQkVFQmRISWhCa0VDSVFVQ1FBSi9JQTBnREpXTklneERBQUNBVDEwZ0RFTUFBQUFBWUhFRVFDQU1xUXdCQzBFQUN5SURJQVlnQXlBR1N4c2lBMEVCUmcwQUlBTWdBMEVCYTNGRkJFQWdBeUVGREFFTElBTVE3d0VoQlNBQktBSUVJUVFMQWtBZ0JDQUZUd1JBSUFRZ0JVME5BU0FFUVFOSklRTUNmeUFCS0FJTXN5QUJLZ0lRbFkwaURFTUFBSUJQWFNBTVF3QUFBQUJnY1FSQUlBeXBEQUVMUVFBTElRWUNmd0pBSUFNTkFDQUVhVUVCU3cwQUlBWkJBVUVnSUFaQkFXdG5hM1FnQmtFQ1NSc01BUXNnQmhEdkFRc2lBeUFGSUFNZ0JVc2JJZ1VnQkU4TkFRc0NRQUpBSUFVaUJ3UkFJQWRCZ0lDQWdBUlBEUUVnQjBFQ2RCRHFBU0VESUFFb0FnQWhCU0FCSUFNMkFnQWdCUVJBSUFVUTZ3RUxJQUVnQnpZQ0JDQUhRUU54SVFSQkFDRURJQWRCQVd0QkEwOEVRQ0FIUVh4eElRWURRQ0FEUVFKMElnVWdBU2dDQUdwQkFEWUNBQ0FCS0FJQUlBVkJCSEpxUVFBMkFnQWdBU2dDQUNBRlFRaHlha0VBTmdJQUlBRW9BZ0FnQlVFTWNtcEJBRFlDQUNBRFFRUnFJUU1nQmtFRWF5SUdEUUFMQ3lBRUJFQURRQ0FCS0FJQUlBTkJBblJxUVFBMkFnQWdBMEVCYWlFRElBUkJBV3NpQkEwQUN3c2dBU2dDQ0NJR1JRMENJQUZCQ0dvaEF5QUdLQUlFSVFrQ1FDQUhhU0lGUVFGTkJFQWdDU0FIUVFGcmNTRUpEQUVMSUFjZ0NVc05BQ0FKSUFkd0lRa0xJQUVvQWdBZ0NVRUNkR29nQXpZQ0FDQUdLQUlBSWdORkRRSWdCVUVCVFFSQUlBZEJBV3NoQ3dOQUFrQWdDU0FES0FJRUlBdHhJZ1JHQkVBZ0F5RUdEQUVMSUFNaEJTQUVRUUowSWdvZ0FTZ0NBR29pQnlnQ0FBUkFBMEFnQlNJRUtBSUFJZ1VFUUNBREtBSUlJQVVvQWdoR0RRRUxDeUFHSUFVMkFnQWdCQ0FCS0FJQUlBcHFLQUlBS0FJQU5nSUFJQUVvQWdBZ0Ntb29BZ0FnQXpZQ0FBd0JDeUFISUFZMkFnQWdBeUVHSUFRaENRc2dCaWdDQUNJRERRQUxEQU1MQTBBQ1FBSi9JQWNnQXlnQ0JDSUVUUVJBSUFRZ0IzQWhCQXNnQkNBSlJnc0VRQ0FESVFZTUFRc2dBeUVGSUFSQkFuUWlDaUFCS0FJQWFpSUxLQUlBUlFSQUlBc2dCallDQUNBRElRWWdCQ0VKREFFTEEwQWdCU0lFS0FJQUlnVUVRQ0FES0FJSUlBVW9BZ2hHRFFFTEN5QUdJQVUyQWdBZ0JDQUJLQUlBSUFwcUtBSUFLQUlBTmdJQUlBRW9BZ0FnQ21vb0FnQWdBellDQUFzZ0JpZ0NBQ0lERFFBTERBSUxJQUVvQWdBaEF5QUJRUUEyQWdBZ0F3UkFJQU1RNndFTElBRkJBRFlDQkF3QkN4RDRBUUFMQ3lBQktBSUVJZ1FnQkVFQmF5SURjVVVFUUNBRElBaHhJUVVNQVFzZ0JDQUlTd1JBSUFnaEJRd0JDeUFJSUFSd0lRVUxBa0FnQVNnQ0FDQUZRUUowYWlJREtBSUFJZ1ZGQkVBZ0FpQUJLQUlJTmdJQUlBRWdBallDQ0NBRElBRkJDR28yQWdBZ0FpZ0NBQ0lEUlEwQklBTW9BZ1FoQXdKQUlBUWdCRUVCYXlJRmNVVUVRQ0FESUFWeElRTU1BUXNnQXlBRVNRMEFJQU1nQkhBaEF3c2dBU2dDQUNBRFFRSjBhaUFDTmdJQURBRUxJQUlnQlNnQ0FEWUNBQ0FGSUFJMkFnQUxJQUVnQVNnQ0RFRUJhallDREVFQkN6b0FCQ0FBSUFJMkFnQUwwQUlCQTM4Z0FDZ0NDQ0VCSUFBb0FnQWhBd0pBSUFBdEFBd0VRQUpBQWtBQ1FBSkFJQUZCZjBZTkFDQUJRUUZxSWdJZ0FVRUNheUFDUVFOd0d5SUJRWDlHRFFBZ0F5Z0NEQ0FCUVFKMGFpZ0NBQ0lCUVg5SERRRUxJQUJCZnpZQ0NBd0JDeUFBSUFGQkFXb2lBaUFCUVFKcklBSkJBM0FiSWdFMkFnZ2dBVUYvUncwQkN3Si9RWDhnQUNnQ0JDSUNRWDlHRFFBYVFYOUJmMEVDSUFKQkEzQWJJQUpxSWdKQmYwWU5BQnBCZnlBREtBSU1JQUpCQW5ScUtBSUFJZ0pCZjBZTkFCb2dBa0VCYXlBQ1FRTndEUUFhSUFKQkFtb0xJUUVnQUVFQU9nQU1JQUFnQVRZQ0NBOExJQUVnQUNnQ0JFY05BU0FBUVg4MkFnZ1BDeUFBQW45QmZ5QUJRWDlHRFFBYVFYOUJmMEVDSUFGQkEzQWJJQUZxSWdGQmYwWU5BQnBCZnlBREtBSU1JQUZCQW5ScUtBSUFJZ0ZCZjBZTkFCb2dBVUVCYXlBQlFRTndEUUFhSUFGQkFtb0xOZ0lJQ3d2Y0JBRUhmeUFCSUFBb0FnZ2lCQ0FBS0FJRUlnWnJRUXh0VFFSQUFrQWdBVVVOQUNBQlFReHNJUVFnQmlFRElBRkJER3hCREdzaUJVRU1ia0VCYWtFRGNTSUJCRUFEUUNBRElBSXBBZ0EzQWdBZ0F5QUNLQUlJTmdJSUlBTkJER29oQXlBQlFRRnJJZ0VOQUFzTElBUWdCbW9oQmlBRlFTUkpEUUFEUUNBRElBSXBBZ0EzQWdBZ0F5QUNLQUlJTmdJSUlBTWdBaWdDQ0RZQ0ZDQURJQUlwQWdBM0Fnd2dBeUFDS0FJSU5nSWdJQU1nQWlrQ0FEY0NHQ0FESUFJcEFnQTNBaVFnQXlBQ0tBSUlOZ0lzSUFOQk1Hb2lBeUFHUncwQUN3c2dBQ0FHTmdJRUR3c0NRQ0FHSUFBb0FnQWlCV3RCREcwaUJ5QUJhaUlEUWRhcTFhb0JTUVJBSUFNZ0JDQUZhMEVNYlNJRVFRRjBJZ1VnQXlBRlN4dEIxYXJWcWdFZ0JFR3ExYXJWQUVrYklnVUVmeUFGUWRhcTFhb0JUdzBDSUFWQkRHd1E2Z0VGUVFBTElnZ2dCMEVNYkdvaUJDRURJQUZCREd3aUIwRU1heUlKUVF4dVFRRnFRUU54SWdFRVFDQUVJUU1EUUNBRElBSXBBZ0EzQWdBZ0F5QUNLQUlJTmdJSUlBTkJER29oQXlBQlFRRnJJZ0VOQUFzTElBUWdCMm9oQnlBSlFTUlBCRUFEUUNBRElBSXBBZ0EzQWdBZ0F5QUNLQUlJTmdJSUlBTWdBaWdDQ0RZQ0ZDQURJQUlwQWdBM0Fnd2dBeUFDS0FJSU5nSWdJQU1nQWlrQ0FEY0NHQ0FESUFJcEFnQTNBaVFnQXlBQ0tBSUlOZ0lzSUFOQk1Hb2lBeUFIUncwQUN3c2dCQ0FHSUFBb0FnQWlBV3NpQWtGMGJVRU1iR29oQXlBQ1FRRk9CRUFnQXlBQklBSVErUUVhQ3lBQUlBZ2dCVUVNYkdvMkFnZ2dBQ0FITmdJRUlBQWdBellDQUNBQkJFQWdBUkQzQVFzUEN4RG5BUUFMRVBnQkFBc0hBQ0FBS0FJRUN3Y0FJQUFvQWdnTGR3SUJmZ0ovQWtBZ0FFRUtTdzBBSUFJcEF4QWlBeUFDS1FNSVdRMEFJQUlvQWdBZ0E2ZHFMQUFBSVFVZ0FpQURRZ0Y4TndNUUlBV3RJUU1nQVFKK0lBVkJmMHdFUUNBQVFRRnFJQUVnQWhCaFJRMENJQU5DL3dDRElBRXBBd0JDQjRhRURBRUxJQU5DL3dHREN6Y0RBRUVCSVFRTElBUUx2VVVDSDM4RWZpTUFRVUJxSWd3a0FDQUFRUUEyQW9RQklBQW9BcFFCQkVBZ0FDZ0NrQUVpQVFSQUEwQWdBU2dDQUNFRElBRVE5d0VnQXlJQkRRQUxDMEVBSVFFZ0FFRUFOZ0tRQVFKQUlBQW9Bb3dCSWd0RkRRQWdDMEVEY1NFRElBdEJBV3RCQTA4RVFDQUxRWHh4SVFVRFFDQUJRUUowSWdzZ0FDZ0NpQUZxUVFBMkFnQWdBQ2dDaUFFZ0MwRUVjbXBCQURZQ0FDQUFLQUtJQVNBTFFRaHlha0VBTmdJQUlBQW9Bb2dCSUF0QkRISnFRUUEyQWdBZ0FVRUVhaUVCSUFWQkJHc2lCUTBBQ3dzZ0EwVU5BQU5BSUFBb0FvZ0JJQUZCQW5ScVFRQTJBZ0FnQVVFQmFpRUJJQU5CQVdzaUF3MEFDd3NnQUVFQU5nS1VBUXNDUUFKQUFrQWdBQ2dDQkNJQkxRQWtJaFJCQ0hRZ0FTMEFKWElpQzBHQkJFc05BQ0FCS0FJZ0lRTWdDMEgvQTAwRVFDQURLUU1RSWlCQ0JId2lJU0FES1FNSVZRMENJQU1vQWdBZ0lLZHFLQUFBSVFzZ0F5QWhOd01RSUFBZ0N6WUNoQUVNQVF0QkFTQU1JQU1RRlVVTkFTQUFLQUlFSWdFdEFDUWhGQ0FBSUF3b0FnQTJBb1FCQ3lBQktBSWdJUU1DUUFKQUFrQWdGRUgvQVhGQkFVMEVRRUVBSVJRZ0F5a0RFQ0lnUWdSOElpRWdBeWtEQ0ZVTkJTQU1JQU1vQWdBZ0lLZHFLQUFBSWdzMkFqd2dBeUFoTndNUUlBQWdDellDbkFFZ0FFR2NBV29oQlF3QkMwRUFJUlJCQVNBTVFUeHFJQU1RRlVVTkJDQUFLQUlFSWdFdEFDUWhBeUFBSUF3b0FqdzJBcHdCSUFCQm5BRnFJUVVnQTBFQlN3MEJDeUFCS0FJZ0lnRXBBd2dnQVNrREVDSWdRZ1I4SWlGVERRTWdEQ0FCS0FJQUlDQ25haWdBQUNJRE5nSTRJQUVnSVRjREVBd0JDMEVCSUF4Qk9Hb2dBU2dDSUJBVlJRMENJQXdvQWpnaEF3c2dBMEhWcXRXcUJVc05BU0FGS0FJQUlBTkJBMnhMRFFFZ0FDZ0NCQ0lMS0FJZ0lnRXBBd2dpSVNBQktRTVFJaUJYRFFFZ0FTZ0NBQ0lGSUNDbmFpMEFBQ0VQSUFFZ0lFSUJmQ0lpTndNUUFrQWdDeTBBSkVFQlRRUkFJQ0VnSUVJRmZDSWdVdzBESUF3Z0JTQWlwMm9vQUFBaUJUWUNOQ0FCSUNBM0F4QWdBeUFGVHcwQkRBTUxRUUVnREVFMGFpQUJFQlZGRFFJZ0F5QU1LQUkwSWdWSkRRSUxJQU1nQlVFRGJpQUZha3NOQVNBQUtBSUVJZ3NvQWlBaEFRSkFJQXN0QUNSQkFVMEVRQ0FCS1FNUUlpQkNCSHdpSVNBQktRTUlWUTBESUF3Z0FTZ0NBQ0FncDJvb0FBQWlDellDTUNBQklDRTNBeEFnQlNBTFR3MEJEQU1MUVFFZ0RFRXdhaUFCRUJWRkRRSWdEQ2dDTUNJTElBVkxEUUlMSUFBZ0FDZ0NHRFlDSEVIWUFCRHFBU0lCUWdBM0FnQWdBVUVBTmdJNElBRkNBRGNDTUNBQlFnQTNBaWdnQVVJQU53SWdJQUZDQURjQ0dDQUJRZ0EzQWhBZ0FVSUFOd0lJSUFGQlFHdENBRGNDQUNBQlFnQTNBa2dnQVVJQU53SlFJQUVnQVRZQ1BDQUFLQUlJSVFZZ0FDQUJOZ0lJSUFZRVFDQUdFRWtnQUNnQ0NFVU5BZ3NnQUNBQUtBS2dBVFlDcEFFZ0FFR2dBV29nQXhCS0lBQWdBQ2dDckFFMkFyQUJJQUJCckFGcUlBTVFTaUFBUVVCclFRQTJBZ0FnQUVGL05nSmNJQUJDZnpjQ1ZDQUFJQUFvQWlRMkFpZ2dBQ0FBS0FJd05nSTBJQUFnQUNnQ1NEWUNUQ0FBUWRnQmFpSWRFRXNnSFNBUEVFd2dBQ2dDQ0NBRElBQW9BcHdCSUF0cUVFMUZEUUVnQUNnQ25BRWhBU0FNUVFFNkFBQWdBRUg0QUdvZ0FTQUxhaUFNRUVZQ1FDQUFLQUlFSWdFdkFTUWlBMEVJZENBRFFRaDJja0gvL3dOeElnTkJnUVJOQkVBZ0FTZ0NJQ0VCQWtBZ0EwSC9BMDBFUUNBQktRTVFJaUJDQkh3aUlTQUJLUU1JVlEwRklBRW9BZ0FnSUtkcUtBQUFJUU1nQVNBaE53TVFEQUVMUVFFZ0RFRXNhaUFCRUJWRkRRUWdEQ2dDTENFREN5QURSUTBESUFPdElBQW9BZ1FpQVNnQ0lDSUdLUU1JSUFZcEF4QjlWUTBESUF4Q0FEY0RFQ0FNUWdBM0F4Z2dERUlBTndBZElBeEJBRHNCSmlBTVFRQTJBZ0FnREVJQU53TUlJQUVvQWlBaUFTa0RDQ0VoSUFFb0FnQWhCaUFCS1FNUUlTQWdBUzhCSmlFQklBeENBRGNERUNBTUlBRTdBU1lnRENBR0lDQ25haUFEYWpZQ0FDQU1JQ0VnSUgybklBTnJyVGNEQ0NBQUlBd1FUaUlCUVg5R0RRTWdBYXdoSXd3QkMwSi9JU01nQUNBQktBSWdFRTVCZjBZTkFnc2dBRUhvQVdvaUNDQUFFRThnQUNBQUlBQW9BZ0FvQWlRUkFBQTJBdndDSUFBZ0R6WUM5QUlnQUNBTElBQW9BcHdCYWpZQ2dBTWdERUlBTndNUUlBeENBRGNER0NBTVFnQTNBQjBnREVFQU93RW1JQXhCQURZQ0FDQU1RZ0EzQXdnakFFRVFheUlHSkFBZ0NDQUlLUU1nTndOSUlBZ2dDQ2tEQURjREtDQUlRVUJySUFncEF4ZzNBd0FnQ0NBSUtRTVFOd000SUFnZ0NDa0RDRGNETUNBSVFTaHFJUUVDUUFKQUFrQUNRQ0FJTHdGT1FZRUVUUVJBSUFncEF6QWlJaUFJS1FNNElpRkNDSHdpSUZNTkFpQUlLQUlvSWdzZ0lhZHFLUUFBSVNFZ0NDQWdOd000REFFTFFRRWdCa0VJYWlBQkVHRkZEUUVnQ0NrRE1DRWlJQWdwQXpnaElDQUlLQUlvSVFzZ0Jpa0RDQ0VoQ3lBSVFRQTJBa2dnQ0VFQk9nQk1JQWhCUUdzZ0N5QWdwMm9pQXpZQ0FDQUlJQU1nSWlBZ2ZhZHFOZ0pFSUFnZ0FTa0RBRGNEQUNBSUlBRXBBd2dpSWpjRENDQUlJQUVwQXhBaUlEY0RFQ0FJSUFFcEF4ZzNBeGdnQ0NBQktRTWdOd01nSUNFZ0lpQWdmVmdOQVF0QkFDRUJEQUVMSUFnZ0lDQWhmRGNERUFKQUlBZ3ZBU1pCZ1FSTkJFQWdDQ0FJS1FNQU53TmdJQWdnQ0NrRElEY0RnQUVnQ0NBSUtRTVlOd040SUFnZ0NDa0RFRGNEY0NBSUlBZ3BBd2czQTJnZ0NFSGdBR29oQVFKQUFrQUNRQ0FJTHdHR0FVR0JCRTBFUUNBSUtRTm9JaUlnQ0NrRGNDSWhRZ2g4SWlCVERRSWdDQ2dDWUNJTElDR25haWtBQUNFaElBZ2dJRGNEY0F3QkMwRUJJQVpCQ0dvZ0FSQmhSUTBCSUFncEEyZ2hJaUFJS1FOd0lTQWdDQ2dDWUNFTElBWXBBd2doSVFzZ0NFRUFOZ0tBQVNBSVFRRTZBSVFCSUFnZ0N5QWdwMm9pQXpZQ2VDQUlJQU1nSWlBZ2ZhZHFOZ0o4SUFnZ0FTa0RBRGNEQUNBSUlBRXBBd2dpSWpjRENDQUlJQUVwQXhBaUlEY0RFQ0FJSUFFcEF4ZzNBeGdnQ0NBQktRTWdOd01nSUNFZ0lpQWdmVmdOQVF0QkFDRUJEQU1MSUFnZ0lDQWhmRGNERUF3QkMwRUFJUUVnQ0VIUUFHb2dDQkFZUlEwQkN3SkFJQWdvQW93QklnOUJBVWdOQUVGL0lBOUJCSFFpRWtFRWNpQVBRZi8vLy84QWNTQVBSeHNRNmdFaUFTQVBOZ0lBSUFGQkJHb2lBeUVCSUJKQkVHc2lCRUVFZGtFQmFrRUhjU0lMQkVBZ0F5RUJBMEFnQVVJQU53SUFJQUZDQURjQUJTQUJRUkJxSVFFZ0MwRUJheUlMRFFBTEN5QUVRZkFBVHdSQUlBTWdFbW9oQ3dOQUlBRkNBRGNDQUNBQlFnQTNBaEFnQVVJQU53SWdJQUZDQURjQ01DQUJRZ0EzQWtBZ0FVSUFOd0pRSUFGQ0FEY0NZQ0FCUWdBM0FuQWdBVUlBTndBRklBRkNBRGNBRlNBQlFnQTNBQ1VnQVVJQU53QTFJQUZDQURjQVJTQUJRZ0EzQUZVZ0FVSUFOd0JsSUFGQ0FEY0FkU0FCUVlBQmFpSUJJQXRIRFFBTEN5QUlLQUtJQVNFQklBZ2dBellDaUFFZ0FRUkFJQUZCQkdzUW9BRWdDQ2dDakFFaER3dEJBQ0VCSUE5QkFFd05BQU5BSUFnb0FvZ0JJQUZCQkhScUlBZ1FHQVJBSUFGQkFXb2lBU0FJS0FLTUFVZ05BUXdDQ3d0QkFDRUJEQUVMSUF3Z0NDa0RBRGNEQUNBTUlBZ3BBeUEzQXlBZ0RDQUlLUU1ZTndNWUlBd2dDQ2tERUNJZ053TVFJQXdnQ0NrRENDSWhOd01JUVFBaEFTQWhJQ0JDQkh3aUlsTU5BQ0FNS0FJQUlDQ25haWdBQUNFTElBd2dJamNERUNBTFFRQklEUUFnQ3lBSUtBS1lBU0lEVGcwQUlBWkJBRFlDQ0FKQUlBZ29BcUFCSUFnb0Fwd0JJZ3RyUVFKMUlnRWdBMGtFUUNBSVFad0JhaUFESUFGcklBWkJDR29RRmd3QkN5QUJJQU5ORFFBZ0NDQUxJQU5CQW5ScU5nS2dBUXNnQ0VHb0FXb2dEQkFZSVFFTElBWkJFR29rQUNBQlJRMEJBbjlCQUNFQlFRQWhCa0VBSVFOQkFDRVBRUUFoQzBFQUlSSWpBRUhnQUdzaURTUUFJQTFCQURZQ1NDQU5RZ0EzQTBBZ0RVSUFOd013SUExQ0FEY0RLQ0FOUVlDQWdQd0ROZ0k0SUExQkFEWUNJQ0FOUWdBM0F4aEJBU0VUSUFBaUJDZ0NmQ0VZQWtBQ1FBSkFBa0FDUUNBRklnQkJBVWdOQUNBRVFlZ0JhaUVaSUFRb0F0Z0JJQVFvQXR3QlJ5RWZBMEFnRWlJSFFRRnFJUklDUUFKQUFrQUNRQUpBSUFRb0FxUURJZ0pCZjBjRVFDQUVMUUNjQXlFSkFrQWdCQ2dDbUFNaUJVSC9IMHNOQUNBRUtBS1VBeUlLUVFGSURRQWdCQ0FLUVFGcklnbzJBcFFESUFRb0FwQURJQXBxTFFBQUlBVkJDSFJ5SVFVTElBUkJBQ0FKYTBIL0FYRWlDU0FGUVFoMmJDSUtJQVZCL3dGeElnNXFJQVVnQ1NBS2Ftc2dDU0FPU3lJRkd6WUNtQU1nQlEwQkN5QUVJQVF0QUxRQ0JIOGdCQ2dDcUFJaUNpQUVLQUt3QWlJRlFRTjJhaUlDSUFRb0Fxd0NJZzVQRFFJZ0FpMEFBQ0VKSUFRZ0JVRUJhaUlDTmdLd0FpQUpJQVZCQjNGMlFRRnhSUTBDUVFBaENRSkFJQTRnQ2lBQ1FRTjJJaEZxSWhWTkJFQWdBaUVGREFFTElCVXRBQUFoQ1NBRUlBVkJBbW9pQlRZQ3NBSWdCVUVEZGlFUklBa2dBa0VIY1haQkFYRWhDUXNnRGlBS0lCRnFJZ0pMQkg4Z0FpMEFBQ0VDSUFRZ0JVRUJhallDc0FJZ0FpQUZRUWR4ZGtFQmRFRUNjU0FKY2dVZ0NRdEJBWFJCQVhJRlFRRUxJZ0kyQXFBRERBTUxJQVFnQWpZQ29BTWdBZzBDREFFTElBUkJBRFlDb0FNTElBRWdCa1lFUUVGL0lRVU1CUXRCZnlFQ0lBUW9BZ2dpQ2lnQ0dDSVZBbjlCZnlBQlFRUnJJaG9vQWdBaUJVRi9SZzBBR2tGL0lBVkJBV29pQ1NBRlFRSnJJQWxCQTNBYklnbEJmMFlOQUJvZ0NpZ0NBQ0FKUVFKMGFpZ0NBQXNpRGtFQ2RHb29BZ0FpQ1VGL1J3UkFJQWxCQVdvaUFpQUpRUUpySUFKQkEzQWJJUUlMSUFvb0Fnd2lDU0FGUVFKMGFpQUhRUU5zSWdkQkFXb2lFellDQUNBSklCTkJBblFpSG1vZ0JUWUNBQ0FKSUFKQkFuUnFJQWRCQW1vaUVUWUNBQ0FKSUJGQkFuUWlHMm9nQWpZQ0FFRi9JUWtDZjBGL0lBVkJmMFlOQUJwQmYwRi9RUUlnQlVFRGNCc2dCV29pQlVGL1JnMEFHaUFLS0FJQUlBVkJBblJxS0FJQUN5RVRBa0FnQWtGL1JnMEFJQUpCQVdvaUJTQUNRUUpySUFWQkEzQWJJZ1ZCZjBZTkFDQUtLQUlBSUFWQkFuUnFLQUlBSVFrTFFYOGhCU0FPSUJOR0RRUWdDU0FPUmcwRUlBb29BZ0FpQlNBSFFRSjBhaUFPTmdJQUlBVWdIbW9nQ1RZQ0FDQUZJQnRxSUJNMkFnQWdFMEYvUndSQUlCVWdFMEVDZEdvZ0VUWUNBQXNnQkNnQ2VDQU9RUU4yUWZ6Ly8vOEJjV29pQlNBRktBSUFRWDRnRG5keE5nSUFJQm9nQnpZQ0FDQVpJQWNRWXd3QkMwRi9JUVVDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQ1FRRnJEZ2NCRFFBTkFBMENEUXNnQVNBUFJnME1JQVFvQWdnaUNpZ0NEQ0lHSUFkQkEyd2lDVUVDUVFFZ0FrRUZSaUlPRzJvaUFrRUNkQ0lWYWlBQlFRUnJJaG9vQWdBaUFUWUNBQ0FHSUFGQkFuUnFJQUkyQWdBZ0NrRVlhaEJiSUJnZ0JDZ0NDQ0lHS0FJY0lBWW9BaGdpRVd0QkFuVklEUXdnQmlnQ0FDSUdJQlZxSUFvb0Fod2dDaWdDR0dzaUNrRUNkVUVCYXlJVk5nSUFJQW9FUUNBUklCVkJBblJxSUFJMkFnQUxJQWtnQ1VFQ2FpQU9HeUVDSUFZZ0NTQU9ha0VDZEdvQ2Z3SkFBa0FnQVVGL1J3UkFRWDlCQWlBQlFRTndHeUFCYWlJS1FYOUdEUUVnQmlBQ1FRSjBhaUFHSUFwQkFuUnFLQUlBSWdvMkFnQWdDa0YvUmcwQ0lCRWdDa0VDZEdvZ0FqWUNBQXdDQ3lBR0lBSkJBblJxUVg4MkFnQkJmd3dDQ3lBR0lBSkJBblJxUVg4MkFnQUxRWDhnQVVFQmFpSUNJQUZCQW1zZ0FrRURjQnNpQVVGL1JnMEFHaUFHSUFGQkFuUnFLQUlBQ3pZQ0FDQWFJQWsyQWdBTUFnc2dBU0FHUmcwTElBRkJCR3NpQXlnQ0FDRUpJQTBnQXpZQ1JBSkFJQTBvQWl3aUNrVU5BQ0FOS0FJb0FuOGdDa0gvLy8vL0Iyb2dCM0VnQ21sQkFVc2lEa1VOQUJvZ0J5QUhJQXBKRFFBYUlBY2dDbkFMSWhGQkFuUnFLQUlBSWdKRkRRQWdBaWdDQUNJQ1JRMEFBa0FnRGtVRVFDQUtRUUZySVFvRFFBSkFJQWNnQWlnQ0JDSU9Sd1JBSUFvZ0RuRWdFVVlOQVF3RkN5QUNLQUlJSUFkR0RRTUxJQUlvQWdBaUFnMEFDd3dDQ3dOQUFrQWdCeUFDS0FJRUlnNUhCRUFnQ2lBT1RRUi9JQTRnQ25BRklBNExJQkZHRFFFTUJBc2dBaWdDQ0NBSFJnMENDeUFDS0FJQUlnSU5BQXNNQVFzZ0F5QVdSd1JBSUFNZ0FpZ0NERFlDQUNBTklBRTJBa1FnQVNFRERBRUxJQllnQm1zaUFVRUNkU0lLUVFGcUlnTkJnSUNBZ0FSUERRVWdBeUFCUVFGMUlnOGdBeUFQU3h0Qi8vLy8vd01nQ2tILy8vLy9BVWtiSWdNRWZ5QURRWUNBZ0lBRVR3ME9JQU5CQW5RUTZnRUZRUUFMSWc4Z0NrRUNkR29pQ2lBQ0tBSU1OZ0lBSUE4Z0EwRUNkR29oRmlBS1FRUnFJUU1nQVVFQlRnUkFJQThnQmlBQkVQa0JHZ3NnRFNBV05nSklJQTBnQXpZQ1JDQU5JQTgyQWtBZ0JrVU5BQ0FHRU9zQkN5QURJQTlHRFFNZ0JDZ0NDQ0VLSUFOQkJHc2lGU2dDQUNJQlFYOUdJZ0pGQkVBZ0NpZ0NEQ0FCUVFKMGFpZ0NBRUYvUncwRUN5QUtLQUlNSVE0Z0NVRi9SaUlhUlFSQUlBNGdDVUVDZEdvb0FnQkJmMGNOQkFzZ0RpQUJRUUowYWlBSFFRTnNJaE5CQW1vaUVUWUNBQ0FPSUJGQkFuUWlCbW9nQVRZQ0FDQU9JQWxCQW5ScUlCTkJBV29pQlRZQ0FDQU9JQVZCQW5RaUhtb2dDVFlDQUNBQ0RRVkJmeUVGUVg4aEFpQUtLQUlBSWdjZ0UwRUNkR29DZjBGL1FRSWdBVUVEY0JzZ0FXb2lHMEYvUndSQUlBY2dHMEVDZEdvb0FnQWhBZ3NnQWdzMkFnQWdBVUVCYWlJYklBRkJBbXNnRzBFRGNCc2lBVUYvUmcwSElBY2dBVUVDZEdvb0FnQWhCUXdIQ3lBRUtBSUlJZ2xCR0dvUVd5QUVLQUlJSWdJb0FnQWdCMEVEYkNJRFFRSjBhaUFKS0FJY0lBa29BaGhySWdwQkFuVWlDVUVCYXlJUk5nSUFJQUpCR0dvUVd5QUNLQUlBSUFOQkFXb2lEa0VDZEdvZ0FpZ0NIQ0FDS0FJWWEwRUNkVUVCYXpZQ0FDQUVLQUlJSWdKQkdHb1FXeUFDS0FJQUlBTkJBbW9pRlVFQ2RHb2dBaWdDSENBQ0tBSVlhMEVDZFVFQmF6WUNBQ0FZSUFRb0FnZ2lBaWdDSENBQ0tBSVlJZ0pyUVFKMVNBMEtBa0FDUUNBS1JRUkFJQUlnQ1VFQ2RHb2dEallDQUNBQ1FRUnFJUUlNQVFzZ0FpQVJRUUowYWlBRE5nSUFJQXBCZkVZTkFDQUNJQWxCQW5ScUlBNDJBZ0FnQ1VFQmFpSUpRWDlHRFFFZ0FpQUpRUUowYWlFQ0N5QUNJQlUyQWdBTElBRWdGa2NFUUNBQklBTTJBZ0FnRFNBQlFRUnFJZ00yQWtRTUFnc2dGaUFHYXlJQlFRSjFJZ2xCQVdvaUQwR0FnSUNBQkU4TkJTQVBJQUZCQVhVaUFpQUNJQTlKRzBILy8vLy9BeUFKUWYvLy8vOEJTUnNpQWdSL0lBSkJnSUNBZ0FSUERRd2dBa0VDZEJEcUFRVkJBQXNpRHlBSlFRSjBhaUlKSUFNMkFnQWdEeUFDUVFKMGFpRVdJQWxCQkdvaEF5QUJRUUZPQkVBZ0R5QUdJQUVRK1FFYUN5QU5JQlkyQWtnZ0RTQUROZ0pFSUEwZ0R6WUNRQ0FHUlEwQUlBWVE2d0VMSUE4aEJnc2dHU0FEUVFScktBSUFFR01DUUNBRUtBSW9JZ0lnQkNnQ0pFWU5BQ0FIUVg5eklBQnFJUWNnQTBFRWF5RUpBMEFnQWtFSWF5Z0NBQ0lCSUFkTERRSWdBU0FIUncwQklBSkJCR3N0QUFBaENpQUNRUXhySWdFb0FnQWhBaUFFSUFFMkFpZ2dBa0VBU0EwQ0lBa29BZ0FoQVNBTklBSkJmM01nQUdvMkFoUWdEU0FOUVJScU5nSllJQTBnRFVFb2FpQU5RUlJxSUExQjJBQnFFRndnRFNnQ0FBSi9JQXBCQVhFRVFFRi9JQUZCZjBZTkFSb2dBVUVCYWlJQ0lBRkJBbXNnQWtFRGNCc01BUXRCZnlBQlFYOUdEUUFhSUFGQkFXc2dBVUVEY0EwQUdpQUJRUUpxQ3pZQ0RDQUVLQUlvSWdJZ0JDZ0NKRWNOQUFzTElBTWhBUXdGQ3lBVERRY01CZ3NRNXdFQUMwRi9JUUlnQ2lnQ0FDSUhJQk5CQW5ScVFYODJBZ0JCZnlFRkRBRUxFT2NCQUFzZ0J5QWVhaUFGTmdJQUFuOENRQUpBSUJwRkJFQkJmMEVDSUFsQkEzQWJJQWxxSWdGQmYwWU5BU0FHSUFkcUlBY2dBVUVDZEdvb0FnQWlBVFlDQUNBQlFYOUdEUUlnQ2lnQ0dDQUJRUUowYWlBUk5nSUFEQUlMSUFZZ0IycEJmellDQUVGL0lRWkJmd3dDQ3lBR0lBZHFRWDgyQWdBTFFYOGhCa0YvSUFsQkFXb2lBU0FKUVFKcklBRkJBM0FiSWdGQmYwWU5BQm9nQnlBQlFRSjBhaWdDQUNFR0lBRUxJUVVnQkNnQ2hBTWlBU0FDUVFKMElnbHFJaEVnRVNnQ0FDQUJJQVpCQW5RaUVXb29BZ0JxTmdJQUlBb29BaGdpQ2lBUmFpRUJJQUpCZjBjRVFDQUpJQXBxSUFFb0FnQTJBZ0FMQWtBZ0JVRi9SZzBBQTBBZ0J5QUZRUUowYWlBQ05nSUFJQVZCQVdvaUNTQUZRUUpySUFsQkEzQWJJZ1ZCZjBZTkFTQU9JQVZCQW5ScUtBSUFJZ1ZCZjBZTkFTQUZRUUZxSWdrZ0JVRUNheUFKUVFOd0d5SUZRWDlIRFFBTEN5QUJRWDgyQWdBQ1FDQWZEUUFnRnlBY1J3UkFJQmNnQmpZQ0FDQU5JQmRCQkdvaUZ6WUNIQXdCQ3lBY0lCQnJJZ0ZCQW5VaUIwRUJhaUlMUVlDQWdJQUVTUVJBSUFzZ0FVRUJkU0lGSUFVZ0Mwa2JRZi8vLy84RElBZEIvLy8vL3dGSkd5SUZCSDhnQlVHQWdJQ0FCRThOQnlBRlFRSjBFT29CQlVFQUN5SUxJQWRCQW5ScUlnY2dCallDQUNBTElBVkJBblJxSVJ3Z0IwRUVhaUVYSUFGQkFVNEVRQ0FMSUJBZ0FSRDVBUm9MSUEwZ0hEWUNJQ0FOSUJjMkFod2dEU0FMTmdJWUlCQUVRQ0FRRU9zQkN5QUxJUkFNQVFzUTV3RUFDeUFWSUJNMkFnQWdBeUVCSUE4aEJpQVpJQk1RWXdzZ0FDQVNTaUVUSUFBZ0VrY05BQXNnQUNFU0MwRi9JUVVnQkNnQ0NDSUhLQUljSUFjb0FoaHJRUUoxSUJoS0RRQWdBeUFQUndSQUlBUkJQR29oRmdOQUlBTkJCR3NpQXlnQ0FDRVFJQTBnQXpZQ1JBSkFBa0FDUUFKQUlBUXZBWTRDUVlFRVRRUkFJQVF0QU93Q1JRMENJQVFvQXVBQ0lBUW9BdWdDSWdCQkEzWnFJZ0VnQkNnQzVBSlBEUU1nQVMwQUFDRUJJQVFnQUVFQmFqWUM2QUlnQVNBQVFRZHhka0VCY1NFSERBRUxJQVF0QU1RQ0lRQUNRQ0FFS0FMQUFpSUhRZjhmU3cwQUlBUW9BcndDSWdGQkFVZ05BQ0FFSUFGQkFXc2lBVFlDdkFJZ0JDZ0N1QUlnQVdvdEFBQWdCMEVJZEhJaEJ3c2dCRUVBSUFCclFmOEJjU0lBSUFkQkNIWnNJZ0VnQjBIL0FYRWlCbW9nQnlBQUlBRnFheUFBSUFaTElnY2JOZ0xBQWdzZ0IwVU5BUXNnQkNnQ0NDSUpLQUlFSUFrb0FnQWlCMnRCQW5WQkEyNGdFa3dOQkVGL0lRRkJmeUVBQWtBZ0NTZ0NHQ0lLQW45QmZ5QVFRWDlHRFFBYVFYOGdFRUVCYWlJR0lCQkJBbXNnQmtFRGNCc2lCa0YvUmcwQUdpQUhJQVpCQW5ScUtBSUFDeUlUUVFKMGFpZ0NBQ0lHUVg5R0RRQWdCa0VCYWlJQ0lBWkJBbXNnQWtFRGNCc2lCa0YvUmcwQUlBWkJBV29pQVNBR1FRSnJJQUZCQTNBYklnRkJmMGNFUUNBSElBRkJBblJxS0FJQUlRQUxJQVloQVF0QmZ5RUdRWDhoQWdKL1FYOGdDaUFBUVFKMGFpZ0NBQ0lLUVg5R0RRQWFRWDhnQ2tFQmFpSU9JQXBCQW1zZ0RrRURjQnNpQ2tGL1JnMEFHaUFLUVFGcUlnNGdDa0VDYXlBT1FRTndHeUlPUVg5SEJFQWdCeUFPUVFKMGFpZ0NBQ0VDQ3lBS0N5RU9JQWtvQWd3aUNpQVNRUU5zSWdsQkFuUWlHR29nRURZQ0FDQUtJQkJCQW5ScUlBazJBZ0FnQ2lBSlFRRnFJaEJCQW5RaUdXb2dBVFlDQUNBS0lBRkJBblJxSUJBMkFnQWdDaUFKUVFKcUlnRkJBblFpSEdvZ0RqWUNBQ0FLSUE1QkFuUnFJQUUyQWdBZ0J5QVlhaUFBTmdJQUlBY2dHV29pQ2lBQ05nSUFJQWNnSEdvaURpQVROZ0lBSUFRb0FuZ2lCMEYvSUFBZ0NTQVFTeHNpQUVFRGRrSDgvLy8vQVhGcUlnSWdBaWdDQUVGK0lBQjNjVFlDQUNBUVFYOUhCRUFnQ2lnQ0FDRUdDeUFISUFaQkEzWkIvUC8vL3dGeGFpSUFJQUFvQWdCQmZpQUdkM0UyQWdCQmZ5RUNJQUZCZjBjRVFDQU9LQUlBSVFJTElBY2dBa0VEZGtIOC8vLy9BWEZxSWdBZ0FDZ0NBRUYrSUFKM2NUWUNBQ0FFS0FKQUlnSWdCQ2dDUkNJQVFRVjBSZ1JBSUFKQkFXcEJmMHdOQnlBV0lBSkIvdi8vL3dOTkJIOGdBa0VnYWtGZ2NTSUJJQUJCQm5RaUFDQUFJQUZKR3dWQi8vLy8vd2NMRUZvZ0JDZ0NRQ0VDQ3lBU1FRRnFJUklnQkNBQ1FRRnFOZ0pBSUFRb0Fqd2dBa0VEZGtIOC8vLy9BWEZxSWdBZ0FDZ0NBRUVCSUFKMGNqWUNBQ0FFS0FKTUlnQWdCQ2dDVUVjRVFDQUFJQWsyQWdBZ0JDQUFRUVJxTmdKTURBSUxJQUFnQkNnQ1NDSUFheUlCUVFKMUloQkJBV29pQmtHQWdJQ0FCRThOQnlBR0lBRkJBWFVpQnlBR0lBZExHMEgvLy8vL0F5QVFRZi8vLy84QlNSc2lCZ1IvSUFaQmdJQ0FnQVJQRFFZZ0JrRUNkQkRxQVFWQkFBc2lCeUFRUVFKMGFpSVFJQWsyQWdBZ0FVRUJUZ1JBSUFjZ0FDQUJFUGtCR2dzZ0JDQUhJQVpCQW5ScU5nSlFJQVFnRUVFRWFqWUNUQ0FFSUFjMkFrZ2dBRVVOQVNBQUVPc0JEQUVMSUFRb0FrQWlCeUFFS0FKRUlnQkJCWFJHQkVBZ0IwRUJha0YvVEEwR0lCWWdCMEgrLy8vL0EwMEVmeUFIUVNCcVFXQnhJZ0VnQUVFR2RDSUFJQUFnQVVrYkJVSC8vLy8vQndzUVdpQUVLQUpBSVFjTElBUWdCMEVCYWpZQ1FDQUVLQUk4SUFkQkEzWkIvUC8vL3dGeGFpSUFJQUFvQWdCQmZpQUhkM0UyQWdBZ0JDZ0NUQ0lBSUFRb0FsQkhCRUFnQUNBUU5nSUFJQVFnQUVFRWFqWUNUQXdCQ3lBQUlBUW9Ba2dpQUdzaUFVRUNkU0lDUVFGcUlnWkJnSUNBZ0FSUERRWWdCaUFCUVFGMUlnY2dCaUFIU3h0Qi8vLy8vd01nQWtILy8vLy9BVWtiSWdZRWZ5QUdRWUNBZ0lBRVR3MEZJQVpCQW5RUTZnRUZRUUFMSWdjZ0FrRUNkR29pQWlBUU5nSUFJQUZCQVU0RVFDQUhJQUFnQVJENUFSb0xJQVFnQnlBR1FRSjBhallDVUNBRUlBSkJCR28yQWt3Z0JDQUhOZ0pJSUFCRkRRQWdBQkRyQVFzZ0F5QVBSdzBBQ3lBRUtBSUlJUWNMSUJJZ0J5Z0NCQ0FIS0FJQWEwRUNkVUVEYmtjTkFDQUhLQUljSUFjb0FoZ2lBMnRCQW5VaEJTQUxJQmRHQkVBZ0Z5RUxEQUVMSUFzaEFBTkFJQUFvQWdBaEJpQURJQVZCQVdzaUFrRUNkR29pQVNnQ0FFRi9SZ1JBQTBBZ0JVRUNheUVDSUFWQkFXc2hCU0FESUFKQkFuUnFJZ0VvQWdCQmYwWU5BQXNMSUFJZ0JrOEVRQ0FOSUFjMkFnQWdBU2dDQUNFRElBMUJBVG9BRENBTklBTTJBZ2dnRFNBRE5nSUVJQU5CZjBjRVFBTkFJQWNvQWdBZ0EwRUNkR29nQmpZQ0FDQU5FRjBnQkNnQ0NDRUhJQTBvQWdnaUEwRi9SdzBBQ3dzZ0J5Z0NHQ0lESUFKQkFuUnFJUUVnQmtGL1J3UkFJQU1nQmtFQ2RHb2dBU2dDQURZQ0FBc2dBVUYvTmdJQVFRRWdCblFoQVNBRUtBSjRJaElnQmtFRGRrSDgvLy8vQVhGcUlnWUNmMEVCSUFKMEloQWdFaUFDUVFOMlFmei8vLzhCY1dvaUVpZ0NBSEVFUUNBR0tBSUFJQUZ5REFFTElBWW9BZ0FnQVVGL2MzRUxOZ0lBSUJJZ0VpZ0NBQ0FRUVg5emNUWUNBQ0FGUVFGcklRVUxJQUJCQkdvaUFDQVhSdzBBQ3dzZ0N3UkFJQTBnQ3pZQ0hDQUxFT3NCQ3lBTktBSXdJZ0FFUUFOQUlBQW9BZ0FoQVNBQUVPc0JJQUVpQUEwQUN3c2dEU2dDS0NFQUlBMUJBRFlDS0NBQUJFQWdBQkRyQVFzZ0R3UkFJQTBnRHpZQ1JDQVBFT3NCQ3lBTlFlQUFhaVFBSUFVTUF3c1ErQUVBQ3hEbkFRQUxFT2NCQUFzaUMwRi9SZzBCSUF3b0FnQWhBU0FNS1FNSUlTRWdEQ2tERUNFZ0lBUW9BZ1FpQXlnQ0lDSUFRZ0EzQXhBZ0FDQWhJQ0I5UXYvLy8vOFBnemNEQ0NBQUlBRWdJS2RxTmdJQUlBTXZBU1FpQVVFSWRDQUJRUWgyY2lJRFFmLy9BM0ZCZ1FSTkJFQWdBQ0FqTndNUUN3SkFJQVFvQXR3QklBUW9BdGdCUmcwQUlBUW9BZ2dpQVNnQ0FDRUFJQUVvQWdRaEFRSkFJQU5CLy84RGNVR0JCRThFUUNBQUlBRkdEUUpCQUNFQkRBRUxJQUFnQVVZTkFVRUFJUUVEUUNBRUlBRVFVQVJBSUFGQkEyb2lBU0FFS0FJSUlnQW9BZ1FnQUNnQ0FHdEJBblZKRFFFTUF3c0xEQU1MQTBBZ0JDQUJFRkVFUUNBQlFRTnFJZ0VnQkNnQ0NDSUFLQUlFSUFBb0FnQnJRUUoxU1EwQkRBSUxDd3dDQ3lBSUVGSWdCQ2dDMkFFaUFTQUVLQUxjQVVjRVFFRUFJUU1EUUNBQklBTkJrQUZzSWdCcVFRUnFJQVFvQWdnUVV5QWRLQUlBSWhRZ0FHb2lCU2dDaEFFaUFTQUZLQUtJQVNJRlJ3UkFBMEFnQUNBVWFrRUVhaUFCS0FJQUVGUWdIU2dDQUNFVUlBRkJCR29pQVNBRlJ3MEFDd3NnQUNBVWFrRUVhaEJWSUFOQkFXb2lBeUFFS0FMY0FTQUVLQUxZQVNJQmEwR1FBVzFKRFFBTEN5QUVRYmdCYWlBRUtBSUlJZ0FvQWh3Z0FDZ0NHR3RCQW5VUVZpQUVLQUxZQVNJVUlBUW9BdHdCUndSQVFRQWhBUU5BSUJRZ0FVR1FBV3hxSWdCQjZBQnFJQVFvQWdnaUF5Z0NIQ0FES0FJWWEwRUNkU0lESUFBb0Fqd2dBQ2dDT0d0QkFuVWlBQ0FBSUFOSUd4QldJQUZCQVdvaUFTQUVLQUxjQVNBRUtBTFlBU0lVYTBHUUFXMUpEUUFMQ3lBRUlBc1FWeUVVREFFTFFRQWhGQXNnREVGQWF5UUFJQlFMc0FZQkJYOUJmeUVDQW45QmZ5QUJRWDlHRFFBYUlBRkJBV29pQWlBQlFRSnJJQUpCQTNBYklRSWdBVUVCYXlBQlFRTndEUUFhSUFGQkFtb0xJUVlDUUFKQUFrQUNRQUpBQWtBZ0FDZ0N1QUVpQXc0SUFBQUZBZ1VCQlFNRkN5QUFLQUtVQVNFRlFYOGhCQ0FDUVg5SEJFQWdCU2dDQUNBQ1FRSjBhaWdDQUNFRUMwRUJJUU1nQUNnQ25BRWlBaUFFUVFKMGFpSUVJQVFvQWdCQkFXbzJBZ0FnQmtGL1JnUkFJQUpCQkdzaEFnd0VDeUFDSUFVb0FnQWdCa0VDZEdvb0FnQkJBblJxSVFJTUF3c2dBQ2dDbEFFaEJFRi9JUU1nQUNnQ25BRWlCU0FCUVg5SEJIOGdCQ2dDQUNBQlFRSjBhaWdDQUFWQmZ3dEJBblJxSWdNZ0F5Z0NBRUVCYWpZQ0FDQUNRWDlHQkg4Z0JVRUVhd1VnQlNBRUtBSUFJQUpCQW5ScUtBSUFRUUowYWdzaUFpQUNLQUlBUVFGcU5nSUFJQVpCZjBZRVFDQUZRUVJySVFKQkFpRUREQU1MUVFJaEF5QUZJQVFvQWdBZ0JrRUNkR29vQWdCQkFuUnFJUUlNQWdzZ0FDZ0NsQUVoQlVGL0lRUWdBQ2dDbkFFaUF5QUJRWDlIQkg4Z0JTZ0NBQ0FCUVFKMGFpZ0NBQVZCZnd0QkFuUnFJZ1FnQkNnQ0FFRUJhallDQUNBQ1FYOUdCSDhnQTBFRWF3VWdBeUFGS0FJQUlBSkJBblJxS0FJQVFRSjBhZ3NpQWlBQ0tBSUFRUUpxTmdJQUlBWkJmMFlFUUNBRFFRUnJJUUpCQVNFRERBSUxJQU1nQlNnQ0FDQUdRUUowYWlnQ0FFRUNkR29oQWtFQklRTU1BUXNnQUNnQ2xBRWhCRUYvSVFNZ0FDZ0NuQUVpQlNBQlFYOUhCSDhnQkNnQ0FDQUJRUUowYWlnQ0FBVkJmd3RCQW5ScUlnTWdBeWdDQUVFQ2FqWUNBRUVDSVFNZ0FrRi9SZ1IvSUFWQkJHc0ZJQVVnQkNnQ0FDQUNRUUowYWlnQ0FFRUNkR29MSWdJZ0FpZ0NBRUVDYWpZQ0FDQUdRWDlHQkVBZ0JVRUVheUVDREFFTElBVWdCQ2dDQUNBR1FRSjBhaWdDQUVFQ2RHb2hBZ3NnQWlBQ0tBSUFJQU5xTmdJQUlBQW9BcmdCSVFNTEFrQUNRQ0FERGdZQUFRRUJBUUFCQ3lBQUtBS2NBUUovUVg4Z0FVRi9SZzBBR2tGL0lBRkJBV29pQXlBQlFRSnJJQU5CQTNBYklnRkJmMFlOQUJvZ0FDZ0NsQUVvQWdBZ0FVRUNkR29vQWdBTFFRSjBhaWdDQUVFRlRBUkFJQUJCQlRZQ3ZBRVBDeUFBUVFBMkFyd0JEd3NnQUVGL05nSzhBUXZKVGdJZ2Z3VitJd0JCUUdvaUN5UUFJQUJCQURZQ2hBRWdBQ2dDbEFFRVFDQUFLQUtRQVNJQkJFQURRQ0FCS0FJQUlRUWdBUkQzQVNBRUlnRU5BQXNMUVFBaEFTQUFRUUEyQXBBQkFrQWdBQ2dDakFFaUJFVU5BQ0FFUVFOeElRSWdCRUVCYTBFRFR3UkFJQVJCZkhFaENBTkFJQUZCQW5RaUJDQUFLQUtJQVdwQkFEWUNBQ0FBS0FLSUFTQUVRUVJ5YWtFQU5nSUFJQUFvQW9nQklBUkJDSEpxUVFBMkFnQWdBQ2dDaUFFZ0JFRU1jbXBCQURZQ0FDQUJRUVJxSVFFZ0NFRUVheUlJRFFBTEN5QUNSUTBBQTBBZ0FDZ0NpQUVnQVVFQ2RHcEJBRFlDQUNBQlFRRnFJUUVnQWtFQmF5SUNEUUFMQ3lBQVFRQTJBcFFCQ3dKQUFrQUNRQUpBSUFBb0FnUWlBUzBBSkNJYVFRaDBJQUV0QUNWeUlnUkJnUVJMRFFBZ0FTZ0NJQ0VDSUFSQi93Tk5CRUFnQWlrREVDSWlRZ1I4SWlFZ0Fpa0RDRlVOQWlBQ0tBSUFJQ0tuYWlnQUFDRUVJQUlnSVRjREVDQUFJQVEyQW9RQkRBRUxRUUVnQ3lBQ0VCVkZEUUVnQUNnQ0JDSUJMUUFrSVJvZ0FDQUxLQUlBTmdLRUFRc2dBU2dDSUNFQ0FrQUNRQUpBSUJwQi93RnhRUUZOQkVCQkFDRWFJQUlwQXhBaUlrSUVmQ0loSUFJcEF3aFZEUVVnQ3lBQ0tBSUFJQ0tuYWlnQUFDSUVOZ0k4SUFJZ0lUY0RFQ0FBSUFRMkFwd0JJQUJCbkFGcUlRZ01BUXRCQUNFYVFRRWdDMEU4YWlBQ0VCVkZEUVFnQUNnQ0JDSUJMUUFrSVFRZ0FDQUxLQUk4TmdLY0FTQUFRWndCYWlFSUlBUkJBVXNOQVFzZ0FTZ0NJQ0lCS1FNSUlBRXBBeEFpSWtJRWZDSWhVdzBESUFzZ0FTZ0NBQ0FpcDJvb0FBQWlBallDT0NBQklDRTNBeEFNQVF0QkFTQUxRVGhxSUFFb0FpQVFGVVVOQWlBTEtBSTRJUUlMSUFKQjFhclZxZ1ZMRFFFZ0NDZ0NBQ0FDUVFOc1N3MEJJQUFvQWdRaUJDZ0NJQ0lKS1FNSUlpVWdDU2tERUNJaFZ3MEJJQWtvQWdBaUFTQWhwMm90QUFBaERpQUpJQ0ZDQVh3aUlqY0RFQUpBSUFRdEFDUkJBVTBFUUNBbElDRkNCWHdpSVZNTkF5QUxJQUVnSXFkcUtBQUFJZ2cyQWpRZ0NTQWhOd01RSUFJZ0NFOE5BUXdEQzBFQklBdEJOR29nQ1JBVlJRMENJQUlnQ3lnQ05DSUlTUTBDQ3lBQ0lBaEJBMjRnQ0dwTERRRWdBQ2dDQkNJQktBSWdJUWtDUUNBQkxRQWtRUUZOQkVBZ0NTa0RFQ0lpUWdSOElpRWdDU2tEQ0ZVTkF5QUxJQWtvQWdBZ0lxZHFLQUFBSWdRMkFqQWdDU0FoTndNUUlBUWdDRTBOQVF3REMwRUJJQXRCTUdvZ0NSQVZSUTBDSUFzb0FqQWlCQ0FJU3cwQ0N5QUFJQUFvQWhnMkFoeEIyQUFRNmdFaUNVSUFOd0lBSUFsQkFEWUNPQ0FKUWdBM0FqQWdDVUlBTndJb0lBbENBRGNDSUNBSlFnQTNBaGdnQ1VJQU53SVFJQWxDQURjQ0NDQUpRVUJyUWdBM0FnQWdDVUlBTndKSUlBbENBRGNDVUNBSklBazJBandnQUNnQ0NDRUJJQUFnQ1RZQ0NDQUJCRUFnQVJCSklBQW9BZ2hGRFFJTElBQWdBQ2dDb0FFMkFxUUJJQUJCb0FGcUlBSVFTaUFBSUFBb0Fxd0JOZ0t3QVNBQVFhd0JhaUFDRUVvZ0FFRkFhMEVBTmdJQUlBQkJmellDWENBQVFuODNBbFFnQUNBQUtBSWtOZ0lvSUFBZ0FDZ0NNRFlDTkNBQUlBQW9Ba2cyQWt3Z0FFSFlBV29pSGhCTElCNGdEaEJNSUFBb0FnZ2dBaUFBS0FLY0FTQUVhaEJOUlEwQklBQW9BcHdCSVFFZ0MwRUJPZ0FBSUFCQitBQnFJQUVnQkdvZ0N4QkdBa0FnQUNnQ0JDSUNMd0VrSWdGQkNIUWdBVUVJZG5KQi8vOERjU0lCUVlFRVRRUkFJQUlvQWlBaENRSkFJQUZCL3dOTkJFQWdDU2tERUNJaVFnUjhJaUVnQ1NrRENGVU5CU0FKS0FJQUlDS25haWdBQUNFQ0lBa2dJVGNERUF3QkMwRUJJQXRCTEdvZ0NSQVZSUTBFSUFzb0Fpd2hBZ3NnQWtVTkF5QUNyU0FBS0FJRUlna29BaUFpQVNrRENDQUJLUU1RZlZVTkF5QUxRZ0EzQXhBZ0MwSUFOd01ZSUF0Q0FEY0FIU0FMUVFBN0FTWWdDMEVBTmdJQUlBdENBRGNEQ0NBSktBSWdJZ0VwQXdnaElTQUJLQUlBSVFrZ0FTa0RFQ0VpSUFFdkFTWWhBU0FMUWdBM0F4QWdDeUFCT3dFbUlBc2dDU0FpcDJvZ0FtbzJBZ0FnQ3lBaElDSjlweUFDYTYwM0F3Z2dBQ0FMRUU0aUFVRi9SZzBESUFHc0lTVU1BUXRDZnlFbElBQWdBaWdDSUJCT1FYOUdEUUlMSUFCQjZBRnFJZ1VnQUJCUElBQWdBQ0FBS0FJQUtBSWtFUUFBTmdMOEFpQUFJQTQyQXZRQ0lBQWdCQ0FBS0FLY0FXbzJBb0FESUF0Q0FEY0RFQ0FMUWdBM0F4Z2dDMElBTndBZElBdEJBRHNCSmlBTFFRQTJBZ0FnQzBJQU53TUlRUUFoQWlNQVFSQnJJZ01rQUFKQUFrQWdCU2dDa0FFaUFTQUJLQUlBS0FJZ0VRQUFMd0VrSWdGQkNIUWdBVUVJZG5KQi8vOERjVUdCQkUwRVFDQUZJQVVwQXlBM0EwZ2dCU0FGS1FNQU53TW9JQVZCUUdzZ0JTa0RHRGNEQUNBRklBVXBBeEEzQXpnZ0JTQUZLUU1JTndNd0lBVkJLR29oQkFKQUlBVXZBVTVCZ1FSTkJFQWdCU2tETUNJaUlBVXBBemdpSVVJSWZDSWpVdzBESUFVb0FpZ2lBU0FocDJvcEFBQWhKQ0FGSUNNM0F6Z01BUXRCQVNBRFFRaHFJQVFRWVVVTkFpQUZLUU13SVNJZ0JTa0RPQ0VqSUFVb0FpZ2hBU0FES1FNSUlTUUxJQVZCQURZQ1NDQUZRUUU2QUV3Z0JVRkFheUFCSUNPbmFpSUJOZ0lBSUFVZ0FTQWlJQ045cDJvMkFrUWdCU0FFS1FNQU53TUFJQVVnQkNrRENDSWhOd01JSUFVZ0JDa0RFQ0lpTndNUUlBVWdCQ2tER0RjREdDQUZJQVFwQXlBM0F5QWdKQ0FoSUNKOVZnMEJJQVVnSWlBa2ZEY0RFQXNDUUNBRkx3RW1RWUVFVFFSQUlBVWdCU2tEQURjRFlDQUZJQVVwQXlBM0E0QUJJQVVnQlNrREdEY0RlQ0FGSUFVcEF4QTNBM0FnQlNBRktRTUlOd05vSUFWQjRBQnFJUVFDUUNBRkx3R0dBVUdCQkUwRVFDQUZLUU5vSWlJZ0JTa0RjQ0loUWdoOElpTlREUVFnQlNnQ1lDSUJJQ0duYWlrQUFDRWtJQVVnSXpjRGNBd0JDMEVCSUFOQkNHb2dCQkJoUlEwRElBVXBBMmdoSWlBRktRTndJU01nQlNnQ1lDRUJJQU1wQXdnaEpBc2dCVUVBTmdLQUFTQUZRUUU2QUlRQklBVWdBU0FqcDJvaUFUWUNlQ0FGSUFFZ0lpQWpmYWRxTmdKOElBVWdCQ2tEQURjREFDQUZJQVFwQXdnaUlUY0RDQ0FGSUFRcEF4QWlJamNERUNBRklBUXBBeGczQXhnZ0JTQUVLUU1nTndNZ0lDUWdJU0FpZlZZTkFpQUZJQ0lnSkh3M0F4QU1BUXNnQlVIUUFHb2dCUkFZUlEwQ0N3SkFJQVVvQW93QklnWkJBVWdOQUVGL0lBWkJCSFFpRGtFRWNpQUdRZi8vLy84QWNTQUdSeHNRNmdFaUFTQUdOZ0lBSUFGQkJHb2lCQ0VDSUE1QkVHc2lDVUVFZGtFQmFrRUhjU0lCQkVBZ0JDRUNBMEFnQWtJQU53SUFJQUpDQURjQUJTQUNRUkJxSVFJZ0FVRUJheUlCRFFBTEN5QUpRZkFBVHdSQUlBUWdEbW9oQVFOQUlBSkNBRGNDQUNBQ1FnQTNBaEFnQWtJQU53SWdJQUpDQURjQ01DQUNRZ0EzQWtBZ0FrSUFOd0pRSUFKQ0FEY0NZQ0FDUWdBM0FuQWdBa0lBTndBRklBSkNBRGNBRlNBQ1FnQTNBQ1VnQWtJQU53QTFJQUpDQURjQVJTQUNRZ0EzQUZVZ0FrSUFOd0JsSUFKQ0FEY0FkU0FDUVlBQmFpSUNJQUZIRFFBTEN5QUZLQUtJQVNFQklBVWdCRFlDaUFGQkFDRUNJQUVFZnlBQlFRUnJFS0FCSUFVb0Fvd0JCU0FHQzBFQVRBMEFBMEFnQlNnQ2lBRWdBa0VFZEdvZ0JSQVlSUTBDSUFKQkFXb2lBaUFGS0FLTUFVZ05BQXNMSUFzZ0JTa0RBRGNEQUNBTElBVXBBeUEzQXlBZ0N5QUZLUU1ZTndNWUlBc2dCU2tERURjREVDQUxJQVVwQXdnM0F3Z0NRQ0FGS0FLUUFTSUJJQUVvQWdBb0FpQVJBQUF2QVNRaUFVRUlkQ0FCUVFoMmNrSC8vd054UVlFRVRRUkFBa0FnQlNnQ2tBRWlBU0FCS0FJQUtBSWdFUUFBTFFBa1FRRk5CRUFnQ3lrREVDSWlRZ1I4SWlFZ0N5a0RDRlVOQkNBTEtBSUFJQ0tuYWlnQUFDRUNJQXNnSVRjREVBd0JDMEVCSUFOQkNHb2dDeEFWUlEwRElBTW9BZ2doQWdzZ0FpQUZLQUtZQVNJQlR3MENJQXNwQXhBaUlTQUxLUU1JV1EwQ0lBc29BZ0FnSWFkcUxRQUFJUVFnQ3lBaFFnRjhOd01RSUFRTkFpQUZRb0tBZ0lEd0FEY0RzQUVNQVFzZ0JVS0NnSUNBOEFBM0E3QUJJQVVvQXBnQklRRUxRUUFoQWlBQlFRQklEUUVnQTBFQU5nSUlJQVZCdUFGcUlRa0NRQUovSUFVb0FxQUJJQVVvQXB3QklnUnJRUUoxSWdJZ0FVa0VRQ0FGUVp3QmFpQUJJQUpySUFOQkNHb1FGaUFGS0FLMEFTQUZLQUt3QVdzTUFRc2dBU0FDU1FSQUlBVWdCQ0FCUVFKMGFqWUNvQUVMUVFVTFFRRnFJZzRnQlNnQ3ZBRWlBU0FGS0FLNEFTSUVhMEVNYlNJQ1N3UkFBa0FnRGlBQ2F5SVlJQWtvQWdnaUFTQUpLQUlFSWdwclFReHRUUVJBSUFrZ0dBUi9JQXBCQUNBWVFReHNRUXhyUVF4dVFReHNRUXhxSWdFUStnRWdBV29GSUFvTE5nSUVEQUVMQWtBQ1FBSkFJQW9nQ1NnQ0FDSUdhMEVNYlNJQ0lCaHFJZzVCMXFyVnFnRkpCRUFDZnlBT0lBRWdCbXRCREcwaUJFRUJkQ0lCSUFFZ0Rra2JRZFdxMWFvQklBUkJxdFdxMVFCSkd5SU9CRUFnRGtIV3F0V3FBVThOQXlBT1FReHNFT29CSVFjTElBY2dBa0VNYkdvaURBdEJBQ0FZUVF4c1FReHJRUXh1UVF4c1FReHFJZ1FRK2dFaUFTQUVhaUVDSUFjZ0RrRU1iR29oQkNBR0lBcEdEUUlEUUNBTVFReHJJZ3hCQURZQ0NDQU1RZ0EzQWdBZ0RDQUtRUXhySWdvb0FnQTJBZ0FnRENBS0tBSUVOZ0lFSUF3Z0NpZ0NDRFlDQ0NBS1FRQTJBZ2dnQ2tJQU53SUFJQVlnQ2tjTkFBc2dDU0FFTmdJSUlBa29BZ1FoQkNBSklBSTJBZ1FnQ1NnQ0FDRUtJQWtnRERZQ0FDQUVJQXBHRFFNRFFDQUVRUXhySWdFb0FnQWlBZ1JBSUFSQkNHc2dBallDQUNBQ0VQY0JDeUFCSWdRZ0NrY05BQXNNQXdzTUNnc1ErQUVBQ3lBSklBUTJBZ2dnQ1NBQ05nSUVJQWtnQVRZQ0FBc2dDZ1JBSUFvUTl3RUxDeUFGS0FLOEFTRUVEQUVMSUFJZ0RrMEVRQ0FCSVFRTUFRc2dCQ0FPUVF4c2FpSUVJQUZIQkVBRFFDQUJRUXhySWdJb0FnQWlEZ1JBSUFGQkNHc2dEallDQUNBT0VPc0JDeUFDSWdFZ0JFY05BQXNMSUFVZ0JEWUN2QUVMSUFWQnhBRnFJUWNDUUNBRUlBVW9BcmdCSWdKclFReHRJZ1lnQlNnQ3lBRWdCU2dDeEFFaUFXdEJBblVpRGtzRVFDQUhJQVlnRG1zUUNpQUZLQUs0QVNFQ0lBVW9BcndCSVFRTUFRc2dCaUFPVHcwQUlBVWdBU0FHUVFKMGFqWUN5QUVMSUFJZ0JFWUVRRUVCSVFJTUFndEJBQ0VCQTBCQkFTQURRUWhxSUFzUUZVVU5BU0FES0FJSUlnd2dCU2dDbEFFaUJDZ0NCQ0FFS0FJQWEwRUNkVUVEYmtzTkFTQU1CRUFDUUNBSktBSUFJZ1FnQVVFTWJDSU9haUlZS0FJRUlCZ29BZ0FpQW10QkFuVWlCaUFNU1FSQUlCZ2dEQ0FHYXhBS0lBa29BZ0FoQkF3QkN5QUdJQXhORFFBZ0dDQUNJQXhCQW5ScU5nSUVDd0pBSUFzcEF4QWlJU0FMS1FNSVdRMEFJQVFnRG1vb0FnQWhBaUFMS0FJQUlDR25haTBBQUNFRUlBc2dJVUlCZkRjREVBSkFBa0FnQkE0Q0FBRUNDeUFNUVFFZ0N5QUNFREFhREFFTElBd2dDeUFDRURFYUN5QUhLQUlBSUFGQkFuUnFJQXcyQWdBTFFRRWhBaUFCUVFGcUlnRWdCU2dDdkFFZ0JTZ0N1QUZyUVF4dFNRMEFDd3dCQzBFQUlRSUxJQU5CRUdva0FDQUNSUTBCQW45QkFDRUJRUUFoQWtFQUlRWkJBQ0VKUVFBaERrRUFJUVJCQUNFWUl3QkI0QUJySWcwa0FDQU5RUUEyQWtnZ0RVSUFOd05BSUExQ0FEY0RNQ0FOUWdBM0F5Z2dEVUdBZ0lEOEF6WUNPQ0FOUVFBMkFpQWdEVUlBTndNWVFRRWhGU0FBSWdNb0Fud2hId0pBQWtBQ1FBSkFJQWdpQUVFQlNBMEFJQU5CNkFGcUlTQWdBeWdDMkFFZ0F5Z0MzQUZISVIwRFFDQUpJZ3hCQVdvaENRSkFBa0FDUUNBREtBS1VBeUlIUVg5SEJFQkJmeUVJSUFNb0Fxd0RJQWRCQW5ScUlnY2dCeWdDQUNJS1FRRnJJZ2MyQWdBZ0NrRUJTQTBHSUFNZ0F5Z0NvQU1nQXlnQ2xBTkJER3hxS0FJQUlBZEJBblJxS0FJQUlnaEJBblJCOEJOcUtBSUFJZzgyQXBBRElBaEZEUUVNQWd0QkJ5RVBBa0FnQXlnQytBSWlDQ0FJS0FJQUtBSWdFUUFBTHdFa0lnaEJDSFFnQ0VFSWRuSkIvLzhEY1VHQkJFMEVRQ0FETFFDMEFrVUVRRUVCSVE4Z0EwRUJOZ0tRQXd3RUN5QURLQUtvQWlJU0lBTW9BckFDSWhCQkEzWnFJZ2dnQXlnQ3JBSWlFVThOQVNBSUxRQUFJUWdnQXlBUVFRRnFJZ2MyQXJBQ0lBZ2dFRUVIY1haQkFYRkZEUUZCQUNFUEFrQWdFU0FTSUFkQkEzWWlGR29pQ0UwRVFDQUhJUWdNQVFzZ0NDMEFBQ0VLSUFNZ0VFRUNhaUlJTmdLd0FpQUlRUU4ySVJRZ0NpQUhRUWR4ZGtFQmNTRVBDeUFSSUJJZ0ZHb2lCMHNFZnlBSExRQUFJUWNnQXlBSVFRRnFOZ0t3QWlBSElBaEJCM0YyUVFGMFFRSnhJQTl5QlNBUEMwRUJkRUVCY2lFUEN5QURJQTgyQXBBRERBSUxJQU5CQURZQ2tBTUxJQUVnQmtZRVFFRi9JUWdNQlF0QmZ5RUhJQU1vQWdnaUZpZ0NHQ0lSQW45QmZ5QUJRUVJySWhRb0FnQWlHVUYvUmcwQUdrRi9JQmxCQVdvaUNDQVpRUUpySUFoQkEzQWJJZ2hCZjBZTkFCb2dGaWdDQUNBSVFRSjBhaWdDQUFzaUYwRUNkR29vQWdBaUNrRi9Sd1JBSUFwQkFXb2lDQ0FLUVFKcklBaEJBM0FiSVFjTElCWW9BZ3dpRlNBWlFRSjBhaUFNUVFOc0loQkJBV29pQ0RZQ0FDQVZJQWhCQW5RaUNtb2dHVFlDQUNBVklBZEJBblJxSUJCQkFtb2lFallDQUNBVklCSkJBblFpREdvZ0J6WUNBRUYvSVE4Q2YwRi9JQmxCZjBZTkFCcEJmMEYvUVFJZ0dVRURjQnNnR1dvaUNFRi9SZzBBR2lBV0tBSUFJQWhCQW5ScUtBSUFDeUVWQWtBZ0IwRi9SZzBBSUFkQkFXb2lDQ0FIUVFKcklBaEJBM0FiSWdoQmYwWU5BQ0FXS0FJQUlBaEJBblJxS0FJQUlROExRWDhoQ0NBVklCZEdEUVFnRHlBWFJnMEVJQllvQWdBaUNDQVFRUUowYWlBWE5nSUFJQWdnQ21vZ0R6WUNBQ0FJSUF4cUlCVTJBZ0FnRlVGL1J3UkFJQkVnRlVFQ2RHb2dFallDQUFzZ0F5Z0NlQ0FYUVFOMlFmei8vLzhCY1dvaUNDQUlLQUlBUVg0Z0YzZHhOZ0lBSUJRZ0VEWUNBQ0FnSUJBUVpRd0JDMEYvSVFnQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUE5QkFXc09Cd0VMQUFzQUN3SUxDeUFCSUE1R0RRb2dBeWdDQ0NJU0tBSU1JZ29nREVFRGJDSVFRUUpCQVNBUFFRVkdJaEViYWlJVVFRSjBJZ1pxSUFGQkJHc2lCeWdDQUNJV05nSUFJQW9nRmtFQ2RHb2dGRFlDQUNBU1FSaHFFRnNnSHlBREtBSUlJZ0VvQWh3Z0FTZ0NHQ0lLYTBFQ2RVZ05DaUFCS0FJQUloY2dCbW9nRWlnQ0hDQVNLQUlZYXlJR1FRSjFRUUZySWdFMkFnQWdCZ1JBSUFvZ0FVRUNkR29nRkRZQ0FBc2dFQ0FRUVFKcUlCRWJJUVlnRnlBUUlCRnFRUUowYWdKL0FrQUNRQ0FXUVg5SEJFQkJmMEVDSUJaQkEzQWJJQlpxSWdGQmYwWU5BU0FYSUFaQkFuUnFJQmNnQVVFQ2RHb29BZ0FpQVRZQ0FDQUJRWDlHRFFJZ0NpQUJRUUowYWlBR05nSUFEQUlMSUJjZ0JrRUNkR3BCZnpZQ0FFRi9EQUlMSUJjZ0JrRUNkR3BCZnpZQ0FBdEJmeUFXUVFGcUlnRWdGa0VDYXlBQlFRTndHeUlCUVg5R0RRQWFJQmNnQVVFQ2RHb29BZ0FMTmdJQUlBY2dFRFlDQUF3Q0N5QUJJQVpHRFFrZ0FVRUVheUlDS0FJQUlSa2dEU0FDTmdKRUFrQWdEU2dDTENJUlJRMEFJQTBvQWlnQ2Z5QVJRZi8vLy84SGFpQU1jU0FSYVVFQlN5SUtSUTBBR2lBTUlBd2dFVWtOQUJvZ0RDQVJjQXNpRkVFQ2RHb29BZ0FpQjBVTkFDQUhLQUlBSWc5RkRRQUNRQ0FLUlFSQUlCRkJBV3NoQ2dOQUFrQWdEQ0FQS0FJRUlnZEhCRUFnQnlBS2NTQVVSZzBCREFVTElBOG9BZ2dnREVZTkF3c2dEeWdDQUNJUERRQUxEQUlMQTBBQ1FDQU1JQThvQWdRaUIwY0VRQ0FISUJGUEJIOGdCeUFSY0FVZ0J3c2dGRVlOQVF3RUN5QVBLQUlJSUF4R0RRSUxJQThvQWdBaUR3MEFDd3dCQ3lBQ0lCeEhCRUFnQWlBUEtBSU1OZ0lBSUEwZ0FUWUNSQ0FCSVFJTUFRc2dIQ0FHYXlJS1FRSjFJZ2RCQVdvaUFrR0FnSUNBQkU4TkVDQUNJQXBCQVhVaUFTQUJJQUpKRzBILy8vLy9BeUFIUWYvLy8vOEJTUnNpQWdSL0lBSkJnSUNBZ0FSUERRd2dBa0VDZEJEcUFRVkJBQXNpRGlBSFFRSjBhaUlCSUE4b0FndzJBZ0FnRGlBQ1FRSjBhaUVjSUFGQkJHb2hBaUFLUVFGT0JFQWdEaUFHSUFvUStRRWFDeUFOSUJ3MkFrZ2dEU0FDTmdKRUlBMGdEallDUUNBR1JRMEFJQVlRNndFTElBSWdEa1lOQXlBREtBSUlJUmNnQWtFRWF5SVJLQUlBSWhaQmYwWWlCa1VFUUNBWEtBSU1JQlpCQW5ScUtBSUFRWDlIRFFRTElCY29BZ3doRUNBWlFYOUdJZ3BGQkVBZ0VDQVpRUUowYWlnQ0FFRi9SdzBFQ3lBUUlCWkJBblJxSUF4QkEyd2lGVUVDYWlJVU5nSUFJQkFnRkVFQ2RDSVNhaUFXTmdJQUlCQWdHVUVDZEdvZ0ZVRUJhaUlCTmdJQUlCQWdBVUVDZENJTWFpQVpOZ0lBSUFZTkJFRi9JUWNnRnlnQ0FDSUdJQlZCQW5ScUFuOUJmMEVDSUJaQkEzQWJJQlpxSWdGQmYwY0VRQ0FHSUFGQkFuUnFLQUlBSVFjTElBY0xOZ0lBSUJaQkFXb2lBU0FXUVFKcklBRkJBM0FiSWdGQmYwWU5CU0FHSUFGQkFuUnFLQUlBSVFnTUJRc2dBeWdDQ0NJQ1FSaHFFRnNnQXlnQ0NDSUtLQUlBSUF4QkEyd2lFRUVDZEdvZ0FpZ0NIQ0FDS0FJWWF5SVJRUUoxSWhKQkFXc2lCellDQUNBS1FSaHFFRnNnQ2lnQ0FDQVFRUUZxSWhSQkFuUnFJQW9vQWh3Z0NpZ0NHR3RCQW5WQkFXczJBZ0FnQXlnQ0NDSUNRUmhxRUZzZ0FpZ0NBQ0FRUVFKcUlncEJBblJxSUFJb0Fod2dBaWdDR0d0QkFuVkJBV3MyQWdBZ0h5QURLQUlJSWdJb0Fod2dBaWdDR0NJQ2EwRUNkVWdOQ0FKQUFrQWdFVVVFUUNBQ0lCSkJBblJxSUJRMkFnQWdBa0VFYWlFQ0RBRUxJQUlnQjBFQ2RHb2dFRFlDQUNBUlFYeEdEUUFnQWlBU1FRSjBhaUFVTmdJQUlCSkJBV29pQjBGL1JnMEJJQUlnQjBFQ2RHb2hBZ3NnQWlBS05nSUFDeUFCSUJ4SEJFQWdBU0FRTmdJQUlBMGdBVUVFYWlJQ05nSkVEQUlMSUJ3Z0Jtc2lDa0VDZFNJSFFRRnFJZ0pCZ0lDQWdBUlBEUTRnQWlBS1FRRjFJZ0VnQVNBQ1NSdEIvLy8vL3dNZ0IwSC8vLy8vQVVrYklnSUVmeUFDUVlDQWdJQUVUdzBLSUFKQkFuUVE2Z0VGUVFBTElnNGdCMEVDZEdvaUFTQVFOZ0lBSUE0Z0FrRUNkR29oSENBQlFRUnFJUUlnQ2tFQlRnUkFJQTRnQmlBS0VQa0JHZ3NnRFNBY05nSklJQTBnQWpZQ1JDQU5JQTQyQWtBZ0JrVU5BQ0FHRU9zQkN5QU9JUVlMSUNBZ0FrRUVheWdDQUJCbEFrQWdBeWdDS0NJQklBTW9BaVJHRFFBZ0RFRi9jeUFBYWlFVUlBSkJCR3NoREFOQUlBRkJDR3NvQWdBaUJ5QVVTdzBDSUFjZ0ZFY05BU0FCUVFSckxRQUFJUWNnQVVFTWF5SUJLQUlBSVFvZ0F5QUJOZ0lvSUFwQkFFZ05BaUFNS0FJQUlSRWdEU0FLUVg5eklBQnFOZ0lVSUEwZ0RVRVVhallDV0NBTklBMUJLR29nRFVFVWFpQU5RZGdBYWhCY0lBMG9BZ0FDZnlBSFFRRnhCRUJCZnlBUlFYOUdEUUVhSUJGQkFXb2lBU0FSUVFKcklBRkJBM0FiREFFTFFYOGdFVUYvUmcwQUdpQVJRUUZySUJGQkEzQU5BQm9nRVVFQ2FnczJBZ3dnQXlnQ0tDSUJJQU1vQWlSSERRQUxDeUFDSVFFTUF3c2dGUTBGREFRTFFYOGhCeUFYS0FJQUlnWWdGVUVDZEdwQmZ6WUNBQXdBQ3lBR0lBeHFJQWcyQWdBQ2Z3SkFBa0FnQ2tVRVFFRi9RUUlnR1VFRGNCc2dHV29pQVVGL1JnMEJJQVlnRW1vZ0JpQUJRUUowYWlnQ0FDSUJOZ0lBSUFGQmYwWU5BaUFYS0FJWUlBRkJBblJxSUJRMkFnQU1BZ3NnQmlBU2FrRi9OZ0lBUVg4aEQwRi9EQUlMSUFZZ0VtcEJmellDQUF0QmZ5RVBRWDhnR1VFQmFpSUJJQmxCQW1zZ0FVRURjQnNpQVVGL1JnMEFHaUFHSUFGQkFuUnFLQUlBSVE4Z0FRc2hDQ0FES0FLRUF5SVVJQWRCQW5RaUNtb2lBU0FCS0FJQUlCUWdEMEVDZENJTWFpZ0NBR28yQWdBZ0RDQVhLQUlZSWdGcUlRd2dCMEYvUndSQUlBRWdDbW9nRENnQ0FEWUNBQXNDUUNBSVFYOUdEUUFEUUNBR0lBaEJBblJxSUFjMkFnQWdDRUVCYWlJQklBaEJBbXNnQVVFRGNCc2lBVUYvUmcwQklCQWdBVUVDZEdvb0FnQWlDRUYvUmcwQklBaEJBV29pQVNBSVFRSnJJQUZCQTNBYklnaEJmMGNOQUFzTElBeEJmellDQUFKQUlCME5BQ0FZSUJ0SEJFQWdHQ0FQTmdJQUlBMGdHRUVFYWlJWU5nSWNEQUVMSUJzZ0Uyc2lCMEVDZFNJSVFRRnFJZ1JCZ0lDQWdBUkpCRUFnQkNBSFFRRjFJZ0VnQVNBRVNSdEIvLy8vL3dNZ0NFSC8vLy8vQVVrYklnWUVmeUFHUVlDQWdJQUVUdzBISUFaQkFuUVE2Z0VGUVFBTElnUWdDRUVDZEdvaUFTQVBOZ0lBSUFRZ0JrRUNkR29oR3lBQlFRUnFJUmdnQjBFQlRnUkFJQVFnRXlBSEVQa0JHZ3NnRFNBYk5nSWdJQTBnR0RZQ0hDQU5JQVEyQWhnZ0V3UkFJQk1RNndFTElBUWhFd3dCQ3d3S0N5QVJJQlUyQWdBZ0FpRUJJQTRoQmlBZ0lCVVFaUXNnQUNBSlNpRVZJQUFnQ1VjTkFBc2dBQ0VKQzBGL0lRZ2dBeWdDQ0NJR0tBSWNJQVlvQWhoclFRSjFJQjlLRFFBZ0FpQU9Sd1JBSUFOQlBHb2hIUU5BSUFKQkJHc2lBaWdDQUNFU0lBMGdBallDUkFKQUFrQUNRQUpBSUFNdkFZNENRWUVFVFFSQUlBTXRBT3dDUlEwQ0lBTW9BdUFDSUFNb0F1Z0NJZ0ZCQTNacUlnQWdBeWdDNUFKUERRTWdBQzBBQUNFQUlBTWdBVUVCYWpZQzZBSWdBQ0FCUVFkeGRrRUJjU0VHREFFTElBTXRBTVFDSVFFQ1FDQURLQUxBQWlJR1FmOGZTdzBBSUFNb0Fyd0NJZ0JCQVVnTkFDQURJQUJCQVdzaUFEWUN2QUlnQXlnQ3VBSWdBR290QUFBZ0JrRUlkSEloQmdzZ0EwRUFJQUZyUWY4QmNTSUhJQVpCQ0hac0lnRWdCa0gvQVhFaUFHb2dCaUFCSUFkcWF5QUFJQWRKSWdZYk5nTEFBZ3NnQmtVTkFRc2dBeWdDQ0NJS0tBSUVJQW9vQWdBaUVHdEJBblZCQTI0Z0NVd05CRUYvSVFGQmZ5RUhBa0FnQ2lnQ0dDSUdBbjlCZnlBU1FYOUdEUUFhUVg4Z0VrRUJhaUlBSUJKQkFtc2dBRUVEY0JzaUFFRi9SZzBBR2lBUUlBQkJBblJxS0FJQUN5SU1RUUowYWlnQ0FDSVRRWDlHRFFBZ0UwRUJhaUlBSUJOQkFtc2dBRUVEY0JzaUFFRi9SZzBBSUFCQkFXb2lBU0FBUVFKcklBRkJBM0FiSWdGQmYwY0VRQ0FRSUFGQkFuUnFLQUlBSVFjTElBQWhBUXRCZnlFUFFYOGhFUUovUVg4Z0JpQUhRUUowYWlnQ0FDSUdRWDlHRFFBYVFYOGdCa0VCYWlJQUlBWkJBbXNnQUVFRGNCc2lCa0YvUmcwQUdpQUdRUUZxSWdBZ0JrRUNheUFBUVFOd0d5SUFRWDlIQkVBZ0VDQUFRUUowYWlnQ0FDRVJDeUFHQ3lFVUlBb29BZ3dpRlNBSlFRTnNJaHRCQW5RaUUyb2dFallDQUNBVklCSkJBblJxSUJzMkFnQWdGU0FiUVFGcUloSkJBblFpQm1vZ0FUWUNBQ0FWSUFGQkFuUnFJQkkyQWdBZ0ZTQWJRUUpxSWdwQkFuUWlBR29nRkRZQ0FDQVZJQlJCQW5ScUlBbzJBZ0FnRUNBVGFpQUhOZ0lBSUFZZ0VHb2lFeUFSTmdJQUlBQWdFR29pQmlBTU5nSUFJQU1vQW5naURFRi9JQWNnRWlBYlNSc2lBVUVEZGtIOC8vLy9BWEZxSWdBZ0FDZ0NBRUYrSUFGM2NUWUNBQ0FTUVg5SEJFQWdFeWdDQUNFUEN5QU1JQTlCQTNaQi9QLy8vd0Z4YWlJQUlBQW9BZ0JCZmlBUGQzRTJBZ0JCZnlFQklBcEJmMGNFUUNBR0tBSUFJUUVMSUF3Z0FVRURka0g4Ly8vL0FYRnFJZ0FnQUNnQ0FFRitJQUYzY1RZQ0FDQURLQUpBSWdFZ0F5Z0NSQ0lBUVFWMFJnUkFJQUZCQVdwQmYwd05DeUFkSUFGQi92Ly8vd05OQkg4Z0FVRWdha0ZnY1NJQklBQkJCblFpQUNBQUlBRkpHd1ZCLy8vLy93Y0xFRm9nQXlnQ1FDRUJDeUFKUVFGcUlRa2dBeUFCUVFGcU5nSkFJQU1vQWp3Z0FVRURka0g4Ly8vL0FYRnFJZ0FnQUNnQ0FFRUJJQUYwY2pZQ0FDQURLQUpNSWdBZ0F5Z0NVRWNFUUNBQUlCczJBZ0FnQXlBQVFRUnFOZ0pNREFJTElBQWdBeWdDU0NJTWF5SVRRUUoxSWdaQkFXb2lBVUdBZ0lDQUJFOE5CaUFCSUJOQkFYVWlBQ0FBSUFGSkcwSC8vLy8vQXlBR1FmLy8vLzhCU1JzaUJ3Ui9JQWRCZ0lDQWdBUlBEUVlnQjBFQ2RCRHFBUVZCQUFzaUFTQUdRUUowYWlJQUlCczJBZ0FnRTBFQlRnUkFJQUVnRENBVEVQa0JHZ3NnQXlBQklBZEJBblJxTmdKUUlBTWdBRUVFYWpZQ1RDQURJQUUyQWtnZ0RFVU5BU0FNRU9zQkRBRUxJQU1vQWtBaUJpQURLQUpFSWdCQkJYUkdCRUFnQmtFQmFrRi9UQTBLSUIwZ0JrSCsvLy8vQTAwRWZ5QUdRU0JxUVdCeElnRWdBRUVHZENJQUlBQWdBVWtiQlVILy8vLy9Cd3NRV2lBREtBSkFJUVlMSUFNZ0JrRUJhallDUUNBREtBSThJQVpCQTNaQi9QLy8vd0Z4YWlJQUlBQW9BZ0JCZmlBR2QzRTJBZ0FnQXlnQ1RDSUFJQU1vQWxCSEJFQWdBQ0FTTmdJQUlBTWdBRUVFYWpZQ1RBd0JDeUFBSUFNb0FrZ2lER3NpRTBFQ2RTSUdRUUZxSWdGQmdJQ0FnQVJQRFFVZ0FTQVRRUUYxSWdBZ0FDQUJTUnRCLy8vLy93TWdCa0gvLy8vL0FVa2JJZ2NFZnlBSFFZQ0FnSUFFVHcwRklBZEJBblFRNmdFRlFRQUxJZ0VnQmtFQ2RHb2lBQ0FTTmdJQUlCTkJBVTRFUUNBQklBd2dFeEQ1QVJvTElBTWdBU0FIUVFKMGFqWUNVQ0FESUFCQkJHbzJBa3dnQXlBQk5nSklJQXhGRFFBZ0RCRHJBUXNnQWlBT1J3MEFDeUFES0FJSUlRWUxJQWtnQmlnQ0JDQUdLQUlBYTBFQ2RVRURia2NOQUNBR0tBSWNJQVlvQWhnaUFtdEJBblVoQ0NBRUlCaEdCRUFnR0NFRURBRUxJQVFoQndOQUlBY29BZ0FoRXlBQ0lBaEJBV3NpQVVFQ2RHb2lEeWdDQUVGL1JnUkFBMEFnQ0VFQ2F5RUJJQWhCQVdzaENDQUNJQUZCQW5ScUlnOG9BZ0JCZjBZTkFBc0xJQUVnRTA4RVFDQU5JQVkyQWdBZ0R5Z0NBQ0VDSUExQkFUb0FEQ0FOSUFJMkFnZ2dEU0FDTmdJRUlBSkJmMGNFUUFOQUlBWW9BZ0FnQWtFQ2RHb2dFellDQUNBTkVGMGdBeWdDQ0NFR0lBMG9BZ2dpQWtGL1J3MEFDd3NnQmlnQ0dDSUNJQUZCQW5ScUlRQWdFMEYvUndSQUlBSWdFMEVDZEdvZ0FDZ0NBRFlDQUFzZ0FFRi9OZ0lBUVFFZ0UzUWhEQ0FES0FKNElna2dFMEVEZGtIOC8vLy9BWEZxSWhNQ2YwRUJJQUYwSWdBZ0NTQUJRUU4yUWZ6Ly8vOEJjV29pQVNnQ0FIRUVRQ0FUS0FJQUlBeHlEQUVMSUJNb0FnQWdERUYvYzNFTE5nSUFJQUVnQVNnQ0FDQUFRWDl6Y1RZQ0FDQUlRUUZySVFnTElBZEJCR29pQnlBWVJ3MEFDd3NnQkFSQUlBMGdCRFlDSENBRUVPc0JDeUFOS0FJd0lnQUVRQU5BSUFBb0FnQWhBU0FBRU9zQklBRWlBQTBBQ3dzZ0RTZ0NLQ0VBSUExQkFEWUNLQ0FBQkVBZ0FCRHJBUXNnRGdSQUlBMGdEallDUkNBT0VPc0JDeUFOUWVBQWFpUUFJQWdNQWdzUStBRUFDd3dEQ3lJSlFYOUdEUUVnQ3lnQ0FDRUJJQXNwQXdnaElTQUxLUU1RSVNJZ0F5Z0NCQ0lBS0FJZ0lnUkNBRGNERUNBRUlDRWdJbjFDLy8vLy93K0ROd01JSUFRZ0FTQWlwMm8yQWdBZ0FDOEJKQ0lBUVFoMElBQkJDSFp5SWdGQi8vOERjVUdCQkUwRVFDQUVJQ1UzQXhBTEFrQWdBeWdDM0FFZ0F5Z0MyQUZHRFFBZ0F5Z0NDQ0lBS0FJQUlRUWdBQ2dDQkNFQUFrQWdBVUgvL3dOeFFZRUVUd1JBSUFBZ0JFWU5Ba0VBSVFFTUFRc2dBQ0FFUmcwQlFRQWhBUU5BSUFNZ0FSQlFCRUFnQVVFRGFpSUJJQU1vQWdnaUFDZ0NCQ0FBS0FJQWEwRUNkVWtOQVF3REN3c01Bd3NEUUNBRElBRVFVUVJBSUFGQkEyb2lBU0FES0FJSUlnQW9BZ1FnQUNnQ0FHdEJBblZKRFFFTUFnc0xEQUlMSUFVUVVpQURLQUxZQVNJQklBTW9BdHdCUndSQVFRQWhBZ05BSUFFZ0FrR1FBV3dpQkdwQkJHb2dBeWdDQ0JCVElCNG9BZ0FpR2lBRWFpSUFLQUtFQVNJQklBQW9Bb2dCSWdCSEJFQURRQ0FFSUJwcVFRUnFJQUVvQWdBUVZDQWVLQUlBSVJvZ0FVRUVhaUlCSUFCSERRQUxDeUFFSUJwcVFRUnFFRlVnQWtFQmFpSUNJQU1vQXR3QklBTW9BdGdCSWdGclFaQUJiVWtOQUFzTElBTkJ1QUZxSUFNb0FnZ2lBQ2dDSENBQUtBSVlhMEVDZFJCV0lBTW9BdGdCSWhvZ0F5Z0MzQUZIQkVCQkFDRUJBMEFnR2lBQlFaQUJiR29pQWtIb0FHb2dBeWdDQ0NJQUtBSWNJQUFvQWhoclFRSjFJZ1FnQWlnQ1BDQUNLQUk0YTBFQ2RTSUFJQUFnQkVnYkVGWWdBVUVCYWlJQklBTW9BdHdCSUFNb0F0Z0JJaHByUVpBQmJVa05BQXNMSUFNZ0NSQlhJUm9NQVF0QkFDRWFDeUFMUVVCckpBQWdHZzhMRU9jQkFBdndCUUVGZjBGL0lRUUNmMEYvSUFGQmYwWU5BQm9nQVVFQmFpSUNJQUZCQW1zZ0FrRURjQnNoQkNBQlFRRnJJQUZCQTNBTkFCb2dBVUVDYWdzaEJRSkFBbjhDUUFKQUFrQUNRQ0FBS0FLb0FRNElBQUFGQWdVQkJRTUZDeUFBS0FLVUFTRURRWDhoQVVFQklRSWdBQ2dDbkFFaUJpQUVRWDlIQkg4Z0F5Z0NBQ0FFUVFKMGFpZ0NBQVZCZnd0QkFuUnFJZ0VnQVNnQ0FFRUJhallDQUNBR1FRUnJJQVZCZjBZTkF4b2dCaUFES0FJQUlBVkJBblJxS0FJQVFRSjBhZ3dEQ3lBQUtBS1VBU0VEUVg4aEFpQUJRWDlIQkVBZ0F5Z0NBQ0FCUVFKMGFpZ0NBQ0VDQ3lBQUtBS2NBU0lCSUFKQkFuUnFJZ0lnQWlnQ0FFRUJhallDQUNBRVFYOUdCSDhnQVVFRWF3VWdBU0FES0FJQUlBUkJBblJxS0FJQVFRSjBhZ3NpQWlBQ0tBSUFRUUZxTmdJQUlBVkJmMFlFUUVFQ0lRSWdBVUVFYXd3REMwRUNJUUlnQVNBREtBSUFJQVZCQW5ScUtBSUFRUUowYWd3Q0N5QUFLQUtVQVNFRFFYOGhBaUFCUVg5SEJFQWdBeWdDQUNBQlFRSjBhaWdDQUNFQ0N5QUFLQUtjQVNJQklBSkJBblJxSWdJZ0FpZ0NBRUVCYWpZQ0FDQUVRWDlHQkg4Z0FVRUVhd1VnQVNBREtBSUFJQVJCQW5ScUtBSUFRUUowYWdzaUFpQUNLQUlBUVFKcU5nSUFJQVZCZjBZRVFFRUJJUUlnQVVFRWF3d0NDMEVCSVFJZ0FTQURLQUlBSUFWQkFuUnFLQUlBUVFKMGFnd0JDeUFBS0FLVUFTRURRWDhoQWlBQlFYOUhCRUFnQXlnQ0FDQUJRUUowYWlnQ0FDRUNDeUFBS0FLY0FTSUJJQUpCQW5ScUlnSWdBaWdDQUVFQ2FqWUNBRUVDSVFJZ0JFRi9SZ1IvSUFGQkJHc0ZJQUVnQXlnQ0FDQUVRUUowYWlnQ0FFRUNkR29MSWdZZ0JpZ0NBRUVDYWpZQ0FDQUJRUVJySUFWQmYwWU5BQm9nQVNBREtBSUFJQVZCQW5ScUtBSUFRUUowYWdzaUFTQUJLQUlBSUFKcU5nSUFDMEYvSVFFZ0FFRUFJQUFvQXJRQklnSWdBQ2dDbkFFZ0JFRi9Sd1IvSUFBb0FwUUJLQUlBSUFSQkFuUnFLQUlBQlVGL0MwRUNkR29vQWdBaUFTQUJJQUpLR3lBQUtBS3dBU0lBYXlBQUlBRktHellDckFFTHRRd0NEWDhFZmlNQVFTQnJJZ0lrQUNBQUtBSWdJUUVDUUFKQUlBQXZBU1FpQlVFSWRDQUZRUWgyY2tILy93TnhRWUVFVFFSQUlBRXBBd2dpRUNBQktRTVFJZzVDQkh3aUQxTU5BaUFCS0FJQUlnTWdEcWRxS0FBQUlRVWdBU0FQTndNUUlCQWdEa0lJZkNJT1V3MENJQUlnQXlBUHAyb29BQUFpQ2pZQ0dDQUJJQTQzQXhBTUFRdEJBU0FDUVJ4cUlBRVFGVVVOQVVFQklBSkJHR29nQUNnQ0lCQVZSUTBCSUFJb0Fod2hCU0FDS0FJWUlRb0xJQVZCMWFyVnFnVkxEUUFnQmEwaURpQUFLQUlnSWdFcEF3Z2lFQ0FCS1FNUUlnOTlRZ04vVmcwQUlBcXRJQTVDQTM1V0RRQWdEeUFRV1EwQUlBRW9BZ0FnRDZkcUxRQUFJUU1nQVNBUFFnRjhJZzQzQXhBQ1FDQURSUVJBQW45QkFDRURJd0JCSUdzaUFTUUFJQUZCQURZQ0dDQUJRZ0EzQXhBQ1FBSkFBa0FDUUNBRlFRTnNJZ2hGRFFBZ0NFR0FnSUNBQkU4TkF5QUJJQVZCREd3aUJCRHFBU0lETmdJUUlBRWdBeUFJUVFKMGFqWUNHQ0FCSUFRZ0EwRUFJQVFRK2dFaUIybzJBaFFnQUNnQ0lDSUVLUU1JSUFRcEF4QWlEbGNOQVNBRUtBSUFJQTZuYWkwQUFDRUpJQVFnRGtJQmZEY0RFQUpBQWtBZ0NRNENBQUVEQ3lBSVFRRWdCQ0FIRURBTkFRd0NDeUFJSUFRZ0J4QXhSUTBCQ3lBRkJFQkJBU0VNUVFFaEJFRUFJUWhCQUNFSEEwQWdBU0FIUVFBZ0F5QUlRUUowYWlJSktBSUFJZ3RCQVhZaURXc2dEU0FMUVFGeEcyb2lCellDQUNBQklBZEJBQ0FKS0FJRUlndEJBWFlpRFdzZ0RTQUxRUUZ4RzJvaUJ6WUNCQ0FCSUFkQkFDQUpLQUlJSWdsQkFYWWlDMnNnQ3lBSlFRRnhHMm9pQnpZQ0NDQUFLQUlzUWVBQWFpQUJFR2NnQkNBRlJnMENJQWhCQTJvaENDQUVRUUZxSVFRTUFBc0FDMEVCSVF3Z0EwVU5BUXNnQVNBRE5nSVVJQU1RNndFTElBRkJJR29rQUNBTURBRUxFT2NCQUF0RkRRSU1BUXNDUUNBS1FmOEJUUVJBSUFWRkRRSWdBa0VBTmdJUUlBSkNBRGNEQ0NBQktRTUlJZzhnRGxjTkFRTkFJQUVvQWdBaUF5QU9wMm90QUFBaEJDQUJJQTVDQVh3aUVEY0RFQ0FDSUFRMkFnZ2dEeUFRVncwQ0lBTWdFS2RxTFFBQUlRUWdBU0FPUWdKOEloQTNBeEFnQWlBRU5nSU1JQThnRUZjTkFpQURJQkNuYWkwQUFDRURJQUVnRGtJRGZEY0RFQ0FDSUFNMkFoQWdBQ2dDTEVIZ0FHb2dBa0VJYWhCbklBWkJBV29pQmlBRlJnMERJQUFvQWlBaUFTa0RFQ0VPSUFKQkFEWUNFQ0FDUWdBM0F3Z2dBU2tEQ0NJUElBNVZEUUFMREFFTElBcEIvLzhEVFFSQUlBVkZEUUlnQWtFQU5nSVFJQUpDQURjRENDQUJLUU1JSWhBZ0QwSURmQ0lQVXcwQkEwQWdBU2dDQUNJRElBNm5haThBQUNFRUlBRWdEemNERUNBQ0lBUTJBZ2dnRUNBT1FnUjhJaEZURFFJZ0F5QVBwMm92QUFBaEJDQUJJQkUzQXhBZ0FpQUVOZ0lNSUJBZ0RrSUdmQ0lPVXcwQ0lBTWdFYWRxTHdBQUlRTWdBU0FPTndNUUlBSWdBellDRUNBQUtBSXNRZUFBYWlBQ1FRaHFFR2NnQmtFQmFpSUdJQVZHRFFNZ0FDZ0NJQ0lCS1FNUUlRNGdBa0VBTmdJUUlBSkNBRGNEQ0NBQktRTUlJaEFnRGtJQ2ZDSVBXUTBBQ3d3QkN3SkFJQUFvQWl3b0FsQkIvLy8vQUVzTkFDQUFMd0VrSWdaQkNIUWdCa0VJZG5KQi8vOERjVUdDQkVrTkFDQUZSUTBDUVFBaEJpQUNRUUEyQWhBZ0FrSUFOd01JUVFFZ0FrRUVhaUFCRUJWRkRRRURRQ0FDSUFJb0FnUTJBZ2hCQVNBQ1FRUnFJQUFvQWlBUUZVVU5BaUFDSUFJb0FnUTJBZ3hCQVNBQ1FRUnFJQUFvQWlBUUZVVU5BaUFDSUFJb0FnUTJBaEFnQUNnQ0xFSGdBR29nQWtFSWFoQm5JQVpCQVdvaUJpQUZSZzBESUFBb0FpQWhBU0FDUVFBMkFoQWdBa0lBTndNSVFRRWdBa0VFYWlBQkVCVU5BQXNNQVFzZ0JVVU5BVUVBSVFZZ0FrRUFOZ0lRSUFKQ0FEY0RDQ0FCS1FNSUloQWdEMElGZkNJUFV3MEFBMEFnQVNnQ0FDSURJQTZuYWlnQUFDRUVJQUVnRHpjREVDQUNJQVEyQWdnZ0VDQU9RZ2g4SWhGVERRRWdBeUFQcDJvb0FBQWhCQ0FCSUJFM0F4QWdBaUFFTmdJTUlCQWdEa0lNZkNJT1V3MEJJQU1nRWFkcUtBQUFJUU1nQVNBT053TVFJQUlnQXpZQ0VDQUFLQUlzUWVBQWFpQUNRUWhxRUdjZ0JrRUJhaUlHSUFWR0RRSWdBQ2dDSUNJQktRTVFJUTRnQWtFQU5nSVFJQUpDQURjRENDQUJLUU1JSWhBZ0RrSUVmQ0lQV1EwQUN3dEJBQ0VHREFFTElBQW9BZ1FnQ2pZQ1VFRUJJUVlMSUFKQklHb2tBQ0FHQy93QkFRVi9JQUFvQWdRaUFpQUFLQUlJUndSQUlBSWdBU2tDQURjQ0FDQUNJQUVvQWdnMkFnZ2dBQ0FDUVF4cU5nSUVEd3NDUUNBQ0lBQW9BZ0FpQW1zaUJVRU1iU0lEUVFGcUlnUkIxcXJWcWdGSkJFQWdCQ0FEUVFGMElnWWdCQ0FHU3h0QjFhclZxZ0VnQTBHcTFhclZBRWtiSWdRRWZ5QUVRZGFxMWFvQlR3MENJQVJCREd3UTZnRUZRUUFMSWdZZ0EwRU1iR29pQXlBQktRSUFOd0lBSUFNZ0FTZ0NDRFlDQ0NBRElBVkJkRzFCREd4cUlRRWdCVUVCVGdSQUlBRWdBaUFGRVBrQkdnc2dBQ0FHSUFSQkRHeHFOZ0lJSUFBZ0EwRU1hallDQkNBQUlBRTJBZ0FnQWdSQUlBSVE5d0VMRHdzUTV3RUFDeEQ0QVFBTHZnSUJCbjlCd0FBUTZnRWhBMEVNRU9vQklnSWdBQ2dDQkNnQ1VEWUNDQ0FDUVl3VU5nSUFJQUpCQURZQ0JDQURRZ0EzQWh3Z0EwSUFOd0lVSUFOQ0FEY0NEQ0FEUWdBM0FnUWdBMElBTndJa0lBTkJ2QXcyQWdBZ0EwSUFOd0lzSUFOQ0FEY0NOQ0FESUFJMkFqd0NRQUpBSUFGQkFFZ0VRQ0FESVFJTUFRc2dBRUVJYWlFSEFrQWdBQ2dDRENJQ0lBQW9BZ2dpQld0QkFuVWlCaUFCU2cwQUlBRkJBV29oQkNBQklBWlBCRUFnQnlBRUlBWnJFQ1VNQVFzZ0JDQUdUdzBBSUFVZ0JFRUNkR29pQlNBQ1J3UkFBMEFnQWtFRWF5SUNLQUlBSVFRZ0FrRUFOZ0lBSUFRRVFDQUVJQVFvQWdBb0FnUVJBZ0FMSUFJZ0JVY05BQXNMSUFBZ0JUWUNEQXNnQnlnQ0FDQUJRUUowYWlJQUtBSUFJUUlnQUNBRE5nSUFJQUpGRFFFTElBSWdBaWdDQUNnQ0JCRUNBQXNnQVVGL2MwRWZkZ3VNQVFFRGZ5QUFCRUFnQUNnQ0dDSUNCRUFnQWlBQUtBSWNJZ05HQkg4Z0FnVURRQ0FEUVFScklnTW9BZ0FoQVNBRFFRQTJBZ0FnQVFSQUlBRkJER29nQVNnQ0VCQnJJQUVnQVNnQ0JCQnNJQUVROXdFTElBSWdBMGNOQUFzZ0FDZ0NHQXNoQVNBQUlBSTJBaHdnQVJEM0FRc2dBRUVNYWlBQUtBSVFFR3NnQUNBQUtBSUVFR3dnQUJEM0FRc0x4UjBDRDM4Q2ZpTUFRVEJySWdva0FFRUlFT29CSWdJZ0FUWUNCQ0FDUVFBMkFnQWdDaUFDUVFocUlnRTJBaWdnQ2lBQk5nSWtJQW9nQWpZQ0lBSi9Ba0FDUUFKQUEwQWdBVUVJYXlJQktBSUVJUWtnQVNnQ0FDRUhJQW9nQVRZQ0pDQUhCRUFnQ2tFQU5nSVlJQXBDQURjREVFRUJJUUlDUUNBQUtBSUFJZ0VwQXdnZ0FTa0RFQ0lSVncwQUlBRW9BZ0FnRWFkcUxRQUFJUU1nQVNBUlFnRjhOd01RSUFwQkVHb2dBeER1QVNBREJFQWdBQ2dDQUNFQklBcEJFR29RN1FFaEJDQUJLUU1JSUFFcEF4QWlFU0FEclNJU2ZGTU5BU0FFSUFFb0FnQWdFYWRxSUFNUStRRWFJQUVnQVNrREVDQVNmRGNERUF0QkdCRHFBU0lKUWdBM0FnUWdDVUVRYWlJQlFnQTNBZ0FnQ1NBSlFRUnFOZ0lBSUFrZ0FUWUNEQ01BUVNCcklnVWtBQUpBSUFkQkRHb2lCQ0FLUVJCcUlnSVFHaUlMSUFkQkVHb2lEMFlFUUNBRklBSTJBaEFDUUFKQUlBUW9BZ1FpQVFSQUlBSW9BZ0FnQWlBQ0xRQUxJZ05CR0hSQkdIVkJBRWdpQnhzaEJpQUNLQUlFSUFNZ0J4c2hCeUFFUVFScUlRSURRQUpBQWtBQ1FBSkFBa0FDUUNBQktBSVVJQUV0QUJzaUF5QURRUmgwUVJoMVFRQklJZzRiSWdNZ0J5QURJQWRKSWd3YklnZ0VRQ0FHSUFGQkVHb2lEU2dDQUNBTklBNGJJZzRnQ0JEa0FTSU5SUVJBSUFNZ0Iwc05BZ3dEQ3lBTlFYOUtEUUlNQVFzZ0F5QUhUUTBDQ3lBQktBSUFJZ01OQkF3SEN5QU9JQVlnQ0JEa0FTSUREUUVMSUF3TkFRd0dDeUFEUVg5S0RRVUxJQUZCQkdvaEFpQUJLQUlFSWdORkRRUWdBaUVCQ3lBQklRSWdBeUVCREFBTEFBc2dCRUVFYWlFQkN5QUJJUUlMSUFVZ0FpZ0NBQ0lEQkg5QkFBVkJJQkRxQVNJRFFSQnFJUVlDUUNBRktBSVFJZ2NzQUF0QkFFNEVRQ0FHSUFjcEFnQTNBZ0FnQmlBSEtBSUlOZ0lJREFFTElBWWdCeWdDQUNBSEtBSUVFT3dCQ3lBRElBRTJBZ2dnQTBJQU53SUFJQU5CQURZQ0hDQUNJQU0yQWdBZ0JDZ0NBQ2dDQUNJQkJIOGdCQ0FCTmdJQUlBSW9BZ0FGSUFNTElRRWdCQ2dDQkNBQkVNb0JJQVFnQkNnQ0NFRUJhallDQ0VFQkN6b0FIQ0FGSUFNMkFoZ2dCU2dDR0NJQ0tBSWNJUUVnQWlBSk5nSWNJQUZGRFFFZ0FVRU1haUFCS0FJUUVHc2dBU0FCS0FJRUVHd2dBUkRyQVF3QkN5QUpSUTBBSUFsQkRHb2dDU2dDRUJCcklBa2dDU2dDQkJCc0lBa1E2d0VMSUFWQklHb2tBQ0FMSUE5SElRSUxJQW9zQUJ0QmYwd0VRQ0FLS0FJUUVQY0JDeUFDRFFRTElBbEZEUU1nQ2tFQU5nSVFRUUVnQ2tFUWFpQUFLQUlBRUJWRkRRTUNRQ0FLS0FJUUlnNUZEUUJCQVNFQkEwQUNmMEVBSVE4akFFRWdheUlJSkFBZ0NFRUFOZ0lZSUFoQ0FEY0RFQUpBQWtBZ0FDZ0NBQ0lDS1FNSUlBSXBBeEFpRVZjTkFDQUNLQUlBSUJHbmFpMEFBQ0VESUFJZ0VVSUJmRGNERUNBSVFSQnFJQU1RN2dFZ0F3UkFJQUFvQWdBaEFpQUlRUkJxRU8wQklRUWdBaWtEQ0NBQ0tRTVFJaEVnQTYwaUVueFREUUVnQkNBQ0tBSUFJQkduYWlBREVQa0JHaUFDSUFJcEF4QWdFbnczQXhBTElBaEJBRFlDREVFQklBaEJER29nQUNnQ0FCQVZSUTBBSUFnb0Fnd2lBa1VOQUNBSVFRQTJBZ2dnQ0VJQU53TUFJQUpCZjB3TkFTQUlJQUlRNmdFaUF6WUNBQ0FJSUFJZ0Eyb2lCRFlDQ0NBRFFRQWdBaEQ2QVNFRklBZ2dCRFlDQkNBQUtBSUFJZ1FwQXdnZ0JDa0RFQ0lSSUFLdEloSjhXU0lQQkVBZ0JTQUVLQUlBSUJHbmFpQUNFUGtCR2lBRUlBUXBBeEFnRW53M0F4QWpBRUV3YXlJR0pBQWdDU0FJUVJCcUVCb2lBeUFKUVFScVJ3UkFBa0FnQXlnQ0JDSUVSUVJBSUFNb0FnZ2lCU2dDQUNBRFJnMEJJQU5CQ0dvaEFnTkFJQUlvQWdBaUJFRUlhaUVDSUFRZ0JDZ0NDQ0lGS0FJQVJ3MEFDd3dCQ3dOQUlBUWlCU2dDQUNJRURRQUxDeUFESUFrb0FnQkdCRUFnQ1NBRk5nSUFDeUFKSUFrb0FnaEJBV3MyQWdnZ0NTZ0NCQ0VGQW44Q1FDQURJZ2NvQWdBaUJBUkFJQWNvQWdRaUFrVU5BUU5BSUFJaUF5Z0NBQ0lDRFFBTEN5QURLQUlFSWdRTkFFRUFJUVJCQVF3QkN5QUVJQU1vQWdnMkFnaEJBQXNoREFKQUlBTWdBeWdDQ0NJTEtBSUFJZ0pHQkVBZ0N5QUVOZ0lBSUFNZ0JVWUVRRUVBSVFJZ0JDRUZEQUlMSUFzb0FnUWhBZ3dCQ3lBTElBUTJBZ1FMSUFNdEFBd2hEU0FESUFkSEJFQWdBeUFIS0FJSUlnczJBZ2dnQ3lBSEtBSUlLQUlBSUFkSFFRSjBhaUFETmdJQUlBTWdCeWdDQUNJTE5nSUFJQXNnQXpZQ0NDQURJQWNvQWdRaUN6WUNCQ0FMQkVBZ0N5QUROZ0lJQ3lBRElBY3RBQXc2QUF3Z0F5QUZJQVVnQjBZYklRVUxBa0FnRFVVTkFDQUZSUTBBSUF3RVFBTkFJQUl0QUF3aEJBSkFJQUlnQWlnQ0NDSURLQUlBUndSQUFrQUNRQUpBQWtBQ2Z5QUVSUVJBSUFKQkFUb0FEQ0FEUVFBNkFBd2dBeUFES0FJRUlnUW9BZ0FpQ3pZQ0JDQUxCRUFnQ3lBRE5nSUlDeUFFSUFNb0FnZzJBZ2dnQXlnQ0NDSUxJQXNvQWdBZ0EwZEJBblJxSUFRMkFnQWdCQ0FETmdJQUlBTWdCRFlDQ0NBQ0lBVWdCU0FDS0FJQUlnSkdHeUVGSUFJb0FnUWhBZ3NnQWlnQ0FDSURDd1JBSUFNdEFBeEZEUUVMSUFJb0FnUWlCQVJBSUFRdEFBeEZEUUlMSUFKQkFEb0FEQUpBSUFVZ0FpZ0NDQ0lDUmdSQUlBVWhBZ3dCQ3lBQ0xRQU1EUVlMSUFKQkFUb0FEQXdJQ3lBQ0tBSUVJZ1JGRFFFTElBUXRBQXdOQUNBQ0lRTU1BUXNnQTBFQk9nQU1JQUpCQURvQURDQUNJQU1vQWdRaUJEWUNBQ0FFQkVBZ0JDQUNOZ0lJQ3lBRElBSW9BZ2cyQWdnZ0FpZ0NDQ0lFSUFRb0FnQWdBa2RCQW5ScUlBTTJBZ0FnQXlBQ05nSUVJQUlnQXpZQ0NDQUNJUVFMSUFNZ0F5Z0NDQ0lDTFFBTU9nQU1JQUpCQVRvQURDQUVRUUU2QUF3Z0FpQUNLQUlFSWdNb0FnQWlCRFlDQkNBRUJFQWdCQ0FDTmdJSUN5QURJQUlvQWdnMkFnZ2dBaWdDQ0NJRUlBUW9BZ0FnQWtkQkFuUnFJQU0yQWdBZ0F5QUNOZ0lBSUFJZ0F6WUNDQXdFQ3lBRVJRUkFJQUpCQVRvQURDQURRUUE2QUF3Z0F5QUNLQUlFSWdRMkFnQWdCQVJBSUFRZ0F6WUNDQXNnQWlBREtBSUlOZ0lJSUFNb0FnZ2lCQ0FFS0FJQUlBTkhRUUowYWlBQ05nSUFJQUlnQXpZQ0JDQURJQUkyQWdnZ0FpQUZJQU1nQlVZYklRVWdBeWdDQUNFQ0N3SkFBa0FnQWlnQ0FDSUVSUTBBSUFRdEFBd05BQ0FDSVFNTUFRc0NRQ0FDS0FJRUlnTUVRQ0FETFFBTVJRMEJDeUFDUVFBNkFBd2dBaWdDQ0NJQ0xRQU1RUUFnQWlBRlJ4c05BaUFDUVFFNkFBd01CUXNnQkFSQUlBUXRBQXhGQkVBZ0FpRUREQUlMSUFJb0FnUWhBd3NnQTBFQk9nQU1JQUpCQURvQURDQUNJQU1vQWdBaUJEWUNCQ0FFQkVBZ0JDQUNOZ0lJQ3lBRElBSW9BZ2cyQWdnZ0FpZ0NDQ0lFSUFRb0FnQWdBa2RCQW5ScUlBTTJBZ0FnQXlBQ05nSUFJQUlnQXpZQ0NDQUNJUVFMSUFNZ0F5Z0NDQ0lDTFFBTU9nQU1JQUpCQVRvQURDQUVRUUU2QUF3Z0FpQUNLQUlBSWdNb0FnUWlCRFlDQUNBRUJFQWdCQ0FDTmdJSUN5QURJQUlvQWdnMkFnZ2dBaWdDQ0NJRUlBUW9BZ0FnQWtkQkFuUnFJQU0yQWdBZ0F5QUNOZ0lFSUFJZ0F6WUNDQXdEQ3lBQ0tBSUlJZ01nQXlnQ0FDQUNSa0VDZEdvb0FnQWhBZ3dBQ3dBTElBUkJBVG9BREFzZ0J5Z0NIQ0lDQkVBZ0J5QUNOZ0lnSUFJUTl3RUxJQWNzQUJ0QmYwd0VRQ0FIS0FJUUVQY0JDeUFIRVBjQkN5QUdRZ0EzQXdBZ0JrRUFOZ0lJSUFZZ0NDZ0NCQ0FJS0FJQWF5SUNFQWNnQmlnQ0FDQUlLQUlBSUFJUStRRWFBa0FnQ0N3QUcwRUFUZ1JBSUFZZ0NDZ0NHRFlDR0NBR0lBZ3BBaEEzQXhBTUFRc2dCa0VRYWlBSUtBSVFJQWdvQWhRUTdBRUxJQVpCQURZQ0pDQUdRZ0EzQWh3Z0JrRWNhaUFHS0FJRUlBWW9BZ0JyRUFjZ0JpZ0NIQ0FHS0FJQUlnSWdCaWdDQkNBQ2F4RDVBUm9nQmtFUWFpRURBa0FDUUNBSktBSUVJZ0lFUUNBREtBSUFJQU1nQXkwQUN5SUVRUmgwUVJoMVFRQklJZ1ViSVFjZ0F5Z0NCQ0FFSUFVYklRVWdDVUVFYWlFREEwQUNRQUpBQWtBQ1FBSkFBa0FnQWlnQ0ZDQUNMUUFiSWdRZ0JFRVlkRUVZZFVFQVNDSU1HeUlFSUFVZ0JDQUZTU0lOR3lJTEJFQWdCeUFDUVJCcUloQW9BZ0FnRUNBTUd5SU1JQXNRNUFFaUVFVUVRQ0FFSUFWTERRSU1Bd3NnRUVGL1NnMENEQUVMSUFRZ0JVME5BZ3NnQWlnQ0FDSUVEUVFNQndzZ0RDQUhJQXNRNUFFaUJBMEJDeUFORFFFTUJnc2dCRUYvU2cwRkN5QUNRUVJxSVFNZ0FpZ0NCQ0lFUlEwRUlBTWhBZ3NnQWlFRElBUWhBZ3dBQ3dBTElBbEJCR29oQWdzZ0FpRURDeUFHSUFNb0FnQWlCQVIvUVFBRlFTZ1E2Z0VpQkNBR0tBSVlOZ0lZSUFRZ0Jpa0NFRGNDRUNBR1FnQTNBaEFnQmtFQU5nSVlJQVJCQURZQ0pDQUVRUnhxSWdWQ0FEY0NBQ0FGSUFZb0FpQWdCaWdDSEdzUUJ5QUZLQUlBSUFZb0Fod2lCU0FHS0FJZ0lBVnJFUGtCR2lBRUlBSTJBZ2dnQkVJQU53SUFJQU1nQkRZQ0FDQUpLQUlBS0FJQUlnSUVmeUFKSUFJMkFnQWdBeWdDQUFVZ0JBc2hBaUFKS0FJRUlBSVF5Z0VnQ1NBSktBSUlRUUZxTmdJSVFRRUxPZ0FzSUFZZ0JEWUNLQ0FHS0FJY0lnSUVRQ0FHSUFJMkFpQWdBaEQzQVFzZ0Jpd0FHMEYvVEFSQUlBWW9BaEFROXdFTElBWW9BZ0FpQWdSQUlBWWdBallDQkNBQ0VQY0JDeUFHUVRCcUpBQWdDQ2dDQUNJRFJRMEJDeUFJSUFNMkFnUWdBeERyQVFzZ0NDd0FHMEYvVEFSQUlBZ29BaEFRNndFTElBaEJJR29rQUNBUERBRUxFT2NCQUF0RkRRVWdBU0FPUmcwQklBRkJBV29oQVF3QUN3QUxJQXBCQURZQ0RFRUJJQXBCREdvZ0FDZ0NBQkFWUlEwRElBb29BZ3dpQmEwZ0FDZ0NBQ0lCS1FNSUlBRXBBeEI5VlEwRFFRQWhBaUFLS0FJa0lRRWdCUVJBQTBBQ1FDQUtLQUlvSWdRZ0FVc0VRQ0FCUVFBMkFnUWdBU0FKTmdJQUlBb2dBVUVJYWlJQk5nSWtEQUVMSUFFZ0NpZ0NJQ0lEYXlJSFFRTjFJZ1pCQVdvaUFVR0FnSUNBQWs4TkJDQUJJQVFnQTJzaUJFRUNkU0lJSUFFZ0NFc2JRZi8vLy84QklBUkJBM1ZCLy8vLy93QkpHeUlCUVlDQWdJQUNUdzBGSUFGQkEzUWlDQkRxQVNJRUlBWkJBM1JxSWdGQkFEWUNCQ0FCSUFrMkFnQWdBVUVJYWlFQklBZEJBVTRFUUNBRUlBTWdCeEQ1QVJvTElBb2dCQ0FJYWpZQ0tDQUtJQUUyQWlRZ0NpQUVOZ0lnSUFORkRRQWdBeEQzQVFzZ0FrRUJhaUlDSUFWSERRQUxDeUFLS0FJZ0lBRkhEUUFMUVFFTUF3c1E1d0VBQ3hENEFRQUxJQW9vQWlBaEFVRUFDeUVBSUFFRVFDQUtJQUUyQWlRZ0FSRDNBUXNnQ2tFd2FpUUFJQUFMWGdBZ0FRUkFJQUFnQVNnQ0FCQnJJQUFnQVNnQ0JCQnJJQUVvQWh3aEFDQUJRUUEyQWh3Z0FBUkFJQUJCREdvZ0FDZ0NFQkJySUFBZ0FDZ0NCQkJzSUFBUTl3RUxJQUVzQUJ0QmYwd0VRQ0FCS0FJUUVQY0JDeUFCRVBjQkN3dEhBQ0FCQkVBZ0FDQUJLQUlBRUd3Z0FDQUJLQUlFRUd3Z0FTZ0NIQ0lBQkVBZ0FTQUFOZ0lnSUFBUTl3RUxJQUVzQUJ0QmYwd0VRQ0FCS0FJUUVQY0JDeUFCRVBjQkN3dlNBd0lLZndGK0FrQUNmMEVBSUFBb0FpQWlBaWtEQ0NBQ0tRTVFJZ3RYRFFBYUlBSW9BZ0FnQzZkcUxRQUFJUVFnQWlBTFFnRjhOd01RQWtBZ0JFVU5BQU5BSUFBZ0FTQUFLQUlBS0FJUUVRRUFCRUFnQkNBQlFRRnFJZ0ZIRFFFTUFnc0xRUUFQQ3lBQUtBSUlJZ0VnQUNnQ0RDSUNSd1JBQTBBZ0FTZ0NBQ0lESUFBZ0FDZ0NCQ0FES0FJQUtBSUlFUU1BUlEwRElBRkJCR29pQVNBQ1J3MEFDd3NDUUNBRVJRMEFRUUFoQVFOQUlBQW9BZ2dnQVVFQ2RHb29BZ0FpQWlBQUtBSWdJQUlvQWdBb0Fnd1JBUUJGRFFNZ0FVRUJhaUlCSUFSSERRQUxJQVJGRFFBZ0FFRVVhaUVIUVFBaEFnTkFRUUFoQVNBQ1FRSjBJZ2tnQUNnQ0NHb29BZ0FpQXlBREtBSUFLQUlZRVFBQUlncEJBRW9FUUFOQUFrQWdBQ2dDQ0NBSmFpZ0NBQ0lESUFFZ0F5Z0NBQ2dDRkJFQkFDSUlJQUFvQWhnZ0FDZ0NGQ0lEYTBFQ2RTSUZTUTBBSUFVZ0NFRUJhaUlHU1FSQUlBY2dCaUFGYXhBS0lBY29BZ0FoQXd3QkN5QUZJQVpORFFBZ0FDQURJQVpCQW5ScU5nSVlDeUFESUFoQkFuUnFJQUkyQWdBZ0FVRUJhaUlCSUFwSERRQUxDeUFDUVFGcUlnSWdCRWNOQUFzTFFRQWdBQ0FBS0FJQUtBSWNFUUFBUlEwQUdpQUFJQUFvQWdBb0FpQVJBQUFMRHd0QkFBdEdBUU4vSUFBb0FnZ2lBU0FBS0FJTUlnTkdCRUJCQVE4TEEwQWdBU2dDQUNJQ0lBQW9BaUFnQWlnQ0FDZ0NFQkVCQUNJQ0JFQWdBVUVFYWlJQklBTkhEUUVMQ3lBQ0M2Z0dBZ2wvQW40Q1FDQUJMd0VtSWdKRkRRQUNRQ0FDUWY4RFRRUkFJQUVwQXdnZ0FTa0RFQ0lMUWdSOFV3MENJQUFnQVNnQ0FDQUxwMm9vQUFBaUF6WUNEQ0FCSUFFcEF4QkNCSHczQXhBTUFRdEJBU0FBUVF4cUlBRVFGVVVOQVNBQUtBSU1JUU1MQWtBZ0FDZ0NCQ0FBS0FJQUlnVnJRUUoxSWdJZ0Ewa0VRQ0FBSUFNZ0Ftc1FDaUFBS0FJTUlRTU1BUXNnQWlBRFRRMEFJQUFnQlNBRFFRSjBhallDQkFzZ0EwVUVRRUVCRHdzZ0FTa0RDQ0VNSUFBb0FnQWhCa0VBSVFVRFFDQUJLUU1RSWdzZ0RGa0VRRUVBRHdzZ0FTZ0NBQ0lISUF1bmFpMEFBQ0VJSUFFZ0MwSUJmQ0lMTndNUUlBaEJBblloQWtFQUlRUUNRQUpBQWtBQ1FDQUlRUU54SWdvT0JBSUJBUUFCQ3lBRElBSWdCV29pQWswRVFFRUFEd3NnQmlBRlFRSjBha0VBSUFoQi9BRnhRUVJxRVBvQkdpQUNJUVVNQWdzRFFDQUxJQXhaRFFRZ0J5QUxwMm90QUFBaEF5QUJJQXRDQVh3aUN6Y0RFQ0FESUFSQkEzUkJCbkowSUFKeUlRSWdCRUVCYWlJRUlBcEhEUUFMQ3lBR0lBVkJBblJxSUFJMkFnQUxJQVZCQVdvaUJTQUFLQUlNSWdOSkRRQUxJQUJCRUdvaENDQUFLQUlBSVFvQ1FDQUFLQUlVSUFBb0FoQWlBV3NpQWtFQ2RTSUZRZjhmVFFSQUlBaEJnQ0FnQldzUUNnd0JDeUFDUVlDQUFVWU5BQ0FBSUFGQmdJQUJhallDRkFzQ1FDQUFLQUlnSUFCQkhHb2lBU2dDQUNJRmEwRURkU0lDSUFOSkJFQWdBU0FESUFKckVPSUJJQUVvQWdBaEJRd0JDeUFDSUFOTEJFQWdBQ0FGSUFOQkEzUnFOZ0lnQ3lBRFJRMEJDMEVBSVFSQkFDRUFBMEFnQ2lBRVFRSjBhaUlCS0FJQUlRWWdCU0FFUVFOMGFpSUhJQUFpQWpZQ0JDQUhJQVkyQWdBZ0FTZ0NBQ0lHSUFCcUlnQkJnQ0JMRFFFQ1FDQUFJQUpORFFBZ0NDZ0NBQ0VISUFaQkIzRWlBUVJBQTBBZ0J5QUNRUUowYWlBRU5nSUFJQUpCQVdvaEFpQUJRUUZySWdFTkFBc0xJQVpCQVd0QkJrME5BQU5BSUFjZ0FrRUNkR29pQVNBRU5nSUFJQUVnQkRZQ0hDQUJJQVEyQWhnZ0FTQUVOZ0lVSUFFZ0JEWUNFQ0FCSUFRMkFnd2dBU0FFTmdJSUlBRWdCRFlDQkNBQ1FRaHFJZ0lnQUVjTkFBc0xJQVJCQVdvaUJDQURSdzBBQ3lBQVFZQWdSaUVKQ3lBSkM1OERBZ1ovQTM0akFFRVFheUlFSkFBQ1FBSkFJQUV2QVNaQi93Tk5CRUFnQVNrRENDSUtJQUVwQXhBaUNFSUlmQ0lKVXcwQ0lBRW9BZ0FnQ0tkcUtRQUFJUWdnQVNBSk53TVFEQUVMUVFFZ0JFRUlhaUFCRUdGRkRRRWdBU2tERUNFSklBRXBBd2doQ2lBRUtRTUlJUWdMSUFnZ0NpQUpmVllOQUNBQklBZ2dDWHczQXhBZ0NLY2lBa0VCU0EwQUlBQWdBU2dDQUNBSnAyb2lBVFlDS0NBQUFuOGdBU0FDUVFGcklnVnFJZ1l0QUFBaUIwRS9UUVJBSUFBZ0JUWUNMQ0FHTFFBQVFUOXhEQUVMQWtBQ1FBSkFJQWRCQm5aQkFXc09Bd0FCQWdRTElBSkJBa2dOQXlBQUlBSkJBbXMyQWl3Z0FTQUNha0VDYXlJQkxRQUJRUWgwUVlEK0FIRWdBUzBBQUhJTUFnc2dBa0VEU0EwQ0lBQWdBa0VEYXpZQ0xDQUJJQUpxUVFOcklnRXRBQUpCRUhSQmdJRDhBWEVnQVMwQUFVRUlkSElnQVMwQUFISU1BUXNnQUNBQ1FRUnJOZ0lzSUFFZ0FtcEJCR3NpQVMwQUFrRVFkQ0FCTFFBRFFSaDBRWUNBZ1BnRGNYSWdBUzBBQVVFSWRISWdBUzBBQUhJTFFZQ0FBV29pQURZQ01DQUFRWUNBZ0FKSklRTUxJQVJCRUdva0FDQURDNHdNQWcxL0EzNGpBRUZBYWlJREpBQWdBMEVBTmdJd0lBTkNBRGNES0NBRFFnQTNBeUFnQTBJQU53TVlJQU5DQURjREVDQURRZ0EzQXdnZ0EwSUFOd01BQWtBQ2Z3SkFJQUVpQkM4QkppSUJSUTBBQWtBZ0FVSC9BMDBFUUNBRUtRTUlJQVFwQXhBaUVFSUVmRk1OQWlBRElBUW9BZ0FnRUtkcUtBQUFJZ2cyQWd3Z0JDQUVLUU1RUWdSOE53TVFEQUVMUVFFZ0EwRU1haUFFRUJWRkRRRWdBeWdDRENFSUN3SkFJQU1vQWdRZ0F5Z0NBQ0lGYTBFQ2RTSUJJQWhKQkVBZ0F5QUlJQUZyRUFvZ0F5Z0NEQ0VJREFFTElBRWdDRTBOQUNBRElBVWdDRUVDZEdvMkFnUUxRUUVnQ0VVTkFSb2dCQ2tEQ0NFUklBTW9BZ0FoQ1VFQUlRVURRRUVBSUFRcEF4QWlFQ0FSV1EwQ0dpQUVLQUlBSWdvZ0VLZHFMUUFBSVFZZ0JDQVFRZ0Y4SWhBM0F4QWdCa0VDZGlFQlFRQWhCd0pBQWtBQ1FBSkFJQVpCQTNFaUN3NEVBZ0VCQUFFTFFRQWdDQ0FCSUFWcUlnRk5EUVVhSUFrZ0JVRUNkR3BCQUNBR1Fmd0JjVUVFYWhENkFSb2dBU0VGREFJTEEwQWdFQ0FSV1EwRUlBb2dFS2RxTFFBQUlRWWdCQ0FRUWdGOEloQTNBeEFnQmlBSFFRTjBRUVp5ZENBQmNpRUJJQWRCQVdvaUJ5QUxSdzBBQ3dzZ0NTQUZRUUowYWlBQk5nSUFDeUFGUVFGcUlnVWdBeWdDRENJSVNRMEFDeUFEUVJCcUlRb2dBeWdDQUNFUEFrQWdBeWdDRkNBREtBSVFJZ0ZySWdWQkFuVWlCa0gvL3o5TkJFQWdDa0dBZ01BQUlBWnJFQW9NQVFzZ0JVR0FnSUFDUmcwQUlBTWdBVUdBZ0lBQ2FqWUNGQXNDUUNBREtBSWdJQU5CSEdvaUFTZ0NBQ0lGYTBFRGRTSUdJQWhKQkVBZ0FTQUlJQVpyRU9JQklBRW9BZ0FoQlF3QkN5QUdJQWhMQkVBZ0F5QUZJQWhCQTNScU5nSWdDeUFJUlEwQkMwRUFJUWRCQUNFR0EwQWdEeUFIUVFKMGFpSUpLQUlBSVFzZ0JTQUhRUU4wYWlJTklBWWlBVFlDQkNBTklBczJBZ0FnQ1NnQ0FDSUpJQUZxSWdaQmdJREFBRXNOQVFKQUlBRWdCazhOQUNBS0tBSUFJUXNnQ1VFSGNTSU5CRUFEUUNBTElBRkJBblJxSUFjMkFnQWdBVUVCYWlFQklBMUJBV3NpRFEwQUN3c2dDVUVCYTBFR1RRMEFBMEFnQ3lBQlFRSjBhaUlKSUFjMkFnQWdDU0FITmdJY0lBa2dCellDR0NBSklBYzJBaFFnQ1NBSE5nSVFJQWtnQnpZQ0RDQUpJQWMyQWdnZ0NTQUhOZ0lFSUFGQkNHb2lBU0FHUncwQUN3c2dCMEVCYWlJSElBaEhEUUFMSUFaQmdJREFBRVloREFzZ0RBdEZEUUFnQUFSQUlBTW9BZ3hGRFFFTEFrQWdCQzhCSmtIL0EwMEVRQ0FFS1FNSUloSWdCQ2tERUNJUlFnaDhJaEJURFFJZ0JDZ0NBQ0FScDJvcEFBQWhFU0FFSUJBM0F4QU1BUXRCQVNBRFFUaHFJQVFRWVVVTkFTQUVLUU1RSVJBZ0JDa0RDQ0VTSUFNcEF6Z2hFUXNnRVNBU0lCQjlWZzBBSUFRZ0VDQVJmRGNERUNBUnB5SUZRUUZJRFFBZ0F5QUVLQUlBSUJDbmFpSUdOZ0lvSUFNQ2Z5QUdJQVZCQVdzaUFXb2lCQzBBQUNJSFFUOU5CRUFnQXlBQk5nSXNJQVF0QUFCQlAzRU1BUXNDUUFKQUFrQWdCMEVHZGtFQmF3NERBQUVDQkFzZ0JVRUNTQTBESUFNZ0JVRUNheUlCTmdJc0lBVWdCbXBCQW1zaUJDMEFBVUVJZEVHQS9nQnhJQVF0QUFCeURBSUxJQVZCQTBnTkFpQURJQVZCQTJzaUFUWUNMQ0FGSUFacVFRTnJJZ1F0QUFKQkVIUkJnSUQ4QVhFZ0JDMEFBVUVJZEhJZ0JDMEFBSElNQVFzZ0F5QUZRUVJySWdFMkFpd2dCU0FHYWtFRWF5SUVMUUFDUVJCMElBUXRBQU5CR0hSQmdJQ0ErQU54Y2lBRUxRQUJRUWgwY2lBRUxRQUFjZ3RCZ0lDQUFtb2lCRFlDTUNBRVFmLy8vLzhEU3cwQUlBQkZCRUJCQVNFT0RBRUxJQU1vQWh3aEIwRUFJUVVnQXlnQ0VDRUlBMEFDUUNBRVFmLy8vd0ZMRFFBRFFDQUJRUUZJRFFFZ0F5QUJRUUZySWdFMkFpd2dBeUFCSUFacUxRQUFJQVJCQ0hSeUlnUTJBakFnQkVHQWdJQUNTUTBBQ3dzZ0F5QUhJQWdnQkVILy96OXhJZ2xCQW5ScUtBSUFJZ3hCQTNScUlnb29BZ0FnQkVFVWRtd2dDV29nQ2lnQ0JHc2lCRFlDTUNBQ0lBVkJBblJxSUF3MkFnQkJBU0VPSUFWQkFXb2lCU0FBUncwQUN3c2dBeWdDSENJQUJFQWdBeUFBTmdJZ0lBQVE5d0VMSUFNb0FoQWlBQVJBSUFNZ0FEWUNGQ0FBRVBjQkN5QURLQUlBSWdBRVFDQURJQUEyQWdRZ0FCRDNBUXNnQTBGQWF5UUFJQTRMa1FRQkJuOGpBRUVRYXlJREpBQUNRQUpBSUFFZ0FDZ0NCQ0lFU3dSQUFrQUNRQ0FBS0FJSUlnWkJCWFFpQWlBQklBUnJJZ1ZKRFFBZ0JDQUNJQVZyU3cwQUlBQWdBVFlDQkNBRVFSOXhJUUlnQUNnQ0FDQUVRUU4yUWZ6Ly8vOEJjV29oQVF3QkN5QURRUUEyQWdnZ0EwSUFOd01BSUFGQmYwd05BeUFESUFKQi92Ly8vd05OQkg4Z0FVRWZha0ZnY1NJQklBWkJCblFpQWlBQklBSkxHd1ZCLy8vLy93Y0xFRm9nQXlBQUtBSUVJZ0lnQldvMkFnUWdBQ2dDQUNFRUlBTW9BZ0FoQVFKQUlBSkJBVWdFUUVFQUlRSU1BUXNnQVNBRUlBSkJCWFlpQjBFQ2RDSUdFUHNCSUFacUlRRUNRQ0FDSUFkQkJYUnJJZ0pCQVVnRVFFRUFJUUlNQVFzZ0FTQUJLQUlBUVg5QklDQUNhM1lpQjBGL2MzRWdCQ0FHYWlnQ0FDQUhjWEkyQWdBTElBQW9BZ0FoQkFzZ0FDQURLQUlBTmdJQUlBTWdCRFlDQUNBQUtBSUVJUVlnQUNBREtBSUVOZ0lFSUFNZ0JqWUNCQ0FBS0FJSUlRWWdBQ0FES0FJSU5nSUlJQU1nQmpZQ0NDQUVSUTBBSUFRUTl3RUxJQVZGRFFFZ0FnUi9JQUVnQVNnQ0FFRi9JQUowUVg5QklDQUNheUlBSUFVZ0FDQUFJQVZMR3lJQWEzWnhRWDl6Y1RZQ0FDQUZJQUJySVFVZ0FVRUVhZ1VnQVF0QkFDQUZRUVYyUVFKMElnQVErZ0VoQVNBRlFSOXhJZ1ZGRFFFZ0FDQUJhaUlBSUFBb0FnQkJmMEVnSUFWcmRrRi9jM0UyQWdBTUFRc2dBQ0FCTmdJRUN5QURRUkJxSkFBUEN4RG5BUUFMeUFZQkMzOGpBRUVRYXlJTUpBQWdEQ0FDTmdJSUlBQkJDR29oQmdKQUlBQW9BZ3dpQlNBQUtBSUlJZ05yUVFKMUlnZ2dBVW9OQUNBSUlBRkJBV29pQkVrRVFDQUVJQWhySWcwZ0JpZ0NDQ0lESUFZb0FnUWlCMnRCQW5WTkJFQWdCaUFOQkg4Z0IwRUFJQTFCQW5RaUF4RDZBU0FEYWdVZ0J3czJBZ1FNQWdzQ1FBSkFBa0FnQnlBR0tBSUFJZ3ByUVFKMUlnZ2dEV29pQlVHQWdJQ0FCRWtFUUFKL0lBVWdBeUFLYXlJRVFRRjFJZ01nQXlBRlNSdEIvLy8vL3dNZ0JFRUNkVUgvLy8vL0FVa2JJZ3NFUUNBTFFZQ0FnSUFFVHcwRElBdEJBblFRNmdFaENRc2dDU0FJUVFKMGFpSUZDMEVBSUExQkFuUWlCQkQ2QVNJRElBUnFJUWdnQ1NBTFFRSjBhaUVFSUFjZ0NrWU5BZ05BSUFkQkJHc2lCeWdDQUNFRElBZEJBRFlDQUNBRlFRUnJJZ1VnQXpZQ0FDQUhJQXBIRFFBTElBWWdCRFlDQ0NBR0tBSUVJUVFnQmlBSU5nSUVJQVlvQWdBaEJ5QUdJQVUyQWdBZ0JDQUhSZzBEQTBBZ0JFRUVheUlFS0FJQUlRTWdCRUVBTmdJQUlBTUVRQ0FERUJjTElBUWdCMGNOQUFzTUF3c1E1d0VBQ3hENEFRQUxJQVlnQkRZQ0NDQUdJQWcyQWdRZ0JpQUROZ0lBQ3lBSEJFQWdCeERyQVFzTUFRc2dCQ0FJVHcwQUlBTWdCRUVDZEdvaUF5QUZSd1JBQTBBZ0JVRUVheUlGS0FJQUlRSWdCVUVBTmdJQUlBSUVRQ0FDRUJjTElBTWdCVWNOQUFzZ0RDZ0NDQ0VDQ3lBQUlBTTJBZ3dMQWtBQ1FBSkFJQUlvQWpnaUEwRUVTZzBBSUFBZ0EwRU1iR29pQ1NJSUtBSVlJZ0FnQ1NnQ0hFY0VRQ0FBSUFFMkFnQWdDQ0FBUVFScU5nSVlEQUVMSUFBZ0NTZ0NGQ0lLYXlJTFFRSjFJZ1JCQVdvaUEwR0FnSUNBQkU4TkFTQURJQXRCQVhVaUFDQUFJQU5KRzBILy8vLy9BeUFFUWYvLy8vOEJTUnNpQlFSL0lBVkJnSUNBZ0FSUERRTWdCVUVDZEJEcUFRVkJBQXNpQXlBRVFRSjBhaUlBSUFFMkFnQWdDMEVCVGdSQUlBTWdDaUFMRVBrQkdnc2dDU0FETmdJVUlBZ2dBRUVFYWpZQ0dDQUpJQU1nQlVFQ2RHbzJBaHdnQ2tVTkFDQUtFUGNCQ3lBQ0lBRTJBandnQmlnQ0FDRUFJQXhCQURZQ0NDQUFJQUZCQW5ScUlnQW9BZ0FoQVNBQUlBSTJBZ0FnQVFSQUlBRVFGd3NnRENnQ0NDRUFJQXhCQURZQ0NDQUFCRUFnQUJBWEN5QU1RUkJxSkFBUEN4RG5BUUFMRVBnQkFBdXpDd0VIZndKQUlBRkJBRWdOQUNBQUtBSU1JZ0lnQUNnQ0NDSURhMEVDZFNBQlRRMEFJQU1nQVVFQ2RHb2lCU2dDQUNJRUtBSThJUWNnQkNnQ09DRUdBa0FnQWlBRlFRUnFJZ05IQkVBRFFDQURLQUlBSVFnZ0EwRUFOZ0lBSUFVZ0NEWUNBQ0FFQkVBZ0JCQVhDeUFGUVFScUlRVWdBaUFEUVFScUlnTkhCRUFnQlNnQ0FDRUVEQUVMQ3lBQUtBSU1JZ0lnQlVZTkFRc0RRQ0FDUVFScklnSW9BZ0FoQXlBQ1FRQTJBZ0FnQXdSQUlBTVFGd3NnQWlBRlJ3MEFDd3NnQUNBRk5nSU1Ba0FnQUNnQ0JDSURSUTBBSUFkQkFFZ05BQ0FES0FJWUlnSWdBeWdDSENJRlJnMEFJQU5CR0dvaEF3TkFJQWNnQWlnQ0FDZ0NHRVlFUUFKQUlBSkJCR29pQlNBREtBSUVJZ2RIQkVBRFFDQUZLQUlBSVFnZ0JVRUFOZ0lBSUFJb0FnQWhCQ0FDSUFnMkFnQWdCQVJBSUFSQkRHb2dCQ2dDRUJCcklBUWdCQ2dDQkJCc0lBUVE2d0VMSUFKQkJHb2hBaUFGUVFScUlnVWdCMGNOQUFzZ0F5Z0NCQ0lGSUFKR0RRRUxBMEFnQlVFRWF5SUZLQUlBSVFRZ0JVRUFOZ0lBSUFRRVFDQUVRUXhxSUFRb0FoQVFheUFFSUFRb0FnUVFiQ0FFRU9zQkN5QUNJQVZIRFFBTEN5QURJQUkyQWdRTUFnc2dBa0VFYWlJQ0lBVkhEUUFMQ3dKQUlBWkJCRW9OQUFKQUlBQWdCa0VNYkdvaUJTZ0NGQ0lDSUFVb0FoZ2lBMFlOQUFOQUlBSW9BZ0FnQVVZTkFTQUNRUVJxSWdJZ0EwY05BQXNNQVFzZ0FpQURSZzBBSUFNZ0FrRUVhaUlFYXlJREJFQWdBaUFFSUFNUSt3RWFDeUFGSUFJZ0EybzJBaGdMQWtBZ0FDZ0NHQ0FBS0FJVUlnVnJJZ0pGRFFBZ0FrRUNkU0lEUVFFZ0EwRUJTeHNpQkVFQmNTRUhRUUFoQWlBRFFRSlBCRUFnQkVGK2NTRURBMEFnQVNBRklBSkJBblFpQkdvaUJpZ0NBQ0lJU0FSQUlBWWdDRUVCYXpZQ0FBc2dBU0FGSUFSQkJISnFJZ1FvQWdBaUJrZ0VRQ0FFSUFaQkFXczJBZ0FMSUFKQkFtb2hBaUFEUVFKcklnTU5BQXNMSUFkRkRRQWdCU0FDUVFKMGFpSUNLQUlBSWdNZ0FVd05BQ0FDSUFOQkFXczJBZ0FMQWtBZ0FDZ0NKQ0FBS0FJZ0lnVnJJZ0pGRFFBZ0FrRUNkU0lEUVFFZ0EwRUJTeHNpQkVFQmNTRUhRUUFoQWlBRFFRSlBCRUFnQkVGK2NTRURBMEFnQVNBRklBSkJBblFpQkdvaUJpZ0NBQ0lJU0FSQUlBWWdDRUVCYXpZQ0FBc2dBU0FGSUFSQkJISnFJZ1FvQWdBaUJrZ0VRQ0FFSUFaQkFXczJBZ0FMSUFKQkFtb2hBaUFEUVFKcklnTU5BQXNMSUFkRkRRQWdCU0FDUVFKMGFpSUNLQUlBSWdNZ0FVd05BQ0FDSUFOQkFXczJBZ0FMQWtBZ0FDZ0NNQ0FBS0FJc0lnVnJJZ0pGRFFBZ0FrRUNkU0lEUVFFZ0EwRUJTeHNpQkVFQmNTRUhRUUFoQWlBRFFRSlBCRUFnQkVGK2NTRURBMEFnQVNBRklBSkJBblFpQkdvaUJpZ0NBQ0lJU0FSQUlBWWdDRUVCYXpZQ0FBc2dBU0FGSUFSQkJISnFJZ1FvQWdBaUJrZ0VRQ0FFSUFaQkFXczJBZ0FMSUFKQkFtb2hBaUFEUVFKcklnTU5BQXNMSUFkRkRRQWdCU0FDUVFKMGFpSUNLQUlBSWdNZ0FVd05BQ0FDSUFOQkFXczJBZ0FMQWtBZ0FDZ0NQQ0FBS0FJNElnVnJJZ0pGRFFBZ0FrRUNkU0lEUVFFZ0EwRUJTeHNpQkVFQmNTRUhRUUFoQWlBRFFRSlBCRUFnQkVGK2NTRURBMEFnQVNBRklBSkJBblFpQkdvaUJpZ0NBQ0lJU0FSQUlBWWdDRUVCYXpZQ0FBc2dBU0FGSUFSQkJISnFJZ1FvQWdBaUJrZ0VRQ0FFSUFaQkFXczJBZ0FMSUFKQkFtb2hBaUFEUVFKcklnTU5BQXNMSUFkRkRRQWdCU0FDUVFKMGFpSUNLQUlBSWdNZ0FVd05BQ0FDSUFOQkFXczJBZ0FMSUFBb0FrZ2dBQ2dDUkNJQWF5SUNSUTBBSUFKQkFuVWlBMEVCSUFOQkFVc2JJZ1ZCQVhFaEJFRUFJUUlnQTBFQ1R3UkFJQVZCZm5FaEF3TkFJQUVnQUNBQ1FRSjBJZ1ZxSWdjb0FnQWlCa2dFUUNBSElBWkJBV3MyQWdBTElBRWdBQ0FGUVFSeWFpSUZLQUlBSWdkSUJFQWdCU0FIUVFGck5nSUFDeUFDUVFKcUlRSWdBMEVDYXlJRERRQUxDeUFFUlEwQUlBRWdBQ0FDUVFKMGFpSUFLQUlBSWdKT0RRQWdBQ0FDUVFGck5nSUFDd3NuQVFGL0lBQkJqQkUyQWdBZ0FDZ0NDQ0lCQkVBZ0FDQUJOZ0lNSUFFUTl3RUxJQUFROXdFTEJBQkJCZ3NIQUNBQkxBQVlDem9CQVg4Z0FFR0lDRFlDQUNBQUtBSVFJZ0VFUUNBQUlBRTJBaFFnQVJEM0FRc2dBQ2dDQkNJQkJFQWdBQ0FCTmdJSUlBRVE5d0VMSUFBTEF3QUFDeEFBSUFBb0FnUWdBVUVDZEdvb0FnQUxFQUFnQUNnQ0NDQUFLQUlFYTBFQ2RRc0hBQ0FBS0FJY0N3UUFRUUFMSlFFQmZ5QUFRWkFNTmdJQUlBQW9BaEFoQVNBQVFRQTJBaEFnQVFSQUlBRVFGd3NnQUFzb0FRRi9JQUJCa0F3MkFnQWdBQ2dDRUNFQklBQkJBRFlDRUNBQkJFQWdBUkFYQ3lBQUVQY0JDOVFCQVFOL0lBQkJ2QXcyQWdBZ0FDZ0NQQ0VCSUFCQkFEWUNQQ0FCQkVBZ0FTQUJLQUlBS0FJRUVRSUFDeUFBS0FJd0lnRUVRQ0FBSUFFMkFqUWdBUkQzQVFzZ0FDZ0NKQ0lDQkVBZ0FpQUFLQUlvSWdOR0JIOGdBZ1VEUUNBRFFRUnJJZ01vQWdBaEFTQURRUUEyQWdBZ0FRUkFJQUVnQVNnQ0FDZ0NCQkVDQUFzZ0FpQURSdzBBQ3lBQUtBSWtDeUVCSUFBZ0FqWUNLQ0FCRVBjQkN5QUFRWWdJTmdJQUlBQW9BaEFpQVFSQUlBQWdBVFlDRkNBQkVQY0JDeUFBS0FJRUlnRUVRQ0FBSUFFMkFnZ2dBUkQzQVFzZ0FBdlhBUUVEZnlBQVFid01OZ0lBSUFBb0Fqd2hBU0FBUVFBMkFqd2dBUVJBSUFFZ0FTZ0NBQ2dDQkJFQ0FBc2dBQ2dDTUNJQkJFQWdBQ0FCTmdJMElBRVE5d0VMSUFBb0FpUWlBZ1JBSUFJZ0FDZ0NLQ0lEUmdSL0lBSUZBMEFnQTBFRWF5SURLQUlBSVFFZ0EwRUFOZ0lBSUFFRVFDQUJJQUVvQWdBb0FnUVJBZ0FMSUFJZ0EwY05BQXNnQUNnQ0pBc2hBU0FBSUFJMkFpZ2dBUkQzQVFzZ0FFR0lDRFlDQUNBQUtBSVFJZ0VFUUNBQUlBRTJBaFFnQVJEM0FRc2dBQ2dDQkNJQkJFQWdBQ0FCTmdJSUlBRVE5d0VMSUFBUTl3RUxSQUVCZndKL1FRQWdBQ2dDRkNBQUtBSVFJZ0pyUVFKMUlBRk1EUUFhUVFBZ0FpQUJRUUowYWlnQ0FDSUJRUUJJRFFBYUlBQW9BaVFnQVVFQ2RHb29BZ0FRSVFzTFRRRUJmeUFBUWZnTU5nSUFJQUFvQWhRaEFTQUFRUUEyQWhRZ0FRUkFJQUVnQVNnQ0FDZ0NCQkVDQUFzZ0FFR1FERFlDQUNBQUtBSVFJUUVnQUVFQU5nSVFJQUVFUUNBQkVCY0xJQUFMVUFFQmZ5QUFRZmdNTmdJQUlBQW9BaFFoQVNBQVFRQTJBaFFnQVFSQUlBRWdBU2dDQUNnQ0JCRUNBQXNnQUVHUUREWUNBQ0FBS0FJUUlRRWdBRUVBTmdJUUlBRUVRQ0FCRUJjTElBQVE5d0VMQ2dBZ0FDZ0NDQ3dBR0F0ekFRRi9JQUJCakJFMkFoZ2dBRUcwRFRZQ0FDQUFLQUlnSWdFRVFDQUFJQUUyQWlRZ0FSRDNBUXNnQUVINEREWUNBQ0FBS0FJVUlRRWdBRUVBTmdJVUlBRUVRQ0FCSUFFb0FnQW9BZ1FSQWdBTElBQkJrQXcyQWdBZ0FDZ0NFQ0VCSUFCQkFEWUNFQ0FCQkVBZ0FSQVhDeUFBQzNZQkFYOGdBRUdNRVRZQ0dDQUFRYlFOTmdJQUlBQW9BaUFpQVFSQUlBQWdBVFlDSkNBQkVQY0JDeUFBUWZnTU5nSUFJQUFvQWhRaEFTQUFRUUEyQWhRZ0FRUkFJQUVnQVNnQ0FDZ0NCQkVDQUFzZ0FFR1FERFlDQUNBQUtBSVFJUUVnQUVFQU5nSVFJQUVFUUNBQkVCY0xJQUFROXdFTEJBQkJBQXVvQVFFRGZ5QUFRZmdOTmdJQUlBQW9BakFoQVNBQVFRQTJBakFnQVFSQUlBRWdBU2dDQUNnQ0JCRUNBQXNnQUVHRUVEWUNBQ0FBS0FJVUlnRUVRQ0FBSUFFMkFoZ2dBUkQzQVFzZ0FDZ0NDQ0lDQkVBZ0FpQUFLQUlNSWdOR0JIOGdBZ1VEUUNBRFFRUnJJZ01vQWdBaEFTQURRUUEyQWdBZ0FRUkFJQUVnQVNnQ0FDZ0NCQkVDQUFzZ0FpQURSdzBBQ3lBQUtBSUlDeUVCSUFBZ0FqWUNEQ0FCRVBjQkN5QUFDNnNCQVFOL0lBQkIrQTAyQWdBZ0FDZ0NNQ0VCSUFCQkFEWUNNQ0FCQkVBZ0FTQUJLQUlBS0FJRUVRSUFDeUFBUVlRUU5nSUFJQUFvQWhRaUFRUkFJQUFnQVRZQ0dDQUJFUGNCQ3lBQUtBSUlJZ0lFUUNBQ0lBQW9BZ3dpQTBZRWZ5QUNCUU5BSUFOQkJHc2lBeWdDQUNFQklBTkJBRFlDQUNBQkJFQWdBU0FCS0FJQUtBSUVFUUlBQ3lBQ0lBTkhEUUFMSUFBb0FnZ0xJUUVnQUNBQ05nSU1JQUVROXdFTElBQVE5d0VMRkFBZ0FDZ0NNQ0lBSUFBb0FnQW9BaVFSQUFBTEZnQWdBQ2dDTUNJQUlBRWdBQ2dDQUNnQ0RCRUJBQXNXQUNBQUtBSXdJZ0FnQVNBQUtBSUFLQUlRRVFFQUM2Y0VBUU4vSUFCQnRBNDJBZ0FnQUNnQzhBSWhBU0FBUVFBMkF2QUNJQUVFUUNBQlFRUnJFT3NCQ3lBQUtBTFlBU0lEQkVBZ0F5QUFLQUxjQVNJQ1JnUi9JQU1GQTBBZ0FrRU1heWdDQUNJQkJFQWdBa0VJYXlBQk5nSUFJQUVROXdFTElBSkJIR3NvQWdBaUFRUkFJQUpCR0dzZ0FUWUNBQ0FCRVBjQkN5QUNRU2hyS0FJQUlnRUVRQ0FDUVNScklBRTJBZ0FnQVJEM0FRc2dBa0dNQVdzUVdDQUNRWkFCYXlJQklRSWdBU0FEUncwQUN5QUFLQUxZQVFzaEFTQUFJQU0yQXR3QklBRVE5d0VMSUFBb0FzUUJJZ0VFUUNBQUlBRTJBc2dCSUFFUTl3RUxJQUFvQXJnQklnRUVRQ0FBSUFFMkFyd0JJQUVROXdFTElBQW9BcXdCSWdFRVFDQUFJQUUyQXJBQklBRVE5d0VMSUFBb0FxQUJJZ0VFUUNBQUlBRTJBcVFCSUFFUTl3RUxJQUFvQXBBQklnSUVRQU5BSUFJb0FnQWhBU0FDRVBjQklBRWlBZzBBQ3dzZ0FDZ0NpQUVoQVNBQVFRQTJBb2dCSUFFRVFDQUJFUGNCQ3lBQUtBSjRJZ0VFUUNBQkVQY0JDeUFBS0FKc0lnRUVRQ0FCRVBjQkN5QUFLQUpnSWdFRVFDQUJFUGNCQ3lBQUtBSklJZ0VFUUNBQUlBRTJBa3dnQVJEM0FRc2dBQ2dDUENJQkJFQWdBUkQzQVFzZ0FDZ0NNQ0lCQkVBZ0FDQUJOZ0kwSUFFUTl3RUxJQUFvQWlRaUFRUkFJQUFnQVRZQ0tDQUJFUGNCQ3lBQUtBSVlJZ0VFUUNBQUlBRTJBaHdnQVJEM0FRc2dBQ2dDRENJQkJFQWdBQ0FCTmdJUUlBRVE5d0VMSUFBb0FnZ2hBU0FBUVFBMkFnZ2dBUVJBSUFFUVNRc2dBQXNLQUNBQUVJNEJFUGNCQzc4RUFRTi9JQUJCNkE0MkFnQWdBQ2dDaEFNaUFRUkFJQUFnQVRZQ2lBTWdBUkQzQVFzZ0FDZ0M4QUloQVNBQVFRQTJBdkFDSUFFRVFDQUJRUVJyRU9zQkN5QUFLQUxZQVNJREJFQWdBeUFBS0FMY0FTSUNSZ1IvSUFNRkEwQWdBa0VNYXlnQ0FDSUJCRUFnQWtFSWF5QUJOZ0lBSUFFUTl3RUxJQUpCSEdzb0FnQWlBUVJBSUFKQkdHc2dBVFlDQUNBQkVQY0JDeUFDUVNocktBSUFJZ0VFUUNBQ1FTUnJJQUUyQWdBZ0FSRDNBUXNnQWtHTUFXc1FXQ0FDUVpBQmF5SUJJUUlnQVNBRFJ3MEFDeUFBS0FMWUFRc2hBU0FBSUFNMkF0d0JJQUVROXdFTElBQW9Bc1FCSWdFRVFDQUFJQUUyQXNnQklBRVE5d0VMSUFBb0FyZ0JJZ0VFUUNBQUlBRTJBcndCSUFFUTl3RUxJQUFvQXF3QklnRUVRQ0FBSUFFMkFyQUJJQUVROXdFTElBQW9BcUFCSWdFRVFDQUFJQUUyQXFRQklBRVE5d0VMSUFBb0FwQUJJZ0lFUUFOQUlBSW9BZ0FoQVNBQ0VQY0JJQUVpQWcwQUN3c2dBQ2dDaUFFaEFTQUFRUUEyQW9nQklBRUVRQ0FCRVBjQkN5QUFLQUo0SWdFRVFDQUJFUGNCQ3lBQUtBSnNJZ0VFUUNBQkVQY0JDeUFBS0FKZ0lnRUVRQ0FCRVBjQkN5QUFLQUpJSWdFRVFDQUFJQUUyQWt3Z0FSRDNBUXNnQUNnQ1BDSUJCRUFnQVJEM0FRc2dBQ2dDTUNJQkJFQWdBQ0FCTmdJMElBRVE5d0VMSUFBb0FpUWlBUVJBSUFBZ0FUWUNLQ0FCRVBjQkN5QUFLQUlZSWdFRVFDQUFJQUUyQWh3Z0FSRDNBUXNnQUNnQ0RDSUJCRUFnQUNBQk5nSVFJQUVROXdFTElBQW9BZ2doQVNBQVFRQTJBZ2dnQVFSQUlBRVFTUXNnQUFzS0FDQUFFSkFCRVBjQkM3SUZBUVIvSUFCQm1BODJBZ0FnQUNnQ3JBTWlBUVJBSUFBZ0FUWUNzQU1nQVJEM0FRc2dBQ2dDb0FNaUF3UkFJQU1nQUNnQ3BBTWlBVVlFZnlBREJRTkFJQUZCREdzaUFpZ0NBQ0lFQkVBZ0FVRUlheUFFTmdJQUlBUVE5d0VMSUFJaUFTQURSdzBBQ3lBQUtBS2dBd3NoQVNBQUlBTTJBcVFESUFFUTl3RUxJQUFvQW9RRElnRUVRQ0FBSUFFMkFvZ0RJQUVROXdFTElBQW9BdkFDSVFFZ0FFRUFOZ0x3QWlBQkJFQWdBVUVFYXhEckFRc2dBQ2dDMkFFaUF3UkFJQU1nQUNnQzNBRWlBVVlFZnlBREJRTkFJQUZCREdzb0FnQWlBZ1JBSUFGQkNHc2dBallDQUNBQ0VQY0JDeUFCUVJ4cktBSUFJZ0lFUUNBQlFSaHJJQUkyQWdBZ0FoRDNBUXNnQVVFb2F5Z0NBQ0lDQkVBZ0FVRWtheUFDTmdJQUlBSVE5d0VMSUFGQmpBRnJFRmdnQVVHUUFXc2lBaUVCSUFJZ0EwY05BQXNnQUNnQzJBRUxJUUVnQUNBRE5nTGNBU0FCRVBjQkN5QUFLQUxFQVNJQkJFQWdBQ0FCTmdMSUFTQUJFUGNCQ3lBQUtBSzRBU0lCQkVBZ0FDQUJOZ0s4QVNBQkVQY0JDeUFBS0FLc0FTSUJCRUFnQUNBQk5nS3dBU0FCRVBjQkN5QUFLQUtnQVNJQkJFQWdBQ0FCTmdLa0FTQUJFUGNCQ3lBQUtBS1FBU0lCQkVBRFFDQUJLQUlBSVFNZ0FSRDNBU0FESWdFTkFBc0xJQUFvQW9nQklRRWdBRUVBTmdLSUFTQUJCRUFnQVJEM0FRc2dBQ2dDZUNJQkJFQWdBUkQzQVFzZ0FDZ0NiQ0lCQkVBZ0FSRDNBUXNnQUNnQ1lDSUJCRUFnQVJEM0FRc2dBQ2dDU0NJQkJFQWdBQ0FCTmdKTUlBRVE5d0VMSUFBb0Fqd2lBUVJBSUFFUTl3RUxJQUFvQWpBaUFRUkFJQUFnQVRZQ05DQUJFUGNCQ3lBQUtBSWtJZ0VFUUNBQUlBRTJBaWdnQVJEM0FRc2dBQ2dDR0NJQkJFQWdBQ0FCTmdJY0lBRVE5d0VMSUFBb0Fnd2lBUVJBSUFBZ0FUWUNFQ0FCRVBjQkN5QUFLQUlJSVFFZ0FFRUFOZ0lJSUFFRVFDQUJFRWtMSUFBTENnQWdBQkNTQVJEM0FRdUFBUUVEZnlBQVFZUVFOZ0lBSUFBb0FoUWlBUVJBSUFBZ0FUWUNHQ0FCRVBjQkN5QUFLQUlJSWdJRVFDQUNJQUFvQWd3aUEwWUVmeUFDQlFOQUlBTkJCR3NpQXlnQ0FDRUJJQU5CQURZQ0FDQUJCRUFnQVNBQktBSUFLQUlFRVFJQUN5QUNJQU5IRFFBTElBQW9BZ2dMSVFFZ0FDQUNOZ0lNSUFFUTl3RUxJQUFMZ3dFQkEzOGdBRUdFRURZQ0FDQUFLQUlVSWdFRVFDQUFJQUUyQWhnZ0FSRDNBUXNnQUNnQ0NDSUNCRUFnQWlBQUtBSU1JZ05HQkg4Z0FnVURRQ0FEUVFScklnTW9BZ0FoQVNBRFFRQTJBZ0FnQVFSQUlBRWdBU2dDQUNnQ0JCRUNBQXNnQWlBRFJ3MEFDeUFBS0FJSUN5RUJJQUFnQWpZQ0RDQUJFUGNCQ3lBQUVQY0JDK1lCQVFOL0lBQkI5QkEyQWdBZ0FDZ0NSQ0lCQkVBZ0FDQUJOZ0pJSUFFUTl3RUxJQUFvQWpnaUFRUkFJQUFnQVRZQ1BDQUJFUGNCQ3lBQUtBSXNJZ0VFUUNBQUlBRTJBakFnQVJEM0FRc2dBQ2dDSUNJQkJFQWdBQ0FCTmdJa0lBRVE5d0VMSUFBb0FoUWlBUVJBSUFBZ0FUWUNHQ0FCRVBjQkN5QUFLQUlJSWdJRVFDQUNJQUFvQWd3aUEwWUVmeUFDQlFOQUlBTkJCR3NpQXlnQ0FDRUJJQU5CQURZQ0FDQUJCRUFnQVJBWEN5QUNJQU5IRFFBTElBQW9BZ2dMSVFFZ0FDQUNOZ0lNSUFFUTl3RUxJQUFvQWdRaEFTQUFRUUEyQWdRZ0FRUkFJQUVRYVFzZ0FBc0tBQ0FBRUpZQkVQY0JDMEFCQVg4Z0FFSGNFRFlDQUNBQUtBSmdJZ0VFUUNBQUlBRTJBbVFnQVJEM0FRc2dBQ2dDVkNJQkJFQWdBQ0FCTmdKWUlBRVE5d0VMSUFBUWxnRWFJQUFMUXdFQmZ5QUFRZHdRTmdJQUlBQW9BbUFpQVFSQUlBQWdBVFlDWkNBQkVQY0JDeUFBS0FKVUlnRUVRQ0FBSUFFMkFsZ2dBUkQzQVFzZ0FCQ1dBUm9nQUJEM0FRdXZCQUVIZnlBQUlBRWdBaEJ6QWtBZ0FDZ0NXQ0FBS0FKVUlnSnJRUUoxSWdNZ0FVb05BQ0FESUFGQkFXb2lBVWtFUUFKQUlBRWdBMnNpQXlBQUtBSmNJZ1FnQUNnQ1dDSUNhMEVDZFUwRVFBSkFJQU5GRFFBZ0FpRUJJQU5CQW5SQkJHc2lCVUVDZGtFQmFrRUhjU0lFQkVBRFFDQUJRUUUyQWdBZ0FVRUVhaUVCSUFSQkFXc2lCQTBBQ3dzZ0EwRUNkQ0FDYWlFQ0lBVkJIRWtOQUFOQUlBRkNnWUNBZ0JBM0FoZ2dBVUtCZ0lDQUVEY0NFQ0FCUW9HQWdJQVFOd0lJSUFGQ2dZQ0FnQkEzQWdBZ0FVRWdhaUlCSUFKSERRQUxDeUFBSUFJMkFsZ01BUXNDUUNBQ0lBQW9BbFFpQldzaUNFRUNkU0lDSUFOcUlnRkJnSUNBZ0FSSkJFQWdBU0FFSUFWcklnUkJBWFVpQmlBQklBWkxHMEgvLy8vL0F5QUVRUUoxUWYvLy8vOEJTUnNpQmdSL0lBWkJnSUNBZ0FSUERRSWdCa0VDZEJEcUFRVkJBQXNpQnlBQ1FRSjBhaUlDSVFFZ0EwRUNkQ0lEUVFScklnbEJBblpCQVdwQkIzRWlCQVJBSUFJaEFRTkFJQUZCQVRZQ0FDQUJRUVJxSVFFZ0JFRUJheUlFRFFBTEN5QUNJQU5xSVFJZ0NVRWNUd1JBQTBBZ0FVS0JnSUNBRURjQ0dDQUJRb0dBZ0lBUU53SVFJQUZDZ1lDQWdCQTNBZ2dnQVVLQmdJQ0FFRGNDQUNBQlFTQnFJZ0VnQWtjTkFBc0xJQWhCQVU0RVFDQUhJQVVnQ0JENUFSb0xJQUFnQnlBR1FRSjBhallDWENBQUlBSTJBbGdnQUNBSE5nSlVJQVVFUUNBRkVPc0JDd3dDQ3hEbkFRQUxFUGdCQUFzUEN5QUJJQU5QRFFBZ0FDQUNJQUZCQW5ScU5nSllDd3RXQVFKL0lBQWdBUkIwQWtBZ0FVRUFTQTBBSUFBb0FsZ2lBaUFBS0FKVUlnTnJRUUoxSUFGTURRQWdBaUFESUFGQkFuUnFJZ0ZCQkdvaUEyc2lBZ1JBSUFFZ0F5QUNFUHNCR2dzZ0FDQUJJQUpxTmdKWUN3dE5BUUYvSUFCQnpCTTJBZ0FnQUNnQ01DSUJCRUFnQUNBQk5nSTBJQUVROXdFTElBQkI0Qk0yQWdBZ0FDZ0NKQ0lCQkVBZ0FSRDNBUXNnQUNnQ0dDSUJCRUFnQVJEM0FRc2dBQkQzQVFzc0FRRi9JQUJCNEJNMkFnQWdBQ2dDSkNJQkJFQWdBUkQzQVFzZ0FDZ0NHQ0lCQkVBZ0FSRDNBUXNnQUFzdkFRRi9JQUJCNEJNMkFnQWdBQ2dDSkNJQkJFQWdBUkQzQVFzZ0FDZ0NHQ0lCQkVBZ0FSRDNBUXNnQUJEM0FRc0VBQ0FBQ3djQUlBQVE2d0VMRlFBZ0FVRUJPZ0JVSUFFZ0FTZ0NSRFlDU0VFQkM3RUJBUVYvQWtBQ1FDQUFLQUlJSWdGQkFFZ05BQUovSUFBb0FnUWlBaWdDQkNBQ0tBSUFJZ1JyUVFKMUlnTWdBVWtFUUNBQ0lBRWdBMnNRQ2lBQUtBSUlEQUVMSUFFZ0FTQURUdzBBR2lBQ0lBUWdBVUVDZEdvMkFnUWdBUXNpQlVFQlNBMEFJQUFvQWdRaUFpZ0NCQ0FDS0FJQUlnTnJRUUoxSVFSQkFDRUFBMEFnQUNBRVJnMENJQU1nQUVFQ2RHb2dBRFlDQUNBQVFRRnFJZ0FnQlVjTkFBc0xJQUZCZjNOQkgzWVBDeERuQVFBTG5oSUJCSDhDUUNBRFJRMEFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBQW9BaHhCQVdzT0N3QUJBZ01FQlFZSENBa0tEQXNDUUNBQ0lBQXNBQmdpQkNBQ0lBUklHMEVCU0EwQUlBQW9BZ0FpQkNnQ0FDSUhJQUFwQXpBZ0FDa0RLQ0FCclg1OHB5SUZhaUVCSUFRb0FnUWlCaUFIYXlFRUlBQXRBQ0JGQkVBZ0JDQUZUQTBOUVFBaEJRTkFJQU1nQlVFQ2RHb2dBU3dBQUxJNEFnQWdCVUVCYWlJRklBSWdBQ3dBR0NJRUlBSWdCRWdiVGcwQ0lBWWdBVUVCYWlJQlN3MEFDd3dOQ3lBRUlBVk1EUXhCQUNFRkEwQWdBeUFGUVFKMGFpQUJMQUFBc2tNQUFQNUNsVGdDQUNBRlFRRnFJZ1VnQWlBQUxBQVlJZ1FnQWlBRVNCdE9EUUVnQmlBQlFRRnFJZ0ZMRFFBTERBd0xJQUlnQkVvTkNnd0xDd0pBSUFJZ0FDd0FHQ0lFSUFJZ0JFZ2JRUUZJRFFBZ0FDZ0NBQ0lFS0FJQUlnY2dBQ2tETUNBQUtRTW9JQUd0Zm55bklnVnFJUUVnQkNnQ0JDSUdJQWRySVFRZ0FDMEFJRVVFUUNBRUlBVk1EUXhCQUNFRkEwQWdBeUFGUVFKMGFpQUJMUUFBc3pnQ0FDQUZRUUZxSWdVZ0FpQUFMQUFZSWdRZ0FpQUVTQnRPRFFJZ0JpQUJRUUZxSWdGTERRQUxEQXdMSUFRZ0JVd05DMEVBSVFVRFFDQURJQVZCQW5ScUlBRXRBQUN6UXdBQWYwT1ZPQUlBSUFWQkFXb2lCU0FDSUFBc0FCZ2lCQ0FDSUFSSUcwNE5BU0FHSUFGQkFXb2lBVXNOQUFzTUN3c2dBaUFFU2cwSkRBb0xBa0FnQWlBQUxBQVlJZ1FnQWlBRVNCdEJBVWdOQUNBQUtBSUFJZ1FvQWdBaUJ5QUFLUU13SUFBcEF5Z2dBYTErZktjaUJXb2hBU0FFS0FJRUlnWWdCMnNoQkNBQUxRQWdSUVJBSUFRZ0JVd05DMEVBSVFVRFFDQURJQVZCQW5ScUlBRXVBUUN5T0FJQUlBVkJBV29pQlNBQ0lBQXNBQmdpQkNBQ0lBUklHMDROQWlBR0lBRkJBbW9pQVVzTkFBc01Dd3NnQkNBRlRBMEtRUUFoQlFOQUlBTWdCVUVDZEdvZ0FTNEJBTEpEQVA3L1JwVTRBZ0FnQlVFQmFpSUZJQUlnQUN3QUdDSUVJQUlnQkVnYlRnMEJJQVlnQVVFQ2FpSUJTdzBBQ3d3S0N5QUNJQVJLRFFnTUNRc0NRQ0FDSUFBc0FCZ2lCQ0FDSUFSSUcwRUJTQTBBSUFBb0FnQWlCQ2dDQUNJSElBQXBBekFnQUNrREtDQUJyWDU4cHlJRmFpRUJJQVFvQWdRaUJpQUhheUVFSUFBdEFDQkZCRUFnQkNBRlRBMEtRUUFoQlFOQUlBTWdCVUVDZEdvZ0FTOEJBTE00QWdBZ0JVRUJhaUlGSUFJZ0FDd0FHQ0lFSUFJZ0JFZ2JUZzBDSUFZZ0FVRUNhaUlCU3cwQUN3d0tDeUFFSUFWTURRbEJBQ0VGQTBBZ0F5QUZRUUowYWlBQkx3RUFzME1BLzM5SGxUZ0NBQ0FGUVFGcUlnVWdBaUFBTEFBWUlnUWdBaUFFU0J0T0RRRWdCaUFCUVFKcUlnRkxEUUFMREFrTElBSWdCRW9OQnd3SUN3SkFJQUlnQUN3QUdDSUVJQUlnQkVnYlFRRklEUUFnQUNnQ0FDSUVLQUlBSWdjZ0FDa0RNQ0FBS1FNb0lBR3RmbnluSWdWcUlRRWdCQ2dDQkNJR0lBZHJJUVFnQUMwQUlFVUVRQ0FFSUFWTURRbEJBQ0VGQTBBZ0F5QUZRUUowYWlBQktBSUFzamdDQUNBRlFRRnFJZ1VnQWlBQUxBQVlJZ1FnQWlBRVNCdE9EUUlnQmlBQlFRUnFJZ0ZMRFFBTERBa0xJQVFnQlV3TkNFRUFJUVVEUUNBRElBVkJBblJxSUFFb0FnQ3lRd0FBQURDVU9BSUFJQVZCQVdvaUJTQUNJQUFzQUJnaUJDQUNJQVJJRzA0TkFTQUdJQUZCQkdvaUFVc05BQXNNQ0FzZ0FpQUVTZzBHREFjTEFrQWdBaUFBTEFBWUlnUWdBaUFFU0J0QkFVZ05BQ0FBS0FJQUlnUW9BZ0FpQnlBQUtRTXdJQUFwQXlnZ0FhMStmS2NpQldvaEFTQUVLQUlFSWdZZ0Iyc2hCQ0FBTFFBZ1JRUkFJQVFnQlV3TkNFRUFJUVVEUUNBRElBVkJBblJxSUFFb0FnQ3pPQUlBSUFWQkFXb2lCU0FDSUFBc0FCZ2lCQ0FDSUFSSUcwNE5BaUFHSUFGQkJHb2lBVXNOQUFzTUNBc2dCQ0FGVEEwSFFRQWhCUU5BSUFNZ0JVRUNkR29nQVNnQ0FMTkRBQUNBTDVRNEFnQWdCVUVCYWlJRklBSWdBQ3dBR0NJRUlBSWdCRWdiVGcwQklBWWdBVUVFYWlJQlN3MEFDd3dIQ3lBQ0lBUktEUVVNQmdzQ1FDQUNJQUFzQUJnaUJDQUNJQVJJRzBFQlNBMEFJQUFvQWdBaUJDZ0NBQ0lISUFBcEF6QWdBQ2tES0NBQnJYNThweUlGYWlFQklBUW9BZ1FpQmlBSGF5RUVJQUF0QUNCRkJFQWdCQ0FGVEEwSFFRQWhCUU5BSUFNZ0JVRUNkR29nQVNrREFMUTRBZ0FnQlVFQmFpSUZJQUlnQUN3QUdDSUVJQUlnQkVnYlRnMENJQVlnQVVFSWFpSUJTdzBBQ3d3SEN5QUVJQVZNRFFaQkFDRUZBMEFnQXlBRlFRSjBhaUFCS1FNQXRFTUFBQUFnbERnQ0FDQUZRUUZxSWdVZ0FpQUFMQUFZSWdRZ0FpQUVTQnRPRFFFZ0JpQUJRUWhxSWdGTERRQUxEQVlMSUFJZ0JFb05CQXdGQ3dKQUlBSWdBQ3dBR0NJRUlBSWdCRWdiUVFGSURRQWdBQ2dDQUNJRUtBSUFJZ2NnQUNrRE1DQUFLUU1vSUFHdGZueW5JZ1ZxSVFFZ0JDZ0NCQ0lHSUFkcklRUWdBQzBBSUVVRVFDQUVJQVZNRFFaQkFDRUZBMEFnQXlBRlFRSjBhaUFCS1FNQXRUZ0NBQ0FGUVFGcUlnVWdBaUFBTEFBWUlnUWdBaUFFU0J0T0RRSWdCaUFCUVFocUlnRkxEUUFMREFZTElBUWdCVXdOQlVFQUlRVURRQ0FESUFWQkFuUnFJQUVwQXdDMVF3QUFnQitVT0FJQUlBVkJBV29pQlNBQ0lBQXNBQmdpQkNBQ0lBUklHMDROQVNBR0lBRkJDR29pQVVzTkFBc01CUXNnQWlBRVNnMEREQVFMSUFJZ0FDd0FHQ0lFSUFJZ0JFZ2JRUUZPQkVBZ0FDZ0NBQ0lGS0FJQUlBQXBBekFnQUNrREtDQUJyWDU4cDJvaEFTQUZLQUlFSVFaQkFDRUZBMEFnQVNBR1R3MEZJQU1nQlVFQ2RHb2dBU29DQURnQ0FDQUJRUVJxSVFFZ0JVRUJhaUlGSUFJZ0FDd0FHQ0lFSUFJZ0JFZ2JTQTBBQ3dzZ0FpQUVTZzBDREFNTElBSWdBQ3dBR0NJRUlBSWdCRWdiUVFGT0JFQWdBQ2dDQUNJRktBSUFJQUFwQXpBZ0FDa0RLQ0FCclg1OHAyb2hBU0FGS0FJRUlRWkJBQ0VGQTBBZ0FTQUdUdzBFSUFNZ0JVRUNkR29nQVNzREFMWTRBZ0FnQVVFSWFpRUJJQVZCQVdvaUJTQUNJQUFzQUJnaUJDQUNJQVJJRzBnTkFBc0xJQUlnQkVvTkFRd0NDeUFDSUFBc0FCZ2lCQ0FDSUFSSUcwRUJUZ1JBSUFBb0FnQWlCaWdDQUNBQUtRTXdJQUFwQXlnZ0FhMStmS2RxSVFFRFFDQUJJQVlvQWdSUERRTWdBeUFGUVFKMGFrTUFBSUEvUXdBQUFBQWdBUzBBQUJzNEFnQWdBVUVCYWlFQklBVkJBV29pQlNBQ0lBQXNBQmdpQkNBQ0lBUklHMGdOQUFzTElBSWdCRXdOQVFzZ0F5QUVRUUowYWtFQUlBSWdCR3RCQW5RUStnRWFDd3YvQ3dRRGZ3RitBWDBCZkFKQUlBTkZEUUFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBQ2dDSEVFQmF3NExBQUVDQXdRRkJnY0lDUW9NQ3lBQ0lBQXNBQmdpQkNBQ0lBUklHMEVCVGdSQUlBQW9BZ0FpQkNnQ0FDQUFLUU13SUFBcEF5Z2dBYTErZktkcUlRRWdCQ2dDQkNFR0EwQWdBU0FHVHcwTklBTWdCVUVEZEdvZ0FUQUFBRGNEQUNBQlFRRnFJUUVnQlVFQmFpSUZJQUlnQUN3QUdDSUVJQUlnQkVnYlNBMEFDd3NnQWlBRVNnMEtEQXNMSUFJZ0FDd0FHQ0lFSUFJZ0JFZ2JRUUZPQkVBZ0FDZ0NBQ0lFS0FJQUlBQXBBekFnQUNrREtDQUJyWDU4cDJvaEFTQUVLQUlFSVFZRFFDQUJJQVpQRFF3Z0F5QUZRUU4wYWlBQk1RQUFOd01BSUFGQkFXb2hBU0FGUVFGcUlnVWdBaUFBTEFBWUlnUWdBaUFFU0J0SURRQUxDeUFDSUFSS0RRa01DZ3NnQWlBQUxBQVlJZ1FnQWlBRVNCdEJBVTRFUUNBQUtBSUFJZ1FvQWdBZ0FDa0RNQ0FBS1FNb0lBR3RmbnluYWlFQklBUW9BZ1FoQmdOQUlBRWdCazhOQ3lBRElBVkJBM1JxSUFFeUFRQTNBd0FnQVVFQ2FpRUJJQVZCQVdvaUJTQUNJQUFzQUJnaUJDQUNJQVJJRzBnTkFBc0xJQUlnQkVvTkNBd0pDeUFDSUFBc0FCZ2lCQ0FDSUFSSUcwRUJUZ1JBSUFBb0FnQWlCQ2dDQUNBQUtRTXdJQUFwQXlnZ0FhMStmS2RxSVFFZ0JDZ0NCQ0VHQTBBZ0FTQUdUdzBLSUFNZ0JVRURkR29nQVRNQkFEY0RBQ0FCUVFKcUlRRWdCVUVCYWlJRklBSWdBQ3dBR0NJRUlBSWdCRWdiU0EwQUN3c2dBaUFFU2cwSERBZ0xJQUlnQUN3QUdDSUVJQUlnQkVnYlFRRk9CRUFnQUNnQ0FDSUVLQUlBSUFBcEF6QWdBQ2tES0NBQnJYNThwMm9oQVNBRUtBSUVJUVlEUUNBQklBWlBEUWtnQXlBRlFRTjBhaUFCTkFJQU53TUFJQUZCQkdvaEFTQUZRUUZxSWdVZ0FpQUFMQUFZSWdRZ0FpQUVTQnRJRFFBTEN5QUNJQVJLRFFZTUJ3c2dBaUFBTEFBWUlnUWdBaUFFU0J0QkFVNEVRQ0FBS0FJQUlnUW9BZ0FnQUNrRE1DQUFLUU1vSUFHdGZueW5haUVCSUFRb0FnUWhCZ05BSUFFZ0JrOE5DQ0FESUFWQkEzUnFJQUUxQWdBM0F3QWdBVUVFYWlFQklBVkJBV29pQlNBQ0lBQXNBQmdpQkNBQ0lBUklHMGdOQUFzTElBSWdCRW9OQlF3R0N5QUNJQUFzQUJnaUJDQUNJQVJJRzBFQlRnUkFJQUFvQWdBaUJDZ0NBQ0FBS1FNd0lBQXBBeWdnQWExK2ZLZHFJUUVnQkNnQ0JDRUdBMEFnQVNBR1R3MEhJQU1nQlVFRGRHb2dBU2tEQURjREFDQUJRUWhxSVFFZ0JVRUJhaUlGSUFJZ0FDd0FHQ0lFSUFJZ0JFZ2JTQTBBQ3dzZ0FpQUVTZzBFREFVTElBSWdBQ3dBR0NJRUlBSWdCRWdiUVFGT0JFQWdBQ2dDQUNJRUtBSUFJQUFwQXpBZ0FDa0RLQ0FCclg1OHAyb2hBU0FFS0FJRUlRWURRQ0FCSUFaUERRWWdBU2tEQUNJSFFnQlREUVlnQXlBRlFRTjBhaUFITndNQUlBRkJDR29oQVNBRlFRRnFJZ1VnQWlBQUxBQVlJZ1FnQWlBRVNCdElEUUFMQ3lBQ0lBUktEUU1NQkFzZ0FpQUFMQUFZSWdRZ0FpQUVTQnRCQVU0RVFDQUFLQUlBSWdRb0FnQWdBQ2tETUNBQUtRTW9JQUd0Zm55bmFpRUJJQVFvQWdRaEJnTkFJQUVnQms4TkJTQURJQVZCQTNScUFuNGdBU29DQUNJSWkwTUFBQUJmWFFSQUlBaXVEQUVMUW9DQWdJQ0FnSUNBZ0g4TE53TUFJQUZCQkdvaEFTQUZRUUZxSWdVZ0FpQUFMQUFZSWdRZ0FpQUVTQnRJRFFBTEN5QUNJQVJLRFFJTUF3c2dBaUFBTEFBWUlnUWdBaUFFU0J0QkFVNEVRQ0FBS0FJQUlnUW9BZ0FnQUNrRE1DQUFLUU1vSUFHdGZueW5haUVCSUFRb0FnUWhCZ05BSUFFZ0JrOE5CQ0FESUFWQkEzUnFBbjRnQVNzREFDSUptVVFBQUFBQUFBRGdRMk1FUUNBSnNBd0JDMEtBZ0lDQWdJQ0FnSUIvQ3pjREFDQUJRUWhxSVFFZ0JVRUJhaUlGSUFJZ0FDd0FHQ0lFSUFJZ0JFZ2JTQTBBQ3dzZ0FpQUVTZzBCREFJTElBSWdBQ3dBR0NJRUlBSWdCRWdiUVFGT0JFQWdBQ2dDQUNJRUtBSUFJQUFwQXpBZ0FDa0RLQ0FCclg1OHAyb2hBU0FFS0FJRUlRWURRQ0FCSUFaUERRTWdBeUFGUVFOMGFpQUJNUUFBTndNQUlBRkJBV29oQVNBRlFRRnFJZ1VnQWlBQUxBQVlJZ1FnQWlBRVNCdElEUUFMQ3lBQ0lBUk1EUUVMSUFNZ0JFRURkR3BCQUNBQ0lBUnJRUU4wRVBvQkdnc0xKd0VCZnlBQVFkd1VOZ0lBSUFBb0FpQWlBUVJBSUFBZ0FUWUNKQ0FCRVBjQkN5QUFFUGNCQ3lzQkFYOENRQ0FBS0FJc1JRMEFJQUFvQWpCRkRRQWdBQ2dDTkVVTkFDQUFLQUk0UVFCSElRRUxJQUVMQkFCQmZ3dTFBUUlEZmdOL0FrQWdBU2tEQ0NJRUlBRXBBeEFpQWtJRWZDSURVdzBBSUFFb0FnQWlCaUFDcDJvb0FBQWhCU0FCSUFNM0F4QWdCQ0FDUWdoOElnSlREUUFnQmlBRHAyb29BQUFoQmlBQklBSTNBeEFnQlNBR1NnMEFJQUFnQmpZQ0VDQUFJQVUyQWd3Z0Jxd2dCYXg5SWdKQy92Ly8vd2RXRFFCQkFTRUhJQUFnQXFkQkFXb2lBVFlDRkNBQUlBRkJBWFlpQlRZQ0dDQUFRUUFnQldzMkFod2dBVUVCY1EwQUlBQWdCVUVCYXpZQ0dBc2dCd3VYQ3dFUGZ5QUFJQVEyQWdnQ2Z5QUVJQUFvQWlRZ0FFRWdhaUlES0FJQUlneHJRUUoxSWdWTEJFQWdBeUFFSUFWckVBb2dBeWdDQUNFTUlBQW9BZ2dNQVFzZ0JDQUZTUVJBSUFBZ0RDQUVRUUowYWpZQ0pBc2dCQXNoQXlBQUtBSTBJUkFnQUNnQ01DRVBRWDhnQkVFQ2RDQUVRZi8vLy84RGNTQUVSeHNpQlJEcUFVRUFJQVVRK2dFaERRSkFJQU5CQVVnTkFBTkFBa0FnRFNBR1FRSjBJZ05xS0FJQUlnVWdBQ2dDRUNJSlNnUkFJQU1nREdvZ0NUWUNBQXdCQ3lBRElBeHFJUU1nQUNnQ0RDSUpJQVZLQkVBZ0F5QUpOZ0lBREFFTElBTWdCVFlDQUFzZ0JrRUJhaUlHSUFBb0FnZ2lBMGdOQUFzZ0EwRUJTQTBBUVFBaEJRTkFJQUlnQlVFQ2RDSURhaUlHSUFFZ0Eyb29BZ0FnQXlBTWFpZ0NBR29pQXpZQ0FBSkFJQVlDZnlBQUtBSVFJQU5JQkVBZ0F5QUFLQUlVYXd3QkN5QURJQUFvQWd4T0RRRWdBQ2dDRkNBRGFnczJBZ0FMSUFWQkFXb2lCU0FBS0FJSUlnTklEUUFMQ3lBQUtBSTRJZ1VvQWdRZ0JTZ0NBQ0lSYXlJRlFRVk9CRUFnQlVFQ2RTSUZRUUlnQlVFQ1Noc2hFaUFGUVFFZ0JVRUJTeHNoRXlBRVFYNXhJUXdnQkVFQmNTRVVRUUVoQ1FOQUFrQUNRQ0FKSUJOSEJFQWdCQ0FKYkNFT0lCRWdDVUVDZEdvb0FnQWlCVUYvUmcwQklBOG9BZ0FnQlVFRGRrSDgvLy8vQVhGcUtBSUFJQVYyUVFGeERRRWdEeWdDUUNnQ0RDQUZRUUowYWlnQ0FDSUZRWDlHRFFFZ0JVRUJhaUlIUVFOd0lRc2dFQ2dDQUNJR0lBOG9BaHdpQ0NBRlFRSjBhaWdDQUVFQ2RHb29BZ0FpQ2lBSlRnMEJJQVlnQ0NBSElBVkJBbXNnQ3h0QkFuUnFLQUlBUVFKMGFpZ0NBQ0lISUFsT0RRRWdCaUFJUVg5QkFpQUZRUU53R3lBRmFrRUNkR29vQWdCQkFuUnFLQUlBSWdVZ0NVNE5BUUpBSUFSQkFVZ05BQ0FFSUFWc0lRZ2dCQ0FIYkNFSElBUWdDbXdoQzBFQUlRWWdEQ0VGSUFSQkFVY0VRQU5BSUEwZ0JrRUNkR29nQWlBR0lBaHFRUUowYWlnQ0FDQUNJQVlnQjJwQkFuUnFLQUlBYWlBQ0lBWWdDMnBCQW5ScUtBSUFhellDQUNBTklBWkJBWElpQ2tFQ2RHb2dBaUFJSUFwcVFRSjBhaWdDQUNBQ0lBY2dDbXBCQW5ScUtBSUFhaUFDSUFvZ0MycEJBblJxS0FJQWF6WUNBQ0FHUVFKcUlRWWdCVUVDYXlJRkRRQUxDeUFVUlEwQUlBMGdCa0VDZEdvZ0FpQUdJQWhxUVFKMGFpZ0NBQ0FDSUFZZ0IycEJBblJxS0FJQWFpQUNJQVlnQzJwQkFuUnFLQUlBYXpZQ0FBc2dBMEVCU0EwQ0lBSWdEa0VDZENJSGFpRUxJQUFvQWlBaENFRUFJUVlEUUFKQUlBMGdCa0VDZENJRGFpZ0NBQ0lGSUFBb0FoQWlDa29FUUNBRElBaHFJQW8yQWdBTUFRc2dBeUFJYWlFRElBQW9BZ3dpQ2lBRlNnUkFJQU1nQ2pZQ0FBd0JDeUFESUFVMkFnQUxJQVpCQVdvaUJpQUFLQUlJSWdOSURRQUxRUUFoQlNBRFFRRklEUUlnQVNBSGFpRUdBMEFnQ3lBRlFRSjBJZ05xSWdjZ0F5QUdhaWdDQUNBRElBaHFLQUlBYWlJRE5nSUFBa0FnQndKL0lBQW9BaEFnQTBnRVFDQURJQUFvQWhSckRBRUxJQU1nQUNnQ0RFNE5BU0FBS0FJVUlBTnFDellDQUFzZ0JVRUJhaUlGSUFBb0FnZ2lBMGdOQUFzTUFnc1E1d0VBQ3lBRFFRRklEUUFnQWlBT1FRSjBJZ2RxSVFzZ0FpQUpRUUZySUFSc1FRSjBhaUVLSUFBb0FpQWhDRUVBSVFZRFFBSkFJQW9nQmtFQ2RDSURhaWdDQUNJRklBQW9BaEFpRGtvRVFDQURJQWhxSUE0MkFnQU1BUXNnQXlBSWFpRURJQUFvQWd3aURpQUZTZ1JBSUFNZ0RqWUNBQXdCQ3lBRElBVTJBZ0FMSUFaQkFXb2lCaUFBS0FJSUlnTklEUUFMUVFBaEJTQURRUUZJRFFBZ0FTQUhhaUVHQTBBZ0N5QUZRUUowSWdOcUlnY2dBeUFHYWlnQ0FDQURJQWhxS0FJQWFpSUROZ0lBQWtBZ0J3Si9JQUFvQWhBZ0EwZ0VRQ0FESUFBb0FoUnJEQUVMSUFNZ0FDZ0NERTROQVNBQUtBSVVJQU5xQ3pZQ0FBc2dCVUVCYWlJRklBQW9BZ2dpQTBnTkFBc0xJQWxCQVdvaUNTQVNSdzBBQ3dzZ0RSRHJBVUVCQ3lRQkFYOGdBRUhjRkRZQ0FDQUFLQUlnSWdFRVFDQUFJQUUyQWlRZ0FSRDNBUXNnQUFzRUFFRUNDN3dQQVJoL0lBQWdCRFlDQ0FKL0lBUWdBQ2dDSkNBQVFTQnFJZ1VvQWdBaUNHdEJBblVpQTBzRVFDQUZJQVFnQTJzUUNpQUZLQUlBSVFnZ0FDZ0NDQXdCQ3lBRElBUkxCRUFnQUNBSUlBUkJBblJxTmdJa0N5QUVDeUVNUVg4Z0JFRUNkQ0FFUWYvLy8vOERjU0FFUnhzaUF4RHFBVUVBSUFNUStnRWhEU0FERU9vQlFRQWdBeEQ2QVNFUUFrQWdERUVCU0EwQUEwQUNRQ0FOSUFaQkFuUWlCV29vQWdBaURpQUFLQUlRSWdOS0JFQWdCU0FJYWlBRE5nSUFEQUVMSUFVZ0NHb2hCU0FBS0FJTUlnTWdEa29FUUNBRklBTTJBZ0FNQVFzZ0JTQU9OZ0lBQ3lBR1FRRnFJZ1lnQUNnQ0NDSU1TQTBBQ3lBTVFRRklEUUJCQUNFREEwQWdBaUFEUVFKMElnNXFJZ1VnQVNBT2FpZ0NBQ0FJSUE1cUtBSUFhaUlPTmdJQUFrQWdCUUovSUFBb0FoQWdEa2dFUUNBT0lBQW9BaFJyREFFTElBNGdBQ2dDREU0TkFTQUFLQUlVSUE1cUN6WUNBQXNnQTBFQmFpSURJQUFvQWdnaURFZ05BQXNMSUFBb0FqZ2lBeWdDQkNBREtBSUFJaGhySWdOQkJVNEVRQ0FBS0FJMElSa2dBQ2dDTUNFVUlBTkJBblVpQTBFQ0lBTkJBa29iSVJvZ0EwRUJJQU5CQVVzYklSc2dCRUYrY1NFRklBUkJBWEVoRnlBRVFYeHhJUndnQkVFRGNTRU9JQVJCQVdzaEZTQUVRUUowSVIxQkFTRVBBMEFDUUFKQUFrQUNRQ0FQSUJ0SEJFQWdHQ0FQUVFKMGFpZ0NBQ0VLSUFSQkFVZ2lGa1VFUUNBTlFRQWdIUkQ2QVJvTElBcEJmMFlFUUNBRUlBOXNJUWdNQkFzZ0ZDZ0NBQ0VSUVFBaEVpQUtJUWtEUUFKQUlCRWdDVUVEZGtIOC8vLy9BWEZxS0FJQUlBbDJRUUZ4RFFBZ0ZDZ0NRQ2dDRENBSlFRSjBhaWdDQUNJR1FYOUdEUUFnQmtFQmFpSUlRUU53SVFNZ0dTZ0NBQ0lUSUJRb0Fod2lDeUFHUVFKMGFpZ0NBRUVDZEdvb0FnQWlCeUFQVGcwQUlCTWdDeUFJSUFaQkFtc2dBeHRCQW5ScUtBSUFRUUowYWlnQ0FDSUlJQTlPRFFBZ0V5QUxRWDlCQWlBR1FRTndHeUFHYWtFQ2RHb29BZ0JCQW5ScUtBSUFJZ01nRDA0TkFBSkFJQllOQUNBRElBUnNJUk1nQkNBSWJDRUxJQVFnQjJ3aEIwRUFJUVlnQlNFRElCVUVRQU5BSUJBZ0JrRUNkR29nQWlBR0lCTnFRUUowYWlnQ0FDQUNJQVlnQzJwQkFuUnFLQUlBYWlBQ0lBWWdCMnBCQW5ScUtBSUFhellDQUNBUUlBWkJBWElpQ0VFQ2RHb2dBaUFJSUJOcVFRSjBhaWdDQUNBQ0lBZ2dDMnBCQW5ScUtBSUFhaUFDSUFjZ0NHcEJBblJxS0FJQWF6WUNBQ0FHUVFKcUlRWWdBMEVDYXlJRERRQUxDeUFYQkVBZ0VDQUdRUUowYWlBQ0lBWWdFMnBCQW5ScUtBSUFJQUlnQmlBTGFrRUNkR29vQWdCcUlBSWdCaUFIYWtFQ2RHb29BZ0JyTmdJQUN5QVdEUUJCQUNFR0lCd2hDQ0FWUVFKTEJFQURRQ0FOSUFaQkFuUWlDMm9pQXlBREtBSUFJQXNnRUdvb0FnQnFOZ0lBSUEwZ0MwRUVjaUlIYWlJRElBTW9BZ0FnQnlBUWFpZ0NBR28yQWdBZ0RTQUxRUWh5SWdkcUlnTWdBeWdDQUNBSElCQnFLQUlBYWpZQ0FDQU5JQXRCREhJaUIyb2lBeUFES0FJQUlBY2dFR29vQWdCcU5nSUFJQVpCQkdvaEJpQUlRUVJySWdnTkFBc0xJQTRpQTBVTkFBTkFJQTBnQmtFQ2RDSUhhaUlJSUFnb0FnQWdCeUFRYWlnQ0FHbzJBZ0FnQmtFQmFpRUdJQU5CQVdzaUF3MEFDd3NnRWtFQmFpRVNDMEYvSVFZQ1FFRi9RUUlnQ1VFRGNCc2dDV29pQTBGL1JnMEFJQlFvQWdBZ0EwRURka0g4Ly8vL0FYRnFLQUlBSUFOMlFRRnhEUUFnRkNnQ1FDZ0NEQ0FEUVFKMGFpZ0NBQ0lEUVg5R0RRQWdBMEVEY0FSQUlBTkJBV3NoQmd3QkN5QURRUUpxSVFZTFFYOGdCaUFHSUFwR0d5SUpRWDlIRFFBTElBUWdEMndoQ0NBU1JRMERJQllOQWtFQUlRWWdCU0VESUJWRkRRRURRQ0FOSUFaQkFuUWlDV29pQ2lBS0tBSUFJQkp0TmdJQUlBMGdDVUVFY21vaUNpQUtLQUlBSUJKdE5nSUFJQVpCQW1vaEJpQURRUUpySWdNTkFBc01BUXNRNXdFQUN5QVhSUTBBSUEwZ0JrRUNkR29pQXlBREtBSUFJQkp0TmdJQUN5QU1RUUZJRFFFZ0FpQUlRUUowSWdwcUlRZ2dBQ2dDSUNFUlFRQWhCZ05BQWtBZ0RTQUdRUUowSWdscUtBSUFJZ2NnQUNnQ0VDSURTZ1JBSUFrZ0VXb2dBellDQUF3QkN5QUpJQkZxSVFrZ0FDZ0NEQ0lESUFkS0JFQWdDU0FETmdJQURBRUxJQWtnQnpZQ0FBc2dCa0VCYWlJR0lBQW9BZ2dpREVnTkFBdEJBQ0VESUF4QkFVZ05BU0FCSUFwcUlRa0RRQ0FJSUFOQkFuUWlCMm9pQ2lBSElBbHFLQUlBSUFjZ0VXb29BZ0JxSWdjMkFnQUNRQ0FLQW44Z0FDZ0NFQ0FIU0FSQUlBY2dBQ2dDRkdzTUFRc2dCeUFBS0FJTVRnMEJJQUFvQWhRZ0Iyb0xOZ0lBQ3lBRFFRRnFJZ01nQUNnQ0NDSU1TQTBBQ3d3QkN5QU1RUUZJRFFBZ0FpQUlRUUowSWdscUlRZ2dBaUFQUVFGcklBUnNRUUowYWlFS0lBQW9BaUFoQzBFQUlRWURRQUpBSUFvZ0JrRUNkQ0lIYWlnQ0FDSVJJQUFvQWhBaUEwb0VRQ0FISUF0cUlBTTJBZ0FNQVFzZ0J5QUxhaUVISUFBb0Fnd2lBeUFSU2dSQUlBY2dBellDQUF3QkN5QUhJQkUyQWdBTElBWkJBV29pQmlBQUtBSUlJZ3hJRFFBTFFRQWhBeUFNUVFGSURRQWdBU0FKYWlFSkEwQWdDQ0FEUVFKMElnZHFJZ29nQnlBSmFpZ0NBQ0FISUF0cUtBSUFhaUlITmdJQUFrQWdDZ0ovSUFBb0FoQWdCMGdFUUNBSElBQW9BaFJyREFFTElBY2dBQ2dDREU0TkFTQUFLQUlVSUFkcUN6WUNBQXNnQTBFQmFpSURJQUFvQWdnaURFZ05BQXNMSUE5QkFXb2lEeUFhUncwQUN3c2dFQkRyQVNBTkVPc0JRUUVMYUFFQmZ5QUFRY3dWTmdJQUlBQW9BbUFpQVFSQUlBRVE5d0VMSUFBb0FsUWlBUVJBSUFFUTl3RUxJQUFvQWtnaUFRUkFJQUVROXdFTElBQW9BandpQVFSQUlBRVE5d0VMSUFCQjNCUTJBZ0FnQUNnQ0lDSUJCRUFnQUNBQk5nSWtJQUVROXdFTElBQUxhd0VCZnlBQVFjd1ZOZ0lBSUFBb0FtQWlBUVJBSUFFUTl3RUxJQUFvQWxRaUFRUkFJQUVROXdFTElBQW9Ba2dpQVFSQUlBRVE5d0VMSUFBb0Fqd2lBUVJBSUFFUTl3RUxJQUJCM0JRMkFnQWdBQ2dDSUNJQkJFQWdBQ0FCTmdJa0lBRVE5d0VMSUFBUTl3RUxCQUJCQkF1OENnSU5md04rSXdCQklHc2lBeVFBQWtBZ0FTOEJKa0dCQkUwRVFDQUJLUU1RSWc4Z0FTa0RDRmtOQVNBQktBSUFJQStuYWkwQUFDRUVJQUVnRDBJQmZEY0RFQ0FFRFFFTEFrQkJBU0FEUVJ4cUlBRVFGVVVOQUNBREtBSWNJZ2dFUUVFQUlRUWdBRUU4YWlBSUVISWdBMElBTndBTklBTkNBRGNEQ0NBRFFRaHFJQUVRR0VVTkFVRUFJQU10QUJSclFmOEJjU0VGSUFBb0Fqd2hDeUFES0FJTUlRY2dBeWdDRUNFQ0lBTW9BZ2doREFOQUFrQWdBa0gvSDBzTkFDQUhRUUZJRFFBZ0RDQUhRUUZySWdkcUxRQUFJQUpCQ0hSeUlRSUxJQUpCQ0hZZ0JXd2lCaUFDUWY4QmNTSUphaUVLSUFVZ0NVc2hEU0FDSUFVZ0JtcHJJUTVCQVNBRWRDRUNJQXNnQkVFRGRrSDgvLy8vQVhGcUlRWUNmeUFGSUFsTEJFQWdCaWdDQUNBQ2Nnd0JDeUFHS0FJQUlBSkJmM054Q3lFSklBb2dEaUFOR3lFQ0lBWWdDVFlDQUNBRVFRRnFJZ1FnQ0VjTkFBc0xRUUVnQTBFY2FpQUJFQlZGRFFBZ0F5Z0NIQ0lKQkVCQkFDRUVJQUJCeUFCcUlBa1FjaUFEUWdBM0FBMGdBMElBTndNSUlBTkJDR29nQVJBWVJRMEJRUUFnQXkwQUZHdEIvd0Z4SVFZZ0FDZ0NTQ0VMSUFNb0Fnd2hCU0FES0FJUUlRSWdBeWdDQ0NFTUEwQUNRQ0FDUWY4ZlN3MEFJQVZCQVVnTkFDQU1JQVZCQVdzaUJXb3RBQUFnQWtFSWRISWhBZ3NnQWtFSWRpQUdiQ0lISUFKQi93RnhJZ3BxSVEwZ0FpQUdJQWRxYXlFT1FRRWdCSFFoQWlBTElBUkJBM1pCL1AvLy93RnhhaUVJQW44Z0JpQUtTeUlLUlFSQUlBZ29BZ0FnQWtGL2MzRU1BUXNnQ0NnQ0FDQUNjZ3NoQnlBTklBNGdDaHNoQWlBSUlBYzJBZ0FnQkVFQmFpSUVJQWxIRFFBTEMwRUJJQU5CSEdvZ0FSQVZSUTBBSUFNb0Fod2lDUVJBUVFBaEJDQUFRZFFBYWlBSkVISWdBMElBTndBTklBTkNBRGNEQ0NBRFFRaHFJQUVRR0VVTkFVRUFJQU10QUJSclFmOEJjU0VHSUFBb0FsUWhDeUFES0FJTUlRVWdBeWdDRUNFQ0lBTW9BZ2doREFOQUFrQWdBa0gvSDBzTkFDQUZRUUZJRFFBZ0RDQUZRUUZySWdWcUxRQUFJQUpCQ0hSeUlRSUxJQUpCQ0hZZ0Jtd2lCeUFDUWY4QmNTSUthaUVOSUFJZ0JpQUhhbXNoRGtFQklBUjBJUUlnQ3lBRVFRTjJRZnovLy84QmNXb2hDQUovSUFZZ0Nrc2lDa1VFUUNBSUtBSUFJQUpCZjNOeERBRUxJQWdvQWdBZ0FuSUxJUWNnRFNBT0lBb2JJUUlnQ0NBSE5nSUFJQVJCQVdvaUJDQUpSdzBBQ3d0QkFTQURRUnhxSUFFUUZVVU5BQ0FES0FJY0lna0VRRUVBSVFRZ0FFSGdBR29nQ1JCeUlBTkNBRGNBRFNBRFFnQTNBd2dnQTBFSWFpQUJFQmhGRFFGQkFDQURMUUFVYTBIL0FYRWhCaUFBS0FKZ0lRc2dBeWdDRENFRklBTW9BaEFoQWlBREtBSUlJUXdEUUFKQUlBSkIveDlMRFFBZ0JVRUJTQTBBSUF3Z0JVRUJheUlGYWkwQUFDQUNRUWgwY2lFQ0N5QUNRUWgySUFac0lnY2dBa0gvQVhFaUNtb2hEU0FDSUFZZ0IycHJJUTVCQVNBRWRDRUNJQXNnQkVFRGRrSDgvLy8vQVhGcUlRZ0NmeUFHSUFwTElncEZCRUFnQ0NnQ0FDQUNRWDl6Y1F3QkN5QUlLQUlBSUFKeUN5RUhJQTBnRGlBS0d5RUNJQWdnQnpZQ0FDQUVRUUZxSWdRZ0NVY05BQXNMUVFBaEFpQUJLUU1JSWhFZ0FTa0RFQ0lQUWdSOEloQlREUUVnQVNnQ0FDSUZJQStuYWlnQUFDRUVJQUVnRURjREVDQVJJQTlDQ0h3aUQxTU5BU0FGSUJDbmFpZ0FBQ0VGSUFFZ0R6Y0RFQ0FFSUFWS0RRRWdBQ0FGTmdJUUlBQWdCRFlDRENBRnJDQUVySDBpRDBMKy8vLy9CMVlOQVVFQklRSWdBQ0FQcDBFQmFpSUJOZ0lVSUFBZ0FVRUJkaUlFTmdJWUlBQkJBQ0FFYXpZQ0hDQUJRUUZ4RFFFZ0FDQUVRUUZyTmdJWURBRUxRUUFoQWdzZ0EwRWdhaVFBSUFJTDR4WUJISDhqQUVGQWFpSUhKQUFnQUNBRU5nSUlBa0FnQkNBQUtBSWtJQUJCSUdvaUJTZ0NBQ0lTYTBFQ2RTSURTd1JBSUFVZ0JDQURheEFLREFFTElBTWdCRTBOQUNBQUlCSWdCRUVDZEdvMkFpUUxJQWRDQURjRE9DQUhRZ0EzQXpBZ0IwSUFOd01vSUFkQ0FEY0RJQ0FIUWdBM0F4Z2dCMElBTndNUUlBZEJBRFlDQUVFQUlRVWdCQVJBSUFkQkVHb2dCQ0FIRUJZZ0J5Z0NIQ0VHSUFjb0FpQWhCUXNnQjBFQU5nSUFBa0FnQkNBRklBWnJRUUoxSWdOTkJFQWdBeUFFVFEwQklBY2dCaUFFUVFKMGFqWUNJQXdCQ3lBSFFSQnFRUXh5SUFRZ0Eyc2dCeEFXQ3lBSFFRQTJBZ0FDUUNBRUlBY29BaXdnQnlnQ0tDSUZhMEVDZFNJRFRRUkFJQU1nQkUwTkFTQUhJQVVnQkVFQ2RHbzJBaXdNQVFzZ0IwRW9haUFFSUFOcklBY1FGZ3NnQjBFQU5nSUFBa0FnQkNBSEtBSTRJQWNvQWpRaUJXdEJBblVpQTAwRVFDQURJQVJORFFFZ0J5QUZJQVJCQW5ScU5nSTREQUVMSUFkQk5Hb2dCQ0FEYXlBSEVCWUxRUUFoQmdKQUlBQW9BZ2hCQUV3TkFDQUFLQUlnSVJJZ0J5Z0NFQ0VKQTBBQ1FDQUpJQVpCQW5RaUEyb29BZ0FpQlNBQUtBSVFJZ2hLQkVBZ0F5QVNhaUFJTmdJQURBRUxJQU1nRW1vaEF5QUFLQUlNSWdnZ0JVb0VRQ0FESUFnMkFnQU1BUXNnQXlBRk5nSUFDeUFHUVFGcUlnWWdBQ2dDQ0NJRFNBMEFDeUFEUVFGSURRQkJBQ0VGQTBBZ0FpQUZRUUowSWdOcUlna2dBU0FEYWlnQ0FDQURJQkpxS0FJQWFpSUROZ0lBQWtBZ0NRSi9JQUFvQWhBZ0EwZ0VRQ0FESUFBb0FoUnJEQUVMSUFNZ0FDZ0NERTROQVNBQUtBSVVJQU5xQ3pZQ0FBc2dCVUVCYWlJRklBQW9BZ2hJRFFBTEN5QUFLQUkwSVJzZ0FDZ0NNQ0VRUVJBUTZnRWlGa0lBTndJQUlCWkNBRGNDQ0NBSFFRQTJBZ2dnQjBJQU53TUFBa0FnQkFSQUlBUkJnSUNBZ0FSUERRRWdCeUFFUVFKMElnTVE2Z0VpRnpZQ0FDQUhJQU1nRjJvaUJUWUNDQ0FYUVFBZ0F4RDZBUm9nQnlBRk5nSUVDMEVCSVF3Q1FDQUFLQUk0SWdNb0FnUWdBeWdDQUNJY2F5SURRUVZJRFFBZ0EwRUNkU0lEUVFJZ0EwRUNTaHNoSFNBRFFRRWdBMEVCU3hzaEhpQUVRWDV4SVJJZ0JFRUJjU0VhSUFSQmZIRWhIeUFFUVFOeElTQWdCRUVCYXlFWUlBUkJBblFoSVVFQklRNERRQUpBQWtBQ1FBSkFJQTRnSGtjRVFDQWNJQTVCQW5ScUtBSUFJZ3BCQTNBaEF3Si9Ba0FnQ2tGL1JnMEFRWDlCQWlBREd5QUthaUlMUVFWMklSbEJBU0FMZENFTklCQW9BZ0FoRkVFQklRaEJBQ0VKSUFvaEJRSkFBMEFDUUNBVUlBVkJBM1pCL1AvLy93RnhhaWdDQUNBRmRrRUJjUTBBSUJBb0FrQW9BZ3dnQlVFQ2RHb29BZ0FpQTBGL1JnMEFJQU5CQVdvaUVVRURjQ0VQSUJzb0FnQWlCaUFRS0FJY0lnd2dBMEVDZEdvb0FnQkJBblJxS0FJQUloTWdEazROQUNBR0lBd2dFU0FEUVFKcklBOGJRUUowYWlnQ0FFRUNkR29vQWdBaUR5QU9UZzBBSUFZZ0RFRi9RUUlnQTBFRGNCc2dBMnBCQW5ScUtBSUFRUUowYWlnQ0FDSURJQTVPRFFBQ1FDQUVRUUZJRFFBZ0IwRVFhaUFKUVF4c2FpZ0NBQ0VNSUFNZ0JHd2hFU0FFSUE5c0lROGdCQ0FUYkNFVFFRQWhCaUFTSVFNZ0dBUkFBMEFnRENBR1FRSjBhaUFDSUFZZ0VXcEJBblJxS0FJQUlBSWdCaUFQYWtFQ2RHb29BZ0JxSUFJZ0JpQVRha0VDZEdvb0FnQnJOZ0lBSUF3Z0JrRUJjaUlWUVFKMGFpQUNJQkVnRldwQkFuUnFLQUlBSUFJZ0R5QVZha0VDZEdvb0FnQnFJQUlnRXlBVmFrRUNkR29vQWdCck5nSUFJQVpCQW1vaEJpQURRUUpySWdNTkFBc0xJQnBGRFFBZ0RDQUdRUUowYWlBQ0lBWWdFV3BCQW5ScUtBSUFJQUlnQmlBUGFrRUNkR29vQWdCcUlBSWdCaUFUYWtFQ2RHb29BZ0JyTmdJQUMwRUVJUU1nQ1VFQmFpSUpRUVJHRFFJTEFrQWdDRUVCY1FSQVFYOGhCaUFGUVFGcUlnTWdCVUVDYXlBRFFRTndHeUlEUVg5R0RRRWdFQ2dDQUNBRFFRTjJRZnovLy84QmNXb29BZ0FnQTNaQkFYRU5BU0FRS0FKQUtBSU1JQU5CQW5ScUtBSUFJZ05CZjBZTkFTQURRUUZxSWdVZ0EwRUNheUFGUVFOd0d5RUdEQUVMUVg4aEJrRi9RUUlnQlVFRGNCc2dCV29pQTBGL1JnMEFJQkFvQWdBZ0EwRURka0g4Ly8vL0FYRnFLQUlBSUFOMlFRRnhEUUFnRUNnQ1FDZ0NEQ0FEUVFKMGFpZ0NBQ0lEUVg5R0RRQWdBMEVEY0FSQUlBTkJBV3NoQmd3QkN5QURRUUpxSVFZTEFrQWdCaUFLUmcwQUlBWkJmeUFJUVFGeklBWkJmMGR5SWdOQkFYRWlCaHNoQlNBRElBaHhJUWdDUUNBR0RRQWdDMEYvUmcwQUlCQW9BZ0FnR1VFQ2RHb29BZ0FnRFhFTkFTQVFLQUpBS0FJTUlBdEJBblJxS0FJQUlnTkJmMFlOQVNBRFFRRnJJQU5CQW1vZ0EwRURjQnNoQlVFQUlRZ0xJQVZCZjBjTkFRc0xJQWtpQTBFQlNBMEJDeUFFUVFGSUlnOUZCRUFnQnlnQ0FFRUFJQ0VRK2dFYUN5QVdJQU5CQVdzaUJVRUNkR29oRXlBQUlBVkJER3hxSWdVaEZTQUZRVUJyS0FJQUlSbEJBQ0VNUVFBaEVVRUFJUWtEUUNBVElCTW9BZ0FpQlVFQmFqWUNBQ0FGSUJsUERRa0NRQ0FWS0FJOElBVkJBM1pCL1AvLy93RnhhaWdDQUNBRmRrRUJjUTBBSUFsQkFXb2hDU0FQRFFBZ0J5Z0NBQ0VLSUFkQkVHb2dFVUVNYkdvb0FnQWhDMEVBSVFZZ0h5RUZJQmhCQTA4RVFBTkFJQW9nQmtFQ2RDSUlhaUlOSUEwb0FnQWdDQ0FMYWlnQ0FHbzJBZ0FnQ2lBSVFRUnlJZzFxSWhRZ0ZDZ0NBQ0FMSUExcUtBSUFhallDQUNBS0lBaEJDSElpRFdvaUZDQVVLQUlBSUFzZ0RXb29BZ0JxTmdJQUlBb2dDRUVNY2lJSWFpSU5JQTBvQWdBZ0NDQUxhaWdDQUdvMkFnQWdCa0VFYWlFR0lBVkJCR3NpQlEwQUN3c2dJQ0lJUlEwQUEwQWdDaUFHUVFKMElnVnFJZzBnRFNnQ0FDQUZJQXRxS0FJQWFqWUNBQ0FHUVFGcUlRWWdDRUVCYXlJSURRQUxDeUFSUVFGcUloRWdBMGNOQUFzZ0JDQU9iQ0lJSUFsRkRRRWFJQThOQlNBSEtBSUFJUU5CQUNFR0lCSWhCU0FZRFFNTUJBc2dCQ0FPYkFzaEF5QUFLQUlJUVFGSURRUWdBaUFEUVFKMElnaHFJUW9nQWlBT1FRRnJJQVJzUVFKMGFpRUxJQUFvQWlBaENVRUFJUVlEUUFKQUlBc2dCa0VDZENJRGFpZ0NBQ0lGSUFBb0FoQWlERW9FUUNBRElBbHFJQXcyQWdBTUFRc2dBeUFKYWlFRElBQW9BZ3dpRENBRlNnUkFJQU1nRERZQ0FBd0JDeUFESUFVMkFnQUxJQVpCQVdvaUJpQUFLQUlJSWdOSURRQUxRUUFoQlNBRFFRRklEUVFnQVNBSWFpRUlBMEFnQ2lBRlFRSjBJZ05xSWdZZ0F5QUlhaWdDQUNBRElBbHFLQUlBYWlJRE5nSUFBa0FnQmdKL0lBQW9BaEFnQTBnRVFDQURJQUFvQWhSckRBRUxJQU1nQUNnQ0RFNE5BU0FBS0FJVUlBTnFDellDQUFzZ0JVRUJhaUlGSUFBb0FnaElEUUFMREFRTEVPY0JBQXNEUUNBRElBWkJBblFpQ21vaUN5QUxLQUlBSUFsdE5nSUFJQU1nQ2tFRWNtb2lDaUFLS0FJQUlBbHROZ0lBSUFaQkFtb2hCaUFGUVFKcklnVU5BQXNMSUJwRkRRQWdBeUFHUVFKMGFpSURJQU1vQWdBZ0NXMDJBZ0FMSUFBb0FnaEJBVWdOQUNBQ0lBaEJBblFpQ0dvaENpQUFLQUlnSVFsQkFDRUdBMEFDUUNBWElBWkJBblFpQTJvb0FnQWlCU0FBS0FJUUlndEtCRUFnQXlBSmFpQUxOZ0lBREFFTElBTWdDV29oQXlBQUtBSU1JZ3NnQlVvRVFDQURJQXMyQWdBTUFRc2dBeUFGTmdJQUN5QUdRUUZxSWdZZ0FDZ0NDQ0lEU0EwQUMwRUFJUVVnQTBFQlNBMEFJQUVnQ0dvaENBTkFJQW9nQlVFQ2RDSURhaUlHSUFNZ0NHb29BZ0FnQXlBSmFpZ0NBR29pQXpZQ0FBSkFJQVlDZnlBQUtBSVFJQU5JQkVBZ0F5QUFLQUlVYXd3QkN5QURJQUFvQWd4T0RRRWdBQ2dDRkNBRGFnczJBZ0FMSUFWQkFXb2lCU0FBS0FJSVNBMEFDd3RCQVNFTUlBNUJBV29pRGlBZFJ3MEFDd3NnQnlnQ0FDSUFCRUFnQnlBQU5nSUVJQUFROXdFTElCWVE5d0VnQnlnQ05DSUFCRUFnQnlBQU5nSTRJQUFROXdFTElBY29BaWdpQUFSQUlBY2dBRFlDTENBQUVQY0JDeUFIS0FJY0lnQUVRQ0FISUFBMkFpQWdBQkQzQVFzZ0J5Z0NFQ0lBQkVBZ0J5QUFOZ0lVSUFBUTl3RUxJQWRCUUdza0FDQU1Ed3NRNXdFQUMxTUJBWDhnQUVHRUZqWUNBQ0FBS0FKTUlnRUVRQ0FCRVBjQkN5QUFLQUpFSVFFZ0FFRUFOZ0pFSUFFRVFDQUJFT3NCQ3lBQVFkd1VOZ0lBSUFBb0FpQWlBUVJBSUFBZ0FUWUNKQ0FCRVBjQkN5QUFDMVlCQVg4Z0FFR0VGallDQUNBQUtBSk1JZ0VFUUNBQkVQY0JDeUFBS0FKRUlRRWdBRUVBTmdKRUlBRUVRQ0FCRU9zQkN5QUFRZHdVTmdJQUlBQW9BaUFpQVFSQUlBQWdBVFlDSkNBQkVQY0JDeUFBRVBjQkN3UUFRUU1MTXdFQmZ3SkFJQUFvQWp4RkRRQWdBQ2dDTEVVTkFDQUFLQUl3UlEwQUlBQW9BalJGRFFBZ0FDZ0NPRUVBUnlFQkN5QUJDeW9CQVg4Q1FDQUJSUTBBSUFFb0FqZ05BQ0FCTFFBWVFRTkhEUUFnQUNBQk5nSThRUUVoQWdzZ0FndW5CQUlPZndOK0l3QkJJR3NpQXlRQUlBTkJBRFlDSEFKQUFrQWdBUzhCSmtHQkJFMEVRQ0FCS1FNUUloQkNCSHdpRVNBQktRTUlWUTBDSUFFb0FnQWdFS2RxS0FBQUlRUWdBU0FSTndNUURBRUxRUUVnQTBFY2FpQUJFQlZGRFFFZ0F5Z0NIQ0VFQ3lBRVJRMEFJQUJCekFCcUlBUVFjaUFEUWdBM0FBMGdBMElBTndNSUlBTkJDR29nQVJBWVJRMEFRUUFnQXkwQUZHdEIvd0Z4SVFnZ0FDZ0NUQ0VMSUFNb0FoQWhBaUFES0FJTUlRa2dBeWdDQ0NFTVFRRWhCd05BQWtBZ0FrSC9IMHNOQUNBSlFRRklEUUFnRENBSlFRRnJJZ2xxTFFBQUlBSkJDSFJ5SVFJTElBSkJDSFlnQ0d3aUJpQUNRZjhCY1NJS2FpRU5JQUlnQmlBSWFtc2hEa0VCSUFWMElRSWdDeUFGUVFOMlFmei8vLzhCY1dvaEJnSi9JQWNnQ0NBS1N5SVBjeUlIUVFGeFJRUkFJQVlvQWdBZ0FuSU1BUXNnQmlnQ0FDQUNRWDl6Y1FzaENpQU5JQTRnRHhzaEFpQUhRUUZ6SVFjZ0JpQUtOZ0lBSUFWQkFXb2lCU0FFUncwQUMwRUFJUUlnQVNrRENDSVNJQUVwQXhBaUVFSUVmQ0lSVXcwQUlBRW9BZ0FpQlNBUXAyb29BQUFoQkNBQklCRTNBeEFnRWlBUVFnaDhJaEJURFFBZ0JTQVJwMm9vQUFBaEJTQUJJQkEzQXhBZ0JDQUZTZzBBSUFBZ0JUWUNFQ0FBSUFRMkFnd2dCYXdnQkt4OUloQkMvdi8vL3dkV0RRQkJBU0VDSUFBZ0VLZEJBV29pQVRZQ0ZDQUFJQUZCQVhZaUJEWUNHQ0FBUVFBZ0JHczJBaHdnQVVFQmNRMEFJQUFnQkVFQmF6WUNHQXNnQTBFZ2FpUUFJQUlMc3cwRENIOFBmUUY4SUFBZ0JUWUNRQ0FBSUFRMkFraEJmeUFFUVFKMElBUkIvLy8vL3dOeElBUkhHeERxQVNFRElBQW9Ba1FoQlNBQUlBTTJBa1FnQlFSQUlBVVE2d0VMSUFBZ0JEWUNDQUpBSUFRZ0FDZ0NKQ0FBUVNCcUlnVW9BZ0FpQTJ0QkFuVWlDVXNFUUNBRklBUWdDV3NRQ2d3QkN5QUVJQWxQRFFBZ0FDQURJQVJCQW5ScU5nSWtDd0pBSUFBb0FqZ2lBeWdDQkNJSklBTW9BZ0FpQldzaUEwRUJTQTBBSUFVZ0NVY0VRQ0FEUVFKMklnTkJBU0FEUVFGTEd5RU5RUUFoQ1FOQUlBVWdDVUVDZEdvb0FnQWhCa01BQUFBQUlROGpBRUV3YXlJSEpBQkJmeUVGQW45QmZ5QUdRWDlHRFFBYUlBWkJBV29pQXlBR1FRSnJJQU5CQTNBYklRVWdCa0VCYXlBR1FRTndEUUFhSUFaQkFtb0xJUWdDUUFKQUlBQW9BalFpQXlnQ0JDQURLQUlBSWdwclFRSjFJZ1lnQUNnQ01DZ0NIQ0lESUFWQkFuUnFLQUlBSWdWTkRRQWdCaUFESUFoQkFuUnFLQUlBSWdOTkRRQWdDaUFGUVFKMGFpZ0NBQ0VJQWtBQ1FDQUtJQU5CQW5ScUtBSUFJZ1lnQ1U0TkFDQUlJQWxPRFFBZ0FpQUFLQUpJSWdNZ0JteEJBblJxSWdVb0FnU3lJUk1nQWlBRElBaHNRUUowYWlJREtBSUVzaUVWQWtBZ0JTZ0NBTElpRmlBREtBSUFzaUliWEEwQUlCTWdGVndOQUNBQUtBSkVJZ01DZnlBVGkwTUFBQUJQWFFSQUlCT29EQUVMUVlDQWdJQjRDellDQkNBV2kwTUFBQUJQWFFSQUlBTWdGcWcyQWdBTUF3c2dBMEdBZ0lDQWVEWUNBQXdDQ3lBQUtBSkFJQWxCQW5ScUtBSUFJUVVnQjBFQU5nSW9JQWRDQURjRElDQUFLQUk4SWdNdEFGUkZCRUFnQXlnQ1JDQUZRUUowYWlnQ0FDRUZDeUFESUFVZ0F5d0FHQ0FIUVNCcUVLTUJJQUFvQWtBZ0NFRUNkR29vQWdBaEJTQUhRUUEyQWhnZ0IwSUFOd01RSUFBb0Fqd2lBeTBBVkVVRVFDQURLQUpFSUFWQkFuUnFLQUlBSVFVTElBTWdCU0FETEFBWUlBZEJFR29Rb3dFZ0FDZ0NRQ0FHUVFKMGFpZ0NBQ0VGSUFkQkFEWUNDQ0FIUWdBM0F3QWdBQ2dDUENJRExRQlVSUVJBSUFNb0FrUWdCVUVDZEdvb0FnQWhCUXNnQXlBRklBTXNBQmdnQnhDakFTQUhLZ0lBSUFjcUFoQWlISk1pRnlBWGxFTUFBQUFBa2lBSEtnSUVJQWNxQWhRaUVKTWlHQ0FZbEpJZ0J5b0NDQ0FIS2dJWUloR1RJaGtnR1pTU0lSb2dCeW9DS0NFT0lBY3FBaVFoRkNBSEtnSWdJUklDZlNBQUtBSllRWUlDVGdSQVF3QUFBQUFnR2tNQUFBQUFYa1VOQVJvTElBNGdFWk1pRGlBWklCY2dFaUFja3lJUmxFTUFBQUFBa2lBWUlCUWdFSk1pRXBTU0lCa2dEcFNTSUJxVklnK1VreUlPSUE2VUlCSWdHQ0FQbEpNaURpQU9sQ0FSSUJjZ0Q1U1RJZzRnRHBSREFBQUFBSktTa2lBYWxaRUxJUlFnQUNnQ1RDQUFLQUpRUVFGcklnVkJBM1pCL1AvLy93RnhhaWdDQUNFRElBQWdCVFlDVUNBVElCV1RJaEVnRDVRZ0ZaSWdGaUFia3lJU0lCU1VJZzRnRG93Z0F5QUZka0VCY1NJREc1SWhFQUpBSUJJZ0Q1UWdHNUlnRVNBVWxDSU9qQ0FPSUFNYmtpSU9JQTVjQkVBZ0FDZ0NSQ0lHUVlDQWdJQjROZ0lBREFFTElBQW9Ba1FpQmdKL0lBNjdSQUFBQUFBQUFPQS9vSndpSFpsRUFBQUFBQUFBNEVGakJFQWdIYW9NQVF0QmdJQ0FnSGdMTmdJQUN5QUdRWUNBZ0lCNEFuOGdFTHRFQUFBQUFBQUE0RCtnbkNJZG1VUUFBQUFBQUFEZ1FXTUVRQ0FkcWd3QkMwR0FnSUNBZUFzZ0VDQVFYQnMyQWdRTUFRc0NmeUFJSUFsSUJFQWdDQ0FBS0FKSUlnWnNEQUVMUVFBaEJpQUpRUUJNQkVBZ0FDZ0NTRUVBVEEwQ0lBQW9Ba1FoQXdOQUlBTWdCa0VDZEdwQkFEWUNBQ0FHUVFGcUlnWWdBQ2dDU0VnTkFBc01BZ3NnQUNnQ1NDSUdJQWxCQVd0c0N5RUZJQVpCQVVnTkFDQUFLQUpFSVFOQkFDRUdBMEFnQXlBR1FRSjBhaUFDSUFVZ0JtcEJBblJxS0FJQU5nSUFJQVpCQVdvaUJpQUFLQUpJU0EwQUN3c2dCMEV3YWlRQURBRUxFT2NCQUFzQ1FDQUFLQUlJUVFGSURRQWdBaUFFSUFsc1FRSjBJZ2RxSVFvZ0FDZ0NJQ0VMSUFBb0FrUWhDRUVBSVFVRFFBSkFJQWdnQlVFQ2RDSUdhaWdDQUNJTUlBQW9BaEFpQTBvRVFDQUdJQXRxSUFNMkFnQU1BUXNnQmlBTGFpRUdJQUFvQWd3aUF5QU1TZ1JBSUFZZ0F6WUNBQXdCQ3lBR0lBdzJBZ0FMSUFWQkFXb2lCU0FBS0FJSUlnWklEUUFMUVFBaEF5QUdRUUZJRFFBZ0FTQUhhaUVHQTBBZ0NpQURRUUowSWdocUlnVWdCaUFJYWlnQ0FDQUlJQXRxS0FJQWFpSUlOZ0lBQWtBZ0JRSi9JQUFvQWhBZ0NFZ0VRQ0FJSUFBb0FoUnJEQUVMSUFnZ0FDZ0NERTROQVNBQUtBSVVJQWhxQ3pZQ0FBc2dBMEVCYWlJRElBQW9BZ2hJRFFBTEN5QUpRUUZxSWdrZ0RVWU5BaUFBS0FJNElnTW9BZ1FnQXlnQ0FDSUZhMEVDZFNBSlN3MEFDd3NRNXdFQUMwRUJDenNCQVg4Z0FFRzhGallDQUNBQUtBSk1JZ0VFUUNBQkVQY0JDeUFBUWR3VU5nSUFJQUFvQWlBaUFRUkFJQUFnQVRZQ0pDQUJFUGNCQ3lBQUN6NEJBWDhnQUVHOEZqWUNBQ0FBS0FKTUlnRUVRQ0FCRVBjQkN5QUFRZHdVTmdJQUlBQW9BaUFpQVFSQUlBQWdBVFlDSkNBQkVQY0JDeUFBRVBjQkN3UUFRUVVML1FNQ0QzOERmaU1BUVJCcklnUWtBQUpBSUFFcEF4QWlFVUlFZkNJU0lBRXBBd2hWRFFBZ0FTZ0NBQ0FScDJvb0FBQWhBeUFCSUJJM0F4QWdBMEVBU0EwQUlBQkJ6QUJxSUFNUWNpQUVRZ0EzQUFVZ0JFSUFOd01BSUFRZ0FSQVlSUTBBSUFOQkFVNEVRRUVBSUFRdEFBeHJRZjhCY1NFSklBQW9Ba3doRENBRUtBSUFJUTBnQkNnQ0NDRUNJQVFvQWdRaENrRUJJUWdEUUFKQUlBSkIveDlMRFFBZ0NrRUJTQTBBSUEwZ0NrRUJheUlLYWkwQUFDQUNRUWgwY2lFQ0N5QUNRUWgySUFsc0lnWWdBa0gvQVhFaUMyb2hEaUFDSUFZZ0NXcHJJUTlCQVNBSGRDRUNJQXdnQjBFRGRrSDgvLy8vQVhGcUlRWUNmeUFJSUFrZ0Mwc2lFSE1pQ0VFQmNVVUVRQ0FHS0FJQUlBSnlEQUVMSUFZb0FnQWdBa0YvYzNFTElRc2dEaUFQSUJBYklRSWdDRUVCY3lFSUlBWWdDellDQUNBSFFRRnFJZ2NnQTBjTkFBc0xJQUVwQXdnaUV5QUJLUU1RSWhGQ0JId2lFbE1OQUNBQktBSUFJZ01nRWFkcUtBQUFJUUlnQVNBU053TVFJQk1nRVVJSWZDSVJVdzBBSUFNZ0VxZHFLQUFBSVFNZ0FTQVJOd01RSUFJZ0Ewb05BQ0FBSUFNMkFoQWdBQ0FDTmdJTUlBT3NJQUtzZlNJUlF2Ny8vLzhIVmcwQVFRRWhCU0FBSUJHblFRRnFJZ0UyQWhRZ0FDQUJRUUYySWdJMkFoZ2dBRUVBSUFKck5nSWNJQUZCQVhFTkFDQUFJQUpCQVdzMkFoZ0xJQVJCRUdva0FDQUZDN0FNQWc1K0MzOGdCRUVDUmdSL0lBQkJBallDQ0NBQVFVQnJJQVUyQWdBQ1FDQUFLQUlrSUFCQklHb2lGaWdDQUNJRmF5SUVRUUoxSWdOQkFVMEVRQ0FXUVFJZ0Eyc1FDZ3dCQ3lBRVFRaEdEUUFnQUNBRlFRaHFOZ0lrQ3dKQUlBQW9BamdpQXlnQ0JDSUZJQU1vQWdBaUEyc2lCRUVCU0FSQVFRQWhCUXdCQ3lBRElBVkhCRUFnQUVFOGFpRVdJQVJCQW5VaUhVRUJJQjFCQVVvYklSNUJBU0VGQTBBQ2Z5QURJQmhCQW5ScUtBSUFJUlVqQUVIUUFHc2lGQ1FBUVg4aEJBSi9RWDhnRlVGL1JnMEFHaUFWUVFGcUlnTWdGVUVDYXlBRFFRTndHeUVFSUJWQkFXc2dGVUVEY0EwQUdpQVZRUUpxQ3lFWEFrQWdGaWdDSkNJREtBSUVJQU1vQWdBaUdtdEJBblVpRlNBV0tBSWdLQUljSWdNZ0JFRUNkR29vQWdBaUJFME5BQ0FWSUFNZ0YwRUNkR29vQWdBaUEwME5BQ0FhSUFSQkFuUnFLQUlBSVJjQ2Z3SkFBa0FnR2lBRFFRSjBhaWdDQUNJVklCaE9EUUFnRnlBWVRnMEFJQUlnRlVFRGRDSUVRUVJ5YWlnQ0FDRWJJQUlnRjBFRGRDSURRUVJ5YWlnQ0FDRWNBa0FnQWlBRWFpZ0NBQ0lFSUFJZ0Eyb29BZ0FpR2tjTkFDQWJJQnhIRFFBZ0ZpQWFOZ0lJSUJZZ0hEWUNEQXdDQ3lBV0tBSUVJQmhCQW5ScUtBSUFJUmtnRkVJQU53TklJQlJCUUd0Q0FEY0RBQ0FVUWdBM0F6Z2dGaWdDQUNJRExRQlVSUVJBSUFNb0FrUWdHVUVDZEdvb0FnQWhHUXNnQXlBWklBTXNBQmdnRkVFNGFoQ2tBU0FXS0FJRUlCZEJBblJxS0FJQUlSa2dGRUlBTndNd0lCUkNBRGNES0NBVVFnQTNBeUFnRmlnQ0FDSURMUUJVUlFSQUlBTW9Ba1FnR1VFQ2RHb29BZ0FoR1FzZ0F5QVpJQU1zQUJnZ0ZFRWdhaENrQVNBV0tBSUVJQlZCQW5ScUtBSUFJUlVnRkVJQU53TVlJQlJDQURjREVDQVVRZ0EzQXdnZ0ZpZ0NBQ0lETFFCVVJRUkFJQU1vQWtRZ0ZVRUNkR29vQWdBaEZRc2dBeUFWSUFNc0FCZ2dGRUVJYWhDa0FTQVVLUU1RSUJRcEF5Z2lFSDBpQ2lBS2ZpQVVLUU1JSUJRcEF5QWlFWDBpQ3lBTGZud2dGQ2tER0NBVUtRTXdJaEo5SWd3Z0RINThJZ2hRRFFCQkFDQVVLUU5BSWhNZ0VIMGdDbjRnRkNrRE9DSU9JQkY5SUF0K2ZDQVVLUU5JSWc4Z0VuMGdESDU4SWcxQy8vLy8vLy8vLy8vL0FDQU1JQXhDUDRjaUJud2dCb1VpQnlBS0lBcENQNGNpQm53Z0JvVWlDU0FMSUF0Q1A0Y2lCbndnQm9VaUJpQUdJQWxVR3lJR0lBWWdCMU1iZ0ZVTkFob0NRQUpBSUJNZ0VDQUtJQTErSUFoL2ZIMGlCaUFHZmlBT0lCRWdDeUFOZmlBSWYzeDlJZ1lnQm41OElBOGdFaUFNSUExK0lBaC9mSDBpQmlBR2Zud2dDSDRpQmtJQldBUkFJQVlpQjZkQkFXc05BZ3dCQzBJQ0lRY2dCaUVKQTBBZ0NVSUlWQTBCSUFsQ0FvZ2hDU0FIUWdHR0lRY01BQXNBQ3dOQUlBWWdCNEFnQjN4Q0FZZ2lCeUFIZmlBR1ZnMEFDd3NnRmlnQ0ZDSVhCRUFnRmlnQ0VDQVhRUUZySWhWQkEzWkIvUC8vL3dGeGFpZ0NBQ0VESUJZZ0ZUWUNGQ0FXSUEwZ0c2d2dIS3dpQm4waURuNGdCaUFJZm54Q0FDQUhJQVNzSUJxc0lnOTlJZ2wrSWdaOUlBWWdBeUFWZGtFQmNTSURHM3dnQ0g4K0Fnd2dGaUFKSUExK0lBZ2dEMzU4SUFjZ0RuNGlCa0lBSUFaOUlBTWJmQ0FJZno0Q0NBc2dGMEVBUnd3Q0N5QVdJQUlnRnlBWVNBUi9JQmRCQVhRRklCaEJBRXdFUUNBV1FnQTNBZ2dNQWdzZ0dFRUJkRUVDYXd0QkFuUnFJZ01vQWdBMkFnZ2dGaUFES0FJRU5nSU1DMEVCQ3lFRElCUkIwQUJxSkFBZ0F3d0JDeERuQVFBTFJRMENBa0FnQUNnQ0NFRUJTQTBBSUFJZ0dFRURkQ0lYYWlFVklBQW9BaUFoRzBFQUlRTURRQUpBSUFBZ0EwRUNkQ0lGYWlnQ1JDSWFJQUFvQWhBaUJFb0VRQ0FGSUJ0cUlBUTJBZ0FNQVFzZ0JTQWJhaUVGSUFBb0Fnd2lCQ0FhU2dSQUlBVWdCRFlDQUF3QkN5QUZJQm8yQWdBTElBTkJBV29pQXlBQUtBSUlJZ1ZJRFFBTFFRQWhCQ0FGUVFGSURRQWdBU0FYYWlFRkEwQWdGU0FFUVFKMEloZHFJZ01nQlNBWGFpZ0NBQ0FYSUJ0cUtBSUFhaUlYTmdJQUFrQWdBd0ovSUFBb0FoQWdGMGdFUUNBWElBQW9BaFJyREFFTElCY2dBQ2dDREU0TkFTQUFLQUlVSUJkcUN6WUNBQXNnQkVFQmFpSUVJQUFvQWdoSURRQUxDeUFZUVFGcUloZ2dIVWdoQlNBWUlCNUdEUUlnQUNnQ09DSURLQUlFSUFNb0FnQWlBMnRCQW5VZ0dFc05BQXNMRU9jQkFBc2dCVUVCY3dWQkFBdEJBWEVMbXdzQkQzOGdBQ0FFTmdJSUFuOGdCQ0FBS0FJa0lBQkJJR29pQXlnQ0FDSU1hMEVDZFNJRlN3UkFJQU1nQkNBRmF4QUtJQU1vQWdBaERDQUFLQUlJREFFTElBUWdCVWtFUUNBQUlBd2dCRUVDZEdvMkFpUUxJQVFMSVFNZ0FDZ0NOQ0VRSUFBb0FqQWhEMEYvSUFSQkFuUWdCRUgvLy8vL0EzRWdCRWNiSWdVUTZnRkJBQ0FGRVBvQklRMENRQ0FEUVFGSURRQURRQUpBSUEwZ0JrRUNkQ0lEYWlnQ0FDSUZJQUFvQWhBaUNVb0VRQ0FESUF4cUlBazJBZ0FNQVFzZ0F5QU1haUVESUFBb0Fnd2lDU0FGU2dSQUlBTWdDVFlDQUF3QkN5QURJQVUyQWdBTElBWkJBV29pQmlBQUtBSUlJZ05JRFFBTElBTkJBVWdOQUVFQUlRVURRQ0FDSUFWQkFuUWlBMm9pQmlBQklBTnFLQUlBSUFNZ0RHb29BZ0JxSWdNMkFnQUNRQ0FHQW44Z0FDZ0NFQ0FEU0FSQUlBTWdBQ2dDRkdzTUFRc2dBeUFBS0FJTVRnMEJJQUFvQWhRZ0Eyb0xOZ0lBQ3lBRlFRRnFJZ1VnQUNnQ0NDSURTQTBBQ3dzZ0FDZ0NPQ0lGS0FJRUlBVW9BZ0FpRVdzaUJVRUZUZ1JBSUFWQkFuVWlCVUVDSUFWQkFrb2JJUklnQlVFQklBVkJBVXNiSVJNZ0JFRitjU0VNSUFSQkFYRWhGRUVCSVFrRFFBSkFBa0FnQ1NBVFJ3UkFJQVFnQ1d3aERpQVJJQWxCQW5ScUtBSUFJZ1ZCZjBZTkFTQVBLQUlNSUFWQkFuUnFLQUlBSWdWQmYwWU5BU0FRS0FJQUlnWWdEeWdDQUNJSUlBVkJBblJxS0FJQVFRSjBhaWdDQUNFS0lBVkJBV29pQnlBRlFRSnJJQWRCQTNBYklnZEJmMFlFZnlBR1FRUnJCU0FHSUFnZ0IwRUNkR29vQWdCQkFuUnFDeWdDQUNFSFFYOUJBaUFGUVFOd0d5QUZhaUlGUVg5R0JIOGdCa0VFYXdVZ0JpQUlJQVZCQW5ScUtBSUFRUUowYWdzaEJTQUpJQXBNRFFFZ0J5QUpUZzBCSUFVb0FnQWlCU0FKVGcwQkFrQWdCRUVCU0EwQUlBUWdCV3doQ0NBRUlBZHNJUWNnQkNBS2JDRUtRUUFoQmlBTUlRVWdCRUVCUndSQUEwQWdEU0FHUVFKMGFpQUNJQVlnQ0dwQkFuUnFLQUlBSUFJZ0JpQUhha0VDZEdvb0FnQnFJQUlnQmlBS2FrRUNkR29vQWdCck5nSUFJQTBnQmtFQmNpSUxRUUowYWlBQ0lBZ2dDMnBCQW5ScUtBSUFJQUlnQnlBTGFrRUNkR29vQWdCcUlBSWdDaUFMYWtFQ2RHb29BZ0JyTmdJQUlBWkJBbW9oQmlBRlFRSnJJZ1VOQUFzTElCUkZEUUFnRFNBR1FRSjBhaUFDSUFZZ0NHcEJBblJxS0FJQUlBSWdCaUFIYWtFQ2RHb29BZ0JxSUFJZ0JpQUtha0VDZEdvb0FnQnJOZ0lBQ3lBRFFRRklEUUlnQWlBT1FRSjBJZ2RxSVFvZ0FDZ0NJQ0VJUVFBaEJnTkFBa0FnRFNBR1FRSjBJZ05xS0FJQUlnVWdBQ2dDRUNJTFNnUkFJQU1nQ0dvZ0N6WUNBQXdCQ3lBRElBaHFJUU1nQUNnQ0RDSUxJQVZLQkVBZ0F5QUxOZ0lBREFFTElBTWdCVFlDQUFzZ0JrRUJhaUlHSUFBb0FnZ2lBMGdOQUF0QkFDRUZJQU5CQVVnTkFpQUJJQWRxSVFZRFFDQUtJQVZCQW5RaUEyb2lCeUFESUFacUtBSUFJQU1nQ0dvb0FnQnFJZ00yQWdBQ1FDQUhBbjhnQUNnQ0VDQURTQVJBSUFNZ0FDZ0NGR3NNQVFzZ0F5QUFLQUlNVGcwQklBQW9BaFFnQTJvTE5nSUFDeUFGUVFGcUlnVWdBQ2dDQ0NJRFNBMEFDd3dDQ3hEbkFRQUxJQU5CQVVnTkFDQUNJQTVCQW5RaUIyb2hDaUFDSUFsQkFXc2dCR3hCQW5ScUlRc2dBQ2dDSUNFSVFRQWhCZ05BQWtBZ0N5QUdRUUowSWdOcUtBSUFJZ1VnQUNnQ0VDSU9TZ1JBSUFNZ0NHb2dEallDQUF3QkN5QURJQWhxSVFNZ0FDZ0NEQ0lPSUFWS0JFQWdBeUFPTmdJQURBRUxJQU1nQlRZQ0FBc2dCa0VCYWlJR0lBQW9BZ2dpQTBnTkFBdEJBQ0VGSUFOQkFVZ05BQ0FCSUFkcUlRWURRQ0FLSUFWQkFuUWlBMm9pQnlBRElBWnFLQUlBSUFNZ0NHb29BZ0JxSWdNMkFnQUNRQ0FIQW44Z0FDZ0NFQ0FEU0FSQUlBTWdBQ2dDRkdzTUFRc2dBeUFBS0FJTVRnMEJJQUFvQWhRZ0Eyb0xOZ0lBQ3lBRlFRRnFJZ1VnQUNnQ0NDSURTQTBBQ3dzZ0NVRUJhaUlKSUJKSERRQUxDeUFORU9zQlFRRUxtUThCR0g4Z0FDQUVOZ0lJQW44Z0JDQUFLQUlrSUFCQklHb2lBeWdDQUNJRmEwRUNkU0lHU3dSQUlBTWdCQ0FHYXhBS0lBTW9BZ0FoQlNBQUtBSUlEQUVMSUFRZ0Jra0VRQ0FBSUFVZ0JFRUNkR28yQWlRTElBUUxJUWhCZnlBRVFRSjBJQVJCLy8vLy93TnhJQVJIR3lJREVPb0JRUUFnQXhENkFTRU1JQU1RNmdGQkFDQURFUG9CSVJBQ1FDQUlRUUZJRFFBRFFBSkFJQXdnQjBFQ2RDSURhaWdDQUNJR0lBQW9BaEFpQ1VvRVFDQURJQVZxSUFrMkFnQU1BUXNnQXlBRmFpRURJQUFvQWd3aUNTQUdTZ1JBSUFNZ0NUWUNBQXdCQ3lBRElBWTJBZ0FMSUFkQkFXb2lCeUFBS0FJSUlnaElEUUFMSUFoQkFVZ05BRUVBSVFNRFFDQUNJQU5CQW5RaUJtb2lDU0FCSUFacUtBSUFJQVVnQm1vb0FnQnFJZ1kyQWdBQ1FDQUpBbjhnQUNnQ0VDQUdTQVJBSUFZZ0FDZ0NGR3NNQVFzZ0JpQUFLQUlNVGcwQklBQW9BaFFnQm1vTE5nSUFDeUFEUVFGcUlnTWdBQ2dDQ0NJSVNBMEFDd3NnQUNnQ09DSURLQUlFSUFNb0FnQWlGMnNpQTBFRlRnUkFJQUFvQWpRaEdDQUFLQUl3SVJRZ0EwRUNkU0lEUVFJZ0EwRUNTaHNoR1NBRFFRRWdBMEVCU3hzaEdpQUVRWDV4SVFVZ0JFRUJjU0VWSUFSQmZIRWhHeUFFUVFOeElSd2dCRUVCYXlFU0lBUkJBblFoSFVFQklRMERRQUpBQWtBQ1FBSkFJQTBnR2tjRVFDQVhJQTFCQW5ScUtBSUFJUWtnQkVFQlNDSVJSUVJBSUF4QkFDQWRFUG9CR2dzZ0NVRi9SZ1JBSUFRZ0RXd2hCZ3dFQ3lBVUtBSU1JUlpCQUNFT0lBa2hCZ05BQWtBZ0ZpQUdRUUowYWlnQ0FDSURRWDlHRFFBZ0dDZ0NBQ0lISUJRb0FnQWlDaUFEUVFKMGFpZ0NBRUVDZEdvb0FnQWhEeUFEUVFGcUlnc2dBMEVDYXlBTFFRTndHeUlMUVg5R0JIOGdCMEVFYXdVZ0J5QUtJQXRCQW5ScUtBSUFRUUowYWdzb0FnQWhDMEYvUVFJZ0EwRURjQnNnQTJvaUEwRi9SZ1IvSUFkQkJHc0ZJQWNnQ2lBRFFRSjBhaWdDQUVFQ2RHb0xJUU1nRFNBUFRBMEFJQXNnRFU0TkFDQURLQUlBSWdNZ0RVNE5BQUpBSUJFTkFDQURJQVJzSVFvZ0JDQUxiQ0VMSUFRZ0Qyd2hEMEVBSVFjZ0JTRURJQklFUUFOQUlCQWdCMEVDZEdvZ0FpQUhJQXBxUVFKMGFpZ0NBQ0FDSUFjZ0MycEJBblJxS0FJQWFpQUNJQWNnRDJwQkFuUnFLQUlBYXpZQ0FDQVFJQWRCQVhJaUUwRUNkR29nQWlBS0lCTnFRUUowYWlnQ0FDQUNJQXNnRTJwQkFuUnFLQUlBYWlBQ0lBOGdFMnBCQW5ScUtBSUFhellDQUNBSFFRSnFJUWNnQTBFQ2F5SUREUUFMQ3lBVkJFQWdFQ0FIUVFKMGFpQUNJQWNnQ21wQkFuUnFLQUlBSUFJZ0J5QUxha0VDZEdvb0FnQnFJQUlnQnlBUGFrRUNkR29vQWdCck5nSUFDeUFSRFFCQkFDRUhJQnNoQXlBU1FRSkxCRUFEUUNBTUlBZEJBblFpQ21vaUN5QUxLQUlBSUFvZ0VHb29BZ0JxTmdJQUlBd2dDa0VFY2lJTGFpSVBJQThvQWdBZ0N5QVFhaWdDQUdvMkFnQWdEQ0FLUVFoeUlndHFJZzhnRHlnQ0FDQUxJQkJxS0FJQWFqWUNBQ0FNSUFwQkRISWlDbW9pQ3lBTEtBSUFJQW9nRUdvb0FnQnFOZ0lBSUFkQkJHb2hCeUFEUVFScklnTU5BQXNMSUJ3aUEwVU5BQU5BSUF3Z0IwRUNkQ0lLYWlJTElBc29BZ0FnQ2lBUWFpZ0NBR28yQWdBZ0IwRUJhaUVISUFOQkFXc2lBdzBBQ3dzZ0RrRUJhaUVPQzBGL0FuOUJmMEYvUVFJZ0JrRURjQnNnQm1vaUEwRi9SZzBBR2tGL0lCWWdBMEVDZEdvb0FnQWlBMEYvUmcwQUdpQURRUUZySUFOQkEzQU5BQm9nQTBFQ2Fnc2lBeUFESUFsR0d5SUdRWDlIRFFBTElBUWdEV3doQmlBT1JRMERJQkVOQWtFQUlRY2dCU0VESUJKRkRRRURRQ0FNSUFkQkFuUWlDV29pQ2lBS0tBSUFJQTV0TmdJQUlBd2dDVUVFY21vaUNTQUpLQUlBSUE1dE5nSUFJQWRCQW1vaEJ5QURRUUpySWdNTkFBc01BUXNRNXdFQUN5QVZSUTBBSUF3Z0IwRUNkR29pQXlBREtBSUFJQTV0TmdJQUN5QUlRUUZJRFFFZ0FpQUdRUUowSWc1cUlRb2dBQ2dDSUNFSlFRQWhCd05BQWtBZ0RDQUhRUUowSWdOcUtBSUFJZ1lnQUNnQ0VDSUlTZ1JBSUFNZ0NXb2dDRFlDQUF3QkN5QURJQWxxSVFNZ0FDZ0NEQ0lJSUFaS0JFQWdBeUFJTmdJQURBRUxJQU1nQmpZQ0FBc2dCMEVCYWlJSElBQW9BZ2dpQ0VnTkFBdEJBQ0VESUFoQkFVZ05BU0FCSUE1cUlRY0RRQ0FLSUFOQkFuUWlCbW9pQ0NBR0lBZHFLQUlBSUFZZ0NXb29BZ0JxSWdZMkFnQUNRQ0FJQW44Z0FDZ0NFQ0FHU0FSQUlBWWdBQ2dDRkdzTUFRc2dCaUFBS0FJTVRnMEJJQUFvQWhRZ0Jtb0xOZ0lBQ3lBRFFRRnFJZ01nQUNnQ0NDSUlTQTBBQ3d3QkN5QUlRUUZJRFFBZ0FpQUdRUUowSWc1cUlRb2dBaUFOUVFGcklBUnNRUUowYWlFUklBQW9BaUFoQ1VFQUlRY0RRQUpBSUJFZ0IwRUNkQ0lEYWlnQ0FDSUdJQUFvQWhBaUNFb0VRQ0FESUFscUlBZzJBZ0FNQVFzZ0F5QUphaUVESUFBb0Fnd2lDQ0FHU2dSQUlBTWdDRFlDQUF3QkN5QURJQVkyQWdBTElBZEJBV29pQnlBQUtBSUlJZ2hJRFFBTFFRQWhBeUFJUVFGSURRQWdBU0FPYWlFSEEwQWdDaUFEUVFKMElnWnFJZ2dnQmlBSGFpZ0NBQ0FHSUFscUtBSUFhaUlHTmdJQUFrQWdDQUovSUFBb0FoQWdCa2dFUUNBR0lBQW9BaFJyREFFTElBWWdBQ2dDREU0TkFTQUFLQUlVSUFacUN6WUNBQXNnQTBFQmFpSURJQUFvQWdnaUNFZ05BQXNMSUExQkFXb2lEU0FaUncwQUN3c2dFQkRyQVNBTUVPc0JRUUVMYUFFQmZ5QUFRZVFYTmdJQUlBQW9BbUFpQVFSQUlBRVE5d0VMSUFBb0FsUWlBUVJBSUFFUTl3RUxJQUFvQWtnaUFRUkFJQUVROXdFTElBQW9BandpQVFSQUlBRVE5d0VMSUFCQjNCUTJBZ0FnQUNnQ0lDSUJCRUFnQUNBQk5nSWtJQUVROXdFTElBQUxhd0VCZnlBQVFlUVhOZ0lBSUFBb0FtQWlBUVJBSUFFUTl3RUxJQUFvQWxRaUFRUkFJQUVROXdFTElBQW9Ba2dpQVFSQUlBRVE5d0VMSUFBb0Fqd2lBUVJBSUFFUTl3RUxJQUJCM0JRMkFnQWdBQ2dDSUNJQkJFQWdBQ0FCTmdJa0lBRVE5d0VMSUFBUTl3RUwrQlVCSEg4akFFRkFhaUlHSkFBZ0FDQUVOZ0lJQWtBZ0JDQUFLQUlrSUFCQklHb2lCU2dDQUNJSWEwRUNkU0lEU3dSQUlBVWdCQ0FEYXhBS0RBRUxJQU1nQkUwTkFDQUFJQWdnQkVFQ2RHbzJBaVFMSUFaQ0FEY0RPQ0FHUWdBM0F6QWdCa0lBTndNb0lBWkNBRGNESUNBR1FnQTNBeGdnQmtJQU53TVFJQVpCQURZQ0FFRUFJUVVnQkFSQUlBWkJFR29nQkNBR0VCWWdCaWdDSENFSElBWW9BaUFoQlFzZ0JrRUFOZ0lBQWtBZ0JDQUZJQWRyUVFKMUlnTk5CRUFnQXlBRVRRMEJJQVlnQnlBRVFRSjBhallDSUF3QkN5QUdRUkJxUVF4eUlBUWdBMnNnQmhBV0N5QUdRUUEyQWdBQ1FDQUVJQVlvQWl3Z0JpZ0NLQ0lGYTBFQ2RTSURUUVJBSUFNZ0JFME5BU0FHSUFVZ0JFRUNkR28yQWl3TUFRc2dCa0VvYWlBRUlBTnJJQVlRRmdzZ0JrRUFOZ0lBQWtBZ0JDQUdLQUk0SUFZb0FqUWlCV3RCQW5VaUEwMEVRQ0FESUFSTkRRRWdCaUFGSUFSQkFuUnFOZ0k0REFFTElBWkJOR29nQkNBRGF5QUdFQllMUVFBaEJ3SkFJQUFvQWdoQkFFd05BQ0FBS0FJZ0lRZ2dCaWdDRUNFU0EwQUNRQ0FTSUFkQkFuUWlBMm9vQWdBaUJTQUFLQUlRSWdsS0JFQWdBeUFJYWlBSk5nSUFEQUVMSUFNZ0NHb2hBeUFBS0FJTUlna2dCVW9FUUNBRElBazJBZ0FNQVFzZ0F5QUZOZ0lBQ3lBSFFRRnFJZ2NnQUNnQ0NDSURTQTBBQ3lBRFFRRklEUUJCQUNFRkEwQWdBaUFGUVFKMElnTnFJaElnQVNBRGFpZ0NBQ0FESUFocUtBSUFhaUlETmdJQUFrQWdFZ0ovSUFBb0FoQWdBMGdFUUNBRElBQW9BaFJyREFFTElBTWdBQ2dDREU0TkFTQUFLQUlVSUFOcUN6WUNBQXNnQlVFQmFpSUZJQUFvQWdoSURRQUxDeUFBS0FJMElSc2dBQ2dDTUNFWlFSQVE2Z0VpRkVJQU53SUFJQlJDQURjQ0NDQUdRUUEyQWdnZ0JrSUFOd01BQWtBZ0JBUkFJQVJCZ0lDQWdBUlBEUUVnQmlBRVFRSjBJZ01RNmdFaUZUWUNBQ0FHSUFNZ0ZXb2lCVFlDQ0NBVlFRQWdBeEQ2QVJvZ0JpQUZOZ0lFQzBFQklROENRQ0FBS0FJNElnTW9BZ1FnQXlnQ0FDSWNheUlEUVFWSURRQWdBMEVDZFNJRFFRSWdBMEVDU2hzaEhTQURRUUVnQTBFQlN4c2hIaUFFUVg1eElSSWdCRUVCY1NFYUlBUkJmSEVoSHlBRVFRTnhJU0FnQkVFQmF5RVdJQVJCQW5RaElVRUJJUkFEUUFKQUFrQUNRQUpBSUJBZ0hrY0VRQ0FjSUJCQkFuUnFLQUlBSWdsQkEzQWhBd0ovQWtBZ0NVRi9SZzBBSUJrb0Fnd2lDMEYvUVFJZ0F4c2dDV29pRjBFQ2RHb2hEa0VCSVFwQkFDRURJQWtoQlFKQUEwQUNRQ0FMSUFWQkFuUnFLQUlBSWdoQmYwWU5BQ0FHUVJCcUlBTkJER3hxS0FJQUlRd2dHeWdDQUNJSElCa29BZ0FpRHlBSVFRSjBhaWdDQUVFQ2RHb29BZ0FoRVNBSVFRRnFJZzBnQ0VFQ2F5QU5RUU53R3lJTlFYOUdCSDhnQjBFRWF3VWdCeUFQSUExQkFuUnFLQUlBUVFKMGFnc29BZ0FoRFVGL1FRSWdDRUVEY0JzZ0NHb2lDRUYvUmdSL0lBZEJCR3NGSUFjZ0R5QUlRUUowYWlnQ0FFRUNkR29MSVFnZ0VDQVJUQTBBSUEwZ0VFNE5BQ0FJS0FJQUlnZ2dFRTROQUFKQUlBUkJBVWdOQUNBRUlBaHNJUThnQkNBTmJDRU5JQVFnRVd3aEVVRUFJUWNnRWlFSUlCWUVRQU5BSUF3Z0IwRUNkR29nQWlBSElBOXFRUUowYWlnQ0FDQUNJQWNnRFdwQkFuUnFLQUlBYWlBQ0lBY2dFV3BCQW5ScUtBSUFhellDQUNBTUlBZEJBWElpRTBFQ2RHb2dBaUFQSUJOcVFRSjBhaWdDQUNBQ0lBMGdFMnBCQW5ScUtBSUFhaUFDSUJFZ0UycEJBblJxS0FJQWF6WUNBQ0FIUVFKcUlRY2dDRUVDYXlJSURRQUxDeUFhUlEwQUlBd2dCMEVDZEdvZ0FpQUhJQTlxUVFKMGFpZ0NBQ0FDSUFjZ0RXcEJBblJxS0FJQWFpQUNJQWNnRVdwQkFuUnFLQUlBYXpZQ0FBdEJCQ0VJSUFOQkFXb2lBMEVFUmcwQ0N3SkFJQWtDZnlBS1FRRnhCRUJCZnlBRlFRRnFJZ2dnQlVFQ2F5QUlRUU53R3lJRlFYOUdEUUVhUVg4Z0N5QUZRUUowYWlnQ0FDSUZRWDlHRFFFYUlBVkJBV29pQ0NBRlFRSnJJQWhCQTNBYkRBRUxRWDlCZjBFQ0lBVkJBM0FiSUFWcUlnVkJmMFlOQUJwQmZ5QUxJQVZCQW5ScUtBSUFJZ1ZCZjBZTkFCb2dCVUVCYXlBRlFRTndEUUFhSUFWQkFtb0xJZ1ZHRFFBZ0JVRi9JQXBCQVhNZ0JVRi9SM0lpQ0VFQmNTSUhHeUVGSUFnZ0NuRWhDZ0pBSUFjTkFDQVhRWDlHRFFBZ0RpZ0NBQ0lGUVg5R0RRRWdCVUVCYXlBRlFRSnFJQVZCQTNBYklRVkJBQ0VLQ3lBRlFYOUhEUUVMQ3lBRElnaEJBVWdOQVFzZ0JFRUJTQ0lOUlFSQUlBWW9BZ0JCQUNBaEVQb0JHZ3NnRkNBSVFRRnJJZ05CQW5ScUlSRWdBQ0FEUVF4c2FpSURJUk1nQTBGQWF5Z0NBQ0VYUVFBaEQwRUFJUVZCQUNFSkEwQWdFU0FSS0FJQUlnTkJBV28yQWdBZ0F5QVhUdzBKQWtBZ0V5Z0NQQ0FEUVFOMlFmei8vLzhCY1dvb0FnQWdBM1pCQVhFTkFDQUpRUUZxSVFrZ0RRMEFJQVlvQWdBaENpQUdRUkJxSUFWQkRHeHFLQUlBSVF0QkFDRUhJQjhoQXlBV1FRTlBCRUFEUUNBS0lBZEJBblFpREdvaURpQU9LQUlBSUFzZ0RHb29BZ0JxTmdJQUlBb2dERUVFY2lJT2FpSVlJQmdvQWdBZ0N5QU9haWdDQUdvMkFnQWdDaUFNUVFoeUlnNXFJaGdnR0NnQ0FDQUxJQTVxS0FJQWFqWUNBQ0FLSUF4QkRISWlER29pRGlBT0tBSUFJQXNnREdvb0FnQnFOZ0lBSUFkQkJHb2hCeUFEUVFScklnTU5BQXNMSUNBaUEwVU5BQU5BSUFvZ0IwRUNkQ0lNYWlJT0lBNG9BZ0FnQ3lBTWFpZ0NBR28yQWdBZ0IwRUJhaUVISUFOQkFXc2lBdzBBQ3dzZ0JVRUJhaUlGSUFoSERRQUxJQVFnRUd3aUNDQUpSUTBCR2lBTkRRVWdCaWdDQUNFRFFRQWhCeUFTSVFVZ0ZnMEREQVFMSUFRZ0VHd0xJUU1nQUNnQ0NFRUJTQTBFSUFJZ0EwRUNkQ0lKYWlFS0lBSWdFRUVCYXlBRWJFRUNkR29oQ3lBQUtBSWdJUWhCQUNFSEEwQUNRQ0FMSUFkQkFuUWlBMm9vQWdBaUJTQUFLQUlRSWd4S0JFQWdBeUFJYWlBTU5nSUFEQUVMSUFNZ0NHb2hBeUFBS0FJTUlnd2dCVW9FUUNBRElBdzJBZ0FNQVFzZ0F5QUZOZ0lBQ3lBSFFRRnFJZ2NnQUNnQ0NDSURTQTBBQzBFQUlRVWdBMEVCU0EwRUlBRWdDV29oQ1FOQUlBb2dCVUVDZENJRGFpSUhJQU1nQ1dvb0FnQWdBeUFJYWlnQ0FHb2lBellDQUFKQUlBY0NmeUFBS0FJUUlBTklCRUFnQXlBQUtBSVVhd3dCQ3lBRElBQW9BZ3hPRFFFZ0FDZ0NGQ0FEYWdzMkFnQUxJQVZCQVdvaUJTQUFLQUlJU0EwQUN3d0VDeERuQVFBTEEwQWdBeUFIUVFKMElncHFJZ3NnQ3lnQ0FDQUpiVFlDQUNBRElBcEJCSEpxSWdvZ0NpZ0NBQ0FKYlRZQ0FDQUhRUUpxSVFjZ0JVRUNheUlGRFFBTEN5QWFSUTBBSUFNZ0IwRUNkR29pQXlBREtBSUFJQWx0TmdJQUN5QUFLQUlJUVFGSURRQWdBaUFJUVFKMElnbHFJUW9nQUNnQ0lDRUlRUUFoQndOQUFrQWdGU0FIUVFKMElnTnFLQUlBSWdVZ0FDZ0NFQ0lMU2dSQUlBTWdDR29nQ3pZQ0FBd0JDeUFESUFocUlRTWdBQ2dDRENJTElBVktCRUFnQXlBTE5nSUFEQUVMSUFNZ0JUWUNBQXNnQjBFQmFpSUhJQUFvQWdnaUEwZ05BQXRCQUNFRklBTkJBVWdOQUNBQklBbHFJUWtEUUNBS0lBVkJBblFpQTJvaUJ5QURJQWxxS0FJQUlBTWdDR29vQWdCcUlnTTJBZ0FDUUNBSEFuOGdBQ2dDRUNBRFNBUkFJQU1nQUNnQ0ZHc01BUXNnQXlBQUtBSU1UZzBCSUFBb0FoUWdBMm9MTmdJQUN5QUZRUUZxSWdVZ0FDZ0NDRWdOQUFzTFFRRWhEeUFRUVFGcUloQWdIVWNOQUFzTElBWW9BZ0FpQUFSQUlBWWdBRFlDQkNBQUVQY0JDeUFVRVBjQklBWW9BalFpQUFSQUlBWWdBRFlDT0NBQUVQY0JDeUFHS0FJb0lnQUVRQ0FHSUFBMkFpd2dBQkQzQVFzZ0JpZ0NIQ0lBQkVBZ0JpQUFOZ0lnSUFBUTl3RUxJQVlvQWhBaUFBUkFJQVlnQURZQ0ZDQUFFUGNCQ3lBR1FVQnJKQUFnRHc4TEVPY0JBQXRUQVFGL0lBQkJuQmcyQWdBZ0FDZ0NUQ0lCQkVBZ0FSRDNBUXNnQUNnQ1JDRUJJQUJCQURZQ1JDQUJCRUFnQVJEckFRc2dBRUhjRkRZQ0FDQUFLQUlnSWdFRVFDQUFJQUUyQWlRZ0FSRDNBUXNnQUF0V0FRRi9JQUJCbkJnMkFnQWdBQ2dDVENJQkJFQWdBUkQzQVFzZ0FDZ0NSQ0VCSUFCQkFEWUNSQ0FCQkVBZ0FSRHJBUXNnQUVIY0ZEWUNBQ0FBS0FJZ0lnRUVRQ0FBSUFFMkFpUWdBUkQzQVFzZ0FCRDNBUXZERFFNSWZ3OTlBWHdnQUNBRk5nSkFJQUFnQkRZQ1NFRi9JQVJCQW5RZ0JFSC8vLy8vQTNFZ0JFY2JFT29CSVFNZ0FDZ0NSQ0VGSUFBZ0F6WUNSQ0FGQkVBZ0JSRHJBUXNnQUNBRU5nSUlBa0FnQkNBQUtBSWtJQUJCSUdvaUJTZ0NBQ0lEYTBFQ2RTSUpTd1JBSUFVZ0JDQUpheEFLREFFTElBUWdDVThOQUNBQUlBTWdCRUVDZEdvMkFpUUxBa0FnQUNnQ09DSURLQUlFSWdrZ0F5Z0NBQ0lGYXlJRFFRRklEUUFnQlNBSlJ3UkFJQU5CQW5ZaUEwRUJJQU5CQVVzYklRMUJBQ0VKQTBBZ0JTQUpRUUowYWlnQ0FDRUhRd0FBQUFBaER5TUFRVEJySWdna0FFRi9JUVpCZnlFS0FrQWdCMEYvUmcwQUlBQW9BakFoQlNBSFFRRnFJZ01nQjBFQ2F5QURRUU53R3lJRFFYOUhCRUFnQlNnQ0FDQURRUUowYWlnQ0FDRUdDMEYvUVFJZ0IwRURjQnNnQjJvaUEwRi9SZzBBSUFVb0FnQWdBMEVDZEdvb0FnQWhDZ3NDUUFKQUlBQW9BalFpQXlnQ0JDQURLQUlBSWdWclFRSjFJZ01nQmswTkFDQURJQXBORFFBZ0JTQUdRUUowYWlnQ0FDRUhBa0FDUUNBRklBcEJBblJxS0FJQUlnWWdDVTROQUNBSElBbE9EUUFnQWlBQUtBSklJZ01nQm14QkFuUnFJZ1VvQWdTeUlSTWdBaUFESUFkc1FRSjBhaUlES0FJRXNpRVZBa0FnQlNnQ0FMSWlGaUFES0FJQXNpSWJYQTBBSUJNZ0ZWd05BQ0FBS0FKRUlnTUNmeUFUaTBNQUFBQlBYUVJBSUJPb0RBRUxRWUNBZ0lCNEN6WUNCQ0FXaTBNQUFBQlBYUVJBSUFNZ0ZxZzJBZ0FNQXdzZ0EwR0FnSUNBZURZQ0FBd0NDeUFBS0FKQUlBbEJBblJxS0FJQUlRb2dDRUVBTmdJb0lBaENBRGNESUNBQUtBSThJZ010QUZSRkJFQWdBeWdDUkNBS1FRSjBhaWdDQUNFS0N5QURJQW9nQXl3QUdDQUlRU0JxRUtNQklBQW9Ba0FnQjBFQ2RHb29BZ0FoQlNBSVFRQTJBaGdnQ0VJQU53TVFJQUFvQWp3aUF5MEFWRVVFUUNBREtBSkVJQVZCQW5ScUtBSUFJUVVMSUFNZ0JTQURMQUFZSUFoQkVHb1Fvd0VnQUNnQ1FDQUdRUUowYWlnQ0FDRUZJQWhCQURZQ0NDQUlRZ0EzQXdBZ0FDZ0NQQ0lETFFCVVJRUkFJQU1vQWtRZ0JVRUNkR29vQWdBaEJRc2dBeUFGSUFNc0FCZ2dDQkNqQVNBSUtnSUFJQWdxQWhBaUhKTWlGeUFYbEVNQUFBQUFraUFJS2dJRUlBZ3FBaFFpRUpNaUdDQVlsSklnQ0NvQ0NDQUlLZ0lZSWhHVEloa2dHWlNTSVJvZ0NDb0NLQ0VPSUFncUFpUWhGQ0FJS2dJZ0lSSUNmU0FBS0FKWVFZSUNUZ1JBUXdBQUFBQWdHa01BQUFBQVhrVU5BUm9MSUE0Z0VaTWlEaUFaSUJjZ0VpQWNreUlSbEVNQUFBQUFraUFZSUJRZ0VKTWlFcFNTSUJrZ0RwU1NJQnFWSWcrVWt5SU9JQTZVSUJJZ0dDQVBsSk1pRGlBT2xDQVJJQmNnRDVTVElnNGdEcFJEQUFBQUFKS1NraUFhbFpFTElSUWdBQ2dDVENBQUtBSlFRUUZySWdWQkEzWkIvUC8vL3dGeGFpZ0NBQ0VESUFBZ0JUWUNVQ0FUSUJXVEloRWdENVFnRlpJZ0ZpQWJreUlTSUJTVUlnNGdEb3dnQXlBRmRrRUJjU0lERzVJaEVBSkFJQklnRDVRZ0c1SWdFU0FVbENJT2pDQU9JQU1ia2lJT0lBNWNCRUFnQUNnQ1JDSUdRWUNBZ0lCNE5nSUFEQUVMSUFBb0FrUWlCZ0ovSUE2N1JBQUFBQUFBQU9BL29Kd2lIWmxFQUFBQUFBQUE0RUZqQkVBZ0hhb01BUXRCZ0lDQWdIZ0xOZ0lBQ3lBR1FZQ0FnSUI0QW44Z0VMdEVBQUFBQUFBQTREK2duQ0lkbVVRQUFBQUFBQURnUVdNRVFDQWRxZ3dCQzBHQWdJQ0FlQXNnRUNBUVhCczJBZ1FNQVFzQ2Z5QUhJQWxJQkVBZ0FDZ0NTQ0lLSUFkc0RBRUxRUUFoQmlBSlFRQk1CRUFnQUNnQ1NFRUFUQTBDSUFBb0FrUWhBd05BSUFNZ0JrRUNkR3BCQURZQ0FDQUdRUUZxSWdZZ0FDZ0NTRWdOQUFzTUFnc2dBQ2dDU0NJS0lBbEJBV3RzQ3lFRklBcEJBVWdOQUNBQUtBSkVJUU5CQUNFR0EwQWdBeUFHUVFKMGFpQUNJQVVnQm1wQkFuUnFLQUlBTmdJQUlBWkJBV29pQmlBQUtBSklTQTBBQ3dzZ0NFRXdhaVFBREFFTEVPY0JBQXNDUUNBQUtBSUlRUUZJRFFBZ0FpQUVJQWxzUVFKMElnaHFJUW9nQUNnQ0lDRUxJQUFvQWtRaEIwRUFJUVVEUUFKQUlBY2dCVUVDZENJR2FpZ0NBQ0lNSUFBb0FoQWlBMG9FUUNBR0lBdHFJQU0yQWdBTUFRc2dCaUFMYWlFR0lBQW9BZ3dpQXlBTVNnUkFJQVlnQXpZQ0FBd0JDeUFHSUF3MkFnQUxJQVZCQVdvaUJTQUFLQUlJSWdaSURRQUxRUUFoQXlBR1FRRklEUUFnQVNBSWFpRUdBMEFnQ2lBRFFRSjBJZ2RxSWdVZ0JpQUhhaWdDQUNBSElBdHFLQUlBYWlJSE5nSUFBa0FnQlFKL0lBQW9BaEFnQjBnRVFDQUhJQUFvQWhSckRBRUxJQWNnQUNnQ0RFNE5BU0FBS0FJVUlBZHFDellDQUFzZ0EwRUJhaUlESUFBb0FnaElEUUFMQ3lBSlFRRnFJZ2tnRFVZTkFpQUFLQUk0SWdNb0FnUWdBeWdDQUNJRmEwRUNkU0FKU3cwQUN3c1E1d0VBQzBFQkN6c0JBWDhnQUVIVUdEWUNBQ0FBS0FKTUlnRUVRQ0FCRVBjQkN5QUFRZHdVTmdJQUlBQW9BaUFpQVFSQUlBQWdBVFlDSkNBQkVQY0JDeUFBQ3o0QkFYOGdBRUhVR0RZQ0FDQUFLQUpNSWdFRVFDQUJFUGNCQ3lBQVFkd1VOZ0lBSUFBb0FpQWlBUVJBSUFBZ0FUWUNKQ0FCRVBjQkN5QUFFUGNCQzhBTUFnNStDMzhnQkVFQ1JnUi9JQUJCQWpZQ0NDQUFRVUJySUFVMkFnQUNRQ0FBS0FJa0lBQkJJR29pRmlnQ0FDSUZheUlFUVFKMUlnTkJBVTBFUUNBV1FRSWdBMnNRQ2d3QkN5QUVRUWhHRFFBZ0FDQUZRUWhxTmdJa0N3SkFJQUFvQWpnaUF5Z0NCQ0lGSUFNb0FnQWlBMnNpQkVFQlNBUkFRUUFoQlF3QkN5QURJQVZIQkVBZ0FFRThhaUVXSUFSQkFuVWlIVUVCSUIxQkFVb2JJUjVCQVNFRkEwQUNmeUFESUJoQkFuUnFLQUlBSVJrakFFSFFBR3NpRlNRQVFYOGhGRUYvSVJvQ1FDQVpRWDlHRFFBZ0ZpZ0NJQ0VFSUJsQkFXb2lBeUFaUVFKcklBTkJBM0FiSWdOQmYwY0VRQ0FFS0FJQUlBTkJBblJxS0FJQUlSUUxRWDlCQWlBWlFRTndHeUFaYWlJRFFYOUdEUUFnQkNnQ0FDQURRUUowYWlnQ0FDRWFDd0pBSUJZb0FpUWlBeWdDQkNBREtBSUFJZ1JyUVFKMUlnTWdGRTBOQUNBRElCcE5EUUFnQkNBVVFRSjBhaWdDQUNFVUFuOENRQUpBSUFRZ0drRUNkR29vQWdBaUdpQVlUZzBBSUJRZ0dFNE5BQ0FDSUJwQkEzUWlCRUVFY21vb0FnQWhHeUFDSUJSQkEzUWlBMEVFY21vb0FnQWhIQUpBSUFJZ0JHb29BZ0FpQkNBQ0lBTnFLQUlBSWhsSERRQWdHeUFjUncwQUlCWWdHVFlDQ0NBV0lCdzJBZ3dNQWdzZ0ZpZ0NCQ0FZUVFKMGFpZ0NBQ0VYSUJWQ0FEY0RTQ0FWUVVCclFnQTNBd0FnRlVJQU53TTRJQllvQWdBaUF5MEFWRVVFUUNBREtBSkVJQmRCQW5ScUtBSUFJUmNMSUFNZ0Z5QURMQUFZSUJWQk9Hb1FwQUVnRmlnQ0JDQVVRUUowYWlnQ0FDRVhJQlZDQURjRE1DQVZRZ0EzQXlnZ0ZVSUFOd01nSUJZb0FnQWlBeTBBVkVVRVFDQURLQUpFSUJkQkFuUnFLQUlBSVJjTElBTWdGeUFETEFBWUlCVkJJR29RcEFFZ0ZpZ0NCQ0FhUVFKMGFpZ0NBQ0VYSUJWQ0FEY0RHQ0FWUWdBM0F4QWdGVUlBTndNSUlCWW9BZ0FpQXkwQVZFVUVRQ0FES0FKRUlCZEJBblJxS0FJQUlSY0xJQU1nRnlBRExBQVlJQlZCQ0dvUXBBRWdGU2tERUNBVktRTW9JaEI5SWdvZ0NuNGdGU2tEQ0NBVktRTWdJaEY5SWdzZ0MzNThJQlVwQXhnZ0ZTa0RNQ0lTZlNJTUlBeCtmQ0lJVUEwQVFRQWdGU2tEUUNJVElCQjlJQXArSUJVcEF6Z2lEaUFSZlNBTGZud2dGU2tEU0NJUElCSjlJQXgrZkNJTlF2Ly8vLy8vLy8vLy93QWdEQ0FNUWorSElnWjhJQWFGSWdjZ0NpQUtRaitISWdaOElBYUZJZ2tnQ3lBTFFqK0hJZ1o4SUFhRklnWWdCaUFKVkJzaUJpQUdJQWRURzRCVkRRSWFBa0FDUUNBVElCQWdDaUFOZmlBSWYzeDlJZ1lnQm40Z0RpQVJJQXNnRFg0Z0NIOThmU0lHSUFaK2ZDQVBJQklnRENBTmZpQUlmM3g5SWdZZ0JuNThJQWgrSWdaQ0FWZ0VRQ0FHSWdlblFRRnJEUUlNQVF0Q0FpRUhJQVloQ1FOQUlBbENDRlFOQVNBSlFnS0lJUWtnQjBJQmhpRUhEQUFMQUFzRFFDQUdJQWVBSUFkOFFnR0lJZ2NnQjM0Z0JsWU5BQXNMSUJZb0FoUWlGQVJBSUJZb0FoQWdGRUVCYXlJYVFRTjJRZnovLy84QmNXb29BZ0FoQXlBV0lCbzJBaFFnRmlBTklCdXNJQnlzSWdaOUlnNStJQVlnQ0g1OFFnQWdCeUFFckNBWnJDSVBmU0lKZmlJR2ZTQUdJQU1nR25aQkFYRWlBeHQ4SUFoL1BnSU1JQllnQ1NBTmZpQUlJQTkrZkNBSElBNStJZ1pDQUNBR2ZTQURHM3dnQ0g4K0FnZ0xJQlJCQUVjTUFnc2dGaUFDSUJRZ0dFZ0VmeUFVUVFGMEJTQVlRUUJNQkVBZ0ZrSUFOd0lJREFJTElCaEJBWFJCQW1zTFFRSjBhaUlES0FJQU5nSUlJQllnQXlnQ0JEWUNEQXRCQVFzaEF5QVZRZEFBYWlRQUlBTU1BUXNRNXdFQUMwVU5BZ0pBSUFBb0FnaEJBVWdOQUNBQ0lCaEJBM1FpRkdvaEdpQUFLQUlnSVJ0QkFDRURBMEFDUUNBQUlBTkJBblFpQldvb0FrUWlHU0FBS0FJUUlnUktCRUFnQlNBYmFpQUVOZ0lBREFFTElBVWdHMm9oQlNBQUtBSU1JZ1FnR1VvRVFDQUZJQVEyQWdBTUFRc2dCU0FaTmdJQUN5QURRUUZxSWdNZ0FDZ0NDQ0lGU0EwQUMwRUFJUVFnQlVFQlNBMEFJQUVnRkdvaEJRTkFJQm9nQkVFQ2RDSVVhaUlESUFVZ0ZHb29BZ0FnRkNBYmFpZ0NBR29pRkRZQ0FBSkFJQU1DZnlBQUtBSVFJQlJJQkVBZ0ZDQUFLQUlVYXd3QkN5QVVJQUFvQWd4T0RRRWdBQ2dDRkNBVWFnczJBZ0FMSUFSQkFXb2lCQ0FBS0FJSVNBMEFDd3NnR0VFQmFpSVlJQjFJSVFVZ0dDQWVSZzBDSUFBb0FqZ2lBeWdDQkNBREtBSUFJZ05yUVFKMUlCaExEUUFMQ3hEbkFRQUxJQVZCQVhNRlFRQUxRUUZ4QzR3RkFRcC9JQUFnQkRZQ0NBSi9JQVFnQUNnQ0pDQUFRU0JxSWdVb0FnQWlDR3RCQW5VaUJrc0VRQ0FGSUFRZ0Jtc1FDaUFGS0FJQUlRZ2dBQ2dDQ0F3QkN5QUVJQVpKQkVBZ0FDQUlJQVJCQW5ScU5nSWtDeUFFQ3lFRlFRQWhCa0YvSUFSQkFuUWdCRUgvLy8vL0EzRWdCRWNiSWdjUTZnRkJBQ0FIRVBvQklRd0NRQ0FGUVFGSURRQURRQUpBSUF3Z0JrRUNkQ0lGYWlnQ0FDSUhJQUFvQWhBaUNVb0VRQ0FGSUFocUlBazJBZ0FNQVFzZ0JTQUlhaUVGSUFBb0Fnd2lDU0FIU2dSQUlBVWdDVFlDQUF3QkN5QUZJQWMyQWdBTElBWkJBV29pQmlBQUtBSUlJZ1ZJRFFBTElBVkJBVWdOQUVFQUlRWURRQ0FDSUFaQkFuUWlCV29pQnlBQklBVnFLQUlBSUFVZ0NHb29BZ0JxSWdVMkFnQUNRQ0FIQW44Z0FDZ0NFQ0FGU0FSQUlBVWdBQ2dDRkdzTUFRc2dCU0FBS0FJTVRnMEJJQUFvQWhRZ0JXb0xOZ0lBQ3lBR1FRRnFJZ1lnQUNnQ0NDSUZTQTBBQ3dzZ0F5QUVTZ1JBUVFBZ0JHdEJBblFoRFNBRUlRZ0RRQUpBSUFWQkFVZ05BQ0FDSUFoQkFuUWlDbW9pRGlBTmFpRVBJQUFvQWlBaEIwRUFJUVlEUUFKQUlBOGdCa0VDZENJRmFpZ0NBQ0lKSUFBb0FoQWlDMG9FUUNBRklBZHFJQXMyQWdBTUFRc2dCU0FIYWlFRklBQW9BZ3dpQ3lBSlNnUkFJQVVnQ3pZQ0FBd0JDeUFGSUFrMkFnQUxJQVpCQVdvaUJpQUFLQUlJSWdWSURRQUxRUUFoQmlBRlFRRklEUUFnQVNBS2FpRUpBMEFnRGlBR1FRSjBJZ1ZxSWdvZ0JTQUphaWdDQUNBRklBZHFLQUlBYWlJRk5nSUFBa0FnQ2dKL0lBQW9BaEFnQlVnRVFDQUZJQUFvQWhSckRBRUxJQVVnQUNnQ0RFNE5BU0FBS0FJVUlBVnFDellDQUFzZ0JrRUJhaUlHSUFBb0FnZ2lCVWdOQUFzTElBUWdDR29pQ0NBRFNBMEFDd3NnREJEckFVRUJDNXNFQVFOL0lBRWdBQ0FCUmlJQ09nQU1Ba0FnQWcwQUEwQWdBU2dDQ0NJQ0xRQU1EUUVDUUFKL0lBSWdBaWdDQ0NJREtBSUFJZ1JHQkVBQ1FDQURLQUlFSWdSRkRRQWdCQzBBREEwQURBTUxBa0FnQVNBQ0tBSUFSZ1JBSUFJaEFRd0JDeUFDSUFJb0FnUWlBU2dDQUNJQU5nSUVJQUVnQUFSL0lBQWdBallDQ0NBQ0tBSUlCU0FEQ3pZQ0NDQUNLQUlJSWdBZ0FDZ0NBQ0FDUjBFQ2RHb2dBVFlDQUNBQklBSTJBZ0FnQWlBQk5nSUlJQUVvQWdnaEF3c2dBVUVCT2dBTUlBTkJBRG9BRENBRElBTW9BZ0FpQUNnQ0JDSUJOZ0lBSUFFRVFDQUJJQU0yQWdnTElBQWdBeWdDQ0RZQ0NDQURLQUlJSWdFZ0FTZ0NBQ0FEUjBFQ2RHb2dBRFlDQUNBQUlBTTJBZ1FnQTBFSWFnd0JDd0pBSUFSRkRRQWdCQzBBREEwQURBSUxBa0FnQVNBQ0tBSUFSd1JBSUFJaEFRd0JDeUFDSUFFb0FnUWlBRFlDQUNBQklBQUVmeUFBSUFJMkFnZ2dBaWdDQ0FVZ0F3czJBZ2dnQWlnQ0NDSUFJQUFvQWdBZ0FrZEJBblJxSUFFMkFnQWdBU0FDTmdJRUlBSWdBVFlDQ0NBQktBSUlJUU1MSUFGQkFUb0FEQ0FEUVFBNkFBd2dBeUFES0FJRUlnQW9BZ0FpQVRZQ0JDQUJCRUFnQVNBRE5nSUlDeUFBSUFNb0FnZzJBZ2dnQXlnQ0NDSUJJQUVvQWdBZ0EwZEJBblJxSUFBMkFnQWdBQ0FETmdJQUlBTkJDR29MSUFBMkFnQU1BZ3NnQkVFTWFpRUJJQUpCQVRvQURDQURJQUFnQTBZaUFqb0FEQ0FCUVFFNkFBQWdBeUVCSUFKRkRRQUxDd3VKQVFFQ2Z5TUFRUkJySWdNa0FDQUFJQUUyQWdRZ0FTZ0NBQ0VFSUFFb0FnUWhBU0FEUVFBNkFBOGdBRUVZYWlBQklBUnJRUUoxUVFOdUlBTkJEMm9RUmlBQUtBSUVJZ0VvQWh3aEJDQUJLQUlZSVFFZ0EwRUFPZ0FPSUFCQkpHb2dCQ0FCYTBFQ2RTQURRUTVxRUVZZ0FDQUNLUUlJTndJUUlBQWdBaWtDQURjQ0NDQURRUkJxSkFBTGp3RUJBWDhnQUVIY0dUWUNBQ0FBS0FKWUlnRUVRQ0FBSUFFMkFsd2dBUkQzQVFzZ0FDZ0NTQ0lCQkVBZ0FDQUJOZ0pNSUFFUTl3RUxJQUFvQWp3aUFRUkFJQUJCUUdzZ0FUWUNBQ0FCRVBjQkN5QUFLQUl3SWdFRVFDQUFJQUUyQWpRZ0FSRDNBUXNnQUVId0dUWUNBQ0FBS0FJa0lnRUVRQ0FCRVBjQkN5QUFLQUlZSWdFRVFDQUJFUGNCQ3lBQUM1UUJBUUYvSUFCQjNCazJBZ2dnQUVIRUdUWUNBQ0FBS0FKZ0lnRUVRQ0FBSUFFMkFtUWdBUkQzQVFzZ0FDZ0NVQ0lCQkVBZ0FDQUJOZ0pVSUFFUTl3RUxJQUFvQWtRaUFRUkFJQUFnQVRZQ1NDQUJFUGNCQ3lBQUtBSTRJZ0VFUUNBQUlBRTJBandnQVJEM0FRc2dBRUh3R1RZQ0NDQUFLQUlzSWdFRVFDQUJFUGNCQ3lBQUtBSWdJZ0VFUUNBQkVQY0JDeUFBQzVjQkFRRi9JQUJCM0JrMkFnZ2dBRUhFR1RZQ0FDQUFLQUpnSWdFRVFDQUFJQUUyQW1RZ0FSRDNBUXNnQUNnQ1VDSUJCRUFnQUNBQk5nSlVJQUVROXdFTElBQW9Ba1FpQVFSQUlBQWdBVFlDU0NBQkVQY0JDeUFBS0FJNElnRUVRQ0FBSUFFMkFqd2dBUkQzQVFzZ0FFSHdHVFlDQ0NBQUtBSXNJZ0VFUUNBQkVQY0JDeUFBS0FJZ0lnRUVRQ0FCRVBjQkN5QUFFUGNCQzRvREFRdC9JQUFvQWd3aENpQUFLQUpzSWdJb0FsQWhCQ0FCUVFBNkFGUUNRQ0FCS0FKSUlBRW9Ba1FpQld0QkFuVWlBeUFFU1FSQUlBRkJ4QUJxSUFRZ0EydEJ3Qk1RRmlBQUtBSnNJZ0lvQWxBaEJBd0JDeUFESUFSTkRRQWdBU0FGSUFSQkFuUnFOZ0pJQ3lBQ0tBSmtJQUlvQW1BaUMyc2lBa1VFUUVFQkR3c2dBa0VNYlNJQ1FRRWdBa0VCU3hzaERFRUFJUUlDUUFOQUFrQWdBa0hWcXRXcUJVWU5BQ0FLS0FJQUlBSkJBMnhCQW5ScUlnTW9BZ0FpQjBGL1JnMEFJQXNnQWtFTWJHb2lCU2dDQUNJR0lBUlBEUUFnQUNnQ2NDZ0NEQ0lKSUFkQkFuUnFLQUlBSWdnZ0JFOE5BQ0FCS0FKRUlnY2dCa0VDZEdvZ0NEWUNBQ0FES0FJRUlnWkJmMFlOQUNBRktBSUVJZ2dnQkU4TkFDQUpJQVpCQW5ScUtBSUFJZ1lnQkU4TkFDQUhJQWhCQW5ScUlBWTJBZ0FnQXlnQ0NDSURRWDlHRFFBZ0JTZ0NDQ0lGSUFSUERRQWdDU0FEUVFKMGFpZ0NBQ0lESUFSUERRQWdCeUFGUVFKMGFpQUROZ0lBUVFFaEF5QUNRUUZxSWdJZ0RFY05BUXdDQ3d0QkFDRURDeUFEQzdzREFRZC9Jd0JCRUdzaUJTUUFBa0FDUUNBQUtBSU1JZ0VvQWh3Z0FTZ0NHR3NpQTBFQ2RTSUVJQUFvQWdRaUFTZ0NDQ0FCS0FJQUlnSnJRUUoxVFEwQUlBTkJmMHdOQVNBQktBSUVJUVlnQXhEcUFTSURJQVJCQW5ScUlRY2dBeUFHSUFKcklnUnFJUVlnQkVFQlRnUkFJQU1nQWlBRUVQa0JHZ3NnQVNBSE5nSUlJQUVnQmpZQ0JDQUJJQU0yQWdBZ0FrVU5BQ0FDRVBjQkN5QUFLQUlNSWdFb0Fod2hBaUFCS0FJWUlRRWdCVUVBTmdJTUFrQWdBaUFCYTBFQ2RTSUJJQUFvQW1RZ0FFSGdBR29pQXlnQ0FDSUVhMEVDZFNJQ1N3UkFJQU1nQVNBQ2F5QUZRUXhxRUJZTUFRc2dBU0FDVHcwQUlBQWdCQ0FCUVFKMGFqWUNaQXNnQUVFSWFpRURBa0FnQUNnQ2RDSUJCRUFnQVNnQ0FDSUVJQUVvQWdSR0JFQkJBU0VDREFJTFFRQWhBUU5BSUFNZ0JDQUJRUUowYWlnQ0FCRFJBU0lDUlEwQ0lBRkJBV29pQVNBQUtBSjBJZ1FvQWdRZ0JDZ0NBQ0lFYTBFQ2RVa05BQXNNQVF0QkFTRUNJQUFvQWd3aUFDZ0NCQ0FBS0FJQWEwRUNkVUVEYmlJQVFRRkpEUUJCQUNFQkEwQWdBeUFCUVFOc0VORUJJZ0pGRFFFZ0FVRUJhaUlCSUFCSERRQUxDeUFGUVJCcUpBQWdBZzhMRVBnQkFBdXhFZ0VLZndKQUFrQUNRQUpBQWtBZ0FDZ0NYQ0FBS0FKWVJnMEFBa0FnQUNnQ05DSUNJQUFvQWpoSEJFQWdBaUFCTmdJQUlBQWdBa0VFYWpZQ05Bd0JDeUFDSUFBb0FqQWlBbXNpQlVFQ2RTSUdRUUZxSWdOQmdJQ0FnQVJQRFFVZ0F5QUZRUUYxSWdRZ0F5QUVTeHRCLy8vLy93TWdCa0gvLy8vL0FVa2JJZ01FZnlBRFFZQ0FnSUFFVHcwRElBTkJBblFRNmdFRlFRQUxJZ1FnQmtFQ2RHb2lCaUFCTmdJQUlBVkJBVTRFUUNBRUlBSWdCUkQ1QVJvTElBQWdCQ0FEUVFKMGFqWUNPQ0FBSUFaQkJHbzJBalFnQUNBRU5nSXdJQUpGRFFBZ0FoRDNBUXNnQUVFQU5nSlVRWDhoQlVGL0lRSUNRQ0FCUVg5R0RRQWdBQ2dDQkNFRElBRkJBV29pQkNBQlFRSnJJQVJCQTNBYklnUkJmMGNFUUNBREtBSUFJQVJCQW5ScUtBSUFJUVVMUVg5QkFpQUJRUU53R3lBQmFpSUVRWDlHRFFBZ0F5Z0NBQ0FFUVFKMGFpZ0NBQ0VDQ3lBQUtBSWtJZ01nQlVFRGRrSDgvLy8vQVhGcUlnUW9BZ0FpQmtFQklBVjBJZ2R4Qkg4Z0F3VWdCQ0FHSUFkeU5nSUFJQUJCQ0dvZ0JTQUJRWDlIQkg4Z0FVRUJhaUlGSUFGQkFtc2dCVUVEY0JzRlFYOExFTklCSUFBb0FpUUxJQUpCQTNaQi9QLy8vd0Z4YWlJRktBSUFJZ05CQVNBQ2RDSUVjVVVFUUNBRklBTWdCSEkyQWdBZ0FFRUlhaUFDQW45QmZ5QUJRWDlHRFFBYUlBRkJBV3NnQVVFRGNBMEFHaUFCUVFKcUN4RFNBUXRCZnlFRkFuOGdBVUYvUndSQUlBQW9BZ1FvQWdBZ0FVRUNkR29vQWdBaEJRc2dBQ2dDSkNBRlFRTjJRZnovLy84QmNXb2lBaWdDQUNJRFFRRWdCWFFpQkhGRkN3UkFJQUlnQXlBRWNqWUNBQ0FBUVFocUlBVWdBUkRTQVFzZ0FDZ0NWQ0lEUVFKS0RRQURRQ0FBSUFOQkRHeHFJZ0lvQWpBZ0FpZ0NOQ0lCUmdSQUlBTkJBV29pQTBFRFJ3MEJEQUlMSUFGQkJHc2lCU2dDQUNFQklBSWdCVFlDTkNBQUlBTTJBbFFnQVVGL1JnMEJBa0FnQUNnQ0dDSUZJQUZCQTI0aUFrRURka0g4Ly8vL0FIRnFLQUlBSUFKMlFRRnhEUUFDUUFOQUlBVWdBVUVEYmlJRFFRTjJRZnovLy84QWNXb2lBaUFDS0FJQVFRRWdBM1J5TmdJQVFYOGhCUUovQWtBQ1FBSkFBa0FDUUFKL0lBRkJmMGNFUUNBQUtBSUVLQUlBSUFGQkFuUnFLQUlBSVFVTElBQW9BaVFnQlVFRGRrSDgvLy8vQVhGcUlnSW9BZ0FpQkVFQklBVjBJZ1p4UlFzRVFDQUNJQVFnQm5JMkFnQWdBQ2dDRUNnQ1lDQURRUXhzYWlBQlFRTndRUUowYWlnQ0FDRUpBa0FnQUNnQ0ZDZ0NCQ0lDS0FJRUlnUWdBaWdDQ0VjRVFDQUVJQWsyQWdBZ0FpQUVRUVJxTmdJRURBRUxJQVFnQWlnQ0FDSUVheUlHUVFKMUlncEJBV29pQjBHQWdJQ0FCRThOQWlBSElBWkJBWFVpQ0NBSElBaExHMEgvLy8vL0F5QUtRZi8vLy84QlNSc2lCd1IvSUFkQmdJQ0FnQVJQRFE0Z0IwRUNkQkRxQVFWQkFBc2lDQ0FLUVFKMGFpSUtJQWsyQWdBZ0JrRUJUZ1JBSUFnZ0JDQUdFUGtCR2dzZ0FpQUlJQWRCQW5ScU5nSUlJQUlnQ2tFRWFqWUNCQ0FDSUFnMkFnQWdCRVVOQUNBRUVQY0JDd0pBSUFBb0Fnd2lBaWdDQkNJRUlBSW9BZ2hIQkVBZ0JDQUJOZ0lBSUFJZ0JFRUVhallDQkF3QkN5QUVJQUlvQWdBaUJHc2lCa0VDZFNJSlFRRnFJZ2RCZ0lDQWdBUlBEUU1nQnlBR1FRRjFJZ2dnQnlBSVN4dEIvLy8vL3dNZ0NVSC8vLy8vQVVrYklnY0VmeUFIUVlDQWdJQUVUdzBPSUFkQkFuUVE2Z0VGUVFBTElnZ2dDVUVDZEdvaUNTQUJOZ0lBSUFaQkFVNEVRQ0FJSUFRZ0JoRDVBUm9MSUFJZ0NDQUhRUUowYWpZQ0NDQUNJQWxCQkdvMkFnUWdBaUFJTmdJQUlBUkZEUUFnQkJEM0FRc2dBQ2dDRENJQ0tBSU1JQVZCQW5ScUlBSW9BaGcyQWdBZ0FpQUNLQUlZUVFGcU5nSVlDeUFCUVg5R0RRY2dBQ2dDQkNFRVFYOGhBa0YvSVFVZ0FVRUJhaUlHSUFGQkFtc2dCa0VEY0JzaUJrRi9Sd1JBSUFRb0Fnd2dCa0VDZEdvb0FnQWhCUXRCZjBFQ0lBRWdBMEVEYkdzYklBRnFJZ0ZCZjBjRVFDQUVLQUlNSUFGQkFuUnFLQUlBSVFJTElBSkJmMFloQVNBQ1FRTnVJUWNnQlVFRGJpRURJQVZCZjBZaUJrVUVRQ0FBS0FJWVFYOGdBeUFHR3lJRFFRTjJRZnovLy84QmNXb29BZ0JCQVNBRGRIRWhBeUFCRFFNZ0EwRUFSeUVHREFRTFFRRWhCaUFCUlEwRERBY0xFT2NCQUFzUTV3RUFDeUFEUlEwQkRBUUxBa0FnQUNnQ0dFRi9JQWNnQVJzaUFVRURka0g4Ly8vL0FYRnFLQUlBSUFGMlFRRnhEUUJCQUNFQklBQW9BaVFnQkNnQ0FDQUNRUUowYWlnQ0FDSURRUU4yUWZ6Ly8vOEJjV29vQWdBZ0EzWkJBWEZGQkVBZ0FDZ0NXQ0FEUVFKMGFpSUJJQUVvQWdBaUFVRUJhallDQUVFQ1FRRWdBVUVCU0JzaEFRc0NRQ0FHUlEwQUlBRWdBQ2dDVkVvTkFDQUNJUUVnQUNnQ0dDRUZEQVFMQWtBZ0FDQUJRUXhzYWlJRElnb29BalFpQkNBREtBSTRSd1JBSUFRZ0FqWUNBQ0FLSUFSQkJHbzJBalFNQVFzZ0JDQURLQUl3SWdScklnZEJBblVpQzBFQmFpSUlRWUNBZ0lBRVR3MEtJQWdnQjBFQmRTSUpJQWdnQ1VzYlFmLy8vLzhESUF0Qi8vLy8vd0ZKR3lJSUJIOGdDRUdBZ0lDQUJFOE5DaUFJUVFKMEVPb0JCVUVBQ3lJSklBdEJBblJxSWdzZ0FqWUNBQ0FIUVFGT0JFQWdDU0FFSUFjUStRRWFDeUFESUFrMkFqQWdDaUFMUVFScU5nSTBJQU1nQ1NBSVFRSjBhallDT0NBRVJRMEFJQVFROXdFTElBQW9BbFFnQVV3TkFDQUFJQUUyQWxRTElBWU5BMEYvSUFWQmYwWU5BUm9MSUFBb0FnUW9BZ0FnQlVFQ2RHb29BZ0FMSVFGQkFDRUNBbjhnQUNnQ0pDQUJRUU4yUWZ6Ly8vOEJjV29vQWdBZ0FYWkJBWEZGQkVBZ0FDZ0NXQ0FCUVFKMGFpSUJJQUVvQWdBaUFVRUJhallDQUVFQ1FRRWdBVUVCU0JzaEFnc2dBQ2dDVkNBQ1Rnc0VRQ0FGSVFFZ0FDZ0NHQ0VGREFFTEN3SkFJQUFnQWtFTWJHb2lBU0lJS0FJMElnTWdBU2dDT0VjRVFDQURJQVUyQWdBZ0NDQURRUVJxTmdJMERBRUxJQU1nQVNnQ01DSURheUlFUVFKMUlnbEJBV29pQmtHQWdJQ0FCRThOQnlBR0lBUkJBWFVpQnlBR0lBZExHMEgvLy8vL0F5QUpRZi8vLy84QlNSc2lCZ1IvSUFaQmdJQ0FnQVJQRFFZZ0JrRUNkQkRxQVFWQkFBc2lCeUFKUVFKMGFpSUpJQVUyQWdBZ0JFRUJUZ1JBSUFjZ0F5QUVFUGtCR2dzZ0FTQUhOZ0l3SUFnZ0NVRUVhallDTkNBQklBY2dCa0VDZEdvMkFqZ2dBMFVOQUNBREVQY0JDeUFBS0FKVUlnTWdBa3dOQVNBQUlBSTJBbFFnQWlFRERBRUxJQUFvQWxRaEF3c2dBMEVEU0EwQUN3dEJBUThMRVBnQkFBc1E1d0VBQ3hEbkFRQUxFT2NCQUF1SEJBRUhmeUFBS0FJSUtBSmdJQUpCQTI0aUEwRU1iR29nQWlBRFFRTnNhMEVDZEdvb0FnQWhCd0pBSUFBb0Fnd29BZ1FpQXlnQ0JDSUVJQU1vQWdoSEJFQWdCQ0FITmdJQUlBTWdCRUVFYWpZQ0JBd0JDd0pBSUFRZ0F5Z0NBQ0lFYXlJSVFRSjFJZ2xCQVdvaUJVR0FnSUNBQkVrRVFDQUZJQWhCQVhVaUJpQUZJQVpMRzBILy8vLy9BeUFKUWYvLy8vOEJTUnNpQlFSL0lBVkJnSUNBZ0FSUERRSWdCVUVDZEJEcUFRVkJBQXNpQmlBSlFRSjBhaUlKSUFjMkFnQWdDRUVCVGdSQUlBWWdCQ0FJRVBrQkdnc2dBeUFHSUFWQkFuUnFOZ0lJSUFNZ0NVRUVhallDQkNBRElBWTJBZ0FnQkFSQUlBUVE2d0VMREFJTEVPY0JBQXNRK0FFQUN3SkFBa0FDUUNBQUtBSUVJZ01vQWdRaUJDQURLQUlJUndSQUlBUWdBallDQUNBRElBUkJCR28yQWdRTUFRc2dCQ0FES0FJQUlnUnJJZ2hCQW5VaUIwRUJhaUlGUVlDQWdJQUVUdzBCSUFVZ0NFRUJkU0lHSUFVZ0Jrc2JRZi8vLy84RElBZEIvLy8vL3dGSkd5SUZCSDhnQlVHQWdJQ0FCRThOQXlBRlFRSjBFT29CQlVFQUN5SUdJQWRCQW5ScUlnY2dBallDQUNBSVFRRk9CRUFnQmlBRUlBZ1ErUUVhQ3lBRElBWWdCVUVDZEdvMkFnZ2dBeUFIUVFScU5nSUVJQU1nQmpZQ0FDQUVSUTBBSUFRUTl3RUxJQUFvQWdRaUFDZ0NEQ0FCUVFKMGFpQUFLQUlZTmdJQUlBQWdBQ2dDR0VFQmFqWUNHQThMRU9jQkFBc1ErQUVBQzVJQkFRRi9JQUJCM0JrMkFnQWdBQ2dDV0NJQkJFQWdBQ0FCTmdKY0lBRVE5d0VMSUFBb0FrZ2lBUVJBSUFBZ0FUWUNUQ0FCRVBjQkN5QUFLQUk4SWdFRVFDQUFRVUJySUFFMkFnQWdBUkQzQVFzZ0FDZ0NNQ0lCQkVBZ0FDQUJOZ0kwSUFFUTl3RUxJQUJCOEJrMkFnQWdBQ2dDSkNJQkJFQWdBUkQzQVFzZ0FDZ0NHQ0lCQkVBZ0FSRDNBUXNnQUJEM0FRc3NBUUYvSUFCQjhCazJBZ0FnQUNnQ0pDSUJCRUFnQVJEM0FRc2dBQ2dDR0NJQkJFQWdBUkQzQVFzZ0FBc3ZBUUYvSUFCQjhCazJBZ0FnQUNnQ0pDSUJCRUFnQVJEM0FRc2dBQ2dDR0NJQkJFQWdBUkQzQVFzZ0FCRDNBUXRLQVFGL0lBQkJuQm8yQWdBZ0FDZ0NNQ0lCQkVBZ0FDQUJOZ0kwSUFFUTl3RUxJQUJCOEJrMkFnQWdBQ2dDSkNJQkJFQWdBUkQzQVFzZ0FDZ0NHQ0lCQkVBZ0FSRDNBUXNnQUF0U0FRRi9JQUJCbkJvMkFnZ2dBRUdFR2pZQ0FDQUFLQUk0SWdFRVFDQUFJQUUyQWp3Z0FSRDNBUXNnQUVId0dUWUNDQ0FBS0FJc0lnRUVRQ0FCRVBjQkN5QUFLQUlnSWdFRVFDQUJFUGNCQ3lBQUMxVUJBWDhnQUVHY0dqWUNDQ0FBUVlRYU5nSUFJQUFvQWpnaUFRUkFJQUFnQVRZQ1BDQUJFUGNCQ3lBQVFmQVpOZ0lJSUFBb0Fpd2lBUVJBSUFFUTl3RUxJQUFvQWlBaUFRUkFJQUVROXdFTElBQVE5d0VMaWdNQkMzOGdBQ2dDRENFS0lBQW9Ba1FpQWlnQ1VDRUVJQUZCQURvQVZBSkFJQUVvQWtnZ0FTZ0NSQ0lGYTBFQ2RTSURJQVJKQkVBZ0FVSEVBR29nQkNBRGEwSEFFeEFXSUFBb0FrUWlBaWdDVUNFRURBRUxJQU1nQkUwTkFDQUJJQVVnQkVFQ2RHbzJBa2dMSUFJb0FtUWdBaWdDWUNJTGF5SUNSUVJBUVFFUEN5QUNRUXh0SWdKQkFTQUNRUUZMR3lFTVFRQWhBZ0pBQTBBQ1FDQUNRZFdxMWFvRlJnMEFJQW9vQWdBZ0FrRURiRUVDZEdvaUF5Z0NBQ0lIUVg5R0RRQWdDeUFDUVF4c2FpSUZLQUlBSWdZZ0JFOE5BQ0FBS0FKSUtBSU1JZ2tnQjBFQ2RHb29BZ0FpQ0NBRVR3MEFJQUVvQWtRaUJ5QUdRUUowYWlBSU5nSUFJQU1vQWdRaUJrRi9SZzBBSUFVb0FnUWlDQ0FFVHcwQUlBa2dCa0VDZEdvb0FnQWlCaUFFVHcwQUlBY2dDRUVDZEdvZ0JqWUNBQ0FES0FJSUlnTkJmMFlOQUNBRktBSUlJZ1VnQkU4TkFDQUpJQU5CQW5ScUtBSUFJZ01nQkU4TkFDQUhJQVZCQW5ScUlBTTJBZ0JCQVNFRElBSkJBV29pQWlBTVJ3MEJEQUlMQzBFQUlRTUxJQU1Md1FJQkJuOENRQUpBSUFBb0Fnd2lBU2dDSENBQktBSVlheUlDUVFKMUlnTWdBQ2dDQkNJQktBSUlJQUVvQWdBaUJHdEJBblZORFFBZ0FrRi9UQTBCSUFFb0FnUWhCU0FDRU9vQklnSWdBMEVDZEdvaEJpQUNJQVVnQkdzaUEyb2hCU0FEUVFGT0JFQWdBaUFFSUFNUStRRWFDeUFCSUFZMkFnZ2dBU0FGTmdJRUlBRWdBallDQUNBRVJRMEFJQVFROXdFTElBQkJDR29oQWdKQUlBQW9Ba3dpQVFSQUlBRW9BZ0FpQXlBQktBSUVSZ1JBUVFFUEMwRUFJUUVEUUNBQ0lBTWdBVUVDZEdvb0FnQVEyd0VpQkVVTkFpQUJRUUZxSWdFZ0FDZ0NUQ0lES0FJRUlBTW9BZ0FpQTJ0QkFuVkpEUUFMREFFTFFRRWhCQ0FBS0FJTUlnQW9BZ1FnQUNnQ0FHdEJBblZCQTI0aUFFRUJTUTBBUVFBaEFRTkFJQUlnQVVFRGJCRGJBU0lFUlEwQklBRkJBV29pQVNBQVJ3MEFDd3NnQkE4TEVQZ0JBQXV6Q2dFSWZ5QUJRWDlHQkVCQkFROExJQUFvQWhnZ0FVRURiaUlEUVFOMlFmei8vLzhBY1dvb0FnQWdBM1pCQVhGRkJFQUNRQ0FBS0FJd0lnSWdBQ2dDT0VjRVFDQUNJQUUyQWdBZ0FDQUNRUVJxTmdJMERBRUxRUVFRNmdFaUJTQUJOZ0lBSUFBZ0JVRUVhaUlFTmdJNElBQWdCRFlDTkNBQUlBVTJBakFnQWtVTkFDQUNFUGNCQ3lBQUtBSUVJUVZCZnlFQ0lBRkJBV29pQkNBQlFRSnJJQVJCQTNBYklnUkJmMGNFUUNBRktBSUFJQVJCQW5ScUtBSUFJUUlMUVg5QkFpQUJJQU5CQTJ4ckd5QUJhaUlEUVg5R0JFQkJBQThMSUFKQmYwWUVRRUVBRHdzZ0JTZ0NBQ0FEUVFKMGFpZ0NBQ0lCUVg5R0JFQkJBQThMSUFBb0FpUWlCU0FDUVFOMlFmei8vLzhCY1dvaUJpZ0NBQ0lIUVFFZ0FuUWlDSEVFZnlBRkJTQUdJQWNnQ0hJMkFnQWdBRUVJYWlBQ0lBUVEwZ0VnQUNnQ0pBc2dBVUVEZGtIOC8vLy9BWEZxSWdJb0FnQWlCVUVCSUFGMElnUnhSUVJBSUFJZ0JDQUZjallDQUNBQVFRaHFJQUVnQXhEU0FRc2dBQ2dDTkNJRElBQW9BakJHQkVCQkFROExJQUJCQ0dvaENRTkFJQU5CQkdzaUF5Z0NBQ0lCUVFOdUlRSUNRQUpBSUFGQmYwWU5BQ0FBS0FJWUlBSkJBM1pCL1AvLy93QnhhaUlGS0FJQUlnUkJBU0FDZENJQ2NRMEFJQVVnQWlBRWNqWUNBQU5BSUFBb0FnUWlBeWdDQUNBQlFRSjBhaWdDQUNJQ1FYOUdCRUJCQUE4TEFrQUNRQ0FBS0FJa0lBSkJBM1pCL1AvLy93RnhhaUlGS0FJQUlnUkJBU0FDZENJR2NRMEFBa0FnQXlnQ0dDQUNRUUowYWlnQ0FDSUhRWDlHRFFBZ0IwRUJhaUlJSUFkQkFtc2dDRUVEY0JzaUIwRi9SZzBBSUFNb0Fnd2dCMEVDZEdvb0FnQWlBMEYvUmcwQUlBVWdCQ0FHY2pZQ0FDQUpJQUlnQVJEU0FTQURRUUZxSWdJZ0EwRUNheUFDUVFOd0cwRi9SZzBCSUFGQkFtc2hBeUFCUVFGcUlRSkJmeUVCSUFJZ0F5QUNRUU53R3lJQ1FYOUhCRUFnQUNnQ0JDZ0NEQ0FDUVFKMGFpZ0NBQ0VCQzBFQklBRkJBMjRpQW5RaEJpQUFLQUlZSWdVZ0FrRUZkaUlIUVFKMGFpZ0NBQ0VJREFJTElBVWdCQ0FHY2pZQ0FDQUpJQUlnQVJEU0FRdEJmeUVESUFBb0FnUWhCVUYvSVFJZ0FVRUJhaUlFSUFGQkFtc2dCRUVEY0JzaUJFRi9Sd1JBSUFVb0Fnd2dCRUVDZEdvb0FnQWhBZ3RCZndKL1FYOUJBaUFCUVFOd0d5QUJhaUlCUVg5SEJFQWdCU2dDRENBQlFRSjBhaWdDQUNFREN5QURRUU51Q3lBRFFYOUdJZ0ViSVFRZ0FrRURiaUVHQWtBZ0FrRi9SaUlIUlFSQUlBQW9BaGdpQlVGL0lBWWdCeHNpQmtFRmRpSUhRUUowYWlnQ0FDSUlRUUVnQm5RaUJuRkZEUUVMSUFGRkJFQWdBeUVCSUFBb0FoZ2lCU0FFUVFWMklnZEJBblJxS0FJQUlnaEJBU0FFZENJR2NVVU5BZ3NnQUNBQUtBSTBRUVJySWdNMkFqUU1CQXNnQVFSQUlBSWhBUXdCQ3lBRklBUkJBM1pCL1AvLy93RnhhaWdDQUNBRWRrRUJjUVJBSUFJaEFRd0JDeUFBS0FJMElnRkJCR3NnQXpZQ0FDQUFLQUk0SUFGSEJFQWdBU0FDTmdJQUlBRkJCR29oQXd3REN3SkFJQUVnQUNnQ01DSUJheUlGUVFKMUlnTkJBV29pQkVHQWdJQ0FCRWtFUUNBRUlBVkJBWFVpQmlBRUlBWkxHMEgvLy8vL0F5QURRZi8vLy84QlNSc2lCQVIvSUFSQmdJQ0FnQVJQRFFJZ0JFRUNkQkRxQVFWQkFBc2lCaUFEUVFKMGFpSURJQUkyQWdBZ0EwRUVhaUVESUFWQkFVNEVRQ0FHSUFFZ0JSRDVBUm9MSUFBZ0JpQUVRUUowYWpZQ09DQUFJQU0yQWpRZ0FDQUdOZ0l3SUFGRkRRVWdBUkQzQVNBQUtBSTBJUU1NQlFzUTV3RUFDeEQ0QVFBTElBVWdCMEVDZEdvZ0JpQUljallDQUNBQlFYOUhEUUFMUVFBUEN5QUFJQU0yQWpRTElBQW9BakFnQTBjTkFBc0xRUUVMVFFFQmZ5QUFRWndhTmdJQUlBQW9BakFpQVFSQUlBQWdBVFlDTkNBQkVQY0JDeUFBUWZBWk5nSUFJQUFvQWlRaUFRUkFJQUVROXdFTElBQW9BaGdpQVFSQUlBRVE5d0VMSUFBUTl3RUxVZ0VCZnlBQVFjd1ROZ0lJSUFCQnNCbzJBZ0FnQUNnQ09DSUJCRUFnQUNBQk5nSThJQUVROXdFTElBQkI0Qk0yQWdnZ0FDZ0NMQ0lCQkVBZ0FSRDNBUXNnQUNnQ0lDSUJCRUFnQVJEM0FRc2dBQXRWQVFGL0lBQkJ6Qk0yQWdnZ0FFR3dHallDQUNBQUtBSTRJZ0VFUUNBQUlBRTJBandnQVJEM0FRc2dBRUhnRXpZQ0NDQUFLQUlzSWdFRVFDQUJFUGNCQ3lBQUtBSWdJZ0VFUUNBQkVQY0JDeUFBRVBjQkM0TURBUXQvSUFBb0Fnd2hCU0FBS0FKRUlnSW9BbEFoQkNBQlFRQTZBRlFDUUNBQktBSklJQUVvQWtRaUIydEJBblVpQXlBRVNRUkFJQUZCeEFCcUlBUWdBMnRCd0JNUUZpQUFLQUpFSWdJb0FsQWhCQXdCQ3lBRElBUk5EUUFnQVNBSElBUkJBblJxTmdKSUN5QUNLQUprSUFJb0FtQWlDbXNpQWtVRVFFRUJEd3NnQWtFTWJTSUNRUUVnQWtFQlN4c2hDeUFGS0FJY0lReEJBQ0VDQWtBRFFBSkFJQXdnQWtFRGJFRUNkR29pQXlnQ0FDSUlRWDlHRFFBZ0NpQUNRUXhzYWlJRktBSUFJZ1lnQkU4TkFDQUFLQUpJS0FJTUlnY2dDRUVDZEdvb0FnQWlDU0FFVHcwQUlBRW9Ba1FpQ0NBR1FRSjBhaUFKTmdJQUlBTW9BZ1FpQmtGL1JnMEFJQVVvQWdRaUNTQUVUdzBBSUFjZ0JrRUNkR29vQWdBaUJpQUVUdzBBSUFnZ0NVRUNkR29nQmpZQ0FDQURLQUlJSWdOQmYwWU5BQ0FGS0FJSUlnVWdCRThOQUNBSElBTkJBblJxS0FJQUlnTWdCRThOQUNBSUlBVkJBblJxSUFNMkFnQkJBU0VESUFKQkFXb2lBaUFMUncwQkRBSUxDMEVBSVFNTElBTUx4QUlCQm44Q1FBSkFJQUFvQWd3aUFTZ0NPQ0FCS0FJMGF5SUNRUUoxSWdNZ0FDZ0NCQ0lCS0FJSUlBRW9BZ0FpQkd0QkFuVk5EUUFnQWtGL1RBMEJJQUVvQWdRaEJTQUNFT29CSWdJZ0EwRUNkR29oQmlBQ0lBVWdCR3NpQTJvaEJTQURRUUZPQkVBZ0FpQUVJQU1RK1FFYUN5QUJJQVkyQWdnZ0FTQUZOZ0lFSUFFZ0FqWUNBQ0FFUlEwQUlBUVE5d0VMSUFCQkNHb2hBZ0pBSUFBb0Frd2lBUVJBSUFFb0FnQWlBeUFCS0FJRVJnUkFRUUVQQzBFQUlRRURRQ0FDSUFNZ0FVRUNkR29vQWdBUTRRRWlCRVVOQWlBQlFRRnFJZ0VnQUNnQ1RDSURLQUlFSUFNb0FnQWlBMnRCQW5WSkRRQUxEQUVMUVFFaEJDQUFLQUlNS0FKQUlnQW9BZ1FnQUNnQ0FHdEJBblZCQTI0aUFFRUJTUTBBUVFBaEFRTkFJQUlnQVVFRGJCRGhBU0lFUlEwQklBRkJBV29pQVNBQVJ3MEFDd3NnQkE4TEVQZ0JBQXUxQ3dFSmZ5QUJRWDlHQkVCQkFROExJQUFvQWhnZ0FVRURiaUlEUVFOMlFmei8vLzhBY1dvb0FnQWdBM1pCQVhGRkJFQUNRQ0FBS0FJd0lnSWdBQ2dDT0VjRVFDQUNJQUUyQWdBZ0FDQUNRUVJxTmdJMERBRUxRUVFRNmdFaUJDQUJOZ0lBSUFBZ0JFRUVhaUlGTmdJNElBQWdCVFlDTkNBQUlBUTJBakFnQWtVTkFDQUNFUGNCQ3lBQUtBSUVLQUljSWdRZ0FVRUJhaUlDSUFGQkFtc2dBa0VEY0JzaUJVRUNkR29vQWdBaUFrRi9SZ1JBUVFBUEN5QUVRWDlCQWlBQklBTkJBMnhyR3lBQmFpSURRUUowYWlnQ0FDSUJRWDlHQkVCQkFBOExJQUFvQWlRaUJDQUNRUU4yUWZ6Ly8vOEJjV29pQmlnQ0FDSUhRUUVnQW5RaUNIRUVmeUFFQlNBR0lBY2dDSEkyQWdBZ0FFRUlhaUFDSUFVUTBnRWdBQ2dDSkFzZ0FVRURka0g4Ly8vL0FYRnFJZ0lvQWdBaUJFRUJJQUYwSWdWeFJRUkFJQUlnQkNBRmNqWUNBQ0FBUVFocUlBRWdBeERTQVFzZ0FDZ0NOQ0lDSUFBb0FqQkdCRUJCQVE4TElBQkJDR29oQ1FOQUlBSkJCR3NpQWlnQ0FDSUJRUU51SVFNQ1FBSkFJQUZCZjBZTkFDQUFLQUlZSUFOQkEzWkIvUC8vL3dCeGFpSUVLQUlBSWdWQkFTQURkQ0lEY1EwQUlBUWdBeUFGY2pZQ0FDQUFLQUlFSWdRb0Fod2dBVUVDZEdvb0FnQWlBa0YvUmdSQVFRQVBDd05BSUFFaEF3SkFBa0FnQUNnQ0pDQUNRUU4yUWZ6Ly8vOEJjV29pQlNnQ0FDSUdRUUVnQW5RaUIzRU5BQUpBSUFRb0FpZ2dBa0VDZEdvb0FnQWlBVUYvUmcwQUlBRkJBV29pQ0NBQlFRSnJJQWhCQTNBYklnRkJmMFlOQUNBRUtBSUFJQUZCQTNaQi9QLy8vd0Z4YWlnQ0FDQUJka0VCY1EwQUlBUW9Ba0FvQWd3Z0FVRUNkR29vQWdBaUFVRi9SZzBBSUFVZ0JpQUhjallDQUNBSklBSWdBeERTQVNBQlFRRnFJZ0lnQVVFQ2F5QUNRUU53RzBGL1JnMEJRWDhoQVNBQUtBSUVJUVFDUUNBRFFYOUdEUUFnQTBFQmFpSUNJQU5CQW1zZ0FrRURjQnNpQWtGL1JnMEFJQVFvQWdBZ0FrRURka0g4Ly8vL0FYRnFLQUlBSUFKMlFRRnhEUUFnQkNnQ1FDZ0NEQ0FDUVFKMGFpZ0NBQ0VCQzBFQklBRkJBMjRpQW5RaEJpQUFLQUlZSWdNZ0FrRUZkaUlIUVFKMGFpZ0NBQ0VJREFJTElBVWdCaUFIY2pZQ0FDQUpJQUlnQXhEU0FRc0NRQUpBSUFOQmYwWU5BQ0FBS0FJRUlRUkJmeUVCQW45QmZ5QURRUUZxSWdJZ0EwRUNheUFDUVFOd0d5SUNRWDlHRFFBYVFYOGdCQ2dDQUNBQ1FRTjJRZnovLy84QmNXb29BZ0FnQW5aQkFYRU5BQm9nQkNnQ1FDZ0NEQ0FDUVFKMGFpZ0NBQXNoQWdKQVFYOUJBaUFEUVFOd0d5QURhaUlEUVg5R0RRQWdCQ2dDQUNBRFFRTjJRZnovLy84QmNXb29BZ0FnQTNaQkFYRU5BQ0FFS0FKQUtBSU1JQU5CQW5ScUtBSUFJUUVMUVg4Z0FVRURiaUFCUVg5R0lnb2JJUVVnQWtFRGJpRUdJQUpCZjBZaUIwVUVRQ0FBS0FJWUlnTkJmeUFHSUFjYklnWkJCWFlpQjBFQ2RHb29BZ0FpQ0VFQklBWjBJZ1p4UlEwQ0N5QUtEUUFnQUNnQ0dDSURJQVZCQlhZaUIwRUNkR29vQWdBaUNFRUJJQVYwSWdaeFJRMENDeUFBSUFBb0FqUkJCR3NpQWpZQ05Bd0VDeUFLQkVBZ0FpRUJEQUVMSUFNZ0JVRURka0g4Ly8vL0FYRnFLQUlBSUFWMlFRRnhCRUFnQWlFQkRBRUxJQUFvQWpRaUEwRUVheUFCTmdJQUlBQW9BamdnQTBjRVFDQURJQUkyQWdBZ0EwRUVhaUVDREFNTEFrQWdBeUFBS0FJd0lnRnJJZ05CQW5VaUJrRUJhaUlFUVlDQWdJQUVTUVJBSUFRZ0EwRUJkU0lGSUFRZ0JVc2JRZi8vLy84RElBWkIvLy8vL3dGSkd5SUVCSDhnQkVHQWdJQ0FCRThOQWlBRVFRSjBFT29CQlVFQUN5SUZJQVpCQW5ScUlnWWdBallDQUNBR1FRUnFJUUlnQTBFQlRnUkFJQVVnQVNBREVQa0JHZ3NnQUNBRklBUkJBblJxTmdJNElBQWdBallDTkNBQUlBVTJBakFnQVVVTkJTQUJFUGNCSUFBb0FqUWhBZ3dGQ3hEbkFRQUxFUGdCQUFzZ0F5QUhRUUowYWlBR0lBaHlOZ0lBSUFRb0Fod2dBVUVDZEdvb0FnQWlBa0YvUncwQUMwRUFEd3NnQUNBQ05nSTBDeUFBS0FJd0lBSkhEUUFMQzBFQkMvOEJBUWQvSUFFZ0FDZ0NDQ0lGSUFBb0FnUWlBbXRCQTNWTkJFQWdBQ0FCQkg4Z0FrRUFJQUZCQTNRaUFCRDZBU0FBYWdVZ0FnczJBZ1FQQ3dKQUlBSWdBQ2dDQUNJRWF5SUdRUU4xSWdjZ0FXb2lBMEdBZ0lDQUFra0VRRUVBSVFJQ2Z5QURJQVVnQkdzaUJVRUNkU0lJSUFNZ0NFc2JRZi8vLy84QklBVkJBM1ZCLy8vLy93QkpHeUlEQkVBZ0EwR0FnSUNBQWs4TkF5QURRUU4wRU9vQklRSUxJQWRCQTNRZ0Ftb0xRUUFnQVVFRGRDSUJFUG9CSUFGcUlRRWdCa0VCVGdSQUlBSWdCQ0FHRVBrQkdnc2dBQ0FDSUFOQkEzUnFOZ0lJSUFBZ0FUWUNCQ0FBSUFJMkFnQWdCQVJBSUFRUTl3RUxEd3NRNXdFQUN4RDRBUUFMQkFBUUF3dERBUU4vQWtBZ0FrVU5BQU5BSUFBdEFBQWlCQ0FCTFFBQUlnVkdCRUFnQVVFQmFpRUJJQUJCQVdvaEFDQUNRUUZySWdJTkFRd0NDd3NnQkNBRmF5RURDeUFEQzVvQkFRVi9BMEFnQUNJQlFRRnFJUUFnQVN3QUFDSUNRU0JHSUFKQkNXdEJCVWx5RFFBTEFrQUNRQUpBSUFFc0FBQWlBa0VyYXc0REFRSUFBZ3RCQVNFRUN5QUFMQUFBSVFJZ0FDRUJJQVFoQlFzQ1FDQUNRVEJyUVFwUERRQkJBQ0VBQTBBZ0FDQUJMQUFBYTBFd2FpRURJQUVzQUFGQk1HdEJDazhOQVNBQlFRRnFJUUVnQTBFS2JDRUFEQUFMQUFzZ0EwRUFJQU5ySUFVYkN3VUFRY0FoQ3dZQUVPZ0JBQXNHQUJENEFRQUxFUUFnQWdSQUlBQWdBU0FDRVBrQkdnc0xOQUVCZnlBQVFRRWdBQnNoQUFKQUEwQWdBQkR6QVNJQkRRRkJ4Q0VvQWdBaUFRUkFJQUVSQndBTUFRc0xFUGdCQUFzZ0FRc0hBQ0FBRVBjQkMzc0JBbjhDUUFKQUlBSkJDazBFUUNBQUlnTWdBam9BQ3d3QkN5QUNRVzlMRFFFZ0FDQUNRUXRQQkg4Z0FrRVFha0Z3Y1NJRElBTkJBV3NpQXlBRFFRdEdHd1ZCQ2d0QkFXb2lCQkRxQVNJRE5nSUFJQUFnQkVHQWdJQ0FlSEkyQWdnZ0FDQUNOZ0lFQ3lBRElBRWdBa0VCYWhEcEFROExFT2NCQUFzN0FBSi9JQUF0QUF0QkIzWUVRQ0FBS0FJRURBRUxJQUF0QUFzTFJRUkFFT2NCQUFzQ2Z5QUFMUUFMUVFkMkJFQWdBQ2dDQUF3QkN5QUFDd3ZYQkFFS2Z5QUJBbjhnQUMwQUMwRUhkZ1JBSUFBb0FnUU1BUXNnQUMwQUN3c2lBa3NFUUNNQVFSQnJJZ2NrQUNBQklBSnJJZ1VFUUNBQUxRQUxRUWQyQkg4Z0FDZ0NDRUgvLy8vL0IzRkJBV3NGUVFvTElRSUNmeUFBTFFBTFFRZDJCRUFnQUNnQ0JBd0JDeUFBTFFBTEN5SUJJQVZxSVFZZ0JTQUNJQUZyU3dSQUFrQWpBRUVRYXlJRUpBQWdCaUFDYXlJRFFXOGdBbXROQkVBQ2Z5QUFMUUFMUVFkMkJFQWdBQ2dDQUF3QkN5QUFDeUVJQW44Z0FrSG4vLy8vQjBrRVFDQUVJQUpCQVhRMkFnZ2dCQ0FDSUFOcU5nSU1BbjhqQUVFUWF5SURKQUFnQkVFTWFpSUpLQUlBSUFSQkNHb2lDaWdDQUVraEN5QURRUkJxSkFBZ0NpQUpJQXNiS0FJQUlnTkJDMDhMQkg4Z0EwRVFha0Z3Y1NJRElBTkJBV3NpQXlBRFFRdEdHd1ZCQ2dzTUFRdEJiZ3RCQVdvaUNSRHFBU0VESUFFRVFDQURJQWdnQVJEcEFRdEJBQ0lLQkVBZ0FTQURhaUFCSUFocUlBb1E2UUVMSUFKQkNrY0VRQ0FJRUtBQkN5QUFJQU0yQWdBZ0FDQUpRWUNBZ0lCNGNqWUNDQ0FFUVJCcUpBQU1BUXNRNXdFQUN3c2dBUUovSUFBdEFBdEJCM1lFUUNBQUtBSUFEQUVMSUFBTElnSnFJUUVnQlFSQUlBRkJBQ0FGRVBvQkdnc0NRQ0FBTFFBTFFRZDJCRUFnQUNBR05nSUVEQUVMSUFBZ0Jqb0FDd3NnQjBFQU9nQVBJQUlnQm1vZ0J5MEFEem9BQUFzZ0IwRVFhaVFBRHdzakFFRVFheUlDSkFBQ1FDQUFMUUFMUVFkMkJFQWdBQ2dDQUNFRUlBSkJBRG9BRHlBQklBUnFJQUl0QUE4NkFBQWdBQ0FCTmdJRURBRUxJQUpCQURvQURpQUFJQUZxSUFJdEFBNDZBQUFnQUNBQk9nQUxDeUFDUVJCcUpBQUw2UXdCQ0g4akFFRVFheUlFSkFBZ0JDQUFOZ0lNQWtBZ0FFSFRBVTBFUUVHd0hrSHdIeUFFUVF4cUVQQUJLQUlBSVFBTUFRc2dBRUY4VHdSQUVPZ0JBQXNnQkNBQUlBQkIwZ0Z1SWdkQjBnRnNJZ05yTmdJSVFmQWZRYkFoSUFSQkNHb1E4QUZCOEI5clFRSjFJUVVDUUFOQUlBVkJBblJCOEI5cUtBSUFJQU5xSVFCQkJTRURJQVloQVFKQUFrQURRQ0FCSVFZZ0EwRXZSZ1JBUWRNQklRTURRQ0FBSUFOdUlnRWdBMGtOQkNBQUlBRWdBMnhHRFFNZ0FDQURRUXBxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRUXhxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRUkJxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRUkpxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRUlpxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRUnhxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRUjVxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRU1JxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRU2hxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRU3BxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRUzVxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRVFJxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRVHBxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRVHhxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRY0lBYWlJQmJpSUNJQUZKRFFRZ0FDQUJJQUpzUmcwRElBQWdBMEhHQUdvaUFXNGlBaUFCU1EwRUlBQWdBU0FDYkVZTkF5QUFJQU5CeUFCcUlnRnVJZ0lnQVVrTkJDQUFJQUVnQW14R0RRTWdBQ0FEUWM0QWFpSUJiaUlDSUFGSkRRUWdBQ0FCSUFKc1JnMERJQUFnQTBIU0FHb2lBVzRpQWlBQlNRMEVJQUFnQVNBQ2JFWU5BeUFBSUFOQjJBQnFJZ0Z1SWdJZ0FVa05CQ0FBSUFFZ0FteEdEUU1nQUNBRFFlQUFhaUlCYmlJQ0lBRkpEUVFnQUNBQklBSnNSZzBESUFBZ0EwSGtBR29pQVc0aUFpQUJTUTBFSUFBZ0FTQUNiRVlOQXlBQUlBTkI1Z0JxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRZW9BYWlJQmJpSUNJQUZKRFFRZ0FDQUJJQUpzUmcwRElBQWdBMEhzQUdvaUFXNGlBaUFCU1EwRUlBQWdBU0FDYkVZTkF5QUFJQU5COEFCcUlnRnVJZ0lnQVVrTkJDQUFJQUVnQW14R0RRTWdBQ0FEUWZnQWFpSUJiaUlDSUFGSkRRUWdBQ0FCSUFKc1JnMERJQUFnQTBIK0FHb2lBVzRpQWlBQlNRMEVJQUFnQVNBQ2JFWU5BeUFBSUFOQmdnRnFJZ0Z1SWdJZ0FVa05CQ0FBSUFFZ0FteEdEUU1nQUNBRFFZZ0JhaUlCYmlJQ0lBRkpEUVFnQUNBQklBSnNSZzBESUFBZ0EwR0tBV29pQVc0aUFpQUJTUTBFSUFBZ0FTQUNiRVlOQXlBQUlBTkJqZ0ZxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRWlFCYWlJQmJpSUNJQUZKRFFRZ0FDQUJJQUpzUmcwRElBQWdBMEdXQVdvaUFXNGlBaUFCU1EwRUlBQWdBU0FDYkVZTkF5QUFJQU5CbkFGcUlnRnVJZ0lnQVVrTkJDQUFJQUVnQW14R0RRTWdBQ0FEUWFJQmFpSUJiaUlDSUFGSkRRUWdBQ0FCSUFKc1JnMERJQUFnQTBHbUFXb2lBVzRpQWlBQlNRMEVJQUFnQVNBQ2JFWU5BeUFBSUFOQnFBRnFJZ0Z1SWdJZ0FVa05CQ0FBSUFFZ0FteEdEUU1nQUNBRFFhd0JhaUlCYmlJQ0lBRkpEUVFnQUNBQklBSnNSZzBESUFBZ0EwR3lBV29pQVc0aUFpQUJTUTBFSUFBZ0FTQUNiRVlOQXlBQUlBTkJ0QUZxSWdGdUlnSWdBVWtOQkNBQUlBRWdBbXhHRFFNZ0FDQURRYm9CYWlJQmJpSUNJQUZKRFFRZ0FDQUJJQUpzUmcwRElBQWdBMEcrQVdvaUFXNGlBaUFCU1EwRUlBQWdBU0FDYkVZTkF5QUFJQU5Cd0FGcUlnRnVJZ0lnQVVrTkJDQUFJQUVnQW14R0RRTWdBQ0FEUWNRQmFpSUJiaUlDSUFGSkRRUWdBQ0FCSUFKc1JnMERJQUFnQTBIR0FXb2lBVzRpQWlBQlNRMEVJQUFnQVNBQ2JFWU5BeUFBSUFOQjBBRnFJZ0Z1SWdJZ0FVa05CQ0FEUWRJQmFpRURJQUFnQVNBQ2JFY05BQXNNQWdzZ0FDQURRUUowUWJBZWFpZ0NBQ0lCYmlJQ0lBRnNJUWdnQVNBQ1N5SUNSUVJBSUFBZ0JpQUNHeUVCSUFOQkFXb2hBeUFBSUFoSERRRUxDeUFDRFFNZ0FDQUlSdzBEQzBFQUlBVkJBV29pQUNBQVFUQkdJZ0FiSVFVZ0FDQUhhaUlIUWRJQmJDRUREQUVMQ3lBRUlBQTJBZ3dNQVFzZ0JDQUFOZ0lNSUFBZ0JpQUNHeUVBQ3lBRVFSQnFKQUFnQUF1Q0FRRURmeU1BUVJCcklnVWtBQ01BUVJCcklnTWtBQ0FCSUFCclFRSjFJUUVEUUNBQkJFQWdBeUFBTmdJTUlBTWdBeWdDRENBQlFRRjJJZ1JCQW5ScU5nSU1JQUVnQkVGL2Myb2dCQ0FES0FJTUtBSUFJQUlvQWdCSklnUWJJUUVnQXlnQ0RFRUVhaUFBSUFRYklRQU1BUXNMSUFOQkVHb2tBQ0FGUVJCcUpBQWdBQXNEQUFBTGhnUUJCWDhDZjBHd0lTZ0NBQ0lCSUFCQkEycEJmSEVpQTJvaEFnSkFJQU5CQUNBQklBSlBHdzBBSUFJL0FFRVFkRXNFUUNBQ1B3QkJFSFJyUWYvL0EycEJFSFpBQUVGL1JnUi9RUUFGUVFBUUFrRUJDMFVOQVF0QnNDRWdBallDQUNBQkRBRUxRY0FoUVRBMkFnQkJmd3NpQWtGL1J3UkFJQUFnQW1vaUEwRVFheUlCUVJBMkFnd2dBVUVRTmdJQUFrQUNmMEhRS1NnQ0FDSUFCSDhnQUNnQ0NBVkJBQXNnQWtZRVFDQUNJQUpCQkdzb0FnQkJmbkZySWdSQkJHc29BZ0FoQlNBQUlBTTJBZ2dnQWtFUWF5QUVJQVZCZm5GcklnQWdBQ2dDQUdwQkJHc3RBQUJCQVhGRkRRRWFJQUFvQWdRaUF5QUFLQUlJTmdJSUlBQW9BZ2dnQXpZQ0JDQUFJQUVnQUdzaUFUWUNBQXdDQ3lBQ1FSQTJBZ3dnQWtFUU5nSUFJQUlnQXpZQ0NDQUNJQUEyQWdSQjBDa2dBallDQUNBQ1FSQnFDeUlBSUFFZ0FHc2lBVFlDQUFzZ0FVRjhjU0FBYWtFRWF5QUJRUUZ5TmdJQUlBQUNmeUFBS0FJQVFRaHJJZ0ZCL3dCTkJFQWdBVUVEZGtFQmF3d0JDeUFCUVIwZ0FXY2lBMnQyUVFSeklBTkJBblJyUWU0QWFpQUJRZjhmVFEwQUdpQUJRUjRnQTJ0MlFRSnpJQU5CQVhSclFjY0FhaUlCUVQ4Z0FVRS9TUnNMSWdGQkJIUWlBMEhRSVdvMkFnUWdBQ0FEUWRnaGFpSURLQUlBTmdJSUlBTWdBRFlDQUNBQUtBSUlJQUEyQWdSQjJDbEIyQ2twQXdCQ0FTQUJyWWFFTndNQUN5QUNRWDlIQzVvRUFnWi9BbjVCQ0NFREFrQUNRQ0FBUVVkTERRQURRQ0FEUVFnZ0EwRUlTeHNoQXdKQUFuOUIyQ2twQXdBaUJ3Si9JQUJCQTJwQmZIRkJDQ0FBUVFoTEd5SUFRZjhBVFFSQUlBQkJBM1pCQVdzTUFRc2dBRUVkSUFCbklnRnJka0VFY3lBQlFRSjBhMEh1QUdvZ0FFSC9IMDBOQUJvZ0FFRWVJQUZyZGtFQ2N5QUJRUUYwYTBISEFHb2lBVUUvSUFGQlAwa2JDeUlFcllnaUNGQkZCRUFEUUNBSUlBaDZJZ2lJSVFjQ2ZpQUVJQWluYWlJRVFRUjBJZ0pCMkNGcUtBSUFJZ0VnQWtIUUlXb2lCVWNFUUNBQklBTWdBQkQwQVNJR0RRY2dBU2dDQkNJR0lBRW9BZ2cyQWdnZ0FTZ0NDQ0FHTmdJRUlBRWdCVFlDQ0NBQklBSkIxQ0ZxSWdJb0FnQTJBZ1FnQWlBQk5nSUFJQUVvQWdRZ0FUWUNDQ0FFUVFGcUlRUWdCMElCaUF3QkMwSFlLVUhZS1NrREFFSitJQVN0aVlNM0F3QWdCMElCaFFzaUNFSUFVZzBBQzBIWUtTa0RBQ0VIQ3lBSFVFVUxCRUJCUHlBSGVhZHJRUVIwSWdGQjBDRnFJUVVnQVVIWUlXb29BZ0FoQWdKQUlBZENnSUNBZ0FSVURRQkI0Z0FoQVNBQ0lBVkdEUUFEUUNBQ0lBTWdBQkQwQVNJR0RRVWdBaWdDQ0NJQ0lBVkdEUUVnQVNJRVFRRnJJUUVnQkEwQUN3c2dBRUV3YWhEeUFRMEJJQUpGRFFRZ0FpQUZSZzBFQTBBZ0FpQURJQUFROUFFaUJnMEVJQUlvQWdnaUFpQUZSdzBBQ3d3RUN5QUFRVEJxRVBJQlJRMERDMEVBSVFZZ0F5QURRUUZyY1EwQklBQkJSMDBOQUFzTElBWVBDMEVBQzZBREFRTi9JQUVnQUVFRWFpSUVha0VCYTBFQUlBRnJjU0lGSUFKcUlBQWdBQ2dDQUNJQmFrRUVhMDBFZnlBQUtBSUVJZ01nQUNnQ0NEWUNDQ0FBS0FJSUlBTTJBZ1FnQkNBRlJ3UkFJQUFnQUVFRWF5Z0NBRUYrY1dzaUF5QUZJQVJySWdRZ0F5Z0NBR29pQlRZQ0FDQUZRWHh4SUFOcVFRUnJJQVUyQWdBZ0FDQUVhaUlBSUFFZ0JHc2lBVFlDQUFzQ1FDQUJJQUpCR0dwUEJFQWdBQ0FDYWtFSWFpSURJQUVnQW10QkNHc2lBVFlDQUNBQlFYeHhJQU5xUVFScklBRkJBWEkyQWdBZ0F3Si9JQU1vQWdCQkNHc2lBVUgvQUUwRVFDQUJRUU4yUVFGckRBRUxJQUZuSVFRZ0FVRWRJQVJyZGtFRWN5QUVRUUowYTBIdUFHb2dBVUgvSDAwTkFCb2dBVUVlSUFScmRrRUNjeUFFUVFGMGEwSEhBR29pQVVFL0lBRkJQMGtiQ3lJQlFRUjBJZ1JCMENGcU5nSUVJQU1nQkVIWUlXb2lCQ2dDQURZQ0NDQUVJQU0yQWdBZ0F5Z0NDQ0FETmdJRVFkZ3BRZGdwS1FNQVFnRWdBYTJHaERjREFDQUFJQUpCQ0dvaUFUWUNBQ0FCUVh4eElBQnFRUVJySUFFMkFnQU1BUXNnQUNBQmFrRUVheUFCTmdJQUN5QUFRUVJxQlVFQUN3c0hBQ0FBRVBNQkM4NENBUVIvSUFBRVFDQUFRUVJySWdFb0FnQWlCQ0VDSUFFaEF5QUFRUWhyS0FJQUlnQWdBRUYrY1NJQVJ3UkFJQUVnQUdzaUF5Z0NCQ0lDSUFNb0FnZzJBZ2dnQXlnQ0NDQUNOZ0lFSUFBZ0JHb2hBZ3NnQVNBRWFpSUFLQUlBSWdFZ0FDQUJha0VFYXlnQ0FFY0VRQ0FBS0FJRUlnUWdBQ2dDQ0RZQ0NDQUFLQUlJSUFRMkFnUWdBU0FDYWlFQ0N5QURJQUkyQWdBZ0FrRjhjU0FEYWtFRWF5QUNRUUZ5TmdJQUlBTUNmeUFES0FJQVFRaHJJZ0JCL3dCTkJFQWdBRUVEZGtFQmF3d0JDeUFBWnlFQklBQkJIU0FCYTNaQkJITWdBVUVDZEd0QjdnQnFJQUJCL3g5TkRRQWFJQUJCSGlBQmEzWkJBbk1nQVVFQmRHdEJ4d0JxSWdCQlB5QUFRVDlKR3dzaUFrRUVkQ0lBUWRBaGFqWUNCQ0FESUFCQjJDRnFJZ0FvQWdBMkFnZ2dBQ0FETmdJQUlBTW9BZ2dnQXpZQ0JFSFlLVUhZS1NrREFFSUJJQUt0aG9RM0F3QUxDd2NBSUFBUTlnRUxCd0JCQVJBQkFBdTJCQUVEZnlBQ1FZQUVUd1JBSUFBaEF5QUNCRUFEUUNBRElBRWdBa0g4QXlBQ1Fmd0RTUnNpQkJENUFTRURJQUZCL0FOcUlRRWdBMEg4QTJvaEF5QUNJQVJySWdJTkFBc0xJQUFQQ3lBQUlBSnFJUU1DUUNBQUlBRnpRUU54UlFSQUFrQWdBRUVEY1VVRVFDQUFJUUlNQVFzZ0FrRUJTQVJBSUFBaEFnd0JDeUFBSVFJRFFDQUNJQUV0QUFBNkFBQWdBVUVCYWlFQklBSkJBV29pQWtFRGNVVU5BU0FDSUFOSkRRQUxDd0pBSUFOQmZIRWlCRUhBQUVrTkFDQUNJQVJCUUdvaUJVc05BQU5BSUFJZ0FTZ0NBRFlDQUNBQ0lBRW9BZ1EyQWdRZ0FpQUJLQUlJTmdJSUlBSWdBU2dDRERZQ0RDQUNJQUVvQWhBMkFoQWdBaUFCS0FJVU5nSVVJQUlnQVNnQ0dEWUNHQ0FDSUFFb0FodzJBaHdnQWlBQktBSWdOZ0lnSUFJZ0FTZ0NKRFlDSkNBQ0lBRW9BaWcyQWlnZ0FpQUJLQUlzTmdJc0lBSWdBU2dDTURZQ01DQUNJQUVvQWpRMkFqUWdBaUFCS0FJNE5nSTRJQUlnQVNnQ1BEWUNQQ0FCUVVCcklRRWdBa0ZBYXlJQ0lBVk5EUUFMQ3lBQ0lBUlBEUUVEUUNBQ0lBRW9BZ0EyQWdBZ0FVRUVhaUVCSUFKQkJHb2lBaUFFU1EwQUN3d0JDeUFEUVFSSkJFQWdBQ0VDREFFTElBQWdBMEVFYXlJRVN3UkFJQUFoQWd3QkN5QUFJUUlEUUNBQ0lBRXRBQUE2QUFBZ0FpQUJMUUFCT2dBQklBSWdBUzBBQWpvQUFpQUNJQUV0QUFNNkFBTWdBVUVFYWlFQklBSkJCR29pQWlBRVRRMEFDd3NnQWlBRFNRUkFBMEFnQWlBQkxRQUFPZ0FBSUFGQkFXb2hBU0FDUVFGcUlnSWdBMGNOQUFzTElBQUw4Z0lDQW44QmZnSkFJQUpGRFFBZ0FDQUNhaUlEUVFGcklBRTZBQUFnQUNBQk9nQUFJQUpCQTBrTkFDQURRUUpySUFFNkFBQWdBQ0FCT2dBQklBTkJBMnNnQVRvQUFDQUFJQUU2QUFJZ0FrRUhTUTBBSUFOQkJHc2dBVG9BQUNBQUlBRTZBQU1nQWtFSlNRMEFJQUJCQUNBQWEwRURjU0lFYWlJRElBRkIvd0Z4UVlHQ2hBaHNJZ0UyQWdBZ0F5QUNJQVJyUVh4eElnUnFJZ0pCQkdzZ0FUWUNBQ0FFUVFsSkRRQWdBeUFCTmdJSUlBTWdBVFlDQkNBQ1FRaHJJQUUyQWdBZ0FrRU1heUFCTmdJQUlBUkJHVWtOQUNBRElBRTJBaGdnQXlBQk5nSVVJQU1nQVRZQ0VDQURJQUUyQWd3Z0FrRVFheUFCTmdJQUlBSkJGR3NnQVRZQ0FDQUNRUmhySUFFMkFnQWdBa0VjYXlBQk5nSUFJQVFnQTBFRWNVRVljaUlFYXlJQ1FTQkpEUUFnQWExQ2dZQ0FnQkIrSVFVZ0F5QUVhaUVCQTBBZ0FTQUZOd01ZSUFFZ0JUY0RFQ0FCSUFVM0F3Z2dBU0FGTndNQUlBRkJJR29oQVNBQ1FTQnJJZ0pCSDBzTkFBc0xJQUFMNlFJQkFuOENRQ0FBSUFGR0RRQWdBU0FBSUFKcUlnUnJRUUFnQWtFQmRHdE5CRUFnQUNBQklBSVErUUVQQ3lBQUlBRnpRUU54SVFNQ1FBSkFJQUFnQVVrRVFDQURCRUFnQUNFRERBTUxJQUJCQTNGRkJFQWdBQ0VEREFJTElBQWhBd05BSUFKRkRRUWdBeUFCTFFBQU9nQUFJQUZCQVdvaEFTQUNRUUZySVFJZ0EwRUJhaUlEUVFOeERRQUxEQUVMQWtBZ0F3MEFJQVJCQTNFRVFBTkFJQUpGRFFVZ0FDQUNRUUZySWdKcUlnTWdBU0FDYWkwQUFEb0FBQ0FEUVFOeERRQUxDeUFDUVFOTkRRQURRQ0FBSUFKQkJHc2lBbW9nQVNBQ2FpZ0NBRFlDQUNBQ1FRTkxEUUFMQ3lBQ1JRMENBMEFnQUNBQ1FRRnJJZ0pxSUFFZ0Ftb3RBQUE2QUFBZ0FnMEFDd3dDQ3lBQ1FRTk5EUUFEUUNBRElBRW9BZ0EyQWdBZ0FVRUVhaUVCSUFOQkJHb2hBeUFDUVFScklnSkJBMHNOQUFzTElBSkZEUUFEUUNBRElBRXRBQUE2QUFBZ0EwRUJhaUVESUFGQkFXb2hBU0FDUVFGcklnSU5BQXNMSUFBTGZ3RURmeUFBSVFFQ1FDQUFRUU54QkVBRFFDQUJMUUFBUlEwQ0lBRkJBV29pQVVFRGNRMEFDd3NEUUNBQklnSkJCR29oQVNBQ0tBSUFJZ05CZjNNZ0EwR0Jnb1FJYTNGQmdJR0NoSGh4UlEwQUN5QURRZjhCY1VVRVFDQUNJQUJyRHdzRFFDQUNMUUFCSVFNZ0FrRUJhaUlCSVFJZ0F3MEFDd3NnQVNBQWF3c0VBQ01BQ3dZQUlBQWtBQXNRQUNNQUlBQnJRWEJ4SWdBa0FDQUFDd3YxRnlnQVFZZ0lDLzhEQVFBQUFBSUFBQUFEQUFBQUJBQUFBQVVBQUFBR0FBQUFCd0FBQUFnQUFBQUpBQUFBQ2dBQUFBc0FBQUFNQUFBQVgxOXVaWGgwWDNCeWFXMWxJRzkyWlhKbWJHOTNBSFpsWTNSdmNnQnphMmx3WDJGMGRISnBZblYwWlY5MGNtRnVjMlp2Y20wQVltRnphV05mYzNSeWFXNW5BR0ZzYkc5allYUnZjanhVUGpvNllXeHNiMk5oZEdVb2MybDZaVjkwSUc0cElDZHVKeUJsZUdObFpXUnpJRzFoZUdsdGRXMGdjM1Z3Y0c5eWRHVmtJSE5wZW1VQVJGSkJRMDhBVlhOcGJtY2dhVzVqYjIxd1lYUnBZbXhsSUdSbFkyOWtaWElnWm05eUlIUm9aU0JwYm5CMWRDQm5aVzl0WlhSeWVTNEFSbUZwYkdWa0lIUnZJR1JsWTI5a1pTQndiMmx1ZENCaGRIUnlhV0oxZEdWekxnQkdZV2xzWldRZ2RHOGdhVzVwZEdsaGJHbDZaU0IwYUdVZ1pHVmpiMlJsY2k0QVZXNXJibTkzYmlCdGFXNXZjaUIyWlhKemFXOXVMZ0JWYm10dWIzZHVJRzFoYW05eUlIWmxjbk5wYjI0dUFFbHVjSFYwSUdseklHNXZkQ0JoSUcxbGMyZ3VBRTV2ZENCaElFUnlZV052SUdacGJHVXVBRlZ1YzNWd2NHOXlkR1ZrSUdWdVkyOWthVzVuSUcxbGRHaHZaQzRBUm1GcGJHVmtJSFJ2SUdSbFkyOWtaU0J0WlhSaFpHRjBZUzRBUm1GcGJHVmtJSFJ2SUdSbFkyOWtaU0JuWlc5dFpYUnllU0JrWVhSaExnQlFkWEpsSUhacGNuUjFZV3dnWm5WdVkzUnBiMjRnWTJGc2JHVmtJUUJCa0F3TElRMEFBQUFPQUFBQUR3QUFBQkFBQUFBUkFBQUFFZ0FBQUJNQUFBQVVBQUFBRlFCQnZBd0xNUllBQUFBWEFBQUFBd0FBQUJnQUFBQVpBQUFBQmdBQUFBY0FBQUFJQUFBQUdnQUFBQnNBQUFBY0FBQUFIUUFBQUI0QVFmZ01DekVmQUFBQUlBQUFBQ0VBQUFBUUFBQUFFUUFBQUJJQUFBQWlBQUFBRkFBQUFDTUFBQUFrQUFBQUpRQUFBQ1lBQUFBbkFFRzBEUXM1S0FBQUFDa0FBQUFxQUFBQUVBQUFBQkVBQUFBckFBQUFJZ0FBQUJRQUFBQWpBQUFBTEFBQUFDVUFBQUFtQUFBQUxRQUFBQzRBQUFBdkFFSDREUXN4TUFBQUFERUFBQUF5QUFBQU13QUFBRFFBQUFBMUFBQUFOZ0FBQURjQUFBQTRBQUFBT1FBQUFEb0FBQUE3QUFBQVBBQkJ0QTRMV1QwQUFBQStBQUFBUHdBQUFFQUFBQUJCQUFBQVFnQUFBRU1BQUFCRUFBQUFSUUFBQUVZQUFBRC8vLy8vQUFBQUFBQUFBQUJIQUFBQVNBQUFBRWtBQUFCS0FBQUFTd0FBQUV3QUFBQk5BQUFBVGdBQUFFOEFBQUJRQUVHWUR3c2xVUUFBQUZJQUFBQlRBQUFBVkFBQUFGVUFBQUJXQUFBQVZ3QUFBRmdBQUFCWkFBQUFXZ0JCeUE4TE1Wc0FBQUJjQUFBQU1nQUFBRjBBQUFCZUFBQUFOUUFBQURZQUFBQTNBQUFBWHdBQUFHQUFBQUJoQUFBQVlnQUFBR01BUVlRUUN5RmJBQUFBWkFBQUFHVUFBQUJkQUFBQUNnQUFBR1lBQUFBMkFBQUFOd0FBQUY4QVFiQVFDemxHWVdsc1pXUWdkRzhnY0dGeWMyVWdSSEpoWTI4Z2FHVmhaR1Z5TGdBQUFQLy8vLzhBQUFBQUFBQUFBR2NBQUFCb0FBQUFhUUFBQUdvQVFmUVFDdzFyQUFBQWJBQUFBRzBBQUFCdUFFR01FUXN0YndBQUFIQUFBQUJ4QUFBQWNnQUFBSE1BQUFCMEFBQUFkUUFBQUhZQUFBQjNBQUFBZUFBQUFIa0FBQUI2QUVIQ0VRdVRBZ0VBQWdBQkFBTUFBUUFDQUFFQUJBQUJBQUlBQVFBREFBRUFBZ0FCQUFVQUFRQUNBQUVBQXdBQkFBSUFBUUFFQUFFQUFnQUJBQU1BQVFBQ0FBRUFCZ0FCQUFJQUFRQURBQUVBQWdBQkFBUUFBUUFDQUFFQUF3QUJBQUlBQVFBRkFBRUFBZ0FCQUFNQUFRQUNBQUVBQkFBQkFBSUFBUUFEQUFFQUFnQUJBQWNBQVFBQ0FBRUFBd0FCQUFJQUFRQUVBQUVBQWdBQkFBTUFBUUFDQUFFQUJRQUJBQUlBQVFBREFBRUFBZ0FCQUFRQUFRQUNBQUVBQXdBQkFBSUFBUUFHQUFFQUFnQUJBQU1BQVFBQ0FBRUFCQUFCQUFJQUFRQURBQUVBQWdBQkFBVUFBUUFDQUFFQUF3QUJBQUlBQVFBRUFBRUFBZ0FCQUFNQUFRQUNBQUVBLy8vLy93QUFBQUFBQUFBQWV3QUFBSHdBQUFCOUFFSGdFd3NKZmdBQUFIOEFBQUI5QUVIMEV3c05BUUFBQUFNQUFBQUZBQUFBQndCQmpCUUxEWUFBQUFDQkFBQUFnZ0FBQUlNQVFhUVVDeTJFQUFBQWhRQUFBSVlBQUFDSEFBQUFpQUFBQUlrQUFBQ0tBQUFBaXdBQUFJd0FBQUNOQUFBQWpnQUFBSThBUWR3VUN5MkVBQUFBa0FBQUFBb0FBQUNIQUFBQUNnQUFBSWtBQUFDS0FBQUFpd0FBQUl3QUFBQ05BQUFBamdBQUFBb0FRWlFWQ3kyRUFBQUFrUUFBQUpJQUFBQ0hBQUFBa3dBQUFJa0FBQUNLQUFBQWl3QUFBSXdBQUFDTkFBQUFqZ0FBQUpRQVFjd1ZDeTJWQUFBQWxnQUFBSmNBQUFDSEFBQUFtQUFBQUlrQUFBQ0tBQUFBaXdBQUFJd0FBQUNOQUFBQW1RQUFBSm9BUVlRV0N5MmJBQUFBbkFBQUFKMEFBQUNIQUFBQW5nQUFBSjhBQUFDZ0FBQUFvUUFBQUl3QUFBQ05BQUFBb2dBQUFLTUFRYndXQ3kya0FBQUFwUUFBQUtZQUFBQ0hBQUFBcHdBQUFLZ0FBQUNwQUFBQXFnQUFBSXdBQUFDTkFBQUFxd0FBQUt3QVFmUVdDeTJFQUFBQXJRQUFBSzRBQUFDSEFBQUFyd0FBQUlrQUFBQ0tBQUFBaXdBQUFJd0FBQUNOQUFBQWpnQUFBTEFBUWF3WEN5MkVBQUFBc1FBQUFMSUFBQUNIQUFBQXN3QUFBSWtBQUFDS0FBQUFpd0FBQUl3QUFBQ05BQUFBamdBQUFMUUFRZVFYQ3kyMUFBQUF0Z0FBQUxjQUFBQ0hBQUFBdUFBQUFJa0FBQUNLQUFBQWl3QUFBSXdBQUFDTkFBQUF1UUFBQUxvQVFad1lDeTI3QUFBQXZBQUFBTDBBQUFDSEFBQUF2Z0FBQUw4QUFBREFBQUFBd1FBQUFJd0FBQUNOQUFBQXdnQUFBTU1BUWRRWUN5M0VBQUFBeFFBQUFNWUFBQUNIQUFBQXh3QUFBTWdBQUFESkFBQUF5Z0FBQUl3QUFBQ05BQUFBeXdBQUFNd0FRWXdaQ3kyRUFBQUF6UUFBQU00QUFBQ0hBQUFBendBQUFJa0FBQUNLQUFBQWl3QUFBSXdBQUFDTkFBQUFqZ0FBQU5BQVFjUVpDdzNSQUFBQTBnQUFBTk1BQUFEVUFFSGNHUXNKMVFBQUFOWUFBQURYQUVId0dRc0oyQUFBQU5rQUFBRFhBRUdFR2dzTjJnQUFBTnNBQUFEY0FBQUEzUUJCbkJvTENkNEFBQURmQUFBQTF3QkJzQm9MRGVBQUFBRGhBQUFBNGdBQUFPTUFRY3dhQzlVQkFRQUFBQUFBQUFBQkFBQUFBQUFBQUFJQUFBQUFBQUFBQWdBQUFBQUFBQUFFQUFBQUFBQUFBQVFBQUFBQUFBQUFDQUFBQUFBQUFBQUlBQUFBQUFBQUFBUUFBQUFBQUFBQUNBQUFBQUFBQUFBQkFBQUFBUUFBQUFBQUFBQUJBQUFBQUFBQUFBSUFBQUFBQUFBQUFnQUFBQUFBQUFBRUFBQUFBQUFBQUFRQUFBQUFBQUFBQ0FBQUFBQUFBQUFJQUFBQUFBQUFBQVFBQUFBQUFBQUFDQUFBQUFBQUFBQUJBQUFBQUFBQUFBRUFBQUFCQUFBQUFnQUFBQUlBQUFBRUFBQUFCQUFBQUFnQUFBQUlBQUFBQkFBQUFBZ0FBQUFCQUVHd0hBdklBVEF3TURFd01qQXpNRFF3TlRBMk1EY3dPREE1TVRBeE1URXlNVE14TkRFMU1UWXhOekU0TVRreU1ESXhNakl5TXpJME1qVXlOakkzTWpneU9UTXdNekV6TWpNek16UXpOVE0yTXpjek9ETTVOREEwTVRReU5ETTBORFExTkRZME56UTRORGsxTURVeE5USTFNelUwTlRVMU5qVTNOVGcxT1RZd05qRTJNall6TmpRMk5UWTJOamMyT0RZNU56QTNNVGN5TnpNM05EYzFOelkzTnpjNE56azRNRGd4T0RJNE16ZzBPRFU0TmpnM09EZzRPVGt3T1RFNU1qa3pPVFE1TlRrMk9UYzVPRGs1QUVHRUhnc2tDZ0FBQUdRQUFBRG9Bd0FBRUNjQUFLQ0dBUUJBUWc4QWdKYVlBQURoOVFVQXlwbzdBRUcwSGd2NUFnSUFBQUFEQUFBQUJRQUFBQWNBQUFBTEFBQUFEUUFBQUJFQUFBQVRBQUFBRndBQUFCMEFBQUFmQUFBQUpRQUFBQ2tBQUFBckFBQUFMd0FBQURVQUFBQTdBQUFBUFFBQUFFTUFBQUJIQUFBQVNRQUFBRThBQUFCVEFBQUFXUUFBQUdFQUFBQmxBQUFBWndBQUFHc0FBQUJ0QUFBQWNRQUFBSDhBQUFDREFBQUFpUUFBQUlzQUFBQ1ZBQUFBbHdBQUFKMEFBQUNqQUFBQXB3QUFBSzBBQUFDekFBQUF0UUFBQUw4QUFBREJBQUFBeFFBQUFNY0FBQURUQUFBQUFRQUFBQXNBQUFBTkFBQUFFUUFBQUJNQUFBQVhBQUFBSFFBQUFCOEFBQUFsQUFBQUtRQUFBQ3NBQUFBdkFBQUFOUUFBQURzQUFBQTlBQUFBUXdBQUFFY0FBQUJKQUFBQVR3QUFBRk1BQUFCWkFBQUFZUUFBQUdVQUFBQm5BQUFBYXdBQUFHMEFBQUJ4QUFBQWVRQUFBSDhBQUFDREFBQUFpUUFBQUlzQUFBQ1BBQUFBbFFBQUFKY0FBQUNkQUFBQW93QUFBS2NBQUFDcEFBQUFyUUFBQUxNQUFBQzFBQUFBdXdBQUFMOEFBQURCQUFBQXhRQUFBTWNBQUFEUkFFR3dJUXNDNEpRPSI7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvbWVzaC9kcmFjby9pbmRleC50cwogICAgdmFyIGRyYWNvX2V4cG9ydHMgPSB7fTsKICAgIF9fZXhwb3J0KGRyYWNvX2V4cG9ydHMsIHsKICAgICAgZGVjb2RlRHJhY286ICgpID0+IGRlY29kZURyYWNvLAogICAgICBkZWNvZGVEcmFjb1BhcnRpdGlvbmVkOiAoKSA9PiBkZWNvZGVEcmFjb1BhcnRpdGlvbmVkCiAgICB9KTsKICAgIGFzeW5jIGZ1bmN0aW9uIGRlY29kZURyYWNvUGFydGl0aW9uZWQoYnVmZmVyLCB2ZXJ0ZXhRdWFudGl6YXRpb25CaXRzLCBwYXJ0aXRpb24pIHsKICAgICAgY29uc3QgbSA9IGF3YWl0IGRyYWNvTW9kdWxlUHJvbWlzZTsKICAgICAgY29uc3Qgb2Zmc2V0ID0gbS5pbnN0YW5jZS5leHBvcnRzLm1hbGxvYyhidWZmZXIuYnl0ZUxlbmd0aCk7CiAgICAgIGNvbnN0IGhlYXAgPSBuZXcgVWludDhBcnJheShtLmluc3RhbmNlLmV4cG9ydHMubWVtb3J5LmJ1ZmZlcik7CiAgICAgIGhlYXAuc2V0KGJ1ZmZlciwgb2Zmc2V0KTsKICAgICAgbnVtUGFydGl0aW9ucyA9IHBhcnRpdGlvbiA/IDggOiAxOwogICAgICBjb25zdCBjb2RlID0gbS5pbnN0YW5jZS5leHBvcnRzLm5ldXJvZ2xhbmNlcl9kcmFjb19kZWNvZGUob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aCwgcGFydGl0aW9uLCB2ZXJ0ZXhRdWFudGl6YXRpb25CaXRzLCB0cnVlKTsKICAgICAgaWYgKGNvZGUgPT09IDApIHsKICAgICAgICBjb25zdCByID0gZGVjb2RlUmVzdWx0OwogICAgICAgIGRlY29kZVJlc3VsdCA9IHZvaWQgMDsKICAgICAgICBpZiAociBpbnN0YW5jZW9mIEVycm9yKQogICAgICAgICAgdGhyb3cgcjsKICAgICAgICByZXR1cm4gcjsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZWNvZGUgZHJhY28gbWVzaDogJHtjb2RlfWApOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gZGVjb2RlRHJhY28oYnVmZmVyKSB7CiAgICAgIGNvbnN0IG0gPSBhd2FpdCBkcmFjb01vZHVsZVByb21pc2U7CiAgICAgIGNvbnN0IG9mZnNldCA9IG0uaW5zdGFuY2UuZXhwb3J0cy5tYWxsb2MoYnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgICBjb25zdCBoZWFwID0gbmV3IFVpbnQ4QXJyYXkobS5pbnN0YW5jZS5leHBvcnRzLm1lbW9yeS5idWZmZXIpOwogICAgICBoZWFwLnNldChidWZmZXIsIG9mZnNldCk7CiAgICAgIGNvbnN0IGNvZGUgPSBtLmluc3RhbmNlLmV4cG9ydHMubmV1cm9nbGFuY2VyX2RyYWNvX2RlY29kZShvZmZzZXQsIGJ1ZmZlci5ieXRlTGVuZ3RoLCBmYWxzZSwgMCwgZmFsc2UpOwogICAgICBpZiAoY29kZSA9PT0gMCkgewogICAgICAgIGNvbnN0IHIgPSBkZWNvZGVSZXN1bHQ7CiAgICAgICAgZGVjb2RlUmVzdWx0ID0gdm9pZCAwOwogICAgICAgIGlmIChyIGluc3RhbmNlb2YgRXJyb3IpCiAgICAgICAgICB0aHJvdyByOwogICAgICAgIHIudmVydGV4UG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShyLnZlcnRleFBvc2l0aW9ucy5idWZmZXIpOwogICAgICAgIHJldHVybiByOwogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSBkcmFjbyBtZXNoOiAke2NvZGV9YCk7CiAgICB9CiAgICB2YXIgZGVjb2RlUmVzdWx0LCBudW1QYXJ0aXRpb25zLCB3YXNtTW9kdWxlLCBsaWJyYXJ5RW52LCBkcmFjb01vZHVsZVByb21pc2U7CiAgICB2YXIgaW5pdF9kcmFjbyA9IF9fZXNtKHsKICAgICAgInNyYy9uZXVyb2dsYW5jZXIvbWVzaC9kcmFjby9pbmRleC50cyIoKSB7CiAgICAgICAgaW5pdF9uZXVyb2dsYW5jZXJfZHJhY28oKTsKICAgICAgICBkZWNvZGVSZXN1bHQgPSB2b2lkIDA7CiAgICAgICAgbnVtUGFydGl0aW9ucyA9IDA7CiAgICAgICAgbGlicmFyeUVudiA9IHsKICAgICAgICAgIGVtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGg6IChtZW1vcnlJbmRleCkgPT4gewogICAgICAgICAgfSwKICAgICAgICAgIG5ldXJvZ2xhbmNlcl9kcmFjb19yZWNlaXZlX2RlY29kZWRfbWVzaDogZnVuY3Rpb24obnVtRmFjZXMsIG51bVZlcnRpY2VzLCBpbmRpY2VzUG9pbnRlciwgdmVydGV4UG9zaXRpb25zUG9pbnRlciwgc3ViY2h1bmtPZmZzZXRzUG9pbnRlcikgewogICAgICAgICAgICBjb25zdCBudW1JbmRpY2VzID0gbnVtRmFjZXMgKiAzOwogICAgICAgICAgICBjb25zdCBtZW1vcnkgPSB3YXNtTW9kdWxlLmluc3RhbmNlLmV4cG9ydHMubWVtb3J5OwogICAgICAgICAgICBjb25zdCBpbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KG1lbW9yeS5idWZmZXIsIGluZGljZXNQb2ludGVyLCBudW1JbmRpY2VzKS5zbGljZSgpOwogICAgICAgICAgICBjb25zdCB2ZXJ0ZXhQb3NpdGlvbnMgPSBuZXcgVWludDMyQXJyYXkobWVtb3J5LmJ1ZmZlciwgdmVydGV4UG9zaXRpb25zUG9pbnRlciwgMyAqIG51bVZlcnRpY2VzKS5zbGljZSgpOwogICAgICAgICAgICBjb25zdCBzdWJDaHVua09mZnNldHMgPSBuZXcgVWludDMyQXJyYXkobWVtb3J5LmJ1ZmZlciwgc3ViY2h1bmtPZmZzZXRzUG9pbnRlciwgbnVtUGFydGl0aW9ucyArIDEpLnNsaWNlKCk7CiAgICAgICAgICAgIGNvbnN0IG1lc2ggPSB7CiAgICAgICAgICAgICAgaW5kaWNlcywKICAgICAgICAgICAgICB2ZXJ0ZXhQb3NpdGlvbnMsCiAgICAgICAgICAgICAgc3ViQ2h1bmtPZmZzZXRzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRlY29kZVJlc3VsdCA9IG1lc2g7CiAgICAgICAgICB9LAogICAgICAgICAgcHJvY19leGl0OiAoY29kZSkgPT4gewogICAgICAgICAgICB0aHJvdyBgcHJvYyBleGl0OiAke2NvZGV9YDsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGRyYWNvTW9kdWxlUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKG5ldXJvZ2xhbmNlcl9kcmFjb19kZWZhdWx0KTsKICAgICAgICAgIGNvbnN0IHdhc21Db2RlID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgIGNvbnN0IG0gPSB3YXNtTW9kdWxlID0gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUod2FzbUNvZGUsIHsKICAgICAgICAgICAgZW52OiBsaWJyYXJ5RW52LAogICAgICAgICAgICB3YXNpX3NuYXBzaG90X3ByZXZpZXcxOiBsaWJyYXJ5RW52CiAgICAgICAgICB9KTsKICAgICAgICAgIG0uaW5zdGFuY2UuZXhwb3J0cy5faW5pdGlhbGl6ZSgpOwogICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgfSkoKTsKICAgICAgfQogICAgfSk7CgogICAgLy8gbm9kZV9tb2R1bGVzL25pZnRpLXJlYWRlci1qcy9zcmMvdXRpbGl0aWVzLmpzCiAgICB2YXIgcmVxdWlyZV91dGlsaXRpZXMgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9uaWZ0aS1yZWFkZXItanMvc3JjL3V0aWxpdGllcy5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICAgdmFyIG5pZnRpID0gbmlmdGkgfHwge307CiAgICAgICAgbmlmdGkuVXRpbHMgPSBuaWZ0aS5VdGlscyB8fCB7fTsKICAgICAgICBuaWZ0aS5VdGlscy5jcmNUYWJsZSA9IG51bGw7CiAgICAgICAgbmlmdGkuVXRpbHMuR1VOWklQX01BR0lDX0NPT0tJRTEgPSAzMTsKICAgICAgICBuaWZ0aS5VdGlscy5HVU5aSVBfTUFHSUNfQ09PS0lFMiA9IDEzOTsKICAgICAgICBuaWZ0aS5VdGlscy5nZXRTdHJpbmdBdCA9IGZ1bmN0aW9uKGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgICAgICAgIHZhciBzdHI2ID0gIiIsIGN0ciwgY2g7CiAgICAgICAgICBmb3IgKGN0ciA9IHN0YXJ0OyBjdHIgPCBlbmQ7IGN0ciArPSAxKSB7CiAgICAgICAgICAgIGNoID0gZGF0YS5nZXRVaW50OChjdHIpOwogICAgICAgICAgICBpZiAoY2ggIT09IDApIHsKICAgICAgICAgICAgICBzdHI2ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3RyNjsKICAgICAgICB9OwogICAgICAgIG5pZnRpLlV0aWxzLmdldEJ5dGVBdCA9IGZ1bmN0aW9uKGRhdGEsIHN0YXJ0KSB7CiAgICAgICAgICByZXR1cm4gZGF0YS5nZXRJbnQ4KHN0YXJ0KTsKICAgICAgICB9OwogICAgICAgIG5pZnRpLlV0aWxzLmdldFNob3J0QXQgPSBmdW5jdGlvbihkYXRhLCBzdGFydCwgbGl0dGxlRW5kaWFuKSB7CiAgICAgICAgICByZXR1cm4gZGF0YS5nZXRJbnQxNihzdGFydCwgbGl0dGxlRW5kaWFuKTsKICAgICAgICB9OwogICAgICAgIG5pZnRpLlV0aWxzLmdldEludEF0ID0gZnVuY3Rpb24oZGF0YSwgc3RhcnQsIGxpdHRsZUVuZGlhbikgewogICAgICAgICAgcmV0dXJuIGRhdGEuZ2V0SW50MzIoc3RhcnQsIGxpdHRsZUVuZGlhbik7CiAgICAgICAgfTsKICAgICAgICBuaWZ0aS5VdGlscy5nZXRGbG9hdEF0ID0gZnVuY3Rpb24oZGF0YSwgc3RhcnQsIGxpdHRsZUVuZGlhbikgewogICAgICAgICAgcmV0dXJuIGRhdGEuZ2V0RmxvYXQzMihzdGFydCwgbGl0dGxlRW5kaWFuKTsKICAgICAgICB9OwogICAgICAgIG5pZnRpLlV0aWxzLmdldERvdWJsZUF0ID0gZnVuY3Rpb24oZGF0YSwgc3RhcnQsIGxpdHRsZUVuZGlhbikgewogICAgICAgICAgcmV0dXJuIGRhdGEuZ2V0RmxvYXQ2NChzdGFydCwgbGl0dGxlRW5kaWFuKTsKICAgICAgICB9OwogICAgICAgIG5pZnRpLlV0aWxzLmdldExvbmdBdCA9IGZ1bmN0aW9uKGRhdGEsIHN0YXJ0LCBsaXR0bGVFbmRpYW4pIHsKICAgICAgICAgIHZhciBjdHIsIGFycmF5ID0gW10sIHZhbHVlID0gMDsKICAgICAgICAgIGZvciAoY3RyID0gMDsgY3RyIDwgODsgY3RyICs9IDEpIHsKICAgICAgICAgICAgYXJyYXlbY3RyXSA9IG5pZnRpLlV0aWxzLmdldEJ5dGVBdChkYXRhLCBzdGFydCArIGN0ciwgbGl0dGxlRW5kaWFuKTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY3RyID0gYXJyYXkubGVuZ3RoIC0gMTsgY3RyID49IDA7IGN0ci0tKSB7CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAyNTYgKyBhcnJheVtjdHJdOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH07CiAgICAgICAgbmlmdGkuVXRpbHMudG9BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKGJ1ZmZlcikgewogICAgICAgICAgdmFyIGFiLCB2aWV3LCBpOwogICAgICAgICAgYWIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyLmxlbmd0aCk7CiAgICAgICAgICB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYWIpOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICB2aWV3W2ldID0gYnVmZmVyW2ldOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGFiOwogICAgICAgIH07CiAgICAgICAgbmlmdGkuVXRpbHMuaXNTdHJpbmcgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAic3RyaW5nIiB8fCBvYmogaW5zdGFuY2VvZiBTdHJpbmc7CiAgICAgICAgfTsKICAgICAgICBuaWZ0aS5VdGlscy5mb3JtYXROdW1iZXIgPSBmdW5jdGlvbihudW0sIHNob3J0Rm9ybWF0KSB7CiAgICAgICAgICB2YXIgdmFsID0gMDsKICAgICAgICAgIGlmIChuaWZ0aS5VdGlscy5pc1N0cmluZyhudW0pKSB7CiAgICAgICAgICAgIHZhbCA9IE51bWJlcihudW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsID0gbnVtOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHNob3J0Rm9ybWF0KSB7CiAgICAgICAgICAgIHZhbCA9IHZhbC50b1ByZWNpc2lvbig1KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbCA9IHZhbC50b1ByZWNpc2lvbig3KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbCk7CiAgICAgICAgfTsKICAgICAgICBuaWZ0aS5VdGlscy5tYWtlQ1JDVGFibGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBjOwogICAgICAgICAgdmFyIGNyY1RhYmxlID0gW107CiAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IDI1NjsgbisrKSB7CiAgICAgICAgICAgIGMgPSBuOwogICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykgewogICAgICAgICAgICAgIGMgPSBjICYgMSA/IDM5ODgyOTIzODQgXiBjID4+PiAxIDogYyA+Pj4gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjcmNUYWJsZVtuXSA9IGM7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY3JjVGFibGU7CiAgICAgICAgfTsKICAgICAgICBuaWZ0aS5VdGlscy5jcmMzMiA9IGZ1bmN0aW9uKGRhdGFWaWV3KSB7CiAgICAgICAgICB2YXIgY3JjVGFibGUgPSBuaWZ0aS5VdGlscy5jcmNUYWJsZSB8fCAobmlmdGkuVXRpbHMuY3JjVGFibGUgPSBuaWZ0aS5VdGlscy5tYWtlQ1JDVGFibGUoKSk7CiAgICAgICAgICB2YXIgY3JjID0gMCBeIC0xOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhVmlldy5ieXRlTGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY3JjID0gY3JjID4+PiA4IF4gY3JjVGFibGVbKGNyYyBeIGRhdGFWaWV3LmdldFVpbnQ4KGkpKSAmIDI1NV07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gKGNyYyBeIC0xKSA+Pj4gMDsKICAgICAgICB9OwogICAgICAgIHZhciBtb2R1bGVUeXBlID0gdHlwZW9mIG1vZHVsZTsKICAgICAgICBpZiAobW9kdWxlVHlwZSAhPT0gInVuZGVmaW5lZCIgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbmlmdGkuVXRpbHM7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvbmlmdGktcmVhZGVyLWpzL3NyYy9uaWZ0aTEuanMKICAgIHZhciByZXF1aXJlX25pZnRpMSA9IF9fY29tbW9uSlMoewogICAgICAibm9kZV9tb2R1bGVzL25pZnRpLXJlYWRlci1qcy9zcmMvbmlmdGkxLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICAgICB2YXIgbmlmdGkgPSBuaWZ0aSB8fCB7fTsKICAgICAgICBuaWZ0aS5VdGlscyA9IG5pZnRpLlV0aWxzIHx8ICh0eXBlb2YgX19yZXF1aXJlICE9PSAidW5kZWZpbmVkIiA/IHJlcXVpcmVfdXRpbGl0aWVzKCkgOiBudWxsKTsKICAgICAgICBuaWZ0aS5OSUZUSTEgPSBuaWZ0aS5OSUZUSTEgfHwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlzLmxpdHRsZUVuZGlhbiA9IGZhbHNlOwogICAgICAgICAgdGhpcy5kaW1faW5mbyA9IDA7CiAgICAgICAgICB0aGlzLmRpbXMgPSBbXTsKICAgICAgICAgIHRoaXMuaW50ZW50X3AxID0gMDsKICAgICAgICAgIHRoaXMuaW50ZW50X3AyID0gMDsKICAgICAgICAgIHRoaXMuaW50ZW50X3AzID0gMDsKICAgICAgICAgIHRoaXMuaW50ZW50X2NvZGUgPSAwOwogICAgICAgICAgdGhpcy5kYXRhdHlwZUNvZGUgPSAwOwogICAgICAgICAgdGhpcy5udW1CaXRzUGVyVm94ZWwgPSAwOwogICAgICAgICAgdGhpcy5zbGljZV9zdGFydCA9IDA7CiAgICAgICAgICB0aGlzLnNsaWNlX2VuZCA9IDA7CiAgICAgICAgICB0aGlzLnNsaWNlX2NvZGUgPSAwOwogICAgICAgICAgdGhpcy5waXhEaW1zID0gW107CiAgICAgICAgICB0aGlzLnZveF9vZmZzZXQgPSAwOwogICAgICAgICAgdGhpcy5zY2xfc2xvcGUgPSAxOwogICAgICAgICAgdGhpcy5zY2xfaW50ZXIgPSAwOwogICAgICAgICAgdGhpcy54eXp0X3VuaXRzID0gMDsKICAgICAgICAgIHRoaXMuY2FsX21heCA9IDA7CiAgICAgICAgICB0aGlzLmNhbF9taW4gPSAwOwogICAgICAgICAgdGhpcy5zbGljZV9kdXJhdGlvbiA9IDA7CiAgICAgICAgICB0aGlzLnRvZmZzZXQgPSAwOwogICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9ICIiOwogICAgICAgICAgdGhpcy5hdXhfZmlsZSA9ICIiOwogICAgICAgICAgdGhpcy5pbnRlbnRfbmFtZSA9ICIiOwogICAgICAgICAgdGhpcy5xZm9ybV9jb2RlID0gMDsKICAgICAgICAgIHRoaXMuc2Zvcm1fY29kZSA9IDA7CiAgICAgICAgICB0aGlzLnF1YXRlcm5fYiA9IDA7CiAgICAgICAgICB0aGlzLnF1YXRlcm5fYyA9IDA7CiAgICAgICAgICB0aGlzLnF1YXRlcm5fZCA9IDA7CiAgICAgICAgICB0aGlzLnFvZmZzZXRfeCA9IDA7CiAgICAgICAgICB0aGlzLnFvZmZzZXRfeSA9IDA7CiAgICAgICAgICB0aGlzLnFvZmZzZXRfeiA9IDA7CiAgICAgICAgICB0aGlzLmFmZmluZSA9IFtbMSwgMCwgMCwgMF0sIFswLCAxLCAwLCAwXSwgWzAsIDAsIDEsIDBdLCBbMCwgMCwgMCwgMV1dOwogICAgICAgICAgdGhpcy5tYWdpYyA9IDA7CiAgICAgICAgICB0aGlzLmlzSERSID0gZmFsc2U7CiAgICAgICAgICB0aGlzLmV4dGVuc2lvbkZsYWcgPSBbMCwgMCwgMCwgMF07CiAgICAgICAgICB0aGlzLmV4dGVuc2lvblNpemUgPSAwOwogICAgICAgICAgdGhpcy5leHRlbnNpb25Db2RlID0gMDsKICAgICAgICB9OwogICAgICAgIG5pZnRpLk5JRlRJMS5UWVBFX05PTkUgPSAwOwogICAgICAgIG5pZnRpLk5JRlRJMS5UWVBFX0JJTkFSWSA9IDE7CiAgICAgICAgbmlmdGkuTklGVEkxLlRZUEVfVUlOVDggPSAyOwogICAgICAgIG5pZnRpLk5JRlRJMS5UWVBFX0lOVDE2ID0gNDsKICAgICAgICBuaWZ0aS5OSUZUSTEuVFlQRV9JTlQzMiA9IDg7CiAgICAgICAgbmlmdGkuTklGVEkxLlRZUEVfRkxPQVQzMiA9IDE2OwogICAgICAgIG5pZnRpLk5JRlRJMS5UWVBFX0NPTVBMRVg2NCA9IDMyOwogICAgICAgIG5pZnRpLk5JRlRJMS5UWVBFX0ZMT0FUNjQgPSA2NDsKICAgICAgICBuaWZ0aS5OSUZUSTEuVFlQRV9SR0IyNCA9IDEyODsKICAgICAgICBuaWZ0aS5OSUZUSTEuVFlQRV9JTlQ4ID0gMjU2OwogICAgICAgIG5pZnRpLk5JRlRJMS5UWVBFX1VJTlQxNiA9IDUxMjsKICAgICAgICBuaWZ0aS5OSUZUSTEuVFlQRV9VSU5UMzIgPSA3Njg7CiAgICAgICAgbmlmdGkuTklGVEkxLlRZUEVfSU5UNjQgPSAxMDI0OwogICAgICAgIG5pZnRpLk5JRlRJMS5UWVBFX1VJTlQ2NCA9IDEyODA7CiAgICAgICAgbmlmdGkuTklGVEkxLlRZUEVfRkxPQVQxMjggPSAxNTM2OwogICAgICAgIG5pZnRpLk5JRlRJMS5UWVBFX0NPTVBMRVgxMjggPSAxNzkyOwogICAgICAgIG5pZnRpLk5JRlRJMS5UWVBFX0NPTVBMRVgyNTYgPSAyMDQ4OwogICAgICAgIG5pZnRpLk5JRlRJMS5YRk9STV9VTktOT1dOID0gMDsKICAgICAgICBuaWZ0aS5OSUZUSTEuWEZPUk1fU0NBTk5FUl9BTkFUID0gMTsKICAgICAgICBuaWZ0aS5OSUZUSTEuWEZPUk1fQUxJR05FRF9BTkFUID0gMjsKICAgICAgICBuaWZ0aS5OSUZUSTEuWEZPUk1fVEFMQUlSQUNIID0gMzsKICAgICAgICBuaWZ0aS5OSUZUSTEuWEZPUk1fTU5JXzE1MiA9IDQ7CiAgICAgICAgbmlmdGkuTklGVEkxLlNQQVRJQUxfVU5JVFNfTUFTSyA9IDc7CiAgICAgICAgbmlmdGkuTklGVEkxLlRFTVBPUkFMX1VOSVRTX01BU0sgPSA1NjsKICAgICAgICBuaWZ0aS5OSUZUSTEuVU5JVFNfVU5LTk9XTiA9IDA7CiAgICAgICAgbmlmdGkuTklGVEkxLlVOSVRTX01FVEVSID0gMTsKICAgICAgICBuaWZ0aS5OSUZUSTEuVU5JVFNfTU0gPSAyOwogICAgICAgIG5pZnRpLk5JRlRJMS5VTklUU19NSUNST04gPSAzOwogICAgICAgIG5pZnRpLk5JRlRJMS5VTklUU19TRUMgPSA4OwogICAgICAgIG5pZnRpLk5JRlRJMS5VTklUU19NU0VDID0gMTY7CiAgICAgICAgbmlmdGkuTklGVEkxLlVOSVRTX1VTRUMgPSAyNDsKICAgICAgICBuaWZ0aS5OSUZUSTEuVU5JVFNfSFogPSAzMjsKICAgICAgICBuaWZ0aS5OSUZUSTEuVU5JVFNfUFBNID0gNDA7CiAgICAgICAgbmlmdGkuTklGVEkxLlVOSVRTX1JBRFMgPSA0ODsKICAgICAgICBuaWZ0aS5OSUZUSTEuTUFHSUNfQ09PS0lFID0gMzQ4OwogICAgICAgIG5pZnRpLk5JRlRJMS5TVEFOREFSRF9IRUFERVJfU0laRSA9IDM0ODsKICAgICAgICBuaWZ0aS5OSUZUSTEuTUFHSUNfTlVNQkVSX0xPQ0FUSU9OID0gMzQ0OwogICAgICAgIG5pZnRpLk5JRlRJMS5NQUdJQ19OVU1CRVIgPSBbMTEwLCA0MywgNDldOwogICAgICAgIG5pZnRpLk5JRlRJMS5NQUdJQ19OVU1CRVIyID0gWzExMCwgMTA1LCA0OV07CiAgICAgICAgbmlmdGkuTklGVEkxLkVYVEVOU0lPTl9IRUFERVJfU0laRSA9IDg7CiAgICAgICAgbmlmdGkuTklGVEkxLnByb3RvdHlwZS5yZWFkSGVhZGVyID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgdmFyIHJhd0RhdGEgPSBuZXcgRGF0YVZpZXcoZGF0YSksIG1hZ2ljQ29va2llVmFsID0gbmlmdGkuVXRpbHMuZ2V0SW50QXQocmF3RGF0YSwgMCwgdGhpcy5saXR0bGVFbmRpYW4pLCBjdHIsIGN0ck91dCwgY3RySW4sIGluZGV4OwogICAgICAgICAgaWYgKG1hZ2ljQ29va2llVmFsICE9PSBuaWZ0aS5OSUZUSTEuTUFHSUNfQ09PS0lFKSB7CiAgICAgICAgICAgIHRoaXMubGl0dGxlRW5kaWFuID0gdHJ1ZTsKICAgICAgICAgICAgbWFnaWNDb29raWVWYWwgPSBuaWZ0aS5VdGlscy5nZXRJbnRBdChyYXdEYXRhLCAwLCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWFnaWNDb29raWVWYWwgIT09IG5pZnRpLk5JRlRJMS5NQUdJQ19DT09LSUUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGlzIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIE5JRlRJIGZpbGUhIik7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmRpbV9pbmZvID0gbmlmdGkuVXRpbHMuZ2V0Qnl0ZUF0KHJhd0RhdGEsIDM5KTsKICAgICAgICAgIGZvciAoY3RyID0gMDsgY3RyIDwgODsgY3RyICs9IDEpIHsKICAgICAgICAgICAgaW5kZXggPSA0MCArIGN0ciAqIDI7CiAgICAgICAgICAgIHRoaXMuZGltc1tjdHJdID0gbmlmdGkuVXRpbHMuZ2V0U2hvcnRBdChyYXdEYXRhLCBpbmRleCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5pbnRlbnRfcDEgPSBuaWZ0aS5VdGlscy5nZXRGbG9hdEF0KHJhd0RhdGEsIDU2LCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICB0aGlzLmludGVudF9wMiA9IG5pZnRpLlV0aWxzLmdldEZsb2F0QXQocmF3RGF0YSwgNjAsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMuaW50ZW50X3AzID0gbmlmdGkuVXRpbHMuZ2V0RmxvYXRBdChyYXdEYXRhLCA2NCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5pbnRlbnRfY29kZSA9IG5pZnRpLlV0aWxzLmdldFNob3J0QXQocmF3RGF0YSwgNjgsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMuZGF0YXR5cGVDb2RlID0gbmlmdGkuVXRpbHMuZ2V0U2hvcnRBdChyYXdEYXRhLCA3MCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5udW1CaXRzUGVyVm94ZWwgPSBuaWZ0aS5VdGlscy5nZXRTaG9ydEF0KHJhd0RhdGEsIDcyLCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICB0aGlzLnNsaWNlX3N0YXJ0ID0gbmlmdGkuVXRpbHMuZ2V0U2hvcnRBdChyYXdEYXRhLCA3NCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgZm9yIChjdHIgPSAwOyBjdHIgPCA4OyBjdHIgKz0gMSkgewogICAgICAgICAgICBpbmRleCA9IDc2ICsgY3RyICogNDsKICAgICAgICAgICAgdGhpcy5waXhEaW1zW2N0cl0gPSBuaWZ0aS5VdGlscy5nZXRGbG9hdEF0KHJhd0RhdGEsIGluZGV4LCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnZveF9vZmZzZXQgPSBuaWZ0aS5VdGlscy5nZXRGbG9hdEF0KHJhd0RhdGEsIDEwOCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5zY2xfc2xvcGUgPSBuaWZ0aS5VdGlscy5nZXRGbG9hdEF0KHJhd0RhdGEsIDExMiwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5zY2xfaW50ZXIgPSBuaWZ0aS5VdGlscy5nZXRGbG9hdEF0KHJhd0RhdGEsIDExNiwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5zbGljZV9lbmQgPSBuaWZ0aS5VdGlscy5nZXRTaG9ydEF0KHJhd0RhdGEsIDEyMCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5zbGljZV9jb2RlID0gbmlmdGkuVXRpbHMuZ2V0Qnl0ZUF0KHJhd0RhdGEsIDEyMik7CiAgICAgICAgICB0aGlzLnh5enRfdW5pdHMgPSBuaWZ0aS5VdGlscy5nZXRCeXRlQXQocmF3RGF0YSwgMTIzKTsKICAgICAgICAgIHRoaXMuY2FsX21heCA9IG5pZnRpLlV0aWxzLmdldEZsb2F0QXQocmF3RGF0YSwgMTI0LCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICB0aGlzLmNhbF9taW4gPSBuaWZ0aS5VdGlscy5nZXRGbG9hdEF0KHJhd0RhdGEsIDEyOCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5zbGljZV9kdXJhdGlvbiA9IG5pZnRpLlV0aWxzLmdldEZsb2F0QXQocmF3RGF0YSwgMTMyLCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICB0aGlzLnRvZmZzZXQgPSBuaWZ0aS5VdGlscy5nZXRGbG9hdEF0KHJhd0RhdGEsIDEzNiwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IG5pZnRpLlV0aWxzLmdldFN0cmluZ0F0KHJhd0RhdGEsIDE0OCwgMjI4KTsKICAgICAgICAgIHRoaXMuYXV4X2ZpbGUgPSBuaWZ0aS5VdGlscy5nZXRTdHJpbmdBdChyYXdEYXRhLCAyMjgsIDI1Mik7CiAgICAgICAgICB0aGlzLnFmb3JtX2NvZGUgPSBuaWZ0aS5VdGlscy5nZXRTaG9ydEF0KHJhd0RhdGEsIDI1MiwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5zZm9ybV9jb2RlID0gbmlmdGkuVXRpbHMuZ2V0U2hvcnRBdChyYXdEYXRhLCAyNTQsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMucXVhdGVybl9iID0gbmlmdGkuVXRpbHMuZ2V0RmxvYXRBdChyYXdEYXRhLCAyNTYsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMucXVhdGVybl9jID0gbmlmdGkuVXRpbHMuZ2V0RmxvYXRBdChyYXdEYXRhLCAyNjAsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMucXVhdGVybl9kID0gbmlmdGkuVXRpbHMuZ2V0RmxvYXRBdChyYXdEYXRhLCAyNjQsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMucW9mZnNldF94ID0gbmlmdGkuVXRpbHMuZ2V0RmxvYXRBdChyYXdEYXRhLCAyNjgsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMucW9mZnNldF95ID0gbmlmdGkuVXRpbHMuZ2V0RmxvYXRBdChyYXdEYXRhLCAyNzIsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMucW9mZnNldF96ID0gbmlmdGkuVXRpbHMuZ2V0RmxvYXRBdChyYXdEYXRhLCAyNzYsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIGZvciAoY3RyT3V0ID0gMDsgY3RyT3V0IDwgMzsgY3RyT3V0ICs9IDEpIHsKICAgICAgICAgICAgZm9yIChjdHJJbiA9IDA7IGN0ckluIDwgNDsgY3RySW4gKz0gMSkgewogICAgICAgICAgICAgIGluZGV4ID0gMjgwICsgKGN0ck91dCAqIDQgKyBjdHJJbikgKiA0OwogICAgICAgICAgICAgIHRoaXMuYWZmaW5lW2N0ck91dF1bY3RySW5dID0gbmlmdGkuVXRpbHMuZ2V0RmxvYXRBdChyYXdEYXRhLCBpbmRleCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmFmZmluZVszXVswXSA9IDA7CiAgICAgICAgICB0aGlzLmFmZmluZVszXVsxXSA9IDA7CiAgICAgICAgICB0aGlzLmFmZmluZVszXVsyXSA9IDA7CiAgICAgICAgICB0aGlzLmFmZmluZVszXVszXSA9IDE7CiAgICAgICAgICB0aGlzLmludGVudF9uYW1lID0gbmlmdGkuVXRpbHMuZ2V0U3RyaW5nQXQocmF3RGF0YSwgMzI4LCAzNDQpOwogICAgICAgICAgdGhpcy5tYWdpYyA9IG5pZnRpLlV0aWxzLmdldFN0cmluZ0F0KHJhd0RhdGEsIDM0NCwgMzQ4KTsKICAgICAgICAgIHRoaXMuaXNIRFIgPSB0aGlzLm1hZ2ljID09PSBuaWZ0aS5OSUZUSTEuTUFHSUNfTlVNQkVSMjsKICAgICAgICAgIGlmIChyYXdEYXRhLmJ5dGVMZW5ndGggPiBuaWZ0aS5OSUZUSTEuTUFHSUNfQ09PS0lFKSB7CiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uRmxhZ1swXSA9IG5pZnRpLlV0aWxzLmdldEJ5dGVBdChyYXdEYXRhLCAzNDgpOwogICAgICAgICAgICB0aGlzLmV4dGVuc2lvbkZsYWdbMV0gPSBuaWZ0aS5VdGlscy5nZXRCeXRlQXQocmF3RGF0YSwgMzQ4ICsgMSk7CiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uRmxhZ1syXSA9IG5pZnRpLlV0aWxzLmdldEJ5dGVBdChyYXdEYXRhLCAzNDggKyAyKTsKICAgICAgICAgICAgdGhpcy5leHRlbnNpb25GbGFnWzNdID0gbmlmdGkuVXRpbHMuZ2V0Qnl0ZUF0KHJhd0RhdGEsIDM0OCArIDMpOwogICAgICAgICAgICBpZiAodGhpcy5leHRlbnNpb25GbGFnWzBdKSB7CiAgICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TaXplID0gdGhpcy5nZXRFeHRlbnNpb25TaXplKHJhd0RhdGEpOwogICAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uQ29kZSA9IHRoaXMuZ2V0RXh0ZW5zaW9uQ29kZShyYXdEYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgbmlmdGkuTklGVEkxLnByb3RvdHlwZS50b0Zvcm1hdHRlZFN0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGZtdCA9IG5pZnRpLlV0aWxzLmZvcm1hdE51bWJlciwgc3RyaW5nID0gIiI7CiAgICAgICAgICBzdHJpbmcgKz0gIkRpbSBJbmZvID0gIiArIHRoaXMuZGltX2luZm8gKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJJbWFnZSBEaW1lbnNpb25zICgxLTgpOiAiICsgdGhpcy5kaW1zWzBdICsgIiwgIiArIHRoaXMuZGltc1sxXSArICIsICIgKyB0aGlzLmRpbXNbMl0gKyAiLCAiICsgdGhpcy5kaW1zWzNdICsgIiwgIiArIHRoaXMuZGltc1s0XSArICIsICIgKyB0aGlzLmRpbXNbNV0gKyAiLCAiICsgdGhpcy5kaW1zWzZdICsgIiwgIiArIHRoaXMuZGltc1s3XSArICJcbiI7CiAgICAgICAgICBzdHJpbmcgKz0gIkludGVudCBQYXJhbWV0ZXJzICgxLTMpOiAiICsgdGhpcy5pbnRlbnRfcDEgKyAiLCAiICsgdGhpcy5pbnRlbnRfcDIgKyAiLCAiICsgdGhpcy5pbnRlbnRfcDMgKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJJbnRlbnQgQ29kZSA9ICIgKyB0aGlzLmludGVudF9jb2RlICsgIlxuIjsKICAgICAgICAgIHN0cmluZyArPSAiRGF0YXR5cGUgPSAiICsgdGhpcy5kYXRhdHlwZUNvZGUgKyAiICgiICsgdGhpcy5nZXREYXRhdHlwZUNvZGVTdHJpbmcodGhpcy5kYXRhdHlwZUNvZGUpICsgIilcbiI7CiAgICAgICAgICBzdHJpbmcgKz0gIkJpdHMgUGVyIFZveGVsID0gIiArIHRoaXMubnVtQml0c1BlclZveGVsICsgIlxuIjsKICAgICAgICAgIHN0cmluZyArPSAiU2xpY2UgU3RhcnQgPSAiICsgdGhpcy5zbGljZV9zdGFydCArICJcbiI7CiAgICAgICAgICBzdHJpbmcgKz0gIlZveGVsIERpbWVuc2lvbnMgKDEtOCk6ICIgKyBmbXQodGhpcy5waXhEaW1zWzBdKSArICIsICIgKyBmbXQodGhpcy5waXhEaW1zWzFdKSArICIsICIgKyBmbXQodGhpcy5waXhEaW1zWzJdKSArICIsICIgKyBmbXQodGhpcy5waXhEaW1zWzNdKSArICIsICIgKyBmbXQodGhpcy5waXhEaW1zWzRdKSArICIsICIgKyBmbXQodGhpcy5waXhEaW1zWzVdKSArICIsICIgKyBmbXQodGhpcy5waXhEaW1zWzZdKSArICIsICIgKyBmbXQodGhpcy5waXhEaW1zWzddKSArICJcbiI7CiAgICAgICAgICBzdHJpbmcgKz0gIkltYWdlIE9mZnNldCA9ICIgKyB0aGlzLnZveF9vZmZzZXQgKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJEYXRhIFNjYWxlOiAgU2xvcGUgPSAiICsgZm10KHRoaXMuc2NsX3Nsb3BlKSArICIgIEludGVyY2VwdCA9ICIgKyBmbXQodGhpcy5zY2xfaW50ZXIpICsgIlxuIjsKICAgICAgICAgIHN0cmluZyArPSAiU2xpY2UgRW5kID0gIiArIHRoaXMuc2xpY2VfZW5kICsgIlxuIjsKICAgICAgICAgIHN0cmluZyArPSAiU2xpY2UgQ29kZSA9ICIgKyB0aGlzLnNsaWNlX2NvZGUgKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJVbml0cyBDb2RlID0gIiArIHRoaXMueHl6dF91bml0cyArICIgKCIgKyB0aGlzLmdldFVuaXRzQ29kZVN0cmluZyhuaWZ0aS5OSUZUSTEuU1BBVElBTF9VTklUU19NQVNLICYgdGhpcy54eXp0X3VuaXRzKSArICIsICIgKyB0aGlzLmdldFVuaXRzQ29kZVN0cmluZyhuaWZ0aS5OSUZUSTEuVEVNUE9SQUxfVU5JVFNfTUFTSyAmIHRoaXMueHl6dF91bml0cykgKyAiKVxuIjsKICAgICAgICAgIHN0cmluZyArPSAiRGlzcGxheSBSYW5nZTogIE1heCA9ICIgKyBmbXQodGhpcy5jYWxfbWF4KSArICIgIE1pbiA9ICIgKyBmbXQodGhpcy5jYWxfbWluKSArICJcbiI7CiAgICAgICAgICBzdHJpbmcgKz0gIlNsaWNlIER1cmF0aW9uID0gIiArIHRoaXMuc2xpY2VfZHVyYXRpb24gKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJUaW1lIEF4aXMgU2hpZnQgPSAiICsgdGhpcy50b2Zmc2V0ICsgIlxuIjsKICAgICAgICAgIHN0cmluZyArPSAnRGVzY3JpcHRpb246ICInICsgdGhpcy5kZXNjcmlwdGlvbiArICciXG4nOwogICAgICAgICAgc3RyaW5nICs9ICdBdXhpbGlhcnkgRmlsZTogIicgKyB0aGlzLmF1eF9maWxlICsgJyJcbic7CiAgICAgICAgICBzdHJpbmcgKz0gIlEtRm9ybSBDb2RlID0gIiArIHRoaXMucWZvcm1fY29kZSArICIgKCIgKyB0aGlzLmdldFRyYW5zZm9ybUNvZGVTdHJpbmcodGhpcy5xZm9ybV9jb2RlKSArICIpXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJTLUZvcm0gQ29kZSA9ICIgKyB0aGlzLnNmb3JtX2NvZGUgKyAiICgiICsgdGhpcy5nZXRUcmFuc2Zvcm1Db2RlU3RyaW5nKHRoaXMuc2Zvcm1fY29kZSkgKyAiKVxuIjsKICAgICAgICAgIHN0cmluZyArPSAiUXVhdGVybmlvbiBQYXJhbWV0ZXJzOiAgYiA9ICIgKyBmbXQodGhpcy5xdWF0ZXJuX2IpICsgIiAgYyA9ICIgKyBmbXQodGhpcy5xdWF0ZXJuX2MpICsgIiAgZCA9ICIgKyBmbXQodGhpcy5xdWF0ZXJuX2QpICsgIlxuIjsKICAgICAgICAgIHN0cmluZyArPSAiUXVhdGVybmlvbiBPZmZzZXRzOiAgeCA9ICIgKyB0aGlzLnFvZmZzZXRfeCArICIgIHkgPSAiICsgdGhpcy5xb2Zmc2V0X3kgKyAiICB6ID0gIiArIHRoaXMucW9mZnNldF96ICsgIlxuIjsKICAgICAgICAgIHN0cmluZyArPSAiUy1Gb3JtIFBhcmFtZXRlcnMgWDogIiArIGZtdCh0aGlzLmFmZmluZVswXVswXSkgKyAiLCAiICsgZm10KHRoaXMuYWZmaW5lWzBdWzFdKSArICIsICIgKyBmbXQodGhpcy5hZmZpbmVbMF1bMl0pICsgIiwgIiArIGZtdCh0aGlzLmFmZmluZVswXVszXSkgKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJTLUZvcm0gUGFyYW1ldGVycyBZOiAiICsgZm10KHRoaXMuYWZmaW5lWzFdWzBdKSArICIsICIgKyBmbXQodGhpcy5hZmZpbmVbMV1bMV0pICsgIiwgIiArIGZtdCh0aGlzLmFmZmluZVsxXVsyXSkgKyAiLCAiICsgZm10KHRoaXMuYWZmaW5lWzFdWzNdKSArICJcbiI7CiAgICAgICAgICBzdHJpbmcgKz0gIlMtRm9ybSBQYXJhbWV0ZXJzIFo6ICIgKyBmbXQodGhpcy5hZmZpbmVbMl1bMF0pICsgIiwgIiArIGZtdCh0aGlzLmFmZmluZVsyXVsxXSkgKyAiLCAiICsgZm10KHRoaXMuYWZmaW5lWzJdWzJdKSArICIsICIgKyBmbXQodGhpcy5hZmZpbmVbMl1bM10pICsgIlxuIjsKICAgICAgICAgIHN0cmluZyArPSAnSW50ZW50IE5hbWU6ICInICsgdGhpcy5pbnRlbnRfbmFtZSArICciXG4nOwogICAgICAgICAgaWYgKHRoaXMuZXh0ZW5zaW9uRmxhZ1swXSkgewogICAgICAgICAgICBzdHJpbmcgKz0gIkV4dGVuc2lvbjogU2l6ZSA9ICIgKyB0aGlzLmV4dGVuc2lvblNpemUgKyAiICBDb2RlID0gIiArIHRoaXMuZXh0ZW5zaW9uQ29kZSArICJcbiI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3RyaW5nOwogICAgICAgIH07CiAgICAgICAgbmlmdGkuTklGVEkxLnByb3RvdHlwZS5nZXREYXRhdHlwZUNvZGVTdHJpbmcgPSBmdW5jdGlvbihjb2RlKSB7CiAgICAgICAgICBpZiAoY29kZSA9PT0gbmlmdGkuTklGVEkxLlRZUEVfVUlOVDgpIHsKICAgICAgICAgICAgcmV0dXJuICIxLUJ5dGUgVW5zaWduZWQgSW50ZWdlciI7CiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IG5pZnRpLk5JRlRJMS5UWVBFX0lOVDE2KSB7CiAgICAgICAgICAgIHJldHVybiAiMi1CeXRlIFNpZ25lZCBJbnRlZ2VyIjsKICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gbmlmdGkuTklGVEkxLlRZUEVfSU5UMzIpIHsKICAgICAgICAgICAgcmV0dXJuICI0LUJ5dGUgU2lnbmVkIEludGVnZXIiOwogICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSBuaWZ0aS5OSUZUSTEuVFlQRV9GTE9BVDMyKSB7CiAgICAgICAgICAgIHJldHVybiAiNC1CeXRlIEZsb2F0IjsKICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gbmlmdGkuTklGVEkxLlRZUEVfRkxPQVQ2NCkgewogICAgICAgICAgICByZXR1cm4gIjgtQnl0ZSBGbG9hdCI7CiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IG5pZnRpLk5JRlRJMS5UWVBFX1JHQjI0KSB7CiAgICAgICAgICAgIHJldHVybiAiUkdCIjsKICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gbmlmdGkuTklGVEkxLlRZUEVfSU5UOCkgewogICAgICAgICAgICByZXR1cm4gIjEtQnl0ZSBTaWduZWQgSW50ZWdlciI7CiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IG5pZnRpLk5JRlRJMS5UWVBFX1VJTlQxNikgewogICAgICAgICAgICByZXR1cm4gIjItQnl0ZSBVbnNpZ25lZCBJbnRlZ2VyIjsKICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gbmlmdGkuTklGVEkxLlRZUEVfVUlOVDMyKSB7CiAgICAgICAgICAgIHJldHVybiAiNC1CeXRlIFVuc2lnbmVkIEludGVnZXIiOwogICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSBuaWZ0aS5OSUZUSTEuVFlQRV9JTlQ2NCkgewogICAgICAgICAgICByZXR1cm4gIjgtQnl0ZSBTaWduZWQgSW50ZWdlciI7CiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IG5pZnRpLk5JRlRJMS5UWVBFX1VJTlQ2NCkgewogICAgICAgICAgICByZXR1cm4gIjgtQnl0ZSBVbnNpZ25lZCBJbnRlZ2VyIjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiVW5rbm93biI7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBuaWZ0aS5OSUZUSTEucHJvdG90eXBlLmdldFRyYW5zZm9ybUNvZGVTdHJpbmcgPSBmdW5jdGlvbihjb2RlKSB7CiAgICAgICAgICBpZiAoY29kZSA9PT0gbmlmdGkuTklGVEkxLlhGT1JNX1NDQU5ORVJfQU5BVCkgewogICAgICAgICAgICByZXR1cm4gIlNjYW5uZXIiOwogICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSBuaWZ0aS5OSUZUSTEuWEZPUk1fQUxJR05FRF9BTkFUKSB7CiAgICAgICAgICAgIHJldHVybiAiQWxpZ25lZCI7CiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IG5pZnRpLk5JRlRJMS5YRk9STV9UQUxBSVJBQ0gpIHsKICAgICAgICAgICAgcmV0dXJuICJUYWxhaXJhY2giOwogICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSBuaWZ0aS5OSUZUSTEuWEZPUk1fTU5JXzE1MikgewogICAgICAgICAgICByZXR1cm4gIk1OSSI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIlVua25vd24iOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgbmlmdGkuTklGVEkxLnByb3RvdHlwZS5nZXRVbml0c0NvZGVTdHJpbmcgPSBmdW5jdGlvbihjb2RlKSB7CiAgICAgICAgICBpZiAoY29kZSA9PT0gbmlmdGkuTklGVEkxLlVOSVRTX01FVEVSKSB7CiAgICAgICAgICAgIHJldHVybiAiTWV0ZXJzIjsKICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gbmlmdGkuTklGVEkxLlVOSVRTX01NKSB7CiAgICAgICAgICAgIHJldHVybiAiTWlsbGltZXRlcnMiOwogICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSBuaWZ0aS5OSUZUSTEuVU5JVFNfTUlDUk9OKSB7CiAgICAgICAgICAgIHJldHVybiAiTWljcm9ucyI7CiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IG5pZnRpLk5JRlRJMS5VTklUU19TRUMpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWNvbmRzIjsKICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gbmlmdGkuTklGVEkxLlVOSVRTX01TRUMpIHsKICAgICAgICAgICAgcmV0dXJuICJNaWxsaXNlY29uZHMiOwogICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSBuaWZ0aS5OSUZUSTEuVU5JVFNfVVNFQykgewogICAgICAgICAgICByZXR1cm4gIk1pY3Jvc2Vjb25kcyI7CiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IG5pZnRpLk5JRlRJMS5VTklUU19IWikgewogICAgICAgICAgICByZXR1cm4gIkh6IjsKICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gbmlmdGkuTklGVEkxLlVOSVRTX1BQTSkgewogICAgICAgICAgICByZXR1cm4gIlBQTSI7CiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IG5pZnRpLk5JRlRJMS5VTklUU19SQURTKSB7CiAgICAgICAgICAgIHJldHVybiAiUmFkcyI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIlVua25vd24iOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgbmlmdGkuTklGVEkxLnByb3RvdHlwZS5nZXRRZm9ybU1hdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydE5pZnRpUUZvcm1Ub05pZnRpU0Zvcm0odGhpcy5xdWF0ZXJuX2IsIHRoaXMucXVhdGVybl9jLCB0aGlzLnF1YXRlcm5fZCwgdGhpcy5xb2Zmc2V0X3gsIHRoaXMucW9mZnNldF95LCB0aGlzLnFvZmZzZXRfeiwgdGhpcy5waXhEaW1zWzFdLCB0aGlzLnBpeERpbXNbMl0sIHRoaXMucGl4RGltc1szXSwgdGhpcy5waXhEaW1zWzBdKTsKICAgICAgICB9OwogICAgICAgIG5pZnRpLk5JRlRJMS5wcm90b3R5cGUuY29udmVydE5pZnRpUUZvcm1Ub05pZnRpU0Zvcm0gPSBmdW5jdGlvbihxYiwgcWMsIHFkLCBxeCwgcXksIHF6LCBkeCwgZHksIGR6LCBxZmFjKSB7CiAgICAgICAgICB2YXIgUiA9IFtbMCwgMCwgMCwgMF0sIFswLCAwLCAwLCAwXSwgWzAsIDAsIDAsIDBdLCBbMCwgMCwgMCwgMF1dLCBhLCBiID0gcWIsIGMgPSBxYywgZCA9IHFkLCB4ZCwgeWQsIHpkOwogICAgICAgICAgUlszXVswXSA9IFJbM11bMV0gPSBSWzNdWzJdID0gMDsKICAgICAgICAgIFJbM11bM10gPSAxOwogICAgICAgICAgYSA9IDEgLSAoYiAqIGIgKyBjICogYyArIGQgKiBkKTsKICAgICAgICAgIGlmIChhIDwgMWUtNykgewogICAgICAgICAgICBhID0gMSAvIE1hdGguc3FydChiICogYiArIGMgKiBjICsgZCAqIGQpOwogICAgICAgICAgICBiICo9IGE7CiAgICAgICAgICAgIGMgKj0gYTsKICAgICAgICAgICAgZCAqPSBhOwogICAgICAgICAgICBhID0gMDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGEgPSBNYXRoLnNxcnQoYSk7CiAgICAgICAgICB9CiAgICAgICAgICB4ZCA9IGR4ID4gMCA/IGR4IDogMTsKICAgICAgICAgIHlkID0gZHkgPiAwID8gZHkgOiAxOwogICAgICAgICAgemQgPSBkeiA+IDAgPyBkeiA6IDE7CiAgICAgICAgICBpZiAocWZhYyA8IDApIHsKICAgICAgICAgICAgemQgPSAtemQ7CiAgICAgICAgICB9CiAgICAgICAgICBSWzBdWzBdID0gKGEgKiBhICsgYiAqIGIgLSBjICogYyAtIGQgKiBkKSAqIHhkOwogICAgICAgICAgUlswXVsxXSA9IDIgKiAoYiAqIGMgLSBhICogZCkgKiB5ZDsKICAgICAgICAgIFJbMF1bMl0gPSAyICogKGIgKiBkICsgYSAqIGMpICogemQ7CiAgICAgICAgICBSWzFdWzBdID0gMiAqIChiICogYyArIGEgKiBkKSAqIHhkOwogICAgICAgICAgUlsxXVsxXSA9IChhICogYSArIGMgKiBjIC0gYiAqIGIgLSBkICogZCkgKiB5ZDsKICAgICAgICAgIFJbMV1bMl0gPSAyICogKGMgKiBkIC0gYSAqIGIpICogemQ7CiAgICAgICAgICBSWzJdWzBdID0gMiAqIChiICogZCAtIGEgKiBjKSAqIHhkOwogICAgICAgICAgUlsyXVsxXSA9IDIgKiAoYyAqIGQgKyBhICogYikgKiB5ZDsKICAgICAgICAgIFJbMl1bMl0gPSAoYSAqIGEgKyBkICogZCAtIGMgKiBjIC0gYiAqIGIpICogemQ7CiAgICAgICAgICBSWzBdWzNdID0gcXg7CiAgICAgICAgICBSWzFdWzNdID0gcXk7CiAgICAgICAgICBSWzJdWzNdID0gcXo7CiAgICAgICAgICByZXR1cm4gUjsKICAgICAgICB9OwogICAgICAgIG5pZnRpLk5JRlRJMS5wcm90b3R5cGUuY29udmVydE5pZnRpU0Zvcm1Ub05FTUEgPSBmdW5jdGlvbihSKSB7CiAgICAgICAgICB2YXIgeGksIHhqLCB4aywgeWksIHlqLCB5aywgemksIHpqLCB6aywgdmFsLCBkZXRRLCBkZXRQLCBpLCBqLCBrLCBwLCBxLCByLCBpYmVzdCwgamJlc3QsIGtiZXN0LCBwYmVzdCwgcWJlc3QsIHJiZXN0LCBNLCB2YmVzdCwgUSwgUCwgaUNoYXIsIGpDaGFyLCBrQ2hhciwgaVNlbnNlLCBqU2Vuc2UsIGtTZW5zZTsKICAgICAgICAgIGsgPSAwOwogICAgICAgICAgUSA9IFtbMCwgMCwgMF0sIFswLCAwLCAwXSwgWzAsIDAsIDBdXTsKICAgICAgICAgIFAgPSBbWzAsIDAsIDBdLCBbMCwgMCwgMF0sIFswLCAwLCAwXV07CiAgICAgICAgICB4aSA9IFJbMF1bMF07CiAgICAgICAgICB4aiA9IFJbMF1bMV07CiAgICAgICAgICB4ayA9IFJbMF1bMl07CiAgICAgICAgICB5aSA9IFJbMV1bMF07CiAgICAgICAgICB5aiA9IFJbMV1bMV07CiAgICAgICAgICB5ayA9IFJbMV1bMl07CiAgICAgICAgICB6aSA9IFJbMl1bMF07CiAgICAgICAgICB6aiA9IFJbMl1bMV07CiAgICAgICAgICB6ayA9IFJbMl1bMl07CiAgICAgICAgICB2YWwgPSBNYXRoLnNxcnQoeGkgKiB4aSArIHlpICogeWkgKyB6aSAqIHppKTsKICAgICAgICAgIGlmICh2YWwgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICB4aSAvPSB2YWw7CiAgICAgICAgICB5aSAvPSB2YWw7CiAgICAgICAgICB6aSAvPSB2YWw7CiAgICAgICAgICB2YWwgPSBNYXRoLnNxcnQoeGogKiB4aiArIHlqICogeWogKyB6aiAqIHpqKTsKICAgICAgICAgIGlmICh2YWwgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICB4aiAvPSB2YWw7CiAgICAgICAgICB5aiAvPSB2YWw7CiAgICAgICAgICB6aiAvPSB2YWw7CiAgICAgICAgICB2YWwgPSB4aSAqIHhqICsgeWkgKiB5aiArIHppICogemo7CiAgICAgICAgICBpZiAoTWF0aC5hYnModmFsKSA+IDFlLTQpIHsKICAgICAgICAgICAgeGogLT0gdmFsICogeGk7CiAgICAgICAgICAgIHlqIC09IHZhbCAqIHlpOwogICAgICAgICAgICB6aiAtPSB2YWwgKiB6aTsKICAgICAgICAgICAgdmFsID0gTWF0aC5zcXJ0KHhqICogeGogKyB5aiAqIHlqICsgemogKiB6aik7CiAgICAgICAgICAgIGlmICh2YWwgPT09IDApIHsKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICB4aiAvPSB2YWw7CiAgICAgICAgICAgIHlqIC89IHZhbDsKICAgICAgICAgICAgemogLz0gdmFsOwogICAgICAgICAgfQogICAgICAgICAgdmFsID0gTWF0aC5zcXJ0KHhrICogeGsgKyB5ayAqIHlrICsgemsgKiB6ayk7CiAgICAgICAgICBpZiAodmFsID09PSAwKSB7CiAgICAgICAgICAgIHhrID0geWkgKiB6aiAtIHppICogeWo7CiAgICAgICAgICAgIHlrID0gemkgKiB4aiAtIHpqICogeGk7CiAgICAgICAgICAgIHprID0geGkgKiB5aiAtIHlpICogeGo7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB4ayAvPSB2YWw7CiAgICAgICAgICAgIHlrIC89IHZhbDsKICAgICAgICAgICAgemsgLz0gdmFsOwogICAgICAgICAgfQogICAgICAgICAgdmFsID0geGkgKiB4ayArIHlpICogeWsgKyB6aSAqIHprOwogICAgICAgICAgaWYgKE1hdGguYWJzKHZhbCkgPiAxZS00KSB7CiAgICAgICAgICAgIHhrIC09IHZhbCAqIHhpOwogICAgICAgICAgICB5ayAtPSB2YWwgKiB5aTsKICAgICAgICAgICAgemsgLT0gdmFsICogemk7CiAgICAgICAgICAgIHZhbCA9IE1hdGguc3FydCh4ayAqIHhrICsgeWsgKiB5ayArIHprICogemspOwogICAgICAgICAgICBpZiAodmFsID09PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeGsgLz0gdmFsOwogICAgICAgICAgICB5ayAvPSB2YWw7CiAgICAgICAgICAgIHprIC89IHZhbDsKICAgICAgICAgIH0KICAgICAgICAgIHZhbCA9IHhqICogeGsgKyB5aiAqIHlrICsgemogKiB6azsKICAgICAgICAgIGlmIChNYXRoLmFicyh2YWwpID4gMWUtNCkgewogICAgICAgICAgICB4ayAtPSB2YWwgKiB4ajsKICAgICAgICAgICAgeWsgLT0gdmFsICogeWo7CiAgICAgICAgICAgIHprIC09IHZhbCAqIHpqOwogICAgICAgICAgICB2YWwgPSBNYXRoLnNxcnQoeGsgKiB4ayArIHlrICogeWsgKyB6ayAqIHprKTsKICAgICAgICAgICAgaWYgKHZhbCA9PT0gMCkgewogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHhrIC89IHZhbDsKICAgICAgICAgICAgeWsgLz0gdmFsOwogICAgICAgICAgICB6ayAvPSB2YWw7CiAgICAgICAgICB9CiAgICAgICAgICBRWzBdWzBdID0geGk7CiAgICAgICAgICBRWzBdWzFdID0geGo7CiAgICAgICAgICBRWzBdWzJdID0geGs7CiAgICAgICAgICBRWzFdWzBdID0geWk7CiAgICAgICAgICBRWzFdWzFdID0geWo7CiAgICAgICAgICBRWzFdWzJdID0geWs7CiAgICAgICAgICBRWzJdWzBdID0gemk7CiAgICAgICAgICBRWzJdWzFdID0gemo7CiAgICAgICAgICBRWzJdWzJdID0gems7CiAgICAgICAgICBkZXRRID0gdGhpcy5uaWZ0aV9tYXQzM19kZXRlcm0oUSk7CiAgICAgICAgICBpZiAoZGV0USA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHZiZXN0ID0gLTY2NjsKICAgICAgICAgIGliZXN0ID0gcGJlc3QgPSBxYmVzdCA9IHJiZXN0ID0gMTsKICAgICAgICAgIGpiZXN0ID0gMjsKICAgICAgICAgIGtiZXN0ID0gMzsKICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gMzsgaSArPSAxKSB7CiAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPD0gMzsgaiArPSAxKSB7CiAgICAgICAgICAgICAgaWYgKGkgIT09IGopIHsKICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPD0gMzsgayArPSAxKSB7CiAgICAgICAgICAgICAgICAgIGlmICghKGkgPT09IGsgfHwgaiA9PT0gaykpIHsKICAgICAgICAgICAgICAgICAgICBQWzBdWzBdID0gUFswXVsxXSA9IFBbMF1bMl0gPSBQWzFdWzBdID0gUFsxXVsxXSA9IFBbMV1bMl0gPSBQWzJdWzBdID0gUFsyXVsxXSA9IFBbMl1bMl0gPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAocCA9IC0xOyBwIDw9IDE7IHAgKz0gMikgewogICAgICAgICAgICAgICAgICAgICAgZm9yIChxID0gLTE7IHEgPD0gMTsgcSArPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9IC0xOyByIDw9IDE7IHIgKz0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAgIFBbMF1baSAtIDFdID0gcDsKICAgICAgICAgICAgICAgICAgICAgICAgICBQWzFdW2ogLSAxXSA9IHE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgUFsyXVtrIC0gMV0gPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgIGRldFAgPSB0aGlzLm5pZnRpX21hdDMzX2RldGVybShQKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV0UCAqIGRldFEgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNID0gdGhpcy5uaWZ0aV9tYXQzM19tdWwoUCwgUSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBNWzBdWzBdICsgTVsxXVsxXSArIE1bMl1bMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsID4gdmJlc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmJlc3QgPSB2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGliZXN0ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJlc3QgPSBqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrYmVzdCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiZXN0ID0gcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWJlc3QgPSBxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYmVzdCA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpQ2hhciA9IGpDaGFyID0ga0NoYXIgPSBpU2Vuc2UgPSBqU2Vuc2UgPSBrU2Vuc2UgPSAwOwogICAgICAgICAgc3dpdGNoIChpYmVzdCAqIHBiZXN0KSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBpQ2hhciA9ICJYIjsKICAgICAgICAgICAgICBpU2Vuc2UgPSAiKyI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgLTE6CiAgICAgICAgICAgICAgaUNoYXIgPSAiWCI7CiAgICAgICAgICAgICAgaVNlbnNlID0gIi0iOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgaUNoYXIgPSAiWSI7CiAgICAgICAgICAgICAgaVNlbnNlID0gIisiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIC0yOgogICAgICAgICAgICAgIGlDaGFyID0gIlkiOwogICAgICAgICAgICAgIGlTZW5zZSA9ICItIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgIGlDaGFyID0gIloiOwogICAgICAgICAgICAgIGlTZW5zZSA9ICIrIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAtMzoKICAgICAgICAgICAgICBpQ2hhciA9ICJaIjsKICAgICAgICAgICAgICBpU2Vuc2UgPSAiLSI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBzd2l0Y2ggKGpiZXN0ICogcWJlc3QpIHsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGpDaGFyID0gIlgiOwogICAgICAgICAgICAgIGpTZW5zZSA9ICIrIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAtMToKICAgICAgICAgICAgICBqQ2hhciA9ICJYIjsKICAgICAgICAgICAgICBqU2Vuc2UgPSAiLSI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICBqQ2hhciA9ICJZIjsKICAgICAgICAgICAgICBqU2Vuc2UgPSAiKyI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgLTI6CiAgICAgICAgICAgICAgakNoYXIgPSAiWSI7CiAgICAgICAgICAgICAgalNlbnNlID0gIi0iOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgakNoYXIgPSAiWiI7CiAgICAgICAgICAgICAgalNlbnNlID0gIisiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIC0zOgogICAgICAgICAgICAgIGpDaGFyID0gIloiOwogICAgICAgICAgICAgIGpTZW5zZSA9ICItIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHN3aXRjaCAoa2Jlc3QgKiByYmVzdCkgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAga0NoYXIgPSAiWCI7CiAgICAgICAgICAgICAga1NlbnNlID0gIisiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICAgIGtDaGFyID0gIlgiOwogICAgICAgICAgICAgIGtTZW5zZSA9ICItIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIGtDaGFyID0gIlkiOwogICAgICAgICAgICAgIGtTZW5zZSA9ICIrIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAtMjoKICAgICAgICAgICAgICBrQ2hhciA9ICJZIjsKICAgICAgICAgICAgICBrU2Vuc2UgPSAiLSI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBrQ2hhciA9ICJaIjsKICAgICAgICAgICAgICBrU2Vuc2UgPSAiKyI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgLTM6CiAgICAgICAgICAgICAga0NoYXIgPSAiWiI7CiAgICAgICAgICAgICAga1NlbnNlID0gIi0iOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGlDaGFyICsgakNoYXIgKyBrQ2hhciArIGlTZW5zZSArIGpTZW5zZSArIGtTZW5zZTsKICAgICAgICB9OwogICAgICAgIG5pZnRpLk5JRlRJMS5wcm90b3R5cGUubmlmdGlfbWF0MzNfbXVsID0gZnVuY3Rpb24oQSwgQikgewogICAgICAgICAgdmFyIEMgPSBbWzAsIDAsIDBdLCBbMCwgMCwgMF0sIFswLCAwLCAwXV0sIGksIGo7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSArPSAxKSB7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqICs9IDEpIHsKICAgICAgICAgICAgICBDW2ldW2pdID0gQVtpXVswXSAqIEJbMF1bal0gKyBBW2ldWzFdICogQlsxXVtqXSArIEFbaV1bMl0gKiBCWzJdW2pdOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gQzsKICAgICAgICB9OwogICAgICAgIG5pZnRpLk5JRlRJMS5wcm90b3R5cGUubmlmdGlfbWF0MzNfZGV0ZXJtID0gZnVuY3Rpb24oUikgewogICAgICAgICAgdmFyIHIxMSwgcjEyLCByMTMsIHIyMSwgcjIyLCByMjMsIHIzMSwgcjMyLCByMzM7CiAgICAgICAgICByMTEgPSBSWzBdWzBdOwogICAgICAgICAgcjEyID0gUlswXVsxXTsKICAgICAgICAgIHIxMyA9IFJbMF1bMl07CiAgICAgICAgICByMjEgPSBSWzFdWzBdOwogICAgICAgICAgcjIyID0gUlsxXVsxXTsKICAgICAgICAgIHIyMyA9IFJbMV1bMl07CiAgICAgICAgICByMzEgPSBSWzJdWzBdOwogICAgICAgICAgcjMyID0gUlsyXVsxXTsKICAgICAgICAgIHIzMyA9IFJbMl1bMl07CiAgICAgICAgICByZXR1cm4gcjExICogcjIyICogcjMzIC0gcjExICogcjMyICogcjIzIC0gcjIxICogcjEyICogcjMzICsgcjIxICogcjMyICogcjEzICsgcjMxICogcjEyICogcjIzIC0gcjMxICogcjIyICogcjEzOwogICAgICAgIH07CiAgICAgICAgbmlmdGkuTklGVEkxLnByb3RvdHlwZS5nZXRFeHRlbnNpb25Mb2NhdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIG5pZnRpLk5JRlRJMS5NQUdJQ19DT09LSUUgKyA0OwogICAgICAgIH07CiAgICAgICAgbmlmdGkuTklGVEkxLnByb3RvdHlwZS5nZXRFeHRlbnNpb25TaXplID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgcmV0dXJuIG5pZnRpLlV0aWxzLmdldEludEF0KGRhdGEsIHRoaXMuZ2V0RXh0ZW5zaW9uTG9jYXRpb24oKSwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgIH07CiAgICAgICAgbmlmdGkuTklGVEkxLnByb3RvdHlwZS5nZXRFeHRlbnNpb25Db2RlID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgcmV0dXJuIG5pZnRpLlV0aWxzLmdldEludEF0KGRhdGEsIHRoaXMuZ2V0RXh0ZW5zaW9uTG9jYXRpb24oKSArIDQsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICB9OwogICAgICAgIHZhciBtb2R1bGVUeXBlID0gdHlwZW9mIG1vZHVsZTsKICAgICAgICBpZiAobW9kdWxlVHlwZSAhPT0gInVuZGVmaW5lZCIgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbmlmdGkuTklGVEkxOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgLy8gbm9kZV9tb2R1bGVzL25pZnRpLXJlYWRlci1qcy9zcmMvbmlmdGkyLmpzCiAgICB2YXIgcmVxdWlyZV9uaWZ0aTIgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9uaWZ0aS1yZWFkZXItanMvc3JjL25pZnRpMi5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICAgdmFyIG5pZnRpID0gbmlmdGkgfHwge307CiAgICAgICAgbmlmdGkuVXRpbHMgPSBuaWZ0aS5VdGlscyB8fCAodHlwZW9mIF9fcmVxdWlyZSAhPT0gInVuZGVmaW5lZCIgPyByZXF1aXJlX3V0aWxpdGllcygpIDogbnVsbCk7CiAgICAgICAgbmlmdGkuTklGVEkxID0gbmlmdGkuTklGVEkxIHx8ICh0eXBlb2YgX19yZXF1aXJlICE9PSAidW5kZWZpbmVkIiA/IHJlcXVpcmVfbmlmdGkxKCkgOiBudWxsKTsKICAgICAgICBuaWZ0aS5OSUZUSTIgPSBuaWZ0aS5OSUZUSTIgfHwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlzLmxpdHRsZUVuZGlhbiA9IGZhbHNlOwogICAgICAgICAgdGhpcy5kaW1faW5mbyA9IDA7CiAgICAgICAgICB0aGlzLmRpbXMgPSBbXTsKICAgICAgICAgIHRoaXMuaW50ZW50X3AxID0gMDsKICAgICAgICAgIHRoaXMuaW50ZW50X3AyID0gMDsKICAgICAgICAgIHRoaXMuaW50ZW50X3AzID0gMDsKICAgICAgICAgIHRoaXMuaW50ZW50X2NvZGUgPSAwOwogICAgICAgICAgdGhpcy5kYXRhdHlwZUNvZGUgPSAwOwogICAgICAgICAgdGhpcy5udW1CaXRzUGVyVm94ZWwgPSAwOwogICAgICAgICAgdGhpcy5zbGljZV9zdGFydCA9IDA7CiAgICAgICAgICB0aGlzLnNsaWNlX2VuZCA9IDA7CiAgICAgICAgICB0aGlzLnNsaWNlX2NvZGUgPSAwOwogICAgICAgICAgdGhpcy5waXhEaW1zID0gW107CiAgICAgICAgICB0aGlzLnZveF9vZmZzZXQgPSAwOwogICAgICAgICAgdGhpcy5zY2xfc2xvcGUgPSAxOwogICAgICAgICAgdGhpcy5zY2xfaW50ZXIgPSAwOwogICAgICAgICAgdGhpcy54eXp0X3VuaXRzID0gMDsKICAgICAgICAgIHRoaXMuY2FsX21heCA9IDA7CiAgICAgICAgICB0aGlzLmNhbF9taW4gPSAwOwogICAgICAgICAgdGhpcy5zbGljZV9kdXJhdGlvbiA9IDA7CiAgICAgICAgICB0aGlzLnRvZmZzZXQgPSAwOwogICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9ICIiOwogICAgICAgICAgdGhpcy5hdXhfZmlsZSA9ICIiOwogICAgICAgICAgdGhpcy5pbnRlbnRfbmFtZSA9ICIiOwogICAgICAgICAgdGhpcy5xZm9ybV9jb2RlID0gMDsKICAgICAgICAgIHRoaXMuc2Zvcm1fY29kZSA9IDA7CiAgICAgICAgICB0aGlzLnF1YXRlcm5fYiA9IDA7CiAgICAgICAgICB0aGlzLnF1YXRlcm5fYyA9IDA7CiAgICAgICAgICB0aGlzLnF1YXRlcm5fZCA9IDA7CiAgICAgICAgICB0aGlzLnFvZmZzZXRfeCA9IDA7CiAgICAgICAgICB0aGlzLnFvZmZzZXRfeSA9IDA7CiAgICAgICAgICB0aGlzLnFvZmZzZXRfeiA9IDA7CiAgICAgICAgICB0aGlzLmFmZmluZSA9IFtbMSwgMCwgMCwgMF0sIFswLCAxLCAwLCAwXSwgWzAsIDAsIDEsIDBdLCBbMCwgMCwgMCwgMV1dOwogICAgICAgICAgdGhpcy5tYWdpYyA9IDA7CiAgICAgICAgICB0aGlzLmV4dGVuc2lvbkZsYWcgPSBbMCwgMCwgMCwgMF07CiAgICAgICAgfTsKICAgICAgICBuaWZ0aS5OSUZUSTIuTUFHSUNfQ09PS0lFID0gNTQwOwogICAgICAgIG5pZnRpLk5JRlRJMi5NQUdJQ19OVU1CRVJfTE9DQVRJT04gPSA0OwogICAgICAgIG5pZnRpLk5JRlRJMi5NQUdJQ19OVU1CRVIgPSBbMTEwLCA0MywgNTAsIDAsIDEzLCAxMCwgMjYsIDEwXTsKICAgICAgICBuaWZ0aS5OSUZUSTIucHJvdG90eXBlLnJlYWRIZWFkZXIgPSBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICB2YXIgcmF3RGF0YSA9IG5ldyBEYXRhVmlldyhkYXRhKSwgbWFnaWNDb29raWVWYWwgPSBuaWZ0aS5VdGlscy5nZXRJbnRBdChyYXdEYXRhLCAwLCB0aGlzLmxpdHRsZUVuZGlhbiksIGN0ciwgY3RyT3V0LCBjdHJJbiwgaW5kZXg7CiAgICAgICAgICBpZiAobWFnaWNDb29raWVWYWwgIT09IG5pZnRpLk5JRlRJMi5NQUdJQ19DT09LSUUpIHsKICAgICAgICAgICAgdGhpcy5saXR0bGVFbmRpYW4gPSB0cnVlOwogICAgICAgICAgICBtYWdpY0Nvb2tpZVZhbCA9IG5pZnRpLlV0aWxzLmdldEludEF0KHJhd0RhdGEsIDAsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtYWdpY0Nvb2tpZVZhbCAhPT0gbmlmdGkuTklGVEkyLk1BR0lDX0NPT0tJRSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoaXMgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgTklGVEkgZmlsZSEiKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZGF0YXR5cGVDb2RlID0gbmlmdGkuVXRpbHMuZ2V0U2hvcnRBdChyYXdEYXRhLCAxMiwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5udW1CaXRzUGVyVm94ZWwgPSBuaWZ0aS5VdGlscy5nZXRTaG9ydEF0KHJhd0RhdGEsIDE0LCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICBmb3IgKGN0ciA9IDA7IGN0ciA8IDg7IGN0ciArPSAxKSB7CiAgICAgICAgICAgIGluZGV4ID0gMTYgKyBjdHIgKiA4OwogICAgICAgICAgICB0aGlzLmRpbXNbY3RyXSA9IG5pZnRpLlV0aWxzLmdldExvbmdBdChyYXdEYXRhLCBpbmRleCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5pbnRlbnRfcDEgPSBuaWZ0aS5VdGlscy5nZXREb3VibGVBdChyYXdEYXRhLCA4MCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5pbnRlbnRfcDIgPSBuaWZ0aS5VdGlscy5nZXREb3VibGVBdChyYXdEYXRhLCA4OCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5pbnRlbnRfcDMgPSBuaWZ0aS5VdGlscy5nZXREb3VibGVBdChyYXdEYXRhLCA5NiwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgZm9yIChjdHIgPSAwOyBjdHIgPCA4OyBjdHIgKz0gMSkgewogICAgICAgICAgICBpbmRleCA9IDEwNCArIGN0ciAqIDg7CiAgICAgICAgICAgIHRoaXMucGl4RGltc1tjdHJdID0gbmlmdGkuVXRpbHMuZ2V0RG91YmxlQXQocmF3RGF0YSwgaW5kZXgsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMudm94X29mZnNldCA9IG5pZnRpLlV0aWxzLmdldExvbmdBdChyYXdEYXRhLCAxNjgsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMuc2NsX3Nsb3BlID0gbmlmdGkuVXRpbHMuZ2V0RG91YmxlQXQocmF3RGF0YSwgMTc2LCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICB0aGlzLnNjbF9pbnRlciA9IG5pZnRpLlV0aWxzLmdldERvdWJsZUF0KHJhd0RhdGEsIDE4NCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5jYWxfbWF4ID0gbmlmdGkuVXRpbHMuZ2V0RG91YmxlQXQocmF3RGF0YSwgMTkyLCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICB0aGlzLmNhbF9taW4gPSBuaWZ0aS5VdGlscy5nZXREb3VibGVBdChyYXdEYXRhLCAyMDAsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMuc2xpY2VfZHVyYXRpb24gPSBuaWZ0aS5VdGlscy5nZXREb3VibGVBdChyYXdEYXRhLCAyMDgsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMudG9mZnNldCA9IG5pZnRpLlV0aWxzLmdldERvdWJsZUF0KHJhd0RhdGEsIDIxNiwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5zbGljZV9zdGFydCA9IG5pZnRpLlV0aWxzLmdldExvbmdBdChyYXdEYXRhLCAyMjQsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMuc2xpY2VfZW5kID0gbmlmdGkuVXRpbHMuZ2V0TG9uZ0F0KHJhd0RhdGEsIDIzMiwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IG5pZnRpLlV0aWxzLmdldFN0cmluZ0F0KHJhd0RhdGEsIDI0MCwgMjQwICsgODApOwogICAgICAgICAgdGhpcy5hdXhfZmlsZSA9IG5pZnRpLlV0aWxzLmdldFN0cmluZ0F0KHJhd0RhdGEsIDMyMCwgMzIwICsgMjQpOwogICAgICAgICAgdGhpcy5xZm9ybV9jb2RlID0gbmlmdGkuVXRpbHMuZ2V0SW50QXQocmF3RGF0YSwgMzQ0LCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICB0aGlzLnNmb3JtX2NvZGUgPSBuaWZ0aS5VdGlscy5nZXRJbnRBdChyYXdEYXRhLCAzNDgsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMucXVhdGVybl9iID0gbmlmdGkuVXRpbHMuZ2V0RG91YmxlQXQocmF3RGF0YSwgMzUyLCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICB0aGlzLnF1YXRlcm5fYyA9IG5pZnRpLlV0aWxzLmdldERvdWJsZUF0KHJhd0RhdGEsIDM2MCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5xdWF0ZXJuX2QgPSBuaWZ0aS5VdGlscy5nZXREb3VibGVBdChyYXdEYXRhLCAzNjgsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMucW9mZnNldF94ID0gbmlmdGkuVXRpbHMuZ2V0RG91YmxlQXQocmF3RGF0YSwgMzc2LCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICB0aGlzLnFvZmZzZXRfeSA9IG5pZnRpLlV0aWxzLmdldERvdWJsZUF0KHJhd0RhdGEsIDM4NCwgdGhpcy5saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5xb2Zmc2V0X3ogPSBuaWZ0aS5VdGlscy5nZXREb3VibGVBdChyYXdEYXRhLCAzOTIsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIGZvciAoY3RyT3V0ID0gMDsgY3RyT3V0IDwgMzsgY3RyT3V0ICs9IDEpIHsKICAgICAgICAgICAgZm9yIChjdHJJbiA9IDA7IGN0ckluIDwgNDsgY3RySW4gKz0gMSkgewogICAgICAgICAgICAgIGluZGV4ID0gNDAwICsgKGN0ck91dCAqIDQgKyBjdHJJbikgKiA4OwogICAgICAgICAgICAgIHRoaXMuYWZmaW5lW2N0ck91dF1bY3RySW5dID0gbmlmdGkuVXRpbHMuZ2V0RG91YmxlQXQocmF3RGF0YSwgaW5kZXgsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGhpcy5hZmZpbmVbM11bMF0gPSAwOwogICAgICAgICAgdGhpcy5hZmZpbmVbM11bMV0gPSAwOwogICAgICAgICAgdGhpcy5hZmZpbmVbM11bMl0gPSAwOwogICAgICAgICAgdGhpcy5hZmZpbmVbM11bM10gPSAxOwogICAgICAgICAgdGhpcy5zbGljZV9jb2RlID0gbmlmdGkuVXRpbHMuZ2V0SW50QXQocmF3RGF0YSwgNDk2LCB0aGlzLmxpdHRsZUVuZGlhbik7CiAgICAgICAgICB0aGlzLnh5enRfdW5pdHMgPSBuaWZ0aS5VdGlscy5nZXRJbnRBdChyYXdEYXRhLCA1MDAsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMuaW50ZW50X2NvZGUgPSBuaWZ0aS5VdGlscy5nZXRJbnRBdChyYXdEYXRhLCA1MDQsIHRoaXMubGl0dGxlRW5kaWFuKTsKICAgICAgICAgIHRoaXMuaW50ZW50X25hbWUgPSBuaWZ0aS5VdGlscy5nZXRTdHJpbmdBdChyYXdEYXRhLCA1MDgsIDUwOCArIDE2KTsKICAgICAgICAgIHRoaXMuZGltX2luZm8gPSBuaWZ0aS5VdGlscy5nZXRCeXRlQXQocmF3RGF0YSwgNTI0KTsKICAgICAgICAgIGlmIChyYXdEYXRhLmJ5dGVMZW5ndGggPiBuaWZ0aS5OSUZUSTIuTUFHSUNfQ09PS0lFKSB7CiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uRmxhZ1swXSA9IG5pZnRpLlV0aWxzLmdldEJ5dGVBdChyYXdEYXRhLCA1NDApOwogICAgICAgICAgICB0aGlzLmV4dGVuc2lvbkZsYWdbMV0gPSBuaWZ0aS5VdGlscy5nZXRCeXRlQXQocmF3RGF0YSwgNTQwICsgMSk7CiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uRmxhZ1syXSA9IG5pZnRpLlV0aWxzLmdldEJ5dGVBdChyYXdEYXRhLCA1NDAgKyAyKTsKICAgICAgICAgICAgdGhpcy5leHRlbnNpb25GbGFnWzNdID0gbmlmdGkuVXRpbHMuZ2V0Qnl0ZUF0KHJhd0RhdGEsIDU0MCArIDMpOwogICAgICAgICAgICBpZiAodGhpcy5leHRlbnNpb25GbGFnWzBdKSB7CiAgICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TaXplID0gdGhpcy5nZXRFeHRlbnNpb25TaXplKHJhd0RhdGEpOwogICAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uQ29kZSA9IHRoaXMuZ2V0RXh0ZW5zaW9uQ29kZShyYXdEYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgbmlmdGkuTklGVEkyLnByb3RvdHlwZS50b0Zvcm1hdHRlZFN0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGZtdCA9IG5pZnRpLlV0aWxzLmZvcm1hdE51bWJlciwgc3RyaW5nID0gIiI7CiAgICAgICAgICBzdHJpbmcgKz0gIkRhdGF0eXBlID0gIiArICt0aGlzLmRhdGF0eXBlQ29kZSArICIgKCIgKyB0aGlzLmdldERhdGF0eXBlQ29kZVN0cmluZyh0aGlzLmRhdGF0eXBlQ29kZSkgKyAiKVxuIjsKICAgICAgICAgIHN0cmluZyArPSAiQml0cyBQZXIgVm94ZWwgPSAgPSAiICsgdGhpcy5udW1CaXRzUGVyVm94ZWwgKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJJbWFnZSBEaW1lbnNpb25zICgxLTgpOiAiICsgdGhpcy5kaW1zWzBdICsgIiwgIiArIHRoaXMuZGltc1sxXSArICIsICIgKyB0aGlzLmRpbXNbMl0gKyAiLCAiICsgdGhpcy5kaW1zWzNdICsgIiwgIiArIHRoaXMuZGltc1s0XSArICIsICIgKyB0aGlzLmRpbXNbNV0gKyAiLCAiICsgdGhpcy5kaW1zWzZdICsgIiwgIiArIHRoaXMuZGltc1s3XSArICJcbiI7CiAgICAgICAgICBzdHJpbmcgKz0gIkludGVudCBQYXJhbWV0ZXJzICgxLTMpOiAiICsgdGhpcy5pbnRlbnRfcDEgKyAiLCAiICsgdGhpcy5pbnRlbnRfcDIgKyAiLCAiICsgdGhpcy5pbnRlbnRfcDMgKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJWb3hlbCBEaW1lbnNpb25zICgxLTgpOiAiICsgZm10KHRoaXMucGl4RGltc1swXSkgKyAiLCAiICsgZm10KHRoaXMucGl4RGltc1sxXSkgKyAiLCAiICsgZm10KHRoaXMucGl4RGltc1syXSkgKyAiLCAiICsgZm10KHRoaXMucGl4RGltc1szXSkgKyAiLCAiICsgZm10KHRoaXMucGl4RGltc1s0XSkgKyAiLCAiICsgZm10KHRoaXMucGl4RGltc1s1XSkgKyAiLCAiICsgZm10KHRoaXMucGl4RGltc1s2XSkgKyAiLCAiICsgZm10KHRoaXMucGl4RGltc1s3XSkgKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJJbWFnZSBPZmZzZXQgPSAiICsgdGhpcy52b3hfb2Zmc2V0ICsgIlxuIjsKICAgICAgICAgIHN0cmluZyArPSAiRGF0YSBTY2FsZTogIFNsb3BlID0gIiArIGZtdCh0aGlzLnNjbF9zbG9wZSkgKyAiICBJbnRlcmNlcHQgPSAiICsgZm10KHRoaXMuc2NsX2ludGVyKSArICJcbiI7CiAgICAgICAgICBzdHJpbmcgKz0gIkRpc3BsYXkgUmFuZ2U6ICBNYXggPSAiICsgZm10KHRoaXMuY2FsX21heCkgKyAiICBNaW4gPSAiICsgZm10KHRoaXMuY2FsX21pbikgKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJTbGljZSBEdXJhdGlvbiA9ICIgKyB0aGlzLnNsaWNlX2R1cmF0aW9uICsgIlxuIjsKICAgICAgICAgIHN0cmluZyArPSAiVGltZSBBeGlzIFNoaWZ0ID0gIiArIHRoaXMudG9mZnNldCArICJcbiI7CiAgICAgICAgICBzdHJpbmcgKz0gIlNsaWNlIFN0YXJ0ID0gIiArIHRoaXMuc2xpY2Vfc3RhcnQgKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJTbGljZSBFbmQgPSAiICsgdGhpcy5zbGljZV9lbmQgKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICdEZXNjcmlwdGlvbjogIicgKyB0aGlzLmRlc2NyaXB0aW9uICsgJyJcbic7CiAgICAgICAgICBzdHJpbmcgKz0gJ0F1eGlsaWFyeSBGaWxlOiAiJyArIHRoaXMuYXV4X2ZpbGUgKyAnIlxuJzsKICAgICAgICAgIHN0cmluZyArPSAiUS1Gb3JtIENvZGUgPSAiICsgdGhpcy5xZm9ybV9jb2RlICsgIiAoIiArIHRoaXMuZ2V0VHJhbnNmb3JtQ29kZVN0cmluZyh0aGlzLnFmb3JtX2NvZGUpICsgIilcbiI7CiAgICAgICAgICBzdHJpbmcgKz0gIlMtRm9ybSBDb2RlID0gIiArIHRoaXMuc2Zvcm1fY29kZSArICIgKCIgKyB0aGlzLmdldFRyYW5zZm9ybUNvZGVTdHJpbmcodGhpcy5zZm9ybV9jb2RlKSArICIpXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJRdWF0ZXJuaW9uIFBhcmFtZXRlcnM6ICBiID0gIiArIGZtdCh0aGlzLnF1YXRlcm5fYikgKyAiICBjID0gIiArIGZtdCh0aGlzLnF1YXRlcm5fYykgKyAiICBkID0gIiArIGZtdCh0aGlzLnF1YXRlcm5fZCkgKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJRdWF0ZXJuaW9uIE9mZnNldHM6ICB4ID0gIiArIHRoaXMucW9mZnNldF94ICsgIiAgeSA9ICIgKyB0aGlzLnFvZmZzZXRfeSArICIgIHogPSAiICsgdGhpcy5xb2Zmc2V0X3ogKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJTLUZvcm0gUGFyYW1ldGVycyBYOiAiICsgZm10KHRoaXMuYWZmaW5lWzBdWzBdKSArICIsICIgKyBmbXQodGhpcy5hZmZpbmVbMF1bMV0pICsgIiwgIiArIGZtdCh0aGlzLmFmZmluZVswXVsyXSkgKyAiLCAiICsgZm10KHRoaXMuYWZmaW5lWzBdWzNdKSArICJcbiI7CiAgICAgICAgICBzdHJpbmcgKz0gIlMtRm9ybSBQYXJhbWV0ZXJzIFk6ICIgKyBmbXQodGhpcy5hZmZpbmVbMV1bMF0pICsgIiwgIiArIGZtdCh0aGlzLmFmZmluZVsxXVsxXSkgKyAiLCAiICsgZm10KHRoaXMuYWZmaW5lWzFdWzJdKSArICIsICIgKyBmbXQodGhpcy5hZmZpbmVbMV1bM10pICsgIlxuIjsKICAgICAgICAgIHN0cmluZyArPSAiUy1Gb3JtIFBhcmFtZXRlcnMgWjogIiArIGZtdCh0aGlzLmFmZmluZVsyXVswXSkgKyAiLCAiICsgZm10KHRoaXMuYWZmaW5lWzJdWzFdKSArICIsICIgKyBmbXQodGhpcy5hZmZpbmVbMl1bMl0pICsgIiwgIiArIGZtdCh0aGlzLmFmZmluZVsyXVszXSkgKyAiXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJTbGljZSBDb2RlID0gIiArIHRoaXMuc2xpY2VfY29kZSArICJcbiI7CiAgICAgICAgICBzdHJpbmcgKz0gIlVuaXRzIENvZGUgPSAiICsgdGhpcy54eXp0X3VuaXRzICsgIiAoIiArIHRoaXMuZ2V0VW5pdHNDb2RlU3RyaW5nKG5pZnRpLk5JRlRJMS5TUEFUSUFMX1VOSVRTX01BU0sgJiB0aGlzLnh5enRfdW5pdHMpICsgIiwgIiArIHRoaXMuZ2V0VW5pdHNDb2RlU3RyaW5nKG5pZnRpLk5JRlRJMS5URU1QT1JBTF9VTklUU19NQVNLICYgdGhpcy54eXp0X3VuaXRzKSArICIpXG4iOwogICAgICAgICAgc3RyaW5nICs9ICJJbnRlbnQgQ29kZSA9ICIgKyB0aGlzLmludGVudF9jb2RlICsgIlxuIjsKICAgICAgICAgIHN0cmluZyArPSAnSW50ZW50IE5hbWU6ICInICsgdGhpcy5pbnRlbnRfbmFtZSArICciXG4nOwogICAgICAgICAgc3RyaW5nICs9ICJEaW0gSW5mbyA9ICIgKyB0aGlzLmRpbV9pbmZvICsgIlxuIjsKICAgICAgICAgIHJldHVybiBzdHJpbmc7CiAgICAgICAgfTsKICAgICAgICBuaWZ0aS5OSUZUSTIucHJvdG90eXBlLmdldEV4dGVuc2lvbkxvY2F0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gbmlmdGkuTklGVEkyLk1BR0lDX0NPT0tJRSArIDQ7CiAgICAgICAgfTsKICAgICAgICBuaWZ0aS5OSUZUSTIucHJvdG90eXBlLmdldEV4dGVuc2lvblNpemUgPSBuaWZ0aS5OSUZUSTEucHJvdG90eXBlLmdldEV4dGVuc2lvblNpemU7CiAgICAgICAgbmlmdGkuTklGVEkyLnByb3RvdHlwZS5nZXRFeHRlbnNpb25Db2RlID0gbmlmdGkuTklGVEkxLnByb3RvdHlwZS5nZXRFeHRlbnNpb25Db2RlOwogICAgICAgIG5pZnRpLk5JRlRJMi5wcm90b3R5cGUuZ2V0RGF0YXR5cGVDb2RlU3RyaW5nID0gbmlmdGkuTklGVEkxLnByb3RvdHlwZS5nZXREYXRhdHlwZUNvZGVTdHJpbmc7CiAgICAgICAgbmlmdGkuTklGVEkyLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1Db2RlU3RyaW5nID0gbmlmdGkuTklGVEkxLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1Db2RlU3RyaW5nOwogICAgICAgIG5pZnRpLk5JRlRJMi5wcm90b3R5cGUuZ2V0VW5pdHNDb2RlU3RyaW5nID0gbmlmdGkuTklGVEkxLnByb3RvdHlwZS5nZXRVbml0c0NvZGVTdHJpbmc7CiAgICAgICAgbmlmdGkuTklGVEkyLnByb3RvdHlwZS5nZXRRZm9ybU1hdCA9IG5pZnRpLk5JRlRJMS5wcm90b3R5cGUuZ2V0UWZvcm1NYXQ7CiAgICAgICAgbmlmdGkuTklGVEkyLnByb3RvdHlwZS5jb252ZXJ0TmlmdGlRRm9ybVRvTmlmdGlTRm9ybSA9IG5pZnRpLk5JRlRJMS5wcm90b3R5cGUuY29udmVydE5pZnRpUUZvcm1Ub05pZnRpU0Zvcm07CiAgICAgICAgbmlmdGkuTklGVEkyLnByb3RvdHlwZS5jb252ZXJ0TmlmdGlTRm9ybVRvTkVNQSA9IG5pZnRpLk5JRlRJMS5wcm90b3R5cGUuY29udmVydE5pZnRpU0Zvcm1Ub05FTUE7CiAgICAgICAgbmlmdGkuTklGVEkyLnByb3RvdHlwZS5uaWZ0aV9tYXQzM19tdWwgPSBuaWZ0aS5OSUZUSTEucHJvdG90eXBlLm5pZnRpX21hdDMzX211bDsKICAgICAgICBuaWZ0aS5OSUZUSTIucHJvdG90eXBlLm5pZnRpX21hdDMzX2RldGVybSA9IG5pZnRpLk5JRlRJMS5wcm90b3R5cGUubmlmdGlfbWF0MzNfZGV0ZXJtOwogICAgICAgIHZhciBtb2R1bGVUeXBlID0gdHlwZW9mIG1vZHVsZTsKICAgICAgICBpZiAobW9kdWxlVHlwZSAhPT0gInVuZGVmaW5lZCIgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbmlmdGkuTklGVEkyOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvdHJlZXMuanMKICAgIHZhciByZXF1aXJlX3RyZWVzID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi90cmVlcy5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICAgdmFyIFpfRklYRUQgPSA0OwogICAgICAgIHZhciBaX0JJTkFSWSA9IDA7CiAgICAgICAgdmFyIFpfVEVYVCA9IDE7CiAgICAgICAgdmFyIFpfVU5LTk9XTiA9IDI7CiAgICAgICAgZnVuY3Rpb24gemVybzMoYnVmKSB7CiAgICAgICAgICBsZXQgbGVuNCA9IGJ1Zi5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoLS1sZW40ID49IDApIHsKICAgICAgICAgICAgYnVmW2xlbjRdID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIFNUT1JFRF9CTE9DSyA9IDA7CiAgICAgICAgdmFyIFNUQVRJQ19UUkVFUyA9IDE7CiAgICAgICAgdmFyIERZTl9UUkVFUyA9IDI7CiAgICAgICAgdmFyIE1JTl9NQVRDSCA9IDM7CiAgICAgICAgdmFyIE1BWF9NQVRDSCA9IDI1ODsKICAgICAgICB2YXIgTEVOR1RIX0NPREVTID0gMjk7CiAgICAgICAgdmFyIExJVEVSQUxTID0gMjU2OwogICAgICAgIHZhciBMX0NPREVTID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTOwogICAgICAgIHZhciBEX0NPREVTID0gMzA7CiAgICAgICAgdmFyIEJMX0NPREVTID0gMTk7CiAgICAgICAgdmFyIEhFQVBfU0laRSA9IDIgKiBMX0NPREVTICsgMTsKICAgICAgICB2YXIgTUFYX0JJVFMgPSAxNTsKICAgICAgICB2YXIgQnVmX3NpemUgPSAxNjsKICAgICAgICB2YXIgTUFYX0JMX0JJVFMgPSA3OwogICAgICAgIHZhciBFTkRfQkxPQ0sgPSAyNTY7CiAgICAgICAgdmFyIFJFUF8zXzYgPSAxNjsKICAgICAgICB2YXIgUkVQWl8zXzEwID0gMTc7CiAgICAgICAgdmFyIFJFUFpfMTFfMTM4ID0gMTg7CiAgICAgICAgdmFyIGV4dHJhX2xiaXRzID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDBdKTsKICAgICAgICB2YXIgZXh0cmFfZGJpdHMgPSBuZXcgVWludDhBcnJheShbMCwgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzXSk7CiAgICAgICAgdmFyIGV4dHJhX2JsYml0cyA9IG5ldyBVaW50OEFycmF5KFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAzLCA3XSk7CiAgICAgICAgdmFyIGJsX29yZGVyID0gbmV3IFVpbnQ4QXJyYXkoWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdKTsKICAgICAgICB2YXIgRElTVF9DT0RFX0xFTiA9IDUxMjsKICAgICAgICB2YXIgc3RhdGljX2x0cmVlID0gbmV3IEFycmF5KChMX0NPREVTICsgMikgKiAyKTsKICAgICAgICB6ZXJvMyhzdGF0aWNfbHRyZWUpOwogICAgICAgIHZhciBzdGF0aWNfZHRyZWUgPSBuZXcgQXJyYXkoRF9DT0RFUyAqIDIpOwogICAgICAgIHplcm8zKHN0YXRpY19kdHJlZSk7CiAgICAgICAgdmFyIF9kaXN0X2NvZGUgPSBuZXcgQXJyYXkoRElTVF9DT0RFX0xFTik7CiAgICAgICAgemVybzMoX2Rpc3RfY29kZSk7CiAgICAgICAgdmFyIF9sZW5ndGhfY29kZSA9IG5ldyBBcnJheShNQVhfTUFUQ0ggLSBNSU5fTUFUQ0ggKyAxKTsKICAgICAgICB6ZXJvMyhfbGVuZ3RoX2NvZGUpOwogICAgICAgIHZhciBiYXNlX2xlbmd0aCA9IG5ldyBBcnJheShMRU5HVEhfQ09ERVMpOwogICAgICAgIHplcm8zKGJhc2VfbGVuZ3RoKTsKICAgICAgICB2YXIgYmFzZV9kaXN0ID0gbmV3IEFycmF5KERfQ09ERVMpOwogICAgICAgIHplcm8zKGJhc2VfZGlzdCk7CiAgICAgICAgZnVuY3Rpb24gU3RhdGljVHJlZURlc2Moc3RhdGljX3RyZWUsIGV4dHJhX2JpdHMsIGV4dHJhX2Jhc2UsIGVsZW1zLCBtYXhfbGVuZ3RoKSB7CiAgICAgICAgICB0aGlzLnN0YXRpY190cmVlID0gc3RhdGljX3RyZWU7CiAgICAgICAgICB0aGlzLmV4dHJhX2JpdHMgPSBleHRyYV9iaXRzOwogICAgICAgICAgdGhpcy5leHRyYV9iYXNlID0gZXh0cmFfYmFzZTsKICAgICAgICAgIHRoaXMuZWxlbXMgPSBlbGVtczsKICAgICAgICAgIHRoaXMubWF4X2xlbmd0aCA9IG1heF9sZW5ndGg7CiAgICAgICAgICB0aGlzLmhhc19zdHJlZSA9IHN0YXRpY190cmVlICYmIHN0YXRpY190cmVlLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIHN0YXRpY19sX2Rlc2M7CiAgICAgICAgdmFyIHN0YXRpY19kX2Rlc2M7CiAgICAgICAgdmFyIHN0YXRpY19ibF9kZXNjOwogICAgICAgIGZ1bmN0aW9uIFRyZWVEZXNjKGR5bl90cmVlLCBzdGF0X2Rlc2MpIHsKICAgICAgICAgIHRoaXMuZHluX3RyZWUgPSBkeW5fdHJlZTsKICAgICAgICAgIHRoaXMubWF4X2NvZGUgPSAwOwogICAgICAgICAgdGhpcy5zdGF0X2Rlc2MgPSBzdGF0X2Rlc2M7CiAgICAgICAgfQogICAgICAgIHZhciBkX2NvZGUgPSAoZGlzdDMpID0+IHsKICAgICAgICAgIHJldHVybiBkaXN0MyA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdDNdIDogX2Rpc3RfY29kZVsyNTYgKyAoZGlzdDMgPj4+IDcpXTsKICAgICAgICB9OwogICAgICAgIHZhciBwdXRfc2hvcnQgPSAocywgdykgPT4gewogICAgICAgICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSB3ICYgMjU1OwogICAgICAgICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSB3ID4+PiA4ICYgMjU1OwogICAgICAgIH07CiAgICAgICAgdmFyIHNlbmRfYml0cyA9IChzLCB2YWx1ZSwgbGVuZ3RoNCkgPT4gewogICAgICAgICAgaWYgKHMuYmlfdmFsaWQgPiBCdWZfc2l6ZSAtIGxlbmd0aDQpIHsKICAgICAgICAgICAgcy5iaV9idWYgfD0gdmFsdWUgPDwgcy5iaV92YWxpZCAmIDY1NTM1OwogICAgICAgICAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpOwogICAgICAgICAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IEJ1Zl9zaXplIC0gcy5iaV92YWxpZDsKICAgICAgICAgICAgcy5iaV92YWxpZCArPSBsZW5ndGg0IC0gQnVmX3NpemU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzLmJpX2J1ZiB8PSB2YWx1ZSA8PCBzLmJpX3ZhbGlkICYgNjU1MzU7CiAgICAgICAgICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoNDsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHZhciBzZW5kX2NvZGUgPSAocywgYywgdHJlZSkgPT4gewogICAgICAgICAgc2VuZF9iaXRzKHMsIHRyZWVbYyAqIDJdLCB0cmVlW2MgKiAyICsgMV0pOwogICAgICAgIH07CiAgICAgICAgdmFyIGJpX3JldmVyc2UgPSAoY29kZSwgbGVuNCkgPT4gewogICAgICAgICAgbGV0IHJlcyA9IDA7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIHJlcyB8PSBjb2RlICYgMTsKICAgICAgICAgICAgY29kZSA+Pj49IDE7CiAgICAgICAgICAgIHJlcyA8PD0gMTsKICAgICAgICAgIH0gd2hpbGUgKC0tbGVuNCA+IDApOwogICAgICAgICAgcmV0dXJuIHJlcyA+Pj4gMTsKICAgICAgICB9OwogICAgICAgIHZhciBiaV9mbHVzaCA9IChzKSA9PiB7CiAgICAgICAgICBpZiAocy5iaV92YWxpZCA9PT0gMTYpIHsKICAgICAgICAgICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTsKICAgICAgICAgICAgcy5iaV9idWYgPSAwOwogICAgICAgICAgICBzLmJpX3ZhbGlkID0gMDsKICAgICAgICAgIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+PSA4KSB7CiAgICAgICAgICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWYgJiAyNTU7CiAgICAgICAgICAgIHMuYmlfYnVmID4+PSA4OwogICAgICAgICAgICBzLmJpX3ZhbGlkIC09IDg7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgZ2VuX2JpdGxlbiA9IChzLCBkZXNjKSA9PiB7CiAgICAgICAgICBjb25zdCB0cmVlID0gZGVzYy5keW5fdHJlZTsKICAgICAgICAgIGNvbnN0IG1heF9jb2RlID0gZGVzYy5tYXhfY29kZTsKICAgICAgICAgIGNvbnN0IHN0cmVlID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7CiAgICAgICAgICBjb25zdCBoYXNfc3RyZWUgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7CiAgICAgICAgICBjb25zdCBleHRyYSA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7CiAgICAgICAgICBjb25zdCBiYXNlID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYmFzZTsKICAgICAgICAgIGNvbnN0IG1heF9sZW5ndGggPSBkZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoOwogICAgICAgICAgbGV0IGg7CiAgICAgICAgICBsZXQgbiwgbTsKICAgICAgICAgIGxldCBiaXRzOwogICAgICAgICAgbGV0IHhiaXRzOwogICAgICAgICAgbGV0IGY7CiAgICAgICAgICBsZXQgb3ZlcmZsb3cgPSAwOwogICAgICAgICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7CiAgICAgICAgICAgIHMuYmxfY291bnRbYml0c10gPSAwOwogICAgICAgICAgfQogICAgICAgICAgdHJlZVtzLmhlYXBbcy5oZWFwX21heF0gKiAyICsgMV0gPSAwOwogICAgICAgICAgZm9yIChoID0gcy5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkU7IGgrKykgewogICAgICAgICAgICBuID0gcy5oZWFwW2hdOwogICAgICAgICAgICBiaXRzID0gdHJlZVt0cmVlW24gKiAyICsgMV0gKiAyICsgMV0gKyAxOwogICAgICAgICAgICBpZiAoYml0cyA+IG1heF9sZW5ndGgpIHsKICAgICAgICAgICAgICBiaXRzID0gbWF4X2xlbmd0aDsKICAgICAgICAgICAgICBvdmVyZmxvdysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyZWVbbiAqIDIgKyAxXSA9IGJpdHM7CiAgICAgICAgICAgIGlmIChuID4gbWF4X2NvZGUpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzLmJsX2NvdW50W2JpdHNdKys7CiAgICAgICAgICAgIHhiaXRzID0gMDsKICAgICAgICAgICAgaWYgKG4gPj0gYmFzZSkgewogICAgICAgICAgICAgIHhiaXRzID0gZXh0cmFbbiAtIGJhc2VdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGYgPSB0cmVlW24gKiAyXTsKICAgICAgICAgICAgcy5vcHRfbGVuICs9IGYgKiAoYml0cyArIHhiaXRzKTsKICAgICAgICAgICAgaWYgKGhhc19zdHJlZSkgewogICAgICAgICAgICAgIHMuc3RhdGljX2xlbiArPSBmICogKHN0cmVlW24gKiAyICsgMV0gKyB4Yml0cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChvdmVyZmxvdyA9PT0gMCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTsKICAgICAgICAgICAgd2hpbGUgKHMuYmxfY291bnRbYml0c10gPT09IDApIHsKICAgICAgICAgICAgICBiaXRzLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcy5ibF9jb3VudFtiaXRzXS0tOwogICAgICAgICAgICBzLmJsX2NvdW50W2JpdHMgKyAxXSArPSAyOwogICAgICAgICAgICBzLmJsX2NvdW50W21heF9sZW5ndGhdLS07CiAgICAgICAgICAgIG92ZXJmbG93IC09IDI7CiAgICAgICAgICB9IHdoaWxlIChvdmVyZmxvdyA+IDApOwogICAgICAgICAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPT0gMDsgYml0cy0tKSB7CiAgICAgICAgICAgIG4gPSBzLmJsX2NvdW50W2JpdHNdOwogICAgICAgICAgICB3aGlsZSAobiAhPT0gMCkgewogICAgICAgICAgICAgIG0gPSBzLmhlYXBbLS1oXTsKICAgICAgICAgICAgICBpZiAobSA+IG1heF9jb2RlKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHRyZWVbbSAqIDIgKyAxXSAhPT0gYml0cykgewogICAgICAgICAgICAgICAgcy5vcHRfbGVuICs9IChiaXRzIC0gdHJlZVttICogMiArIDFdKSAqIHRyZWVbbSAqIDJdOwogICAgICAgICAgICAgICAgdHJlZVttICogMiArIDFdID0gYml0czsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbi0tOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgZ2VuX2NvZGVzID0gKHRyZWUsIG1heF9jb2RlLCBibF9jb3VudCkgPT4gewogICAgICAgICAgY29uc3QgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7CiAgICAgICAgICBsZXQgY29kZSA9IDA7CiAgICAgICAgICBsZXQgYml0czsKICAgICAgICAgIGxldCBuOwogICAgICAgICAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7CiAgICAgICAgICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSBjb2RlICsgYmxfY291bnRbYml0cyAtIDFdIDw8IDE7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKICAgICAgICAgICAgbGV0IGxlbjQgPSB0cmVlW24gKiAyICsgMV07CiAgICAgICAgICAgIGlmIChsZW40ID09PSAwKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJlZVtuICogMl0gPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW40XSsrLCBsZW40KTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHZhciB0cl9zdGF0aWNfaW5pdCA9ICgpID0+IHsKICAgICAgICAgIGxldCBuOwogICAgICAgICAgbGV0IGJpdHM7CiAgICAgICAgICBsZXQgbGVuZ3RoNDsKICAgICAgICAgIGxldCBjb2RlOwogICAgICAgICAgbGV0IGRpc3QzOwogICAgICAgICAgY29uc3QgYmxfY291bnQgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTsKICAgICAgICAgIGxlbmd0aDQgPSAwOwogICAgICAgICAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUyAtIDE7IGNvZGUrKykgewogICAgICAgICAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDQ7CiAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCAxIDw8IGV4dHJhX2xiaXRzW2NvZGVdOyBuKyspIHsKICAgICAgICAgICAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoNCsrXSA9IGNvZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGg0IC0gMV0gPSBjb2RlOwogICAgICAgICAgZGlzdDMgPSAwOwogICAgICAgICAgZm9yIChjb2RlID0gMDsgY29kZSA8IDE2OyBjb2RlKyspIHsKICAgICAgICAgICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDM7CiAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCAxIDw8IGV4dHJhX2RiaXRzW2NvZGVdOyBuKyspIHsKICAgICAgICAgICAgICBfZGlzdF9jb2RlW2Rpc3QzKytdID0gY29kZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZGlzdDMgPj49IDc7CiAgICAgICAgICBmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykgewogICAgICAgICAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0MyA8PCA3OwogICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMSA8PCBleHRyYV9kYml0c1tjb2RlXSAtIDc7IG4rKykgewogICAgICAgICAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdDMrK10gPSBjb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHsKICAgICAgICAgICAgYmxfY291bnRbYml0c10gPSAwOwogICAgICAgICAgfQogICAgICAgICAgbiA9IDA7CiAgICAgICAgICB3aGlsZSAobiA8PSAxNDMpIHsKICAgICAgICAgICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gPSA4OwogICAgICAgICAgICBuKys7CiAgICAgICAgICAgIGJsX2NvdW50WzhdKys7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAobiA8PSAyNTUpIHsKICAgICAgICAgICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gPSA5OwogICAgICAgICAgICBuKys7CiAgICAgICAgICAgIGJsX2NvdW50WzldKys7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAobiA8PSAyNzkpIHsKICAgICAgICAgICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gPSA3OwogICAgICAgICAgICBuKys7CiAgICAgICAgICAgIGJsX2NvdW50WzddKys7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAobiA8PSAyODcpIHsKICAgICAgICAgICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gPSA4OwogICAgICAgICAgICBuKys7CiAgICAgICAgICAgIGJsX2NvdW50WzhdKys7CiAgICAgICAgICB9CiAgICAgICAgICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSwgYmxfY291bnQpOwogICAgICAgICAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7IG4rKykgewogICAgICAgICAgICBzdGF0aWNfZHRyZWVbbiAqIDIgKyAxXSA9IDU7CiAgICAgICAgICAgIHN0YXRpY19kdHJlZVtuICogMl0gPSBiaV9yZXZlcnNlKG4sIDUpOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGljX2xfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUyArIDEsIExfQ09ERVMsIE1BWF9CSVRTKTsKICAgICAgICAgIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgRF9DT0RFUywgTUFYX0JJVFMpOwogICAgICAgICAgc3RhdGljX2JsX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2MobmV3IEFycmF5KDApLCBleHRyYV9ibGJpdHMsIDAsIEJMX0NPREVTLCBNQVhfQkxfQklUUyk7CiAgICAgICAgfTsKICAgICAgICB2YXIgaW5pdF9ibG9jayA9IChzKSA9PiB7CiAgICAgICAgICBsZXQgbjsKICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyBuKyspIHsKICAgICAgICAgICAgcy5keW5fbHRyZWVbbiAqIDJdID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHsKICAgICAgICAgICAgcy5keW5fZHRyZWVbbiAqIDJdID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKSB7CiAgICAgICAgICAgIHMuYmxfdHJlZVtuICogMl0gPSAwOwogICAgICAgICAgfQogICAgICAgICAgcy5keW5fbHRyZWVbRU5EX0JMT0NLICogMl0gPSAxOwogICAgICAgICAgcy5vcHRfbGVuID0gcy5zdGF0aWNfbGVuID0gMDsKICAgICAgICAgIHMubGFzdF9saXQgPSBzLm1hdGNoZXMgPSAwOwogICAgICAgIH07CiAgICAgICAgdmFyIGJpX3dpbmR1cCA9IChzKSA9PiB7CiAgICAgICAgICBpZiAocy5iaV92YWxpZCA+IDgpIHsKICAgICAgICAgICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTsKICAgICAgICAgIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+IDApIHsKICAgICAgICAgICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZjsKICAgICAgICAgIH0KICAgICAgICAgIHMuYmlfYnVmID0gMDsKICAgICAgICAgIHMuYmlfdmFsaWQgPSAwOwogICAgICAgIH07CiAgICAgICAgdmFyIGNvcHlfYmxvY2sgPSAocywgYnVmLCBsZW40LCBoZWFkZXIpID0+IHsKICAgICAgICAgIGJpX3dpbmR1cChzKTsKICAgICAgICAgIGlmIChoZWFkZXIpIHsKICAgICAgICAgICAgcHV0X3Nob3J0KHMsIGxlbjQpOwogICAgICAgICAgICBwdXRfc2hvcnQocywgfmxlbjQpOwogICAgICAgICAgfQogICAgICAgICAgcy5wZW5kaW5nX2J1Zi5zZXQocy53aW5kb3cuc3ViYXJyYXkoYnVmLCBidWYgKyBsZW40KSwgcy5wZW5kaW5nKTsKICAgICAgICAgIHMucGVuZGluZyArPSBsZW40OwogICAgICAgIH07CiAgICAgICAgdmFyIHNtYWxsZXIgPSAodHJlZSwgbiwgbSwgZGVwdGgpID0+IHsKICAgICAgICAgIGNvbnN0IF9uMiA9IG4gKiAyOwogICAgICAgICAgY29uc3QgX20yID0gbSAqIDI7CiAgICAgICAgICByZXR1cm4gdHJlZVtfbjJdIDwgdHJlZVtfbTJdIHx8IHRyZWVbX24yXSA9PT0gdHJlZVtfbTJdICYmIGRlcHRoW25dIDw9IGRlcHRoW21dOwogICAgICAgIH07CiAgICAgICAgdmFyIHBxZG93bmhlYXAgPSAocywgdHJlZSwgaykgPT4gewogICAgICAgICAgY29uc3QgdiA9IHMuaGVhcFtrXTsKICAgICAgICAgIGxldCBqID0gayA8PCAxOwogICAgICAgICAgd2hpbGUgKGogPD0gcy5oZWFwX2xlbikgewogICAgICAgICAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiYgc21hbGxlcih0cmVlLCBzLmhlYXBbaiArIDFdLCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7CiAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzLmhlYXBba10gPSBzLmhlYXBbal07CiAgICAgICAgICAgIGsgPSBqOwogICAgICAgICAgICBqIDw8PSAxOwogICAgICAgICAgfQogICAgICAgICAgcy5oZWFwW2tdID0gdjsKICAgICAgICB9OwogICAgICAgIHZhciBjb21wcmVzc19ibG9jayA9IChzLCBsdHJlZSwgZHRyZWUpID0+IHsKICAgICAgICAgIGxldCBkaXN0MzsKICAgICAgICAgIGxldCBsYzsKICAgICAgICAgIGxldCBseCA9IDA7CiAgICAgICAgICBsZXQgY29kZTsKICAgICAgICAgIGxldCBleHRyYTsKICAgICAgICAgIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICBkaXN0MyA9IHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMl0gPDwgOCB8IHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMiArIDFdOwogICAgICAgICAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdOwogICAgICAgICAgICAgIGx4Kys7CiAgICAgICAgICAgICAgaWYgKGRpc3QzID09PSAwKSB7CiAgICAgICAgICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107CiAgICAgICAgICAgICAgICBzZW5kX2NvZGUocywgY29kZSArIExJVEVSQUxTICsgMSwgbHRyZWUpOwogICAgICAgICAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTsKICAgICAgICAgICAgICAgIGlmIChleHRyYSAhPT0gMCkgewogICAgICAgICAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTsKICAgICAgICAgICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkaXN0My0tOwogICAgICAgICAgICAgICAgY29kZSA9IGRfY29kZShkaXN0Myk7CiAgICAgICAgICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOwogICAgICAgICAgICAgICAgZXh0cmEgPSBleHRyYV9kYml0c1tjb2RlXTsKICAgICAgICAgICAgICAgIGlmIChleHRyYSAhPT0gMCkgewogICAgICAgICAgICAgICAgICBkaXN0MyAtPSBiYXNlX2Rpc3RbY29kZV07CiAgICAgICAgICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0MywgZXh0cmEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTsKICAgICAgICAgIH0KICAgICAgICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTsKICAgICAgICB9OwogICAgICAgIHZhciBidWlsZF90cmVlID0gKHMsIGRlc2MpID0+IHsKICAgICAgICAgIGNvbnN0IHRyZWUgPSBkZXNjLmR5bl90cmVlOwogICAgICAgICAgY29uc3Qgc3RyZWUgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTsKICAgICAgICAgIGNvbnN0IGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTsKICAgICAgICAgIGNvbnN0IGVsZW1zID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7CiAgICAgICAgICBsZXQgbiwgbTsKICAgICAgICAgIGxldCBtYXhfY29kZSA9IC0xOwogICAgICAgICAgbGV0IG5vZGU7CiAgICAgICAgICBzLmhlYXBfbGVuID0gMDsKICAgICAgICAgIHMuaGVhcF9tYXggPSBIRUFQX1NJWkU7CiAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgZWxlbXM7IG4rKykgewogICAgICAgICAgICBpZiAodHJlZVtuICogMl0gIT09IDApIHsKICAgICAgICAgICAgICBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IG1heF9jb2RlID0gbjsKICAgICAgICAgICAgICBzLmRlcHRoW25dID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0cmVlW24gKiAyICsgMV0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAocy5oZWFwX2xlbiA8IDIpIHsKICAgICAgICAgICAgbm9kZSA9IHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPCAyID8gKyttYXhfY29kZSA6IDA7CiAgICAgICAgICAgIHRyZWVbbm9kZSAqIDJdID0gMTsKICAgICAgICAgICAgcy5kZXB0aFtub2RlXSA9IDA7CiAgICAgICAgICAgIHMub3B0X2xlbi0tOwogICAgICAgICAgICBpZiAoaGFzX3N0cmVlKSB7CiAgICAgICAgICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGRlc2MubWF4X2NvZGUgPSBtYXhfY29kZTsKICAgICAgICAgIGZvciAobiA9IHMuaGVhcF9sZW4gPj4gMTsgbiA+PSAxOyBuLS0pIHsKICAgICAgICAgICAgcHFkb3duaGVhcChzLCB0cmVlLCBuKTsKICAgICAgICAgIH0KICAgICAgICAgIG5vZGUgPSBlbGVtczsKICAgICAgICAgIGRvIHsKICAgICAgICAgICAgbiA9IHMuaGVhcFsxXTsKICAgICAgICAgICAgcy5oZWFwWzFdID0gcy5oZWFwW3MuaGVhcF9sZW4tLV07CiAgICAgICAgICAgIHBxZG93bmhlYXAocywgdHJlZSwgMSk7CiAgICAgICAgICAgIG0gPSBzLmhlYXBbMV07CiAgICAgICAgICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbjsKICAgICAgICAgICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBtOwogICAgICAgICAgICB0cmVlW25vZGUgKiAyXSA9IHRyZWVbbiAqIDJdICsgdHJlZVttICogMl07CiAgICAgICAgICAgIHMuZGVwdGhbbm9kZV0gPSAocy5kZXB0aFtuXSA+PSBzLmRlcHRoW21dID8gcy5kZXB0aFtuXSA6IHMuZGVwdGhbbV0pICsgMTsKICAgICAgICAgICAgdHJlZVtuICogMiArIDFdID0gdHJlZVttICogMiArIDFdID0gbm9kZTsKICAgICAgICAgICAgcy5oZWFwWzFdID0gbm9kZSsrOwogICAgICAgICAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEpOwogICAgICAgICAgfSB3aGlsZSAocy5oZWFwX2xlbiA+PSAyKTsKICAgICAgICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzFdOwogICAgICAgICAgZ2VuX2JpdGxlbihzLCBkZXNjKTsKICAgICAgICAgIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgcy5ibF9jb3VudCk7CiAgICAgICAgfTsKICAgICAgICB2YXIgc2Nhbl90cmVlID0gKHMsIHRyZWUsIG1heF9jb2RlKSA9PiB7CiAgICAgICAgICBsZXQgbjsKICAgICAgICAgIGxldCBwcmV2bGVuID0gLTE7CiAgICAgICAgICBsZXQgY3VybGVuOwogICAgICAgICAgbGV0IG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV07CiAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgbGV0IG1heF9jb3VudCA9IDc7CiAgICAgICAgICBsZXQgbWluX2NvdW50ID0gNDsKICAgICAgICAgIGlmIChuZXh0bGVuID09PSAwKSB7CiAgICAgICAgICAgIG1heF9jb3VudCA9IDEzODsKICAgICAgICAgICAgbWluX2NvdW50ID0gMzsKICAgICAgICAgIH0KICAgICAgICAgIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0gPSA2NTUzNTsKICAgICAgICAgIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykgewogICAgICAgICAgICBjdXJsZW4gPSBuZXh0bGVuOwogICAgICAgICAgICBuZXh0bGVuID0gdHJlZVsobiArIDEpICogMiArIDFdOwogICAgICAgICAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT09IG5leHRsZW4pIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgewogICAgICAgICAgICAgIHMuYmxfdHJlZVtjdXJsZW4gKiAyXSArPSBjb3VudDsKICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHsKICAgICAgICAgICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7CiAgICAgICAgICAgICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0rKzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcy5ibF90cmVlW1JFUF8zXzYgKiAyXSsrOwogICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7CiAgICAgICAgICAgICAgcy5ibF90cmVlW1JFUFpfM18xMCAqIDJdKys7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcy5ibF90cmVlW1JFUFpfMTFfMTM4ICogMl0rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3VudCA9IDA7CiAgICAgICAgICAgIHByZXZsZW4gPSBjdXJsZW47CiAgICAgICAgICAgIGlmIChuZXh0bGVuID09PSAwKSB7CiAgICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4OwogICAgICAgICAgICAgIG1pbl9jb3VudCA9IDM7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7CiAgICAgICAgICAgICAgbWF4X2NvdW50ID0gNjsKICAgICAgICAgICAgICBtaW5fY291bnQgPSAzOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG1heF9jb3VudCA9IDc7CiAgICAgICAgICAgICAgbWluX2NvdW50ID0gNDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIHNlbmRfdHJlZSA9IChzLCB0cmVlLCBtYXhfY29kZSkgPT4gewogICAgICAgICAgbGV0IG47CiAgICAgICAgICBsZXQgcHJldmxlbiA9IC0xOwogICAgICAgICAgbGV0IGN1cmxlbjsKICAgICAgICAgIGxldCBuZXh0bGVuID0gdHJlZVswICogMiArIDFdOwogICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgIGxldCBtYXhfY291bnQgPSA3OwogICAgICAgICAgbGV0IG1pbl9jb3VudCA9IDQ7CiAgICAgICAgICBpZiAobmV4dGxlbiA9PT0gMCkgewogICAgICAgICAgICBtYXhfY291bnQgPSAxMzg7CiAgICAgICAgICAgIG1pbl9jb3VudCA9IDM7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKICAgICAgICAgICAgY3VybGVuID0gbmV4dGxlbjsKICAgICAgICAgICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXTsKICAgICAgICAgICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHsKICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpOwogICAgICAgICAgICAgIH0gd2hpbGUgKC0tY291bnQgIT09IDApOwogICAgICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkgewogICAgICAgICAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHsKICAgICAgICAgICAgICAgIHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7CiAgICAgICAgICAgICAgICBjb3VudC0tOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzZW5kX2NvZGUocywgUkVQXzNfNiwgcy5ibF90cmVlKTsKICAgICAgICAgICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAyKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkgewogICAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMuYmxfdHJlZSk7CiAgICAgICAgICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLmJsX3RyZWUpOwogICAgICAgICAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDExLCA3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3VudCA9IDA7CiAgICAgICAgICAgIHByZXZsZW4gPSBjdXJsZW47CiAgICAgICAgICAgIGlmIChuZXh0bGVuID09PSAwKSB7CiAgICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4OwogICAgICAgICAgICAgIG1pbl9jb3VudCA9IDM7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7CiAgICAgICAgICAgICAgbWF4X2NvdW50ID0gNjsKICAgICAgICAgICAgICBtaW5fY291bnQgPSAzOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG1heF9jb3VudCA9IDc7CiAgICAgICAgICAgICAgbWluX2NvdW50ID0gNDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIGJ1aWxkX2JsX3RyZWUgPSAocykgPT4gewogICAgICAgICAgbGV0IG1heF9ibGluZGV4OwogICAgICAgICAgc2Nhbl90cmVlKHMsIHMuZHluX2x0cmVlLCBzLmxfZGVzYy5tYXhfY29kZSk7CiAgICAgICAgICBzY2FuX3RyZWUocywgcy5keW5fZHRyZWUsIHMuZF9kZXNjLm1heF9jb2RlKTsKICAgICAgICAgIGJ1aWxkX3RyZWUocywgcy5ibF9kZXNjKTsKICAgICAgICAgIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUyAtIDE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHsKICAgICAgICAgICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0gKiAyICsgMV0gIT09IDApIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcy5vcHRfbGVuICs9IDMgKiAobWF4X2JsaW5kZXggKyAxKSArIDUgKyA1ICsgNDsKICAgICAgICAgIHJldHVybiBtYXhfYmxpbmRleDsKICAgICAgICB9OwogICAgICAgIHZhciBzZW5kX2FsbF90cmVlcyA9IChzLCBsY29kZXMsIGRjb2RlcywgYmxjb2RlcykgPT4gewogICAgICAgICAgbGV0IHJhbms7CiAgICAgICAgICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsKICAgICAgICAgIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCA1KTsKICAgICAgICAgIHNlbmRfYml0cyhzLCBibGNvZGVzIC0gNCwgNCk7CiAgICAgICAgICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7CiAgICAgICAgICAgIHNlbmRfYml0cyhzLCBzLmJsX3RyZWVbYmxfb3JkZXJbcmFua10gKiAyICsgMV0sIDMpOwogICAgICAgICAgfQogICAgICAgICAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsKICAgICAgICAgIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7CiAgICAgICAgfTsKICAgICAgICB2YXIgZGV0ZWN0X2RhdGFfdHlwZSA9IChzKSA9PiB7CiAgICAgICAgICBsZXQgYmxhY2tfbWFzayA9IDQwOTM2MjQ0NDc7CiAgICAgICAgICBsZXQgbjsKICAgICAgICAgIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj49IDEpIHsKICAgICAgICAgICAgaWYgKGJsYWNrX21hc2sgJiAxICYmIHMuZHluX2x0cmVlW24gKiAyXSAhPT0gMCkgewogICAgICAgICAgICAgIHJldHVybiBaX0JJTkFSWTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXSAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdICE9PSAwIHx8IHMuZHluX2x0cmVlWzEzICogMl0gIT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIFpfVEVYVDsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAobiA9IDMyOyBuIDwgTElURVJBTFM7IG4rKykgewogICAgICAgICAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdICE9PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIFpfVEVYVDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFpfQklOQVJZOwogICAgICAgIH07CiAgICAgICAgdmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTsKICAgICAgICB2YXIgX3RyX2luaXQgPSAocykgPT4gewogICAgICAgICAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7CiAgICAgICAgICAgIHRyX3N0YXRpY19pbml0KCk7CiAgICAgICAgICAgIHN0YXRpY19pbml0X2RvbmUgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcy5sX2Rlc2MgPSBuZXcgVHJlZURlc2Mocy5keW5fbHRyZWUsIHN0YXRpY19sX2Rlc2MpOwogICAgICAgICAgcy5kX2Rlc2MgPSBuZXcgVHJlZURlc2Mocy5keW5fZHRyZWUsIHN0YXRpY19kX2Rlc2MpOwogICAgICAgICAgcy5ibF9kZXNjID0gbmV3IFRyZWVEZXNjKHMuYmxfdHJlZSwgc3RhdGljX2JsX2Rlc2MpOwogICAgICAgICAgcy5iaV9idWYgPSAwOwogICAgICAgICAgcy5iaV92YWxpZCA9IDA7CiAgICAgICAgICBpbml0X2Jsb2NrKHMpOwogICAgICAgIH07CiAgICAgICAgdmFyIF90cl9zdG9yZWRfYmxvY2sgPSAocywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KSA9PiB7CiAgICAgICAgICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsKICAgICAgICAgIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsKICAgICAgICB9OwogICAgICAgIHZhciBfdHJfYWxpZ24gPSAocykgPT4gewogICAgICAgICAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTsKICAgICAgICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIHN0YXRpY19sdHJlZSk7CiAgICAgICAgICBiaV9mbHVzaChzKTsKICAgICAgICB9OwogICAgICAgIHZhciBfdHJfZmx1c2hfYmxvY2sgPSAocywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KSA9PiB7CiAgICAgICAgICBsZXQgb3B0X2xlbmIsIHN0YXRpY19sZW5iOwogICAgICAgICAgbGV0IG1heF9ibGluZGV4ID0gMDsKICAgICAgICAgIGlmIChzLmxldmVsID4gMCkgewogICAgICAgICAgICBpZiAocy5zdHJtLmRhdGFfdHlwZSA9PT0gWl9VTktOT1dOKSB7CiAgICAgICAgICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnVpbGRfdHJlZShzLCBzLmxfZGVzYyk7CiAgICAgICAgICAgIGJ1aWxkX3RyZWUocywgcy5kX2Rlc2MpOwogICAgICAgICAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7CiAgICAgICAgICAgIG9wdF9sZW5iID0gcy5vcHRfbGVuICsgMyArIDcgPj4+IDM7CiAgICAgICAgICAgIHN0YXRpY19sZW5iID0gcy5zdGF0aWNfbGVuICsgMyArIDcgPj4+IDM7CiAgICAgICAgICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgewogICAgICAgICAgICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdG9yZWRfbGVuICsgNCA8PSBvcHRfbGVuYiAmJiBidWYgIT09IC0xKSB7CiAgICAgICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTsKICAgICAgICAgIH0gZWxzZSBpZiAocy5zdHJhdGVneSA9PT0gWl9GSVhFRCB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHsKICAgICAgICAgICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVMgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7CiAgICAgICAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIHN0YXRpY19sdHJlZSwgc3RhdGljX2R0cmVlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpOwogICAgICAgICAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTsKICAgICAgICAgICAgY29tcHJlc3NfYmxvY2socywgcy5keW5fbHRyZWUsIHMuZHluX2R0cmVlKTsKICAgICAgICAgIH0KICAgICAgICAgIGluaXRfYmxvY2socyk7CiAgICAgICAgICBpZiAobGFzdCkgewogICAgICAgICAgICBiaV93aW5kdXAocyk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgX3RyX3RhbGx5ID0gKHMsIGRpc3QzLCBsYykgPT4gewogICAgICAgICAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDJdID0gZGlzdDMgPj4+IDggJiAyNTU7CiAgICAgICAgICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMiArIDFdID0gZGlzdDMgJiAyNTU7CiAgICAgICAgICBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBzLmxhc3RfbGl0XSA9IGxjICYgMjU1OwogICAgICAgICAgcy5sYXN0X2xpdCsrOwogICAgICAgICAgaWYgKGRpc3QzID09PSAwKSB7CiAgICAgICAgICAgIHMuZHluX2x0cmVlW2xjICogMl0rKzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHMubWF0Y2hlcysrOwogICAgICAgICAgICBkaXN0My0tOwogICAgICAgICAgICBzLmR5bl9sdHJlZVsoX2xlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTICsgMSkgKiAyXSsrOwogICAgICAgICAgICBzLmR5bl9kdHJlZVtkX2NvZGUoZGlzdDMpICogMl0rKzsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBzLmxhc3RfbGl0ID09PSBzLmxpdF9idWZzaXplIC0gMTsKICAgICAgICB9OwogICAgICAgIG1vZHVsZS5leHBvcnRzLl90cl9pbml0ID0gX3RyX2luaXQ7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuX3RyX2ZsdXNoX2Jsb2NrID0gX3RyX2ZsdXNoX2Jsb2NrOwogICAgICAgIG1vZHVsZS5leHBvcnRzLl90cl90YWxseSA9IF90cl90YWxseTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5fdHJfYWxpZ24gPSBfdHJfYWxpZ247CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIG5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMKICAgIHZhciByZXF1aXJlX2FkbGVyMzIgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIHZhciBhZGxlcjMyID0gKGFkbGVyLCBidWYsIGxlbjQsIHBvcykgPT4gewogICAgICAgICAgbGV0IHMxID0gYWRsZXIgJiA2NTUzNSB8IDAsIHMyID0gYWRsZXIgPj4+IDE2ICYgNjU1MzUgfCAwLCBuID0gMDsKICAgICAgICAgIHdoaWxlIChsZW40ICE9PSAwKSB7CiAgICAgICAgICAgIG4gPSBsZW40ID4gMmUzID8gMmUzIDogbGVuNDsKICAgICAgICAgICAgbGVuNCAtPSBuOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgczEgPSBzMSArIGJ1Zltwb3MrK10gfCAwOwogICAgICAgICAgICAgIHMyID0gczIgKyBzMSB8IDA7CiAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7CiAgICAgICAgICAgIHMxICU9IDY1NTIxOwogICAgICAgICAgICBzMiAlPSA2NTUyMTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBzMSB8IHMyIDw8IDE2IHwgMDsKICAgICAgICB9OwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gYWRsZXIzMjsKICAgICAgfQogICAgfSk7CgogICAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMKICAgIHZhciByZXF1aXJlX2NyYzMyID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jcmMzMi5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICAgdmFyIG1ha2VUYWJsZSA9ICgpID0+IHsKICAgICAgICAgIGxldCBjLCB0YWJsZSA9IFtdOwogICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCAyNTY7IG4rKykgewogICAgICAgICAgICBjID0gbjsKICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCA4OyBrKyspIHsKICAgICAgICAgICAgICBjID0gYyAmIDEgPyAzOTg4MjkyMzg0IF4gYyA+Pj4gMSA6IGMgPj4+IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFibGVbbl0gPSBjOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRhYmxlOwogICAgICAgIH07CiAgICAgICAgdmFyIGNyY1RhYmxlID0gbmV3IFVpbnQzMkFycmF5KG1ha2VUYWJsZSgpKTsKICAgICAgICB2YXIgY3JjMzIgPSAoY3JjLCBidWYsIGxlbjQsIHBvcykgPT4gewogICAgICAgICAgY29uc3QgdCA9IGNyY1RhYmxlOwogICAgICAgICAgY29uc3QgZW5kID0gcG9zICsgbGVuNDsKICAgICAgICAgIGNyYyBePSAtMTsKICAgICAgICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykgewogICAgICAgICAgICBjcmMgPSBjcmMgPj4+IDggXiB0WyhjcmMgXiBidWZbaV0pICYgMjU1XTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjcmMgXiAtMTsKICAgICAgICB9OwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gY3JjMzI7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIG5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL21lc3NhZ2VzLmpzCiAgICB2YXIgcmVxdWlyZV9tZXNzYWdlcyA9IF9fY29tbW9uSlMoewogICAgICAibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIG1vZHVsZS5leHBvcnRzID0gewogICAgICAgICAgMjogIm5lZWQgZGljdGlvbmFyeSIsCiAgICAgICAgICAxOiAic3RyZWFtIGVuZCIsCiAgICAgICAgICAwOiAiIiwKICAgICAgICAgICItMSI6ICJmaWxlIGVycm9yIiwKICAgICAgICAgICItMiI6ICJzdHJlYW0gZXJyb3IiLAogICAgICAgICAgIi0zIjogImRhdGEgZXJyb3IiLAogICAgICAgICAgIi00IjogImluc3VmZmljaWVudCBtZW1vcnkiLAogICAgICAgICAgIi01IjogImJ1ZmZlciBlcnJvciIsCiAgICAgICAgICAiLTYiOiAiaW5jb21wYXRpYmxlIHZlcnNpb24iCiAgICAgICAgfTsKICAgICAgfQogICAgfSk7CgogICAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzCiAgICB2YXIgcmVxdWlyZV9jb25zdGFudHMgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2NvbnN0YW50cy5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7CiAgICAgICAgICBaX05PX0ZMVVNIOiAwLAogICAgICAgICAgWl9QQVJUSUFMX0ZMVVNIOiAxLAogICAgICAgICAgWl9TWU5DX0ZMVVNIOiAyLAogICAgICAgICAgWl9GVUxMX0ZMVVNIOiAzLAogICAgICAgICAgWl9GSU5JU0g6IDQsCiAgICAgICAgICBaX0JMT0NLOiA1LAogICAgICAgICAgWl9UUkVFUzogNiwKICAgICAgICAgIFpfT0s6IDAsCiAgICAgICAgICBaX1NUUkVBTV9FTkQ6IDEsCiAgICAgICAgICBaX05FRURfRElDVDogMiwKICAgICAgICAgIFpfRVJSTk86IC0xLAogICAgICAgICAgWl9TVFJFQU1fRVJST1I6IC0yLAogICAgICAgICAgWl9EQVRBX0VSUk9SOiAtMywKICAgICAgICAgIFpfTUVNX0VSUk9SOiAtNCwKICAgICAgICAgIFpfQlVGX0VSUk9SOiAtNSwKICAgICAgICAgIFpfTk9fQ09NUFJFU1NJT046IDAsCiAgICAgICAgICBaX0JFU1RfU1BFRUQ6IDEsCiAgICAgICAgICBaX0JFU1RfQ09NUFJFU1NJT046IDksCiAgICAgICAgICBaX0RFRkFVTFRfQ09NUFJFU1NJT046IC0xLAogICAgICAgICAgWl9GSUxURVJFRDogMSwKICAgICAgICAgIFpfSFVGRk1BTl9PTkxZOiAyLAogICAgICAgICAgWl9STEU6IDMsCiAgICAgICAgICBaX0ZJWEVEOiA0LAogICAgICAgICAgWl9ERUZBVUxUX1NUUkFURUdZOiAwLAogICAgICAgICAgWl9CSU5BUlk6IDAsCiAgICAgICAgICBaX1RFWFQ6IDEsCiAgICAgICAgICBaX1VOS05PV046IDIsCiAgICAgICAgICBaX0RFRkxBVEVEOiA4CiAgICAgICAgfTsKICAgICAgfQogICAgfSk7CgogICAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcwogICAgdmFyIHJlcXVpcmVfZGVmbGF0ZSA9IF9fY29tbW9uSlMoewogICAgICAibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICAgdmFyIHsgX3RyX2luaXQsIF90cl9zdG9yZWRfYmxvY2ssIF90cl9mbHVzaF9ibG9jaywgX3RyX3RhbGx5LCBfdHJfYWxpZ24gfSA9IHJlcXVpcmVfdHJlZXMoKTsKICAgICAgICB2YXIgYWRsZXIzMiA9IHJlcXVpcmVfYWRsZXIzMigpOwogICAgICAgIHZhciBjcmMzMiA9IHJlcXVpcmVfY3JjMzIoKTsKICAgICAgICB2YXIgbXNnID0gcmVxdWlyZV9tZXNzYWdlcygpOwogICAgICAgIHZhciB7CiAgICAgICAgICBaX05PX0ZMVVNILAogICAgICAgICAgWl9QQVJUSUFMX0ZMVVNILAogICAgICAgICAgWl9GVUxMX0ZMVVNILAogICAgICAgICAgWl9GSU5JU0gsCiAgICAgICAgICBaX0JMT0NLLAogICAgICAgICAgWl9PSywKICAgICAgICAgIFpfU1RSRUFNX0VORCwKICAgICAgICAgIFpfU1RSRUFNX0VSUk9SLAogICAgICAgICAgWl9EQVRBX0VSUk9SLAogICAgICAgICAgWl9CVUZfRVJST1IsCiAgICAgICAgICBaX0RFRkFVTFRfQ09NUFJFU1NJT04sCiAgICAgICAgICBaX0ZJTFRFUkVELAogICAgICAgICAgWl9IVUZGTUFOX09OTFksCiAgICAgICAgICBaX1JMRSwKICAgICAgICAgIFpfRklYRUQsCiAgICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1ksCiAgICAgICAgICBaX1VOS05PV04sCiAgICAgICAgICBaX0RFRkxBVEVECiAgICAgICAgfSA9IHJlcXVpcmVfY29uc3RhbnRzKCk7CiAgICAgICAgdmFyIE1BWF9NRU1fTEVWRUwgPSA5OwogICAgICAgIHZhciBNQVhfV0JJVFMgPSAxNTsKICAgICAgICB2YXIgREVGX01FTV9MRVZFTCA9IDg7CiAgICAgICAgdmFyIExFTkdUSF9DT0RFUyA9IDI5OwogICAgICAgIHZhciBMSVRFUkFMUyA9IDI1NjsKICAgICAgICB2YXIgTF9DT0RFUyA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUzsKICAgICAgICB2YXIgRF9DT0RFUyA9IDMwOwogICAgICAgIHZhciBCTF9DT0RFUyA9IDE5OwogICAgICAgIHZhciBIRUFQX1NJWkUgPSAyICogTF9DT0RFUyArIDE7CiAgICAgICAgdmFyIE1BWF9CSVRTID0gMTU7CiAgICAgICAgdmFyIE1JTl9NQVRDSCA9IDM7CiAgICAgICAgdmFyIE1BWF9NQVRDSCA9IDI1ODsKICAgICAgICB2YXIgTUlOX0xPT0tBSEVBRCA9IE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDE7CiAgICAgICAgdmFyIFBSRVNFVF9ESUNUID0gMzI7CiAgICAgICAgdmFyIElOSVRfU1RBVEUgPSA0MjsKICAgICAgICB2YXIgRVhUUkFfU1RBVEUgPSA2OTsKICAgICAgICB2YXIgTkFNRV9TVEFURSA9IDczOwogICAgICAgIHZhciBDT01NRU5UX1NUQVRFID0gOTE7CiAgICAgICAgdmFyIEhDUkNfU1RBVEUgPSAxMDM7CiAgICAgICAgdmFyIEJVU1lfU1RBVEUgPSAxMTM7CiAgICAgICAgdmFyIEZJTklTSF9TVEFURSA9IDY2NjsKICAgICAgICB2YXIgQlNfTkVFRF9NT1JFID0gMTsKICAgICAgICB2YXIgQlNfQkxPQ0tfRE9ORSA9IDI7CiAgICAgICAgdmFyIEJTX0ZJTklTSF9TVEFSVEVEID0gMzsKICAgICAgICB2YXIgQlNfRklOSVNIX0RPTkUgPSA0OwogICAgICAgIHZhciBPU19DT0RFID0gMzsKICAgICAgICB2YXIgZXJyID0gKHN0cm0sIGVycm9yQ29kZSkgPT4gewogICAgICAgICAgc3RybS5tc2cgPSBtc2dbZXJyb3JDb2RlXTsKICAgICAgICAgIHJldHVybiBlcnJvckNvZGU7CiAgICAgICAgfTsKICAgICAgICB2YXIgcmFuayA9IChmKSA9PiB7CiAgICAgICAgICByZXR1cm4gKGYgPDwgMSkgLSAoZiA+IDQgPyA5IDogMCk7CiAgICAgICAgfTsKICAgICAgICB2YXIgemVybzMgPSAoYnVmKSA9PiB7CiAgICAgICAgICBsZXQgbGVuNCA9IGJ1Zi5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoLS1sZW40ID49IDApIHsKICAgICAgICAgICAgYnVmW2xlbjRdID0gMDsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHZhciBIQVNIX1pMSUIgPSAocywgcHJldiwgZGF0YSkgPT4gKHByZXYgPDwgcy5oYXNoX3NoaWZ0IF4gZGF0YSkgJiBzLmhhc2hfbWFzazsKICAgICAgICB2YXIgSEFTSCA9IEhBU0hfWkxJQjsKICAgICAgICB2YXIgZmx1c2hfcGVuZGluZyA9IChzdHJtKSA9PiB7CiAgICAgICAgICBjb25zdCBzID0gc3RybS5zdGF0ZTsKICAgICAgICAgIGxldCBsZW40ID0gcy5wZW5kaW5nOwogICAgICAgICAgaWYgKGxlbjQgPiBzdHJtLmF2YWlsX291dCkgewogICAgICAgICAgICBsZW40ID0gc3RybS5hdmFpbF9vdXQ7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobGVuNCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBzdHJtLm91dHB1dC5zZXQocy5wZW5kaW5nX2J1Zi5zdWJhcnJheShzLnBlbmRpbmdfb3V0LCBzLnBlbmRpbmdfb3V0ICsgbGVuNCksIHN0cm0ubmV4dF9vdXQpOwogICAgICAgICAgc3RybS5uZXh0X291dCArPSBsZW40OwogICAgICAgICAgcy5wZW5kaW5nX291dCArPSBsZW40OwogICAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gbGVuNDsKICAgICAgICAgIHN0cm0uYXZhaWxfb3V0IC09IGxlbjQ7CiAgICAgICAgICBzLnBlbmRpbmcgLT0gbGVuNDsKICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IDApIHsKICAgICAgICAgICAgcy5wZW5kaW5nX291dCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgZmx1c2hfYmxvY2tfb25seSA9IChzLCBsYXN0KSA9PiB7CiAgICAgICAgICBfdHJfZmx1c2hfYmxvY2socywgcy5ibG9ja19zdGFydCA+PSAwID8gcy5ibG9ja19zdGFydCA6IC0xLCBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCwgbGFzdCk7CiAgICAgICAgICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDsKICAgICAgICAgIGZsdXNoX3BlbmRpbmcocy5zdHJtKTsKICAgICAgICB9OwogICAgICAgIHZhciBwdXRfYnl0ZSA9IChzLCBiKSA9PiB7CiAgICAgICAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGI7CiAgICAgICAgfTsKICAgICAgICB2YXIgcHV0U2hvcnRNU0IgPSAocywgYikgPT4gewogICAgICAgICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiID4+PiA4ICYgMjU1OwogICAgICAgICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMjU1OwogICAgICAgIH07CiAgICAgICAgdmFyIHJlYWRfYnVmID0gKHN0cm0sIGJ1Ziwgc3RhcnQsIHNpemUpID0+IHsKICAgICAgICAgIGxldCBsZW40ID0gc3RybS5hdmFpbF9pbjsKICAgICAgICAgIGlmIChsZW40ID4gc2l6ZSkgewogICAgICAgICAgICBsZW40ID0gc2l6ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChsZW40ID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgc3RybS5hdmFpbF9pbiAtPSBsZW40OwogICAgICAgICAgYnVmLnNldChzdHJtLmlucHV0LnN1YmFycmF5KHN0cm0ubmV4dF9pbiwgc3RybS5uZXh0X2luICsgbGVuNCksIHN0YXJ0KTsKICAgICAgICAgIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDEpIHsKICAgICAgICAgICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgYnVmLCBsZW40LCBzdGFydCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMikgewogICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgYnVmLCBsZW40LCBzdGFydCk7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJtLm5leHRfaW4gKz0gbGVuNDsKICAgICAgICAgIHN0cm0udG90YWxfaW4gKz0gbGVuNDsKICAgICAgICAgIHJldHVybiBsZW40OwogICAgICAgIH07CiAgICAgICAgdmFyIGxvbmdlc3RfbWF0Y2ggPSAocywgY3VyX21hdGNoKSA9PiB7CiAgICAgICAgICBsZXQgY2hhaW5fbGVuZ3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOwogICAgICAgICAgbGV0IHNjYW4gPSBzLnN0cnN0YXJ0OwogICAgICAgICAgbGV0IG1hdGNoOwogICAgICAgICAgbGV0IGxlbjQ7CiAgICAgICAgICBsZXQgYmVzdF9sZW4gPSBzLnByZXZfbGVuZ3RoOwogICAgICAgICAgbGV0IG5pY2VfbWF0Y2ggPSBzLm5pY2VfbWF0Y2g7CiAgICAgICAgICBjb25zdCBsaW1pdCA9IHMuc3Ryc3RhcnQgPiBzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQgPyBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwOwogICAgICAgICAgY29uc3QgX3dpbiA9IHMud2luZG93OwogICAgICAgICAgY29uc3Qgd21hc2sgPSBzLndfbWFzazsKICAgICAgICAgIGNvbnN0IHByZXYgPSBzLnByZXY7CiAgICAgICAgICBjb25zdCBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIOwogICAgICAgICAgbGV0IHNjYW5fZW5kMSA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07CiAgICAgICAgICBsZXQgc2Nhbl9lbmQgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07CiAgICAgICAgICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHsKICAgICAgICAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5pY2VfbWF0Y2ggPiBzLmxvb2thaGVhZCkgewogICAgICAgICAgICBuaWNlX21hdGNoID0gcy5sb29rYWhlYWQ7CiAgICAgICAgICB9CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIG1hdGNoID0gY3VyX21hdGNoOwogICAgICAgICAgICBpZiAoX3dpblttYXRjaCArIGJlc3RfbGVuXSAhPT0gc2Nhbl9lbmQgfHwgX3dpblttYXRjaCArIGJlc3RfbGVuIC0gMV0gIT09IHNjYW5fZW5kMSB8fCBfd2luW21hdGNoXSAhPT0gX3dpbltzY2FuXSB8fCBfd2luWysrbWF0Y2hdICE9PSBfd2luW3NjYW4gKyAxXSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNjYW4gKz0gMjsKICAgICAgICAgICAgbWF0Y2grKzsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICB9IHdoaWxlIChfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIHNjYW4gPCBzdHJlbmQpOwogICAgICAgICAgICBsZW40ID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pOwogICAgICAgICAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIOwogICAgICAgICAgICBpZiAobGVuNCA+IGJlc3RfbGVuKSB7CiAgICAgICAgICAgICAgcy5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsKICAgICAgICAgICAgICBiZXN0X2xlbiA9IGxlbjQ7CiAgICAgICAgICAgICAgaWYgKGxlbjQgPj0gbmljZV9tYXRjaCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNjYW5fZW5kMSA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07CiAgICAgICAgICAgICAgc2Nhbl9lbmQgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdCAmJiAtLWNoYWluX2xlbmd0aCAhPT0gMCk7CiAgICAgICAgICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHsKICAgICAgICAgICAgcmV0dXJuIGJlc3RfbGVuOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHMubG9va2FoZWFkOwogICAgICAgIH07CiAgICAgICAgdmFyIGZpbGxfd2luZG93ID0gKHMpID0+IHsKICAgICAgICAgIGNvbnN0IF93X3NpemUgPSBzLndfc2l6ZTsKICAgICAgICAgIGxldCBwLCBuLCBtLCBtb3JlLCBzdHI2OwogICAgICAgICAgZG8gewogICAgICAgICAgICBtb3JlID0gcy53aW5kb3dfc2l6ZSAtIHMubG9va2FoZWFkIC0gcy5zdHJzdGFydDsKICAgICAgICAgICAgaWYgKHMuc3Ryc3RhcnQgPj0gX3dfc2l6ZSArIChfd19zaXplIC0gTUlOX0xPT0tBSEVBRCkpIHsKICAgICAgICAgICAgICBzLndpbmRvdy5zZXQocy53aW5kb3cuc3ViYXJyYXkoX3dfc2l6ZSwgX3dfc2l6ZSArIF93X3NpemUpLCAwKTsKICAgICAgICAgICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7CiAgICAgICAgICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplOwogICAgICAgICAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTsKICAgICAgICAgICAgICBuID0gcy5oYXNoX3NpemU7CiAgICAgICAgICAgICAgcCA9IG47CiAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgbSA9IHMuaGVhZFstLXBdOwogICAgICAgICAgICAgICAgcy5oZWFkW3BdID0gbSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwOwogICAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7CiAgICAgICAgICAgICAgbiA9IF93X3NpemU7CiAgICAgICAgICAgICAgcCA9IG47CiAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgbSA9IHMucHJldlstLXBdOwogICAgICAgICAgICAgICAgcy5wcmV2W3BdID0gbSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwOwogICAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7CiAgICAgICAgICAgICAgbW9yZSArPSBfd19zaXplOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTsKICAgICAgICAgICAgcy5sb29rYWhlYWQgKz0gbjsKICAgICAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7CiAgICAgICAgICAgICAgc3RyNiA9IHMuc3Ryc3RhcnQgLSBzLmluc2VydDsKICAgICAgICAgICAgICBzLmluc19oID0gcy53aW5kb3dbc3RyNl07CiAgICAgICAgICAgICAgcy5pbnNfaCA9IEhBU0gocywgcy5pbnNfaCwgcy53aW5kb3dbc3RyNiArIDFdKTsKICAgICAgICAgICAgICB3aGlsZSAocy5pbnNlcnQpIHsKICAgICAgICAgICAgICAgIHMuaW5zX2ggPSBIQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3N0cjYgKyBNSU5fTUFUQ0ggLSAxXSk7CiAgICAgICAgICAgICAgICBzLnByZXZbc3RyNiAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTsKICAgICAgICAgICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjY7CiAgICAgICAgICAgICAgICBzdHI2Kys7CiAgICAgICAgICAgICAgICBzLmluc2VydC0tOwogICAgICAgICAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPCBNSU5fTUFUQ0gpIHsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IHdoaWxlIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgcy5zdHJtLmF2YWlsX2luICE9PSAwKTsKICAgICAgICB9OwogICAgICAgIHZhciBkZWZsYXRlX3N0b3JlZCA9IChzLCBmbHVzaCkgPT4gewogICAgICAgICAgbGV0IG1heF9ibG9ja19zaXplID0gNjU1MzU7CiAgICAgICAgICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7CiAgICAgICAgICAgIG1heF9ibG9ja19zaXplID0gcy5wZW5kaW5nX2J1Zl9zaXplIC0gNTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkgewogICAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOwogICAgICAgICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDsKICAgICAgICAgICAgcy5sb29rYWhlYWQgPSAwOwogICAgICAgICAgICBjb25zdCBtYXhfc3RhcnQgPSBzLmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7CiAgICAgICAgICAgIGlmIChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7CiAgICAgICAgICAgICAgcy5sb29rYWhlYWQgPSBzLnN0cnN0YXJ0IC0gbWF4X3N0YXJ0OwogICAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSBtYXhfc3RhcnQ7CiAgICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgICAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHsKICAgICAgICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHMuaW5zZXJ0ID0gMDsKICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHsKICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTsKICAgICAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHMuc3Ryc3RhcnQgPiBzLmJsb2NrX3N0YXJ0KSB7CiAgICAgICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpOwogICAgICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgfTsKICAgICAgICB2YXIgZGVmbGF0ZV9mYXN0ID0gKHMsIGZsdXNoKSA9PiB7CiAgICAgICAgICBsZXQgaGFzaF9oZWFkOwogICAgICAgICAgbGV0IGJmbHVzaDsKICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CiAgICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7CiAgICAgICAgICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaGFzaF9oZWFkID0gMDsKICAgICAgICAgICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkgewogICAgICAgICAgICAgIHMuaW5zX2ggPSBIQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSk7CiAgICAgICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07CiAgICAgICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaGFzaF9oZWFkICE9PSAwICYmIHMuc3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gcy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSB7CiAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkgewogICAgICAgICAgICAgIGJmbHVzaCA9IF90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpOwogICAgICAgICAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoOwogICAgICAgICAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSBzLm1heF9sYXp5X21hdGNoICYmIHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkgewogICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgcy5zdHJzdGFydCsrOwogICAgICAgICAgICAgICAgICBzLmluc19oID0gSEFTSChzLCBzLmluc19oLCBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pOwogICAgICAgICAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTsKICAgICAgICAgICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApOwogICAgICAgICAgICAgICAgcy5zdHJzdGFydCsrOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoOwogICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggPSAwOwogICAgICAgICAgICAgICAgcy5pbnNfaCA9IHMud2luZG93W3Muc3Ryc3RhcnRdOwogICAgICAgICAgICAgICAgcy5pbnNfaCA9IEhBU0gocywgcy5pbnNfaCwgcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYmZsdXNoID0gX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTsKICAgICAgICAgICAgICBzLmxvb2thaGVhZC0tOwogICAgICAgICAgICAgIHMuc3Ryc3RhcnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmZsdXNoKSB7CiAgICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgICAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzLmluc2VydCA9IHMuc3Ryc3RhcnQgPCBNSU5fTUFUQ0ggLSAxID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDE7CiAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7CiAgICAgICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzLmxhc3RfbGl0KSB7CiAgICAgICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpOwogICAgICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBCU19CTE9DS19ET05FOwogICAgICAgIH07CiAgICAgICAgdmFyIGRlZmxhdGVfc2xvdyA9IChzLCBmbHVzaCkgPT4gewogICAgICAgICAgbGV0IGhhc2hfaGVhZDsKICAgICAgICAgIGxldCBiZmx1c2g7CiAgICAgICAgICBsZXQgbWF4X2luc2VydDsKICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CiAgICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7CiAgICAgICAgICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaGFzaF9oZWFkID0gMDsKICAgICAgICAgICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkgewogICAgICAgICAgICAgIHMuaW5zX2ggPSBIQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSk7CiAgICAgICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07CiAgICAgICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzLnByZXZfbGVuZ3RoID0gcy5tYXRjaF9sZW5ndGg7CiAgICAgICAgICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7CiAgICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKICAgICAgICAgICAgaWYgKGhhc2hfaGVhZCAhPT0gMCAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJiBzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgewogICAgICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpOwogICAgICAgICAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSA1ICYmIChzLnN0cmF0ZWd5ID09PSBaX0ZJTFRFUkVEIHx8IHMubWF0Y2hfbGVuZ3RoID09PSBNSU5fTUFUQ0ggJiYgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQgPiA0MDk2KSkgewogICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocy5wcmV2X2xlbmd0aCA+PSBNSU5fTUFUQ0ggJiYgcy5tYXRjaF9sZW5ndGggPD0gcy5wcmV2X2xlbmd0aCkgewogICAgICAgICAgICAgIG1heF9pbnNlcnQgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7CiAgICAgICAgICAgICAgYmZsdXNoID0gX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTsKICAgICAgICAgICAgICBzLmxvb2thaGVhZCAtPSBzLnByZXZfbGVuZ3RoIC0gMTsKICAgICAgICAgICAgICBzLnByZXZfbGVuZ3RoIC09IDI7CiAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7CiAgICAgICAgICAgICAgICAgIHMuaW5zX2ggPSBIQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSk7CiAgICAgICAgICAgICAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdOwogICAgICAgICAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7CiAgICAgICAgICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwOwogICAgICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKICAgICAgICAgICAgICBzLnN0cnN0YXJ0Kys7CiAgICAgICAgICAgICAgaWYgKGJmbHVzaCkgewogICAgICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkgewogICAgICAgICAgICAgIGJmbHVzaCA9IF90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pOwogICAgICAgICAgICAgIGlmIChiZmx1c2gpIHsKICAgICAgICAgICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzLnN0cnN0YXJ0Kys7CiAgICAgICAgICAgICAgcy5sb29rYWhlYWQtLTsKICAgICAgICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxOwogICAgICAgICAgICAgIHMuc3Ryc3RhcnQrKzsKICAgICAgICAgICAgICBzLmxvb2thaGVhZC0tOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHsKICAgICAgICAgICAgYmZsdXNoID0gX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7CiAgICAgICAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTsKICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHsKICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTsKICAgICAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHMubGFzdF9saXQpIHsKICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7CiAgICAgICAgfTsKICAgICAgICB2YXIgZGVmbGF0ZV9ybGUgPSAocywgZmx1c2gpID0+IHsKICAgICAgICAgIGxldCBiZmx1c2g7CiAgICAgICAgICBsZXQgcHJldjsKICAgICAgICAgIGxldCBzY2FuLCBzdHJlbmQ7CiAgICAgICAgICBjb25zdCBfd2luID0gcy53aW5kb3c7CiAgICAgICAgICBmb3IgKDsgOyApIHsKICAgICAgICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkgewogICAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOwogICAgICAgICAgICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0ggJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDsKICAgICAgICAgICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0ID4gMCkgewogICAgICAgICAgICAgIHNjYW4gPSBzLnN0cnN0YXJ0IC0gMTsKICAgICAgICAgICAgICBwcmV2ID0gX3dpbltzY2FuXTsKICAgICAgICAgICAgICBpZiAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0pIHsKICAgICAgICAgICAgICAgIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICB9IHdoaWxlIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHNjYW4gPCBzdHJlbmQpOwogICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7CiAgICAgICAgICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPiBzLmxvb2thaGVhZCkgewogICAgICAgICAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IHMubG9va2FoZWFkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7CiAgICAgICAgICAgICAgYmZsdXNoID0gX3RyX3RhbGx5KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTsKICAgICAgICAgICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDsKICAgICAgICAgICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoOwogICAgICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBiZmx1c2ggPSBfdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pOwogICAgICAgICAgICAgIHMubG9va2FoZWFkLS07CiAgICAgICAgICAgICAgcy5zdHJzdGFydCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiZmx1c2gpIHsKICAgICAgICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHMuaW5zZXJ0ID0gMDsKICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHsKICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTsKICAgICAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHMubGFzdF9saXQpIHsKICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7CiAgICAgICAgfTsKICAgICAgICB2YXIgZGVmbGF0ZV9odWZmID0gKHMsIGZsdXNoKSA9PiB7CiAgICAgICAgICBsZXQgYmZsdXNoOwogICAgICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgewogICAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOwogICAgICAgICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgewogICAgICAgICAgICAgICAgaWYgKGZsdXNoID09PSBaX05PX0ZMVVNIKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggPSAwOwogICAgICAgICAgICBiZmx1c2ggPSBfdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pOwogICAgICAgICAgICBzLmxvb2thaGVhZC0tOwogICAgICAgICAgICBzLnN0cnN0YXJ0Kys7CiAgICAgICAgICAgIGlmIChiZmx1c2gpIHsKICAgICAgICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHMuaW5zZXJ0ID0gMDsKICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHsKICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTsKICAgICAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHMubGFzdF9saXQpIHsKICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7CiAgICAgICAgfTsKICAgICAgICBmdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7CiAgICAgICAgICB0aGlzLmdvb2RfbGVuZ3RoID0gZ29vZF9sZW5ndGg7CiAgICAgICAgICB0aGlzLm1heF9sYXp5ID0gbWF4X2xhenk7CiAgICAgICAgICB0aGlzLm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7CiAgICAgICAgICB0aGlzLm1heF9jaGFpbiA9IG1heF9jaGFpbjsKICAgICAgICAgIHRoaXMuZnVuYyA9IGZ1bmM7CiAgICAgICAgfQogICAgICAgIHZhciBjb25maWd1cmF0aW9uX3RhYmxlID0gWwogICAgICAgICAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksCiAgICAgICAgICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksCiAgICAgICAgICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLAogICAgICAgICAgbmV3IENvbmZpZyg0LCA2LCAzMiwgMzIsIGRlZmxhdGVfZmFzdCksCiAgICAgICAgICBuZXcgQ29uZmlnKDQsIDQsIDE2LCAxNiwgZGVmbGF0ZV9zbG93KSwKICAgICAgICAgIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwKICAgICAgICAgIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLAogICAgICAgICAgbmV3IENvbmZpZyg4LCAzMiwgMTI4LCAyNTYsIGRlZmxhdGVfc2xvdyksCiAgICAgICAgICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwKICAgICAgICAgIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpCiAgICAgICAgXTsKICAgICAgICB2YXIgbG1faW5pdCA9IChzKSA9PiB7CiAgICAgICAgICBzLndpbmRvd19zaXplID0gMiAqIHMud19zaXplOwogICAgICAgICAgemVybzMocy5oZWFkKTsKICAgICAgICAgIHMubWF4X2xhenlfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm1heF9sYXp5OwogICAgICAgICAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDsKICAgICAgICAgIHMubmljZV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubmljZV9sZW5ndGg7CiAgICAgICAgICBzLm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm1heF9jaGFpbjsKICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwOwogICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7CiAgICAgICAgICBzLmxvb2thaGVhZCA9IDA7CiAgICAgICAgICBzLmluc2VydCA9IDA7CiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxOwogICAgICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwOwogICAgICAgICAgcy5pbnNfaCA9IDA7CiAgICAgICAgfTsKICAgICAgICBmdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7CiAgICAgICAgICB0aGlzLnN0cm0gPSBudWxsOwogICAgICAgICAgdGhpcy5zdGF0dXMgPSAwOwogICAgICAgICAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7CiAgICAgICAgICB0aGlzLnBlbmRpbmdfYnVmX3NpemUgPSAwOwogICAgICAgICAgdGhpcy5wZW5kaW5nX291dCA9IDA7CiAgICAgICAgICB0aGlzLnBlbmRpbmcgPSAwOwogICAgICAgICAgdGhpcy53cmFwID0gMDsKICAgICAgICAgIHRoaXMuZ3poZWFkID0gbnVsbDsKICAgICAgICAgIHRoaXMuZ3ppbmRleCA9IDA7CiAgICAgICAgICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQ7CiAgICAgICAgICB0aGlzLmxhc3RfZmx1c2ggPSAtMTsKICAgICAgICAgIHRoaXMud19zaXplID0gMDsKICAgICAgICAgIHRoaXMud19iaXRzID0gMDsKICAgICAgICAgIHRoaXMud19tYXNrID0gMDsKICAgICAgICAgIHRoaXMud2luZG93ID0gbnVsbDsKICAgICAgICAgIHRoaXMud2luZG93X3NpemUgPSAwOwogICAgICAgICAgdGhpcy5wcmV2ID0gbnVsbDsKICAgICAgICAgIHRoaXMuaGVhZCA9IG51bGw7CiAgICAgICAgICB0aGlzLmluc19oID0gMDsKICAgICAgICAgIHRoaXMuaGFzaF9zaXplID0gMDsKICAgICAgICAgIHRoaXMuaGFzaF9iaXRzID0gMDsKICAgICAgICAgIHRoaXMuaGFzaF9tYXNrID0gMDsKICAgICAgICAgIHRoaXMuaGFzaF9zaGlmdCA9IDA7CiAgICAgICAgICB0aGlzLmJsb2NrX3N0YXJ0ID0gMDsKICAgICAgICAgIHRoaXMubWF0Y2hfbGVuZ3RoID0gMDsKICAgICAgICAgIHRoaXMucHJldl9tYXRjaCA9IDA7CiAgICAgICAgICB0aGlzLm1hdGNoX2F2YWlsYWJsZSA9IDA7CiAgICAgICAgICB0aGlzLnN0cnN0YXJ0ID0gMDsKICAgICAgICAgIHRoaXMubWF0Y2hfc3RhcnQgPSAwOwogICAgICAgICAgdGhpcy5sb29rYWhlYWQgPSAwOwogICAgICAgICAgdGhpcy5wcmV2X2xlbmd0aCA9IDA7CiAgICAgICAgICB0aGlzLm1heF9jaGFpbl9sZW5ndGggPSAwOwogICAgICAgICAgdGhpcy5tYXhfbGF6eV9tYXRjaCA9IDA7CiAgICAgICAgICB0aGlzLmxldmVsID0gMDsKICAgICAgICAgIHRoaXMuc3RyYXRlZ3kgPSAwOwogICAgICAgICAgdGhpcy5nb29kX21hdGNoID0gMDsKICAgICAgICAgIHRoaXMubmljZV9tYXRjaCA9IDA7CiAgICAgICAgICB0aGlzLmR5bl9sdHJlZSA9IG5ldyBVaW50MTZBcnJheShIRUFQX1NJWkUgKiAyKTsKICAgICAgICAgIHRoaXMuZHluX2R0cmVlID0gbmV3IFVpbnQxNkFycmF5KCgyICogRF9DT0RFUyArIDEpICogMik7CiAgICAgICAgICB0aGlzLmJsX3RyZWUgPSBuZXcgVWludDE2QXJyYXkoKDIgKiBCTF9DT0RFUyArIDEpICogMik7CiAgICAgICAgICB6ZXJvMyh0aGlzLmR5bl9sdHJlZSk7CiAgICAgICAgICB6ZXJvMyh0aGlzLmR5bl9kdHJlZSk7CiAgICAgICAgICB6ZXJvMyh0aGlzLmJsX3RyZWUpOwogICAgICAgICAgdGhpcy5sX2Rlc2MgPSBudWxsOwogICAgICAgICAgdGhpcy5kX2Rlc2MgPSBudWxsOwogICAgICAgICAgdGhpcy5ibF9kZXNjID0gbnVsbDsKICAgICAgICAgIHRoaXMuYmxfY291bnQgPSBuZXcgVWludDE2QXJyYXkoTUFYX0JJVFMgKyAxKTsKICAgICAgICAgIHRoaXMuaGVhcCA9IG5ldyBVaW50MTZBcnJheSgyICogTF9DT0RFUyArIDEpOwogICAgICAgICAgemVybzModGhpcy5oZWFwKTsKICAgICAgICAgIHRoaXMuaGVhcF9sZW4gPSAwOwogICAgICAgICAgdGhpcy5oZWFwX21heCA9IDA7CiAgICAgICAgICB0aGlzLmRlcHRoID0gbmV3IFVpbnQxNkFycmF5KDIgKiBMX0NPREVTICsgMSk7CiAgICAgICAgICB6ZXJvMyh0aGlzLmRlcHRoKTsKICAgICAgICAgIHRoaXMubF9idWYgPSAwOwogICAgICAgICAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7CiAgICAgICAgICB0aGlzLmxhc3RfbGl0ID0gMDsKICAgICAgICAgIHRoaXMuZF9idWYgPSAwOwogICAgICAgICAgdGhpcy5vcHRfbGVuID0gMDsKICAgICAgICAgIHRoaXMuc3RhdGljX2xlbiA9IDA7CiAgICAgICAgICB0aGlzLm1hdGNoZXMgPSAwOwogICAgICAgICAgdGhpcy5pbnNlcnQgPSAwOwogICAgICAgICAgdGhpcy5iaV9idWYgPSAwOwogICAgICAgICAgdGhpcy5iaV92YWxpZCA9IDA7CiAgICAgICAgfQogICAgICAgIHZhciBkZWZsYXRlUmVzZXRLZWVwID0gKHN0cm0pID0+IHsKICAgICAgICAgIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgewogICAgICAgICAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTsKICAgICAgICAgIH0KICAgICAgICAgIHN0cm0udG90YWxfaW4gPSBzdHJtLnRvdGFsX291dCA9IDA7CiAgICAgICAgICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjsKICAgICAgICAgIGNvbnN0IHMgPSBzdHJtLnN0YXRlOwogICAgICAgICAgcy5wZW5kaW5nID0gMDsKICAgICAgICAgIHMucGVuZGluZ19vdXQgPSAwOwogICAgICAgICAgaWYgKHMud3JhcCA8IDApIHsKICAgICAgICAgICAgcy53cmFwID0gLXMud3JhcDsKICAgICAgICAgIH0KICAgICAgICAgIHMuc3RhdHVzID0gcy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEU7CiAgICAgICAgICBzdHJtLmFkbGVyID0gcy53cmFwID09PSAyID8gMCA6IDE7CiAgICAgICAgICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIOwogICAgICAgICAgX3RyX2luaXQocyk7CiAgICAgICAgICByZXR1cm4gWl9PSzsKICAgICAgICB9OwogICAgICAgIHZhciBkZWZsYXRlUmVzZXQgPSAoc3RybSkgPT4gewogICAgICAgICAgY29uc3QgcmV0ID0gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKTsKICAgICAgICAgIGlmIChyZXQgPT09IFpfT0spIHsKICAgICAgICAgICAgbG1faW5pdChzdHJtLnN0YXRlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfTsKICAgICAgICB2YXIgZGVmbGF0ZVNldEhlYWRlciA9IChzdHJtLCBoZWFkKSA9PiB7CiAgICAgICAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0cm0uc3RhdGUud3JhcCAhPT0gMikgewogICAgICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJtLnN0YXRlLmd6aGVhZCA9IGhlYWQ7CiAgICAgICAgICByZXR1cm4gWl9PSzsKICAgICAgICB9OwogICAgICAgIHZhciBkZWZsYXRlSW5pdDIgPSAoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSA9PiB7CiAgICAgICAgICBpZiAoIXN0cm0pIHsKICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgbGV0IHdyYXAgPSAxOwogICAgICAgICAgaWYgKGxldmVsID09PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIHsKICAgICAgICAgICAgbGV2ZWwgPSA2OwogICAgICAgICAgfQogICAgICAgICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7CiAgICAgICAgICAgIHdyYXAgPSAwOwogICAgICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CiAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvd0JpdHMgPiAxNSkgewogICAgICAgICAgICB3cmFwID0gMjsKICAgICAgICAgICAgd2luZG93Qml0cyAtPSAxNjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPT0gWl9ERUZMQVRFRCB8fCB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUgfHwgbGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fCBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7CiAgICAgICAgICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHdpbmRvd0JpdHMgPT09IDgpIHsKICAgICAgICAgICAgd2luZG93Qml0cyA9IDk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzID0gbmV3IERlZmxhdGVTdGF0ZSgpOwogICAgICAgICAgc3RybS5zdGF0ZSA9IHM7CiAgICAgICAgICBzLnN0cm0gPSBzdHJtOwogICAgICAgICAgcy53cmFwID0gd3JhcDsKICAgICAgICAgIHMuZ3poZWFkID0gbnVsbDsKICAgICAgICAgIHMud19iaXRzID0gd2luZG93Qml0czsKICAgICAgICAgIHMud19zaXplID0gMSA8PCBzLndfYml0czsKICAgICAgICAgIHMud19tYXNrID0gcy53X3NpemUgLSAxOwogICAgICAgICAgcy5oYXNoX2JpdHMgPSBtZW1MZXZlbCArIDc7CiAgICAgICAgICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7CiAgICAgICAgICBzLmhhc2hfbWFzayA9IHMuaGFzaF9zaXplIC0gMTsKICAgICAgICAgIHMuaGFzaF9zaGlmdCA9IH5+KChzLmhhc2hfYml0cyArIE1JTl9NQVRDSCAtIDEpIC8gTUlOX01BVENIKTsKICAgICAgICAgIHMud2luZG93ID0gbmV3IFVpbnQ4QXJyYXkocy53X3NpemUgKiAyKTsKICAgICAgICAgIHMuaGVhZCA9IG5ldyBVaW50MTZBcnJheShzLmhhc2hfc2l6ZSk7CiAgICAgICAgICBzLnByZXYgPSBuZXcgVWludDE2QXJyYXkocy53X3NpemUpOwogICAgICAgICAgcy5saXRfYnVmc2l6ZSA9IDEgPDwgbWVtTGV2ZWwgKyA2OwogICAgICAgICAgcy5wZW5kaW5nX2J1Zl9zaXplID0gcy5saXRfYnVmc2l6ZSAqIDQ7CiAgICAgICAgICBzLnBlbmRpbmdfYnVmID0gbmV3IFVpbnQ4QXJyYXkocy5wZW5kaW5nX2J1Zl9zaXplKTsKICAgICAgICAgIHMuZF9idWYgPSAxICogcy5saXRfYnVmc2l6ZTsKICAgICAgICAgIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTsKICAgICAgICAgIHMubGV2ZWwgPSBsZXZlbDsKICAgICAgICAgIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTsKICAgICAgICAgIHMubWV0aG9kID0gbWV0aG9kOwogICAgICAgICAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTsKICAgICAgICB9OwogICAgICAgIHZhciBkZWZsYXRlSW5pdCA9IChzdHJtLCBsZXZlbCkgPT4gewogICAgICAgICAgcmV0dXJuIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpOwogICAgICAgIH07CiAgICAgICAgdmFyIGRlZmxhdGUgPSAoc3RybSwgZmx1c2gpID0+IHsKICAgICAgICAgIGxldCBiZWcsIHZhbDsKICAgICAgICAgIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fCBmbHVzaCA+IFpfQkxPQ0sgfHwgZmx1c2ggPCAwKSB7CiAgICAgICAgICAgIHJldHVybiBzdHJtID8gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKSA6IFpfU1RSRUFNX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgcyA9IHN0cm0uc3RhdGU7CiAgICAgICAgICBpZiAoIXN0cm0ub3V0cHV0IHx8ICFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDAgfHwgcy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gpIHsKICAgICAgICAgICAgcmV0dXJuIGVycihzdHJtLCBzdHJtLmF2YWlsX291dCA9PT0gMCA/IFpfQlVGX0VSUk9SIDogWl9TVFJFQU1fRVJST1IpOwogICAgICAgICAgfQogICAgICAgICAgcy5zdHJtID0gc3RybTsKICAgICAgICAgIGNvbnN0IG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDsKICAgICAgICAgIHMubGFzdF9mbHVzaCA9IGZsdXNoOwogICAgICAgICAgaWYgKHMuc3RhdHVzID09PSBJTklUX1NUQVRFKSB7CiAgICAgICAgICAgIGlmIChzLndyYXAgPT09IDIpIHsKICAgICAgICAgICAgICBzdHJtLmFkbGVyID0gMDsKICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAzMSk7CiAgICAgICAgICAgICAgcHV0X2J5dGUocywgMTM5KTsKICAgICAgICAgICAgICBwdXRfYnl0ZShzLCA4KTsKICAgICAgICAgICAgICBpZiAoIXMuZ3poZWFkKSB7CiAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIDApOwogICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7CiAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIDApOwogICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOiBzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyID8gNCA6IDApOwogICAgICAgICAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7CiAgICAgICAgICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICsgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgKyAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICsgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICsgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KSk7CiAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMjU1KTsKICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgPj4gOCAmIDI1NSk7CiAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lID4+IDE2ICYgMjU1KTsKICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgPj4gMjQgJiAyNTUpOwogICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOiBzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyID8gNCA6IDApOwogICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQub3MgJiAyNTUpOwogICAgICAgICAgICAgICAgaWYgKHMuZ3poZWFkLmV4dHJhICYmIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAyNTUpOwogICAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYS5sZW5ndGggPj4gOCAmIDI1NSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYykgewogICAgICAgICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nLCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHMuZ3ppbmRleCA9IDA7CiAgICAgICAgICAgICAgICBzLnN0YXR1cyA9IEVYVFJBX1NUQVRFOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsZXQgaGVhZGVyID0gWl9ERUZMQVRFRCArIChzLndfYml0cyAtIDggPDwgNCkgPDwgODsKICAgICAgICAgICAgICBsZXQgbGV2ZWxfZmxhZ3MgPSAtMTsKICAgICAgICAgICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikgewogICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAwOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHsKICAgICAgICAgICAgICAgIGxldmVsX2ZsYWdzID0gMTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPT09IDYpIHsKICAgICAgICAgICAgICAgIGxldmVsX2ZsYWdzID0gMjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAzOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoZWFkZXIgfD0gbGV2ZWxfZmxhZ3MgPDwgNjsKICAgICAgICAgICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgewogICAgICAgICAgICAgICAgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoZWFkZXIgKz0gMzEgLSBoZWFkZXIgJSAzMTsKICAgICAgICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7CiAgICAgICAgICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTsKICAgICAgICAgICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgewogICAgICAgICAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpOwogICAgICAgICAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDY1NTM1KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RybS5hZGxlciA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHsKICAgICAgICAgICAgaWYgKHMuZ3poZWFkLmV4dHJhKSB7CiAgICAgICAgICAgICAgYmVnID0gcy5wZW5kaW5nOwogICAgICAgICAgICAgIHdoaWxlIChzLmd6aW5kZXggPCAocy5nemhlYWQuZXh0cmEubGVuZ3RoICYgNjU1MzUpKSB7CiAgICAgICAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHsKICAgICAgICAgICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7CiAgICAgICAgICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwogICAgICAgICAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7CiAgICAgICAgICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYVtzLmd6aW5kZXhdICYgMjU1KTsKICAgICAgICAgICAgICAgIHMuZ3ppbmRleCsrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHsKICAgICAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzLmd6aW5kZXggPT09IHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcy5nemluZGV4ID0gMDsKICAgICAgICAgICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocy5zdGF0dXMgPT09IE5BTUVfU1RBVEUpIHsKICAgICAgICAgICAgaWYgKHMuZ3poZWFkLm5hbWUpIHsKICAgICAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7CiAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7CiAgICAgICAgICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykgewogICAgICAgICAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKICAgICAgICAgICAgICAgICAgYmVnID0gcy5wZW5kaW5nOwogICAgICAgICAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSAxOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgdmFsID0gcy5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDI1NTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHZhbCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCB2YWwpOwogICAgICAgICAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7CiAgICAgICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7CiAgICAgICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodmFsID09PSAwKSB7CiAgICAgICAgICAgICAgICBzLmd6aW5kZXggPSAwOwogICAgICAgICAgICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChzLnN0YXR1cyA9PT0gQ09NTUVOVF9TVEFURSkgewogICAgICAgICAgICBpZiAocy5nemhlYWQuY29tbWVudCkgewogICAgICAgICAgICAgIGJlZyA9IHMucGVuZGluZzsKICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHsKICAgICAgICAgICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7CiAgICAgICAgICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwogICAgICAgICAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7CiAgICAgICAgICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IDE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5jb21tZW50Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMjU1OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgdmFsID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7CiAgICAgICAgICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTsKICAgICAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHsKICAgICAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh2YWwgPT09IDApIHsKICAgICAgICAgICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHsKICAgICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMpIHsKICAgICAgICAgICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkgewogICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7CiAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMjU1KTsKICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgPj4gOCAmIDI1NSk7CiAgICAgICAgICAgICAgICBzdHJtLmFkbGVyID0gMDsKICAgICAgICAgICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocy5wZW5kaW5nICE9PSAwKSB7CiAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CiAgICAgICAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOwogICAgICAgICAgICAgIHJldHVybiBaX09LOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgcmFuayhmbHVzaCkgPD0gcmFuayhvbGRfZmx1c2gpICYmIGZsdXNoICE9PSBaX0ZJTklTSCkgewogICAgICAgICAgICByZXR1cm4gZXJyKHN0cm0sIFpfQlVGX0VSUk9SKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLmxvb2thaGVhZCAhPT0gMCB8fCBmbHVzaCAhPT0gWl9OT19GTFVTSCAmJiBzLnN0YXR1cyAhPT0gRklOSVNIX1NUQVRFKSB7CiAgICAgICAgICAgIGxldCBic3RhdGUgPSBzLnN0cmF0ZWd5ID09PSBaX0hVRkZNQU5fT05MWSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOiBzLnN0cmF0ZWd5ID09PSBaX1JMRSA/IGRlZmxhdGVfcmxlKHMsIGZsdXNoKSA6IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZnVuYyhzLCBmbHVzaCk7CiAgICAgICAgICAgIGlmIChic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX0RPTkUpIHsKICAgICAgICAgICAgICBzLnN0YXR1cyA9IEZJTklTSF9TVEFURTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnN0YXRlID09PSBCU19ORUVEX01PUkUgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCkgewogICAgICAgICAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBaX09LOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHsKICAgICAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCkgewogICAgICAgICAgICAgICAgX3RyX2FsaWduKHMpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmx1c2ggIT09IFpfQkxPQ0spIHsKICAgICAgICAgICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgMCwgMCwgZmFsc2UpOwogICAgICAgICAgICAgICAgaWYgKGZsdXNoID09PSBaX0ZVTExfRkxVU0gpIHsKICAgICAgICAgICAgICAgICAgemVybzMocy5oZWFkKTsKICAgICAgICAgICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcy5zdHJzdGFydCA9IDA7CiAgICAgICAgICAgICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7CiAgICAgICAgICAgICAgICAgICAgcy5pbnNlcnQgPSAwOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CiAgICAgICAgICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTsKICAgICAgICAgICAgICAgIHJldHVybiBaX09LOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCkgewogICAgICAgICAgICByZXR1cm4gWl9PSzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzLndyYXAgPD0gMCkgewogICAgICAgICAgICByZXR1cm4gWl9TVFJFQU1fRU5EOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHMud3JhcCA9PT0gMikgewogICAgICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMjU1KTsKICAgICAgICAgICAgcHV0X2J5dGUocywgc3RybS5hZGxlciA+PiA4ICYgMjU1KTsKICAgICAgICAgICAgcHV0X2J5dGUocywgc3RybS5hZGxlciA+PiAxNiAmIDI1NSk7CiAgICAgICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgPj4gMjQgJiAyNTUpOwogICAgICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMjU1KTsKICAgICAgICAgICAgcHV0X2J5dGUocywgc3RybS50b3RhbF9pbiA+PiA4ICYgMjU1KTsKICAgICAgICAgICAgcHV0X2J5dGUocywgc3RybS50b3RhbF9pbiA+PiAxNiAmIDI1NSk7CiAgICAgICAgICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gPj4gMjQgJiAyNTUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpOwogICAgICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgNjU1MzUpOwogICAgICAgICAgfQogICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKICAgICAgICAgIGlmIChzLndyYXAgPiAwKSB7CiAgICAgICAgICAgIHMud3JhcCA9IC1zLndyYXA7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcy5wZW5kaW5nICE9PSAwID8gWl9PSyA6IFpfU1RSRUFNX0VORDsKICAgICAgICB9OwogICAgICAgIHZhciBkZWZsYXRlRW5kID0gKHN0cm0pID0+IHsKICAgICAgICAgIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgewogICAgICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzdGF0dXMgPSBzdHJtLnN0YXRlLnN0YXR1czsKICAgICAgICAgIGlmIChzdGF0dXMgIT09IElOSVRfU1RBVEUgJiYgc3RhdHVzICE9PSBFWFRSQV9TVEFURSAmJiBzdGF0dXMgIT09IE5BTUVfU1RBVEUgJiYgc3RhdHVzICE9PSBDT01NRU5UX1NUQVRFICYmIHN0YXR1cyAhPT0gSENSQ19TVEFURSAmJiBzdGF0dXMgIT09IEJVU1lfU1RBVEUgJiYgc3RhdHVzICE9PSBGSU5JU0hfU1RBVEUpIHsKICAgICAgICAgICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJtLnN0YXRlID0gbnVsbDsKICAgICAgICAgIHJldHVybiBzdGF0dXMgPT09IEJVU1lfU1RBVEUgPyBlcnIoc3RybSwgWl9EQVRBX0VSUk9SKSA6IFpfT0s7CiAgICAgICAgfTsKICAgICAgICB2YXIgZGVmbGF0ZVNldERpY3Rpb25hcnkgPSAoc3RybSwgZGljdGlvbmFyeSkgPT4gewogICAgICAgICAgbGV0IGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDsKICAgICAgICAgIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgewogICAgICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzID0gc3RybS5zdGF0ZTsKICAgICAgICAgIGNvbnN0IHdyYXAgPSBzLndyYXA7CiAgICAgICAgICBpZiAod3JhcCA9PT0gMiB8fCB3cmFwID09PSAxICYmIHMuc3RhdHVzICE9PSBJTklUX1NUQVRFIHx8IHMubG9va2FoZWFkKSB7CiAgICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh3cmFwID09PSAxKSB7CiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApOwogICAgICAgICAgfQogICAgICAgICAgcy53cmFwID0gMDsKICAgICAgICAgIGlmIChkaWN0TGVuZ3RoID49IHMud19zaXplKSB7CiAgICAgICAgICAgIGlmICh3cmFwID09PSAwKSB7CiAgICAgICAgICAgICAgemVybzMocy5oZWFkKTsKICAgICAgICAgICAgICBzLnN0cnN0YXJ0ID0gMDsKICAgICAgICAgICAgICBzLmJsb2NrX3N0YXJ0ID0gMDsKICAgICAgICAgICAgICBzLmluc2VydCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHRtcERpY3QgPSBuZXcgVWludDhBcnJheShzLndfc2l6ZSk7CiAgICAgICAgICAgIHRtcERpY3Quc2V0KGRpY3Rpb25hcnkuc3ViYXJyYXkoZGljdExlbmd0aCAtIHMud19zaXplLCBkaWN0TGVuZ3RoKSwgMCk7CiAgICAgICAgICAgIGRpY3Rpb25hcnkgPSB0bXBEaWN0OwogICAgICAgICAgICBkaWN0TGVuZ3RoID0gcy53X3NpemU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBhdmFpbCA9IHN0cm0uYXZhaWxfaW47CiAgICAgICAgICBjb25zdCBuZXh0ID0gc3RybS5uZXh0X2luOwogICAgICAgICAgY29uc3QgaW5wdXQgPSBzdHJtLmlucHV0OwogICAgICAgICAgc3RybS5hdmFpbF9pbiA9IGRpY3RMZW5ndGg7CiAgICAgICAgICBzdHJtLm5leHRfaW4gPSAwOwogICAgICAgICAgc3RybS5pbnB1dCA9IGRpY3Rpb25hcnk7CiAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKICAgICAgICAgIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKICAgICAgICAgICAgbGV0IHN0cjYgPSBzLnN0cnN0YXJ0OwogICAgICAgICAgICBsZXQgbiA9IHMubG9va2FoZWFkIC0gKE1JTl9NQVRDSCAtIDEpOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgcy5pbnNfaCA9IEhBU0gocywgcy5pbnNfaCwgcy53aW5kb3dbc3RyNiArIE1JTl9NQVRDSCAtIDFdKTsKICAgICAgICAgICAgICBzLnByZXZbc3RyNiAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTsKICAgICAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI2OwogICAgICAgICAgICAgIHN0cjYrKzsKICAgICAgICAgICAgfSB3aGlsZSAoLS1uKTsKICAgICAgICAgICAgcy5zdHJzdGFydCA9IHN0cjY7CiAgICAgICAgICAgIHMubG9va2FoZWFkID0gTUlOX01BVENIIC0gMTsKICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7CiAgICAgICAgICB9CiAgICAgICAgICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkOwogICAgICAgICAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7CiAgICAgICAgICBzLmluc2VydCA9IHMubG9va2FoZWFkOwogICAgICAgICAgcy5sb29rYWhlYWQgPSAwOwogICAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKICAgICAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDsKICAgICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7CiAgICAgICAgICBzdHJtLmlucHV0ID0gaW5wdXQ7CiAgICAgICAgICBzdHJtLmF2YWlsX2luID0gYXZhaWw7CiAgICAgICAgICBzLndyYXAgPSB3cmFwOwogICAgICAgICAgcmV0dXJuIFpfT0s7CiAgICAgICAgfTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5kZWZsYXRlSW5pdCA9IGRlZmxhdGVJbml0OwogICAgICAgIG1vZHVsZS5leHBvcnRzLmRlZmxhdGVJbml0MiA9IGRlZmxhdGVJbml0MjsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5kZWZsYXRlUmVzZXQgPSBkZWZsYXRlUmVzZXQ7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuZGVmbGF0ZVJlc2V0S2VlcCA9IGRlZmxhdGVSZXNldEtlZXA7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuZGVmbGF0ZVNldEhlYWRlciA9IGRlZmxhdGVTZXRIZWFkZXI7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuZGVmbGF0ZUVuZCA9IGRlZmxhdGVFbmQ7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuZGVmbGF0ZVNldERpY3Rpb25hcnkgPSBkZWZsYXRlU2V0RGljdGlvbmFyeTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5kZWZsYXRlSW5mbyA9ICJwYWtvIGRlZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIjsKICAgICAgfQogICAgfSk7CgogICAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL2NvbW1vbi5qcwogICAgdmFyIHJlcXVpcmVfY29tbW9uID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICAgICB2YXIgX2hhcyA9IChvYmosIGtleSkgPT4gewogICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7CiAgICAgICAgfTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5hc3NpZ24gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICAgIGNvbnN0IHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTsKICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICJtdXN0IGJlIG5vbi1vYmplY3QiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGNvbnN0IHAgaW4gc291cmNlKSB7CiAgICAgICAgICAgICAgaWYgKF9oYXMoc291cmNlLCBwKSkgewogICAgICAgICAgICAgICAgb2JqW3BdID0gc291cmNlW3BdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICB9OwogICAgICAgIG1vZHVsZS5leHBvcnRzLmZsYXR0ZW5DaHVua3MgPSAoY2h1bmtzKSA9PiB7CiAgICAgICAgICBsZXQgbGVuNCA9IDA7CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgbGVuNCArPSBjaHVua3NbaV0ubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuNCk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgbGV0IGNodW5rID0gY2h1bmtzW2ldOwogICAgICAgICAgICByZXN1bHQuc2V0KGNodW5rLCBwb3MpOwogICAgICAgICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvc3RyaW5ncy5qcwogICAgdmFyIHJlcXVpcmVfc3RyaW5ncyA9IF9fY29tbW9uSlMoewogICAgICAibm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL3N0cmluZ3MuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIHZhciBTVFJfQVBQTFlfVUlBX09LID0gdHJ1ZTsKICAgICAgICB0cnkgewogICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSk7CiAgICAgICAgfSBjYXRjaCAoX18pIHsKICAgICAgICAgIFNUUl9BUFBMWV9VSUFfT0sgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdmFyIF91dGY4bGVuID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICAgICAgICBmb3IgKGxldCBxID0gMDsgcSA8IDI1NjsgcSsrKSB7CiAgICAgICAgICBfdXRmOGxlbltxXSA9IHEgPj0gMjUyID8gNiA6IHEgPj0gMjQ4ID8gNSA6IHEgPj0gMjQwID8gNCA6IHEgPj0gMjI0ID8gMyA6IHEgPj0gMTkyID8gMiA6IDE7CiAgICAgICAgfQogICAgICAgIF91dGY4bGVuWzI1NF0gPSBfdXRmOGxlblsyNTRdID0gMTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5zdHJpbmcyYnVmID0gKHN0cjYpID0+IHsKICAgICAgICAgIGxldCBidWYsIGMsIGMyLCBtX3BvcywgaSwgc3RyX2xlbiA9IHN0cjYubGVuZ3RoLCBidWZfbGVuID0gMDsKICAgICAgICAgIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHsKICAgICAgICAgICAgYyA9IHN0cjYuY2hhckNvZGVBdChtX3Bvcyk7CiAgICAgICAgICAgIGlmICgoYyAmIDY0NTEyKSA9PT0gNTUyOTYgJiYgbV9wb3MgKyAxIDwgc3RyX2xlbikgewogICAgICAgICAgICAgIGMyID0gc3RyNi5jaGFyQ29kZUF0KG1fcG9zICsgMSk7CiAgICAgICAgICAgICAgaWYgKChjMiAmIDY0NTEyKSA9PT0gNTYzMjApIHsKICAgICAgICAgICAgICAgIGMgPSA2NTUzNiArIChjIC0gNTUyOTYgPDwgMTApICsgKGMyIC0gNTYzMjApOwogICAgICAgICAgICAgICAgbV9wb3MrKzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnVmX2xlbiArPSBjIDwgMTI4ID8gMSA6IGMgPCAyMDQ4ID8gMiA6IGMgPCA2NTUzNiA/IDMgOiA0OwogICAgICAgICAgfQogICAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnVmX2xlbik7CiAgICAgICAgICBmb3IgKGkgPSAwLCBtX3BvcyA9IDA7IGkgPCBidWZfbGVuOyBtX3BvcysrKSB7CiAgICAgICAgICAgIGMgPSBzdHI2LmNoYXJDb2RlQXQobV9wb3MpOwogICAgICAgICAgICBpZiAoKGMgJiA2NDUxMikgPT09IDU1Mjk2ICYmIG1fcG9zICsgMSA8IHN0cl9sZW4pIHsKICAgICAgICAgICAgICBjMiA9IHN0cjYuY2hhckNvZGVBdChtX3BvcyArIDEpOwogICAgICAgICAgICAgIGlmICgoYzIgJiA2NDUxMikgPT09IDU2MzIwKSB7CiAgICAgICAgICAgICAgICBjID0gNjU1MzYgKyAoYyAtIDU1Mjk2IDw8IDEwKSArIChjMiAtIDU2MzIwKTsKICAgICAgICAgICAgICAgIG1fcG9zKys7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjIDwgMTI4KSB7CiAgICAgICAgICAgICAgYnVmW2krK10gPSBjOwogICAgICAgICAgICB9IGVsc2UgaWYgKGMgPCAyMDQ4KSB7CiAgICAgICAgICAgICAgYnVmW2krK10gPSAxOTIgfCBjID4+PiA2OwogICAgICAgICAgICAgIGJ1ZltpKytdID0gMTI4IHwgYyAmIDYzOwogICAgICAgICAgICB9IGVsc2UgaWYgKGMgPCA2NTUzNikgewogICAgICAgICAgICAgIGJ1ZltpKytdID0gMjI0IHwgYyA+Pj4gMTI7CiAgICAgICAgICAgICAgYnVmW2krK10gPSAxMjggfCBjID4+PiA2ICYgNjM7CiAgICAgICAgICAgICAgYnVmW2krK10gPSAxMjggfCBjICYgNjM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYnVmW2krK10gPSAyNDAgfCBjID4+PiAxODsKICAgICAgICAgICAgICBidWZbaSsrXSA9IDEyOCB8IGMgPj4+IDEyICYgNjM7CiAgICAgICAgICAgICAgYnVmW2krK10gPSAxMjggfCBjID4+PiA2ICYgNjM7CiAgICAgICAgICAgICAgYnVmW2krK10gPSAxMjggfCBjICYgNjM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBidWY7CiAgICAgICAgfTsKICAgICAgICB2YXIgYnVmMmJpbnN0cmluZyA9IChidWYsIGxlbjQpID0+IHsKICAgICAgICAgIGlmIChsZW40IDwgNjU1MzQpIHsKICAgICAgICAgICAgaWYgKGJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfVUlBX09LKSB7CiAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnVmLmxlbmd0aCA9PT0gbGVuNCA/IGJ1ZiA6IGJ1Zi5zdWJhcnJheSgwLCBsZW40KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCByZXN1bHQgPSAiIjsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuNDsgaSsrKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH07CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuYnVmMnN0cmluZyA9IChidWYsIG1heDQpID0+IHsKICAgICAgICAgIGxldCBpLCBvdXQ7CiAgICAgICAgICBjb25zdCBsZW40ID0gbWF4NCB8fCBidWYubGVuZ3RoOwogICAgICAgICAgY29uc3QgdXRmMTZidWYgPSBuZXcgQXJyYXkobGVuNCAqIDIpOwogICAgICAgICAgZm9yIChvdXQgPSAwLCBpID0gMDsgaSA8IGxlbjQ7ICkgewogICAgICAgICAgICBsZXQgYyA9IGJ1ZltpKytdOwogICAgICAgICAgICBpZiAoYyA8IDEyOCkgewogICAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGNfbGVuID0gX3V0ZjhsZW5bY107CiAgICAgICAgICAgIGlmIChjX2xlbiA+IDQpIHsKICAgICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSA2NTUzMzsKICAgICAgICAgICAgICBpICs9IGNfbGVuIC0gMTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjICY9IGNfbGVuID09PSAyID8gMzEgOiBjX2xlbiA9PT0gMyA/IDE1IDogNzsKICAgICAgICAgICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuNCkgewogICAgICAgICAgICAgIGMgPSBjIDw8IDYgfCBidWZbaSsrXSAmIDYzOwogICAgICAgICAgICAgIGNfbGVuLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNfbGVuID4gMSkgewogICAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDY1NTMzOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjIDwgNjU1MzYpIHsKICAgICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSBjOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGMgLT0gNjU1MzY7CiAgICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gNTUyOTYgfCBjID4+IDEwICYgMTAyMzsKICAgICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSA1NjMyMCB8IGMgJiAxMDIzOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTsKICAgICAgICB9OwogICAgICAgIG1vZHVsZS5leHBvcnRzLnV0Zjhib3JkZXIgPSAoYnVmLCBtYXg0KSA9PiB7CiAgICAgICAgICBtYXg0ID0gbWF4NCB8fCBidWYubGVuZ3RoOwogICAgICAgICAgaWYgKG1heDQgPiBidWYubGVuZ3RoKSB7CiAgICAgICAgICAgIG1heDQgPSBidWYubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgbGV0IHBvcyA9IG1heDQgLSAxOwogICAgICAgICAgd2hpbGUgKHBvcyA+PSAwICYmIChidWZbcG9zXSAmIDE5MikgPT09IDEyOCkgewogICAgICAgICAgICBwb3MtLTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwb3MgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiBtYXg0OwogICAgICAgICAgfQogICAgICAgICAgaWYgKHBvcyA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gbWF4NDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwb3MgKyBfdXRmOGxlbltidWZbcG9zXV0gPiBtYXg0ID8gcG9zIDogbWF4NDsKICAgICAgICB9OwogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi96c3RyZWFtLmpzCiAgICB2YXIgcmVxdWlyZV96c3RyZWFtID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi96c3RyZWFtLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICAgICBmdW5jdGlvbiBaU3RyZWFtKCkgewogICAgICAgICAgdGhpcy5pbnB1dCA9IG51bGw7CiAgICAgICAgICB0aGlzLm5leHRfaW4gPSAwOwogICAgICAgICAgdGhpcy5hdmFpbF9pbiA9IDA7CiAgICAgICAgICB0aGlzLnRvdGFsX2luID0gMDsKICAgICAgICAgIHRoaXMub3V0cHV0ID0gbnVsbDsKICAgICAgICAgIHRoaXMubmV4dF9vdXQgPSAwOwogICAgICAgICAgdGhpcy5hdmFpbF9vdXQgPSAwOwogICAgICAgICAgdGhpcy50b3RhbF9vdXQgPSAwOwogICAgICAgICAgdGhpcy5tc2cgPSAiIjsKICAgICAgICAgIHRoaXMuc3RhdGUgPSBudWxsOwogICAgICAgICAgdGhpcy5kYXRhX3R5cGUgPSAyOwogICAgICAgICAgdGhpcy5hZGxlciA9IDA7CiAgICAgICAgfQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTsKICAgICAgfQogICAgfSk7CgogICAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL2RlZmxhdGUuanMKICAgIHZhciByZXF1aXJlX2RlZmxhdGUyID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvcGFrby9saWIvZGVmbGF0ZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICAgdmFyIHpsaWJfZGVmbGF0ZSA9IHJlcXVpcmVfZGVmbGF0ZSgpOwogICAgICAgIHZhciB1dGlscyA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICAgICAgdmFyIHN0cmluZ3MgPSByZXF1aXJlX3N0cmluZ3MoKTsKICAgICAgICB2YXIgbXNnID0gcmVxdWlyZV9tZXNzYWdlcygpOwogICAgICAgIHZhciBaU3RyZWFtID0gcmVxdWlyZV96c3RyZWFtKCk7CiAgICAgICAgdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICAgICAgICB2YXIgewogICAgICAgICAgWl9OT19GTFVTSCwKICAgICAgICAgIFpfU1lOQ19GTFVTSCwKICAgICAgICAgIFpfRlVMTF9GTFVTSCwKICAgICAgICAgIFpfRklOSVNILAogICAgICAgICAgWl9PSywKICAgICAgICAgIFpfU1RSRUFNX0VORCwKICAgICAgICAgIFpfREVGQVVMVF9DT01QUkVTU0lPTiwKICAgICAgICAgIFpfREVGQVVMVF9TVFJBVEVHWSwKICAgICAgICAgIFpfREVGTEFURUQKICAgICAgICB9ID0gcmVxdWlyZV9jb25zdGFudHMoKTsKICAgICAgICBmdW5jdGlvbiBEZWZsYXRlKG9wdGlvbnMpIHsKICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHV0aWxzLmFzc2lnbih7CiAgICAgICAgICAgIGxldmVsOiBaX0RFRkFVTFRfQ09NUFJFU1NJT04sCiAgICAgICAgICAgIG1ldGhvZDogWl9ERUZMQVRFRCwKICAgICAgICAgICAgY2h1bmtTaXplOiAxNjM4NCwKICAgICAgICAgICAgd2luZG93Qml0czogMTUsCiAgICAgICAgICAgIG1lbUxldmVsOiA4LAogICAgICAgICAgICBzdHJhdGVneTogWl9ERUZBVUxUX1NUUkFURUdZCiAgICAgICAgICB9LCBvcHRpb25zIHx8IHt9KTsKICAgICAgICAgIGxldCBvcHQgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICBpZiAob3B0LnJhdyAmJiBvcHQud2luZG93Qml0cyA+IDApIHsKICAgICAgICAgICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7CiAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5nemlwICYmIG9wdC53aW5kb3dCaXRzID4gMCAmJiBvcHQud2luZG93Qml0cyA8IDE2KSB7CiAgICAgICAgICAgIG9wdC53aW5kb3dCaXRzICs9IDE2OwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5lcnIgPSAwOwogICAgICAgICAgdGhpcy5tc2cgPSAiIjsKICAgICAgICAgIHRoaXMuZW5kZWQgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuY2h1bmtzID0gW107CiAgICAgICAgICB0aGlzLnN0cm0gPSBuZXcgWlN0cmVhbSgpOwogICAgICAgICAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7CiAgICAgICAgICBsZXQgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVJbml0Mih0aGlzLnN0cm0sIG9wdC5sZXZlbCwgb3B0Lm1ldGhvZCwgb3B0LndpbmRvd0JpdHMsIG9wdC5tZW1MZXZlbCwgb3B0LnN0cmF0ZWd5KTsKICAgICAgICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvcHQuaGVhZGVyKSB7CiAgICAgICAgICAgIHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSwgb3B0LmhlYWRlcik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAob3B0LmRpY3Rpb25hcnkpIHsKICAgICAgICAgICAgbGV0IGRpY3Q7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0LmRpY3Rpb25hcnkgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgZGljdCA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihvcHQuZGljdGlvbmFyeSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKICAgICAgICAgICAgICBkaWN0ID0gbmV3IFVpbnQ4QXJyYXkob3B0LmRpY3Rpb25hcnkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGRpY3QgPSBvcHQuZGljdGlvbmFyeTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTsKICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gWl9PSykgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZGljdF9zZXQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBEZWZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oZGF0YSwgZmx1c2hfbW9kZSkgewogICAgICAgICAgY29uc3Qgc3RybSA9IHRoaXMuc3RybTsKICAgICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7CiAgICAgICAgICBsZXQgc3RhdHVzLCBfZmx1c2hfbW9kZTsKICAgICAgICAgIGlmICh0aGlzLmVuZGVkKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChmbHVzaF9tb2RlID09PSB+fmZsdXNoX21vZGUpCiAgICAgICAgICAgIF9mbHVzaF9tb2RlID0gZmx1c2hfbW9kZTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgX2ZsdXNoX21vZGUgPSBmbHVzaF9tb2RlID09PSB0cnVlID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIOwogICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAic3RyaW5nIikgewogICAgICAgICAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRhdGEpOwogICAgICAgICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iKSB7CiAgICAgICAgICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cm0uaW5wdXQgPSBkYXRhOwogICAgICAgICAgfQogICAgICAgICAgc3RybS5uZXh0X2luID0gMDsKICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDsKICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgICAgICBzdHJtLm91dHB1dCA9IG5ldyBVaW50OEFycmF5KGNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IDA7CiAgICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChfZmx1c2hfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIIHx8IF9mbHVzaF9tb2RlID09PSBaX0ZVTExfRkxVU0gpICYmIHN0cm0uYXZhaWxfb3V0IDw9IDYpIHsKICAgICAgICAgICAgICB0aGlzLm9uRGF0YShzdHJtLm91dHB1dC5zdWJhcnJheSgwLCBzdHJtLm5leHRfb3V0KSk7CiAgICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSAwOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlKHN0cm0sIF9mbHVzaF9tb2RlKTsKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gWl9TVFJFQU1fRU5EKSB7CiAgICAgICAgICAgICAgaWYgKHN0cm0ubmV4dF9vdXQgPiAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YShzdHJtLm91dHB1dC5zdWJhcnJheSgwLCBzdHJtLm5leHRfb3V0KSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlRW5kKHRoaXMuc3RybSk7CiAgICAgICAgICAgICAgdGhpcy5vbkVuZChzdGF0dXMpOwogICAgICAgICAgICAgIHRoaXMuZW5kZWQgPSB0cnVlOwogICAgICAgICAgICAgIHJldHVybiBzdGF0dXMgPT09IFpfT0s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5vbkRhdGEoc3RybS5vdXRwdXQpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChfZmx1c2hfbW9kZSA+IDAgJiYgc3RybS5uZXh0X291dCA+IDApIHsKICAgICAgICAgICAgICB0aGlzLm9uRGF0YShzdHJtLm91dHB1dC5zdWJhcnJheSgwLCBzdHJtLm5leHRfb3V0KSk7CiAgICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSAwOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJtLmF2YWlsX2luID09PSAwKQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgICAgICBEZWZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbihjaHVuaykgewogICAgICAgICAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7CiAgICAgICAgfTsKICAgICAgICBEZWZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uKHN0YXR1cykgewogICAgICAgICAgaWYgKHN0YXR1cyA9PT0gWl9PSykgewogICAgICAgICAgICB0aGlzLnJlc3VsdCA9IHV0aWxzLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5jaHVua3MgPSBbXTsKICAgICAgICAgIHRoaXMuZXJyID0gc3RhdHVzOwogICAgICAgICAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnOwogICAgICAgIH07CiAgICAgICAgZnVuY3Rpb24gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucykgewogICAgICAgICAgY29uc3QgZGVmbGF0b3IgPSBuZXcgRGVmbGF0ZShvcHRpb25zKTsKICAgICAgICAgIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpOwogICAgICAgICAgaWYgKGRlZmxhdG9yLmVycikgewogICAgICAgICAgICB0aHJvdyBkZWZsYXRvci5tc2cgfHwgbXNnW2RlZmxhdG9yLmVycl07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZGVmbGF0b3IucmVzdWx0OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7CiAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICAgIG9wdGlvbnMucmF3ID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ3ppcChpbnB1dCwgb3B0aW9ucykgewogICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgICBvcHRpb25zLmd6aXAgPSB0cnVlOwogICAgICAgICAgcmV0dXJuIGRlZmxhdGUoaW5wdXQsIG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICBtb2R1bGUuZXhwb3J0cy5EZWZsYXRlID0gRGVmbGF0ZTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5kZWZsYXRlUmF3ID0gZGVmbGF0ZVJhdzsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5nemlwID0gZ3ppcDsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5jb25zdGFudHMgPSByZXF1aXJlX2NvbnN0YW50cygpOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzCiAgICB2YXIgcmVxdWlyZV9pbmZmYXN0ID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICAgICB2YXIgQkFEID0gMzA7CiAgICAgICAgdmFyIFRZUEUgPSAxMjsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkgewogICAgICAgICAgbGV0IF9pbjsKICAgICAgICAgIGxldCBsYXN0OwogICAgICAgICAgbGV0IF9vdXQ7CiAgICAgICAgICBsZXQgYmVnOwogICAgICAgICAgbGV0IGVuZDsKICAgICAgICAgIGxldCBkbWF4OwogICAgICAgICAgbGV0IHdzaXplOwogICAgICAgICAgbGV0IHdoYXZlOwogICAgICAgICAgbGV0IHduZXh0OwogICAgICAgICAgbGV0IHNfd2luZG93OwogICAgICAgICAgbGV0IGhvbGQ7CiAgICAgICAgICBsZXQgYml0czsKICAgICAgICAgIGxldCBsY29kZTsKICAgICAgICAgIGxldCBkY29kZTsKICAgICAgICAgIGxldCBsbWFzazsKICAgICAgICAgIGxldCBkbWFzazsKICAgICAgICAgIGxldCBoZXJlOwogICAgICAgICAgbGV0IG9wOwogICAgICAgICAgbGV0IGxlbjQ7CiAgICAgICAgICBsZXQgZGlzdDM7CiAgICAgICAgICBsZXQgZnJvbTsKICAgICAgICAgIGxldCBmcm9tX3NvdXJjZTsKICAgICAgICAgIGxldCBpbnB1dCwgb3V0cHV0OwogICAgICAgICAgY29uc3Qgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgICAgICAgX2luID0gc3RybS5uZXh0X2luOwogICAgICAgICAgaW5wdXQgPSBzdHJtLmlucHV0OwogICAgICAgICAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7CiAgICAgICAgICBfb3V0ID0gc3RybS5uZXh0X291dDsKICAgICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0OwogICAgICAgICAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTsKICAgICAgICAgIGVuZCA9IF9vdXQgKyAoc3RybS5hdmFpbF9vdXQgLSAyNTcpOwogICAgICAgICAgZG1heCA9IHN0YXRlLmRtYXg7CiAgICAgICAgICB3c2l6ZSA9IHN0YXRlLndzaXplOwogICAgICAgICAgd2hhdmUgPSBzdGF0ZS53aGF2ZTsKICAgICAgICAgIHduZXh0ID0gc3RhdGUud25leHQ7CiAgICAgICAgICBzX3dpbmRvdyA9IHN0YXRlLndpbmRvdzsKICAgICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkOwogICAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7CiAgICAgICAgICBsY29kZSA9IHN0YXRlLmxlbmNvZGU7CiAgICAgICAgICBkY29kZSA9IHN0YXRlLmRpc3Rjb2RlOwogICAgICAgICAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7CiAgICAgICAgICBkbWFzayA9ICgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDE7CiAgICAgICAgICB0b3A6CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICBpZiAoYml0cyA8IDE1KSB7CiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107CiAgICAgICAgICAgICAgZG9sZW46CiAgICAgICAgICAgICAgICBmb3IgKDsgOyApIHsKICAgICAgICAgICAgICAgICAgb3AgPSBoZXJlID4+PiAyNDsKICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IG9wOwogICAgICAgICAgICAgICAgICBiaXRzIC09IG9wOwogICAgICAgICAgICAgICAgICBvcCA9IGhlcmUgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICAgICAgICBpZiAob3AgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcCAmIDE2KSB7CiAgICAgICAgICAgICAgICAgICAgbGVuNCA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgICAgICAgICBvcCAmPSAxNTsKICAgICAgICAgICAgICAgICAgICBpZiAob3ApIHsKICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbGVuNCArPSBob2xkICYgKDEgPDwgb3ApIC0gMTsKICAgICAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBvcDsKICAgICAgICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgMTUpIHsKICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTsKICAgICAgICAgICAgICAgICAgICBkb2Rpc3Q6CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgOyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBoZXJlID4+PiAyNDsKICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IG9wOwogICAgICAgICAgICAgICAgICAgICAgICBiaXRzIC09IG9wOwogICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGhlcmUgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgJiAxNikgewogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QzID0gaGVyZSAmIDY1NTM1OwogICAgICAgICAgICAgICAgICAgICAgICAgIG9wICY9IDE1OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdDMgKz0gaG9sZCAmICgxIDw8IG9wKSAtIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3QzID4gZG1heCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBfb3V0IC0gYmVnOwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0MyA+IG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGRpc3QzIC0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IHNfd2luZG93OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHduZXh0ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjQgLT0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod25leHQgPCBvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgLT0gd25leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbjQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW40IC09IG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW40KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IHduZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuNCAtPSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3QzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbjQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW40IC09IG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3QzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGVuNCA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuNCAtPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbjQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuNCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0MzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuNCAtPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuNCA+IDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbjQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbjQgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlID0gZGNvZGVbKGhlcmUgJiA2NTUzNSkgKyAoaG9sZCAmICgxIDw8IG9wKSAtIDEpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBkb2Rpc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBoZXJlID0gbGNvZGVbKGhlcmUgJiA2NTUzNSkgKyAoaG9sZCAmICgxIDw8IG9wKSAtIDEpXTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBkb2xlbjsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcCAmIDMyKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgICBicmVhayB0b3A7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gd2hpbGUgKF9pbiA8IGxhc3QgJiYgX291dCA8IGVuZCk7CiAgICAgICAgICBsZW40ID0gYml0cyA+PiAzOwogICAgICAgICAgX2luIC09IGxlbjQ7CiAgICAgICAgICBiaXRzIC09IGxlbjQgPDwgMzsKICAgICAgICAgIGhvbGQgJj0gKDEgPDwgYml0cykgLSAxOwogICAgICAgICAgc3RybS5uZXh0X2luID0gX2luOwogICAgICAgICAgc3RybS5uZXh0X291dCA9IF9vdXQ7CiAgICAgICAgICBzdHJtLmF2YWlsX2luID0gX2luIDwgbGFzdCA/IDUgKyAobGFzdCAtIF9pbikgOiA1IC0gKF9pbiAtIGxhc3QpOwogICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBfb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIF9vdXQpIDogMjU3IC0gKF9vdXQgLSBlbmQpOwogICAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7CiAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0czsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9OwogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZ0cmVlcy5qcwogICAgdmFyIHJlcXVpcmVfaW5mdHJlZXMgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZnRyZWVzLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICAgICB2YXIgTUFYQklUUyA9IDE1OwogICAgICAgIHZhciBFTk9VR0hfTEVOUyA9IDg1MjsKICAgICAgICB2YXIgRU5PVUdIX0RJU1RTID0gNTkyOwogICAgICAgIHZhciBDT0RFUyA9IDA7CiAgICAgICAgdmFyIExFTlMgPSAxOwogICAgICAgIHZhciBESVNUUyA9IDI7CiAgICAgICAgdmFyIGxiYXNlID0gbmV3IFVpbnQxNkFycmF5KFsKICAgICAgICAgIDMsCiAgICAgICAgICA0LAogICAgICAgICAgNSwKICAgICAgICAgIDYsCiAgICAgICAgICA3LAogICAgICAgICAgOCwKICAgICAgICAgIDksCiAgICAgICAgICAxMCwKICAgICAgICAgIDExLAogICAgICAgICAgMTMsCiAgICAgICAgICAxNSwKICAgICAgICAgIDE3LAogICAgICAgICAgMTksCiAgICAgICAgICAyMywKICAgICAgICAgIDI3LAogICAgICAgICAgMzEsCiAgICAgICAgICAzNSwKICAgICAgICAgIDQzLAogICAgICAgICAgNTEsCiAgICAgICAgICA1OSwKICAgICAgICAgIDY3LAogICAgICAgICAgODMsCiAgICAgICAgICA5OSwKICAgICAgICAgIDExNSwKICAgICAgICAgIDEzMSwKICAgICAgICAgIDE2MywKICAgICAgICAgIDE5NSwKICAgICAgICAgIDIyNywKICAgICAgICAgIDI1OCwKICAgICAgICAgIDAsCiAgICAgICAgICAwCiAgICAgICAgXSk7CiAgICAgICAgdmFyIGxleHQgPSBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAxNiwKICAgICAgICAgIDE2LAogICAgICAgICAgMTYsCiAgICAgICAgICAxNiwKICAgICAgICAgIDE2LAogICAgICAgICAgMTYsCiAgICAgICAgICAxNiwKICAgICAgICAgIDE2LAogICAgICAgICAgMTcsCiAgICAgICAgICAxNywKICAgICAgICAgIDE3LAogICAgICAgICAgMTcsCiAgICAgICAgICAxOCwKICAgICAgICAgIDE4LAogICAgICAgICAgMTgsCiAgICAgICAgICAxOCwKICAgICAgICAgIDE5LAogICAgICAgICAgMTksCiAgICAgICAgICAxOSwKICAgICAgICAgIDE5LAogICAgICAgICAgMjAsCiAgICAgICAgICAyMCwKICAgICAgICAgIDIwLAogICAgICAgICAgMjAsCiAgICAgICAgICAyMSwKICAgICAgICAgIDIxLAogICAgICAgICAgMjEsCiAgICAgICAgICAyMSwKICAgICAgICAgIDE2LAogICAgICAgICAgNzIsCiAgICAgICAgICA3OAogICAgICAgIF0pOwogICAgICAgIHZhciBkYmFzZSA9IG5ldyBVaW50MTZBcnJheShbCiAgICAgICAgICAxLAogICAgICAgICAgMiwKICAgICAgICAgIDMsCiAgICAgICAgICA0LAogICAgICAgICAgNSwKICAgICAgICAgIDcsCiAgICAgICAgICA5LAogICAgICAgICAgMTMsCiAgICAgICAgICAxNywKICAgICAgICAgIDI1LAogICAgICAgICAgMzMsCiAgICAgICAgICA0OSwKICAgICAgICAgIDY1LAogICAgICAgICAgOTcsCiAgICAgICAgICAxMjksCiAgICAgICAgICAxOTMsCiAgICAgICAgICAyNTcsCiAgICAgICAgICAzODUsCiAgICAgICAgICA1MTMsCiAgICAgICAgICA3NjksCiAgICAgICAgICAxMDI1LAogICAgICAgICAgMTUzNywKICAgICAgICAgIDIwNDksCiAgICAgICAgICAzMDczLAogICAgICAgICAgNDA5NywKICAgICAgICAgIDYxNDUsCiAgICAgICAgICA4MTkzLAogICAgICAgICAgMTIyODksCiAgICAgICAgICAxNjM4NSwKICAgICAgICAgIDI0NTc3LAogICAgICAgICAgMCwKICAgICAgICAgIDAKICAgICAgICBdKTsKICAgICAgICB2YXIgZGV4dCA9IG5ldyBVaW50OEFycmF5KFsKICAgICAgICAgIDE2LAogICAgICAgICAgMTYsCiAgICAgICAgICAxNiwKICAgICAgICAgIDE2LAogICAgICAgICAgMTcsCiAgICAgICAgICAxNywKICAgICAgICAgIDE4LAogICAgICAgICAgMTgsCiAgICAgICAgICAxOSwKICAgICAgICAgIDE5LAogICAgICAgICAgMjAsCiAgICAgICAgICAyMCwKICAgICAgICAgIDIxLAogICAgICAgICAgMjEsCiAgICAgICAgICAyMiwKICAgICAgICAgIDIyLAogICAgICAgICAgMjMsCiAgICAgICAgICAyMywKICAgICAgICAgIDI0LAogICAgICAgICAgMjQsCiAgICAgICAgICAyNSwKICAgICAgICAgIDI1LAogICAgICAgICAgMjYsCiAgICAgICAgICAyNiwKICAgICAgICAgIDI3LAogICAgICAgICAgMjcsCiAgICAgICAgICAyOCwKICAgICAgICAgIDI4LAogICAgICAgICAgMjksCiAgICAgICAgICAyOSwKICAgICAgICAgIDY0LAogICAgICAgICAgNjQKICAgICAgICBdKTsKICAgICAgICB2YXIgaW5mbGF0ZV90YWJsZSA9ICh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKSA9PiB7CiAgICAgICAgICBjb25zdCBiaXRzID0gb3B0cy5iaXRzOwogICAgICAgICAgbGV0IGxlbjQgPSAwOwogICAgICAgICAgbGV0IHN5bSA9IDA7CiAgICAgICAgICBsZXQgbWluNCA9IDAsIG1heDQgPSAwOwogICAgICAgICAgbGV0IHJvb3QgPSAwOwogICAgICAgICAgbGV0IGN1cnIgPSAwOwogICAgICAgICAgbGV0IGRyb3AgPSAwOwogICAgICAgICAgbGV0IGxlZnQgPSAwOwogICAgICAgICAgbGV0IHVzZWQgPSAwOwogICAgICAgICAgbGV0IGh1ZmYgPSAwOwogICAgICAgICAgbGV0IGluY3I7CiAgICAgICAgICBsZXQgZmlsbDsKICAgICAgICAgIGxldCBsb3c7CiAgICAgICAgICBsZXQgbWFzazsKICAgICAgICAgIGxldCBuZXh0OwogICAgICAgICAgbGV0IGJhc2UgPSBudWxsOwogICAgICAgICAgbGV0IGJhc2VfaW5kZXggPSAwOwogICAgICAgICAgbGV0IGVuZDsKICAgICAgICAgIGNvbnN0IGNvdW50ID0gbmV3IFVpbnQxNkFycmF5KE1BWEJJVFMgKyAxKTsKICAgICAgICAgIGNvbnN0IG9mZnMgPSBuZXcgVWludDE2QXJyYXkoTUFYQklUUyArIDEpOwogICAgICAgICAgbGV0IGV4dHJhID0gbnVsbDsKICAgICAgICAgIGxldCBleHRyYV9pbmRleCA9IDA7CiAgICAgICAgICBsZXQgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsKICAgICAgICAgIGZvciAobGVuNCA9IDA7IGxlbjQgPD0gTUFYQklUUzsgbGVuNCsrKSB7CiAgICAgICAgICAgIGNvdW50W2xlbjRdID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7CiAgICAgICAgICAgIGNvdW50W2xlbnNbbGVuc19pbmRleCArIHN5bV1dKys7CiAgICAgICAgICB9CiAgICAgICAgICByb290ID0gYml0czsKICAgICAgICAgIGZvciAobWF4NCA9IE1BWEJJVFM7IG1heDQgPj0gMTsgbWF4NC0tKSB7CiAgICAgICAgICAgIGlmIChjb3VudFttYXg0XSAhPT0gMCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocm9vdCA+IG1heDQpIHsKICAgICAgICAgICAgcm9vdCA9IG1heDQ7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWF4NCA9PT0gMCkgewogICAgICAgICAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9IDEgPDwgMjQgfCA2NCA8PCAxNiB8IDA7CiAgICAgICAgICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gMSA8PCAyNCB8IDY0IDw8IDE2IHwgMDsKICAgICAgICAgICAgb3B0cy5iaXRzID0gMTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKG1pbjQgPSAxOyBtaW40IDwgbWF4NDsgbWluNCsrKSB7CiAgICAgICAgICAgIGlmIChjb3VudFttaW40XSAhPT0gMCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocm9vdCA8IG1pbjQpIHsKICAgICAgICAgICAgcm9vdCA9IG1pbjQ7CiAgICAgICAgICB9CiAgICAgICAgICBsZWZ0ID0gMTsKICAgICAgICAgIGZvciAobGVuNCA9IDE7IGxlbjQgPD0gTUFYQklUUzsgbGVuNCsrKSB7CiAgICAgICAgICAgIGxlZnQgPDw9IDE7CiAgICAgICAgICAgIGxlZnQgLT0gY291bnRbbGVuNF07CiAgICAgICAgICAgIGlmIChsZWZ0IDwgMCkgewogICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09PSBDT0RFUyB8fCBtYXg0ICE9PSAxKSkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzWzFdID0gMDsKICAgICAgICAgIGZvciAobGVuNCA9IDE7IGxlbjQgPCBNQVhCSVRTOyBsZW40KyspIHsKICAgICAgICAgICAgb2Zmc1tsZW40ICsgMV0gPSBvZmZzW2xlbjRdICsgY291bnRbbGVuNF07CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykgewogICAgICAgICAgICBpZiAobGVuc1tsZW5zX2luZGV4ICsgc3ltXSAhPT0gMCkgewogICAgICAgICAgICAgIHdvcmtbb2Zmc1tsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrXSA9IHN5bTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGUgPT09IENPREVTKSB7CiAgICAgICAgICAgIGJhc2UgPSBleHRyYSA9IHdvcms7CiAgICAgICAgICAgIGVuZCA9IDE5OwogICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TKSB7CiAgICAgICAgICAgIGJhc2UgPSBsYmFzZTsKICAgICAgICAgICAgYmFzZV9pbmRleCAtPSAyNTc7CiAgICAgICAgICAgIGV4dHJhID0gbGV4dDsKICAgICAgICAgICAgZXh0cmFfaW5kZXggLT0gMjU3OwogICAgICAgICAgICBlbmQgPSAyNTY7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBiYXNlID0gZGJhc2U7CiAgICAgICAgICAgIGV4dHJhID0gZGV4dDsKICAgICAgICAgICAgZW5kID0gLTE7CiAgICAgICAgICB9CiAgICAgICAgICBodWZmID0gMDsKICAgICAgICAgIHN5bSA9IDA7CiAgICAgICAgICBsZW40ID0gbWluNDsKICAgICAgICAgIG5leHQgPSB0YWJsZV9pbmRleDsKICAgICAgICAgIGN1cnIgPSByb290OwogICAgICAgICAgZHJvcCA9IDA7CiAgICAgICAgICBsb3cgPSAtMTsKICAgICAgICAgIHVzZWQgPSAxIDw8IHJvb3Q7CiAgICAgICAgICBtYXNrID0gdXNlZCAtIDE7CiAgICAgICAgICBpZiAodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMgfHwgdHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICBoZXJlX2JpdHMgPSBsZW40IC0gZHJvcDsKICAgICAgICAgICAgaWYgKHdvcmtbc3ltXSA8IGVuZCkgewogICAgICAgICAgICAgIGhlcmVfb3AgPSAwOwogICAgICAgICAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKHdvcmtbc3ltXSA+IGVuZCkgewogICAgICAgICAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCArIHdvcmtbc3ltXV07CiAgICAgICAgICAgICAgaGVyZV92YWwgPSBiYXNlW2Jhc2VfaW5kZXggKyB3b3JrW3N5bV1dOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGhlcmVfb3AgPSAzMiArIDY0OwogICAgICAgICAgICAgIGhlcmVfdmFsID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbmNyID0gMSA8PCBsZW40IC0gZHJvcDsKICAgICAgICAgICAgZmlsbCA9IDEgPDwgY3VycjsKICAgICAgICAgICAgbWluNCA9IGZpbGw7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICBmaWxsIC09IGluY3I7CiAgICAgICAgICAgICAgdGFibGVbbmV4dCArIChodWZmID4+IGRyb3ApICsgZmlsbF0gPSBoZXJlX2JpdHMgPDwgMjQgfCBoZXJlX29wIDw8IDE2IHwgaGVyZV92YWwgfCAwOwogICAgICAgICAgICB9IHdoaWxlIChmaWxsICE9PSAwKTsKICAgICAgICAgICAgaW5jciA9IDEgPDwgbGVuNCAtIDE7CiAgICAgICAgICAgIHdoaWxlIChodWZmICYgaW5jcikgewogICAgICAgICAgICAgIGluY3IgPj49IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluY3IgIT09IDApIHsKICAgICAgICAgICAgICBodWZmICY9IGluY3IgLSAxOwogICAgICAgICAgICAgIGh1ZmYgKz0gaW5jcjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBodWZmID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzeW0rKzsKICAgICAgICAgICAgaWYgKC0tY291bnRbbGVuNF0gPT09IDApIHsKICAgICAgICAgICAgICBpZiAobGVuNCA9PT0gbWF4NCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxlbjQgPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsZW40ID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9PSBsb3cpIHsKICAgICAgICAgICAgICBpZiAoZHJvcCA9PT0gMCkgewogICAgICAgICAgICAgICAgZHJvcCA9IHJvb3Q7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG5leHQgKz0gbWluNDsKICAgICAgICAgICAgICBjdXJyID0gbGVuNCAtIGRyb3A7CiAgICAgICAgICAgICAgbGVmdCA9IDEgPDwgY3VycjsKICAgICAgICAgICAgICB3aGlsZSAoY3VyciArIGRyb3AgPCBtYXg0KSB7CiAgICAgICAgICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTsKICAgICAgICAgICAgICAgIGlmIChsZWZ0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjdXJyKys7CiAgICAgICAgICAgICAgICBsZWZ0IDw8PSAxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1c2VkICs9IDEgPDwgY3VycjsKICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMgfHwgdHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykgewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxvdyA9IGh1ZmYgJiBtYXNrOwogICAgICAgICAgICAgIHRhYmxlW2xvd10gPSByb290IDw8IDI0IHwgY3VyciA8PCAxNiB8IG5leHQgLSB0YWJsZV9pbmRleCB8IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChodWZmICE9PSAwKSB7CiAgICAgICAgICAgIHRhYmxlW25leHQgKyBodWZmXSA9IGxlbjQgLSBkcm9wIDw8IDI0IHwgNjQgPDwgMTYgfCAwOwogICAgICAgICAgfQogICAgICAgICAgb3B0cy5iaXRzID0gcm9vdDsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH07CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBpbmZsYXRlX3RhYmxlOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzCiAgICB2YXIgcmVxdWlyZV9pbmZsYXRlID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICAgICB2YXIgYWRsZXIzMiA9IHJlcXVpcmVfYWRsZXIzMigpOwogICAgICAgIHZhciBjcmMzMiA9IHJlcXVpcmVfY3JjMzIoKTsKICAgICAgICB2YXIgaW5mbGF0ZV9mYXN0ID0gcmVxdWlyZV9pbmZmYXN0KCk7CiAgICAgICAgdmFyIGluZmxhdGVfdGFibGUgPSByZXF1aXJlX2luZnRyZWVzKCk7CiAgICAgICAgdmFyIENPREVTID0gMDsKICAgICAgICB2YXIgTEVOUyA9IDE7CiAgICAgICAgdmFyIERJU1RTID0gMjsKICAgICAgICB2YXIgewogICAgICAgICAgWl9GSU5JU0gsCiAgICAgICAgICBaX0JMT0NLLAogICAgICAgICAgWl9UUkVFUywKICAgICAgICAgIFpfT0ssCiAgICAgICAgICBaX1NUUkVBTV9FTkQsCiAgICAgICAgICBaX05FRURfRElDVCwKICAgICAgICAgIFpfU1RSRUFNX0VSUk9SLAogICAgICAgICAgWl9EQVRBX0VSUk9SLAogICAgICAgICAgWl9NRU1fRVJST1IsCiAgICAgICAgICBaX0JVRl9FUlJPUiwKICAgICAgICAgIFpfREVGTEFURUQKICAgICAgICB9ID0gcmVxdWlyZV9jb25zdGFudHMoKTsKICAgICAgICB2YXIgSEVBRCA9IDE7CiAgICAgICAgdmFyIEZMQUdTID0gMjsKICAgICAgICB2YXIgVElNRSA9IDM7CiAgICAgICAgdmFyIE9TID0gNDsKICAgICAgICB2YXIgRVhMRU4gPSA1OwogICAgICAgIHZhciBFWFRSQSA9IDY7CiAgICAgICAgdmFyIE5BTUUgPSA3OwogICAgICAgIHZhciBDT01NRU5UID0gODsKICAgICAgICB2YXIgSENSQyA9IDk7CiAgICAgICAgdmFyIERJQ1RJRCA9IDEwOwogICAgICAgIHZhciBESUNUID0gMTE7CiAgICAgICAgdmFyIFRZUEUgPSAxMjsKICAgICAgICB2YXIgVFlQRURPID0gMTM7CiAgICAgICAgdmFyIFNUT1JFRCA9IDE0OwogICAgICAgIHZhciBDT1BZXyA9IDE1OwogICAgICAgIHZhciBDT1BZID0gMTY7CiAgICAgICAgdmFyIFRBQkxFID0gMTc7CiAgICAgICAgdmFyIExFTkxFTlMgPSAxODsKICAgICAgICB2YXIgQ09ERUxFTlMgPSAxOTsKICAgICAgICB2YXIgTEVOXyA9IDIwOwogICAgICAgIHZhciBMRU4gPSAyMTsKICAgICAgICB2YXIgTEVORVhUID0gMjI7CiAgICAgICAgdmFyIERJU1QgPSAyMzsKICAgICAgICB2YXIgRElTVEVYVCA9IDI0OwogICAgICAgIHZhciBNQVRDSCA9IDI1OwogICAgICAgIHZhciBMSVQgPSAyNjsKICAgICAgICB2YXIgQ0hFQ0sgPSAyNzsKICAgICAgICB2YXIgTEVOR1RIID0gMjg7CiAgICAgICAgdmFyIERPTkUgPSAyOTsKICAgICAgICB2YXIgQkFEID0gMzA7CiAgICAgICAgdmFyIE1FTSA9IDMxOwogICAgICAgIHZhciBTWU5DID0gMzI7CiAgICAgICAgdmFyIEVOT1VHSF9MRU5TID0gODUyOwogICAgICAgIHZhciBFTk9VR0hfRElTVFMgPSA1OTI7CiAgICAgICAgdmFyIE1BWF9XQklUUyA9IDE1OwogICAgICAgIHZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7CiAgICAgICAgdmFyIHpzd2FwMzIgPSAocSkgPT4gewogICAgICAgICAgcmV0dXJuIChxID4+PiAyNCAmIDI1NSkgKyAocSA+Pj4gOCAmIDY1MjgwKSArICgocSAmIDY1MjgwKSA8PCA4KSArICgocSAmIDI1NSkgPDwgMjQpOwogICAgICAgIH07CiAgICAgICAgZnVuY3Rpb24gSW5mbGF0ZVN0YXRlKCkgewogICAgICAgICAgdGhpcy5tb2RlID0gMDsKICAgICAgICAgIHRoaXMubGFzdCA9IGZhbHNlOwogICAgICAgICAgdGhpcy53cmFwID0gMDsKICAgICAgICAgIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuZmxhZ3MgPSAwOwogICAgICAgICAgdGhpcy5kbWF4ID0gMDsKICAgICAgICAgIHRoaXMuY2hlY2sgPSAwOwogICAgICAgICAgdGhpcy50b3RhbCA9IDA7CiAgICAgICAgICB0aGlzLmhlYWQgPSBudWxsOwogICAgICAgICAgdGhpcy53Yml0cyA9IDA7CiAgICAgICAgICB0aGlzLndzaXplID0gMDsKICAgICAgICAgIHRoaXMud2hhdmUgPSAwOwogICAgICAgICAgdGhpcy53bmV4dCA9IDA7CiAgICAgICAgICB0aGlzLndpbmRvdyA9IG51bGw7CiAgICAgICAgICB0aGlzLmhvbGQgPSAwOwogICAgICAgICAgdGhpcy5iaXRzID0gMDsKICAgICAgICAgIHRoaXMubGVuZ3RoID0gMDsKICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKICAgICAgICAgIHRoaXMuZXh0cmEgPSAwOwogICAgICAgICAgdGhpcy5sZW5jb2RlID0gbnVsbDsKICAgICAgICAgIHRoaXMuZGlzdGNvZGUgPSBudWxsOwogICAgICAgICAgdGhpcy5sZW5iaXRzID0gMDsKICAgICAgICAgIHRoaXMuZGlzdGJpdHMgPSAwOwogICAgICAgICAgdGhpcy5uY29kZSA9IDA7CiAgICAgICAgICB0aGlzLm5sZW4gPSAwOwogICAgICAgICAgdGhpcy5uZGlzdCA9IDA7CiAgICAgICAgICB0aGlzLmhhdmUgPSAwOwogICAgICAgICAgdGhpcy5uZXh0ID0gbnVsbDsKICAgICAgICAgIHRoaXMubGVucyA9IG5ldyBVaW50MTZBcnJheSgzMjApOwogICAgICAgICAgdGhpcy53b3JrID0gbmV3IFVpbnQxNkFycmF5KDI4OCk7CiAgICAgICAgICB0aGlzLmxlbmR5biA9IG51bGw7CiAgICAgICAgICB0aGlzLmRpc3RkeW4gPSBudWxsOwogICAgICAgICAgdGhpcy5zYW5lID0gMDsKICAgICAgICAgIHRoaXMuYmFjayA9IDA7CiAgICAgICAgICB0aGlzLndhcyA9IDA7CiAgICAgICAgfQogICAgICAgIHZhciBpbmZsYXRlUmVzZXRLZWVwID0gKHN0cm0pID0+IHsKICAgICAgICAgIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgewogICAgICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHN0cm0uc3RhdGU7CiAgICAgICAgICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50b3RhbCA9IDA7CiAgICAgICAgICBzdHJtLm1zZyA9ICIiOwogICAgICAgICAgaWYgKHN0YXRlLndyYXApIHsKICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLndyYXAgJiAxOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGUubW9kZSA9IEhFQUQ7CiAgICAgICAgICBzdGF0ZS5sYXN0ID0gMDsKICAgICAgICAgIHN0YXRlLmhhdmVkaWN0ID0gMDsKICAgICAgICAgIHN0YXRlLmRtYXggPSAzMjc2ODsKICAgICAgICAgIHN0YXRlLmhlYWQgPSBudWxsOwogICAgICAgICAgc3RhdGUuaG9sZCA9IDA7CiAgICAgICAgICBzdGF0ZS5iaXRzID0gMDsKICAgICAgICAgIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW4gPSBuZXcgSW50MzJBcnJheShFTk9VR0hfTEVOUyk7CiAgICAgICAgICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW4gPSBuZXcgSW50MzJBcnJheShFTk9VR0hfRElTVFMpOwogICAgICAgICAgc3RhdGUuc2FuZSA9IDE7CiAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7CiAgICAgICAgICByZXR1cm4gWl9PSzsKICAgICAgICB9OwogICAgICAgIHZhciBpbmZsYXRlUmVzZXQgPSAoc3RybSkgPT4gewogICAgICAgICAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7CiAgICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHN0YXRlID0gc3RybS5zdGF0ZTsKICAgICAgICAgIHN0YXRlLndzaXplID0gMDsKICAgICAgICAgIHN0YXRlLndoYXZlID0gMDsKICAgICAgICAgIHN0YXRlLnduZXh0ID0gMDsKICAgICAgICAgIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pOwogICAgICAgIH07CiAgICAgICAgdmFyIGluZmxhdGVSZXNldDIgPSAoc3RybSwgd2luZG93Qml0cykgPT4gewogICAgICAgICAgbGV0IHdyYXA7CiAgICAgICAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgICAgICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7CiAgICAgICAgICAgIHdyYXAgPSAwOwogICAgICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxOwogICAgICAgICAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7CiAgICAgICAgICAgICAgd2luZG93Qml0cyAmPSAxNTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHdpbmRvd0JpdHMgJiYgKHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkpIHsKICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlLndpbmRvdyAhPT0gbnVsbCAmJiBzdGF0ZS53Yml0cyAhPT0gd2luZG93Qml0cykgewogICAgICAgICAgICBzdGF0ZS53aW5kb3cgPSBudWxsOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGUud3JhcCA9IHdyYXA7CiAgICAgICAgICBzdGF0ZS53Yml0cyA9IHdpbmRvd0JpdHM7CiAgICAgICAgICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pOwogICAgICAgIH07CiAgICAgICAgdmFyIGluZmxhdGVJbml0MiA9IChzdHJtLCB3aW5kb3dCaXRzKSA9PiB7CiAgICAgICAgICBpZiAoIXN0cm0pIHsKICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7CiAgICAgICAgICBzdHJtLnN0YXRlID0gc3RhdGU7CiAgICAgICAgICBzdGF0ZS53aW5kb3cgPSBudWxsOwogICAgICAgICAgY29uc3QgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTsKICAgICAgICAgIGlmIChyZXQgIT09IFpfT0spIHsKICAgICAgICAgICAgc3RybS5zdGF0ZSA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH07CiAgICAgICAgdmFyIGluZmxhdGVJbml0ID0gKHN0cm0pID0+IHsKICAgICAgICAgIHJldHVybiBpbmZsYXRlSW5pdDIoc3RybSwgREVGX1dCSVRTKTsKICAgICAgICB9OwogICAgICAgIHZhciB2aXJnaW4gPSB0cnVlOwogICAgICAgIHZhciBsZW5maXg7CiAgICAgICAgdmFyIGRpc3RmaXg7CiAgICAgICAgdmFyIGZpeGVkdGFibGVzID0gKHN0YXRlKSA9PiB7CiAgICAgICAgICBpZiAodmlyZ2luKSB7CiAgICAgICAgICAgIGxlbmZpeCA9IG5ldyBJbnQzMkFycmF5KDUxMik7CiAgICAgICAgICAgIGRpc3RmaXggPSBuZXcgSW50MzJBcnJheSgzMik7CiAgICAgICAgICAgIGxldCBzeW0gPSAwOwogICAgICAgICAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7CiAgICAgICAgICAgICAgc3RhdGUubGVuc1tzeW0rK10gPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChzeW0gPCAyNTYpIHsKICAgICAgICAgICAgICBzdGF0ZS5sZW5zW3N5bSsrXSA9IDk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN5bSA8IDI4MCkgewogICAgICAgICAgICAgIHN0YXRlLmxlbnNbc3ltKytdID0gNzsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoc3ltIDwgMjg4KSB7CiAgICAgICAgICAgICAgc3RhdGUubGVuc1tzeW0rK10gPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTsKICAgICAgICAgICAgc3ltID0gMDsKICAgICAgICAgICAgd2hpbGUgKHN5bSA8IDMyKSB7CiAgICAgICAgICAgICAgc3RhdGUubGVuc1tzeW0rK10gPSA1OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7CiAgICAgICAgICAgIHZpcmdpbiA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDsKICAgICAgICAgIHN0YXRlLmxlbmJpdHMgPSA5OwogICAgICAgICAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4OwogICAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSA1OwogICAgICAgIH07CiAgICAgICAgdmFyIHVwZGF0ZXdpbmRvdyA9IChzdHJtLCBzcmMsIGVuZCwgY29weTcpID0+IHsKICAgICAgICAgIGxldCBkaXN0MzsKICAgICAgICAgIGNvbnN0IHN0YXRlID0gc3RybS5zdGF0ZTsKICAgICAgICAgIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHsKICAgICAgICAgICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzOwogICAgICAgICAgICBzdGF0ZS53bmV4dCA9IDA7CiAgICAgICAgICAgIHN0YXRlLndoYXZlID0gMDsKICAgICAgICAgICAgc3RhdGUud2luZG93ID0gbmV3IFVpbnQ4QXJyYXkoc3RhdGUud3NpemUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvcHk3ID49IHN0YXRlLndzaXplKSB7CiAgICAgICAgICAgIHN0YXRlLndpbmRvdy5zZXQoc3JjLnN1YmFycmF5KGVuZCAtIHN0YXRlLndzaXplLCBlbmQpLCAwKTsKICAgICAgICAgICAgc3RhdGUud25leHQgPSAwOwogICAgICAgICAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZGlzdDMgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0OwogICAgICAgICAgICBpZiAoZGlzdDMgPiBjb3B5NykgewogICAgICAgICAgICAgIGRpc3QzID0gY29weTc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUud2luZG93LnNldChzcmMuc3ViYXJyYXkoZW5kIC0gY29weTcsIGVuZCAtIGNvcHk3ICsgZGlzdDMpLCBzdGF0ZS53bmV4dCk7CiAgICAgICAgICAgIGNvcHk3IC09IGRpc3QzOwogICAgICAgICAgICBpZiAoY29weTcpIHsKICAgICAgICAgICAgICBzdGF0ZS53aW5kb3cuc2V0KHNyYy5zdWJhcnJheShlbmQgLSBjb3B5NywgZW5kKSwgMCk7CiAgICAgICAgICAgICAgc3RhdGUud25leHQgPSBjb3B5NzsKICAgICAgICAgICAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHN0YXRlLnduZXh0ICs9IGRpc3QzOwogICAgICAgICAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsKICAgICAgICAgICAgICAgIHN0YXRlLnduZXh0ID0gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHN0YXRlLndoYXZlIDwgc3RhdGUud3NpemUpIHsKICAgICAgICAgICAgICAgIHN0YXRlLndoYXZlICs9IGRpc3QzOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfTsKICAgICAgICB2YXIgaW5mbGF0ZSA9IChzdHJtLCBmbHVzaCkgPT4gewogICAgICAgICAgbGV0IHN0YXRlOwogICAgICAgICAgbGV0IGlucHV0LCBvdXRwdXQ7CiAgICAgICAgICBsZXQgbmV4dDsKICAgICAgICAgIGxldCBwdXQ7CiAgICAgICAgICBsZXQgaGF2ZSwgbGVmdDsKICAgICAgICAgIGxldCBob2xkOwogICAgICAgICAgbGV0IGJpdHM7CiAgICAgICAgICBsZXQgX2luLCBfb3V0OwogICAgICAgICAgbGV0IGNvcHk3OwogICAgICAgICAgbGV0IGZyb207CiAgICAgICAgICBsZXQgZnJvbV9zb3VyY2U7CiAgICAgICAgICBsZXQgaGVyZSA9IDA7CiAgICAgICAgICBsZXQgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsKICAgICAgICAgIGxldCBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOwogICAgICAgICAgbGV0IGxlbjQ7CiAgICAgICAgICBsZXQgcmV0OwogICAgICAgICAgY29uc3QgaGJ1ZiA9IG5ldyBVaW50OEFycmF5KDQpOwogICAgICAgICAgbGV0IG9wdHM7CiAgICAgICAgICBsZXQgbjsKICAgICAgICAgIGNvbnN0IG9yZGVyID0gbmV3IFVpbnQ4QXJyYXkoWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdKTsKICAgICAgICAgIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fCAhc3RybS5vdXRwdXQgfHwgIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkgewogICAgICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICAgICAgICB9CiAgICAgICAgICBzdGF0ZSA9IHN0cm0uc3RhdGU7CiAgICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgewogICAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRURPOwogICAgICAgICAgfQogICAgICAgICAgcHV0ID0gc3RybS5uZXh0X291dDsKICAgICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0OwogICAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0OwogICAgICAgICAgbmV4dCA9IHN0cm0ubmV4dF9pbjsKICAgICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDsKICAgICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luOwogICAgICAgICAgaG9sZCA9IHN0YXRlLmhvbGQ7CiAgICAgICAgICBiaXRzID0gc3RhdGUuYml0czsKICAgICAgICAgIF9pbiA9IGhhdmU7CiAgICAgICAgICBfb3V0ID0gbGVmdDsKICAgICAgICAgIHJldCA9IFpfT0s7CiAgICAgICAgICBpbmZfbGVhdmU6CiAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUubW9kZSkgewogICAgICAgICAgICAgICAgY2FzZSBIRUFEOgogICAgICAgICAgICAgICAgICBpZiAoc3RhdGUud3JhcCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikgewogICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLndyYXAgJiAyICYmIGhvbGQgPT09IDM1NjE1KSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSAwOwogICAgICAgICAgICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMjU1OwogICAgICAgICAgICAgICAgICAgIGhidWZbMV0gPSBob2xkID4+PiA4ICYgMjU1OwogICAgICAgICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApOwogICAgICAgICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdGF0ZS5mbGFncyA9IDA7CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5kb25lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKCEoc3RhdGUud3JhcCAmIDEpIHx8ICgoKGhvbGQgJiAyNTUpIDw8IDgpICsgKGhvbGQgPj4gOCkpICUgMzEpIHsKICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIjsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmICgoaG9sZCAmIDE1KSAhPT0gWl9ERUZMQVRFRCkgewogICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSA0OwogICAgICAgICAgICAgICAgICBiaXRzIC09IDQ7CiAgICAgICAgICAgICAgICAgIGxlbjQgPSAoaG9sZCAmIDE1KSArIDg7CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS53Yml0cyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLndiaXRzID0gbGVuNDsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZW40ID4gc3RhdGUud2JpdHMpIHsKICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIHdpbmRvdyBzaXplIjsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHN0YXRlLmRtYXggPSAxIDw8IHN0YXRlLndiaXRzOwogICAgICAgICAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAxOwogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gaG9sZCAmIDUxMiA/IERJQ1RJRCA6IFRZUEU7CiAgICAgICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEZMQUdTOgogICAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdGF0ZS5mbGFncyA9IGhvbGQ7CiAgICAgICAgICAgICAgICAgIGlmICgoc3RhdGUuZmxhZ3MgJiAyNTUpICE9PSBaX0RFRkxBVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAidW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgNTczNDQpIHsKICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSBob2xkID4+IDggJiAxOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDUxMikgewogICAgICAgICAgICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMjU1OwogICAgICAgICAgICAgICAgICAgIGhidWZbMV0gPSBob2xkID4+PiA4ICYgMjU1OwogICAgICAgICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IFRJTUU7CiAgICAgICAgICAgICAgICBjYXNlIFRJTUU6CiAgICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiA1MTIpIHsKICAgICAgICAgICAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDI1NTsKICAgICAgICAgICAgICAgICAgICBoYnVmWzFdID0gaG9sZCA+Pj4gOCAmIDI1NTsKICAgICAgICAgICAgICAgICAgICBoYnVmWzJdID0gaG9sZCA+Pj4gMTYgJiAyNTU7CiAgICAgICAgICAgICAgICAgICAgaGJ1ZlszXSA9IGhvbGQgPj4+IDI0ICYgMjU1OwogICAgICAgICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDQsIDApOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IE9TOwogICAgICAgICAgICAgICAgY2FzZSBPUzoKICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikgewogICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IGhvbGQgJiAyNTU7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5vcyA9IGhvbGQgPj4gODsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiA1MTIpIHsKICAgICAgICAgICAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDI1NTsKICAgICAgICAgICAgICAgICAgICBoYnVmWzFdID0gaG9sZCA+Pj4gOCAmIDI1NTsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBob2xkID0gMDsKICAgICAgICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjsKICAgICAgICAgICAgICAgIGNhc2UgRVhMRU46CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDEwMjQpIHsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZDsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkgewogICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiA1MTIpIHsKICAgICAgICAgICAgICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMjU1OwogICAgICAgICAgICAgICAgICAgICAgaGJ1ZlsxXSA9IGhvbGQgPj4+IDggJiAyNTU7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaGVhZCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTsKICAgICAgICAgICAgICAgIGNhc2UgRVhUUkE6CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDEwMjQpIHsKICAgICAgICAgICAgICAgICAgICBjb3B5NyA9IHN0YXRlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoY29weTcgPiBoYXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb3B5NyA9IGhhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjb3B5NykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGVuNCA9IHN0YXRlLmhlYWQuZXh0cmFfbGVuIC0gc3RhdGUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbmV3IFVpbnQ4QXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEuc2V0KGlucHV0LnN1YmFycmF5KG5leHQsIG5leHQgKyBjb3B5NyksIGxlbjQpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgNTEyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5NywgbmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk3OwogICAgICAgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5NzsKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5NzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdGF0ZS5sZW5ndGggPSAwOwogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gTkFNRTsKICAgICAgICAgICAgICAgIGNhc2UgTkFNRToKICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMjA0OCkgewogICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvcHk3ID0gMDsKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICBsZW40ID0gaW5wdXRbbmV4dCArIGNvcHk3KytdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuNCAmJiBzdGF0ZS5sZW5ndGggPCA2NTUzNikgewogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW40KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW40ICYmIGNvcHk3IDwgaGF2ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgNTEyKSB7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weTcsIG5leHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk3OwogICAgICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTc7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbjQpIHsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaGVhZCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3RhdGUubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IENPTU1FTlQ7CiAgICAgICAgICAgICAgICBjYXNlIENPTU1FTlQ6CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDQwOTYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb3B5NyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgbGVuNCA9IGlucHV0W25leHQgKyBjb3B5NysrXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbjQgJiYgc3RhdGUubGVuZ3RoIDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuNCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuNCAmJiBjb3B5NyA8IGhhdmUpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDUxMikgewogICAgICAgICAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHk3LCBuZXh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5NzsKICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk3OwogICAgICAgICAgICAgICAgICAgIGlmIChsZW40KSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDOwogICAgICAgICAgICAgICAgY2FzZSBIQ1JDOgogICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiA1MTIpIHsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDY1NTM1KSkgewogICAgICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaGVhZGVyIGNyYyBtaXNtYXRjaCI7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gc3RhdGUuZmxhZ3MgPj4gOSAmIDE7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAwOwogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIERJQ1RJRDoKICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikgewogICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0genN3YXAzMihob2xkKTsKICAgICAgICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gRElDVDsKICAgICAgICAgICAgICAgIGNhc2UgRElDVDoKICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmVkaWN0ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDsKICAgICAgICAgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7CiAgICAgICAgICAgICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDsKICAgICAgICAgICAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0czsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWl9ORUVEX0RJQ1Q7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMTsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7CiAgICAgICAgICAgICAgICBjYXNlIFRZUEU6CiAgICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9CTE9DSyB8fCBmbHVzaCA9PT0gWl9UUkVFUykgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSBUWVBFRE86CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5sYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3OwogICAgICAgICAgICAgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMykgewogICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3RhdGUubGFzdCA9IGhvbGQgJiAxOwogICAgICAgICAgICAgICAgICBob2xkID4+Pj0gMTsKICAgICAgICAgICAgICAgICAgYml0cyAtPSAxOwogICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhvbGQgJiAzKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IFNUT1JFRDsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSAyOwogICAgICAgICAgICAgICAgICAgICAgICBiaXRzIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgYmxvY2sgdHlwZSI7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSAyOwogICAgICAgICAgICAgICAgICBiaXRzIC09IDI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTVE9SRUQ6CiAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNzsKICAgICAgICAgICAgICAgICAgYml0cyAtPSBiaXRzICYgNzsKICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikgewogICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKChob2xkICYgNjU1MzUpICE9PSAoaG9sZCA+Pj4gMTYgXiA2NTUzNSkpIHsKICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIjsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQgJiA2NTUzNTsKICAgICAgICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQ09QWV87CiAgICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSBDT1BZXzoKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IENPUFk7CiAgICAgICAgICAgICAgICBjYXNlIENPUFk6CiAgICAgICAgICAgICAgICAgIGNvcHk3ID0gc3RhdGUubGVuZ3RoOwogICAgICAgICAgICAgICAgICBpZiAoY29weTcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29weTcgPiBoYXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb3B5NyA9IGhhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjb3B5NyA+IGxlZnQpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvcHk3ID0gbGVmdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvcHk3ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG91dHB1dC5zZXQoaW5wdXQuc3ViYXJyYXkobmV4dCwgbmV4dCArIGNvcHk3KSwgcHV0KTsKICAgICAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk3OwogICAgICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTc7CiAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5NzsKICAgICAgICAgICAgICAgICAgICBwdXQgKz0gY29weTc7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk3OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgVEFCTEU6CiAgICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHN0YXRlLm5sZW4gPSAoaG9sZCAmIDMxKSArIDI1NzsKICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IDU7CiAgICAgICAgICAgICAgICAgIGJpdHMgLT0gNTsKICAgICAgICAgICAgICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDMxKSArIDE7CiAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSA1OwogICAgICAgICAgICAgICAgICBiaXRzIC09IDU7CiAgICAgICAgICAgICAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAxNSkgKyA0OwogICAgICAgICAgICAgICAgICBob2xkID4+Pj0gNDsKICAgICAgICAgICAgICAgICAgYml0cyAtPSA0OwogICAgICAgICAgICAgICAgICBpZiAoc3RhdGUubmxlbiA+IDI4NiB8fCBzdGF0ZS5uZGlzdCA+IDMwKSB7CiAgICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAidG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3RhdGUuaGF2ZSA9IDA7CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5MRU5TOwogICAgICAgICAgICAgICAgY2FzZSBMRU5MRU5TOgogICAgICAgICAgICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IGhvbGQgJiA3OwogICAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSAzOwogICAgICAgICAgICAgICAgICAgIGJpdHMgLT0gMzsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5bjsKICAgICAgICAgICAgICAgICAgc3RhdGUubGVuYml0cyA9IDc7CiAgICAgICAgICAgICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTsKICAgICAgICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUubGVucywgMCwgMTksIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpOwogICAgICAgICAgICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzOwogICAgICAgICAgICAgICAgICBpZiAocmV0KSB7CiAgICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHN0YXRlLmhhdmUgPSAwOwogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7CiAgICAgICAgICAgICAgICBjYXNlIENPREVMRU5TOgogICAgICAgICAgICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkgewogICAgICAgICAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDsKICAgICAgICAgICAgICAgICAgICAgIGhlcmVfb3AgPSBoZXJlID4+PiAxNiAmIDI1NTsKICAgICAgICAgICAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDY1NTM1OwogICAgICAgICAgICAgICAgICAgICAgaWYgKGhlcmVfYml0cyA8PSBiaXRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBoZXJlX3ZhbDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgaWYgKGhlcmVfdmFsID09PSAxNikgewogICAgICAgICAgICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0czsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxlbjQgPSBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUgLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29weTcgPSAzICsgKGhvbGQgJiAzKTsKICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgLT0gMjsKICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVyZV92YWwgPT09IDE3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICAgICAgICBsZW40ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgY29weTcgPSAzICsgKGhvbGQgJiA3KTsKICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IDM7CiAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgLT0gMzsKICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3OwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICAgICAgICBsZW40ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgY29weTcgPSAxMSArIChob2xkICYgMTI3KTsKICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IDc7CiAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgLT0gNzsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlICsgY29weTcgPiBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHk3LS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuNDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3RhdGUubGVuYml0cyA9IDk7CiAgICAgICAgICAgICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTsKICAgICAgICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS5sZW5zLCAwLCBzdGF0ZS5ubGVuLCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTsKICAgICAgICAgICAgICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0czsKICAgICAgICAgICAgICAgICAgaWYgKHJldCkgewogICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCI7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdGF0ZS5kaXN0Yml0cyA9IDY7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjsKICAgICAgICAgICAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUuZGlzdGJpdHMgfTsKICAgICAgICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTsKICAgICAgICAgICAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSBvcHRzLmJpdHM7CiAgICAgICAgICAgICAgICAgIGlmIChyZXQpIHsKICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IExFTl87CiAgICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSBMRU5fOgogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOOwogICAgICAgICAgICAgICAgY2FzZSBMRU46CiAgICAgICAgICAgICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHsKICAgICAgICAgICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0OwogICAgICAgICAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDsKICAgICAgICAgICAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0OwogICAgICAgICAgICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzOwogICAgICAgICAgICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBfb3V0KTsKICAgICAgICAgICAgICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0OwogICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0OwogICAgICAgICAgICAgICAgICAgIGxlZnQgPSBzdHJtLmF2YWlsX291dDsKICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luOwogICAgICAgICAgICAgICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDsKICAgICAgICAgICAgICAgICAgICBoYXZlID0gc3RybS5hdmFpbF9pbjsKICAgICAgICAgICAgICAgICAgICBob2xkID0gc3RhdGUuaG9sZDsKICAgICAgICAgICAgICAgICAgICBiaXRzID0gc3RhdGUuYml0czsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgc3RhdGUuYmFjayA9IC0xOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdGF0ZS5iYWNrID0gMDsKICAgICAgICAgICAgICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMV07CiAgICAgICAgICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgICAgICAgICAgICAgaGVyZV9vcCA9IGhlcmUgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDY1NTM1OwogICAgICAgICAgICAgICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgewogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGhlcmVfb3AgJiYgKGhlcmVfb3AgJiAyNDApID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wOwogICAgICAgICAgICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7CiAgICAgICAgICAgICAgICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArICgoaG9sZCAmICgxIDw8IGxhc3RfYml0cyArIGxhc3Rfb3ApIC0gMSkgPj4gbGFzdF9iaXRzKV07CiAgICAgICAgICAgICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDsKICAgICAgICAgICAgICAgICAgICAgIGhlcmVfb3AgPSBoZXJlID4+PiAxNiAmIDI1NTsKICAgICAgICAgICAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDY1NTM1OwogICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfYml0cyArIGhlcmVfYml0cyA8PSBiaXRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7CiAgICAgICAgICAgICAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0czsKICAgICAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICBzdGF0ZS5sZW5ndGggPSBoZXJlX3ZhbDsKICAgICAgICAgICAgICAgICAgaWYgKGhlcmVfb3AgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gTElUOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChoZXJlX29wICYgMzIpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGhlcmVfb3AgJiA2NCkgewogICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdGF0ZS5leHRyYSA9IGhlcmVfb3AgJiAxNTsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IExFTkVYVDsKICAgICAgICAgICAgICAgIGNhc2UgTEVORVhUOgogICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZXh0cmEpIHsKICAgICAgICAgICAgICAgICAgICBuID0gc3RhdGUuZXh0cmE7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoMSA8PCBzdGF0ZS5leHRyYSkgLSAxOwogICAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTsKICAgICAgICAgICAgICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoOwogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gRElTVDsKICAgICAgICAgICAgICAgIGNhc2UgRElTVDoKICAgICAgICAgICAgICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxXTsKICAgICAgICAgICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDsKICAgICAgICAgICAgICAgICAgICBoZXJlX29wID0gaGVyZSA+Pj4gMTYgJiAyNTU7CiAgICAgICAgICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgNjU1MzU7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhlcmVfYml0cyA8PSBiaXRzKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoKGhlcmVfb3AgJiAyNDApID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wOwogICAgICAgICAgICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7CiAgICAgICAgICAgICAgICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbbGFzdF92YWwgKyAoKGhvbGQgJiAoMSA8PCBsYXN0X2JpdHMgKyBsYXN0X29wKSAtIDEpID4+IGxhc3RfYml0cyldOwogICAgICAgICAgICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgICAgICAgICAgICAgICBoZXJlX29wID0gaGVyZSA+Pj4gMTYgJiAyNTU7CiAgICAgICAgICAgICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X2JpdHMgKyBoZXJlX2JpdHMgPD0gYml0cykgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzOwogICAgICAgICAgICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0czsKICAgICAgICAgICAgICAgICAgaWYgKGhlcmVfb3AgJiA2NCkgewogICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgZGlzdGFuY2UgY29kZSI7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdGF0ZS5vZmZzZXQgPSBoZXJlX3ZhbDsKICAgICAgICAgICAgICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUOwogICAgICAgICAgICAgICAgY2FzZSBESVNURVhUOgogICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZXh0cmEpIHsKICAgICAgICAgICAgICAgICAgICBuID0gc3RhdGUuZXh0cmE7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGUub2Zmc2V0ICs9IGhvbGQgJiAoMSA8PCBzdGF0ZS5leHRyYSkgLSAxOwogICAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTsKICAgICAgICAgICAgICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IHN0YXRlLmRtYXgpIHsKICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gTUFUQ0g7CiAgICAgICAgICAgICAgICBjYXNlIE1BVENIOgogICAgICAgICAgICAgICAgICBpZiAobGVmdCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBjb3B5NyA9IF9vdXQgLSBsZWZ0OwogICAgICAgICAgICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gY29weTcpIHsKICAgICAgICAgICAgICAgICAgICBjb3B5NyA9IHN0YXRlLm9mZnNldCAtIGNvcHk3OwogICAgICAgICAgICAgICAgICAgIGlmIChjb3B5NyA+IHN0YXRlLndoYXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY29weTcgPiBzdGF0ZS53bmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgY29weTcgLT0gc3RhdGUud25leHQ7CiAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUud3NpemUgLSBjb3B5NzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjb3B5NyA+IHN0YXRlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29weTcgPSBzdGF0ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93OwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0OwogICAgICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS5vZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgY29weTcgPSBzdGF0ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNvcHk3ID4gbGVmdCkgewogICAgICAgICAgICAgICAgICAgIGNvcHk3ID0gbGVmdDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk3OwogICAgICAgICAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTc7CiAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRbcHV0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5Nyk7CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBMSVQ6CiAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSBzdGF0ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgIGxlZnQtLTsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IExFTjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIENIRUNLOgogICAgICAgICAgICAgICAgICBpZiAoc3RhdGUud3JhcCkgewogICAgICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfb3V0IC09IGxlZnQ7CiAgICAgICAgICAgICAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gX291dDsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS50b3RhbCArPSBfb3V0OwogICAgICAgICAgICAgICAgICAgIGlmIChfb3V0KSB7CiAgICAgICAgICAgICAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSBzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX291dCA9IGxlZnQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHsKICAgICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImluY29ycmVjdCBkYXRhIGNoZWNrIjsKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IExFTkdUSDsKICAgICAgICAgICAgICAgIGNhc2UgTEVOR1RIOgogICAgICAgICAgICAgICAgICBpZiAoc3RhdGUud3JhcCAmJiBzdGF0ZS5mbGFncykgewogICAgICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLnRvdGFsICYgNDI5NDk2NzI5NSkpIHsKICAgICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImluY29ycmVjdCBsZW5ndGggY2hlY2siOwogICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBob2xkID0gMDsKICAgICAgICAgICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gRE9ORTsKICAgICAgICAgICAgICAgIGNhc2UgRE9ORToKICAgICAgICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EOwogICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICBjYXNlIEJBRDoKICAgICAgICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOwogICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICBjYXNlIE1FTToKICAgICAgICAgICAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOwogICAgICAgICAgICAgICAgY2FzZSBTWU5DOgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDsKICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDsKICAgICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7CiAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTsKICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkOwogICAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7CiAgICAgICAgICBpZiAoc3RhdGUud3NpemUgfHwgX291dCAhPT0gc3RybS5hdmFpbF9vdXQgJiYgc3RhdGUubW9kZSA8IEJBRCAmJiAoc3RhdGUubW9kZSA8IENIRUNLIHx8IGZsdXNoICE9PSBaX0ZJTklTSCkpIHsKICAgICAgICAgICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCwgX291dCAtIHN0cm0uYXZhaWxfb3V0KSkgOwogICAgICAgICAgfQogICAgICAgICAgX2luIC09IHN0cm0uYXZhaWxfaW47CiAgICAgICAgICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0OwogICAgICAgICAgc3RybS50b3RhbF9pbiArPSBfaW47CiAgICAgICAgICBzdHJtLnRvdGFsX291dCArPSBfb3V0OwogICAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDsKICAgICAgICAgIGlmIChzdGF0ZS53cmFwICYmIF9vdXQpIHsKICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KTsKICAgICAgICAgIH0KICAgICAgICAgIHN0cm0uZGF0YV90eXBlID0gc3RhdGUuYml0cyArIChzdGF0ZS5sYXN0ID8gNjQgOiAwKSArIChzdGF0ZS5tb2RlID09PSBUWVBFID8gMTI4IDogMCkgKyAoc3RhdGUubW9kZSA9PT0gTEVOXyB8fCBzdGF0ZS5tb2RlID09PSBDT1BZXyA/IDI1NiA6IDApOwogICAgICAgICAgaWYgKChfaW4gPT09IDAgJiYgX291dCA9PT0gMCB8fCBmbHVzaCA9PT0gWl9GSU5JU0gpICYmIHJldCA9PT0gWl9PSykgewogICAgICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfTsKICAgICAgICB2YXIgaW5mbGF0ZUVuZCA9IChzdHJtKSA9PiB7CiAgICAgICAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgbGV0IHN0YXRlID0gc3RybS5zdGF0ZTsKICAgICAgICAgIGlmIChzdGF0ZS53aW5kb3cpIHsKICAgICAgICAgICAgc3RhdGUud2luZG93ID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHN0cm0uc3RhdGUgPSBudWxsOwogICAgICAgICAgcmV0dXJuIFpfT0s7CiAgICAgICAgfTsKICAgICAgICB2YXIgaW5mbGF0ZUdldEhlYWRlciA9IChzdHJtLCBoZWFkKSA9PiB7CiAgICAgICAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGUuaGVhZCA9IGhlYWQ7CiAgICAgICAgICBoZWFkLmRvbmUgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiBaX09LOwogICAgICAgIH07CiAgICAgICAgdmFyIGluZmxhdGVTZXREaWN0aW9uYXJ5ID0gKHN0cm0sIGRpY3Rpb25hcnkpID0+IHsKICAgICAgICAgIGNvbnN0IGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDsKICAgICAgICAgIGxldCBzdGF0ZTsKICAgICAgICAgIGxldCBkaWN0aWQ7CiAgICAgICAgICBsZXQgcmV0OwogICAgICAgICAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7CiAgICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICAgICAgIH0KICAgICAgICAgIHN0YXRlID0gc3RybS5zdGF0ZTsKICAgICAgICAgIGlmIChzdGF0ZS53cmFwICE9PSAwICYmIHN0YXRlLm1vZGUgIT09IERJQ1QpIHsKICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IERJQ1QpIHsKICAgICAgICAgICAgZGljdGlkID0gMTsKICAgICAgICAgICAgZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApOwogICAgICAgICAgICBpZiAoZGljdGlkICE9PSBzdGF0ZS5jaGVjaykgewogICAgICAgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTsKICAgICAgICAgIGlmIChyZXQpIHsKICAgICAgICAgICAgc3RhdGUubW9kZSA9IE1FTTsKICAgICAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGUuaGF2ZWRpY3QgPSAxOwogICAgICAgICAgcmV0dXJuIFpfT0s7CiAgICAgICAgfTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5pbmZsYXRlUmVzZXQgPSBpbmZsYXRlUmVzZXQ7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZVJlc2V0S2VlcCA9IGluZmxhdGVSZXNldEtlZXA7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZUluaXQgPSBpbmZsYXRlSW5pdDsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZUVuZCA9IGluZmxhdGVFbmQ7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlciA9IGluZmxhdGVHZXRIZWFkZXI7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZVNldERpY3Rpb25hcnkgPSBpbmZsYXRlU2V0RGljdGlvbmFyeTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5pbmZsYXRlSW5mbyA9ICJwYWtvIGluZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIjsKICAgICAgfQogICAgfSk7CgogICAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZ3poZWFkZXIuanMKICAgIHZhciByZXF1aXJlX2d6aGVhZGVyID0gX19jb21tb25KUyh7CiAgICAgICJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9nemhlYWRlci5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICAgZnVuY3Rpb24gR1poZWFkZXIoKSB7CiAgICAgICAgICB0aGlzLnRleHQgPSAwOwogICAgICAgICAgdGhpcy50aW1lID0gMDsKICAgICAgICAgIHRoaXMueGZsYWdzID0gMDsKICAgICAgICAgIHRoaXMub3MgPSAwOwogICAgICAgICAgdGhpcy5leHRyYSA9IG51bGw7CiAgICAgICAgICB0aGlzLmV4dHJhX2xlbiA9IDA7CiAgICAgICAgICB0aGlzLm5hbWUgPSAiIjsKICAgICAgICAgIHRoaXMuY29tbWVudCA9ICIiOwogICAgICAgICAgdGhpcy5oY3JjID0gMDsKICAgICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IEdaaGVhZGVyOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvcGFrby9saWIvaW5mbGF0ZS5qcwogICAgdmFyIHJlcXVpcmVfaW5mbGF0ZTIgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi9pbmZsYXRlLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICAgICB2YXIgemxpYl9pbmZsYXRlID0gcmVxdWlyZV9pbmZsYXRlKCk7CiAgICAgICAgdmFyIHV0aWxzID0gcmVxdWlyZV9jb21tb24oKTsKICAgICAgICB2YXIgc3RyaW5ncyA9IHJlcXVpcmVfc3RyaW5ncygpOwogICAgICAgIHZhciBtc2cgPSByZXF1aXJlX21lc3NhZ2VzKCk7CiAgICAgICAgdmFyIFpTdHJlYW0gPSByZXF1aXJlX3pzdHJlYW0oKTsKICAgICAgICB2YXIgR1poZWFkZXIgPSByZXF1aXJlX2d6aGVhZGVyKCk7CiAgICAgICAgdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICAgICAgICB2YXIgewogICAgICAgICAgWl9OT19GTFVTSCwKICAgICAgICAgIFpfRklOSVNILAogICAgICAgICAgWl9PSywKICAgICAgICAgIFpfU1RSRUFNX0VORCwKICAgICAgICAgIFpfTkVFRF9ESUNULAogICAgICAgICAgWl9TVFJFQU1fRVJST1IsCiAgICAgICAgICBaX0RBVEFfRVJST1IsCiAgICAgICAgICBaX01FTV9FUlJPUgogICAgICAgIH0gPSByZXF1aXJlX2NvbnN0YW50cygpOwogICAgICAgIGZ1bmN0aW9uIEluZmxhdGUob3B0aW9ucykgewogICAgICAgICAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHsKICAgICAgICAgICAgY2h1bmtTaXplOiAxMDI0ICogNjQsCiAgICAgICAgICAgIHdpbmRvd0JpdHM6IDE1LAogICAgICAgICAgICB0bzogIiIKICAgICAgICAgIH0sIG9wdGlvbnMgfHwge30pOwogICAgICAgICAgY29uc3Qgb3B0ID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgaWYgKG9wdC5yYXcgJiYgb3B0LndpbmRvd0JpdHMgPj0gMCAmJiBvcHQud2luZG93Qml0cyA8IDE2KSB7CiAgICAgICAgICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzOwogICAgICAgICAgICBpZiAob3B0LndpbmRvd0JpdHMgPT09IDApIHsKICAgICAgICAgICAgICBvcHQud2luZG93Qml0cyA9IC0xNTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wdC53aW5kb3dCaXRzID49IDAgJiYgb3B0LndpbmRvd0JpdHMgPCAxNiAmJiAhKG9wdGlvbnMgJiYgb3B0aW9ucy53aW5kb3dCaXRzKSkgewogICAgICAgICAgICBvcHQud2luZG93Qml0cyArPSAzMjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvcHQud2luZG93Qml0cyA+IDE1ICYmIG9wdC53aW5kb3dCaXRzIDwgNDgpIHsKICAgICAgICAgICAgaWYgKChvcHQud2luZG93Qml0cyAmIDE1KSA9PT0gMCkgewogICAgICAgICAgICAgIG9wdC53aW5kb3dCaXRzIHw9IDE1OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmVyciA9IDA7CiAgICAgICAgICB0aGlzLm1zZyA9ICIiOwogICAgICAgICAgdGhpcy5lbmRlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5jaHVua3MgPSBbXTsKICAgICAgICAgIHRoaXMuc3RybSA9IG5ldyBaU3RyZWFtKCk7CiAgICAgICAgICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDsKICAgICAgICAgIGxldCBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSwgb3B0LndpbmRvd0JpdHMpOwogICAgICAgICAgaWYgKHN0YXR1cyAhPT0gWl9PSykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5oZWFkZXIgPSBuZXcgR1poZWFkZXIoKTsKICAgICAgICAgIHpsaWJfaW5mbGF0ZS5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSwgdGhpcy5oZWFkZXIpOwogICAgICAgICAgaWYgKG9wdC5kaWN0aW9uYXJ5KSB7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0LmRpY3Rpb25hcnkgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgb3B0LmRpY3Rpb25hcnkgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iKSB7CiAgICAgICAgICAgICAgb3B0LmRpY3Rpb25hcnkgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9wdC5yYXcpIHsKICAgICAgICAgICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBvcHQuZGljdGlvbmFyeSk7CiAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gWl9PSykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGRhdGEsIGZsdXNoX21vZGUpIHsKICAgICAgICAgIGNvbnN0IHN0cm0gPSB0aGlzLnN0cm07CiAgICAgICAgICBjb25zdCBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplOwogICAgICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5OwogICAgICAgICAgbGV0IHN0YXR1cywgX2ZsdXNoX21vZGUsIGxhc3RfYXZhaWxfb3V0OwogICAgICAgICAgaWYgKHRoaXMuZW5kZWQpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIGlmIChmbHVzaF9tb2RlID09PSB+fmZsdXNoX21vZGUpCiAgICAgICAgICAgIF9mbHVzaF9tb2RlID0gZmx1c2hfbW9kZTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgX2ZsdXNoX21vZGUgPSBmbHVzaF9tb2RlID09PSB0cnVlID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIOwogICAgICAgICAgaWYgKHRvU3RyaW5nLmNhbGwoZGF0YSkgPT09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKICAgICAgICAgICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RybS5pbnB1dCA9IGRhdGE7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJtLm5leHRfaW4gPSAwOwogICAgICAgICAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoOwogICAgICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmtTaXplKTsKICAgICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gMDsKICAgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZShzdHJtLCBfZmx1c2hfbW9kZSk7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFpfTkVFRF9ESUNUICYmIGRpY3Rpb25hcnkpIHsKICAgICAgICAgICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSk7CiAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gWl9PSykgewogICAgICAgICAgICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGUoc3RybSwgX2ZsdXNoX21vZGUpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBaX0RBVEFfRVJST1IpIHsKICAgICAgICAgICAgICAgIHN0YXR1cyA9IFpfTkVFRF9ESUNUOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoc3RybS5hdmFpbF9pbiA+IDAgJiYgc3RhdHVzID09PSBaX1NUUkVBTV9FTkQgJiYgc3RybS5zdGF0ZS53cmFwID4gMCAmJiBkYXRhW3N0cm0ubmV4dF9pbl0gIT09IDApIHsKICAgICAgICAgICAgICB6bGliX2luZmxhdGUuaW5mbGF0ZVJlc2V0KHN0cm0pOwogICAgICAgICAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHN0cm0sIF9mbHVzaF9tb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzd2l0Y2ggKHN0YXR1cykgewogICAgICAgICAgICAgIGNhc2UgWl9TVFJFQU1fRVJST1I6CiAgICAgICAgICAgICAgY2FzZSBaX0RBVEFfRVJST1I6CiAgICAgICAgICAgICAgY2FzZSBaX05FRURfRElDVDoKICAgICAgICAgICAgICBjYXNlIFpfTUVNX0VSUk9SOgogICAgICAgICAgICAgICAgdGhpcy5vbkVuZChzdGF0dXMpOwogICAgICAgICAgICAgICAgdGhpcy5lbmRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdF9hdmFpbF9vdXQgPSBzdHJtLmF2YWlsX291dDsKICAgICAgICAgICAgaWYgKHN0cm0ubmV4dF9vdXQpIHsKICAgICAgICAgICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgc3RhdHVzID09PSBaX1NUUkVBTV9FTkQpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgIGxldCBuZXh0X291dF91dGY4ID0gc3RyaW5ncy51dGY4Ym9yZGVyKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KTsKICAgICAgICAgICAgICAgICAgbGV0IHRhaWwgPSBzdHJtLm5leHRfb3V0IC0gbmV4dF9vdXRfdXRmODsKICAgICAgICAgICAgICAgICAgbGV0IHV0ZjhzdHIgPSBzdHJpbmdzLmJ1ZjJzdHJpbmcoc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgpOwogICAgICAgICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gdGFpbDsKICAgICAgICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemUgLSB0YWlsOwogICAgICAgICAgICAgICAgICBpZiAodGFpbCkKICAgICAgICAgICAgICAgICAgICBzdHJtLm91dHB1dC5zZXQoc3RybS5vdXRwdXQuc3ViYXJyYXkobmV4dF9vdXRfdXRmOCwgbmV4dF9vdXRfdXRmOCArIHRhaWwpLCAwKTsKICAgICAgICAgICAgICAgICAgdGhpcy5vbkRhdGEodXRmOHN0cik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YShzdHJtLm91dHB1dC5sZW5ndGggPT09IHN0cm0ubmV4dF9vdXQgPyBzdHJtLm91dHB1dCA6IHN0cm0ub3V0cHV0LnN1YmFycmF5KDAsIHN0cm0ubmV4dF9vdXQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gWl9PSyAmJiBsYXN0X2F2YWlsX291dCA9PT0gMCkKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gWl9TVFJFQU1fRU5EKSB7CiAgICAgICAgICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVFbmQodGhpcy5zdHJtKTsKICAgICAgICAgICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7CiAgICAgICAgICAgICAgdGhpcy5lbmRlZCA9IHRydWU7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDApCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9OwogICAgICAgIEluZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uKGNodW5rKSB7CiAgICAgICAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTsKICAgICAgICB9OwogICAgICAgIEluZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24oc3RhdHVzKSB7CiAgICAgICAgICBpZiAoc3RhdHVzID09PSBaX09LKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCIiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLnJlc3VsdCA9IHV0aWxzLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmNodW5rcyA9IFtdOwogICAgICAgICAgdGhpcy5lcnIgPSBzdGF0dXM7CiAgICAgICAgICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7CiAgICAgICAgfTsKICAgICAgICBmdW5jdGlvbiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKSB7CiAgICAgICAgICBjb25zdCBpbmZsYXRvciA9IG5ldyBJbmZsYXRlKG9wdGlvbnMpOwogICAgICAgICAgaW5mbGF0b3IucHVzaChpbnB1dCk7CiAgICAgICAgICBpZiAoaW5mbGF0b3IuZXJyKQogICAgICAgICAgICB0aHJvdyBpbmZsYXRvci5tc2cgfHwgbXNnW2luZmxhdG9yLmVycl07CiAgICAgICAgICByZXR1cm4gaW5mbGF0b3IucmVzdWx0OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBpbmZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7CiAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICAgIG9wdGlvbnMucmF3ID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuSW5mbGF0ZSA9IEluZmxhdGU7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZVJhdyA9IGluZmxhdGVSYXc7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMudW5nemlwID0gaW5mbGF0ZTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5jb25zdGFudHMgPSByZXF1aXJlX2NvbnN0YW50cygpOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvcGFrby9pbmRleC5qcwogICAgdmFyIHJlcXVpcmVfcGFrbyA9IF9fY29tbW9uSlMoewogICAgICAibm9kZV9tb2R1bGVzL3Bha28vaW5kZXguanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAgIHZhciB7IERlZmxhdGUsIGRlZmxhdGUsIGRlZmxhdGVSYXcsIGd6aXAgfSA9IHJlcXVpcmVfZGVmbGF0ZTIoKTsKICAgICAgICB2YXIgeyBJbmZsYXRlLCBpbmZsYXRlLCBpbmZsYXRlUmF3LCB1bmd6aXAgfSA9IHJlcXVpcmVfaW5mbGF0ZTIoKTsKICAgICAgICB2YXIgY29uc3RhbnRzID0gcmVxdWlyZV9jb25zdGFudHMoKTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5EZWZsYXRlID0gRGVmbGF0ZTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5kZWZsYXRlUmF3ID0gZGVmbGF0ZVJhdzsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5nemlwID0gZ3ppcDsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5JbmZsYXRlID0gSW5mbGF0ZTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5pbmZsYXRlUmF3ID0gaW5mbGF0ZVJhdzsKICAgICAgICBtb2R1bGUuZXhwb3J0cy51bmd6aXAgPSB1bmd6aXA7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuY29uc3RhbnRzID0gY29uc3RhbnRzOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvbmlmdGktcmVhZGVyLWpzL3NyYy9uaWZ0aS5qcwogICAgdmFyIHJlcXVpcmVfbmlmdGkgPSBfX2NvbW1vbkpTKHsKICAgICAgIm5vZGVfbW9kdWxlcy9uaWZ0aS1yZWFkZXItanMvc3JjL25pZnRpLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICAgICB2YXIgbmlmdGkgPSBuaWZ0aSB8fCB7fTsKICAgICAgICBuaWZ0aS5OSUZUSTEgPSBuaWZ0aS5OSUZUSTEgfHwgKHR5cGVvZiBfX3JlcXVpcmUgIT09ICJ1bmRlZmluZWQiID8gcmVxdWlyZV9uaWZ0aTEoKSA6IG51bGwpOwogICAgICAgIG5pZnRpLk5JRlRJMiA9IG5pZnRpLk5JRlRJMiB8fCAodHlwZW9mIF9fcmVxdWlyZSAhPT0gInVuZGVmaW5lZCIgPyByZXF1aXJlX25pZnRpMigpIDogbnVsbCk7CiAgICAgICAgbmlmdGkuVXRpbHMgPSBuaWZ0aS5VdGlscyB8fCAodHlwZW9mIF9fcmVxdWlyZSAhPT0gInVuZGVmaW5lZCIgPyByZXF1aXJlX3V0aWxpdGllcygpIDogbnVsbCk7CiAgICAgICAgdmFyIHBha28gPSBwYWtvIHx8ICh0eXBlb2YgX19yZXF1aXJlICE9PSAidW5kZWZpbmVkIiA/IHJlcXVpcmVfcGFrbygpIDogbnVsbCk7CiAgICAgICAgbmlmdGkuaXNOSUZUSTEgPSBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICB2YXIgYnVmLCBtYWcxLCBtYWcyLCBtYWczOwogICAgICAgICAgaWYgKGRhdGEuYnl0ZUxlbmd0aCA8IG5pZnRpLk5JRlRJMS5TVEFOREFSRF9IRUFERVJfU0laRSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBidWYgPSBuZXcgRGF0YVZpZXcoZGF0YSk7CiAgICAgICAgICBpZiAoYnVmKQogICAgICAgICAgICBtYWcxID0gYnVmLmdldFVpbnQ4KG5pZnRpLk5JRlRJMS5NQUdJQ19OVU1CRVJfTE9DQVRJT04pOwogICAgICAgICAgbWFnMiA9IGJ1Zi5nZXRVaW50OChuaWZ0aS5OSUZUSTEuTUFHSUNfTlVNQkVSX0xPQ0FUSU9OICsgMSk7CiAgICAgICAgICBtYWczID0gYnVmLmdldFVpbnQ4KG5pZnRpLk5JRlRJMS5NQUdJQ19OVU1CRVJfTE9DQVRJT04gKyAyKTsKICAgICAgICAgIHJldHVybiAhIShtYWcxID09PSBuaWZ0aS5OSUZUSTEuTUFHSUNfTlVNQkVSWzBdICYmIG1hZzIgPT09IG5pZnRpLk5JRlRJMS5NQUdJQ19OVU1CRVJbMV0gJiYgbWFnMyA9PT0gbmlmdGkuTklGVEkxLk1BR0lDX05VTUJFUlsyXSk7CiAgICAgICAgfTsKICAgICAgICBuaWZ0aS5pc05JRlRJMiA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgIHZhciBidWYsIG1hZzEsIG1hZzIsIG1hZzM7CiAgICAgICAgICBpZiAoZGF0YS5ieXRlTGVuZ3RoIDwgbmlmdGkuTklGVEkxLlNUQU5EQVJEX0hFQURFUl9TSVpFKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGJ1ZiA9IG5ldyBEYXRhVmlldyhkYXRhKTsKICAgICAgICAgIG1hZzEgPSBidWYuZ2V0VWludDgobmlmdGkuTklGVEkyLk1BR0lDX05VTUJFUl9MT0NBVElPTik7CiAgICAgICAgICBtYWcyID0gYnVmLmdldFVpbnQ4KG5pZnRpLk5JRlRJMi5NQUdJQ19OVU1CRVJfTE9DQVRJT04gKyAxKTsKICAgICAgICAgIG1hZzMgPSBidWYuZ2V0VWludDgobmlmdGkuTklGVEkyLk1BR0lDX05VTUJFUl9MT0NBVElPTiArIDIpOwogICAgICAgICAgcmV0dXJuICEhKG1hZzEgPT09IG5pZnRpLk5JRlRJMi5NQUdJQ19OVU1CRVJbMF0gJiYgbWFnMiA9PT0gbmlmdGkuTklGVEkyLk1BR0lDX05VTUJFUlsxXSAmJiBtYWczID09PSBuaWZ0aS5OSUZUSTIuTUFHSUNfTlVNQkVSWzJdKTsKICAgICAgICB9OwogICAgICAgIG5pZnRpLmlzTklGVEkgPSBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICByZXR1cm4gbmlmdGkuaXNOSUZUSTEoZGF0YSkgfHwgbmlmdGkuaXNOSUZUSTIoZGF0YSk7CiAgICAgICAgfTsKICAgICAgICBuaWZ0aS5pc0NvbXByZXNzZWQgPSBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICB2YXIgYnVmLCBtYWdpY0Nvb2tpZTEsIG1hZ2ljQ29va2llMjsKICAgICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICAgIGJ1ZiA9IG5ldyBEYXRhVmlldyhkYXRhKTsKICAgICAgICAgICAgbWFnaWNDb29raWUxID0gYnVmLmdldFVpbnQ4KDApOwogICAgICAgICAgICBtYWdpY0Nvb2tpZTIgPSBidWYuZ2V0VWludDgoMSk7CiAgICAgICAgICAgIGlmIChtYWdpY0Nvb2tpZTEgPT09IG5pZnRpLlV0aWxzLkdVTlpJUF9NQUdJQ19DT09LSUUxKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1hZ2ljQ29va2llMiA9PT0gbmlmdGkuVXRpbHMuR1VOWklQX01BR0lDX0NPT0tJRTIpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH07CiAgICAgICAgbmlmdGkuZGVjb21wcmVzcyA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgIHJldHVybiBwYWtvLmluZmxhdGUoZGF0YSkuYnVmZmVyOwogICAgICAgIH07CiAgICAgICAgbmlmdGkucmVhZEhlYWRlciA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgIHZhciBoZWFkZXIgPSBudWxsOwogICAgICAgICAgaWYgKG5pZnRpLmlzQ29tcHJlc3NlZChkYXRhKSkgewogICAgICAgICAgICBkYXRhID0gbmlmdGkuZGVjb21wcmVzcyhkYXRhKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChuaWZ0aS5pc05JRlRJMShkYXRhKSkgewogICAgICAgICAgICBoZWFkZXIgPSBuZXcgbmlmdGkuTklGVEkxKCk7CiAgICAgICAgICB9IGVsc2UgaWYgKG5pZnRpLmlzTklGVEkyKGRhdGEpKSB7CiAgICAgICAgICAgIGhlYWRlciA9IG5ldyBuaWZ0aS5OSUZUSTIoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChoZWFkZXIpIHsKICAgICAgICAgICAgaGVhZGVyLnJlYWRIZWFkZXIoZGF0YSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUaGF0IGZpbGUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIE5JRlRJISIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGhlYWRlcjsKICAgICAgICB9OwogICAgICAgIG5pZnRpLmhhc0V4dGVuc2lvbiA9IGZ1bmN0aW9uKGhlYWRlcikgewogICAgICAgICAgcmV0dXJuIGhlYWRlci5leHRlbnNpb25GbGFnWzBdICE9IDA7CiAgICAgICAgfTsKICAgICAgICBuaWZ0aS5yZWFkSW1hZ2UgPSBmdW5jdGlvbihoZWFkZXIsIGRhdGEpIHsKICAgICAgICAgIHZhciBpbWFnZU9mZnNldCA9IGhlYWRlci52b3hfb2Zmc2V0LCB0aW1lRGltID0gMSwgc3RhdERpbSA9IDE7CiAgICAgICAgICBpZiAoaGVhZGVyLmRpbXNbNF0pIHsKICAgICAgICAgICAgdGltZURpbSA9IGhlYWRlci5kaW1zWzRdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGhlYWRlci5kaW1zWzVdKSB7CiAgICAgICAgICAgIHN0YXREaW0gPSBoZWFkZXIuZGltc1s1XTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBpbWFnZVNpemUgPSBoZWFkZXIuZGltc1sxXSAqIGhlYWRlci5kaW1zWzJdICogaGVhZGVyLmRpbXNbM10gKiB0aW1lRGltICogc3RhdERpbSAqIChoZWFkZXIubnVtQml0c1BlclZveGVsIC8gOCk7CiAgICAgICAgICByZXR1cm4gZGF0YS5zbGljZShpbWFnZU9mZnNldCwgaW1hZ2VPZmZzZXQgKyBpbWFnZVNpemUpOwogICAgICAgIH07CiAgICAgICAgbmlmdGkucmVhZEV4dGVuc2lvbiA9IGZ1bmN0aW9uKGhlYWRlciwgZGF0YSkgewogICAgICAgICAgdmFyIGxvYyA9IGhlYWRlci5nZXRFeHRlbnNpb25Mb2NhdGlvbigpLCBzaXplID0gaGVhZGVyLmV4dGVuc2lvblNpemU7CiAgICAgICAgICByZXR1cm4gZGF0YS5zbGljZShsb2MsIGxvYyArIHNpemUpOwogICAgICAgIH07CiAgICAgICAgbmlmdGkucmVhZEV4dGVuc2lvbkRhdGEgPSBmdW5jdGlvbihoZWFkZXIsIGRhdGEpIHsKICAgICAgICAgIHZhciBsb2MgPSBoZWFkZXIuZ2V0RXh0ZW5zaW9uTG9jYXRpb24oKSwgc2l6ZSA9IGhlYWRlci5leHRlbnNpb25TaXplOwogICAgICAgICAgcmV0dXJuIGRhdGEuc2xpY2UobG9jICsgOCwgbG9jICsgc2l6ZSAtIDgpOwogICAgICAgIH07CiAgICAgICAgdmFyIG1vZHVsZVR5cGUgPSB0eXBlb2YgbW9kdWxlOwogICAgICAgIGlmIChtb2R1bGVUeXBlICE9PSAidW5kZWZpbmVkIiAmJiBtb2R1bGUuZXhwb3J0cykgewogICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBuaWZ0aTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdXRpbC9jYW5jZWxsYXRpb24udHMKICAgIHZhciBDYW5jZWxsYXRpb25FcnJvciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5uYW1lID0gIkNhbmNlbGxhdGlvbkVycm9yIjsKICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiQ0FOQ0VMRUQiOwogICAgICB9CiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiAiQ0FOQ0VMRUQiOwogICAgICB9CiAgICB9OwogICAgdmFyIENBTkNFTEVEID0gbmV3IENhbmNlbGxhdGlvbkVycm9yKCk7CiAgICBmdW5jdGlvbiB0aHJvd0lmQ2FuY2VsZWQodG9rZW4pIHsKICAgICAgaWYgKHRva2VuLmlzQ2FuY2VsZWQgPT09IHRydWUpIHsKICAgICAgICB0aHJvdyBDQU5DRUxFRDsKICAgICAgfQogICAgfQogICAgdmFyIG5vb3BGdW5jdGlvbiA9ICgpID0+IHsKICAgIH07CiAgICB2YXIgdW5jYW5jZWxhYmxlVG9rZW4gPSB7CiAgICAgIGlzQ2FuY2VsZWQ6IGZhbHNlLAogICAgICBhZGQ6ICgpID0+IG5vb3BGdW5jdGlvbiwKICAgICAgcmVtb3ZlOiBub29wRnVuY3Rpb24KICAgIH07CiAgICB2YXIgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UgPSBjbGFzcyB7CiAgICAgIGNhbmNlbCgpIHsKICAgICAgICBjb25zdCB7IGhhbmRsZXJzOiBoYW5kbGVyczIgfSA9IHRoaXM7CiAgICAgICAgaWYgKGhhbmRsZXJzMiAhPT0gbnVsbCkgewogICAgICAgICAgdGhpcy5oYW5kbGVycyA9IG51bGw7CiAgICAgICAgICBpZiAoaGFuZGxlcnMyICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgZm9yIChsZXQgaGFuZGxlciBvZiBoYW5kbGVyczIpIHsKICAgICAgICAgICAgICBoYW5kbGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0IGlzQ2FuY2VsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMgPT09IG51bGw7CiAgICAgIH0KICAgICAgYWRkKGhhbmRsZXIpIHsKICAgICAgICBsZXQgeyBoYW5kbGVyczogaGFuZGxlcnMyIH0gPSB0aGlzOwogICAgICAgIGlmIChoYW5kbGVyczIgPT09IG51bGwpIHsKICAgICAgICAgIGhhbmRsZXIoKTsKICAgICAgICAgIHJldHVybiBub29wRnVuY3Rpb247CiAgICAgICAgfQogICAgICAgIGlmIChoYW5kbGVyczIgPT09IHZvaWQgMCkgewogICAgICAgICAgaGFuZGxlcnMyID0gdGhpcy5oYW5kbGVycyA9IG5ldyBTZXQoKTsKICAgICAgICB9CiAgICAgICAgaGFuZGxlcnMyLmFkZChoYW5kbGVyKTsKICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgdGhpcy5yZW1vdmUoaGFuZGxlcik7CiAgICAgICAgfTsKICAgICAgfQogICAgICByZW1vdmUoaGFuZGxlcikgewogICAgICAgIGNvbnN0IHsgaGFuZGxlcnM6IGhhbmRsZXJzMiB9ID0gdGhpczsKICAgICAgICBpZiAoaGFuZGxlcnMyICE9IG51bGwpIHsKICAgICAgICAgIGhhbmRsZXJzMi5kZWxldGUoaGFuZGxlcik7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgdmFyIE11bHRpcGxlQ29uc3VtZXJDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGNsYXNzIGV4dGVuZHMgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMuY29uc3VtZXJzID0gbmV3IFNldCgpOwogICAgICB9CiAgICAgIGFkZENvbnN1bWVyKGNhbmNlbGxhdGlvblRva2VuID0gdW5jYW5jZWxhYmxlVG9rZW4pIHsKICAgICAgICBjb25zdCB7IGNvbnN1bWVycyB9ID0gdGhpczsKICAgICAgICBpZiAoY29uc3VtZXJzLmhhcyhjYW5jZWxsYXRpb25Ub2tlbikgfHwgY2FuY2VsbGF0aW9uVG9rZW4uaXNDYW5jZWxlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdW1lcnMuYWRkKGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbi5hZGQoKCkgPT4gewogICAgICAgICAgY29uc3VtZXJzLmRlbGV0ZShjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgICBpZiAoY29uc3VtZXJzLnNpemUgPT09IDApIHsKICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIG1ha2VDYW5jZWxhYmxlUHJvbWlzZShjYW5jZWxsYXRpb25Ub2tlbiwgZXhlY3V0b3IpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4gPT09IHVuY2FuY2VsYWJsZVRva2VuKSB7CiAgICAgICAgICBleGVjdXRvcihyZXNvbHZlLCByZWplY3QsIHVuY2FuY2VsYWJsZVRva2VuKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc2NvcGVkVG9rZW4gPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTsKICAgICAgICBjb25zdCB1bnJlZ2lzdGVyID0gY2FuY2VsbGF0aW9uVG9rZW4uYWRkKCgpID0+IHsKICAgICAgICAgIHNjb3BlZFRva2VuLmNhbmNlbCgpOwogICAgICAgIH0pOwogICAgICAgIGV4ZWN1dG9yKCh2YWx1ZSkgPT4gewogICAgICAgICAgdW5yZWdpc3RlcigpOwogICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7CiAgICAgICAgfSwgKGVycm9yKSA9PiB7CiAgICAgICAgICB1bnJlZ2lzdGVyKCk7CiAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgIH0sIHNjb3BlZFRva2VuKTsKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBpbnZva2VEaXNwb3NlcihkaXNwb3NlcikgewogICAgICBpZiAodHlwZW9mIGRpc3Bvc2VyID09PSAib2JqZWN0IikgewogICAgICAgIGRpc3Bvc2VyLmRpc3Bvc2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkaXNwb3NlcigpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBpbnZva2VEaXNwb3NlcnMoZGlzcG9zZXJzKSB7CiAgICAgIGZvciAobGV0IGkgPSBkaXNwb3NlcnMubGVuZ3RoOyBpID4gMDsgLS1pKSB7CiAgICAgICAgaW52b2tlRGlzcG9zZXIoZGlzcG9zZXJzW2kgLSAxXSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7CiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTsKICAgICAgcmV0dXJuICgpID0+IHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTsKICAgIH0KICAgIHZhciBSZWZDb3VudGVkID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnJlZkNvdW50ID0gMTsKICAgICAgfQogICAgICBhZGRSZWYoKSB7CiAgICAgICAgKyt0aGlzLnJlZkNvdW50OwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgaWYgKC0tdGhpcy5yZWZDb3VudCAhPT0gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnJlZkNvdW50UmVhY2hlZFplcm8oKTsKICAgICAgfQogICAgICByZWZDb3VudFJlYWNoZWRaZXJvKCkgewogICAgICAgIHRoaXMuZGlzcG9zZWQoKTsKICAgICAgICBsZXQgeyBkaXNwb3NlcnMgfSA9IHRoaXM7CiAgICAgICAgaWYgKGRpc3Bvc2VycyAhPT0gdm9pZCAwKSB7CiAgICAgICAgICBpbnZva2VEaXNwb3NlcnMoZGlzcG9zZXJzKTsKICAgICAgICAgIHRoaXMuZGlzcG9zZXJzID0gdm9pZCAwOwogICAgICAgIH0KICAgICAgICB0aGlzLndhc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgfQogICAgICBkaXNwb3NlZCgpIHsKICAgICAgfQogICAgICByZWdpc3RlckRpc3Bvc2VyKGYpIHsKICAgICAgICBsZXQgeyBkaXNwb3NlcnMgfSA9IHRoaXM7CiAgICAgICAgaWYgKGRpc3Bvc2VycyA9PSBudWxsKSB7CiAgICAgICAgICB0aGlzLmRpc3Bvc2VycyA9IFtmXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGlzcG9zZXJzLnB1c2goZik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmOwogICAgICB9CiAgICAgIHVucmVnaXN0ZXJEaXNwb3NlcihmKSB7CiAgICAgICAgbGV0IHsgZGlzcG9zZXJzIH0gPSB0aGlzOwogICAgICAgIGlmIChkaXNwb3NlcnMgIT0gbnVsbCkgewogICAgICAgICAgbGV0IGluZGV4ID0gZGlzcG9zZXJzLmluZGV4T2YoZik7CiAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIGRpc3Bvc2Vycy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZjsKICAgICAgfQogICAgICByZWdpc3RlckV2ZW50TGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykgewogICAgICAgIHRoaXMucmVnaXN0ZXJEaXNwb3NlcihyZWdpc3RlckV2ZW50TGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykpOwogICAgICB9CiAgICAgIHJlZ2lzdGVyQ2FuY2VsbGFibGUoY2FuY2VsbGFibGUpIHsKICAgICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIoKCkgPT4gewogICAgICAgICAgY2FuY2VsbGFibGUuY2FuY2VsKCk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGNhbmNlbGxhYmxlOwogICAgICB9CiAgICB9OwogICAgdmFyIFJlZkNvdW50ZWRWYWx1ZSA9IGNsYXNzIGV4dGVuZHMgUmVmQ291bnRlZCB7CiAgICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgIH0KICAgIH07CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci93b3JrZXJfcnBjLnRzCiAgICB2YXIgSVNfV09SS0VSID0gISh0eXBlb2YgV2luZG93ICE9PSAidW5kZWZpbmVkIiAmJiBzZWxmIGluc3RhbmNlb2YgV2luZG93KTsKICAgIHZhciBQUk9NSVNFX1JFU1BPTlNFX0lEID0gInJwYy5wcm9taXNlLnJlc3BvbnNlIjsKICAgIHZhciBQUk9NSVNFX0NBTkNFTF9JRCA9ICJycGMucHJvbWlzZS5jYW5jZWwiOwogICAgdmFyIGhhbmRsZXJzID0gbmV3IE1hcCgpOwogICAgZnVuY3Rpb24gcmVnaXN0ZXJSUEMoa2V5LCBoYW5kbGVyKSB7CiAgICAgIGhhbmRsZXJzLnNldChrZXksIGhhbmRsZXIpOwogICAgfQogICAgdmFyIFJQQ0Vycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7CiAgICAgIGNvbnN0cnVjdG9yKG5hbWUsIG1lc3NhZ2UpIHsKICAgICAgICBzdXBlcihtZXNzYWdlKTsKICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiByZWdpc3RlclByb21pc2VSUEMoa2V5LCBoYW5kbGVyKSB7CiAgICAgIHJlZ2lzdGVyUlBDKGtleSwgZnVuY3Rpb24oeCkgewogICAgICAgIGxldCBpZCA9IHhbImlkIl07CiAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uVG9rZW4gPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTsKICAgICAgICBsZXQgcHJvbWlzZSA9IGhhbmRsZXIuY2FsbCh0aGlzLCB4LCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgdGhpcy5zZXQoaWQsIHsgcHJvbWlzZSwgY2FuY2VsbGF0aW9uVG9rZW4gfSk7CiAgICAgICAgcHJvbWlzZS50aGVuKCh7IHZhbHVlLCB0cmFuc2ZlcnMgfSkgPT4gewogICAgICAgICAgdGhpcy5kZWxldGUoaWQpOwogICAgICAgICAgdGhpcy5pbnZva2UoUFJPTUlTRV9SRVNQT05TRV9JRCwgeyAiaWQiOiBpZCwgInZhbHVlIjogdmFsdWUgfSwgdHJhbnNmZXJzKTsKICAgICAgICB9LCAoZXJyb3IpID0+IHsKICAgICAgICAgIHRoaXMuZGVsZXRlKGlkKTsKICAgICAgICAgIHRoaXMuaW52b2tlKFBST01JU0VfUkVTUE9OU0VfSUQsIHsgImlkIjogaWQsICJlcnJvciI6IGVycm9yLm1lc3NhZ2UsICJlcnJvck5hbWUiOiBlcnJvci5uYW1lIH0pOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIHJlZ2lzdGVyUlBDKFBST01JU0VfQ0FOQ0VMX0lELCBmdW5jdGlvbih4KSB7CiAgICAgIGxldCBpZCA9IHhbImlkIl07CiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmdldChpZCk7CiAgICAgIGlmIChyZXF1ZXN0ICE9PSB2b2lkIDApIHsKICAgICAgICBsZXQgeyBjYW5jZWxsYXRpb25Ub2tlbiB9ID0gcmVxdWVzdDsKICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbi5jYW5jZWwoKTsKICAgICAgfQogICAgfSk7CiAgICByZWdpc3RlclJQQyhQUk9NSVNFX1JFU1BPTlNFX0lELCBmdW5jdGlvbih4KSB7CiAgICAgIGxldCBpZCA9IHhbImlkIl07CiAgICAgIGxldCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5nZXQoaWQpOwogICAgICB0aGlzLmRlbGV0ZShpZCk7CiAgICAgIGlmICh4Lmhhc093blByb3BlcnR5KCJ2YWx1ZSIpKSB7CiAgICAgICAgcmVzb2x2ZSh4WyJ2YWx1ZSJdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBlcnJvck5hbWUgPSB4WyJlcnJvck5hbWUiXTsKICAgICAgICBpZiAoZXJyb3JOYW1lID09PSBDQU5DRUxFRC5uYW1lKSB7CiAgICAgICAgICByZWplY3QoQ0FOQ0VMRUQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWplY3QobmV3IFJQQ0Vycm9yKHhbImVycm9yTmFtZSJdLCB4WyJlcnJvciJdKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIHZhciBJTklUSUFMX1JQQ19JRCA9IElTX1dPUktFUiA/IC0xIDogMDsKICAgIHZhciBSUEMgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKHRhcmdldCkgewogICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogICAgICAgIHRoaXMub2JqZWN0cyA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLm5leHRJZCA9IElOSVRJQUxfUlBDX0lEOwogICAgICAgIHRhcmdldC5vbm1lc3NhZ2UgPSAoZSkgPT4gewogICAgICAgICAgbGV0IGRhdGEgPSBlLmRhdGE7CiAgICAgICAgICBoYW5kbGVycy5nZXQoZGF0YS5mdW5jdGlvbk5hbWUpLmNhbGwodGhpcywgZGF0YSk7CiAgICAgICAgfTsKICAgICAgfQogICAgICBnZXQgbnVtT2JqZWN0cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5vYmplY3RzLnNpemU7CiAgICAgIH0KICAgICAgc2V0KGlkLCB2YWx1ZSkgewogICAgICAgIHRoaXMub2JqZWN0cy5zZXQoaWQsIHZhbHVlKTsKICAgICAgfQogICAgICBkZWxldGUoaWQpIHsKICAgICAgICB0aGlzLm9iamVjdHMuZGVsZXRlKGlkKTsKICAgICAgfQogICAgICBnZXQoaWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5vYmplY3RzLmdldChpZCk7CiAgICAgIH0KICAgICAgZ2V0UmVmKHgpIHsKICAgICAgICBsZXQgcnBjSWQgPSB4WyJpZCJdOwogICAgICAgIGxldCBvYmogPSB0aGlzLmdldChycGNJZCk7CiAgICAgICAgb2JqLnJlZmVyZW5jZWRHZW5lcmF0aW9uID0geFsiZ2VuIl07CiAgICAgICAgb2JqLmFkZFJlZigpOwogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0KICAgICAgZ2V0T3B0aW9uYWxSZWYoeCkgewogICAgICAgIGlmICh4ID09PSB2b2lkIDApCiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIGxldCBycGNJZCA9IHhbImlkIl07CiAgICAgICAgbGV0IG9iaiA9IHRoaXMuZ2V0KHJwY0lkKTsKICAgICAgICBvYmoucmVmZXJlbmNlZEdlbmVyYXRpb24gPSB4WyJnZW4iXTsKICAgICAgICBvYmouYWRkUmVmKCk7CiAgICAgICAgcmV0dXJuIG9iajsKICAgICAgfQogICAgICBpbnZva2UobmFtZSwgeCwgdHJhbnNmZXJzKSB7CiAgICAgICAgeC5mdW5jdGlvbk5hbWUgPSBuYW1lOwogICAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHgsIHRyYW5zZmVycyk7CiAgICAgIH0KICAgICAgcHJvbWlzZUludm9rZShuYW1lLCB4LCBjYW5jZWxsYXRpb25Ub2tlbiA9IHVuY2FuY2VsYWJsZVRva2VuLCB0cmFuc2ZlcnMpIHsKICAgICAgICByZXR1cm4gbWFrZUNhbmNlbGFibGVQcm9taXNlKGNhbmNlbGxhdGlvblRva2VuLCAocmVzb2x2ZSwgcmVqZWN0LCB0b2tlbikgPT4gewogICAgICAgICAgY29uc3QgaWQgPSB4WyJpZCJdID0gdGhpcy5uZXdJZCgpOwogICAgICAgICAgdGhpcy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pOwogICAgICAgICAgdGhpcy5pbnZva2UobmFtZSwgeCwgdHJhbnNmZXJzKTsKICAgICAgICAgIHRva2VuLmFkZCgoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuaW52b2tlKFBST01JU0VfQ0FOQ0VMX0lELCB7ICJpZCI6IGlkIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgbmV3SWQoKSB7CiAgICAgICAgcmV0dXJuIElTX1dPUktFUiA/IHRoaXMubmV4dElkLS0gOiB0aGlzLm5leHRJZCsrOwogICAgICB9CiAgICB9OwogICAgdmFyIFNoYXJlZE9iamVjdCA9IGNsYXNzIGV4dGVuZHMgUmVmQ291bnRlZCB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5ycGMgPSBudWxsOwogICAgICAgIHRoaXMucnBjSWQgPSBudWxsOwogICAgICB9CiAgICAgIGluaXRpYWxpemVTaGFyZWRPYmplY3QocnBjMiwgcnBjSWQgPSBycGMyLm5ld0lkKCkpIHsKICAgICAgICB0aGlzLnJwYyA9IHJwYzI7CiAgICAgICAgdGhpcy5ycGNJZCA9IHJwY0lkOwogICAgICAgIHRoaXMuaXNPd25lciA9IGZhbHNlOwogICAgICAgIHJwYzIuc2V0KHJwY0lkLCB0aGlzKTsKICAgICAgfQogICAgICBpbml0aWFsaXplQ291bnRlcnBhcnQocnBjMiwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgdGhpcy5pbml0aWFsaXplU2hhcmVkT2JqZWN0KHJwYzIpOwogICAgICAgIHRoaXMudW5yZWZlcmVuY2VkR2VuZXJhdGlvbiA9IDA7CiAgICAgICAgdGhpcy5yZWZlcmVuY2VkR2VuZXJhdGlvbiA9IDA7CiAgICAgICAgdGhpcy5pc093bmVyID0gdHJ1ZTsKICAgICAgICBvcHRpb25zWyJpZCJdID0gdGhpcy5ycGNJZDsKICAgICAgICBvcHRpb25zWyJ0eXBlIl0gPSB0aGlzLlJQQ19UWVBFX0lEOwogICAgICAgIHJwYzIuaW52b2tlKCJTaGFyZWRPYmplY3QubmV3Iiwgb3B0aW9ucyk7CiAgICAgIH0KICAgICAgZGlzcG9zZSgpIHsKICAgICAgICBzdXBlci5kaXNwb3NlKCk7CiAgICAgIH0KICAgICAgYWRkQ291bnRlcnBhcnRSZWYoKSB7CiAgICAgICAgcmV0dXJuIHsgImlkIjogdGhpcy5ycGNJZCwgImdlbiI6ICsrdGhpcy5yZWZlcmVuY2VkR2VuZXJhdGlvbiB9OwogICAgICB9CiAgICAgIHJlZkNvdW50UmVhY2hlZFplcm8oKSB7CiAgICAgICAgaWYgKHRoaXMuaXNPd25lciA9PT0gdHJ1ZSkgewogICAgICAgICAgaWYgKHRoaXMucmVmZXJlbmNlZEdlbmVyYXRpb24gPT09IHRoaXMudW5yZWZlcmVuY2VkR2VuZXJhdGlvbikgewogICAgICAgICAgICB0aGlzLm93bmVyRGlzcG9zZSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc093bmVyID09PSBmYWxzZSkgewogICAgICAgICAgdGhpcy5ycGMuaW52b2tlKCJTaGFyZWRPYmplY3QucmVmQ291bnRSZWFjaGVkWmVybyIsIHsgImlkIjogdGhpcy5ycGNJZCwgImdlbiI6IHRoaXMucmVmZXJlbmNlZEdlbmVyYXRpb24gfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN1cGVyLnJlZkNvdW50UmVhY2hlZFplcm8oKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgb3duZXJEaXNwb3NlKCkgewogICAgICAgIGxldCB7IHJwYzogcnBjMiwgcnBjSWQgfSA9IHRoaXM7CiAgICAgICAgc3VwZXIucmVmQ291bnRSZWFjaGVkWmVybygpOwogICAgICAgIHJwYzIuZGVsZXRlKHJwY0lkKTsKICAgICAgICBycGMyLmludm9rZSgiU2hhcmVkT2JqZWN0LmRpc3Bvc2UiLCB7ICJpZCI6IHJwY0lkIH0pOwogICAgICB9CiAgICAgIGNvdW50ZXJwYXJ0UmVmQ291bnRSZWFjaGVkWmVybyhnZW5lcmF0aW9uKSB7CiAgICAgICAgdGhpcy51bnJlZmVyZW5jZWRHZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKICAgICAgICBpZiAodGhpcy5yZWZDb3VudCA9PT0gMCAmJiBnZW5lcmF0aW9uID09PSB0aGlzLnJlZmVyZW5jZWRHZW5lcmF0aW9uKSB7CiAgICAgICAgICB0aGlzLm93bmVyRGlzcG9zZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIGluaXRpYWxpemVTaGFyZWRPYmplY3RDb3VudGVycGFydChvYmosIHJwYzIsIG9wdGlvbnMgPSB7fSkgewogICAgICBpZiAocnBjMiAhPSBudWxsKSB7CiAgICAgICAgb2JqLmluaXRpYWxpemVTaGFyZWRPYmplY3QocnBjMiwgb3B0aW9uc1siaWQiXSk7CiAgICAgIH0KICAgIH0KICAgIHZhciBTaGFyZWRPYmplY3RDb3VudGVycGFydCA9IGNsYXNzIGV4dGVuZHMgU2hhcmVkT2JqZWN0IHsKICAgICAgY29uc3RydWN0b3IocnBjMiwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBpbml0aWFsaXplU2hhcmVkT2JqZWN0Q291bnRlcnBhcnQodGhpcywgcnBjMiwgb3B0aW9ucyk7CiAgICAgIH0KICAgIH07CiAgICByZWdpc3RlclJQQygiU2hhcmVkT2JqZWN0LmRpc3Bvc2UiLCBmdW5jdGlvbih4KSB7CiAgICAgIGxldCBvYmogPSB0aGlzLmdldCh4WyJpZCJdKTsKICAgICAgaWYgKG9iai5yZWZDb3VudCAhPT0gMCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgQXR0ZW1wdGVkIHRvIGRpc3Bvc2Ugb2JqZWN0IHdpdGggbm9uLXplcm8gcmVmZXJlbmNlIGNvdW50LmApOwogICAgICB9CiAgICAgIG9iai5kaXNwb3NlZCgpOwogICAgICB0aGlzLmRlbGV0ZShvYmoucnBjSWQpOwogICAgICBvYmoucnBjSWQgPSBudWxsOwogICAgICBvYmoucnBjID0gbnVsbDsKICAgIH0pOwogICAgdmFyIFdPUktFUl9SUENfSUQgPSAiV29ya2VyIjsKICAgIHJlZ2lzdGVyUlBDKFdPUktFUl9SUENfSUQsIGZ1bmN0aW9uKHgpIHsKICAgICAgY29uc3QgeyBwb3J0LCBwYXRoIH0gPSB4OwogICAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKHBhdGgpOwogICAgICB3b3JrZXIucG9zdE1lc3NhZ2UoeyBwb3J0IH0sIFtwb3J0XSk7CiAgICB9KTsKICAgIHJlZ2lzdGVyUlBDKCJTaGFyZWRPYmplY3QucmVmQ291bnRSZWFjaGVkWmVybyIsIGZ1bmN0aW9uKHgpIHsKICAgICAgbGV0IG9iaiA9IHRoaXMuZ2V0KHhbImlkIl0pOwogICAgICBsZXQgZ2VuZXJhdGlvbiA9IHhbImdlbiJdOwogICAgICBvYmouY291bnRlcnBhcnRSZWZDb3VudFJlYWNoZWRaZXJvKGdlbmVyYXRpb24pOwogICAgfSk7CiAgICB2YXIgc2hhcmVkT2JqZWN0Q29uc3RydWN0b3JzID0gbmV3IE1hcCgpOwogICAgZnVuY3Rpb24gcmVnaXN0ZXJTaGFyZWRPYmplY3RPd25lcihpZGVudGlmaWVyKSB7CiAgICAgIHJldHVybiAoY29uc3RydWN0b3JGdW5jdGlvbikgPT4gewogICAgICAgIGNvbnN0cnVjdG9yRnVuY3Rpb24ucHJvdG90eXBlLlJQQ19UWVBFX0lEID0gaWRlbnRpZmllcjsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KGlkZW50aWZpZXIpIHsKICAgICAgcmV0dXJuIChjb25zdHJ1Y3RvckZ1bmN0aW9uKSA9PiB7CiAgICAgICAgaWYgKGlkZW50aWZpZXIgIT09IHZvaWQgMCkgewogICAgICAgICAgY29uc3RydWN0b3JGdW5jdGlvbi5wcm90b3R5cGUuUlBDX1RZUEVfSUQgPSBpZGVudGlmaWVyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZGVudGlmaWVyID0gY29uc3RydWN0b3JGdW5jdGlvbi5wcm90b3R5cGUuUlBDX1RZUEVfSUQ7CiAgICAgICAgICBpZiAoaWRlbnRpZmllciA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUlBDX1RZUEVfSUQgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGRlZmluZWQiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2hhcmVkT2JqZWN0Q29uc3RydWN0b3JzLnNldChpZGVudGlmaWVyLCBjb25zdHJ1Y3RvckZ1bmN0aW9uKTsKICAgICAgfTsKICAgIH0KICAgIHJlZ2lzdGVyUlBDKCJTaGFyZWRPYmplY3QubmV3IiwgZnVuY3Rpb24oeCkgewogICAgICBsZXQgcnBjMiA9IHRoaXM7CiAgICAgIGxldCB0eXBlTmFtZSA9IHhbInR5cGUiXTsKICAgICAgbGV0IGNvbnN0cnVjdG9yRnVuY3Rpb24gPSBzaGFyZWRPYmplY3RDb25zdHJ1Y3RvcnMuZ2V0KHR5cGVOYW1lKTsKICAgICAgbGV0IG9iaiA9IG5ldyBjb25zdHJ1Y3RvckZ1bmN0aW9uKHJwYzIsIHgpOwogICAgICAtLW9iai5yZWZDb3VudDsKICAgIH0pOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvd29ya2VyX3JwY19jb250ZXh0LnRzCiAgICB2YXIgcnBjID0gbmV3IFJQQyhzZWxmKTsKICAgIHNlbGYucnBjID0gcnBjOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvY2h1bmtfbWFuYWdlci9iYWNrZW5kLnRzCiAgICB2YXIgaW1wb3J0X3Rocm90dGxlID0gX190b01vZHVsZShyZXF1aXJlX3Rocm90dGxlKCkpOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvY2h1bmtfbWFuYWdlci9iYXNlLnRzCiAgICB2YXIgQ2h1bmtTdGF0ZTsKICAgIChmdW5jdGlvbihDaHVua1N0YXRlMikgewogICAgICBDaHVua1N0YXRlMltDaHVua1N0YXRlMlsiR1BVX01FTU9SWSJdID0gMF0gPSAiR1BVX01FTU9SWSI7CiAgICAgIENodW5rU3RhdGUyW0NodW5rU3RhdGUyWyJTWVNURU1fTUVNT1JZIl0gPSAxXSA9ICJTWVNURU1fTUVNT1JZIjsKICAgICAgQ2h1bmtTdGF0ZTJbQ2h1bmtTdGF0ZTJbIlNZU1RFTV9NRU1PUllfV09SS0VSIl0gPSAyXSA9ICJTWVNURU1fTUVNT1JZX1dPUktFUiI7CiAgICAgIENodW5rU3RhdGUyW0NodW5rU3RhdGUyWyJET1dOTE9BRElORyJdID0gM10gPSAiRE9XTkxPQURJTkciOwogICAgICBDaHVua1N0YXRlMltDaHVua1N0YXRlMlsiUVVFVUVEIl0gPSA0XSA9ICJRVUVVRUQiOwogICAgICBDaHVua1N0YXRlMltDaHVua1N0YXRlMlsiTkVXIl0gPSA1XSA9ICJORVciOwogICAgICBDaHVua1N0YXRlMltDaHVua1N0YXRlMlsiRkFJTEVEIl0gPSA2XSA9ICJGQUlMRUQiOwogICAgICBDaHVua1N0YXRlMltDaHVua1N0YXRlMlsiRVhQSVJFRCJdID0gN10gPSAiRVhQSVJFRCI7CiAgICB9KShDaHVua1N0YXRlIHx8IChDaHVua1N0YXRlID0ge30pKTsKICAgIHZhciBudW1DaHVua1N0YXRlcyA9IDg7CiAgICB2YXIgQ2h1bmtQcmlvcml0eVRpZXI7CiAgICAoZnVuY3Rpb24oQ2h1bmtQcmlvcml0eVRpZXIyKSB7CiAgICAgIENodW5rUHJpb3JpdHlUaWVyMltDaHVua1ByaW9yaXR5VGllcjJbIkZJUlNUX1RJRVIiXSA9IDBdID0gIkZJUlNUX1RJRVIiOwogICAgICBDaHVua1ByaW9yaXR5VGllcjJbQ2h1bmtQcmlvcml0eVRpZXIyWyJGSVJTVF9PUkRFUkVEX1RJRVIiXSA9IDBdID0gIkZJUlNUX09SREVSRURfVElFUiI7CiAgICAgIENodW5rUHJpb3JpdHlUaWVyMltDaHVua1ByaW9yaXR5VGllcjJbIlZJU0lCTEUiXSA9IDBdID0gIlZJU0lCTEUiOwogICAgICBDaHVua1ByaW9yaXR5VGllcjJbQ2h1bmtQcmlvcml0eVRpZXIyWyJQUkVGRVRDSCJdID0gMV0gPSAiUFJFRkVUQ0giOwogICAgICBDaHVua1ByaW9yaXR5VGllcjJbQ2h1bmtQcmlvcml0eVRpZXIyWyJMQVNUX09SREVSRURfVElFUiJdID0gMV0gPSAiTEFTVF9PUkRFUkVEX1RJRVIiOwogICAgICBDaHVua1ByaW9yaXR5VGllcjJbQ2h1bmtQcmlvcml0eVRpZXIyWyJSRUNFTlQiXSA9IDJdID0gIlJFQ0VOVCI7CiAgICAgIENodW5rUHJpb3JpdHlUaWVyMltDaHVua1ByaW9yaXR5VGllcjJbIkxBU1RfVElFUiJdID0gMl0gPSAiTEFTVF9USUVSIjsKICAgIH0pKENodW5rUHJpb3JpdHlUaWVyIHx8IChDaHVua1ByaW9yaXR5VGllciA9IHt9KSk7CiAgICB2YXIgbnVtQ2h1bmtQcmlvcml0eVRpZXJzID0gMzsKICAgIHZhciBDaHVua0Rvd25sb2FkU3RhdGlzdGljczsKICAgIChmdW5jdGlvbihDaHVua0Rvd25sb2FkU3RhdGlzdGljczIpIHsKICAgICAgQ2h1bmtEb3dubG9hZFN0YXRpc3RpY3MyW0NodW5rRG93bmxvYWRTdGF0aXN0aWNzMlsidG90YWxUaW1lIl0gPSAwXSA9ICJ0b3RhbFRpbWUiOwogICAgICBDaHVua0Rvd25sb2FkU3RhdGlzdGljczJbQ2h1bmtEb3dubG9hZFN0YXRpc3RpY3MyWyJ0b3RhbENodW5rcyJdID0gMV0gPSAidG90YWxDaHVua3MiOwogICAgfSkoQ2h1bmtEb3dubG9hZFN0YXRpc3RpY3MgfHwgKENodW5rRG93bmxvYWRTdGF0aXN0aWNzID0ge30pKTsKICAgIHZhciBDaHVua01lbW9yeVN0YXRpc3RpY3M7CiAgICAoZnVuY3Rpb24oQ2h1bmtNZW1vcnlTdGF0aXN0aWNzMikgewogICAgICBDaHVua01lbW9yeVN0YXRpc3RpY3MyW0NodW5rTWVtb3J5U3RhdGlzdGljczJbIm51bUNodW5rcyJdID0gMF0gPSAibnVtQ2h1bmtzIjsKICAgICAgQ2h1bmtNZW1vcnlTdGF0aXN0aWNzMltDaHVua01lbW9yeVN0YXRpc3RpY3MyWyJzeXN0ZW1NZW1vcnlCeXRlcyJdID0gMV0gPSAic3lzdGVtTWVtb3J5Qnl0ZXMiOwogICAgICBDaHVua01lbW9yeVN0YXRpc3RpY3MyW0NodW5rTWVtb3J5U3RhdGlzdGljczJbImdwdU1lbW9yeUJ5dGVzIl0gPSAyXSA9ICJncHVNZW1vcnlCeXRlcyI7CiAgICB9KShDaHVua01lbW9yeVN0YXRpc3RpY3MgfHwgKENodW5rTWVtb3J5U3RhdGlzdGljcyA9IHt9KSk7CiAgICB2YXIgbnVtQ2h1bmtNZW1vcnlTdGF0aXN0aWNzID0gMzsKICAgIHZhciBudW1DaHVua0Rvd25sb2FkU3RhdGlzdGljcyA9IDI7CiAgICB2YXIgbnVtQ2h1bmtTdGF0aXN0aWNzID0gbnVtQ2h1bmtTdGF0ZXMgKiBudW1DaHVua1ByaW9yaXR5VGllcnMgKiBudW1DaHVua01lbW9yeVN0YXRpc3RpY3MgKyBudW1DaHVua0Rvd25sb2FkU3RhdGlzdGljczsKICAgIGZ1bmN0aW9uIGdldENodW5rU3RhdGVTdGF0aXN0aWNJbmRleChzdGF0ZSwgcHJpb3JpdHlUaWVyKSB7CiAgICAgIHJldHVybiBzdGF0ZSAqIG51bUNodW5rUHJpb3JpdHlUaWVycyArIHByaW9yaXR5VGllcjsKICAgIH0KICAgIGZ1bmN0aW9uIGdldENodW5rRG93bmxvYWRTdGF0aXN0aWNJbmRleChzdGF0aXN0aWMpIHsKICAgICAgcmV0dXJuIG51bUNodW5rU3RhdGVzICogbnVtQ2h1bmtQcmlvcml0eVRpZXJzICogbnVtQ2h1bmtNZW1vcnlTdGF0aXN0aWNzICsgc3RhdGlzdGljOwogICAgfQogICAgdmFyIFBSRUZFVENIX1BSSU9SSVRZX01VTFRJUExJRVIgPSAxZTEzOwogICAgdmFyIENIVU5LX1FVRVVFX01BTkFHRVJfUlBDX0lEID0gIkNodW5rUXVldWVNYW5hZ2VyIjsKICAgIHZhciBDSFVOS19NQU5BR0VSX1JQQ19JRCA9ICJDaHVua01hbmFnZXIiOwogICAgdmFyIENIVU5LX1NPVVJDRV9JTlZBTElEQVRFX1JQQ19JRCA9ICJDaHVua1NvdXJjZS5pbnZhbGlkYXRlIjsKICAgIHZhciBSRVFVRVNUX0NIVU5LX1NUQVRJU1RJQ1NfUlBDX0lEID0gIkNodW5rUXVldWVNYW5hZ2VyLnJlcXVlc3RDaHVua1N0YXRpc3RpY3MiOwogICAgdmFyIENIVU5LX0xBWUVSX1NUQVRJU1RJQ1NfUlBDX0lEID0gIkNodW5rTWFuYWdlci5jaHVua0xheWVyU3RhdGlzdGljcyI7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL2xpbmtlZF9saXN0LjAudHMKICAgIHZhciBsaW5rZWRfbGlzdF8wX2RlZmF1bHQgPSBjbGFzcyB7CiAgICAgIHN0YXRpYyBpbnNlcnRBZnRlcihoZWFkLCB4KSB7CiAgICAgICAgbGV0IG5leHQgPSBoZWFkLm5leHQwOwogICAgICAgIHgubmV4dDAgPSBuZXh0OwogICAgICAgIHgucHJldjAgPSBoZWFkOwogICAgICAgIGhlYWQubmV4dDAgPSB4OwogICAgICAgIG5leHQucHJldjAgPSB4OwogICAgICB9CiAgICAgIHN0YXRpYyBpbnNlcnRCZWZvcmUoaGVhZCwgeCkgewogICAgICAgIGxldCBwcmV2ID0gaGVhZC5wcmV2MDsKICAgICAgICB4LnByZXYwID0gcHJldjsKICAgICAgICB4Lm5leHQwID0gaGVhZDsKICAgICAgICBoZWFkLnByZXYwID0geDsKICAgICAgICBwcmV2Lm5leHQwID0geDsKICAgICAgfQogICAgICBzdGF0aWMgZnJvbnQoaGVhZCkgewogICAgICAgIGxldCBuZXh0ID0gaGVhZC5uZXh0MDsKICAgICAgICBpZiAobmV4dCA9PT0gaGVhZCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICAgIHN0YXRpYyBiYWNrKGhlYWQpIHsKICAgICAgICBsZXQgbmV4dCA9IGhlYWQucHJldjA7CiAgICAgICAgaWYgKG5leHQgPT09IGhlYWQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQogICAgICBzdGF0aWMgcG9wKHgpIHsKICAgICAgICBsZXQgbmV4dCA9IHgubmV4dDA7CiAgICAgICAgbGV0IHByZXYgPSB4LnByZXYwOwogICAgICAgIG5leHQucHJldjAgPSBwcmV2OwogICAgICAgIHByZXYubmV4dDAgPSBuZXh0OwogICAgICAgIHgubmV4dDAgPSBudWxsOwogICAgICAgIHgucHJldjAgPSBudWxsOwogICAgICAgIHJldHVybiB4OwogICAgICB9CiAgICAgIHN0YXRpYyAqaXRlcmF0b3IoaGVhZCkgewogICAgICAgIGZvciAobGV0IHggPSBoZWFkLm5leHQwOyB4ICE9PSBoZWFkOyB4ID0geC5uZXh0MCkgewogICAgICAgICAgeWllbGQgeDsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGljICpyZXZlcnNlSXRlcmF0b3IoaGVhZCkgewogICAgICAgIGZvciAobGV0IHggPSBoZWFkLnByZXYwOyB4ICE9PSBoZWFkOyB4ID0geC5wcmV2MCkgewogICAgICAgICAgeWllbGQgeDsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGljIGluaXRpYWxpemVIZWFkKGhlYWQpIHsKICAgICAgICBoZWFkLm5leHQwID0gaGVhZC5wcmV2MCA9IGhlYWQ7CiAgICAgIH0KICAgIH07CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL2xpbmtlZF9saXN0LjEudHMKICAgIHZhciBsaW5rZWRfbGlzdF8xX2RlZmF1bHQgPSBjbGFzcyB7CiAgICAgIHN0YXRpYyBpbnNlcnRBZnRlcihoZWFkLCB4KSB7CiAgICAgICAgbGV0IG5leHQgPSBoZWFkLm5leHQxOwogICAgICAgIHgubmV4dDEgPSBuZXh0OwogICAgICAgIHgucHJldjEgPSBoZWFkOwogICAgICAgIGhlYWQubmV4dDEgPSB4OwogICAgICAgIG5leHQucHJldjEgPSB4OwogICAgICB9CiAgICAgIHN0YXRpYyBpbnNlcnRCZWZvcmUoaGVhZCwgeCkgewogICAgICAgIGxldCBwcmV2ID0gaGVhZC5wcmV2MTsKICAgICAgICB4LnByZXYxID0gcHJldjsKICAgICAgICB4Lm5leHQxID0gaGVhZDsKICAgICAgICBoZWFkLnByZXYxID0geDsKICAgICAgICBwcmV2Lm5leHQxID0geDsKICAgICAgfQogICAgICBzdGF0aWMgZnJvbnQoaGVhZCkgewogICAgICAgIGxldCBuZXh0ID0gaGVhZC5uZXh0MTsKICAgICAgICBpZiAobmV4dCA9PT0gaGVhZCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICAgIHN0YXRpYyBiYWNrKGhlYWQpIHsKICAgICAgICBsZXQgbmV4dCA9IGhlYWQucHJldjE7CiAgICAgICAgaWYgKG5leHQgPT09IGhlYWQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQogICAgICBzdGF0aWMgcG9wKHgpIHsKICAgICAgICBsZXQgbmV4dCA9IHgubmV4dDE7CiAgICAgICAgbGV0IHByZXYgPSB4LnByZXYxOwogICAgICAgIG5leHQucHJldjEgPSBwcmV2OwogICAgICAgIHByZXYubmV4dDEgPSBuZXh0OwogICAgICAgIHgubmV4dDEgPSBudWxsOwogICAgICAgIHgucHJldjEgPSBudWxsOwogICAgICAgIHJldHVybiB4OwogICAgICB9CiAgICAgIHN0YXRpYyAqaXRlcmF0b3IoaGVhZCkgewogICAgICAgIGZvciAobGV0IHggPSBoZWFkLm5leHQxOyB4ICE9PSBoZWFkOyB4ID0geC5uZXh0MSkgewogICAgICAgICAgeWllbGQgeDsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGljICpyZXZlcnNlSXRlcmF0b3IoaGVhZCkgewogICAgICAgIGZvciAobGV0IHggPSBoZWFkLnByZXYxOyB4ICE9PSBoZWFkOyB4ID0geC5wcmV2MSkgewogICAgICAgICAgeWllbGQgeDsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGljIGluaXRpYWxpemVIZWFkKGhlYWQpIHsKICAgICAgICBoZWFkLm5leHQxID0gaGVhZC5wcmV2MSA9IGhlYWQ7CiAgICAgIH0KICAgIH07CgogICAgLy8gbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vY29tbW9uLmpzCiAgICB2YXIgRVBTSUxPTiA9IDFlLTY7CiAgICB2YXIgQVJSQVlfVFlQRSA9IHR5cGVvZiBGbG9hdDMyQXJyYXkgIT09ICJ1bmRlZmluZWQiID8gRmxvYXQzMkFycmF5IDogQXJyYXk7CiAgICB2YXIgUkFORE9NID0gTWF0aC5yYW5kb207CiAgICBpZiAoIU1hdGguaHlwb3QpCiAgICAgIE1hdGguaHlwb3QgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgeSA9IDAsIGkgPSBhcmd1bWVudHMubGVuZ3RoOwogICAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICAgIHkgKz0gYXJndW1lbnRzW2ldICogYXJndW1lbnRzW2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHkpOwogICAgICB9OwoKICAgIC8vIG5vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL21hdDMuanMKICAgIHZhciBtYXQzX2V4cG9ydHMgPSB7fTsKICAgIF9fZXhwb3J0KG1hdDNfZXhwb3J0cywgewogICAgICBhZGQ6ICgpID0+IGFkZCwKICAgICAgYWRqb2ludDogKCkgPT4gYWRqb2ludCwKICAgICAgY2xvbmU6ICgpID0+IGNsb25lLAogICAgICBjb3B5OiAoKSA9PiBjb3B5LAogICAgICBjcmVhdGU6ICgpID0+IGNyZWF0ZSwKICAgICAgZGV0ZXJtaW5hbnQ6ICgpID0+IGRldGVybWluYW50LAogICAgICBlcXVhbHM6ICgpID0+IGVxdWFscywKICAgICAgZXhhY3RFcXVhbHM6ICgpID0+IGV4YWN0RXF1YWxzLAogICAgICBmcm9iOiAoKSA9PiBmcm9iLAogICAgICBmcm9tTWF0MmQ6ICgpID0+IGZyb21NYXQyZCwKICAgICAgZnJvbU1hdDQ6ICgpID0+IGZyb21NYXQ0LAogICAgICBmcm9tUXVhdDogKCkgPT4gZnJvbVF1YXQsCiAgICAgIGZyb21Sb3RhdGlvbjogKCkgPT4gZnJvbVJvdGF0aW9uLAogICAgICBmcm9tU2NhbGluZzogKCkgPT4gZnJvbVNjYWxpbmcsCiAgICAgIGZyb21UcmFuc2xhdGlvbjogKCkgPT4gZnJvbVRyYW5zbGF0aW9uLAogICAgICBmcm9tVmFsdWVzOiAoKSA9PiBmcm9tVmFsdWVzLAogICAgICBpZGVudGl0eTogKCkgPT4gaWRlbnRpdHksCiAgICAgIGludmVydDogKCkgPT4gaW52ZXJ0LAogICAgICBtdWw6ICgpID0+IG11bCwKICAgICAgbXVsdGlwbHk6ICgpID0+IG11bHRpcGx5LAogICAgICBtdWx0aXBseVNjYWxhcjogKCkgPT4gbXVsdGlwbHlTY2FsYXIsCiAgICAgIG11bHRpcGx5U2NhbGFyQW5kQWRkOiAoKSA9PiBtdWx0aXBseVNjYWxhckFuZEFkZCwKICAgICAgbm9ybWFsRnJvbU1hdDQ6ICgpID0+IG5vcm1hbEZyb21NYXQ0LAogICAgICBwcm9qZWN0aW9uOiAoKSA9PiBwcm9qZWN0aW9uLAogICAgICByb3RhdGU6ICgpID0+IHJvdGF0ZSwKICAgICAgc2NhbGU6ICgpID0+IHNjYWxlLAogICAgICBzZXQ6ICgpID0+IHNldCwKICAgICAgc3RyOiAoKSA9PiBzdHIsCiAgICAgIHN1YjogKCkgPT4gc3ViLAogICAgICBzdWJ0cmFjdDogKCkgPT4gc3VidHJhY3QsCiAgICAgIHRyYW5zbGF0ZTogKCkgPT4gdHJhbnNsYXRlLAogICAgICB0cmFuc3Bvc2U6ICgpID0+IHRyYW5zcG9zZQogICAgfSk7CiAgICBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAgIHZhciBvdXQgPSBuZXcgQVJSQVlfVFlQRSg5KTsKICAgICAgaWYgKEFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7CiAgICAgICAgb3V0WzFdID0gMDsKICAgICAgICBvdXRbMl0gPSAwOwogICAgICAgIG91dFszXSA9IDA7CiAgICAgICAgb3V0WzVdID0gMDsKICAgICAgICBvdXRbNl0gPSAwOwogICAgICAgIG91dFs3XSA9IDA7CiAgICAgIH0KICAgICAgb3V0WzBdID0gMTsKICAgICAgb3V0WzRdID0gMTsKICAgICAgb3V0WzhdID0gMTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21NYXQ0KG91dCwgYSkgewogICAgICBvdXRbMF0gPSBhWzBdOwogICAgICBvdXRbMV0gPSBhWzFdOwogICAgICBvdXRbMl0gPSBhWzJdOwogICAgICBvdXRbM10gPSBhWzRdOwogICAgICBvdXRbNF0gPSBhWzVdOwogICAgICBvdXRbNV0gPSBhWzZdOwogICAgICBvdXRbNl0gPSBhWzhdOwogICAgICBvdXRbN10gPSBhWzldOwogICAgICBvdXRbOF0gPSBhWzEwXTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGNsb25lKGEpIHsKICAgICAgdmFyIG91dCA9IG5ldyBBUlJBWV9UWVBFKDkpOwogICAgICBvdXRbMF0gPSBhWzBdOwogICAgICBvdXRbMV0gPSBhWzFdOwogICAgICBvdXRbMl0gPSBhWzJdOwogICAgICBvdXRbM10gPSBhWzNdOwogICAgICBvdXRbNF0gPSBhWzRdOwogICAgICBvdXRbNV0gPSBhWzVdOwogICAgICBvdXRbNl0gPSBhWzZdOwogICAgICBvdXRbN10gPSBhWzddOwogICAgICBvdXRbOF0gPSBhWzhdOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gY29weShvdXQsIGEpIHsKICAgICAgb3V0WzBdID0gYVswXTsKICAgICAgb3V0WzFdID0gYVsxXTsKICAgICAgb3V0WzJdID0gYVsyXTsKICAgICAgb3V0WzNdID0gYVszXTsKICAgICAgb3V0WzRdID0gYVs0XTsKICAgICAgb3V0WzVdID0gYVs1XTsKICAgICAgb3V0WzZdID0gYVs2XTsKICAgICAgb3V0WzddID0gYVs3XTsKICAgICAgb3V0WzhdID0gYVs4XTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0wMiwgbTEwLCBtMTEsIG0xMiwgbTIwLCBtMjEsIG0yMikgewogICAgICB2YXIgb3V0ID0gbmV3IEFSUkFZX1RZUEUoOSk7CiAgICAgIG91dFswXSA9IG0wMDsKICAgICAgb3V0WzFdID0gbTAxOwogICAgICBvdXRbMl0gPSBtMDI7CiAgICAgIG91dFszXSA9IG0xMDsKICAgICAgb3V0WzRdID0gbTExOwogICAgICBvdXRbNV0gPSBtMTI7CiAgICAgIG91dFs2XSA9IG0yMDsKICAgICAgb3V0WzddID0gbTIxOwogICAgICBvdXRbOF0gPSBtMjI7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzZXQob3V0LCBtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLCBtMjAsIG0yMSwgbTIyKSB7CiAgICAgIG91dFswXSA9IG0wMDsKICAgICAgb3V0WzFdID0gbTAxOwogICAgICBvdXRbMl0gPSBtMDI7CiAgICAgIG91dFszXSA9IG0xMDsKICAgICAgb3V0WzRdID0gbTExOwogICAgICBvdXRbNV0gPSBtMTI7CiAgICAgIG91dFs2XSA9IG0yMDsKICAgICAgb3V0WzddID0gbTIxOwogICAgICBvdXRbOF0gPSBtMjI7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHsKICAgICAgb3V0WzBdID0gMTsKICAgICAgb3V0WzFdID0gMDsKICAgICAgb3V0WzJdID0gMDsKICAgICAgb3V0WzNdID0gMDsKICAgICAgb3V0WzRdID0gMTsKICAgICAgb3V0WzVdID0gMDsKICAgICAgb3V0WzZdID0gMDsKICAgICAgb3V0WzddID0gMDsKICAgICAgb3V0WzhdID0gMTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHRyYW5zcG9zZShvdXQsIGEpIHsKICAgICAgaWYgKG91dCA9PT0gYSkgewogICAgICAgIHZhciBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMTIgPSBhWzVdOwogICAgICAgIG91dFsxXSA9IGFbM107CiAgICAgICAgb3V0WzJdID0gYVs2XTsKICAgICAgICBvdXRbM10gPSBhMDE7CiAgICAgICAgb3V0WzVdID0gYVs3XTsKICAgICAgICBvdXRbNl0gPSBhMDI7CiAgICAgICAgb3V0WzddID0gYTEyOwogICAgICB9IGVsc2UgewogICAgICAgIG91dFswXSA9IGFbMF07CiAgICAgICAgb3V0WzFdID0gYVszXTsKICAgICAgICBvdXRbMl0gPSBhWzZdOwogICAgICAgIG91dFszXSA9IGFbMV07CiAgICAgICAgb3V0WzRdID0gYVs0XTsKICAgICAgICBvdXRbNV0gPSBhWzddOwogICAgICAgIG91dFs2XSA9IGFbMl07CiAgICAgICAgb3V0WzddID0gYVs1XTsKICAgICAgICBvdXRbOF0gPSBhWzhdOwogICAgICB9CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7CiAgICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdOwogICAgICB2YXIgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XTsKICAgICAgdmFyIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF07CiAgICAgIHZhciBiMDEgPSBhMjIgKiBhMTEgLSBhMTIgKiBhMjE7CiAgICAgIHZhciBiMTEgPSAtYTIyICogYTEwICsgYTEyICogYTIwOwogICAgICB2YXIgYjIxID0gYTIxICogYTEwIC0gYTExICogYTIwOwogICAgICB2YXIgZGV0ID0gYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxOwogICAgICBpZiAoIWRldCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGRldCA9IDEgLyBkZXQ7CiAgICAgIG91dFswXSA9IGIwMSAqIGRldDsKICAgICAgb3V0WzFdID0gKC1hMjIgKiBhMDEgKyBhMDIgKiBhMjEpICogZGV0OwogICAgICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldDsKICAgICAgb3V0WzNdID0gYjExICogZGV0OwogICAgICBvdXRbNF0gPSAoYTIyICogYTAwIC0gYTAyICogYTIwKSAqIGRldDsKICAgICAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0OwogICAgICBvdXRbNl0gPSBiMjEgKiBkZXQ7CiAgICAgIG91dFs3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGRldDsKICAgICAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXQ7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBhZGpvaW50KG91dCwgYSkgewogICAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXTsKICAgICAgdmFyIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV07CiAgICAgIHZhciBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdOwogICAgICBvdXRbMF0gPSBhMTEgKiBhMjIgLSBhMTIgKiBhMjE7CiAgICAgIG91dFsxXSA9IGEwMiAqIGEyMSAtIGEwMSAqIGEyMjsKICAgICAgb3V0WzJdID0gYTAxICogYTEyIC0gYTAyICogYTExOwogICAgICBvdXRbM10gPSBhMTIgKiBhMjAgLSBhMTAgKiBhMjI7CiAgICAgIG91dFs0XSA9IGEwMCAqIGEyMiAtIGEwMiAqIGEyMDsKICAgICAgb3V0WzVdID0gYTAyICogYTEwIC0gYTAwICogYTEyOwogICAgICBvdXRbNl0gPSBhMTAgKiBhMjEgLSBhMTEgKiBhMjA7CiAgICAgIG91dFs3XSA9IGEwMSAqIGEyMCAtIGEwMCAqIGEyMTsKICAgICAgb3V0WzhdID0gYTAwICogYTExIC0gYTAxICogYTEwOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkgewogICAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXTsKICAgICAgdmFyIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV07CiAgICAgIHZhciBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdOwogICAgICByZXR1cm4gYTAwICogKGEyMiAqIGExMSAtIGExMiAqIGEyMSkgKyBhMDEgKiAoLWEyMiAqIGExMCArIGExMiAqIGEyMCkgKyBhMDIgKiAoYTIxICogYTEwIC0gYTExICogYTIwKTsKICAgIH0KICAgIGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikgewogICAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXTsKICAgICAgdmFyIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV07CiAgICAgIHZhciBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdOwogICAgICB2YXIgYjAwID0gYlswXSwgYjAxID0gYlsxXSwgYjAyID0gYlsyXTsKICAgICAgdmFyIGIxMCA9IGJbM10sIGIxMSA9IGJbNF0sIGIxMiA9IGJbNV07CiAgICAgIHZhciBiMjAgPSBiWzZdLCBiMjEgPSBiWzddLCBiMjIgPSBiWzhdOwogICAgICBvdXRbMF0gPSBiMDAgKiBhMDAgKyBiMDEgKiBhMTAgKyBiMDIgKiBhMjA7CiAgICAgIG91dFsxXSA9IGIwMCAqIGEwMSArIGIwMSAqIGExMSArIGIwMiAqIGEyMTsKICAgICAgb3V0WzJdID0gYjAwICogYTAyICsgYjAxICogYTEyICsgYjAyICogYTIyOwogICAgICBvdXRbM10gPSBiMTAgKiBhMDAgKyBiMTEgKiBhMTAgKyBiMTIgKiBhMjA7CiAgICAgIG91dFs0XSA9IGIxMCAqIGEwMSArIGIxMSAqIGExMSArIGIxMiAqIGEyMTsKICAgICAgb3V0WzVdID0gYjEwICogYTAyICsgYjExICogYTEyICsgYjEyICogYTIyOwogICAgICBvdXRbNl0gPSBiMjAgKiBhMDAgKyBiMjEgKiBhMTAgKyBiMjIgKiBhMjA7CiAgICAgIG91dFs3XSA9IGIyMCAqIGEwMSArIGIyMSAqIGExMSArIGIyMiAqIGEyMTsKICAgICAgb3V0WzhdID0gYjIwICogYTAyICsgYjIxICogYTEyICsgYjIyICogYTIyOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikgewogICAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSwgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XSwgeCA9IHZbMF0sIHkgPSB2WzFdOwogICAgICBvdXRbMF0gPSBhMDA7CiAgICAgIG91dFsxXSA9IGEwMTsKICAgICAgb3V0WzJdID0gYTAyOwogICAgICBvdXRbM10gPSBhMTA7CiAgICAgIG91dFs0XSA9IGExMTsKICAgICAgb3V0WzVdID0gYTEyOwogICAgICBvdXRbNl0gPSB4ICogYTAwICsgeSAqIGExMCArIGEyMDsKICAgICAgb3V0WzddID0geCAqIGEwMSArIHkgKiBhMTEgKyBhMjE7CiAgICAgIG91dFs4XSA9IHggKiBhMDIgKyB5ICogYTEyICsgYTIyOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkKSB7CiAgICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLCBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdLCBzID0gTWF0aC5zaW4ocmFkKSwgYyA9IE1hdGguY29zKHJhZCk7CiAgICAgIG91dFswXSA9IGMgKiBhMDAgKyBzICogYTEwOwogICAgICBvdXRbMV0gPSBjICogYTAxICsgcyAqIGExMTsKICAgICAgb3V0WzJdID0gYyAqIGEwMiArIHMgKiBhMTI7CiAgICAgIG91dFszXSA9IGMgKiBhMTAgLSBzICogYTAwOwogICAgICBvdXRbNF0gPSBjICogYTExIC0gcyAqIGEwMTsKICAgICAgb3V0WzVdID0gYyAqIGExMiAtIHMgKiBhMDI7CiAgICAgIG91dFs2XSA9IGEyMDsKICAgICAgb3V0WzddID0gYTIxOwogICAgICBvdXRbOF0gPSBhMjI7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHsKICAgICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXTsKICAgICAgb3V0WzBdID0geCAqIGFbMF07CiAgICAgIG91dFsxXSA9IHggKiBhWzFdOwogICAgICBvdXRbMl0gPSB4ICogYVsyXTsKICAgICAgb3V0WzNdID0geSAqIGFbM107CiAgICAgIG91dFs0XSA9IHkgKiBhWzRdOwogICAgICBvdXRbNV0gPSB5ICogYVs1XTsKICAgICAgb3V0WzZdID0gYVs2XTsKICAgICAgb3V0WzddID0gYVs3XTsKICAgICAgb3V0WzhdID0gYVs4XTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21UcmFuc2xhdGlvbihvdXQsIHYpIHsKICAgICAgb3V0WzBdID0gMTsKICAgICAgb3V0WzFdID0gMDsKICAgICAgb3V0WzJdID0gMDsKICAgICAgb3V0WzNdID0gMDsKICAgICAgb3V0WzRdID0gMTsKICAgICAgb3V0WzVdID0gMDsKICAgICAgb3V0WzZdID0gdlswXTsKICAgICAgb3V0WzddID0gdlsxXTsKICAgICAgb3V0WzhdID0gMTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkgewogICAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksIGMgPSBNYXRoLmNvcyhyYWQpOwogICAgICBvdXRbMF0gPSBjOwogICAgICBvdXRbMV0gPSBzOwogICAgICBvdXRbMl0gPSAwOwogICAgICBvdXRbM10gPSAtczsKICAgICAgb3V0WzRdID0gYzsKICAgICAgb3V0WzVdID0gMDsKICAgICAgb3V0WzZdID0gMDsKICAgICAgb3V0WzddID0gMDsKICAgICAgb3V0WzhdID0gMTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21TY2FsaW5nKG91dCwgdikgewogICAgICBvdXRbMF0gPSB2WzBdOwogICAgICBvdXRbMV0gPSAwOwogICAgICBvdXRbMl0gPSAwOwogICAgICBvdXRbM10gPSAwOwogICAgICBvdXRbNF0gPSB2WzFdOwogICAgICBvdXRbNV0gPSAwOwogICAgICBvdXRbNl0gPSAwOwogICAgICBvdXRbN10gPSAwOwogICAgICBvdXRbOF0gPSAxOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZnJvbU1hdDJkKG91dCwgYSkgewogICAgICBvdXRbMF0gPSBhWzBdOwogICAgICBvdXRbMV0gPSBhWzFdOwogICAgICBvdXRbMl0gPSAwOwogICAgICBvdXRbM10gPSBhWzJdOwogICAgICBvdXRbNF0gPSBhWzNdOwogICAgICBvdXRbNV0gPSAwOwogICAgICBvdXRbNl0gPSBhWzRdOwogICAgICBvdXRbN10gPSBhWzVdOwogICAgICBvdXRbOF0gPSAxOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZnJvbVF1YXQob3V0LCBxKSB7CiAgICAgIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXTsKICAgICAgdmFyIHgyID0geCArIHg7CiAgICAgIHZhciB5MiA9IHkgKyB5OwogICAgICB2YXIgejIgPSB6ICsgejsKICAgICAgdmFyIHh4ID0geCAqIHgyOwogICAgICB2YXIgeXggPSB5ICogeDI7CiAgICAgIHZhciB5eSA9IHkgKiB5MjsKICAgICAgdmFyIHp4ID0geiAqIHgyOwogICAgICB2YXIgenkgPSB6ICogeTI7CiAgICAgIHZhciB6eiA9IHogKiB6MjsKICAgICAgdmFyIHd4ID0gdyAqIHgyOwogICAgICB2YXIgd3kgPSB3ICogeTI7CiAgICAgIHZhciB3eiA9IHcgKiB6MjsKICAgICAgb3V0WzBdID0gMSAtIHl5IC0geno7CiAgICAgIG91dFszXSA9IHl4IC0gd3o7CiAgICAgIG91dFs2XSA9IHp4ICsgd3k7CiAgICAgIG91dFsxXSA9IHl4ICsgd3o7CiAgICAgIG91dFs0XSA9IDEgLSB4eCAtIHp6OwogICAgICBvdXRbN10gPSB6eSAtIHd4OwogICAgICBvdXRbMl0gPSB6eCAtIHd5OwogICAgICBvdXRbNV0gPSB6eSArIHd4OwogICAgICBvdXRbOF0gPSAxIC0geHggLSB5eTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbEZyb21NYXQ0KG91dCwgYSkgewogICAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXTsKICAgICAgdmFyIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN107CiAgICAgIHZhciBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV07CiAgICAgIHZhciBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XTsKICAgICAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDsKICAgICAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDsKICAgICAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDsKICAgICAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTsKICAgICAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTsKICAgICAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjsKICAgICAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDsKICAgICAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDsKICAgICAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDsKICAgICAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTsKICAgICAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTsKICAgICAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsKICAgICAgdmFyIGRldCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjsKICAgICAgaWYgKCFkZXQpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBkZXQgPSAxIC8gZGV0OwogICAgICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldDsKICAgICAgb3V0WzFdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7CiAgICAgIG91dFsyXSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0OwogICAgICBvdXRbM10gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDsKICAgICAgb3V0WzRdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7CiAgICAgIG91dFs1XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0OwogICAgICBvdXRbNl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldDsKICAgICAgb3V0WzddID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7CiAgICAgIG91dFs4XSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0OwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gcHJvamVjdGlvbihvdXQsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgb3V0WzBdID0gMiAvIHdpZHRoOwogICAgICBvdXRbMV0gPSAwOwogICAgICBvdXRbMl0gPSAwOwogICAgICBvdXRbM10gPSAwOwogICAgICBvdXRbNF0gPSAtMiAvIGhlaWdodDsKICAgICAgb3V0WzVdID0gMDsKICAgICAgb3V0WzZdID0gLTE7CiAgICAgIG91dFs3XSA9IDE7CiAgICAgIG91dFs4XSA9IDE7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdHIoYSkgewogICAgICByZXR1cm4gIm1hdDMoIiArIGFbMF0gKyAiLCAiICsgYVsxXSArICIsICIgKyBhWzJdICsgIiwgIiArIGFbM10gKyAiLCAiICsgYVs0XSArICIsICIgKyBhWzVdICsgIiwgIiArIGFbNl0gKyAiLCAiICsgYVs3XSArICIsICIgKyBhWzhdICsgIikiOwogICAgfQogICAgZnVuY3Rpb24gZnJvYihhKSB7CiAgICAgIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIGFbNl0sIGFbN10sIGFbOF0pOwogICAgfQogICAgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikgewogICAgICBvdXRbMF0gPSBhWzBdICsgYlswXTsKICAgICAgb3V0WzFdID0gYVsxXSArIGJbMV07CiAgICAgIG91dFsyXSA9IGFbMl0gKyBiWzJdOwogICAgICBvdXRbM10gPSBhWzNdICsgYlszXTsKICAgICAgb3V0WzRdID0gYVs0XSArIGJbNF07CiAgICAgIG91dFs1XSA9IGFbNV0gKyBiWzVdOwogICAgICBvdXRbNl0gPSBhWzZdICsgYls2XTsKICAgICAgb3V0WzddID0gYVs3XSArIGJbN107CiAgICAgIG91dFs4XSA9IGFbOF0gKyBiWzhdOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7CiAgICAgIG91dFswXSA9IGFbMF0gLSBiWzBdOwogICAgICBvdXRbMV0gPSBhWzFdIC0gYlsxXTsKICAgICAgb3V0WzJdID0gYVsyXSAtIGJbMl07CiAgICAgIG91dFszXSA9IGFbM10gLSBiWzNdOwogICAgICBvdXRbNF0gPSBhWzRdIC0gYls0XTsKICAgICAgb3V0WzVdID0gYVs1XSAtIGJbNV07CiAgICAgIG91dFs2XSA9IGFbNl0gLSBiWzZdOwogICAgICBvdXRbN10gPSBhWzddIC0gYls3XTsKICAgICAgb3V0WzhdID0gYVs4XSAtIGJbOF07CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHsKICAgICAgb3V0WzBdID0gYVswXSAqIGI7CiAgICAgIG91dFsxXSA9IGFbMV0gKiBiOwogICAgICBvdXRbMl0gPSBhWzJdICogYjsKICAgICAgb3V0WzNdID0gYVszXSAqIGI7CiAgICAgIG91dFs0XSA9IGFbNF0gKiBiOwogICAgICBvdXRbNV0gPSBhWzVdICogYjsKICAgICAgb3V0WzZdID0gYVs2XSAqIGI7CiAgICAgIG91dFs3XSA9IGFbN10gKiBiOwogICAgICBvdXRbOF0gPSBhWzhdICogYjsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGU2KSB7CiAgICAgIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU2OwogICAgICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlNjsKICAgICAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTY7CiAgICAgIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU2OwogICAgICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlNjsKICAgICAgb3V0WzVdID0gYVs1XSArIGJbNV0gKiBzY2FsZTY7CiAgICAgIG91dFs2XSA9IGFbNl0gKyBiWzZdICogc2NhbGU2OwogICAgICBvdXRbN10gPSBhWzddICsgYls3XSAqIHNjYWxlNjsKICAgICAgb3V0WzhdID0gYVs4XSArIGJbOF0gKiBzY2FsZTY7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7CiAgICAgIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN10gJiYgYVs4XSA9PT0gYls4XTsKICAgIH0KICAgIGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7CiAgICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sIGE0ID0gYVs0XSwgYTUgPSBhWzVdLCBhNiA9IGFbNl0sIGE3ID0gYVs3XSwgYTggPSBhWzhdOwogICAgICB2YXIgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdLCBiNCA9IGJbNF0sIGI1ID0gYls1XSwgYjYgPSBiWzZdLCBiNyA9IGJbN10sIGI4ID0gYls4XTsKICAgICAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEsIE1hdGguYWJzKGE0KSwgTWF0aC5hYnMoYjQpKSAmJiBNYXRoLmFicyhhNSAtIGI1KSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmIE1hdGguYWJzKGE2IC0gYjYpIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLCBNYXRoLmFicyhhNiksIE1hdGguYWJzKGI2KSkgJiYgTWF0aC5hYnMoYTcgLSBiNykgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEsIE1hdGguYWJzKGE3KSwgTWF0aC5hYnMoYjcpKSAmJiBNYXRoLmFicyhhOCAtIGI4KSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTgpLCBNYXRoLmFicyhiOCkpOwogICAgfQogICAgdmFyIG11bCA9IG11bHRpcGx5OwogICAgdmFyIHN1YiA9IHN1YnRyYWN0OwoKICAgIC8vIG5vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL21hdDQuanMKICAgIHZhciBtYXQ0X2V4cG9ydHMgPSB7fTsKICAgIF9fZXhwb3J0KG1hdDRfZXhwb3J0cywgewogICAgICBhZGQ6ICgpID0+IGFkZDIsCiAgICAgIGFkam9pbnQ6ICgpID0+IGFkam9pbnQyLAogICAgICBjbG9uZTogKCkgPT4gY2xvbmUyLAogICAgICBjb3B5OiAoKSA9PiBjb3B5MiwKICAgICAgY3JlYXRlOiAoKSA9PiBjcmVhdGUyLAogICAgICBkZXRlcm1pbmFudDogKCkgPT4gZGV0ZXJtaW5hbnQyLAogICAgICBlcXVhbHM6ICgpID0+IGVxdWFsczIsCiAgICAgIGV4YWN0RXF1YWxzOiAoKSA9PiBleGFjdEVxdWFsczIsCiAgICAgIGZyb2I6ICgpID0+IGZyb2IyLAogICAgICBmcm9tUXVhdDogKCkgPT4gZnJvbVF1YXQzLAogICAgICBmcm9tUXVhdDI6ICgpID0+IGZyb21RdWF0MiwKICAgICAgZnJvbVJvdGF0aW9uOiAoKSA9PiBmcm9tUm90YXRpb24yLAogICAgICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbjogKCkgPT4gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24sCiAgICAgIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGU6ICgpID0+IGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGUsCiAgICAgIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVPcmlnaW46ICgpID0+IGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVPcmlnaW4sCiAgICAgIGZyb21TY2FsaW5nOiAoKSA9PiBmcm9tU2NhbGluZzIsCiAgICAgIGZyb21UcmFuc2xhdGlvbjogKCkgPT4gZnJvbVRyYW5zbGF0aW9uMiwKICAgICAgZnJvbVZhbHVlczogKCkgPT4gZnJvbVZhbHVlczIsCiAgICAgIGZyb21YUm90YXRpb246ICgpID0+IGZyb21YUm90YXRpb24sCiAgICAgIGZyb21ZUm90YXRpb246ICgpID0+IGZyb21ZUm90YXRpb24sCiAgICAgIGZyb21aUm90YXRpb246ICgpID0+IGZyb21aUm90YXRpb24sCiAgICAgIGZydXN0dW06ICgpID0+IGZydXN0dW0sCiAgICAgIGdldFJvdGF0aW9uOiAoKSA9PiBnZXRSb3RhdGlvbiwKICAgICAgZ2V0U2NhbGluZzogKCkgPT4gZ2V0U2NhbGluZywKICAgICAgZ2V0VHJhbnNsYXRpb246ICgpID0+IGdldFRyYW5zbGF0aW9uLAogICAgICBpZGVudGl0eTogKCkgPT4gaWRlbnRpdHkyLAogICAgICBpbnZlcnQ6ICgpID0+IGludmVydDIsCiAgICAgIGxvb2tBdDogKCkgPT4gbG9va0F0LAogICAgICBtdWw6ICgpID0+IG11bDIsCiAgICAgIG11bHRpcGx5OiAoKSA9PiBtdWx0aXBseTIsCiAgICAgIG11bHRpcGx5U2NhbGFyOiAoKSA9PiBtdWx0aXBseVNjYWxhcjIsCiAgICAgIG11bHRpcGx5U2NhbGFyQW5kQWRkOiAoKSA9PiBtdWx0aXBseVNjYWxhckFuZEFkZDIsCiAgICAgIG9ydGhvOiAoKSA9PiBvcnRobywKICAgICAgcGVyc3BlY3RpdmU6ICgpID0+IHBlcnNwZWN0aXZlLAogICAgICBwZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldzogKCkgPT4gcGVyc3BlY3RpdmVGcm9tRmllbGRPZlZpZXcsCiAgICAgIHJvdGF0ZTogKCkgPT4gcm90YXRlMiwKICAgICAgcm90YXRlWDogKCkgPT4gcm90YXRlWCwKICAgICAgcm90YXRlWTogKCkgPT4gcm90YXRlWSwKICAgICAgcm90YXRlWjogKCkgPT4gcm90YXRlWiwKICAgICAgc2NhbGU6ICgpID0+IHNjYWxlMiwKICAgICAgc2V0OiAoKSA9PiBzZXQyLAogICAgICBzdHI6ICgpID0+IHN0cjIsCiAgICAgIHN1YjogKCkgPT4gc3ViMiwKICAgICAgc3VidHJhY3Q6ICgpID0+IHN1YnRyYWN0MiwKICAgICAgdGFyZ2V0VG86ICgpID0+IHRhcmdldFRvLAogICAgICB0cmFuc2xhdGU6ICgpID0+IHRyYW5zbGF0ZTIsCiAgICAgIHRyYW5zcG9zZTogKCkgPT4gdHJhbnNwb3NlMgogICAgfSk7CiAgICBmdW5jdGlvbiBjcmVhdGUyKCkgewogICAgICB2YXIgb3V0ID0gbmV3IEFSUkFZX1RZUEUoMTYpOwogICAgICBpZiAoQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHsKICAgICAgICBvdXRbMV0gPSAwOwogICAgICAgIG91dFsyXSA9IDA7CiAgICAgICAgb3V0WzNdID0gMDsKICAgICAgICBvdXRbNF0gPSAwOwogICAgICAgIG91dFs2XSA9IDA7CiAgICAgICAgb3V0WzddID0gMDsKICAgICAgICBvdXRbOF0gPSAwOwogICAgICAgIG91dFs5XSA9IDA7CiAgICAgICAgb3V0WzExXSA9IDA7CiAgICAgICAgb3V0WzEyXSA9IDA7CiAgICAgICAgb3V0WzEzXSA9IDA7CiAgICAgICAgb3V0WzE0XSA9IDA7CiAgICAgIH0KICAgICAgb3V0WzBdID0gMTsKICAgICAgb3V0WzVdID0gMTsKICAgICAgb3V0WzEwXSA9IDE7CiAgICAgIG91dFsxNV0gPSAxOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gY2xvbmUyKGEpIHsKICAgICAgdmFyIG91dCA9IG5ldyBBUlJBWV9UWVBFKDE2KTsKICAgICAgb3V0WzBdID0gYVswXTsKICAgICAgb3V0WzFdID0gYVsxXTsKICAgICAgb3V0WzJdID0gYVsyXTsKICAgICAgb3V0WzNdID0gYVszXTsKICAgICAgb3V0WzRdID0gYVs0XTsKICAgICAgb3V0WzVdID0gYVs1XTsKICAgICAgb3V0WzZdID0gYVs2XTsKICAgICAgb3V0WzddID0gYVs3XTsKICAgICAgb3V0WzhdID0gYVs4XTsKICAgICAgb3V0WzldID0gYVs5XTsKICAgICAgb3V0WzEwXSA9IGFbMTBdOwogICAgICBvdXRbMTFdID0gYVsxMV07CiAgICAgIG91dFsxMl0gPSBhWzEyXTsKICAgICAgb3V0WzEzXSA9IGFbMTNdOwogICAgICBvdXRbMTRdID0gYVsxNF07CiAgICAgIG91dFsxNV0gPSBhWzE1XTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGNvcHkyKG91dCwgYSkgewogICAgICBvdXRbMF0gPSBhWzBdOwogICAgICBvdXRbMV0gPSBhWzFdOwogICAgICBvdXRbMl0gPSBhWzJdOwogICAgICBvdXRbM10gPSBhWzNdOwogICAgICBvdXRbNF0gPSBhWzRdOwogICAgICBvdXRbNV0gPSBhWzVdOwogICAgICBvdXRbNl0gPSBhWzZdOwogICAgICBvdXRbN10gPSBhWzddOwogICAgICBvdXRbOF0gPSBhWzhdOwogICAgICBvdXRbOV0gPSBhWzldOwogICAgICBvdXRbMTBdID0gYVsxMF07CiAgICAgIG91dFsxMV0gPSBhWzExXTsKICAgICAgb3V0WzEyXSA9IGFbMTJdOwogICAgICBvdXRbMTNdID0gYVsxM107CiAgICAgIG91dFsxNF0gPSBhWzE0XTsKICAgICAgb3V0WzE1XSA9IGFbMTVdOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZnJvbVZhbHVlczIobTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7CiAgICAgIHZhciBvdXQgPSBuZXcgQVJSQVlfVFlQRSgxNik7CiAgICAgIG91dFswXSA9IG0wMDsKICAgICAgb3V0WzFdID0gbTAxOwogICAgICBvdXRbMl0gPSBtMDI7CiAgICAgIG91dFszXSA9IG0wMzsKICAgICAgb3V0WzRdID0gbTEwOwogICAgICBvdXRbNV0gPSBtMTE7CiAgICAgIG91dFs2XSA9IG0xMjsKICAgICAgb3V0WzddID0gbTEzOwogICAgICBvdXRbOF0gPSBtMjA7CiAgICAgIG91dFs5XSA9IG0yMTsKICAgICAgb3V0WzEwXSA9IG0yMjsKICAgICAgb3V0WzExXSA9IG0yMzsKICAgICAgb3V0WzEyXSA9IG0zMDsKICAgICAgb3V0WzEzXSA9IG0zMTsKICAgICAgb3V0WzE0XSA9IG0zMjsKICAgICAgb3V0WzE1XSA9IG0zMzsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldDIob3V0LCBtMDAsIG0wMSwgbTAyLCBtMDMsIG0xMCwgbTExLCBtMTIsIG0xMywgbTIwLCBtMjEsIG0yMiwgbTIzLCBtMzAsIG0zMSwgbTMyLCBtMzMpIHsKICAgICAgb3V0WzBdID0gbTAwOwogICAgICBvdXRbMV0gPSBtMDE7CiAgICAgIG91dFsyXSA9IG0wMjsKICAgICAgb3V0WzNdID0gbTAzOwogICAgICBvdXRbNF0gPSBtMTA7CiAgICAgIG91dFs1XSA9IG0xMTsKICAgICAgb3V0WzZdID0gbTEyOwogICAgICBvdXRbN10gPSBtMTM7CiAgICAgIG91dFs4XSA9IG0yMDsKICAgICAgb3V0WzldID0gbTIxOwogICAgICBvdXRbMTBdID0gbTIyOwogICAgICBvdXRbMTFdID0gbTIzOwogICAgICBvdXRbMTJdID0gbTMwOwogICAgICBvdXRbMTNdID0gbTMxOwogICAgICBvdXRbMTRdID0gbTMyOwogICAgICBvdXRbMTVdID0gbTMzOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gaWRlbnRpdHkyKG91dCkgewogICAgICBvdXRbMF0gPSAxOwogICAgICBvdXRbMV0gPSAwOwogICAgICBvdXRbMl0gPSAwOwogICAgICBvdXRbM10gPSAwOwogICAgICBvdXRbNF0gPSAwOwogICAgICBvdXRbNV0gPSAxOwogICAgICBvdXRbNl0gPSAwOwogICAgICBvdXRbN10gPSAwOwogICAgICBvdXRbOF0gPSAwOwogICAgICBvdXRbOV0gPSAwOwogICAgICBvdXRbMTBdID0gMTsKICAgICAgb3V0WzExXSA9IDA7CiAgICAgIG91dFsxMl0gPSAwOwogICAgICBvdXRbMTNdID0gMDsKICAgICAgb3V0WzE0XSA9IDA7CiAgICAgIG91dFsxNV0gPSAxOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gdHJhbnNwb3NlMihvdXQsIGEpIHsKICAgICAgaWYgKG91dCA9PT0gYSkgewogICAgICAgIHZhciBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdOwogICAgICAgIHZhciBhMTIgPSBhWzZdLCBhMTMgPSBhWzddOwogICAgICAgIHZhciBhMjMgPSBhWzExXTsKICAgICAgICBvdXRbMV0gPSBhWzRdOwogICAgICAgIG91dFsyXSA9IGFbOF07CiAgICAgICAgb3V0WzNdID0gYVsxMl07CiAgICAgICAgb3V0WzRdID0gYTAxOwogICAgICAgIG91dFs2XSA9IGFbOV07CiAgICAgICAgb3V0WzddID0gYVsxM107CiAgICAgICAgb3V0WzhdID0gYTAyOwogICAgICAgIG91dFs5XSA9IGExMjsKICAgICAgICBvdXRbMTFdID0gYVsxNF07CiAgICAgICAgb3V0WzEyXSA9IGEwMzsKICAgICAgICBvdXRbMTNdID0gYTEzOwogICAgICAgIG91dFsxNF0gPSBhMjM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0WzBdID0gYVswXTsKICAgICAgICBvdXRbMV0gPSBhWzRdOwogICAgICAgIG91dFsyXSA9IGFbOF07CiAgICAgICAgb3V0WzNdID0gYVsxMl07CiAgICAgICAgb3V0WzRdID0gYVsxXTsKICAgICAgICBvdXRbNV0gPSBhWzVdOwogICAgICAgIG91dFs2XSA9IGFbOV07CiAgICAgICAgb3V0WzddID0gYVsxM107CiAgICAgICAgb3V0WzhdID0gYVsyXTsKICAgICAgICBvdXRbOV0gPSBhWzZdOwogICAgICAgIG91dFsxMF0gPSBhWzEwXTsKICAgICAgICBvdXRbMTFdID0gYVsxNF07CiAgICAgICAgb3V0WzEyXSA9IGFbM107CiAgICAgICAgb3V0WzEzXSA9IGFbN107CiAgICAgICAgb3V0WzE0XSA9IGFbMTFdOwogICAgICAgIG91dFsxNV0gPSBhWzE1XTsKICAgICAgfQogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gaW52ZXJ0MihvdXQsIGEpIHsKICAgICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM107CiAgICAgIHZhciBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddOwogICAgICB2YXIgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdOwogICAgICB2YXIgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV07CiAgICAgIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7CiAgICAgIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7CiAgICAgIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTA7CiAgICAgIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7CiAgICAgIHZhciBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTE7CiAgICAgIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTI7CiAgICAgIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7CiAgICAgIHZhciBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzA7CiAgICAgIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzA7CiAgICAgIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7CiAgICAgIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7CiAgICAgIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7CiAgICAgIHZhciBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7CiAgICAgIGlmICghZGV0KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZGV0ID0gMSAvIGRldDsKICAgICAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7CiAgICAgIG91dFsxXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0OwogICAgICBvdXRbMl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldDsKICAgICAgb3V0WzNdID0gKGEyMiAqIGIwNCAtIGEyMSAqIGIwNSAtIGEyMyAqIGIwMykgKiBkZXQ7CiAgICAgIG91dFs0XSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0OwogICAgICBvdXRbNV0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldDsKICAgICAgb3V0WzZdID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7CiAgICAgIG91dFs3XSA9IChhMjAgKiBiMDUgLSBhMjIgKiBiMDIgKyBhMjMgKiBiMDEpICogZGV0OwogICAgICBvdXRbOF0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDsKICAgICAgb3V0WzldID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXQ7CiAgICAgIG91dFsxMF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDsKICAgICAgb3V0WzExXSA9IChhMjEgKiBiMDIgLSBhMjAgKiBiMDQgLSBhMjMgKiBiMDApICogZGV0OwogICAgICBvdXRbMTJdID0gKGExMSAqIGIwNyAtIGExMCAqIGIwOSAtIGExMiAqIGIwNikgKiBkZXQ7CiAgICAgIG91dFsxM10gPSAoYTAwICogYjA5IC0gYTAxICogYjA3ICsgYTAyICogYjA2KSAqIGRldDsKICAgICAgb3V0WzE0XSA9IChhMzEgKiBiMDEgLSBhMzAgKiBiMDMgLSBhMzIgKiBiMDApICogZGV0OwogICAgICBvdXRbMTVdID0gKGEyMCAqIGIwMyAtIGEyMSAqIGIwMSArIGEyMiAqIGIwMCkgKiBkZXQ7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBhZGpvaW50MihvdXQsIGEpIHsKICAgICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM107CiAgICAgIHZhciBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddOwogICAgICB2YXIgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdOwogICAgICB2YXIgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV07CiAgICAgIG91dFswXSA9IGExMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgKyBhMzEgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKTsKICAgICAgb3V0WzFdID0gLShhMDEgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikpOwogICAgICBvdXRbMl0gPSBhMDEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMik7CiAgICAgIG91dFszXSA9IC0oYTAxICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMSAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTsKICAgICAgb3V0WzRdID0gLShhMTAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpICsgYTMwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikpOwogICAgICBvdXRbNV0gPSBhMDAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMwICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMik7CiAgICAgIG91dFs2XSA9IC0oYTAwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgLSBhMTAgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTsKICAgICAgb3V0WzddID0gYTAwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpOwogICAgICBvdXRbOF0gPSBhMTAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSk7CiAgICAgIG91dFs5XSA9IC0oYTAwICogKGEyMSAqIGEzMyAtIGEyMyAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpKTsKICAgICAgb3V0WzEwXSA9IGEwMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpIC0gYTEwICogKGEwMSAqIGEzMyAtIGEwMyAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTEzIC0gYTAzICogYTExKTsKICAgICAgb3V0WzExXSA9IC0oYTAwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpKTsKICAgICAgb3V0WzEyXSA9IC0oYTEwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSArIGEzMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpKTsKICAgICAgb3V0WzEzXSA9IGEwMCAqIChhMjEgKiBhMzIgLSBhMjIgKiBhMzEpIC0gYTIwICogKGEwMSAqIGEzMiAtIGEwMiAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTIyIC0gYTAyICogYTIxKTsKICAgICAgb3V0WzE0XSA9IC0oYTAwICogKGExMSAqIGEzMiAtIGExMiAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMyIC0gYTAyICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpKTsKICAgICAgb3V0WzE1XSA9IGEwMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGRldGVybWluYW50MihhKSB7CiAgICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdOwogICAgICB2YXIgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XTsKICAgICAgdmFyIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXTsKICAgICAgdmFyIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdOwogICAgICB2YXIgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwOwogICAgICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwOwogICAgICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwOwogICAgICB2YXIgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExOwogICAgICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExOwogICAgICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyOwogICAgICB2YXIgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwOwogICAgICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwOwogICAgICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwOwogICAgICB2YXIgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxOwogICAgICB2YXIgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxOwogICAgICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyOwogICAgICByZXR1cm4gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2OwogICAgfQogICAgZnVuY3Rpb24gbXVsdGlwbHkyKG91dCwgYSwgYikgewogICAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXTsKICAgICAgdmFyIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN107CiAgICAgIHZhciBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV07CiAgICAgIHZhciBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XTsKICAgICAgdmFyIGIwID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTsKICAgICAgb3V0WzBdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7CiAgICAgIG91dFsxXSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxOwogICAgICBvdXRbMl0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjsKICAgICAgb3V0WzNdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7CiAgICAgIGIwID0gYls0XTsKICAgICAgYjEgPSBiWzVdOwogICAgICBiMiA9IGJbNl07CiAgICAgIGIzID0gYls3XTsKICAgICAgb3V0WzRdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7CiAgICAgIG91dFs1XSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxOwogICAgICBvdXRbNl0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjsKICAgICAgb3V0WzddID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7CiAgICAgIGIwID0gYls4XTsKICAgICAgYjEgPSBiWzldOwogICAgICBiMiA9IGJbMTBdOwogICAgICBiMyA9IGJbMTFdOwogICAgICBvdXRbOF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDsKICAgICAgb3V0WzldID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7CiAgICAgIG91dFsxMF0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjsKICAgICAgb3V0WzExXSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzOwogICAgICBiMCA9IGJbMTJdOwogICAgICBiMSA9IGJbMTNdOwogICAgICBiMiA9IGJbMTRdOwogICAgICBiMyA9IGJbMTVdOwogICAgICBvdXRbMTJdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7CiAgICAgIG91dFsxM10gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTsKICAgICAgb3V0WzE0XSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyOwogICAgICBvdXRbMTVdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiB0cmFuc2xhdGUyKG91dCwgYSwgdikgewogICAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdLCB6ID0gdlsyXTsKICAgICAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMzsKICAgICAgdmFyIGExMCwgYTExLCBhMTIsIGExMzsKICAgICAgdmFyIGEyMCwgYTIxLCBhMjIsIGEyMzsKICAgICAgaWYgKGEgPT09IG91dCkgewogICAgICAgIG91dFsxMl0gPSBhWzBdICogeCArIGFbNF0gKiB5ICsgYVs4XSAqIHogKyBhWzEyXTsKICAgICAgICBvdXRbMTNdID0gYVsxXSAqIHggKyBhWzVdICogeSArIGFbOV0gKiB6ICsgYVsxM107CiAgICAgICAgb3V0WzE0XSA9IGFbMl0gKiB4ICsgYVs2XSAqIHkgKyBhWzEwXSAqIHogKyBhWzE0XTsKICAgICAgICBvdXRbMTVdID0gYVszXSAqIHggKyBhWzddICogeSArIGFbMTFdICogeiArIGFbMTVdOwogICAgICB9IGVsc2UgewogICAgICAgIGEwMCA9IGFbMF07CiAgICAgICAgYTAxID0gYVsxXTsKICAgICAgICBhMDIgPSBhWzJdOwogICAgICAgIGEwMyA9IGFbM107CiAgICAgICAgYTEwID0gYVs0XTsKICAgICAgICBhMTEgPSBhWzVdOwogICAgICAgIGExMiA9IGFbNl07CiAgICAgICAgYTEzID0gYVs3XTsKICAgICAgICBhMjAgPSBhWzhdOwogICAgICAgIGEyMSA9IGFbOV07CiAgICAgICAgYTIyID0gYVsxMF07CiAgICAgICAgYTIzID0gYVsxMV07CiAgICAgICAgb3V0WzBdID0gYTAwOwogICAgICAgIG91dFsxXSA9IGEwMTsKICAgICAgICBvdXRbMl0gPSBhMDI7CiAgICAgICAgb3V0WzNdID0gYTAzOwogICAgICAgIG91dFs0XSA9IGExMDsKICAgICAgICBvdXRbNV0gPSBhMTE7CiAgICAgICAgb3V0WzZdID0gYTEyOwogICAgICAgIG91dFs3XSA9IGExMzsKICAgICAgICBvdXRbOF0gPSBhMjA7CiAgICAgICAgb3V0WzldID0gYTIxOwogICAgICAgIG91dFsxMF0gPSBhMjI7CiAgICAgICAgb3V0WzExXSA9IGEyMzsKICAgICAgICBvdXRbMTJdID0gYTAwICogeCArIGExMCAqIHkgKyBhMjAgKiB6ICsgYVsxMl07CiAgICAgICAgb3V0WzEzXSA9IGEwMSAqIHggKyBhMTEgKiB5ICsgYTIxICogeiArIGFbMTNdOwogICAgICAgIG91dFsxNF0gPSBhMDIgKiB4ICsgYTEyICogeSArIGEyMiAqIHogKyBhWzE0XTsKICAgICAgICBvdXRbMTVdID0gYTAzICogeCArIGExMyAqIHkgKyBhMjMgKiB6ICsgYVsxNV07CiAgICAgIH0KICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHNjYWxlMihvdXQsIGEsIHYpIHsKICAgICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl07CiAgICAgIG91dFswXSA9IGFbMF0gKiB4OwogICAgICBvdXRbMV0gPSBhWzFdICogeDsKICAgICAgb3V0WzJdID0gYVsyXSAqIHg7CiAgICAgIG91dFszXSA9IGFbM10gKiB4OwogICAgICBvdXRbNF0gPSBhWzRdICogeTsKICAgICAgb3V0WzVdID0gYVs1XSAqIHk7CiAgICAgIG91dFs2XSA9IGFbNl0gKiB5OwogICAgICBvdXRbN10gPSBhWzddICogeTsKICAgICAgb3V0WzhdID0gYVs4XSAqIHo7CiAgICAgIG91dFs5XSA9IGFbOV0gKiB6OwogICAgICBvdXRbMTBdID0gYVsxMF0gKiB6OwogICAgICBvdXRbMTFdID0gYVsxMV0gKiB6OwogICAgICBvdXRbMTJdID0gYVsxMl07CiAgICAgIG91dFsxM10gPSBhWzEzXTsKICAgICAgb3V0WzE0XSA9IGFbMTRdOwogICAgICBvdXRbMTVdID0gYVsxNV07CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiByb3RhdGUyKG91dCwgYSwgcmFkLCBheGlzKSB7CiAgICAgIHZhciB4ID0gYXhpc1swXSwgeSA9IGF4aXNbMV0sIHogPSBheGlzWzJdOwogICAgICB2YXIgbGVuNCA9IE1hdGguaHlwb3QoeCwgeSwgeik7CiAgICAgIHZhciBzLCBjLCB0OwogICAgICB2YXIgYTAwLCBhMDEsIGEwMiwgYTAzOwogICAgICB2YXIgYTEwLCBhMTEsIGExMiwgYTEzOwogICAgICB2YXIgYTIwLCBhMjEsIGEyMiwgYTIzOwogICAgICB2YXIgYjAwLCBiMDEsIGIwMjsKICAgICAgdmFyIGIxMCwgYjExLCBiMTI7CiAgICAgIHZhciBiMjAsIGIyMSwgYjIyOwogICAgICBpZiAobGVuNCA8IEVQU0lMT04pIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBsZW40ID0gMSAvIGxlbjQ7CiAgICAgIHggKj0gbGVuNDsKICAgICAgeSAqPSBsZW40OwogICAgICB6ICo9IGxlbjQ7CiAgICAgIHMgPSBNYXRoLnNpbihyYWQpOwogICAgICBjID0gTWF0aC5jb3MocmFkKTsKICAgICAgdCA9IDEgLSBjOwogICAgICBhMDAgPSBhWzBdOwogICAgICBhMDEgPSBhWzFdOwogICAgICBhMDIgPSBhWzJdOwogICAgICBhMDMgPSBhWzNdOwogICAgICBhMTAgPSBhWzRdOwogICAgICBhMTEgPSBhWzVdOwogICAgICBhMTIgPSBhWzZdOwogICAgICBhMTMgPSBhWzddOwogICAgICBhMjAgPSBhWzhdOwogICAgICBhMjEgPSBhWzldOwogICAgICBhMjIgPSBhWzEwXTsKICAgICAgYTIzID0gYVsxMV07CiAgICAgIGIwMCA9IHggKiB4ICogdCArIGM7CiAgICAgIGIwMSA9IHkgKiB4ICogdCArIHogKiBzOwogICAgICBiMDIgPSB6ICogeCAqIHQgLSB5ICogczsKICAgICAgYjEwID0geCAqIHkgKiB0IC0geiAqIHM7CiAgICAgIGIxMSA9IHkgKiB5ICogdCArIGM7CiAgICAgIGIxMiA9IHogKiB5ICogdCArIHggKiBzOwogICAgICBiMjAgPSB4ICogeiAqIHQgKyB5ICogczsKICAgICAgYjIxID0geSAqIHogKiB0IC0geCAqIHM7CiAgICAgIGIyMiA9IHogKiB6ICogdCArIGM7CiAgICAgIG91dFswXSA9IGEwMCAqIGIwMCArIGExMCAqIGIwMSArIGEyMCAqIGIwMjsKICAgICAgb3V0WzFdID0gYTAxICogYjAwICsgYTExICogYjAxICsgYTIxICogYjAyOwogICAgICBvdXRbMl0gPSBhMDIgKiBiMDAgKyBhMTIgKiBiMDEgKyBhMjIgKiBiMDI7CiAgICAgIG91dFszXSA9IGEwMyAqIGIwMCArIGExMyAqIGIwMSArIGEyMyAqIGIwMjsKICAgICAgb3V0WzRdID0gYTAwICogYjEwICsgYTEwICogYjExICsgYTIwICogYjEyOwogICAgICBvdXRbNV0gPSBhMDEgKiBiMTAgKyBhMTEgKiBiMTEgKyBhMjEgKiBiMTI7CiAgICAgIG91dFs2XSA9IGEwMiAqIGIxMCArIGExMiAqIGIxMSArIGEyMiAqIGIxMjsKICAgICAgb3V0WzddID0gYTAzICogYjEwICsgYTEzICogYjExICsgYTIzICogYjEyOwogICAgICBvdXRbOF0gPSBhMDAgKiBiMjAgKyBhMTAgKiBiMjEgKyBhMjAgKiBiMjI7CiAgICAgIG91dFs5XSA9IGEwMSAqIGIyMCArIGExMSAqIGIyMSArIGEyMSAqIGIyMjsKICAgICAgb3V0WzEwXSA9IGEwMiAqIGIyMCArIGExMiAqIGIyMSArIGEyMiAqIGIyMjsKICAgICAgb3V0WzExXSA9IGEwMyAqIGIyMCArIGExMyAqIGIyMSArIGEyMyAqIGIyMjsKICAgICAgaWYgKGEgIT09IG91dCkgewogICAgICAgIG91dFsxMl0gPSBhWzEyXTsKICAgICAgICBvdXRbMTNdID0gYVsxM107CiAgICAgICAgb3V0WzE0XSA9IGFbMTRdOwogICAgICAgIG91dFsxNV0gPSBhWzE1XTsKICAgICAgfQogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gcm90YXRlWChvdXQsIGEsIHJhZCkgewogICAgICB2YXIgcyA9IE1hdGguc2luKHJhZCk7CiAgICAgIHZhciBjID0gTWF0aC5jb3MocmFkKTsKICAgICAgdmFyIGExMCA9IGFbNF07CiAgICAgIHZhciBhMTEgPSBhWzVdOwogICAgICB2YXIgYTEyID0gYVs2XTsKICAgICAgdmFyIGExMyA9IGFbN107CiAgICAgIHZhciBhMjAgPSBhWzhdOwogICAgICB2YXIgYTIxID0gYVs5XTsKICAgICAgdmFyIGEyMiA9IGFbMTBdOwogICAgICB2YXIgYTIzID0gYVsxMV07CiAgICAgIGlmIChhICE9PSBvdXQpIHsKICAgICAgICBvdXRbMF0gPSBhWzBdOwogICAgICAgIG91dFsxXSA9IGFbMV07CiAgICAgICAgb3V0WzJdID0gYVsyXTsKICAgICAgICBvdXRbM10gPSBhWzNdOwogICAgICAgIG91dFsxMl0gPSBhWzEyXTsKICAgICAgICBvdXRbMTNdID0gYVsxM107CiAgICAgICAgb3V0WzE0XSA9IGFbMTRdOwogICAgICAgIG91dFsxNV0gPSBhWzE1XTsKICAgICAgfQogICAgICBvdXRbNF0gPSBhMTAgKiBjICsgYTIwICogczsKICAgICAgb3V0WzVdID0gYTExICogYyArIGEyMSAqIHM7CiAgICAgIG91dFs2XSA9IGExMiAqIGMgKyBhMjIgKiBzOwogICAgICBvdXRbN10gPSBhMTMgKiBjICsgYTIzICogczsKICAgICAgb3V0WzhdID0gYTIwICogYyAtIGExMCAqIHM7CiAgICAgIG91dFs5XSA9IGEyMSAqIGMgLSBhMTEgKiBzOwogICAgICBvdXRbMTBdID0gYTIyICogYyAtIGExMiAqIHM7CiAgICAgIG91dFsxMV0gPSBhMjMgKiBjIC0gYTEzICogczsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCByYWQpIHsKICAgICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpOwogICAgICB2YXIgYyA9IE1hdGguY29zKHJhZCk7CiAgICAgIHZhciBhMDAgPSBhWzBdOwogICAgICB2YXIgYTAxID0gYVsxXTsKICAgICAgdmFyIGEwMiA9IGFbMl07CiAgICAgIHZhciBhMDMgPSBhWzNdOwogICAgICB2YXIgYTIwID0gYVs4XTsKICAgICAgdmFyIGEyMSA9IGFbOV07CiAgICAgIHZhciBhMjIgPSBhWzEwXTsKICAgICAgdmFyIGEyMyA9IGFbMTFdOwogICAgICBpZiAoYSAhPT0gb3V0KSB7CiAgICAgICAgb3V0WzRdID0gYVs0XTsKICAgICAgICBvdXRbNV0gPSBhWzVdOwogICAgICAgIG91dFs2XSA9IGFbNl07CiAgICAgICAgb3V0WzddID0gYVs3XTsKICAgICAgICBvdXRbMTJdID0gYVsxMl07CiAgICAgICAgb3V0WzEzXSA9IGFbMTNdOwogICAgICAgIG91dFsxNF0gPSBhWzE0XTsKICAgICAgICBvdXRbMTVdID0gYVsxNV07CiAgICAgIH0KICAgICAgb3V0WzBdID0gYTAwICogYyAtIGEyMCAqIHM7CiAgICAgIG91dFsxXSA9IGEwMSAqIGMgLSBhMjEgKiBzOwogICAgICBvdXRbMl0gPSBhMDIgKiBjIC0gYTIyICogczsKICAgICAgb3V0WzNdID0gYTAzICogYyAtIGEyMyAqIHM7CiAgICAgIG91dFs4XSA9IGEwMCAqIHMgKyBhMjAgKiBjOwogICAgICBvdXRbOV0gPSBhMDEgKiBzICsgYTIxICogYzsKICAgICAgb3V0WzEwXSA9IGEwMiAqIHMgKyBhMjIgKiBjOwogICAgICBvdXRbMTFdID0gYTAzICogcyArIGEyMyAqIGM7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiByb3RhdGVaKG91dCwgYSwgcmFkKSB7CiAgICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKTsKICAgICAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOwogICAgICB2YXIgYTAwID0gYVswXTsKICAgICAgdmFyIGEwMSA9IGFbMV07CiAgICAgIHZhciBhMDIgPSBhWzJdOwogICAgICB2YXIgYTAzID0gYVszXTsKICAgICAgdmFyIGExMCA9IGFbNF07CiAgICAgIHZhciBhMTEgPSBhWzVdOwogICAgICB2YXIgYTEyID0gYVs2XTsKICAgICAgdmFyIGExMyA9IGFbN107CiAgICAgIGlmIChhICE9PSBvdXQpIHsKICAgICAgICBvdXRbOF0gPSBhWzhdOwogICAgICAgIG91dFs5XSA9IGFbOV07CiAgICAgICAgb3V0WzEwXSA9IGFbMTBdOwogICAgICAgIG91dFsxMV0gPSBhWzExXTsKICAgICAgICBvdXRbMTJdID0gYVsxMl07CiAgICAgICAgb3V0WzEzXSA9IGFbMTNdOwogICAgICAgIG91dFsxNF0gPSBhWzE0XTsKICAgICAgICBvdXRbMTVdID0gYVsxNV07CiAgICAgIH0KICAgICAgb3V0WzBdID0gYTAwICogYyArIGExMCAqIHM7CiAgICAgIG91dFsxXSA9IGEwMSAqIGMgKyBhMTEgKiBzOwogICAgICBvdXRbMl0gPSBhMDIgKiBjICsgYTEyICogczsKICAgICAgb3V0WzNdID0gYTAzICogYyArIGExMyAqIHM7CiAgICAgIG91dFs0XSA9IGExMCAqIGMgLSBhMDAgKiBzOwogICAgICBvdXRbNV0gPSBhMTEgKiBjIC0gYTAxICogczsKICAgICAgb3V0WzZdID0gYTEyICogYyAtIGEwMiAqIHM7CiAgICAgIG91dFs3XSA9IGExMyAqIGMgLSBhMDMgKiBzOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZnJvbVRyYW5zbGF0aW9uMihvdXQsIHYpIHsKICAgICAgb3V0WzBdID0gMTsKICAgICAgb3V0WzFdID0gMDsKICAgICAgb3V0WzJdID0gMDsKICAgICAgb3V0WzNdID0gMDsKICAgICAgb3V0WzRdID0gMDsKICAgICAgb3V0WzVdID0gMTsKICAgICAgb3V0WzZdID0gMDsKICAgICAgb3V0WzddID0gMDsKICAgICAgb3V0WzhdID0gMDsKICAgICAgb3V0WzldID0gMDsKICAgICAgb3V0WzEwXSA9IDE7CiAgICAgIG91dFsxMV0gPSAwOwogICAgICBvdXRbMTJdID0gdlswXTsKICAgICAgb3V0WzEzXSA9IHZbMV07CiAgICAgIG91dFsxNF0gPSB2WzJdOwogICAgICBvdXRbMTVdID0gMTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21TY2FsaW5nMihvdXQsIHYpIHsKICAgICAgb3V0WzBdID0gdlswXTsKICAgICAgb3V0WzFdID0gMDsKICAgICAgb3V0WzJdID0gMDsKICAgICAgb3V0WzNdID0gMDsKICAgICAgb3V0WzRdID0gMDsKICAgICAgb3V0WzVdID0gdlsxXTsKICAgICAgb3V0WzZdID0gMDsKICAgICAgb3V0WzddID0gMDsKICAgICAgb3V0WzhdID0gMDsKICAgICAgb3V0WzldID0gMDsKICAgICAgb3V0WzEwXSA9IHZbMl07CiAgICAgIG91dFsxMV0gPSAwOwogICAgICBvdXRbMTJdID0gMDsKICAgICAgb3V0WzEzXSA9IDA7CiAgICAgIG91dFsxNF0gPSAwOwogICAgICBvdXRbMTVdID0gMTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21Sb3RhdGlvbjIob3V0LCByYWQsIGF4aXMpIHsKICAgICAgdmFyIHggPSBheGlzWzBdLCB5ID0gYXhpc1sxXSwgeiA9IGF4aXNbMl07CiAgICAgIHZhciBsZW40ID0gTWF0aC5oeXBvdCh4LCB5LCB6KTsKICAgICAgdmFyIHMsIGMsIHQ7CiAgICAgIGlmIChsZW40IDwgRVBTSUxPTikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGxlbjQgPSAxIC8gbGVuNDsKICAgICAgeCAqPSBsZW40OwogICAgICB5ICo9IGxlbjQ7CiAgICAgIHogKj0gbGVuNDsKICAgICAgcyA9IE1hdGguc2luKHJhZCk7CiAgICAgIGMgPSBNYXRoLmNvcyhyYWQpOwogICAgICB0ID0gMSAtIGM7CiAgICAgIG91dFswXSA9IHggKiB4ICogdCArIGM7CiAgICAgIG91dFsxXSA9IHkgKiB4ICogdCArIHogKiBzOwogICAgICBvdXRbMl0gPSB6ICogeCAqIHQgLSB5ICogczsKICAgICAgb3V0WzNdID0gMDsKICAgICAgb3V0WzRdID0geCAqIHkgKiB0IC0geiAqIHM7CiAgICAgIG91dFs1XSA9IHkgKiB5ICogdCArIGM7CiAgICAgIG91dFs2XSA9IHogKiB5ICogdCArIHggKiBzOwogICAgICBvdXRbN10gPSAwOwogICAgICBvdXRbOF0gPSB4ICogeiAqIHQgKyB5ICogczsKICAgICAgb3V0WzldID0geSAqIHogKiB0IC0geCAqIHM7CiAgICAgIG91dFsxMF0gPSB6ICogeiAqIHQgKyBjOwogICAgICBvdXRbMTFdID0gMDsKICAgICAgb3V0WzEyXSA9IDA7CiAgICAgIG91dFsxM10gPSAwOwogICAgICBvdXRbMTRdID0gMDsKICAgICAgb3V0WzE1XSA9IDE7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBmcm9tWFJvdGF0aW9uKG91dCwgcmFkKSB7CiAgICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKTsKICAgICAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOwogICAgICBvdXRbMF0gPSAxOwogICAgICBvdXRbMV0gPSAwOwogICAgICBvdXRbMl0gPSAwOwogICAgICBvdXRbM10gPSAwOwogICAgICBvdXRbNF0gPSAwOwogICAgICBvdXRbNV0gPSBjOwogICAgICBvdXRbNl0gPSBzOwogICAgICBvdXRbN10gPSAwOwogICAgICBvdXRbOF0gPSAwOwogICAgICBvdXRbOV0gPSAtczsKICAgICAgb3V0WzEwXSA9IGM7CiAgICAgIG91dFsxMV0gPSAwOwogICAgICBvdXRbMTJdID0gMDsKICAgICAgb3V0WzEzXSA9IDA7CiAgICAgIG91dFsxNF0gPSAwOwogICAgICBvdXRbMTVdID0gMTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21ZUm90YXRpb24ob3V0LCByYWQpIHsKICAgICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpOwogICAgICB2YXIgYyA9IE1hdGguY29zKHJhZCk7CiAgICAgIG91dFswXSA9IGM7CiAgICAgIG91dFsxXSA9IDA7CiAgICAgIG91dFsyXSA9IC1zOwogICAgICBvdXRbM10gPSAwOwogICAgICBvdXRbNF0gPSAwOwogICAgICBvdXRbNV0gPSAxOwogICAgICBvdXRbNl0gPSAwOwogICAgICBvdXRbN10gPSAwOwogICAgICBvdXRbOF0gPSBzOwogICAgICBvdXRbOV0gPSAwOwogICAgICBvdXRbMTBdID0gYzsKICAgICAgb3V0WzExXSA9IDA7CiAgICAgIG91dFsxMl0gPSAwOwogICAgICBvdXRbMTNdID0gMDsKICAgICAgb3V0WzE0XSA9IDA7CiAgICAgIG91dFsxNV0gPSAxOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZnJvbVpSb3RhdGlvbihvdXQsIHJhZCkgewogICAgICB2YXIgcyA9IE1hdGguc2luKHJhZCk7CiAgICAgIHZhciBjID0gTWF0aC5jb3MocmFkKTsKICAgICAgb3V0WzBdID0gYzsKICAgICAgb3V0WzFdID0gczsKICAgICAgb3V0WzJdID0gMDsKICAgICAgb3V0WzNdID0gMDsKICAgICAgb3V0WzRdID0gLXM7CiAgICAgIG91dFs1XSA9IGM7CiAgICAgIG91dFs2XSA9IDA7CiAgICAgIG91dFs3XSA9IDA7CiAgICAgIG91dFs4XSA9IDA7CiAgICAgIG91dFs5XSA9IDA7CiAgICAgIG91dFsxMF0gPSAxOwogICAgICBvdXRbMTFdID0gMDsKICAgICAgb3V0WzEyXSA9IDA7CiAgICAgIG91dFsxM10gPSAwOwogICAgICBvdXRbMTRdID0gMDsKICAgICAgb3V0WzE1XSA9IDE7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIHEsIHYpIHsKICAgICAgdmFyIHggPSBxWzBdLCB5ID0gcVsxXSwgeiA9IHFbMl0sIHcgPSBxWzNdOwogICAgICB2YXIgeDIgPSB4ICsgeDsKICAgICAgdmFyIHkyID0geSArIHk7CiAgICAgIHZhciB6MiA9IHogKyB6OwogICAgICB2YXIgeHggPSB4ICogeDI7CiAgICAgIHZhciB4eSA9IHggKiB5MjsKICAgICAgdmFyIHh6ID0geCAqIHoyOwogICAgICB2YXIgeXkgPSB5ICogeTI7CiAgICAgIHZhciB5eiA9IHkgKiB6MjsKICAgICAgdmFyIHp6ID0geiAqIHoyOwogICAgICB2YXIgd3ggPSB3ICogeDI7CiAgICAgIHZhciB3eSA9IHcgKiB5MjsKICAgICAgdmFyIHd6ID0gdyAqIHoyOwogICAgICBvdXRbMF0gPSAxIC0gKHl5ICsgenopOwogICAgICBvdXRbMV0gPSB4eSArIHd6OwogICAgICBvdXRbMl0gPSB4eiAtIHd5OwogICAgICBvdXRbM10gPSAwOwogICAgICBvdXRbNF0gPSB4eSAtIHd6OwogICAgICBvdXRbNV0gPSAxIC0gKHh4ICsgenopOwogICAgICBvdXRbNl0gPSB5eiArIHd4OwogICAgICBvdXRbN10gPSAwOwogICAgICBvdXRbOF0gPSB4eiArIHd5OwogICAgICBvdXRbOV0gPSB5eiAtIHd4OwogICAgICBvdXRbMTBdID0gMSAtICh4eCArIHl5KTsKICAgICAgb3V0WzExXSA9IDA7CiAgICAgIG91dFsxMl0gPSB2WzBdOwogICAgICBvdXRbMTNdID0gdlsxXTsKICAgICAgb3V0WzE0XSA9IHZbMl07CiAgICAgIG91dFsxNV0gPSAxOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZnJvbVF1YXQyKG91dCwgYSkgewogICAgICB2YXIgdHJhbnNsYXRpb24gPSBuZXcgQVJSQVlfVFlQRSgzKTsKICAgICAgdmFyIGJ4ID0gLWFbMF0sIGJ5ID0gLWFbMV0sIGJ6ID0gLWFbMl0sIGJ3ID0gYVszXSwgYXggPSBhWzRdLCBheSA9IGFbNV0sIGF6ID0gYVs2XSwgYXcgPSBhWzddOwogICAgICB2YXIgbWFnbml0dWRlID0gYnggKiBieCArIGJ5ICogYnkgKyBieiAqIGJ6ICsgYncgKiBidzsKICAgICAgaWYgKG1hZ25pdHVkZSA+IDApIHsKICAgICAgICB0cmFuc2xhdGlvblswXSA9IChheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5KSAqIDIgLyBtYWduaXR1ZGU7CiAgICAgICAgdHJhbnNsYXRpb25bMV0gPSAoYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieikgKiAyIC8gbWFnbml0dWRlOwogICAgICAgIHRyYW5zbGF0aW9uWzJdID0gKGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngpICogMiAvIG1hZ25pdHVkZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0cmFuc2xhdGlvblswXSA9IChheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5KSAqIDI7CiAgICAgICAgdHJhbnNsYXRpb25bMV0gPSAoYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieikgKiAyOwogICAgICAgIHRyYW5zbGF0aW9uWzJdID0gKGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngpICogMjsKICAgICAgfQogICAgICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIGEsIHRyYW5zbGF0aW9uKTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uKG91dCwgbWF0KSB7CiAgICAgIG91dFswXSA9IG1hdFsxMl07CiAgICAgIG91dFsxXSA9IG1hdFsxM107CiAgICAgIG91dFsyXSA9IG1hdFsxNF07CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRTY2FsaW5nKG91dCwgbWF0KSB7CiAgICAgIHZhciBtMTEgPSBtYXRbMF07CiAgICAgIHZhciBtMTIgPSBtYXRbMV07CiAgICAgIHZhciBtMTMgPSBtYXRbMl07CiAgICAgIHZhciBtMjEgPSBtYXRbNF07CiAgICAgIHZhciBtMjIgPSBtYXRbNV07CiAgICAgIHZhciBtMjMgPSBtYXRbNl07CiAgICAgIHZhciBtMzEgPSBtYXRbOF07CiAgICAgIHZhciBtMzIgPSBtYXRbOV07CiAgICAgIHZhciBtMzMgPSBtYXRbMTBdOwogICAgICBvdXRbMF0gPSBNYXRoLmh5cG90KG0xMSwgbTEyLCBtMTMpOwogICAgICBvdXRbMV0gPSBNYXRoLmh5cG90KG0yMSwgbTIyLCBtMjMpOwogICAgICBvdXRbMl0gPSBNYXRoLmh5cG90KG0zMSwgbTMyLCBtMzMpOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZ2V0Um90YXRpb24ob3V0LCBtYXQpIHsKICAgICAgdmFyIHNjYWxpbmcgPSBuZXcgQVJSQVlfVFlQRSgzKTsKICAgICAgZ2V0U2NhbGluZyhzY2FsaW5nLCBtYXQpOwogICAgICB2YXIgaXMxID0gMSAvIHNjYWxpbmdbMF07CiAgICAgIHZhciBpczIgPSAxIC8gc2NhbGluZ1sxXTsKICAgICAgdmFyIGlzMyA9IDEgLyBzY2FsaW5nWzJdOwogICAgICB2YXIgc20xMSA9IG1hdFswXSAqIGlzMTsKICAgICAgdmFyIHNtMTIgPSBtYXRbMV0gKiBpczI7CiAgICAgIHZhciBzbTEzID0gbWF0WzJdICogaXMzOwogICAgICB2YXIgc20yMSA9IG1hdFs0XSAqIGlzMTsKICAgICAgdmFyIHNtMjIgPSBtYXRbNV0gKiBpczI7CiAgICAgIHZhciBzbTIzID0gbWF0WzZdICogaXMzOwogICAgICB2YXIgc20zMSA9IG1hdFs4XSAqIGlzMTsKICAgICAgdmFyIHNtMzIgPSBtYXRbOV0gKiBpczI7CiAgICAgIHZhciBzbTMzID0gbWF0WzEwXSAqIGlzMzsKICAgICAgdmFyIHRyYWNlID0gc20xMSArIHNtMjIgKyBzbTMzOwogICAgICB2YXIgUyA9IDA7CiAgICAgIGlmICh0cmFjZSA+IDApIHsKICAgICAgICBTID0gTWF0aC5zcXJ0KHRyYWNlICsgMSkgKiAyOwogICAgICAgIG91dFszXSA9IDAuMjUgKiBTOwogICAgICAgIG91dFswXSA9IChzbTIzIC0gc20zMikgLyBTOwogICAgICAgIG91dFsxXSA9IChzbTMxIC0gc20xMykgLyBTOwogICAgICAgIG91dFsyXSA9IChzbTEyIC0gc20yMSkgLyBTOwogICAgICB9IGVsc2UgaWYgKHNtMTEgPiBzbTIyICYmIHNtMTEgPiBzbTMzKSB7CiAgICAgICAgUyA9IE1hdGguc3FydCgxICsgc20xMSAtIHNtMjIgLSBzbTMzKSAqIDI7CiAgICAgICAgb3V0WzNdID0gKHNtMjMgLSBzbTMyKSAvIFM7CiAgICAgICAgb3V0WzBdID0gMC4yNSAqIFM7CiAgICAgICAgb3V0WzFdID0gKHNtMTIgKyBzbTIxKSAvIFM7CiAgICAgICAgb3V0WzJdID0gKHNtMzEgKyBzbTEzKSAvIFM7CiAgICAgIH0gZWxzZSBpZiAoc20yMiA+IHNtMzMpIHsKICAgICAgICBTID0gTWF0aC5zcXJ0KDEgKyBzbTIyIC0gc20xMSAtIHNtMzMpICogMjsKICAgICAgICBvdXRbM10gPSAoc20zMSAtIHNtMTMpIC8gUzsKICAgICAgICBvdXRbMF0gPSAoc20xMiArIHNtMjEpIC8gUzsKICAgICAgICBvdXRbMV0gPSAwLjI1ICogUzsKICAgICAgICBvdXRbMl0gPSAoc20yMyArIHNtMzIpIC8gUzsKICAgICAgfSBlbHNlIHsKICAgICAgICBTID0gTWF0aC5zcXJ0KDEgKyBzbTMzIC0gc20xMSAtIHNtMjIpICogMjsKICAgICAgICBvdXRbM10gPSAoc20xMiAtIHNtMjEpIC8gUzsKICAgICAgICBvdXRbMF0gPSAoc20zMSArIHNtMTMpIC8gUzsKICAgICAgICBvdXRbMV0gPSAoc20yMyArIHNtMzIpIC8gUzsKICAgICAgICBvdXRbMl0gPSAwLjI1ICogUzsKICAgICAgfQogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZShvdXQsIHEsIHYsIHMpIHsKICAgICAgdmFyIHggPSBxWzBdLCB5ID0gcVsxXSwgeiA9IHFbMl0sIHcgPSBxWzNdOwogICAgICB2YXIgeDIgPSB4ICsgeDsKICAgICAgdmFyIHkyID0geSArIHk7CiAgICAgIHZhciB6MiA9IHogKyB6OwogICAgICB2YXIgeHggPSB4ICogeDI7CiAgICAgIHZhciB4eSA9IHggKiB5MjsKICAgICAgdmFyIHh6ID0geCAqIHoyOwogICAgICB2YXIgeXkgPSB5ICogeTI7CiAgICAgIHZhciB5eiA9IHkgKiB6MjsKICAgICAgdmFyIHp6ID0geiAqIHoyOwogICAgICB2YXIgd3ggPSB3ICogeDI7CiAgICAgIHZhciB3eSA9IHcgKiB5MjsKICAgICAgdmFyIHd6ID0gdyAqIHoyOwogICAgICB2YXIgc3ggPSBzWzBdOwogICAgICB2YXIgc3kgPSBzWzFdOwogICAgICB2YXIgc3ogPSBzWzJdOwogICAgICBvdXRbMF0gPSAoMSAtICh5eSArIHp6KSkgKiBzeDsKICAgICAgb3V0WzFdID0gKHh5ICsgd3opICogc3g7CiAgICAgIG91dFsyXSA9ICh4eiAtIHd5KSAqIHN4OwogICAgICBvdXRbM10gPSAwOwogICAgICBvdXRbNF0gPSAoeHkgLSB3eikgKiBzeTsKICAgICAgb3V0WzVdID0gKDEgLSAoeHggKyB6eikpICogc3k7CiAgICAgIG91dFs2XSA9ICh5eiArIHd4KSAqIHN5OwogICAgICBvdXRbN10gPSAwOwogICAgICBvdXRbOF0gPSAoeHogKyB3eSkgKiBzejsKICAgICAgb3V0WzldID0gKHl6IC0gd3gpICogc3o7CiAgICAgIG91dFsxMF0gPSAoMSAtICh4eCArIHl5KSkgKiBzejsKICAgICAgb3V0WzExXSA9IDA7CiAgICAgIG91dFsxMl0gPSB2WzBdOwogICAgICBvdXRbMTNdID0gdlsxXTsKICAgICAgb3V0WzE0XSA9IHZbMl07CiAgICAgIG91dFsxNV0gPSAxOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZU9yaWdpbihvdXQsIHEsIHYsIHMsIG8pIHsKICAgICAgdmFyIHggPSBxWzBdLCB5ID0gcVsxXSwgeiA9IHFbMl0sIHcgPSBxWzNdOwogICAgICB2YXIgeDIgPSB4ICsgeDsKICAgICAgdmFyIHkyID0geSArIHk7CiAgICAgIHZhciB6MiA9IHogKyB6OwogICAgICB2YXIgeHggPSB4ICogeDI7CiAgICAgIHZhciB4eSA9IHggKiB5MjsKICAgICAgdmFyIHh6ID0geCAqIHoyOwogICAgICB2YXIgeXkgPSB5ICogeTI7CiAgICAgIHZhciB5eiA9IHkgKiB6MjsKICAgICAgdmFyIHp6ID0geiAqIHoyOwogICAgICB2YXIgd3ggPSB3ICogeDI7CiAgICAgIHZhciB3eSA9IHcgKiB5MjsKICAgICAgdmFyIHd6ID0gdyAqIHoyOwogICAgICB2YXIgc3ggPSBzWzBdOwogICAgICB2YXIgc3kgPSBzWzFdOwogICAgICB2YXIgc3ogPSBzWzJdOwogICAgICB2YXIgb3ggPSBvWzBdOwogICAgICB2YXIgb3kgPSBvWzFdOwogICAgICB2YXIgb3ogPSBvWzJdOwogICAgICB2YXIgb3V0MCA9ICgxIC0gKHl5ICsgenopKSAqIHN4OwogICAgICB2YXIgb3V0MSA9ICh4eSArIHd6KSAqIHN4OwogICAgICB2YXIgb3V0MiA9ICh4eiAtIHd5KSAqIHN4OwogICAgICB2YXIgb3V0NCA9ICh4eSAtIHd6KSAqIHN5OwogICAgICB2YXIgb3V0NSA9ICgxIC0gKHh4ICsgenopKSAqIHN5OwogICAgICB2YXIgb3V0NiA9ICh5eiArIHd4KSAqIHN5OwogICAgICB2YXIgb3V0OCA9ICh4eiArIHd5KSAqIHN6OwogICAgICB2YXIgb3V0OSA9ICh5eiAtIHd4KSAqIHN6OwogICAgICB2YXIgb3V0MTAgPSAoMSAtICh4eCArIHl5KSkgKiBzejsKICAgICAgb3V0WzBdID0gb3V0MDsKICAgICAgb3V0WzFdID0gb3V0MTsKICAgICAgb3V0WzJdID0gb3V0MjsKICAgICAgb3V0WzNdID0gMDsKICAgICAgb3V0WzRdID0gb3V0NDsKICAgICAgb3V0WzVdID0gb3V0NTsKICAgICAgb3V0WzZdID0gb3V0NjsKICAgICAgb3V0WzddID0gMDsKICAgICAgb3V0WzhdID0gb3V0ODsKICAgICAgb3V0WzldID0gb3V0OTsKICAgICAgb3V0WzEwXSA9IG91dDEwOwogICAgICBvdXRbMTFdID0gMDsKICAgICAgb3V0WzEyXSA9IHZbMF0gKyBveCAtIChvdXQwICogb3ggKyBvdXQ0ICogb3kgKyBvdXQ4ICogb3opOwogICAgICBvdXRbMTNdID0gdlsxXSArIG95IC0gKG91dDEgKiBveCArIG91dDUgKiBveSArIG91dDkgKiBveik7CiAgICAgIG91dFsxNF0gPSB2WzJdICsgb3ogLSAob3V0MiAqIG94ICsgb3V0NiAqIG95ICsgb3V0MTAgKiBveik7CiAgICAgIG91dFsxNV0gPSAxOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZnJvbVF1YXQzKG91dCwgcSkgewogICAgICB2YXIgeCA9IHFbMF0sIHkgPSBxWzFdLCB6ID0gcVsyXSwgdyA9IHFbM107CiAgICAgIHZhciB4MiA9IHggKyB4OwogICAgICB2YXIgeTIgPSB5ICsgeTsKICAgICAgdmFyIHoyID0geiArIHo7CiAgICAgIHZhciB4eCA9IHggKiB4MjsKICAgICAgdmFyIHl4ID0geSAqIHgyOwogICAgICB2YXIgeXkgPSB5ICogeTI7CiAgICAgIHZhciB6eCA9IHogKiB4MjsKICAgICAgdmFyIHp5ID0geiAqIHkyOwogICAgICB2YXIgenogPSB6ICogejI7CiAgICAgIHZhciB3eCA9IHcgKiB4MjsKICAgICAgdmFyIHd5ID0gdyAqIHkyOwogICAgICB2YXIgd3ogPSB3ICogejI7CiAgICAgIG91dFswXSA9IDEgLSB5eSAtIHp6OwogICAgICBvdXRbMV0gPSB5eCArIHd6OwogICAgICBvdXRbMl0gPSB6eCAtIHd5OwogICAgICBvdXRbM10gPSAwOwogICAgICBvdXRbNF0gPSB5eCAtIHd6OwogICAgICBvdXRbNV0gPSAxIC0geHggLSB6ejsKICAgICAgb3V0WzZdID0genkgKyB3eDsKICAgICAgb3V0WzddID0gMDsKICAgICAgb3V0WzhdID0genggKyB3eTsKICAgICAgb3V0WzldID0genkgLSB3eDsKICAgICAgb3V0WzEwXSA9IDEgLSB4eCAtIHl5OwogICAgICBvdXRbMTFdID0gMDsKICAgICAgb3V0WzEyXSA9IDA7CiAgICAgIG91dFsxM10gPSAwOwogICAgICBvdXRbMTRdID0gMDsKICAgICAgb3V0WzE1XSA9IDE7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBmcnVzdHVtKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHsKICAgICAgdmFyIHJsID0gMSAvIChyaWdodCAtIGxlZnQpOwogICAgICB2YXIgdGIgPSAxIC8gKHRvcCAtIGJvdHRvbSk7CiAgICAgIHZhciBuZiA9IDEgLyAobmVhciAtIGZhcik7CiAgICAgIG91dFswXSA9IG5lYXIgKiAyICogcmw7CiAgICAgIG91dFsxXSA9IDA7CiAgICAgIG91dFsyXSA9IDA7CiAgICAgIG91dFszXSA9IDA7CiAgICAgIG91dFs0XSA9IDA7CiAgICAgIG91dFs1XSA9IG5lYXIgKiAyICogdGI7CiAgICAgIG91dFs2XSA9IDA7CiAgICAgIG91dFs3XSA9IDA7CiAgICAgIG91dFs4XSA9IChyaWdodCArIGxlZnQpICogcmw7CiAgICAgIG91dFs5XSA9ICh0b3AgKyBib3R0b20pICogdGI7CiAgICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjsKICAgICAgb3V0WzExXSA9IC0xOwogICAgICBvdXRbMTJdID0gMDsKICAgICAgb3V0WzEzXSA9IDA7CiAgICAgIG91dFsxNF0gPSBmYXIgKiBuZWFyICogMiAqIG5mOwogICAgICBvdXRbMTVdID0gMDsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHBlcnNwZWN0aXZlKG91dCwgZm92eSwgYXNwZWN0LCBuZWFyLCBmYXIpIHsKICAgICAgdmFyIGYgPSAxIC8gTWF0aC50YW4oZm92eSAvIDIpLCBuZjsKICAgICAgb3V0WzBdID0gZiAvIGFzcGVjdDsKICAgICAgb3V0WzFdID0gMDsKICAgICAgb3V0WzJdID0gMDsKICAgICAgb3V0WzNdID0gMDsKICAgICAgb3V0WzRdID0gMDsKICAgICAgb3V0WzVdID0gZjsKICAgICAgb3V0WzZdID0gMDsKICAgICAgb3V0WzddID0gMDsKICAgICAgb3V0WzhdID0gMDsKICAgICAgb3V0WzldID0gMDsKICAgICAgb3V0WzExXSA9IC0xOwogICAgICBvdXRbMTJdID0gMDsKICAgICAgb3V0WzEzXSA9IDA7CiAgICAgIG91dFsxNV0gPSAwOwogICAgICBpZiAoZmFyICE9IG51bGwgJiYgZmFyICE9PSBJbmZpbml0eSkgewogICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTsKICAgICAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7CiAgICAgICAgb3V0WzE0XSA9IDIgKiBmYXIgKiBuZWFyICogbmY7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0WzEwXSA9IC0xOwogICAgICAgIG91dFsxNF0gPSAtMiAqIG5lYXI7CiAgICAgIH0KICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHBlcnNwZWN0aXZlRnJvbUZpZWxkT2ZWaWV3KG91dCwgZm92LCBuZWFyLCBmYXIpIHsKICAgICAgdmFyIHVwVGFuID0gTWF0aC50YW4oZm92LnVwRGVncmVlcyAqIE1hdGguUEkgLyAxODApOwogICAgICB2YXIgZG93blRhbiA9IE1hdGgudGFuKGZvdi5kb3duRGVncmVlcyAqIE1hdGguUEkgLyAxODApOwogICAgICB2YXIgbGVmdFRhbiA9IE1hdGgudGFuKGZvdi5sZWZ0RGVncmVlcyAqIE1hdGguUEkgLyAxODApOwogICAgICB2YXIgcmlnaHRUYW4gPSBNYXRoLnRhbihmb3YucmlnaHREZWdyZWVzICogTWF0aC5QSSAvIDE4MCk7CiAgICAgIHZhciB4U2NhbGUgPSAyIC8gKGxlZnRUYW4gKyByaWdodFRhbik7CiAgICAgIHZhciB5U2NhbGUgPSAyIC8gKHVwVGFuICsgZG93blRhbik7CiAgICAgIG91dFswXSA9IHhTY2FsZTsKICAgICAgb3V0WzFdID0gMDsKICAgICAgb3V0WzJdID0gMDsKICAgICAgb3V0WzNdID0gMDsKICAgICAgb3V0WzRdID0gMDsKICAgICAgb3V0WzVdID0geVNjYWxlOwogICAgICBvdXRbNl0gPSAwOwogICAgICBvdXRbN10gPSAwOwogICAgICBvdXRbOF0gPSAtKChsZWZ0VGFuIC0gcmlnaHRUYW4pICogeFNjYWxlICogMC41KTsKICAgICAgb3V0WzldID0gKHVwVGFuIC0gZG93blRhbikgKiB5U2NhbGUgKiAwLjU7CiAgICAgIG91dFsxMF0gPSBmYXIgLyAobmVhciAtIGZhcik7CiAgICAgIG91dFsxMV0gPSAtMTsKICAgICAgb3V0WzEyXSA9IDA7CiAgICAgIG91dFsxM10gPSAwOwogICAgICBvdXRbMTRdID0gZmFyICogbmVhciAvIChuZWFyIC0gZmFyKTsKICAgICAgb3V0WzE1XSA9IDA7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBvcnRobyhvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7CiAgICAgIHZhciBsciA9IDEgLyAobGVmdCAtIHJpZ2h0KTsKICAgICAgdmFyIGJ0ID0gMSAvIChib3R0b20gLSB0b3ApOwogICAgICB2YXIgbmYgPSAxIC8gKG5lYXIgLSBmYXIpOwogICAgICBvdXRbMF0gPSAtMiAqIGxyOwogICAgICBvdXRbMV0gPSAwOwogICAgICBvdXRbMl0gPSAwOwogICAgICBvdXRbM10gPSAwOwogICAgICBvdXRbNF0gPSAwOwogICAgICBvdXRbNV0gPSAtMiAqIGJ0OwogICAgICBvdXRbNl0gPSAwOwogICAgICBvdXRbN10gPSAwOwogICAgICBvdXRbOF0gPSAwOwogICAgICBvdXRbOV0gPSAwOwogICAgICBvdXRbMTBdID0gMiAqIG5mOwogICAgICBvdXRbMTFdID0gMDsKICAgICAgb3V0WzEyXSA9IChsZWZ0ICsgcmlnaHQpICogbHI7CiAgICAgIG91dFsxM10gPSAodG9wICsgYm90dG9tKSAqIGJ0OwogICAgICBvdXRbMTRdID0gKGZhciArIG5lYXIpICogbmY7CiAgICAgIG91dFsxNV0gPSAxOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gbG9va0F0KG91dCwgZXllLCBjZW50ZXIsIHVwKSB7CiAgICAgIHZhciB4MCwgeDEsIHgyLCB5MCwgeTEsIHkyLCB6MCwgejEsIHoyLCBsZW40OwogICAgICB2YXIgZXlleCA9IGV5ZVswXTsKICAgICAgdmFyIGV5ZXkgPSBleWVbMV07CiAgICAgIHZhciBleWV6ID0gZXllWzJdOwogICAgICB2YXIgdXB4ID0gdXBbMF07CiAgICAgIHZhciB1cHkgPSB1cFsxXTsKICAgICAgdmFyIHVweiA9IHVwWzJdOwogICAgICB2YXIgY2VudGVyeCA9IGNlbnRlclswXTsKICAgICAgdmFyIGNlbnRlcnkgPSBjZW50ZXJbMV07CiAgICAgIHZhciBjZW50ZXJ6ID0gY2VudGVyWzJdOwogICAgICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgRVBTSUxPTiAmJiBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCBFUFNJTE9OICYmIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IEVQU0lMT04pIHsKICAgICAgICByZXR1cm4gaWRlbnRpdHkyKG91dCk7CiAgICAgIH0KICAgICAgejAgPSBleWV4IC0gY2VudGVyeDsKICAgICAgejEgPSBleWV5IC0gY2VudGVyeTsKICAgICAgejIgPSBleWV6IC0gY2VudGVyejsKICAgICAgbGVuNCA9IDEgLyBNYXRoLmh5cG90KHowLCB6MSwgejIpOwogICAgICB6MCAqPSBsZW40OwogICAgICB6MSAqPSBsZW40OwogICAgICB6MiAqPSBsZW40OwogICAgICB4MCA9IHVweSAqIHoyIC0gdXB6ICogejE7CiAgICAgIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjsKICAgICAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowOwogICAgICBsZW40ID0gTWF0aC5oeXBvdCh4MCwgeDEsIHgyKTsKICAgICAgaWYgKCFsZW40KSB7CiAgICAgICAgeDAgPSAwOwogICAgICAgIHgxID0gMDsKICAgICAgICB4MiA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGVuNCA9IDEgLyBsZW40OwogICAgICAgIHgwICo9IGxlbjQ7CiAgICAgICAgeDEgKj0gbGVuNDsKICAgICAgICB4MiAqPSBsZW40OwogICAgICB9CiAgICAgIHkwID0gejEgKiB4MiAtIHoyICogeDE7CiAgICAgIHkxID0gejIgKiB4MCAtIHowICogeDI7CiAgICAgIHkyID0gejAgKiB4MSAtIHoxICogeDA7CiAgICAgIGxlbjQgPSBNYXRoLmh5cG90KHkwLCB5MSwgeTIpOwogICAgICBpZiAoIWxlbjQpIHsKICAgICAgICB5MCA9IDA7CiAgICAgICAgeTEgPSAwOwogICAgICAgIHkyID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZW40ID0gMSAvIGxlbjQ7CiAgICAgICAgeTAgKj0gbGVuNDsKICAgICAgICB5MSAqPSBsZW40OwogICAgICAgIHkyICo9IGxlbjQ7CiAgICAgIH0KICAgICAgb3V0WzBdID0geDA7CiAgICAgIG91dFsxXSA9IHkwOwogICAgICBvdXRbMl0gPSB6MDsKICAgICAgb3V0WzNdID0gMDsKICAgICAgb3V0WzRdID0geDE7CiAgICAgIG91dFs1XSA9IHkxOwogICAgICBvdXRbNl0gPSB6MTsKICAgICAgb3V0WzddID0gMDsKICAgICAgb3V0WzhdID0geDI7CiAgICAgIG91dFs5XSA9IHkyOwogICAgICBvdXRbMTBdID0gejI7CiAgICAgIG91dFsxMV0gPSAwOwogICAgICBvdXRbMTJdID0gLSh4MCAqIGV5ZXggKyB4MSAqIGV5ZXkgKyB4MiAqIGV5ZXopOwogICAgICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopOwogICAgICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopOwogICAgICBvdXRbMTVdID0gMTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHRhcmdldFRvKG91dCwgZXllLCB0YXJnZXQsIHVwKSB7CiAgICAgIHZhciBleWV4ID0gZXllWzBdLCBleWV5ID0gZXllWzFdLCBleWV6ID0gZXllWzJdLCB1cHggPSB1cFswXSwgdXB5ID0gdXBbMV0sIHVweiA9IHVwWzJdOwogICAgICB2YXIgejAgPSBleWV4IC0gdGFyZ2V0WzBdLCB6MSA9IGV5ZXkgLSB0YXJnZXRbMV0sIHoyID0gZXlleiAtIHRhcmdldFsyXTsKICAgICAgdmFyIGxlbjQgPSB6MCAqIHowICsgejEgKiB6MSArIHoyICogejI7CiAgICAgIGlmIChsZW40ID4gMCkgewogICAgICAgIGxlbjQgPSAxIC8gTWF0aC5zcXJ0KGxlbjQpOwogICAgICAgIHowICo9IGxlbjQ7CiAgICAgICAgejEgKj0gbGVuNDsKICAgICAgICB6MiAqPSBsZW40OwogICAgICB9CiAgICAgIHZhciB4MCA9IHVweSAqIHoyIC0gdXB6ICogejEsIHgxID0gdXB6ICogejAgLSB1cHggKiB6MiwgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowOwogICAgICBsZW40ID0geDAgKiB4MCArIHgxICogeDEgKyB4MiAqIHgyOwogICAgICBpZiAobGVuNCA+IDApIHsKICAgICAgICBsZW40ID0gMSAvIE1hdGguc3FydChsZW40KTsKICAgICAgICB4MCAqPSBsZW40OwogICAgICAgIHgxICo9IGxlbjQ7CiAgICAgICAgeDIgKj0gbGVuNDsKICAgICAgfQogICAgICBvdXRbMF0gPSB4MDsKICAgICAgb3V0WzFdID0geDE7CiAgICAgIG91dFsyXSA9IHgyOwogICAgICBvdXRbM10gPSAwOwogICAgICBvdXRbNF0gPSB6MSAqIHgyIC0gejIgKiB4MTsKICAgICAgb3V0WzVdID0gejIgKiB4MCAtIHowICogeDI7CiAgICAgIG91dFs2XSA9IHowICogeDEgLSB6MSAqIHgwOwogICAgICBvdXRbN10gPSAwOwogICAgICBvdXRbOF0gPSB6MDsKICAgICAgb3V0WzldID0gejE7CiAgICAgIG91dFsxMF0gPSB6MjsKICAgICAgb3V0WzExXSA9IDA7CiAgICAgIG91dFsxMl0gPSBleWV4OwogICAgICBvdXRbMTNdID0gZXlleTsKICAgICAgb3V0WzE0XSA9IGV5ZXo7CiAgICAgIG91dFsxNV0gPSAxOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gc3RyMihhKSB7CiAgICAgIHJldHVybiAibWF0NCgiICsgYVswXSArICIsICIgKyBhWzFdICsgIiwgIiArIGFbMl0gKyAiLCAiICsgYVszXSArICIsICIgKyBhWzRdICsgIiwgIiArIGFbNV0gKyAiLCAiICsgYVs2XSArICIsICIgKyBhWzddICsgIiwgIiArIGFbOF0gKyAiLCAiICsgYVs5XSArICIsICIgKyBhWzEwXSArICIsICIgKyBhWzExXSArICIsICIgKyBhWzEyXSArICIsICIgKyBhWzEzXSArICIsICIgKyBhWzE0XSArICIsICIgKyBhWzE1XSArICIpIjsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb2IyKGEpIHsKICAgICAgcmV0dXJuIE1hdGguaHlwb3QoYVswXSwgYVsxXSwgYVszXSwgYVs0XSwgYVs1XSwgYVs2XSwgYVs3XSwgYVs4XSwgYVs5XSwgYVsxMF0sIGFbMTFdLCBhWzEyXSwgYVsxM10sIGFbMTRdLCBhWzE1XSk7CiAgICB9CiAgICBmdW5jdGlvbiBhZGQyKG91dCwgYSwgYikgewogICAgICBvdXRbMF0gPSBhWzBdICsgYlswXTsKICAgICAgb3V0WzFdID0gYVsxXSArIGJbMV07CiAgICAgIG91dFsyXSA9IGFbMl0gKyBiWzJdOwogICAgICBvdXRbM10gPSBhWzNdICsgYlszXTsKICAgICAgb3V0WzRdID0gYVs0XSArIGJbNF07CiAgICAgIG91dFs1XSA9IGFbNV0gKyBiWzVdOwogICAgICBvdXRbNl0gPSBhWzZdICsgYls2XTsKICAgICAgb3V0WzddID0gYVs3XSArIGJbN107CiAgICAgIG91dFs4XSA9IGFbOF0gKyBiWzhdOwogICAgICBvdXRbOV0gPSBhWzldICsgYls5XTsKICAgICAgb3V0WzEwXSA9IGFbMTBdICsgYlsxMF07CiAgICAgIG91dFsxMV0gPSBhWzExXSArIGJbMTFdOwogICAgICBvdXRbMTJdID0gYVsxMl0gKyBiWzEyXTsKICAgICAgb3V0WzEzXSA9IGFbMTNdICsgYlsxM107CiAgICAgIG91dFsxNF0gPSBhWzE0XSArIGJbMTRdOwogICAgICBvdXRbMTVdID0gYVsxNV0gKyBiWzE1XTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHN1YnRyYWN0MihvdXQsIGEsIGIpIHsKICAgICAgb3V0WzBdID0gYVswXSAtIGJbMF07CiAgICAgIG91dFsxXSA9IGFbMV0gLSBiWzFdOwogICAgICBvdXRbMl0gPSBhWzJdIC0gYlsyXTsKICAgICAgb3V0WzNdID0gYVszXSAtIGJbM107CiAgICAgIG91dFs0XSA9IGFbNF0gLSBiWzRdOwogICAgICBvdXRbNV0gPSBhWzVdIC0gYls1XTsKICAgICAgb3V0WzZdID0gYVs2XSAtIGJbNl07CiAgICAgIG91dFs3XSA9IGFbN10gLSBiWzddOwogICAgICBvdXRbOF0gPSBhWzhdIC0gYls4XTsKICAgICAgb3V0WzldID0gYVs5XSAtIGJbOV07CiAgICAgIG91dFsxMF0gPSBhWzEwXSAtIGJbMTBdOwogICAgICBvdXRbMTFdID0gYVsxMV0gLSBiWzExXTsKICAgICAgb3V0WzEyXSA9IGFbMTJdIC0gYlsxMl07CiAgICAgIG91dFsxM10gPSBhWzEzXSAtIGJbMTNdOwogICAgICBvdXRbMTRdID0gYVsxNF0gLSBiWzE0XTsKICAgICAgb3V0WzE1XSA9IGFbMTVdIC0gYlsxNV07CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcjIob3V0LCBhLCBiKSB7CiAgICAgIG91dFswXSA9IGFbMF0gKiBiOwogICAgICBvdXRbMV0gPSBhWzFdICogYjsKICAgICAgb3V0WzJdID0gYVsyXSAqIGI7CiAgICAgIG91dFszXSA9IGFbM10gKiBiOwogICAgICBvdXRbNF0gPSBhWzRdICogYjsKICAgICAgb3V0WzVdID0gYVs1XSAqIGI7CiAgICAgIG91dFs2XSA9IGFbNl0gKiBiOwogICAgICBvdXRbN10gPSBhWzddICogYjsKICAgICAgb3V0WzhdID0gYVs4XSAqIGI7CiAgICAgIG91dFs5XSA9IGFbOV0gKiBiOwogICAgICBvdXRbMTBdID0gYVsxMF0gKiBiOwogICAgICBvdXRbMTFdID0gYVsxMV0gKiBiOwogICAgICBvdXRbMTJdID0gYVsxMl0gKiBiOwogICAgICBvdXRbMTNdID0gYVsxM10gKiBiOwogICAgICBvdXRbMTRdID0gYVsxNF0gKiBiOwogICAgICBvdXRbMTVdID0gYVsxNV0gKiBiOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQyKG91dCwgYSwgYiwgc2NhbGU2KSB7CiAgICAgIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU2OwogICAgICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlNjsKICAgICAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTY7CiAgICAgIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU2OwogICAgICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlNjsKICAgICAgb3V0WzVdID0gYVs1XSArIGJbNV0gKiBzY2FsZTY7CiAgICAgIG91dFs2XSA9IGFbNl0gKyBiWzZdICogc2NhbGU2OwogICAgICBvdXRbN10gPSBhWzddICsgYls3XSAqIHNjYWxlNjsKICAgICAgb3V0WzhdID0gYVs4XSArIGJbOF0gKiBzY2FsZTY7CiAgICAgIG91dFs5XSA9IGFbOV0gKyBiWzldICogc2NhbGU2OwogICAgICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXSAqIHNjYWxlNjsKICAgICAgb3V0WzExXSA9IGFbMTFdICsgYlsxMV0gKiBzY2FsZTY7CiAgICAgIG91dFsxMl0gPSBhWzEyXSArIGJbMTJdICogc2NhbGU2OwogICAgICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXSAqIHNjYWxlNjsKICAgICAgb3V0WzE0XSA9IGFbMTRdICsgYlsxNF0gKiBzY2FsZTY7CiAgICAgIG91dFsxNV0gPSBhWzE1XSArIGJbMTVdICogc2NhbGU2OwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZXhhY3RFcXVhbHMyKGEsIGIpIHsKICAgICAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdICYmIGFbNl0gPT09IGJbNl0gJiYgYVs3XSA9PT0gYls3XSAmJiBhWzhdID09PSBiWzhdICYmIGFbOV0gPT09IGJbOV0gJiYgYVsxMF0gPT09IGJbMTBdICYmIGFbMTFdID09PSBiWzExXSAmJiBhWzEyXSA9PT0gYlsxMl0gJiYgYVsxM10gPT09IGJbMTNdICYmIGFbMTRdID09PSBiWzE0XSAmJiBhWzE1XSA9PT0gYlsxNV07CiAgICB9CiAgICBmdW5jdGlvbiBlcXVhbHMyKGEsIGIpIHsKICAgICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXTsKICAgICAgdmFyIGE0ID0gYVs0XSwgYTUgPSBhWzVdLCBhNiA9IGFbNl0sIGE3ID0gYVs3XTsKICAgICAgdmFyIGE4ID0gYVs4XSwgYTkgPSBhWzldLCBhMTAgPSBhWzEwXSwgYTExID0gYVsxMV07CiAgICAgIHZhciBhMTIgPSBhWzEyXSwgYTEzID0gYVsxM10sIGExNCA9IGFbMTRdLCBhMTUgPSBhWzE1XTsKICAgICAgdmFyIGIwID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTsKICAgICAgdmFyIGI0ID0gYls0XSwgYjUgPSBiWzVdLCBiNiA9IGJbNl0sIGI3ID0gYls3XTsKICAgICAgdmFyIGI4ID0gYls4XSwgYjkgPSBiWzldLCBiMTAgPSBiWzEwXSwgYjExID0gYlsxMV07CiAgICAgIHZhciBiMTIgPSBiWzEyXSwgYjEzID0gYlsxM10sIGIxNCA9IGJbMTRdLCBiMTUgPSBiWzE1XTsKICAgICAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEsIE1hdGguYWJzKGE0KSwgTWF0aC5hYnMoYjQpKSAmJiBNYXRoLmFicyhhNSAtIGI1KSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmIE1hdGguYWJzKGE2IC0gYjYpIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLCBNYXRoLmFicyhhNiksIE1hdGguYWJzKGI2KSkgJiYgTWF0aC5hYnMoYTcgLSBiNykgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEsIE1hdGguYWJzKGE3KSwgTWF0aC5hYnMoYjcpKSAmJiBNYXRoLmFicyhhOCAtIGI4KSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTgpLCBNYXRoLmFicyhiOCkpICYmIE1hdGguYWJzKGE5IC0gYjkpIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLCBNYXRoLmFicyhhOSksIE1hdGguYWJzKGI5KSkgJiYgTWF0aC5hYnMoYTEwIC0gYjEwKSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTEwKSwgTWF0aC5hYnMoYjEwKSkgJiYgTWF0aC5hYnMoYTExIC0gYjExKSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTExKSwgTWF0aC5hYnMoYjExKSkgJiYgTWF0aC5hYnMoYTEyIC0gYjEyKSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTEyKSwgTWF0aC5hYnMoYjEyKSkgJiYgTWF0aC5hYnMoYTEzIC0gYjEzKSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTEzKSwgTWF0aC5hYnMoYjEzKSkgJiYgTWF0aC5hYnMoYTE0IC0gYjE0KSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTE0KSwgTWF0aC5hYnMoYjE0KSkgJiYgTWF0aC5hYnMoYTE1IC0gYjE1KSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTE1KSwgTWF0aC5hYnMoYjE1KSk7CiAgICB9CiAgICB2YXIgbXVsMiA9IG11bHRpcGx5MjsKICAgIHZhciBzdWIyID0gc3VidHJhY3QyOwoKICAgIC8vIG5vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3F1YXQuanMKICAgIHZhciBxdWF0X2V4cG9ydHMgPSB7fTsKICAgIF9fZXhwb3J0KHF1YXRfZXhwb3J0cywgewogICAgICBhZGQ6ICgpID0+IGFkZDUsCiAgICAgIGNhbGN1bGF0ZVc6ICgpID0+IGNhbGN1bGF0ZVcsCiAgICAgIGNsb25lOiAoKSA9PiBjbG9uZTUsCiAgICAgIGNvbmp1Z2F0ZTogKCkgPT4gY29uanVnYXRlLAogICAgICBjb3B5OiAoKSA9PiBjb3B5NSwKICAgICAgY3JlYXRlOiAoKSA9PiBjcmVhdGU1LAogICAgICBkb3Q6ICgpID0+IGRvdDMsCiAgICAgIGVxdWFsczogKCkgPT4gZXF1YWxzNSwKICAgICAgZXhhY3RFcXVhbHM6ICgpID0+IGV4YWN0RXF1YWxzNSwKICAgICAgZXhwOiAoKSA9PiBleHAsCiAgICAgIGZyb21FdWxlcjogKCkgPT4gZnJvbUV1bGVyLAogICAgICBmcm9tTWF0MzogKCkgPT4gZnJvbU1hdDMsCiAgICAgIGZyb21WYWx1ZXM6ICgpID0+IGZyb21WYWx1ZXM1LAogICAgICBnZXRBbmdsZTogKCkgPT4gZ2V0QW5nbGUsCiAgICAgIGdldEF4aXNBbmdsZTogKCkgPT4gZ2V0QXhpc0FuZ2xlLAogICAgICBpZGVudGl0eTogKCkgPT4gaWRlbnRpdHkzLAogICAgICBpbnZlcnQ6ICgpID0+IGludmVydDMsCiAgICAgIGxlbjogKCkgPT4gbGVuMywKICAgICAgbGVuZ3RoOiAoKSA9PiBsZW5ndGgzLAogICAgICBsZXJwOiAoKSA9PiBsZXJwMywKICAgICAgbG46ICgpID0+IGxuLAogICAgICBtdWw6ICgpID0+IG11bDUsCiAgICAgIG11bHRpcGx5OiAoKSA9PiBtdWx0aXBseTUsCiAgICAgIG5vcm1hbGl6ZTogKCkgPT4gbm9ybWFsaXplMywKICAgICAgcG93OiAoKSA9PiBwb3csCiAgICAgIHJhbmRvbTogKCkgPT4gcmFuZG9tMywKICAgICAgcm90YXRlWDogKCkgPT4gcm90YXRlWDMsCiAgICAgIHJvdGF0ZVk6ICgpID0+IHJvdGF0ZVkzLAogICAgICByb3RhdGVaOiAoKSA9PiByb3RhdGVaMywKICAgICAgcm90YXRpb25UbzogKCkgPT4gcm90YXRpb25UbywKICAgICAgc2NhbGU6ICgpID0+IHNjYWxlNSwKICAgICAgc2V0OiAoKSA9PiBzZXQ1LAogICAgICBzZXRBeGVzOiAoKSA9PiBzZXRBeGVzLAogICAgICBzZXRBeGlzQW5nbGU6ICgpID0+IHNldEF4aXNBbmdsZSwKICAgICAgc2xlcnA6ICgpID0+IHNsZXJwLAogICAgICBzcWxlcnA6ICgpID0+IHNxbGVycCwKICAgICAgc3FyTGVuOiAoKSA9PiBzcXJMZW4zLAogICAgICBzcXVhcmVkTGVuZ3RoOiAoKSA9PiBzcXVhcmVkTGVuZ3RoMywKICAgICAgc3RyOiAoKSA9PiBzdHI1CiAgICB9KTsKCiAgICAvLyBub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMzLmpzCiAgICB2YXIgdmVjM19leHBvcnRzID0ge307CiAgICBfX2V4cG9ydCh2ZWMzX2V4cG9ydHMsIHsKICAgICAgYWRkOiAoKSA9PiBhZGQzLAogICAgICBhbmdsZTogKCkgPT4gYW5nbGUsCiAgICAgIGJlemllcjogKCkgPT4gYmV6aWVyLAogICAgICBjZWlsOiAoKSA9PiBjZWlsLAogICAgICBjbG9uZTogKCkgPT4gY2xvbmUzLAogICAgICBjb3B5OiAoKSA9PiBjb3B5MywKICAgICAgY3JlYXRlOiAoKSA9PiBjcmVhdGUzLAogICAgICBjcm9zczogKCkgPT4gY3Jvc3MsCiAgICAgIGRpc3Q6ICgpID0+IGRpc3QsCiAgICAgIGRpc3RhbmNlOiAoKSA9PiBkaXN0YW5jZSwKICAgICAgZGl2OiAoKSA9PiBkaXYsCiAgICAgIGRpdmlkZTogKCkgPT4gZGl2aWRlLAogICAgICBkb3Q6ICgpID0+IGRvdCwKICAgICAgZXF1YWxzOiAoKSA9PiBlcXVhbHMzLAogICAgICBleGFjdEVxdWFsczogKCkgPT4gZXhhY3RFcXVhbHMzLAogICAgICBmbG9vcjogKCkgPT4gZmxvb3IsCiAgICAgIGZvckVhY2g6ICgpID0+IGZvckVhY2gsCiAgICAgIGZyb21WYWx1ZXM6ICgpID0+IGZyb21WYWx1ZXMzLAogICAgICBoZXJtaXRlOiAoKSA9PiBoZXJtaXRlLAogICAgICBpbnZlcnNlOiAoKSA9PiBpbnZlcnNlLAogICAgICBsZW46ICgpID0+IGxlbiwKICAgICAgbGVuZ3RoOiAoKSA9PiBsZW5ndGgsCiAgICAgIGxlcnA6ICgpID0+IGxlcnAsCiAgICAgIG1heDogKCkgPT4gbWF4LAogICAgICBtaW46ICgpID0+IG1pbiwKICAgICAgbXVsOiAoKSA9PiBtdWwzLAogICAgICBtdWx0aXBseTogKCkgPT4gbXVsdGlwbHkzLAogICAgICBuZWdhdGU6ICgpID0+IG5lZ2F0ZSwKICAgICAgbm9ybWFsaXplOiAoKSA9PiBub3JtYWxpemUsCiAgICAgIHJhbmRvbTogKCkgPT4gcmFuZG9tLAogICAgICByb3RhdGVYOiAoKSA9PiByb3RhdGVYMiwKICAgICAgcm90YXRlWTogKCkgPT4gcm90YXRlWTIsCiAgICAgIHJvdGF0ZVo6ICgpID0+IHJvdGF0ZVoyLAogICAgICByb3VuZDogKCkgPT4gcm91bmQsCiAgICAgIHNjYWxlOiAoKSA9PiBzY2FsZTMsCiAgICAgIHNjYWxlQW5kQWRkOiAoKSA9PiBzY2FsZUFuZEFkZCwKICAgICAgc2V0OiAoKSA9PiBzZXQzLAogICAgICBzcXJEaXN0OiAoKSA9PiBzcXJEaXN0LAogICAgICBzcXJMZW46ICgpID0+IHNxckxlbiwKICAgICAgc3F1YXJlZERpc3RhbmNlOiAoKSA9PiBzcXVhcmVkRGlzdGFuY2UsCiAgICAgIHNxdWFyZWRMZW5ndGg6ICgpID0+IHNxdWFyZWRMZW5ndGgsCiAgICAgIHN0cjogKCkgPT4gc3RyMywKICAgICAgc3ViOiAoKSA9PiBzdWIzLAogICAgICBzdWJ0cmFjdDogKCkgPT4gc3VidHJhY3QzLAogICAgICB0cmFuc2Zvcm1NYXQzOiAoKSA9PiB0cmFuc2Zvcm1NYXQzLAogICAgICB0cmFuc2Zvcm1NYXQ0OiAoKSA9PiB0cmFuc2Zvcm1NYXQ0LAogICAgICB0cmFuc2Zvcm1RdWF0OiAoKSA9PiB0cmFuc2Zvcm1RdWF0LAogICAgICB6ZXJvOiAoKSA9PiB6ZXJvCiAgICB9KTsKICAgIGZ1bmN0aW9uIGNyZWF0ZTMoKSB7CiAgICAgIHZhciBvdXQgPSBuZXcgQVJSQVlfVFlQRSgzKTsKICAgICAgaWYgKEFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7CiAgICAgICAgb3V0WzBdID0gMDsKICAgICAgICBvdXRbMV0gPSAwOwogICAgICAgIG91dFsyXSA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGNsb25lMyhhKSB7CiAgICAgIHZhciBvdXQgPSBuZXcgQVJSQVlfVFlQRSgzKTsKICAgICAgb3V0WzBdID0gYVswXTsKICAgICAgb3V0WzFdID0gYVsxXTsKICAgICAgb3V0WzJdID0gYVsyXTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGxlbmd0aChhKSB7CiAgICAgIHZhciB4ID0gYVswXTsKICAgICAgdmFyIHkgPSBhWzFdOwogICAgICB2YXIgeiA9IGFbMl07CiAgICAgIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHopOwogICAgfQogICAgZnVuY3Rpb24gZnJvbVZhbHVlczMoeCwgeSwgeikgewogICAgICB2YXIgb3V0ID0gbmV3IEFSUkFZX1RZUEUoMyk7CiAgICAgIG91dFswXSA9IHg7CiAgICAgIG91dFsxXSA9IHk7CiAgICAgIG91dFsyXSA9IHo7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBjb3B5MyhvdXQsIGEpIHsKICAgICAgb3V0WzBdID0gYVswXTsKICAgICAgb3V0WzFdID0gYVsxXTsKICAgICAgb3V0WzJdID0gYVsyXTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldDMob3V0LCB4LCB5LCB6KSB7CiAgICAgIG91dFswXSA9IHg7CiAgICAgIG91dFsxXSA9IHk7CiAgICAgIG91dFsyXSA9IHo7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBhZGQzKG91dCwgYSwgYikgewogICAgICBvdXRbMF0gPSBhWzBdICsgYlswXTsKICAgICAgb3V0WzFdID0gYVsxXSArIGJbMV07CiAgICAgIG91dFsyXSA9IGFbMl0gKyBiWzJdOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gc3VidHJhY3QzKG91dCwgYSwgYikgewogICAgICBvdXRbMF0gPSBhWzBdIC0gYlswXTsKICAgICAgb3V0WzFdID0gYVsxXSAtIGJbMV07CiAgICAgIG91dFsyXSA9IGFbMl0gLSBiWzJdOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gbXVsdGlwbHkzKG91dCwgYSwgYikgewogICAgICBvdXRbMF0gPSBhWzBdICogYlswXTsKICAgICAgb3V0WzFdID0gYVsxXSAqIGJbMV07CiAgICAgIG91dFsyXSA9IGFbMl0gKiBiWzJdOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZGl2aWRlKG91dCwgYSwgYikgewogICAgICBvdXRbMF0gPSBhWzBdIC8gYlswXTsKICAgICAgb3V0WzFdID0gYVsxXSAvIGJbMV07CiAgICAgIG91dFsyXSA9IGFbMl0gLyBiWzJdOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHsKICAgICAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pOwogICAgICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7CiAgICAgIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGZsb29yKG91dCwgYSkgewogICAgICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pOwogICAgICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pOwogICAgICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gbWluKG91dCwgYSwgYikgewogICAgICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTsKICAgICAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7CiAgICAgIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikgewogICAgICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTsKICAgICAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7CiAgICAgIG91dFsyXSA9IE1hdGgubWF4KGFbMl0sIGJbMl0pOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7CiAgICAgIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7CiAgICAgIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7CiAgICAgIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzY2FsZTMob3V0LCBhLCBiKSB7CiAgICAgIG91dFswXSA9IGFbMF0gKiBiOwogICAgICBvdXRbMV0gPSBhWzFdICogYjsKICAgICAgb3V0WzJdID0gYVsyXSAqIGI7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlNikgewogICAgICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlNjsKICAgICAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTY7CiAgICAgIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU2OwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikgewogICAgICB2YXIgeCA9IGJbMF0gLSBhWzBdOwogICAgICB2YXIgeSA9IGJbMV0gLSBhWzFdOwogICAgICB2YXIgeiA9IGJbMl0gLSBhWzJdOwogICAgICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShhLCBiKSB7CiAgICAgIHZhciB4ID0gYlswXSAtIGFbMF07CiAgICAgIHZhciB5ID0gYlsxXSAtIGFbMV07CiAgICAgIHZhciB6ID0gYlsyXSAtIGFbMl07CiAgICAgIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7CiAgICB9CiAgICBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoKGEpIHsKICAgICAgdmFyIHggPSBhWzBdOwogICAgICB2YXIgeSA9IGFbMV07CiAgICAgIHZhciB6ID0gYVsyXTsKICAgICAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogejsKICAgIH0KICAgIGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHsKICAgICAgb3V0WzBdID0gLWFbMF07CiAgICAgIG91dFsxXSA9IC1hWzFdOwogICAgICBvdXRbMl0gPSAtYVsyXTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGludmVyc2Uob3V0LCBhKSB7CiAgICAgIG91dFswXSA9IDEgLyBhWzBdOwogICAgICBvdXRbMV0gPSAxIC8gYVsxXTsKICAgICAgb3V0WzJdID0gMSAvIGFbMl07CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7CiAgICAgIHZhciB4ID0gYVswXTsKICAgICAgdmFyIHkgPSBhWzFdOwogICAgICB2YXIgeiA9IGFbMl07CiAgICAgIHZhciBsZW40ID0geCAqIHggKyB5ICogeSArIHogKiB6OwogICAgICBpZiAobGVuNCA+IDApIHsKICAgICAgICBsZW40ID0gMSAvIE1hdGguc3FydChsZW40KTsKICAgICAgfQogICAgICBvdXRbMF0gPSBhWzBdICogbGVuNDsKICAgICAgb3V0WzFdID0gYVsxXSAqIGxlbjQ7CiAgICAgIG91dFsyXSA9IGFbMl0gKiBsZW40OwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZG90KGEsIGIpIHsKICAgICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyb3NzKG91dCwgYSwgYikgewogICAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXTsKICAgICAgdmFyIGJ4ID0gYlswXSwgYnkgPSBiWzFdLCBieiA9IGJbMl07CiAgICAgIG91dFswXSA9IGF5ICogYnogLSBheiAqIGJ5OwogICAgICBvdXRbMV0gPSBheiAqIGJ4IC0gYXggKiBiejsKICAgICAgb3V0WzJdID0gYXggKiBieSAtIGF5ICogYng7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkgewogICAgICB2YXIgYXggPSBhWzBdOwogICAgICB2YXIgYXkgPSBhWzFdOwogICAgICB2YXIgYXogPSBhWzJdOwogICAgICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTsKICAgICAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7CiAgICAgIG91dFsyXSA9IGF6ICsgdCAqIChiWzJdIC0gYXopOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gaGVybWl0ZShvdXQsIGEsIGIsIGMsIGQsIHQpIHsKICAgICAgdmFyIGZhY3RvclRpbWVzMiA9IHQgKiB0OwogICAgICB2YXIgZmFjdG9yMSA9IGZhY3RvclRpbWVzMiAqICgyICogdCAtIDMpICsgMTsKICAgICAgdmFyIGZhY3RvcjIgPSBmYWN0b3JUaW1lczIgKiAodCAtIDIpICsgdDsKICAgICAgdmFyIGZhY3RvcjMgPSBmYWN0b3JUaW1lczIgKiAodCAtIDEpOwogICAgICB2YXIgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqICgzIC0gMiAqIHQpOwogICAgICBvdXRbMF0gPSBhWzBdICogZmFjdG9yMSArIGJbMF0gKiBmYWN0b3IyICsgY1swXSAqIGZhY3RvcjMgKyBkWzBdICogZmFjdG9yNDsKICAgICAgb3V0WzFdID0gYVsxXSAqIGZhY3RvcjEgKyBiWzFdICogZmFjdG9yMiArIGNbMV0gKiBmYWN0b3IzICsgZFsxXSAqIGZhY3RvcjQ7CiAgICAgIG91dFsyXSA9IGFbMl0gKiBmYWN0b3IxICsgYlsyXSAqIGZhY3RvcjIgKyBjWzJdICogZmFjdG9yMyArIGRbMl0gKiBmYWN0b3I0OwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gYmV6aWVyKG91dCwgYSwgYiwgYywgZCwgdCkgewogICAgICB2YXIgaW52ZXJzZUZhY3RvciA9IDEgLSB0OwogICAgICB2YXIgaW52ZXJzZUZhY3RvclRpbWVzVHdvID0gaW52ZXJzZUZhY3RvciAqIGludmVyc2VGYWN0b3I7CiAgICAgIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdDsKICAgICAgdmFyIGZhY3RvcjEgPSBpbnZlcnNlRmFjdG9yVGltZXNUd28gKiBpbnZlcnNlRmFjdG9yOwogICAgICB2YXIgZmFjdG9yMiA9IDMgKiB0ICogaW52ZXJzZUZhY3RvclRpbWVzVHdvOwogICAgICB2YXIgZmFjdG9yMyA9IDMgKiBmYWN0b3JUaW1lczIgKiBpbnZlcnNlRmFjdG9yOwogICAgICB2YXIgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqIHQ7CiAgICAgIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0OwogICAgICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDsKICAgICAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZTYpIHsKICAgICAgc2NhbGU2ID0gc2NhbGU2IHx8IDE7CiAgICAgIHZhciByID0gUkFORE9NKCkgKiAyICogTWF0aC5QSTsKICAgICAgdmFyIHogPSBSQU5ET00oKSAqIDIgLSAxOwogICAgICB2YXIgelNjYWxlID0gTWF0aC5zcXJ0KDEgLSB6ICogeikgKiBzY2FsZTY7CiAgICAgIG91dFswXSA9IE1hdGguY29zKHIpICogelNjYWxlOwogICAgICBvdXRbMV0gPSBNYXRoLnNpbihyKSAqIHpTY2FsZTsKICAgICAgb3V0WzJdID0geiAqIHNjYWxlNjsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7CiAgICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdOwogICAgICB2YXIgdyA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XTsKICAgICAgdyA9IHcgfHwgMTsKICAgICAgb3V0WzBdID0gKG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdKSAvIHc7CiAgICAgIG91dFsxXSA9IChtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSkgLyB3OwogICAgICBvdXRbMl0gPSAobVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdKSAvIHc7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkgewogICAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXTsKICAgICAgb3V0WzBdID0geCAqIG1bMF0gKyB5ICogbVszXSArIHogKiBtWzZdOwogICAgICBvdXRbMV0gPSB4ICogbVsxXSArIHkgKiBtWzRdICsgeiAqIG1bN107CiAgICAgIG91dFsyXSA9IHggKiBtWzJdICsgeSAqIG1bNV0gKyB6ICogbVs4XTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVF1YXQob3V0LCBhLCBxKSB7CiAgICAgIHZhciBxeCA9IHFbMF0sIHF5ID0gcVsxXSwgcXogPSBxWzJdLCBxdyA9IHFbM107CiAgICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdOwogICAgICB2YXIgdXZ4ID0gcXkgKiB6IC0gcXogKiB5LCB1dnkgPSBxeiAqIHggLSBxeCAqIHosIHV2eiA9IHF4ICogeSAtIHF5ICogeDsKICAgICAgdmFyIHV1dnggPSBxeSAqIHV2eiAtIHF6ICogdXZ5LCB1dXZ5ID0gcXogKiB1dnggLSBxeCAqIHV2eiwgdXV2eiA9IHF4ICogdXZ5IC0gcXkgKiB1dng7CiAgICAgIHZhciB3MiA9IHF3ICogMjsKICAgICAgdXZ4ICo9IHcyOwogICAgICB1dnkgKj0gdzI7CiAgICAgIHV2eiAqPSB3MjsKICAgICAgdXV2eCAqPSAyOwogICAgICB1dXZ5ICo9IDI7CiAgICAgIHV1dnogKj0gMjsKICAgICAgb3V0WzBdID0geCArIHV2eCArIHV1dng7CiAgICAgIG91dFsxXSA9IHkgKyB1dnkgKyB1dXZ5OwogICAgICBvdXRbMl0gPSB6ICsgdXZ6ICsgdXV2ejsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHJvdGF0ZVgyKG91dCwgYSwgYiwgYykgewogICAgICB2YXIgcCA9IFtdLCByID0gW107CiAgICAgIHBbMF0gPSBhWzBdIC0gYlswXTsKICAgICAgcFsxXSA9IGFbMV0gLSBiWzFdOwogICAgICBwWzJdID0gYVsyXSAtIGJbMl07CiAgICAgIHJbMF0gPSBwWzBdOwogICAgICByWzFdID0gcFsxXSAqIE1hdGguY29zKGMpIC0gcFsyXSAqIE1hdGguc2luKGMpOwogICAgICByWzJdID0gcFsxXSAqIE1hdGguc2luKGMpICsgcFsyXSAqIE1hdGguY29zKGMpOwogICAgICBvdXRbMF0gPSByWzBdICsgYlswXTsKICAgICAgb3V0WzFdID0gclsxXSArIGJbMV07CiAgICAgIG91dFsyXSA9IHJbMl0gKyBiWzJdOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gcm90YXRlWTIob3V0LCBhLCBiLCBjKSB7CiAgICAgIHZhciBwID0gW10sIHIgPSBbXTsKICAgICAgcFswXSA9IGFbMF0gLSBiWzBdOwogICAgICBwWzFdID0gYVsxXSAtIGJbMV07CiAgICAgIHBbMl0gPSBhWzJdIC0gYlsyXTsKICAgICAgclswXSA9IHBbMl0gKiBNYXRoLnNpbihjKSArIHBbMF0gKiBNYXRoLmNvcyhjKTsKICAgICAgclsxXSA9IHBbMV07CiAgICAgIHJbMl0gPSBwWzJdICogTWF0aC5jb3MoYykgLSBwWzBdICogTWF0aC5zaW4oYyk7CiAgICAgIG91dFswXSA9IHJbMF0gKyBiWzBdOwogICAgICBvdXRbMV0gPSByWzFdICsgYlsxXTsKICAgICAgb3V0WzJdID0gclsyXSArIGJbMl07CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiByb3RhdGVaMihvdXQsIGEsIGIsIGMpIHsKICAgICAgdmFyIHAgPSBbXSwgciA9IFtdOwogICAgICBwWzBdID0gYVswXSAtIGJbMF07CiAgICAgIHBbMV0gPSBhWzFdIC0gYlsxXTsKICAgICAgcFsyXSA9IGFbMl0gLSBiWzJdOwogICAgICByWzBdID0gcFswXSAqIE1hdGguY29zKGMpIC0gcFsxXSAqIE1hdGguc2luKGMpOwogICAgICByWzFdID0gcFswXSAqIE1hdGguc2luKGMpICsgcFsxXSAqIE1hdGguY29zKGMpOwogICAgICByWzJdID0gcFsyXTsKICAgICAgb3V0WzBdID0gclswXSArIGJbMF07CiAgICAgIG91dFsxXSA9IHJbMV0gKyBiWzFdOwogICAgICBvdXRbMl0gPSByWzJdICsgYlsyXTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGFuZ2xlKGEsIGIpIHsKICAgICAgdmFyIHRlbXBBMiA9IGZyb21WYWx1ZXMzKGFbMF0sIGFbMV0sIGFbMl0pOwogICAgICB2YXIgdGVtcEIyID0gZnJvbVZhbHVlczMoYlswXSwgYlsxXSwgYlsyXSk7CiAgICAgIG5vcm1hbGl6ZSh0ZW1wQTIsIHRlbXBBMik7CiAgICAgIG5vcm1hbGl6ZSh0ZW1wQjIsIHRlbXBCMik7CiAgICAgIHZhciBjb3NpbmUgPSBkb3QodGVtcEEyLCB0ZW1wQjIpOwogICAgICBpZiAoY29zaW5lID4gMSkgewogICAgICAgIHJldHVybiAwOwogICAgICB9IGVsc2UgaWYgKGNvc2luZSA8IC0xKSB7CiAgICAgICAgcmV0dXJuIE1hdGguUEk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIE1hdGguYWNvcyhjb3NpbmUpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB6ZXJvKG91dCkgewogICAgICBvdXRbMF0gPSAwOwogICAgICBvdXRbMV0gPSAwOwogICAgICBvdXRbMl0gPSAwOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gc3RyMyhhKSB7CiAgICAgIHJldHVybiAidmVjMygiICsgYVswXSArICIsICIgKyBhWzFdICsgIiwgIiArIGFbMl0gKyAiKSI7CiAgICB9CiAgICBmdW5jdGlvbiBleGFjdEVxdWFsczMoYSwgYikgewogICAgICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl07CiAgICB9CiAgICBmdW5jdGlvbiBlcXVhbHMzKGEsIGIpIHsKICAgICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl07CiAgICAgIHZhciBiMCA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdOwogICAgICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSk7CiAgICB9CiAgICB2YXIgc3ViMyA9IHN1YnRyYWN0MzsKICAgIHZhciBtdWwzID0gbXVsdGlwbHkzOwogICAgdmFyIGRpdiA9IGRpdmlkZTsKICAgIHZhciBkaXN0ID0gZGlzdGFuY2U7CiAgICB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTsKICAgIHZhciBsZW4gPSBsZW5ndGg7CiAgICB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDsKICAgIHZhciBmb3JFYWNoID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2ZWMgPSBjcmVhdGUzKCk7CiAgICAgIHJldHVybiBmdW5jdGlvbihhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHsKICAgICAgICB2YXIgaSwgbDsKICAgICAgICBpZiAoIXN0cmlkZSkgewogICAgICAgICAgc3RyaWRlID0gMzsKICAgICAgICB9CiAgICAgICAgaWYgKCFvZmZzZXQpIHsKICAgICAgICAgIG9mZnNldCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChjb3VudCkgewogICAgICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGwgPSBhLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHsKICAgICAgICAgIHZlY1swXSA9IGFbaV07CiAgICAgICAgICB2ZWNbMV0gPSBhW2kgKyAxXTsKICAgICAgICAgIHZlY1syXSA9IGFbaSArIDJdOwogICAgICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7CiAgICAgICAgICBhW2ldID0gdmVjWzBdOwogICAgICAgICAgYVtpICsgMV0gPSB2ZWNbMV07CiAgICAgICAgICBhW2kgKyAyXSA9IHZlY1syXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH07CiAgICB9KCk7CgogICAgLy8gbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjNC5qcwogICAgdmFyIHZlYzRfZXhwb3J0cyA9IHt9OwogICAgX19leHBvcnQodmVjNF9leHBvcnRzLCB7CiAgICAgIGFkZDogKCkgPT4gYWRkNCwKICAgICAgY2VpbDogKCkgPT4gY2VpbDIsCiAgICAgIGNsb25lOiAoKSA9PiBjbG9uZTQsCiAgICAgIGNvcHk6ICgpID0+IGNvcHk0LAogICAgICBjcmVhdGU6ICgpID0+IGNyZWF0ZTQsCiAgICAgIGNyb3NzOiAoKSA9PiBjcm9zczIsCiAgICAgIGRpc3Q6ICgpID0+IGRpc3QyLAogICAgICBkaXN0YW5jZTogKCkgPT4gZGlzdGFuY2UyLAogICAgICBkaXY6ICgpID0+IGRpdjIsCiAgICAgIGRpdmlkZTogKCkgPT4gZGl2aWRlMiwKICAgICAgZG90OiAoKSA9PiBkb3QyLAogICAgICBlcXVhbHM6ICgpID0+IGVxdWFsczQsCiAgICAgIGV4YWN0RXF1YWxzOiAoKSA9PiBleGFjdEVxdWFsczQsCiAgICAgIGZsb29yOiAoKSA9PiBmbG9vcjIsCiAgICAgIGZvckVhY2g6ICgpID0+IGZvckVhY2gyLAogICAgICBmcm9tVmFsdWVzOiAoKSA9PiBmcm9tVmFsdWVzNCwKICAgICAgaW52ZXJzZTogKCkgPT4gaW52ZXJzZTIsCiAgICAgIGxlbjogKCkgPT4gbGVuMiwKICAgICAgbGVuZ3RoOiAoKSA9PiBsZW5ndGgyLAogICAgICBsZXJwOiAoKSA9PiBsZXJwMiwKICAgICAgbWF4OiAoKSA9PiBtYXgyLAogICAgICBtaW46ICgpID0+IG1pbjIsCiAgICAgIG11bDogKCkgPT4gbXVsNCwKICAgICAgbXVsdGlwbHk6ICgpID0+IG11bHRpcGx5NCwKICAgICAgbmVnYXRlOiAoKSA9PiBuZWdhdGUyLAogICAgICBub3JtYWxpemU6ICgpID0+IG5vcm1hbGl6ZTIsCiAgICAgIHJhbmRvbTogKCkgPT4gcmFuZG9tMiwKICAgICAgcm91bmQ6ICgpID0+IHJvdW5kMiwKICAgICAgc2NhbGU6ICgpID0+IHNjYWxlNCwKICAgICAgc2NhbGVBbmRBZGQ6ICgpID0+IHNjYWxlQW5kQWRkMiwKICAgICAgc2V0OiAoKSA9PiBzZXQ0LAogICAgICBzcXJEaXN0OiAoKSA9PiBzcXJEaXN0MiwKICAgICAgc3FyTGVuOiAoKSA9PiBzcXJMZW4yLAogICAgICBzcXVhcmVkRGlzdGFuY2U6ICgpID0+IHNxdWFyZWREaXN0YW5jZTIsCiAgICAgIHNxdWFyZWRMZW5ndGg6ICgpID0+IHNxdWFyZWRMZW5ndGgyLAogICAgICBzdHI6ICgpID0+IHN0cjQsCiAgICAgIHN1YjogKCkgPT4gc3ViNCwKICAgICAgc3VidHJhY3Q6ICgpID0+IHN1YnRyYWN0NCwKICAgICAgdHJhbnNmb3JtTWF0NDogKCkgPT4gdHJhbnNmb3JtTWF0NDIsCiAgICAgIHRyYW5zZm9ybVF1YXQ6ICgpID0+IHRyYW5zZm9ybVF1YXQyLAogICAgICB6ZXJvOiAoKSA9PiB6ZXJvMgogICAgfSk7CiAgICBmdW5jdGlvbiBjcmVhdGU0KCkgewogICAgICB2YXIgb3V0ID0gbmV3IEFSUkFZX1RZUEUoNCk7CiAgICAgIGlmIChBUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkgewogICAgICAgIG91dFswXSA9IDA7CiAgICAgICAgb3V0WzFdID0gMDsKICAgICAgICBvdXRbMl0gPSAwOwogICAgICAgIG91dFszXSA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGNsb25lNChhKSB7CiAgICAgIHZhciBvdXQgPSBuZXcgQVJSQVlfVFlQRSg0KTsKICAgICAgb3V0WzBdID0gYVswXTsKICAgICAgb3V0WzFdID0gYVsxXTsKICAgICAgb3V0WzJdID0gYVsyXTsKICAgICAgb3V0WzNdID0gYVszXTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21WYWx1ZXM0KHgsIHksIHosIHcpIHsKICAgICAgdmFyIG91dCA9IG5ldyBBUlJBWV9UWVBFKDQpOwogICAgICBvdXRbMF0gPSB4OwogICAgICBvdXRbMV0gPSB5OwogICAgICBvdXRbMl0gPSB6OwogICAgICBvdXRbM10gPSB3OwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gY29weTQob3V0LCBhKSB7CiAgICAgIG91dFswXSA9IGFbMF07CiAgICAgIG91dFsxXSA9IGFbMV07CiAgICAgIG91dFsyXSA9IGFbMl07CiAgICAgIG91dFszXSA9IGFbM107CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzZXQ0KG91dCwgeCwgeSwgeiwgdykgewogICAgICBvdXRbMF0gPSB4OwogICAgICBvdXRbMV0gPSB5OwogICAgICBvdXRbMl0gPSB6OwogICAgICBvdXRbM10gPSB3OwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gYWRkNChvdXQsIGEsIGIpIHsKICAgICAgb3V0WzBdID0gYVswXSArIGJbMF07CiAgICAgIG91dFsxXSA9IGFbMV0gKyBiWzFdOwogICAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTsKICAgICAgb3V0WzNdID0gYVszXSArIGJbM107CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdWJ0cmFjdDQob3V0LCBhLCBiKSB7CiAgICAgIG91dFswXSA9IGFbMF0gLSBiWzBdOwogICAgICBvdXRbMV0gPSBhWzFdIC0gYlsxXTsKICAgICAgb3V0WzJdID0gYVsyXSAtIGJbMl07CiAgICAgIG91dFszXSA9IGFbM10gLSBiWzNdOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gbXVsdGlwbHk0KG91dCwgYSwgYikgewogICAgICBvdXRbMF0gPSBhWzBdICogYlswXTsKICAgICAgb3V0WzFdID0gYVsxXSAqIGJbMV07CiAgICAgIG91dFsyXSA9IGFbMl0gKiBiWzJdOwogICAgICBvdXRbM10gPSBhWzNdICogYlszXTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGRpdmlkZTIob3V0LCBhLCBiKSB7CiAgICAgIG91dFswXSA9IGFbMF0gLyBiWzBdOwogICAgICBvdXRbMV0gPSBhWzFdIC8gYlsxXTsKICAgICAgb3V0WzJdID0gYVsyXSAvIGJbMl07CiAgICAgIG91dFszXSA9IGFbM10gLyBiWzNdOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gY2VpbDIob3V0LCBhKSB7CiAgICAgIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTsKICAgICAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pOwogICAgICBvdXRbMl0gPSBNYXRoLmNlaWwoYVsyXSk7CiAgICAgIG91dFszXSA9IE1hdGguY2VpbChhWzNdKTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGZsb29yMihvdXQsIGEpIHsKICAgICAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTsKICAgICAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTsKICAgICAgb3V0WzJdID0gTWF0aC5mbG9vcihhWzJdKTsKICAgICAgb3V0WzNdID0gTWF0aC5mbG9vcihhWzNdKTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIG1pbjIob3V0LCBhLCBiKSB7CiAgICAgIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pOwogICAgICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTsKICAgICAgb3V0WzJdID0gTWF0aC5taW4oYVsyXSwgYlsyXSk7CiAgICAgIG91dFszXSA9IE1hdGgubWluKGFbM10sIGJbM10pOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gbWF4MihvdXQsIGEsIGIpIHsKICAgICAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7CiAgICAgIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pOwogICAgICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTsKICAgICAgb3V0WzNdID0gTWF0aC5tYXgoYVszXSwgYlszXSk7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiByb3VuZDIob3V0LCBhKSB7CiAgICAgIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7CiAgICAgIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7CiAgICAgIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7CiAgICAgIG91dFszXSA9IE1hdGgucm91bmQoYVszXSk7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzY2FsZTQob3V0LCBhLCBiKSB7CiAgICAgIG91dFswXSA9IGFbMF0gKiBiOwogICAgICBvdXRbMV0gPSBhWzFdICogYjsKICAgICAgb3V0WzJdID0gYVsyXSAqIGI7CiAgICAgIG91dFszXSA9IGFbM10gKiBiOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gc2NhbGVBbmRBZGQyKG91dCwgYSwgYiwgc2NhbGU2KSB7CiAgICAgIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU2OwogICAgICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlNjsKICAgICAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTY7CiAgICAgIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU2OwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZGlzdGFuY2UyKGEsIGIpIHsKICAgICAgdmFyIHggPSBiWzBdIC0gYVswXTsKICAgICAgdmFyIHkgPSBiWzFdIC0gYVsxXTsKICAgICAgdmFyIHogPSBiWzJdIC0gYVsyXTsKICAgICAgdmFyIHcgPSBiWzNdIC0gYVszXTsKICAgICAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeiwgdyk7CiAgICB9CiAgICBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UyKGEsIGIpIHsKICAgICAgdmFyIHggPSBiWzBdIC0gYVswXTsKICAgICAgdmFyIHkgPSBiWzFdIC0gYVsxXTsKICAgICAgdmFyIHogPSBiWzJdIC0gYVsyXTsKICAgICAgdmFyIHcgPSBiWzNdIC0gYVszXTsKICAgICAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3OwogICAgfQogICAgZnVuY3Rpb24gbGVuZ3RoMihhKSB7CiAgICAgIHZhciB4ID0gYVswXTsKICAgICAgdmFyIHkgPSBhWzFdOwogICAgICB2YXIgeiA9IGFbMl07CiAgICAgIHZhciB3ID0gYVszXTsKICAgICAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeiwgdyk7CiAgICB9CiAgICBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoMihhKSB7CiAgICAgIHZhciB4ID0gYVswXTsKICAgICAgdmFyIHkgPSBhWzFdOwogICAgICB2YXIgeiA9IGFbMl07CiAgICAgIHZhciB3ID0gYVszXTsKICAgICAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3OwogICAgfQogICAgZnVuY3Rpb24gbmVnYXRlMihvdXQsIGEpIHsKICAgICAgb3V0WzBdID0gLWFbMF07CiAgICAgIG91dFsxXSA9IC1hWzFdOwogICAgICBvdXRbMl0gPSAtYVsyXTsKICAgICAgb3V0WzNdID0gLWFbM107CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBpbnZlcnNlMihvdXQsIGEpIHsKICAgICAgb3V0WzBdID0gMSAvIGFbMF07CiAgICAgIG91dFsxXSA9IDEgLyBhWzFdOwogICAgICBvdXRbMl0gPSAxIC8gYVsyXTsKICAgICAgb3V0WzNdID0gMSAvIGFbM107CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBub3JtYWxpemUyKG91dCwgYSkgewogICAgICB2YXIgeCA9IGFbMF07CiAgICAgIHZhciB5ID0gYVsxXTsKICAgICAgdmFyIHogPSBhWzJdOwogICAgICB2YXIgdyA9IGFbM107CiAgICAgIHZhciBsZW40ID0geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7CiAgICAgIGlmIChsZW40ID4gMCkgewogICAgICAgIGxlbjQgPSAxIC8gTWF0aC5zcXJ0KGxlbjQpOwogICAgICB9CiAgICAgIG91dFswXSA9IHggKiBsZW40OwogICAgICBvdXRbMV0gPSB5ICogbGVuNDsKICAgICAgb3V0WzJdID0geiAqIGxlbjQ7CiAgICAgIG91dFszXSA9IHcgKiBsZW40OwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZG90MihhLCBiKSB7CiAgICAgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl0gKyBhWzNdICogYlszXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyb3NzMihvdXQsIHUsIHYsIHcpIHsKICAgICAgdmFyIEEgPSB2WzBdICogd1sxXSAtIHZbMV0gKiB3WzBdLCBCID0gdlswXSAqIHdbMl0gLSB2WzJdICogd1swXSwgQyA9IHZbMF0gKiB3WzNdIC0gdlszXSAqIHdbMF0sIEQgPSB2WzFdICogd1syXSAtIHZbMl0gKiB3WzFdLCBFID0gdlsxXSAqIHdbM10gLSB2WzNdICogd1sxXSwgRiA9IHZbMl0gKiB3WzNdIC0gdlszXSAqIHdbMl07CiAgICAgIHZhciBHID0gdVswXTsKICAgICAgdmFyIEggPSB1WzFdOwogICAgICB2YXIgSSA9IHVbMl07CiAgICAgIHZhciBKID0gdVszXTsKICAgICAgb3V0WzBdID0gSCAqIEYgLSBJICogRSArIEogKiBEOwogICAgICBvdXRbMV0gPSAtKEcgKiBGKSArIEkgKiBDIC0gSiAqIEI7CiAgICAgIG91dFsyXSA9IEcgKiBFIC0gSCAqIEMgKyBKICogQTsKICAgICAgb3V0WzNdID0gLShHICogRCkgKyBIICogQiAtIEkgKiBBOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gbGVycDIob3V0LCBhLCBiLCB0KSB7CiAgICAgIHZhciBheCA9IGFbMF07CiAgICAgIHZhciBheSA9IGFbMV07CiAgICAgIHZhciBheiA9IGFbMl07CiAgICAgIHZhciBhdyA9IGFbM107CiAgICAgIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpOwogICAgICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTsKICAgICAgb3V0WzJdID0gYXogKyB0ICogKGJbMl0gLSBheik7CiAgICAgIG91dFszXSA9IGF3ICsgdCAqIChiWzNdIC0gYXcpOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gcmFuZG9tMihvdXQsIHNjYWxlNikgewogICAgICBzY2FsZTYgPSBzY2FsZTYgfHwgMTsKICAgICAgdmFyIHYxLCB2MiwgdjMsIHY0OwogICAgICB2YXIgczEsIHMyOwogICAgICBkbyB7CiAgICAgICAgdjEgPSBSQU5ET00oKSAqIDIgLSAxOwogICAgICAgIHYyID0gUkFORE9NKCkgKiAyIC0gMTsKICAgICAgICBzMSA9IHYxICogdjEgKyB2MiAqIHYyOwogICAgICB9IHdoaWxlIChzMSA+PSAxKTsKICAgICAgZG8gewogICAgICAgIHYzID0gUkFORE9NKCkgKiAyIC0gMTsKICAgICAgICB2NCA9IFJBTkRPTSgpICogMiAtIDE7CiAgICAgICAgczIgPSB2MyAqIHYzICsgdjQgKiB2NDsKICAgICAgfSB3aGlsZSAoczIgPj0gMSk7CiAgICAgIHZhciBkID0gTWF0aC5zcXJ0KCgxIC0gczEpIC8gczIpOwogICAgICBvdXRbMF0gPSBzY2FsZTYgKiB2MTsKICAgICAgb3V0WzFdID0gc2NhbGU2ICogdjI7CiAgICAgIG91dFsyXSA9IHNjYWxlNiAqIHYzICogZDsKICAgICAgb3V0WzNdID0gc2NhbGU2ICogdjQgKiBkOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gdHJhbnNmb3JtTWF0NDIob3V0LCBhLCBtKSB7CiAgICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLCB3ID0gYVszXTsKICAgICAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0gKiB3OwogICAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSAqIHc7CiAgICAgIG91dFsyXSA9IG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSAqIHc7CiAgICAgIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XSAqIHc7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1RdWF0MihvdXQsIGEsIHEpIHsKICAgICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl07CiAgICAgIHZhciBxeCA9IHFbMF0sIHF5ID0gcVsxXSwgcXogPSBxWzJdLCBxdyA9IHFbM107CiAgICAgIHZhciBpeCA9IHF3ICogeCArIHF5ICogeiAtIHF6ICogeTsKICAgICAgdmFyIGl5ID0gcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6OwogICAgICB2YXIgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHg7CiAgICAgIHZhciBpdyA9IC1xeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7CiAgICAgIG91dFswXSA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7CiAgICAgIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7CiAgICAgIG91dFsyXSA9IGl6ICogcXcgKyBpdyAqIC1xeiArIGl4ICogLXF5IC0gaXkgKiAtcXg7CiAgICAgIG91dFszXSA9IGFbM107CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiB6ZXJvMihvdXQpIHsKICAgICAgb3V0WzBdID0gMDsKICAgICAgb3V0WzFdID0gMDsKICAgICAgb3V0WzJdID0gMDsKICAgICAgb3V0WzNdID0gMDsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHN0cjQoYSkgewogICAgICByZXR1cm4gInZlYzQoIiArIGFbMF0gKyAiLCAiICsgYVsxXSArICIsICIgKyBhWzJdICsgIiwgIiArIGFbM10gKyAiKSI7CiAgICB9CiAgICBmdW5jdGlvbiBleGFjdEVxdWFsczQoYSwgYikgewogICAgICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXTsKICAgIH0KICAgIGZ1bmN0aW9uIGVxdWFsczQoYSwgYikgewogICAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdOwogICAgICB2YXIgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdOwogICAgICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKTsKICAgIH0KICAgIHZhciBzdWI0ID0gc3VidHJhY3Q0OwogICAgdmFyIG11bDQgPSBtdWx0aXBseTQ7CiAgICB2YXIgZGl2MiA9IGRpdmlkZTI7CiAgICB2YXIgZGlzdDIgPSBkaXN0YW5jZTI7CiAgICB2YXIgc3FyRGlzdDIgPSBzcXVhcmVkRGlzdGFuY2UyOwogICAgdmFyIGxlbjIgPSBsZW5ndGgyOwogICAgdmFyIHNxckxlbjIgPSBzcXVhcmVkTGVuZ3RoMjsKICAgIHZhciBmb3JFYWNoMiA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdmVjID0gY3JlYXRlNCgpOwogICAgICByZXR1cm4gZnVuY3Rpb24oYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7CiAgICAgICAgdmFyIGksIGw7CiAgICAgICAgaWYgKCFzdHJpZGUpIHsKICAgICAgICAgIHN0cmlkZSA9IDQ7CiAgICAgICAgfQogICAgICAgIGlmICghb2Zmc2V0KSB7CiAgICAgICAgICBvZmZzZXQgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoY291bnQpIHsKICAgICAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsID0gYS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7CiAgICAgICAgICB2ZWNbMF0gPSBhW2ldOwogICAgICAgICAgdmVjWzFdID0gYVtpICsgMV07CiAgICAgICAgICB2ZWNbMl0gPSBhW2kgKyAyXTsKICAgICAgICAgIHZlY1szXSA9IGFbaSArIDNdOwogICAgICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7CiAgICAgICAgICBhW2ldID0gdmVjWzBdOwogICAgICAgICAgYVtpICsgMV0gPSB2ZWNbMV07CiAgICAgICAgICBhW2kgKyAyXSA9IHZlY1syXTsKICAgICAgICAgIGFbaSArIDNdID0gdmVjWzNdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYTsKICAgICAgfTsKICAgIH0oKTsKCiAgICAvLyBub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9xdWF0LmpzCiAgICBmdW5jdGlvbiBjcmVhdGU1KCkgewogICAgICB2YXIgb3V0ID0gbmV3IEFSUkFZX1RZUEUoNCk7CiAgICAgIGlmIChBUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkgewogICAgICAgIG91dFswXSA9IDA7CiAgICAgICAgb3V0WzFdID0gMDsKICAgICAgICBvdXRbMl0gPSAwOwogICAgICB9CiAgICAgIG91dFszXSA9IDE7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBpZGVudGl0eTMob3V0KSB7CiAgICAgIG91dFswXSA9IDA7CiAgICAgIG91dFsxXSA9IDA7CiAgICAgIG91dFsyXSA9IDA7CiAgICAgIG91dFszXSA9IDE7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzZXRBeGlzQW5nbGUob3V0LCBheGlzLCByYWQpIHsKICAgICAgcmFkID0gcmFkICogMC41OwogICAgICB2YXIgcyA9IE1hdGguc2luKHJhZCk7CiAgICAgIG91dFswXSA9IHMgKiBheGlzWzBdOwogICAgICBvdXRbMV0gPSBzICogYXhpc1sxXTsKICAgICAgb3V0WzJdID0gcyAqIGF4aXNbMl07CiAgICAgIG91dFszXSA9IE1hdGguY29zKHJhZCk7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRBeGlzQW5nbGUob3V0X2F4aXMsIHEpIHsKICAgICAgdmFyIHJhZCA9IE1hdGguYWNvcyhxWzNdKSAqIDI7CiAgICAgIHZhciBzID0gTWF0aC5zaW4ocmFkIC8gMik7CiAgICAgIGlmIChzID4gRVBTSUxPTikgewogICAgICAgIG91dF9heGlzWzBdID0gcVswXSAvIHM7CiAgICAgICAgb3V0X2F4aXNbMV0gPSBxWzFdIC8gczsKICAgICAgICBvdXRfYXhpc1syXSA9IHFbMl0gLyBzOwogICAgICB9IGVsc2UgewogICAgICAgIG91dF9heGlzWzBdID0gMTsKICAgICAgICBvdXRfYXhpc1sxXSA9IDA7CiAgICAgICAgb3V0X2F4aXNbMl0gPSAwOwogICAgICB9CiAgICAgIHJldHVybiByYWQ7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRBbmdsZShhLCBiKSB7CiAgICAgIHZhciBkb3Rwcm9kdWN0ID0gZG90MyhhLCBiKTsKICAgICAgcmV0dXJuIE1hdGguYWNvcygyICogZG90cHJvZHVjdCAqIGRvdHByb2R1Y3QgLSAxKTsKICAgIH0KICAgIGZ1bmN0aW9uIG11bHRpcGx5NShvdXQsIGEsIGIpIHsKICAgICAgdmFyIGF4ID0gYVswXSwgYXkgPSBhWzFdLCBheiA9IGFbMl0sIGF3ID0gYVszXTsKICAgICAgdmFyIGJ4ID0gYlswXSwgYnkgPSBiWzFdLCBieiA9IGJbMl0sIGJ3ID0gYlszXTsKICAgICAgb3V0WzBdID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieTsKICAgICAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBiejsKICAgICAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDsKICAgICAgb3V0WzNdID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHJvdGF0ZVgzKG91dCwgYSwgcmFkKSB7CiAgICAgIHJhZCAqPSAwLjU7CiAgICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM107CiAgICAgIHZhciBieCA9IE1hdGguc2luKHJhZCksIGJ3ID0gTWF0aC5jb3MocmFkKTsKICAgICAgb3V0WzBdID0gYXggKiBidyArIGF3ICogYng7CiAgICAgIG91dFsxXSA9IGF5ICogYncgKyBheiAqIGJ4OwogICAgICBvdXRbMl0gPSBheiAqIGJ3IC0gYXkgKiBieDsKICAgICAgb3V0WzNdID0gYXcgKiBidyAtIGF4ICogYng7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiByb3RhdGVZMyhvdXQsIGEsIHJhZCkgewogICAgICByYWQgKj0gMC41OwogICAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdOwogICAgICB2YXIgYnkgPSBNYXRoLnNpbihyYWQpLCBidyA9IE1hdGguY29zKHJhZCk7CiAgICAgIG91dFswXSA9IGF4ICogYncgLSBheiAqIGJ5OwogICAgICBvdXRbMV0gPSBheSAqIGJ3ICsgYXcgKiBieTsKICAgICAgb3V0WzJdID0gYXogKiBidyArIGF4ICogYnk7CiAgICAgIG91dFszXSA9IGF3ICogYncgLSBheSAqIGJ5OwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gcm90YXRlWjMob3V0LCBhLCByYWQpIHsKICAgICAgcmFkICo9IDAuNTsKICAgICAgdmFyIGF4ID0gYVswXSwgYXkgPSBhWzFdLCBheiA9IGFbMl0sIGF3ID0gYVszXTsKICAgICAgdmFyIGJ6ID0gTWF0aC5zaW4ocmFkKSwgYncgPSBNYXRoLmNvcyhyYWQpOwogICAgICBvdXRbMF0gPSBheCAqIGJ3ICsgYXkgKiBiejsKICAgICAgb3V0WzFdID0gYXkgKiBidyAtIGF4ICogYno7CiAgICAgIG91dFsyXSA9IGF6ICogYncgKyBhdyAqIGJ6OwogICAgICBvdXRbM10gPSBhdyAqIGJ3IC0gYXogKiBiejsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZVcob3V0LCBhKSB7CiAgICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdOwogICAgICBvdXRbMF0gPSB4OwogICAgICBvdXRbMV0gPSB5OwogICAgICBvdXRbMl0gPSB6OwogICAgICBvdXRbM10gPSBNYXRoLnNxcnQoTWF0aC5hYnMoMSAtIHggKiB4IC0geSAqIHkgLSB6ICogeikpOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZXhwKG91dCwgYSkgewogICAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXSwgdyA9IGFbM107CiAgICAgIHZhciByID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7CiAgICAgIHZhciBldCA9IE1hdGguZXhwKHcpOwogICAgICB2YXIgcyA9IHIgPiAwID8gZXQgKiBNYXRoLnNpbihyKSAvIHIgOiAwOwogICAgICBvdXRbMF0gPSB4ICogczsKICAgICAgb3V0WzFdID0geSAqIHM7CiAgICAgIG91dFsyXSA9IHogKiBzOwogICAgICBvdXRbM10gPSBldCAqIE1hdGguY29zKHIpOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gbG4ob3V0LCBhKSB7CiAgICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLCB3ID0gYVszXTsKICAgICAgdmFyIHIgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KTsKICAgICAgdmFyIHQgPSByID4gMCA/IE1hdGguYXRhbjIociwgdykgLyByIDogMDsKICAgICAgb3V0WzBdID0geCAqIHQ7CiAgICAgIG91dFsxXSA9IHkgKiB0OwogICAgICBvdXRbMl0gPSB6ICogdDsKICAgICAgb3V0WzNdID0gMC41ICogTWF0aC5sb2coeCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHcpOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gcG93KG91dCwgYSwgYikgewogICAgICBsbihvdXQsIGEpOwogICAgICBzY2FsZTUob3V0LCBvdXQsIGIpOwogICAgICBleHAob3V0LCBvdXQpOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gc2xlcnAob3V0LCBhLCBiLCB0KSB7CiAgICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM107CiAgICAgIHZhciBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdLCBidyA9IGJbM107CiAgICAgIHZhciBvbWVnYSwgY29zb20sIHNpbm9tLCBzY2FsZTAsIHNjYWxlMTsKICAgICAgY29zb20gPSBheCAqIGJ4ICsgYXkgKiBieSArIGF6ICogYnogKyBhdyAqIGJ3OwogICAgICBpZiAoY29zb20gPCAwKSB7CiAgICAgICAgY29zb20gPSAtY29zb207CiAgICAgICAgYnggPSAtYng7CiAgICAgICAgYnkgPSAtYnk7CiAgICAgICAgYnogPSAtYno7CiAgICAgICAgYncgPSAtYnc7CiAgICAgIH0KICAgICAgaWYgKDEgLSBjb3NvbSA+IEVQU0lMT04pIHsKICAgICAgICBvbWVnYSA9IE1hdGguYWNvcyhjb3NvbSk7CiAgICAgICAgc2lub20gPSBNYXRoLnNpbihvbWVnYSk7CiAgICAgICAgc2NhbGUwID0gTWF0aC5zaW4oKDEgLSB0KSAqIG9tZWdhKSAvIHNpbm9tOwogICAgICAgIHNjYWxlMSA9IE1hdGguc2luKHQgKiBvbWVnYSkgLyBzaW5vbTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzY2FsZTAgPSAxIC0gdDsKICAgICAgICBzY2FsZTEgPSB0OwogICAgICB9CiAgICAgIG91dFswXSA9IHNjYWxlMCAqIGF4ICsgc2NhbGUxICogYng7CiAgICAgIG91dFsxXSA9IHNjYWxlMCAqIGF5ICsgc2NhbGUxICogYnk7CiAgICAgIG91dFsyXSA9IHNjYWxlMCAqIGF6ICsgc2NhbGUxICogYno7CiAgICAgIG91dFszXSA9IHNjYWxlMCAqIGF3ICsgc2NhbGUxICogYnc7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiByYW5kb20zKG91dCkgewogICAgICB2YXIgdTEgPSBSQU5ET00oKTsKICAgICAgdmFyIHUyID0gUkFORE9NKCk7CiAgICAgIHZhciB1MyA9IFJBTkRPTSgpOwogICAgICB2YXIgc3FydDFNaW51c1UxID0gTWF0aC5zcXJ0KDEgLSB1MSk7CiAgICAgIHZhciBzcXJ0VTEgPSBNYXRoLnNxcnQodTEpOwogICAgICBvdXRbMF0gPSBzcXJ0MU1pbnVzVTEgKiBNYXRoLnNpbigyICogTWF0aC5QSSAqIHUyKTsKICAgICAgb3V0WzFdID0gc3FydDFNaW51c1UxICogTWF0aC5jb3MoMiAqIE1hdGguUEkgKiB1Mik7CiAgICAgIG91dFsyXSA9IHNxcnRVMSAqIE1hdGguc2luKDIgKiBNYXRoLlBJICogdTMpOwogICAgICBvdXRbM10gPSBzcXJ0VTEgKiBNYXRoLmNvcygyICogTWF0aC5QSSAqIHUzKTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGludmVydDMob3V0LCBhKSB7CiAgICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM107CiAgICAgIHZhciBkb3Q0ID0gYTAgKiBhMCArIGExICogYTEgKyBhMiAqIGEyICsgYTMgKiBhMzsKICAgICAgdmFyIGludkRvdCA9IGRvdDQgPyAxIC8gZG90NCA6IDA7CiAgICAgIG91dFswXSA9IC1hMCAqIGludkRvdDsKICAgICAgb3V0WzFdID0gLWExICogaW52RG90OwogICAgICBvdXRbMl0gPSAtYTIgKiBpbnZEb3Q7CiAgICAgIG91dFszXSA9IGEzICogaW52RG90OwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gY29uanVnYXRlKG91dCwgYSkgewogICAgICBvdXRbMF0gPSAtYVswXTsKICAgICAgb3V0WzFdID0gLWFbMV07CiAgICAgIG91dFsyXSA9IC1hWzJdOwogICAgICBvdXRbM10gPSBhWzNdOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZnJvbU1hdDMob3V0LCBtKSB7CiAgICAgIHZhciBmVHJhY2UgPSBtWzBdICsgbVs0XSArIG1bOF07CiAgICAgIHZhciBmUm9vdDsKICAgICAgaWYgKGZUcmFjZSA+IDApIHsKICAgICAgICBmUm9vdCA9IE1hdGguc3FydChmVHJhY2UgKyAxKTsKICAgICAgICBvdXRbM10gPSAwLjUgKiBmUm9vdDsKICAgICAgICBmUm9vdCA9IDAuNSAvIGZSb290OwogICAgICAgIG91dFswXSA9IChtWzVdIC0gbVs3XSkgKiBmUm9vdDsKICAgICAgICBvdXRbMV0gPSAobVs2XSAtIG1bMl0pICogZlJvb3Q7CiAgICAgICAgb3V0WzJdID0gKG1bMV0gLSBtWzNdKSAqIGZSb290OwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBpID0gMDsKICAgICAgICBpZiAobVs0XSA+IG1bMF0pCiAgICAgICAgICBpID0gMTsKICAgICAgICBpZiAobVs4XSA+IG1baSAqIDMgKyBpXSkKICAgICAgICAgIGkgPSAyOwogICAgICAgIHZhciBqID0gKGkgKyAxKSAlIDM7CiAgICAgICAgdmFyIGsgPSAoaSArIDIpICUgMzsKICAgICAgICBmUm9vdCA9IE1hdGguc3FydChtW2kgKiAzICsgaV0gLSBtW2ogKiAzICsgal0gLSBtW2sgKiAzICsga10gKyAxKTsKICAgICAgICBvdXRbaV0gPSAwLjUgKiBmUm9vdDsKICAgICAgICBmUm9vdCA9IDAuNSAvIGZSb290OwogICAgICAgIG91dFszXSA9IChtW2ogKiAzICsga10gLSBtW2sgKiAzICsgal0pICogZlJvb3Q7CiAgICAgICAgb3V0W2pdID0gKG1baiAqIDMgKyBpXSArIG1baSAqIDMgKyBqXSkgKiBmUm9vdDsKICAgICAgICBvdXRba10gPSAobVtrICogMyArIGldICsgbVtpICogMyArIGtdKSAqIGZSb290OwogICAgICB9CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBmcm9tRXVsZXIob3V0LCB4LCB5LCB6KSB7CiAgICAgIHZhciBoYWxmVG9SYWQgPSAwLjUgKiBNYXRoLlBJIC8gMTgwOwogICAgICB4ICo9IGhhbGZUb1JhZDsKICAgICAgeSAqPSBoYWxmVG9SYWQ7CiAgICAgIHogKj0gaGFsZlRvUmFkOwogICAgICB2YXIgc3ggPSBNYXRoLnNpbih4KTsKICAgICAgdmFyIGN4ID0gTWF0aC5jb3MoeCk7CiAgICAgIHZhciBzeSA9IE1hdGguc2luKHkpOwogICAgICB2YXIgY3kgPSBNYXRoLmNvcyh5KTsKICAgICAgdmFyIHN6ID0gTWF0aC5zaW4oeik7CiAgICAgIHZhciBjeiA9IE1hdGguY29zKHopOwogICAgICBvdXRbMF0gPSBzeCAqIGN5ICogY3ogLSBjeCAqIHN5ICogc3o7CiAgICAgIG91dFsxXSA9IGN4ICogc3kgKiBjeiArIHN4ICogY3kgKiBzejsKICAgICAgb3V0WzJdID0gY3ggKiBjeSAqIHN6IC0gc3ggKiBzeSAqIGN6OwogICAgICBvdXRbM10gPSBjeCAqIGN5ICogY3ogKyBzeCAqIHN5ICogc3o7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdHI1KGEpIHsKICAgICAgcmV0dXJuICJxdWF0KCIgKyBhWzBdICsgIiwgIiArIGFbMV0gKyAiLCAiICsgYVsyXSArICIsICIgKyBhWzNdICsgIikiOwogICAgfQogICAgdmFyIGNsb25lNSA9IGNsb25lNDsKICAgIHZhciBmcm9tVmFsdWVzNSA9IGZyb21WYWx1ZXM0OwogICAgdmFyIGNvcHk1ID0gY29weTQ7CiAgICB2YXIgc2V0NSA9IHNldDQ7CiAgICB2YXIgYWRkNSA9IGFkZDQ7CiAgICB2YXIgbXVsNSA9IG11bHRpcGx5NTsKICAgIHZhciBzY2FsZTUgPSBzY2FsZTQ7CiAgICB2YXIgZG90MyA9IGRvdDI7CiAgICB2YXIgbGVycDMgPSBsZXJwMjsKICAgIHZhciBsZW5ndGgzID0gbGVuZ3RoMjsKICAgIHZhciBsZW4zID0gbGVuZ3RoMzsKICAgIHZhciBzcXVhcmVkTGVuZ3RoMyA9IHNxdWFyZWRMZW5ndGgyOwogICAgdmFyIHNxckxlbjMgPSBzcXVhcmVkTGVuZ3RoMzsKICAgIHZhciBub3JtYWxpemUzID0gbm9ybWFsaXplMjsKICAgIHZhciBleGFjdEVxdWFsczUgPSBleGFjdEVxdWFsczQ7CiAgICB2YXIgZXF1YWxzNSA9IGVxdWFsczQ7CiAgICB2YXIgcm90YXRpb25UbyA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdG1wdmVjMyA9IGNyZWF0ZTMoKTsKICAgICAgdmFyIHhVbml0VmVjMyA9IGZyb21WYWx1ZXMzKDEsIDAsIDApOwogICAgICB2YXIgeVVuaXRWZWMzID0gZnJvbVZhbHVlczMoMCwgMSwgMCk7CiAgICAgIHJldHVybiBmdW5jdGlvbihvdXQsIGEsIGIpIHsKICAgICAgICB2YXIgZG90NCA9IGRvdChhLCBiKTsKICAgICAgICBpZiAoZG90NCA8IC0wLjk5OTk5OSkgewogICAgICAgICAgY3Jvc3ModG1wdmVjMywgeFVuaXRWZWMzLCBhKTsKICAgICAgICAgIGlmIChsZW4odG1wdmVjMykgPCAxZS02KQogICAgICAgICAgICBjcm9zcyh0bXB2ZWMzLCB5VW5pdFZlYzMsIGEpOwogICAgICAgICAgbm9ybWFsaXplKHRtcHZlYzMsIHRtcHZlYzMpOwogICAgICAgICAgc2V0QXhpc0FuZ2xlKG91dCwgdG1wdmVjMywgTWF0aC5QSSk7CiAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgIH0gZWxzZSBpZiAoZG90NCA+IDAuOTk5OTk5KSB7CiAgICAgICAgICBvdXRbMF0gPSAwOwogICAgICAgICAgb3V0WzFdID0gMDsKICAgICAgICAgIG91dFsyXSA9IDA7CiAgICAgICAgICBvdXRbM10gPSAxOwogICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3Jvc3ModG1wdmVjMywgYSwgYik7CiAgICAgICAgICBvdXRbMF0gPSB0bXB2ZWMzWzBdOwogICAgICAgICAgb3V0WzFdID0gdG1wdmVjM1sxXTsKICAgICAgICAgIG91dFsyXSA9IHRtcHZlYzNbMl07CiAgICAgICAgICBvdXRbM10gPSAxICsgZG90NDsKICAgICAgICAgIHJldHVybiBub3JtYWxpemUzKG91dCwgb3V0KTsKICAgICAgICB9CiAgICAgIH07CiAgICB9KCk7CiAgICB2YXIgc3FsZXJwID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB0ZW1wMSA9IGNyZWF0ZTUoKTsKICAgICAgdmFyIHRlbXAyID0gY3JlYXRlNSgpOwogICAgICByZXR1cm4gZnVuY3Rpb24ob3V0LCBhLCBiLCBjLCBkLCB0KSB7CiAgICAgICAgc2xlcnAodGVtcDEsIGEsIGQsIHQpOwogICAgICAgIHNsZXJwKHRlbXAyLCBiLCBjLCB0KTsKICAgICAgICBzbGVycChvdXQsIHRlbXAxLCB0ZW1wMiwgMiAqIHQgKiAoMSAtIHQpKTsKICAgICAgICByZXR1cm4gb3V0OwogICAgICB9OwogICAgfSgpOwogICAgdmFyIHNldEF4ZXMgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIG1hdHIgPSBjcmVhdGUoKTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG91dCwgdmlldywgcmlnaHQsIHVwKSB7CiAgICAgICAgbWF0clswXSA9IHJpZ2h0WzBdOwogICAgICAgIG1hdHJbM10gPSByaWdodFsxXTsKICAgICAgICBtYXRyWzZdID0gcmlnaHRbMl07CiAgICAgICAgbWF0clsxXSA9IHVwWzBdOwogICAgICAgIG1hdHJbNF0gPSB1cFsxXTsKICAgICAgICBtYXRyWzddID0gdXBbMl07CiAgICAgICAgbWF0clsyXSA9IC12aWV3WzBdOwogICAgICAgIG1hdHJbNV0gPSAtdmlld1sxXTsKICAgICAgICBtYXRyWzhdID0gLXZpZXdbMl07CiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZTMob3V0LCBmcm9tTWF0MyhvdXQsIG1hdHIpKTsKICAgICAgfTsKICAgIH0oKTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3V0aWwvYXJyYXkudHMKICAgIGZ1bmN0aW9uIGFycmF5c0VxdWFsKGEsIGIpIHsKICAgICAgY29uc3QgbGVuZ3RoNCA9IGEubGVuZ3RoOwogICAgICBpZiAoYi5sZW5ndGggIT09IGxlbmd0aDQpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDQ7ICsraSkgewogICAgICAgIGlmIChhW2ldICE9PSBiW2ldKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdXRpbC9nZW9tLnRzCiAgICBtYXQ0X2V4cG9ydHMuY3JlYXRlKCk7CiAgICBbCiAgICAgIHZlYzNfZXhwb3J0cy5mcm9tVmFsdWVzKDEsIDAsIDApLAogICAgICB2ZWMzX2V4cG9ydHMuZnJvbVZhbHVlcygwLCAxLCAwKSwKICAgICAgdmVjM19leHBvcnRzLmZyb21WYWx1ZXMoMCwgMCwgMSkKICAgIF07CiAgICB2YXIga1plcm9WZWMgPSB2ZWMzX2V4cG9ydHMuZnJvbVZhbHVlcygwLCAwLCAwKTsKICAgIHZlYzRfZXhwb3J0cy5mcm9tVmFsdWVzKDAsIDAsIDAsIDApOwogICAgdmFyIGtPbmVWZWMgPSB2ZWMzX2V4cG9ydHMuZnJvbVZhbHVlcygxLCAxLCAxKTsKICAgIHZhciBrSW5maW5pdHlWZWMgPSB2ZWMzX2V4cG9ydHMuZnJvbVZhbHVlcyhJbmZpbml0eSwgSW5maW5pdHksIEluZmluaXR5KTsKICAgIHF1YXRfZXhwb3J0cy5jcmVhdGUoKTsKICAgIGZ1bmN0aW9uIHByb2QzKHgpIHsKICAgICAgcmV0dXJuIHhbMF0gKiB4WzFdICogeFsyXTsKICAgIH0KICAgIGZ1bmN0aW9uIHZlYzNLZXkoeCkgewogICAgICByZXR1cm4gYCR7eFswXX0sJHt4WzFdfSwke3hbMl19YDsKICAgIH0KICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVZlY3RvckJ5TWF0NChvdXQsIGEsIG0pIHsKICAgICAgbGV0IHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl07CiAgICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogejsKICAgICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6OwogICAgICBvdXRbMl0gPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6OwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gdHJhbnNmb3JtVmVjdG9yQnlNYXQ0VHJhbnNwb3NlKG91dCwgYSwgbSkgewogICAgICBsZXQgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXTsKICAgICAgb3V0WzBdID0gbVswXSAqIHggKyBtWzFdICogeSArIG1bMl0gKiB6OwogICAgICBvdXRbMV0gPSBtWzRdICogeCArIG1bNV0gKiB5ICsgbVs2XSAqIHo7CiAgICAgIG91dFsyXSA9IG1bOF0gKiB4ICsgbVs5XSAqIHkgKyBtWzEwXSAqIHo7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiB0cmFuc2xhdGlvblJvdGF0aW9uU2NhbGVaUmVmbGVjdGlvblRvTWF0NChvdXQsIHRyYW5zbGF0aW9uLCByb3RhdGlvbiwgc2NhbGU2LCB6UmVmbGVjdGlvbikgewogICAgICBjb25zdCB0ZW1wID0gb3V0OwogICAgICBvdXRbMF0gPSBzY2FsZTZbMF07CiAgICAgIG91dFsxXSA9IHNjYWxlNlsxXTsKICAgICAgb3V0WzJdID0gc2NhbGU2WzJdICogelJlZmxlY3Rpb247CiAgICAgIHJldHVybiBtYXQ0X2V4cG9ydHMuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZShvdXQsIHJvdGF0aW9uLCB0cmFuc2xhdGlvbiwgdGVtcCk7CiAgICB9CiAgICBmdW5jdGlvbiBtYXQzRnJvbU1hdDQob3V0LCBtKSB7CiAgICAgIGNvbnN0IG0wMCA9IG1bMF0sIG0wMSA9IG1bMV0sIG0wMiA9IG1bMl0sIG0xMCA9IG1bNF0sIG0xMSA9IG1bNV0sIG0xMiA9IG1bNl0sIG0yMCA9IG1bOF0sIG0yMSA9IG1bOV0sIG0yMiA9IG1bMTBdOwogICAgICBvdXRbMF0gPSBtMDA7CiAgICAgIG91dFsxXSA9IG0wMTsKICAgICAgb3V0WzJdID0gbTAyOwogICAgICBvdXRbM10gPSBtMTA7CiAgICAgIG91dFs0XSA9IG0xMTsKICAgICAgb3V0WzVdID0gbTEyOwogICAgICBvdXRbNl0gPSBtMjA7CiAgICAgIG91dFs3XSA9IG0yMTsKICAgICAgb3V0WzhdID0gbTIyOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZ2V0RnJ1c3RydW1QbGFuZXMob3V0LCBtKSB7CiAgICAgIGNvbnN0IG0wMCA9IG1bMF0sIG0xMCA9IG1bMV0sIG0yMCA9IG1bMl0sIG0zMCA9IG1bM10sIG0wMSA9IG1bNF0sIG0xMSA9IG1bNV0sIG0yMSA9IG1bNl0sIG0zMSA9IG1bN10sIG0wMiA9IG1bOF0sIG0xMiA9IG1bOV0sIG0yMiA9IG1bMTBdLCBtMzIgPSBtWzExXSwgbTAzID0gbVsxMl0sIG0xMyA9IG1bMTNdLCBtMjMgPSBtWzE0XSwgbTMzID0gbVsxNV07CiAgICAgIG91dFswXSA9IG0zMCArIG0wMDsKICAgICAgb3V0WzFdID0gbTMxICsgbTAxOwogICAgICBvdXRbMl0gPSBtMzIgKyBtMDI7CiAgICAgIG91dFszXSA9IG0zMyArIG0wMzsKICAgICAgb3V0WzRdID0gbTMwIC0gbTAwOwogICAgICBvdXRbNV0gPSBtMzEgLSBtMDE7CiAgICAgIG91dFs2XSA9IG0zMiAtIG0wMjsKICAgICAgb3V0WzddID0gbTMzIC0gbTAzOwogICAgICBvdXRbOF0gPSBtMzAgKyBtMTA7CiAgICAgIG91dFs5XSA9IG0zMSArIG0xMTsKICAgICAgb3V0WzEwXSA9IG0zMiArIG0xMjsKICAgICAgb3V0WzExXSA9IG0zMyArIG0xMzsKICAgICAgb3V0WzEyXSA9IG0zMCAtIG0xMDsKICAgICAgb3V0WzEzXSA9IG0zMSAtIG0xMTsKICAgICAgb3V0WzE0XSA9IG0zMiAtIG0xMjsKICAgICAgb3V0WzE1XSA9IG0zMyAtIG0xMzsKICAgICAgY29uc3QgbmVhckEgPSBtMzAgKyBtMjA7CiAgICAgIGNvbnN0IG5lYXJCID0gbTMxICsgbTIxOwogICAgICBjb25zdCBuZWFyQyA9IG0zMiArIG0yMjsKICAgICAgY29uc3QgbmVhckQgPSBtMzMgKyBtMjM7CiAgICAgIGNvbnN0IGZhckEgPSBtMzAgLSBtMjA7CiAgICAgIGNvbnN0IGZhckIgPSBtMzEgLSBtMjE7CiAgICAgIGNvbnN0IGZhckMgPSBtMzIgLSBtMjI7CiAgICAgIGNvbnN0IGZhckQgPSBtMzMgLSBtMjM7CiAgICAgIGNvbnN0IG5lYXJOb3JtID0gTWF0aC5zcXJ0KG5lYXJBICoqIDIgKyBuZWFyQiAqKiAyICsgbmVhckMgKiogMik7CiAgICAgIG91dFsxNl0gPSBuZWFyQSAvIG5lYXJOb3JtOwogICAgICBvdXRbMTddID0gbmVhckIgLyBuZWFyTm9ybTsKICAgICAgb3V0WzE4XSA9IG5lYXJDIC8gbmVhck5vcm07CiAgICAgIG91dFsxOV0gPSBuZWFyRCAvIG5lYXJOb3JtOwogICAgICBjb25zdCBmYXJOb3JtID0gTWF0aC5zcXJ0KGZhckEgKiogMiArIGZhckIgKiogMiArIGZhckMgKiogMik7CiAgICAgIG91dFsyMF0gPSBmYXJBIC8gZmFyTm9ybTsKICAgICAgb3V0WzIxXSA9IGZhckIgLyBmYXJOb3JtOwogICAgICBvdXRbMjJdID0gZmFyQyAvIGZhck5vcm07CiAgICAgIG91dFsyM10gPSBmYXJEIC8gZmFyTm9ybTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzQUFCQlZpc2libGUoeExvd2VyLCB5TG93ZXIsIHpMb3dlciwgeFVwcGVyLCB5VXBwZXIsIHpVcHBlciwgY2xpcHBpbmdQbGFuZXMpIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyArK2kpIHsKICAgICAgICBjb25zdCBhID0gY2xpcHBpbmdQbGFuZXNbaSAqIDRdLCBiID0gY2xpcHBpbmdQbGFuZXNbaSAqIDQgKyAxXSwgYyA9IGNsaXBwaW5nUGxhbmVzW2kgKiA0ICsgMl0sIGQgPSBjbGlwcGluZ1BsYW5lc1tpICogNCArIDNdOwogICAgICAgIGNvbnN0IHN1bSA9IE1hdGgubWF4KGEgKiB4TG93ZXIsIGEgKiB4VXBwZXIpICsgTWF0aC5tYXgoYiAqIHlMb3dlciwgYiAqIHlVcHBlcikgKyBNYXRoLm1heChjICogekxvd2VyLCBjICogelVwcGVyKSArIGQ7CiAgICAgICAgaWYgKHN1bSA8IDApIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBpc0FBQkJJbnRlcnNlY3RpbmdQbGFuZSh4TG93ZXIsIHlMb3dlciwgekxvd2VyLCB4VXBwZXIsIHlVcHBlciwgelVwcGVyLCBjbGlwcGluZ1BsYW5lcykgewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgIGNvbnN0IGEgPSBjbGlwcGluZ1BsYW5lc1tpICogNF0sIGIgPSBjbGlwcGluZ1BsYW5lc1tpICogNCArIDFdLCBjID0gY2xpcHBpbmdQbGFuZXNbaSAqIDQgKyAyXSwgZCA9IGNsaXBwaW5nUGxhbmVzW2kgKiA0ICsgM107CiAgICAgICAgY29uc3Qgc3VtID0gTWF0aC5tYXgoYSAqIHhMb3dlciwgYSAqIHhVcHBlcikgKyBNYXRoLm1heChiICogeUxvd2VyLCBiICogeVVwcGVyKSArIE1hdGgubWF4KGMgKiB6TG93ZXIsIGMgKiB6VXBwZXIpICsgZDsKICAgICAgICBpZiAoc3VtIDwgMCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICB7CiAgICAgICAgY29uc3QgaSA9IDU7CiAgICAgICAgY29uc3QgYSA9IGNsaXBwaW5nUGxhbmVzW2kgKiA0XSwgYiA9IGNsaXBwaW5nUGxhbmVzW2kgKiA0ICsgMV0sIGMgPSBjbGlwcGluZ1BsYW5lc1tpICogNCArIDJdLCBkID0gY2xpcHBpbmdQbGFuZXNbaSAqIDQgKyAzXTsKICAgICAgICBjb25zdCBtYXhTdW0gPSBNYXRoLm1heChhICogeExvd2VyLCBhICogeFVwcGVyKSArIE1hdGgubWF4KGIgKiB5TG93ZXIsIGIgKiB5VXBwZXIpICsgTWF0aC5tYXgoYyAqIHpMb3dlciwgYyAqIHpVcHBlcik7CiAgICAgICAgY29uc3QgbWluU3VtID0gTWF0aC5taW4oYSAqIHhMb3dlciwgYSAqIHhVcHBlcikgKyBNYXRoLm1pbihiICogeUxvd2VyLCBiICogeVVwcGVyKSArIE1hdGgubWluKGMgKiB6TG93ZXIsIGMgKiB6VXBwZXIpOwogICAgICAgIGNvbnN0IGVwc2lsb24gPSBNYXRoLmFicyhkKSAqIDFlLTY7CiAgICAgICAgaWYgKG1pblN1bSA+IC1kICsgZXBzaWxvbiB8fCBtYXhTdW0gPCAtZCAtIGVwc2lsb24pCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRWaWV3RnJ1c3RydW1Wb2x1bWUocHJvamVjdGlvbk1hdCkgewogICAgICBpZiAocHJvamVjdGlvbk1hdFsxNV0gPT09IDEpIHsKICAgICAgICBjb25zdCBkZXB0aCA9IDIgLyBNYXRoLmFicyhwcm9qZWN0aW9uTWF0WzEwXSk7CiAgICAgICAgY29uc3Qgd2lkdGggPSAyIC8gTWF0aC5hYnMocHJvamVjdGlvbk1hdFswXSk7CiAgICAgICAgY29uc3QgaGVpZ2h0ID0gMiAvIE1hdGguYWJzKHByb2plY3Rpb25NYXRbNV0pOwogICAgICAgIHJldHVybiB3aWR0aCAqIGhlaWdodCAqIGRlcHRoOwogICAgICB9CiAgICAgIGNvbnN0IGEgPSBwcm9qZWN0aW9uTWF0WzEwXTsKICAgICAgY29uc3QgYiA9IHByb2plY3Rpb25NYXRbMTRdOwogICAgICBjb25zdCBuZWFyID0gMiAqIGIgLyAoMiAqIGEgLSAyKTsKICAgICAgY29uc3QgZmFyID0gKGEgLSAxKSAqIG5lYXIgLyAoYSArIDEpOwogICAgICBjb25zdCBiYXNlQXJlYSA9IDQgLyAocHJvamVjdGlvbk1hdFswXSAqIHByb2plY3Rpb25NYXRbNV0pOwogICAgICByZXR1cm4gYmFzZUFyZWEgLyAzICogKE1hdGguYWJzKGZhcikgKiogMyAtIE1hdGguYWJzKG5lYXIpICoqIDMpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0Vmlld0ZydXN0cnVtRGVwdGhSYW5nZShwcm9qZWN0aW9uTWF0KSB7CiAgICAgIGlmIChwcm9qZWN0aW9uTWF0WzE1XSA9PT0gMSkgewogICAgICAgIGNvbnN0IGRlcHRoMiA9IDIgLyBNYXRoLmFicyhwcm9qZWN0aW9uTWF0WzEwXSk7CiAgICAgICAgcmV0dXJuIGRlcHRoMjsKICAgICAgfQogICAgICBjb25zdCBhID0gcHJvamVjdGlvbk1hdFsxMF07CiAgICAgIGNvbnN0IGIgPSBwcm9qZWN0aW9uTWF0WzE0XTsKICAgICAgY29uc3QgbmVhciA9IDIgKiBiIC8gKDIgKiBhIC0gMik7CiAgICAgIGNvbnN0IGZhciA9IChhIC0gMSkgKiBuZWFyIC8gKGEgKyAxKTsKICAgICAgY29uc3QgZGVwdGggPSBNYXRoLmFicyhmYXIgLSBuZWFyKTsKICAgICAgcmV0dXJuIGRlcHRoOwogICAgfQogICAgdmVjM19leHBvcnRzLmNyZWF0ZSgpOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdXRpbC9qc29uLnRzCiAgICBmdW5jdGlvbiB2ZXJpZnlGbG9hdChvYmopIHsKICAgICAgbGV0IHQgPSB0eXBlb2Ygb2JqOwogICAgICBpZiAodCA9PT0gIm51bWJlciIgfHwgdCA9PT0gInN0cmluZyIpIHsKICAgICAgICBsZXQgeCA9IHBhcnNlRmxvYXQoIiIgKyBvYmopOwogICAgICAgIGlmICghTnVtYmVyLmlzTmFOKHgpKSB7CiAgICAgICAgICByZXR1cm4geDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBmbG9hdGluZy1wb2ludCBudW1iZXIsIGJ1dCByZWNlaXZlZDogJHtKU09OLnN0cmluZ2lmeShvYmopfS5gKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZlcmlmeUZpbml0ZUZsb2F0KG9iaikgewogICAgICBsZXQgeCA9IHZlcmlmeUZsb2F0KG9iaik7CiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoeCkpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGZpbml0ZSBmbG9hdGluZy1wb2ludCBudW1iZXIsIGJ1dCByZWNlaXZlZDogJHt4fS5gKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZlcmlmeUZpbml0ZU5vbk5lZ2F0aXZlRmxvYXQob2JqKSB7CiAgICAgIGxldCB4ID0gdmVyaWZ5RmxvYXQob2JqKTsKICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZSh4KSAmJiB4ID49IDApIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGZpbml0ZSBub24tbmVnYXRpdmUgZmxvYXRpbmctcG9pbnQgbnVtYmVyLCBidXQgcmVjZWl2ZWQ6ICR7eH0uYCk7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZUludFZlYyhvdXQsIG9iaikgewogICAgICBsZXQgbGVuZ3RoNCA9IG91dC5sZW5ndGg7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShvYmopIHx8IG9iai5sZW5ndGggIT09IGxlbmd0aDQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkluY29tcGF0aWJsZSBzaXplcy4iKTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDQ7ICsraSkgewogICAgICAgIGxldCB2YWwgPSBwYXJzZUludChvYmpbaV0sIHZvaWQgMCk7CiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHZhbCkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTm9uLWludGVnZXIgdmFsdWUuIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoNDsgKytpKSB7CiAgICAgICAgb3V0W2ldID0gcGFyc2VJbnQob2JqW2ldLCB2b2lkIDApOwogICAgICB9CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdGFibGVTdHJpbmdpZnkoeCkgewogICAgICBpZiAodHlwZW9mIHggPT09ICJvYmplY3QiKSB7CiAgICAgICAgaWYgKHggPT09IG51bGwpIHsKICAgICAgICAgIHJldHVybiAibnVsbCI7CiAgICAgICAgfQogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7CiAgICAgICAgICBsZXQgczIgPSAiWyI7CiAgICAgICAgICBsZXQgc2l6ZTIgPSB4Lmxlbmd0aDsKICAgICAgICAgIGxldCBpMiA9IDA7CiAgICAgICAgICBpZiAoaTIgPCBzaXplMikgewogICAgICAgICAgICBzMiArPSBzdGFibGVTdHJpbmdpZnkoeFtpMl0pOwogICAgICAgICAgICB3aGlsZSAoKytpMiA8IHNpemUyKSB7CiAgICAgICAgICAgICAgczIgKz0gIiwiOwogICAgICAgICAgICAgIHMyICs9IHN0YWJsZVN0cmluZ2lmeSh4W2kyXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHMyICs9ICJdIjsKICAgICAgICAgIHJldHVybiBzMjsKICAgICAgICB9CiAgICAgICAgbGV0IHMgPSAieyI7CiAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyh4KS5zb3J0KCk7CiAgICAgICAgbGV0IGkgPSAwOwogICAgICAgIGxldCBzaXplID0ga2V5cy5sZW5ndGg7CiAgICAgICAgaWYgKGkgPCBzaXplKSB7CiAgICAgICAgICBsZXQga2V5ID0ga2V5c1tpXTsKICAgICAgICAgIHMgKz0gSlNPTi5zdHJpbmdpZnkoa2V5KTsKICAgICAgICAgIHMgKz0gIjoiOwogICAgICAgICAgcyArPSBzdGFibGVTdHJpbmdpZnkoeFtrZXldKTsKICAgICAgICAgIHdoaWxlICgrK2kgPCBzaXplKSB7CiAgICAgICAgICAgIHMgKz0gIiwiOwogICAgICAgICAgICBrZXkgPSBrZXlzW2ldOwogICAgICAgICAgICBzICs9IEpTT04uc3RyaW5naWZ5KGtleSk7CiAgICAgICAgICAgIHMgKz0gIjoiOwogICAgICAgICAgICBzICs9IHN0YWJsZVN0cmluZ2lmeSh4W2tleV0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzICs9ICJ9IjsKICAgICAgICByZXR1cm4gczsKICAgICAgfQogICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeCk7CiAgICB9CiAgICB2YXIgU0lOR0xFX1FVT1RFX1NUUklOR19QQVRURVJOID0gLygnKD86W14nXFxdfCg/OlxcLikpKicpLzsKICAgIHZhciBET1VCTEVfUVVPVEVfU1RSSU5HX1BBVFRFUk4gPSAvKCIoPzpbXiJcXF18KD86XFwuKSkqIikvOwogICAgdmFyIFNJTkdMRV9PUl9ET1VCTEVfUVVPVEVfU1RSSU5HX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGAke1NJTkdMRV9RVU9URV9TVFJJTkdfUEFUVEVSTi5zb3VyY2V9fCR7RE9VQkxFX1FVT1RFX1NUUklOR19QQVRURVJOLnNvdXJjZX1gKTsKICAgIHZhciBET1VCTEVfUVVPVEVfUEFUVEVSTiA9IC9eKCg/OlteIidcXF18KD86XFxbXiddKSkqKSgifFxcJykvOwogICAgZnVuY3Rpb24gY29udmVydFN0cmluZ0xpdGVyYWwoeCwgcXVvdGVJbml0aWFsLCBxdW90ZVJlcGxhY2UsIHF1b3RlU2VhcmNoKSB7CiAgICAgIGlmICh4Lmxlbmd0aCA+PSAyICYmIHguY2hhckF0KDApID09PSBxdW90ZUluaXRpYWwgJiYgeC5jaGFyQXQoeC5sZW5ndGggLSAxKSA9PT0gcXVvdGVJbml0aWFsKSB7CiAgICAgICAgbGV0IGlubmVyID0geC5zdWJzdHIoMSwgeC5sZW5ndGggLSAyKTsKICAgICAgICBsZXQgcyA9IHF1b3RlUmVwbGFjZTsKICAgICAgICB3aGlsZSAoaW5uZXIubGVuZ3RoID4gMCkgewogICAgICAgICAgbGV0IG0gPSBpbm5lci5tYXRjaChxdW90ZVNlYXJjaCk7CiAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgewogICAgICAgICAgICBzICs9IGlubmVyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHMgKz0gbVsxXTsKICAgICAgICAgIGlmIChtWzJdID09PSBxdW90ZVJlcGxhY2UpIHsKICAgICAgICAgICAgcyArPSAiXFwiOwogICAgICAgICAgICBzICs9IHF1b3RlUmVwbGFjZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHMgKz0gcXVvdGVJbml0aWFsOwogICAgICAgICAgfQogICAgICAgICAgaW5uZXIgPSBpbm5lci5zdWJzdHIobS5pbmRleCArIG1bMF0ubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgcyArPSBxdW90ZVJlcGxhY2U7CiAgICAgICAgcmV0dXJuIHM7CiAgICAgIH0KICAgICAgcmV0dXJuIHg7CiAgICB9CiAgICBmdW5jdGlvbiBub3JtYWxpemVTdHJpbmdMaXRlcmFsKHgpIHsKICAgICAgcmV0dXJuIGNvbnZlcnRTdHJpbmdMaXRlcmFsKHgsICInIiwgJyInLCBET1VCTEVfUVVPVEVfUEFUVEVSTik7CiAgICB9CiAgICBmdW5jdGlvbiBweXRob25MaXRlcmFsVG9KU09OKHgpIHsKICAgICAgbGV0IHMgPSAiIjsKICAgICAgd2hpbGUgKHgubGVuZ3RoID4gMCkgewogICAgICAgIGxldCBtID0geC5tYXRjaChTSU5HTEVfT1JfRE9VQkxFX1FVT1RFX1NUUklOR19QQVRURVJOKTsKICAgICAgICBsZXQgYmVmb3JlOwogICAgICAgIGxldCByZXBsYWNlbWVudDsKICAgICAgICBpZiAobSA9PT0gbnVsbCkgewogICAgICAgICAgYmVmb3JlID0geDsKICAgICAgICAgIHggPSAiIjsKICAgICAgICAgIHJlcGxhY2VtZW50ID0gIiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJlZm9yZSA9IHguc3Vic3RyKDAsIG0uaW5kZXgpOwogICAgICAgICAgeCA9IHguc3Vic3RyKG0uaW5kZXggKyBtWzBdLmxlbmd0aCk7CiAgICAgICAgICBsZXQgc2luZ2xlUXVvdGVTdHJpbmcgPSBtWzFdOwogICAgICAgICAgaWYgKHNpbmdsZVF1b3RlU3RyaW5nICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBub3JtYWxpemVTdHJpbmdMaXRlcmFsKHNpbmdsZVF1b3RlU3RyaW5nKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gbVsyXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcyArPSBiZWZvcmUucmVwbGFjZSgvXCgvZywgIlsiKS5yZXBsYWNlKC9cKS9nLCAiXSIpLnJlcGxhY2UoIlRydWUiLCAidHJ1ZSIpLnJlcGxhY2UoIkZhbHNlIiwgImZhbHNlIikucmVwbGFjZSgvLFxzKihbXH1cXV0pL2csICIkMSIpOwogICAgICAgIHMgKz0gcmVwbGFjZW1lbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHM7CiAgICB9CiAgICBmdW5jdGlvbiBweXRob25MaXRlcmFsUGFyc2UoeCkgewogICAgICByZXR1cm4gSlNPTi5wYXJzZShweXRob25MaXRlcmFsVG9KU09OKHgpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXJyYXkoeCwgcGFyc2VFbGVtZW50KSB7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh4KSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXJyYXksIGJ1dCByZWNlaXZlZDogJHtKU09OLnN0cmluZ2lmeSh4KX0uYCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHgubWFwKHBhcnNlRWxlbWVudCk7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZUZpeGVkTGVuZ3RoQXJyYXkob3V0LCBvYmosIHBhcnNlRWxlbWVudCkgewogICAgICBjb25zdCBsZW5ndGg0ID0gb3V0Lmxlbmd0aDsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9iaikgfHwgb2JqLmxlbmd0aCAhPT0gbGVuZ3RoNCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbGVuZ3RoICR7bGVuZ3RoNH0gYXJyYXksIGJ1dCByZWNlaXZlZDogJHtKU09OLnN0cmluZ2lmeShvYmopfS5gKTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDQ7ICsraSkgewogICAgICAgIG91dFtpXSA9IHBhcnNlRWxlbWVudChvYmpbaV0sIGkpOwogICAgICB9CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiB2ZXJpZnlPYmplY3Qob2JqKSB7CiAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSAib2JqZWN0IiB8fCBvYmogPT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KG9iaikpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIEpTT04gb2JqZWN0LCBidXQgcmVjZWl2ZWQ6ICR7SlNPTi5zdHJpbmdpZnkob2JqKX0uYCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG9iajsKICAgIH0KICAgIGZ1bmN0aW9uIHZlcmlmeUludChvYmopIHsKICAgICAgbGV0IHJlc3VsdCA9IHBhcnNlSW50KG9iaiwgMTApOwogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocmVzdWx0KSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgaW50ZWdlciwgYnV0IHJlY2VpdmVkOiAke0pTT04uc3RyaW5naWZ5KG9iail9LmApOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiB2ZXJpZnlTdHJpbmcob2JqKSB7CiAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSAic3RyaW5nIikgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc3RyaW5nLCBidXQgcmVjZWl2ZWQ6ICR7SlNPTi5zdHJpbmdpZnkob2JqKX0uYCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG9iajsKICAgIH0KICAgIGZ1bmN0aW9uIHZlcmlmeU9wdGlvbmFsU3RyaW5nKG9iaikgewogICAgICBpZiAob2JqID09PSB2b2lkIDApIHsKICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICB9CiAgICAgIHJldHVybiB2ZXJpZnlTdHJpbmcob2JqKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZlcmlmeU9iamVjdFByb3BlcnR5KG9iaiwgcHJvcGVydHlOYW1lLCB2YWxpZGF0b3IpIHsKICAgICAgbGV0IHZhbHVlID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcGVydHlOYW1lKSA/IG9ialtwcm9wZXJ0eU5hbWVdIDogdm9pZCAwOwogICAgICB0cnkgewogICAgICAgIHJldHVybiB2YWxpZGF0b3IodmFsdWUpOwogICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nICR7SlNPTi5zdHJpbmdpZnkocHJvcGVydHlOYW1lKX0gcHJvcGVydHk6ICR7cGFyc2VFcnJvci5tZXNzYWdlfWApOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB2ZXJpZnlTdHJpbmdBcnJheShhKSB7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXJyYXksIHJlY2VpdmVkOiAke0pTT04uc3RyaW5naWZ5KGEpfS5gKTsKICAgICAgfQogICAgICBmb3IgKGxldCB4IG9mIGEpIHsKICAgICAgICBpZiAodHlwZW9mIHggIT09ICJzdHJpbmciKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN0cmluZywgcmVjZWl2ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoeCl9LmApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYTsKICAgIH0KICAgIGZ1bmN0aW9uIHZlcmlmeUJvb2xlYW4oeCkgewogICAgICBpZiAodHlwZW9mIHggIT09ICJib29sZWFuIikgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYm9vbGVhbiwgcmVjZWl2ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoeCl9YCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHg7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL21lbW9pemUudHMKICAgIHZhciBNZW1vaXplID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLm1hcCA9IG5ldyBNYXAoKTsKICAgICAgfQogICAgICBnZXQoa2V5LCBnZXR0ZXIpIHsKICAgICAgICBsZXQgeyBtYXAgfSA9IHRoaXM7CiAgICAgICAgbGV0IG9iaiA9IG1hcC5nZXQoa2V5KTsKICAgICAgICBpZiAob2JqID09PSB2b2lkIDApIHsKICAgICAgICAgIG9iaiA9IGdldHRlcigpOwogICAgICAgICAgb2JqLnJlZ2lzdGVyRGlzcG9zZXIoKCkgPT4gewogICAgICAgICAgICBtYXAuZGVsZXRlKGtleSk7CiAgICAgICAgICB9KTsKICAgICAgICAgIG1hcC5zZXQoa2V5LCBvYmopOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvYmouYWRkUmVmKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0KICAgIH07CiAgICB2YXIgU3RyaW5nTWVtb2l6ZSA9IGNsYXNzIGV4dGVuZHMgTWVtb2l6ZSB7CiAgICAgIGdldCh4LCBnZXR0ZXIpIHsKICAgICAgICBpZiAodHlwZW9mIHggIT09ICJzdHJpbmciKSB7CiAgICAgICAgICB4ID0gc3RhYmxlU3RyaW5naWZ5KHgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KHgsIGdldHRlcik7CiAgICAgIH0KICAgICAgZ2V0VW5jb3VudGVkKHgsIGdldHRlcikgewogICAgICAgIHJldHVybiB0aGlzLmdldCh4LCAoKSA9PiBuZXcgUmVmQ291bnRlZFZhbHVlKGdldHRlcigpKSkudmFsdWU7CiAgICAgIH0KICAgIH07CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL3BhaXJpbmdfaGVhcC4wLnRzCiAgICB2YXIgSW1wbGVtZW50YXRpb24gPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKGNvbXBhcmUpIHsKICAgICAgICB0aGlzLmNvbXBhcmUgPSBjb21wYXJlOwogICAgICB9CiAgICAgIG1lbGQoYSwgYikgewogICAgICAgIGlmIChiID09PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gYTsKICAgICAgICB9CiAgICAgICAgaWYgKGEgPT09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBiOwogICAgICAgIH0KICAgICAgICBsZXQgeyBjb21wYXJlIH0gPSB0aGlzOwogICAgICAgIGlmIChjb21wYXJlKGIsIGEpKSB7CiAgICAgICAgICBsZXQgdGVtcCA9IGE7CiAgICAgICAgICBhID0gYjsKICAgICAgICAgIGIgPSB0ZW1wOwogICAgICAgIH0KICAgICAgICB2YXIgYUNoaWxkID0gYS5jaGlsZDA7CiAgICAgICAgYi5uZXh0MCA9IGFDaGlsZDsKICAgICAgICBiLnByZXYwID0gYTsKICAgICAgICBpZiAoYUNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgICBhQ2hpbGQucHJldjAgPSBiOwogICAgICAgIH0KICAgICAgICBhLmNoaWxkMCA9IGI7CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0KICAgICAgY29tYmluZUNoaWxkcmVuKG5vZGUpIHsKICAgICAgICB2YXIgY3VyID0gbm9kZS5jaGlsZDA7CiAgICAgICAgaWYgKGN1ciA9PT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGxldCBoZWFkID0gbnVsbDsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgbGV0IGN1ck5leHQgPSBjdXIubmV4dDA7CiAgICAgICAgICBsZXQgbmV4dCwgbTsKICAgICAgICAgIGlmIChjdXJOZXh0ID09PSBudWxsKSB7CiAgICAgICAgICAgIG5leHQgPSBudWxsOwogICAgICAgICAgICBtID0gY3VyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV4dCA9IGN1ck5leHQubmV4dDA7CiAgICAgICAgICAgIG0gPSB0aGlzLm1lbGQoY3VyLCBjdXJOZXh0KTsKICAgICAgICAgIH0KICAgICAgICAgIG0ubmV4dDAgPSBoZWFkOwogICAgICAgICAgaGVhZCA9IG07CiAgICAgICAgICBpZiAobmV4dCA9PT0gbnVsbCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGN1ciA9IG5leHQ7CiAgICAgICAgfQogICAgICAgIHZhciByb290ID0gaGVhZDsKICAgICAgICBoZWFkID0gaGVhZC5uZXh0MDsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgaWYgKGhlYWQgPT09IG51bGwpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgbmV4dCA9IGhlYWQubmV4dDA7CiAgICAgICAgICByb290ID0gdGhpcy5tZWxkKHJvb3QsIGhlYWQpOwogICAgICAgICAgaGVhZCA9IG5leHQ7CiAgICAgICAgfQogICAgICAgIHJvb3QucHJldjAgPSBudWxsOwogICAgICAgIHJvb3QubmV4dDAgPSBudWxsOwogICAgICAgIHJldHVybiByb290OwogICAgICB9CiAgICAgIHJlbW92ZU1pbihyb290KSB7CiAgICAgICAgdmFyIG5ld1Jvb3QgPSB0aGlzLmNvbWJpbmVDaGlsZHJlbihyb290KTsKICAgICAgICByb290Lm5leHQwID0gbnVsbDsKICAgICAgICByb290LnByZXYwID0gbnVsbDsKICAgICAgICByb290LmNoaWxkMCA9IG51bGw7CiAgICAgICAgcmV0dXJuIG5ld1Jvb3Q7CiAgICAgIH0KICAgICAgcmVtb3ZlKHJvb3QsIG5vZGUpIHsKICAgICAgICBpZiAocm9vdCA9PT0gbm9kZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlTWluKHJvb3QpOwogICAgICAgIH0KICAgICAgICB2YXIgcHJldiA9IG5vZGUucHJldjA7CiAgICAgICAgdmFyIG5leHQgPSBub2RlLm5leHQwOwogICAgICAgIGlmIChwcmV2LmNoaWxkMCA9PT0gbm9kZSkgewogICAgICAgICAgcHJldi5jaGlsZDAgPSBuZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmV2Lm5leHQwID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKG5leHQgIT09IG51bGwpIHsKICAgICAgICAgIG5leHQucHJldjAgPSBwcmV2OwogICAgICAgIH0KICAgICAgICBsZXQgbmV3Um9vdCA9IHRoaXMubWVsZChyb290LCB0aGlzLmNvbWJpbmVDaGlsZHJlbihub2RlKSk7CiAgICAgICAgbm9kZS5uZXh0MCA9IG51bGw7CiAgICAgICAgbm9kZS5wcmV2MCA9IG51bGw7CiAgICAgICAgbm9kZS5jaGlsZDAgPSBudWxsOwogICAgICAgIHJldHVybiBuZXdSb290OwogICAgICB9CiAgICAgICplbnRyaWVzKHJvb3QpIHsKICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkgewogICAgICAgICAgbGV0IGNoaWxkID0gcm9vdC5jaGlsZDA7CiAgICAgICAgICB5aWVsZCByb290OwogICAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgICAgIGxldCBuZXh0ID0gY2hpbGQubmV4dDA7CiAgICAgICAgICAgIHlpZWxkKiB0aGlzLmVudHJpZXMoY2hpbGQpOwogICAgICAgICAgICBjaGlsZCA9IG5leHQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgICpyZW1vdmVkRW50cmllcyhyb290KSB7CiAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHsKICAgICAgICAgIGxldCBjaGlsZCA9IHJvb3QuY2hpbGQwOwogICAgICAgICAgcm9vdC5jaGlsZDAgPSBudWxsOwogICAgICAgICAgcm9vdC5uZXh0MCA9IG51bGw7CiAgICAgICAgICByb290LnByZXYwID0gbnVsbDsKICAgICAgICAgIHlpZWxkIHJvb3Q7CiAgICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHsKICAgICAgICAgICAgbGV0IG5leHQgPSBjaGlsZC5uZXh0MDsKICAgICAgICAgICAgY2hpbGQuY2hpbGQwID0gbnVsbDsKICAgICAgICAgICAgY2hpbGQubmV4dDAgPSBudWxsOwogICAgICAgICAgICBjaGlsZC5wcmV2MCA9IG51bGw7CiAgICAgICAgICAgIHlpZWxkKiB0aGlzLmVudHJpZXMoY2hpbGQpOwogICAgICAgICAgICBjaGlsZCA9IG5leHQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdXRpbC9wYWlyaW5nX2hlYXAuMS50cwogICAgdmFyIEltcGxlbWVudGF0aW9uMiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoY29tcGFyZSkgewogICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7CiAgICAgIH0KICAgICAgbWVsZChhLCBiKSB7CiAgICAgICAgaWYgKGIgPT09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBhOwogICAgICAgIH0KICAgICAgICBpZiAoYSA9PT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgfQogICAgICAgIGxldCB7IGNvbXBhcmUgfSA9IHRoaXM7CiAgICAgICAgaWYgKGNvbXBhcmUoYiwgYSkpIHsKICAgICAgICAgIGxldCB0ZW1wID0gYTsKICAgICAgICAgIGEgPSBiOwogICAgICAgICAgYiA9IHRlbXA7CiAgICAgICAgfQogICAgICAgIHZhciBhQ2hpbGQgPSBhLmNoaWxkMTsKICAgICAgICBiLm5leHQxID0gYUNoaWxkOwogICAgICAgIGIucHJldjEgPSBhOwogICAgICAgIGlmIChhQ2hpbGQgIT09IG51bGwpIHsKICAgICAgICAgIGFDaGlsZC5wcmV2MSA9IGI7CiAgICAgICAgfQogICAgICAgIGEuY2hpbGQxID0gYjsKICAgICAgICByZXR1cm4gYTsKICAgICAgfQogICAgICBjb21iaW5lQ2hpbGRyZW4obm9kZSkgewogICAgICAgIHZhciBjdXIgPSBub2RlLmNoaWxkMTsKICAgICAgICBpZiAoY3VyID09PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgbGV0IGhlYWQgPSBudWxsOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICBsZXQgY3VyTmV4dCA9IGN1ci5uZXh0MTsKICAgICAgICAgIGxldCBuZXh0LCBtOwogICAgICAgICAgaWYgKGN1ck5leHQgPT09IG51bGwpIHsKICAgICAgICAgICAgbmV4dCA9IG51bGw7CiAgICAgICAgICAgIG0gPSBjdXI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXh0ID0gY3VyTmV4dC5uZXh0MTsKICAgICAgICAgICAgbSA9IHRoaXMubWVsZChjdXIsIGN1ck5leHQpOwogICAgICAgICAgfQogICAgICAgICAgbS5uZXh0MSA9IGhlYWQ7CiAgICAgICAgICBoZWFkID0gbTsKICAgICAgICAgIGlmIChuZXh0ID09PSBudWxsKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY3VyID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgdmFyIHJvb3QgPSBoZWFkOwogICAgICAgIGhlYWQgPSBoZWFkLm5leHQxOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICBpZiAoaGVhZCA9PT0gbnVsbCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBuZXh0ID0gaGVhZC5uZXh0MTsKICAgICAgICAgIHJvb3QgPSB0aGlzLm1lbGQocm9vdCwgaGVhZCk7CiAgICAgICAgICBoZWFkID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgcm9vdC5wcmV2MSA9IG51bGw7CiAgICAgICAgcm9vdC5uZXh0MSA9IG51bGw7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgIH0KICAgICAgcmVtb3ZlTWluKHJvb3QpIHsKICAgICAgICB2YXIgbmV3Um9vdCA9IHRoaXMuY29tYmluZUNoaWxkcmVuKHJvb3QpOwogICAgICAgIHJvb3QubmV4dDEgPSBudWxsOwogICAgICAgIHJvb3QucHJldjEgPSBudWxsOwogICAgICAgIHJvb3QuY2hpbGQxID0gbnVsbDsKICAgICAgICByZXR1cm4gbmV3Um9vdDsKICAgICAgfQogICAgICByZW1vdmUocm9vdCwgbm9kZSkgewogICAgICAgIGlmIChyb290ID09PSBub2RlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVNaW4ocm9vdCk7CiAgICAgICAgfQogICAgICAgIHZhciBwcmV2ID0gbm9kZS5wcmV2MTsKICAgICAgICB2YXIgbmV4dCA9IG5vZGUubmV4dDE7CiAgICAgICAgaWYgKHByZXYuY2hpbGQxID09PSBub2RlKSB7CiAgICAgICAgICBwcmV2LmNoaWxkMSA9IG5leHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByZXYubmV4dDEgPSBuZXh0OwogICAgICAgIH0KICAgICAgICBpZiAobmV4dCAhPT0gbnVsbCkgewogICAgICAgICAgbmV4dC5wcmV2MSA9IHByZXY7CiAgICAgICAgfQogICAgICAgIGxldCBuZXdSb290ID0gdGhpcy5tZWxkKHJvb3QsIHRoaXMuY29tYmluZUNoaWxkcmVuKG5vZGUpKTsKICAgICAgICBub2RlLm5leHQxID0gbnVsbDsKICAgICAgICBub2RlLnByZXYxID0gbnVsbDsKICAgICAgICBub2RlLmNoaWxkMSA9IG51bGw7CiAgICAgICAgcmV0dXJuIG5ld1Jvb3Q7CiAgICAgIH0KICAgICAgKmVudHJpZXMocm9vdCkgewogICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7CiAgICAgICAgICBsZXQgY2hpbGQgPSByb290LmNoaWxkMTsKICAgICAgICAgIHlpZWxkIHJvb3Q7CiAgICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHsKICAgICAgICAgICAgbGV0IG5leHQgPSBjaGlsZC5uZXh0MTsKICAgICAgICAgICAgeWllbGQqIHRoaXMuZW50cmllcyhjaGlsZCk7CiAgICAgICAgICAgIGNoaWxkID0gbmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgKnJlbW92ZWRFbnRyaWVzKHJvb3QpIHsKICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkgewogICAgICAgICAgbGV0IGNoaWxkID0gcm9vdC5jaGlsZDE7CiAgICAgICAgICByb290LmNoaWxkMSA9IG51bGw7CiAgICAgICAgICByb290Lm5leHQxID0gbnVsbDsKICAgICAgICAgIHJvb3QucHJldjEgPSBudWxsOwogICAgICAgICAgeWllbGQgcm9vdDsKICAgICAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkgewogICAgICAgICAgICBsZXQgbmV4dCA9IGNoaWxkLm5leHQxOwogICAgICAgICAgICBjaGlsZC5jaGlsZDEgPSBudWxsOwogICAgICAgICAgICBjaGlsZC5uZXh0MSA9IG51bGw7CiAgICAgICAgICAgIGNoaWxkLnByZXYxID0gbnVsbDsKICAgICAgICAgICAgeWllbGQqIHRoaXMuZW50cmllcyhjaGlsZCk7CiAgICAgICAgICAgIGNoaWxkID0gbmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL3NpZ25hbC50cwogICAgdmFyIFNpZ25hbCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5oYW5kbGVycyA9IG5ldyBTZXQoKTsKICAgICAgICB0aGlzLmNvdW50ID0gMDsKICAgICAgICBjb25zdCBvYmogPSB0aGlzOwogICAgICAgIHRoaXMuZGlzcGF0Y2ggPSBmdW5jdGlvbigpIHsKICAgICAgICAgICsrb2JqLmNvdW50OwogICAgICAgICAgb2JqLmhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHsKICAgICAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgfQogICAgICBhZGQoaGFuZGxlcikgewogICAgICAgIHRoaXMuaGFuZGxlcnMuYWRkKGhhbmRsZXIpOwogICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmUoaGFuZGxlcik7CiAgICAgICAgfTsKICAgICAgfQogICAgICByZW1vdmUoaGFuZGxlcikgewogICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTsKICAgICAgfQogICAgICBkaXNwb3NlKCkgewogICAgICAgIHRoaXMuaGFuZGxlcnMgPSB2b2lkIDA7CiAgICAgIH0KICAgIH07CiAgICB2YXIgTnVsbGFyeVNpZ25hbCA9IGNsYXNzIGV4dGVuZHMgU2lnbmFsIHsKICAgIH07CiAgICB2YXIgbmV4dE1hcmtHZW5lcmF0aW9uID0gMDsKICAgIGZ1bmN0aW9uIGdldE5leHRNYXJrR2VuZXJhdGlvbigpIHsKICAgICAgcmV0dXJuICsrbmV4dE1hcmtHZW5lcmF0aW9uOwogICAgfQogICAgdmFyIENodW5rID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmNoaWxkMCA9IG51bGw7CiAgICAgICAgdGhpcy5uZXh0MCA9IG51bGw7CiAgICAgICAgdGhpcy5wcmV2MCA9IG51bGw7CiAgICAgICAgdGhpcy5jaGlsZDEgPSBudWxsOwogICAgICAgIHRoaXMubmV4dDEgPSBudWxsOwogICAgICAgIHRoaXMucHJldjEgPSBudWxsOwogICAgICAgIHRoaXMuc291cmNlID0gbnVsbDsKICAgICAgICB0aGlzLmtleSA9IG51bGw7CiAgICAgICAgdGhpcy5zdGF0ZV8gPSBDaHVua1N0YXRlLk5FVzsKICAgICAgICB0aGlzLmVycm9yID0gbnVsbDsKICAgICAgICB0aGlzLm1hcmtHZW5lcmF0aW9uID0gLTE7CiAgICAgICAgdGhpcy5wcmlvcml0eSA9IDA7CiAgICAgICAgdGhpcy5uZXdQcmlvcml0eSA9IDA7CiAgICAgICAgdGhpcy5wcmlvcml0eVRpZXIgPSBDaHVua1ByaW9yaXR5VGllci5SRUNFTlQ7CiAgICAgICAgdGhpcy5uZXdQcmlvcml0eVRpZXIgPSBDaHVua1ByaW9yaXR5VGllci5SRUNFTlQ7CiAgICAgICAgdGhpcy5zeXN0ZW1NZW1vcnlCeXRlc18gPSAwOwogICAgICAgIHRoaXMuZ3B1TWVtb3J5Qnl0ZXNfID0gMDsKICAgICAgICB0aGlzLmRvd25sb2FkU2xvdHNfID0gMTsKICAgICAgICB0aGlzLmJhY2tlbmRPbmx5ID0gZmFsc2U7CiAgICAgICAgdGhpcy5pc0NvbXB1dGF0aW9uYWwgPSBmYWxzZTsKICAgICAgICB0aGlzLm5ld2x5UmVxdWVzdGVkVG9Gcm9udGVuZCA9IGZhbHNlOwogICAgICAgIHRoaXMucmVxdWVzdGVkVG9Gcm9udGVuZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZG93bmxvYWRDYW5jZWxsYXRpb25Ub2tlbiA9IHZvaWQgMDsKICAgICAgfQogICAgICBpbml0aWFsaXplKGtleSkgewogICAgICAgIHRoaXMua2V5ID0ga2V5OwogICAgICAgIHRoaXMucHJpb3JpdHkgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICAgICAgdGhpcy5wcmlvcml0eVRpZXIgPSBDaHVua1ByaW9yaXR5VGllci5SRUNFTlQ7CiAgICAgICAgdGhpcy5uZXdQcmlvcml0eSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTsKICAgICAgICB0aGlzLm5ld1ByaW9yaXR5VGllciA9IENodW5rUHJpb3JpdHlUaWVyLlJFQ0VOVDsKICAgICAgICB0aGlzLmVycm9yID0gbnVsbDsKICAgICAgICB0aGlzLnN0YXRlID0gQ2h1bmtTdGF0ZS5ORVc7CiAgICAgICAgdGhpcy5yZXF1ZXN0ZWRUb0Zyb250ZW5kID0gZmFsc2U7CiAgICAgICAgdGhpcy5uZXdseVJlcXVlc3RlZFRvRnJvbnRlbmQgPSBmYWxzZTsKICAgICAgfQogICAgICB1cGRhdGVQcmlvcml0eVByb3BlcnRpZXMoKSB7CiAgICAgICAgdGhpcy5wcmlvcml0eVRpZXIgPSB0aGlzLm5ld1ByaW9yaXR5VGllcjsKICAgICAgICB0aGlzLnByaW9yaXR5ID0gdGhpcy5uZXdQcmlvcml0eTsKICAgICAgICB0aGlzLm5ld1ByaW9yaXR5VGllciA9IENodW5rUHJpb3JpdHlUaWVyLlJFQ0VOVDsKICAgICAgICB0aGlzLm5ld1ByaW9yaXR5ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgICAgIHRoaXMucmVxdWVzdGVkVG9Gcm9udGVuZCA9IHRoaXMubmV3bHlSZXF1ZXN0ZWRUb0Zyb250ZW5kOwogICAgICB9CiAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgdGhpcy5zb3VyY2UgPSBudWxsOwogICAgICAgIHRoaXMuZXJyb3IgPSBudWxsOwogICAgICB9CiAgICAgIGdldCBjaHVua01hbmFnZXIoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLmNodW5rTWFuYWdlcjsKICAgICAgfQogICAgICBnZXQgcXVldWVNYW5hZ2VyKCkgewogICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5jaHVua01hbmFnZXIucXVldWVNYW5hZ2VyOwogICAgICB9CiAgICAgIGRvd25sb2FkRmFpbGVkKGVycm9yKSB7CiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yOwogICAgICAgIHRoaXMucXVldWVNYW5hZ2VyLnVwZGF0ZUNodW5rU3RhdGUodGhpcywgQ2h1bmtTdGF0ZS5GQUlMRUQpOwogICAgICB9CiAgICAgIGRvd25sb2FkU3VjY2VlZGVkKCkgewogICAgICAgIHRoaXMucXVldWVNYW5hZ2VyLnVwZGF0ZUNodW5rU3RhdGUodGhpcywgQ2h1bmtTdGF0ZS5TWVNURU1fTUVNT1JZX1dPUktFUik7CiAgICAgIH0KICAgICAgZnJlZVN5c3RlbU1lbW9yeSgpIHsKICAgICAgfQogICAgICBzZXJpYWxpemUobXNnLCBfdHJhbnNmZXJzKSB7CiAgICAgICAgbXNnWyJpZCJdID0gdGhpcy5rZXk7CiAgICAgICAgbXNnWyJzb3VyY2UiXSA9IHRoaXMuc291cmNlLnJwY0lkOwogICAgICAgIG1zZ1sibmV3Il0gPSB0cnVlOwogICAgICB9CiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLmtleTsKICAgICAgfQogICAgICBzZXQgc3RhdGUobmV3U3RhdGUpIHsKICAgICAgICBpZiAobmV3U3RhdGUgPT09IHRoaXMuc3RhdGVfKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9sZFN0YXRlID0gdGhpcy5zdGF0ZV87CiAgICAgICAgdGhpcy5zdGF0ZV8gPSBuZXdTdGF0ZTsKICAgICAgICB0aGlzLnNvdXJjZS5jaHVua1N0YXRlQ2hhbmdlZCh0aGlzLCBvbGRTdGF0ZSk7CiAgICAgIH0KICAgICAgZ2V0IHN0YXRlKCkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXRlXzsKICAgICAgfQogICAgICBzZXQgc3lzdGVtTWVtb3J5Qnl0ZXMoYnl0ZXMpIHsKICAgICAgICB1cGRhdGVDaHVua1N0YXRpc3RpY3ModGhpcywgLTEpOwogICAgICAgIHRoaXMuY2h1bmtNYW5hZ2VyLnF1ZXVlTWFuYWdlci5hZGp1c3RDYXBhY2l0aWVzRm9yQ2h1bmsodGhpcywgZmFsc2UpOwogICAgICAgIHRoaXMuc3lzdGVtTWVtb3J5Qnl0ZXNfID0gYnl0ZXM7CiAgICAgICAgdGhpcy5jaHVua01hbmFnZXIucXVldWVNYW5hZ2VyLmFkanVzdENhcGFjaXRpZXNGb3JDaHVuayh0aGlzLCB0cnVlKTsKICAgICAgICB1cGRhdGVDaHVua1N0YXRpc3RpY3ModGhpcywgMSk7CiAgICAgICAgdGhpcy5jaHVua01hbmFnZXIucXVldWVNYW5hZ2VyLnNjaGVkdWxlVXBkYXRlKCk7CiAgICAgIH0KICAgICAgZ2V0IHN5c3RlbU1lbW9yeUJ5dGVzKCkgewogICAgICAgIHJldHVybiB0aGlzLnN5c3RlbU1lbW9yeUJ5dGVzXzsKICAgICAgfQogICAgICBzZXQgZ3B1TWVtb3J5Qnl0ZXMoYnl0ZXMpIHsKICAgICAgICB1cGRhdGVDaHVua1N0YXRpc3RpY3ModGhpcywgLTEpOwogICAgICAgIHRoaXMuY2h1bmtNYW5hZ2VyLnF1ZXVlTWFuYWdlci5hZGp1c3RDYXBhY2l0aWVzRm9yQ2h1bmsodGhpcywgZmFsc2UpOwogICAgICAgIHRoaXMuZ3B1TWVtb3J5Qnl0ZXNfID0gYnl0ZXM7CiAgICAgICAgdGhpcy5jaHVua01hbmFnZXIucXVldWVNYW5hZ2VyLmFkanVzdENhcGFjaXRpZXNGb3JDaHVuayh0aGlzLCB0cnVlKTsKICAgICAgICB1cGRhdGVDaHVua1N0YXRpc3RpY3ModGhpcywgMSk7CiAgICAgICAgdGhpcy5jaHVua01hbmFnZXIucXVldWVNYW5hZ2VyLnNjaGVkdWxlVXBkYXRlKCk7CiAgICAgIH0KICAgICAgZ2V0IGdwdU1lbW9yeUJ5dGVzKCkgewogICAgICAgIHJldHVybiB0aGlzLmdwdU1lbW9yeUJ5dGVzXzsKICAgICAgfQogICAgICBnZXQgZG93bmxvYWRTbG90cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZFNsb3RzXzsKICAgICAgfQogICAgICBzZXQgZG93bmxvYWRTbG90cyhjb3VudCkgewogICAgICAgIGlmIChjb3VudCA9PT0gdGhpcy5kb3dubG9hZFNsb3RzXykKICAgICAgICAgIHJldHVybjsKICAgICAgICB1cGRhdGVDaHVua1N0YXRpc3RpY3ModGhpcywgLTEpOwogICAgICAgIHRoaXMuY2h1bmtNYW5hZ2VyLnF1ZXVlTWFuYWdlci5hZGp1c3RDYXBhY2l0aWVzRm9yQ2h1bmsodGhpcywgZmFsc2UpOwogICAgICAgIHRoaXMuZG93bmxvYWRTbG90c18gPSBjb3VudDsKICAgICAgICB0aGlzLmNodW5rTWFuYWdlci5xdWV1ZU1hbmFnZXIuYWRqdXN0Q2FwYWNpdGllc0ZvckNodW5rKHRoaXMsIHRydWUpOwogICAgICAgIHVwZGF0ZUNodW5rU3RhdGlzdGljcyh0aGlzLCAxKTsKICAgICAgICB0aGlzLmNodW5rTWFuYWdlci5xdWV1ZU1hbmFnZXIuc2NoZWR1bGVVcGRhdGUoKTsKICAgICAgfQogICAgICByZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKSB7CiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2UucmVnaXN0ZXJDaHVua0xpc3RlbmVyKHRoaXMua2V5LCBsaXN0ZW5lcik7CiAgICAgIH0KICAgICAgdW5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKSB7CiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2UudW5yZWdpc3RlckNodW5rTGlzdGVuZXIodGhpcy5rZXksIGxpc3RlbmVyKTsKICAgICAgfQogICAgICBzdGF0aWMgcHJpb3JpdHlMZXNzKGEsIGIpIHsKICAgICAgICByZXR1cm4gYS5wcmlvcml0eSA8IGIucHJpb3JpdHk7CiAgICAgIH0KICAgICAgc3RhdGljIHByaW9yaXR5R3JlYXRlcihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgPiBiLnByaW9yaXR5OwogICAgICB9CiAgICB9OwogICAgdmFyIG51bVNvdXJjZVF1ZXVlTGV2ZWxzID0gMjsKICAgIHZhciBDaHVua1NvdXJjZUJhc2UgPSBjbGFzcyBleHRlbmRzIFNoYXJlZE9iamVjdCB7CiAgICAgIGNvbnN0cnVjdG9yKGNodW5rTWFuYWdlcikgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5jaHVua01hbmFnZXIgPSBjaHVua01hbmFnZXI7CiAgICAgICAgdGhpcy5saXN0ZW5lcnNfID0gbmV3IE1hcCgpOwogICAgICAgIHRoaXMuY2h1bmtzID0gbmV3IE1hcCgpOwogICAgICAgIHRoaXMuZnJlZUNodW5rcyA9IG5ldyBBcnJheSgpOwogICAgICAgIHRoaXMuc3RhdGlzdGljcyA9IG5ldyBGbG9hdDY0QXJyYXkobnVtQ2h1bmtTdGF0aXN0aWNzKTsKICAgICAgICB0aGlzLnNvdXJjZVF1ZXVlTGV2ZWwgPSAwOwogICAgICAgIGNodW5rTWFuYWdlci5xdWV1ZU1hbmFnZXIuc291cmNlcy5hZGQodGhpcyk7CiAgICAgIH0KICAgICAgZGlzcG9zZWQoKSB7CiAgICAgICAgdGhpcy5jaHVua01hbmFnZXIucXVldWVNYW5hZ2VyLnNvdXJjZXMuZGVsZXRlKHRoaXMpOwogICAgICAgIHN1cGVyLmRpc3Bvc2VkKCk7CiAgICAgIH0KICAgICAgZ2V0TmV3Q2h1bmtfKGNodW5rVHlwZSkgewogICAgICAgIGxldCBmcmVlQ2h1bmtzID0gdGhpcy5mcmVlQ2h1bmtzOwogICAgICAgIGxldCBmcmVlQ2h1bmtzTGVuZ3RoID0gZnJlZUNodW5rcy5sZW5ndGg7CiAgICAgICAgaWYgKGZyZWVDaHVua3NMZW5ndGggPiAwKSB7CiAgICAgICAgICBsZXQgY2h1bmsyID0gZnJlZUNodW5rc1tmcmVlQ2h1bmtzTGVuZ3RoIC0gMV07CiAgICAgICAgICBmcmVlQ2h1bmtzLmxlbmd0aCA9IGZyZWVDaHVua3NMZW5ndGggLSAxOwogICAgICAgICAgY2h1bmsyLnNvdXJjZSA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gY2h1bmsyOwogICAgICAgIH0KICAgICAgICBsZXQgY2h1bmsgPSBuZXcgY2h1bmtUeXBlKCk7CiAgICAgICAgY2h1bmsuc291cmNlID0gdGhpczsKICAgICAgICByZXR1cm4gY2h1bms7CiAgICAgIH0KICAgICAgYWRkQ2h1bmsoY2h1bmspIHsKICAgICAgICBsZXQgeyBjaHVua3MgfSA9IHRoaXM7CiAgICAgICAgaWYgKGNodW5rcy5zaXplID09PSAwKSB7CiAgICAgICAgICB0aGlzLmFkZFJlZigpOwogICAgICAgIH0KICAgICAgICBjaHVua3Muc2V0KGNodW5rLmtleSwgY2h1bmspOwogICAgICAgIHVwZGF0ZUNodW5rU3RhdGlzdGljcyhjaHVuaywgMSk7CiAgICAgIH0KICAgICAgcmVtb3ZlQ2h1bmsoY2h1bmspIHsKICAgICAgICBsZXQgeyBjaHVua3MsIGZyZWVDaHVua3MgfSA9IHRoaXM7CiAgICAgICAgY2h1bmtzLmRlbGV0ZShjaHVuay5rZXkpOwogICAgICAgIGNodW5rLmRpc3Bvc2UoKTsKICAgICAgICBmcmVlQ2h1bmtzW2ZyZWVDaHVua3MubGVuZ3RoXSA9IGNodW5rOwogICAgICAgIGlmIChjaHVua3Muc2l6ZSA9PT0gMCkgewogICAgICAgICAgdGhpcy5kaXNwb3NlKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlZ2lzdGVyQ2h1bmtMaXN0ZW5lcihrZXksIGxpc3RlbmVyKSB7CiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc18uaGFzKGtleSkpIHsKICAgICAgICAgIHRoaXMubGlzdGVuZXJzXy5zZXQoa2V5LCBbbGlzdGVuZXJdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5saXN0ZW5lcnNfLmdldChrZXkpLnB1c2gobGlzdGVuZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICB1bnJlZ2lzdGVyQ2h1bmtMaXN0ZW5lcihrZXksIGxpc3RlbmVyKSB7CiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc18uaGFzKGtleSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qga2V5TGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNfLmdldChrZXkpOwogICAgICAgIGNvbnN0IGlkeCA9IGtleUxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTsKICAgICAgICBpZiAoaWR4IDwgMCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBrZXlMaXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgaWYgKGtleUxpc3RlbmVycy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHRoaXMubGlzdGVuZXJzXy5kZWxldGUoa2V5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgY2h1bmtTdGF0ZUNoYW5nZWQoY2h1bmssIG9sZFN0YXRlKSB7CiAgICAgICAgaWYgKCFjaHVuay5rZXkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc18uaGFzKGNodW5rLmtleSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBbLi4udGhpcy5saXN0ZW5lcnNfLmdldChjaHVuay5rZXkpXSkgewogICAgICAgICAgbGlzdGVuZXIuc3RhdGVDaGFuZ2VkKGNodW5rLCBvbGRTdGF0ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gdXBkYXRlQ2h1bmtTdGF0aXN0aWNzKGNodW5rLCBzaWduKSB7CiAgICAgIGNvbnN0IHsgc3RhdGlzdGljcyB9ID0gY2h1bmsuc291cmNlOwogICAgICBjb25zdCB7IHN5c3RlbU1lbW9yeUJ5dGVzLCBncHVNZW1vcnlCeXRlcyB9ID0gY2h1bms7CiAgICAgIGNvbnN0IGluZGV4ID0gZ2V0Q2h1bmtTdGF0ZVN0YXRpc3RpY0luZGV4KGNodW5rLnN0YXRlLCBjaHVuay5wcmlvcml0eVRpZXIpOwogICAgICBzdGF0aXN0aWNzW2luZGV4ICogbnVtQ2h1bmtNZW1vcnlTdGF0aXN0aWNzICsgQ2h1bmtNZW1vcnlTdGF0aXN0aWNzLm51bUNodW5rc10gKz0gc2lnbjsKICAgICAgc3RhdGlzdGljc1tpbmRleCAqIG51bUNodW5rTWVtb3J5U3RhdGlzdGljcyArIENodW5rTWVtb3J5U3RhdGlzdGljcy5zeXN0ZW1NZW1vcnlCeXRlc10gKz0gc2lnbiAqIHN5c3RlbU1lbW9yeUJ5dGVzOwogICAgICBzdGF0aXN0aWNzW2luZGV4ICogbnVtQ2h1bmtNZW1vcnlTdGF0aXN0aWNzICsgQ2h1bmtNZW1vcnlTdGF0aXN0aWNzLmdwdU1lbW9yeUJ5dGVzXSArPSBzaWduICogZ3B1TWVtb3J5Qnl0ZXM7CiAgICB9CiAgICB2YXIgQ2h1bmtTb3VyY2UgPSBjbGFzcyBleHRlbmRzIENodW5rU291cmNlQmFzZSB7CiAgICAgIGNvbnN0cnVjdG9yKHJwYzIsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCBjaHVua01hbmFnZXIgPSBycGMyLmdldChvcHRpb25zWyJjaHVua01hbmFnZXIiXSk7CiAgICAgICAgc3VwZXIoY2h1bmtNYW5hZ2VyKTsKICAgICAgICBpbml0aWFsaXplU2hhcmVkT2JqZWN0Q291bnRlcnBhcnQodGhpcywgcnBjMiwgb3B0aW9ucyk7CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBzdGFydENodW5rRG93bmxvYWQoY2h1bmspIHsKICAgICAgY29uc3QgZG93bmxvYWRDYW5jZWxsYXRpb25Ub2tlbiA9IGNodW5rLmRvd25sb2FkQ2FuY2VsbGF0aW9uVG9rZW4gPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTsKICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgY2h1bmsuc291cmNlLmRvd25sb2FkKGNodW5rLCBkb3dubG9hZENhbmNlbGxhdGlvblRva2VuKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAoY2h1bmsuZG93bmxvYWRDYW5jZWxsYXRpb25Ub2tlbiA9PT0gZG93bmxvYWRDYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgICAgY2h1bmsuZG93bmxvYWRDYW5jZWxsYXRpb25Ub2tlbiA9IHZvaWQgMDsKICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgICAgY29uc3QgeyBzdGF0aXN0aWNzIH0gPSBjaHVuay5zb3VyY2U7CiAgICAgICAgICBzdGF0aXN0aWNzW2dldENodW5rRG93bmxvYWRTdGF0aXN0aWNJbmRleChDaHVua0Rvd25sb2FkU3RhdGlzdGljcy50b3RhbFRpbWUpXSArPSBlbmRUaW1lIC0gc3RhcnRUaW1lOwogICAgICAgICAgKytzdGF0aXN0aWNzW2dldENodW5rRG93bmxvYWRTdGF0aXN0aWNJbmRleChDaHVua0Rvd25sb2FkU3RhdGlzdGljcy50b3RhbENodW5rcyldOwogICAgICAgICAgY2h1bmsuZG93bmxvYWRTdWNjZWVkZWQoKTsKICAgICAgICB9CiAgICAgIH0sIChlcnJvcikgPT4gewogICAgICAgIGlmIChjaHVuay5kb3dubG9hZENhbmNlbGxhdGlvblRva2VuID09PSBkb3dubG9hZENhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgICBjaHVuay5kb3dubG9hZENhbmNlbGxhdGlvblRva2VuID0gdm9pZCAwOwogICAgICAgICAgY2h1bmsuZG93bmxvYWRGYWlsZWQoZXJyb3IpOwogICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJldHJpZXZpbmcgY2h1bmsgJHtjaHVua306ICR7ZXJyb3J9YCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGNhbmNlbENodW5rRG93bmxvYWQoY2h1bmspIHsKICAgICAgY29uc3QgdG9rZW4gPSBjaHVuay5kb3dubG9hZENhbmNlbGxhdGlvblRva2VuOwogICAgICBjaHVuay5kb3dubG9hZENhbmNlbGxhdGlvblRva2VuID0gdm9pZCAwOwogICAgICBpZiAodG9rZW4pIHsKICAgICAgICB0b2tlbi5jYW5jZWwoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLmxvZygiVW5leHBlY3RlZCB1bmRlZmluZWQgdG9rZW4gaW4iLCBjaHVuayk7CiAgICAgIH0KICAgIH0KICAgIHZhciBDaHVua1ByaW9yaXR5UXVldWUgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKGhlYXBPcGVyYXRpb25zLCBsaW5rZWRMaXN0T3BlcmF0aW9ucykgewogICAgICAgIHRoaXMuaGVhcE9wZXJhdGlvbnMgPSBoZWFwT3BlcmF0aW9uczsKICAgICAgICB0aGlzLmxpbmtlZExpc3RPcGVyYXRpb25zID0gbGlua2VkTGlzdE9wZXJhdGlvbnM7CiAgICAgICAgdGhpcy5oZWFwUm9vdHMgPSBbbnVsbCwgbnVsbF07CiAgICAgICAgdGhpcy5yZWNlbnRIZWFkID0gbmV3IENodW5rKCk7CiAgICAgICAgbGlua2VkTGlzdE9wZXJhdGlvbnMuaW5pdGlhbGl6ZUhlYWQodGhpcy5yZWNlbnRIZWFkKTsKICAgICAgfQogICAgICBhZGQoY2h1bmspIHsKICAgICAgICBsZXQgcHJpb3JpdHlUaWVyID0gY2h1bmsucHJpb3JpdHlUaWVyOwogICAgICAgIGlmIChwcmlvcml0eVRpZXIgPT09IENodW5rUHJpb3JpdHlUaWVyLlJFQ0VOVCkgewogICAgICAgICAgdGhpcy5saW5rZWRMaXN0T3BlcmF0aW9ucy5pbnNlcnRBZnRlcih0aGlzLnJlY2VudEhlYWQsIGNodW5rKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV0IHsgaGVhcFJvb3RzIH0gPSB0aGlzOwogICAgICAgICAgaGVhcFJvb3RzW3ByaW9yaXR5VGllcl0gPSB0aGlzLmhlYXBPcGVyYXRpb25zLm1lbGQoaGVhcFJvb3RzW3ByaW9yaXR5VGllcl0sIGNodW5rKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgKmNhbmRpZGF0ZXMoKSB7CiAgICAgICAgaWYgKHRoaXMuaGVhcE9wZXJhdGlvbnMuY29tcGFyZSA9PT0gQ2h1bmsucHJpb3JpdHlMZXNzKSB7CiAgICAgICAgICBsZXQgeyBsaW5rZWRMaXN0T3BlcmF0aW9ucywgcmVjZW50SGVhZCB9ID0gdGhpczsKICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIGxldCBjaHVuayA9IGxpbmtlZExpc3RPcGVyYXRpb25zLmJhY2socmVjZW50SGVhZCk7CiAgICAgICAgICAgIGlmIChjaHVuayA9PSBudWxsKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgeWllbGQgY2h1bms7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCB7IGhlYXBSb290cyB9ID0gdGhpczsKICAgICAgICAgIGZvciAobGV0IHRpZXIgPSBDaHVua1ByaW9yaXR5VGllci5MQVNUX09SREVSRURfVElFUjsgdGllciA+PSBDaHVua1ByaW9yaXR5VGllci5GSVJTVF9PUkRFUkVEX1RJRVI7IC0tdGllcikgewogICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgIGxldCByb290ID0gaGVhcFJvb3RzW3RpZXJdOwogICAgICAgICAgICAgIGlmIChyb290ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB5aWVsZCByb290OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsZXQgaGVhcFJvb3RzID0gdGhpcy5oZWFwUm9vdHM7CiAgICAgICAgICBmb3IgKGxldCB0aWVyID0gQ2h1bmtQcmlvcml0eVRpZXIuRklSU1RfT1JERVJFRF9USUVSOyB0aWVyIDw9IENodW5rUHJpb3JpdHlUaWVyLkxBU1RfT1JERVJFRF9USUVSOyArK3RpZXIpIHsKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICBsZXQgcm9vdCA9IGhlYXBSb290c1t0aWVyXTsKICAgICAgICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgeWllbGQgcm9vdDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCB7IGxpbmtlZExpc3RPcGVyYXRpb25zLCByZWNlbnRIZWFkIH0gPSB0aGlzOwogICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgbGV0IGNodW5rID0gbGlua2VkTGlzdE9wZXJhdGlvbnMuZnJvbnQocmVjZW50SGVhZCk7CiAgICAgICAgICAgIGlmIChjaHVuayA9PSBudWxsKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgeWllbGQgY2h1bms7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZGVsZXRlKGNodW5rKSB7CiAgICAgICAgbGV0IHByaW9yaXR5VGllciA9IGNodW5rLnByaW9yaXR5VGllcjsKICAgICAgICBpZiAocHJpb3JpdHlUaWVyID09PSBDaHVua1ByaW9yaXR5VGllci5SRUNFTlQpIHsKICAgICAgICAgIHRoaXMubGlua2VkTGlzdE9wZXJhdGlvbnMucG9wKGNodW5rKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV0IGhlYXBSb290cyA9IHRoaXMuaGVhcFJvb3RzOwogICAgICAgICAgaGVhcFJvb3RzW3ByaW9yaXR5VGllcl0gPSB0aGlzLmhlYXBPcGVyYXRpb25zLnJlbW92ZShoZWFwUm9vdHNbcHJpb3JpdHlUaWVyXSwgY2h1bmspOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIG1ha2VDaHVua1ByaW9yaXR5UXVldWUwKGNvbXBhcmUpIHsKICAgICAgcmV0dXJuIG5ldyBDaHVua1ByaW9yaXR5UXVldWUobmV3IEltcGxlbWVudGF0aW9uKGNvbXBhcmUpLCBsaW5rZWRfbGlzdF8wX2RlZmF1bHQpOwogICAgfQogICAgZnVuY3Rpb24gbWFrZUNodW5rUHJpb3JpdHlRdWV1ZTEoY29tcGFyZSkgewogICAgICByZXR1cm4gbmV3IENodW5rUHJpb3JpdHlRdWV1ZShuZXcgSW1wbGVtZW50YXRpb24yKGNvbXBhcmUpLCBsaW5rZWRfbGlzdF8xX2RlZmF1bHQpOwogICAgfQogICAgZnVuY3Rpb24gdHJ5VG9GcmVlQ2FwYWNpdHkoc2l6ZSwgY2FwYWNpdHksIHByaW9yaXR5VGllciwgcHJpb3JpdHksIGV2aWN0aW9uQ2FuZGlkYXRlcywgZXZpY3QpIHsKICAgICAgd2hpbGUgKGNhcGFjaXR5LmF2YWlsYWJsZUl0ZW1zIDwgMSB8fCBjYXBhY2l0eS5hdmFpbGFibGVTaXplIDwgc2l6ZSkgewogICAgICAgIGxldCBldmljdGlvbkNhbmRpZGF0ZSA9IGV2aWN0aW9uQ2FuZGlkYXRlcy5uZXh0KCkudmFsdWU7CiAgICAgICAgaWYgKGV2aWN0aW9uQ2FuZGlkYXRlID09PSB2b2lkIDApIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV0IGV2aWN0aW9uVGllciA9IGV2aWN0aW9uQ2FuZGlkYXRlLnByaW9yaXR5VGllcjsKICAgICAgICAgIGlmIChldmljdGlvblRpZXIgPCBwcmlvcml0eVRpZXIgfHwgZXZpY3Rpb25UaWVyID09PSBwcmlvcml0eVRpZXIgJiYgZXZpY3Rpb25DYW5kaWRhdGUucHJpb3JpdHkgPj0gcHJpb3JpdHkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgZXZpY3QoZXZpY3Rpb25DYW5kaWRhdGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHZhciBBdmFpbGFibGVDYXBhY2l0eSA9IGNsYXNzIGV4dGVuZHMgUmVmQ291bnRlZCB7CiAgICAgIGNvbnN0cnVjdG9yKGl0ZW1MaW1pdCwgc2l6ZUxpbWl0KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLml0ZW1MaW1pdCA9IGl0ZW1MaW1pdDsKICAgICAgICB0aGlzLnNpemVMaW1pdCA9IHNpemVMaW1pdDsKICAgICAgICB0aGlzLmN1cnJlbnRTaXplID0gMDsKICAgICAgICB0aGlzLmN1cnJlbnRJdGVtcyA9IDA7CiAgICAgICAgdGhpcy5jYXBhY2l0eUNoYW5nZWQgPSBuZXcgTnVsbGFyeVNpZ25hbCgpOwogICAgICAgIHRoaXMucmVnaXN0ZXJEaXNwb3NlcihpdGVtTGltaXQuY2hhbmdlZC5hZGQodGhpcy5jYXBhY2l0eUNoYW5nZWQuZGlzcGF0Y2gpKTsKICAgICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIoc2l6ZUxpbWl0LmNoYW5nZWQuYWRkKHRoaXMuY2FwYWNpdHlDaGFuZ2VkLmRpc3BhdGNoKSk7CiAgICAgIH0KICAgICAgYWRqdXN0KGl0ZW1zLCBzaXplKSB7CiAgICAgICAgdGhpcy5jdXJyZW50SXRlbXMgLT0gaXRlbXM7CiAgICAgICAgdGhpcy5jdXJyZW50U2l6ZSAtPSBzaXplOwogICAgICB9CiAgICAgIGdldCBhdmFpbGFibGVTaXplKCkgewogICAgICAgIHJldHVybiB0aGlzLnNpemVMaW1pdC52YWx1ZSAtIHRoaXMuY3VycmVudFNpemU7CiAgICAgIH0KICAgICAgZ2V0IGF2YWlsYWJsZUl0ZW1zKCkgewogICAgICAgIHJldHVybiB0aGlzLml0ZW1MaW1pdC52YWx1ZSAtIHRoaXMuY3VycmVudEl0ZW1zOwogICAgICB9CiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiBgYnl0ZXM9JHt0aGlzLmN1cnJlbnRTaXplfS8ke3RoaXMuc2l6ZUxpbWl0LnZhbHVlfSxpdGVtcz0ke3RoaXMuY3VycmVudEl0ZW1zfS8ke3RoaXMuaXRlbUxpbWl0LnZhbHVlfWA7CiAgICAgIH0KICAgIH07CiAgICB2YXIgQ2h1bmtRdWV1ZU1hbmFnZXIgPSBjbGFzcyBleHRlbmRzIFNoYXJlZE9iamVjdENvdW50ZXJwYXJ0IHsKICAgICAgY29uc3RydWN0b3IocnBjMiwgb3B0aW9ucykgewogICAgICAgIHN1cGVyKHJwYzIsIG9wdGlvbnMpOwogICAgICAgIHRoaXMuc291cmNlcyA9IG5ldyBTZXQoKTsKICAgICAgICB0aGlzLnF1ZXVlZERvd25sb2FkUHJvbW90aW9uUXVldWUgPSBbCiAgICAgICAgICBtYWtlQ2h1bmtQcmlvcml0eVF1ZXVlMShDaHVuay5wcmlvcml0eUdyZWF0ZXIpLAogICAgICAgICAgbWFrZUNodW5rUHJpb3JpdHlRdWV1ZTEoQ2h1bmsucHJpb3JpdHlHcmVhdGVyKQogICAgICAgIF07CiAgICAgICAgdGhpcy5xdWV1ZWRDb21wdXRlUHJvbW90aW9uUXVldWUgPSBtYWtlQ2h1bmtQcmlvcml0eVF1ZXVlMShDaHVuay5wcmlvcml0eUdyZWF0ZXIpOwogICAgICAgIHRoaXMuZG93bmxvYWRFdmljdGlvblF1ZXVlID0gWwogICAgICAgICAgbWFrZUNodW5rUHJpb3JpdHlRdWV1ZTEoQ2h1bmsucHJpb3JpdHlMZXNzKSwKICAgICAgICAgIG1ha2VDaHVua1ByaW9yaXR5UXVldWUxKENodW5rLnByaW9yaXR5TGVzcykKICAgICAgICBdOwogICAgICAgIHRoaXMuY29tcHV0ZUV2aWN0aW9uUXVldWUgPSBtYWtlQ2h1bmtQcmlvcml0eVF1ZXVlMShDaHVuay5wcmlvcml0eUxlc3MpOwogICAgICAgIHRoaXMuc3lzdGVtTWVtb3J5RXZpY3Rpb25RdWV1ZSA9IG1ha2VDaHVua1ByaW9yaXR5UXVldWUwKENodW5rLnByaW9yaXR5TGVzcyk7CiAgICAgICAgdGhpcy5ncHVNZW1vcnlQcm9tb3Rpb25RdWV1ZSA9IG1ha2VDaHVua1ByaW9yaXR5UXVldWUxKENodW5rLnByaW9yaXR5R3JlYXRlcik7CiAgICAgICAgdGhpcy5ncHVNZW1vcnlFdmljdGlvblF1ZXVlID0gbWFrZUNodW5rUHJpb3JpdHlRdWV1ZTEoQ2h1bmsucHJpb3JpdHlMZXNzKTsKICAgICAgICB0aGlzLnVwZGF0ZVBlbmRpbmcgPSBudWxsOwogICAgICAgIHRoaXMuZ3B1TWVtb3J5Q2hhbmdlZCA9IG5ldyBOdWxsYXJ5U2lnbmFsKCk7CiAgICAgICAgdGhpcy5udW1RdWV1ZWQgPSAwOwogICAgICAgIHRoaXMubnVtRmFpbGVkID0gMDsKICAgICAgICB0aGlzLmdwdU1lbW9yeUdlbmVyYXRpb24gPSAwOwogICAgICAgIGNvbnN0IGdldENhcGFjaXR5ID0gKGNhcGFjaXR5KSA9PiB7CiAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIobmV3IEF2YWlsYWJsZUNhcGFjaXR5KHJwYzIuZ2V0KGNhcGFjaXR5WyJpdGVtTGltaXQiXSksIHJwYzIuZ2V0KGNhcGFjaXR5WyJzaXplTGltaXQiXSkpKTsKICAgICAgICAgIHJlc3VsdC5jYXBhY2l0eUNoYW5nZWQuYWRkKCgpID0+IHRoaXMuc2NoZWR1bGVVcGRhdGUoKSk7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH07CiAgICAgICAgdGhpcy5ncHVNZW1vcnlDYXBhY2l0eSA9IGdldENhcGFjaXR5KG9wdGlvbnNbImdwdU1lbW9yeUNhcGFjaXR5Il0pOwogICAgICAgIHRoaXMuc3lzdGVtTWVtb3J5Q2FwYWNpdHkgPSBnZXRDYXBhY2l0eShvcHRpb25zWyJzeXN0ZW1NZW1vcnlDYXBhY2l0eSJdKTsKICAgICAgICB0aGlzLmVuYWJsZVByZWZldGNoID0gcnBjMi5nZXQob3B0aW9uc1siZW5hYmxlUHJlZmV0Y2giXSk7CiAgICAgICAgdGhpcy5kb3dubG9hZENhcGFjaXR5ID0gWwogICAgICAgICAgZ2V0Q2FwYWNpdHkob3B0aW9uc1siZG93bmxvYWRDYXBhY2l0eSJdKSwKICAgICAgICAgIGdldENhcGFjaXR5KG9wdGlvbnNbImRvd25sb2FkQ2FwYWNpdHkiXSkKICAgICAgICBdOwogICAgICAgIHRoaXMuY29tcHV0ZUNhcGFjaXR5ID0gZ2V0Q2FwYWNpdHkob3B0aW9uc1siY29tcHV0ZUNhcGFjaXR5Il0pOwogICAgICB9CiAgICAgIHNjaGVkdWxlVXBkYXRlKCkgewogICAgICAgIGlmICh0aGlzLnVwZGF0ZVBlbmRpbmcgPT09IG51bGwpIHsKICAgICAgICAgIHRoaXMudXBkYXRlUGVuZGluZyA9IHNldFRpbWVvdXQodGhpcy5wcm9jZXNzLmJpbmQodGhpcyksIDApOwogICAgICAgIH0KICAgICAgfQogICAgICAqY2h1bmtRdWV1ZXNGb3JDaHVuayhjaHVuaykgewogICAgICAgIHN3aXRjaCAoY2h1bmsuc3RhdGUpIHsKICAgICAgICAgIGNhc2UgQ2h1bmtTdGF0ZS5RVUVVRUQ6CiAgICAgICAgICAgIGlmIChjaHVuay5pc0NvbXB1dGF0aW9uYWwpIHsKICAgICAgICAgICAgICB5aWVsZCB0aGlzLnF1ZXVlZENvbXB1dGVQcm9tb3Rpb25RdWV1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB5aWVsZCB0aGlzLnF1ZXVlZERvd25sb2FkUHJvbW90aW9uUXVldWVbY2h1bmsuc291cmNlLnNvdXJjZVF1ZXVlTGV2ZWxdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBDaHVua1N0YXRlLkRPV05MT0FESU5HOgogICAgICAgICAgICBpZiAoY2h1bmsuaXNDb21wdXRhdGlvbmFsKSB7CiAgICAgICAgICAgICAgeWllbGQgdGhpcy5jb21wdXRlRXZpY3Rpb25RdWV1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB5aWVsZCB0aGlzLmRvd25sb2FkRXZpY3Rpb25RdWV1ZVtjaHVuay5zb3VyY2Uuc291cmNlUXVldWVMZXZlbF07CiAgICAgICAgICAgICAgeWllbGQgdGhpcy5zeXN0ZW1NZW1vcnlFdmljdGlvblF1ZXVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBDaHVua1N0YXRlLlNZU1RFTV9NRU1PUllfV09SS0VSOgogICAgICAgICAgY2FzZSBDaHVua1N0YXRlLlNZU1RFTV9NRU1PUlk6CiAgICAgICAgICAgIHlpZWxkIHRoaXMuc3lzdGVtTWVtb3J5RXZpY3Rpb25RdWV1ZTsKICAgICAgICAgICAgaWYgKGNodW5rLnByaW9yaXR5VGllciAhPT0gQ2h1bmtQcmlvcml0eVRpZXIuUkVDRU5UICYmICFjaHVuay5iYWNrZW5kT25seSAmJiBjaHVuay5yZXF1ZXN0ZWRUb0Zyb250ZW5kKSB7CiAgICAgICAgICAgICAgeWllbGQgdGhpcy5ncHVNZW1vcnlQcm9tb3Rpb25RdWV1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgQ2h1bmtTdGF0ZS5HUFVfTUVNT1JZOgogICAgICAgICAgICB5aWVsZCB0aGlzLnN5c3RlbU1lbW9yeUV2aWN0aW9uUXVldWU7CiAgICAgICAgICAgIHlpZWxkIHRoaXMuZ3B1TWVtb3J5RXZpY3Rpb25RdWV1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkanVzdENhcGFjaXRpZXNGb3JDaHVuayhjaHVuaywgYWRkNykgewogICAgICAgIGxldCBmYWN0b3IgPSBhZGQ3ID8gLTEgOiAxOwogICAgICAgIHN3aXRjaCAoY2h1bmsuc3RhdGUpIHsKICAgICAgICAgIGNhc2UgQ2h1bmtTdGF0ZS5GQUlMRUQ6CiAgICAgICAgICAgIHRoaXMubnVtRmFpbGVkIC09IGZhY3RvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIENodW5rU3RhdGUuUVVFVUVEOgogICAgICAgICAgICB0aGlzLm51bVF1ZXVlZCAtPSBmYWN0b3I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBDaHVua1N0YXRlLkRPV05MT0FESU5HOgogICAgICAgICAgICAoY2h1bmsuaXNDb21wdXRhdGlvbmFsID8gdGhpcy5jb21wdXRlQ2FwYWNpdHkgOiB0aGlzLmRvd25sb2FkQ2FwYWNpdHlbY2h1bmsuc291cmNlLnNvdXJjZVF1ZXVlTGV2ZWxdKS5hZGp1c3QoZmFjdG9yICogY2h1bmsuZG93bmxvYWRTbG90cywgZmFjdG9yICogY2h1bmsuc3lzdGVtTWVtb3J5Qnl0ZXMpOwogICAgICAgICAgICB0aGlzLnN5c3RlbU1lbW9yeUNhcGFjaXR5LmFkanVzdChmYWN0b3IsIGZhY3RvciAqIGNodW5rLnN5c3RlbU1lbW9yeUJ5dGVzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIENodW5rU3RhdGUuU1lTVEVNX01FTU9SWToKICAgICAgICAgIGNhc2UgQ2h1bmtTdGF0ZS5TWVNURU1fTUVNT1JZX1dPUktFUjoKICAgICAgICAgICAgdGhpcy5zeXN0ZW1NZW1vcnlDYXBhY2l0eS5hZGp1c3QoZmFjdG9yLCBmYWN0b3IgKiBjaHVuay5zeXN0ZW1NZW1vcnlCeXRlcyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBDaHVua1N0YXRlLkdQVV9NRU1PUlk6CiAgICAgICAgICAgIHRoaXMuc3lzdGVtTWVtb3J5Q2FwYWNpdHkuYWRqdXN0KGZhY3RvciwgZmFjdG9yICogY2h1bmsuc3lzdGVtTWVtb3J5Qnl0ZXMpOwogICAgICAgICAgICB0aGlzLmdwdU1lbW9yeUNhcGFjaXR5LmFkanVzdChmYWN0b3IsIGZhY3RvciAqIGNodW5rLmdwdU1lbW9yeUJ5dGVzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlbW92ZUNodW5rRnJvbVF1ZXVlc18oY2h1bmspIHsKICAgICAgICB1cGRhdGVDaHVua1N0YXRpc3RpY3MoY2h1bmssIC0xKTsKICAgICAgICBmb3IgKGxldCBxdWV1ZSBvZiB0aGlzLmNodW5rUXVldWVzRm9yQ2h1bmsoY2h1bmspKSB7CiAgICAgICAgICBxdWV1ZS5kZWxldGUoY2h1bmspOwogICAgICAgIH0KICAgICAgfQogICAgICBhZGRDaHVua1RvUXVldWVzXyhjaHVuaykgewogICAgICAgIGlmIChjaHVuay5zdGF0ZSA9PT0gQ2h1bmtTdGF0ZS5RVUVVRUQgJiYgY2h1bmsucHJpb3JpdHlUaWVyID09PSBDaHVua1ByaW9yaXR5VGllci5SRUNFTlQpIHsKICAgICAgICAgIGxldCB7IHNvdXJjZSB9ID0gY2h1bms7CiAgICAgICAgICBzb3VyY2UucmVtb3ZlQ2h1bmsoY2h1bmspOwogICAgICAgICAgdGhpcy5hZGp1c3RDYXBhY2l0aWVzRm9yQ2h1bmsoY2h1bmssIGZhbHNlKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdXBkYXRlQ2h1bmtTdGF0aXN0aWNzKGNodW5rLCAxKTsKICAgICAgICAgIGZvciAobGV0IHF1ZXVlIG9mIHRoaXMuY2h1bmtRdWV1ZXNGb3JDaHVuayhjaHVuaykpIHsKICAgICAgICAgICAgcXVldWUuYWRkKGNodW5rKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBwZXJmb3JtQ2h1bmtQcmlvcml0eVVwZGF0ZShjaHVuaykgewogICAgICAgIGlmIChjaHVuay5wcmlvcml0eVRpZXIgPT09IGNodW5rLm5ld1ByaW9yaXR5VGllciAmJiBjaHVuay5wcmlvcml0eSA9PT0gY2h1bmsubmV3UHJpb3JpdHkpIHsKICAgICAgICAgIGNodW5rLm5ld1ByaW9yaXR5VGllciA9IENodW5rUHJpb3JpdHlUaWVyLlJFQ0VOVDsKICAgICAgICAgIGNodW5rLm5ld1ByaW9yaXR5ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnJlbW92ZUNodW5rRnJvbVF1ZXVlc18oY2h1bmspOwogICAgICAgIGNodW5rLnVwZGF0ZVByaW9yaXR5UHJvcGVydGllcygpOwogICAgICAgIGlmIChjaHVuay5zdGF0ZSA9PT0gQ2h1bmtTdGF0ZS5ORVcpIHsKICAgICAgICAgIGNodW5rLnN0YXRlID0gQ2h1bmtTdGF0ZS5RVUVVRUQ7CiAgICAgICAgICB0aGlzLmFkanVzdENhcGFjaXRpZXNGb3JDaHVuayhjaHVuaywgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuYWRkQ2h1bmtUb1F1ZXVlc18oY2h1bmspOwogICAgICB9CiAgICAgIHVwZGF0ZUNodW5rU3RhdGUoY2h1bmssIG5ld1N0YXRlKSB7CiAgICAgICAgaWYgKG5ld1N0YXRlID09PSBjaHVuay5zdGF0ZSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmFkanVzdENhcGFjaXRpZXNGb3JDaHVuayhjaHVuaywgZmFsc2UpOwogICAgICAgIHRoaXMucmVtb3ZlQ2h1bmtGcm9tUXVldWVzXyhjaHVuayk7CiAgICAgICAgY2h1bmsuc3RhdGUgPSBuZXdTdGF0ZTsKICAgICAgICB0aGlzLmFkanVzdENhcGFjaXRpZXNGb3JDaHVuayhjaHVuaywgdHJ1ZSk7CiAgICAgICAgdGhpcy5hZGRDaHVua1RvUXVldWVzXyhjaHVuayk7CiAgICAgICAgdGhpcy5zY2hlZHVsZVVwZGF0ZSgpOwogICAgICB9CiAgICAgIHByb2Nlc3NHUFVQcm9tb3Rpb25zXygpIHsKICAgICAgICBsZXQgcXVldWVNYW5hZ2VyID0gdGhpczsKICAgICAgICBmdW5jdGlvbiBldmljdEZyb21HUFVNZW1vcnkoY2h1bmspIHsKICAgICAgICAgIHF1ZXVlTWFuYWdlci5mcmVlQ2h1bmtHUFVNZW1vcnkoY2h1bmspOwogICAgICAgICAgY2h1bmsuc291cmNlLmNodW5rTWFuYWdlci5xdWV1ZU1hbmFnZXIudXBkYXRlQ2h1bmtTdGF0ZShjaHVuaywgQ2h1bmtTdGF0ZS5TWVNURU1fTUVNT1JZKTsKICAgICAgICB9CiAgICAgICAgbGV0IHByb21vdGlvbkNhbmRpZGF0ZXMgPSB0aGlzLmdwdU1lbW9yeVByb21vdGlvblF1ZXVlLmNhbmRpZGF0ZXMoKTsKICAgICAgICBsZXQgZXZpY3Rpb25DYW5kaWRhdGVzID0gdGhpcy5ncHVNZW1vcnlFdmljdGlvblF1ZXVlLmNhbmRpZGF0ZXMoKTsKICAgICAgICBsZXQgY2FwYWNpdHkgPSB0aGlzLmdwdU1lbW9yeUNhcGFjaXR5OwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICBsZXQgcHJvbW90aW9uQ2FuZGlkYXRlID0gcHJvbW90aW9uQ2FuZGlkYXRlcy5uZXh0KCkudmFsdWU7CiAgICAgICAgICBpZiAocHJvbW90aW9uQ2FuZGlkYXRlID09PSB2b2lkIDApIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZXQgcHJpb3JpdHlUaWVyID0gcHJvbW90aW9uQ2FuZGlkYXRlLnByaW9yaXR5VGllcjsKICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gcHJvbW90aW9uQ2FuZGlkYXRlLnByaW9yaXR5OwogICAgICAgICAgICBpZiAoIXRyeVRvRnJlZUNhcGFjaXR5KHByb21vdGlvbkNhbmRpZGF0ZS5ncHVNZW1vcnlCeXRlcywgY2FwYWNpdHksIHByaW9yaXR5VGllciwgcHJpb3JpdHksIGV2aWN0aW9uQ2FuZGlkYXRlcywgZXZpY3RGcm9tR1BVTWVtb3J5KSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuY29weUNodW5rVG9HUFUocHJvbW90aW9uQ2FuZGlkYXRlKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVDaHVua1N0YXRlKHByb21vdGlvbkNhbmRpZGF0ZSwgQ2h1bmtTdGF0ZS5HUFVfTUVNT1JZKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZnJlZUNodW5rR1BVTWVtb3J5KGNodW5rKSB7CiAgICAgICAgKyt0aGlzLmdwdU1lbW9yeUdlbmVyYXRpb247CiAgICAgICAgdGhpcy5ycGMuaW52b2tlKCJDaHVuay51cGRhdGUiLCB7ICJpZCI6IGNodW5rLmtleSwgInN0YXRlIjogQ2h1bmtTdGF0ZS5TWVNURU1fTUVNT1JZLCAic291cmNlIjogY2h1bmsuc291cmNlLnJwY0lkIH0pOwogICAgICB9CiAgICAgIGZyZWVDaHVua1N5c3RlbU1lbW9yeShjaHVuaykgewogICAgICAgIGlmIChjaHVuay5zdGF0ZSA9PT0gQ2h1bmtTdGF0ZS5TWVNURU1fTUVNT1JZX1dPUktFUikgewogICAgICAgICAgY2h1bmsuZnJlZVN5c3RlbU1lbW9yeSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnJwYy5pbnZva2UoIkNodW5rLnVwZGF0ZSIsIHsgImlkIjogY2h1bmsua2V5LCAic3RhdGUiOiBDaHVua1N0YXRlLkVYUElSRUQsICJzb3VyY2UiOiBjaHVuay5zb3VyY2UucnBjSWQgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHJpZXZlQ2h1bmtEYXRhKGNodW5rKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucnBjLnByb21pc2VJbnZva2UoIkNodW5rLnJldHJpZXZlIiwgeyBrZXk6IGNodW5rLmtleSwgc291cmNlOiBjaHVuay5zb3VyY2UucnBjSWQgfSk7CiAgICAgIH0KICAgICAgY29weUNodW5rVG9HUFUoY2h1bmspIHsKICAgICAgICArK3RoaXMuZ3B1TWVtb3J5R2VuZXJhdGlvbjsKICAgICAgICBsZXQgcnBjMiA9IHRoaXMucnBjOwogICAgICAgIGlmIChjaHVuay5zdGF0ZSA9PT0gQ2h1bmtTdGF0ZS5TWVNURU1fTUVNT1JZKSB7CiAgICAgICAgICBycGMyLmludm9rZSgiQ2h1bmsudXBkYXRlIiwgeyAiaWQiOiBjaHVuay5rZXksICJzb3VyY2UiOiBjaHVuay5zb3VyY2UucnBjSWQsICJzdGF0ZSI6IENodW5rU3RhdGUuR1BVX01FTU9SWSB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV0IG1zZyA9IHt9OwogICAgICAgICAgbGV0IHRyYW5zZmVycyA9IFtdOwogICAgICAgICAgY2h1bmsuc2VyaWFsaXplKG1zZywgdHJhbnNmZXJzKTsKICAgICAgICAgIG1zZ1sic3RhdGUiXSA9IENodW5rU3RhdGUuR1BVX01FTU9SWTsKICAgICAgICAgIHJwYzIuaW52b2tlKCJDaHVuay51cGRhdGUiLCBtc2csIHRyYW5zZmVycyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHByb2Nlc3NRdWV1ZVByb21vdGlvbnNfKCkgewogICAgICAgIGxldCBxdWV1ZU1hbmFnZXIgPSB0aGlzOwogICAgICAgIGNvbnN0IGV2aWN0ID0gKGNodW5rKSA9PiB7CiAgICAgICAgICBzd2l0Y2ggKGNodW5rLnN0YXRlKSB7CiAgICAgICAgICAgIGNhc2UgQ2h1bmtTdGF0ZS5ET1dOTE9BRElORzoKICAgICAgICAgICAgICBjYW5jZWxDaHVua0Rvd25sb2FkKGNodW5rKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBDaHVua1N0YXRlLkdQVV9NRU1PUlk6CiAgICAgICAgICAgICAgcXVldWVNYW5hZ2VyLmZyZWVDaHVua0dQVU1lbW9yeShjaHVuayk7CiAgICAgICAgICAgIGNhc2UgQ2h1bmtTdGF0ZS5TWVNURU1fTUVNT1JZX1dPUktFUjoKICAgICAgICAgICAgY2FzZSBDaHVua1N0YXRlLlNZU1RFTV9NRU1PUlk6CiAgICAgICAgICAgICAgcXVldWVNYW5hZ2VyLmZyZWVDaHVua1N5c3RlbU1lbW9yeShjaHVuayk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnVwZGF0ZUNodW5rU3RhdGUoY2h1bmssIENodW5rU3RhdGUuUVVFVUVEKTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IHByb21vdGlvbkxhbWJkYSA9IChwcm9tb3Rpb25DYW5kaWRhdGVzLCBldmljdGlvbkNhbmRpZGF0ZXMsIGNhcGFjaXR5KSA9PiB7CiAgICAgICAgICBsZXQgc3lzdGVtTWVtb3J5RXZpY3Rpb25DYW5kaWRhdGVzID0gdGhpcy5zeXN0ZW1NZW1vcnlFdmljdGlvblF1ZXVlLmNhbmRpZGF0ZXMoKTsKICAgICAgICAgIGxldCBzeXN0ZW1NZW1vcnlDYXBhY2l0eSA9IHRoaXMuc3lzdGVtTWVtb3J5Q2FwYWNpdHk7CiAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICBsZXQgcHJvbW90aW9uQ2FuZGlkYXRlUmVzdWx0ID0gcHJvbW90aW9uQ2FuZGlkYXRlcy5uZXh0KCk7CiAgICAgICAgICAgIGlmIChwcm9tb3Rpb25DYW5kaWRhdGVSZXN1bHQuZG9uZSkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgcHJvbW90aW9uQ2FuZGlkYXRlID0gcHJvbW90aW9uQ2FuZGlkYXRlUmVzdWx0LnZhbHVlOwogICAgICAgICAgICBjb25zdCBzaXplID0gMDsKICAgICAgICAgICAgbGV0IHByaW9yaXR5VGllciA9IHByb21vdGlvbkNhbmRpZGF0ZS5wcmlvcml0eVRpZXI7CiAgICAgICAgICAgIGxldCBwcmlvcml0eSA9IHByb21vdGlvbkNhbmRpZGF0ZS5wcmlvcml0eTsKICAgICAgICAgICAgaWYgKCF0cnlUb0ZyZWVDYXBhY2l0eShzaXplLCBjYXBhY2l0eSwgcHJpb3JpdHlUaWVyLCBwcmlvcml0eSwgZXZpY3Rpb25DYW5kaWRhdGVzLCBldmljdCkpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0cnlUb0ZyZWVDYXBhY2l0eShzaXplLCBzeXN0ZW1NZW1vcnlDYXBhY2l0eSwgcHJpb3JpdHlUaWVyLCBwcmlvcml0eSwgc3lzdGVtTWVtb3J5RXZpY3Rpb25DYW5kaWRhdGVzLCBldmljdCkpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy51cGRhdGVDaHVua1N0YXRlKHByb21vdGlvbkNhbmRpZGF0ZSwgQ2h1bmtTdGF0ZS5ET1dOTE9BRElORyk7CiAgICAgICAgICAgIHN0YXJ0Q2h1bmtEb3dubG9hZChwcm9tb3Rpb25DYW5kaWRhdGUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgZm9yIChsZXQgc291cmNlUXVldWVMZXZlbCA9IDA7IHNvdXJjZVF1ZXVlTGV2ZWwgPCBudW1Tb3VyY2VRdWV1ZUxldmVsczsgKytzb3VyY2VRdWV1ZUxldmVsKSB7CiAgICAgICAgICBwcm9tb3Rpb25MYW1iZGEodGhpcy5xdWV1ZWREb3dubG9hZFByb21vdGlvblF1ZXVlW3NvdXJjZVF1ZXVlTGV2ZWxdLmNhbmRpZGF0ZXMoKSwgdGhpcy5kb3dubG9hZEV2aWN0aW9uUXVldWVbc291cmNlUXVldWVMZXZlbF0uY2FuZGlkYXRlcygpLCB0aGlzLmRvd25sb2FkQ2FwYWNpdHlbc291cmNlUXVldWVMZXZlbF0pOwogICAgICAgIH0KICAgICAgICBwcm9tb3Rpb25MYW1iZGEodGhpcy5xdWV1ZWRDb21wdXRlUHJvbW90aW9uUXVldWUuY2FuZGlkYXRlcygpLCB0aGlzLmNvbXB1dGVFdmljdGlvblF1ZXVlLmNhbmRpZGF0ZXMoKSwgdGhpcy5jb21wdXRlQ2FwYWNpdHkpOwogICAgICB9CiAgICAgIHByb2Nlc3MoKSB7CiAgICAgICAgaWYgKCF0aGlzLnVwZGF0ZVBlbmRpbmcpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy51cGRhdGVQZW5kaW5nID0gbnVsbDsKICAgICAgICBjb25zdCBncHVNZW1vcnlHZW5lcmF0aW9uID0gdGhpcy5ncHVNZW1vcnlHZW5lcmF0aW9uOwogICAgICAgIHRoaXMucHJvY2Vzc0dQVVByb21vdGlvbnNfKCk7CiAgICAgICAgdGhpcy5wcm9jZXNzUXVldWVQcm9tb3Rpb25zXygpOwogICAgICAgIHRoaXMubG9nU3RhdGlzdGljcygpOwogICAgICAgIGlmICh0aGlzLmdwdU1lbW9yeUdlbmVyYXRpb24gIT09IGdwdU1lbW9yeUdlbmVyYXRpb24pIHsKICAgICAgICAgIHRoaXMuZ3B1TWVtb3J5Q2hhbmdlZC5kaXNwYXRjaCgpOwogICAgICAgIH0KICAgICAgfQogICAgICBsb2dTdGF0aXN0aWNzKCkgewogICAgICB9CiAgICAgIGludmFsaWRhdGVTb3VyY2VDYWNoZShzb3VyY2UpIHsKICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHNvdXJjZS5jaHVua3MudmFsdWVzKCkpIHsKICAgICAgICAgIHN3aXRjaCAoY2h1bmsuc3RhdGUpIHsKICAgICAgICAgICAgY2FzZSBDaHVua1N0YXRlLkRPV05MT0FESU5HOgogICAgICAgICAgICAgIGNhbmNlbENodW5rRG93bmxvYWQoY2h1bmspOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIENodW5rU3RhdGUuU1lTVEVNX01FTU9SWV9XT1JLRVI6CiAgICAgICAgICAgICAgY2h1bmsuZnJlZVN5c3RlbU1lbW9yeSgpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy51cGRhdGVDaHVua1N0YXRlKGNodW5rLCBDaHVua1N0YXRlLlFVRVVFRCk7CiAgICAgICAgfQogICAgICAgIHRoaXMucnBjLmludm9rZSgiQ2h1bmsudXBkYXRlIiwgeyAic291cmNlIjogc291cmNlLnJwY0lkIH0pOwogICAgICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTsKICAgICAgfQogICAgfTsKICAgIENodW5rUXVldWVNYW5hZ2VyID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoQ0hVTktfUVVFVUVfTUFOQUdFUl9SUENfSUQpCiAgICBdLCBDaHVua1F1ZXVlTWFuYWdlcik7CiAgICB2YXIgQ2h1bmtSZW5kZXJMYXllckJhY2tlbmQgPSBjbGFzcyBleHRlbmRzIFNoYXJlZE9iamVjdENvdW50ZXJwYXJ0IHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICB0aGlzLmNodW5rTWFuYWdlckdlbmVyYXRpb24gPSAtMTsKICAgICAgICB0aGlzLm51bVZpc2libGVDaHVua3NOZWVkZWQgPSAwOwogICAgICAgIHRoaXMubnVtVmlzaWJsZUNodW5rc0F2YWlsYWJsZSA9IDA7CiAgICAgICAgdGhpcy5udW1QcmVmZXRjaENodW5rc05lZWRlZCA9IDA7CiAgICAgICAgdGhpcy5udW1QcmVmZXRjaENodW5rc0F2YWlsYWJsZSA9IDA7CiAgICAgIH0KICAgIH07CiAgICB2YXIgTEFZRVJfQ0hVTktfU1RBVElTVElDU19JTlRFUlZBTCA9IDIwMDsKICAgIHZhciBDaHVua01hbmFnZXIgPSBjbGFzcyBleHRlbmRzIFNoYXJlZE9iamVjdENvdW50ZXJwYXJ0IHsKICAgICAgY29uc3RydWN0b3IocnBjMiwgb3B0aW9ucykgewogICAgICAgIHN1cGVyKHJwYzIsIG9wdGlvbnMpOwogICAgICAgIHRoaXMuZXhpc3RpbmdUaWVyQ2h1bmtzID0gW107CiAgICAgICAgdGhpcy5uZXdUaWVyQ2h1bmtzID0gW107CiAgICAgICAgdGhpcy51cGRhdGVQZW5kaW5nID0gbnVsbDsKICAgICAgICB0aGlzLnJlY29tcHV0ZUNodW5rUHJpb3JpdGllcyA9IG5ldyBOdWxsYXJ5U2lnbmFsKCk7CiAgICAgICAgdGhpcy5yZWNvbXB1dGVDaHVua1ByaW9yaXRpZXNMYXRlID0gbmV3IE51bGxhcnlTaWduYWwoKTsKICAgICAgICB0aGlzLm1lbW9pemUgPSBuZXcgU3RyaW5nTWVtb2l6ZSgpOwogICAgICAgIHRoaXMubGF5ZXJzID0gW107CiAgICAgICAgdGhpcy5zZW5kTGF5ZXJDaHVua1N0YXRpc3RpY3MgPSB0aGlzLnJlZ2lzdGVyQ2FuY2VsbGFibGUoKDAsIGltcG9ydF90aHJvdHRsZS5kZWZhdWx0KSgoKSA9PiB7CiAgICAgICAgICB0aGlzLnJwYy5pbnZva2UoQ0hVTktfTEFZRVJfU1RBVElTVElDU19SUENfSUQsIHsKICAgICAgICAgICAgaWQ6IHRoaXMucnBjSWQsCiAgICAgICAgICAgIGxheWVyczogdGhpcy5sYXllcnMubWFwKChsYXllcikgPT4gKHsKICAgICAgICAgICAgICBpZDogbGF5ZXIucnBjSWQsCiAgICAgICAgICAgICAgbnVtVmlzaWJsZUNodW5rc0F2YWlsYWJsZTogbGF5ZXIubnVtVmlzaWJsZUNodW5rc0F2YWlsYWJsZSwKICAgICAgICAgICAgICBudW1WaXNpYmxlQ2h1bmtzTmVlZGVkOiBsYXllci5udW1WaXNpYmxlQ2h1bmtzTmVlZGVkLAogICAgICAgICAgICAgIG51bVByZWZldGNoQ2h1bmtzQXZhaWxhYmxlOiBsYXllci5udW1QcmVmZXRjaENodW5rc0F2YWlsYWJsZSwKICAgICAgICAgICAgICBudW1QcmVmZXRjaENodW5rc05lZWRlZDogbGF5ZXIubnVtUHJlZmV0Y2hDaHVua3NOZWVkZWQKICAgICAgICAgICAgfSkpCiAgICAgICAgICB9KTsKICAgICAgICB9LCBMQVlFUl9DSFVOS19TVEFUSVNUSUNTX0lOVEVSVkFMKSk7CiAgICAgICAgdGhpcy5xdWV1ZU1hbmFnZXIgPSBycGMyLmdldChvcHRpb25zWyJjaHVua1F1ZXVlTWFuYWdlciJdKS5hZGRSZWYoKTsKICAgICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIodGhpcy5xdWV1ZU1hbmFnZXIuZ3B1TWVtb3J5Q2hhbmdlZC5hZGQodGhpcy5yZWdpc3RlckNhbmNlbGxhYmxlKCgwLCBpbXBvcnRfdGhyb3R0bGUuZGVmYXVsdCkoKCkgPT4gdGhpcy5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpLCBMQVlFUl9DSFVOS19TVEFUSVNUSUNTX0lOVEVSVkFMLCB7IGxlYWRpbmc6IGZhbHNlLCB0cmFpbGluZzogdHJ1ZSB9KSkpKTsKICAgICAgICBmb3IgKGxldCB0aWVyID0gQ2h1bmtQcmlvcml0eVRpZXIuRklSU1RfVElFUjsgdGllciA8PSBDaHVua1ByaW9yaXR5VGllci5MQVNUX1RJRVI7ICsrdGllcikgewogICAgICAgICAgaWYgKHRpZXIgPT09IENodW5rUHJpb3JpdHlUaWVyLlJFQ0VOVCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZXhpc3RpbmdUaWVyQ2h1bmtzW3RpZXJdID0gW107CiAgICAgICAgfQogICAgICB9CiAgICAgIHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKCkgewogICAgICAgIGlmICh0aGlzLnVwZGF0ZVBlbmRpbmcgPT09IG51bGwpIHsKICAgICAgICAgIHRoaXMudXBkYXRlUGVuZGluZyA9IHNldFRpbWVvdXQodGhpcy5yZWNvbXB1dGVDaHVua1ByaW9yaXRpZXNfLmJpbmQodGhpcyksIDApOwogICAgICAgIH0KICAgICAgfQogICAgICByZWdpc3RlckxheWVyKGxheWVyKSB7CiAgICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMucmVjb21wdXRlQ2h1bmtQcmlvcml0aWVzLmNvdW50OwogICAgICAgIGlmIChsYXllci5jaHVua01hbmFnZXJHZW5lcmF0aW9uICE9PSBnZW5lcmF0aW9uKSB7CiAgICAgICAgICBsYXllci5jaHVua01hbmFnZXJHZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKICAgICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5ZXIpOwogICAgICAgICAgbGF5ZXIubnVtVmlzaWJsZUNodW5rc0F2YWlsYWJsZSA9IDA7CiAgICAgICAgICBsYXllci5udW1WaXNpYmxlQ2h1bmtzTmVlZGVkID0gMDsKICAgICAgICAgIGxheWVyLm51bVByZWZldGNoQ2h1bmtzQXZhaWxhYmxlID0gMDsKICAgICAgICAgIGxheWVyLm51bVByZWZldGNoQ2h1bmtzTmVlZGVkID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVjb21wdXRlQ2h1bmtQcmlvcml0aWVzXygpIHsKICAgICAgICB0aGlzLnVwZGF0ZVBlbmRpbmcgPSBudWxsOwogICAgICAgIHRoaXMubGF5ZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgdGhpcy5yZWNvbXB1dGVDaHVua1ByaW9yaXRpZXMuZGlzcGF0Y2goKTsKICAgICAgICB0aGlzLnJlY29tcHV0ZUNodW5rUHJpb3JpdGllc0xhdGUuZGlzcGF0Y2goKTsKICAgICAgICB0aGlzLnVwZGF0ZVF1ZXVlU3RhdGUoW0NodW5rUHJpb3JpdHlUaWVyLlZJU0lCTEUsIENodW5rUHJpb3JpdHlUaWVyLlBSRUZFVENIXSk7CiAgICAgICAgdGhpcy5zZW5kTGF5ZXJDaHVua1N0YXRpc3RpY3MoKTsKICAgICAgfQogICAgICByZXF1ZXN0Q2h1bmsoY2h1bmssIHRpZXIsIHByaW9yaXR5LCB0b0Zyb250ZW5kID0gdHJ1ZSkgewogICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHByaW9yaXR5KSkgewogICAgICAgICAgZGVidWdnZXI7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh0aWVyID09PSBDaHVua1ByaW9yaXR5VGllci5SRUNFTlQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTm90IGdvaW5nIHRvIHJlcXVlc3QgYSBjaHVuayB3aXRoIHRoZSBSRUNFTlQgdGllciIpOwogICAgICAgIH0KICAgICAgICBjaHVuay5uZXdseVJlcXVlc3RlZFRvRnJvbnRlbmQgPSBjaHVuay5uZXdseVJlcXVlc3RlZFRvRnJvbnRlbmQgfHwgdG9Gcm9udGVuZDsKICAgICAgICBpZiAoY2h1bmsubmV3UHJpb3JpdHlUaWVyID09PSBDaHVua1ByaW9yaXR5VGllci5SRUNFTlQpIHsKICAgICAgICAgIHRoaXMubmV3VGllckNodW5rcy5wdXNoKGNodW5rKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbmV3UHJpb3JpdHlUaWVyID0gY2h1bmsubmV3UHJpb3JpdHlUaWVyOwogICAgICAgIGlmICh0aWVyIDwgbmV3UHJpb3JpdHlUaWVyIHx8IHRpZXIgPT09IG5ld1ByaW9yaXR5VGllciAmJiBwcmlvcml0eSA+IGNodW5rLm5ld1ByaW9yaXR5KSB7CiAgICAgICAgICBjaHVuay5uZXdQcmlvcml0eVRpZXIgPSB0aWVyOwogICAgICAgICAgY2h1bmsubmV3UHJpb3JpdHkgPSBwcmlvcml0eTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdXBkYXRlUXVldWVTdGF0ZSh0aWVycykgewogICAgICAgIGxldCBleGlzdGluZ1RpZXJDaHVua3MgPSB0aGlzLmV4aXN0aW5nVGllckNodW5rczsKICAgICAgICBsZXQgcXVldWVNYW5hZ2VyID0gdGhpcy5xdWV1ZU1hbmFnZXI7CiAgICAgICAgZm9yIChsZXQgdGllciBvZiB0aWVycykgewogICAgICAgICAgbGV0IGNodW5rcyA9IGV4aXN0aW5nVGllckNodW5rc1t0aWVyXTsKICAgICAgICAgIGZvciAobGV0IGNodW5rIG9mIGNodW5rcykgewogICAgICAgICAgICBpZiAoY2h1bmsubmV3UHJpb3JpdHlUaWVyID09PSBDaHVua1ByaW9yaXR5VGllci5SRUNFTlQpIHsKICAgICAgICAgICAgICBxdWV1ZU1hbmFnZXIucGVyZm9ybUNodW5rUHJpb3JpdHlVcGRhdGUoY2h1bmspOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjaHVua3MubGVuZ3RoID0gMDsKICAgICAgICB9CiAgICAgICAgbGV0IG5ld1RpZXJDaHVua3MgPSB0aGlzLm5ld1RpZXJDaHVua3M7CiAgICAgICAgZm9yIChsZXQgY2h1bmsgb2YgbmV3VGllckNodW5rcykgewogICAgICAgICAgcXVldWVNYW5hZ2VyLnBlcmZvcm1DaHVua1ByaW9yaXR5VXBkYXRlKGNodW5rKTsKICAgICAgICAgIGV4aXN0aW5nVGllckNodW5rc1tjaHVuay5wcmlvcml0eVRpZXJdLnB1c2goY2h1bmspOwogICAgICAgIH0KICAgICAgICBuZXdUaWVyQ2h1bmtzLmxlbmd0aCA9IDA7CiAgICAgICAgdGhpcy5xdWV1ZU1hbmFnZXIuc2NoZWR1bGVVcGRhdGUoKTsKICAgICAgfQogICAgfTsKICAgIENodW5rTWFuYWdlciA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KENIVU5LX01BTkFHRVJfUlBDX0lEKQogICAgXSwgQ2h1bmtNYW5hZ2VyKTsKICAgIGZ1bmN0aW9uIFdpdGhQYXJhbWV0ZXJzKEJhc2UsIHBhcmFtZXRlcnNDb25zdHJ1Y3RvcikgewogICAgICBsZXQgQyA9IGNsYXNzIGV4dGVuZHMgQmFzZSB7CiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgc3VwZXIoLi4uYXJncyk7CiAgICAgICAgICBjb25zdCBvcHRpb25zID0gYXJnc1sxXTsKICAgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IG9wdGlvbnNbInBhcmFtZXRlcnMiXTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEMgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0T3duZXIocGFyYW1ldGVyc0NvbnN0cnVjdG9yLlJQQ19JRCkKICAgICAgXSwgQyk7CiAgICAgIHJldHVybiBDOwogICAgfQogICAgZnVuY3Rpb24gd2l0aENodW5rTWFuYWdlcihCYXNlKSB7CiAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2UgewogICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHsKICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpOwogICAgICAgICAgY29uc3QgcnBjMiA9IGFyZ3NbMF07CiAgICAgICAgICBjb25zdCBvcHRpb25zID0gYXJnc1sxXTsKICAgICAgICAgIHRoaXMuY2h1bmtNYW5hZ2VyID0gcnBjMi5nZXQob3B0aW9uc1siY2h1bmtNYW5hZ2VyIl0pOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIHJlZ2lzdGVyUlBDKENIVU5LX1NPVVJDRV9JTlZBTElEQVRFX1JQQ19JRCwgZnVuY3Rpb24oeCkgewogICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmdldCh4WyJpZCJdKTsKICAgICAgc291cmNlLmNodW5rTWFuYWdlci5xdWV1ZU1hbmFnZXIuaW52YWxpZGF0ZVNvdXJjZUNhY2hlKHNvdXJjZSk7CiAgICB9KTsKICAgIHJlZ2lzdGVyUHJvbWlzZVJQQyhSRVFVRVNUX0NIVU5LX1NUQVRJU1RJQ1NfUlBDX0lELCBmdW5jdGlvbih4KSB7CiAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5nZXQoeC5xdWV1ZSk7CiAgICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgTWFwKCk7CiAgICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHF1ZXVlLnNvdXJjZXMpIHsKICAgICAgICByZXN1bHRzLnNldChzb3VyY2UucnBjSWQsIHNvdXJjZS5zdGF0aXN0aWNzKTsKICAgICAgfQogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgdmFsdWU6IHJlc3VsdHMgfSk7CiAgICB9KTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3JlbmRlcl9sYXllcl9jb21tb24udHMKICAgIHZhciBSRU5ERVJFRF9WSUVXX0FERF9MQVlFUl9SUENfSUQgPSAicmVuZGVyZWRfdmlldy5hZGRMYXllciI7CiAgICB2YXIgUkVOREVSRURfVklFV19SRU1PVkVfTEFZRVJfUlBDX0lEID0gInJlbmRlcmVkX3ZpZXcucmVtb3ZlTGF5ZXIiOwogICAgdmFyIFBST0pFQ1RJT05fUEFSQU1FVEVSU19SUENfSUQgPSAiU2hhcmVkUHJvamVjdGlvblBhcmFtZXRlcnMiOwogICAgdmFyIFBST0pFQ1RJT05fUEFSQU1FVEVSU19DSEFOR0VEX1JQQ19NRVRIT0RfSUQgPSAiU2hhcmVkUHJvamVjdGlvblBhcmFtZXRlcnMuY2hhbmdlZCI7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9yZW5kZXJfbGF5ZXJfYmFja2VuZC50cwogICAgdmFyIFJlbmRlckxheWVyQmFja2VuZEF0dGFjaG1lbnQgPSBjbGFzcyBleHRlbmRzIFJlZkNvdW50ZWQgewogICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLnZpZXcgPSB2aWV3OwogICAgICAgIHRoaXMuc3RhdGUgPSB2b2lkIDA7CiAgICAgIH0KICAgIH07CiAgICB2YXIgUmVuZGVyTGF5ZXJCYWNrZW5kID0gY2xhc3MgZXh0ZW5kcyBDaHVua1JlbmRlckxheWVyQmFja2VuZCB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5hdHRhY2htZW50cyA9IG5ldyBNYXAoKTsKICAgICAgfQogICAgICBhdHRhY2goYXR0YWNobWVudCkgewogICAgICB9CiAgICB9OwogICAgcmVnaXN0ZXJSUEMoUkVOREVSRURfVklFV19BRERfTEFZRVJfUlBDX0lELCBmdW5jdGlvbih4KSB7CiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmdldCh4LnZpZXcpOwogICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0KHgubGF5ZXIpOwogICAgICBjb25zdCBhdHRhY2htZW50ID0gbmV3IFJlbmRlckxheWVyQmFja2VuZEF0dGFjaG1lbnQodmlldyk7CiAgICAgIGxheWVyLmF0dGFjaG1lbnRzLnNldCh2aWV3LCBhdHRhY2htZW50KTsKICAgICAgbGF5ZXIuYXR0YWNoKGF0dGFjaG1lbnQpOwogICAgfSk7CiAgICByZWdpc3RlclJQQyhSRU5ERVJFRF9WSUVXX1JFTU9WRV9MQVlFUl9SUENfSUQsIGZ1bmN0aW9uKHgpIHsKICAgICAgY29uc3QgdmlldyA9IHRoaXMuZ2V0KHgudmlldyk7CiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXQoeC5sYXllcik7CiAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBsYXllci5hdHRhY2htZW50cy5nZXQodmlldyk7CiAgICAgIGxheWVyLmF0dGFjaG1lbnRzLmRlbGV0ZSh2aWV3KTsKICAgICAgYXR0YWNobWVudC5kaXNwb3NlKCk7CiAgICB9KTsKICAgIHZhciBTaGFyZWRQcm9qZWN0aW9uUGFyYW1ldGVyc0JhY2tlbmQgPSBjbGFzcyBleHRlbmRzIFNoYXJlZE9iamVjdENvdW50ZXJwYXJ0IHsKICAgICAgY29uc3RydWN0b3IocnBjMiwgb3B0aW9ucykgewogICAgICAgIHN1cGVyKHJwYzIsIG9wdGlvbnMpOwogICAgICAgIHRoaXMuY2hhbmdlZCA9IG5ldyBTaWduYWwoKTsKICAgICAgICB0aGlzLnZhbHVlID0gb3B0aW9ucy52YWx1ZTsKICAgICAgICB0aGlzLm9sZFZhbHVlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy52YWx1ZSk7CiAgICAgIH0KICAgIH07CiAgICBTaGFyZWRQcm9qZWN0aW9uUGFyYW1ldGVyc0JhY2tlbmQgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdChQUk9KRUNUSU9OX1BBUkFNRVRFUlNfUlBDX0lEKQogICAgXSwgU2hhcmVkUHJvamVjdGlvblBhcmFtZXRlcnNCYWNrZW5kKTsKICAgIHJlZ2lzdGVyUlBDKFBST0pFQ1RJT05fUEFSQU1FVEVSU19DSEFOR0VEX1JQQ19NRVRIT0RfSUQsIGZ1bmN0aW9uKHgpIHsKICAgICAgY29uc3Qgb2JqID0gdGhpcy5nZXQoeC5pZCk7CiAgICAgIGNvbnN0IHsgdmFsdWUsIG9sZFZhbHVlIH0gPSBvYmo7CiAgICAgIE9iamVjdC5hc3NpZ24ob2xkVmFsdWUsIHZhbHVlKTsKICAgICAgT2JqZWN0LmFzc2lnbih2YWx1ZSwgeC52YWx1ZSk7CiAgICAgIG9iai5jaGFuZ2VkLmRpc3BhdGNoKG9sZFZhbHVlLCB2YWx1ZSk7CiAgICB9KTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3RyYWNrYWJsZV92YWx1ZS50cwogICAgdmFyIGltcG9ydF9kZWJvdW5jZSA9IF9fdG9Nb2R1bGUocmVxdWlyZV9kZWJvdW5jZSgpKTsKICAgIHZhciBXYXRjaGFibGVWYWx1ZSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IodmFsdWVfKSB7CiAgICAgICAgdGhpcy52YWx1ZV8gPSB2YWx1ZV87CiAgICAgICAgdGhpcy5jaGFuZ2VkID0gbmV3IE51bGxhcnlTaWduYWwoKTsKICAgICAgfQogICAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVfOwogICAgICB9CiAgICAgIHNldCB2YWx1ZShuZXdWYWx1ZSkgewogICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdGhpcy52YWx1ZV8pIHsKICAgICAgICAgIHRoaXMudmFsdWVfID0gbmV3VmFsdWU7CiAgICAgICAgICB0aGlzLmNoYW5nZWQuZGlzcGF0Y2goKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiByZWdpc3Rlck5lc3RlZChmLCAuLi53YXRjaGFibGVzKSB7CiAgICAgIGxldCB2YWx1ZXMgPSB3YXRjaGFibGVzLm1hcCgodykgPT4gdy52YWx1ZSk7CiAgICAgIGNvbnN0IGNvdW50ID0gd2F0Y2hhYmxlcy5sZW5ndGg7CiAgICAgIGxldCBjb250ZXh0ID0gbmV3IFJlZkNvdW50ZWQoKTsKICAgICAgbGV0IHJlc3VsdCA9IGYoY29udGV4dCwgLi4udmFsdWVzKTsKICAgICAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKDAsIGltcG9ydF9kZWJvdW5jZS5kZWZhdWx0KSgoKSA9PiB7CiAgICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgICAgIGNvbnN0IHdhdGNoYWJsZSA9IHdhdGNoYWJsZXNbaV07CiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHdhdGNoYWJsZS52YWx1ZTsKICAgICAgICAgIGlmICh2YWx1ZXNbaV0gIT09IHZhbHVlKSB7CiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlOwogICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFjaGFuZ2VkKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnRleHQuZGlzcG9zZSgpOwogICAgICAgIGNvbnRleHQgPSBuZXcgUmVmQ291bnRlZCgpOwogICAgICAgIHJlc3VsdCA9IGYoY29udGV4dCwgLi4udmFsdWVzKTsKICAgICAgfSwgMCk7CiAgICAgIGNvbnN0IHNpZ25hbERpc3Bvc2VycyA9IHdhdGNoYWJsZXMubWFwKCh3KSA9PiB3LmNoYW5nZWQuYWRkKGhhbmRsZUNoYW5nZSkpOwogICAgICByZXR1cm4gewogICAgICAgIGZsdXNoKCkgewogICAgICAgICAgaGFuZGxlQ2hhbmdlLmZsdXNoKCk7CiAgICAgICAgfSwKICAgICAgICBkaXNwb3NlKCkgewogICAgICAgICAgaGFuZGxlQ2hhbmdlLmNhbmNlbCgpOwogICAgICAgICAgaW52b2tlRGlzcG9zZXJzKHNpZ25hbERpc3Bvc2Vycyk7CiAgICAgICAgICBjb250ZXh0LmRpc3Bvc2UoKTsKICAgICAgICB9LAogICAgICAgIGdldCB2YWx1ZSgpIHsKICAgICAgICAgIGhhbmRsZUNoYW5nZS5mbHVzaCgpOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL3ZlY3Rvci50cwogICAgZnVuY3Rpb24gYWRkNihvdXQsIGEsIGIpIHsKICAgICAgY29uc3QgcmFuayA9IG91dC5sZW5ndGg7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuazsgKytpKSB7CiAgICAgICAgb3V0W2ldID0gYVtpXSArIGJbaV07CiAgICAgIH0KICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIG11bHRpcGx5NihvdXQsIGEsIGIpIHsKICAgICAgY29uc3QgcmFuayA9IG91dC5sZW5ndGg7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuazsgKytpKSB7CiAgICAgICAgb3V0W2ldID0gYVtpXSAqIGJbaV07CiAgICAgIH0KICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHByb2QoYXJyYXkpIHsKICAgICAgbGV0IHJlc3VsdCA9IDE7CiAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGg0ID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoNDsgKytpKSB7CiAgICAgICAgcmVzdWx0ICo9IGFycmF5W2ldOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBtaW4zKG91dCwgYSwgYikgewogICAgICBjb25zdCByYW5rID0gb3V0Lmxlbmd0aDsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyArK2kpIHsKICAgICAgICBvdXRbaV0gPSBNYXRoLm1pbihhW2ldLCBiW2ldKTsKICAgICAgfQogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gbWF4MyhvdXQsIGEsIGIpIHsKICAgICAgY29uc3QgcmFuayA9IG91dC5sZW5ndGg7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuazsgKytpKSB7CiAgICAgICAgb3V0W2ldID0gTWF0aC5tYXgoYVtpXSwgYltpXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIHZhciBrRW1wdHlGbG9hdDY0VmVjID0gbmV3IEZsb2F0NjRBcnJheSgwKTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3V0aWwvbWF0cml4LnRzCiAgICBmdW5jdGlvbiBpZGVudGl0eTQoYSwgbGRhLCBuKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgY29uc3Qgc3RhcnQgPSBsZGEgKiBpOwogICAgICAgIGEuZmlsbCgwLCBzdGFydCwgc3RhcnQgKyBuKTsKICAgICAgICBhW3N0YXJ0ICsgaV0gPSAxOwogICAgICB9CiAgICAgIHJldHVybiBhOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlSWRlbnRpdHkoYywgcm93cywgY29scyA9IHJvd3MpIHsKICAgICAgcmV0dXJuIGlkZW50aXR5NChuZXcgYyhyb3dzICogY29scyksIHJvd3MsIE1hdGgubWluKHJvd3MsIGNvbHMpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvcHk2KGIsIGxkYiwgYSwgbGRhLCBtLCBuKSB7CiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IG47ICsrY29sKSB7CiAgICAgICAgY29uc3QgYU9mZiA9IGNvbCAqIGxkYTsKICAgICAgICBjb25zdCBiT2ZmID0gY29sICogbGRiOwogICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IG07ICsrcm93KSB7CiAgICAgICAgICBiW2JPZmYgKyByb3ddID0gYVthT2ZmICsgcm93XTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGI7CiAgICB9CiAgICB2YXIgcGl2b3RzOwogICAgZnVuY3Rpb24gaW52ZXJzZUlucGxhY2UoYSwgbGRhLCBuKSB7CiAgICAgIGxldCBkZXRlcm1pbmFudDMgPSAxOwogICAgICBpZiAocGl2b3RzID09PSB2b2lkIDAgfHwgcGl2b3RzLmxlbmd0aCA8IG4pIHsKICAgICAgICBwaXZvdHMgPSBuZXcgVWludDMyQXJyYXkobik7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBwaXZvdHNbaV0gPSBpOwogICAgICB9CiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgKytrKSB7CiAgICAgICAgY29uc3Qga0NvbE9mZiA9IGxkYSAqIGs7CiAgICAgICAgbGV0IHBpdm90Um93ID0gazsKICAgICAgICB7CiAgICAgICAgICBsZXQgYmVzdFBpdm90ID0gTWF0aC5hYnMoYVtrQ29sT2ZmICsga10pOwogICAgICAgICAgZm9yIChsZXQgcm93ID0gayArIDE7IHJvdyA8IG47ICsrcm93KSB7CiAgICAgICAgICAgIGNvbnN0IG1hZyA9IE1hdGguYWJzKGFba0NvbE9mZiArIHJvd10pOwogICAgICAgICAgICBpZiAobWFnID4gYmVzdFBpdm90KSB7CiAgICAgICAgICAgICAgYmVzdFBpdm90ID0gbWFnOwogICAgICAgICAgICAgIHBpdm90Um93ID0gcm93OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChrICE9PSBwaXZvdFJvdykgewogICAgICAgICAgZGV0ZXJtaW5hbnQzICo9IC0xOwogICAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgbjsgKytjb2wpIHsKICAgICAgICAgICAgY29uc3Qgb2ZmID0gbGRhICogY29sOwogICAgICAgICAgICBjb25zdCB0ZW1wID0gYVtvZmYgKyBrXTsKICAgICAgICAgICAgYVtvZmYgKyBrXSA9IGFbb2ZmICsgcGl2b3RSb3ddOwogICAgICAgICAgICBhW29mZiArIHBpdm90Um93XSA9IHRlbXA7CiAgICAgICAgICB9CiAgICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0IHRlbXBQaXZvdCA9IHBpdm90c1trXTsKICAgICAgICAgICAgcGl2b3RzW2tdID0gcGl2b3RzW3Bpdm90Um93XTsKICAgICAgICAgICAgcGl2b3RzW3Bpdm90Um93XSA9IHRlbXBQaXZvdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcGl2b3RWYWx1ZSA9IGFba0NvbE9mZiArIGtdOwogICAgICAgIGNvbnN0IHBpdm90SW52ID0gMSAvIHBpdm90VmFsdWU7CiAgICAgICAgZGV0ZXJtaW5hbnQzICo9IHBpdm90VmFsdWU7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuOyArK2opIHsKICAgICAgICAgIGFbbGRhICogaiArIGtdICo9IHBpdm90SW52OwogICAgICAgIH0KICAgICAgICBhW2tDb2xPZmYgKyBrXSA9IHBpdm90SW52OwogICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IG47ICsrcm93KSB7CiAgICAgICAgICBpZiAocm93ID09PSBrKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNvbnN0IGZhY3RvciA9IC1hW2xkYSAqIGsgKyByb3ddOwogICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuOyArK2opIHsKICAgICAgICAgICAgY29uc3QgakNvbE9mZiA9IGxkYSAqIGo7CiAgICAgICAgICAgIGFbakNvbE9mZiArIHJvd10gKz0gZmFjdG9yICogYVtqQ29sT2ZmICsga107CiAgICAgICAgICB9CiAgICAgICAgICBhW2xkYSAqIGsgKyByb3ddID0gZmFjdG9yICogcGl2b3RJbnY7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IG47ICsrY29sKSB7CiAgICAgICAgbGV0IHRhcmdldENvbCA9IHBpdm90c1tjb2xdOwogICAgICAgIHdoaWxlICh0YXJnZXRDb2wgIT09IGNvbCkgewogICAgICAgICAgY29uc3QgY29sT2ZmID0gbGRhICogY29sOwogICAgICAgICAgY29uc3QgdGFyZ2V0Q29sT2ZmID0gbGRhICogdGFyZ2V0Q29sOwogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgY29uc3Qgb2ZmMSA9IGNvbE9mZiArIGk7CiAgICAgICAgICAgIGNvbnN0IG9mZjIgPSB0YXJnZXRDb2xPZmYgKyBpOwogICAgICAgICAgICBjb25zdCB0ZW1wMiA9IGFbb2ZmMV07CiAgICAgICAgICAgIGFbb2ZmMV0gPSBhW29mZjJdOwogICAgICAgICAgICBhW29mZjJdID0gdGVtcDI7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCB0ZW1wID0gcGl2b3RzW2NvbF0gPSBwaXZvdHNbdGFyZ2V0Q29sXTsKICAgICAgICAgIHBpdm90c1t0YXJnZXRDb2xdID0gdGFyZ2V0Q29sOwogICAgICAgICAgdGFyZ2V0Q29sID0gdGVtcDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGRldGVybWluYW50MzsKICAgIH0KICAgIGZ1bmN0aW9uIGludmVyc2UzKGIsIGxkYiwgYSwgbGRhLCBuKSB7CiAgICAgIGNvcHk2KGIsIGxkYiwgYSwgbGRhLCBuLCBuKTsKICAgICAgcmV0dXJuIGludmVyc2VJbnBsYWNlKGIsIGxkYiwgbik7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL3NpX3VuaXRzLnRzCiAgICB2YXIgc2lQcmVmaXhlcyA9IFsKICAgICAgeyBwcmVmaXg6ICJZIiwgZXhwb25lbnQ6IDI0IH0sCiAgICAgIHsgcHJlZml4OiAiWiIsIGV4cG9uZW50OiAyMSB9LAogICAgICB7IHByZWZpeDogIkUiLCBleHBvbmVudDogMTggfSwKICAgICAgeyBwcmVmaXg6ICJQIiwgZXhwb25lbnQ6IDE1IH0sCiAgICAgIHsgcHJlZml4OiAiVCIsIGV4cG9uZW50OiAxMiB9LAogICAgICB7IHByZWZpeDogIkciLCBleHBvbmVudDogOSB9LAogICAgICB7IHByZWZpeDogIk0iLCBleHBvbmVudDogNiB9LAogICAgICB7IHByZWZpeDogImsiLCBleHBvbmVudDogMyB9LAogICAgICB7IHByZWZpeDogIiIsIGV4cG9uZW50OiAwIH0sCiAgICAgIHsgcHJlZml4OiAibSIsIGV4cG9uZW50OiAtMyB9LAogICAgICB7IHByZWZpeDogIlx4QjUiLCBleHBvbmVudDogLTYgfSwKICAgICAgeyBwcmVmaXg6ICJuIiwgZXhwb25lbnQ6IC05IH0sCiAgICAgIHsgcHJlZml4OiAicCIsIGV4cG9uZW50OiAtMTIgfSwKICAgICAgeyBwcmVmaXg6ICJmIiwgZXhwb25lbnQ6IC0xNSB9LAogICAgICB7IHByZWZpeDogImEiLCBleHBvbmVudDogLTE4IH0sCiAgICAgIHsgcHJlZml4OiAieiIsIGV4cG9uZW50OiAtMjEgfSwKICAgICAgeyBwcmVmaXg6ICJ5IiwgZXhwb25lbnQ6IC0yNCB9CiAgICBdOwogICAgdmFyIHNpUHJlZml4ZXNXaXRoQWx0ZXJuYXRpdmVzID0gWwogICAgICB7IHByZWZpeDogImMiLCBleHBvbmVudDogLTIgfSwKICAgICAgeyBwcmVmaXg6ICJ1IiwgZXhwb25lbnQ6IC02IH0sCiAgICAgIC4uLnNpUHJlZml4ZXMKICAgIF07CiAgICB2YXIgc3VwcG9ydGVkVW5pdHMgPSBuZXcgTWFwKCk7CiAgICBzdXBwb3J0ZWRVbml0cy5zZXQoIiIsIHsgdW5pdDogIiIsIGV4cG9uZW50OiAwIH0pOwogICAgdmFyIGV4cG9uZW50VG9QcmVmaXggPSBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IHsgcHJlZml4LCBleHBvbmVudCB9IG9mIHNpUHJlZml4ZXNXaXRoQWx0ZXJuYXRpdmVzKSB7CiAgICAgIGV4cG9uZW50VG9QcmVmaXguc2V0KGV4cG9uZW50LCBwcmVmaXgpOwogICAgICBmb3IgKGNvbnN0IHVuaXQgb2YgWyJtIiwgInMiLCAiSHoiLCAicmFkL3MiXSkgewogICAgICAgIHN1cHBvcnRlZFVuaXRzLnNldChgJHtwcmVmaXh9JHt1bml0fWAsIHsgdW5pdCwgZXhwb25lbnQgfSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2Nvb3JkaW5hdGVfdHJhbnNmb3JtLnRzCiAgICBmdW5jdGlvbiBtYWtlQ29vcmRpbmF0ZVNwYWNlKHNwYWNlKSB7CiAgICAgIGNvbnN0IHsgbmFtZXMsIHVuaXRzLCBzY2FsZXMgfSA9IHNwYWNlOwogICAgICBjb25zdCB7CiAgICAgICAgdmFsaWQgPSB0cnVlLAogICAgICAgIHJhbmsgPSBuYW1lcy5sZW5ndGgsCiAgICAgICAgdGltZXN0YW1wcyA9IG5hbWVzLm1hcCgoKSA9PiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpLAogICAgICAgIGlkcyA9IG5hbWVzLm1hcCgoXywgaSkgPT4gLWkpLAogICAgICAgIGJvdW5kaW5nQm94ZXMgPSBbXQogICAgICB9ID0gc3BhY2U7CiAgICAgIGNvbnN0IHsgY29vcmRpbmF0ZUFycmF5cyA9IG5ldyBBcnJheShyYW5rKSB9ID0gc3BhY2U7CiAgICAgIGNvbnN0IHsgYm91bmRzID0gY29tcHV0ZUNvbWJpbmVkQm91bmRzKGJvdW5kaW5nQm94ZXMsIHJhbmspIH0gPSBzcGFjZTsKICAgICAgcmV0dXJuIHsKICAgICAgICB2YWxpZCwKICAgICAgICByYW5rLAogICAgICAgIG5hbWVzLAogICAgICAgIHRpbWVzdGFtcHMsCiAgICAgICAgaWRzLAogICAgICAgIHVuaXRzLAogICAgICAgIHNjYWxlcywKICAgICAgICBib3VuZGluZ0JveGVzLAogICAgICAgIGJvdW5kcywKICAgICAgICBjb29yZGluYXRlQXJyYXlzCiAgICAgIH07CiAgICB9CiAgICBtYWtlQ29vcmRpbmF0ZVNwYWNlKHsKICAgICAgdmFsaWQ6IGZhbHNlLAogICAgICBuYW1lczogW10sCiAgICAgIHVuaXRzOiBbXSwKICAgICAgc2NhbGVzOiBrRW1wdHlGbG9hdDY0VmVjLAogICAgICBib3VuZGluZ0JveGVzOiBbXQogICAgfSk7CiAgICBtYWtlQ29vcmRpbmF0ZVNwYWNlKHsKICAgICAgdmFsaWQ6IHRydWUsCiAgICAgIG5hbWVzOiBbXSwKICAgICAgdW5pdHM6IFtdLAogICAgICBzY2FsZXM6IGtFbXB0eUZsb2F0NjRWZWMsCiAgICAgIGJvdW5kaW5nQm94ZXM6IFtdCiAgICB9KTsKICAgIGZ1bmN0aW9uIGNvbXB1dGVDb21iaW5lZExvd2VyVXBwZXJCb3VuZChib3VuZGluZ0JveCwgb3V0cHV0RGltZW5zaW9uLCBvdXRwdXRSYW5rKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBib3g6IHsgbG93ZXJCb3VuZHM6IGJhc2VMb3dlckJvdW5kcywgdXBwZXJCb3VuZHM6IGJhc2VVcHBlckJvdW5kcyB9LAogICAgICAgIHRyYW5zZm9ybQogICAgICB9ID0gYm91bmRpbmdCb3g7CiAgICAgIGNvbnN0IGlucHV0UmFuayA9IGJhc2VMb3dlckJvdW5kcy5sZW5ndGg7CiAgICAgIGNvbnN0IHN0cmlkZSA9IG91dHB1dFJhbms7CiAgICAgIGNvbnN0IG9mZnNldCA9IHRyYW5zZm9ybVtzdHJpZGUgKiBpbnB1dFJhbmsgKyBvdXRwdXREaW1lbnNpb25dOwogICAgICBsZXQgdGFyZ2V0TG93ZXIgPSBvZmZzZXQsIHRhcmdldFVwcGVyID0gb2Zmc2V0OwogICAgICBsZXQgaGFzQ29lZmZpY2llbnQgPSBmYWxzZTsKICAgICAgZm9yIChsZXQgaW5wdXREaW0gPSAwOyBpbnB1dERpbSA8IGlucHV0UmFuazsgKytpbnB1dERpbSkgewogICAgICAgIGxldCBjID0gdHJhbnNmb3JtW3N0cmlkZSAqIGlucHV0RGltICsgb3V0cHV0RGltZW5zaW9uXTsKICAgICAgICBpZiAoYyA9PT0gMCkKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNvbnN0IGxvd2VyID0gYyAqIGJhc2VMb3dlckJvdW5kc1tpbnB1dERpbV07CiAgICAgICAgY29uc3QgdXBwZXIgPSBjICogYmFzZVVwcGVyQm91bmRzW2lucHV0RGltXTsKICAgICAgICB0YXJnZXRMb3dlciArPSBNYXRoLm1pbihsb3dlciwgdXBwZXIpOwogICAgICAgIHRhcmdldFVwcGVyICs9IE1hdGgubWF4KGxvd2VyLCB1cHBlcik7CiAgICAgICAgaGFzQ29lZmZpY2llbnQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmICghaGFzQ29lZmZpY2llbnQpCiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgcmV0dXJuIHsgbG93ZXI6IHRhcmdldExvd2VyLCB1cHBlcjogdGFyZ2V0VXBwZXIgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXB1dGVDb21iaW5lZEJvdW5kcyhib3VuZGluZ0JveGVzLCBvdXRwdXRSYW5rKSB7CiAgICAgIGNvbnN0IGxvd2VyQm91bmRzID0gbmV3IEZsb2F0NjRBcnJheShvdXRwdXRSYW5rKTsKICAgICAgY29uc3QgdXBwZXJCb3VuZHMgPSBuZXcgRmxvYXQ2NEFycmF5KG91dHB1dFJhbmspOwogICAgICBsb3dlckJvdW5kcy5maWxsKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7CiAgICAgIHVwcGVyQm91bmRzLmZpbGwoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICAgZm9yIChjb25zdCBib3VuZGluZ0JveCBvZiBib3VuZGluZ0JveGVzKSB7CiAgICAgICAgZm9yIChsZXQgb3V0cHV0RGltID0gMDsgb3V0cHV0RGltIDwgb3V0cHV0UmFuazsgKytvdXRwdXREaW0pIHsKICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVDb21iaW5lZExvd2VyVXBwZXJCb3VuZChib3VuZGluZ0JveCwgb3V0cHV0RGltLCBvdXRwdXRSYW5rKTsKICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICBjb25zdCB7IGxvd2VyOiB0YXJnZXRMb3dlciwgdXBwZXI6IHRhcmdldFVwcGVyIH0gPSByZXN1bHQ7CiAgICAgICAgICBsb3dlckJvdW5kc1tvdXRwdXREaW1dID0gbG93ZXJCb3VuZHNbb3V0cHV0RGltXSA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZID8gdGFyZ2V0TG93ZXIgOiBNYXRoLm1pbihsb3dlckJvdW5kc1tvdXRwdXREaW1dLCB0YXJnZXRMb3dlcik7CiAgICAgICAgICB1cHBlckJvdW5kc1tvdXRwdXREaW1dID0gdXBwZXJCb3VuZHNbb3V0cHV0RGltXSA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZID8gdGFyZ2V0VXBwZXIgOiBNYXRoLm1heCh1cHBlckJvdW5kc1tvdXRwdXREaW1dLCB0YXJnZXRVcHBlcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7IGxvd2VyQm91bmRzLCB1cHBlckJvdW5kcyB9OwogICAgfQogICAgZnVuY3Rpb24gZ2V0Q2h1bmtQb3NpdGlvbkZyb21Db21iaW5lZEdsb2JhbExvY2FsUG9zaXRpb25zKGNodW5rUG9zaXRpb24sIGdsb2JhbFBvc2l0aW9uLCBsb2NhbFBvc2l0aW9uLCBsYXllclJhbmssIGNvbWJpbmVkR2xvYmFsTG9jYWxUb0NodW5rVHJhbnNmb3JtKSB7CiAgICAgIGNvbnN0IGdsb2JhbFJhbmsgPSBnbG9iYWxQb3NpdGlvbi5sZW5ndGg7CiAgICAgIGNvbnN0IGxvY2FsUmFuayA9IGxvY2FsUG9zaXRpb24ubGVuZ3RoOwogICAgICBjb25zdCByYW5rID0gY2h1bmtQb3NpdGlvbi5sZW5ndGg7CiAgICAgIGxldCB2YWxpZCA9IHRydWU7CiAgICAgIGZvciAobGV0IGNodW5rRGltID0gMDsgY2h1bmtEaW0gPCBsYXllclJhbms7ICsrY2h1bmtEaW0pIHsKICAgICAgICBsZXQgb2ZmID0gY2h1bmtEaW07CiAgICAgICAgbGV0IHN1bSA9IDA7CiAgICAgICAgZm9yIChsZXQgZ2xvYmFsRGltID0gMDsgZ2xvYmFsRGltIDwgZ2xvYmFsUmFuazsgKytnbG9iYWxEaW0pIHsKICAgICAgICAgIHN1bSArPSBjb21iaW5lZEdsb2JhbExvY2FsVG9DaHVua1RyYW5zZm9ybVtvZmYgKyBnbG9iYWxEaW0gKiBsYXllclJhbmtdICogZ2xvYmFsUG9zaXRpb25bZ2xvYmFsRGltXTsKICAgICAgICB9CiAgICAgICAgb2ZmICs9IGdsb2JhbFJhbmsgKiBsYXllclJhbms7CiAgICAgICAgZm9yIChsZXQgbG9jYWxEaW0gPSAwOyBsb2NhbERpbSA8IGxvY2FsUmFuazsgKytsb2NhbERpbSkgewogICAgICAgICAgc3VtICs9IGNvbWJpbmVkR2xvYmFsTG9jYWxUb0NodW5rVHJhbnNmb3JtW29mZiArIGxvY2FsRGltICogbGF5ZXJSYW5rXSAqIGxvY2FsUG9zaXRpb25bbG9jYWxEaW1dOwogICAgICAgIH0KICAgICAgICBzdW0gKz0gY29tYmluZWRHbG9iYWxMb2NhbFRvQ2h1bmtUcmFuc2Zvcm1bb2ZmICsgbG9jYWxSYW5rICogbGF5ZXJSYW5rXTsKICAgICAgICBpZiAoY2h1bmtEaW0gPCByYW5rKSB7CiAgICAgICAgICBjaHVua1Bvc2l0aW9uW2NodW5rRGltXSA9IHN1bTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHN1bSA8IDAgfHwgc3VtID49IDEpIHsKICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbGlkOwogICAgfQogICAgZnVuY3Rpb24gZ2V0M2RNb2RlbFRvRGlzcGxheVNwYWNlTWF0cml4KG91dCwgZGlzcGxheURpbWVuc2lvblJlbmRlckluZm8sIHRyYW5zZm9ybSkgewogICAgICBvdXQuZmlsbCgwKTsKICAgICAgb3V0WzE1XSA9IDE7CiAgICAgIGxldCBmdWxsUmFuayA9IHRydWU7CiAgICAgIGNvbnN0IHsgZGlzcGxheURpbWVuc2lvbkluZGljZXMgfSA9IGRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvOwogICAgICBjb25zdCB7IGdsb2JhbFRvUmVuZGVyTGF5ZXJEaW1lbnNpb25zLCBtb2RlbFRvUmVuZGVyTGF5ZXJUcmFuc2Zvcm0gfSA9IHRyYW5zZm9ybTsKICAgICAgY29uc3QgbGF5ZXJSYW5rID0gdHJhbnNmb3JtLnJhbms7CiAgICAgIGZvciAobGV0IGRpc3BsYXlEaW0gPSAwOyBkaXNwbGF5RGltIDwgMzsgKytkaXNwbGF5RGltKSB7CiAgICAgICAgY29uc3QgZ2xvYmFsRGltID0gZGlzcGxheURpbWVuc2lvbkluZGljZXNbZGlzcGxheURpbV07CiAgICAgICAgaWYgKGdsb2JhbERpbSA9PT0gLTEpIHsKICAgICAgICAgIGZ1bGxSYW5rID0gZmFsc2U7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGF5ZXJEaW0gPSBnbG9iYWxUb1JlbmRlckxheWVyRGltZW5zaW9uc1tnbG9iYWxEaW1dOwogICAgICAgIGlmIChsYXllckRpbSA9PT0gLTEpIHsKICAgICAgICAgIGZ1bGxSYW5rID0gZmFsc2U7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgb3V0W2Rpc3BsYXlEaW0gKyAxMl0gPSBtb2RlbFRvUmVuZGVyTGF5ZXJUcmFuc2Zvcm1bbGF5ZXJEaW0gKyBsYXllclJhbmsgKiAobGF5ZXJSYW5rICsgMSldOwogICAgICAgIGZvciAobGV0IG1vZGVsRGltID0gMDsgbW9kZWxEaW0gPCAzOyArK21vZGVsRGltKSB7CiAgICAgICAgICBvdXRbZGlzcGxheURpbSArIDQgKiBtb2RlbERpbV0gPSBtb2RlbFRvUmVuZGVyTGF5ZXJUcmFuc2Zvcm1bbGF5ZXJEaW0gKyAobGF5ZXJSYW5rICsgMSkgKiBtb2RlbERpbV07CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghZnVsbFJhbmspIHsKICAgICAgICBjb25zdCB7IGdsb2JhbERpbWVuc2lvbk5hbWVzIH0gPSBkaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbzsKICAgICAgICBjb25zdCBkaXNwbGF5RGltRGVzYyA9IEFycmF5LmZyb20oZGlzcGxheURpbWVuc2lvbkluZGljZXMuZmlsdGVyKChpKSA9PiBpICE9PSAtMSksIChpKSA9PiBnbG9iYWxEaW1lbnNpb25OYW1lc1tpXSkuam9pbigiLFx4QTAiKTsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zZm9ybSBmcm9tIG1vZGVsIGRpbWVuc2lvbnMgKCR7dHJhbnNmb3JtLm1vZGVsRGltZW5zaW9uTmFtZXMuam9pbigiLFx4QTAiKX0pIHRvIGRpc3BsYXkgZGltZW5zaW9ucyAoJHtkaXNwbGF5RGltRGVzY30pIGRvZXMgbm90IGhhdmUgZnVsbCByYW5rYCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3NsaWNldmlldy9jaHVua19sYXlvdXQudHMKICAgIHZhciBDaHVua0xheW91dCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3Ioc2l6ZSwgdHJhbnNmb3JtLCBmaW5pdGVSYW5rKSB7CiAgICAgICAgdGhpcy5zaXplID0gdmVjM19leHBvcnRzLmNsb25lKHNpemUpOwogICAgICAgIHRoaXMudHJhbnNmb3JtID0gbWF0NF9leHBvcnRzLmNsb25lKHRyYW5zZm9ybSk7CiAgICAgICAgdGhpcy5maW5pdGVSYW5rID0gZmluaXRlUmFuazsKICAgICAgICBjb25zdCBpbnZUcmFuc2Zvcm0gPSBtYXQ0X2V4cG9ydHMuY3JlYXRlKCk7CiAgICAgICAgY29uc3QgZGV0ID0gaW52ZXJzZTMoaW52VHJhbnNmb3JtLCA0LCB0cmFuc2Zvcm0sIDQsIDQpOwogICAgICAgIGlmIChkZXQgPT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVHJhbnNmb3JtIGlzIHNpbmd1bGFyIik7CiAgICAgICAgfQogICAgICAgIHRoaXMuaW52VHJhbnNmb3JtID0gaW52VHJhbnNmb3JtOwogICAgICAgIHRoaXMuZGV0VHJhbnNmb3JtID0gZGV0OwogICAgICB9CiAgICAgIHRvT2JqZWN0KCkgewogICAgICAgIHJldHVybiB7IHNpemU6IHRoaXMuc2l6ZSwgdHJhbnNmb3JtOiB0aGlzLnRyYW5zZm9ybSwgZmluaXRlUmFuazogdGhpcy5maW5pdGVSYW5rIH07CiAgICAgIH0KICAgICAgc3RhdGljIGZyb21PYmplY3QobXNnKSB7CiAgICAgICAgcmV0dXJuIG5ldyBDaHVua0xheW91dChtc2cuc2l6ZSwgbXNnLnRyYW5zZm9ybSwgbXNnLmZpbml0ZVJhbmspOwogICAgICB9CiAgICAgIGdsb2JhbFRvTG9jYWxTcGF0aWFsKG91dCwgZ2xvYmFsU3BhdGlhbCkgewogICAgICAgIHJldHVybiB2ZWMzX2V4cG9ydHMudHJhbnNmb3JtTWF0NChvdXQsIGdsb2JhbFNwYXRpYWwsIHRoaXMuaW52VHJhbnNmb3JtKTsKICAgICAgfQogICAgICBsb2NhbFNwYXRpYWxWZWN0b3JUb0dsb2JhbChvdXQsIGxvY2FsVmVjdG9yKSB7CiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVZlY3RvckJ5TWF0NChvdXQsIGxvY2FsVmVjdG9yLCB0aGlzLnRyYW5zZm9ybSk7CiAgICAgIH0KICAgICAgZ2xvYmFsVG9Mb2NhbE5vcm1hbChnbG9iYWxOb3JtYWwsIGxvY2FsTm9ybWFsKSB7CiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVZlY3RvckJ5TWF0NFRyYW5zcG9zZShnbG9iYWxOb3JtYWwsIGxvY2FsTm9ybWFsLCB0aGlzLnRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL2RhdGFfdHlwZS50cwogICAgdmFyIERhdGFUeXBlOwogICAgKGZ1bmN0aW9uKERhdGFUeXBlMykgewogICAgICBEYXRhVHlwZTNbRGF0YVR5cGUzWyJVSU5UOCJdID0gMF0gPSAiVUlOVDgiOwogICAgICBEYXRhVHlwZTNbRGF0YVR5cGUzWyJJTlQ4Il0gPSAxXSA9ICJJTlQ4IjsKICAgICAgRGF0YVR5cGUzW0RhdGFUeXBlM1siVUlOVDE2Il0gPSAyXSA9ICJVSU5UMTYiOwogICAgICBEYXRhVHlwZTNbRGF0YVR5cGUzWyJJTlQxNiJdID0gM10gPSAiSU5UMTYiOwogICAgICBEYXRhVHlwZTNbRGF0YVR5cGUzWyJVSU5UMzIiXSA9IDRdID0gIlVJTlQzMiI7CiAgICAgIERhdGFUeXBlM1tEYXRhVHlwZTNbIklOVDMyIl0gPSA1XSA9ICJJTlQzMiI7CiAgICAgIERhdGFUeXBlM1tEYXRhVHlwZTNbIlVJTlQ2NCJdID0gNl0gPSAiVUlOVDY0IjsKICAgICAgRGF0YVR5cGUzW0RhdGFUeXBlM1siRkxPQVQzMiJdID0gN10gPSAiRkxPQVQzMiI7CiAgICB9KShEYXRhVHlwZSB8fCAoRGF0YVR5cGUgPSB7fSkpOwogICAgdmFyIERBVEFfVFlQRV9CWVRFUyA9IHsKICAgICAgWzBdOiAxLAogICAgICBbMV06IDEsCiAgICAgIFsyXTogMiwKICAgICAgWzNdOiAyLAogICAgICBbNF06IDQsCiAgICAgIFs1XTogNCwKICAgICAgWzZdOiA4LAogICAgICBbN106IDQKICAgIH07CiAgICB2YXIgREFUQV9UWVBFX0FSUkFZX0NPTlNUUlVDVE9SID0gewogICAgICBbMF06IFVpbnQ4QXJyYXksCiAgICAgIFsxXTogSW50OEFycmF5LAogICAgICBbMl06IFVpbnQxNkFycmF5LAogICAgICBbM106IEludDE2QXJyYXksCiAgICAgIFs0XTogVWludDMyQXJyYXksCiAgICAgIFs1XTogSW50MzJBcnJheSwKICAgICAgWzZdOiBVaW50MzJBcnJheSwKICAgICAgWzddOiBGbG9hdDMyQXJyYXkKICAgIH07CiAgICB2YXIgREFUQV9UWVBFX0pBVkFTQ1JJUFRfRUxFTUVOVFNfUEVSX0FSUkFZX0VMRU1FTlQgPSB7CiAgICAgIFswXTogMSwKICAgICAgWzFdOiAxLAogICAgICBbMl06IDEsCiAgICAgIFszXTogMSwKICAgICAgWzRdOiAxLAogICAgICBbNV06IDEsCiAgICAgIFs2XTogMiwKICAgICAgWzddOiAxCiAgICB9OwogICAgZnVuY3Rpb24gbWFrZURhdGFUeXBlQXJyYXlWaWV3KGRhdGFUeXBlLCBidWZmZXIsIGJ5dGVPZmZzZXQgPSAwLCBieXRlTGVuZ3RoID0gYnVmZmVyLmJ5dGVMZW5ndGgpIHsKICAgICAgY29uc3QgYnl0ZXNQZXJFbGVtZW50ID0gREFUQV9UWVBFX0JZVEVTW2RhdGFUeXBlXTsKICAgICAgY29uc3QgamF2YXNjcmlwdEVsZW1lbnRzUGVyQXJyYXlFbGVtZW50ID0gREFUQV9UWVBFX0pBVkFTQ1JJUFRfRUxFTUVOVFNfUEVSX0FSUkFZX0VMRU1FTlRbZGF0YVR5cGVdOwogICAgICByZXR1cm4gbmV3IERBVEFfVFlQRV9BUlJBWV9DT05TVFJVQ1RPUltkYXRhVHlwZV0oYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoIC8gYnl0ZXNQZXJFbGVtZW50ICogamF2YXNjcmlwdEVsZW1lbnRzUGVyQXJyYXlFbGVtZW50KTsKICAgIH0KICAgIHZhciB0ZW1wTWF0NCA9IG1hdDRfZXhwb3J0cy5jcmVhdGUoKTsKICAgIGZ1bmN0aW9uIGVzdGltYXRlU2xpY2VBcmVhUGVyQ2h1bmsoY2h1bmtMYXlvdXQsIHZpZXdNYXRyaXgpIHsKICAgICAgbGV0IHZpZXdaUHJvamVjdGlvbiA9IDA7CiAgICAgIGxldCBjaHVua1ZvbHVtZSA9IE1hdGguYWJzKGNodW5rTGF5b3V0LmRldFRyYW5zZm9ybSk7CiAgICAgIGNvbnN0IHsgdHJhbnNmb3JtLCBzaXplIH0gPSBjaHVua0xheW91dDsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgICBsZXQgc3VtID0gMDsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgICAgc3VtICs9IHZpZXdNYXRyaXhbaiAqIDQgKyAyXSAqIHRyYW5zZm9ybVs0ICogaSArIGpdOwogICAgICAgIH0KICAgICAgICBjb25zdCBzID0gc2l6ZVtpXTsKICAgICAgICB2aWV3WlByb2plY3Rpb24gKz0gTWF0aC5hYnMoc3VtKSAqIHM7CiAgICAgICAgY2h1bmtWb2x1bWUgKj0gczsKICAgICAgfQogICAgICByZXR1cm4gY2h1bmtWb2x1bWUgLyB2aWV3WlByb2plY3Rpb247CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVGaXhlZEN1clBvc2l0aW9uSW5DaHVua3ModHNvdXJjZSwgZ2xvYmFsUG9zaXRpb24sIGxvY2FsUG9zaXRpb24pIHsKICAgICAgY29uc3QgeyBjdXJQb3NpdGlvbkluQ2h1bmtzLCBmaXhlZFBvc2l0aW9uV2l0aGluQ2h1bmsgfSA9IHRzb3VyY2U7CiAgICAgIGNvbnN0IHsgbm9uRGlzcGxheUxvd2VyQ2xpcEJvdW5kLCBub25EaXNwbGF5VXBwZXJDbGlwQm91bmQgfSA9IHRzb3VyY2U7CiAgICAgIGNvbnN0IHsgcmFuaywgY2h1bmtEYXRhU2l6ZSB9ID0gdHNvdXJjZS5zb3VyY2Uuc3BlYzsKICAgICAgaWYgKCFnZXRDaHVua1Bvc2l0aW9uRnJvbUNvbWJpbmVkR2xvYmFsTG9jYWxQb3NpdGlvbnMoY3VyUG9zaXRpb25JbkNodW5rcywgZ2xvYmFsUG9zaXRpb24sIGxvY2FsUG9zaXRpb24sIHRzb3VyY2UubGF5ZXJSYW5rLCB0c291cmNlLmZpeGVkTGF5ZXJUb0NodW5rVHJhbnNmb3JtKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmb3IgKGxldCBjaHVua0RpbSA9IDA7IGNodW5rRGltIDwgcmFuazsgKytjaHVua0RpbSkgewogICAgICAgIGNvbnN0IHggPSBjdXJQb3NpdGlvbkluQ2h1bmtzW2NodW5rRGltXTsKICAgICAgICBpZiAoeCA8IG5vbkRpc3BsYXlMb3dlckNsaXBCb3VuZFtjaHVua0RpbV0gfHwgeCA+PSBub25EaXNwbGF5VXBwZXJDbGlwQm91bmRbY2h1bmtEaW1dKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IGNodW5rRGF0YVNpemVbY2h1bmtEaW1dOwogICAgICAgIGNvbnN0IGNodW5rID0gY3VyUG9zaXRpb25JbkNodW5rc1tjaHVua0RpbV0gPSBNYXRoLmZsb29yKHggLyBjaHVua1NpemUpOwogICAgICAgIGZpeGVkUG9zaXRpb25XaXRoaW5DaHVua1tjaHVua0RpbV0gPSB4IC0gY2h1bmsgKiBjaHVua1NpemU7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBwaWNrQmVzdEFsdGVybmF0aXZlU291cmNlKHZpZXdNYXRyaXgsIGFsdGVybmF0aXZlcykgewogICAgICBsZXQgbnVtQWx0ZXJuYXRpdmVzID0gYWx0ZXJuYXRpdmVzLmxlbmd0aDsKICAgICAgbGV0IGJlc3RBbHRlcm5hdGl2ZUluZGV4ID0gMDsKICAgICAgaWYgKG51bUFsdGVybmF0aXZlcyA+IDEpIHsKICAgICAgICBsZXQgYmVzdFNsaWNlQXJlYSA9IDA7CiAgICAgICAgZm9yIChsZXQgYWx0ZXJuYXRpdmVJbmRleCA9IDA7IGFsdGVybmF0aXZlSW5kZXggPCBudW1BbHRlcm5hdGl2ZXM7ICsrYWx0ZXJuYXRpdmVJbmRleCkgewogICAgICAgICAgbGV0IGFsdGVybmF0aXZlID0gYWx0ZXJuYXRpdmVzW2FsdGVybmF0aXZlSW5kZXhdOwogICAgICAgICAgY29uc3QgeyBjaHVua0xheW91dCB9ID0gYWx0ZXJuYXRpdmU7CiAgICAgICAgICBsZXQgc2xpY2VBcmVhID0gZXN0aW1hdGVTbGljZUFyZWFQZXJDaHVuayhjaHVua0xheW91dCwgdmlld01hdHJpeCk7CiAgICAgICAgICBpZiAoc2xpY2VBcmVhID4gYmVzdFNsaWNlQXJlYSkgewogICAgICAgICAgICBiZXN0U2xpY2VBcmVhID0gc2xpY2VBcmVhOwogICAgICAgICAgICBiZXN0QWx0ZXJuYXRpdmVJbmRleCA9IGFsdGVybmF0aXZlSW5kZXg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBiZXN0QWx0ZXJuYXRpdmVJbmRleDsKICAgIH0KICAgIHZhciB0ZW1wQ2h1bmtMYXlvdXQgPSBuZXcgQ2h1bmtMYXlvdXQodmVjM19leHBvcnRzLmNyZWF0ZSgpLCBtYXQ0X2V4cG9ydHMuY3JlYXRlKCksIDApOwogICAgZnVuY3Rpb24gdmlzaWJsZVNvdXJjZXNJbnZhbGlkYXRlZChvbGRWYWx1ZSwgbmV3VmFsdWUpIHsKICAgICAgaWYgKG9sZFZhbHVlLmRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvICE9PSBuZXdWYWx1ZS5kaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbykKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKG9sZFZhbHVlLnBpeGVsU2l6ZSAhPT0gbmV3VmFsdWUucGl4ZWxTaXplKQogICAgICAgIHJldHVybiB0cnVlOwogICAgICBjb25zdCB7IHZpZXdNYXRyaXg6IG9sZFZpZXdNYXRyaXggfSA9IG9sZFZhbHVlOwogICAgICBjb25zdCB7IHZpZXdNYXRyaXg6IG5ld1ZpZXdNYXRyaXggfSA9IG5ld1ZhbHVlOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEyOyArK2kpIHsKICAgICAgICBpZiAob2xkVmlld01hdHJpeFtpXSAhPT0gbmV3Vmlld01hdHJpeFtpXSkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHZhciBTbGljZVZpZXdCYXNlID0gY2xhc3MgZXh0ZW5kcyBTaGFyZWRPYmplY3QgewogICAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0aW9uUGFyYW1ldGVycykgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5wcm9qZWN0aW9uUGFyYW1ldGVycyA9IHByb2plY3Rpb25QYXJhbWV0ZXJzOwogICAgICAgIHRoaXMudmlzaWJsZUxheWVycyA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLnZpc2libGVTb3VyY2VzU3RhbGUgPSB0cnVlOwogICAgICAgIHRoaXMucmVnaXN0ZXJEaXNwb3Nlcihwcm9qZWN0aW9uUGFyYW1ldGVycy5jaGFuZ2VkLmFkZCgob2xkVmFsdWUsIG5ld1ZhbHVlKSA9PiB7CiAgICAgICAgICBpZiAodmlzaWJsZVNvdXJjZXNJbnZhbGlkYXRlZChvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7CiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZVZpc2libGVTb3VyY2VzKCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmludmFsaWRhdGVWaXNpYmxlQ2h1bmtzKCk7CiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIGludmFsaWRhdGVWaXNpYmxlU291cmNlcygpIHsKICAgICAgICB0aGlzLnZpc2libGVTb3VyY2VzU3RhbGUgPSB0cnVlOwogICAgICB9CiAgICAgIGludmFsaWRhdGVWaXNpYmxlQ2h1bmtzKCkgewogICAgICB9CiAgICAgIHVwZGF0ZVZpc2libGVTb3VyY2VzKCkgewogICAgICAgIGlmICghdGhpcy52aXNpYmxlU291cmNlc1N0YWxlKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMudmlzaWJsZVNvdXJjZXNTdGFsZSA9IGZhbHNlOwogICAgICAgIGNvbnN0IGN1ckRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvID0gdGhpcy5wcm9qZWN0aW9uUGFyYW1ldGVycy52YWx1ZS5kaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbzsKICAgICAgICBjb25zdCB7IHZpc2libGVMYXllcnMgfSA9IHRoaXM7CiAgICAgICAgZm9yIChjb25zdCBbcmVuZGVyTGF5ZXIsIHsgYWxsU291cmNlcywgdmlzaWJsZVNvdXJjZXMsIGRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvIH1dIG9mIHZpc2libGVMYXllcnMpIHsKICAgICAgICAgIHZpc2libGVTb3VyY2VzLmxlbmd0aCA9IDA7CiAgICAgICAgICBpZiAoZGlzcGxheURpbWVuc2lvblJlbmRlckluZm8gIT09IGN1ckRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvIHx8IGFsbFNvdXJjZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgcHJlZmVycmVkT3JpZW50YXRpb25JbmRleCA9IHBpY2tCZXN0QWx0ZXJuYXRpdmVTb3VyY2UodGhpcy5wcm9qZWN0aW9uUGFyYW1ldGVycy52YWx1ZS52aWV3TWF0cml4LCBhbGxTb3VyY2VzLm1hcCgoeCkgPT4geFswXSkpOwogICAgICAgICAgY29uc3Qgc291cmNlcyA9IGFsbFNvdXJjZXNbcHJlZmVycmVkT3JpZW50YXRpb25JbmRleF07CiAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiByZW5kZXJMYXllci5maWx0ZXJWaXNpYmxlU291cmNlcyh0aGlzLCBzb3VyY2VzKSkgewogICAgICAgICAgICB2aXNpYmxlU291cmNlcy5wdXNoKHNvdXJjZSk7CiAgICAgICAgICB9CiAgICAgICAgICB2aXNpYmxlU291cmNlcy5yZXZlcnNlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgdmFyIENodW5rTGF5b3V0UHJlZmVyZW5jZTsKICAgIChmdW5jdGlvbihDaHVua0xheW91dFByZWZlcmVuY2UyKSB7CiAgICAgIENodW5rTGF5b3V0UHJlZmVyZW5jZTJbQ2h1bmtMYXlvdXRQcmVmZXJlbmNlMlsiSVNPVFJPUElDIl0gPSAwXSA9ICJJU09UUk9QSUMiOwogICAgICBDaHVua0xheW91dFByZWZlcmVuY2UyW0NodW5rTGF5b3V0UHJlZmVyZW5jZTJbIkZMQVQiXSA9IDFdID0gIkZMQVQiOwogICAgfSkoQ2h1bmtMYXlvdXRQcmVmZXJlbmNlIHx8IChDaHVua0xheW91dFByZWZlcmVuY2UgPSB7fSkpOwogICAgZnVuY3Rpb24qIGZpbHRlclZpc2libGVTb3VyY2VzKHNsaWNlVmlldywgcmVuZGVyTGF5ZXIsIHNvdXJjZXMpIHsKICAgICAgY29uc3QgcGl4ZWxTaXplID0gc2xpY2VWaWV3LnByb2plY3Rpb25QYXJhbWV0ZXJzLnZhbHVlLnBpeGVsU2l6ZSAqIDEuMTsKICAgICAgY29uc3Qgc21hbGxlc3RWb3hlbFNpemUgPSBzb3VyY2VzWzBdLmVmZmVjdGl2ZVZveGVsU2l6ZTsKICAgICAgY29uc3QgcmVuZGVyU2NhbGVUYXJnZXQgPSByZW5kZXJMYXllci5yZW5kZXJTY2FsZVRhcmdldC52YWx1ZTsKICAgICAgY29uc3QgY2FuSW1wcm92ZU9uVm94ZWxTaXplID0gKHZveGVsU2l6ZSkgPT4gewogICAgICAgIGNvbnN0IHRhcmdldFNpemUgPSBwaXhlbFNpemUgKiByZW5kZXJTY2FsZVRhcmdldDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgICAgY29uc3Qgc2l6ZSA9IHZveGVsU2l6ZVtpXTsKICAgICAgICAgIGlmIChzaXplID4gdGFyZ2V0U2l6ZSAmJiBzaXplID4gMS4wMSAqIHNtYWxsZXN0Vm94ZWxTaXplW2ldKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH07CiAgICAgIGNvbnN0IGltcHJvdmVzT25QcmV2Vm94ZWxTaXplID0gKHZveGVsU2l6ZSwgcHJldlZveGVsU2l6ZTIpID0+IHsKICAgICAgICBjb25zdCB0YXJnZXRTaXplID0gcGl4ZWxTaXplICogcmVuZGVyU2NhbGVUYXJnZXQ7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgICAgIGNvbnN0IHNpemUgPSB2b3hlbFNpemVbaV07CiAgICAgICAgICBjb25zdCBwcmV2U2l6ZSA9IHByZXZWb3hlbFNpemUyW2ldOwogICAgICAgICAgaWYgKE1hdGguYWJzKHRhcmdldFNpemUgLSBzaXplKSA8IE1hdGguYWJzKHRhcmdldFNpemUgLSBwcmV2U2l6ZSkgJiYgc2l6ZSA8IDEuMDEgKiBwcmV2U2l6ZSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9OwogICAgICBsZXQgc2NhbGVJbmRleCA9IHNvdXJjZXMubGVuZ3RoIC0gMTsKICAgICAgbGV0IHByZXZWb3hlbFNpemU7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRTb3VyY2UgPSBzb3VyY2VzW3NjYWxlSW5kZXhdOwogICAgICAgIGlmIChwcmV2Vm94ZWxTaXplICE9PSB2b2lkIDAgJiYgIWltcHJvdmVzT25QcmV2Vm94ZWxTaXplKHRyYW5zZm9ybWVkU291cmNlLmVmZmVjdGl2ZVZveGVsU2l6ZSwgcHJldlZveGVsU2l6ZSkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB5aWVsZCB0cmFuc2Zvcm1lZFNvdXJjZTsKICAgICAgICBpZiAoc2NhbGVJbmRleCA9PT0gMCB8fCAhY2FuSW1wcm92ZU9uVm94ZWxTaXplKHRyYW5zZm9ybWVkU291cmNlLmVmZmVjdGl2ZVZveGVsU2l6ZSkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBwcmV2Vm94ZWxTaXplID0gdHJhbnNmb3JtZWRTb3VyY2UuZWZmZWN0aXZlVm94ZWxTaXplOwogICAgICAgIC0tc2NhbGVJbmRleDsKICAgICAgfQogICAgfQogICAgdmFyIFNMSUNFVklFV19SUENfSUQgPSAiU2xpY2VWaWV3IjsKICAgIHZhciBTTElDRVZJRVdfUkVOREVSTEFZRVJfUlBDX0lEID0gInNsaWNldmlldy9SZW5kZXJMYXllciI7CiAgICB2YXIgU0xJQ0VWSUVXX0FERF9WSVNJQkxFX0xBWUVSX1JQQ19JRCA9ICJTbGljZVZpZXcuYWRkVmlzaWJsZUxheWVyIjsKICAgIHZhciBTTElDRVZJRVdfUkVNT1ZFX1ZJU0lCTEVfTEFZRVJfUlBDX0lEID0gIlNsaWNlVmlldy5yZW1vdmVWaXNpYmxlTGF5ZXIiOwogICAgdmFyIHRlbXBWaXNpYmxlVm9sdW1ldHJpY0NodW5rTG93ZXIgPSBuZXcgRmxvYXQzMkFycmF5KDMpOwogICAgdmFyIHRlbXBWaXNpYmxlVm9sdW1ldHJpY0NodW5rVXBwZXIgPSBuZXcgRmxvYXQzMkFycmF5KDMpOwogICAgdmFyIHRlbXBWaXNpYmxlVm9sdW1ldHJpY01vZGVsVmlld1Byb2plY3Rpb24gPSBtYXQ0X2V4cG9ydHMuY3JlYXRlKCk7CiAgICB2YXIgdGVtcFZpc2libGVWb2x1bWV0cmljQ2xpcHBpbmdQbGFuZXMgPSBuZXcgRmxvYXQzMkFycmF5KDI0KTsKICAgIGZ1bmN0aW9uIGZvckVhY2hWb2x1bWV0cmljQ2h1bmtXaXRoaW5GcnVzdHJ1bShjbGlwcGluZ1BsYW5lcywgdHJhbnNmb3JtZWRTb3VyY2UsIGNhbGxiYWNrLCBwcmVkaWNhdGUpIHsKICAgICAgY29uc3QgbG93ZXIgPSB0ZW1wVmlzaWJsZVZvbHVtZXRyaWNDaHVua0xvd2VyOwogICAgICBjb25zdCB1cHBlciA9IHRlbXBWaXNpYmxlVm9sdW1ldHJpY0NodW5rVXBwZXI7CiAgICAgIGNvbnN0IHsgbG93ZXJDaHVua0Rpc3BsYXlCb3VuZCwgdXBwZXJDaHVua0Rpc3BsYXlCb3VuZCB9ID0gdHJhbnNmb3JtZWRTb3VyY2U7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgICAgbG93ZXJbaV0gPSBNYXRoLm1heChsb3dlcltpXSwgbG93ZXJDaHVua0Rpc3BsYXlCb3VuZFtpXSk7CiAgICAgICAgdXBwZXJbaV0gPSBNYXRoLm1pbih1cHBlcltpXSwgdXBwZXJDaHVua0Rpc3BsYXlCb3VuZFtpXSk7CiAgICAgIH0KICAgICAgY29uc3QgeyBjdXJQb3NpdGlvbkluQ2h1bmtzLCBjaHVua0Rpc3BsYXlEaW1lbnNpb25JbmRpY2VzIH0gPSB0cmFuc2Zvcm1lZFNvdXJjZTsKICAgICAgZnVuY3Rpb24gcmVjdXJzZSgpIHsKICAgICAgICBpZiAoIXByZWRpY2F0ZShsb3dlclswXSwgbG93ZXJbMV0sIGxvd2VyWzJdLCB1cHBlclswXSwgdXBwZXJbMV0sIHVwcGVyWzJdLCBjbGlwcGluZ1BsYW5lcykpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbGV0IHNwbGl0RGltID0gMDsKICAgICAgICBsZXQgc3BsaXRTaXplID0gTWF0aC5tYXgoMCwgdXBwZXJbMF0gLSBsb3dlclswXSk7CiAgICAgICAgbGV0IHZvbHVtZSA9IHNwbGl0U2l6ZTsKICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IDM7ICsraSkgewogICAgICAgICAgY29uc3Qgc2l6ZSA9IE1hdGgubWF4KDAsIHVwcGVyW2ldIC0gbG93ZXJbaV0pOwogICAgICAgICAgdm9sdW1lICo9IHNpemU7CiAgICAgICAgICBpZiAoc2l6ZSA+IHNwbGl0U2l6ZSkgewogICAgICAgICAgICBzcGxpdFNpemUgPSBzaXplOwogICAgICAgICAgICBzcGxpdERpbSA9IGk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh2b2x1bWUgPT09IDApCiAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKHZvbHVtZSA9PT0gMSkgewogICAgICAgICAgY3VyUG9zaXRpb25JbkNodW5rc1tjaHVua0Rpc3BsYXlEaW1lbnNpb25JbmRpY2VzWzBdXSA9IGxvd2VyWzBdOwogICAgICAgICAgY3VyUG9zaXRpb25JbkNodW5rc1tjaHVua0Rpc3BsYXlEaW1lbnNpb25JbmRpY2VzWzFdXSA9IGxvd2VyWzFdOwogICAgICAgICAgY3VyUG9zaXRpb25JbkNodW5rc1tjaHVua0Rpc3BsYXlEaW1lbnNpb25JbmRpY2VzWzJdXSA9IGxvd2VyWzJdOwogICAgICAgICAgY2FsbGJhY2sobG93ZXIsIGNsaXBwaW5nUGxhbmVzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgcHJldkxvd2VyID0gbG93ZXJbc3BsaXREaW1dOwogICAgICAgIGNvbnN0IHByZXZVcHBlciA9IHVwcGVyW3NwbGl0RGltXTsKICAgICAgICBjb25zdCBzcGxpdFBvaW50ID0gTWF0aC5mbG9vcigwLjUgKiAocHJldkxvd2VyICsgcHJldlVwcGVyKSk7CiAgICAgICAgdXBwZXJbc3BsaXREaW1dID0gc3BsaXRQb2ludDsKICAgICAgICByZWN1cnNlKCk7CiAgICAgICAgdXBwZXJbc3BsaXREaW1dID0gcHJldlVwcGVyOwogICAgICAgIGxvd2VyW3NwbGl0RGltXSA9IHNwbGl0UG9pbnQ7CiAgICAgICAgcmVjdXJzZSgpOwogICAgICAgIGxvd2VyW3NwbGl0RGltXSA9IHByZXZMb3dlcjsKICAgICAgfQogICAgICByZWN1cnNlKCk7CiAgICB9CiAgICBmdW5jdGlvbiBmb3JFYWNoVmlzaWJsZVZvbHVtZXRyaWNDaHVuayhwcm9qZWN0aW9uUGFyYW1ldGVycywgbG9jYWxQb3NpdGlvbiwgdHJhbnNmb3JtZWRTb3VyY2UsIGNhbGxiYWNrKSB7CiAgICAgIGlmICghdXBkYXRlRml4ZWRDdXJQb3NpdGlvbkluQ2h1bmtzKHRyYW5zZm9ybWVkU291cmNlLCBwcm9qZWN0aW9uUGFyYW1ldGVycy5nbG9iYWxQb3NpdGlvbiwgbG9jYWxQb3NpdGlvbikpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgeyBzaXplOiBjaHVua1NpemUgfSA9IHRyYW5zZm9ybWVkU291cmNlLmNodW5rTGF5b3V0OwogICAgICBjb25zdCBtb2RlbFZpZXdQcm9qZWN0aW9uID0gbWF0NF9leHBvcnRzLm11bHRpcGx5KHRlbXBWaXNpYmxlVm9sdW1ldHJpY01vZGVsVmlld1Byb2plY3Rpb24sIHByb2plY3Rpb25QYXJhbWV0ZXJzLnZpZXdQcm9qZWN0aW9uTWF0LCB0cmFuc2Zvcm1lZFNvdXJjZS5jaHVua0xheW91dC50cmFuc2Zvcm0pOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgIGNvbnN0IHMgPSBjaHVua1NpemVbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyArK2opIHsKICAgICAgICAgIG1vZGVsVmlld1Byb2plY3Rpb25bNCAqIGkgKyBqXSAqPSBzOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBjbGlwcGluZ1BsYW5lcyA9IHRlbXBWaXNpYmxlVm9sdW1ldHJpY0NsaXBwaW5nUGxhbmVzOwogICAgICBnZXRGcnVzdHJ1bVBsYW5lcyhjbGlwcGluZ1BsYW5lcywgbW9kZWxWaWV3UHJvamVjdGlvbik7CiAgICAgIGNvbnN0IGxvd2VyID0gdGVtcFZpc2libGVWb2x1bWV0cmljQ2h1bmtMb3dlcjsKICAgICAgY29uc3QgdXBwZXIgPSB0ZW1wVmlzaWJsZVZvbHVtZXRyaWNDaHVua1VwcGVyOwogICAgICBsb3dlci5maWxsKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7CiAgICAgIHVwcGVyLmZpbGwoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICAgZm9yRWFjaFZvbHVtZXRyaWNDaHVua1dpdGhpbkZydXN0cnVtKGNsaXBwaW5nUGxhbmVzLCB0cmFuc2Zvcm1lZFNvdXJjZSwgY2FsbGJhY2ssIGlzQUFCQlZpc2libGUpOwogICAgfQogICAgZnVuY3Rpb24gZm9yRWFjaFBsYW5lSW50ZXJzZWN0aW5nVm9sdW1ldHJpY0NodW5rKHByb2plY3Rpb25QYXJhbWV0ZXJzLCBsb2NhbFBvc2l0aW9uLCB0cmFuc2Zvcm1lZFNvdXJjZSwgY2h1bmtMYXlvdXQsIGNhbGxiYWNrKSB7CiAgICAgIGlmICghdXBkYXRlRml4ZWRDdXJQb3NpdGlvbkluQ2h1bmtzKHRyYW5zZm9ybWVkU291cmNlLCBwcm9qZWN0aW9uUGFyYW1ldGVycy5nbG9iYWxQb3NpdGlvbiwgbG9jYWxQb3NpdGlvbikpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgeyBzaXplOiBjaHVua1NpemUgfSA9IGNodW5rTGF5b3V0OwogICAgICBjb25zdCBtb2RlbFZpZXdQcm9qZWN0aW9uID0gbWF0NF9leHBvcnRzLm11bHRpcGx5KHRlbXBWaXNpYmxlVm9sdW1ldHJpY01vZGVsVmlld1Byb2plY3Rpb24sIHByb2plY3Rpb25QYXJhbWV0ZXJzLnZpZXdQcm9qZWN0aW9uTWF0LCBjaHVua0xheW91dC50cmFuc2Zvcm0pOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgIGNvbnN0IHMgPSBjaHVua1NpemVbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyArK2opIHsKICAgICAgICAgIG1vZGVsVmlld1Byb2plY3Rpb25bNCAqIGkgKyBqXSAqPSBzOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBpbnZNb2RlbFZpZXdQcm9qZWN0aW9uID0gdGVtcE1hdDQ7CiAgICAgIG1hdDRfZXhwb3J0cy5pbnZlcnQoaW52TW9kZWxWaWV3UHJvamVjdGlvbiwgbW9kZWxWaWV3UHJvamVjdGlvbik7CiAgICAgIGNvbnN0IGxvd2VyID0gdGVtcFZpc2libGVWb2x1bWV0cmljQ2h1bmtMb3dlcjsKICAgICAgY29uc3QgdXBwZXIgPSB0ZW1wVmlzaWJsZVZvbHVtZXRyaWNDaHVua1VwcGVyOwogICAgICBjb25zdCBlcHNpbG9uID0gMWUtMzsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgICBjb25zdCBjID0gaW52TW9kZWxWaWV3UHJvamVjdGlvblsxMiArIGldICsgZXBzaWxvbiAvIGNodW5rU2l6ZVtpXTsKICAgICAgICBjb25zdCB4Q29lZmYgPSBNYXRoLmFicyhpbnZNb2RlbFZpZXdQcm9qZWN0aW9uW2ldKTsKICAgICAgICBjb25zdCB5Q29lZmYgPSBNYXRoLmFicyhpbnZNb2RlbFZpZXdQcm9qZWN0aW9uWzQgKyBpXSk7CiAgICAgICAgbG93ZXJbaV0gPSBNYXRoLmZsb29yKGMgLSB4Q29lZmYgLSB5Q29lZmYpOwogICAgICAgIHVwcGVyW2ldID0gTWF0aC5mbG9vcihjICsgeENvZWZmICsgeUNvZWZmICsgMSk7CiAgICAgIH0KICAgICAgY29uc3QgY2xpcHBpbmdQbGFuZXMgPSB0ZW1wVmlzaWJsZVZvbHVtZXRyaWNDbGlwcGluZ1BsYW5lczsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgICBjb25zdCB4Q29lZmYgPSBtb2RlbFZpZXdQcm9qZWN0aW9uWzQgKiBpXTsKICAgICAgICBjb25zdCB5Q29lZmYgPSBtb2RlbFZpZXdQcm9qZWN0aW9uWzQgKiBpICsgMV07CiAgICAgICAgY29uc3QgekNvZWZmID0gbW9kZWxWaWV3UHJvamVjdGlvbls0ICogaSArIDJdOwogICAgICAgIGNsaXBwaW5nUGxhbmVzW2ldID0geENvZWZmOwogICAgICAgIGNsaXBwaW5nUGxhbmVzWzQgKyBpXSA9IC14Q29lZmY7CiAgICAgICAgY2xpcHBpbmdQbGFuZXNbOCArIGldID0gK3lDb2VmZjsKICAgICAgICBjbGlwcGluZ1BsYW5lc1sxMiArIGldID0gLXlDb2VmZjsKICAgICAgICBjbGlwcGluZ1BsYW5lc1sxNiArIGldID0gK3pDb2VmZjsKICAgICAgICBjbGlwcGluZ1BsYW5lc1syMCArIGldID0gLXpDb2VmZjsKICAgICAgfQogICAgICB7CiAgICAgICAgY29uc3QgaSA9IDM7CiAgICAgICAgY29uc3QgeENvZWZmID0gbW9kZWxWaWV3UHJvamVjdGlvbls0ICogaV07CiAgICAgICAgY29uc3QgeUNvZWZmID0gbW9kZWxWaWV3UHJvamVjdGlvbls0ICogaSArIDFdOwogICAgICAgIGNvbnN0IHpDb2VmZiA9IG1vZGVsVmlld1Byb2plY3Rpb25bNCAqIGkgKyAyXTsKICAgICAgICBjbGlwcGluZ1BsYW5lc1tpXSA9IDEgKyB4Q29lZmY7CiAgICAgICAgY2xpcHBpbmdQbGFuZXNbNCArIGldID0gMSAtIHhDb2VmZjsKICAgICAgICBjbGlwcGluZ1BsYW5lc1s4ICsgaV0gPSAxICsgeUNvZWZmOwogICAgICAgIGNsaXBwaW5nUGxhbmVzWzEyICsgaV0gPSAxIC0geUNvZWZmOwogICAgICAgIGNsaXBwaW5nUGxhbmVzWzE2ICsgaV0gPSB6Q29lZmY7CiAgICAgICAgY2xpcHBpbmdQbGFuZXNbMjAgKyBpXSA9IC16Q29lZmY7CiAgICAgIH0KICAgICAgZm9yRWFjaFZvbHVtZXRyaWNDaHVua1dpdGhpbkZydXN0cnVtKGNsaXBwaW5nUGxhbmVzLCB0cmFuc2Zvcm1lZFNvdXJjZSwgY2FsbGJhY2ssIGlzQUFCQkludGVyc2VjdGluZ1BsYW5lKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldE5vcm1hbGl6ZWRDaHVua0xheW91dChwcm9qZWN0aW9uUGFyYW1ldGVycywgY2h1bmtMYXlvdXQpIHsKICAgICAgY29uc3QgeyBmaW5pdGVSYW5rIH0gPSBjaHVua0xheW91dDsKICAgICAgaWYgKGZpbml0ZVJhbmsgPT09IDMpCiAgICAgICAgcmV0dXJuIGNodW5rTGF5b3V0OwogICAgICB0ZW1wQ2h1bmtMYXlvdXQuZmluaXRlUmFuayA9IGZpbml0ZVJhbms7CiAgICAgIHZlYzNfZXhwb3J0cy5jb3B5KHRlbXBDaHVua0xheW91dC5zaXplLCBjaHVua0xheW91dC5zaXplKTsKICAgICAgY29uc3QgdHJhbnNmb3JtID0gbWF0NF9leHBvcnRzLmNvcHkodGVtcENodW5rTGF5b3V0LnRyYW5zZm9ybSwgY2h1bmtMYXlvdXQudHJhbnNmb3JtKTsKICAgICAgY29uc3QgaW52VHJhbnNmb3JtID0gbWF0NF9leHBvcnRzLmNvcHkodGVtcENodW5rTGF5b3V0LmludlRyYW5zZm9ybSwgY2h1bmtMYXlvdXQuaW52VHJhbnNmb3JtKTsKICAgICAgdGVtcENodW5rTGF5b3V0LmRldFRyYW5zZm9ybSA9IGNodW5rTGF5b3V0LmRldFRyYW5zZm9ybTsKICAgICAgY29uc3QgeyBpbnZWaWV3TWF0cml4LCB3aWR0aCwgaGVpZ2h0IH0gPSBwcm9qZWN0aW9uUGFyYW1ldGVyczsKICAgICAgY29uc3QgZGVwdGggPSBnZXRWaWV3RnJ1c3RydW1EZXB0aFJhbmdlKHByb2plY3Rpb25QYXJhbWV0ZXJzLnByb2plY3Rpb25NYXQpOwogICAgICBmb3IgKGxldCBjaHVua1JlbmRlckRpbSA9IGZpbml0ZVJhbms7IGNodW5rUmVuZGVyRGltIDwgMzsgKytjaHVua1JlbmRlckRpbSkgewogICAgICAgIGNvbnN0IG9mZnNldCA9IGludlZpZXdNYXRyaXhbMTIgKyBjaHVua1JlbmRlckRpbV07CiAgICAgICAgbGV0IGxvd2VyID0gb2Zmc2V0LCB1cHBlciA9IG9mZnNldDsKICAgICAgICBjb25zdCB4YyA9IE1hdGguYWJzKGludlZpZXdNYXRyaXhbY2h1bmtSZW5kZXJEaW1dICogd2lkdGgpOwogICAgICAgIGxvd2VyIC09IHhjOwogICAgICAgIHVwcGVyICs9IHhjOwogICAgICAgIGNvbnN0IHljID0gTWF0aC5hYnMoaW52Vmlld01hdHJpeFtjaHVua1JlbmRlckRpbSArIDRdICogaGVpZ2h0KTsKICAgICAgICBsb3dlciAtPSB5YzsKICAgICAgICB1cHBlciArPSB5YzsKICAgICAgICBjb25zdCB6YyA9IE1hdGguYWJzKGludlZpZXdNYXRyaXhbY2h1bmtSZW5kZXJEaW0gKyA4XSAqIGRlcHRoKTsKICAgICAgICBsb3dlciAtPSB6YzsKICAgICAgICB1cHBlciArPSB6YzsKICAgICAgICBjb25zdCBzY2FsZUZhY3RvciA9IE1hdGgubWF4KDEsIHVwcGVyIC0gbG93ZXIpOwogICAgICAgIHRyYW5zZm9ybVsxMiArIGNodW5rUmVuZGVyRGltXSA9IGxvd2VyOwogICAgICAgIHRyYW5zZm9ybVs1ICogY2h1bmtSZW5kZXJEaW1dID0gc2NhbGVGYWN0b3I7CiAgICAgIH0KICAgICAgbWF0NF9leHBvcnRzLmludmVydChpbnZUcmFuc2Zvcm0sIHRyYW5zZm9ybSk7CiAgICAgIHJldHVybiB0ZW1wQ2h1bmtMYXlvdXQ7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL2VyZi50cwogICAgZnVuY3Rpb24gZXJmKHgpIHsKICAgICAgY29uc3QgYTEgPSAwLjI1NDgyOTU5MjsKICAgICAgY29uc3QgYTIgPSAtMC4yODQ0OTY3MzY7CiAgICAgIGNvbnN0IGEzID0gMS40MjE0MTM3NDE7CiAgICAgIGNvbnN0IGE0ID0gLTEuNDUzMTUyMDI3OwogICAgICBjb25zdCBhNSA9IDEuMDYxNDA1NDI5OwogICAgICBjb25zdCBwID0gMC4zMjc1OTExOwogICAgICBjb25zdCB0ID0gMSAvICgxICsgcCAqIE1hdGguYWJzKHgpKTsKICAgICAgY29uc3QgeSA9IDEgLSAoKCgoYTUgKiB0ICsgYTQpICogdCArIGEzKSAqIHQgKyBhMikgKiB0ICsgYTEpICogdCAqIE1hdGguZXhwKC14ICogeCk7CiAgICAgIHJldHVybiBNYXRoLnNpZ24oeCkgKiB5OwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdXRpbC92ZWxvY2l0eV9lc3RpbWF0aW9uLnRzCiAgICB2YXIgVkVMT0NJVFlfSEFMRl9MSUZFX01TID0gNTA7CiAgICB2YXIgTU9ERUxfSEFMRl9MSUZFX01TID0gMWUzOwogICAgdmFyIFZlbG9jaXR5RXN0aW1hdG9yID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3Rvcih2ZWxvY2l0eUhhbGZMaWZlTWlsbGlzZWNvbmRzID0gVkVMT0NJVFlfSEFMRl9MSUZFX01TLCBtb2RlbEhhbGZMaWZlTWlsbGlzZWNvbmRzID0gTU9ERUxfSEFMRl9MSUZFX01TKSB7CiAgICAgICAgdGhpcy52ZWxvY2l0eUhhbGZMaWZlTWlsbGlzZWNvbmRzID0gdmVsb2NpdHlIYWxmTGlmZU1pbGxpc2Vjb25kczsKICAgICAgICB0aGlzLm1vZGVsSGFsZkxpZmVNaWxsaXNlY29uZHMgPSBtb2RlbEhhbGZMaWZlTWlsbGlzZWNvbmRzOwogICAgICAgIHRoaXMubGFzdFRpbWUgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICAgICAgdGhpcy5yYW5rID0gMDsKICAgICAgICB0aGlzLm51bVNhbXBsZXMgPSAwOwogICAgICAgIHRoaXMucHJldlBvc2l0aW9uID0gbmV3IEZsb2F0MzJBcnJheSgpOwogICAgICAgIHRoaXMudmVsb2NpdHkgPSBuZXcgRmxvYXQzMkFycmF5KCk7CiAgICAgICAgdGhpcy5tZWFuID0gbmV3IEZsb2F0MzJBcnJheSgpOwogICAgICAgIHRoaXMudmFyaWFuY2UgPSBuZXcgRmxvYXQzMkFycmF5KCk7CiAgICAgIH0KICAgICAgcmVzZXQocmFuaykgewogICAgICAgIHRoaXMubGFzdFRpbWUgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICAgICAgdGhpcy5yYW5rID0gcmFuazsKICAgICAgICB0aGlzLm51bVNhbXBsZXMgPSAwOwogICAgICAgIHRoaXMudmVsb2NpdHkgPSBuZXcgRmxvYXQzMkFycmF5KHJhbmspOwogICAgICAgIHRoaXMucHJldlBvc2l0aW9uID0gbmV3IEZsb2F0MzJBcnJheShyYW5rKTsKICAgICAgICB0aGlzLm1lYW4gPSBuZXcgRmxvYXQzMkFycmF5KHJhbmspOwogICAgICAgIHRoaXMudmFyaWFuY2UgPSBuZXcgRmxvYXQzMkFycmF5KHJhbmspOwogICAgICB9CiAgICAgIGFkZFNhbXBsZShwb3NpdGlvbiwgdGltZSA9IERhdGUubm93KCkpIHsKICAgICAgICBjb25zdCByYW5rID0gcG9zaXRpb24ubGVuZ3RoOwogICAgICAgIGlmIChyYW5rICE9PSB0aGlzLnJhbmspIHsKICAgICAgICAgIHRoaXMucmVzZXQocmFuayk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG51bVNhbXBsZXMgPSB0aGlzLm51bVNhbXBsZXM7CiAgICAgICAgKyt0aGlzLm51bVNhbXBsZXM7CiAgICAgICAgaWYgKHRoaXMubnVtU2FtcGxlcyA9PT0gMCkgewogICAgICAgICAgdGhpcy5wcmV2UG9zaXRpb24uc2V0KHBvc2l0aW9uKTsKICAgICAgICAgIHRoaXMubGFzdFRpbWUgPSB0aW1lOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBkZWx0YVQgPSB0aW1lIC0gdGhpcy5sYXN0VGltZTsKICAgICAgICB0aGlzLmxhc3RUaW1lID0gdGltZTsKICAgICAgICBjb25zdCB2ZWxvY2l0eUFscGhhID0gMSAtIE1hdGgucG93KDIsIC0oZGVsdGFUIC8gdGhpcy52ZWxvY2l0eUhhbGZMaWZlTWlsbGlzZWNvbmRzKSk7CiAgICAgICAgY29uc3QgbW9kZWxBbHBoYSA9IDEgLSBNYXRoLnBvdygyLCAtKGRlbHRhVCAvIHRoaXMubW9kZWxIYWxmTGlmZU1pbGxpc2Vjb25kcykpOwogICAgICAgIGNvbnN0IHsgdmVsb2NpdHksIHByZXZQb3NpdGlvbiwgbWVhbiwgdmFyaWFuY2UgfSA9IHRoaXM7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyArK2kpIHsKICAgICAgICAgIGNvbnN0IGN1clZlbG9jaXR5U2FtcGxlID0gKHBvc2l0aW9uW2ldIC0gcHJldlBvc2l0aW9uW2ldKSAvIE1hdGgubWF4KGRlbHRhVCwgMSk7CiAgICAgICAgICBwcmV2UG9zaXRpb25baV0gPSBwb3NpdGlvbltpXTsKICAgICAgICAgIGNvbnN0IHByZXZWZWxvY2l0eSA9IHZlbG9jaXR5W2ldOwogICAgICAgICAgY29uc3QgbmV3VmVsb2NpdHkgPSB2ZWxvY2l0eVtpXSA9IHByZXZWZWxvY2l0eSArIHZlbG9jaXR5QWxwaGEgKiAoY3VyVmVsb2NpdHlTYW1wbGUgLSBwcmV2VmVsb2NpdHkpOwogICAgICAgICAgaWYgKG51bVNhbXBsZXMgPT09IDEpIHsKICAgICAgICAgICAgbWVhbltpXSA9IG5ld1ZlbG9jaXR5OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgbWVhblByZXYgPSBtZWFuW2ldOwogICAgICAgICAgICBjb25zdCB2YXJQcmV2ID0gdmFyaWFuY2VbaV07CiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gbmV3VmVsb2NpdHkgLSBtZWFuUHJldjsKICAgICAgICAgICAgbWVhbltpXSA9IG1lYW5QcmV2ICsgbW9kZWxBbHBoYSAqIGRlbHRhOwogICAgICAgICAgICB2YXJpYW5jZVtpXSA9ICgxIC0gbW9kZWxBbHBoYSkgKiAodmFyUHJldiArIG1vZGVsQWxwaGEgKiBkZWx0YSAqIGRlbHRhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9zaGFyZWRfd2F0Y2hhYmxlX3ZhbHVlLnRzCiAgICB2YXIgQ0hBTkdFRF9SUENfTUVUSE9EX0lEID0gIlNoYXJlZFdhdGNoYWJsZVZhbHVlLmNoYW5nZWQiOwogICAgdmFyIFNoYXJlZFdhdGNoYWJsZVZhbHVlID0gY2xhc3MgZXh0ZW5kcyBTaGFyZWRPYmplY3RDb3VudGVycGFydCB7CiAgICAgIGNvbnN0cnVjdG9yKHJwYzIsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIHN1cGVyKHJwYzIsIG9wdGlvbnMpOwogICAgICAgIHRoaXMudXBkYXRpbmdWYWx1ZV8gPSBmYWxzZTsKICAgICAgICBpZiAocnBjMiAhPT0gdm9pZCAwKSB7CiAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgV2F0Y2hhYmxlVmFsdWUob3B0aW9uc1sidmFsdWUiXSk7CiAgICAgICAgICB0aGlzLnNldHVwQ2hhbmdlZEhhbmRsZXIoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaW5pdGlhbGl6ZUNvdW50ZXJwYXJ0KHJwYzIsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIG9wdGlvbnNbInZhbHVlIl0gPSB0aGlzLnZhbHVlOwogICAgICAgIHN1cGVyLmluaXRpYWxpemVDb3VudGVycGFydChycGMyLCBvcHRpb25zKTsKICAgICAgfQogICAgICBzZXR1cENoYW5nZWRIYW5kbGVyKCkgewogICAgICAgIHRoaXMucmVnaXN0ZXJEaXNwb3Nlcih0aGlzLmJhc2UuY2hhbmdlZC5hZGQoKCkgPT4gewogICAgICAgICAgaWYgKHRoaXMudXBkYXRpbmdWYWx1ZV8pIHsKICAgICAgICAgICAgdGhpcy51cGRhdGluZ1ZhbHVlXyA9IGZhbHNlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgeyBycGM6IHJwYzIgfSA9IHRoaXM7CiAgICAgICAgICAgIGlmIChycGMyICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgcnBjMi5pbnZva2UoQ0hBTkdFRF9SUENfTUVUSE9EX0lELCB7ICJpZCI6IHRoaXMucnBjSWQsICJ2YWx1ZSI6IHRoaXMudmFsdWUgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgc3RhdGljIG1ha2VGcm9tRXhpc3RpbmcocnBjMiwgYmFzZSkgewogICAgICAgIGxldCBvYmogPSBuZXcgU2hhcmVkV2F0Y2hhYmxlVmFsdWUoKTsKICAgICAgICBvYmouYmFzZSA9IGJhc2U7CiAgICAgICAgb2JqLnNldHVwQ2hhbmdlZEhhbmRsZXIoKTsKICAgICAgICBvYmouaW5pdGlhbGl6ZUNvdW50ZXJwYXJ0KHJwYzIpOwogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0KICAgICAgc3RhdGljIG1ha2UocnBjMiwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gU2hhcmVkV2F0Y2hhYmxlVmFsdWUubWFrZUZyb21FeGlzdGluZyhycGMyLCBuZXcgV2F0Y2hhYmxlVmFsdWUodmFsdWUpKTsKICAgICAgfQogICAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS52YWx1ZTsKICAgICAgfQogICAgICBzZXQgdmFsdWUodmFsdWUpIHsKICAgICAgICB0aGlzLmJhc2UudmFsdWUgPSB2YWx1ZTsKICAgICAgfQogICAgICBnZXQgY2hhbmdlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5iYXNlLmNoYW5nZWQ7CiAgICAgIH0KICAgIH07CiAgICBTaGFyZWRXYXRjaGFibGVWYWx1ZSA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KCJTaGFyZWRXYXRjaGFibGVWYWx1ZSIpCiAgICBdLCBTaGFyZWRXYXRjaGFibGVWYWx1ZSk7CiAgICByZWdpc3RlclJQQyhDSEFOR0VEX1JQQ19NRVRIT0RfSUQsIGZ1bmN0aW9uKHgpIHsKICAgICAgY29uc3Qgb2JqID0gdGhpcy5nZXQoeFsiaWQiXSk7CiAgICAgIG9iai51cGRhdGluZ1ZhbHVlXyA9IHRydWU7CiAgICAgIG9iai5iYXNlLnZhbHVlID0geFsidmFsdWUiXTsKICAgICAgb2JqLnVwZGF0aW5nVmFsdWVfID0gZmFsc2U7CiAgICB9KTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3Zpc2liaWxpdHlfcHJpb3JpdHkvYmFja2VuZC50cwogICAgZnVuY3Rpb24gd2l0aFNoYXJlZFZpc2liaWxpdHkoQmFzZSkgewogICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHsKICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICBzdXBlciguLi5hcmdzKTsKICAgICAgICAgIGNvbnN0IHJwYzIgPSBhcmdzWzBdOwogICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGFyZ3NbMV07CiAgICAgICAgICB0aGlzLnZpc2liaWxpdHkgPSBycGMyLmdldChvcHRpb25zWyJ2aXNpYmlsaXR5Il0pOwogICAgICAgICAgdGhpcy5yZWdpc3RlckRpc3Bvc2VyKHRoaXMudmlzaWJpbGl0eS5jaGFuZ2VkLmFkZCgoKSA9PiB0aGlzLmNodW5rTWFuYWdlci5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpKSk7CiAgICAgICAgfQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gZ2V0UHJpb3JpdHlUaWVyKHZpc2liaWxpdHkpIHsKICAgICAgcmV0dXJuIHZpc2liaWxpdHkgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA/IENodW5rUHJpb3JpdHlUaWVyLlZJU0lCTEUgOiBDaHVua1ByaW9yaXR5VGllci5QUkVGRVRDSDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEJhc2VQcmlvcml0eSh2aXNpYmlsaXR5KSB7CiAgICAgIHJldHVybiB2aXNpYmlsaXR5ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPyAwIDogdmlzaWJpbGl0eSAqIFBSRUZFVENIX1BSSU9SSVRZX01VTFRJUExJRVI7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9zbGljZXZpZXcvYmFja2VuZC50cwogICAgdmFyIEJBU0VfUFJJT1JJVFkgPSAtMWUxMjsKICAgIHZhciBTQ0FMRV9QUklPUklUWV9NVUxUSVBMSUVSID0gMWU5OwogICAgdmFyIHRlbXBDaHVua1Bvc2l0aW9uID0gdmVjM19leHBvcnRzLmNyZWF0ZSgpOwogICAgdmFyIHRlbXBDZW50ZXIgPSB2ZWMzX2V4cG9ydHMuY3JlYXRlKCk7CiAgICB2YXIgdGVtcENodW5rU2l6ZSA9IHZlYzNfZXhwb3J0cy5jcmVhdGUoKTsKICAgIHZhciBTbGljZVZpZXdDb3VudGVycGFydEJhc2UgPSBjbGFzcyBleHRlbmRzIFNsaWNlVmlld0Jhc2UgewogICAgICBjb25zdHJ1Y3RvcihycGMyLCBvcHRpb25zKSB7CiAgICAgICAgc3VwZXIocnBjMi5nZXQob3B0aW9ucy5wcm9qZWN0aW9uUGFyYW1ldGVycykpOwogICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNoYXJlZE9iamVjdChycGMyLCBvcHRpb25zWyJpZCJdKTsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIGRpc3Bvc2VUcmFuc2Zvcm1lZFNvdXJjZXMoYWxsU291cmNlcykgewogICAgICBmb3IgKGNvbnN0IHNjYWxlcyBvZiBhbGxTb3VyY2VzKSB7CiAgICAgICAgZm9yIChjb25zdCB0c291cmNlIG9mIHNjYWxlcykgewogICAgICAgICAgdHNvdXJjZS5zb3VyY2UuZGlzcG9zZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdmFyIFNsaWNlVmlld0ludGVybWVkaWF0ZUJhc2UgPSB3aXRoU2hhcmVkVmlzaWJpbGl0eSh3aXRoQ2h1bmtNYW5hZ2VyKFNsaWNlVmlld0NvdW50ZXJwYXJ0QmFzZSkpOwogICAgdmFyIFNsaWNlVmlld0JhY2tlbmQgPSBjbGFzcyBleHRlbmRzIFNsaWNlVmlld0ludGVybWVkaWF0ZUJhc2UgewogICAgICBjb25zdHJ1Y3RvcihycGMyLCBvcHRpb25zKSB7CiAgICAgICAgc3VwZXIocnBjMiwgb3B0aW9ucyk7CiAgICAgICAgdGhpcy52ZWxvY2l0eUVzdGltYXRvciA9IG5ldyBWZWxvY2l0eUVzdGltYXRvcigpOwogICAgICAgIHRoaXMuaGFuZGxlTGF5ZXJDaGFuZ2VkID0gKCkgPT4gewogICAgICAgICAgdGhpcy5jaHVua01hbmFnZXIuc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMoKTsKICAgICAgICB9OwogICAgICAgIHRoaXMucmVnaXN0ZXJEaXNwb3Nlcih0aGlzLmNodW5rTWFuYWdlci5yZWNvbXB1dGVDaHVua1ByaW9yaXRpZXMuYWRkKCgpID0+IHsKICAgICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUNodW5rcygpOwogICAgICAgIH0pKTsKICAgICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIodGhpcy5wcm9qZWN0aW9uUGFyYW1ldGVycy5jaGFuZ2VkLmFkZCgoKSA9PiB7CiAgICAgICAgICB0aGlzLnZlbG9jaXR5RXN0aW1hdG9yLmFkZFNhbXBsZSh0aGlzLnByb2plY3Rpb25QYXJhbWV0ZXJzLnZhbHVlLmdsb2JhbFBvc2l0aW9uKTsKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgaW52YWxpZGF0ZVZpc2libGVDaHVua3MoKSB7CiAgICAgICAgc3VwZXIuaW52YWxpZGF0ZVZpc2libGVDaHVua3MoKTsKICAgICAgICB0aGlzLmNodW5rTWFuYWdlci5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICB9CiAgICAgIHVwZGF0ZVZpc2libGVDaHVua3MoKSB7CiAgICAgICAgY29uc3QgcHJvamVjdGlvblBhcmFtZXRlcnMgPSB0aGlzLnByb2plY3Rpb25QYXJhbWV0ZXJzLnZhbHVlOwogICAgICAgIGxldCBjaHVua01hbmFnZXIgPSB0aGlzLmNodW5rTWFuYWdlcjsKICAgICAgICBjb25zdCB2aXNpYmlsaXR5ID0gdGhpcy52aXNpYmlsaXR5LnZhbHVlOwogICAgICAgIGlmICh2aXNpYmlsaXR5ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlU291cmNlcygpOwogICAgICAgIGNvbnN0IHsgY2VudGVyRGF0YVBvc2l0aW9uIH0gPSBwcm9qZWN0aW9uUGFyYW1ldGVyczsKICAgICAgICBjb25zdCBwcmlvcml0eVRpZXIgPSBnZXRQcmlvcml0eVRpZXIodmlzaWJpbGl0eSk7CiAgICAgICAgbGV0IGJhc2VQcmlvcml0eSA9IGdldEJhc2VQcmlvcml0eSh2aXNpYmlsaXR5KTsKICAgICAgICBiYXNlUHJpb3JpdHkgKz0gQkFTRV9QUklPUklUWTsKICAgICAgICBjb25zdCBsb2NhbENlbnRlciA9IHRlbXBDZW50ZXI7CiAgICAgICAgY29uc3QgY2h1bmtTaXplID0gdGVtcENodW5rU2l6ZTsKICAgICAgICBjb25zdCBjdXJWaXNpYmxlQ2h1bmtzID0gW107CiAgICAgICAgdGhpcy52ZWxvY2l0eUVzdGltYXRvci5hZGRTYW1wbGUodGhpcy5wcm9qZWN0aW9uUGFyYW1ldGVycy52YWx1ZS5nbG9iYWxQb3NpdGlvbik7CiAgICAgICAgZm9yIChjb25zdCBbbGF5ZXIsIHZpc2libGVMYXllclNvdXJjZXNdIG9mIHRoaXMudmlzaWJsZUxheWVycykgewogICAgICAgICAgY2h1bmtNYW5hZ2VyLnJlZ2lzdGVyTGF5ZXIobGF5ZXIpOwogICAgICAgICAgY29uc3QgeyB2aXNpYmxlU291cmNlcyB9ID0gdmlzaWJsZUxheWVyU291cmNlczsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBudW1WaXNpYmxlU291cmNlcyA9IHZpc2libGVTb3VyY2VzLmxlbmd0aDsgaSA8IG51bVZpc2libGVTb3VyY2VzOyArK2kpIHsKICAgICAgICAgICAgY29uc3QgdHNvdXJjZSA9IHZpc2libGVTb3VyY2VzW2ldOwogICAgICAgICAgICBjb25zdCBwcmVmZXRjaE9mZnNldHMgPSBjaHVua01hbmFnZXIucXVldWVNYW5hZ2VyLmVuYWJsZVByZWZldGNoLnZhbHVlID8gZ2V0UHJlZmV0Y2hDaHVua09mZnNldHModGhpcy52ZWxvY2l0eUVzdGltYXRvciwgdHNvdXJjZSkgOiBbXTsKICAgICAgICAgICAgY29uc3QgeyBjaHVua0xheW91dCB9ID0gdHNvdXJjZTsKICAgICAgICAgICAgY2h1bmtMYXlvdXQuZ2xvYmFsVG9Mb2NhbFNwYXRpYWwobG9jYWxDZW50ZXIsIGNlbnRlckRhdGFQb3NpdGlvbik7CiAgICAgICAgICAgIGNvbnN0IHsgc2l6ZSwgZmluaXRlUmFuayB9ID0gY2h1bmtMYXlvdXQ7CiAgICAgICAgICAgIHZlYzNfZXhwb3J0cy5jb3B5KGNodW5rU2l6ZSwgc2l6ZSk7CiAgICAgICAgICAgIGZvciAobGV0IGkyID0gZmluaXRlUmFuazsgaTIgPCAzOyArK2kyKSB7CiAgICAgICAgICAgICAgY2h1bmtTaXplW2kyXSA9IDA7CiAgICAgICAgICAgICAgbG9jYWxDZW50ZXJbaTJdID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBwcmlvcml0eUluZGV4ID0gaTsKICAgICAgICAgICAgY29uc3Qgc291cmNlQmFzZVByaW9yaXR5ID0gYmFzZVByaW9yaXR5ICsgU0NBTEVfUFJJT1JJVFlfTVVMVElQTElFUiAqIHByaW9yaXR5SW5kZXg7CiAgICAgICAgICAgIGN1clZpc2libGVDaHVua3MubGVuZ3RoID0gMDsKICAgICAgICAgICAgY29uc3QgY3VyTWFya0dlbmVyYXRpb24gPSBnZXROZXh0TWFya0dlbmVyYXRpb24oKTsKICAgICAgICAgICAgZm9yRWFjaFBsYW5lSW50ZXJzZWN0aW5nVm9sdW1ldHJpY0NodW5rKHByb2plY3Rpb25QYXJhbWV0ZXJzLCB0c291cmNlLnJlbmRlckxheWVyLmxvY2FsUG9zaXRpb24udmFsdWUsIHRzb3VyY2UsIGdldE5vcm1hbGl6ZWRDaHVua0xheW91dChwcm9qZWN0aW9uUGFyYW1ldGVycywgdHNvdXJjZS5jaHVua0xheW91dCksIChwb3NpdGlvbkluQ2h1bmtzKSA9PiB7CiAgICAgICAgICAgICAgdmVjM19leHBvcnRzLm11bHRpcGx5KHRlbXBDaHVua1Bvc2l0aW9uLCBwb3NpdGlvbkluQ2h1bmtzLCBjaHVua1NpemUpOwogICAgICAgICAgICAgIGxldCBwcmlvcml0eSA9IC12ZWMzX2V4cG9ydHMuZGlzdGFuY2UobG9jYWxDZW50ZXIsIHRlbXBDaHVua1Bvc2l0aW9uKTsKICAgICAgICAgICAgICBjb25zdCB7IGN1clBvc2l0aW9uSW5DaHVua3MgfSA9IHRzb3VyY2U7CiAgICAgICAgICAgICAgbGV0IGNodW5rID0gdHNvdXJjZS5zb3VyY2UuZ2V0Q2h1bmsoY3VyUG9zaXRpb25JbkNodW5rcyk7CiAgICAgICAgICAgICAgY2h1bmtNYW5hZ2VyLnJlcXVlc3RDaHVuayhjaHVuaywgcHJpb3JpdHlUaWVyLCBzb3VyY2VCYXNlUHJpb3JpdHkgKyBwcmlvcml0eSk7CiAgICAgICAgICAgICAgKytsYXllci5udW1WaXNpYmxlQ2h1bmtzTmVlZGVkOwogICAgICAgICAgICAgIGlmIChjaHVuay5zdGF0ZSA9PT0gQ2h1bmtTdGF0ZS5HUFVfTUVNT1JZKSB7CiAgICAgICAgICAgICAgICArK2xheWVyLm51bVZpc2libGVDaHVua3NBdmFpbGFibGU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGN1clZpc2libGVDaHVua3MucHVzaChjaHVuayk7CiAgICAgICAgICAgICAgY2h1bmsubWFya0dlbmVyYXRpb24gPSBjdXJNYXJrR2VuZXJhdGlvbjsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChwcmVmZXRjaE9mZnNldHMubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICAgICAgY29uc3QgeyBjdXJQb3NpdGlvbkluQ2h1bmtzIH0gPSB0c291cmNlOwogICAgICAgICAgICAgIGZvciAoY29uc3QgdmlzaWJsZUNodW5rIG9mIGN1clZpc2libGVDaHVua3MpIHsKICAgICAgICAgICAgICAgIGN1clBvc2l0aW9uSW5DaHVua3Muc2V0KHZpc2libGVDaHVuay5jaHVua0dyaWRQb3NpdGlvbik7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoNCA9IHByZWZldGNoT2Zmc2V0cy5sZW5ndGg7IGogPCBsZW5ndGg0OyApIHsKICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmtEaW0gPSBwcmVmZXRjaE9mZnNldHNbal07CiAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbkNodW5rID0gcHJlZmV0Y2hPZmZzZXRzW2ogKyAyXTsKICAgICAgICAgICAgICAgICAgY29uc3QgbWF4Q2h1bmsgPSBwcmVmZXRjaE9mZnNldHNbaiArIDNdOwogICAgICAgICAgICAgICAgICBjb25zdCBuZXdQcmlvcml0eSA9IHByZWZldGNoT2Zmc2V0c1tqICsgNF07CiAgICAgICAgICAgICAgICAgIGNvbnN0IGp1bXBPZmZzZXQgPSBwcmVmZXRjaE9mZnNldHNbaiArIDVdOwogICAgICAgICAgICAgICAgICBjb25zdCBvbGRJbmRleCA9IGN1clBvc2l0aW9uSW5DaHVua3NbY2h1bmtEaW1dOwogICAgICAgICAgICAgICAgICBjb25zdCBuZXdJbmRleCA9IG9sZEluZGV4ICsgcHJlZmV0Y2hPZmZzZXRzW2ogKyAxXTsKICAgICAgICAgICAgICAgICAgaWYgKG5ld0luZGV4IDwgbWluQ2h1bmsgfHwgbmV3SW5kZXggPiBtYXhDaHVuaykgewogICAgICAgICAgICAgICAgICAgIGogPSBqdW1wT2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGN1clBvc2l0aW9uSW5DaHVua3NbY2h1bmtEaW1dID0gbmV3SW5kZXg7CiAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gdHNvdXJjZS5zb3VyY2UuZ2V0Q2h1bmsoY3VyUG9zaXRpb25JbkNodW5rcyk7CiAgICAgICAgICAgICAgICAgIGN1clBvc2l0aW9uSW5DaHVua3NbY2h1bmtEaW1dID0gb2xkSW5kZXg7CiAgICAgICAgICAgICAgICAgIGlmIChjaHVuay5tYXJrR2VuZXJhdGlvbiA9PT0gY3VyTWFya0dlbmVyYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBqID0ganVtcE9mZnNldDsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShuZXdQcmlvcml0eSkpIHsKICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlcjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBjaHVua01hbmFnZXIucmVxdWVzdENodW5rKGNodW5rLCBDaHVua1ByaW9yaXR5VGllci5QUkVGRVRDSCwgc291cmNlQmFzZVByaW9yaXR5ICsgbmV3UHJpb3JpdHkpOwogICAgICAgICAgICAgICAgICArK2xheWVyLm51bVByZWZldGNoQ2h1bmtzTmVlZGVkOwogICAgICAgICAgICAgICAgICBpZiAoY2h1bmsuc3RhdGUgPT09IENodW5rU3RhdGUuR1BVX01FTU9SWSkgewogICAgICAgICAgICAgICAgICAgICsrbGF5ZXIubnVtUHJlZmV0Y2hDaHVua3NBdmFpbGFibGU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaiArPSBQUkVGRVRDSF9FTlRSWV9TSVpFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZW1vdmVWaXNpYmxlTGF5ZXIobGF5ZXIpIHsKICAgICAgICBjb25zdCB7IHZpc2libGVMYXllcnMgfSA9IHRoaXM7CiAgICAgICAgY29uc3QgbGF5ZXJJbmZvID0gdmlzaWJsZUxheWVycy5nZXQobGF5ZXIpOwogICAgICAgIHZpc2libGVMYXllcnMuZGVsZXRlKGxheWVyKTsKICAgICAgICBkaXNwb3NlVHJhbnNmb3JtZWRTb3VyY2VzKGxheWVySW5mby5hbGxTb3VyY2VzKTsKICAgICAgICBsYXllci5yZW5kZXJTY2FsZVRhcmdldC5jaGFuZ2VkLnJlbW92ZSh0aGlzLmludmFsaWRhdGVWaXNpYmxlU291cmNlcyk7CiAgICAgICAgbGF5ZXIubG9jYWxQb3NpdGlvbi5jaGFuZ2VkLnJlbW92ZSh0aGlzLmhhbmRsZUxheWVyQ2hhbmdlZCk7CiAgICAgICAgdGhpcy5pbnZhbGlkYXRlVmlzaWJsZVNvdXJjZXMoKTsKICAgICAgfQogICAgICBhZGRWaXNpYmxlTGF5ZXIobGF5ZXIsIGFsbFNvdXJjZXMpIHsKICAgICAgICBjb25zdCB7IGRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvIH0gPSB0aGlzLnByb2plY3Rpb25QYXJhbWV0ZXJzLnZhbHVlOwogICAgICAgIGxldCBsYXllckluZm8gPSB0aGlzLnZpc2libGVMYXllcnMuZ2V0KGxheWVyKTsKICAgICAgICBpZiAobGF5ZXJJbmZvID09PSB2b2lkIDApIHsKICAgICAgICAgIGxheWVySW5mbyA9IHsKICAgICAgICAgICAgYWxsU291cmNlcywKICAgICAgICAgICAgdmlzaWJsZVNvdXJjZXM6IFtdLAogICAgICAgICAgICBkaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMudmlzaWJsZUxheWVycy5zZXQobGF5ZXIsIGxheWVySW5mbyk7CiAgICAgICAgICBsYXllci5yZW5kZXJTY2FsZVRhcmdldC5jaGFuZ2VkLmFkZCgoKSA9PiB0aGlzLmludmFsaWRhdGVWaXNpYmxlU291cmNlcygpKTsKICAgICAgICAgIGxheWVyLmxvY2FsUG9zaXRpb24uY2hhbmdlZC5hZGQodGhpcy5oYW5kbGVMYXllckNoYW5nZWQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkaXNwb3NlVHJhbnNmb3JtZWRTb3VyY2VzKGxheWVySW5mby5hbGxTb3VyY2VzKTsKICAgICAgICAgIGxheWVySW5mby5hbGxTb3VyY2VzID0gYWxsU291cmNlczsKICAgICAgICAgIGxheWVySW5mby52aXNpYmxlU291cmNlcy5sZW5ndGggPSAwOwogICAgICAgICAgbGF5ZXJJbmZvLmRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvID0gZGlzcGxheURpbWVuc2lvblJlbmRlckluZm87CiAgICAgICAgfQogICAgICAgIHRoaXMuaW52YWxpZGF0ZVZpc2libGVTb3VyY2VzKCk7CiAgICAgIH0KICAgICAgZGlzcG9zZWQoKSB7CiAgICAgICAgZm9yIChsZXQgbGF5ZXIgb2YgdGhpcy52aXNpYmxlTGF5ZXJzLmtleXMoKSkgewogICAgICAgICAgdGhpcy5yZW1vdmVWaXNpYmxlTGF5ZXIobGF5ZXIpOwogICAgICAgIH0KICAgICAgICBzdXBlci5kaXNwb3NlZCgpOwogICAgICB9CiAgICAgIGludmFsaWRhdGVWaXNpYmxlU291cmNlcygpIHsKICAgICAgICBzdXBlci5pbnZhbGlkYXRlVmlzaWJsZVNvdXJjZXMoKTsKICAgICAgICB0aGlzLmNodW5rTWFuYWdlci5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICB9CiAgICB9OwogICAgU2xpY2VWaWV3QmFja2VuZCA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KFNMSUNFVklFV19SUENfSUQpCiAgICBdLCBTbGljZVZpZXdCYWNrZW5kKTsKICAgIGZ1bmN0aW9uIGRlc2VyaWFsaXplVHJhbnNmb3JtZWRTb3VyY2VzKHJwYzIsIHNlcmlhbGl6ZWRTb3VyY2VzLCBsYXllcikgewogICAgICBjb25zdCBzb3VyY2VzID0gc2VyaWFsaXplZFNvdXJjZXMubWFwKChzY2FsZXMpID0+IHNjYWxlcy5tYXAoKHNlcmlhbGl6ZWRTb3VyY2UpID0+IHsKICAgICAgICBjb25zdCBzb3VyY2UgPSBycGMyLmdldFJlZihzZXJpYWxpemVkU291cmNlLnNvdXJjZSk7CiAgICAgICAgY29uc3QgY2h1bmtMYXlvdXQgPSBzZXJpYWxpemVkU291cmNlLmNodW5rTGF5b3V0OwogICAgICAgIGNvbnN0IHsgcmFuayB9ID0gc291cmNlLnNwZWM7CiAgICAgICAgY29uc3QgdHNvdXJjZSA9IHsKICAgICAgICAgIHJlbmRlckxheWVyOiBsYXllciwKICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgIGNodW5rTGF5b3V0OiBDaHVua0xheW91dC5mcm9tT2JqZWN0KGNodW5rTGF5b3V0KSwKICAgICAgICAgIGxheWVyUmFuazogc2VyaWFsaXplZFNvdXJjZS5sYXllclJhbmssCiAgICAgICAgICBub25EaXNwbGF5TG93ZXJDbGlwQm91bmQ6IHNlcmlhbGl6ZWRTb3VyY2Uubm9uRGlzcGxheUxvd2VyQ2xpcEJvdW5kLAogICAgICAgICAgbm9uRGlzcGxheVVwcGVyQ2xpcEJvdW5kOiBzZXJpYWxpemVkU291cmNlLm5vbkRpc3BsYXlVcHBlckNsaXBCb3VuZCwKICAgICAgICAgIGxvd2VyQ2xpcEJvdW5kOiBzZXJpYWxpemVkU291cmNlLmxvd2VyQ2xpcEJvdW5kLAogICAgICAgICAgdXBwZXJDbGlwQm91bmQ6IHNlcmlhbGl6ZWRTb3VyY2UudXBwZXJDbGlwQm91bmQsCiAgICAgICAgICBsb3dlckNsaXBEaXNwbGF5Qm91bmQ6IHNlcmlhbGl6ZWRTb3VyY2UubG93ZXJDbGlwRGlzcGxheUJvdW5kLAogICAgICAgICAgdXBwZXJDbGlwRGlzcGxheUJvdW5kOiBzZXJpYWxpemVkU291cmNlLnVwcGVyQ2xpcERpc3BsYXlCb3VuZCwKICAgICAgICAgIGxvd2VyQ2h1bmtEaXNwbGF5Qm91bmQ6IHNlcmlhbGl6ZWRTb3VyY2UubG93ZXJDaHVua0Rpc3BsYXlCb3VuZCwKICAgICAgICAgIHVwcGVyQ2h1bmtEaXNwbGF5Qm91bmQ6IHNlcmlhbGl6ZWRTb3VyY2UudXBwZXJDaHVua0Rpc3BsYXlCb3VuZCwKICAgICAgICAgIGVmZmVjdGl2ZVZveGVsU2l6ZTogc2VyaWFsaXplZFNvdXJjZS5lZmZlY3RpdmVWb3hlbFNpemUsCiAgICAgICAgICBjaHVua0Rpc3BsYXlEaW1lbnNpb25JbmRpY2VzOiBzZXJpYWxpemVkU291cmNlLmNodW5rRGlzcGxheURpbWVuc2lvbkluZGljZXMsCiAgICAgICAgICBmaXhlZExheWVyVG9DaHVua1RyYW5zZm9ybTogc2VyaWFsaXplZFNvdXJjZS5maXhlZExheWVyVG9DaHVua1RyYW5zZm9ybSwKICAgICAgICAgIGNvbWJpbmVkR2xvYmFsTG9jYWxUb0NodW5rVHJhbnNmb3JtOiBzZXJpYWxpemVkU291cmNlLmNvbWJpbmVkR2xvYmFsTG9jYWxUb0NodW5rVHJhbnNmb3JtLAogICAgICAgICAgY3VyUG9zaXRpb25JbkNodW5rczogbmV3IEZsb2F0MzJBcnJheShyYW5rKSwKICAgICAgICAgIGZpeGVkUG9zaXRpb25XaXRoaW5DaHVuazogbmV3IFVpbnQzMkFycmF5KHJhbmspCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gdHNvdXJjZTsKICAgICAgfSkpOwogICAgICByZXR1cm4gc291cmNlczsKICAgIH0KICAgIHJlZ2lzdGVyUlBDKFNMSUNFVklFV19BRERfVklTSUJMRV9MQVlFUl9SUENfSUQsIGZ1bmN0aW9uKHgpIHsKICAgICAgY29uc3Qgb2JqID0gdGhpcy5nZXQoeFsiaWQiXSk7CiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXQoeFsibGF5ZXJJZCJdKTsKICAgICAgY29uc3Qgc291cmNlcyA9IGRlc2VyaWFsaXplVHJhbnNmb3JtZWRTb3VyY2VzKHRoaXMsIHguc291cmNlcywgbGF5ZXIpOwogICAgICBvYmouYWRkVmlzaWJsZUxheWVyKGxheWVyLCBzb3VyY2VzKTsKICAgIH0pOwogICAgcmVnaXN0ZXJSUEMoU0xJQ0VWSUVXX1JFTU9WRV9WSVNJQkxFX0xBWUVSX1JQQ19JRCwgZnVuY3Rpb24oeCkgewogICAgICBsZXQgb2JqID0gdGhpcy5nZXQoeFsiaWQiXSk7CiAgICAgIGxldCBsYXllciA9IHRoaXMuZ2V0KHhbImxheWVySWQiXSk7CiAgICAgIG9iai5yZW1vdmVWaXNpYmxlTGF5ZXIobGF5ZXIpOwogICAgfSk7CiAgICB2YXIgU2xpY2VWaWV3Q2h1bmsgPSBjbGFzcyBleHRlbmRzIENodW5rIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLnNvdXJjZSA9IG51bGw7CiAgICAgIH0KICAgICAgaW5pdGlhbGl6ZVZvbHVtZUNodW5rKGtleSwgY2h1bmtHcmlkUG9zaXRpb24pIHsKICAgICAgICBzdXBlci5pbml0aWFsaXplKGtleSk7CiAgICAgICAgdGhpcy5jaHVua0dyaWRQb3NpdGlvbiA9IEZsb2F0MzJBcnJheS5mcm9tKGNodW5rR3JpZFBvc2l0aW9uKTsKICAgICAgfQogICAgICBzZXJpYWxpemUobXNnLCB0cmFuc2ZlcnMpIHsKICAgICAgICBzdXBlci5zZXJpYWxpemUobXNnLCB0cmFuc2ZlcnMpOwogICAgICAgIG1zZ1siY2h1bmtHcmlkUG9zaXRpb24iXSA9IHRoaXMuY2h1bmtHcmlkUG9zaXRpb247CiAgICAgIH0KICAgICAgZG93bmxvYWRTdWNjZWVkZWQoKSB7CiAgICAgICAgc3VwZXIuZG93bmxvYWRTdWNjZWVkZWQoKTsKICAgICAgfQogICAgICBmcmVlU3lzdGVtTWVtb3J5KCkgewogICAgICB9CiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS50b1N0cmluZygpICsgIjoiICsgdmVjM0tleSh0aGlzLmNodW5rR3JpZFBvc2l0aW9uKTsKICAgICAgfQogICAgfTsKICAgIHZhciBTbGljZVZpZXdDaHVua1NvdXJjZUJhY2tlbmQgPSBjbGFzcyBleHRlbmRzIENodW5rU291cmNlIHsKICAgICAgY29uc3RydWN0b3IocnBjMiwgb3B0aW9ucykgewogICAgICAgIHN1cGVyKHJwYzIsIG9wdGlvbnMpOwogICAgICAgIHRoaXMuc3BlYyA9IG9wdGlvbnMuc3BlYzsKICAgICAgfQogICAgICBnZXRDaHVuayhjaHVua0dyaWRQb3NpdGlvbikgewogICAgICAgIGNvbnN0IGtleSA9IGNodW5rR3JpZFBvc2l0aW9uLmpvaW4oKTsKICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLmNodW5rcy5nZXQoa2V5KTsKICAgICAgICBpZiAoY2h1bmsgPT09IHZvaWQgMCkgewogICAgICAgICAgY2h1bmsgPSB0aGlzLmdldE5ld0NodW5rXyh0aGlzLmNodW5rQ29uc3RydWN0b3IpOwogICAgICAgICAgY2h1bmsuaW5pdGlhbGl6ZVZvbHVtZUNodW5rKGtleSwgY2h1bmtHcmlkUG9zaXRpb24pOwogICAgICAgICAgdGhpcy5hZGRDaHVuayhjaHVuayk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjaHVuazsKICAgICAgfQogICAgfTsKICAgIHZhciBTbGljZVZpZXdSZW5kZXJMYXllckJhY2tlbmQgPSBjbGFzcyBleHRlbmRzIFNoYXJlZE9iamVjdENvdW50ZXJwYXJ0IHsKICAgICAgY29uc3RydWN0b3IocnBjMiwgb3B0aW9ucykgewogICAgICAgIHN1cGVyKHJwYzIsIG9wdGlvbnMpOwogICAgICAgIHRoaXMucmVuZGVyU2NhbGVUYXJnZXQgPSBycGMyLmdldChvcHRpb25zLnJlbmRlclNjYWxlVGFyZ2V0KTsKICAgICAgICB0aGlzLmxvY2FsUG9zaXRpb24gPSBycGMyLmdldChvcHRpb25zLmxvY2FsUG9zaXRpb24pOwogICAgICAgIHRoaXMubnVtVmlzaWJsZUNodW5rc05lZWRlZCA9IDA7CiAgICAgICAgdGhpcy5udW1WaXNpYmxlQ2h1bmtzQXZhaWxhYmxlID0gMDsKICAgICAgICB0aGlzLm51bVByZWZldGNoQ2h1bmtzQXZhaWxhYmxlID0gMDsKICAgICAgICB0aGlzLm51bVByZWZldGNoQ2h1bmtzTmVlZGVkID0gMDsKICAgICAgICB0aGlzLmNodW5rTWFuYWdlckdlbmVyYXRpb24gPSAtMTsKICAgICAgfQogICAgICBmaWx0ZXJWaXNpYmxlU291cmNlcyhzbGljZVZpZXcsIHNvdXJjZXMpIHsKICAgICAgICByZXR1cm4gZmlsdGVyVmlzaWJsZVNvdXJjZXMoc2xpY2VWaWV3LCB0aGlzLCBzb3VyY2VzKTsKICAgICAgfQogICAgfTsKICAgIFNsaWNlVmlld1JlbmRlckxheWVyQmFja2VuZCA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KFNMSUNFVklFV19SRU5ERVJMQVlFUl9SUENfSUQpCiAgICBdLCBTbGljZVZpZXdSZW5kZXJMYXllckJhY2tlbmQpOwogICAgdmFyIFBSRUZFVENIX01TID0gMmUzOwogICAgdmFyIE1BWF9QUkVGRVRDSF9WRUxPQ0lUWSA9IDAuMTsKICAgIHZhciBNQVhfU0lOR0xFX0RJUkVDVElPTl9QUkVGRVRDSF9DSFVOS1MgPSAzMjsKICAgIHZhciBQUkVGRVRDSF9QUk9CQUJJTElUWV9DVVRPRkYgPSAwLjA1OwogICAgdmFyIFBSRUZFVENIX0VOVFJZX1NJWkUgPSA2OwogICAgZnVuY3Rpb24gZ2V0UHJlZmV0Y2hDaHVua09mZnNldHModmVsb2NpdHlFc3RpbWF0b3IsIHRzb3VyY2UpIHsKICAgICAgY29uc3Qgb2Zmc2V0cyA9IFtdOwogICAgICBjb25zdCBnbG9iYWxSYW5rID0gdmVsb2NpdHlFc3RpbWF0b3IucmFuazsKICAgICAgY29uc3QgeyBjb21iaW5lZEdsb2JhbExvY2FsVG9DaHVua1RyYW5zZm9ybSwgbGF5ZXJSYW5rIH0gPSB0c291cmNlOwogICAgICBjb25zdCB7IHJhbms6IGNodW5rUmFuaywgY2h1bmtEYXRhU2l6ZSB9ID0gdHNvdXJjZS5zb3VyY2Uuc3BlYzsKICAgICAgY29uc3QgeyBtZWFuOiBtZWFuVmVjLCB2YXJpYW5jZTogdmFyaWFuY2VWZWMgfSA9IHZlbG9jaXR5RXN0aW1hdG9yOwogICAgICBmb3IgKGxldCBjaHVua0RpbSA9IDA7IGNodW5rRGltIDwgY2h1bmtSYW5rOyArK2NodW5rRGltKSB7CiAgICAgICAgY29uc3QgaXNEaXNwbGF5RGltZW5zaW9uID0gdHNvdXJjZS5jaHVua0Rpc3BsYXlEaW1lbnNpb25JbmRpY2VzLmluY2x1ZGVzKGNodW5rRGltKTsKICAgICAgICBsZXQgbWVhbiA9IDA7CiAgICAgICAgbGV0IHZhcmlhbmNlID0gMDsKICAgICAgICBmb3IgKGxldCBnbG9iYWxEaW0gPSAwOyBnbG9iYWxEaW0gPCBnbG9iYWxSYW5rOyArK2dsb2JhbERpbSkgewogICAgICAgICAgY29uc3QgbWVhblZhbHVlID0gbWVhblZlY1tnbG9iYWxEaW1dOwogICAgICAgICAgY29uc3QgdmFyaWFuY2VWYWx1ZSA9IHZhcmlhbmNlVmVjW2dsb2JhbERpbV07CiAgICAgICAgICBjb25zdCBjb2VmZiA9IGNvbWJpbmVkR2xvYmFsTG9jYWxUb0NodW5rVHJhbnNmb3JtW2dsb2JhbERpbSAqIGxheWVyUmFuayArIGNodW5rRGltXTsKICAgICAgICAgIG1lYW4gKz0gY29lZmYgKiBtZWFuVmFsdWU7CiAgICAgICAgICB2YXJpYW5jZSArPSBjb2VmZiAqIGNvZWZmICogdmFyaWFuY2VWYWx1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG1lYW4gPiBNQVhfUFJFRkVUQ0hfVkVMT0NJVFkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBjaHVua1NpemUgPSBjaHVua0RhdGFTaXplW2NodW5rRGltXTsKICAgICAgICBjb25zdCBpbml0aWFsRnJhY3Rpb24gPSBpc0Rpc3BsYXlEaW1lbnNpb24gPyAwIDogdHNvdXJjZS5maXhlZFBvc2l0aW9uV2l0aGluQ2h1bmtbY2h1bmtEaW1dIC8gY2h1bmtTaXplOwogICAgICAgIGNvbnN0IGFkanVzdGVkTWVhbiA9IG1lYW4gLyBjaHVua1NpemUgKiBQUkVGRVRDSF9NUzsKICAgICAgICBsZXQgYWRqdXN0ZWRTdGRkZXZUaW1lc1NxcnQyID0gTWF0aC5zcXJ0KDIgKiB2YXJpYW5jZSkgLyBjaHVua1NpemUgKiBQUkVGRVRDSF9NUzsKICAgICAgICBpZiAoTWF0aC5hYnMoYWRqdXN0ZWRNZWFuKSA8IDFlLTMgJiYgYWRqdXN0ZWRTdGRkZXZUaW1lc1NxcnQyIDwgMWUtMykgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGFkanVzdGVkU3RkZGV2VGltZXNTcXJ0MiA9IE1hdGgubWF4KDFlLTYsIGFkanVzdGVkU3RkZGV2VGltZXNTcXJ0Mik7CiAgICAgICAgY29uc3QgY2RmID0gKHgpID0+IDAuNSAqICgxICsgZXJmKCh4IC0gYWRqdXN0ZWRNZWFuKSAvIGFkanVzdGVkU3RkZGV2VGltZXNTcXJ0MikpOwogICAgICAgIGNvbnN0IGN1ckNodW5rID0gdHNvdXJjZS5jdXJQb3NpdGlvbkluQ2h1bmtzW2NodW5rRGltXTsKICAgICAgICBjb25zdCBtaW5DaHVuayA9IE1hdGguZmxvb3IodHNvdXJjZS5sb3dlckNsaXBCb3VuZFtjaHVua0RpbV0gLyBjaHVua1NpemUpOwogICAgICAgIGNvbnN0IG1heENodW5rID0gTWF0aC5jZWlsKHRzb3VyY2UudXBwZXJDbGlwQm91bmRbY2h1bmtEaW1dIC8gY2h1bmtTaXplKSAtIDE7CiAgICAgICAgbGV0IGdyb3VwU3RhcnQgPSBvZmZzZXRzLmxlbmd0aDsKICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBNQVhfU0lOR0xFX0RJUkVDVElPTl9QUkVGRVRDSF9DSFVOS1M7ICsraSkgewogICAgICAgICAgaWYgKCFpc0Rpc3BsYXlEaW1lbnNpb24gJiYgY3VyQ2h1bmsgKyBpID4gbWF4Q2h1bmspCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY29uc3QgcHJvYmFiaWxpdHkgPSAxIC0gY2RmKGkgLSBpbml0aWFsRnJhY3Rpb24pOwogICAgICAgICAgaWYgKHByb2JhYmlsaXR5IDwgUFJFRkVUQ0hfUFJPQkFCSUxJVFlfQ1VUT0ZGKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIG9mZnNldHMucHVzaChjaHVua0RpbSwgaSwgbWluQ2h1bmssIG1heENodW5rLCBwcm9iYWJpbGl0eSwgMCk7CiAgICAgICAgfQogICAgICAgIGxldCBuZXdHcm91cFN0YXJ0ID0gb2Zmc2V0cy5sZW5ndGg7CiAgICAgICAgZm9yIChsZXQgaSA9IGdyb3VwU3RhcnQsIGVuZCA9IG9mZnNldHMubGVuZ3RoOyBpIDwgZW5kOyBpICs9IFBSRUZFVENIX0VOVFJZX1NJWkUpIHsKICAgICAgICAgIG9mZnNldHNbaSArIFBSRUZFVENIX0VOVFJZX1NJWkUgLSAxXSA9IG5ld0dyb3VwU3RhcnQ7CiAgICAgICAgfQogICAgICAgIGdyb3VwU3RhcnQgPSBuZXdHcm91cFN0YXJ0OwogICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IE1BWF9TSU5HTEVfRElSRUNUSU9OX1BSRUZFVENIX0NIVU5LUzsgKytpKSB7CiAgICAgICAgICBpZiAoIWlzRGlzcGxheURpbWVuc2lvbiAmJiBjdXJDaHVuayAtIGkgPCBtaW5DaHVuaykKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjb25zdCBwcm9iYWJpbGl0eSA9IGNkZigtaSArIDEgLSBpbml0aWFsRnJhY3Rpb24pOwogICAgICAgICAgaWYgKHByb2JhYmlsaXR5IDwgUFJFRkVUQ0hfUFJPQkFCSUxJVFlfQ1VUT0ZGKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIG9mZnNldHMucHVzaChjaHVua0RpbSwgLWksIG1pbkNodW5rLCBtYXhDaHVuaywgcHJvYmFiaWxpdHksIDApOwogICAgICAgIH0KICAgICAgICBuZXdHcm91cFN0YXJ0ID0gb2Zmc2V0cy5sZW5ndGg7CiAgICAgICAgZm9yIChsZXQgaSA9IGdyb3VwU3RhcnQsIGVuZCA9IG9mZnNldHMubGVuZ3RoOyBpIDwgZW5kOyBpICs9IFBSRUZFVENIX0VOVFJZX1NJWkUpIHsKICAgICAgICAgIG9mZnNldHNbaSArIFBSRUZFVENIX0VOVFJZX1NJWkUgLSAxXSA9IG5ld0dyb3VwU3RhcnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBvZmZzZXRzOwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvcGVyc3BlY3RpdmVfdmlldy9iYXNlLnRzCiAgICB2YXIgUEVSU1BFQ1RJVkVfVklFV19SUENfSUQgPSAicGVyc3BlY3RpdmVfdmlldy9QZXJzcGVjdGl2ZVZpZXciOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvcGVyc3BlY3RpdmVfdmlldy9iYWNrZW5kLnRzCiAgICB2YXIgUGVyc3BlY3RpdmVWaWV3QmFja2VuZCA9IGNsYXNzIGV4dGVuZHMgU2hhcmVkT2JqZWN0Q291bnRlcnBhcnQgewogICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgc3VwZXIoLi4uYXJncyk7CiAgICAgICAgY29uc3QgcnBjMiA9IGFyZ3NbMF07CiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGFyZ3NbMV07CiAgICAgICAgdGhpcy52aXNpYmlsaXR5ID0gcnBjMi5nZXQob3B0aW9ucy52aXNpYmlsaXR5KTsKICAgICAgICB0aGlzLnByb2plY3Rpb25QYXJhbWV0ZXJzID0gcnBjMi5nZXQob3B0aW9ucy5wcm9qZWN0aW9uUGFyYW1ldGVycyk7CiAgICAgIH0KICAgIH07CiAgICBQZXJzcGVjdGl2ZVZpZXdCYWNrZW5kID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoUEVSU1BFQ1RJVkVfVklFV19SUENfSUQpCiAgICBdLCBQZXJzcGVjdGl2ZVZpZXdCYWNrZW5kKTsKICAgIHZhciBQZXJzcGVjdGl2ZVZpZXdSZW5kZXJMYXllckJhY2tlbmQgPSBjbGFzcyBleHRlbmRzIFJlbmRlckxheWVyQmFja2VuZCB7CiAgICB9OwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdm9sdW1lX3JlbmRlcmluZy9iYXNlLnRzCiAgICB2YXIgVk9MVU1FX1JFTkRFUklOR19SRU5ERVJfTEFZRVJfUlBDX0lEID0gInZvbHVtZV9yZW5kZXJpbmcvVm9sdW1lUmVuZGVyaW5nUmVuZGVyTGF5ZXIiOwogICAgdmFyIFZPTFVNRV9SRU5ERVJJTkdfUkVOREVSX0xBWUVSX1VQREFURV9TT1VSQ0VTX1JQQ19JRCA9ICJ2b2x1bWVfcmVuZGVyaW5nL1ZvbHVtZVJlbmRlcmluZ1JlbmRlckxheWVyL3VwZGF0ZSI7CiAgICB2YXIgdm9sdW1lUmVuZGVyaW5nRGVwdGhTYW1wbGVzID0gNjQ7CiAgICB2YXIgdGVtcE1hdDMgPSBtYXQzX2V4cG9ydHMuY3JlYXRlKCk7CiAgICBmdW5jdGlvbiBmb3JFYWNoVmlzaWJsZVZvbHVtZVJlbmRlcmluZ0NodW5rKHByb2plY3Rpb25QYXJhbWV0ZXJzLCBsb2NhbFBvc2l0aW9uLCByZW5kZXJTY2FsZVRhcmdldCwgdHJhbnNmb3JtZWRTb3VyY2VzLCBiZWdpblNjYWxlLCBjYWxsYmFjaykgewogICAgICBpZiAodHJhbnNmb3JtZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHsgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdCwgZGlzcGxheURpbWVuc2lvblJlbmRlckluZm8gfSA9IHByb2plY3Rpb25QYXJhbWV0ZXJzOwogICAgICBjb25zdCB7IHZveGVsUGh5c2ljYWxTY2FsZXMgfSA9IGRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvOwogICAgICBjb25zdCBjYW5vbmljYWxUb1BoeXNpY2FsU2NhbGUgPSBwcm9kMyh2b3hlbFBoeXNpY2FsU2NhbGVzKTsKICAgICAgY29uc3QgdGFyZ2V0Vmlld1NwYWNpbmcgPSBnZXRWaWV3RnJ1c3RydW1EZXB0aFJhbmdlKHByb2plY3Rpb25NYXQpIC8gdm9sdW1lUmVuZGVyaW5nRGVwdGhTYW1wbGVzOwogICAgICBjb25zdCB0YXJnZXRWaWV3Vm9sdW1lID0gdGFyZ2V0Vmlld1NwYWNpbmcgKiogMzsKICAgICAgY29uc3Qgdmlld0RldCA9IG1hdDNfZXhwb3J0cy5kZXRlcm1pbmFudChtYXQzRnJvbU1hdDQodGVtcE1hdDMsIHZpZXdNYXRyaXgpKTsKICAgICAgY29uc3QgZ2V0Vmlld1ZvbHVtZSA9IChzY2FsZUluZGV4KSA9PiB7CiAgICAgICAgY29uc3QgdHNvdXJjZTIgPSB0cmFuc2Zvcm1lZFNvdXJjZXNbc2NhbGVJbmRleF07CiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHRzb3VyY2UyLmNodW5rTGF5b3V0LmRldFRyYW5zZm9ybSAqIHZpZXdEZXQpOwogICAgICB9OwogICAgICBsZXQgYmVzdFNjYWxlSW5kZXggPSB0cmFuc2Zvcm1lZFNvdXJjZXMubGVuZ3RoIC0gMTsKICAgICAgbGV0IGJlc3RWaWV3Vm9sdW1lID0gZ2V0Vmlld1ZvbHVtZShiZXN0U2NhbGVJbmRleCk7CiAgICAgIGZvciAobGV0IHNjYWxlSW5kZXggPSBiZXN0U2NhbGVJbmRleCAtIDE7IHNjYWxlSW5kZXggPj0gMDsgLS1zY2FsZUluZGV4KSB7CiAgICAgICAgY29uc3Qgdmlld1ZvbHVtZSA9IGdldFZpZXdWb2x1bWUoc2NhbGVJbmRleCk7CiAgICAgICAgaWYgKE1hdGguYWJzKHZpZXdWb2x1bWUgLSB0YXJnZXRWaWV3Vm9sdW1lKSA8IE1hdGguYWJzKGJlc3RWaWV3Vm9sdW1lIC0gdGFyZ2V0Vmlld1ZvbHVtZSkpIHsKICAgICAgICAgIGJlc3RWaWV3Vm9sdW1lID0gdmlld1ZvbHVtZTsKICAgICAgICAgIGJlc3RTY2FsZUluZGV4ID0gc2NhbGVJbmRleDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHBoeXNpY2FsU3BhY2luZyA9IE1hdGgucG93KGJlc3RWaWV3Vm9sdW1lICogY2Fub25pY2FsVG9QaHlzaWNhbFNjYWxlIC8gdmlld0RldCwgMSAvIDMpOwogICAgICBjb25zdCBwaXhlbFNwYWNpbmcgPSBNYXRoLnBvdyhiZXN0Vmlld1ZvbHVtZSwgMSAvIDMpICogcHJvamVjdGlvblBhcmFtZXRlcnMud2lkdGggLyAoMiAqIHByb2plY3Rpb25NYXRbMF0pOwogICAgICBsZXQgZmlyc3RDaHVuayA9IHRydWU7CiAgICAgIGNvbnN0IHRzb3VyY2UgPSB0cmFuc2Zvcm1lZFNvdXJjZXNbYmVzdFNjYWxlSW5kZXhdOwogICAgICBmb3JFYWNoVmlzaWJsZVZvbHVtZXRyaWNDaHVuayhwcm9qZWN0aW9uUGFyYW1ldGVycywgbG9jYWxQb3NpdGlvbiwgdHNvdXJjZSwgKHBvc2l0aW9uSW5DaHVua3MsIGNsaXBwaW5nUGxhbmVzKSA9PiB7CiAgICAgICAgaWYgKGZpcnN0Q2h1bmspIHsKICAgICAgICAgIGJlZ2luU2NhbGUodHNvdXJjZSwgYmVzdFNjYWxlSW5kZXgsIHBoeXNpY2FsU3BhY2luZywgcGl4ZWxTcGFjaW5nLCBjbGlwcGluZ1BsYW5lcyk7CiAgICAgICAgICBmaXJzdENodW5rID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGNhbGxiYWNrKHRzb3VyY2UsIGJlc3RTY2FsZUluZGV4LCBwb3NpdGlvbkluQ2h1bmtzKTsKICAgICAgfSk7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci92b2x1bWVfcmVuZGVyaW5nL2JhY2tlbmQudHMKICAgIHZhciB0ZW1wQ2h1bmtQb3NpdGlvbjIgPSB2ZWMzX2V4cG9ydHMuY3JlYXRlKCk7CiAgICB2YXIgdGVtcENlbnRlcjIgPSB2ZWMzX2V4cG9ydHMuY3JlYXRlKCk7CiAgICB2YXIgdGVtcENodW5rU2l6ZTIgPSB2ZWMzX2V4cG9ydHMuY3JlYXRlKCk7CiAgICB2YXIgdGVtcENlbnRlckRhdGFQb3NpdGlvbiA9IHZlYzNfZXhwb3J0cy5jcmVhdGUoKTsKICAgIHZhciBWb2x1bWVSZW5kZXJpbmdSZW5kZXJMYXllckJhY2tlbmQgPSBjbGFzcyBleHRlbmRzIHdpdGhDaHVua01hbmFnZXIoUmVuZGVyTGF5ZXJCYWNrZW5kKSB7CiAgICAgIGNvbnN0cnVjdG9yKHJwYzIsIG9wdGlvbnMpIHsKICAgICAgICBzdXBlcihycGMyLCBvcHRpb25zKTsKICAgICAgICB0aGlzLnJlbmRlclNjYWxlVGFyZ2V0ID0gcnBjMi5nZXQob3B0aW9ucy5yZW5kZXJTY2FsZVRhcmdldCk7CiAgICAgICAgdGhpcy5sb2NhbFBvc2l0aW9uID0gcnBjMi5nZXQob3B0aW9ucy5sb2NhbFBvc2l0aW9uKTsKICAgICAgICBjb25zdCBzY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcyA9ICgpID0+IHRoaXMuY2h1bmtNYW5hZ2VyLnNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKCk7CiAgICAgICAgdGhpcy5yZWdpc3RlckRpc3Bvc2VyKHRoaXMubG9jYWxQb3NpdGlvbi5jaGFuZ2VkLmFkZChzY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcykpOwogICAgICAgIHRoaXMucmVnaXN0ZXJEaXNwb3Nlcih0aGlzLnJlbmRlclNjYWxlVGFyZ2V0LmNoYW5nZWQuYWRkKHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKSk7CiAgICAgICAgdGhpcy5yZWdpc3RlckRpc3Bvc2VyKHRoaXMuY2h1bmtNYW5hZ2VyLnJlY29tcHV0ZUNodW5rUHJpb3JpdGllcy5hZGQoKCkgPT4gdGhpcy5yZWNvbXB1dGVDaHVua1ByaW9yaXRpZXMoKSkpOwogICAgICB9CiAgICAgIGF0dGFjaChhdHRhY2htZW50KSB7CiAgICAgICAgY29uc3Qgc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMgPSAoKSA9PiB0aGlzLmNodW5rTWFuYWdlci5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICAgIGNvbnN0IHsgdmlldyB9ID0gYXR0YWNobWVudDsKICAgICAgICBhdHRhY2htZW50LnJlZ2lzdGVyRGlzcG9zZXIoc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMpOwogICAgICAgIGF0dGFjaG1lbnQucmVnaXN0ZXJEaXNwb3Nlcih2aWV3LnByb2plY3Rpb25QYXJhbWV0ZXJzLmNoYW5nZWQuYWRkKHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKSk7CiAgICAgICAgYXR0YWNobWVudC5yZWdpc3RlckRpc3Bvc2VyKHZpZXcudmlzaWJpbGl0eS5jaGFuZ2VkLmFkZChzY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcykpOwogICAgICAgIGF0dGFjaG1lbnQuc3RhdGUgPSB7CiAgICAgICAgICBkaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbzogdmlldy5wcm9qZWN0aW9uUGFyYW1ldGVycy52YWx1ZS5kaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbywKICAgICAgICAgIHRyYW5zZm9ybWVkU291cmNlczogW10KICAgICAgICB9OwogICAgICB9CiAgICAgIHJlY29tcHV0ZUNodW5rUHJpb3JpdGllcygpIHsKICAgICAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgdGhpcy5hdHRhY2htZW50cy52YWx1ZXMoKSkgewogICAgICAgICAgY29uc3QgeyB2aWV3IH0gPSBhdHRhY2htZW50OwogICAgICAgICAgY29uc3QgdmlzaWJpbGl0eSA9IHZpZXcudmlzaWJpbGl0eS52YWx1ZTsKICAgICAgICAgIGlmICh2aXNpYmlsaXR5ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCB7IHRyYW5zZm9ybWVkU291cmNlcywgZGlzcGxheURpbWVuc2lvblJlbmRlckluZm8gfSA9IGF0dGFjaG1lbnQuc3RhdGU7CiAgICAgICAgICBpZiAodHJhbnNmb3JtZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCB8fCBkaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbyAhPT0gdmlldy5wcm9qZWN0aW9uUGFyYW1ldGVycy52YWx1ZS5kaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbykgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHByb2plY3Rpb25QYXJhbWV0ZXJzID0gdmlldy5wcm9qZWN0aW9uUGFyYW1ldGVycy52YWx1ZTsKICAgICAgICAgIGNvbnN0IHByaW9yaXR5VGllciA9IGdldFByaW9yaXR5VGllcih2aXNpYmlsaXR5KTsKICAgICAgICAgIGxldCBiYXNlUHJpb3JpdHkgPSBnZXRCYXNlUHJpb3JpdHkodmlzaWJpbGl0eSk7CiAgICAgICAgICBiYXNlUHJpb3JpdHkgKz0gQkFTRV9QUklPUklUWTsKICAgICAgICAgIGNvbnN0IGxvY2FsQ2VudGVyID0gdGVtcENlbnRlcjI7CiAgICAgICAgICBjb25zdCBjaHVua1NpemUgPSB0ZW1wQ2h1bmtTaXplMjsKICAgICAgICAgIGNvbnN0IGNlbnRlckRhdGFQb3NpdGlvbiA9IHRlbXBDZW50ZXJEYXRhUG9zaXRpb247CiAgICAgICAgICBjb25zdCB7IGdsb2JhbFBvc2l0aW9uLCBkaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbzogeyBkaXNwbGF5RGltZW5zaW9uSW5kaWNlcyB9IH0gPSBwcm9qZWN0aW9uUGFyYW1ldGVyczsKICAgICAgICAgIGZvciAobGV0IGRpc3BsYXlEaW0gPSAwOyBkaXNwbGF5RGltIDwgMzsgKytkaXNwbGF5RGltKSB7CiAgICAgICAgICAgIGNvbnN0IGdsb2JhbERpbSA9IGRpc3BsYXlEaW1lbnNpb25JbmRpY2VzW2Rpc3BsYXlEaW1dOwogICAgICAgICAgICBjZW50ZXJEYXRhUG9zaXRpb25bZGlzcGxheURpbV0gPSBnbG9iYWxEaW0gPT09IC0xID8gMCA6IGdsb2JhbFBvc2l0aW9uW2dsb2JhbERpbV07CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgc291cmNlQmFzZVByaW9yaXR5OwogICAgICAgICAgY29uc3QgeyBjaHVua01hbmFnZXIgfSA9IHRoaXM7CiAgICAgICAgICBjaHVua01hbmFnZXIucmVnaXN0ZXJMYXllcih0aGlzKTsKICAgICAgICAgIGZvckVhY2hWaXNpYmxlVm9sdW1lUmVuZGVyaW5nQ2h1bmsocHJvamVjdGlvblBhcmFtZXRlcnMsIHRoaXMubG9jYWxQb3NpdGlvbi52YWx1ZSwgdGhpcy5yZW5kZXJTY2FsZVRhcmdldC52YWx1ZSwgdHJhbnNmb3JtZWRTb3VyY2VzWzBdLCAodHNvdXJjZSwgc2NhbGVJbmRleCkgPT4gewogICAgICAgICAgICBjb25zdCB7IGNodW5rTGF5b3V0IH0gPSB0c291cmNlOwogICAgICAgICAgICBjaHVua0xheW91dC5nbG9iYWxUb0xvY2FsU3BhdGlhbChsb2NhbENlbnRlciwgY2VudGVyRGF0YVBvc2l0aW9uKTsKICAgICAgICAgICAgY29uc3QgeyBzaXplLCBmaW5pdGVSYW5rIH0gPSBjaHVua0xheW91dDsKICAgICAgICAgICAgdmVjM19leHBvcnRzLmNvcHkoY2h1bmtTaXplLCBzaXplKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IGZpbml0ZVJhbms7IGkgPCAzOyArK2kpIHsKICAgICAgICAgICAgICBjaHVua1NpemVbaV0gPSAwOwogICAgICAgICAgICAgIGxvY2FsQ2VudGVyW2ldID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBwcmlvcml0eUluZGV4ID0gdHJhbnNmb3JtZWRTb3VyY2VzWzBdLmxlbmd0aCAtIDEgLSBzY2FsZUluZGV4OwogICAgICAgICAgICBzb3VyY2VCYXNlUHJpb3JpdHkgPSBiYXNlUHJpb3JpdHkgKyBTQ0FMRV9QUklPUklUWV9NVUxUSVBMSUVSICogcHJpb3JpdHlJbmRleDsKICAgICAgICAgIH0sICh0c291cmNlLCBfLCBwb3NpdGlvbkluQ2h1bmtzKSA9PiB7CiAgICAgICAgICAgIHZlYzNfZXhwb3J0cy5tdWx0aXBseSh0ZW1wQ2h1bmtQb3NpdGlvbjIsIHBvc2l0aW9uSW5DaHVua3MsIGNodW5rU2l6ZSk7CiAgICAgICAgICAgIGNvbnN0IHByaW9yaXR5ID0gLXZlYzNfZXhwb3J0cy5kaXN0YW5jZShsb2NhbENlbnRlciwgdGVtcENodW5rUG9zaXRpb24yKTsKICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0c291cmNlLnNvdXJjZS5nZXRDaHVuayh0c291cmNlLmN1clBvc2l0aW9uSW5DaHVua3MpOwogICAgICAgICAgICArK3RoaXMubnVtVmlzaWJsZUNodW5rc05lZWRlZDsKICAgICAgICAgICAgY2h1bmtNYW5hZ2VyLnJlcXVlc3RDaHVuayhjaHVuaywgcHJpb3JpdHlUaWVyLCBzb3VyY2VCYXNlUHJpb3JpdHkgKyBwcmlvcml0eSk7CiAgICAgICAgICAgIGlmIChjaHVuay5zdGF0ZSA9PT0gQ2h1bmtTdGF0ZS5HUFVfTUVNT1JZKSB7CiAgICAgICAgICAgICAgKyt0aGlzLm51bVZpc2libGVDaHVua3NBdmFpbGFibGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIFZvbHVtZVJlbmRlcmluZ1JlbmRlckxheWVyQmFja2VuZCA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KFZPTFVNRV9SRU5ERVJJTkdfUkVOREVSX0xBWUVSX1JQQ19JRCkKICAgIF0sIFZvbHVtZVJlbmRlcmluZ1JlbmRlckxheWVyQmFja2VuZCk7CiAgICByZWdpc3RlclJQQyhWT0xVTUVfUkVOREVSSU5HX1JFTkRFUl9MQVlFUl9VUERBVEVfU09VUkNFU19SUENfSUQsIGZ1bmN0aW9uKHgpIHsKICAgICAgY29uc3QgdmlldyA9IHRoaXMuZ2V0KHgudmlldyk7CiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXQoeC5sYXllcik7CiAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBsYXllci5hdHRhY2htZW50cy5nZXQodmlldyk7CiAgICAgIGF0dGFjaG1lbnQuc3RhdGUudHJhbnNmb3JtZWRTb3VyY2VzID0gZGVzZXJpYWxpemVUcmFuc2Zvcm1lZFNvdXJjZXModGhpcywgeC5zb3VyY2VzLCBsYXllcik7CiAgICAgIGF0dGFjaG1lbnQuc3RhdGUuZGlzcGxheURpbWVuc2lvblJlbmRlckluZm8gPSBhdHRhY2htZW50LnZpZXcucHJvamVjdGlvblBhcmFtZXRlcnMudmFsdWUuZGlzcGxheURpbWVuc2lvblJlbmRlckluZm87CiAgICAgIGxheWVyLmNodW5rTWFuYWdlci5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgfSk7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL2Zsb2F0MzJfdG9fc3RyaW5nLnRzCiAgICB2YXIgdGVtcEFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKICAgIGZ1bmN0aW9uIGZsb2F0MzJUb1N0cmluZyh4KSB7CiAgICAgIHRlbXBBcnJheVswXSA9IHg7CiAgICAgIHggPSB0ZW1wQXJyYXlbMF07CiAgICAgIGZvciAobGV0IGRpZ2l0cyA9IDE7IGRpZ2l0cyA8IDIxOyArK2RpZ2l0cykgewogICAgICAgIGxldCByZXN1bHQgPSB4LnRvUHJlY2lzaW9uKGRpZ2l0cyk7CiAgICAgICAgdGVtcEFycmF5WzBdID0gcGFyc2VGbG9hdChyZXN1bHQpOwogICAgICAgIGlmICh0ZW1wQXJyYXlbMF0gPT09IHgpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB4LnRvU3RyaW5nKCk7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL2hleC50cwogICAgZnVuY3Rpb24gaGV4RW5jb2RlQnl0ZSh4KSB7CiAgICAgIHJldHVybiAoIjAiICsgeC50b1N0cmluZygxNikpLnNsaWNlKC0yKTsKICAgIH0KCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3V0aWwvY29sb3IudHMKICAgIGZ1bmN0aW9uIHBhcnNlQ29sb3JTZXJpYWxpemF0aW9uKHgpIHsKICAgICAgY29uc3QgcmdiYVBhdHRlcm4gPSAvXnJnYmFcKChbMC05XSspLCAoWzAtOV0rKSwgKFswLTldKyksICgwKD86XC5bMC05XSspPylcKSQvOwogICAgICB7CiAgICAgICAgY29uc3QgbSA9IHgubWF0Y2gocmdiYVBhdHRlcm4pOwogICAgICAgIGlmIChtICE9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gW3BhcnNlSW50KG1bMV0sIDEwKSwgcGFyc2VJbnQobVsyXSwgMTApLCBwYXJzZUludChtWzNdLCAxMCksIHBhcnNlRmxvYXQobVs0XSldOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBoZXhQYXR0ZXJuID0gL14jKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pJC87CiAgICAgIHsKICAgICAgICBjb25zdCBtID0geC5tYXRjaChoZXhQYXR0ZXJuKTsKICAgICAgICBpZiAobSAhPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIFtwYXJzZUludChtWzFdLCAxNiksIHBhcnNlSW50KG1bMl0sIDE2KSwgcGFyc2VJbnQobVszXSwgMTYpLCAxXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlcmlhbGl6ZWQgY29sb3I6ICR7SlNPTi5zdHJpbmdpZnkoeCl9LmApOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VSR0JBQ29sb3JTcGVjaWZpY2F0aW9uKHgpIHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAodHlwZW9mIHggIT09ICJzdHJpbmciKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN0cmluZywgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkoeCl9LmApOwogICAgICAgIH0KICAgICAgICBjb25zdCBjb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHg7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VDb2xvclNlcmlhbGl6YXRpb24oY29udGV4dC5maWxsU3R5bGUpOwogICAgICAgIHJldHVybiB2ZWM0X2V4cG9ydHMuZnJvbVZhbHVlcyhyZXN1bHRbMF0gLyAyNTUsIHJlc3VsdFsxXSAvIDI1NSwgcmVzdWx0WzJdIC8gMjU1LCByZXN1bHRbM10pOwogICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgY29sb3Igc3BlY2lmaWNhdGlvbjogJHtwYXJzZUVycm9yLm1lc3NhZ2V9YCk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlUkdCQ29sb3JTcGVjaWZpY2F0aW9uKHgpIHsKICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VSR0JBQ29sb3JTcGVjaWZpY2F0aW9uKHgpOwogICAgICByZXR1cm4gcmVzdWx0LnN1YmFycmF5KDAsIDMpOwogICAgfQogICAgZnVuY3Rpb24gcGFja0NvbG9yKHgpIHsKICAgICAgY29uc3Qgc2l6ZSA9IHhbM10gPT09IHZvaWQgMCA/IDMgOiA0OwogICAgICBsZXQgcmVzdWx0ID0gMDsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDggPj4+IDApICsgTWF0aC5taW4oMjU1LCBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKHhbc2l6ZSAtIDEgLSBpXSAqIDI1NSkpKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gdW5wYWNrUkdCKHZhbHVlKSB7CiAgICAgIHJldHVybiB2ZWMzX2V4cG9ydHMuZnJvbVZhbHVlcygodmFsdWUgPj4+IDAgJiAyNTUpIC8gMjU1LCAodmFsdWUgPj4+IDggJiAyNTUpIC8gMjU1LCAodmFsdWUgPj4+IDE2ICYgMjU1KSAvIDI1NSk7CiAgICB9CiAgICBmdW5jdGlvbiB1bnBhY2tSR0JBKHZhbHVlKSB7CiAgICAgIHJldHVybiB2ZWM0X2V4cG9ydHMuZnJvbVZhbHVlcygodmFsdWUgPj4+IDAgJiAyNTUpIC8gMjU1LCAodmFsdWUgPj4+IDggJiAyNTUpIC8gMjU1LCAodmFsdWUgPj4+IDE2ICYgMjU1KSAvIDI1NSwgKHZhbHVlID4+PiAyNCAmIDI1NSkgLyAyNTUpOwogICAgfQogICAgZnVuY3Rpb24gc2VyaWFsaXplQ29sb3IoeCkgewogICAgICBpZiAoeFszXSA9PT0gdm9pZCAwIHx8IHhbM10gPT09IDEpIHsKICAgICAgICBsZXQgcmVzdWx0ID0gIiMiOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgICAgICByZXN1bHQgKz0gaGV4RW5jb2RlQnl0ZShNYXRoLm1pbigyNTUsIE1hdGgubWF4KDAsIE1hdGgucm91bmQoeFtpXSAqIDI1NSkpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IHJlc3VsdCA9ICJyZ2JhKCI7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgICAgIGlmIChpICE9PSAwKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSAiLCAiOwogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0ICs9IE1hdGgubWluKDI1NSwgTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh4W2ldICogMjU1KSkpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgKz0gYCwgJHtmbG9hdDMyVG9TdHJpbmcoeFszXSl9KWA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdXRpbC9lbmRpYW4udHMKICAgIHZhciBFbmRpYW5uZXNzOwogICAgKGZ1bmN0aW9uKEVuZGlhbm5lc3M0KSB7CiAgICAgIEVuZGlhbm5lc3M0W0VuZGlhbm5lc3M0WyJMSVRUTEUiXSA9IDBdID0gIkxJVFRMRSI7CiAgICAgIEVuZGlhbm5lc3M0W0VuZGlhbm5lc3M0WyJCSUciXSA9IDFdID0gIkJJRyI7CiAgICB9KShFbmRpYW5uZXNzIHx8IChFbmRpYW5uZXNzID0ge30pKTsKICAgIGZ1bmN0aW9uIGRldGVybWluZUVuZGlhbm5lc3MoKSB7CiAgICAgIGNvbnN0IGEgPSBVaW50MTZBcnJheS5vZig0Mzg2KTsKICAgICAgY29uc3QgYiA9IG5ldyBVaW50OEFycmF5KGEuYnVmZmVyKTsKICAgICAgcmV0dXJuIGJbMF0gPT09IDE3ID8gMSA6IDA7CiAgICB9CiAgICB2YXIgRU5ESUFOTkVTUyA9IGRldGVybWluZUVuZGlhbm5lc3MoKTsKICAgIGZ1bmN0aW9uIHN3YXBFbmRpYW4xNihhcnJheSkgewogICAgICBsZXQgdmlldyA9IG5ldyBVaW50OEFycmF5KGFycmF5LmJ1ZmZlciwgYXJyYXkuYnl0ZU9mZnNldCwgYXJyYXkuYnl0ZUxlbmd0aCk7CiAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGg0ID0gdmlldy5sZW5ndGg7IGkgPCBsZW5ndGg0OyBpICs9IDIpIHsKICAgICAgICBsZXQgdGVtcCA9IHZpZXdbaV07CiAgICAgICAgdmlld1tpXSA9IHZpZXdbaSArIDFdOwogICAgICAgIHZpZXdbaSArIDFdID0gdGVtcDsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc3dhcEVuZGlhbjMyKGFycmF5KSB7CiAgICAgIGxldCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkuYnVmZmVyLCBhcnJheS5ieXRlT2Zmc2V0LCBhcnJheS5ieXRlTGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aDQgPSB2aWV3Lmxlbmd0aDsgaSA8IGxlbmd0aDQ7IGkgKz0gNCkgewogICAgICAgIGxldCB0ZW1wID0gdmlld1tpXTsKICAgICAgICB2aWV3W2ldID0gdmlld1tpICsgM107CiAgICAgICAgdmlld1tpICsgM10gPSB0ZW1wOwogICAgICAgIHRlbXAgPSB2aWV3W2kgKyAxXTsKICAgICAgICB2aWV3W2kgKyAxXSA9IHZpZXdbaSArIDJdOwogICAgICAgIHZpZXdbaSArIDJdID0gdGVtcDsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc3dhcEVuZGlhbjY0KGFycmF5KSB7CiAgICAgIGxldCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkuYnVmZmVyLCBhcnJheS5ieXRlT2Zmc2V0LCBhcnJheS5ieXRlTGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aDQgPSB2aWV3Lmxlbmd0aDsgaSA8IGxlbmd0aDQ7IGkgKz0gOCkgewogICAgICAgIGxldCB0ZW1wID0gdmlld1tpXTsKICAgICAgICB2aWV3W2ldID0gdmlld1tpICsgN107CiAgICAgICAgdmlld1tpICsgN10gPSB0ZW1wOwogICAgICAgIHRlbXAgPSB2aWV3W2kgKyAxXTsKICAgICAgICB2aWV3W2kgKyAxXSA9IHZpZXdbaSArIDZdOwogICAgICAgIHZpZXdbaSArIDZdID0gdGVtcDsKICAgICAgICB0ZW1wID0gdmlld1tpICsgMl07CiAgICAgICAgdmlld1tpICsgMl0gPSB2aWV3W2kgKyA1XTsKICAgICAgICB2aWV3W2kgKyA1XSA9IHRlbXA7CiAgICAgICAgdGVtcCA9IHZpZXdbaSArIDNdOwogICAgICAgIHZpZXdbaSArIDNdID0gdmlld1tpICsgNF07CiAgICAgICAgdmlld1tpICsgNF0gPSB0ZW1wOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjb252ZXJ0RW5kaWFuMTYoYXJyYXksIHNvdXJjZSwgdGFyZ2V0ID0gRU5ESUFOTkVTUykgewogICAgICBpZiAoc291cmNlICE9PSB0YXJnZXQpIHsKICAgICAgICBzd2FwRW5kaWFuMTYoYXJyYXkpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjb252ZXJ0RW5kaWFuMzIoYXJyYXksIHNvdXJjZSwgdGFyZ2V0ID0gRU5ESUFOTkVTUykgewogICAgICBpZiAoc291cmNlICE9PSB0YXJnZXQpIHsKICAgICAgICBzd2FwRW5kaWFuMzIoYXJyYXkpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjb252ZXJ0RW5kaWFuKGFycmF5LCBzb3VyY2UsIGVsZW1lbnRCeXRlcywgdGFyZ2V0ID0gRU5ESUFOTkVTUykgewogICAgICBpZiAoc291cmNlID09PSB0YXJnZXQgfHwgZWxlbWVudEJ5dGVzID09PSAxKQogICAgICAgIHJldHVybjsKICAgICAgc3dpdGNoIChlbGVtZW50Qnl0ZXMpIHsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBzd2FwRW5kaWFuMTYoYXJyYXkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgc3dhcEVuZGlhbjMyKGFycmF5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgODoKICAgICAgICAgIHN3YXBFbmRpYW42NChhcnJheSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgdmFyIGZsb2F0NjRCdWYgPSBuZXcgRmxvYXQ2NEFycmF5KDEpOwogICAgbmV3IFVpbnQzMkFycmF5KGZsb2F0NjRCdWYuYnVmZmVyKTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3V0aWwvdWludDY0LnRzCiAgICB2YXIgcmFuZG9tVGVtcEJ1ZmZlciA9IG5ldyBVaW50MzJBcnJheSgyKTsKICAgIHZhciB0cnVlQmFzZSA9IDQyOTQ5NjcyOTY7CiAgICB2YXIgc3RyaW5nQ29udmVyc2lvbkRhdGEgPSBbXTsKICAgIGZvciAobGV0IGJhc2UgPSAyOyBiYXNlIDw9IDM2OyArK2Jhc2UpIHsKICAgICAgbGV0IGxvd0RpZ2l0cyA9IE1hdGguZmxvb3IoMzIgLyBNYXRoLmxvZzIoYmFzZSkpOwogICAgICBsZXQgbG93QmFzZSA9IE1hdGgucG93KGJhc2UsIGxvd0RpZ2l0cyk7CiAgICAgIGxldCBwYXR0ZXJuU3RyaW5nID0gYF5bMC0ke1N0cmluZy5mcm9tQ2hhckNvZGUoIjAiLmNoYXJDb2RlQXQoMCkgKyBNYXRoLm1pbig5LCBiYXNlIC0gMSkpfWA7CiAgICAgIGlmIChiYXNlID4gMTApIHsKICAgICAgICBwYXR0ZXJuU3RyaW5nICs9IGBhLSR7U3RyaW5nLmZyb21DaGFyQ29kZSgiYSIuY2hhckNvZGVBdCgwKSArIGJhc2UgLSAxMSl9YDsKICAgICAgICBwYXR0ZXJuU3RyaW5nICs9IGBBLSR7U3RyaW5nLmZyb21DaGFyQ29kZSgiQSIuY2hhckNvZGVBdCgwKSArIGJhc2UgLSAxMSl9YDsKICAgICAgfQogICAgICBsZXQgbWF4RGlnaXRzID0gTWF0aC5jZWlsKDY0IC8gTWF0aC5sb2cyKGJhc2UpKTsKICAgICAgcGF0dGVyblN0cmluZyArPSBgXXsxLCR7bWF4RGlnaXRzfX0kYDsKICAgICAgbGV0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKHBhdHRlcm5TdHJpbmcpOwogICAgICBzdHJpbmdDb252ZXJzaW9uRGF0YVtiYXNlXSA9IHsgbG93RGlnaXRzLCBsb3dCYXNlLCBwYXR0ZXJuIH07CiAgICB9CiAgICBmdW5jdGlvbiB1aW50MzJNdWx0aXBseUhpZ2goYSwgYikgewogICAgICBhID4+Pj0gMDsKICAgICAgYiA+Pj49IDA7CiAgICAgIGNvbnN0IGEwMCA9IGEgJiA2NTUzNSwgYTE2ID0gYSA+Pj4gMTY7CiAgICAgIGNvbnN0IGIwMCA9IGIgJiA2NTUzNSwgYjE2ID0gYiA+Pj4gMTY7CiAgICAgIGxldCBjMDAgPSBhMDAgKiBiMDA7CiAgICAgIGxldCBjMTYgPSAoYzAwID4+PiAxNikgKyBhMTYgKiBiMDA7CiAgICAgIGxldCBjMzIgPSBjMTYgPj4+IDE2OwogICAgICBjMTYgPSAoYzE2ICYgNjU1MzUpICsgYTAwICogYjE2OwogICAgICBjMzIgKz0gYzE2ID4+PiAxNjsKICAgICAgbGV0IGM0OCA9IGMzMiA+Pj4gMTY7CiAgICAgIGMzMiA9IChjMzIgJiA2NTUzNSkgKyBhMTYgKiBiMTY7CiAgICAgIGM0OCArPSBjMzIgPj4+IDE2OwogICAgICByZXR1cm4gKChjNDggJiA2NTUzNSkgPDwgMTYgfCBjMzIgJiA2NTUzNSkgPj4+IDA7CiAgICB9CiAgICB2YXIgX1VpbnQ2NCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IobG93ID0gMCwgaGlnaCA9IDApIHsKICAgICAgICB0aGlzLmxvdyA9IGxvdzsKICAgICAgICB0aGlzLmhpZ2ggPSBoaWdoOwogICAgICB9CiAgICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgX1VpbnQ2NCh0aGlzLmxvdywgdGhpcy5oaWdoKTsKICAgICAgfQogICAgICBhc3NpZ24oeCkgewogICAgICAgIHRoaXMubG93ID0geC5sb3c7CiAgICAgICAgdGhpcy5oaWdoID0geC5oaWdoOwogICAgICB9CiAgICAgIHRvU3RyaW5nKGJhc2UgPSAxMCkgewogICAgICAgIGxldCB2TG93ID0gdGhpcy5sb3csIHZIaWdoID0gdGhpcy5oaWdoOwogICAgICAgIGlmICh2SGlnaCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIHZMb3cudG9TdHJpbmcoYmFzZSk7CiAgICAgICAgfQogICAgICAgIHZIaWdoICo9IHRydWVCYXNlOwogICAgICAgIGxldCB7IGxvd0Jhc2UsIGxvd0RpZ2l0cyB9ID0gc3RyaW5nQ29udmVyc2lvbkRhdGFbYmFzZV07CiAgICAgICAgbGV0IHZIaWdoRXh0cmEgPSB2SGlnaCAlIGxvd0Jhc2U7CiAgICAgICAgdkhpZ2ggPSBNYXRoLmZsb29yKHZIaWdoIC8gbG93QmFzZSk7CiAgICAgICAgdkxvdyArPSB2SGlnaEV4dHJhOwogICAgICAgIHZIaWdoICs9IE1hdGguZmxvb3IodkxvdyAvIGxvd0Jhc2UpOwogICAgICAgIHZMb3cgPSB2TG93ICUgbG93QmFzZTsKICAgICAgICBsZXQgdkxvd1N0ciA9IHZMb3cudG9TdHJpbmcoYmFzZSk7CiAgICAgICAgcmV0dXJuIHZIaWdoLnRvU3RyaW5nKGJhc2UpICsgIjAiLnJlcGVhdChsb3dEaWdpdHMgLSB2TG93U3RyLmxlbmd0aCkgKyB2TG93U3RyOwogICAgICB9CiAgICAgIHN0YXRpYyBsZXNzKGEsIGIpIHsKICAgICAgICByZXR1cm4gYS5oaWdoIDwgYi5oaWdoIHx8IGEuaGlnaCA9PT0gYi5oaWdoICYmIGEubG93IDwgYi5sb3c7CiAgICAgIH0KICAgICAgc3RhdGljIGNvbXBhcmUoYSwgYikgewogICAgICAgIHJldHVybiBhLmhpZ2ggLSBiLmhpZ2ggfHwgYS5sb3cgLSBiLmxvdzsKICAgICAgfQogICAgICBzdGF0aWMgZXF1YWwoYSwgYikgewogICAgICAgIHJldHVybiBhLmxvdyA9PT0gYi5sb3cgJiYgYS5oaWdoID09PSBiLmhpZ2g7CiAgICAgIH0KICAgICAgc3RhdGljIG1pbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIF9VaW50NjQubGVzcyhhLCBiKSA/IGEgOiBiOwogICAgICB9CiAgICAgIHN0YXRpYyBtYXgoYSwgYikgewogICAgICAgIHJldHVybiBfVWludDY0Lmxlc3MoYSwgYikgPyBiIDogYTsKICAgICAgfQogICAgICBzdGF0aWMgcmFuZG9tKCkgewogICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMocmFuZG9tVGVtcEJ1ZmZlcik7CiAgICAgICAgcmV0dXJuIG5ldyBfVWludDY0KHJhbmRvbVRlbXBCdWZmZXJbMF0sIHJhbmRvbVRlbXBCdWZmZXJbMV0pOwogICAgICB9CiAgICAgIHRyeVBhcnNlU3RyaW5nKHMsIGJhc2UgPSAxMCkgewogICAgICAgIGNvbnN0IHsgbG93RGlnaXRzLCBsb3dCYXNlLCBwYXR0ZXJuIH0gPSBzdHJpbmdDb252ZXJzaW9uRGF0YVtiYXNlXTsKICAgICAgICBpZiAoIXBhdHRlcm4udGVzdChzKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAocy5sZW5ndGggPD0gbG93RGlnaXRzKSB7CiAgICAgICAgICB0aGlzLmxvdyA9IHBhcnNlSW50KHMsIGJhc2UpOwogICAgICAgICAgdGhpcy5oaWdoID0gMDsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBzcGxpdFBvaW50ID0gcy5sZW5ndGggLSBsb3dEaWdpdHM7CiAgICAgICAgY29uc3QgbG93UHJpbWUgPSBwYXJzZUludChzLnN1YnN0cihzcGxpdFBvaW50KSwgYmFzZSk7CiAgICAgICAgY29uc3QgaGlnaFByaW1lID0gcGFyc2VJbnQocy5zdWJzdHIoMCwgc3BsaXRQb2ludCksIGJhc2UpOwogICAgICAgIGxldCBoaWdoLCBsb3c7CiAgICAgICAgaWYgKGxvd0Jhc2UgPT09IHRydWVCYXNlKSB7CiAgICAgICAgICBoaWdoID0gaGlnaFByaW1lOwogICAgICAgICAgbG93ID0gbG93UHJpbWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGhpZ2hSZW1haW5kZXIgPSBNYXRoLmltdWwoaGlnaFByaW1lLCBsb3dCYXNlKSA+Pj4gMDsKICAgICAgICAgIGhpZ2ggPSB1aW50MzJNdWx0aXBseUhpZ2goaGlnaFByaW1lLCBsb3dCYXNlKSArIChNYXRoLmltdWwoTWF0aC5mbG9vcihoaWdoUHJpbWUgLyB0cnVlQmFzZSksIGxvd0Jhc2UpID4+PiAwKTsKICAgICAgICAgIGxvdyA9IGxvd1ByaW1lICsgaGlnaFJlbWFpbmRlcjsKICAgICAgICAgIGlmIChsb3cgPj0gdHJ1ZUJhc2UpIHsKICAgICAgICAgICAgKytoaWdoOwogICAgICAgICAgICBsb3cgLT0gdHJ1ZUJhc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChsb3cgPj4+IDAgIT09IGxvdyB8fCBoaWdoID4+PiAwICE9PSBoaWdoKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMubG93ID0gbG93OwogICAgICAgIHRoaXMuaGlnaCA9IGhpZ2g7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcGFyc2VTdHJpbmcocywgYmFzZSA9IDEwKSB7CiAgICAgICAgaWYgKCF0aGlzLnRyeVBhcnNlU3RyaW5nKHMsIGJhc2UpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBzdHJpbmcgYXMgdWludDY0IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHMpfS5gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgc3RhdGljIHBhcnNlU3RyaW5nKHMsIGJhc2UgPSAxMCkgewogICAgICAgIGxldCB4ID0gbmV3IF9VaW50NjQoKTsKICAgICAgICByZXR1cm4geC5wYXJzZVN0cmluZyhzLCBiYXNlKTsKICAgICAgfQogICAgICB2YWxpZCgpIHsKICAgICAgICBsZXQgeyBsb3csIGhpZ2ggfSA9IHRoaXM7CiAgICAgICAgcmV0dXJuIGxvdyA+Pj4gMCA9PT0gbG93ICYmIGhpZ2ggPj4+IDAgPT09IGhpZ2g7CiAgICAgIH0KICAgICAgdG9KU09OKCkgewogICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgc3RhdGljIGxzaGlmdChvdXQsIGlucHV0LCBiaXRzKSB7CiAgICAgICAgY29uc3QgeyBsb3csIGhpZ2ggfSA9IGlucHV0OwogICAgICAgIGlmIChiaXRzID09PSAwKSB7CiAgICAgICAgICBvdXQubG93ID0gbG93OwogICAgICAgICAgb3V0LmhpZ2ggPSBoaWdoOwogICAgICAgIH0gZWxzZSBpZiAoYml0cyA8IDMyKSB7CiAgICAgICAgICBvdXQubG93ID0gbG93IDw8IGJpdHM7CiAgICAgICAgICBvdXQuaGlnaCA9IGhpZ2ggPDwgYml0cyB8IGxvdyA+Pj4gMzIgLSBiaXRzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvdXQubG93ID0gMDsKICAgICAgICAgIG91dC5oaWdoID0gbG93IDw8IGJpdHMgLSAzMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dDsKICAgICAgfQogICAgICBzdGF0aWMgcnNoaWZ0KG91dCwgaW5wdXQsIGJpdHMpIHsKICAgICAgICBjb25zdCB7IGxvdywgaGlnaCB9ID0gaW5wdXQ7CiAgICAgICAgaWYgKGJpdHMgPT09IDApIHsKICAgICAgICAgIG91dC5sb3cgPSBsb3c7CiAgICAgICAgICBvdXQuaGlnaCA9IGhpZ2g7CiAgICAgICAgfSBlbHNlIGlmIChiaXRzIDwgMzIpIHsKICAgICAgICAgIG91dC5sb3cgPSBsb3cgPj4+IGJpdHMgfCBoaWdoIDw8IDMyIC0gYml0czsKICAgICAgICAgIG91dC5oaWdoID0gaGlnaCA+Pj4gYml0czsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb3V0LmxvdyA9IGhpZ2ggPj4+IGJpdHMgLSAzMjsKICAgICAgICAgIG91dC5oaWdoID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dDsKICAgICAgfQogICAgICBzdGF0aWMgb3Iob3V0LCBhLCBiKSB7CiAgICAgICAgb3V0LmxvdyA9IGEubG93IHwgYi5sb3c7CiAgICAgICAgb3V0LmhpZ2ggPSBhLmhpZ2ggfCBiLmhpZ2g7CiAgICAgICAgcmV0dXJuIG91dDsKICAgICAgfQogICAgICBzdGF0aWMgeG9yKG91dCwgYSwgYikgewogICAgICAgIG91dC5sb3cgPSBhLmxvdyBeIGIubG93OwogICAgICAgIG91dC5oaWdoID0gYS5oaWdoIF4gYi5oaWdoOwogICAgICAgIHJldHVybiBvdXQ7CiAgICAgIH0KICAgICAgc3RhdGljIGFuZChvdXQsIGEsIGIpIHsKICAgICAgICBvdXQubG93ID0gYS5sb3cgJiBiLmxvdzsKICAgICAgICBvdXQuaGlnaCA9IGEuaGlnaCAmIGIuaGlnaDsKICAgICAgICByZXR1cm4gb3V0OwogICAgICB9CiAgICAgIHN0YXRpYyBhZGQob3V0LCBhLCBiKSB7CiAgICAgICAgbGV0IGxvd1N1bSA9IGEubG93ICsgYi5sb3c7CiAgICAgICAgbGV0IGhpZ2hTdW0gPSBhLmhpZ2ggKyBiLmhpZ2g7CiAgICAgICAgY29uc3QgbG93ID0gbG93U3VtID4+PiAwOwogICAgICAgIGlmIChsb3cgIT09IGxvd1N1bSkKICAgICAgICAgIGhpZ2hTdW0gKz0gMTsKICAgICAgICBvdXQubG93ID0gbG93OwogICAgICAgIG91dC5oaWdoID0gaGlnaFN1bSA+Pj4gMDsKICAgICAgICByZXR1cm4gb3V0OwogICAgICB9CiAgICAgIHN0YXRpYyBhZGRVaW50MzIob3V0LCBhLCBiKSB7CiAgICAgICAgbGV0IGxvd1N1bSA9IGEubG93ICsgYjsKICAgICAgICBsZXQgaGlnaFN1bSA9IGEuaGlnaDsKICAgICAgICBjb25zdCBsb3cgPSBsb3dTdW0gPj4+IDA7CiAgICAgICAgaWYgKGxvdyAhPT0gbG93U3VtKQogICAgICAgICAgaGlnaFN1bSArPSAxOwogICAgICAgIG91dC5sb3cgPSBsb3c7CiAgICAgICAgb3V0LmhpZ2ggPSBoaWdoU3VtID4+PiAwOwogICAgICAgIHJldHVybiBvdXQ7CiAgICAgIH0KICAgICAgc3RhdGljIGRlY3JlbWVudChvdXQsIGlucHV0KSB7CiAgICAgICAgbGV0IHsgbG93LCBoaWdoIH0gPSBpbnB1dDsKICAgICAgICBpZiAobG93ID09PSAwKSB7CiAgICAgICAgICBoaWdoIC09IDE7CiAgICAgICAgfQogICAgICAgIG91dC5sb3cgPSBsb3cgLSAxID4+PiAwOwogICAgICAgIG91dC5oaWdoID0gaGlnaCA+Pj4gMDsKICAgICAgICByZXR1cm4gb3V0OwogICAgICB9CiAgICAgIHN0YXRpYyBpbmNyZW1lbnQob3V0LCBpbnB1dCkgewogICAgICAgIGxldCB7IGxvdywgaGlnaCB9ID0gaW5wdXQ7CiAgICAgICAgaWYgKGxvdyA9PT0gNDI5NDk2NzI5NSkKICAgICAgICAgIGhpZ2ggKz0gMTsKICAgICAgICBvdXQubG93ID0gbG93ICsgMSA+Pj4gMDsKICAgICAgICBvdXQuaGlnaCA9IGhpZ2ggPj4+IDA7CiAgICAgICAgcmV0dXJuIG91dDsKICAgICAgfQogICAgICBzdGF0aWMgc3VidHJhY3Qob3V0LCBhLCBiKSB7CiAgICAgICAgbGV0IGxvd1N1bSA9IGEubG93IC0gYi5sb3c7CiAgICAgICAgbGV0IGhpZ2hTdW0gPSBhLmhpZ2ggLSBiLmhpZ2g7CiAgICAgICAgY29uc3QgbG93ID0gbG93U3VtID4+PiAwOwogICAgICAgIGlmIChsb3cgIT09IGxvd1N1bSkKICAgICAgICAgIGhpZ2hTdW0gLT0gMTsKICAgICAgICBvdXQubG93ID0gbG93OwogICAgICAgIG91dC5oaWdoID0gaGlnaFN1bSA+Pj4gMDsKICAgICAgICByZXR1cm4gb3V0OwogICAgICB9CiAgICAgIHN0YXRpYyBhYnNEaWZmZXJlbmNlKG91dCwgYSwgYikgewogICAgICAgIHJldHVybiBfVWludDY0Lmxlc3MoYSwgYikgPyBfVWludDY0LnN1YnRyYWN0KG91dCwgYiwgYSkgOiBfVWludDY0LnN1YnRyYWN0KG91dCwgYSwgYik7CiAgICAgIH0KICAgICAgc3RhdGljIG11bHRpcGx5VWludDMyKG91dCwgYSwgYikgewogICAgICAgIGNvbnN0IHsgbG93LCBoaWdoIH0gPSBhOwogICAgICAgIG91dC5sb3cgPSBNYXRoLmltdWwobG93LCBiKSA+Pj4gMDsKICAgICAgICBvdXQuaGlnaCA9IE1hdGguaW11bChoaWdoLCBiKSArIHVpbnQzMk11bHRpcGx5SGlnaChsb3csIGIpID4+PiAwOwogICAgICAgIHJldHVybiBvdXQ7CiAgICAgIH0KICAgICAgc3RhdGljIGxvd01hc2sob3V0LCBiaXRzKSB7CiAgICAgICAgaWYgKGJpdHMgPT09IDApIHsKICAgICAgICAgIG91dC5oaWdoID0gb3V0LmxvdyA9IDA7CiAgICAgICAgfSBlbHNlIGlmIChiaXRzIDw9IDMyKSB7CiAgICAgICAgICBvdXQuaGlnaCA9IDA7CiAgICAgICAgICBvdXQubG93ID0gNDI5NDk2NzI5NSA+Pj4gMzIgLSBiaXRzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvdXQuaGlnaCA9IDQyOTQ5NjcyOTUgPj4+IGJpdHMgLSAzMjsKICAgICAgICAgIG91dC5sb3cgPSA0Mjk0OTY3Mjk1OwogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0OwogICAgICB9CiAgICAgIHRvTnVtYmVyKCkgewogICAgICAgIHJldHVybiB0aGlzLmxvdyArIHRoaXMuaGlnaCAqIDQyOTQ5NjcyOTY7CiAgICAgIH0KICAgICAgc2V0RnJvbU51bWJlcih2YWx1ZSkgewogICAgICAgIHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSk7CiAgICAgICAgaWYgKHZhbHVlIDwgMCkgewogICAgICAgICAgdGhpcy5sb3cgPSB0aGlzLmhpZ2ggPSAwOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMTg0NDY3NDQwNzM3MDk1NTJlMykgewogICAgICAgICAgdGhpcy5sb3cgPSB0aGlzLmhpZ2ggPSA0Mjk0OTY3Mjk1OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmxvdyA9IHZhbHVlICUgNDI5NDk2NzI5NjsKICAgICAgICAgIHRoaXMuaGlnaCA9IE1hdGguZmxvb3IodmFsdWUgLyA0Mjk0OTY3Mjk2KTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICB2YXIgVWludDY0ID0gX1VpbnQ2NDsKICAgIFVpbnQ2NC5aRVJPID0gbmV3IF9VaW50NjQoMCwgMCk7CiAgICBVaW50NjQuT05FID0gbmV3IF9VaW50NjQoMSwgMCk7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL2xlcnAudHMKICAgICh7CiAgICAgIFtEYXRhVHlwZS5VSU5UOF06IFswLCAyNTVdLAogICAgICBbRGF0YVR5cGUuSU5UOF06IFstMTI4LCAxMjddLAogICAgICBbRGF0YVR5cGUuVUlOVDE2XTogWzAsIDY1NTM1XSwKICAgICAgW0RhdGFUeXBlLklOVDE2XTogWy0zMjc2OCwgMzI3NjddLAogICAgICBbRGF0YVR5cGUuVUlOVDMyXTogWzAsIDQyOTQ5NjcyOTVdLAogICAgICBbRGF0YVR5cGUuSU5UMzJdOiBbLTIxNDc0ODM2NDgsIDIxNDc0ODM2NDddLAogICAgICBbRGF0YVR5cGUuVUlOVDY0XTogW1VpbnQ2NC5aRVJPLCBuZXcgVWludDY0KDQyOTQ5NjcyOTUsIDQyOTQ5NjcyOTUpXSwKICAgICAgW0RhdGFUeXBlLkZMT0FUMzJdOiBbMCwgMV0KICAgIH0pOwogICAgbmV3IFVpbnQ2NCgpOwogICAgbmV3IFVpbnQ2NCgpOwogICAgZnVuY3Rpb24gZ2V0UmFuZG9tVmFsdWVzKGFycmF5KSB7CiAgICAgIGxldCBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheS5idWZmZXIsIGFycmF5LmJ5dGVPZmZzZXQsIGFycmF5LmJ5dGVMZW5ndGgpOwogICAgICBjb25zdCBibG9ja1NpemUgPSA2NTUzNjsKICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aDQgPSBieXRlQXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoNDsgaSArPSBibG9ja1NpemUpIHsKICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ5dGVBcnJheS5zdWJhcnJheShpLCBNYXRoLm1pbihsZW5ndGg0LCBpICsgYmxvY2tTaXplKSkpOwogICAgICB9CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIHZhciBBbm5vdGF0aW9uVHlwZTsKICAgIChmdW5jdGlvbihBbm5vdGF0aW9uVHlwZTIpIHsKICAgICAgQW5ub3RhdGlvblR5cGUyW0Fubm90YXRpb25UeXBlMlsiUE9JTlQiXSA9IDBdID0gIlBPSU5UIjsKICAgICAgQW5ub3RhdGlvblR5cGUyW0Fubm90YXRpb25UeXBlMlsiTElORSJdID0gMV0gPSAiTElORSI7CiAgICAgIEFubm90YXRpb25UeXBlMltBbm5vdGF0aW9uVHlwZTJbIkFYSVNfQUxJR05FRF9CT1VORElOR19CT1giXSA9IDJdID0gIkFYSVNfQUxJR05FRF9CT1VORElOR19CT1giOwogICAgICBBbm5vdGF0aW9uVHlwZTJbQW5ub3RhdGlvblR5cGUyWyJFTExJUFNPSUQiXSA9IDNdID0gIkVMTElQU09JRCI7CiAgICAgIEFubm90YXRpb25UeXBlMltBbm5vdGF0aW9uVHlwZTJbIlNQSEVSRSJdID0gNF0gPSAiU1BIRVJFIjsKICAgIH0pKEFubm90YXRpb25UeXBlIHx8IChBbm5vdGF0aW9uVHlwZSA9IHt9KSk7CiAgICB2YXIgYW5ub3RhdGlvblR5cGVzID0gWwogICAgICAwLAogICAgICAxLAogICAgICAyLAogICAgICAzLAogICAgICA0CiAgICBdOwogICAgdmFyIGFubm90YXRpb25Qcm9wZXJ0eVR5cGVIYW5kbGVycyA9IHsKICAgICAgInJnYiI6IHsKICAgICAgICBzZXJpYWxpemVkQnl0ZXMoKSB7CiAgICAgICAgICByZXR1cm4gMzsKICAgICAgICB9LAogICAgICAgIGFsaWdubWVudCgpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0sCiAgICAgICAgc2VyaWFsaXplQ29kZShwcm9wZXJ0eSwgb2Zmc2V0KSB7CiAgICAgICAgICByZXR1cm4gYGR2LnNldFVpbnQxNigke29mZnNldH0sICR7cHJvcGVydHl9LCB0cnVlKTtkdi5zZXRVaW50OCgke29mZnNldH0gKyAyLCAke3Byb3BlcnR5fSA+Pj4gMTYpO2A7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZUNvZGUocHJvcGVydHksIG9mZnNldCkgewogICAgICAgICAgcmV0dXJuIGAke3Byb3BlcnR5fSA9IGR2LmdldFVpbnQxNigke29mZnNldH0sIHRydWUpIHwgKGR2LmdldFVpbnQ4KCR7b2Zmc2V0fSArIDIpIDw8IDE2KTtgOwogICAgICAgIH0sCiAgICAgICAgZGVzZXJpYWxpemVKc29uKG9iaikgewogICAgICAgICAgcmV0dXJuIHBhY2tDb2xvcihwYXJzZVJHQkNvbG9yU3BlY2lmaWNhdGlvbihvYmopKTsKICAgICAgICB9LAogICAgICAgIHNlcmlhbGl6ZUpzb24odmFsdWUpIHsKICAgICAgICAgIHJldHVybiBzZXJpYWxpemVDb2xvcih1bnBhY2tSR0IodmFsdWUpKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJyZ2JhIjogewogICAgICAgIHNlcmlhbGl6ZWRCeXRlcygpIHsKICAgICAgICAgIHJldHVybiA0OwogICAgICAgIH0sCiAgICAgICAgYWxpZ25tZW50KCkgewogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfSwKICAgICAgICBzZXJpYWxpemVDb2RlKHByb3BlcnR5LCBvZmZzZXQpIHsKICAgICAgICAgIHJldHVybiBgZHYuc2V0VWludDMyKCR7b2Zmc2V0fSwgJHtwcm9wZXJ0eX0sIHRydWUpO2A7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZUNvZGUocHJvcGVydHksIG9mZnNldCkgewogICAgICAgICAgcmV0dXJuIGAke3Byb3BlcnR5fSA9IGR2LmdldFVpbnQzMigke29mZnNldH0sIHRydWUpO2A7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZUpzb24ob2JqKSB7CiAgICAgICAgICByZXR1cm4gcGFja0NvbG9yKHBhcnNlUkdCQUNvbG9yU3BlY2lmaWNhdGlvbihvYmopKTsKICAgICAgICB9LAogICAgICAgIHNlcmlhbGl6ZUpzb24odmFsdWUpIHsKICAgICAgICAgIHJldHVybiBzZXJpYWxpemVDb2xvcih1bnBhY2tSR0JBKHZhbHVlKSk7CiAgICAgICAgfQogICAgICB9LAogICAgICAiZmxvYXQzMiI6IHsKICAgICAgICBzZXJpYWxpemVkQnl0ZXMoKSB7CiAgICAgICAgICByZXR1cm4gNDsKICAgICAgICB9LAogICAgICAgIGFsaWdubWVudCgpIHsKICAgICAgICAgIHJldHVybiA0OwogICAgICAgIH0sCiAgICAgICAgc2VyaWFsaXplQ29kZShwcm9wZXJ0eSwgb2Zmc2V0KSB7CiAgICAgICAgICByZXR1cm4gYGR2LnNldEZsb2F0MzIoJHtvZmZzZXR9LCAke3Byb3BlcnR5fSwgaXNMaXR0bGVFbmRpYW4pO2A7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZUNvZGUocHJvcGVydHksIG9mZnNldCkgewogICAgICAgICAgcmV0dXJuIGAke3Byb3BlcnR5fSA9IGR2LmdldEZsb2F0MzIoJHtvZmZzZXR9LCBpc0xpdHRsZUVuZGlhbik7YDsKICAgICAgICB9LAogICAgICAgIGRlc2VyaWFsaXplSnNvbihvYmopIHsKICAgICAgICAgIHJldHVybiB2ZXJpZnlGbG9hdChvYmopOwogICAgICAgIH0sCiAgICAgICAgc2VyaWFsaXplSnNvbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgfSwKICAgICAgInVpbnQzMiI6IHsKICAgICAgICBzZXJpYWxpemVkQnl0ZXMoKSB7CiAgICAgICAgICByZXR1cm4gNDsKICAgICAgICB9LAogICAgICAgIGFsaWdubWVudCgpIHsKICAgICAgICAgIHJldHVybiA0OwogICAgICAgIH0sCiAgICAgICAgc2VyaWFsaXplQ29kZShwcm9wZXJ0eSwgb2Zmc2V0KSB7CiAgICAgICAgICByZXR1cm4gYGR2LnNldFVpbnQzMigke29mZnNldH0sICR7cHJvcGVydHl9LCBpc0xpdHRsZUVuZGlhbik7YDsKICAgICAgICB9LAogICAgICAgIGRlc2VyaWFsaXplQ29kZShwcm9wZXJ0eSwgb2Zmc2V0KSB7CiAgICAgICAgICByZXR1cm4gYCR7cHJvcGVydHl9ID0gZHYuZ2V0VWludDMyKCR7b2Zmc2V0fSwgaXNMaXR0bGVFbmRpYW4pO2A7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZUpzb24ob2JqKSB7CiAgICAgICAgICByZXR1cm4gdmVyaWZ5SW50KG9iaik7CiAgICAgICAgfSwKICAgICAgICBzZXJpYWxpemVKc29uKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICB9LAogICAgICAiaW50MzIiOiB7CiAgICAgICAgc2VyaWFsaXplZEJ5dGVzKCkgewogICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgfSwKICAgICAgICBhbGlnbm1lbnQoKSB7CiAgICAgICAgICByZXR1cm4gNDsKICAgICAgICB9LAogICAgICAgIHNlcmlhbGl6ZUNvZGUocHJvcGVydHksIG9mZnNldCkgewogICAgICAgICAgcmV0dXJuIGBkdi5zZXRJbnQzMigke29mZnNldH0sICR7cHJvcGVydHl9LCBpc0xpdHRsZUVuZGlhbik7YDsKICAgICAgICB9LAogICAgICAgIGRlc2VyaWFsaXplQ29kZShwcm9wZXJ0eSwgb2Zmc2V0KSB7CiAgICAgICAgICByZXR1cm4gYCR7cHJvcGVydHl9ID0gZHYuZ2V0SW50MzIoJHtvZmZzZXR9LCBpc0xpdHRsZUVuZGlhbik7YDsKICAgICAgICB9LAogICAgICAgIGRlc2VyaWFsaXplSnNvbihvYmopIHsKICAgICAgICAgIHJldHVybiB2ZXJpZnlJbnQob2JqKTsKICAgICAgICB9LAogICAgICAgIHNlcmlhbGl6ZUpzb24odmFsdWUpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJ1aW50MTYiOiB7CiAgICAgICAgc2VyaWFsaXplZEJ5dGVzKCkgewogICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfSwKICAgICAgICBhbGlnbm1lbnQoKSB7CiAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9LAogICAgICAgIHNlcmlhbGl6ZUNvZGUocHJvcGVydHksIG9mZnNldCkgewogICAgICAgICAgcmV0dXJuIGBkdi5zZXRVaW50MTYoJHtvZmZzZXR9LCAke3Byb3BlcnR5fSwgaXNMaXR0bGVFbmRpYW4pO2A7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZUNvZGUocHJvcGVydHksIG9mZnNldCkgewogICAgICAgICAgcmV0dXJuIGAke3Byb3BlcnR5fSA9IGR2LmdldFVpbnQxNigke29mZnNldH0sIGlzTGl0dGxlRW5kaWFuKTtgOwogICAgICAgIH0sCiAgICAgICAgZGVzZXJpYWxpemVKc29uKG9iaikgewogICAgICAgICAgcmV0dXJuIHZlcmlmeUludChvYmopOwogICAgICAgIH0sCiAgICAgICAgc2VyaWFsaXplSnNvbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgfSwKICAgICAgImludDE2IjogewogICAgICAgIHNlcmlhbGl6ZWRCeXRlcygpIHsKICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0sCiAgICAgICAgYWxpZ25tZW50KCkgewogICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfSwKICAgICAgICBzZXJpYWxpemVDb2RlKHByb3BlcnR5LCBvZmZzZXQpIHsKICAgICAgICAgIHJldHVybiBgZHYuc2V0SW50MTYoJHtvZmZzZXR9LCAke3Byb3BlcnR5fSwgaXNMaXR0bGVFbmRpYW4pO2A7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZUNvZGUocHJvcGVydHksIG9mZnNldCkgewogICAgICAgICAgcmV0dXJuIGAke3Byb3BlcnR5fSA9IGR2LmdldEludDE2KCR7b2Zmc2V0fSwgaXNMaXR0bGVFbmRpYW4pO2A7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZUpzb24ob2JqKSB7CiAgICAgICAgICByZXR1cm4gdmVyaWZ5SW50KG9iaik7CiAgICAgICAgfSwKICAgICAgICBzZXJpYWxpemVKc29uKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICB9LAogICAgICAidWludDgiOiB7CiAgICAgICAgc2VyaWFsaXplZEJ5dGVzKCkgewogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfSwKICAgICAgICBhbGlnbm1lbnQoKSB7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9LAogICAgICAgIHNlcmlhbGl6ZUNvZGUocHJvcGVydHksIG9mZnNldCkgewogICAgICAgICAgcmV0dXJuIGBkdi5zZXRVaW50OCgke29mZnNldH0sICR7cHJvcGVydHl9KTtgOwogICAgICAgIH0sCiAgICAgICAgZGVzZXJpYWxpemVDb2RlKHByb3BlcnR5LCBvZmZzZXQpIHsKICAgICAgICAgIHJldHVybiBgJHtwcm9wZXJ0eX0gPSBkdi5nZXRVaW50OCgke29mZnNldH0pO2A7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZUpzb24ob2JqKSB7CiAgICAgICAgICByZXR1cm4gdmVyaWZ5SW50KG9iaik7CiAgICAgICAgfSwKICAgICAgICBzZXJpYWxpemVKc29uKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICB9LAogICAgICAiaW50OCI6IHsKICAgICAgICBzZXJpYWxpemVkQnl0ZXMoKSB7CiAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9LAogICAgICAgIGFsaWdubWVudCgpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0sCiAgICAgICAgc2VyaWFsaXplQ29kZShwcm9wZXJ0eSwgb2Zmc2V0KSB7CiAgICAgICAgICByZXR1cm4gYGR2LnNldEludDgoJHtvZmZzZXR9LCAke3Byb3BlcnR5fSk7YDsKICAgICAgICB9LAogICAgICAgIGRlc2VyaWFsaXplQ29kZShwcm9wZXJ0eSwgb2Zmc2V0KSB7CiAgICAgICAgICByZXR1cm4gYCR7cHJvcGVydHl9ID0gZHYuZ2V0SW50OCgke29mZnNldH0pO2A7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZUpzb24ob2JqKSB7CiAgICAgICAgICByZXR1cm4gdmVyaWZ5SW50KG9iaik7CiAgICAgICAgfSwKICAgICAgICBzZXJpYWxpemVKc29uKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgdmFyIE1BWF9CVUZGRVJfU1RSSURFID0gMjU1OwogICAgZnVuY3Rpb24gZ2V0UHJvcGVydHlPZmZzZXRzKHJhbmssIGZpcnN0R3JvdXBJbml0aWFsT2Zmc2V0LCBwcm9wZXJ0eVNwZWNzKSB7CiAgICAgIGxldCBzZXJpYWxpemVkQnl0ZXMgPSAwOwogICAgICBjb25zdCBudW1Qcm9wZXJ0aWVzID0gcHJvcGVydHlTcGVjcy5sZW5ndGg7CiAgICAgIGNvbnN0IHBlcm11dGF0aW9uID0gbmV3IEFycmF5KG51bVByb3BlcnRpZXMpOwogICAgICBjb25zdCBwcm9wZXJ0eUdyb3VwQnl0ZXMgPSBbXTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Qcm9wZXJ0aWVzOyArK2kpIHsKICAgICAgICBwZXJtdXRhdGlvbltpXSA9IGk7CiAgICAgIH0KICAgICAgY29uc3QgZ2V0QWxpZ25tZW50ID0gKGkpID0+IGFubm90YXRpb25Qcm9wZXJ0eVR5cGVIYW5kbGVyc1twcm9wZXJ0eVNwZWNzW2ldLnR5cGVdLmFsaWdubWVudChyYW5rKTsKICAgICAgcGVybXV0YXRpb24uc29ydCgoaSwgaikgPT4gZ2V0QWxpZ25tZW50KGopIC0gZ2V0QWxpZ25tZW50KGkpKTsKICAgICAgbGV0IHByb3BlcnR5R3JvdXBJbmRleCA9IDA7CiAgICAgIGNvbnN0IG9mZnNldHMgPSBuZXcgQXJyYXkobnVtUHJvcGVydGllcyk7CiAgICAgIGxldCBwcm9wZXJ0eUdyb3VwT2Zmc2V0ID0gZmlyc3RHcm91cEluaXRpYWxPZmZzZXQ7CiAgICAgIGNvbnN0IG5leHRQcm9wZXJ0eUdyb3VwID0gKCkgPT4gewogICAgICAgIHByb3BlcnR5R3JvdXBPZmZzZXQgKz0gKDQgLSBwcm9wZXJ0eUdyb3VwT2Zmc2V0ICUgNCkgJSA0OwogICAgICAgIHNlcmlhbGl6ZWRCeXRlcyArPSBwcm9wZXJ0eUdyb3VwT2Zmc2V0OwogICAgICAgIHByb3BlcnR5R3JvdXBCeXRlc1twcm9wZXJ0eUdyb3VwSW5kZXhdID0gcHJvcGVydHlHcm91cE9mZnNldDsKICAgICAgICBwcm9wZXJ0eUdyb3VwT2Zmc2V0ID0gMDsKICAgICAgICArK3Byb3BlcnR5R3JvdXBJbmRleDsKICAgICAgfTsKICAgICAgZm9yIChsZXQgb3V0cHV0SW5kZXggPSAwOyBvdXRwdXRJbmRleCA8IG51bVByb3BlcnRpZXM7ICsrb3V0cHV0SW5kZXgpIHsKICAgICAgICBjb25zdCBwcm9wZXJ0eUluZGV4ID0gcGVybXV0YXRpb25bb3V0cHV0SW5kZXhdOwogICAgICAgIGNvbnN0IHNwZWMgPSBwcm9wZXJ0eVNwZWNzW3Byb3BlcnR5SW5kZXhdOwogICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhbm5vdGF0aW9uUHJvcGVydHlUeXBlSGFuZGxlcnNbc3BlYy50eXBlXTsKICAgICAgICBjb25zdCBudW1CeXRlcyA9IGhhbmRsZXIuc2VyaWFsaXplZEJ5dGVzKHJhbmspOwogICAgICAgIGNvbnN0IGFsaWdubWVudCA9IGhhbmRsZXIuYWxpZ25tZW50KHJhbmspOwogICAgICAgIGNvbnN0IGFsaWdubWVudE9mZnNldCA9IChhbGlnbm1lbnQgLSBwcm9wZXJ0eUdyb3VwT2Zmc2V0ICUgYWxpZ25tZW50KSAlIGFsaWdubWVudDsKICAgICAgICBjb25zdCBuZXdTdGFydE9mZnNldCA9IHByb3BlcnR5R3JvdXBPZmZzZXQgKyBhbGlnbm1lbnRPZmZzZXQ7CiAgICAgICAgY29uc3QgbmV3RW5kT2Zmc2V0ID0gbmV3U3RhcnRPZmZzZXQgKyBudW1CeXRlczsKICAgICAgICBjb25zdCBuZXdBbGlnbmVkRW5kT2Zmc2V0ID0gbmV3RW5kT2Zmc2V0ICsgKDQgLSBuZXdFbmRPZmZzZXQgJSA0KSAlIDQ7CiAgICAgICAgaWYgKG5ld0FsaWduZWRFbmRPZmZzZXQgPD0gTUFYX0JVRkZFUl9TVFJJREUpIHsKICAgICAgICAgIHByb3BlcnR5R3JvdXBPZmZzZXQgKz0gYWxpZ25tZW50T2Zmc2V0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXh0UHJvcGVydHlHcm91cCgpOwogICAgICAgIH0KICAgICAgICBvZmZzZXRzW3Byb3BlcnR5SW5kZXhdID0geyBvZmZzZXQ6IHByb3BlcnR5R3JvdXBPZmZzZXQsIGdyb3VwOiBwcm9wZXJ0eUdyb3VwSW5kZXggfTsKICAgICAgICBwcm9wZXJ0eUdyb3VwT2Zmc2V0ICs9IG51bUJ5dGVzOwogICAgICB9CiAgICAgIG5leHRQcm9wZXJ0eUdyb3VwKCk7CiAgICAgIHJldHVybiB7IHNlcmlhbGl6ZWRCeXRlcywgb2Zmc2V0cywgcHJvcGVydHlHcm91cEJ5dGVzIH07CiAgICB9CiAgICB2YXIgQW5ub3RhdGlvblByb3BlcnR5U2VyaWFsaXplciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IocmFuaywgZmlyc3RHcm91cEluaXRpYWxPZmZzZXQsIHByb3BlcnR5U3BlY3MpIHsKICAgICAgICB0aGlzLnJhbmsgPSByYW5rOwogICAgICAgIHRoaXMuZmlyc3RHcm91cEluaXRpYWxPZmZzZXQgPSBmaXJzdEdyb3VwSW5pdGlhbE9mZnNldDsKICAgICAgICB0aGlzLnByb3BlcnR5U3BlY3MgPSBwcm9wZXJ0eVNwZWNzOwogICAgICAgIGlmIChwcm9wZXJ0eVNwZWNzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgdGhpcy5zZXJpYWxpemVkQnl0ZXMgPSBmaXJzdEdyb3VwSW5pdGlhbE9mZnNldDsKICAgICAgICAgIHRoaXMuc2VyaWFsaXplID0gdGhpcy5kZXNlcmlhbGl6ZSA9ICgpID0+IHsKICAgICAgICAgIH07CiAgICAgICAgICB0aGlzLnByb3BlcnR5R3JvdXBCeXRlcyA9IFtmaXJzdEdyb3VwSW5pdGlhbE9mZnNldF07CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsgc2VyaWFsaXplZEJ5dGVzLCBvZmZzZXRzLCBwcm9wZXJ0eUdyb3VwQnl0ZXMgfSA9IGdldFByb3BlcnR5T2Zmc2V0cyhyYW5rLCBmaXJzdEdyb3VwSW5pdGlhbE9mZnNldCwgcHJvcGVydHlTcGVjcyk7CiAgICAgICAgdGhpcy5wcm9wZXJ0eUdyb3VwQnl0ZXMgPSBwcm9wZXJ0eUdyb3VwQnl0ZXM7CiAgICAgICAgbGV0IGdyb3VwT2Zmc2V0Q29kZSA9ICJsZXQgZ3JvdXBPZmZzZXQwID0gb2Zmc2V0OyI7CiAgICAgICAgZm9yIChsZXQgZ3JvdXBJbmRleCA9IDE7IGdyb3VwSW5kZXggPCBwcm9wZXJ0eUdyb3VwQnl0ZXMubGVuZ3RoOyArK2dyb3VwSW5kZXgpIHsKICAgICAgICAgIGdyb3VwT2Zmc2V0Q29kZSArPSBgbGV0IGdyb3VwT2Zmc2V0JHtncm91cEluZGV4fSA9IGdyb3VwT2Zmc2V0JHtncm91cEluZGV4IC0gMX0gKyAke3Byb3BlcnR5R3JvdXBCeXRlc1tncm91cEluZGV4IC0gMV19KmFubm90YXRpb25Db3VudDtgOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBncm91cEluZGV4ID0gMDsgZ3JvdXBJbmRleCA8IHByb3BlcnR5R3JvdXBCeXRlcy5sZW5ndGg7ICsrZ3JvdXBJbmRleCkgewogICAgICAgICAgZ3JvdXBPZmZzZXRDb2RlICs9IGBncm91cE9mZnNldCR7Z3JvdXBJbmRleH0gKz0gJHtwcm9wZXJ0eUdyb3VwQnl0ZXNbZ3JvdXBJbmRleF19KmFubm90YXRpb25JbmRleDtgOwogICAgICAgIH0KICAgICAgICBsZXQgc2VyaWFsaXplQ29kZSA9IGdyb3VwT2Zmc2V0Q29kZTsKICAgICAgICBsZXQgZGVzZXJpYWxpemVDb2RlID0gZ3JvdXBPZmZzZXRDb2RlOwogICAgICAgIGNvbnN0IG51bVByb3BlcnRpZXMgPSBwcm9wZXJ0eVNwZWNzLmxlbmd0aDsKICAgICAgICBmb3IgKGxldCBwcm9wZXJ0eUluZGV4ID0gMDsgcHJvcGVydHlJbmRleCA8IG51bVByb3BlcnRpZXM7ICsrcHJvcGVydHlJbmRleCkgewogICAgICAgICAgY29uc3QgeyBncm91cCwgb2Zmc2V0IH0gPSBvZmZzZXRzW3Byb3BlcnR5SW5kZXhdOwogICAgICAgICAgY29uc3Qgc3BlYyA9IHByb3BlcnR5U3BlY3NbcHJvcGVydHlJbmRleF07CiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gYW5ub3RhdGlvblByb3BlcnR5VHlwZUhhbmRsZXJzW3NwZWMudHlwZV07CiAgICAgICAgICBjb25zdCBwcm9wSWQgPSBgcHJvcGVydGllc1ske3Byb3BlcnR5SW5kZXh9XWA7CiAgICAgICAgICBjb25zdCBvZmZzZXRFeHByID0gYGdyb3VwT2Zmc2V0JHtncm91cH0gKyAke29mZnNldH1gOwogICAgICAgICAgc2VyaWFsaXplQ29kZSArPSBoYW5kbGVyLnNlcmlhbGl6ZUNvZGUocHJvcElkLCBvZmZzZXRFeHByLCByYW5rKTsKICAgICAgICAgIGRlc2VyaWFsaXplQ29kZSArPSBoYW5kbGVyLmRlc2VyaWFsaXplQ29kZShwcm9wSWQsIG9mZnNldEV4cHIsIHJhbmspOwogICAgICAgIH0KICAgICAgICB0aGlzLnNlcmlhbGl6ZWRCeXRlcyA9IHNlcmlhbGl6ZWRCeXRlczsKICAgICAgICB0aGlzLnNlcmlhbGl6ZSA9IG5ldyBGdW5jdGlvbigiZHYiLCAib2Zmc2V0IiwgImFubm90YXRpb25JbmRleCIsICJhbm5vdGF0aW9uQ291bnQiLCAiaXNMaXR0bGVFbmRpYW4iLCAicHJvcGVydGllcyIsIHNlcmlhbGl6ZUNvZGUpOwogICAgICAgIHRoaXMuZGVzZXJpYWxpemUgPSBuZXcgRnVuY3Rpb24oImR2IiwgIm9mZnNldCIsICJhbm5vdGF0aW9uSW5kZXgiLCAiYW5ub3RhdGlvbkNvdW50IiwgImlzTGl0dGxlRW5kaWFuIiwgInByb3BlcnRpZXMiLCBkZXNlcmlhbGl6ZUNvZGUpOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gbWFrZUFubm90YXRpb25Qcm9wZXJ0eVNlcmlhbGl6ZXJzKHJhbmssIHByb3BlcnR5U3BlY3MpIHsKICAgICAgY29uc3Qgc2VyaWFsaXplcnMgPSBbXTsKICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uVHlwZSBvZiBhbm5vdGF0aW9uVHlwZXMpIHsKICAgICAgICBjb25zdCBoYW5kbGVyID0gYW5ub3RhdGlvblR5cGVIYW5kbGVyc1thbm5vdGF0aW9uVHlwZV07CiAgICAgICAgc2VyaWFsaXplcnNbYW5ub3RhdGlvblR5cGVdID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eVNlcmlhbGl6ZXIocmFuaywgaGFuZGxlci5zZXJpYWxpemVkQnl0ZXMocmFuayksIHByb3BlcnR5U3BlY3MpOwogICAgICB9CiAgICAgIHJldHVybiBzZXJpYWxpemVyczsKICAgIH0KICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZUZsb2F0VmVjdG9yKGJ1ZmZlciwgb2Zmc2V0LCBpc0xpdHRsZUVuZGlhbiwgcmFuaywgdmVjKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuazsgKytpKSB7CiAgICAgICAgYnVmZmVyLnNldEZsb2F0MzIob2Zmc2V0LCB2ZWNbaV0sIGlzTGl0dGxlRW5kaWFuKTsKICAgICAgICBvZmZzZXQgKz0gNDsKICAgICAgfQogICAgICByZXR1cm4gb2Zmc2V0OwogICAgfQogICAgZnVuY3Rpb24gc2VyaWFsaXplVHdvRmxvYXRWZWN0b3JzKGJ1ZmZlciwgb2Zmc2V0LCBpc0xpdHRsZUVuZGlhbiwgcmFuaywgdmVjQSwgdmVjQikgewogICAgICBvZmZzZXQgPSBzZXJpYWxpemVGbG9hdFZlY3RvcihidWZmZXIsIG9mZnNldCwgaXNMaXR0bGVFbmRpYW4sIHJhbmssIHZlY0EpOwogICAgICBvZmZzZXQgPSBzZXJpYWxpemVGbG9hdFZlY3RvcihidWZmZXIsIG9mZnNldCwgaXNMaXR0bGVFbmRpYW4sIHJhbmssIHZlY0IpOwogICAgICByZXR1cm4gb2Zmc2V0OwogICAgfQogICAgZnVuY3Rpb24gZGVzZXJpYWxpemVGbG9hdFZlY3RvcihidWZmZXIsIG9mZnNldCwgaXNMaXR0bGVFbmRpYW4sIHJhbmssIHZlYykgewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbms7ICsraSkgewogICAgICAgIHZlY1tpXSA9IGJ1ZmZlci5nZXRGbG9hdDMyKG9mZnNldCwgaXNMaXR0bGVFbmRpYW4pOwogICAgICAgIG9mZnNldCArPSA0OwogICAgICB9CiAgICAgIHJldHVybiBvZmZzZXQ7CiAgICB9CiAgICBmdW5jdGlvbiBkZXNlcmlhbGl6ZVR3b0Zsb2F0VmVjdG9ycyhidWZmZXIsIG9mZnNldCwgaXNMaXR0bGVFbmRpYW4sIHJhbmssIHZlY0EsIHZlY0IpIHsKICAgICAgb2Zmc2V0ID0gZGVzZXJpYWxpemVGbG9hdFZlY3RvcihidWZmZXIsIG9mZnNldCwgaXNMaXR0bGVFbmRpYW4sIHJhbmssIHZlY0EpOwogICAgICBvZmZzZXQgPSBkZXNlcmlhbGl6ZUZsb2F0VmVjdG9yKGJ1ZmZlciwgb2Zmc2V0LCBpc0xpdHRsZUVuZGlhbiwgcmFuaywgdmVjQik7CiAgICAgIHJldHVybiBvZmZzZXQ7CiAgICB9CiAgICB2YXIgYW5ub3RhdGlvblR5cGVIYW5kbGVycyA9IHsKICAgICAgWzFdOiB7CiAgICAgICAgaWNvbjogIlx1QTU3OSIsCiAgICAgICAgZGVzY3JpcHRpb246ICJMaW5lIiwKICAgICAgICB0b0pTT04oYW5ub3RhdGlvbikgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcG9pbnRBOiBBcnJheS5mcm9tKGFubm90YXRpb24ucG9pbnRBKSwKICAgICAgICAgICAgcG9pbnRCOiBBcnJheS5mcm9tKGFubm90YXRpb24ucG9pbnRCKQogICAgICAgICAgfTsKICAgICAgICB9LAogICAgICAgIHJlc3RvcmVTdGF0ZShhbm5vdGF0aW9uLCBvYmosIHJhbmspIHsKICAgICAgICAgIGFubm90YXRpb24ucG9pbnRBID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkob2JqLCAicG9pbnRBIiwgKHgpID0+IHBhcnNlRml4ZWRMZW5ndGhBcnJheShuZXcgRmxvYXQzMkFycmF5KHJhbmspLCB4LCB2ZXJpZnlGaW5pdGVGbG9hdCkpOwogICAgICAgICAgYW5ub3RhdGlvbi5wb2ludEIgPSB2ZXJpZnlPYmplY3RQcm9wZXJ0eShvYmosICJwb2ludEIiLCAoeCkgPT4gcGFyc2VGaXhlZExlbmd0aEFycmF5KG5ldyBGbG9hdDMyQXJyYXkocmFuayksIHgsIHZlcmlmeUZpbml0ZUZsb2F0KSk7CiAgICAgICAgfSwKICAgICAgICBzZXJpYWxpemVkQnl0ZXMocmFuaykgewogICAgICAgICAgcmV0dXJuIDIgKiA0ICogcmFuazsKICAgICAgICB9LAogICAgICAgIHNlcmlhbGl6ZShidWZmZXIsIG9mZnNldCwgaXNMaXR0bGVFbmRpYW4sIHJhbmssIGFubm90YXRpb24pIHsKICAgICAgICAgIHNlcmlhbGl6ZVR3b0Zsb2F0VmVjdG9ycyhidWZmZXIsIG9mZnNldCwgaXNMaXR0bGVFbmRpYW4sIHJhbmssIGFubm90YXRpb24ucG9pbnRBLCBhbm5vdGF0aW9uLnBvaW50Qik7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZTogKGJ1ZmZlciwgb2Zmc2V0LCBpc0xpdHRsZUVuZGlhbiwgcmFuaywgaWQpID0+IHsKICAgICAgICAgIGNvbnN0IHBvaW50QSA9IG5ldyBGbG9hdDMyQXJyYXkocmFuayk7CiAgICAgICAgICBjb25zdCBwb2ludEIgPSBuZXcgRmxvYXQzMkFycmF5KHJhbmspOwogICAgICAgICAgZGVzZXJpYWxpemVUd29GbG9hdFZlY3RvcnMoYnVmZmVyLCBvZmZzZXQsIGlzTGl0dGxlRW5kaWFuLCByYW5rLCBwb2ludEEsIHBvaW50Qik7CiAgICAgICAgICByZXR1cm4geyB0eXBlOiAxLCBwb2ludEEsIHBvaW50QiwgaWQsIHByb3BlcnRpZXM6IFtdIH07CiAgICAgICAgfSwKICAgICAgICB2aXNpdEdlb21ldHJ5KGFubm90YXRpb24sIGNhbGxiYWNrKSB7CiAgICAgICAgICBjYWxsYmFjayhhbm5vdGF0aW9uLnBvaW50QSwgZmFsc2UpOwogICAgICAgICAgY2FsbGJhY2soYW5ub3RhdGlvbi5wb2ludEIsIGZhbHNlKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIFs0XTogewogICAgICAgIGljb246ICJcdTIyOTYiLAogICAgICAgIGRlc2NyaXB0aW9uOiAiU3BoZXJlIiwKICAgICAgICB0b0pTT04oYW5ub3RhdGlvbikgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcG9pbnRBOiBBcnJheS5mcm9tKGFubm90YXRpb24ucG9pbnRBKSwKICAgICAgICAgICAgcG9pbnRCOiBBcnJheS5mcm9tKGFubm90YXRpb24ucG9pbnRCKQogICAgICAgICAgfTsKICAgICAgICB9LAogICAgICAgIHJlc3RvcmVTdGF0ZShhbm5vdGF0aW9uLCBvYmosIHJhbmspIHsKICAgICAgICAgIGFubm90YXRpb24ucG9pbnRBID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkob2JqLCAicG9pbnRBIiwgKHgpID0+IHBhcnNlRml4ZWRMZW5ndGhBcnJheShuZXcgRmxvYXQzMkFycmF5KHJhbmspLCB4LCB2ZXJpZnlGaW5pdGVGbG9hdCkpOwogICAgICAgICAgYW5ub3RhdGlvbi5wb2ludEIgPSB2ZXJpZnlPYmplY3RQcm9wZXJ0eShvYmosICJwb2ludEIiLCAoeCkgPT4gcGFyc2VGaXhlZExlbmd0aEFycmF5KG5ldyBGbG9hdDMyQXJyYXkocmFuayksIHgsIHZlcmlmeUZpbml0ZUZsb2F0KSk7CiAgICAgICAgfSwKICAgICAgICBzZXJpYWxpemVkQnl0ZXMocmFuaykgewogICAgICAgICAgcmV0dXJuIDIgKiA0ICogcmFuazsKICAgICAgICB9LAogICAgICAgIHNlcmlhbGl6ZShidWZmZXIsIG9mZnNldCwgaXNMaXR0bGVFbmRpYW4sIHJhbmssIGFubm90YXRpb24pIHsKICAgICAgICAgIHNlcmlhbGl6ZVR3b0Zsb2F0VmVjdG9ycyhidWZmZXIsIG9mZnNldCwgaXNMaXR0bGVFbmRpYW4sIHJhbmssIGFubm90YXRpb24ucG9pbnRBLCBhbm5vdGF0aW9uLnBvaW50Qik7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZTogKGJ1ZmZlciwgb2Zmc2V0LCBpc0xpdHRsZUVuZGlhbiwgcmFuaywgaWQpID0+IHsKICAgICAgICAgIGNvbnN0IHBvaW50QSA9IG5ldyBGbG9hdDMyQXJyYXkocmFuayk7CiAgICAgICAgICBjb25zdCBwb2ludEIgPSBuZXcgRmxvYXQzMkFycmF5KHJhbmspOwogICAgICAgICAgZGVzZXJpYWxpemVUd29GbG9hdFZlY3RvcnMoYnVmZmVyLCBvZmZzZXQsIGlzTGl0dGxlRW5kaWFuLCByYW5rLCBwb2ludEEsIHBvaW50Qik7CiAgICAgICAgICByZXR1cm4geyB0eXBlOiA0LCBwb2ludEEsIHBvaW50QiwgaWQsIHByb3BlcnRpZXM6IFtdIH07CiAgICAgICAgfSwKICAgICAgICB2aXNpdEdlb21ldHJ5KGFubm90YXRpb24sIGNhbGxiYWNrKSB7CiAgICAgICAgICBjYWxsYmFjayhhbm5vdGF0aW9uLnBvaW50QSwgZmFsc2UpOwogICAgICAgICAgY2FsbGJhY2soYW5ub3RhdGlvbi5wb2ludEIsIGZhbHNlKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIFswXTogewogICAgICAgIGljb246ICJcdTI2QUMiLAogICAgICAgIGRlc2NyaXB0aW9uOiAiUG9pbnQiLAogICAgICAgIHRvSlNPTjogKGFubm90YXRpb24pID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHBvaW50OiBBcnJheS5mcm9tKGFubm90YXRpb24ucG9pbnQpCiAgICAgICAgICB9OwogICAgICAgIH0sCiAgICAgICAgcmVzdG9yZVN0YXRlOiAoYW5ub3RhdGlvbiwgb2JqLCByYW5rKSA9PiB7CiAgICAgICAgICBhbm5vdGF0aW9uLnBvaW50ID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkob2JqLCAicG9pbnQiLCAoeCkgPT4gcGFyc2VGaXhlZExlbmd0aEFycmF5KG5ldyBGbG9hdDMyQXJyYXkocmFuayksIHgsIHZlcmlmeUZpbml0ZUZsb2F0KSk7CiAgICAgICAgfSwKICAgICAgICBzZXJpYWxpemVkQnl0ZXM6IChyYW5rKSA9PiByYW5rICogNCwKICAgICAgICBzZXJpYWxpemU6IChidWZmZXIsIG9mZnNldCwgaXNMaXR0bGVFbmRpYW4sIHJhbmssIGFubm90YXRpb24pID0+IHsKICAgICAgICAgIHNlcmlhbGl6ZUZsb2F0VmVjdG9yKGJ1ZmZlciwgb2Zmc2V0LCBpc0xpdHRsZUVuZGlhbiwgcmFuaywgYW5ub3RhdGlvbi5wb2ludCk7CiAgICAgICAgfSwKICAgICAgICBkZXNlcmlhbGl6ZTogKGJ1ZmZlciwgb2Zmc2V0LCBpc0xpdHRsZUVuZGlhbiwgcmFuaywgaWQpID0+IHsKICAgICAgICAgIGNvbnN0IHBvaW50ID0gbmV3IEZsb2F0MzJBcnJheShyYW5rKTsKICAgICAgICAgIGRlc2VyaWFsaXplRmxvYXRWZWN0b3IoYnVmZmVyLCBvZmZzZXQsIGlzTGl0dGxlRW5kaWFuLCByYW5rLCBwb2ludCk7CiAgICAgICAgICByZXR1cm4geyB0eXBlOiAwLCBwb2ludCwgaWQsIHByb3BlcnRpZXM6IFtdIH07CiAgICAgICAgfSwKICAgICAgICB2aXNpdEdlb21ldHJ5KGFubm90YXRpb24sIGNhbGxiYWNrKSB7CiAgICAgICAgICBjYWxsYmFjayhhbm5vdGF0aW9uLnBvaW50LCBmYWxzZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBbMl06IHsKICAgICAgICBpY29uOiAiXHUyNzUxIiwKICAgICAgICBkZXNjcmlwdGlvbjogIkJvdW5kaW5nIEJveCIsCiAgICAgICAgdG9KU09OOiAoYW5ub3RhdGlvbikgPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcG9pbnRBOiBBcnJheS5mcm9tKGFubm90YXRpb24ucG9pbnRBKSwKICAgICAgICAgICAgcG9pbnRCOiBBcnJheS5mcm9tKGFubm90YXRpb24ucG9pbnRCKQogICAgICAgICAgfTsKICAgICAgICB9LAogICAgICAgIHJlc3RvcmVTdGF0ZTogKGFubm90YXRpb24sIG9iaiwgcmFuaykgPT4gewogICAgICAgICAgYW5ub3RhdGlvbi5wb2ludEEgPSB2ZXJpZnlPYmplY3RQcm9wZXJ0eShvYmosICJwb2ludEEiLCAoeCkgPT4gcGFyc2VGaXhlZExlbmd0aEFycmF5KG5ldyBGbG9hdDMyQXJyYXkocmFuayksIHgsIHZlcmlmeUZpbml0ZUZsb2F0KSk7CiAgICAgICAgICBhbm5vdGF0aW9uLnBvaW50QiA9IHZlcmlmeU9iamVjdFByb3BlcnR5KG9iaiwgInBvaW50QiIsICh4KSA9PiBwYXJzZUZpeGVkTGVuZ3RoQXJyYXkobmV3IEZsb2F0MzJBcnJheShyYW5rKSwgeCwgdmVyaWZ5RmluaXRlRmxvYXQpKTsKICAgICAgICB9LAogICAgICAgIHNlcmlhbGl6ZWRCeXRlczogKHJhbmspID0+IDIgKiA0ICogcmFuaywKICAgICAgICBzZXJpYWxpemUoYnVmZmVyLCBvZmZzZXQsIGlzTGl0dGxlRW5kaWFuLCByYW5rLCBhbm5vdGF0aW9uKSB7CiAgICAgICAgICBzZXJpYWxpemVUd29GbG9hdFZlY3RvcnMoYnVmZmVyLCBvZmZzZXQsIGlzTGl0dGxlRW5kaWFuLCByYW5rLCBhbm5vdGF0aW9uLnBvaW50QSwgYW5ub3RhdGlvbi5wb2ludEIpOwogICAgICAgIH0sCiAgICAgICAgZGVzZXJpYWxpemU6IChidWZmZXIsIG9mZnNldCwgaXNMaXR0bGVFbmRpYW4sIHJhbmssIGlkKSA9PiB7CiAgICAgICAgICBjb25zdCBwb2ludEEgPSBuZXcgRmxvYXQzMkFycmF5KHJhbmspOwogICAgICAgICAgY29uc3QgcG9pbnRCID0gbmV3IEZsb2F0MzJBcnJheShyYW5rKTsKICAgICAgICAgIGRlc2VyaWFsaXplVHdvRmxvYXRWZWN0b3JzKGJ1ZmZlciwgb2Zmc2V0LCBpc0xpdHRsZUVuZGlhbiwgcmFuaywgcG9pbnRBLCBwb2ludEIpOwogICAgICAgICAgcmV0dXJuIHsgdHlwZTogMiwgcG9pbnRBLCBwb2ludEIsIGlkLCBwcm9wZXJ0aWVzOiBbXSB9OwogICAgICAgIH0sCiAgICAgICAgdmlzaXRHZW9tZXRyeShhbm5vdGF0aW9uLCBjYWxsYmFjaykgewogICAgICAgICAgY2FsbGJhY2soYW5ub3RhdGlvbi5wb2ludEEsIGZhbHNlKTsKICAgICAgICAgIGNhbGxiYWNrKGFubm90YXRpb24ucG9pbnRCLCBmYWxzZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBbM106IHsKICAgICAgICBpY29uOiAiXHUyNUNFIiwKICAgICAgICBkZXNjcmlwdGlvbjogIkVsbGlwc29pZCIsCiAgICAgICAgdG9KU09OOiAoYW5ub3RhdGlvbikgPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgY2VudGVyOiBBcnJheS5mcm9tKGFubm90YXRpb24uY2VudGVyKSwKICAgICAgICAgICAgcmFkaWk6IEFycmF5LmZyb20oYW5ub3RhdGlvbi5yYWRpaSkKICAgICAgICAgIH07CiAgICAgICAgfSwKICAgICAgICByZXN0b3JlU3RhdGU6IChhbm5vdGF0aW9uLCBvYmosIHJhbmspID0+IHsKICAgICAgICAgIGFubm90YXRpb24uY2VudGVyID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkob2JqLCAiY2VudGVyIiwgKHgpID0+IHBhcnNlRml4ZWRMZW5ndGhBcnJheShuZXcgRmxvYXQzMkFycmF5KHJhbmspLCB4LCB2ZXJpZnlGaW5pdGVGbG9hdCkpOwogICAgICAgICAgYW5ub3RhdGlvbi5yYWRpaSA9IHZlcmlmeU9iamVjdFByb3BlcnR5KG9iaiwgInJhZGlpIiwgKHgpID0+IHBhcnNlRml4ZWRMZW5ndGhBcnJheShuZXcgRmxvYXQzMkFycmF5KHJhbmspLCB4LCB2ZXJpZnlGaW5pdGVOb25OZWdhdGl2ZUZsb2F0KSk7CiAgICAgICAgfSwKICAgICAgICBzZXJpYWxpemVkQnl0ZXM6IChyYW5rKSA9PiAyICogNCAqIHJhbmssCiAgICAgICAgc2VyaWFsaXplKGJ1ZmZlciwgb2Zmc2V0LCBpc0xpdHRsZUVuZGlhbiwgcmFuaywgYW5ub3RhdGlvbikgewogICAgICAgICAgc2VyaWFsaXplVHdvRmxvYXRWZWN0b3JzKGJ1ZmZlciwgb2Zmc2V0LCBpc0xpdHRsZUVuZGlhbiwgcmFuaywgYW5ub3RhdGlvbi5jZW50ZXIsIGFubm90YXRpb24ucmFkaWkpOwogICAgICAgIH0sCiAgICAgICAgZGVzZXJpYWxpemU6IChidWZmZXIsIG9mZnNldCwgaXNMaXR0bGVFbmRpYW4sIHJhbmssIGlkKSA9PiB7CiAgICAgICAgICBjb25zdCBjZW50ZXIgPSBuZXcgRmxvYXQzMkFycmF5KHJhbmspOwogICAgICAgICAgY29uc3QgcmFkaWkgPSBuZXcgRmxvYXQzMkFycmF5KHJhbmspOwogICAgICAgICAgZGVzZXJpYWxpemVUd29GbG9hdFZlY3RvcnMoYnVmZmVyLCBvZmZzZXQsIGlzTGl0dGxlRW5kaWFuLCByYW5rLCBjZW50ZXIsIHJhZGlpKTsKICAgICAgICAgIHJldHVybiB7IHR5cGU6IDMsIGNlbnRlciwgcmFkaWksIGlkLCBwcm9wZXJ0aWVzOiBbXSB9OwogICAgICAgIH0sCiAgICAgICAgdmlzaXRHZW9tZXRyeShhbm5vdGF0aW9uLCBjYWxsYmFjaykgewogICAgICAgICAgY2FsbGJhY2soYW5ub3RhdGlvbi5jZW50ZXIsIGZhbHNlKTsKICAgICAgICAgIGNhbGxiYWNrKGFubm90YXRpb24ucmFkaWksIHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZUFubm90YXRpb25zKGFsbEFubm90YXRpb25zLCBwcm9wZXJ0eVNlcmlhbGl6ZXJzKSB7CiAgICAgIGxldCB0b3RhbEJ5dGVzID0gMDsKICAgICAgY29uc3QgdHlwZVRvT2Zmc2V0ID0gW107CiAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvblR5cGUgb2YgYW5ub3RhdGlvblR5cGVzKSB7CiAgICAgICAgY29uc3QgcHJvcGVydHlTZXJpYWxpemVyID0gcHJvcGVydHlTZXJpYWxpemVyc1thbm5vdGF0aW9uVHlwZV07CiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFByb3BlcnRpZXNCeXRlcyA9IHByb3BlcnR5U2VyaWFsaXplci5zZXJpYWxpemVkQnl0ZXM7CiAgICAgICAgdHlwZVRvT2Zmc2V0W2Fubm90YXRpb25UeXBlXSA9IHRvdGFsQnl0ZXM7CiAgICAgICAgY29uc3QgYW5ub3RhdGlvbnMgPSBhbGxBbm5vdGF0aW9uc1thbm5vdGF0aW9uVHlwZV07CiAgICAgICAgY29uc3QgY291bnQgPSBhbm5vdGF0aW9ucy5sZW5ndGg7CiAgICAgICAgdG90YWxCeXRlcyArPSBzZXJpYWxpemVkUHJvcGVydGllc0J5dGVzICogY291bnQ7CiAgICAgIH0KICAgICAgY29uc3QgdHlwZVRvSWRzID0gW107CiAgICAgIGNvbnN0IHR5cGVUb0lkTWFwcyA9IFtdOwogICAgICBjb25zdCBkYXRhID0gbmV3IEFycmF5QnVmZmVyKHRvdGFsQnl0ZXMpOwogICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhkYXRhKTsKICAgICAgY29uc3QgaXNMaXR0bGVFbmRpYW4gPSBFTkRJQU5ORVNTID09PSBFbmRpYW5uZXNzLkxJVFRMRTsKICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uVHlwZSBvZiBhbm5vdGF0aW9uVHlwZXMpIHsKICAgICAgICBjb25zdCBwcm9wZXJ0eVNlcmlhbGl6ZXIgPSBwcm9wZXJ0eVNlcmlhbGl6ZXJzW2Fubm90YXRpb25UeXBlXTsKICAgICAgICBjb25zdCB7IHJhbmsgfSA9IHByb3BlcnR5U2VyaWFsaXplcjsKICAgICAgICBjb25zdCBzZXJpYWxpemVQcm9wZXJ0aWVzID0gcHJvcGVydHlTZXJpYWxpemVyLnNlcmlhbGl6ZTsKICAgICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IGFsbEFubm90YXRpb25zW2Fubm90YXRpb25UeXBlXTsKICAgICAgICB0eXBlVG9JZHNbYW5ub3RhdGlvblR5cGVdID0gYW5ub3RhdGlvbnMubWFwKCh4KSA9PiB4LmlkKTsKICAgICAgICB0eXBlVG9JZE1hcHNbYW5ub3RhdGlvblR5cGVdID0gbmV3IE1hcChhbm5vdGF0aW9ucy5tYXAoKHgsIGkpID0+IFt4LmlkLCBpXSkpOwogICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhbm5vdGF0aW9uVHlwZUhhbmRsZXJzW2Fubm90YXRpb25UeXBlXTsKICAgICAgICBjb25zdCBzZXJpYWxpemUgPSBoYW5kbGVyLnNlcmlhbGl6ZTsKICAgICAgICBjb25zdCBvZmZzZXQgPSB0eXBlVG9PZmZzZXRbYW5ub3RhdGlvblR5cGVdOwogICAgICAgIGNvbnN0IGdlb21ldHJ5RGF0YVN0cmlkZSA9IHByb3BlcnR5U2VyaWFsaXplci5wcm9wZXJ0eUdyb3VwQnl0ZXNbMF07CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNvdW50ID0gYW5ub3RhdGlvbnMubGVuZ3RoOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IGFubm90YXRpb25zW2ldOwogICAgICAgICAgc2VyaWFsaXplKGRhdGFWaWV3LCBvZmZzZXQgKyBpICogZ2VvbWV0cnlEYXRhU3RyaWRlLCBpc0xpdHRsZUVuZGlhbiwgcmFuaywgYW5ub3RhdGlvbik7CiAgICAgICAgICBzZXJpYWxpemVQcm9wZXJ0aWVzKGRhdGFWaWV3LCBvZmZzZXQsIGksIGNvdW50LCBpc0xpdHRsZUVuZGlhbiwgYW5ub3RhdGlvbi5wcm9wZXJ0aWVzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHsgZGF0YTogbmV3IFVpbnQ4QXJyYXkoZGF0YSksIHR5cGVUb0lkcywgdHlwZVRvT2Zmc2V0LCB0eXBlVG9JZE1hcHMgfTsKICAgIH0KICAgIHZhciBBbm5vdGF0aW9uU2VyaWFsaXplciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IocHJvcGVydHlTZXJpYWxpemVycykgewogICAgICAgIHRoaXMucHJvcGVydHlTZXJpYWxpemVycyA9IHByb3BlcnR5U2VyaWFsaXplcnM7CiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IFtbXSwgW10sIFtdLCBbXSwgW11dOwogICAgICB9CiAgICAgIGFkZChhbm5vdGF0aW9uKSB7CiAgICAgICAgdGhpcy5hbm5vdGF0aW9uc1thbm5vdGF0aW9uLnR5cGVdLnB1c2goYW5ub3RhdGlvbik7CiAgICAgIH0KICAgICAgc2VyaWFsaXplKCkgewogICAgICAgIHJldHVybiBzZXJpYWxpemVBbm5vdGF0aW9ucyh0aGlzLmFubm90YXRpb25zLCB0aGlzLnByb3BlcnR5U2VyaWFsaXplcnMpOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gZml4QW5ub3RhdGlvbkFmdGVyU3RydWN0dXJlZENsb25pbmcob2JqKSB7CiAgICAgIGlmIChvYmogPT0gbnVsbCkgewogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0KICAgICAgY29uc3QgeyByZWxhdGVkU2VnbWVudHMgfSA9IG9iajsKICAgICAgaWYgKHJlbGF0ZWRTZWdtZW50cyAhPT0gdm9pZCAwKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG51bVJlbGF0aW9uc2hpcHMgPSByZWxhdGVkU2VnbWVudHMubGVuZ3RoOyBpIDwgbnVtUmVsYXRpb25zaGlwczsgKytpKSB7CiAgICAgICAgICBjb25zdCBzZWdtZW50cyA9IHJlbGF0ZWRTZWdtZW50c1tpXTsKICAgICAgICAgIGlmIChzZWdtZW50cyA9PT0gdm9pZCAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIHJlbGF0ZWRTZWdtZW50c1tpXSA9IHNlZ21lbnRzLm1hcCgoeCkgPT4gbmV3IFVpbnQ2NCh4LmxvdywgeC5oaWdoKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9hbm5vdGF0aW9uL2Jhc2UudHMKICAgIHZhciBBTk5PVEFUSU9OX01FVEFEQVRBX0NIVU5LX1NPVVJDRV9SUENfSUQgPSAiYW5ub3RhdGlvbi5NZXRhZGF0YUNodW5rU291cmNlIjsKICAgIHZhciBBTk5PVEFUSU9OX1NVQlNFVF9HRU9NRVRSWV9DSFVOS19TT1VSQ0VfUlBDX0lEID0gImFubm90YXRpb24uU3Vic2V0R2VvbWV0cnlDaHVua1NvdXJjZSI7CiAgICB2YXIgQU5OT1RBVElPTl9SRUZFUkVOQ0VfQUREX1JQQ19JRCA9ICJhbm5vdGF0aW9uLnJlZmVyZW5jZS5hZGQiOwogICAgdmFyIEFOTk9UQVRJT05fUkVGRVJFTkNFX0RFTEVURV9SUENfSUQgPSAiYW5ub3RhdGlvbi5yZWZlcmVuY2UuZGVsZXRlIjsKICAgIHZhciBBTk5PVEFUSU9OX0NPTU1JVF9VUERBVEVfUlBDX0lEID0gImFubm90YXRpb24uY29tbWl0IjsKICAgIHZhciBBTk5PVEFUSU9OX0NPTU1JVF9VUERBVEVfUkVTVUxUX1JQQ19JRCA9ICJhbm5vdGF0aW9uLmNvbW1pdCI7CiAgICB2YXIgQU5OT1RBVElPTl9TUEFUSUFMTFlfSU5ERVhFRF9SRU5ERVJfTEFZRVJfUlBDX0lEID0gImFubm90YXRpb24vU3BhdGlhbGx5SW5kZXhlZFJlbmRlckxheWVyIjsKICAgIHZhciBBTk5PVEFUSU9OX1BFUlNQRUNUSVZFX1JFTkRFUl9MQVlFUl9VUERBVEVfU09VUkNFU19SUENfSUQgPSAiYW5ub3RhdGlvbi9QZXJzcGVjdGl2ZVJlbmRlckxheWVyOnVwZGF0ZVNvdXJjZXMiOwogICAgdmFyIEFOTk9UQVRJT05fUkVOREVSX0xBWUVSX1JQQ19JRCA9ICJhbm5vdGF0aW9uL1JlbmRlckxheWVyIjsKICAgIHZhciBBTk5PVEFUSU9OX1JFTkRFUl9MQVlFUl9VUERBVEVfU0VHTUVOVEFUSU9OX1JQQ19JRCA9ICJhbm5vdGF0aW9uL1JlbmRlckxheWVyLnVwZGF0ZVNlZ21lbnRhdGlvbiI7CiAgICB2YXIgdGVtcE1hdDMyID0gbWF0M19leHBvcnRzLmNyZWF0ZSgpOwogICAgZnVuY3Rpb24gZm9yRWFjaFZpc2libGVBbm5vdGF0aW9uQ2h1bmsocHJvamVjdGlvblBhcmFtZXRlcnMsIGxvY2FsUG9zaXRpb24sIHJlbmRlclNjYWxlVGFyZ2V0LCB0cmFuc2Zvcm1lZFNvdXJjZXMsIGJlZ2luU2NhbGUsIGNhbGxiYWNrKSB7CiAgICAgIGNvbnN0IHsgZGlzcGxheURpbWVuc2lvblJlbmRlckluZm8sIHZpZXdNYXRyaXgsIHByb2plY3Rpb25NYXQsIHdpZHRoLCBoZWlnaHQgfSA9IHByb2plY3Rpb25QYXJhbWV0ZXJzOwogICAgICBjb25zdCB7IHZveGVsUGh5c2ljYWxTY2FsZXMgfSA9IGRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvOwogICAgICBjb25zdCB2aWV3RGV0ID0gTWF0aC5hYnMobWF0M19leHBvcnRzLmRldGVybWluYW50KG1hdDNGcm9tTWF0NCh0ZW1wTWF0MzIsIHZpZXdNYXRyaXgpKSk7CiAgICAgIGNvbnN0IGNhbm9uaWNhbFRvUGh5c2ljYWxTY2FsZSA9IHByb2QzKHZveGVsUGh5c2ljYWxTY2FsZXMpOwogICAgICBjb25zdCB2aWV3RnJ1c3RydW1Wb2x1bWUgPSBnZXRWaWV3RnJ1c3RydW1Wb2x1bWUocHJvamVjdGlvbk1hdCkgLyB2aWV3RGV0ICogY2Fub25pY2FsVG9QaHlzaWNhbFNjYWxlOwogICAgICBpZiAodHJhbnNmb3JtZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGJhc2VTb3VyY2UgPSB0cmFuc2Zvcm1lZFNvdXJjZXNbMF07CiAgICAgIGxldCBzb3VyY2VWb2x1bWUgPSBNYXRoLmFicyhiYXNlU291cmNlLmNodW5rTGF5b3V0LmRldFRyYW5zZm9ybSkgKiBjYW5vbmljYWxUb1BoeXNpY2FsU2NhbGU7CiAgICAgIGNvbnN0IHsgbG93ZXJDbGlwRGlzcGxheUJvdW5kLCB1cHBlckNsaXBEaXNwbGF5Qm91bmQgfSA9IGJhc2VTb3VyY2U7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgICAgc291cmNlVm9sdW1lICo9IHVwcGVyQ2xpcERpc3BsYXlCb3VuZFtpXSAtIGxvd2VyQ2xpcERpc3BsYXlCb3VuZFtpXTsKICAgICAgfQogICAgICBjb25zdCBlZmZlY3RpdmVWb2x1bWUgPSBNYXRoLm1pbihzb3VyY2VWb2x1bWUsIHZpZXdGcnVzdHJ1bVZvbHVtZSk7CiAgICAgIGNvbnN0IHZpZXdwb3J0QXJlYSA9IHdpZHRoICogaGVpZ2h0OwogICAgICBjb25zdCB0YXJnZXROdW1Bbm5vdGF0aW9ucyA9IHZpZXdwb3J0QXJlYSAvIHJlbmRlclNjYWxlVGFyZ2V0ICoqIDI7CiAgICAgIGNvbnN0IHBoeXNpY2FsRGVuc2l0eVRhcmdldCA9IHRhcmdldE51bUFubm90YXRpb25zIC8gZWZmZWN0aXZlVm9sdW1lOwogICAgICBsZXQgdG90YWxQaHlzaWNhbERlbnNpdHkgPSAwOwogICAgICBmb3IgKGxldCBzY2FsZUluZGV4ID0gdHJhbnNmb3JtZWRTb3VyY2VzLmxlbmd0aCAtIDE7IHNjYWxlSW5kZXggPj0gMCAmJiB0b3RhbFBoeXNpY2FsRGVuc2l0eSA8IHBoeXNpY2FsRGVuc2l0eVRhcmdldDsgLS1zY2FsZUluZGV4KSB7CiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRTb3VyY2UgPSB0cmFuc2Zvcm1lZFNvdXJjZXNbc2NhbGVJbmRleF07CiAgICAgICAgY29uc3Qgc3BlYyA9IHRyYW5zZm9ybWVkU291cmNlLnNvdXJjZS5zcGVjOwogICAgICAgIGNvbnN0IHsgY2h1bmtMYXlvdXQgfSA9IHRyYW5zZm9ybWVkU291cmNlOwogICAgICAgIGNvbnN0IHBoeXNpY2FsVm9sdW1lID0gcHJvZDMoY2h1bmtMYXlvdXQuc2l6ZSkgKiBNYXRoLmFicyhjaHVua0xheW91dC5kZXRUcmFuc2Zvcm0pICogY2Fub25pY2FsVG9QaHlzaWNhbFNjYWxlOwogICAgICAgIGNvbnN0IHsgbGltaXQsIHJhbmsgfSA9IHNwZWM7CiAgICAgICAgY29uc3QgeyBub25EaXNwbGF5TG93ZXJDbGlwQm91bmQsIG5vbkRpc3BsYXlVcHBlckNsaXBCb3VuZCB9ID0gdHJhbnNmb3JtZWRTb3VyY2U7CiAgICAgICAgbGV0IHNsaWNlRnJhY3Rpb24gPSAxOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuazsgKytpKSB7CiAgICAgICAgICBjb25zdCBiID0gbm9uRGlzcGxheVVwcGVyQ2xpcEJvdW5kW2ldIC0gbm9uRGlzcGxheUxvd2VyQ2xpcEJvdW5kW2ldOwogICAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShiKSkKICAgICAgICAgICAgc2xpY2VGcmFjdGlvbiAvPSBiOwogICAgICAgIH0KICAgICAgICBjb25zdCBwaHlzaWNhbERlbnNpdHkgPSBsaW1pdCAqIHNsaWNlRnJhY3Rpb24gLyBwaHlzaWNhbFZvbHVtZTsKICAgICAgICBsZXQgZmlyc3RDaHVuayA9IHRydWU7CiAgICAgICAgY29uc3QgbmV3VG90YWxQaHlzaWNhbERlbnNpdHkgPSB0b3RhbFBoeXNpY2FsRGVuc2l0eSArIHBoeXNpY2FsRGVuc2l0eTsKICAgICAgICBjb25zdCB0b3RhbFBoeXNpY2FsU3BhY2luZyA9IE1hdGgucG93KDEgLyBuZXdUb3RhbFBoeXNpY2FsRGVuc2l0eSwgMSAvIDMpOwogICAgICAgIGNvbnN0IHRvdGFsUGl4ZWxTcGFjaW5nID0gTWF0aC5zcXJ0KHZpZXdwb3J0QXJlYSAvIChuZXdUb3RhbFBoeXNpY2FsRGVuc2l0eSAqIGVmZmVjdGl2ZVZvbHVtZSkpOwogICAgICAgIGNvbnN0IGRlc2lyZWRDb3VudCA9IChwaHlzaWNhbERlbnNpdHlUYXJnZXQgLSB0b3RhbFBoeXNpY2FsRGVuc2l0eSkgKiBwaHlzaWNhbFZvbHVtZSAvIHNsaWNlRnJhY3Rpb247CiAgICAgICAgY29uc3QgZHJhd0ZyYWN0aW9uID0gTWF0aC5taW4oMSwgZGVzaXJlZENvdW50IC8gc3BlYy5saW1pdCk7CiAgICAgICAgZm9yRWFjaFZpc2libGVWb2x1bWV0cmljQ2h1bmsocHJvamVjdGlvblBhcmFtZXRlcnMsIGxvY2FsUG9zaXRpb24sIHRyYW5zZm9ybWVkU291cmNlLCAoKSA9PiB7CiAgICAgICAgICBpZiAoZmlyc3RDaHVuaykgewogICAgICAgICAgICBiZWdpblNjYWxlKHRyYW5zZm9ybWVkU291cmNlLCBzY2FsZUluZGV4KTsKICAgICAgICAgICAgZmlyc3RDaHVuayA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgY2FsbGJhY2sodHJhbnNmb3JtZWRTb3VyY2UsIHNjYWxlSW5kZXgsIGRyYXdGcmFjdGlvbiwgdG90YWxQaHlzaWNhbFNwYWNpbmcsIHRvdGFsUGl4ZWxTcGFjaW5nKTsKICAgICAgICB9KTsKICAgICAgICB0b3RhbFBoeXNpY2FsRGVuc2l0eSA9IG5ld1RvdGFsUGh5c2ljYWxEZW5zaXR5OwogICAgICB9CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9uYXZpZ2F0aW9uX3N0YXRlLnRzCiAgICB2YXIgTmF2aWdhdGlvbkxpbmtUeXBlOwogICAgKGZ1bmN0aW9uKE5hdmlnYXRpb25MaW5rVHlwZTIpIHsKICAgICAgTmF2aWdhdGlvbkxpbmtUeXBlMltOYXZpZ2F0aW9uTGlua1R5cGUyWyJMSU5LRUQiXSA9IDBdID0gIkxJTktFRCI7CiAgICAgIE5hdmlnYXRpb25MaW5rVHlwZTJbTmF2aWdhdGlvbkxpbmtUeXBlMlsiUkVMQVRJVkUiXSA9IDFdID0gIlJFTEFUSVZFIjsKICAgICAgTmF2aWdhdGlvbkxpbmtUeXBlMltOYXZpZ2F0aW9uTGlua1R5cGUyWyJVTkxJTktFRCJdID0gMl0gPSAiVU5MSU5LRUQiOwogICAgfSkoTmF2aWdhdGlvbkxpbmtUeXBlIHx8IChOYXZpZ2F0aW9uTGlua1R5cGUgPSB7fSkpOwogICAgdmFyIE5hdmlnYXRpb25TaW1wbGVMaW5rVHlwZTsKICAgIChmdW5jdGlvbihOYXZpZ2F0aW9uU2ltcGxlTGlua1R5cGUyKSB7CiAgICAgIE5hdmlnYXRpb25TaW1wbGVMaW5rVHlwZTJbTmF2aWdhdGlvblNpbXBsZUxpbmtUeXBlMlsiTElOS0VEIl0gPSAwXSA9ICJMSU5LRUQiOwogICAgICBOYXZpZ2F0aW9uU2ltcGxlTGlua1R5cGUyW05hdmlnYXRpb25TaW1wbGVMaW5rVHlwZTJbIlVOTElOS0VEIl0gPSAyXSA9ICJVTkxJTktFRCI7CiAgICB9KShOYXZpZ2F0aW9uU2ltcGxlTGlua1R5cGUgfHwgKE5hdmlnYXRpb25TaW1wbGVMaW5rVHlwZSA9IHt9KSk7CiAgICB2ZWMzX2V4cG9ydHMuY3JlYXRlKCk7CiAgICBxdWF0X2V4cG9ydHMuY3JlYXRlKCk7CiAgICBmdW5jdGlvbiBkaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mb3NFcXVhbChhLCBiKSB7CiAgICAgIHJldHVybiBhcnJheXNFcXVhbChhLmdsb2JhbERpbWVuc2lvbk5hbWVzLCBiLmdsb2JhbERpbWVuc2lvbk5hbWVzKSAmJiBhcnJheXNFcXVhbChhLmRpc3BsYXlEaW1lbnNpb25JbmRpY2VzLCBiLmRpc3BsYXlEaW1lbnNpb25JbmRpY2VzKSAmJiBhcnJheXNFcXVhbChhLmNhbm9uaWNhbFZveGVsRmFjdG9ycywgYi5jYW5vbmljYWxWb3hlbEZhY3RvcnMpICYmIGFycmF5c0VxdWFsKGEudm94ZWxQaHlzaWNhbFNjYWxlcywgYi52b3hlbFBoeXNpY2FsU2NhbGVzKSAmJiBhLmNhbm9uaWNhbFZveGVsUGh5c2ljYWxTaXplID09PSBiLmNhbm9uaWNhbFZveGVsUGh5c2ljYWxTaXplICYmIGFycmF5c0VxdWFsKGEuZGlzcGxheURpbWVuc2lvblVuaXRzLCBiLmRpc3BsYXlEaW1lbnNpb25Vbml0cykgJiYgYXJyYXlzRXF1YWwoYS5kaXNwbGF5RGltZW5zaW9uU2NhbGVzLCBiLmRpc3BsYXlEaW1lbnNpb25TY2FsZXMpOwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvc2VnbWVudGF0aW9uX2dyYXBoL3NvdXJjZS50cwogICAgdmFyIFZpc2libGVTZWdtZW50RXF1aXZhbGVuY2VQb2xpY3k7CiAgICAoZnVuY3Rpb24oVmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeTIpIHsKICAgICAgVmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeTJbVmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeTJbIk1JTl9SRVBSRVNFTlRBVElWRSJdID0gMF0gPSAiTUlOX1JFUFJFU0VOVEFUSVZFIjsKICAgICAgVmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeTJbVmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeTJbIk1BWF9SRVBSRVNFTlRBVElWRSJdID0gMV0gPSAiTUFYX1JFUFJFU0VOVEFUSVZFIjsKICAgICAgVmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeTJbVmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeTJbIlJFUFJFU0VOVEFUSVZFX0VYQ0xVREVEIl0gPSAyXSA9ICJSRVBSRVNFTlRBVElWRV9FWENMVURFRCI7CiAgICAgIFZpc2libGVTZWdtZW50RXF1aXZhbGVuY2VQb2xpY3kyW1Zpc2libGVTZWdtZW50RXF1aXZhbGVuY2VQb2xpY3kyWyJOT05SRVBSRVNFTlRBVElWRV9FWENMVURFRCJdID0gNF0gPSAiTk9OUkVQUkVTRU5UQVRJVkVfRVhDTFVERUQiOwogICAgfSkoVmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeSB8fCAoVmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeSA9IHt9KSk7CiAgICBuZXcgVWludDY0KDQyOTQ5NjcyOTUsIDQyOTQ5NjcyOTUpOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdXRpbC9kaXNqb2ludF9zZXRzLnRzCiAgICB2YXIgcmFua1N5bWJvbCA9IFN5bWJvbCgiZGlzam9pbnRfc2V0czpyYW5rIik7CiAgICB2YXIgcGFyZW50U3ltYm9sID0gU3ltYm9sKCJkaXNqb2ludF9zZXRzOnBhcmVudCIpOwogICAgdmFyIG5leHRTeW1ib2wgPSBTeW1ib2woImRpc2pvaW50X3NldHM6bmV4dCIpOwogICAgdmFyIHByZXZTeW1ib2wgPSBTeW1ib2woImRpc2pvaW50X3NldHM6cHJldiIpOwogICAgZnVuY3Rpb24gZmluZFJlcHJlc2VudGF0aXZlKHYpIHsKICAgICAgbGV0IG9sZCA9IHY7CiAgICAgIGxldCBhbmNlc3RvciA9IHZbcGFyZW50U3ltYm9sXTsKICAgICAgd2hpbGUgKGFuY2VzdG9yICE9PSB2KSB7CiAgICAgICAgdiA9IGFuY2VzdG9yOwogICAgICAgIGFuY2VzdG9yID0gdltwYXJlbnRTeW1ib2xdOwogICAgICB9CiAgICAgIHYgPSBvbGRbcGFyZW50U3ltYm9sXTsKICAgICAgd2hpbGUgKGFuY2VzdG9yICE9PSB2KSB7CiAgICAgICAgb2xkW3BhcmVudFN5bWJvbF0gPSBhbmNlc3RvcjsKICAgICAgICBvbGQgPSB2OwogICAgICAgIHYgPSBvbGRbcGFyZW50U3ltYm9sXTsKICAgICAgfQogICAgICByZXR1cm4gYW5jZXN0b3I7CiAgICB9CiAgICBmdW5jdGlvbiBsaW5rVW5lcXVhbFNldFJlcHJlc2VudGF0aXZlcyhpLCBqKSB7CiAgICAgIGxldCBpUmFuayA9IGlbcmFua1N5bWJvbF07CiAgICAgIGxldCBqUmFuayA9IGpbcmFua1N5bWJvbF07CiAgICAgIGlmIChpUmFuayA+IGpSYW5rKSB7CiAgICAgICAgaltwYXJlbnRTeW1ib2xdID0gaTsKICAgICAgICByZXR1cm4gaTsKICAgICAgfQogICAgICBpW3BhcmVudFN5bWJvbF0gPSBqOwogICAgICBpZiAoaVJhbmsgPT09IGpSYW5rKSB7CiAgICAgICAgaltyYW5rU3ltYm9sXSA9IGpSYW5rICsgMTsKICAgICAgfQogICAgICByZXR1cm4gajsKICAgIH0KICAgIGZ1bmN0aW9uIHNwbGljZUNpcmN1bGFyTGlzdHMoaSwgaikgewogICAgICBsZXQgaVByZXYgPSBpW3ByZXZTeW1ib2xdOwogICAgICBsZXQgalByZXYgPSBqW3ByZXZTeW1ib2xdOwogICAgICBqW3ByZXZTeW1ib2xdID0gaVByZXY7CiAgICAgIGlQcmV2W25leHRTeW1ib2xdID0gajsKICAgICAgaVtwcmV2U3ltYm9sXSA9IGpQcmV2OwogICAgICBqUHJldltuZXh0U3ltYm9sXSA9IGk7CiAgICB9CiAgICBmdW5jdGlvbiogc2V0RWxlbWVudEl0ZXJhdG9yKGkpIHsKICAgICAgbGV0IGogPSBpOwogICAgICBkbyB7CiAgICAgICAgeWllbGQgajsKICAgICAgICBqID0galtuZXh0U3ltYm9sXTsKICAgICAgfSB3aGlsZSAoaiAhPT0gaSk7CiAgICB9CiAgICBmdW5jdGlvbiBpbml0aWFsaXplRWxlbWVudCh2KSB7CiAgICAgIHZbcGFyZW50U3ltYm9sXSA9IHY7CiAgICAgIHZbcmFua1N5bWJvbF0gPSAwOwogICAgICB2W25leHRTeW1ib2xdID0gdltwcmV2U3ltYm9sXSA9IHY7CiAgICB9CiAgICB2YXIgbWluU3ltYm9sID0gU3ltYm9sKCJkaXNqb2ludF9zZXRzOm1pbiIpOwogICAgZnVuY3Rpb24gaXNSb290RWxlbWVudCh2KSB7CiAgICAgIHJldHVybiB2W3BhcmVudFN5bWJvbF0gPT09IHY7CiAgICB9CiAgICB2YXIgRGlzam9pbnRVaW50NjRTZXRzID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLm1hcCA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLnZpc2libGVTZWdtZW50RXF1aXZhbGVuY2VQb2xpY3kgPSBuZXcgV2F0Y2hhYmxlVmFsdWUoVmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeS5NSU5fUkVQUkVTRU5UQVRJVkUpOwogICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IDA7CiAgICAgIH0KICAgICAgaGFzKHgpIHsKICAgICAgICBsZXQga2V5ID0geC50b1N0cmluZygpOwogICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5tYXAuZ2V0KGtleSk7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQgIT09IHZvaWQgMDsKICAgICAgfQogICAgICBnZXQoeCkgewogICAgICAgIGxldCBrZXkgPSB4LnRvU3RyaW5nKCk7CiAgICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLm1hcC5nZXQoa2V5KTsKICAgICAgICBpZiAoZWxlbWVudCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICByZXR1cm4geDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpbmRSZXByZXNlbnRhdGl2ZShlbGVtZW50KVttaW5TeW1ib2xdOwogICAgICB9CiAgICAgIGlzTWluRWxlbWVudCh4KSB7CiAgICAgICAgbGV0IHkgPSB0aGlzLmdldCh4KTsKICAgICAgICByZXR1cm4geSA9PT0geCB8fCBVaW50NjQuZXF1YWwoeSwgeCk7CiAgICAgIH0KICAgICAgbWFrZVNldCh4KSB7CiAgICAgICAgbGV0IGtleSA9IHgudG9TdHJpbmcoKTsKICAgICAgICBsZXQgeyBtYXAgfSA9IHRoaXM7CiAgICAgICAgbGV0IGVsZW1lbnQgPSBtYXAuZ2V0KGtleSk7CiAgICAgICAgaWYgKGVsZW1lbnQgPT09IHZvaWQgMCkgewogICAgICAgICAgZWxlbWVudCA9IHguY2xvbmUoKTsKICAgICAgICAgIGluaXRpYWxpemVFbGVtZW50KGVsZW1lbnQpOwogICAgICAgICAgZWxlbWVudFttaW5TeW1ib2xdID0gZWxlbWVudDsKICAgICAgICAgIG1hcC5zZXQoa2V5LCBlbGVtZW50KTsKICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmluZFJlcHJlc2VudGF0aXZlKGVsZW1lbnQpOwogICAgICB9CiAgICAgIGxpbmsoYSwgYikgewogICAgICAgIGEgPSB0aGlzLm1ha2VTZXQoYSk7CiAgICAgICAgYiA9IHRoaXMubWFrZVNldChiKTsKICAgICAgICBpZiAoYSA9PT0gYikgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB0aGlzLmdlbmVyYXRpb24rKzsKICAgICAgICBsZXQgbmV3Tm9kZSA9IGxpbmtVbmVxdWFsU2V0UmVwcmVzZW50YXRpdmVzKGEsIGIpOwogICAgICAgIHNwbGljZUNpcmN1bGFyTGlzdHMoYSwgYik7CiAgICAgICAgbGV0IGFNaW4gPSBhW21pblN5bWJvbF07CiAgICAgICAgbGV0IGJNaW4gPSBiW21pblN5bWJvbF07CiAgICAgICAgY29uc3QgaXNNYXggPSAodGhpcy52aXNpYmxlU2VnbWVudEVxdWl2YWxlbmNlUG9saWN5LnZhbHVlICYgVmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeS5NQVhfUkVQUkVTRU5UQVRJVkUpICE9PSAwOwogICAgICAgIG5ld05vZGVbbWluU3ltYm9sXSA9IFVpbnQ2NC5sZXNzKGFNaW4sIGJNaW4pID09PSBpc01heCA/IGJNaW4gOiBhTWluOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxpbmtBbGwoaWRzKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDEsIGxlbmd0aDQgPSBpZHMubGVuZ3RoOyBpIDwgbGVuZ3RoNDsgKytpKSB7CiAgICAgICAgICB0aGlzLmxpbmsoaWRzWzBdLCBpZHNbaV0pOwogICAgICAgIH0KICAgICAgfQogICAgICBkZWxldGVTZXQoeCkgewogICAgICAgIGNvbnN0IHsgbWFwIH0gPSB0aGlzOwogICAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgZm9yIChjb25zdCB5IG9mIHRoaXMuc2V0RWxlbWVudHMoeCkpIHsKICAgICAgICAgIG1hcC5kZWxldGUoeS50b1N0cmluZygpKTsKICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2hhbmdlZDsKICAgICAgfQogICAgICAqc2V0RWxlbWVudHMoYSkgewogICAgICAgIGxldCBrZXkgPSBhLnRvU3RyaW5nKCk7CiAgICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLm1hcC5nZXQoa2V5KTsKICAgICAgICBpZiAoZWxlbWVudCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB5aWVsZCBhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB5aWVsZCogc2V0RWxlbWVudEl0ZXJhdG9yKGVsZW1lbnQpOwogICAgICAgIH0KICAgICAgfQogICAgICBjbGVhcigpIHsKICAgICAgICBsZXQgeyBtYXAgfSA9IHRoaXM7CiAgICAgICAgaWYgKG1hcC5zaXplID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgICsrdGhpcy5nZW5lcmF0aW9uOwogICAgICAgIG1hcC5jbGVhcigpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGdldCBzaXplKCkgewogICAgICAgIHJldHVybiB0aGlzLm1hcC5zaXplOwogICAgICB9CiAgICAgICptYXBwaW5ncyh0ZW1wID0gbmV3IEFycmF5KDIpKSB7CiAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiB0aGlzLm1hcC52YWx1ZXMoKSkgewogICAgICAgICAgdGVtcFswXSA9IGVsZW1lbnQ7CiAgICAgICAgICB0ZW1wWzFdID0gZmluZFJlcHJlc2VudGF0aXZlKGVsZW1lbnQpW21pblN5bWJvbF07CiAgICAgICAgICB5aWVsZCB0ZW1wOwogICAgICAgIH0KICAgICAgfQogICAgICAqcm9vdHMoKSB7CiAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiB0aGlzLm1hcC52YWx1ZXMoKSkgewogICAgICAgICAgaWYgKGlzUm9vdEVsZW1lbnQoZWxlbWVudCkpIHsKICAgICAgICAgICAgeWllbGQgZWxlbWVudDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWFwcGluZ3MoKTsKICAgICAgfQogICAgICB0b0pTT04oKSB7CiAgICAgICAgbGV0IHNldHMgPSBuZXcgQXJyYXkoKTsKICAgICAgICBmb3IgKGxldCBlbGVtZW50IG9mIHRoaXMubWFwLnZhbHVlcygpKSB7CiAgICAgICAgICBpZiAoaXNSb290RWxlbWVudChlbGVtZW50KSkgewogICAgICAgICAgICBsZXQgbWVtYmVycyA9IG5ldyBBcnJheSgpOwogICAgICAgICAgICBmb3IgKGxldCBtZW1iZXIgb2Ygc2V0RWxlbWVudEl0ZXJhdG9yKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgbWVtYmVycy5wdXNoKG1lbWJlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWVtYmVycy5zb3J0KFVpbnQ2NC5jb21wYXJlKTsKICAgICAgICAgICAgc2V0cy5wdXNoKG1lbWJlcnMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzZXRzLnNvcnQoKGEsIGIpID0+IFVpbnQ2NC5jb21wYXJlKGFbMF0sIGJbMF0pKTsKICAgICAgICByZXR1cm4gc2V0cy5tYXAoKHNldDYpID0+IHNldDYubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LnRvU3RyaW5nKCkpKTsKICAgICAgfQogICAgfTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3NoYXJlZF9kaXNqb2ludF9zZXRzLnRzCiAgICB2YXIgUlBDX1RZUEVfSUQgPSAiRGlzam9pbnRVaW50NjRTZXRzIjsKICAgIHZhciBBRERfTUVUSE9EX0lEID0gIkRpc2pvaW50VWludDY0U2V0cy5hZGQiOwogICAgdmFyIENMRUFSX01FVEhPRF9JRCA9ICJEaXNqb2ludFVpbnQ2NFNldHMuY2xlYXIiOwogICAgdmFyIEhJR0hfQklUX1JFUFJFU0VOVEFUSVZFX0NIQU5HRURfSUQgPSAiRGlzam9pbnRVaW50NjRTZXRzLmhpZ2hCaXRSZXByZXNlbnRhdGl2ZUNoYW5nZWQiOwogICAgdmFyIERFTEVURV9TRVRfTUVUSE9EX0lEID0gIkRpc2pvaW50VWludDY0U2V0cy5kZWxldGVTZXQiOwogICAgdmFyIFNoYXJlZERpc2pvaW50VWludDY0U2V0cyA9IGNsYXNzIGV4dGVuZHMgU2hhcmVkT2JqZWN0Q291bnRlcnBhcnQgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMuZGlzam9pbnRTZXRzID0gbmV3IERpc2pvaW50VWludDY0U2V0cygpOwogICAgICAgIHRoaXMuY2hhbmdlZCA9IG5ldyBOdWxsYXJ5U2lnbmFsKCk7CiAgICAgIH0KICAgICAgZ2V0IHZhbHVlKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHN0YXRpYyBtYWtlV2l0aENvdW50ZXJwYXJ0KHJwYzIsIGhpZ2hCaXRSZXByZXNlbnRhdGl2ZSkgewogICAgICAgIGxldCBvYmogPSBuZXcgdGhpcygpOwogICAgICAgIG9iai5kaXNqb2ludFNldHMudmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeSA9IGhpZ2hCaXRSZXByZXNlbnRhdGl2ZTsKICAgICAgICBvYmoucmVnaXN0ZXJEaXNwb3NlcihoaWdoQml0UmVwcmVzZW50YXRpdmUuY2hhbmdlZC5hZGQoKCkgPT4gewogICAgICAgICAgdXBkYXRlSGlnaEJpdFJlcHJlc2VudGF0aXZlKG9iaik7CiAgICAgICAgfSkpOwogICAgICAgIG9iai5pbml0aWFsaXplQ291bnRlcnBhcnQocnBjMik7CiAgICAgICAgaWYgKGhpZ2hCaXRSZXByZXNlbnRhdGl2ZS52YWx1ZSkgewogICAgICAgICAgdXBkYXRlSGlnaEJpdFJlcHJlc2VudGF0aXZlKG9iaik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0KICAgICAgZGlzcG9zZWQoKSB7CiAgICAgICAgdGhpcy5kaXNqb2ludFNldHMgPSB2b2lkIDA7CiAgICAgICAgdGhpcy5jaGFuZ2VkID0gdm9pZCAwOwogICAgICAgIHN1cGVyLmRpc3Bvc2VkKCk7CiAgICAgIH0KICAgICAgbGluayhhLCBiKSB7CiAgICAgICAgaWYgKHRoaXMuZGlzam9pbnRTZXRzLmxpbmsoYSwgYikpIHsKICAgICAgICAgIGxldCB7IHJwYzogcnBjMiB9ID0gdGhpczsKICAgICAgICAgIGlmIChycGMyKSB7CiAgICAgICAgICAgIHJwYzIuaW52b2tlKEFERF9NRVRIT0RfSUQsIHsgImlkIjogdGhpcy5ycGNJZCwgImFsIjogYS5sb3csICJhaCI6IGEuaGlnaCwgImJsIjogYi5sb3csICJiaCI6IGIuaGlnaCB9KTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuY2hhbmdlZC5kaXNwYXRjaCgpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBsaW5rQWxsKGlkcykgewogICAgICAgIGZvciAobGV0IGkgPSAxLCBsZW5ndGg0ID0gaWRzLmxlbmd0aDsgaSA8IGxlbmd0aDQ7ICsraSkgewogICAgICAgICAgdGhpcy5saW5rKGlkc1swXSwgaWRzW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaGFzKHgpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXNqb2ludFNldHMuaGFzKHgpOwogICAgICB9CiAgICAgIGdldCh4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGlzam9pbnRTZXRzLmdldCh4KTsKICAgICAgfQogICAgICBjbGVhcigpIHsKICAgICAgICBpZiAodGhpcy5kaXNqb2ludFNldHMuY2xlYXIoKSkgewogICAgICAgICAgbGV0IHsgcnBjOiBycGMyIH0gPSB0aGlzOwogICAgICAgICAgaWYgKHJwYzIpIHsKICAgICAgICAgICAgcnBjMi5pbnZva2UoQ0xFQVJfTUVUSE9EX0lELCB7ICJpZCI6IHRoaXMucnBjSWQgfSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmNoYW5nZWQuZGlzcGF0Y2goKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0RWxlbWVudHMoYSkgewogICAgICAgIHJldHVybiB0aGlzLmRpc2pvaW50U2V0cy5zZXRFbGVtZW50cyhhKTsKICAgICAgfQogICAgICBkZWxldGVTZXQoeCkgewogICAgICAgIGlmICh0aGlzLmRpc2pvaW50U2V0cy5kZWxldGVTZXQoeCkpIHsKICAgICAgICAgIGxldCB7IHJwYzogcnBjMiB9ID0gdGhpczsKICAgICAgICAgIGlmIChycGMyKSB7CiAgICAgICAgICAgIHJwYzIuaW52b2tlKERFTEVURV9TRVRfTUVUSE9EX0lELCB7ICJpZCI6IHRoaXMucnBjSWQsICJsIjogeC5sb3csICJoIjogeC5oaWdoIH0pOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5jaGFuZ2VkLmRpc3BhdGNoKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGdldCBzaXplKCkgewogICAgICAgIHJldHVybiB0aGlzLmRpc2pvaW50U2V0cy5zaXplOwogICAgICB9CiAgICAgIHRvSlNPTigpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXNqb2ludFNldHMudG9KU09OKCk7CiAgICAgIH0KICAgICAgcmVzdG9yZVN0YXRlKG9iaikgewogICAgICAgIGlmIChvYmogIT09IHZvaWQgMCkgewogICAgICAgICAgbGV0IGlkcyA9IFtuZXcgVWludDY0KCksIG5ldyBVaW50NjQoKV07CiAgICAgICAgICBwYXJzZUFycmF5KG9iaiwgKHopID0+IHsKICAgICAgICAgICAgcGFyc2VBcnJheSh6LCAocywgaW5kZXgpID0+IHsKICAgICAgICAgICAgICBpZHNbaW5kZXggJSAyXS5wYXJzZVN0cmluZyhTdHJpbmcocyksIDEwKTsKICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IDApIHsKICAgICAgICAgICAgICAgIHRoaXMubGluayhpZHNbMF0sIGlkc1sxXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3NpZ25Gcm9tKG90aGVyKSB7CiAgICAgICAgdGhpcy5jbGVhcigpOwogICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFNoYXJlZERpc2pvaW50VWludDY0U2V0cykgewogICAgICAgICAgb3RoZXIgPSBvdGhlci5kaXNqb2ludFNldHM7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgW2EsIGJdIG9mIG90aGVyKSB7CiAgICAgICAgICB0aGlzLmxpbmsoYSwgYik7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgU2hhcmVkRGlzam9pbnRVaW50NjRTZXRzID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoUlBDX1RZUEVfSUQpCiAgICBdLCBTaGFyZWREaXNqb2ludFVpbnQ2NFNldHMpOwogICAgdmFyIHRlbXBBID0gbmV3IFVpbnQ2NCgpOwogICAgdmFyIHRlbXBCID0gbmV3IFVpbnQ2NCgpOwogICAgcmVnaXN0ZXJSUEMoQUREX01FVEhPRF9JRCwgZnVuY3Rpb24oeCkgewogICAgICBsZXQgb2JqID0gdGhpcy5nZXQoeFsiaWQiXSk7CiAgICAgIHRlbXBBLmxvdyA9IHhbImFsIl07CiAgICAgIHRlbXBBLmhpZ2ggPSB4WyJhaCJdOwogICAgICB0ZW1wQi5sb3cgPSB4WyJibCJdOwogICAgICB0ZW1wQi5oaWdoID0geFsiYmgiXTsKICAgICAgaWYgKG9iai5kaXNqb2ludFNldHMubGluayh0ZW1wQSwgdGVtcEIpKSB7CiAgICAgICAgb2JqLmNoYW5nZWQuZGlzcGF0Y2goKTsKICAgICAgfQogICAgfSk7CiAgICByZWdpc3RlclJQQyhDTEVBUl9NRVRIT0RfSUQsIGZ1bmN0aW9uKHgpIHsKICAgICAgbGV0IG9iaiA9IHRoaXMuZ2V0KHhbImlkIl0pOwogICAgICBpZiAob2JqLmRpc2pvaW50U2V0cy5jbGVhcigpKSB7CiAgICAgICAgb2JqLmNoYW5nZWQuZGlzcGF0Y2goKTsKICAgICAgfQogICAgfSk7CiAgICBmdW5jdGlvbiB1cGRhdGVIaWdoQml0UmVwcmVzZW50YXRpdmUob2JqKSB7CiAgICAgIG9iai5ycGMuaW52b2tlKEhJR0hfQklUX1JFUFJFU0VOVEFUSVZFX0NIQU5HRURfSUQsIHsgImlkIjogb2JqLnJwY0lkLCAidmFsdWUiOiBvYmouZGlzam9pbnRTZXRzLnZpc2libGVTZWdtZW50RXF1aXZhbGVuY2VQb2xpY3kudmFsdWUgfSk7CiAgICB9CiAgICByZWdpc3RlclJQQyhISUdIX0JJVF9SRVBSRVNFTlRBVElWRV9DSEFOR0VEX0lELCBmdW5jdGlvbih4KSB7CiAgICAgIGxldCBvYmogPSB0aGlzLmdldCh4WyJpZCJdKTsKICAgICAgb2JqLmRpc2pvaW50U2V0cy52aXNpYmxlU2VnbWVudEVxdWl2YWxlbmNlUG9saWN5LnZhbHVlID0geFsidmFsdWUiXTsKICAgIH0pOwogICAgcmVnaXN0ZXJSUEMoREVMRVRFX1NFVF9NRVRIT0RfSUQsIGZ1bmN0aW9uKHgpIHsKICAgICAgbGV0IG9iaiA9IHRoaXMuZ2V0KHhbImlkIl0pOwogICAgICB0ZW1wQS5sb3cgPSB4WyJsIl07CiAgICAgIHRlbXBBLmhpZ2ggPSB4WyJoIl07CiAgICAgIGlmIChvYmouZGlzam9pbnRTZXRzLmRlbGV0ZVNldCh0ZW1wQSkpIHsKICAgICAgICBvYmouY2hhbmdlZC5kaXNwYXRjaCgpOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2dwdV9oYXNoL2hhc2hfZnVuY3Rpb24udHMKICAgIHZhciBrMSA9IDM0MzI5MTgzNTM7CiAgICB2YXIgazIgPSA0NjE4NDU5MDc7CiAgICBmdW5jdGlvbiBoYXNoQ29tYmluZShzdGF0ZSwgdmFsdWUpIHsKICAgICAgdmFsdWUgPj4+PSAwOwogICAgICBzdGF0ZSA+Pj49IDA7CiAgICAgIHZhbHVlID0gTWF0aC5pbXVsKHZhbHVlLCBrMSkgPj4+IDA7CiAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDE1IHwgdmFsdWUgPj4+IDE3KSA+Pj4gMDsKICAgICAgdmFsdWUgPSBNYXRoLmltdWwodmFsdWUsIGsyKSA+Pj4gMDsKICAgICAgc3RhdGUgPSAoc3RhdGUgXiB2YWx1ZSkgPj4+IDA7CiAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDEzIHwgc3RhdGUgPj4+IDE5KSA+Pj4gMDsKICAgICAgc3RhdGUgPSBzdGF0ZSAqIDUgKyAzODY0MjkyMTk2ID4+PiAwOwogICAgICByZXR1cm4gc3RhdGU7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9ncHVfaGFzaC9oYXNoX3RhYmxlLnRzCiAgICB2YXIgTlVNX0FMVEVSTkFUSVZFUyA9IDM7CiAgICB2YXIgREVGQVVMVF9MT0FEX0ZBQ1RPUiA9IDAuODsKICAgIHZhciBwZW5kaW5nTG93ID0gMDsKICAgIHZhciBwZW5kaW5nSGlnaCA9IDA7CiAgICB2YXIgYmFja3VwUGVuZGluZ0xvdyA9IDA7CiAgICB2YXIgYmFja3VwUGVuZGluZ0hpZ2ggPSAwOwogICAgdmFyIEhhc2hUYWJsZUJhc2UgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKGhhc2hTZWVkcyA9IEhhc2hUYWJsZUJhc2UuZ2VuZXJhdGVIYXNoU2VlZHMoTlVNX0FMVEVSTkFUSVZFUykpIHsKICAgICAgICB0aGlzLmhhc2hTZWVkcyA9IGhhc2hTZWVkczsKICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSBERUZBVUxUX0xPQURfRkFDVE9SOwogICAgICAgIHRoaXMuc2l6ZSA9IDA7CiAgICAgICAgdGhpcy5lbXB0eUxvdyA9IDQyOTQ5NjcyOTU7CiAgICAgICAgdGhpcy5lbXB0eUhpZ2ggPSA0Mjk0OTY3Mjk1OwogICAgICAgIHRoaXMubWF4UmVoYXNoQXR0ZW1wdHMgPSA1OwogICAgICAgIHRoaXMubWF4QXR0ZW1wdHMgPSA1OwogICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IDA7CiAgICAgICAgdGhpcy5tdW5nZWRFbXB0eUtleSA9IC0xOwogICAgICAgIGxldCBpbml0aWFsU2l6ZSA9IDg7CiAgICAgICAgd2hpbGUgKGluaXRpYWxTaXplIDwgMiAqIGhhc2hTZWVkcy5sZW5ndGgpIHsKICAgICAgICAgIGluaXRpYWxTaXplICo9IDI7CiAgICAgICAgfQogICAgICAgIHRoaXMuYWxsb2NhdGUoaW5pdGlhbFNpemUpOwogICAgICB9CiAgICAgIHVwZGF0ZUhhc2hGdW5jdGlvbnMobnVtSGFzaGVzKSB7CiAgICAgICAgdGhpcy5oYXNoU2VlZHMgPSBIYXNoVGFibGVCYXNlLmdlbmVyYXRlSGFzaFNlZWRzKG51bUhhc2hlcyk7CiAgICAgICAgdGhpcy5tdW5nZWRFbXB0eUtleSA9IC0xOwogICAgICB9CiAgICAgIHRhYmxlV2l0aE11bmdlZEVtcHR5S2V5KGNhbGxiYWNrKSB7CiAgICAgICAgY29uc3QgbnVtSGFzaGVzID0gdGhpcy5oYXNoU2VlZHMubGVuZ3RoOwogICAgICAgIGNvbnN0IGVtcHR5U2xvdHMgPSBuZXcgQXJyYXkobnVtSGFzaGVzKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUhhc2hlczsgKytpKSB7CiAgICAgICAgICBlbXB0eVNsb3RzW2ldID0gdGhpcy5nZXRIYXNoKGksIHRoaXMuZW1wdHlMb3csIHRoaXMuZW1wdHlIaWdoKTsKICAgICAgICB9CiAgICAgICAgbGV0IHsgbXVuZ2VkRW1wdHlLZXkgfSA9IHRoaXM7CiAgICAgICAgaWYgKG11bmdlZEVtcHR5S2V5ID09PSAtMSkgewogICAgICAgICAgY2hvb3NlTXVuZ2VkRW1wdHlLZXk6CiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgbXVuZ2VkRW1wdHlLZXkgPSBNYXRoLnJhbmRvbSgpICogMTY3NzcyMTYgPj4+IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1IYXNoZXM7ICsraSkgewogICAgICAgICAgICAgICAgbGV0IGggPSB0aGlzLmdldEhhc2goaSwgbXVuZ2VkRW1wdHlLZXksIG11bmdlZEVtcHR5S2V5KTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtSGFzaGVzOyArK2opIHsKICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5U2xvdHNbal0gPT09IGgpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBjaG9vc2VNdW5nZWRFbXB0eUtleTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLm11bmdlZEVtcHR5S2V5ID0gbXVuZ2VkRW1wdHlLZXk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IHsgdGFibGUsIGVtcHR5TG93LCBlbXB0eUhpZ2ggfSA9IHRoaXM7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1IYXNoZXM7ICsraSkgewogICAgICAgICAgbGV0IGggPSBlbXB0eVNsb3RzW2ldOwogICAgICAgICAgaWYgKHRhYmxlW2hdID09PSBlbXB0eUxvdyAmJiB0YWJsZVtoICsgMV0gPT09IGVtcHR5SGlnaCkgewogICAgICAgICAgICB0YWJsZVtoXSA9IG11bmdlZEVtcHR5S2V5OwogICAgICAgICAgICB0YWJsZVtoICsgMV0gPSBtdW5nZWRFbXB0eUtleTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNhbGxiYWNrKHRhYmxlKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1IYXNoZXM7ICsraSkgewogICAgICAgICAgICBsZXQgaCA9IGVtcHR5U2xvdHNbaV07CiAgICAgICAgICAgIGlmICh0YWJsZVtoXSA9PT0gbXVuZ2VkRW1wdHlLZXkgJiYgdGFibGVbaCArIDFdID09PSBtdW5nZWRFbXB0eUtleSkgewogICAgICAgICAgICAgIHRhYmxlW2hdID0gZW1wdHlMb3c7CiAgICAgICAgICAgICAgdGFibGVbaCArIDFdID0gZW1wdHlIaWdoOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXRpYyBnZW5lcmF0ZUhhc2hTZWVkcyhudW1BbHRlcm5hdGl2ZXMgPSBOVU1fQUxURVJOQVRJVkVTKSB7CiAgICAgICAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhuZXcgVWludDMyQXJyYXkobnVtQWx0ZXJuYXRpdmVzKSk7CiAgICAgIH0KICAgICAgZ2V0SGFzaChoYXNoSW5kZXgsIGxvdywgaGlnaCkgewogICAgICAgIGxldCBoYXNoID0gdGhpcy5oYXNoU2VlZHNbaGFzaEluZGV4XTsKICAgICAgICBoYXNoID0gaGFzaENvbWJpbmUoaGFzaCwgbG93KTsKICAgICAgICBoYXNoID0gaGFzaENvbWJpbmUoaGFzaCwgaGlnaCk7CiAgICAgICAgcmV0dXJuIHRoaXMuZW50cnlTdHJpZGUgKiAoaGFzaCAmIHRoaXMudGFibGVTaXplIC0gMSk7CiAgICAgIH0KICAgICAgKmtleXMoKSB7CiAgICAgICAgbGV0IHsgZW1wdHlMb3csIGVtcHR5SGlnaCwgZW50cnlTdHJpZGUgfSA9IHRoaXM7CiAgICAgICAgbGV0IHsgdGFibGUgfSA9IHRoaXM7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aDQgPSB0YWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg0OyBpICs9IGVudHJ5U3RyaWRlKSB7CiAgICAgICAgICBsZXQgbG93ID0gdGFibGVbaV0sIGhpZ2ggPSB0YWJsZVtpICsgMV07CiAgICAgICAgICBpZiAobG93ICE9PSBlbXB0eUxvdyB8fCBoaWdoICE9PSBlbXB0eUhpZ2gpIHsKICAgICAgICAgICAgeWllbGQgbmV3IFVpbnQ2NChsb3csIGhpZ2gpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAqdW5zYWZlS2V5cyh0ZW1wID0gbmV3IFVpbnQ2NCgpKSB7CiAgICAgICAgbGV0IHsgZW1wdHlMb3csIGVtcHR5SGlnaCwgZW50cnlTdHJpZGUgfSA9IHRoaXM7CiAgICAgICAgbGV0IHsgdGFibGUgfSA9IHRoaXM7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aDQgPSB0YWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg0OyBpICs9IGVudHJ5U3RyaWRlKSB7CiAgICAgICAgICBsZXQgbG93ID0gdGFibGVbaV0sIGhpZ2ggPSB0YWJsZVtpICsgMV07CiAgICAgICAgICBpZiAobG93ICE9PSBlbXB0eUxvdyB8fCBoaWdoICE9PSBlbXB0eUhpZ2gpIHsKICAgICAgICAgICAgdGVtcC5sb3cgPSBsb3c7CiAgICAgICAgICAgIHRlbXAuaGlnaCA9IGhpZ2g7CiAgICAgICAgICAgIHlpZWxkIHRlbXA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGluZGV4T2ZQYWlyKGxvdywgaGlnaCkgewogICAgICAgIGxldCB7IHRhYmxlLCBlbXB0eUxvdywgZW1wdHlIaWdoIH0gPSB0aGlzOwogICAgICAgIGlmIChsb3cgPT09IGVtcHR5TG93ICYmIGhpZ2ggPT09IGVtcHR5SGlnaCkgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMCwgbnVtSGFzaGVzID0gdGhpcy5oYXNoU2VlZHMubGVuZ3RoOyBpIDwgbnVtSGFzaGVzOyArK2kpIHsKICAgICAgICAgIGxldCBoID0gdGhpcy5nZXRIYXNoKGksIGxvdywgaGlnaCk7CiAgICAgICAgICBpZiAodGFibGVbaF0gPT09IGxvdyAmJiB0YWJsZVtoICsgMV0gPT09IGhpZ2gpIHsKICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBpbmRleE9mKHgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbmRleE9mUGFpcih4LmxvdywgeC5oaWdoKTsKICAgICAgfQogICAgICBjaG9vc2VBbm90aGVyRW1wdHlLZXkoKSB7CiAgICAgICAgbGV0IHsgZW1wdHlMb3csIGVtcHR5SGlnaCwgdGFibGUsIGVudHJ5U3RyaWRlIH0gPSB0aGlzOwogICAgICAgIGxldCBuZXdMb3csIG5ld0hpZ2g7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIG5ld0xvdyA9IE1hdGgucmFuZG9tKCkgKiA0Mjk0OTY3Mjk2ID4+PiAwOwogICAgICAgICAgbmV3SGlnaCA9IE1hdGgucmFuZG9tKCkgKiA0Mjk0OTY3Mjk2ID4+PiAwOwogICAgICAgICAgaWYgKG5ld0xvdyA9PT0gZW1wdHlMb3cgJiYgbmV3SGlnaCA9PT0gZW1wdHlIaWdoKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuaGFzUGFpcihuZXdMb3csIG5ld0hpZ2gpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMuZW1wdHlMb3cgPSBuZXdMb3c7CiAgICAgICAgdGhpcy5lbXB0eUhpZ2ggPSBuZXdIaWdoOwogICAgICAgIGZvciAobGV0IGggPSAwLCBsZW5ndGg0ID0gdGFibGUubGVuZ3RoOyBoIDwgbGVuZ3RoNDsgaCArPSBlbnRyeVN0cmlkZSkgewogICAgICAgICAgaWYgKHRhYmxlW2hdID09PSBlbXB0eUxvdyAmJiB0YWJsZVtoICsgMV0gPT09IGVtcHR5SGlnaCkgewogICAgICAgICAgICB0YWJsZVtoXSA9IG5ld0xvdzsKICAgICAgICAgICAgdGFibGVbaCArIDFdID0gbmV3SGlnaDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaGFzKHgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbmRleE9mKHgpICE9PSAtMTsKICAgICAgfQogICAgICBoYXNQYWlyKGxvdywgaGlnaCkgewogICAgICAgIHJldHVybiB0aGlzLmluZGV4T2ZQYWlyKGxvdywgaGlnaCkgIT09IC0xOwogICAgICB9CiAgICAgIGRlbGV0ZSh4KSB7CiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5pbmRleE9mKHgpOwogICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKICAgICAgICAgIGxldCB7IHRhYmxlIH0gPSB0aGlzOwogICAgICAgICAgdGFibGVbaW5kZXhdID0gdGhpcy5lbXB0eUxvdzsKICAgICAgICAgIHRhYmxlW2luZGV4ICsgMV0gPSB0aGlzLmVtcHR5SGlnaDsKICAgICAgICAgICsrdGhpcy5nZW5lcmF0aW9uOwogICAgICAgICAgdGhpcy5zaXplLS07CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNsZWFyVGFibGUoKSB7CiAgICAgICAgbGV0IHsgdGFibGUsIGVudHJ5U3RyaWRlLCBlbXB0eUxvdywgZW1wdHlIaWdoIH0gPSB0aGlzOwogICAgICAgIGxldCBsZW5ndGg0ID0gdGFibGUubGVuZ3RoOwogICAgICAgIGZvciAobGV0IGggPSAwOyBoIDwgbGVuZ3RoNDsgaCArPSBlbnRyeVN0cmlkZSkgewogICAgICAgICAgdGFibGVbaF0gPSBlbXB0eUxvdzsKICAgICAgICAgIHRhYmxlW2ggKyAxXSA9IGVtcHR5SGlnaDsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2xlYXIoKSB7CiAgICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB0aGlzLnNpemUgPSAwOwogICAgICAgICsrdGhpcy5nZW5lcmF0aW9uOwogICAgICAgIHRoaXMuY2xlYXJUYWJsZSgpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJlc2VydmUoeCkgewogICAgICAgIGlmICh4ID4gdGhpcy5jYXBhY2l0eSkgewogICAgICAgICAgdGhpcy5iYWNrdXBQZW5kaW5nKCk7CiAgICAgICAgICB0aGlzLmdyb3coeCk7CiAgICAgICAgICB0aGlzLnJlc3RvcmVQZW5kaW5nKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHN3YXBQZW5kaW5nKHRhYmxlLCBvZmZzZXQpIHsKICAgICAgICBsZXQgdGVtcExvdyA9IHBlbmRpbmdMb3csIHRlbXBIaWdoID0gcGVuZGluZ0hpZ2g7CiAgICAgICAgdGhpcy5zdG9yZVBlbmRpbmcodGFibGUsIG9mZnNldCk7CiAgICAgICAgdGFibGVbb2Zmc2V0XSA9IHRlbXBMb3c7CiAgICAgICAgdGFibGVbb2Zmc2V0ICsgMV0gPSB0ZW1wSGlnaDsKICAgICAgfQogICAgICBzdG9yZVBlbmRpbmcodGFibGUsIG9mZnNldCkgewogICAgICAgIHBlbmRpbmdMb3cgPSB0YWJsZVtvZmZzZXRdOwogICAgICAgIHBlbmRpbmdIaWdoID0gdGFibGVbb2Zmc2V0ICsgMV07CiAgICAgIH0KICAgICAgYmFja3VwUGVuZGluZygpIHsKICAgICAgICBiYWNrdXBQZW5kaW5nTG93ID0gcGVuZGluZ0xvdzsKICAgICAgICBiYWNrdXBQZW5kaW5nSGlnaCA9IHBlbmRpbmdIaWdoOwogICAgICB9CiAgICAgIHJlc3RvcmVQZW5kaW5nKCkgewogICAgICAgIHBlbmRpbmdMb3cgPSBiYWNrdXBQZW5kaW5nTG93OwogICAgICAgIHBlbmRpbmdIaWdoID0gYmFja3VwUGVuZGluZ0hpZ2g7CiAgICAgIH0KICAgICAgdHJ5VG9JbnNlcnQoKSB7CiAgICAgICAgbGV0IGF0dGVtcHQgPSAwOwogICAgICAgIGxldCB7IGVtcHR5TG93LCBlbXB0eUhpZ2gsIG1heEF0dGVtcHRzOiBtYXhBdHRlbXB0czIsIHRhYmxlIH0gPSB0aGlzOwogICAgICAgIGxldCBudW1IYXNoZXMgPSB0aGlzLmhhc2hTZWVkcy5sZW5ndGg7CiAgICAgICAgbGV0IHRhYmxlSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBudW1IYXNoZXMpOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICBsZXQgaCA9IHRoaXMuZ2V0SGFzaCh0YWJsZUluZGV4LCBwZW5kaW5nTG93LCBwZW5kaW5nSGlnaCk7CiAgICAgICAgICB0aGlzLnN3YXBQZW5kaW5nKHRhYmxlLCBoKTsKICAgICAgICAgIGlmIChwZW5kaW5nTG93ID09PSBlbXB0eUxvdyAmJiBwZW5kaW5nSGlnaCA9PT0gZW1wdHlIaWdoKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCsrYXR0ZW1wdCA9PT0gbWF4QXR0ZW1wdHMyKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgdGFibGVJbmRleCA9ICh0YWJsZUluZGV4ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG51bUhhc2hlcyAtIDEpKSArIDEpICUgbnVtSGFzaGVzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgYWxsb2NhdGUodGFibGVTaXplKSB7CiAgICAgICAgdGhpcy50YWJsZVNpemUgPSB0YWJsZVNpemU7CiAgICAgICAgbGV0IHsgZW50cnlTdHJpZGUgfSA9IHRoaXM7CiAgICAgICAgdGhpcy50YWJsZSA9IG5ldyBVaW50MzJBcnJheSh0YWJsZVNpemUgKiBlbnRyeVN0cmlkZSk7CiAgICAgICAgdGhpcy5tYXhBdHRlbXB0cyA9IHRhYmxlU2l6ZTsKICAgICAgICB0aGlzLmNsZWFyVGFibGUoKTsKICAgICAgICB0aGlzLmNhcGFjaXR5ID0gdGFibGVTaXplICogdGhpcy5sb2FkRmFjdG9yOwogICAgICAgIHRoaXMubXVuZ2VkRW1wdHlLZXkgPSAtMTsKICAgICAgfQogICAgICByZWhhc2gob2xkVGFibGUsIHRhYmxlU2l6ZSkgewogICAgICAgIHRoaXMuYWxsb2NhdGUodGFibGVTaXplKTsKICAgICAgICB0aGlzLnVwZGF0ZUhhc2hGdW5jdGlvbnModGhpcy5oYXNoU2VlZHMubGVuZ3RoKTsKICAgICAgICBsZXQgeyBlbXB0eUxvdywgZW1wdHlIaWdoLCBlbnRyeVN0cmlkZSB9ID0gdGhpczsKICAgICAgICBmb3IgKGxldCBoID0gMCwgbGVuZ3RoNCA9IG9sZFRhYmxlLmxlbmd0aDsgaCA8IGxlbmd0aDQ7IGggKz0gZW50cnlTdHJpZGUpIHsKICAgICAgICAgIGxldCBsb3cgPSBvbGRUYWJsZVtoXSwgaGlnaCA9IG9sZFRhYmxlW2ggKyAxXTsKICAgICAgICAgIGlmIChsb3cgIT09IGVtcHR5TG93IHx8IGhpZ2ggIT09IGVtcHR5SGlnaCkgewogICAgICAgICAgICB0aGlzLnN0b3JlUGVuZGluZyhvbGRUYWJsZSwgaCk7CiAgICAgICAgICAgIGlmICghdGhpcy50cnlUb0luc2VydCgpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGdyb3coZGVzaXJlZFRhYmxlU2l6ZSkgewogICAgICAgIGxldCBvbGRUYWJsZSA9IHRoaXMudGFibGU7CiAgICAgICAgbGV0IHsgdGFibGVTaXplIH0gPSB0aGlzOwogICAgICAgIHdoaWxlICh0YWJsZVNpemUgPCBkZXNpcmVkVGFibGVTaXplKSB7CiAgICAgICAgICB0YWJsZVNpemUgKj0gMjsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGZvciAobGV0IHJlaGFzaEF0dGVtcHQgPSAwOyByZWhhc2hBdHRlbXB0IDwgdGhpcy5tYXhSZWhhc2hBdHRlbXB0czsgKytyZWhhc2hBdHRlbXB0KSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJlaGFzaChvbGRUYWJsZSwgdGFibGVTaXplKSkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGFibGVTaXplICo9IDI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGluc2VydEludGVybmFsKCkgewogICAgICAgICsrdGhpcy5nZW5lcmF0aW9uOwogICAgICAgIGlmIChwZW5kaW5nTG93ID09PSB0aGlzLmVtcHR5TG93ICYmIHBlbmRpbmdIaWdoID09PSB0aGlzLmVtcHR5SGlnaCkgewogICAgICAgICAgdGhpcy5jaG9vc2VBbm90aGVyRW1wdHlLZXkoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCsrdGhpcy5zaXplID4gdGhpcy5jYXBhY2l0eSkgewogICAgICAgICAgdGhpcy5iYWNrdXBQZW5kaW5nKCk7CiAgICAgICAgICB0aGlzLmdyb3codGhpcy50YWJsZVNpemUgKiAyKTsKICAgICAgICAgIHRoaXMucmVzdG9yZVBlbmRpbmcoKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKCF0aGlzLnRyeVRvSW5zZXJ0KCkpIHsKICAgICAgICAgIHRoaXMuYmFja3VwUGVuZGluZygpOwogICAgICAgICAgdGhpcy5ncm93KHRoaXMudGFibGVTaXplKTsKICAgICAgICAgIHRoaXMucmVzdG9yZVBlbmRpbmcoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICB2YXIgSGFzaFNldFVpbnQ2NCA9IGNsYXNzIGV4dGVuZHMgSGFzaFRhYmxlQmFzZSB7CiAgICAgIGFkZCh4KSB7CiAgICAgICAgbGV0IHsgbG93LCBoaWdoIH0gPSB4OwogICAgICAgIGlmICh0aGlzLmhhc1BhaXIobG93LCBoaWdoKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBwZW5kaW5nTG93ID0gbG93OwogICAgICAgIHBlbmRpbmdIaWdoID0gaGlnaDsKICAgICAgICB0aGlzLmluc2VydEludGVybmFsKCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudW5zYWZlS2V5cygpOwogICAgICB9CiAgICB9OwogICAgSGFzaFNldFVpbnQ2NC5wcm90b3R5cGUuZW50cnlTdHJpZGUgPSAyOwogICAgdmFyIHBlbmRpbmdWYWx1ZUxvdyA9IDA7CiAgICB2YXIgcGVuZGluZ1ZhbHVlSGlnaCA9IDA7CiAgICB2YXIgYmFja3VwUGVuZGluZ1ZhbHVlTG93ID0gMDsKICAgIHZhciBiYWNrdXBQZW5kaW5nVmFsdWVIaWdoID0gMDsKICAgIHZhciBIYXNoTWFwVWludDY0ID0gY2xhc3MgZXh0ZW5kcyBIYXNoVGFibGVCYXNlIHsKICAgICAgc2V0KGtleSwgdmFsdWUpIHsKICAgICAgICBsZXQgeyBsb3csIGhpZ2ggfSA9IGtleTsKICAgICAgICBpZiAodGhpcy5oYXNQYWlyKGxvdywgaGlnaCkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcGVuZGluZ0xvdyA9IGxvdzsKICAgICAgICBwZW5kaW5nSGlnaCA9IGhpZ2g7CiAgICAgICAgcGVuZGluZ1ZhbHVlTG93ID0gdmFsdWUubG93OwogICAgICAgIHBlbmRpbmdWYWx1ZUhpZ2ggPSB2YWx1ZS5oaWdoOwogICAgICAgIHRoaXMuaW5zZXJ0SW50ZXJuYWwoKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBnZXQoa2V5LCB2YWx1ZSkgewogICAgICAgIGxldCBoID0gdGhpcy5pbmRleE9mKGtleSk7CiAgICAgICAgaWYgKGggPT09IC0xKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGxldCB7IHRhYmxlIH0gPSB0aGlzOwogICAgICAgIHZhbHVlLmxvdyA9IHRhYmxlW2ggKyAyXTsKICAgICAgICB2YWx1ZS5oaWdoID0gdGFibGVbaCArIDNdOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHN3YXBQZW5kaW5nKHRhYmxlLCBvZmZzZXQpIHsKICAgICAgICBsZXQgdGVtcExvdyA9IHBlbmRpbmdWYWx1ZUxvdywgdGVtcEhpZ2ggPSBwZW5kaW5nVmFsdWVIaWdoOwogICAgICAgIHN1cGVyLnN3YXBQZW5kaW5nKHRhYmxlLCBvZmZzZXQpOwogICAgICAgIHRhYmxlW29mZnNldCArIDJdID0gdGVtcExvdzsKICAgICAgICB0YWJsZVtvZmZzZXQgKyAzXSA9IHRlbXBIaWdoOwogICAgICB9CiAgICAgIHN0b3JlUGVuZGluZyh0YWJsZSwgb2Zmc2V0KSB7CiAgICAgICAgc3VwZXIuc3RvcmVQZW5kaW5nKHRhYmxlLCBvZmZzZXQpOwogICAgICAgIHBlbmRpbmdWYWx1ZUxvdyA9IHRhYmxlW29mZnNldCArIDJdOwogICAgICAgIHBlbmRpbmdWYWx1ZUhpZ2ggPSB0YWJsZVtvZmZzZXQgKyAzXTsKICAgICAgfQogICAgICBiYWNrdXBQZW5kaW5nKCkgewogICAgICAgIHN1cGVyLmJhY2t1cFBlbmRpbmcoKTsKICAgICAgICBiYWNrdXBQZW5kaW5nVmFsdWVMb3cgPSBwZW5kaW5nVmFsdWVMb3c7CiAgICAgICAgYmFja3VwUGVuZGluZ1ZhbHVlSGlnaCA9IHBlbmRpbmdWYWx1ZUhpZ2g7CiAgICAgIH0KICAgICAgcmVzdG9yZVBlbmRpbmcoKSB7CiAgICAgICAgc3VwZXIucmVzdG9yZVBlbmRpbmcoKTsKICAgICAgICBwZW5kaW5nVmFsdWVMb3cgPSBiYWNrdXBQZW5kaW5nVmFsdWVMb3c7CiAgICAgICAgcGVuZGluZ1ZhbHVlSGlnaCA9IGJhY2t1cFBlbmRpbmdWYWx1ZUhpZ2g7CiAgICAgIH0KICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudW5zYWZlRW50cmllcygpOwogICAgICB9CiAgICAgICplbnRyaWVzKCkgewogICAgICAgIGxldCB7IGVtcHR5TG93LCBlbXB0eUhpZ2gsIGVudHJ5U3RyaWRlIH0gPSB0aGlzOwogICAgICAgIGxldCB7IHRhYmxlIH0gPSB0aGlzOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGg0ID0gdGFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoNDsgaSArPSBlbnRyeVN0cmlkZSkgewogICAgICAgICAgbGV0IGxvdyA9IHRhYmxlW2ldLCBoaWdoID0gdGFibGVbaSArIDFdOwogICAgICAgICAgaWYgKGxvdyAhPT0gZW1wdHlMb3cgfHwgaGlnaCAhPT0gZW1wdHlIaWdoKSB7CiAgICAgICAgICAgIGxldCBrZXkgPSBuZXcgVWludDY0KGxvdywgaGlnaCk7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG5ldyBVaW50NjQodGFibGVbaSArIDJdLCB0YWJsZVtpICsgM10pOwogICAgICAgICAgICB5aWVsZCBba2V5LCB2YWx1ZV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgICp1bnNhZmVFbnRyaWVzKHRlbXAgPSBbbmV3IFVpbnQ2NCgpLCBuZXcgVWludDY0KCldKSB7CiAgICAgICAgbGV0IHsgZW1wdHlMb3csIGVtcHR5SGlnaCwgZW50cnlTdHJpZGUgfSA9IHRoaXM7CiAgICAgICAgbGV0IHsgdGFibGUgfSA9IHRoaXM7CiAgICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IHRlbXA7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aDQgPSB0YWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg0OyBpICs9IGVudHJ5U3RyaWRlKSB7CiAgICAgICAgICBsZXQgbG93ID0gdGFibGVbaV0sIGhpZ2ggPSB0YWJsZVtpICsgMV07CiAgICAgICAgICBpZiAobG93ICE9PSBlbXB0eUxvdyB8fCBoaWdoICE9PSBlbXB0eUhpZ2gpIHsKICAgICAgICAgICAga2V5LmxvdyA9IGxvdzsKICAgICAgICAgICAga2V5LmhpZ2ggPSBoaWdoOwogICAgICAgICAgICB2YWx1ZS5sb3cgPSB0YWJsZVtpICsgMl07CiAgICAgICAgICAgIHZhbHVlLmhpZ2ggPSB0YWJsZVtpICsgM107CiAgICAgICAgICAgIHlpZWxkIHRlbXA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgSGFzaE1hcFVpbnQ2NC5wcm90b3R5cGUuZW50cnlTdHJpZGUgPSA0OwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdWludDY0X3NldC50cwogICAgdmFyIFVpbnQ2NFNldCA9IGNsYXNzIGV4dGVuZHMgU2hhcmVkT2JqZWN0Q291bnRlcnBhcnQgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMuaGFzaFRhYmxlID0gbmV3IEhhc2hTZXRVaW50NjQoKTsKICAgICAgICB0aGlzLmNoYW5nZWQgPSBuZXcgU2lnbmFsKCk7CiAgICAgIH0KICAgICAgZ2V0IHZhbHVlKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHN0YXRpYyBtYWtlV2l0aENvdW50ZXJwYXJ0KHJwYzIpIHsKICAgICAgICBsZXQgb2JqID0gbmV3IFVpbnQ2NFNldCgpOwogICAgICAgIG9iai5pbml0aWFsaXplQ291bnRlcnBhcnQocnBjMik7CiAgICAgICAgcmV0dXJuIG9iajsKICAgICAgfQogICAgICBzZXQoeCwgdmFsdWUpIHsKICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICB0aGlzLmRlbGV0ZSh4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5hZGQoeCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc2VydmVfKHgpIHsKICAgICAgICByZXR1cm4gdGhpcy5oYXNoVGFibGUucmVzZXJ2ZSh4KTsKICAgICAgfQogICAgICByZXNlcnZlKHgpIHsKICAgICAgICBpZiAodGhpcy5yZXNlcnZlXyh4KSkgewogICAgICAgICAgbGV0IHsgcnBjOiBycGMyIH0gPSB0aGlzOwogICAgICAgICAgaWYgKHJwYzIpIHsKICAgICAgICAgICAgcnBjMi5pbnZva2UoIlVpbnQ2NFNldC5yZXNlcnZlIiwgeyAiaWQiOiB0aGlzLnJwY0lkLCAidmFsdWUiOiB4IH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBhZGRfKHgpIHsKICAgICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlOwogICAgICAgIGZvciAoY29uc3QgdiBvZiB4KSB7CiAgICAgICAgICBjaGFuZ2VkID0gdGhpcy5oYXNoVGFibGUuYWRkKHYpIHx8IGNoYW5nZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgICB9CiAgICAgIGFkZCh4KSB7CiAgICAgICAgY29uc3QgdG1wID0gQXJyYXkoKS5jb25jYXQoeCk7CiAgICAgICAgaWYgKHRoaXMuYWRkXyh0bXApKSB7CiAgICAgICAgICBsZXQgeyBycGM6IHJwYzIgfSA9IHRoaXM7CiAgICAgICAgICBpZiAocnBjMikgewogICAgICAgICAgICBycGMyLmludm9rZSgiVWludDY0U2V0LmFkZCIsIHsgImlkIjogdGhpcy5ycGNJZCwgInZhbHVlIjogdG1wIH0pOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5jaGFuZ2VkLmRpc3BhdGNoKHgsIHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgICBoYXMoeCkgewogICAgICAgIHJldHVybiB0aGlzLmhhc2hUYWJsZS5oYXMoeCk7CiAgICAgIH0KICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaGFzaFRhYmxlLmtleXMoKTsKICAgICAgfQogICAgICB1bnNhZmVLZXlzKCkgewogICAgICAgIHJldHVybiB0aGlzLmhhc2hUYWJsZS51bnNhZmVLZXlzKCk7CiAgICAgIH0KICAgICAgZGVsZXRlXyh4KSB7CiAgICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZTsKICAgICAgICBmb3IgKGNvbnN0IHYgb2YgeCkgewogICAgICAgICAgY2hhbmdlZCA9IHRoaXMuaGFzaFRhYmxlLmRlbGV0ZSh2KSB8fCBjaGFuZ2VkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2hhbmdlZDsKICAgICAgfQogICAgICBkZWxldGUoeCkgewogICAgICAgIGNvbnN0IHRtcCA9IEFycmF5KCkuY29uY2F0KHgpOwogICAgICAgIGlmICh0aGlzLmRlbGV0ZV8oQXJyYXkoKS5jb25jYXQoeCkpKSB7CiAgICAgICAgICBsZXQgeyBycGM6IHJwYzIgfSA9IHRoaXM7CiAgICAgICAgICBpZiAocnBjMikgewogICAgICAgICAgICBycGMyLmludm9rZSgiVWludDY0U2V0LmRlbGV0ZSIsIHsgImlkIjogdGhpcy5ycGNJZCwgInZhbHVlIjogdG1wIH0pOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5jaGFuZ2VkLmRpc3BhdGNoKHgsIGZhbHNlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0IHNpemUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaGFzaFRhYmxlLnNpemU7CiAgICAgIH0KICAgICAgY2xlYXIoKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzaFRhYmxlLmNsZWFyKCkpIHsKICAgICAgICAgIGxldCB7IHJwYzogcnBjMiB9ID0gdGhpczsKICAgICAgICAgIGlmIChycGMyKSB7CiAgICAgICAgICAgIHJwYzIuaW52b2tlKCJVaW50NjRTZXQuY2xlYXIiLCB7ICJpZCI6IHRoaXMucnBjSWQgfSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmNoYW5nZWQuZGlzcGF0Y2gobnVsbCwgZmFsc2UpOwogICAgICAgIH0KICAgICAgfQogICAgICB0b0pTT04oKSB7CiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBBcnJheSgpOwogICAgICAgIGZvciAobGV0IGlkIG9mIHRoaXMudW5zYWZlS2V5cygpKSB7CiAgICAgICAgICByZXN1bHQucHVzaChpZC50b1N0cmluZygpKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnNvcnQoKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIGFzc2lnbkZyb20ob3RoZXIpIHsKICAgICAgICB0aGlzLmNsZWFyKCk7CiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygb3RoZXIudW5zYWZlS2V5cygpKSB7CiAgICAgICAgICB0aGlzLmFkZChrZXkpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIFVpbnQ2NFNldCA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KCJVaW50NjRTZXQiKQogICAgXSwgVWludDY0U2V0KTsKICAgIHJlZ2lzdGVyUlBDKCJVaW50NjRTZXQucmVzZXJ2ZSIsIGZ1bmN0aW9uKHgpIHsKICAgICAgbGV0IG9iaiA9IHRoaXMuZ2V0KHhbImlkIl0pOwogICAgICBpZiAob2JqLnJlc2VydmVfKHhbInZhbHVlIl0pKSB7CiAgICAgICAgb2JqLmNoYW5nZWQuZGlzcGF0Y2goKTsKICAgICAgfQogICAgfSk7CiAgICByZWdpc3RlclJQQygiVWludDY0U2V0LmFkZCIsIGZ1bmN0aW9uKHgpIHsKICAgICAgbGV0IG9iaiA9IHRoaXMuZ2V0KHhbImlkIl0pOwogICAgICBpZiAob2JqLmFkZF8oeFsidmFsdWUiXSkpIHsKICAgICAgICBvYmouY2hhbmdlZC5kaXNwYXRjaCgpOwogICAgICB9CiAgICB9KTsKICAgIHJlZ2lzdGVyUlBDKCJVaW50NjRTZXQuZGVsZXRlIiwgZnVuY3Rpb24oeCkgewogICAgICBsZXQgb2JqID0gdGhpcy5nZXQoeFsiaWQiXSk7CiAgICAgIGlmIChvYmouZGVsZXRlXyh4WyJ2YWx1ZSJdKSkgewogICAgICAgIG9iai5jaGFuZ2VkLmRpc3BhdGNoKCk7CiAgICAgIH0KICAgIH0pOwogICAgcmVnaXN0ZXJSUEMoIlVpbnQ2NFNldC5jbGVhciIsIGZ1bmN0aW9uKHgpIHsKICAgICAgbGV0IG9iaiA9IHRoaXMuZ2V0KHhbImlkIl0pOwogICAgICBpZiAob2JqLmhhc2hUYWJsZS5jbGVhcigpKSB7CiAgICAgICAgb2JqLmNoYW5nZWQuZGlzcGF0Y2goKTsKICAgICAgfQogICAgfSk7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91aW50NjRfbWFwLnRzCiAgICB2YXIgVWludDY0TWFwID0gY2xhc3MgZXh0ZW5kcyBTaGFyZWRPYmplY3RDb3VudGVycGFydCB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5oYXNoVGFibGUgPSBuZXcgSGFzaE1hcFVpbnQ2NCgpOwogICAgICAgIHRoaXMuY2hhbmdlZCA9IG5ldyBTaWduYWwoKTsKICAgICAgfQogICAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgc3RhdGljIG1ha2VXaXRoQ291bnRlcnBhcnQocnBjMikgewogICAgICAgIGxldCBvYmogPSBuZXcgVWludDY0TWFwKCk7CiAgICAgICAgb2JqLmluaXRpYWxpemVDb3VudGVycGFydChycGMyKTsKICAgICAgICByZXR1cm4gb2JqOwogICAgICB9CiAgICAgIHNldF8oa2V5LCB2YWx1ZSkgewogICAgICAgIHJldHVybiB0aGlzLmhhc2hUYWJsZS5zZXQoa2V5LCB2YWx1ZSk7CiAgICAgIH0KICAgICAgc2V0KGtleSwgdmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5zZXRfKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICBsZXQgeyBycGM6IHJwYzIgfSA9IHRoaXM7CiAgICAgICAgICBpZiAocnBjMikgewogICAgICAgICAgICBycGMyLmludm9rZSgiVWludDY0TWFwLnNldCIsIHsgImlkIjogdGhpcy5ycGNJZCwgImtleSI6IGtleSwgInZhbHVlIjogdmFsdWUgfSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmNoYW5nZWQuZGlzcGF0Y2goa2V5LCB0cnVlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaGFzKGtleSkgewogICAgICAgIHJldHVybiB0aGlzLmhhc2hUYWJsZS5oYXMoa2V5KTsKICAgICAgfQogICAgICBnZXQoa2V5LCB2YWx1ZSkgewogICAgICAgIHJldHVybiB0aGlzLmhhc2hUYWJsZS5nZXQoa2V5LCB2YWx1ZSk7CiAgICAgIH0KICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaGFzaFRhYmxlLmVudHJpZXMoKTsKICAgICAgfQogICAgICB1bnNhZmVFbnRyaWVzKCkgewogICAgICAgIHJldHVybiB0aGlzLmhhc2hUYWJsZS51bnNhZmVFbnRyaWVzKCk7CiAgICAgIH0KICAgICAgZGVsZXRlXyhrZXkpIHsKICAgICAgICByZXR1cm4gdGhpcy5oYXNoVGFibGUuZGVsZXRlKGtleSk7CiAgICAgIH0KICAgICAgZGVsZXRlKGtleSkgewogICAgICAgIGlmICh0aGlzLmRlbGV0ZV8oa2V5KSkgewogICAgICAgICAgbGV0IHsgcnBjOiBycGMyIH0gPSB0aGlzOwogICAgICAgICAgaWYgKHJwYzIpIHsKICAgICAgICAgICAgcnBjMi5pbnZva2UoIlVpbnQ2NE1hcC5kZWxldGUiLCB7ICJpZCI6IHRoaXMucnBjSWQsICJrZXkiOiBrZXkgfSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmNoYW5nZWQuZGlzcGF0Y2goa2V5LCBmYWxzZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGdldCBzaXplKCkgewogICAgICAgIHJldHVybiB0aGlzLmhhc2hUYWJsZS5zaXplOwogICAgICB9CiAgICAgIGFzc2lnbkZyb20ob3RoZXIpIHsKICAgICAgICB0aGlzLmNsZWFyKCk7CiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb3RoZXIudW5zYWZlRW50cmllcygpKSB7CiAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2xlYXIoKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzaFRhYmxlLmNsZWFyKCkpIHsKICAgICAgICAgIGxldCB7IHJwYzogcnBjMiB9ID0gdGhpczsKICAgICAgICAgIGlmIChycGMyKSB7CiAgICAgICAgICAgIHJwYzIuaW52b2tlKCJVaW50NjRNYXAuY2xlYXIiLCB7ICJpZCI6IHRoaXMucnBjSWQgfSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmNoYW5nZWQuZGlzcGF0Y2gobnVsbCwgZmFsc2UpOwogICAgICAgIH0KICAgICAgfQogICAgICB0b0pTT04oKSB7CiAgICAgICAgbGV0IHJlc3VsdCA9IHt9OwogICAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmhhc2hUYWJsZS51bnNhZmVFbnRyaWVzKCkpIHsKICAgICAgICAgIHJlc3VsdFtrZXkudG9TdHJpbmcoKV0gPSB2YWx1ZS50b1N0cmluZygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9OwogICAgVWludDY0TWFwID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoIlVpbnQ2NE1hcCIpCiAgICBdLCBVaW50NjRNYXApOwogICAgcmVnaXN0ZXJSUEMoIlVpbnQ2NE1hcC5zZXQiLCBmdW5jdGlvbih4KSB7CiAgICAgIGxldCBvYmogPSB0aGlzLmdldCh4WyJpZCJdKTsKICAgICAgaWYgKG9iai5zZXRfKHhbImtleSJdLCB4WyJ2YWx1ZSJdKSkgewogICAgICAgIG9iai5jaGFuZ2VkLmRpc3BhdGNoKCk7CiAgICAgIH0KICAgIH0pOwogICAgcmVnaXN0ZXJSUEMoIlVpbnQ2NE1hcC5kZWxldGUiLCBmdW5jdGlvbih4KSB7CiAgICAgIGxldCBvYmogPSB0aGlzLmdldCh4WyJpZCJdKTsKICAgICAgaWYgKG9iai5kZWxldGVfKHhbImtleSJdKSkgewogICAgICAgIG9iai5jaGFuZ2VkLmRpc3BhdGNoKCk7CiAgICAgIH0KICAgIH0pOwogICAgcmVnaXN0ZXJSUEMoIlVpbnQ2NE1hcC5jbGVhciIsIGZ1bmN0aW9uKHgpIHsKICAgICAgbGV0IG9iaiA9IHRoaXMuZ2V0KHhbImlkIl0pOwogICAgICBpZiAob2JqLmhhc2hUYWJsZS5jbGVhcigpKSB7CiAgICAgICAgb2JqLmNoYW5nZWQuZGlzcGF0Y2goKTsKICAgICAgfQogICAgfSk7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9zZWdtZW50YXRpb25fZGlzcGxheV9zdGF0ZS9iYXNlLnRzCiAgICB2YXIgVklTSUJMRV9TRUdNRU5UU19TVEFURV9QUk9QRVJUSUVTID0gWwogICAgICAidmlzaWJsZVNlZ21lbnRzIiwKICAgICAgInNlZ21lbnRFcXVpdmFsZW5jZXMiLAogICAgICAidGVtcG9yYXJ5VmlzaWJsZVNlZ21lbnRzIiwKICAgICAgInRlbXBvcmFyeVNlZ21lbnRFcXVpdmFsZW5jZXMiLAogICAgICAidXNlVGVtcG9yYXJ5VmlzaWJsZVNlZ21lbnRzIiwKICAgICAgInVzZVRlbXBvcmFyeVNlZ21lbnRFcXVpdmFsZW5jZXMiCiAgICBdOwogICAgZnVuY3Rpb24gb25WaXNpYmxlU2VnbWVudHNTdGF0ZUNoYW5nZWQoY29udGV4dCwgc3RhdGUsIGNhbGxiYWNrKSB7CiAgICAgIGNvbnRleHQucmVnaXN0ZXJEaXNwb3NlcihzdGF0ZS52aXNpYmxlU2VnbWVudHMuY2hhbmdlZC5hZGQoY2FsbGJhY2spKTsKICAgICAgY29udGV4dC5yZWdpc3RlckRpc3Bvc2VyKHN0YXRlLnNlZ21lbnRFcXVpdmFsZW5jZXMuY2hhbmdlZC5hZGQoY2FsbGJhY2spKTsKICAgIH0KICAgIGZ1bmN0aW9uIG9uVGVtcG9yYXJ5VmlzaWJsZVNlZ21lbnRzU3RhdGVDaGFuZ2VkKGNvbnRleHQsIHN0YXRlLCBjYWxsYmFjaykgewogICAgICBjb250ZXh0LnJlZ2lzdGVyRGlzcG9zZXIoc3RhdGUudGVtcG9yYXJ5VmlzaWJsZVNlZ21lbnRzLmNoYW5nZWQuYWRkKGNhbGxiYWNrKSk7CiAgICAgIGNvbnRleHQucmVnaXN0ZXJEaXNwb3NlcihzdGF0ZS50ZW1wb3JhcnlTZWdtZW50RXF1aXZhbGVuY2VzLmNoYW5nZWQuYWRkKGNhbGxiYWNrKSk7CiAgICAgIGNvbnRleHQucmVnaXN0ZXJEaXNwb3NlcihzdGF0ZS51c2VUZW1wb3JhcnlWaXNpYmxlU2VnbWVudHMuY2hhbmdlZC5hZGQoY2FsbGJhY2spKTsKICAgICAgY29udGV4dC5yZWdpc3RlckRpc3Bvc2VyKHN0YXRlLnVzZVRlbXBvcmFyeVNlZ21lbnRFcXVpdmFsZW5jZXMuY2hhbmdlZC5hZGQoY2FsbGJhY2spKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldE9iamVjdEtleShvYmplY3RJZCkgewogICAgICByZXR1cm4gYCR7b2JqZWN0SWQubG93fSwke29iamVjdElkLmhpZ2h9YDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzSGlnaEJpdFNlZ21lbnQoc2VnbWVudElkKSB7CiAgICAgIHJldHVybiBzZWdtZW50SWQuaGlnaCA+Pj4gMzEgPyB0cnVlIDogZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRWaXNpYmxlU2VnbWVudHMoc3RhdGUpIHsKICAgICAgcmV0dXJuIHN0YXRlLnVzZVRlbXBvcmFyeVZpc2libGVTZWdtZW50cy52YWx1ZSA/IHN0YXRlLnRlbXBvcmFyeVZpc2libGVTZWdtZW50cyA6IHN0YXRlLnZpc2libGVTZWdtZW50czsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFNlZ21lbnRFcXVpdmFsZW5jZXMoc3RhdGUpIHsKICAgICAgcmV0dXJuIHN0YXRlLnVzZVRlbXBvcmFyeVNlZ21lbnRFcXVpdmFsZW5jZXMudmFsdWUgPyBzdGF0ZS50ZW1wb3JhcnlTZWdtZW50RXF1aXZhbGVuY2VzIDogc3RhdGUuc2VnbWVudEVxdWl2YWxlbmNlczsKICAgIH0KICAgIGZ1bmN0aW9uIGZvckVhY2hWaXNpYmxlU2VnbWVudChzdGF0ZSwgY2FsbGJhY2spIHsKICAgICAgY29uc3QgdmlzaWJsZVNlZ21lbnRzID0gZ2V0VmlzaWJsZVNlZ21lbnRzKHN0YXRlKTsKICAgICAgY29uc3Qgc2VnbWVudEVxdWl2YWxlbmNlcyA9IGdldFNlZ21lbnRFcXVpdmFsZW5jZXMoc3RhdGUpOwogICAgICBpZiAoc2VnbWVudEVxdWl2YWxlbmNlcy5kaXNqb2ludFNldHMpIHsKICAgICAgICBjb25zdCBlcXVpdmFsZW5jZVBvbGljeSA9IHNlZ21lbnRFcXVpdmFsZW5jZXMuZGlzam9pbnRTZXRzLnZpc2libGVTZWdtZW50RXF1aXZhbGVuY2VQb2xpY3kudmFsdWU7CiAgICAgICAgZm9yIChsZXQgcm9vdE9iamVjdElkIG9mIHZpc2libGVTZWdtZW50cy51bnNhZmVLZXlzKCkpIHsKICAgICAgICAgIGlmIChlcXVpdmFsZW5jZVBvbGljeSAmIFZpc2libGVTZWdtZW50RXF1aXZhbGVuY2VQb2xpY3kuTk9OUkVQUkVTRU5UQVRJVkVfRVhDTFVERUQpIHsKICAgICAgICAgICAgY29uc3Qgcm9vdE9iamVjdElkMiA9IHNlZ21lbnRFcXVpdmFsZW5jZXMuZ2V0KHJvb3RPYmplY3RJZCk7CiAgICAgICAgICAgIGNhbGxiYWNrKHJvb3RPYmplY3RJZCwgcm9vdE9iamVjdElkMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoc2VnbWVudEVxdWl2YWxlbmNlcy5kaXNqb2ludFNldHMgPT09IHZvaWQgMCB8fCAhc2VnbWVudEVxdWl2YWxlbmNlcy5kaXNqb2ludFNldHMuaXNNaW5FbGVtZW50KHJvb3RPYmplY3RJZCkpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGxldCBvYmplY3RJZCBvZiBzZWdtZW50RXF1aXZhbGVuY2VzLnNldEVsZW1lbnRzKHJvb3RPYmplY3RJZCkpIHsKICAgICAgICAgICAgICBpZiAoZXF1aXZhbGVuY2VQb2xpY3kgJiBWaXNpYmxlU2VnbWVudEVxdWl2YWxlbmNlUG9saWN5LlJFUFJFU0VOVEFUSVZFX0VYQ0xVREVEICYmIGVxdWl2YWxlbmNlUG9saWN5ICYgVmlzaWJsZVNlZ21lbnRFcXVpdmFsZW5jZVBvbGljeS5NQVhfUkVQUkVTRU5UQVRJVkUgJiYgaXNIaWdoQml0U2VnbWVudChvYmplY3RJZCkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjYWxsYmFjayhvYmplY3RJZCwgcm9vdE9iamVjdElkKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvc2VnbWVudGF0aW9uX2Rpc3BsYXlfc3RhdGUvYmFja2VuZC50cwogICAgZnVuY3Rpb24gcmVjZWl2ZVZpc2libGVTZWdtZW50c1N0YXRlKHJwYzIsIG9wdGlvbnMsIHRhcmdldCA9IHt9KSB7CiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgVklTSUJMRV9TRUdNRU5UU19TVEFURV9QUk9QRVJUSUVTKSB7CiAgICAgICAgdGFyZ2V0W3Byb3BlcnR5XSA9IHJwYzIuZ2V0KG9wdGlvbnNbcHJvcGVydHldKTsKICAgICAgfQogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgdmFyIHdpdGhTZWdtZW50YXRpb25MYXllckJhY2tlbmRTdGF0ZSA9IChCYXNlKSA9PiBjbGFzcyBTZWdtZW50YXRpb25MYXllclN0YXRlIGV4dGVuZHMgQmFzZSB7CiAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHsKICAgICAgICBjb25zdCBbcnBjMiwgb3B0aW9uc10gPSBhcmdzOwogICAgICAgIHN1cGVyKHJwYzIsIG9wdGlvbnMpOwogICAgICAgIHJlY2VpdmVWaXNpYmxlU2VnbWVudHNTdGF0ZShycGMyLCBvcHRpb25zLCB0aGlzKTsKICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHJwYzIuZ2V0KG9wdGlvbnNbInRyYW5zZm9ybSJdKTsKICAgICAgICB0aGlzLnJlbmRlclNjYWxlVGFyZ2V0ID0gcnBjMi5nZXQob3B0aW9uc1sicmVuZGVyU2NhbGVUYXJnZXQiXSk7CiAgICAgICAgY29uc3Qgc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMgPSAoKSA9PiB7CiAgICAgICAgICB0aGlzLmNodW5rTWFuYWdlci5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICAgIH07CiAgICAgICAgb25UZW1wb3JhcnlWaXNpYmxlU2VnbWVudHNTdGF0ZUNoYW5nZWQodGhpcywgdGhpcywgc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMpOwogICAgICAgIG9uVmlzaWJsZVNlZ21lbnRzU3RhdGVDaGFuZ2VkKHRoaXMsIHRoaXMsIHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKTsKICAgICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIodGhpcy50cmFuc2Zvcm0uY2hhbmdlZC5hZGQoc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMpKTsKICAgICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIodGhpcy5yZW5kZXJTY2FsZVRhcmdldC5jaGFuZ2VkLmFkZChzY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcykpOwogICAgICB9CiAgICB9OwogICAgdmFyIEluZGV4ZWRTZWdtZW50UHJvcGVydHlTb3VyY2VCYWNrZW5kID0gY2xhc3MgZXh0ZW5kcyBDaHVua1NvdXJjZSB7CiAgICAgIGNvbnN0cnVjdG9yKHJwYzIsIG9wdGlvbnMpIHsKICAgICAgICBzdXBlcihycGMyLCBvcHRpb25zKTsKICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBvcHRpb25zLnByb3BlcnRpZXM7CiAgICAgIH0KICAgIH07CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9hbm5vdGF0aW9uL2JhY2tlbmQudHMKICAgIHZhciBBTk5PVEFUSU9OX01FVEFEQVRBX0NIVU5LX1BSSU9SSVRZID0gMjAwOwogICAgdmFyIEFOTk9UQVRJT05fU0VHTUVOVF9GSUxURVJFRF9DSFVOS19QUklPUklUWSA9IDYwOwogICAgdmFyIEFubm90YXRpb25NZXRhZGF0YUNodW5rID0gY2xhc3MgZXh0ZW5kcyBDaHVuayB7CiAgICAgIGZyZWVTeXN0ZW1NZW1vcnkoKSB7CiAgICAgICAgdGhpcy5hbm5vdGF0aW9uID0gdm9pZCAwOwogICAgICB9CiAgICAgIHNlcmlhbGl6ZShtc2csIHRyYW5zZmVycykgewogICAgICAgIHN1cGVyLnNlcmlhbGl6ZShtc2csIHRyYW5zZmVycyk7CiAgICAgICAgbXNnLmFubm90YXRpb24gPSB0aGlzLmFubm90YXRpb247CiAgICAgIH0KICAgICAgZG93bmxvYWRTdWNjZWVkZWQoKSB7CiAgICAgICAgdGhpcy5zeXN0ZW1NZW1vcnlCeXRlcyA9IHRoaXMuZ3B1TWVtb3J5Qnl0ZXMgPSAwOwogICAgICAgIHN1cGVyLmRvd25sb2FkU3VjY2VlZGVkKCk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgQW5ub3RhdGlvbkdlb21ldHJ5RGF0YSA9IGNsYXNzIHsKICAgICAgc2VyaWFsaXplKG1zZywgdHJhbnNmZXJzKSB7CiAgICAgICAgbXNnLmRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgbXNnLnR5cGVUb09mZnNldCA9IHRoaXMudHlwZVRvT2Zmc2V0OwogICAgICAgIG1zZy50eXBlVG9JZHMgPSB0aGlzLnR5cGVUb0lkczsKICAgICAgICBtc2cudHlwZVRvSWRNYXBzID0gdGhpcy50eXBlVG9JZE1hcHM7CiAgICAgICAgdHJhbnNmZXJzLnB1c2godGhpcy5kYXRhLmJ1ZmZlcik7CiAgICAgIH0KICAgICAgZ2V0IG51bUJ5dGVzKCkgewogICAgICAgIHJldHVybiB0aGlzLmRhdGEuYnl0ZUxlbmd0aDsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIEdlb21ldHJ5Q2h1bmtNaXhpbihCYXNlKSB7CiAgICAgIGNsYXNzIEMgZXh0ZW5kcyBCYXNlIHsKICAgICAgICBzZXJpYWxpemUobXNnLCB0cmFuc2ZlcnMpIHsKICAgICAgICAgIHN1cGVyLnNlcmlhbGl6ZShtc2csIHRyYW5zZmVycyk7CiAgICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHRoaXM7CiAgICAgICAgICBpZiAoZGF0YSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGRhdGEuc2VyaWFsaXplKG1zZywgdHJhbnNmZXJzKTsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdm9pZCAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkb3dubG9hZFN1Y2NlZWRlZCgpIHsKICAgICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gdGhpczsKICAgICAgICAgIHRoaXMuc3lzdGVtTWVtb3J5Qnl0ZXMgPSB0aGlzLmdwdU1lbW9yeUJ5dGVzID0gZGF0YSA9PT0gdm9pZCAwID8gMCA6IGRhdGEubnVtQnl0ZXM7CiAgICAgICAgICBzdXBlci5kb3dubG9hZFN1Y2NlZWRlZCgpOwogICAgICAgIH0KICAgICAgICBmcmVlU3lzdGVtTWVtb3J5KCkgewogICAgICAgICAgdGhpcy5kYXRhID0gdm9pZCAwOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gQzsKICAgIH0KICAgIHZhciBBbm5vdGF0aW9uR2VvbWV0cnlDaHVuayA9IGNsYXNzIGV4dGVuZHMgR2VvbWV0cnlDaHVua01peGluKFNsaWNlVmlld0NodW5rKSB7CiAgICB9OwogICAgdmFyIEFubm90YXRpb25TdWJzZXRHZW9tZXRyeUNodW5rID0gY2xhc3MgZXh0ZW5kcyBHZW9tZXRyeUNodW5rTWl4aW4oQ2h1bmspIHsKICAgIH07CiAgICB2YXIgQW5ub3RhdGlvbk1ldGFkYXRhQ2h1bmtTb3VyY2UgPSBjbGFzcyBleHRlbmRzIENodW5rU291cmNlIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICB0aGlzLnBhcmVudCA9IHZvaWQgMDsKICAgICAgfQogICAgICBnZXRDaHVuayhpZCkgewogICAgICAgIGNvbnN0IHsgY2h1bmtzIH0gPSB0aGlzOwogICAgICAgIGxldCBjaHVuayA9IGNodW5rcy5nZXQoaWQpOwogICAgICAgIGlmIChjaHVuayA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBjaHVuayA9IHRoaXMuZ2V0TmV3Q2h1bmtfKEFubm90YXRpb25NZXRhZGF0YUNodW5rKTsKICAgICAgICAgIGNodW5rLmluaXRpYWxpemUoaWQpOwogICAgICAgICAgdGhpcy5hZGRDaHVuayhjaHVuayk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjaHVuazsKICAgICAgfQogICAgICBkb3dubG9hZChjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZG93bmxvYWRNZXRhZGF0YShjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICB9CiAgICB9OwogICAgQW5ub3RhdGlvbk1ldGFkYXRhQ2h1bmtTb3VyY2UgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdChBTk5PVEFUSU9OX01FVEFEQVRBX0NIVU5LX1NPVVJDRV9SUENfSUQpCiAgICBdLCBBbm5vdGF0aW9uTWV0YWRhdGFDaHVua1NvdXJjZSk7CiAgICB2YXIgQW5ub3RhdGlvbkdlb21ldHJ5Q2h1bmtTb3VyY2VCYWNrZW5kID0gY2xhc3MgZXh0ZW5kcyBTbGljZVZpZXdDaHVua1NvdXJjZUJhY2tlbmQgewogICAgICBjb25zdHJ1Y3RvcihycGMyLCBvcHRpb25zKSB7CiAgICAgICAgc3VwZXIocnBjMiwgb3B0aW9ucyk7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBycGMyLmdldChvcHRpb25zLnBhcmVudCk7CiAgICAgIH0KICAgIH07CiAgICBBbm5vdGF0aW9uR2VvbWV0cnlDaHVua1NvdXJjZUJhY2tlbmQucHJvdG90eXBlLmNodW5rQ29uc3RydWN0b3IgPSBBbm5vdGF0aW9uR2VvbWV0cnlDaHVuazsKICAgIHZhciBBbm5vdGF0aW9uU3Vic2V0R2VvbWV0cnlDaHVua1NvdXJjZSA9IGNsYXNzIGV4dGVuZHMgQ2h1bmtTb3VyY2UgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMucGFyZW50ID0gdm9pZCAwOwogICAgICB9CiAgICAgIGdldENodW5rKG9iamVjdElkKSB7CiAgICAgICAgY29uc3Qga2V5ID0gZ2V0T2JqZWN0S2V5KG9iamVjdElkKTsKICAgICAgICBjb25zdCB7IGNodW5rcyB9ID0gdGhpczsKICAgICAgICBsZXQgY2h1bmsgPSBjaHVua3MuZ2V0KGtleSk7CiAgICAgICAgaWYgKGNodW5rID09PSB2b2lkIDApIHsKICAgICAgICAgIGNodW5rID0gdGhpcy5nZXROZXdDaHVua18oQW5ub3RhdGlvblN1YnNldEdlb21ldHJ5Q2h1bmspOwogICAgICAgICAgY2h1bmsuaW5pdGlhbGl6ZShrZXkpOwogICAgICAgICAgY2h1bmsub2JqZWN0SWQgPSBvYmplY3RJZC5jbG9uZSgpOwogICAgICAgICAgdGhpcy5hZGRDaHVuayhjaHVuayk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjaHVuazsKICAgICAgfQogICAgICBkb3dubG9hZChjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZG93bmxvYWRTZWdtZW50RmlsdGVyZWRHZW9tZXRyeShjaHVuaywgdGhpcy5yZWxhdGlvbnNoaXBJbmRleCwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICB9CiAgICB9OwogICAgQW5ub3RhdGlvblN1YnNldEdlb21ldHJ5Q2h1bmtTb3VyY2UgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdChBTk5PVEFUSU9OX1NVQlNFVF9HRU9NRVRSWV9DSFVOS19TT1VSQ0VfUlBDX0lEKQogICAgXSwgQW5ub3RhdGlvblN1YnNldEdlb21ldHJ5Q2h1bmtTb3VyY2UpOwogICAgdmFyIEFubm90YXRpb25Tb3VyY2UyID0gY2xhc3MgZXh0ZW5kcyBTaGFyZWRPYmplY3RDb3VudGVycGFydCB7CiAgICAgIGNvbnN0cnVjdG9yKHJwYzIsIG9wdGlvbnMpIHsKICAgICAgICBzdXBlcihycGMyLCBvcHRpb25zKTsKICAgICAgICB0aGlzLnJlZmVyZW5jZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgY29uc3QgY2h1bmtNYW5hZ2VyID0gdGhpcy5jaHVua01hbmFnZXIgPSBycGMyLmdldChvcHRpb25zLmNodW5rTWFuYWdlcik7CiAgICAgICAgY29uc3QgbWV0YWRhdGFDaHVua1NvdXJjZSA9IHRoaXMubWV0YWRhdGFDaHVua1NvdXJjZSA9IHRoaXMucmVnaXN0ZXJEaXNwb3NlcihycGMyLmdldFJlZihvcHRpb25zLm1ldGFkYXRhQ2h1bmtTb3VyY2UpKTsKICAgICAgICB0aGlzLnNlZ21lbnRGaWx0ZXJlZFNvdXJjZXMgPSBvcHRpb25zLnNlZ21lbnRGaWx0ZXJlZFNvdXJjZS5tYXAoKHgsIGkpID0+IHsKICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMucmVnaXN0ZXJEaXNwb3NlcihycGMyLmdldFJlZih4KSk7CiAgICAgICAgICBzb3VyY2UucGFyZW50ID0gdGhpczsKICAgICAgICAgIHNvdXJjZS5yZWxhdGlvbnNoaXBJbmRleCA9IGk7CiAgICAgICAgICByZXR1cm4gc291cmNlOwogICAgICAgIH0pOwogICAgICAgIG1ldGFkYXRhQ2h1bmtTb3VyY2UucGFyZW50ID0gdGhpczsKICAgICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIoY2h1bmtNYW5hZ2VyLnJlY29tcHV0ZUNodW5rUHJpb3JpdGllcy5hZGQoKCkgPT4gdGhpcy5yZWNvbXB1dGVDaHVua1ByaW9yaXRpZXMoKSkpOwogICAgICB9CiAgICAgIHJlY29tcHV0ZUNodW5rUHJpb3JpdGllcygpIHsKICAgICAgICBjb25zdCB7IGNodW5rTWFuYWdlciwgbWV0YWRhdGFDaHVua1NvdXJjZSB9ID0gdGhpczsKICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHRoaXMucmVmZXJlbmNlcykgewogICAgICAgICAgY2h1bmtNYW5hZ2VyLnJlcXVlc3RDaHVuayhtZXRhZGF0YUNodW5rU291cmNlLmdldENodW5rKGlkKSwgQ2h1bmtQcmlvcml0eVRpZXIuVklTSUJMRSwgQU5OT1RBVElPTl9NRVRBREFUQV9DSFVOS19QUklPUklUWSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkZChhbm5vdGF0aW9uKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQiKTsKICAgICAgfQogICAgICBkZWxldGUoaWQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpOwogICAgICB9CiAgICAgIHVwZGF0ZShpZCwgbmV3QW5ub3RhdGlvbikgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIik7CiAgICAgIH0KICAgIH07CiAgICByZWdpc3RlclJQQyhBTk5PVEFUSU9OX1JFRkVSRU5DRV9BRERfUlBDX0lELCBmdW5jdGlvbih4KSB7CiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuZ2V0KHguaWQpOwogICAgICBvYmoucmVmZXJlbmNlcy5hZGQoeC5hbm5vdGF0aW9uKTsKICAgICAgb2JqLmNodW5rTWFuYWdlci5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgfSk7CiAgICByZWdpc3RlclJQQyhBTk5PVEFUSU9OX1JFRkVSRU5DRV9ERUxFVEVfUlBDX0lELCBmdW5jdGlvbih4KSB7CiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuZ2V0KHguaWQpOwogICAgICBvYmoucmVmZXJlbmNlcy5kZWxldGUoeC5hbm5vdGF0aW9uKTsKICAgICAgb2JqLmNodW5rTWFuYWdlci5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgfSk7CiAgICByZWdpc3RlclJQQyhBTk5PVEFUSU9OX0NPTU1JVF9VUERBVEVfUlBDX0lELCBmdW5jdGlvbih4KSB7CiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuZ2V0KHguaWQpOwogICAgICBjb25zdCBhbm5vdGF0aW9uSWQgPSB4LmFubm90YXRpb25JZDsKICAgICAgY29uc3QgbmV3QW5ub3RhdGlvbiA9IGZpeEFubm90YXRpb25BZnRlclN0cnVjdHVyZWRDbG9uaW5nKHgubmV3QW5ub3RhdGlvbik7CiAgICAgIGxldCBwcm9taXNlOwogICAgICBpZiAoYW5ub3RhdGlvbklkID09PSB2b2lkIDApIHsKICAgICAgICBwcm9taXNlID0gb2JqLmFkZChuZXdBbm5vdGF0aW9uKS50aGVuKChpZCkgPT4gKHsgLi4ubmV3QW5ub3RhdGlvbiwgaWQgfSkpOwogICAgICB9IGVsc2UgaWYgKG5ld0Fubm90YXRpb24gPT09IG51bGwpIHsKICAgICAgICBwcm9taXNlID0gb2JqLmRlbGV0ZShhbm5vdGF0aW9uSWQpLnRoZW4oKCkgPT4gbnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJvbWlzZSA9IG9iai51cGRhdGUoYW5ub3RhdGlvbklkLCBuZXdBbm5vdGF0aW9uKS50aGVuKCgpID0+IG5ld0Fubm90YXRpb24pOwogICAgICB9CiAgICAgIHByb21pc2UudGhlbigocmVzdWx0KSA9PiB7CiAgICAgICAgaWYgKCFvYmoud2FzRGlzcG9zZWQpIHsKICAgICAgICAgIHRoaXMuaW52b2tlKEFOTk9UQVRJT05fQ09NTUlUX1VQREFURV9SRVNVTFRfUlBDX0lELCB7CiAgICAgICAgICAgIGlkOiBvYmoucnBjSWQsCiAgICAgICAgICAgIGFubm90YXRpb25JZDogYW5ub3RhdGlvbklkIHx8IG5ld0Fubm90YXRpb24uaWQsCiAgICAgICAgICAgIG5ld0Fubm90YXRpb246IHJlc3VsdAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LCAoZXJyb3IpID0+IHsKICAgICAgICBpZiAoIW9iai53YXNEaXNwb3NlZCkgewogICAgICAgICAgdGhpcy5pbnZva2UoQU5OT1RBVElPTl9DT01NSVRfVVBEQVRFX1JFU1VMVF9SUENfSUQsIHsKICAgICAgICAgICAgaWQ6IG9iai5ycGNJZCwKICAgICAgICAgICAgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uSWQgfHwgbmV3QW5ub3RhdGlvbiAmJiBuZXdBbm5vdGF0aW9uLmlkLAogICAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogICAgdmFyIEFubm90YXRpb25TcGF0aWFsbHlJbmRleGVkUmVuZGVyTGF5ZXJCYWNrZW5kID0gY2xhc3MgZXh0ZW5kcyB3aXRoQ2h1bmtNYW5hZ2VyKFJlbmRlckxheWVyQmFja2VuZCkgewogICAgICBjb25zdHJ1Y3RvcihycGMyLCBvcHRpb25zKSB7CiAgICAgICAgc3VwZXIocnBjMiwgb3B0aW9ucyk7CiAgICAgICAgdGhpcy5yZW5kZXJTY2FsZVRhcmdldCA9IHJwYzIuZ2V0KG9wdGlvbnMucmVuZGVyU2NhbGVUYXJnZXQpOwogICAgICAgIHRoaXMubG9jYWxQb3NpdGlvbiA9IHJwYzIuZ2V0KG9wdGlvbnMubG9jYWxQb3NpdGlvbik7CiAgICAgICAgY29uc3Qgc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMgPSAoKSA9PiB0aGlzLmNodW5rTWFuYWdlci5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICAgIHRoaXMucmVnaXN0ZXJEaXNwb3Nlcih0aGlzLmxvY2FsUG9zaXRpb24uY2hhbmdlZC5hZGQoc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMpKTsKICAgICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIodGhpcy5yZW5kZXJTY2FsZVRhcmdldC5jaGFuZ2VkLmFkZChzY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcykpOwogICAgICAgIHRoaXMucmVnaXN0ZXJEaXNwb3Nlcih0aGlzLmNodW5rTWFuYWdlci5yZWNvbXB1dGVDaHVua1ByaW9yaXRpZXMuYWRkKCgpID0+IHRoaXMucmVjb21wdXRlQ2h1bmtQcmlvcml0aWVzKCkpKTsKICAgICAgfQogICAgICBhdHRhY2goYXR0YWNobWVudCkgewogICAgICAgIGNvbnN0IHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzID0gKCkgPT4gdGhpcy5jaHVua01hbmFnZXIuc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMoKTsKICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGF0dGFjaG1lbnQ7CiAgICAgICAgYXR0YWNobWVudC5yZWdpc3RlckRpc3Bvc2VyKHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKTsKICAgICAgICBhdHRhY2htZW50LnJlZ2lzdGVyRGlzcG9zZXIodmlldy5wcm9qZWN0aW9uUGFyYW1ldGVycy5jaGFuZ2VkLmFkZChzY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcykpOwogICAgICAgIGF0dGFjaG1lbnQucmVnaXN0ZXJEaXNwb3Nlcih2aWV3LnZpc2liaWxpdHkuY2hhbmdlZC5hZGQoc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMpKTsKICAgICAgICBhdHRhY2htZW50LnN0YXRlID0gewogICAgICAgICAgZGlzcGxheURpbWVuc2lvblJlbmRlckluZm86IHZpZXcucHJvamVjdGlvblBhcmFtZXRlcnMudmFsdWUuZGlzcGxheURpbWVuc2lvblJlbmRlckluZm8sCiAgICAgICAgICB0cmFuc2Zvcm1lZFNvdXJjZXM6IFtdCiAgICAgICAgfTsKICAgICAgfQogICAgICByZWNvbXB1dGVDaHVua1ByaW9yaXRpZXMoKSB7CiAgICAgICAgdGhpcy5jaHVua01hbmFnZXIucmVnaXN0ZXJMYXllcih0aGlzKTsKICAgICAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgdGhpcy5hdHRhY2htZW50cy52YWx1ZXMoKSkgewogICAgICAgICAgY29uc3QgeyB2aWV3IH0gPSBhdHRhY2htZW50OwogICAgICAgICAgY29uc3QgdmlzaWJpbGl0eSA9IHZpZXcudmlzaWJpbGl0eS52YWx1ZTsKICAgICAgICAgIGlmICh2aXNpYmlsaXR5ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBhdHRhY2htZW50U3RhdGUgPSBhdHRhY2htZW50LnN0YXRlOwogICAgICAgICAgY29uc3QgeyB0cmFuc2Zvcm1lZFNvdXJjZXMsIGRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvIH0gPSBhdHRhY2htZW50U3RhdGU7CiAgICAgICAgICBpZiAodHJhbnNmb3JtZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICBjb25zdCB2aWV3RGlzcGxheURpbWVuc2lvblJlbmRlckluZm8gPSB2aWV3LnByb2plY3Rpb25QYXJhbWV0ZXJzLnZhbHVlLmRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvOwogICAgICAgICAgaWYgKGRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvICE9PSB2aWV3RGlzcGxheURpbWVuc2lvblJlbmRlckluZm8pIHsKICAgICAgICAgICAgaWYgKCFkaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mb3NFcXVhbChkaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbywgdmlld0Rpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvKSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF0dGFjaG1lbnRTdGF0ZS5kaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbyA9IHZpZXdEaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbzsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHByaW9yaXR5VGllciA9IGdldFByaW9yaXR5VGllcih2aXNpYmlsaXR5KTsKICAgICAgICAgIGNvbnN0IGJhc2VQcmlvcml0eSA9IGdldEJhc2VQcmlvcml0eSh2aXNpYmlsaXR5KTsKICAgICAgICAgIGNvbnN0IHByb2plY3Rpb25QYXJhbWV0ZXJzID0gdmlldy5wcm9qZWN0aW9uUGFyYW1ldGVycy52YWx1ZTsKICAgICAgICAgIGNvbnN0IHsgY2h1bmtNYW5hZ2VyIH0gPSB0aGlzOwogICAgICAgICAgZm9yRWFjaFZpc2libGVBbm5vdGF0aW9uQ2h1bmsocHJvamVjdGlvblBhcmFtZXRlcnMsIHRoaXMubG9jYWxQb3NpdGlvbi52YWx1ZSwgdGhpcy5yZW5kZXJTY2FsZVRhcmdldC52YWx1ZSwgdHJhbnNmb3JtZWRTb3VyY2VzWzBdLCAoKSA9PiB7CiAgICAgICAgICB9LCAodHNvdXJjZSwgc2NhbGVJbmRleCkgPT4gewogICAgICAgICAgICBjb25zdCBjaHVuayA9IHRzb3VyY2Uuc291cmNlLmdldENodW5rKHRzb3VyY2UuY3VyUG9zaXRpb25JbkNodW5rcyk7CiAgICAgICAgICAgICsrdGhpcy5udW1WaXNpYmxlQ2h1bmtzTmVlZGVkOwogICAgICAgICAgICBpZiAoY2h1bmsuc3RhdGUgPT09IENodW5rU3RhdGUuR1BVX01FTU9SWSkgewogICAgICAgICAgICAgICsrdGhpcy5udW1WaXNpYmxlQ2h1bmtzQXZhaWxhYmxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBwcmlvcml0eSA9IDA7CiAgICAgICAgICAgIGNodW5rTWFuYWdlci5yZXF1ZXN0Q2h1bmsoY2h1bmssIHByaW9yaXR5VGllciwgYmFzZVByaW9yaXR5ICsgcHJpb3JpdHkgKyBTQ0FMRV9QUklPUklUWV9NVUxUSVBMSUVSICogc2NhbGVJbmRleCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBBbm5vdGF0aW9uU3BhdGlhbGx5SW5kZXhlZFJlbmRlckxheWVyQmFja2VuZCA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KEFOTk9UQVRJT05fU1BBVElBTExZX0lOREVYRURfUkVOREVSX0xBWUVSX1JQQ19JRCkKICAgIF0sIEFubm90YXRpb25TcGF0aWFsbHlJbmRleGVkUmVuZGVyTGF5ZXJCYWNrZW5kKTsKICAgIHJlZ2lzdGVyUlBDKEFOTk9UQVRJT05fUEVSU1BFQ1RJVkVfUkVOREVSX0xBWUVSX1VQREFURV9TT1VSQ0VTX1JQQ19JRCwgZnVuY3Rpb24oeCkgewogICAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXQoeC52aWV3KTsKICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldCh4LmxheWVyKTsKICAgICAgY29uc3QgYXR0YWNobWVudCA9IGxheWVyLmF0dGFjaG1lbnRzLmdldCh2aWV3KTsKICAgICAgYXR0YWNobWVudC5zdGF0ZS50cmFuc2Zvcm1lZFNvdXJjZXMgPSBkZXNlcmlhbGl6ZVRyYW5zZm9ybWVkU291cmNlcyh0aGlzLCB4LnNvdXJjZXMsIGxheWVyKTsKICAgICAgYXR0YWNobWVudC5zdGF0ZS5kaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbyA9IHguZGlzcGxheURpbWVuc2lvblJlbmRlckluZm87CiAgICAgIGxheWVyLmNodW5rTWFuYWdlci5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgfSk7CiAgICB2YXIgQW5ub3RhdGlvbkxheWVyU2hhcmVkT2JqZWN0Q291bnRlcnBhcnQgPSBjbGFzcyBleHRlbmRzIHdpdGhTaGFyZWRWaXNpYmlsaXR5KHdpdGhDaHVua01hbmFnZXIoQ2h1bmtSZW5kZXJMYXllckJhY2tlbmQpKSB7CiAgICAgIGNvbnN0cnVjdG9yKHJwYzIsIG9wdGlvbnMpIHsKICAgICAgICBzdXBlcihycGMyLCBvcHRpb25zKTsKICAgICAgICB0aGlzLnNvdXJjZSA9IHJwYzIuZ2V0KG9wdGlvbnMuc291cmNlKTsKICAgICAgICB0aGlzLnNlZ21lbnRhdGlvblN0YXRlcyA9IG5ldyBXYXRjaGFibGVWYWx1ZSh0aGlzLmdldFNlZ21lbnRhdGlvblN0YXRlKG9wdGlvbnMuc2VnbWVudGF0aW9uU3RhdGVzKSk7CiAgICAgICAgY29uc3Qgc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMgPSAoKSA9PiB0aGlzLmNodW5rTWFuYWdlci5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICAgIHRoaXMucmVnaXN0ZXJEaXNwb3NlcihyZWdpc3Rlck5lc3RlZCgoY29udGV4dCwgc3RhdGVzKSA9PiB7CiAgICAgICAgICBpZiAoc3RhdGVzID09PSB2b2lkIDApCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2Ygc3RhdGVzKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBudWxsKQogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBvblZpc2libGVTZWdtZW50c1N0YXRlQ2hhbmdlZChjb250ZXh0LCBzdGF0ZSwgc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMpOwogICAgICAgICAgICBvblRlbXBvcmFyeVZpc2libGVTZWdtZW50c1N0YXRlQ2hhbmdlZChjb250ZXh0LCBzdGF0ZSwgc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMpOwogICAgICAgICAgfQogICAgICAgICAgc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMoKTsKICAgICAgICB9LCB0aGlzLnNlZ21lbnRhdGlvblN0YXRlcykpOwogICAgICAgIHRoaXMucmVnaXN0ZXJEaXNwb3Nlcih0aGlzLmNodW5rTWFuYWdlci5yZWNvbXB1dGVDaHVua1ByaW9yaXRpZXMuYWRkKCgpID0+IHRoaXMucmVjb21wdXRlQ2h1bmtQcmlvcml0aWVzKCkpKTsKICAgICAgfQogICAgICByZWNvbXB1dGVDaHVua1ByaW9yaXRpZXMoKSB7CiAgICAgICAgY29uc3QgdmlzaWJpbGl0eSA9IHRoaXMudmlzaWJpbGl0eS52YWx1ZTsKICAgICAgICBpZiAodmlzaWJpbGl0eSA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsgc2VnbWVudGF0aW9uU3RhdGVzOiB7IHZhbHVlOiBzdGF0ZXMgfSwgc291cmNlOiB7IHNlZ21lbnRGaWx0ZXJlZFNvdXJjZXMgfSB9ID0gdGhpczsKICAgICAgICBpZiAoc3RhdGVzID09PSB2b2lkIDApCiAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3QgeyBjaHVua01hbmFnZXIgfSA9IHRoaXM7CiAgICAgICAgY2h1bmtNYW5hZ2VyLnJlZ2lzdGVyTGF5ZXIodGhpcyk7CiAgICAgICAgY29uc3QgbnVtUmVsYXRpb25zaGlwcyA9IHN0YXRlcy5sZW5ndGg7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1SZWxhdGlvbnNoaXBzOyArK2kpIHsKICAgICAgICAgIGNvbnN0IHN0YXRlID0gc3RhdGVzW2ldOwogICAgICAgICAgaWYgKHN0YXRlID09IG51bGwpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBwcmlvcml0eVRpZXIgPSBnZXRQcmlvcml0eVRpZXIodmlzaWJpbGl0eSk7CiAgICAgICAgICBjb25zdCBiYXNlUHJpb3JpdHkgPSBnZXRCYXNlUHJpb3JpdHkodmlzaWJpbGl0eSk7CiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzZWdtZW50RmlsdGVyZWRTb3VyY2VzW2ldOwogICAgICAgICAgZm9yRWFjaFZpc2libGVTZWdtZW50KHN0YXRlLCAob2JqZWN0SWQpID0+IHsKICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBzb3VyY2UuZ2V0Q2h1bmsob2JqZWN0SWQpOwogICAgICAgICAgICArK3RoaXMubnVtVmlzaWJsZUNodW5rc05lZWRlZDsKICAgICAgICAgICAgaWYgKGNodW5rLnN0YXRlID09PSBDaHVua1N0YXRlLkdQVV9NRU1PUlkpIHsKICAgICAgICAgICAgICArK3RoaXMubnVtVmlzaWJsZUNodW5rc0F2YWlsYWJsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaHVua01hbmFnZXIucmVxdWVzdENodW5rKGNodW5rLCBwcmlvcml0eVRpZXIsIGJhc2VQcmlvcml0eSArIEFOTk9UQVRJT05fU0VHTUVOVF9GSUxURVJFRF9DSFVOS19QUklPUklUWSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0U2VnbWVudGF0aW9uU3RhdGUobXNnKSB7CiAgICAgICAgaWYgKG1zZyA9PT0gdm9pZCAwKQogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICByZXR1cm4gbXNnLm1hcCgoeCkgPT4gewogICAgICAgICAgaWYgKHggPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZWNlaXZlVmlzaWJsZVNlZ21lbnRzU3RhdGUodGhpcy5ycGMsIHgpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgQW5ub3RhdGlvbkxheWVyU2hhcmVkT2JqZWN0Q291bnRlcnBhcnQgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdChBTk5PVEFUSU9OX1JFTkRFUl9MQVlFUl9SUENfSUQpCiAgICBdLCBBbm5vdGF0aW9uTGF5ZXJTaGFyZWRPYmplY3RDb3VudGVycGFydCk7CiAgICByZWdpc3RlclJQQyhBTk5PVEFUSU9OX1JFTkRFUl9MQVlFUl9VUERBVEVfU0VHTUVOVEFUSU9OX1JQQ19JRCwgZnVuY3Rpb24oeCkgewogICAgICBjb25zdCBvYmogPSB0aGlzLmdldCh4LmlkKTsKICAgICAgb2JqLnNlZ21lbnRhdGlvblN0YXRlcy52YWx1ZSA9IG9iai5nZXRTZWdtZW50YXRpb25TdGF0ZSh4LnNlZ21lbnRhdGlvblN0YXRlcyk7CiAgICB9KTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2NyZWRlbnRpYWxzX3Byb3ZpZGVyL2luZGV4LnRzCiAgICBmdW5jdGlvbiBtYWtlQ2FjaGVkQ3JlZGVudGlhbHNHZXR0ZXIoZ2V0VW5jYWNoZWQpIHsKICAgICAgbGV0IGNhY2hlZENyZWRlbnRpYWxzOwogICAgICBsZXQgcGVuZGluZ0NyZWRlbnRpYWxzOwogICAgICBsZXQgcGVuZGluZ0NhbmNlbGxhdGlvblRva2VuOwogICAgICByZXR1cm4gKGludmFsaWRDcmVkZW50aWFscywgY2FuY2VsbGF0aW9uVG9rZW4pID0+IHsKICAgICAgICBpZiAocGVuZGluZ0NyZWRlbnRpYWxzICE9PSB2b2lkIDAgJiYgKGNhY2hlZENyZWRlbnRpYWxzID09PSB2b2lkIDAgfHwgaW52YWxpZENyZWRlbnRpYWxzID09PSB2b2lkIDAgfHwgY2FjaGVkQ3JlZGVudGlhbHMuZ2VuZXJhdGlvbiAhPT0gaW52YWxpZENyZWRlbnRpYWxzLmdlbmVyYXRpb24pKSB7CiAgICAgICAgICBpZiAoY2FjaGVkQ3JlZGVudGlhbHMgPT09IHZvaWQgMCkgewogICAgICAgICAgICBwZW5kaW5nQ2FuY2VsbGF0aW9uVG9rZW4uYWRkQ29uc3VtZXIoY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHBlbmRpbmdDcmVkZW50aWFsczsKICAgICAgICB9CiAgICAgICAgY2FjaGVkQ3JlZGVudGlhbHMgPSB2b2lkIDA7CiAgICAgICAgcGVuZGluZ0NhbmNlbGxhdGlvblRva2VuID0gbmV3IE11bHRpcGxlQ29uc3VtZXJDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSgpOwogICAgICAgIHBlbmRpbmdDcmVkZW50aWFscyA9IGdldFVuY2FjaGVkKGludmFsaWRDcmVkZW50aWFscywgcGVuZGluZ0NhbmNlbGxhdGlvblRva2VuKS50aGVuKChjcmVkZW50aWFscykgPT4gewogICAgICAgICAgY2FjaGVkQ3JlZGVudGlhbHMgPSBjcmVkZW50aWFsczsKICAgICAgICAgIHBlbmRpbmdDYW5jZWxsYXRpb25Ub2tlbiA9IHZvaWQgMDsKICAgICAgICAgIHJldHVybiBjcmVkZW50aWFsczsKICAgICAgICB9LCAocmVhc29uKSA9PiB7CiAgICAgICAgICBpZiAocGVuZGluZ0NhbmNlbGxhdGlvblRva2VuLmlzQ2FuY2VsZWQpIHsKICAgICAgICAgICAgcGVuZGluZ0NhbmNlbGxhdGlvblRva2VuID0gdm9pZCAwOwogICAgICAgICAgICBwZW5kaW5nQ3JlZGVudGlhbHMgPSB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHBlbmRpbmdDcmVkZW50aWFsczsKICAgICAgfTsKICAgIH0KCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2NyZWRlbnRpYWxzX3Byb3ZpZGVyL3NoYXJlZF9jb21tb24udHMKICAgIHZhciBDUkVERU5USUFMU19QUk9WSURFUl9SUENfSUQgPSAiQ3JlZGVudGlhbHNQcm92aWRlciI7CiAgICB2YXIgQ1JFREVOVElBTFNfUFJPVklERVJfR0VUX1JQQ19JRCA9ICJDcmVkZW50aWFsc1Byb3ZpZGVyLmdldCI7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9jcmVkZW50aWFsc19wcm92aWRlci9zaGFyZWRfY291bnRlcnBhcnQudHMKICAgIHZhciBTaGFyZWRDcmVkZW50aWFsc1Byb3ZpZGVyQ291bnRlcnBhcnQgPSBjbGFzcyBleHRlbmRzIFNoYXJlZE9iamVjdENvdW50ZXJwYXJ0IHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICB0aGlzLmdldCA9IG1ha2VDYWNoZWRDcmVkZW50aWFsc0dldHRlcigoaW52YWxpZENyZWRlbnRpYWxzLCBjYW5jZWxsYXRpb25Ub2tlbikgPT4gdGhpcy5ycGMucHJvbWlzZUludm9rZShDUkVERU5USUFMU19QUk9WSURFUl9HRVRfUlBDX0lELCB7IHByb3ZpZGVySWQ6IHRoaXMucnBjSWQsIGludmFsaWRDcmVkZW50aWFscyB9LCBjYW5jZWxsYXRpb25Ub2tlbikpOwogICAgICB9CiAgICB9OwogICAgU2hhcmVkQ3JlZGVudGlhbHNQcm92aWRlckNvdW50ZXJwYXJ0ID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoQ1JFREVOVElBTFNfUFJPVklERVJfUlBDX0lEKQogICAgXSwgU2hhcmVkQ3JlZGVudGlhbHNQcm92aWRlckNvdW50ZXJwYXJ0KTsKICAgIGZ1bmN0aW9uIFdpdGhTaGFyZWRDcmVkZW50aWFsc1Byb3ZpZGVyQ291bnRlcnBhcnQoKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihCYXNlKSB7CiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7CiAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpOwogICAgICAgICAgICBjb25zdCBvcHRpb25zID0gYXJnc1sxXTsKICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyID0gdGhpcy5ycGMuZ2V0T3B0aW9uYWxSZWYob3B0aW9uc1siY3JlZGVudGlhbHNQcm92aWRlciJdKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9OwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdXRpbC9odHRwX3JlcXVlc3QudHMKICAgIHZhciBIdHRwRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHsKICAgICAgY29uc3RydWN0b3IodXJsLCBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlKSB7CiAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRmV0Y2hpbmcgJHtKU09OLnN0cmluZ2lmeSh1cmwpfSByZXN1bHRlZCBpbiBIVFRQIGVycm9yICR7c3RhdHVzfWA7CiAgICAgICAgaWYgKHN0YXR1c1RleHQpIHsKICAgICAgICAgIG1lc3NhZ2UgKz0gYDogJHtzdGF0dXNUZXh0fWA7CiAgICAgICAgfQogICAgICAgIG1lc3NhZ2UgKz0gIi4iOwogICAgICAgIHN1cGVyKG1lc3NhZ2UpOwogICAgICAgIHRoaXMubmFtZSA9ICJIdHRwRXJyb3IiOwogICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CiAgICAgICAgdGhpcy51cmwgPSB1cmw7CiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgdGhpcy5zdGF0dXNUZXh0ID0gc3RhdHVzVGV4dDsKICAgICAgICBpZiAocmVzcG9uc2UpIHsKICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGljIGZyb21SZXNwb25zZShyZXNwb25zZSkgewogICAgICAgIHJldHVybiBuZXcgSHR0cEVycm9yKHJlc3BvbnNlLnVybCwgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5zdGF0dXNUZXh0LCByZXNwb25zZSk7CiAgICAgIH0KICAgICAgc3RhdGljIGZyb21SZXF1ZXN0RXJyb3IoaW5wdXQsIGVycm9yKSB7CiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yKSB7CiAgICAgICAgICBsZXQgdXJsOwogICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgdXJsID0gaW5wdXQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1cmwgPSBpbnB1dC51cmw7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbmV3IEh0dHBFcnJvcih1cmwsIDAsICJOZXR3b3JrIG9yIENPUlMgZXJyb3IiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGVycm9yOwogICAgICB9CiAgICB9OwogICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hPayhpbnB1dCwgaW5pdCkgewogICAgICBsZXQgcmVzcG9uc2U7CiAgICAgIHRyeSB7CiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChpbnB1dCwgaW5pdCk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgdGhyb3cgSHR0cEVycm9yLmZyb21SZXF1ZXN0RXJyb3IoaW5wdXQsIGVycm9yKTsKICAgICAgfQogICAgICBpZiAoIXJlc3BvbnNlLm9rKQogICAgICAgIHRocm93IEh0dHBFcnJvci5mcm9tUmVzcG9uc2UocmVzcG9uc2UpOwogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9CiAgICBmdW5jdGlvbiByZXNwb25zZUFycmF5QnVmZmVyKHJlc3BvbnNlKSB7CiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpOwogICAgfQogICAgZnVuY3Rpb24gcmVzcG9uc2VKc29uKHJlc3BvbnNlKSB7CiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBjYW5jZWxsYWJsZUZldGNoT2soaW5wdXQsIGluaXQsIHRyYW5zZm9ybVJlc3BvbnNlLCBjYW5jZWxsYXRpb25Ub2tlbiA9IHVuY2FuY2VsYWJsZVRva2VuKSB7CiAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiA9PT0gdW5jYW5jZWxhYmxlVG9rZW4pIHsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoT2soaW5wdXQsIGluaXQpOwogICAgICAgIHJldHVybiBhd2FpdCB0cmFuc2Zvcm1SZXNwb25zZShyZXNwb25zZSk7CiAgICAgIH0KICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwogICAgICBjb25zdCB1bnJlZ2lzdGVyQ2FuY2VsbGF0aW9uID0gY2FuY2VsbGF0aW9uVG9rZW4uYWRkKCgpID0+IGFib3J0Q29udHJvbGxlci5hYm9ydCgpKTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoT2soaW5wdXQsIHsgLi4uaW5pdCwgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsIH0pOwogICAgICAgIHJldHVybiBhd2FpdCB0cmFuc2Zvcm1SZXNwb25zZShyZXNwb25zZSk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdW5yZWdpc3RlckNhbmNlbGxhdGlvbigpOwogICAgICB9CiAgICB9CiAgICB2YXIgdGVtcFVpbnQ2NDIgPSBuZXcgVWludDY0KCk7CiAgICBmdW5jdGlvbiBnZXRCeXRlUmFuZ2VIZWFkZXIoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCkgewogICAgICBsZXQgZW5kT2Zmc2V0U3RyOwogICAgICBpZiAodHlwZW9mIGVuZE9mZnNldCA9PT0gIm51bWJlciIpIHsKICAgICAgICBlbmRPZmZzZXRTdHIgPSBgJHtlbmRPZmZzZXQgLSAxfWA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgVWludDY0LmRlY3JlbWVudCh0ZW1wVWludDY0MiwgZW5kT2Zmc2V0KTsKICAgICAgICBlbmRPZmZzZXRTdHIgPSB0ZW1wVWludDY0Mi50b1N0cmluZygpOwogICAgICB9CiAgICAgIHJldHVybiB7ICJSYW5nZSI6IGBieXRlcz0ke3N0YXJ0T2Zmc2V0fS0ke2VuZE9mZnNldFN0cn1gIH07CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZVVybCh1cmwpIHsKICAgICAgY29uc3QgdXJsUHJvdG9jb2xQYXR0ZXJuID0gL14oW146XC9dKyk6XC9cLyhbXlwvXSspKCg/OlwvLiopPykkLzsKICAgICAgbGV0IG1hdGNoID0gdXJsLm1hdGNoKHVybFByb3RvY29sUGF0dGVybik7CiAgICAgIGlmIChtYXRjaCA9PT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBVUkw6ICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gKTsKICAgICAgfQogICAgICByZXR1cm4geyBwcm90b2NvbDogbWF0Y2hbMV0sIGhvc3Q6IG1hdGNoWzJdLCBwYXRoOiBtYXRjaFszXSB9OwogICAgfQogICAgZnVuY3Rpb24gaXNOb3RGb3VuZEVycm9yKGUpIHsKICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIEh0dHBFcnJvcikpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gZS5zdGF0dXMgPT09IDAgfHwgZS5zdGF0dXMgPT09IDQwMyB8fCBlLnN0YXR1cyA9PT0gNDA0OwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvY3JlZGVudGlhbHNfcHJvdmlkZXIvaHR0cF9yZXF1ZXN0LnRzCiAgICB2YXIgbWF4QXR0ZW1wdHMgPSAzMjsKICAgIHZhciBtYXhDcmVkZW50aWFsc0F0dGVtcHRzID0gMzsKICAgIHZhciBtaW5EZWxheU1pbGxpc2Vjb25kcyA9IDUwMDsKICAgIHZhciBtYXhEZWxheU1pbGxpc2Vjb25kcyA9IDFlNDsKICAgIGZ1bmN0aW9uIHBpY2tEZWxheShhdHRlbXB0TnVtYmVyKSB7CiAgICAgIHJldHVybiBNYXRoLm1pbigyICoqIGF0dGVtcHROdW1iZXIgKiBtaW5EZWxheU1pbGxpc2Vjb25kcywgbWF4RGVsYXlNaWxsaXNlY29uZHMgLyAyKSAqICgxICsgTWF0aC5yYW5kb20oKSk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaFdpdGhDcmVkZW50aWFscyhjcmVkZW50aWFsc1Byb3ZpZGVyLCBpbnB1dCwgaW5pdCwgdHJhbnNmb3JtUmVzcG9uc2UsIGFwcGx5Q3JlZGVudGlhbHMyLCBlcnJvckhhbmRsZXIsIGNhbmNlbGxhdGlvblRva2VuID0gdW5jYW5jZWxhYmxlVG9rZW4pIHsKICAgICAgbGV0IGNyZWRlbnRpYWxzOwogICAgICBjcmVkZW50aWFsc0xvb3A6CiAgICAgICAgZm9yIChsZXQgY3JlZGVudGlhbHNBdHRlbXB0ID0gMDsgOyApIHsKICAgICAgICAgIHRocm93SWZDYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgICBpZiAoY3JlZGVudGlhbHNBdHRlbXB0ID4gMSkgewogICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBwaWNrRGVsYXkoY3JlZGVudGlhbHNBdHRlbXB0IC0gMikpKTsKICAgICAgICAgIH0KICAgICAgICAgIGNyZWRlbnRpYWxzID0gYXdhaXQgY3JlZGVudGlhbHNQcm92aWRlci5nZXQoY3JlZGVudGlhbHMsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgICAgIHJlcXVlc3RMb29wOgogICAgICAgICAgICBmb3IgKGxldCByZXF1ZXN0QXR0ZW1wdCA9IDA7IDsgKSB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjYW5jZWxsYWJsZUZldGNoT2sodHlwZW9mIGlucHV0ID09PSAiZnVuY3Rpb24iID8gaW5wdXQoY3JlZGVudGlhbHMuY3JlZGVudGlhbHMpIDogaW5wdXQsIGFwcGx5Q3JlZGVudGlhbHMyKGNyZWRlbnRpYWxzLmNyZWRlbnRpYWxzLCBpbml0KSwgdHJhbnNmb3JtUmVzcG9uc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yKSB7CiAgICAgICAgICAgICAgICAgIGlmIChlcnJvckhhbmRsZXIoZXJyb3IsIGNyZWRlbnRpYWxzLmNyZWRlbnRpYWxzKSA9PT0gInJlZnJlc2giKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCsrY3JlZGVudGlhbHNBdHRlbXB0ID09PSBtYXhDcmVkZW50aWFsc0F0dGVtcHRzKQogICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgY29udGludWUgY3JlZGVudGlhbHNMb29wOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmICgrK3JlcXVlc3RBdHRlbXB0ID09PSBtYXhBdHRlbXB0cykKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgcGlja0RlbGF5KHJlcXVlc3RBdHRlbXB0IC0gMSkpKTsKICAgICAgICAgICAgICAgICAgY29udGludWUgcmVxdWVzdExvb3A7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9jcmVkZW50aWFsc19wcm92aWRlci9vYXV0aDIudHMKICAgIGZ1bmN0aW9uIGZldGNoV2l0aE9BdXRoMkNyZWRlbnRpYWxzKGNyZWRlbnRpYWxzUHJvdmlkZXIsIGlucHV0LCBpbml0LCB0cmFuc2Zvcm1SZXNwb25zZSwgY2FuY2VsbGF0aW9uVG9rZW4gPSB1bmNhbmNlbGFibGVUb2tlbikgewogICAgICBpZiAoY3JlZGVudGlhbHNQcm92aWRlciA9PT0gdm9pZCAwKSB7CiAgICAgICAgcmV0dXJuIGNhbmNlbGxhYmxlRmV0Y2hPayhpbnB1dCwgaW5pdCwgdHJhbnNmb3JtUmVzcG9uc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgfQogICAgICByZXR1cm4gZmV0Y2hXaXRoQ3JlZGVudGlhbHMoY3JlZGVudGlhbHNQcm92aWRlciwgaW5wdXQsIGluaXQsIHRyYW5zZm9ybVJlc3BvbnNlLCAoY3JlZGVudGlhbHMsIGluaXQyKSA9PiB7CiAgICAgICAgaWYgKCFjcmVkZW50aWFscy5hY2Nlc3NUb2tlbikKICAgICAgICAgIHJldHVybiBpbml0MjsKICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5pdDIuaGVhZGVycyk7CiAgICAgICAgaGVhZGVycy5zZXQoIkF1dGhvcml6YXRpb24iLCBgJHtjcmVkZW50aWFscy50b2tlblR5cGV9ICR7Y3JlZGVudGlhbHMuYWNjZXNzVG9rZW59YCk7CiAgICAgICAgcmV0dXJuIHsgLi4uaW5pdDIsIGhlYWRlcnMgfTsKICAgICAgfSwgKGVycm9yLCBjcmVkZW50aWFscykgPT4gewogICAgICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBlcnJvcjsKICAgICAgICBpZiAoc3RhdHVzID09PSA0MDEpIHsKICAgICAgICAgIHJldHVybiAicmVmcmVzaCI7CiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwNCB8fCBzdGF0dXMgPT09IDUwMykgewogICAgICAgICAgcmV0dXJuICJyZXRyeSI7CiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMyAmJiAhY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4pIHsKICAgICAgICAgIHJldHVybiAicmVmcmVzaCI7CiAgICAgICAgfQogICAgICAgIHRocm93IGVycm9yOwogICAgICB9LCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9kYXRhc291cmNlL2JyYWlubWFwcy9hcGkudHMKICAgIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0KGluc3RhbmNlLCBjcmVkZW50aWFsc1Byb3ZpZGVyLCBodHRwQ2FsbCwgY2FuY2VsbGF0aW9uVG9rZW4gPSB1bmNhbmNlbGFibGVUb2tlbikgewogICAgICByZXR1cm4gZmV0Y2hXaXRoT0F1dGgyQ3JlZGVudGlhbHMoY3JlZGVudGlhbHNQcm92aWRlciwgYCR7aW5zdGFuY2Uuc2VydmVyVXJsfSR7aHR0cENhbGwucGF0aH1gLCB7IG1ldGhvZDogaHR0cENhbGwubWV0aG9kLCBib2R5OiBodHRwQ2FsbC5wYXlsb2FkIH0sIGh0dHBDYWxsLnJlc3BvbnNlVHlwZSA9PT0gImpzb24iID8gcmVzcG9uc2VKc29uIDogcmVzcG9uc2VBcnJheUJ1ZmZlciwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvZGF0YXNvdXJjZS9icmFpbm1hcHMvYmFzZS50cwogICAgdmFyIFZvbHVtZUNodW5rRW5jb2Rpbmc7CiAgICAoZnVuY3Rpb24oVm9sdW1lQ2h1bmtFbmNvZGluZzYpIHsKICAgICAgVm9sdW1lQ2h1bmtFbmNvZGluZzZbVm9sdW1lQ2h1bmtFbmNvZGluZzZbIlJBVyJdID0gMF0gPSAiUkFXIjsKICAgICAgVm9sdW1lQ2h1bmtFbmNvZGluZzZbVm9sdW1lQ2h1bmtFbmNvZGluZzZbIkpQRUciXSA9IDFdID0gIkpQRUciOwogICAgICBWb2x1bWVDaHVua0VuY29kaW5nNltWb2x1bWVDaHVua0VuY29kaW5nNlsiQ09NUFJFU1NFRF9TRUdNRU5UQVRJT04iXSA9IDJdID0gIkNPTVBSRVNTRURfU0VHTUVOVEFUSU9OIjsKICAgIH0pKFZvbHVtZUNodW5rRW5jb2RpbmcgfHwgKFZvbHVtZUNodW5rRW5jb2RpbmcgPSB7fSkpOwogICAgdmFyIFZvbHVtZVNvdXJjZVBhcmFtZXRlcnMgPSBjbGFzcyB7CiAgICB9OwogICAgVm9sdW1lU291cmNlUGFyYW1ldGVycy5SUENfSUQgPSAiYnJhaW5tYXBzL1ZvbHVtZUNodW5rU291cmNlIjsKICAgIHZhciBNdWx0aXNjYWxlTWVzaFNvdXJjZVBhcmFtZXRlcnMgPSBjbGFzcyB7CiAgICB9OwogICAgTXVsdGlzY2FsZU1lc2hTb3VyY2VQYXJhbWV0ZXJzLlJQQ19JRCA9ICJicmFpbm1hcHMvTXVsdGlzY2FsZU1lc2hTb3VyY2UiOwogICAgdmFyIE1lc2hTb3VyY2VQYXJhbWV0ZXJzID0gY2xhc3MgewogICAgfTsKICAgIE1lc2hTb3VyY2VQYXJhbWV0ZXJzLlJQQ19JRCA9ICJicmFpbm1hcHMvTWVzaFNvdXJjZSI7CiAgICB2YXIgU2tlbGV0b25Tb3VyY2VQYXJhbWV0ZXJzID0gY2xhc3MgewogICAgfTsKICAgIFNrZWxldG9uU291cmNlUGFyYW1ldGVycy5SUENfSUQgPSAiYnJhaW5tYXBzL1NrZWxldG9uU291cmNlIjsKICAgIHZhciBBbm5vdGF0aW9uU291cmNlUGFyYW1ldGVycyA9IGNsYXNzIHsKICAgIH07CiAgICBBbm5vdGF0aW9uU291cmNlUGFyYW1ldGVycy5SUENfSUQgPSAiYnJhaW5tYXBzL0Fubm90YXRpb24iOwogICAgdmFyIEFubm90YXRpb25TcGF0aWFsSW5kZXhTb3VyY2VQYXJhbWV0ZXJzID0gY2xhc3MgewogICAgfTsKICAgIEFubm90YXRpb25TcGF0aWFsSW5kZXhTb3VyY2VQYXJhbWV0ZXJzLlJQQ19JRCA9ICJicmFpbm1hcHMvQW5ub3RhdGlvblNwYXRpYWxJbmRleCI7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9tZXNoL2Jhc2UudHMKICAgIHZhciBNRVNIX0xBWUVSX1JQQ19JRCA9ICJtZXNoL01lc2hMYXllciI7CiAgICB2YXIgTVVMVElTQ0FMRV9NRVNIX0xBWUVSX1JQQ19JRCA9ICJtZXNoL011bHRpc2NhbGVNZXNoTGF5ZXIiOwogICAgdmFyIEZSQUdNRU5UX1NPVVJDRV9SUENfSUQgPSAibWVzaC9GcmFnbWVudFNvdXJjZSI7CiAgICB2YXIgTVVMVElTQ0FMRV9GUkFHTUVOVF9TT1VSQ0VfUlBDX0lEID0gIm1lc2gvTXVsdGlzY2FsZUZyYWdtZW50U291cmNlIjsKICAgIHZhciBWZXJ0ZXhQb3NpdGlvbkZvcm1hdDsKICAgIChmdW5jdGlvbihWZXJ0ZXhQb3NpdGlvbkZvcm1hdDIpIHsKICAgICAgVmVydGV4UG9zaXRpb25Gb3JtYXQyW1ZlcnRleFBvc2l0aW9uRm9ybWF0MlsiZmxvYXQzMiJdID0gMF0gPSAiZmxvYXQzMiI7CiAgICAgIFZlcnRleFBvc2l0aW9uRm9ybWF0MltWZXJ0ZXhQb3NpdGlvbkZvcm1hdDJbInVpbnQxMCJdID0gMV0gPSAidWludDEwIjsKICAgICAgVmVydGV4UG9zaXRpb25Gb3JtYXQyW1ZlcnRleFBvc2l0aW9uRm9ybWF0MlsidWludDE2Il0gPSAyXSA9ICJ1aW50MTYiOwogICAgfSkoVmVydGV4UG9zaXRpb25Gb3JtYXQgfHwgKFZlcnRleFBvc2l0aW9uRm9ybWF0ID0ge30pKTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3V0aWwvem9yZGVyLnRzCiAgICBmdW5jdGlvbiBnZXRPY3RyZWVDaGlsZEluZGV4KHgsIHksIHopIHsKICAgICAgcmV0dXJuIHggJiAxIHwgeSA8PCAxICYgMiB8IHogPDwgMiAmIDQ7CiAgICB9CiAgICBmdW5jdGlvbiBkZWNvZGVaSW5kZXhDb21wcmVzc2VkKHppbmRleCwgeEJpdHMsIHlCaXRzLCB6Qml0cykgewogICAgICBjb25zdCBtYXhDb29yZEJpdHMgPSBNYXRoLm1heCh4Qml0cywgeUJpdHMsIHpCaXRzKTsKICAgICAgbGV0IGlucHV0Qml0ID0gMDsKICAgICAgbGV0IGlucHV0VmFsdWUgPSB6aW5kZXgubG93OwogICAgICBsZXQgeCA9IDAsIHkgPSAwLCB6ID0gMDsKICAgICAgZm9yIChsZXQgY29vcmRCaXQgPSAwOyBjb29yZEJpdCA8IG1heENvb3JkQml0czsgKytjb29yZEJpdCkgewogICAgICAgIGlmIChjb29yZEJpdCA8IHhCaXRzKSB7CiAgICAgICAgICBjb25zdCBiaXQgPSBpbnB1dFZhbHVlID4+PiBpbnB1dEJpdCAmIDE7CiAgICAgICAgICB4IHw9IGJpdCA8PCBjb29yZEJpdDsKICAgICAgICAgIGlmIChpbnB1dEJpdCA9PT0gMzEpIHsKICAgICAgICAgICAgaW5wdXRCaXQgPSAwOwogICAgICAgICAgICBpbnB1dFZhbHVlID0gemluZGV4LmhpZ2g7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICArK2lucHV0Qml0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY29vcmRCaXQgPCB5Qml0cykgewogICAgICAgICAgY29uc3QgYml0ID0gaW5wdXRWYWx1ZSA+Pj4gaW5wdXRCaXQgJiAxOwogICAgICAgICAgeSB8PSBiaXQgPDwgY29vcmRCaXQ7CiAgICAgICAgICBpZiAoaW5wdXRCaXQgPT09IDMxKSB7CiAgICAgICAgICAgIGlucHV0Qml0ID0gMDsKICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IHppbmRleC5oaWdoOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgKytpbnB1dEJpdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGNvb3JkQml0IDwgekJpdHMpIHsKICAgICAgICAgIGNvbnN0IGJpdCA9IGlucHV0VmFsdWUgPj4+IGlucHV0Qml0ICYgMTsKICAgICAgICAgIHogfD0gYml0IDw8IGNvb3JkQml0OwogICAgICAgICAgaWYgKGlucHV0Qml0ID09PSAzMSkgewogICAgICAgICAgICBpbnB1dEJpdCA9IDA7CiAgICAgICAgICAgIGlucHV0VmFsdWUgPSB6aW5kZXguaGlnaDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICsraW5wdXRCaXQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBVaW50MzJBcnJheS5vZih4LCB5LCB6KTsKICAgIH0KICAgIGZ1bmN0aW9uIGVuY29kZVpJbmRleENvbXByZXNzZWQzZCh6aW5kZXgsIHhCaXRzLCB5Qml0cywgekJpdHMsIHgsIHksIHopIHsKICAgICAgY29uc3QgbWF4Qml0cyA9IE1hdGgubWF4KHhCaXRzLCB5Qml0cywgekJpdHMpOwogICAgICBsZXQgb3V0cHV0Qml0ID0gMDsKICAgICAgbGV0IG91dHB1dE51bSA9IDA7CiAgICAgIGxldCBpc0hpZ2ggPSBmYWxzZTsKICAgICAgZnVuY3Rpb24gd3JpdGVCaXQoYikgewogICAgICAgIG91dHB1dE51bSB8PSAoYiAmIDEpIDw8IG91dHB1dEJpdDsKICAgICAgICBpZiAoKytvdXRwdXRCaXQgPT09IDMyKSB7CiAgICAgICAgICB6aW5kZXgubG93ID0gb3V0cHV0TnVtID4+PiAwOwogICAgICAgICAgb3V0cHV0TnVtID0gMDsKICAgICAgICAgIG91dHB1dEJpdCA9IDA7CiAgICAgICAgICBpc0hpZ2ggPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGxldCBiaXQgPSAwOyBiaXQgPCBtYXhCaXRzOyArK2JpdCkgewogICAgICAgIGlmIChiaXQgPCB4Qml0cykgewogICAgICAgICAgd3JpdGVCaXQoeCA+PiBiaXQgJiAxKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJpdCA8IHlCaXRzKSB7CiAgICAgICAgICB3cml0ZUJpdCh5ID4+IGJpdCAmIDEpOwogICAgICAgIH0KICAgICAgICBpZiAoYml0IDwgekJpdHMpIHsKICAgICAgICAgIHdyaXRlQml0KHogPj4gYml0ICYgMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0hpZ2gpIHsKICAgICAgICB6aW5kZXguaGlnaCA9IG91dHB1dE51bSA+Pj4gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICB6aW5kZXguaGlnaCA9IDA7CiAgICAgICAgemluZGV4LmxvdyA9IG91dHB1dE51bSA+Pj4gMDsKICAgICAgfQogICAgICByZXR1cm4gemluZGV4OwogICAgfQogICAgZnVuY3Rpb24gZW5jb2RlWkluZGV4Q29tcHJlc3NlZCh6aW5kZXgsIHBvc2l0aW9uLCBzaGFwZSkgewogICAgICBsZXQgb3V0cHV0Qml0ID0gMDsKICAgICAgY29uc3QgcmFuayA9IHBvc2l0aW9uLmxlbmd0aDsKICAgICAgbGV0IG91dHB1dE51bSA9IDA7CiAgICAgIGxldCBpc0hpZ2ggPSBmYWxzZTsKICAgICAgZnVuY3Rpb24gd3JpdGVCaXQoYikgewogICAgICAgIG91dHB1dE51bSB8PSAoYiAmIDEpIDw8IG91dHB1dEJpdDsKICAgICAgICBpZiAoKytvdXRwdXRCaXQgPT09IDMyKSB7CiAgICAgICAgICB6aW5kZXgubG93ID0gb3V0cHV0TnVtID4+PiAwOwogICAgICAgICAgb3V0cHV0TnVtID0gMDsKICAgICAgICAgIG91dHB1dEJpdCA9IDA7CiAgICAgICAgICBpc0hpZ2ggPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGxldCBiaXQgPSAwOyBiaXQgPCAzMjsgKytiaXQpIHsKICAgICAgICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCByYW5rOyArK2RpbSkgewogICAgICAgICAgaWYgKHNoYXBlW2RpbV0gLSAxID4+PiBiaXQpIHsKICAgICAgICAgICAgd3JpdGVCaXQocG9zaXRpb25bZGltXSA+Pj4gYml0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzSGlnaCkgewogICAgICAgIHppbmRleC5oaWdoID0gb3V0cHV0TnVtID4+PiAwOwogICAgICB9IGVsc2UgewogICAgICAgIHppbmRleC5oaWdoID0gMDsKICAgICAgICB6aW5kZXgubG93ID0gb3V0cHV0TnVtID4+PiAwOwogICAgICB9CiAgICAgIHJldHVybiB6aW5kZXg7CiAgICB9CiAgICBmdW5jdGlvbiBsZXNzTXNiKGEsIGIpIHsKICAgICAgcmV0dXJuIGEgPCBiICYmIGEgPCAoYSBeIGIpOwogICAgfQogICAgZnVuY3Rpb24gem9yZGVyM0xlc3NUaGFuKHgwLCB5MCwgejAsIHgxLCB5MSwgejEpIHsKICAgICAgbGV0IG1vc3RTaWduaWZpY2FudDAgPSB6MCwgbW9zdFNpZ25pZmljYW50MSA9IHoxOwogICAgICBpZiAobGVzc01zYihtb3N0U2lnbmlmaWNhbnQwIF4gbW9zdFNpZ25pZmljYW50MSwgeTAgXiB5MSkpIHsKICAgICAgICBtb3N0U2lnbmlmaWNhbnQwID0geTA7CiAgICAgICAgbW9zdFNpZ25pZmljYW50MSA9IHkxOwogICAgICB9CiAgICAgIGlmIChsZXNzTXNiKG1vc3RTaWduaWZpY2FudDAgXiBtb3N0U2lnbmlmaWNhbnQxLCB4MCBeIHgxKSkgewogICAgICAgIG1vc3RTaWduaWZpY2FudDAgPSB4MDsKICAgICAgICBtb3N0U2lnbmlmaWNhbnQxID0geDE7CiAgICAgIH0KICAgICAgcmV0dXJuIG1vc3RTaWduaWZpY2FudDAgPCBtb3N0U2lnbmlmaWNhbnQxOwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvbWVzaC9tdWx0aXNjYWxlLnRzCiAgICBmdW5jdGlvbiBnZXREZXNpcmVkTXVsdGlzY2FsZU1lc2hDaHVua3MobWFuaWZlc3QsIG1vZGVsVmlld1Byb2plY3Rpb24sIGNsaXBwaW5nUGxhbmVzLCBkZXRhaWxDdXRvZmYsIHZpZXdwb3J0V2lkdGgsIHZpZXdwb3J0SGVpZ2h0LCBjYWxsYmFjaykgewogICAgICBjb25zdCB7IG9jdHJlZSwgbG9kU2NhbGVzLCBjaHVua0dyaWRTcGF0aWFsT3JpZ2luLCBjaHVua1NoYXBlIH0gPSBtYW5pZmVzdDsKICAgICAgY29uc3QgbWF4TG9kID0gbG9kU2NhbGVzLmxlbmd0aCAtIDE7CiAgICAgIGNvbnN0IG0wMCA9IG1vZGVsVmlld1Byb2plY3Rpb25bMF0sIG0wMSA9IG1vZGVsVmlld1Byb2plY3Rpb25bNF0sIG0wMiA9IG1vZGVsVmlld1Byb2plY3Rpb25bOF0sIG0xMCA9IG1vZGVsVmlld1Byb2plY3Rpb25bMV0sIG0xMSA9IG1vZGVsVmlld1Byb2plY3Rpb25bNV0sIG0xMiA9IG1vZGVsVmlld1Byb2plY3Rpb25bOV0sIG0zMCA9IG1vZGVsVmlld1Byb2plY3Rpb25bM10sIG0zMSA9IG1vZGVsVmlld1Byb2plY3Rpb25bN10sIG0zMiA9IG1vZGVsVmlld1Byb2plY3Rpb25bMTFdLCBtMzMgPSBtb2RlbFZpZXdQcm9qZWN0aW9uWzE1XTsKICAgICAgY29uc3QgbWluV1hjb2VmZiA9IG0zMCA+IDAgPyAwIDogMTsKICAgICAgY29uc3QgbWluV1ljb2VmZiA9IG0zMSA+IDAgPyAwIDogMTsKICAgICAgY29uc3QgbWluV1pjb2VmZiA9IG0zMiA+IDAgPyAwIDogMTsKICAgICAgY29uc3QgbmVhckEgPSBjbGlwcGluZ1BsYW5lc1s0ICogNF0sIG5lYXJCID0gY2xpcHBpbmdQbGFuZXNbNCAqIDQgKyAxXSwgbmVhckMgPSBjbGlwcGluZ1BsYW5lc1s0ICogNCArIDJdLCBuZWFyRCA9IGNsaXBwaW5nUGxhbmVzWzQgKiA0ICsgM107CiAgICAgIGZ1bmN0aW9uIGdldFBvaW50Vyh4LCB5LCB6KSB7CiAgICAgICAgcmV0dXJuIG0zMCAqIHggKyBtMzEgKiB5ICsgbTMyICogeiArIG0zMzsKICAgICAgfQogICAgICBmdW5jdGlvbiBnZXRCb3hXKHhMb3dlciwgeUxvd2VyLCB6TG93ZXIsIHhVcHBlciwgeVVwcGVyLCB6VXBwZXIpIHsKICAgICAgICByZXR1cm4gZ2V0UG9pbnRXKHhMb3dlciArIG1pbldYY29lZmYgKiAoeFVwcGVyIC0geExvd2VyKSwgeUxvd2VyICsgbWluV1ljb2VmZiAqICh5VXBwZXIgLSB5TG93ZXIpLCB6TG93ZXIgKyBtaW5XWmNvZWZmICogKHpVcHBlciAtIHpMb3dlcikpOwogICAgICB9CiAgICAgIGNvbnN0IG1pbldDbGlwID0gZ2V0UG9pbnRXKC1uZWFyRCAqIG5lYXJBLCAtbmVhckQgKiBuZWFyQiwgLW5lYXJEICogbmVhckMpOwogICAgICBjb25zdCBvYmplY3RYTG93ZXIgPSBtYW5pZmVzdC5jbGlwTG93ZXJCb3VuZFswXSwgb2JqZWN0WUxvd2VyID0gbWFuaWZlc3QuY2xpcExvd2VyQm91bmRbMV0sIG9iamVjdFpMb3dlciA9IG1hbmlmZXN0LmNsaXBMb3dlckJvdW5kWzJdOwogICAgICBjb25zdCBvYmplY3RYVXBwZXIgPSBtYW5pZmVzdC5jbGlwVXBwZXJCb3VuZFswXSwgb2JqZWN0WVVwcGVyID0gbWFuaWZlc3QuY2xpcFVwcGVyQm91bmRbMV0sIG9iamVjdFpVcHBlciA9IG1hbmlmZXN0LmNsaXBVcHBlckJvdW5kWzJdOwogICAgICBjb25zdCB4U2NhbGUgPSBNYXRoLnNxcnQoKG0wMCAqIHZpZXdwb3J0V2lkdGgpICoqIDIgKyAobTEwICogdmlld3BvcnRIZWlnaHQpICoqIDIpOwogICAgICBjb25zdCB5U2NhbGUgPSBNYXRoLnNxcnQoKG0wMSAqIHZpZXdwb3J0V2lkdGgpICoqIDIgKyAobTExICogdmlld3BvcnRIZWlnaHQpICoqIDIpOwogICAgICBjb25zdCB6U2NhbGUgPSBNYXRoLnNxcnQoKG0wMiAqIHZpZXdwb3J0V2lkdGgpICoqIDIgKyAobTEyICogdmlld3BvcnRIZWlnaHQpICoqIDIpOwogICAgICBjb25zdCBzY2FsZUZhY3RvciA9IE1hdGgubWF4KHhTY2FsZSwgeVNjYWxlLCB6U2NhbGUpOwogICAgICBmdW5jdGlvbiBoYW5kbGVDaHVuayhsb2QsIHJvdywgcHJpb3JMb2RTY2FsZSkgewogICAgICAgIGNvbnN0IHNpemUgPSAxIDw8IGxvZDsKICAgICAgICBjb25zdCByb3dPZmZzZXQgPSByb3cgKiA1OwogICAgICAgIGNvbnN0IGdyaWRYID0gb2N0cmVlW3Jvd09mZnNldF0sIGdyaWRZID0gb2N0cmVlW3Jvd09mZnNldCArIDFdLCBncmlkWiA9IG9jdHJlZVtyb3dPZmZzZXQgKyAyXSwgY2hpbGRCZWdpbiA9IG9jdHJlZVtyb3dPZmZzZXQgKyAzXSwgY2hpbGRFbmRBbmRFbXB0eSA9IG9jdHJlZVtyb3dPZmZzZXQgKyA0XTsKICAgICAgICBsZXQgeExvd2VyID0gZ3JpZFggKiBzaXplICogY2h1bmtTaGFwZVswXSArIGNodW5rR3JpZFNwYXRpYWxPcmlnaW5bMF0sIHlMb3dlciA9IGdyaWRZICogc2l6ZSAqIGNodW5rU2hhcGVbMV0gKyBjaHVua0dyaWRTcGF0aWFsT3JpZ2luWzFdLCB6TG93ZXIgPSBncmlkWiAqIHNpemUgKiBjaHVua1NoYXBlWzJdICsgY2h1bmtHcmlkU3BhdGlhbE9yaWdpblsyXTsKICAgICAgICBsZXQgeFVwcGVyID0geExvd2VyICsgc2l6ZSAqIGNodW5rU2hhcGVbMF0sIHlVcHBlciA9IHlMb3dlciArIHNpemUgKiBjaHVua1NoYXBlWzFdLCB6VXBwZXIgPSB6TG93ZXIgKyBzaXplICogY2h1bmtTaGFwZVsyXTsKICAgICAgICB4TG93ZXIgPSBNYXRoLm1heCh4TG93ZXIsIG9iamVjdFhMb3dlcik7CiAgICAgICAgeUxvd2VyID0gTWF0aC5tYXgoeUxvd2VyLCBvYmplY3RZTG93ZXIpOwogICAgICAgIHpMb3dlciA9IE1hdGgubWF4KHpMb3dlciwgb2JqZWN0Wkxvd2VyKTsKICAgICAgICB4VXBwZXIgPSBNYXRoLm1pbih4VXBwZXIsIG9iamVjdFhVcHBlcik7CiAgICAgICAgeVVwcGVyID0gTWF0aC5taW4oeVVwcGVyLCBvYmplY3RZVXBwZXIpOwogICAgICAgIHpVcHBlciA9IE1hdGgubWluKHpVcHBlciwgb2JqZWN0WlVwcGVyKTsKICAgICAgICBpZiAoaXNBQUJCVmlzaWJsZSh4TG93ZXIsIHlMb3dlciwgekxvd2VyLCB4VXBwZXIsIHlVcHBlciwgelVwcGVyLCBjbGlwcGluZ1BsYW5lcykpIHsKICAgICAgICAgIGNvbnN0IG1pblcgPSBNYXRoLm1heChtaW5XQ2xpcCwgZ2V0Qm94Vyh4TG93ZXIsIHlMb3dlciwgekxvd2VyLCB4VXBwZXIsIHlVcHBlciwgelVwcGVyKSk7CiAgICAgICAgICBjb25zdCBwaXhlbFNpemUgPSBtaW5XIC8gc2NhbGVGYWN0b3I7CiAgICAgICAgICBpZiAocHJpb3JMb2RTY2FsZSA9PT0gMCB8fCBwaXhlbFNpemUgKiBkZXRhaWxDdXRvZmYgPCBwcmlvckxvZFNjYWxlKSB7CiAgICAgICAgICAgIGNvbnN0IGxvZFNjYWxlID0gbG9kU2NhbGVzW2xvZF07CiAgICAgICAgICAgIGlmIChsb2RTY2FsZSAhPT0gMCkgewogICAgICAgICAgICAgIGNhbGxiYWNrKGxvZCwgcm93LCBsb2RTY2FsZSAvIHBpeGVsU2l6ZSwgY2hpbGRFbmRBbmRFbXB0eSA+Pj4gMzEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsb2QgPiAwICYmIChsb2RTY2FsZSA9PT0gMCB8fCBwaXhlbFNpemUgKiBkZXRhaWxDdXRvZmYgPCBsb2RTY2FsZSkpIHsKICAgICAgICAgICAgICBjb25zdCBuZXh0UHJpb3JMb2RTY2FsZSA9IGxvZFNjYWxlID09PSAwID8gcHJpb3JMb2RTY2FsZSA6IGxvZFNjYWxlOwogICAgICAgICAgICAgIGNvbnN0IGNoaWxkRW5kID0gKGNoaWxkRW5kQW5kRW1wdHkgJiAyMTQ3NDgzNjQ3KSA+Pj4gMDsKICAgICAgICAgICAgICBmb3IgKGxldCBjaGlsZFJvdyA9IGNoaWxkQmVnaW47IGNoaWxkUm93IDwgY2hpbGRFbmQ7ICsrY2hpbGRSb3cpIHsKICAgICAgICAgICAgICAgIGhhbmRsZUNodW5rKGxvZCAtIDEsIGNoaWxkUm93LCBuZXh0UHJpb3JMb2RTY2FsZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhbmRsZUNodW5rKG1heExvZCwgb2N0cmVlLmxlbmd0aCAvIDUgLSAxLCAwKTsKICAgIH0KCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL21lc2gvYmFja2VuZC50cwogICAgdmFyIE1FU0hfT0JKRUNUX01BTklGRVNUX0NIVU5LX1BSSU9SSVRZID0gMTAwOwogICAgdmFyIE1FU0hfT0JKRUNUX0ZSQUdNRU5UX0NIVU5LX1BSSU9SSVRZID0gNTA7CiAgICB2YXIgTWFuaWZlc3RDaHVuayA9IGNsYXNzIGV4dGVuZHMgQ2h1bmsgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMub2JqZWN0SWQgPSBuZXcgVWludDY0KCk7CiAgICAgIH0KICAgICAgaW5pdGlhbGl6ZU1hbmlmZXN0Q2h1bmsoa2V5LCBvYmplY3RJZCkgewogICAgICAgIHN1cGVyLmluaXRpYWxpemUoa2V5KTsKICAgICAgICB0aGlzLm9iamVjdElkLmFzc2lnbihvYmplY3RJZCk7CiAgICAgIH0KICAgICAgZnJlZVN5c3RlbU1lbW9yeSgpIHsKICAgICAgICB0aGlzLmZyYWdtZW50SWRzID0gbnVsbDsKICAgICAgfQogICAgICBzZXJpYWxpemUobXNnLCB0cmFuc2ZlcnMpIHsKICAgICAgICBzdXBlci5zZXJpYWxpemUobXNnLCB0cmFuc2ZlcnMpOwogICAgICAgIG1zZy5mcmFnbWVudElkcyA9IHRoaXMuZnJhZ21lbnRJZHM7CiAgICAgIH0KICAgICAgZG93bmxvYWRTdWNjZWVkZWQoKSB7CiAgICAgICAgdGhpcy5zeXN0ZW1NZW1vcnlCeXRlcyA9IDEwMDsKICAgICAgICB0aGlzLmdwdU1lbW9yeUJ5dGVzID0gMDsKICAgICAgICBzdXBlci5kb3dubG9hZFN1Y2NlZWRlZCgpOwogICAgICAgIGlmICh0aGlzLnByaW9yaXR5VGllciA8IENodW5rUHJpb3JpdHlUaWVyLlJFQ0VOVCkgewogICAgICAgICAgdGhpcy5zb3VyY2UuY2h1bmtNYW5hZ2VyLnNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLm9iamVjdElkLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBzZXJpYWxpemVNZXNoRGF0YShkYXRhLCBtc2csIHRyYW5zZmVycykgewogICAgICBjb25zdCB7IHZlcnRleFBvc2l0aW9ucywgaW5kaWNlcywgdmVydGV4Tm9ybWFscywgc3RyaXBzIH0gPSBkYXRhOwogICAgICBtc2dbInZlcnRleFBvc2l0aW9ucyJdID0gdmVydGV4UG9zaXRpb25zOwogICAgICBtc2dbImluZGljZXMiXSA9IGluZGljZXM7CiAgICAgIG1zZ1sic3RyaXBzIl0gPSBzdHJpcHM7CiAgICAgIG1zZ1sidmVydGV4Tm9ybWFscyJdID0gdmVydGV4Tm9ybWFsczsKICAgICAgbGV0IHZlcnRleFBvc2l0aW9uc0J1ZmZlciA9IHZlcnRleFBvc2l0aW9ucy5idWZmZXI7CiAgICAgIHRyYW5zZmVycy5wdXNoKHZlcnRleFBvc2l0aW9uc0J1ZmZlcik7CiAgICAgIGxldCBpbmRpY2VzQnVmZmVyID0gaW5kaWNlcy5idWZmZXI7CiAgICAgIGlmIChpbmRpY2VzQnVmZmVyICE9PSB2ZXJ0ZXhQb3NpdGlvbnNCdWZmZXIpIHsKICAgICAgICB0cmFuc2ZlcnMucHVzaChpbmRpY2VzQnVmZmVyKTsKICAgICAgfQogICAgICB0cmFuc2ZlcnMucHVzaCh2ZXJ0ZXhOb3JtYWxzLmJ1ZmZlcik7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRNZXNoRGF0YVNpemUoZGF0YSkgewogICAgICBsZXQgeyB2ZXJ0ZXhQb3NpdGlvbnMsIGluZGljZXMsIHZlcnRleE5vcm1hbHMgfSA9IGRhdGE7CiAgICAgIHJldHVybiB2ZXJ0ZXhQb3NpdGlvbnMuYnl0ZUxlbmd0aCArIGluZGljZXMuYnl0ZUxlbmd0aCArIHZlcnRleE5vcm1hbHMuYnl0ZUxlbmd0aDsKICAgIH0KICAgIHZhciBGcmFnbWVudENodW5rID0gY2xhc3MgZXh0ZW5kcyBDaHVuayB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5tYW5pZmVzdENodW5rID0gbnVsbDsKICAgICAgICB0aGlzLmZyYWdtZW50SWQgPSBudWxsOwogICAgICAgIHRoaXMubWVzaERhdGEgPSBudWxsOwogICAgICB9CiAgICAgIGluaXRpYWxpemVGcmFnbWVudENodW5rKGtleSwgbWFuaWZlc3RDaHVuaywgZnJhZ21lbnRJZCkgewogICAgICAgIHN1cGVyLmluaXRpYWxpemUoa2V5KTsKICAgICAgICB0aGlzLm1hbmlmZXN0Q2h1bmsgPSBtYW5pZmVzdENodW5rOwogICAgICAgIHRoaXMuZnJhZ21lbnRJZCA9IGZyYWdtZW50SWQ7CiAgICAgIH0KICAgICAgZnJlZVN5c3RlbU1lbW9yeSgpIHsKICAgICAgICB0aGlzLm1hbmlmZXN0Q2h1bmsgPSBudWxsOwogICAgICAgIHRoaXMubWVzaERhdGEgPSBudWxsOwogICAgICAgIHRoaXMuZnJhZ21lbnRJZCA9IG51bGw7CiAgICAgIH0KICAgICAgc2VyaWFsaXplKG1zZywgdHJhbnNmZXJzKSB7CiAgICAgICAgc3VwZXIuc2VyaWFsaXplKG1zZywgdHJhbnNmZXJzKTsKICAgICAgICBzZXJpYWxpemVNZXNoRGF0YSh0aGlzLm1lc2hEYXRhLCBtc2csIHRyYW5zZmVycyk7CiAgICAgICAgdGhpcy5tZXNoRGF0YSA9IG51bGw7CiAgICAgIH0KICAgICAgZG93bmxvYWRTdWNjZWVkZWQoKSB7CiAgICAgICAgdGhpcy5zeXN0ZW1NZW1vcnlCeXRlcyA9IHRoaXMuZ3B1TWVtb3J5Qnl0ZXMgPSBnZXRNZXNoRGF0YVNpemUodGhpcy5tZXNoRGF0YSk7CiAgICAgICAgc3VwZXIuZG93bmxvYWRTdWNjZWVkZWQoKTsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIGRlY29kZUpzb25NYW5pZmVzdENodW5rKGNodW5rLCByZXNwb25zZSwga2V5c1Byb3BlcnR5TmFtZSkgewogICAgICB2ZXJpZnlPYmplY3QocmVzcG9uc2UpOwogICAgICBjaHVuay5mcmFnbWVudElkcyA9IHZlcmlmeU9iamVjdFByb3BlcnR5KHJlc3BvbnNlLCBrZXlzUHJvcGVydHlOYW1lLCB2ZXJpZnlTdHJpbmdBcnJheSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb21wdXRlVmVydGV4Tm9ybWFscyhwb3NpdGlvbnMsIGluZGljZXMpIHsKICAgICAgY29uc3QgZmFjZU5vcm1hbCA9IHZlYzNfZXhwb3J0cy5jcmVhdGUoKTsKICAgICAgY29uc3QgdjF2MCA9IHZlYzNfZXhwb3J0cy5jcmVhdGUoKTsKICAgICAgY29uc3QgdjJ2MSA9IHZlYzNfZXhwb3J0cy5jcmVhdGUoKTsKICAgICAgbGV0IHZlcnRleE5vcm1hbHMgPSBuZXcgRmxvYXQzMkFycmF5KHBvc2l0aW9ucy5sZW5ndGgpOwogICAgICBsZXQgbnVtSW5kaWNlcyA9IGluZGljZXMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUluZGljZXM7IGkgKz0gMykgewogICAgICAgIGxldCBpMCA9IGluZGljZXNbaV0gKiAzLCBpMSA9IGluZGljZXNbaSArIDFdICogMywgaTIgPSBpbmRpY2VzW2kgKyAyXSAqIDM7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgICAgIHYxdjBbal0gPSBwb3NpdGlvbnNbaTEgKyBqXSAtIHBvc2l0aW9uc1tpMCArIGpdOwogICAgICAgICAgdjJ2MVtqXSA9IHBvc2l0aW9uc1tpMiArIGpdIC0gcG9zaXRpb25zW2kxICsgal07CiAgICAgICAgfQogICAgICAgIHZlYzNfZXhwb3J0cy5jcm9zcyhmYWNlTm9ybWFsLCB2MXYwLCB2MnYxKTsKICAgICAgICB2ZWMzX2V4cG9ydHMubm9ybWFsaXplKGZhY2VOb3JtYWwsIGZhY2VOb3JtYWwpOwogICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgMzsgKytrKSB7CiAgICAgICAgICBsZXQgaW5kZXggPSBpbmRpY2VzW2kgKyBrXTsKICAgICAgICAgIGxldCBvZmZzZXQgPSBpbmRleCAqIDM7CiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgICAgICB2ZXJ0ZXhOb3JtYWxzW29mZnNldCArIGpdICs9IGZhY2VOb3JtYWxbal07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCBudW1WZXJ0aWNlcyA9IHZlcnRleE5vcm1hbHMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVZlcnRpY2VzOyBpICs9IDMpIHsKICAgICAgICBsZXQgdmVjID0gdmVydGV4Tm9ybWFscy5zdWJhcnJheShpLCBpICsgMyk7CiAgICAgICAgdmVjM19leHBvcnRzLm5vcm1hbGl6ZSh2ZWMsIHZlYyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHZlcnRleE5vcm1hbHM7CiAgICB9CiAgICBmdW5jdGlvbiBzbm9ybTgoeCkgewogICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoLTEyNywgeCAqIDEyNyArIDAuNSksIDEyNykgPj4+IDA7CiAgICB9CiAgICBmdW5jdGlvbiBzaWduTm90WmVybyh4KSB7CiAgICAgIHJldHVybiB4IDwgMCA/IC0xIDogMTsKICAgIH0KICAgIGZ1bmN0aW9uIGVuY29kZU5vcm1hbHMzMmZ4M1RvT2N0YWhlZHJvbjh4MihvdXQsIG5vcm1hbHMpIHsKICAgICAgY29uc3QgbGVuZ3RoNCA9IG5vcm1hbHMubGVuZ3RoOwogICAgICBsZXQgb3V0SW5kZXggPSAwOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDQ7IGkgKz0gMykgewogICAgICAgIGNvbnN0IHggPSBub3JtYWxzW2ldLCB5ID0gbm9ybWFsc1tpICsgMV0sIHogPSBub3JtYWxzW2kgKyAyXTsKICAgICAgICBjb25zdCBpbnZMMU5vcm0gPSAxIC8gKE1hdGguYWJzKHgpICsgTWF0aC5hYnMoeSkgKyBNYXRoLmFicyh6KSk7CiAgICAgICAgaWYgKHogPCAwKSB7CiAgICAgICAgICBvdXRbb3V0SW5kZXhdID0gc25vcm04KCgxIC0gTWF0aC5hYnMoeSAqIGludkwxTm9ybSkpICogc2lnbk5vdFplcm8oeCkpOwogICAgICAgICAgb3V0W291dEluZGV4ICsgMV0gPSBzbm9ybTgoKDEgLSBNYXRoLmFicyh4ICogaW52TDFOb3JtKSkgKiBzaWduTm90WmVybyh5KSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG91dFtvdXRJbmRleF0gPSBzbm9ybTgoeCAqIGludkwxTm9ybSk7CiAgICAgICAgICBvdXRbb3V0SW5kZXggKyAxXSA9IHNub3JtOCh5ICogaW52TDFOb3JtKTsKICAgICAgICB9CiAgICAgICAgb3V0SW5kZXggKz0gMjsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZGVjb2RlVmVydGV4UG9zaXRpb25zQW5kSW5kaWNlcyh2ZXJ0aWNlc1BlclByaW1pdGl2ZSwgZGF0YSwgZW5kaWFubmVzcywgdmVydGV4Qnl0ZU9mZnNldCwgbnVtVmVydGljZXMsIGluZGV4Qnl0ZU9mZnNldCwgbnVtUHJpbWl0aXZlcykgewogICAgICBsZXQgdmVydGV4UG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShkYXRhLCB2ZXJ0ZXhCeXRlT2Zmc2V0LCBudW1WZXJ0aWNlcyAqIDMpOwogICAgICBjb252ZXJ0RW5kaWFuMzIodmVydGV4UG9zaXRpb25zLCBlbmRpYW5uZXNzKTsKICAgICAgaWYgKGluZGV4Qnl0ZU9mZnNldCA9PT0gdm9pZCAwKSB7CiAgICAgICAgaW5kZXhCeXRlT2Zmc2V0ID0gdmVydGV4Qnl0ZU9mZnNldCArIDEyICogbnVtVmVydGljZXM7CiAgICAgIH0KICAgICAgbGV0IG51bUluZGljZXM7CiAgICAgIGlmIChudW1QcmltaXRpdmVzICE9PSB2b2lkIDApIHsKICAgICAgICBudW1JbmRpY2VzID0gbnVtUHJpbWl0aXZlcyAqIHZlcnRpY2VzUGVyUHJpbWl0aXZlOwogICAgICB9CiAgICAgIGxldCBpbmRpY2VzID0gbnVtSW5kaWNlcyA9PT0gdm9pZCAwID8gbmV3IFVpbnQzMkFycmF5KGRhdGEsIGluZGV4Qnl0ZU9mZnNldCkgOiBuZXcgVWludDMyQXJyYXkoZGF0YSwgaW5kZXhCeXRlT2Zmc2V0LCBudW1JbmRpY2VzKTsKICAgICAgaWYgKGluZGljZXMubGVuZ3RoICUgdmVydGljZXNQZXJQcmltaXRpdmUgIT09IDApIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE51bWJlciBvZiBpbmRpY2VzIGlzIG5vdCBhIG11bHRpcGxlIG9mICR7dmVydGljZXNQZXJQcmltaXRpdmV9OiAke2luZGljZXMubGVuZ3RofS5gKTsKICAgICAgfQogICAgICBjb252ZXJ0RW5kaWFuMzIoaW5kaWNlcywgZW5kaWFubmVzcyk7CiAgICAgIHJldHVybiB7IHZlcnRleFBvc2l0aW9ucywgaW5kaWNlcyB9OwogICAgfQogICAgZnVuY3Rpb24gZGVjb2RlVHJpYW5nbGVWZXJ0ZXhQb3NpdGlvbnNBbmRJbmRpY2VzKGRhdGEsIGVuZGlhbm5lc3MsIHZlcnRleEJ5dGVPZmZzZXQsIG51bVZlcnRpY2VzLCBpbmRleEJ5dGVPZmZzZXQsIG51bVRyaWFuZ2xlcykgewogICAgICByZXR1cm4gZGVjb2RlVmVydGV4UG9zaXRpb25zQW5kSW5kaWNlcygzLCBkYXRhLCBlbmRpYW5uZXNzLCB2ZXJ0ZXhCeXRlT2Zmc2V0LCBudW1WZXJ0aWNlcywgaW5kZXhCeXRlT2Zmc2V0LCBudW1UcmlhbmdsZXMpOwogICAgfQogICAgdmFyIE1lc2hTb3VyY2UgPSBjbGFzcyBleHRlbmRzIENodW5rU291cmNlIHsKICAgICAgY29uc3RydWN0b3IocnBjMiwgb3B0aW9ucykgewogICAgICAgIHN1cGVyKHJwYzIsIG9wdGlvbnMpOwogICAgICAgIGxldCBmcmFnbWVudFNvdXJjZSA9IHRoaXMuZnJhZ21lbnRTb3VyY2UgPSB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIocnBjMi5nZXRSZWYob3B0aW9uc1siZnJhZ21lbnRTb3VyY2UiXSkpOwogICAgICAgIGZyYWdtZW50U291cmNlLm1lc2hTb3VyY2UgPSB0aGlzOwogICAgICB9CiAgICAgIGdldENodW5rKG9iamVjdElkKSB7CiAgICAgICAgY29uc3Qga2V5ID0gZ2V0T2JqZWN0S2V5KG9iamVjdElkKTsKICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLmNodW5rcy5nZXQoa2V5KTsKICAgICAgICBpZiAoY2h1bmsgPT09IHZvaWQgMCkgewogICAgICAgICAgY2h1bmsgPSB0aGlzLmdldE5ld0NodW5rXyhNYW5pZmVzdENodW5rKTsKICAgICAgICAgIGNodW5rLmluaXRpYWxpemVNYW5pZmVzdENodW5rKGtleSwgb2JqZWN0SWQpOwogICAgICAgICAgdGhpcy5hZGRDaHVuayhjaHVuayk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjaHVuazsKICAgICAgfQogICAgICBnZXRGcmFnbWVudEtleShvYmplY3RLZXksIGZyYWdtZW50SWQpIHsKICAgICAgICByZXR1cm4geyBrZXk6IGAke29iamVjdEtleX0vJHtmcmFnbWVudElkfWAsIGZyYWdtZW50SWQgfTsKICAgICAgfQogICAgICBnZXRGcmFnbWVudENodW5rKG1hbmlmZXN0Q2h1bmssIGZyYWdtZW50SWQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNvdXJjZSA9IHRoaXMuZnJhZ21lbnRTb3VyY2U7CiAgICAgICAgY29uc3QgeyBrZXk6IGZyYWdtZW50S2V5LCBmcmFnbWVudElkOiBwYXJzZWRGcmFnbWVudElkIH0gPSB0aGlzLmdldEZyYWdtZW50S2V5KG1hbmlmZXN0Q2h1bmsua2V5LCBmcmFnbWVudElkKTsKICAgICAgICBsZXQgY2h1bmsgPSBmcmFnbWVudFNvdXJjZS5jaHVua3MuZ2V0KGZyYWdtZW50S2V5KTsKICAgICAgICBpZiAoY2h1bmsgPT09IHZvaWQgMCkgewogICAgICAgICAgY2h1bmsgPSBmcmFnbWVudFNvdXJjZS5nZXROZXdDaHVua18oRnJhZ21lbnRDaHVuayk7CiAgICAgICAgICBjaHVuay5pbml0aWFsaXplRnJhZ21lbnRDaHVuayhmcmFnbWVudEtleSwgbWFuaWZlc3RDaHVuaywgcGFyc2VkRnJhZ21lbnRJZCk7CiAgICAgICAgICBmcmFnbWVudFNvdXJjZS5hZGRDaHVuayhjaHVuayk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjaHVuazsKICAgICAgfQogICAgfTsKICAgIHZhciBGcmFnbWVudFNvdXJjZSA9IGNsYXNzIGV4dGVuZHMgQ2h1bmtTb3VyY2UgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMubWVzaFNvdXJjZSA9IG51bGw7CiAgICAgIH0KICAgICAgZG93bmxvYWQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWVzaFNvdXJjZS5kb3dubG9hZEZyYWdtZW50KGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgIH0KICAgIH07CiAgICBGcmFnbWVudFNvdXJjZSA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KEZSQUdNRU5UX1NPVVJDRV9SUENfSUQpCiAgICBdLCBGcmFnbWVudFNvdXJjZSk7CiAgICB2YXIgTWVzaExheWVyID0gY2xhc3MgZXh0ZW5kcyB3aXRoU2VnbWVudGF0aW9uTGF5ZXJCYWNrZW5kU3RhdGUod2l0aFNoYXJlZFZpc2liaWxpdHkod2l0aENodW5rTWFuYWdlcihQZXJzcGVjdGl2ZVZpZXdSZW5kZXJMYXllckJhY2tlbmQpKSkgewogICAgICBjb25zdHJ1Y3RvcihycGMyLCBvcHRpb25zKSB7CiAgICAgICAgc3VwZXIocnBjMiwgb3B0aW9ucyk7CiAgICAgICAgdGhpcy5zb3VyY2UgPSB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIocnBjMi5nZXRSZWYob3B0aW9uc1sic291cmNlIl0pKTsKICAgICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIodGhpcy5jaHVua01hbmFnZXIucmVjb21wdXRlQ2h1bmtQcmlvcml0aWVzLmFkZCgoKSA9PiB7CiAgICAgICAgICB0aGlzLnVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICAgIH0pKTsKICAgICAgfQogICAgICBhdHRhY2goYXR0YWNobWVudCkgewogICAgICAgIGNvbnN0IHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzID0gKCkgPT4gewogICAgICAgICAgdGhpcy5jaHVua01hbmFnZXIuc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMoKTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IHsgdmlldyB9ID0gYXR0YWNobWVudDsKICAgICAgICBhdHRhY2htZW50LnJlZ2lzdGVyRGlzcG9zZXIodmlldy52aXNpYmlsaXR5LmNoYW5nZWQuYWRkKHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKSk7CiAgICAgICAgYXR0YWNobWVudC5yZWdpc3RlckRpc3Bvc2VyKHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKTsKICAgICAgICBzY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICB9CiAgICAgIHVwZGF0ZUNodW5rUHJpb3JpdGllcygpIHsKICAgICAgICBjb25zdCB2aXNpYmlsaXR5ID0gdGhpcy52aXNpYmlsaXR5LnZhbHVlOwogICAgICAgIGlmICh2aXNpYmlsaXR5ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5jaHVua01hbmFnZXIucmVnaXN0ZXJMYXllcih0aGlzKTsKICAgICAgICBjb25zdCBwcmlvcml0eVRpZXIgPSBnZXRQcmlvcml0eVRpZXIodmlzaWJpbGl0eSk7CiAgICAgICAgY29uc3QgYmFzZVByaW9yaXR5ID0gZ2V0QmFzZVByaW9yaXR5KHZpc2liaWxpdHkpOwogICAgICAgIGNvbnN0IHsgc291cmNlLCBjaHVua01hbmFnZXIgfSA9IHRoaXM7CiAgICAgICAgZm9yRWFjaFZpc2libGVTZWdtZW50KHRoaXMsIChvYmplY3RJZCkgPT4gewogICAgICAgICAgbGV0IG1hbmlmZXN0Q2h1bmsgPSBzb3VyY2UuZ2V0Q2h1bmsob2JqZWN0SWQpOwogICAgICAgICAgKyt0aGlzLm51bVZpc2libGVDaHVua3NOZWVkZWQ7CiAgICAgICAgICBjaHVua01hbmFnZXIucmVxdWVzdENodW5rKG1hbmlmZXN0Q2h1bmssIHByaW9yaXR5VGllciwgYmFzZVByaW9yaXR5ICsgTUVTSF9PQkpFQ1RfTUFOSUZFU1RfQ0hVTktfUFJJT1JJVFkpOwogICAgICAgICAgY29uc3Qgc3RhdGUgPSBtYW5pZmVzdENodW5rLnN0YXRlOwogICAgICAgICAgaWYgKHN0YXRlID09PSBDaHVua1N0YXRlLlNZU1RFTV9NRU1PUllfV09SS0VSIHx8IHN0YXRlID09PSBDaHVua1N0YXRlLlNZU1RFTV9NRU1PUlkgfHwgc3RhdGUgPT09IENodW5rU3RhdGUuR1BVX01FTU9SWSkgewogICAgICAgICAgICArK3RoaXMubnVtVmlzaWJsZUNodW5rc0F2YWlsYWJsZTsKICAgICAgICAgICAgZm9yIChsZXQgZnJhZ21lbnRJZCBvZiBtYW5pZmVzdENodW5rLmZyYWdtZW50SWRzKSB7CiAgICAgICAgICAgICAgbGV0IGZyYWdtZW50Q2h1bmsgPSBzb3VyY2UuZ2V0RnJhZ21lbnRDaHVuayhtYW5pZmVzdENodW5rLCBmcmFnbWVudElkKTsKICAgICAgICAgICAgICArK3RoaXMubnVtVmlzaWJsZUNodW5rc05lZWRlZDsKICAgICAgICAgICAgICBjaHVua01hbmFnZXIucmVxdWVzdENodW5rKGZyYWdtZW50Q2h1bmssIHByaW9yaXR5VGllciwgYmFzZVByaW9yaXR5ICsgTUVTSF9PQkpFQ1RfRlJBR01FTlRfQ0hVTktfUFJJT1JJVFkpOwogICAgICAgICAgICAgIGlmIChmcmFnbWVudENodW5rLnN0YXRlID09PSBDaHVua1N0YXRlLkdQVV9NRU1PUlkpIHsKICAgICAgICAgICAgICAgICsrdGhpcy5udW1WaXNpYmxlQ2h1bmtzQXZhaWxhYmxlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgTWVzaExheWVyID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoTUVTSF9MQVlFUl9SUENfSUQpCiAgICBdLCBNZXNoTGF5ZXIpOwogICAgdmFyIE11bHRpc2NhbGVNYW5pZmVzdENodW5rID0gY2xhc3MgZXh0ZW5kcyBDaHVuayB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5vYmplY3RJZCA9IG5ldyBVaW50NjQoKTsKICAgICAgfQogICAgICBpbml0aWFsaXplTWFuaWZlc3RDaHVuayhrZXksIG9iamVjdElkKSB7CiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZShrZXkpOwogICAgICAgIHRoaXMub2JqZWN0SWQuYXNzaWduKG9iamVjdElkKTsKICAgICAgfQogICAgICBmcmVlU3lzdGVtTWVtb3J5KCkgewogICAgICAgIHRoaXMubWFuaWZlc3QgPSB2b2lkIDA7CiAgICAgIH0KICAgICAgc2VyaWFsaXplKG1zZywgdHJhbnNmZXJzKSB7CiAgICAgICAgc3VwZXIuc2VyaWFsaXplKG1zZywgdHJhbnNmZXJzKTsKICAgICAgICBtc2cubWFuaWZlc3QgPSB0aGlzLm1hbmlmZXN0OwogICAgICB9CiAgICAgIGRvd25sb2FkU3VjY2VlZGVkKCkgewogICAgICAgIHRoaXMuc3lzdGVtTWVtb3J5Qnl0ZXMgPSB0aGlzLm1hbmlmZXN0Lm9jdHJlZS5ieXRlTGVuZ3RoOwogICAgICAgIHRoaXMuZ3B1TWVtb3J5Qnl0ZXMgPSAwOwogICAgICAgIHN1cGVyLmRvd25sb2FkU3VjY2VlZGVkKCk7CiAgICAgICAgaWYgKHRoaXMucHJpb3JpdHlUaWVyIDwgQ2h1bmtQcmlvcml0eVRpZXIuUkVDRU5UKSB7CiAgICAgICAgICB0aGlzLnNvdXJjZS5jaHVua01hbmFnZXIuc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdG9TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0SWQudG9TdHJpbmcoKTsKICAgICAgfQogICAgfTsKICAgIHZhciBNdWx0aXNjYWxlRnJhZ21lbnRDaHVuayA9IGNsYXNzIGV4dGVuZHMgQ2h1bmsgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuc3ViQ2h1bmtPZmZzZXRzID0gbnVsbDsKICAgICAgICB0aGlzLm1lc2hEYXRhID0gbnVsbDsKICAgICAgICB0aGlzLmxvZCA9IDA7CiAgICAgICAgdGhpcy5jaHVua0luZGV4ID0gMDsKICAgICAgICB0aGlzLm1hbmlmZXN0Q2h1bmsgPSBudWxsOwogICAgICB9CiAgICAgIGZyZWVTeXN0ZW1NZW1vcnkoKSB7CiAgICAgICAgdGhpcy5tZXNoRGF0YSA9IHRoaXMuc3ViQ2h1bmtPZmZzZXRzID0gbnVsbDsKICAgICAgfQogICAgICBzZXJpYWxpemUobXNnLCB0cmFuc2ZlcnMpIHsKICAgICAgICBzdXBlci5zZXJpYWxpemUobXNnLCB0cmFuc2ZlcnMpOwogICAgICAgIHNlcmlhbGl6ZU1lc2hEYXRhKHRoaXMubWVzaERhdGEsIG1zZywgdHJhbnNmZXJzKTsKICAgICAgICBjb25zdCB7IHN1YkNodW5rT2Zmc2V0cyB9ID0gdGhpczsKICAgICAgICBtc2dbInN1YkNodW5rT2Zmc2V0cyJdID0gc3ViQ2h1bmtPZmZzZXRzOwogICAgICAgIHRyYW5zZmVycy5wdXNoKHN1YkNodW5rT2Zmc2V0cy5idWZmZXIpOwogICAgICAgIHRoaXMubWVzaERhdGEgPSB0aGlzLnN1YkNodW5rT2Zmc2V0cyA9IG51bGw7CiAgICAgIH0KICAgICAgZG93bmxvYWRTdWNjZWVkZWQoKSB7CiAgICAgICAgY29uc3QgeyBzdWJDaHVua09mZnNldHMgfSA9IHRoaXM7CiAgICAgICAgdGhpcy5zeXN0ZW1NZW1vcnlCeXRlcyA9IHRoaXMuZ3B1TWVtb3J5Qnl0ZXMgPSBnZXRNZXNoRGF0YVNpemUodGhpcy5tZXNoRGF0YSk7CiAgICAgICAgdGhpcy5zeXN0ZW1NZW1vcnlCeXRlcyArPSBzdWJDaHVua09mZnNldHMuYnl0ZUxlbmd0aDsKICAgICAgICBzdXBlci5kb3dubG9hZFN1Y2NlZWRlZCgpOwogICAgICB9CiAgICB9OwogICAgdmFyIE11bHRpc2NhbGVNZXNoU291cmNlID0gY2xhc3MgZXh0ZW5kcyBDaHVua1NvdXJjZSB7CiAgICAgIGNvbnN0cnVjdG9yKHJwYzIsIG9wdGlvbnMpIHsKICAgICAgICBzdXBlcihycGMyLCBvcHRpb25zKTsKICAgICAgICBsZXQgZnJhZ21lbnRTb3VyY2UgPSB0aGlzLmZyYWdtZW50U291cmNlID0gdGhpcy5yZWdpc3RlckRpc3Bvc2VyKHJwYzIuZ2V0UmVmKG9wdGlvbnNbImZyYWdtZW50U291cmNlIl0pKTsKICAgICAgICB0aGlzLmZvcm1hdCA9IG9wdGlvbnNbImZvcm1hdCJdOwogICAgICAgIGZyYWdtZW50U291cmNlLm1lc2hTb3VyY2UgPSB0aGlzOwogICAgICB9CiAgICAgIGdldENodW5rKG9iamVjdElkKSB7CiAgICAgICAgY29uc3Qga2V5ID0gZ2V0T2JqZWN0S2V5KG9iamVjdElkKTsKICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLmNodW5rcy5nZXQoa2V5KTsKICAgICAgICBpZiAoY2h1bmsgPT09IHZvaWQgMCkgewogICAgICAgICAgY2h1bmsgPSB0aGlzLmdldE5ld0NodW5rXyhNdWx0aXNjYWxlTWFuaWZlc3RDaHVuayk7CiAgICAgICAgICBjaHVuay5pbml0aWFsaXplTWFuaWZlc3RDaHVuayhrZXksIG9iamVjdElkKTsKICAgICAgICAgIHRoaXMuYWRkQ2h1bmsoY2h1bmspOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2h1bms7CiAgICAgIH0KICAgICAgZ2V0RnJhZ21lbnRDaHVuayhtYW5pZmVzdENodW5rLCBsb2QsIGNodW5rSW5kZXgpIHsKICAgICAgICBsZXQga2V5ID0gYCR7bWFuaWZlc3RDaHVuay5rZXl9LyR7bG9kfToke2NodW5rSW5kZXh9YDsKICAgICAgICBsZXQgZnJhZ21lbnRTb3VyY2UgPSB0aGlzLmZyYWdtZW50U291cmNlOwogICAgICAgIGxldCBjaHVuayA9IGZyYWdtZW50U291cmNlLmNodW5rcy5nZXQoa2V5KTsKICAgICAgICBpZiAoY2h1bmsgPT09IHZvaWQgMCkgewogICAgICAgICAgY2h1bmsgPSBmcmFnbWVudFNvdXJjZS5nZXROZXdDaHVua18oTXVsdGlzY2FsZUZyYWdtZW50Q2h1bmspOwogICAgICAgICAgY2h1bmsuaW5pdGlhbGl6ZShrZXkpOwogICAgICAgICAgY2h1bmsubG9kID0gbG9kOwogICAgICAgICAgY2h1bmsuY2h1bmtJbmRleCA9IGNodW5rSW5kZXg7CiAgICAgICAgICBjaHVuay5tYW5pZmVzdENodW5rID0gbWFuaWZlc3RDaHVuazsKICAgICAgICAgIGZyYWdtZW50U291cmNlLmFkZENodW5rKGNodW5rKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNodW5rOwogICAgICB9CiAgICB9OwogICAgdmFyIE11bHRpc2NhbGVGcmFnbWVudFNvdXJjZSA9IGNsYXNzIGV4dGVuZHMgQ2h1bmtTb3VyY2UgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMubWVzaFNvdXJjZSA9IG51bGw7CiAgICAgIH0KICAgICAgZG93bmxvYWQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWVzaFNvdXJjZS5kb3dubG9hZEZyYWdtZW50KGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgIH0KICAgIH07CiAgICBNdWx0aXNjYWxlRnJhZ21lbnRTb3VyY2UgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdChNVUxUSVNDQUxFX0ZSQUdNRU5UX1NPVVJDRV9SUENfSUQpCiAgICBdLCBNdWx0aXNjYWxlRnJhZ21lbnRTb3VyY2UpOwogICAgdmFyIHRlbXBNb2RlbE1hdHJpeCA9IG1hdDRfZXhwb3J0cy5jcmVhdGUoKTsKICAgIHZhciBNdWx0aXNjYWxlTWVzaExheWVyID0gY2xhc3MgZXh0ZW5kcyB3aXRoU2VnbWVudGF0aW9uTGF5ZXJCYWNrZW5kU3RhdGUod2l0aFNoYXJlZFZpc2liaWxpdHkod2l0aENodW5rTWFuYWdlcihQZXJzcGVjdGl2ZVZpZXdSZW5kZXJMYXllckJhY2tlbmQpKSkgewogICAgICBjb25zdHJ1Y3RvcihycGMyLCBvcHRpb25zKSB7CiAgICAgICAgc3VwZXIocnBjMiwgb3B0aW9ucyk7CiAgICAgICAgdGhpcy5zb3VyY2UgPSB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIocnBjMi5nZXRSZWYob3B0aW9uc1sic291cmNlIl0pKTsKICAgICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIodGhpcy5jaHVua01hbmFnZXIucmVjb21wdXRlQ2h1bmtQcmlvcml0aWVzLmFkZCgoKSA9PiB7CiAgICAgICAgICB0aGlzLnVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICAgIH0pKTsKICAgICAgfQogICAgICBhdHRhY2goYXR0YWNobWVudCkgewogICAgICAgIGNvbnN0IHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzID0gKCkgPT4gdGhpcy5jaHVua01hbmFnZXIuc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMoKTsKICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGF0dGFjaG1lbnQ7CiAgICAgICAgYXR0YWNobWVudC5yZWdpc3RlckRpc3Bvc2VyKHZpZXcucHJvamVjdGlvblBhcmFtZXRlcnMuY2hhbmdlZC5hZGQoc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMpKTsKICAgICAgICBhdHRhY2htZW50LnJlZ2lzdGVyRGlzcG9zZXIodmlldy52aXNpYmlsaXR5LmNoYW5nZWQuYWRkKHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKSk7CiAgICAgICAgYXR0YWNobWVudC5yZWdpc3RlckRpc3Bvc2VyKHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKTsKICAgICAgICBzY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICB9CiAgICAgIHVwZGF0ZUNodW5rUHJpb3JpdGllcygpIHsKICAgICAgICBjb25zdCBtYXhWaXNpYmlsaXR5ID0gdGhpcy52aXNpYmlsaXR5LnZhbHVlOwogICAgICAgIGlmIChtYXhWaXNpYmlsaXR5ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgeyB0cmFuc2Zvcm06IHsgdmFsdWU6IHRyYW5zZm9ybSB9IH0gPSB0aGlzOwogICAgICAgIGlmICh0cmFuc2Zvcm0uZXJyb3IgIT09IHZvaWQgMCkKICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCBtYW5pZmVzdENodW5rcyA9IG5ldyBBcnJheSgpOwogICAgICAgIHRoaXMuY2h1bmtNYW5hZ2VyLnJlZ2lzdGVyTGF5ZXIodGhpcyk7CiAgICAgICAgewogICAgICAgICAgY29uc3QgcHJpb3JpdHlUaWVyID0gZ2V0UHJpb3JpdHlUaWVyKG1heFZpc2liaWxpdHkpOwogICAgICAgICAgY29uc3QgYmFzZVByaW9yaXR5ID0gZ2V0QmFzZVByaW9yaXR5KG1heFZpc2liaWxpdHkpOwogICAgICAgICAgY29uc3QgeyBzb3VyY2U6IHNvdXJjZTIsIGNodW5rTWFuYWdlcjogY2h1bmtNYW5hZ2VyMiB9ID0gdGhpczsKICAgICAgICAgIGZvckVhY2hWaXNpYmxlU2VnbWVudCh0aGlzLCAob2JqZWN0SWQpID0+IHsKICAgICAgICAgICAgY29uc3QgbWFuaWZlc3RDaHVuayA9IHNvdXJjZTIuZ2V0Q2h1bmsob2JqZWN0SWQpOwogICAgICAgICAgICArK3RoaXMubnVtVmlzaWJsZUNodW5rc05lZWRlZDsKICAgICAgICAgICAgY2h1bmtNYW5hZ2VyMi5yZXF1ZXN0Q2h1bmsobWFuaWZlc3RDaHVuaywgcHJpb3JpdHlUaWVyLCBiYXNlUHJpb3JpdHkgKyBNRVNIX09CSkVDVF9NQU5JRkVTVF9DSFVOS19QUklPUklUWSk7CiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gbWFuaWZlc3RDaHVuay5zdGF0ZTsKICAgICAgICAgICAgaWYgKHN0YXRlID09PSBDaHVua1N0YXRlLlNZU1RFTV9NRU1PUllfV09SS0VSIHx8IHN0YXRlID09PSBDaHVua1N0YXRlLlNZU1RFTV9NRU1PUlkgfHwgc3RhdGUgPT09IENodW5rU3RhdGUuR1BVX01FTU9SWSkgewogICAgICAgICAgICAgIG1hbmlmZXN0Q2h1bmtzLnB1c2gobWFuaWZlc3RDaHVuayk7CiAgICAgICAgICAgICAgKyt0aGlzLm51bVZpc2libGVDaHVua3NBdmFpbGFibGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAobWFuaWZlc3RDaHVua3MubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHsgc291cmNlLCBjaHVua01hbmFnZXIgfSA9IHRoaXM7CiAgICAgICAgZm9yIChjb25zdCB7IHZpZXcgfSBvZiB0aGlzLmF0dGFjaG1lbnRzLnZhbHVlcygpKSB7CiAgICAgICAgICBjb25zdCB2aXNpYmlsaXR5ID0gdmlldy52aXNpYmlsaXR5LnZhbHVlOwogICAgICAgICAgaWYgKHZpc2liaWxpdHkgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHByaW9yaXR5VGllciA9IGdldFByaW9yaXR5VGllcih2aXNpYmlsaXR5KTsKICAgICAgICAgIGNvbnN0IGJhc2VQcmlvcml0eSA9IGdldEJhc2VQcmlvcml0eSh2aXNpYmlsaXR5KTsKICAgICAgICAgIGNvbnN0IHByb2plY3Rpb25QYXJhbWV0ZXJzID0gdmlldy5wcm9qZWN0aW9uUGFyYW1ldGVycy52YWx1ZTsKICAgICAgICAgIGNvbnN0IG1vZGVsVmlld1Byb2plY3Rpb25NYXRyaXggPSB0ZW1wTW9kZWxNYXRyaXg7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBnZXQzZE1vZGVsVG9EaXNwbGF5U3BhY2VNYXRyaXgobW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCwgcHJvamVjdGlvblBhcmFtZXRlcnMuZGlzcGxheURpbWVuc2lvblJlbmRlckluZm8sIHRyYW5zZm9ybSk7CiAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBtYXQ0X2V4cG9ydHMubXVsdGlwbHkobW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCwgcHJvamVjdGlvblBhcmFtZXRlcnMudmlld1Byb2plY3Rpb25NYXQsIG1vZGVsVmlld1Byb2plY3Rpb25NYXRyaXgpOwogICAgICAgICAgY29uc3QgY2xpcHBpbmdQbGFuZXMgPSBnZXRGcnVzdHJ1bVBsYW5lcyhuZXcgRmxvYXQzMkFycmF5KDI0KSwgbW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCk7CiAgICAgICAgICBjb25zdCBkZXRhaWxDdXRvZmYgPSB0aGlzLnJlbmRlclNjYWxlVGFyZ2V0LnZhbHVlOwogICAgICAgICAgZm9yIChjb25zdCBtYW5pZmVzdENodW5rIG9mIG1hbmlmZXN0Q2h1bmtzKSB7CiAgICAgICAgICAgIGNvbnN0IG1heExvZCA9IG1hbmlmZXN0Q2h1bmsubWFuaWZlc3QubG9kU2NhbGVzLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIGdldERlc2lyZWRNdWx0aXNjYWxlTWVzaENodW5rcyhtYW5pZmVzdENodW5rLm1hbmlmZXN0LCBtb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4LCBjbGlwcGluZ1BsYW5lcywgZGV0YWlsQ3V0b2ZmLCBwcm9qZWN0aW9uUGFyYW1ldGVycy53aWR0aCwgcHJvamVjdGlvblBhcmFtZXRlcnMuaGVpZ2h0LCAobG9kLCBjaHVua0luZGV4LCBfcmVuZGVyU2NhbGUsIGVtcHR5KSA9PiB7CiAgICAgICAgICAgICAgaWYgKGVtcHR5KQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIGxldCBmcmFnbWVudENodW5rID0gc291cmNlLmdldEZyYWdtZW50Q2h1bmsobWFuaWZlc3RDaHVuaywgbG9kLCBjaHVua0luZGV4KTsKICAgICAgICAgICAgICArK3RoaXMubnVtVmlzaWJsZUNodW5rc05lZWRlZDsKICAgICAgICAgICAgICBjaHVua01hbmFnZXIucmVxdWVzdENodW5rKGZyYWdtZW50Q2h1bmssIHByaW9yaXR5VGllciwgYmFzZVByaW9yaXR5ICsgTUVTSF9PQkpFQ1RfRlJBR01FTlRfQ0hVTktfUFJJT1JJVFkgLSBtYXhMb2QgKyBsb2QpOwogICAgICAgICAgICAgIGlmIChmcmFnbWVudENodW5rLnN0YXRlID09PSBDaHVua1N0YXRlLkdQVV9NRU1PUlkpIHsKICAgICAgICAgICAgICAgICsrdGhpcy5udW1WaXNpYmxlQ2h1bmtzQXZhaWxhYmxlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgTXVsdGlzY2FsZU1lc2hMYXllciA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KE1VTFRJU0NBTEVfTUVTSF9MQVlFUl9SUENfSUQpCiAgICBdLCBNdWx0aXNjYWxlTWVzaExheWVyKTsKICAgIGZ1bmN0aW9uIGNvbnZlcnRNZXNoRGF0YShkYXRhLCB2ZXJ0ZXhQb3NpdGlvbkZvcm1hdCkgewogICAgICBjb25zdCBub3JtYWxzID0gY29tcHV0ZVZlcnRleE5vcm1hbHMoZGF0YS52ZXJ0ZXhQb3NpdGlvbnMsIGRhdGEuaW5kaWNlcyk7CiAgICAgIGNvbnN0IGVuY29kZWROb3JtYWxzID0gbmV3IFVpbnQ4QXJyYXkobm9ybWFscy5sZW5ndGggLyAzICogMik7CiAgICAgIGVuY29kZU5vcm1hbHMzMmZ4M1RvT2N0YWhlZHJvbjh4MihlbmNvZGVkTm9ybWFscywgbm9ybWFscyk7CiAgICAgIGxldCBlbmNvZGVkSW5kaWNlczsKICAgICAgbGV0IHN0cmlwczsKICAgICAgewogICAgICAgIGlmIChkYXRhLmluZGljZXMuQllURVNfUEVSX0VMRU1FTlQgPT09IDQgJiYgZGF0YS52ZXJ0ZXhQb3NpdGlvbnMubGVuZ3RoIC8gMyA8IDY1NTM1KSB7CiAgICAgICAgICBlbmNvZGVkSW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShkYXRhLmluZGljZXMubGVuZ3RoKTsKICAgICAgICAgIGVuY29kZWRJbmRpY2VzLnNldChkYXRhLmluZGljZXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbmNvZGVkSW5kaWNlcyA9IGRhdGEuaW5kaWNlczsKICAgICAgICB9CiAgICAgICAgc3RyaXBzID0gZmFsc2U7CiAgICAgIH0KICAgICAgbGV0IGVuY29kZWRWZXJ0ZXhQb3NpdGlvbnM7CiAgICAgIGlmICh2ZXJ0ZXhQb3NpdGlvbkZvcm1hdCA9PT0gVmVydGV4UG9zaXRpb25Gb3JtYXQudWludDEwKSB7CiAgICAgICAgY29uc3QgdmVydGV4UG9zaXRpb25zID0gZGF0YS52ZXJ0ZXhQb3NpdGlvbnM7CiAgICAgICAgY29uc3QgbnVtVmVydGljZXMgPSB2ZXJ0ZXhQb3NpdGlvbnMubGVuZ3RoIC8gMzsKICAgICAgICBlbmNvZGVkVmVydGV4UG9zaXRpb25zID0gbmV3IFVpbnQzMkFycmF5KG51bVZlcnRpY2VzKTsKICAgICAgICBmb3IgKGxldCBpbnB1dEluZGV4ID0gMCwgb3V0cHV0SW5kZXggPSAwOyBvdXRwdXRJbmRleCA8IG51bVZlcnRpY2VzOyBpbnB1dEluZGV4ICs9IDMsICsrb3V0cHV0SW5kZXgpIHsKICAgICAgICAgIGVuY29kZWRWZXJ0ZXhQb3NpdGlvbnNbb3V0cHV0SW5kZXhdID0gdmVydGV4UG9zaXRpb25zW2lucHV0SW5kZXhdICYgMTAyMyB8ICh2ZXJ0ZXhQb3NpdGlvbnNbaW5wdXRJbmRleCArIDFdICYgMTAyMykgPDwgMTAgfCAodmVydGV4UG9zaXRpb25zW2lucHV0SW5kZXggKyAyXSAmIDEwMjMpIDw8IDIwOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh2ZXJ0ZXhQb3NpdGlvbkZvcm1hdCA9PT0gVmVydGV4UG9zaXRpb25Gb3JtYXQudWludDE2KSB7CiAgICAgICAgY29uc3QgdmVydGV4UG9zaXRpb25zID0gZGF0YS52ZXJ0ZXhQb3NpdGlvbnM7CiAgICAgICAgaWYgKHZlcnRleFBvc2l0aW9ucy5CWVRFU19QRVJfRUxFTUVOVCA9PT0gMikgewogICAgICAgICAgZW5jb2RlZFZlcnRleFBvc2l0aW9ucyA9IHZlcnRleFBvc2l0aW9uczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZW5jb2RlZFZlcnRleFBvc2l0aW9ucyA9IG5ldyBVaW50MTZBcnJheSh2ZXJ0ZXhQb3NpdGlvbnMubGVuZ3RoKTsKICAgICAgICAgIGVuY29kZWRWZXJ0ZXhQb3NpdGlvbnMuc2V0KHZlcnRleFBvc2l0aW9ucyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGVuY29kZWRWZXJ0ZXhQb3NpdGlvbnMgPSBkYXRhLnZlcnRleFBvc2l0aW9uczsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIHZlcnRleFBvc2l0aW9uczogZW5jb2RlZFZlcnRleFBvc2l0aW9ucywKICAgICAgICB2ZXJ0ZXhOb3JtYWxzOiBlbmNvZGVkTm9ybWFscywKICAgICAgICBpbmRpY2VzOiBlbmNvZGVkSW5kaWNlcywKICAgICAgICBzdHJpcHMKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGFzc2lnbk1lc2hGcmFnbWVudERhdGEoY2h1bmssIGRhdGEsIHZlcnRleFBvc2l0aW9uRm9ybWF0ID0gVmVydGV4UG9zaXRpb25Gb3JtYXQuZmxvYXQzMikgewogICAgICBjaHVuay5tZXNoRGF0YSA9IGNvbnZlcnRNZXNoRGF0YShkYXRhLCB2ZXJ0ZXhQb3NpdGlvbkZvcm1hdCk7CiAgICB9CiAgICBmdW5jdGlvbiBhc3NpZ25NdWx0aXNjYWxlTWVzaEZyYWdtZW50RGF0YShjaHVuaywgZGF0YSwgdmVydGV4UG9zaXRpb25Gb3JtYXQpIHsKICAgICAgY2h1bmsubWVzaERhdGEgPSBjb252ZXJ0TWVzaERhdGEoZGF0YSwgdmVydGV4UG9zaXRpb25Gb3JtYXQpOwogICAgICBjaHVuay5zdWJDaHVua09mZnNldHMgPSBkYXRhLnN1YkNodW5rT2Zmc2V0czsKICAgIH0KICAgIGZ1bmN0aW9uIGdlbmVyYXRlSGlnaGVyT2N0cmVlTGV2ZWwob2N0cmVlLCBwcmlvclN0YXJ0LCBwcmlvckVuZCkgewogICAgICBsZXQgY3VyRW5kID0gcHJpb3JFbmQ7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgICAgb2N0cmVlW2N1ckVuZCAqIDUgKyBpXSA9IG9jdHJlZVtwcmlvclN0YXJ0ICogNSArIGldID4+PiAxOwogICAgICB9CiAgICAgIG9jdHJlZVtjdXJFbmQgKiA1ICsgM10gPSBwcmlvclN0YXJ0OwogICAgICBmb3IgKGxldCBpID0gcHJpb3JTdGFydCArIDE7IGkgPCBwcmlvckVuZDsgKytpKSB7CiAgICAgICAgY29uc3QgeCA9IG9jdHJlZVtpICogNV0gPj4+IDEsIHkgPSBvY3RyZWVbaSAqIDUgKyAxXSA+Pj4gMSwgeiA9IG9jdHJlZVtpICogNSArIDJdID4+PiAxOwogICAgICAgIGlmICh4ICE9PSBvY3RyZWVbY3VyRW5kICogNV0gfHwgeSAhPT0gb2N0cmVlW2N1ckVuZCAqIDUgKyAxXSB8fCB6ICE9PSBvY3RyZWVbY3VyRW5kICogNSArIDJdKSB7CiAgICAgICAgICBvY3RyZWVbY3VyRW5kICogNSArIDRdID0gaTsKICAgICAgICAgICsrY3VyRW5kOwogICAgICAgICAgb2N0cmVlW2N1ckVuZCAqIDVdID0geDsKICAgICAgICAgIG9jdHJlZVtjdXJFbmQgKiA1ICsgMV0gPSB5OwogICAgICAgICAgb2N0cmVlW2N1ckVuZCAqIDUgKyAyXSA9IHo7CiAgICAgICAgICBvY3RyZWVbY3VyRW5kICogNSArIDNdID0gaTsKICAgICAgICB9CiAgICAgIH0KICAgICAgb2N0cmVlW2N1ckVuZCAqIDUgKyA0XSA9IHByaW9yRW5kOwogICAgICArK2N1ckVuZDsKICAgICAgcmV0dXJuIGN1ckVuZDsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXB1dGVPY3RyZWVDaGlsZE9mZnNldHMob2N0cmVlLCBjaGlsZFN0YXJ0LCBjaGlsZEVuZCwgcGFyZW50RW5kKSB7CiAgICAgIGxldCBjaGlsZE5vZGUgPSBjaGlsZFN0YXJ0OwogICAgICBmb3IgKGxldCBwYXJlbnROb2RlID0gY2hpbGRFbmQ7IHBhcmVudE5vZGUgPCBwYXJlbnRFbmQ7ICsrcGFyZW50Tm9kZSkgewogICAgICAgIGNvbnN0IHBhcmVudFggPSBvY3RyZWVbcGFyZW50Tm9kZSAqIDVdLCBwYXJlbnRZID0gb2N0cmVlW3BhcmVudE5vZGUgKiA1ICsgMV0sIHBhcmVudFogPSBvY3RyZWVbcGFyZW50Tm9kZSAqIDUgKyAyXTsKICAgICAgICB3aGlsZSAoY2hpbGROb2RlIDwgY2hpbGRFbmQpIHsKICAgICAgICAgIGNvbnN0IGNoaWxkWCA9IG9jdHJlZVtjaGlsZE5vZGUgKiA1XSA+Pj4gMSwgY2hpbGRZID0gb2N0cmVlW2NoaWxkTm9kZSAqIDUgKyAxXSA+Pj4gMSwgY2hpbGRaID0gb2N0cmVlW2NoaWxkTm9kZSAqIDUgKyAyXSA+Pj4gMTsKICAgICAgICAgIGlmICghem9yZGVyM0xlc3NUaGFuKGNoaWxkWCwgY2hpbGRZLCBjaGlsZFosIHBhcmVudFgsIHBhcmVudFksIHBhcmVudFopKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgKytjaGlsZE5vZGU7CiAgICAgICAgfQogICAgICAgIG9jdHJlZVtwYXJlbnROb2RlICogNSArIDNdID0gY2hpbGROb2RlOwogICAgICAgIHdoaWxlIChjaGlsZE5vZGUgPCBjaGlsZEVuZCkgewogICAgICAgICAgY29uc3QgY2hpbGRYID0gb2N0cmVlW2NoaWxkTm9kZSAqIDVdID4+PiAxLCBjaGlsZFkgPSBvY3RyZWVbY2hpbGROb2RlICogNSArIDFdID4+PiAxLCBjaGlsZFogPSBvY3RyZWVbY2hpbGROb2RlICogNSArIDJdID4+PiAxOwogICAgICAgICAgaWYgKGNoaWxkWCAhPSBwYXJlbnRYIHx8IGNoaWxkWSAhPSBwYXJlbnRZIHx8IGNoaWxkWiAhPSBwYXJlbnRaKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgKytjaGlsZE5vZGU7CiAgICAgICAgfQogICAgICAgIG9jdHJlZVtwYXJlbnROb2RlICogNSArIDRdICs9IGNoaWxkTm9kZTsKICAgICAgfQogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvc2tlbGV0b24vYmFzZS50cwogICAgdmFyIFNLRUxFVE9OX0xBWUVSX1JQQ19JRCA9ICJza2VsZXRvbi9Ta2VsZXRvbkxheWVyIjsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3NrZWxldG9uL2JhY2tlbmQudHMKICAgIHZhciBTS0VMRVRPTl9DSFVOS19QUklPUklUWSA9IDYwOwogICAgdmFyIFNrZWxldG9uQ2h1bmsgPSBjbGFzcyBleHRlbmRzIENodW5rIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLm9iamVjdElkID0gbmV3IFVpbnQ2NCgpOwogICAgICAgIHRoaXMudmVydGV4UG9zaXRpb25zID0gbnVsbDsKICAgICAgICB0aGlzLnZlcnRleEF0dHJpYnV0ZXMgPSBudWxsOwogICAgICAgIHRoaXMuaW5kaWNlcyA9IG51bGw7CiAgICAgIH0KICAgICAgaW5pdGlhbGl6ZVNrZWxldG9uQ2h1bmsoa2V5LCBvYmplY3RJZCkgewogICAgICAgIHN1cGVyLmluaXRpYWxpemUoa2V5KTsKICAgICAgICB0aGlzLm9iamVjdElkLmFzc2lnbihvYmplY3RJZCk7CiAgICAgIH0KICAgICAgZnJlZVN5c3RlbU1lbW9yeSgpIHsKICAgICAgICB0aGlzLnZlcnRleFBvc2l0aW9ucyA9IHRoaXMuaW5kaWNlcyA9IG51bGw7CiAgICAgIH0KICAgICAgZ2V0VmVydGV4QXR0cmlidXRlQnl0ZXMoKSB7CiAgICAgICAgbGV0IHRvdGFsID0gdGhpcy52ZXJ0ZXhQb3NpdGlvbnMuYnl0ZUxlbmd0aDsKICAgICAgICBjb25zdCB7IHZlcnRleEF0dHJpYnV0ZXMgfSA9IHRoaXM7CiAgICAgICAgaWYgKHZlcnRleEF0dHJpYnV0ZXMgIT0gbnVsbCkgewogICAgICAgICAgdmVydGV4QXR0cmlidXRlcy5mb3JFYWNoKChhKSA9PiB7CiAgICAgICAgICAgIHRvdGFsICs9IGEuYnl0ZUxlbmd0aDsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdG90YWw7CiAgICAgIH0KICAgICAgc2VyaWFsaXplKG1zZywgdHJhbnNmZXJzKSB7CiAgICAgICAgc3VwZXIuc2VyaWFsaXplKG1zZywgdHJhbnNmZXJzKTsKICAgICAgICBjb25zdCB2ZXJ0ZXhQb3NpdGlvbnMgPSB0aGlzLnZlcnRleFBvc2l0aW9uczsKICAgICAgICBjb25zdCBpbmRpY2VzID0gdGhpcy5pbmRpY2VzOwogICAgICAgIG1zZ1sibnVtVmVydGljZXMiXSA9IHZlcnRleFBvc2l0aW9ucy5sZW5ndGggLyAzOwogICAgICAgIG1zZ1siaW5kaWNlcyJdID0gaW5kaWNlczsKICAgICAgICB0cmFuc2ZlcnMucHVzaChpbmRpY2VzLmJ1ZmZlcik7CiAgICAgICAgY29uc3QgeyB2ZXJ0ZXhBdHRyaWJ1dGVzIH0gPSB0aGlzOwogICAgICAgIGlmICh2ZXJ0ZXhBdHRyaWJ1dGVzICE9IG51bGwgJiYgdmVydGV4QXR0cmlidXRlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBjb25zdCB2ZXJ0ZXhEYXRhID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5nZXRWZXJ0ZXhBdHRyaWJ1dGVCeXRlcygpKTsKICAgICAgICAgIHZlcnRleERhdGEuc2V0KG5ldyBVaW50OEFycmF5KHZlcnRleFBvc2l0aW9ucy5idWZmZXIsIHZlcnRleFBvc2l0aW9ucy5ieXRlT2Zmc2V0LCB2ZXJ0ZXhQb3NpdGlvbnMuYnl0ZUxlbmd0aCkpOwogICAgICAgICAgbGV0IHZlcnRleEF0dHJpYnV0ZU9mZnNldHMgPSBtc2dbInZlcnRleEF0dHJpYnV0ZU9mZnNldHMiXSA9IG5ldyBVaW50MzJBcnJheSh2ZXJ0ZXhBdHRyaWJ1dGVzLmxlbmd0aCArIDEpOwogICAgICAgICAgdmVydGV4QXR0cmlidXRlT2Zmc2V0c1swXSA9IDA7CiAgICAgICAgICBsZXQgb2Zmc2V0ID0gdmVydGV4UG9zaXRpb25zLmJ5dGVMZW5ndGg7CiAgICAgICAgICB2ZXJ0ZXhBdHRyaWJ1dGVzLmZvckVhY2goKGEsIGkpID0+IHsKICAgICAgICAgICAgdmVydGV4QXR0cmlidXRlT2Zmc2V0c1tpICsgMV0gPSBvZmZzZXQ7CiAgICAgICAgICAgIHZlcnRleERhdGEuc2V0KG5ldyBVaW50OEFycmF5KGEuYnVmZmVyLCBhLmJ5dGVPZmZzZXQsIGEuYnl0ZUxlbmd0aCksIG9mZnNldCk7CiAgICAgICAgICAgIG9mZnNldCArPSBhLmJ5dGVMZW5ndGg7CiAgICAgICAgICB9KTsKICAgICAgICAgIHRyYW5zZmVycy5wdXNoKHZlcnRleERhdGEuYnVmZmVyKTsKICAgICAgICAgIG1zZ1sidmVydGV4QXR0cmlidXRlcyJdID0gdmVydGV4RGF0YTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbXNnWyJ2ZXJ0ZXhBdHRyaWJ1dGVzIl0gPSBuZXcgVWludDhBcnJheSh2ZXJ0ZXhQb3NpdGlvbnMuYnVmZmVyLCB2ZXJ0ZXhQb3NpdGlvbnMuYnl0ZU9mZnNldCwgdmVydGV4UG9zaXRpb25zLmJ5dGVMZW5ndGgpOwogICAgICAgICAgbXNnWyJ2ZXJ0ZXhBdHRyaWJ1dGVPZmZzZXRzIl0gPSBVaW50MzJBcnJheS5vZigwKTsKICAgICAgICAgIGlmICh2ZXJ0ZXhQb3NpdGlvbnMuYnVmZmVyICE9PSB0cmFuc2ZlcnNbMF0pIHsKICAgICAgICAgICAgdHJhbnNmZXJzLnB1c2godmVydGV4UG9zaXRpb25zLmJ1ZmZlcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMudmVydGV4UG9zaXRpb25zID0gdGhpcy5pbmRpY2VzID0gdGhpcy52ZXJ0ZXhBdHRyaWJ1dGVzID0gbnVsbDsKICAgICAgfQogICAgICBkb3dubG9hZFN1Y2NlZWRlZCgpIHsKICAgICAgICB0aGlzLnN5c3RlbU1lbW9yeUJ5dGVzID0gdGhpcy5ncHVNZW1vcnlCeXRlcyA9IHRoaXMuaW5kaWNlcy5ieXRlTGVuZ3RoICsgdGhpcy5nZXRWZXJ0ZXhBdHRyaWJ1dGVCeXRlcygpOwogICAgICAgIHN1cGVyLmRvd25sb2FkU3VjY2VlZGVkKCk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgU2tlbGV0b25Tb3VyY2UgPSBjbGFzcyBleHRlbmRzIENodW5rU291cmNlIHsKICAgICAgZ2V0Q2h1bmsob2JqZWN0SWQpIHsKICAgICAgICBjb25zdCBrZXkgPSBnZXRPYmplY3RLZXkob2JqZWN0SWQpOwogICAgICAgIGxldCBjaHVuayA9IHRoaXMuY2h1bmtzLmdldChrZXkpOwogICAgICAgIGlmIChjaHVuayA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBjaHVuayA9IHRoaXMuZ2V0TmV3Q2h1bmtfKFNrZWxldG9uQ2h1bmspOwogICAgICAgICAgY2h1bmsuaW5pdGlhbGl6ZVNrZWxldG9uQ2h1bmsoa2V5LCBvYmplY3RJZCk7CiAgICAgICAgICB0aGlzLmFkZENodW5rKGNodW5rKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNodW5rOwogICAgICB9CiAgICB9OwogICAgdmFyIFNrZWxldG9uTGF5ZXIgPSBjbGFzcyBleHRlbmRzIHdpdGhTZWdtZW50YXRpb25MYXllckJhY2tlbmRTdGF0ZSh3aXRoU2hhcmVkVmlzaWJpbGl0eSh3aXRoQ2h1bmtNYW5hZ2VyKENodW5rUmVuZGVyTGF5ZXJCYWNrZW5kKSkpIHsKICAgICAgY29uc3RydWN0b3IocnBjMiwgb3B0aW9ucykgewogICAgICAgIHN1cGVyKHJwYzIsIG9wdGlvbnMpOwogICAgICAgIHRoaXMuc291cmNlID0gdGhpcy5yZWdpc3RlckRpc3Bvc2VyKHJwYzIuZ2V0UmVmKG9wdGlvbnNbInNvdXJjZSJdKSk7CiAgICAgICAgdGhpcy5yZWdpc3RlckRpc3Bvc2VyKHRoaXMuY2h1bmtNYW5hZ2VyLnJlY29tcHV0ZUNodW5rUHJpb3JpdGllcy5hZGQoKCkgPT4gewogICAgICAgICAgdGhpcy51cGRhdGVDaHVua1ByaW9yaXRpZXMoKTsKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgdXBkYXRlQ2h1bmtQcmlvcml0aWVzKCkgewogICAgICAgIGNvbnN0IHZpc2liaWxpdHkgPSB0aGlzLnZpc2liaWxpdHkudmFsdWU7CiAgICAgICAgaWYgKHZpc2liaWxpdHkgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmNodW5rTWFuYWdlci5yZWdpc3RlckxheWVyKHRoaXMpOwogICAgICAgIGNvbnN0IHByaW9yaXR5VGllciA9IGdldFByaW9yaXR5VGllcih2aXNpYmlsaXR5KTsKICAgICAgICBjb25zdCBiYXNlUHJpb3JpdHkgPSBnZXRCYXNlUHJpb3JpdHkodmlzaWJpbGl0eSk7CiAgICAgICAgY29uc3QgeyBzb3VyY2UsIGNodW5rTWFuYWdlciB9ID0gdGhpczsKICAgICAgICBmb3JFYWNoVmlzaWJsZVNlZ21lbnQodGhpcywgKG9iamVjdElkKSA9PiB7CiAgICAgICAgICBjb25zdCBjaHVuayA9IHNvdXJjZS5nZXRDaHVuayhvYmplY3RJZCk7CiAgICAgICAgICArK3RoaXMubnVtVmlzaWJsZUNodW5rc05lZWRlZDsKICAgICAgICAgIGlmIChjaHVuay5zdGF0ZSA9PT0gQ2h1bmtTdGF0ZS5HUFVfTUVNT1JZKSB7CiAgICAgICAgICAgICsrdGhpcy5udW1WaXNpYmxlQ2h1bmtzQXZhaWxhYmxlOwogICAgICAgICAgfQogICAgICAgICAgY2h1bmtNYW5hZ2VyLnJlcXVlc3RDaHVuayhjaHVuaywgcHJpb3JpdHlUaWVyLCBiYXNlUHJpb3JpdHkgKyBTS0VMRVRPTl9DSFVOS19QUklPUklUWSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBTa2VsZXRvbkxheWVyID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoU0tFTEVUT05fTEFZRVJfUlBDX0lEKQogICAgXSwgU2tlbGV0b25MYXllcik7CiAgICBmdW5jdGlvbiBkZWNvZGVTa2VsZXRvblZlcnRleFBvc2l0aW9uc0FuZEluZGljZXMoY2h1bmssIGRhdGEsIGVuZGlhbm5lc3MsIHZlcnRleEJ5dGVPZmZzZXQsIG51bVZlcnRpY2VzLCBpbmRleEJ5dGVPZmZzZXQsIG51bUVkZ2VzKSB7CiAgICAgIGNvbnN0IG1lc2hEYXRhID0gZGVjb2RlVmVydGV4UG9zaXRpb25zQW5kSW5kaWNlcygyLCBkYXRhLCBlbmRpYW5uZXNzLCB2ZXJ0ZXhCeXRlT2Zmc2V0LCBudW1WZXJ0aWNlcywgaW5kZXhCeXRlT2Zmc2V0LCBudW1FZGdlcyk7CiAgICAgIGNodW5rLnZlcnRleFBvc2l0aW9ucyA9IG1lc2hEYXRhLnZlcnRleFBvc2l0aW9uczsKICAgICAgY2h1bmsuaW5kaWNlcyA9IG1lc2hEYXRhLmluZGljZXM7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9zbGljZXZpZXcvYmFja2VuZF9jaHVua19kZWNvZGVycy9jb21wcmVzc2VkX3NlZ21lbnRhdGlvbi50cwogICAgYXN5bmMgZnVuY3Rpb24gZGVjb2RlQ29tcHJlc3NlZFNlZ21lbnRhdGlvbkNodW5rKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbiwgcmVzcG9uc2UpIHsKICAgICAgY2h1bmsuZGF0YSA9IG5ldyBVaW50MzJBcnJheShyZXNwb25zZSk7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9hc3luY19jb21wdXRhdGlvbi9pbmRleC50cwogICAgZnVuY3Rpb24gYXN5bmNDb21wdXRhdGlvbihpZCkgewogICAgICByZXR1cm4geyBpZCB9OwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvYXN5bmNfY29tcHV0YXRpb24vZW5jb2RlX2NvbXByZXNzZWRfc2VnbWVudGF0aW9uX3JlcXVlc3QudHMKICAgIHZhciBlbmNvZGVDb21wcmVzc2VkU2VnbWVudGF0aW9uVWludDMyID0gYXN5bmNDb21wdXRhdGlvbigiZW5jb2RlQ29tcHJlc3NlZFNlZ21lbnRhdGlvblVpbnQzMiIpOwogICAgdmFyIGVuY29kZUNvbXByZXNzZWRTZWdtZW50YXRpb25VaW50NjQgPSBhc3luY0NvbXB1dGF0aW9uKCJlbmNvZGVDb21wcmVzc2VkU2VnbWVudGF0aW9uVWludDY0Iik7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9hc3luY19jb21wdXRhdGlvbi9yZXF1ZXN0LnRzCiAgICB2YXIgZnJlZVdvcmtlcnMgPSBbXTsKICAgIHZhciBwZW5kaW5nVGFza3MgPSBuZXcgTWFwKCk7CiAgICB2YXIgdGFza3MgPSBuZXcgTWFwKCk7CiAgICB2YXIgbWF4V29ya2VycyA9IHR5cGVvZiBuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSA9PT0gInVuZGVmaW5lZCIgPyA0IDogTWF0aC5taW4oMTIsIG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5KTsKICAgIHZhciBuZXh0VGFza0lkID0gMDsKICAgIGZ1bmN0aW9uIHJldHVybldvcmtlcih3b3JrZXIpIHsKICAgICAgZm9yIChjb25zdCBbaWQsIHRhc2tdIG9mIHBlbmRpbmdUYXNrcykgewogICAgICAgIHBlbmRpbmdUYXNrcy5kZWxldGUoaWQpOwogICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh0YXNrLm1zZywgdGFzay50cmFuc2Zlcik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZyZWVXb3JrZXJzLnB1c2god29ya2VyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldE5ld1dvcmtlcigpIHsKICAgICAgbGV0IHBvcnQ7CiAgICAgIGlmICh0eXBlb2YgV29ya2VyID09PSAidW5kZWZpbmVkIikgewogICAgICAgIGNvbnN0IGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTsKICAgICAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjsKICAgICAgICBycGMuaW52b2tlKFdPUktFUl9SUENfSUQsIHsgcG9ydDogY2hhbm5lbC5wb3J0MSwgcGF0aDogImFzeW5jX2NvbXB1dGF0aW9uLmJ1bmRsZS5qcyIgfSwgW2NoYW5uZWwucG9ydDFdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwb3J0ID0gbmV3IFdvcmtlcigiYXN5bmNfY29tcHV0YXRpb24uYnVuZGxlLmpzIik7CiAgICAgIH0KICAgICAgcG9ydC5vbm1lc3NhZ2UgPSAobXNnKSA9PiB7CiAgICAgICAgY29uc3QgeyBpZCwgdmFsdWUsIGVycm9yIH0gPSBtc2cuZGF0YTsKICAgICAgICByZXR1cm5Xb3JrZXIocG9ydCk7CiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gdGFza3MuZ2V0KGlkKTsKICAgICAgICB0YXNrcy5kZWxldGUoaWQpOwogICAgICAgIGlmIChjYWxsYmFja3MgPT09IHZvaWQgMCkKICAgICAgICAgIHJldHVybjsKICAgICAgICBjYWxsYmFja3MuY2xlYW51cCgpOwogICAgICAgIGlmIChlcnJvciAhPT0gdm9pZCAwKSB7CiAgICAgICAgICBjYWxsYmFja3MucmVqZWN0KG5ldyBFcnJvcihlcnJvcikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjYWxsYmFja3MucmVzb2x2ZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICB9OwogICAgICByZXR1cm4gcG9ydDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcXVlc3RBc3luY0NvbXB1dGF0aW9uKHJlcXVlc3QsIGNhbmNlbGxhdGlvblRva2VuLCB0cmFuc2ZlciwgLi4uYXJncykgewogICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uaXNDYW5jZWxlZCkKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoQ0FOQ0VMRUQpOwogICAgICBjb25zdCBpZCA9IG5leHRUYXNrSWQrKzsKICAgICAgY29uc3QgbXNnID0geyB0OiByZXF1ZXN0LmlkLCBpZCwgYXJncyB9OwogICAgICBjb25zdCBjbGVhbnVwID0gY2FuY2VsbGF0aW9uVG9rZW4uYWRkKCgpID0+IHsKICAgICAgICBwZW5kaW5nVGFza3MuZGVsZXRlKGlkKTsKICAgICAgICB0YXNrcy5kZWxldGUoaWQpOwogICAgICB9KTsKICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICB0YXNrcy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0LCBjbGVhbnVwIH0pOwogICAgICB9KTsKICAgICAgaWYgKGZyZWVXb3JrZXJzLmxlbmd0aCAhPT0gMCkgewogICAgICAgIGZyZWVXb3JrZXJzLnBvcCgpLnBvc3RNZXNzYWdlKG1zZywgdHJhbnNmZXIpOwogICAgICB9IGVsc2UgaWYgKHRhc2tzLnNpemUgPCBtYXhXb3JrZXJzKSB7CiAgICAgICAgZ2V0TmV3V29ya2VyKCkucG9zdE1lc3NhZ2UobXNnLCB0cmFuc2Zlcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGVuZGluZ1Rhc2tzLnNldChpZCwgeyBtc2csIHRyYW5zZmVyIH0pOwogICAgICB9CiAgICAgIHJldHVybiBwcm9taXNlOwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvc2xpY2V2aWV3L2JhY2tlbmRfY2h1bmtfZGVjb2RlcnMvcG9zdHByb2Nlc3MudHMKICAgIGFzeW5jIGZ1bmN0aW9uIHBvc3RQcm9jZXNzUmF3RGF0YShjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4sIGRhdGEpIHsKICAgICAgY29uc3QgeyBzcGVjIH0gPSBjaHVuay5zb3VyY2U7CiAgICAgIGlmIChzcGVjLmNvbXByZXNzZWRTZWdtZW50YXRpb25CbG9ja1NpemUgIT09IHZvaWQgMCkgewogICAgICAgIGNvbnN0IHsgZGF0YVR5cGUgfSA9IHNwZWM7CiAgICAgICAgY29uc3QgY2h1bmtEYXRhU2l6ZSA9IGNodW5rLmNodW5rRGF0YVNpemU7CiAgICAgICAgY29uc3Qgc2hhcGUgPSBbY2h1bmtEYXRhU2l6ZVswXSwgY2h1bmtEYXRhU2l6ZVsxXSwgY2h1bmtEYXRhU2l6ZVsyXSwgY2h1bmtEYXRhU2l6ZVszXSB8fCAxXTsKICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7CiAgICAgICAgICBjYXNlIERhdGFUeXBlLlVJTlQzMjoKICAgICAgICAgICAgY2h1bmsuZGF0YSA9IGF3YWl0IHJlcXVlc3RBc3luY0NvbXB1dGF0aW9uKGVuY29kZUNvbXByZXNzZWRTZWdtZW50YXRpb25VaW50MzIsIGNhbmNlbGxhdGlvblRva2VuLCBbZGF0YS5idWZmZXJdLCBkYXRhLCBzaGFwZSwgc3BlYy5jb21wcmVzc2VkU2VnbWVudGF0aW9uQmxvY2tTaXplKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIERhdGFUeXBlLlVJTlQ2NDoKICAgICAgICAgICAgY2h1bmsuZGF0YSA9IGF3YWl0IHJlcXVlc3RBc3luY0NvbXB1dGF0aW9uKGVuY29kZUNvbXByZXNzZWRTZWdtZW50YXRpb25VaW50NjQsIGNhbmNlbGxhdGlvblRva2VuLCBbZGF0YS5idWZmZXJdLCBkYXRhLCBzaGFwZSwgc3BlYy5jb21wcmVzc2VkU2VnbWVudGF0aW9uQmxvY2tTaXplKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRhdGEgdHlwZSBmb3IgY29tcHJlc3NlZCBzZWdtZW50YXRpb246ICR7RGF0YVR5cGVbZGF0YVR5cGVdfWApOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjaHVuay5kYXRhID0gZGF0YTsKICAgICAgfQogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvYXN5bmNfY29tcHV0YXRpb24vZGVjb2RlX2pwZWdfcmVxdWVzdC50cwogICAgdmFyIGRlY29kZUpwZWcgPSBhc3luY0NvbXB1dGF0aW9uKCJkZWNvZGVKcGVnIik7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9zbGljZXZpZXcvYmFja2VuZF9jaHVua19kZWNvZGVycy9qcGVnLnRzCiAgICBhc3luYyBmdW5jdGlvbiBkZWNvZGVKcGVnQ2h1bmsoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuLCByZXNwb25zZSkgewogICAgICBjb25zdCBjaHVua0RhdGFTaXplID0gY2h1bmsuY2h1bmtEYXRhU2l6ZTsKICAgICAgY29uc3QgZGVjb2RlZCA9IGF3YWl0IHJlcXVlc3RBc3luY0NvbXB1dGF0aW9uKGRlY29kZUpwZWcsIGNhbmNlbGxhdGlvblRva2VuLCBbcmVzcG9uc2VdLCBuZXcgVWludDhBcnJheShyZXNwb25zZSksIGNodW5rRGF0YVNpemVbMF0sIGNodW5rRGF0YVNpemVbMV0gKiBjaHVua0RhdGFTaXplWzJdLCBjaHVua0RhdGFTaXplWzNdIHx8IDEsIGZhbHNlKTsKICAgICAgYXdhaXQgcG9zdFByb2Nlc3NSYXdEYXRhKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbiwgZGVjb2RlZCk7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9zbGljZXZpZXcvYmFja2VuZF9jaHVua19kZWNvZGVycy9yYXcudHMKICAgIGFzeW5jIGZ1bmN0aW9uIGRlY29kZVJhd0NodW5rKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbiwgcmVzcG9uc2UsIGVuZGlhbm5lc3MgPSBFTkRJQU5ORVNTLCBieXRlT2Zmc2V0ID0gMCwgYnl0ZUxlbmd0aCA9IHJlc3BvbnNlLmJ5dGVMZW5ndGgpIHsKICAgICAgbGV0IHsgc3BlYyB9ID0gY2h1bmsuc291cmNlOwogICAgICBsZXQgeyBkYXRhVHlwZSB9ID0gc3BlYzsKICAgICAgbGV0IG51bUVsZW1lbnRzID0gcHJvZChjaHVuay5jaHVua0RhdGFTaXplKTsKICAgICAgbGV0IGJ5dGVzUGVyRWxlbWVudCA9IERBVEFfVFlQRV9CWVRFU1tkYXRhVHlwZV07CiAgICAgIGxldCBleHBlY3RlZEJ5dGVzID0gbnVtRWxlbWVudHMgKiBieXRlc1BlckVsZW1lbnQ7CiAgICAgIGlmIChleHBlY3RlZEJ5dGVzICE9PSBieXRlTGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYXctZm9ybWF0IGNodW5rIGlzICR7Ynl0ZUxlbmd0aH0gYnl0ZXMsIGJ1dCAke251bUVsZW1lbnRzfSAqICR7Ynl0ZXNQZXJFbGVtZW50fSA9ICR7ZXhwZWN0ZWRCeXRlc30gYnl0ZXMgYXJlIGV4cGVjdGVkLmApOwogICAgICB9CiAgICAgIGNvbnN0IGRhdGEgPSBtYWtlRGF0YVR5cGVBcnJheVZpZXcoZGF0YVR5cGUsIHJlc3BvbnNlLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTsKICAgICAgY29udmVydEVuZGlhbihkYXRhLCBlbmRpYW5uZXNzLCBieXRlc1BlckVsZW1lbnQpOwogICAgICBhd2FpdCBwb3N0UHJvY2Vzc1Jhd0RhdGEoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuLCBkYXRhKTsKICAgIH0KCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3NsaWNldmlldy92b2x1bWUvYmFja2VuZC50cwogICAgdmFyIFZvbHVtZUNodW5rID0gY2xhc3MgZXh0ZW5kcyBTbGljZVZpZXdDaHVuayB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5zb3VyY2UgPSBudWxsOwogICAgICB9CiAgICAgIGluaXRpYWxpemVWb2x1bWVDaHVuayhrZXksIGNodW5rR3JpZFBvc2l0aW9uKSB7CiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZVZvbHVtZUNodW5rKGtleSwgY2h1bmtHcmlkUG9zaXRpb24pOwogICAgICAgIHRoaXMuY2h1bmtEYXRhU2l6ZSA9IG51bGw7CiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDsKICAgICAgfQogICAgICBzZXJpYWxpemUobXNnLCB0cmFuc2ZlcnMpIHsKICAgICAgICBzdXBlci5zZXJpYWxpemUobXNnLCB0cmFuc2ZlcnMpOwogICAgICAgIGxldCBjaHVua0RhdGFTaXplID0gdGhpcy5jaHVua0RhdGFTaXplOwogICAgICAgIGlmIChjaHVua0RhdGFTaXplICE9PSB0aGlzLnNvdXJjZS5zcGVjLmNodW5rRGF0YVNpemUpIHsKICAgICAgICAgIG1zZ1siY2h1bmtEYXRhU2l6ZSJdID0gY2h1bmtEYXRhU2l6ZTsKICAgICAgICB9CiAgICAgICAgbGV0IGRhdGEgPSBtc2dbImRhdGEiXSA9IHRoaXMuZGF0YTsKICAgICAgICB0cmFuc2ZlcnMucHVzaChkYXRhLmJ1ZmZlcik7CiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDsKICAgICAgfQogICAgICBkb3dubG9hZFN1Y2NlZWRlZCgpIHsKICAgICAgICB0aGlzLnN5c3RlbU1lbW9yeUJ5dGVzID0gdGhpcy5ncHVNZW1vcnlCeXRlcyA9IHRoaXMuZGF0YS5ieXRlTGVuZ3RoOwogICAgICAgIHN1cGVyLmRvd25sb2FkU3VjY2VlZGVkKCk7CiAgICAgIH0KICAgICAgZnJlZVN5c3RlbU1lbW9yeSgpIHsKICAgICAgICB0aGlzLmRhdGEgPSBudWxsOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gY29tcHV0ZUNodW5rQm91bmRzKHNvdXJjZSwgY2h1bmspIHsKICAgICAgY29uc3QgeyBzcGVjLCB0ZW1wQ2h1bmtEYXRhU2l6ZSwgdGVtcENodW5rUG9zaXRpb246IHRlbXBDaHVua1Bvc2l0aW9uNCB9ID0gc291cmNlOwogICAgICBjb25zdCB7IHVwcGVyVm94ZWxCb3VuZCwgcmFuaywgYmFzZVZveGVsT2Zmc2V0IH0gPSBzcGVjOwogICAgICBsZXQgb3JpZ0NodW5rRGF0YVNpemUgPSBzcGVjLmNodW5rRGF0YVNpemU7CiAgICAgIGxldCBuZXdDaHVua0RhdGFTaXplID0gdGVtcENodW5rRGF0YVNpemU7CiAgICAgIGNvbnN0IGNodW5rUG9zaXRpb24gPSBtdWx0aXBseTYodGVtcENodW5rUG9zaXRpb240LCBjaHVuay5jaHVua0dyaWRQb3NpdGlvbiwgb3JpZ0NodW5rRGF0YVNpemUpOwogICAgICBsZXQgcGFydGlhbCA9IGZhbHNlOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbms7ICsraSkgewogICAgICAgIGxldCB1cHBlciA9IE1hdGgubWluKHVwcGVyVm94ZWxCb3VuZFtpXSwgY2h1bmtQb3NpdGlvbltpXSArIG9yaWdDaHVua0RhdGFTaXplW2ldKTsKICAgICAgICBsZXQgc2l6ZSA9IG5ld0NodW5rRGF0YVNpemVbaV0gPSB1cHBlciAtIGNodW5rUG9zaXRpb25baV07CiAgICAgICAgaWYgKHNpemUgIT09IG9yaWdDaHVua0RhdGFTaXplW2ldKSB7CiAgICAgICAgICBwYXJ0aWFsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYWRkNihjaHVua1Bvc2l0aW9uLCBjaHVua1Bvc2l0aW9uLCBiYXNlVm94ZWxPZmZzZXQpOwogICAgICBpZiAocGFydGlhbCkgewogICAgICAgIGNodW5rLmNodW5rRGF0YVNpemUgPSBVaW50MzJBcnJheS5mcm9tKG5ld0NodW5rRGF0YVNpemUpOwogICAgICB9IGVsc2UgewogICAgICAgIGNodW5rLmNodW5rRGF0YVNpemUgPSBvcmlnQ2h1bmtEYXRhU2l6ZTsKICAgICAgfQogICAgICByZXR1cm4gY2h1bmtQb3NpdGlvbjsKICAgIH0KICAgIHZhciBWb2x1bWVDaHVua1NvdXJjZSA9IGNsYXNzIGV4dGVuZHMgU2xpY2VWaWV3Q2h1bmtTb3VyY2VCYWNrZW5kIHsKICAgICAgY29uc3RydWN0b3IocnBjMiwgb3B0aW9ucykgewogICAgICAgIHN1cGVyKHJwYzIsIG9wdGlvbnMpOwogICAgICAgIGNvbnN0IHJhbmsgPSB0aGlzLnNwZWMucmFuazsKICAgICAgICB0aGlzLnRlbXBDaHVua0RhdGFTaXplID0gbmV3IFVpbnQzMkFycmF5KHJhbmspOwogICAgICAgIHRoaXMudGVtcENodW5rUG9zaXRpb24gPSBuZXcgRmxvYXQzMkFycmF5KHJhbmspOwogICAgICB9CiAgICAgIGNvbXB1dGVDaHVua0JvdW5kcyhjaHVuaykgewogICAgICAgIHJldHVybiBjb21wdXRlQ2h1bmtCb3VuZHModGhpcywgY2h1bmspOwogICAgICB9CiAgICB9OwogICAgVm9sdW1lQ2h1bmtTb3VyY2UucHJvdG90eXBlLmNodW5rQ29uc3RydWN0b3IgPSBWb2x1bWVDaHVuazsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3V0aWwvc3RyaW5nLnRzCiAgICBmdW5jdGlvbiBkZWZhdWx0U3RyaW5nQ29tcGFyZShhLCBiKSB7CiAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgIH0KCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2RhdGFzb3VyY2UvYnJhaW5tYXBzL2JhY2tlbmQudHMKICAgIHZhciBDSFVOS19ERUNPREVSUyA9IG5ldyBNYXAoWwogICAgICBbCiAgICAgICAgVm9sdW1lQ2h1bmtFbmNvZGluZy5SQVcsCiAgICAgICAgZGVjb2RlUmF3Q2h1bmsKICAgICAgXSwKICAgICAgW1ZvbHVtZUNodW5rRW5jb2RpbmcuSlBFRywgZGVjb2RlSnBlZ0NodW5rXSwKICAgICAgWwogICAgICAgIFZvbHVtZUNodW5rRW5jb2RpbmcuQ09NUFJFU1NFRF9TRUdNRU5UQVRJT04sCiAgICAgICAgZGVjb2RlQ29tcHJlc3NlZFNlZ21lbnRhdGlvbkNodW5rCiAgICAgIF0KICAgIF0pOwogICAgZnVuY3Rpb24gYXBwbHlDaGFuZ2VTdGFjayhjaGFuZ2VTdGFjaywgcGF5bG9hZCkgewogICAgICBpZiAoIWNoYW5nZVN0YWNrKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHBheWxvYWQuY2hhbmdlX3NwZWMgPSB7CiAgICAgICAgY2hhbmdlX3N0YWNrX2lkOiBjaGFuZ2VTdGFjay5jaGFuZ2VTdGFja0lkCiAgICAgIH07CiAgICAgIGlmIChjaGFuZ2VTdGFjay50aW1lU3RhbXApIHsKICAgICAgICBwYXlsb2FkLmNoYW5nZV9zcGVjLnRpbWVfc3RhbXAgPSBjaGFuZ2VTdGFjay50aW1lU3RhbXA7CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZVN0YWNrLnNraXBFcXVpdmFsZW5jZXMpIHsKICAgICAgICBwYXlsb2FkLmNoYW5nZV9zcGVjLnNraXBfZXF1aXZhbGVuY2VzID0gY2hhbmdlU3RhY2suc2tpcEVxdWl2YWxlbmNlczsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gQnJhaW5tYXBzU291cmNlKEJhc2UsIHBhcmFtZXRlcnNDb25zdHJ1Y3RvcikgewogICAgICByZXR1cm4gV2l0aFBhcmFtZXRlcnMoV2l0aFNoYXJlZENyZWRlbnRpYWxzUHJvdmlkZXJDb3VudGVycGFydCgpKEJhc2UpLCBwYXJhbWV0ZXJzQ29uc3RydWN0b3IpOwogICAgfQogICAgdmFyIHRlbXBVaW50NjQzID0gbmV3IFVpbnQ2NCgpOwogICAgdmFyIEJyYWlubWFwc1ZvbHVtZUNodW5rU291cmNlID0gY2xhc3MgZXh0ZW5kcyBCcmFpbm1hcHNTb3VyY2UoVm9sdW1lQ2h1bmtTb3VyY2UsIFZvbHVtZVNvdXJjZVBhcmFtZXRlcnMpIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICB0aGlzLmNodW5rRGVjb2RlciA9IENIVU5LX0RFQ09ERVJTLmdldCh0aGlzLnBhcmFtZXRlcnMuZW5jb2RpbmcpOwogICAgICB9CiAgICAgIGFwcGx5RW5jb2RpbmdQYXJhbXMocGF5bG9hZCkgewogICAgICAgIGxldCB7IGVuY29kaW5nIH0gPSB0aGlzLnBhcmFtZXRlcnM7CiAgICAgICAgc3dpdGNoIChlbmNvZGluZykgewogICAgICAgICAgY2FzZSBWb2x1bWVDaHVua0VuY29kaW5nLlJBVzoKICAgICAgICAgICAgcGF5bG9hZC5zdWJ2b2x1bWVfZm9ybWF0ID0gIlJBVyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWb2x1bWVDaHVua0VuY29kaW5nLkpQRUc6CiAgICAgICAgICAgIHBheWxvYWQuc3Vidm9sdW1lX2Zvcm1hdCA9ICJTSU5HTEVfSU1BR0UiOwogICAgICAgICAgICBwYXlsb2FkLmltYWdlX2Zvcm1hdF9vcHRpb25zID0gewogICAgICAgICAgICAgIGltYWdlX2Zvcm1hdDogIkpQRUciLAogICAgICAgICAgICAgIGpwZWdfcXVhbGl0eTogdGhpcy5wYXJhbWV0ZXJzLmpwZWdRdWFsaXR5CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNhc2UgVm9sdW1lQ2h1bmtFbmNvZGluZy5DT01QUkVTU0VEX1NFR01FTlRBVElPTjoKICAgICAgICAgICAgcGF5bG9hZC5zdWJ2b2x1bWVfZm9ybWF0ID0gIlJBVyI7CiAgICAgICAgICAgIHBheWxvYWQuaW1hZ2VfZm9ybWF0X29wdGlvbnMgPSB7CiAgICAgICAgICAgICAgY29tcHJlc3NlZF9zZWdtZW50YXRpb25fYmxvY2tfc2l6ZTogdmVjM0tleSh0aGlzLnNwZWMuY29tcHJlc3NlZFNlZ21lbnRhdGlvbkJsb2NrU2l6ZSkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGRvd25sb2FkKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgIGxldCB7IHBhcmFtZXRlcnMgfSA9IHRoaXM7CiAgICAgICAgbGV0IHBhdGg7CiAgICAgICAgbGV0IGNodW5rUG9zaXRpb24gPSB0aGlzLmNvbXB1dGVDaHVua0JvdW5kcyhjaHVuayk7CiAgICAgICAgbGV0IGNodW5rRGF0YVNpemUgPSBjaHVuay5jaHVua0RhdGFTaXplOwogICAgICAgIHBhdGggPSBgL3YxL3ZvbHVtZXMvJHtwYXJhbWV0ZXJzWyJ2b2x1bWVJZCJdfS9zdWJ2b2x1bWU6YmluYXJ5YDsKICAgICAgICBsZXQgcGF5bG9hZCA9IHsKICAgICAgICAgIGdlb21ldHJ5OiB7CiAgICAgICAgICAgIGNvcm5lcjogdmVjM0tleShjaHVua1Bvc2l0aW9uKSwKICAgICAgICAgICAgc2l6ZTogdmVjM0tleShjaHVua0RhdGFTaXplKSwKICAgICAgICAgICAgc2NhbGU6IHBhcmFtZXRlcnMuc2NhbGVJbmRleAogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdGhpcy5hcHBseUVuY29kaW5nUGFyYW1zKHBheWxvYWQpOwogICAgICAgIGFwcGx5Q2hhbmdlU3RhY2socGFyYW1ldGVycy5jaGFuZ2VTcGVjLCBwYXlsb2FkKTsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0KHBhcmFtZXRlcnNbImluc3RhbmNlIl0sIHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgewogICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICBwYXlsb2FkOiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSwKICAgICAgICAgIHBhdGgsCiAgICAgICAgICByZXNwb25zZVR5cGU6ICJhcnJheWJ1ZmZlciIKICAgICAgICB9LCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgYXdhaXQgdGhpcy5jaHVua0RlY29kZXIoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuLCByZXNwb25zZSk7CiAgICAgIH0KICAgIH07CiAgICBCcmFpbm1hcHNWb2x1bWVDaHVua1NvdXJjZSA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KCkKICAgIF0sIEJyYWlubWFwc1ZvbHVtZUNodW5rU291cmNlKTsKICAgIGZ1bmN0aW9uIGdldEZyYWdtZW50Q29ybmVyKGZyYWdtZW50SWQsIHhCaXRzLCB5Qml0cywgekJpdHMpIHsKICAgICAgY29uc3QgaWQgPSBuZXcgVWludDY0KCk7CiAgICAgIGlmICghaWQudHJ5UGFyc2VTdHJpbmcoZnJhZ21lbnRJZCwgMTYpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBwYXJzZSBmcmFnbWVudElkICR7ZnJhZ21lbnRJZH0gYXMgaGV4LWVuY29kZWQgVWludDY0YCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGRlY29kZVpJbmRleENvbXByZXNzZWQoaWQsIHhCaXRzLCB5Qml0cywgekJpdHMpOwogICAgfQogICAgZnVuY3Rpb24gZGVjb2RlTXVsdGlzY2FsZU1hbmlmZXN0Q2h1bmsoY2h1bmssIHJlc3BvbnNlKSB7CiAgICAgIHZlcmlmeU9iamVjdChyZXNwb25zZSk7CiAgICAgIGNvbnN0IHNvdXJjZSA9IGNodW5rLnNvdXJjZTsKICAgICAgY29uc3QgZnJhZ21lbnRLZXlzID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkocmVzcG9uc2UsICJmcmFnbWVudEtleSIsIHZlcmlmeVN0cmluZ0FycmF5KTsKICAgICAgY29uc3Qgc3VwZXJ2b3hlbElkcyA9IHZlcmlmeU9iamVjdFByb3BlcnR5KHJlc3BvbnNlLCAic3VwZXJ2b3hlbElkIiwgdmVyaWZ5U3RyaW5nQXJyYXkpOwogICAgICBjb25zdCBsZW5ndGg0ID0gZnJhZ21lbnRLZXlzLmxlbmd0aDsKICAgICAgaWYgKGxlbmd0aDQgIT09IHN1cGVydm94ZWxJZHMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBmcmFnbWVudEtleSBhbmQgc3VwZXJ2b3hlbElkIGFycmF5cyB0byBoYXZlIHRoZSBzYW1lIGxlbmd0aC4iKTsKICAgICAgfQogICAgICBjb25zdCBmcmFnbWVudFN1cGVydm94ZWxJZHMgPSBuZXcgTWFwKCk7CiAgICAgIGZyYWdtZW50S2V5cy5mb3JFYWNoKChmcmFnbWVudElkLCBpKSA9PiB7CiAgICAgICAgbGV0IGlkcyA9IGZyYWdtZW50U3VwZXJ2b3hlbElkcy5nZXQoZnJhZ21lbnRJZCk7CiAgICAgICAgaWYgKGlkcyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBpZHMgPSBbXTsKICAgICAgICAgIGZyYWdtZW50U3VwZXJ2b3hlbElkcy5zZXQoZnJhZ21lbnRJZCwgaWRzKTsKICAgICAgICB9CiAgICAgICAgaWRzLnB1c2goc3VwZXJ2b3hlbElkc1tpXSk7CiAgICAgIH0pOwogICAgICBjb25zdCB7IGNodW5rU2hhcGUgfSA9IHNvdXJjZS5wYXJhbWV0ZXJzLmluZm87CiAgICAgIGNvbnN0IGdyaWRTaGFwZSA9IHNvdXJjZS5wYXJhbWV0ZXJzLmluZm8ubG9kc1swXS5ncmlkU2hhcGU7CiAgICAgIGNvbnN0IHhCaXRzID0gTWF0aC5jZWlsKE1hdGgubG9nMihncmlkU2hhcGVbMF0pKSwgeUJpdHMgPSBNYXRoLmNlaWwoTWF0aC5sb2cyKGdyaWRTaGFwZVsxXSkpLCB6Qml0cyA9IE1hdGguY2VpbChNYXRoLmxvZzIoZ3JpZFNoYXBlWzJdKSk7CiAgICAgIGNvbnN0IGZyYWdtZW50SWRBbmRDb3JuZXJzID0gQXJyYXkuZnJvbShmcmFnbWVudFN1cGVydm94ZWxJZHMuZW50cmllcygpKS5tYXAoKFtpZCwgc3VwZXJ2b3hlbElkczJdKSA9PiAoewogICAgICAgIGZyYWdtZW50SWQ6IGlkLAogICAgICAgIGNvcm5lcjogZ2V0RnJhZ21lbnRDb3JuZXIoaWQsIHhCaXRzLCB5Qml0cywgekJpdHMpLAogICAgICAgIHN1cGVydm94ZWxJZHM6IHN1cGVydm94ZWxJZHMyCiAgICAgIH0pKTsKICAgICAgZnJhZ21lbnRJZEFuZENvcm5lcnMuc29ydCgoYSwgYikgPT4gewogICAgICAgIHJldHVybiB6b3JkZXIzTGVzc1RoYW4oYS5jb3JuZXJbMF0sIGEuY29ybmVyWzFdLCBhLmNvcm5lclsyXSwgYi5jb3JuZXJbMF0sIGIuY29ybmVyWzFdLCBiLmNvcm5lclsyXSkgPyAtMSA6IDE7CiAgICAgIH0pOwogICAgICBsZXQgY2xpcExvd2VyQm91bmQsIGNsaXBVcHBlckJvdW5kOwogICAgICBsZXQgbWluTnVtTG9kcyA9IDA7CiAgICAgIGxldCBvY3RyZWU7CiAgICAgIGlmIChsZW5ndGg0ID09PSAwKSB7CiAgICAgICAgY2xpcExvd2VyQm91bmQgPSBjbGlwVXBwZXJCb3VuZCA9IGtaZXJvVmVjOwogICAgICAgIG9jdHJlZSA9IFVpbnQzMkFycmF5Lm9mKDAsIDAsIDAsIDAsIDIxNDc0ODM2NDgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG1pbkNvb3JkID0gdmVjM19leHBvcnRzLmNsb25lKGtJbmZpbml0eVZlYyk7CiAgICAgICAgY29uc3QgbWF4Q29vcmQgPSB2ZWMzX2V4cG9ydHMuY2xvbmUoa1plcm9WZWMpOwogICAgICAgIGZyYWdtZW50SWRBbmRDb3JuZXJzLmZvckVhY2goKHgpID0+IHsKICAgICAgICAgIGNvbnN0IHsgY29ybmVyIH0gPSB4OwogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgICAgICAgbWluQ29vcmRbaV0gPSBNYXRoLm1pbihtaW5Db29yZFtpXSwgY29ybmVyW2ldKTsKICAgICAgICAgICAgbWF4Q29vcmRbaV0gPSBNYXRoLm1heChtYXhDb29yZFtpXSwgY29ybmVyW2ldKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBtaW5OdW1Mb2RzID0gMTsKICAgICAgICB3aGlsZSAobWF4Q29vcmRbMF0gPj4+IG1pbk51bUxvZHMgLSAxICE9IG1pbkNvb3JkWzBdID4+PiBtaW5OdW1Mb2RzIC0gMSB8fCBtYXhDb29yZFsxXSA+Pj4gbWluTnVtTG9kcyAtIDEgIT0gbWluQ29vcmRbMV0gPj4+IG1pbk51bUxvZHMgLSAxIHx8IG1heENvb3JkWzJdID4+PiBtaW5OdW1Mb2RzIC0gMSAhPSBtaW5Db29yZFsyXSA+Pj4gbWluTnVtTG9kcyAtIDEpIHsKICAgICAgICAgICsrbWluTnVtTG9kczsKICAgICAgICB9CiAgICAgICAgY2xpcExvd2VyQm91bmQgPSB2ZWMzX2V4cG9ydHMubXVsdGlwbHkobWluQ29vcmQsIG1pbkNvb3JkLCBjaHVua1NoYXBlKTsKICAgICAgICBjbGlwVXBwZXJCb3VuZCA9IHZlYzNfZXhwb3J0cy5hZGQobWF4Q29vcmQsIHZlYzNfZXhwb3J0cy5tdWx0aXBseShtYXhDb29yZCwgbWF4Q29vcmQsIGNodW5rU2hhcGUpLCBjaHVua1NoYXBlKTsKICAgICAgfQogICAgICBjb25zdCB7IGxvZHMgfSA9IHNvdXJjZS5wYXJhbWV0ZXJzLmluZm87CiAgICAgIGNvbnN0IGxvZFNjYWxlcyA9IG5ldyBGbG9hdDMyQXJyYXkoTWF0aC5tYXgobG9kcy5sZW5ndGgsIG1pbk51bUxvZHMpKTsKICAgICAgZm9yIChsZXQgbG9kSW5kZXggPSAwOyBsb2RJbmRleCA8IGxvZHMubGVuZ3RoOyArK2xvZEluZGV4KSB7CiAgICAgICAgbG9kU2NhbGVzW2xvZEluZGV4XSA9IGxvZHNbbG9kSW5kZXhdLnNjYWxlOwogICAgICB9CiAgICAgIGlmIChsZW5ndGg0ICE9PSAwKSB7CiAgICAgICAgY29uc3Qgb2N0cmVlVGVtcCA9IG5ldyBVaW50MzJBcnJheShmcmFnbWVudElkQW5kQ29ybmVycy5sZW5ndGggKiBsb2RTY2FsZXMubGVuZ3RoICogNSk7CiAgICAgICAgZnJhZ21lbnRJZEFuZENvcm5lcnMuZm9yRWFjaCgoeCwgaSkgPT4gewogICAgICAgICAgb2N0cmVlVGVtcC5zZXQoeC5jb3JuZXIsIGkgKiA1KTsKICAgICAgICAgIG9jdHJlZVRlbXBbaSAqIDVdID0geC5jb3JuZXJbMF07CiAgICAgICAgfSk7CiAgICAgICAgbGV0IHByaW9yU3RhcnQgPSAwOwogICAgICAgIGxldCBwcmlvckVuZCA9IGZyYWdtZW50SWRBbmRDb3JuZXJzLmxlbmd0aDsKICAgICAgICBmb3IgKGxldCBsb2QgPSAxOyBsb2QgPCBsb2RTY2FsZXMubGVuZ3RoOyArK2xvZCkgewogICAgICAgICAgY29uc3QgY3VyRW5kID0gZ2VuZXJhdGVIaWdoZXJPY3RyZWVMZXZlbChvY3RyZWVUZW1wLCBwcmlvclN0YXJ0LCBwcmlvckVuZCk7CiAgICAgICAgICBwcmlvclN0YXJ0ID0gcHJpb3JFbmQ7CiAgICAgICAgICBwcmlvckVuZCA9IGN1ckVuZDsKICAgICAgICB9CiAgICAgICAgb2N0cmVlID0gb2N0cmVlVGVtcC5zbGljZSgwLCBwcmlvckVuZCAqIDUpOwogICAgICB9CiAgICAgIGNvbnN0IG1hbmlmZXN0ID0gewogICAgICAgIGNodW5rU2hhcGUsCiAgICAgICAgY2h1bmtHcmlkU3BhdGlhbE9yaWdpbjoga1plcm9WZWMsCiAgICAgICAgY2xpcExvd2VyQm91bmQsCiAgICAgICAgY2xpcFVwcGVyQm91bmQsCiAgICAgICAgb2N0cmVlLAogICAgICAgIGxvZFNjYWxlcywKICAgICAgICB2ZXJ0ZXhPZmZzZXRzOiBuZXcgRmxvYXQzMkFycmF5KGxvZFNjYWxlcy5sZW5ndGggKiAzKQogICAgICB9OwogICAgICBjaHVuay5tYW5pZmVzdCA9IG1hbmlmZXN0OwogICAgICBjaHVuay5mcmFnbWVudFN1cGVydm94ZWxJZHMgPSBmcmFnbWVudElkQW5kQ29ybmVyczsKICAgIH0KICAgIHZhciBtYXhNZXNoQmF0Y2hTaXplID0gMjU1OwogICAgZnVuY3Rpb24gZGVjb2RlQmF0Y2hNZXNoUmVzcG9uc2UocmVzcG9uc2UsIGNhbGxiYWNrKSB7CiAgICAgIGxldCBsZW5ndGg0ID0gcmVzcG9uc2UuYnl0ZUxlbmd0aDsKICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcocmVzcG9uc2UpOwogICAgICBjb25zdCBoZWFkZXJTaXplID0gOCArIDggKyA4ICsgODsKICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoNCkgewogICAgICAgIGlmIChpbmRleCArIGhlYWRlclNpemUgPiBsZW5ndGg0KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYmF0Y2ggbWVzaCBmcmFnbWVudCByZXNwb25zZS5gKTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb2JqZWN0SWRMb3cgPSBkYXRhVmlldy5nZXRVaW50MzIoaW5kZXgsIHRydWUpOwogICAgICAgIGNvbnN0IG9iamVjdElkSGlnaCA9IGRhdGFWaWV3LmdldFVpbnQzMihpbmRleCArIDQsIHRydWUpOwogICAgICAgIGNvbnN0IG9iamVjdElkU3RyaW5nID0gbmV3IFVpbnQ2NChvYmplY3RJZExvdywgb2JqZWN0SWRIaWdoKS50b1N0cmluZygpOwogICAgICAgIGNvbnN0IHByZWZpeCA9IG9iamVjdElkU3RyaW5nICsgIlwwIjsKICAgICAgICBpbmRleCArPSA4OwogICAgICAgIGNvbnN0IGZyYWdtZW50S2V5TGVuZ3RoID0gZGF0YVZpZXcuZ2V0VWludDMyKGluZGV4LCB0cnVlKTsKICAgICAgICBjb25zdCBmcmFnbWVudEtleUxlbmd0aEhpZ2ggPSBkYXRhVmlldy5nZXRVaW50MzIoaW5kZXggKyA0LCB0cnVlKTsKICAgICAgICBpbmRleCArPSA4OwogICAgICAgIGlmIChmcmFnbWVudEtleUxlbmd0aEhpZ2ggIT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiYXRjaCBtZXNoIGZyYWdtZW50IHJlc3BvbnNlLmApOwogICAgICAgIH0KICAgICAgICBpZiAoaW5kZXggKyBmcmFnbWVudEtleUxlbmd0aCArIDggKyA4ID4gbGVuZ3RoNCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGJhdGNoIG1lc2ggZnJhZ21lbnQgcmVzcG9uc2UuYCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZyYWdtZW50S2V5ID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlLCBpbmRleCwgZnJhZ21lbnRLZXlMZW5ndGgpKTsKICAgICAgICBjb25zdCBmdWxsS2V5ID0gcHJlZml4ICsgZnJhZ21lbnRLZXk7CiAgICAgICAgaW5kZXggKz0gZnJhZ21lbnRLZXlMZW5ndGg7CiAgICAgICAgY29uc3QgbnVtVmVydGljZXMgPSBkYXRhVmlldy5nZXRVaW50MzIoaW5kZXgsIHRydWUpOwogICAgICAgIGNvbnN0IG51bVZlcnRpY2VzSGlnaCA9IGRhdGFWaWV3LmdldFVpbnQzMihpbmRleCArIDQsIHRydWUpOwogICAgICAgIGluZGV4ICs9IDg7CiAgICAgICAgY29uc3QgbnVtVHJpYW5nbGVzID0gZGF0YVZpZXcuZ2V0VWludDMyKGluZGV4LCB0cnVlKTsKICAgICAgICBjb25zdCBudW1UcmlhbmdsZXNIaWdoID0gZGF0YVZpZXcuZ2V0VWludDMyKGluZGV4ICsgNCwgdHJ1ZSk7CiAgICAgICAgaW5kZXggKz0gODsKICAgICAgICBpZiAobnVtVmVydGljZXNIaWdoICE9PSAwIHx8IG51bVRyaWFuZ2xlc0hpZ2ggIT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiYXRjaCBtZXNoIGZyYWdtZW50IHJlc3BvbnNlLmApOwogICAgICAgIH0KICAgICAgICBjb25zdCBlbmRPZmZzZXQgPSBpbmRleCArIG51bVRyaWFuZ2xlcyAqIDEyICsgbnVtVmVydGljZXMgKiAxMjsKICAgICAgICBpZiAoZW5kT2Zmc2V0ID4gbGVuZ3RoNCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGJhdGNoIG1lc2ggZnJhZ21lbnQgcmVzcG9uc2UuYCk7CiAgICAgICAgfQogICAgICAgIGNhbGxiYWNrKHsKICAgICAgICAgIGZ1bGxLZXksCiAgICAgICAgICBidWZmZXI6IHJlc3BvbnNlLAogICAgICAgICAgdmVydGljZXNPZmZzZXQ6IGluZGV4LAogICAgICAgICAgbnVtVmVydGljZXMsCiAgICAgICAgICBpbmRpY2VzT2Zmc2V0OiBpbmRleCArIDEyICogbnVtVmVydGljZXMsCiAgICAgICAgICBudW1JbmRpY2VzOiBudW1UcmlhbmdsZXMgKiAzCiAgICAgICAgfSk7CiAgICAgICAgaW5kZXggPSBlbmRPZmZzZXQ7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNvbWJpbmVCYXRjaE1lc2hGcmFnbWVudHMoZnJhZ21lbnRzKSB7CiAgICAgIGxldCB0b3RhbFZlcnRpY2VzID0gMCwgdG90YWxJbmRpY2VzID0gMDsKICAgICAgZm9yIChsZXQgZnJhZ21lbnQgb2YgZnJhZ21lbnRzKSB7CiAgICAgICAgdG90YWxWZXJ0aWNlcyArPSBmcmFnbWVudC5udW1WZXJ0aWNlczsKICAgICAgICB0b3RhbEluZGljZXMgKz0gZnJhZ21lbnQubnVtSW5kaWNlczsKICAgICAgfQogICAgICBjb25zdCB2ZXJ0ZXhCdWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KHRvdGFsVmVydGljZXMgKiAzKTsKICAgICAgY29uc3QgaW5kZXhCdWZmZXIgPSBuZXcgVWludDMyQXJyYXkodG90YWxJbmRpY2VzKTsKICAgICAgbGV0IHZlcnRleE9mZnNldCA9IDA7CiAgICAgIGxldCBpbmRleE9mZnNldCA9IDA7CiAgICAgIGZvciAoY29uc3QgZnJhZ21lbnQgb2YgZnJhZ21lbnRzKSB7CiAgICAgICAgdmVydGV4QnVmZmVyLnNldChuZXcgRmxvYXQzMkFycmF5KGZyYWdtZW50LmJ1ZmZlciwgZnJhZ21lbnQudmVydGljZXNPZmZzZXQsIGZyYWdtZW50Lm51bVZlcnRpY2VzICogMyksIHZlcnRleE9mZnNldCAqIDMpOwogICAgICAgIGNvbnN0IHsgbnVtSW5kaWNlcyB9ID0gZnJhZ21lbnQ7CiAgICAgICAgY29uc3Qgc291cmNlSW5kaWNlcyA9IG5ldyBVaW50MzJBcnJheShmcmFnbWVudC5idWZmZXIsIGZyYWdtZW50LmluZGljZXNPZmZzZXQsIG51bUluZGljZXMpOwogICAgICAgIGNvbnZlcnRFbmRpYW4zMihzb3VyY2VJbmRpY2VzLCBFbmRpYW5uZXNzLkxJVFRMRSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1JbmRpY2VzOyArK2kpIHsKICAgICAgICAgIGluZGV4QnVmZmVyW2luZGV4T2Zmc2V0KytdID0gc291cmNlSW5kaWNlc1tpXSArIHZlcnRleE9mZnNldDsKICAgICAgICB9CiAgICAgICAgdmVydGV4T2Zmc2V0ICs9IGZyYWdtZW50Lm51bVZlcnRpY2VzOwogICAgICB9CiAgICAgIGNvbnZlcnRFbmRpYW4zMih2ZXJ0ZXhCdWZmZXIsIEVuZGlhbm5lc3MuTElUVExFKTsKICAgICAgcmV0dXJuIHsgdmVydGV4UG9zaXRpb25zOiB2ZXJ0ZXhCdWZmZXIsIGluZGljZXM6IGluZGV4QnVmZmVyIH07CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBtYWtlQmF0Y2hNZXNoUmVxdWVzdChjcmVkZW50aWFsc1Byb3ZpZGVyLCBwYXJhbWV0ZXJzLCBpZHMsIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgIGNvbnN0IHBhdGggPSBgL3YxL29iamVjdHMvbWVzaGVzOmJhdGNoYDsKICAgICAgY29uc3QgYmF0Y2hlcyA9IFtdOwogICAgICBsZXQgcHJldk9iamVjdElkOwogICAgICBsZXQgYmF0Y2hTaXplID0gMDsKICAgICAgY29uc3QgcGVuZGluZ0lkcyA9IG5ldyBNYXAoKTsKICAgICAgZm9yIChjb25zdCBbaWQsIGlkRGF0YV0gb2YgaWRzKSB7CiAgICAgICAgcGVuZGluZ0lkcy5zZXQoaWQsIGlkRGF0YSk7CiAgICAgICAgaWRzLmRlbGV0ZShpZCk7CiAgICAgICAgY29uc3Qgc3BsaXRJbmRleCA9IGlkLmluZGV4T2YoIlwwIik7CiAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSBpZC5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCk7CiAgICAgICAgY29uc3QgZnJhZ21lbnRJZCA9IGlkLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSk7CiAgICAgICAgaWYgKG9iamVjdElkICE9PSBwcmV2T2JqZWN0SWQpIHsKICAgICAgICAgIGJhdGNoZXMucHVzaCh7IG9iamVjdF9pZDogb2JqZWN0SWQsIGZyYWdtZW50X2tleXM6IFtdIH0pOwogICAgICAgIH0KICAgICAgICBiYXRjaGVzW2JhdGNoZXMubGVuZ3RoIC0gMV0uZnJhZ21lbnRfa2V5cy5wdXNoKGZyYWdtZW50SWQpOwogICAgICAgIGlmICgrK2JhdGNoU2l6ZSA9PT0gbWF4TWVzaEJhdGNoU2l6ZSkKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNvbnN0IHBheWxvYWQgPSB7CiAgICAgICAgdm9sdW1lX2lkOiBwYXJhbWV0ZXJzLnZvbHVtZUlkLAogICAgICAgIG1lc2hfbmFtZTogcGFyYW1ldGVycy5tZXNoTmFtZSwKICAgICAgICBiYXRjaGVzCiAgICAgIH07CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IG1ha2VSZXF1ZXN0KHBhcmFtZXRlcnNbImluc3RhbmNlIl0sIGNyZWRlbnRpYWxzUHJvdmlkZXIsIHsKICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgcGF0aCwKICAgICAgICAgIHBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLAogICAgICAgICAgcmVzcG9uc2VUeXBlOiAiYXJyYXlidWZmZXIiCiAgICAgICAgfSwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGZvciAoY29uc3QgW2lkLCBpZERhdGFdIG9mIHBlbmRpbmdJZHMpIHsKICAgICAgICAgIGlkcy5zZXQoaWQsIGlkRGF0YSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB2YXIgQnJhaW5tYXBzTXVsdGlzY2FsZU1lc2hTb3VyY2UgPSBjbGFzcyBleHRlbmRzIEJyYWlubWFwc1NvdXJjZShNdWx0aXNjYWxlTWVzaFNvdXJjZSwgTXVsdGlzY2FsZU1lc2hTb3VyY2VQYXJhbWV0ZXJzKSB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5saXN0RnJhZ21lbnRzUGFyYW1zID0gKCgpID0+IHsKICAgICAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyB9ID0gdGhpczsKICAgICAgICAgIGNvbnN0IHsgY2hhbmdlU3BlYyB9ID0gcGFyYW1ldGVyczsKICAgICAgICAgIGlmIChjaGFuZ2VTcGVjICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgcmV0dXJuIGAmaGVhZGVyLmNoYW5nZVN0YWNrSWQ9JHtjaGFuZ2VTcGVjLmNoYW5nZVN0YWNrSWR9YDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9KSgpOwogICAgICB9CiAgICAgIGRvd25sb2FkKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgIGxldCB7IHBhcmFtZXRlcnMgfSA9IHRoaXM7CiAgICAgICAgY29uc3QgcGF0aCA9IGAvdjEvb2JqZWN0cy8ke3BhcmFtZXRlcnNbInZvbHVtZUlkIl19L21lc2hlcy8ke3BhcmFtZXRlcnMuaW5mby5sb2RzWzBdLmluZm8ubmFtZX06bGlzdGZyYWdtZW50cz9vYmplY3RfaWQ9JHtjaHVuay5vYmplY3RJZH0mcmV0dXJuX3N1cGVydm94ZWxfaWRzPXRydWVgICsgdGhpcy5saXN0RnJhZ21lbnRzUGFyYW1zOwogICAgICAgIHJldHVybiBtYWtlUmVxdWVzdChwYXJhbWV0ZXJzWyJpbnN0YW5jZSJdLCB0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIsIHsKICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICBwYXRoLAogICAgICAgICAgcmVzcG9uc2VUeXBlOiAianNvbiIKICAgICAgICB9LCBjYW5jZWxsYXRpb25Ub2tlbikudGhlbigocmVzcG9uc2UpID0+IGRlY29kZU11bHRpc2NhbGVNYW5pZmVzdENodW5rKGNodW5rLCByZXNwb25zZSkpOwogICAgICB9CiAgICAgIGFzeW5jIGRvd25sb2FkRnJhZ21lbnQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGNvbnN0IG1hbmlmZXN0Q2h1bmsgPSBjaHVuay5tYW5pZmVzdENodW5rOwogICAgICAgIGNvbnN0IHsgZnJhZ21lbnRTdXBlcnZveGVsSWRzIH0gPSBtYW5pZmVzdENodW5rOwogICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gbWFuaWZlc3RDaHVuay5tYW5pZmVzdDsKICAgICAgICBjb25zdCB7IGxvZCB9ID0gY2h1bms7CiAgICAgICAgY29uc3QgeyBvY3RyZWUgfSA9IG1hbmlmZXN0OwogICAgICAgIGNvbnN0IG51bUJhc2VDaHVua3MgPSBmcmFnbWVudFN1cGVydm94ZWxJZHMubGVuZ3RoOwogICAgICAgIGNvbnN0IHJvdyA9IGNodW5rLmNodW5rSW5kZXg7CiAgICAgICAgbGV0IHN0YXJ0Q2h1bmtJbmRleCA9IHJvdzsKICAgICAgICB3aGlsZSAoc3RhcnRDaHVua0luZGV4ID49IG51bUJhc2VDaHVua3MpIHsKICAgICAgICAgIHN0YXJ0Q2h1bmtJbmRleCA9IG9jdHJlZVtzdGFydENodW5rSW5kZXggKiA1ICsgM107CiAgICAgICAgfQogICAgICAgIGxldCBlbmRDaHVua0luZGV4ID0gcm93ICsgMTsKICAgICAgICB3aGlsZSAoZW5kQ2h1bmtJbmRleCA+IG51bUJhc2VDaHVua3MpIHsKICAgICAgICAgIGVuZENodW5rSW5kZXggPSBvY3RyZWVbZW5kQ2h1bmtJbmRleCAqIDUgLSAxXSAmIDIxNDc0ODM2NDc7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsgcmVsYXRpdmVCbG9ja1NoYXBlLCBncmlkU2hhcGUgfSA9IHBhcmFtZXRlcnMuaW5mby5sb2RzW2xvZF07CiAgICAgICAgY29uc3QgeEJpdHMgPSBNYXRoLmNlaWwoTWF0aC5sb2cyKGdyaWRTaGFwZVswXSkpLCB5Qml0cyA9IE1hdGguY2VpbChNYXRoLmxvZzIoZ3JpZFNoYXBlWzFdKSksIHpCaXRzID0gTWF0aC5jZWlsKE1hdGgubG9nMihncmlkU2hhcGVbMl0pKTsKICAgICAgICBsZXQgaWRzID0gbmV3IE1hcCgpOwogICAgICAgIGZvciAobGV0IGNodW5rSW5kZXggPSBzdGFydENodW5rSW5kZXg7IGNodW5rSW5kZXggPCBlbmRDaHVua0luZGV4OyArK2NodW5rSW5kZXgpIHsKICAgICAgICAgIGNvbnN0IGdyaWRYID0gTWF0aC5mbG9vcihvY3RyZWVbY2h1bmtJbmRleCAqIDVdIC8gcmVsYXRpdmVCbG9ja1NoYXBlWzBdKSwgZ3JpZFkgPSBNYXRoLmZsb29yKG9jdHJlZVtjaHVua0luZGV4ICogNSArIDFdIC8gcmVsYXRpdmVCbG9ja1NoYXBlWzFdKSwgZ3JpZFogPSBNYXRoLmZsb29yKG9jdHJlZVtjaHVua0luZGV4ICogNSArIDJdIC8gcmVsYXRpdmVCbG9ja1NoYXBlWzJdKTsKICAgICAgICAgIGNvbnN0IGZyYWdtZW50S2V5ID0gZW5jb2RlWkluZGV4Q29tcHJlc3NlZDNkKHRlbXBVaW50NjQzLCB4Qml0cywgeUJpdHMsIHpCaXRzLCBncmlkWCwgZ3JpZFksIGdyaWRaKS50b1N0cmluZygxNikucGFkU3RhcnQoMTYsICIwIik7CiAgICAgICAgICBjb25zdCBlbnRyeSA9IGZyYWdtZW50U3VwZXJ2b3hlbElkc1tjaHVua0luZGV4XTsKICAgICAgICAgIGZvciAoY29uc3Qgc3VwZXJ2b3hlbElkIG9mIGVudHJ5LnN1cGVydm94ZWxJZHMpIHsKICAgICAgICAgICAgaWRzLnNldChzdXBlcnZveGVsSWQgKyAiXDAiICsgZnJhZ21lbnRLZXksIGNodW5rSW5kZXgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgcHJldkxvZCA9IE1hdGgubWF4KDAsIGxvZCAtIDEpOwogICAgICAgIGxldCBmcmFnbWVudHMgPSBbXTsKICAgICAgICBjb25zdCBpZEFycmF5ID0gQXJyYXkuZnJvbShpZHMpOwogICAgICAgIGlkQXJyYXkuc29ydCgoYSwgYikgPT4gZGVmYXVsdFN0cmluZ0NvbXBhcmUoYVswXSwgYlswXSkpOwogICAgICAgIGlkcyA9IG5ldyBNYXAoaWRBcnJheSk7CiAgICAgICAgY29uc3QgbWVzaE5hbWUgPSBwYXJhbWV0ZXJzLmluZm8ubG9kc1tsb2RdLmluZm8ubmFtZTsKICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICBsZXQgcmVxdWVzdHNJblByb2dyZXNzID0gMDsKICAgICAgICAgIGxldCBlcnJvciA9IGZhbHNlOwogICAgICAgICAgY29uc3QgbWF5YmVJc3N1ZU1vcmVSZXF1ZXN0cyA9ICgpID0+IHsKICAgICAgICAgICAgaWYgKGVycm9yKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgd2hpbGUgKGlkcy5zaXplICE9PSAwKSB7CiAgICAgICAgICAgICAgKytyZXF1ZXN0c0luUHJvZ3Jlc3M7CiAgICAgICAgICAgICAgbWFrZUJhdGNoTWVzaFJlcXVlc3QodGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCB7IGluc3RhbmNlOiBwYXJhbWV0ZXJzLmluc3RhbmNlLCB2b2x1bWVJZDogcGFyYW1ldGVycy52b2x1bWVJZCwgbWVzaE5hbWUgfSwgaWRzLCBjYW5jZWxsYXRpb25Ub2tlbikudGhlbigocmVzcG9uc2UpID0+IHsKICAgICAgICAgICAgICAgIC0tcmVxdWVzdHNJblByb2dyZXNzOwogICAgICAgICAgICAgICAgZGVjb2RlQmF0Y2hNZXNoUmVzcG9uc2UocmVzcG9uc2UsIChmcmFnbWVudCkgPT4gewogICAgICAgICAgICAgICAgICBjb25zdCBjaHVua0luZGV4ID0gaWRzLmdldChmcmFnbWVudC5mdWxsS2V5KTsKICAgICAgICAgICAgICAgICAgaWYgKCFpZHMuZGVsZXRlKGZyYWdtZW50LmZ1bGxLZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCB1bmV4cGVjdGVkIGZyYWdtZW50IGtleTogJHtKU09OLnN0cmluZ2lmeShmcmFnbWVudC5mdWxsS2V5KX0uYCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZnJhZ21lbnQuY2h1bmtJbmRleCA9IGNodW5rSW5kZXg7CiAgICAgICAgICAgICAgICAgIGZyYWdtZW50cy5wdXNoKGZyYWdtZW50KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWF5YmVJc3N1ZU1vcmVSZXF1ZXN0cygpOwogICAgICAgICAgICAgIH0pLmNhdGNoKChlKSA9PiB7CiAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICByZWplY3QoZSk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2h1bmsuZG93bmxvYWRTbG90cyA9IE1hdGgubWF4KDEsIHJlcXVlc3RzSW5Qcm9ncmVzcyk7CiAgICAgICAgICAgIGlmIChyZXF1ZXN0c0luUHJvZ3Jlc3MgPT09IDApIHsKICAgICAgICAgICAgICByZXNvbHZlKHZvaWQgMCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgbWF5YmVJc3N1ZU1vcmVSZXF1ZXN0cygpOwogICAgICAgIH0pOwogICAgICAgIGZyYWdtZW50cy5zb3J0KChhLCBiKSA9PiBhLmNodW5rSW5kZXggLSBiLmNodW5rSW5kZXgpOwogICAgICAgIGxldCBpbmRleE9mZnNldCA9IDA7CiAgICAgICAgY29uc3QgbnVtU3ViQ2h1bmtzID0gMSA8PCAzICogKGxvZCAtIHByZXZMb2QpOwogICAgICAgIGNvbnN0IHN1YkNodW5rT2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShudW1TdWJDaHVua3MgKyAxKTsKICAgICAgICBsZXQgcHJldlN1YkNodW5rSW5kZXggPSAwOwogICAgICAgIGZvciAoY29uc3QgZnJhZ21lbnQgb2YgZnJhZ21lbnRzKSB7CiAgICAgICAgICBjb25zdCByb3cyID0gZnJhZ21lbnQuY2h1bmtJbmRleDsKICAgICAgICAgIGNvbnN0IHN1YkNodW5rSW5kZXggPSBnZXRPY3RyZWVDaGlsZEluZGV4KG9jdHJlZVtyb3cyICogNV0gPj4+IHByZXZMb2QsIG9jdHJlZVtyb3cyICogNSArIDFdID4+PiBwcmV2TG9kLCBvY3RyZWVbcm93MiAqIDUgKyAyXSA+Pj4gcHJldkxvZCkgJiBudW1TdWJDaHVua3MgLSAxOwogICAgICAgICAgc3ViQ2h1bmtPZmZzZXRzLmZpbGwoaW5kZXhPZmZzZXQsIHByZXZTdWJDaHVua0luZGV4ICsgMSwgc3ViQ2h1bmtJbmRleCArIDEpOwogICAgICAgICAgcHJldlN1YkNodW5rSW5kZXggPSBzdWJDaHVua0luZGV4OwogICAgICAgICAgaW5kZXhPZmZzZXQgKz0gZnJhZ21lbnQubnVtSW5kaWNlczsKICAgICAgICB9CiAgICAgICAgc3ViQ2h1bmtPZmZzZXRzLmZpbGwoaW5kZXhPZmZzZXQsIHByZXZTdWJDaHVua0luZGV4ICsgMSwgbnVtU3ViQ2h1bmtzICsgMSk7CiAgICAgICAgYXNzaWduTXVsdGlzY2FsZU1lc2hGcmFnbWVudERhdGEoY2h1bmssIHsgLi4uY29tYmluZUJhdGNoTWVzaEZyYWdtZW50cyhmcmFnbWVudHMpLCBzdWJDaHVua09mZnNldHMgfSwgVmVydGV4UG9zaXRpb25Gb3JtYXQuZmxvYXQzMik7CiAgICAgIH0KICAgIH07CiAgICBCcmFpbm1hcHNNdWx0aXNjYWxlTWVzaFNvdXJjZSA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KCkKICAgIF0sIEJyYWlubWFwc011bHRpc2NhbGVNZXNoU291cmNlKTsKICAgIGZ1bmN0aW9uIGdyb3VwRnJhZ21lbnRzSW50b0JhdGNoZXMoaWRzKSB7CiAgICAgIGNvbnN0IGJhdGNoZXMgPSBbXTsKICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgY29uc3QgbGVuZ3RoNCA9IGlkcy5sZW5ndGg7CiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aDQpIHsKICAgICAgICBiYXRjaGVzLnB1c2goSlNPTi5zdHJpbmdpZnkoaWRzLnNsaWNlKGluZGV4LCBpbmRleCArIG1heE1lc2hCYXRjaFNpemUpKSk7CiAgICAgICAgaW5kZXggKz0gbWF4TWVzaEJhdGNoU2l6ZTsKICAgICAgfQogICAgICByZXR1cm4gYmF0Y2hlczsKICAgIH0KICAgIGZ1bmN0aW9uIGRlY29kZU1hbmlmZXN0Q2h1bmtXaXRoU3VwZXJ2b3hlbElkcyhjaHVuaywgcmVzcG9uc2UpIHsKICAgICAgdmVyaWZ5T2JqZWN0KHJlc3BvbnNlKTsKICAgICAgY29uc3QgZnJhZ21lbnRLZXlzID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkocmVzcG9uc2UsICJmcmFnbWVudEtleSIsIHZlcmlmeVN0cmluZ0FycmF5KTsKICAgICAgY29uc3Qgc3VwZXJ2b3hlbElkcyA9IHZlcmlmeU9iamVjdFByb3BlcnR5KHJlc3BvbnNlLCAic3VwZXJ2b3hlbElkIiwgdmVyaWZ5U3RyaW5nQXJyYXkpOwogICAgICBjb25zdCBsZW5ndGg0ID0gZnJhZ21lbnRLZXlzLmxlbmd0aDsKICAgICAgaWYgKGxlbmd0aDQgIT09IHN1cGVydm94ZWxJZHMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBmcmFnbWVudEtleSBhbmQgc3VwZXJ2b3hlbElkIGFycmF5cyB0byBoYXZlIHRoZSBzYW1lIGxlbmd0aC4iKTsKICAgICAgfQogICAgICBsZXQgZnJhZ21lbnRJZHMgPSBzdXBlcnZveGVsSWRzLm1hcCgoc3VwZXJ2b3hlbElkLCBpbmRleCkgPT4gc3VwZXJ2b3hlbElkICsgIlwwIiArIGZyYWdtZW50S2V5c1tpbmRleF0pOwogICAgICBjaHVuay5mcmFnbWVudElkcyA9IGdyb3VwRnJhZ21lbnRzSW50b0JhdGNoZXMoZnJhZ21lbnRJZHMpOwogICAgfQogICAgdmFyIEJyYWlubWFwc01lc2hTb3VyY2UgPSBjbGFzcyBleHRlbmRzIEJyYWlubWFwc1NvdXJjZShNZXNoU291cmNlLCBNZXNoU291cmNlUGFyYW1ldGVycykgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMubGlzdEZyYWdtZW50c1BhcmFtcyA9ICgoKSA9PiB7CiAgICAgICAgICBjb25zdCB7IHBhcmFtZXRlcnMgfSA9IHRoaXM7CiAgICAgICAgICBjb25zdCB7IGNoYW5nZVNwZWMgfSA9IHBhcmFtZXRlcnM7CiAgICAgICAgICBpZiAoY2hhbmdlU3BlYyAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHJldHVybiBgJmhlYWRlci5jaGFuZ2VTdGFja0lkPSR7Y2hhbmdlU3BlYy5jaGFuZ2VTdGFja0lkfWA7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfSkoKTsKICAgICAgfQogICAgICBkb3dubG9hZChjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICBsZXQgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGNvbnN0IHBhdGggPSBgL3YxL29iamVjdHMvJHtwYXJhbWV0ZXJzWyJ2b2x1bWVJZCJdfS9tZXNoZXMvJHtwYXJhbWV0ZXJzWyJtZXNoTmFtZSJdfTpsaXN0ZnJhZ21lbnRzP29iamVjdF9pZD0ke2NodW5rLm9iamVjdElkfSZyZXR1cm5fc3VwZXJ2b3hlbF9pZHM9dHJ1ZWAgKyB0aGlzLmxpc3RGcmFnbWVudHNQYXJhbXM7CiAgICAgICAgcmV0dXJuIG1ha2VSZXF1ZXN0KHBhcmFtZXRlcnNbImluc3RhbmNlIl0sIHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgewogICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgIHBhdGgsCiAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIgogICAgICAgIH0sIGNhbmNlbGxhdGlvblRva2VuKS50aGVuKChyZXNwb25zZSkgPT4gZGVjb2RlTWFuaWZlc3RDaHVua1dpdGhTdXBlcnZveGVsSWRzKGNodW5rLCByZXNwb25zZSkpOwogICAgICB9CiAgICAgIGFzeW5jIGRvd25sb2FkRnJhZ21lbnQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgbGV0IHsgcGFyYW1ldGVycyB9ID0gdGhpczsKICAgICAgICBjb25zdCBpZHMgPSBuZXcgTWFwKCk7CiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBKU09OLnBhcnNlKGNodW5rLmZyYWdtZW50SWQpKSB7CiAgICAgICAgICBpZHMuc2V0KGlkLCBudWxsKTsKICAgICAgICB9CiAgICAgICAgbGV0IGZyYWdtZW50cyA9IFtdOwogICAgICAgIGNvbnN0IHsgY3JlZGVudGlhbHNQcm92aWRlciB9ID0gdGhpczsKICAgICAgICB3aGlsZSAoaWRzLnNpemUgIT09IDApIHsKICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZUJhdGNoTWVzaFJlcXVlc3QoY3JlZGVudGlhbHNQcm92aWRlciwgcGFyYW1ldGVycywgaWRzLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgICBkZWNvZGVCYXRjaE1lc2hSZXNwb25zZShyZXNwb25zZSwgKGZyYWdtZW50KSA9PiB7CiAgICAgICAgICAgIGlmICghaWRzLmRlbGV0ZShmcmFnbWVudC5mdWxsS2V5KSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgdW5leHBlY3RlZCBmcmFnbWVudCBrZXk6ICR7SlNPTi5zdHJpbmdpZnkoZnJhZ21lbnQuZnVsbEtleSl9LmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZyYWdtZW50cy5wdXNoKGZyYWdtZW50KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBhc3NpZ25NZXNoRnJhZ21lbnREYXRhKGNodW5rLCBjb21iaW5lQmF0Y2hNZXNoRnJhZ21lbnRzKGZyYWdtZW50cykpOwogICAgICB9CiAgICB9OwogICAgQnJhaW5tYXBzTWVzaFNvdXJjZSA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KCkKICAgIF0sIEJyYWlubWFwc01lc2hTb3VyY2UpOwogICAgZnVuY3Rpb24gZGVjb2RlU2tlbGV0b25DaHVuayhjaHVuaywgcmVzcG9uc2UpIHsKICAgICAgbGV0IGR2ID0gbmV3IERhdGFWaWV3KHJlc3BvbnNlKTsKICAgICAgbGV0IG51bVZlcnRpY2VzID0gZHYuZ2V0VWludDMyKDAsIHRydWUpOwogICAgICBsZXQgbnVtVmVydGljZXNIaWdoID0gZHYuZ2V0VWludDMyKDQsIHRydWUpOwogICAgICBpZiAobnVtVmVydGljZXNIaWdoICE9PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgbnVtYmVyIG9mIHZlcnRpY2VzIHNob3VsZCBub3QgZXhjZWVkIDJeMzItMS5gKTsKICAgICAgfQogICAgICBsZXQgbnVtRWRnZXMgPSBkdi5nZXRVaW50MzIoOCwgdHJ1ZSk7CiAgICAgIGxldCBudW1FZGdlc0hpZ2ggPSBkdi5nZXRVaW50MzIoMTIsIHRydWUpOwogICAgICBpZiAobnVtRWRnZXNIaWdoICE9PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgbnVtYmVyIG9mIGVkZ2VzIHNob3VsZCBub3QgZXhjZWVkIDJeMzItMS5gKTsKICAgICAgfQogICAgICBkZWNvZGVTa2VsZXRvblZlcnRleFBvc2l0aW9uc0FuZEluZGljZXMoY2h1bmssIHJlc3BvbnNlLCBFbmRpYW5uZXNzLkxJVFRMRSwgMTYsIG51bVZlcnRpY2VzLCB2b2lkIDAsIG51bUVkZ2VzKTsKICAgIH0KICAgIHZhciBCcmFpbm1hcHNTa2VsZXRvblNvdXJjZSA9IGNsYXNzIGV4dGVuZHMgQnJhaW5tYXBzU291cmNlKFNrZWxldG9uU291cmNlLCBTa2VsZXRvblNvdXJjZVBhcmFtZXRlcnMpIHsKICAgICAgZG93bmxvYWQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGxldCBwYXlsb2FkID0gewogICAgICAgICAgb2JqZWN0X2lkOiBgJHtjaHVuay5vYmplY3RJZH1gCiAgICAgICAgfTsKICAgICAgICBjb25zdCBwYXRoID0gYC92MS9vYmplY3RzLyR7cGFyYW1ldGVyc1sidm9sdW1lSWQiXX0vbWVzaGVzLyR7cGFyYW1ldGVycy5tZXNoTmFtZX0vc2tlbGV0b246YmluYXJ5YDsKICAgICAgICBhcHBseUNoYW5nZVN0YWNrKHBhcmFtZXRlcnMuY2hhbmdlU3BlYywgcGF5bG9hZCk7CiAgICAgICAgcmV0dXJuIG1ha2VSZXF1ZXN0KHBhcmFtZXRlcnNbImluc3RhbmNlIl0sIHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgewogICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICBwYXRoLAogICAgICAgICAgcGF5bG9hZDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksCiAgICAgICAgICByZXNwb25zZVR5cGU6ICJhcnJheWJ1ZmZlciIKICAgICAgICB9LCBjYW5jZWxsYXRpb25Ub2tlbikudGhlbigocmVzcG9uc2UpID0+IGRlY29kZVNrZWxldG9uQ2h1bmsoY2h1bmssIHJlc3BvbnNlKSk7CiAgICAgIH0KICAgIH07CiAgICBCcmFpbm1hcHNTa2VsZXRvblNvdXJjZSA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KCkKICAgIF0sIEJyYWlubWFwc1NrZWxldG9uU291cmNlKTsKICAgIHZhciBzcGF0aWFsQW5ub3RhdGlvblR5cGVzID0gWyJMT0NBVElPTiIsICJMSU5FIiwgIlZPTFVNRSJdOwogICAgZnVuY3Rpb24gcGFyc2VDb21tYVNlcGFyYXRlZFBvaW50KHgpIHsKICAgICAgY29uc3QgcGF0dGVybiA9IC8oLT9bMC05XSspLCgtP1swLTldKyksKC0/WzAtOV0rKS87CiAgICAgIGNvbnN0IGNvcm5lclBhcnRzID0geC5tYXRjaChwYXR0ZXJuKTsKICAgICAgaWYgKGNvcm5lclBhcnRzID09PSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nIG51bWJlciB0cmlwbGV0OiAke0pTT04uc3RyaW5naWZ5KHgpfS5gKTsKICAgICAgfQogICAgICByZXR1cm4gdmVjM19leHBvcnRzLmZyb21WYWx1ZXMocGFyc2VGbG9hdChjb3JuZXJQYXJ0c1sxXSksIHBhcnNlRmxvYXQoY29ybmVyUGFydHNbMl0pLCBwYXJzZUZsb2F0KGNvcm5lclBhcnRzWzNdKSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRJZFByZWZpeChwYXJhbWV0ZXJzKSB7CiAgICAgIHJldHVybiBwYXJhbWV0ZXJzLnZvbHVtZUlkICsgIjoiICsgcGFyYW1ldGVycy5jaGFuZ2VzdGFjayArICI6IjsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQnJhaW5tYXBzQW5ub3RhdGlvbklkKGlkUHJlZml4LCBmdWxsSWQpIHsKICAgICAgaWYgKCFmdWxsSWQuc3RhcnRzV2l0aChpZFByZWZpeCkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlY2VpdmVkIGFubm90YXRpb24gaWQgJHtKU09OLnN0cmluZ2lmeShmdWxsSWQpfSBkb2VzIG5vdCBoYXZlIGV4cGVjdGVkIHByZWZpeCBvZiAke0pTT04uc3RyaW5naWZ5KGlkUHJlZml4KX0uYCk7CiAgICAgIH0KICAgICAgY29uc3QgaWQgPSBmdWxsSWQuc3Vic3RyaW5nKGlkUHJlZml4Lmxlbmd0aCk7CiAgICAgIHJldHVybiBpZDsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlT2JqZWN0TGFiZWxzKG9iaikgewogICAgICBpZiAob2JqID09IG51bGwpIHsKICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICB9CiAgICAgIHJldHVybiBbcGFyc2VBcnJheShvYmosICh4KSA9PiBVaW50NjQucGFyc2VTdHJpbmcoIiIgKyB4LCAxMCkpXTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQW5ub3RhdGlvbihlbnRyeSwgaWRQcmVmaXgsIGV4cGVjdGVkSWQpIHsKICAgICAgY29uc3QgY29ybmVyID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkoZW50cnksICJjb3JuZXIiLCAoeCkgPT4gcGFyc2VDb21tYVNlcGFyYXRlZFBvaW50KHZlcmlmeVN0cmluZyh4KSkpOwogICAgICBjb25zdCBzaXplID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkoZW50cnksICJzaXplIiwgKHgpID0+IHBhcnNlQ29tbWFTZXBhcmF0ZWRQb2ludCh2ZXJpZnlTdHJpbmcoeCkpKTsKICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB2ZXJpZnlPYmplY3RQcm9wZXJ0eShlbnRyeSwgInBheWxvYWQiLCB2ZXJpZnlPcHRpb25hbFN0cmluZyk7CiAgICAgIGNvbnN0IHNwYXRpYWxBbm5vdGF0aW9uVHlwZSA9IHZlcmlmeU9iamVjdFByb3BlcnR5KGVudHJ5LCAidHlwZSIsIHZlcmlmeVN0cmluZyk7CiAgICAgIGNvbnN0IGZ1bGxJZCA9IHZlcmlmeU9iamVjdFByb3BlcnR5KGVudHJ5LCAiaWQiLCB2ZXJpZnlTdHJpbmcpOwogICAgICBjb25zdCBpZCA9IHBhcnNlQnJhaW5tYXBzQW5ub3RhdGlvbklkKGlkUHJlZml4LCBmdWxsSWQpOwogICAgICBjb25zdCBzZWdtZW50cyA9IHZlcmlmeU9iamVjdFByb3BlcnR5KGVudHJ5LCAib2JqZWN0TGFiZWxzIiwgcGFyc2VPYmplY3RMYWJlbHMpOwogICAgICBpZiAoZXhwZWN0ZWRJZCAhPT0gdm9pZCAwICYmIGlkICE9PSBleHBlY3RlZElkKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBhbm5vdGF0aW9uIGhhcyB1bmV4cGVjdGVkIGlkICR7SlNPTi5zdHJpbmdpZnkoZnVsbElkKX0uYCk7CiAgICAgIH0KICAgICAgc3dpdGNoIChzcGF0aWFsQW5ub3RhdGlvblR5cGUpIHsKICAgICAgICBjYXNlICJMT0NBVElPTiI6CiAgICAgICAgICBpZiAodmVjM19leHBvcnRzLmVxdWFscyhzaXplLCBrWmVyb1ZlYykpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0eXBlOiBBbm5vdGF0aW9uVHlwZS5QT0lOVCwKICAgICAgICAgICAgICBpZCwKICAgICAgICAgICAgICBwb2ludDogY29ybmVyLAogICAgICAgICAgICAgIGRlc2NyaXB0aW9uLAogICAgICAgICAgICAgIHJlbGF0ZWRTZWdtZW50czogc2VnbWVudHMsCiAgICAgICAgICAgICAgcHJvcGVydGllczogW10KICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IHJhZGlpID0gdmVjM19leHBvcnRzLnNjYWxlKHZlYzNfZXhwb3J0cy5jcmVhdGUoKSwgc2l6ZSwgMC41KTsKICAgICAgICAgICAgY29uc3QgY2VudGVyID0gdmVjM19leHBvcnRzLmFkZCh2ZWMzX2V4cG9ydHMuY3JlYXRlKCksIGNvcm5lciwgcmFkaWkpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHR5cGU6IEFubm90YXRpb25UeXBlLkVMTElQU09JRCwKICAgICAgICAgICAgICBpZCwKICAgICAgICAgICAgICBjZW50ZXIsCiAgICAgICAgICAgICAgcmFkaWksCiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgcmVsYXRlZFNlZ21lbnRzOiBzZWdtZW50cywKICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgIGNhc2UgIkxJTkUiOgogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdHlwZTogQW5ub3RhdGlvblR5cGUuTElORSwKICAgICAgICAgICAgaWQsCiAgICAgICAgICAgIHBvaW50QTogY29ybmVyLAogICAgICAgICAgICBwb2ludEI6IHZlYzNfZXhwb3J0cy5hZGQodmVjM19leHBvcnRzLmNyZWF0ZSgpLCBjb3JuZXIsIHNpemUpLAogICAgICAgICAgICBkZXNjcmlwdGlvbiwKICAgICAgICAgICAgcmVsYXRlZFNlZ21lbnRzOiBzZWdtZW50cywKICAgICAgICAgICAgcHJvcGVydGllczogW10KICAgICAgICAgIH07CiAgICAgICAgY2FzZSAiVk9MVU1FIjoKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHR5cGU6IEFubm90YXRpb25UeXBlLkFYSVNfQUxJR05FRF9CT1VORElOR19CT1gsCiAgICAgICAgICAgIGlkLAogICAgICAgICAgICBwb2ludEE6IGNvcm5lciwKICAgICAgICAgICAgcG9pbnRCOiB2ZWMzX2V4cG9ydHMuYWRkKHZlYzNfZXhwb3J0cy5jcmVhdGUoKSwgY29ybmVyLCBzaXplKSwKICAgICAgICAgICAgZGVzY3JpcHRpb24sCiAgICAgICAgICAgIHJlbGF0ZWRTZWdtZW50czogc2VnbWVudHMsCiAgICAgICAgICAgIHByb3BlcnRpZXM6IFtdCiAgICAgICAgICB9OwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3BhdGlhbCBhbm5vdGF0aW9uIHR5cGU6ICR7SlNPTi5zdHJpbmdpZnkoc3BhdGlhbEFubm90YXRpb25UeXBlKX0uYCk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQW5ub3RhdGlvblJlc3BvbnNlKHJlc3BvbnNlLCBpZFByZWZpeCwgZXhwZWN0ZWRJZCkgewogICAgICB2ZXJpZnlPYmplY3QocmVzcG9uc2UpOwogICAgICBjb25zdCBlbnRyeSA9IHZlcmlmeU9iamVjdFByb3BlcnR5KHJlc3BvbnNlLCAiYW5ub3RhdGlvbnMiLCAoeCkgPT4gcGFyc2VGaXhlZExlbmd0aEFycmF5KFt2b2lkIDBdLCB4LCB2ZXJpZnlPYmplY3QpKVswXTsKICAgICAgcmV0dXJuIHBhcnNlQW5ub3RhdGlvbihlbnRyeSwgaWRQcmVmaXgsIGV4cGVjdGVkSWQpOwogICAgfQogICAgdmFyIGFubm90YXRpb25Qcm9wZXJ0eVNlcmlhbGl6ZXJzID0gbWFrZUFubm90YXRpb25Qcm9wZXJ0eVNlcmlhbGl6ZXJzKDMsIFtdKTsKICAgIGZ1bmN0aW9uIHBhcnNlQW5ub3RhdGlvbnMoY2h1bmssIHJlc3BvbnNlcykgewogICAgICBjb25zdCBzZXJpYWxpemVyID0gbmV3IEFubm90YXRpb25TZXJpYWxpemVyKGFubm90YXRpb25Qcm9wZXJ0eVNlcmlhbGl6ZXJzKTsKICAgICAgY29uc3Qgc291cmNlID0gY2h1bmsuc291cmNlLnBhcmVudDsKICAgICAgY29uc3QgaWRQcmVmaXggPSBnZXRJZFByZWZpeChzb3VyY2UucGFyYW1ldGVycyk7CiAgICAgIHJlc3BvbnNlcy5mb3JFYWNoKChyZXNwb25zZSwgcmVzcG9uc2VJbmRleCkgPT4gewogICAgICAgIHRyeSB7CiAgICAgICAgICB2ZXJpZnlPYmplY3QocmVzcG9uc2UpOwogICAgICAgICAgY29uc3QgYW5ub3RhdGlvbnNBcnJheSA9IHZlcmlmeU9iamVjdFByb3BlcnR5KHJlc3BvbnNlLCAiYW5ub3RhdGlvbnMiLCAoeCkgPT4geCA9PT0gdm9pZCAwID8gW10gOiB4KTsKICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhbm5vdGF0aW9uc0FycmF5KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGFycmF5LCBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh0eXBlb2YgYW5ub3RhdGlvbnNBcnJheSl9LmApOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBhbm5vdGF0aW9uc0FycmF5KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgc2VyaWFsaXplci5hZGQocGFyc2VBbm5vdGF0aW9uKGVudHJ5LCBpZFByZWZpeCkpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nIGFubm90YXRpb246ICR7ZS5tZXNzYWdlfWApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nICR7c3BhdGlhbEFubm90YXRpb25UeXBlc1tyZXNwb25zZUluZGV4XX0gYW5ub3RhdGlvbnM6ICR7cGFyc2VFcnJvci5tZXNzYWdlfWApOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGNodW5rLmRhdGEgPSBPYmplY3QuYXNzaWduKG5ldyBBbm5vdGF0aW9uR2VvbWV0cnlEYXRhKCksIHNlcmlhbGl6ZXIuc2VyaWFsaXplKCkpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0U3BhdGlhbEFubm90YXRpb25UeXBlRnJvbUlkKGlkKSB7CiAgICAgIGNvbnN0IGluZGV4ID0gaWQuaW5kZXhPZigiLiIpOwogICAgICByZXR1cm4gaWQuc3Vic3RyaW5nKDAsIGluZGV4KTsKICAgIH0KICAgIGZ1bmN0aW9uIHRvQ29tbWFTZXBhcmF0ZWQodikgewogICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZCh2WzBdKX0sJHtNYXRoLnJvdW5kKHZbMV0pfSwke01hdGgucm91bmQodlsyXSl9YDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEZ1bGxTcGF0aWFsQW5ub3RhdGlvbklkKHBhcmFtZXRlcnMsIGlkKSB7CiAgICAgIHJldHVybiBgJHtwYXJhbWV0ZXJzLnZvbHVtZUlkfToke3BhcmFtZXRlcnMuY2hhbmdlc3RhY2t9OiR7aWR9YDsKICAgIH0KICAgIGZ1bmN0aW9uIGFubm90YXRpb25Ub0JyYWlubWFwcyhhbm5vdGF0aW9uKSB7CiAgICAgIGNvbnN0IHBheWxvYWQgPSBhbm5vdGF0aW9uLmRlc2NyaXB0aW9uIHx8ICIiOwogICAgICBjb25zdCBvYmplY3RMYWJlbHMgPSBhbm5vdGF0aW9uLnJlbGF0ZWRTZWdtZW50cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYW5ub3RhdGlvbi5yZWxhdGVkU2VnbWVudHNbMF0ubWFwKCh4KSA9PiB4LnRvU3RyaW5nKCkpOwogICAgICBzd2l0Y2ggKGFubm90YXRpb24udHlwZSkgewogICAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuTElORTogewogICAgICAgICAgY29uc3QgeyBwb2ludEEsIHBvaW50QiB9ID0gYW5ub3RhdGlvbjsKICAgICAgICAgIGNvbnN0IHNpemUgPSB2ZWMzX2V4cG9ydHMuc3VidHJhY3QodmVjM19leHBvcnRzLmNyZWF0ZSgpLCBwb2ludEIsIHBvaW50QSk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAiTElORSIsCiAgICAgICAgICAgIGNvcm5lcjogdG9Db21tYVNlcGFyYXRlZChwb2ludEEpLAogICAgICAgICAgICBzaXplOiB0b0NvbW1hU2VwYXJhdGVkKHNpemUpLAogICAgICAgICAgICBvYmplY3RfbGFiZWxzOiBvYmplY3RMYWJlbHMsCiAgICAgICAgICAgIHBheWxvYWQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuQVhJU19BTElHTkVEX0JPVU5ESU5HX0JPWDogewogICAgICAgICAgY29uc3QgeyBwb2ludEEsIHBvaW50QiB9ID0gYW5ub3RhdGlvbjsKICAgICAgICAgIGNvbnN0IG1pblBvaW50ID0gbWluMyh2ZWMzX2V4cG9ydHMuY3JlYXRlKCksIHBvaW50QSwgcG9pbnRCKTsKICAgICAgICAgIGNvbnN0IG1heFBvaW50ID0gbWF4Myh2ZWMzX2V4cG9ydHMuY3JlYXRlKCksIHBvaW50QSwgcG9pbnRCKTsKICAgICAgICAgIGNvbnN0IHNpemUgPSB2ZWMzX2V4cG9ydHMuc3VidHJhY3QobWF4UG9pbnQsIG1heFBvaW50LCBtaW5Qb2ludCk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAiVk9MVU1FIiwKICAgICAgICAgICAgY29ybmVyOiB0b0NvbW1hU2VwYXJhdGVkKG1pblBvaW50KSwKICAgICAgICAgICAgc2l6ZTogdG9Db21tYVNlcGFyYXRlZChzaXplKSwKICAgICAgICAgICAgb2JqZWN0X2xhYmVsczogb2JqZWN0TGFiZWxzLAogICAgICAgICAgICBwYXlsb2FkCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlLlBPSU5UOiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAiTE9DQVRJT04iLAogICAgICAgICAgICBjb3JuZXI6IHRvQ29tbWFTZXBhcmF0ZWQoYW5ub3RhdGlvbi5wb2ludCksCiAgICAgICAgICAgIHNpemU6ICIwLDAsMCIsCiAgICAgICAgICAgIG9iamVjdF9sYWJlbHM6IG9iamVjdExhYmVscywKICAgICAgICAgICAgcGF5bG9hZAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5FTExJUFNPSUQ6IHsKICAgICAgICAgIGNvbnN0IGNvcm5lciA9IHZlYzNfZXhwb3J0cy5zdWJ0cmFjdCh2ZWMzX2V4cG9ydHMuY3JlYXRlKCksIGFubm90YXRpb24uY2VudGVyLCBhbm5vdGF0aW9uLnJhZGlpKTsKICAgICAgICAgIGNvbnN0IHNpemUgPSB2ZWMzX2V4cG9ydHMuc2NhbGUodmVjM19leHBvcnRzLmNyZWF0ZSgpLCBhbm5vdGF0aW9uLnJhZGlpLCAyKTsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHR5cGU6ICJMT0NBVElPTiIsCiAgICAgICAgICAgIGNvcm5lcjogdG9Db21tYVNlcGFyYXRlZChjb3JuZXIpLAogICAgICAgICAgICBzaXplOiB0b0NvbW1hU2VwYXJhdGVkKHNpemUpLAogICAgICAgICAgICBvYmplY3RfbGFiZWxzOiBvYmplY3RMYWJlbHMsCiAgICAgICAgICAgIHBheWxvYWQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB2YXIgQnJhaW5tYXBzQW5ub3RhdGlvbkdlb21ldHJ5Q2h1bmtTb3VyY2UgPSBjbGFzcyBleHRlbmRzIEJyYWlubWFwc1NvdXJjZShBbm5vdGF0aW9uR2VvbWV0cnlDaHVua1NvdXJjZUJhY2tlbmQsIEFubm90YXRpb25TcGF0aWFsSW5kZXhTb3VyY2VQYXJhbWV0ZXJzKSB7CiAgICAgIGFzeW5jIGRvd25sb2FkKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyB9ID0gdGhpczsKICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoc3BhdGlhbEFubm90YXRpb25UeXBlcy5tYXAoKHNwYXRpYWxBbm5vdGF0aW9uVHlwZSkgPT4gbWFrZVJlcXVlc3QocGFyYW1ldGVycy5pbnN0YW5jZSwgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCB7CiAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgIHBhdGg6IGAvdjEvY2hhbmdlcy8ke3BhcmFtZXRlcnMudm9sdW1lSWR9LyR7cGFyYW1ldGVycy5jaGFuZ2VzdGFja30vc3BhdGlhbHM6Z2V0YCwKICAgICAgICAgIHBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgdHlwZTogc3BhdGlhbEFubm90YXRpb25UeXBlLAogICAgICAgICAgICBpZ25vcmVfcGF5bG9hZDogdHJ1ZQogICAgICAgICAgfSksCiAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIgogICAgICAgIH0sIGNhbmNlbGxhdGlvblRva2VuKSkpLnRoZW4oKHZhbHVlcykgPT4gewogICAgICAgICAgcGFyc2VBbm5vdGF0aW9ucyhjaHVuaywgdmFsdWVzKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIEJyYWlubWFwc0Fubm90YXRpb25HZW9tZXRyeUNodW5rU291cmNlID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoKQogICAgXSwgQnJhaW5tYXBzQW5ub3RhdGlvbkdlb21ldHJ5Q2h1bmtTb3VyY2UpOwogICAgdmFyIEJyYWlubWFwc0Fubm90YXRpb25Tb3VyY2UgPSBjbGFzcyBleHRlbmRzIEJyYWlubWFwc1NvdXJjZShBbm5vdGF0aW9uU291cmNlMiwgQW5ub3RhdGlvblNvdXJjZVBhcmFtZXRlcnMpIHsKICAgICAgZG93bmxvYWRTZWdtZW50RmlsdGVyZWRHZW9tZXRyeShjaHVuaywgX3JlbGF0aW9uc2hpcEluZGV4LCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyB9ID0gdGhpczsKICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoc3BhdGlhbEFubm90YXRpb25UeXBlcy5tYXAoKHNwYXRpYWxBbm5vdGF0aW9uVHlwZSkgPT4gbWFrZVJlcXVlc3QocGFyYW1ldGVycy5pbnN0YW5jZSwgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCB7CiAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgIHBhdGg6IGAvdjEvY2hhbmdlcy8ke3BhcmFtZXRlcnMudm9sdW1lSWR9LyR7cGFyYW1ldGVycy5jaGFuZ2VzdGFja30vc3BhdGlhbHM6Z2V0YCwKICAgICAgICAgIHBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgdHlwZTogc3BhdGlhbEFubm90YXRpb25UeXBlLAogICAgICAgICAgICBvYmplY3RfbGFiZWxzOiBbY2h1bmsub2JqZWN0SWQudG9TdHJpbmcoKV0sCiAgICAgICAgICAgIGlnbm9yZV9wYXlsb2FkOiB0cnVlCiAgICAgICAgICB9KSwKICAgICAgICAgIHJlc3BvbnNlVHlwZTogImpzb24iCiAgICAgICAgfSwgY2FuY2VsbGF0aW9uVG9rZW4pKSkudGhlbigodmFsdWVzKSA9PiB7CiAgICAgICAgICBwYXJzZUFubm90YXRpb25zKGNodW5rLCB2YWx1ZXMpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGRvd25sb2FkTWV0YWRhdGEoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGNvbnN0IGlkID0gY2h1bmsua2V5OwogICAgICAgIHJldHVybiBtYWtlUmVxdWVzdChwYXJhbWV0ZXJzLmluc3RhbmNlLCB0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIsIHsKICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgcGF0aDogYC92MS9jaGFuZ2VzLyR7cGFyYW1ldGVycy52b2x1bWVJZH0vJHtwYXJhbWV0ZXJzLmNoYW5nZXN0YWNrfS9zcGF0aWFsczpnZXRgLAogICAgICAgICAgcGF5bG9hZDogSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICB0eXBlOiBnZXRTcGF0aWFsQW5ub3RhdGlvblR5cGVGcm9tSWQoaWQpLAogICAgICAgICAgICBpZDogZ2V0RnVsbFNwYXRpYWxBbm5vdGF0aW9uSWQocGFyYW1ldGVycywgaWQpCiAgICAgICAgICB9KSwKICAgICAgICAgIHJlc3BvbnNlVHlwZTogImpzb24iCiAgICAgICAgfSwgY2FuY2VsbGF0aW9uVG9rZW4pLnRoZW4oKHJlc3BvbnNlKSA9PiB7CiAgICAgICAgICBjaHVuay5hbm5vdGF0aW9uID0gcGFyc2VBbm5vdGF0aW9uUmVzcG9uc2UocmVzcG9uc2UsIGdldElkUHJlZml4KHBhcmFtZXRlcnMpLCBpZCk7CiAgICAgICAgfSwgKCkgPT4gewogICAgICAgICAgY2h1bmsuYW5ub3RhdGlvbiA9IG51bGw7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgYWRkKGFubm90YXRpb24pIHsKICAgICAgICBjb25zdCB7IHBhcmFtZXRlcnMgfSA9IHRoaXM7CiAgICAgICAgY29uc3QgYnJhaW5tYXBzQW5ub3RhdGlvbiA9IGFubm90YXRpb25Ub0JyYWlubWFwcyhhbm5vdGF0aW9uKTsKICAgICAgICByZXR1cm4gbWFrZVJlcXVlc3QocGFyYW1ldGVycy5pbnN0YW5jZSwgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCB7CiAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgIHBhdGg6IGAvdjEvY2hhbmdlcy8ke3BhcmFtZXRlcnMudm9sdW1lSWR9LyR7cGFyYW1ldGVycy5jaGFuZ2VzdGFja30vc3BhdGlhbHM6cHVzaGAsCiAgICAgICAgICBwYXlsb2FkOiBKU09OLnN0cmluZ2lmeSh7IGFubm90YXRpb25zOiBbYnJhaW5tYXBzQW5ub3RhdGlvbl0gfSksCiAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIgogICAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7CiAgICAgICAgICB2ZXJpZnlPYmplY3QocmVzcG9uc2UpOwogICAgICAgICAgY29uc3QgaWRzID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkocmVzcG9uc2UsICJpZHMiLCB2ZXJpZnlTdHJpbmdBcnJheSk7CiAgICAgICAgICBpZiAoaWRzLmxlbmd0aCAhPT0gMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGxpc3Qgb2YgMSBpZCwgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkoaWRzKX0uYCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBpZFByZWZpeCA9IGdldElkUHJlZml4KHRoaXMucGFyYW1ldGVycyk7CiAgICAgICAgICByZXR1cm4gcGFyc2VCcmFpbm1hcHNBbm5vdGF0aW9uSWQoaWRQcmVmaXgsIGlkc1swXSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdXBkYXRlKGlkLCBhbm5vdGF0aW9uKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGNvbnN0IGJyYWlubWFwc0Fubm90YXRpb24gPSBhbm5vdGF0aW9uVG9CcmFpbm1hcHMoYW5ub3RhdGlvbik7CiAgICAgICAgYnJhaW5tYXBzQW5ub3RhdGlvbi5pZCA9IGdldEZ1bGxTcGF0aWFsQW5ub3RhdGlvbklkKHBhcmFtZXRlcnMsIGlkKTsKICAgICAgICByZXR1cm4gbWFrZVJlcXVlc3QocGFyYW1ldGVycy5pbnN0YW5jZSwgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCB7CiAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgIHBhdGg6IGAvdjEvY2hhbmdlcy8ke3BhcmFtZXRlcnMudm9sdW1lSWR9LyR7cGFyYW1ldGVycy5jaGFuZ2VzdGFja30vc3BhdGlhbHM6cHVzaGAsCiAgICAgICAgICBwYXlsb2FkOiBKU09OLnN0cmluZ2lmeSh7IGFubm90YXRpb25zOiBbYnJhaW5tYXBzQW5ub3RhdGlvbl0gfSksCiAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIgogICAgICAgIH0pOwogICAgICB9CiAgICAgIGRlbGV0ZShpZCkgewogICAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyB9ID0gdGhpczsKICAgICAgICByZXR1cm4gbWFrZVJlcXVlc3QocGFyYW1ldGVycy5pbnN0YW5jZSwgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCB7CiAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgIHBhdGg6IGAvdjEvY2hhbmdlcy8ke3BhcmFtZXRlcnMudm9sdW1lSWR9LyR7cGFyYW1ldGVycy5jaGFuZ2VzdGFja30vc3BhdGlhbHM6ZGVsZXRlYCwKICAgICAgICAgIHBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgdHlwZTogZ2V0U3BhdGlhbEFubm90YXRpb25UeXBlRnJvbUlkKGlkKSwKICAgICAgICAgICAgaWRzOiBbZ2V0RnVsbFNwYXRpYWxBbm5vdGF0aW9uSWQocGFyYW1ldGVycywgaWQpXQogICAgICAgICAgfSksCiAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIgogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgQnJhaW5tYXBzQW5ub3RhdGlvblNvdXJjZSA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KCkKICAgIF0sIEJyYWlubWFwc0Fubm90YXRpb25Tb3VyY2UpOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvZGF0YXNvdXJjZS9ib3NzL2FwaS50cwogICAgZnVuY3Rpb24gZmV0Y2hXaXRoQm9zc0NyZWRlbnRpYWxzKGNyZWRlbnRpYWxzUHJvdmlkZXIsIGlucHV0LCBpbml0LCB0cmFuc2Zvcm1SZXNwb25zZSwgY2FuY2VsbGF0aW9uVG9rZW4gPSB1bmNhbmNlbGFibGVUb2tlbikgewogICAgICByZXR1cm4gY2FuY2VsbGFibGVGZXRjaE9rKGlucHV0LCBpbml0LCB0cmFuc2Zvcm1SZXNwb25zZSwgY2FuY2VsbGF0aW9uVG9rZW4pLmNhdGNoKChlcnJvcikgPT4gewogICAgICAgIGlmIChlcnJvci5zdGF0dXMgIT09IDUwMCAmJiBlcnJvci5zdGF0dXMgIT09IDQwMSAmJiBlcnJvci5zdGF0dXMgIT09IDQwMyAmJiBlcnJvci5zdGF0dXMgIT09IDUwNCkgewogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmZXRjaFdpdGhDcmVkZW50aWFscyhjcmVkZW50aWFsc1Byb3ZpZGVyLCBpbnB1dCwgaW5pdCwgdHJhbnNmb3JtUmVzcG9uc2UsIChjcmVkZW50aWFscykgPT4gewogICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGluaXQuaGVhZGVycyk7CiAgICAgICAgICBoZWFkZXJzLnNldCgiQXV0aG9yaXphdGlvbiIsIGBCZWFyZXIgJHtjcmVkZW50aWFsc31gKTsKICAgICAgICAgIHJldHVybiB7IC4uLmluaXQsIGhlYWRlcnMgfTsKICAgICAgICB9LCAoZXJyb3IyKSA9PiB7CiAgICAgICAgICBjb25zdCB7IHN0YXR1cyB9ID0gZXJyb3IyOwogICAgICAgICAgaWYgKHN0YXR1cyA9PT0gNDAzIHx8IHN0YXR1cyA9PT0gNDAxKSB7CiAgICAgICAgICAgIHJldHVybiAicmVmcmVzaCI7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3RhdHVzID09PSA1MDQpIHsKICAgICAgICAgICAgcmV0dXJuICJyZXRyeSI7CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyBlcnJvcjI7CiAgICAgICAgfSwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICB9KTsKICAgIH0KCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2RhdGFzb3VyY2UvYm9zcy9iYXNlLnRzCiAgICB2YXIgQm9zc1NvdXJjZVBhcmFtZXRlcnMgPSBjbGFzcyB7CiAgICB9OwogICAgdmFyIFZvbHVtZUNodW5rU291cmNlUGFyYW1ldGVycyA9IGNsYXNzIGV4dGVuZHMgQm9zc1NvdXJjZVBhcmFtZXRlcnMgewogICAgICBzdGF0aWMgc3RyaW5naWZ5KHBhcmFtZXRlcnMpIHsKICAgICAgICByZXR1cm4gYGJvc3M6dm9sdW1lOiR7cGFyYW1ldGVycy5iYXNlVXJsfS8ke3BhcmFtZXRlcnMuY29sbGVjdGlvbn0vJHtwYXJhbWV0ZXJzLmV4cGVyaW1lbnR9LyR7cGFyYW1ldGVycy5jaGFubmVsfS8ke3BhcmFtZXRlcnMucmVzb2x1dGlvbn0vJHtwYXJhbWV0ZXJzLmVuY29kaW5nfWA7CiAgICAgIH0KICAgIH07CiAgICBWb2x1bWVDaHVua1NvdXJjZVBhcmFtZXRlcnMuUlBDX0lEID0gImJvc3MvVm9sdW1lQ2h1bmtTb3VyY2UiOwogICAgdmFyIE1lc2hTb3VyY2VQYXJhbWV0ZXJzMiA9IGNsYXNzIHsKICAgICAgc3RhdGljIHN0cmluZ2lmeShwYXJhbWV0ZXJzKSB7CiAgICAgICAgcmV0dXJuIGBib3NzOm1lc2g6JHtwYXJhbWV0ZXJzLmJhc2VVcmx9YDsKICAgICAgfQogICAgfTsKICAgIE1lc2hTb3VyY2VQYXJhbWV0ZXJzMi5SUENfSUQgPSAiYm9zcy9NZXNoQ2h1bmtTb3VyY2UiOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvYXN5bmNfY29tcHV0YXRpb24vZGVjb2RlX2d6aXBfcmVxdWVzdC50cwogICAgdmFyIGRlY29kZUd6aXAgPSBhc3luY0NvbXB1dGF0aW9uKCJkZWNvZGVHemlwIik7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci91dGlsL251bXB5X2R0eXBlLnRzCiAgICB2YXIgc3VwcG9ydGVkRGF0YVR5cGVzID0gbmV3IE1hcCgpOwogICAgc3VwcG9ydGVkRGF0YVR5cGVzLnNldCgifHUxIiwgewogICAgICBlbmRpYW5uZXNzOiBFbmRpYW5uZXNzLkxJVFRMRSwKICAgICAgZGF0YVR5cGU6IERhdGFUeXBlLlVJTlQ4CiAgICB9KTsKICAgIHN1cHBvcnRlZERhdGFUeXBlcy5zZXQoInxpMSIsIHsKICAgICAgZW5kaWFubmVzczogRW5kaWFubmVzcy5MSVRUTEUsCiAgICAgIGRhdGFUeXBlOiBEYXRhVHlwZS5JTlQ4CiAgICB9KTsKICAgIGZvciAobGV0IFtlbmRpYW5uZXNzQ2hhciwgZW5kaWFubmVzc10gb2YgWwogICAgICBbIjwiLCBFbmRpYW5uZXNzLkxJVFRMRV0sCiAgICAgIFsiPiIsIEVuZGlhbm5lc3MuQklHXQogICAgXSkgewogICAgICBmb3IgKGxldCB0eXBlQ2hhciBvZiBbInUiLCAiaSJdKSB7CiAgICAgICAgc3VwcG9ydGVkRGF0YVR5cGVzLnNldChgJHtlbmRpYW5uZXNzQ2hhcn0ke3R5cGVDaGFyfThgLCB7CiAgICAgICAgICBlbmRpYW5uZXNzLAogICAgICAgICAgZGF0YVR5cGU6IERhdGFUeXBlLlVJTlQ2NAogICAgICAgIH0pOwogICAgICB9CiAgICAgIHN1cHBvcnRlZERhdGFUeXBlcy5zZXQoYCR7ZW5kaWFubmVzc0NoYXJ9dTJgLCB7CiAgICAgICAgZW5kaWFubmVzcywKICAgICAgICBkYXRhVHlwZTogRGF0YVR5cGUuVUlOVDE2CiAgICAgIH0pOwogICAgICBzdXBwb3J0ZWREYXRhVHlwZXMuc2V0KGAke2VuZGlhbm5lc3NDaGFyfWkyYCwgewogICAgICAgIGVuZGlhbm5lc3MsCiAgICAgICAgZGF0YVR5cGU6IERhdGFUeXBlLklOVDE2CiAgICAgIH0pOwogICAgICBzdXBwb3J0ZWREYXRhVHlwZXMuc2V0KGAke2VuZGlhbm5lc3NDaGFyfXU0YCwgewogICAgICAgIGVuZGlhbm5lc3MsCiAgICAgICAgZGF0YVR5cGU6IERhdGFUeXBlLlVJTlQzMgogICAgICB9KTsKICAgICAgc3VwcG9ydGVkRGF0YVR5cGVzLnNldChgJHtlbmRpYW5uZXNzQ2hhcn1pNGAsIHsKICAgICAgICBlbmRpYW5uZXNzLAogICAgICAgIGRhdGFUeXBlOiBEYXRhVHlwZS5JTlQzMgogICAgICB9KTsKICAgICAgc3VwcG9ydGVkRGF0YVR5cGVzLnNldChgJHtlbmRpYW5uZXNzQ2hhcn1mNGAsIHsKICAgICAgICBlbmRpYW5uZXNzLAogICAgICAgIGRhdGFUeXBlOiBEYXRhVHlwZS5GTE9BVDMyCiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VOdW1weUR0eXBlKHR5cGVzdHIpIHsKICAgICAgY29uc3QgZHR5cGUgPSBzdXBwb3J0ZWREYXRhVHlwZXMuZ2V0KHR5cGVzdHIpOwogICAgICBpZiAoZHR5cGUgPT09IHZvaWQgMCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbnVtcHkgZGF0YSB0eXBlOiAke0pTT04uc3RyaW5naWZ5KHR5cGVzdHIpfWApOwogICAgICB9CiAgICAgIHJldHVybiBkdHlwZTsKICAgIH0KCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3V0aWwvbnB5LnRzCiAgICB2YXIgTnVtcHlBcnJheSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoZGF0YSwgc2hhcGUsIGRhdGFUeXBlLCBmb3J0cmFuT3JkZXIpIHsKICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgICAgIHRoaXMuc2hhcGUgPSBzaGFwZTsKICAgICAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7CiAgICAgICAgdGhpcy5mb3J0cmFuT3JkZXIgPSBmb3J0cmFuT3JkZXI7CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBwYXJzZU5weSh4KSB7CiAgICAgIGlmICh4WzBdICE9PSAxNDcgfHwgeFsxXSAhPT0gNzggfHwgeFsyXSAhPT0gODUgfHwgeFszXSAhPT0gNzcgfHwgeFs0XSAhPT0gODAgfHwgeFs1XSAhPT0gODkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkRhdGEgZG9lcyBub3QgbWF0Y2ggbnB5IGZvcm1hdC4iKTsKICAgICAgfQogICAgICBjb25zdCBtYWpvclZlcnNpb24gPSB4WzZdLCBtaW5vclZlcnNpb24gPSB4WzddOwogICAgICBpZiAobWFqb3JWZXJzaW9uICE9PSAxIHx8IG1pbm9yVmVyc2lvbiAhPT0gMCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbnB5IHZlcnNpb24gJHttYWpvclZlcnNpb259LiR7bWlub3JWZXJzaW9ufWApOwogICAgICB9CiAgICAgIGNvbnN0IGR2ID0gbmV3IERhdGFWaWV3KHguYnVmZmVyLCB4LmJ5dGVPZmZzZXQsIHguYnl0ZUxlbmd0aCk7CiAgICAgIGNvbnN0IGhlYWRlckxlbmd0aCA9IGR2LmdldFVpbnQxNig4LCB0cnVlKTsKICAgICAgY29uc3QgaGVhZGVyID0gbmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpLmRlY29kZSh4LnN1YmFycmF5KDEwLCBoZWFkZXJMZW5ndGggKyAxMCkpOwogICAgICBsZXQgaGVhZGVyT2JqZWN0OwogICAgICBjb25zdCBkYXRhT2Zmc2V0ID0gaGVhZGVyTGVuZ3RoICsgMTA7CiAgICAgIHRyeSB7CiAgICAgICAgaGVhZGVyT2JqZWN0ID0gcHl0aG9uTGl0ZXJhbFBhcnNlKGhlYWRlcik7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBucHkgaGVhZGVyOiAke2V9YCk7CiAgICAgIH0KICAgICAgY29uc3QgZHR5cGUgPSBoZWFkZXJPYmplY3RbImRlc2NyIl07CiAgICAgIGxldCBzaGFwZSA9IGhlYWRlck9iamVjdFsic2hhcGUiXTsKICAgICAgbGV0IG51bUVsZW1lbnRzID0gMTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNoYXBlKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzaGFwZSAke0pTT04uc3RyaW5naWZ5KHNoYXBlKX0iKTsKICAgICAgfQogICAgICBmb3IgKGxldCBkaW0gb2Ygc2hhcGUpIHsKICAgICAgICBpZiAodHlwZW9mIGRpbSAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzaGFwZSAke0pTT04uc3RyaW5naWZ5KHNoYXBlKX0iKTsKICAgICAgICB9CiAgICAgICAgbnVtRWxlbWVudHMgKj0gZGltOwogICAgICB9CiAgICAgIGNvbnN0IHsgZGF0YVR5cGUsIGVuZGlhbm5lc3MgfSA9IHBhcnNlTnVtcHlEdHlwZShkdHlwZSk7CiAgICAgIGNvbnN0IGJ5dGVzUGVyRWxlbWVudCA9IERBVEFfVFlQRV9CWVRFU1tkYXRhVHlwZV07CiAgICAgIGNvbnN0IGphdmFzY3JpcHRFbGVtZW50c1BlckFycmF5RWxlbWVudCA9IERBVEFfVFlQRV9KQVZBU0NSSVBUX0VMRU1FTlRTX1BFUl9BUlJBWV9FTEVNRU5UW2RhdGFUeXBlXTsKICAgICAgY29uc3QgYXJyYXlDb25zdHJ1Y3RvciA9IERBVEFfVFlQRV9BUlJBWV9DT05TVFJVQ1RPUltkYXRhVHlwZV07CiAgICAgIGNvbnN0IGphdmFzY3JpcHRFbGVtZW50cyA9IGphdmFzY3JpcHRFbGVtZW50c1BlckFycmF5RWxlbWVudCAqIG51bUVsZW1lbnRzOwogICAgICBpZiAoYnl0ZXNQZXJFbGVtZW50ICogbnVtRWxlbWVudHMgKyBkYXRhT2Zmc2V0ICE9PSB4LmJ5dGVMZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBsZW5ndGggb2YgZGF0YSIpOwogICAgICB9CiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgYXJyYXlDb25zdHJ1Y3Rvcih4LmJ1ZmZlciwgeC5ieXRlT2Zmc2V0ICsgZGF0YU9mZnNldCwgamF2YXNjcmlwdEVsZW1lbnRzKTsKICAgICAgY29udmVydEVuZGlhbihkYXRhLCBlbmRpYW5uZXNzLCBieXRlc1BlckVsZW1lbnQpOwogICAgICByZXR1cm4gbmV3IE51bXB5QXJyYXkoZGF0YSwgc2hhcGUsIGRhdGFUeXBlLCBoZWFkZXJPYmplY3RbImZvcnRyYW5fb3JkZXIiXSA9PT0gdHJ1ZSk7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9zbGljZXZpZXcvYmFja2VuZF9jaHVua19kZWNvZGVycy9ib3NzTnB6LnRzCiAgICBhc3luYyBmdW5jdGlvbiBkZWNvZGVCb3NzTnB6Q2h1bmsoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuLCByZXNwb25zZSkgewogICAgICBsZXQgcGFyc2VSZXN1bHQgPSBwYXJzZU5weShhd2FpdCByZXF1ZXN0QXN5bmNDb21wdXRhdGlvbihkZWNvZGVHemlwLCBjYW5jZWxsYXRpb25Ub2tlbiwgW3Jlc3BvbnNlXSwgbmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKSk7CiAgICAgIGxldCBjaHVua0RhdGFTaXplID0gY2h1bmsuY2h1bmtEYXRhU2l6ZTsKICAgICAgbGV0IHNvdXJjZSA9IGNodW5rLnNvdXJjZTsKICAgICAgbGV0IHsgc2hhcGUgfSA9IHBhcnNlUmVzdWx0OwogICAgICBpZiAoc2hhcGUubGVuZ3RoICE9PSAzIHx8IHNoYXBlWzBdICE9PSBjaHVua0RhdGFTaXplWzJdIHx8IHNoYXBlWzFdICE9PSBjaHVua0RhdGFTaXplWzFdIHx8IHNoYXBlWzJdICE9PSBjaHVua0RhdGFTaXplWzBdKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaGFwZSAke0pTT04uc3RyaW5naWZ5KHNoYXBlKX0gZG9lcyBub3QgbWF0Y2ggY2h1bmtEYXRhU2l6ZSAke3ZlYzNLZXkoY2h1bmtEYXRhU2l6ZSl9YCk7CiAgICAgIH0KICAgICAgbGV0IHBhcnNlZERhdGFUeXBlID0gcGFyc2VSZXN1bHQuZGF0YVR5cGU7CiAgICAgIGxldCB7IHNwZWMgfSA9IHNvdXJjZTsKICAgICAgaWYgKHBhcnNlZERhdGFUeXBlICE9PSBzcGVjLmRhdGFUeXBlKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhIHR5cGUgJHtEYXRhVHlwZVtwYXJzZWREYXRhVHlwZV19IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIGRhdGEgdHlwZSAke0RhdGFUeXBlW3NwZWMuZGF0YVR5cGVdfWApOwogICAgICB9CiAgICAgIGF3YWl0IHBvc3RQcm9jZXNzUmF3RGF0YShjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4sIHBhcnNlUmVzdWx0LmRhdGEpOwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvZGF0YXNvdXJjZS9ib3NzL2JhY2tlbmQudHMKICAgIHZhciBjaHVua0RlY29kZXJzID0gbmV3IE1hcCgpOwogICAgY2h1bmtEZWNvZGVycy5zZXQoIm5weiIsIGRlY29kZUJvc3NOcHpDaHVuayk7CiAgICBjaHVua0RlY29kZXJzLnNldCgianBlZyIsIGRlY29kZUpwZWdDaHVuayk7CiAgICB2YXIgYWNjZXB0SGVhZGVycyA9IG5ldyBNYXAoKTsKICAgIGFjY2VwdEhlYWRlcnMuc2V0KCJucHoiLCAiYXBwbGljYXRpb24vbnB5Z3oiKTsKICAgIGFjY2VwdEhlYWRlcnMuc2V0KCJqcGVnIiwgImltYWdlL2pwZWciKTsKICAgIGZ1bmN0aW9uIEJvc3NTb3VyY2UoQmFzZSwgcGFyYW1ldGVyc0NvbnN0cnVjdG9yKSB7CiAgICAgIHJldHVybiBXaXRoUGFyYW1ldGVycyhXaXRoU2hhcmVkQ3JlZGVudGlhbHNQcm92aWRlckNvdW50ZXJwYXJ0KCkoQmFzZSksIHBhcmFtZXRlcnNDb25zdHJ1Y3Rvcik7CiAgICB9CiAgICB2YXIgQm9zc1ZvbHVtZUNodW5rU291cmNlID0gY2xhc3MgZXh0ZW5kcyBCb3NzU291cmNlKFZvbHVtZUNodW5rU291cmNlLCBWb2x1bWVDaHVua1NvdXJjZVBhcmFtZXRlcnMpIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICB0aGlzLmNodW5rRGVjb2RlciA9IGNodW5rRGVjb2RlcnMuZ2V0KHRoaXMucGFyYW1ldGVycy5lbmNvZGluZyk7CiAgICAgIH0KICAgICAgYXN5bmMgZG93bmxvYWQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgbGV0IHsgcGFyYW1ldGVycyB9ID0gdGhpczsKICAgICAgICBsZXQgdXJsID0gYCR7cGFyYW1ldGVycy5iYXNlVXJsfS9sYXRlc3QvY3V0b3V0LyR7cGFyYW1ldGVycy5jb2xsZWN0aW9ufS8ke3BhcmFtZXRlcnMuZXhwZXJpbWVudH0vJHtwYXJhbWV0ZXJzLmNoYW5uZWx9LyR7cGFyYW1ldGVycy5yZXNvbHV0aW9ufWA7CiAgICAgICAgewogICAgICAgICAgbGV0IGNodW5rUG9zaXRpb24gPSB0aGlzLmNvbXB1dGVDaHVua0JvdW5kcyhjaHVuayk7CiAgICAgICAgICBsZXQgY2h1bmtEYXRhU2l6ZSA9IGNodW5rLmNodW5rRGF0YVNpemU7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgICAgICB1cmwgKz0gYC8ke2NodW5rUG9zaXRpb25baV19OiR7Y2h1bmtQb3NpdGlvbltpXSArIGNodW5rRGF0YVNpemVbaV19YDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdXJsICs9ICIvIjsKICAgICAgICBpZiAocGFyYW1ldGVycy53aW5kb3cgIT09IHZvaWQgMCkgewogICAgICAgICAgdXJsICs9IGA/d2luZG93PSR7cGFyYW1ldGVycy53aW5kb3dbMF19LCR7cGFyYW1ldGVycy53aW5kb3dbMV19YDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhCb3NzQ3JlZGVudGlhbHModGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCB1cmwsIHsgaGVhZGVyczogeyAiQWNjZXB0IjogYWNjZXB0SGVhZGVycy5nZXQocGFyYW1ldGVycy5lbmNvZGluZykgfSB9LCByZXNwb25zZUFycmF5QnVmZmVyLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgYXdhaXQgdGhpcy5jaHVua0RlY29kZXIoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuLCByZXNwb25zZSk7CiAgICAgIH0KICAgIH07CiAgICBCb3NzVm9sdW1lQ2h1bmtTb3VyY2UgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdCgpCiAgICBdLCBCb3NzVm9sdW1lQ2h1bmtTb3VyY2UpOwogICAgZnVuY3Rpb24gZGVjb2RlTWFuaWZlc3RDaHVuayhjaHVuaywgcmVzcG9uc2UpIHsKICAgICAgcmV0dXJuIGRlY29kZUpzb25NYW5pZmVzdENodW5rKGNodW5rLCByZXNwb25zZSwgImZyYWdtZW50cyIpOwogICAgfQogICAgZnVuY3Rpb24gZGVjb2RlRnJhZ21lbnRDaHVuayhjaHVuaywgcmVzcG9uc2UpIHsKICAgICAgbGV0IGR2ID0gbmV3IERhdGFWaWV3KHJlc3BvbnNlKTsKICAgICAgbGV0IG51bVZlcnRpY2VzID0gZHYuZ2V0VWludDMyKDAsIHRydWUpOwogICAgICBhc3NpZ25NZXNoRnJhZ21lbnREYXRhKGNodW5rLCBkZWNvZGVUcmlhbmdsZVZlcnRleFBvc2l0aW9uc0FuZEluZGljZXMocmVzcG9uc2UsIEVuZGlhbm5lc3MuTElUVExFLCA0LCBudW1WZXJ0aWNlcykpOwogICAgfQogICAgdmFyIEJvc3NNZXNoU291cmNlID0gY2xhc3MgZXh0ZW5kcyBCb3NzU291cmNlKE1lc2hTb3VyY2UsIE1lc2hTb3VyY2VQYXJhbWV0ZXJzMikgewogICAgICBkb3dubG9hZChjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICBjb25zdCB7IHBhcmFtZXRlcnMgfSA9IHRoaXM7CiAgICAgICAgcmV0dXJuIGNhbmNlbGxhYmxlRmV0Y2hPayhgJHtwYXJhbWV0ZXJzLmJhc2VVcmx9JHtjaHVuay5vYmplY3RJZH1gLCB7fSwgcmVzcG9uc2VBcnJheUJ1ZmZlciwgY2FuY2VsbGF0aW9uVG9rZW4pLnRoZW4oKHJlc3BvbnNlKSA9PiBkZWNvZGVNYW5pZmVzdENodW5rKGNodW5rLCByZXNwb25zZSkpOwogICAgICB9CiAgICAgIGRvd25sb2FkRnJhZ21lbnQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIHJldHVybiBjYW5jZWxsYWJsZUZldGNoT2soYCR7cGFyYW1ldGVycy5iYXNlVXJsfSR7Y2h1bmsuZnJhZ21lbnRJZH1gLCB7fSwgcmVzcG9uc2VBcnJheUJ1ZmZlciwgY2FuY2VsbGF0aW9uVG9rZW4pLnRoZW4oKHJlc3BvbnNlKSA9PiBkZWNvZGVGcmFnbWVudENodW5rKGNodW5rLCByZXNwb25zZSkpOwogICAgICB9CiAgICB9OwogICAgQm9zc01lc2hTb3VyY2UgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdCgpCiAgICBdLCBCb3NzTWVzaFNvdXJjZSk7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9kYXRhc291cmNlL2R2aWQvYmFzZS50cwogICAgdmFyIGFubm90YXRpb25DaHVua0RhdGFTaXplID0gdmVjM19leHBvcnRzLmZyb21WYWx1ZXMoMTI4LCAxMjgsIDEyOCk7CiAgICB2YXIgVm9sdW1lQ2h1bmtFbmNvZGluZzI7CiAgICAoZnVuY3Rpb24oVm9sdW1lQ2h1bmtFbmNvZGluZzYpIHsKICAgICAgVm9sdW1lQ2h1bmtFbmNvZGluZzZbVm9sdW1lQ2h1bmtFbmNvZGluZzZbIkpQRUciXSA9IDBdID0gIkpQRUciOwogICAgICBWb2x1bWVDaHVua0VuY29kaW5nNltWb2x1bWVDaHVua0VuY29kaW5nNlsiUkFXIl0gPSAxXSA9ICJSQVciOwogICAgICBWb2x1bWVDaHVua0VuY29kaW5nNltWb2x1bWVDaHVua0VuY29kaW5nNlsiQ09NUFJFU1NFRF9TRUdNRU5UQVRJT04iXSA9IDJdID0gIkNPTVBSRVNTRURfU0VHTUVOVEFUSU9OIjsKICAgICAgVm9sdW1lQ2h1bmtFbmNvZGluZzZbVm9sdW1lQ2h1bmtFbmNvZGluZzZbIkNPTVBSRVNTRURfU0VHTUVOVEFUSU9OQVJSQVkiXSA9IDNdID0gIkNPTVBSRVNTRURfU0VHTUVOVEFUSU9OQVJSQVkiOwogICAgfSkoVm9sdW1lQ2h1bmtFbmNvZGluZzIgfHwgKFZvbHVtZUNodW5rRW5jb2RpbmcyID0ge30pKTsKICAgIHZhciBEVklEU291cmNlUGFyYW1ldGVycyA9IGNsYXNzIHsKICAgIH07CiAgICB2YXIgVm9sdW1lQ2h1bmtTb3VyY2VQYXJhbWV0ZXJzMiA9IGNsYXNzIGV4dGVuZHMgRFZJRFNvdXJjZVBhcmFtZXRlcnMgewogICAgfTsKICAgIFZvbHVtZUNodW5rU291cmNlUGFyYW1ldGVyczIuUlBDX0lEID0gImR2aWQvVm9sdW1lQ2h1bmtTb3VyY2UiOwogICAgdmFyIFNrZWxldG9uU291cmNlUGFyYW1ldGVyczIgPSBjbGFzcyBleHRlbmRzIERWSURTb3VyY2VQYXJhbWV0ZXJzIHsKICAgIH07CiAgICBTa2VsZXRvblNvdXJjZVBhcmFtZXRlcnMyLlJQQ19JRCA9ICJkdmlkL1NrZWxldG9uU291cmNlIjsKICAgIHZhciBNZXNoU291cmNlUGFyYW1ldGVyczMgPSBjbGFzcyBleHRlbmRzIERWSURTb3VyY2VQYXJhbWV0ZXJzIHsKICAgIH07CiAgICBNZXNoU291cmNlUGFyYW1ldGVyczMuUlBDX0lEID0gImR2aWQvTWVzaFNvdXJjZSI7CiAgICB2YXIgQW5ub3RhdGlvblNvdXJjZVBhcmFtZXRlcnNCYXNlID0gY2xhc3MgZXh0ZW5kcyBEVklEU291cmNlUGFyYW1ldGVycyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5jaHVua0RhdGFTaXplID0gYW5ub3RhdGlvbkNodW5rRGF0YVNpemU7CiAgICAgIH0KICAgIH07CiAgICB2YXIgQW5ub3RhdGlvblNvdXJjZVBhcmFtZXRlcnMyID0gY2xhc3MgZXh0ZW5kcyBBbm5vdGF0aW9uU291cmNlUGFyYW1ldGVyc0Jhc2UgewogICAgfTsKICAgIEFubm90YXRpb25Tb3VyY2VQYXJhbWV0ZXJzMi5SUENfSUQgPSAiZHZpZC9Bbm5vdGF0aW9uU291cmNlIjsKICAgIHZhciBBbm5vdGF0aW9uQ2h1bmtTb3VyY2VQYXJhbWV0ZXJzID0gY2xhc3MgZXh0ZW5kcyBBbm5vdGF0aW9uU291cmNlUGFyYW1ldGVyc0Jhc2UgewogICAgfTsKICAgIEFubm90YXRpb25DaHVua1NvdXJjZVBhcmFtZXRlcnMuUlBDX0lEID0gImR2aWQvQW5ub3RhdGlvbkNodW5rU291cmNlIjsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3NrZWxldG9uL2RlY29kZV9zd2Nfc2tlbGV0b24udHMKICAgIGZ1bmN0aW9uIGRlY29kZVN3Y1NrZWxldG9uQ2h1bmsoY2h1bmssIHN3Y1N0cikgewogICAgICBsZXQgc3djT2JqZWN0cyA9IHBhcnNlU3djKHN3Y1N0cik7CiAgICAgIGlmIChzd2NPYmplY3RzLmxlbmd0aCA8IDEpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVSUk9SIHBhcnNpbmcgc3djIGRhdGFgKTsKICAgICAgfQogICAgICBsZXQgaW5kZXhNYXAgPSBuZXcgVWludDMyQXJyYXkoc3djT2JqZWN0cy5sZW5ndGgpOwogICAgICBsZXQgbm9kZUNvdW50ID0gMDsKICAgICAgbGV0IGVkZ2VDb3VudCA9IDA7CiAgICAgIHN3Y09iamVjdHMuZm9yRWFjaCgoc3djT2JqLCBpKSA9PiB7CiAgICAgICAgaWYgKHN3Y09iaikgewogICAgICAgICAgaW5kZXhNYXBbaV0gPSBub2RlQ291bnQrKzsKICAgICAgICAgIGlmIChzd2NPYmoucGFyZW50ID49IDApIHsKICAgICAgICAgICAgKytlZGdlQ291bnQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgbGV0IGdsVmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KDMgKiBub2RlQ291bnQpOwogICAgICBsZXQgZ2xJbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KDIgKiBlZGdlQ291bnQpOwogICAgICBsZXQgbm9kZUluZGV4ID0gMDsKICAgICAgbGV0IGVkZ2V0SW5kZXggPSAwOwogICAgICBzd2NPYmplY3RzLmZvckVhY2goZnVuY3Rpb24oc3djT2JqKSB7CiAgICAgICAgaWYgKHN3Y09iaikgewogICAgICAgICAgZ2xWZXJ0aWNlc1szICogbm9kZUluZGV4XSA9IHN3Y09iai54OwogICAgICAgICAgZ2xWZXJ0aWNlc1szICogbm9kZUluZGV4ICsgMV0gPSBzd2NPYmoueTsKICAgICAgICAgIGdsVmVydGljZXNbMyAqIG5vZGVJbmRleCArIDJdID0gc3djT2JqLno7CiAgICAgICAgICBpZiAoc3djT2JqLnBhcmVudCA+PSAwKSB7CiAgICAgICAgICAgIGdsSW5kaWNlc1syICogZWRnZXRJbmRleF0gPSBub2RlSW5kZXg7CiAgICAgICAgICAgIGdsSW5kaWNlc1syICogZWRnZXRJbmRleCArIDFdID0gaW5kZXhNYXBbc3djT2JqLnBhcmVudF07CiAgICAgICAgICAgICsrZWRnZXRJbmRleDsKICAgICAgICAgIH0KICAgICAgICAgICsrbm9kZUluZGV4OwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGNodW5rLmluZGljZXMgPSBnbEluZGljZXM7CiAgICAgIGNodW5rLnZlcnRleFBvc2l0aW9ucyA9IGdsVmVydGljZXM7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZVN3Yyhzd2NTdHIpIHsKICAgICAgbGV0IHN3Y0lucHV0QXIgPSBzd2NTdHIuc3BsaXQoIlxuIik7CiAgICAgIGxldCBzd2NPYmplY3RzQXIgPSBuZXcgQXJyYXkoKTsKICAgICAgbGV0IGZsb2F0ID0gIi0/XFxkKig/OlxcLlxcZCspPyI7CiAgICAgIGxldCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCgiXlsgXFx0XSooIiArIFsKICAgICAgICAiXFxkKyIsCiAgICAgICAgIlxcZCsiLAogICAgICAgIGZsb2F0LAogICAgICAgIGZsb2F0LAogICAgICAgIGZsb2F0LAogICAgICAgIGZsb2F0LAogICAgICAgICItMXxcXGQrIgogICAgICBdLmpvaW4oIilbIFxcdF0rKCIpICsgIilbIFxcdF0qJCIpOwogICAgICBzd2NJbnB1dEFyLmZvckVhY2goZnVuY3Rpb24oZSkgewogICAgICAgIGxldCBtYXRjaCA9IGUubWF0Y2gocGF0dGVybik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICBsZXQgcG9pbnQgPSBzd2NPYmplY3RzQXJbcGFyc2VJbnQobWF0Y2hbMV0sIDEwKV0gPSBuZXcgUG9pbnRPYmooKTsKICAgICAgICAgIHBvaW50LnR5cGUgPSBwYXJzZUludChtYXRjaFsyXSwgMTApOwogICAgICAgICAgcG9pbnQueCA9IHBhcnNlRmxvYXQobWF0Y2hbM10pOwogICAgICAgICAgcG9pbnQueSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pOwogICAgICAgICAgcG9pbnQueiA9IHBhcnNlRmxvYXQobWF0Y2hbNV0pOwogICAgICAgICAgcG9pbnQucmFkaXVzID0gcGFyc2VGbG9hdChtYXRjaFs2XSk7CiAgICAgICAgICBwb2ludC5wYXJlbnQgPSBwYXJzZUludChtYXRjaFs3XSwgMTApOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBzd2NPYmplY3RzQXI7CiAgICB9CiAgICB2YXIgUG9pbnRPYmogPSBjbGFzcyB7CiAgICB9OwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvZGF0YXNvdXJjZS9kdmlkL2FwaS50cwogICAgdmFyIERWSURJbnN0YW5jZSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoYmFzZVVybCwgbm9kZUtleSkgewogICAgICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7CiAgICAgICAgdGhpcy5ub2RlS2V5ID0gbm9kZUtleTsKICAgICAgfQogICAgICBnZXROb2RlQXBpVXJsKHBhdGggPSAiIikgewogICAgICAgIHJldHVybiBgJHt0aGlzLmJhc2VVcmx9L2FwaS9ub2RlLyR7dGhpcy5ub2RlS2V5fSR7cGF0aH1gOwogICAgICB9CiAgICAgIGdldFJlcG9JbmZvVXJsKCkgewogICAgICAgIHJldHVybiBgJHt0aGlzLmJhc2VVcmx9L2FwaS9yZXBvcy9pbmZvYDsKICAgICAgfQogICAgICBnZXRLZXlWYWx1ZVVybChkYXRhTmFtZSwga2V5KSB7CiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0Tm9kZUFwaVVybCgpfS8ke2RhdGFOYW1lfS9rZXkvJHtrZXl9YDsKICAgICAgfQogICAgICBnZXRLZXlWYWx1ZVJhbmdlVXJsKGRhdGFOYW1lLCBzdGFydEtleSwgZW5kS2V5KSB7CiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0Tm9kZUFwaVVybCgpfS8ke2RhdGFOYW1lfS9rZXlyYW5nZS8ke3N0YXJ0S2V5fS8ke2VuZEtleX1gOwogICAgICB9CiAgICAgIGdldEtleVZhbHVlc1VybChkYXRhTmFtZSkgewogICAgICAgIHJldHVybiBgJHt0aGlzLmdldE5vZGVBcGlVcmwoKX0vJHtkYXRhTmFtZX0va2V5dmFsdWVzP2pzb250YXI9ZmFsc2VgOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gYXBwZW5kUXVlcnlTdHJpbmcodXJsLCBuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gYCR7dXJsfSR7dXJsLmluY2x1ZGVzKCI/IikgPyAiJiIgOiAiPyJ9JHtuYW1lfT0ke3ZhbHVlfWA7CiAgICB9CiAgICBmdW5jdGlvbiBhcHBlbmRRdWVyeVN0cmluZ0ZvckR2aWQodXJsLCB1c2VyKSB7CiAgICAgIGxldCBuZXdVcmwgPSBhcHBlbmRRdWVyeVN0cmluZyh1cmwsICJhcHAiLCAiTmV1cm9nbGFuY2VyIik7CiAgICAgIGlmICh1c2VyKSB7CiAgICAgICAgbmV3VXJsICs9IGAmdT0ke3VzZXJ9YDsKICAgICAgfQogICAgICByZXR1cm4gbmV3VXJsOwogICAgfQogICAgZnVuY3Rpb24gcmVzcG9uc2VUZXh0KHJlc3BvbnNlKSB7CiAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7CiAgICB9CiAgICBmdW5jdGlvbiBtYWtlUmVxdWVzdDIoaHR0cENhbGwsIGNhbmNlbGxhdGlvblRva2VuID0gdW5jYW5jZWxhYmxlVG9rZW4pIHsKICAgICAgY29uc3QgcmVxdWVzdEluZm8gPSBgJHtodHRwQ2FsbC51cmx9YDsKICAgICAgY29uc3QgaW5pdCA9IHsgbWV0aG9kOiBodHRwQ2FsbC5tZXRob2QsIGJvZHk6IGh0dHBDYWxsLnBheWxvYWQgfTsKICAgICAgaWYgKGh0dHBDYWxsLnJlc3BvbnNlVHlwZSA9PT0gIiIpIHsKICAgICAgICByZXR1cm4gY2FuY2VsbGFibGVGZXRjaE9rKHJlcXVlc3RJbmZvLCBpbml0LCByZXNwb25zZVRleHQsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgfSBlbHNlIGlmIChodHRwQ2FsbC5yZXNwb25zZVR5cGUgPT09ICJhcnJheWJ1ZmZlciIpIHsKICAgICAgICByZXR1cm4gY2FuY2VsbGFibGVGZXRjaE9rKHJlcXVlc3RJbmZvLCBpbml0LCByZXNwb25zZUFycmF5QnVmZmVyLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgIH0KICAgICAgewogICAgICAgIHJldHVybiBjYW5jZWxsYWJsZUZldGNoT2socmVxdWVzdEluZm8sIGluaXQsIHJlc3BvbnNlSnNvbiwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBtYWtlUmVxdWVzdFdpdGhDcmVkZW50aWFscyhjcmVkZW50aWFsc1Byb3ZpZGVyLCBodHRwQ2FsbCwgY2FuY2VsbGF0aW9uVG9rZW4gPSB1bmNhbmNlbGFibGVUb2tlbikgewogICAgICByZXR1cm4gZmV0Y2hXaXRoRFZJRENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzUHJvdmlkZXIsIGh0dHBDYWxsLnVybCwgeyBtZXRob2Q6IGh0dHBDYWxsLm1ldGhvZCwgYm9keTogaHR0cENhbGwucGF5bG9hZCB9LCBodHRwQ2FsbC5yZXNwb25zZVR5cGUgPT09ICIiID8gcmVzcG9uc2VUZXh0IDogaHR0cENhbGwucmVzcG9uc2VUeXBlID09PSAianNvbiIgPyByZXNwb25zZUpzb24gOiByZXNwb25zZUFycmF5QnVmZmVyLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICB9CiAgICBmdW5jdGlvbiBmZXRjaFdpdGhEVklEQ3JlZGVudGlhbHMoY3JlZGVudGlhbHNQcm92aWRlciwgaW5wdXQsIGluaXQsIHRyYW5zZm9ybVJlc3BvbnNlLCBjYW5jZWxsYXRpb25Ub2tlbiA9IHVuY2FuY2VsYWJsZVRva2VuKSB7CiAgICAgIHJldHVybiBmZXRjaFdpdGhDcmVkZW50aWFscyhjcmVkZW50aWFsc1Byb3ZpZGVyLCBpbnB1dCwgaW5pdCwgdHJhbnNmb3JtUmVzcG9uc2UsIChjcmVkZW50aWFscywgaW5pdDIpID0+IHsKICAgICAgICBjb25zdCBuZXdJbml0ID0geyAuLi5pbml0MiB9OwogICAgICAgIGlmIChjcmVkZW50aWFscy50b2tlbikgewogICAgICAgICAgbmV3SW5pdC5oZWFkZXJzID0geyAuLi5uZXdJbml0LmhlYWRlcnMsIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtjcmVkZW50aWFsc31gIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdJbml0OwogICAgICB9LCAoZXJyb3IpID0+IHsKICAgICAgICBjb25zdCB7IHN0YXR1cyB9ID0gZXJyb3I7CiAgICAgICAgaWYgKHN0YXR1cyA9PT0gNTA0KSB7CiAgICAgICAgICByZXR1cm4gInJldHJ5IjsKICAgICAgICB9CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0sIGNhbmNlbGxhdGlvblRva2VuKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZldGNoTWVzaERhdGFGcm9tU2VydmljZShwYXJhbWV0ZXJzLCBmcmFnbWVudElkLCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICBjb25zdCB7IGR2aWRTZXJ2aWNlIH0gPSBwYXJhbWV0ZXJzOwogICAgICBpZiAoZHZpZFNlcnZpY2UpIHsKICAgICAgICBjb25zdCBzZXJ2aWNlVXJsID0gYCR7ZHZpZFNlcnZpY2V9L3NtYWxsLW1lc2g/ZHZpZD0ke3BhcmFtZXRlcnMuYmFzZVVybH0mdXVpZD0ke3BhcmFtZXRlcnMubm9kZUtleX0mYm9keT0ke2ZyYWdtZW50SWR9JnNlZ21lbnRhdGlvbj0ke3BhcmFtZXRlcnMuc2VnbWVudGF0aW9uTmFtZX0ke3BhcmFtZXRlcnMudXNlciA/IGAmdT0ke3BhcmFtZXRlcnMudXNlcn1gIDogIiJ9JHtwYXJhbWV0ZXJzLnN1cGVydm94ZWxzID8gIiZzdXBlcnZveGVscz10cnVlIiA6ICIifWA7CiAgICAgICAgcmV0dXJuIG1ha2VSZXF1ZXN0Mih7CiAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgdXJsOiBzZXJ2aWNlVXJsLAogICAgICAgICAgcmVzcG9uc2VUeXBlOiAiYXJyYXlidWZmZXIiCiAgICAgICAgfSwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiTm8gbWVzaCBzZXJ2aWNlIGF2YWlsYWJsZSIpOwogICAgICB9CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9kYXRhc291cmNlL2ZseWVtL2Fubm90YXRpb24udHMKICAgIHZhciBBTk5PVEFJSU9OX0NPTU1JVF9BRERfU0lHTkFMX1JQQ19JRCA9ICJhbm5vdGF0aW9uLmFkZC5zaWduYWwiOwogICAgcmVnaXN0ZXJSUEMoQU5OT1RBSUlPTl9DT01NSVRfQUREX1NJR05BTF9SUENfSUQsIGZ1bmN0aW9uKHgpIHsKICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5nZXQoeC5pZCk7CiAgICAgIGNvbnN0IG5ld0Fubm90YXRpb24gPSBmaXhBbm5vdGF0aW9uQWZ0ZXJTdHJ1Y3R1cmVkQ2xvbmluZyh4Lm5ld0Fubm90YXRpb24pOwogICAgICBpZiAobmV3QW5ub3RhdGlvbikgewogICAgICAgIHNvdXJjZS5wYXJlbnQudXBkYXRlUmVmZXJlbmNlKG5ld0Fubm90YXRpb24pOwogICAgICAgIHNvdXJjZS5wYXJlbnQuY2hpbGRBZGRlZC5kaXNwYXRjaChuZXdBbm5vdGF0aW9uKTsKICAgICAgfQogICAgfSk7CiAgICB2YXIgQW5ub3RhdGlvbkZhY2FkZSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoYW5ub3RhdGlvbikgewogICAgICAgIHRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247CiAgICAgIH0KICAgICAgZ2V0IHJlbmRlcmluZ0F0dHJpYnV0ZSgpIHsKICAgICAgICBpZiAodGhpcy5raW5kID09PSAiQXRsYXMiKSB7CiAgICAgICAgICBpZiAoIXRoaXMudGl0bGUpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrZWQpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh0aGlzLmJvb2ttYXJrVHlwZSA9PT0gIkZhbHNlIFNwbGl0IikgewogICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ib29rbWFya1R5cGUgPT09ICJGYWxzZSBNZXJnZSIpIHsKICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGdldCBjb25maWRlbmNlKCkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHVwZGF0ZVByb3BlcnRpZXMoKSB7CiAgICAgICAgdGhpcy5hbm5vdGF0aW9uLnByb3BlcnRpZXMgPSBbdGhpcy5yZW5kZXJpbmdBdHRyaWJ1dGUsIHRoaXMuY29uZmlkZW5jZV07CiAgICAgIH0KICAgICAgZ2V0IGV4dCgpIHsKICAgICAgICBpZiAodGhpcy5hbm5vdGF0aW9uLmV4dCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB0aGlzLmFubm90YXRpb24uZXh0ID0ge307CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb24uZXh0OwogICAgICB9CiAgICAgIGdldCBwcm9wKCkgewogICAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb24ucHJvcDsKICAgICAgfQogICAgICBzZXQgcHJvcCh2YWx1ZSkgewogICAgICAgIHRoaXMuYW5ub3RhdGlvbi5wcm9wID0gdmFsdWU7CiAgICAgIH0KICAgICAgZ2V0IGJvb2ttYXJrVHlwZSgpIHsKICAgICAgICBpZiAodGhpcy5wcm9wKSB7CiAgICAgICAgICBzd2l0Y2ggKHRoaXMucHJvcC50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgIlNwbGl0IjoKICAgICAgICAgICAgICByZXR1cm4gIkZhbHNlIE1lcmdlIjsKICAgICAgICAgICAgY2FzZSAiTWVyZ2UiOgogICAgICAgICAgICAgIHJldHVybiAiRmFsc2UgU3BsaXQiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gIk90aGVyIjsKICAgICAgfQogICAgICBnZXQgdHlwZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9uLnR5cGU7CiAgICAgIH0KICAgICAgZ2V0IGtpbmQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbi5raW5kOwogICAgICB9CiAgICAgIHNldCBraW5kKHZhbHVlKSB7CiAgICAgICAgdGhpcy5hbm5vdGF0aW9uLmtpbmQgPSB2YWx1ZTsKICAgICAgICB0aGlzLnVwZGF0ZSgpOwogICAgICB9CiAgICAgIHJvdW5kUG9zKCkgewogICAgICAgIGlmICh0aGlzLmFubm90YXRpb24udHlwZSA9PT0gQW5ub3RhdGlvblR5cGUuUE9JTlQpIHsKICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbi5wb2ludCA9IHRoaXMuYW5ub3RhdGlvbi5wb2ludC5tYXAoKHgpID0+IE1hdGgucm91bmQoeCkpOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5hbm5vdGF0aW9uLnR5cGUgPT09IEFubm90YXRpb25UeXBlLkxJTkUgfHwgdGhpcy5hbm5vdGF0aW9uLnR5cGUgPT09IEFubm90YXRpb25UeXBlLlNQSEVSRSkgewogICAgICAgICAgdGhpcy5hbm5vdGF0aW9uLnBvaW50QSA9IHRoaXMuYW5ub3RhdGlvbi5wb2ludEEubWFwKCh4KSA9PiBNYXRoLnJvdW5kKHgpKTsKICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbi5wb2ludEIgPSB0aGlzLmFubm90YXRpb24ucG9pbnRCLm1hcCgoeCkgPT4gTWF0aC5yb3VuZCh4KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHNldFByb3AocHJvcCkgewogICAgICAgIHRoaXMucHJvcCA9IHsgLi4udGhpcy5wcm9wLCAuLi5wcm9wIH07CiAgICAgIH0KICAgICAgZ2V0IHVzZXIoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJvcCAmJiB0aGlzLnByb3AudXNlcjsKICAgICAgfQogICAgICBzZXQgdXNlcih2YWx1ZSkgewogICAgICAgIHRoaXMuc2V0UHJvcCh7IHVzZXI6IHZhbHVlIH0pOwogICAgICB9CiAgICAgIGdldCBjb21tZW50KCkgewogICAgICAgIHJldHVybiB0aGlzLnByb3AgJiYgdGhpcy5wcm9wLmNvbW1lbnQ7CiAgICAgIH0KICAgICAgZ2V0IGRlc2NyaXB0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQ7CiAgICAgIH0KICAgICAgdXBkYXRlUHJlc2VudGF0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnRpdGxlKSB7CiAgICAgICAgICB0aGlzLmFubm90YXRpb24uZGVzY3JpcHRpb24gPSB0aGlzLnRpdGxlICsgIjogIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5hbm5vdGF0aW9uLmRlc2NyaXB0aW9uID0gIiI7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7CiAgICAgICAgICB0aGlzLmFubm90YXRpb24uZGVzY3JpcHRpb24gKz0gdGhpcy5kZXNjcmlwdGlvbjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdXBkYXRlKCkgewogICAgICAgIHRoaXMudXBkYXRlUHJlc2VudGF0aW9uKCk7CiAgICAgICAgdGhpcy51cGRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgICAgc2V0IGNvbW1lbnQocykgewogICAgICAgIHRoaXMuc2V0UHJvcCh7IGNvbW1lbnQ6IHMgfSk7CiAgICAgICAgdGhpcy51cGRhdGVQcmVzZW50YXRpb24oKTsKICAgICAgfQogICAgICB1cGRhdGVDb21tZW50KCkgewogICAgICAgIHRoaXMuY29tbWVudCA9IHRoaXMuYW5ub3RhdGlvbi5kZXNjcmlwdGlvbiB8fCAiIjsKICAgICAgICB0aGlzLmFubm90YXRpb24uZGVzY3JpcHRpb24gPSB2b2lkIDA7CiAgICAgIH0KICAgICAgZ2V0IHRpdGxlKCkgewogICAgICAgIHJldHVybiB0aGlzLnByb3AgJiYgdGhpcy5wcm9wLnRpdGxlOwogICAgICB9CiAgICAgIHNldCB0aXRsZShzKSB7CiAgICAgICAgdGhpcy5zZXRQcm9wKHsgdGl0bGU6IHMgfSk7CiAgICAgICAgdGhpcy51cGRhdGVQcmVzZW50YXRpb24oKTsKICAgICAgfQogICAgICBnZXQgdGltZXN0YW1wKCkgewogICAgICAgIHJldHVybiB0aGlzLnByb3AgJiYgdGhpcy5wcm9wLnRpbWVzdGFtcCA/IE51bWJlcih0aGlzLnByb3AudGltZXN0YW1wKSA6IDA7CiAgICAgIH0KICAgICAgYWRkVGltZVN0YW1wKCkgewogICAgICAgIHRoaXMuc2V0UHJvcCh7IHRpbWVzdGFtcDogU3RyaW5nKERhdGUubm93KCkpIH0pOwogICAgICB9CiAgICAgIGdldCBjaGVja2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLmV4dCAmJiB0aGlzLmV4dC52ZXJpZmllZCB8fCB0aGlzLnByb3AgJiYgdGhpcy5wcm9wLmNoZWNrZWQgfHwgZmFsc2U7CiAgICAgIH0KICAgICAgc2V0IGNoZWNrZWQoYykgewogICAgICAgIHRoaXMuc2V0UHJvcCh7IGNoZWNrZWQ6IGMgfSk7CiAgICAgIH0KICAgICAgZ2V0IHByZXNlbnRhdGlvbigpIHsKICAgICAgICB0aGlzLnVwZGF0ZVByZXNlbnRhdGlvbigpOwogICAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb24uZGVzY3JpcHRpb24gfHwgIiI7CiAgICAgIH0KICAgICAgc2V0IHByZXNlbnRhdGlvbih2YWx1ZSkgewogICAgICAgIHRoaXMuYW5ub3RhdGlvbi5kZXNjcmlwdGlvbiA9IHZhbHVlOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gdHlwZU9mQW5ub3RhdGlvbklkKGlkKSB7CiAgICAgIGlmIChpZC5tYXRjaCgvXi0/XGQrXy0/XGQrXy0/XGQrW1xbXT8vKSB8fCBpZC5tYXRjaCgvXlB0LT9cZCtfLT9cZCtfLT9cZCsvKSkgewogICAgICAgIHJldHVybiBBbm5vdGF0aW9uVHlwZS5QT0lOVDsKICAgICAgfSBlbHNlIGlmIChpZC5tYXRjaCgvXi0/XGQrXy0/XGQrXy0/XGQrLS0/XGQrXy0/XGQrXy0/XGQrLUxpbmUkLykgfHwgaWQubWF0Y2goL15Mbi0/XGQrXy0/XGQrXy0/XGQrXz9cZCtfLT9cZCtfLT9cZCsvKSkgewogICAgICAgIHJldHVybiBBbm5vdGF0aW9uVHlwZS5MSU5FOwogICAgICB9IGVsc2UgaWYgKGlkLm1hdGNoKC9eLT9cZCtfLT9cZCtfLT9cZCstLT9cZCtfLT9cZCtfLT9cZCstU3BoZXJlJC8pIHx8IGlkLm1hdGNoKC9eU3AtP1xkK18tP1xkK18tP1xkK18/XGQrXy0/XGQrXy0/XGQrLykpIHsKICAgICAgICByZXR1cm4gQW5ub3RhdGlvblR5cGUuU1BIRVJFOwogICAgICB9CiAgICAgIHsKICAgICAgICBjb25zb2xlLmxvZyhgSW52YWxpZCBhbm5vdGF0aW9uIElEIGZvciBEVklEOiAke2lkfWApOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRBbm5vdGF0aW9uVXNlcihhbm5vdGF0aW9uKSB7CiAgICAgIHJldHVybiBhbm5vdGF0aW9uLmV4dCAmJiBhbm5vdGF0aW9uLmV4dC51c2VyIHx8IGFubm90YXRpb24ucHJvcCAmJiBhbm5vdGF0aW9uLnByb3AudXNlcjsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEFubm90YXRpb25LZXkoYW5ub3RhdGlvbiwga2V5SGFuZGxlKSB7CiAgICAgIGxldCBrZXkgPSBrZXlIYW5kbGUgfHwgYW5ub3RhdGlvbi5rZXk7CiAgICAgIGlmICgha2V5KSB7CiAgICAgICAgc3dpdGNoIChhbm5vdGF0aW9uLnR5cGUpIHsKICAgICAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuUE9JTlQ6CiAgICAgICAgICAgIGtleSA9IGBQdCR7YW5ub3RhdGlvbi5wb2ludFswXX1fJHthbm5vdGF0aW9uLnBvaW50WzFdfV8ke2Fubm90YXRpb24ucG9pbnRbMl19YDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlLkxJTkU6CiAgICAgICAgICAgIGtleSA9IGBMbiR7YW5ub3RhdGlvbi5wb2ludEFbMF19XyR7YW5ub3RhdGlvbi5wb2ludEFbMV19XyR7YW5ub3RhdGlvbi5wb2ludEFbMl19XyR7YW5ub3RhdGlvbi5wb2ludEJbMF19XyR7YW5ub3RhdGlvbi5wb2ludEJbMV19XyR7YW5ub3RhdGlvbi5wb2ludEJbMl19YDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNQSEVSRToKICAgICAgICAgICAga2V5ID0gYFNwJHthbm5vdGF0aW9uLnBvaW50QVswXX1fJHthbm5vdGF0aW9uLnBvaW50QVsxXX1fJHthbm5vdGF0aW9uLnBvaW50QVsyXX1fJHthbm5vdGF0aW9uLnBvaW50QlswXX1fJHthbm5vdGF0aW9uLnBvaW50QlsxXX1fJHthbm5vdGF0aW9uLnBvaW50QlsyXX1gOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEFubm90YXRpb25JZChhbm5vdGF0aW9uLCBrZXlIYW5kbGUpIHsKICAgICAgcmV0dXJuIGAke2dldEFubm90YXRpb25LZXkoYW5ub3RhdGlvbiwga2V5SGFuZGxlKX1bdXNlcjoke2dldEFubm90YXRpb25Vc2VyKGFubm90YXRpb24pfV1gOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VBbm5vdGF0aW9uSWQoaWQpIHsKICAgICAgY29uc3QgbWF0Y2hlZCA9IGlkLm1hdGNoKC8oLiopXFt1c2VyOiguKilcXS8pOwogICAgICByZXR1cm4gbWF0Y2hlZCAmJiB7IGtleTogbWF0Y2hlZFsxXSwgdXNlcjogbWF0Y2hlZFsyXSB9OwogICAgfQogICAgZnVuY3Rpb24gaXNBbm5vdGF0aW9uSWRWYWxpZChpZCkgewogICAgICByZXR1cm4gdHlwZU9mQW5ub3RhdGlvbklkKGlkKSAhPT0gbnVsbDsKICAgIH0KCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2RhdGFzb3VyY2UvZHZpZC91dGlscy50cwogICAgdmFyIERWSURBbm5vdGF0aW9uRmFjYWRlID0gY2xhc3MgZXh0ZW5kcyBBbm5vdGF0aW9uRmFjYWRlIHsKICAgICAgZ2V0IHJlbmRlcmluZ0F0dHJpYnV0ZSgpIHsKICAgICAgICBpZiAodGhpcy5raW5kID09PSAiTm90ZSIpIHsKICAgICAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5ib29rbWFya1R5cGUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuYm9va21hcmtUeXBlID09PSAiRmFsc2UgU3BsaXQiKSB7CiAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ib29rbWFya1R5cGUgPT09ICJGYWxzZSBNZXJnZSIpIHsKICAgICAgICAgICAgICByZXR1cm4gMzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGhpcy5raW5kID09PSAiUHJlU3luIikgewogICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmtpbmQgPT09ICJQb3N0U3luIikgewogICAgICAgICAgcmV0dXJuIDU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGdldCBjb25maWRlbmNlKCkgewogICAgICAgIGlmICh0aGlzLmtpbmQgPT09ICJQcmVTeW4iIHx8IHRoaXMua2luZCA9PT0gIlBvc3RTeW4iKSB7CiAgICAgICAgICBpZiAodGhpcy5wcm9wICYmIHRoaXMucHJvcC5jb25mKSB7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRoaXMucHJvcC5jb25mKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgIH07CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9kYXRhc291cmNlL2R2aWQvYmFja2VuZC50cwogICAgZnVuY3Rpb24gRFZJRFNvdXJjZShCYXNlLCBwYXJhbWV0ZXJzQ29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuIFdpdGhQYXJhbWV0ZXJzKFdpdGhTaGFyZWRDcmVkZW50aWFsc1Byb3ZpZGVyQ291bnRlcnBhcnQoKShCYXNlKSwgcGFyYW1ldGVyc0NvbnN0cnVjdG9yKTsKICAgIH0KICAgIHZhciBEVklEU2tlbGV0b25Tb3VyY2UgPSBjbGFzcyBleHRlbmRzIERWSURTb3VyY2UoU2tlbGV0b25Tb3VyY2UsIFNrZWxldG9uU291cmNlUGFyYW1ldGVyczIpIHsKICAgICAgZG93bmxvYWQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGlmIChwYXJhbWV0ZXJzLnN1cGVydm94ZWxzKSB7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTsKICAgICAgICB9CiAgICAgICAgbGV0IGJvZHlpZCA9IGAke2NodW5rLm9iamVjdElkfWA7CiAgICAgICAgY29uc3QgdXJsID0gYCR7cGFyYW1ldGVycy5iYXNlVXJsfS9hcGkvbm9kZS8ke3BhcmFtZXRlcnNbIm5vZGVLZXkiXX0vJHtwYXJhbWV0ZXJzWyJkYXRhSW5zdGFuY2VLZXkiXX0va2V5L2AgKyBib2R5aWQgKyAiX3N3YyI7CiAgICAgICAgcmV0dXJuIG1ha2VSZXF1ZXN0V2l0aENyZWRlbnRpYWxzKHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgewogICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgIHVybDogYXBwZW5kUXVlcnlTdHJpbmdGb3JEdmlkKHVybCwgcGFyYW1ldGVycy51c2VyKSwKICAgICAgICAgIHJlc3BvbnNlVHlwZTogImFycmF5YnVmZmVyIgogICAgICAgIH0sIGNhbmNlbGxhdGlvblRva2VuKS50aGVuKChyZXNwb25zZSkgPT4gewogICAgICAgICAgbGV0IGVuYyA9IG5ldyBUZXh0RGVjb2RlcigidXRmLTgiKTsKICAgICAgICAgIGRlY29kZVN3Y1NrZWxldG9uQ2h1bmsoY2h1bmssIGVuYy5kZWNvZGUocmVzcG9uc2UpKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIERWSURTa2VsZXRvblNvdXJjZSA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KCkKICAgIF0sIERWSURTa2VsZXRvblNvdXJjZSk7CiAgICBmdW5jdGlvbiBkZWNvZGVGcmFnbWVudENodW5rMihjaHVuaywgcmVzcG9uc2UpIHsKICAgICAgbGV0IGR2ID0gbmV3IERhdGFWaWV3KHJlc3BvbnNlKTsKICAgICAgbGV0IG51bVZlcnRpY2VzID0gZHYuZ2V0VWludDMyKDAsIHRydWUpOwogICAgICBhc3NpZ25NZXNoRnJhZ21lbnREYXRhKGNodW5rLCBkZWNvZGVUcmlhbmdsZVZlcnRleFBvc2l0aW9uc0FuZEluZGljZXMocmVzcG9uc2UsIEVuZGlhbm5lc3MuTElUVExFLCA0LCBudW1WZXJ0aWNlcykpOwogICAgfQogICAgdmFyIERWSURNZXNoU291cmNlID0gY2xhc3MgZXh0ZW5kcyBEVklEU291cmNlKE1lc2hTb3VyY2UsIE1lc2hTb3VyY2VQYXJhbWV0ZXJzMykgewogICAgICBkb3dubG9hZChjaHVuaykgewogICAgICAgIGNodW5rLmZyYWdtZW50SWRzID0gW2Ake2NodW5rLm9iamVjdElkfWBdOwogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodm9pZCAwKTsKICAgICAgfQogICAgICBkb3dubG9hZEZyYWdtZW50KGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgIGNvbnN0IHsgZnJhZ21lbnRJZCB9ID0gY2h1bms7CiAgICAgICAgaWYgKGZyYWdtZW50SWQpIHsKICAgICAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyB9ID0gdGhpczsKICAgICAgICAgIGNvbnN0IGR2aWRJbnN0YW5jZSA9IG5ldyBEVklESW5zdGFuY2UocGFyYW1ldGVycy5iYXNlVXJsLCBwYXJhbWV0ZXJzLm5vZGVLZXkpOwogICAgICAgICAgY29uc3QgbWVzaFVybCA9IGR2aWRJbnN0YW5jZS5nZXRLZXlWYWx1ZVVybChwYXJhbWV0ZXJzLmRhdGFJbnN0YW5jZUtleSwgYCR7ZnJhZ21lbnRJZH0ubmdtZXNoYCk7CiAgICAgICAgICBjb25zdCB7IGZvcmNlRHZpZFNlcnZpY2UsIHN1cGVydm94ZWxzIH0gPSBwYXJhbWV0ZXJzOwogICAgICAgICAgaWYgKGZvcmNlRHZpZFNlcnZpY2UgfHwgc3VwZXJ2b3hlbHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZldGNoTWVzaERhdGFGcm9tU2VydmljZShwYXJhbWV0ZXJzLCBmcmFnbWVudElkLCBjYW5jZWxsYXRpb25Ub2tlbikudGhlbigocmVzcG9uc2UpID0+IGRlY29kZUZyYWdtZW50Q2h1bmsyKGNodW5rLCByZXNwb25zZSkpLmNhdGNoKChlcnJvcikgPT4gewogICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbWFrZVJlcXVlc3RXaXRoQ3JlZGVudGlhbHModGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCB7CiAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICAgIHVybDogYXBwZW5kUXVlcnlTdHJpbmdGb3JEdmlkKG1lc2hVcmwsIHBhcmFtZXRlcnMudXNlciksCiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogImFycmF5YnVmZmVyIgogICAgICAgICAgfSwgY2FuY2VsbGF0aW9uVG9rZW4pLmNhdGNoKCgpID0+IGZldGNoTWVzaERhdGFGcm9tU2VydmljZShwYXJhbWV0ZXJzLCBmcmFnbWVudElkLCBjYW5jZWxsYXRpb25Ub2tlbikpLnRoZW4oKHJlc3BvbnNlKSA9PiBkZWNvZGVGcmFnbWVudENodW5rMihjaHVuaywgcmVzcG9uc2UpKS5jYXRjaCgoZXJyb3IpID0+IHsKICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtZXNoIGZyYWdtZW50IElELiIpOwogICAgICB9CiAgICB9OwogICAgRFZJRE1lc2hTb3VyY2UgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdCgpCiAgICBdLCBEVklETWVzaFNvdXJjZSk7CiAgICBmdW5jdGlvbiBwYXJzZVVpbnQ2NFRvQXJyYXkob3V0LCB2KSB7CiAgICAgIGlmICh2KSB7CiAgICAgICAgb3V0LnB1c2goVWludDY0LnBhcnNlU3RyaW5nKHYpKTsKICAgICAgfQogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VQb2ludEFubm90YXRpb24oZW50cnksIGtpbmQpIHsKICAgICAgbGV0IHByb3AgPSB7fTsKICAgICAgY29uc3QgcHJvcGVydGllc09iaiA9IHZlcmlmeU9iamVjdFByb3BlcnR5KGVudHJ5LCAiUHJvcCIsIHZlcmlmeU9iamVjdCk7CiAgICAgIGNvbnN0IGNvcm5lciA9IHZlcmlmeU9iamVjdFByb3BlcnR5KGVudHJ5LCAiUG9zIiwgKHgpID0+IHBhcnNlSW50VmVjKHZlYzNfZXhwb3J0cy5jcmVhdGUoKSwgeCkpOwogICAgICBsZXQgcmVsYXRlZFNlZ21lbnRzID0gW1tdXTsKICAgICAgcHJvcCA9IHByb3BlcnRpZXNPYmo7CiAgICAgIGlmIChraW5kID09PSAiTm90ZSIpIHsKICAgICAgICByZWxhdGVkU2VnbWVudHNbMF0gPSB2ZXJpZnlPYmplY3RQcm9wZXJ0eShwcm9wZXJ0aWVzT2JqLCAiYm9keSBJRCIsICh4KSA9PiBwYXJzZVVpbnQ2NFRvQXJyYXkoQXJyYXkoKSwgeCkpOwogICAgICB9CiAgICAgIGxldCBhbm5vdGF0aW9uID0gewogICAgICAgIHBvaW50OiBjb3JuZXIsCiAgICAgICAgdHlwZTogQW5ub3RhdGlvblR5cGUuUE9JTlQsCiAgICAgICAgcHJvcGVydGllczogW10sCiAgICAgICAga2luZCwKICAgICAgICBpZDogYCR7Y29ybmVyWzBdfV8ke2Nvcm5lclsxXX1fJHtjb3JuZXJbMl19YCwKICAgICAgICByZWxhdGVkU2VnbWVudHMsCiAgICAgICAgcHJvcDoge30KICAgICAgfTsKICAgICAgbGV0IGFubm90YXRpb25SZWYgPSBuZXcgRFZJREFubm90YXRpb25GYWNhZGUoYW5ub3RhdGlvbik7CiAgICAgIGFubm90YXRpb25SZWYucHJvcCA9IHByb3A7CiAgICAgIGFubm90YXRpb25SZWYudXBkYXRlKCk7CiAgICAgIGxldCBkZXNjcmlwdGlvbiA9IGFubm90YXRpb25SZWYuZGVzY3JpcHRpb247CiAgICAgIGlmIChkZXNjcmlwdGlvbikgewogICAgICAgIGFubm90YXRpb24uZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKICAgICAgfQogICAgICByZXR1cm4gYW5ub3RhdGlvbjsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQW5ub3RhdGlvbjIoZW50cnkpIHsKICAgICAgaWYgKGVudHJ5KSB7CiAgICAgICAgY29uc3Qga2luZCA9IHZlcmlmeU9iamVjdFByb3BlcnR5KGVudHJ5LCAiS2luZCIsIHZlcmlmeVN0cmluZyk7CiAgICAgICAgaWYgKGtpbmQgIT09ICJVbmtub3duIikgewogICAgICAgICAgcmV0dXJuIHBhcnNlUG9pbnRBbm5vdGF0aW9uKGVudHJ5LCBraW5kKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgRFZJREFubm90YXRpb25HZW9tZXRyeUNodW5rU291cmNlID0gY2xhc3MgZXh0ZW5kcyBEVklEU291cmNlKEFubm90YXRpb25HZW9tZXRyeUNodW5rU291cmNlQmFja2VuZCwgQW5ub3RhdGlvbkNodW5rU291cmNlUGFyYW1ldGVycykgewogICAgICBnZXRCbG9ja3NQYXRoKCkgewogICAgICAgIHJldHVybiBgLyR7dGhpcy5wYXJhbWV0ZXJzLmRhdGFJbnN0YW5jZUtleX0vYmxvY2tzYDsKICAgICAgfQogICAgICBnZXRQYXRoKHBvc2l0aW9uLCBzaXplKSB7CiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0QmxvY2tzUGF0aCgpfS8ke3NpemVbMF19XyR7c2l6ZVsxXX1fJHtzaXplWzJdfS8ke3Bvc2l0aW9uWzBdfV8ke3Bvc2l0aW9uWzFdfV8ke3Bvc2l0aW9uWzJdfWA7CiAgICAgIH0KICAgICAgYXN5bmMgZG93bmxvYWQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGlmIChjaHVuay5zb3VyY2Uuc3BlYy51cHBlckNodW5rQm91bmRbMF0gPD0gY2h1bmsuc291cmNlLnNwZWMubG93ZXJDaHVua0JvdW5kWzBdKSB7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBhcnNlQW5ub3RhdGlvbnMyKHRoaXMsIGNodW5rLCBbXSwgcGFyYW1ldGVycy5wcm9wZXJ0aWVzLCB0cnVlKSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNodW5rRGF0YVNpemUgPSB0aGlzLnBhcmFtZXRlcnMuY2h1bmtEYXRhU2l6ZTsKICAgICAgICBjb25zdCBjaHVua1Bvc2l0aW9uID0gY2h1bmsuY2h1bmtHcmlkUG9zaXRpb24ubWFwKCh4LCBpbmRleCkgPT4geCAqIGNodW5rRGF0YVNpemVbaW5kZXhdKTsKICAgICAgICBsZXQgZGF0YUluc3RhbmNlID0gbmV3IERWSURJbnN0YW5jZShwYXJhbWV0ZXJzLmJhc2VVcmwsIHBhcmFtZXRlcnMubm9kZUtleSk7CiAgICAgICAgcmV0dXJuIG1ha2VSZXF1ZXN0V2l0aENyZWRlbnRpYWxzKHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgewogICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgIHVybDogYXBwZW5kUXVlcnlTdHJpbmdGb3JEdmlkKGRhdGFJbnN0YW5jZS5nZXROb2RlQXBpVXJsKHRoaXMuZ2V0UGF0aChjaHVua1Bvc2l0aW9uLCBjaHVua0RhdGFTaXplKSksIHBhcmFtZXRlcnMudXNlciksCiAgICAgICAgICBwYXlsb2FkOiB2b2lkIDAsCiAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIgogICAgICAgIH0sIGNhbmNlbGxhdGlvblRva2VuKS50aGVuKCh2YWx1ZXMpID0+IHsKICAgICAgICAgIHBhcnNlQW5ub3RhdGlvbnMyKHRoaXMsIGNodW5rLCB2YWx1ZXMsIHBhcmFtZXRlcnMucHJvcGVydGllcywgZmFsc2UpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgRFZJREFubm90YXRpb25HZW9tZXRyeUNodW5rU291cmNlID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoKQogICAgXSwgRFZJREFubm90YXRpb25HZW9tZXRyeUNodW5rU291cmNlKTsKICAgIHZhciBEVklEQW5ub3RhdGlvblNvdXJjZSA9IGNsYXNzIGV4dGVuZHMgRFZJRFNvdXJjZShBbm5vdGF0aW9uU291cmNlMiwgQW5ub3RhdGlvblNvdXJjZVBhcmFtZXRlcnMyKSB7CiAgICAgIGNvbnN0cnVjdG9yKHJwYzIsIG9wdGlvbnMpIHsKICAgICAgICBzdXBlcihycGMyLCBvcHRpb25zKTsKICAgICAgfQogICAgICBnZXRFbGVtZW50c1BhdGgoKSB7CiAgICAgICAgcmV0dXJuIGAvJHt0aGlzLnBhcmFtZXRlcnMuZGF0YUluc3RhbmNlS2V5fS9lbGVtZW50c2A7CiAgICAgIH0KICAgICAgZ2V0UGF0aEJ5Qm9keUlkKHNlZ21lbnRhdGlvbiwgYm9keUlkKSB7CiAgICAgICAgcmV0dXJuIGAvJHtzZWdtZW50YXRpb259L2xhYmVsLyR7Ym9keUlkfWA7CiAgICAgIH0KICAgICAgZ2V0UGF0aEJ5QW5ub3RhdGlvbklkKGFubm90YXRpb25JZCkgewogICAgICAgIHJldHVybiBgJHt0aGlzLmdldEVsZW1lbnRzUGF0aCgpfS8xXzFfMS8ke2Fubm90YXRpb25JZH1gOwogICAgICB9CiAgICAgIGRvd25sb2FkU2VnbWVudEZpbHRlcmVkR2VvbWV0cnkoY2h1bmssIF9yZWxhdGlvbnNoaXBJbmRleCwgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICBjb25zdCB7IHBhcmFtZXRlcnMgfSA9IHRoaXM7CiAgICAgICAgaWYgKHBhcmFtZXRlcnMuc3luY2VkTGFiZWwpIHsKICAgICAgICAgIGxldCBkYXRhSW5zdGFuY2UgPSBuZXcgRFZJREluc3RhbmNlKHBhcmFtZXRlcnMuYmFzZVVybCwgcGFyYW1ldGVycy5ub2RlS2V5KTsKICAgICAgICAgIHJldHVybiBtYWtlUmVxdWVzdFdpdGhDcmVkZW50aWFscyh0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIsIHsKICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgICAgdXJsOiBhcHBlbmRRdWVyeVN0cmluZ0ZvckR2aWQoZGF0YUluc3RhbmNlLmdldE5vZGVBcGlVcmwodGhpcy5nZXRQYXRoQnlCb2R5SWQocGFyYW1ldGVycy5kYXRhSW5zdGFuY2VLZXksIGNodW5rLm9iamVjdElkKSksIHBhcmFtZXRlcnMudXNlciksCiAgICAgICAgICAgIHBheWxvYWQ6IHZvaWQgMCwKICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAianNvbiIKICAgICAgICAgIH0sIGNhbmNlbGxhdGlvblRva2VuKS50aGVuKCh2YWx1ZXMpID0+IHsKICAgICAgICAgICAgcGFyc2VBbm5vdGF0aW9uczIodGhpcywgY2h1bmssIHZhbHVlcywgcGFyYW1ldGVycy5wcm9wZXJ0aWVzLCBmYWxzZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgRXJyb3IoIlN5bmNlZCBsYWJlbCBtaXNzaW5nIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlcXVlc3RQb2ludE1ldGFEYXRhKGlkLCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyB9ID0gdGhpczsKICAgICAgICBsZXQgZGF0YUluc3RhbmNlID0gbmV3IERWSURJbnN0YW5jZShwYXJhbWV0ZXJzLmJhc2VVcmwsIHBhcmFtZXRlcnMubm9kZUtleSk7CiAgICAgICAgcmV0dXJuIG1ha2VSZXF1ZXN0V2l0aENyZWRlbnRpYWxzKHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgewogICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgIHVybDogYXBwZW5kUXVlcnlTdHJpbmdGb3JEdmlkKGRhdGFJbnN0YW5jZS5nZXROb2RlQXBpVXJsKHRoaXMuZ2V0UGF0aEJ5QW5ub3RhdGlvbklkKGlkKSksIHBhcmFtZXRlcnMudXNlciksCiAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIgogICAgICAgIH0sIGNhbmNlbGxhdGlvblRva2VuKS50aGVuKChyZXNwb25zZSkgPT4gewogICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlWzBdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJlcXVlc3RNZXRhZGF0YShjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICBjb25zdCBpZCA9IGNodW5rLmtleTsKICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UG9pbnRNZXRhRGF0YShpZCwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICB9CiAgICAgIGRvd25sb2FkTWV0YWRhdGEoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdE1ldGFkYXRhKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbikudGhlbigocmVzcG9uc2UpID0+IHsKICAgICAgICAgIGlmIChyZXNwb25zZSkgewogICAgICAgICAgICBjaHVuay5hbm5vdGF0aW9uID0gcGFyc2VBbm5vdGF0aW9uMihyZXNwb25zZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaHVuay5hbm5vdGF0aW9uID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIERWSURBbm5vdGF0aW9uU291cmNlID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoKQogICAgXSwgRFZJREFubm90YXRpb25Tb3VyY2UpOwogICAgZnVuY3Rpb24gcGFyc2VBbm5vdGF0aW9uczIoc291cmNlLCBjaHVuaywgcmVzcG9uc2VzLCBwcm9wU3BlYywgZW1pdHRpbmdBZGRTaWduYWwpIHsKICAgICAgY29uc3QgYW5ub3RhdGlvblByb3BlcnR5U2VyaWFsaXplcnMyID0gbWFrZUFubm90YXRpb25Qcm9wZXJ0eVNlcmlhbGl6ZXJzKDMsIHByb3BTcGVjKTsKICAgICAgY29uc3Qgc2VyaWFsaXplciA9IG5ldyBBbm5vdGF0aW9uU2VyaWFsaXplcihhbm5vdGF0aW9uUHJvcGVydHlTZXJpYWxpemVyczIpOwogICAgICBpZiAocmVzcG9uc2VzKSB7CiAgICAgICAgbGV0IGl0ZW1MaXN0ID0gW107CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3BvbnNlcykpIHsKICAgICAgICAgIGl0ZW1MaXN0ID0gT2JqZWN0LmtleXMocmVzcG9uc2VzKS5yZWR1Y2UoKGFjYywga2V5KSA9PiBbLi4uYWNjLCAuLi5yZXNwb25zZXNba2V5XV0sIFtdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaXRlbUxpc3QgPSByZXNwb25zZXM7CiAgICAgICAgfQogICAgICAgIGl0ZW1MaXN0LmZvckVhY2goKHJlc3BvbnNlKSA9PiB7CiAgICAgICAgICBpZiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBsZXQgYW5ub3RhdGlvbiA9IHBhcnNlQW5ub3RhdGlvbjIocmVzcG9uc2UpOwogICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uKSB7CiAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmFkZChhbm5vdGF0aW9uKTsKICAgICAgICAgICAgICAgIGlmIChlbWl0dGluZ0FkZFNpZ25hbCkgewogICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiVG8gYmUgaW1wbGVtZW50ZWQ6ICIsIHNvdXJjZSwgZW1pdHRpbmdBZGRTaWduYWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcGFyc2luZyBhbm5vdGF0aW9uOiAke2UubWVzc2FnZX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNodW5rLmRhdGEgPSBPYmplY3QuYXNzaWduKG5ldyBBbm5vdGF0aW9uR2VvbWV0cnlEYXRhKCksIHNlcmlhbGl6ZXIuc2VyaWFsaXplKCkpOwogICAgfQogICAgdmFyIERWSURWb2x1bWVDaHVua1NvdXJjZSA9IGNsYXNzIGV4dGVuZHMgRFZJRFNvdXJjZShWb2x1bWVDaHVua1NvdXJjZSwgVm9sdW1lQ2h1bmtTb3VyY2VQYXJhbWV0ZXJzMikgewogICAgICBhc3luYyBkb3dubG9hZChjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wYXJhbWV0ZXJzOwogICAgICAgIGxldCBwYXRoOwogICAgICAgIHsKICAgICAgICAgIGxldCBjaHVua1Bvc2l0aW9uID0gdGhpcy5jb21wdXRlQ2h1bmtCb3VuZHMoY2h1bmspOwogICAgICAgICAgbGV0IGNodW5rRGF0YVNpemUgPSBjaHVuay5jaHVua0RhdGFTaXplOwogICAgICAgICAgcGF0aCA9IHRoaXMuZ2V0UGF0aChjaHVua1Bvc2l0aW9uLCBjaHVua0RhdGFTaXplKTsKICAgICAgICAgIGlmIChwYXJhbXMuc3VwZXJ2b3hlbHMpIHsKICAgICAgICAgICAgcGF0aCA9IGFwcGVuZFF1ZXJ5U3RyaW5nKHBhdGgsICJzdXBlcnZveGVscyIsICJ0cnVlIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRlY29kZXIgPSB0aGlzLmdldERlY29kZXIocGFyYW1zKTsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0V2l0aENyZWRlbnRpYWxzKHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgewogICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgIHVybDogYXBwZW5kUXVlcnlTdHJpbmdGb3JEdmlkKGAke3BhcmFtcy5iYXNlVXJsfSR7cGF0aH1gLCBwYXJhbXMudXNlciksCiAgICAgICAgICByZXNwb25zZVR5cGU6ICJhcnJheWJ1ZmZlciIKICAgICAgICB9LCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgYXdhaXQgZGVjb2RlcihjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4sIHBhcmFtcy5lbmNvZGluZyA9PT0gVm9sdW1lQ2h1bmtFbmNvZGluZzIuSlBFRyA/IHJlc3BvbnNlLnNsaWNlKDE2KSA6IHJlc3BvbnNlKTsKICAgICAgfQogICAgICBnZXRQYXRoKGNodW5rUG9zaXRpb24sIGNodW5rRGF0YVNpemUpIHsKICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wYXJhbWV0ZXJzOwogICAgICAgIGlmIChwYXJhbXMuZW5jb2RpbmcgPT09IFZvbHVtZUNodW5rRW5jb2RpbmcyLkpQRUcpIHsKICAgICAgICAgIHJldHVybiBgL2FwaS9ub2RlLyR7cGFyYW1zWyJub2RlS2V5Il19LyR7cGFyYW1zWyJkYXRhSW5zdGFuY2VLZXkiXX0vc3Vidm9sYmxvY2tzLyR7Y2h1bmtEYXRhU2l6ZVswXX1fJHtjaHVua0RhdGFTaXplWzFdfV8ke2NodW5rRGF0YVNpemVbMl19LyR7Y2h1bmtQb3NpdGlvblswXX1fJHtjaHVua1Bvc2l0aW9uWzFdfV8ke2NodW5rUG9zaXRpb25bMl19YDsKICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5lbmNvZGluZyA9PT0gVm9sdW1lQ2h1bmtFbmNvZGluZzIuUkFXKSB7CiAgICAgICAgICByZXR1cm4gYC9hcGkvbm9kZS8ke3BhcmFtc1sibm9kZUtleSJdfS8ke3BhcmFtc1siZGF0YUluc3RhbmNlS2V5Il19L3Jhdy8wXzFfMi8ke2NodW5rRGF0YVNpemVbMF19XyR7Y2h1bmtEYXRhU2l6ZVsxXX1fJHtjaHVua0RhdGFTaXplWzJdfS8ke2NodW5rUG9zaXRpb25bMF19XyR7Y2h1bmtQb3NpdGlvblsxXX1fJHtjaHVua1Bvc2l0aW9uWzJdfS9qcGVnYDsKICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5lbmNvZGluZyA9PT0gVm9sdW1lQ2h1bmtFbmNvZGluZzIuQ09NUFJFU1NFRF9TRUdNRU5UQVRJT05BUlJBWSkgewogICAgICAgICAgcmV0dXJuIGAvYXBpL25vZGUvJHtwYXJhbXNbIm5vZGVLZXkiXX0vJHtwYXJhbXNbImRhdGFJbnN0YW5jZUtleSJdfS9yYXcvMF8xXzIvJHtjaHVua0RhdGFTaXplWzBdfV8ke2NodW5rRGF0YVNpemVbMV19XyR7Y2h1bmtEYXRhU2l6ZVsyXX0vJHtjaHVua1Bvc2l0aW9uWzBdfV8ke2NodW5rUG9zaXRpb25bMV19XyR7Y2h1bmtQb3NpdGlvblsyXX0/Y29tcHJlc3Npb249Z29vZ2xlZ3ppcCZzY2FsZT0ke3BhcmFtc1siZGF0YVNjYWxlIl19YDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGAvYXBpL25vZGUvJHtwYXJhbXNbIm5vZGVLZXkiXX0vJHtwYXJhbXNbImRhdGFJbnN0YW5jZUtleSJdfS9yYXcvMF8xXzIvJHtjaHVua0RhdGFTaXplWzBdfV8ke2NodW5rRGF0YVNpemVbMV19XyR7Y2h1bmtEYXRhU2l6ZVsyXX0vJHtjaHVua1Bvc2l0aW9uWzBdfV8ke2NodW5rUG9zaXRpb25bMV19XyR7Y2h1bmtQb3NpdGlvblsyXX0/Y29tcHJlc3Npb249Z29vZ2xlZ3ppcGA7CiAgICAgICAgfQogICAgICB9CiAgICAgIGdldERlY29kZXIocGFyYW1zKSB7CiAgICAgICAgaWYgKHBhcmFtcy5lbmNvZGluZyA9PT0gVm9sdW1lQ2h1bmtFbmNvZGluZzIuSlBFRyB8fCBwYXJhbXMuZW5jb2RpbmcgPT09IFZvbHVtZUNodW5rRW5jb2RpbmcyLlJBVykgewogICAgICAgICAgcmV0dXJuIGRlY29kZUpwZWdDaHVuazsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGRlY29kZUNvbXByZXNzZWRTZWdtZW50YXRpb25DaHVuazsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBEVklEVm9sdW1lQ2h1bmtTb3VyY2UgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdCgpCiAgICBdLCBEVklEVm9sdW1lQ2h1bmtTb3VyY2UpOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvZGF0YXNvdXJjZS9jbGlvL2Jhc2UudHMKICAgIHZhciBhbm5vdGF0aW9uQ2h1bmtEYXRhU2l6ZTIgPSB2ZWMzX2V4cG9ydHMuZnJvbVZhbHVlcyg2NCwgNjQsIDY0KTsKICAgIHZhciBDbGlvU291cmNlUGFyYW1ldGVycyA9IGNsYXNzIHsKICAgIH07CiAgICBmdW5jdGlvbiBpc0F1dGhSZWZyZXNoYWJsZShwYXJhbWV0ZXJzKSB7CiAgICAgIHJldHVybiBwYXJhbWV0ZXJzLmF1dGhTZXJ2ZXIgPyBwYXJhbWV0ZXJzLmF1dGhTZXJ2ZXIgPT09ICJuZXVyb2h1YiIgfHwgcGFyYW1ldGVycy5hdXRoU2VydmVyLnN0YXJ0c1dpdGgoImh0dHAiKSA6IGZhbHNlOwogICAgfQogICAgdmFyIEFubm90YXRpb25Tb3VyY2VQYXJhbWV0ZXJzQmFzZTIgPSBjbGFzcyBleHRlbmRzIENsaW9Tb3VyY2VQYXJhbWV0ZXJzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICB0aGlzLmNodW5rRGF0YVNpemUgPSBhbm5vdGF0aW9uQ2h1bmtEYXRhU2l6ZTI7CiAgICAgIH0KICAgIH07CiAgICB2YXIgQW5ub3RhdGlvblNvdXJjZVBhcmFtZXRlcnMzID0gY2xhc3MgZXh0ZW5kcyBBbm5vdGF0aW9uU291cmNlUGFyYW1ldGVyc0Jhc2UyIHsKICAgIH07CiAgICBBbm5vdGF0aW9uU291cmNlUGFyYW1ldGVyczMuUlBDX0lEID0gImNsaW8vQW5ub3RhdGlvbiI7CiAgICB2YXIgQW5ub3RhdGlvbkNodW5rU291cmNlUGFyYW1ldGVyczIgPSBjbGFzcyBleHRlbmRzIEFubm90YXRpb25Tb3VyY2VQYXJhbWV0ZXJzQmFzZTIgewogICAgfTsKICAgIEFubm90YXRpb25DaHVua1NvdXJjZVBhcmFtZXRlcnMyLlJQQ19JRCA9ICJjbGlvL0Fubm90YXRpb25DaHVua1NvdXJjZSI7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9kYXRhc291cmNlL2ZseWVtL2FwaS50cwogICAgZnVuY3Rpb24gcmVzcG9uc2VUZXh0MihyZXNwb25zZSkgewogICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpOwogICAgfQogICAgZnVuY3Rpb24gbWFrZVJlcXVlc3RXaXRoQ3JlZGVudGlhbHMyKGNyZWRlbnRpYWxzUHJvdmlkZXIsIHRva2VuUmVmcmVzaGFibGUsIGh0dHBDYWxsLCBjYW5jZWxsYXRpb25Ub2tlbiA9IHVuY2FuY2VsYWJsZVRva2VuKSB7CiAgICAgIGNvbnN0IHJlcXVlc3RJbml0ID0geyBtZXRob2Q6IGh0dHBDYWxsLm1ldGhvZCwgYm9keTogaHR0cENhbGwucGF5bG9hZCB9OwogICAgICBpZiAocmVxdWVzdEluaXQubWV0aG9kID09PSAiUE9TVCIpIHsKICAgICAgICByZXF1ZXN0SW5pdC5oZWFkZXJzID0gewogICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIgogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGZldGNoV2l0aEZseUVNQ3JlZGVudGlhbHMoY3JlZGVudGlhbHNQcm92aWRlciwgdG9rZW5SZWZyZXNoYWJsZSwgaHR0cENhbGwudXJsLCByZXF1ZXN0SW5pdCwgaHR0cENhbGwucmVzcG9uc2VUeXBlID09PSAiIiA/IHJlc3BvbnNlVGV4dDIgOiBodHRwQ2FsbC5yZXNwb25zZVR5cGUgPT09ICJqc29uIiA/IHJlc3BvbnNlSnNvbiA6IHJlc3BvbnNlQXJyYXlCdWZmZXIsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFwcGx5Q3JlZGVudGlhbHMoaW5wdXQpIHsKICAgICAgcmV0dXJuIChjcmVkZW50aWFscywgaW5pdCkgPT4gewogICAgICAgIGxldCBuZXdJbml0ID0geyAuLi5pbml0IH07CiAgICAgICAgaWYgKGNyZWRlbnRpYWxzKSB7CiAgICAgICAgICBuZXdJbml0LmhlYWRlcnMgPSB7IC4uLm5ld0luaXQuaGVhZGVycywgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2NyZWRlbnRpYWxzfWAgfTsKICAgICAgICB9IGVsc2UgaWYgKGlucHV0LnN0YXJ0c1dpdGgoImh0dHBzOiIpKSB7CiAgICAgICAgICBuZXdJbml0LmNyZWRlbnRpYWxzID0gImluY2x1ZGUiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3SW5pdDsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGZldGNoV2l0aEZseUVNQ3JlZGVudGlhbHMoY3JlZGVudGlhbHNQcm92aWRlciwgdG9rZW5SZWZyZXNoYWJsZSwgaW5wdXQsIGluaXQsIHRyYW5zZm9ybVJlc3BvbnNlLCBjYW5jZWxsYXRpb25Ub2tlbiA9IHVuY2FuY2VsYWJsZVRva2VuKSB7CiAgICAgIHJldHVybiBmZXRjaFdpdGhDcmVkZW50aWFscyhjcmVkZW50aWFsc1Byb3ZpZGVyLCBpbnB1dCwgaW5pdCwgdHJhbnNmb3JtUmVzcG9uc2UsIGFwcGx5Q3JlZGVudGlhbHMoaW5wdXQpLCAoZXJyb3IpID0+IHsKICAgICAgICBjb25zdCB7IHN0YXR1cyB9ID0gZXJyb3I7CiAgICAgICAgaWYgKHN0YXR1cyA9PT0gNDAzIHx8IHN0YXR1cyA9PT0gNDAxKSB7CiAgICAgICAgICBpZiAodG9rZW5SZWZyZXNoYWJsZSkgewogICAgICAgICAgICByZXR1cm4gInJlZnJlc2giOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3RhdHVzID09PSA1MDQpIHsKICAgICAgICAgIHJldHVybiAicmV0cnkiOwogICAgICAgIH0KICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgfSwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvZGF0YXNvdXJjZS9jbGlvL2FwaS50cwogICAgdmFyIHVybFBhdHRlcm4gPSAvXihbXlwvXSs6XC9cL1teXC9dKylcLyhbXlwvXSspXC8oW15cL1w/XSspKFw/LiopPyQvOwogICAgZnVuY3Rpb24gcGFyc2VEVklEU291cmNlVXJsKHVybCkgewogICAgICBsZXQgbWF0Y2ggPSB1cmwubWF0Y2godXJsUGF0dGVybik7CiAgICAgIGlmIChtYXRjaCA9PT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBEVklEIFVSTDogJHtKU09OLnN0cmluZ2lmeSh1cmwpfS5gKTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIGJhc2VVcmw6IG1hdGNoWzFdLAogICAgICAgIG5vZGVLZXk6IG1hdGNoWzJdLAogICAgICAgIGRhdGFJbnN0YW5jZUtleTogbWF0Y2hbM10KICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlR3JheXNjYWxlVXJsKHNvdXJjZSkgewogICAgICBsZXQgdSA9IHBhcnNlVXJsKHNvdXJjZSk7CiAgICAgIGlmICh1LnByb3RvY29sID09PSAicHJlY29tcHV0ZWQiKSB7CiAgICAgICAgdSA9IHBhcnNlVXJsKHUuaG9zdCArIHUucGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHU7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRHcmF5c2NhbGVJbmZvVXJsKHUpIHsKICAgICAgbGV0IHsgcHJvdG9jb2wsIGhvc3QsIHBhdGggfSA9IHU7CiAgICAgIHN3aXRjaCAocHJvdG9jb2wpIHsKICAgICAgICBjYXNlICJncyI6CiAgICAgICAgICByZXR1cm4gYGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS8ke2hvc3R9JHtwYXRofS9pbmZvYDsKICAgICAgICBjYXNlICJkdmlkIjoKICAgICAgICAgIGNvbnN0IHNvdXJjZVBhcmFtZXRlcnMgPSBwYXJzZURWSURTb3VyY2VVcmwoaG9zdCArIHBhdGgpOwogICAgICAgICAgcmV0dXJuIGAke3NvdXJjZVBhcmFtZXRlcnMuYmFzZVVybH0vYXBpL25vZGUvJHtzb3VyY2VQYXJhbWV0ZXJzLm5vZGVLZXl9LyR7c291cmNlUGFyYW1ldGVycy5kYXRhSW5zdGFuY2VLZXl9L2luZm9gOwogICAgICAgIGNhc2UgImh0dHBzIjoKICAgICAgICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke2hvc3R9JHtwYXRofS9pbmZvYDsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCB2b2x1bWUgaW5mb3JtYXRpb24iKTsKICAgICAgfQogICAgfQogICAgdmFyIENsaW9JbnN0YW5jZSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IocGFyYW1ldGVycykgewogICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CiAgICAgIH0KICAgICAgZ2V0VG9wTGV2ZWxVcmwoKSB7CiAgICAgICAgY29uc3QgeyBiYXNlVXJsLCBhcGkgfSA9IHRoaXMucGFyYW1ldGVyczsKICAgICAgICByZXR1cm4gYCR7YmFzZVVybH0vJHthcGkgfHwgImNsaW9fdG9wbGV2ZWwifWA7CiAgICAgIH0KICAgICAgZ2V0RGF0YXNldHNVcmwoKSB7CiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0VG9wTGV2ZWxVcmwoKX0vZGF0YXNldHNgOwogICAgICB9CiAgICAgIGdldEdyYXlzY2FsZUluZm9VcmwoKSB7CiAgICAgICAgbGV0IHUgPSBwYXJzZUdyYXlzY2FsZVVybCh0aGlzLnBhcmFtZXRlcnMuZ3JheXNjYWxlKTsKICAgICAgICByZXR1cm4gZ2V0R3JheXNjYWxlSW5mb1VybCh1KTsKICAgICAgfQogICAgICBnZXRBbm5vdGF0aW9uRW5kcG9pbnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVycy5raW5kID09PSAiQXRsYXMiID8gImF0bGFzIiA6ICJhbm5vdGF0aW9ucyI7CiAgICAgIH0KICAgICAgZ2V0QW5ub3RhdGlvbkVudHJ5VXJsKCkgewogICAgICAgIHJldHVybiBgJHt0aGlzLmdldFRvcExldmVsVXJsKCl9LyR7dGhpcy5nZXRBbm5vdGF0aW9uRW5kcG9pbnQoKX0vJHt0aGlzLnBhcmFtZXRlcnMuZGF0YXNldH1gOwogICAgICB9CiAgICAgIGdldEFsbEFubm90YXRpb25zVXJsKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldEFubm90YXRpb25FbnRyeVVybCgpICsgKHRoaXMucGFyYW1ldGVycy5ncm91cHMgPyBgP2dyb3Vwcz0ke3RoaXMucGFyYW1ldGVycy5ncm91cHN9YCA6ICIiKTsKICAgICAgfQogICAgICBoYXNQb2ludFF1ZXJ5QXBpKCkgewogICAgICAgIHJldHVybiB0aGlzLnBhcmFtZXRlcnMuYXBpID09PSAiY2xpb190b3BsZXZlbCIgfHwgdGhpcy5wYXJhbWV0ZXJzLmtpbmQgPT09ICJBdGxhcyI7CiAgICAgIH0KICAgICAgZ2V0UG9zdEFubm90YXRpb25VcmwocG9zaXRpb24pIHsKICAgICAgICBpZiAodGhpcy5oYXNQb2ludFF1ZXJ5QXBpKCkpIHsKICAgICAgICAgIHJldHVybiBgJHt0aGlzLmdldEFubm90YXRpb25FbnRyeVVybCgpfT94PSR7cG9zaXRpb25bMF19Jnk9JHtwb3NpdGlvblsxXX0mej0ke3Bvc2l0aW9uWzJdfWA7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmdldEFubm90YXRpb25FbnRyeVVybCgpOwogICAgICB9CiAgICAgIGdldERlbGV0ZUFubm90YXRpb25VcmwoaWQpIHsKICAgICAgICBpZiAodGhpcy5oYXNQb2ludFF1ZXJ5QXBpKCkpIHsKICAgICAgICAgIGNvbnN0IHRva2VucyA9IGlkLm1hdGNoKC8oLT9cZCspXygtP1xkKylfKC0/XGQrKS8pOwogICAgICAgICAgaWYgKHRva2VucykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uVXJsKHRva2VucyA9PSBudWxsID8gdm9pZCAwIDogdG9rZW5zLnNsaWNlKDEsIDQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0QW5ub3RhdGlvbkVudHJ5VXJsKCl9LyR7aWR9YDsKICAgICAgfQogICAgICBnZXRBbm5vdGF0aW9uVXJsKHBvc2l0aW9uKSB7CiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0QW5ub3RhdGlvbkVudHJ5VXJsKCl9P3g9JHtwb3NpdGlvblswXX0meT0ke3Bvc2l0aW9uWzFdfSZ6PSR7cG9zaXRpb25bMl19YDsKICAgICAgfQogICAgfTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2RhdGFzb3VyY2UvY2xpby91dGlscy50cwogICAgdmFyIENsaW9Bbm5vdGF0aW9uRmFjYWRlID0gY2xhc3MgZXh0ZW5kcyBBbm5vdGF0aW9uRmFjYWRlIHsKICAgICAgZ2V0IHRpdGxlKCkgewogICAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb24uZXh0ICYmIHRoaXMuYW5ub3RhdGlvbi5leHQudGl0bGU7CiAgICAgIH0KICAgICAgc2V0IHRpdGxlKHRpdGxlKSB7CiAgICAgICAgdGhpcy5leHQudGl0bGUgPSB0aXRsZTsKICAgICAgfQogICAgICBnZXQgZGVzY3JpcHRpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbi5leHQgJiYgdGhpcy5hbm5vdGF0aW9uLmV4dC5kZXNjcmlwdGlvbjsKICAgICAgfQogICAgICBzZXQgZGVzY3JpcHRpb24odmFsdWUpIHsKICAgICAgICB0aGlzLmV4dC5kZXNjcmlwdGlvbiA9IHZhbHVlOwogICAgICB9CiAgICAgIGdldCB1c2VyKCkgewogICAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb24uZXh0ICYmIHRoaXMuYW5ub3RhdGlvbi5leHQudXNlcjsKICAgICAgfQogICAgICBzZXQgdXNlcih2YWx1ZSkgewogICAgICAgIHRoaXMuZXh0LnVzZXIgPSB2YWx1ZTsKICAgICAgfQogICAgICBnZXQgY2hlY2tlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5leHQgJiYgdGhpcy5leHQudmVyaWZpZWQ7CiAgICAgIH0KICAgICAgc2V0IGNoZWNrZWQoYykgewogICAgICAgIHRoaXMuZXh0LnZlcmlmaWVkID0gYzsKICAgICAgfQogICAgfTsKICAgIHZhciBBbm5vdGF0aW9uUmVxdWVzdEhlbHBlciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3Ioc2VuZGluZ1RvU2VydmVyKSB7CiAgICAgICAgdGhpcy5zZW5kaW5nVG9TZXJ2ZXIgPSBzZW5kaW5nVG9TZXJ2ZXI7CiAgICAgIH0KICAgICAgdXBsb2FkYWJsZShfKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZGluZ1RvU2VydmVyOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gZGVjb2RlQW5ub3RhdGlvblByb3BWMihlbnRyeSwgb3V0KSB7CiAgICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBuZXcgQ2xpb0Fubm90YXRpb25GYWNhZGUob3V0KTsKICAgICAgaWYgKCJwcm9wIiBpbiBlbnRyeSkgewogICAgICAgIGFubm90YXRpb25SZWYucHJvcCA9IHZlcmlmeU9iamVjdFByb3BlcnR5KGVudHJ5LCAicHJvcCIsIHZlcmlmeU9iamVjdCk7CiAgICAgIH0KICAgICAgaWYgKGVudHJ5LmRlc2NyaXB0aW9uKSB7CiAgICAgICAgYW5ub3RhdGlvblJlZi5kZXNjcmlwdGlvbiA9IHZlcmlmeU9iamVjdFByb3BlcnR5KGVudHJ5LCAiZGVzY3JpcHRpb24iLCB2ZXJpZnlTdHJpbmcpOwogICAgICB9CiAgICAgIGlmIChlbnRyeS50aXRsZSkgewogICAgICAgIGFubm90YXRpb25SZWYudGl0bGUgPSB2ZXJpZnlPYmplY3RQcm9wZXJ0eShlbnRyeSwgInRpdGxlIiwgdmVyaWZ5U3RyaW5nKTsKICAgICAgfQogICAgICBpZiAoZW50cnkudXNlcikgewogICAgICAgIGFubm90YXRpb25SZWYudXNlciA9IHZlcmlmeU9iamVjdFByb3BlcnR5KGVudHJ5LCAidXNlciIsIHZlcmlmeVN0cmluZyk7CiAgICAgIH0KICAgICAgaWYgKCJ2ZXJpZmllZCIgaW4gZW50cnkpIHsKICAgICAgICBhbm5vdGF0aW9uUmVmLmNoZWNrZWQgPSB2ZXJpZnlPYmplY3RQcm9wZXJ0eShlbnRyeSwgInZlcmlmaWVkIiwgdmVyaWZ5Qm9vbGVhbik7CiAgICAgIH0KICAgICAgYW5ub3RhdGlvblJlZi51cGRhdGUoKTsKICAgICAgb3V0LmlkID0gZ2V0QW5ub3RhdGlvbklkKG91dCk7CiAgICB9CiAgICB2YXIgVjFQb2ludEFubm90YXRpb25SZXF1ZXN0SGVscGVyID0gY2xhc3MgZXh0ZW5kcyBBbm5vdGF0aW9uUmVxdWVzdEhlbHBlciB7CiAgICAgIGdldFBvc2l0aW9uRnJvbUtleShrZXkpIHsKICAgICAgICBpZiAoa2V5KSB7CiAgICAgICAgICBsZXQgcG9zID0ga2V5LnNwbGl0KCJfIikubWFwKCh4KSA9PiAreCk7CiAgICAgICAgICBpZiAocG9zLmxlbmd0aCA9PT0gMykgewogICAgICAgICAgICByZXR1cm4gdmVjM19leHBvcnRzLmZyb21WYWx1ZXMocG9zWzBdLCBwb3NbMV0sIHBvc1syXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGVuY29kZShhbm5vdGF0aW9uKSB7CiAgICAgICAgbGV0IG9iaiA9IHsKICAgICAgICAgIEtpbmQ6IGFubm90YXRpb24ua2luZAogICAgICAgIH07CiAgICAgICAgbGV0IGFubm90YXRpb25SZWYgPSBuZXcgQ2xpb0Fubm90YXRpb25GYWNhZGUoYW5ub3RhdGlvbik7CiAgICAgICAgaWYgKGFubm90YXRpb25SZWYucHJlc2VudGF0aW9uICE9PSB2b2lkIDApIHsKICAgICAgICAgIG9iai5kZXNjcmlwdGlvbiA9IGFubm90YXRpb25SZWYucHJlc2VudGF0aW9uOwogICAgICAgIH0gZWxzZSBpZiAoYW5ub3RhdGlvbi5raW5kID09PSAiQXRsYXMiKSB7CiAgICAgICAgICBvYmouZGVzY3JpcHRpb24gPSAiIjsKICAgICAgICB9CiAgICAgICAgaWYgKGFubm90YXRpb25SZWYudGl0bGUgIT09IHZvaWQgMCkgewogICAgICAgICAgb2JqLnRpdGxlID0gYW5ub3RhdGlvblJlZi50aXRsZTsKICAgICAgICB9CiAgICAgICAgb2JqLnVzZXIgPSBhbm5vdGF0aW9uUmVmLnVzZXI7CiAgICAgICAgaWYgKGFubm90YXRpb24ucHJvcCkgewogICAgICAgICAgbGV0IHByb3AgPSB7IC4uLmFubm90YXRpb24ucHJvcCB9OwogICAgICAgICAgZGVsZXRlIHByb3AuY29tbWVudDsKICAgICAgICAgIGRlbGV0ZSBwcm9wLnVzZXI7CiAgICAgICAgICBkZWxldGUgcHJvcC50aXRsZTsKICAgICAgICAgIGlmIChwcm9wKSB7CiAgICAgICAgICAgIG9iai5Qcm9wID0gcHJvcDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9iajsKICAgICAgfQogICAgICBkZWNvZGUoa2V5LCBlbnRyeSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBraW5kID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkoZW50cnksICJLaW5kIiwgdmVyaWZ5U3RyaW5nKTsKICAgICAgICAgIGxldCBwcm9wID0ge307CiAgICAgICAgICBsZXQgY29ybmVyID0gdGhpcy5nZXRQb3NpdGlvbkZyb21LZXkoa2V5KTsKICAgICAgICAgIGlmICghY29ybmVyKSB7CiAgICAgICAgICAgIGNvbnN0IHBvc0tleSA9ICJsb2NhdGlvbiIgaW4gZW50cnkgPyAibG9jYXRpb24iIDogIlBvcyI7CiAgICAgICAgICAgIGNvcm5lciA9IHZlcmlmeU9iamVjdFByb3BlcnR5KGVudHJ5LCBwb3NLZXksICh4KSA9PiBwYXJzZUludFZlYyh2ZWMzX2V4cG9ydHMuY3JlYXRlKCksIHgpKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICgiUHJvcCIgaW4gZW50cnkpIHsKICAgICAgICAgICAgcHJvcCA9IHZlcmlmeU9iamVjdFByb3BlcnR5KGVudHJ5LCAiUHJvcCIsIHZlcmlmeU9iamVjdCk7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSAiIjsKICAgICAgICAgIGlmICgiZGVzY3JpcHRpb24iIGluIGVudHJ5KSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkoZW50cnksICJkZXNjcmlwdGlvbiIsIHZlcmlmeVN0cmluZyk7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgdGl0bGUgPSAiIjsKICAgICAgICAgIGlmICgidGl0bGUiIGluIGVudHJ5KSB7CiAgICAgICAgICAgIHRpdGxlID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkoZW50cnksICJ0aXRsZSIsIHZlcmlmeVN0cmluZyk7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgdXNlciA9ICIiOwogICAgICAgICAgaWYgKCJ1c2VyIiBpbiBlbnRyeSkgewogICAgICAgICAgICB1c2VyID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkoZW50cnksICJ1c2VyIiwgdmVyaWZ5U3RyaW5nKTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBhbm5vdGF0aW9uID0gewogICAgICAgICAgICBwb2ludDogY29ybmVyLAogICAgICAgICAgICB0eXBlOiBBbm5vdGF0aW9uVHlwZS5QT0lOVCwKICAgICAgICAgICAgcHJvcGVydGllczogW10sCiAgICAgICAgICAgIGtpbmQsCiAgICAgICAgICAgIGlkOiBgJHtjb3JuZXJbMF19XyR7Y29ybmVyWzFdfV8ke2Nvcm5lclsyXX1gLAogICAgICAgICAgICBwcm9wOiB7fQogICAgICAgICAgfTsKICAgICAgICAgIGxldCBhbm5vdGF0aW9uUmVmID0gbmV3IENsaW9Bbm5vdGF0aW9uRmFjYWRlKGFubm90YXRpb24pOwogICAgICAgICAgYW5ub3RhdGlvblJlZi5wcm9wID0gcHJvcDsKICAgICAgICAgIGlmIChkZXNjcmlwdGlvbikgewogICAgICAgICAgICBhbm5vdGF0aW9uUmVmLnByZXNlbnRhdGlvbiA9IGRlc2NyaXB0aW9uOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRpdGxlKSB7CiAgICAgICAgICAgIGFubm90YXRpb25SZWYudGl0bGUgPSB0aXRsZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh1c2VyKSB7CiAgICAgICAgICAgIGFubm90YXRpb25SZWYudXNlciA9IHVzZXI7CiAgICAgICAgICB9CiAgICAgICAgICBhbm5vdGF0aW9uUmVmLnVwZGF0ZSgpOwogICAgICAgICAgcmV0dXJuIGFubm90YXRpb247CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBlbmNvZGVBbm5vdGF0aW9uVjIoYW5ub3RhdGlvbikgewogICAgICBjb25zdCBhbm5vdGF0aW9uUmVmID0gbmV3IENsaW9Bbm5vdGF0aW9uRmFjYWRlKGFubm90YXRpb24pOwogICAgICBpZiAoIWFubm90YXRpb25SZWYudXNlcikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGxldCBvYmogPSB7CiAgICAgICAgdGFnczogW10KICAgICAgfTsKICAgICAgb2JqLmRlc2NyaXB0aW9uID0gYW5ub3RhdGlvblJlZi5kZXNjcmlwdGlvbjsKICAgICAgb2JqLnVzZXIgPSBhbm5vdGF0aW9uUmVmLnVzZXI7CiAgICAgIGlmIChhbm5vdGF0aW9uUmVmLmNoZWNrZWQgIT09IHZvaWQgMCkgewogICAgICAgIG9iai52ZXJpZmllZCA9IGFubm90YXRpb25SZWYuY2hlY2tlZDsKICAgICAgfQogICAgICBpZiAoYW5ub3RhdGlvblJlZi50aXRsZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgb2JqLnRpdGxlID0gYW5ub3RhdGlvblJlZi50aXRsZTsKICAgICAgfQogICAgICBvYmoucHJvcCA9IHsgLi4uYW5ub3RhdGlvbi5wcm9wIH07CiAgICAgIHJldHVybiBvYmo7CiAgICB9CiAgICB2YXIgVjJQb2ludEFubm90YXRpb25SZXF1ZXN0SGVscGVyID0gY2xhc3MgZXh0ZW5kcyBBbm5vdGF0aW9uUmVxdWVzdEhlbHBlciB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5kZWZhdWx0S2luZCA9ICJOb3JtYWwiOwogICAgICB9CiAgICAgIGVuY29kZShhbm5vdGF0aW9uKSB7CiAgICAgICAgY29uc3Qgb2JqID0gZW5jb2RlQW5ub3RhdGlvblYyKGFubm90YXRpb24pOwogICAgICAgIGlmIChvYmogPT09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBvYmoua2luZCA9ICJwb2ludCI7CiAgICAgICAgb2JqLnBvcyA9IFthbm5vdGF0aW9uLnBvaW50WzBdLCBhbm5vdGF0aW9uLnBvaW50WzFdLCBhbm5vdGF0aW9uLnBvaW50WzJdXTsKICAgICAgICByZXR1cm4gb2JqOwogICAgICB9CiAgICAgIGRlY29kZShrZXksIGVudHJ5KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmICh2ZXJpZnlPYmplY3RQcm9wZXJ0eShlbnRyeSwgImtpbmQiLCB2ZXJpZnlTdHJpbmcpICE9PSAicG9pbnQiKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBraW5kIGZvciBwb2ludCBhbm5vdGF0aW9uIGRhdGEuIik7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBwb2ludCA9IHZlcmlmeU9iamVjdFByb3BlcnR5KGVudHJ5LCAicG9zIiwgKHgpID0+IHBhcnNlSW50VmVjKG5ldyBGbG9hdDMyQXJyYXkoMyksIHgpKTsKICAgICAgICAgIGNvbnN0IGFubm90YXRpb24gPSB7CiAgICAgICAgICAgIGlkOiAiIiwKICAgICAgICAgICAga2V5LAogICAgICAgICAgICB0eXBlOiBBbm5vdGF0aW9uVHlwZS5QT0lOVCwKICAgICAgICAgICAga2luZDogdGhpcy5kZWZhdWx0S2luZCwKICAgICAgICAgICAgcG9pbnQsCiAgICAgICAgICAgIHByb3BlcnRpZXM6IFtdCiAgICAgICAgICB9OwogICAgICAgICAgZGVjb2RlQW5ub3RhdGlvblByb3BWMihlbnRyeSwgYW5ub3RhdGlvbik7CiAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIHZhciBWMkxpbmVBbm5vdGF0aW9uUmVxdWVzdEhlbHBlciA9IGNsYXNzIGV4dGVuZHMgQW5ub3RhdGlvblJlcXVlc3RIZWxwZXIgewogICAgICBlbmNvZGUoYW5ub3RhdGlvbikgewogICAgICAgIGNvbnN0IG9iaiA9IGVuY29kZUFubm90YXRpb25WMihhbm5vdGF0aW9uKTsKICAgICAgICBpZiAob2JqID09PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgb2JqLmtpbmQgPSAibGluZXNlZyI7CiAgICAgICAgb2JqLnBvcyA9IFthbm5vdGF0aW9uLnBvaW50QVswXSwgYW5ub3RhdGlvbi5wb2ludEFbMV0sIGFubm90YXRpb24ucG9pbnRBWzJdLCBhbm5vdGF0aW9uLnBvaW50QlswXSwgYW5ub3RhdGlvbi5wb2ludEJbMV0sIGFubm90YXRpb24ucG9pbnRCWzJdXTsKICAgICAgICByZXR1cm4gb2JqOwogICAgICB9CiAgICAgIGRlY29kZShrZXksIGVudHJ5KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmICh2ZXJpZnlPYmplY3RQcm9wZXJ0eShlbnRyeSwgImtpbmQiLCB2ZXJpZnlTdHJpbmcpICE9PSAibGluZXNlZyIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGtpbmQgZm9yIGxpbmUgYW5ub3RhdGlvbiBkYXRhLiIpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgcG9zID0gdmVyaWZ5T2JqZWN0UHJvcGVydHkoZW50cnksICJwb3MiLCAoeCkgPT4gcGFyc2VJbnRWZWMobmV3IEZsb2F0MzJBcnJheSg2KSwgeCkpOwogICAgICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IHsKICAgICAgICAgICAgaWQ6ICIiLAogICAgICAgICAgICBrZXksCiAgICAgICAgICAgIHR5cGU6IEFubm90YXRpb25UeXBlLkxJTkUsCiAgICAgICAgICAgIHBvaW50QTogcG9zLnNsaWNlKDAsIDMpLAogICAgICAgICAgICBwb2ludEI6IHBvcy5zbGljZSgzLCA2KSwKICAgICAgICAgICAgcHJvcGVydGllczogW10KICAgICAgICAgIH07CiAgICAgICAgICBkZWNvZGVBbm5vdGF0aW9uUHJvcFYyKGVudHJ5LCBhbm5vdGF0aW9uKTsKICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgdmFyIFYyU3BoZXJlQW5ub3RhdGlvblJlcXVlc3RIZWxwZXIgPSBjbGFzcyBleHRlbmRzIEFubm90YXRpb25SZXF1ZXN0SGVscGVyIHsKICAgICAgZW5jb2RlKGFubm90YXRpb24pIHsKICAgICAgICBjb25zdCBvYmogPSBlbmNvZGVBbm5vdGF0aW9uVjIoYW5ub3RhdGlvbik7CiAgICAgICAgaWYgKG9iaiA9PT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIG9iai5raW5kID0gInNwaGVyZSI7CiAgICAgICAgb2JqLnBvcyA9IFthbm5vdGF0aW9uLnBvaW50QVswXSwgYW5ub3RhdGlvbi5wb2ludEFbMV0sIGFubm90YXRpb24ucG9pbnRBWzJdLCBhbm5vdGF0aW9uLnBvaW50QlswXSwgYW5ub3RhdGlvbi5wb2ludEJbMV0sIGFubm90YXRpb24ucG9pbnRCWzJdXTsKICAgICAgICByZXR1cm4gb2JqOwogICAgICB9CiAgICAgIGRlY29kZShrZXksIGVudHJ5KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmICh2ZXJpZnlPYmplY3RQcm9wZXJ0eShlbnRyeSwgImtpbmQiLCB2ZXJpZnlTdHJpbmcpICE9PSAic3BoZXJlIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQga2luZCBmb3IgbGluZSBhbm5vdGF0aW9uIGRhdGEuIik7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBwb3MgPSB2ZXJpZnlPYmplY3RQcm9wZXJ0eShlbnRyeSwgInBvcyIsICh4KSA9PiBwYXJzZUludFZlYyhuZXcgRmxvYXQzMkFycmF5KDYpLCB4KSk7CiAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uID0gewogICAgICAgICAgICBpZDogIiIsCiAgICAgICAgICAgIGtleSwKICAgICAgICAgICAgdHlwZTogQW5ub3RhdGlvblR5cGUuU1BIRVJFLAogICAgICAgICAgICBwb2ludEE6IHBvcy5zbGljZSgwLCAzKSwKICAgICAgICAgICAgcG9pbnRCOiBwb3Muc2xpY2UoMywgNiksCiAgICAgICAgICAgIHByb3BlcnRpZXM6IFtdCiAgICAgICAgICB9OwogICAgICAgICAgZGVjb2RlQW5ub3RhdGlvblByb3BWMihlbnRyeSwgYW5ub3RhdGlvbik7CiAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIHZhciBWMkF0bGFzQW5ub3RhdGlvblJlcXVlc3RIZWxwZXIgPSBjbGFzcyBleHRlbmRzIFYyUG9pbnRBbm5vdGF0aW9uUmVxdWVzdEhlbHBlciB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5kZWZhdWx0S2luZCA9ICJBdGxhcyI7CiAgICAgIH0KICAgICAgdXBsb2FkYWJsZShhbm5vdGF0aW9uKSB7CiAgICAgICAgaWYgKHN1cGVyLnVwbG9hZGFibGUoYW5ub3RhdGlvbikpIHsKICAgICAgICAgIGlmICh0eXBlb2YgYW5ub3RhdGlvbiAhPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvblJlZiA9IG5ldyBDbGlvQW5ub3RhdGlvbkZhY2FkZShhbm5vdGF0aW9uKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBhbm5vdGF0aW9uUmVmLnRpdGxlID09PSAic3RyaW5nIiAmJiBhbm5vdGF0aW9uUmVmLnRpdGxlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBtYWtlQW5ub3RhdGlvblJlcXVlc3RIZWxwZXJzKGluaXQpIHsKICAgICAgY29uc3QgaGVscGVycyA9IHsgLi4uaW5pdCB9OwogICAgICBpZiAoaW5pdFtBbm5vdGF0aW9uVHlwZS5QT0lOVF0pIHsKICAgICAgICBoZWxwZXJzLnBvaW50ID0gaW5pdFtBbm5vdGF0aW9uVHlwZS5QT0lOVF07CiAgICAgIH0KICAgICAgaWYgKGluaXRbQW5ub3RhdGlvblR5cGUuTElORV0pIHsKICAgICAgICBoZWxwZXJzLmxpbmVzZWcgPSBpbml0W0Fubm90YXRpb25UeXBlLkxJTkVdOwogICAgICB9CiAgICAgIGlmIChpbml0W0Fubm90YXRpb25UeXBlLlNQSEVSRV0pIHsKICAgICAgICBoZWxwZXJzLnNwaGVyZSA9IGluaXRbQW5ub3RhdGlvblR5cGUuU1BIRVJFXTsKICAgICAgfQogICAgICByZXR1cm4gaGVscGVyczsKICAgIH0KICAgIGZ1bmN0aW9uIG1ha2VFbmNvZGVycyhhcGksIGtpbmQpIHsKICAgICAgaWYgKGFwaSA9PT0gInYyIiB8fCBhcGkgPT09ICJ2MyIgfHwgYXBpID09PSAidGVzdCIpIHsKICAgICAgICBpZiAoa2luZCA9PT0gIkF0bGFzIikgewogICAgICAgICAgcmV0dXJuIG1ha2VBbm5vdGF0aW9uUmVxdWVzdEhlbHBlcnMoewogICAgICAgICAgICBbQW5ub3RhdGlvblR5cGUuUE9JTlRdOiBuZXcgVjJBdGxhc0Fubm90YXRpb25SZXF1ZXN0SGVscGVyKHRydWUpCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG1ha2VBbm5vdGF0aW9uUmVxdWVzdEhlbHBlcnMoewogICAgICAgICAgICBbQW5ub3RhdGlvblR5cGUuUE9JTlRdOiBuZXcgVjJQb2ludEFubm90YXRpb25SZXF1ZXN0SGVscGVyKHRydWUpLAogICAgICAgICAgICBbQW5ub3RhdGlvblR5cGUuTElORV06IG5ldyBWMkxpbmVBbm5vdGF0aW9uUmVxdWVzdEhlbHBlcih0cnVlKSwKICAgICAgICAgICAgW0Fubm90YXRpb25UeXBlLlNQSEVSRV06IG5ldyBWMlNwaGVyZUFubm90YXRpb25SZXF1ZXN0SGVscGVyKHRydWUpCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG1ha2VBbm5vdGF0aW9uUmVxdWVzdEhlbHBlcnMoewogICAgICAgIFtBbm5vdGF0aW9uVHlwZS5QT0lOVF06IG5ldyBWMVBvaW50QW5ub3RhdGlvblJlcXVlc3RIZWxwZXIodHJ1ZSkKICAgICAgfSk7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9kYXRhc291cmNlL2NsaW8vYmFja2VuZC50cwogICAgdmFyIEFubm90YXRpb25TdG9yZSA9IGNsYXNzIGV4dGVuZHMgUmVmQ291bnRlZCB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5zdG9yZSA9IG5ldyBNYXAoKTsKICAgICAgfQogICAgICBjbGVhcigpIHsKICAgICAgICB0aGlzLnN0b3JlLmNsZWFyKCk7CiAgICAgIH0KICAgICAgYWRkKGlkLCB2YWx1ZSkgewogICAgICAgIGlmIChpZCkgewogICAgICAgICAgdGhpcy5zdG9yZS5zZXQoaWQsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVtb3ZlKGlkKSB7CiAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoaWQpOwogICAgICB9CiAgICAgIHVwZGF0ZShpZCwgdmFsdWUpIHsKICAgICAgICB0aGlzLmFkZChpZCwgdmFsdWUpOwogICAgICB9CiAgICAgIGdldFZhbHVlKGlkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0KGlkKTsKICAgICAgfQogICAgfTsKICAgIHZhciBtZW1vaXplID0gbmV3IFN0cmluZ01lbW9pemUoKTsKICAgIGZ1bmN0aW9uIGdldEFubm90YXRpb25TdG9yZShwYXJhbWV0ZXJzKSB7CiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IENsaW9JbnN0YW5jZShwYXJhbWV0ZXJzKTsKICAgICAgcmV0dXJuIG1lbW9pemUuZ2V0KGluc3RhbmNlLmdldEFsbEFubm90YXRpb25zVXJsKCksICgpID0+IHsKICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25TdG9yZSgpOwogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIENsaW9Tb3VyY2UoQmFzZSwgcGFyYW1ldGVyc0NvbnN0cnVjdG9yKSB7CiAgICAgIHJldHVybiBXaXRoUGFyYW1ldGVycyhXaXRoU2hhcmVkQ3JlZGVudGlhbHNQcm92aWRlckNvdW50ZXJwYXJ0KCkoQmFzZSksIHBhcmFtZXRlcnNDb25zdHJ1Y3Rvcik7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZUFubm90YXRpb25zMyhzb3VyY2UsIGNodW5rLCByZXNwb25zZXMsIHByb3BTcGVjLCBlbWl0dGluZ0FkZFNpZ25hbCkgewogICAgICBjb25zdCBhbm5vdGF0aW9uUHJvcGVydHlTZXJpYWxpemVyczIgPSBtYWtlQW5ub3RhdGlvblByb3BlcnR5U2VyaWFsaXplcnMoMywgcHJvcFNwZWMpOwogICAgICBjb25zdCBzZXJpYWxpemVyID0gbmV3IEFubm90YXRpb25TZXJpYWxpemVyKGFubm90YXRpb25Qcm9wZXJ0eVNlcmlhbGl6ZXJzMik7CiAgICAgIGlmIChyZXNwb25zZXMpIHsKICAgICAgICBsZXQgcGFyc2VTaW5nbGVBbm5vdGF0aW9uMiA9IChrZXksIHJlc3BvbnNlLCBpbmRleCwgbGFzdEluZGV4KSA9PiB7CiAgICAgICAgICBpZiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBsZXQgYW5ub3RhdGlvbiA9IHNvdXJjZS5kZWNvZGVBbm5vdGF0aW9uKGtleSwgcmVzcG9uc2UpOwogICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uKSB7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGxhc3RJbmRleCkgewogICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLnNvdXJjZSA9IGBkb3dubG9hZGVkOmxhc3RgOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5zb3VyY2UgPSBgZG93bmxvYWRlZDoke2luZGV4fS8ke2xhc3RJbmRleH1gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvblN0b3JlKHNvdXJjZS5wYXJhbWV0ZXJzKS5hZGQoZ2V0QW5ub3RhdGlvbklkKGFubm90YXRpb24pLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmFkZChhbm5vdGF0aW9uKTsKICAgICAgICAgICAgICAgIGlmIChlbWl0dGluZ0FkZFNpZ25hbCkgewogICAgICAgICAgICAgICAgICBzb3VyY2UucnBjLmludm9rZShBTk5PVEFJSU9OX0NPTU1JVF9BRERfU0lHTkFMX1JQQ19JRCwgewogICAgICAgICAgICAgICAgICAgIGlkOiBzb3VyY2UucnBjSWQsCiAgICAgICAgICAgICAgICAgICAgbmV3QW5ub3RhdGlvbjogYW5ub3RhdGlvbgogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcGFyc2luZyBhbm5vdGF0aW9uOiAke2UubWVzc2FnZX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSBzb3VyY2U7CiAgICAgICAgY29uc3QgYW5ub3RhdGlvbkNvdW50ID0gT2JqZWN0LmtleXMocmVzcG9uc2VzKS5sZW5ndGg7CiAgICAgICAgT2JqZWN0LmtleXMocmVzcG9uc2VzKS5mb3JFYWNoKChrZXksIGluZGV4KSA9PiB7CiAgICAgICAgICBsZXQgcmVzcG9uc2UgPSByZXNwb25zZXNba2V5XTsKICAgICAgICAgIGlmIChyZXNwb25zZSkgewogICAgICAgICAgICBpZiAoISgiS2luZCIgaW4gcmVzcG9uc2UpKSB7CiAgICAgICAgICAgICAgcmVzcG9uc2VbIktpbmQiXSA9IHBhcmFtZXRlcnMua2luZDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcGFyc2VTaW5nbGVBbm5vdGF0aW9uMihyZXNwb25zZS5rZXkgfHwga2V5LCByZXNwb25zZSwgaW5kZXgsIGFubm90YXRpb25Db3VudCAtIDEpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNodW5rLmRhdGEgPSBPYmplY3QuYXNzaWduKG5ldyBBbm5vdGF0aW9uR2VvbWV0cnlEYXRhKCksIHNlcmlhbGl6ZXIuc2VyaWFsaXplKCkpOwogICAgfQogICAgdmFyIENsaW9Bbm5vdGF0aW9uR2VvbWV0cnlDaHVua1NvdXJjZSA9IGNsYXNzIGV4dGVuZHMgQ2xpb1NvdXJjZShBbm5vdGF0aW9uR2VvbWV0cnlDaHVua1NvdXJjZUJhY2tlbmQsIEFubm90YXRpb25DaHVua1NvdXJjZVBhcmFtZXRlcnMyKSB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5lbmNvZGVyID0gbWFrZUVuY29kZXJzKHRoaXMucGFyYW1ldGVycy5hcGksIHRoaXMucGFyYW1ldGVycy5raW5kKTsKICAgICAgfQogICAgICBkZWNvZGVBbm5vdGF0aW9uKGtleSwgZW50cnkpIHsKICAgICAgICBjb25zdCB0eXBlID0gdHlwZU9mQW5ub3RhdGlvbklkKGtleSk7CiAgICAgICAgaWYgKHR5cGUgIT09IG51bGwpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZXJbdHlwZV0uZGVjb2RlKGtleSwgZW50cnkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBhc3luYyBkb3dubG9hZChjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICBnZXRBbm5vdGF0aW9uU3RvcmUodGhpcy5wYXJhbWV0ZXJzKS5jbGVhcigpOwogICAgICAgIGNvbnN0IGNsaW9JbnN0YW5jZSA9IG5ldyBDbGlvSW5zdGFuY2UodGhpcy5wYXJhbWV0ZXJzKTsKICAgICAgICBsZXQgcG9pbnRBbm5vdGF0aW9uVmFsdWVzID0gYXdhaXQgbWFrZVJlcXVlc3RXaXRoQ3JlZGVudGlhbHMyKHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgaXNBdXRoUmVmcmVzaGFibGUodGhpcy5wYXJhbWV0ZXJzKSwgewogICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgIHVybDogY2xpb0luc3RhbmNlLmdldEFsbEFubm90YXRpb25zVXJsKCksCiAgICAgICAgICBwYXlsb2FkOiB2b2lkIDAsCiAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIgogICAgICAgIH0sIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgICByZXR1cm4gcGFyc2VBbm5vdGF0aW9uczModGhpcywgY2h1bmssIHBvaW50QW5ub3RhdGlvblZhbHVlcywgdGhpcy5wYXJhbWV0ZXJzLnByb3BlcnRpZXMsIHRydWUpOwogICAgICB9CiAgICB9OwogICAgQ2xpb0Fubm90YXRpb25HZW9tZXRyeUNodW5rU291cmNlID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoKQogICAgXSwgQ2xpb0Fubm90YXRpb25HZW9tZXRyeUNodW5rU291cmNlKTsKICAgIHZhciBDbGlvQW5ub3RhdGlvblNvdXJjZSA9IGNsYXNzIGV4dGVuZHMgQ2xpb1NvdXJjZShBbm5vdGF0aW9uU291cmNlMiwgQW5ub3RhdGlvblNvdXJjZVBhcmFtZXRlcnMzKSB7CiAgICAgIGNvbnN0cnVjdG9yKHJwYzIsIG9wdGlvbnMpIHsKICAgICAgICBzdXBlcihycGMyLCBvcHRpb25zKTsKICAgICAgICB0aGlzLmVuY29kZXJzID0gbWFrZUVuY29kZXJzKHRoaXMucGFyYW1ldGVycy5hcGksIHRoaXMucGFyYW1ldGVycy5raW5kKTsKICAgICAgfQogICAgICByZXF1ZXN0TGluZU1ldGFEYXRhKGlkLCBfKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShnZXRBbm5vdGF0aW9uU3RvcmUodGhpcy5wYXJhbWV0ZXJzKS5nZXRWYWx1ZShpZCkpOwogICAgICB9CiAgICAgIHJlcXVlc3RTcGhlcmVNZXRhRGF0YShpZCwgXykgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZ2V0QW5ub3RhdGlvblN0b3JlKHRoaXMucGFyYW1ldGVycykuZ2V0VmFsdWUoaWQpKTsKICAgICAgfQogICAgICByZXF1ZXN0UG9pbnRNZXRhRGF0YShpZCwgXykgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZ2V0QW5ub3RhdGlvblN0b3JlKHRoaXMucGFyYW1ldGVycykuZ2V0VmFsdWUoaWQpKTsKICAgICAgfQogICAgICByZXF1ZXN0TWV0YWRhdGEoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgaWQgPSBjaHVuay5rZXk7CiAgICAgICAgc3dpdGNoICh0eXBlT2ZBbm5vdGF0aW9uSWQoaWQpKSB7CiAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlLlBPSU5UOgogICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UG9pbnRNZXRhRGF0YShpZCwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5MSU5FOgogICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0TGluZU1ldGFEYXRhKGlkLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNQSEVSRToKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdFNwaGVyZU1ldGFEYXRhKGlkLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYW5ub3RhdGlvbiBJRCBmb3IgRFZJRDogJHtpZH1gKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZG93bmxvYWRNZXRhZGF0YShjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0TWV0YWRhdGEoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKS50aGVuKChyZXNwb25zZSkgPT4gewogICAgICAgICAgaWYgKHJlc3BvbnNlKSB7CiAgICAgICAgICAgIGNodW5rLmFubm90YXRpb24gPSB0aGlzLmRlY29kZUFubm90YXRpb24oY2h1bmsua2V5LCByZXNwb25zZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaHVuay5hbm5vdGF0aW9uID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICB1cGxvYWRhYmxlKGFubm90YXRpb24pIHsKICAgICAgICBjb25zdCBlbmNvZGVyID0gdGhpcy5nZXRFbmNvZGVyKGFubm90YXRpb24pOwogICAgICAgIGlmIChlbmNvZGVyKSB7CiAgICAgICAgICByZXR1cm4gZW5jb2Rlci51cGxvYWRhYmxlKHR5cGVvZiBhbm5vdGF0aW9uID09PSAic3RyaW5nIiA/IGVuY29kZXIuZGVjb2RlKGFubm90YXRpb24sIGdldEFubm90YXRpb25TdG9yZSh0aGlzLnBhcmFtZXRlcnMpLmdldFZhbHVlKGFubm90YXRpb24pKSA6IGFubm90YXRpb24pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZGVjb2RlQW5ub3RhdGlvbihrZXksIGVudHJ5KSB7CiAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVPZkFubm90YXRpb25JZChrZXkpOwogICAgICAgIGlmICh0eXBlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVyc1t0eXBlXS5kZWNvZGUoa2V5LCBlbnRyeSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGdldEVuY29kZXIoYW5ub3RhdGlvbikgewogICAgICAgIGxldCB0eXBlID0gbnVsbDsKICAgICAgICBpZiAodHlwZW9mIGFubm90YXRpb24gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICB0eXBlID0gdHlwZU9mQW5ub3RhdGlvbklkKGFubm90YXRpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0eXBlID0gYW5ub3RhdGlvbi50eXBlOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSAhPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlcnNbdHlwZV07CiAgICAgICAgfQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgICAgZW5jb2RlQW5ub3RhdGlvbihhbm5vdGF0aW9uKSB7CiAgICAgICAgY29uc3QgZW5jb2RlciA9IHRoaXMuZ2V0RW5jb2Rlcihhbm5vdGF0aW9uKTsKICAgICAgICBpZiAoZW5jb2RlcikgewogICAgICAgICAgcmV0dXJuIGVuY29kZXIuZW5jb2RlKGFubm90YXRpb24pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICB1cGRhdGVBbm5vdGF0aW9uKGFubm90YXRpb24sIG92ZXJ3cml0ZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCB7IHBhcmFtZXRlcnMgfSA9IHRoaXM7CiAgICAgICAgICBpZiAoIXBhcmFtZXRlcnMudXNlcikgewogICAgICAgICAgICB0aHJvdyBFcnJvcigiQ2Fubm90IHVwbG9hZCBhbiBhbm5vdGF0aW9uIHdpdGhvdXQgYSB1c2VyIik7CiAgICAgICAgICB9CiAgICAgICAgICBuZXcgQ2xpb0Fubm90YXRpb25GYWNhZGUoYW5ub3RhdGlvbikudXNlciA9IHBhcmFtZXRlcnMudXNlcjsKICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSB0aGlzLmVuY29kZUFubm90YXRpb24oYW5ub3RhdGlvbik7CiAgICAgICAgICBpZiAoZW5jb2RlZCA9PT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBlbmNvZGUgdGhlIGFubm90YXRpb24iKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghb3ZlcndyaXRlICYmIGdldEFubm90YXRpb25TdG9yZSh0aGlzLnBhcmFtZXRlcnMpLmdldFZhbHVlKGdldEFubm90YXRpb25JZChhbm5vdGF0aW9uKSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGFubm90YXRpb24iKTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KGVuY29kZWQpOwogICAgICAgICAgZ2V0QW5ub3RhdGlvblN0b3JlKHRoaXMucGFyYW1ldGVycykudXBkYXRlKGdldEFubm90YXRpb25JZChhbm5vdGF0aW9uKSwgZW5jb2RlZCk7CiAgICAgICAgICBpZiAodGhpcy51cGxvYWRhYmxlKGFubm90YXRpb24pKSB7CiAgICAgICAgICAgIGNvbnN0IGNsaW9JbnN0YW5jZSA9IG5ldyBDbGlvSW5zdGFuY2UocGFyYW1ldGVycyk7CiAgICAgICAgICAgIHJldHVybiBtYWtlUmVxdWVzdFdpdGhDcmVkZW50aWFsczIodGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCBpc0F1dGhSZWZyZXNoYWJsZShwYXJhbWV0ZXJzKSwgewogICAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICAgIHVybDogY2xpb0luc3RhbmNlLmdldFBvc3RBbm5vdGF0aW9uVXJsKGFubm90YXRpb24ucG9pbnQpLAogICAgICAgICAgICAgIHBheWxvYWQ6IHZhbHVlLAogICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogImpzb24iCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShnZXRBbm5vdGF0aW9uS2V5KGFubm90YXRpb24pKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkZEFubm90YXRpb24oYW5ub3RhdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUFubm90YXRpb24oYW5ub3RhdGlvbiwgZmFsc2UpLnRoZW4oKHJlc3BvbnNlKSA9PiB7CiAgICAgICAgICBsZXQga2V5ID0gdm9pZCAwOwogICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZSA9PT0gInN0cmluZyIgJiYgcmVzcG9uc2UubGVuZ3RoID4gMCkgewogICAgICAgICAgICBrZXkgPSByZXNwb25zZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGtleSA9IHJlc3BvbnNlLmtleTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uSWQoYW5ub3RhdGlvbiwga2V5KTsKICAgICAgICB9KS5jYXRjaCgoZSkgPT4gewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGFkZChhbm5vdGF0aW9uKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKICAgICAgfQogICAgICB1cGRhdGUoaWQsIGFubm90YXRpb24pIHsKICAgICAgICBpZiAoZ2V0QW5ub3RhdGlvbklkKGFubm90YXRpb24pICE9PSBpZCkgewogICAgICAgICAgZGVsZXRlIGFubm90YXRpb24ua2V5OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVBbm5vdGF0aW9uKGFubm90YXRpb24sIHRydWUpOwogICAgICB9CiAgICAgIGRlbGV0ZUFubm90YXRpb24oaWQpIHsKICAgICAgICBjb25zdCBjbGlvSW5zdGFuY2UgPSBuZXcgQ2xpb0luc3RhbmNlKHRoaXMucGFyYW1ldGVycyk7CiAgICAgICAgaWYgKHRoaXMudXBsb2FkYWJsZShpZCkpIHsKICAgICAgICAgIGNvbnN0IGNhY2hlZEFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uU3RvcmUodGhpcy5wYXJhbWV0ZXJzKS5nZXRWYWx1ZShpZCk7CiAgICAgICAgICBpZiAoY2FjaGVkQW5ub3RhdGlvbikgewogICAgICAgICAgICBjb25zdCB7IHVzZXIgfSA9IGNhY2hlZEFubm90YXRpb247CiAgICAgICAgICAgIGlmICh1c2VyICYmIHVzZXIgIT09IHRoaXMucGFyYW1ldGVycy51c2VyKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGVsZXRlIGFubm90YXRpb24gb3duZWQgYnkgJHt1c2VyfS5gKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29uc3QgaWRJbmZvID0gcGFyc2VBbm5vdGF0aW9uSWQoaWQpOwogICAgICAgICAgY29uc3Qga2V5ID0gaWRJbmZvID8gaWRJbmZvLmtleSA6IGlkOwogICAgICAgICAgcmV0dXJuIG1ha2VSZXF1ZXN0V2l0aENyZWRlbnRpYWxzMih0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIsIGlzQXV0aFJlZnJlc2hhYmxlKHRoaXMucGFyYW1ldGVycyksIHsKICAgICAgICAgICAgbWV0aG9kOiAiREVMRVRFIiwKICAgICAgICAgICAgdXJsOiBjbGlvSW5zdGFuY2UuZ2V0RGVsZXRlQW5ub3RhdGlvblVybChrZXkpLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICIiCiAgICAgICAgICB9KS50aGVuKCgpID0+IHsKICAgICAgICAgICAgZ2V0QW5ub3RhdGlvblN0b3JlKHRoaXMucGFyYW1ldGVycykucmVtb3ZlKGlkKTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnZXRBbm5vdGF0aW9uU3RvcmUodGhpcy5wYXJhbWV0ZXJzKS5yZW1vdmUoaWQpOwogICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgfQogICAgICBkZWxldGUoaWQpIHsKICAgICAgICBpZiAoaXNBbm5vdGF0aW9uSWRWYWxpZChpZCkpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZUFubm90YXRpb24oaWQpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBDbGlvQW5ub3RhdGlvblNvdXJjZSA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KCkKICAgIF0sIENsaW9Bbm5vdGF0aW9uU291cmNlKTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2RhdGFzb3VyY2UvcmVuZGVyL2Jhc2UudHMKICAgIHZhciBSZW5kZXJCYXNlU291cmNlUGFyYW1ldGVycyA9IGNsYXNzIHsKICAgIH07CiAgICB2YXIgUmVuZGVyU291cmNlUGFyYW1ldGVycyA9IGNsYXNzIGV4dGVuZHMgUmVuZGVyQmFzZVNvdXJjZVBhcmFtZXRlcnMgewogICAgfTsKICAgIHZhciBUaWxlQ2h1bmtTb3VyY2VQYXJhbWV0ZXJzID0gY2xhc3MgZXh0ZW5kcyBSZW5kZXJTb3VyY2VQYXJhbWV0ZXJzIHsKICAgIH07CiAgICBUaWxlQ2h1bmtTb3VyY2VQYXJhbWV0ZXJzLlJQQ19JRCA9ICJyZW5kZXIvVGlsZUNodW5rU291cmNlIjsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2RhdGFzb3VyY2UvcmVuZGVyL2JhY2tlbmQudHMKICAgIHZhciBjaHVua0RlY29kZXJzMiA9IG5ldyBNYXAoKTsKICAgIGNodW5rRGVjb2RlcnMyLnNldCgianBnIiwgYXN5bmMgKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbiwgcmVzcG9uc2UpID0+IHsKICAgICAgY29uc3QgY2h1bmtEYXRhU2l6ZSA9IGNodW5rLmNodW5rRGF0YVNpemU7CiAgICAgIGNvbnN0IGRlY29kZWQgPSBhd2FpdCByZXF1ZXN0QXN5bmNDb21wdXRhdGlvbihkZWNvZGVKcGVnLCBjYW5jZWxsYXRpb25Ub2tlbiwgW3Jlc3BvbnNlXSwgbmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpLCBjaHVua0RhdGFTaXplWzBdLCBjaHVua0RhdGFTaXplWzFdICogY2h1bmtEYXRhU2l6ZVsyXSwgMywgdHJ1ZSk7CiAgICAgIGF3YWl0IHBvc3RQcm9jZXNzUmF3RGF0YShjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4sIGRlY29kZWQpOwogICAgfSk7CiAgICBjaHVua0RlY29kZXJzMi5zZXQoInJhdzE2IiwgKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbiwgcmVzcG9uc2UpID0+IHsKICAgICAgcmV0dXJuIGRlY29kZVJhd0NodW5rKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbiwgcmVzcG9uc2UsIEVuZGlhbm5lc3MuQklHKTsKICAgIH0pOwogICAgdmFyIFRpbGVDaHVua1NvdXJjZSA9IGNsYXNzIGV4dGVuZHMgV2l0aFBhcmFtZXRlcnMoVm9sdW1lQ2h1bmtTb3VyY2UsIFRpbGVDaHVua1NvdXJjZVBhcmFtZXRlcnMpIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICB0aGlzLmNodW5rRGVjb2RlciA9IGNodW5rRGVjb2RlcnMyLmdldCh0aGlzLnBhcmFtZXRlcnMuZW5jb2RpbmcpOwogICAgICAgIHRoaXMucXVlcnlTdHJpbmcgPSAoKCkgPT4gewogICAgICAgICAgbGV0IHsgcGFyYW1ldGVycyB9ID0gdGhpczsKICAgICAgICAgIGxldCBxdWVyeV9wYXJhbXMgPSBbXTsKICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmNoYW5uZWwgIT09IHZvaWQgMCkgewogICAgICAgICAgICBxdWVyeV9wYXJhbXMucHVzaCgiY2hhbm5lbHM9IiArIHBhcmFtZXRlcnMuY2hhbm5lbCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGFyYW1ldGVycy5taW5JbnRlbnNpdHkgIT09IHZvaWQgMCkgewogICAgICAgICAgICBxdWVyeV9wYXJhbXMucHVzaChgbWluSW50ZW5zaXR5PSR7SlNPTi5zdHJpbmdpZnkocGFyYW1ldGVycy5taW5JbnRlbnNpdHkpfWApOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHBhcmFtZXRlcnMubWF4SW50ZW5zaXR5ICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgcXVlcnlfcGFyYW1zLnB1c2goYG1heEludGVuc2l0eT0ke0pTT04uc3RyaW5naWZ5KHBhcmFtZXRlcnMubWF4SW50ZW5zaXR5KX1gKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLm1heFRpbGVTcGVjc1RvUmVuZGVyICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgcXVlcnlfcGFyYW1zLnB1c2goYG1heFRpbGVTcGVjc1RvUmVuZGVyPSR7SlNPTi5zdHJpbmdpZnkocGFyYW1ldGVycy5tYXhUaWxlU3BlY3NUb1JlbmRlcil9YCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGFyYW1ldGVycy5maWx0ZXIgIT09IHZvaWQgMCkgewogICAgICAgICAgICBxdWVyeV9wYXJhbXMucHVzaChgZmlsdGVyPSR7SlNPTi5zdHJpbmdpZnkocGFyYW1ldGVycy5maWx0ZXIpfWApOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHF1ZXJ5X3BhcmFtcy5qb2luKCImIik7CiAgICAgICAgfSkoKTsKICAgICAgfQogICAgICBhc3luYyBkb3dubG9hZChjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICBsZXQgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGxldCB7IGNodW5rR3JpZFBvc2l0aW9uIH0gPSBjaHVuazsKICAgICAgICBsZXQgc2NhbGU2ID0gMSAvIE1hdGgucG93KDIsIHBhcmFtZXRlcnMubGV2ZWwpOwogICAgICAgIGNodW5rLmNodW5rRGF0YVNpemUgPSB0aGlzLnNwZWMuY2h1bmtEYXRhU2l6ZTsKICAgICAgICBsZXQgeFRpbGVTaXplID0gY2h1bmsuY2h1bmtEYXRhU2l6ZVswXSAqIE1hdGgucG93KDIsIHBhcmFtZXRlcnMubGV2ZWwpOwogICAgICAgIGxldCB5VGlsZVNpemUgPSBjaHVuay5jaHVua0RhdGFTaXplWzFdICogTWF0aC5wb3coMiwgcGFyYW1ldGVycy5sZXZlbCk7CiAgICAgICAgbGV0IGNodW5rUG9zaXRpb24gPSB2ZWMzX2V4cG9ydHMuY3JlYXRlKCk7CiAgICAgICAgY2h1bmtQb3NpdGlvblswXSA9IGNodW5rR3JpZFBvc2l0aW9uWzBdICogeFRpbGVTaXplOwogICAgICAgIGNodW5rUG9zaXRpb25bMV0gPSBjaHVua0dyaWRQb3NpdGlvblsxXSAqIHlUaWxlU2l6ZTsKICAgICAgICBjaHVua1Bvc2l0aW9uWzJdID0gY2h1bmtHcmlkUG9zaXRpb25bMl07CiAgICAgICAgbGV0IGltYWdlTWV0aG9kOwogICAgICAgIGlmIChwYXJhbWV0ZXJzLmVuY29kaW5nID09PSAicmF3MTYiKSB7CiAgICAgICAgICBpbWFnZU1ldGhvZCA9ICJyYXcxNi1pbWFnZSI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGltYWdlTWV0aG9kID0gImpwZWctaW1hZ2UiOwogICAgICAgIH0KICAgICAgICBsZXQgcGF0aCA9IGAvcmVuZGVyLXdzL3YxL293bmVyLyR7cGFyYW1ldGVycy5vd25lcn0vcHJvamVjdC8ke3BhcmFtZXRlcnMucHJvamVjdH0vc3RhY2svJHtwYXJhbWV0ZXJzLnN0YWNrfS96LyR7Y2h1bmtQb3NpdGlvblsyXX0vYm94LyR7Y2h1bmtQb3NpdGlvblswXX0sJHtjaHVua1Bvc2l0aW9uWzFdfSwke3hUaWxlU2l6ZX0sJHt5VGlsZVNpemV9LCR7c2NhbGU2fS8ke2ltYWdlTWV0aG9kfWA7CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjYW5jZWxsYWJsZUZldGNoT2soYCR7cGFyYW1ldGVycy5iYXNlVXJsfSR7cGF0aH0/JHt0aGlzLnF1ZXJ5U3RyaW5nfWAsIHt9LCByZXNwb25zZUFycmF5QnVmZmVyLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgYXdhaXQgdGhpcy5jaHVua0RlY29kZXIoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuLCByZXNwb25zZSk7CiAgICAgIH0KICAgIH07CiAgICBUaWxlQ2h1bmtTb3VyY2UgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdCgpCiAgICBdLCBUaWxlQ2h1bmtTb3VyY2UpOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdXRpbC9vYmplY3RfaWQudHMKICAgIHZhciBPQkpFQ1RfSURfU1lNQk9MID0gU3ltYm9sKCJvYmplY3RJZCIpOwogICAgdmFyIG5leHRPYmplY3RJZCA9IDA7CiAgICBmdW5jdGlvbiBnZXRPYmplY3RJZCh4KSB7CiAgICAgIGlmICh4IGluc3RhbmNlb2YgT2JqZWN0KSB7CiAgICAgICAgbGV0IGlkID0geFtPQkpFQ1RfSURfU1lNQk9MXTsKICAgICAgICBpZiAoaWQgPT09IHZvaWQgMCkgewogICAgICAgICAgaWQgPSB4W09CSkVDVF9JRF9TWU1CT0xdID0gbmV4dE9iamVjdElkKys7CiAgICAgICAgfQogICAgICAgIHJldHVybiBgbyR7aWR9YDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gIiIgKyBKU09OLnN0cmluZ2lmeSh4KTsKICAgICAgfQogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdXRpbC9zMy50cwogICAgYXN5bmMgZnVuY3Rpb24gY2FuY2VsbGFibGVGZXRjaFMzT2soY3JlZGVudGlhbHNQcm92aWRlciwgYnVja2V0LCBwYXRoLCByZXF1ZXN0SW5pdCwgdHJhbnNmb3JtUmVzcG9uc2UsIGNhbmNlbGxhdGlvblRva2VuID0gdW5jYW5jZWxhYmxlVG9rZW4pIHsKICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBjcmVkZW50aWFsc1Byb3ZpZGVyLmdldCgpOwogICAgICBjb25zdCB7IHJlZ2lvbiB9ID0gY3JlZGVudGlhbHMuY3JlZGVudGlhbHM7CiAgICAgIHJldHVybiBhd2FpdCBjYW5jZWxsYWJsZUZldGNoT2soYGh0dHBzOi8vJHtidWNrZXR9LnMzLiR7cmVnaW9ufS5hbWF6b25hd3MuY29tJHtwYXRofWAsIHJlcXVlc3RJbml0LCB0cmFuc2Zvcm1SZXNwb25zZSwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvdXRpbC9zcGVjaWFsX3Byb3RvY29sX3JlcXVlc3QudHMKICAgIGFzeW5jIGZ1bmN0aW9uIGNhbmNlbGxhYmxlRmV0Y2hTcGVjaWFsT2soY3JlZGVudGlhbHNQcm92aWRlciwgdXJsLCBpbml0LCB0cmFuc2Zvcm1SZXNwb25zZSwgY2FuY2VsbGF0aW9uVG9rZW4gPSB1bmNhbmNlbGFibGVUb2tlbikgewogICAgICBjb25zdCB1ID0gcGFyc2VVcmwodXJsKTsKICAgICAgc3dpdGNoICh1LnByb3RvY29sKSB7CiAgICAgICAgY2FzZSAiZ3MiOgogICAgICAgICAgcmV0dXJuIGZldGNoV2l0aE9BdXRoMkNyZWRlbnRpYWxzKGNyZWRlbnRpYWxzUHJvdmlkZXIsIGBodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvJHt1Lmhvc3R9L28vJHtlbmNvZGVVUklDb21wb25lbnQodS5wYXRoLnN1YnN0cmluZygxKSl9P2FsdD1tZWRpYSZuZXVyb2dsYW5jZXJPcmlnaW49JHtlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24ub3JpZ2luKX1gLCBpbml0LCB0cmFuc2Zvcm1SZXNwb25zZSwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgIGNhc2UgImdzK2pzb24iOgogICAgICAgICAgcmV0dXJuIGZldGNoV2l0aE9BdXRoMkNyZWRlbnRpYWxzKGNyZWRlbnRpYWxzUHJvdmlkZXIsIGBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iLyR7dS5ob3N0fS9vLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHUucGF0aC5zdWJzdHJpbmcoMSkpfT9hbHQ9bWVkaWFgLCBpbml0LCB0cmFuc2Zvcm1SZXNwb25zZSwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgIGNhc2UgImdzK3htbCI6CiAgICAgICAgICByZXR1cm4gZmV0Y2hXaXRoT0F1dGgyQ3JlZGVudGlhbHMoY3JlZGVudGlhbHNQcm92aWRlciwgYGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS8ke3UuaG9zdH0ke3UucGF0aH1gLCBpbml0LCB0cmFuc2Zvcm1SZXNwb25zZSwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgIGNhc2UgInMzIjoKICAgICAgICAgIHJldHVybiBjYW5jZWxsYWJsZUZldGNoUzNPayhjcmVkZW50aWFsc1Byb3ZpZGVyLCB1Lmhvc3QsIHUucGF0aCwgaW5pdCwgdHJhbnNmb3JtUmVzcG9uc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGZldGNoV2l0aE9BdXRoMkNyZWRlbnRpYWxzKGNyZWRlbnRpYWxzUHJvdmlkZXIsIHVybCwgaW5pdCwgdHJhbnNmb3JtUmVzcG9uc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgfQogICAgfQoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvY2h1bmtfbWFuYWdlci9nZW5lcmljX2ZpbGVfc291cmNlLnRzCiAgICB2YXIgR2VuZXJpY1NoYXJlZERhdGFDaHVuayA9IGNsYXNzIGV4dGVuZHMgQ2h1bmsgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMuYmFja2VuZE9ubHkgPSB0cnVlOwogICAgICB9CiAgICAgIGluaXRpYWxpemUoa2V5KSB7CiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZShrZXkpOwogICAgICAgIHRoaXMucmVxdWVzdGVycyA9IG5ldyBTZXQoKTsKICAgICAgfQogICAgICBkb3dubG9hZFN1Y2NlZWRlZCgpIHsKICAgICAgICBzdXBlci5kb3dubG9hZFN1Y2NlZWRlZCgpOwogICAgICAgIGxldCB7IHJlcXVlc3RlcnMsIGRhdGEgfSA9IHRoaXM7CiAgICAgICAgdGhpcy5yZXF1ZXN0ZXJzID0gdm9pZCAwOwogICAgICAgIGZvciAobGV0IHJlcXVlc3RlciBvZiByZXF1ZXN0ZXJzKSB7CiAgICAgICAgICByZXF1ZXN0ZXIucmVzb2x2ZShkYXRhKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZG93bmxvYWRGYWlsZWQoZXJyb3IpIHsKICAgICAgICBzdXBlci5kb3dubG9hZEZhaWxlZChlcnJvcik7CiAgICAgICAgbGV0IHsgcmVxdWVzdGVycyB9ID0gdGhpczsKICAgICAgICB0aGlzLnJlcXVlc3RlcnMgPSB2b2lkIDA7CiAgICAgICAgZm9yIChsZXQgcmVxdWVzdGVyIG9mIHJlcXVlc3RlcnMpIHsKICAgICAgICAgIHJlcXVlc3Rlci5yZWplY3QoZXJyb3IpOwogICAgICAgIH0KICAgICAgfQogICAgICBmcmVlU3lzdGVtTWVtb3J5KCkgewogICAgICAgIHRoaXMuZGF0YSA9IHZvaWQgMDsKICAgICAgfQogICAgfTsKICAgIHZhciBHZW5lcmljU2hhcmVkRGF0YVNvdXJjZSA9IGNsYXNzIGV4dGVuZHMgQ2h1bmtTb3VyY2VCYXNlIHsKICAgICAgY29uc3RydWN0b3IoY2h1bmtNYW5hZ2VyLCBvcHRpb25zKSB7CiAgICAgICAgc3VwZXIoY2h1bmtNYW5hZ2VyKTsKICAgICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIoY2h1bmtNYW5hZ2VyKTsKICAgICAgICBjb25zdCB7IGVuY29kZUtleSA9IHN0YWJsZVN0cmluZ2lmeSB9ID0gb3B0aW9uczsKICAgICAgICB0aGlzLmRvd25sb2FkRnVuY3Rpb24gPSBvcHRpb25zLmRvd25sb2FkOwogICAgICAgIHRoaXMuZW5jb2RlS2V5RnVuY3Rpb24gPSBlbmNvZGVLZXk7CiAgICAgICAgY29uc3QgeyBzb3VyY2VRdWV1ZUxldmVsID0gMCB9ID0gb3B0aW9uczsKICAgICAgICB0aGlzLnNvdXJjZVF1ZXVlTGV2ZWwgPSBzb3VyY2VRdWV1ZUxldmVsOwogICAgICAgIHRoaXMucmVnaXN0ZXJEaXNwb3Nlcih0aGlzLmNodW5rTWFuYWdlci5yZWNvbXB1dGVDaHVua1ByaW9yaXRpZXNMYXRlLmFkZCgoKSA9PiB7CiAgICAgICAgICB0aGlzLnVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICAgIH0pKTsKICAgICAgfQogICAgICB1cGRhdGVDaHVua1ByaW9yaXRpZXMoKSB7CiAgICAgICAgbGV0IHsgY2h1bmtNYW5hZ2VyIH0gPSB0aGlzOwogICAgICAgIGZvciAobGV0IGNodW5rIG9mIHRoaXMuY2h1bmtzLnZhbHVlcygpKSB7CiAgICAgICAgICBsZXQgeyByZXF1ZXN0ZXJzIH0gPSBjaHVuazsKICAgICAgICAgIGlmIChyZXF1ZXN0ZXJzICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgZm9yIChsZXQgcmVxdWVzdGVyIG9mIHJlcXVlc3RlcnMpIHsKICAgICAgICAgICAgICBjb25zdCB7IHByaW9yaXR5VGllciwgcHJpb3JpdHkgfSA9IHJlcXVlc3Rlci5nZXRQcmlvcml0eSgpOwogICAgICAgICAgICAgIGlmIChwcmlvcml0eVRpZXIgPT09IENodW5rUHJpb3JpdHlUaWVyLlJFQ0VOVCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIGNodW5rTWFuYWdlci5yZXF1ZXN0Q2h1bmsoY2h1bmssIHByaW9yaXR5VGllciwgcHJpb3JpdHkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGRvd25sb2FkKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgIGNvbnN0IHsgc2l6ZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5kb3dubG9hZEZ1bmN0aW9uKGNodW5rLmRlY29kZWRLZXksIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgICBjaHVuay5zeXN0ZW1NZW1vcnlCeXRlcyA9IHNpemU7CiAgICAgICAgY2h1bmsuZGF0YSA9IGRhdGE7CiAgICAgIH0KICAgICAgZ2V0RGF0YShrZXksIGdldFByaW9yaXR5LCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgIGNvbnN0IGVuY29kZWRLZXkgPSB0aGlzLmVuY29kZUtleUZ1bmN0aW9uKGtleSk7CiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5jaHVua3MuZ2V0KGVuY29kZWRLZXkpOwogICAgICAgIGlmIChjaHVuayA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBjaHVuayA9IHRoaXMuZ2V0TmV3Q2h1bmtfKEdlbmVyaWNTaGFyZWREYXRhQ2h1bmspOwogICAgICAgICAgY2h1bmsuZGVjb2RlZEtleSA9IGtleTsKICAgICAgICAgIGNodW5rLmluaXRpYWxpemUoZW5jb2RlZEtleSk7CiAgICAgICAgICB0aGlzLmFkZENodW5rKGNodW5rKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1ha2VDYW5jZWxhYmxlUHJvbWlzZShjYW5jZWxsYXRpb25Ub2tlbiwgKHJlc29sdmUsIHJlamVjdCwgdG9rZW4pID0+IHsKICAgICAgICAgIHN3aXRjaCAoY2h1bmsuc3RhdGUpIHsKICAgICAgICAgICAgY2FzZSBDaHVua1N0YXRlLkZBSUxFRDoKICAgICAgICAgICAgICByZWplY3QoY2h1bmsuZXJyb3IpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgY2FzZSBDaHVua1N0YXRlLlNZU1RFTV9NRU1PUllfV09SS0VSOgogICAgICAgICAgICAgIHJlc29sdmUoY2h1bmsuZGF0YSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgcmVxdWVzdGVyID0geyByZXNvbHZlLCByZWplY3QsIGdldFByaW9yaXR5IH07CiAgICAgICAgICBjaHVuay5yZXF1ZXN0ZXJzLmFkZChyZXF1ZXN0ZXIpOwogICAgICAgICAgdG9rZW4uYWRkKCgpID0+IHsKICAgICAgICAgICAgbGV0IHsgcmVxdWVzdGVycyB9ID0gY2h1bms7CiAgICAgICAgICAgIGlmIChyZXF1ZXN0ZXJzICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICByZXF1ZXN0ZXJzLmRlbGV0ZShyZXF1ZXN0ZXIpOwogICAgICAgICAgICAgIHRoaXMuY2h1bmtNYW5hZ2VyLnNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVqZWN0KENBTkNFTEVEKTsKICAgICAgICAgIH0pOwogICAgICAgICAgdGhpcy5jaHVua01hbmFnZXIuc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBzdGF0aWMgZ2V0KGNodW5rTWFuYWdlciwgbWVtb2l6ZUtleSwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBjaHVua01hbmFnZXIubWVtb2l6ZS5nZXQoYGdldEZpbGVTb3VyY2U6JHttZW1vaXplS2V5fWAsICgpID0+IG5ldyBHZW5lcmljU2hhcmVkRGF0YVNvdXJjZShjaHVua01hbmFnZXIuYWRkUmVmKCksIG9wdGlvbnMpKTsKICAgICAgfQogICAgICBzdGF0aWMgZ2V0RGF0YShjaHVua01hbmFnZXIsIG1lbW9pemVLZXksIG9wdGlvbnMsIGtleSwgZ2V0UHJpb3JpdHksIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3Qgc291cmNlID0gR2VuZXJpY1NoYXJlZERhdGFTb3VyY2UuZ2V0KGNodW5rTWFuYWdlciwgbWVtb2l6ZUtleSwgb3B0aW9ucyk7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gc291cmNlLmdldERhdGEoa2V5LCBnZXRQcmlvcml0eSwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgIHNvdXJjZS5kaXNwb3NlKCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBzdGF0aWMgZ2V0VXJsKGNodW5rTWFuYWdlciwgY3JlZGVudGlhbHNQcm92aWRlciwgZGVjb2RlRnVuY3Rpb24sIHVybCwgZ2V0UHJpb3JpdHksIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgcmV0dXJuIEdlbmVyaWNTaGFyZWREYXRhU291cmNlLmdldERhdGEoY2h1bmtNYW5hZ2VyLCBgJHtnZXRPYmplY3RJZChkZWNvZGVGdW5jdGlvbil9YCwgewogICAgICAgICAgZG93bmxvYWQ6ICh1cmwyLCBjYW5jZWxsYXRpb25Ub2tlbjIpID0+IGNhbmNlbGxhYmxlRmV0Y2hTcGVjaWFsT2soY3JlZGVudGlhbHNQcm92aWRlciwgdXJsMiwge30sIHJlc3BvbnNlQXJyYXlCdWZmZXIsIGNhbmNlbGxhdGlvblRva2VuMikudGhlbigocmVzcG9uc2UpID0+IGRlY29kZUZ1bmN0aW9uKHJlc3BvbnNlLCBjYW5jZWxsYXRpb25Ub2tlbjIpKQogICAgICAgIH0sIHVybCwgZ2V0UHJpb3JpdHksIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgfQogICAgfTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2RhdGFzb3VyY2UvcHJlY29tcHV0ZWQvYmFzZS50cwogICAgdmFyIFZvbHVtZUNodW5rRW5jb2RpbmczOwogICAgKGZ1bmN0aW9uKFZvbHVtZUNodW5rRW5jb2Rpbmc2KSB7CiAgICAgIFZvbHVtZUNodW5rRW5jb2Rpbmc2W1ZvbHVtZUNodW5rRW5jb2Rpbmc2WyJSQVciXSA9IDBdID0gIlJBVyI7CiAgICAgIFZvbHVtZUNodW5rRW5jb2Rpbmc2W1ZvbHVtZUNodW5rRW5jb2Rpbmc2WyJKUEVHIl0gPSAxXSA9ICJKUEVHIjsKICAgICAgVm9sdW1lQ2h1bmtFbmNvZGluZzZbVm9sdW1lQ2h1bmtFbmNvZGluZzZbIkNPTVBSRVNTRURfU0VHTUVOVEFUSU9OIl0gPSAyXSA9ICJDT01QUkVTU0VEX1NFR01FTlRBVElPTiI7CiAgICAgIFZvbHVtZUNodW5rRW5jb2Rpbmc2W1ZvbHVtZUNodW5rRW5jb2Rpbmc2WyJDT01QUkVTU08iXSA9IDNdID0gIkNPTVBSRVNTTyI7CiAgICAgIFZvbHVtZUNodW5rRW5jb2Rpbmc2W1ZvbHVtZUNodW5rRW5jb2Rpbmc2WyJQTkciXSA9IDRdID0gIlBORyI7CiAgICB9KShWb2x1bWVDaHVua0VuY29kaW5nMyB8fCAoVm9sdW1lQ2h1bmtFbmNvZGluZzMgPSB7fSkpOwogICAgdmFyIFZvbHVtZUNodW5rU291cmNlUGFyYW1ldGVyczMgPSBjbGFzcyB7CiAgICB9OwogICAgVm9sdW1lQ2h1bmtTb3VyY2VQYXJhbWV0ZXJzMy5SUENfSUQgPSAicHJlY29tcHV0ZWQvVm9sdW1lQ2h1bmtTb3VyY2UiOwogICAgdmFyIE1lc2hTb3VyY2VQYXJhbWV0ZXJzNCA9IGNsYXNzIHsKICAgIH07CiAgICBNZXNoU291cmNlUGFyYW1ldGVyczQuUlBDX0lEID0gInByZWNvbXB1dGVkL01lc2hTb3VyY2UiOwogICAgdmFyIERhdGFFbmNvZGluZzsKICAgIChmdW5jdGlvbihEYXRhRW5jb2RpbmcyKSB7CiAgICAgIERhdGFFbmNvZGluZzJbRGF0YUVuY29kaW5nMlsiUkFXIl0gPSAwXSA9ICJSQVciOwogICAgICBEYXRhRW5jb2RpbmcyW0RhdGFFbmNvZGluZzJbIkdaSVAiXSA9IDFdID0gIkdaSVAiOwogICAgfSkoRGF0YUVuY29kaW5nIHx8IChEYXRhRW5jb2RpbmcgPSB7fSkpOwogICAgdmFyIFNoYXJkaW5nSGFzaEZ1bmN0aW9uOwogICAgKGZ1bmN0aW9uKFNoYXJkaW5nSGFzaEZ1bmN0aW9uMikgewogICAgICBTaGFyZGluZ0hhc2hGdW5jdGlvbjJbU2hhcmRpbmdIYXNoRnVuY3Rpb24yWyJJREVOVElUWSJdID0gMF0gPSAiSURFTlRJVFkiOwogICAgICBTaGFyZGluZ0hhc2hGdW5jdGlvbjJbU2hhcmRpbmdIYXNoRnVuY3Rpb24yWyJNVVJNVVJIQVNIM19YODZfMTI4Il0gPSAxXSA9ICJNVVJNVVJIQVNIM19YODZfMTI4IjsKICAgIH0pKFNoYXJkaW5nSGFzaEZ1bmN0aW9uIHx8IChTaGFyZGluZ0hhc2hGdW5jdGlvbiA9IHt9KSk7CiAgICB2YXIgTXVsdGlzY2FsZU1lc2hTb3VyY2VQYXJhbWV0ZXJzMiA9IGNsYXNzIHsKICAgIH07CiAgICBNdWx0aXNjYWxlTWVzaFNvdXJjZVBhcmFtZXRlcnMyLlJQQ19JRCA9ICJwcmVjb21wdXRlZC9NdWx0aXNjYWxlTWVzaFNvdXJjZSI7CiAgICB2YXIgU2tlbGV0b25Tb3VyY2VQYXJhbWV0ZXJzMyA9IGNsYXNzIHsKICAgIH07CiAgICBTa2VsZXRvblNvdXJjZVBhcmFtZXRlcnMzLlJQQ19JRCA9ICJwcmVjb21wdXRlZC9Ta2VsZXRvblNvdXJjZSI7CiAgICB2YXIgQW5ub3RhdGlvblNwYXRpYWxJbmRleFNvdXJjZVBhcmFtZXRlcnMyID0gY2xhc3MgewogICAgfTsKICAgIEFubm90YXRpb25TcGF0aWFsSW5kZXhTb3VyY2VQYXJhbWV0ZXJzMi5SUENfSUQgPSAicHJlY29tcHV0ZWQvQW5ub3RhdGlvblNwYXRpYWxJbmRleFNvdXJjZSI7CiAgICB2YXIgQW5ub3RhdGlvblNvdXJjZVBhcmFtZXRlcnM0ID0gY2xhc3MgewogICAgfTsKICAgIEFubm90YXRpb25Tb3VyY2VQYXJhbWV0ZXJzNC5SUENfSUQgPSAicHJlY29tcHV0ZWQvQW5ub3RhdGlvblNvdXJjZSI7CiAgICB2YXIgSW5kZXhlZFNlZ21lbnRQcm9wZXJ0eVNvdXJjZVBhcmFtZXRlcnMgPSBjbGFzcyB7CiAgICB9OwogICAgSW5kZXhlZFNlZ21lbnRQcm9wZXJ0eVNvdXJjZVBhcmFtZXRlcnMuUlBDX0lEID0gInByZWNvbXB1dGVkL0luZGV4ZWRTZWdtZW50UHJvcGVydHlTb3VyY2UiOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvc2tlbGV0b24vZGVjb2RlX3ByZWNvbXB1dGVkX3NrZWxldG9uLnRzCiAgICBmdW5jdGlvbiBkZWNvZGVTa2VsZXRvbkNodW5rMihjaHVuaywgcmVzcG9uc2UsIHZlcnRleEF0dHJpYnV0ZXMpIHsKICAgICAgbGV0IGR2ID0gbmV3IERhdGFWaWV3KHJlc3BvbnNlKTsKICAgICAgbGV0IG51bVZlcnRpY2VzID0gZHYuZ2V0VWludDMyKDAsIHRydWUpOwogICAgICBsZXQgbnVtRWRnZXMgPSBkdi5nZXRVaW50MzIoNCwgdHJ1ZSk7CiAgICAgIGNvbnN0IHZlcnRleFBvc2l0aW9uc1N0YXJ0T2Zmc2V0ID0gODsKICAgICAgbGV0IGN1ck9mZnNldCA9IDggKyBudW1WZXJ0aWNlcyAqIDQgKiAzOwogICAgICBkZWNvZGVTa2VsZXRvblZlcnRleFBvc2l0aW9uc0FuZEluZGljZXMoY2h1bmssIHJlc3BvbnNlLCBFbmRpYW5uZXNzLkxJVFRMRSwgdmVydGV4UG9zaXRpb25zU3RhcnRPZmZzZXQsIG51bVZlcnRpY2VzLCBjdXJPZmZzZXQsIG51bUVkZ2VzKTsKICAgICAgY3VyT2Zmc2V0ICs9IG51bUVkZ2VzICogNCAqIDI7CiAgICAgIGxldCBhdHRyaWJ1dGVzID0gW107CiAgICAgIGZvciAobGV0IGluZm8gb2YgdmVydGV4QXR0cmlidXRlcy52YWx1ZXMoKSkgewogICAgICAgIGNvbnN0IGJ5dGVzUGVyVmVydGV4ID0gREFUQV9UWVBFX0JZVEVTW2luZm8uZGF0YVR5cGVdICogaW5mby5udW1Db21wb25lbnRzOwogICAgICAgIGNvbnN0IHRvdGFsQnl0ZXMgPSBieXRlc1BlclZlcnRleCAqIG51bVZlcnRpY2VzOwogICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG5ldyBVaW50OEFycmF5KHJlc3BvbnNlLCBjdXJPZmZzZXQsIHRvdGFsQnl0ZXMpOwogICAgICAgIHN3aXRjaCAoYnl0ZXNQZXJWZXJ0ZXgpIHsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgY29udmVydEVuZGlhbjE2KGF0dHJpYnV0ZSwgRW5kaWFubmVzcy5MSVRUTEUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgY29udmVydEVuZGlhbjMyKGF0dHJpYnV0ZSwgRW5kaWFubmVzcy5MSVRUTEUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgYXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZSk7CiAgICAgICAgY3VyT2Zmc2V0ICs9IHRvdGFsQnl0ZXM7CiAgICAgIH0KICAgICAgY2h1bmsudmVydGV4QXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9hc3luY19jb21wdXRhdGlvbi9kZWNvZGVfY29tcHJlc3NvX3JlcXVlc3QudHMKICAgIHZhciBkZWNvZGVDb21wcmVzc28gPSBhc3luY0NvbXB1dGF0aW9uKCJkZWNvZGVDb21wcmVzc28iKTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3NsaWNldmlldy9iYWNrZW5kX2NodW5rX2RlY29kZXJzL2NvbXByZXNzby50cwogICAgYXN5bmMgZnVuY3Rpb24gZGVjb2RlQ29tcHJlc3NvQ2h1bmsoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuLCByZXNwb25zZSkgewogICAgICBsZXQgaW1hZ2UgPSBhd2FpdCByZXF1ZXN0QXN5bmNDb21wdXRhdGlvbihkZWNvZGVDb21wcmVzc28sIGNhbmNlbGxhdGlvblRva2VuLCBbcmVzcG9uc2VdLCBuZXcgVWludDhBcnJheShyZXNwb25zZSkpOwogICAgICBhd2FpdCBkZWNvZGVSYXdDaHVuayhjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4sIGltYWdlLmJ1ZmZlcik7CiAgICB9CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9hc3luY19jb21wdXRhdGlvbi9kZWNvZGVfcG5nX3JlcXVlc3QudHMKICAgIHZhciBkZWNvZGVQbmcgPSBhc3luY0NvbXB1dGF0aW9uKCJkZWNvZGVQbmciKTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3NsaWNldmlldy9iYWNrZW5kX2NodW5rX2RlY29kZXJzL3BuZy50cwogICAgYXN5bmMgZnVuY3Rpb24gZGVjb2RlUG5nQ2h1bmsoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuLCByZXNwb25zZSkgewogICAgICBjb25zdCBjaHVua0RhdGFTaXplID0gY2h1bmsuY2h1bmtEYXRhU2l6ZTsKICAgICAgY29uc3QgZGF0YVR5cGUgPSBjaHVuay5zb3VyY2Uuc3BlYy5kYXRhVHlwZTsKICAgICAgbGV0IGltYWdlID0gYXdhaXQgcmVxdWVzdEFzeW5jQ29tcHV0YXRpb24oZGVjb2RlUG5nLCBjYW5jZWxsYXRpb25Ub2tlbiwgW3Jlc3BvbnNlXSwgbmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpLCBjaHVua0RhdGFTaXplWzBdLCBjaHVua0RhdGFTaXplWzFdICogY2h1bmtEYXRhU2l6ZVsyXSwgY2h1bmtEYXRhU2l6ZVszXSB8fCAxLCBEQVRBX1RZUEVfQllURVNbZGF0YVR5cGVdLCBmYWxzZSk7CiAgICAgIGF3YWl0IGRlY29kZVJhd0NodW5rKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbiwgaW1hZ2UuYnVmZmVyKTsKICAgIH0KCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3V0aWwvYnl0ZV9yYW5nZV9odHRwX3JlcXVlc3RzLnRzCiAgICB2YXIgY2FjaGVNb2RlID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSAhPT0gLTEgPyAibm8tc3RvcmUiIDogImRlZmF1bHQiOwogICAgZnVuY3Rpb24gZmV0Y2hTcGVjaWFsSHR0cEJ5dGVSYW5nZShjcmVkZW50aWFsc1Byb3ZpZGVyLCB1cmwsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQsIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgIHJldHVybiBjYW5jZWxsYWJsZUZldGNoU3BlY2lhbE9rKGNyZWRlbnRpYWxzUHJvdmlkZXIsIHVybCwgewogICAgICAgIGhlYWRlcnM6IGdldEJ5dGVSYW5nZUhlYWRlcihzdGFydE9mZnNldCwgZW5kT2Zmc2V0KSwKICAgICAgICBjYWNoZTogY2FjaGVNb2RlCiAgICAgIH0sIHJlc3BvbnNlQXJyYXlCdWZmZXIsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgIH0KCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3V0aWwvaGFzaC50cwogICAgZnVuY3Rpb24gbXVybXVySGFzaDNfeDg2XzEyOE1peChoKSB7CiAgICAgIGggXj0gaCA+Pj4gMTY7CiAgICAgIGggPSBNYXRoLmltdWwoaCwgMjI0NjgyMjUwNyk7CiAgICAgIGggXj0gaCA+Pj4gMTM7CiAgICAgIGggPSBNYXRoLmltdWwoaCwgMzI2NjQ4OTkwOSk7CiAgICAgIGggXj0gaCA+Pj4gMTY7CiAgICAgIHJldHVybiBoOwogICAgfQogICAgZnVuY3Rpb24gcm90bDMyKHgsIHIpIHsKICAgICAgcmV0dXJuIHggPDwgciB8IHggPj4+IDMyIC0gcjsKICAgIH0KICAgIGZ1bmN0aW9uIG11cm11ckhhc2gzX3g4Nl8xMjhIYXNoNjRCaXRzKG91dCwgc2VlZCwgbG93LCBoaWdoKSB7CiAgICAgIGxldCBoMSA9IHNlZWQsIGgyID0gc2VlZCwgaDMgPSBzZWVkLCBoNCA9IHNlZWQ7CiAgICAgIGNvbnN0IGMxID0gNTk3Mzk5MDY3OwogICAgICBjb25zdCBjMiA9IDI4Njk4NjAyMzM7CiAgICAgIGNvbnN0IGMzID0gOTUxMjc0MjEzOwogICAgICBsZXQgazIyID0gTWF0aC5pbXVsKGhpZ2gsIGMyKTsKICAgICAgazIyID0gcm90bDMyKGsyMiwgMTYpOwogICAgICBrMjIgPSBNYXRoLmltdWwoazIyLCBjMyk7CiAgICAgIGgyIF49IGsyMjsKICAgICAgbGV0IGsxMiA9IE1hdGguaW11bChsb3csIGMxKTsKICAgICAgazEyID0gcm90bDMyKGsxMiwgMTUpOwogICAgICBrMTIgPSBNYXRoLmltdWwoazEyLCBjMik7CiAgICAgIGgxIF49IGsxMjsKICAgICAgY29uc3QgbGVuNCA9IDg7CiAgICAgIGgxIF49IGxlbjQ7CiAgICAgIGgyIF49IGxlbjQ7CiAgICAgIGgzIF49IGxlbjQ7CiAgICAgIGg0IF49IGxlbjQ7CiAgICAgIGgxID0gaDEgKyBoMiA+Pj4gMDsKICAgICAgaDEgPSBoMSArIGgzID4+PiAwOwogICAgICBoMSA9IGgxICsgaDQgPj4+IDA7CiAgICAgIGgyID0gaDIgKyBoMSA+Pj4gMDsKICAgICAgaDMgPSBoMyArIGgxID4+PiAwOwogICAgICBoNCA9IGg0ICsgaDEgPj4+IDA7CiAgICAgIGgxID0gbXVybXVySGFzaDNfeDg2XzEyOE1peChoMSk7CiAgICAgIGgyID0gbXVybXVySGFzaDNfeDg2XzEyOE1peChoMik7CiAgICAgIGgzID0gbXVybXVySGFzaDNfeDg2XzEyOE1peChoMyk7CiAgICAgIGg0ID0gbXVybXVySGFzaDNfeDg2XzEyOE1peChoNCk7CiAgICAgIGgxID0gaDEgKyBoMiA+Pj4gMDsKICAgICAgaDEgPSBoMSArIGgzID4+PiAwOwogICAgICBoMSA9IGgxICsgaDQgPj4+IDA7CiAgICAgIGgyID0gaDIgKyBoMSA+Pj4gMDsKICAgICAgb3V0LmxvdyA9IGgxOwogICAgICBvdXQuaGlnaCA9IGgyOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgdmFyIHNoYXJkaW5nSGFzaEZ1bmN0aW9ucyA9IG5ldyBNYXAoWwogICAgICBbCiAgICAgICAgU2hhcmRpbmdIYXNoRnVuY3Rpb24uTVVSTVVSSEFTSDNfWDg2XzEyOCwKICAgICAgICAob3V0KSA9PiB7CiAgICAgICAgICBtdXJtdXJIYXNoM194ODZfMTI4SGFzaDY0Qml0cyhvdXQsIDAsIG91dC5sb3csIG91dC5oaWdoKTsKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFtTaGFyZGluZ0hhc2hGdW5jdGlvbi5JREVOVElUWSwgKF9vdXQpID0+IHsKICAgICAgfV0KICAgIF0pOwogICAgZnVuY3Rpb24gZ2V0TWluaXNoYXJkSW5kZXhEYXRhU291cmNlKGNodW5rTWFuYWdlciwgY3JlZGVudGlhbHNQcm92aWRlciwgcGFyYW1ldGVycykgewogICAgICBjb25zdCB7IHVybCwgc2hhcmRpbmcgfSA9IHBhcmFtZXRlcnM7CiAgICAgIGlmIChzaGFyZGluZyA9PT0gdm9pZCAwKQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIGNvbnN0IHNvdXJjZSA9IEdlbmVyaWNTaGFyZWREYXRhU291cmNlLmdldChjaHVua01hbmFnZXIsIHN0YWJsZVN0cmluZ2lmeSh7CiAgICAgICAgdHlwZTogInByZWNvbXB1dGVkOnNoYXJkZWREYXRhU291cmNlIiwKICAgICAgICB1cmwsCiAgICAgICAgc2hhcmRpbmcsCiAgICAgICAgY3JlZGVudGlhbHNQcm92aWRlcjogZ2V0T2JqZWN0SWQoY3JlZGVudGlhbHNQcm92aWRlcikKICAgICAgfSksIHsKICAgICAgICBkb3dubG9hZDogYXN5bmMgZnVuY3Rpb24oc2hhcmRBbmRNaW5pc2hhcmQsIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgICBjb25zdCBtaW5pc2hhcmQgPSBVaW50NjQubG93TWFzayhuZXcgVWludDY0KCksIHNoYXJkaW5nLm1pbmlzaGFyZEJpdHMpOwogICAgICAgICAgVWludDY0LmFuZChtaW5pc2hhcmQsIG1pbmlzaGFyZCwgc2hhcmRBbmRNaW5pc2hhcmQpOwogICAgICAgICAgY29uc3Qgc2hhcmQgPSBVaW50NjQubG93TWFzayhuZXcgVWludDY0KCksIHNoYXJkaW5nLnNoYXJkQml0cyk7CiAgICAgICAgICBjb25zdCB0ZW1wID0gbmV3IFVpbnQ2NCgpOwogICAgICAgICAgVWludDY0LnJzaGlmdCh0ZW1wLCBzaGFyZEFuZE1pbmlzaGFyZCwgc2hhcmRpbmcubWluaXNoYXJkQml0cyk7CiAgICAgICAgICBVaW50NjQuYW5kKHNoYXJkLCBzaGFyZCwgdGVtcCk7CiAgICAgICAgICBjb25zdCBzaGFyZFVybCA9IGAke3VybH0vJHtzaGFyZC50b1N0cmluZygxNikucGFkU3RhcnQoTWF0aC5jZWlsKHNoYXJkaW5nLnNoYXJkQml0cyAvIDQpLCAiMCIpfS5zaGFyZGA7CiAgICAgICAgICBjb25zdCBzaGFyZEluZGV4U2l6ZSA9IG5ldyBVaW50NjQoMTYpOwogICAgICAgICAgVWludDY0LmxzaGlmdChzaGFyZEluZGV4U2l6ZSwgc2hhcmRJbmRleFNpemUsIHNoYXJkaW5nLm1pbmlzaGFyZEJpdHMpOwogICAgICAgICAgY29uc3Qgc2hhcmRJbmRleFN0YXJ0ID0gVWludDY0LmxzaGlmdChuZXcgVWludDY0KCksIG1pbmlzaGFyZCwgNCk7CiAgICAgICAgICBjb25zdCBzaGFyZEluZGV4RW5kID0gVWludDY0LmFkZFVpbnQzMihuZXcgVWludDY0KCksIHNoYXJkSW5kZXhTdGFydCwgMTYpOwogICAgICAgICAgbGV0IHNoYXJkSW5kZXhSZXNwb25zZTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHNoYXJkSW5kZXhSZXNwb25zZSA9IGF3YWl0IGZldGNoU3BlY2lhbEh0dHBCeXRlUmFuZ2UoY3JlZGVudGlhbHNQcm92aWRlciwgc2hhcmRVcmwsIHNoYXJkSW5kZXhTdGFydCwgc2hhcmRJbmRleEVuZCwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBpZiAoaXNOb3RGb3VuZEVycm9yKGUpKQogICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHZvaWQgMCwgc2l6ZTogMCB9OwogICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHNoYXJkSW5kZXhSZXNwb25zZS5ieXRlTGVuZ3RoICE9PSAxNikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXRyaWV2ZSBtaW5pc2hhcmQgb2Zmc2V0YCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzaGFyZEluZGV4RHYgPSBuZXcgRGF0YVZpZXcoc2hhcmRJbmRleFJlc3BvbnNlKTsKICAgICAgICAgIGNvbnN0IG1pbmlzaGFyZFN0YXJ0T2Zmc2V0ID0gbmV3IFVpbnQ2NChzaGFyZEluZGV4RHYuZ2V0VWludDMyKDAsIHRydWUpLCBzaGFyZEluZGV4RHYuZ2V0VWludDMyKDQsIHRydWUpKTsKICAgICAgICAgIGNvbnN0IG1pbmlzaGFyZEVuZE9mZnNldCA9IG5ldyBVaW50NjQoc2hhcmRJbmRleER2LmdldFVpbnQzMig4LCB0cnVlKSwgc2hhcmRJbmRleER2LmdldFVpbnQzMigxMiwgdHJ1ZSkpOwogICAgICAgICAgaWYgKFVpbnQ2NC5lcXVhbChtaW5pc2hhcmRTdGFydE9mZnNldCwgbWluaXNoYXJkRW5kT2Zmc2V0KSkgewogICAgICAgICAgICByZXR1cm4geyBkYXRhOiB2b2lkIDAsIHNpemU6IDAgfTsKICAgICAgICAgIH0KICAgICAgICAgIFVpbnQ2NC5hZGQobWluaXNoYXJkU3RhcnRPZmZzZXQsIG1pbmlzaGFyZFN0YXJ0T2Zmc2V0LCBzaGFyZEluZGV4U2l6ZSk7CiAgICAgICAgICBVaW50NjQuYWRkKG1pbmlzaGFyZEVuZE9mZnNldCwgbWluaXNoYXJkRW5kT2Zmc2V0LCBzaGFyZEluZGV4U2l6ZSk7CiAgICAgICAgICBsZXQgbWluaXNoYXJkSW5kZXhSZXNwb25zZSA9IGF3YWl0IGZldGNoU3BlY2lhbEh0dHBCeXRlUmFuZ2UoY3JlZGVudGlhbHNQcm92aWRlciwgc2hhcmRVcmwsIG1pbmlzaGFyZFN0YXJ0T2Zmc2V0LCBtaW5pc2hhcmRFbmRPZmZzZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgICAgIGlmIChzaGFyZGluZy5taW5pc2hhcmRJbmRleEVuY29kaW5nID09PSBEYXRhRW5jb2RpbmcuR1pJUCkgewogICAgICAgICAgICBtaW5pc2hhcmRJbmRleFJlc3BvbnNlID0gKGF3YWl0IHJlcXVlc3RBc3luY0NvbXB1dGF0aW9uKGRlY29kZUd6aXAsIGNhbmNlbGxhdGlvblRva2VuLCBbbWluaXNoYXJkSW5kZXhSZXNwb25zZV0sIG5ldyBVaW50OEFycmF5KG1pbmlzaGFyZEluZGV4UmVzcG9uc2UpKSkuYnVmZmVyOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1pbmlzaGFyZEluZGV4UmVzcG9uc2UuYnl0ZUxlbmd0aCAlIDI0ICE9PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtaW5pc2hhcmQgaW5kZXggbGVuZ3RoOiAke21pbmlzaGFyZEluZGV4UmVzcG9uc2UuYnl0ZUxlbmd0aH1gKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IG1pbmlzaGFyZEluZGV4ID0gbmV3IFVpbnQzMkFycmF5KG1pbmlzaGFyZEluZGV4UmVzcG9uc2UpOwogICAgICAgICAgY29udmVydEVuZGlhbjMyKG1pbmlzaGFyZEluZGV4LCBFbmRpYW5uZXNzLkxJVFRMRSk7CiAgICAgICAgICBjb25zdCBtaW5pc2hhcmRJbmRleFNpemUgPSBtaW5pc2hhcmRJbmRleC5ieXRlTGVuZ3RoIC8gMjQ7CiAgICAgICAgICBsZXQgcHJldkVudHJ5S2V5TG93ID0gMCwgcHJldkVudHJ5S2V5SGlnaCA9IDA7CiAgICAgICAgICBsZXQgcHJldlN0YXJ0TG93ID0gc2hhcmRJbmRleFNpemUubG93LCBwcmV2U3RhcnRIaWdoID0gc2hhcmRJbmRleFNpemUuaGlnaDsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWluaXNoYXJkSW5kZXhTaXplOyArK2kpIHsKICAgICAgICAgICAgbGV0IGVudHJ5S2V5TG93ID0gcHJldkVudHJ5S2V5TG93ICsgbWluaXNoYXJkSW5kZXhbaSAqIDJdOwogICAgICAgICAgICBsZXQgZW50cnlLZXlIaWdoID0gcHJldkVudHJ5S2V5SGlnaCArIG1pbmlzaGFyZEluZGV4W2kgKiAyICsgMV07CiAgICAgICAgICAgIGlmIChlbnRyeUtleUxvdyA+PSA0Mjk0OTY3Mjk2KSB7CiAgICAgICAgICAgICAgZW50cnlLZXlMb3cgLT0gNDI5NDk2NzI5NjsKICAgICAgICAgICAgICBlbnRyeUtleUhpZ2ggKz0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmV2RW50cnlLZXlMb3cgPSBtaW5pc2hhcmRJbmRleFtpICogMl0gPSBlbnRyeUtleUxvdzsKICAgICAgICAgICAgcHJldkVudHJ5S2V5SGlnaCA9IG1pbmlzaGFyZEluZGV4W2kgKiAyICsgMV0gPSBlbnRyeUtleUhpZ2g7CiAgICAgICAgICAgIGxldCBzdGFydExvdyA9IHByZXZTdGFydExvdyArIG1pbmlzaGFyZEluZGV4WyhtaW5pc2hhcmRJbmRleFNpemUgKyBpKSAqIDJdOwogICAgICAgICAgICBsZXQgc3RhcnRIaWdoID0gcHJldlN0YXJ0SGlnaCArIG1pbmlzaGFyZEluZGV4WyhtaW5pc2hhcmRJbmRleFNpemUgKyBpKSAqIDIgKyAxXTsKICAgICAgICAgICAgaWYgKHN0YXJ0TG93ID49IDQyOTQ5NjcyOTYpIHsKICAgICAgICAgICAgICBzdGFydExvdyAtPSA0Mjk0OTY3Mjk2OwogICAgICAgICAgICAgIHN0YXJ0SGlnaCArPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1pbmlzaGFyZEluZGV4WyhtaW5pc2hhcmRJbmRleFNpemUgKyBpKSAqIDJdID0gc3RhcnRMb3c7CiAgICAgICAgICAgIG1pbmlzaGFyZEluZGV4WyhtaW5pc2hhcmRJbmRleFNpemUgKyBpKSAqIDIgKyAxXSA9IHN0YXJ0SGlnaDsKICAgICAgICAgICAgY29uc3Qgc2l6ZUxvdyA9IG1pbmlzaGFyZEluZGV4WygyICogbWluaXNoYXJkSW5kZXhTaXplICsgaSkgKiAyXTsKICAgICAgICAgICAgY29uc3Qgc2l6ZUhpZ2ggPSBtaW5pc2hhcmRJbmRleFsoMiAqIG1pbmlzaGFyZEluZGV4U2l6ZSArIGkpICogMiArIDFdOwogICAgICAgICAgICBsZXQgZW5kTG93ID0gc3RhcnRMb3cgKyBzaXplTG93OwogICAgICAgICAgICBsZXQgZW5kSGlnaCA9IHN0YXJ0SGlnaCArIHNpemVIaWdoOwogICAgICAgICAgICBpZiAoZW5kTG93ID49IDQyOTQ5NjcyOTYpIHsKICAgICAgICAgICAgICBlbmRMb3cgLT0gNDI5NDk2NzI5NjsKICAgICAgICAgICAgICBlbmRIaWdoICs9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJldlN0YXJ0TG93ID0gZW5kTG93OwogICAgICAgICAgICBwcmV2U3RhcnRIaWdoID0gZW5kSGlnaDsKICAgICAgICAgICAgbWluaXNoYXJkSW5kZXhbKDIgKiBtaW5pc2hhcmRJbmRleFNpemUgKyBpKSAqIDJdID0gZW5kTG93OwogICAgICAgICAgICBtaW5pc2hhcmRJbmRleFsoMiAqIG1pbmlzaGFyZEluZGV4U2l6ZSArIGkpICogMiArIDFdID0gZW5kSGlnaDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgZGF0YTogbWluaXNoYXJkSW5kZXgsIHNoYXJkVXJsIH0sIHNpemU6IG1pbmlzaGFyZEluZGV4LmJ5dGVMZW5ndGggfTsKICAgICAgICB9LAogICAgICAgIGVuY29kZUtleTogKGtleSkgPT4ga2V5LnRvU3RyaW5nKCksCiAgICAgICAgc291cmNlUXVldWVMZXZlbDogMQogICAgICB9KTsKICAgICAgc291cmNlLnNoYXJkaW5nID0gc2hhcmRpbmc7CiAgICAgIHNvdXJjZS5jcmVkZW50aWFsc1Byb3ZpZGVyID0gY3JlZGVudGlhbHNQcm92aWRlcjsKICAgICAgcmV0dXJuIHNvdXJjZTsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbmRNaW5pc2hhcmRFbnRyeShtaW5pc2hhcmRJbmRleCwga2V5KSB7CiAgICAgIGNvbnN0IG1pbmlzaGFyZEluZGV4RGF0YSA9IG1pbmlzaGFyZEluZGV4LmRhdGE7CiAgICAgIGNvbnN0IG1pbmlzaGFyZEluZGV4U2l6ZSA9IG1pbmlzaGFyZEluZGV4RGF0YS5sZW5ndGggLyA2OwogICAgICBjb25zdCBrZXlMb3cgPSBrZXkubG93LCBrZXlIaWdoID0ga2V5LmhpZ2g7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWluaXNoYXJkSW5kZXhTaXplOyArK2kpIHsKICAgICAgICBpZiAobWluaXNoYXJkSW5kZXhEYXRhW2kgKiAyXSAhPT0ga2V5TG93IHx8IG1pbmlzaGFyZEluZGV4RGF0YVtpICogMiArIDFdICE9PSBrZXlIaWdoKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3RhcnRPZmZzZXQgPSBuZXcgVWludDY0KG1pbmlzaGFyZEluZGV4RGF0YVsobWluaXNoYXJkSW5kZXhTaXplICsgaSkgKiAyXSwgbWluaXNoYXJkSW5kZXhEYXRhWyhtaW5pc2hhcmRJbmRleFNpemUgKyBpKSAqIDIgKyAxXSk7CiAgICAgICAgY29uc3QgZW5kT2Zmc2V0ID0gbmV3IFVpbnQ2NChtaW5pc2hhcmRJbmRleERhdGFbKDIgKiBtaW5pc2hhcmRJbmRleFNpemUgKyBpKSAqIDJdLCBtaW5pc2hhcmRJbmRleERhdGFbKDIgKiBtaW5pc2hhcmRJbmRleFNpemUgKyBpKSAqIDIgKyAxXSk7CiAgICAgICAgcmV0dXJuIHsgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCB9OwogICAgICB9CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBnZXRTaGFyZGVkRGF0YShtaW5pc2hhcmRJbmRleFNvdXJjZSwgY2h1bmssIGtleSwgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgY29uc3QgeyBzaGFyZGluZyB9ID0gbWluaXNoYXJkSW5kZXhTb3VyY2U7CiAgICAgIGNvbnN0IGhhc2hGdW5jdGlvbiA9IHNoYXJkaW5nSGFzaEZ1bmN0aW9ucy5nZXQoc2hhcmRpbmcuaGFzaCk7CiAgICAgIGNvbnN0IGhhc2hDb2RlID0gVWludDY0LnJzaGlmdChuZXcgVWludDY0KCksIGtleSwgc2hhcmRpbmcucHJlc2hpZnRCaXRzKTsKICAgICAgaGFzaEZ1bmN0aW9uKGhhc2hDb2RlKTsKICAgICAgY29uc3Qgc2hhcmRBbmRNaW5pc2hhcmQgPSBVaW50NjQubG93TWFzayhuZXcgVWludDY0KCksIHNoYXJkaW5nLm1pbmlzaGFyZEJpdHMgKyBzaGFyZGluZy5zaGFyZEJpdHMpOwogICAgICBVaW50NjQuYW5kKHNoYXJkQW5kTWluaXNoYXJkLCBzaGFyZEFuZE1pbmlzaGFyZCwgaGFzaENvZGUpOwogICAgICBjb25zdCBnZXRQcmlvcml0eSA9ICgpID0+ICh7IHByaW9yaXR5VGllcjogY2h1bmsucHJpb3JpdHlUaWVyLCBwcmlvcml0eTogY2h1bmsucHJpb3JpdHkgfSk7CiAgICAgIGNvbnN0IG1pbmlzaGFyZEluZGV4ID0gYXdhaXQgbWluaXNoYXJkSW5kZXhTb3VyY2UuZ2V0RGF0YShzaGFyZEFuZE1pbmlzaGFyZCwgZ2V0UHJpb3JpdHksIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgaWYgKG1pbmlzaGFyZEluZGV4ID09PSB2b2lkIDApCiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgY29uc3QgbWluaXNoYXJkRW50cnkgPSBmaW5kTWluaXNoYXJkRW50cnkobWluaXNoYXJkSW5kZXgsIGtleSk7CiAgICAgIGlmIChtaW5pc2hhcmRFbnRyeSA9PT0gdm9pZCAwKQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIGNvbnN0IHsgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCB9ID0gbWluaXNoYXJkRW50cnk7CiAgICAgIGxldCBkYXRhID0gYXdhaXQgZmV0Y2hTcGVjaWFsSHR0cEJ5dGVSYW5nZShtaW5pc2hhcmRJbmRleFNvdXJjZS5jcmVkZW50aWFsc1Byb3ZpZGVyLCBtaW5pc2hhcmRJbmRleC5zaGFyZFVybCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICBpZiAobWluaXNoYXJkSW5kZXhTb3VyY2Uuc2hhcmRpbmcuZGF0YUVuY29kaW5nID09PSBEYXRhRW5jb2RpbmcuR1pJUCkgewogICAgICAgIGRhdGEgPSAoYXdhaXQgcmVxdWVzdEFzeW5jQ29tcHV0YXRpb24oZGVjb2RlR3ppcCwgY2FuY2VsbGF0aW9uVG9rZW4sIFtkYXRhXSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpKS5idWZmZXI7CiAgICAgIH0KICAgICAgcmV0dXJuIHsgZGF0YSwgc2hhcmRJbmZvOiB7IHNoYXJkVXJsOiBtaW5pc2hhcmRJbmRleC5zaGFyZFVybCwgb2Zmc2V0OiBzdGFydE9mZnNldCB9IH07CiAgICB9CiAgICBmdW5jdGlvbiBnZXRPck5vdEZvdW5kRXJyb3IodikgewogICAgICBpZiAodiA9PT0gdm9pZCAwKQogICAgICAgIHRocm93IG5ldyBFcnJvcigibm90IGZvdW5kIik7CiAgICAgIHJldHVybiB2OwogICAgfQogICAgdmFyIGNodW5rRGVjb2RlcnMzID0gbmV3IE1hcCgpOwogICAgY2h1bmtEZWNvZGVyczMuc2V0KFZvbHVtZUNodW5rRW5jb2RpbmczLlJBVywgZGVjb2RlUmF3Q2h1bmspOwogICAgY2h1bmtEZWNvZGVyczMuc2V0KFZvbHVtZUNodW5rRW5jb2RpbmczLkpQRUcsIGRlY29kZUpwZWdDaHVuayk7CiAgICBjaHVua0RlY29kZXJzMy5zZXQoVm9sdW1lQ2h1bmtFbmNvZGluZzMuQ09NUFJFU1NFRF9TRUdNRU5UQVRJT04sIGRlY29kZUNvbXByZXNzZWRTZWdtZW50YXRpb25DaHVuayk7CiAgICBjaHVua0RlY29kZXJzMy5zZXQoVm9sdW1lQ2h1bmtFbmNvZGluZzMuQ09NUFJFU1NPLCBkZWNvZGVDb21wcmVzc29DaHVuayk7CiAgICBjaHVua0RlY29kZXJzMy5zZXQoVm9sdW1lQ2h1bmtFbmNvZGluZzMuUE5HLCBkZWNvZGVQbmdDaHVuayk7CiAgICB2YXIgUHJlY29tcHV0ZWRWb2x1bWVDaHVua1NvdXJjZSA9IGNsYXNzIGV4dGVuZHMgV2l0aFBhcmFtZXRlcnMoV2l0aFNoYXJlZENyZWRlbnRpYWxzUHJvdmlkZXJDb3VudGVycGFydCgpKFZvbHVtZUNodW5rU291cmNlKSwgVm9sdW1lQ2h1bmtTb3VyY2VQYXJhbWV0ZXJzMykgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMuY2h1bmtEZWNvZGVyID0gY2h1bmtEZWNvZGVyczMuZ2V0KHRoaXMucGFyYW1ldGVycy5lbmNvZGluZyk7CiAgICAgICAgdGhpcy5taW5pc2hhcmRJbmRleFNvdXJjZSA9IGdldE1pbmlzaGFyZEluZGV4RGF0YVNvdXJjZSh0aGlzLmNodW5rTWFuYWdlciwgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCB0aGlzLnBhcmFtZXRlcnMpOwogICAgICAgIHRoaXMuZ3JpZFNoYXBlID0gKCgpID0+IHsKICAgICAgICAgIGNvbnN0IGdyaWRTaGFwZSA9IG5ldyBVaW50MzJBcnJheSgzKTsKICAgICAgICAgIGNvbnN0IHsgdXBwZXJWb3hlbEJvdW5kLCBjaHVua0RhdGFTaXplIH0gPSB0aGlzLnNwZWM7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgICAgICBncmlkU2hhcGVbaV0gPSBNYXRoLmNlaWwodXBwZXJWb3hlbEJvdW5kW2ldIC8gY2h1bmtEYXRhU2l6ZVtpXSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZ3JpZFNoYXBlOwogICAgICAgIH0pKCk7CiAgICAgIH0KICAgICAgYXN5bmMgZG93bmxvYWQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGNvbnN0IHsgbWluaXNoYXJkSW5kZXhTb3VyY2UgfSA9IHRoaXM7CiAgICAgICAgbGV0IHJlc3BvbnNlOwogICAgICAgIGlmIChtaW5pc2hhcmRJbmRleFNvdXJjZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBsZXQgdXJsOwogICAgICAgICAgewogICAgICAgICAgICBsZXQgY2h1bmtQb3NpdGlvbiA9IHRoaXMuY29tcHV0ZUNodW5rQm91bmRzKGNodW5rKTsKICAgICAgICAgICAgbGV0IGNodW5rRGF0YVNpemUgPSBjaHVuay5jaHVua0RhdGFTaXplOwogICAgICAgICAgICB1cmwgPSBgJHtwYXJhbWV0ZXJzLnVybH0vJHtjaHVua1Bvc2l0aW9uWzBdfS0ke2NodW5rUG9zaXRpb25bMF0gKyBjaHVua0RhdGFTaXplWzBdfV8ke2NodW5rUG9zaXRpb25bMV19LSR7Y2h1bmtQb3NpdGlvblsxXSArIGNodW5rRGF0YVNpemVbMV19XyR7Y2h1bmtQb3NpdGlvblsyXX0tJHtjaHVua1Bvc2l0aW9uWzJdICsgY2h1bmtEYXRhU2l6ZVsyXX1gOwogICAgICAgICAgfQogICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYW5jZWxsYWJsZUZldGNoU3BlY2lhbE9rKHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgdXJsLCB7fSwgcmVzcG9uc2VBcnJheUJ1ZmZlciwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmNvbXB1dGVDaHVua0JvdW5kcyhjaHVuayk7CiAgICAgICAgICBjb25zdCB7IGdyaWRTaGFwZSB9ID0gdGhpczsKICAgICAgICAgIGNvbnN0IHsgY2h1bmtHcmlkUG9zaXRpb24gfSA9IGNodW5rOwogICAgICAgICAgY29uc3QgeEJpdHMgPSBNYXRoLmNlaWwoTWF0aC5sb2cyKGdyaWRTaGFwZVswXSkpLCB5Qml0cyA9IE1hdGguY2VpbChNYXRoLmxvZzIoZ3JpZFNoYXBlWzFdKSksIHpCaXRzID0gTWF0aC5jZWlsKE1hdGgubG9nMihncmlkU2hhcGVbMl0pKTsKICAgICAgICAgIGNvbnN0IGNodW5rSW5kZXggPSBlbmNvZGVaSW5kZXhDb21wcmVzc2VkM2QobmV3IFVpbnQ2NCgpLCB4Qml0cywgeUJpdHMsIHpCaXRzLCBjaHVua0dyaWRQb3NpdGlvblswXSwgY2h1bmtHcmlkUG9zaXRpb25bMV0sIGNodW5rR3JpZFBvc2l0aW9uWzJdKTsKICAgICAgICAgIHJlc3BvbnNlID0gZ2V0T3JOb3RGb3VuZEVycm9yKGF3YWl0IGdldFNoYXJkZWREYXRhKG1pbmlzaGFyZEluZGV4U291cmNlLCBjaHVuaywgY2h1bmtJbmRleCwgY2FuY2VsbGF0aW9uVG9rZW4pKS5kYXRhOwogICAgICAgIH0KICAgICAgICBhd2FpdCB0aGlzLmNodW5rRGVjb2RlcihjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4sIHJlc3BvbnNlKTsKICAgICAgfQogICAgfTsKICAgIFByZWNvbXB1dGVkVm9sdW1lQ2h1bmtTb3VyY2UgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdCgpCiAgICBdLCBQcmVjb21wdXRlZFZvbHVtZUNodW5rU291cmNlKTsKICAgIGZ1bmN0aW9uIGRlY29kZU1hbmlmZXN0Q2h1bmsyKGNodW5rLCByZXNwb25zZSkgewogICAgICByZXR1cm4gZGVjb2RlSnNvbk1hbmlmZXN0Q2h1bmsoY2h1bmssIHJlc3BvbnNlLCAiZnJhZ21lbnRzIik7CiAgICB9CiAgICBmdW5jdGlvbiBkZWNvZGVGcmFnbWVudENodW5rMyhjaHVuaywgcmVzcG9uc2UpIHsKICAgICAgbGV0IGR2ID0gbmV3IERhdGFWaWV3KHJlc3BvbnNlKTsKICAgICAgbGV0IG51bVZlcnRpY2VzID0gZHYuZ2V0VWludDMyKDAsIHRydWUpOwogICAgICBhc3NpZ25NZXNoRnJhZ21lbnREYXRhKGNodW5rLCBkZWNvZGVUcmlhbmdsZVZlcnRleFBvc2l0aW9uc0FuZEluZGljZXMocmVzcG9uc2UsIEVuZGlhbm5lc3MuTElUVExFLCA0LCBudW1WZXJ0aWNlcykpOwogICAgfQogICAgdmFyIFByZWNvbXB1dGVkTWVzaFNvdXJjZSA9IGNsYXNzIGV4dGVuZHMgV2l0aFBhcmFtZXRlcnMoV2l0aFNoYXJlZENyZWRlbnRpYWxzUHJvdmlkZXJDb3VudGVycGFydCgpKE1lc2hTb3VyY2UpLCBNZXNoU291cmNlUGFyYW1ldGVyczQpIHsKICAgICAgYXN5bmMgZG93bmxvYWQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2FuY2VsbGFibGVGZXRjaFNwZWNpYWxPayh0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIsIGAke3BhcmFtZXRlcnMudXJsfS8ke2NodW5rLm9iamVjdElkfToke3BhcmFtZXRlcnMubG9kfWAsIHt9LCByZXNwb25zZUpzb24sIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgICBkZWNvZGVNYW5pZmVzdENodW5rMihjaHVuaywgcmVzcG9uc2UpOwogICAgICB9CiAgICAgIGFzeW5jIGRvd25sb2FkRnJhZ21lbnQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2FuY2VsbGFibGVGZXRjaFNwZWNpYWxPayh0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIsIGAke3BhcmFtZXRlcnMudXJsfS8ke2NodW5rLmZyYWdtZW50SWR9YCwge30sIHJlc3BvbnNlQXJyYXlCdWZmZXIsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgICBkZWNvZGVGcmFnbWVudENodW5rMyhjaHVuaywgcmVzcG9uc2UpOwogICAgICB9CiAgICB9OwogICAgUHJlY29tcHV0ZWRNZXNoU291cmNlID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoKQogICAgXSwgUHJlY29tcHV0ZWRNZXNoU291cmNlKTsKICAgIGZ1bmN0aW9uIGRlY29kZU11bHRpc2NhbGVNYW5pZmVzdENodW5rMihjaHVuaywgcmVzcG9uc2UpIHsKICAgICAgaWYgKHJlc3BvbnNlLmJ5dGVMZW5ndGggPCAyOCB8fCByZXNwb25zZS5ieXRlTGVuZ3RoICUgNCAhPT0gMCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbmRleCBmaWxlIHNpemU6ICR7cmVzcG9uc2UuYnl0ZUxlbmd0aH1gKTsKICAgICAgfQogICAgICBjb25zdCBkdiA9IG5ldyBEYXRhVmlldyhyZXNwb25zZSk7CiAgICAgIGxldCBvZmZzZXQgPSAwOwogICAgICBjb25zdCBjaHVua1NoYXBlID0gdmVjM19leHBvcnRzLmZyb21WYWx1ZXMoZHYuZ2V0RmxvYXQzMihvZmZzZXQsIHRydWUpLCBkdi5nZXRGbG9hdDMyKG9mZnNldCArIDQsIHRydWUpLCBkdi5nZXRGbG9hdDMyKG9mZnNldCArIDgsIHRydWUpKTsKICAgICAgb2Zmc2V0ICs9IDEyOwogICAgICBjb25zdCBncmlkT3JpZ2luID0gdmVjM19leHBvcnRzLmZyb21WYWx1ZXMoZHYuZ2V0RmxvYXQzMihvZmZzZXQsIHRydWUpLCBkdi5nZXRGbG9hdDMyKG9mZnNldCArIDQsIHRydWUpLCBkdi5nZXRGbG9hdDMyKG9mZnNldCArIDgsIHRydWUpKTsKICAgICAgb2Zmc2V0ICs9IDEyOwogICAgICBjb25zdCBudW1TdG9yZWRMb2RzID0gZHYuZ2V0VWludDMyKG9mZnNldCwgdHJ1ZSk7CiAgICAgIG9mZnNldCArPSA0OwogICAgICBpZiAocmVzcG9uc2UuYnl0ZUxlbmd0aCA8IG9mZnNldCArICg0ICsgNCArIDQgKiAzKSAqIG51bVN0b3JlZExvZHMpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5kZXggZmlsZSBzaXplIGZvciAke251bVN0b3JlZExvZHN9IGxvZHM6ICR7cmVzcG9uc2UuYnl0ZUxlbmd0aH1gKTsKICAgICAgfQogICAgICBjb25zdCBzdG9yZWRMb2RTY2FsZXMgPSBuZXcgRmxvYXQzMkFycmF5KHJlc3BvbnNlLCBvZmZzZXQsIG51bVN0b3JlZExvZHMpOwogICAgICBvZmZzZXQgKz0gNCAqIG51bVN0b3JlZExvZHM7CiAgICAgIGNvbnZlcnRFbmRpYW4zMihzdG9yZWRMb2RTY2FsZXMsIEVuZGlhbm5lc3MuTElUVExFKTsKICAgICAgY29uc3QgdmVydGV4T2Zmc2V0cyA9IG5ldyBGbG9hdDMyQXJyYXkocmVzcG9uc2UsIG9mZnNldCwgbnVtU3RvcmVkTG9kcyAqIDMpOwogICAgICBjb252ZXJ0RW5kaWFuMzIodmVydGV4T2Zmc2V0cywgRW5kaWFubmVzcy5MSVRUTEUpOwogICAgICBvZmZzZXQgKz0gMTIgKiBudW1TdG9yZWRMb2RzOwogICAgICBjb25zdCBudW1GcmFnbWVudHNQZXJMb2QgPSBuZXcgVWludDMyQXJyYXkocmVzcG9uc2UsIG9mZnNldCwgbnVtU3RvcmVkTG9kcyk7CiAgICAgIG9mZnNldCArPSA0ICogbnVtU3RvcmVkTG9kczsKICAgICAgY29udmVydEVuZGlhbjMyKG51bUZyYWdtZW50c1BlckxvZCwgRW5kaWFubmVzcy5MSVRUTEUpOwogICAgICBjb25zdCB0b3RhbEZyYWdtZW50cyA9IG51bUZyYWdtZW50c1BlckxvZC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKTsKICAgICAgaWYgKHJlc3BvbnNlLmJ5dGVMZW5ndGggIT09IG9mZnNldCArIDE2ICogdG90YWxGcmFnbWVudHMpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5kZXggZmlsZSBzaXplIGZvciAke251bVN0b3JlZExvZHN9IGxvZHMgYW5kICR7dG90YWxGcmFnbWVudHN9IHRvdGFsIGZyYWdtZW50czogJHtyZXNwb25zZS5ieXRlTGVuZ3RofWApOwogICAgICB9CiAgICAgIGNvbnN0IGZyYWdtZW50SW5mbyA9IG5ldyBVaW50MzJBcnJheShyZXNwb25zZSwgb2Zmc2V0KTsKICAgICAgY29udmVydEVuZGlhbjMyKGZyYWdtZW50SW5mbywgRW5kaWFubmVzcy5MSVRUTEUpOwogICAgICBjb25zdCBjbGlwTG93ZXJCb3VuZCA9IHZlYzNfZXhwb3J0cy5mcm9tVmFsdWVzKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpOwogICAgICBjb25zdCBjbGlwVXBwZXJCb3VuZCA9IHZlYzNfZXhwb3J0cy5mcm9tVmFsdWVzKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSwgTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpOwogICAgICBsZXQgbnVtTG9kcyA9IE1hdGgubWF4KDEsIHN0b3JlZExvZFNjYWxlcy5sZW5ndGgpOwogICAgICB7CiAgICAgICAgbGV0IGZyYWdtZW50QmFzZSA9IDA7CiAgICAgICAgZm9yIChsZXQgbG9kSW5kZXggPSAwOyBsb2RJbmRleCA8IG51bVN0b3JlZExvZHM7ICsrbG9kSW5kZXgpIHsKICAgICAgICAgIGNvbnN0IG51bUZyYWdtZW50cyA9IG51bUZyYWdtZW50c1BlckxvZFtsb2RJbmRleF07CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgICAgICBsZXQgdXBwZXJCb3VuZFZhbHVlID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgICAgICAgICBsZXQgbG93ZXJCb3VuZFZhbHVlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICAgICAgICBjb25zdCBiYXNlID0gZnJhZ21lbnRCYXNlICsgbnVtRnJhZ21lbnRzICogaTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1GcmFnbWVudHM7ICsraikgewogICAgICAgICAgICAgIGNvbnN0IHYgPSBmcmFnbWVudEluZm9bYmFzZSArIGpdOwogICAgICAgICAgICAgIHVwcGVyQm91bmRWYWx1ZSA9IE1hdGgubWF4KHVwcGVyQm91bmRWYWx1ZSwgdik7CiAgICAgICAgICAgICAgbG93ZXJCb3VuZFZhbHVlID0gTWF0aC5taW4obG93ZXJCb3VuZFZhbHVlLCB2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobnVtRnJhZ21lbnRzICE9IDApIHsKICAgICAgICAgICAgICB3aGlsZSAodXBwZXJCb3VuZFZhbHVlID4+PiBudW1Mb2RzIC0gbG9kSW5kZXggLSAxICE9IGxvd2VyQm91bmRWYWx1ZSA+Pj4gbnVtTG9kcyAtIGxvZEluZGV4IC0gMSkgewogICAgICAgICAgICAgICAgKytudW1Mb2RzOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobG9kSW5kZXggPT09IDApIHsKICAgICAgICAgICAgICAgIGNsaXBMb3dlckJvdW5kW2ldID0gTWF0aC5taW4oY2xpcExvd2VyQm91bmRbaV0sICgxIDw8IGxvZEluZGV4KSAqIGxvd2VyQm91bmRWYWx1ZSk7CiAgICAgICAgICAgICAgICBjbGlwVXBwZXJCb3VuZFtpXSA9IE1hdGgubWF4KGNsaXBVcHBlckJvdW5kW2ldLCAoMSA8PCBsb2RJbmRleCkgKiAodXBwZXJCb3VuZFZhbHVlICsgMSkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnJhZ21lbnRCYXNlICs9IG51bUZyYWdtZW50cyAqIDQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCBtYXhGcmFnbWVudHMgPSAwOwogICAgICB7CiAgICAgICAgbGV0IHByZXZOdW1GcmFnbWVudHMgPSAwOwogICAgICAgIGxldCBwcmV2TG9kSW5kZXggPSAwOwogICAgICAgIGZvciAobGV0IGxvZEluZGV4ID0gMDsgbG9kSW5kZXggPCBudW1TdG9yZWRMb2RzOyArK2xvZEluZGV4KSB7CiAgICAgICAgICBjb25zdCBudW1GcmFnbWVudHMgPSBudW1GcmFnbWVudHNQZXJMb2RbbG9kSW5kZXhdOwogICAgICAgICAgbWF4RnJhZ21lbnRzICs9IHByZXZOdW1GcmFnbWVudHMgKiAobG9kSW5kZXggLSBwcmV2TG9kSW5kZXgpOwogICAgICAgICAgcHJldkxvZEluZGV4ID0gbG9kSW5kZXg7CiAgICAgICAgICBwcmV2TnVtRnJhZ21lbnRzID0gbnVtRnJhZ21lbnRzOwogICAgICAgICAgbWF4RnJhZ21lbnRzICs9IG51bUZyYWdtZW50czsKICAgICAgICB9CiAgICAgICAgbWF4RnJhZ21lbnRzICs9IChudW1Mb2RzIC0gMSAtIHByZXZMb2RJbmRleCkgKiBwcmV2TnVtRnJhZ21lbnRzOwogICAgICB9CiAgICAgIGNvbnN0IG9jdHJlZVRlbXAgPSBuZXcgVWludDMyQXJyYXkoNSAqIG1heEZyYWdtZW50cyk7CiAgICAgIGNvbnN0IG9mZnNldHNUZW1wID0gbmV3IEZsb2F0NjRBcnJheShtYXhGcmFnbWVudHMgKyAxKTsKICAgICAgbGV0IG9jdHJlZTsKICAgICAgewogICAgICAgIGxldCBwcmlvclN0YXJ0ID0gMDsKICAgICAgICBsZXQgYmFzZVJvdyA9IDA7CiAgICAgICAgbGV0IGRhdGFPZmZzZXQgPSAwOwogICAgICAgIGxldCBmcmFnbWVudEJhc2UgPSAwOwogICAgICAgIGZvciAobGV0IGxvZEluZGV4ID0gMDsgbG9kSW5kZXggPCBudW1TdG9yZWRMb2RzOyArK2xvZEluZGV4KSB7CiAgICAgICAgICBjb25zdCBudW1GcmFnbWVudHMgPSBudW1GcmFnbWVudHNQZXJMb2RbbG9kSW5kZXhdOwogICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1GcmFnbWVudHM7ICsraikgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgICAgICAgIG9jdHJlZVRlbXBbNSAqIChiYXNlUm93ICsgaikgKyBpXSA9IGZyYWdtZW50SW5mb1tmcmFnbWVudEJhc2UgKyBqICsgaSAqIG51bUZyYWdtZW50c107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZGF0YVNpemUgPSBmcmFnbWVudEluZm9bZnJhZ21lbnRCYXNlICsgaiArIDMgKiBudW1GcmFnbWVudHNdOwogICAgICAgICAgICBkYXRhT2Zmc2V0ICs9IGRhdGFTaXplOwogICAgICAgICAgICBvZmZzZXRzVGVtcFtiYXNlUm93ICsgaiArIDFdID0gZGF0YU9mZnNldDsKICAgICAgICAgICAgaWYgKGRhdGFTaXplID09PSAwKSB7CiAgICAgICAgICAgICAgb2N0cmVlVGVtcFs1ICogKGJhc2VSb3cgKyBqKSArIDRdID0gMjE0NzQ4MzY0ODsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnJhZ21lbnRCYXNlICs9IDQgKiBudW1GcmFnbWVudHM7CiAgICAgICAgICBpZiAobG9kSW5kZXggIT09IDApIHsKICAgICAgICAgICAgY29tcHV0ZU9jdHJlZUNoaWxkT2Zmc2V0cyhvY3RyZWVUZW1wLCBwcmlvclN0YXJ0LCBiYXNlUm93LCBiYXNlUm93ICsgbnVtRnJhZ21lbnRzKTsKICAgICAgICAgIH0KICAgICAgICAgIHByaW9yU3RhcnQgPSBiYXNlUm93OwogICAgICAgICAgYmFzZVJvdyArPSBudW1GcmFnbWVudHM7CiAgICAgICAgICB3aGlsZSAobG9kSW5kZXggKyAxIDwgbnVtTG9kcyAmJiAobG9kSW5kZXggKyAxID49IHN0b3JlZExvZFNjYWxlcy5sZW5ndGggfHwgc3RvcmVkTG9kU2NhbGVzW2xvZEluZGV4ICsgMV0gPT09IDApKSB7CiAgICAgICAgICAgIGNvbnN0IGN1ckVuZCA9IGdlbmVyYXRlSGlnaGVyT2N0cmVlTGV2ZWwob2N0cmVlVGVtcCwgcHJpb3JTdGFydCwgYmFzZVJvdyk7CiAgICAgICAgICAgIG9mZnNldHNUZW1wLmZpbGwoZGF0YU9mZnNldCwgYmFzZVJvdyArIDEsIGN1ckVuZCArIDEpOwogICAgICAgICAgICBwcmlvclN0YXJ0ID0gYmFzZVJvdzsKICAgICAgICAgICAgYmFzZVJvdyA9IGN1ckVuZDsKICAgICAgICAgICAgKytsb2RJbmRleDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb2N0cmVlID0gb2N0cmVlVGVtcC5zbGljZSgwLCA1ICogYmFzZVJvdyk7CiAgICAgICAgY2h1bmsub2Zmc2V0cyA9IG9mZnNldHNUZW1wLnNsaWNlKDAsIGJhc2VSb3cgKyAxKTsKICAgICAgfQogICAgICBjb25zdCBzb3VyY2UgPSBjaHVuay5zb3VyY2U7CiAgICAgIGNvbnN0IHsgbG9kU2NhbGVNdWx0aXBsaWVyIH0gPSBzb3VyY2UucGFyYW1ldGVycy5tZXRhZGF0YTsKICAgICAgY29uc3QgbG9kU2NhbGVzID0gbmV3IEZsb2F0MzJBcnJheShudW1Mb2RzKTsKICAgICAgbG9kU2NhbGVzLnNldChzdG9yZWRMb2RTY2FsZXMsIDApOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0b3JlZExvZFNjYWxlcy5sZW5ndGg7ICsraSkgewogICAgICAgIGxvZFNjYWxlc1tpXSAqPSBsb2RTY2FsZU11bHRpcGxpZXI7CiAgICAgIH0KICAgICAgY2h1bmsubWFuaWZlc3QgPSB7CiAgICAgICAgY2h1bmtTaGFwZSwKICAgICAgICBjaHVua0dyaWRTcGF0aWFsT3JpZ2luOiBncmlkT3JpZ2luLAogICAgICAgIGNsaXBMb3dlckJvdW5kOiB2ZWMzX2V4cG9ydHMuYWRkKGNsaXBMb3dlckJvdW5kLCBncmlkT3JpZ2luLCB2ZWMzX2V4cG9ydHMubXVsdGlwbHkoY2xpcExvd2VyQm91bmQsIGNsaXBMb3dlckJvdW5kLCBjaHVua1NoYXBlKSksCiAgICAgICAgY2xpcFVwcGVyQm91bmQ6IHZlYzNfZXhwb3J0cy5hZGQoY2xpcFVwcGVyQm91bmQsIGdyaWRPcmlnaW4sIHZlYzNfZXhwb3J0cy5tdWx0aXBseShjbGlwVXBwZXJCb3VuZCwgY2xpcFVwcGVyQm91bmQsIGNodW5rU2hhcGUpKSwKICAgICAgICBvY3RyZWUsCiAgICAgICAgbG9kU2NhbGVzLAogICAgICAgIHZlcnRleE9mZnNldHMKICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGRlY29kZU11bHRpc2NhbGVGcmFnbWVudENodW5rKGNodW5rLCByZXNwb25zZSkgewogICAgICBjb25zdCB7IGxvZCB9ID0gY2h1bms7CiAgICAgIGNvbnN0IHNvdXJjZSA9IGNodW5rLm1hbmlmZXN0Q2h1bmsuc291cmNlOwogICAgICBjb25zdCBtID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9kcmFjbygpLCBkcmFjb19leHBvcnRzKSk7CiAgICAgIGNvbnN0IHJhd01lc2ggPSBhd2FpdCBtLmRlY29kZURyYWNvUGFydGl0aW9uZWQobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpLCBzb3VyY2UucGFyYW1ldGVycy5tZXRhZGF0YS52ZXJ0ZXhRdWFudGl6YXRpb25CaXRzLCBsb2QgIT09IDApOwogICAgICBhc3NpZ25NdWx0aXNjYWxlTWVzaEZyYWdtZW50RGF0YShjaHVuaywgcmF3TWVzaCwgc291cmNlLmZvcm1hdC52ZXJ0ZXhQb3NpdGlvbkZvcm1hdCk7CiAgICB9CiAgICB2YXIgUHJlY29tcHV0ZWRNdWx0aXNjYWxlTWVzaFNvdXJjZSA9IGNsYXNzIGV4dGVuZHMgV2l0aFBhcmFtZXRlcnMoV2l0aFNoYXJlZENyZWRlbnRpYWxzUHJvdmlkZXJDb3VudGVycGFydCgpKE11bHRpc2NhbGVNZXNoU291cmNlKSwgTXVsdGlzY2FsZU1lc2hTb3VyY2VQYXJhbWV0ZXJzMikgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMubWluaXNoYXJkSW5kZXhTb3VyY2UgPSBnZXRNaW5pc2hhcmRJbmRleERhdGFTb3VyY2UodGhpcy5jaHVua01hbmFnZXIsIHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgeyB1cmw6IHRoaXMucGFyYW1ldGVycy51cmwsIHNoYXJkaW5nOiB0aGlzLnBhcmFtZXRlcnMubWV0YWRhdGEuc2hhcmRpbmcgfSk7CiAgICAgIH0KICAgICAgYXN5bmMgZG93bmxvYWQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzLCBtaW5pc2hhcmRJbmRleFNvdXJjZSB9ID0gdGhpczsKICAgICAgICBsZXQgZGF0YTsKICAgICAgICBpZiAobWluaXNoYXJkSW5kZXhTb3VyY2UgPT09IHZvaWQgMCkgewogICAgICAgICAgZGF0YSA9IGF3YWl0IGNhbmNlbGxhYmxlRmV0Y2hTcGVjaWFsT2sodGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCBgJHtwYXJhbWV0ZXJzLnVybH0vJHtjaHVuay5vYmplY3RJZH0uaW5kZXhgLCB7fSwgcmVzcG9uc2VBcnJheUJ1ZmZlciwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAoeyBkYXRhLCBzaGFyZEluZm86IGNodW5rLnNoYXJkSW5mbyB9ID0gZ2V0T3JOb3RGb3VuZEVycm9yKGF3YWl0IGdldFNoYXJkZWREYXRhKG1pbmlzaGFyZEluZGV4U291cmNlLCBjaHVuaywgY2h1bmsub2JqZWN0SWQsIGNhbmNlbGxhdGlvblRva2VuKSkpOwogICAgICAgIH0KICAgICAgICBkZWNvZGVNdWx0aXNjYWxlTWFuaWZlc3RDaHVuazIoY2h1bmssIGRhdGEpOwogICAgICB9CiAgICAgIGFzeW5jIGRvd25sb2FkRnJhZ21lbnQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGNvbnN0IG1hbmlmZXN0Q2h1bmsgPSBjaHVuay5tYW5pZmVzdENodW5rOwogICAgICAgIGNvbnN0IGNodW5rSW5kZXggPSBjaHVuay5jaHVua0luZGV4OwogICAgICAgIGNvbnN0IHsgc2hhcmRJbmZvLCBvZmZzZXRzIH0gPSBtYW5pZmVzdENodW5rOwogICAgICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0c1tjaHVua0luZGV4XTsKICAgICAgICBjb25zdCBlbmRPZmZzZXQgPSBvZmZzZXRzW2NodW5rSW5kZXggKyAxXTsKICAgICAgICBsZXQgcmVxdWVzdFVybDsKICAgICAgICBsZXQgYWRqdXN0ZWRTdGFydE9mZnNldCwgYWRqdXN0ZWRFbmRPZmZzZXQ7CiAgICAgICAgaWYgKHNoYXJkSW5mbyAhPT0gdm9pZCAwKSB7CiAgICAgICAgICByZXF1ZXN0VXJsID0gc2hhcmRJbmZvLnNoYXJkVXJsOwogICAgICAgICAgY29uc3QgZnVsbERhdGFTaXplID0gb2Zmc2V0c1tvZmZzZXRzLmxlbmd0aCAtIDFdOwogICAgICAgICAgbGV0IHN0YXJ0TG93ID0gc2hhcmRJbmZvLm9mZnNldC5sb3cgLSBmdWxsRGF0YVNpemUgKyBzdGFydE9mZnNldDsKICAgICAgICAgIGxldCBzdGFydEhpZ2ggPSBzaGFyZEluZm8ub2Zmc2V0LmhpZ2g7CiAgICAgICAgICBsZXQgZW5kTG93ID0gc3RhcnRMb3cgKyBlbmRPZmZzZXQgLSBzdGFydE9mZnNldDsKICAgICAgICAgIGxldCBlbmRIaWdoID0gc3RhcnRIaWdoOwogICAgICAgICAgd2hpbGUgKHN0YXJ0TG93IDwgMCkgewogICAgICAgICAgICBzdGFydExvdyArPSA0Mjk0OTY3Mjk2OwogICAgICAgICAgICBzdGFydEhpZ2ggLT0gMTsKICAgICAgICAgIH0KICAgICAgICAgIHdoaWxlIChlbmRMb3cgPCAwKSB7CiAgICAgICAgICAgIGVuZExvdyArPSA0Mjk0OTY3Mjk2OwogICAgICAgICAgICBlbmRIaWdoIC09IDE7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoZW5kTG93ID4gNDI5NDk2NzI5NikgewogICAgICAgICAgICBlbmRMb3cgLT0gNDI5NDk2NzI5NjsKICAgICAgICAgICAgZW5kSGlnaCArPSAxOwogICAgICAgICAgfQogICAgICAgICAgYWRqdXN0ZWRTdGFydE9mZnNldCA9IG5ldyBVaW50NjQoc3RhcnRMb3csIHN0YXJ0SGlnaCk7CiAgICAgICAgICBhZGp1c3RlZEVuZE9mZnNldCA9IG5ldyBVaW50NjQoZW5kTG93LCBlbmRIaWdoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVxdWVzdFVybCA9IGAke3BhcmFtZXRlcnMudXJsfS8ke21hbmlmZXN0Q2h1bmsub2JqZWN0SWR9YDsKICAgICAgICAgIGFkanVzdGVkU3RhcnRPZmZzZXQgPSBzdGFydE9mZnNldDsKICAgICAgICAgIGFkanVzdGVkRW5kT2Zmc2V0ID0gZW5kT2Zmc2V0OwogICAgICAgIH0KICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoU3BlY2lhbEh0dHBCeXRlUmFuZ2UodGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCByZXF1ZXN0VXJsLCBhZGp1c3RlZFN0YXJ0T2Zmc2V0LCBhZGp1c3RlZEVuZE9mZnNldCwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgIGF3YWl0IGRlY29kZU11bHRpc2NhbGVGcmFnbWVudENodW5rKGNodW5rLCByZXNwb25zZSk7CiAgICAgIH0KICAgIH07CiAgICBQcmVjb21wdXRlZE11bHRpc2NhbGVNZXNoU291cmNlID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoKQogICAgXSwgUHJlY29tcHV0ZWRNdWx0aXNjYWxlTWVzaFNvdXJjZSk7CiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaEJ5VWludDY0KGNyZWRlbnRpYWxzUHJvdmlkZXIsIHVybCwgY2h1bmssIG1pbmlzaGFyZEluZGV4U291cmNlLCBpZCwgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgaWYgKG1pbmlzaGFyZEluZGV4U291cmNlID09PSB2b2lkIDApIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIGF3YWl0IGNhbmNlbGxhYmxlRmV0Y2hTcGVjaWFsT2soY3JlZGVudGlhbHNQcm92aWRlciwgYCR7dXJsfS8ke2lkfWAsIHt9LCByZXNwb25zZUFycmF5QnVmZmVyLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgaWYgKGlzTm90Rm91bmRFcnJvcihlKSkKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFNoYXJkZWREYXRhKG1pbmlzaGFyZEluZGV4U291cmNlLCBjaHVuaywgaWQsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIHJldHVybiByZXN1bHQuZGF0YTsKICAgIH0KICAgIHZhciBQcmVjb21wdXRlZFNrZWxldG9uU291cmNlID0gY2xhc3MgZXh0ZW5kcyBXaXRoUGFyYW1ldGVycyhXaXRoU2hhcmVkQ3JlZGVudGlhbHNQcm92aWRlckNvdW50ZXJwYXJ0KCkoU2tlbGV0b25Tb3VyY2UpLCBTa2VsZXRvblNvdXJjZVBhcmFtZXRlcnMzKSB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5taW5pc2hhcmRJbmRleFNvdXJjZSA9IGdldE1pbmlzaGFyZEluZGV4RGF0YVNvdXJjZSh0aGlzLmNodW5rTWFuYWdlciwgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCB7IHVybDogdGhpcy5wYXJhbWV0ZXJzLnVybCwgc2hhcmRpbmc6IHRoaXMucGFyYW1ldGVycy5tZXRhZGF0YS5zaGFyZGluZyB9KTsKICAgICAgfQogICAgICBhc3luYyBkb3dubG9hZChjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICBjb25zdCB7IHBhcmFtZXRlcnMgfSA9IHRoaXM7CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBnZXRPck5vdEZvdW5kRXJyb3IoYXdhaXQgZmV0Y2hCeVVpbnQ2NCh0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIsIHBhcmFtZXRlcnMudXJsLCBjaHVuaywgdGhpcy5taW5pc2hhcmRJbmRleFNvdXJjZSwgY2h1bmsub2JqZWN0SWQsIGNhbmNlbGxhdGlvblRva2VuKSk7CiAgICAgICAgZGVjb2RlU2tlbGV0b25DaHVuazIoY2h1bmssIHJlc3BvbnNlLCBwYXJhbWV0ZXJzLm1ldGFkYXRhLnZlcnRleEF0dHJpYnV0ZXMpOwogICAgICB9CiAgICB9OwogICAgUHJlY29tcHV0ZWRTa2VsZXRvblNvdXJjZSA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KCkKICAgIF0sIFByZWNvbXB1dGVkU2tlbGV0b25Tb3VyY2UpOwogICAgZnVuY3Rpb24gcGFyc2VBbm5vdGF0aW9uczQoYnVmZmVyLCBwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNlcmlhbGl6ZXIpIHsKICAgICAgY29uc3QgZHYgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTsKICAgICAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoIDw9IDgpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBhdCBsZWFzdCA4IGJ5dGVzIik7CiAgICAgIGNvbnN0IGNvdW50TG93ID0gZHYuZ2V0VWludDMyKDAsIHRydWUpOwogICAgICBjb25zdCBjb3VudEhpZ2ggPSBkdi5nZXRVaW50MzIoNCwgdHJ1ZSk7CiAgICAgIGlmIChjb3VudEhpZ2ggIT09IDApCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbm5vdGF0aW9uIGNvdW50IHRvbyBoaWdoIik7CiAgICAgIGNvbnN0IG51bUJ5dGVzID0gcHJvcGVydHlTZXJpYWxpemVyLnNlcmlhbGl6ZWRCeXRlczsKICAgICAgY29uc3QgZXhwZWN0ZWRCeXRlcyA9IDggKyAobnVtQnl0ZXMgKyA4KSAqIGNvdW50TG93OwogICAgICBpZiAoYnVmZmVyLmJ5dGVMZW5ndGggIT09IGV4cGVjdGVkQnl0ZXMpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWRCeXRlc30gYnl0ZXMsIGJ1dCByZWNlaXZlZDogJHtidWZmZXIuYnl0ZUxlbmd0aH0gYnl0ZXNgKTsKICAgICAgfQogICAgICBjb25zdCBpZE9mZnNldCA9IDggKyBudW1CeXRlcyAqIGNvdW50TG93OwogICAgICBjb25zdCBpZCA9IG5ldyBVaW50NjQoKTsKICAgICAgY29uc3QgaWRzID0gbmV3IEFycmF5KGNvdW50TG93KTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudExvdzsgKytpKSB7CiAgICAgICAgaWQubG93ID0gZHYuZ2V0VWludDMyKGlkT2Zmc2V0ICsgaSAqIDgsIHRydWUpOwogICAgICAgIGlkLmhpZ2ggPSBkdi5nZXRVaW50MzIoaWRPZmZzZXQgKyBpICogOCArIDQsIHRydWUpOwogICAgICAgIGlkc1tpXSA9IGlkLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgY29uc3QgZ2VvbWV0cnlEYXRhID0gbmV3IEFubm90YXRpb25HZW9tZXRyeURhdGEoKTsKICAgICAgY29uc3Qgb3JpZ0RhdGEgPSBuZXcgVWludDhBcnJheShidWZmZXIsIDgsIG51bUJ5dGVzICogY291bnRMb3cpOwogICAgICBsZXQgZGF0YTsKICAgICAgY29uc3QgeyBwcm9wZXJ0eUdyb3VwQnl0ZXMgfSA9IHByb3BlcnR5U2VyaWFsaXplcjsKICAgICAgaWYgKHByb3BlcnR5R3JvdXBCeXRlcy5sZW5ndGggPiAxKSB7CiAgICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KG9yaWdEYXRhLmxlbmd0aCk7CiAgICAgICAgbGV0IG9yaWdPZmZzZXQgPSAwOwogICAgICAgIGxldCBncm91cE9mZnNldCA9IDA7CiAgICAgICAgZm9yIChsZXQgZ3JvdXBJbmRleCA9IDA7IGdyb3VwSW5kZXggPCBwcm9wZXJ0eUdyb3VwQnl0ZXMubGVuZ3RoOyArK2dyb3VwSW5kZXgpIHsKICAgICAgICAgIGNvbnN0IGdyb3VwQnl0ZXNQZXJBbm5vdGF0aW9uID0gcHJvcGVydHlHcm91cEJ5dGVzW2dyb3VwSW5kZXhdOwogICAgICAgICAgZm9yIChsZXQgYW5ub3RhdGlvbkluZGV4ID0gMDsgYW5ub3RhdGlvbkluZGV4IDwgY291bnRMb3c7ICsrYW5ub3RhdGlvbkluZGV4KSB7CiAgICAgICAgICAgIGxldCBvcmlnQmFzZSA9IG9yaWdPZmZzZXQgKyBhbm5vdGF0aW9uSW5kZXggKiBudW1CeXRlczsKICAgICAgICAgICAgbGV0IG5ld0Jhc2UgPSBncm91cE9mZnNldCArIGFubm90YXRpb25JbmRleCAqIGdyb3VwQnl0ZXNQZXJBbm5vdGF0aW9uOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwQnl0ZXNQZXJBbm5vdGF0aW9uOyArK2kpIHsKICAgICAgICAgICAgICBkYXRhW25ld0Jhc2UgKyBpXSA9IG9yaWdEYXRhW29yaWdCYXNlICsgaV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG9yaWdPZmZzZXQgKz0gZ3JvdXBCeXRlc1BlckFubm90YXRpb247CiAgICAgICAgICBncm91cE9mZnNldCArPSBncm91cEJ5dGVzUGVyQW5ub3RhdGlvbiAqIGNvdW50TG93OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBkYXRhID0gb3JpZ0RhdGE7CiAgICAgIH0KICAgICAgZ2VvbWV0cnlEYXRhLmRhdGEgPSBkYXRhOwogICAgICBjb25zdCB0eXBlVG9PZmZzZXQgPSBnZW9tZXRyeURhdGEudHlwZVRvT2Zmc2V0ID0gbmV3IEFycmF5KGFubm90YXRpb25UeXBlcy5sZW5ndGgpOwogICAgICB0eXBlVG9PZmZzZXQuZmlsbCgwKTsKICAgICAgdHlwZVRvT2Zmc2V0W3BhcmFtZXRlcnMudHlwZV0gPSAwOwogICAgICBjb25zdCB0eXBlVG9JZHMgPSBnZW9tZXRyeURhdGEudHlwZVRvSWRzID0gbmV3IEFycmF5KGFubm90YXRpb25UeXBlcy5sZW5ndGgpOwogICAgICBjb25zdCB0eXBlVG9JZE1hcHMgPSBnZW9tZXRyeURhdGEudHlwZVRvSWRNYXBzID0gbmV3IEFycmF5KGFubm90YXRpb25UeXBlcy5sZW5ndGgpOwogICAgICB0eXBlVG9JZHMuZmlsbChbXSk7CiAgICAgIHR5cGVUb0lkc1twYXJhbWV0ZXJzLnR5cGVdID0gaWRzOwogICAgICB0eXBlVG9JZE1hcHMuZmlsbChuZXcgTWFwKCkpOwogICAgICB0eXBlVG9JZE1hcHNbcGFyYW1ldGVycy50eXBlXSA9IG5ldyBNYXAoaWRzLm1hcCgoaWQyLCBpKSA9PiBbaWQyLCBpXSkpOwogICAgICByZXR1cm4gZ2VvbWV0cnlEYXRhOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VTaW5nbGVBbm5vdGF0aW9uKGJ1ZmZlciwgcGFyYW1ldGVycywgcHJvcGVydHlTZXJpYWxpemVyLCBpZCkgewogICAgICBjb25zdCBoYW5kbGVyID0gYW5ub3RhdGlvblR5cGVIYW5kbGVyc1twYXJhbWV0ZXJzLnR5cGVdOwogICAgICBjb25zdCBiYXNlTnVtQnl0ZXMgPSBwcm9wZXJ0eVNlcmlhbGl6ZXIuc2VyaWFsaXplZEJ5dGVzOwogICAgICBjb25zdCBudW1SZWxhdGlvbnNoaXBzID0gcGFyYW1ldGVycy5yZWxhdGlvbnNoaXBzLmxlbmd0aDsKICAgICAgY29uc3QgbWluTnVtQnl0ZXMgPSBiYXNlTnVtQnl0ZXMgKyA0ICogbnVtUmVsYXRpb25zaGlwczsKICAgICAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoIDwgbWluTnVtQnl0ZXMpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0ICR7bWluTnVtQnl0ZXN9IGJ5dGVzLCBidXQgcmVjZWl2ZWQ6ICR7YnVmZmVyLmJ5dGVMZW5ndGh9YCk7CiAgICAgIH0KICAgICAgY29uc3QgZHYgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTsKICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IGhhbmRsZXIuZGVzZXJpYWxpemUoZHYsIDAsIHRydWUsIHBhcmFtZXRlcnMucmFuaywgaWQpOwogICAgICBwcm9wZXJ0eVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZHYsIDAsIDAsIDEsIHRydWUsIGFubm90YXRpb24ucHJvcGVydGllcyA9IG5ldyBBcnJheShwYXJhbWV0ZXJzLnByb3BlcnRpZXMubGVuZ3RoKSk7CiAgICAgIGxldCBvZmZzZXQgPSBiYXNlTnVtQnl0ZXM7CiAgICAgIGNvbnN0IHJlbGF0ZWRTZWdtZW50cyA9IGFubm90YXRpb24ucmVsYXRlZFNlZ21lbnRzID0gW107CiAgICAgIHJlbGF0ZWRTZWdtZW50cy5sZW5ndGggPSBudW1SZWxhdGlvbnNoaXBzOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVJlbGF0aW9uc2hpcHM7ICsraSkgewogICAgICAgIGNvbnN0IGNvdW50ID0gZHYuZ2V0VWludDMyKG9mZnNldCwgdHJ1ZSk7CiAgICAgICAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoIDwgbWluTnVtQnl0ZXMgKyBjb3VudCAqIDgpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgJHttaW5OdW1CeXRlc30gYnl0ZXMsIGJ1dCByZWNlaXZlZDogJHtidWZmZXIuYnl0ZUxlbmd0aH1gKTsKICAgICAgICB9CiAgICAgICAgb2Zmc2V0ICs9IDQ7CiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSByZWxhdGVkU2VnbWVudHNbaV0gPSBbXTsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvdW50OyArK2opIHsKICAgICAgICAgIHNlZ21lbnRzW2pdID0gbmV3IFVpbnQ2NChkdi5nZXRVaW50MzIob2Zmc2V0LCB0cnVlKSwgZHYuZ2V0VWludDMyKG9mZnNldCArIDQsIHRydWUpKTsKICAgICAgICAgIG9mZnNldCArPSA4OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAob2Zmc2V0ICE9PSBidWZmZXIuYnl0ZUxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtvZmZzZXR9IGJ5dGVzLCBidXQgcmVjZWl2ZWQ6ICR7YnVmZmVyLmJ5dGVMZW5ndGh9YCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGFubm90YXRpb247CiAgICB9CiAgICB2YXIgUHJlY29tcHV0ZWRBbm5vdGF0aW9uU3BhdGlhbEluZGV4U291cmNlQmFja2VuZCA9IGNsYXNzIGV4dGVuZHMgV2l0aFBhcmFtZXRlcnMoV2l0aFNoYXJlZENyZWRlbnRpYWxzUHJvdmlkZXJDb3VudGVycGFydCgpKEFubm90YXRpb25HZW9tZXRyeUNodW5rU291cmNlQmFja2VuZCksIEFubm90YXRpb25TcGF0aWFsSW5kZXhTb3VyY2VQYXJhbWV0ZXJzMikgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMubWluaXNoYXJkSW5kZXhTb3VyY2UgPSBnZXRNaW5pc2hhcmRJbmRleERhdGFTb3VyY2UodGhpcy5jaHVua01hbmFnZXIsIHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgdGhpcy5wYXJhbWV0ZXJzKTsKICAgICAgfQogICAgICBhc3luYyBkb3dubG9hZChjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICBjb25zdCB7IHBhcmFtZXRlcnMgfSA9IHRoaXM7CiAgICAgICAgY29uc3QgeyBtaW5pc2hhcmRJbmRleFNvdXJjZSB9ID0gdGhpczsKICAgICAgICBjb25zdCB7IHBhcmVudCB9ID0gdGhpczsKICAgICAgICBsZXQgcmVzcG9uc2U7CiAgICAgICAgY29uc3QgeyBjaHVua0dyaWRQb3NpdGlvbiB9ID0gY2h1bms7CiAgICAgICAgaWYgKG1pbmlzaGFyZEluZGV4U291cmNlID09PSB2b2lkIDApIHsKICAgICAgICAgIGNvbnN0IHVybCA9IGAke3BhcmFtZXRlcnMudXJsfS8ke2NodW5rR3JpZFBvc2l0aW9uLmpvaW4oIl8iKX1gOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYW5jZWxsYWJsZUZldGNoU3BlY2lhbE9rKHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgdXJsLCB7fSwgcmVzcG9uc2VBcnJheUJ1ZmZlciwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBpZiAoIWlzTm90Rm91bmRFcnJvcihlKSkKICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCB7IHVwcGVyQ2h1bmtCb3VuZCB9ID0gdGhpcy5zcGVjOwogICAgICAgICAgY29uc3QgeyBjaHVua0dyaWRQb3NpdGlvbjogY2h1bmtHcmlkUG9zaXRpb24yIH0gPSBjaHVuazsKICAgICAgICAgIGNvbnN0IGNodW5rSW5kZXggPSBlbmNvZGVaSW5kZXhDb21wcmVzc2VkKG5ldyBVaW50NjQoKSwgY2h1bmtHcmlkUG9zaXRpb24yLCB1cHBlckNodW5rQm91bmQpOwogICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U2hhcmRlZERhdGEobWluaXNoYXJkSW5kZXhTb3VyY2UsIGNodW5rLCBjaHVua0luZGV4LCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApCiAgICAgICAgICAgIHJlc3BvbnNlID0gcmVzdWx0LmRhdGE7CiAgICAgICAgfQogICAgICAgIGlmIChyZXNwb25zZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICBjaHVuay5kYXRhID0gcGFyc2VBbm5vdGF0aW9uczQocmVzcG9uc2UsIHBhcmVudC5wYXJhbWV0ZXJzLCBwYXJlbnQuYW5ub3RhdGlvblByb3BlcnR5U2VyaWFsaXplcik7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgUHJlY29tcHV0ZWRBbm5vdGF0aW9uU3BhdGlhbEluZGV4U291cmNlQmFja2VuZCA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KCkKICAgIF0sIFByZWNvbXB1dGVkQW5ub3RhdGlvblNwYXRpYWxJbmRleFNvdXJjZUJhY2tlbmQpOwogICAgdmFyIFByZWNvbXB1dGVkQW5ub3RhdGlvblNvdXJjZUJhY2tlbmQgPSBjbGFzcyBleHRlbmRzIFdpdGhQYXJhbWV0ZXJzKFdpdGhTaGFyZWRDcmVkZW50aWFsc1Byb3ZpZGVyQ291bnRlcnBhcnQoKShBbm5vdGF0aW9uU291cmNlMiksIEFubm90YXRpb25Tb3VyY2VQYXJhbWV0ZXJzNCkgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMuYnlJZE1pbmlzaGFyZEluZGV4U291cmNlID0gZ2V0TWluaXNoYXJkSW5kZXhEYXRhU291cmNlKHRoaXMuY2h1bmtNYW5hZ2VyLCB0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIsIHRoaXMucGFyYW1ldGVycy5ieUlkKTsKICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcEluZGV4U291cmNlID0gdGhpcy5wYXJhbWV0ZXJzLnJlbGF0aW9uc2hpcHMubWFwKCh4KSA9PiBnZXRNaW5pc2hhcmRJbmRleERhdGFTb3VyY2UodGhpcy5jaHVua01hbmFnZXIsIHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgeCkpOwogICAgICAgIHRoaXMuYW5ub3RhdGlvblByb3BlcnR5U2VyaWFsaXplciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlTZXJpYWxpemVyKHRoaXMucGFyYW1ldGVycy5yYW5rLCBhbm5vdGF0aW9uVHlwZUhhbmRsZXJzW3RoaXMucGFyYW1ldGVycy50eXBlXS5zZXJpYWxpemVkQnl0ZXModGhpcy5wYXJhbWV0ZXJzLnJhbmspLCB0aGlzLnBhcmFtZXRlcnMucHJvcGVydGllcyk7CiAgICAgIH0KICAgICAgYXN5bmMgZG93bmxvYWRTZWdtZW50RmlsdGVyZWRHZW9tZXRyeShjaHVuaywgcmVsYXRpb25zaGlwSW5kZXgsIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hCeVVpbnQ2NCh0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIsIHBhcmFtZXRlcnMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBJbmRleF0udXJsLCBjaHVuaywgdGhpcy5yZWxhdGlvbnNoaXBJbmRleFNvdXJjZVtyZWxhdGlvbnNoaXBJbmRleF0sIGNodW5rLm9iamVjdElkLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgaWYgKHJlc3BvbnNlICE9PSB2b2lkIDApIHsKICAgICAgICAgIGNodW5rLmRhdGEgPSBwYXJzZUFubm90YXRpb25zNChyZXNwb25zZSwgdGhpcy5wYXJhbWV0ZXJzLCB0aGlzLmFubm90YXRpb25Qcm9wZXJ0eVNlcmlhbGl6ZXIpOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyBkb3dubG9hZE1ldGFkYXRhKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyB9ID0gdGhpczsKICAgICAgICBjb25zdCBpZCA9IFVpbnQ2NC5wYXJzZVN0cmluZyhjaHVuay5rZXkpOwogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hCeVVpbnQ2NCh0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIsIHBhcmFtZXRlcnMuYnlJZC51cmwsIGNodW5rLCB0aGlzLmJ5SWRNaW5pc2hhcmRJbmRleFNvdXJjZSwgaWQsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgICBpZiAocmVzcG9uc2UgPT09IHZvaWQgMCkgewogICAgICAgICAgY2h1bmsuYW5ub3RhdGlvbiA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNodW5rLmFubm90YXRpb24gPSBwYXJzZVNpbmdsZUFubm90YXRpb24ocmVzcG9uc2UsIHRoaXMucGFyYW1ldGVycywgdGhpcy5hbm5vdGF0aW9uUHJvcGVydHlTZXJpYWxpemVyLCBjaHVuay5rZXkpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIFByZWNvbXB1dGVkQW5ub3RhdGlvblNvdXJjZUJhY2tlbmQgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdCgpCiAgICBdLCBQcmVjb21wdXRlZEFubm90YXRpb25Tb3VyY2VCYWNrZW5kKTsKICAgIHZhciBQcmVjb21wdXRlZEluZGV4ZWRTZWdtZW50UHJvcGVydHlTb3VyY2VCYWNrZW5kID0gY2xhc3MgZXh0ZW5kcyBXaXRoUGFyYW1ldGVycyhXaXRoU2hhcmVkQ3JlZGVudGlhbHNQcm92aWRlckNvdW50ZXJwYXJ0KCkoSW5kZXhlZFNlZ21lbnRQcm9wZXJ0eVNvdXJjZUJhY2tlbmQpLCBJbmRleGVkU2VnbWVudFByb3BlcnR5U291cmNlUGFyYW1ldGVycykgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgIHRoaXMubWluaXNoYXJkSW5kZXhTb3VyY2UgPSBnZXRNaW5pc2hhcmRJbmRleERhdGFTb3VyY2UodGhpcy5jaHVua01hbmFnZXIsIHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgdGhpcy5wYXJhbWV0ZXJzKTsKICAgICAgfQogICAgfTsKICAgIFByZWNvbXB1dGVkSW5kZXhlZFNlZ21lbnRQcm9wZXJ0eVNvdXJjZUJhY2tlbmQgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdCgpCiAgICBdLCBQcmVjb21wdXRlZEluZGV4ZWRTZWdtZW50UHJvcGVydHlTb3VyY2VCYWNrZW5kKTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2RhdGFzb3VyY2UvbmlmdGkvYmFzZS50cwogICAgdmFyIEdFVF9OSUZUSV9WT0xVTUVfSU5GT19SUENfSUQgPSAibmlmdGkvZ2V0TmlmdGlWb2x1bWVJbmZvIjsKICAgIHZhciBWb2x1bWVTb3VyY2VQYXJhbWV0ZXJzMiA9IGNsYXNzIHsKICAgIH07CiAgICBWb2x1bWVTb3VyY2VQYXJhbWV0ZXJzMi5SUENfSUQgPSAibmlmdGkvVm9sdW1lQ2h1bmtTb3VyY2UiOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvc2xpY2V2aWV3L3ZvbHVtZS9iYXNlLnRzCiAgICB2YXIgVm9sdW1lVHlwZTsKICAgIChmdW5jdGlvbihWb2x1bWVUeXBlMikgewogICAgICBWb2x1bWVUeXBlMltWb2x1bWVUeXBlMlsiVU5LTk9XTiJdID0gMF0gPSAiVU5LTk9XTiI7CiAgICAgIFZvbHVtZVR5cGUyW1ZvbHVtZVR5cGUyWyJJTUFHRSJdID0gMV0gPSAiSU1BR0UiOwogICAgICBWb2x1bWVUeXBlMltWb2x1bWVUeXBlMlsiU0VHTUVOVEFUSU9OIl0gPSAyXSA9ICJTRUdNRU5UQVRJT04iOwogICAgfSkoVm9sdW1lVHlwZSB8fCAoVm9sdW1lVHlwZSA9IHt9KSk7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9kYXRhc291cmNlL25pZnRpL2JhY2tlbmQudHMKICAgIHZhciBpbXBvcnRfbmlmdGlfcmVhZGVyX2pzID0gX190b01vZHVsZShyZXF1aXJlX25pZnRpKCkpOwogICAgdmFyIE5pZnRpRmlsZURhdGEgPSBjbGFzcyB7CiAgICB9OwogICAgYXN5bmMgZnVuY3Rpb24gZGVjb2RlTmlmdGlGaWxlKGJ1ZmZlciwgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgaWYgKCgwLCBpbXBvcnRfbmlmdGlfcmVhZGVyX2pzLmlzQ29tcHJlc3NlZCkoYnVmZmVyKSkgewogICAgICAgIGJ1ZmZlciA9IChhd2FpdCByZXF1ZXN0QXN5bmNDb21wdXRhdGlvbihkZWNvZGVHemlwLCBjYW5jZWxsYXRpb25Ub2tlbiwgW2J1ZmZlcl0sIG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpKS5idWZmZXI7CiAgICAgIH0KICAgICAgbGV0IGRhdGEgPSBuZXcgTmlmdGlGaWxlRGF0YSgpOwogICAgICBkYXRhLnVuY29tcHJlc3NlZERhdGEgPSBidWZmZXI7CiAgICAgIGxldCBoZWFkZXIgPSAoMCwgaW1wb3J0X25pZnRpX3JlYWRlcl9qcy5yZWFkSGVhZGVyKShidWZmZXIpOwogICAgICBpZiAoaGVhZGVyID09PSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gcGFyc2UgTklGVEkgaGVhZGVyLiIpOwogICAgICB9CiAgICAgIGRhdGEuaGVhZGVyID0gaGVhZGVyOwogICAgICByZXR1cm4geyBkYXRhLCBzaXplOiBidWZmZXIuYnl0ZUxlbmd0aCB9OwogICAgfQogICAgZnVuY3Rpb24gZ2V0TmlmdGlGaWxlRGF0YShjaHVua01hbmFnZXIsIGNyZWRlbnRpYWxzUHJvdmlkZXIsIHVybCwgZ2V0UHJpb3JpdHksIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgIHJldHVybiBHZW5lcmljU2hhcmVkRGF0YVNvdXJjZS5nZXRVcmwoY2h1bmtNYW5hZ2VyLCBjcmVkZW50aWFsc1Byb3ZpZGVyLCBkZWNvZGVOaWZ0aUZpbGUsIHVybCwgZ2V0UHJpb3JpdHksIGNhbmNlbGxhdGlvblRva2VuKTsKICAgIH0KICAgIHZhciBOSUZUSV9IRUFERVJfSU5GT19QUklPUklUWSA9IDFlMzsKICAgIGFzeW5jIGZ1bmN0aW9uIGdldE5pZnRpSGVhZGVySW5mbyhjaHVua01hbmFnZXIsIGNyZWRlbnRpYWxzUHJvdmlkZXIsIHVybCwgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldE5pZnRpRmlsZURhdGEoY2h1bmtNYW5hZ2VyLCBjcmVkZW50aWFsc1Byb3ZpZGVyLCB1cmwsICgpID0+ICh7IHByaW9yaXR5VGllcjogQ2h1bmtQcmlvcml0eVRpZXIuVklTSUJMRSwgcHJpb3JpdHk6IE5JRlRJX0hFQURFUl9JTkZPX1BSSU9SSVRZIH0pLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgIHJldHVybiBkYXRhLmhlYWRlcjsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnZlcnRBZmZpbmUoYWZmaW5lKSB7CiAgICAgIHJldHVybiBtYXQ0X2V4cG9ydHMuZnJvbVZhbHVlcyhhZmZpbmVbMF1bMF0sIGFmZmluZVsxXVswXSwgYWZmaW5lWzJdWzBdLCBhZmZpbmVbM11bMF0sIGFmZmluZVswXVsxXSwgYWZmaW5lWzFdWzFdLCBhZmZpbmVbMl1bMV0sIGFmZmluZVszXVsxXSwgYWZmaW5lWzBdWzJdLCBhZmZpbmVbMV1bMl0sIGFmZmluZVsyXVsyXSwgYWZmaW5lWzNdWzJdLCBhZmZpbmVbMF1bM10sIGFmZmluZVsxXVszXSwgYWZmaW5lWzJdWzNdLCBhZmZpbmVbM11bM10pOwogICAgfQogICAgdmFyIE5pZnRpRGF0YVR5cGU7CiAgICAoZnVuY3Rpb24oTmlmdGlEYXRhVHlwZTIpIHsKICAgICAgTmlmdGlEYXRhVHlwZTJbTmlmdGlEYXRhVHlwZTJbIk5PTkUiXSA9IDBdID0gIk5PTkUiOwogICAgICBOaWZ0aURhdGFUeXBlMltOaWZ0aURhdGFUeXBlMlsiQklOQVJZIl0gPSAxXSA9ICJCSU5BUlkiOwogICAgICBOaWZ0aURhdGFUeXBlMltOaWZ0aURhdGFUeXBlMlsiVUlOVDgiXSA9IDJdID0gIlVJTlQ4IjsKICAgICAgTmlmdGlEYXRhVHlwZTJbTmlmdGlEYXRhVHlwZTJbIklOVDE2Il0gPSA0XSA9ICJJTlQxNiI7CiAgICAgIE5pZnRpRGF0YVR5cGUyW05pZnRpRGF0YVR5cGUyWyJJTlQzMiJdID0gOF0gPSAiSU5UMzIiOwogICAgICBOaWZ0aURhdGFUeXBlMltOaWZ0aURhdGFUeXBlMlsiRkxPQVQzMiJdID0gMTZdID0gIkZMT0FUMzIiOwogICAgICBOaWZ0aURhdGFUeXBlMltOaWZ0aURhdGFUeXBlMlsiQ09NUExFWDY0Il0gPSAzMl0gPSAiQ09NUExFWDY0IjsKICAgICAgTmlmdGlEYXRhVHlwZTJbTmlmdGlEYXRhVHlwZTJbIkZMT0FUNjQiXSA9IDY0XSA9ICJGTE9BVDY0IjsKICAgICAgTmlmdGlEYXRhVHlwZTJbTmlmdGlEYXRhVHlwZTJbIlJHQjI0Il0gPSAxMjhdID0gIlJHQjI0IjsKICAgICAgTmlmdGlEYXRhVHlwZTJbTmlmdGlEYXRhVHlwZTJbIklOVDgiXSA9IDI1Nl0gPSAiSU5UOCI7CiAgICAgIE5pZnRpRGF0YVR5cGUyW05pZnRpRGF0YVR5cGUyWyJVSU5UMTYiXSA9IDUxMl0gPSAiVUlOVDE2IjsKICAgICAgTmlmdGlEYXRhVHlwZTJbTmlmdGlEYXRhVHlwZTJbIlVJTlQzMiJdID0gNzY4XSA9ICJVSU5UMzIiOwogICAgICBOaWZ0aURhdGFUeXBlMltOaWZ0aURhdGFUeXBlMlsiSU5UNjQiXSA9IDEwMjRdID0gIklOVDY0IjsKICAgICAgTmlmdGlEYXRhVHlwZTJbTmlmdGlEYXRhVHlwZTJbIlVJTlQ2NCJdID0gMTI4MF0gPSAiVUlOVDY0IjsKICAgICAgTmlmdGlEYXRhVHlwZTJbTmlmdGlEYXRhVHlwZTJbIkZMT0FUMTI4Il0gPSAxNTM2XSA9ICJGTE9BVDEyOCI7CiAgICAgIE5pZnRpRGF0YVR5cGUyW05pZnRpRGF0YVR5cGUyWyJDT01QTEVYMTI4Il0gPSAxNzkyXSA9ICJDT01QTEVYMTI4IjsKICAgICAgTmlmdGlEYXRhVHlwZTJbTmlmdGlEYXRhVHlwZTJbIkNPTVBMRVgyNTYiXSA9IDIwNDhdID0gIkNPTVBMRVgyNTYiOwogICAgfSkoTmlmdGlEYXRhVHlwZSB8fCAoTmlmdGlEYXRhVHlwZSA9IHt9KSk7CiAgICB2YXIgREFUQV9UWVBFX0NPTlZFUlNJT05TID0gbmV3IE1hcChbCiAgICAgIFsyNTYsIHsgZGF0YVR5cGU6IERhdGFUeXBlLklOVDggfV0sCiAgICAgIFsyLCB7IGRhdGFUeXBlOiBEYXRhVHlwZS5VSU5UOCB9XSwKICAgICAgWzQsIHsgZGF0YVR5cGU6IERhdGFUeXBlLklOVDE2IH1dLAogICAgICBbNTEyLCB7IGRhdGFUeXBlOiBEYXRhVHlwZS5VSU5UMTYgfV0sCiAgICAgIFs4LCB7IGRhdGFUeXBlOiBEYXRhVHlwZS5JTlQzMiB9XSwKICAgICAgWzc2OCwgeyBkYXRhVHlwZTogRGF0YVR5cGUuVUlOVDMyIH1dLAogICAgICBbMTAyNCwgeyBkYXRhVHlwZTogRGF0YVR5cGUuVUlOVDY0IH1dLAogICAgICBbMTI4MCwgeyBkYXRhVHlwZTogRGF0YVR5cGUuVUlOVDY0IH1dLAogICAgICBbMTYsIHsgZGF0YVR5cGU6IERhdGFUeXBlLkZMT0FUMzIgfV0KICAgIF0pOwogICAgcmVnaXN0ZXJQcm9taXNlUlBDKEdFVF9OSUZUSV9WT0xVTUVfSU5GT19SUENfSUQsIGFzeW5jIGZ1bmN0aW9uKHgsIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgIGNvbnN0IGNodW5rTWFuYWdlciA9IHRoaXMuZ2V0UmVmKHhbImNodW5rTWFuYWdlciJdKTsKICAgICAgY29uc3QgY3JlZGVudGlhbHNQcm92aWRlciA9IHRoaXMuZ2V0T3B0aW9uYWxSZWYoeFsiY3JlZGVudGlhbHNQcm92aWRlciJdKTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBoZWFkZXIgPSBhd2FpdCBnZXROaWZ0aUhlYWRlckluZm8oY2h1bmtNYW5hZ2VyLCBjcmVkZW50aWFsc1Byb3ZpZGVyLCB4WyJ1cmwiXSwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgIGxldCBkYXRhVHlwZUluZm8gPSBEQVRBX1RZUEVfQ09OVkVSU0lPTlMuZ2V0KGhlYWRlci5kYXRhdHlwZUNvZGUpOwogICAgICAgIGlmIChkYXRhVHlwZUluZm8gPT09IHZvaWQgMCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7TmlmdGlEYXRhVHlwZVtoZWFkZXIuZGF0YXR5cGVDb2RlXSB8fCBoZWFkZXIuZGF0YXR5cGVDb2RlfS5gKTsKICAgICAgICB9CiAgICAgICAgbGV0IHNwYXRpYWxJbnZTY2FsZSA9IDE7CiAgICAgICAgbGV0IHNwYXRpYWxVbml0ID0gIiI7CiAgICAgICAgc3dpdGNoIChoZWFkZXIueHl6dF91bml0cyAmIGltcG9ydF9uaWZ0aV9yZWFkZXJfanMuTklGVEkxLlNQQVRJQUxfVU5JVFNfTUFTSykgewogICAgICAgICAgY2FzZSBpbXBvcnRfbmlmdGlfcmVhZGVyX2pzLk5JRlRJMS5VTklUU19NRVRFUjoKICAgICAgICAgICAgc3BhdGlhbEludlNjYWxlID0gMTsKICAgICAgICAgICAgc3BhdGlhbFVuaXQgPSAibSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBpbXBvcnRfbmlmdGlfcmVhZGVyX2pzLk5JRlRJMS5VTklUU19NTToKICAgICAgICAgICAgc3BhdGlhbEludlNjYWxlID0gMWUzOwogICAgICAgICAgICBzcGF0aWFsVW5pdCA9ICJtIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIGltcG9ydF9uaWZ0aV9yZWFkZXJfanMuTklGVEkxLlVOSVRTX01JQ1JPTjoKICAgICAgICAgICAgc3BhdGlhbEludlNjYWxlID0gMWU2OwogICAgICAgICAgICBzcGF0aWFsVW5pdCA9ICJtIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGxldCB0aW1lVW5pdCA9ICIiOwogICAgICAgIGxldCB0aW1lSW52U2NhbGUgPSAxOwogICAgICAgIHN3aXRjaCAoaGVhZGVyLnh5enRfdW5pdHMgJiBpbXBvcnRfbmlmdGlfcmVhZGVyX2pzLk5JRlRJMS5URU1QT1JBTF9VTklUU19NQVNLKSB7CiAgICAgICAgICBjYXNlIGltcG9ydF9uaWZ0aV9yZWFkZXJfanMuTklGVEkxLlVOSVRTX1NFQzoKICAgICAgICAgICAgdGltZVVuaXQgPSAicyI7CiAgICAgICAgICAgIHRpbWVJbnZTY2FsZSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBpbXBvcnRfbmlmdGlfcmVhZGVyX2pzLk5JRlRJMS5VTklUU19NU0VDOgogICAgICAgICAgICB0aW1lVW5pdCA9ICJzIjsKICAgICAgICAgICAgdGltZUludlNjYWxlID0gMWUzOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgaW1wb3J0X25pZnRpX3JlYWRlcl9qcy5OSUZUSTEuVU5JVFNfVVNFQzoKICAgICAgICAgICAgdGltZVVuaXQgPSAicyI7CiAgICAgICAgICAgIHRpbWVJbnZTY2FsZSA9IDFlNjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIGltcG9ydF9uaWZ0aV9yZWFkZXJfanMuTklGVEkxLlVOSVRTX0haOgogICAgICAgICAgICB0aW1lVW5pdCA9ICJIeiI7CiAgICAgICAgICAgIHRpbWVJbnZTY2FsZSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBpbXBvcnRfbmlmdGlfcmVhZGVyX2pzLk5JRlRJMS5VTklUU19SQURTOgogICAgICAgICAgICB0aW1lVW5pdCA9ICJyYWQvcyI7CiAgICAgICAgICAgIHRpbWVJbnZTY2FsZSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBsZXQgdW5pdHMgPSBbc3BhdGlhbFVuaXQsIHNwYXRpYWxVbml0LCBzcGF0aWFsVW5pdCwgdGltZVVuaXQsICIiLCAiIiwgIiJdOwogICAgICAgIGxldCBzb3VyY2VTY2FsZXMgPSBGbG9hdDY0QXJyYXkub2YoaGVhZGVyLnBpeERpbXNbMV0gLyBzcGF0aWFsSW52U2NhbGUsIGhlYWRlci5waXhEaW1zWzJdIC8gc3BhdGlhbEludlNjYWxlLCBoZWFkZXIucGl4RGltc1szXSAvIHNwYXRpYWxJbnZTY2FsZSwgaGVhZGVyLnBpeERpbXNbNF0gLyB0aW1lSW52U2NhbGUsIGhlYWRlci5waXhEaW1zWzVdLCBoZWFkZXIucGl4RGltc1s2XSwgaGVhZGVyLnBpeERpbXNbN10pOwogICAgICAgIGxldCB2aWV3U2NhbGVzID0gRmxvYXQ2NEFycmF5Lm9mKDEgLyBzcGF0aWFsSW52U2NhbGUsIDEgLyBzcGF0aWFsSW52U2NhbGUsIDEgLyBzcGF0aWFsSW52U2NhbGUsIDEgLyB0aW1lSW52U2NhbGUsIDEsIDEsIDEpOwogICAgICAgIGxldCBzb3VyY2VOYW1lcyA9IFsiaSIsICJqIiwgImsiLCAibSIsICJjXiIsICJjMV4iLCAiYzJeIl07CiAgICAgICAgbGV0IHZpZXdOYW1lcyA9IFsieCIsICJ5IiwgInoiLCAidCIsICJjXiIsICJjMV4iLCAiYzJeIl07CiAgICAgICAgY29uc3QgcmFuayA9IGhlYWRlci5kaW1zWzBdOwogICAgICAgIHNvdXJjZU5hbWVzID0gc291cmNlTmFtZXMuc2xpY2UoMCwgcmFuayk7CiAgICAgICAgdmlld05hbWVzID0gdmlld05hbWVzLnNsaWNlKDAsIHJhbmspOwogICAgICAgIHVuaXRzID0gdW5pdHMuc2xpY2UoMCwgcmFuayk7CiAgICAgICAgc291cmNlU2NhbGVzID0gc291cmNlU2NhbGVzLnNsaWNlKDAsIHJhbmspOwogICAgICAgIHZpZXdTY2FsZXMgPSB2aWV3U2NhbGVzLnNsaWNlKDAsIHJhbmspOwogICAgICAgIGNvbnN0IHsgcXVhdGVybl9iLCBxdWF0ZXJuX2MsIHF1YXRlcm5fZCB9ID0gaGVhZGVyOwogICAgICAgIGNvbnN0IHF1YXRlcm5fYSA9IE1hdGguc3FydCgxIC0gcXVhdGVybl9iICogcXVhdGVybl9iIC0gcXVhdGVybl9jICogcXVhdGVybl9jIC0gcXVhdGVybl9kICogcXVhdGVybl9kKTsKICAgICAgICBjb25zdCBxZmFjID0gaGVhZGVyLnBpeERpbXNbMF0gPT09IC0xID8gLTEgOiAxOwogICAgICAgIGNvbnN0IHFvZmZzZXQgPSB2ZWMzX2V4cG9ydHMuZnJvbVZhbHVlcyhoZWFkZXIucW9mZnNldF94LCBoZWFkZXIucW9mZnNldF95LCBoZWFkZXIucW9mZnNldF96KTsKICAgICAgICBjb25zdCBtZXRob2QzVHJhbnNmb3JtID0gY29udmVydEFmZmluZShoZWFkZXIuYWZmaW5lKTsKICAgICAgICBtZXRob2QzVHJhbnNmb3JtOwogICAgICAgIGNvbnN0IG1ldGhvZDJUcmFuc2Zvcm0gPSB0cmFuc2xhdGlvblJvdGF0aW9uU2NhbGVaUmVmbGVjdGlvblRvTWF0NChtYXQ0X2V4cG9ydHMuY3JlYXRlKCksIHFvZmZzZXQsIHF1YXRfZXhwb3J0cy5mcm9tVmFsdWVzKHF1YXRlcm5fYiwgcXVhdGVybl9jLCBxdWF0ZXJuX2QsIHF1YXRlcm5fYSksIGtPbmVWZWMsIHFmYWMpOwogICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGNyZWF0ZUlkZW50aXR5KEZsb2F0NjRBcnJheSwgcmFuayArIDEpOwogICAgICAgIGNvbnN0IGNvcHlSYW5rID0gTWF0aC5taW4oMywgcmFuayk7CiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgY29weVJhbms7ICsrcm93KSB7CiAgICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb3B5UmFuazsgKytjb2wpIHsKICAgICAgICAgICAgdHJhbnNmb3JtW2NvbCAqIChyYW5rICsgMSkgKyByb3ddID0gbWV0aG9kMlRyYW5zZm9ybVtjb2wgKiA0ICsgcm93XTsKICAgICAgICAgIH0KICAgICAgICAgIHRyYW5zZm9ybVtyYW5rICogKHJhbmsgKyAxKSArIHJvd10gPSBtZXRob2QyVHJhbnNmb3JtWzEyICsgcm93XTsKICAgICAgICB9CiAgICAgICAgbGV0IGluZm8gPSB7CiAgICAgICAgICByYW5rLAogICAgICAgICAgc291cmNlTmFtZXMsCiAgICAgICAgICB2aWV3TmFtZXMsCiAgICAgICAgICB1bml0cywKICAgICAgICAgIHNvdXJjZVNjYWxlcywKICAgICAgICAgIHZpZXdTY2FsZXMsCiAgICAgICAgICBkZXNjcmlwdGlvbjogaGVhZGVyLmRlc2NyaXB0aW9uLAogICAgICAgICAgdHJhbnNmb3JtLAogICAgICAgICAgZGF0YVR5cGU6IGRhdGFUeXBlSW5mby5kYXRhVHlwZSwKICAgICAgICAgIHZvbHVtZVNpemU6IFVpbnQzMkFycmF5LmZyb20oaGVhZGVyLmRpbXMuc2xpY2UoMSwgMSArIHJhbmspKQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGluZm8gfTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBjaHVua01hbmFnZXIuZGlzcG9zZSgpOwogICAgICAgIGNyZWRlbnRpYWxzUHJvdmlkZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGNyZWRlbnRpYWxzUHJvdmlkZXIuZGlzcG9zZSgpOwogICAgICB9CiAgICB9KTsKICAgIHZhciBOaWZ0aVZvbHVtZUNodW5rU291cmNlID0gY2xhc3MgZXh0ZW5kcyBXaXRoUGFyYW1ldGVycyhXaXRoU2hhcmVkQ3JlZGVudGlhbHNQcm92aWRlckNvdW50ZXJwYXJ0KCkoVm9sdW1lQ2h1bmtTb3VyY2UpLCBWb2x1bWVTb3VyY2VQYXJhbWV0ZXJzMikgewogICAgICBhc3luYyBkb3dubG9hZChjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICBjaHVuay5jaHVua0RhdGFTaXplID0gdGhpcy5zcGVjLmNodW5rRGF0YVNpemU7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldE5pZnRpRmlsZURhdGEodGhpcy5jaHVua01hbmFnZXIsIHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgdGhpcy5wYXJhbWV0ZXJzLnVybCwgKCkgPT4gKHsgcHJpb3JpdHlUaWVyOiBjaHVuay5wcmlvcml0eVRpZXIsIHByaW9yaXR5OiBjaHVuay5wcmlvcml0eSB9KSwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgIGNvbnN0IGltYWdlQnVmZmVyID0gKDAsIGltcG9ydF9uaWZ0aV9yZWFkZXJfanMucmVhZEltYWdlKShkYXRhLmhlYWRlciwgZGF0YS51bmNvbXByZXNzZWREYXRhKTsKICAgICAgICBhd2FpdCBkZWNvZGVSYXdDaHVuayhjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4sIGltYWdlQnVmZmVyLCBkYXRhLmhlYWRlci5saXR0bGVFbmRpYW4gPyBFbmRpYW5uZXNzLkxJVFRMRSA6IEVuZGlhbm5lc3MuQklHKTsKICAgICAgfQogICAgfTsKICAgIE5pZnRpVm9sdW1lQ2h1bmtTb3VyY2UgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdCgpCiAgICBdLCBOaWZ0aVZvbHVtZUNodW5rU291cmNlKTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2FzeW5jX2NvbXB1dGF0aW9uL2RlY29kZV9ibG9zY19yZXF1ZXN0LnRzCiAgICB2YXIgZGVjb2RlQmxvc2MgPSBhc3luY0NvbXB1dGF0aW9uKCJkZWNvZGVCbG9zYyIpOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvZGF0YXNvdXJjZS9uNS9iYXNlLnRzCiAgICB2YXIgVm9sdW1lQ2h1bmtFbmNvZGluZzQ7CiAgICAoZnVuY3Rpb24oVm9sdW1lQ2h1bmtFbmNvZGluZzYpIHsKICAgICAgVm9sdW1lQ2h1bmtFbmNvZGluZzZbVm9sdW1lQ2h1bmtFbmNvZGluZzZbIlJBVyJdID0gMF0gPSAiUkFXIjsKICAgICAgVm9sdW1lQ2h1bmtFbmNvZGluZzZbVm9sdW1lQ2h1bmtFbmNvZGluZzZbIkdaSVAiXSA9IDFdID0gIkdaSVAiOwogICAgICBWb2x1bWVDaHVua0VuY29kaW5nNltWb2x1bWVDaHVua0VuY29kaW5nNlsiQkxPU0MiXSA9IDJdID0gIkJMT1NDIjsKICAgIH0pKFZvbHVtZUNodW5rRW5jb2Rpbmc0IHx8IChWb2x1bWVDaHVua0VuY29kaW5nNCA9IHt9KSk7CiAgICB2YXIgVm9sdW1lQ2h1bmtTb3VyY2VQYXJhbWV0ZXJzNCA9IGNsYXNzIHsKICAgIH07CiAgICBWb2x1bWVDaHVua1NvdXJjZVBhcmFtZXRlcnM0LlJQQ19JRCA9ICJuNS9Wb2x1bWVDaHVua1NvdXJjZSI7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9kYXRhc291cmNlL241L2JhY2tlbmQudHMKICAgIGFzeW5jIGZ1bmN0aW9uIGRlY29kZUNodW5rKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbiwgcmVzcG9uc2UsIGVuY29kaW5nKSB7CiAgICAgIGNvbnN0IGR2ID0gbmV3IERhdGFWaWV3KHJlc3BvbnNlKTsKICAgICAgY29uc3QgbW9kZSA9IGR2LmdldFVpbnQxNigwLCBmYWxzZSk7CiAgICAgIGlmIChtb2RlICE9PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBtb2RlOiAke21vZGV9LmApOwogICAgICB9CiAgICAgIGNvbnN0IG51bURpbWVuc2lvbnMgPSBkdi5nZXRVaW50MTYoMiwgZmFsc2UpOwogICAgICBpZiAobnVtRGltZW5zaW9ucyAhPT0gY2h1bmsuc291cmNlLnNwZWMucmFuaykgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGRpbWVuc2lvbnMgbXVzdCBiZSAzLmApOwogICAgICB9CiAgICAgIGxldCBvZmZzZXQgPSA0OwogICAgICBjb25zdCBzaGFwZSA9IG5ldyBVaW50MzJBcnJheShudW1EaW1lbnNpb25zKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1EaW1lbnNpb25zOyArK2kpIHsKICAgICAgICBzaGFwZVtpXSA9IGR2LmdldFVpbnQzMihvZmZzZXQsIGZhbHNlKTsKICAgICAgICBvZmZzZXQgKz0gNDsKICAgICAgfQogICAgICBjaHVuay5jaHVua0RhdGFTaXplID0gc2hhcGU7CiAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShyZXNwb25zZSwgb2Zmc2V0KTsKICAgICAgc3dpdGNoIChlbmNvZGluZykgewogICAgICAgIGNhc2UgVm9sdW1lQ2h1bmtFbmNvZGluZzQuR1pJUDoKICAgICAgICAgIGJ1ZmZlciA9IGF3YWl0IHJlcXVlc3RBc3luY0NvbXB1dGF0aW9uKGRlY29kZUd6aXAsIGNhbmNlbGxhdGlvblRva2VuLCBbYnVmZmVyLmJ1ZmZlcl0sIGJ1ZmZlcik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFZvbHVtZUNodW5rRW5jb2Rpbmc0LkJMT1NDOgogICAgICAgICAgYnVmZmVyID0gYXdhaXQgcmVxdWVzdEFzeW5jQ29tcHV0YXRpb24oZGVjb2RlQmxvc2MsIGNhbmNlbGxhdGlvblRva2VuLCBbYnVmZmVyLmJ1ZmZlcl0sIGJ1ZmZlcik7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBhd2FpdCBkZWNvZGVSYXdDaHVuayhjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4sIGJ1ZmZlci5idWZmZXIsIEVuZGlhbm5lc3MuQklHLCBidWZmZXIuYnl0ZU9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgfQogICAgdmFyIFByZWNvbXB1dGVkVm9sdW1lQ2h1bmtTb3VyY2UyID0gY2xhc3MgZXh0ZW5kcyBXaXRoUGFyYW1ldGVycyhXaXRoU2hhcmVkQ3JlZGVudGlhbHNQcm92aWRlckNvdW50ZXJwYXJ0KCkoVm9sdW1lQ2h1bmtTb3VyY2UpLCBWb2x1bWVDaHVua1NvdXJjZVBhcmFtZXRlcnM0KSB7CiAgICAgIGFzeW5jIGRvd25sb2FkKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyB9ID0gdGhpczsKICAgICAgICBjb25zdCB7IGNodW5rR3JpZFBvc2l0aW9uIH0gPSBjaHVuazsKICAgICAgICBsZXQgdXJsID0gcGFyYW1ldGVycy51cmw7CiAgICAgICAgY29uc3QgcmFuayA9IHRoaXMuc3BlYy5yYW5rOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuazsgKytpKSB7CiAgICAgICAgICB1cmwgKz0gYC8ke2NodW5rR3JpZFBvc2l0aW9uW2ldfWA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2FuY2VsbGFibGVGZXRjaFNwZWNpYWxPayh0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIsIHVybCwge30sIHJlc3BvbnNlQXJyYXlCdWZmZXIsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgICBhd2FpdCBkZWNvZGVDaHVuayhjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4sIHJlc3BvbnNlLCBwYXJhbWV0ZXJzLmVuY29kaW5nKTsKICAgICAgfQogICAgfTsKICAgIFByZWNvbXB1dGVkVm9sdW1lQ2h1bmtTb3VyY2UyID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoKQogICAgXSwgUHJlY29tcHV0ZWRWb2x1bWVDaHVua1NvdXJjZTIpOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvZGF0YXNvdXJjZS96YXJyL2Jhc2UudHMKICAgIHZhciBaYXJyQ29tcHJlc3NvcjsKICAgIChmdW5jdGlvbihaYXJyQ29tcHJlc3NvcjIpIHsKICAgICAgWmFyckNvbXByZXNzb3IyW1phcnJDb21wcmVzc29yMlsiUkFXIl0gPSAwXSA9ICJSQVciOwogICAgICBaYXJyQ29tcHJlc3NvcjJbWmFyckNvbXByZXNzb3IyWyJHWklQIl0gPSAxXSA9ICJHWklQIjsKICAgICAgWmFyckNvbXByZXNzb3IyW1phcnJDb21wcmVzc29yMlsiQkxPU0MiXSA9IDJdID0gIkJMT1NDIjsKICAgIH0pKFphcnJDb21wcmVzc29yIHx8IChaYXJyQ29tcHJlc3NvciA9IHt9KSk7CiAgICB2YXIgVm9sdW1lQ2h1bmtTb3VyY2VQYXJhbWV0ZXJzNSA9IGNsYXNzIHsKICAgIH07CiAgICBWb2x1bWVDaHVua1NvdXJjZVBhcmFtZXRlcnM1LlJQQ19JRCA9ICJ6YXJyL1ZvbHVtZUNodW5rU291cmNlIjsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2RhdGFzb3VyY2UvemFyci9iYWNrZW5kLnRzCiAgICBhc3luYyBmdW5jdGlvbiBkZWNvZGVDaHVuazIoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuLCByZXNwb25zZSwgZW5jb2RpbmcpIHsKICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKTsKICAgICAgc3dpdGNoIChlbmNvZGluZy5jb21wcmVzc29yKSB7CiAgICAgICAgY2FzZSBaYXJyQ29tcHJlc3Nvci5HWklQOgogICAgICAgICAgYnVmZmVyID0gYXdhaXQgcmVxdWVzdEFzeW5jQ29tcHV0YXRpb24oZGVjb2RlR3ppcCwgY2FuY2VsbGF0aW9uVG9rZW4sIFtidWZmZXIuYnVmZmVyXSwgYnVmZmVyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWmFyckNvbXByZXNzb3IuUkFXOgogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBaYXJyQ29tcHJlc3Nvci5CTE9TQzoKICAgICAgICAgIGJ1ZmZlciA9IGF3YWl0IHJlcXVlc3RBc3luY0NvbXB1dGF0aW9uKGRlY29kZUJsb3NjLCBjYW5jZWxsYXRpb25Ub2tlbiwgW2J1ZmZlci5idWZmZXJdLCBidWZmZXIpOwogICAgICB9CiAgICAgIGF3YWl0IGRlY29kZVJhd0NodW5rKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbiwgYnVmZmVyLmJ1ZmZlciwgZW5jb2RpbmcuZW5kaWFubmVzcyk7CiAgICB9CiAgICB2YXIgUHJlY29tcHV0ZWRWb2x1bWVDaHVua1NvdXJjZTMgPSBjbGFzcyBleHRlbmRzIFdpdGhQYXJhbWV0ZXJzKFdpdGhTaGFyZWRDcmVkZW50aWFsc1Byb3ZpZGVyQ291bnRlcnBhcnQoKShWb2x1bWVDaHVua1NvdXJjZSksIFZvbHVtZUNodW5rU291cmNlUGFyYW1ldGVyczUpIHsKICAgICAgYXN5bmMgZG93bmxvYWQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY2h1bmsuY2h1bmtEYXRhU2l6ZSA9IHRoaXMuc3BlYy5jaHVua0RhdGFTaXplOwogICAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyB9ID0gdGhpczsKICAgICAgICBjb25zdCB7IGNodW5rR3JpZFBvc2l0aW9uIH0gPSBjaHVuazsKICAgICAgICBsZXQgeyB1cmwsIHNlcGFyYXRvciB9ID0gcGFyYW1ldGVyczsKICAgICAgICBjb25zdCByYW5rID0gdGhpcy5zcGVjLnJhbms7CiAgICAgICAgZm9yIChsZXQgaSA9IHJhbms7IGkgPiAwOyAtLWkpIHsKICAgICAgICAgIHVybCArPSBgJHtpID09IHJhbmsgPyAiLyIgOiBzZXBhcmF0b3J9JHtjaHVua0dyaWRQb3NpdGlvbltpIC0gMV19YDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjYW5jZWxsYWJsZUZldGNoU3BlY2lhbE9rKHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgdXJsLCB7fSwgcmVzcG9uc2VBcnJheUJ1ZmZlciwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgIGF3YWl0IGRlY29kZUNodW5rMihjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4sIHJlc3BvbnNlLCBwYXJhbWV0ZXJzLmVuY29kaW5nKTsKICAgICAgfQogICAgfTsKICAgIFByZWNvbXB1dGVkVm9sdW1lQ2h1bmtTb3VyY2UzID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoKQogICAgXSwgUHJlY29tcHV0ZWRWb2x1bWVDaHVua1NvdXJjZTMpOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvYXN5bmNfY29tcHV0YXRpb24vdnRrX21lc2hfcmVxdWVzdC50cwogICAgdmFyIHBhcnNlVlRLRnJvbUFycmF5QnVmZmVyID0gYXN5bmNDb21wdXRhdGlvbigicGFyc2VWVEtGcm9tQXJyYXlCdWZmZXIiKTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL3NpbmdsZV9tZXNoL2Jhc2UudHMKICAgIHZhciBTSU5HTEVfTUVTSF9MQVlFUl9SUENfSUQgPSAic2luZ2xlX21lc2gvU2luZ2xlTWVzaExheWVyIjsKICAgIHZhciBHRVRfU0lOR0xFX01FU0hfSU5GT19SUENfSUQgPSAic2luZ2xlX21lc2gvZ2V0U2luZ2xlTWVzaEluZm8iOwogICAgdmFyIFNJTkdMRV9NRVNIX0NIVU5LX0tFWSA9ICIiOwogICAgdmFyIFNpbmdsZU1lc2hTb3VyY2VQYXJhbWV0ZXJzID0gY2xhc3MgewogICAgfTsKICAgIHZhciBTaW5nbGVNZXNoU291cmNlUGFyYW1ldGVyc1dpdGhJbmZvID0gY2xhc3MgZXh0ZW5kcyBTaW5nbGVNZXNoU291cmNlUGFyYW1ldGVycyB7CiAgICB9OwogICAgU2luZ2xlTWVzaFNvdXJjZVBhcmFtZXRlcnNXaXRoSW5mby5SUENfSUQgPSAic2luZ2xlX21lc2gvU2luZ2xlTWVzaFNvdXJjZSI7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9zaW5nbGVfbWVzaC9iYWNrZW5kLnRzCiAgICB2YXIgU0lOR0xFX01FU0hfQ0hVTktfUFJJT1JJVFkgPSA1MDsKICAgIHZhciBTaW5nbGVNZXNoQ2h1bmsgPSBjbGFzcyBleHRlbmRzIENodW5rIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmRhdGEgPSBudWxsOwogICAgICB9CiAgICAgIGZyZWVTeXN0ZW1NZW1vcnkoKSB7CiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDsKICAgICAgfQogICAgICBzZXJpYWxpemUobXNnLCB0cmFuc2ZlcnMpIHsKICAgICAgICBzdXBlci5zZXJpYWxpemUobXNnLCB0cmFuc2ZlcnMpOwogICAgICAgIGxldCB7IHZlcnRleFBvc2l0aW9ucywgaW5kaWNlcywgdmVydGV4Tm9ybWFscywgdmVydGV4QXR0cmlidXRlcyB9ID0gdGhpcy5kYXRhOwogICAgICAgIG1zZ1sidmVydGV4UG9zaXRpb25zIl0gPSB2ZXJ0ZXhQb3NpdGlvbnM7CiAgICAgICAgbXNnWyJpbmRpY2VzIl0gPSBpbmRpY2VzOwogICAgICAgIG1zZ1sidmVydGV4Tm9ybWFscyJdID0gdmVydGV4Tm9ybWFsczsKICAgICAgICBtc2dbInZlcnRleEF0dHJpYnV0ZXMiXSA9IHZlcnRleEF0dHJpYnV0ZXM7CiAgICAgICAgY29uc3QgdHJhbnNmZXJTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgdHJhbnNmZXJTZXQuYWRkKHZlcnRleFBvc2l0aW9ucy5idWZmZXIpOwogICAgICAgIHRyYW5zZmVyU2V0LmFkZChpbmRpY2VzLmJ1ZmZlcik7CiAgICAgICAgdHJhbnNmZXJTZXQuYWRkKHZlcnRleE5vcm1hbHMuYnVmZmVyKTsKICAgICAgICBmb3IgKGNvbnN0IGRhdGEgb2YgdmVydGV4QXR0cmlidXRlcykgewogICAgICAgICAgdHJhbnNmZXJTZXQuYWRkKGRhdGEuYnVmZmVyKTsKICAgICAgICB9CiAgICAgICAgdHJhbnNmZXJzLnB1c2goLi4udHJhbnNmZXJTZXQpOwogICAgICAgIHRoaXMuZGF0YSA9IG51bGw7CiAgICAgIH0KICAgICAgZG93bmxvYWRTdWNjZWVkZWQoKSB7CiAgICAgICAgbGV0IHsgdmVydGV4UG9zaXRpb25zLCBpbmRpY2VzLCB2ZXJ0ZXhOb3JtYWxzLCB2ZXJ0ZXhBdHRyaWJ1dGVzIH0gPSB0aGlzLmRhdGE7CiAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSB0aGlzLmdwdU1lbW9yeUJ5dGVzID0gdmVydGV4UG9zaXRpb25zLmJ5dGVMZW5ndGggKyBpbmRpY2VzLmJ5dGVMZW5ndGggKyB2ZXJ0ZXhOb3JtYWxzLmJ5dGVMZW5ndGg7CiAgICAgICAgZm9yIChjb25zdCBkYXRhIG9mIHZlcnRleEF0dHJpYnV0ZXMpIHsKICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZGF0YS5ieXRlTGVuZ3RoOwogICAgICAgIH0KICAgICAgICB0aGlzLnN5c3RlbU1lbW9yeUJ5dGVzID0gdGhpcy5ncHVNZW1vcnlCeXRlcyA9IHRvdGFsQnl0ZXM7CiAgICAgICAgc3VwZXIuZG93bmxvYWRTdWNjZWVkZWQoKTsKICAgICAgfQogICAgfTsKICAgIHZhciBzaW5nbGVNZXNoRmFjdG9yaWVzID0gbmV3IE1hcCgpOwogICAgZnVuY3Rpb24gcmVnaXN0ZXJTaW5nbGVNZXNoRmFjdG9yeShuYW1lLCBmYWN0b3J5KSB7CiAgICAgIHNpbmdsZU1lc2hGYWN0b3JpZXMuc2V0KG5hbWUsIGZhY3RvcnkpOwogICAgfQogICAgdmFyIHByb3RvY29sUGF0dGVybiA9IC9eKD86KFthLXpBLVotK19dKyk6XC9cLyk/KC4qKSQvOwogICAgZnVuY3Rpb24gZ2V0RGF0YVNvdXJjZShmYWN0b3JpZXMsIHVybCkgewogICAgICBsZXQgbSA9IHVybC5tYXRjaChwcm90b2NvbFBhdHRlcm4pOwogICAgICBpZiAobSA9PT0gbnVsbCB8fCBtWzFdID09PSB2b2lkIDApIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGEgc291cmNlIFVSTCBtdXN0IGhhdmUgdGhlIGZvcm0gIjxwcm90b2NvbD46Ly88cGF0aD4iLmApOwogICAgICB9CiAgICAgIGxldCBkYXRhU291cmNlID0gbVsxXTsKICAgICAgbGV0IGZhY3RvcnkgPSBmYWN0b3JpZXMuZ2V0KGRhdGFTb3VyY2UpOwogICAgICBpZiAoZmFjdG9yeSA9PT0gdm9pZCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkYXRhIHNvdXJjZTogJHtKU09OLnN0cmluZ2lmeShkYXRhU291cmNlKX0uYCk7CiAgICAgIH0KICAgICAgcmV0dXJuIFtmYWN0b3J5LCBtWzJdLCBkYXRhU291cmNlXTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldE1lc2goY2h1bmtNYW5hZ2VyLCBjcmVkZW50aWFsc1Byb3ZpZGVyLCB1cmwsIGdldFByaW9yaXR5LCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICBsZXQgW2ZhY3RvcnksIHBhdGhdID0gZ2V0RGF0YVNvdXJjZShzaW5nbGVNZXNoRmFjdG9yaWVzLCB1cmwpOwogICAgICByZXR1cm4gZmFjdG9yeS5nZXRNZXNoKGNodW5rTWFuYWdlciwgY3JlZGVudGlhbHNQcm92aWRlciwgcGF0aCwgZ2V0UHJpb3JpdHksIGNhbmNlbGxhdGlvblRva2VuKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldENvbWJpbmVkTWVzaChjaHVua01hbmFnZXIsIGNyZWRlbnRpYWxzUHJvdmlkZXIsIHBhcmFtZXRlcnMsIGdldFByaW9yaXR5LCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICByZXR1cm4gZ2V0TWVzaChjaHVua01hbmFnZXIsIGNyZWRlbnRpYWxzUHJvdmlkZXIsIHBhcmFtZXRlcnMubWVzaFNvdXJjZVVybCwgZ2V0UHJpb3JpdHksIGNhbmNlbGxhdGlvblRva2VuKTsKICAgIH0KICAgIHZhciBTaW5nbGVNZXNoU291cmNlID0gY2xhc3MgZXh0ZW5kcyBXaXRoUGFyYW1ldGVycyhXaXRoU2hhcmVkQ3JlZGVudGlhbHNQcm92aWRlckNvdW50ZXJwYXJ0KCkoQ2h1bmtTb3VyY2UpLCBTaW5nbGVNZXNoU291cmNlUGFyYW1ldGVyc1dpdGhJbmZvKSB7CiAgICAgIGdldENodW5rKCkgewogICAgICAgIGNvbnN0IGtleSA9IFNJTkdMRV9NRVNIX0NIVU5LX0tFWTsKICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLmNodW5rcy5nZXQoa2V5KTsKICAgICAgICBpZiAoY2h1bmsgPT09IHZvaWQgMCkgewogICAgICAgICAgY2h1bmsgPSB0aGlzLmdldE5ld0NodW5rXyhTaW5nbGVNZXNoQ2h1bmspOwogICAgICAgICAgY2h1bmsuaW5pdGlhbGl6ZShrZXkpOwogICAgICAgICAgdGhpcy5hZGRDaHVuayhjaHVuayk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjaHVuazsKICAgICAgfQogICAgICBkb3dubG9hZChjaHVuaywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgICBjb25zdCBnZXRQcmlvcml0eSA9ICgpID0+ICh7IHByaW9yaXR5VGllcjogY2h1bmsucHJpb3JpdHlUaWVyLCBwcmlvcml0eTogY2h1bmsucHJpb3JpdHkgfSk7CiAgICAgICAgcmV0dXJuIGdldENvbWJpbmVkTWVzaCh0aGlzLmNodW5rTWFuYWdlciwgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLCB0aGlzLnBhcmFtZXRlcnMsIGdldFByaW9yaXR5LCBjYW5jZWxsYXRpb25Ub2tlbikudGhlbigoZGF0YSkgPT4gewogICAgICAgICAgaWYgKHN0YWJsZVN0cmluZ2lmeShkYXRhLmluZm8pICE9PSBzdGFibGVTdHJpbmdpZnkodGhpcy5wYXJhbWV0ZXJzLmluZm8pKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWVzaCBpbmZvIGhhcyBjaGFuZ2VkLmApOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGRhdGEudmVydGV4Tm9ybWFscyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGRhdGEudmVydGV4Tm9ybWFscyA9IGNvbXB1dGVWZXJ0ZXhOb3JtYWxzKGRhdGEudmVydGV4UG9zaXRpb25zLCBkYXRhLmluZGljZXMpOwogICAgICAgICAgfQogICAgICAgICAgY2h1bmsuZGF0YSA9IGRhdGE7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBTaW5nbGVNZXNoU291cmNlID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoKQogICAgXSwgU2luZ2xlTWVzaFNvdXJjZSk7CiAgICB2YXIgU2luZ2xlTWVzaExheWVyQmFzZSA9IHdpdGhTaGFyZWRWaXNpYmlsaXR5KHdpdGhDaHVua01hbmFnZXIoU2hhcmVkT2JqZWN0Q291bnRlcnBhcnQpKTsKICAgIHZhciBTaW5nbGVNZXNoTGF5ZXIgPSBjbGFzcyBleHRlbmRzIFNpbmdsZU1lc2hMYXllckJhc2UgewogICAgICBjb25zdHJ1Y3RvcihycGMyLCBvcHRpb25zKSB7CiAgICAgICAgc3VwZXIocnBjMiwgb3B0aW9ucyk7CiAgICAgICAgdGhpcy5zb3VyY2UgPSB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIocnBjMi5nZXRSZWYob3B0aW9uc1sic291cmNlIl0pKTsKICAgICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zZXIodGhpcy5jaHVua01hbmFnZXIucmVjb21wdXRlQ2h1bmtQcmlvcml0aWVzLmFkZCgoKSA9PiB7CiAgICAgICAgICB0aGlzLnVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICAgIH0pKTsKICAgICAgfQogICAgICB1cGRhdGVDaHVua1ByaW9yaXRpZXMoKSB7CiAgICAgICAgY29uc3QgdmlzaWJpbGl0eSA9IHRoaXMudmlzaWJpbGl0eS52YWx1ZTsKICAgICAgICBpZiAodmlzaWJpbGl0eSA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByaW9yaXR5VGllciA9IGdldFByaW9yaXR5VGllcih2aXNpYmlsaXR5KTsKICAgICAgICBjb25zdCBiYXNlUHJpb3JpdHkgPSBnZXRCYXNlUHJpb3JpdHkodmlzaWJpbGl0eSk7CiAgICAgICAgY29uc3QgeyBzb3VyY2UsIGNodW5rTWFuYWdlciB9ID0gdGhpczsKICAgICAgICBjb25zdCBjaHVuayA9IHNvdXJjZS5nZXRDaHVuaygpOwogICAgICAgIGNodW5rTWFuYWdlci5yZXF1ZXN0Q2h1bmsoY2h1bmssIHByaW9yaXR5VGllciwgYmFzZVByaW9yaXR5ICsgU0lOR0xFX01FU0hfQ0hVTktfUFJJT1JJVFkpOwogICAgICB9CiAgICB9OwogICAgU2luZ2xlTWVzaExheWVyID0gX19kZWNvcmF0ZUNsYXNzKFsKICAgICAgcmVnaXN0ZXJTaGFyZWRPYmplY3QoU0lOR0xFX01FU0hfTEFZRVJfUlBDX0lEKQogICAgXSwgU2luZ2xlTWVzaExheWVyKTsKICAgIHZhciBJTkZPX1BSSU9SSVRZID0gMWUzOwogICAgcmVnaXN0ZXJQcm9taXNlUlBDKEdFVF9TSU5HTEVfTUVTSF9JTkZPX1JQQ19JRCwgYXN5bmMgZnVuY3Rpb24oeCwgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgY29uc3QgY2h1bmtNYW5hZ2VyID0gdGhpcy5nZXRSZWYoeFsiY2h1bmtNYW5hZ2VyIl0pOwogICAgICBjb25zdCBjcmVkZW50aWFsc1Byb3ZpZGVyID0gdGhpcy5nZXRPcHRpb25hbFJlZih4WyJjcmVkZW50aWFsc1Byb3ZpZGVyIl0pOwogICAgICB0cnkgewogICAgICAgIGxldCBwYXJhbWV0ZXJzID0geFsicGFyYW1ldGVycyJdOwogICAgICAgIGNvbnN0IG1lc2ggPSBhd2FpdCBnZXRDb21iaW5lZE1lc2goY2h1bmtNYW5hZ2VyLCBjcmVkZW50aWFsc1Byb3ZpZGVyLCBwYXJhbWV0ZXJzLCAoKSA9PiAoeyBwcmlvcml0eVRpZXI6IENodW5rUHJpb3JpdHlUaWVyLlZJU0lCTEUsIHByaW9yaXR5OiBJTkZPX1BSSU9SSVRZIH0pLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG1lc2guaW5mbyB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGNodW5rTWFuYWdlci5kaXNwb3NlKCk7CiAgICAgICAgY3JlZGVudGlhbHNQcm92aWRlciA9PSBudWxsID8gdm9pZCAwIDogY3JlZGVudGlhbHNQcm92aWRlci5kaXNwb3NlKCk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvZGF0YXNvdXJjZS92dGsvYmFja2VuZC50cwogICAgZnVuY3Rpb24gcGFyc2UoYnVmZmVyLCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICByZXR1cm4gcmVxdWVzdEFzeW5jQ29tcHV0YXRpb24ocGFyc2VWVEtGcm9tQXJyYXlCdWZmZXIsIGNhbmNlbGxhdGlvblRva2VuLCBbYnVmZmVyXSwgYnVmZmVyKTsKICAgIH0KICAgIHJlZ2lzdGVyU2luZ2xlTWVzaEZhY3RvcnkoInZ0ayIsIHsKICAgICAgZGVzY3JpcHRpb246ICJWVEsiLAogICAgICBnZXRNZXNoOiAoY2h1bmtNYW5hZ2VyLCBjcmVkZW50aWFsc1Byb3ZpZGVyLCB1cmwsIGdldFByaW9yaXR5LCBjYW5jZWxsYXRpb25Ub2tlbikgPT4gR2VuZXJpY1NoYXJlZERhdGFTb3VyY2UuZ2V0VXJsKGNodW5rTWFuYWdlciwgY3JlZGVudGlhbHNQcm92aWRlciwgcGFyc2UsIHVybCwgZ2V0UHJpb3JpdHksIGNhbmNlbGxhdGlvblRva2VuKS50aGVuKChtZXNoKSA9PiB7CiAgICAgICAgbGV0IHJlc3VsdCA9IHsKICAgICAgICAgIGluZm86IHsKICAgICAgICAgICAgbnVtVHJpYW5nbGVzOiBtZXNoLm51bVRyaWFuZ2xlcywKICAgICAgICAgICAgbnVtVmVydGljZXM6IG1lc2gubnVtVmVydGljZXMsCiAgICAgICAgICAgIHZlcnRleEF0dHJpYnV0ZXM6IFtdCiAgICAgICAgICB9LAogICAgICAgICAgaW5kaWNlczogbWVzaC5pbmRpY2VzLAogICAgICAgICAgdmVydGV4UG9zaXRpb25zOiBtZXNoLnZlcnRleFBvc2l0aW9ucywKICAgICAgICAgIHZlcnRleEF0dHJpYnV0ZXM6IFtdCiAgICAgICAgfTsKICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBtZXNoLnZlcnRleEF0dHJpYnV0ZXMpIHsKICAgICAgICAgIHJlc3VsdC5pbmZvLnZlcnRleEF0dHJpYnV0ZXMucHVzaCh7CiAgICAgICAgICAgIG5hbWU6IGF0dHJpYnV0ZS5uYW1lLAogICAgICAgICAgICBkYXRhVHlwZTogRGF0YVR5cGUuRkxPQVQzMiwKICAgICAgICAgICAgbnVtQ29tcG9uZW50czogYXR0cmlidXRlLm51bUNvbXBvbmVudHMKICAgICAgICAgIH0pOwogICAgICAgICAgcmVzdWx0LnZlcnRleEF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGUuZGF0YSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0pCiAgICB9KTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2FzeW5jX2NvbXB1dGF0aW9uL29ial9tZXNoX3JlcXVlc3QudHMKICAgIHZhciBwYXJzZU9CSkZyb21BcnJheUJ1ZmZlciA9IGFzeW5jQ29tcHV0YXRpb24oInBhcnNlT0JKRnJvbUFycmF5QnVmZmVyIik7CgogICAgLy8gc3JjL25ldXJvZ2xhbmNlci9kYXRhc291cmNlL29iai9iYWNrZW5kLnRzCiAgICBmdW5jdGlvbiBwYXJzZTIoYnVmZmVyLCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICByZXR1cm4gcmVxdWVzdEFzeW5jQ29tcHV0YXRpb24ocGFyc2VPQkpGcm9tQXJyYXlCdWZmZXIsIGNhbmNlbGxhdGlvblRva2VuLCBbYnVmZmVyXSwgYnVmZmVyKTsKICAgIH0KICAgIHJlZ2lzdGVyU2luZ2xlTWVzaEZhY3RvcnkoIm9iaiIsIHsKICAgICAgZGVzY3JpcHRpb246ICJPQkoiLAogICAgICBnZXRNZXNoOiAoY2h1bmtNYW5hZ2VyLCBjcmVkZW50aWFsc1Byb3ZpZGVyLCB1cmwsIGdldFByaW9yaXR5LCBjYW5jZWxsYXRpb25Ub2tlbikgPT4gR2VuZXJpY1NoYXJlZERhdGFTb3VyY2UuZ2V0VXJsKGNodW5rTWFuYWdlciwgY3JlZGVudGlhbHNQcm92aWRlciwgcGFyc2UyLCB1cmwsIGdldFByaW9yaXR5LCBjYW5jZWxsYXRpb25Ub2tlbikKICAgIH0pOwoKICAgIC8vIHNyYy9uZXVyb2dsYW5jZXIvZGF0YXNvdXJjZS9ncmFwaGVuZS9iYXNlLnRzCiAgICB2YXIgVm9sdW1lQ2h1bmtFbmNvZGluZzU7CiAgICAoZnVuY3Rpb24oVm9sdW1lQ2h1bmtFbmNvZGluZzYpIHsKICAgICAgVm9sdW1lQ2h1bmtFbmNvZGluZzZbVm9sdW1lQ2h1bmtFbmNvZGluZzZbIlJBVyJdID0gMF0gPSAiUkFXIjsKICAgICAgVm9sdW1lQ2h1bmtFbmNvZGluZzZbVm9sdW1lQ2h1bmtFbmNvZGluZzZbIkpQRUciXSA9IDFdID0gIkpQRUciOwogICAgICBWb2x1bWVDaHVua0VuY29kaW5nNltWb2x1bWVDaHVua0VuY29kaW5nNlsiQ09NUFJFU1NFRF9TRUdNRU5UQVRJT04iXSA9IDJdID0gIkNPTVBSRVNTRURfU0VHTUVOVEFUSU9OIjsKICAgIH0pKFZvbHVtZUNodW5rRW5jb2Rpbmc1IHx8IChWb2x1bWVDaHVua0VuY29kaW5nNSA9IHt9KSk7CiAgICB2YXIgQ2h1bmtlZEdyYXBoU291cmNlUGFyYW1ldGVycyA9IGNsYXNzIHsKICAgIH07CiAgICBDaHVua2VkR3JhcGhTb3VyY2VQYXJhbWV0ZXJzLlJQQ19JRCA9ICJncmFwaGVuZS9DaHVua2VkR3JhcGhTb3VyY2UiOwogICAgdmFyIE1lc2hTb3VyY2VQYXJhbWV0ZXJzNSA9IGNsYXNzIHsKICAgIH07CiAgICBNZXNoU291cmNlUGFyYW1ldGVyczUuUlBDX0lEID0gImdyYXBoZW5lL01lc2hTb3VyY2UiOwogICAgdmFyIHJlc3BvbnNlSWRlbnRpdHkgPSBhc3luYyAoeCkgPT4geDsKICAgIGZ1bmN0aW9uIGlzQmFzZVNlZ21lbnRJZChzZWdtZW50SWQsIG5CaXRzRm9yTGF5ZXJJZCkgewogICAgICBjb25zdCBsYXllcklkID0gVWludDY0LnJzaGlmdChuZXcgVWludDY0KCksIHNlZ21lbnRJZCwgNjQgLSBuQml0c0ZvckxheWVySWQpOwogICAgICByZXR1cm4gVWludDY0LmVxdWFsKGxheWVySWQsIFVpbnQ2NC5PTkUpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0R3JhcGhlbmVGcmFnbWVudEtleShmcmFnbWVudElkKSB7CiAgICAgIGNvbnN0IHNoYXJkZWQgPSBmcmFnbWVudElkLmNoYXJBdCgwKSA9PT0gIn4iOwogICAgICBpZiAoc2hhcmRlZCkgewogICAgICAgIGNvbnN0IHBhcnRzID0gZnJhZ21lbnRJZC5zdWJzdHJpbmcoMSkuc3BsaXQoLzooLispLyk7CiAgICAgICAgcmV0dXJuIHsga2V5OiBwYXJ0c1swXSwgZnJhZ21lbnRJZDogcGFydHNbMV0gfTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4geyBrZXk6IGZyYWdtZW50SWQsIGZyYWdtZW50SWQgfTsKICAgICAgfQogICAgfQogICAgdmFyIENIVU5LRURfR1JBUEhfTEFZRVJfUlBDX0lEID0gIkNodW5rZWRHcmFwaExheWVyIjsKICAgIHZhciBDSFVOS0VEX0dSQVBIX1JFTkRFUl9MQVlFUl9VUERBVEVfU09VUkNFU19SUENfSUQgPSAiQ2h1bmtlZEdyYXBoTGF5ZXI6dXBkYXRlU291cmNlcyI7CiAgICB2YXIgUkVOREVSX1JBVElPX0xJTUlUID0gNTsKCiAgICAvLyBzcmMvbmV1cm9nbGFuY2VyL2RhdGFzb3VyY2UvZ3JhcGhlbmUvYmFja2VuZC50cwogICAgdmFyIGltcG9ydF9kZWJvdW5jZTIgPSBfX3RvTW9kdWxlKHJlcXVpcmVfZGVib3VuY2UoKSk7CiAgICBmdW5jdGlvbiBnZXRWZXJpZmllZEZyYWdtZW50UHJvbWlzZShjcmVkZW50aWFsc1Byb3ZpZGVyLCBjaHVuaywgcGFyYW1ldGVycywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgaWYgKGNodW5rLmZyYWdtZW50SWQgJiYgY2h1bmsuZnJhZ21lbnRJZC5jaGFyQXQoMCkgPT09ICJ+IikgewogICAgICAgIGxldCBwYXJ0cyA9IGNodW5rLmZyYWdtZW50SWQuc3Vic3RyKDEpLnNwbGl0KCI6Iik7CiAgICAgICAgbGV0IHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7CiAgICAgICAgc3RhcnRPZmZzZXQgPSBOdW1iZXIocGFydHNbMV0pOwogICAgICAgIGVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgTnVtYmVyKHBhcnRzWzJdKTsKICAgICAgICByZXR1cm4gZmV0Y2hTcGVjaWFsSHR0cEJ5dGVSYW5nZShjcmVkZW50aWFsc1Byb3ZpZGVyLCBgJHtwYXJhbWV0ZXJzLmZyYWdtZW50VXJsfS9pbml0aWFsLyR7cGFydHNbMF19YCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICB9CiAgICAgIHJldHVybiBjYW5jZWxsYWJsZUZldGNoU3BlY2lhbE9rKGNyZWRlbnRpYWxzUHJvdmlkZXIsIGAke3BhcmFtZXRlcnMuZnJhZ21lbnRVcmx9L2R5bmFtaWMvJHtjaHVuay5mcmFnbWVudElkfWAsIHt9LCByZXNwb25zZUFycmF5QnVmZmVyLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRGcmFnbWVudERvd25sb2FkUHJvbWlzZShjcmVkZW50aWFsc1Byb3ZpZGVyLCBjaHVuaywgcGFyYW1ldGVycywgY2FuY2VsbGF0aW9uVG9rZW4pIHsKICAgICAgbGV0IGZyYWdtZW50RG93bmxvYWRQcm9taXNlOwogICAgICBpZiAocGFyYW1ldGVycy5zaGFyZGluZykgewogICAgICAgIGZyYWdtZW50RG93bmxvYWRQcm9taXNlID0gZ2V0VmVyaWZpZWRGcmFnbWVudFByb21pc2UoY3JlZGVudGlhbHNQcm92aWRlciwgY2h1bmssIHBhcmFtZXRlcnMsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmcmFnbWVudERvd25sb2FkUHJvbWlzZSA9IGNhbmNlbGxhYmxlRmV0Y2hTcGVjaWFsT2soY3JlZGVudGlhbHNQcm92aWRlciwgYCR7cGFyYW1ldGVycy5mcmFnbWVudFVybH0vJHtjaHVuay5mcmFnbWVudElkfWAsIHt9LCByZXNwb25zZUFycmF5QnVmZmVyLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAgICAgIH0KICAgICAgcmV0dXJuIGZyYWdtZW50RG93bmxvYWRQcm9taXNlOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gZGVjb2RlRHJhY29GcmFnbWVudENodW5rKGNodW5rLCByZXNwb25zZSkgewogICAgICBjb25zdCBtID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9kcmFjbygpLCBkcmFjb19leHBvcnRzKSk7CiAgICAgIGNvbnN0IHJhd01lc2ggPSBhd2FpdCBtLmRlY29kZURyYWNvKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSk7CiAgICAgIGFzc2lnbk1lc2hGcmFnbWVudERhdGEoY2h1bmssIHJhd01lc2gpOwogICAgfQogICAgdmFyIEdyYXBoZW5lTWVzaFNvdXJjZSA9IGNsYXNzIGV4dGVuZHMgV2l0aFBhcmFtZXRlcnMoV2l0aFNoYXJlZENyZWRlbnRpYWxzUHJvdmlkZXJDb3VudGVycGFydCgpKE1lc2hTb3VyY2UpLCBNZXNoU291cmNlUGFyYW1ldGVyczUpIHsKICAgICAgYXN5bmMgZG93bmxvYWQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIGlmIChpc0Jhc2VTZWdtZW50SWQoY2h1bmsub2JqZWN0SWQsIHBhcmFtZXRlcnMubkJpdHNGb3JMYXllcklkKSkgewogICAgICAgICAgcmV0dXJuIGRlY29kZU1hbmlmZXN0Q2h1bmsyKGNodW5rLCB7IGZyYWdtZW50czogW10gfSk7CiAgICAgICAgfQogICAgICAgIGxldCB1cmwgPSBgJHtwYXJhbWV0ZXJzLm1hbmlmZXN0VXJsfS9tYW5pZmVzdGA7CiAgICAgICAgbGV0IG1hbmlmZXN0VXJsID0gYCR7dXJsfS8ke2NodW5rLm9iamVjdElkfToke3BhcmFtZXRlcnMubG9kfT92ZXJpZnk9MSZwcmVwZW5kX3NlZ19pZHM9MWA7CiAgICAgICAgYXdhaXQgY2FuY2VsbGFibGVGZXRjaFNwZWNpYWxPayh0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIsIG1hbmlmZXN0VXJsLCB7fSwgcmVzcG9uc2VKc29uLCBjYW5jZWxsYXRpb25Ub2tlbikudGhlbigocmVzcG9uc2UpID0+IGRlY29kZU1hbmlmZXN0Q2h1bmsyKGNodW5rLCByZXNwb25zZSkpOwogICAgICB9CiAgICAgIGFzeW5jIGRvd25sb2FkRnJhZ21lbnQoY2h1bmssIGNhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzIH0gPSB0aGlzOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldEZyYWdtZW50RG93bmxvYWRQcm9taXNlKHZvaWQgMCwgY2h1bmssIHBhcmFtZXRlcnMsIGNhbmNlbGxhdGlvblRva2VuKTsKICAgICAgICAgIGF3YWl0IGRlY29kZURyYWNvRnJhZ21lbnRDaHVuayhjaHVuaywgcmVzcG9uc2UpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGlmIChpc05vdEZvdW5kRXJyb3IoZSkpIHsKICAgICAgICAgICAgY2h1bmsuc291cmNlLnJlbW92ZUNodW5rKGNodW5rKTsKICAgICAgICAgIH0KICAgICAgICAgIFByb21pc2UucmVqZWN0KGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBnZXRGcmFnbWVudEtleShvYmplY3RLZXksIGZyYWdtZW50SWQpIHsKICAgICAgICByZXR1cm4gZ2V0R3JhcGhlbmVGcmFnbWVudEtleShmcmFnbWVudElkKTsKICAgICAgfQogICAgfTsKICAgIEdyYXBoZW5lTWVzaFNvdXJjZSA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KCkKICAgIF0sIEdyYXBoZW5lTWVzaFNvdXJjZSk7CiAgICB2YXIgQ2h1bmtlZEdyYXBoQ2h1bmsgPSBjbGFzcyBleHRlbmRzIENodW5rIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICB0aGlzLmJhY2tlbmRPbmx5ID0gdHJ1ZTsKICAgICAgICB0aGlzLnNvdXJjZSA9IG51bGw7CiAgICAgICAgdGhpcy5sZWF2ZXMgPSBbXTsKICAgICAgfQogICAgICBpbml0aWFsaXplVm9sdW1lQ2h1bmsoa2V5LCBjaHVua0dyaWRQb3NpdGlvbikgewogICAgICAgIHN1cGVyLmluaXRpYWxpemUoa2V5KTsKICAgICAgICB0aGlzLmNodW5rR3JpZFBvc2l0aW9uID0gRmxvYXQzMkFycmF5LmZyb20oY2h1bmtHcmlkUG9zaXRpb24pOwogICAgICB9CiAgICAgIGluaXRpYWxpemVDaHVua2VkR3JhcGhDaHVuayhrZXksIGNodW5rR3JpZFBvc2l0aW9uLCBzZWdtZW50KSB7CiAgICAgICAgdGhpcy5pbml0aWFsaXplVm9sdW1lQ2h1bmsoa2V5LCBjaHVua0dyaWRQb3NpdGlvbik7CiAgICAgICAgdGhpcy5jaHVua0RhdGFTaXplID0gbnVsbDsKICAgICAgICB0aGlzLnN5c3RlbU1lbW9yeUJ5dGVzID0gMTY7CiAgICAgICAgdGhpcy5ncHVNZW1vcnlCeXRlcyA9IDA7CiAgICAgICAgdGhpcy5zZWdtZW50ID0gc2VnbWVudDsKICAgICAgfQogICAgICBkb3dubG9hZFN1Y2NlZWRlZCgpIHsKICAgICAgICB0aGlzLnN5c3RlbU1lbW9yeUJ5dGVzID0gMTY7CiAgICAgICAgdGhpcy5zeXN0ZW1NZW1vcnlCeXRlcyArPSAxNiAqIHRoaXMubGVhdmVzLmxlbmd0aDsKICAgICAgICB0aGlzLnF1ZXVlTWFuYWdlci51cGRhdGVDaHVua1N0YXRlKHRoaXMsIENodW5rU3RhdGUuU1lTVEVNX01FTU9SWV9XT1JLRVIpOwogICAgICAgIGlmICh0aGlzLnByaW9yaXR5VGllciA8IENodW5rUHJpb3JpdHlUaWVyLlJFQ0VOVCkgewogICAgICAgICAgdGhpcy5zb3VyY2UuY2h1bmtNYW5hZ2VyLnNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHN1cGVyLmRvd25sb2FkU3VjY2VlZGVkKCk7CiAgICAgIH0KICAgICAgZnJlZVN5c3RlbU1lbW9yeSgpIHsKICAgICAgICB0aGlzLmxlYXZlcyA9IFtdOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gZGVjb2RlQ2h1bmtlZEdyYXBoQ2h1bmsobGVhdmVzKSB7CiAgICAgIGNvbnN0IGZpbmFsID0gbmV3IEFycmF5KGxlYXZlcy5sZW5ndGgpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbmFsLmxlbmd0aDsgKytpKSB7CiAgICAgICAgZmluYWxbaV0gPSBVaW50NjQucGFyc2VTdHJpbmcobGVhdmVzW2ldKTsKICAgICAgfQogICAgICByZXR1cm4gZmluYWw7CiAgICB9CiAgICB2YXIgR3JhcGhlbmVDaHVua2VkR3JhcGhDaHVua1NvdXJjZSA9IGNsYXNzIGV4dGVuZHMgV2l0aFBhcmFtZXRlcnMoV2l0aFNoYXJlZENyZWRlbnRpYWxzUHJvdmlkZXJDb3VudGVycGFydCgpKENodW5rU291cmNlKSwgQ2h1bmtlZEdyYXBoU291cmNlUGFyYW1ldGVycykgewogICAgICBjb25zdHJ1Y3RvcihycGMyLCBvcHRpb25zKSB7CiAgICAgICAgc3VwZXIocnBjMiwgb3B0aW9ucyk7CiAgICAgICAgdGhpcy5zcGVjID0gb3B0aW9ucy5zcGVjOwogICAgICAgIGNvbnN0IHJhbmsgPSB0aGlzLnNwZWMucmFuazsKICAgICAgICB0aGlzLnRlbXBDaHVua0RhdGFTaXplID0gbmV3IFVpbnQzMkFycmF5KHJhbmspOwogICAgICAgIHRoaXMudGVtcENodW5rUG9zaXRpb24gPSBuZXcgRmxvYXQzMkFycmF5KHJhbmspOwogICAgICB9CiAgICAgIGFzeW5jIGRvd25sb2FkKGNodW5rLCBjYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgIGxldCB7IHBhcmFtZXRlcnMgfSA9IHRoaXM7CiAgICAgICAgbGV0IGNodW5rUG9zaXRpb24gPSB0aGlzLmNvbXB1dGVDaHVua0JvdW5kcyhjaHVuayk7CiAgICAgICAgbGV0IGNodW5rRGF0YVNpemUgPSBjaHVuay5jaHVua0RhdGFTaXplOwogICAgICAgIGxldCBib3VuZHMgPSBgJHtjaHVua1Bvc2l0aW9uWzBdfS0ke2NodW5rUG9zaXRpb25bMF0gKyBjaHVua0RhdGFTaXplWzBdfV8ke2NodW5rUG9zaXRpb25bMV19LSR7Y2h1bmtQb3NpdGlvblsxXSArIGNodW5rRGF0YVNpemVbMV19XyR7Y2h1bmtQb3NpdGlvblsyXX0tJHtjaHVua1Bvc2l0aW9uWzJdICsgY2h1bmtEYXRhU2l6ZVsyXX1gOwogICAgICAgIGNvbnN0IHJlcXVlc3QgPSBjYW5jZWxsYWJsZUZldGNoU3BlY2lhbE9rKHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciwgYCR7cGFyYW1ldGVycy51cmx9LyR7Y2h1bmsuc2VnbWVudH0vbGVhdmVzP2ludDY0X2FzX3N0cj0xJmJvdW5kcz0ke2JvdW5kc31gLCB7fSwgcmVzcG9uc2VJZGVudGl0eSwgY2FuY2VsbGF0aW9uVG9rZW4pOwogICAgICAgIGF3YWl0IHRoaXMud2l0aEVycm9yTWVzc2FnZShyZXF1ZXN0LCBgRmV0Y2hpbmcgbGVhdmVzIG9mIHNlZ21lbnQgJHtjaHVuay5zZWdtZW50fSBpbiByZWdpb24gJHtib3VuZHN9OiBgKS50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpLnRoZW4oKHJlcykgPT4gewogICAgICAgICAgY2h1bmsubGVhdmVzID0gZGVjb2RlQ2h1bmtlZEdyYXBoQ2h1bmsocmVzWyJsZWFmX2lkcyJdKTsKICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVycikpOwogICAgICB9CiAgICAgIGdldENodW5rKGNodW5rR3JpZFBvc2l0aW9uLCBzZWdtZW50KSB7CiAgICAgICAgY29uc3Qga2V5ID0gYCR7dmVjM0tleShjaHVua0dyaWRQb3NpdGlvbil9LSR7c2VnbWVudH1gOwogICAgICAgIGxldCBjaHVuayA9IHRoaXMuY2h1bmtzLmdldChrZXkpOwogICAgICAgIGlmIChjaHVuayA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBjaHVuayA9IHRoaXMuZ2V0TmV3Q2h1bmtfKENodW5rZWRHcmFwaENodW5rKTsKICAgICAgICAgIGNodW5rLmluaXRpYWxpemVDaHVua2VkR3JhcGhDaHVuayhrZXksIGNodW5rR3JpZFBvc2l0aW9uLCBzZWdtZW50KTsKICAgICAgICAgIHRoaXMuYWRkQ2h1bmsoY2h1bmspOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2h1bms7CiAgICAgIH0KICAgICAgY29tcHV0ZUNodW5rQm91bmRzKGNodW5rKSB7CiAgICAgICAgcmV0dXJuIGNvbXB1dGVDaHVua0JvdW5kcyh0aGlzLCBjaHVuayk7CiAgICAgIH0KICAgICAgYXN5bmMgd2l0aEVycm9yTWVzc2FnZShwcm9taXNlLCBlcnJvclByZWZpeCkgewogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcHJvbWlzZTsKICAgICAgICBpZiAocmVzcG9uc2Uub2spIHsKICAgICAgICAgIHJldHVybiByZXNwb25zZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV0IG1zZzsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIG1zZyA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpWyJtZXNzYWdlIl07CiAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgbXNnID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbJHtyZXNwb25zZS5zdGF0dXN9XSAke2Vycm9yUHJlZml4fSR7bXNnfWApOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIEdyYXBoZW5lQ2h1bmtlZEdyYXBoQ2h1bmtTb3VyY2UgPSBfX2RlY29yYXRlQ2xhc3MoWwogICAgICByZWdpc3RlclNoYXJlZE9iamVjdCgpCiAgICBdLCBHcmFwaGVuZUNodW5rZWRHcmFwaENodW5rU291cmNlKTsKICAgIHZhciB0ZW1wQ2h1bmtQb3NpdGlvbjMgPSB2ZWMzX2V4cG9ydHMuY3JlYXRlKCk7CiAgICB2YXIgdGVtcENlbnRlcjMgPSB2ZWMzX2V4cG9ydHMuY3JlYXRlKCk7CiAgICB2YXIgdGVtcENodW5rU2l6ZTMgPSB2ZWMzX2V4cG9ydHMuY3JlYXRlKCk7CiAgICB2YXIgQ2h1bmtlZEdyYXBoTGF5ZXIgPSBjbGFzcyBleHRlbmRzIHdpdGhTZWdtZW50YXRpb25MYXllckJhY2tlbmRTdGF0ZSh3aXRoU2hhcmVkVmlzaWJpbGl0eSh3aXRoQ2h1bmtNYW5hZ2VyKFJlbmRlckxheWVyQmFja2VuZCkpKSB7CiAgICAgIGNvbnN0cnVjdG9yKHJwYzIsIG9wdGlvbnMpIHsKICAgICAgICBzdXBlcihycGMyLCBvcHRpb25zKTsKICAgICAgICB0aGlzLmRlYm91bmNlZHVwZGF0ZURpc3BsYXlTdGF0ZSA9ICgwLCBpbXBvcnRfZGVib3VuY2UyLmRlZmF1bHQpKCgpID0+IHsKICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheVN0YXRlKCk7CiAgICAgICAgfSwgMTAwKTsKICAgICAgICB0aGlzLnNvdXJjZSA9IHRoaXMucmVnaXN0ZXJEaXNwb3NlcihycGMyLmdldFJlZihvcHRpb25zWyJzb3VyY2UiXSkpOwogICAgICAgIHRoaXMubG9jYWxQb3NpdGlvbiA9IHJwYzIuZ2V0KG9wdGlvbnMubG9jYWxQb3NpdGlvbik7CiAgICAgICAgdGhpcy5sZWFmUmVxdWVzdHNBY3RpdmUgPSBycGMyLmdldChvcHRpb25zLmxlYWZSZXF1ZXN0c0FjdGl2ZSk7CiAgICAgICAgdGhpcy5uQml0c0ZvckxheWVySWQgPSBycGMyLmdldChvcHRpb25zLm5CaXRzRm9yTGF5ZXJJZCk7CiAgICAgICAgdGhpcy5yZWdpc3RlckRpc3Bvc2VyKHRoaXMuY2h1bmtNYW5hZ2VyLnJlY29tcHV0ZUNodW5rUHJpb3JpdGllcy5hZGQoKCkgPT4gewogICAgICAgICAgdGhpcy51cGRhdGVDaHVua1ByaW9yaXRpZXMoKTsKICAgICAgICAgIHRoaXMuZGVib3VuY2VkdXBkYXRlRGlzcGxheVN0YXRlKCk7CiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIGF0dGFjaChhdHRhY2htZW50KSB7CiAgICAgICAgY29uc3Qgc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMgPSAoKSA9PiB0aGlzLmNodW5rTWFuYWdlci5zY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcygpOwogICAgICAgIGNvbnN0IHsgdmlldyB9ID0gYXR0YWNobWVudDsKICAgICAgICBhdHRhY2htZW50LnJlZ2lzdGVyRGlzcG9zZXIoc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMpOwogICAgICAgIGF0dGFjaG1lbnQucmVnaXN0ZXJEaXNwb3Nlcih2aWV3LnByb2plY3Rpb25QYXJhbWV0ZXJzLmNoYW5nZWQuYWRkKHNjaGVkdWxlVXBkYXRlQ2h1bmtQcmlvcml0aWVzKSk7CiAgICAgICAgYXR0YWNobWVudC5yZWdpc3RlckRpc3Bvc2VyKHZpZXcudmlzaWJpbGl0eS5jaGFuZ2VkLmFkZChzY2hlZHVsZVVwZGF0ZUNodW5rUHJpb3JpdGllcykpOwogICAgICAgIGF0dGFjaG1lbnQuc3RhdGUgPSB7CiAgICAgICAgICBkaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbzogdmlldy5wcm9qZWN0aW9uUGFyYW1ldGVycy52YWx1ZS5kaXNwbGF5RGltZW5zaW9uUmVuZGVySW5mbwogICAgICAgIH07CiAgICAgIH0KICAgICAgZ2V0IHJlbmRlclJhdGlvTGltaXQoKSB7CiAgICAgICAgcmV0dXJuIFJFTkRFUl9SQVRJT19MSU1JVDsKICAgICAgfQogICAgICB1cGRhdGVDaHVua1ByaW9yaXRpZXMoKSB7CiAgICAgICAgY29uc3QgeyBzb3VyY2UsIGNodW5rTWFuYWdlciB9ID0gdGhpczsKICAgICAgICBjaHVua01hbmFnZXIucmVnaXN0ZXJMYXllcih0aGlzKTsKICAgICAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgdGhpcy5hdHRhY2htZW50cy52YWx1ZXMoKSkgewogICAgICAgICAgY29uc3QgeyB2aWV3IH0gPSBhdHRhY2htZW50OwogICAgICAgICAgY29uc3QgdmlzaWJpbGl0eSA9IHZpZXcudmlzaWJpbGl0eS52YWx1ZTsKICAgICAgICAgIGlmICh2aXNpYmlsaXR5ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBhdHRhY2htZW50U3RhdGUgPSBhdHRhY2htZW50LnN0YXRlOwogICAgICAgICAgY29uc3QgeyB0cmFuc2Zvcm1lZFNvdXJjZTogdHNvdXJjZSB9ID0gYXR0YWNobWVudFN0YXRlOwogICAgICAgICAgY29uc3QgcHJvamVjdGlvblBhcmFtZXRlcnMgPSB2aWV3LnByb2plY3Rpb25QYXJhbWV0ZXJzLnZhbHVlOwogICAgICAgICAgaWYgKCF0c291cmNlKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgcGl4ZWxTaXplID0gcHJvamVjdGlvblBhcmFtZXRlcnMucGl4ZWxTaXplICogMS4xOwogICAgICAgICAgY29uc3Qgc21hbGxlc3RWb3hlbFNpemUgPSB0c291cmNlLmVmZmVjdGl2ZVZveGVsU2l6ZTsKICAgICAgICAgIHRoaXMubGVhZlJlcXVlc3RzQWN0aXZlLnZhbHVlID0gdGhpcy5yZW5kZXJSYXRpb0xpbWl0ID49IHBpeGVsU2l6ZSAvIE1hdGgubWluKC4uLnNtYWxsZXN0Vm94ZWxTaXplKTsKICAgICAgICAgIGlmICghdGhpcy5sZWFmUmVxdWVzdHNBY3RpdmUudmFsdWUpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBwcmlvcml0eVRpZXIgPSBnZXRQcmlvcml0eVRpZXIodmlzaWJpbGl0eSk7CiAgICAgICAgICBjb25zdCBiYXNlUHJpb3JpdHkgPSBnZXRCYXNlUHJpb3JpdHkodmlzaWJpbGl0eSk7CiAgICAgICAgICBjb25zdCB7IGNodW5rTGF5b3V0IH0gPSB0c291cmNlOwogICAgICAgICAgY29uc3QgeyBzaXplLCBmaW5pdGVSYW5rIH0gPSBjaHVua0xheW91dDsKICAgICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRlbXBDaHVua1NpemUzOwogICAgICAgICAgY29uc3QgbG9jYWxDZW50ZXIgPSB0ZW1wQ2VudGVyMzsKICAgICAgICAgIHZlYzNfZXhwb3J0cy5jb3B5KGNodW5rU2l6ZSwgc2l6ZSk7CiAgICAgICAgICBmb3IgKGxldCBpID0gZmluaXRlUmFuazsgaSA8IDM7ICsraSkgewogICAgICAgICAgICBjaHVua1NpemVbaV0gPSAwOwogICAgICAgICAgICBsb2NhbENlbnRlcltpXSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCB7IGNlbnRlckRhdGFQb3NpdGlvbiB9ID0gcHJvamVjdGlvblBhcmFtZXRlcnM7CiAgICAgICAgICBjaHVua0xheW91dC5nbG9iYWxUb0xvY2FsU3BhdGlhbChsb2NhbENlbnRlciwgY2VudGVyRGF0YVBvc2l0aW9uKTsKICAgICAgICAgIGZvckVhY2hQbGFuZUludGVyc2VjdGluZ1ZvbHVtZXRyaWNDaHVuayhwcm9qZWN0aW9uUGFyYW1ldGVycywgdGhpcy5sb2NhbFBvc2l0aW9uLnZhbHVlLCB0c291cmNlLCBnZXROb3JtYWxpemVkQ2h1bmtMYXlvdXQocHJvamVjdGlvblBhcmFtZXRlcnMsIGNodW5rTGF5b3V0KSwgKHBvc2l0aW9uSW5DaHVua3MpID0+IHsKICAgICAgICAgICAgdmVjM19leHBvcnRzLm11bHRpcGx5KHRlbXBDaHVua1Bvc2l0aW9uMywgcG9zaXRpb25JbkNodW5rcywgY2h1bmtTaXplKTsKICAgICAgICAgICAgY29uc3QgcHJpb3JpdHkgPSAtdmVjM19leHBvcnRzLmRpc3RhbmNlKGxvY2FsQ2VudGVyLCB0ZW1wQ2h1bmtQb3NpdGlvbjMpOwogICAgICAgICAgICBjb25zdCB7IGN1clBvc2l0aW9uSW5DaHVua3MgfSA9IHRzb3VyY2U7CiAgICAgICAgICAgIGZvckVhY2hWaXNpYmxlU2VnbWVudCh0aGlzLCAoc2VnbWVudCwgXykgPT4gewogICAgICAgICAgICAgIGlmIChpc0Jhc2VTZWdtZW50SWQoc2VnbWVudCwgdGhpcy5uQml0c0ZvckxheWVySWQudmFsdWUpKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gc291cmNlLmdldENodW5rKGN1clBvc2l0aW9uSW5DaHVua3MsIHNlZ21lbnQuY2xvbmUoKSk7CiAgICAgICAgICAgICAgY2h1bmtNYW5hZ2VyLnJlcXVlc3RDaHVuayhjaHVuaywgcHJpb3JpdHlUaWVyLCBiYXNlUHJpb3JpdHkgKyBwcmlvcml0eSk7CiAgICAgICAgICAgICAgKyt0aGlzLm51bVZpc2libGVDaHVua3NOZWVkZWQ7CiAgICAgICAgICAgICAgaWYgKGNodW5rLnN0YXRlID09PSBDaHVua1N0YXRlLkdQVV9NRU1PUlkpIHsKICAgICAgICAgICAgICAgICsrdGhpcy5udW1WaXNpYmxlQ2h1bmtzQXZhaWxhYmxlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yRWFjaFNlbGVjdGVkUm9vdFdpdGhMZWF2ZXMoY2FsbGJhY2spIHsKICAgICAgICBjb25zdCB7IHNvdXJjZSB9ID0gdGhpczsKICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHNvdXJjZS5jaHVua3MudmFsdWVzKCkpIHsKICAgICAgICAgIGlmIChjaHVuay5zdGF0ZSA9PT0gQ2h1bmtTdGF0ZS5TWVNURU1fTUVNT1JZX1dPUktFUiAmJiBjaHVuay5wcmlvcml0eVRpZXIgPCBDaHVua1ByaW9yaXR5VGllci5SRUNFTlQpIHsKICAgICAgICAgICAgaWYgKHRoaXMudmlzaWJsZVNlZ21lbnRzLmhhcyhjaHVuay5zZWdtZW50KSAmJiBjaHVuay5sZWF2ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgY2FsbGJhY2soY2h1bmsuc2VnbWVudC50b1N0cmluZygpLCBjaHVuay5sZWF2ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHVwZGF0ZURpc3BsYXlTdGF0ZSgpIHsKICAgICAgICBjb25zdCB2aXNpYmxlTGVhdmVzID0gbmV3IE1hcCgpOwogICAgICAgIGNvbnN0IGNhcGFjaXRpZXMgPSBuZXcgTWFwKCk7CiAgICAgICAgdGhpcy5mb3JFYWNoU2VsZWN0ZWRSb290V2l0aExlYXZlcygocm9vdE9iamVjdEtleSwgbGVhdmVzKSA9PiB7CiAgICAgICAgICBpZiAoIWNhcGFjaXRpZXMuaGFzKHJvb3RPYmplY3RLZXkpKSB7CiAgICAgICAgICAgIGNhcGFjaXRpZXMuc2V0KHJvb3RPYmplY3RLZXksIGxlYXZlcy5sZW5ndGgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2FwYWNpdGllcy5zZXQocm9vdE9iamVjdEtleSwgY2FwYWNpdGllcy5nZXQocm9vdE9iamVjdEtleSkgKyBsZWF2ZXMubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB0aGlzLmZvckVhY2hTZWxlY3RlZFJvb3RXaXRoTGVhdmVzKChyb290T2JqZWN0S2V5LCBsZWF2ZXMpID0+IHsKICAgICAgICAgIGlmICghdmlzaWJsZUxlYXZlcy5oYXMocm9vdE9iamVjdEtleSkpIHsKICAgICAgICAgICAgdmlzaWJsZUxlYXZlcy5zZXQocm9vdE9iamVjdEtleSwgbmV3IFVpbnQ2NFNldCgpKTsKICAgICAgICAgICAgdmlzaWJsZUxlYXZlcy5nZXQocm9vdE9iamVjdEtleSkucmVzZXJ2ZShjYXBhY2l0aWVzLmdldChyb290T2JqZWN0S2V5KSk7CiAgICAgICAgICAgIHZpc2libGVMZWF2ZXMuZ2V0KHJvb3RPYmplY3RLZXkpLmFkZChVaW50NjQucGFyc2VTdHJpbmcocm9vdE9iamVjdEtleSkpOwogICAgICAgICAgfQogICAgICAgICAgdmlzaWJsZUxlYXZlcy5nZXQocm9vdE9iamVjdEtleSkuYWRkKGxlYXZlcyk7CiAgICAgICAgfSk7CiAgICAgICAgZm9yIChjb25zdCBbcm9vdCwgbGVhdmVzXSBvZiB2aXNpYmxlTGVhdmVzKSB7CiAgICAgICAgICBjb25zdCBmaWx0ZXJlZExlYXZlcyA9IFsuLi5sZWF2ZXNdLmZpbHRlcigoeCkgPT4gIXRoaXMuc2VnbWVudEVxdWl2YWxlbmNlcy5oYXMoeCkpOwogICAgICAgICAgY29uc3Qgcm9vdEludCA9IFVpbnQ2NC5wYXJzZVN0cmluZyhyb290KTsKICAgICAgICAgIGZvciAoY29uc3QgbGVhZiBvZiBmaWx0ZXJlZExlYXZlcykgewogICAgICAgICAgICB0aGlzLnNlZ21lbnRFcXVpdmFsZW5jZXMubGluayhyb290SW50LCBsZWFmKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBDaHVua2VkR3JhcGhMYXllciA9IF9fZGVjb3JhdGVDbGFzcyhbCiAgICAgIHJlZ2lzdGVyU2hhcmVkT2JqZWN0KENIVU5LRURfR1JBUEhfTEFZRVJfUlBDX0lEKQogICAgXSwgQ2h1bmtlZEdyYXBoTGF5ZXIpOwogICAgcmVnaXN0ZXJSUEMoQ0hVTktFRF9HUkFQSF9SRU5ERVJfTEFZRVJfVVBEQVRFX1NPVVJDRVNfUlBDX0lELCBmdW5jdGlvbih4KSB7CiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmdldCh4LnZpZXcpOwogICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0KHgubGF5ZXIpOwogICAgICBjb25zdCBhdHRhY2htZW50ID0gbGF5ZXIuYXR0YWNobWVudHMuZ2V0KHZpZXcpOwogICAgICBhdHRhY2htZW50LnN0YXRlLnRyYW5zZm9ybWVkU291cmNlID0gZGVzZXJpYWxpemVUcmFuc2Zvcm1lZFNvdXJjZXModGhpcywgeC5zb3VyY2VzLCBsYXllcilbMF1bMF07CiAgICAgIGF0dGFjaG1lbnQuc3RhdGUuZGlzcGxheURpbWVuc2lvblJlbmRlckluZm8gPSB4LmRpc3BsYXlEaW1lbnNpb25SZW5kZXJJbmZvOwogICAgICBsYXllci5jaHVua01hbmFnZXIuc2NoZWR1bGVVcGRhdGVDaHVua1ByaW9yaXRpZXMoKTsKICAgIH0pOwogIH0pKCk7CiAgLyoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLgogICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgKgogICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgICoKICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICovCiAgLyoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLgogICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgKgogICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgICoKICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICovCiAgLyoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLgogICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgKgogICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgICoKICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICovCiAgLyoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgSW5jLgogICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgKgogICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgICoKICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICovCiAgLyoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAxOSBUaGUgTmV1cm9nbGFuY2VyIEF1dGhvcnMKICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICoKICAgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICAqCiAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAqLwogIC8qKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4KICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICoKICAgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICAqCiAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAqLwogIC8qKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIEluYy4KICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICoKICAgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICAqCiAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAqLwogIC8qKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IDIwMjEgV2lsbGlhbSBTaWx2ZXJtc2l0aC4KICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICoKICAgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICAqCiAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAqLwogIC8qKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IDIwMjEgV2lsbGlhbSBTaWx2ZXJzbWl0aAogICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgKgogICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgICoKICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICovCiAgLyoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAyMiBXaWxsaWFtIFNpbHZlcm1zaXRoLgogICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgKgogICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgICoKICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICovCiAgLyoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAyMiBXaWxsaWFtIFNpbHZlcnNtaXRoCiAgICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICAqCiAgICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAgKgogICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgKi8KICAvKioKICAgKiBAbGljZW5zZQogICAqIFRoaXMgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIEdvb2dsZSBOZXVyb2dsYW5jZXIgcHJvamVjdCwKICAgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLgogICAqIFRoZSBEZXJpdmF0aXZlIFdvcmsgaXMgY292ZXJlZCBieQogICAqIENvcHlyaWdodCAyMDE5IEhvd2FyZCBIdWdoZXMgTWVkaWNhbCBJbnN0aXR1dGUKICAgKgogICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgKgogICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgICoKICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICovCiAgLyoqCiAgICogQGxpY2Vuc2UKICAgKiBUaGlzIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBHb29nbGUgTmV1cm9nbGFuY2VyIHByb2plY3QsCiAgICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KICAgKiBUaGUgRGVyaXZhdGl2ZSBXb3JrIGlzIGNvdmVyZWQgYnkKICAgKiBDb3B5cmlnaHQgMjAyMCBIb3dhcmQgSHVnaGVzIE1lZGljYWwgSW5zdGl0dXRlCiAgICoKICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICoKICAgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICAqCiAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAqLwoKfSkoKTsKCg==', null, false);
32
+ /* eslint-enable */
33
+
34
+ export { WorkerFactory as ChunkWorker };
35
+ //# sourceMappingURL=index.js.map