/
Wuerth Phoenix DynamicField From DB-1.2.0.opm
31 lines (31 loc) · 283 KB
/
Wuerth Phoenix DynamicField From DB-1.2.0.opm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
<Name>Wuerth Phoenix DynamicField From DB</Name>
<Version>1.2.0</Version>
<Vendor>Wuerth Phoenix S.R.L.</Vendor>
<URL>http://www.wuerth-phoenix.com/</URL>
<License>GNU GENERAL PUBLIC LICENSE Version 2, June 1991</License>
<ChangeLog Date="2012-04-26 18:45:21" Version="1.0.0">First Release.</ChangeLog>
<ChangeLog Date="2013-01-07 18:45:21" Version="1.1.0">New DynamicField Backend: MultiselectFromDB.</ChangeLog>
<ChangeLog Date="2013-01-08 18:45:21" Version="1.1.1">Better error handling on configuration. Local DBObject of otrs now supported.</ChangeLog>
<ChangeLog Date="2013-01-08 18:45:21" Version="1.1.2">- fixed bug in DisplayValueRender that tried to use missing DBIString when "Store Key and value" was set to "yes" - fixed bug that caused the creation/edit of a ticket to fail when an error message in the DynamicField was displayed - added a 'FromDB' class to identify DynamicFieldsFromDB in dom/css</ChangeLog>
<ChangeLog Date="2013-02-26 18:45:21" Version="1.1.3">Added Debug mode, added textarea in query field in TextAreaFromDB</ChangeLog>
<ChangeLog Date="2013-09-17 10:40:21" Version="1.2.0">Merged various fixes from projects. 1.2.0 Tag. </ChangeLog>
<Description Lang="en">Adds a new DynamicField Type that permits to load the possible values at runtime from an external DB.</Description>
<Framework>3.2.x</Framework>
<IntroInstall Lang="en" Title="Thank you!" Type="post">Thank you for choosing the WP DynamicField From DB.</IntroInstall>
<BuildDate>2013-09-17 15:02:43</BuildDate>
<BuildHost>yourhost.example.com</BuildHost>
<Filelist>
<File Location="Kernel/Config/Files/DynamicFieldDropdownFromDB.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkNoYW5nZXMiPgoKPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluRHluYW1pY0ZpZWxkRHJvcGRvd25Gcm9tREIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+IAo8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+IAo8R3JvdXA+RHluYW1pY0ZpZWxkczwvR3JvdXA+CjxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CjxTZXR0aW5nPiAKPEZyb250ZW5kTW9kdWxlUmVnPiAKPEdyb3VwPmFkbWluPC9Hcm91cD4KPERlc2NyaXB0aW9uPkFkbWluPC9EZXNjcmlwdGlvbj4KPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBGaWVsZHMgRHJvcC1kb3duIEZyb20gREIgQmFja2VuZCBHVUk8L1RpdGxlPgo8TG9hZGVyPgo8Q1NTPkNvcmUuQWdlbnQuQWRtaW4uRHluYW1pY0ZpZWxkLmNzczwvQ1NTPgo8SmF2YVNjcmlwdD5Db3JlLkFnZW50LkFkbWluLkR5bmFtaWNGaWVsZC5qczwvSmF2YVNjcmlwdD4gCjxKYXZhU2NyaXB0PkNvcmUuQWdlbnQuQWRtaW4uRHluYW1pY0ZpZWxkRHJvcGRvd24uanM8L0phdmFTY3JpcHQ+IAo8L0xvYWRlcj4gCjwvRnJvbnRlbmRNb2R1bGVSZWc+CjwvU2V0dGluZz4KPC9Db25maWdJdGVtPgoKPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluRHluYW1pY0ZpZWxkVGV4dEFyZWFGcm9tREIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+IAo8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+IAo8R3JvdXA+RHluYW1pY0ZpZWxkczwvR3JvdXA+CjxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CjxTZXR0aW5nPiAKPEZyb250ZW5kTW9kdWxlUmVnPiAKPEdyb3VwPmFkbWluPC9Hcm91cD4KPERlc2NyaXB0aW9uPkFkbWluPC9EZXNjcmlwdGlvbj4KPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBGaWVsZHMgRHJvcC1kb3duIEZyb20gREIgQmFja2VuZCBHVUk8L1RpdGxlPgo8TG9hZGVyPgo8Q1NTPkNvcmUuQWdlbnQuQWRtaW4uRHluYW1pY0ZpZWxkLmNzczwvQ1NTPgo8SmF2YVNjcmlwdD5Db3JlLkFnZW50LkFkbWluLkR5bmFtaWNGaWVsZC5qczwvSmF2YVNjcmlwdD4gCjxKYXZhU2NyaXB0PkNvcmUuQWdlbnQuQWRtaW4uRHluYW1pY0ZpZWxkVGV4dGFyZWEuanM8L0phdmFTY3JpcHQ+IAo8L0xvYWRlcj4gCjwvRnJvbnRlbmRNb2R1bGVSZWc+CjwvU2V0dGluZz4KPC9Db25maWdJdGVtPgoKPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluRHluYW1pY0ZpZWxkTXVsdGlzZWxlY3RGcm9tREIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+IAo8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+IAo8R3JvdXA+RHluYW1pY0ZpZWxkczwvR3JvdXA+CjxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CjxTZXR0aW5nPiAKPEZyb250ZW5kTW9kdWxlUmVnPiAKPEdyb3VwPmFkbWluPC9Hcm91cD4KPERlc2NyaXB0aW9uPkFkbWluPC9EZXNjcmlwdGlvbj4KPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBGaWVsZHMgTXVsdGlzZWxlY3QgRnJvbSBEQiBCYWNrZW5kIEdVSTwvVGl0bGU+CjxMb2FkZXI+CjxDU1M+Q29yZS5BZ2VudC5BZG1pbi5EeW5hbWljRmllbGQuY3NzPC9DU1M+CjxKYXZhU2NyaXB0PkNvcmUuQWdlbnQuQWRtaW4uRHluYW1pY0ZpZWxkLmpzPC9KYXZhU2NyaXB0PiAKPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5BZG1pbi5EeW5hbWljRmllbGREcm9wZG93bi5qczwvSmF2YVNjcmlwdD4gCjwvTG9hZGVyPiAKPC9Gcm9udGVuZE1vZHVsZVJlZz4KPC9TZXR0aW5nPgo8L0NvbmZpZ0l0ZW0+Cgo8Q29uZmlnSXRlbSBOYW1lPSJEeW5hbWljRmllbGRzOjpCYWNrZW5kIyMjRHJvcGRvd25Gcm9tREIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CjxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWNGaWVsZCBiYWNrZW5kIHJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgo8R3JvdXA+RHluYW1pY0ZpZWxkczwvR3JvdXA+CjxTdWJHcm91cD5EeW5hbWljRmllbGRzOjpCYWNrZW5kOjpSZWdpc3RyYXRpb248L1N1Ykdyb3VwPiAKPFNldHRpbmc+IAo8SGFzaD4KPEl0ZW0gS2V5PSJEaXNwbGF5TmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5Ecm9wZG93bkZyb21EQjwvSXRlbT4KPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQ6OkRyb3Bkb3duRnJvbURCPC9JdGVtPiAKPEl0ZW0gS2V5PSJDb25maWdEaWFsb2ciPkFkbWluRHluYW1pY0ZpZWxkRHJvcGRvd25Gcm9tREI8L0l0ZW0+IAo8L0hhc2g+IAo8L1NldHRpbmc+CjwvQ29uZmlnSXRlbT4KCjxDb25maWdJdGVtIE5hbWU9IkR5bmFtaWNGaWVsZHM6OkJhY2tlbmQjIyNUZXh0QXJlYUZyb21EQiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pY0ZpZWxkIGJhY2tlbmQgcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CjxHcm91cD5EeW5hbWljRmllbGRzPC9Hcm91cD4KPFN1Ykdyb3VwPkR5bmFtaWNGaWVsZHM6OkJhY2tlbmQ6OlJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+IAo8U2V0dGluZz4gCjxIYXNoPgo8SXRlbSBLZXk9IkRpc3BsYXlOYW1lIiBUcmFuc2xhdGFibGU9IjEiPlRleHRBcmVhRnJvbURCPC9JdGVtPgo8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDo6VGV4dEFyZWFGcm9tREI8L0l0ZW0+IAo8SXRlbSBLZXk9IkNvbmZpZ0RpYWxvZyI+QWRtaW5EeW5hbWljRmllbGRUZXh0QXJlYUZyb21EQjwvSXRlbT4gCjwvSGFzaD4gCjwvU2V0dGluZz4KPC9Db25maWdJdGVtPgoKPENvbmZpZ0l0ZW0gTmFtZT0iRHluYW1pY0ZpZWxkczo6QmFja2VuZCMjI011bHRpc2VsZWN0RnJvbURCIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgo8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljRmllbGQgYmFja2VuZCByZWdpc3RyYXRpb24uPC9EZXNjcmlwdGlvbj4KPEdyb3VwPkR5bmFtaWNGaWVsZHM8L0dyb3VwPgo8U3ViR3JvdXA+RHluYW1pY0ZpZWxkczo6QmFja2VuZDo6UmVnaXN0cmF0aW9uPC9TdWJHcm91cD4gCjxTZXR0aW5nPiAKPEhhc2g+CjxJdGVtIEtleT0iRGlzcGxheU5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+TXVsdGlzZWxlY3RGcm9tREI8L0l0ZW0+CjxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kOjpNdWx0aXNlbGVjdEZyb21EQjwvSXRlbT4gCjxJdGVtIEtleT0iSXRlbVNlcGFyYXRvciI+LCA8YnIvPjwvSXRlbT4gCjxJdGVtIEtleT0iQ29uZmlnRGlhbG9nIj5BZG1pbkR5bmFtaWNGaWVsZE11bHRpc2VsZWN0RnJvbURCPC9JdGVtPiAKPC9IYXNoPiAKPC9TZXR0aW5nPgo8L0NvbmZpZ0l0ZW0+CiAKPC9vdHJzX2NvbmZpZz4K</File>
<File Location="Kernel/Output/HTML/Standard/AdminDynamicFieldDropdownFromDB.dtl" Permission="644" Encode="Base64">IyAtLQojIEFkbWluRHluYW1pY0ZpZWxkRHJvcGRvd24uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkR5bmFtaWNGaWVsZHNEcm9wZG93bgojIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5EeW5hbWljRmllbGREcm9wZG93bi5kdGwsdiAxLjE2IDIwMTEvMTIvMDUgMDg6NDg6NDEgbWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPiRUZXh0eyJEeW5hbWljIEZpZWxkcyJ9IC0gJFRleHR7IiREYXRheyJPYmplY3RUeXBlTmFtZSJ9In06ICRUZXh0eyIkRGF0YXsiTW9kZSJ9In0gJFRleHR7IiREYXRheyJGaWVsZFR5cGVOYW1lIn0ifSAkVGV4dHsiRmllbGQifTwvaDE+CgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7IkFjdGlvbnMifTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9uTGlzdCI+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFkbWluRHluYW1pY0ZpZWxkIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+JFRleHR7IkdvIGJhY2sgdG8gb3ZlcnZpZXcifTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiIgc3R5bGU9Im1hcmdpbi10b3A6IDMwcHg7Ij4KICAgICAgICAgICAgJFRleHR7IlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBwcm92aWRlZCBieSJ9CiAgICAgICAgICAgIDxpbWcgc3JjPSIvb3Rycy13ZWIvc2tpbnMvQWdlbnQvZGVmYXVsdC9pbWcvU0RFcG93ZXJlZGJ5LnBuZyI+CiAgICAgICAgPC9wPgoKICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFkbWluRHluYW1pY0ZpZWxkRHJvcGRvd25Gcm9tREIiIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IiRRRGF0YXsiTW9kZSJ9QWN0aW9uIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJPYmplY3RUeXBlIiB2YWx1ZT0iJFFEYXRheyJPYmplY3RUeXBlIn0iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZpZWxkVHlwZSIgdmFsdWU9IiRRRGF0YXsiRmllbGRUeXBlIn0iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IklEIiB2YWx1ZT0iJFFEYXRheyJJRCJ9IiAvPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJHZW5lcmFsIn08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJMYXlvdXRHcmlkIENvbHVtbnNXaXRoU3BhY2luZyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNpemUxb2YyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJOYW1lIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiAkVGV4dHsiTmFtZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Ik5hbWUiIGNsYXNzPSJXNTBwYyAkUURhdGF7Ik5hbWVTZXJ2ZXJFcnJvciJ9ICRRRGF0YXsiU2hvd1dhcm5pbmcifSAgVmFsaWRhdGVfQWxwaGFudW1lcmljIiB0eXBlPSJ0ZXh0IiBtYXhsZW5ndGg9IjIwMCIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBuYW1lPSJOYW1lIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLCBhbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBhbHBoYWJldGljIGFuZCBudW1lcmljIGNoYXJhY3RlcnMgb25seS4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IiREYXRheyJOYW1lU2VydmVyRXJyb3JNZXNzYWdlIn0ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPiRUZXh0eyJNdXN0IGJlIHVuaXF1ZSBhbmQgb25seSBhY2NlcHQgYWxwaGFiZXRpYyBhbmQgbnVtZXJpYyBjaGFyYWN0ZXJzLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iV2FybmluZyBIaWRkZW4iPiRUZXh0eyJDaGFuZ2luZyB0aGlzIHZhbHVlIHdpbGwgcmVxdWlyZSBtYW51YWwgY2hhbmdlcyBpbiB0aGUgc3lzdGVtLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iTGFiZWwiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ICRUZXh0eyJMYWJlbCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkxhYmVsIiBjbGFzcz0iVzUwcGMgJFFEYXRheyJMYWJlbFNlcnZlckVycm9yIn0gVmFsaWRhdGVfUmVxdWlyZWQiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iMjAwIiB2YWx1ZT0iJFFEYXRheyJMYWJlbCJ9IiBuYW1lPSJMYWJlbCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJMYWJlbEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkxhYmVsU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiJERhdGF7IkxhYmVsU2VydmVyRXJyb3JNZXNzYWdlIn0ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPiRUZXh0eyJUaGlzIGlzIHRoZSBuYW1lIHRvIGJlIHNob3duIG9uIHRoZSBzY3JlZW5zIHdoZXJlIHRoZSBmaWVsZCBpcyBhY3RpdmUuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJGaWVsZE9yZGVyIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiAkVGV4dHsiRmllbGQgb3JkZXIifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkR5bmFtaWNGaWVsZE9yZGVyU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpZWxkT3JkZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIG51bWVyaWMuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpZWxkT3JkZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyIkRGF0YXsiRmllbGRPcmRlclNlcnZlckVycm9yTWVzc2FnZSJ9In08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4kVGV4dHsiVGhpcyBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhpcyBmaWVsZCB3aWxsIGJlIHNob3duIG9uIHRoZSBzY3JlZW5zIHdoZXJlIGlzIGFjdGl2ZS4ifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2l6ZTFvZjIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiPiRUZXh0eyJWYWxpZGl0eSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVmFsaWRpdHlTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpZWxkVHlwZU5hbWUiPiRUZXh0eyJGaWVsZCB0eXBlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iRmllbGRUeXBlTmFtZSIgcmVhZG9ubHk9InJlYWRvbmx5IiBjbGFzcz0iVzUwcGMiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iMjAwIiB2YWx1ZT0iJFFEYXRheyJGaWVsZFR5cGVOYW1lIn0iIG5hbWU9IkZpZWxkVHlwZU5hbWUiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPYmplY3RUeXBlTmFtZSI+JFRleHR7Ik9iamVjdCB0eXBlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iT2JqZWN0VHlwZU5hbWUiIHJlYWRvbmx5PSJyZWFkb25seSIgY2xhc3M9Ilc1MHBjIiB0eXBlPSJ0ZXh0IiBtYXhsZW5ndGg9IjIwMCIgdmFsdWU9IiRRRGF0YXsiT2JqZWN0VHlwZU5hbWUifSIgbmFtZT0iT2JqZWN0VHlwZU5hbWUiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiJERhdGF7IkZpZWxkVHlwZU5hbWUifSJ9ICRUZXh0eyJGaWVsZCBTZXR0aW5ncyJ9PC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGVmYXVsdFZhbHVlIj4kVGV4dHsiRGVmYXVsdCB2YWx1ZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJEZWZhdWx0VmFsdWVTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4kVGV4dHsiVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZC4ifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEZWZhdWx0VmFsdWUiPiRUZXh0eyJBZGQgZW1wdHkgdmFsdWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiUG9zc2libGVOb25lU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+JFRleHR7IkFjdGl2YXRlIHRoaXMgb3B0aW9uIHRvIGNyZWF0ZSBhbiBlbXB0eSBzZWxlY3RhYmxlIHZhbHVlLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVHJhbnNsYXRhYmxlVmFsdWVzIj4kVGV4dHsiVHJhbnNsYXRhYmxlIHZhbHVlcyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJUcmFuc2xhdGFibGVWYWx1ZXNTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4kVGV4dHsiSWYgeW91IGFjdGl2YXRlIHRoaXMgb3B0aW9uIHRoZSB2YWx1ZXMgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRoZSB1c2VyIGRlZmluZWQgbGFuZ3VhZ2UuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+PHN0cm9uZz4kVGV4dHsiTm90ZSJ9OiA8L3N0cm9uZz4kVGV4dHsiWW91IG5lZWQgdG8gYWRkIHRoZSB0cmFuc2xhdGlvbnMgbWFudWFsbHkgaW50byB0aGUgbGFuZ3VhZ2UgdHJhbnNsYXRpb24gZmlsZXMuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkxpbmsiPiRUZXh0eyJTaG93IGxpbmsifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkxpbmsiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IkxpbmsifSIgbmFtZT0iTGluayIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJIZXJlIHlvdSBjYW4gc3BlY2lmeSBhbiBvcHRpb25hbCBIVFRQIGxpbmsgZm9yIHRoZSBmaWVsZCB2YWx1ZSBpbiBPdmVydmlld3MgYW5kIFpvb20gc2NyZWVucy4ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IllvdSBjYW4gc3BlY2lmeSB0aGUgS2V5IGluc3RlYWQgb2YgdGhlIFZhbHVlIHB1dHRpbmcgdGhlICclS0VZJScgcGxhY2Vob2xkZXIuIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJFeGFtcGxlIn06IGh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT08c3Bhbj4kPC9zcGFuPkxRRGF0YXsiRmllbGQxIn0/a2V5aWQ9JUtFWSUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkRCSXN0cmluZyI+JFRleHR7IkRCSSBjb25uZWN0IHN0cmluZyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iREJJc3RyaW5nIiBjbGFzcz0iVzUwcGMiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iNTAwIiB2YWx1ZT0iJFFEYXRheyJEQklzdHJpbmcifSIgbmFtZT0iREJJc3RyaW5nIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlNwZWNpZnkgdGhlIERCSSBjb25uZWN0IHN0cmluZy4gSWYgbm90aGluZyBpcyBzcGVjaWZpZWQsIHRoZSBsb2NhbCBEQk9iamVjdCBvZiBvdHJzIGlzIHVzZWQuIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJFeGFtcGxlIn06IERCSTpteXNxbDpkYXRhYmFzZW5hbWU7aG9zdD1kYi5leGFtcGxlLmNvbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEQkl1c2VyIj4kVGV4dHsiREIgdXNlcm5hbWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkRCSXVzZXIiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IkRCSXVzZXIifSIgbmFtZT0iREJJdXNlciIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJTcGVjaWZ5IHRoZSBEQiB1c2VybmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEQklwYXNzIj4kVGV4dHsiREIgcGFzc3dvcmQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkRCSXBhc3MiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IkRCSXBhc3MifSIgbmFtZT0iREJJcGFzcyIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJTcGVjaWZ5IHRoZSBEQiBwYXNzd29yZCJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCQkJPGxhYmVsIGZvcj0iUXVlcnkiPiRUZXh0eyJRdWVyeSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUXVlcnkiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dGFyZWEiIHJvd3M9IjUiIG1heGxlbmd0aD0iMTAwMCIgbmFtZT0iUXVlcnkiPiRRRGF0YXsiUXVlcnkifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkhlcmUgeW91IGNhbiBzcGVjaWZ5IHRoZSBxdWVyeSB0byBleGVjdXRlIGZvciB0aGUgaXRlbXMgaW4gdGhlIER5bmFtaWNGaWVsZC4gUHV0IGEgPyBQbGFjZWhvbGRlciBmb3IgZWFjaCBQYXJhbWV0ZXIuIn0KCQkJCTxici8+CgkJCQkkVGV4dHsiS2VlcCBpbiBtaW5kIHRoYXQgb25seSB0aGUgZmlyc3QgY29sdW1uIGlzIHN0b3JlZCAoYW5kIG5vdCB2aXN1YWxpemVkIGluIHRoZSBvdXRwdXQpIGFzIGtleSwgc28gc3BlY2lmeWluZyBhbiB1bmlxdWUgaWRlbnRpZmllciBpcyBtYW5kYXRvcnkuIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJFeGFtcGxlIHdpdGggcGFyYW1ldGVycyJ9OiBTRUxFQ1QgaWQsIG5hbWUgRlJPTSB0YWJsZSBXSEVSRSByZWZpZCA9ID8KCQkJCTxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkV4YW1wbGUgd2l0aG91dCBwYXJhbWV0ZXJzIn06IFNFTEVDVCBpZCwgbmFtZSBGUk9NIHRhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0b3JlVmFsdWUiPiRUZXh0eyJTdG9yZSBLZXkgYW5kIFZhbHVlIGluIERCIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlN0b3JlVmFsdWUifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPiRUZXh0eyJBY3RpdmF0ZSB0aGlzIG9wdGlvbiB0byBzdG9yZSBLZXkgYW5kIFZhbHVlcyBpbiBEQi4gSWYgYWN0aXZhdGVkLCBubyBtb3JlIFZpc3VhbGl6YXRpb24gUXVlcnkgaXMgbmVlZGVkLiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgJzxrZXk+fHw8dmFsdWU+JyBmb3JtYXQgaW4gdGhlIGRhdGFiYXNlLiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoJCQk8bGFiZWwgZm9yPSJWaXN1YWxRdWVyeSI+JFRleHR7IlZpc3VhbGl6YXRpb24gUXVlcnkifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlZpc3VhbFF1ZXJ5IiBjbGFzcz0iVzUwcGMiIHR5cGU9InRleHRhcmVhIiByb3dzPSIzIiBtYXhsZW5ndGg9IjUwMCIgbmFtZT0iVmlzdWFsUXVlcnkiPiRRRGF0YXsiVmlzdWFsUXVlcnkifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkhlcmUgeW91IG11c3Qgc3BlY2lmeSB0aGUgcXVlcnkgdG8gZXhlY3V0ZSBmb3IgcmV0cmlldmluZyBiYWNrIHRoZSBzdHJpbmcgdmlzdWFsaXplZCBvbmNlIHN0b3JlZCB0aGUga2V5LiBUaGlzIHF1ZXJ5ICptdXN0KiBoYXZlICpvbmx5IG9uZSogUGFyYW1ldGVyIHRoYXQgaXMgc3VzYnRpdHV0ZWQgd2l0aCB0aGUgc3RvcmVkIGtleS4ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkV4YW1wbGUgd2l0aCBwYXJhbWV0ZXJzIn06IFNFTEVDVCBuYW1lIEZST00gdGFibGUgV0hFUkUgaWQgPSA/CgkJCQk8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJOT1RFOiBUaGlzIGZlYXR1cmUgaXMgb25seSBhdmFpbGFibGUgd2l0aCB0aGUgT1RSU1RpY2tldE1hc2tFeHRlbnNpb24gYWRkLW9uIG9uIHdoaWNoIGl0IGRlcGVuZHMgb24uIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCQkJPGxhYmVsIGZvcj0iUGFyYW1ldGVycyI+JFRleHR7IlBhcmFtZXRlcnMifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IlBhcmFtZXRlcnMiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IlBhcmFtZXRlcnMifSIgbmFtZT0iUGFyYW1ldGVycyIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJIZXJlIHlvdSBtdXN0IHNwZWNpZnkgdGhlIFBhcmFtZXRlcnMuIE9SREVSIElTIFJFTEVWQU5UISJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KIAkJCQkkVGV4dHsiSU1QT1JUQU5UOiBkb24ndCBwdXQgYW55IHNwYWNlcyBiZWZvcmUvYWZ0ZXIgcGFyYW1ldGVycyEifQoJCQkJPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRXhhbXBsZSJ9OiBDdXN0b21lcixGcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoJCQk8bGFiZWwgZm9yPSJTZXBhcmF0b3IiPiRUZXh0eyJTZXBhcmF0b3IifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IlNlcGFyYXRvciIgY2xhc3M9Ilc1MHBjIiB0eXBlPSJ0ZXh0IiBtYXhsZW5ndGg9IjUwMCIgdmFsdWU9IiRRRGF0YXsiU2VwYXJhdG9yIn0iIG5hbWU9IlNlcGFyYXRvciIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJXaGVuIG11bHRpcGxlIGNvbHVtbnMgYXJlIHNlbGVjdGVkIGluIHRoZSBxdWVyeSwgdGhlIGFyZSBjb25jYXRlbmV0ZWQgaW4gYSBzaW5nbGUgcm93LiBTcGVjaWZ5IHRoZSBzZXBhcmF0b3IgaGVyZS4ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRXhhbXBsZSJ9OiAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRNYXNrRXh0ZW5zaW9uRGlzYWJsZWQgLS0+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCQkgICQoIiNTZXBhcmF0b3IiKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoJCQkgICQoIiNTZXBhcmF0b3IiKS5hdHRyKCJ2YWx1ZSIsICIobm90IGF2YWlsYWJsZSkiKTsKCQkJICAkKCIjU2VwYXJhdG9yIikuY3NzKHtjb2xvcjonIzk5OTk5OSd9KTsKCQkJICAkKCIjUGFyYW1ldGVycyIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgkJCSAgJCgiI1BhcmFtZXRlcnMiKS5hdHRyKCJ2YWx1ZSIsICIobm90IGF2YWlsYWJsZSkiKTsKCQkJICAkKCIjUGFyYW1ldGVycyIpLmNzcyh7Y29sb3I6JyM5OTk5OTknfSk7CiAgICAgICAgICAgICAgICAgICAgICAgPC9zY3JpcHQ+Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0TWFza0V4dGVuc2lvbkRpc2FibGVkIC0tPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoJCQk8bGFiZWwgZm9yPSJDYWNoZVRUTCI+JFRleHR7IkNhY2hlIFRpbWUgVG8gTGl2ZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iQ2FjaGVUVEwiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IkNhY2hlVFRMIn0iIG5hbWU9IkNhY2hlVFRMIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlNwZWNpZnkgdGhlIGNhY2hlIHZhbGlkaXR5IGluIHNlY29uZHMuIENvbnNpZGVyIHRoYXQgb25seSBxdWVyaWVzIHdpdGggaWRlbnRpY2FsIHBhcmFtZXRlcnMgYXJlIGNhY2hlZC4ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRXhhbXBsZSJ9OiAzNjAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEaXNwbGF5RXJyb3JzIj4kVGV4dHsiREVCVUc6IERpc3BsYXkgRXJyb3JzIGluIEZvcm0ifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiRGlzcGxheUVycm9yc1N0cmcifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPiRUZXh0eyJBY3RpdmF0ZSB0aGlzIG9wdGlvbiB0byBlbmFibGUgbGl2ZSBkZWJ1ZyBvdXRwdXQgaW4gZmllbGRzLiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAKICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iUHJpbWFyeSIgdmFsdWU9IiRUZXh0eyJTYXZlIn0iPiRUZXh0eyJTYXZlIn08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsib3IifQogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWRtaW5EeW5hbWljRmllbGQiPiRUZXh0eyJDYW5jZWwifTwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgIDwvZm9ybT4KICAgIDwvZGl2Pgo8L2Rpdj4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKJCgnLlNob3dXYXJuaW5nJykuYmluZCgnY2hhbmdlIGtleXVwJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAkKCdwLldhcm5pbmcnKS5yZW1vdmVDbGFzcygnSGlkZGVuJyk7Cn0pOwoKLy9iaW5kIGNsaWNrIGZ1bmN0aW9uIHRvIGFkZCBidXR0b24KJCgnI0FkZFZhbHVlJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICBDb3JlLkFnZW50LkFkbWluLkR5bmFtaWNGaWVsZERyb3Bkb3duLkFkZFZhbHVlKAogICAgICAgICQodGhpcykuY2xvc2VzdCgnZmllbGRzZXQnKS5maW5kKCcuVmFsdWVJbnNlcnQnKQogICAgKTsKICAgIHJldHVybiBmYWxzZTsKfSk7CgovL2JpbmQgY2xpY2sgZnVuY3Rpb24gdG8gcmVtb3ZlIGJ1dHRvbgokKCcuVmFsdWVSZW1vdmUnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgIENvcmUuQWdlbnQuQWRtaW4uRHluYW1pY0ZpZWxkRHJvcGRvd24uUmVtb3ZlVmFsdWUoJCh0aGlzKS5hdHRyKCdpZCcpKTsKICAgIHJldHVybiBmYWxzZTsKfSk7CgokKCcuRGVmYXVsdFZhbHVlS2V5SXRlbSwuRGVmYXVsdFZhbHVlSXRlbScpLmJpbmQoJ2tleXVwJywgZnVuY3Rpb24gKCkgewogICAgQ29yZS5BZ2VudC5BZG1pbi5EeW5hbWljRmllbGREcm9wZG93bi5SZWNyZWF0ZURlZmF1bHRWYWx1ZUxpc3QoKTsKfSk7CgpmdW5jdGlvbiB0b2dnbGVWaXN1YWxRdWVyeSgpIHsKICAgICAgICBpZiAoJCgnI1N0b3JlVmFsdWUnKS52YWwoKSA9PSAiMCIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJCgnI1Zpc3VhbFF1ZXJ5JykuYXR0cigncmVhZG9ubHknLG51bGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICQoJyNWaXN1YWxRdWVyeScpLmF0dHIoJ3JlYWRvbmx5JywncmVhZG9ubHknKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIH0KfQoKJCgnI1N0b3JlVmFsdWUnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7Cgl0b2dnbGVWaXN1YWxRdWVyeSgpOwp9KTsKCnRvZ2dsZVZpc3VhbFF1ZXJ5KCk7CgpDb3JlLkFnZW50LkFkbWluLkR5bmFtaWNGaWVsZC5WYWxpZGF0aW9uSW5pdCgpOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+Cg==</File>
<File Location="Kernel/Output/HTML/Standard/AdminDynamicFieldTextAreaFromDB.dtl" Permission="644" Encode="Base64">IyAtLQojIEFkbWluRHluYW1pY0ZpZWxkRHJvcGRvd24uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkR5bmFtaWNGaWVsZHNEcm9wZG93bgojIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5EeW5hbWljRmllbGREcm9wZG93bi5kdGwsdiAxLjE2IDIwMTEvMTIvMDUgMDg6NDg6NDEgbWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPiRUZXh0eyJEeW5hbWljIEZpZWxkcyJ9IC0gJFRleHR7IiREYXRheyJPYmplY3RUeXBlTmFtZSJ9In06ICRUZXh0eyIkRGF0YXsiTW9kZSJ9In0gJFRleHR7IiREYXRheyJGaWVsZFR5cGVOYW1lIn0ifSAkVGV4dHsiRmllbGQifTwvaDE+CgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7IkFjdGlvbnMifTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9uTGlzdCI+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFkbWluRHluYW1pY0ZpZWxkIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+JFRleHR7IkdvIGJhY2sgdG8gb3ZlcnZpZXcifTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgoJIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIiBzdHlsZT0ibWFyZ2luLXRvcDogMzBweDsiPgogICAgICAgICAgICAkVGV4dHsiVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIGJ5In0KICAgICAgICAgICAgPGltZyBzcmM9Ii9vdHJzLXdlYi9za2lucy9BZ2VudC9kZWZhdWx0L2ltZy9TREVwb3dlcmVkYnkucG5nIj4KICAgICAgICA8L3A+CgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFkbWluRHluYW1pY0ZpZWxkVGV4dEFyZWFGcm9tREIiIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IiRRRGF0YXsiTW9kZSJ9QWN0aW9uIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJPYmplY3RUeXBlIiB2YWx1ZT0iJFFEYXRheyJPYmplY3RUeXBlIn0iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZpZWxkVHlwZSIgdmFsdWU9IiRRRGF0YXsiRmllbGRUeXBlIn0iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IklEIiB2YWx1ZT0iJFFEYXRheyJJRCJ9IiAvPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJHZW5lcmFsIn08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJMYXlvdXRHcmlkIENvbHVtbnNXaXRoU3BhY2luZyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNpemUxb2YyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJOYW1lIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiAkVGV4dHsiTmFtZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Ik5hbWUiIGNsYXNzPSJXNTBwYyAkUURhdGF7Ik5hbWVTZXJ2ZXJFcnJvciJ9ICRRRGF0YXsiU2hvd1dhcm5pbmcifSAgVmFsaWRhdGVfQWxwaGFudW1lcmljIiB0eXBlPSJ0ZXh0IiBtYXhsZW5ndGg9IjIwMCIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBuYW1lPSJOYW1lIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLCBhbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBhbHBoYWJldGljIGFuZCBudW1lcmljIGNoYXJhY3RlcnMgb25seS4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IiREYXRheyJOYW1lU2VydmVyRXJyb3JNZXNzYWdlIn0ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPiRUZXh0eyJNdXN0IGJlIHVuaXF1ZSBhbmQgb25seSBhY2NlcHQgYWxwaGFiZXRpYyBhbmQgbnVtZXJpYyBjaGFyYWN0ZXJzLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iV2FybmluZyBIaWRkZW4iPiRUZXh0eyJDaGFuZ2luZyB0aGlzIHZhbHVlIHdpbGwgcmVxdWlyZSBtYW51YWwgY2hhbmdlcyBpbiB0aGUgc3lzdGVtLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iTGFiZWwiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ICRUZXh0eyJMYWJlbCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkxhYmVsIiBjbGFzcz0iVzUwcGMgJFFEYXRheyJMYWJlbFNlcnZlckVycm9yIn0gVmFsaWRhdGVfUmVxdWlyZWQiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iMjAwIiB2YWx1ZT0iJFFEYXRheyJMYWJlbCJ9IiBuYW1lPSJMYWJlbCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJMYWJlbEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkxhYmVsU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiJERhdGF7IkxhYmVsU2VydmVyRXJyb3JNZXNzYWdlIn0ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPiRUZXh0eyJUaGlzIGlzIHRoZSBuYW1lIHRvIGJlIHNob3duIG9uIHRoZSBzY3JlZW5zIHdoZXJlIHRoZSBmaWVsZCBpcyBhY3RpdmUuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJGaWVsZE9yZGVyIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiAkVGV4dHsiRmllbGQgb3JkZXIifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkR5bmFtaWNGaWVsZE9yZGVyU3J0ZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpZWxkT3JkZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIG51bWVyaWMuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpZWxkT3JkZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyIkRGF0YXsiRmllbGRPcmRlclNlcnZlckVycm9yTWVzc2FnZSJ9In08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4kVGV4dHsiVGhpcyBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhpcyBmaWVsZCB3aWxsIGJlIHNob3duIG9uIHRoZSBzY3JlZW5zIHdoZXJlIGlzIGFjdGl2ZS4ifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2l6ZTFvZjIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiPiRUZXh0eyJWYWxpZGl0eSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVmFsaWRpdHlTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpZWxkVHlwZU5hbWUiPiRUZXh0eyJGaWVsZCB0eXBlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iRmllbGRUeXBlTmFtZSIgcmVhZG9ubHk9InJlYWRvbmx5IiBjbGFzcz0iVzUwcGMiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iMjAwIiB2YWx1ZT0iJFFEYXRheyJGaWVsZFR5cGVOYW1lIn0iIG5hbWU9IkZpZWxkVHlwZU5hbWUiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPYmplY3RUeXBlTmFtZSI+JFRleHR7Ik9iamVjdCB0eXBlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iT2JqZWN0VHlwZU5hbWUiIHJlYWRvbmx5PSJyZWFkb25seSIgY2xhc3M9Ilc1MHBjIiB0eXBlPSJ0ZXh0IiBtYXhsZW5ndGg9IjIwMCIgdmFsdWU9IiRRRGF0YXsiT2JqZWN0VHlwZU5hbWUifSIgbmFtZT0iT2JqZWN0VHlwZU5hbWUiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiJERhdGF7IkZpZWxkVHlwZU5hbWUifSJ9ICRUZXh0eyJGaWVsZCBTZXR0aW5ncyJ9PC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGVmYXVsdFZhbHVlIj4kVGV4dHsiRGVmYXVsdCB2YWx1ZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJEZWZhdWx0VmFsdWVTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4kVGV4dHsiVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZC4ifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEZWZhdWx0VmFsdWUiPiRUZXh0eyJBZGQgZW1wdHkgdmFsdWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiUG9zc2libGVOb25lU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+JFRleHR7IkFjdGl2YXRlIHRoaXMgb3B0aW9uIHRvIGNyZWF0ZSBhbiBlbXB0eSBzZWxlY3RhYmxlIHZhbHVlLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVHJhbnNsYXRhYmxlVmFsdWVzIj4kVGV4dHsiVHJhbnNsYXRhYmxlIHZhbHVlcyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJUcmFuc2xhdGFibGVWYWx1ZXNTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4kVGV4dHsiSWYgeW91IGFjdGl2YXRlIHRoaXMgb3B0aW9uIHRoZSB2YWx1ZXMgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRoZSB1c2VyIGRlZmluZWQgbGFuZ3VhZ2UuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+PHN0cm9uZz4kVGV4dHsiTm90ZSJ9OiA8L3N0cm9uZz4kVGV4dHsiWW91IG5lZWQgdG8gYWRkIHRoZSB0cmFuc2xhdGlvbnMgbWFudWFsbHkgaW50byB0aGUgbGFuZ3VhZ2UgdHJhbnNsYXRpb24gZmlsZXMuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iREJJc3RyaW5nIj4kVGV4dHsiREJJIGNvbm5lY3Qgc3RyaW5nIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJEQklzdHJpbmciIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IkRCSXN0cmluZyJ9IiBuYW1lPSJEQklzdHJpbmciLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiU3BlY2lmeSB0aGUgREJJIGNvbm5lY3Qgc3RyaW5nIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJFeGFtcGxlIn06IERCSTpteXNxbDpkYXRhYmFzZW5hbWU7aG9zdD1kYi5leGFtcGxlLmNvbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEQkl1c2VyIj4kVGV4dHsiREIgdXNlcm5hbWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkRCSXVzZXIiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IkRCSXVzZXIifSIgbmFtZT0iREJJdXNlciIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJTcGVjaWZ5IHRoZSBEQiB1c2VybmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEQklwYXNzIj4kVGV4dHsiREIgcGFzc3dvcmQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkRCSXBhc3MiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IkRCSXBhc3MifSIgbmFtZT0iREJJcGFzcyIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJTcGVjaWZ5IHRoZSBEQiBwYXNzd29yZCJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCQkJPGxhYmVsIGZvcj0iUXVlcnkiPiRUZXh0eyJRdWVyeSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUXVlcnkiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dGFyZWEiIHJvd3M9IjUiIG1heGxlbmd0aD0iMTAwMCIgbmFtZT0iUXVlcnkiPiRRRGF0YXsiUXVlcnkifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkhlcmUgeW91IGNhbiBzcGVjaWZ5IHRoZSBxdWVyeSB0byBleGVjdXRlIGZvciB0aGUgaXRlbXMgaW4gdGhlIER5bmFtaWNGaWVsZC4gUHV0IGEgPyBQbGFjZWhvbGRlciBmb3IgZWFjaCBQYXJhbWV0ZXIuIn0KCQkJCTxici8+CgkJCQkkVGV4dHsiRWFjaCBjb2x1bW4gd2lsbCB0aGVuIHZpc3VhbGl6ZWQgbGlrZSAnQ09MVU1OTkFNRTogVkFMVUUnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJFeGFtcGxlIHdpdGggcGFyYW1ldGVycyJ9OiBTRUxFQ1QgbmFtZSBGUk9NIHRhYmxlIFdIRVJFIGlkID0gPwoJCQkJPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRXhhbXBsZSB3aXRob3V0IHBhcmFtZXRlcnMifTogU0VMRUNUIG5hbWUgRlJPTSB0YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoJCQk8bGFiZWwgZm9yPSJQYXJhbWV0ZXJzIj4kVGV4dHsiUGFyYW1ldGVycyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iUXVlcnkiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IlBhcmFtZXRlcnMifSIgbmFtZT0iUGFyYW1ldGVycyIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJIZXJlIHlvdSBtdXN0IHNwZWNpZnkgdGhlIFBhcmFtZXRlcnMuIE9SREVSIElTIFJFTEVWQU5UISJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KIAkJCQkkVGV4dHsiSU1QT1JUQU5UOiBkb24ndCBwdXQgYW55IHNwYWNlcyBiZWZvcmUvYWZ0ZXIgcGFyYW1ldGVycyEifQoJCQkJPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRXhhbXBsZSJ9OiBDdXN0b21lcixGcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgkJCTxsYWJlbCBmb3I9IkNhY2hlVFRMIj4kVGV4dHsiQ2FjaGUgVGltZSBUbyBMaXZlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJDYWNoZVRUTCIgY2xhc3M9Ilc1MHBjIiB0eXBlPSJ0ZXh0IiBtYXhsZW5ndGg9IjUwMCIgdmFsdWU9IiRRRGF0YXsiQ2FjaGVUVEwifSIgbmFtZT0iQ2FjaGVUVEwiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiU3BlY2lmeSB0aGUgY2FjaGUgdmFsaWRpdHkgaW4gc2Vjb25kcy4gQ29uc2lkZXIgdGhhdCBvbmx5IHF1ZXJpZXMgd2l0aCBpZGVudGljYWwgcGFyYW1ldGVycyBhcmUgY2FjaGVkLiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJFeGFtcGxlIn06IDM2MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIAogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEaXNwbGF5RXJyb3JzIj4kVGV4dHsiREVCVUc6IERpc3BsYXkgRXJyb3JzIGluIEZvcm0ifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiRGlzcGxheUVycm9ycyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+JFRleHR7IkFjdGl2YXRlIHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBsaXZlIGRlYnVnIG91dHB1dCBpbiBmaWVsZHMuIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJQcmltYXJ5IiB2YWx1ZT0iJFRleHR7IlNhdmUifSI+JFRleHR7IlNhdmUifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJvciJ9CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZG1pbkR5bmFtaWNGaWVsZCI+JFRleHR7IkNhbmNlbCJ9PC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgPC9mb3JtPgogICAgPC9kaXY+CjwvZGl2Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcuU2hvd1dhcm5pbmcnKS5iaW5kKCdjaGFuZ2Uga2V5dXAnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICQoJ3AuV2FybmluZycpLnJlbW92ZUNsYXNzKCdIaWRkZW4nKTsKfSk7CgovL2JpbmQgY2xpY2sgZnVuY3Rpb24gdG8gYWRkIGJ1dHRvbgokKCcjQWRkVmFsdWUnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgIENvcmUuQWdlbnQuQWRtaW4uRHluYW1pY0ZpZWxkRHJvcGRvd24uQWRkVmFsdWUoCiAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCdmaWVsZHNldCcpLmZpbmQoJy5WYWx1ZUluc2VydCcpCiAgICApOwogICAgcmV0dXJuIGZhbHNlOwp9KTsKCi8vYmluZCBjbGljayBmdW5jdGlvbiB0byByZW1vdmUgYnV0dG9uCiQoJy5WYWx1ZVJlbW92ZScpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgQ29yZS5BZ2VudC5BZG1pbi5EeW5hbWljRmllbGREcm9wZG93bi5SZW1vdmVWYWx1ZSgkKHRoaXMpLmF0dHIoJ2lkJykpOwogICAgcmV0dXJuIGZhbHNlOwp9KTsKCiQoJy5EZWZhdWx0VmFsdWVLZXlJdGVtLC5EZWZhdWx0VmFsdWVJdGVtJykuYmluZCgna2V5dXAnLCBmdW5jdGlvbiAoKSB7CiAgICBDb3JlLkFnZW50LkFkbWluLkR5bmFtaWNGaWVsZERyb3Bkb3duLlJlY3JlYXRlRGVmYXVsdFZhbHVlTGlzdCgpOwp9KTsKCkNvcmUuQWdlbnQuQWRtaW4uRHluYW1pY0ZpZWxkLlZhbGlkYXRpb25Jbml0KCk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4K</File>
<File Location="Kernel/Output/HTML/Standard/AdminDynamicFieldMultiselectFromDB.dtl" Permission="644" Encode="Base64">IyAtLQojIEFkbWluRHluYW1pY0ZpZWxkRHJvcGRvd24uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkR5bmFtaWNGaWVsZHNEcm9wZG93bgojIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5EeW5hbWljRmllbGREcm9wZG93bi5kdGwsdiAxLjE2IDIwMTEvMTIvMDUgMDg6NDg6NDEgbWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPiRUZXh0eyJEeW5hbWljIEZpZWxkcyJ9IC0gJFRleHR7IiREYXRheyJPYmplY3RUeXBlTmFtZSJ9In06ICRUZXh0eyIkRGF0YXsiTW9kZSJ9In0gJFRleHR7IiREYXRheyJGaWVsZFR5cGVOYW1lIn0ifSAkVGV4dHsiRmllbGQifTwvaDE+CgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7IkFjdGlvbnMifTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9uTGlzdCI+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFkbWluRHluYW1pY0ZpZWxkIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+JFRleHR7IkdvIGJhY2sgdG8gb3ZlcnZpZXcifTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFkbWluRHluYW1pY0ZpZWxkRHJvcGRvd25Gcm9tREIiIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IiRRRGF0YXsiTW9kZSJ9QWN0aW9uIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJPYmplY3RUeXBlIiB2YWx1ZT0iJFFEYXRheyJPYmplY3RUeXBlIn0iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZpZWxkVHlwZSIgdmFsdWU9IiRRRGF0YXsiRmllbGRUeXBlIn0iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IklEIiB2YWx1ZT0iJFFEYXRheyJJRCJ9IiAvPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJHZW5lcmFsIn08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJMYXlvdXRHcmlkIENvbHVtbnNXaXRoU3BhY2luZyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNpemUxb2YyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJOYW1lIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiAkVGV4dHsiTmFtZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Ik5hbWUiIGNsYXNzPSJXNTBwYyAkUURhdGF7Ik5hbWVTZXJ2ZXJFcnJvciJ9ICRRRGF0YXsiU2hvd1dhcm5pbmcifSAgVmFsaWRhdGVfQWxwaGFudW1lcmljIiB0eXBlPSJ0ZXh0IiBtYXhsZW5ndGg9IjIwMCIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBuYW1lPSJOYW1lIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLCBhbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBhbHBoYWJldGljIGFuZCBudW1lcmljIGNoYXJhY3RlcnMgb25seS4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IiREYXRheyJOYW1lU2VydmVyRXJyb3JNZXNzYWdlIn0ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPiRUZXh0eyJNdXN0IGJlIHVuaXF1ZSBhbmQgb25seSBhY2NlcHQgYWxwaGFiZXRpYyBhbmQgbnVtZXJpYyBjaGFyYWN0ZXJzLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iV2FybmluZyBIaWRkZW4iPiRUZXh0eyJDaGFuZ2luZyB0aGlzIHZhbHVlIHdpbGwgcmVxdWlyZSBtYW51YWwgY2hhbmdlcyBpbiB0aGUgc3lzdGVtLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iTGFiZWwiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ICRUZXh0eyJMYWJlbCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkxhYmVsIiBjbGFzcz0iVzUwcGMgJFFEYXRheyJMYWJlbFNlcnZlckVycm9yIn0gVmFsaWRhdGVfUmVxdWlyZWQiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iMjAwIiB2YWx1ZT0iJFFEYXRheyJMYWJlbCJ9IiBuYW1lPSJMYWJlbCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJMYWJlbEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkxhYmVsU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiJERhdGF7IkxhYmVsU2VydmVyRXJyb3JNZXNzYWdlIn0ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPiRUZXh0eyJUaGlzIGlzIHRoZSBuYW1lIHRvIGJlIHNob3duIG9uIHRoZSBzY3JlZW5zIHdoZXJlIHRoZSBmaWVsZCBpcyBhY3RpdmUuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJGaWVsZE9yZGVyIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiAkVGV4dHsiRmllbGQgb3JkZXIifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkR5bmFtaWNGaWVsZE9yZGVyU3J0ZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpZWxkT3JkZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIG51bWVyaWMuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpZWxkT3JkZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyIkRGF0YXsiRmllbGRPcmRlclNlcnZlckVycm9yTWVzc2FnZSJ9In08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4kVGV4dHsiVGhpcyBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhpcyBmaWVsZCB3aWxsIGJlIHNob3duIG9uIHRoZSBzY3JlZW5zIHdoZXJlIGlzIGFjdGl2ZS4ifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2l6ZTFvZjIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiPiRUZXh0eyJWYWxpZGl0eSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVmFsaWRpdHlTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpZWxkVHlwZU5hbWUiPiRUZXh0eyJGaWVsZCB0eXBlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iRmllbGRUeXBlTmFtZSIgcmVhZG9ubHk9InJlYWRvbmx5IiBjbGFzcz0iVzUwcGMiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iMjAwIiB2YWx1ZT0iJFFEYXRheyJGaWVsZFR5cGVOYW1lIn0iIG5hbWU9IkZpZWxkVHlwZU5hbWUiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPYmplY3RUeXBlTmFtZSI+JFRleHR7Ik9iamVjdCB0eXBlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iT2JqZWN0VHlwZU5hbWUiIHJlYWRvbmx5PSJyZWFkb25seSIgY2xhc3M9Ilc1MHBjIiB0eXBlPSJ0ZXh0IiBtYXhsZW5ndGg9IjIwMCIgdmFsdWU9IiRRRGF0YXsiT2JqZWN0VHlwZU5hbWUifSIgbmFtZT0iT2JqZWN0VHlwZU5hbWUiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiJERhdGF7IkZpZWxkVHlwZU5hbWUifSJ9ICRUZXh0eyJGaWVsZCBTZXR0aW5ncyJ9PC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGVmYXVsdFZhbHVlIj4kVGV4dHsiRGVmYXVsdCB2YWx1ZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJEZWZhdWx0VmFsdWVTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4kVGV4dHsiVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZC4ifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEZWZhdWx0VmFsdWUiPiRUZXh0eyJBZGQgZW1wdHkgdmFsdWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiUG9zc2libGVOb25lU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+JFRleHR7IkFjdGl2YXRlIHRoaXMgb3B0aW9uIHRvIGNyZWF0ZSBhbiBlbXB0eSBzZWxlY3RhYmxlIHZhbHVlLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVHJhbnNsYXRhYmxlVmFsdWVzIj4kVGV4dHsiVHJhbnNsYXRhYmxlIHZhbHVlcyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJUcmFuc2xhdGFibGVWYWx1ZXNTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4kVGV4dHsiSWYgeW91IGFjdGl2YXRlIHRoaXMgb3B0aW9uIHRoZSB2YWx1ZXMgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRoZSB1c2VyIGRlZmluZWQgbGFuZ3VhZ2UuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+PHN0cm9uZz4kVGV4dHsiTm90ZSJ9OiA8L3N0cm9uZz4kVGV4dHsiWW91IG5lZWQgdG8gYWRkIHRoZSB0cmFuc2xhdGlvbnMgbWFudWFsbHkgaW50byB0aGUgbGFuZ3VhZ2UgdHJhbnNsYXRpb24gZmlsZXMuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkxpbmsiPiRUZXh0eyJTaG93IGxpbmsifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkxpbmsiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IkxpbmsifSIgbmFtZT0iTGluayIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJIZXJlIHlvdSBjYW4gc3BlY2lmeSBhbiBvcHRpb25hbCBIVFRQIGxpbmsgZm9yIHRoZSBmaWVsZCB2YWx1ZSBpbiBPdmVydmlld3MgYW5kIFpvb20gc2NyZWVucy4ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IllvdSBjYW4gc3BlY2lmeSB0aGUgS2V5IGluc3RlYWQgb2YgdGhlIFZhbHVlIHB1dHRpbmcgdGhlICclS0VZJScgcGxhY2Vob2xkZXIuIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJFeGFtcGxlIn06IGh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT08c3Bhbj4kPC9zcGFuPkxRRGF0YXsiRmllbGQxIn0/a2V5aWQ9JUtFWSUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkRCSXN0cmluZyI+JFRleHR7IkRCSSBjb25uZWN0IHN0cmluZyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iREJJc3RyaW5nIiBjbGFzcz0iVzUwcGMiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iNTAwIiB2YWx1ZT0iJFFEYXRheyJEQklzdHJpbmcifSIgbmFtZT0iREJJc3RyaW5nIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlNwZWNpZnkgdGhlIERCSSBjb25uZWN0IHN0cmluZy4gSWYgbm90aGluZyBpcyBzcGVjaWZpZWQsIHRoZSBsb2NhbCBEQk9iamVjdCBvZiBvdHJzIGlzIHVzZWQuIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJFeGFtcGxlIn06IERCSTpteXNxbDpkYXRhYmFzZW5hbWU7aG9zdD1kYi5leGFtcGxlLmNvbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEQkl1c2VyIj4kVGV4dHsiREIgdXNlcm5hbWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkRCSXVzZXIiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IkRCSXVzZXIifSIgbmFtZT0iREJJdXNlciIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJTcGVjaWZ5IHRoZSBEQiB1c2VybmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEQklwYXNzIj4kVGV4dHsiREIgcGFzc3dvcmQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkRCSXBhc3MiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IkRCSXBhc3MifSIgbmFtZT0iREJJcGFzcyIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJTcGVjaWZ5IHRoZSBEQiBwYXNzd29yZCJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCQkJPGxhYmVsIGZvcj0iUXVlcnkiPiRUZXh0eyJRdWVyeSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUXVlcnkiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dGFyZWEiIHJvd3M9IjUiIG1heGxlbmd0aD0iNTAwIiBuYW1lPSJRdWVyeSI+JFFEYXRheyJRdWVyeSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiSGVyZSB5b3UgY2FuIHNwZWNpZnkgdGhlIHF1ZXJ5IHRvIGV4ZWN1dGUgZm9yIHRoZSBpdGVtcyBpbiB0aGUgRHluYW1pY0ZpZWxkLiBQdXQgYSA/IFBsYWNlaG9sZGVyIGZvciBlYWNoIFBhcmFtZXRlci4ifQoJCQkJPGJyLz4KCQkJCSRUZXh0eyJLZWVwIGluIG1pbmQgdGhhdCBvbmx5IHRoZSBmaXJzdCBjb2x1bW4gaXMgc3RvcmVkIChhbmQgbm90IHZpc3VhbGl6ZWQgaW4gdGhlIG91dHB1dCkgYXMga2V5LCBzbyBzcGVjaWZ5aW5nIGFuIHVuaXF1ZSBpZGVudGlmaWVyIGlzIG1hbmRhdG9yeS4ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkV4YW1wbGUgd2l0aCBwYXJhbWV0ZXJzIn06IFNFTEVDVCBpZCwgbmFtZSBGUk9NIHRhYmxlIFdIRVJFIHJlZmlkID0gPwoJCQkJPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRXhhbXBsZSB3aXRob3V0IHBhcmFtZXRlcnMifTogU0VMRUNUIGlkLCBuYW1lIEZST00gdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgkJCTxsYWJlbCBmb3I9IlBhcmFtZXRlcnMiPiRUZXh0eyJQYXJhbWV0ZXJzIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJQYXJhbWV0ZXJzIiBjbGFzcz0iVzUwcGMiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iNTAwIiB2YWx1ZT0iJFFEYXRheyJQYXJhbWV0ZXJzIn0iIG5hbWU9IlBhcmFtZXRlcnMiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiSGVyZSB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBQYXJhbWV0ZXJzLiBPUkRFUiBJUyBSRUxFVkFOVCEifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAJCQkJJFRleHR7IklNUE9SVEFOVDogZG9uJ3QgcHV0IGFueSBzcGFjZXMgYmVmb3JlL2FmdGVyIHBhcmFtZXRlcnMhIn0KCQkJCTxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkV4YW1wbGUifTogQ3VzdG9tZXIsRnJvbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCQkJPGxhYmVsIGZvcj0iU2VwYXJhdG9yIj4kVGV4dHsiU2VwYXJhdG9yIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJTZXBhcmF0b3IiIGNsYXNzPSJXNTBwYyIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI1MDAiIHZhbHVlPSIkUURhdGF7IlNlcGFyYXRvciJ9IiBuYW1lPSJTZXBhcmF0b3IiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiV2hlbiBtdWx0aXBsZSBjb2x1bW5zIGFyZSBzZWxlY3RlZCBpbiB0aGUgcXVlcnksIHRoZSBhcmUgY29uY2F0ZW5ldGVkIGluIGEgc2luZ2xlIHJvdy4gU3BlY2lmeSB0aGUgc2VwYXJhdG9yIGhlcmUuIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkV4YW1wbGUifTogLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0TWFza0V4dGVuc2lvbkRpc2FibGVkIC0tPgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQkJICAkKCIjU2VwYXJhdG9yIikuYXR0cigiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKCQkJICAkKCIjU2VwYXJhdG9yIikuYXR0cigidmFsdWUiLCAiKG5vdCBhdmFpbGFibGUpIik7CgkJCSAgJCgiI1NlcGFyYXRvciIpLmNzcyh7Y29sb3I6JyM5OTk5OTknfSk7CgkJCSAgJCgiI1BhcmFtZXRlcnMiKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoJCQkgICQoIiNQYXJhbWV0ZXJzIikuYXR0cigidmFsdWUiLCAiKG5vdCBhdmFpbGFibGUpIik7CgkJCSAgJCgiI1BhcmFtZXRlcnMiKS5jc3Moe2NvbG9yOicjOTk5OTk5J30pOwogICAgICAgICAgICAgICAgICAgICAgIDwvc2NyaXB0PgovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldE1hc2tFeHRlbnNpb25EaXNhYmxlZCAtLT4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCQkJPGxhYmVsIGZvcj0iQ2FjaGVUVEwiPiRUZXh0eyJDYWNoZSBUaW1lIFRvIExpdmUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkNhY2hlVFRMIiBjbGFzcz0iVzUwcGMiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iNTAwIiB2YWx1ZT0iJFFEYXRheyJDYWNoZVRUTCJ9IiBuYW1lPSJDYWNoZVRUTCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJTcGVjaWZ5IHRoZSBjYWNoZSB2YWxpZGl0eSBpbiBzZWNvbmRzLiBDb25zaWRlciB0aGF0IG9ubHkgcXVlcmllcyB3aXRoIGlkZW50aWNhbCBwYXJhbWV0ZXJzIGFyZSBjYWNoZWQuIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkV4YW1wbGUifTogMzYwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGlzcGxheUVycm9ycyI+JFRleHR7IkRFQlVHOiBEaXNwbGF5IEVycm9ycyBpbiBGb3JtIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkRpc3BsYXlFcnJvcnMifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPiRUZXh0eyJBY3RpdmF0ZSB0aGlzIG9wdGlvbiB0byBlbmFibGUgbGl2ZSBkZWJ1ZyBvdXRwdXQgaW4gZmllbGRzLiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJQcmltYXJ5IiB2YWx1ZT0iJFRleHR7IlNhdmUifSI+JFRleHR7IlNhdmUifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJvciJ9CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZG1pbkR5bmFtaWNGaWVsZCI+JFRleHR7IkNhbmNlbCJ9PC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgPC9mb3JtPgogICAgPC9kaXY+CjwvZGl2Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcuU2hvd1dhcm5pbmcnKS5iaW5kKCdjaGFuZ2Uga2V5dXAnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICQoJ3AuV2FybmluZycpLnJlbW92ZUNsYXNzKCdIaWRkZW4nKTsKfSk7CgovL2JpbmQgY2xpY2sgZnVuY3Rpb24gdG8gYWRkIGJ1dHRvbgokKCcjQWRkVmFsdWUnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgIENvcmUuQWdlbnQuQWRtaW4uRHluYW1pY0ZpZWxkRHJvcGRvd24uQWRkVmFsdWUoCiAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCdmaWVsZHNldCcpLmZpbmQoJy5WYWx1ZUluc2VydCcpCiAgICApOwogICAgcmV0dXJuIGZhbHNlOwp9KTsKCi8vYmluZCBjbGljayBmdW5jdGlvbiB0byByZW1vdmUgYnV0dG9uCiQoJy5WYWx1ZVJlbW92ZScpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgQ29yZS5BZ2VudC5BZG1pbi5EeW5hbWljRmllbGREcm9wZG93bi5SZW1vdmVWYWx1ZSgkKHRoaXMpLmF0dHIoJ2lkJykpOwogICAgcmV0dXJuIGZhbHNlOwp9KTsKCiQoJy5EZWZhdWx0VmFsdWVLZXlJdGVtLC5EZWZhdWx0VmFsdWVJdGVtJykuYmluZCgna2V5dXAnLCBmdW5jdGlvbiAoKSB7CiAgICBDb3JlLkFnZW50LkFkbWluLkR5bmFtaWNGaWVsZERyb3Bkb3duLlJlY3JlYXRlRGVmYXVsdFZhbHVlTGlzdCgpOwp9KTsKCkNvcmUuQWdlbnQuQWRtaW4uRHluYW1pY0ZpZWxkLlZhbGlkYXRpb25Jbml0KCk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4K</File>
<File Location="Custom/Kernel/Modules/AdminDynamicFieldDropdownFromDB.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluRHluYW1pY0ZpZWxkRHJvcGRvd24ucG0gLSBwcm92aWRlcyBhIGR5bmFtaWMgZmllbGRzIHRleHQgY29uZmlnIHZpZXcgZm9yIGFkbWlucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEyIFd1ZXJ0aFBob2VuaXggU1JMLCBodHRwOi8vd3d3Lnd1ZXJ0aHBob2VuaXguaXQvCiMgLS0KIyAkSWQ6IEFkbWluRHluYW1pY0ZpZWxkRHJvcGRvd25Gcm9tREIucG0sdiAxLjAwIDIwMTIvMDQvMTggMTk6Mzg6MDEgY3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkR5bmFtaWNGaWVsZERyb3Bkb3duRnJvbURCOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE1ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIGZvciAocXcoUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwoKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQtPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIGdldCBjb25maWd1cmVkIG9iamVjdCB0eXBlcwogICAgJFNlbGYtPntPYmplY3RUeXBlQ29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEeW5hbWljRmllbGRzOjpPYmplY3RUeXBlJyk7CgogICAgIyBnZXQgdGhlIGZpZWxkcyBjb25maWcKICAgICRTZWxmLT57RmllbGRUeXBlQ29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEeW5hbWljRmllbGRzOjpCYWNrZW5kJykgfHwge307CgogICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGhhbmRsaW5nIHN0cmluZ3MKICAgICRTZWxmLT57RW1wdHlTdHJpbmd9ICAgICA9ICdfRHluYW1pY0ZpZWxkc19FbXB0eVN0cmluZ19Eb250X1VzZV9JdF9TdHJpbmdfUGxlYXNlJzsKICAgICRTZWxmLT57RHVwbGljYXRlU3RyaW5nfSA9ICdfRHluYW1pY0ZpZWxkc19EdXBsaWNhdGVkU3RyaW5nX0RvbnRfVXNlX0l0X1N0cmluZ19QbGVhc2UnOwogICAgJFNlbGYtPntEZWxldGVkU3RyaW5nfSAgID0gJ19EeW5hbWljRmllbGRzX0RlbGV0ZWRTdHJpbmdfRG9udF9Vc2VfSXRfU3RyaW5nX1BsZWFzZSc7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fQWRkKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGRBY3Rpb24nICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+X0FkZEFjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlJyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9DaGFuZ2UoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZUFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5fQ2hhbmdlQWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgIE1lc3NhZ2UgPT4gIlVuZGVmaW5lZCBzdWJhY3Rpb24uIiwKICAgICk7Cn0KCnN1YiBfQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICROZWVkZWQgKHF3KE9iamVjdFR5cGUgRmllbGRUeXBlIEZpZWxkT3JkZXIpKSB7CiAgICAgICAgJEdldFBhcmFteyROZWVkZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkTmVlZGVkICk7CiAgICAgICAgaWYgKCAhJE5lZWRlZCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aGUgb2JqZWN0IHR5cGUgYW5kIGZpZWxkIHR5cGUgZGlzcGxheSBuYW1lCiAgICBteSAkT2JqZWN0VHlwZU5hbWUgPSAkU2VsZi0+e09iamVjdFR5cGVDb25maWd9LT57ICRHZXRQYXJhbXtPYmplY3RUeXBlfSB9LT57RGlzcGxheU5hbWV9IHx8ICcnOwogICAgbXkgJEZpZWxkVHlwZU5hbWUgID0gJFNlbGYtPntGaWVsZFR5cGVDb25maWd9LT57ICRHZXRQYXJhbXtGaWVsZFR5cGV9IH0tPntEaXNwbGF5TmFtZX0gICB8fCAnJzsKCiAgICByZXR1cm4gJFNlbGYtPl9TaG93U2NyZWVuKAogICAgICAgICVQYXJhbSwKICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgTW9kZSAgICAgICAgICAgPT4gJ0FkZCcsCiAgICAgICAgT2JqZWN0VHlwZU5hbWUgPT4gJE9iamVjdFR5cGVOYW1lLAogICAgICAgIEZpZWxkVHlwZU5hbWUgID0+ICRGaWVsZFR5cGVOYW1lLAogICAgKTsKfQoKc3ViIF9BZGRBY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRXJyb3JzOwogICAgbXkgJUdldFBhcmFtOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhOYW1lIExhYmVsIEZpZWxkT3JkZXIpKSB7CiAgICAgICAgJEdldFBhcmFteyROZWVkZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkTmVlZGVkICk7CiAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkRXJyb3JzeyAkTmVlZGVkIC4gJ1NlcnZlckVycm9yJyB9ICAgICAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRFcnJvcnN7ICROZWVkZWQgLiAnU2VydmVyRXJyb3JNZXNzYWdlJyB9ID0gJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQuJzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkR2V0UGFyYW17TmFtZX0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmFtZSBpcyBhbHBoYW51bWVyaWMKICAgICAgICBpZiAoICRHZXRQYXJhbXtOYW1lfSAhfiBte1xBICggPzogW2EtekEtWl0gfCBcZCApKyBcen14bXMgKSB7CgogICAgICAgICAgICAjIGFkZCBzZXJ2ZXIgZXJyb3IgZXJyb3IgY2xhc3MKICAgICAgICAgICAgJEVycm9yc3tOYW1lU2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJEVycm9yc3tOYW1lU2VydmVyRXJyb3JNZXNzYWdlfSA9CiAgICAgICAgICAgICAgICAnVGhlIGZpZWxkIGRvZXMgbm90IGNvbnRhaW4gb25seSBBU0NJSSBsZXR0ZXJzIGFuZCBudW1iZXJzLic7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIG5hbWUgaXMgZHVwbGljYXRlZAogICAgICAgIG15ICVEeW5hbWljRmllbGRzTGlzdCA9ICV7CiAgICAgICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkTGlzdCgKICAgICAgICAgICAgICAgIFZhbGlkICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFJlc3VsdFR5cGUgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB9OwoKICAgICAgICAlRHluYW1pY0ZpZWxkc0xpc3QgPSByZXZlcnNlICVEeW5hbWljRmllbGRzTGlzdDsKCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkc0xpc3R7ICRHZXRQYXJhbXtOYW1lfSB9ICkgewoKICAgICAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIGVycm9yIGNsYXNzCiAgICAgICAgICAgICRFcnJvcnN7TmFtZVNlcnZlckVycm9yfSAgICAgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3Jze05hbWVTZXJ2ZXJFcnJvck1lc3NhZ2V9ID0gJ1RoZXJlIGlzIGFub3RoZXIgZmllbGQgd2l0aCB0aGUgc2FtZSBuYW1lLic7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEdldFBhcmFte0ZpZWxkT3JkZXJ9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIG9yZGVyIGlzIG51bWVyaWMgYW5kIHBvc2l0aXZlCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RmllbGRPcmRlcn0gIX4gbXtcQSAoID86IFxkICkrIFx6fXhtcyApIHsKCiAgICAgICAgICAgICMgYWRkIHNlcnZlciBlcnJvciBlcnJvciBjbGFzcwogICAgICAgICAgICAkRXJyb3Jze0ZpZWxkT3JkZXJTZXJ2ZXJFcnJvcn0gICAgICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJEVycm9yc3tGaWVsZE9yZGVyU2VydmVyRXJyb3JNZXNzYWdlfSA9ICdUaGUgZmllbGQgbXVzdCBiZSBudW1lcmljLic7CiAgICAgICAgfQogICAgfQoKICAgIGZvciBteSAkQ29uZmlnUGFyYW0gKAogICAgICAgIHF3KAogICAgICAgIE9iamVjdFR5cGUgT2JqZWN0VHlwZU5hbWUgRmllbGRUeXBlIEZpZWxkVHlwZU5hbWUgRGVmYXVsdFZhbHVlIFBvc3NpYmxlTm9uZQogICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyBWYWxpZElEIExpbmsgUXVlcnkgVmlzdWFsUXVlcnkgUGFyYW1ldGVycyBEQklzdHJpbmcgREJJdXNlciBEQklwYXNzIFNlcGFyYXRvciBDYWNoZVRUTCBEaXNwbGF5RXJyb3JzCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JENvbmZpZ1BhcmFtfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJENvbmZpZ1BhcmFtICk7CiAgICB9CgogICAgIyB1bmNvcnJlY3RhYmxlIGVycm9ycwogICAgaWYgKCAhJEdldFBhcmFte1ZhbGlkSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJOZWVkIFZhbGlkSUQiLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJFNlbGYtPl9HZXRQb3NzaWJsZVZhbHVlcygpOwoKICAgICMgcmV0dXJuIHRvIGFkZCBzY3JlZW4gaWYgZXJyb3JzCiAgICBpZiAoJUVycm9ycykgewogICAgICAgIHJldHVybiAkU2VsZi0+X1Nob3dTY3JlZW4oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUVycm9ycywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgIE1vZGUgICAgICAgICAgID0+ICdBZGQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgc3BlY2lmaWMgY29uZmlnCiAgICBteSAkRmllbGRDb25maWcgPSB7CiMgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgRGVmYXVsdFZhbHVlICAgICAgID0+ICRHZXRQYXJhbXtEZWZhdWx0VmFsdWV9LAogICAgICAgIFBvc3NpYmxlTm9uZSAgICAgICA9PiAkR2V0UGFyYW17UG9zc2libGVOb25lfSwKICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gJEdldFBhcmFte1RyYW5zbGF0YWJsZVZhbHVlc30sCiAgICAgICAgTGluayAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtMaW5rfSwKICAgICAgICBRdWVyeQkJICAgPT4gJEdldFBhcmFte1F1ZXJ5fSwKICAgICAgICBTdG9yZVZhbHVlCSAgID0+ICRHZXRQYXJhbXtTdG9yZVZhbHVlfSwKICAgICAgICBWaXN1YWxRdWVyeQkgICA9PiAkR2V0UGFyYW17VmlzdWFsUXVlcnl9LAogICAgICAgIFBhcmFtZXRlcnMJICAgPT4gJEdldFBhcmFte1BhcmFtZXRlcnN9LAogICAgICAgIERCSXN0cmluZwkgICA9PiAkR2V0UGFyYW17REJJc3RyaW5nfSwKICAgICAgICBEQkl1c2VyCQkgICA9PiAkR2V0UGFyYW17REJJdXNlcn0sCiAgICAgICAgREJJcGFzcwkJICAgPT4gJEdldFBhcmFte0RCSXBhc3N9LAogICAgICAgIFNlcGFyYXRvcgkgICA9PiAkR2V0UGFyYW17U2VwYXJhdG9yfSwKICAgICAgICBDYWNoZVRUTAkgICA9PiAkR2V0UGFyYW17Q2FjaGVUVEx9LAogICAgICAgIERpc3BsYXlFcnJvcnMgID0+ICRHZXRQYXJhbXtEaXNwbGF5RXJyb3JzfSwKICAgIH07CgogICAgIyBjcmVhdGUgYSBuZXcgZmllbGQKICAgIG15ICRGaWVsZElEID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgTmFtZSAgICAgICA9PiAkR2V0UGFyYW17TmFtZX0sCiAgICAgICAgTGFiZWwgICAgICA9PiAkR2V0UGFyYW17TGFiZWx9LAogICAgICAgIEZpZWxkT3JkZXIgPT4gJEdldFBhcmFte0ZpZWxkT3JkZXJ9LAogICAgICAgIEZpZWxkVHlwZSAgPT4gJEdldFBhcmFte0ZpZWxkVHlwZX0sCiAgICAgICAgT2JqZWN0VHlwZSA9PiAkR2V0UGFyYW17T2JqZWN0VHlwZX0sCiAgICAgICAgQ29uZmlnICAgICA9PiAkRmllbGRDb25maWcsCiAgICAgICAgVmFsaWRJRCAgICA9PiAkR2V0UGFyYW17VmFsaWRJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRGaWVsZElEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgY3JlYXRlIHRoZSBuZXcgZmllbGQiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgT1AgPT4gIkFjdGlvbj1BZG1pbkR5bmFtaWNGaWVsZCIsCiAgICApOwp9CgpzdWIgX0NoYW5nZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkTmVlZGVkIChxdyhPYmplY3RUeXBlIEZpZWxkVHlwZSkpIHsKICAgICAgICAkR2V0UGFyYW17JE5lZWRlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICROZWVkZWQgKTsKICAgICAgICBpZiAoICEkTmVlZGVkICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5lZWQgJE5lZWRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRoZSBvYmplY3QgdHlwZSBhbmQgZmllbGQgdHlwZSBkaXNwbGF5IG5hbWUKICAgIG15ICRPYmplY3RUeXBlTmFtZSA9ICRTZWxmLT57T2JqZWN0VHlwZUNvbmZpZ30tPnsgJEdldFBhcmFte09iamVjdFR5cGV9IH0tPntEaXNwbGF5TmFtZX0gfHwgJyc7CiAgICBteSAkRmllbGRUeXBlTmFtZSAgPSAkU2VsZi0+e0ZpZWxkVHlwZUNvbmZpZ30tPnsgJEdldFBhcmFte0ZpZWxkVHlwZX0gfS0+e0Rpc3BsYXlOYW1lfSAgIHx8ICcnOwoKICAgIG15ICRGaWVsZElEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICk7CgogICAgaWYgKCAhJEZpZWxkSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5lZWQgSUQiLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBkYXRhCiAgICBteSAkRHluYW1pY0ZpZWxkRGF0YSA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgIElEID0+ICRGaWVsZElELAogICAgKTsKCiAgICAjIGNoZWNrIGZvciB2YWxpZCBkeW5hbWljIGZpZWxkIGNvbmZpZ3VyYXRpb24KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGREYXRhKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IGdldCBkYXRhIGZvciBkeW5hbWljIGZpZWxkICRGaWVsZElEIiwKICAgICAgICApOwogICAgfQoKICAgIG15ICVDb25maWcgPSAoKTsKCiAgICAjIGV4dHJhY3QgY29uZmlndXJhdGlvbgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9ICkgKSB7CgojICAgICAgICAjIHNldCBQb3NzaWJsZVZhbHVlcwojICAgICAgICAkQ29uZmlne1Bvc3NpYmxlVmFsdWVzfSA9IHt9OwojICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30gKSApIHsKIyAgICAgICAgICAgICRDb25maWd7UG9zc2libGVWYWx1ZXN9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9OwojICAgICAgICB9CgogICAgICAgICMgc2V0IERlZmF1bHRWYWx1ZQogICAgICAgICRDb25maWd7RGVmYXVsdFZhbHVlfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX07CgogICAgICAgICMgc2V0IFBvc3NpYmxlTm9uZQogICAgICAgICRDb25maWd7UG9zc2libGVOb25lfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e1Bvc3NpYmxlTm9uZX07CgogICAgICAgICMgc2V0IFRyYW5zbGF0YWxiZVZhbHVlcwogICAgICAgICRDb25maWd7VHJhbnNsYXRhYmxlVmFsdWVzfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc307CgogICAgICAgICMgc2V0IExpbmsKICAgICAgICAkQ29uZmlne0xpbmt9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57TGlua307CiAgICAgICAgJENvbmZpZ3tRdWVyeX0gPSAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30tPntRdWVyeX07CiAgICAgICAgJENvbmZpZ3tTdG9yZVZhbHVlfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e1N0b3JlVmFsdWV9OwogICAgICAgICRDb25maWd7VmlzdWFsUXVlcnl9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57VmlzdWFsUXVlcnl9OwogICAgICAgICRDb25maWd7UGFyYW1ldGVyc30gPSAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30tPntQYXJhbWV0ZXJzfTsKICAgICAgICAkQ29uZmlne0RCSXN0cmluZ30gPSAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30tPntEQklzdHJpbmd9OwogICAgICAgICRDb25maWd7REJJdXNlcn0gPSAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30tPntEQkl1c2VyfTsKICAgICAgICAkQ29uZmlne0RCSXBhc3N9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57REJJcGFzc307CiAgICAgICAgJENvbmZpZ3tTZXBhcmF0b3J9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57U2VwYXJhdG9yfTsKICAgICAgICAkQ29uZmlne0NhY2hlVFRMfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e0NhY2hlVFRMfTsKICAgICAgICAkQ29uZmlne0Rpc3BsYXlFcnJvcnN9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57RGlzcGxheUVycm9yc307CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5fU2hvd1NjcmVlbigKICAgICAgICAlUGFyYW0sCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgICUke0R5bmFtaWNGaWVsZERhdGF9LAogICAgICAgICVDb25maWcsCiAgICAgICAgSUQgICAgICAgICAgICAgPT4gJEZpZWxkSUQsCiAgICAgICAgTW9kZSAgICAgICAgICAgPT4gJ0NoYW5nZScsCiAgICAgICAgT2JqZWN0VHlwZU5hbWUgPT4gJE9iamVjdFR5cGVOYW1lLAogICAgICAgIEZpZWxkVHlwZU5hbWUgID0+ICRGaWVsZFR5cGVOYW1lLAogICAgKTsKfQoKc3ViIF9DaGFuZ2VBY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRXJyb3JzOwogICAgbXkgJUdldFBhcmFtOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhOYW1lIExhYmVsIEZpZWxkT3JkZXIpKSB7CiAgICAgICAgJEdldFBhcmFteyROZWVkZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkTmVlZGVkICk7CiAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkRXJyb3JzeyAkTmVlZGVkIC4gJ1NlcnZlckVycm9yJyB9ICAgICAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRFcnJvcnN7ICROZWVkZWQgLiAnU2VydmVyRXJyb3JNZXNzYWdlJyB9ID0gJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQuJzsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEZpZWxkSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKICAgIGlmICggISRGaWVsZElEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJOZWVkIElEIiwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJEdldFBhcmFte05hbWV9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIG5hbWUgaXMgbG93ZXJjYXNlCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmFtZX0gIX4gbXtcQSAoID86IFthLXpBLVpdIHwgXGQgKSsgXHp9eG1zICkgewoKICAgICAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIGVycm9yIGNsYXNzCiAgICAgICAgICAgICRFcnJvcnN7TmFtZVNlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRFcnJvcnN7TmFtZVNlcnZlckVycm9yTWVzc2FnZX0gPQogICAgICAgICAgICAgICAgJ1RoZSBmaWVsZCBkb2VzIG5vdCBjb250YWluIG9ubHkgQVNDSUkgbGV0dGVycyBhbmQgbnVtYmVycy4nOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBuYW1lIGlzIGR1cGxpY2F0ZWQKICAgICAgICBteSAlRHluYW1pY0ZpZWxkc0xpc3QgPSAlewogICAgICAgICAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3QoCiAgICAgICAgICAgICAgICBWYWxpZCAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBSZXN1bHRUeXBlID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgfTsKCiAgICAgICAgJUR5bmFtaWNGaWVsZHNMaXN0ID0gcmV2ZXJzZSAlRHluYW1pY0ZpZWxkc0xpc3Q7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJER5bmFtaWNGaWVsZHNMaXN0eyAkR2V0UGFyYW17TmFtZX0gfSAmJgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkc0xpc3R7ICRHZXRQYXJhbXtOYW1lfSB9IG5lICRGaWVsZElECiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIGFkZCBzZXJ2ZXIgZXJyb3IgY2xhc3MKICAgICAgICAgICAgJEVycm9yc3tOYW1lU2VydmVyRXJyb3J9ICAgICAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRFcnJvcnN7TmFtZVNlcnZlckVycm9yTWVzc2FnZX0gPSAnVGhlcmUgaXMgYW5vdGhlciBmaWVsZCB3aXRoIHRoZSBzYW1lIG5hbWUuJzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkR2V0UGFyYW17RmllbGRPcmRlcn0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgZmllbGQgb3JkZXIgaXMgbnVtZXJpYyBhbmQgcG9zaXRpdmUKICAgICAgICBpZiAoICRHZXRQYXJhbXtGaWVsZE9yZGVyfSAhfiBte1xBICggPzogXGQgKSsgXHp9eG1zICkgewoKICAgICAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIGVycm9yIGNsYXNzCiAgICAgICAgICAgICRFcnJvcnN7RmllbGRPcmRlclNlcnZlckVycm9yfSAgICAgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3Jze0ZpZWxkT3JkZXJTZXJ2ZXJFcnJvck1lc3NhZ2V9ID0gJ1RoZSBmaWVsZCBtdXN0IGJlIG51bWVyaWMuJzsKICAgICAgICB9CiAgICB9CgogICAgZm9yIG15ICRDb25maWdQYXJhbSAoCiAgICAgICAgcXcoCiAgICAgICAgT2JqZWN0VHlwZSBPYmplY3RUeXBlTmFtZSBGaWVsZFR5cGUgRmllbGRUeXBlTmFtZSBEZWZhdWx0VmFsdWUgUG9zc2libGVOb25lCiAgICAgICAgVHJhbnNsYXRhYmxlVmFsdWVzIFZhbGlkSUQgTGluayBRdWVyeSBTdG9yZVZhbHVlIFZpc3VhbFF1ZXJ5IFBhcmFtZXRlcnMgREJJc3RyaW5nIERCSXVzZXIgREJJcGFzcyBTZXBhcmF0b3IgQ2FjaGVUVEwgRGlzcGxheUVycm9ycwogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRDb25maWdQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRDb25maWdQYXJhbSApOwogICAgfQoKICAgICMgdW5jb3JyZWN0YWJsZSBlcnJvcnMKICAgIGlmICggISRHZXRQYXJhbXtWYWxpZElEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTmVlZCBWYWxpZElEIiwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgZGF0YQogICAgbXkgJER5bmFtaWNGaWVsZERhdGEgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICBJRCA9PiAkRmllbGRJRCwKICAgICk7CgogICAgIyBjaGVjayBmb3IgdmFsaWQgZHluYW1pYyBmaWVsZCBjb25maWd1cmF0aW9uCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkRGF0YSkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCBnZXQgZGF0YSBmb3IgZHluYW1pYyBmaWVsZCAkRmllbGRJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkU2VsZi0+X0dldFBvc3NpYmxlVmFsdWVzKCk7CgogICAgIyByZXR1cm4gdG8gY2hhbmdlIHNjcmVlbiBpZiBlcnJvcnMKICAgIGlmICglRXJyb3JzKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd1NjcmVlbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgSUQgICAgICAgICAgICAgPT4gJEZpZWxkSUQsCiAgICAgICAgICAgIE1vZGUgICAgICAgICAgID0+ICdDaGFuZ2UnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgc3BlY2lmaWMgY29uZmlnCiAgICBteSAkRmllbGRDb25maWcgPSB7CiAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICBEZWZhdWx0VmFsdWUgICAgICAgPT4gJEdldFBhcmFte0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgUG9zc2libGVOb25lICAgICAgID0+ICRHZXRQYXJhbXtQb3NzaWJsZU5vbmV9LAogICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyA9PiAkR2V0UGFyYW17VHJhbnNsYXRhYmxlVmFsdWVzfSwKICAgICAgICBMaW5rICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0xpbmt9LAogICAgICAgIFF1ZXJ5CQkJCT0+ICRHZXRQYXJhbXtRdWVyeX0sCiAgICAgICAgU3RvcmVWYWx1ZQkgICAJCT0+ICRHZXRQYXJhbXtTdG9yZVZhbHVlfSwKICAgICAgICBWaXN1YWxRdWVyeQkgICAJCT0+ICRHZXRQYXJhbXtWaXN1YWxRdWVyeX0sCiAgICAgICAgUGFyYW1ldGVycwkgICAJCT0+ICRHZXRQYXJhbXtQYXJhbWV0ZXJzfSwKICAgICAgICBEQklzdHJpbmcJCQk9PiAkR2V0UGFyYW17REJJc3RyaW5nfSwKICAgICAgICBEQkl1c2VyCQkJCT0+ICRHZXRQYXJhbXtEQkl1c2VyfSwKICAgICAgICBEQklwYXNzCQkJCT0+ICRHZXRQYXJhbXtEQklwYXNzfSwKICAgICAgICBTZXBhcmF0b3IJCQk9PiAkR2V0UGFyYW17U2VwYXJhdG9yfSwKICAgICAgICBDYWNoZVRUTAkJCT0+ICRHZXRQYXJhbXtDYWNoZVRUTH0sCiAgICAgICAgRGlzcGxheUVycm9ycwkJPT4gJEdldFBhcmFte0Rpc3BsYXlFcnJvcnN9LAogICAgfTsKCiAgICAjIHVwZGF0ZSBkeW5hbWljIGZpZWxkIChGaWVsZFR5cGUgYW5kIE9iamVjdFR5cGUgY2Fubm90IGJlIGNoYW5nZWQ7IHVzZSBvbGQgdmFsdWVzKQogICAgbXkgJFVwZGF0ZVN1Y2Nlc3MgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZFVwZGF0ZSgKICAgICAgICBJRCAgICAgICAgID0+ICRGaWVsZElELAogICAgICAgIE5hbWUgICAgICAgPT4gJEdldFBhcmFte05hbWV9LAogICAgICAgIExhYmVsICAgICAgPT4gJEdldFBhcmFte0xhYmVsfSwKICAgICAgICBGaWVsZE9yZGVyID0+ICRHZXRQYXJhbXtGaWVsZE9yZGVyfSwKICAgICAgICBGaWVsZFR5cGUgID0+ICREeW5hbWljRmllbGREYXRhLT57RmllbGRUeXBlfSwKICAgICAgICBPYmplY3RUeXBlID0+ICREeW5hbWljRmllbGREYXRhLT57T2JqZWN0VHlwZX0sCiAgICAgICAgQ29uZmlnICAgICA9PiAkRmllbGRDb25maWcsCiAgICAgICAgVmFsaWRJRCAgICA9PiAkR2V0UGFyYW17VmFsaWRJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRVcGRhdGVTdWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgdXBkYXRlIHRoZSBmaWVsZCAkR2V0UGFyYW17TmFtZX0iLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgT1AgPT4gIkFjdGlvbj1BZG1pbkR5bmFtaWNGaWVsZCIsCiAgICApOwp9CgpzdWIgX1Nob3dTY3JlZW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17RGlzcGxheUZpZWxkTmFtZX0gPSAnTmV3JzsKCiAgICBpZiAoICRQYXJhbXtNb2RlfSBlcSAnQ2hhbmdlJyApIHsKICAgICAgICAkUGFyYW17U2hvd1dhcm5pbmd9ICAgICAgPSAnU2hvd1dhcm5pbmcnOwogICAgICAgICRQYXJhbXtEaXNwbGF5RmllbGROYW1lfSA9ICRQYXJhbXtOYW1lfTsKICAgIH0KCiAgICAkUGFyYW17RGVsZXRlZFN0cmluZ30gPSAkU2VsZi0+e0RlbGV0ZWRTdHJpbmd9OwoKICAgICMgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZXQgYWxsIGZpZWxkcwogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2Ygb3JkZXIgbnVtYmVycyAoaXMgYWxyZWFkeSBzb3J0ZWQpLgogICAgbXkgQER5bmFtaWNmaWVsZE9yZGVyTGlzdDsKICAgIGZvciBteSAkRHluYW1pY2ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CiAgICAgICAgcHVzaCBARHluYW1pY2ZpZWxkT3JkZXJMaXN0LCAkRHluYW1pY2ZpZWxkLT57RmllbGRPcmRlcn07CiAgICB9CgogICAgIyB3aGVuIGFkZGluZyB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBleHRyYSBvcmRlciBudW1iZXIgZm9yIHRoZSBuZXcgZmllbGQKICAgIGlmICggJFBhcmFte01vZGV9IGVxICdBZGQnICkgewoKICAgICAgICAjIGdldCB0aGUgbGFzdCBlbGVtZW50IGZvcm0gdGhlIG9yZGVyIGxpc3QgYW5kIGFkZCAxCiAgICAgICAgbXkgJExhc3RPcmRlck51bWJlciA9ICREeW5hbWljZmllbGRPcmRlckxpc3RbLTFdOwogICAgICAgICRMYXN0T3JkZXJOdW1iZXIrKzsKCiAgICAgICAgIyBhZGQgdGhpcyBuZXcgb3JkZXIgbnVtYmVyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKICAgICAgICBwdXNoIEBEeW5hbWljZmllbGRPcmRlckxpc3QsICRMYXN0T3JkZXJOdW1iZXI7CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZE9yZGVyU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcQER5bmFtaWNmaWVsZE9yZGVyTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdGaWVsZE9yZGVyJywKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRQYXJhbXtGaWVsZE9yZGVyfSB8fCAxLAogICAgICAgIFBvc3NpYmxlTm9uZSAgPT4gMCwKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdXNTBwYyBWYWxpZGF0ZV9OdW1iZXInLAogICAgKTsKCiAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICMgY3JlYXRlIHRoZSBWYWxpZGl0eSBzZWxlY3QKICAgIG15ICRWYWxpZGl0eVN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VmFsaWRJRH0gfHwgMSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1c1MHBjJywKICAgICk7CgogICAgIyBkZWZpbmUgYXMgMCB0byBnZXQgdGhlIHJlYWwgdmFsdWUgaW4gdGhlIEhUTUwKICAgIG15ICRWYWx1ZUNvdW50ZXIgPSAwOwoKICAgICMgc2V0IFBvc3NpYmxlVmFsdWVzCiAgICBteSAlUG9zc2libGVWYWx1ZXM7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17UG9zc2libGVWYWx1ZXN9ICkgKSB7CiAgICAgICAgJVBvc3NpYmxlVmFsdWVzID0gJXsgJFBhcmFte1Bvc3NpYmxlVmFsdWVzfSB9OwogICAgfQoKCiAgICAjIGNyZWF0ZSB0aGUgcG9zc2libGUgdmFsdWVzIHRlbXBsYXRlCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1ZhbHVlVGVtcGxhdGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAjS2VybmVsL1N5c3RlbS9UaWNrZXQvT1RSU1RpY2tldE1hc2tFeHRlbnNpb25zLnBtIApldmFsCnsKICByZXF1aXJlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6Ok9UUlNUaWNrZXRNYXNrRXh0ZW5zaW9uczsKfTsKCnVubGVzcyghICRAKQp7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RpY2tldE1hc2tFeHRlbnNpb25EaXNhYmxlZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCn0KIAojaWYgKCEgZXZhbCAidXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6Ok9UUlNUaWNrZXRNYXNrRXh0ZW5zaW9ucyIpIHsKI3VzZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpPVFJTVGlja2V0TWFza0V4dGVuc2lvbnM7CiN9CgoKICAgICMgY2hlY2sgYW5kIGJ1aWxkIHRoZSBEZWZhdWx0IFZhbHVlIGxpc3QgYmFzZWQgb24gUG9zc2libGUgVmFsdWVzCiMgICAgbXkgJURlZmF1bHRWYWx1ZXNMaXN0OwojICAgIFBPU1NJQkxFVkFMVUU6CiMgICAgZm9yIG15ICRWYWx1ZUl0ZW0gKCBrZXlzICVQb3NzaWJsZVZhbHVlcyApIHsKIyAgICAgICAgbmV4dCBQT1NTSUJMRVZBTFVFIGlmICFkZWZpbmVkICRWYWx1ZUl0ZW07CiMgICAgICAgIG5leHQgUE9TU0lCTEVWQUxVRSBpZiAhZGVmaW5lZCAkUG9zc2libGVWYWx1ZXN7JFZhbHVlSXRlbX07CiMgICAgICAgICREZWZhdWx0VmFsdWVzTGlzdHskVmFsdWVJdGVtfSA9ICRQb3NzaWJsZVZhbHVlc3skVmFsdWVJdGVtfQojICAgIH0KIwojICAgIG15ICREZWZhdWx0VmFsdWUgPSAoIGRlZmluZWQgJFBhcmFte0RlZmF1bHRWYWx1ZX0gPyAkUGFyYW17RGVmYXVsdFZhbHVlfSA6ICcnICk7CiMKIyAgICAjIGNyZWF0ZSB0aGUgZGVmYXVsdCB2YWx1ZSBzZWxlY3QKIyAgICBteSAkRGVmYXVsdFZhbHVlU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiMgICAgICAgIERhdGEgICAgICAgICA9PiBcJURlZmF1bHRWYWx1ZXNMaXN0LAojICAgICAgICBOYW1lICAgICAgICAgPT4gJ0RlZmF1bHRWYWx1ZScsCiMgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkRGVmYXVsdFZhbHVlLAojICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKIwojICAgICAgICAjIERvbid0IG1ha2UgaXMgdHJhbnNsYXRhYmxlIGJlY2F1c2UgdGhpcyB3aWxsIGNvbmZ1c2UgdGhlIHVzZXIgKGFsc28gY3VycmVudCBKUwojICAgICAgICAjIGlzIG5vdCBwcmVwYXJlZCkKIyAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKIwojICAgICAgICAjIE11bHRpcGxlIHNlbGVjdGlvbnMgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkCiMgICAgICAgIE11bHRpcGxlID0+IDAsCiMgICAgICAgIENsYXNzICAgID0+ICdXNTBwYycsCiMgICAgKTsKCiAgICBteSAkUG9zc2libGVOb25lID0gJFBhcmFte1Bvc3NpYmxlTm9uZX0gfHwgJzAnOwoKICAgICMgY3JlYXRlIHRyYW5zbGF0YWJsZSB2YWx1ZXMgb3B0aW9uIGxpc3QKICAgIG15ICRQb3NzaWJsZU5vbmVTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnUG9zc2libGVOb25lJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQb3NzaWJsZU5vbmUsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnVzUwcGMnLAogICAgKTsKCiAgICBteSAkVHJhbnNsYXRhYmxlVmFsdWVzID0gJFBhcmFte1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgJzAnOwoKICAgICMgY3JlYXRlIHRyYW5zbGF0YWJsZSB2YWx1ZXMgb3B0aW9uIGxpc3QKICAgIG15ICRUcmFuc2xhdGFibGVWYWx1ZXNTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVHJhbnNsYXRhYmxlVmFsdWVzJywKICAgICAgICBTZWxlY3RlZElEID0+ICRUcmFuc2xhdGFibGVWYWx1ZXMsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnVzUwcGMnLAogICAgKTsKCiAgICBteSAkU3RvcmVWYWx1ZSA9ICRQYXJhbXtTdG9yZVZhbHVlfSB8fCAnMCc7CgogICAgIyBjcmVhdGUgdHJhbnNsYXRhYmxlIHZhbHVlcyBvcHRpb24gbGlzdAogICAgbXkgJFN0b3JlVmFsdWVTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnU3RvcmVWYWx1ZScsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU3RvcmVWYWx1ZSwKICAgICAgICBDbGFzcyAgICAgID0+ICdXNTBwYycsCiAgICApOwoKICAgIG15ICREaXNwbGF5RXJyb3JzID0gJFBhcmFte0Rpc3BsYXlFcnJvcnN9IHx8ICcwJzsKCiAgICAjIGNyZWF0ZSB0cmFuc2xhdGFibGUgdmFsdWVzIG9wdGlvbiBsaXN0CiAgICBteSAkRGlzcGxheUVycm9yc1N0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAwID0+ICdObycsCiAgICAgICAgICAgIDEgPT4gJ1llcycsCiAgICAgICAgfSwKICAgICAgICBOYW1lICAgICAgID0+ICdEaXNwbGF5RXJyb3JzJywKICAgICAgICBTZWxlY3RlZElEID0+ICREaXNwbGF5RXJyb3JzLAogICAgICAgIENsYXNzICAgICAgPT4gJ1c1MHBjJywKICAgICk7CgoKICAgIG15ICRMaW5rID0gJFBhcmFte0xpbmt9IHx8ICcnOwogICAgbXkgJFF1ZXJ5ID0gJFBhcmFte1F1ZXJ5fSB8fCAnJzsKICAgIG15ICRWaXN1YWxRdWVyeSA9ICRQYXJhbXtWaXN1YWxRdWVyeX0gfHwgJyc7CiAgICBteSAkUGFyYW1ldGVycyA9ICRQYXJhbXtQYXJhbWV0ZXJzfSB8fCAnJzsKICAgIG15ICREQklzdHJpbmcgPSAkUGFyYW17REJJc3RyaW5nfSB8fCAnJzsKICAgIG15ICREQkl1c2VyID0gJFBhcmFte0RCSXVzZXJ9IHx8ICcnOwogICAgbXkgJERCSXBhc3MgPSAkUGFyYW17REJJcGFzc30gfHwgJyc7CiAgICBteSAkU2VwYXJhdG9yID0gJFBhcmFte1NlcGFyYXRvcn0gfHwgJywnOwogICAgbXkgJENhY2hlVFRMID0gJFBhcmFte0NhY2hlVFRMfSB8fCAnMzYwJzsKCgogICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkR5bmFtaWNGaWVsZERyb3Bkb3duRnJvbURCJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFZhbGlkaXR5U3RyZyAgICAgICAgICAgPT4gJFZhbGlkaXR5U3RyZywKICAgICAgICAgICAgRHluYW1pY0ZpZWxkT3JkZXJTdHJnICA9PiAkRHluYW1pY0ZpZWxkT3JkZXJTdHJnLAojICAgICAgICAgICAgVmFsdWVDb3VudGVyICAgICAgICAgICA9PiAkVmFsdWVDb3VudGVyLAojICAgICAgICAgICAgRGVmYXVsdFZhbHVlU3RyZyAgICAgICA9PiAkRGVmYXVsdFZhbHVlU3RyZywKICAgICAgICAgICAgUG9zc2libGVOb25lU3RyZyAgICAgICA9PiAkUG9zc2libGVOb25lU3RyZywKICAgICAgICAgICAgVHJhbnNsYXRhYmxlVmFsdWVzU3RyZyA9PiAkVHJhbnNsYXRhYmxlVmFsdWVzU3RyZywKICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICA9PiAkTGluaywKICAgICAgICAgICAgUXVlcnkJCSAgID0+ICRRdWVyeSwKICAgICAgICAgICAgU3RvcmVWYWx1ZQkJICAgPT4gJFN0b3JlVmFsdWVTdHJnLAogICAgICAgICAgICBWaXN1YWxRdWVyeQkJICAgPT4gJFZpc3VhbFF1ZXJ5LAogICAgICAgICAgICBQYXJhbWV0ZXJzCQkgICA9PiAkUGFyYW1ldGVycywKICAgICAgICAgICAgREJJc3RyaW5nCQkgICA9PiAkREJJc3RyaW5nLAogICAgICAgICAgICBEQkl1c2VyCQkgICA9PiAkREJJdXNlciwKICAgICAgICAgICAgREJJcGFzcwkJICAgPT4gJERCSXBhc3MsCiAgICAgICAgICAgIFNlcGFyYXRvcgkJICAgPT4gJFNlcGFyYXRvciwKICAgICAgICAgICAgQ2FjaGVUVEwJCSAgID0+ICRDYWNoZVRUTCwKICAgICAgICAgICAgRGlzcGxheUVycm9yc1N0cmcJPT4gJERpc3BsYXlFcnJvcnNTdHJnLAogICAgICAgIH0KICAgICk7CgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0dldFBvc3NpYmxlVmFsdWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiMKICAgIG15ICRQb3NzaWJsZVZhbHVlQ29uZmlnOwojCiMgICAgIyBnZXQgcGFyYW1ldGVycyBmcm9tIHdlYiBicm93c2VyCiMgICAgIyBnZXQgVmFsdWVDb3VudGVycwojICAgIG15ICRWYWx1ZUNvdW50ZXIgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdWYWx1ZUNvdW50ZXInICkgfHwgMDsKIyAgICBteSAkRW1wdHlWYWx1ZUNvdW50ZXIgICAgID0gMDsKIyAgICBteSAkRHVwbGljYXRlVmFsdWVDb3VudGVyID0gMDsKIwojICAgICMgZ2V0IHBvc3NpYmxlIHZhbHVlcwojICAgIG15ICRWYWx1ZXM7CiMgICAgVkFMVUVJTkRFWDoKIyAgICBmb3IgbXkgJFZhbHVlSW5kZXggKCAxIC4uICRWYWx1ZUNvdW50ZXIgKSB7CiMgICAgICAgIG15ICRLZXkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdLZXknIC4gJ18nIC4gJFZhbHVlSW5kZXggKTsKIyAgICAgICAgJEtleSA9ICggZGVmaW5lZCAkS2V5ID8gJEtleSA6ICcnICk7CiMKIyAgICAgICAgIyBjaGVjayBpZiBrZXkgd2FzIGRlbGV0ZWQgYnkgdGhlIHVzZXIgYW5kIHNraXAgaXQKIyAgICAgICAgbmV4dCBWQUxVRUlOREVYIGlmICRLZXkgZXEgJFNlbGYtPntEZWxldGVkU3RyaW5nfTsKIwojICAgICAgICAjIGNoZWNrIGlmIHRoZSBvcmlnaW5hbCB2YWx1ZSBpcyBlbXB0eQojICAgICAgICBpZiAoICRLZXkgZXEgJycgKSB7CiMKIyAgICAgICAgICAgICMgY2hhbmdlIHRoZSBlbXB0eSB2YWx1ZSB0byBhIHByZWRlZmluZWQgc3RyaW5nCiMgICAgICAgICAgICAkS2V5ID0gJFNlbGYtPntFbXB0eVN0cmluZ30gLiBpbnQgJEVtcHR5VmFsdWVDb3VudGVyOwojICAgICAgICAgICAgJEVtcHR5VmFsdWVDb3VudGVyKys7CiMgICAgICAgIH0KIwojICAgICAgICAjIG90aGVyd2lzZSBjaGVjayBmb3IgZHVwbGljYXRlCiMgICAgICAgIGVsc2lmICggZXhpc3RzICRQb3NzaWJsZVZhbHVlQ29uZmlnLT57JEtleX0gKSB7CiMKIyAgICAgICAgICAgICMgYXBwZW5kIGEgcHJlZGVmaW5lZCB1bmlxdWUgc3RyaW5nIHRvIG1ha2UgdGhpcyB2YWx1ZSB1bmlxdWUKIyAgICAgICAgICAgICRLZXkgLj0gJy0nIC4gJFNlbGYtPntEdXBsaWNhdGVTdHJpbmd9IC4gJER1cGxpY2F0ZVZhbHVlQ291bnRlcjsKIyAgICAgICAgICAgICREdXBsaWNhdGVWYWx1ZUNvdW50ZXIrKzsKIyAgICAgICAgfQojCiMgICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZhbHVlJyAuICdfJyAuICRWYWx1ZUluZGV4ICk7CiMgICAgICAgICRWYWx1ZSA9ICggZGVmaW5lZCAkVmFsdWUgPyAkVmFsdWUgOiAnJyApOwojICAgICAgICAkUG9zc2libGVWYWx1ZUNvbmZpZy0+eyRLZXl9ID0gJFZhbHVlOwojICAgIH0KCiMgICAgJFBvc3NpYmxlVmFsdWVDb25maWctPnsnZHVtbXlrZXknfSA9ICdkdW1teXZhbHVlJzsKCiAgICByZXR1cm4gJFBvc3NpYmxlVmFsdWVDb25maWc7Cn0KCjE7Cg==</File>
<File Location="Custom/Kernel/Modules/AdminDynamicFieldTextAreaFromDB.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluRHluYW1pY0ZpZWxkRHJvcGRvd24ucG0gLSBwcm92aWRlcyBhIGR5bmFtaWMgZmllbGRzIHRleHQgY29uZmlnIHZpZXcgZm9yIGFkbWlucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEyIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5EeW5hbWljRmllbGREcm9wZG93bi5wbSx2IDEuMTUgMjAxMi8wNC8xOCAxOTozODowMSBjciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluRHluYW1pY0ZpZWxkVGV4dEFyZWFGcm9tREI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgZm9yIChxdyhQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZC0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZ2V0IGNvbmZpZ3VyZWQgb2JqZWN0IHR5cGVzCiAgICAkU2VsZi0+e09iamVjdFR5cGVDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0R5bmFtaWNGaWVsZHM6Ok9iamVjdFR5cGUnKTsKCiAgICAjIGdldCB0aGUgZmllbGRzIGNvbmZpZwogICAgJFNlbGYtPntGaWVsZFR5cGVDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0R5bmFtaWNGaWVsZHM6OkJhY2tlbmQnKSB8fCB7fTsKCiAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgaGFuZGxpbmcgc3RyaW5ncwogICAgJFNlbGYtPntFbXB0eVN0cmluZ30gICAgID0gJ19EeW5hbWljRmllbGRzX0VtcHR5U3RyaW5nX0RvbnRfVXNlX0l0X1N0cmluZ19QbGVhc2UnOwogICAgJFNlbGYtPntEdXBsaWNhdGVTdHJpbmd9ID0gJ19EeW5hbWljRmllbGRzX0R1cGxpY2F0ZWRTdHJpbmdfRG9udF9Vc2VfSXRfU3RyaW5nX1BsZWFzZSc7CiAgICAkU2VsZi0+e0RlbGV0ZWRTdHJpbmd9ICAgPSAnX0R5bmFtaWNGaWVsZHNfRGVsZXRlZFN0cmluZ19Eb250X1VzZV9JdF9TdHJpbmdfUGxlYXNlJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkJyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9BZGQoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZEFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5fQWRkQWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDaGFuZ2UnICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0NoYW5nZSgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPl9DaGFuZ2VBY3Rpb24oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgTWVzc2FnZSA9PiAiVW5kZWZpbmVkIHN1YmFjdGlvbi4iLAogICAgKTsKfQoKc3ViIF9BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJE5lZWRlZCAocXcoT2JqZWN0VHlwZSBGaWVsZFR5cGUgRmllbGRPcmRlcikpIHsKICAgICAgICAkR2V0UGFyYW17JE5lZWRlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICROZWVkZWQgKTsKICAgICAgICBpZiAoICEkTmVlZGVkICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5lZWQgJE5lZWRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRoZSBvYmplY3QgdHlwZSBhbmQgZmllbGQgdHlwZSBkaXNwbGF5IG5hbWUKICAgIG15ICRPYmplY3RUeXBlTmFtZSA9ICRTZWxmLT57T2JqZWN0VHlwZUNvbmZpZ30tPnsgJEdldFBhcmFte09iamVjdFR5cGV9IH0tPntEaXNwbGF5TmFtZX0gfHwgJyc7CiAgICBteSAkRmllbGRUeXBlTmFtZSAgPSAkU2VsZi0+e0ZpZWxkVHlwZUNvbmZpZ30tPnsgJEdldFBhcmFte0ZpZWxkVHlwZX0gfS0+e0Rpc3BsYXlOYW1lfSAgIHx8ICcnOwoKICAgIHJldHVybiAkU2VsZi0+X1Nob3dTY3JlZW4oCiAgICAgICAgJVBhcmFtLAogICAgICAgICVHZXRQYXJhbSwKICAgICAgICBNb2RlICAgICAgICAgICA9PiAnQWRkJywKICAgICAgICBPYmplY3RUeXBlTmFtZSA9PiAkT2JqZWN0VHlwZU5hbWUsCiAgICAgICAgRmllbGRUeXBlTmFtZSAgPT4gJEZpZWxkVHlwZU5hbWUsCiAgICApOwp9CgpzdWIgX0FkZEFjdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVFcnJvcnM7CiAgICBteSAlR2V0UGFyYW07CgogICAgZm9yIG15ICROZWVkZWQgKHF3KE5hbWUgTGFiZWwgRmllbGRPcmRlcikpIHsKICAgICAgICAkR2V0UGFyYW17JE5lZWRlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICROZWVkZWQgKTsKICAgICAgICBpZiAoICEkR2V0UGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRFcnJvcnN7ICROZWVkZWQgLiAnU2VydmVyRXJyb3InIH0gICAgICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJEVycm9yc3sgJE5lZWRlZCAuICdTZXJ2ZXJFcnJvck1lc3NhZ2UnIH0gPSAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4nOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRHZXRQYXJhbXtOYW1lfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBuYW1lIGlzIGFscGhhbnVtZXJpYwogICAgICAgIGlmICggJEdldFBhcmFte05hbWV9ICF+IG17XEEgKCA/OiBbYS16QS1aXSB8IFxkICkrIFx6fXhtcyApIHsKCiAgICAgICAgICAgICMgYWRkIHNlcnZlciBlcnJvciBlcnJvciBjbGFzcwogICAgICAgICAgICAkRXJyb3Jze05hbWVTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3Jze05hbWVTZXJ2ZXJFcnJvck1lc3NhZ2V9ID0KICAgICAgICAgICAgICAgICdUaGUgZmllbGQgZG9lcyBub3QgY29udGFpbiBvbmx5IEFTQ0lJIGxldHRlcnMgYW5kIG51bWJlcnMuJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgbmFtZSBpcyBkdXBsaWNhdGVkCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZHNMaXN0ID0gJXsKICAgICAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0KAogICAgICAgICAgICAgICAgVmFsaWQgICAgICA9PiAwLAogICAgICAgICAgICAgICAgUmVzdWx0VHlwZSA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIH07CgogICAgICAgICVEeW5hbWljRmllbGRzTGlzdCA9IHJldmVyc2UgJUR5bmFtaWNGaWVsZHNMaXN0OwoKICAgICAgICBpZiAoICREeW5hbWljRmllbGRzTGlzdHsgJEdldFBhcmFte05hbWV9IH0gKSB7CgogICAgICAgICAgICAjIGFkZCBzZXJ2ZXIgZXJyb3IgZXJyb3IgY2xhc3MKICAgICAgICAgICAgJEVycm9yc3tOYW1lU2VydmVyRXJyb3J9ICAgICAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRFcnJvcnN7TmFtZVNlcnZlckVycm9yTWVzc2FnZX0gPSAnVGhlcmUgaXMgYW5vdGhlciBmaWVsZCB3aXRoIHRoZSBzYW1lIG5hbWUuJzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkR2V0UGFyYW17RmllbGRPcmRlcn0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgZmllbGQgb3JkZXIgaXMgbnVtZXJpYyBhbmQgcG9zaXRpdmUKICAgICAgICBpZiAoICRHZXRQYXJhbXtGaWVsZE9yZGVyfSAhfiBte1xBICggPzogXGQgKSsgXHp9eG1zICkgewoKICAgICAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIGVycm9yIGNsYXNzCiAgICAgICAgICAgICRFcnJvcnN7RmllbGRPcmRlclNlcnZlckVycm9yfSAgICAgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3Jze0ZpZWxkT3JkZXJTZXJ2ZXJFcnJvck1lc3NhZ2V9ID0gJ1RoZSBmaWVsZCBtdXN0IGJlIG51bWVyaWMuJzsKICAgICAgICB9CiAgICB9CgogICAgZm9yIG15ICRDb25maWdQYXJhbSAoCiAgICAgICAgcXcoCiAgICAgICAgT2JqZWN0VHlwZSBPYmplY3RUeXBlTmFtZSBGaWVsZFR5cGUgRmllbGRUeXBlTmFtZSBEZWZhdWx0VmFsdWUgUG9zc2libGVOb25lCiAgICAgICAgVHJhbnNsYXRhYmxlVmFsdWVzIFZhbGlkSUQgTGluayBRdWVyeSBQYXJhbWV0ZXJzIERCSXN0cmluZyBEQkl1c2VyIERCSXBhc3MgQ2FjaGVUVEwKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskQ29uZmlnUGFyYW19ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkQ29uZmlnUGFyYW0gKTsKICAgIH0KCiAgICAjIHVuY29ycmVjdGFibGUgZXJyb3JzCiAgICBpZiAoICEkR2V0UGFyYW17VmFsaWRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5lZWQgVmFsaWRJRCIsCiAgICAgICAgKTsKICAgIH0KCiMgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJFNlbGYtPl9HZXRQb3NzaWJsZVZhbHVlcygpOwojCiMgICAgIyBzZXQgZXJyb3JzIGZvciBwb3NzaWJsZSB2YWx1ZXMgZW50cmllcwojICAgIEtFWToKIyAgICBmb3IgbXkgJEtleSAoIGtleXMgJXskUG9zc2libGVWYWx1ZXN9ICkgewojCiMgICAgICAgICMgY2hlY2sgZm9yIGVtcHR5IG9yaWdpbmFsIHZhbHVlcwojICAgICAgICBpZiAoICRLZXkgPX4gbXtcQSAkU2VsZi0+e0VtcHR5U3RyaW5nfSAoPzogXGQrKX1zbXggKSB7CiMKIyAgICAgICAgICAgICMgc2V0IGEgdHJ1ZSBlbnRyeSBpbiBLZXlFbXB0eUVycm9yCiMgICAgICAgICAgICAkRXJyb3JzeydQb3NzaWJsZVZhbHVlRXJyb3JzJ30tPnsnS2V5RW1wdHlFcnJvcid9LT57JEtleX0gPSAxOwojICAgICAgICB9CiMKIyAgICAgICAgIyBvdGhlcndpc2UgY2hlY2sgZm9yIGR1cGxpY2F0ZSBvcmlnaW5hbCB2YWx1ZXMKIyAgICAgICAgZWxzaWYgKCAkS2V5ID1+IG17XEEgKC4rKSAtICRTZWxmLT57RHVwbGljYXRlU3RyaW5nfSAoPzogXGQrKX1zbXggKSB7CiMKIyAgICAgICAgICAgICMgc2V0IGFuIGVudHJ5IGluIE9yaWdWYWx1ZUR1cGxpY2F0ZUVycm9yIHdpdGggdGhlIGR1cGxpY2F0ZSBrZXkgYXMgdmFsdWUKIyAgICAgICAgICAgICRFcnJvcnN7J1Bvc3NpYmxlVmFsdWVFcnJvcnMnfS0+eydLZXlEdXBsaWNhdGVFcnJvcid9LT57JEtleX0gPSAkMTsKIyAgICAgICAgfQojCiMgICAgICAgICMgY2hlY2sgZm9yIGVtcHR5IG5ldyB2YWx1ZXMKIyAgICAgICAgaWYgKCAhZGVmaW5lZCAkUG9zc2libGVWYWx1ZXMtPnskS2V5fSApIHsKIwojICAgICAgICAgICAgIyBzZXQgYSB0cnVlIGVudHJ5IGluIE5ld1ZhbHVlRW1wdHlFcnJvcgojICAgICAgICAgICAgJEVycm9yc3snUG9zc2libGVWYWx1ZUVycm9ycyd9LT57J1ZhbHVlRW1wdHlFcnJvcid9LT57JEtleX0gPSAxOwojICAgICAgICB9CiMgICAgfQoKICAgICMgcmV0dXJuIHRvIGFkZCBzY3JlZW4gaWYgZXJyb3JzCiAgICBpZiAoJUVycm9ycykgewogICAgICAgIHJldHVybiAkU2VsZi0+X1Nob3dTY3JlZW4oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUVycm9ycywKICAgICAgICAgICAgJUdldFBhcmFtLAojICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBNb2RlICAgICAgICAgICA9PiAnQWRkJywKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IHNwZWNpZmljIGNvbmZpZwogICAgbXkgJEZpZWxkQ29uZmlnID0gewojICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFBvc3NpYmxlVmFsdWVzLAogICAgICAgIERlZmF1bHRWYWx1ZSAgICAgICA9PiAkR2V0UGFyYW17RGVmYXVsdFZhbHVlfSwKICAgICAgICBQb3NzaWJsZU5vbmUgICAgICAgPT4gJEdldFBhcmFte1Bvc3NpYmxlTm9uZX0sCiAgICAgICAgVHJhbnNsYXRhYmxlVmFsdWVzID0+ICRHZXRQYXJhbXtUcmFuc2xhdGFibGVWYWx1ZXN9LAogICAgICAgIExpbmsgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17TGlua30sCiAgICAgICAgUXVlcnkJCQkJPT4gJEdldFBhcmFte1F1ZXJ5fSwKICAgICAgICBQYXJhbWV0ZXJzCQkJPT4gJEdldFBhcmFte1BhcmFtZXRlcnN9LAogICAgICAgIERCSXN0cmluZwkJCT0+ICRHZXRQYXJhbXtEQklzdHJpbmd9LAogICAgICAgIERCSXVzZXIJCQkJPT4gJEdldFBhcmFte0RCSXVzZXJ9LAogICAgICAgIERCSXBhc3MJCQkJPT4gJEdldFBhcmFte0RCSXBhc3N9LAogICAgICAgIENhY2hlVFRMCQkJPT4gJEdldFBhcmFte0NhY2hlVFRMfSwKICAgICAgICBEaXNwbGF5RXJyb3JzCQk9PiAkR2V0UGFyYW17RGlzcGxheUVycm9yc30sCiAgICB9OwoKICAgICMgY3JlYXRlIGEgbmV3IGZpZWxkCiAgICBteSAkRmllbGRJRCA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkQWRkKAogICAgICAgIE5hbWUgICAgICAgPT4gJEdldFBhcmFte05hbWV9LAogICAgICAgIExhYmVsICAgICAgPT4gJEdldFBhcmFte0xhYmVsfSwKICAgICAgICBGaWVsZE9yZGVyID0+ICRHZXRQYXJhbXtGaWVsZE9yZGVyfSwKICAgICAgICBGaWVsZFR5cGUgID0+ICRHZXRQYXJhbXtGaWVsZFR5cGV9LAogICAgICAgIE9iamVjdFR5cGUgPT4gJEdldFBhcmFte09iamVjdFR5cGV9LAogICAgICAgIENvbmZpZyAgICAgPT4gJEZpZWxkQ29uZmlnLAogICAgICAgIFZhbGlkSUQgICAgPT4gJEdldFBhcmFte1ZhbGlkSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkRmllbGRJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IGNyZWF0ZSB0aGUgbmV3IGZpZWxkIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgIE9QID0+ICJBY3Rpb249QWRtaW5EeW5hbWljRmllbGQiLAogICAgKTsKfQoKc3ViIF9DaGFuZ2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJE5lZWRlZCAocXcoT2JqZWN0VHlwZSBGaWVsZFR5cGUpKSB7CiAgICAgICAgJEdldFBhcmFteyROZWVkZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkTmVlZGVkICk7CiAgICAgICAgaWYgKCAhJE5lZWRlZCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aGUgb2JqZWN0IHR5cGUgYW5kIGZpZWxkIHR5cGUgZGlzcGxheSBuYW1lCiAgICBteSAkT2JqZWN0VHlwZU5hbWUgPSAkU2VsZi0+e09iamVjdFR5cGVDb25maWd9LT57ICRHZXRQYXJhbXtPYmplY3RUeXBlfSB9LT57RGlzcGxheU5hbWV9IHx8ICcnOwogICAgbXkgJEZpZWxkVHlwZU5hbWUgID0gJFNlbGYtPntGaWVsZFR5cGVDb25maWd9LT57ICRHZXRQYXJhbXtGaWVsZFR5cGV9IH0tPntEaXNwbGF5TmFtZX0gICB8fCAnJzsKCiAgICBteSAkRmllbGRJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApOwoKICAgIGlmICggISRGaWVsZElEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJOZWVkIElEIiwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgZGF0YQogICAgbXkgJER5bmFtaWNGaWVsZERhdGEgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICBJRCA9PiAkRmllbGRJRCwKICAgICk7CgogICAgIyBjaGVjayBmb3IgdmFsaWQgZHluYW1pYyBmaWVsZCBjb25maWd1cmF0aW9uCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkRGF0YSkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCBnZXQgZGF0YSBmb3IgZHluYW1pYyBmaWVsZCAkRmllbGRJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlQ29uZmlnID0gKCk7CgogICAgIyBleHRyYWN0IGNvbmZpZ3VyYXRpb24KICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfSApICkgewoKIyAgICAgICAgIyBzZXQgUG9zc2libGVWYWx1ZXMKIyAgICAgICAgJENvbmZpZ3tQb3NzaWJsZVZhbHVlc30gPSB7fTsKIyAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9ICkgKSB7CiMgICAgICAgICAgICAkQ29uZmlne1Bvc3NpYmxlVmFsdWVzfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfTsKIyAgICAgICAgfQoKICAgICAgICAjIHNldCBEZWZhdWx0VmFsdWUKICAgICAgICAkQ29uZmlne0RlZmF1bHRWYWx1ZX0gPSAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9OwoKICAgICAgICAjIHNldCBQb3NzaWJsZU5vbmUKICAgICAgICAkQ29uZmlne1Bvc3NpYmxlTm9uZX0gPSAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30tPntQb3NzaWJsZU5vbmV9OwoKICAgICAgICAjIHNldCBUcmFuc2xhdGFsYmVWYWx1ZXMKICAgICAgICAkQ29uZmlne1RyYW5zbGF0YWJsZVZhbHVlc30gPSAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9OwoKICAgICAgICAjIHNldCBMaW5rCiAgICAgICAgJENvbmZpZ3tMaW5rfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e0xpbmt9OwogICAgICAgICRDb25maWd7UXVlcnl9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57UXVlcnl9IHx8ICdpbnNlcnQgcXVlcnkgaGVyZSc7CiAgICAgICAgJENvbmZpZ3tQYXJhbWV0ZXJzfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e1BhcmFtZXRlcnN9OwogICAgICAgICRDb25maWd7REJJc3RyaW5nfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e0RCSXN0cmluZ307CiAgICAgICAgJENvbmZpZ3tEQkl1c2VyfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e0RCSXVzZXJ9OwogICAgICAgICRDb25maWd7REJJcGFzc30gPSAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30tPntEQklwYXNzfTsKICAgICAgICAkQ29uZmlne0NhY2hlVFRMfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e0NhY2hlVFRMfTsKICAgICAgICAkQ29uZmlne0Rpc3BsYXlFcnJvcnN9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57RGlzcGxheUVycm9yc307CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5fU2hvd1NjcmVlbigKICAgICAgICAlUGFyYW0sCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgICUke0R5bmFtaWNGaWVsZERhdGF9LAogICAgICAgICVDb25maWcsCiAgICAgICAgSUQgICAgICAgICAgICAgPT4gJEZpZWxkSUQsCiAgICAgICAgTW9kZSAgICAgICAgICAgPT4gJ0NoYW5nZScsCiAgICAgICAgT2JqZWN0VHlwZU5hbWUgPT4gJE9iamVjdFR5cGVOYW1lLAogICAgICAgIEZpZWxkVHlwZU5hbWUgID0+ICRGaWVsZFR5cGVOYW1lLAogICAgKTsKfQoKc3ViIF9DaGFuZ2VBY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRXJyb3JzOwogICAgbXkgJUdldFBhcmFtOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhOYW1lIExhYmVsIEZpZWxkT3JkZXIpKSB7CiAgICAgICAgJEdldFBhcmFteyROZWVkZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkTmVlZGVkICk7CiAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkRXJyb3JzeyAkTmVlZGVkIC4gJ1NlcnZlckVycm9yJyB9ICAgICAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRFcnJvcnN7ICROZWVkZWQgLiAnU2VydmVyRXJyb3JNZXNzYWdlJyB9ID0gJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQuJzsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEZpZWxkSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKICAgIGlmICggISRGaWVsZElEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJOZWVkIElEIiwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJEdldFBhcmFte05hbWV9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIG5hbWUgaXMgbG93ZXJjYXNlCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmFtZX0gIX4gbXtcQSAoID86IFthLXpBLVpdIHwgXGQgKSsgXHp9eG1zICkgewoKICAgICAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIGVycm9yIGNsYXNzCiAgICAgICAgICAgICRFcnJvcnN7TmFtZVNlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRFcnJvcnN7TmFtZVNlcnZlckVycm9yTWVzc2FnZX0gPQogICAgICAgICAgICAgICAgJ1RoZSBmaWVsZCBkb2VzIG5vdCBjb250YWluIG9ubHkgQVNDSUkgbGV0dGVycyBhbmQgbnVtYmVycy4nOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBuYW1lIGlzIGR1cGxpY2F0ZWQKICAgICAgICBteSAlRHluYW1pY0ZpZWxkc0xpc3QgPSAlewogICAgICAgICAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3QoCiAgICAgICAgICAgICAgICBWYWxpZCAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBSZXN1bHRUeXBlID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgfTsKCiAgICAgICAgJUR5bmFtaWNGaWVsZHNMaXN0ID0gcmV2ZXJzZSAlRHluYW1pY0ZpZWxkc0xpc3Q7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJER5bmFtaWNGaWVsZHNMaXN0eyAkR2V0UGFyYW17TmFtZX0gfSAmJgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkc0xpc3R7ICRHZXRQYXJhbXtOYW1lfSB9IG5lICRGaWVsZElECiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIGFkZCBzZXJ2ZXIgZXJyb3IgY2xhc3MKICAgICAgICAgICAgJEVycm9yc3tOYW1lU2VydmVyRXJyb3J9ICAgICAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRFcnJvcnN7TmFtZVNlcnZlckVycm9yTWVzc2FnZX0gPSAnVGhlcmUgaXMgYW5vdGhlciBmaWVsZCB3aXRoIHRoZSBzYW1lIG5hbWUuJzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkR2V0UGFyYW17RmllbGRPcmRlcn0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgZmllbGQgb3JkZXIgaXMgbnVtZXJpYyBhbmQgcG9zaXRpdmUKICAgICAgICBpZiAoICRHZXRQYXJhbXtGaWVsZE9yZGVyfSAhfiBte1xBICggPzogXGQgKSsgXHp9eG1zICkgewoKICAgICAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIGVycm9yIGNsYXNzCiAgICAgICAgICAgICRFcnJvcnN7RmllbGRPcmRlclNlcnZlckVycm9yfSAgICAgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3Jze0ZpZWxkT3JkZXJTZXJ2ZXJFcnJvck1lc3NhZ2V9ID0gJ1RoZSBmaWVsZCBtdXN0IGJlIG51bWVyaWMuJzsKICAgICAgICB9CiAgICB9CgogICAgZm9yIG15ICRDb25maWdQYXJhbSAoCiAgICAgICAgcXcoCiAgICAgICAgT2JqZWN0VHlwZSBPYmplY3RUeXBlTmFtZSBGaWVsZFR5cGUgRmllbGRUeXBlTmFtZSBEZWZhdWx0VmFsdWUgUG9zc2libGVOb25lCiAgICAgICAgVHJhbnNsYXRhYmxlVmFsdWVzIFZhbGlkSUQgTGluayBRdWVyeSBQYXJhbWV0ZXJzIERCSXN0cmluZyBEQkl1c2VyIERCSXBhc3MgQ2FjaGVUVEwKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskQ29uZmlnUGFyYW19ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkQ29uZmlnUGFyYW0gKTsKICAgIH0KCiAgICAjIHVuY29ycmVjdGFibGUgZXJyb3JzCiAgICBpZiAoICEkR2V0UGFyYW17VmFsaWRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5lZWQgVmFsaWRJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGRhdGEKICAgIG15ICREeW5hbWljRmllbGREYXRhID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgSUQgPT4gJEZpZWxkSUQsCiAgICApOwoKICAgICMgY2hlY2sgZm9yIHZhbGlkIGR5bmFtaWMgZmllbGQgY29uZmlndXJhdGlvbgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZERhdGEpICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgZ2V0IGRhdGEgZm9yIGR5bmFtaWMgZmllbGQgJEZpZWxkSUQiLAogICAgICAgICk7CiAgICB9CgojICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRTZWxmLT5fR2V0UG9zc2libGVWYWx1ZXMoKTsKIwojICAgICMgc2V0IGVycm9ycyBmb3IgcG9zc2libGUgdmFsdWVzIGVudHJpZXMKIyAgICBLRVk6CiMgICAgZm9yIG15ICRLZXkgKCBrZXlzICV7JFBvc3NpYmxlVmFsdWVzfSApIHsKIwojICAgICAgICAjIGNoZWNrIGZvciBlbXB0eSBvcmlnaW5hbCB2YWx1ZXMKIyAgICAgICAgaWYgKCAkS2V5ID1+IG17XEEgJFNlbGYtPntFbXB0eVN0cmluZ30gKD86IFxkKyl9c214ICkgewojCiMgICAgICAgICAgICAjIHNldCBhIHRydWUgZW50cnkgaW4gS2V5RW1wdHlFcnJvcgojICAgICAgICAgICAgJEVycm9yc3snUG9zc2libGVWYWx1ZUVycm9ycyd9LT57J0tleUVtcHR5RXJyb3InfS0+eyRLZXl9ID0gMTsKIyAgICAgICAgfQojCiMgICAgICAgICMgb3RoZXJ3aXNlIGNoZWNrIGZvciBkdXBsaWNhdGUgb3JpZ2luYWwgdmFsdWVzCiMgICAgICAgIGVsc2lmICggJEtleSA9fiBte1xBICguKykgLSAkU2VsZi0+e0R1cGxpY2F0ZVN0cmluZ30gKD86IFxkKyl9c214ICkgewojCiMgICAgICAgICAgICAjIHNldCBhbiBlbnRyeSBpbiBPcmlnVmFsdWVEdXBsaWNhdGVFcnJvciB3aXRoIHRoZSBkdXBsaWNhdGUga2V5IGFzIHZhbHVlCiMgICAgICAgICAgICAkRXJyb3JzeydQb3NzaWJsZVZhbHVlRXJyb3JzJ30tPnsnS2V5RHVwbGljYXRlRXJyb3InfS0+eyRLZXl9ID0gJDE7CiMgICAgICAgIH0KIwojICAgICAgICAjIGNoZWNrIGZvciBlbXB0eSBuZXcgdmFsdWVzCiMgICAgICAgIGlmICggIWRlZmluZWQgJFBvc3NpYmxlVmFsdWVzLT57JEtleX0gKSB7CiMKIyAgICAgICAgICAgICMgc2V0IGEgdHJ1ZSBlbnRyeSBpbiBOZXdWYWx1ZUVtcHR5RXJyb3IKIyAgICAgICAgICAgICRFcnJvcnN7J1Bvc3NpYmxlVmFsdWVFcnJvcnMnfS0+eydWYWx1ZUVtcHR5RXJyb3InfS0+eyRLZXl9ID0gMTsKIyAgICAgICAgfQojICAgIH0KCiAgICAjIHJldHVybiB0byBjaGFuZ2Ugc2NyZWVuIGlmIGVycm9ycwogICAgaWYgKCVFcnJvcnMpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9TaG93U2NyZWVuKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVFcnJvcnMsCiAgICAgICAgICAgICVHZXRQYXJhbSwKIyAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgSUQgICAgICAgICAgICAgPT4gJEZpZWxkSUQsCiAgICAgICAgICAgIE1vZGUgICAgICAgICAgID0+ICdDaGFuZ2UnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgc3BlY2lmaWMgY29uZmlnCiAgICBteSAkRmllbGRDb25maWcgPSB7CiMgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgRGVmYXVsdFZhbHVlICAgICAgID0+ICRHZXRQYXJhbXtEZWZhdWx0VmFsdWV9LAogICAgICAgIFBvc3NpYmxlTm9uZSAgICAgICA9PiAkR2V0UGFyYW17UG9zc2libGVOb25lfSwKICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gJEdldFBhcmFte1RyYW5zbGF0YWJsZVZhbHVlc30sCiAgICAgICAgTGluayAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtMaW5rfSwKICAgICAgICBRdWVyeQkJCQk9PiAkR2V0UGFyYW17UXVlcnl9LAogICAgICAgIFBhcmFtZXRlcnMJCQk9PiAkR2V0UGFyYW17UGFyYW1ldGVyc30sCiAgICAgICAgREJJc3RyaW5nCQkJPT4gJEdldFBhcmFte0RCSXN0cmluZ30sCiAgICAgICAgREJJdXNlcgkJCQk9PiAkR2V0UGFyYW17REJJdXNlcn0sCiAgICAgICAgREJJcGFzcwkJCQk9PiAkR2V0UGFyYW17REJJcGFzc30sCiAgICAgICAgQ2FjaGVUVEwJCQk9PiAkR2V0UGFyYW17Q2FjaGVUVEx9LAogICAgICAgIERpc3BsYXlFcnJvcnMJCT0+ICRHZXRQYXJhbXtEaXNwbGF5RXJyb3JzfSwKICAgIH07CgogICAgIyB1cGRhdGUgZHluYW1pYyBmaWVsZCAoRmllbGRUeXBlIGFuZCBPYmplY3RUeXBlIGNhbm5vdCBiZSBjaGFuZ2VkOyB1c2Ugb2xkIHZhbHVlcykKICAgIG15ICRVcGRhdGVTdWNjZXNzID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRVcGRhdGUoCiAgICAgICAgSUQgICAgICAgICA9PiAkRmllbGRJRCwKICAgICAgICBOYW1lICAgICAgID0+ICRHZXRQYXJhbXtOYW1lfSwKICAgICAgICBMYWJlbCAgICAgID0+ICRHZXRQYXJhbXtMYWJlbH0sCiAgICAgICAgRmllbGRPcmRlciA9PiAkR2V0UGFyYW17RmllbGRPcmRlcn0sCiAgICAgICAgRmllbGRUeXBlICA9PiAkRHluYW1pY0ZpZWxkRGF0YS0+e0ZpZWxkVHlwZX0sCiAgICAgICAgT2JqZWN0VHlwZSA9PiAkRHluYW1pY0ZpZWxkRGF0YS0+e09iamVjdFR5cGV9LAogICAgICAgIENvbmZpZyAgICAgPT4gJEZpZWxkQ29uZmlnLAogICAgICAgIFZhbGlkSUQgICAgPT4gJEdldFBhcmFte1ZhbGlkSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkVXBkYXRlU3VjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IHVwZGF0ZSB0aGUgZmllbGQgJEdldFBhcmFte05hbWV9IiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgIE9QID0+ICJBY3Rpb249QWRtaW5EeW5hbWljRmllbGQiLAogICAgKTsKfQoKc3ViIF9TaG93U2NyZWVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFBhcmFte0Rpc3BsYXlGaWVsZE5hbWV9ID0gJ05ldyc7CgogICAgaWYgKCAkUGFyYW17TW9kZX0gZXEgJ0NoYW5nZScgKSB7CiAgICAgICAgJFBhcmFte1Nob3dXYXJuaW5nfSAgICAgID0gJ1Nob3dXYXJuaW5nJzsKICAgICAgICAkUGFyYW17RGlzcGxheUZpZWxkTmFtZX0gPSAkUGFyYW17TmFtZX07CiAgICB9CgogICAgJFBhcmFte0RlbGV0ZWRTdHJpbmd9ID0gJFNlbGYtPntEZWxldGVkU3RyaW5nfTsKCiAgICAjIGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgZ2V0IGFsbCBmaWVsZHMKICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgZ2V0IHRoZSBsaXN0IG9mIG9yZGVyIG51bWJlcnMgKGlzIGFscmVhZHkgc29ydGVkKS4KICAgIG15IEBEeW5hbWljZmllbGRPcmRlckxpc3Q7CiAgICBmb3IgbXkgJER5bmFtaWNmaWVsZCAoIEB7JER5bmFtaWNGaWVsZExpc3R9ICkgewogICAgICAgIHB1c2ggQER5bmFtaWNmaWVsZE9yZGVyTGlzdCwgJER5bmFtaWNmaWVsZC0+e0ZpZWxkT3JkZXJ9OwogICAgfQoKICAgICMgd2hlbiBhZGRpbmcgd2UgbmVlZCB0byBjcmVhdGUgYW4gZXh0cmEgb3JkZXIgbnVtYmVyIGZvciB0aGUgbmV3IGZpZWxkCiAgICBpZiAoICRQYXJhbXtNb2RlfSBlcSAnQWRkJyApIHsKCiAgICAgICAgIyBnZXQgdGhlIGxhc3QgZWxlbWVudCBmb3JtIHRoZSBvcmRlciBsaXN0IGFuZCBhZGQgMQogICAgICAgIG15ICRMYXN0T3JkZXJOdW1iZXIgPSAkRHluYW1pY2ZpZWxkT3JkZXJMaXN0Wy0xXTsKICAgICAgICAkTGFzdE9yZGVyTnVtYmVyKys7CgogICAgICAgICMgYWRkIHRoaXMgbmV3IG9yZGVyIG51bWJlciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CiAgICAgICAgcHVzaCBARHluYW1pY2ZpZWxkT3JkZXJMaXN0LCAkTGFzdE9yZGVyTnVtYmVyOwogICAgfQoKICAgIG15ICREeW5hbWljRmllbGRPcmRlclNydGcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXEBEeW5hbWljZmllbGRPcmRlckxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnRmllbGRPcmRlcicsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17RmllbGRPcmRlcn0gfHwgMSwKICAgICAgICBQb3NzaWJsZU5vbmUgID0+IDAsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnVzUwcGMgVmFsaWRhdGVfTnVtYmVyJywKICAgICk7CgogICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKCiAgICAjIGNyZWF0ZSB0aGUgVmFsaWRpdHkgc2VsZWN0CiAgICBteSAkVmFsaWRpdHlTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1ZhbGlkSUR9IHx8IDEsCiAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdXNTBwYycsCiAgICApOwoKICAgICMgZGVmaW5lIGFzIDAgdG8gZ2V0IHRoZSByZWFsIHZhbHVlIGluIHRoZSBIVE1MCiAgICBteSAkVmFsdWVDb3VudGVyID0gMDsKCiAgICAjIHNldCBQb3NzaWJsZVZhbHVlcwojICAgIG15ICVQb3NzaWJsZVZhbHVlczsKIyAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17UG9zc2libGVWYWx1ZXN9ICkgKSB7CiMgICAgICAgICVQb3NzaWJsZVZhbHVlcyA9ICV7ICRQYXJhbXtQb3NzaWJsZVZhbHVlc30gfTsKIyAgICB9CgojICAgICMgb3V0cHV0IHRoZSBwb3NzaWJsZSB2YWx1ZXMgYW5kIGVycm9ycyB3aXRoaW4gKGlmIGFueSkKIyAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlUG9zc2libGVWYWx1ZXMgKSB7CiMKIyAgICAgICAgJFZhbHVlQ291bnRlcisrOwojCiMgICAgICAgICMgbmVlZGVkIGZvciBzZXJ2ZXIgc2lkZSB2YWxpZGF0aW9uCiMgICAgICAgIG15ICRLZXlFcnJvcjsKIyAgICAgICAgbXkgJEtleUVycm9yU3RyZzsKIyAgICAgICAgbXkgJFZhbHVlRXJyb3I7CiMKIyAgICAgICAgIyB0byBzZXQgdGhlIGNvcnJlY3Qgb3JpZ2luYWwgdmFsdWUKIyAgICAgICAgbXkgJEtleUNsb25lID0gJEtleTsKIwojICAgICAgICAjIGNoZWNrIGZvciBlcnJvcnMKIyAgICAgICAgaWYgKCAkUGFyYW17J1Bvc3NpYmxlVmFsdWVFcnJvcnMnfSApIHsKIwojICAgICAgICAgICAgIyBjaGVjayBmb3IgZXJyb3JzIG9uIG9yaWdpbmFsIHZhbHVlIChlbXB0eSkKIyAgICAgICAgICAgIGlmICggJFBhcmFteydQb3NzaWJsZVZhbHVlRXJyb3JzJ30tPnsnS2V5RW1wdHlFcnJvcid9LT57JEtleX0gKSB7CiMKIyAgICAgICAgICAgICAgICAjIGlmIHRoZSBvcmlnaW5hbCB2YWx1ZSB3YXMgZW1wdHkgaXQgaGFzIGJlZW4gY2hhbmdlZCBpbiBfR2V0UGFyYW1zIHRvIGEgcHJlZGVmaW5lZAojICAgICAgICAgICAgICAgICMgc3RyaW5nIGFuZCBuZWVkIHRvIGJlIHNldCB0byBlbXB0eSBhZ2FpbgojICAgICAgICAgICAgICAgICRLZXlDbG9uZSA9ICcnOwojCiMgICAgICAgICAgICAgICAgIyBzZXQgdGhlIGVycm9yIGNsYXNzCiMgICAgICAgICAgICAgICAgJEtleUVycm9yICAgICA9ICdTZXJ2ZXJFcnJvcic7CiMgICAgICAgICAgICAgICAgJEtleUVycm9yU3RyZyA9ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLicKIyAgICAgICAgICAgIH0KIwojICAgICAgICAgICAgIyBjaGVjayBmb3IgZXJyb3JzIG9uIG9yaWdpbmFsIHZhbHVlIChkdXBsaWNhdGUpCiMgICAgICAgICAgICBlbHNpZiAoICRQYXJhbXsnUG9zc2libGVWYWx1ZUVycm9ycyd9LT57J0tleUR1cGxpY2F0ZUVycm9yJ30tPnskS2V5fSApIHsKIwojICAgICAgICAgICAgICAgICMgaWYgdGhlIG9yaWdpbmFsIHZhbHVlIHdhcyBlbXB0eSBpdCBoYXMgYmVlbiBjaGFuZ2VkIGluIF9HZXRQYXJhbXMgdG8gYSBwcmVkZWZpbmVkCiMgICAgICAgICAgICAgICAgIyBzdHJpbmcgYW5kIG5lZWQgdG8gYmUgc2V0IHRvIHRoZSBvcmlnaW5hbCB2YWx1ZSBhZ2FpbgojICAgICAgICAgICAgICAgICRLZXlDbG9uZQojICAgICAgICAgICAgICAgICAgICA9ICRQYXJhbXsnUG9zc2libGVWYWx1ZUVycm9ycyd9LT57J0tleUR1cGxpY2F0ZUVycm9yJ30tPnskS2V5fTsKIwojICAgICAgICAgICAgICAgICMgc2V0IHRoZSBlcnJvciBjbGFzcwojICAgICAgICAgICAgICAgICRLZXlFcnJvciAgICAgPSAnU2VydmVyRXJyb3InOwojICAgICAgICAgICAgICAgICRLZXlFcnJvclN0cmcgPSAnVGhpcyBmaWVsZCB2YWx1ZSBpcyBkdXBsaWNhdGVkLicKIyAgICAgICAgICAgIH0KIwojICAgICAgICAgICAgIyBjaGVjayBmb3IgZXJyb3Igb24gdmFsdWUKIyAgICAgICAgICAgIGlmICggJFBhcmFteydQb3NzaWJsZVZhbHVlRXJyb3JzJ30tPnsnVmFsdWVFbXB0eUVycm9yJ30tPnskS2V5fSApIHsKIwojICAgICAgICAgICAgICAgICMgc2V0IHRoZSBlcnJvciBjbGFzcwojICAgICAgICAgICAgICAgICRWYWx1ZUVycm9yID0gJ1NlcnZlckVycm9yJzsKIyAgICAgICAgICAgIH0KIyAgICAgICAgfQojCiMgICAgICAgICMgY3JlYXRlIGEgdmFsdWUgbWFwIHJvdwojICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAojICAgICAgICAgICAgTmFtZSA9PiAnVmFsdWVSb3cnLAojICAgICAgICAgICAgRGF0YSA9PiB7CiMgICAgICAgICAgICAgICAgS2V5RXJyb3IgICAgID0+ICRLZXlFcnJvciwKIyAgICAgICAgICAgICAgICBLZXlFcnJvclN0cmcgPT4gJEtleUVycm9yU3RyZyB8fCAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4nLAojICAgICAgICAgICAgICAgIEtleSAgICAgICAgICA9PiAkS2V5Q2xvbmUsCiMgICAgICAgICAgICAgICAgVmFsdWVDb3VudGVyID0+ICRWYWx1ZUNvdW50ZXIsCiMgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgID0+ICRQb3NzaWJsZVZhbHVlc3skS2V5fSwKIyAgICAgICAgICAgICAgICBWYWx1ZUVycm9yICAgPT4gJFZhbHVlRXJyb3IsCiMgICAgICAgICAgICB9LAojICAgICAgICApOwojICAgIH0KCiMgICAgIyBjcmVhdGUgdGhlIHBvc3NpYmxlIHZhbHVlcyB0ZW1wbGF0ZQojICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiMgICAgICAgIE5hbWUgPT4gJ1ZhbHVlVGVtcGxhdGUnLAojICAgICAgICBEYXRhID0+IHsKIyAgICAgICAgICAgICVQYXJhbSwKIyAgICAgICAgfSwKIyAgICApOwoKICAgICMgY2hlY2sgYW5kIGJ1aWxkIHRoZSBEZWZhdWx0IFZhbHVlIGxpc3QgYmFzZWQgb24gUG9zc2libGUgVmFsdWVzCiMgICAgbXkgJURlZmF1bHRWYWx1ZXNMaXN0OwojICAgIFBPU1NJQkxFVkFMVUU6CiMgICAgZm9yIG15ICRWYWx1ZUl0ZW0gKCBrZXlzICVQb3NzaWJsZVZhbHVlcyApIHsKIyAgICAgICAgbmV4dCBQT1NTSUJMRVZBTFVFIGlmICFkZWZpbmVkICRWYWx1ZUl0ZW07CiMgICAgICAgIG5leHQgUE9TU0lCTEVWQUxVRSBpZiAhZGVmaW5lZCAkUG9zc2libGVWYWx1ZXN7JFZhbHVlSXRlbX07CiMgICAgICAgICREZWZhdWx0VmFsdWVzTGlzdHskVmFsdWVJdGVtfSA9ICRQb3NzaWJsZVZhbHVlc3skVmFsdWVJdGVtfQojICAgIH0KIwojICAgIG15ICREZWZhdWx0VmFsdWUgPSAoIGRlZmluZWQgJFBhcmFte0RlZmF1bHRWYWx1ZX0gPyAkUGFyYW17RGVmYXVsdFZhbHVlfSA6ICcnICk7CiMKIyAgICAjIGNyZWF0ZSB0aGUgZGVmYXVsdCB2YWx1ZSBzZWxlY3QKIyAgICBteSAkRGVmYXVsdFZhbHVlU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiMgICAgICAgIERhdGEgICAgICAgICA9PiBcJURlZmF1bHRWYWx1ZXNMaXN0LAojICAgICAgICBOYW1lICAgICAgICAgPT4gJ0RlZmF1bHRWYWx1ZScsCiMgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkRGVmYXVsdFZhbHVlLAojICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKIwojICAgICAgICAjIERvbid0IG1ha2UgaXMgdHJhbnNsYXRhYmxlIGJlY2F1c2UgdGhpcyB3aWxsIGNvbmZ1c2UgdGhlIHVzZXIgKGFsc28gY3VycmVudCBKUwojICAgICAgICAjIGlzIG5vdCBwcmVwYXJlZCkKIyAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKIwojICAgICAgICAjIE11bHRpcGxlIHNlbGVjdGlvbnMgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkCiMgICAgICAgIE11bHRpcGxlID0+IDAsCiMgICAgICAgIENsYXNzICAgID0+ICdXNTBwYycsCiMgICAgKTsKCiAgICBteSAkUG9zc2libGVOb25lID0gJFBhcmFte1Bvc3NpYmxlTm9uZX0gfHwgJzAnOwoKICAgICMgY3JlYXRlIHRyYW5zbGF0YWJsZSB2YWx1ZXMgb3B0aW9uIGxpc3QKICAgIG15ICRQb3NzaWJsZU5vbmVTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnUG9zc2libGVOb25lJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQb3NzaWJsZU5vbmUsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnVzUwcGMnLAogICAgKTsKCiAgICBteSAkVHJhbnNsYXRhYmxlVmFsdWVzID0gJFBhcmFte1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgJzAnOwoKICAgICMgY3JlYXRlIHRyYW5zbGF0YWJsZSB2YWx1ZXMgb3B0aW9uIGxpc3QKICAgIG15ICRUcmFuc2xhdGFibGVWYWx1ZXNTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVHJhbnNsYXRhYmxlVmFsdWVzJywKICAgICAgICBTZWxlY3RlZElEID0+ICRUcmFuc2xhdGFibGVWYWx1ZXMsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnVzUwcGMnLAogICAgKTsKCiAgICBteSAkRGlzcGxheUVycm9ycyA9ICRQYXJhbXtEaXNwbGF5RXJyb3JzfSB8fCAnMCc7CgogICAgIyBjcmVhdGUgdHJhbnNsYXRhYmxlIHZhbHVlcyBvcHRpb24gbGlzdAogICAgbXkgJERpc3BsYXlFcnJvcnNTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnRGlzcGxheUVycm9ycycsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkRGlzcGxheUVycm9ycywKICAgICAgICBDbGFzcyAgICAgID0+ICdXNTBwYycsCiAgICApOwoKICAgIG15ICRMaW5rID0gJFBhcmFte0xpbmt9IHx8ICcnOwogICAgbXkgJFF1ZXJ5ID0gJFBhcmFte1F1ZXJ5fSB8fCAnJzsKICAgIG15ICRQYXJhbWV0ZXJzID0gJFBhcmFte1BhcmFtZXRlcnN9IHx8ICcnOwogICAgbXkgJERCSXN0cmluZyA9ICRQYXJhbXtEQklzdHJpbmd9IHx8ICcnOwogICAgbXkgJERCSXVzZXIgPSAkUGFyYW17REJJdXNlcn0gfHwgJyc7CiAgICBteSAkREJJcGFzcyA9ICRQYXJhbXtEQklwYXNzfSB8fCAnJzsKICAgIG15ICRDYWNoZVRUTCA9ICRQYXJhbXtDYWNoZVRUTH0gfHwgJyc7CgogICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkR5bmFtaWNGaWVsZFRleHRBcmVhRnJvbURCJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFZhbGlkaXR5U3RyZyAgICAgICAgICAgPT4gJFZhbGlkaXR5U3RyZywKICAgICAgICAgICAgRHluYW1pY0ZpZWxkT3JkZXJTcnRnICA9PiAkRHluYW1pY0ZpZWxkT3JkZXJTcnRnLAojICAgICAgICAgICAgVmFsdWVDb3VudGVyICAgICAgICAgICA9PiAkVmFsdWVDb3VudGVyLAojICAgICAgICAgICAgRGVmYXVsdFZhbHVlU3RyZyAgICAgICA9PiAkRGVmYXVsdFZhbHVlU3RyZywKICAgICAgICAgICAgUG9zc2libGVOb25lU3RyZyAgICAgICA9PiAkUG9zc2libGVOb25lU3RyZywKICAgICAgICAgICAgVHJhbnNsYXRhYmxlVmFsdWVzU3RyZyA9PiAkVHJhbnNsYXRhYmxlVmFsdWVzU3RyZywKICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICA9PiAkTGluaywKICAgICAgICAgICAgUXVlcnkJCQkJCT0+ICRRdWVyeSwKICAgICAgICAgICAgUGFyYW1ldGVycwkJCQk9PiAkUGFyYW1ldGVycywKICAgICAgICAgICAgREJJc3RyaW5nCQkJCT0+ICREQklzdHJpbmcsCiAgICAgICAgICAgIERCSXVzZXIJCQkJCT0+ICREQkl1c2VyLAogICAgICAgICAgICBEQklwYXNzCQkJCQk9PiAkREJJcGFzcywKICAgICAgICAgICAgQ2FjaGVUVEwJCQkJPT4gJENhY2hlVFRMLAogICAgICAgICAgICBEaXNwbGF5RXJyb3JzCQkJPT4gJERpc3BsYXlFcnJvcnNTdHJnLAogICAgICAgICAgICB9CiAgICApOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKI3N1YiBfR2V0UG9zc2libGVWYWx1ZXMgewojICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiMKIyAgICBteSAkUG9zc2libGVWYWx1ZUNvbmZpZzsKIwojICAgICMgZ2V0IHBhcmFtZXRlcnMgZnJvbSB3ZWIgYnJvd3NlcgojICAgICMgZ2V0IFZhbHVlQ291bnRlcnMKIyAgICBteSAkVmFsdWVDb3VudGVyICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVmFsdWVDb3VudGVyJyApIHx8IDA7CiMgICAgbXkgJEVtcHR5VmFsdWVDb3VudGVyICAgICA9IDA7CiMgICAgbXkgJER1cGxpY2F0ZVZhbHVlQ291bnRlciA9IDA7CiMKIyAgICAjIGdldCBwb3NzaWJsZSB2YWx1ZXMKIyAgICBteSAkVmFsdWVzOwojICAgIFZBTFVFSU5ERVg6CiMgICAgZm9yIG15ICRWYWx1ZUluZGV4ICggMSAuLiAkVmFsdWVDb3VudGVyICkgewojICAgICAgICBteSAkS2V5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnS2V5JyAuICdfJyAuICRWYWx1ZUluZGV4ICk7CiMgICAgICAgICRLZXkgPSAoIGRlZmluZWQgJEtleSA/ICRLZXkgOiAnJyApOwojCiMgICAgICAgICMgY2hlY2sgaWYga2V5IHdhcyBkZWxldGVkIGJ5IHRoZSB1c2VyIGFuZCBza2lwIGl0CiMgICAgICAgIG5leHQgVkFMVUVJTkRFWCBpZiAkS2V5IGVxICRTZWxmLT57RGVsZXRlZFN0cmluZ307CiMKIyAgICAgICAgIyBjaGVjayBpZiB0aGUgb3JpZ2luYWwgdmFsdWUgaXMgZW1wdHkKIyAgICAgICAgaWYgKCAkS2V5IGVxICcnICkgewojCiMgICAgICAgICAgICAjIGNoYW5nZSB0aGUgZW1wdHkgdmFsdWUgdG8gYSBwcmVkZWZpbmVkIHN0cmluZwojICAgICAgICAgICAgJEtleSA9ICRTZWxmLT57RW1wdHlTdHJpbmd9IC4gaW50ICRFbXB0eVZhbHVlQ291bnRlcjsKIyAgICAgICAgICAgICRFbXB0eVZhbHVlQ291bnRlcisrOwojICAgICAgICB9CiMKIyAgICAgICAgIyBvdGhlcndpc2UgY2hlY2sgZm9yIGR1cGxpY2F0ZQojICAgICAgICBlbHNpZiAoIGV4aXN0cyAkUG9zc2libGVWYWx1ZUNvbmZpZy0+eyRLZXl9ICkgewojCiMgICAgICAgICAgICAjIGFwcGVuZCBhIHByZWRlZmluZWQgdW5pcXVlIHN0cmluZyB0byBtYWtlIHRoaXMgdmFsdWUgdW5pcXVlCiMgICAgICAgICAgICAkS2V5IC49ICctJyAuICRTZWxmLT57RHVwbGljYXRlU3RyaW5nfSAuICREdXBsaWNhdGVWYWx1ZUNvdW50ZXI7CiMgICAgICAgICAgICAkRHVwbGljYXRlVmFsdWVDb3VudGVyKys7CiMgICAgICAgIH0KIwojICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdWYWx1ZScgLiAnXycgLiAkVmFsdWVJbmRleCApOwojICAgICAgICAkVmFsdWUgPSAoIGRlZmluZWQgJFZhbHVlID8gJFZhbHVlIDogJycgKTsKIyAgICAgICAgJFBvc3NpYmxlVmFsdWVDb25maWctPnskS2V5fSA9ICRWYWx1ZTsKIyAgICB9CiMgICAgcmV0dXJuICRQb3NzaWJsZVZhbHVlQ29uZmlnOwojfQoKMTsK</File>
<File Location="Custom/Kernel/Modules/AdminDynamicFieldMultiselectFromDB.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluRHluYW1pY0ZpZWxkRHJvcGRvd24ucG0gLSBwcm92aWRlcyBhIGR5bmFtaWMgZmllbGRzIHRleHQgY29uZmlnIHZpZXcgZm9yIGFkbWlucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEyIFd1ZXJ0aFBob2VuaXggU1JMLCBodHRwOi8vd3d3Lnd1ZXJ0aHBob2VuaXguaXQvCiMgLS0KIyAkSWQ6IEFkbWluRHluYW1pY0ZpZWxkRHJvcGRvd25Gcm9tREIucG0sdiAxLjAwIDIwMTIvMDQvMTggMTk6Mzg6MDEgY3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkR5bmFtaWNGaWVsZE11bHRpc2VsZWN0RnJvbURCOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE1ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIGZvciAocXcoUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwoKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQtPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIGdldCBjb25maWd1cmVkIG9iamVjdCB0eXBlcwogICAgJFNlbGYtPntPYmplY3RUeXBlQ29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEeW5hbWljRmllbGRzOjpPYmplY3RUeXBlJyk7CgogICAgIyBnZXQgdGhlIGZpZWxkcyBjb25maWcKICAgICRTZWxmLT57RmllbGRUeXBlQ29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEeW5hbWljRmllbGRzOjpCYWNrZW5kJykgfHwge307CgogICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGhhbmRsaW5nIHN0cmluZ3MKICAgICRTZWxmLT57RW1wdHlTdHJpbmd9ICAgICA9ICdfRHluYW1pY0ZpZWxkc19FbXB0eVN0cmluZ19Eb250X1VzZV9JdF9TdHJpbmdfUGxlYXNlJzsKICAgICRTZWxmLT57RHVwbGljYXRlU3RyaW5nfSA9ICdfRHluYW1pY0ZpZWxkc19EdXBsaWNhdGVkU3RyaW5nX0RvbnRfVXNlX0l0X1N0cmluZ19QbGVhc2UnOwogICAgJFNlbGYtPntEZWxldGVkU3RyaW5nfSAgID0gJ19EeW5hbWljRmllbGRzX0RlbGV0ZWRTdHJpbmdfRG9udF9Vc2VfSXRfU3RyaW5nX1BsZWFzZSc7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fQWRkKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGRBY3Rpb24nICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+X0FkZEFjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlJyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9DaGFuZ2UoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZUFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5fQ2hhbmdlQWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgIE1lc3NhZ2UgPT4gIlVuZGVmaW5lZCBzdWJhY3Rpb24uIiwKICAgICk7Cn0KCnN1YiBfQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICROZWVkZWQgKHF3KE9iamVjdFR5cGUgRmllbGRUeXBlIEZpZWxkT3JkZXIpKSB7CiAgICAgICAgJEdldFBhcmFteyROZWVkZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkTmVlZGVkICk7CiAgICAgICAgaWYgKCAhJE5lZWRlZCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aGUgb2JqZWN0IHR5cGUgYW5kIGZpZWxkIHR5cGUgZGlzcGxheSBuYW1lCiAgICBteSAkT2JqZWN0VHlwZU5hbWUgPSAkU2VsZi0+e09iamVjdFR5cGVDb25maWd9LT57ICRHZXRQYXJhbXtPYmplY3RUeXBlfSB9LT57RGlzcGxheU5hbWV9IHx8ICcnOwogICAgbXkgJEZpZWxkVHlwZU5hbWUgID0gJFNlbGYtPntGaWVsZFR5cGVDb25maWd9LT57ICRHZXRQYXJhbXtGaWVsZFR5cGV9IH0tPntEaXNwbGF5TmFtZX0gICB8fCAnJzsKCiAgICByZXR1cm4gJFNlbGYtPl9TaG93U2NyZWVuKAogICAgICAgICVQYXJhbSwKICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgTW9kZSAgICAgICAgICAgPT4gJ0FkZCcsCiAgICAgICAgT2JqZWN0VHlwZU5hbWUgPT4gJE9iamVjdFR5cGVOYW1lLAogICAgICAgIEZpZWxkVHlwZU5hbWUgID0+ICRGaWVsZFR5cGVOYW1lLAogICAgKTsKfQoKc3ViIF9BZGRBY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRXJyb3JzOwogICAgbXkgJUdldFBhcmFtOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhOYW1lIExhYmVsIEZpZWxkT3JkZXIpKSB7CiAgICAgICAgJEdldFBhcmFteyROZWVkZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkTmVlZGVkICk7CiAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkRXJyb3JzeyAkTmVlZGVkIC4gJ1NlcnZlckVycm9yJyB9ICAgICAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRFcnJvcnN7ICROZWVkZWQgLiAnU2VydmVyRXJyb3JNZXNzYWdlJyB9ID0gJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQuJzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkR2V0UGFyYW17TmFtZX0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmFtZSBpcyBhbHBoYW51bWVyaWMKICAgICAgICBpZiAoICRHZXRQYXJhbXtOYW1lfSAhfiBte1xBICggPzogW2EtekEtWl0gfCBcZCApKyBcen14bXMgKSB7CgogICAgICAgICAgICAjIGFkZCBzZXJ2ZXIgZXJyb3IgZXJyb3IgY2xhc3MKICAgICAgICAgICAgJEVycm9yc3tOYW1lU2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJEVycm9yc3tOYW1lU2VydmVyRXJyb3JNZXNzYWdlfSA9CiAgICAgICAgICAgICAgICAnVGhlIGZpZWxkIGRvZXMgbm90IGNvbnRhaW4gb25seSBBU0NJSSBsZXR0ZXJzIGFuZCBudW1iZXJzLic7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIG5hbWUgaXMgZHVwbGljYXRlZAogICAgICAgIG15ICVEeW5hbWljRmllbGRzTGlzdCA9ICV7CiAgICAgICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkTGlzdCgKICAgICAgICAgICAgICAgIFZhbGlkICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFJlc3VsdFR5cGUgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB9OwoKICAgICAgICAlRHluYW1pY0ZpZWxkc0xpc3QgPSByZXZlcnNlICVEeW5hbWljRmllbGRzTGlzdDsKCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkc0xpc3R7ICRHZXRQYXJhbXtOYW1lfSB9ICkgewoKICAgICAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIGVycm9yIGNsYXNzCiAgICAgICAgICAgICRFcnJvcnN7TmFtZVNlcnZlckVycm9yfSAgICAgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3Jze05hbWVTZXJ2ZXJFcnJvck1lc3NhZ2V9ID0gJ1RoZXJlIGlzIGFub3RoZXIgZmllbGQgd2l0aCB0aGUgc2FtZSBuYW1lLic7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEdldFBhcmFte0ZpZWxkT3JkZXJ9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIG9yZGVyIGlzIG51bWVyaWMgYW5kIHBvc2l0aXZlCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RmllbGRPcmRlcn0gIX4gbXtcQSAoID86IFxkICkrIFx6fXhtcyApIHsKCiAgICAgICAgICAgICMgYWRkIHNlcnZlciBlcnJvciBlcnJvciBjbGFzcwogICAgICAgICAgICAkRXJyb3Jze0ZpZWxkT3JkZXJTZXJ2ZXJFcnJvcn0gICAgICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJEVycm9yc3tGaWVsZE9yZGVyU2VydmVyRXJyb3JNZXNzYWdlfSA9ICdUaGUgZmllbGQgbXVzdCBiZSBudW1lcmljLic7CiAgICAgICAgfQogICAgfQoKICAgIGZvciBteSAkQ29uZmlnUGFyYW0gKAogICAgICAgIHF3KAogICAgICAgIE9iamVjdFR5cGUgT2JqZWN0VHlwZU5hbWUgRmllbGRUeXBlIEZpZWxkVHlwZU5hbWUgRGVmYXVsdFZhbHVlIFBvc3NpYmxlTm9uZQogICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyBWYWxpZElEIExpbmsgUXVlcnkgUGFyYW1ldGVycyBEQklzdHJpbmcgREJJdXNlciBEQklwYXNzIFNlcGFyYXRvciBDYWNoZVRUTAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRDb25maWdQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRDb25maWdQYXJhbSApOwogICAgfQoKICAgICMgdW5jb3JyZWN0YWJsZSBlcnJvcnMKICAgIGlmICggISRHZXRQYXJhbXtWYWxpZElEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTmVlZCBWYWxpZElEIiwKICAgICAgICApOwogICAgfQoKICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRTZWxmLT5fR2V0UG9zc2libGVWYWx1ZXMoKTsKCiAgICAjIHJldHVybiB0byBhZGQgc2NyZWVuIGlmIGVycm9ycwogICAgaWYgKCVFcnJvcnMpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9TaG93U2NyZWVuKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVFcnJvcnMsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBNb2RlICAgICAgICAgICA9PiAnQWRkJywKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IHNwZWNpZmljIGNvbmZpZwogICAgbXkgJEZpZWxkQ29uZmlnID0gewojICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFBvc3NpYmxlVmFsdWVzLAogICAgICAgIERlZmF1bHRWYWx1ZSAgICAgICA9PiAkR2V0UGFyYW17RGVmYXVsdFZhbHVlfSwKICAgICAgICBQb3NzaWJsZU5vbmUgICAgICAgPT4gJEdldFBhcmFte1Bvc3NpYmxlTm9uZX0sCiAgICAgICAgVHJhbnNsYXRhYmxlVmFsdWVzID0+ICRHZXRQYXJhbXtUcmFuc2xhdGFibGVWYWx1ZXN9LAogICAgICAgIExpbmsgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17TGlua30sCiAgICAgICAgUXVlcnkJCSAgID0+ICRHZXRQYXJhbXtRdWVyeX0sCiAgICAgICAgUGFyYW1ldGVycwkgICA9PiAkR2V0UGFyYW17UGFyYW1ldGVyc30sCiAgICAgICAgREJJc3RyaW5nCSAgID0+ICRHZXRQYXJhbXtEQklzdHJpbmd9LAogICAgICAgIERCSXVzZXIJCSAgID0+ICRHZXRQYXJhbXtEQkl1c2VyfSwKICAgICAgICBEQklwYXNzCQkgICA9PiAkR2V0UGFyYW17REJJcGFzc30sCiAgICAgICAgU2VwYXJhdG9yCSAgID0+ICRHZXRQYXJhbXtTZXBhcmF0b3J9LAogICAgICAgIENhY2hlVFRMCSAgID0+ICRHZXRQYXJhbXtDYWNoZVRUTH0sCiAgICAgICAgRGlzcGxheUVycm9ycyAgPT4gJEdldFBhcmFte0Rpc3BsYXlFcnJvcnN9LAogICAgfTsKCiAgICAjIGNyZWF0ZSBhIG5ldyBmaWVsZAogICAgbXkgJEZpZWxkSUQgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZEFkZCgKICAgICAgICBOYW1lICAgICAgID0+ICRHZXRQYXJhbXtOYW1lfSwKICAgICAgICBMYWJlbCAgICAgID0+ICRHZXRQYXJhbXtMYWJlbH0sCiAgICAgICAgRmllbGRPcmRlciA9PiAkR2V0UGFyYW17RmllbGRPcmRlcn0sCiAgICAgICAgRmllbGRUeXBlICA9PiAkR2V0UGFyYW17RmllbGRUeXBlfSwKICAgICAgICBPYmplY3RUeXBlID0+ICRHZXRQYXJhbXtPYmplY3RUeXBlfSwKICAgICAgICBDb25maWcgICAgID0+ICRGaWVsZENvbmZpZywKICAgICAgICBWYWxpZElEICAgID0+ICRHZXRQYXJhbXtWYWxpZElEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJEZpZWxkSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCBjcmVhdGUgdGhlIG5ldyBmaWVsZCIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICBPUCA9PiAiQWN0aW9uPUFkbWluRHluYW1pY0ZpZWxkIiwKICAgICk7Cn0KCnN1YiBfQ2hhbmdlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICROZWVkZWQgKHF3KE9iamVjdFR5cGUgRmllbGRUeXBlKSkgewogICAgICAgICRHZXRQYXJhbXskTmVlZGVkfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJE5lZWRlZCApOwogICAgICAgIGlmICggISROZWVkZWQgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiTmVlZCAkTmVlZGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGhlIG9iamVjdCB0eXBlIGFuZCBmaWVsZCB0eXBlIGRpc3BsYXkgbmFtZQogICAgbXkgJE9iamVjdFR5cGVOYW1lID0gJFNlbGYtPntPYmplY3RUeXBlQ29uZmlnfS0+eyAkR2V0UGFyYW17T2JqZWN0VHlwZX0gfS0+e0Rpc3BsYXlOYW1lfSB8fCAnJzsKICAgIG15ICRGaWVsZFR5cGVOYW1lICA9ICRTZWxmLT57RmllbGRUeXBlQ29uZmlnfS0+eyAkR2V0UGFyYW17RmllbGRUeXBlfSB9LT57RGlzcGxheU5hbWV9ICAgfHwgJyc7CgogICAgbXkgJEZpZWxkSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKCiAgICBpZiAoICEkRmllbGRJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTmVlZCBJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGRhdGEKICAgIG15ICREeW5hbWljRmllbGREYXRhID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgSUQgPT4gJEZpZWxkSUQsCiAgICApOwoKICAgICMgY2hlY2sgZm9yIHZhbGlkIGR5bmFtaWMgZmllbGQgY29uZmlndXJhdGlvbgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZERhdGEpICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgZ2V0IGRhdGEgZm9yIGR5bmFtaWMgZmllbGQgJEZpZWxkSUQiLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJUNvbmZpZyA9ICgpOwoKICAgICMgZXh0cmFjdCBjb25maWd1cmF0aW9uCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30gKSApIHsKCiMgICAgICAgICMgc2V0IFBvc3NpYmxlVmFsdWVzCiMgICAgICAgICRDb25maWd7UG9zc2libGVWYWx1ZXN9ID0ge307CiMgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSApICkgewojICAgICAgICAgICAgJENvbmZpZ3tQb3NzaWJsZVZhbHVlc30gPSAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc307CiMgICAgICAgIH0KCiAgICAgICAgIyBzZXQgRGVmYXVsdFZhbHVlCiAgICAgICAgJENvbmZpZ3tEZWZhdWx0VmFsdWV9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57RGVmYXVsdFZhbHVlfTsKCiAgICAgICAgIyBzZXQgUG9zc2libGVOb25lCiAgICAgICAgJENvbmZpZ3tQb3NzaWJsZU5vbmV9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57UG9zc2libGVOb25lfTsKCiAgICAgICAgIyBzZXQgVHJhbnNsYXRhbGJlVmFsdWVzCiAgICAgICAgJENvbmZpZ3tUcmFuc2xhdGFibGVWYWx1ZXN9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfTsKCiAgICAgICAgIyBzZXQgTGluawogICAgICAgICRDb25maWd7TGlua30gPSAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30tPntMaW5rfTsKICAgICAgICAkQ29uZmlne1F1ZXJ5fSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e1F1ZXJ5fTsKICAgICAgICAkQ29uZmlne1BhcmFtZXRlcnN9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57UGFyYW1ldGVyc307CiAgICAgICAgJENvbmZpZ3tEQklzdHJpbmd9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57REJJc3RyaW5nfTsKICAgICAgICAkQ29uZmlne0RCSXVzZXJ9ID0gJER5bmFtaWNGaWVsZERhdGEtPntDb25maWd9LT57REJJdXNlcn07CiAgICAgICAgJENvbmZpZ3tEQklwYXNzfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e0RCSXBhc3N9OwogICAgICAgICRDb25maWd7U2VwYXJhdG9yfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e1NlcGFyYXRvcn07CiAgICAgICAgJENvbmZpZ3tDYWNoZVRUTH0gPSAkRHluYW1pY0ZpZWxkRGF0YS0+e0NvbmZpZ30tPntDYWNoZVRUTH07CiAgICAgICAgJENvbmZpZ3tEaXNwbGF5RXJyb3JzfSA9ICREeW5hbWljRmllbGREYXRhLT57Q29uZmlnfS0+e0Rpc3BsYXlFcnJvcnN9OwogICAgfQoKICAgIHJldHVybiAkU2VsZi0+X1Nob3dTY3JlZW4oCiAgICAgICAgJVBhcmFtLAogICAgICAgICVHZXRQYXJhbSwKICAgICAgICAlJHtEeW5hbWljRmllbGREYXRhfSwKICAgICAgICAlQ29uZmlnLAogICAgICAgIElEICAgICAgICAgICAgID0+ICRGaWVsZElELAogICAgICAgIE1vZGUgICAgICAgICAgID0+ICdDaGFuZ2UnLAogICAgICAgIE9iamVjdFR5cGVOYW1lID0+ICRPYmplY3RUeXBlTmFtZSwKICAgICAgICBGaWVsZFR5cGVOYW1lICA9PiAkRmllbGRUeXBlTmFtZSwKICAgICk7Cn0KCnN1YiBfQ2hhbmdlQWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUVycm9yczsKICAgIG15ICVHZXRQYXJhbTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoTmFtZSBMYWJlbCBGaWVsZE9yZGVyKSkgewogICAgICAgICRHZXRQYXJhbXskTmVlZGVkfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJE5lZWRlZCApOwogICAgICAgIGlmICggISRHZXRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEVycm9yc3sgJE5lZWRlZCAuICdTZXJ2ZXJFcnJvcicgfSAgICAgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3JzeyAkTmVlZGVkIC4gJ1NlcnZlckVycm9yTWVzc2FnZScgfSA9ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLic7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRGaWVsZElEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICk7CiAgICBpZiAoICEkRmllbGRJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTmVlZCBJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRHZXRQYXJhbXtOYW1lfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBuYW1lIGlzIGxvd2VyY2FzZQogICAgICAgIGlmICggJEdldFBhcmFte05hbWV9ICF+IG17XEEgKCA/OiBbYS16QS1aXSB8IFxkICkrIFx6fXhtcyApIHsKCiAgICAgICAgICAgICMgYWRkIHNlcnZlciBlcnJvciBlcnJvciBjbGFzcwogICAgICAgICAgICAkRXJyb3Jze05hbWVTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3Jze05hbWVTZXJ2ZXJFcnJvck1lc3NhZ2V9ID0KICAgICAgICAgICAgICAgICdUaGUgZmllbGQgZG9lcyBub3QgY29udGFpbiBvbmx5IEFTQ0lJIGxldHRlcnMgYW5kIG51bWJlcnMuJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgbmFtZSBpcyBkdXBsaWNhdGVkCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZHNMaXN0ID0gJXsKICAgICAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0KAogICAgICAgICAgICAgICAgVmFsaWQgICAgICA9PiAwLAogICAgICAgICAgICAgICAgUmVzdWx0VHlwZSA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIH07CgogICAgICAgICVEeW5hbWljRmllbGRzTGlzdCA9IHJldmVyc2UgJUR5bmFtaWNGaWVsZHNMaXN0OwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICREeW5hbWljRmllbGRzTGlzdHsgJEdldFBhcmFte05hbWV9IH0gJiYKICAgICAgICAgICAgJER5bmFtaWNGaWVsZHNMaXN0eyAkR2V0UGFyYW17TmFtZX0gfSBuZSAkRmllbGRJRAogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIGNsYXNzCiAgICAgICAgICAgICRFcnJvcnN7TmFtZVNlcnZlckVycm9yfSAgICAgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3Jze05hbWVTZXJ2ZXJFcnJvck1lc3NhZ2V9ID0gJ1RoZXJlIGlzIGFub3RoZXIgZmllbGQgd2l0aCB0aGUgc2FtZSBuYW1lLic7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEdldFBhcmFte0ZpZWxkT3JkZXJ9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIG9yZGVyIGlzIG51bWVyaWMgYW5kIHBvc2l0aXZlCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RmllbGRPcmRlcn0gIX4gbXtcQSAoID86IFxkICkrIFx6fXhtcyApIHsKCiAgICAgICAgICAgICMgYWRkIHNlcnZlciBlcnJvciBlcnJvciBjbGFzcwogICAgICAgICAgICAkRXJyb3Jze0ZpZWxkT3JkZXJTZXJ2ZXJFcnJvcn0gICAgICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJEVycm9yc3tGaWVsZE9yZGVyU2VydmVyRXJyb3JNZXNzYWdlfSA9ICdUaGUgZmllbGQgbXVzdCBiZSBudW1lcmljLic7CiAgICAgICAgfQogICAgfQoKICAgIGZvciBteSAkQ29uZmlnUGFyYW0gKAogICAgICAgIHF3KAogICAgICAgIE9iamVjdFR5cGUgT2JqZWN0VHlwZU5hbWUgRmllbGRUeXBlIEZpZWxkVHlwZU5hbWUgRGVmYXVsdFZhbHVlIFBvc3NpYmxlTm9uZQogICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyBWYWxpZElEIExpbmsgUXVlcnkgUGFyYW1ldGVycyBEQklzdHJpbmcgREJJdXNlciBEQklwYXNzIFNlcGFyYXRvciBDYWNoZVRUTAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRDb25maWdQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRDb25maWdQYXJhbSApOwogICAgfQoKICAgICMgdW5jb3JyZWN0YWJsZSBlcnJvcnMKICAgIGlmICggISRHZXRQYXJhbXtWYWxpZElEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTmVlZCBWYWxpZElEIiwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgZGF0YQogICAgbXkgJER5bmFtaWNGaWVsZERhdGEgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICBJRCA9PiAkRmllbGRJRCwKICAgICk7CgogICAgIyBjaGVjayBmb3IgdmFsaWQgZHluYW1pYyBmaWVsZCBjb25maWd1cmF0aW9uCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkRGF0YSkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCBnZXQgZGF0YSBmb3IgZHluYW1pYyBmaWVsZCAkRmllbGRJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkU2VsZi0+X0dldFBvc3NpYmxlVmFsdWVzKCk7CgogICAgIyByZXR1cm4gdG8gY2hhbmdlIHNjcmVlbiBpZiBlcnJvcnMKICAgIGlmICglRXJyb3JzKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd1NjcmVlbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgSUQgICAgICAgICAgICAgPT4gJEZpZWxkSUQsCiAgICAgICAgICAgIE1vZGUgICAgICAgICAgID0+ICdDaGFuZ2UnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgc3BlY2lmaWMgY29uZmlnCiAgICBteSAkRmllbGRDb25maWcgPSB7CiAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICBEZWZhdWx0VmFsdWUgICAgICAgPT4gJEdldFBhcmFte0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgUG9zc2libGVOb25lICAgICAgID0+ICRHZXRQYXJhbXtQb3NzaWJsZU5vbmV9LAogICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyA9PiAkR2V0UGFyYW17VHJhbnNsYXRhYmxlVmFsdWVzfSwKICAgICAgICBMaW5rICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0xpbmt9LAogICAgICAgIFF1ZXJ5CQkJCT0+ICRHZXRQYXJhbXtRdWVyeX0sCiAgICAgICAgUGFyYW1ldGVycwkJCT0+ICRHZXRQYXJhbXtQYXJhbWV0ZXJzfSwKICAgICAgICBEQklzdHJpbmcJCQk9PiAkR2V0UGFyYW17REJJc3RyaW5nfSwKICAgICAgICBEQkl1c2VyCQkJCT0+ICRHZXRQYXJhbXtEQkl1c2VyfSwKICAgICAgICBEQklwYXNzCQkJCT0+ICRHZXRQYXJhbXtEQklwYXNzfSwKICAgICAgICBTZXBhcmF0b3IJCQk9PiAkR2V0UGFyYW17U2VwYXJhdG9yfSwKICAgICAgICBDYWNoZVRUTAkJCT0+ICRHZXRQYXJhbXtDYWNoZVRUTH0sCiAgICAgICAgRGlzcGxheUVycm9ycwkJPT4gJEdldFBhcmFte0Rpc3BsYXlFcnJvcnN9LAogICAgfTsKCiAgICAjIHVwZGF0ZSBkeW5hbWljIGZpZWxkIChGaWVsZFR5cGUgYW5kIE9iamVjdFR5cGUgY2Fubm90IGJlIGNoYW5nZWQ7IHVzZSBvbGQgdmFsdWVzKQogICAgbXkgJFVwZGF0ZVN1Y2Nlc3MgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZFVwZGF0ZSgKICAgICAgICBJRCAgICAgICAgID0+ICRGaWVsZElELAogICAgICAgIE5hbWUgICAgICAgPT4gJEdldFBhcmFte05hbWV9LAogICAgICAgIExhYmVsICAgICAgPT4gJEdldFBhcmFte0xhYmVsfSwKICAgICAgICBGaWVsZE9yZGVyID0+ICRHZXRQYXJhbXtGaWVsZE9yZGVyfSwKICAgICAgICBGaWVsZFR5cGUgID0+ICREeW5hbWljRmllbGREYXRhLT57RmllbGRUeXBlfSwKICAgICAgICBPYmplY3RUeXBlID0+ICREeW5hbWljRmllbGREYXRhLT57T2JqZWN0VHlwZX0sCiAgICAgICAgQ29uZmlnICAgICA9PiAkRmllbGRDb25maWcsCiAgICAgICAgVmFsaWRJRCAgICA9PiAkR2V0UGFyYW17VmFsaWRJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRVcGRhdGVTdWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgdXBkYXRlIHRoZSBmaWVsZCAkR2V0UGFyYW17TmFtZX0iLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgT1AgPT4gIkFjdGlvbj1BZG1pbkR5bmFtaWNGaWVsZCIsCiAgICApOwp9CgpzdWIgX1Nob3dTY3JlZW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17RGlzcGxheUZpZWxkTmFtZX0gPSAnTmV3JzsKCiAgICBpZiAoICRQYXJhbXtNb2RlfSBlcSAnQ2hhbmdlJyApIHsKICAgICAgICAkUGFyYW17U2hvd1dhcm5pbmd9ICAgICAgPSAnU2hvd1dhcm5pbmcnOwogICAgICAgICRQYXJhbXtEaXNwbGF5RmllbGROYW1lfSA9ICRQYXJhbXtOYW1lfTsKICAgIH0KCiAgICAkUGFyYW17RGVsZXRlZFN0cmluZ30gPSAkU2VsZi0+e0RlbGV0ZWRTdHJpbmd9OwoKICAgICMgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZXQgYWxsIGZpZWxkcwogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2Ygb3JkZXIgbnVtYmVycyAoaXMgYWxyZWFkeSBzb3J0ZWQpLgogICAgbXkgQER5bmFtaWNmaWVsZE9yZGVyTGlzdDsKICAgIGZvciBteSAkRHluYW1pY2ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CiAgICAgICAgcHVzaCBARHluYW1pY2ZpZWxkT3JkZXJMaXN0LCAkRHluYW1pY2ZpZWxkLT57RmllbGRPcmRlcn07CiAgICB9CgogICAgIyB3aGVuIGFkZGluZyB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBleHRyYSBvcmRlciBudW1iZXIgZm9yIHRoZSBuZXcgZmllbGQKICAgIGlmICggJFBhcmFte01vZGV9IGVxICdBZGQnICkgewoKICAgICAgICAjIGdldCB0aGUgbGFzdCBlbGVtZW50IGZvcm0gdGhlIG9yZGVyIGxpc3QgYW5kIGFkZCAxCiAgICAgICAgbXkgJExhc3RPcmRlck51bWJlciA9ICREeW5hbWljZmllbGRPcmRlckxpc3RbLTFdOwogICAgICAgICRMYXN0T3JkZXJOdW1iZXIrKzsKCiAgICAgICAgIyBhZGQgdGhpcyBuZXcgb3JkZXIgbnVtYmVyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKICAgICAgICBwdXNoIEBEeW5hbWljZmllbGRPcmRlckxpc3QsICRMYXN0T3JkZXJOdW1iZXI7CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZE9yZGVyU3J0ZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcQER5bmFtaWNmaWVsZE9yZGVyTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdGaWVsZE9yZGVyJywKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRQYXJhbXtGaWVsZE9yZGVyfSB8fCAxLAogICAgICAgIFBvc3NpYmxlTm9uZSAgPT4gMCwKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdXNTBwYyBWYWxpZGF0ZV9OdW1iZXInLAogICAgKTsKCiAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICMgY3JlYXRlIHRoZSBWYWxpZGl0eSBzZWxlY3QKICAgIG15ICRWYWxpZGl0eVN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VmFsaWRJRH0gfHwgMSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1c1MHBjJywKICAgICk7CgogICAgIyBkZWZpbmUgYXMgMCB0byBnZXQgdGhlIHJlYWwgdmFsdWUgaW4gdGhlIEhUTUwKICAgIG15ICRWYWx1ZUNvdW50ZXIgPSAwOwoKICAgICMgc2V0IFBvc3NpYmxlVmFsdWVzCiAgICBteSAlUG9zc2libGVWYWx1ZXM7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17UG9zc2libGVWYWx1ZXN9ICkgKSB7CiAgICAgICAgJVBvc3NpYmxlVmFsdWVzID0gJXsgJFBhcmFte1Bvc3NpYmxlVmFsdWVzfSB9OwogICAgfQoKCiAgICAjIGNyZWF0ZSB0aGUgcG9zc2libGUgdmFsdWVzIHRlbXBsYXRlCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1ZhbHVlVGVtcGxhdGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAjS2VybmVsL1N5c3RlbS9UaWNrZXQvT1RSU1RpY2tldE1hc2tFeHRlbnNpb25zLnBtIApldmFsCnsKICByZXF1aXJlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6Ok9UUlNUaWNrZXRNYXNrRXh0ZW5zaW9uczsKfTsKCnVubGVzcyghICRAKQp7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RpY2tldE1hc2tFeHRlbnNpb25EaXNhYmxlZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCn0KIAojaWYgKCEgZXZhbCAidXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6Ok9UUlNUaWNrZXRNYXNrRXh0ZW5zaW9ucyIpIHsKI3VzZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpPVFJTVGlja2V0TWFza0V4dGVuc2lvbnM7CiN9CgoKICAgICMgY2hlY2sgYW5kIGJ1aWxkIHRoZSBEZWZhdWx0IFZhbHVlIGxpc3QgYmFzZWQgb24gUG9zc2libGUgVmFsdWVzCiMgICAgbXkgJURlZmF1bHRWYWx1ZXNMaXN0OwojICAgIFBPU1NJQkxFVkFMVUU6CiMgICAgZm9yIG15ICRWYWx1ZUl0ZW0gKCBrZXlzICVQb3NzaWJsZVZhbHVlcyApIHsKIyAgICAgICAgbmV4dCBQT1NTSUJMRVZBTFVFIGlmICFkZWZpbmVkICRWYWx1ZUl0ZW07CiMgICAgICAgIG5leHQgUE9TU0lCTEVWQUxVRSBpZiAhZGVmaW5lZCAkUG9zc2libGVWYWx1ZXN7JFZhbHVlSXRlbX07CiMgICAgICAgICREZWZhdWx0VmFsdWVzTGlzdHskVmFsdWVJdGVtfSA9ICRQb3NzaWJsZVZhbHVlc3skVmFsdWVJdGVtfQojICAgIH0KIwojICAgIG15ICREZWZhdWx0VmFsdWUgPSAoIGRlZmluZWQgJFBhcmFte0RlZmF1bHRWYWx1ZX0gPyAkUGFyYW17RGVmYXVsdFZhbHVlfSA6ICcnICk7CiMKIyAgICAjIGNyZWF0ZSB0aGUgZGVmYXVsdCB2YWx1ZSBzZWxlY3QKIyAgICBteSAkRGVmYXVsdFZhbHVlU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiMgICAgICAgIERhdGEgICAgICAgICA9PiBcJURlZmF1bHRWYWx1ZXNMaXN0LAojICAgICAgICBOYW1lICAgICAgICAgPT4gJ0RlZmF1bHRWYWx1ZScsCiMgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkRGVmYXVsdFZhbHVlLAojICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKIwojICAgICAgICAjIERvbid0IG1ha2UgaXMgdHJhbnNsYXRhYmxlIGJlY2F1c2UgdGhpcyB3aWxsIGNvbmZ1c2UgdGhlIHVzZXIgKGFsc28gY3VycmVudCBKUwojICAgICAgICAjIGlzIG5vdCBwcmVwYXJlZCkKIyAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKIwojICAgICAgICAjIE11bHRpcGxlIHNlbGVjdGlvbnMgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkCiMgICAgICAgIE11bHRpcGxlID0+IDAsCiMgICAgICAgIENsYXNzICAgID0+ICdXNTBwYycsCiMgICAgKTsKCiAgICBteSAkUG9zc2libGVOb25lID0gJFBhcmFte1Bvc3NpYmxlTm9uZX0gfHwgJzAnOwoKICAgICMgY3JlYXRlIHRyYW5zbGF0YWJsZSB2YWx1ZXMgb3B0aW9uIGxpc3QKICAgIG15ICRQb3NzaWJsZU5vbmVTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnUG9zc2libGVOb25lJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQb3NzaWJsZU5vbmUsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnVzUwcGMnLAogICAgKTsKCiAgICBteSAkVHJhbnNsYXRhYmxlVmFsdWVzID0gJFBhcmFte1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgJzAnOwoKICAgICMgY3JlYXRlIHRyYW5zbGF0YWJsZSB2YWx1ZXMgb3B0aW9uIGxpc3QKICAgIG15ICRUcmFuc2xhdGFibGVWYWx1ZXNTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVHJhbnNsYXRhYmxlVmFsdWVzJywKICAgICAgICBTZWxlY3RlZElEID0+ICRUcmFuc2xhdGFibGVWYWx1ZXMsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnVzUwcGMnLAogICAgKTsKCiAgICBteSAkRGlzcGxheUVycm9ycyA9ICRQYXJhbXtEaXNwbGF5RXJyb3JzfSB8fCAnMCc7CgogICAgIyBjcmVhdGUgdHJhbnNsYXRhYmxlIHZhbHVlcyBvcHRpb24gbGlzdAogICAgbXkgJERpc3BsYXlFcnJvcnNTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnRGlzcGxheUVycm9ycycsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkRGlzcGxheUVycm9ycywKICAgICAgICBDbGFzcyAgICAgID0+ICdXNTBwYycsCiAgICApOwoKICAgIG15ICRMaW5rID0gJFBhcmFte0xpbmt9IHx8ICcnOwogICAgbXkgJFF1ZXJ5ID0gJFBhcmFte1F1ZXJ5fSB8fCAnJzsKICAgIG15ICRQYXJhbWV0ZXJzID0gJFBhcmFte1BhcmFtZXRlcnN9IHx8ICcnOwogICAgbXkgJERCSXN0cmluZyA9ICRQYXJhbXtEQklzdHJpbmd9IHx8ICcnOwogICAgbXkgJERCSXVzZXIgPSAkUGFyYW17REJJdXNlcn0gfHwgJyc7CiAgICBteSAkREJJcGFzcyA9ICRQYXJhbXtEQklwYXNzfSB8fCAnJzsKICAgIG15ICRTZXBhcmF0b3IgPSAkUGFyYW17U2VwYXJhdG9yfSB8fCAnLCc7CiAgICBteSAkQ2FjaGVUVEwgPSAkUGFyYW17Q2FjaGVUVEx9IHx8ICczNjAnOwoKICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5EeW5hbWljRmllbGRNdWx0aXNlbGVjdEZyb21EQicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBWYWxpZGl0eVN0cmcgICAgICAgICAgID0+ICRWYWxpZGl0eVN0cmcsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZE9yZGVyU3J0ZyAgPT4gJER5bmFtaWNGaWVsZE9yZGVyU3J0ZywKIyAgICAgICAgICAgIFZhbHVlQ291bnRlciAgICAgICAgICAgPT4gJFZhbHVlQ291bnRlciwKIyAgICAgICAgICAgIERlZmF1bHRWYWx1ZVN0cmcgICAgICAgPT4gJERlZmF1bHRWYWx1ZVN0cmcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZVN0cmcgICAgICAgPT4gJFBvc3NpYmxlTm9uZVN0cmcsCiAgICAgICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlc1N0cmcgPT4gJFRyYW5zbGF0YWJsZVZhbHVlc1N0cmcsCiAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgPT4gJExpbmssCiAgICAgICAgICAgIFF1ZXJ5CQkJCT0+ICRRdWVyeSwKICAgICAgICAgICAgUGFyYW1ldGVycwkJCT0+ICRQYXJhbWV0ZXJzLAogICAgICAgICAgICBEQklzdHJpbmcJCQk9PiAkREJJc3RyaW5nLAogICAgICAgICAgICBEQkl1c2VyCQkJCT0+ICREQkl1c2VyLAogICAgICAgICAgICBEQklwYXNzCQkJCT0+ICREQklwYXNzLAogICAgICAgICAgICBTZXBhcmF0b3IJCQk9PiAkU2VwYXJhdG9yLAogICAgICAgICAgICBDYWNoZVRUTAkJCT0+ICRDYWNoZVRUTCwKICAgICAgICAgICAgRGlzcGxheUVycm9ycwkJPT4gJENhY2hlVFRMLAogICAgICAgICAgICB9CiAgICApOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9HZXRQb3NzaWJsZVZhbHVlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwojCiAgICBteSAkUG9zc2libGVWYWx1ZUNvbmZpZzsKIwojICAgICMgZ2V0IHBhcmFtZXRlcnMgZnJvbSB3ZWIgYnJvd3NlcgojICAgICMgZ2V0IFZhbHVlQ291bnRlcnMKIyAgICBteSAkVmFsdWVDb3VudGVyICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVmFsdWVDb3VudGVyJyApIHx8IDA7CiMgICAgbXkgJEVtcHR5VmFsdWVDb3VudGVyICAgICA9IDA7CiMgICAgbXkgJER1cGxpY2F0ZVZhbHVlQ291bnRlciA9IDA7CiMKIyAgICAjIGdldCBwb3NzaWJsZSB2YWx1ZXMKIyAgICBteSAkVmFsdWVzOwojICAgIFZBTFVFSU5ERVg6CiMgICAgZm9yIG15ICRWYWx1ZUluZGV4ICggMSAuLiAkVmFsdWVDb3VudGVyICkgewojICAgICAgICBteSAkS2V5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnS2V5JyAuICdfJyAuICRWYWx1ZUluZGV4ICk7CiMgICAgICAgICRLZXkgPSAoIGRlZmluZWQgJEtleSA/ICRLZXkgOiAnJyApOwojCiMgICAgICAgICMgY2hlY2sgaWYga2V5IHdhcyBkZWxldGVkIGJ5IHRoZSB1c2VyIGFuZCBza2lwIGl0CiMgICAgICAgIG5leHQgVkFMVUVJTkRFWCBpZiAkS2V5IGVxICRTZWxmLT57RGVsZXRlZFN0cmluZ307CiMKIyAgICAgICAgIyBjaGVjayBpZiB0aGUgb3JpZ2luYWwgdmFsdWUgaXMgZW1wdHkKIyAgICAgICAgaWYgKCAkS2V5IGVxICcnICkgewojCiMgICAgICAgICAgICAjIGNoYW5nZSB0aGUgZW1wdHkgdmFsdWUgdG8gYSBwcmVkZWZpbmVkIHN0cmluZwojICAgICAgICAgICAgJEtleSA9ICRTZWxmLT57RW1wdHlTdHJpbmd9IC4gaW50ICRFbXB0eVZhbHVlQ291bnRlcjsKIyAgICAgICAgICAgICRFbXB0eVZhbHVlQ291bnRlcisrOwojICAgICAgICB9CiMKIyAgICAgICAgIyBvdGhlcndpc2UgY2hlY2sgZm9yIGR1cGxpY2F0ZQojICAgICAgICBlbHNpZiAoIGV4aXN0cyAkUG9zc2libGVWYWx1ZUNvbmZpZy0+eyRLZXl9ICkgewojCiMgICAgICAgICAgICAjIGFwcGVuZCBhIHByZWRlZmluZWQgdW5pcXVlIHN0cmluZyB0byBtYWtlIHRoaXMgdmFsdWUgdW5pcXVlCiMgICAgICAgICAgICAkS2V5IC49ICctJyAuICRTZWxmLT57RHVwbGljYXRlU3RyaW5nfSAuICREdXBsaWNhdGVWYWx1ZUNvdW50ZXI7CiMgICAgICAgICAgICAkRHVwbGljYXRlVmFsdWVDb3VudGVyKys7CiMgICAgICAgIH0KIwojICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdWYWx1ZScgLiAnXycgLiAkVmFsdWVJbmRleCApOwojICAgICAgICAkVmFsdWUgPSAoIGRlZmluZWQgJFZhbHVlID8gJFZhbHVlIDogJycgKTsKIyAgICAgICAgJFBvc3NpYmxlVmFsdWVDb25maWctPnskS2V5fSA9ICRWYWx1ZTsKIyAgICB9CgojICAgICRQb3NzaWJsZVZhbHVlQ29uZmlnLT57J2R1bW15a2V5J30gPSAnZHVtbXl2YWx1ZSc7CgogICAgcmV0dXJuICRQb3NzaWJsZVZhbHVlQ29uZmlnOwp9CgoxOwo=</File>
<File Location="Custom/Kernel/System/DynamicField/Backend/DropdownFromDB.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vRHluYW1pY0ZpZWxkL0JhY2tlbmQvRHJvcGRvd24ucG0gLSBEZWxlZ2F0ZSBmb3IgRHluYW1pY0ZpZWxkIERyb3Bkb3duIGJhY2tlbmQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMiBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERyb3Bkb3duLnBtLHYgMS42MyAyMDEyLzA0LzAyIDExOjQ2OjM1IG1nIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQ6OkRyb3Bkb3duRnJvbURCOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgREJJOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZFZhbHVlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDo6QmFja2VuZENvbW1vbjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDYWNoZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7CiN1c2UgS2VybmVsOjpTeXN0ZW06OkNhY2hlSW50ZXJuYWw7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYzICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kOjpEcm9wZG93bgoKPWhlYWQxIFNZTk9QU0lTCgpEeW5hbWljRmllbGRzIERyb3Bkb3duIGJhY2tlbmQgZGVsZWdhdGUKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgpUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIG9mIEw8S2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZD4uClBsZWFzZSBsb29rIHRoZXJlIGZvciBhIGRldGFpbGVkIHJlZmVyZW5jZSBvZiB0aGUgZnVuY3Rpb25zLgoKPW92ZXIgNAoKPWl0ZW0gbmV3KCkKCnVzdWFsbHksIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzCmJ5IHVzaW5nIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQtPm5ldygpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QpKSB7CiAgICAgICAgZGllICJHb3Qgbm8gJE5lZWRlZCEiIGlmICEkUGFyYW17JE5lZWRlZH07CgogICAgICAgICRTZWxmLT57JE5lZWRlZH0gPSAkUGFyYW17JE5lZWRlZH07CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZFZhbHVlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntCYWNrZW5kQ29tbW9uT2JqZWN0fQogICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDo6QmFja2VuZENvbW1vbi0+bmV3KCAleyRTZWxmfSApOwoKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkNhY2hlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57REJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBWYWx1ZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRERlZhbHVlID0gJFNlbGYtPntEeW5hbWljRmllbGRWYWx1ZU9iamVjdH0tPlZhbHVlR2V0KAogICAgICAgIEZpZWxkSUQgID0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57SUR9LAogICAgICAgIE9iamVjdElEID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJERGVmFsdWU7CiAgICByZXR1cm4gaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkREZWYWx1ZSk7CiAgICByZXR1cm4gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkREZWYWx1ZS0+WzBdICk7CgogICAgcmV0dXJuICRERlZhbHVlLT5bMF0tPntWYWx1ZVRleHR9Owp9CgpzdWIgVmFsdWVTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiMgICAgIyBjaGVjayBmb3IgdmFsaWQgcG9zc2libGUgdmFsdWVzIGxpc3QKIyAgICBpZiAoICEkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30gKSB7CiMgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAojICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKIyAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFBvc3NpYmxlVmFsdWVzIGluIER5bmFtaWNGaWVsZENvbmZpZyEiLAojICAgICAgICApOwojICAgICAgICByZXR1cm47CiMgICAgfQoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntEeW5hbWljRmllbGRWYWx1ZU9iamVjdH0tPlZhbHVlU2V0KAogICAgICAgIEZpZWxkSUQgID0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57SUR9LAogICAgICAgIE9iamVjdElEID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgVmFsdWUgICAgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZVRleHQgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRTdWNjZXNzOwp9CgpzdWIgVmFsdWVEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkVmFsdWVPYmplY3R9LT5WYWx1ZURlbGV0ZSgKICAgICAgICBGaWVsZElEICA9PiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0lEfSwKICAgICAgICBPYmplY3RJRCA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCnN1YiBBbGxWYWx1ZXNEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkVmFsdWVPYmplY3R9LT5BbGxWYWx1ZXNEZWxldGUoCiAgICAgICAgRmllbGRJRCA9PiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0lEfSwKICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCnN1YiBWYWx1ZVZhbGlkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZFZhbHVlT2JqZWN0fS0+VmFsdWVWYWxpZGF0ZSgKICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgIFZhbHVlVGV4dCA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9CiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKc3ViIFNlYXJjaFNRTEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVPcGVyYXRvcnMgPSAoCiAgICAgICAgRXF1YWxzICAgICAgICAgICAgPT4gJz0nLAogICAgICAgIEdyZWF0ZXJUaGFuICAgICAgID0+ICc+JywKICAgICAgICBHcmVhdGVyVGhhbkVxdWFscyA9PiAnPj0nLAogICAgICAgIFNtYWxsZXJUaGFuICAgICAgID0+ICc8JywKICAgICAgICBTbWFsbGVyVGhhbkVxdWFscyA9PiAnPD0nLAogICAgKTsKCiAgICBpZiAoICRPcGVyYXRvcnN7ICRQYXJhbXtPcGVyYXRvcn0gfSApIHsKICAgICAgICBteSAkU1FMID0gIiAkUGFyYW17VGFibGVBbGlhc30udmFsdWVfdGV4dCAkT3BlcmF0b3JzeyRQYXJhbXtPcGVyYXRvcn19ICciOwogICAgICAgICRTUUwgLj0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17U2VhcmNoVGVybX0gKSAuICInICI7CiAgICAgICAgcmV0dXJuICRTUUw7CiAgICB9CgogICAgaWYgKCAkUGFyYW17T3BlcmF0b3J9IGVxICdMaWtlJyApIHsKCiAgICAgICAgbXkgJFNRTCA9ICRTZWxmLT57REJPYmplY3R9LT5RdWVyeUNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgPT4gIiRQYXJhbXtUYWJsZUFsaWFzfS52YWx1ZV90ZXh0IiwKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1NlYXJjaFRlcm19LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU1FMOwogICAgfQoKICAgICRTZWxmLT57J0xvZ09iamVjdCd9LT5Mb2coCiAgICAgICAgJ1ByaW9yaXR5JyA9PiAnZXJyb3InLAogICAgICAgICdNZXNzYWdlJyAgPT4gIlVuc3VwcG9ydGVkIE9wZXJhdG9yICRQYXJhbXtPcGVyYXRvcn0iLAogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBTZWFyY2hTUUxPcmRlckZpZWxkR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICIkUGFyYW17VGFibGVBbGlhc30udmFsdWVfdGV4dCI7Cn0KCnN1YiBFZGl0RmllbGRSZW5kZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRha2UgY29uZmlnIGZyb20gZmllbGQgY29uZmlnCiAgICBteSAkRmllbGRDb25maWcgPSAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ307CiAgICBteSAkRmllbGROYW1lICAgPSAnRHluYW1pY0ZpZWxkXycgLiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e05hbWV9OwogICAgbXkgJEZpZWxkTGFiZWwgID0gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntMYWJlbH07CgogICAgbXkgJFZhbHVlID0gJyc7CgogICAgIyBzZXQgdGhlIGZpZWxkIHZhbHVlIG9yIGRlZmF1bHQKICAgIGlmICggJFBhcmFte1VzZURlZmF1bHRWYWx1ZX0gKSB7CiAgICAgICAgJFZhbHVlID0gKCBkZWZpbmVkICRGaWVsZENvbmZpZy0+e0RlZmF1bHRWYWx1ZX0gPyAkRmllbGRDb25maWctPntEZWZhdWx0VmFsdWV9IDogJycgKTsKICAgIH0KICAgICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX0gaWYgZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3JtIHRoZSB3ZWIgcmVxdWVzdAogICAgbXkgJEZpZWxkVmFsdWUgPSAkU2VsZi0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICAjIHNldCB2YWx1ZXMgZnJvbSBQYXJhbU9iamVjdCBpZiBwcmVzZW50CiAgICBpZiAoIGRlZmluZWQgJEZpZWxkVmFsdWUgKSB7CiAgICAgICAgJFZhbHVlID0gJEZpZWxkVmFsdWU7CiAgICB9CiAgICAjIGNoZWNrIGFuZCBzZXQgY2xhc3MgaWYgbmVjZXNzYXJ5CiAgICBteSAkRmllbGRDbGFzcyA9ICdEeW5hbWljRmllbGRUZXh0JzsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17Q2xhc3N9ICYmICRQYXJhbXtDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJEZpZWxkQ2xhc3MgLj0gJyAnIC4gJFBhcmFte0NsYXNzfTsKICAgIH0KICAgICRGaWVsZENsYXNzIC49ICcgRnJvbURCJzsKCiAgICAjIHNldCBmaWVsZCBhcyBtYW5kYXRvcnkKICAgICRGaWVsZENsYXNzIC49ICcgVmFsaWRhdGVfUmVxdWlyZWQnIGlmICRQYXJhbXtNYW5kYXRvcnl9OwoKICAgICMgc2V0IGVycm9yIGNzcyBjbGFzcwogICAgJEZpZWxkQ2xhc3MgLj0gJyBTZXJ2ZXJFcnJvcicgaWYgJFBhcmFte1NlcnZlckVycm9yfTsKCiAgICAjIHNldCBQb3NzaWJsZVZhbHVlcwogICAgbXkgJFNlbGVjdGlvbkRhdGEgPSAkRmllbGRDb25maWctPntQb3NzaWJsZVZhbHVlc307CgogICAgIyMjIEZPVEggcHJlbG9hZCBkYXRhIGF0IGNyZWF0aW9uCiAgICAkU2VsZWN0aW9uRGF0YSA9ICRTZWxmLT5BSkFYUG9zc2libGVWYWx1ZXNHZXQoJVBhcmFtLCBGb3JjZVF1ZXJ5ID0+IDEpOwogICAgIyMjIEVORCBGT1RICgogICAgIyB1c2UgUG9zc2libGVWYWx1ZXNGaWx0ZXIgaWYgZGVmaW5lZAogICAgJFNlbGVjdGlvbkRhdGEgPSAkUGFyYW17UG9zc2libGVWYWx1ZXNGaWx0ZXJ9CiAgICAgICAgaWYgZGVmaW5lZCAkUGFyYW17UG9zc2libGVWYWx1ZXNGaWx0ZXJ9OwoKICAgICMgc2V0IFBvc3NpYmxlTm9uZSBhdHRyaWJ1dGUKICAgIG15ICRGaWVsZFBvc3NpYmxlTm9uZTsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17T3ZlcnJpZGVQb3NzaWJsZU5vbmV9ICkgewogICAgICAgICRGaWVsZFBvc3NpYmxlTm9uZSA9ICRQYXJhbXtPdmVycmlkZVBvc3NpYmxlTm9uZX07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRmllbGRQb3NzaWJsZU5vbmUgPSAkRmllbGRDb25maWctPntQb3NzaWJsZU5vbmV9IHx8IDA7CiAgICB9CgogICAgbXkgJEhUTUxTdHJpbmcgPSAkUGFyYW17TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiAkU2VsZWN0aW9uRGF0YSB8fCB7fSwKICAgICAgICBOYW1lID0+ICRGaWVsZE5hbWUsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRWYWx1ZSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gJEZpZWxkQ29uZmlnLT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLCAjIHdlIGRvIG5vdCBuZWVkIHRvIHNldCBwb3NzaWJsZU5vbmUgdmFsdWUgYmVjYXVzZSB3ZSBkbyBpdCBhbHJlYWR5IGluIHRoZSBBSkFYUG9zc2liaWJsZVZhbHVlc0dldAogICAgICAgIENsYXNzICAgICAgICA9PiAkRmllbGRDbGFzcywKICAgICAgICBIVE1MUXVvdGUgICAgPT4gMSwKICAgICk7CiAgICAKICAgIGlmICgkRmllbGRDb25maWctPntEaXNwbGF5RXJyb3JzfSkgewogICAgCW15ICREaXZJRCA9ICRGaWVsZE5hbWUgLiAnV2FybmluZyc7CiAgICAJCiAgICAJIyBmb3IgY2xpZW50IHNpZGUgdmFsaWRhdGlvbgogICAgICAgICRIVE1MU3RyaW5nIC49IDw8IkVPRiI7CiAgICA8ZGl2IHN0eWxlPSJjb2xvcjpyZWQiPlwkVGV4dHsiW0RlYnVnIG1vZGVdIn08L2Rpdj4KRU9GCiAgICB9ICAgIAoKICAgIGlmICggJFBhcmFte01hbmRhdG9yeX0gKSB7CiAgICAgICAgbXkgJERpdklEID0gJEZpZWxkTmFtZSAuICdFcnJvcic7CgogICAgICAgICMgZm9yIGNsaWVudCBzaWRlIHZhbGlkYXRpb24KICAgICAgICAkSFRNTFN0cmluZyAuPSA8PCJFT0YiOwoKICAgIDxkaXYgaWQ9IiREaXZJRCIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgIDxwPgogICAgICAgICAgICBcJFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn0KICAgICAgICA8L3A+CiAgICA8L2Rpdj4KRU9GCiAgICB9CgogICAgaWYgKCAkUGFyYW17U2VydmVyRXJyb3J9ICkgewoKICAgICAgICBteSAkRXJyb3JNZXNzYWdlID0gJFBhcmFte0Vycm9yTWVzc2FnZX0gfHwgJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQuJzsKICAgICAgICBteSAkRGl2SUQgPSAkRmllbGROYW1lIC4gJ1NlcnZlckVycm9yJzsKCiAgICAgICAgIyBmb3Igc2VydmVyIHNpZGUgdmFsaWRhdGlvbgogICAgICAgICRIVE1MU3RyaW5nIC49IDw8IkVPRiI7CiAgICA8ZGl2IGlkPSIkRGl2SUQiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICA8cD4KICAgICAgICAgICAgXCRUZXh0eyIkRXJyb3JNZXNzYWdlIn0KICAgICAgICA8L3A+CiAgICA8L2Rpdj4KRU9GCiAgICB9CgogICAgaWYgKCAkUGFyYW17QUpBWFVwZGF0ZX0gb3IgMSApIHsKCiAgICAgICAgbXkgJEZpZWxkU2VsZWN0b3IgPSAnIycgLiAkRmllbGROYW1lOwoKICAgICAgICBteSAkRmllbGRzVG9VcGRhdGUgPSAnJzsKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte1VwZGF0YWJsZUZpZWxkc30gKSApIHsKICAgICAgICAgICAgbXkgJEZpcnN0SXRlbSA9IDE7CiAgICAgICAgICAgIEZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggQHsgJFBhcmFte1VwZGF0YWJsZUZpZWxkc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICRGaWVsZE5hbWU7CiAgICAgICAgICAgICAgICBpZiAoJEZpcnN0SXRlbSkgewogICAgICAgICAgICAgICAgICAgICRGaXJzdEl0ZW0gPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEZpZWxkc1RvVXBkYXRlIC49ICcsICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRmllbGRzVG9VcGRhdGUgLj0gIiciIC4gJEZpZWxkIC4gIiciOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjYWRkIGpzIHRvIGNhbGwgRm9ybVVwZGF0ZSgpCiAgICAgICAgJEhUTUxTdHJpbmcgLj0gPDwiRU9GIjsKPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIFwkKCckRmllbGRTZWxlY3RvcicpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKFwkKHRoaXMpLnBhcmVudHMoJ2Zvcm0nKSwgJ0FKQVhVcGRhdGUnLCAnJEZpZWxkTmFtZScsIFsgJEZpZWxkc1RvVXBkYXRlIF0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KRU9GCiAgICB9CgoKICAgIGlmICggJFBhcmFte1N1Ym1pdE9uQ2hhbmdlfSApIHsKCiAgICAgICAgbXkgJEZpZWxkU2VsZWN0b3IgPSAnIycgLiAkRmllbGROYW1lOwoKICAgICAgICAjYWRkIGpzIHRvIGRpc2FibGUgdmFsaWRhdGlvbiBhbmQgZG8gc3VibWl0KCkKICAgICAgICAkSFRNTFN0cmluZyAuPSA8PCJFT0YiOwo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgXCQoJyRGaWVsZFNlbGVjdG9yJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSB0aWNrZXQgaXMgbm90IHlldCBjcmVhdGVkIG9uIHF1ZXVlIGNoYW5nZQogICAgICAgIFwkKCdpbnB1dCNFeHBhbmQnKS52YWwoMSk7CiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKFwkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKSk7CiAgICAgICAgXCQodGhpcykuY2xvc2VzdCgnZm9ybScpLnN1Ym1pdCgpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KRU9GCiAgICB9CgojCS9EeW5hbWljRmllbGRDb25maWcKIwkkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30gPSAkU2VsZi0+QUpBWFBvc3NpYmxlVmFsdWVzR2V0KCVQYXJhbSk7CgogICAgIyBjYWxsIEVkaXRMYWJlbFJlbmRlciBvbiB0aGUgY29tbW9uIGJhY2tlbmQKICAgIG15ICRMYWJlbFN0cmluZyA9ICRTZWxmLT57QmFja2VuZENvbW1vbk9iamVjdH0tPkVkaXRMYWJlbFJlbmRlcigKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30sCiAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRQYXJhbXtNYW5kYXRvcnl9IHx8ICcwJywKICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgPT4gJEZpZWxkTmFtZSwKICAgICk7CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgRmllbGQgPT4gJEhUTUxTdHJpbmcsCiAgICAgICAgTGFiZWwgPT4gJExhYmVsU3RyaW5nLAogICAgfTsKCgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgRWRpdEZpZWxkVmFsdWVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRmllbGROYW1lID0gJ0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfTsKCiAgICBteSAkVmFsdWU7CgogICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhIFRlbXBsYXRlIGFuZCByZXRyZWl2ZSB0aGUgZGluYWxpYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZXJlCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGVtcGxhdGV9ICkgKSB7CiAgICAgICAgJFZhbHVlID0gJFBhcmFte1RlbXBsYXRlfS0+eyRGaWVsZE5hbWV9OwogICAgfQoKICAgICMgb3RoZXJ3aXNlIGdldCBkeW5hbWljIGZpZWxkIHZhbHVlIGZvcm0gcGFyYW0KICAgIGVsc2UgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkRmllbGROYW1lICk7CiAgICB9CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtSZXR1cm5UZW1wbGF0ZVN0cnVjdHVyZX0gJiYgJFBhcmFte1JldHVyblRlbXBsYXRlU3RydWN0dXJlfSBlcSAxICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICRGaWVsZE5hbWUgPT4gJFZhbHVlLAogICAgICAgIH07CiAgICB9CgogICAgIyBmb3IgdGhpcyBmaWVsZCB0aGUgbm9ybWFsIHJldHVybiBhbiB0aGUgUmV0dXJuVmFsdWVTdHJ1Y3R1cmUgYXJlIHRoZSBzYW1lCiAgICByZXR1cm4gJFZhbHVlOwp9CgpzdWIgRWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRoZSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBodHRwIHJlcXVlc3QKICAgIG15ICRWYWx1ZSA9ICRTZWxmLT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30sCiAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbXtQYXJhbU9iamVjdH0sCgogICAgICAgICMgbm90IG5lY2Vzc2FyeSBmb3IgdGhpcyBiYWNrZW5kIGJ1dCBwbGFjZSBpdCBmb3IgY29uc2lzdGVuY3kgcmVhc29ucwogICAgICAgIFJldHVyblZhbHVlU3RydWN0dXJlID0+IDEsCiAgICApOwoKICAgIG15ICRTZXJ2ZXJFcnJvcjsKICAgIG15ICRFcnJvck1lc3NhZ2U7CgogICAgIyBwZXJmb3JtIG5lY2Vzc2FyeSB2YWxpZGF0aW9ucwogICAgaWYgKCAkUGFyYW17TWFuZGF0b3J5fSAmJiAhJFZhbHVlICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFNlcnZlckVycm9yID0+IDEsCiAgICAgICAgfTsKICAgIH0KIyAgICBlbHNlIHsKIwojICAgICAgICAjIGdldCBwb3NzaWJsZSB2YWx1ZXMgbGlzdAojICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc307CiMKIyAgICAgICAgIyBvdmVyd3JpdGUgcG9zc2libGUgdmFsdWVzIGlmIFBvc3NpYmxlVmFsdWVzRmlsdGVyCiMgICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17UG9zc2libGVWYWx1ZXNGaWx0ZXJ9ICkgewojICAgICAgICAgICAgJFBvc3NpYmxlVmFsdWVzID0gJFBhcmFte1Bvc3NpYmxlVmFsdWVzRmlsdGVyfQojICAgICAgICB9CiMKIyAgICAgICAgIyB2YWxpZGF0ZSBpZiB2YWx1ZSBpcyBpbiBwb3NzaWJsZSB2YWx1ZXMgbGlzdCAoYnV0IGxldCBwYXNzIGVtcHR5IHZhbHVlcykKIyAgICAgICAgaWYgKCAkVmFsdWUgJiYgISRQb3NzaWJsZVZhbHVlcy0+eyRWYWx1ZX0gKSB7CiMgICAgICAgICAgICAkU2VydmVyRXJyb3IgID0gMTsKIyAgICAgICAgICAgICRFcnJvck1lc3NhZ2UgPSAnVGhlIGZpZWxkIGNvbnRlbnQgaXMgaW52YWxpZCc7CiMgICAgICAgIH0KIyAgICB9CgogICAgIyBWYWxpZGF0ZSBhbnl0aGluZyAoZm9yIG5vdykKICAgIG15ICRSZXN1bHQgPSB7CiAgICAgICAgU2VydmVyRXJyb3IgID0+ICRTZXJ2ZXJFcnJvciwKICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJEVycm9yTWVzc2FnZSwKICAgIH07CgogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCnN1YiBEaXNwbGF5VmFsdWVSZW5kZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtIVE1MT3V0cHV0fSApIHsKICAgICAgICAkUGFyYW17SFRNTE91dHB1dH0gPSAxOwogICAgfQoKICAgICMgZ2V0IHJhdyBWYWx1ZSBzdHJpbmdzIGZyb20gZmllbGQgdmFsdWUKICAgIG15ICRWYWx1ZSA9IGRlZmluZWQgJFBhcmFte1ZhbHVlfSA/ICRQYXJhbXtWYWx1ZX0gOiAnJzsKICAgIG15ICRLZXkgPSAkVmFsdWU7CgoKICAgICMgZ2V0IHZhbHVlIGZyb20gc3RvcmVkIHZhbHVlIGluIHRoZSBEQiBpZiBvcHRpb24gaXMgc2V0CiAgICBpZiAoJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57U3RvcmVWYWx1ZX0gZXEgIjEiKSB7CiAgICAgICAgJFZhbHVlID1+IHMvXihbXnxdKylcfFx8KC4rKSQvJDIvOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJVBvc3NpYmxlVmFsdWVzOwogICAgIwlUeXBlID0+ICdIYXNoJywKICAgICMJS2V5ID0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e05hbWV9LAogICAgIyAgICApOwogICAgCiAgICAjICAgIGlmICggIWRlZmluZWQgJVBvc3NpYmxlVmFsdWVzICkgewogICAgICAgIG15IEByb3c7CiAgICAgICAgbXkgJGRiaDsKICAgICAgICBteSAkc3RoOwoKICAgICAgICBpZiAoICEkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntEQklzdHJpbmd9ICkgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCA9PiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntWaXN1YWxRdWVyeX0sCiAgICAgICAgCQlCaW5kID0+ICRLZXksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjZmV0Y2ggZmlyc3Qgcm93CiAgICAgICAgICAgIEByb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkZGJoID0gREJJLT5jb25uZWN0KCRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e0RCSXN0cmluZ30sICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e0RCSXVzZXJ9LCAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntEQklwYXNzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBQcmludEVycm9yID0+IDAsIEF1dG9Db21taXQgPT4gMCwgSGFuZGxlRXJyb3IgPT4gXCZQb3NzaWJsZVZhbHVlc0Vycm9yIH0pIG9yIHJldHVybiAkU2VsZi0+UG9zc2libGVWYWx1ZXNFcnJvcigiY291bGQgbm90IGNvbm5lY3QgdG8gREI6ICREQkk6OmVycnN0ciIpOwogICAgICAgIAogICAgICAgICAgICAkZGJoLT57J215c3FsX2VuYWJsZV91dGY4J30gPSAxOwogICAgCiAgICAgICAgICAgICRzdGggPSAkZGJoLT5wcmVwYXJlKCRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1Zpc3VhbFF1ZXJ5fSk7CiAgICAgICAgICAgICRzdGgtPmV4ZWN1dGUoICRLZXkgKTsKICAgIAogICAgICAgICAgICAjIGZldGNoIGZpcnN0IHJvdwogICAgICAgICAgICBAcm93ID0gJHN0aC0+ZmV0Y2hyb3dfYXJyYXk7ICAgICAgICAKICAgICAgICB9CiAgICAKICAgIAlteSAkbGluZSA9ICcnOwogICAgCWZvciBteSAkY29sIChAcm93KSB7CiAgICAJICAgICRsaW5lIC49ICRjb2wuJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57U2VwYXJhdG9yfTsKICAgIAl9CiAgICAJJGxpbmUgPSBzdWJzdHIoJGxpbmUsIDAsIC0xICogbGVuZ3RoKCRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1NlcGFyYXRvcn0pKTsKICAgIAogICAgICAgIGlmICggJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57REJJc3RyaW5nfSApIHsKICAgICAgICAgICAgJGRiaC0+ZGlzY29ubmVjdDsKICAgICAgICB9CiAgICAKICAgICAgICAjJFZhbHVlID0gJGxpbmU7IFdQIC0gREVOSSAyMDEzMDgyNSAKCiAgICAgICAgIyBnZXQgcmVhbCB2YWx1ZQogICAgICAgIGlmICggJFBvc3NpYmxlVmFsdWVzeyRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIyBnZXQgcmVhZGVhYmxlIHZhbHVlCiAgICAgICAgICAgICRWYWx1ZSA9ICRQb3NzaWJsZVZhbHVlc3skVmFsdWV9OwogICAgICAgIH0KICAgIH0KICAgCiAgICAjIGNoZWNrIGlzIG5lZWRlZCB0byB0cmFuc2xhdGUgdmFsdWVzCiAgICBpZiAoICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gKSB7CgogICAgICAgICMgdHJhbnNsYXRlIHZhbHVlCiAgICAgICAgJFZhbHVlID0gJFBhcmFte0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVmFsdWUpOwogICAgfQoKICAgICMgc2V0IHRpdGxlIGFzIHZhbHVlIGFmdGVyIHVwZGF0ZSBhbmQgYmVmb3JlIGxpbWl0CiAgICBteSAkVGl0bGUgPSAkVmFsdWU7CgogICAgIyBIVE1MT3VwdXQgdHJhbnNmb3JtYXRpb25zCiAgICBpZiAoICRQYXJhbXtIVE1MT3V0cHV0fSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCA9PiAkVmFsdWUsCiAgICAgICAgICAgIE1heCA9PiAkUGFyYW17VmFsdWVNYXhDaGFyc30gfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgJFRpdGxlID0gJFBhcmFte0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgPT4gJFRpdGxlLAogICAgICAgICAgICBNYXggPT4gJFBhcmFte1RpdGxlTWF4Q2hhcnN9IHx8ICcnLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICRQYXJhbXtWYWx1ZU1heENoYXJzfSAmJiBsZW5ndGgoJFZhbHVlKSA+ICRQYXJhbXtWYWx1ZU1heENoYXJzfSApIHsKICAgICAgICAgICAgJFZhbHVlID0gc3Vic3RyKCAkVmFsdWUsIDAsICRQYXJhbXtWYWx1ZU1heENoYXJzfSApIC4gJy4uLic7CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFte1RpdGxlTWF4Q2hhcnN9ICYmIGxlbmd0aCgkVGl0bGUpID4gJFBhcmFte1RpdGxlTWF4Q2hhcnN9ICkgewogICAgICAgICAgICAkVGl0bGUgPSBzdWJzdHIoICRUaXRsZSwgMCwgJFBhcmFte1RpdGxlTWF4Q2hhcnN9ICkgLiAnLi4uJzsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZmllbGQgbGluayBmb3JtIGNvbmZpZwogICAgbXkgJExpbmsgPSAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntMaW5rfSB8fCAnJzsKCiAgICAKICAgIGlmICgkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntTdG9yZVZhbHVlfSAmJiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntTdG9yZVZhbHVlfSBlcSAiMSIpIHsKICAgIAkkS2V5ID1+IHMvXihbXnxdKylcfFx8KC4rKSQvJDEvOwogICAgfQogICAgJExpbmsgPX4gcy8lS0VZJS8kS2V5L2c7CgogICAgbXkgJFF1ZXJ5ID0gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UXVlcnl9IHx8ICcnOwoKICAgIG15ICREYXRhID0gewogICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICBUaXRsZSA9PiAkVGl0bGUsCiAgICAgICAgTGluayAgPT4gJExpbmssCglRdWVyeSA9PiAkUXVlcnksCiAgICB9OwoKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIElzU29ydGFibGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKc3ViIFNlYXJjaEZpZWxkUmVuZGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB0YWtlIGNvbmZpZyBmcm9tIGZpZWxkIGNvbmZpZwogICAgbXkgJEZpZWxkQ29uZmlnID0gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9OwogICAgbXkgJEZpZWxkTmFtZSAgID0gJ1NlYXJjaF9EeW5hbWljRmllbGRfJyAuICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57TmFtZX07CiAgICBteSAkRmllbGRMYWJlbCAgPSAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0xhYmVsfTsKCiAgICBteSAkVmFsdWU7CgogICAgbXkgQERlZmF1bHRWYWx1ZTsKCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0RlZmF1bHRWYWx1ZX0gKSB7CiAgICAgICAgbXkgQERlZmF1bHRWYWx1ZSA9IHNwbGl0IC87LywgJFBhcmFte0RlZmF1bHRWYWx1ZX07CiAgICB9CgogICAgIyBzZXQgdGhlIGZpZWxkIHZhbHVlCiAgICBpZiAoQERlZmF1bHRWYWx1ZSkgewogICAgICAgICRWYWx1ZSA9IFxARGVmYXVsdFZhbHVlOwogICAgfQoKICAgICMgZ2V0IHRoZSBmaWVsZCB2YWx1ZSwgdGhpcyBmdWN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgYWZ0ZXIgdGhlIHByb2ZpbGUgaXMgbG9hZGVkCiAgICBteSAkRmllbGRWYWx1ZXMgPSAkU2VsZi0+U2VhcmNoRmllbGRWYWx1ZUdldCgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIGlmICggZGVmaW5lZCAkRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgJFZhbHVlID0gJEZpZWxkVmFsdWVzOwogICAgfQoKICAgICMgY2hlY2sgYW5kIHNldCBjbGFzcyBpZiBuZWNlc3NhcnkKICAgIG15ICRGaWVsZENsYXNzID0gJ0R5bmFtaWNGaWVsZE11bHRpU2VsZWN0IEZyb21EQic7CgogICAgIyBzZXQgUG9zc2libGVWYWx1ZXMKICAgIG15ICRTZWxlY3Rpb25EYXRhID0gJEZpZWxkQ29uZmlnLT57UG9zc2libGVWYWx1ZXN9OwoKICAgICMgZ2V0IGhpc3RvcmljYWwgdmFsdWVzIGZyb20gZGF0YWJhc2UKICAgIG15ICRIaXN0b3JpY2FsVmFsdWVzID0gJFNlbGYtPkhpc3RvcmljYWxWYWx1ZXNHZXQoJVBhcmFtKTsKCiAgICAjIGFkZCBoaXN0b3JpYyB2YWx1ZXMgdG8gY3VycmVudCB2YWx1ZXMgKGlmIHRoZXkgZG9uJ3QgZXhpc3QgYW55bW9yZSkKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJEhpc3RvcmljYWxWYWx1ZXMpICkgewogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyRIaXN0b3JpY2FsVmFsdWVzfSApIHsKICAgICAgICAgICAgaWYgKCAhJFNlbGVjdGlvbkRhdGEtPnskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxlY3Rpb25EYXRhLT57JEtleX0gPSAkSGlzdG9yaWNhbFZhbHVlcy0+eyRLZXl9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB1c2UgUG9zc2libGVWYWx1ZXNGaWx0ZXIgaWYgZGVmaW5lZAogICAgJFNlbGVjdGlvbkRhdGEgPSAkUGFyYW17UG9zc2libGVWYWx1ZXNGaWx0ZXJ9CiAgICAgICAgaWYgZGVmaW5lZCAkUGFyYW17UG9zc2libGVWYWx1ZXNGaWx0ZXJ9OwoKICAgIG15ICRIVE1MU3RyaW5nID0gJFBhcmFte0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkU2VsZWN0aW9uRGF0YSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJEZpZWxkTmFtZSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFZhbHVlLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAkRmllbGRDb25maWctPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICRGaWVsZENsYXNzLAogICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgIEhUTUxRdW90ZSAgICA9PiAxLAogICAgKTsKCiAgICAjIGNhbGwgRWRpdExhYmVsUmVuZGVyIG9uIHRoZSBjb21tb24gYmFja2VuZAogICAgbXkgJExhYmVsU3RyaW5nID0gJFNlbGYtPntCYWNrZW5kQ29tbW9uT2JqZWN0fS0+RWRpdExhYmVsUmVuZGVyKAogICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfSwKICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgPT4gJEZpZWxkTmFtZSwKICAgICk7CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgRmllbGQgPT4gJEhUTUxTdHJpbmcsCiAgICAgICAgTGFiZWwgPT4gJExhYmVsU3RyaW5nLAogICAgfTsKCiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBTZWFyY2hGaWVsZFZhbHVlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFZhbHVlOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgdmFsdWUgZm9ybSBwYXJhbSBvYmplY3QKICAgIGlmICggZGVmaW5lZCAkUGFyYW17UGFyYW1PYmplY3R9ICkgewogICAgICAgIG15IEBGaWVsZFZhbHVlcyA9ICRQYXJhbXtQYXJhbU9iamVjdH0KICAgICAgICAgICAgLT5HZXRBcnJheSggUGFyYW0gPT4gJ1NlYXJjaF9EeW5hbWljRmllbGRfJyAuICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57TmFtZX0gKTsKCiAgICAgICAgJFZhbHVlID0gXEBGaWVsZFZhbHVlczsKICAgIH0KCiAgICAjIG90aGVyd2lzZSBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHByb2ZpbGUKICAgIGVsc2lmICggZGVmaW5lZCAkUGFyYW17UHJvZmlsZX0gKSB7CiAgICAgICAgJFZhbHVlID0gJFBhcmFte1Byb2ZpbGV9LT57ICdTZWFyY2hfRHluYW1pY0ZpZWxkXycgLiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e05hbWV9IH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtSZXR1cm5Qcm9maWxlU3RydWN0dXJlfSAmJiAkUGFyYW17UmV0dXJuUHJvZmlsZVN0cnVjdHVyZX0gZXEgMSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnU2VhcmNoX0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfSA9PiAkVmFsdWUsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gJFZhbHVlOwoKfQoKc3ViIFNlYXJjaEZpZWxkUGFyYW1ldGVyQnVpbGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBmaWVsZCB2YWx1ZQogICAgbXkgJFZhbHVlID0gJFNlbGYtPlNlYXJjaEZpZWxkVmFsdWVHZXQoJVBhcmFtKTsKCiAgICBteSAkRGlzcGxheVZhbHVlOwoKICAgIGlmICgkVmFsdWUpIHsKICAgICAgICBpZiAoIHJlZiAkVmFsdWUgZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgICAgIG15IEBEaXNwbGF5SXRlbUxpc3Q7CiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JFZhbHVlfSApIHsKCiAgICAgICAgICAgICAgICAjIHNldCB0aGUgZGlzcGxheSB2YWx1ZQogICAgICAgICAgICAgICAgbXkgJERpc3BsYXlJdGVtID0gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9LT57JEl0ZW19CiAgICAgICAgICAgICAgICAgICAgfHwgJEl0ZW07CgoJCSREaXNwbGF5SXRlbSA9ICd5eXknOwoKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyB0cmFuc2xhdGUgdGhlIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgJERpc3BsYXlJdGVtID0gJFBhcmFte0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkRGlzcGxheVZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBEaXNwbGF5SXRlbUxpc3QsICREaXNwbGF5SXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb21iaW5lIGRpZmZlcmVudCB2YWx1ZXMgaW50byBvbmUgc3RyaW5nCiAgICAgICAgICAgICREaXNwbGF5VmFsdWUgPSBqb2luICcgKyAnLCBARGlzcGxheUl0ZW1MaXN0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgc2V0IHRoZSBkaXNwbGF5IHZhbHVlCiAgICAgICAgICAgICREaXNwbGF5VmFsdWUgPSAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfS0+eyRWYWx1ZX07CiAgICAgICAgICAgIAogICAgICAgICAgICAkRGlzcGxheVZhbHVlID0gJ3h4eCc7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gKSB7CgogICAgICAgICAgICAgICAgIyB0cmFuc2xhdGUgdGhlIHZhbHVlCiAgICAgICAgICAgICAgICAkRGlzcGxheVZhbHVlID0gJFBhcmFte0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkRGlzcGxheVZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiBzZWFyY2ggcGFyYW1ldGVyIHN0cnVjdHVyZQogICAgcmV0dXJuIHsKICAgICAgICBQYXJhbWV0ZXIgPT4gewogICAgICAgICAgICBFcXVhbHMgPT4gJFZhbHVlLAogICAgICAgIH0sCiAgICAgICAgRGlzcGxheSA9PiAkRGlzcGxheVZhbHVlLAogICAgfTsKfQoKc3ViIFN0YXRzRmllbGRQYXJhbWV0ZXJCdWlsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IFBvc3NpYmxlVmFsdWVzCiAgICBteSAkVmFsdWVzID0gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9OwoKICAgICMgZ2V0IGhpc3RvcmljYWwgdmFsdWVzIGZyb20gZGF0YWJhc2UKICAgIG15ICRIaXN0b3JpY2FsVmFsdWVzID0gJFNlbGYtPntEeW5hbWljRmllbGRWYWx1ZU9iamVjdH0tPkhpc3RvcmljYWxWYWx1ZUdldCgKICAgICAgICBGaWVsZElEICAgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntJRH0sCiAgICAgICAgVmFsdWVUeXBlID0+ICdUZXh0LCcsCiAgICApOwoKICAgICMgYWRkIGhpc3RvcmljIHZhbHVlcyB0byBjdXJyZW50IHZhbHVlcyAoaWYgdGhleSBkb24ndCBleGlzdCBhbnltb3JlKQogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7JEhpc3RvcmljYWxWYWx1ZXN9ICkgewogICAgICAgIGlmICggISRWYWx1ZXMtPnskS2V5fSApIHsKICAgICAgICAgICAgJFZhbHVlcy0+eyRLZXl9ID0gJEhpc3RvcmljYWxWYWx1ZXMtPnskS2V5fQogICAgICAgIH0KICAgIH0KCiAgICAjIHVzZSBQb3NzaWJsZVZhbHVlc0ZpbHRlciBpZiBkZWZpbmVkCiAgICAkVmFsdWVzID0gJFBhcmFte1Bvc3NpYmxlVmFsdWVzRmlsdGVyfQogICAgICAgIGlmIGRlZmluZWQgJFBhcmFte1Bvc3NpYmxlVmFsdWVzRmlsdGVyfTsKCiAgICByZXR1cm4gewogICAgICAgIFZhbHVlcyAgICAgICAgICAgICA9PiAkVmFsdWVzLAogICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0xhYmVsfSwKICAgICAgICBFbGVtZW50ICAgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfSwKICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gJFBhcmFte0R5bmFtaWNGaWVsZGNvbmZpZ30tPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSwKICAgIH07Cn0KCnN1YiBDb21tb25TZWFyY2hGaWVsZFBhcmFtZXRlckJ1aWxkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE9wZXJhdG9yID0gJ0VxdWFscyc7CiAgICBteSAkVmFsdWUgICAgPSAkUGFyYW17VmFsdWV9OwoKICAgIHJldHVybiB7CiAgICAgICAgJE9wZXJhdG9yID0+ICRWYWx1ZSwKICAgIH07Cn0KCnN1YiBSZWFkYWJsZVZhbHVlUmVuZGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFZhbHVlID0gZGVmaW5lZCAkUGFyYW17VmFsdWV9ID8gJFBhcmFte1ZhbHVlfSA6ICcnOwoKICAgICMgc2V0IHRpdGxlIGFzIHZhbHVlIGFmdGVyIHVwZGF0ZSBhbmQgYmVmb3JlIGxpbWl0CiAgICBteSAkVGl0bGUgPSAkVmFsdWU7CgogICAgIyBjdXQgc3RyaW5ncyBpZiBuZWVkZWQKICAgIGlmICggJFBhcmFte1ZhbHVlTWF4Q2hhcnN9ICYmIGxlbmd0aCgkVmFsdWUpID4gJFBhcmFte1ZhbHVlTWF4Q2hhcnN9ICkgewogICAgICAgICRWYWx1ZSA9IHN1YnN0ciggJFZhbHVlLCAwLCAkUGFyYW17VmFsdWVNYXhDaGFyc30gKSAuICcuLi4nOwogICAgfQogICAgaWYgKCAkUGFyYW17VGl0bGVNYXhDaGFyc30gJiYgbGVuZ3RoKCRUaXRsZSkgPiAkUGFyYW17VGl0bGVNYXhDaGFyc30gKSB7CiAgICAgICAgJFRpdGxlID0gc3Vic3RyKCAkVGl0bGUsIDAsICRQYXJhbXtUaXRsZU1heENoYXJzfSApIC4gJy4uLic7CiAgICB9CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgIFRpdGxlID0+ICRUaXRsZSwKICAgIH07CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgVGVtcGxhdGVWYWx1ZVR5cGVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRmllbGROYW1lID0gJ0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfTsKCiAgICAjIHNldCB0aGUgZmllbGQgdHlwZXMKICAgIG15ICRFZGl0VmFsdWVUeXBlICAgPSAnU0NBTEFSJzsKICAgIG15ICRTZWFyY2hWYWx1ZVR5cGUgPSAnQVJSQVknOwoKICAgICMgcmV0dXJuIHRoZSBjb3JyZWN0IHN0cnVjdHVyZQogICAgaWYgKCAkUGFyYW17RmllbGRUeXBlfSBlcSAnRWRpdCcgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJEZpZWxkTmFtZSA9PiAkRWRpdFZhbHVlVHlwZSwKICAgICAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17RmllbGRUeXBlfSBlcSAnU2VhcmNoJyApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnU2VhcmNoXycgLiAkRmllbGROYW1lID0+ICRTZWFyY2hWYWx1ZVR5cGUsCiAgICAgICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICRGaWVsZE5hbWUgICAgICAgICAgICAgPT4gJEVkaXRWYWx1ZVR5cGUsCiAgICAgICAgICAgICdTZWFyY2hfJyAuICRGaWVsZE5hbWUgPT4gJFNlYXJjaFZhbHVlVHlwZSwKICAgICAgICAgICAgfQogICAgfQp9CgpzdWIgSXNBSkFYVXBkYXRlYWJsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9CgpzdWIgUmFuZG9tVmFsdWVTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsdWUgPSBpbnQoIHJhbmQoNTAwKSApOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPlZhbHVlU2V0KAogICAgICAgICVQYXJhbSwKICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgVmFsdWUgICA9PiAkVmFsdWUsCiAgICB9Owp9CgpzdWIgSXNNYXRjaGFibGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKc3ViIE9iamVjdE1hdGNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEZpZWxkTmFtZSA9ICdEeW5hbWljRmllbGRfJyAuICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57TmFtZX07CgogICAgIyByZXR1cm4gZmFsc2UgaWYgbm90IG1hdGNoCiAgICBpZiAoICRQYXJhbXtPYmplY3RBdHRyaWJ1dGVzfS0+eyRGaWVsZE5hbWV9IG5lICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBQb3NzaWJsZVZhbHVlc0Vycm9yIHsKICAgIG15ICggJFNlbGYsICRtZXNzYWdlLCAkZGlzcGxheWVycm9yKSA9IEBfOwogICAgbXkgJVBvc3NpYmxlVmFsdWVzRXJyb3I7CiAgICBteSAkRXJyb3JNZXNzYWdlID0gJyc7CiAgICAkRXJyb3JNZXNzYWdlID0gJ0VSUk9SOiAnLiRtZXNzYWdlIGlmICRkaXNwbGF5ZXJyb3I7CiAgICAlUG9zc2libGVWYWx1ZXNFcnJvciA9ICggJy0nID0+ICRFcnJvck1lc3NhZ2UgKTsKICAgIHJldHVybiBcJVBvc3NpYmxlVmFsdWVzRXJyb3I7Cn0KCnN1YiBBSkFYUG9zc2libGVWYWx1ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIyBFTkFCTEUgRk9SIERFQlVHOiAjIwogICAgbXkgJERFQlVHID0gOTsKICAgIAogICAgIyMgc2V0IGRpc3BsYXllcnJvcgogICAgbXkgJERJU1BMQVlFUlJPUlMgPSAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntEaXNwbGF5RXJyb3JzfSB8fCAwOwoKICAgIHVzZSBEYXRhOjpEdW1wZXI7CiAgICBvcGVuIEVSUkxPRywgJz4+L3RtcC9ERl8nLiRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57TmFtZX0uJy5sb2cnIGlmICRERUJVRzsKICAgIHByaW50IEVSUkxPRyAiW0FKQVhQb3NzaWJsZVZhbHVlc0dldCBTVEFSVF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgaWYgJERFQlVHOwoKICAgIG15ICRxdWVyeV9uZWVkZWQgPSAwOwoKICAgIG15ICVQb3NzaWJsZVZhbHVlczsKCiAgICBteSBAU1FMUGFyYW1ldGVyc192YWx1ZXM7CiAgICBteSBAU1FMUGFyYW1ldGVyc192YWx1ZXNfcmVmczsKCiAgICAjIHNwbGl0IFBhcmFtZXRlcnMgZnJvbSBEeW5hbWljRmllbGRDb25maWcgaW4gYW4gYXJyYXk6CiAgICBteSBAU1FMUGFyYW1ldGVyc19rZXlzID0gc3BsaXQoJywnLCAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntQYXJhbWV0ZXJzfSk7CgogICAgIyBXZSBjcmVhdGUgYSBtYXBwaW5nIGZvciB0aGUgcGFyYW1ldGVyczoKICAgICMgJVNRTFBhcmFtZXRlcnNfaGFzaCA9IHsKICAgICMgICAgUGFyYW0xID0+ICd2YWx1ZTEnLAogICAgIyAgICBQYXJhbTIgPT4gdW5kZWYsCiAgICAjIH0KICAgIG15ICVTUUxQYXJhbWV0ZXJzX2hhc2g7CiAgICBmb3IgbXkgJGtleSAoQFNRTFBhcmFtZXRlcnNfa2V5cykgewogICAgICAgICRTUUxQYXJhbWV0ZXJzX2hhc2h7JGtleX0gPSB1bmRlZjsKICAgIH0KCgogICAgIyMjIyBEaXN0aW5ndWlzaCBiZXR3ZWVuIHJlYWwgYWpheCByZXF1ZXN0IGFuZCAnZmlyc3QgdmlzdWFsaXphdGlvbicKICAgCj1jb21tZW50Cgpjb25zaWRlcmF0aW9uczoKLSB3ZSBjYW4gZGlzdGluZ3Vpc2ggaWYgaXQgaXMgYW4gYWpheCByZXF1ZXN0IG9yIGEgJ2ZpcnN0IGxvYWQnIHdpdGggdGhlIHByZXNlbmNlIG9mICRQYXJhbXtQYXJhbU9iamVjdH0tPntRdWVyeX0tPntwYXJhbX0tPntFbGVtZW50Q2hhbmdlZH0uCi0gd2UgY2FuIGRpc3Rpbmd1aXNoIGlmIGl0IGlzIGEgbmV3IFRpY2tldCBvciBhIFRpY2tldCBlZGl0aW5nIHdpdGggdGhlIHByZXNlbmNlIG9mICRQYXJhbXtQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnKQoKb24gdGlja2V0IGVkaXRpbmcsCglvbiAnZmlyc3QgbG9hZCcsIGxvYWQgdGFrZSBhbGwgQFNRTFBhcmFtZXRlcnNfdmFsdWVzIGZyb20gdGhlIHN0b3JlZCB0aWNrZXQgaW5mb3JtYXRpb24sCglvbiAnYWpheCByZXF1ZXN0JywgdGFrZSB2YWx1ZSBmcm9tIGh0dHAgYXJndW1lbnRzLCBpZiBub3QgcHJlc2VudCwgdGFrZSBmcm9tIHRpY2tldCBpbmZvcm1hdGlvbi4Kb24gdGlja2V0IGNyZWF0aW9uLAoJb24gJ2ZpcnN0IGxvYWQnLCB0YWtlIHZhbHVlcyBmcm9tIGh0dHAgYXJndW1lbnRzLAoJb24gJ2FqYXggcmVxdWVzdCcgdGFrZSB2YWx1ZXMgZnJvbSBodHRwIGFyZ3VtZW50cywKCnNvIHdlIGNhbiBzb2x2ZSBlYWNoIHJlcXVpcmVtZW50IHdpdGggZm9sbG93aW5nIGNvZGU6CglpZiAoIHRoZXJlIGlzIHN0b3JlZCB0aWNrZXQgaW5mb3JtYXRpb24gKSBmaWxsIHNxbHBhcmFtZXRlcl92YWx1ZXMgd2l0aCBzdG9yZWQgaW5mb3JtYXRpb24KCWlmICggdGhlcmUgYXJlIGh0dHAgYXJndW1lbnQgdmFsdWVzICkgZmlsbCBzcWxwYXJhbWV0ZXJfdmFsdWVzIHdpdGggaHR0cCBhcmd1bWVudCB2YWx1ZXMgb3ZlcndyaXRpbmcgc3RvcmVkIGluZm9ybWF0aW9uIGlmIHByZXNlbnQKCQlpZiAoIGEgaHR0cCBhcmd1bWVudCB3YXMgY2hhbmdlZCB0aGF0IHRoZSBxdWVyeSBkZXBlbmRzIG9uICkgZm9yY2VfcXVlcnkgPSAxCgoJaWYgKCFmb3JjZV9xdWVyeSkgdGFrZSBmcm9tIGNhY2hlIGlmICggY2FjaGUgcHJlc2VudCApCgo9Y3V0CgogICAgaWYgKCBzY2FsYXIoQFNRTFBhcmFtZXRlcnNfa2V5cykgJiYgJFBhcmFte1BhcmFtT2JqZWN0fSAmJiAkUGFyYW17UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJykgKSB7CiAgICAJbXkgJVRpY2tldEluZm87CiAgICAJIyBnZXQgVGlja2V0IGZyb20gY2FjaGU6CiAgICAJaWYgKCRQYXJhbXtMYXlvdXRPYmplY3R9LT57VGlja2V0T2JqZWN0fS0+eydDYWNoZTo6R2V0VGlja2V0Jy4kUGFyYW17UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyl9eycnfXsxfSkgewogICAgCQklVGlja2V0SW5mbyA9ICV7JFBhcmFte0xheW91dE9iamVjdH0tPntUaWNrZXRPYmplY3R9LT57J0NhY2hlOjpHZXRUaWNrZXQnLiRQYXJhbXtQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnKX17Jyd9ezF9fTsKICAgIAl9CiAgICAJZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgICAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkUGFyYW17UGFyYW1PYmplY3R9LT57Q29uZmlnT2JqZWN0fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRQYXJhbXtQYXJhbU9iamVjdH0tPntDb25maWdPYmplY3R9LAogICAgICAgICAgICAgICAgICAgIExvZ09iamVjdCAgICA9PiAkUGFyYW17UGFyYW1PYmplY3R9LT57TG9nT2JqZWN0fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJFBhcmFte1BhcmFtT2JqZWN0fS0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgICAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRQYXJhbXtQYXJhbU9iamVjdH0tPntMb2dPYmplY3R9LAogICAgICAgICAgICAgICAgICAgIE1haW5PYmplY3QgICA9PiAkUGFyYW17UGFyYW1PYmplY3R9LT57TWFpbk9iamVjdH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQtPm5ldygKICAgICAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgICAgICAgPT4gJFBhcmFte1BhcmFtT2JqZWN0fS0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgICAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbXtQYXJhbU9iamVjdH0tPntMb2dPYmplY3R9LAogICAgICAgICAgICAgICAgICAgIERCT2JqZWN0ICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFpbk9iamVjdCAgICAgICAgID0+ICRQYXJhbXtQYXJhbU9iamVjdH0tPntNYWluT2JqZWN0fSwKICAgICAgICAgICAgICAgICAgICBUaW1lT2JqZWN0ICAgICAgICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRW5jb2RlT2JqZWN0ICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJVRpY2tldEluZm8gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyksCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLCAgICAgICAgICMgT3B0aW9uYWwsIGRlZmF1bHQgMC4gVG8gaW5jbHVkZSB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZXMgZm9yIHRoaXMgdGlja2V0IG9uIHRoZSByZXR1cm4gc3RydWN0dXJlLgogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICk7CiAgICAJfQoKICAgIAlmb3IgbXkgJGtleSAoQFNRTFBhcmFtZXRlcnNfa2V5cykgewogICAgCQlpZiAoJGtleSBlcSAnU2VsZWN0ZWRDdXN0b21lclVzZXInKSB7CiAgICAJCQkkU1FMUGFyYW1ldGVyc19oYXNoeyRrZXl9ID0gJFRpY2tldEluZm97Q3VzdG9tZXJVc2VySUR9OwogICAgCQl9CiAgICAJCWVsc2UgewogICAgCQkJJFNRTFBhcmFtZXRlcnNfaGFzaHska2V5fSA9ICRUaWNrZXRJbmZveyRrZXl9OwogICAgCQl9CiAgICAJfQogICAgfSAKICAgIAogICAgaWYgKCAkUGFyYW17UGFyYW1PYmplY3R9ICYmICRQYXJhbXtQYXJhbU9iamVjdH0tPntRdWVyeX0tPntwYXJhbX0gKSB7CiAgICAJIyBSRUFMIEFKQVggUkVRVUVTVCwgVEFLRSBQQVJBTVMgRlJPTSBBSkFYIFJFUVVFU1QKICAgICAgICAgICAgIyBmb3IgZWFjaCBwYXJhbWV0ZXIgZXh0cmFjdCB2YWx1ZSBmcm9tIHRoZSBQYXJhbU9iamVjdAogICAgICAgICAgICBmb3IgbXkgJGtleSAoQFNRTFBhcmFtZXRlcnNfa2V5cykgewogICAgICAgICAgICAgICAgcHJpbnQgRVJSTE9HIER1bXBlcigkUGFyYW17UGFyYW1PYmplY3R9LT57UXVlcnl9LT57cGFyYW19KSBpZiAkREVCVUc7CiAgICAgICAgICAgICAgICBpZiAoJFBhcmFte1BhcmFtT2JqZWN0fS0+e1F1ZXJ5fS0+e3BhcmFtfS0+eyRrZXl9ICYmICRQYXJhbXtQYXJhbU9iamVjdH0tPntRdWVyeX0tPntwYXJhbX0tPnska2V5fVswXSkgewogICAgICAgICAgICAgICAgICAgICRTUUxQYXJhbWV0ZXJzX2hhc2h7JGtleX0gPSAkUGFyYW17UGFyYW1PYmplY3R9LT57UXVlcnl9LT57cGFyYW19LT57JGtleX1bMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIGlmIHRoZSBjaGFuZ2VkIEVsZW1lbnQgaXMgaW4gdGhlIHBhcmFtZXRlciBsaXN0LCB1cGRhdGUgZGF0YQogICAgICAgICAgICAgICAgaWYgKCRQYXJhbXtQYXJhbU9iamVjdH0tPntRdWVyeX0tPntwYXJhbX0tPntFbGVtZW50Q2hhbmdlZH0gJiYgJGtleSBlcSAkUGFyYW17UGFyYW1PYmplY3R9LT57UXVlcnl9LT57cGFyYW19LT57RWxlbWVudENoYW5nZWR9WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgRVJSTE9HICckUGFyYW17UGFyYW1PYmplY3R9LT57UXVlcnl9LT57cGFyYW19LT57RWxlbWVudENoYW5nZWR9WzBdJyBpZiAkREVCVUc7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgRVJSTE9HIER1bXBlcihcJFBhcmFte1BhcmFtT2JqZWN0fS0+e1F1ZXJ5fS0+e3BhcmFtfS0+e0VsZW1lbnRDaGFuZ2VkfVswXSkgaWYgJERFQlVHOwogICAgICAgICAgICAgICAgICAgICRxdWVyeV9uZWVkZWQgPSAxOwoJICAgICAgICAgICAgbXkgQHZhbCA9ICggJysnICk7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1BhcmFtT2JqZWN0fS0+e1F1ZXJ5fS0+e3BhcmFtfS0+eydEeW5hbWljRmllbGRfJy4kUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e05hbWV9fSA9IFxAdmFsOwogCSAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQgRVJSTE9HICJQYXJhbU9iamVjdCBET0VTIE5PVCBFWElTVCEhXG4iIGlmICRERUJVRzsKICAgIH0KICAgIAoKICAgICMgZmluYWxseSBidWlsZCB0aGUgb3JpZ2luYWwgYXJyYXkgd2l0aCBvbmx5IHZhbHVlczoKICAgIGZvciBteSAka2V5IChAU1FMUGFyYW1ldGVyc19rZXlzKSB7CiAgICAgICAgIyBzb21ldGltZXMgd2UgZ290ICc8a2V5Pnx8PHZhbHVlPicgc3RyaW5nLCBzbyBpbiB0aGF0IGNhc2UgZXh0cmFjdCBrZXkgb25seToKCiAgICAgICAgaWYgKCAhICRTUUxQYXJhbWV0ZXJzX2hhc2h7JGtleX0gKSB7CiAgICAgICAgICAgICMgaWYgb25lIHBhcmFtZXRlciBpcyB1bmRlZiwgcmV0dXJuIGVtcHR5IFBvc3NpYmxlIHZhbHVlczsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5Qb3NzaWJsZVZhbHVlc0Vycm9yKCd3cm9uZyBudW1iZXIgb2YgcGFyYW1ldGVycywgcGxlYXNlIGNoZWNrIHNldHRpbmdzLiAoJy4ka2V5LicgaXMgbWlzc2luZyknLCAkRElTUExBWUVSUk9SUyk7CiAgICAgICAgfQoKICAgICAgICAkU1FMUGFyYW1ldGVyc19oYXNoeyRrZXl9ID1+IHMvXihbXnxdKylcfFx8KC4rKSQvJDEvOwoKICAgICAgICBwcmludCBFUlJMT0cgJFNRTFBhcmFtZXRlcnNfaGFzaHska2V5fS4iXG5cbiIgaWYgJERFQlVHOwoKICAgICAgICBwdXNoKEBTUUxQYXJhbWV0ZXJzX3ZhbHVlcywgJFNRTFBhcmFtZXRlcnNfaGFzaHska2V5fSk7CiAgICAgICAgcHVzaChAU1FMUGFyYW1ldGVyc192YWx1ZXNfcmVmcywgXCRTUUxQYXJhbWV0ZXJzX2hhc2h7JGtleX0pOwoKICAgIH0KCiAgICBpZiAoISgoJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UXVlcnl9ID1+IHRyLz8vLykgZXEgc2NhbGFyKEBTUUxQYXJhbWV0ZXJzX3ZhbHVlcykpKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5Qb3NzaWJsZVZhbHVlc0Vycm9yKCd3cm9uZyBudW1iZXIgb2YgcGFyYW1ldGVycywgcGxlYXNlIGNoZWNrIHNldHRpbmdzLicsICRESVNQTEFZRVJST1JTKTsKICAgIH0KCiAgICBteSAkUG9zc2libGVWYWx1ZXNfcmVmID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICBUeXBlCT0+ICdIYXNoJywKICAgICAgICBLZXkJPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfSAuIGpvaW4oJycsIEBTUUxQYXJhbWV0ZXJzX3ZhbHVlcyksCiAgICApOwoKICAgIGlmICgkUG9zc2libGVWYWx1ZXNfcmVmKSB7ICMgd2UgZ290IHRoZSB2YWx1ZXMgaW4gY2FjaGUKICAgICAgICAlUG9zc2libGVWYWx1ZXMgPSAleyAkUG9zc2libGVWYWx1ZXNfcmVmIH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBteSAkc2VsZWN0ZWRfcGFyYW1ldGVyID0gJFBhcmFte1BhcmFtT2JqZWN0fS0+e1F1ZXJ5fS0+e3BhcmFtfS0+eyRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1BhcmFtZXRlcnN9fVswXTsKICAgIAogICAgICAgICMgc2V0IG5vbmUgdmFsdWUgaWYgZGVmaW5lZCBvbiBmaWVsZCBjb25maWcKICAgICAgICBpZiAoICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1Bvc3NpYmxlTm9uZX0gKSB7CiAgICAgICAgICAgICVQb3NzaWJsZVZhbHVlcyA9ICggJycgPT4gJy0nICk7CiAgICAgICAgfQoKCiAgICAJIyBpZiBubyBxdWVyeSBzcGVjaWZpZWQgcXVpdDoKICAgICAgICBpZiAoICEkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntRdWVyeX0gfHwgJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UXVlcnl9IGVxICcnICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPlBvc3NpYmxlVmFsdWVzRXJyb3IoJ25vIHF1ZXJ5IHNwZWNpZmllZCwgcGxlYXNlIGNoZWNrIHNldHRpbmdzLicsICRESVNQTEFZRVJST1JTKTsKICAgICAgICB9CgogICAgICAgICMjIyBTRVQgREVGQVVMVCBTRVRUSU5HUwogICAgICAgICMgc2V0IGEgZGVmYXVsdCBTZXBhcmF0b3IKICAgICAgICBpZiAoICEkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntTZXBhcmF0b3J9ICkgewogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntTZXBhcmF0b3J9ID0gJywgJzsKICAgICAgICB9CiAgICAgICAgIyMjIEVORCBTRVQgREVGQVVMVCBTRVRUSU5HUwoKICAgICAgICBteSBAcm93OwogICAgICAgIG15ICRzdGg7CiAgICAgICAgbXkgJGRiaDsKCiAgICAgICAgIyB1c2UgbG9jYWwgREIgT2JqZWN0IGlmIG5vIERCSSBzdHJpbmcgaXMgc3BlY2lmaWVkLgogICAgICAgIGlmICggISRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e0RCSXN0cmluZ30gKSB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgU1FMID0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1F1ZXJ5fSwKICAgICAgICAgICAgICAgIEJpbmQgPT4gXEBTUUxQYXJhbWV0ZXJzX3ZhbHVlc19yZWZzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgI2ZldGNoIGZpcnN0IHJvdwogICAgICAgICAgICBAcm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKTsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGRiaCA9IERCSS0+Y29ubmVjdCgkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntEQklzdHJpbmd9LCAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntEQkl1c2VyfSwgJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57REJJcGFzc30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgUHJpbnRFcnJvciA9PiAwLCBBdXRvQ29tbWl0ID0+IDAsIEhhbmRsZUVycm9yID0+IFwmUG9zc2libGVWYWx1ZXNFcnJvciB9KSBvciByZXR1cm4gJFNlbGYtPlBvc3NpYmxlVmFsdWVzRXJyb3IoImNvdWxkIG5vdCBjb25uZWN0IHRvIERCOiAkREJJOjplcnJzdHIiLCAkRElTUExBWUVSUk9SUyk7CiAgICAgICAgCiAgICAgICAgICAgICRkYmgtPnsnbXlzcWxfZW5hYmxlX3V0ZjgnfSA9IDE7CiAgICAKICAgICAgICAgICAgJHN0aCA9ICRkYmgtPnByZXBhcmUoJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UXVlcnl9KTsKICAgICAgICAgICAgJHN0aC0+ZXhlY3V0ZSggQFNRTFBhcmFtZXRlcnNfdmFsdWVzICk7CiAgICAKICAgICAgICAgICAgIyBmZXRjaCBmaXJzdCByb3cKICAgICAgICAgICAgQHJvdyA9ICRzdGgtPmZldGNocm93X2FycmF5OyAgICAgICAgCiAgICAgICAgfQoKICAgICAgICBwcmludCBFUlJMT0cgIjo6OkV4dHJhY3RlZCBmcm9tIERCOjo6XG4iIGlmICRERUJVRzsKICAgICAgICBwcmludCBFUlJMT0cgRHVtcGVyKEByb3cpIGlmICRERUJVRzsKICAgICAgICBwcmludCBFUlJMT0cgIjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6XG4iIGlmICRERUJVRzsKICAgICAgICBjbG9zZSBFUlJMT0cgaWYgJERFQlVHOwoKICAgICAgICAjIGNpY2xlIGZldGNoZWQgcm93cyBmcm9tIERCCiAgICAgICAgd2hpbGUgKEByb3cpIHsKICAgICAgICAgICAgbXkgJGxpbmUgPSAnJzsKICAgICAgICAgICAgbXkgJGZpcnN0Um93ID0gMDsKICAgICAgICAgICAgZm9yIG15ICRjb2wgKEByb3cpIHsKICAgICAgICAgICAgICAgIGlmICghdXRmODo6aXNfdXRmOCgkY29sKSkgewogICAgICAgICAgICAgICAgICAgIHV0Zjg6OmRlY29kZSggJGNvbCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEkZmlyc3RSb3cpIHsgIyBza2lwIGZpcnN0IHJvdyAKICAgICAgICAgICAgICAgICAgICAkZmlyc3RSb3cgPSAxOwogICAgICAgICAgICAJbmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRsaW5lIC49ICRjb2wuJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57U2VwYXJhdG9yfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGxpbmUgPSBzdWJzdHIoJGxpbmUsIDAsIC0xICogbGVuZ3RoKCRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1NlcGFyYXRvcn0pKTsKICAgICAgICAgICAgaWYgKCRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1N0b3JlVmFsdWV9ICYmICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1N0b3JlVmFsdWV9IGVxICIxIikgewogICAgICAgICAgICAgICAgJVBvc3NpYmxlVmFsdWVzID0gKCAlUG9zc2libGVWYWx1ZXMsICRyb3dbMF0uInx8Ii4kbGluZSA9PiAkbGluZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAlUG9zc2libGVWYWx1ZXMgPSAoICVQb3NzaWJsZVZhbHVlcywgJHJvd1swXSA9PiAkbGluZSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZldGNoIG5ldyByb3cgZGVwZW5kaW5nIG9uIERCIGNvbm5lY3Rpb24gdHlwZQogICAgICAgICAgICBpZiAoICEkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntEQklzdHJpbmd9ICkgewogICAgICAgICAgICAgICAgQHJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBAcm93ID0gJHN0aC0+ZmV0Y2hyb3dfYXJyYXk7CgkJaWYgKCFAcm93KSB7CiAgICAgICAgICAgICAgICAgICAgJGRiaC0+ZGlzY29ubmVjdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwdXQgYWxsIGluIHRoZSBjYWNoZToKCQogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUJPT4gJ0hhc2gnLAogICAgICAgICAgICBLZXkJCT0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57TmFtZX0gLiBqb2luKCcnLCBAU1FMUGFyYW1ldGVyc192YWx1ZXMpLAogICAgICAgICAgICBWYWx1ZQk9PiBcJVBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBUVEwJCT0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q2FjaGVUVEx9IHx8IDM2MCwKICAgICAgICApOwogICAgfQoKICAgICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSA9IFwlUG9zc2libGVWYWx1ZXM7CiAgICAjIHJldHJ1biB0aGUgcG9zc2libGUgdmFsdWVzIGhhc2ggYXMgYSByZWZlcmVuY2UKICAgIHJldHVybiBcJVBvc3NpYmxlVmFsdWVzOwp9CgpzdWIgSGlzdG9yaWNhbFZhbHVlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGhpc3RvcmljYWwgdmFsdWVzIGZyb20gZGF0YWJhc2UKICAgIG15ICRIaXN0b3JpY2FsVmFsdWVzID0gJFNlbGYtPntEeW5hbWljRmllbGRWYWx1ZU9iamVjdH0tPkhpc3RvcmljYWxWYWx1ZUdldCgKICAgICAgICBGaWVsZElEICAgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntJRH0sCiAgICAgICAgVmFsdWVUeXBlID0+ICdUZXh0JywKICAgICk7CgogICAgIyBCSU5JIC0gMjcuMDMuMjAxMwogICAgIwogICAgIyBSZW1vdmUgIjx2YWw+fHwiIGZyb20gaGlzdG9yaWNhbCB2YWx1ZXMgdXNlZCBpbiBzZWFyY2ggZm9ybQogICAgIwogICAgaWYgKCRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1N0b3JlVmFsdWV9IGVxICIxIikgewogICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRIaXN0b3JpY2FsVmFsdWVzKSApIHsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRIaXN0b3JpY2FsVmFsdWVzfSApIHsKICAgICAgICAgICAgJEhpc3RvcmljYWxWYWx1ZXMtPnskS2V5fSA9fiBzL14oW158XSspXHxcfCguKykkLyQyLzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgICMgQklOSQogICAgIwoKICAgICMgcmV0cnVuIHRoZSBoaXN0b3JpY2FsIHZhbHVlcyBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gJEhpc3RvcmljYWxWYWx1ZXM7Cn0KCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWx1ZSA9IGRlZmluZWQgJFBhcmFte0tleX0gPyAkUGFyYW17S2V5fSA6ICcnOwoKICAgICMgZ2V0IHJlYWwgdmFsdWVzCiAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc307CgogICAgaWYgKCRWYWx1ZSkgewoKICAgICAgICAjIGNoZWNrIGlmIHRoZXJlIGlzIGEgcmVhbCB2YWx1ZSBmb3IgdGhpcyBrZXkgKG90aGVyd2lzZSBrZWVwIHRoZSBrZXkpCiAgICAgICAgaWYgKCAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30tPnskVmFsdWV9ICkgewoKICAgICAgICAgICAgIyBnZXQgcmVhZGVhYmxlIHZhbHVlCiAgICAgICAgICAgICRWYWx1ZSA9ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfS0+eyRWYWx1ZX07CgogICAgICAgICAgICAjIGNoZWNrIGlmIHRyYW5zbGF0aW9uIGlzIHBvc3NpYmxlCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyB0cmFuc2xhdGUgdmFsdWUKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRQYXJhbXtMYW5ndWFnZU9iamVjdH0tPkdldCgkVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkVmFsdWU7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJCQKCj1jdXQK</File>
<File Location="Custom/Kernel/System/DynamicField/Backend/TextAreaFromDB.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vRHluYW1pY0ZpZWxkL0JhY2tlbmQvVGV4dEFyZWEucG0gLSBEZWxlZ2F0ZSBmb3IgRHluYW1pY0ZpZWxkIFRleHRBcmVhIGJhY2tlbmQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMiBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRleHRBcmVhLnBtLHYgMS40OC4yLjQgMjAxMi8wNS8wNyAyMTo0MzoxMCBjciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kOjpUZXh0QXJlYUZyb21EQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQ6OkJhY2tlbmRDb21tb247Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQ4LjIuNCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDo6VGV4dEFyZWEKCj1oZWFkMSBTWU5PUFNJUwoKRHluYW1pY0ZpZWxkcyBUZXh0QXJlYSBiYWNrZW5kIGRlbGVnYXRlCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgcHVibGljIGludGVyZmFjZSBvZiBMPEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQ+LgpQbGVhc2UgbG9vayB0aGVyZSBmb3IgYSBkZXRhaWxlZCByZWZlcmVuY2Ugb2YgdGhlIGZ1bmN0aW9ucy4KCj1vdmVyIDQKCj1pdGVtIG5ldygpCgp1c3VhbGx5LCB5b3Ugd2FudCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcwpieSB1c2luZyBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kLT5uZXcoKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IERCT2JqZWN0KSkgewogICAgICAgIGRpZSAiR290IG5vICROZWVkZWQhIiBpZiAhJFBhcmFteyROZWVkZWR9OwoKICAgICAgICAkU2VsZi0+eyROZWVkZWR9ID0gJFBhcmFteyROZWVkZWR9OwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntEeW5hbWljRmllbGRWYWx1ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkVmFsdWUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57QmFja2VuZENvbW1vbk9iamVjdH0KICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQ6OkJhY2tlbmRDb21tb24tPm5ldyggJXskU2VsZn0gKTsKCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDYWNoZS0+bmV3KCVQYXJhbSk7CgogICAgIyBzZXQgdGhlIG1heGltdW0gbGVuZ2h0IGZvciB0aGUgdGV4dGFyZWEgZmllbGRzIHRvIHN0aWxsIGJlIGEgc2VhcmNoYWJsZSBmaWVsZCBpbiBzb21lCiAgICAjIGRhdGFiYXNlcwogICAgJFNlbGYtPntNYXhMZW5ndGh9ID0gMzgwMDsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBWYWx1ZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRERlZhbHVlID0gJFNlbGYtPntEeW5hbWljRmllbGRWYWx1ZU9iamVjdH0tPlZhbHVlR2V0KAogICAgICAgIEZpZWxkSUQgID0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57SUR9LAogICAgICAgIE9iamVjdElEID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJERGVmFsdWU7CiAgICByZXR1cm4gaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkREZWYWx1ZSk7CiAgICByZXR1cm4gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkREZWYWx1ZS0+WzBdICk7CgogICAgcmV0dXJuICRERlZhbHVlLT5bMF0tPntWYWx1ZVRleHR9Owp9CgpzdWIgVmFsdWVTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkVmFsdWVPYmplY3R9LT5WYWx1ZVNldCgKICAgICAgICBGaWVsZElEICA9PiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0lEfSwKICAgICAgICBPYmplY3RJRCA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgIFZhbHVlICAgID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWVUZXh0ID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKc3ViIFZhbHVlRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZFZhbHVlT2JqZWN0fS0+VmFsdWVEZWxldGUoCiAgICAgICAgRmllbGRJRCAgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntJRH0sCiAgICAgICAgT2JqZWN0SUQgPT4gJFBhcmFte09iamVjdElEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRTdWNjZXNzOwp9CgpzdWIgQWxsVmFsdWVzRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZFZhbHVlT2JqZWN0fS0+QWxsVmFsdWVzRGVsZXRlKAogICAgICAgIEZpZWxkSUQgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntJRH0sCiAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRTdWNjZXNzOwp9CgpzdWIgVmFsdWVWYWxpZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntEeW5hbWljRmllbGRWYWx1ZU9iamVjdH0tPlZhbHVlVmFsaWRhdGUoCiAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICBWYWx1ZVRleHQgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfQogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCnN1YiBTZWFyY2hTUUxHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlT3BlcmF0b3JzID0gKAogICAgICAgIEVxdWFscyAgICAgICAgICAgID0+ICc9JywKICAgICAgICBHcmVhdGVyVGhhbiAgICAgICA9PiAnPicsCiAgICAgICAgR3JlYXRlclRoYW5FcXVhbHMgPT4gJz49JywKICAgICAgICBTbWFsbGVyVGhhbiAgICAgICA9PiAnPCcsCiAgICAgICAgU21hbGxlclRoYW5FcXVhbHMgPT4gJzw9JywKICAgICk7CgogICAgaWYgKCAkT3BlcmF0b3JzeyAkUGFyYW17T3BlcmF0b3J9IH0gKSB7CiAgICAgICAgbXkgJFNRTCA9ICIgJFBhcmFte1RhYmxlQWxpYXN9LnZhbHVlX3RleHQgJE9wZXJhdG9yc3skUGFyYW17T3BlcmF0b3J9fSAnIjsKICAgICAgICAkU1FMIC49ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1NlYXJjaFRlcm19ICkgLiAiJyAiOyAKICAgICAgICByZXR1cm4gJFNRTDsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtPcGVyYXRvcn0gZXEgJ0xpa2UnICkgewoKICAgICAgICBteSAkU1FMID0gJFNlbGYtPntEQk9iamVjdH0tPlF1ZXJ5Q29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICA9PiAiJFBhcmFte1RhYmxlQWxpYXN9LnZhbHVlX3RleHQiLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17U2VhcmNoVGVybX0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTUUw7CiAgICB9CgogICAgJFNlbGYtPnsnTG9nT2JqZWN0J30tPkxvZygKICAgICAgICAnUHJpb3JpdHknID0+ICdlcnJvcicsCiAgICAgICAgJ01lc3NhZ2UnICA9PiAiVW5zdXBwb3J0ZWQgT3BlcmF0b3IgJFBhcmFte09wZXJhdG9yfSIsCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIFNlYXJjaFNRTE9yZGVyRmllbGRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gIiRQYXJhbXtUYWJsZUFsaWFzfS52YWx1ZV90ZXh0IjsKfQoKc3ViIEVkaXRGaWVsZFJlbmRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdGFrZSBjb25maWcgZnJvbSBmaWVsZCBjb25maWcKICAgIG15ICRGaWVsZENvbmZpZyA9ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfTsKICAgIG15ICRGaWVsZE5hbWUgICA9ICdEeW5hbWljRmllbGRfJyAuICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57TmFtZX07CiAgICBteSAkRmllbGRMYWJlbCAgPSAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0xhYmVsfTsKCiAgICBteSAkVmFsdWUgPSAnJzsKCiAgICAjIHNldCB0aGUgZmllbGQgdmFsdWUgb3IgZGVmYXVsdAogICAgaWYgKCAkUGFyYW17VXNlRGVmYXVsdFZhbHVlfSApIHsKICAgICAgICAkVmFsdWUgPSAoIGRlZmluZWQgJEZpZWxkQ29uZmlnLT57RGVmYXVsdFZhbHVlfSA/ICRGaWVsZENvbmZpZy0+e0RlZmF1bHRWYWx1ZX0gOiAnJyApOwogICAgfQogICAgJFZhbHVlID0gJFBhcmFte1ZhbHVlfSBpZiBkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZvcm0gdGhlIHdlYiByZXF1ZXN0CiAgICBteSAkRmllbGRWYWx1ZSA9ICRTZWxmLT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgICMgc2V0IHZhbHVlcyBmcm9tIFBhcmFtT2JqZWN0IGlmIHByZXNlbnQKICAgIGlmICggZGVmaW5lZCAkRmllbGRWYWx1ZSApIHsKICAgICAgICAkVmFsdWUgPSAkRmllbGRWYWx1ZTsKICAgIH0KCiAgICAjIHNldCB0aGUgcm93cyBudW1iZXIKICAgIG15ICRSb3dzTnVtYmVyCiAgICAgICAgPSBkZWZpbmVkICRGaWVsZENvbmZpZy0+e1Jvd3N9ICYmICRGaWVsZENvbmZpZy0+e1Jvd3N9ID8gJEZpZWxkQ29uZmlnLT57Um93c30gOiAnNyc7CgogICAgIyBzZXQgdGhlIGNvbHMgbnVtYmVyCiAgICBteSAkQ29sc051bWJlcgogICAgICAgID0gZGVmaW5lZCAkRmllbGRDb25maWctPntDb2xzfSAmJiAkRmllbGRDb25maWctPntDb2xzfSA/ICRGaWVsZENvbmZpZy0+e0NvbHN9IDogJzQyJzsKCiAgICAjIGNoZWNrIGFuZCBzZXQgY2xhc3MgaWYgbmVjZXNzYXJ5CiAgICBteSAkRmllbGRDbGFzcyA9ICdEeW5hbWljRmllbGRUZXh0QXJlYSc7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0NsYXNzfSAmJiAkUGFyYW17Q2xhc3N9IG5lICcnICkgewogICAgICAgICRGaWVsZENsYXNzIC49ICcgJyAuICRQYXJhbXtDbGFzc307CiAgICB9CgogICAgIyBzZXQgZmllbGQgYXMgbWFuZGF0b3J5CiAgICAkRmllbGRDbGFzcyAuPSAnIFZhbGlkYXRlX1JlcXVpcmVkJyBpZiAkUGFyYW17TWFuZGF0b3J5fTsKCiAgICAjIHNldCBlcnJvciBjc3MgY2xhc3MKICAgICRGaWVsZENsYXNzIC49ICcgU2VydmVyRXJyb3InIGlmICRQYXJhbXtTZXJ2ZXJFcnJvcn07CgogICAgIyBzZXQgdmFsaWRhdGlvbiBjbGFzcyBmb3IgbWF4aW11bSBjaGFyYWN0ZXJzCiAgICAkRmllbGRDbGFzcyAuPSAnIFZhbGlkYXRlX01heExlbmd0aCc7CgogICAgIyBjcmVhdGUgZmllbGQgSFRNTAogICAgIyB0aGUgWEhUTUwgZGVmaW5pdGlvbiBkb2VzIG5vdCBzdXBwb3J0IG1heGxlbmdodCBhdHRyaWJ1dGUgZm9yIGEgdGV4dGFyZWEgZmllbGQsIHRoZXJlZm9yZQogICAgIyBpcyBuZWRkZWQgdG8gYmUgc2V0IGJ5IEpTIGNvZGUgKG90aGVyd2lzZSB3YzMgdmFsaWRhdG9yIHdpbGwgY29tcGxhaW50IGFib3V0IGl0KQogICAgIyBub3RpY2UgdGhhdCBzb21lIGJyb3dzZXJzIGNvdW50IG5ldyBsaW5lcyBcblxyIGFzIG9ubHkgMSBjaGFyYWN0ZXIgaW4gdGhpcyBjYXNlcyB0aGUKICAgICMgdmFsaWRhdGlvbiBmcmFtZXdvcmsgbWlnaHQgcmlzZSBhbiBlcnJvciB3aGlsZSB0aGUgdXNlciBpcyBzdGlsbCBjYXBhYmxlIHRvIGVudGVyIHRleHQgaW4gdGhlCiAgICAjIHRleHRhcmVhLCBvdGhlcndpc2UgdGhlIG1heGxlbmdodCBwcm9wZXJ0eSB3aWxsIHByZXZlbnQgdG8gZW50ZXIgbW9yZSB0ZXh0IHRoYW4gdGhlIG1heGltdW0KICAgIG15ICRIVE1MU3RyaW5nID0gPDwiRU9GIjsKPHRleHRhcmVhIGNsYXNzPSIkRmllbGRDbGFzcyIgaWQ9IiRGaWVsZE5hbWUiIG5hbWU9IiRGaWVsZE5hbWUiIHRpdGxlPSIkRmllbGRMYWJlbCIgcm93cz0iJFJvd3NOdW1iZXIiIGNvbHM9IiRDb2xzTnVtYmVyIiA+JFZhbHVlPC90ZXh0YXJlYT4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICBcJCgnIyRGaWVsZE5hbWUnKS5hdHRyKCdtYXhsZW5ndGgnLCckU2VsZi0+e01heExlbmd0aH0nKTsKLy9dXT48L3NjcmlwdD4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgpFT0YKCiAgICAjIGZvciBjbGllbnQgc2lkZSB2YWxpZGF0aW9uCiAgICBteSAkRGl2SUQgPSAkRmllbGROYW1lIC4gJ0Vycm9yJzsKCiAgICBpZiAoICRQYXJhbXtNYW5kYXRvcnl9ICkgewogICAgICAgICRIVE1MU3RyaW5nIC49IDw8IkVPRiI7CiAgICA8ZGl2IGlkPSIkRGl2SUQiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICA8cD4KICAgICAgICAgICAgXCRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIG9yIFRoZSBmaWVsZCBjb250ZW50IGlzIHRvbyBsb25nISBNYXhpbXVtIHNpemUgaXMgJFNlbGYtPntNYXhMZW5ndGh9IGNoYXJhY3RlcnMuIn0KICAgICAgICA8L3A+CiAgICA8L2Rpdj4KRU9GCiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkSFRNTFN0cmluZyAuPSA8PCJFT0YiOwogICAgPGRpdiBpZD0iJERpdklEIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgPHA+CiAgICAgICAgICAgIFwkVGV4dHsiVGhlIGZpZWxkIGNvbnRlbnQgaXMgdG9vIGxvbmchIE1heGltdW0gc2l6ZSBpcyAkU2VsZi0+e01heExlbmd0aH0gY2hhcmFjdGVycy4ifQogICAgICAgIDwvcD4KICAgIDwvZGl2PgpFT0YKICAgIH0KCiAgICBpZiAoJEZpZWxkQ29uZmlnLT57RGlzcGxheUVycm9yc30pIHsKICAgIAlteSAkRGl2SUQgPSAkRmllbGROYW1lIC4gJ1dhcm5pbmcnOwogICAgCQogICAgCSMgZm9yIGNsaWVudCBzaWRlIHZhbGlkYXRpb24KICAgICAgICAkSFRNTFN0cmluZyAuPSA8PCJFT0YiOwoKICAgIDxkaXYgaWQ9IiREaXZJRCIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgIDxwPgogICAgICAgICAgICBcJFRleHR7IltEZWJ1ZyBtb2RlXSJ9CiAgICAgICAgPC9wPgogICAgPC9kaXY+CkVPRgogICAgfQoKICAgIGlmICggJFBhcmFte1NlcnZlckVycm9yfSApIHsKCiAgICAgICAgbXkgJEVycm9yTWVzc2FnZSA9ICRQYXJhbXtFcnJvck1lc3NhZ2V9IHx8ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLic7CiAgICAgICAgbXkgJERpdklEID0gJEZpZWxkTmFtZSAuICdTZXJ2ZXJFcnJvcic7CgogICAgICAgICMgZm9yIHNlcnZlciBzaWRlIHZhbGlkYXRpb24KICAgICAgICAkSFRNTFN0cmluZyAuPSA8PCJFT0YiOwogICAgPGRpdiBpZD0iJERpdklEIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgPHA+CiAgICAgICAgICAgIFwkVGV4dHsiJEVycm9yTWVzc2FnZSJ9CiAgICAgICAgPC9wPgogICAgPC9kaXY+CkVPRgogICAgfQoKICAgICMgY2FsbCBFZGl0TGFiZWxSZW5kZXIgb24gdGhlIGNvbW1vbiBiYWNrZW5kCiAgICBteSAkTGFiZWxTdHJpbmcgPSAkU2VsZi0+e0JhY2tlbmRDb21tb25PYmplY3R9LT5FZGl0TGFiZWxSZW5kZXIoCiAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LAogICAgICAgIE1hbmRhdG9yeSAgICAgICAgICA9PiAkUGFyYW17TWFuZGF0b3J5fSB8fCAnMCcsCiAgICAgICAgRmllbGROYW1lICAgICAgICAgID0+ICRGaWVsZE5hbWUsCiAgICApOwoKICAgIG15ICREYXRhID0gewogICAgICAgIEZpZWxkID0+ICRIVE1MU3RyaW5nLAogICAgICAgIExhYmVsID0+ICRMYWJlbFN0cmluZywKICAgIH07CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgRWRpdEZpZWxkVmFsdWVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRmllbGROYW1lID0gJ0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfTsKCiAgICBteSAkVmFsdWU7CgojICAgICMgY2hlY2sgaWYgdGhlcmUgaXMgYSBUZW1wbGF0ZSBhbmQgcmV0cmVpdmUgdGhlIGRpbmFsaWMgZmllbGQgdmFsdWUgZnJvbSB0aGVyZQojICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUZW1wbGF0ZX0gKSApIHsKIyAgICAgICAgJFZhbHVlID0gJFBhcmFte1RlbXBsYXRlfS0+eyRGaWVsZE5hbWV9OwojICAgIH0KIwojICAgICMgb3RoZXJ3aXNlIGdldCBkeW5hbWljIGZpZWxkIHZhbHVlIGZvcm0gcGFyYW0KIyAgICBlbHNlIHsKIyAgICAgICAgJFZhbHVlID0gJFBhcmFte1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRGaWVsZE5hbWUgKTsKIyAgICB9CgojICAgIGlmICggZGVmaW5lZCAkUGFyYW17UmV0dXJuVGVtcGxhdGVTdHJ1Y3R1cmV9ICYmICRQYXJhbXtSZXR1cm5UZW1wbGF0ZVN0cnVjdHVyZX0gZXEgJzEnICkgewojICAgICAgICByZXR1cm4gewojICAgICAgICAgICAgJEZpZWxkTmFtZSA9PiAkVmFsdWUsCiMgICAgICAgIH07CiMgICAgfQoKICAgICMgVVNFIEZPUiBERUJVR0dJTkcgUFVSUE9TRVMKbXkgJERFQlVHID0gMDsKICAgICMKIHVzZSBEYXRhOjpEdW1wZXI7Cm9wZW4gRVJSTE9HLCAnPj4vdG1wL1RBXycuJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfS4nLmxvZycgaWYgJERFQlVHOwojcHJpbnQgRVJSTE9HIER1bXBlcigkUGFyYW17UGFyYW1PYmplY3R9LT57UXVlcnl9LT57cGFyYW19KSBpZiAkREVCVUc7CgpwcmludCBFUlJMT0cgJFBhcmFte1BhcmFtT2JqZWN0fSBpZiAkREVCVUc7CiNjbG9zZSBFUlJMT0c7CgogICAgbXkgJHF1ZXJ5X25lZWRlZCA9IDA7CgogICAgbXkgQFNRTFBhcmFtZXRlcnNfdmFsdWVzOwogICAgbXkgQFNRTFBhcmFtZXRlcnNfdmFsdWVzX3JlZnM7CgogICAgbXkgQFNRTFBhcmFtZXRlcnNfa2V5cyA9IHNwbGl0KCcsJywgJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UGFyYW1ldGVyc30pOwoKICAgIG15ICVTUUxQYXJhbWV0ZXJzX2hhc2g7CiAgICBmb3IgbXkgJGtleSAoQFNRTFBhcmFtZXRlcnNfa2V5cykgewogICAgICAgICRTUUxQYXJhbWV0ZXJzX2hhc2h7JGtleX0gPSB1bmRlZjsKICAgIH0KCiAgICBpZiAoIHNjYWxhcihAU1FMUGFyYW1ldGVyc19rZXlzKSAmJiAkUGFyYW17UGFyYW1PYmplY3R9ICYmIGRlZmluZWQgJFBhcmFte1BhcmFtT2JqZWN0fSAmJiAkUGFyYW17UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJykgKSB7CiAgICAJbXkgJVRpY2tldEluZm87CiAgICAJIyBnZXQgVGlja2V0IGZyb20gY2FjaGU6CiAgICAJaWYgKCRQYXJhbXtMYXlvdXRPYmplY3R9LT57VGlja2V0T2JqZWN0fS0+eydDYWNoZTo6R2V0VGlja2V0Jy4kUGFyYW17UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyl9eycnfXsxfSkgewogICAgCQklVGlja2V0SW5mbyA9ICV7JFBhcmFte0xheW91dE9iamVjdH0tPntUaWNrZXRPYmplY3R9LT57J0NhY2hlOjpHZXRUaWNrZXQnLiRQYXJhbXtQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnKX17Jyd9ezF9fTsKICAgIAl9CiAgICAJZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgICAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkUGFyYW17UGFyYW1PYmplY3R9LT57Q29uZmlnT2JqZWN0fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRQYXJhbXtQYXJhbU9iamVjdH0tPntDb25maWdPYmplY3R9LAogICAgICAgICAgICAgICAgICAgIExvZ09iamVjdCAgICA9PiAkUGFyYW17UGFyYW1PYmplY3R9LT57TG9nT2JqZWN0fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJFBhcmFte1BhcmFtT2JqZWN0fS0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgICAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRQYXJhbXtQYXJhbU9iamVjdH0tPntMb2dPYmplY3R9LAogICAgICAgICAgICAgICAgICAgIE1haW5PYmplY3QgICA9PiAkUGFyYW17UGFyYW1PYmplY3R9LT57TWFpbk9iamVjdH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQtPm5ldygKICAgICAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgICAgICAgPT4gJFBhcmFte1BhcmFtT2JqZWN0fS0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgICAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbXtQYXJhbU9iamVjdH0tPntMb2dPYmplY3R9LAogICAgICAgICAgICAgICAgICAgIERCT2JqZWN0ICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFpbk9iamVjdCAgICAgICAgID0+ICRQYXJhbXtQYXJhbU9iamVjdH0tPntNYWluT2JqZWN0fSwKICAgICAgICAgICAgICAgICAgICBUaW1lT2JqZWN0ICAgICAgICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRW5jb2RlT2JqZWN0ICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJVRpY2tldEluZm8gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyksCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLCAgICAgICAgICMgT3B0aW9uYWwsIGRlZmF1bHQgMC4gVG8gaW5jbHVkZSB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZXMgZm9yIHRoaXMgdGlja2V0IG9uIHRoZSByZXR1cm4gc3RydWN0dXJlLgogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICk7CiAgICAJfQoKICAgIAlmb3IgbXkgJGtleSAoQFNRTFBhcmFtZXRlcnNfa2V5cykgewogICAgCQlpZiAoJGtleSBlcSAnU2VsZWN0ZWRDdXN0b21lclVzZXInKSB7CiAgICAJCQkkU1FMUGFyYW1ldGVyc19oYXNoeyRrZXl9ID0gJFRpY2tldEluZm97Q3VzdG9tZXJVc2VySUR9OwogICAgCQl9CiAgICAJCWVsc2UgewogICAgCQkJJFNRTFBhcmFtZXRlcnNfaGFzaHska2V5fSA9ICRUaWNrZXRJbmZveyRrZXl9OwogICAgCQl9CiAgICAJfQogICAgCXByaW50IEVSUkxPRyAiW0dvdCBUaWNrZXQgaW5mbzpdXG4iIGlmICRERUJVRzsKICAgIAlwcmludCBFUlJMT0cgRHVtcGVyKFwlVGlja2V0SW5mbykgaWYgJERFQlVHOwogICAgfSAKIAoKCiAgICBmb3IgbXkgJGtleSAoQFNRTFBhcmFtZXRlcnNfa2V5cykgewogICAgICAgICMgV1AgLSBCSU5JCiAgICAgICAgIyBGaXggcGVyIGVzdHJhcnJlIGkgdmFsb3JpIHB1bGl0aSBkYWkgcGFyYW1ldHJpIChlcy4gMnx8REFUTykKICAgICAgICAjIAoKCglpZiAoICRQYXJhbXtQYXJhbU9iamVjdH0tPntRdWVyeX0tPntwYXJhbX0tPnska2V5fVswXSApIHsKICAgICAgICAJJFBhcmFte1BhcmFtT2JqZWN0fS0+e1F1ZXJ5fS0+e3BhcmFtfS0+eyRrZXl9WzBdID1+IHMvXihbXnxdKylcfFx8KC4rKSQvJDEvOwogICAgICAgIAlwdXNoKEBTUUxQYXJhbWV0ZXJzX3ZhbHVlcywgJFBhcmFte1BhcmFtT2JqZWN0fS0+e1F1ZXJ5fS0+e3BhcmFtfS0+eyRrZXl9WzBdKTsKICAgICAgICAJcHVzaChAU1FMUGFyYW1ldGVyc192YWx1ZXNfcmVmcywgXCRQYXJhbXtQYXJhbU9iamVjdH0tPntRdWVyeX0tPntwYXJhbX0tPnska2V5fVswXSk7Cgl9IGVsc2lmICggJFNRTFBhcmFtZXRlcnNfaGFzaHska2V5fSApIHsKCQlwdXNoKEBTUUxQYXJhbWV0ZXJzX3ZhbHVlcywgICRTUUxQYXJhbWV0ZXJzX2hhc2h7JGtleX0pOwoJCXB1c2goQFNRTFBhcmFtZXRlcnNfdmFsdWVzX3JlZnMsIFwkU1FMUGFyYW1ldGVyc19oYXNoeyRrZXl9KTsKCX0KCgogICAgICAgIAogICAgICAgICMgV1AgLSBCSU5JIC0gZXg6IHB1c2goQFNRTFBhcmFtZXRlcnNfdmFsdWVzLCAkUGFyYW17UGFyYW1PYmplY3R9LT57UXVlcnl9LT57cGFyYW19LT57JGtleX1bMF0pOwogICAgICAgIAogICAgICAgICMgaWYgdGhlIGNoYW5nZWQgRWxlbWVudCBpcyBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIHVwZGF0ZSBkYXRhCiAgICAgICAgaWYgKCRQYXJhbXtQYXJhbU9iamVjdH0tPntRdWVyeX0tPntwYXJhbX0tPntFbGVtZW50Q2hhbmdlZH0gYW5kICRrZXkgZXEgJFBhcmFte1BhcmFtT2JqZWN0fS0+e1F1ZXJ5fS0+e3BhcmFtfS0+e0VsZW1lbnRDaGFuZ2VkfVswXSkgewogICAgICAgICAgICAgICAgJHF1ZXJ5X25lZWRlZCA9IDE7CiMgICAgICAgICAgICAgICAgcHJpbnQgRVJSTE9HICRrZXkuIiBlcSAiLiRQYXJhbXtQYXJhbU9iamVjdH0tPntRdWVyeX0tPntwYXJhbX0tPntFbGVtZW50Q2hhbmdlZH1bMF0uIlxuIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiMgICAgICAgICAgICAgICAgcHJpbnQgRVJSTE9HICRrZXkuIiBuZXEgIi4kUGFyYW17UGFyYW1PYmplY3R9LT57UXVlcnl9LT57cGFyYW19LT57RWxlbWVudENoYW5nZWR9WzBdLiJcbiI7CiAgICAgICAgfQogICAgfQoKICAgIAoKIyAgICBwcmludCBFUlJMT0cgRHVtcGVyKCRQYXJhbXtQYXJhbU9iamVjdH0pOwojICAgIHByaW50IEVSUkxPRyBVTklWRVJTQUw6OmlzYSgkUGFyYW17UGFyYW1PYmplY3R9LCAnSEFTSCcpLiIgRmllbGROYW1lOiAkRmllbGROYW1lXG4iOwojICAgIGNsb3NlIEVSUkxPRzsKCiAgICBwcmludCBFUlJMT0cgIkJ1aWxkaW5nIHZhbHVlXG4iIGlmICRERUJVRzsKCiAgICBpZiAoJFBhcmFte1BhcmFtT2JqZWN0fS0+e1F1ZXJ5fS0+e3BhcmFtfS0+eyRGaWVsZE5hbWV9ICYmICRQYXJhbXtQYXJhbU9iamVjdH0tPntRdWVyeX0tPntwYXJhbX0tPnskRmllbGROYW1lfVswXSkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtQYXJhbU9iamVjdH0tPntRdWVyeX0tPntwYXJhbX0tPnskRmllbGROYW1lfVswXTsKICAgIH0KCiMgICAgaWYgKCRxdWVyeV9uZWVkZWQgYW5kIDEpIHsKCgogICAgICAgICRWYWx1ZSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ1N0cmluZycsCiAgICAgICAgICAgIEtleSAgICAgPT4gc2NhbGFyIEBTUUxQYXJhbWV0ZXJzX3ZhbHVlcyA+IDAgPyAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e05hbWV9IC4gam9pbignJywgQFNRTFBhcmFtZXRlcnNfdmFsdWVzKSA6ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57TmFtZX0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCEkVmFsdWUpIHsKCgkgICAgcHJpbnQgRVJSTE9HICJEb2luZyBxdWVyeVxuIiBpZiAkREVCVUc7CgoJICAgIG15IEByb3c7CiAgICAgICAgICAgIG15ICRzdGg7CiAgICAgICAgICAgIG15ICRkYmg7CgoKCSAgICBteSAkY29tcGxldGVsaW5lOwoKICAgICAgICAgICAgIyB1c2UgbG9jYWwgREIgT2JqZWN0IGlmIG5vIERCSSBzdHJpbmcgaXMgc3BlY2lmaWVkLgogICAgICAgICAgICBpZiAoICEkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntEQklzdHJpbmd9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgICAgICAgICAgU1FMID0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1F1ZXJ5fSwKICAgICAgICAgICAgICAgICAgICBCaW5kID0+IFxAU1FMUGFyYW1ldGVyc192YWx1ZXNfcmVmcywKICAgICAgICAgICAgICAgICk7CiAgICAKICAgICAgICAgICAgICAgICNmZXRjaCBmaXJzdCByb3cKICAgICAgICAgICAgICAgIEByb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpOwogICAgCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZGJoID0gREJJLT5jb25uZWN0KCRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e0RCSXN0cmluZ30sICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e0RCSXVzZXJ9LCAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntEQklwYXNzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgUHJpbnRFcnJvciA9PiAwLCBBdXRvQ29tbWl0ID0+IDAgfSkgb3IgZGllOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgICRkYmgtPnsnbXlzcWxfZW5hYmxlX3V0ZjgnfSA9IDE7CiAgICAgICAgCiAgICAgICAgICAgICAgICAkc3RoID0gJGRiaC0+cHJlcGFyZSgkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntRdWVyeX0pOwogICAgICAgICAgICAgICAgJHN0aC0+ZXhlY3V0ZSggQFNRTFBhcmFtZXRlcnNfdmFsdWVzICk7CiAgICAgICAgCiAgICAgICAgICAgICAgICAjIGZldGNoIGZpcnN0IHJvdwogICAgICAgICAgICAgICAgQHJvdyA9ICRzdGgtPmZldGNocm93X2FycmF5OyAgICAgICAgCiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBwcmludCBFUlJMT0cgIjo6OkV4dHJhY3RlZCBmcm9tIERCOjo6XG4iIGlmICRERUJVRzsKICAgICAgICAgICAgcHJpbnQgRVJSTE9HIER1bXBlcihAcm93KSBpZiAkREVCVUc7CiAgICAgICAgICAgIHByaW50IEVSUkxPRyAiOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjpcbiIgaWYgJERFQlVHOwogICAgICAgICAgICBjbG9zZSBFUlJMT0cgaWYgJERFQlVHOwogICAgCiAgICAgICAgICAgICMgY2ljbGUgZmV0Y2hlZCByb3dzIGZyb20gREIKICAgICAgICAgICAgbXkgJGxpbmUgPSAnJzsKICAgICAgICAgICAgd2hpbGUgKEByb3cpIHsKCgkJbXkgJGNvdW50ZXIgPSAwOwogICAgICAgICAgICAgICAgbXkgQG5hbWVzID0gJHN0aC0+e05BTUV9OwoKICAgICAgICAgICAgICAgIGZvciBteSAkY29sIChAcm93KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF1dGY4Ojppc191dGY4KCRjb2wpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHV0Zjg6OmRlY29kZSggJGNvbCApOwogICAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgICAgICAgaWYgKCEkZmlyc3RSb3cpIHsgIyBza2lwIGZpcnN0IHJvdyAKIyAgICAgICAgICAgICAgICAgICAgICAgICRmaXJzdFJvdyA9IDE7CiMgICAgICAgICAgICAgICAgCW5leHQ7CiMgICAgICAgICAgICAgICAgICAgIH0KCgkJICAgIGlmICggISRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e0RCSXN0cmluZ30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRsaW5lIC49ICRjb2wuIlxuIjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIAkkbGluZSAuPSAkbmFtZXNbMF1bJGNvdW50ZXJdLiI6ICIuJGNvbC4iXG4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkY291bnRlciArPSAxOwogICAgICAgICAgICAgICAgfQogICAgCiMgICAgICAgICAgICAgICAgaWYgKCRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1N0b3JlVmFsdWV9ICYmICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1N0b3JlVmFsdWV9IGVxICIxIikgewojICAgICAgICAgICAgICAgICAgICAlUG9zc2libGVWYWx1ZXMgPSAoICVQb3NzaWJsZVZhbHVlcywgJHJvd1swXS4ifHwiLiRsaW5lID0+ICRsaW5lKTsKIyAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgZWxzZSB7CiMgICAgICAgICAgICAgICAgICAgICVQb3NzaWJsZVZhbHVlcyA9ICggJVBvc3NpYmxlVmFsdWVzLCAkcm93WzBdID0+ICRsaW5lICk7CiMgICAgICAgICAgICAgICAgfQoKIwkgCSRjb21wbGV0ZWxpbmUgLj0gJHJvd1swXSAuICI6ICIuICRsaW5lOwogICAKICAgICAgICAgICAgICAgICMgZmV0Y2ggbmV3IHJvdyBkZXBlbmRpbmcgb24gREIgY29ubmVjdGlvbiB0eXBlCiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntEQklzdHJpbmd9ICkgewogICAgICAgICAgICAgICAgICAgIEByb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQHJvdyA9ICRzdGgtPmZldGNocm93X2FycmF5OwogICAgCQlpZiAoIUByb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRiaC0+ZGlzY29ubmVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgIAoJICAgICRWYWx1ZSA9ICRsaW5lOyAgICAKICAgIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgICAgICAgICAgICBteSBAcm93OwojCSAgICBteSAkc3RoOwojCSAgICBteSAkZGJoOwojCiMgICAgICAgICAgICBteSAkbGluZSA9ICcnOwojCiMJICAgIGlmICggISRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e0RCSXN0cmluZ30gKSB7CiMgICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiMgICAgICAgICAgICAgICAgCVNRTCA9PiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntRdWVyeX0sCiMJICAgICAgICAgICAgICAgIEJpbmQgPT4gXEBTUUxQYXJhbWV0ZXJzX3ZhbHVlc19yZWZzLAojICAgICAgICAgICAgCSk7CiMKIyAgICAgICAgICAgICAgICAjZmV0Y2ggZmlyc3Qgcm93CiMJICAgICAgICBAcm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKTsKIwojICAgICAgICAgICAgICAgIHdoaWxlICggQHJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKIyAgICAKIyAgICAgICAgICAgICAgICAgICAgbXkgQG5hbWVzID0gJHN0aC0+e05BTUV9OwojICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJGNvbCAoQHJvdykgewojICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUgLj0gJG5hbWVzWzBdWyRjb3VudGVyXS4iOiAiLiRjb2wuIlxuIjsKIyAgICAgICAgICAgICAgICAgICAgICAgICRjb3VudGVyICs9IDE7CiMgICAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgICB9CiMKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGVsc2UgewojICAgICAgICAgICAgICAgICRkYmggPSBEQkktPmNvbm5lY3QoJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57REJJc3RyaW5nfSwgJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57REJJdXNlcn0sICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e0RCSXBhc3N9LAojICAgICAgICAgICAgICAgICAgICB7IFJhaXNlRXJyb3IgPT4gMSwgQXV0b0NvbW1pdCA9PiAwIH0pOwojICAgICAgICAgICAgICAgICRzdGggPSAkZGJoLT5wcmVwYXJlKCRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1F1ZXJ5fSk7CiMgICAgICAgICAgICAgICAgJHN0aC0+ZXhlY3V0ZSggQFNRTFBhcmFtZXRlcnNfdmFsdWVzICk7CiMgICAgIyAgICBTVEFNUEEgTEEgUVVFUlkKIyAgICAjICAgICRTZWxmLT57J0xvZ09iamVjdCd9LT5Mb2coCiMgICAgIyAgICAgICAgJ1ByaW9yaXR5JyA9PiAnbm90aWNlJywKIyAgICAjICAgICAgICAnTWVzc2FnZScgID0+ICIkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntRdWVyeX0iLAojICAgICMgICAgKTsKIyAgICAjCSAgICBteSAkZm91bmQgPSAkc3RoLT5mZXRjaCgpOwojICAgICMJICAgIHByaW50IEVSUkxPRyAiZm91bmQgJGZvdW5kIHJvd3NcbiIgaWYgJERFQlVHOwojICAgIAojICAgICAgICAgICAgICAgIG15ICRjb3VudGVyID0gMDsKIyAgICAKIwojICAgIAojICAgICAgICAgICAgICAgIHdoaWxlICggQHJvdyA9ICRzdGgtPmZldGNocm93X2FycmF5ICkgewojICAgIAojICAgICAgICAgICAgICAgICAgICBteSBAbmFtZXMgPSAkc3RoLT57TkFNRX07CiMgICAgICAgICAgICAgICAgICAgIGZvciBteSAkY29sIChAcm93KSB7CiMgICAgICAgICAgICAgICAgICAgICAgICAkbGluZSAuPSAkbmFtZXNbMF1bJGNvdW50ZXJdLiI6ICIuJGNvbC4iXG4iOwojICAgICAgICAgICAgICAgICAgICAgICAgJGNvdW50ZXIgKz0gMTsKIyAgICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgIH0KIwkgICAgfQogICAgCiMgICAgICAgICAgICAkVmFsdWUgPSAkbGluZTsKCQogICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ1N0cmluZycsCiAgICAgICAgICAgIAlLZXkJICAgID0+IHNjYWxhciBAU1FMUGFyYW1ldGVyc192YWx1ZXMgPiAwID8gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfSAuIGpvaW4oJycsIEBTUUxQYXJhbWV0ZXJzX3ZhbHVlcykgOiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e05hbWV9LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgVFRMICAgICAgICAgPT4gMzYwLAogICAgICAgICAgICApOwogICAgICAgIH0KCWVsc2UgewoJCXByaW50IEVSUkxPRyAiUXVlcnkgbm90IG5lZWRlZCwgdXNpbmcgY2FjaGVcbiIgaWYgJERFQlVHOwoJfQojICAgIH0KICAgIGNsb3NlIEVSUkxPRyBpZiAkREVCVUc7CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKc3ViIEVkaXRGaWVsZFZhbHVlVmFsaWRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0aGUgZmllbGQgdmFsdWUgZnJvbSB0aGUgaHR0cCByZXF1ZXN0CiAgICBteSAkVmFsdWUgPSAkU2VsZi0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LAogICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW17UGFyYW1PYmplY3R9LAoKICAgICAgICAjIG5vdCBuZWNlc3NhcnkgZm9yIHRoaXMgYmFja2VuZCBidXQgcGxhY2UgaXQgZm9yIGNvbnNpc3RlbmN5IHJlYXNvbnMKICAgICAgICBSZXR1cm5WYWx1ZVN0cnVjdHVyZSA9PiAxLAogICAgKTsKCiAgICBteSAkU2VydmVyRXJyb3I7CiAgICBteSAkRXJyb3JNZXNzYWdlOwoKICAgICMgcGVyZm9ybSBuZWNlc3NhcnkgdmFsaWRhdGlvbnMKICAgIGlmICggJFBhcmFte01hbmRhdG9yeX0gJiYgJFZhbHVlIGVxICcnICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9IDE7CiAgICB9CgogICAgaWYgKCBsZW5ndGggJFZhbHVlID4gJFNlbGYtPntNYXhMZW5ndGh9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9IDE7CiAgICAgICAgJEVycm9yTWVzc2FnZQogICAgICAgICAgICA9ICJUaGUgZmllbGQgY29udGVudCBpcyB0b28gbG9uZyEgTWF4aW11bSBzaXplIGlzICRTZWxmLT57TWF4TGVuZ3RofSBjaGFyYWN0ZXJzLiI7CiAgICB9CgogICAgIyBjcmVhdGUgcmVzdWx0aW5nIHN0cnVjdHVyZQogICAgbXkgJFJlc3VsdCA9IHsKICAgICAgICBTZXJ2ZXJFcnJvciAgPT4gJFNlcnZlckVycm9yLAogICAgICAgIEVycm9yTWVzc2FnZSA9PiAkRXJyb3JNZXNzYWdlLAogICAgfTsKCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKc3ViIERpc3BsYXlWYWx1ZVJlbmRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IEhUTUxPdXB1dCBhcyBkZWZhdWx0IGlmIG5vdCBzcGVjaWZpZWQKICAgIGlmICggIWRlZmluZWQgJFBhcmFte0hUTUxPdXRwdXR9ICkgewogICAgICAgICRQYXJhbXtIVE1MT3V0cHV0fSA9IDE7CiAgICB9CgogICAgIyBnZXQgcmF3IFRpdGxlIGFuZCBWYWx1ZSBzdHJpbmdzIGZyb20gZmllbGQgdmFsdWUKICAgIG15ICRWYWx1ZSA9IGRlZmluZWQgJFBhcmFte1ZhbHVlfSA/ICRQYXJhbXtWYWx1ZX0gOiAnJzsKICAgIG15ICRUaXRsZSA9ICRWYWx1ZTsKCiAgICAjIEhUTUxPdXB1dCB0cmFuc2Zvcm1hdGlvbnMKICAgIGlmICggJFBhcmFte0hUTUxPdXRwdXR9ICkgewoKICAgICAgICAkVmFsdWUgPSAkUGFyYW17TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICBNYXggICAgICAgICAgICA9PiAkUGFyYW17VmFsdWVNYXhDaGFyc30gfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgJFRpdGxlID0gJFBhcmFte0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgPT4gJFRpdGxlLAogICAgICAgICAgICBNYXggPT4gJFBhcmFte1RpdGxlTWF4Q2hhcnN9IHx8ICcnLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICRQYXJhbXtWYWx1ZU1heENoYXJzfSAmJiBsZW5ndGgoJFZhbHVlKSA+ICRQYXJhbXtWYWx1ZU1heENoYXJzfSApIHsKICAgICAgICAgICAgJFZhbHVlID0gc3Vic3RyKCAkVmFsdWUsIDAsICRQYXJhbXtWYWx1ZU1heENoYXJzfSApIC4gJy4uLic7CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFte1RpdGxlTWF4Q2hhcnN9ICYmIGxlbmd0aCgkVGl0bGUpID4gJFBhcmFte1RpdGxlTWF4Q2hhcnN9ICkgewogICAgICAgICAgICAkVGl0bGUgPSBzdWJzdHIoICRUaXRsZSwgMCwgJFBhcmFte1RpdGxlTWF4Q2hhcnN9ICkgLiAnLi4uJzsKICAgICAgICB9CiAgICB9CgogICAgIyB0aGlzIGZpZWxkIHR5cGUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgTGluayBGZWF0dXJlCiAgICBteSAkTGluazsKCiAgICAjIGNyZWF0ZSByZXR1cm4gc3RydWN0dXJlCiAgICBteSAkRGF0YSA9IHsKICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgVGl0bGUgPT4gJFRpdGxlLAogICAgICAgIExpbmsgID0+ICRMaW5rLAogICAgfTsKCiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBJc1NvcnRhYmxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDA7Cn0KCnN1YiBTZWFyY2hGaWVsZFJlbmRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdGFrZSBjb25maWcgZnJvbSBmaWVsZCBjb25maWcKICAgIG15ICRGaWVsZENvbmZpZyA9ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfTsKICAgIG15ICRGaWVsZE5hbWUgICA9ICdTZWFyY2hfRHluYW1pY0ZpZWxkXycgLiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e05hbWV9OwogICAgbXkgJEZpZWxkTGFiZWwgID0gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntMYWJlbH07CgogICAgIyBzZXQgdGhlIGZpZWxkIHZhbHVlCiAgICBteSAkVmFsdWUgPSAoIGRlZmluZWQgJFBhcmFte0RlZmF1bHRWYWx1ZX0gPyAkUGFyYW17RGVmYXVsdFZhbHVlfSA6ICcnICk7CgogICAgIyBnZXQgdGhlIGZpZWxkIHZhbHVlLCB0aGlzIGZ1Y3Rpb24gaXMgYWx3YXlzIGNhbGxlZCBhZnRlciB0aGUgcHJvZmlsZSBpcyBsb2FkZWQKICAgIG15ICRGaWVsZFZhbHVlID0gJFNlbGYtPlNlYXJjaEZpZWxkVmFsdWVHZXQoJVBhcmFtKTsKCiAgICAjIHNldCB2YWx1ZXMgZnJvbSBwcm9maWxlIGlmIHByZXNlbnQKICAgIGlmICggZGVmaW5lZCAkRmllbGRWYWx1ZSApIHsKICAgICAgICAkVmFsdWUgPSAkRmllbGRWYWx1ZTsKICAgIH0KCiAgICAjIGNoZWNrIGFuZCBzZXQgY2xhc3MgaWYgbmVjZXNzYXJ5CiAgICBteSAkRmllbGRDbGFzcyA9ICdEeW5hbWljRmllbGRUZXh0JzsKCiAgICBteSAkSFRNTFN0cmluZyA9IDw8IkVPRiI7CjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iJEZpZWxkQ2xhc3MiIGlkPSIkRmllbGROYW1lIiBuYW1lPSIkRmllbGROYW1lIiB0aXRsZT0iJEZpZWxkTGFiZWwiIHZhbHVlPSIkVmFsdWUiIC8+CkVPRgoKICAgICMgY2FsbCBFZGl0TGFiZWxSZW5kZXIgb24gdGhlIGNvbW1vbiBiYWNrZW5kCiAgICBteSAkTGFiZWxTdHJpbmcgPSAkU2VsZi0+e0JhY2tlbmRDb21tb25PYmplY3R9LT5FZGl0TGFiZWxSZW5kZXIoCiAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LAogICAgICAgIEZpZWxkTmFtZSAgICAgICAgICA9PiAkRmllbGROYW1lLAogICAgKTsKCiAgICBteSAkRGF0YSA9IHsKICAgICAgICBGaWVsZCA9PiAkSFRNTFN0cmluZywKICAgICAgICBMYWJlbCA9PiAkTGFiZWxTdHJpbmcsCiAgICB9OwoKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIFNlYXJjaEZpZWxkVmFsdWVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsdWU7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3JtIHBhcmFtIG9iamVjdAogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtQYXJhbU9iamVjdH0gKSB7CiAgICAgICAgJFZhbHVlID0gJFBhcmFte1BhcmFtT2JqZWN0fQogICAgICAgICAgICAtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VhcmNoX0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfSApOwogICAgfQoKICAgICMgb3RoZXJ3aXNlIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgcHJvZmlsZQogICAgZWxzaWYgKCBkZWZpbmVkICRQYXJhbXtQcm9maWxlfSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17UHJvZmlsZX0tPnsgJ1NlYXJjaF9EeW5hbWljRmllbGRfJyAuICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57TmFtZX0gfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1JldHVyblByb2ZpbGVTdHJ1Y3R1cmV9ICYmICRQYXJhbXtSZXR1cm5Qcm9maWxlU3RydWN0dXJlfSBlcSAxICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICdTZWFyY2hfRHluYW1pY0ZpZWxkXycgLiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e05hbWV9ID0+ICRWYWx1ZSwKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiAkVmFsdWU7Cgp9CgpzdWIgU2VhcmNoRmllbGRQYXJhbWV0ZXJCdWlsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGZpZWxkIHZhbHVlCiAgICBteSAkVmFsdWUgPSAkU2VsZi0+U2VhcmNoRmllbGRWYWx1ZUdldCglUGFyYW0pOwoKICAgIGlmICggISRWYWx1ZSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBQYXJhbWV0ZXIgPT4gewogICAgICAgICAgICAgICAgJ0xpa2UnID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEaXNwbGF5ID0+ICcnLAogICAgICAgICAgICB9CiAgICB9CgogICAgIyByZXR1cm4gc2VhcmNoIHBhcmFtZXRlciBzdHJ1Y3R1cmUKICAgIHJldHVybiB7CiAgICAgICAgUGFyYW1ldGVyID0+IHsKICAgICAgICAgICAgJ0xpa2UnID0+ICcqJyAuICRWYWx1ZSAuICcqJywKICAgICAgICB9LAogICAgICAgIERpc3BsYXkgPT4gJFZhbHVlLAogICAgfTsKfQoKc3ViIFN0YXRzRmllbGRQYXJhbWV0ZXJCdWlsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiB7CiAgICAgICAgTmFtZSAgICA9PiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0xhYmVsfSwKICAgICAgICBFbGVtZW50ID0+ICdEeW5hbWljRmllbGRfJyAuICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57TmFtZX0sCiAgICB9Owp9CgpzdWIgQ29tbW9uU2VhcmNoRmllbGRQYXJhbWV0ZXJCdWlsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPcGVyYXRvciA9ICdFcXVhbHMnOwogICAgbXkgJFZhbHVlICAgID0gJFBhcmFte1ZhbHVlfTsKCiAgICByZXR1cm4gewogICAgICAgICRPcGVyYXRvciA9PiAkVmFsdWUsCiAgICB9Owp9CgpzdWIgUmVhZGFibGVWYWx1ZVJlbmRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWx1ZSA9IGRlZmluZWQgJFBhcmFte1ZhbHVlfSA/ICRQYXJhbXtWYWx1ZX0gOiAnJzsKICAgIG15ICRUaXRsZSA9ICRWYWx1ZTsKCiAgICAjIGN1dCBzdHJpbmdzIGlmIG5lZWRlZAogICAgaWYgKCAkUGFyYW17VmFsdWVNYXhDaGFyc30gJiYgbGVuZ3RoKCRWYWx1ZSkgPiAkUGFyYW17VmFsdWVNYXhDaGFyc30gKSB7CiAgICAgICAgJFZhbHVlID0gc3Vic3RyKCAkVmFsdWUsIDAsICRQYXJhbXtWYWx1ZU1heENoYXJzfSApIC4gJy4uLic7CiAgICB9CiAgICBpZiAoICRQYXJhbXtUaXRsZU1heENoYXJzfSAmJiBsZW5ndGgoJFRpdGxlKSA+ICRQYXJhbXtUaXRsZU1heENoYXJzfSApIHsKICAgICAgICAkVGl0bGUgPSBzdWJzdHIoICRUaXRsZSwgMCwgJFBhcmFte1RpdGxlTWF4Q2hhcnN9ICkgLiAnLi4uJzsKICAgIH0KCiAgICAjIGNyZWF0ZSByZXR1cm4gc3RydWN0dXJlCiAgICBteSAkRGF0YSA9IHsKICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgVGl0bGUgPT4gJFRpdGxlLAogICAgfTsKCiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBUZW1wbGF0ZVZhbHVlVHlwZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRGaWVsZE5hbWUgPSAnRHluYW1pY0ZpZWxkXycgLiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e05hbWV9OwoKICAgICMgc2V0IHRoZSBmaWVsZCB0eXBlcwogICAgbXkgJEVkaXRWYWx1ZVR5cGUgICA9ICdTQ0FMQVInOwogICAgbXkgJFNlYXJjaFZhbHVlVHlwZSA9ICdTQ0FMQVInOwoKICAgICMgcmV0dXJuIHRoZSBjb3JyZWN0IHN0cnVjdHVyZQogICAgaWYgKCAkUGFyYW17RmllbGRUeXBlfSBlcSAnRWRpdCcgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJEZpZWxkTmFtZSA9PiAkRWRpdFZhbHVlVHlwZSwKICAgICAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17RmllbGRUeXBlfSBlcSAnU2VhcmNoJyApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnU2VhcmNoXycgLiAkRmllbGROYW1lID0+ICRTZWFyY2hWYWx1ZVR5cGUsCiAgICAgICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICRGaWVsZE5hbWUgICAgICAgICAgICAgPT4gJEVkaXRWYWx1ZVR5cGUsCiAgICAgICAgICAgICdTZWFyY2hfJyAuICRGaWVsZE5hbWUgPT4gJFNlYXJjaFZhbHVlVHlwZSwKICAgICAgICAgICAgfQogICAgfQp9CgpzdWIgSXNBSkFYVXBkYXRlYWJsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAwOwp9CgpzdWIgUmFuZG9tVmFsdWVTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsdWUgPSBpbnQoIHJhbmQoNTAwKSApOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPlZhbHVlU2V0KAogICAgICAgICVQYXJhbSwKICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgVmFsdWUgICA9PiAkVmFsdWUsCiAgICB9Owp9CgpzdWIgSXNNYXRjaGFibGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKc3ViIE9iamVjdE1hdGNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEZpZWxkTmFtZSA9ICdEeW5hbWljRmllbGRfJyAuICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57TmFtZX07CgogICAgIyByZXR1cm4gZmFsc2UgaWYgbm90IG1hdGNoCiAgICBpZiAoICRQYXJhbXtPYmplY3RBdHRyaWJ1dGVzfS0+eyRGaWVsZE5hbWV9IG5lICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBBSkFYUG9zc2libGVWYWx1ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG5vdCBzdXBwb3J0ZWQKICAgIHJldHVybjsKfQoKc3ViIEhpc3RvcmljYWxWYWx1ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBoaXN0b3JpY2FsIHZhbHVlcyBmcm9tIGRhdGFiYXNlCiAgICBteSAkSGlzdG9yaWNhbFZhbHVlcyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkVmFsdWVPYmplY3R9LT5IaXN0b3JpY2FsVmFsdWVHZXQoCiAgICAgICAgRmllbGRJRCAgID0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57SUR9LAogICAgICAgIFZhbHVlVHlwZSA9PiAnVGV4dCcsCiAgICApOwoKICAgICMgcmV0cnVuIHRoZSBoaXN0b3JpY2FsIHZhbHVlcyBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gJEhpc3RvcmljYWxWYWx1ZXM7Cn0KCgpzdWIgVmFsdWVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsdWUgPSBkZWZpbmVkICRQYXJhbXtLZXl9ID8gJFBhcmFte0tleX0gOiAnJzsKCiAgICAjIGdldCByZWFsIHZhbHVlcwogICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9OwoKICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhIHJlYWwgdmFsdWUgZm9yIHRoaXMga2V5IChvdGhlcndpc2Uga2VlcCB0aGUga2V5KQogICAgICAgIGlmICggJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9LT57JFZhbHVlfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHJlYWRlYWJsZSB2YWx1ZQogICAgICAgICAgICAkVmFsdWUgPSAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30tPnskVmFsdWV9OwoKICAgICAgICAgICAgIyBjaGVjayBpZiB0cmFuc2xhdGlvbiBpcyBwb3NzaWJsZQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgdHJhbnNsYXRlIHZhbHVlCiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkUGFyYW17TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFZhbHVlOwp9CgoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokJAoKPWN1dAo=</File>
<File Location="Custom/Kernel/System/DynamicField/Backend/MultiselectFromDB.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vRHluYW1pY0ZpZWxkL0JhY2tlbmQvTXVsdGlzZWxlY3QucG0gLSBEZWxlZ2F0ZSBmb3IgRHluYW1pY0ZpZWxkIE11bHRpc2VsZWN0IGJhY2tlbmQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMiBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE11bHRpc2VsZWN0LnBtLHYgMS41MS4yLjEgMjAxMi8wNS8yOCAyMjo0Mzo0MCBjciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kOjpNdWx0aXNlbGVjdEZyb21EQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQ6OkJhY2tlbmRDb21tb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kOjpEcm9wZG93bkZyb21EQjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNTEuMi4xICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kOjpNdWx0aXNlbGVjdAoKPWhlYWQxIFNZTk9QU0lTCgpEeW5hbWljRmllbGRzIE11bHRpc2VsZWN0IGJhY2tlbmQgZGVsZWdhdGUKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgpUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIG9mIEw8S2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZD4uClBsZWFzZSBsb29rIHRoZXJlIGZvciBhIGRldGFpbGVkIHJlZmVyZW5jZSBvZiB0aGUgZnVuY3Rpb25zLgoKPW92ZXIgNAoKPWl0ZW0gbmV3KCkKCnVzdWFsbHksIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzCmJ5IHVzaW5nIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQtPm5ldygpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QpKSB7CiAgICAgICAgZGllICJHb3Qgbm8gJE5lZWRlZCEiIGlmICEkUGFyYW17JE5lZWRlZH07CgogICAgICAgICRTZWxmLT57JE5lZWRlZH0gPSAkUGFyYW17JE5lZWRlZH07CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZFZhbHVlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntCYWNrZW5kQ29tbW9uT2JqZWN0fQogICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDo6QmFja2VuZENvbW1vbi0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntCYWNrZW5kRHJvcGRvd25Gcm9tREJ9CiAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kOjpEcm9wZG93bkZyb21EQi0+bmV3KCAleyRTZWxmfSwgJVBhcmFtICk7CgoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFZhbHVlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERGVmFsdWUgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZFZhbHVlT2JqZWN0fS0+VmFsdWVHZXQoCiAgICAgICAgRmllbGRJRCAgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntJRH0sCiAgICAgICAgT2JqZWN0SUQgPT4gJFBhcmFte09iamVjdElEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkREZWYWx1ZTsKICAgIHJldHVybiBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCRERlZhbHVlKTsKICAgIHJldHVybiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRERlZhbHVlLT5bMF0gKTsKCiAgICAjIGV4dHJhY3QgcmVhbCB2YWx1ZXMKICAgIG15IEBSZXR1cm5EYXRhOwogICAgZm9yIG15ICRJdGVtICggQHskREZWYWx1ZX0gKSB7CiAgICAgICAgcHVzaCBAUmV0dXJuRGF0YSwgJEl0ZW0tPntWYWx1ZVRleHR9CiAgICB9CgogICAgcmV0dXJuIFxAUmV0dXJuRGF0YTsKfQoKc3ViIFZhbHVlU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBmb3IgdmFsaWQgcG9zc2libGUgdmFsdWVzIGxpc3QKIyAgICBpZiAoICEkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30gKSB7CiMgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAojICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKIyAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFBvc3NpYmxlVmFsdWVzIGluIER5bmFtaWNGaWVsZENvbmZpZyEiLAojICAgICAgICApOwojICAgICAgICByZXR1cm47CiMgICAgfQoKICAgICMgY2hlY2sgdmFsdWUKICAgIG15IEBWYWx1ZXM7CiAgICBpZiAoIHJlZiAkUGFyYW17VmFsdWV9IGVxICdBUlJBWScgKSB7CiAgICAgICAgQFZhbHVlcyA9IEB7ICRQYXJhbXtWYWx1ZX0gfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEBWYWx1ZXMgPSAoICRQYXJhbXtWYWx1ZX0gKTsKICAgIH0KCiAgICBteSBAVmFsdWVUZXh0OwogICAgZm9yIG15ICRJdGVtIChAVmFsdWVzKSB7CiAgICAgICAgcHVzaCBAVmFsdWVUZXh0LCB7IFZhbHVlVGV4dCA9PiAkSXRlbSB9OwogICAgfQoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntEeW5hbWljRmllbGRWYWx1ZU9iamVjdH0tPlZhbHVlU2V0KAogICAgICAgIEZpZWxkSUQgID0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57SUR9LAogICAgICAgIE9iamVjdElEID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgVmFsdWUgICAgPT4gXEBWYWx1ZVRleHQsCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKc3ViIFZhbHVlRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZFZhbHVlT2JqZWN0fS0+VmFsdWVEZWxldGUoCiAgICAgICAgRmllbGRJRCAgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntJRH0sCiAgICAgICAgT2JqZWN0SUQgPT4gJFBhcmFte09iamVjdElEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRTdWNjZXNzOwp9CgpzdWIgQWxsVmFsdWVzRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZFZhbHVlT2JqZWN0fS0+QWxsVmFsdWVzRGVsZXRlKAogICAgICAgIEZpZWxkSUQgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntJRH0sCiAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRTdWNjZXNzOwp9CgpzdWIgVmFsdWVWYWxpZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKIyAgICAjIGNoZWNrIHZhbHVlCiMgICAgbXkgQFZhbHVlczsKIyAgICBpZiAoIElzQXJyYXloUmVmV2l0aERhdGEoICRQYXJhbXtWYWx1ZX0gKSApIHsKIyAgICAgICAgQFZhbHVlcyA9IEB7ICRQYXJhbXtWYWx1ZX0gfTsKIyAgICB9CiMgICAgZWxzZSB7CiMgICAgICAgIEBWYWx1ZXMgPSAoICRQYXJhbXtWYWx1ZX0gKTsKIyAgICB9CiMKIyAgICBteSAkU3VjY2VzczsKIyAgICBmb3IgbXkgJEl0ZW0gKEBWYWx1ZXMpIHsKIwojICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkVmFsdWVPYmplY3R9LT5WYWx1ZVZhbGlkYXRlKAojICAgICAgICAgICAgVmFsdWUgPT4gewojICAgICAgICAgICAgICAgIFZhbHVlVGV4dCA9PiAkSXRlbSwKIyAgICAgICAgICAgIH0sCiMgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0KIyAgICAgICAgKTsKIyAgICAgICAgcmV0dXJuIGlmICEkU3VjY2VzcwojICAgIH0KIyAgICByZXR1cm4gJFN1Y2Nlc3M7CiAgICByZXR1cm4gMTsKfQoKc3ViIFNlYXJjaFNRTEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVPcGVyYXRvcnMgPSAoCiAgICAgICAgRXF1YWxzICAgICAgICAgICAgPT4gJz0nLAogICAgICAgIEdyZWF0ZXJUaGFuICAgICAgID0+ICc+JywKICAgICAgICBHcmVhdGVyVGhhbkVxdWFscyA9PiAnPj0nLAogICAgICAgIFNtYWxsZXJUaGFuICAgICAgID0+ICc8JywKICAgICAgICBTbWFsbGVyVGhhbkVxdWFscyA9PiAnPD0nLAogICAgKTsKCiAgICBpZiAoICRPcGVyYXRvcnN7ICRQYXJhbXtPcGVyYXRvcn0gfSApIHsKICAgICAgICBteSAkU1FMID0gIiAkUGFyYW17VGFibGVBbGlhc30udmFsdWVfdGV4dCAkT3BlcmF0b3JzeyRQYXJhbXtPcGVyYXRvcn19ICciOwogICAgICAgICRTUUwgLj0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17U2VhcmNoVGVybX0gKSAuICInICI7CiAgICAgICAgcmV0dXJuICRTUUw7CiAgICB9CgogICAgaWYgKCAkUGFyYW17T3BlcmF0b3J9IGVxICdMaWtlJyApIHsKCiAgICAgICAgbXkgJFNRTCA9ICRTZWxmLT57REJPYmplY3R9LT5RdWVyeUNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgPT4gIiRQYXJhbXtUYWJsZUFsaWFzfS52YWx1ZV90ZXh0IiwKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1NlYXJjaFRlcm19LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU1FMOwogICAgfQoKICAgICRTZWxmLT57J0xvZ09iamVjdCd9LT5Mb2coCiAgICAgICAgJ1ByaW9yaXR5JyA9PiAnZXJyb3InLAogICAgICAgICdNZXNzYWdlJyAgPT4gIlVuc3VwcG9ydGVkIE9wZXJhdG9yICRQYXJhbXtPcGVyYXRvcn0iLAogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBTZWFyY2hTUUxPcmRlckZpZWxkR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICIkUGFyYW17VGFibGVBbGlhc30udmFsdWVfdGV4dCI7Cn0KCnN1YiBFZGl0RmllbGRSZW5kZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRha2UgY29uZmlnIGZyb20gZmllbGQgY29uZmlnCiAgICBteSAkRmllbGRDb25maWcgPSAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0NvbmZpZ307CiAgICBteSAkRmllbGROYW1lICAgPSAnRHluYW1pY0ZpZWxkXycgLiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e05hbWV9OwogICAgbXkgJEZpZWxkTGFiZWwgID0gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntMYWJlbH07CgogICAgbXkgJFZhbHVlID0gJyc7CgogICAgIyBzZXQgdGhlIGZpZWxkIHZhbHVlIG9yIGRlZmF1bHQKICAgIGlmICggJFBhcmFte1VzZURlZmF1bHRWYWx1ZX0gKSB7CiAgICAgICAgJFZhbHVlID0gKCBkZWZpbmVkICRGaWVsZENvbmZpZy0+e0RlZmF1bHRWYWx1ZX0gPyAkRmllbGRDb25maWctPntEZWZhdWx0VmFsdWV9IDogJycgKTsKICAgIH0KICAgICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX0gaWYgZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgICNkIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZm9ybSB0aGUgd2ViIHJlcXVlc3QKICAgIG15ICRGaWVsZFZhbHVlID0gJFNlbGYtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgIyBzZXQgdmFsdWVzIGZyb20gUGFyYW1PYmplY3QgaWYgcHJlc2VudAogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJEZpZWxkVmFsdWUpICkgewogICAgICAgICRWYWx1ZSA9ICRGaWVsZFZhbHVlOwogICAgfQoKICAgICMgY2hlY2sgYW5kIHNldCBjbGFzcyBpZiBuZWNlc3NhcnkKICAgIG15ICRGaWVsZENsYXNzID0gJ0R5bmFtaWNGaWVsZFRleHQnOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtDbGFzc30gJiYgJFBhcmFte0NsYXNzfSBuZSAnJyApIHsKICAgICAgICAkRmllbGRDbGFzcyAuPSAnICcgLiAkUGFyYW17Q2xhc3N9OwogICAgfQoKICAgICMgc2V0IGZpZWxkIGFzIG1hbmRhdG9yeQogICAgJEZpZWxkQ2xhc3MgLj0gJyBWYWxpZGF0ZV9SZXF1aXJlZCcgaWYgJFBhcmFte01hbmRhdG9yeX07CgogICAgIyBzZXQgZXJyb3IgY3NzIGNsYXNzCiAgICAkRmllbGRDbGFzcyAuPSAnIFNlcnZlckVycm9yJyBpZiAkUGFyYW17U2VydmVyRXJyb3J9OwoKICAgICMgc2V0IFBvc3NpYmxlVmFsdWVzCiAgICBteSAkU2VsZWN0aW9uRGF0YSA9ICRGaWVsZENvbmZpZy0+e1Bvc3NpYmxlVmFsdWVzfTsKCiAgICAjIHVzZSBQb3NzaWJsZVZhbHVlc0ZpbHRlciBpZiBkZWZpbmVkCiAgICAkU2VsZWN0aW9uRGF0YSA9ICRQYXJhbXtQb3NzaWJsZVZhbHVlc0ZpbHRlcn0KICAgICAgICBpZiBkZWZpbmVkICRQYXJhbXtQb3NzaWJsZVZhbHVlc0ZpbHRlcn07CgogICAgIyBjaGVjayB2YWx1ZQogICAgbXkgQFZhbHVlczsKICAgIGlmICggcmVmICRWYWx1ZSBlcSAnQVJSQVknICkgewogICAgICAgIEBWYWx1ZXMgPSBAeyRWYWx1ZX07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAVmFsdWVzID0gKCRWYWx1ZSk7CiAgICB9CgogICAgIyBzZXQgUG9zc2libGVOb25lIGF0dHJpYnV0ZQogICAgbXkgJEZpZWxkUG9zc2libGVOb25lOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtPdmVycmlkZVBvc3NpYmxlTm9uZX0gKSB7CiAgICAgICAgJEZpZWxkUG9zc2libGVOb25lID0gJFBhcmFte092ZXJyaWRlUG9zc2libGVOb25lfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRGaWVsZFBvc3NpYmxlTm9uZSA9ICRGaWVsZENvbmZpZy0+e1Bvc3NpYmxlTm9uZX0gfHwgMDsKICAgIH0KCiAgICBteSAkSFRNTFN0cmluZyA9ICRQYXJhbXtMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+ICRTZWxlY3Rpb25EYXRhIHx8IHt9LAogICAgICAgIE5hbWUgPT4gJEZpZWxkTmFtZSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gXEBWYWx1ZXMsCiAgICAgICAgVHJhbnNsYXRpb24gID0+ICRGaWVsZENvbmZpZy0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJEZpZWxkUG9zc2libGVOb25lLAogICAgICAgIENsYXNzICAgICAgICA9PiAkRmllbGRDbGFzcywKICAgICAgICBIVE1MUXVvdGUgICAgPT4gMSwKICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICk7CiAgICAKICAgIGlmICgkRmllbGRDb25maWctPntEaXNwbGF5RXJyb3JzfSkgewogICAgCW15ICREaXZJRCA9ICRGaWVsZE5hbWUgLiAnV2FybmluZyc7CiAgICAJCiAgICAJIyBmb3IgY2xpZW50IHNpZGUgdmFsaWRhdGlvbgogICAgICAgICRIVE1MU3RyaW5nIC49IDw8IkVPRiI7CgogICAgPGRpdiBpZD0iJERpdklEIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgPHA+CiAgICAgICAgICAgIFwkVGV4dHsiW0RlYnVnIG1vZGVdIn0KICAgICAgICA8L3A+CiAgICA8L2Rpdj4KRU9GCiAgICB9CgogICAgaWYgKCAkUGFyYW17TWFuZGF0b3J5fSApIHsKICAgICAgICBteSAkRGl2SUQgPSAkRmllbGROYW1lIC4gJ0Vycm9yJzsKCiAgICAgICAgIyBmb3IgY2xpZW50IHNpZGUgdmFsaWRhdGlvbgogICAgICAgICRIVE1MU3RyaW5nIC49IDw8IkVPRiI7CgogICAgPGRpdiBpZD0iJERpdklEIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgPHA+CiAgICAgICAgICAgIFwkVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifQogICAgICAgIDwvcD4KICAgIDwvZGl2PgpFT0YKICAgIH0KCiAgICBpZiAoICRQYXJhbXtTZXJ2ZXJFcnJvcn0gKSB7CgogICAgICAgIG15ICRFcnJvck1lc3NhZ2UgPSAkUGFyYW17RXJyb3JNZXNzYWdlfSB8fCAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4nOwogICAgICAgIG15ICREaXZJRCA9ICRGaWVsZE5hbWUgLiAnU2VydmVyRXJyb3InOwoKICAgICAgICAjIGZvciBzZXJ2ZXIgc2lkZSB2YWxpZGF0aW9uCiAgICAgICAgJEhUTUxTdHJpbmcgLj0gPDwiRU9GIjsKICAgIDxkaXYgaWQ9IiREaXZJRCIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgIDxwPgogICAgICAgICAgICBcJFRleHR7IiRFcnJvck1lc3NhZ2UifQogICAgICAgIDwvcD4KICAgIDwvZGl2PgpFT0YKICAgIH0KCiAgICBpZiAoICRQYXJhbXtBSkFYVXBkYXRlfSApIHsKCiAgICAgICAgbXkgJEZpZWxkU2VsZWN0b3IgPSAnIycgLiAkRmllbGROYW1lOwoKICAgICAgICBteSAkRmllbGRzVG9VcGRhdGU7CiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtVcGRhdGFibGVGaWVsZHN9ICkgKSB7CiAgICAgICAgICAgIG15ICRGaXJzdEl0ZW0gPSAxOwogICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRQYXJhbXtVcGRhdGFibGVGaWVsZHN9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCBlcSAkRmllbGROYW1lOwogICAgICAgICAgICAgICAgaWYgKCRGaXJzdEl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAkRmlyc3RJdGVtID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRGaWVsZHNUb1VwZGF0ZSAuPSAnLCAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEZpZWxkc1RvVXBkYXRlIC49ICInIiAuICRGaWVsZCAuICInIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgI2FkZCBqcyB0byBjYWxsIEZvcm1VcGRhdGUoKQogICAgICAgICRIVE1MU3RyaW5nIC49IDw8IkVPRiI7CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBcJCgnJEZpZWxkU2VsZWN0b3InKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZShcJCh0aGlzKS5wYXJlbnRzKCdmb3JtJyksICdBSkFYVXBkYXRlJywgJyRGaWVsZE5hbWUnLCBbICRGaWVsZHNUb1VwZGF0ZSBdKTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CkVPRgogICAgfQoKICAgIGlmICggJFBhcmFte1N1Ym1pdE9uQ2hhbmdlfSApIHsKCiAgICAgICAgbXkgJEZpZWxkU2VsZWN0b3IgPSAnIycgLiAkRmllbGROYW1lOwoKICAgICAgICAjYWRkIGpzIHRvIGRpc2FibGUgdmFsaWRhdGlvbiBhbmQgZG8gc3VibWl0KCkKICAgICAgICAkSFRNTFN0cmluZyAuPSA8PCJFT0YiOwo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgXCQoJyRGaWVsZFNlbGVjdG9yJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSB0aWNrZXQgaXMgbm90IHlldCBjcmVhdGVkIG9uIHF1ZXVlIGNoYW5nZQogICAgICAgIFwkKCdpbnB1dCNFeHBhbmQnKS52YWwoMSk7CiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKFwkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKSk7CiAgICAgICAgXCQodGhpcykuY2xvc2VzdCgnZm9ybScpLnN1Ym1pdCgpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KRU9GCiAgICB9CgogICAgIyBjYWxsIEVkaXRMYWJlbFJlbmRlciBvbiB0aGUgY29tbW9uIGJhY2tlbmQKICAgIG15ICRMYWJlbFN0cmluZyA9ICRTZWxmLT57QmFja2VuZENvbW1vbk9iamVjdH0tPkVkaXRMYWJlbFJlbmRlcigKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30sCiAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRQYXJhbXtNYW5kYXRvcnl9IHx8ICcwJywKICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgPT4gJEZpZWxkTmFtZSwKICAgICk7CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgRmllbGQgPT4gJEhUTUxTdHJpbmcsCiAgICAgICAgTGFiZWwgPT4gJExhYmVsU3RyaW5nLAogICAgfTsKCiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBFZGl0RmllbGRWYWx1ZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRGaWVsZE5hbWUgPSAnRHluYW1pY0ZpZWxkXycgLiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e05hbWV9OwoKICAgIG15ICRWYWx1ZTsKCiAgICAjIGNoZWNrIGlmIHRoZXJlIGlzIGEgVGVtcGxhdGUgYW5kIHJldHJlaXZlIHRoZSBkaW5hbGljIGZpZWxkIHZhbHVlIGZyb20gdGhlcmUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUZW1wbGF0ZX0gKSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17VGVtcGxhdGV9LT57JEZpZWxkTmFtZX07CiAgICB9CgogICAgIyBvdGhlcndpc2UgZ2V0IGR5bmFtaWMgZmllbGQgdmFsdWUgZm9ybSBwYXJhbQogICAgZWxzZSB7CiAgICAgICAgbXkgQERhdGEgPSAkUGFyYW17UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJEZpZWxkTmFtZSApOwoKICAgICAgICAkVmFsdWUgPSBcQERhdGE7CiAgICB9CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtSZXR1cm5UZW1wbGF0ZVN0cnVjdHVyZX0gJiYgJFBhcmFte1JldHVyblRlbXBsYXRlU3RydWN0dXJlfSBlcSAxICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICRGaWVsZE5hbWUgPT4gJFZhbHVlLAogICAgICAgIH07CiAgICB9CgogICAgIyBmb3IgdGhpcyBmaWVsZCB0aGUgbm9ybWFsIHJldHVybiBhbiB0aGUgUmV0dXJuVmFsdWVTdHJ1Y3R1cmUgYXJlIHRoZSBzYW1lCiAgICByZXR1cm4gJFZhbHVlOwp9CgpzdWIgRWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRoZSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBodHRwIHJlcXVlc3QKICAgIG15ICRWYWx1ZXMgPSAkU2VsZi0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LAogICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW17UGFyYW1PYmplY3R9LAoKICAgICAgICAjIG5vdCBuZWNlc3NhcnkgZm9yIHRoaXMgYmFja2VuZCBidXQgcGxhY2UgaXQgZm9yIGNvbnNpc3RlbmN5IHJlYXNvbnMKICAgICAgICBSZXR1cm5WYWx1ZVN0cnVjdHVyZSA9PiAxLAogICAgKTsKCiAgICBteSAkU2VydmVyRXJyb3I7CiAgICBteSAkRXJyb3JNZXNzYWdlOwoKIyAgICAjIHBlcmZvcm0gbmVjZXNzYXJ5IHZhbGlkYXRpb25zCiMgICAgaWYgKCAkUGFyYW17TWFuZGF0b3J5fSAmJiAhSXNBcnJheVJlZldpdGhEYXRhKCRWYWx1ZXMpICkgewojICAgICAgICByZXR1cm4gewojICAgICAgICAgICAgU2VydmVyRXJyb3IgPT4gMSwKIyAgICAgICAgfTsKIyAgICB9CiMgICAgZWxzZSB7CiMKIyAgICAgICAgIyBnZXQgcG9zc2libGUgdmFsdWVzIGxpc3QKIyAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9OwojCiMgICAgICAgICMgb3ZlcndyaXRlIHBvc3NpYmxlIHZhbHVlcyBpZiBQb3NzaWJsZVZhbHVlc0ZpbHRlcgojICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte1Bvc3NpYmxlVmFsdWVzRmlsdGVyfSApIHsKIyAgICAgICAgICAgICRQb3NzaWJsZVZhbHVlcyA9ICRQYXJhbXtQb3NzaWJsZVZhbHVlc0ZpbHRlcn0KIyAgICAgICAgfQojCiMgICAgICAgICMgdmFsaWRhdGUgaWYgdmFsdWUgaXMgaW4gcG9zc2libGUgdmFsdWVzIGxpc3QgKGJ1dCBsZXQgcGFzcyBlbXB0eSB2YWx1ZXMpCiMgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JFZhbHVlc30gKSB7CiMgICAgICAgICAgICBpZiAoICEkUG9zc2libGVWYWx1ZXMtPnskSXRlbX0gKSB7CiMgICAgICAgICAgICAgICAgJFNlcnZlckVycm9yICA9IDE7CiMgICAgICAgICAgICAgICAgJEVycm9yTWVzc2FnZSA9ICdUaGUgZmllbGQgY29udGVudCBpcyBpbnZhbGlkJzsKIyAgICAgICAgICAgIH0KIyAgICAgICAgfQojICAgIH0KCiAgICAjIGNyZWF0ZSByZXN1bHRpbmcgc3RydWN0dXJlCiAgICBteSAkUmVzdWx0ID0gewogICAgICAgIFNlcnZlckVycm9yICA9PiAkU2VydmVyRXJyb3IsCiAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRFcnJvck1lc3NhZ2UsCiAgICB9OwoKICAgIHJldHVybiAkUmVzdWx0Owp9CgpzdWIgRGlzcGxheVZhbHVlUmVuZGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgSFRNTE91cHV0IGFzIGRlZmF1bHQgaWYgbm90IHNwZWNpZmllZAogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17SFRNTE91dHB1dH0gKSB7CiAgICAgICAgJFBhcmFte0hUTUxPdXRwdXR9ID0gMTsKICAgIH0KCiAgICAjIHNldCBWYWx1ZSBhbmQgVGl0bGUgdmFyaWFibGVzCiAgICBteSAkVmFsdWUgICAgICAgICA9ICcnOwogICAgbXkgJFRpdGxlICAgICAgICAgPSAnJzsKICAgIG15ICRWYWx1ZU1heENoYXJzID0gJFBhcmFte1ZhbHVlTWF4Q2hhcnN9IHx8ICcnOwogICAgbXkgJFRpdGxlTWF4Q2hhcnMgPSAkUGFyYW17VGl0bGVNYXhDaGFyc30gfHwgJyc7CgogICAgIyBjaGVjayB2YWx1ZQogICAgbXkgQFZhbHVlczsKICAgIGlmICggcmVmICRQYXJhbXtWYWx1ZX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICBAVmFsdWVzID0gQHsgJFBhcmFte1ZhbHVlfSB9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQFZhbHVlcyA9ICggJFBhcmFte1ZhbHVlfSApOwogICAgfQoKICAgICMgZ2V0IHJlYWwgdmFsdWVzCiAgICBteSAkUG9zc2libGVWYWx1ZXMgICAgID0gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9OwogICAgbXkgJFRyYW5zbGF0YWJsZVZhbHVlcyA9ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc307CgogICAgbXkgQFJlYWRhYmxlVmFsdWVzOwogICAgbXkgQFJlYWRhYmxlVGl0bGVzOwoKICAgIG15ICRTaG93VmFsdWVFbGxpcHNpczsKICAgIG15ICRTaG93VGl0bGVFbGxpcHNpczsKCiAgICBWQUxVRUlURU06CiAgICBmb3IgbXkgJEl0ZW0gKEBWYWx1ZXMpIHsKICAgICAgICBuZXh0IFZBTFVFSVRFTSBpZiAhJEl0ZW07CgogICAgICAgIG15ICRSZWFkYWJsZVZhbHVlID0gJEl0ZW07CgoJJFJlYWRhYmxlVmFsdWUgPX4gcy9eKFtefF0rKVx8XHwoLispJC8kMi87CgogICAgICAgIGlmICggJFBvc3NpYmxlVmFsdWVzLT57JEl0ZW19ICkgewogICAgICAgICAgICAkUmVhZGFibGVWYWx1ZSA9ICRQb3NzaWJsZVZhbHVlcy0+eyRJdGVtfTsKICAgICAgICAgICAgaWYgKCRUcmFuc2xhdGFibGVWYWx1ZXMpIHsKICAgICAgICAgICAgICAgICRSZWFkYWJsZVZhbHVlID0gJFBhcmFte0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkUmVhZGFibGVWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRSZWFkYWJsZUxlbmd0aCA9IGxlbmd0aCAkUmVhZGFibGVWYWx1ZTsKCiAgICAgICAgIyBzZXQgdGl0bGUgZXF1YWwgdmFsdWUKICAgICAgICBteSAkUmVhZGFibGVUaXRsZSA9ICRSZWFkYWJsZVZhbHVlOwoKICAgICAgICAjIGN1dCBzdHJpbmdzIGlmIG5lZWRlZAogICAgICAgIGlmICggJFZhbHVlTWF4Q2hhcnMgbmUgJycgKSB7CgogICAgICAgICAgICAkU2hvd1ZhbHVlRWxsaXBzaXMgPSAxIGlmICggbGVuZ3RoICRSZWFkYWJsZVZhbHVlID4gJFZhbHVlTWF4Q2hhcnMgKTsKICAgICAgICAgICAgJFJlYWRhYmxlVmFsdWUgPSBzdWJzdHIgJFJlYWRhYmxlVmFsdWUsIDAsICRWYWx1ZU1heENoYXJzOwoKICAgICAgICAgICAgIyBkZWNyZWFzZSB0aGUgbWF4IHBhcmFtZXRlcgogICAgICAgICAgICAkVmFsdWVNYXhDaGFycyA9ICRWYWx1ZU1heENoYXJzIC0gJFJlYWRhYmxlTGVuZ3RoOwogICAgICAgICAgICAkVmFsdWVNYXhDaGFycyA9IDAgaWYgJFZhbHVlTWF4Q2hhcnMgPCAwOwoKICAgICAgICB9CgogICAgICAgIGlmICggJFRpdGxlTWF4Q2hhcnMgbmUgJycgKSB7CgogICAgICAgICAgICAkU2hvd1RpdGxlRWxsaXBzaXMgPSAxIGlmICggbGVuZ3RoICRSZWFkYWJsZVRpdGxlID4gJFZhbHVlTWF4Q2hhcnMgKTsKICAgICAgICAgICAgJFJlYWRhYmxlVGl0bGUgPSBzdWJzdHIgJFJlYWRhYmxlVGl0bGUsIDAsICRUaXRsZU1heENoYXJzOwoKICAgICAgICAgICAgIyBkZWNyZWFzZSB0aGUgbWF4IHBhcmFtZXRlcgogICAgICAgICAgICAkVGl0bGVNYXhDaGFycyA9ICRUaXRsZU1heENoYXJzIC0gJFJlYWRhYmxlTGVuZ3RoOwogICAgICAgICAgICAkVGl0bGVNYXhDaGFycyA9IDAgaWYgJFRpdGxlTWF4Q2hhcnMgPCAwOwogICAgICAgIH0KCiAgICAgICAgIyBIVE1MT3VwdXQgdHJhbnNmb3JtYXRpb25zCiAgICAgICAgaWYgKCAkUGFyYW17SFRNTE91dHB1dH0gKSB7CgogICAgICAgICAgICAkUmVhZGFibGVWYWx1ZSA9ICRQYXJhbXtMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCA9PiAkUmVhZGFibGVWYWx1ZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRSZWFkYWJsZVRpdGxlID0gJFBhcmFte0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBUZXh0ID0+ICRSZWFkYWJsZVRpdGxlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAUmVhZGFibGVWYWx1ZXMsICRSZWFkYWJsZVZhbHVlIGlmIGxlbmd0aCAkUmVhZGFibGVWYWx1ZTsKICAgICAgICBwdXNoIEBSZWFkYWJsZVRpdGxlcywgJFJlYWRhYmxlVGl0bGUgaWYgbGVuZ3RoICRSZWFkYWJsZVRpdGxlOwogICAgfQoKICAgICMgZ2V0IHNwZWNpZmljIGZpZWxkIHNldHRpbmdzCiAgICBteSAkRmllbGRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRHluYW1pY0ZpZWxkczo6QmFja2VuZCcpLT57TXVsdGlzZWxlY3RGcm9tREJ9IHx8IHt9OwoKICAgICMgc2V0IG5ldyBsaW5lIHNlcGFyYXRvcgogICAgbXkgJEl0ZW1TZXBhcmF0b3IgPSAkRmllbGRDb25maWctPntJdGVtU2VwYXJhdG9yfSB8fCAnLCAnOwoKICAgICRWYWx1ZSA9IGpvaW4oICRJdGVtU2VwYXJhdG9yLCBAUmVhZGFibGVWYWx1ZXMgKTsKICAgICRUaXRsZSA9IGpvaW4oICRJdGVtU2VwYXJhdG9yLCBAUmVhZGFibGVUaXRsZXMgKTsKCiAgICAkVmFsdWUgLj0gJy4uLicgaWYgJFNob3dWYWx1ZUVsbGlwc2lzOwogICAgJFRpdGxlIC49ICcuLi4nIGlmICRTaG93VGl0bGVFbGxpcHNpczsKCiAgICAjIHRoaXMgZmllbGQgdHlwZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBMaW5rIEZlYXR1cmUKICAgIG15ICRMaW5rOwoKICAgICMgY3JlYXRlIHJldHVybiBzdHJ1Y3R1cmUKICAgIG15ICREYXRhID0gewogICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICBUaXRsZSA9PiAkVGl0bGUsCiAgICAgICAgTGluayAgPT4gJExpbmssCiAgICB9OwoKICAgIHJldHVybiAkRGF0YTsKCn0KCnN1YiBJc1NvcnRhYmxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDA7Cn0KCnN1YiBTZWFyY2hGaWVsZFJlbmRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdGFrZSBjb25maWcgZnJvbSBmaWVsZCBjb25maWcKICAgIG15ICRGaWVsZENvbmZpZyA9ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfTsKICAgIG15ICRGaWVsZE5hbWUgICA9ICdTZWFyY2hfRHluYW1pY0ZpZWxkXycgLiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e05hbWV9OwogICAgbXkgJEZpZWxkTGFiZWwgID0gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntMYWJlbH07CgogICAgbXkgJFZhbHVlOwoKICAgIG15IEBEZWZhdWx0VmFsdWU7CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtEZWZhdWx0VmFsdWV9ICkgewogICAgICAgIG15IEBEZWZhdWx0VmFsdWUgPSBzcGxpdCAvOy8sICRQYXJhbXtEZWZhdWx0VmFsdWV9OwogICAgfQoKICAgICMgc2V0IHRoZSBmaWVsZCB2YWx1ZQogICAgaWYgKEBEZWZhdWx0VmFsdWUpIHsKICAgICAgICAkVmFsdWUgPSBcQERlZmF1bHRWYWx1ZTsKICAgIH0KCiAgICAjIGdldCB0aGUgZmllbGQgdmFsdWUsIHRoaXMgZnVjdGlvbiBpcyBhbHdheXMgY2FsbGVkIGFmdGVyIHRoZSBwcm9maWxlIGlzIGxvYWRlZAogICAgbXkgJEZpZWxkVmFsdWVzID0gJFNlbGYtPlNlYXJjaEZpZWxkVmFsdWVHZXQoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICBpZiAoIGRlZmluZWQgJEZpZWxkVmFsdWVzICkKICAgIHsKICAgICAgICAkVmFsdWUgPSAkRmllbGRWYWx1ZXM7CiAgICB9CgogICAgIyBjaGVjayBhbmQgc2V0IGNsYXNzIGlmIG5lY2Vzc2FyeQogICAgbXkgJEZpZWxkQ2xhc3MgPSAnRHluYW1pY0ZpZWxkTXVsdGlTZWxlY3QnOwoKICAgICMgc2V0IFBvc3NpYmxlVmFsdWVzCiAgICBteSAkU2VsZWN0aW9uRGF0YSA9ICRGaWVsZENvbmZpZy0+e1Bvc3NpYmxlVmFsdWVzfTsKCiAgICAjIGdldCBoaXN0b3JpY2FsIHZhbHVlcyBmcm9tIGRhdGFiYXNlCiAgICBteSAkSGlzdG9yaWNhbFZhbHVlcyA9ICRTZWxmLT5IaXN0b3JpY2FsVmFsdWVzR2V0KCVQYXJhbSk7CgogICAgIyBhZGQgaGlzdG9yaWMgdmFsdWVzIHRvIGN1cnJlbnQgdmFsdWVzIChpZiB0aGV5IGRvbid0IGV4aXN0IGFueW1vcmUpCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRIaXN0b3JpY2FsVmFsdWVzKSApIHsKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXskSGlzdG9yaWNhbFZhbHVlc30gKSB7CiAgICAgICAgICAgIGlmICggISRTZWxlY3Rpb25EYXRhLT57JEtleX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0aW9uRGF0YS0+eyRLZXl9ID0gJEhpc3RvcmljYWxWYWx1ZXMtPnskS2V5fQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgdXNlIFBvc3NpYmxlVmFsdWVzRmlsdGVyIGlmIGRlZmluZWQKICAgICRTZWxlY3Rpb25EYXRhID0gJFBhcmFte1Bvc3NpYmxlVmFsdWVzRmlsdGVyfQogICAgICAgIGlmIGRlZmluZWQgJFBhcmFte1Bvc3NpYmxlVmFsdWVzRmlsdGVyfTsKCiAgICBteSAkSFRNTFN0cmluZyA9ICRQYXJhbXtMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlbGVjdGlvbkRhdGEsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRGaWVsZE5hbWUsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRWYWx1ZSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gJEZpZWxkQ29uZmlnLT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgIENsYXNzICAgICAgICA9PiAkRmllbGRDbGFzcywKICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICAgICBIVE1MUXVvdGUgICAgPT4gMSwKICAgICk7CgogICAgIyBjYWxsIEVkaXRMYWJlbFJlbmRlciBvbiB0aGUgY29tbW9uIGJhY2tlbmQKICAgIG15ICRMYWJlbFN0cmluZyA9ICRTZWxmLT57QmFja2VuZENvbW1vbk9iamVjdH0tPkVkaXRMYWJlbFJlbmRlcigKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30sCiAgICAgICAgRmllbGROYW1lICAgICAgICAgID0+ICRGaWVsZE5hbWUsCiAgICApOwoKICAgIG15ICREYXRhID0gewogICAgICAgIEZpZWxkID0+ICRIVE1MU3RyaW5nLAogICAgICAgIExhYmVsID0+ICRMYWJlbFN0cmluZywKICAgIH07CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgU2VhcmNoRmllbGRWYWx1ZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWx1ZTsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIHZhbHVlIGZvcm0gcGFyYW0gb2JqZWN0CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1BhcmFtT2JqZWN0fSApIHsKICAgICAgICBteSBARmllbGRWYWx1ZXMgPSAkUGFyYW17UGFyYW1PYmplY3R9CiAgICAgICAgICAgIC0+R2V0QXJyYXkoIFBhcmFtID0+ICdTZWFyY2hfRHluYW1pY0ZpZWxkXycgLiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e05hbWV9ICk7CgogICAgICAgICRWYWx1ZSA9IFxARmllbGRWYWx1ZXM7CiAgICB9CgogICAgIyBvdGhlcndpc2UgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBwcm9maWxlCiAgICBlbHNpZiAoIGRlZmluZWQgJFBhcmFte1Byb2ZpbGV9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtQcm9maWxlfS0+eyAnU2VhcmNoX0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfSB9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggZGVmaW5lZCAkUGFyYW17UmV0dXJuUHJvZmlsZVN0cnVjdHVyZX0gJiYgJFBhcmFte1JldHVyblByb2ZpbGVTdHJ1Y3R1cmV9IGVxIDEgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJ1NlYXJjaF9EeW5hbWljRmllbGRfJyAuICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57TmFtZX0gPT4gJFZhbHVlLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuICRWYWx1ZTsKCn0KCnN1YiBTZWFyY2hGaWVsZFBhcmFtZXRlckJ1aWxkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgZmllbGQgdmFsdWUKICAgIG15ICRWYWx1ZSA9ICRTZWxmLT5TZWFyY2hGaWVsZFZhbHVlR2V0KCVQYXJhbSk7CgogICAgbXkgJERpc3BsYXlWYWx1ZTsKCiAgICBpZiAoJFZhbHVlKSB7CiAgICAgICAgaWYgKCByZWYgJFZhbHVlIGVxICdBUlJBWScgKSB7CgogICAgICAgICAgICBteSBARGlzcGxheUl0ZW1MaXN0OwogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRWYWx1ZX0gKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgdGhlIGRpc3BsYXkgdmFsdWUKICAgICAgICAgICAgICAgIG15ICREaXNwbGF5SXRlbSA9ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfS0+eyRJdGVtfTsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyB0cmFuc2xhdGUgdGhlIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgJERpc3BsYXlJdGVtID0gJFBhcmFte0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkRGlzcGxheVZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBEaXNwbGF5SXRlbUxpc3QsICREaXNwbGF5SXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb21iaW5lIGRpZmZlcmVudCB2YWx1ZXMgaW50byBvbmUgc3RyaW5nCiAgICAgICAgICAgICREaXNwbGF5VmFsdWUgPSBqb2luICcgKyAnLCBARGlzcGxheUl0ZW1MaXN0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgc2V0IHRoZSBkaXNwbGF5IHZhbHVlCiAgICAgICAgICAgICREaXNwbGF5VmFsdWUgPSAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfS0+eyRWYWx1ZX07CgogICAgICAgICAgICBpZiAoICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gKSB7CgogICAgICAgICAgICAgICAgIyB0cmFuc2xhdGUgdGhlIHZhbHVlCiAgICAgICAgICAgICAgICAkRGlzcGxheVZhbHVlID0gJFBhcmFte0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkRGlzcGxheVZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiBzZWFyY2ggcGFyYW1ldGVyIHN0cnVjdHVyZQogICAgcmV0dXJuIHsKICAgICAgICBQYXJhbWV0ZXIgPT4gewogICAgICAgICAgICBFcXVhbHMgPT4gJFZhbHVlLAogICAgICAgIH0sCiAgICAgICAgRGlzcGxheSA9PiAkRGlzcGxheVZhbHVlLAogICAgfTsKfQoKc3ViIFN0YXRzRmllbGRQYXJhbWV0ZXJCdWlsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IFBvc3NpYmxlVmFsdWVzCiAgICBteSAkVmFsdWVzID0gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9OwoKICAgICMgZ2V0IGhpc3RvcmljYWwgdmFsdWVzIGZyb20gZGF0YWJhc2UKICAgIG15ICRIaXN0b3JpY2FsVmFsdWVzID0gJFNlbGYtPntEeW5hbWljRmllbGRWYWx1ZU9iamVjdH0tPkhpc3RvcmljYWxWYWx1ZUdldCgKICAgICAgICBGaWVsZElEICAgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntJRH0sCiAgICAgICAgVmFsdWVUeXBlID0+ICdUZXh0LCcsCiAgICApOwoKICAgICMgYWRkIGhpc3RvcmljIHZhbHVlcyB0byBjdXJyZW50IHZhbHVlcyAoaWYgdGhleSBkb24ndCBleGlzdCBhbnltb3JlKQogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7JEhpc3RvcmljYWxWYWx1ZXN9ICkgewogICAgICAgIGlmICggISRWYWx1ZXMtPnskS2V5fSApIHsKICAgICAgICAgICAgJFZhbHVlcy0+eyRLZXl9ID0gJEhpc3RvcmljYWxWYWx1ZXMtPnskS2V5fQogICAgICAgIH0KICAgIH0KCiAgICAjIHVzZSBQb3NzaWJsZVZhbHVlc0ZpbHRlciBpZiBkZWZpbmVkCiAgICAkVmFsdWVzID0gJFBhcmFte1Bvc3NpYmxlVmFsdWVzRmlsdGVyfQogICAgICAgIGlmIGRlZmluZWQgJFBhcmFte1Bvc3NpYmxlVmFsdWVzRmlsdGVyfTsKCiAgICByZXR1cm4gewogICAgICAgIFZhbHVlcyAgICAgICAgICAgICA9PiAkVmFsdWVzLAogICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfS0+e0xhYmVsfSwKICAgICAgICBFbGVtZW50ICAgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfSwKICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gJFBhcmFte0R5bmFtaWNGaWVsZGNvbmZpZ30tPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSwKICAgIH07Cn0KCnN1YiBDb21tb25TZWFyY2hGaWVsZFBhcmFtZXRlckJ1aWxkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE9wZXJhdG9yID0gJ0VxdWFscyc7CiAgICBteSAkVmFsdWUgICAgPSAkUGFyYW17VmFsdWV9OwoKICAgIHJldHVybiB7CiAgICAgICAgJE9wZXJhdG9yID0+ICRWYWx1ZSwKICAgIH07Cn0KCnN1YiBSZWFkYWJsZVZhbHVlUmVuZGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgVmFsdWUgYW5kIFRpdGxlIHZhcmlhYmxlcwogICAgbXkgJFZhbHVlID0gJyc7CiAgICBteSAkVGl0bGUgPSAnJzsKCiAgICAjIGNoZWNrIHZhbHVlCiAgICBteSBAVmFsdWVzOwogICAgaWYgKCByZWYgJFBhcmFte1ZhbHVlfSBlcSAnQVJSQVknICkgewogICAgICAgIEBWYWx1ZXMgPSBAeyAkUGFyYW17VmFsdWV9IH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAVmFsdWVzID0gKCAkUGFyYW17VmFsdWV9ICk7CiAgICB9CgogICAgbXkgQFJlYWRhYmxlVmFsdWVzOwoKICAgIFZBTFVFSVRFTToKICAgIGZvciBteSAkSXRlbSAoQFZhbHVlcykgewogICAgICAgIG5leHQgVkFMVUVJVEVNIGlmICEkSXRlbTsKCiAgICAgICAgcHVzaCBAUmVhZGFibGVWYWx1ZXMsICRJdGVtOwogICAgfQoKICAgICMgc2V0IG5ldyBsaW5lIHNlcGFyYXRvcgogICAgbXkgJEl0ZW1TZXBhcmF0b3IgPSAnLCAnOwoKICAgICMgT3VwdXQgdHJhbnNmb3JtYXRpb25zCiAgICAkVmFsdWUgPSBqb2luKCAkSXRlbVNlcGFyYXRvciwgQFJlYWRhYmxlVmFsdWVzICk7CiAgICAkVGl0bGUgPSAkVmFsdWU7CgogICAgIyBjdXQgc3RyaW5ncyBpZiBuZWVkZWQKICAgIGlmICggJFBhcmFte1ZhbHVlTWF4Q2hhcnN9ICYmIGxlbmd0aCgkVmFsdWUpID4gJFBhcmFte1ZhbHVlTWF4Q2hhcnN9ICkgewogICAgICAgICRWYWx1ZSA9IHN1YnN0ciggJFZhbHVlLCAwLCAkUGFyYW17VmFsdWVNYXhDaGFyc30gKSAuICcuLi4nOwogICAgfQogICAgaWYgKCAkUGFyYW17VGl0bGVNYXhDaGFyc30gJiYgbGVuZ3RoKCRUaXRsZSkgPiAkUGFyYW17VGl0bGVNYXhDaGFyc30gKSB7CiAgICAgICAgJFRpdGxlID0gc3Vic3RyKCAkVGl0bGUsIDAsICRQYXJhbXtUaXRsZU1heENoYXJzfSApIC4gJy4uLic7CiAgICB9CgogICAgIyBjcmVhdGUgcmV0dXJuIHN0cnVjdHVyZQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgIFRpdGxlID0+ICRUaXRsZSwKICAgIH07CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgVGVtcGxhdGVWYWx1ZVR5cGVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRmllbGROYW1lID0gJ0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfTsKCiAgICAjIHNldCB0aGUgZmllbGQgdHlwZXMKICAgIG15ICRFZGl0VmFsdWVUeXBlICAgPSAnQVJSQVknOwogICAgbXkgJFNlYXJjaFZhbHVlVHlwZSA9ICdBUlJBWSc7CgogICAgIyByZXR1cm4gdGhlIGNvcnJlY3Qgc3RydWN0dXJlCiAgICBpZiAoICRQYXJhbXtGaWVsZFR5cGV9IGVxICdFZGl0JyApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAkRmllbGROYW1lID0+ICRFZGl0VmFsdWVUeXBlLAogICAgICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtGaWVsZFR5cGV9IGVxICdTZWFyY2gnICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICdTZWFyY2hfJyAuICRGaWVsZE5hbWUgPT4gJFNlYXJjaFZhbHVlVHlwZSwKICAgICAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJEZpZWxkTmFtZSAgICAgICAgICAgICA9PiAkRWRpdFZhbHVlVHlwZSwKICAgICAgICAgICAgJ1NlYXJjaF8nIC4gJEZpZWxkTmFtZSA9PiAkU2VhcmNoVmFsdWVUeXBlLAogICAgICAgICAgICB9CiAgICB9Cn0KCnN1YiBJc0FKQVhVcGRhdGVhYmxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBSYW5kb21WYWx1ZVNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWx1ZSA9IGludCggcmFuZCg1MDApICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+VmFsdWVTZXQoCiAgICAgICAgJVBhcmFtLAogICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBWYWx1ZSAgID0+ICRWYWx1ZSwKICAgIH07Cn0KCnN1YiBJc01hdGNoYWJsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9CgpzdWIgT2JqZWN0TWF0Y2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRmllbGROYW1lID0gJ0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntOYW1lfTsKCiAgICAjIHRoZSBhdHRyaWJ1dGUgbXVzdCBiZSBhbiBhcnJheQogICAgcmV0dXJuIDAgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte09iamVjdEF0dHJpYnV0ZXN9LT57JEZpZWxkTmFtZX0gKTsKCiAgICBteSAkTWF0Y2g7CgogICAgIyBzZWFyY2ggaW4gYWxsIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUKICAgIFZBTFVFOgogICAgZm9yIG15ICRBdHRyaWJ1dGVWYWx1ZSAoIEB7ICRQYXJhbXtPYmplY3RBdHRyaWJ1dGVzfS0+eyRGaWVsZE5hbWV9IH0gKSB7CgogICAgICAgICMgb25seSBuZWVkIHRvIG1hdGNoIG9uZQogICAgICAgIGlmICggJFBhcmFte1ZhbHVlfSBlcSAkQXR0cmlidXRlVmFsdWUgKSB7CiAgICAgICAgICAgICRNYXRjaCA9IDE7CiAgICAgICAgICAgIGxhc3QgVkFMVUU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkTWF0Y2g7Cn0KCnN1YiBBSkFYUG9zc2libGVWYWx1ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRvIHN0b3JlIHRoZSBwb3NzaWJsZSB2YWx1ZXMKICAgIG15ICVQb3NzaWJsZVZhbHVlczsKCiAgICBpZiAoICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfSApIHsKCSRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1N0b3JlVmFsdWV9ID0gIjEiOwogICAgICAgICVQb3NzaWJsZVZhbHVlcyA9ICV7ICRTZWxmLT57QmFja2VuZERyb3Bkb3duRnJvbURCfS0+QUpBWFBvc3NpYmxlVmFsdWVzR2V0KCVQYXJhbSkgfTsKICAgIH0KCiMgICAgIyBzZXQgbm9uZSB2YWx1ZSBpZiBkZWZpbmVkIG9uIGZpZWxkIGNvbmZpZwojICAgIGlmICggJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UG9zc2libGVOb25lfSApIHsKIyAgICAgICAgJVBvc3NpYmxlVmFsdWVzID0gKCAnJyA9PiAnLScgKTsKIyAgICB9CiMKIyAgICAjIHNldCBhbGwgb3RoZXIgcG9zc2libGUgdmFsdWVzIGlmIGRlZmluZWQgb24gZmllbGQgY29uZmlnCiMgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9ICkgKSB7CiMgICAgICAgICVQb3NzaWJsZVZhbHVlcyA9ICgKIyAgICAgICAgICAgICVQb3NzaWJsZVZhbHVlcywKIyAgICAgICAgICAgICV7ICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9LT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSB9LAojICAgICAgICApOwojICAgIH0KCiAgICAjIHJldHJ1biB0aGUgcG9zc2libGUgdmFsdWVzIGhhc2ggYXMgYSByZWZlcmVuY2UKICAgIHJldHVybiBcJVBvc3NpYmxlVmFsdWVzOwp9CgpzdWIgSGlzdG9yaWNhbFZhbHVlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGhpc3RvcmljYWwgdmFsdWVzIGZyb20gZGF0YWJhc2UKICAgIG15ICRIaXN0b3JpY2FsVmFsdWVzID0gJFNlbGYtPntEeW5hbWljRmllbGRWYWx1ZU9iamVjdH0tPkhpc3RvcmljYWxWYWx1ZUdldCgKICAgICAgICBGaWVsZElEICAgPT4gJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPntJRH0sCiAgICAgICAgVmFsdWVUeXBlID0+ICdUZXh0JywKICAgICk7CgogICAgIyByZXRydW4gdGhlIGhpc3RvcmljYWwgdmFsdWVzIGZyb20gZGF0YWJhc2UKICAgIHJldHVybiAkSGlzdG9yaWNhbFZhbHVlczsKfQoKc3ViIFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFZhbHVlID0gZGVmaW5lZCAkUGFyYW17S2V5fSA/ICRQYXJhbXtLZXl9IDogJyc7CgogICAgcmV0dXJuICRWYWx1ZTsKCn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJCQKCj1jdXQK</File>
</Filelist>
</otrs_package>