Ly8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtc3RkPWdudSsrMTEgJXMgCiNkZWZpbmUgVChiKSAoYikgPyAxIDogLTEKI2RlZmluZSBGKGIpIChiKSA/IC0xIDogMQoKc3RydWN0IE5vblBPRCB7IE5vblBPRChpbnQpOyB9OwoKLy8gUE9EcwplbnVtIEVudW0geyBFViB9OwpzdHJ1Y3QgUE9EIHsgRW51bSBlOyBpbnQgaTsgZmxvYXQgZjsgTm9uUE9EKiBwOyB9OwpzdHJ1Y3QgRW1wdHkge307CnR5cGVkZWYgRW1wdHkgRW1wdHlBclsxMF07CnR5cGVkZWYgaW50IEludDsKdHlwZWRlZiBJbnQgSW50QXJbMTBdOwp0eXBlZGVmIEludCBJbnRBck5CW107CmNsYXNzIFN0YXRpY3MgeyBzdGF0aWMgaW50IHByaXY7IHN0YXRpYyBOb25QT0QgbnA7IH07CnVuaW9uIEVtcHR5VW5pb24ge307CnVuaW9uIFVuaW9uIHsgaW50IGk7IGZsb2F0IGY7IH07CnN0cnVjdCBIYXNGdW5jIHsgdm9pZCBmICgpOyB9OwpzdHJ1Y3QgSGFzT3AgeyB2b2lkIG9wZXJhdG9yICooKTsgfTsKc3RydWN0IEhhc0NvbnYgeyBvcGVyYXRvciBpbnQoKTsgfTsKc3RydWN0IEhhc0Fzc2lnbiB7IHZvaWQgb3BlcmF0b3IgPShpbnQpOyB9OwoKc3RydWN0IEhhc0Fub255bW91c1VuaW9uIHsKICB1bmlvbiB7CiAgICBpbnQgaTsKICAgIGZsb2F0IGY7CiAgfTsKfTsKCnR5cGVkZWYgaW50IFZlY3RvciBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKTsKdHlwZWRlZiBpbnQgVmVjdG9yRXh0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwoKLy8gTm90IFBPRHMKdHlwZWRlZiBjb25zdCB2b2lkIGN2b2lkOwpzdHJ1Y3QgRGVyaXZlcyA6IFBPRCB7fTsKdHlwZWRlZiBEZXJpdmVzIERlcml2ZXNBclsxMF07CnR5cGVkZWYgRGVyaXZlcyBEZXJpdmVzQXJOQltdOwpzdHJ1Y3QgRGVyaXZlc0VtcHR5IDogRW1wdHkge307CnN0cnVjdCBIYXNDb25zIHsgSGFzQ29ucyhpbnQpOyB9OwpzdHJ1Y3QgSGFzQ29weUFzc2lnbiB7IEhhc0NvcHlBc3NpZ24gb3BlcmF0b3IgPShjb25zdCBIYXNDb3B5QXNzaWduJik7IH07CnN0cnVjdCBIYXNNb3ZlQXNzaWduIHsgSGFzTW92ZUFzc2lnbiBvcGVyYXRvciA9KGNvbnN0IEhhc01vdmVBc3NpZ24mJik7IH07CnN0cnVjdCBIYXNOb1Rocm93TW92ZUFzc2lnbiB7IAogIEhhc05vVGhyb3dNb3ZlQXNzaWduJiBvcGVyYXRvcj0oCiAgICBjb25zdCBIYXNOb1Rocm93TW92ZUFzc2lnbiYmKSB0aHJvdygpOyB9OwpzdHJ1Y3QgSGFzTm9FeGNlcHROb1Rocm93TW92ZUFzc2lnbiB7IAogIEhhc05vRXhjZXB0Tm9UaHJvd01vdmVBc3NpZ24mIG9wZXJhdG9yPSgKICAgIGNvbnN0IEhhc05vRXhjZXB0Tm9UaHJvd01vdmVBc3NpZ24mJikgbm9leGNlcHQ7IAp9OwpzdHJ1Y3QgSGFzVGhyb3dNb3ZlQXNzaWduIHsgCiAgSGFzVGhyb3dNb3ZlQXNzaWduJiBvcGVyYXRvcj0oCiAgICBjb25zdCBIYXNUaHJvd01vdmVBc3NpZ24mJikgdGhyb3coUE9EKTsgfTsKc3RydWN0IEhhc05vRXhjZXB0RmFsc2VNb3ZlQXNzaWduIHsgCiAgSGFzTm9FeGNlcHRGYWxzZU1vdmVBc3NpZ24mIG9wZXJhdG9yPSgKICAgIGNvbnN0IEhhc05vRXhjZXB0RmFsc2VNb3ZlQXNzaWduJiYpIG5vZXhjZXB0KGZhbHNlKTsgfTsKc3RydWN0IEhhc01vdmVDdG9yIHsgSGFzTW92ZUN0b3IoY29uc3QgSGFzTW92ZUN0b3ImJik7IH07CnN0cnVjdCBIYXNNZW1iZXJNb3ZlQ3RvciB7IEhhc01vdmVDdG9yIG1lbWJlcjsgfTsKc3RydWN0IEhhc01lbWJlck1vdmVBc3NpZ24geyBIYXNNb3ZlQXNzaWduIG1lbWJlcjsgfTsKc3RydWN0IEhhc1N0YXRpY01lbWJlck1vdmVDdG9yIHsgc3RhdGljIEhhc01vdmVDdG9yIG1lbWJlcjsgfTsKc3RydWN0IEhhc1N0YXRpY01lbWJlck1vdmVBc3NpZ24geyBzdGF0aWMgSGFzTW92ZUFzc2lnbiBtZW1iZXI7IH07CnN0cnVjdCBIYXNNZW1iZXJUaHJvd01vdmVBc3NpZ24geyBIYXNUaHJvd01vdmVBc3NpZ24gbWVtYmVyOyB9OwpzdHJ1Y3QgSGFzTWVtYmVyTm9FeGNlcHRGYWxzZU1vdmVBc3NpZ24geyAKICBIYXNOb0V4Y2VwdEZhbHNlTW92ZUFzc2lnbiBtZW1iZXI7IH07CnN0cnVjdCBIYXNNZW1iZXJOb1Rocm93TW92ZUFzc2lnbiB7IEhhc05vVGhyb3dNb3ZlQXNzaWduIG1lbWJlcjsgfTsKc3RydWN0IEhhc01lbWJlck5vRXhjZXB0Tm9UaHJvd01vdmVBc3NpZ24geyAKICBIYXNOb0V4Y2VwdE5vVGhyb3dNb3ZlQXNzaWduIG1lbWJlcjsgfTsKCnN0cnVjdCBIYXNEZWZhdWx0VHJpdmlhbENvcHlBc3NpZ24geyAKICBIYXNEZWZhdWx0VHJpdmlhbENvcHlBc3NpZ24gJm9wZXJhdG9yPSgKICAgIGNvbnN0IEhhc0RlZmF1bHRUcml2aWFsQ29weUFzc2lnbiYpID0gZGVmYXVsdDsgCn07CnN0cnVjdCBUcml2aWFsTW92ZUJ1dE5vdENvcHkgeyAKICBUcml2aWFsTW92ZUJ1dE5vdENvcHkgJm9wZXJhdG9yPShUcml2aWFsTW92ZUJ1dE5vdENvcHkmJikgPSBkZWZhdWx0OwogIFRyaXZpYWxNb3ZlQnV0Tm90Q29weSAmb3BlcmF0b3I9KGNvbnN0IFRyaXZpYWxNb3ZlQnV0Tm90Q29weSYpOwp9OwpzdHJ1Y3QgTm9uVHJpdmlhbERlZmF1bHQgewogIE5vblRyaXZpYWxEZWZhdWx0KCk7Cn07CgpzdHJ1Y3QgSGFzRGVzdCB7IH5IYXNEZXN0KCk7IH07CmNsYXNzICBIYXNQcml2IHsgaW50IHByaXY7IH07CmNsYXNzICBIYXNQcm90IHsgcHJvdGVjdGVkOiBpbnQgcHJvdDsgfTsKc3RydWN0IEhhc1JlZiB7IGludCBpOyBpbnQmIHJlZjsgSGFzUmVmKCkgOiBpKDApLCByZWYoaSkge30gfTsKc3RydWN0IEhhc05vblBPRCB7IE5vblBPRCBucDsgfTsKc3RydWN0IEhhc1ZpcnQgeyB2aXJ0dWFsIHZvaWQgVmlydCgpIHt9OyB9Owp0eXBlZGVmIE5vblBPRCBOb25QT0RBclsxMF07CnR5cGVkZWYgSGFzVmlydCBWaXJ0QXJbMTBdOwp0eXBlZGVmIE5vblBPRCBOb25QT0RBck5CW107CnVuaW9uIE5vblBPRFVuaW9uIHsgaW50IGk7IERlcml2ZXMgbjsgfTsKc3RydWN0IERlcml2ZXNIYXNDb25zIDogSGFzQ29ucyB7fTsKc3RydWN0IERlcml2ZXNIYXNDb3B5QXNzaWduIDogSGFzQ29weUFzc2lnbiB7fTsKc3RydWN0IERlcml2ZXNIYXNNb3ZlQXNzaWduIDogSGFzTW92ZUFzc2lnbiB7fTsKc3RydWN0IERlcml2ZXNIYXNEZXN0IDogSGFzRGVzdCB7fTsKc3RydWN0IERlcml2ZXNIYXNQcml2IDogSGFzUHJpdiB7fTsKc3RydWN0IERlcml2ZXNIYXNQcm90IDogSGFzUHJvdCB7fTsKc3RydWN0IERlcml2ZXNIYXNSZWYgOiBIYXNSZWYge307CnN0cnVjdCBEZXJpdmVzSGFzVmlydCA6IEhhc1ZpcnQge307CnN0cnVjdCBEZXJpdmVzSGFzTW92ZUN0b3IgOiBIYXNNb3ZlQ3RvciB7fTsKCnN0cnVjdCBIYXNOb1Rocm93Q29weUFzc2lnbiB7CiAgdm9pZCBvcGVyYXRvciA9KGNvbnN0IEhhc05vVGhyb3dDb3B5QXNzaWduJikgdGhyb3coKTsKfTsKc3RydWN0IEhhc011bHRpcGxlQ29weUFzc2lnbiB7CiAgdm9pZCBvcGVyYXRvciA9KGNvbnN0IEhhc011bHRpcGxlQ29weUFzc2lnbiYpIHRocm93KCk7CiAgdm9pZCBvcGVyYXRvciA9KHZvbGF0aWxlIEhhc011bHRpcGxlQ29weUFzc2lnbiYpOwp9OwpzdHJ1Y3QgSGFzTXVsdGlwbGVOb1Rocm93Q29weUFzc2lnbiB7CiAgdm9pZCBvcGVyYXRvciA9KGNvbnN0IEhhc011bHRpcGxlTm9UaHJvd0NvcHlBc3NpZ24mKSB0aHJvdygpOwogIHZvaWQgb3BlcmF0b3IgPSh2b2xhdGlsZSBIYXNNdWx0aXBsZU5vVGhyb3dDb3B5QXNzaWduJikgdGhyb3coKTsKfTsKCnN0cnVjdCBIYXNOb1Rocm93Q29uc3RydWN0b3IgeyBIYXNOb1Rocm93Q29uc3RydWN0b3IoKSB0aHJvdygpOyB9OwpzdHJ1Y3QgSGFzTm9UaHJvd0NvbnN0cnVjdG9yV2l0aEFyZ3MgewogIEhhc05vVGhyb3dDb25zdHJ1Y3RvcldpdGhBcmdzKEhhc0NvbnMgaSA9IEhhc0NvbnMoMCkpIHRocm93KCk7Cn07CgpzdHJ1Y3QgSGFzTm9UaHJvd0NvcHkgeyBIYXNOb1Rocm93Q29weShjb25zdCBIYXNOb1Rocm93Q29weSYpIHRocm93KCk7IH07CnN0cnVjdCBIYXNNdWx0aXBsZUNvcHkgewogIEhhc011bHRpcGxlQ29weShjb25zdCBIYXNNdWx0aXBsZUNvcHkmKSB0aHJvdygpOwogIEhhc011bHRpcGxlQ29weSh2b2xhdGlsZSBIYXNNdWx0aXBsZUNvcHkmKTsKfTsKc3RydWN0IEhhc011bHRpcGxlTm9UaHJvd0NvcHkgewogIEhhc011bHRpcGxlTm9UaHJvd0NvcHkoY29uc3QgSGFzTXVsdGlwbGVOb1Rocm93Q29weSYpIHRocm93KCk7CiAgSGFzTXVsdGlwbGVOb1Rocm93Q29weSh2b2xhdGlsZSBIYXNNdWx0aXBsZU5vVGhyb3dDb3B5JikgdGhyb3coKTsKfTsKCnN0cnVjdCBIYXNWaXJ0RGVzdCB7IHZpcnR1YWwgfkhhc1ZpcnREZXN0KCk7IH07CnN0cnVjdCBEZXJpdmVkVmlydERlc3QgOiBIYXNWaXJ0RGVzdCB7fTsKdHlwZWRlZiBIYXNWaXJ0RGVzdCBWaXJ0RGVzdEFyWzFdOwoKY2xhc3MgQWxsUHJpdmF0ZSB7CiAgQWxsUHJpdmF0ZSgpIHRocm93KCk7CiAgQWxsUHJpdmF0ZShjb25zdCBBbGxQcml2YXRlJikgdGhyb3coKTsKICBBbGxQcml2YXRlICZvcGVyYXRvcj0oY29uc3QgQWxsUHJpdmF0ZSAmKSB0aHJvdygpOwogIH5BbGxQcml2YXRlKCkgdGhyb3coKTsKfTsKCnN0cnVjdCBUaHJlZUFyZ0N0b3IgewogIFRocmVlQXJnQ3RvcihpbnQqLCBjaGFyKiwgaW50KTsKfTsKCnZvaWQgaXNfcG9kKCkKewogIHsgaW50IGFycltUKF9faXNfcG9kKGludCkpXTsgfQogIHsgaW50IGFycltUKF9faXNfcG9kKEVudW0pKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChQT0QpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChJbnQpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChJbnRBcikpXTsgfQogIHsgaW50IGFycltUKF9faXNfcG9kKFN0YXRpY3MpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChFbXB0eSkpXTsgfQogIHsgaW50IGFycltUKF9faXNfcG9kKEVtcHR5VW5pb24pKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChVbmlvbikpXTsgfQogIHsgaW50IGFycltUKF9faXNfcG9kKEhhc0Z1bmMpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChIYXNPcCkpXTsgfQogIHsgaW50IGFycltUKF9faXNfcG9kKEhhc0NvbnYpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChIYXNBc3NpZ24pKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChJbnRBck5CKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19wb2QoSGFzQW5vbnltb3VzVW5pb24pKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChWZWN0b3IpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChWZWN0b3JFeHQpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChEZXJpdmVzKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19wb2QoRGVyaXZlc0FyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19wb2QoRGVyaXZlc0FyTkIpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChEZXJpdmVzRW1wdHkpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvZChIYXNQcml2KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19wb2QoSGFzUHJvdCkpXTsgfQogIHsgaW50IGFycltUKF9faXNfcG9kKERlcml2ZXNIYXNQcml2KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19wb2QoRGVyaXZlc0hhc1Byb3QpKV07IH0KCiAgeyBpbnQgYXJyW0YoX19pc19wb2QoSGFzQ29ucykpXTsgfQogIHsgaW50IGFycltGKF9faXNfcG9kKEhhc0NvcHlBc3NpZ24pKV07IH0KICB7IGludCBhcnJbRihfX2lzX3BvZChIYXNNb3ZlQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19wb2QoSGFzRGVzdCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfcG9kKEhhc1JlZikpXTsgfQogIHsgaW50IGFycltGKF9faXNfcG9kKEhhc1ZpcnQpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3BvZChEZXJpdmVzSGFzQ29ucykpXTsgfQogIHsgaW50IGFycltGKF9faXNfcG9kKERlcml2ZXNIYXNDb3B5QXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19wb2QoRGVyaXZlc0hhc01vdmVBc3NpZ24pKV07IH0KICB7IGludCBhcnJbRihfX2lzX3BvZChEZXJpdmVzSGFzRGVzdCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfcG9kKERlcml2ZXNIYXNSZWYpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3BvZChEZXJpdmVzSGFzVmlydCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfcG9kKE5vblBPRCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfcG9kKEhhc05vblBPRCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfcG9kKE5vblBPREFyKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19wb2QoTm9uUE9EQXJOQikpXTsgfQogIHsgaW50IGFycltGKF9faXNfcG9kKHZvaWQpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3BvZChjdm9pZCkpXTsgfQovLyB7IGludCBhcnJbRihfX2lzX3BvZChOb25QT0RVbmlvbikpXTsgfQp9Cgp0eXBlZGVmIEVtcHR5IEVtcHR5QXJbMTBdOwpzdHJ1Y3QgQml0MCB7IGludCA6IDA7IH07CnN0cnVjdCBCaXQwQ29ucyB7IGludCA6IDA7IEJpdDBDb25zKCk7IH07CnN0cnVjdCBCaXRPbmx5IHsgaW50IHggOiAzOyB9OwpzdHJ1Y3QgRGVyaXZlc1ZpcnQgOiB2aXJ0dWFsIFBPRCB7fTsKCnZvaWQgaXNfZW1wdHkoKQp7CiAgeyBpbnQgYXJyW1QoX19pc19lbXB0eShFbXB0eSkpXTsgfQogIHsgaW50IGFycltUKF9faXNfZW1wdHkoRGVyaXZlc0VtcHR5KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19lbXB0eShIYXNDb25zKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19lbXB0eShIYXNDb3B5QXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19lbXB0eShIYXNNb3ZlQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19lbXB0eShIYXNEZXN0KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19lbXB0eShIYXNGdW5jKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19lbXB0eShIYXNPcCkpXTsgfQogIHsgaW50IGFycltUKF9faXNfZW1wdHkoSGFzQ29udikpXTsgfQogIHsgaW50IGFycltUKF9faXNfZW1wdHkoSGFzQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19lbXB0eShCaXQwKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19lbXB0eShCaXQwQ29ucykpXTsgfQoKICB7IGludCBhcnJbRihfX2lzX2VtcHR5KEludCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfZW1wdHkoUE9EKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19lbXB0eShFbXB0eVVuaW9uKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19lbXB0eShFbXB0eUFyKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19lbXB0eShIYXNSZWYpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2VtcHR5KEhhc1ZpcnQpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2VtcHR5KEJpdE9ubHkpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2VtcHR5KHZvaWQpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2VtcHR5KEludEFyTkIpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2VtcHR5KEhhc0Fub255bW91c1VuaW9uKSldOyB9Ci8vICB7IGludCBhcnJbRihfX2lzX2VtcHR5KERlcml2ZXNWaXJ0KSldOyB9Cn0KCnR5cGVkZWYgRGVyaXZlcyBDbGFzc1R5cGU7Cgp2b2lkIGlzX2NsYXNzKCkKewogIHsgaW50IGFycltUKF9faXNfY2xhc3MoRGVyaXZlcykpXTsgfQogIHsgaW50IGFycltUKF9faXNfY2xhc3MoSGFzUHJpdikpXTsgfQogIHsgaW50IGFycltUKF9faXNfY2xhc3MoQ2xhc3NUeXBlKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19jbGFzcyhIYXNBbm9ueW1vdXNVbmlvbikpXTsgfQoKICB7IGludCBhcnJbRihfX2lzX2NsYXNzKGludCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfY2xhc3MoRW51bSkpXTsgfQogIHsgaW50IGFycltGKF9faXNfY2xhc3MoSW50KSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19jbGFzcyhJbnRBcikpXTsgfQogIHsgaW50IGFycltGKF9faXNfY2xhc3MoRGVyaXZlc0FyKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19jbGFzcyhVbmlvbikpXTsgfQogIHsgaW50IGFycltGKF9faXNfY2xhc3MoY3ZvaWQpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2NsYXNzKEludEFyTkIpKV07IH0KfQoKdHlwZWRlZiBVbmlvbiBVbmlvbkFyWzEwXTsKdHlwZWRlZiBVbmlvbiBVbmlvblR5cGU7Cgp2b2lkIGlzX3VuaW9uKCkKewogIHsgaW50IGFycltUKF9faXNfdW5pb24oVW5pb24pKV07IH0KICB7IGludCBhcnJbVChfX2lzX3VuaW9uKFVuaW9uVHlwZSkpXTsgfQoKICB7IGludCBhcnJbRihfX2lzX3VuaW9uKGludCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfdW5pb24oRW51bSkpXTsgfQogIHsgaW50IGFycltGKF9faXNfdW5pb24oSW50KSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc191bmlvbihJbnRBcikpXTsgfQogIHsgaW50IGFycltGKF9faXNfdW5pb24oVW5pb25BcikpXTsgfQogIHsgaW50IGFycltGKF9faXNfdW5pb24oY3ZvaWQpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3VuaW9uKEludEFyTkIpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3VuaW9uKEhhc0Fub255bW91c1VuaW9uKSldOyB9Cn0KCnR5cGVkZWYgRW51bSBFbnVtVHlwZTsKCnZvaWQgaXNfZW51bSgpCnsKICB7IGludCBhcnJbVChfX2lzX2VudW0oRW51bSkpXTsgfQogIHsgaW50IGFycltUKF9faXNfZW51bShFbnVtVHlwZSkpXTsgfQoKICB7IGludCBhcnJbRihfX2lzX2VudW0oaW50KSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19lbnVtKFVuaW9uKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19lbnVtKEludCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfZW51bShJbnRBcikpXTsgfQogIHsgaW50IGFycltGKF9faXNfZW51bShVbmlvbkFyKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19lbnVtKERlcml2ZXMpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2VudW0oQ2xhc3NUeXBlKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19lbnVtKGN2b2lkKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19lbnVtKEludEFyTkIpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2VudW0oSGFzQW5vbnltb3VzVW5pb24pKV07IH0KfQoKc3RydWN0IEZpbmFsQ2xhc3MgZmluYWwgewp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gCnN0cnVjdCBQb3RlbnRpYWxseUZpbmFsIHsgfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBQb3RlbnRpYWxseUZpbmFsPFQqPiBmaW5hbCB7IH07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBQb3RlbnRpYWxseUZpbmFsPGludD4gZmluYWwgeyB9OwoKdm9pZCBpc19maW5hbCgpCnsKCXsgaW50IGFycltUKF9faXNfZmluYWwoRmluYWxDbGFzcykpXTsgfQoJeyBpbnQgYXJyW1QoX19pc19maW5hbChQb3RlbnRpYWxseUZpbmFsPGZsb2F0Kj4pKV07IH0KCXsgaW50IGFycltUKF9faXNfZmluYWwoUG90ZW50aWFsbHlGaW5hbDxpbnQ+KSldOyB9CgoJeyBpbnQgYXJyW0YoX19pc19maW5hbChpbnQpKV07IH0KCXsgaW50IGFycltGKF9faXNfZmluYWwoVW5pb24pKV07IH0KCXsgaW50IGFycltGKF9faXNfZmluYWwoSW50KSldOyB9Cgl7IGludCBhcnJbRihfX2lzX2ZpbmFsKEludEFyKSldOyB9Cgl7IGludCBhcnJbRihfX2lzX2ZpbmFsKFVuaW9uQXIpKV07IH0KCXsgaW50IGFycltGKF9faXNfZmluYWwoRGVyaXZlcykpXTsgfQoJeyBpbnQgYXJyW0YoX19pc19maW5hbChDbGFzc1R5cGUpKV07IH0KCXsgaW50IGFycltGKF9faXNfZmluYWwoY3ZvaWQpKV07IH0KCXsgaW50IGFycltGKF9faXNfZmluYWwoSW50QXJOQikpXTsgfQoJeyBpbnQgYXJyW0YoX19pc19maW5hbChIYXNBbm9ueW1vdXNVbmlvbikpXTsgfQoJeyBpbnQgYXJyW0YoX19pc19maW5hbChQb3RlbnRpYWxseUZpbmFsPGZsb2F0PikpXTsgfQp9Cgp0eXBlZGVmIEhhc1ZpcnQgUG9seW1vcnBoOwpzdHJ1Y3QgSW5oZXJpdFBvbHltb3JwaCA6IFBvbHltb3JwaCB7fTsKCnZvaWQgaXNfcG9seW1vcnBoaWMoKQp7CiAgeyBpbnQgYXJyW1QoX19pc19wb2x5bW9ycGhpYyhQb2x5bW9ycGgpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3BvbHltb3JwaGljKEluaGVyaXRQb2x5bW9ycGgpKV07IH0KCiAgeyBpbnQgYXJyW0YoX19pc19wb2x5bW9ycGhpYyhpbnQpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3BvbHltb3JwaGljKFVuaW9uKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19wb2x5bW9ycGhpYyhJbnQpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3BvbHltb3JwaGljKEludEFyKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19wb2x5bW9ycGhpYyhVbmlvbkFyKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19wb2x5bW9ycGhpYyhEZXJpdmVzKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19wb2x5bW9ycGhpYyhDbGFzc1R5cGUpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3BvbHltb3JwaGljKEVudW0pKV07IH0KICB7IGludCBhcnJbRihfX2lzX3BvbHltb3JwaGljKGN2b2lkKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19wb2x5bW9ycGhpYyhJbnRBck5CKSldOyB9Cn0KCnZvaWQgaXNfaW50ZWdyYWwoKQp7CiAgaW50IHQwMVtUKF9faXNfaW50ZWdyYWwoYm9vbCkpXTsKICBpbnQgdDAyW1QoX19pc19pbnRlZ3JhbChjaGFyKSldOwogIGludCB0MDNbVChfX2lzX2ludGVncmFsKHNpZ25lZCBjaGFyKSldOwogIGludCB0MDRbVChfX2lzX2ludGVncmFsKHVuc2lnbmVkIGNoYXIpKV07CiAgLy9pbnQgdDA1W1QoX19pc19pbnRlZ3JhbChjaGFyMTZfdCkpXTsKICAvL2ludCB0MDZbVChfX2lzX2ludGVncmFsKGNoYXIzMl90KSldOwogIGludCB0MDdbVChfX2lzX2ludGVncmFsKHdjaGFyX3QpKV07CiAgaW50IHQwOFtUKF9faXNfaW50ZWdyYWwoc2hvcnQpKV07CiAgaW50IHQwOVtUKF9faXNfaW50ZWdyYWwodW5zaWduZWQgc2hvcnQpKV07CiAgaW50IHQxMFtUKF9faXNfaW50ZWdyYWwoaW50KSldOwogIGludCB0MTFbVChfX2lzX2ludGVncmFsKHVuc2lnbmVkIGludCkpXTsKICBpbnQgdDEyW1QoX19pc19pbnRlZ3JhbChsb25nKSldOwogIGludCB0MTNbVChfX2lzX2ludGVncmFsKHVuc2lnbmVkIGxvbmcpKV07CgogIGludCB0MjFbRihfX2lzX2ludGVncmFsKGZsb2F0KSldOwogIGludCB0MjJbRihfX2lzX2ludGVncmFsKGRvdWJsZSkpXTsKICBpbnQgdDIzW0YoX19pc19pbnRlZ3JhbChsb25nIGRvdWJsZSkpXTsKICBpbnQgdDI0W0YoX19pc19pbnRlZ3JhbChVbmlvbikpXTsKICBpbnQgdDI1W0YoX19pc19pbnRlZ3JhbChVbmlvbkFyKSldOwogIGludCB0MjZbRihfX2lzX2ludGVncmFsKERlcml2ZXMpKV07CiAgaW50IHQyN1tGKF9faXNfaW50ZWdyYWwoQ2xhc3NUeXBlKSldOwogIGludCB0MjhbRihfX2lzX2ludGVncmFsKEVudW0pKV07CiAgaW50IHQyOVtGKF9faXNfaW50ZWdyYWwodm9pZCkpXTsKICBpbnQgdDMwW0YoX19pc19pbnRlZ3JhbChjdm9pZCkpXTsKICBpbnQgdDMxW0YoX19pc19pbnRlZ3JhbChJbnRBck5CKSldOwp9Cgp2b2lkIGlzX2Zsb2F0aW5nX3BvaW50KCkKewogIGludCB0MDFbVChfX2lzX2Zsb2F0aW5nX3BvaW50KGZsb2F0KSldOwogIGludCB0MDJbVChfX2lzX2Zsb2F0aW5nX3BvaW50KGRvdWJsZSkpXTsKICBpbnQgdDAzW1QoX19pc19mbG9hdGluZ19wb2ludChsb25nIGRvdWJsZSkpXTsKCiAgaW50IHQxMVtGKF9faXNfZmxvYXRpbmdfcG9pbnQoYm9vbCkpXTsKICBpbnQgdDEyW0YoX19pc19mbG9hdGluZ19wb2ludChjaGFyKSldOwogIGludCB0MTNbRihfX2lzX2Zsb2F0aW5nX3BvaW50KHNpZ25lZCBjaGFyKSldOwogIGludCB0MTRbRihfX2lzX2Zsb2F0aW5nX3BvaW50KHVuc2lnbmVkIGNoYXIpKV07CiAgLy9pbnQgdDE1W0YoX19pc19mbG9hdGluZ19wb2ludChjaGFyMTZfdCkpXTsKICAvL2ludCB0MTZbRihfX2lzX2Zsb2F0aW5nX3BvaW50KGNoYXIzMl90KSldOwogIGludCB0MTdbRihfX2lzX2Zsb2F0aW5nX3BvaW50KHdjaGFyX3QpKV07CiAgaW50IHQxOFtGKF9faXNfZmxvYXRpbmdfcG9pbnQoc2hvcnQpKV07CiAgaW50IHQxOVtGKF9faXNfZmxvYXRpbmdfcG9pbnQodW5zaWduZWQgc2hvcnQpKV07CiAgaW50IHQyMFtGKF9faXNfZmxvYXRpbmdfcG9pbnQoaW50KSldOwogIGludCB0MjFbRihfX2lzX2Zsb2F0aW5nX3BvaW50KHVuc2lnbmVkIGludCkpXTsKICBpbnQgdDIyW0YoX19pc19mbG9hdGluZ19wb2ludChsb25nKSldOwogIGludCB0MjNbRihfX2lzX2Zsb2F0aW5nX3BvaW50KHVuc2lnbmVkIGxvbmcpKV07CiAgaW50IHQyNFtGKF9faXNfZmxvYXRpbmdfcG9pbnQoVW5pb24pKV07CiAgaW50IHQyNVtGKF9faXNfZmxvYXRpbmdfcG9pbnQoVW5pb25BcikpXTsKICBpbnQgdDI2W0YoX19pc19mbG9hdGluZ19wb2ludChEZXJpdmVzKSldOwogIGludCB0MjdbRihfX2lzX2Zsb2F0aW5nX3BvaW50KENsYXNzVHlwZSkpXTsKICBpbnQgdDI4W0YoX19pc19mbG9hdGluZ19wb2ludChFbnVtKSldOwogIGludCB0MjlbRihfX2lzX2Zsb2F0aW5nX3BvaW50KHZvaWQpKV07CiAgaW50IHQzMFtGKF9faXNfZmxvYXRpbmdfcG9pbnQoY3ZvaWQpKV07CiAgaW50IHQzMVtGKF9faXNfZmxvYXRpbmdfcG9pbnQoSW50QXJOQikpXTsKfQoKdm9pZCBpc19hcml0aG1ldGljKCkKewogIGludCB0MDFbVChfX2lzX2FyaXRobWV0aWMoZmxvYXQpKV07CiAgaW50IHQwMltUKF9faXNfYXJpdGhtZXRpYyhkb3VibGUpKV07CiAgaW50IHQwM1tUKF9faXNfYXJpdGhtZXRpYyhsb25nIGRvdWJsZSkpXTsKICBpbnQgdDExW1QoX19pc19hcml0aG1ldGljKGJvb2wpKV07CiAgaW50IHQxMltUKF9faXNfYXJpdGhtZXRpYyhjaGFyKSldOwogIGludCB0MTNbVChfX2lzX2FyaXRobWV0aWMoc2lnbmVkIGNoYXIpKV07CiAgaW50IHQxNFtUKF9faXNfYXJpdGhtZXRpYyh1bnNpZ25lZCBjaGFyKSldOwogIC8vaW50IHQxNVtUKF9faXNfYXJpdGhtZXRpYyhjaGFyMTZfdCkpXTsKICAvL2ludCB0MTZbVChfX2lzX2FyaXRobWV0aWMoY2hhcjMyX3QpKV07CiAgaW50IHQxN1tUKF9faXNfYXJpdGhtZXRpYyh3Y2hhcl90KSldOwogIGludCB0MThbVChfX2lzX2FyaXRobWV0aWMoc2hvcnQpKV07CiAgaW50IHQxOVtUKF9faXNfYXJpdGhtZXRpYyh1bnNpZ25lZCBzaG9ydCkpXTsKICBpbnQgdDIwW1QoX19pc19hcml0aG1ldGljKGludCkpXTsKICBpbnQgdDIxW1QoX19pc19hcml0aG1ldGljKHVuc2lnbmVkIGludCkpXTsKICBpbnQgdDIyW1QoX19pc19hcml0aG1ldGljKGxvbmcpKV07CiAgaW50IHQyM1tUKF9faXNfYXJpdGhtZXRpYyh1bnNpZ25lZCBsb25nKSldOwoKICBpbnQgdDI0W0YoX19pc19hcml0aG1ldGljKFVuaW9uKSldOwogIGludCB0MjVbRihfX2lzX2FyaXRobWV0aWMoVW5pb25BcikpXTsKICBpbnQgdDI2W0YoX19pc19hcml0aG1ldGljKERlcml2ZXMpKV07CiAgaW50IHQyN1tGKF9faXNfYXJpdGhtZXRpYyhDbGFzc1R5cGUpKV07CiAgaW50IHQyOFtGKF9faXNfYXJpdGhtZXRpYyhFbnVtKSldOwogIGludCB0MjlbRihfX2lzX2FyaXRobWV0aWModm9pZCkpXTsKICBpbnQgdDMwW0YoX19pc19hcml0aG1ldGljKGN2b2lkKSldOwogIGludCB0MzFbRihfX2lzX2FyaXRobWV0aWMoSW50QXJOQikpXTsKfQoKc3RydWN0IEFDb21wbGV0ZVR5cGUge307CnN0cnVjdCBBbkluY29tcGxldGVUeXBlOwoKdm9pZCBpc19jb21wbGV0ZV90eXBlKCkKewogIGludCB0MDFbVChfX2lzX2NvbXBsZXRlX3R5cGUoZmxvYXQpKV07CiAgaW50IHQwMltUKF9faXNfY29tcGxldGVfdHlwZShkb3VibGUpKV07CiAgaW50IHQwM1tUKF9faXNfY29tcGxldGVfdHlwZShsb25nIGRvdWJsZSkpXTsKICBpbnQgdDExW1QoX19pc19jb21wbGV0ZV90eXBlKGJvb2wpKV07CiAgaW50IHQxMltUKF9faXNfY29tcGxldGVfdHlwZShjaGFyKSldOwogIGludCB0MTNbVChfX2lzX2NvbXBsZXRlX3R5cGUoc2lnbmVkIGNoYXIpKV07CiAgaW50IHQxNFtUKF9faXNfY29tcGxldGVfdHlwZSh1bnNpZ25lZCBjaGFyKSldOwogIC8vaW50IHQxNVtUKF9faXNfY29tcGxldGVfdHlwZShjaGFyMTZfdCkpXTsKICAvL2ludCB0MTZbVChfX2lzX2NvbXBsZXRlX3R5cGUoY2hhcjMyX3QpKV07CiAgaW50IHQxN1tUKF9faXNfY29tcGxldGVfdHlwZSh3Y2hhcl90KSldOwogIGludCB0MThbVChfX2lzX2NvbXBsZXRlX3R5cGUoc2hvcnQpKV07CiAgaW50IHQxOVtUKF9faXNfY29tcGxldGVfdHlwZSh1bnNpZ25lZCBzaG9ydCkpXTsKICBpbnQgdDIwW1QoX19pc19jb21wbGV0ZV90eXBlKGludCkpXTsKICBpbnQgdDIxW1QoX19pc19jb21wbGV0ZV90eXBlKHVuc2lnbmVkIGludCkpXTsKICBpbnQgdDIyW1QoX19pc19jb21wbGV0ZV90eXBlKGxvbmcpKV07CiAgaW50IHQyM1tUKF9faXNfY29tcGxldGVfdHlwZSh1bnNpZ25lZCBsb25nKSldOwogIGludCB0MjRbVChfX2lzX2NvbXBsZXRlX3R5cGUoQUNvbXBsZXRlVHlwZSkpXTsKCiAgaW50IHQzMFtGKF9faXNfY29tcGxldGVfdHlwZShBbkluY29tcGxldGVUeXBlKSldOwp9Cgp2b2lkIGlzX3ZvaWQoKQp7CiAgaW50IHQwMVtUKF9faXNfdm9pZCh2b2lkKSldOwogIGludCB0MDJbVChfX2lzX3ZvaWQoY3ZvaWQpKV07CgogIGludCB0MTBbRihfX2lzX3ZvaWQoZmxvYXQpKV07CiAgaW50IHQxMVtGKF9faXNfdm9pZChkb3VibGUpKV07CiAgaW50IHQxMltGKF9faXNfdm9pZChsb25nIGRvdWJsZSkpXTsKICBpbnQgdDEzW0YoX19pc192b2lkKGJvb2wpKV07CiAgaW50IHQxNFtGKF9faXNfdm9pZChjaGFyKSldOwogIGludCB0MTVbRihfX2lzX3ZvaWQoc2lnbmVkIGNoYXIpKV07CiAgaW50IHQxNltGKF9faXNfdm9pZCh1bnNpZ25lZCBjaGFyKSldOwogIGludCB0MTdbRihfX2lzX3ZvaWQod2NoYXJfdCkpXTsKICBpbnQgdDE4W0YoX19pc192b2lkKHNob3J0KSldOwogIGludCB0MTlbRihfX2lzX3ZvaWQodW5zaWduZWQgc2hvcnQpKV07CiAgaW50IHQyMFtGKF9faXNfdm9pZChpbnQpKV07CiAgaW50IHQyMVtGKF9faXNfdm9pZCh1bnNpZ25lZCBpbnQpKV07CiAgaW50IHQyMltGKF9faXNfdm9pZChsb25nKSldOwogIGludCB0MjNbRihfX2lzX3ZvaWQodW5zaWduZWQgbG9uZykpXTsKICBpbnQgdDI0W0YoX19pc192b2lkKFVuaW9uKSldOwogIGludCB0MjVbRihfX2lzX3ZvaWQoVW5pb25BcikpXTsKICBpbnQgdDI2W0YoX19pc192b2lkKERlcml2ZXMpKV07CiAgaW50IHQyN1tGKF9faXNfdm9pZChDbGFzc1R5cGUpKV07CiAgaW50IHQyOFtGKF9faXNfdm9pZChFbnVtKSldOwogIGludCB0MjlbRihfX2lzX3ZvaWQoSW50QXJOQikpXTsKICBpbnQgdDMwW0YoX19pc192b2lkKHZvaWQqKSldOwogIGludCB0MzFbRihfX2lzX3ZvaWQoY3ZvaWQqKSldOwp9Cgp2b2lkIGlzX2FycmF5KCkKewogIGludCB0MDFbVChfX2lzX2FycmF5KEludEFyKSldOwogIGludCB0MDJbVChfX2lzX2FycmF5KEludEFyTkIpKV07CiAgaW50IHQwM1tUKF9faXNfYXJyYXkoVW5pb25BcikpXTsKCiAgaW50IHQxMFtGKF9faXNfYXJyYXkodm9pZCkpXTsKICBpbnQgdDExW0YoX19pc19hcnJheShjdm9pZCkpXTsKICBpbnQgdDEyW0YoX19pc19hcnJheShmbG9hdCkpXTsKICBpbnQgdDEzW0YoX19pc19hcnJheShkb3VibGUpKV07CiAgaW50IHQxNFtGKF9faXNfYXJyYXkobG9uZyBkb3VibGUpKV07CiAgaW50IHQxNVtGKF9faXNfYXJyYXkoYm9vbCkpXTsKICBpbnQgdDE2W0YoX19pc19hcnJheShjaGFyKSldOwogIGludCB0MTdbRihfX2lzX2FycmF5KHNpZ25lZCBjaGFyKSldOwogIGludCB0MThbRihfX2lzX2FycmF5KHVuc2lnbmVkIGNoYXIpKV07CiAgaW50IHQxOVtGKF9faXNfYXJyYXkod2NoYXJfdCkpXTsKICBpbnQgdDIwW0YoX19pc19hcnJheShzaG9ydCkpXTsKICBpbnQgdDIxW0YoX19pc19hcnJheSh1bnNpZ25lZCBzaG9ydCkpXTsKICBpbnQgdDIyW0YoX19pc19hcnJheShpbnQpKV07CiAgaW50IHQyM1tGKF9faXNfYXJyYXkodW5zaWduZWQgaW50KSldOwogIGludCB0MjRbRihfX2lzX2FycmF5KGxvbmcpKV07CiAgaW50IHQyNVtGKF9faXNfYXJyYXkodW5zaWduZWQgbG9uZykpXTsKICBpbnQgdDI2W0YoX19pc19hcnJheShVbmlvbikpXTsKICBpbnQgdDI3W0YoX19pc19hcnJheShEZXJpdmVzKSldOwogIGludCB0MjhbRihfX2lzX2FycmF5KENsYXNzVHlwZSkpXTsKICBpbnQgdDI5W0YoX19pc19hcnJheShFbnVtKSldOwogIGludCB0MzBbRihfX2lzX2FycmF5KHZvaWQqKSldOwogIGludCB0MzFbRihfX2lzX2FycmF5KGN2b2lkKikpXTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgdG1wbF9mdW5jKFQmKSB7fQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCB0eXBlX3dyYXBwZXIgewogIHR5cGVkZWYgVCB0eXBlOwogIHR5cGVkZWYgVCogcHRydHlwZTsKICB0eXBlZGVmIFQmIHJlZnR5cGU7Cn07Cgp2b2lkIGlzX2Z1bmN0aW9uKCkKewogIGludCB0MDFbVChfX2lzX2Z1bmN0aW9uKHR5cGVfd3JhcHBlcjx2b2lkKHZvaWQpPjo6dHlwZSkpXTsKICBpbnQgdDAyW1QoX19pc19mdW5jdGlvbih0eXBlb2YodG1wbF9mdW5jPGludD4pKSldOwoKICB0eXBlZGVmIHZvaWQgKCpwdHJfdG9fZnVuY190eXBlKSh2b2lkKTsKCiAgaW50IHQxMFtGKF9faXNfZnVuY3Rpb24odm9pZCkpXTsKICBpbnQgdDExW0YoX19pc19mdW5jdGlvbihjdm9pZCkpXTsKICBpbnQgdDEyW0YoX19pc19mdW5jdGlvbihmbG9hdCkpXTsKICBpbnQgdDEzW0YoX19pc19mdW5jdGlvbihkb3VibGUpKV07CiAgaW50IHQxNFtGKF9faXNfZnVuY3Rpb24obG9uZyBkb3VibGUpKV07CiAgaW50IHQxNVtGKF9faXNfZnVuY3Rpb24oYm9vbCkpXTsKICBpbnQgdDE2W0YoX19pc19mdW5jdGlvbihjaGFyKSldOwogIGludCB0MTdbRihfX2lzX2Z1bmN0aW9uKHNpZ25lZCBjaGFyKSldOwogIGludCB0MThbRihfX2lzX2Z1bmN0aW9uKHVuc2lnbmVkIGNoYXIpKV07CiAgaW50IHQxOVtGKF9faXNfZnVuY3Rpb24od2NoYXJfdCkpXTsKICBpbnQgdDIwW0YoX19pc19mdW5jdGlvbihzaG9ydCkpXTsKICBpbnQgdDIxW0YoX19pc19mdW5jdGlvbih1bnNpZ25lZCBzaG9ydCkpXTsKICBpbnQgdDIyW0YoX19pc19mdW5jdGlvbihpbnQpKV07CiAgaW50IHQyM1tGKF9faXNfZnVuY3Rpb24odW5zaWduZWQgaW50KSldOwogIGludCB0MjRbRihfX2lzX2Z1bmN0aW9uKGxvbmcpKV07CiAgaW50IHQyNVtGKF9faXNfZnVuY3Rpb24odW5zaWduZWQgbG9uZykpXTsKICBpbnQgdDI2W0YoX19pc19mdW5jdGlvbihVbmlvbikpXTsKICBpbnQgdDI3W0YoX19pc19mdW5jdGlvbihEZXJpdmVzKSldOwogIGludCB0MjhbRihfX2lzX2Z1bmN0aW9uKENsYXNzVHlwZSkpXTsKICBpbnQgdDI5W0YoX19pc19mdW5jdGlvbihFbnVtKSldOwogIGludCB0MzBbRihfX2lzX2Z1bmN0aW9uKHZvaWQqKSldOwogIGludCB0MzFbRihfX2lzX2Z1bmN0aW9uKGN2b2lkKikpXTsKICBpbnQgdDMyW0YoX19pc19mdW5jdGlvbih2b2lkKCopKCkpKV07CiAgaW50IHQzM1tGKF9faXNfZnVuY3Rpb24ocHRyX3RvX2Z1bmNfdHlwZSkpXTsKICBpbnQgdDM0W0YoX19pc19mdW5jdGlvbih0eXBlX3dyYXBwZXI8dm9pZCh2b2lkKT46OnB0cnR5cGUpKV07CiAgaW50IHQzNVtGKF9faXNfZnVuY3Rpb24odHlwZV93cmFwcGVyPHZvaWQodm9pZCk+OjpyZWZ0eXBlKSldOwp9Cgp2b2lkIGlzX3JlZmVyZW5jZSgpCnsKICBpbnQgdDAxW1QoX19pc19yZWZlcmVuY2UoaW50JikpXTsKICBpbnQgdDAyW1QoX19pc19yZWZlcmVuY2UoY29uc3QgaW50JikpXTsKICBpbnQgdDAzW1QoX19pc19yZWZlcmVuY2Uodm9pZCAqJikpXTsKCiAgaW50IHQxMFtGKF9faXNfcmVmZXJlbmNlKGludCkpXTsKICBpbnQgdDExW0YoX19pc19yZWZlcmVuY2UoY29uc3QgaW50KSldOwogIGludCB0MTJbRihfX2lzX3JlZmVyZW5jZSh2b2lkICopKV07Cn0KCnZvaWQgaXNfbHZhbHVlX3JlZmVyZW5jZSgpCnsKICBpbnQgdDAxW1QoX19pc19sdmFsdWVfcmVmZXJlbmNlKGludCYpKV07CiAgaW50IHQwMltUKF9faXNfbHZhbHVlX3JlZmVyZW5jZSh2b2lkIComKSldOwogIGludCB0MDNbVChfX2lzX2x2YWx1ZV9yZWZlcmVuY2UoY29uc3QgaW50JikpXTsKICBpbnQgdDA0W1QoX19pc19sdmFsdWVfcmVmZXJlbmNlKHZvaWQgKiBjb25zdCAmKSldOwoKICBpbnQgdDEwW0YoX19pc19sdmFsdWVfcmVmZXJlbmNlKGludCkpXTsKICBpbnQgdDExW0YoX19pc19sdmFsdWVfcmVmZXJlbmNlKGNvbnN0IGludCkpXTsKICBpbnQgdDEyW0YoX19pc19sdmFsdWVfcmVmZXJlbmNlKHZvaWQgKikpXTsKfQoKI2lmIF9faGFzX2ZlYXR1cmUoY3h4X3J2YWx1ZV9yZWZlcmVuY2VzKQoKdm9pZCBpc19ydmFsdWVfcmVmZXJlbmNlKCkKewogIGludCB0MDFbVChfX2lzX3J2YWx1ZV9yZWZlcmVuY2UoY29uc3QgaW50JiYpKV07CiAgaW50IHQwMltUKF9faXNfcnZhbHVlX3JlZmVyZW5jZSh2b2lkICogY29uc3QgJiYpKV07CgogIGludCB0MTBbRihfX2lzX3J2YWx1ZV9yZWZlcmVuY2UoaW50JikpXTsKICBpbnQgdDExW0YoX19pc19ydmFsdWVfcmVmZXJlbmNlKHZvaWQgKiYpKV07CiAgaW50IHQxMltGKF9faXNfcnZhbHVlX3JlZmVyZW5jZShjb25zdCBpbnQmKSldOwogIGludCB0MTNbRihfX2lzX3J2YWx1ZV9yZWZlcmVuY2Uodm9pZCAqIGNvbnN0ICYpKV07CiAgaW50IHQxNFtGKF9faXNfcnZhbHVlX3JlZmVyZW5jZShpbnQpKV07CiAgaW50IHQxNVtGKF9faXNfcnZhbHVlX3JlZmVyZW5jZShjb25zdCBpbnQpKV07CiAgaW50IHQxNltGKF9faXNfcnZhbHVlX3JlZmVyZW5jZSh2b2lkICopKV07Cn0KCiNlbmRpZgoKdm9pZCBpc19mdW5kYW1lbnRhbCgpCnsKICBpbnQgdDAxW1QoX19pc19mdW5kYW1lbnRhbChmbG9hdCkpXTsKICBpbnQgdDAyW1QoX19pc19mdW5kYW1lbnRhbChkb3VibGUpKV07CiAgaW50IHQwM1tUKF9faXNfZnVuZGFtZW50YWwobG9uZyBkb3VibGUpKV07CiAgaW50IHQxMVtUKF9faXNfZnVuZGFtZW50YWwoYm9vbCkpXTsKICBpbnQgdDEyW1QoX19pc19mdW5kYW1lbnRhbChjaGFyKSldOwogIGludCB0MTNbVChfX2lzX2Z1bmRhbWVudGFsKHNpZ25lZCBjaGFyKSldOwogIGludCB0MTRbVChfX2lzX2Z1bmRhbWVudGFsKHVuc2lnbmVkIGNoYXIpKV07CiAgLy9pbnQgdDE1W1QoX19pc19mdW5kYW1lbnRhbChjaGFyMTZfdCkpXTsKICAvL2ludCB0MTZbVChfX2lzX2Z1bmRhbWVudGFsKGNoYXIzMl90KSldOwogIGludCB0MTdbVChfX2lzX2Z1bmRhbWVudGFsKHdjaGFyX3QpKV07CiAgaW50IHQxOFtUKF9faXNfZnVuZGFtZW50YWwoc2hvcnQpKV07CiAgaW50IHQxOVtUKF9faXNfZnVuZGFtZW50YWwodW5zaWduZWQgc2hvcnQpKV07CiAgaW50IHQyMFtUKF9faXNfZnVuZGFtZW50YWwoaW50KSldOwogIGludCB0MjFbVChfX2lzX2Z1bmRhbWVudGFsKHVuc2lnbmVkIGludCkpXTsKICBpbnQgdDIyW1QoX19pc19mdW5kYW1lbnRhbChsb25nKSldOwogIGludCB0MjNbVChfX2lzX2Z1bmRhbWVudGFsKHVuc2lnbmVkIGxvbmcpKV07CiAgaW50IHQyNFtUKF9faXNfZnVuZGFtZW50YWwodm9pZCkpXTsKICBpbnQgdDI1W1QoX19pc19mdW5kYW1lbnRhbChjdm9pZCkpXTsKCiAgaW50IHQzMFtGKF9faXNfZnVuZGFtZW50YWwoVW5pb24pKV07CiAgaW50IHQzMVtGKF9faXNfZnVuZGFtZW50YWwoVW5pb25BcikpXTsKICBpbnQgdDMyW0YoX19pc19mdW5kYW1lbnRhbChEZXJpdmVzKSldOwogIGludCB0MzNbRihfX2lzX2Z1bmRhbWVudGFsKENsYXNzVHlwZSkpXTsKICBpbnQgdDM0W0YoX19pc19mdW5kYW1lbnRhbChFbnVtKSldOwogIGludCB0MzVbRihfX2lzX2Z1bmRhbWVudGFsKEludEFyTkIpKV07Cn0KCnZvaWQgaXNfb2JqZWN0KCkKewogIGludCB0MDFbVChfX2lzX29iamVjdChpbnQpKV07CiAgaW50IHQwMltUKF9faXNfb2JqZWN0KGludCAqKSldOwogIGludCB0MDNbVChfX2lzX29iamVjdCh2b2lkICopKV07CiAgaW50IHQwNFtUKF9faXNfb2JqZWN0KFVuaW9uKSldOwogIGludCB0MDVbVChfX2lzX29iamVjdChVbmlvbkFyKSldOwogIGludCB0MDZbVChfX2lzX29iamVjdChDbGFzc1R5cGUpKV07CiAgaW50IHQwN1tUKF9faXNfb2JqZWN0KEVudW0pKV07CgogIGludCB0MTBbRihfX2lzX29iamVjdCh0eXBlX3dyYXBwZXI8dm9pZCh2b2lkKT46OnR5cGUpKV07CiAgaW50IHQxMVtGKF9faXNfb2JqZWN0KGludCYpKV07CiAgaW50IHQxMltGKF9faXNfb2JqZWN0KHZvaWQpKV07Cn0KCnZvaWQgaXNfc2NhbGFyKCkKewogIGludCB0MDFbVChfX2lzX3NjYWxhcihmbG9hdCkpXTsKICBpbnQgdDAyW1QoX19pc19zY2FsYXIoZG91YmxlKSldOwogIGludCB0MDNbVChfX2lzX3NjYWxhcihsb25nIGRvdWJsZSkpXTsKICBpbnQgdDA0W1QoX19pc19zY2FsYXIoYm9vbCkpXTsKICBpbnQgdDA1W1QoX19pc19zY2FsYXIoY2hhcikpXTsKICBpbnQgdDA2W1QoX19pc19zY2FsYXIoc2lnbmVkIGNoYXIpKV07CiAgaW50IHQwN1tUKF9faXNfc2NhbGFyKHVuc2lnbmVkIGNoYXIpKV07CiAgaW50IHQwOFtUKF9faXNfc2NhbGFyKHdjaGFyX3QpKV07CiAgaW50IHQwOVtUKF9faXNfc2NhbGFyKHNob3J0KSldOwogIGludCB0MTBbVChfX2lzX3NjYWxhcih1bnNpZ25lZCBzaG9ydCkpXTsKICBpbnQgdDExW1QoX19pc19zY2FsYXIoaW50KSldOwogIGludCB0MTJbVChfX2lzX3NjYWxhcih1bnNpZ25lZCBpbnQpKV07CiAgaW50IHQxM1tUKF9faXNfc2NhbGFyKGxvbmcpKV07CiAgaW50IHQxNFtUKF9faXNfc2NhbGFyKHVuc2lnbmVkIGxvbmcpKV07CiAgaW50IHQxNVtUKF9faXNfc2NhbGFyKEVudW0pKV07CiAgaW50IHQxNltUKF9faXNfc2NhbGFyKHZvaWQqKSldOwogIGludCB0MTdbVChfX2lzX3NjYWxhcihjdm9pZCopKV07CgogIGludCB0MjBbRihfX2lzX3NjYWxhcih2b2lkKSldOwogIGludCB0MjFbRihfX2lzX3NjYWxhcihjdm9pZCkpXTsKICBpbnQgdDIyW0YoX19pc19zY2FsYXIoVW5pb24pKV07CiAgaW50IHQyM1tGKF9faXNfc2NhbGFyKFVuaW9uQXIpKV07CiAgaW50IHQyNFtGKF9faXNfc2NhbGFyKERlcml2ZXMpKV07CiAgaW50IHQyNVtGKF9faXNfc2NhbGFyKENsYXNzVHlwZSkpXTsKICBpbnQgdDI2W0YoX19pc19zY2FsYXIoSW50QXJOQikpXTsKfQoKc3RydWN0IFN0cnVjdFdpdGhNZW1iZXJzIHsKICBpbnQgbWVtYmVyOwogIHZvaWQgbWV0aG9kKCkge30KfTsKCnZvaWQgaXNfY29tcG91bmQoKQp7CiAgaW50IHQwMVtUKF9faXNfY29tcG91bmQodm9pZCopKV07CiAgaW50IHQwMltUKF9faXNfY29tcG91bmQoY3ZvaWQqKSldOwogIGludCB0MDNbVChfX2lzX2NvbXBvdW5kKHZvaWQgKCopKCkpKV07CiAgaW50IHQwNFtUKF9faXNfY29tcG91bmQoaW50IFN0cnVjdFdpdGhNZW1iZXJzOjoqKSldOwogIGludCB0MDVbVChfX2lzX2NvbXBvdW5kKHZvaWQgKFN0cnVjdFdpdGhNZW1iZXJzOjoqKSgpKSldOwogIGludCB0MDZbVChfX2lzX2NvbXBvdW5kKGludCYpKV07CiAgaW50IHQwN1tUKF9faXNfY29tcG91bmQoVW5pb24pKV07CiAgaW50IHQwOFtUKF9faXNfY29tcG91bmQoVW5pb25BcikpXTsKICBpbnQgdDA5W1QoX19pc19jb21wb3VuZChEZXJpdmVzKSldOwogIGludCB0MTBbVChfX2lzX2NvbXBvdW5kKENsYXNzVHlwZSkpXTsKICBpbnQgdDExW1QoX19pc19jb21wb3VuZChJbnRBck5CKSldOwogIGludCB0MTJbVChfX2lzX2NvbXBvdW5kKEVudW0pKV07CgogIGludCB0MjBbRihfX2lzX2NvbXBvdW5kKGZsb2F0KSldOwogIGludCB0MjFbRihfX2lzX2NvbXBvdW5kKGRvdWJsZSkpXTsKICBpbnQgdDIyW0YoX19pc19jb21wb3VuZChsb25nIGRvdWJsZSkpXTsKICBpbnQgdDIzW0YoX19pc19jb21wb3VuZChib29sKSldOwogIGludCB0MjRbRihfX2lzX2NvbXBvdW5kKGNoYXIpKV07CiAgaW50IHQyNVtGKF9faXNfY29tcG91bmQoc2lnbmVkIGNoYXIpKV07CiAgaW50IHQyNltGKF9faXNfY29tcG91bmQodW5zaWduZWQgY2hhcikpXTsKICBpbnQgdDI3W0YoX19pc19jb21wb3VuZCh3Y2hhcl90KSldOwogIGludCB0MjhbRihfX2lzX2NvbXBvdW5kKHNob3J0KSldOwogIGludCB0MjlbRihfX2lzX2NvbXBvdW5kKHVuc2lnbmVkIHNob3J0KSldOwogIGludCB0MzBbRihfX2lzX2NvbXBvdW5kKGludCkpXTsKICBpbnQgdDMxW0YoX19pc19jb21wb3VuZCh1bnNpZ25lZCBpbnQpKV07CiAgaW50IHQzMltGKF9faXNfY29tcG91bmQobG9uZykpXTsKICBpbnQgdDMzW0YoX19pc19jb21wb3VuZCh1bnNpZ25lZCBsb25nKSldOwogIGludCB0MzRbRihfX2lzX2NvbXBvdW5kKHZvaWQpKV07CiAgaW50IHQzNVtGKF9faXNfY29tcG91bmQoY3ZvaWQpKV07Cn0KCnZvaWQgaXNfcG9pbnRlcigpCnsKICBTdHJ1Y3RXaXRoTWVtYmVycyB4OwoKICBpbnQgdDAxW1QoX19pc19wb2ludGVyKHZvaWQqKSldOwogIGludCB0MDJbVChfX2lzX3BvaW50ZXIoY3ZvaWQqKSldOwogIGludCB0MDNbVChfX2lzX3BvaW50ZXIoY3ZvaWQqKSldOwogIGludCB0MDRbVChfX2lzX3BvaW50ZXIoY2hhciopKV07CiAgaW50IHQwNVtUKF9faXNfcG9pbnRlcihpbnQqKSldOwogIGludCB0MDZbVChfX2lzX3BvaW50ZXIoaW50KiopKV07CiAgaW50IHQwN1tUKF9faXNfcG9pbnRlcihDbGFzc1R5cGUqKSldOwogIGludCB0MDhbVChfX2lzX3BvaW50ZXIoRGVyaXZlcyopKV07CiAgaW50IHQwOVtUKF9faXNfcG9pbnRlcihFbnVtKikpXTsKICBpbnQgdDEwW1QoX19pc19wb2ludGVyKEludEFyTkIqKSldOwogIGludCB0MTFbVChfX2lzX3BvaW50ZXIoVW5pb24qKSldOwogIGludCB0MTJbVChfX2lzX3BvaW50ZXIoVW5pb25BciopKV07CiAgaW50IHQxM1tUKF9faXNfcG9pbnRlcihTdHJ1Y3RXaXRoTWVtYmVycyopKV07CiAgaW50IHQxNFtUKF9faXNfcG9pbnRlcih2b2lkICgqKSgpKSldOwoKICBpbnQgdDIwW0YoX19pc19wb2ludGVyKHZvaWQpKV07CiAgaW50IHQyMVtGKF9faXNfcG9pbnRlcihjdm9pZCkpXTsKICBpbnQgdDIyW0YoX19pc19wb2ludGVyKGN2b2lkKSldOwogIGludCB0MjNbRihfX2lzX3BvaW50ZXIoY2hhcikpXTsKICBpbnQgdDI0W0YoX19pc19wb2ludGVyKGludCkpXTsKICBpbnQgdDI1W0YoX19pc19wb2ludGVyKGludCkpXTsKICBpbnQgdDI2W0YoX19pc19wb2ludGVyKENsYXNzVHlwZSkpXTsKICBpbnQgdDI3W0YoX19pc19wb2ludGVyKERlcml2ZXMpKV07CiAgaW50IHQyOFtGKF9faXNfcG9pbnRlcihFbnVtKSldOwogIGludCB0MjlbRihfX2lzX3BvaW50ZXIoSW50QXJOQikpXTsKICBpbnQgdDMwW0YoX19pc19wb2ludGVyKFVuaW9uKSldOwogIGludCB0MzFbRihfX2lzX3BvaW50ZXIoVW5pb25BcikpXTsKICBpbnQgdDMyW0YoX19pc19wb2ludGVyKFN0cnVjdFdpdGhNZW1iZXJzKSldOwogIGludCB0MzNbRihfX2lzX3BvaW50ZXIoaW50IFN0cnVjdFdpdGhNZW1iZXJzOjoqKSldOwogIGludCB0MzRbRihfX2lzX3BvaW50ZXIodm9pZCAoU3RydWN0V2l0aE1lbWJlcnM6OiopICgpKSldOwp9Cgp2b2lkIGlzX21lbWJlcl9vYmplY3RfcG9pbnRlcigpCnsKICBTdHJ1Y3RXaXRoTWVtYmVycyB4OwoKICBpbnQgdDAxW1QoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIoaW50IFN0cnVjdFdpdGhNZW1iZXJzOjoqKSldOwoKICBpbnQgdDEwW0YoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIodm9pZCAoU3RydWN0V2l0aE1lbWJlcnM6OiopICgpKSldOwogIGludCB0MTFbRihfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcih2b2lkKikpXTsKICBpbnQgdDEyW0YoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIoY3ZvaWQqKSldOwogIGludCB0MTNbRihfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcihjdm9pZCopKV07CiAgaW50IHQxNFtGKF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyKGNoYXIqKSldOwogIGludCB0MTVbRihfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcihpbnQqKSldOwogIGludCB0MTZbRihfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcihpbnQqKikpXTsKICBpbnQgdDE3W0YoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIoQ2xhc3NUeXBlKikpXTsKICBpbnQgdDE4W0YoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIoRGVyaXZlcyopKV07CiAgaW50IHQxOVtGKF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyKEVudW0qKSldOwogIGludCB0MjBbRihfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcihJbnRBck5CKikpXTsKICBpbnQgdDIxW0YoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIoVW5pb24qKSldOwogIGludCB0MjJbRihfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcihVbmlvbkFyKikpXTsKICBpbnQgdDIzW0YoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIoU3RydWN0V2l0aE1lbWJlcnMqKSldOwogIGludCB0MjRbRihfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcih2b2lkKSldOwogIGludCB0MjVbRihfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcihjdm9pZCkpXTsKICBpbnQgdDI2W0YoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIoY3ZvaWQpKV07CiAgaW50IHQyN1tGKF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyKGNoYXIpKV07CiAgaW50IHQyOFtGKF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyKGludCkpXTsKICBpbnQgdDI5W0YoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIoaW50KSldOwogIGludCB0MzBbRihfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcihDbGFzc1R5cGUpKV07CiAgaW50IHQzMVtGKF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyKERlcml2ZXMpKV07CiAgaW50IHQzMltGKF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyKEVudW0pKV07CiAgaW50IHQzM1tGKF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyKEludEFyTkIpKV07CiAgaW50IHQzNFtGKF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyKFVuaW9uKSldOwogIGludCB0MzVbRihfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcihVbmlvbkFyKSldOwogIGludCB0MzZbRihfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcihTdHJ1Y3RXaXRoTWVtYmVycykpXTsKICBpbnQgdDM3W0YoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIodm9pZCAoKikoKSkpXTsKfQoKdm9pZCBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcigpCnsKICBTdHJ1Y3RXaXRoTWVtYmVycyB4OwoKICBpbnQgdDAxW1QoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcih2b2lkIChTdHJ1Y3RXaXRoTWVtYmVyczo6KikgKCkpKV07CgogIGludCB0MTBbRihfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyKGludCBTdHJ1Y3RXaXRoTWVtYmVyczo6KikpXTsKICBpbnQgdDExW0YoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcih2b2lkKikpXTsKICBpbnQgdDEyW0YoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcihjdm9pZCopKV07CiAgaW50IHQxM1tGKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIoY3ZvaWQqKSldOwogIGludCB0MTRbRihfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyKGNoYXIqKSldOwogIGludCB0MTVbRihfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyKGludCopKV07CiAgaW50IHQxNltGKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIoaW50KiopKV07CiAgaW50IHQxN1tGKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIoQ2xhc3NUeXBlKikpXTsKICBpbnQgdDE4W0YoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcihEZXJpdmVzKikpXTsKICBpbnQgdDE5W0YoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcihFbnVtKikpXTsKICBpbnQgdDIwW0YoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcihJbnRBck5CKikpXTsKICBpbnQgdDIxW0YoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcihVbmlvbiopKV07CiAgaW50IHQyMltGKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIoVW5pb25BciopKV07CiAgaW50IHQyM1tGKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIoU3RydWN0V2l0aE1lbWJlcnMqKSldOwogIGludCB0MjRbRihfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyKHZvaWQpKV07CiAgaW50IHQyNVtGKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIoY3ZvaWQpKV07CiAgaW50IHQyNltGKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIoY3ZvaWQpKV07CiAgaW50IHQyN1tGKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIoY2hhcikpXTsKICBpbnQgdDI4W0YoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcihpbnQpKV07CiAgaW50IHQyOVtGKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIoaW50KSldOwogIGludCB0MzBbRihfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyKENsYXNzVHlwZSkpXTsKICBpbnQgdDMxW0YoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcihEZXJpdmVzKSldOwogIGludCB0MzJbRihfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyKEVudW0pKV07CiAgaW50IHQzM1tGKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIoSW50QXJOQikpXTsKICBpbnQgdDM0W0YoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcihVbmlvbikpXTsKICBpbnQgdDM1W0YoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcihVbmlvbkFyKSldOwogIGludCB0MzZbRihfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyKFN0cnVjdFdpdGhNZW1iZXJzKSldOwogIGludCB0MzdbRihfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyKHZvaWQgKCopKCkpKV07Cn0KCnZvaWQgaXNfbWVtYmVyX3BvaW50ZXIoKQp7CiAgU3RydWN0V2l0aE1lbWJlcnMgeDsKCiAgaW50IHQwMVtUKF9faXNfbWVtYmVyX3BvaW50ZXIoaW50IFN0cnVjdFdpdGhNZW1iZXJzOjoqKSldOwogIGludCB0MDJbVChfX2lzX21lbWJlcl9wb2ludGVyKHZvaWQgKFN0cnVjdFdpdGhNZW1iZXJzOjoqKSAoKSkpXTsKCiAgaW50IHQxMFtGKF9faXNfbWVtYmVyX3BvaW50ZXIodm9pZCopKV07CiAgaW50IHQxMVtGKF9faXNfbWVtYmVyX3BvaW50ZXIoY3ZvaWQqKSldOwogIGludCB0MTJbRihfX2lzX21lbWJlcl9wb2ludGVyKGN2b2lkKikpXTsKICBpbnQgdDEzW0YoX19pc19tZW1iZXJfcG9pbnRlcihjaGFyKikpXTsKICBpbnQgdDE0W0YoX19pc19tZW1iZXJfcG9pbnRlcihpbnQqKSldOwogIGludCB0MTVbRihfX2lzX21lbWJlcl9wb2ludGVyKGludCoqKSldOwogIGludCB0MTZbRihfX2lzX21lbWJlcl9wb2ludGVyKENsYXNzVHlwZSopKV07CiAgaW50IHQxN1tGKF9faXNfbWVtYmVyX3BvaW50ZXIoRGVyaXZlcyopKV07CiAgaW50IHQxOFtGKF9faXNfbWVtYmVyX3BvaW50ZXIoRW51bSopKV07CiAgaW50IHQxOVtGKF9faXNfbWVtYmVyX3BvaW50ZXIoSW50QXJOQiopKV07CiAgaW50IHQyMFtGKF9faXNfbWVtYmVyX3BvaW50ZXIoVW5pb24qKSldOwogIGludCB0MjFbRihfX2lzX21lbWJlcl9wb2ludGVyKFVuaW9uQXIqKSldOwogIGludCB0MjJbRihfX2lzX21lbWJlcl9wb2ludGVyKFN0cnVjdFdpdGhNZW1iZXJzKikpXTsKICBpbnQgdDIzW0YoX19pc19tZW1iZXJfcG9pbnRlcih2b2lkKSldOwogIGludCB0MjRbRihfX2lzX21lbWJlcl9wb2ludGVyKGN2b2lkKSldOwogIGludCB0MjVbRihfX2lzX21lbWJlcl9wb2ludGVyKGN2b2lkKSldOwogIGludCB0MjZbRihfX2lzX21lbWJlcl9wb2ludGVyKGNoYXIpKV07CiAgaW50IHQyN1tGKF9faXNfbWVtYmVyX3BvaW50ZXIoaW50KSldOwogIGludCB0MjhbRihfX2lzX21lbWJlcl9wb2ludGVyKGludCkpXTsKICBpbnQgdDI5W0YoX19pc19tZW1iZXJfcG9pbnRlcihDbGFzc1R5cGUpKV07CiAgaW50IHQzMFtGKF9faXNfbWVtYmVyX3BvaW50ZXIoRGVyaXZlcykpXTsKICBpbnQgdDMxW0YoX19pc19tZW1iZXJfcG9pbnRlcihFbnVtKSldOwogIGludCB0MzJbRihfX2lzX21lbWJlcl9wb2ludGVyKEludEFyTkIpKV07CiAgaW50IHQzM1tGKF9faXNfbWVtYmVyX3BvaW50ZXIoVW5pb24pKV07CiAgaW50IHQzNFtGKF9faXNfbWVtYmVyX3BvaW50ZXIoVW5pb25BcikpXTsKICBpbnQgdDM1W0YoX19pc19tZW1iZXJfcG9pbnRlcihTdHJ1Y3RXaXRoTWVtYmVycykpXTsKICBpbnQgdDM2W0YoX19pc19tZW1iZXJfcG9pbnRlcih2b2lkICgqKSgpKSldOwp9Cgp2b2lkIGlzX2NvbnN0KCkKewogIGludCB0MDFbVChfX2lzX2NvbnN0KGN2b2lkKSldOwogIGludCB0MDJbVChfX2lzX2NvbnN0KGNvbnN0IGNoYXIpKV07CiAgaW50IHQwM1tUKF9faXNfY29uc3QoY29uc3QgaW50KSldOwogIGludCB0MDRbVChfX2lzX2NvbnN0KGNvbnN0IGxvbmcpKV07CiAgaW50IHQwNVtUKF9faXNfY29uc3QoY29uc3Qgc2hvcnQpKV07CiAgaW50IHQwNltUKF9faXNfY29uc3QoY29uc3Qgc2lnbmVkIGNoYXIpKV07CiAgaW50IHQwN1tUKF9faXNfY29uc3QoY29uc3Qgd2NoYXJfdCkpXTsKICBpbnQgdDA4W1QoX19pc19jb25zdChjb25zdCBib29sKSldOwogIGludCB0MDlbVChfX2lzX2NvbnN0KGNvbnN0IGZsb2F0KSldOwogIGludCB0MTBbVChfX2lzX2NvbnN0KGNvbnN0IGRvdWJsZSkpXTsKICBpbnQgdDExW1QoX19pc19jb25zdChjb25zdCBsb25nIGRvdWJsZSkpXTsKICBpbnQgdDEyW1QoX19pc19jb25zdChjb25zdCB1bnNpZ25lZCBjaGFyKSldOwogIGludCB0MTNbVChfX2lzX2NvbnN0KGNvbnN0IHVuc2lnbmVkIGludCkpXTsKICBpbnQgdDE0W1QoX19pc19jb25zdChjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcpKV07CiAgaW50IHQxNVtUKF9faXNfY29uc3QoY29uc3QgdW5zaWduZWQgbG9uZykpXTsKICBpbnQgdDE2W1QoX19pc19jb25zdChjb25zdCB1bnNpZ25lZCBzaG9ydCkpXTsKICBpbnQgdDE3W1QoX19pc19jb25zdChjb25zdCB2b2lkKSldOwogIGludCB0MThbVChfX2lzX2NvbnN0KGNvbnN0IENsYXNzVHlwZSkpXTsKICBpbnQgdDE5W1QoX19pc19jb25zdChjb25zdCBEZXJpdmVzKSldOwogIGludCB0MjBbVChfX2lzX2NvbnN0KGNvbnN0IEVudW0pKV07CiAgaW50IHQyMVtUKF9faXNfY29uc3QoY29uc3QgSW50QXJOQikpXTsKICBpbnQgdDIyW1QoX19pc19jb25zdChjb25zdCBVbmlvbikpXTsKICBpbnQgdDIzW1QoX19pc19jb25zdChjb25zdCBVbmlvbkFyKSldOwoKICBpbnQgdDMwW0YoX19pc19jb25zdChjaGFyKSldOwogIGludCB0MzFbRihfX2lzX2NvbnN0KGludCkpXTsKICBpbnQgdDMyW0YoX19pc19jb25zdChsb25nKSldOwogIGludCB0MzNbRihfX2lzX2NvbnN0KHNob3J0KSldOwogIGludCB0MzRbRihfX2lzX2NvbnN0KHNpZ25lZCBjaGFyKSldOwogIGludCB0MzVbRihfX2lzX2NvbnN0KHdjaGFyX3QpKV07CiAgaW50IHQzNltGKF9faXNfY29uc3QoYm9vbCkpXTsKICBpbnQgdDM3W0YoX19pc19jb25zdChmbG9hdCkpXTsKICBpbnQgdDM4W0YoX19pc19jb25zdChkb3VibGUpKV07CiAgaW50IHQzOVtGKF9faXNfY29uc3QobG9uZyBkb3VibGUpKV07CiAgaW50IHQ0MFtGKF9faXNfY29uc3QodW5zaWduZWQgY2hhcikpXTsKICBpbnQgdDQxW0YoX19pc19jb25zdCh1bnNpZ25lZCBpbnQpKV07CiAgaW50IHQ0MltGKF9faXNfY29uc3QodW5zaWduZWQgbG9uZyBsb25nKSldOwogIGludCB0NDNbRihfX2lzX2NvbnN0KHVuc2lnbmVkIGxvbmcpKV07CiAgaW50IHQ0NFtGKF9faXNfY29uc3QodW5zaWduZWQgc2hvcnQpKV07CiAgaW50IHQ0NVtGKF9faXNfY29uc3Qodm9pZCkpXTsKICBpbnQgdDQ2W0YoX19pc19jb25zdChDbGFzc1R5cGUpKV07CiAgaW50IHQ0N1tGKF9faXNfY29uc3QoRGVyaXZlcykpXTsKICBpbnQgdDQ4W0YoX19pc19jb25zdChFbnVtKSldOwogIGludCB0NDlbRihfX2lzX2NvbnN0KEludEFyTkIpKV07CiAgaW50IHQ1MFtGKF9faXNfY29uc3QoVW5pb24pKV07CiAgaW50IHQ1MVtGKF9faXNfY29uc3QoVW5pb25BcikpXTsKfQoKdm9pZCBpc192b2xhdGlsZSgpCnsKICBpbnQgdDAyW1QoX19pc192b2xhdGlsZSh2b2xhdGlsZSBjaGFyKSldOwogIGludCB0MDNbVChfX2lzX3ZvbGF0aWxlKHZvbGF0aWxlIGludCkpXTsKICBpbnQgdDA0W1QoX19pc192b2xhdGlsZSh2b2xhdGlsZSBsb25nKSldOwogIGludCB0MDVbVChfX2lzX3ZvbGF0aWxlKHZvbGF0aWxlIHNob3J0KSldOwogIGludCB0MDZbVChfX2lzX3ZvbGF0aWxlKHZvbGF0aWxlIHNpZ25lZCBjaGFyKSldOwogIGludCB0MDdbVChfX2lzX3ZvbGF0aWxlKHZvbGF0aWxlIHdjaGFyX3QpKV07CiAgaW50IHQwOFtUKF9faXNfdm9sYXRpbGUodm9sYXRpbGUgYm9vbCkpXTsKICBpbnQgdDA5W1QoX19pc192b2xhdGlsZSh2b2xhdGlsZSBmbG9hdCkpXTsKICBpbnQgdDEwW1QoX19pc192b2xhdGlsZSh2b2xhdGlsZSBkb3VibGUpKV07CiAgaW50IHQxMVtUKF9faXNfdm9sYXRpbGUodm9sYXRpbGUgbG9uZyBkb3VibGUpKV07CiAgaW50IHQxMltUKF9faXNfdm9sYXRpbGUodm9sYXRpbGUgdW5zaWduZWQgY2hhcikpXTsKICBpbnQgdDEzW1QoX19pc192b2xhdGlsZSh2b2xhdGlsZSB1bnNpZ25lZCBpbnQpKV07CiAgaW50IHQxNFtUKF9faXNfdm9sYXRpbGUodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nKSldOwogIGludCB0MTVbVChfX2lzX3ZvbGF0aWxlKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcpKV07CiAgaW50IHQxNltUKF9faXNfdm9sYXRpbGUodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQpKV07CiAgaW50IHQxN1tUKF9faXNfdm9sYXRpbGUodm9sYXRpbGUgdm9pZCkpXTsKICBpbnQgdDE4W1QoX19pc192b2xhdGlsZSh2b2xhdGlsZSBDbGFzc1R5cGUpKV07CiAgaW50IHQxOVtUKF9faXNfdm9sYXRpbGUodm9sYXRpbGUgRGVyaXZlcykpXTsKICBpbnQgdDIwW1QoX19pc192b2xhdGlsZSh2b2xhdGlsZSBFbnVtKSldOwogIGludCB0MjFbVChfX2lzX3ZvbGF0aWxlKHZvbGF0aWxlIEludEFyTkIpKV07CiAgaW50IHQyMltUKF9faXNfdm9sYXRpbGUodm9sYXRpbGUgVW5pb24pKV07CiAgaW50IHQyM1tUKF9faXNfdm9sYXRpbGUodm9sYXRpbGUgVW5pb25BcikpXTsKCiAgaW50IHQzMFtGKF9faXNfdm9sYXRpbGUoY2hhcikpXTsKICBpbnQgdDMxW0YoX19pc192b2xhdGlsZShpbnQpKV07CiAgaW50IHQzMltGKF9faXNfdm9sYXRpbGUobG9uZykpXTsKICBpbnQgdDMzW0YoX19pc192b2xhdGlsZShzaG9ydCkpXTsKICBpbnQgdDM0W0YoX19pc192b2xhdGlsZShzaWduZWQgY2hhcikpXTsKICBpbnQgdDM1W0YoX19pc192b2xhdGlsZSh3Y2hhcl90KSldOwogIGludCB0MzZbRihfX2lzX3ZvbGF0aWxlKGJvb2wpKV07CiAgaW50IHQzN1tGKF9faXNfdm9sYXRpbGUoZmxvYXQpKV07CiAgaW50IHQzOFtGKF9faXNfdm9sYXRpbGUoZG91YmxlKSldOwogIGludCB0MzlbRihfX2lzX3ZvbGF0aWxlKGxvbmcgZG91YmxlKSldOwogIGludCB0NDBbRihfX2lzX3ZvbGF0aWxlKHVuc2lnbmVkIGNoYXIpKV07CiAgaW50IHQ0MVtGKF9faXNfdm9sYXRpbGUodW5zaWduZWQgaW50KSldOwogIGludCB0NDJbRihfX2lzX3ZvbGF0aWxlKHVuc2lnbmVkIGxvbmcgbG9uZykpXTsKICBpbnQgdDQzW0YoX19pc192b2xhdGlsZSh1bnNpZ25lZCBsb25nKSldOwogIGludCB0NDRbRihfX2lzX3ZvbGF0aWxlKHVuc2lnbmVkIHNob3J0KSldOwogIGludCB0NDVbRihfX2lzX3ZvbGF0aWxlKHZvaWQpKV07CiAgaW50IHQ0NltGKF9faXNfdm9sYXRpbGUoQ2xhc3NUeXBlKSldOwogIGludCB0NDdbRihfX2lzX3ZvbGF0aWxlKERlcml2ZXMpKV07CiAgaW50IHQ0OFtGKF9faXNfdm9sYXRpbGUoRW51bSkpXTsKICBpbnQgdDQ5W0YoX19pc192b2xhdGlsZShJbnRBck5CKSldOwogIGludCB0NTBbRihfX2lzX3ZvbGF0aWxlKFVuaW9uKSldOwogIGludCB0NTFbRihfX2lzX3ZvbGF0aWxlKFVuaW9uQXIpKV07Cn0KCnN0cnVjdCBUcml2aWFsU3RydWN0IHsKICBpbnQgbWVtYmVyOwp9OwoKc3RydWN0IE5vblRyaXZpYWxTdHJ1Y3QgewogIGludCBtZW1iZXI7CiAgTm9uVHJpdmlhbFN0cnVjdCgpIHsKICAgIG1lbWJlciA9IDA7CiAgfQp9OwoKc3RydWN0IFN1cGVyTm9uVHJpdmlhbFN0cnVjdCB7CiAgU3VwZXJOb25Ucml2aWFsU3RydWN0KCkgeyB9CiAgflN1cGVyTm9uVHJpdmlhbFN0cnVjdCgpIHsgfQp9OwoKc3RydWN0IE5vblRDU3RydWN0IHsKICBOb25UQ1N0cnVjdChjb25zdCBOb25UQ1N0cnVjdCYpIHt9Cn07CgpzdHJ1Y3QgQWxsRGVmYXVsdGVkIHsKICBBbGxEZWZhdWx0ZWQoKSA9IGRlZmF1bHQ7CiAgQWxsRGVmYXVsdGVkKGNvbnN0IEFsbERlZmF1bHRlZCAmKSA9IGRlZmF1bHQ7CiAgQWxsRGVmYXVsdGVkKEFsbERlZmF1bHRlZCAmJikgPSBkZWZhdWx0OwogIEFsbERlZmF1bHRlZCAmb3BlcmF0b3I9KGNvbnN0IEFsbERlZmF1bHRlZCAmKSA9IGRlZmF1bHQ7CiAgQWxsRGVmYXVsdGVkICZvcGVyYXRvcj0oQWxsRGVmYXVsdGVkICYmKSA9IGRlZmF1bHQ7CiAgfkFsbERlZmF1bHRlZCgpID0gZGVmYXVsdDsKfTsKCnN0cnVjdCBOb0RlZmF1bHRNb3ZlQXNzaWduRHVlVG9VRENvcHlDdG9yIHsKICBOb0RlZmF1bHRNb3ZlQXNzaWduRHVlVG9VRENvcHlDdG9yKGNvbnN0IE5vRGVmYXVsdE1vdmVBc3NpZ25EdWVUb1VEQ29weUN0b3ImKTsKfTsKCnN0cnVjdCBOb0RlZmF1bHRNb3ZlQXNzaWduRHVlVG9VRENvcHlBc3NpZ24gewogIE5vRGVmYXVsdE1vdmVBc3NpZ25EdWVUb1VEQ29weUFzc2lnbiYgb3BlcmF0b3I9KAogICAgY29uc3QgTm9EZWZhdWx0TW92ZUFzc2lnbkR1ZVRvVURDb3B5QXNzaWduJik7Cn07CgpzdHJ1Y3QgTm9EZWZhdWx0TW92ZUFzc2lnbkR1ZVRvRHRvciB7CiAgfk5vRGVmYXVsdE1vdmVBc3NpZ25EdWVUb0R0b3IoKTsKfTsKCnN0cnVjdCBBbGxEZWxldGVkIHsKICBBbGxEZWxldGVkKCkgPSBkZWxldGU7CiAgQWxsRGVsZXRlZChjb25zdCBBbGxEZWxldGVkICYpID0gZGVsZXRlOwogIEFsbERlbGV0ZWQoQWxsRGVsZXRlZCAmJikgPSBkZWxldGU7CiAgQWxsRGVsZXRlZCAmb3BlcmF0b3I9KGNvbnN0IEFsbERlbGV0ZWQgJikgPSBkZWxldGU7CiAgQWxsRGVsZXRlZCAmb3BlcmF0b3I9KEFsbERlbGV0ZWQgJiYpID0gZGVsZXRlOwogIH5BbGxEZWxldGVkKCkgPSBkZWxldGU7Cn07CgpzdHJ1Y3QgRXh0RGVmYXVsdGVkIHsKICBFeHREZWZhdWx0ZWQoKTsKICBFeHREZWZhdWx0ZWQoY29uc3QgRXh0RGVmYXVsdGVkICYpOwogIEV4dERlZmF1bHRlZChFeHREZWZhdWx0ZWQgJiYpOwogIEV4dERlZmF1bHRlZCAmb3BlcmF0b3I9KGNvbnN0IEV4dERlZmF1bHRlZCAmKTsKICBFeHREZWZhdWx0ZWQgJm9wZXJhdG9yPShFeHREZWZhdWx0ZWQgJiYpOwogIH5FeHREZWZhdWx0ZWQoKTsKfTsKCi8vIERlc3BpdGUgYmVpbmcgZGVmYXVsdGVkLCB0aGVzZSBmdW5jdGlvbnMgYXJlIG5vdCB0cml2aWFsLgpFeHREZWZhdWx0ZWQ6OkV4dERlZmF1bHRlZCgpID0gZGVmYXVsdDsKRXh0RGVmYXVsdGVkOjpFeHREZWZhdWx0ZWQoY29uc3QgRXh0RGVmYXVsdGVkICYpID0gZGVmYXVsdDsKRXh0RGVmYXVsdGVkOjpFeHREZWZhdWx0ZWQoRXh0RGVmYXVsdGVkICYmKSA9IGRlZmF1bHQ7CkV4dERlZmF1bHRlZCAmRXh0RGVmYXVsdGVkOjpvcGVyYXRvcj0oY29uc3QgRXh0RGVmYXVsdGVkICYpID0gZGVmYXVsdDsKRXh0RGVmYXVsdGVkICZFeHREZWZhdWx0ZWQ6Om9wZXJhdG9yPShFeHREZWZhdWx0ZWQgJiYpID0gZGVmYXVsdDsKRXh0RGVmYXVsdGVkOjp+RXh0RGVmYXVsdGVkKCkgPSBkZWZhdWx0OwoKdm9pZCBpc190cml2aWFsMigpCnsKICBpbnQgdDAxW1QoX19pc190cml2aWFsKGNoYXIpKV07CiAgaW50IHQwMltUKF9faXNfdHJpdmlhbChpbnQpKV07CiAgaW50IHQwM1tUKF9faXNfdHJpdmlhbChsb25nKSldOwogIGludCB0MDRbVChfX2lzX3RyaXZpYWwoc2hvcnQpKV07CiAgaW50IHQwNVtUKF9faXNfdHJpdmlhbChzaWduZWQgY2hhcikpXTsKICBpbnQgdDA2W1QoX19pc190cml2aWFsKHdjaGFyX3QpKV07CiAgaW50IHQwN1tUKF9faXNfdHJpdmlhbChib29sKSldOwogIGludCB0MDhbVChfX2lzX3RyaXZpYWwoZmxvYXQpKV07CiAgaW50IHQwOVtUKF9faXNfdHJpdmlhbChkb3VibGUpKV07CiAgaW50IHQxMFtUKF9faXNfdHJpdmlhbChsb25nIGRvdWJsZSkpXTsKICBpbnQgdDExW1QoX19pc190cml2aWFsKHVuc2lnbmVkIGNoYXIpKV07CiAgaW50IHQxMltUKF9faXNfdHJpdmlhbCh1bnNpZ25lZCBpbnQpKV07CiAgaW50IHQxM1tUKF9faXNfdHJpdmlhbCh1bnNpZ25lZCBsb25nIGxvbmcpKV07CiAgaW50IHQxNFtUKF9faXNfdHJpdmlhbCh1bnNpZ25lZCBsb25nKSldOwogIGludCB0MTVbVChfX2lzX3RyaXZpYWwodW5zaWduZWQgc2hvcnQpKV07CiAgaW50IHQxNltUKF9faXNfdHJpdmlhbChDbGFzc1R5cGUpKV07CiAgaW50IHQxN1tUKF9faXNfdHJpdmlhbChEZXJpdmVzKSldOwogIGludCB0MThbVChfX2lzX3RyaXZpYWwoRW51bSkpXTsKICBpbnQgdDE5W1QoX19pc190cml2aWFsKEludEFyKSldOwogIGludCB0MjBbVChfX2lzX3RyaXZpYWwoVW5pb24pKV07CiAgaW50IHQyMVtUKF9faXNfdHJpdmlhbChVbmlvbkFyKSldOwogIGludCB0MjJbVChfX2lzX3RyaXZpYWwoVHJpdmlhbFN0cnVjdCkpXTsKICBpbnQgdDIzW1QoX19pc190cml2aWFsKEFsbERlZmF1bHRlZCkpXTsKICBpbnQgdDI0W1QoX19pc190cml2aWFsKEFsbERlbGV0ZWQpKV07CgogIGludCB0MzBbRihfX2lzX3RyaXZpYWwodm9pZCkpXTsKICBpbnQgdDMxW0YoX19pc190cml2aWFsKE5vblRyaXZpYWxTdHJ1Y3QpKV07CiAgaW50IHQzMltGKF9faXNfdHJpdmlhbChTdXBlck5vblRyaXZpYWxTdHJ1Y3QpKV07CiAgaW50IHQzM1tGKF9faXNfdHJpdmlhbChOb25UQ1N0cnVjdCkpXTsKICBpbnQgdDM0W0YoX19pc190cml2aWFsKEV4dERlZmF1bHRlZCkpXTsKfQoKdm9pZCBpc190cml2aWFsbHlfY29weWFibGUyKCkKewogIGludCB0MDFbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShjaGFyKSldOwogIGludCB0MDJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShpbnQpKV07CiAgaW50IHQwM1tUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKGxvbmcpKV07CiAgaW50IHQwNFtUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKHNob3J0KSldOwogIGludCB0MDVbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShzaWduZWQgY2hhcikpXTsKICBpbnQgdDA2W1QoX19pc190cml2aWFsbHlfY29weWFibGUod2NoYXJfdCkpXTsKICBpbnQgdDA3W1QoX19pc190cml2aWFsbHlfY29weWFibGUoYm9vbCkpXTsKICBpbnQgdDA4W1QoX19pc190cml2aWFsbHlfY29weWFibGUoZmxvYXQpKV07CiAgaW50IHQwOVtUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKGRvdWJsZSkpXTsKICBpbnQgdDEwW1QoX19pc190cml2aWFsbHlfY29weWFibGUobG9uZyBkb3VibGUpKV07CiAgaW50IHQxMVtUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKHVuc2lnbmVkIGNoYXIpKV07CiAgaW50IHQxMltUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKHVuc2lnbmVkIGludCkpXTsKICBpbnQgdDEzW1QoX19pc190cml2aWFsbHlfY29weWFibGUodW5zaWduZWQgbG9uZyBsb25nKSldOwogIGludCB0MTRbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZSh1bnNpZ25lZCBsb25nKSldOwogIGludCB0MTVbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZSh1bnNpZ25lZCBzaG9ydCkpXTsKICBpbnQgdDE2W1QoX19pc190cml2aWFsbHlfY29weWFibGUoQ2xhc3NUeXBlKSldOwogIGludCB0MTdbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShEZXJpdmVzKSldOwogIGludCB0MThbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShFbnVtKSldOwogIGludCB0MTlbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShJbnRBcikpXTsKICBpbnQgdDIwW1QoX19pc190cml2aWFsbHlfY29weWFibGUoVW5pb24pKV07CiAgaW50IHQyMVtUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKFVuaW9uQXIpKV07CiAgaW50IHQyMltUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKFRyaXZpYWxTdHJ1Y3QpKV07CiAgaW50IHQyM1tUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKE5vblRyaXZpYWxTdHJ1Y3QpKV07CiAgaW50IHQyNFtUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKEFsbERlZmF1bHRlZCkpXTsKICBpbnQgdDI1W1QoX19pc190cml2aWFsbHlfY29weWFibGUoQWxsRGVsZXRlZCkpXTsKCiAgaW50IHQzMFtGKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKHZvaWQpKV07CiAgaW50IHQzMVtGKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKFN1cGVyTm9uVHJpdmlhbFN0cnVjdCkpXTsKICBpbnQgdDMyW0YoX19pc190cml2aWFsbHlfY29weWFibGUoTm9uVENTdHJ1Y3QpKV07CiAgaW50IHQzM1tGKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKEV4dERlZmF1bHRlZCkpXTsKfQoKc3RydWN0IENTdHJ1Y3QgewogIGludCBvbmU7CiAgaW50IHR3bzsKfTsKCnN0cnVjdCBDRW1wdHlTdHJ1Y3Qge307CgpzdHJ1Y3QgQ3BwRW1wdHlTdHJ1Y3QgOiBDU3RydWN0IHt9OwpzdHJ1Y3QgQ3BwU3RydWN0U3RhbmRhcmQgOiBDRW1wdHlTdHJ1Y3QgewogIGludCB0aHJlZTsKICBpbnQgZm91cjsKfTsKc3RydWN0IENwcFN0cnVjdE5vblN0YW5kYXJkQnlCYXNlIDogQ1N0cnVjdCB7CiAgaW50IHRocmVlOwogIGludCBmb3VyOwp9OwpzdHJ1Y3QgQ3BwU3RydWN0Tm9uU3RhbmRhcmRCeVZpcnQgOiBDU3RydWN0IHsKICB2aXJ0dWFsIHZvaWQgbWV0aG9kKCkge30KfTsKc3RydWN0IENwcFN0cnVjdE5vblN0YW5kYXJkQnlNZW1iIDogQ1N0cnVjdCB7CiAgQ3BwU3RydWN0Tm9uU3RhbmRhcmRCeVZpcnQgbWVtYmVyOwp9OwpzdHJ1Y3QgQ3BwU3RydWN0Tm9uU3RhbmRhcmRCeVByb3QgOiBDU3RydWN0IHsKICBpbnQgZml2ZTsKcHJvdGVjdGVkOgogIGludCBzaXg7Cn07CnN0cnVjdCBDcHBTdHJ1Y3ROb25TdGFuZGFyZEJ5VmlydEJhc2UgOiB2aXJ0dWFsIENTdHJ1Y3Qgewp9OwpzdHJ1Y3QgQ3BwU3RydWN0Tm9uU3RhbmRhcmRCeVNhbWVCYXNlIDogQ0VtcHR5U3RydWN0IHsKICBDRW1wdHlTdHJ1Y3QgbWVtYmVyOwp9OwpzdHJ1Y3QgQ3BwU3RydWN0Tm9uU3RhbmRhcmRCeTJuZFZpcnRCYXNlIDogQ0VtcHR5U3RydWN0IHsKICBDRW1wdHlTdHJ1Y3QgbWVtYmVyOwp9OwoKdm9pZCBpc19zdGFuZGFyZF9sYXlvdXQoKQp7CiAgdHlwZWRlZiBjb25zdCBpbnQgQ29uc3RJbnQ7CiAgdHlwZWRlZiBDb25zdEludCBDb25zdEludEFyWzRdOwogIHR5cGVkZWYgQ3BwU3RydWN0U3RhbmRhcmQgQ3BwU3RydWN0U3RhbmRhcmRBcls0XTsKCiAgaW50IHQwMVtUKF9faXNfc3RhbmRhcmRfbGF5b3V0KGludCkpXTsKICBpbnQgdDAyW1QoX19pc19zdGFuZGFyZF9sYXlvdXQoQ29uc3RJbnQpKV07CiAgaW50IHQwM1tUKF9faXNfc3RhbmRhcmRfbGF5b3V0KENvbnN0SW50QXIpKV07CiAgaW50IHQwNFtUKF9faXNfc3RhbmRhcmRfbGF5b3V0KENTdHJ1Y3QpKV07CiAgaW50IHQwNVtUKF9faXNfc3RhbmRhcmRfbGF5b3V0KENwcFN0cnVjdFN0YW5kYXJkKSldOwogIGludCB0MDZbVChfX2lzX3N0YW5kYXJkX2xheW91dChDcHBTdHJ1Y3RTdGFuZGFyZEFyKSldOwogIGludCB0MDdbVChfX2lzX3N0YW5kYXJkX2xheW91dChWZWN0b3IpKV07CiAgaW50IHQwOFtUKF9faXNfc3RhbmRhcmRfbGF5b3V0KFZlY3RvckV4dCkpXTsKCiAgdHlwZWRlZiBDcHBTdHJ1Y3ROb25TdGFuZGFyZEJ5QmFzZSBDcHBTdHJ1Y3ROb25TdGFuZGFyZEJ5QmFzZUFyWzRdOwoKICBpbnQgdDEwW0YoX19pc19zdGFuZGFyZF9sYXlvdXQoQ3BwU3RydWN0Tm9uU3RhbmRhcmRCeVZpcnQpKV07CiAgaW50IHQxMVtGKF9faXNfc3RhbmRhcmRfbGF5b3V0KENwcFN0cnVjdE5vblN0YW5kYXJkQnlNZW1iKSldOwogIGludCB0MTJbRihfX2lzX3N0YW5kYXJkX2xheW91dChDcHBTdHJ1Y3ROb25TdGFuZGFyZEJ5UHJvdCkpXTsKICBpbnQgdDEzW0YoX19pc19zdGFuZGFyZF9sYXlvdXQoQ3BwU3RydWN0Tm9uU3RhbmRhcmRCeVZpcnRCYXNlKSldOwogIGludCB0MTRbRihfX2lzX3N0YW5kYXJkX2xheW91dChDcHBTdHJ1Y3ROb25TdGFuZGFyZEJ5QmFzZSkpXTsKICBpbnQgdDE1W0YoX19pc19zdGFuZGFyZF9sYXlvdXQoQ3BwU3RydWN0Tm9uU3RhbmRhcmRCeUJhc2VBcikpXTsKICBpbnQgdDE2W0YoX19pc19zdGFuZGFyZF9sYXlvdXQoQ3BwU3RydWN0Tm9uU3RhbmRhcmRCeVNhbWVCYXNlKSldOwogIGludCB0MTdbRihfX2lzX3N0YW5kYXJkX2xheW91dChDcHBTdHJ1Y3ROb25TdGFuZGFyZEJ5Mm5kVmlydEJhc2UpKV07Cn0KCnZvaWQgaXNfc2lnbmVkKCkKewogIC8vaW50IHQwMVtUKF9faXNfc2lnbmVkKGNoYXIpKV07CiAgaW50IHQwMltUKF9faXNfc2lnbmVkKGludCkpXTsKICBpbnQgdDAzW1QoX19pc19zaWduZWQobG9uZykpXTsKICBpbnQgdDA0W1QoX19pc19zaWduZWQoc2hvcnQpKV07CiAgaW50IHQwNVtUKF9faXNfc2lnbmVkKHNpZ25lZCBjaGFyKSldOwogIGludCB0MDZbVChfX2lzX3NpZ25lZCh3Y2hhcl90KSldOwoKICBpbnQgdDEwW0YoX19pc19zaWduZWQoYm9vbCkpXTsKICBpbnQgdDExW0YoX19pc19zaWduZWQoY3ZvaWQpKV07CiAgaW50IHQxMltGKF9faXNfc2lnbmVkKGZsb2F0KSldOwogIGludCB0MTNbRihfX2lzX3NpZ25lZChkb3VibGUpKV07CiAgaW50IHQxNFtGKF9faXNfc2lnbmVkKGxvbmcgZG91YmxlKSldOwogIGludCB0MTVbRihfX2lzX3NpZ25lZCh1bnNpZ25lZCBjaGFyKSldOwogIGludCB0MTZbRihfX2lzX3NpZ25lZCh1bnNpZ25lZCBpbnQpKV07CiAgaW50IHQxN1tGKF9faXNfc2lnbmVkKHVuc2lnbmVkIGxvbmcgbG9uZykpXTsKICBpbnQgdDE4W0YoX19pc19zaWduZWQodW5zaWduZWQgbG9uZykpXTsKICBpbnQgdDE5W0YoX19pc19zaWduZWQodW5zaWduZWQgc2hvcnQpKV07CiAgaW50IHQyMFtGKF9faXNfc2lnbmVkKHZvaWQpKV07CiAgaW50IHQyMVtGKF9faXNfc2lnbmVkKENsYXNzVHlwZSkpXTsKICBpbnQgdDIyW0YoX19pc19zaWduZWQoRGVyaXZlcykpXTsKICBpbnQgdDIzW0YoX19pc19zaWduZWQoRW51bSkpXTsKICBpbnQgdDI0W0YoX19pc19zaWduZWQoSW50QXJOQikpXTsKICBpbnQgdDI1W0YoX19pc19zaWduZWQoVW5pb24pKV07CiAgaW50IHQyNltGKF9faXNfc2lnbmVkKFVuaW9uQXIpKV07Cn0KCnZvaWQgaXNfdW5zaWduZWQoKQp7CiAgaW50IHQwMVtUKF9faXNfdW5zaWduZWQoYm9vbCkpXTsKICBpbnQgdDAyW1QoX19pc191bnNpZ25lZCh1bnNpZ25lZCBjaGFyKSldOwogIGludCB0MDNbVChfX2lzX3Vuc2lnbmVkKHVuc2lnbmVkIHNob3J0KSldOwogIGludCB0MDRbVChfX2lzX3Vuc2lnbmVkKHVuc2lnbmVkIGludCkpXTsKICBpbnQgdDA1W1QoX19pc191bnNpZ25lZCh1bnNpZ25lZCBsb25nKSldOwogIGludCB0MDZbVChfX2lzX3Vuc2lnbmVkKHVuc2lnbmVkIGxvbmcgbG9uZykpXTsKICBpbnQgdDA3W1QoX19pc191bnNpZ25lZChFbnVtKSldOwoKICBpbnQgdDEwW0YoX19pc191bnNpZ25lZCh2b2lkKSldOwogIGludCB0MTFbRihfX2lzX3Vuc2lnbmVkKGN2b2lkKSldOwogIGludCB0MTJbRihfX2lzX3Vuc2lnbmVkKGZsb2F0KSldOwogIGludCB0MTNbRihfX2lzX3Vuc2lnbmVkKGRvdWJsZSkpXTsKICBpbnQgdDE0W0YoX19pc191bnNpZ25lZChsb25nIGRvdWJsZSkpXTsKICBpbnQgdDE2W0YoX19pc191bnNpZ25lZChjaGFyKSldOwogIGludCB0MTdbRihfX2lzX3Vuc2lnbmVkKHNpZ25lZCBjaGFyKSldOwogIGludCB0MThbRihfX2lzX3Vuc2lnbmVkKHdjaGFyX3QpKV07CiAgaW50IHQxOVtGKF9faXNfdW5zaWduZWQoc2hvcnQpKV07CiAgaW50IHQyMFtGKF9faXNfdW5zaWduZWQoaW50KSldOwogIGludCB0MjFbRihfX2lzX3Vuc2lnbmVkKGxvbmcpKV07CiAgaW50IHQyMltGKF9faXNfdW5zaWduZWQoVW5pb24pKV07CiAgaW50IHQyM1tGKF9faXNfdW5zaWduZWQoVW5pb25BcikpXTsKICBpbnQgdDI0W0YoX19pc191bnNpZ25lZChEZXJpdmVzKSldOwogIGludCB0MjVbRihfX2lzX3Vuc2lnbmVkKENsYXNzVHlwZSkpXTsKICBpbnQgdDI2W0YoX19pc191bnNpZ25lZChJbnRBck5CKSldOwp9Cgp0eXBlZGVmIEludCYgSW50UmVmOwp0eXBlZGVmIGNvbnN0IEludEFyIENvbnN0SW50QXI7CnR5cGVkZWYgQ29uc3RJbnRBciBDb25zdEludEFyQXJbNF07CgpzdHJ1Y3QgSGFzQ29weSB7CiAgSGFzQ29weShIYXNDb3B5JiBjcCk7Cn07CgpzdHJ1Y3QgSGFzTW92ZSB7CiAgSGFzTW92ZShIYXNNb3ZlJiYgY3ApOwp9OwoKc3RydWN0IEhhc1RlbXBsYXRlQ29ucyB7CiAgSGFzVmlydCBBbm5veWluZzsKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgSGFzVGVtcGxhdGVDb25zKGNvbnN0IFQmKTsKfTsKCnZvaWQgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcigpIHsKICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKEludCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IoSW50QXIpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKFVuaW9uKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcihVbmlvbkFyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcihQT0QpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKERlcml2ZXMpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKERlcml2ZXNBcikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IoQ29uc3RJbnRBcikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IoQ29uc3RJbnRBckFyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcihIYXNEZXN0KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcihIYXNQcml2KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcihIYXNDb3B5QXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcihIYXNNb3ZlQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb25zdHJ1Y3Rvcihjb25zdCBJbnQpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKEFsbERlZmF1bHRlZCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IoQWxsRGVsZXRlZCkpXTsgfQoKICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKEhhc0NvbnMpKV07IH0KICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKEhhc1JlZikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IoSGFzQ29weSkpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IoSW50UmVmKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcihWaXJ0QXIpKV07IH0KICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKHZvaWQpKV07IH0KICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKGN2b2lkKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcihIYXNUZW1wbGF0ZUNvbnMpKV07IH0KICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKEFsbFByaXZhdGUpKV07IH0KICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKEV4dERlZmF1bHRlZCkpXTsgfQp9Cgp2b2lkIGhhc190cml2aWFsX21vdmVfY29uc3RydWN0b3IoKSB7CiAgLy8gbjMzNzYgMTIuOCBbY2xhc3MuY29weV0vMTIKICAvLyBBIGNvcHkvbW92ZSBjb25zdHJ1Y3RvciBmb3IgY2xhc3MgWCBpcyB0cml2aWFsIGlmIGl0IGlzIG5vdCAKICAvLyB1c2VyLXByb3ZpZGVkLCBpdHMgZGVjbGFyZWQgcGFyYW1ldGVyIHR5cGUgaXMgdGhlIHNhbWUgYXMgCiAgLy8gaWYgaXQgaGFkIGJlZW4gaW1wbGljaXRseSBkZWNsYXJlZCwgYW5kIGlmCiAgLy8gICCXIGNsYXNzIFggaGFzIG5vIHZpcnR1YWwgZnVuY3Rpb25zICgxMC4zKSBhbmQgbm8gdmlydHVhbCAKICAvLyAgICAgYmFzZSBjbGFzc2VzICgxMC4xKSwgYW5kCiAgLy8gICCXIHRoZSBjb25zdHJ1Y3RvciBzZWxlY3RlZCB0byBjb3B5L21vdmUgZWFjaCBkaXJlY3QgYmFzZSAKICAvLyAgICAgY2xhc3Mgc3Vib2JqZWN0IGlzIHRyaXZpYWwsIGFuZAogIC8vICAglyBmb3IgZWFjaCBub24tc3RhdGljIGRhdGEgbWVtYmVyIG9mIFggdGhhdCBpcyBvZiBjbGFzcyAKICAvLyAgICAgdHlwZSAob3IgYXJyYXkgdGhlcmVvZiksIHRoZSBjb25zdHJ1Y3RvciBzZWxlY3RlZAogIC8vICAgICB0byBjb3B5L21vdmUgdGhhdCBtZW1iZXIgaXMgdHJpdmlhbDsKICAvLyBvdGhlcndpc2UgdGhlIGNvcHkvbW92ZSBjb25zdHJ1Y3RvciBpcyBub24tdHJpdmlhbC4KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX21vdmVfY29uc3RydWN0b3IoUE9EKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9tb3ZlX2NvbnN0cnVjdG9yKFVuaW9uKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9tb3ZlX2NvbnN0cnVjdG9yKEhhc0NvbnMpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX21vdmVfY29uc3RydWN0b3IoSGFzU3RhdGljTWVtYmVyTW92ZUN0b3IpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX21vdmVfY29uc3RydWN0b3IoQWxsRGVsZXRlZCkpXTsgfQogIAogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfbW92ZV9jb25zdHJ1Y3RvcihIYXNWaXJ0KSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9tb3ZlX2NvbnN0cnVjdG9yKERlcml2ZXNWaXJ0KSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9tb3ZlX2NvbnN0cnVjdG9yKEhhc01vdmVDdG9yKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9tb3ZlX2NvbnN0cnVjdG9yKERlcml2ZXNIYXNNb3ZlQ3RvcikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfbW92ZV9jb25zdHJ1Y3RvcihIYXNNZW1iZXJNb3ZlQ3RvcikpXTsgfQp9Cgp2b2lkIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IoKSB7CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb3B5KEludCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29weShJbnRBcikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29weShVbmlvbikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29weShVbmlvbkFyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb3B5KFBPRCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29weShEZXJpdmVzKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb3B5KENvbnN0SW50QXIpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2NvcHkoQ29uc3RJbnRBckFyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb3B5KEhhc0Rlc3QpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2NvcHkoSGFzUHJpdikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29weShIYXNDb25zKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb3B5KEhhc1JlZikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29weShIYXNNb3ZlKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb3B5KEludFJlZikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29weShIYXNDb3B5QXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb3B5KEhhc01vdmVBc3NpZ24pKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2NvcHkoY29uc3QgSW50KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb3B5KEFsbERlZmF1bHRlZCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29weShBbGxEZWxldGVkKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9jb3B5KERlcml2ZXNBcikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfY29weShEZXJpdmVzSGFzUmVmKSldOyB9CgogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfY29weShIYXNDb3B5KSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9jb3B5KEhhc1RlbXBsYXRlQ29ucykpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfY29weShWaXJ0QXIpKV07IH0KICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2NvcHkodm9pZCkpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfY29weShjdm9pZCkpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfY29weShBbGxQcml2YXRlKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9jb3B5KEV4dERlZmF1bHRlZCkpXTsgfQp9Cgp2b2lkIGhhc190cml2aWFsX2NvcHlfYXNzaWdubWVudCgpIHsKICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Fzc2lnbihJbnQpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Fzc2lnbihJbnRBcikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfYXNzaWduKFVuaW9uKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9hc3NpZ24oVW5pb25BcikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfYXNzaWduKFBPRCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfYXNzaWduKERlcml2ZXMpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Fzc2lnbihIYXNEZXN0KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9hc3NpZ24oSGFzUHJpdikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfYXNzaWduKEhhc0NvbnMpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Fzc2lnbihIYXNSZWYpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Fzc2lnbihIYXNDb3B5KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9hc3NpZ24oSGFzTW92ZSkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfYXNzaWduKEhhc01vdmVBc3NpZ24pKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Fzc2lnbihBbGxEZWZhdWx0ZWQpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Fzc2lnbihBbGxEZWxldGVkKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9hc3NpZ24oRGVyaXZlc0FyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9hc3NpZ24oRGVyaXZlc0hhc1JlZikpXTsgfQoKICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2Fzc2lnbihJbnRSZWYpKV07IH0KICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2Fzc2lnbihIYXNDb3B5QXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9hc3NpZ24oY29uc3QgSW50KSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9hc3NpZ24oQ29uc3RJbnRBcikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfYXNzaWduKENvbnN0SW50QXJBcikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfYXNzaWduKFZpcnRBcikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfYXNzaWduKHZvaWQpKV07IH0KICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2Fzc2lnbihjdm9pZCkpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfYXNzaWduKEFsbFByaXZhdGUpKV07IH0KICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2Fzc2lnbihFeHREZWZhdWx0ZWQpKV07IH0KfQoKdm9pZCBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yKCkgewogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihJbnQpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoSW50QXIpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoVW5pb24pKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoVW5pb25BcikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihQT0QpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoRGVyaXZlcykpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihDb25zdEludEFyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKENvbnN0SW50QXJBcikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihIYXNQcml2KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKEhhc0NvbnMpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoSGFzUmVmKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKEhhc0NvcHkpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoSGFzTW92ZSkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihJbnRSZWYpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoSGFzQ29weUFzc2lnbikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihIYXNNb3ZlQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKGNvbnN0IEludCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihEZXJpdmVzQXIpKV07IH0KICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoVmlydEFyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKEFsbERlZmF1bHRlZCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihBbGxEZWxldGVkKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKERlcml2ZXNIYXNSZWYpKV07IH0KCiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKEhhc0Rlc3QpKV07IH0KICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2Rlc3RydWN0b3Iodm9pZCkpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3Rvcihjdm9pZCkpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihBbGxQcml2YXRlKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKEV4dERlZmF1bHRlZCkpXTsgfQp9CgpzdHJ1Y3QgQSB7IH5BKCkge30gfTsKdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBCIDogQSB7IH07Cgp2b2lkIGYoKSB7CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKEEpKV07IH0KICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoQjxpbnQ+KSldOyB9Cn0KCmNsYXNzIFBSMTExMTAgewogIHRlbXBsYXRlIDxpbnQ+IGludCBvcGVyYXRvcj0oIGludCApOwogIGludCBvcGVyYXRvcj0oUFIxMTExMCk7Cn07CgpjbGFzcyBVc2luZ0Fzc2lnbjsKCmNsYXNzIFVzaW5nQXNzaWduQmFzZSB7CnByb3RlY3RlZDoKICBVc2luZ0Fzc2lnbiAmb3BlcmF0b3I9KGNvbnN0IFVzaW5nQXNzaWduJikgdGhyb3coKTsKfTsKCmNsYXNzIFVzaW5nQXNzaWduIDogcHVibGljIFVzaW5nQXNzaWduQmFzZSB7CnB1YmxpYzoKICB1c2luZyBVc2luZ0Fzc2lnbkJhc2U6Om9wZXJhdG9yPTsKfTsKCnZvaWQgaGFzX25vdGhyb3dfYXNzaWduKCkgewogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfYXNzaWduKEludCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfYXNzaWduKEludEFyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19hc3NpZ24oVW5pb24pKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2Fzc2lnbihVbmlvbkFyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19hc3NpZ24oUE9EKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19hc3NpZ24oRGVyaXZlcykpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfYXNzaWduKEhhc0Rlc3QpKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2Fzc2lnbihIYXNQcml2KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19hc3NpZ24oSGFzQ29ucykpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfYXNzaWduKEhhc1JlZikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfYXNzaWduKEhhc0NvcHkpKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2Fzc2lnbihIYXNNb3ZlKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19hc3NpZ24oSGFzTW92ZUFzc2lnbikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfYXNzaWduKEhhc05vVGhyb3dDb3B5QXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19hc3NpZ24oSGFzTXVsdGlwbGVOb1Rocm93Q29weUFzc2lnbikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfYXNzaWduKEhhc1ZpcnREZXN0KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19hc3NpZ24oQWxsUHJpdmF0ZSkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfYXNzaWduKFVzaW5nQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19hc3NpZ24oRGVyaXZlc0FyKSldOyB9CgogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfYXNzaWduKEludFJlZikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfYXNzaWduKEhhc0NvcHlBc3NpZ24pKV07IH0KICB7IGludCBhcnJbRihfX2hhc19ub3Rocm93X2Fzc2lnbihIYXNNdWx0aXBsZUNvcHlBc3NpZ24pKV07IH0KICB7IGludCBhcnJbRihfX2hhc19ub3Rocm93X2Fzc2lnbihjb25zdCBJbnQpKV07IH0KICB7IGludCBhcnJbRihfX2hhc19ub3Rocm93X2Fzc2lnbihDb25zdEludEFyKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19hc3NpZ24oQ29uc3RJbnRBckFyKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19hc3NpZ24oVmlydEFyKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19hc3NpZ24odm9pZCkpXTsgfQogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfYXNzaWduKGN2b2lkKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19hc3NpZ24oUFIxMTExMCkpXTsgfQp9Cgp2b2lkIGhhc19ub3Rocm93X21vdmVfYXNzaWduKCkgewogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfbW92ZV9hc3NpZ24oSW50KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19tb3ZlX2Fzc2lnbihFbnVtKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19tb3ZlX2Fzc2lnbihJbnQqKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19tb3ZlX2Fzc2lnbihFbnVtIFBPRDo6KikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfbW92ZV9hc3NpZ24oUE9EKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19tb3ZlX2Fzc2lnbihIYXNQcml2KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19tb3ZlX2Fzc2lnbihIYXNOb1Rocm93TW92ZUFzc2lnbikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfbW92ZV9hc3NpZ24oSGFzTm9FeGNlcHROb1Rocm93TW92ZUFzc2lnbikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfbW92ZV9hc3NpZ24oSGFzTWVtYmVyTm9UaHJvd01vdmVBc3NpZ24pKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X21vdmVfYXNzaWduKEhhc01lbWJlck5vRXhjZXB0Tm9UaHJvd01vdmVBc3NpZ24pKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X21vdmVfYXNzaWduKEFsbERlbGV0ZWQpKV07IH0KCgogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfbW92ZV9hc3NpZ24oSGFzVGhyb3dNb3ZlQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19tb3ZlX2Fzc2lnbihIYXNOb0V4Y2VwdEZhbHNlTW92ZUFzc2lnbikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfbW92ZV9hc3NpZ24oSGFzTWVtYmVyVGhyb3dNb3ZlQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19tb3ZlX2Fzc2lnbihIYXNNZW1iZXJOb0V4Y2VwdEZhbHNlTW92ZUFzc2lnbikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfbW92ZV9hc3NpZ24oTm9EZWZhdWx0TW92ZUFzc2lnbkR1ZVRvVURDb3B5Q3RvcikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfbW92ZV9hc3NpZ24oTm9EZWZhdWx0TW92ZUFzc2lnbkR1ZVRvVURDb3B5QXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19tb3ZlX2Fzc2lnbihOb0RlZmF1bHRNb3ZlQXNzaWduRHVlVG9EdG9yKSldOyB9Cn0KCnZvaWQgaGFzX3RyaXZpYWxfbW92ZV9hc3NpZ24oKSB7CiAgLy8gbjMzNzYgMTIuOCBbY2xhc3MuY29weV0vMjUKICAvLyBBIGNvcHkvbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yIGZvciBjbGFzcyBYIGlzIHRyaXZpYWwgaWYgaXQgCiAgLy8gaXMgbm90IHVzZXItcHJvdmlkZWQsIGl0cyBkZWNsYXJlZCBwYXJhbWV0ZXIgdHlwZSBpcyB0aGUgc2FtZSAKICAvLyBhcyBpZiBpdCBoYWQgYmVlbiBpbXBsaWNpdGx5IGRlY2xhcmVkLCBhbmQgaWY6CiAgLy8gIJcgY2xhc3MgWCBoYXMgbm8gdmlydHVhbCBmdW5jdGlvbnMgKDEwLjMpIGFuZCBubyB2aXJ0dWFsIGJhc2UgCiAgLy8gICAgY2xhc3NlcyAoMTAuMSksIGFuZAogIC8vICCXIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yIHNlbGVjdGVkIHRvIGNvcHkvbW92ZSBlYWNoIGRpcmVjdCAKICAvLyAgICBiYXNlIGNsYXNzIHN1Ym9iamVjdCBpcyB0cml2aWFsLCBhbmQKICAvLyAglyBmb3IgZWFjaCBub24tc3RhdGljIGRhdGEgbWVtYmVyIG9mIFggdGhhdCBpcyBvZiBjbGFzcyB0eXBlIAogIC8vICAgIChvciBhcnJheSB0aGVyZW9mKSwgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IKICAvLyAgICBzZWxlY3RlZCB0byBjb3B5L21vdmUgdGhhdCBtZW1iZXIgaXMgdHJpdmlhbDsKICB7IGludCBhcnJbVChfX2hhc190cml2aWFsX21vdmVfYXNzaWduKEludCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfbW92ZV9hc3NpZ24oSGFzU3RhdGljTWVtYmVyTW92ZUFzc2lnbikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3RyaXZpYWxfbW92ZV9hc3NpZ24oQWxsRGVsZXRlZCkpXTsgfQoKICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX21vdmVfYXNzaWduKEhhc1ZpcnQpKV07IH0KICB7IGludCBhcnJbRihfX2hhc190cml2aWFsX21vdmVfYXNzaWduKERlcml2ZXNWaXJ0KSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9tb3ZlX2Fzc2lnbihIYXNNb3ZlQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdHJpdmlhbF9tb3ZlX2Fzc2lnbihEZXJpdmVzSGFzTW92ZUFzc2lnbikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3RyaXZpYWxfbW92ZV9hc3NpZ24oSGFzTWVtYmVyTW92ZUFzc2lnbikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfbW92ZV9hc3NpZ24oTm9EZWZhdWx0TW92ZUFzc2lnbkR1ZVRvVURDb3B5Q3RvcikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfbW92ZV9hc3NpZ24oTm9EZWZhdWx0TW92ZUFzc2lnbkR1ZVRvVURDb3B5QXNzaWduKSldOyB9Cn0KCnZvaWQgaGFzX25vdGhyb3dfY29weSgpIHsKICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2NvcHkoSW50KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb3B5KEludEFyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb3B5KFVuaW9uKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb3B5KFVuaW9uQXIpKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2NvcHkoUE9EKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb3B5KGNvbnN0IEludCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29weShDb25zdEludEFyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb3B5KENvbnN0SW50QXJBcikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29weShEZXJpdmVzKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb3B5KEludFJlZikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29weShIYXNEZXN0KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb3B5KEhhc1ByaXYpKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2NvcHkoSGFzQ29ucykpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29weShIYXNSZWYpKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2NvcHkoSGFzTW92ZSkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29weShIYXNDb3B5QXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb3B5KEhhc01vdmVBc3NpZ24pKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2NvcHkoSGFzTm9UaHJvd0NvcHkpKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2NvcHkoSGFzTXVsdGlwbGVOb1Rocm93Q29weSkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29weShIYXNWaXJ0RGVzdCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29weShIYXNUZW1wbGF0ZUNvbnMpKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2NvcHkoQWxsUHJpdmF0ZSkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29weShEZXJpdmVzQXIpKV07IH0KCiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19jb3B5KEhhc0NvcHkpKV07IH0KICB7IGludCBhcnJbRihfX2hhc19ub3Rocm93X2NvcHkoSGFzTXVsdGlwbGVDb3B5KSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19jb3B5KFZpcnRBcikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfY29weSh2b2lkKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19jb3B5KGN2b2lkKSldOyB9Cn0KCnZvaWQgaGFzX25vdGhyb3dfY29uc3RydWN0b3IoKSB7CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb25zdHJ1Y3RvcihJbnQpKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2NvbnN0cnVjdG9yKEludEFyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb25zdHJ1Y3RvcihVbmlvbikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IoVW5pb25BcikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IoUE9EKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb25zdHJ1Y3RvcihEZXJpdmVzKSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb25zdHJ1Y3RvcihEZXJpdmVzQXIpKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2NvbnN0cnVjdG9yKENvbnN0SW50QXIpKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2NvbnN0cnVjdG9yKENvbnN0SW50QXJBcikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IoSGFzRGVzdCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IoSGFzUHJpdikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IoSGFzQ29weUFzc2lnbikpXTsgfQogIHsgaW50IGFycltUKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IoY29uc3QgSW50KSldOyB9CiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb25zdHJ1Y3RvcihIYXNOb1Rocm93Q29uc3RydWN0b3IpKV07IH0KICB7IGludCBhcnJbVChfX2hhc19ub3Rocm93X2NvbnN0cnVjdG9yKEhhc1ZpcnREZXN0KSldOyB9CiAgLy8geyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb25zdHJ1Y3RvcihWaXJ0QXIpKV07IH0gLy8gbm90IGltcGxlbWVudGVkCiAgeyBpbnQgYXJyW1QoX19oYXNfbm90aHJvd19jb25zdHJ1Y3RvcihBbGxQcml2YXRlKSldOyB9CgogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IoSGFzQ29ucykpXTsgfQogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IoSGFzUmVmKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19jb25zdHJ1Y3RvcihIYXNDb3B5KSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19jb25zdHJ1Y3RvcihIYXNNb3ZlKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19jb25zdHJ1Y3RvcihIYXNOb1Rocm93Q29uc3RydWN0b3JXaXRoQXJncykpXTsgfQogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IoSW50UmVmKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19jb25zdHJ1Y3Rvcih2b2lkKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19jb25zdHJ1Y3Rvcihjdm9pZCkpXTsgfQogIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IoSGFzVGVtcGxhdGVDb25zKSldOyB9Cn0KCnZvaWQgaGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcigpIHsKICB7IGludCBhcnJbRihfX2hhc192aXJ0dWFsX2Rlc3RydWN0b3IoSW50KSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKEludEFyKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKFVuaW9uKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKFVuaW9uQXIpKV07IH0KICB7IGludCBhcnJbRihfX2hhc192aXJ0dWFsX2Rlc3RydWN0b3IoUE9EKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKERlcml2ZXMpKV07IH0KICB7IGludCBhcnJbRihfX2hhc192aXJ0dWFsX2Rlc3RydWN0b3IoRGVyaXZlc0FyKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKGNvbnN0IEludCkpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcihDb25zdEludEFyKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKENvbnN0SW50QXJBcikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcihIYXNEZXN0KSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKEhhc1ByaXYpKV07IH0KICB7IGludCBhcnJbRihfX2hhc192aXJ0dWFsX2Rlc3RydWN0b3IoSGFzQ29ucykpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcihIYXNSZWYpKV07IH0KICB7IGludCBhcnJbRihfX2hhc192aXJ0dWFsX2Rlc3RydWN0b3IoSGFzQ29weSkpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcihIYXNNb3ZlKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKEhhc0NvcHlBc3NpZ24pKV07IH0KICB7IGludCBhcnJbRihfX2hhc192aXJ0dWFsX2Rlc3RydWN0b3IoSGFzTW92ZUFzc2lnbikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcihJbnRSZWYpKV07IH0KICB7IGludCBhcnJbRihfX2hhc192aXJ0dWFsX2Rlc3RydWN0b3IoVmlydEFyKSldOyB9CgogIHsgaW50IGFycltUKF9faGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcihIYXNWaXJ0RGVzdCkpXTsgfQogIHsgaW50IGFycltUKF9faGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcihEZXJpdmVkVmlydERlc3QpKV07IH0KICB7IGludCBhcnJbRihfX2hhc192aXJ0dWFsX2Rlc3RydWN0b3IoVmlydERlc3RBcikpXTsgfQogIHsgaW50IGFycltGKF9faGFzX3ZpcnR1YWxfZGVzdHJ1Y3Rvcih2b2lkKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKGN2b2lkKSldOyB9CiAgeyBpbnQgYXJyW0YoX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKEFsbFByaXZhdGUpKV07IH0KfQoKCmNsYXNzIEJhc2Uge307CmNsYXNzIERlcml2ZWQgOiBCYXNlIHt9OwpjbGFzcyBEZXJpdmVkMmEgOiBEZXJpdmVkIHt9OwpjbGFzcyBEZXJpdmVkMmIgOiBEZXJpdmVkIHt9OwpjbGFzcyBEZXJpdmVkMyA6IHZpcnR1YWwgRGVyaXZlZDJhLCB2aXJ0dWFsIERlcml2ZWQyYiB7fTsKdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEJhc2VBIHsgVCBhOyAgfTsKdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IERlcml2ZWRCIDogQmFzZUE8VD4geyB9Owp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQ3JhenlEZXJpdmVkIDogVCB7IH07CgoKY2xhc3MgY2xhc3NfZm9yd2FyZDsgLy8gZXhwZWN0ZWQtbm90ZSB7e2ZvcndhcmQgZGVjbGFyYXRpb24gb2YgJ2NsYXNzX2ZvcndhcmQnfX0KCnRlbXBsYXRlIDx0eXBlbmFtZSBCYXNlLCB0eXBlbmFtZSBEZXJpdmVkPgp2b2lkIGlzQmFzZU9mVCgpIHsKICBpbnQgdFtUKF9faXNfYmFzZV9vZihCYXNlLCBEZXJpdmVkKSldOwp9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzZSwgdHlwZW5hbWUgRGVyaXZlZD4Kdm9pZCBpc0Jhc2VPZkYoKSB7CiAgaW50IHRbRihfX2lzX2Jhc2Vfb2YoQmFzZSwgRGVyaXZlZCkpXTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBEZXJpdmVkVGVtcCA6IEJhc2Uge307CnRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBOb25kZXJpdmVkVGVtcCB7fTsKdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIFVuZGVmaW5lZFRlbXA7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KCnZvaWQgaXNfYmFzZV9vZigpIHsKICB7IGludCBhcnJbVChfX2lzX2Jhc2Vfb2YoQmFzZSwgRGVyaXZlZCkpXTsgfQogIHsgaW50IGFycltUKF9faXNfYmFzZV9vZihjb25zdCBCYXNlLCBEZXJpdmVkKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19iYXNlX29mKERlcml2ZWQsIEJhc2UpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2Jhc2Vfb2YoRGVyaXZlZCwgaW50KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19iYXNlX29mKEJhc2UsIEJhc2UpKV07IH0KICB7IGludCBhcnJbVChfX2lzX2Jhc2Vfb2YoQmFzZSwgRGVyaXZlZDMpKV07IH0KICB7IGludCBhcnJbVChfX2lzX2Jhc2Vfb2YoRGVyaXZlZCwgRGVyaXZlZDMpKV07IH0KICB7IGludCBhcnJbVChfX2lzX2Jhc2Vfb2YoRGVyaXZlZDJiLCBEZXJpdmVkMykpXTsgfQogIHsgaW50IGFycltUKF9faXNfYmFzZV9vZihEZXJpdmVkMmEsIERlcml2ZWQzKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19iYXNlX29mKEJhc2VBPGludD4sIERlcml2ZWRCPGludD4pKV07IH0KICB7IGludCBhcnJbRihfX2lzX2Jhc2Vfb2YoRGVyaXZlZEI8aW50PiwgQmFzZUE8aW50PikpXTsgfQogIHsgaW50IGFycltUKF9faXNfYmFzZV9vZihCYXNlLCBDcmF6eURlcml2ZWQ8QmFzZT4pKV07IH0KICB7IGludCBhcnJbRihfX2lzX2Jhc2Vfb2YoVW5pb24sIFVuaW9uKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19iYXNlX29mKEVtcHR5LCBFbXB0eSkpXTsgfQogIHsgaW50IGFycltUKF9faXNfYmFzZV9vZihjbGFzc19mb3J3YXJkLCBjbGFzc19mb3J3YXJkKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19iYXNlX29mKEVtcHR5LCBjbGFzc19mb3J3YXJkKSldOyB9IC8vIGV4cGVjdGVkLWVycm9yIHt7aW5jb21wbGV0ZSB0eXBlICdjbGFzc19mb3J3YXJkJyB1c2VkIGluIHR5cGUgdHJhaXQgZXhwcmVzc2lvbn19CiAgeyBpbnQgYXJyW0YoX19pc19iYXNlX29mKEJhc2UmLCBEZXJpdmVkJikpXTsgfQogIGludCB0MThbRihfX2lzX2Jhc2Vfb2YoQmFzZVsxMF0sIERlcml2ZWRbMTBdKSldOwogIHsgaW50IGFycltGKF9faXNfYmFzZV9vZihpbnQsIGludCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfYmFzZV9vZihsb25nLCBpbnQpKV07IH0KICB7IGludCBhcnJbVChfX2lzX2Jhc2Vfb2YoQmFzZSwgRGVyaXZlZFRlbXA8aW50PikpXTsgfQogIHsgaW50IGFycltGKF9faXNfYmFzZV9vZihCYXNlLCBOb25kZXJpdmVkVGVtcDxpbnQ+KSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19iYXNlX29mKEJhc2UsIFVuZGVmaW5lZFRlbXA8aW50PikpXTsgfSAvLyBleHBlY3RlZC1lcnJvciB7e2ltcGxpY2l0IGluc3RhbnRpYXRpb24gb2YgdW5kZWZpbmVkIHRlbXBsYXRlICdVbmRlZmluZWRUZW1wPGludD4nfX0KCiAgaXNCYXNlT2ZUPEJhc2UsIERlcml2ZWQ+KCk7CiAgaXNCYXNlT2ZGPERlcml2ZWQsIEJhc2U+KCk7CgogIGlzQmFzZU9mVDxCYXNlLCBDcmF6eURlcml2ZWQ8QmFzZT4gPigpOwogIGlzQmFzZU9mRjxDcmF6eURlcml2ZWQ8QmFzZT4sIEJhc2U+KCk7CgogIGlzQmFzZU9mVDxCYXNlQTxpbnQ+LCBEZXJpdmVkQjxpbnQ+ID4oKTsKICBpc0Jhc2VPZkY8RGVyaXZlZEI8aW50PiwgQmFzZUE8aW50PiA+KCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CmNsYXNzIFRlbXBsYXRlQ2xhc3Mge307Cgp0ZW1wbGF0ZTxjbGFzcyBUPgp1c2luZyBUZW1wbGF0ZUFsaWFzID0gVGVtcGxhdGVDbGFzczxULCBpbnQ+OwoKdHlwZWRlZiBjbGFzcyBCYXNlIEJhc2VUeXBlZGVmOwoKdm9pZCBpc19zYW1lKCkKewogIGludCB0MDFbVChfX2lzX3NhbWUoQmFzZSwgQmFzZSkpXTsKICBpbnQgdDAyW1QoX19pc19zYW1lKEJhc2UsIEJhc2VUeXBlZGVmKSldOwogIGludCB0MDNbVChfX2lzX3NhbWUoVGVtcGxhdGVDbGFzczxpbnQsIGludD4sIFRlbXBsYXRlQWxpYXM8aW50PikpXTsKCiAgaW50IHQxMFtGKF9faXNfc2FtZShCYXNlLCBjb25zdCBCYXNlKSldOwogIGludCB0MTFbRihfX2lzX3NhbWUoQmFzZSwgQmFzZSYpKV07CiAgaW50IHQxMltGKF9faXNfc2FtZShCYXNlLCBEZXJpdmVkKSldOwp9CgpzdHJ1Y3QgSW50V3JhcHBlcgp7CiAgaW50IHZhbHVlOwogIEludFdyYXBwZXIoaW50IF92YWx1ZSkgOiB2YWx1ZShfdmFsdWUpIHt9CiAgb3BlcmF0b3IgaW50KCkgY29uc3QgewogICAgcmV0dXJuIHZhbHVlOwogIH0KfTsKCnN0cnVjdCBGbG9hdFdyYXBwZXIKewogIGZsb2F0IHZhbHVlOwogIEZsb2F0V3JhcHBlcihmbG9hdCBfdmFsdWUpIDogdmFsdWUoX3ZhbHVlKSB7fQogIEZsb2F0V3JhcHBlcihjb25zdCBJbnRXcmFwcGVyJiBvYmopCiAgICA6IHZhbHVlKHN0YXRpY19jYXN0PGZsb2F0PihvYmoudmFsdWUpKSB7fQogIG9wZXJhdG9yIGZsb2F0KCkgY29uc3QgewogICAgcmV0dXJuIHZhbHVlOwogIH0KICBvcGVyYXRvciBJbnRXcmFwcGVyKCkgY29uc3QgewogICAgcmV0dXJuIEludFdyYXBwZXIoc3RhdGljX2Nhc3Q8aW50Pih2YWx1ZSkpOwogIH0KfTsKCnZvaWQgaXNfY29udmVydGlibGUoKQp7CiAgaW50IHQwMVtUKF9faXNfY29udmVydGlibGUoSW50V3JhcHBlciwgSW50V3JhcHBlcikpXTsKICBpbnQgdDAyW1QoX19pc19jb252ZXJ0aWJsZShJbnRXcmFwcGVyLCBjb25zdCBJbnRXcmFwcGVyKSldOwogIGludCB0MDNbVChfX2lzX2NvbnZlcnRpYmxlKEludFdyYXBwZXIsIGludCkpXTsKICBpbnQgdDA0W1QoX19pc19jb252ZXJ0aWJsZShpbnQsIEludFdyYXBwZXIpKV07CiAgaW50IHQwNVtUKF9faXNfY29udmVydGlibGUoSW50V3JhcHBlciwgRmxvYXRXcmFwcGVyKSldOwogIGludCB0MDZbVChfX2lzX2NvbnZlcnRpYmxlKEZsb2F0V3JhcHBlciwgSW50V3JhcHBlcikpXTsKICBpbnQgdDA3W1QoX19pc19jb252ZXJ0aWJsZShGbG9hdFdyYXBwZXIsIGZsb2F0KSldOwogIGludCB0MDhbVChfX2lzX2NvbnZlcnRpYmxlKGZsb2F0LCBGbG9hdFdyYXBwZXIpKV07Cn0KCnN0cnVjdCBGcm9tSW50IHsgRnJvbUludChpbnQpOyB9OwpzdHJ1Y3QgVG9JbnQgeyBvcGVyYXRvciBpbnQoKTsgfTsKdHlwZWRlZiB2b2lkIEZ1bmN0aW9uKCk7Cgp2b2lkIGlzX2NvbnZlcnRpYmxlX3RvKCk7CmNsYXNzIFByaXZhdGVDb3B5IHsKICBQcml2YXRlQ29weShjb25zdCBQcml2YXRlQ29weSYpOwogIGZyaWVuZCB2b2lkIGlzX2NvbnZlcnRpYmxlX3RvKCk7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgWDAgeyAKICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBYMChjb25zdCBYMDxVPiYpOwp9OwoKc3RydWN0IEFic3RyYWN0IHsgdmlydHVhbCB2b2lkIGYoKSA9IDA7IH07Cgp2b2lkIGlzX2NvbnZlcnRpYmxlX3RvKCkgewogIHsgaW50IGFycltUKF9faXNfY29udmVydGlibGVfdG8oSW50LCBJbnQpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2NvbnZlcnRpYmxlX3RvKEludCwgSW50QXIpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2NvbnZlcnRpYmxlX3RvKEludEFyLCBJbnRBcikpXTsgfQogIHsgaW50IGFycltUKF9faXNfY29udmVydGlibGVfdG8odm9pZCwgdm9pZCkpXTsgfQogIHsgaW50IGFycltUKF9faXNfY29udmVydGlibGVfdG8oY3ZvaWQsIHZvaWQpKV07IH0KICB7IGludCBhcnJbVChfX2lzX2NvbnZlcnRpYmxlX3RvKHZvaWQsIGN2b2lkKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19jb252ZXJ0aWJsZV90byhjdm9pZCwgY3ZvaWQpKV07IH0KICB7IGludCBhcnJbVChfX2lzX2NvbnZlcnRpYmxlX3RvKGludCwgRnJvbUludCkpXTsgfQogIHsgaW50IGFycltUKF9faXNfY29udmVydGlibGVfdG8obG9uZywgRnJvbUludCkpXTsgfQogIHsgaW50IGFycltUKF9faXNfY29udmVydGlibGVfdG8oZG91YmxlLCBGcm9tSW50KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19jb252ZXJ0aWJsZV90byhjb25zdCBpbnQsIEZyb21JbnQpKV07IH0KICB7IGludCBhcnJbVChfX2lzX2NvbnZlcnRpYmxlX3RvKGNvbnN0IGludCYsIEZyb21JbnQpKV07IH0KICB7IGludCBhcnJbVChfX2lzX2NvbnZlcnRpYmxlX3RvKFRvSW50LCBpbnQpKV07IH0KICB7IGludCBhcnJbVChfX2lzX2NvbnZlcnRpYmxlX3RvKFRvSW50LCBjb25zdCBpbnQmKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19jb252ZXJ0aWJsZV90byhUb0ludCwgbG9uZykpXTsgfQogIHsgaW50IGFycltGKF9faXNfY29udmVydGlibGVfdG8oVG9JbnQsIGludCYpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2NvbnZlcnRpYmxlX3RvKFRvSW50LCBGcm9tSW50KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc19jb252ZXJ0aWJsZV90byhJbnRBciYsIEludEFyJikpXTsgfQogIHsgaW50IGFycltUKF9faXNfY29udmVydGlibGVfdG8oSW50QXImLCBjb25zdCBJbnRBciYpKV07IH0KICB7IGludCBhcnJbRihfX2lzX2NvbnZlcnRpYmxlX3RvKGNvbnN0IEludEFyJiwgSW50QXImKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19jb252ZXJ0aWJsZV90byhGdW5jdGlvbiwgRnVuY3Rpb24pKV07IH0KICB7IGludCBhcnJbRihfX2lzX2NvbnZlcnRpYmxlX3RvKFByaXZhdGVDb3B5LCBQcml2YXRlQ29weSkpXTsgfQogIHsgaW50IGFycltUKF9faXNfY29udmVydGlibGVfdG8oWDA8aW50PiwgWDA8ZmxvYXQ+KSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc19jb252ZXJ0aWJsZV90byhBYnN0cmFjdCwgQWJzdHJhY3QpKV07IH0KfQoKbmFtZXNwYWNlIGlzX2NvbnZlcnRpYmxlX3RvX2luc3RhbnRpYXRlIHsKICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgdHJ5IHRvIGluc3RhbnRpYXRlIHRoZSBjb25zdHJ1Y3Rvci4KICB0ZW1wbGF0ZTxpbnQgeD4gY2xhc3MgQSB7IEEoaW50KSB7IGludCBhW3hdOyB9IH07CiAgaW50IHggPSBfX2lzX2NvbnZlcnRpYmxlX3RvKGludCwgQTwtMT4pOwp9Cgp2b2lkIGlzX3RyaXZpYWwoKQp7CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsKGludCkpXTsgfQogIHsgaW50IGFycltUKF9faXNfdHJpdmlhbChFbnVtKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsKFBPRCkpXTsgfQogIHsgaW50IGFycltUKF9faXNfdHJpdmlhbChJbnQpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWwoSW50QXIpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWwoSW50QXJOQikpXTsgfQogIHsgaW50IGFycltUKF9faXNfdHJpdmlhbChTdGF0aWNzKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsKEVtcHR5KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsKEVtcHR5VW5pb24pKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWwoVW5pb24pKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWwoRGVyaXZlcykpXTsgfQogIHsgaW50IGFycltUKF9faXNfdHJpdmlhbChEZXJpdmVzQXIpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWwoRGVyaXZlc0FyTkIpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWwoRGVyaXZlc0VtcHR5KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsKEhhc0Z1bmMpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWwoSGFzT3ApKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWwoSGFzQ29udikpXTsgfQogIHsgaW50IGFycltUKF9faXNfdHJpdmlhbChIYXNBc3NpZ24pKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWwoSGFzQW5vbnltb3VzVW5pb24pKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWwoSGFzUHJpdikpXTsgfQogIHsgaW50IGFycltUKF9faXNfdHJpdmlhbChIYXNQcm90KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsKERlcml2ZXNIYXNQcml2KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsKERlcml2ZXNIYXNQcm90KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsKFZlY3RvcikpXTsgfQogIHsgaW50IGFycltUKF9faXNfdHJpdmlhbChWZWN0b3JFeHQpKV07IH0KCiAgeyBpbnQgYXJyW0YoX19pc190cml2aWFsKEhhc0NvbnMpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3RyaXZpYWwoSGFzQ29weUFzc2lnbikpXTsgfQogIHsgaW50IGFycltGKF9faXNfdHJpdmlhbChIYXNNb3ZlQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc190cml2aWFsKEhhc0Rlc3QpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3RyaXZpYWwoSGFzUmVmKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc190cml2aWFsKEhhc05vblBPRCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfdHJpdmlhbChIYXNWaXJ0KSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc190cml2aWFsKERlcml2ZXNIYXNDb25zKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc190cml2aWFsKERlcml2ZXNIYXNDb3B5QXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc190cml2aWFsKERlcml2ZXNIYXNNb3ZlQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc190cml2aWFsKERlcml2ZXNIYXNEZXN0KSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc190cml2aWFsKERlcml2ZXNIYXNSZWYpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3RyaXZpYWwoRGVyaXZlc0hhc1ZpcnQpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3RyaXZpYWwodm9pZCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfdHJpdmlhbChjdm9pZCkpXTsgfQp9Cgp2b2lkIHRyaXZpYWxfY2hlY2tzKCkKewogIHsgaW50IGFycltUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKGludCkpXTsgfQogIHsgaW50IGFycltUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKEVudW0pKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShQT0QpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShJbnQpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShJbnRBcikpXTsgfQogIHsgaW50IGFycltUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKEludEFyTkIpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShTdGF0aWNzKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsbHlfY29weWFibGUoRW1wdHkpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShFbXB0eVVuaW9uKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsbHlfY29weWFibGUoVW5pb24pKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShEZXJpdmVzKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsbHlfY29weWFibGUoRGVyaXZlc0FyKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsbHlfY29weWFibGUoRGVyaXZlc0FyTkIpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShEZXJpdmVzRW1wdHkpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShIYXNGdW5jKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsbHlfY29weWFibGUoSGFzT3ApKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShIYXNDb252KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsbHlfY29weWFibGUoSGFzQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsbHlfY29weWFibGUoSGFzQW5vbnltb3VzVW5pb24pKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShIYXNQcml2KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsbHlfY29weWFibGUoSGFzUHJvdCkpXTsgfQogIHsgaW50IGFycltUKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKERlcml2ZXNIYXNQcml2KSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsbHlfY29weWFibGUoRGVyaXZlc0hhc1Byb3QpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShWZWN0b3IpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShWZWN0b3JFeHQpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShIYXNDb25zKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsbHlfY29weWFibGUoSGFzUmVmKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsbHlfY29weWFibGUoSGFzTm9uUE9EKSldOyB9CiAgeyBpbnQgYXJyW1QoX19pc190cml2aWFsbHlfY29weWFibGUoRGVyaXZlc0hhc0NvbnMpKV07IH0KICB7IGludCBhcnJbVChfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShEZXJpdmVzSGFzUmVmKSldOyB9CgogIHsgaW50IGFycltGKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKEhhc0NvcHlBc3NpZ24pKV07IH0KICB7IGludCBhcnJbRihfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShIYXNNb3ZlQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc190cml2aWFsbHlfY29weWFibGUoSGFzRGVzdCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKEhhc1ZpcnQpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShEZXJpdmVzSGFzQ29weUFzc2lnbikpXTsgfQogIHsgaW50IGFycltGKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKERlcml2ZXNIYXNNb3ZlQXNzaWduKSldOyB9CiAgeyBpbnQgYXJyW0YoX19pc190cml2aWFsbHlfY29weWFibGUoRGVyaXZlc0hhc0Rlc3QpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShEZXJpdmVzSGFzVmlydCkpXTsgfQogIHsgaW50IGFycltGKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKHZvaWQpKV07IH0KICB7IGludCBhcnJbRihfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShjdm9pZCkpXTsgfQoKICB7IGludCBhcnJbVCgoX19pc190cml2aWFsbHlfY29uc3RydWN0aWJsZShpbnQpKSldOyB9CiAgeyBpbnQgYXJyW1QoKF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoaW50LCBpbnQpKSldOyB9CiAgeyBpbnQgYXJyW1QoKF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoaW50LCBmbG9hdCkpKV07IH0KICB7IGludCBhcnJbVCgoX19pc190cml2aWFsbHlfY29uc3RydWN0aWJsZShpbnQsIGludCYpKSldOyB9CiAgeyBpbnQgYXJyW1QoKF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoaW50LCBjb25zdCBpbnQmKSkpXTsgfQogIHsgaW50IGFycltUKChfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKGludCwgaW50KSkpXTsgfQogIHsgaW50IGFycltUKChfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKEhhc0NvcHlBc3NpZ24sIEhhc0NvcHlBc3NpZ24pKSldOyB9CiAgeyBpbnQgYXJyW1QoKF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoSGFzQ29weUFzc2lnbiwgY29uc3QgSGFzQ29weUFzc2lnbiYpKSldOyB9CiAgeyBpbnQgYXJyW1QoKF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoSGFzQ29weUFzc2lnbiwgSGFzQ29weUFzc2lnbiYmKSkpXTsgfQogIHsgaW50IGFycltUKChfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKEhhc0NvcHlBc3NpZ24pKSldOyB9CiAgeyBpbnQgYXJyW1QoKF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoTm9uVHJpdmlhbERlZmF1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTm9uVHJpdmlhbERlZmF1bHQmKSkpXTsgfQogIHsgaW50IGFycltUKChfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKE5vblRyaXZpYWxEZWZhdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vblRyaXZpYWxEZWZhdWx0JiYpKSldOyB9CiAgeyBpbnQgYXJyW1QoKF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoQWxsRGVmYXVsdGVkKSkpXTsgfQogIHsgaW50IGFycltUKChfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKEFsbERlZmF1bHRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxEZWZhdWx0ZWQgJikpKV07IH0KICB7IGludCBhcnJbVCgoX19pc190cml2aWFsbHlfY29uc3RydWN0aWJsZShBbGxEZWZhdWx0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsRGVmYXVsdGVkICYmKSkpXTsgfQoKICB7IGludCBhcnJbRigoX19pc190cml2aWFsbHlfY29uc3RydWN0aWJsZShpbnQsIGludCopKSldOyB9CiAgeyBpbnQgYXJyW0YoKF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoTm9uVHJpdmlhbERlZmF1bHQpKSldOyB9CiAgeyBpbnQgYXJyW0YoKF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoVGhyZWVBcmdDdG9yLCBpbnQqLCBjaGFyKiwgaW50JikpKV07IH0KICB7IGludCBhcnJbRigoX19pc190cml2aWFsbHlfY29uc3RydWN0aWJsZShBbGxEZWxldGVkKSkpXTsgfQogIHsgaW50IGFycltGKChfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKEFsbERlbGV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxsRGVsZXRlZCAmKSkpXTsgfQogIHsgaW50IGFycltGKChfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKEFsbERlbGV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsRGVsZXRlZCAmJikpKV07IH0KICB7IGludCBhcnJbRigoX19pc190cml2aWFsbHlfY29uc3RydWN0aWJsZShFeHREZWZhdWx0ZWQpKSldOyB9CiAgeyBpbnQgYXJyW0YoKF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoRXh0RGVmYXVsdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4dERlZmF1bHRlZCAmKSkpXTsgfQogIHsgaW50IGFycltGKChfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKEV4dERlZmF1bHRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHREZWZhdWx0ZWQgJiYpKSldOyB9CgogIHsgaW50IGFycltUKChfX2lzX3RyaXZpYWxseV9hc3NpZ25hYmxlKGludCYsIGludCkpKV07IH0KICB7IGludCBhcnJbVCgoX19pc190cml2aWFsbHlfYXNzaWduYWJsZShpbnQmLCBpbnQmKSkpXTsgfQogIHsgaW50IGFycltUKChfX2lzX3RyaXZpYWxseV9hc3NpZ25hYmxlKGludCYsIGludCYmKSkpXTsgfQogIHsgaW50IGFycltUKChfX2lzX3RyaXZpYWxseV9hc3NpZ25hYmxlKGludCYsIGNvbnN0IGludCYpKSldOyB9CiAgeyBpbnQgYXJyW1QoKF9faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUoUE9EJiwgUE9EKSkpXTsgfQogIHsgaW50IGFycltUKChfX2lzX3RyaXZpYWxseV9hc3NpZ25hYmxlKFBPRCYsIFBPRCYpKSldOyB9CiAgeyBpbnQgYXJyW1QoKF9faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUoUE9EJiwgUE9EJiYpKSldOyB9CiAgeyBpbnQgYXJyW1QoKF9faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUoUE9EJiwgY29uc3QgUE9EJikpKV07IH0KICB7IGludCBhcnJbVCgoX19pc190cml2aWFsbHlfYXNzaWduYWJsZShpbnQqJiwgaW50KikpKV07IH0KICB7IGludCBhcnJbVCgoX19pc190cml2aWFsbHlfYXNzaWduYWJsZShBbGxEZWZhdWx0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxsRGVmYXVsdGVkICYpKSldOyB9CiAgeyBpbnQgYXJyW1QoKF9faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUoQWxsRGVmYXVsdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbERlZmF1bHRlZCAmJikpKV07IH0KCiAgeyBpbnQgYXJyW0YoKF9faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUoaW50KiYsIGZsb2F0KikpKV07IH0KICB7IGludCBhcnJbRigoX19pc190cml2aWFsbHlfYXNzaWduYWJsZShIYXNDb3B5QXNzaWduJiwgSGFzQ29weUFzc2lnbikpKV07IH0KICB7IGludCBhcnJbRigoX19pc190cml2aWFsbHlfYXNzaWduYWJsZShIYXNDb3B5QXNzaWduJiwgSGFzQ29weUFzc2lnbiYpKSldOyB9CiAgeyBpbnQgYXJyW0YoKF9faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUoSGFzQ29weUFzc2lnbiYsIGNvbnN0IEhhc0NvcHlBc3NpZ24mKSkpXTsgfQogIHsgaW50IGFycltGKChfX2lzX3RyaXZpYWxseV9hc3NpZ25hYmxlKEhhc0NvcHlBc3NpZ24mLCBIYXNDb3B5QXNzaWduJiYpKSldOyB9CiAgeyBpbnQgYXJyW0YoKF9faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUoVHJpdmlhbE1vdmVCdXROb3RDb3B5JiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaXZpYWxNb3ZlQnV0Tm90Q29weSYpKSldOyB9CiAgeyBpbnQgYXJyW0YoKF9faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUoVHJpdmlhbE1vdmVCdXROb3RDb3B5JiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyaXZpYWxNb3ZlQnV0Tm90Q29weSYpKSldOyB9CiAgeyBpbnQgYXJyW0YoKF9faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUoQWxsRGVsZXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxEZWxldGVkICYpKSldOyB9CiAgeyBpbnQgYXJyW0YoKF9faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUoQWxsRGVsZXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxEZWxldGVkICYmKSkpXTsgfQogIHsgaW50IGFycltGKChfX2lzX3RyaXZpYWxseV9hc3NpZ25hYmxlKEV4dERlZmF1bHRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHREZWZhdWx0ZWQgJikpKV07IH0KICB7IGludCBhcnJbRigoX19pc190cml2aWFsbHlfYXNzaWduYWJsZShFeHREZWZhdWx0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0RGVmYXVsdGVkICYmKSkpXTsgfQoKICB7IGludCBhcnJbVCgoX19pc190cml2aWFsbHlfYXNzaWduYWJsZShIYXNEZWZhdWx0VHJpdmlhbENvcHlBc3NpZ24mLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc0RlZmF1bHRUcml2aWFsQ29weUFzc2lnbiYpKSldOyB9CiAgeyBpbnQgYXJyW1QoKF9faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUoSGFzRGVmYXVsdFRyaXZpYWxDb3B5QXNzaWduJiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSGFzRGVmYXVsdFRyaXZpYWxDb3B5QXNzaWduJikpKV07IH0KICB7IGludCBhcnJbVCgoX19pc190cml2aWFsbHlfYXNzaWduYWJsZShUcml2aWFsTW92ZUJ1dE5vdENvcHkmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaXZpYWxNb3ZlQnV0Tm90Q29weSkpKV07IH0KICB7IGludCBhcnJbVCgoX19pc190cml2aWFsbHlfYXNzaWduYWJsZShUcml2aWFsTW92ZUJ1dE5vdENvcHkmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaXZpYWxNb3ZlQnV0Tm90Q29weSYmKSkpXTsgfQp9CgovLyBJbnN0YW50aWF0aW9uIG9mIF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uQXJncz4Kc3RydWN0IGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlIHsKICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoVCwgQXJncy4uLik7Cn07Cgp2b2lkIGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlX3Rlc3QoKSB7CiAgeyBpbnQgYXJyW1QoKGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPGludD46OnZhbHVlKSldOyB9CiAgeyBpbnQgYXJyW1QoKGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPGludCwgaW50Pjo6dmFsdWUpKV07IH0KICB7IGludCBhcnJbVCgoaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU8aW50LCBmbG9hdD46OnZhbHVlKSldOyB9CiAgeyBpbnQgYXJyW1QoKGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPGludCwgaW50Jj46OnZhbHVlKSldOyB9CiAgeyBpbnQgYXJyW1QoKGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPGludCwgY29uc3QgaW50Jj46OnZhbHVlKSldOyB9CiAgeyBpbnQgYXJyW1QoKGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPGludCwgaW50Pjo6dmFsdWUpKV07IH0KICB7IGludCBhcnJbVCgoaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU8SGFzQ29weUFzc2lnbiwgSGFzQ29weUFzc2lnbj46OnZhbHVlKSldOyB9CiAgeyBpbnQgYXJyW1QoKGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPEhhc0NvcHlBc3NpZ24sIGNvbnN0IEhhc0NvcHlBc3NpZ24mPjo6dmFsdWUpKV07IH0KICB7IGludCBhcnJbVCgoaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU8SGFzQ29weUFzc2lnbiwgSGFzQ29weUFzc2lnbiYmPjo6dmFsdWUpKV07IH0KICB7IGludCBhcnJbVCgoaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU8SGFzQ29weUFzc2lnbj46OnZhbHVlKSldOyB9CiAgeyBpbnQgYXJyW1QoKGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPE5vblRyaXZpYWxEZWZhdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5vblRyaXZpYWxEZWZhdWx0Jj46OnZhbHVlKSldOyB9CiAgeyBpbnQgYXJyW1QoKGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPE5vblRyaXZpYWxEZWZhdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vblRyaXZpYWxEZWZhdWx0JiY+Ojp2YWx1ZSkpXTsgfQoKICB7IGludCBhcnJbRigoaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU8aW50LCBpbnQqPjo6dmFsdWUpKV07IH0KICB7IGludCBhcnJbRigoaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU8Tm9uVHJpdmlhbERlZmF1bHQ+Ojp2YWx1ZSkpXTsgfQogIHsgaW50IGFycltGKChpc190cml2aWFsbHlfY29uc3RydWN0aWJsZTxUaHJlZUFyZ0N0b3IsIGludCosIGNoYXIqLCBpbnQmPjo6dmFsdWUpKV07IH0KfQoKdm9pZCBhcnJheV9yYW5rKCkgewogIGludCB0MDFbVChfX2FycmF5X3JhbmsoSW50QXIpID09IDEpXTsKICBpbnQgdDAyW1QoX19hcnJheV9yYW5rKENvbnN0SW50QXJBcikgPT0gMildOwp9Cgp2b2lkIGFycmF5X2V4dGVudCgpIHsKICBpbnQgdDAxW1QoX19hcnJheV9leHRlbnQoSW50QXIsIDApID09IDEwKV07CiAgaW50IHQwMltUKF9fYXJyYXlfZXh0ZW50KENvbnN0SW50QXJBciwgMCkgPT0gNCldOwogIGludCB0MDNbVChfX2FycmF5X2V4dGVudChDb25zdEludEFyQXIsIDEpID09IDEwKV07Cn0K