<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (dtdversion,name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT dtdversion (#PCDATA)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT mincmsversion (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
	<dtdversion>1.3</dtdversion>
	<name>ExaCSS</name>
	<version>2.0.2</version>
  <mincmsversion>2</mincmsversion>
	<help><![CDATA[]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBKb2NlbHluIEx1c3NlYXUgLSBFeGFjb3JlICZsdDtpbmZvQGV4YWNvcmUuZnImZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMi4wLjI8YnIgLz4=]]></about>
	<description><![CDATA[This module allows you to edit CSS with the CSS preprocessor of your choice.]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.admin_item_delete.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmKCAhZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSApIGV4aXQ7DQppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oRXhhQ1NTOjpQRVJNX1VTRSkgKSByZXR1cm47DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgU3VwcHJlc3Npb24gZGUgbCdpdGVtDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokaXRlbV9pZCA9IChlbXB0eSgkcGFyYW1zWydpdGVtX2lkJ10pKSA/ICcnIDogJHBhcmFtc1snaXRlbV9pZCddOw0KDQokcmVzdWx0ID0gXEV4YUNTU1xJdGVtOjpkZWxldGUoJGl0ZW1faWQpOw0KDQppZiAoJHJlc3VsdC0+cmVzdWx0ID09IGZhbHNlKToNCiAgICAkdGhpcy0+U2V0RXJyb3IoJHJlc3VsdC0+bWVzc2FnZSk7DQogICAgJHRoaXMtPlJlZGlyZWN0VG9BZG1pblRhYignZGFzaGJvYXJkJywgJycsICdkZWZhdWx0YWRtaW4nKTsgIA0KZWxzZToNCiAgICAkdGhpcy0+U2V0TWVzc2FnZSgkcmVzdWx0LT5tZXNzYWdlKTsNCiAgICAkdGhpcy0+UmVkaXJlY3RUb0FkbWluVGFiKCdkYXNoYm9hcmQnLCAnJywgJ2RlZmF1bHRhZG1pbicpOw0KZW5kaWY7DQoNCg0KDQoNCg0KDQoNCg0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.admin_item_edit.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmKCAhZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSApIGV4aXQ7DQppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oRXhhQ1NTOjpQRVJNX1VTRSkgKSByZXR1cm47DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUmV0b3VyIGR1IGZvcm11bGFpcmUgZCfpZGl0aW9uDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQppZiAoIWVtcHR5KCRwYXJhbXNbJ3N1Ym1pdF9jYW5jZWwnXSkpOg0KDQogICAgJHRoaXMtPlJlZGlyZWN0VG9BZG1pblRhYignZGFzaGJvYXJkJywgJycsICdkZWZhdWx0YWRtaW4nKTsNCg0KZW5kaWY7DQoNCmlmICghZW1wdHkoJHBhcmFtc1snc3VibWl0X3NhdmUnXSkgT1IgIWVtcHR5KCRwYXJhbXNbJ3N1Ym1pdF9hcHBseSddKSk6DQoNCiAgICAkcGFyYW1zWydpZCddID0gKGVtcHR5KCRwYXJhbXNbJ2l0ZW1faWQnXSkpID8gbnVsbCA6ICRwYXJhbXNbJ2l0ZW1faWQnXTsNCiAgICAkcmVzdWx0ID0gXEV4YUNTU1xJdGVtOjpzZXQoJHBhcmFtcyk7DQoNCiAgICBpZiAoJHJlc3VsdC0+cmVzdWx0ID09IGZhbHNlKToNCiAgICAgICAgJHRoaXMtPlNldEVycm9yKCRyZXN1bHQtPm1lc3NhZ2UpOw0KICAgICAgICAkdGhpcy0+UmVkaXJlY3RUb0FkbWluVGFiKCk7ICANCiAgICBlbHNlOg0KICAgICAgICAkdGhpcy0+U2V0TWVzc2FnZSgkcmVzdWx0LT5tZXNzYWdlKTsNCiAgICAgICAgaWYgKCFlbXB0eSgkcGFyYW1zWydzdWJtaXRfc2F2ZSddKSk6DQogICAgICAgICAgICAkdGhpcy0+UmVkaXJlY3RUb0FkbWluVGFiKCdkYXNoYm9hcmQnLCAnJywgJ2RlZmF1bHRhZG1pbicpOw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgKGVtcHR5KCRwYXJhbXNbJ2l0ZW1faWQnXSkpOg0KICAgICAgICAgICAgICAgICRwYXJhbXNbJ2l0ZW1faWQnXSA9ICRyZXN1bHQtPmluc2VydElkOw0KICAgICAgICAgICAgZW5kaWY7DQogICAgICAgICAgICAkdGhpcy0+UmVkaXJlY3RUb0FkbWluVGFiKCdlZGl0JywgWydpdGVtX2lkJyA9PiAkcGFyYW1zWydpdGVtX2lkJ11dLCAnYWRtaW5faXRlbV9lZGl0Jyk7DQogICAgICAgIGVuZGlmOw0KICAgIGVuZGlmOw0KDQplbmRpZjsNCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBS6WN1cOlyYXRpb24gZGUgbCdpdGVtDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQppZiAoIWVtcHR5KCRwYXJhbXNbJ2l0ZW1faWQnXSkpOg0KDQogICAgJHJlc3VsdCA9IFxFeGFDU1NcSXRlbTo6Z2V0KFsNCiAgICAgICAgJ3doZXJlJyA9PiAiaWQgPSB7JHBhcmFtc1snaXRlbV9pZCddfSINCiAgICAgICAgXSk7DQogICAgICAgIA0KICAgIGlmICgkcmVzdWx0LT5yZXN1bHQgQU5EICRyZXN1bHQtPmNvdW50ID09IDEpOg0KICAgICAgICANCiAgICAgICAgJGl0ZW0gPSAkcmVzdWx0LT5yZWNvcmRbMF07DQogICAgICAgICRzbWFydHktPmFzc2lnbignaXRlbScsICRpdGVtKTsNCiAgICAgICAgDQogICAgZW5kaWY7DQoNCmVuZGlmOw0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEFmZmljaGFnZSBkdSB0ZW1wbGF0ZQ0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHRwbCA9ICRzbWFydHktPkNyZWF0ZVRlbXBsYXRlKCR0aGlzLT5HZXRUZW1wbGF0ZVJlc291cmNlKCdhZG1pbl9pdGVtX2VkaXQudHBsJyksbnVsbCxudWxsLCRzbWFydHkpOw0KJHRwbC0+ZGlzcGxheSgpOw0KDQoNCg0KDQoNCg0KDQoNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/action.admin_item_export.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmKCAhZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSApIGV4aXQ7DQppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oRXhhQ1NTOjpQRVJNX1VTRSkgKSByZXR1cm47DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFLDqWN1cMOpcmF0aW9uIGRlIGwnaXRlbQ0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KaWYgKCFpc3NldCgkcGFyYW1zWydpdGVtX2lkJ10pKToNCgkkdGhpcy0+UmVkaXJlY3RUb0FkbWluVGFiKCdkYXNoYm9hcmQnLCAnJywgJ2RlZmF1bHRhZG1pbicpOw0KZW5kaWY7DQoNCiRyZXN1bHQgPSBcRXhhQ1NTXEl0ZW06OmdldChbDQogICAgJ3doZXJlJyA9PiAiaWQgPSB7JHBhcmFtc1snaXRlbV9pZCddfSINCiAgICBdKTsNCg0KJGl0ZW0gPSAkcmVzdWx0LT5yZWNvcmRbMF07DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFByw6lwYXJhdGlvbiBkdSBmaWNoaWVyIFhNTA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHhtbF9maWxlbmFtZSA9ICdFeGFDU1NfJy5tdW5nZV9zdHJpbmdfdG9fdXJsKCRpdGVtWyduYW1lJ10pLidfJy5tdW5nZV9zdHJpbmdfdG9fdXJsKCRpdGVtWydkYXRlX21vZGlmaWNhdGlvbiddKS4nLnhtbCc7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIEVudm9pIGR1IGZpY2hpZXIgWE1MDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokeG1sID0gbmV3IERPTURvY3VtZW50KCcxLjAnLCAndXRmLTgnKTsNCg0KJHhtbF9jb250ZW50ID0gYXJyYXkoKSA7DQokcm9vdCA9ICR4bWwtPmFwcGVuZENoaWxkKCR4bWwtPmNyZWF0ZUVsZW1lbnQoJ3Jvb3QnKSk7DQokeG1sX2NvbnRlbnRbJ25hbWUnXSA9ICRyb290LT5hcHBlbmRDaGlsZCgkeG1sLT5jcmVhdGVFbGVtZW50KCduYW1lJywgJGl0ZW1bJ25hbWUnXSkpOw0KJHhtbF9jb250ZW50Wydjb250ZW50J10gPSAkcm9vdC0+YXBwZW5kQ2hpbGQoJHhtbC0+Y3JlYXRlRWxlbWVudCgnY29udGVudCcpKTsNCiR4bWxfY29udGVudFsnY29udGVudCddLT5hcHBlbmRDaGlsZCgkeG1sLT5jcmVhdGVDREFUQVNlY3Rpb24oJGl0ZW1bJ2NvbnRlbnQnXSkpOw0KJHhtbF9jb250ZW50Wydzb3J0J10gPSAkcm9vdC0+YXBwZW5kQ2hpbGQoJHhtbC0+Y3JlYXRlRWxlbWVudCgnc29ydCcsICRpdGVtWydzb3J0J10pKTsNCiR4bWxfY29udGVudFsnZGF0ZV9jcmVhdGlvbiddID0gJHJvb3QtPmFwcGVuZENoaWxkKCR4bWwtPmNyZWF0ZUVsZW1lbnQoJ2RhdGVfY3JlYXRpb24nLCAkaXRlbVsnZGF0ZV9jcmVhdGlvbiddKSk7DQokeG1sX2NvbnRlbnRbJ2RhdGVfbW9kaWZpY2F0aW9uJ10gPSAkcm9vdC0+YXBwZW5kQ2hpbGQoJHhtbC0+Y3JlYXRlRWxlbWVudCgnZGF0ZV9tb2RpZmljYXRpb24nLCAkaXRlbVsnZGF0ZV9tb2RpZmljYXRpb24nXSkpOw0KJHhtbF9jb250ZW50WydzdGF0dXMnXSA9ICRyb290LT5hcHBlbmRDaGlsZCgkeG1sLT5jcmVhdGVFbGVtZW50KCdzdGF0dXMnLCAkaXRlbVsnc3RhdHVzJ10pKTsNCiR4bWwtPmZvcm1hdE91dHB1dCA9IHRydWUgOw0KDQp3aGlsZShAb2JfZW5kX2NsZWFuKCkpOw0KaGVhZGVyKCdDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIFRyYW5zZmVyJyk7DQpoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vZm9yY2UtZG93bmxvYWQnKTsNCmhlYWRlcigiQ2FjaGUtQ29udHJvbDogbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOw0KaGVhZGVyKCJFeHBpcmVzOiBNb24sIDEwIEp1bCAxOTkwIDA1OjAwOjAwIEdNVCIpOw0KaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nLiR4bWxfZmlsZW5hbWUpOw0KZWNobyAkeG1sLT5zYXZlWE1MKCk7DQpleGl0Ow0KDQoNCg0KDQoNCg0KDQoNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/action.admin_item_sort.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmKCAhZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSApIGV4aXQ7DQppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oRXhhQ1NTOjpQRVJNX1VTRSkgKSByZXR1cm47DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgU2kgbCdvcmRyZSBkZXMgZmV1aWxsZXMgZGUgc3R5bGUgbidlc3QgcGFzIGZvdXJuaQ0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KaWYgKGVtcHR5KCRwYXJhbXNbJ2l0ZW1fc29ydCddKSk6DQogICAgJHRoaXMtPlJlZGlyZWN0VG9BZG1pblRhYignZGFzaGJvYXJkJywgJycsICdkZWZhdWx0YWRtaW4nKTsNCmVuZGlmOw0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFRyaSBkZXMgaXRlbXMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRpdGVtX3NvcnQgPSBzdHJfcmVwbGFjZSgiaXRlbV8iLCAiIiwgJHBhcmFtc1snaXRlbV9zb3J0J10pOw0KJGl0ZW1fc29ydCA9IGV4cGxvZGUoInwiLCAkaXRlbV9zb3J0KTsNCg0KZm9yZWFjaCAoJGl0ZW1fc29ydCBhcyAka2V5ID0+ICR2YWwpOg0KDQoJaWYgKGlzX251bWVyaWMoJGtleSkgQU5EIGlzX251bWVyaWMoJHZhbCkpOg0KICAgIA0KCQkkcmVzdWx0ID0gXEV4YUNTU1xJdGVtOjpzb3J0KCR2YWwsICRrZXkpOw0KICAgICAgICANCgkJaWYgKCRyZXN1bHQtPnJlc3VsdCA9PSBmYWxzZSk6DQoJCQkkdGhpcy0+U2V0RXJyb3IoJHJlc3VsdC0+bWVzc2FnZSk7DQogICAgICAgICAgICR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ2Rhc2hib2FyZCcsICcnLCAnZGVmYXVsdGFkbWluJyk7DQoJCWVuZGlmOw0KCQ0KICAgIGVuZGlmOw0KDQplbmRmb3JlYWNoOw0KDQokdGhpcy0+U2V0TWVzc2FnZSgkcmVzdWx0LT5tZXNzYWdlKTsNCiR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ2Rhc2hib2FyZCcsICcnLCAnZGVmYXVsdGFkbWluJyk7DQoNCg0KDQoNCg0KDQoNCg0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.admin_item_toggle.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmKCAhZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSApIGV4aXQ7DQppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oRXhhQ1NTOjpQRVJNX1VTRSkgKSByZXR1cm47DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgVulyaWZpY2F0aW9uIGRlIGwnSUQNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCmlmIChlbXB0eSgkcGFyYW1zWydpdGVtX2lkJ10pKToNCiAgICAkdGhpcy0+UmVkaXJlY3RUb0FkbWluVGFiKCdkYXNoYm9hcmQnLCAnJywgJ2RlZmF1bHRhZG1pbicpOw0KZW5kaWY7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUuljdXDpcmF0aW9uIGRlIGwnaXRlbQ0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHJlc3VsdCA9IFxFeGFDU1NcSXRlbTo6Z2V0KFsNCiAgICAnd2hlcmUnID0+ICJpZCA9IHskcGFyYW1zWydpdGVtX2lkJ119IiwNCiAgICAnbGltaXQnID0+IDENCiAgICBdKTsNCg0KaWYgKCRyZXN1bHQtPnJlc3VsdCA9PSBmYWxzZSk6DQogICAgJHRoaXMtPlNldEVycm9yKCRyZXN1bHQtPm1lc3NhZ2UpOw0KICAgICR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ2Rhc2hib2FyZCcsICcnLCAnZGVmYXVsdGFkbWluJyk7DQplbHNlaWYgKCRyZXN1bHQtPmNvdW50ICE9IDEpOg0KICAgICR0aGlzLT5TZXRFcnJvcigkdGhpcy0+TGFuZygnbm9fcmVzdWx0X2Zvcl90aGlzX2lkJykpOw0KICAgICR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ2Rhc2hib2FyZCcsICcnLCAnZGVmYXVsdGFkbWluJyk7DQplbmRpZjsNCg0KJGl0ZW0gPSAkcmVzdWx0LT5yZWNvcmRbMF07DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgQmFzY3VsZSBkZSBsJ2l0ZW0NClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRvcHRpb25zWydpZCddID0gJGl0ZW1bJ2lkJ107DQokb3B0aW9uc1snc3RhdHVzJ10gPSAoJGl0ZW1bJ3N0YXR1cyddID09IHRydWUpID8gZmFsc2UgOiB0cnVlOw0KDQokcmVzdWx0ID0gXEV4YUNTU1xJdGVtOjpzZXQoJG9wdGlvbnMpOw0KDQppZiAoJHJlc3VsdC0+cmVzdWx0ID09IGZhbHNlKToNCiAgICAkdGhpcy0+U2V0RXJyb3IoJHJlc3VsdC0+bWVzc2FnZSk7DQogICAkdGhpcy0+UmVkaXJlY3RUb0FkbWluVGFiKCdkYXNoYm9hcmQnLCAnJywgJ2RlZmF1bHRhZG1pbicpOw0KZW5kaWY7DQoNCiR0aGlzLT5TZXRNZXNzYWdlKCRyZXN1bHQtPm1lc3NhZ2UpOw0KJHRoaXMtPlJlZGlyZWN0VG9BZG1pblRhYignZGFzaGJvYXJkJywgJycsICdkZWZhdWx0YWRtaW4nKTsNCg0KDQoNCg0KDQoNCg0KDQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmKCAhZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSApIGV4aXQ7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFRyYWl0ZW1lbnQgZHUgcHLDqXByb2Nlc3NldXINClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCmlmIChcRXhhQ1NTXENhY2hlOjppc0NhY2hlZCgpID09IGZhbHNlKToNCiAgICANCiAgICAkcmVzdWx0ID0gXEV4YUNTU1xQcmVwcm9jZXNzb3I6OmV4ZWN1dGUoKTsNCiAgICANCiAgICBpZiAoISRyZXN1bHQpOg0KICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCR0aGlzLT5MYW5nKCdwcmVwcm9jZXNzb3JfZXJyb3InKSk7DQogICAgZWxzZWlmICgkcmVzdWx0LT5yZXN1bHQgPT0gZmFsc2UpOg0KICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCRyZXN1bHQtPm1lc3NhZ2UpOw0KICAgIGVuZGlmOw0KICAgIA0KICAgIA0KZW5kaWY7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIEFmZmljaGFnZSBkZSBsYSBiYWxpc2Ugc3R5bGVzaGVldA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJGV4YWNzc191cmwgPSBcRXhhQ1NTXENhY2hlOjpnZXRVcmwoKTsNCg0KZWNobyAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJyAuICRleGFjc3NfdXJsIC4gJyI+JzsNCg0KDQoNCg0KDQoNCg0KDQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmKCAhZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSApIGV4aXQ7DQppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oRXhhQ1NTOjpQRVJNX1VTRSkgKSByZXR1cm47DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUGFyYW3DqHRyZXMgLSBFbnJlZ2lzdHJlbWVudCBkdSBwcsOpcHJvY2Vzc2V1cg0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KaWYgKGlzc2V0KCRwYXJhbXNbJ3N1Ym1pdF9wcmVwcm9jZXNzb3InXSkpOg0KCQ0KICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwcmVwcm9jZXNzb3InLCAkcGFyYW1zWydwcmVwcm9jZXNzb3InXSk7DQoNCiAgICAkdGhpcy0+U2V0TWVzc2FnZSgkdGhpcy0+bGFuZygncHJlcHJvY2Vzc29yX2NoYW5nZWQnKSk7DQogICAgJHRoaXMtPlJlZGlyZWN0VG9BZG1pblRhYignc2V0dGluZycpOw0KICAgIA0KZW5kaWY7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUGFyYW3DqHRyZXMgLSBJbXBvcnRhdGlvbiBkJ3VuIGZpY2hpZXINClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCmlmIChpc3NldCgkcGFyYW1zWydzdWJtaXRfaW1wb3J0J10pKToNCg0KICAgIGlmICghaXNzZXQoJF9GSUxFU1skaWQuImZpbGUiXSkpOg0KICAgICAgICAkdGhpcy0+U2V0RXJyb3IoIk5vIGZpbGUhIik7DQogICAgICAgICR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ3NldHRpbmcnLCAnJywgJ2RlZmF1bHRhZG1pbicpOw0KICAgIGVuZGlmOw0KICAgIA0KICAgICRyZXN1bHQgPSBcRXhhQ1NTXEl0ZW06OmltcG9ydCgkX0ZJTEVTWyRpZC4iZmlsZSJdKTsNCiAgICANCiAgICBpZiAoJHJlc3VsdC0+cmVzdWx0ID09IGZhbHNlKToNCiAgICAgICAgJHRoaXMtPlNldEVycm9yKCRyZXN1bHQtPm1lc3NhZ2UpOw0KICAgICAgICAkdGhpcy0+UmVkaXJlY3RUb0FkbWluVGFiKCdzZXR0aW5nJywgJycsICdkZWZhdWx0YWRtaW4nKTsNCiAgICBlbHNlOg0KICAgICAgICAkdGhpcy0+U2V0TWVzc2FnZSgkcmVzdWx0LT5tZXNzYWdlKTsNCiAgICAgICAgJHRoaXMtPlJlZGlyZWN0VG9BZG1pblRhYignc2V0dGluZycsICcnLCAnZGVmYXVsdGFkbWluJyk7DQogICAgZW5kaWY7DQogICAgDQplbmRpZjsNCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBQYXJhbcOodHJlcyAtIENvbXBhdGliaWxpdMOpIGF2ZWMgRXhhRXh0ZXJuYWxpemVyDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQppZiAoaXNzZXQoJHBhcmFtc1snc3VibWl0X2V4YWV4dGVybmFsaXplciddKSk6DQoJDQogICAgJGV4YWV4dGVybmFsaXplcl9jb21wYXRpYmlsaXR5ID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2V4YWV4dGVybmFsaXplcl9jb21wYXRpYmlsaXR5JywgZmFsc2UpOw0KDQogICAgaWYgKCRleGFleHRlcm5hbGl6ZXJfY29tcGF0aWJpbGl0eSA9PSBmYWxzZSk6DQogICAgICAgICR0aGlzLT5BZGRFdmVudEhhbmRsZXIoJ0V4YUV4dGVybmFsaXplcicsICdFeHBvcnQnKTsNCiAgICAgICAgJHRoaXMtPkFkZEV2ZW50SGFuZGxlcignRXhhRXh0ZXJuYWxpemVyJywgJ0ltcG9ydCcpOw0KICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZXhhZXh0ZXJuYWxpemVyX2NvbXBhdGliaWxpdHknLCB0cnVlKTsNCiAgICBlbHNlOg0KICAgICAgICAkdGhpcy0+UmVtb3ZlRXZlbnRIYW5kbGVyKCdFeGFFeHRlcm5hbGl6ZXInLCAnRXhwb3J0Jyk7DQogICAgICAgICR0aGlzLT5SZW1vdmVFdmVudEhhbmRsZXIoJ0V4YUV4dGVybmFsaXplcicsICdJbXBvcnQnKTsNCiAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2V4YWV4dGVybmFsaXplcl9jb21wYXRpYmlsaXR5JywgZmFsc2UpOw0KICAgIGVuZGlmOw0KICAgIA0KICAgICR0aGlzLT5TZXRNZXNzYWdlKCR0aGlzLT5sYW5nKCdzZXR0aW5nX3NhdmVkJykpOw0KICAgICR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ3NldHRpbmcnKTsNCiAgICANCmVuZGlmOw0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFLDqWN1cMOpcmF0aW9uIGRlcyBpdGVtcw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJGl0ZW1fbGlzdCA9IFtdOw0KDQokcmVzdWx0ID0gXEV4YUNTU1xJdGVtOjpnZXQoWw0KICAgICdvcmRlcicgPT4gInNvcnQgQVNDLCBuYW1lIEFTQyINCiAgICBdKTsNCiAgICANCmlmICgkcmVzdWx0LT5yZXN1bHQgQU5EICRyZXN1bHQtPmNvdW50ID4gMCk6DQogICAgDQogICAgJGl0ZW1fbGlzdCA9ICRyZXN1bHQtPnJlY29yZDsNCiAgICAkc21hcnR5LT5hc3NpZ24oJ2l0ZW1fbGlzdCcsICRpdGVtX2xpc3QpOw0KICAgIA0KZW5kaWY7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUsOpY3Vww6lyYXRpb24gZGVzIHByw6lwcm9jZXNzZXVycw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHByZXByb2Nlc3Nvcl9saXN0ID0gW107DQoNCiRyZXN1bHQgPSBcRXhhQ1NTXFByZXByb2Nlc3Nvcjo6Z2V0KFsNCiAgICAnb3JkZXInID0+ICJzb3J0IEFTQywgbmFtZSBBU0MiDQogICAgXSk7DQogICAgDQppZiAoJHJlc3VsdC0+cmVzdWx0IEFORCAkcmVzdWx0LT5jb3VudCA+IDApOg0KICAgIA0KICAgICRwcmVwcm9jZXNzb3JfbGlzdCA9ICRyZXN1bHQtPnJlY29yZDsNCiAgICAkc21hcnR5LT5hc3NpZ24oJ3ByZXByb2Nlc3Nvcl9saXN0JywgJHByZXByb2Nlc3Nvcl9saXN0KTsNCiAgICANCmVuZGlmOw0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFBhcmFtw6h0cmVzIC0gUsOpY3Vww6lyYXRpb24NClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRzZXR0aW5nID0gW107DQokc2V0dGluZ1sncHJlcHJvY2Vzc29yJ10gPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncHJlcHJvY2Vzc29yJywgJycpOw0KJHNldHRpbmdbJ2V4YWV4dGVybmFsaXplcl9hdmFpbGFibGUnXSA9IFxjbXNfdXRpbHM6Om1vZHVsZV9hdmFpbGFibGUoJ0V4YUV4dGVybmFsaXplcicpOw0KJHNldHRpbmdbJ2V4YWV4dGVybmFsaXplcl9jb21wYXRpYmlsaXR5J10gPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZXhhZXh0ZXJuYWxpemVyX2NvbXBhdGliaWxpdHknLCBmYWxzZSk7DQokc21hcnR5LT5hc3NpZ24oJ3NldHRpbmcnLCAkc2V0dGluZyk7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgQWZmaWNoYWdlIGR1IHRlbXBsYXRlDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokdHBsID0gJHNtYXJ0eS0+Q3JlYXRlVGVtcGxhdGUoJHRoaXMtPkdldFRlbXBsYXRlUmVzb3VyY2UoJ2RlZmF1bHRhZG1pbi50cGwnKSxudWxsLG51bGwsJHNtYXJ0eSk7DQokdHBsLT5kaXNwbGF5KCk7DQoNCg0KDQoNCg0KDQoNCg0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/ExaCSS.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmNsYXNzIEV4YUNTUyBleHRlbmRzIENNU01vZHVsZQ0Kew0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIENvbnN0YW50ZXMgZXQgdmFyaWFibGVzDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KICAgIA0KY29uc3QgUEVSTV9VU0UgPSAnZXhhY3NzX3Blcm1fdXNlJzsNCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBDb25zdHJ1Y3Rpb24NClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsNCiAgICANCiAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7DQoNCiAgICBzcGxfYXV0b2xvYWRfcmVnaXN0ZXIoWyR0aGlzLCdhdXRvbG9hZCddKTsNCg0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEZvbmN0aW9ucyBDTVMgTWFkZSBTaW1wbGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQogICAgDQpwdWJsaWMgZnVuY3Rpb24gR2V0TmFtZSgpIHsNCiAgICByZXR1cm4gJ0V4YUNTUyc7DQp9DQoNCnB1YmxpYyBmdW5jdGlvbiBHZXRWZXJzaW9uKCkgew0KICAgIHJldHVybiAnMi4wLjInOw0KfQ0KDQpwdWJsaWMgZnVuY3Rpb24gR2V0QXV0aG9yKCkgew0KICAgIHJldHVybiAnSm9jZWx5biBMdXNzZWF1IC0gRXhhY29yZSc7DQp9DQoNCnB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpIHsNCiAgICByZXR1cm4gJ2luZm9AZXhhY29yZS5mcic7DQp9DQoNCnB1YmxpYyBmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKSB7DQogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsNCn0NCg0KcHVibGljIGZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7DQogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdhZG1pbmRlc2NyaXB0aW9uJyk7DQp9DQoNCnB1YmxpYyBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsNCiAgICByZXR1cm4gdHJ1ZTsNCn0NCg0KcHVibGljIGZ1bmN0aW9uIEhhc0FkbWluKCkgew0KICAgIHJldHVybiB0cnVlOw0KfQ0KDQpwdWJsaWMgZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uKCkgew0KICAgIHJldHVybiAnbGF5b3V0JzsNCn0NCg0KcHVibGljIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsNCiAgICByZXR1cm4gJHRoaXMtPkNoZWNrUGVybWlzc2lvbihzZWxmOjpQRVJNX1VTRSk7DQp9DQoNCnB1YmxpYyBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKSB7DQogICAgcmV0dXJuIFtdOw0KfQ0KDQpwdWJsaWMgZnVuY3Rpb24gR2V0SGVscCgpIHsNCiAgICByZXR1cm4gJyc7DQp9DQoNCnB1YmxpYyBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpIHsNCiAgICByZXR1cm4gJzInOw0KfQ0KDQpwdWJsaWMgZnVuY3Rpb24gVW5pbnN0YWxsUHJlTWVzc2FnZSgpIHsNCiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2Fza191bmluc3RhbGwnKTsNCn0NCg0KcHVibGljIGZ1bmN0aW9uIEdldEhlYWRlckhUTUwoKSB7DQogICAgJHRwbCA9ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInIC4gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKSAuICcvanMvanF1ZXJ5LnRhYmxlZG5kLjAuOC5taW4uanMiPjwvc2NyaXB0Pic7DQogICAgcmV0dXJuICR0cGwgOw0KfQ0KDQpwdWJsaWMgZnVuY3Rpb24gSW5pdGlhbGl6ZUZyb250ZW5kKCkgew0KICAgICR0aGlzLT5SZWdpc3Rlck1vZHVsZVBsdWdpbigpOw0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICDDiXbDqG5lbWVudHMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBmdW5jdGlvbiBEb0V2ZW50KCRvcmlnaW5hdG9yLCAkZXZlbnRuYW1lLCAmJHBhcmFtcykgew0KICAgIA0KICAgIGlmICgkb3JpZ2luYXRvciA9PSAnRXhhRXh0ZXJuYWxpemVyJyAmJiAkZXZlbnRuYW1lID09ICdFeHBvcnQnKToNCiAgICAgICAgXEV4YUNTU1xFeGFFeHRlcm5hbGl6ZXI6OmV4cG9ydCgpOw0KICAgIGVuZGlmOw0KICAgIA0KICAgIGlmICgkb3JpZ2luYXRvciA9PSAnRXhhRXh0ZXJuYWxpemVyJyAmJiAkZXZlbnRuYW1lID09ICdJbXBvcnQnKToNCiAgICAgICAgXEV4YUNTU1xFeGFFeHRlcm5hbGl6ZXI6OmltcG9ydCgpOw0KICAgIGVuZGlmOw0KICAgIA0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEF1dG9sb2FkZXINClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQogICAgDQpwdWJsaWMgZnVuY3Rpb24gYXV0b2xvYWQoJGNsYXNzbmFtZSkgew0KDQogICAgaWYgKCFpc19vYmplY3QoJHRoaXMpKToNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIGVuZGlmOw0KDQogICAgJHBhdGggPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpLicvbGliJzsNCiAgICBpZiAoc3RycG9zKCRjbGFzc25hbWUsJ1xcJykgIT09IGZhbHNlKToNCiAgICAgICAgJHRfcGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsJy8nLCRjbGFzc25hbWUpOw0KICAgICAgICBpZiAoc3RhcnRzd2l0aCggJHRfcGF0aCwgJHRoaXMtPkdldE5hbWUoKS4nLycpKToNCiAgICAgICAgICAgICRjbGFzc25hbWUgPSBiYXNlbmFtZSgkdF9wYXRoKTsNCiAgICAgICAgICAgICR0X3BhdGggPSBkaXJuYW1lKCR0X3BhdGgpOw0KICAgICAgICAgICAgJHRfcGF0aCA9IHN1YnN0cigkdF9wYXRoLHN0cmxlbigkdGhpcy0+R2V0TmFtZSgpKSsxKTsNCiAgICAgICAgICAgICRwYXRoID0gJHRoaXMtPkdldE1vZHVsZVBhdGgoKS4nL2xpYi8nLiR0X3BhdGg7DQogICAgICAgIGVuZGlmOw0KICAgIGVuZGlmOw0KDQogICAgJGZuID0gJHBhdGguIi9jbGFzcy57JGNsYXNzbmFtZX0ucGhwIjsNCiAgICBpZiAoZmlsZV9leGlzdHMoJGZuKSk6DQogICAgICAgIHJlcXVpcmVfb25jZSgkZm4pOw0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICBlbmRpZjsNCg0KICAgIHJldHVybiBmYWxzZTsNCg0KfQ0KDQoNCg0KDQoNCg0KDQoNCiAgICANCn0NCj8+]]></data>
	</file>
	<file>
	  <filename>/extra/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/lessphp_oyejorge/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/lessphp_oyejorge/Cache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCnJlcXVpcmVfb25jZSggZGlybmFtZShfX0ZJTEVfXykuJy9WZXJzaW9uLnBocCcpOwoKLyoqCiAqIFV0aWxpdHkgZm9yIGhhbmRsaW5nIHRoZSBnZW5lcmF0aW9uIGFuZCBjYWNoaW5nIG9mIGNzcyBmaWxlcwogKgogKiBAcGFja2FnZSBMZXNzCiAqIEBzdWJwYWNrYWdlIGNhY2hlCiAqCiAqLwpjbGFzcyBMZXNzX0NhY2hlewoKCS8vIGRpcmVjdG9yeSBsZXNzLnBocCBjYW4gdXNlIGZvciBzdG9yaW5nIGRhdGEKCXB1YmxpYyBzdGF0aWMgJGNhY2hlX2Rpcgk9IGZhbHNlOwoKCS8vIHByZWZpeCBmb3IgdGhlIHN0b3JpbmcgZGF0YQoJcHVibGljIHN0YXRpYyAkcHJlZml4CQk9ICdsZXNzcGhwXyc7CgoJLy8gcHJlZml4IGZvciB0aGUgc3RvcmluZyB2YXJzCglwdWJsaWMgc3RhdGljICRwcmVmaXhfdmFycwk9ICdsZXNzcGhwdmFyc18nOwoKCS8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYWZ0ZXIgd2hpY2ggZGF0YSBjcmVhdGVkIGJ5IGxlc3MucGhwIHdpbGwgYmUgc2VlbiBhcyAnZ2FyYmFnZScgYW5kIHBvdGVudGlhbGx5IGNsZWFuZWQgdXAKCXB1YmxpYyBzdGF0aWMgJGdjX2xpZmV0aW1lCT0gNjA0ODAwOwoKCgkvKioKCSAqIFNhdmUgYW5kIHJldXNlIHRoZSByZXN1bHRzIG9mIGNvbXBpbGVkIGxlc3MgZmlsZXMuCgkgKiBUaGUgZmlyc3QgY2FsbCB0byBHZXQoKSB3aWxsIGdlbmVyYXRlIGNzcyBhbmQgc2F2ZSBpdC4KCSAqIFN1YnNlcXVlbnQgY2FsbHMgdG8gR2V0KCkgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgY3NzIGZpbGVuYW1lCgkgKgoJICogQHBhcmFtIGFycmF5ICRsZXNzX2ZpbGVzIEFycmF5IG9mIC5sZXNzIGZpbGVzIHRvIGNvbXBpbGUKCSAqIEBwYXJhbSBhcnJheSAkcGFyc2VyX29wdGlvbnMgQXJyYXkgb2YgY29tcGlsZXIgb3B0aW9ucwoJICogQHBhcmFtIGFycmF5ICRtb2RpZnlfdmFycyBBcnJheSBvZiB2YXJpYWJsZXMKCSAqIEByZXR1cm4gc3RyaW5nIE5hbWUgb2YgdGhlIGNzcyBmaWxlCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR2V0KCAkbGVzc19maWxlcywgJHBhcnNlcl9vcHRpb25zID0gYXJyYXkoKSwgJG1vZGlmeV92YXJzID0gYXJyYXkoKSApewoKCgkJLy9jaGVjayAkY2FjaGVfZGlyCgkJaWYoIGlzc2V0KCRwYXJzZXJfb3B0aW9uc1snY2FjaGVfZGlyJ10pICl7CgkJCUxlc3NfQ2FjaGU6OiRjYWNoZV9kaXIgPSAkcGFyc2VyX29wdGlvbnNbJ2NhY2hlX2RpciddOwoJCX0KCgkJaWYoIGVtcHR5KExlc3NfQ2FjaGU6OiRjYWNoZV9kaXIpICl7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ2NhY2hlX2RpciBub3Qgc2V0Jyk7CgkJfQoKCQlpZiggaXNzZXQoJHBhcnNlcl9vcHRpb25zWydwcmVmaXgnXSkgKXsKCQkJTGVzc19DYWNoZTo6JHByZWZpeCA9ICRwYXJzZXJfb3B0aW9uc1sncHJlZml4J107CgkJfQoKCQlpZiggZW1wdHkoTGVzc19DYWNoZTo6JHByZWZpeCkgKXsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigncHJlZml4IG5vdCBzZXQnKTsKCQl9CgoJCWlmKCBpc3NldCgkcGFyc2VyX29wdGlvbnNbJ3ByZWZpeF92YXJzJ10pICl7CgkJCUxlc3NfQ2FjaGU6OiRwcmVmaXhfdmFycyA9ICRwYXJzZXJfb3B0aW9uc1sncHJlZml4X3ZhcnMnXTsKCQl9CgoJCWlmKCBlbXB0eShMZXNzX0NhY2hlOjokcHJlZml4X3ZhcnMpICl7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ3ByZWZpeF92YXJzIG5vdCBzZXQnKTsKCQl9CgoJCXNlbGY6OkNoZWNrQ2FjaGVEaXIoKTsKCQkkbGVzc19maWxlcyA9IChhcnJheSkkbGVzc19maWxlczsKCgoJCS8vY3JlYXRlIGEgZmlsZSBmb3IgdmFyaWFibGVzCgkJaWYoICFlbXB0eSgkbW9kaWZ5X3ZhcnMpICl7CgkJCSRsZXNzdmFycyA9IExlc3NfUGFyc2VyOjpzZXJpYWxpemVWYXJzKCRtb2RpZnlfdmFycyk7CgkJCSR2YXJzX2ZpbGUgPSBMZXNzX0NhY2hlOjokY2FjaGVfZGlyIC4gTGVzc19DYWNoZTo6JHByZWZpeF92YXJzIC4gc2hhMSgkbGVzc3ZhcnMpIC4gJy5sZXNzJzsKCgkJCWlmKCAhZmlsZV9leGlzdHMoJHZhcnNfZmlsZSkgKXsKCQkJCWZpbGVfcHV0X2NvbnRlbnRzKCR2YXJzX2ZpbGUsICRsZXNzdmFycyk7CgkJCX0KCgkJCSRsZXNzX2ZpbGVzICs9IGFycmF5KCR2YXJzX2ZpbGUgPT4gJy8nKTsKCQl9CgoKCQkvLyBnZW5lcmF0ZSBuYW1lIGZvciBjb21waWxlZCBjc3MgZmlsZQoJCSRoYXNoID0gbWQ1KGpzb25fZW5jb2RlKCRsZXNzX2ZpbGVzKSk7CiAJCSRsaXN0X2ZpbGUgPSBMZXNzX0NhY2hlOjokY2FjaGVfZGlyIC4gTGVzc19DYWNoZTo6JHByZWZpeCAuICRoYXNoIC4gJy5saXN0JzsKCgogCQkvLyBjaGVjayBjYWNoZWQgY29udGVudAogCQlpZiggIWlzc2V0KCRwYXJzZXJfb3B0aW9uc1sndXNlX2NhY2hlJ10pIHx8ICRwYXJzZXJfb3B0aW9uc1sndXNlX2NhY2hlJ10gPT09IHRydWUgKXsKCQkJaWYoIGZpbGVfZXhpc3RzKCRsaXN0X2ZpbGUpICl7CgoJCQkJc2VsZjo6TGlzdEZpbGVzKCRsaXN0X2ZpbGUsICRsaXN0LCAkY2FjaGVkX25hbWUpOwoJCQkJJGNvbXBpbGVkX25hbWUgPSBzZWxmOjpDb21waWxlZE5hbWUoJGxpc3QpOwoKCQkJCS8vIGlmICRjYWNoZWRfbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgJGNvbXBpbGVkIG5hbWUsIGRvbid0IHJlZ2VuZXJhdGUKCQkJCWlmKCAhJGNhY2hlZF9uYW1lIHx8ICRjYWNoZWRfbmFtZSA9PT0gJGNvbXBpbGVkX25hbWUgKXsKCgkJCQkJJG91dHB1dF9maWxlID0gc2VsZjo6T3V0cHV0RmlsZSgkY29tcGlsZWRfbmFtZSwgJHBhcnNlcl9vcHRpb25zICk7CgoJCQkJCWlmKCAkb3V0cHV0X2ZpbGUgJiYgZmlsZV9leGlzdHMoJG91dHB1dF9maWxlKSApewoJCQkJCQlAdG91Y2goJGxpc3RfZmlsZSk7CgkJCQkJCXJldHVybiBiYXNlbmFtZSgkb3V0cHV0X2ZpbGUpOyAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlIGp1c3QgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlCgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQkkY29tcGlsZWQgPSBzZWxmOjpDYWNoZSggJGxlc3NfZmlsZXMsICRwYXJzZXJfb3B0aW9ucyApOwoJCWlmKCAhJGNvbXBpbGVkICl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRjb21waWxlZF9uYW1lID0gc2VsZjo6Q29tcGlsZWROYW1lKCAkbGVzc19maWxlcyApOwoJCSRvdXRwdXRfZmlsZSA9IHNlbGY6Ok91dHB1dEZpbGUoJGNvbXBpbGVkX25hbWUsICRwYXJzZXJfb3B0aW9ucyApOwoKCgkJLy9zYXZlIHRoZSBmaWxlIGxpc3QKCQkkbGlzdCA9ICRsZXNzX2ZpbGVzOwoJCSRsaXN0W10gPSAkY29tcGlsZWRfbmFtZTsKCQkkY2FjaGUgPSBpbXBsb2RlKCJcbiIsJGxpc3QpOwoJCWZpbGVfcHV0X2NvbnRlbnRzKCAkbGlzdF9maWxlLCAkY2FjaGUgKTsKCgoJCS8vc2F2ZSB0aGUgY3NzCgkJZmlsZV9wdXRfY29udGVudHMoICRvdXRwdXRfZmlsZSwgJGNvbXBpbGVkICk7CgoKCQkvL2NsZWFuIHVwCgkJc2VsZjo6Q2xlYW5DYWNoZSgpOwoKCQlyZXR1cm4gYmFzZW5hbWUoJG91dHB1dF9maWxlKTsKCX0KCgkvKioKCSAqIEZvcmNlIHRoZSBjb21waWxlciB0byByZWdlbmVyYXRlIHRoZSBjYWNoZWQgY3NzIGZpbGUKCSAqCgkgKiBAcGFyYW0gYXJyYXkgJGxlc3NfZmlsZXMgQXJyYXkgb2YgLmxlc3MgZmlsZXMgdG8gY29tcGlsZQoJICogQHBhcmFtIGFycmF5ICRwYXJzZXJfb3B0aW9ucyBBcnJheSBvZiBjb21waWxlciBvcHRpb25zCgkgKiBAcGFyYW0gYXJyYXkgJG1vZGlmeV92YXJzIEFycmF5IG9mIHZhcmlhYmxlcwoJICogQHJldHVybiBzdHJpbmcgTmFtZSBvZiB0aGUgY3NzIGZpbGUKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSZWdlbiggJGxlc3NfZmlsZXMsICRwYXJzZXJfb3B0aW9ucyA9IGFycmF5KCksICRtb2RpZnlfdmFycyA9IGFycmF5KCkgKXsKCQkkcGFyc2VyX29wdGlvbnNbJ3VzZV9jYWNoZSddID0gZmFsc2U7CgkJcmV0dXJuIHNlbGY6OkdldCggJGxlc3NfZmlsZXMsICRwYXJzZXJfb3B0aW9ucywgJG1vZGlmeV92YXJzICk7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDYWNoZSggJiRsZXNzX2ZpbGVzLCAkcGFyc2VyX29wdGlvbnMgPSBhcnJheSgpICl7CgoKCQkvLyBnZXQgbGVzcy5waHAgaWYgaXQgZXhpc3RzCgkJJGZpbGUgPSBkaXJuYW1lKF9fRklMRV9fKSAuICcvTGVzcy5waHAnOwoJCWlmKCBmaWxlX2V4aXN0cygkZmlsZSkgJiYgIWNsYXNzX2V4aXN0cygnTGVzc19QYXJzZXInKSApewoJCQlyZXF1aXJlX29uY2UoJGZpbGUpOwoJCX0KCgkJJHBhcnNlcl9vcHRpb25zWydjYWNoZV9kaXInXSA9IExlc3NfQ2FjaGU6OiRjYWNoZV9kaXI7CgkJJHBhcnNlciA9IG5ldyBMZXNzX1BhcnNlcigkcGFyc2VyX29wdGlvbnMpOwoKCgkJLy8gY29tYmluZSBmaWxlcwoJCWZvcmVhY2goJGxlc3NfZmlsZXMgYXMgJGZpbGVfcGF0aCA9PiAkdXJpX29yX2xlc3MgKXsKCgkJCS8vdHJlYXQgYXMgbGVzcyBtYXJrdXAgaWYgdGhlcmUgYXJlIG5ld2xpbmUgY2hhcmFjdGVycwoJCQlpZiggc3RycG9zKCR1cmlfb3JfbGVzcywiXG4iKSAhPT0gZmFsc2UgKXsKCQkJCSRwYXJzZXItPlBhcnNlKCAkdXJpX29yX2xlc3MgKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkkcGFyc2VyLT5QYXJzZUZpbGUoICRmaWxlX3BhdGgsICR1cmlfb3JfbGVzcyApOwoJCX0KCgkJJGNvbXBpbGVkID0gJHBhcnNlci0+Z2V0Q3NzKCk7CgoKCQkkbGVzc19maWxlcyA9ICRwYXJzZXItPmFsbFBhcnNlZEZpbGVzKCk7CgoJCXJldHVybiAkY29tcGlsZWQ7Cgl9CgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIE91dHB1dEZpbGUoICRjb21waWxlZF9uYW1lLCAkcGFyc2VyX29wdGlvbnMgKXsKCgkJLy9jdXN0b20gb3V0cHV0IGZpbGUKCQlpZiggIWVtcHR5KCRwYXJzZXJfb3B0aW9uc1snb3V0cHV0J10pICl7CgoJCQkvL3JlbGF0aXZlIHRvIGNhY2hlIGRpcmVjdG9yeT8KCQkJaWYoIHByZWdfbWF0Y2goJyNbXFxcXC9dIycsJHBhcnNlcl9vcHRpb25zWydvdXRwdXQnXSkgKXsKCQkJCXJldHVybiAkcGFyc2VyX29wdGlvbnNbJ291dHB1dCddOwoJCQl9CgoJCQlyZXR1cm4gTGVzc19DYWNoZTo6JGNhY2hlX2Rpci4kcGFyc2VyX29wdGlvbnNbJ291dHB1dCddOwoJCX0KCgkJcmV0dXJuIExlc3NfQ2FjaGU6OiRjYWNoZV9kaXIuJGNvbXBpbGVkX25hbWU7Cgl9CgoKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIENvbXBpbGVkTmFtZSggJGZpbGVzICl7CgoJCS8vc2F2ZSB0aGUgZmlsZSBsaXN0CgkJJHRlbXAgPSBhcnJheShMZXNzX1ZlcnNpb246OmNhY2hlX3ZlcnNpb24pOwoJCWZvcmVhY2goJGZpbGVzIGFzICRmaWxlKXsKCQkJJHRlbXBbXSA9IGZpbGVtdGltZSgkZmlsZSkuIlx0Ii5maWxlc2l6ZSgkZmlsZSkuIlx0Ii4kZmlsZTsKCQl9CgoJCXJldHVybiBMZXNzX0NhY2hlOjokcHJlZml4LnNoYTEoanNvbl9lbmNvZGUoJHRlbXApKS4nLmNzcyc7Cgl9CgoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU2V0Q2FjaGVEaXIoICRkaXIgKXsKCQlMZXNzX0NhY2hlOjokY2FjaGVfZGlyID0gJGRpcjsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENoZWNrQ2FjaGVEaXIoKXsKCgkJTGVzc19DYWNoZTo6JGNhY2hlX2RpciA9IHN0cl9yZXBsYWNlKCdcXCcsJy8nLExlc3NfQ2FjaGU6OiRjYWNoZV9kaXIpOwoJCUxlc3NfQ2FjaGU6OiRjYWNoZV9kaXIgPSBydHJpbShMZXNzX0NhY2hlOjokY2FjaGVfZGlyLCcvJykuJy8nOwoKCQlpZiggIWZpbGVfZXhpc3RzKExlc3NfQ2FjaGU6OiRjYWNoZV9kaXIpICl7CgkJCWlmKCAhbWtkaXIoTGVzc19DYWNoZTo6JGNhY2hlX2RpcikgKXsKCQkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9QYXJzZXIoJ0xlc3MucGhwIGNhY2hlIGRpcmVjdG9yeSBjb3VsZG5cJ3QgYmUgY3JlYXRlZDogJy5MZXNzX0NhY2hlOjokY2FjaGVfZGlyKTsKCQkJfQoKCQl9ZWxzZWlmKCAhaXNfZGlyKExlc3NfQ2FjaGU6OiRjYWNoZV9kaXIpICl7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9QYXJzZXIoJ0xlc3MucGhwIGNhY2hlIGRpcmVjdG9yeSBkb2VzblwndCBleGlzdDogJy5MZXNzX0NhY2hlOjokY2FjaGVfZGlyKTsKCgkJfWVsc2VpZiggIWlzX3dyaXRhYmxlKExlc3NfQ2FjaGU6OiRjYWNoZV9kaXIpICl7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9QYXJzZXIoJ0xlc3MucGhwIGNhY2hlIGRpcmVjdG9yeSBpc25cJ3Qgd3JpdGFibGU6ICcuTGVzc19DYWNoZTo6JGNhY2hlX2Rpcik7CgoJCX0KCgl9CgoKCS8qKgoJICogRGVsZXRlIHVudXNlZCBsZXNzLnBocCBmaWxlcwoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDbGVhbkNhY2hlKCl7CgkJc3RhdGljICRjbGVhbiA9IGZhbHNlOwoKCQlpZiggJGNsZWFuICl7CgkJCXJldHVybjsKCQl9CgoJCSRmaWxlcyA9IHNjYW5kaXIoTGVzc19DYWNoZTo6JGNhY2hlX2Rpcik7CgkJaWYoICRmaWxlcyApewoJCQkkY2hlY2tfdGltZSA9IHRpbWUoKSAtIHNlbGY6OiRnY19saWZldGltZTsKCQkJZm9yZWFjaCgkZmlsZXMgYXMgJGZpbGUpewoKCQkJCS8vIGRvbid0IGRlbGV0ZSBpZiB0aGUgZmlsZSB3YXNuJ3QgY3JlYXRlZCB3aXRoIGxlc3MucGhwCgkJCQlpZiggc3RycG9zKCRmaWxlLExlc3NfQ2FjaGU6OiRwcmVmaXgpICE9PSAwICl7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJJGZ1bGxfcGF0aCA9IExlc3NfQ2FjaGU6OiRjYWNoZV9kaXIgLiAkZmlsZTsKCgkJCQkvLyBtYWtlIHN1cmUgdGhlIGZpbGUgc3RpbGwgZXhpc3RzCgkJCQkvLyBjc3MgZmlsZXMgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGRlbGV0ZWQKCQkJCWlmKCAhZmlsZV9leGlzdHMoJGZ1bGxfcGF0aCkgKXsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCSRtdGltZSA9IGZpbGVtdGltZSgkZnVsbF9wYXRoKTsKCgkJCQkvLyBkb24ndCBkZWxldGUgaWYgaXQncyBhIHJlbGF0aXZlbHkgbmV3IGZpbGUKCQkJCWlmKCAkbXRpbWUgPiAkY2hlY2tfdGltZSApewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoKCQkJCSRwYXJ0cyA9IGV4cGxvZGUoJy4nLCRmaWxlKTsKCQkJCSR0eXBlID0gYXJyYXlfcG9wKCRwYXJ0cyk7CgoKCQkJCS8vIGRlbGV0ZSBjc3MgZmlsZXMgYmFzZWQgb24gdGhlIGxpc3QgZmlsZXMKCQkJCWlmKCAkdHlwZSA9PT0gJ2NzcycgKXsKCQkJCQljb250aW51ZTsKCQkJCX0KCgoJCQkJLy8gZGVsZXRlIHRoZSBsaXN0IGZpbGUgYW5kIGFzc29jaWF0ZWQgY3NzIGZpbGUKCQkJCWlmKCAkdHlwZSA9PT0gJ2xpc3QnICl7CgkJCQkJc2VsZjo6TGlzdEZpbGVzKCRmdWxsX3BhdGgsICRsaXN0LCAkY3NzX2ZpbGVfbmFtZSk7CgkJCQkJaWYoICRjc3NfZmlsZV9uYW1lICl7CgkJCQkJCSRjc3NfZmlsZSA9IExlc3NfQ2FjaGU6OiRjYWNoZV9kaXIgLiAkY3NzX2ZpbGVfbmFtZTsKCQkJCQkJaWYoIGZpbGVfZXhpc3RzKCRjc3NfZmlsZSkgKXsKCQkJCQkJCXVubGluaygkY3NzX2ZpbGUpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCXVubGluaygkZnVsbF9wYXRoKTsKCQkJfQoJCX0KCgkJJGNsZWFuID0gdHJ1ZTsKCX0KCgoJLyoqCgkgKiBHZXQgdGhlIGxpc3Qgb2YgbGVzcyBmaWxlcyBhbmQgZ2VuZXJhdGVkIGNzcyBmaWxlIGZyb20gYSBsaXN0IGZpbGUKCSAqCgkgKi8KCXN0YXRpYyBmdW5jdGlvbiBMaXN0RmlsZXMoJGxpc3RfZmlsZSwgJiRsaXN0LCAmJGNzc19maWxlX25hbWUgKXsKCgkJJGxpc3QgPSBleHBsb2RlKCJcbiIsZmlsZV9nZXRfY29udGVudHMoJGxpc3RfZmlsZSkpOwoKCQkvL3BvcCB0aGUgY2FjaGVkIG5hbWUgdGhhdCBzaG91bGQgbWF0Y2ggJGNvbXBpbGVkX25hbWUKCQkkY3NzX2ZpbGVfbmFtZSA9IGFycmF5X3BvcCgkbGlzdCk7CgoJCWlmKCAhcHJlZ19tYXRjaCgnL14nIC4gTGVzc19DYWNoZTo6JHByZWZpeCAuICdbYS1mMC05XStcLmNzcyQvJywkY3NzX2ZpbGVfbmFtZSkgKXsKCQkJJGxpc3RbXSA9ICRjc3NfZmlsZV9uYW1lOwoJCQkkY3NzX2ZpbGVfbmFtZSA9IGZhbHNlOwoJCX0KCgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/lessphp_oyejorge/Less.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCnJlcXVpcmVfb25jZSggZGlybmFtZShfX0ZJTEVfXykuJy9DYWNoZS5waHAnKTsKCi8qKgogKiBDbGFzcyBmb3IgcGFyc2luZyBhbmQgY29tcGlsaW5nIGxlc3MgZmlsZXMgaW50byBjc3MKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSBwYXJzZXIKICoKICovCmNsYXNzIExlc3NfUGFyc2VyewoKCgkvKioKCSAqIERlZmF1bHQgcGFyc2VyIG9wdGlvbnMKCSAqLwoJcHVibGljIHN0YXRpYyAkZGVmYXVsdF9vcHRpb25zID0gYXJyYXkoCgkJJ2NvbXByZXNzJwkJCQk9PiBmYWxzZSwJCQkvLyBvcHRpb24gLSB3aGV0aGVyIHRvIGNvbXByZXNzCgkJJ3N0cmljdFVuaXRzJwkJCT0+IGZhbHNlLAkJCS8vIHdoZXRoZXIgdW5pdHMgbmVlZCB0byBldmFsdWF0ZSBjb3JyZWN0bHkKCQknc3RyaWN0TWF0aCcJCQk9PiBmYWxzZSwJCQkvLyB3aGV0aGVyIG1hdGggaGFzIHRvIGJlIHdpdGhpbiBwYXJlbnRoZXNpcwoJCSdyZWxhdGl2ZVVybHMnCQkJPT4gdHJ1ZSwJCQkvLyBvcHRpb24gLSB3aGV0aGVyIHRvIGFkanVzdCBVUkwncyB0byBiZSByZWxhdGl2ZQoJCSd1cmxBcmdzJwkJCQk9PiBhcnJheSgpLAkJCS8vIHdoZXRoZXIgdG8gYWRkIGFyZ3MgaW50byB1cmwgdG9rZW5zCgkJJ251bVByZWNpc2lvbicJCQk9PiA4LAoKCQknaW1wb3J0X2RpcnMnCQkJPT4gYXJyYXkoKSwKCQknaW1wb3J0X2NhbGxiYWNrJwkJPT4gbnVsbCwKCQknY2FjaGVfZGlyJwkJCQk9PiBudWxsLAoJCSdjYWNoZV9tZXRob2QnCQkJPT4gJ3BocCcsIAkJCS8vIGZhbHNlLCAnc2VyaWFsaXplJywgJ3BocCcsICd2YXJfZXhwb3J0JywgJ2NhbGxiYWNrJzsKCQknY2FjaGVfY2FsbGJhY2tfZ2V0Jwk9PiBudWxsLAoJCSdjYWNoZV9jYWxsYmFja19zZXQnCT0+IG51bGwsCgoJCSdzb3VyY2VNYXAnCQkJCT0+IGZhbHNlLAkJCS8vIHdoZXRoZXIgdG8gb3V0cHV0IGEgc291cmNlIG1hcAoJCSdzb3VyY2VNYXBCYXNlcGF0aCcJCT0+IG51bGwsCgkJJ3NvdXJjZU1hcFdyaXRlVG8nCQk9PiBudWxsLAoJCSdzb3VyY2VNYXBVUkwnCQkJPT4gbnVsbCwKCgkJJ3BsdWdpbnMnCQkJCT0+IGFycmF5KCksCgoJKTsKCglwdWJsaWMgc3RhdGljICRvcHRpb25zID0gYXJyYXkoKTsKCgoJcHJpdmF0ZSAkaW5wdXQ7CQkJCQkvLyBMZXNzIGlucHV0IHN0cmluZwoJcHJpdmF0ZSAkaW5wdXRfbGVuOwkJCQkvLyBpbnB1dCBzdHJpbmcgbGVuZ3RoCglwcml2YXRlICRwb3M7CQkJCQkvLyBjdXJyZW50IGluZGV4IGluIGBpbnB1dGAKCXByaXZhdGUgJHNhdmVTdGFjayA9IGFycmF5KCk7CS8vIGhvbGRzIHN0YXRlIGZvciBiYWNrdHJhY2tpbmcKCXByaXZhdGUgJGZ1cnRoZXN0OwoJcHJpdmF0ZSAkbWJfaW50ZXJuYWxfZW5jb2RpbmcgPSAnJzsgLy8gZm9yIHJlbWVtYmVyIGV4aXN0cyB2YWx1ZSBvZiBtYnN0cmluZy5pbnRlcm5hbF9lbmNvZGluZwoKCS8qKgoJICogQHZhciBMZXNzX0Vudmlyb25tZW50CgkgKi8KCXByaXZhdGUgJGVudjsKCglwcm90ZWN0ZWQgJHJ1bGVzID0gYXJyYXkoKTsKCglwcml2YXRlIHN0YXRpYyAkaW1wb3J0cyA9IGFycmF5KCk7CgoJcHVibGljIHN0YXRpYyAkaGFzX2V4dGVuZHMgPSBmYWxzZTsKCglwdWJsaWMgc3RhdGljICRuZXh0X2lkID0gMDsKCgkvKioKCSAqIEZpbGVuYW1lIHRvIGNvbnRlbnRzIG9mIGFsbCBwYXJzZWQgdGhlIGZpbGVzCgkgKgoJICogQHZhciBhcnJheQoJICovCglwdWJsaWMgc3RhdGljICRjb250ZW50c01hcCA9IGFycmF5KCk7CgoKCS8qKgoJICogQHBhcmFtIExlc3NfRW52aXJvbm1lbnR8YXJyYXl8bnVsbCAkZW52CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJGVudiA9IG51bGwgKXsKCgkJLy8gVG9wIHBhcnNlciBvbiBhbiBpbXBvcnQgdHJlZSBtdXN0IGJlIHN1cmUgdGhlcmUgaXMgb25lICJlbnYiCgkJLy8gd2hpY2ggd2lsbCB0aGVuIGJlIHBhc3NlZCBhcm91bmQgYnkgcmVmZXJlbmNlLgoJCWlmKCAkZW52IGluc3RhbmNlb2YgTGVzc19FbnZpcm9ubWVudCApewoJCQkkdGhpcy0+ZW52ID0gJGVudjsKCQl9ZWxzZXsKCQkJJHRoaXMtPlNldE9wdGlvbnMoTGVzc19QYXJzZXI6OiRkZWZhdWx0X29wdGlvbnMpOwoJCQkkdGhpcy0+UmVzZXQoICRlbnYgKTsKCQl9CgoJCS8vIG1ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQgPiAxIGJ1Z2ZpeAoJCS8vIFRoZSBlbmNvZGluZyB2YWx1ZSBtdXN0IGJlIHNldCBmb3IgZWFjaCBzb3VyY2UgZmlsZSwKCQkvLyB0aGVyZWZvcmUsIHRvIGNvbnNlcnZlIHJlc291cmNlcyBhbmQgaW1wcm92ZSB0aGUgc3BlZWQgb2YgdGhpcyBkZXNpZ24gaXMgdGFrZW4gaGVyZQoJCWlmIChpbmlfZ2V0KCdtYnN0cmluZy5mdW5jX292ZXJsb2FkJykpIHsJCQkKCQkJJHRoaXMtPm1iX2ludGVybmFsX2VuY29kaW5nID0gaW5pX2dldCgnbWJzdHJpbmcuaW50ZXJuYWxfZW5jb2RpbmcnKTsKCQkJQGluaV9zZXQoJ21ic3RyaW5nLmludGVybmFsX2VuY29kaW5nJywgJ2FzY2lpJyk7CgkJfQoKCX0KCgoJLyoqCgkgKiBSZXNldCB0aGUgcGFyc2VyIHN0YXRlIGNvbXBsZXRlbHkKCSAqCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBSZXNldCggJG9wdGlvbnMgPSBudWxsICl7CgkJJHRoaXMtPnJ1bGVzID0gYXJyYXkoKTsKCQlzZWxmOjokaW1wb3J0cyA9IGFycmF5KCk7CgkJc2VsZjo6JGhhc19leHRlbmRzID0gZmFsc2U7CgkJc2VsZjo6JGltcG9ydHMgPSBhcnJheSgpOwoJCXNlbGY6OiRjb250ZW50c01hcCA9IGFycmF5KCk7CgoJCSR0aGlzLT5lbnYgPSBuZXcgTGVzc19FbnZpcm9ubWVudCgkb3B0aW9ucyk7CgkJJHRoaXMtPmVudi0+SW5pdCgpOwoKCQkvL3NldCBuZXcgb3B0aW9ucwoJCWlmKCBpc19hcnJheSgkb3B0aW9ucykgKXsKCQkJJHRoaXMtPlNldE9wdGlvbnMoTGVzc19QYXJzZXI6OiRkZWZhdWx0X29wdGlvbnMpOwoJCQkkdGhpcy0+U2V0T3B0aW9ucygkb3B0aW9ucyk7CgkJfQoJfQoKCS8qKgoJICogU2V0IG9uZSBvciBtb3JlIGNvbXBpbGVyIG9wdGlvbnMKCSAqICBvcHRpb25zOiBpbXBvcnRfZGlycywgY2FjaGVfZGlyLCBjYWNoZV9tZXRob2QKCSAqCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBTZXRPcHRpb25zKCAkb3B0aW9ucyApewoJCWZvcmVhY2goJG9wdGlvbnMgYXMgJG9wdGlvbiA9PiAkdmFsdWUpewoJCQkkdGhpcy0+U2V0T3B0aW9uKCRvcHRpb24sJHZhbHVlKTsKCQl9Cgl9CgoJLyoqCgkgKiBTZXQgb25lIGNvbXBpbGVyIG9wdGlvbgoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIFNldE9wdGlvbigkb3B0aW9uLCR2YWx1ZSl7CgoJCXN3aXRjaCgkb3B0aW9uKXsKCgkJCWNhc2UgJ2ltcG9ydF9kaXJzJzoKCQkJCSR0aGlzLT5TZXRJbXBvcnREaXJzKCR2YWx1ZSk7CgkJCXJldHVybjsKCgkJCWNhc2UgJ2NhY2hlX2Rpcic6CgkJCQlpZiggaXNfc3RyaW5nKCR2YWx1ZSkgKXsKCQkJCQlMZXNzX0NhY2hlOjpTZXRDYWNoZURpcigkdmFsdWUpOwoJCQkJCUxlc3NfQ2FjaGU6OkNoZWNrQ2FjaGVEaXIoKTsKCQkJCX0KCQkJcmV0dXJuOwoJCX0KCgkJTGVzc19QYXJzZXI6OiRvcHRpb25zWyRvcHRpb25dID0gJHZhbHVlOwoJfQoKCS8qKgoJICogUmVnaXN0ZXJzIGEgbmV3IGN1c3RvbSBmdW5jdGlvbgoJICoKCSAqIEBwYXJhbSAgc3RyaW5nICAgJG5hbWUgICAgIGZ1bmN0aW9uIG5hbWUKCSAqIEBwYXJhbSAgY2FsbGFibGUgJGNhbGxiYWNrIGNhbGxiYWNrCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZWdpc3RlckZ1bmN0aW9uKCRuYW1lLCAkY2FsbGJhY2spIHsKCQkkdGhpcy0+ZW52LT5mdW5jdGlvbnNbJG5hbWVdID0gJGNhbGxiYWNrOwoJfQoKCS8qKgoJICogUmVtb3ZlZCBhbiBhbHJlYWR5IHJlZ2lzdGVyZWQgZnVuY3Rpb24KCSAqCgkgKiBAcGFyYW0gIHN0cmluZyAkbmFtZSBmdW5jdGlvbiBuYW1lCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB1bnJlZ2lzdGVyRnVuY3Rpb24oJG5hbWUpIHsKCQlpZiggaXNzZXQoJHRoaXMtPmVudi0+ZnVuY3Rpb25zWyRuYW1lXSkgKQoJCQl1bnNldCgkdGhpcy0+ZW52LT5mdW5jdGlvbnNbJG5hbWVdKTsKCX0KCgoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnQgY3NzIGJ1ZmZlcgoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDc3MoKXsKCgkJJHByZWNpc2lvbiA9IGluaV9nZXQoJ3ByZWNpc2lvbicpOwoJCUBpbmlfc2V0KCdwcmVjaXNpb24nLDE2KTsKCQkkbG9jYWxlID0gc2V0bG9jYWxlKExDX05VTUVSSUMsIDApOwoJCXNldGxvY2FsZShMQ19OVU1FUklDLCAiQyIpOwoKCQl0cnkgewoKCSAJCSRyb290ID0gbmV3IExlc3NfVHJlZV9SdWxlc2V0KGFycmF5KCksICR0aGlzLT5ydWxlcyApOwoJCQkkcm9vdC0+cm9vdCA9IHRydWU7CgkJCSRyb290LT5maXJzdFJvb3QgPSB0cnVlOwoKCgkJCSR0aGlzLT5QcmVWaXNpdG9ycygkcm9vdCk7CgoJCQlzZWxmOjokaGFzX2V4dGVuZHMgPSBmYWxzZTsKCQkJJGV2YWxkUm9vdCA9ICRyb290LT5jb21waWxlKCR0aGlzLT5lbnYpOwoKCgoJCQkkdGhpcy0+UG9zdFZpc2l0b3JzKCRldmFsZFJvb3QpOwoKCQkJaWYoIExlc3NfUGFyc2VyOjokb3B0aW9uc1snc291cmNlTWFwJ10gKXsKCQkJCSRnZW5lcmF0b3IgPSBuZXcgTGVzc19Tb3VyY2VNYXBfR2VuZXJhdG9yKCRldmFsZFJvb3QsIExlc3NfUGFyc2VyOjokY29udGVudHNNYXAsIExlc3NfUGFyc2VyOjokb3B0aW9ucyApOwoJCQkJLy8gd2lsbCBhbHNvIHNhdmUgZmlsZQoJCQkJLy8gRklYTUU6IHNob3VsZCBoYXBwZW4gc29tZXdoZXJlIGVsc2U/CgkJCQkkY3NzID0gJGdlbmVyYXRvci0+Z2VuZXJhdGVDU1MoKTsKCQkJfWVsc2V7CgkJCQkkY3NzID0gJGV2YWxkUm9vdC0+dG9DU1MoKTsKCQkJfQoKCQkJaWYoIExlc3NfUGFyc2VyOjokb3B0aW9uc1snY29tcHJlc3MnXSApewoJCQkJJGNzcyA9IHByZWdfcmVwbGFjZSgnLyheKFxzKSspfCgoXHMpKyQpLycsICcnLCAkY3NzKTsKCQkJfQoKCQl9IGNhdGNoIChFeGNlcHRpb24gJGV4YykgewoJCQkvLyBJbnRlbnRpb25hbCBmYWxsLXRocm91Z2ggc28gd2UgY2FuIHJlc2V0IGVudmlyb25tZW50CgkJfQoKCQkvL3Jlc2V0IHBocCBzZXR0aW5ncwoJCUBpbmlfc2V0KCdwcmVjaXNpb24nLCRwcmVjaXNpb24pOwoJCXNldGxvY2FsZShMQ19OVU1FUklDLCAkbG9jYWxlKTsKCgkJLy8gSWYgeW91IHByZXZpb3VzbHkgZGVmaW5lZCAkdGhpcy0+bWJfaW50ZXJuYWxfZW5jb2RpbmcgCgkJLy8gaXMgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZSBlbmNvZGluZyBhcyBpdCB3YXMgYmVmb3JlCgkJaWYgKCR0aGlzLT5tYl9pbnRlcm5hbF9lbmNvZGluZyAhPSAnJykgewoJCQlAaW5pX3NldCgibWJzdHJpbmcuaW50ZXJuYWxfZW5jb2RpbmciLCAkdGhpcy0+bWJfaW50ZXJuYWxfZW5jb2RpbmcpOwoJCQkkdGhpcy0+bWJfaW50ZXJuYWxfZW5jb2RpbmcgPSAnJzsKCQl9CgoJCS8vIFJldGhyb3cgZXhjZXB0aW9uIGFmdGVyIHdlIGhhbmRsZWQgcmVzZXR0aW5nIHRoZSBlbnZpcm9ubWVudAoJCWlmICghZW1wdHkoJGV4YykpIHsKCQkJdGhyb3cgJGV4YzsKCQl9CgoKCgkJcmV0dXJuICRjc3M7Cgl9CgoJLyoqCgkgKiBSdW4gcHJlLWNvbXBpbGUgdmlzaXRvcnMKCSAqCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gUHJlVmlzaXRvcnMoJHJvb3QpewoKCQlpZiggTGVzc19QYXJzZXI6OiRvcHRpb25zWydwbHVnaW5zJ10gKXsKCQkJZm9yZWFjaChMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ3BsdWdpbnMnXSBhcyAkcGx1Z2luKXsKCQkJCWlmKCAhZW1wdHkoJHBsdWdpbi0+aXNQcmVFdmFsVmlzaXRvcikgKXsKCQkJCQkkcGx1Z2luLT5ydW4oJHJvb3QpOwoJCQkJfQoJCQl9CgkJfQoJfQoKCgkvKioKCSAqIFJ1biBwb3N0LWNvbXBpbGUgdmlzaXRvcnMKCSAqCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gUG9zdFZpc2l0b3JzKCRldmFsZFJvb3QpewoKCQkkdmlzaXRvcnMgPSBhcnJheSgpOwoJCSR2aXNpdG9yc1tdID0gbmV3IExlc3NfVmlzaXRvcl9qb2luU2VsZWN0b3IoKTsKCQlpZiggc2VsZjo6JGhhc19leHRlbmRzICl7CgkJCSR2aXNpdG9yc1tdID0gbmV3IExlc3NfVmlzaXRvcl9wcm9jZXNzRXh0ZW5kcygpOwoJCX0KCQkkdmlzaXRvcnNbXSA9IG5ldyBMZXNzX1Zpc2l0b3JfdG9DU1MoKTsKCgoJCWlmKCBMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ3BsdWdpbnMnXSApewoJCQlmb3JlYWNoKExlc3NfUGFyc2VyOjokb3B0aW9uc1sncGx1Z2lucyddIGFzICRwbHVnaW4pewoJCQkJaWYoIHByb3BlcnR5X2V4aXN0cygkcGx1Z2luLCdpc1ByZUV2YWxWaXNpdG9yJykgJiYgJHBsdWdpbi0+aXNQcmVFdmFsVmlzaXRvciApewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoKCQkJCWlmKCBwcm9wZXJ0eV9leGlzdHMoJHBsdWdpbiwnaXNQcmVWaXNpdG9yJykgJiYgJHBsdWdpbi0+aXNQcmVWaXNpdG9yICl7CgkJCQkJYXJyYXlfdW5zaGlmdCggJHZpc2l0b3JzLCAkcGx1Z2luKTsKCQkJCX1lbHNlewoJCQkJCSR2aXNpdG9yc1tdID0gJHBsdWdpbjsKCQkJCX0KCQkJfQoJCX0KCgoJCWZvcigkaSA9IDA7ICRpIDwgY291bnQoJHZpc2l0b3JzKTsgJGkrKyApewoJCQkkdmlzaXRvcnNbJGldLT5ydW4oJGV2YWxkUm9vdCk7CgkJfQoKCX0KCgoJLyoqCgkgKiBQYXJzZSBhIExlc3Mgc3RyaW5nIGludG8gY3NzCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSBzdHJpbmcgdG8gY29udmVydAoJICogQHBhcmFtIHN0cmluZyAkdXJpX3Jvb3QgVGhlIHVybCBvZiB0aGUgZmlsZQoJICogQHJldHVybiBMZXNzX1RyZWVfUnVsZXNldHxMZXNzX1BhcnNlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gcGFyc2UoICRzdHIsICRmaWxlX3VyaSA9IG51bGwgKXsKCgkJaWYoICEkZmlsZV91cmkgKXsKCQkJJHVyaV9yb290ID0gJyc7CgkJCSRmaWxlbmFtZSA9ICdhbm9ueW1vdXMtZmlsZS0nLkxlc3NfUGFyc2VyOjokbmV4dF9pZCsrLicubGVzcyc7CgkJfWVsc2V7CgkJCSRmaWxlX3VyaSA9IHNlbGY6OldpblBhdGgoJGZpbGVfdXJpKTsKCQkJJGZpbGVuYW1lID0gJGZpbGVfdXJpOwoJCQkkdXJpX3Jvb3QgPSBkaXJuYW1lKCRmaWxlX3VyaSk7CgkJfQoKCQkkcHJldmlvdXNGaWxlSW5mbyA9ICR0aGlzLT5lbnYtPmN1cnJlbnRGaWxlSW5mbzsKCQkkdXJpX3Jvb3QgPSBzZWxmOjpXaW5QYXRoKCR1cmlfcm9vdCk7CgkJJHRoaXMtPlNldEZpbGVJbmZvKCRmaWxlbmFtZSwgJHVyaV9yb290KTsKCgkJJHRoaXMtPmlucHV0ID0gJHN0cjsKCQkkdGhpcy0+X3BhcnNlKCk7CgoJCWlmKCAkcHJldmlvdXNGaWxlSW5mbyApewoJCQkkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm8gPSAkcHJldmlvdXNGaWxlSW5mbzsKCQl9CgoJCXJldHVybiAkdGhpczsKCX0KCgoJLyoqCgkgKiBQYXJzZSBhIExlc3Mgc3RyaW5nIGZyb20gYSBnaXZlbiBmaWxlCgkgKgoJICogQHRocm93cyBMZXNzX0V4Y2VwdGlvbl9QYXJzZXIKCSAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lIFRoZSBmaWxlIHRvIHBhcnNlCgkgKiBAcGFyYW0gc3RyaW5nICR1cmlfcm9vdCBUaGUgdXJsIG9mIHRoZSBmaWxlCgkgKiBAcGFyYW0gYm9vbCAkcmV0dXJuUm9vdCBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSBhIGNzcyBzdHJpbmcgYSByb290IG5vZGUKCSAqIEByZXR1cm4gTGVzc19UcmVlX1J1bGVzZXR8TGVzc19QYXJzZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHBhcnNlRmlsZSggJGZpbGVuYW1lLCAkdXJpX3Jvb3QgPSAnJywgJHJldHVyblJvb3QgPSBmYWxzZSl7CgoJCWlmKCAhZmlsZV9leGlzdHMoJGZpbGVuYW1lKSApewoJCQkkdGhpcy0+RXJyb3Ioc3ByaW50ZignRmlsZSBgJXNgIG5vdCBmb3VuZC4nLCAkZmlsZW5hbWUpKTsKCQl9CgoKCQkvLyBmaXggdXJpX3Jvb3Q/CgkJLy8gSW5zdGVhZCBvZiBUaGUgbWl4dHVyZSBvZiBmaWxlIHBhdGggZm9yIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgZGlyZWN0b3J5IHBhdGggZm9yIHRoZSBzZWNvbmQgYXJndW1lbnQgaGFzIGJlZQoJCWlmKCAhJHJldHVyblJvb3QgJiYgIWVtcHR5KCR1cmlfcm9vdCkgJiYgYmFzZW5hbWUoJHVyaV9yb290KSA9PSBiYXNlbmFtZSgkZmlsZW5hbWUpICl7CgkJCSR1cmlfcm9vdCA9IGRpcm5hbWUoJHVyaV9yb290KTsKCQl9CgoKCQkkcHJldmlvdXNGaWxlSW5mbyA9ICR0aGlzLT5lbnYtPmN1cnJlbnRGaWxlSW5mbzsKCgoJCWlmKCAkZmlsZW5hbWUgKXsKCQkJJGZpbGVuYW1lID0gc2VsZjo6V2luUGF0aChyZWFscGF0aCgkZmlsZW5hbWUpKTsKCQl9CgkJJHVyaV9yb290ID0gc2VsZjo6V2luUGF0aCgkdXJpX3Jvb3QpOwoKCQkkdGhpcy0+U2V0RmlsZUluZm8oJGZpbGVuYW1lLCAkdXJpX3Jvb3QpOwoKCQlzZWxmOjpBZGRQYXJzZWRGaWxlKCRmaWxlbmFtZSk7CgoJCWlmKCAkcmV0dXJuUm9vdCApewoJCQkkcnVsZXMgPSAkdGhpcy0+R2V0UnVsZXMoICRmaWxlbmFtZSApOwoJCQkkcmV0dXJuID0gbmV3IExlc3NfVHJlZV9SdWxlc2V0KGFycmF5KCksICRydWxlcyApOwoJCX1lbHNlewoJCQkkdGhpcy0+X3BhcnNlKCAkZmlsZW5hbWUgKTsKCQkJJHJldHVybiA9ICR0aGlzOwoJCX0KCgkJaWYoICRwcmV2aW91c0ZpbGVJbmZvICl7CgkJCSR0aGlzLT5lbnYtPmN1cnJlbnRGaWxlSW5mbyA9ICRwcmV2aW91c0ZpbGVJbmZvOwoJCX0KCgkJcmV0dXJuICRyZXR1cm47Cgl9CgoKCS8qKgoJICogQWxsb3dzIGEgdXNlciB0byBzZXQgdmFyaWFibGVzIHZhbHVlcwoJICogQHBhcmFtIGFycmF5ICR2YXJzCgkgKiBAcmV0dXJuIExlc3NfUGFyc2VyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBNb2RpZnlWYXJzKCAkdmFycyApewoKCQkkdGhpcy0+aW5wdXQgPSBMZXNzX1BhcnNlcjo6c2VyaWFsaXplVmFycyggJHZhcnMgKTsKCQkkdGhpcy0+X3BhcnNlKCk7CgoJCXJldHVybiAkdGhpczsKCX0KCgoJLyoqCgkgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZQoJICovCglwdWJsaWMgZnVuY3Rpb24gU2V0RmlsZUluZm8oICRmaWxlbmFtZSwgJHVyaV9yb290ID0gJycpewoKCQkkZmlsZW5hbWUgPSBMZXNzX0Vudmlyb25tZW50Ojpub3JtYWxpemVQYXRoKCRmaWxlbmFtZSk7CgkJJGRpcm5hbWUgPSBwcmVnX3JlcGxhY2UoJy9bXlwvXFxcXF0qJC8nLCcnLCRmaWxlbmFtZSk7CgoJCWlmKCAhZW1wdHkoJHVyaV9yb290KSApewoJCQkkdXJpX3Jvb3QgPSBydHJpbSgkdXJpX3Jvb3QsJy8nKS4nLyc7CgkJfQoKCQkkY3VycmVudEZpbGVJbmZvID0gYXJyYXkoKTsKCgkJLy9lbnRyeSBpbmZvCgkJaWYoIGlzc2V0KCR0aGlzLT5lbnYtPmN1cnJlbnRGaWxlSW5mbykgKXsKCQkJJGN1cnJlbnRGaWxlSW5mb1snZW50cnlQYXRoJ10gPSAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm9bJ2VudHJ5UGF0aCddOwoJCQkkY3VycmVudEZpbGVJbmZvWydlbnRyeVVyaSddID0gJHRoaXMtPmVudi0+Y3VycmVudEZpbGVJbmZvWydlbnRyeVVyaSddOwoJCQkkY3VycmVudEZpbGVJbmZvWydyb290cGF0aCddID0gJHRoaXMtPmVudi0+Y3VycmVudEZpbGVJbmZvWydyb290cGF0aCddOwoKCQl9ZWxzZXsKCQkJJGN1cnJlbnRGaWxlSW5mb1snZW50cnlQYXRoJ10gPSAkZGlybmFtZTsKCQkJJGN1cnJlbnRGaWxlSW5mb1snZW50cnlVcmknXSA9ICR1cmlfcm9vdDsKCQkJJGN1cnJlbnRGaWxlSW5mb1sncm9vdHBhdGgnXSA9ICRkaXJuYW1lOwoJCX0KCgkJJGN1cnJlbnRGaWxlSW5mb1snY3VycmVudERpcmVjdG9yeSddID0gJGRpcm5hbWU7CgkJJGN1cnJlbnRGaWxlSW5mb1snY3VycmVudFVyaSddID0gJHVyaV9yb290LmJhc2VuYW1lKCRmaWxlbmFtZSk7CgkJJGN1cnJlbnRGaWxlSW5mb1snZmlsZW5hbWUnXSA9ICRmaWxlbmFtZTsKCQkkY3VycmVudEZpbGVJbmZvWyd1cmlfcm9vdCddID0gJHVyaV9yb290OwoKCgkJLy9pbmhlcml0IHJlZmVyZW5jZQoJCWlmKCBpc3NldCgkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm9bJ3JlZmVyZW5jZSddKSAmJiAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm9bJ3JlZmVyZW5jZSddICl7CgkJCSRjdXJyZW50RmlsZUluZm9bJ3JlZmVyZW5jZSddID0gdHJ1ZTsKCQl9CgoJCSR0aGlzLT5lbnYtPmN1cnJlbnRGaWxlSW5mbyA9ICRjdXJyZW50RmlsZUluZm87Cgl9CgoKCS8qKgoJICogQGRlcHJlY2F0ZWQgMS41LjEuMgoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIFNldENhY2hlRGlyKCAkZGlyICl7CgoJCWlmKCAhZmlsZV9leGlzdHMoJGRpcikgKXsKCQkJaWYoIG1rZGlyKCRkaXIpICl7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fUGFyc2VyKCdMZXNzLnBocCBjYWNoZSBkaXJlY3RvcnkgY291bGRuXCd0IGJlIGNyZWF0ZWQ6ICcuJGRpcik7CgoJCX1lbHNlaWYoICFpc19kaXIoJGRpcikgKXsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX1BhcnNlcignTGVzcy5waHAgY2FjaGUgZGlyZWN0b3J5IGRvZXNuXCd0IGV4aXN0OiAnLiRkaXIpOwoKCQl9ZWxzZWlmKCAhaXNfd3JpdGFibGUoJGRpcikgKXsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX1BhcnNlcignTGVzcy5waHAgY2FjaGUgZGlyZWN0b3J5IGlzblwndCB3cml0YWJsZTogJy4kZGlyKTsKCgkJfWVsc2V7CgkJCSRkaXIgPSBzZWxmOjpXaW5QYXRoKCRkaXIpOwoJCQlMZXNzX0NhY2hlOjokY2FjaGVfZGlyID0gcnRyaW0oJGRpciwnLycpLicvJzsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfQoKCgkvKioKCSAqIFNldCBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgb3IgY2FsbGJhY2tzIHRoZSBwYXJzZXIgc2hvdWxkIHVzZSBmb3IgZGV0ZXJtaW5pbmcgaW1wb3J0IHBhdGhzCgkgKgoJICogQHBhcmFtIGFycmF5ICRkaXJzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBTZXRJbXBvcnREaXJzKCAkZGlycyApewoJCUxlc3NfUGFyc2VyOjokb3B0aW9uc1snaW1wb3J0X2RpcnMnXSA9IGFycmF5KCk7CgoJCWZvcmVhY2goJGRpcnMgYXMgJHBhdGggPT4gJHVyaV9yb290KXsKCgkJCSRwYXRoID0gc2VsZjo6V2luUGF0aCgkcGF0aCk7CgkJCWlmKCAhZW1wdHkoJHBhdGgpICl7CgkJCQkkcGF0aCA9IHJ0cmltKCRwYXRoLCcvJykuJy8nOwoJCQl9CgoJCQlpZiAoICFpc19jYWxsYWJsZSgkdXJpX3Jvb3QpICl7CgkJCQkkdXJpX3Jvb3QgPSBzZWxmOjpXaW5QYXRoKCR1cmlfcm9vdCk7CgkJCQlpZiggIWVtcHR5KCR1cmlfcm9vdCkgKXsKCQkJCQkkdXJpX3Jvb3QgPSBydHJpbSgkdXJpX3Jvb3QsJy8nKS4nLyc7CgkJCQl9CgkJCX0KCgkJCUxlc3NfUGFyc2VyOjokb3B0aW9uc1snaW1wb3J0X2RpcnMnXVskcGF0aF0gPSAkdXJpX3Jvb3Q7CgkJfQoJfQoKCS8qKgoJICogQHBhcmFtIHN0cmluZyAkZmlsZV9wYXRoCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3BhcnNlKCAkZmlsZV9wYXRoID0gbnVsbCApewoJCSR0aGlzLT5ydWxlcyA9IGFycmF5X21lcmdlKCR0aGlzLT5ydWxlcywgJHRoaXMtPkdldFJ1bGVzKCAkZmlsZV9wYXRoICkpOwoJfQoKCgkvKioKCSAqIFJldHVybiB0aGUgcmVzdWx0cyBvZiBwYXJzZVByaW1hcnkgZm9yICRmaWxlX3BhdGgKCSAqIFVzZSBjYWNoZSBhbmQgc2F2ZSBjYWNoZWQgcmVzdWx0cyBpZiBwb3NzaWJsZQoJICoKCSAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkZmlsZV9wYXRoCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gR2V0UnVsZXMoICRmaWxlX3BhdGggKXsKCgkJJHRoaXMtPlNldElucHV0KCRmaWxlX3BhdGgpOwoKCQkkY2FjaGVfZmlsZSA9ICR0aGlzLT5DYWNoZUZpbGUoICRmaWxlX3BhdGggKTsKCQlpZiggJGNhY2hlX2ZpbGUgKXsKCQkJaWYoIExlc3NfUGFyc2VyOjokb3B0aW9uc1snY2FjaGVfbWV0aG9kJ10gPT0gJ2NhbGxiYWNrJyApewoJCQkJaWYoIGlzX2NhbGxhYmxlKExlc3NfUGFyc2VyOjokb3B0aW9uc1snY2FjaGVfY2FsbGJhY2tfZ2V0J10pICl7CgkJCQkJJGNhY2hlID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoCgkJCQkJCUxlc3NfUGFyc2VyOjokb3B0aW9uc1snY2FjaGVfY2FsbGJhY2tfZ2V0J10sCgkJCQkJCWFycmF5KCR0aGlzLCAkZmlsZV9wYXRoLCAkY2FjaGVfZmlsZSkKCQkJCQkpOwoKCQkJCQlpZiggJGNhY2hlICl7CgkJCQkJCSR0aGlzLT5VbnNldElucHV0KCk7CgkJCQkJCXJldHVybiAkY2FjaGU7CgkJCQkJfQoJCQkJfQoKCQkJfWVsc2VpZiggZmlsZV9leGlzdHMoJGNhY2hlX2ZpbGUpICl7CgkJCQlzd2l0Y2goTGVzc19QYXJzZXI6OiRvcHRpb25zWydjYWNoZV9tZXRob2QnXSl7CgoJCQkJCS8vIFVzaW5nIHNlcmlhbGl6ZQoJCQkJCS8vIEZhc3RlciBidXQgdXNlcyBtb3JlIG1lbW9yeQoJCQkJCWNhc2UgJ3NlcmlhbGl6ZSc6CgkJCQkJCSRjYWNoZSA9IHVuc2VyaWFsaXplKGZpbGVfZ2V0X2NvbnRlbnRzKCRjYWNoZV9maWxlKSk7CgkJCQkJCWlmKCAkY2FjaGUgKXsKCQkJCQkJCXRvdWNoKCRjYWNoZV9maWxlKTsKCQkJCQkJCSR0aGlzLT5VbnNldElucHV0KCk7CgkJCQkJCQlyZXR1cm4gJGNhY2hlOwoJCQkJCQl9CgkJCQkJYnJlYWs7CgoKCQkJCQkvLyBVc2luZyBnZW5lcmF0ZWQgcGhwIGNvZGUKCQkJCQljYXNlICd2YXJfZXhwb3J0JzoKCQkJCQljYXNlICdwaHAnOgoJCQkJCSR0aGlzLT5VbnNldElucHV0KCk7CgkJCQkJcmV0dXJuIGluY2x1ZGUoJGNhY2hlX2ZpbGUpOwoJCQkJfQoJCQl9CgkJfQoKCQkkcnVsZXMgPSAkdGhpcy0+cGFyc2VQcmltYXJ5KCk7CgoJCWlmKCAkdGhpcy0+cG9zIDwgJHRoaXMtPmlucHV0X2xlbiApewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ2h1bmsoJHRoaXMtPmlucHV0LCBudWxsLCAkdGhpcy0+ZnVydGhlc3QsICR0aGlzLT5lbnYtPmN1cnJlbnRGaWxlSW5mbyk7CgkJfQoKCQkkdGhpcy0+VW5zZXRJbnB1dCgpOwoKCgkJLy9zYXZlIHRoZSBjYWNoZQoJCWlmKCAkY2FjaGVfZmlsZSApewoJCQlpZiggTGVzc19QYXJzZXI6OiRvcHRpb25zWydjYWNoZV9tZXRob2QnXSA9PSAnY2FsbGJhY2snICl7CgkJCQlpZiggaXNfY2FsbGFibGUoTGVzc19QYXJzZXI6OiRvcHRpb25zWydjYWNoZV9jYWxsYmFja19zZXQnXSkgKXsKCQkJCQljYWxsX3VzZXJfZnVuY19hcnJheSgKCQkJCQkJTGVzc19QYXJzZXI6OiRvcHRpb25zWydjYWNoZV9jYWxsYmFja19zZXQnXSwKCQkJCQkJYXJyYXkoJHRoaXMsICRmaWxlX3BhdGgsICRjYWNoZV9maWxlLCAkcnVsZXMpCgkJCQkJKTsKCQkJCX0KCgkJCX1lbHNlewoJCQkJLy9tc2coJ3dyaXRlIGNhY2hlIGZpbGUnKTsKCQkJCXN3aXRjaChMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ2NhY2hlX21ldGhvZCddKXsKCQkJCQljYXNlICdzZXJpYWxpemUnOgoJCQkJCQlmaWxlX3B1dF9jb250ZW50cyggJGNhY2hlX2ZpbGUsIHNlcmlhbGl6ZSgkcnVsZXMpICk7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAncGhwJzoKCQkJCQkJZmlsZV9wdXRfY29udGVudHMoICRjYWNoZV9maWxlLCAnPD9waHAgcmV0dXJuICcuc2VsZjo6QXJnU3RyaW5nKCRydWxlcykuJzsgPz4nICk7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAndmFyX2V4cG9ydCc6CgkJCQkJCS8vUmVxdWlyZXMgX19zZXRfc3RhdGUoKQoJCQkJCQlmaWxlX3B1dF9jb250ZW50cyggJGNhY2hlX2ZpbGUsICc8P3BocCByZXR1cm4gJy52YXJfZXhwb3J0KCRydWxlcyx0cnVlKS4nOyA/PicgKTsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQlMZXNzX0NhY2hlOjpDbGVhbkNhY2hlKCk7CgkJCX0KCQl9CgoJCXJldHVybiAkcnVsZXM7Cgl9CgoKCS8qKgoJICogU2V0IHVwIHRoZSBpbnB1dCBidWZmZXIKCSAqCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBTZXRJbnB1dCggJGZpbGVfcGF0aCApewoKCQlpZiggJGZpbGVfcGF0aCApewoJCQkkdGhpcy0+aW5wdXQgPSBmaWxlX2dldF9jb250ZW50cyggJGZpbGVfcGF0aCApOwoJCX0KCgkJJHRoaXMtPnBvcyA9ICR0aGlzLT5mdXJ0aGVzdCA9IDA7CgoJCS8vIFJlbW92ZSBwb3RlbnRpYWwgVVRGIEJ5dGUgT3JkZXIgTWFyawoJCSR0aGlzLT5pbnB1dCA9IHByZWdfcmVwbGFjZSgnL1xcR1x4RUZceEJCXHhCRi8nLCAnJywgJHRoaXMtPmlucHV0KTsKCQkkdGhpcy0+aW5wdXRfbGVuID0gc3RybGVuKCR0aGlzLT5pbnB1dCk7CgoKCQlpZiggTGVzc19QYXJzZXI6OiRvcHRpb25zWydzb3VyY2VNYXAnXSAmJiAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm8gKXsKCQkJJHVyaSA9ICR0aGlzLT5lbnYtPmN1cnJlbnRGaWxlSW5mb1snY3VycmVudFVyaSddOwoJCQlMZXNzX1BhcnNlcjo6JGNvbnRlbnRzTWFwWyR1cmldID0gJHRoaXMtPmlucHV0OwoJCX0KCgl9CgoKCS8qKgoJICogRnJlZSB1cCBzb21lIG1lbW9yeQoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIFVuc2V0SW5wdXQoKXsKCQl1bnNldCgkdGhpcy0+aW5wdXQsICR0aGlzLT5wb3MsICR0aGlzLT5pbnB1dF9sZW4sICR0aGlzLT5mdXJ0aGVzdCk7CgkJJHRoaXMtPnNhdmVTdGFjayA9IGFycmF5KCk7Cgl9CgoKCXB1YmxpYyBmdW5jdGlvbiBDYWNoZUZpbGUoICRmaWxlX3BhdGggKXsKCgkJaWYoICRmaWxlX3BhdGggJiYgJHRoaXMtPkNhY2hlRW5hYmxlZCgpICl7CgoJCQkkZW52ID0gZ2V0X29iamVjdF92YXJzKCR0aGlzLT5lbnYpOwoJCQl1bnNldCgkZW52WydmcmFtZXMnXSk7CgoJCQkkcGFydHMgPSBhcnJheSgpOwoJCQkkcGFydHNbXSA9ICRmaWxlX3BhdGg7CgkJCSRwYXJ0c1tdID0gZmlsZXNpemUoICRmaWxlX3BhdGggKTsKCQkJJHBhcnRzW10gPSBmaWxlbXRpbWUoICRmaWxlX3BhdGggKTsKCQkJJHBhcnRzW10gPSAkZW52OwoJCQkkcGFydHNbXSA9IExlc3NfVmVyc2lvbjo6Y2FjaGVfdmVyc2lvbjsKCQkJJHBhcnRzW10gPSBMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ2NhY2hlX21ldGhvZCddOwoJCQlyZXR1cm4gTGVzc19DYWNoZTo6JGNhY2hlX2RpciAuIExlc3NfQ2FjaGU6OiRwcmVmaXggLiBiYXNlX2NvbnZlcnQoIHNoYTEoanNvbl9lbmNvZGUoJHBhcnRzKSApLCAxNiwgMzYpIC4gJy5sZXNzY2FjaGUnOwoJCX0KCX0KCgoJc3RhdGljIGZ1bmN0aW9uIEFkZFBhcnNlZEZpbGUoJGZpbGUpewoJCXNlbGY6OiRpbXBvcnRzW10gPSAkZmlsZTsKCX0KCglzdGF0aWMgZnVuY3Rpb24gQWxsUGFyc2VkRmlsZXMoKXsKCQlyZXR1cm4gc2VsZjo6JGltcG9ydHM7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gc3RyaW5nICRmaWxlCgkgKi8KCXN0YXRpYyBmdW5jdGlvbiBGaWxlUGFyc2VkKCRmaWxlKXsKCQlyZXR1cm4gaW5fYXJyYXkoJGZpbGUsc2VsZjo6JGltcG9ydHMpOwoJfQoKCglmdW5jdGlvbiBzYXZlKCkgewoJCSR0aGlzLT5zYXZlU3RhY2tbXSA9ICR0aGlzLT5wb3M7Cgl9CgoJcHJpdmF0ZSBmdW5jdGlvbiByZXN0b3JlKCkgewoJCSR0aGlzLT5wb3MgPSBhcnJheV9wb3AoJHRoaXMtPnNhdmVTdGFjayk7Cgl9CgoJcHJpdmF0ZSBmdW5jdGlvbiBmb3JnZXQoKXsKCQlhcnJheV9wb3AoJHRoaXMtPnNhdmVTdGFjayk7Cgl9CgoKCXByaXZhdGUgZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKCRvZmZzZXQgPSAwKSB7CgkJcmV0dXJuIHByZWdfbWF0Y2goJy9ccy8nLCR0aGlzLT5pbnB1dFsgJHRoaXMtPnBvcyArICRvZmZzZXRdKTsKCX0KCgkvKioKCSAqIFBhcnNlIGZyb20gYSB0b2tlbiwgcmVnZXhwIG9yIHN0cmluZywgYW5kIG1vdmUgZm9yd2FyZCBpZiBtYXRjaAoJICoKCSAqIEBwYXJhbSBhcnJheSAkdG9rcwoJICogQHJldHVybiBhcnJheQoJICovCglwcml2YXRlIGZ1bmN0aW9uIG1hdGNoKCR0b2tzKXsKCgkJLy8gVGhlIG1hdGNoIGlzIGNvbmZpcm1lZCwgYWRkIHRoZSBtYXRjaCBsZW5ndGggdG8gYHRoaXM6OnBvc2AsCgkJLy8gYW5kIGNvbnN1bWUgYW55IGV4dHJhIHdoaXRlLXNwYWNlIGNoYXJhY3RlcnMgKCcgJyB8fCAnXG4nKQoJCS8vIHdoaWNoIGNvbWUgYWZ0ZXIgdGhhdC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IExlU1MncwoJCS8vIGdyYW1tYXIgaXMgbW9zdGx5IHdoaXRlLXNwYWNlIGluc2Vuc2l0aXZlLgoJCS8vCgoJCWZvcmVhY2goJHRva3MgYXMgJHRvayl7CgoJCQkkY2hhciA9ICR0b2tbMF07CgoJCQlpZiggJGNoYXIgPT09ICcvJyApewoJCQkJJG1hdGNoID0gJHRoaXMtPk1hdGNoUmVnKCR0b2spOwoKCQkJCWlmKCAkbWF0Y2ggKXsKCQkJCQlyZXR1cm4gY291bnQoJG1hdGNoKSA9PT0gMSA/ICRtYXRjaFswXSA6ICRtYXRjaDsKCQkJCX0KCgkJCX1lbHNlaWYoICRjaGFyID09PSAnIycgKXsKCQkJCSRtYXRjaCA9ICR0aGlzLT5NYXRjaENoYXIoJHRva1sxXSk7CgoJCQl9ZWxzZXsKCQkJCS8vIE5vbi10ZXJtaW5hbCwgbWF0Y2ggdXNpbmcgYSBmdW5jdGlvbiBjYWxsCgkJCQkkbWF0Y2ggPSAkdGhpcy0+JHRvaygpOwoKCQkJfQoKCQkJaWYoICRtYXRjaCApewoJCQkJcmV0dXJuICRtYXRjaDsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIEBwYXJhbSBzdHJpbmdbXSAkdG9rcwoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gTWF0Y2hGdW5jcygkdG9rcyl7CgoJCWlmKCAkdGhpcy0+cG9zIDwgJHRoaXMtPmlucHV0X2xlbiApewoJCQlmb3JlYWNoKCR0b2tzIGFzICR0b2spewoJCQkJJG1hdGNoID0gJHRoaXMtPiR0b2soKTsKCQkJCWlmKCAkbWF0Y2ggKXsKCQkJCQlyZXR1cm4gJG1hdGNoOwoJCQkJfQoJCQl9CgkJfQoKCX0KCgkvLyBNYXRjaCBhIHNpbmdsZSBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0LAoJcHJpdmF0ZSBmdW5jdGlvbiBNYXRjaENoYXIoJHRvayl7CgkJaWYoICgkdGhpcy0+cG9zIDwgJHRoaXMtPmlucHV0X2xlbikgJiYgKCR0aGlzLT5pbnB1dFskdGhpcy0+cG9zXSA9PT0gJHRvaykgKXsKCQkJJHRoaXMtPnNraXBXaGl0ZXNwYWNlKDEpOwoJCQlyZXR1cm4gJHRvazsKCQl9Cgl9CgoJLy8gTWF0Y2ggYSByZWdleHAgZnJvbSB0aGUgY3VycmVudCBzdGFydCBwb2ludAoJcHJpdmF0ZSBmdW5jdGlvbiBNYXRjaFJlZygkdG9rKXsKCgkJaWYoIHByZWdfbWF0Y2goJHRvaywgJHRoaXMtPmlucHV0LCAkbWF0Y2gsIDAsICR0aGlzLT5wb3MpICl7CgkJCSR0aGlzLT5za2lwV2hpdGVzcGFjZShzdHJsZW4oJG1hdGNoWzBdKSk7CgkJCXJldHVybiAkbWF0Y2g7CgkJfQoJfQoKCgkvKioKCSAqIFNhbWUgYXMgbWF0Y2goKSwgYnV0IGRvbid0IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIHBhcnNlciwKCSAqIGp1c3QgcmV0dXJuIHRoZSBtYXRjaC4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0b2sKCSAqIEByZXR1cm4gaW50ZWdlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gUGVla1JlZygkdG9rKXsKCQlyZXR1cm4gcHJlZ19tYXRjaCgkdG9rLCAkdGhpcy0+aW5wdXQsICRtYXRjaCwgMCwgJHRoaXMtPnBvcyk7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gc3RyaW5nICR0b2sKCSAqLwoJcHVibGljIGZ1bmN0aW9uIFBlZWtDaGFyKCR0b2spewoJCS8vcmV0dXJuICgkdGhpcy0+aW5wdXRbJHRoaXMtPnBvc10gPT09ICR0b2sgKTsKCQlyZXR1cm4gKCR0aGlzLT5wb3MgPCAkdGhpcy0+aW5wdXRfbGVuKSAmJiAoJHRoaXMtPmlucHV0WyR0aGlzLT5wb3NdID09PSAkdG9rICk7Cgl9CgoKCS8qKgoJICogQHBhcmFtIGludGVnZXIgJGxlbmd0aAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2tpcFdoaXRlc3BhY2UoJGxlbmd0aCl7CgoJCSR0aGlzLT5wb3MgKz0gJGxlbmd0aDsKCgkJZm9yKDsgJHRoaXMtPnBvcyA8ICR0aGlzLT5pbnB1dF9sZW47ICR0aGlzLT5wb3MrKyApewoJCQkkYyA9ICR0aGlzLT5pbnB1dFskdGhpcy0+cG9zXTsKCgkJCWlmKCAoJGMgIT09ICJcbiIpICYmICgkYyAhPT0gIlxyIikgJiYgKCRjICE9PSAiXHQiKSAmJiAoJGMgIT09ICcgJykgKXsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCgkvKioKCSAqIEBwYXJhbSBzdHJpbmcgJHRvawoJICogQHBhcmFtIHN0cmluZ3xudWxsICRtc2cKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGV4cGVjdCgkdG9rLCAkbXNnID0gTlVMTCkgewoJCSRyZXN1bHQgPSAkdGhpcy0+bWF0Y2goIGFycmF5KCR0b2spICk7CgkJaWYgKCEkcmVzdWx0KSB7CgkJCSR0aGlzLT5FcnJvciggJG1zZwk/ICJFeHBlY3RlZCAnIiAuICR0b2sgLiAiJyBnb3QgJyIgLiAkdGhpcy0+aW5wdXRbJHRoaXMtPnBvc10gLiAiJyIgOiAkbXNnICk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXN1bHQ7CgkJfQoJfQoKCS8qKgoJICogQHBhcmFtIHN0cmluZyAkdG9rCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBleHBlY3RDaGFyKCR0b2ssICRtc2cgPSBudWxsICl7CgkJJHJlc3VsdCA9ICR0aGlzLT5NYXRjaENoYXIoJHRvayk7CgkJaWYoICEkcmVzdWx0ICl7CgkJCSR0aGlzLT5FcnJvciggJG1zZyA/ICJFeHBlY3RlZCAnIiAuICR0b2sgLiAiJyBnb3QgJyIgLiAkdGhpcy0+aW5wdXRbJHRoaXMtPnBvc10gLiAiJyIgOiAkbXNnICk7CgkJfWVsc2V7CgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCX0KCgkvLwoJLy8gSGVyZSBpbiwgdGhlIHBhcnNpbmcgcnVsZXMvZnVuY3Rpb25zCgkvLwoJLy8gVGhlIGJhc2ljIHN0cnVjdHVyZSBvZiB0aGUgc3ludGF4IHRyZWUgZ2VuZXJhdGVkIGlzIGFzIGZvbGxvd3M6CgkvLwoJLy8gICBSdWxlc2V0IC0+ICBSdWxlIC0+IFZhbHVlIC0+IEV4cHJlc3Npb24gLT4gRW50aXR5CgkvLwoJLy8gSGVyZSdzIHNvbWUgTEVTUyBjb2RlOgoJLy8KCS8vCS5jbGFzcyB7CgkvLwkgIGNvbG9yOiAjZmZmOwoJLy8JICBib3JkZXI6IDFweCBzb2xpZCAjMDAwOwoJLy8JICB3aWR0aDogQHcgKyA0cHg7CgkvLwkgID4gLmNoaWxkIHsuLi59CgkvLwl9CgkvLwoJLy8gQW5kIGhlcmUncyB3aGF0IHRoZSBwYXJzZSB0cmVlIG1pZ2h0IGxvb2sgbGlrZToKCS8vCgkvLwkgUnVsZXNldCAoU2VsZWN0b3IgJy5jbGFzcycsIFsKCS8vCQkgUnVsZSAoImNvbG9yIiwgIFZhbHVlIChbRXhwcmVzc2lvbiBbQ29sb3IgI2ZmZl1dKSkKCS8vCQkgUnVsZSAoImJvcmRlciIsIFZhbHVlIChbRXhwcmVzc2lvbiBbRGltZW5zaW9uIDFweF1bS2V5d29yZCAic29saWQiXVtDb2xvciAjMDAwXV0pKQoJLy8JCSBSdWxlICgid2lkdGgiLCAgVmFsdWUgKFtFeHByZXNzaW9uIFtPcGVyYXRpb24gIisiIFtWYXJpYWJsZSAiQHciXVtEaW1lbnNpb24gNHB4XV1dKSkKCS8vCQkgUnVsZXNldCAoU2VsZWN0b3IgW0VsZW1lbnQgJz4nLCAnLmNoaWxkJ10sIFsuLi5dKQoJLy8JIF0pCgkvLwoJLy8gIEluIGdlbmVyYWwsIG1vc3QgcnVsZXMgd2lsbCB0cnkgdG8gcGFyc2UgYSB0b2tlbiB3aXRoIHRoZSBgJCgpYCBmdW5jdGlvbiwgYW5kIGlmIHRoZSByZXR1cm4KCS8vICB2YWx1ZSBpcyB0cnVseSwgd2lsbCByZXR1cm4gYSBuZXcgbm9kZSwgb2YgdGhlIHJlbGV2YW50IHR5cGUuIFNvbWV0aW1lcywgd2UgbmVlZCB0byBjaGVjawoJLy8gIGZpcnN0LCBiZWZvcmUgcGFyc2luZywgdGhhdCdzIHdoZW4gd2UgdXNlIGBwZWVrKClgLgoJLy8KCgkvLwoJLy8gVGhlIGBwcmltYXJ5YCBydWxlIGlzIHRoZSAqZW50cnkqIGFuZCAqZXhpdCogcG9pbnQgb2YgdGhlIHBhcnNlci4KCS8vIFRoZSBydWxlcyBoZXJlIGNhbiBhcHBlYXIgYXQgYW55IGxldmVsIG9mIHRoZSBwYXJzZSB0cmVlLgoJLy8KCS8vIFRoZSByZWN1cnNpdmUgbmF0dXJlIG9mIHRoZSBncmFtbWFyIGlzIGFuIGludGVycGxheSBiZXR3ZWVuIHRoZSBgYmxvY2tgCgkvLyBydWxlLCB3aGljaCByZXByZXNlbnRzIGB7IC4uLiB9YCwgdGhlIGBydWxlc2V0YCBydWxlLCBhbmQgdGhpcyBgcHJpbWFyeWAgcnVsZSwKCS8vIGFzIHJlcHJlc2VudGVkIGJ5IHRoaXMgc2ltcGxpZmllZCBncmFtbWFyOgoJLy8KCS8vCSBwcmltYXJ5ICDihpIgIChydWxlc2V0IHwgcnVsZSkrCgkvLwkgcnVsZXNldCAg4oaSICBzZWxlY3RvcisgYmxvY2sKCS8vCSBibG9jawnihpIgICd7JyBwcmltYXJ5ICd9JwoJLy8KCS8vIE9ubHkgYXQgb25lIHBvaW50IGlzIHRoZSBwcmltYXJ5IHJ1bGUgbm90IGNhbGxlZCBmcm9tIHRoZQoJLy8gYmxvY2sgcnVsZTogYXQgdGhlIHJvb3QgbGV2ZWwuCgkvLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZVByaW1hcnkoKXsKCQkkcm9vdCA9IGFycmF5KCk7CgoJCXdoaWxlKCB0cnVlICl7CgoJCQlpZiggJHRoaXMtPnBvcyA+PSAkdGhpcy0+aW5wdXRfbGVuICl7CgkJCQlicmVhazsKCQkJfQoKCQkJJG5vZGUgPSAkdGhpcy0+cGFyc2VFeHRlbmQodHJ1ZSk7CgkJCWlmKCAkbm9kZSApewoJCQkJJHJvb3QgPSBhcnJheV9tZXJnZSgkcm9vdCwkbm9kZSk7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8kbm9kZSA9ICR0aGlzLT5NYXRjaEZ1bmNzKCBhcnJheSggJ3BhcnNlTWl4aW5EZWZpbml0aW9uJywgJ3BhcnNlUnVsZScsICdwYXJzZVJ1bGVzZXQnLCAncGFyc2VNaXhpbkNhbGwnLCAncGFyc2VDb21tZW50JywgJ3BhcnNlRGlyZWN0aXZlJykpOwoJCQkkbm9kZSA9ICR0aGlzLT5NYXRjaEZ1bmNzKCBhcnJheSggJ3BhcnNlTWl4aW5EZWZpbml0aW9uJywgJ3BhcnNlTmFtZVZhbHVlJywgJ3BhcnNlUnVsZScsICdwYXJzZVJ1bGVzZXQnLCAncGFyc2VNaXhpbkNhbGwnLCAncGFyc2VDb21tZW50JywgJ3BhcnNlUnVsZXNldENhbGwnLCAncGFyc2VEaXJlY3RpdmUnKSk7CgoJCQlpZiggJG5vZGUgKXsKCQkJCSRyb290W10gPSAkbm9kZTsKCQkJfWVsc2VpZiggISR0aGlzLT5NYXRjaFJlZygnL1xcR1tcc1xuO10rLycpICl7CgkJCQlicmVhazsKCQkJfQoKICAgICAgICAgICAgaWYoICR0aGlzLT5QZWVrQ2hhcignfScpICl7CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJcmV0dXJuICRyb290OwoJfQoKCgoJLy8gV2UgY3JlYXRlIGEgQ29tbWVudCBub2RlIGZvciBDU1MgY29tbWVudHMgYC8qICovYCwKCS8vIGJ1dCBrZWVwIHRoZSBMZVNTIGNvbW1lbnRzIGAvL2Agc2lsZW50LCBieSBqdXN0IHNraXBwaW5nCgkvLyBvdmVyIHRoZW0uCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlQ29tbWVudCgpewoKCQlpZiggJHRoaXMtPmlucHV0WyR0aGlzLT5wb3NdICE9PSAnLycgKXsKCQkJcmV0dXJuOwoJCX0KCgkJaWYoICR0aGlzLT5pbnB1dFskdGhpcy0+cG9zKzFdID09PSAnLycgKXsKCQkJJG1hdGNoID0gJHRoaXMtPk1hdGNoUmVnKCcvXFxHXC9cLy4qLycpOwoJCQlyZXR1cm4gJHRoaXMtPk5ld09iajQoJ0xlc3NfVHJlZV9Db21tZW50JyxhcnJheSgkbWF0Y2hbMF0sIHRydWUsICR0aGlzLT5wb3MsICR0aGlzLT5lbnYtPmN1cnJlbnRGaWxlSW5mbykpOwoJCX0KCgkJLy8kY29tbWVudCA9ICR0aGlzLT5NYXRjaFJlZygnL1xcR1wvXCooPzpbXipdfFwqK1teXC8qXSkqXCorXC9cbj8vJyk7CgkJJGNvbW1lbnQgPSAkdGhpcy0+TWF0Y2hSZWcoJy9cXEdcL1wqKD9zKS4qP1wqK1wvXG4/LycpOy8vbm90IHRoZSBzYW1lIGFzIGxlc3MuanMgdG8gcHJldmVudCBmYXRhbCBlcnJvcnMKCQlpZiggJGNvbW1lbnQgKXsKCQkJcmV0dXJuICR0aGlzLT5OZXdPYmo0KCdMZXNzX1RyZWVfQ29tbWVudCcsYXJyYXkoJGNvbW1lbnRbMF0sIGZhbHNlLCAkdGhpcy0+cG9zLCAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm8pKTsKCQl9Cgl9CgoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUNvbW1lbnRzKCl7CgkJJGNvbW1lbnRzID0gYXJyYXkoKTsKCgkJd2hpbGUoICR0aGlzLT5wb3MgPCAkdGhpcy0+aW5wdXRfbGVuICl7CgkJCSRjb21tZW50ID0gJHRoaXMtPnBhcnNlQ29tbWVudCgpOwoJCQlpZiggISRjb21tZW50ICl7CgkJCQlicmVhazsKCQkJfQoKCQkJJGNvbW1lbnRzW10gPSAkY29tbWVudDsKCQl9CgoJCXJldHVybiAkY29tbWVudHM7Cgl9CgoKCgkvLwoJLy8gQSBzdHJpbmcsIHdoaWNoIHN1cHBvcnRzIGVzY2FwaW5nICIgYW5kICcKCS8vCgkvLwkgIm1pbGt5IHdheSIgJ2hlXCdzIHRoZSBvbmUhJwoJLy8KCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VFbnRpdGllc1F1b3RlZCgpIHsKCQkkaiA9ICR0aGlzLT5wb3M7CgkJJGUgPSBmYWxzZTsKCQkkaW5kZXggPSAkdGhpcy0+cG9zOwoKCQlpZiggJHRoaXMtPmlucHV0WyR0aGlzLT5wb3NdID09PSAnficgKXsKCQkJJGorKzsKCQkJJGUgPSB0cnVlOyAvLyBFc2NhcGVkIHN0cmluZ3MKCQl9CgoJCWlmKCAkdGhpcy0+aW5wdXRbJGpdICE9ICciJyAmJiAkdGhpcy0+aW5wdXRbJGpdICE9PSAiJyIgKXsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCRlKSB7CgkJCSR0aGlzLT5NYXRjaENoYXIoJ34nKTsKCQl9CgogICAgICAgICAgICAgICAgLy8gRml4IGZvciAjMTI0OiBtYXRjaCBlc2NhcGVkIG5ld2xpbmVzCiAgICAgICAgICAgICAgICAvLyRzdHIgPSAkdGhpcy0+TWF0Y2hSZWcoJy9cXEciKCg/OlteIlxcXFxcclxuXXxcXFxcLikqKSJ8XCcoKD86W15cJ1xcXFxcclxuXXxcXFxcLikqKVwnLycpOwoJCSRzdHIgPSAkdGhpcy0+TWF0Y2hSZWcoJy9cXEciKCg/OlteIlxcXFxcclxuXXxcXFxcLnxcXFxcXHJcbnxcXFxcW1xuXHJcZl0pKikifFwnKCg/OlteXCdcXFxcXHJcbl18XFxcXC58XFxcXFxyXG58XFxcXFtcblxyXGZdKSopXCcvJyk7CgoJCWlmKCAkc3RyICl7CgkJCSRyZXN1bHQgPSAkc3RyWzBdWzBdID09ICciJyA/ICRzdHJbMV0gOiAkc3RyWzJdOwoJCQlyZXR1cm4gJHRoaXMtPk5ld09iajUoJ0xlc3NfVHJlZV9RdW90ZWQnLGFycmF5KCRzdHJbMF0sICRyZXN1bHQsICRlLCAkaW5kZXgsICR0aGlzLT5lbnYtPmN1cnJlbnRGaWxlSW5mbykgKTsKCQl9CgkJcmV0dXJuOwoJfQoKCgkvLwoJLy8gQSBjYXRjaC1hbGwgd29yZCwgc3VjaCBhczoKCS8vCgkvLwkgYmxhY2sgYm9yZGVyLWNvbGxhcHNlCgkvLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUVudGl0aWVzS2V5d29yZCgpewoKCQkvLyRrID0gJHRoaXMtPk1hdGNoUmVnKCcvXFxHW19BLVphLXotXVtfQS1aYS16MC05LV0qLycpOwoJCSRrID0gJHRoaXMtPk1hdGNoUmVnKCcvXFxHJXxcXEdbX0EtWmEtei1dW19BLVphLXowLTktXSovJyk7CgkJaWYoICRrICl7CgkJCSRrID0gJGtbMF07CgkJCSRjb2xvciA9ICR0aGlzLT5mcm9tS2V5d29yZCgkayk7CgkJCWlmKCAkY29sb3IgKXsKCQkJCXJldHVybiAkY29sb3I7CgkJCX0KCQkJcmV0dXJuICR0aGlzLT5OZXdPYmoxKCdMZXNzX1RyZWVfS2V5d29yZCcsJGspOwoJCX0KCX0KCgkvLyBkdXBsaWNhdGUgb2YgTGVzc19UcmVlX0NvbG9yOjpGcm9tS2V5d29yZAoJcHJpdmF0ZSBmdW5jdGlvbiBGcm9tS2V5d29yZCggJGtleXdvcmQgKXsKCQkka2V5d29yZCA9IHN0cnRvbG93ZXIoJGtleXdvcmQpOwoKCQlpZiggTGVzc19Db2xvcnM6Omhhc093blByb3BlcnR5KCRrZXl3b3JkKSApewoJCQkvLyBkZXRlY3QgbmFtZWQgY29sb3IKCQkJcmV0dXJuICR0aGlzLT5OZXdPYmoxKCdMZXNzX1RyZWVfQ29sb3InLHN1YnN0cihMZXNzX0NvbG9yczo6Y29sb3IoJGtleXdvcmQpLCAxKSk7CgkJfQoKCQlpZiggJGtleXdvcmQgPT09ICd0cmFuc3BhcmVudCcgKXsKCQkJcmV0dXJuICR0aGlzLT5OZXdPYmozKCdMZXNzX1RyZWVfQ29sb3InLCBhcnJheSggYXJyYXkoMCwgMCwgMCksIDAsIHRydWUpKTsKCQl9Cgl9CgoJLy8KCS8vIEEgZnVuY3Rpb24gY2FsbAoJLy8KCS8vCSByZ2IoMjU1LCAwLCAyNTUpCgkvLwoJLy8gV2UgYWxzbyB0cnkgdG8gY2F0Y2ggSUUncyBgYWxwaGEoKWAsIGJ1dCBsZXQgdGhlIGBhbHBoYWAgcGFyc2VyCgkvLyBkZWFsIHdpdGggdGhlIGRldGFpbHMuCgkvLwoJLy8gVGhlIGFyZ3VtZW50cyBhcmUgcGFyc2VkIHdpdGggdGhlIGBlbnRpdGllcy5hcmd1bWVudHNgIHBhcnNlci4KCS8vCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlRW50aXRpZXNDYWxsKCl7CgkJJGluZGV4ID0gJHRoaXMtPnBvczsKCgkJaWYoICFwcmVnX21hdGNoKCcvXFxHKFtcdy1dK3wlfHByb2dpZDpbXHdcLl0rKVwoLycsICR0aGlzLT5pbnB1dCwgJG5hbWUsMCwkdGhpcy0+cG9zKSApewoJCQlyZXR1cm47CgkJfQoJCSRuYW1lID0gJG5hbWVbMV07CgkJJG5hbWVMQyA9IHN0cnRvbG93ZXIoJG5hbWUpOwoKCQlpZiAoJG5hbWVMQyA9PT0gJ3VybCcpIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQkkdGhpcy0+cG9zICs9IHN0cmxlbigkbmFtZSk7CgoJCWlmKCAkbmFtZUxDID09PSAnYWxwaGEnICl7CgkJCSRhbHBoYV9yZXQgPSAkdGhpcy0+cGFyc2VBbHBoYSgpOwoJCQlpZiggJGFscGhhX3JldCApewoJCQkJcmV0dXJuICRhbHBoYV9yZXQ7CgkJCX0KCQl9CgoJCSR0aGlzLT5NYXRjaENoYXIoJygnKTsgLy8gUGFyc2UgdGhlICcoJyBhbmQgY29uc3VtZSB3aGl0ZXNwYWNlLgoKCQkkYXJncyA9ICR0aGlzLT5wYXJzZUVudGl0aWVzQXJndW1lbnRzKCk7CgoJCWlmKCAhJHRoaXMtPk1hdGNoQ2hhcignKScpICl7CgkJCXJldHVybjsKCQl9CgoJCWlmICgkbmFtZSkgewoJCQlyZXR1cm4gJHRoaXMtPk5ld09iajQoJ0xlc3NfVHJlZV9DYWxsJyxhcnJheSgkbmFtZSwgJGFyZ3MsICRpbmRleCwgJHRoaXMtPmVudi0+Y3VycmVudEZpbGVJbmZvKSApOwoJCX0KCX0KCgkvKioKCSAqIFBhcnNlIGEgbGlzdCBvZiBhcmd1bWVudHMKCSAqCgkgKiBAcmV0dXJuIGFycmF5CgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VFbnRpdGllc0FyZ3VtZW50cygpewoKCQkkYXJncyA9IGFycmF5KCk7CgkJd2hpbGUoIHRydWUgKXsKCQkJJGFyZyA9ICR0aGlzLT5NYXRjaEZ1bmNzKCBhcnJheSgncGFyc2VFbnRpdGllc0Fzc2lnbm1lbnQnLCdwYXJzZUV4cHJlc3Npb24nKSApOwoJCQlpZiggISRhcmcgKXsKCQkJCWJyZWFrOwoJCQl9CgoJCQkkYXJnc1tdID0gJGFyZzsKCQkJaWYoICEkdGhpcy0+TWF0Y2hDaGFyKCcsJykgKXsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXJldHVybiAkYXJnczsKCX0KCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlRW50aXRpZXNMaXRlcmFsKCl7CgkJcmV0dXJuICR0aGlzLT5NYXRjaEZ1bmNzKCBhcnJheSgncGFyc2VFbnRpdGllc0RpbWVuc2lvbicsJ3BhcnNlRW50aXRpZXNDb2xvcicsJ3BhcnNlRW50aXRpZXNRdW90ZWQnLCdwYXJzZVVuaWNvZGVEZXNjcmlwdG9yJykgKTsKCX0KCgkvLyBBc3NpZ25tZW50cyBhcmUgYXJndW1lbnQgZW50aXRpZXMgZm9yIGNhbGxzLgoJLy8gVGhleSBhcmUgcHJlc2VudCBpbiBpZSBmaWx0ZXIgcHJvcGVydGllcyBhcyBzaG93biBiZWxvdy4KCS8vCgkvLwkgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoICpvcGFjaXR5PTUwKiApCgkvLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUVudGl0aWVzQXNzaWdubWVudCgpIHsKCgkJJGtleSA9ICR0aGlzLT5NYXRjaFJlZygnL1xcR1x3Kyg/PVxzPz0pLycpOwoJCWlmKCAhJGtleSApewoJCQlyZXR1cm47CgkJfQoKCQlpZiggISR0aGlzLT5NYXRjaENoYXIoJz0nKSApewoJCQlyZXR1cm47CgkJfQoKCQkkdmFsdWUgPSAkdGhpcy0+cGFyc2VFbnRpdHkoKTsKCQlpZiggJHZhbHVlICl7CgkJCXJldHVybiAkdGhpcy0+TmV3T2JqMignTGVzc19UcmVlX0Fzc2lnbm1lbnQnLGFycmF5KCRrZXlbMF0sICR2YWx1ZSkpOwoJCX0KCX0KCgkvLwoJLy8gUGFyc2UgdXJsKCkgdG9rZW5zCgkvLwoJLy8gV2UgdXNlIGEgc3BlY2lmaWMgcnVsZSBmb3IgdXJscywgYmVjYXVzZSB0aGV5IGRvbid0IHJlYWxseSBiZWhhdmUgbGlrZQoJLy8gc3RhbmRhcmQgZnVuY3Rpb24gY2FsbHMuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIGFyZ3VtZW50IGRvZXNuJ3QgaGF2ZQoJLy8gdG8gYmUgZW5jbG9zZWQgd2l0aGluIGEgc3RyaW5nLCBzbyBpdCBjYW4ndCBiZSBwYXJzZWQgYXMgYW4gRXhwcmVzc2lvbi4KCS8vCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlRW50aXRpZXNVcmwoKXsKCgoJCWlmKCAkdGhpcy0+aW5wdXRbJHRoaXMtPnBvc10gIT09ICd1JyB8fCAhJHRoaXMtPm1hdGNoUmVnKCcvXFxHdXJsXCgvJykgKXsKCQkJcmV0dXJuOwoJCX0KCgkJJHZhbHVlID0gJHRoaXMtPm1hdGNoKCBhcnJheSgncGFyc2VFbnRpdGllc1F1b3RlZCcsJ3BhcnNlRW50aXRpZXNWYXJpYWJsZScsJy9cXEdkYXRhXDouKj9bXlwpXSsvJywnL1xcRyg/Oig/OlxcXFxbXChcKVwnIl0pfFteXChcKVwnIl0pKy8nKSApOwoJCWlmKCAhJHZhbHVlICl7CgkJCSR2YWx1ZSA9ICcnOwoJCX0KCgoJCSR0aGlzLT5leHBlY3RDaGFyKCcpJyk7CgoKCQlpZiggaXNzZXQoJHZhbHVlLT52YWx1ZSkgfHwgJHZhbHVlIGluc3RhbmNlb2YgTGVzc19UcmVlX1ZhcmlhYmxlICl7CgkJCXJldHVybiAkdGhpcy0+TmV3T2JqMignTGVzc19UcmVlX1VybCcsYXJyYXkoJHZhbHVlLCAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm8pKTsKCQl9CgoJCXJldHVybiAkdGhpcy0+TmV3T2JqMignTGVzc19UcmVlX1VybCcsIGFycmF5KCAkdGhpcy0+TmV3T2JqMSgnTGVzc19UcmVlX0Fub255bW91cycsJHZhbHVlKSwgJHRoaXMtPmVudi0+Y3VycmVudEZpbGVJbmZvKSApOwoJfQoKCgkvLwoJLy8gQSBWYXJpYWJsZSBlbnRpdHksIHN1Y2ggYXMgYEBmaW5rYCwgaW4KCS8vCgkvLwkgd2lkdGg6IEBmaW5rICsgMnB4CgkvLwoJLy8gV2UgdXNlIGEgZGlmZmVyZW50IHBhcnNlciBmb3IgdmFyaWFibGUgZGVmaW5pdGlvbnMsCgkvLyBzZWUgYHBhcnNlcnMudmFyaWFibGVgLgoJLy8KCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VFbnRpdGllc1ZhcmlhYmxlKCl7CgkJJGluZGV4ID0gJHRoaXMtPnBvczsKCQlpZiAoJHRoaXMtPlBlZWtDaGFyKCdAJykgJiYgKCRuYW1lID0gJHRoaXMtPk1hdGNoUmVnKCcvXFxHQEA/W1x3LV0rLycpKSkgewoJCQlyZXR1cm4gJHRoaXMtPk5ld09iajMoJ0xlc3NfVHJlZV9WYXJpYWJsZScsIGFycmF5KCAkbmFtZVswXSwgJGluZGV4LCAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm8pKTsKCQl9Cgl9CgoKCS8vIEEgdmFyaWFibGUgZW50aXR5IHVzZWluZyB0aGUgcHJvdGVjdGl2ZSB7fSBlLmcuIEB7dmFyfQoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUVudGl0aWVzVmFyaWFibGVDdXJseSgpIHsKCQkkaW5kZXggPSAkdGhpcy0+cG9zOwoKCQlpZiggJHRoaXMtPmlucHV0X2xlbiA+ICgkdGhpcy0+cG9zKzEpICYmICR0aGlzLT5pbnB1dFskdGhpcy0+cG9zXSA9PT0gJ0AnICYmICgkY3VybHkgPSAkdGhpcy0+TWF0Y2hSZWcoJy9cXEdAXHsoW1x3LV0rKVx9LycpKSApewoJCQlyZXR1cm4gJHRoaXMtPk5ld09iajMoJ0xlc3NfVHJlZV9WYXJpYWJsZScsYXJyYXkoJ0AnLiRjdXJseVsxXSwgJGluZGV4LCAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm8pKTsKCQl9Cgl9CgoJLy8KCS8vIEEgSGV4YWRlY2ltYWwgY29sb3IKCS8vCgkvLwkgIzRGM0MyRgoJLy8KCS8vIGByZ2JgIGFuZCBgaHNsYCBjb2xvcnMgYXJlIHBhcnNlZCB0aHJvdWdoIHRoZSBgZW50aXRpZXMuY2FsbGAgcGFyc2VyLgoJLy8KCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VFbnRpdGllc0NvbG9yKCl7CgkJaWYgKCR0aGlzLT5QZWVrQ2hhcignIycpICYmICgkcmdiID0gJHRoaXMtPk1hdGNoUmVnKCcvXFxHIyhbQS1GYS1mMC05XXs2fXxbQS1GYS1mMC05XXszfSkvJykpKSB7CgkJCXJldHVybiAkdGhpcy0+TmV3T2JqMSgnTGVzc19UcmVlX0NvbG9yJywkcmdiWzFdKTsKCQl9Cgl9CgoJLy8KCS8vIEEgRGltZW5zaW9uLCB0aGF0IGlzLCBhIG51bWJlciBhbmQgYSB1bml0CgkvLwoJLy8JIDAuNWVtIDk1JQoJLy8KCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VFbnRpdGllc0RpbWVuc2lvbigpewoKCQkkYyA9IEBvcmQoJHRoaXMtPmlucHV0WyR0aGlzLT5wb3NdKTsKCgkJLy9JcyB0aGUgZmlyc3QgY2hhciBvZiB0aGUgZGltZW5zaW9uIDAtOSwgJy4nLCAnKycgb3IgJy0nCgkJaWYgKCgkYyA+IDU3IHx8ICRjIDwgNDMpIHx8ICRjID09PSA0NyB8fCAkYyA9PSA0NCl7CgkJCXJldHVybjsKCQl9CgoJCSR2YWx1ZSA9ICR0aGlzLT5NYXRjaFJlZygnL1xcRyhbKy1dP1xkKlwuP1xkKykoJXxbYS16XSspPy8nKTsKCQlpZiggJHZhbHVlICl7CgoJCQlpZiggaXNzZXQoJHZhbHVlWzJdKSApewoJCQkJcmV0dXJuICR0aGlzLT5OZXdPYmoyKCdMZXNzX1RyZWVfRGltZW5zaW9uJywgYXJyYXkoJHZhbHVlWzFdLCR2YWx1ZVsyXSkpOwoJCQl9CgkJCXJldHVybiAkdGhpcy0+TmV3T2JqMSgnTGVzc19UcmVlX0RpbWVuc2lvbicsJHZhbHVlWzFdKTsKCQl9Cgl9CgoKCS8vCgkvLyBBIHVuaWNvZGUgZGVzY3JpcHRvciwgYXMgaXMgdXNlZCBpbiB1bmljb2RlLXJhbmdlCgkvLwoJLy8gVSswPz8gb3IgVSswMEExLTAwQTkKCS8vCglmdW5jdGlvbiBwYXJzZVVuaWNvZGVEZXNjcmlwdG9yKCkgewoJCSR1ZCA9ICR0aGlzLT5NYXRjaFJlZygnL1xcRyhVXCtbMC05YS1mQS1GP10rKShcLVswLTlhLWZBLUY/XSspPy8nKTsKCQlpZiggJHVkICl7CgkJCXJldHVybiAkdGhpcy0+TmV3T2JqMSgnTGVzc19UcmVlX1VuaWNvZGVEZXNjcmlwdG9yJywgJHVkWzBdKTsKCQl9Cgl9CgoKCS8vCgkvLyBKYXZhU2NyaXB0IGNvZGUgdG8gYmUgZXZhbHVhdGVkCgkvLwoJLy8JIGB3aW5kb3cubG9jYXRpb24uaHJlZmAKCS8vCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlRW50aXRpZXNKYXZhc2NyaXB0KCl7CgkJJGUgPSBmYWxzZTsKCQkkaiA9ICR0aGlzLT5wb3M7CgkJaWYoICR0aGlzLT5pbnB1dFskal0gPT09ICd+JyApewoJCQkkaisrOwoJCQkkZSA9IHRydWU7CgkJfQoJCWlmKCAkdGhpcy0+aW5wdXRbJGpdICE9PSAnYCcgKXsKCQkJcmV0dXJuOwoJCX0KCQlpZiggJGUgKXsKCQkJJHRoaXMtPk1hdGNoQ2hhcignficpOwoJCX0KCQkkc3RyID0gJHRoaXMtPk1hdGNoUmVnKCcvXFxHYChbXmBdKilgLycpOwoJCWlmKCAkc3RyICl7CgkJCXJldHVybiAkdGhpcy0+TmV3T2JqMygnTGVzc19UcmVlX0phdmFzY3JpcHQnLCBhcnJheSgkc3RyWzFdLCAkdGhpcy0+cG9zLCAkZSkpOwoJCX0KCX0KCgoJLy8KCS8vIFRoZSB2YXJpYWJsZSBwYXJ0IG9mIGEgdmFyaWFibGUgZGVmaW5pdGlvbi4gVXNlZCBpbiB0aGUgYHJ1bGVgIHBhcnNlcgoJLy8KCS8vCSBAZmluazoKCS8vCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlVmFyaWFibGUoKXsKCQlpZiAoJHRoaXMtPlBlZWtDaGFyKCdAJykgJiYgKCRuYW1lID0gJHRoaXMtPk1hdGNoUmVnKCcvXFxHKEBbXHctXSspXHMqOi8nKSkpIHsKCQkJcmV0dXJuICRuYW1lWzFdOwoJCX0KCX0KCgoJLy8KCS8vIFRoZSB2YXJpYWJsZSBwYXJ0IG9mIGEgdmFyaWFibGUgZGVmaW5pdGlvbi4gVXNlZCBpbiB0aGUgYHJ1bGVgIHBhcnNlcgoJLy8KCS8vIEBmaW5rKCk7CgkvLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZVJ1bGVzZXRDYWxsKCl7CgoJCWlmKCAkdGhpcy0+aW5wdXRbJHRoaXMtPnBvc10gPT09ICdAJyAmJiAoJG5hbWUgPSAkdGhpcy0+TWF0Y2hSZWcoJy9cXEcoQFtcdy1dKylccypcKFxzKlwpXHMqOy8nKSkgKXsKCQkJcmV0dXJuICR0aGlzLT5OZXdPYmoxKCdMZXNzX1RyZWVfUnVsZXNldENhbGwnLCAkbmFtZVsxXSApOwoJCX0KCX0KCgoJLy8KCS8vIGV4dGVuZCBzeW50YXggLSB1c2VkIHRvIGV4dGVuZCBzZWxlY3RvcnMKCS8vCglmdW5jdGlvbiBwYXJzZUV4dGVuZCgkaXNSdWxlID0gZmFsc2UpewoKCQkkaW5kZXggPSAkdGhpcy0+cG9zOwoJCSRleHRlbmRMaXN0ID0gYXJyYXkoKTsKCgoJCWlmKCAhJHRoaXMtPk1hdGNoUmVnKCAkaXNSdWxlID8gJy9cXEcmOmV4dGVuZFwoLycgOiAnL1xcRzpleHRlbmRcKC8nICkgKXsgcmV0dXJuOyB9CgoJCWRvewoJCQkkb3B0aW9uID0gbnVsbDsKCQkJJGVsZW1lbnRzID0gYXJyYXkoKTsKCQkJd2hpbGUoIHRydWUgKXsKCQkJCSRvcHRpb24gPSAkdGhpcy0+TWF0Y2hSZWcoJy9cXEcoYWxsKSg/PVxzKihcKXwsKSkvJyk7CgkJCQlpZiggJG9wdGlvbiApeyBicmVhazsgfQoJCQkJJGUgPSAkdGhpcy0+cGFyc2VFbGVtZW50KCk7CgkJCQlpZiggISRlICl7IGJyZWFrOyB9CgkJCQkkZWxlbWVudHNbXSA9ICRlOwoJCQl9CgoJCQlpZiggJG9wdGlvbiApewoJCQkJJG9wdGlvbiA9ICRvcHRpb25bMV07CgkJCX0KCgkJCSRleHRlbmRMaXN0W10gPSAkdGhpcy0+TmV3T2JqMygnTGVzc19UcmVlX0V4dGVuZCcsIGFycmF5KCAkdGhpcy0+TmV3T2JqMSgnTGVzc19UcmVlX1NlbGVjdG9yJywkZWxlbWVudHMpLCAkb3B0aW9uLCAkaW5kZXggKSk7CgoJCX13aGlsZSggJHRoaXMtPk1hdGNoQ2hhcigiLCIpICk7CgoJCSR0aGlzLT5leHBlY3QoJy9cXEdcKS8nKTsKCgkJaWYoICRpc1J1bGUgKXsKCQkJJHRoaXMtPmV4cGVjdCgnL1xcRzsvJyk7CgkJfQoKCQlyZXR1cm4gJGV4dGVuZExpc3Q7Cgl9CgoKCS8vCgkvLyBBIE1peGluIGNhbGwsIHdpdGggYW4gb3B0aW9uYWwgYXJndW1lbnQgbGlzdAoJLy8KCS8vCSAjbWl4aW5zID4gLnNxdWFyZSgjZmZmKTsKCS8vCSAucm91bmRlZCg0cHgsIGJsYWNrKTsKCS8vCSAuYnV0dG9uOwoJLy8KCS8vIFRoZSBgd2hpbGVgIGxvb3AgaXMgdGhlcmUgYmVjYXVzZSBtaXhpbnMgY2FuIGJlCgkvLyBuYW1lc3BhY2VkLCBidXQgd2Ugb25seSBzdXBwb3J0IHRoZSBjaGlsZCBhbmQgZGVzY2VuZGFudAoJLy8gc2VsZWN0b3IgZm9yIG5vdy4KCS8vCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlTWl4aW5DYWxsKCl7CgoJCSRjaGFyID0gJHRoaXMtPmlucHV0WyR0aGlzLT5wb3NdOwoJCWlmKCAkY2hhciAhPT0gJy4nICYmICRjaGFyICE9PSAnIycgKXsKCQkJcmV0dXJuOwoJCX0KCgkJJGluZGV4ID0gJHRoaXMtPnBvczsKCQkkdGhpcy0+c2F2ZSgpOyAvLyBzdG9wIHVzIGFic29yYmluZyBwYXJ0IG9mIGFuIGludmFsaWQgc2VsZWN0b3IKCgkJJGVsZW1lbnRzID0gJHRoaXMtPnBhcnNlTWl4aW5DYWxsRWxlbWVudHMoKTsKCgkJaWYoICRlbGVtZW50cyApewoKCQkJaWYoICR0aGlzLT5NYXRjaENoYXIoJygnKSApewoJCQkJJHJldHVybmVkID0gJHRoaXMtPnBhcnNlTWl4aW5BcmdzKHRydWUpOwoJCQkJJGFyZ3MgPSAkcmV0dXJuZWRbJ2FyZ3MnXTsKCQkJCSR0aGlzLT5leHBlY3RDaGFyKCcpJyk7CgkJCX1lbHNlewoJCQkJJGFyZ3MgPSBhcnJheSgpOwoJCQl9CgoJCQkkaW1wb3J0YW50ID0gJHRoaXMtPnBhcnNlSW1wb3J0YW50KCk7CgoJCQlpZiggJHRoaXMtPnBhcnNlRW5kKCkgKXsKCQkJCSR0aGlzLT5mb3JnZXQoKTsKCQkJCXJldHVybiAkdGhpcy0+TmV3T2JqNSgnTGVzc19UcmVlX01peGluX0NhbGwnLCBhcnJheSggJGVsZW1lbnRzLCAkYXJncywgJGluZGV4LCAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm8sICRpbXBvcnRhbnQpKTsKCQkJfQoJCX0KCgkJJHRoaXMtPnJlc3RvcmUoKTsKCX0KCgoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZU1peGluQ2FsbEVsZW1lbnRzKCl7CgkJJGVsZW1lbnRzID0gYXJyYXkoKTsKCQkkYyA9IG51bGw7CgoJCXdoaWxlKCB0cnVlICl7CgkJCSRlbGVtSW5kZXggPSAkdGhpcy0+cG9zOwoJCQkkZSA9ICR0aGlzLT5NYXRjaFJlZygnL1xcR1sjLl0oPzpbXHctXXxcXFxcKD86W0EtRmEtZjAtOV17MSw2fSA/fFteQS1GYS1mMC05XSkpKy8nKTsKCQkJaWYoICEkZSApewoJCQkJYnJlYWs7CgkJCX0KCQkJJGVsZW1lbnRzW10gPSAkdGhpcy0+TmV3T2JqNCgnTGVzc19UcmVlX0VsZW1lbnQnLCBhcnJheSgkYywgJGVbMF0sICRlbGVtSW5kZXgsICR0aGlzLT5lbnYtPmN1cnJlbnRGaWxlSW5mbykpOwoJCQkkYyA9ICR0aGlzLT5NYXRjaENoYXIoJz4nKTsKCQl9CgoJCXJldHVybiAkZWxlbWVudHM7Cgl9CgoKCgkvKioKCSAqIEBwYXJhbSBib29sZWFuICRpc0NhbGwKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZU1peGluQXJncyggJGlzQ2FsbCApewoJCSRleHByZXNzaW9ucyA9IGFycmF5KCk7CgkJJGFyZ3NTZW1pQ29sb24gPSBhcnJheSgpOwoJCSRpc1NlbWlDb2xvblNlcGVyYXRlZCA9IG51bGw7CgkJJGFyZ3NDb21tYSA9IGFycmF5KCk7CgkJJGV4cHJlc3Npb25Db250YWluc05hbWVkID0gbnVsbDsKCQkkbmFtZSA9IG51bGw7CgkJJHJldHVybmVyID0gYXJyYXkoJ2FyZ3MnPT5hcnJheSgpLCAndmFyaWFkaWMnPT4gZmFsc2UpOwoKCQkkdGhpcy0+c2F2ZSgpOwoKCQl3aGlsZSggdHJ1ZSApewoJCQlpZiggJGlzQ2FsbCApewoJCQkJJGFyZyA9ICR0aGlzLT5NYXRjaEZ1bmNzKCBhcnJheSggJ3BhcnNlRGV0YWNoZWRSdWxlc2V0JywncGFyc2VFeHByZXNzaW9uJyApICk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+cGFyc2VDb21tZW50cygpOwoJCQkJaWYoICR0aGlzLT5pbnB1dFsgJHRoaXMtPnBvcyBdID09PSAnLicgJiYgJHRoaXMtPk1hdGNoUmVnKCcvXFxHXC57M30vJykgKXsKCQkJCQkkcmV0dXJuZXJbJ3ZhcmlhZGljJ10gPSB0cnVlOwoJCQkJCWlmKCAkdGhpcy0+TWF0Y2hDaGFyKCI7IikgJiYgISRpc1NlbWlDb2xvblNlcGVyYXRlZCApewoJCQkJCQkkaXNTZW1pQ29sb25TZXBlcmF0ZWQgPSB0cnVlOwoJCQkJCX0KCgkJCQkJaWYoICRpc1NlbWlDb2xvblNlcGVyYXRlZCApewoJCQkJCQkkYXJnc1NlbWlDb2xvbltdID0gYXJyYXkoJ3ZhcmlhZGljJz0+dHJ1ZSk7CgkJCQkJfWVsc2V7CgkJCQkJCSRhcmdzQ29tbWFbXSA9IGFycmF5KCd2YXJpYWRpYyc9PnRydWUpOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCX0KCQkJCSRhcmcgPSAkdGhpcy0+TWF0Y2hGdW5jcyggYXJyYXkoJ3BhcnNlRW50aXRpZXNWYXJpYWJsZScsJ3BhcnNlRW50aXRpZXNMaXRlcmFsJywncGFyc2VFbnRpdGllc0tleXdvcmQnKSApOwoJCQl9CgoJCQlpZiggISRhcmcgKXsKCQkJCWJyZWFrOwoJCQl9CgoKCQkJJG5hbWVMb29wID0gbnVsbDsKCQkJaWYoICRhcmcgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiApewoJCQkJJGFyZy0+dGhyb3dBd2F5Q29tbWVudHMoKTsKCQkJfQoJCQkkdmFsdWUgPSAkYXJnOwoJCQkkdmFsID0gbnVsbDsKCgkJCWlmKCAkaXNDYWxsICl7CgkJCQkvLyBWYXJpYWJsZQoJCQkJaWYoIHByb3BlcnR5X2V4aXN0cygkYXJnLCd2YWx1ZScpICYmIGNvdW50KCRhcmctPnZhbHVlKSA9PSAxICl7CgkJCQkJJHZhbCA9ICRhcmctPnZhbHVlWzBdOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJHZhbCA9ICRhcmc7CgkJCX0KCgoJCQlpZiggJHZhbCBpbnN0YW5jZW9mIExlc3NfVHJlZV9WYXJpYWJsZSApewoKCQkJCWlmKCAkdGhpcy0+TWF0Y2hDaGFyKCc6JykgKXsKCQkJCQlpZiggJGV4cHJlc3Npb25zICl7CgkJCQkJCWlmKCAkaXNTZW1pQ29sb25TZXBlcmF0ZWQgKXsKCQkJCQkJCSR0aGlzLT5FcnJvcignQ2Fubm90IG1peCA7IGFuZCAsIGFzIGRlbGltaXRlciB0eXBlcycpOwoJCQkJCQl9CgkJCQkJCSRleHByZXNzaW9uQ29udGFpbnNOYW1lZCA9IHRydWU7CgkJCQkJfQoKCQkJCQkvLyB3ZSBkbyBub3Qgc3VwcG9ydCBzZXR0aW5nIGEgcnVsZXNldCBhcyBhIGRlZmF1bHQgdmFyaWFibGUgLSBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UKCQkJCQkvLyBIb3dldmVyIGlmIHdlIGRvIHdhbnQgdG8gYWRkIGl0LCB0aGVyZSBpcyBub3RoaW5nIGJsb2NraW5nIGl0LCBqdXN0IGRvbid0IGVycm9yCgkJCQkJLy8gYW5kIHJlbW92ZSBpc0NhbGwgZGVwZW5kZW5jeSBiZWxvdwoJCQkJCSR2YWx1ZSA9IG51bGw7CgkJCQkJaWYoICRpc0NhbGwgKXsKCQkJCQkJJHZhbHVlID0gJHRoaXMtPnBhcnNlRGV0YWNoZWRSdWxlc2V0KCk7CgkJCQkJfQoJCQkJCWlmKCAhJHZhbHVlICl7CgkJCQkJCSR2YWx1ZSA9ICR0aGlzLT5wYXJzZUV4cHJlc3Npb24oKTsKCQkJCQl9CgoJCQkJCWlmKCAhJHZhbHVlICl7CgkJCQkJCWlmKCAkaXNDYWxsICl7CgkJCQkJCQkkdGhpcy0+RXJyb3IoJ2NvdWxkIG5vdCB1bmRlcnN0YW5kIHZhbHVlIGZvciBuYW1lZCBhcmd1bWVudCcpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHRoaXMtPnJlc3RvcmUoKTsKCQkJCQkJCSRyZXR1cm5lclsnYXJncyddID0gYXJyYXkoKTsKCQkJCQkJCXJldHVybiAkcmV0dXJuZXI7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCSRuYW1lTG9vcCA9ICgkbmFtZSA9ICR2YWwtPm5hbWUpOwoJCQkJfWVsc2VpZiggISRpc0NhbGwgJiYgJHRoaXMtPk1hdGNoUmVnKCcvXFxHXC57M30vJykgKXsKCQkJCQkkcmV0dXJuZXJbJ3ZhcmlhZGljJ10gPSB0cnVlOwoJCQkJCWlmKCAkdGhpcy0+TWF0Y2hDaGFyKCI7IikgJiYgISRpc1NlbWlDb2xvblNlcGVyYXRlZCApewoJCQkJCQkkaXNTZW1pQ29sb25TZXBlcmF0ZWQgPSB0cnVlOwoJCQkJCX0KCQkJCQlpZiggJGlzU2VtaUNvbG9uU2VwZXJhdGVkICl7CgkJCQkJCSRhcmdzU2VtaUNvbG9uW10gPSBhcnJheSgnbmFtZSc9PiAkYXJnLT5uYW1lLCAndmFyaWFkaWMnID0+IHRydWUpOwoJCQkJCX1lbHNlewoJCQkJCQkkYXJnc0NvbW1hW10gPSBhcnJheSgnbmFtZSc9PiAkYXJnLT5uYW1lLCAndmFyaWFkaWMnID0+IHRydWUpOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCX1lbHNlaWYoICEkaXNDYWxsICl7CgkJCQkJJG5hbWUgPSAkbmFtZUxvb3AgPSAkdmFsLT5uYW1lOwoJCQkJCSR2YWx1ZSA9IG51bGw7CgkJCQl9CgkJCX0KCgkJCWlmKCAkdmFsdWUgKXsKCQkJCSRleHByZXNzaW9uc1tdID0gJHZhbHVlOwoJCQl9CgoJCQkkYXJnc0NvbW1hW10gPSBhcnJheSgnbmFtZSc9PiRuYW1lTG9vcCwgJ3ZhbHVlJz0+JHZhbHVlICk7CgoJCQlpZiggJHRoaXMtPk1hdGNoQ2hhcignLCcpICl7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYoICR0aGlzLT5NYXRjaENoYXIoJzsnKSB8fCAkaXNTZW1pQ29sb25TZXBlcmF0ZWQgKXsKCgkJCQlpZiggJGV4cHJlc3Npb25Db250YWluc05hbWVkICl7CgkJCQkJJHRoaXMtPkVycm9yKCdDYW5ub3QgbWl4IDsgYW5kICwgYXMgZGVsaW1pdGVyIHR5cGVzJyk7CgkJCQl9CgoJCQkJJGlzU2VtaUNvbG9uU2VwZXJhdGVkID0gdHJ1ZTsKCgkJCQlpZiggY291bnQoJGV4cHJlc3Npb25zKSA+IDEgKXsKCQkJCQkkdmFsdWUgPSAkdGhpcy0+TmV3T2JqMSgnTGVzc19UcmVlX1ZhbHVlJywgJGV4cHJlc3Npb25zKTsKCQkJCX0KCQkJCSRhcmdzU2VtaUNvbG9uW10gPSBhcnJheSgnbmFtZSc9PiRuYW1lLCAndmFsdWUnPT4kdmFsdWUgKTsKCgkJCQkkbmFtZSA9IG51bGw7CgkJCQkkZXhwcmVzc2lvbnMgPSBhcnJheSgpOwoJCQkJJGV4cHJlc3Npb25Db250YWluc05hbWVkID0gZmFsc2U7CgkJCX0KCQl9CgoJCSR0aGlzLT5mb3JnZXQoKTsKCQkkcmV0dXJuZXJbJ2FyZ3MnXSA9ICgkaXNTZW1pQ29sb25TZXBlcmF0ZWQgPyAkYXJnc1NlbWlDb2xvbiA6ICRhcmdzQ29tbWEpOwoJCXJldHVybiAkcmV0dXJuZXI7Cgl9CgoKCgkvLwoJLy8gQSBNaXhpbiBkZWZpbml0aW9uLCB3aXRoIGEgbGlzdCBvZiBwYXJhbWV0ZXJzCgkvLwoJLy8JIC5yb3VuZGVkIChAcmFkaXVzOiAycHgsIEBjb2xvcikgewoJLy8JCS4uLgoJLy8JIH0KCS8vCgkvLyBVbnRpbCB3ZSBoYXZlIGEgZmluZXIgZ3JhaW5lZCBzdGF0ZS1tYWNoaW5lLCB3ZSBoYXZlIHRvCgkvLyBkbyBhIGxvb2stYWhlYWQsIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGEgbWl4aW4gY2FsbC4KCS8vIFNlZSB0aGUgYHJ1bGVgIGZ1bmN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgoJLy8KCS8vIFdlIHN0YXJ0IGJ5IG1hdGNoaW5nIGAucm91bmRlZCAoYCwgYW5kIHRoZW4gcHJvY2VlZCBvbiB0bwoJLy8gdGhlIGFyZ3VtZW50IGxpc3QsIHdoaWNoIGhhcyBvcHRpb25hbCBkZWZhdWx0IHZhbHVlcy4KCS8vIFdlIHN0b3JlIHRoZSBwYXJhbWV0ZXJzIGluIGBwYXJhbXNgLCB3aXRoIGEgYHZhbHVlYCBrZXksCgkvLyBpZiB0aGVyZSBpcyBhIHZhbHVlLCBzdWNoIGFzIGluIHRoZSBjYXNlIG9mIGBAcmFkaXVzYC4KCS8vCgkvLyBPbmNlIHdlJ3ZlIGdvdCBvdXIgcGFyYW1zIGxpc3QsIGFuZCBhIGNsb3NpbmcgYClgLCB3ZSBwYXJzZQoJLy8gdGhlIGB7Li4ufWAgYmxvY2suCgkvLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZU1peGluRGVmaW5pdGlvbigpewoJCSRjb25kID0gbnVsbDsKCgkJJGNoYXIgPSAkdGhpcy0+aW5wdXRbJHRoaXMtPnBvc107CgkJaWYoICgkY2hhciAhPT0gJy4nICYmICRjaGFyICE9PSAnIycpIHx8ICgkY2hhciA9PT0gJ3snICYmICR0aGlzLT5QZWVrUmVnKCcvXFxHW157XSpcfS8nKSkgKXsKCQkJcmV0dXJuOwoJCX0KCgkJJHRoaXMtPnNhdmUoKTsKCgkJJG1hdGNoID0gJHRoaXMtPk1hdGNoUmVnKCcvXFxHKFsjLl0oPzpbXHctXXxcXFwoPzpbQS1GYS1mMC05XXsxLDZ9ID98W15BLUZhLWYwLTldKSkrKVxzKlwoLycpOwoJCWlmKCAkbWF0Y2ggKXsKCQkJJG5hbWUgPSAkbWF0Y2hbMV07CgoJCQkkYXJnSW5mbyA9ICR0aGlzLT5wYXJzZU1peGluQXJncyggZmFsc2UgKTsKCQkJJHBhcmFtcyA9ICRhcmdJbmZvWydhcmdzJ107CgkJCSR2YXJpYWRpYyA9ICRhcmdJbmZvWyd2YXJpYWRpYyddOwoKCgkJCS8vIC5taXhpbmNhbGwoIkB7YX0iKTsKCQkJLy8gbG9va3MgYSBiaXQgbGlrZSBhIG1peGluIGRlZmluaXRpb24uLgoJCQkvLyBhbHNvCgkJCS8vIC5taXhpbmNhbGwoQGE6IHtydWxlOiBzZXQ7fSk7CgkJCS8vIHNvIHdlIGhhdmUgdG8gYmUgbmljZSBhbmQgcmVzdG9yZQoJCQlpZiggISR0aGlzLT5NYXRjaENoYXIoJyknKSApewoJCQkJJHRoaXMtPmZ1cnRoZXN0ID0gJHRoaXMtPnBvczsKCQkJCSR0aGlzLT5yZXN0b3JlKCk7CgkJCQlyZXR1cm47CgkJCX0KCgoJCQkkdGhpcy0+cGFyc2VDb21tZW50cygpOwoKCQkJaWYgKCR0aGlzLT5NYXRjaFJlZygnL1xcR3doZW4vJykpIHsgLy8gR3VhcmQKCQkJCSRjb25kID0gJHRoaXMtPmV4cGVjdCgncGFyc2VDb25kaXRpb25zJywgJ0V4cGVjdGVkIGNvbmRpdGlvbnMnKTsKCQkJfQoKCQkJJHJ1bGVzZXQgPSAkdGhpcy0+cGFyc2VCbG9jaygpOwoKCQkJaWYoIGlzX2FycmF5KCRydWxlc2V0KSApewoJCQkJJHRoaXMtPmZvcmdldCgpOwoJCQkJcmV0dXJuICR0aGlzLT5OZXdPYmo1KCdMZXNzX1RyZWVfTWl4aW5fRGVmaW5pdGlvbicsIGFycmF5KCAkbmFtZSwgJHBhcmFtcywgJHJ1bGVzZXQsICRjb25kLCAkdmFyaWFkaWMpKTsKCQkJfQoKCQkJJHRoaXMtPnJlc3RvcmUoKTsKCQl9ZWxzZXsKCQkJJHRoaXMtPmZvcmdldCgpOwoJCX0KCX0KCgkvLwoJLy8gRW50aXRpZXMgYXJlIHRoZSBzbWFsbGVzdCByZWNvZ25pemVkIHRva2VuLAoJLy8gYW5kIGNhbiBiZSBmb3VuZCBpbnNpZGUgYSBydWxlJ3MgdmFsdWUuCgkvLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUVudGl0eSgpewoKCQlyZXR1cm4gJHRoaXMtPk1hdGNoRnVuY3MoIGFycmF5KCdwYXJzZUVudGl0aWVzTGl0ZXJhbCcsJ3BhcnNlRW50aXRpZXNWYXJpYWJsZScsJ3BhcnNlRW50aXRpZXNVcmwnLCdwYXJzZUVudGl0aWVzQ2FsbCcsJ3BhcnNlRW50aXRpZXNLZXl3b3JkJywncGFyc2VFbnRpdGllc0phdmFzY3JpcHQnLCdwYXJzZUNvbW1lbnQnKSApOwoJfQoKCS8vCgkvLyBBIFJ1bGUgdGVybWluYXRvci4gTm90ZSB0aGF0IHdlIHVzZSBgcGVlaygpYCB0byBjaGVjayBmb3IgJ30nLAoJLy8gYmVjYXVzZSB0aGUgYGJsb2NrYCBydWxlIHdpbGwgYmUgZXhwZWN0aW5nIGl0LCBidXQgd2Ugc3RpbGwgbmVlZCB0byBtYWtlIHN1cmUKCS8vIGl0J3MgdGhlcmUsIGlmICc7JyB3YXMgb21taXR0ZWQuCgkvLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUVuZCgpewoJCXJldHVybiAkdGhpcy0+TWF0Y2hDaGFyKCc7JykgfHwgJHRoaXMtPlBlZWtDaGFyKCd9Jyk7Cgl9CgoJLy8KCS8vIElFJ3MgYWxwaGEgZnVuY3Rpb24KCS8vCgkvLwkgYWxwaGEob3BhY2l0eT04OCkKCS8vCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlQWxwaGEoKXsKCgkJaWYgKCAhICR0aGlzLT5NYXRjaFJlZygnL1xcR1wob3BhY2l0eT0vaScpKSB7CgkJCXJldHVybjsKCQl9CgoJCSR2YWx1ZSA9ICR0aGlzLT5NYXRjaFJlZygnL1xcR1swLTldKy8nKTsKCQlpZiggJHZhbHVlICl7CgkJCSR2YWx1ZSA9ICR2YWx1ZVswXTsKCQl9ZWxzZXsKCQkJJHZhbHVlID0gJHRoaXMtPnBhcnNlRW50aXRpZXNWYXJpYWJsZSgpOwoJCQlpZiggISR2YWx1ZSApewoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQkkdGhpcy0+ZXhwZWN0Q2hhcignKScpOwoJCXJldHVybiAkdGhpcy0+TmV3T2JqMSgnTGVzc19UcmVlX0FscGhhJywkdmFsdWUpOwoJfQoKCgkvLwoJLy8gQSBTZWxlY3RvciBFbGVtZW50CgkvLwoJLy8JIGRpdgoJLy8JICsgaDEKCS8vCSAjc29ja3MKCS8vCSBpbnB1dFt0eXBlPSJ0ZXh0Il0KCS8vCgkvLyBFbGVtZW50cyBhcmUgdGhlIGJ1aWxkaW5nIGJsb2NrcyBmb3IgU2VsZWN0b3JzLAoJLy8gdGhleSBhcmUgbWFkZSBvdXQgb2YgYSBgQ29tYmluYXRvcmAgKHNlZSBjb21iaW5hdG9yIHJ1bGUpLAoJLy8gYW5kIGFuIGVsZW1lbnQgbmFtZSwgc3VjaCBhcyBhIHRhZyBhIGNsYXNzLCBvciBgKmAuCgkvLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUVsZW1lbnQoKXsKCQkkYyA9ICR0aGlzLT5wYXJzZUNvbWJpbmF0b3IoKTsKCQkkaW5kZXggPSAkdGhpcy0+cG9zOwoKCQkkZSA9ICR0aGlzLT5tYXRjaCggYXJyYXkoJy9cXEcoPzpcZCtcLlxkK3xcZCspJS8nLCAnL1xcRyg/OlsuI10/fDoqKSg/Oltcdy1dfFteXHgwMC1ceDlmXXxcXFxcKD86W0EtRmEtZjAtOV17MSw2fSA/fFteQS1GYS1mMC05XSkpKy8nLAoJCQknIyonLCAnIyYnLCAncGFyc2VBdHRyaWJ1dGUnLCAnL1xcR1woW14oKUBdK1wpLycsICcvXFxHW1wuI10oPz1AKS8nLCAncGFyc2VFbnRpdGllc1ZhcmlhYmxlQ3VybHknKSApOwoKCQlpZiggaXNfbnVsbCgkZSkgKXsKCQkJJHRoaXMtPnNhdmUoKTsKCQkJaWYoICR0aGlzLT5NYXRjaENoYXIoJygnKSApewoJCQkJaWYoICgkdiA9ICR0aGlzLT5wYXJzZVNlbGVjdG9yKCkpICYmICR0aGlzLT5NYXRjaENoYXIoJyknKSApewoJCQkJCSRlID0gJHRoaXMtPk5ld09iajEoJ0xlc3NfVHJlZV9QYXJlbicsJHYpOwoJCQkJCSR0aGlzLT5mb3JnZXQoKTsKCQkJCX1lbHNlewoJCQkJCSR0aGlzLT5yZXN0b3JlKCk7CgkJCQl9CgkJCX1lbHNlewoJCQkJJHRoaXMtPmZvcmdldCgpOwoJCQl9CgkJfQoKCQlpZiggIWlzX251bGwoJGUpICl7CgkJCXJldHVybiAkdGhpcy0+TmV3T2JqNCgnTGVzc19UcmVlX0VsZW1lbnQnLGFycmF5KCAkYywgJGUsICRpbmRleCwgJHRoaXMtPmVudi0+Y3VycmVudEZpbGVJbmZvKSk7CgkJfQoJfQoKCS8vCgkvLyBDb21iaW5hdG9ycyBjb21iaW5lIGVsZW1lbnRzIHRvZ2V0aGVyLCBpbiBhIFNlbGVjdG9yLgoJLy8KCS8vIEJlY2F1c2Ugb3VyIHBhcnNlciBpc24ndCB3aGl0ZS1zcGFjZSBzZW5zaXRpdmUsIHNwZWNpYWwgY2FyZQoJLy8gaGFzIHRvIGJlIHRha2VuLCB3aGVuIHBhcnNpbmcgdGhlIGRlc2NlbmRhbnQgY29tYmluYXRvciwgYCBgLAoJLy8gYXMgaXQncyBhbiBlbXB0eSBzcGFjZS4gV2UgaGF2ZSB0byBjaGVjayB0aGUgcHJldmlvdXMgY2hhcmFjdGVyCgkvLyBpbiB0aGUgaW5wdXQsIHRvIHNlZSBpZiBpdCdzIGEgYCBgIGNoYXJhY3Rlci4KCS8vCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlQ29tYmluYXRvcigpewoJCWlmKCAkdGhpcy0+cG9zIDwgJHRoaXMtPmlucHV0X2xlbiApewoJCQkkYyA9ICR0aGlzLT5pbnB1dFskdGhpcy0+cG9zXTsKCQkJaWYgKCRjID09PSAnPicgfHwgJGMgPT09ICcrJyB8fCAkYyA9PT0gJ34nIHx8ICRjID09PSAnfCcgfHwgJGMgPT09ICdeJyApewoKCQkJCSR0aGlzLT5wb3MrKzsKCQkJCWlmKCAkdGhpcy0+aW5wdXRbJHRoaXMtPnBvc10gPT09ICdeJyApewoJCQkJCSRjID0gJ15eJzsKCQkJCQkkdGhpcy0+cG9zKys7CgkJCQl9CgoJCQkJJHRoaXMtPnNraXBXaGl0ZXNwYWNlKDApOwoKCQkJCXJldHVybiAkYzsKCQkJfQoKCQkJaWYoICR0aGlzLT5wb3MgPiAwICYmICR0aGlzLT5pc1doaXRlc3BhY2UoLTEpICl7CgkJCQlyZXR1cm4gJyAnOwoJCQl9CgkJfQoJfQoKCS8vCgkvLyBBIENTUyBzZWxlY3RvciAoc2VlIHNlbGVjdG9yIGJlbG93KQoJLy8gd2l0aCBsZXNzIGV4dGVuc2lvbnMgZS5nLiB0aGUgYWJpbGl0eSB0byBleHRlbmQgYW5kIGd1YXJkCgkvLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUxlc3NTZWxlY3RvcigpewoJCXJldHVybiAkdGhpcy0+cGFyc2VTZWxlY3Rvcih0cnVlKTsKCX0KCgkvLwoJLy8gQSBDU1MgU2VsZWN0b3IKCS8vCgkvLwkgLmNsYXNzID4gZGl2ICsgaDEKCS8vCSBsaSBhOmhvdmVyCgkvLwoJLy8gU2VsZWN0b3JzIGFyZSBtYWRlIG91dCBvZiBvbmUgb3IgbW9yZSBFbGVtZW50cywgc2VlIGFib3ZlLgoJLy8KCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VTZWxlY3RvciggJGlzTGVzcyA9IGZhbHNlICl7CgkJJGVsZW1lbnRzID0gYXJyYXkoKTsKCQkkZXh0ZW5kTGlzdCA9IGFycmF5KCk7CgkJJGNvbmRpdGlvbiA9IG51bGw7CgkJJHdoZW4gPSBmYWxzZTsKCQkkZXh0ZW5kID0gZmFsc2U7CgkJJGUgPSBudWxsOwoJCSRjID0gbnVsbDsKCQkkaW5kZXggPSAkdGhpcy0+cG9zOwoKCQl3aGlsZSggKCRpc0xlc3MgJiYgKCRleHRlbmQgPSAkdGhpcy0+cGFyc2VFeHRlbmQoKSkpIHx8ICgkaXNMZXNzICYmICgkd2hlbiA9ICR0aGlzLT5NYXRjaFJlZygnL1xcR3doZW4vJykgKSkgfHwgKCRlID0gJHRoaXMtPnBhcnNlRWxlbWVudCgpKSApewoJCQlpZiggJHdoZW4gKXsKCQkJCSRjb25kaXRpb24gPSAkdGhpcy0+ZXhwZWN0KCdwYXJzZUNvbmRpdGlvbnMnLCAnZXhwZWN0ZWQgY29uZGl0aW9uJyk7CgkJCX1lbHNlaWYoICRjb25kaXRpb24gKXsKCQkJCS8vZXJyb3IoIkNTUyBndWFyZCBjYW4gb25seSBiZSB1c2VkIGF0IHRoZSBlbmQgb2Ygc2VsZWN0b3IiKTsKCQkJfWVsc2VpZiggJGV4dGVuZCApewoJCQkJJGV4dGVuZExpc3QgPSBhcnJheV9tZXJnZSgkZXh0ZW5kTGlzdCwkZXh0ZW5kKTsKCQkJfWVsc2V7CgkJCQkvL2lmKCBjb3VudCgkZXh0ZW5kTGlzdCkgKXsKCQkJCQkvL2Vycm9yKCJFeHRlbmQgY2FuIG9ubHkgYmUgdXNlZCBhdCB0aGUgZW5kIG9mIHNlbGVjdG9yIik7CgkJCQkvL30KCQkJCWlmKCAkdGhpcy0+cG9zIDwgJHRoaXMtPmlucHV0X2xlbiApewoJCQkJCSRjID0gJHRoaXMtPmlucHV0WyAkdGhpcy0+cG9zIF07CgkJCQl9CgkJCQkkZWxlbWVudHNbXSA9ICRlOwoJCQkJJGUgPSBudWxsOwoJCQl9CgoJCQlpZiggJGMgPT09ICd7JyB8fCAkYyA9PT0gJ30nIHx8ICRjID09PSAnOycgfHwgJGMgPT09ICcsJyB8fCAkYyA9PT0gJyknKSB7IGJyZWFrOyB9CgkJfQoKCQlpZiggJGVsZW1lbnRzICl7CgkJCXJldHVybiAkdGhpcy0+TmV3T2JqNSgnTGVzc19UcmVlX1NlbGVjdG9yJyxhcnJheSgkZWxlbWVudHMsICRleHRlbmRMaXN0LCAkY29uZGl0aW9uLCAkaW5kZXgsICR0aGlzLT5lbnYtPmN1cnJlbnRGaWxlSW5mbykpOwoJCX0KCQlpZiggJGV4dGVuZExpc3QgKSB7CgkJCSR0aGlzLT5FcnJvcignRXh0ZW5kIG11c3QgYmUgdXNlZCB0byBleHRlbmQgYSBzZWxlY3RvciwgaXQgY2Fubm90IGJlIHVzZWQgb24gaXRzIG93bicpOwoJCX0KCX0KCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlVGFnKCl7CgkJcmV0dXJuICggJHRhZyA9ICR0aGlzLT5NYXRjaFJlZygnL1xcR1tBLVphLXpdW0EtWmEtei1dKlswLTldPy8nKSApID8gJHRhZyA6ICR0aGlzLT5NYXRjaENoYXIoJyonKTsKCX0KCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlKCl7CgoJCSR2YWwgPSBudWxsOwoKCQlpZiggISR0aGlzLT5NYXRjaENoYXIoJ1snKSApewoJCQlyZXR1cm47CgkJfQoKCQkka2V5ID0gJHRoaXMtPnBhcnNlRW50aXRpZXNWYXJpYWJsZUN1cmx5KCk7CgkJaWYoICEka2V5ICl7CgkJCSRrZXkgPSAkdGhpcy0+ZXhwZWN0KCcvXFxHKD86W19BLVphLXowLTktXCpdKlx8KT8oPzpbX0EtWmEtejAtOS1dfFxcXFwuKSsvJyk7CgkJfQoKCQkkb3AgPSAkdGhpcy0+TWF0Y2hSZWcoJy9cXEdbfH4qJF5dPz0vJyk7CgkJaWYoICRvcCApewoJCQkkdmFsID0gJHRoaXMtPm1hdGNoKCBhcnJheSgncGFyc2VFbnRpdGllc1F1b3RlZCcsJy9cXEdbMC05XSslLycsJy9cXEdbXHctXSsvJywncGFyc2VFbnRpdGllc1ZhcmlhYmxlQ3VybHknKSApOwoJCX0KCgkJJHRoaXMtPmV4cGVjdENoYXIoJ10nKTsKCgkJcmV0dXJuICR0aGlzLT5OZXdPYmozKCdMZXNzX1RyZWVfQXR0cmlidXRlJyxhcnJheSggJGtleSwgJG9wWzBdLCAkdmFsKSk7Cgl9CgoJLy8KCS8vIFRoZSBgYmxvY2tgIHJ1bGUgaXMgdXNlZCBieSBgcnVsZXNldGAgYW5kIGBtaXhpbi5kZWZpbml0aW9uYC4KCS8vIEl0J3MgYSB3cmFwcGVyIGFyb3VuZCB0aGUgYHByaW1hcnlgIHJ1bGUsIHdpdGggYWRkZWQgYHt9YC4KCS8vCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlQmxvY2soKXsKCQlpZiggJHRoaXMtPk1hdGNoQ2hhcigneycpICl7CgkJCSRjb250ZW50ID0gJHRoaXMtPnBhcnNlUHJpbWFyeSgpOwoJCQlpZiggJHRoaXMtPk1hdGNoQ2hhcignfScpICl7CgkJCQlyZXR1cm4gJGNvbnRlbnQ7CgkJCX0KCQl9Cgl9CgoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUJsb2NrUnVsZXNldCgpewoJCSRibG9jayA9ICR0aGlzLT5wYXJzZUJsb2NrKCk7CgoJCWlmKCAkYmxvY2sgKXsKCQkJJGJsb2NrID0gJHRoaXMtPk5ld09iajIoJ0xlc3NfVHJlZV9SdWxlc2V0JyxhcnJheSggbnVsbCwgJGJsb2NrKSk7CgkJfQoKCQlyZXR1cm4gJGJsb2NrOwoJfQoKCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VEZXRhY2hlZFJ1bGVzZXQoKXsKCQkkYmxvY2tSdWxlc2V0ID0gJHRoaXMtPnBhcnNlQmxvY2tSdWxlc2V0KCk7CgkJaWYoICRibG9ja1J1bGVzZXQgKXsKCQkJcmV0dXJuICR0aGlzLT5OZXdPYmoxKCdMZXNzX1RyZWVfRGV0YWNoZWRSdWxlc2V0JywkYmxvY2tSdWxlc2V0KTsKCQl9Cgl9CgoJLy8KCS8vIGRpdiwgLmNsYXNzLCBib2R5ID4gcCB7Li4ufQoJLy8KCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VSdWxlc2V0KCl7CgkJJHNlbGVjdG9ycyA9IGFycmF5KCk7CgoJCSR0aGlzLT5zYXZlKCk7CgoJCXdoaWxlKCB0cnVlICl7CgkJCSRzID0gJHRoaXMtPnBhcnNlTGVzc1NlbGVjdG9yKCk7CgkJCWlmKCAhJHMgKXsKCQkJCWJyZWFrOwoJCQl9CgkJCSRzZWxlY3RvcnNbXSA9ICRzOwoJCQkkdGhpcy0+cGFyc2VDb21tZW50cygpOwoKCQkJaWYoICRzLT5jb25kaXRpb24gJiYgY291bnQoJHNlbGVjdG9ycykgPiAxICl7CgkJCQkkdGhpcy0+RXJyb3IoJ0d1YXJkcyBhcmUgb25seSBjdXJyZW50bHkgYWxsb3dlZCBvbiBhIHNpbmdsZSBzZWxlY3Rvci4nKTsKCQkJfQoKCQkJaWYoICEkdGhpcy0+TWF0Y2hDaGFyKCcsJykgKXsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmKCAkcy0+Y29uZGl0aW9uICl7CgkJCQkkdGhpcy0+RXJyb3IoJ0d1YXJkcyBhcmUgb25seSBjdXJyZW50bHkgYWxsb3dlZCBvbiBhIHNpbmdsZSBzZWxlY3Rvci4nKTsKCQkJfQoJCQkkdGhpcy0+cGFyc2VDb21tZW50cygpOwoJCX0KCgoJCWlmKCAkc2VsZWN0b3JzICl7CgkJCSRydWxlcyA9ICR0aGlzLT5wYXJzZUJsb2NrKCk7CgkJCWlmKCBpc19hcnJheSgkcnVsZXMpICl7CgkJCQkkdGhpcy0+Zm9yZ2V0KCk7CgkJCQlyZXR1cm4gJHRoaXMtPk5ld09iajIoJ0xlc3NfVHJlZV9SdWxlc2V0JyxhcnJheSggJHNlbGVjdG9ycywgJHJ1bGVzKSk7IC8vTGVzc19FbnZpcm9ubWVudDo6JHN0cmljdEltcG9ydHMKCQkJfQoJCX0KCgkJLy8gQmFja3RyYWNrCgkJJHRoaXMtPmZ1cnRoZXN0ID0gJHRoaXMtPnBvczsKCQkkdGhpcy0+cmVzdG9yZSgpOwoJfQoKCS8qKgoJICogQ3VzdG9tIGxlc3MucGhwIHBhcnNlIGZ1bmN0aW9uIGZvciBmaW5kaW5nIHNpbXBsZSBuYW1lLXZhbHVlIGNzcyBwYWlycwoJICogZXg6IHdpZHRoOjEwMHB4OwoJICoKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZU5hbWVWYWx1ZSgpewoKCQkkaW5kZXggPSAkdGhpcy0+cG9zOwoJCSR0aGlzLT5zYXZlKCk7CgoKCQkvLyRtYXRjaCA9ICR0aGlzLT5NYXRjaFJlZygnL1xcRyhbYS16QS1aXC1dKylccyo6XHMqKCg/OlwnIik/W2EtekEtWjAtOVwtJSBcLiwhXSs/KD86XCciKT8pXHMqKFs7fV0pLycpOwoJCSRtYXRjaCA9ICR0aGlzLT5NYXRjaFJlZygnL1xcRyhbYS16QS1aXC1dKylccyo6XHMqKFtcJyJdP1sjYS16QS1aMC05XC0lXC4sXSs/W1wnIl0/KSAqKCEgKmltcG9ydGFudCk/XHMqKFs7fV0pLycpOwoJCWlmKCAkbWF0Y2ggKXsKCgkJCWlmKCAkbWF0Y2hbNF0gPT0gJ30nICl7CgkJCQkkdGhpcy0+cG9zID0gJGluZGV4ICsgc3RybGVuKCRtYXRjaFswXSktMTsKCQkJfQoKCQkJaWYoICRtYXRjaFszXSApewoJCQkJJG1hdGNoWzJdIC49ICcgIWltcG9ydGFudCc7CgkJCX0KCgkJCXJldHVybiAkdGhpcy0+TmV3T2JqNCgnTGVzc19UcmVlX05hbWVWYWx1ZScsYXJyYXkoICRtYXRjaFsxXSwgJG1hdGNoWzJdLCAkaW5kZXgsICR0aGlzLT5lbnYtPmN1cnJlbnRGaWxlSW5mbykpOwoJCX0KCgkJJHRoaXMtPnJlc3RvcmUoKTsKCX0KCgoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZVJ1bGUoICR0cnlBbm9ueW1vdXMgPSBudWxsICl7CgoJCSRtZXJnZSA9IGZhbHNlOwoJCSRzdGFydE9mUnVsZSA9ICR0aGlzLT5wb3M7CgoJCSRjID0gJHRoaXMtPmlucHV0WyR0aGlzLT5wb3NdOwoJCWlmKCAkYyA9PT0gJy4nIHx8ICRjID09PSAnIycgfHwgJGMgPT09ICcmJyApewoJCQlyZXR1cm47CgkJfQoKCQkkdGhpcy0+c2F2ZSgpOwoJCSRuYW1lID0gJHRoaXMtPk1hdGNoRnVuY3MoIGFycmF5KCdwYXJzZVZhcmlhYmxlJywncGFyc2VSdWxlUHJvcGVydHknKSk7CgoJCWlmKCAkbmFtZSApewoKCQkJJGlzVmFyaWFibGUgPSBpc19zdHJpbmcoJG5hbWUpOwoKCQkJJHZhbHVlID0gbnVsbDsKCQkJaWYoICRpc1ZhcmlhYmxlICl7CgkJCQkkdmFsdWUgPSAkdGhpcy0+cGFyc2VEZXRhY2hlZFJ1bGVzZXQoKTsKCQkJfQoKCQkJJGltcG9ydGFudCA9IG51bGw7CgkJCWlmKCAhJHZhbHVlICl7CgoJCQkJLy8gcHJlZmVyIHRvIHRyeSB0byBwYXJzZSBmaXJzdCBpZiBpdHMgYSB2YXJpYWJsZSBvciB3ZSBhcmUgY29tcHJlc3NpbmcKCQkJCS8vIGJ1dCBhbHdheXMgZmFsbGJhY2sgb24gdGhlIG90aGVyIG9uZQoJCQkJLy9pZiggISR0cnlBbm9ueW1vdXMgJiYgaXNfc3RyaW5nKCRuYW1lKSAmJiAkbmFtZVswXSA9PT0gJ0AnICl7CgkJCQlpZiggISR0cnlBbm9ueW1vdXMgJiYgKExlc3NfUGFyc2VyOjokb3B0aW9uc1snY29tcHJlc3MnXSB8fCAkaXNWYXJpYWJsZSkgKXsKCQkJCQkkdmFsdWUgPSAkdGhpcy0+TWF0Y2hGdW5jcyggYXJyYXkoJ3BhcnNlVmFsdWUnLCdwYXJzZUFub255bW91c1ZhbHVlJykpOwoJCQkJfWVsc2V7CgkJCQkJJHZhbHVlID0gJHRoaXMtPk1hdGNoRnVuY3MoIGFycmF5KCdwYXJzZUFub255bW91c1ZhbHVlJywncGFyc2VWYWx1ZScpKTsKCQkJCX0KCgkJCQkkaW1wb3J0YW50ID0gJHRoaXMtPnBhcnNlSW1wb3J0YW50KCk7CgoJCQkJLy8gYSBuYW1lIHJldHVybmVkIGJ5IHRoaXMucnVsZVByb3BlcnR5KCkgaXMgYWx3YXlzIGFuIGFycmF5IG9mIHRoZSBmb3JtOgoJCQkJLy8gW3N0cmluZy0xLCAuLi4sIHN0cmluZy1uLCAiIl0gb3IgW3N0cmluZy0xLCAuLi4sIHN0cmluZy1uLCAiKyJdCgkJCQkvLyB3aGVyZSBlYWNoIGl0ZW0gaXMgYSB0cmVlLktleXdvcmQgb3IgdHJlZS5WYXJpYWJsZQoJCQkJaWYoICEkaXNWYXJpYWJsZSAmJiBpc19hcnJheSgkbmFtZSkgKXsKCQkJCQkkbm0gPSBhcnJheV9wb3AoJG5hbWUpOwoJCQkJCWlmKCAkbm0tPnZhbHVlICl7CgkJCQkJCSRtZXJnZSA9ICRubS0+dmFsdWU7CgkJCQkJfQoJCQkJfQoJCQl9CgoKCQkJaWYoICR2YWx1ZSAmJiAkdGhpcy0+cGFyc2VFbmQoKSApewoJCQkJJHRoaXMtPmZvcmdldCgpOwoJCQkJcmV0dXJuICR0aGlzLT5OZXdPYmo2KCdMZXNzX1RyZWVfUnVsZScsYXJyYXkoICRuYW1lLCAkdmFsdWUsICRpbXBvcnRhbnQsICRtZXJnZSwgJHN0YXJ0T2ZSdWxlLCAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm8pKTsKCQkJfWVsc2V7CgkJCQkkdGhpcy0+ZnVydGhlc3QgPSAkdGhpcy0+cG9zOwoJCQkJJHRoaXMtPnJlc3RvcmUoKTsKCQkJCWlmKCAkdmFsdWUgJiYgISR0cnlBbm9ueW1vdXMgKXsKCQkJCQlyZXR1cm4gJHRoaXMtPnBhcnNlUnVsZSh0cnVlKTsKCQkJCX0KCQkJfQoJCX1lbHNlewoJCQkkdGhpcy0+Zm9yZ2V0KCk7CgkJfQoJfQoKCWZ1bmN0aW9uIHBhcnNlQW5vbnltb3VzVmFsdWUoKXsKCgkJaWYoIHByZWdfbWF0Y2goJy9cXEcoW15AK1wvXCciKmAoO3t9LV0qKTsvJywkdGhpcy0+aW5wdXQsICRtYXRjaCwgMCwgJHRoaXMtPnBvcykgKXsKCQkJJHRoaXMtPnBvcyArPSBzdHJsZW4oJG1hdGNoWzFdKTsKCQkJcmV0dXJuICR0aGlzLT5OZXdPYmoxKCdMZXNzX1RyZWVfQW5vbnltb3VzJywkbWF0Y2hbMV0pOwoJCX0KCX0KCgkvLwoJLy8gQW4gQGltcG9ydCBkaXJlY3RpdmUKCS8vCgkvLwkgQGltcG9ydCAibGliIjsKCS8vCgkvLyBEZXBlbmRpbmcgb24gb3VyIGVudmlyb25tZW50LCBpbXBvcnRpbmcgaXMgZG9uZSBkaWZmZXJlbnRseToKCS8vIEluIHRoZSBicm93c2VyLCBpdCdzIGFuIFhIUiByZXF1ZXN0LCBpbiBOb2RlLCBpdCB3b3VsZCBiZSBhCgkvLyBmaWxlLXN5c3RlbSBvcGVyYXRpb24uIFRoZSBmdW5jdGlvbiB1c2VkIGZvciBpbXBvcnRpbmcgaXMKCS8vIHN0b3JlZCBpbiBgaW1wb3J0YCwgd2hpY2ggd2UgcGFzcyB0byB0aGUgSW1wb3J0IGNvbnN0cnVjdG9yLgoJLy8KCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VJbXBvcnQoKXsKCgkJJHRoaXMtPnNhdmUoKTsKCgkJJGRpciA9ICR0aGlzLT5NYXRjaFJlZygnL1xcR0BpbXBvcnQ/XHMrLycpOwoKCQlpZiggJGRpciApewoJCQkkb3B0aW9ucyA9ICR0aGlzLT5wYXJzZUltcG9ydE9wdGlvbnMoKTsKCQkJJHBhdGggPSAkdGhpcy0+TWF0Y2hGdW5jcyggYXJyYXkoJ3BhcnNlRW50aXRpZXNRdW90ZWQnLCdwYXJzZUVudGl0aWVzVXJsJykpOwoKCQkJaWYoICRwYXRoICl7CgkJCQkkZmVhdHVyZXMgPSAkdGhpcy0+cGFyc2VNZWRpYUZlYXR1cmVzKCk7CgkJCQlpZiggJHRoaXMtPk1hdGNoQ2hhcignOycpICl7CgkJCQkJaWYoICRmZWF0dXJlcyApewoJCQkJCQkkZmVhdHVyZXMgPSAkdGhpcy0+TmV3T2JqMSgnTGVzc19UcmVlX1ZhbHVlJywkZmVhdHVyZXMpOwoJCQkJCX0KCgkJCQkJJHRoaXMtPmZvcmdldCgpOwoJCQkJCXJldHVybiAkdGhpcy0+TmV3T2JqNSgnTGVzc19UcmVlX0ltcG9ydCcsYXJyYXkoICRwYXRoLCAkZmVhdHVyZXMsICRvcHRpb25zLCAkdGhpcy0+cG9zLCAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm8pKTsKCQkJCX0KCQkJfQoJCX0KCgkJJHRoaXMtPnJlc3RvcmUoKTsKCX0KCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlSW1wb3J0T3B0aW9ucygpewoKCQkkb3B0aW9ucyA9IGFycmF5KCk7CgoJCS8vIGxpc3Qgb2Ygb3B0aW9ucywgc3Vycm91bmRlZCBieSBwYXJlbnMKCQlpZiggISR0aGlzLT5NYXRjaENoYXIoJygnKSApewoJCQlyZXR1cm4gJG9wdGlvbnM7CgkJfQoJCWRvewoJCQkkb3B0aW9uTmFtZSA9ICR0aGlzLT5wYXJzZUltcG9ydE9wdGlvbigpOwoJCQlpZiggJG9wdGlvbk5hbWUgKXsKCQkJCSR2YWx1ZSA9IHRydWU7CgkJCQlzd2l0Y2goICRvcHRpb25OYW1lICl7CgkJCQkJY2FzZSAiY3NzIjoKCQkJCQkJJG9wdGlvbk5hbWUgPSAibGVzcyI7CgkJCQkJCSR2YWx1ZSA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJCWNhc2UgIm9uY2UiOgoJCQkJCQkkb3B0aW9uTmFtZSA9ICJtdWx0aXBsZSI7CgkJCQkJCSR2YWx1ZSA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJJG9wdGlvbnNbJG9wdGlvbk5hbWVdID0gJHZhbHVlOwoJCQkJaWYoICEkdGhpcy0+TWF0Y2hDaGFyKCcsJykgKXsgYnJlYWs7IH0KCQkJfQoJCX13aGlsZSggJG9wdGlvbk5hbWUgKTsKCQkkdGhpcy0+ZXhwZWN0Q2hhcignKScpOwoJCXJldHVybiAkb3B0aW9uczsKCX0KCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlSW1wb3J0T3B0aW9uKCl7CgkJJG9wdCA9ICR0aGlzLT5NYXRjaFJlZygnL1xcRyhsZXNzfGNzc3xtdWx0aXBsZXxvbmNlfGlubGluZXxyZWZlcmVuY2UpLycpOwoJCWlmKCAkb3B0ICl7CgkJCXJldHVybiAkb3B0WzFdOwoJCX0KCX0KCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlTWVkaWFGZWF0dXJlKCkgewoJCSRub2RlcyA9IGFycmF5KCk7CgoJCWRvewoJCQkkZSA9ICR0aGlzLT5NYXRjaEZ1bmNzKGFycmF5KCdwYXJzZUVudGl0aWVzS2V5d29yZCcsJ3BhcnNlRW50aXRpZXNWYXJpYWJsZScpKTsKCQkJaWYoICRlICl7CgkJCQkkbm9kZXNbXSA9ICRlOwoJCQl9IGVsc2VpZiAoJHRoaXMtPk1hdGNoQ2hhcignKCcpKSB7CgkJCQkkcCA9ICR0aGlzLT5wYXJzZVByb3BlcnR5KCk7CgkJCQkkZSA9ICR0aGlzLT5wYXJzZVZhbHVlKCk7CgkJCQlpZiAoJHRoaXMtPk1hdGNoQ2hhcignKScpKSB7CgkJCQkJaWYgKCRwICYmICRlKSB7CgkJCQkJCSRyID0gJHRoaXMtPk5ld09iajcoJ0xlc3NfVHJlZV9SdWxlJywgYXJyYXkoICRwLCAkZSwgbnVsbCwgbnVsbCwgJHRoaXMtPnBvcywgJHRoaXMtPmVudi0+Y3VycmVudEZpbGVJbmZvLCB0cnVlKSk7CgkJCQkJCSRub2Rlc1tdID0gJHRoaXMtPk5ld09iajEoJ0xlc3NfVHJlZV9QYXJlbicsJHIpOwoJCQkJCX0gZWxzZWlmICgkZSkgewoJCQkJCQkkbm9kZXNbXSA9ICR0aGlzLT5OZXdPYmoxKCdMZXNzX1RyZWVfUGFyZW4nLCRlKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gbnVsbDsKCQkJCQl9CgkJCQl9IGVsc2UKCQkJCQlyZXR1cm4gbnVsbDsKCQkJfQoJCX0gd2hpbGUgKCRlKTsKCgkJaWYgKCRub2RlcykgewoJCQlyZXR1cm4gJHRoaXMtPk5ld09iajEoJ0xlc3NfVHJlZV9FeHByZXNzaW9uJywkbm9kZXMpOwoJCX0KCX0KCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlTWVkaWFGZWF0dXJlcygpIHsKCQkkZmVhdHVyZXMgPSBhcnJheSgpOwoKCQlkb3sKCQkJJGUgPSAkdGhpcy0+cGFyc2VNZWRpYUZlYXR1cmUoKTsKCQkJaWYoICRlICl7CgkJCQkkZmVhdHVyZXNbXSA9ICRlOwoJCQkJaWYgKCEkdGhpcy0+TWF0Y2hDaGFyKCcsJykpIGJyZWFrOwoJCQl9ZWxzZXsKCQkJCSRlID0gJHRoaXMtPnBhcnNlRW50aXRpZXNWYXJpYWJsZSgpOwoJCQkJaWYoICRlICl7CgkJCQkJJGZlYXR1cmVzW10gPSAkZTsKCQkJCQlpZiAoISR0aGlzLT5NYXRjaENoYXIoJywnKSkgYnJlYWs7CgkJCQl9CgkJCX0KCQl9IHdoaWxlICgkZSk7CgoJCXJldHVybiAkZmVhdHVyZXMgPyAkZmVhdHVyZXMgOiBudWxsOwoJfQoKCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VNZWRpYSgpIHsKCQlpZiggJHRoaXMtPk1hdGNoUmVnKCcvXFxHQG1lZGlhLycpICl7CgkJCSRmZWF0dXJlcyA9ICR0aGlzLT5wYXJzZU1lZGlhRmVhdHVyZXMoKTsKCQkJJHJ1bGVzID0gJHRoaXMtPnBhcnNlQmxvY2soKTsKCgkJCWlmKCBpc19hcnJheSgkcnVsZXMpICl7CgkJCQlyZXR1cm4gJHRoaXMtPk5ld09iajQoJ0xlc3NfVHJlZV9NZWRpYScsYXJyYXkoICRydWxlcywgJGZlYXR1cmVzLCAkdGhpcy0+cG9zLCAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm8pKTsKCQkJfQoJCX0KCX0KCgoJLy8KCS8vIEEgQ1NTIERpcmVjdGl2ZQoJLy8KCS8vIEBjaGFyc2V0ICJ1dGYtOCI7CgkvLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZURpcmVjdGl2ZSgpewoKCQlpZiggISR0aGlzLT5QZWVrQ2hhcignQCcpICl7CgkJCXJldHVybjsKCQl9CgoJCSRydWxlcyA9IG51bGw7CgkJJGluZGV4ID0gJHRoaXMtPnBvczsKCQkkaGFzQmxvY2sgPSB0cnVlOwoJCSRoYXNJZGVudGlmaWVyID0gZmFsc2U7CgkJJGhhc0V4cHJlc3Npb24gPSBmYWxzZTsKCQkkaGFzVW5rbm93biA9IGZhbHNlOwoKCgkJJHZhbHVlID0gJHRoaXMtPk1hdGNoRnVuY3MoYXJyYXkoJ3BhcnNlSW1wb3J0JywncGFyc2VNZWRpYScpKTsKCQlpZiggJHZhbHVlICl7CgkJCXJldHVybiAkdmFsdWU7CgkJfQoKCQkkdGhpcy0+c2F2ZSgpOwoKCQkkbmFtZSA9ICR0aGlzLT5NYXRjaFJlZygnL1xcR0BbYS16LV0rLycpOwoKCQlpZiggISRuYW1lICkgcmV0dXJuOwoJCSRuYW1lID0gJG5hbWVbMF07CgoKCQkkbm9uVmVuZG9yU3BlY2lmaWNOYW1lID0gJG5hbWU7CgkJJHBvcyA9IHN0cnBvcygkbmFtZSwnLScsIDIpOwoJCWlmKCAkbmFtZVsxXSA9PSAnLScgJiYgJHBvcyA+IDAgKXsKCQkJJG5vblZlbmRvclNwZWNpZmljTmFtZSA9ICJAIiAuIHN1YnN0cigkbmFtZSwgJHBvcyArIDEpOwoJCX0KCgoJCXN3aXRjaCggJG5vblZlbmRvclNwZWNpZmljTmFtZSApewoJCQkvKgoJCQljYXNlICJAZm9udC1mYWNlIjoKCQkJY2FzZSAiQHZpZXdwb3J0IjoKCQkJY2FzZSAiQHRvcC1sZWZ0IjoKCQkJY2FzZSAiQHRvcC1sZWZ0LWNvcm5lciI6CgkJCWNhc2UgIkB0b3AtY2VudGVyIjoKCQkJY2FzZSAiQHRvcC1yaWdodCI6CgkJCWNhc2UgIkB0b3AtcmlnaHQtY29ybmVyIjoKCQkJY2FzZSAiQGJvdHRvbS1sZWZ0IjoKCQkJY2FzZSAiQGJvdHRvbS1sZWZ0LWNvcm5lciI6CgkJCWNhc2UgIkBib3R0b20tY2VudGVyIjoKCQkJY2FzZSAiQGJvdHRvbS1yaWdodCI6CgkJCWNhc2UgIkBib3R0b20tcmlnaHQtY29ybmVyIjoKCQkJY2FzZSAiQGxlZnQtdG9wIjoKCQkJY2FzZSAiQGxlZnQtbWlkZGxlIjoKCQkJY2FzZSAiQGxlZnQtYm90dG9tIjoKCQkJY2FzZSAiQHJpZ2h0LXRvcCI6CgkJCWNhc2UgIkByaWdodC1taWRkbGUiOgoJCQljYXNlICJAcmlnaHQtYm90dG9tIjoKCQkJaGFzQmxvY2sgPSB0cnVlOwoJCQlicmVhazsKCQkJKi8KCQkJY2FzZSAiQGNoYXJzZXQiOgoJCQkJJGhhc0lkZW50aWZpZXIgPSB0cnVlOwoJCQkJJGhhc0Jsb2NrID0gZmFsc2U7CgkJCQlicmVhazsKCQkJY2FzZSAiQG5hbWVzcGFjZSI6CgkJCQkkaGFzRXhwcmVzc2lvbiA9IHRydWU7CgkJCQkkaGFzQmxvY2sgPSBmYWxzZTsKCQkJCWJyZWFrOwoJCQljYXNlICJAa2V5ZnJhbWVzIjoKCQkJCSRoYXNJZGVudGlmaWVyID0gdHJ1ZTsKCQkJCWJyZWFrOwoJCQljYXNlICJAaG9zdCI6CgkJCWNhc2UgIkBwYWdlIjoKCQkJY2FzZSAiQGRvY3VtZW50IjoKCQkJY2FzZSAiQHN1cHBvcnRzIjoKCQkJCSRoYXNVbmtub3duID0gdHJ1ZTsKCQkJCWJyZWFrOwoJCX0KCgkJaWYoICRoYXNJZGVudGlmaWVyICl7CgkJCSR2YWx1ZSA9ICR0aGlzLT5wYXJzZUVudGl0eSgpOwoJCQlpZiggISR2YWx1ZSApewoJCQkJJHRoaXMtPmVycm9yKCJleHBlY3RlZCAiIC4gJG5hbWUgLiAiIGlkZW50aWZpZXIiKTsKCQkJfQoJCX0gZWxzZSBpZiggJGhhc0V4cHJlc3Npb24gKXsKCQkJJHZhbHVlID0gJHRoaXMtPnBhcnNlRXhwcmVzc2lvbigpOwoJCQlpZiggISR2YWx1ZSApewoJCQkJJHRoaXMtPmVycm9yKCJleHBlY3RlZCAiIC4gJG5hbWUuICIgZXhwcmVzc2lvbiIpOwoJCQl9CgkJfSBlbHNlIGlmICgkaGFzVW5rbm93bikgewoKCQkJJHZhbHVlID0gJHRoaXMtPk1hdGNoUmVnKCcvXFxHW157O10rLycpOwoJCQlpZiggJHZhbHVlICl7CgkJCQkkdmFsdWUgPSAkdGhpcy0+TmV3T2JqMSgnTGVzc19UcmVlX0Fub255bW91cycsdHJpbSgkdmFsdWVbMF0pKTsKCQkJfQoJCX0KCgkJaWYoICRoYXNCbG9jayApewoJCQkkcnVsZXMgPSAkdGhpcy0+cGFyc2VCbG9ja1J1bGVzZXQoKTsKCQl9CgoJCWlmKCAkcnVsZXMgfHwgKCEkaGFzQmxvY2sgJiYgJHZhbHVlICYmICR0aGlzLT5NYXRjaENoYXIoJzsnKSkpIHsKCQkJJHRoaXMtPmZvcmdldCgpOwoJCQlyZXR1cm4gJHRoaXMtPk5ld09iajUoJ0xlc3NfVHJlZV9EaXJlY3RpdmUnLGFycmF5KCRuYW1lLCAkdmFsdWUsICRydWxlcywgJGluZGV4LCAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm8pKTsKCQl9CgoJCSR0aGlzLT5yZXN0b3JlKCk7Cgl9CgoKCS8vCgkvLyBBIFZhbHVlIGlzIGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgRXhwcmVzc2lvbnMKCS8vCgkvLwkgZm9udC1mYW1pbHk6IEJhc2tlcnZpbGxlLCBHZW9yZ2lhLCBzZXJpZjsKCS8vCgkvLyBJbiBhIFJ1bGUsIGEgVmFsdWUgcmVwcmVzZW50cyBldmVyeXRoaW5nIGFmdGVyIHRoZSBgOmAsCgkvLyBhbmQgYmVmb3JlIHRoZSBgO2AuCgkvLwoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZVZhbHVlKCl7CgkJJGV4cHJlc3Npb25zID0gYXJyYXkoKTsKCgkJZG97CgkJCSRlID0gJHRoaXMtPnBhcnNlRXhwcmVzc2lvbigpOwoJCQlpZiggJGUgKXsKCQkJCSRleHByZXNzaW9uc1tdID0gJGU7CgkJCQlpZiAoISAkdGhpcy0+TWF0Y2hDaGFyKCcsJykpIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX13aGlsZSgkZSk7CgoJCWlmKCAkZXhwcmVzc2lvbnMgKXsKCQkJcmV0dXJuICR0aGlzLT5OZXdPYmoxKCdMZXNzX1RyZWVfVmFsdWUnLCRleHByZXNzaW9ucyk7CgkJfQoJfQoKCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VJbXBvcnRhbnQgKCl7CgkJaWYoICR0aGlzLT5QZWVrQ2hhcignIScpICYmICR0aGlzLT5NYXRjaFJlZygnL1xcRyEgKmltcG9ydGFudC8nKSApewoJCQlyZXR1cm4gJyAhaW1wb3J0YW50JzsKCQl9Cgl9CgoJcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZVN1YiAoKXsKCgkJaWYoICR0aGlzLT5NYXRjaENoYXIoJygnKSApewoJCQkkYSA9ICR0aGlzLT5wYXJzZUFkZGl0aW9uKCk7CgkJCWlmKCAkYSApewoJCQkJJHRoaXMtPmV4cGVjdENoYXIoJyknKTsKCQkJCXJldHVybiAkdGhpcy0+TmV3T2JqMignTGVzc19UcmVlX0V4cHJlc3Npb24nLGFycmF5KCBhcnJheSgkYSksIHRydWUpICk7IC8vaW5zdGVhZCBvZiAkZS0+cGFyZW5zID0gdHJ1ZSBzbyB0aGUgdmFsdWUgaXMgY2FjaGVkCgkJCX0KCQl9Cgl9CgoKCS8qKgoJICogUGFyc2VzIG11bHRpcGxpY2F0aW9uIG9wZXJhdGlvbgoJICoKCSAqIEByZXR1cm4gTGVzc19UcmVlX09wZXJhdGlvbnxudWxsCgkgKi8KCWZ1bmN0aW9uIHBhcnNlTXVsdGlwbGljYXRpb24oKXsKCgkJJHJldHVybiA9ICRtID0gJHRoaXMtPnBhcnNlT3BlcmFuZCgpOwoJCWlmKCAkcmV0dXJuICl7CgkJCXdoaWxlKCB0cnVlICl7CgoJCQkJJGlzU3BhY2VkID0gJHRoaXMtPmlzV2hpdGVzcGFjZSggLTEgKTsKCgkJCQlpZiggJHRoaXMtPlBlZWtSZWcoJy9cXEdcL1sqXC9dLycpICl7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJJG9wID0gJHRoaXMtPk1hdGNoQ2hhcignLycpOwoJCQkJaWYoICEkb3AgKXsKCQkJCQkkb3AgPSAkdGhpcy0+TWF0Y2hDaGFyKCcqJyk7CgkJCQkJaWYoICEkb3AgKXsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoKCQkJCSRhID0gJHRoaXMtPnBhcnNlT3BlcmFuZCgpOwoKCQkJCWlmKCEkYSkgeyBicmVhazsgfQoKCQkJCSRtLT5wYXJlbnNJbk9wID0gdHJ1ZTsKCQkJCSRhLT5wYXJlbnNJbk9wID0gdHJ1ZTsKCQkJCSRyZXR1cm4gPSAkdGhpcy0+TmV3T2JqMygnTGVzc19UcmVlX09wZXJhdGlvbicsYXJyYXkoICRvcCwgYXJyYXkoICRyZXR1cm4sICRhICksICRpc1NwYWNlZCkgKTsKCQkJfQoJCX0KCQlyZXR1cm4gJHJldHVybjsKCgl9CgoKCS8qKgoJICogUGFyc2VzIGFuIGFkZGl0aW9uIG9wZXJhdGlvbgoJICoKCSAqIEByZXR1cm4gTGVzc19UcmVlX09wZXJhdGlvbnxudWxsCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VBZGRpdGlvbiAoKXsKCgkJJHJldHVybiA9ICRtID0gJHRoaXMtPnBhcnNlTXVsdGlwbGljYXRpb24oKTsKCQlpZiggJHJldHVybiApewoJCQl3aGlsZSggdHJ1ZSApewoKCQkJCSRpc1NwYWNlZCA9ICR0aGlzLT5pc1doaXRlc3BhY2UoIC0xICk7CgoJCQkJJG9wID0gJHRoaXMtPk1hdGNoUmVnKCcvXFxHWy0rXVxzKy8nKTsKCQkJCWlmKCAkb3AgKXsKCQkJCQkkb3AgPSAkb3BbMF07CgkJCQl9ZWxzZXsKCQkJCQlpZiggISRpc1NwYWNlZCApewoJCQkJCQkkb3AgPSAkdGhpcy0+bWF0Y2goYXJyYXkoJyMrJywnIy0nKSk7CgkJCQkJfQoJCQkJCWlmKCAhJG9wICl7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCgkJCQkkYSA9ICR0aGlzLT5wYXJzZU11bHRpcGxpY2F0aW9uKCk7CgkJCQlpZiggISRhICl7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJJG0tPnBhcmVuc0luT3AgPSB0cnVlOwoJCQkJJGEtPnBhcmVuc0luT3AgPSB0cnVlOwoJCQkJJHJldHVybiA9ICR0aGlzLT5OZXdPYmozKCdMZXNzX1RyZWVfT3BlcmF0aW9uJyxhcnJheSgkb3AsIGFycmF5KCRyZXR1cm4sICRhKSwgJGlzU3BhY2VkKSk7CgkJCX0KCQl9CgoJCXJldHVybiAkcmV0dXJuOwoJfQoKCgkvKioKCSAqIFBhcnNlcyB0aGUgY29uZGl0aW9ucwoJICoKCSAqIEByZXR1cm4gTGVzc19UcmVlX0NvbmRpdGlvbnxudWxsCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VDb25kaXRpb25zKCkgewoJCSRpbmRleCA9ICR0aGlzLT5wb3M7CgkJJHJldHVybiA9ICRhID0gJHRoaXMtPnBhcnNlQ29uZGl0aW9uKCk7CgkJaWYoICRhICl7CgkJCXdoaWxlKCB0cnVlICl7CgkJCQlpZiggISR0aGlzLT5QZWVrUmVnKCcvXFxHLFxzKihub3RccyopP1woLycpIHx8ICAhJHRoaXMtPk1hdGNoQ2hhcignLCcpICl7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQkkYiA9ICR0aGlzLT5wYXJzZUNvbmRpdGlvbigpOwoJCQkJaWYoICEkYiApewoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCSRyZXR1cm4gPSAkdGhpcy0+TmV3T2JqNCgnTGVzc19UcmVlX0NvbmRpdGlvbicsYXJyYXkoJ29yJywgJHJldHVybiwgJGIsICRpbmRleCkpOwoJCQl9CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCX0KCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlQ29uZGl0aW9uKCkgewoJCSRpbmRleCA9ICR0aGlzLT5wb3M7CgkJJG5lZ2F0ZSA9IGZhbHNlOwoJCSRjID0gbnVsbDsKCgkJaWYgKCR0aGlzLT5NYXRjaFJlZygnL1xcR25vdC8nKSkgJG5lZ2F0ZSA9IHRydWU7CgkJJHRoaXMtPmV4cGVjdENoYXIoJygnKTsKCQkkYSA9ICR0aGlzLT5NYXRjaEZ1bmNzKGFycmF5KCdwYXJzZUFkZGl0aW9uJywncGFyc2VFbnRpdGllc0tleXdvcmQnLCdwYXJzZUVudGl0aWVzUXVvdGVkJykpOwoKCQlpZiggJGEgKXsKCQkJJG9wID0gJHRoaXMtPk1hdGNoUmVnKCcvXFxHKD86Pj18PD18PTx8Wzw9Pl0pLycpOwoJCQlpZiggJG9wICl7CgkJCQkkYiA9ICR0aGlzLT5NYXRjaEZ1bmNzKGFycmF5KCdwYXJzZUFkZGl0aW9uJywncGFyc2VFbnRpdGllc0tleXdvcmQnLCdwYXJzZUVudGl0aWVzUXVvdGVkJykpOwoJCQkJaWYoICRiICl7CgkJCQkJJGMgPSAkdGhpcy0+TmV3T2JqNSgnTGVzc19UcmVlX0NvbmRpdGlvbicsYXJyYXkoJG9wWzBdLCAkYSwgJGIsICRpbmRleCwgJG5lZ2F0ZSkpOwoJCQkJfSBlbHNlIHsKCQkJCQkkdGhpcy0+RXJyb3IoJ1VuZXhwZWN0ZWQgZXhwcmVzc2lvbicpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJGsgPSAkdGhpcy0+TmV3T2JqMSgnTGVzc19UcmVlX0tleXdvcmQnLCd0cnVlJyk7CgkJCQkkYyA9ICR0aGlzLT5OZXdPYmo1KCdMZXNzX1RyZWVfQ29uZGl0aW9uJyxhcnJheSgnPScsICRhLCAkaywgJGluZGV4LCAkbmVnYXRlKSk7CgkJCX0KCQkJJHRoaXMtPmV4cGVjdENoYXIoJyknKTsKCQkJcmV0dXJuICR0aGlzLT5NYXRjaFJlZygnL1xcR2FuZC8nKSA/ICR0aGlzLT5OZXdPYmozKCdMZXNzX1RyZWVfQ29uZGl0aW9uJyxhcnJheSgnYW5kJywgJGMsICR0aGlzLT5wYXJzZUNvbmRpdGlvbigpKSkgOiAkYzsKCQl9Cgl9CgoJLyoqCgkgKiBBbiBvcGVyYW5kIGlzIGFueXRoaW5nIHRoYXQgY2FuIGJlIHBhcnQgb2YgYW4gb3BlcmF0aW9uLAoJICogc3VjaCBhcyBhIENvbG9yLCBvciBhIFZhcmlhYmxlCgkgKgoJICovCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlT3BlcmFuZCAoKXsKCgkJJG5lZ2F0ZSA9IGZhbHNlOwoJCSRvZmZzZXQgPSAkdGhpcy0+cG9zKzE7CgkJaWYoICRvZmZzZXQgPj0gJHRoaXMtPmlucHV0X2xlbiApewoJCQlyZXR1cm47CgkJfQoJCSRjaGFyID0gJHRoaXMtPmlucHV0WyRvZmZzZXRdOwoJCWlmKCAkY2hhciA9PT0gJ0AnIHx8ICRjaGFyID09PSAnKCcgKXsKCQkJJG5lZ2F0ZSA9ICR0aGlzLT5NYXRjaENoYXIoJy0nKTsKCQl9CgoJCSRvID0gJHRoaXMtPk1hdGNoRnVuY3MoYXJyYXkoJ3BhcnNlU3ViJywncGFyc2VFbnRpdGllc0RpbWVuc2lvbicsJ3BhcnNlRW50aXRpZXNDb2xvcicsJ3BhcnNlRW50aXRpZXNWYXJpYWJsZScsJ3BhcnNlRW50aXRpZXNDYWxsJykpOwoKCQlpZiggJG5lZ2F0ZSApewoJCQkkby0+cGFyZW5zSW5PcCA9IHRydWU7CgkJCSRvID0gJHRoaXMtPk5ld09iajEoJ0xlc3NfVHJlZV9OZWdhdGl2ZScsJG8pOwoJCX0KCgkJcmV0dXJuICRvOwoJfQoKCgkvKioKCSAqIEV4cHJlc3Npb25zIGVpdGhlciByZXByZXNlbnQgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMsCgkgKiBvciB3aGl0ZS1zcGFjZSBkZWxpbWl0ZWQgRW50aXRpZXMuCgkgKgoJICoJIDFweCBzb2xpZCBibGFjawoJICoJIEB2YXIgKiAyCgkgKgoJICogQHJldHVybiBMZXNzX1RyZWVfRXhwcmVzc2lvbnxudWxsCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uICgpewoJCSRlbnRpdGllcyA9IGFycmF5KCk7CgoJCWRvewoJCQkkZSA9ICR0aGlzLT5NYXRjaEZ1bmNzKGFycmF5KCdwYXJzZUFkZGl0aW9uJywncGFyc2VFbnRpdHknKSk7CgkJCWlmKCAkZSApewoJCQkJJGVudGl0aWVzW10gPSAkZTsKCQkJCS8vIG9wZXJhdGlvbnMgZG8gbm90IGFsbG93IGtleXdvcmQgIi8iIGRpbWVuc2lvbiAoZS5nLiBzbWFsbC8yMHB4KSBzbyB3ZSBzdXBwb3J0IHRoYXQgaGVyZQoJCQkJaWYoICEkdGhpcy0+UGVla1JlZygnL1xcR1wvW1wvKl0vJykgKXsKCQkJCQkkZGVsaW0gPSAkdGhpcy0+TWF0Y2hDaGFyKCcvJyk7CgkJCQkJaWYoICRkZWxpbSApewoJCQkJCQkkZW50aXRpZXNbXSA9ICR0aGlzLT5OZXdPYmoxKCdMZXNzX1RyZWVfQW5vbnltb3VzJywkZGVsaW0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX13aGlsZSgkZSk7CgoJCWlmKCAkZW50aXRpZXMgKXsKCQkJcmV0dXJuICR0aGlzLT5OZXdPYmoxKCdMZXNzX1RyZWVfRXhwcmVzc2lvbicsJGVudGl0aWVzKTsKCQl9Cgl9CgoKCS8qKgoJICogUGFyc2UgYSBwcm9wZXJ0eQoJICogZWc6ICdtaW4td2lkdGgnLCAnb3JpZW50YXRpb24nLCBldGMKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlUHJvcGVydHkgKCl7CgkJJG5hbWUgPSAkdGhpcy0+TWF0Y2hSZWcoJy9cXEcoXCo/LT9bX2EtekEtWjAtOS1dKylccyo6LycpOwoJCWlmKCAkbmFtZSApewoJCQlyZXR1cm4gJG5hbWVbMV07CgkJfQoJfQoKCgkvKioKCSAqIFBhcnNlIGEgcnVsZSBwcm9wZXJ0eQoJICogZWc6ICdjb2xvcicsICd3aWR0aCcsICdoZWlnaHQnLCBldGMKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwcml2YXRlIGZ1bmN0aW9uIHBhcnNlUnVsZVByb3BlcnR5KCl7CgkJJG9mZnNldCA9ICR0aGlzLT5wb3M7CgkJJG5hbWUgPSBhcnJheSgpOwoJCSRpbmRleCA9IGFycmF5KCk7CgkJJGxlbmd0aCA9IDA7CgoKCQkkdGhpcy0+cnVsZVByb3BlcnR5TWF0Y2goJy9cXEcoXCo/KS8nLCAkb2Zmc2V0LCAkbGVuZ3RoLCAkaW5kZXgsICRuYW1lICk7CgkJd2hpbGUoICR0aGlzLT5ydWxlUHJvcGVydHlNYXRjaCgnL1xcRygoPzpbXHctXSspfCg/OkBce1tcdy1dK1x9KSkvJywgJG9mZnNldCwgJGxlbmd0aCwgJGluZGV4LCAkbmFtZSApKTsgLy8gIQoKCQlpZiggKGNvdW50KCRuYW1lKSA+IDEpICYmICR0aGlzLT5ydWxlUHJvcGVydHlNYXRjaCgnL1xcR1xzKigoPzpcK198XCspPylccyo6LycsICRvZmZzZXQsICRsZW5ndGgsICRpbmRleCwgJG5hbWUpICl7CgkJCS8vIGF0IGxhc3QsIHdlIGhhdmUgdGhlIGNvbXBsZXRlIG1hdGNoIG5vdy4gbW92ZSBmb3J3YXJkLAoJCQkvLyBjb252ZXJ0IG5hbWUgcGFydGljbGVzIHRvIHRyZWUgb2JqZWN0cyBhbmQgcmV0dXJuOgoJCQkkdGhpcy0+c2tpcFdoaXRlc3BhY2UoJGxlbmd0aCk7CgoJCQlpZiggJG5hbWVbMF0gPT09ICcnICl7CgkJCQlhcnJheV9zaGlmdCgkbmFtZSk7CgkJCQlhcnJheV9zaGlmdCgkaW5kZXgpOwoJCQl9CgkJCWZvcmVhY2goJG5hbWUgYXMgJGsgPT4gJHMgKXsKCQkJCWlmKCAhJHMgfHwgJHNbMF0gIT09ICdAJyApewoJCQkJCSRuYW1lWyRrXSA9ICR0aGlzLT5OZXdPYmoxKCdMZXNzX1RyZWVfS2V5d29yZCcsJHMpOwoJCQkJfWVsc2V7CgkJCQkJJG5hbWVbJGtdID0gJHRoaXMtPk5ld09iajMoJ0xlc3NfVHJlZV9WYXJpYWJsZScsYXJyYXkoJ0AnIC4gc3Vic3RyKCRzLDIsLTEpLCAkaW5kZXhbJGtdLCAkdGhpcy0+ZW52LT5jdXJyZW50RmlsZUluZm8pKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gJG5hbWU7CgkJfQoKCgl9CgoJcHJpdmF0ZSBmdW5jdGlvbiBydWxlUHJvcGVydHlNYXRjaCggJHJlLCAmJG9mZnNldCwgJiRsZW5ndGgsICAmJGluZGV4LCAmJG5hbWUgKXsKCQlwcmVnX21hdGNoKCRyZSwgJHRoaXMtPmlucHV0LCAkYSwgMCwgJG9mZnNldCk7CgkJaWYoICRhICl7CgkJCSRpbmRleFtdID0gJHRoaXMtPnBvcyArICRsZW5ndGg7CgkJCSRsZW5ndGggKz0gc3RybGVuKCRhWzBdKTsKCQkJJG9mZnNldCArPSBzdHJsZW4oJGFbMF0pOwoJCQkkbmFtZVtdID0gJGFbMV07CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlcmlhbGl6ZVZhcnMoICR2YXJzICl7CgkJJHMgPSAnJzsKCgkJZm9yZWFjaCgkdmFycyBhcyAkbmFtZSA9PiAkdmFsdWUpewoJCQkkcyAuPSAoKCRuYW1lWzBdID09PSAnQCcpID8gJycgOiAnQCcpIC4gJG5hbWUgLic6ICcuICR2YWx1ZSAuICgoc3Vic3RyKCR2YWx1ZSwtMSkgPT09ICc7JykgPyAnJyA6ICc7Jyk7CgkJfQoKCQlyZXR1cm4gJHM7Cgl9CgoKCS8qKgoJICogU29tZSB2ZXJzaW9ucyBvZiBwaHAgaGF2ZSB0cm91YmxlIHdpdGggbWV0aG9kX2V4aXN0cygkYSwkYikgaWYgJGEgaXMgbm90IGFuIG9iamVjdAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGIKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc19tZXRob2QoJGEsJGIpewoJCXJldHVybiBpc19vYmplY3QoJGEpICYmIG1ldGhvZF9leGlzdHMoJGEsJGIpOwoJfQoKCgkvKioKCSAqIFJvdW5kIG51bWJlcnMgc2ltaWxhcmx5IHRvIGphdmFzY3JpcHQKCSAqIGVnOiAxLjQ5OTk5OSB0byAxIGluc3RlYWQgb2YgMgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByb3VuZCgkaSwgJHByZWNpc2lvbiA9IDApewoKCQkkcHJlY2lzaW9uID0gcG93KDEwLCRwcmVjaXNpb24pOwoJCSRpID0gJGkqJHByZWNpc2lvbjsKCgkJJGNlaWwgPSBjZWlsKCRpKTsKCQkkZmxvb3IgPSBmbG9vcigkaSk7CgkJaWYoICgkY2VpbCAtICRpKSA8PSAoJGkgLSAkZmxvb3IpICl7CgkJCXJldHVybiAkY2VpbC8kcHJlY2lzaW9uOwoJCX1lbHNlewoJCQlyZXR1cm4gJGZsb29yLyRwcmVjaXNpb247CgkJfQoJfQoKCgkvKioKCSAqIENyZWF0ZSBMZXNzX1RyZWVfKiBvYmplY3RzIGFuZCBvcHRpb25hbGx5IGdlbmVyYXRlIGEgY2FjaGUgc3RyaW5nCgkgKgoJICogQHJldHVybiBtaXhlZAoJICovCglwdWJsaWMgZnVuY3Rpb24gTmV3T2JqMCgkY2xhc3MpewoJCSRvYmogPSBuZXcgJGNsYXNzKCk7CgkJaWYoICR0aGlzLT5DYWNoZUVuYWJsZWQoKSApewoJCQkkb2JqLT5jYWNoZV9zdHJpbmcgPSAnIG5ldyAnLiRjbGFzcy4nKCknOwoJCX0KCQlyZXR1cm4gJG9iajsKCX0KCglwdWJsaWMgZnVuY3Rpb24gTmV3T2JqMSgkY2xhc3MsICRhcmcpewoJCSRvYmogPSBuZXcgJGNsYXNzKCAkYXJnICk7CgkJaWYoICR0aGlzLT5DYWNoZUVuYWJsZWQoKSApewoJCQkkb2JqLT5jYWNoZV9zdHJpbmcgPSAnIG5ldyAnLiRjbGFzcy4nKCcuTGVzc19QYXJzZXI6OkFyZ1N0cmluZygkYXJnKS4nKSc7CgkJfQoJCXJldHVybiAkb2JqOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBOZXdPYmoyKCRjbGFzcywgJGFyZ3MpewoJCSRvYmogPSBuZXcgJGNsYXNzKCAkYXJnc1swXSwgJGFyZ3NbMV0gKTsKCQlpZiggJHRoaXMtPkNhY2hlRW5hYmxlZCgpICl7CgkJCSR0aGlzLT5PYmpDYWNoZSggJG9iaiwgJGNsYXNzLCAkYXJncyk7CgkJfQoJCXJldHVybiAkb2JqOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBOZXdPYmozKCRjbGFzcywgJGFyZ3MpewoJCSRvYmogPSBuZXcgJGNsYXNzKCAkYXJnc1swXSwgJGFyZ3NbMV0sICRhcmdzWzJdICk7CgkJaWYoICR0aGlzLT5DYWNoZUVuYWJsZWQoKSApewoJCQkkdGhpcy0+T2JqQ2FjaGUoICRvYmosICRjbGFzcywgJGFyZ3MpOwoJCX0KCQlyZXR1cm4gJG9iajsKCX0KCglwdWJsaWMgZnVuY3Rpb24gTmV3T2JqNCgkY2xhc3MsICRhcmdzKXsKCQkkb2JqID0gbmV3ICRjbGFzcyggJGFyZ3NbMF0sICRhcmdzWzFdLCAkYXJnc1syXSwgJGFyZ3NbM10gKTsKCQlpZiggJHRoaXMtPkNhY2hlRW5hYmxlZCgpICl7CgkJCSR0aGlzLT5PYmpDYWNoZSggJG9iaiwgJGNsYXNzLCAkYXJncyk7CgkJfQoJCXJldHVybiAkb2JqOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBOZXdPYmo1KCRjbGFzcywgJGFyZ3MpewoJCSRvYmogPSBuZXcgJGNsYXNzKCAkYXJnc1swXSwgJGFyZ3NbMV0sICRhcmdzWzJdLCAkYXJnc1szXSwgJGFyZ3NbNF0gKTsKCQlpZiggJHRoaXMtPkNhY2hlRW5hYmxlZCgpICl7CgkJCSR0aGlzLT5PYmpDYWNoZSggJG9iaiwgJGNsYXNzLCAkYXJncyk7CgkJfQoJCXJldHVybiAkb2JqOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBOZXdPYmo2KCRjbGFzcywgJGFyZ3MpewoJCSRvYmogPSBuZXcgJGNsYXNzKCAkYXJnc1swXSwgJGFyZ3NbMV0sICRhcmdzWzJdLCAkYXJnc1szXSwgJGFyZ3NbNF0sICRhcmdzWzVdICk7CgkJaWYoICR0aGlzLT5DYWNoZUVuYWJsZWQoKSApewoJCQkkdGhpcy0+T2JqQ2FjaGUoICRvYmosICRjbGFzcywgJGFyZ3MpOwoJCX0KCQlyZXR1cm4gJG9iajsKCX0KCglwdWJsaWMgZnVuY3Rpb24gTmV3T2JqNygkY2xhc3MsICRhcmdzKXsKCQkkb2JqID0gbmV3ICRjbGFzcyggJGFyZ3NbMF0sICRhcmdzWzFdLCAkYXJnc1syXSwgJGFyZ3NbM10sICRhcmdzWzRdLCAkYXJnc1s1XSwgJGFyZ3NbNl0gKTsKCQlpZiggJHRoaXMtPkNhY2hlRW5hYmxlZCgpICl7CgkJCSR0aGlzLT5PYmpDYWNoZSggJG9iaiwgJGNsYXNzLCAkYXJncyk7CgkJfQoJCXJldHVybiAkb2JqOwoJfQoKCS8vY2FjaGluZwoJcHVibGljIGZ1bmN0aW9uIE9iakNhY2hlKCRvYmosICRjbGFzcywgJGFyZ3M9YXJyYXkoKSl7CgkJJG9iai0+Y2FjaGVfc3RyaW5nID0gJyBuZXcgJy4kY2xhc3MuJygnLiBzZWxmOjpBcmdDYWNoZSgkYXJncykuJyknOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBBcmdDYWNoZSgkYXJncyl7CgkJcmV0dXJuIGltcGxvZGUoJywnLGFycmF5X21hcCggYXJyYXkoJ0xlc3NfUGFyc2VyJywnQXJnU3RyaW5nJyksJGFyZ3MpKTsKCX0KCgoJLyoqCgkgKiBDb252ZXJ0IGFuIGFyZ3VtZW50IHRvIGEgc3RyaW5nIGZvciB1c2UgaW4gdGhlIHBhcnNlciBjYWNoZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQXJnU3RyaW5nKCRhcmcpewoKCQkkdHlwZSA9IGdldHR5cGUoJGFyZyk7CgoJCWlmKCAkdHlwZSA9PT0gJ29iamVjdCcpewoJCQkkc3RyaW5nID0gJGFyZy0+Y2FjaGVfc3RyaW5nOwoJCQl1bnNldCgkYXJnLT5jYWNoZV9zdHJpbmcpOwoJCQlyZXR1cm4gJHN0cmluZzsKCgkJfWVsc2VpZiggJHR5cGUgPT09ICdhcnJheScgKXsKCQkJJHN0cmluZyA9ICcgQXJyYXkoJzsKCQkJZm9yZWFjaCgkYXJnIGFzICRrID0+ICRhKXsKCQkJCSRzdHJpbmcgLj0gdmFyX2V4cG9ydCgkayx0cnVlKS4nID0+ICcuc2VsZjo6QXJnU3RyaW5nKCRhKS4nLCc7CgkJCX0KCQkJcmV0dXJuICRzdHJpbmcgLiAnKSc7CgkJfQoKCQlyZXR1cm4gdmFyX2V4cG9ydCgkYXJnLHRydWUpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBFcnJvcigkbXNnKXsKCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fUGFyc2VyKCRtc2csIG51bGwsICR0aGlzLT5mdXJ0aGVzdCwgJHRoaXMtPmVudi0+Y3VycmVudEZpbGVJbmZvKTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFdpblBhdGgoJHBhdGgpewoJCXJldHVybiBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gQ2FjaGVFbmFibGVkKCl7CgkJcmV0dXJuIChMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ2NhY2hlX21ldGhvZCddICYmIChMZXNzX0NhY2hlOjokY2FjaGVfZGlyIHx8IChMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ2NhY2hlX21ldGhvZCddID09ICdjYWxsYmFjaycpKSk7Cgl9Cgp9CgoKIAoKLyoqCiAqIFV0aWxpdHkgZm9yIGNzcyBjb2xvcnMKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSBjb2xvcgogKi8KY2xhc3MgTGVzc19Db2xvcnMgewoKCXB1YmxpYyBzdGF0aWMgJGNvbG9ycyA9IGFycmF5KAoJCQknYWxpY2VibHVlJz0+JyNmMGY4ZmYnLAoJCQknYW50aXF1ZXdoaXRlJz0+JyNmYWViZDcnLAoJCQknYXF1YSc9PicjMDBmZmZmJywKCQkJJ2FxdWFtYXJpbmUnPT4nIzdmZmZkNCcsCgkJCSdhenVyZSc9PicjZjBmZmZmJywKCQkJJ2JlaWdlJz0+JyNmNWY1ZGMnLAoJCQknYmlzcXVlJz0+JyNmZmU0YzQnLAoJCQknYmxhY2snPT4nIzAwMDAwMCcsCgkJCSdibGFuY2hlZGFsbW9uZCc9PicjZmZlYmNkJywKCQkJJ2JsdWUnPT4nIzAwMDBmZicsCgkJCSdibHVldmlvbGV0Jz0+JyM4YTJiZTInLAoJCQknYnJvd24nPT4nI2E1MmEyYScsCgkJCSdidXJseXdvb2QnPT4nI2RlYjg4NycsCgkJCSdjYWRldGJsdWUnPT4nIzVmOWVhMCcsCgkJCSdjaGFydHJldXNlJz0+JyM3ZmZmMDAnLAoJCQknY2hvY29sYXRlJz0+JyNkMjY5MWUnLAoJCQknY29yYWwnPT4nI2ZmN2Y1MCcsCgkJCSdjb3JuZmxvd2VyYmx1ZSc9PicjNjQ5NWVkJywKCQkJJ2Nvcm5zaWxrJz0+JyNmZmY4ZGMnLAoJCQknY3JpbXNvbic9PicjZGMxNDNjJywKCQkJJ2N5YW4nPT4nIzAwZmZmZicsCgkJCSdkYXJrYmx1ZSc9PicjMDAwMDhiJywKCQkJJ2RhcmtjeWFuJz0+JyMwMDhiOGInLAoJCQknZGFya2dvbGRlbnJvZCc9PicjYjg4NjBiJywKCQkJJ2RhcmtncmF5Jz0+JyNhOWE5YTknLAoJCQknZGFya2dyZXknPT4nI2E5YTlhOScsCgkJCSdkYXJrZ3JlZW4nPT4nIzAwNjQwMCcsCgkJCSdkYXJra2hha2knPT4nI2JkYjc2YicsCgkJCSdkYXJrbWFnZW50YSc9PicjOGIwMDhiJywKCQkJJ2RhcmtvbGl2ZWdyZWVuJz0+JyM1NTZiMmYnLAoJCQknZGFya29yYW5nZSc9PicjZmY4YzAwJywKCQkJJ2RhcmtvcmNoaWQnPT4nIzk5MzJjYycsCgkJCSdkYXJrcmVkJz0+JyM4YjAwMDAnLAoJCQknZGFya3NhbG1vbic9PicjZTk5NjdhJywKCQkJJ2RhcmtzZWFncmVlbic9PicjOGZiYzhmJywKCQkJJ2RhcmtzbGF0ZWJsdWUnPT4nIzQ4M2Q4YicsCgkJCSdkYXJrc2xhdGVncmF5Jz0+JyMyZjRmNGYnLAoJCQknZGFya3NsYXRlZ3JleSc9PicjMmY0ZjRmJywKCQkJJ2Rhcmt0dXJxdW9pc2UnPT4nIzAwY2VkMScsCgkJCSdkYXJrdmlvbGV0Jz0+JyM5NDAwZDMnLAoJCQknZGVlcHBpbmsnPT4nI2ZmMTQ5MycsCgkJCSdkZWVwc2t5Ymx1ZSc9PicjMDBiZmZmJywKCQkJJ2RpbWdyYXknPT4nIzY5Njk2OScsCgkJCSdkaW1ncmV5Jz0+JyM2OTY5NjknLAoJCQknZG9kZ2VyYmx1ZSc9PicjMWU5MGZmJywKCQkJJ2ZpcmVicmljayc9PicjYjIyMjIyJywKCQkJJ2Zsb3JhbHdoaXRlJz0+JyNmZmZhZjAnLAoJCQknZm9yZXN0Z3JlZW4nPT4nIzIyOGIyMicsCgkJCSdmdWNoc2lhJz0+JyNmZjAwZmYnLAoJCQknZ2FpbnNib3JvJz0+JyNkY2RjZGMnLAoJCQknZ2hvc3R3aGl0ZSc9PicjZjhmOGZmJywKCQkJJ2dvbGQnPT4nI2ZmZDcwMCcsCgkJCSdnb2xkZW5yb2QnPT4nI2RhYTUyMCcsCgkJCSdncmF5Jz0+JyM4MDgwODAnLAoJCQknZ3JleSc9PicjODA4MDgwJywKCQkJJ2dyZWVuJz0+JyMwMDgwMDAnLAoJCQknZ3JlZW55ZWxsb3cnPT4nI2FkZmYyZicsCgkJCSdob25leWRldyc9PicjZjBmZmYwJywKCQkJJ2hvdHBpbmsnPT4nI2ZmNjliNCcsCgkJCSdpbmRpYW5yZWQnPT4nI2NkNWM1YycsCgkJCSdpbmRpZ28nPT4nIzRiMDA4MicsCgkJCSdpdm9yeSc9PicjZmZmZmYwJywKCQkJJ2toYWtpJz0+JyNmMGU2OGMnLAoJCQknbGF2ZW5kZXInPT4nI2U2ZTZmYScsCgkJCSdsYXZlbmRlcmJsdXNoJz0+JyNmZmYwZjUnLAoJCQknbGF3bmdyZWVuJz0+JyM3Y2ZjMDAnLAoJCQknbGVtb25jaGlmZm9uJz0+JyNmZmZhY2QnLAoJCQknbGlnaHRibHVlJz0+JyNhZGQ4ZTYnLAoJCQknbGlnaHRjb3JhbCc9PicjZjA4MDgwJywKCQkJJ2xpZ2h0Y3lhbic9PicjZTBmZmZmJywKCQkJJ2xpZ2h0Z29sZGVucm9keWVsbG93Jz0+JyNmYWZhZDInLAoJCQknbGlnaHRncmF5Jz0+JyNkM2QzZDMnLAoJCQknbGlnaHRncmV5Jz0+JyNkM2QzZDMnLAoJCQknbGlnaHRncmVlbic9PicjOTBlZTkwJywKCQkJJ2xpZ2h0cGluayc9PicjZmZiNmMxJywKCQkJJ2xpZ2h0c2FsbW9uJz0+JyNmZmEwN2EnLAoJCQknbGlnaHRzZWFncmVlbic9PicjMjBiMmFhJywKCQkJJ2xpZ2h0c2t5Ymx1ZSc9PicjODdjZWZhJywKCQkJJ2xpZ2h0c2xhdGVncmF5Jz0+JyM3Nzg4OTknLAoJCQknbGlnaHRzbGF0ZWdyZXknPT4nIzc3ODg5OScsCgkJCSdsaWdodHN0ZWVsYmx1ZSc9PicjYjBjNGRlJywKCQkJJ2xpZ2h0eWVsbG93Jz0+JyNmZmZmZTAnLAoJCQknbGltZSc9PicjMDBmZjAwJywKCQkJJ2xpbWVncmVlbic9PicjMzJjZDMyJywKCQkJJ2xpbmVuJz0+JyNmYWYwZTYnLAoJCQknbWFnZW50YSc9PicjZmYwMGZmJywKCQkJJ21hcm9vbic9PicjODAwMDAwJywKCQkJJ21lZGl1bWFxdWFtYXJpbmUnPT4nIzY2Y2RhYScsCgkJCSdtZWRpdW1ibHVlJz0+JyMwMDAwY2QnLAoJCQknbWVkaXVtb3JjaGlkJz0+JyNiYTU1ZDMnLAoJCQknbWVkaXVtcHVycGxlJz0+JyM5MzcwZDgnLAoJCQknbWVkaXVtc2VhZ3JlZW4nPT4nIzNjYjM3MScsCgkJCSdtZWRpdW1zbGF0ZWJsdWUnPT4nIzdiNjhlZScsCgkJCSdtZWRpdW1zcHJpbmdncmVlbic9PicjMDBmYTlhJywKCQkJJ21lZGl1bXR1cnF1b2lzZSc9PicjNDhkMWNjJywKCQkJJ21lZGl1bXZpb2xldHJlZCc9PicjYzcxNTg1JywKCQkJJ21pZG5pZ2h0Ymx1ZSc9PicjMTkxOTcwJywKCQkJJ21pbnRjcmVhbSc9PicjZjVmZmZhJywKCQkJJ21pc3R5cm9zZSc9PicjZmZlNGUxJywKCQkJJ21vY2Nhc2luJz0+JyNmZmU0YjUnLAoJCQknbmF2YWpvd2hpdGUnPT4nI2ZmZGVhZCcsCgkJCSduYXZ5Jz0+JyMwMDAwODAnLAoJCQknb2xkbGFjZSc9PicjZmRmNWU2JywKCQkJJ29saXZlJz0+JyM4MDgwMDAnLAoJCQknb2xpdmVkcmFiJz0+JyM2YjhlMjMnLAoJCQknb3JhbmdlJz0+JyNmZmE1MDAnLAoJCQknb3JhbmdlcmVkJz0+JyNmZjQ1MDAnLAoJCQknb3JjaGlkJz0+JyNkYTcwZDYnLAoJCQkncGFsZWdvbGRlbnJvZCc9PicjZWVlOGFhJywKCQkJJ3BhbGVncmVlbic9PicjOThmYjk4JywKCQkJJ3BhbGV0dXJxdW9pc2UnPT4nI2FmZWVlZScsCgkJCSdwYWxldmlvbGV0cmVkJz0+JyNkODcwOTMnLAoJCQkncGFwYXlhd2hpcCc9PicjZmZlZmQ1JywKCQkJJ3BlYWNocHVmZic9PicjZmZkYWI5JywKCQkJJ3BlcnUnPT4nI2NkODUzZicsCgkJCSdwaW5rJz0+JyNmZmMwY2InLAoJCQkncGx1bSc9PicjZGRhMGRkJywKCQkJJ3Bvd2RlcmJsdWUnPT4nI2IwZTBlNicsCgkJCSdwdXJwbGUnPT4nIzgwMDA4MCcsCgkJCSdyZWQnPT4nI2ZmMDAwMCcsCgkJCSdyb3N5YnJvd24nPT4nI2JjOGY4ZicsCgkJCSdyb3lhbGJsdWUnPT4nIzQxNjllMScsCgkJCSdzYWRkbGVicm93bic9PicjOGI0NTEzJywKCQkJJ3NhbG1vbic9PicjZmE4MDcyJywKCQkJJ3NhbmR5YnJvd24nPT4nI2Y0YTQ2MCcsCgkJCSdzZWFncmVlbic9PicjMmU4YjU3JywKCQkJJ3NlYXNoZWxsJz0+JyNmZmY1ZWUnLAoJCQknc2llbm5hJz0+JyNhMDUyMmQnLAoJCQknc2lsdmVyJz0+JyNjMGMwYzAnLAoJCQknc2t5Ymx1ZSc9PicjODdjZWViJywKCQkJJ3NsYXRlYmx1ZSc9PicjNmE1YWNkJywKCQkJJ3NsYXRlZ3JheSc9PicjNzA4MDkwJywKCQkJJ3NsYXRlZ3JleSc9PicjNzA4MDkwJywKCQkJJ3Nub3cnPT4nI2ZmZmFmYScsCgkJCSdzcHJpbmdncmVlbic9PicjMDBmZjdmJywKCQkJJ3N0ZWVsYmx1ZSc9PicjNDY4MmI0JywKCQkJJ3Rhbic9PicjZDJiNDhjJywKCQkJJ3RlYWwnPT4nIzAwODA4MCcsCgkJCSd0aGlzdGxlJz0+JyNkOGJmZDgnLAoJCQkndG9tYXRvJz0+JyNmZjYzNDcnLAoJCQkndHVycXVvaXNlJz0+JyM0MGUwZDAnLAoJCQkndmlvbGV0Jz0+JyNlZTgyZWUnLAoJCQknd2hlYXQnPT4nI2Y1ZGViMycsCgkJCSd3aGl0ZSc9PicjZmZmZmZmJywKCQkJJ3doaXRlc21va2UnPT4nI2Y1ZjVmNScsCgkJCSd5ZWxsb3cnPT4nI2ZmZmYwMCcsCgkJCSd5ZWxsb3dncmVlbic9PicjOWFjZDMyJwoJCSk7CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eSgkY29sb3IpIHsKCQlyZXR1cm4gaXNzZXQoc2VsZjo6JGNvbG9yc1skY29sb3JdKTsKCX0KCgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb2xvcigkY29sb3IpIHsKCQlyZXR1cm4gc2VsZjo6JGNvbG9yc1skY29sb3JdOwoJfQoKfQogCgoKLyoqCiAqIEVudmlyb25tZW50CiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgZW52aXJvbm1lbnQKICovCmNsYXNzIExlc3NfRW52aXJvbm1lbnR7CgoJLy9wdWJsaWMgJHBhdGhzID0gYXJyYXkoKTsJCQkJLy8gb3B0aW9uIC0gdW5tb2RpZmllZCAtIHBhdGhzIHRvIHNlYXJjaCBmb3IgaW1wb3J0cyBvbgoJLy9wdWJsaWMgc3RhdGljICRmaWxlcyA9IGFycmF5KCk7CQkvLyBsaXN0IG9mIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGltcG9ydGVkLCB1c2VkIGZvciBpbXBvcnQtb25jZQoJLy9wdWJsaWMgJHJvb3RwYXRoOwkJCQkJCS8vIG9wdGlvbiAtIHJvb3RwYXRoIHRvIGFwcGVuZCB0byBVUkwncwoJLy9wdWJsaWMgc3RhdGljICRzdHJpY3RJbXBvcnRzID0gbnVsbDsJLy8gb3B0aW9uIC0KCS8vcHVibGljICRpbnNlY3VyZTsJCQkJCQkvLyBvcHRpb24gLSB3aGV0aGVyIHRvIGFsbG93IGltcG9ydHMgZnJvbSBpbnNlY3VyZSBzc2wgaG9zdHMKCS8vcHVibGljICRwcm9jZXNzSW1wb3J0czsJCQkJLy8gb3B0aW9uIC0gd2hldGhlciB0byBwcm9jZXNzIGltcG9ydHMuIGlmIGZhbHNlIHRoZW4gaW1wb3J0cyB3aWxsIG5vdCBiZSBpbXBvcnRlZAoJLy9wdWJsaWMgJGphdmFzY3JpcHRFbmFibGVkOwkJCS8vIG9wdGlvbiAtIHdoZXRoZXIgSmF2YVNjcmlwdCBpcyBlbmFibGVkLiBpZiB1bmRlZmluZWQsIGRlZmF1bHRzIHRvIHRydWUKCS8vcHVibGljICR1c2VGaWxlQ2FjaGU7CQkJCQkvLyBicm93c2VyIG9ubHkgLSB3aGV0aGVyIHRvIHVzZSB0aGUgcGVyIGZpbGUgc2Vzc2lvbiBjYWNoZQoJcHVibGljICRjdXJyZW50RmlsZUluZm87CQkJCS8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGZpbGUgLSBmb3IgZXJyb3IgcmVwb3J0aW5nIGFuZCBpbXBvcnRpbmcgYW5kIG1ha2luZyB1cmxzIHJlbGF0aXZlIGV0Yy4KCglwdWJsaWMgJGltcG9ydE11bHRpcGxlID0gZmFsc2U7IAkJLy8gd2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGltcG9ydGluZyBtdWx0aXBsZSBjb3BpZXMKCgoJLyoqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyAkZnJhbWVzID0gYXJyYXkoKTsKCgkvKioKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHVibGljICRtZWRpYUJsb2NrcyA9IGFycmF5KCk7CgoJLyoqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyAkbWVkaWFQYXRoID0gYXJyYXkoKTsKCglwdWJsaWMgc3RhdGljICRwYXJlbnNTdGFjayA9IDA7CgoJcHVibGljIHN0YXRpYyAkdGFiTGV2ZWwgPSAwOwoKCXB1YmxpYyBzdGF0aWMgJGxhc3RSdWxlID0gZmFsc2U7CgoJcHVibGljIHN0YXRpYyAkX291dHB1dE1hcDsKCglwdWJsaWMgc3RhdGljICRtaXhpbl9zdGFjayA9IDA7CgoJLyoqCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyAkZnVuY3Rpb25zID0gYXJyYXkoKTsKCgoJcHVibGljIGZ1bmN0aW9uIEluaXQoKXsKCgkJc2VsZjo6JHBhcmVuc1N0YWNrID0gMDsKCQlzZWxmOjokdGFiTGV2ZWwgPSAwOwoJCXNlbGY6OiRsYXN0UnVsZSA9IGZhbHNlOwoJCXNlbGY6OiRtaXhpbl9zdGFjayA9IDA7CgoJCWlmKCBMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ2NvbXByZXNzJ10gKXsKCgkJCUxlc3NfRW52aXJvbm1lbnQ6OiRfb3V0cHV0TWFwID0gYXJyYXkoCgkJCQknLCcJPT4gJywnLAoJCQkJJzogJyA9PiAnOicsCgkJCQknJyAgPT4gJycsCgkJCQknICcgPT4gJyAnLAoJCQkJJzonID0+ICcgOicsCgkJCQknKycgPT4gJysnLAoJCQkJJ34nID0+ICd+JywKCQkJCSc+JyA9PiAnPicsCgkJCQknfCcgPT4gJ3wnLAoJCSAgICAgICAgJ14nID0+ICdeJywKCQkgICAgICAgICdeXicgPT4gJ15eJwoJCQkpOwoKCQl9ZWxzZXsKCgkJCUxlc3NfRW52aXJvbm1lbnQ6OiRfb3V0cHV0TWFwID0gYXJyYXkoCgkJCQknLCcJPT4gJywgJywKCQkJCSc6ICcgPT4gJzogJywKCQkJCScnICA9PiAnJywKCQkJCScgJyA9PiAnICcsCgkJCQknOicgPT4gJyA6JywKCQkJCScrJyA9PiAnICsgJywKCQkJCSd+JyA9PiAnIH4gJywKCQkJCSc+JyA9PiAnID4gJywKCQkJCSd8JyA9PiAnfCcsCgkJICAgICAgICAnXicgPT4gJyBeICcsCgkJICAgICAgICAnXl4nID0+ICcgXl4gJwoJCQkpOwoKCQl9Cgl9CgoKCXB1YmxpYyBmdW5jdGlvbiBjb3B5RXZhbEVudigkZnJhbWVzID0gYXJyYXkoKSApewoJCSRuZXdfZW52ID0gbmV3IExlc3NfRW52aXJvbm1lbnQoKTsKCQkkbmV3X2Vudi0+ZnJhbWVzID0gJGZyYW1lczsKCQlyZXR1cm4gJG5ld19lbnY7Cgl9CgoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNNYXRoT24oKXsKCQlyZXR1cm4gIUxlc3NfUGFyc2VyOjokb3B0aW9uc1snc3RyaWN0TWF0aCddIHx8IExlc3NfRW52aXJvbm1lbnQ6OiRwYXJlbnNTdGFjazsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzUGF0aFJlbGF0aXZlKCRwYXRoKXsKCQlyZXR1cm4gIXByZWdfbWF0Y2goJy9eKD86W2Etei1dKzp8XC8pLycsJHBhdGgpOwoJfQoKCgkvKioKCSAqIENhbm9uaWNhbGl6ZSBhIHBhdGggYnkgcmVzb2x2aW5nIHJlZmVyZW5jZXMgdG8gJy8uLycsICcvLi4vJwoJICogRG9lcyBub3QgcmVtb3ZlIGxlYWRpbmcgIi4uLyIKCSAqIEBwYXJhbSBzdHJpbmcgcGF0aCBvciB1cmwKCSAqIEByZXR1cm4gc3RyaW5nIENhbm9uaWNhbGl6ZWQgcGF0aAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVQYXRoKCRwYXRoKXsKCgkJJHNlZ21lbnRzID0gZXhwbG9kZSgnLycsJHBhdGgpOwoJCSRzZWdtZW50cyA9IGFycmF5X3JldmVyc2UoJHNlZ21lbnRzKTsKCgkJJHBhdGggPSBhcnJheSgpOwoJCSRwYXRoX2xlbiA9IDA7CgoJCXdoaWxlKCAkc2VnbWVudHMgKXsKCQkJJHNlZ21lbnQgPSBhcnJheV9wb3AoJHNlZ21lbnRzKTsKCQkJc3dpdGNoKCAkc2VnbWVudCApIHsKCgkJCQljYXNlICcuJzoKCQkJCWJyZWFrOwoKCQkJCWNhc2UgJy4uJzoKCQkJCQlpZiggISRwYXRoX2xlbiB8fCAoICRwYXRoWyRwYXRoX2xlbi0xXSA9PT0gJy4uJykgKXsKCQkJCQkJJHBhdGhbXSA9ICRzZWdtZW50OwoJCQkJCQkkcGF0aF9sZW4rKzsKCQkJCQl9ZWxzZXsKCQkJCQkJYXJyYXlfcG9wKCRwYXRoKTsKCQkJCQkJJHBhdGhfbGVuLS07CgkJCQkJfQoJCQkJYnJlYWs7CgoJCQkJZGVmYXVsdDoKCQkJCQkkcGF0aFtdID0gJHNlZ21lbnQ7CgkJCQkJJHBhdGhfbGVuKys7CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJcmV0dXJuIGltcGxvZGUoJy8nLCRwYXRoKTsKCX0KCgoJcHVibGljIGZ1bmN0aW9uIHVuc2hpZnRGcmFtZSgkZnJhbWUpewoJCWFycmF5X3Vuc2hpZnQoJHRoaXMtPmZyYW1lcywgJGZyYW1lKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc2hpZnRGcmFtZSgpewoJCXJldHVybiBhcnJheV9zaGlmdCgkdGhpcy0+ZnJhbWVzKTsKCX0KCn0KIAoKLyoqCiAqIEJ1aWx0aW4gZnVuY3Rpb25zCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgZnVuY3Rpb24KICogQHNlZSBodHRwOi8vbGVzc2Nzcy5vcmcvZnVuY3Rpb25zLwogKi8KY2xhc3MgTGVzc19GdW5jdGlvbnN7CgoJcHVibGljICRlbnY7CglwdWJsaWMgJGN1cnJlbnRGaWxlSW5mbzsKCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZW52LCAkY3VycmVudEZpbGVJbmZvID0gbnVsbCApewoJCSR0aGlzLT5lbnYgPSAkZW52OwoJCSR0aGlzLT5jdXJyZW50RmlsZUluZm8gPSAkY3VycmVudEZpbGVJbmZvOwoJfQoKCS8qKgoJICogQHBhcmFtIHN0cmluZyAkb3AKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvcGVyYXRlKCAkb3AsICRhLCAkYiApewoJCXN3aXRjaCAoJG9wKSB7CgkJCWNhc2UgJysnOiByZXR1cm4gJGEgKyAkYjsKCQkJY2FzZSAnLSc6IHJldHVybiAkYSAtICRiOwoJCQljYXNlICcqJzogcmV0dXJuICRhICogJGI7CgkJCWNhc2UgJy8nOiByZXR1cm4gJGEgLyAkYjsKCQl9Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjbGFtcCgkdmFsLCAkbWF4ID0gMSl7CgkJcmV0dXJuIG1pbiggbWF4KCR2YWwsIDApLCAkbWF4KTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb3VuZCggJHZhbHVlICl7CgoJCWlmKCAkdmFsdWUgPT09IDAgKXsKCQkJcmV0dXJuICR2YWx1ZTsKCQl9CgoJCWlmKCBMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ251bVByZWNpc2lvbiddICl7CgkJCSRwID0gcG93KDEwLCBMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ251bVByZWNpc2lvbiddKTsKCQkJcmV0dXJuIHJvdW5kKCAkdmFsdWUgKiAkcCkgLyAkcDsKCQl9CgkJcmV0dXJuICR2YWx1ZTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG51bWJlcigkbil7CgoJCWlmICgkbiBpbnN0YW5jZW9mIExlc3NfVHJlZV9EaW1lbnNpb24pIHsKCQkJcmV0dXJuIGZsb2F0dmFsKCAkbi0+dW5pdC0+aXMoJyUnKSA/ICRuLT52YWx1ZSAvIDEwMCA6ICRuLT52YWx1ZSk7CgkJfSBlbHNlIGlmIChpc19udW1lcmljKCRuKSkgewoJCQlyZXR1cm4gJG47CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCJjb2xvciBmdW5jdGlvbnMgdGFrZSBudW1iZXJzIGFzIHBhcmFtZXRlcnMiKTsKCQl9Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzY2FsZWQoJG4sICRzaXplID0gMjU1ICl7CgkJaWYoICRuIGluc3RhbmNlb2YgTGVzc19UcmVlX0RpbWVuc2lvbiAmJiAkbi0+dW5pdC0+aXMoJyUnKSApewoJCQlyZXR1cm4gKGZsb2F0KSRuLT52YWx1ZSAqICRzaXplIC8gMTAwOwoJCX0gZWxzZSB7CgkJCXJldHVybiBMZXNzX0Z1bmN0aW9uczo6bnVtYmVyKCRuKTsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHJnYiAoJHIgPSBudWxsLCAkZyA9IG51bGwsICRiID0gbnVsbCl7CgkJaWYgKGlzX251bGwoJHIpIHx8IGlzX251bGwoJGcpIHx8IGlzX251bGwoJGIpKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcigicmdiIGV4cGVjdHMgdGhyZWUgcGFyYW1ldGVycyIpOwoJCX0KCQlyZXR1cm4gJHRoaXMtPnJnYmEoJHIsICRnLCAkYiwgMS4wKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gcmdiYSgkciA9IG51bGwsICRnID0gbnVsbCwgJGIgPSBudWxsLCAkYSA9IG51bGwpewoJCSRyZ2IgPSBhcnJheSgkciwgJGcsICRiKTsKCQkkcmdiID0gYXJyYXlfbWFwKGFycmF5KCdMZXNzX0Z1bmN0aW9ucycsJ3NjYWxlZCcpLCRyZ2IpOwoKCQkkYSA9IHNlbGY6Om51bWJlcigkYSk7CgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfQ29sb3IoJHJnYiwgJGEpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBoc2woJGgsICRzLCAkbCl7CgkJcmV0dXJuICR0aGlzLT5oc2xhKCRoLCAkcywgJGwsIDEuMCk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGhzbGEoJGgsICRzLCAkbCwgJGEpewoKCQkkaCA9IGZtb2Qoc2VsZjo6bnVtYmVyKCRoKSwgMzYwKSAvIDM2MDsgLy8gQ2xhc3NpYyAlIG9wZXJhdG9yIHdpbGwgY2hhbmdlIGZsb2F0IHRvIGludAoJCSRzID0gc2VsZjo6Y2xhbXAoc2VsZjo6bnVtYmVyKCRzKSk7CgkJJGwgPSBzZWxmOjpjbGFtcChzZWxmOjpudW1iZXIoJGwpKTsKCQkkYSA9IHNlbGY6OmNsYW1wKHNlbGY6Om51bWJlcigkYSkpOwoKCQkkbTIgPSAkbCA8PSAwLjUgPyAkbCAqICgkcyArIDEpIDogJGwgKyAkcyAtICRsICogJHM7CgoJCSRtMSA9ICRsICogMiAtICRtMjsKCgkJcmV0dXJuICR0aGlzLT5yZ2JhKCBzZWxmOjpoc2xhX2h1ZSgkaCArIDEvMywgJG0xLCAkbTIpICogMjU1LAoJCQkJCQkJc2VsZjo6aHNsYV9odWUoJGgsICRtMSwgJG0yKSAqIDI1NSwKCQkJCQkJCXNlbGY6OmhzbGFfaHVlKCRoIC0gMS8zLCAkbTEsICRtMikgKiAyNTUsCgkJCQkJCQkkYSk7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gZG91YmxlICRoCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBoc2xhX2h1ZSgkaCwgJG0xLCAkbTIpewoJCSRoID0gJGggPCAwID8gJGggKyAxIDogKCRoID4gMSA/ICRoIC0gMSA6ICRoKTsKCQlpZgkgICgkaCAqIDYgPCAxKSByZXR1cm4gJG0xICsgKCRtMiAtICRtMSkgKiAkaCAqIDY7CgkJZWxzZSBpZiAoJGggKiAyIDwgMSkgcmV0dXJuICRtMjsKCQllbHNlIGlmICgkaCAqIDMgPCAyKSByZXR1cm4gJG0xICsgKCRtMiAtICRtMSkgKiAoMi8zIC0gJGgpICogNjsKCQllbHNlCQkJCSByZXR1cm4gJG0xOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBoc3YoJGgsICRzLCAkdikgewoJCXJldHVybiAkdGhpcy0+aHN2YSgkaCwgJHMsICR2LCAxLjApOwoJfQoKCS8qKgoJICogQHBhcmFtIGRvdWJsZSAkYQoJICovCglwdWJsaWMgZnVuY3Rpb24gaHN2YSgkaCwgJHMsICR2LCAkYSkgewoJCSRoID0gKChMZXNzX0Z1bmN0aW9uczo6bnVtYmVyKCRoKSAlIDM2MCkgLyAzNjAgKSAqIDM2MDsKCQkkcyA9IExlc3NfRnVuY3Rpb25zOjpudW1iZXIoJHMpOwoJCSR2ID0gTGVzc19GdW5jdGlvbnM6Om51bWJlcigkdik7CgkJJGEgPSBMZXNzX0Z1bmN0aW9uczo6bnVtYmVyKCRhKTsKCgkJJGkgPSBmbG9vcigoJGggLyA2MCkgJSA2KTsKCQkkZiA9ICgkaCAvIDYwKSAtICRpOwoKCQkkdnMgPSBhcnJheSggJHYsCgkJCQkgICR2ICogKDEgLSAkcyksCgkJCQkgICR2ICogKDEgLSAkZiAqICRzKSwKCQkJCSAgJHYgKiAoMSAtICgxIC0gJGYpICogJHMpKTsKCgkJJHBlcm0gPSBhcnJheShhcnJheSgwLCAzLCAxKSwKCQkJCQlhcnJheSgyLCAwLCAxKSwKCQkJCQlhcnJheSgxLCAwLCAzKSwKCQkJCQlhcnJheSgxLCAyLCAwKSwKCQkJCQlhcnJheSgzLCAxLCAwKSwKCQkJCQlhcnJheSgwLCAxLCAyKSk7CgoJCXJldHVybiAkdGhpcy0+cmdiYSgkdnNbJHBlcm1bJGldWzBdXSAqIDI1NSwKCQkJCQkJICR2c1skcGVybVskaV1bMV1dICogMjU1LAoJCQkJCQkgJHZzWyRwZXJtWyRpXVsyXV0gKiAyNTUsCgkJCQkJCSAkYSk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGh1ZSgkY29sb3IgPSBudWxsKXsKCQlpZiAoISRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBmaXJzdCBhcmd1bWVudCB0byBodWUgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCgkJJGMgPSAkY29sb3ItPnRvSFNMKCk7CgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKExlc3NfUGFyc2VyOjpyb3VuZCgkY1snaCddKSk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHNhdHVyYXRpb24oJGNvbG9yID0gbnVsbCl7CgkJaWYgKCEkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gc2F0dXJhdGlvbiBtdXN0IGJlIGEgY29sb3InIC4gKCRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoKCQkkYyA9ICRjb2xvci0+dG9IU0woKTsKCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9EaW1lbnNpb24oTGVzc19QYXJzZXI6OnJvdW5kKCRjWydzJ10gKiAxMDApLCAnJScpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBsaWdodG5lc3MoJGNvbG9yID0gbnVsbCl7CgkJaWYgKCEkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gbGlnaHRuZXNzIG11c3QgYmUgYSBjb2xvcicgLiAoJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgoJCSRjID0gJGNvbG9yLT50b0hTTCgpOwoJCXJldHVybiBuZXcgTGVzc19UcmVlX0RpbWVuc2lvbihMZXNzX1BhcnNlcjo6cm91bmQoJGNbJ2wnXSAqIDEwMCksICclJyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGhzdmh1ZSggJGNvbG9yID0gbnVsbCApewoJCWlmICghJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0NvbG9yKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIGZpcnN0IGFyZ3VtZW50IHRvIGhzdmh1ZSBtdXN0IGJlIGEgY29sb3InIC4gKCRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoKCQkkaHN2ID0gJGNvbG9yLT50b0hTVigpOwoJCXJldHVybiBuZXcgTGVzc19UcmVlX0RpbWVuc2lvbiggTGVzc19QYXJzZXI6OnJvdW5kKCRoc3ZbJ2gnXSkgKTsKCX0KCgoJcHVibGljIGZ1bmN0aW9uIGhzdnNhdHVyYXRpb24oICRjb2xvciA9IG51bGwgKXsKCQlpZiAoISRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBmaXJzdCBhcmd1bWVudCB0byBoc3ZzYXR1cmF0aW9uIG11c3QgYmUgYSBjb2xvcicgLiAoJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgoJCSRoc3YgPSAkY29sb3ItPnRvSFNWKCk7CgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKCBMZXNzX1BhcnNlcjo6cm91bmQoJGhzdlsncyddICogMTAwKSwgJyUnICk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGhzdnZhbHVlKCAkY29sb3IgPSBudWxsICl7CgkJaWYgKCEkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gaHN2dmFsdWUgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCgkJJGhzdiA9ICRjb2xvci0+dG9IU1YoKTsKCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9EaW1lbnNpb24oIExlc3NfUGFyc2VyOjpyb3VuZCgkaHN2Wyd2J10gKiAxMDApLCAnJScgKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gcmVkKCRjb2xvciA9IG51bGwpIHsKCQlpZiAoISRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBmaXJzdCBhcmd1bWVudCB0byByZWQgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKCAkY29sb3ItPnJnYlswXSApOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBncmVlbigkY29sb3IgPSBudWxsKSB7CgkJaWYgKCEkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gZ3JlZW4gbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKCAkY29sb3ItPnJnYlsxXSApOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBibHVlKCRjb2xvciA9IG51bGwpIHsKCQlpZiAoISRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBmaXJzdCBhcmd1bWVudCB0byBibHVlIG11c3QgYmUgYSBjb2xvcicgLiAoJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgoJCXJldHVybiBuZXcgTGVzc19UcmVlX0RpbWVuc2lvbiggJGNvbG9yLT5yZ2JbMl0gKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gYWxwaGEoJGNvbG9yID0gbnVsbCl7CgkJaWYgKCEkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gYWxwaGEgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCgkJJGMgPSAkY29sb3ItPnRvSFNMKCk7CgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKCRjWydhJ10pOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBsdW1hICgkY29sb3IgPSBudWxsKSB7CgkJaWYgKCEkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gbHVtYSBtdXN0IGJlIGEgY29sb3InIC4gKCRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoKCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9EaW1lbnNpb24oTGVzc19QYXJzZXI6OnJvdW5kKCAkY29sb3ItPmx1bWEoKSAqICRjb2xvci0+YWxwaGEgKiAxMDApLCAnJScpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBsdW1pbmFuY2UoICRjb2xvciA9IG51bGwgKXsKCQlpZiAoISRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBmaXJzdCBhcmd1bWVudCB0byBsdW1pbmFuY2UgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCgkJJGx1bWluYW5jZSA9CgkJCSgwLjIxMjYgKiAkY29sb3ItPnJnYlswXSAvIDI1NSkKCQkgICsgKDAuNzE1MiAqICRjb2xvci0+cmdiWzFdIC8gMjU1KQoJCSAgKyAoMC4wNzIyICogJGNvbG9yLT5yZ2JbMl0gLyAyNTUpOwoKCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9EaW1lbnNpb24oTGVzc19QYXJzZXI6OnJvdW5kKCAkbHVtaW5hbmNlICogJGNvbG9yLT5hbHBoYSAqIDEwMCksICclJyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHNhdHVyYXRlKCRjb2xvciA9IG51bGwsICRhbW91bnQgPSBudWxsKXsKCQkvLyBmaWx0ZXI6IHNhdHVyYXRlKDMuMik7CgkJLy8gc2hvdWxkIGJlIGtlcHQgYXMgaXMsIHNvIGNoZWNrIGZvciBjb2xvcgoJCWlmICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRGltZW5zaW9uKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJaWYgKCEkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gc2F0dXJhdGUgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCQlpZiAoISRhbW91bnQgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRGltZW5zaW9uKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIHNlY29uZCBhcmd1bWVudCB0byBzYXR1cmF0ZSBtdXN0IGJlIGEgcGVyY2VudGFnZScgLiAoJGFtb3VudCBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoKCQkkaHNsID0gJGNvbG9yLT50b0hTTCgpOwoKCQkkaHNsWydzJ10gKz0gJGFtb3VudC0+dmFsdWUgLyAxMDA7CgkJJGhzbFsncyddID0gc2VsZjo6Y2xhbXAoJGhzbFsncyddKTsKCgkJcmV0dXJuICR0aGlzLT5oc2xhKCRoc2xbJ2gnXSwgJGhzbFsncyddLCAkaHNsWydsJ10sICRoc2xbJ2EnXSk7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gTGVzc19UcmVlX0RpbWVuc2lvbiAkYW1vdW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkZXNhdHVyYXRlKCRjb2xvciA9IG51bGwsICRhbW91bnQgPSBudWxsKXsKCQlpZiAoISRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBmaXJzdCBhcmd1bWVudCB0byBkZXNhdHVyYXRlIG11c3QgYmUgYSBjb2xvcicgLiAoJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgkJaWYgKCEkYW1vdW50IGluc3RhbmNlb2YgTGVzc19UcmVlX0RpbWVuc2lvbikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBzZWNvbmQgYXJndW1lbnQgdG8gZGVzYXR1cmF0ZSBtdXN0IGJlIGEgcGVyY2VudGFnZScgLiAoJGFtb3VudCBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoKCQkkaHNsID0gJGNvbG9yLT50b0hTTCgpOwoKCQkkaHNsWydzJ10gLT0gJGFtb3VudC0+dmFsdWUgLyAxMDA7CgkJJGhzbFsncyddID0gc2VsZjo6Y2xhbXAoJGhzbFsncyddKTsKCgkJcmV0dXJuICR0aGlzLT5oc2xhKCRoc2xbJ2gnXSwgJGhzbFsncyddLCAkaHNsWydsJ10sICRoc2xbJ2EnXSk7Cgl9CgoKCglwdWJsaWMgZnVuY3Rpb24gbGlnaHRlbigkY29sb3IgPSBudWxsLCAkYW1vdW50PW51bGwpewoJCWlmICghJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0NvbG9yKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIGZpcnN0IGFyZ3VtZW50IHRvIGxpZ2h0ZW4gbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCQlpZiAoISRhbW91bnQgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRGltZW5zaW9uKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIHNlY29uZCBhcmd1bWVudCB0byBsaWdodGVuIG11c3QgYmUgYSBwZXJjZW50YWdlJyAuICgkYW1vdW50IGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgoJCSRoc2wgPSAkY29sb3ItPnRvSFNMKCk7CgoJCSRoc2xbJ2wnXSArPSAkYW1vdW50LT52YWx1ZSAvIDEwMDsKCQkkaHNsWydsJ10gPSBzZWxmOjpjbGFtcCgkaHNsWydsJ10pOwoKCQlyZXR1cm4gJHRoaXMtPmhzbGEoJGhzbFsnaCddLCAkaHNsWydzJ10sICRoc2xbJ2wnXSwgJGhzbFsnYSddKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZGFya2VuKCRjb2xvciA9IG51bGwsICRhbW91bnQgPSBudWxsKXsKCQlpZiAoISRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBmaXJzdCBhcmd1bWVudCB0byBkYXJrZW4gbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCQlpZiAoISRhbW91bnQgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRGltZW5zaW9uKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIHNlY29uZCBhcmd1bWVudCB0byBkYXJrZW4gbXVzdCBiZSBhIHBlcmNlbnRhZ2UnIC4gKCRhbW91bnQgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCgkJJGhzbCA9ICRjb2xvci0+dG9IU0woKTsKCQkkaHNsWydsJ10gLT0gJGFtb3VudC0+dmFsdWUgLyAxMDA7CgkJJGhzbFsnbCddID0gc2VsZjo6Y2xhbXAoJGhzbFsnbCddKTsKCgkJcmV0dXJuICR0aGlzLT5oc2xhKCRoc2xbJ2gnXSwgJGhzbFsncyddLCAkaHNsWydsJ10sICRoc2xbJ2EnXSk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGZhZGVpbigkY29sb3IgPSBudWxsLCAkYW1vdW50ID0gbnVsbCl7CgkJaWYgKCEkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gZmFkZWluIG11c3QgYmUgYSBjb2xvcicgLiAoJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgkJaWYgKCEkYW1vdW50IGluc3RhbmNlb2YgTGVzc19UcmVlX0RpbWVuc2lvbikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBzZWNvbmQgYXJndW1lbnQgdG8gZmFkZWluIG11c3QgYmUgYSBwZXJjZW50YWdlJyAuICgkYW1vdW50IGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgoJCSRoc2wgPSAkY29sb3ItPnRvSFNMKCk7CgkJJGhzbFsnYSddICs9ICRhbW91bnQtPnZhbHVlIC8gMTAwOwoJCSRoc2xbJ2EnXSA9IHNlbGY6OmNsYW1wKCRoc2xbJ2EnXSk7CgkJcmV0dXJuICR0aGlzLT5oc2xhKCRoc2xbJ2gnXSwgJGhzbFsncyddLCAkaHNsWydsJ10sICRoc2xbJ2EnXSk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGZhZGVvdXQoJGNvbG9yID0gbnVsbCwgJGFtb3VudCA9IG51bGwpewoJCWlmICghJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0NvbG9yKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIGZpcnN0IGFyZ3VtZW50IHRvIGZhZGVvdXQgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCQlpZiAoISRhbW91bnQgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRGltZW5zaW9uKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIHNlY29uZCBhcmd1bWVudCB0byBmYWRlb3V0IG11c3QgYmUgYSBwZXJjZW50YWdlJyAuICgkYW1vdW50IGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgoJCSRoc2wgPSAkY29sb3ItPnRvSFNMKCk7CgkJJGhzbFsnYSddIC09ICRhbW91bnQtPnZhbHVlIC8gMTAwOwoJCSRoc2xbJ2EnXSA9IHNlbGY6OmNsYW1wKCRoc2xbJ2EnXSk7CgkJcmV0dXJuICR0aGlzLT5oc2xhKCRoc2xbJ2gnXSwgJGhzbFsncyddLCAkaHNsWydsJ10sICRoc2xbJ2EnXSk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGZhZGUoJGNvbG9yID0gbnVsbCwgJGFtb3VudCA9IG51bGwpewoJCWlmICghJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0NvbG9yKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIGZpcnN0IGFyZ3VtZW50IHRvIGZhZGUgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCQlpZiAoISRhbW91bnQgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRGltZW5zaW9uKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIHNlY29uZCBhcmd1bWVudCB0byBmYWRlIG11c3QgYmUgYSBwZXJjZW50YWdlJyAuICgkYW1vdW50IGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgoJCSRoc2wgPSAkY29sb3ItPnRvSFNMKCk7CgoJCSRoc2xbJ2EnXSA9ICRhbW91bnQtPnZhbHVlIC8gMTAwOwoJCSRoc2xbJ2EnXSA9IHNlbGY6OmNsYW1wKCRoc2xbJ2EnXSk7CgkJcmV0dXJuICR0aGlzLT5oc2xhKCRoc2xbJ2gnXSwgJGhzbFsncyddLCAkaHNsWydsJ10sICRoc2xbJ2EnXSk7Cgl9CgoKCglwdWJsaWMgZnVuY3Rpb24gc3BpbigkY29sb3IgPSBudWxsLCAkYW1vdW50ID0gbnVsbCl7CgkJaWYgKCEkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gc3BpbiBtdXN0IGJlIGEgY29sb3InIC4gKCRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoJCWlmICghJGFtb3VudCBpbnN0YW5jZW9mIExlc3NfVHJlZV9EaW1lbnNpb24pIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHNwaW4gbXVzdCBiZSBhIG51bWJlcicgLiAoJGFtb3VudCBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoKCQkkaHNsID0gJGNvbG9yLT50b0hTTCgpOwoJCSRodWUgPSBmbW9kKCRoc2xbJ2gnXSArICRhbW91bnQtPnZhbHVlLCAzNjApOwoKCQkkaHNsWydoJ10gPSAkaHVlIDwgMCA/IDM2MCArICRodWUgOiAkaHVlOwoKCQlyZXR1cm4gJHRoaXMtPmhzbGEoJGhzbFsnaCddLCAkaHNsWydzJ10sICRoc2xbJ2wnXSwgJGhzbFsnYSddKTsKCX0KCgkvLwoJLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDkgSGFtcHRvbiBDYXRsaW4sIE5hdGhhbiBXZWl6ZW5iYXVtLCBhbmQgQ2hyaXMgRXBwc3RlaW4KCS8vIGh0dHA6Ly9zYXNzLWxhbmcuY29tCgkvLwoKCS8qKgoJICogQHBhcmFtIExlc3NfVHJlZV9Db2xvciAkY29sb3IxCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBtaXgoJGNvbG9yMSA9IG51bGwsICRjb2xvcjIgPSBudWxsLCAkd2VpZ2h0ID0gbnVsbCl7CgkJaWYgKCEkY29sb3IxIGluc3RhbmNlb2YgTGVzc19UcmVlX0NvbG9yKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIGZpcnN0IGFyZ3VtZW50IHRvIG1peCBtdXN0IGJlIGEgY29sb3InIC4gKCRjb2xvcjEgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCQlpZiAoISRjb2xvcjIgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIG1peCBtdXN0IGJlIGEgY29sb3InIC4gKCRjb2xvcjIgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCQlpZiAoISR3ZWlnaHQpIHsKCQkJJHdlaWdodCA9IG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKCc1MCcsICclJyk7CgkJfQoJCWlmICghJHdlaWdodCBpbnN0YW5jZW9mIExlc3NfVHJlZV9EaW1lbnNpb24pIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgdGhpcmQgYXJndW1lbnQgdG8gY29udHJhc3QgbXVzdCBiZSBhIHBlcmNlbnRhZ2UnIC4gKCR3ZWlnaHQgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCgkJJHAgPSAkd2VpZ2h0LT52YWx1ZSAvIDEwMC4wOwoJCSR3ID0gJHAgKiAyIC0gMTsKCQkkaHNsMSA9ICRjb2xvcjEtPnRvSFNMKCk7CgkJJGhzbDIgPSAkY29sb3IyLT50b0hTTCgpOwoJCSRhID0gJGhzbDFbJ2EnXSAtICRoc2wyWydhJ107CgoJCSR3MSA9ICgoKCgkdyAqICRhKSA9PSAtMSkgPyAkdyA6ICgkdyArICRhKSAvICgxICsgJHcgKiAkYSkpICsgMSkgLyAyOwoJCSR3MiA9IDEgLSAkdzE7CgoJCSRyZ2IgPSBhcnJheSgkY29sb3IxLT5yZ2JbMF0gKiAkdzEgKyAkY29sb3IyLT5yZ2JbMF0gKiAkdzIsCgkJCQkJICRjb2xvcjEtPnJnYlsxXSAqICR3MSArICRjb2xvcjItPnJnYlsxXSAqICR3MiwKCQkJCQkgJGNvbG9yMS0+cmdiWzJdICogJHcxICsgJGNvbG9yMi0+cmdiWzJdICogJHcyKTsKCgkJJGFscGhhID0gJGNvbG9yMS0+YWxwaGEgKiAkcCArICRjb2xvcjItPmFscGhhICogKDEgLSAkcCk7CgoJCXJldHVybiBuZXcgTGVzc19UcmVlX0NvbG9yKCRyZ2IsICRhbHBoYSk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdyZXlzY2FsZSgkY29sb3IpewoJCXJldHVybiAkdGhpcy0+ZGVzYXR1cmF0ZSgkY29sb3IsIG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKDEwMCwnJScpKTsKCX0KCgoJcHVibGljIGZ1bmN0aW9uIGNvbnRyYXN0KCAkY29sb3IsICRkYXJrID0gbnVsbCwgJGxpZ2h0ID0gbnVsbCwgJHRocmVzaG9sZCA9IG51bGwpewoJCS8vIGZpbHRlcjogY29udHJhc3QoMy4yKTsKCQkvLyBzaG91bGQgYmUga2VwdCBhcyBpcywgc28gY2hlY2sgZm9yIGNvbG9yCgkJaWYgKCEkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCWlmKCAhJGxpZ2h0ICl7CgkJCSRsaWdodCA9ICR0aGlzLT5yZ2JhKDI1NSwgMjU1LCAyNTUsIDEuMCk7CgkJfQoJCWlmKCAhJGRhcmsgKXsKCQkJJGRhcmsgPSAkdGhpcy0+cmdiYSgwLCAwLCAwLCAxLjApOwoJCX0KCgkJaWYgKCEkZGFyayBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBzZWNvbmQgYXJndW1lbnQgdG8gY29udHJhc3QgbXVzdCBiZSBhIGNvbG9yJyAuICgkZGFyayBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoJCWlmICghJGxpZ2h0IGluc3RhbmNlb2YgTGVzc19UcmVlX0NvbG9yKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIHRoaXJkIGFyZ3VtZW50IHRvIGNvbnRyYXN0IG11c3QgYmUgYSBjb2xvcicgLiAoJGxpZ2h0IGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgoJCS8vRmlndXJlIG91dCB3aGljaCBpcyBhY3R1YWxseSBsaWdodCBhbmQgZGFyayEKCQlpZiggJGRhcmstPmx1bWEoKSA+ICRsaWdodC0+bHVtYSgpICl7CgkJCSR0ID0gJGxpZ2h0OwoJCQkkbGlnaHQgPSAkZGFyazsKCQkJJGRhcmsgPSAkdDsKCQl9CgkJaWYoICEkdGhyZXNob2xkICl7CgkJCSR0aHJlc2hvbGQgPSAwLjQzOwoJCX0gZWxzZSB7CgkJCSR0aHJlc2hvbGQgPSBMZXNzX0Z1bmN0aW9uczo6bnVtYmVyKCR0aHJlc2hvbGQpOwoJCX0KCgkJaWYoICRjb2xvci0+bHVtYSgpIDwgJHRocmVzaG9sZCApewoJCQlyZXR1cm4gJGxpZ2h0OwoJCX0gZWxzZSB7CgkJCXJldHVybiAkZGFyazsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGUgKCRzdHIpewoJCWlmKCBpc19zdHJpbmcoJHN0cikgKXsKCQkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfQW5vbnltb3VzKCRzdHIpOwoJCX0KCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9Bbm9ueW1vdXMoJHN0ciBpbnN0YW5jZW9mIExlc3NfVHJlZV9KYXZhU2NyaXB0ID8gJHN0ci0+ZXhwcmVzc2lvbiA6ICRzdHItPnZhbHVlKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZXNjYXBlICgkc3RyKXsKCgkJJHJldmVydCA9IGFycmF5KCclMjEnPT4nIScsICclMkEnPT4nKicsICclMjcnPT4iJyIsJyUzRic9Pic/JywnJTI2Jz0+JyYnLCclMkMnPT4nLCcsJyUyRic9PicvJywnJTQwJz0+J0AnLCclMkInPT4nKycsJyUyNCc9PickJyk7CgoJCXJldHVybiBuZXcgTGVzc19UcmVlX0Fub255bW91cyhzdHJ0cihyYXd1cmxlbmNvZGUoJHN0ci0+dmFsdWUpLCAkcmV2ZXJ0KSk7Cgl9CgoKCS8qKgoJICogdG9kbzogVGhpcyBmdW5jdGlvbiB3aWxsIG5lZWQgc29tZSBhZGRpdGlvbmFsIHdvcmsgdG8gbWFrZSBpdCB3b3JrIHRoZSBzYW1lIGFzIGxlc3MuanMKCSAqCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZXBsYWNlKCAkc3RyaW5nLCAkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkZmxhZ3MgPSBudWxsICl7CgkJJHJlc3VsdCA9ICRzdHJpbmctPnZhbHVlOwoKCQkkZXhwciA9ICcvJy5zdHJfcmVwbGFjZSgnLycsJ1xcLycsJHBhdHRlcm4tPnZhbHVlKS4nLyc7CgkJaWYoICRmbGFncyAmJiAkZmxhZ3MtPnZhbHVlKXsKCQkJJGV4cHIgLj0gc2VsZjo6cmVwbGFjZV9mbGFncygkZmxhZ3MtPnZhbHVlKTsKCQl9CgoJCSRyZXN1bHQgPSBwcmVnX3JlcGxhY2UoJGV4cHIsJHJlcGxhY2VtZW50LT52YWx1ZSwkcmVzdWx0KTsKCgoJCWlmKCBwcm9wZXJ0eV9leGlzdHMoJHN0cmluZywncXVvdGUnKSApewoJCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9RdW90ZWQoICRzdHJpbmctPnF1b3RlLCAkcmVzdWx0LCAkc3RyaW5nLT5lc2NhcGVkKTsKCQl9CgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfUXVvdGVkKCAnJywgJHJlc3VsdCApOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZV9mbGFncygkZmxhZ3MpewoJCSRmbGFncyA9IHN0cl9zcGxpdCgkZmxhZ3MsMSk7CgkJJG5ld19mbGFncyA9ICcnOwoKCQlmb3JlYWNoKCRmbGFncyBhcyAkZmxhZyl7CgkJCXN3aXRjaCgkZmxhZyl7CgkJCQljYXNlICdlJzoKCQkJCWNhc2UgJ2cnOgoJCQkJYnJlYWs7CgoJCQkJZGVmYXVsdDoKCQkJCSRuZXdfZmxhZ3MgLj0gJGZsYWc7CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJcmV0dXJuICRuZXdfZmxhZ3M7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIF9wZXJjZW50KCl7CgkJJHN0cmluZyA9IGZ1bmNfZ2V0X2FyZygwKTsKCgkJJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CgkJYXJyYXlfc2hpZnQoJGFyZ3MpOwoJCSRyZXN1bHQgPSAkc3RyaW5nLT52YWx1ZTsKCgkJZm9yZWFjaCgkYXJncyBhcyAkYXJnKXsKCQkJaWYoIHByZWdfbWF0Y2goJy8lW3NkYV0vaScsJHJlc3VsdCwgJHRva2VuKSApewoJCQkJJHRva2VuID0gJHRva2VuWzBdOwoJCQkJJHZhbHVlID0gc3RyaXN0cigkdG9rZW4sICdzJykgPyAkYXJnLT52YWx1ZSA6ICRhcmctPnRvQ1NTKCk7CgkJCQkkdmFsdWUgPSBwcmVnX21hdGNoKCcvW0EtWl0kLycsICR0b2tlbikgPyB1cmxlbmNvZGUoJHZhbHVlKSA6ICR2YWx1ZTsKCQkJCSRyZXN1bHQgPSBwcmVnX3JlcGxhY2UoJy8lW3NkYV0vaScsJHZhbHVlLCAkcmVzdWx0LCAxKTsKCQkJfQoJCX0KCQkkcmVzdWx0ID0gc3RyX3JlcGxhY2UoJyUlJywgJyUnLCAkcmVzdWx0KTsKCgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfUXVvdGVkKCAkc3RyaW5nLT5xdW90ZSAsICRyZXN1bHQsICRzdHJpbmctPmVzY2FwZWQpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiB1bml0KCAkdmFsLCAkdW5pdCA9IG51bGwpIHsKCQlpZiggISgkdmFsIGluc3RhbmNlb2YgTGVzc19UcmVlX0RpbWVuc2lvbikgKXsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gdW5pdCBtdXN0IGJlIGEgbnVtYmVyJyAuICgkdmFsIGluc3RhbmNlb2YgTGVzc19UcmVlX09wZXJhdGlvbiA/ICcuIEhhdmUgeW91IGZvcmdvdHRlbiBwYXJlbnRoZXNpcz8nIDogJy4nKSApOwoJCX0KCgkJaWYoICR1bml0ICl7CgkJCWlmKCAkdW5pdCBpbnN0YW5jZW9mIExlc3NfVHJlZV9LZXl3b3JkICl7CgkJCQkkdW5pdCA9ICR1bml0LT52YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSR1bml0ID0gJHVuaXQtPnRvQ1NTKCk7CgkJCX0KCQl9IGVsc2UgewoJCQkkdW5pdCA9ICIiOwoJCX0KCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9EaW1lbnNpb24oJHZhbC0+dmFsdWUsICR1bml0ICk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGNvbnZlcnQoJHZhbCwgJHVuaXQpewoJCXJldHVybiAkdmFsLT5jb252ZXJ0VG8oJHVuaXQtPnZhbHVlKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gcm91bmQoJG4sICRmID0gZmFsc2UpIHsKCgkJJGZyYWN0aW9uID0gMDsKCQlpZiggJGYgIT09IGZhbHNlICl7CgkJCSRmcmFjdGlvbiA9ICRmLT52YWx1ZTsKCQl9CgoJCXJldHVybiAkdGhpcy0+X21hdGgoJ0xlc3NfUGFyc2VyOjpyb3VuZCcsbnVsbCwgJG4sICRmcmFjdGlvbik7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHBpKCl7CgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKE1fUEkpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBtb2QoJGEsICRiKSB7CgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKCAkYS0+dmFsdWUgJSAkYi0+dmFsdWUsICRhLT51bml0KTsKCX0KCgoKCXB1YmxpYyBmdW5jdGlvbiBwb3coJHgsICR5KSB7CgkJaWYoIGlzX251bWVyaWMoJHgpICYmIGlzX251bWVyaWMoJHkpICl7CgkJCSR4ID0gbmV3IExlc3NfVHJlZV9EaW1lbnNpb24oJHgpOwoJCQkkeSA9IG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKCR5KTsKCQl9ZWxzZWlmKCAhKCR4IGluc3RhbmNlb2YgTGVzc19UcmVlX0RpbWVuc2lvbikgfHwgISgkeSBpbnN0YW5jZW9mIExlc3NfVHJlZV9EaW1lbnNpb24pICl7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignQXJndW1lbnRzIG11c3QgYmUgbnVtYmVycycpOwoJCX0KCgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKCBwb3coJHgtPnZhbHVlLCAkeS0+dmFsdWUpLCAkeC0+dW5pdCApOwoJfQoKCS8vIHZhciBtYXRoRnVuY3Rpb25zID0gW3tuYW1lOiJjZSAuLi4KCXB1YmxpYyBmdW5jdGlvbiBjZWlsKCAkbiApewkJcmV0dXJuICR0aGlzLT5fbWF0aCgnY2VpbCcsIG51bGwsICRuKTsgfQoJcHVibGljIGZ1bmN0aW9uIGZsb29yKCAkbiApewlyZXR1cm4gJHRoaXMtPl9tYXRoKCdmbG9vcicsIG51bGwsICRuKTsgfQoJcHVibGljIGZ1bmN0aW9uIHNxcnQoICRuICl7CQlyZXR1cm4gJHRoaXMtPl9tYXRoKCdzcXJ0JywgbnVsbCwgJG4pOyB9CglwdWJsaWMgZnVuY3Rpb24gYWJzKCAkbiApewkJcmV0dXJuICR0aGlzLT5fbWF0aCgnYWJzJywgbnVsbCwgJG4pOyB9CgoJcHVibGljIGZ1bmN0aW9uIHRhbiggJG4gKXsJCXJldHVybiAkdGhpcy0+X21hdGgoJ3RhbicsICcnLCAkbik7CX0KCXB1YmxpYyBmdW5jdGlvbiBzaW4oICRuICl7CQlyZXR1cm4gJHRoaXMtPl9tYXRoKCdzaW4nLCAnJywgJG4pOwl9CglwdWJsaWMgZnVuY3Rpb24gY29zKCAkbiApewkJcmV0dXJuICR0aGlzLT5fbWF0aCgnY29zJywgJycsICRuKTsJfQoKCXB1YmxpYyBmdW5jdGlvbiBhdGFuKCAkbiApewkJcmV0dXJuICR0aGlzLT5fbWF0aCgnYXRhbicsICdyYWQnLCAkbik7CX0KCXB1YmxpYyBmdW5jdGlvbiBhc2luKCAkbiApewkJcmV0dXJuICR0aGlzLT5fbWF0aCgnYXNpbicsICdyYWQnLCAkbik7CX0KCXB1YmxpYyBmdW5jdGlvbiBhY29zKCAkbiApewkJcmV0dXJuICR0aGlzLT5fbWF0aCgnYWNvcycsICdyYWQnLCAkbik7CX0KCglwcml2YXRlIGZ1bmN0aW9uIF9tYXRoKCkgewoJCSRhcmdzID0gZnVuY19nZXRfYXJncygpOwoJCSRmbiA9IGFycmF5X3NoaWZ0KCRhcmdzKTsKCQkkdW5pdCA9IGFycmF5X3NoaWZ0KCRhcmdzKTsKCgkJaWYgKCRhcmdzWzBdIGluc3RhbmNlb2YgTGVzc19UcmVlX0RpbWVuc2lvbikgewoKCQkJaWYoICR1bml0ID09PSBudWxsICl7CgkJCQkkdW5pdCA9ICRhcmdzWzBdLT51bml0OwoJCQl9ZWxzZXsKCQkJCSRhcmdzWzBdID0gJGFyZ3NbMF0tPnVuaWZ5KCk7CgkJCX0KCQkJJGFyZ3NbMF0gPSAoZmxvYXQpJGFyZ3NbMF0tPnZhbHVlOwoJCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9EaW1lbnNpb24oIGNhbGxfdXNlcl9mdW5jX2FycmF5KCRmbiwgJGFyZ3MpLCAkdW5pdCk7CgkJfSBlbHNlIGlmIChpc19udW1lcmljKCRhcmdzWzBdKSkgewoJCQlyZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGZuLCRhcmdzKTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoIm1hdGggZnVuY3Rpb25zIHRha2UgbnVtYmVycyBhcyBwYXJhbWV0ZXJzIik7CgkJfQoJfQoKCS8qKgoJICogQHBhcmFtIGJvb2xlYW4gJGlzTWluCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX21pbm1heCggJGlzTWluLCAkYXJncyApewoKCQkkYXJnX2NvdW50ID0gY291bnQoJGFyZ3MpOwoKCQlpZiggJGFyZ19jb3VudCA8IDEgKXsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCAnb25lIG9yIG1vcmUgYXJndW1lbnRzIHJlcXVpcmVkJyk7CgkJfQoKCQkkaiA9IG51bGw7CgkJJHVuaXRDbG9uZSA9IG51bGw7CgkJJHVuaXRTdGF0aWMgPSBudWxsOwoKCgkJJG9yZGVyID0gYXJyYXkoKTsJLy8gZWxlbXMgb25seSBjb250YWlucyBvcmlnaW5hbCBhcmd1bWVudCB2YWx1ZXMuCgkJJHZhbHVlcyA9IGFycmF5KCk7CS8vIGtleSBpcyB0aGUgdW5pdC50b1N0cmluZygpIGZvciB1bmlmaWVkIHRyZWUuRGltZW5zaW9uIHZhbHVlcywKCQkJCQkJCS8vIHZhbHVlIGlzIHRoZSBpbmRleCBpbnRvIHRoZSBvcmRlciBhcnJheS4KCgoJCWZvciggJGkgPSAwOyAkaSA8ICRhcmdfY291bnQ7ICRpKysgKXsKCQkJJGN1cnJlbnQgPSAkYXJnc1skaV07CgkJCWlmKCAhKCRjdXJyZW50IGluc3RhbmNlb2YgTGVzc19UcmVlX0RpbWVuc2lvbikgKXsKCQkJCWlmKCBpc19hcnJheSgkYXJnc1skaV0tPnZhbHVlKSApewoJCQkJCSRhcmdzW10gPSAkYXJnc1skaV0tPnZhbHVlOwoJCQkJfQoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmKCAkY3VycmVudC0+dW5pdC0+dG9TdHJpbmcoKSA9PT0gJycgJiYgISR1bml0Q2xvbmUgKXsKCQkJCSR0ZW1wID0gbmV3IExlc3NfVHJlZV9EaW1lbnNpb24oJGN1cnJlbnQtPnZhbHVlLCAkdW5pdENsb25lKTsKCQkJCSRjdXJyZW50VW5pZmllZCA9ICR0ZW1wLT51bmlmeSgpOwoJCQl9ZWxzZXsKCQkJCSRjdXJyZW50VW5pZmllZCA9ICRjdXJyZW50LT51bmlmeSgpOwoJCQl9CgoJCQlpZiggJGN1cnJlbnRVbmlmaWVkLT51bml0LT50b1N0cmluZygpID09PSAiIiAmJiAhJHVuaXRTdGF0aWMgKXsKCQkJCSR1bml0ID0gJHVuaXRTdGF0aWM7CgkJCX1lbHNlewoJCQkJJHVuaXQgPSAkY3VycmVudFVuaWZpZWQtPnVuaXQtPnRvU3RyaW5nKCk7CgkJCX0KCgkJCWlmKCAkdW5pdCAhPT0gJycgJiYgISR1bml0U3RhdGljIHx8ICR1bml0ICE9PSAnJyAmJiAkb3JkZXJbMF0tPnVuaWZ5KCktPnVuaXQtPnRvU3RyaW5nKCkgPT09ICIiICl7CgkJCQkkdW5pdFN0YXRpYyA9ICR1bml0OwoJCQl9CgoJCQlpZiggJHVuaXQgIT0gJycgJiYgISR1bml0Q2xvbmUgKXsKCQkJCSR1bml0Q2xvbmUgPSAkY3VycmVudC0+dW5pdC0+dG9TdHJpbmcoKTsKCQkJfQoKCQkJaWYoIGlzc2V0KCR2YWx1ZXNbJyddKSAmJiAkdW5pdCAhPT0gJycgJiYgJHVuaXQgPT09ICR1bml0U3RhdGljICl7CgkJCQkkaiA9ICR2YWx1ZXNbJyddOwoJCQl9ZWxzZWlmKCBpc3NldCgkdmFsdWVzWyR1bml0XSkgKXsKCQkJCSRqID0gJHZhbHVlc1skdW5pdF07CgkJCX1lbHNlewoKCQkJCWlmKCAkdW5pdFN0YXRpYyAmJiAkdW5pdCAhPT0gJHVuaXRTdGF0aWMgKXsKCQkJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoICdpbmNvbXBhdGlibGUgdHlwZXMnKTsKCQkJCX0KCQkJCSR2YWx1ZXNbJHVuaXRdID0gY291bnQoJG9yZGVyKTsKCQkJCSRvcmRlcltdID0gJGN1cnJlbnQ7CgkJCQljb250aW51ZTsKCQkJfQoKCgkJCWlmKCAkb3JkZXJbJGpdLT51bml0LT50b1N0cmluZygpID09PSAiIiAmJiAkdW5pdENsb25lICl7CgkJCQkkdGVtcCA9IG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKCAkb3JkZXJbJGpdLT52YWx1ZSwgJHVuaXRDbG9uZSk7CgkJCQkkcmVmZXJlbmNlVW5pZmllZCA9ICR0ZW1wLT51bmlmeSgpOwoJCQl9ZWxzZXsKCQkJCSRyZWZlcmVuY2VVbmlmaWVkID0gJG9yZGVyWyRqXS0+dW5pZnkoKTsKCQkJfQoJCQlpZiggKCRpc01pbiAmJiAkY3VycmVudFVuaWZpZWQtPnZhbHVlIDwgJHJlZmVyZW5jZVVuaWZpZWQtPnZhbHVlKSB8fCAoISRpc01pbiAmJiAkY3VycmVudFVuaWZpZWQtPnZhbHVlID4gJHJlZmVyZW5jZVVuaWZpZWQtPnZhbHVlKSApewoJCQkJJG9yZGVyWyRqXSA9ICRjdXJyZW50OwoJCQl9CgkJfQoKCQlpZiggY291bnQoJG9yZGVyKSA9PSAxICl7CgkJCXJldHVybiAkb3JkZXJbMF07CgkJfQoJCSRhcmdzID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRvcmRlciBhcyAkYSl7CgkJCSRhcmdzW10gPSAkYS0+dG9DU1MoJHRoaXMtPmVudik7CgkJfQoJCXJldHVybiBuZXcgTGVzc19UcmVlX0Fub255bW91cyggKCRpc01pbj8nbWluKCc6J21heCgnKSAuIGltcGxvZGUoTGVzc19FbnZpcm9ubWVudDo6JF9vdXRwdXRNYXBbJywnXSwkYXJncykuJyknKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gbWluKCl7CgkJJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CgkJcmV0dXJuICR0aGlzLT5fbWlubWF4KCB0cnVlLCAkYXJncyApOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBtYXgoKXsKCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQlyZXR1cm4gJHRoaXMtPl9taW5tYXgoIGZhbHNlLCAkYXJncyApOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXR1bml0KCRuKXsKCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9Bbm9ueW1vdXMoJG4tPnVuaXQpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBhcmdiKCRjb2xvcikgewoJCWlmICghJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0NvbG9yKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIGZpcnN0IGFyZ3VtZW50IHRvIGFyZ2IgbXVzdCBiZSBhIGNvbG9yJyAuICgkZGFyayBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoKCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9Bbm9ueW1vdXMoJGNvbG9yLT50b0FSR0IoKSk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHBlcmNlbnRhZ2UoJG4pIHsKCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9EaW1lbnNpb24oJG4tPnZhbHVlICogMTAwLCAnJScpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBjb2xvcigkbikgewoKCQlpZiggJG4gaW5zdGFuY2VvZiBMZXNzX1RyZWVfUXVvdGVkICl7CgkJCSRjb2xvckNhbmRpZGF0ZSA9ICRuLT52YWx1ZTsKCQkJJHJldHVybkNvbG9yID0gTGVzc19UcmVlX0NvbG9yOjpmcm9tS2V5d29yZCgkY29sb3JDYW5kaWRhdGUpOwoJCQlpZiggJHJldHVybkNvbG9yICl7CgkJCQlyZXR1cm4gJHJldHVybkNvbG9yOwoJCQl9CgkJCWlmKCBwcmVnX21hdGNoKCcvXiMoW0EtRmEtZjAtOV17Nn18W0EtRmEtZjAtOV17M30pLycsJGNvbG9yQ2FuZGlkYXRlKSApewoJCQkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfQ29sb3Ioc3Vic3RyKCRjb2xvckNhbmRpZGF0ZSwgMSkpOwoJCQl9CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcigiYXJndW1lbnQgbXVzdCBiZSBhIGNvbG9yIGtleXdvcmQgb3IgMy82IGRpZ2l0IGhleCBlLmcuICNGRkYiKTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoImFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTsKCQl9Cgl9CgoKCXB1YmxpYyBmdW5jdGlvbiBpc2NvbG9yKCRuKSB7CgkJcmV0dXJuICR0aGlzLT5faXNhKCRuLCAnTGVzc19UcmVlX0NvbG9yJyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGlzbnVtYmVyKCRuKSB7CgkJcmV0dXJuICR0aGlzLT5faXNhKCRuLCAnTGVzc19UcmVlX0RpbWVuc2lvbicpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBpc3N0cmluZygkbikgewoJCXJldHVybiAkdGhpcy0+X2lzYSgkbiwgJ0xlc3NfVHJlZV9RdW90ZWQnKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gaXNrZXl3b3JkKCRuKSB7CgkJcmV0dXJuICR0aGlzLT5faXNhKCRuLCAnTGVzc19UcmVlX0tleXdvcmQnKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gaXN1cmwoJG4pIHsKCQlyZXR1cm4gJHRoaXMtPl9pc2EoJG4sICdMZXNzX1RyZWVfVXJsJyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGlzcGl4ZWwoJG4pIHsKCQlyZXR1cm4gJHRoaXMtPmlzdW5pdCgkbiwgJ3B4Jyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGlzcGVyY2VudGFnZSgkbikgewoJCXJldHVybiAkdGhpcy0+aXN1bml0KCRuLCAnJScpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBpc2VtKCRuKSB7CgkJcmV0dXJuICR0aGlzLT5pc3VuaXQoJG4sICdlbScpOwoJfQoKCS8qKgoJICogQHBhcmFtIHN0cmluZyAkdW5pdAoJICovCglwdWJsaWMgZnVuY3Rpb24gaXN1bml0KCAkbiwgJHVuaXQgKXsKCQlyZXR1cm4gKCRuIGluc3RhbmNlb2YgTGVzc19UcmVlX0RpbWVuc2lvbikgJiYgJG4tPnVuaXQtPmlzKCAoIHByb3BlcnR5X2V4aXN0cygkdW5pdCwndmFsdWUnKSA/ICR1bml0LT52YWx1ZSA6ICR1bml0KSApID8gbmV3IExlc3NfVHJlZV9LZXl3b3JkKCd0cnVlJykgOiBuZXcgTGVzc19UcmVlX0tleXdvcmQoJ2ZhbHNlJyk7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gc3RyaW5nICR0eXBlCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX2lzYSgkbiwgJHR5cGUpIHsKCQlyZXR1cm4gaXNfYSgkbiwgJHR5cGUpID8gbmV3IExlc3NfVHJlZV9LZXl3b3JkKCd0cnVlJykgOiBuZXcgTGVzc19UcmVlX0tleXdvcmQoJ2ZhbHNlJyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHRpbnQoJGNvbG9yLCAkYW1vdW50KSB7CgkJcmV0dXJuICR0aGlzLT5taXgoICR0aGlzLT5yZ2IoMjU1LDI1NSwyNTUpLCAkY29sb3IsICRhbW91bnQpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzaGFkZSgkY29sb3IsICRhbW91bnQpIHsKCQlyZXR1cm4gJHRoaXMtPm1peCgkdGhpcy0+cmdiKDAsIDAsIDApLCAkY29sb3IsICRhbW91bnQpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBleHRyYWN0KCR2YWx1ZXMsICRpbmRleCApewoJCSRpbmRleCA9IChpbnQpJGluZGV4LT52YWx1ZSAtIDE7IC8vICgxLWJhc2VkIGluZGV4KQoJCS8vIGhhbmRsZSBub24tYXJyYXkgdmFsdWVzIGFzIGFuIGFycmF5IG9mIGxlbmd0aCAxCgkJLy8gcmV0dXJuICd1bmRlZmluZWQnIGlmIGluZGV4IGlzIGludmFsaWQKCQlpZiggcHJvcGVydHlfZXhpc3RzKCR2YWx1ZXMsJ3ZhbHVlJykgJiYgaXNfYXJyYXkoJHZhbHVlcy0+dmFsdWUpICl7CgkJCWlmKCBpc3NldCgkdmFsdWVzLT52YWx1ZVskaW5kZXhdKSApewoJCQkJcmV0dXJuICR2YWx1ZXMtPnZhbHVlWyRpbmRleF07CgkJCX0KCQkJcmV0dXJuIG51bGw7CgoJCX1lbHNlaWYoIChpbnQpJGluZGV4ID09PSAwICl7CgkJCXJldHVybiAkdmFsdWVzOwoJCX0KCgkJcmV0dXJuIG51bGw7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGxlbmd0aCgkdmFsdWVzKXsKCQkkbiA9IChwcm9wZXJ0eV9leGlzdHMoJHZhbHVlcywndmFsdWUnKSAmJiBpc19hcnJheSgkdmFsdWVzLT52YWx1ZSkpID8gY291bnQoJHZhbHVlcy0+dmFsdWUpIDogMTsKCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9EaW1lbnNpb24oJG4pOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBkYXRhdXJpKCRtaW1ldHlwZU5vZGUsICRmaWxlUGF0aE5vZGUgPSBudWxsICkgewoKCQkkZmlsZVBhdGggPSAoICRmaWxlUGF0aE5vZGUgPyAkZmlsZVBhdGhOb2RlLT52YWx1ZSA6IG51bGwgKTsKCQkkbWltZXR5cGUgPSAkbWltZXR5cGVOb2RlLT52YWx1ZTsKCgkJJGFyZ3MgPSAyOwoJCWlmKCAhJGZpbGVQYXRoICl7CgkJCSRmaWxlUGF0aCA9ICRtaW1ldHlwZTsKCQkJJGFyZ3MgPSAxOwoJCX0KCgkJJGZpbGVQYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywnLycsJGZpbGVQYXRoKTsKCQlpZiggTGVzc19FbnZpcm9ubWVudDo6aXNQYXRoUmVsYXRpdmUoJGZpbGVQYXRoKSApewoKCQkJaWYoIExlc3NfUGFyc2VyOjokb3B0aW9uc1sncmVsYXRpdmVVcmxzJ10gKXsKCQkJCSR0ZW1wID0gJHRoaXMtPmN1cnJlbnRGaWxlSW5mb1snY3VycmVudERpcmVjdG9yeSddOwoJCQl9IGVsc2UgewoJCQkJJHRlbXAgPSAkdGhpcy0+Y3VycmVudEZpbGVJbmZvWydlbnRyeVBhdGgnXTsKCQkJfQoKCQkJaWYoICFlbXB0eSgkdGVtcCkgKXsKCQkJCSRmaWxlUGF0aCA9IExlc3NfRW52aXJvbm1lbnQ6Om5vcm1hbGl6ZVBhdGgocnRyaW0oJHRlbXAsJy8nKS4nLycuJGZpbGVQYXRoKTsKCQkJfQoKCQl9CgoKCQkvLyBkZXRlY3QgdGhlIG1pbWV0eXBlIGlmIG5vdCBnaXZlbgoJCWlmKCAkYXJncyA8IDIgKXsKCgkJCS8qIGluY29tcGxldGUKCQkJJG1pbWUgPSByZXF1aXJlKCdtaW1lJyk7CgkJCW1pbWV0eXBlID0gbWltZS5sb29rdXAocGF0aCk7CgoJCQkvLyB1c2UgYmFzZSA2NCB1bmxlc3MgaXQncyBhbiBBU0NJSSBvciBVVEYtOCBmb3JtYXQKCQkJdmFyIGNoYXJzZXQgPSBtaW1lLmNoYXJzZXRzLmxvb2t1cChtaW1ldHlwZSk7CgkJCXVzZUJhc2U2NCA9IFsnVVMtQVNDSUknLCAnVVRGLTgnXS5pbmRleE9mKGNoYXJzZXQpIDwgMDsKCQkJaWYgKHVzZUJhc2U2NCkgbWltZXR5cGUgKz0gJztiYXNlNjQnOwoJCQkqLwoKCQkJJG1pbWV0eXBlID0gTGVzc19NaW1lOjpsb29rdXAoJGZpbGVQYXRoKTsKCgkJCSRjaGFyc2V0ID0gTGVzc19NaW1lOjpjaGFyc2V0c19sb29rdXAoJG1pbWV0eXBlKTsKCQkJJHVzZUJhc2U2NCA9ICFpbl9hcnJheSgkY2hhcnNldCxhcnJheSgnVVMtQVNDSUknLCAnVVRGLTgnKSk7CgkJCWlmKCAkdXNlQmFzZTY0ICl7ICRtaW1ldHlwZSAuPSAnO2Jhc2U2NCc7IH0KCgkJfWVsc2V7CgkJCSR1c2VCYXNlNjQgPSBwcmVnX21hdGNoKCcvO2Jhc2U2NCQvJywkbWltZXR5cGUpOwoJCX0KCgoJCWlmKCBmaWxlX2V4aXN0cygkZmlsZVBhdGgpICl7CgkJCSRidWYgPSBAZmlsZV9nZXRfY29udGVudHMoJGZpbGVQYXRoKTsKCQl9ZWxzZXsKCQkJJGJ1ZiA9IGZhbHNlOwoJCX0KCgoJCS8vIElFOCBjYW5ub3QgaGFuZGxlIGEgZGF0YS11cmkgbGFyZ2VyIHRoYW4gMzJLQi4gSWYgdGhpcyBpcyBleGNlZWRlZAoJCS8vIGFuZCB0aGUgLS1pZUNvbXBhdCBmbGFnIGlzIGVuYWJsZWQsIHJldHVybiBhIG5vcm1hbCB1cmwoKSBpbnN0ZWFkLgoJCSREQVRBX1VSSV9NQVhfS0IgPSAzMjsKCQkkZmlsZVNpemVJbktCID0gcm91bmQoIHN0cmxlbigkYnVmKSAvIDEwMjQgKTsKCQlpZiggJGZpbGVTaXplSW5LQiA+PSAkREFUQV9VUklfTUFYX0tCICl7CgkJCSR1cmwgPSBuZXcgTGVzc19UcmVlX1VybCggKCRmaWxlUGF0aE5vZGUgPyAkZmlsZVBhdGhOb2RlIDogJG1pbWV0eXBlTm9kZSksICR0aGlzLT5jdXJyZW50RmlsZUluZm8pOwoJCQlyZXR1cm4gJHVybC0+Y29tcGlsZSgkdGhpcyk7CgkJfQoKCQlpZiggJGJ1ZiApewoJCQkkYnVmID0gJHVzZUJhc2U2NCA/IGJhc2U2NF9lbmNvZGUoJGJ1ZikgOiByYXd1cmxlbmNvZGUoJGJ1Zik7CgkJCSRmaWxlUGF0aCA9ICciZGF0YTonIC4gJG1pbWV0eXBlIC4gJywnIC4gJGJ1ZiAuICciJzsKCQl9CgoJCXJldHVybiBuZXcgTGVzc19UcmVlX1VybCggbmV3IExlc3NfVHJlZV9Bbm9ueW1vdXMoJGZpbGVQYXRoKSApOwoJfQoKCS8vc3ZnLWdyYWRpZW50CglwdWJsaWMgZnVuY3Rpb24gc3ZnZ3JhZGllbnQoICRkaXJlY3Rpb24gKXsKCgkJJHRocm93X21lc3NhZ2UgPSAnc3ZnLWdyYWRpZW50IGV4cGVjdHMgZGlyZWN0aW9uLCBzdGFydF9jb2xvciBbc3RhcnRfcG9zaXRpb25dLCBbY29sb3IgcG9zaXRpb24sXS4uLiwgZW5kX2NvbG9yIFtlbmRfcG9zaXRpb25dJzsKCQkkYXJndW1lbnRzID0gZnVuY19nZXRfYXJncygpOwoKCQlpZiggY291bnQoJGFyZ3VtZW50cykgPCAzICl7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlciggJHRocm93X21lc3NhZ2UgKTsKCQl9CgoJCSRzdG9wcyA9IGFycmF5X3NsaWNlKCRhcmd1bWVudHMsMSk7CgkJJGdyYWRpZW50VHlwZSA9ICdsaW5lYXInOwoJCSRyZWN0YW5nbGVEaW1lbnNpb24gPSAneD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSInOwoJCSR1c2VCYXNlNjQgPSB0cnVlOwoJCSRkaXJlY3Rpb25WYWx1ZSA9ICRkaXJlY3Rpb24tPnRvQ1NTKCk7CgoKCQlzd2l0Y2goICRkaXJlY3Rpb25WYWx1ZSApewoJCQljYXNlICJ0byBib3R0b20iOgoJCQkJJGdyYWRpZW50RGlyZWN0aW9uU3ZnID0gJ3gxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIic7CgkJCQlicmVhazsKCQkJY2FzZSAidG8gcmlnaHQiOgoJCQkJJGdyYWRpZW50RGlyZWN0aW9uU3ZnID0gJ3gxPSIwJSIgeTE9IjAlIiB4Mj0iMTAwJSIgeTI9IjAlIic7CgkJCQlicmVhazsKCQkJY2FzZSAidG8gYm90dG9tIHJpZ2h0IjoKCQkJCSRncmFkaWVudERpcmVjdGlvblN2ZyA9ICd4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIxMDAlIic7CgkJCQlicmVhazsKCQkJY2FzZSAidG8gdG9wIHJpZ2h0IjoKCQkJCSRncmFkaWVudERpcmVjdGlvblN2ZyA9ICd4MT0iMCUiIHkxPSIxMDAlIiB4Mj0iMTAwJSIgeTI9IjAlIic7CgkJCQlicmVhazsKCQkJY2FzZSAiZWxsaXBzZSI6CgkJCWNhc2UgImVsbGlwc2UgYXQgY2VudGVyIjoKCQkJCSRncmFkaWVudFR5cGUgPSAicmFkaWFsIjsKCQkJCSRncmFkaWVudERpcmVjdGlvblN2ZyA9ICdjeD0iNTAlIiBjeT0iNTAlIiByPSI3NSUiJzsKCQkJCSRyZWN0YW5nbGVEaW1lbnNpb24gPSAneD0iLTUwIiB5PSItNTAiIHdpZHRoPSIxMDEiIGhlaWdodD0iMTAxIic7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlciggInN2Zy1ncmFkaWVudCBkaXJlY3Rpb24gbXVzdCBiZSAndG8gYm90dG9tJywgJ3RvIHJpZ2h0JywgJ3RvIGJvdHRvbSByaWdodCcsICd0byB0b3AgcmlnaHQnIG9yICdlbGxpcHNlIGF0IGNlbnRlciciICk7CgkJfQoKCQkkcmV0dXJuZXIgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiA/PicgLgoJCQknPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+JyAuCgkJCSc8JyAuICRncmFkaWVudFR5cGUgLiAnR3JhZGllbnQgaWQ9ImdyYWRpZW50IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgJyAuICRncmFkaWVudERpcmVjdGlvblN2ZyAuICc+JzsKCgkJZm9yKCAkaSA9IDA7ICRpIDwgY291bnQoJHN0b3BzKTsgJGkrKyApewoJCQlpZiggaXNfb2JqZWN0KCRzdG9wc1skaV0pICYmIHByb3BlcnR5X2V4aXN0cygkc3RvcHNbJGldLCd2YWx1ZScpICl7CgkJCQkkY29sb3IgPSAkc3RvcHNbJGldLT52YWx1ZVswXTsKCQkJCSRwb3NpdGlvbiA9ICRzdG9wc1skaV0tPnZhbHVlWzFdOwoJCQl9ZWxzZXsKCQkJCSRjb2xvciA9ICRzdG9wc1skaV07CgkJCQkkcG9zaXRpb24gPSBudWxsOwoJCQl9CgoJCQlpZiggISgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHx8ICghKCgkaSA9PT0gMCB8fCAkaSsxID09PSBjb3VudCgkc3RvcHMpKSAmJiAkcG9zaXRpb24gPT09IG51bGwpICYmICEoJHBvc2l0aW9uIGluc3RhbmNlb2YgTGVzc19UcmVlX0RpbWVuc2lvbikpICl7CgkJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoICR0aHJvd19tZXNzYWdlICk7CgkJCX0KCQkJaWYoICRwb3NpdGlvbiApewoJCQkJJHBvc2l0aW9uVmFsdWUgPSAkcG9zaXRpb24tPnRvQ1NTKCk7CgkJCX1lbHNlaWYoICRpID09PSAwICl7CgkJCQkkcG9zaXRpb25WYWx1ZSA9ICcwJSc7CgkJCX1lbHNlewoJCQkJJHBvc2l0aW9uVmFsdWUgPSAnMTAwJSc7CgkJCX0KCQkJJGFscGhhID0gJGNvbG9yLT5hbHBoYTsKCQkJJHJldHVybmVyIC49ICc8c3RvcCBvZmZzZXQ9IicgLiAkcG9zaXRpb25WYWx1ZSAuICciIHN0b3AtY29sb3I9IicgLiAkY29sb3ItPnRvUkdCKCkgLiAnIicgLiAoJGFscGhhIDwgMSA/ICcgc3RvcC1vcGFjaXR5PSInIC4gJGFscGhhIC4gJyInIDogJycpIC4gJy8+JzsKCQl9CgoJCSRyZXR1cm5lciAuPSAnPC8nIC4gJGdyYWRpZW50VHlwZSAuICdHcmFkaWVudD48cmVjdCAnIC4gJHJlY3RhbmdsZURpbWVuc2lvbiAuICcgZmlsbD0idXJsKCNncmFkaWVudCkiIC8+PC9zdmc+JzsKCgoJCWlmKCAkdXNlQmFzZTY0ICl7CgkJCSRyZXR1cm5lciA9ICInZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwiLmJhc2U2NF9lbmNvZGUoJHJldHVybmVyKS4iJyI7CgkJfWVsc2V7CgkJCSRyZXR1cm5lciA9ICInZGF0YTppbWFnZS9zdmcreG1sLCIuJHJldHVybmVyLiInIjsKCQl9CgoJCXJldHVybiBuZXcgTGVzc19UcmVlX1VSTCggbmV3IExlc3NfVHJlZV9Bbm9ueW1vdXMoICRyZXR1cm5lciApICk7Cgl9CgoKCS8qKgoJICogUGhwIHZlcnNpb24gb2YgamF2YXNjcmlwdCdzIGBlbmNvZGVVUklDb21wb25lbnRgIGZ1bmN0aW9uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc3RyaW5nIFRoZSBzdHJpbmcgdG8gZW5jb2RlCgkgKiBAcmV0dXJuIHN0cmluZyBUaGUgZW5jb2RlZCBzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGVVUklDb21wb25lbnQoJHN0cmluZyl7CgkJJHJldmVydCA9IGFycmF5KCclMjEnID0+ICchJywgJyUyQScgPT4gJyonLCAnJTI3JyA9PiAiJyIsICclMjgnID0+ICcoJywgJyUyOScgPT4gJyknKTsKCQlyZXR1cm4gc3RydHIocmF3dXJsZW5jb2RlKCRzdHJpbmcpLCAkcmV2ZXJ0KTsKCX0KCgoJLy8gQ29sb3IgQmxlbmRpbmcKCS8vIHJlZjogaHR0cDovL3d3dy53My5vcmcvVFIvY29tcG9zaXRpbmctMQoKCXB1YmxpYyBmdW5jdGlvbiBjb2xvckJsZW5kKCAkbW9kZSwgJGNvbG9yMSwgJGNvbG9yMiApewoJCSRhYiA9ICRjb2xvcjEtPmFscGhhOwkvLyBiYWNrZHJvcAoJCSRhcyA9ICRjb2xvcjItPmFscGhhOwkvLyBzb3VyY2UKCQkkciA9IGFycmF5KCk7CQkJLy8gcmVzdWx0CgoJCSRhciA9ICRhcyArICRhYiAqICgxIC0gJGFzKTsKCQlmb3IoICRpID0gMDsgJGkgPCAzOyAkaSsrICl7CgkJCSRjYiA9ICRjb2xvcjEtPnJnYlskaV0gLyAyNTU7CgkJCSRjcyA9ICRjb2xvcjItPnJnYlskaV0gLyAyNTU7CgkJCSRjciA9IGNhbGxfdXNlcl9mdW5jKCAkbW9kZSwgJGNiLCAkY3MgKTsKCQkJaWYoICRhciApewoJCQkJJGNyID0gKCRhcyAqICRjcyArICRhYiAqICgkY2IgLSAkYXMgKiAoJGNiICsgJGNzIC0gJGNyKSkpIC8gJGFyOwoJCQl9CgkJCSRyWyRpXSA9ICRjciAqIDI1NTsKCQl9CgoJCXJldHVybiBuZXcgTGVzc19UcmVlX0NvbG9yKCRyLCAkYXIpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBtdWx0aXBseSgkY29sb3IxID0gbnVsbCwgJGNvbG9yMiA9IG51bGwgKXsKCQlpZiAoISRjb2xvcjEgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gbXVsdGlwbHkgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCQlpZiAoISRjb2xvcjIgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIG11bHRpcGx5IG11c3QgYmUgYSBjb2xvcicgLiAoJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgoJCXJldHVybiAkdGhpcy0+Y29sb3JCbGVuZCggYXJyYXkoJHRoaXMsJ2NvbG9yQmxlbmRNdWx0aXBseScpLCAgJGNvbG9yMSwgJGNvbG9yMiApOwoJfQoKCXByaXZhdGUgZnVuY3Rpb24gY29sb3JCbGVuZE11bHRpcGx5KCRjYiwgJGNzKXsKCQlyZXR1cm4gJGNiICogJGNzOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzY3JlZW4oJGNvbG9yMSA9IG51bGwsICRjb2xvcjIgPSBudWxsICl7CgkJaWYgKCEkY29sb3IxIGluc3RhbmNlb2YgTGVzc19UcmVlX0NvbG9yKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHNjcmVlbiBtdXN0IGJlIGEgY29sb3InIC4gKCRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoJCWlmICghJGNvbG9yMiBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBzZWNvbmQgYXJndW1lbnQgdG8gc2NyZWVuIG11c3QgYmUgYSBjb2xvcicgLiAoJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgoJCXJldHVybiAkdGhpcy0+Y29sb3JCbGVuZCggYXJyYXkoJHRoaXMsJ2NvbG9yQmxlbmRTY3JlZW4nKSwgICRjb2xvcjEsICRjb2xvcjIgKTsKCX0KCglwcml2YXRlIGZ1bmN0aW9uIGNvbG9yQmxlbmRTY3JlZW4oICRjYiwgJGNzKXsKCQlyZXR1cm4gJGNiICsgJGNzIC0gJGNiICogJGNzOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBvdmVybGF5KCRjb2xvcjEgPSBudWxsLCAkY29sb3IyID0gbnVsbCl7CgkJaWYgKCEkY29sb3IxIGluc3RhbmNlb2YgTGVzc19UcmVlX0NvbG9yKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIGZpcnN0IGFyZ3VtZW50IHRvIG92ZXJsYXkgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCQlpZiAoISRjb2xvcjIgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIG92ZXJsYXkgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCgkJcmV0dXJuICR0aGlzLT5jb2xvckJsZW5kKCBhcnJheSgkdGhpcywnY29sb3JCbGVuZE92ZXJsYXknKSwgICRjb2xvcjEsICRjb2xvcjIgKTsKCX0KCglwcml2YXRlIGZ1bmN0aW9uIGNvbG9yQmxlbmRPdmVybGF5KCRjYiwgJGNzICl7CgkJJGNiICo9IDI7CgkJcmV0dXJuICgkY2IgPD0gMSkKCQkJPyAkdGhpcy0+Y29sb3JCbGVuZE11bHRpcGx5KCRjYiwgJGNzKQoJCQk6ICR0aGlzLT5jb2xvckJsZW5kU2NyZWVuKCRjYiAtIDEsICRjcyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHNvZnRsaWdodCgkY29sb3IxID0gbnVsbCwgJGNvbG9yMiA9IG51bGwpewoJCWlmICghJGNvbG9yMSBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBmaXJzdCBhcmd1bWVudCB0byBzb2Z0bGlnaHQgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCQlpZiAoISRjb2xvcjIgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHNvZnRsaWdodCBtdXN0IGJlIGEgY29sb3InIC4gKCRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPmNvbG9yQmxlbmQoIGFycmF5KCR0aGlzLCdjb2xvckJsZW5kU29mdGxpZ2h0JyksICAkY29sb3IxLCAkY29sb3IyICk7Cgl9CgoJcHJpdmF0ZSBmdW5jdGlvbiBjb2xvckJsZW5kU29mdGxpZ2h0KCRjYiwgJGNzICl7CgkJJGQgPSAxOwoJCSRlID0gJGNiOwoJCWlmKCAkY3MgPiAwLjUgKXsKCQkJJGUgPSAxOwoJCQkkZCA9ICgkY2IgPiAwLjI1KSA/IHNxcnQoJGNiKQoJCQkJOiAoKDE2ICogJGNiIC0gMTIpICogJGNiICsgNCkgKiAkY2I7CgkJfQoJCXJldHVybiAkY2IgLSAoMSAtIDIgKiAkY3MpICogJGUgKiAoJGQgLSAkY2IpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBoYXJkbGlnaHQoJGNvbG9yMSA9IG51bGwsICRjb2xvcjIgPSBudWxsKXsKCQlpZiAoISRjb2xvcjEgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gaGFyZGxpZ2h0IG11c3QgYmUgYSBjb2xvcicgLiAoJGNvbG9yIGluc3RhbmNlb2YgTGVzc19UcmVlX0V4cHJlc3Npb24gPyAnIChkaWQgeW91IGZvcmdvdCBjb21tYXM/KScgOiAnJykgKTsKCQl9CgkJaWYgKCEkY29sb3IyIGluc3RhbmNlb2YgTGVzc19UcmVlX0NvbG9yKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIHNlY29uZCBhcmd1bWVudCB0byBoYXJkbGlnaHQgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCgkJcmV0dXJuICR0aGlzLT5jb2xvckJsZW5kKCBhcnJheSgkdGhpcywnY29sb3JCbGVuZEhhcmRsaWdodCcpLCAgJGNvbG9yMSwgJGNvbG9yMiApOwoJfQoKCXByaXZhdGUgZnVuY3Rpb24gY29sb3JCbGVuZEhhcmRsaWdodCggJGNiLCAkY3MgKXsKCQlyZXR1cm4gJHRoaXMtPmNvbG9yQmxlbmRPdmVybGF5KCRjcywgJGNiKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZGlmZmVyZW5jZSgkY29sb3IxID0gbnVsbCwgJGNvbG9yMiA9IG51bGwpIHsKCQlpZiAoISRjb2xvcjEgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgZmlyc3QgYXJndW1lbnQgdG8gZGlmZmVyZW5jZSBtdXN0IGJlIGEgY29sb3InIC4gKCRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoJCWlmICghJGNvbG9yMiBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBzZWNvbmQgYXJndW1lbnQgdG8gZGlmZmVyZW5jZSBtdXN0IGJlIGEgY29sb3InIC4gKCRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPmNvbG9yQmxlbmQoIGFycmF5KCR0aGlzLCdjb2xvckJsZW5kRGlmZmVyZW5jZScpLCAgJGNvbG9yMSwgJGNvbG9yMiApOwoJfQoKCXByaXZhdGUgZnVuY3Rpb24gY29sb3JCbGVuZERpZmZlcmVuY2UoICRjYiwgJGNzICl7CgkJcmV0dXJuIGFicygkY2IgLSAkY3MpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBleGNsdXNpb24oICRjb2xvcjEgPSBudWxsLCAkY29sb3IyID0gbnVsbCApewoJCWlmICghJGNvbG9yMSBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBmaXJzdCBhcmd1bWVudCB0byBleGNsdXNpb24gbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCQlpZiAoISRjb2xvcjIgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIGV4Y2x1c2lvbiBtdXN0IGJlIGEgY29sb3InIC4gKCRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPmNvbG9yQmxlbmQoIGFycmF5KCR0aGlzLCdjb2xvckJsZW5kRXhjbHVzaW9uJyksICAkY29sb3IxLCAkY29sb3IyICk7Cgl9CgoJcHJpdmF0ZSBmdW5jdGlvbiBjb2xvckJsZW5kRXhjbHVzaW9uKCAkY2IsICRjcyApewoJCXJldHVybiAkY2IgKyAkY3MgLSAyICogJGNiICogJGNzOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBhdmVyYWdlKCRjb2xvcjEgPSBudWxsLCAkY29sb3IyID0gbnVsbCl7CgkJaWYgKCEkY29sb3IxIGluc3RhbmNlb2YgTGVzc19UcmVlX0NvbG9yKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVGhlIGZpcnN0IGFyZ3VtZW50IHRvIGF2ZXJhZ2UgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCQlpZiAoISRjb2xvcjIgaW5zdGFuY2VvZiBMZXNzX1RyZWVfQ29sb3IpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIGF2ZXJhZ2UgbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCgkJcmV0dXJuICR0aGlzLT5jb2xvckJsZW5kKCBhcnJheSgkdGhpcywnY29sb3JCbGVuZEF2ZXJhZ2UnKSwgICRjb2xvcjEsICRjb2xvcjIgKTsKCX0KCgkvLyBub24tdzNjIGZ1bmN0aW9uczoKCXB1YmxpYyBmdW5jdGlvbiBjb2xvckJsZW5kQXZlcmFnZSgkY2IsICRjcyApewoJCXJldHVybiAoJGNiICsgJGNzKSAvIDI7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIG5lZ2F0aW9uKCRjb2xvcjEgPSBudWxsLCAkY29sb3IyID0gbnVsbCApewoJCWlmICghJGNvbG9yMSBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBmaXJzdCBhcmd1bWVudCB0byBuZWdhdGlvbiBtdXN0IGJlIGEgY29sb3InIC4gKCRjb2xvciBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uID8gJyAoZGlkIHlvdSBmb3Jnb3QgY29tbWFzPyknIDogJycpICk7CgkJfQoJCWlmICghJGNvbG9yMiBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvcikgewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJ1RoZSBzZWNvbmQgYXJndW1lbnQgdG8gbmVnYXRpb24gbXVzdCBiZSBhIGNvbG9yJyAuICgkY29sb3IgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXhwcmVzc2lvbiA/ICcgKGRpZCB5b3UgZm9yZ290IGNvbW1hcz8pJyA6ICcnKSApOwoJCX0KCgkJcmV0dXJuICR0aGlzLT5jb2xvckJsZW5kKCBhcnJheSgkdGhpcywnY29sb3JCbGVuZE5lZ2F0aW9uJyksICAkY29sb3IxLCAkY29sb3IyICk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGNvbG9yQmxlbmROZWdhdGlvbigkY2IsICRjcyl7CgkJcmV0dXJuIDEgLSBhYnMoJGNiICsgJGNzIC0gMSk7Cgl9CgoJLy8gfiBFbmQgb2YgQ29sb3IgQmxlbmRpbmcKCn0KIAoKLyoqCiAqIE1pbWUgbG9va3VwCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2Ugbm9kZQogKi8KY2xhc3MgTGVzc19NaW1lewoKCS8vIHRoaXMgbWFwIGlzIGludGVudGlvbmFsbHkgaW5jb21wbGV0ZQoJLy8gaWYgeW91IHdhbnQgbW9yZSwgaW5zdGFsbCAnbWltZScgZGVwCglzdGF0aWMgJF90eXBlcyA9IGFycmF5KAoJICAgICAgICAnLmh0bScgPT4gJ3RleHQvaHRtbCcsCgkgICAgICAgICcuaHRtbCc9PiAndGV4dC9odG1sJywKCSAgICAgICAgJy5naWYnID0+ICdpbWFnZS9naWYnLAoJICAgICAgICAnLmpwZycgPT4gJ2ltYWdlL2pwZWcnLAoJICAgICAgICAnLmpwZWcnPT4gJ2ltYWdlL2pwZWcnLAoJICAgICAgICAnLnBuZycgPT4gJ2ltYWdlL3BuZycsCgkgICAgICAgICcudHRmJyA9PiAnYXBwbGljYXRpb24veC1mb250LXR0ZicsCgkgICAgICAgICcub3RmJyA9PiAnYXBwbGljYXRpb24veC1mb250LW90ZicsCgkgICAgICAgICcuZW90JyA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QnLAoJICAgICAgICAnLndvZmYnID0+ICdhcHBsaWNhdGlvbi94LWZvbnQtd29mZicsCgkgICAgICAgICcuc3ZnJyA9PiAnaW1hZ2Uvc3ZnK3htbCcsCgkgICAgICAgICk7CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsb29rdXAoICRmaWxlcGF0aCApewoJCSRwYXJ0cyA9IGV4cGxvZGUoJy4nLCRmaWxlcGF0aCk7CgkJJGV4dCA9ICcuJy5zdHJ0b2xvd2VyKGFycmF5X3BvcCgkcGFydHMpKTsKCgkJaWYoICFpc3NldChzZWxmOjokX3R5cGVzWyRleHRdKSApewoJCQlyZXR1cm4gbnVsbDsKCQl9CgkJcmV0dXJuIHNlbGY6OiRfdHlwZXNbJGV4dF07Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGFyc2V0c19sb29rdXAoICR0eXBlID0gbnVsbCApewoJCS8vIGFzc3VtZXMgYWxsIHRleHQgdHlwZXMgYXJlIFVURi04CgkJcmV0dXJuICR0eXBlICYmIHByZWdfbWF0Y2goJy9edGV4dFwvLycsJHR5cGUpID8gJ1VURi04JyA6ICcnOwoJfQp9CiAKCi8qKgogKiBUcmVlCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdHJlZQogKi8KY2xhc3MgTGVzc19UcmVlewoKCXB1YmxpYyAkY2FjaGVfc3RyaW5nOwoKCXB1YmxpYyBmdW5jdGlvbiB0b0NTUygpewoJCSRvdXRwdXQgPSBuZXcgTGVzc19PdXRwdXQoKTsKCQkkdGhpcy0+Z2VuQ1NTKCRvdXRwdXQpOwoJCXJldHVybiAkb3V0cHV0LT50b1N0cmluZygpOwoJfQoKCiAgICAvKioKICAgICAqIEdlbmVyYXRlIENTUyBieSBhZGRpbmcgaXQgdG8gdGhlIG91dHB1dCBvYmplY3QKICAgICAqCiAgICAgKiBAcGFyYW0gTGVzc19PdXRwdXQgJG91dHB1dCBUaGUgb3V0cHV0CiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdlbkNTUygkb3V0cHV0KXt9CgoKCS8qKgoJICogQHBhcmFtIExlc3NfVHJlZV9SdWxlc2V0W10gJHJ1bGVzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gb3V0cHV0UnVsZXNldCggJG91dHB1dCwgJHJ1bGVzICl7CgoJCSRydWxlQ250ID0gY291bnQoJHJ1bGVzKTsKCQlMZXNzX0Vudmlyb25tZW50OjokdGFiTGV2ZWwrKzsKCgoJCS8vIENvbXByZXNzZWQKCQlpZiggTGVzc19QYXJzZXI6OiRvcHRpb25zWydjb21wcmVzcyddICl7CgkJCSRvdXRwdXQtPmFkZCgneycpOwoJCQlmb3IoICRpID0gMDsgJGkgPCAkcnVsZUNudDsgJGkrKyApewoJCQkJJHJ1bGVzWyRpXS0+Z2VuQ1NTKCAkb3V0cHV0ICk7CgkJCX0KCgkJCSRvdXRwdXQtPmFkZCggJ30nICk7CgkJCUxlc3NfRW52aXJvbm1lbnQ6OiR0YWJMZXZlbC0tOwoJCQlyZXR1cm47CgkJfQoKCgkJLy8gTm9uLWNvbXByZXNzZWQKCQkkdGFiU2V0U3RyID0gIlxuIi5zdHJfcmVwZWF0KCAnICAnICwgTGVzc19FbnZpcm9ubWVudDo6JHRhYkxldmVsLTEgKTsKCQkkdGFiUnVsZVN0ciA9ICR0YWJTZXRTdHIuJyAgJzsKCgkJJG91dHB1dC0+YWRkKCAiIHsiICk7CgkJZm9yKCRpID0gMDsgJGkgPCAkcnVsZUNudDsgJGkrKyApewoJCQkkb3V0cHV0LT5hZGQoICR0YWJSdWxlU3RyICk7CgkJCSRydWxlc1skaV0tPmdlbkNTUyggJG91dHB1dCApOwoJCX0KCQlMZXNzX0Vudmlyb25tZW50OjokdGFiTGV2ZWwtLTsKCQkkb3V0cHV0LT5hZGQoICR0YWJTZXRTdHIuJ30nICk7CgoJfQoKCXB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoJHZpc2l0b3Ipe30KCgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSZWZlcmVuY2VkQXJyYXkoJHJ1bGVzKXsKCQlmb3JlYWNoKCRydWxlcyBhcyAkcnVsZSl7CgkJCWlmKCBtZXRob2RfZXhpc3RzKCRydWxlLCAnbWFya1JlZmVyZW5jZWQnKSApewoJCQkJJHJ1bGUtPm1hcmtSZWZlcmVuY2VkKCk7CgkJCX0KCQl9Cgl9CgoKCS8qKgoJICogUmVxdWlyZXMgcGhwIDUuMysKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfX3NldF9zdGF0ZSgkYXJncyl7CgoJCSRjbGFzcyA9IGdldF9jYWxsZWRfY2xhc3MoKTsKCQkkb2JqID0gbmV3ICRjbGFzcyhudWxsLG51bGwsbnVsbCxudWxsKTsKCQlmb3JlYWNoKCRhcmdzIGFzICRrZXkgPT4gJHZhbCl7CgkJCSRvYmotPiRrZXkgPSAkdmFsOwoJCX0KCQlyZXR1cm4gJG9iajsKCX0KCn0gCgovKioKICogUGFyc2VyIG91dHB1dAogKgogKiBAcGFja2FnZSBMZXNzCiAqIEBzdWJwYWNrYWdlIG91dHB1dAogKi8KY2xhc3MgTGVzc19PdXRwdXR7CgoJLyoqCgkgKiBPdXRwdXQgaG9sZGVyCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRzdHJzID0gYXJyYXkoKTsKCgkvKioKCSAqIEFkZHMgYSBjaHVuayB0byB0aGUgc3RhY2sKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRjaHVuayBUaGUgY2h1bmsgdG8gb3V0cHV0CgkgKiBAcGFyYW0gTGVzc19GaWxlSW5mbyAkZmlsZUluZm8gVGhlIGZpbGUgaW5mb3JtYXRpb24KCSAqIEBwYXJhbSBpbnRlZ2VyICRpbmRleCBUaGUgaW5kZXgKCSAqIEBwYXJhbSBtaXhlZCAkbWFwTGluZXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFkZCgkY2h1bmssICRmaWxlSW5mbyA9IG51bGwsICRpbmRleCA9IDAsICRtYXBMaW5lcyA9IG51bGwpewoJCSR0aGlzLT5zdHJzW10gPSAkY2h1bms7Cgl9CgoJLyoqCgkgKiBJcyB0aGUgb3V0cHV0IGVtcHR5PwoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpewoJCXJldHVybiBjb3VudCgkdGhpcy0+c3RycykgPT09IDA7Cgl9CgoKCS8qKgoJICogQ29udmVydHMgdGhlIG91dHB1dCB0byBzdHJpbmcKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKXsKCQlyZXR1cm4gaW1wbG9kZSgnJywkdGhpcy0+c3Rycyk7Cgl9Cgp9IAoKLyoqCiAqIFZpc2l0b3IKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB2aXNpdG9yCiAqLwpjbGFzcyBMZXNzX1Zpc2l0b3J7CgoJcHJvdGVjdGVkICRtZXRob2RzID0gYXJyYXkoKTsKCXByb3RlY3RlZCAkX3Zpc2l0Rm5DYWNoZSA9IGFycmF5KCk7CgoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCl7CgkJJHRoaXMtPl92aXNpdEZuQ2FjaGUgPSBnZXRfY2xhc3NfbWV0aG9kcyhnZXRfY2xhc3MoJHRoaXMpKTsKCQkkdGhpcy0+X3Zpc2l0Rm5DYWNoZSA9IGFycmF5X2ZsaXAoJHRoaXMtPl92aXNpdEZuQ2FjaGUpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiB2aXNpdE9iaiggJG5vZGUgKXsKCgkJJGZ1bmNOYW1lID0gJ3Zpc2l0Jy4kbm9kZS0+dHlwZTsKCQlpZiggaXNzZXQoJHRoaXMtPl92aXNpdEZuQ2FjaGVbJGZ1bmNOYW1lXSkgKXsKCgkJCSR2aXNpdERlZXBlciA9IHRydWU7CgkJCSR0aGlzLT4kZnVuY05hbWUoICRub2RlLCAkdmlzaXREZWVwZXIgKTsKCgkJCWlmKCAkdmlzaXREZWVwZXIgKXsKCQkJCSRub2RlLT5hY2NlcHQoJHRoaXMpOwoJCQl9CgoJCQkkZnVuY05hbWUgPSAkZnVuY05hbWUgLiAiT3V0IjsKCQkJaWYoIGlzc2V0KCR0aGlzLT5fdmlzaXRGbkNhY2hlWyRmdW5jTmFtZV0pICl7CgkJCQkkdGhpcy0+JGZ1bmNOYW1lKCAkbm9kZSApOwoJCQl9CgoJCX1lbHNlewoJCQkkbm9kZS0+YWNjZXB0KCR0aGlzKTsKCQl9CgoJCXJldHVybiAkbm9kZTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdmlzaXRBcnJheSggJG5vZGVzICl7CgoJCWFycmF5X21hcCggYXJyYXkoJHRoaXMsJ3Zpc2l0T2JqJyksICRub2Rlcyk7CgkJcmV0dXJuICRub2RlczsKCX0KfQoKIAoKLyoqCiAqIFJlcGxhY2luZyBWaXNpdG9yCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdmlzaXRvcgogKi8KY2xhc3MgTGVzc19WaXNpdG9yUmVwbGFjaW5nIGV4dGVuZHMgTGVzc19WaXNpdG9yewoKCXB1YmxpYyBmdW5jdGlvbiB2aXNpdE9iaiggJG5vZGUgKXsKCgkJJGZ1bmNOYW1lID0gJ3Zpc2l0Jy4kbm9kZS0+dHlwZTsKCQlpZiggaXNzZXQoJHRoaXMtPl92aXNpdEZuQ2FjaGVbJGZ1bmNOYW1lXSkgKXsKCgkJCSR2aXNpdERlZXBlciA9IHRydWU7CgkJCSRub2RlID0gJHRoaXMtPiRmdW5jTmFtZSggJG5vZGUsICR2aXNpdERlZXBlciApOwoKCQkJaWYoICRub2RlICl7CgkJCQlpZiggJHZpc2l0RGVlcGVyICYmIGlzX29iamVjdCgkbm9kZSkgKXsKCQkJCQkkbm9kZS0+YWNjZXB0KCR0aGlzKTsKCQkJCX0KCgkJCQkkZnVuY05hbWUgPSAkZnVuY05hbWUgLiAiT3V0IjsKCQkJCWlmKCBpc3NldCgkdGhpcy0+X3Zpc2l0Rm5DYWNoZVskZnVuY05hbWVdKSApewoJCQkJCSR0aGlzLT4kZnVuY05hbWUoICRub2RlICk7CgkJCQl9CgkJCX0KCgkJfWVsc2V7CgkJCSRub2RlLT5hY2NlcHQoJHRoaXMpOwoJCX0KCgkJcmV0dXJuICRub2RlOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiB2aXNpdEFycmF5KCAkbm9kZXMgKXsKCgkJJG5ld05vZGVzID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRub2RlcyBhcyAkbm9kZSl7CgkJCSRldmFsZCA9ICR0aGlzLT52aXNpdE9iaigkbm9kZSk7CgkJCWlmKCAkZXZhbGQgKXsKCQkJCWlmKCBpc19hcnJheSgkZXZhbGQpICl7CgkJCQkJc2VsZjo6ZmxhdHRlbigkZXZhbGQsJG5ld05vZGVzKTsKCQkJCX1lbHNlewoJCQkJCSRuZXdOb2Rlc1tdID0gJGV2YWxkOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiAkbmV3Tm9kZXM7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGZsYXR0ZW4oICRhcnIsICYkb3V0ICl7CgoJCWZvcmVhY2goJGFyciBhcyAkaXRlbSl7CgkJCWlmKCAhaXNfYXJyYXkoJGl0ZW0pICl7CgkJCQkkb3V0W10gPSAkaXRlbTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlmb3JlYWNoKCRpdGVtIGFzICRuZXN0ZWRJdGVtKXsKCQkJCWlmKCBpc19hcnJheSgkbmVzdGVkSXRlbSkgKXsKCQkJCQlzZWxmOjpmbGF0dGVuKCAkbmVzdGVkSXRlbSwgJG91dCk7CgkJCQl9ZWxzZXsKCQkJCQkkb3V0W10gPSAkbmVzdGVkSXRlbTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuICRvdXQ7Cgl9Cgp9CgoKIA0KDQovKioNCiAqIENvbmZpZ3VyYWJsZQ0KICoNCiAqIEBwYWNrYWdlIExlc3MNCiAqIEBzdWJwYWNrYWdlIENvcmUNCiAqLw0KYWJzdHJhY3QgY2xhc3MgTGVzc19Db25maWd1cmFibGUgew0KDQoJLyoqDQoJICogQXJyYXkgb2Ygb3B0aW9ucw0KCSAqDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByb3RlY3RlZCAkb3B0aW9ucyA9IGFycmF5KCk7DQoNCgkvKioNCgkgKiBBcnJheSBvZiBkZWZhdWx0IG9wdGlvbnMNCgkgKg0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcm90ZWN0ZWQgJGRlZmF1bHRPcHRpb25zID0gYXJyYXkoKTsNCg0KDQoJLyoqDQoJICogU2V0IG9wdGlvbnMNCgkgKg0KCSAqIElmICRvcHRpb25zIGlzIGFuIG9iamVjdCBpdCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGFuIGFycmF5IGJ5IGNhbGxlZA0KCSAqIGl0J3MgdG9BcnJheSBtZXRob2QuDQoJICoNCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KCSAqIEBwYXJhbSBhcnJheXxvYmplY3QgJG9wdGlvbnMNCgkgKg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb25zKCRvcHRpb25zKXsNCgkJJG9wdGlvbnMgPSBhcnJheV9pbnRlcnNlY3Rfa2V5KCRvcHRpb25zLCR0aGlzLT5kZWZhdWx0T3B0aW9ucyk7DQoJCSR0aGlzLT5vcHRpb25zID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmRlZmF1bHRPcHRpb25zLCAkdGhpcy0+b3B0aW9ucywgJG9wdGlvbnMpOw0KCX0NCg0KDQoJLyoqDQoJICogR2V0IGFuIG9wdGlvbiB2YWx1ZSBieSBuYW1lDQoJICoNCgkgKiBJZiB0aGUgb3B0aW9uIGlzIGVtcHR5IG9yIG5vdCBzZXQgYSBOVUxMIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQuDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lDQoJICogQHBhcmFtIG1peGVkICRkZWZhdWx0IERlZmF1bHQgdmFsdWUgaWYgY29uZml1cmF0aW9uIG9mICRuYW1lIGlzIG5vdCBwcmVzZW50DQoJICogQHJldHVybiBtaXhlZA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb24oJG5hbWUsICRkZWZhdWx0ID0gbnVsbCl7DQoJCWlmKGlzc2V0KCR0aGlzLT5vcHRpb25zWyRuYW1lXSkpew0KCQkJcmV0dXJuICR0aGlzLT5vcHRpb25zWyRuYW1lXTsNCgkJfQ0KCQlyZXR1cm4gJGRlZmF1bHQ7DQoJfQ0KDQoNCgkvKioNCgkgKiBTZXQgYW4gb3B0aW9uDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lDQoJICogQHBhcmFtIG1peGVkICR2YWx1ZQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb24oJG5hbWUsICR2YWx1ZSl7DQoJCSR0aGlzLT5vcHRpb25zWyRuYW1lXSA9ICR2YWx1ZTsNCgl9DQoNCn0gCgovKioKICogQWxwaGEKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfQWxwaGEgZXh0ZW5kcyBMZXNzX1RyZWV7CglwdWJsaWMgJHZhbHVlOwoJcHVibGljICR0eXBlID0gJ0FscGhhJzsKCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHZhbCl7CgkJJHRoaXMtPnZhbHVlID0gJHZhbDsKCX0KCgkvL2Z1bmN0aW9uIGFjY2VwdCggJHZpc2l0b3IgKXsKCS8vCSR0aGlzLT52YWx1ZSA9ICR2aXNpdG9yLT52aXNpdCggJHRoaXMtPnZhbHVlICk7CgkvL30KCglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkZW52KXsKCgkJaWYoIGlzX29iamVjdCgkdGhpcy0+dmFsdWUpICl7CgkJCSR0aGlzLT52YWx1ZSA9ICR0aGlzLT52YWx1ZS0+Y29tcGlsZSgkZW52KTsKCQl9CgoJCXJldHVybiAkdGhpczsKCX0KCiAgICAvKioKICAgICAqIEBzZWUgTGVzc19UcmVlOjpnZW5DU1MKICAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdlbkNTUyggJG91dHB1dCApewoKCQkkb3V0cHV0LT5hZGQoICJhbHBoYShvcGFjaXR5PSIgKTsKCgkJaWYoIGlzX3N0cmluZygkdGhpcy0+dmFsdWUpICl7CgkJCSRvdXRwdXQtPmFkZCggJHRoaXMtPnZhbHVlICk7CgkJfWVsc2V7CgkJCSR0aGlzLT52YWx1ZS0+Z2VuQ1NTKCAkb3V0cHV0KTsKCQl9CgoJCSRvdXRwdXQtPmFkZCggJyknICk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHRvQ1NTKCl7CgkJcmV0dXJuICJhbHBoYShvcGFjaXR5PSIgLiAoaXNfc3RyaW5nKCR0aGlzLT52YWx1ZSkgPyAkdGhpcy0+dmFsdWUgOiAkdGhpcy0+dmFsdWUtPnRvQ1NTKCkpIC4gIikiOwoJfQoKCn0gCgovKioKICogQW5vbnltb3VzCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdHJlZQogKi8KY2xhc3MgTGVzc19UcmVlX0Fub255bW91cyBleHRlbmRzIExlc3NfVHJlZXsKCXB1YmxpYyAkdmFsdWU7CglwdWJsaWMgJHF1b3RlOwoJcHVibGljICRpbmRleDsKCXB1YmxpYyAkbWFwTGluZXM7CglwdWJsaWMgJGN1cnJlbnRGaWxlSW5mbzsKCXB1YmxpYyAkdHlwZSA9ICdBbm9ueW1vdXMnOwoKCS8qKgoJICogQHBhcmFtIGludGVnZXIgJGluZGV4CgkgKiBAcGFyYW0gYm9vbGVhbiAkbWFwTGluZXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR2YWx1ZSwgJGluZGV4ID0gbnVsbCwgJGN1cnJlbnRGaWxlSW5mbyA9IG51bGwsICRtYXBMaW5lcyA9IG51bGwgKXsKCQkkdGhpcy0+dmFsdWUgPSAkdmFsdWU7CgkJJHRoaXMtPmluZGV4ID0gJGluZGV4OwoJCSR0aGlzLT5tYXBMaW5lcyA9ICRtYXBMaW5lczsKCQkkdGhpcy0+Y3VycmVudEZpbGVJbmZvID0gJGN1cnJlbnRGaWxlSW5mbzsKCX0KCglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgpewoJCXJldHVybiBuZXcgTGVzc19UcmVlX0Fub255bW91cygkdGhpcy0+dmFsdWUsICR0aGlzLT5pbmRleCwgJHRoaXMtPmN1cnJlbnRGaWxlSW5mbywgJHRoaXMtPm1hcExpbmVzKTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGFyZSgkeCl7CgkJaWYoICFpc19vYmplY3QoJHgpICl7CgkJCXJldHVybiAtMTsKCQl9CgoJCSRsZWZ0ID0gJHRoaXMtPnRvQ1NTKCk7CgkJJHJpZ2h0ID0gJHgtPnRvQ1NTKCk7CgoJCWlmKCAkbGVmdCA9PT0gJHJpZ2h0ICl7CgkJCXJldHVybiAwOwoJCX0KCgkJcmV0dXJuICRsZWZ0IDwgJHJpZ2h0ID8gLTEgOiAxOwoJfQoKICAgIC8qKgogICAgICogQHNlZSBMZXNzX1RyZWU6OmdlbkNTUwogICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2VuQ1NTKCAkb3V0cHV0ICl7CgkJJG91dHB1dC0+YWRkKCAkdGhpcy0+dmFsdWUsICR0aGlzLT5jdXJyZW50RmlsZUluZm8sICR0aGlzLT5pbmRleCwgJHRoaXMtPm1hcExpbmVzICk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHRvQ1NTKCl7CgkJcmV0dXJuICR0aGlzLT52YWx1ZTsKCX0KCn0KIAoKLyoqCiAqIEFzc2lnbm1lbnQKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfQXNzaWdubWVudCBleHRlbmRzIExlc3NfVHJlZXsKCglwdWJsaWMgJGtleTsKCXB1YmxpYyAkdmFsdWU7CglwdWJsaWMgJHR5cGUgPSAnQXNzaWdubWVudCc7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRrZXksICR2YWwpIHsKCQkkdGhpcy0+a2V5ID0gJGtleTsKCQkkdGhpcy0+dmFsdWUgPSAkdmFsOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoICR2aXNpdG9yICl7CgkJJHRoaXMtPnZhbHVlID0gJHZpc2l0b3ItPnZpc2l0T2JqKCAkdGhpcy0+dmFsdWUgKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkZW52KSB7CgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfQXNzaWdubWVudCggJHRoaXMtPmtleSwgJHRoaXMtPnZhbHVlLT5jb21waWxlKCRlbnYpKTsKCX0KCiAgICAvKioKICAgICAqIEBzZWUgTGVzc19UcmVlOjpnZW5DU1MKICAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdlbkNTUyggJG91dHB1dCApewoJCSRvdXRwdXQtPmFkZCggJHRoaXMtPmtleSAuICc9JyApOwoJCSR0aGlzLT52YWx1ZS0+Z2VuQ1NTKCAkb3V0cHV0ICk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHRvQ3NzKCl7CgkJcmV0dXJuICR0aGlzLT5rZXkgLiAnPScgLiAkdGhpcy0+dmFsdWUtPnRvQ1NTKCk7Cgl9Cn0KIAoKLyoqCiAqIEF0dHJpYnV0ZQogKgogKiBAcGFja2FnZSBMZXNzCiAqIEBzdWJwYWNrYWdlIHRyZWUKICovCmNsYXNzIExlc3NfVHJlZV9BdHRyaWJ1dGUgZXh0ZW5kcyBMZXNzX1RyZWV7CgoJcHVibGljICRrZXk7CglwdWJsaWMgJG9wOwoJcHVibGljICR2YWx1ZTsKCXB1YmxpYyAkdHlwZSA9ICdBdHRyaWJ1dGUnOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgka2V5LCAkb3AsICR2YWx1ZSl7CgkJJHRoaXMtPmtleSA9ICRrZXk7CgkJJHRoaXMtPm9wID0gJG9wOwoJCSR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkZW52KXsKCgkJJGtleV9vYmogPSBpc19vYmplY3QoJHRoaXMtPmtleSk7CgkJJHZhbF9vYmogPSBpc19vYmplY3QoJHRoaXMtPnZhbHVlKTsKCgkJaWYoICEka2V5X29iaiAmJiAhJHZhbF9vYmogKXsKCQkJcmV0dXJuICR0aGlzOwoJCX0KCgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfQXR0cmlidXRlKAoJCQkka2V5X29iaiA/ICR0aGlzLT5rZXktPmNvbXBpbGUoJGVudikgOiAkdGhpcy0+a2V5ICwKCQkJJHRoaXMtPm9wLAoJCQkkdmFsX29iaiA/ICR0aGlzLT52YWx1ZS0+Y29tcGlsZSgkZW52KSA6ICR0aGlzLT52YWx1ZSk7Cgl9CgogICAgLyoqCiAgICAgKiBAc2VlIExlc3NfVHJlZTo6Z2VuQ1NTCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZW5DU1MoICRvdXRwdXQgKXsKCQkkb3V0cHV0LT5hZGQoICR0aGlzLT50b0NTUygpICk7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIHRvQ1NTKCl7CgkJJHZhbHVlID0gJHRoaXMtPmtleTsKCgkJaWYoICR0aGlzLT5vcCApewoJCQkkdmFsdWUgLj0gJHRoaXMtPm9wOwoJCQkkdmFsdWUgLj0gKGlzX29iamVjdCgkdGhpcy0+dmFsdWUpID8gJHRoaXMtPnZhbHVlLT50b0NTUygpIDogJHRoaXMtPnZhbHVlKTsKCQl9CgoJCXJldHVybiAnWycgLiAkdmFsdWUgLiAnXSc7Cgl9Cn0gCgoKLyoqCiAqIENhbGwKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfQ2FsbCBleHRlbmRzIExlc3NfVHJlZXsKICAgIHB1YmxpYyAkdmFsdWU7CgogICAgcHJvdGVjdGVkICRuYW1lOwogICAgcHJvdGVjdGVkICRhcmdzOwogICAgcHJvdGVjdGVkICRpbmRleDsKICAgIHByb3RlY3RlZCAkY3VycmVudEZpbGVJbmZvOwogICAgcHVibGljICR0eXBlID0gJ0NhbGwnOwoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbmFtZSwgJGFyZ3MsICRpbmRleCwgJGN1cnJlbnRGaWxlSW5mbyA9IG51bGwgKXsKCQkkdGhpcy0+bmFtZSA9ICRuYW1lOwoJCSR0aGlzLT5hcmdzID0gJGFyZ3M7CgkJJHRoaXMtPmluZGV4ID0gJGluZGV4OwoJCSR0aGlzLT5jdXJyZW50RmlsZUluZm8gPSAkY3VycmVudEZpbGVJbmZvOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoICR2aXNpdG9yICl7CgkJJHRoaXMtPmFyZ3MgPSAkdmlzaXRvci0+dmlzaXRBcnJheSggJHRoaXMtPmFyZ3MgKTsKCX0KCiAgICAvLwogICAgLy8gV2hlbiBldmFsdWF0aW5nIGEgZnVuY3Rpb24gY2FsbCwKICAgIC8vIHdlIGVpdGhlciBmaW5kIHRoZSBmdW5jdGlvbiBpbiBgdHJlZS5mdW5jdGlvbnNgIFsxXSwKICAgIC8vIGluIHdoaWNoIGNhc2Ugd2UgY2FsbCBpdCwgcGFzc2luZyB0aGUgIGV2YWx1YXRlZCBhcmd1bWVudHMsCiAgICAvLyBvciB3ZSBzaW1wbHkgcHJpbnQgaXQgb3V0IGFzIGl0IGFwcGVhcmVkIG9yaWdpbmFsbHkgWzJdLgogICAgLy8KICAgIC8vIFRoZSAqZnVuY3Rpb25zLmpzKiBmaWxlIGNvbnRhaW5zIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMuCiAgICAvLwogICAgLy8gVGhlIHJlYXNvbiB3aHkgd2UgZXZhbHVhdGUgdGhlIGFyZ3VtZW50cywgaXMgaW4gdGhlIGNhc2Ugd2hlcmUKICAgIC8vIHdlIHRyeSB0byBwYXNzIGEgdmFyaWFibGUgdG8gYSBmdW5jdGlvbiwgbGlrZTogYHNhdHVyYXRlKEBjb2xvcilgLgogICAgLy8gVGhlIGZ1bmN0aW9uIHNob3VsZCByZWNlaXZlIHRoZSB2YWx1ZSwgbm90IHRoZSB2YXJpYWJsZS4KICAgIC8vCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkZW52PW51bGwpewoJCSRhcmdzID0gYXJyYXkoKTsKCQlmb3JlYWNoKCR0aGlzLT5hcmdzIGFzICRhKXsKCQkJJGFyZ3NbXSA9ICRhLT5jb21waWxlKCRlbnYpOwoJCX0KCgkJJG5hbWVMQyA9IHN0cnRvbG93ZXIoJHRoaXMtPm5hbWUpOwoJCXN3aXRjaCgkbmFtZUxDKXsKCQkJY2FzZSAnJSc6CgkJCSRuYW1lTEMgPSAnX3BlcmNlbnQnOwoJCQlicmVhazsKCgkJCWNhc2UgJ2dldC11bml0JzoKCQkJJG5hbWVMQyA9ICdnZXR1bml0JzsKCQkJYnJlYWs7CgoJCQljYXNlICdkYXRhLXVyaSc6CgkJCSRuYW1lTEMgPSAnZGF0YXVyaSc7CgkJCWJyZWFrOwoKCQkJY2FzZSAnc3ZnLWdyYWRpZW50JzoKCQkJJG5hbWVMQyA9ICdzdmdncmFkaWVudCc7CgkJCWJyZWFrOwoJCX0KCgkJJHJlc3VsdCA9IG51bGw7CgkJaWYoICRuYW1lTEMgPT09ICdkZWZhdWx0JyApewoJCQkkcmVzdWx0ID0gTGVzc19UcmVlX0RlZmF1bHRGdW5jOjpjb21waWxlKCk7CgoJCX1lbHNlewoKCQkJaWYoIG1ldGhvZF9leGlzdHMoJ0xlc3NfRnVuY3Rpb25zJywkbmFtZUxDKSApeyAvLyAxLgoJCQkJdHJ5IHsKCgkJCQkJJGZ1bmMgPSBuZXcgTGVzc19GdW5jdGlvbnMoJGVudiwgJHRoaXMtPmN1cnJlbnRGaWxlSW5mbyk7CgkJCQkJJHJlc3VsdCA9IGNhbGxfdXNlcl9mdW5jX2FycmF5KCBhcnJheSgkZnVuYywkbmFtZUxDKSwkYXJncyk7CgoJCQkJfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CgkJCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdlcnJvciBldmFsdWF0aW5nIGZ1bmN0aW9uIGAnIC4gJHRoaXMtPm5hbWUgLiAnYCAnLiRlLT5nZXRNZXNzYWdlKCkuJyBpbmRleDogJy4gJHRoaXMtPmluZGV4KTsKCQkJCX0KCQkJfSBlbHNlaWYoIGlzc2V0KCAkZW52LT5mdW5jdGlvbnNbJG5hbWVMQ10gKSAmJiBpc19jYWxsYWJsZSggJGVudi0+ZnVuY3Rpb25zWyRuYW1lTENdICkgKSB7CgkJCQl0cnkgewoJCQkJCSRyZXN1bHQgPSBjYWxsX3VzZXJfZnVuY19hcnJheSggJGVudi0+ZnVuY3Rpb25zWyRuYW1lTENdLCAkYXJncyApOwoJCQkJfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CgkJCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdlcnJvciBldmFsdWF0aW5nIGZ1bmN0aW9uIGAnIC4gJHRoaXMtPm5hbWUgLiAnYCAnLiRlLT5nZXRNZXNzYWdlKCkuJyBpbmRleDogJy4gJHRoaXMtPmluZGV4KTsKCQkJCX0KCQkJfQoJCX0KCgkJaWYoICRyZXN1bHQgIT09IG51bGwgKXsKCQkJcmV0dXJuICRyZXN1bHQ7CgkJfQoKCgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfQ2FsbCggJHRoaXMtPm5hbWUsICRhcmdzLCAkdGhpcy0+aW5kZXgsICR0aGlzLT5jdXJyZW50RmlsZUluZm8gKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBzZWUgTGVzc19UcmVlOjpnZW5DU1MKICAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdlbkNTUyggJG91dHB1dCApewoKCQkkb3V0cHV0LT5hZGQoICR0aGlzLT5uYW1lIC4gJygnLCAkdGhpcy0+Y3VycmVudEZpbGVJbmZvLCAkdGhpcy0+aW5kZXggKTsKCQkkYXJnc19sZW4gPSBjb3VudCgkdGhpcy0+YXJncyk7CgkJZm9yKCRpID0gMDsgJGkgPCAkYXJnc19sZW47ICRpKysgKXsKCQkJJHRoaXMtPmFyZ3NbJGldLT5nZW5DU1MoICRvdXRwdXQgKTsKCQkJaWYoICRpICsgMSA8ICRhcmdzX2xlbiApewoJCQkJJG91dHB1dC0+YWRkKCAnLCAnICk7CgkJCX0KCQl9CgoJCSRvdXRwdXQtPmFkZCggJyknICk7Cgl9CgoKICAgIC8vcHVibGljIGZ1bmN0aW9uIHRvQ1NTKCl7CiAgICAvLyAgICByZXR1cm4gJHRoaXMtPmNvbXBpbGUoKS0+dG9DU1MoKTsKICAgIC8vfQoKfQogCgovKioKICogQ29sb3IKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfQ29sb3IgZXh0ZW5kcyBMZXNzX1RyZWV7CglwdWJsaWMgJHJnYjsKCXB1YmxpYyAkYWxwaGE7CglwdWJsaWMgJGlzVHJhbnNwYXJlbnRLZXl3b3JkOwoJcHVibGljICR0eXBlID0gJ0NvbG9yJzsKCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHJnYiwgJGEgPSAxLCAkaXNUcmFuc3BhcmVudEtleXdvcmQgPSBudWxsICl7CgoJCWlmKCAkaXNUcmFuc3BhcmVudEtleXdvcmQgKXsKCQkJJHRoaXMtPnJnYiA9ICRyZ2I7CgkJCSR0aGlzLT5hbHBoYSA9ICRhOwoJCQkkdGhpcy0+aXNUcmFuc3BhcmVudEtleXdvcmQgPSB0cnVlOwoJCQlyZXR1cm47CgkJfQoKCQkkdGhpcy0+cmdiID0gYXJyYXkoKTsKCQlpZiggaXNfYXJyYXkoJHJnYikgKXsKCQkJJHRoaXMtPnJnYiA9ICRyZ2I7CgkJfWVsc2UgaWYoIHN0cmxlbigkcmdiKSA9PSA2ICl7CgkJCWZvcmVhY2goc3RyX3NwbGl0KCRyZ2IsIDIpIGFzICRjKXsKCQkJCSR0aGlzLT5yZ2JbXSA9IGhleGRlYygkYyk7CgkJCX0KCQl9ZWxzZXsKCQkJZm9yZWFjaChzdHJfc3BsaXQoJHJnYiwgMSkgYXMgJGMpewoJCQkJJHRoaXMtPnJnYltdID0gaGV4ZGVjKCRjLiRjKTsKCQkJfQoJCX0KCQkkdGhpcy0+YWxwaGEgPSBpc19udW1lcmljKCRhKSA/ICRhIDogMTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgpewoJCXJldHVybiAkdGhpczsKCX0KCglwdWJsaWMgZnVuY3Rpb24gbHVtYSgpewoJCSRyID0gJHRoaXMtPnJnYlswXSAvIDI1NTsKCQkkZyA9ICR0aGlzLT5yZ2JbMV0gLyAyNTU7CgkJJGIgPSAkdGhpcy0+cmdiWzJdIC8gMjU1OwoKCQkkciA9ICgkciA8PSAwLjAzOTI4KSA/ICRyIC8gMTIuOTIgOiBwb3coKCgkciArIDAuMDU1KSAvIDEuMDU1KSwgMi40KTsKCQkkZyA9ICgkZyA8PSAwLjAzOTI4KSA/ICRnIC8gMTIuOTIgOiBwb3coKCgkZyArIDAuMDU1KSAvIDEuMDU1KSwgMi40KTsKCQkkYiA9ICgkYiA8PSAwLjAzOTI4KSA/ICRiIC8gMTIuOTIgOiBwb3coKCgkYiArIDAuMDU1KSAvIDEuMDU1KSwgMi40KTsKCgkJcmV0dXJuIDAuMjEyNiAqICRyICsgMC43MTUyICogJGcgKyAwLjA3MjIgKiAkYjsKCX0KCgkvKioKCSAqIEBzZWUgTGVzc19UcmVlOjpnZW5DU1MKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdlbkNTUyggJG91dHB1dCApewoJCSRvdXRwdXQtPmFkZCggJHRoaXMtPnRvQ1NTKCkgKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdG9DU1MoICRkb05vdENvbXByZXNzID0gZmFsc2UgKXsKCQkkY29tcHJlc3MgPSBMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ2NvbXByZXNzJ10gJiYgISRkb05vdENvbXByZXNzOwoJCSRhbHBoYSA9IExlc3NfRnVuY3Rpb25zOjpmcm91bmQoICR0aGlzLT5hbHBoYSApOwoKCgkJLy8KCQkvLyBJZiB3ZSBoYXZlIHNvbWUgdHJhbnNwYXJlbmN5LCB0aGUgb25seSB3YXkgdG8gcmVwcmVzZW50IGl0CgkJLy8gaXMgdmlhIGByZ2JhYC4gT3RoZXJ3aXNlLCB3ZSB1c2UgdGhlIGhleCByZXByZXNlbnRhdGlvbiwKCQkvLyB3aGljaCBoYXMgYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBicm93c2Vycy4KCQkvLyBWYWx1ZXMgYXJlIGNhcHBlZCBiZXR3ZWVuIGAwYCBhbmQgYDI1NWAsIHJvdW5kZWQgYW5kIHplcm8tcGFkZGVkLgoJCS8vCgkJaWYoICRhbHBoYSA8IDEgKXsKCQkJaWYoICggJGFscGhhID09PSAwIHx8ICRhbHBoYSA9PT0gMC4wICkgJiYgaXNzZXQoJHRoaXMtPmlzVHJhbnNwYXJlbnRLZXl3b3JkKSAmJiAkdGhpcy0+aXNUcmFuc3BhcmVudEtleXdvcmQgKXsKCQkJCXJldHVybiAndHJhbnNwYXJlbnQnOwoJCQl9CgoJCQkkdmFsdWVzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCgkdGhpcy0+cmdiIGFzICRjKXsKCQkJCSR2YWx1ZXNbXSA9IExlc3NfRnVuY3Rpb25zOjpjbGFtcCggcm91bmQoJGMpLCAyNTUpOwoJCQl9CgkJCSR2YWx1ZXNbXSA9ICRhbHBoYTsKCgkJCSRnbHVlID0gKCRjb21wcmVzcyA/ICcsJyA6ICcsICcpOwoJCQlyZXR1cm4gInJnYmEoIiAuIGltcGxvZGUoJGdsdWUsICR2YWx1ZXMpIC4gIikiOwoJCX1lbHNlewoKCQkJJGNvbG9yID0gJHRoaXMtPnRvUkdCKCk7CgoJCQlpZiggJGNvbXByZXNzICl7CgoJCQkJLy8gQ29udmVydCBjb2xvciB0byBzaG9ydCBmb3JtYXQKCQkJCWlmKCAkY29sb3JbMV0gPT09ICRjb2xvclsyXSAmJiAkY29sb3JbM10gPT09ICRjb2xvcls0XSAmJiAkY29sb3JbNV0gPT09ICRjb2xvcls2XSkgewoJCQkJCSRjb2xvciA9ICcjJy4kY29sb3JbMV0gLiAkY29sb3JbM10gLiAkY29sb3JbNV07CgkJCQl9CgkJCX0KCgkJCXJldHVybiAkY29sb3I7CgkJfQoJfQoKCS8vCgkvLyBPcGVyYXRpb25zIGhhdmUgdG8gYmUgZG9uZSBwZXItY2hhbm5lbCwgaWYgbm90LAoJLy8gY2hhbm5lbHMgd2lsbCBzcGlsbCBvbnRvIGVhY2ggb3RoZXIuIE9uY2Ugd2UgaGF2ZQoJLy8gb3VyIHJlc3VsdCwgaW4gdGhlIGZvcm0gb2YgYW4gaW50ZWdlciB0cmlwbGV0LAoJLy8gd2UgY3JlYXRlIGEgbmV3IENvbG9yIG5vZGUgdG8gaG9sZCB0aGUgcmVzdWx0LgoJLy8KCgkvKioKCSAqIEBwYXJhbSBzdHJpbmcgJG9wCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBvcGVyYXRlKCAkb3AsICRvdGhlcikgewoJCSRyZ2IgPSBhcnJheSgpOwoJCSRhbHBoYSA9ICR0aGlzLT5hbHBoYSAqICgxIC0gJG90aGVyLT5hbHBoYSkgKyAkb3RoZXItPmFscGhhOwoJCWZvciAoJGMgPSAwOyAkYyA8IDM7ICRjKyspIHsKCQkJJHJnYlskY10gPSBMZXNzX0Z1bmN0aW9uczo6b3BlcmF0ZSggJG9wLCAkdGhpcy0+cmdiWyRjXSwgJG90aGVyLT5yZ2JbJGNdKTsKCQl9CgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfQ29sb3IoJHJnYiwgJGFscGhhKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdG9SR0IoKXsKCQlyZXR1cm4gJHRoaXMtPnRvSGV4KCR0aGlzLT5yZ2IpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiB0b0hTTCgpewoJCSRyID0gJHRoaXMtPnJnYlswXSAvIDI1NTsKCQkkZyA9ICR0aGlzLT5yZ2JbMV0gLyAyNTU7CgkJJGIgPSAkdGhpcy0+cmdiWzJdIC8gMjU1OwoJCSRhID0gJHRoaXMtPmFscGhhOwoKCQkkbWF4ID0gbWF4KCRyLCAkZywgJGIpOwoJCSRtaW4gPSBtaW4oJHIsICRnLCAkYik7CgkJJGwgPSAoJG1heCArICRtaW4pIC8gMjsKCQkkZCA9ICRtYXggLSAkbWluOwoKCQkkaCA9ICRzID0gMDsKCQlpZiggJG1heCAhPT0gJG1pbiApewoJCQkkcyA9ICRsID4gMC41ID8gJGQgLyAoMiAtICRtYXggLSAkbWluKSA6ICRkIC8gKCRtYXggKyAkbWluKTsKCgkJCXN3aXRjaCAoJG1heCkgewoJCQkJY2FzZSAkcjogJGggPSAoJGcgLSAkYikgLyAkZCArICgkZyA8ICRiID8gNiA6IDApOyBicmVhazsKCQkJCWNhc2UgJGc6ICRoID0gKCRiIC0gJHIpIC8gJGQgKyAyOwkJCQkgYnJlYWs7CgkJCQljYXNlICRiOiAkaCA9ICgkciAtICRnKSAvICRkICsgNDsJCQkJIGJyZWFrOwoJCQl9CgkJCSRoIC89IDY7CgkJfQoJCXJldHVybiBhcnJheSgnaCcgPT4gJGggKiAzNjAsICdzJyA9PiAkcywgJ2wnID0+ICRsLCAnYScgPT4gJGEgKTsKCX0KCgkvL0FkYXB0ZWQgZnJvbSBodHRwOi8vbWppamFja3Nvbi5jb20vMjAwOC8wMi9yZ2ItdG8taHNsLWFuZC1yZ2ItdG8taHN2LWNvbG9yLW1vZGVsLWNvbnZlcnNpb24tYWxnb3JpdGhtcy1pbi1qYXZhc2NyaXB0CiAgICBwdWJsaWMgZnVuY3Rpb24gdG9IU1YoKSB7CgkJJHIgPSAkdGhpcy0+cmdiWzBdIC8gMjU1OwoJCSRnID0gJHRoaXMtPnJnYlsxXSAvIDI1NTsKCQkkYiA9ICR0aGlzLT5yZ2JbMl0gLyAyNTU7CgkJJGEgPSAkdGhpcy0+YWxwaGE7CgoJCSRtYXggPSBtYXgoJHIsICRnLCAkYik7CgkJJG1pbiA9IG1pbigkciwgJGcsICRiKTsKCgkJJHYgPSAkbWF4OwoKCQkkZCA9ICRtYXggLSAkbWluOwoJCWlmICgkbWF4ID09PSAwKSB7CgkJCSRzID0gMDsKCQl9IGVsc2UgewoJCQkkcyA9ICRkIC8gJG1heDsKCQl9CgoJCSRoID0gMDsKCQlpZiggJG1heCAhPT0gJG1pbiApewoJCQlzd2l0Y2goJG1heCl7CgkJCQljYXNlICRyOiAkaCA9ICgkZyAtICRiKSAvICRkICsgKCRnIDwgJGIgPyA2IDogMCk7IGJyZWFrOwoJCQkJY2FzZSAkZzogJGggPSAoJGIgLSAkcikgLyAkZCArIDI7IGJyZWFrOwoJCQkJY2FzZSAkYjogJGggPSAoJHIgLSAkZykgLyAkZCArIDQ7IGJyZWFrOwoJCQl9CgkJCSRoIC89IDY7CgkJfQoJCXJldHVybiBhcnJheSgnaCc9PiAkaCAqIDM2MCwgJ3MnPT4gJHMsICd2Jz0+ICR2LCAnYScgPT4gJGEgKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdG9BUkdCKCl7CgkJJGFyZ2IgPSBhcnJheV9tZXJnZSggKGFycmF5KSBMZXNzX1BhcnNlcjo6cm91bmQoJHRoaXMtPmFscGhhICogMjU1KSwgJHRoaXMtPnJnYik7CgkJcmV0dXJuICR0aGlzLT50b0hleCggJGFyZ2IgKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gY29tcGFyZSgkeCl7CgoJCWlmKCAhcHJvcGVydHlfZXhpc3RzKCAkeCwgJ3JnYicgKSApewoJCQlyZXR1cm4gLTE7CgkJfQoKCgkJcmV0dXJuICgkeC0+cmdiWzBdID09PSAkdGhpcy0+cmdiWzBdICYmCgkJCSR4LT5yZ2JbMV0gPT09ICR0aGlzLT5yZ2JbMV0gJiYKCQkJJHgtPnJnYlsyXSA9PT0gJHRoaXMtPnJnYlsyXSAmJgoJCQkkeC0+YWxwaGEgPT09ICR0aGlzLT5hbHBoYSkgPyAwIDogLTE7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIHRvSGV4KCAkdiApewoKCQkkcmV0ID0gJyMnOwoJCWZvcmVhY2goJHYgYXMgJGMpewoJCQkkYyA9IExlc3NfRnVuY3Rpb25zOjpjbGFtcCggTGVzc19QYXJzZXI6OnJvdW5kKCRjKSwgMjU1KTsKCQkJaWYoICRjIDwgMTYgKXsKCQkJCSRyZXQgLj0gJzAnOwoJCQl9CgkJCSRyZXQgLj0gZGVjaGV4KCRjKTsKCQl9CgoJCXJldHVybiAkcmV0OwoJfQoKCgkvKioKCSAqIEBwYXJhbSBzdHJpbmcgJGtleXdvcmQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tS2V5d29yZCggJGtleXdvcmQgKXsKCQkka2V5d29yZCA9IHN0cnRvbG93ZXIoJGtleXdvcmQpOwoKCQlpZiggTGVzc19Db2xvcnM6Omhhc093blByb3BlcnR5KCRrZXl3b3JkKSApewoJCQkvLyBkZXRlY3QgbmFtZWQgY29sb3IKCQkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfQ29sb3Ioc3Vic3RyKExlc3NfQ29sb3JzOjpjb2xvcigka2V5d29yZCksIDEpKTsKCQl9CgoJCWlmKCAka2V5d29yZCA9PT0gJ3RyYW5zcGFyZW50JyApewoJCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9Db2xvciggYXJyYXkoMCwgMCwgMCksIDAsIHRydWUpOwoJCX0KCX0KCn0KIAoKLyoqCiAqIENvbW1lbnQKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfQ29tbWVudCBleHRlbmRzIExlc3NfVHJlZXsKCglwdWJsaWMgJHZhbHVlOwoJcHVibGljICRzaWxlbnQ7CglwdWJsaWMgJGlzUmVmZXJlbmNlZDsKCXB1YmxpYyAkY3VycmVudEZpbGVJbmZvOwoJcHVibGljICR0eXBlID0gJ0NvbW1lbnQnOwoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmFsdWUsICRzaWxlbnQsICRpbmRleCA9IG51bGwsICRjdXJyZW50RmlsZUluZm8gPSBudWxsICl7CgkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoJCSR0aGlzLT5zaWxlbnQgPSAhISAkc2lsZW50OwoJCSR0aGlzLT5jdXJyZW50RmlsZUluZm8gPSAkY3VycmVudEZpbGVJbmZvOwoJfQoKICAgIC8qKgogICAgICogQHNlZSBMZXNzX1RyZWU6OmdlbkNTUwogICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2VuQ1NTKCAkb3V0cHV0ICl7CgkJLy9pZiggJHRoaXMtPmRlYnVnSW5mbyApewoJCQkvLyRvdXRwdXQtPmFkZCggdHJlZS5kZWJ1Z0luZm8oJGVudiwgJHRoaXMpLCAkdGhpcy0+Y3VycmVudEZpbGVJbmZvLCAkdGhpcy0+aW5kZXgpOwoJCS8vfQoJCSRvdXRwdXQtPmFkZCggdHJpbSgkdGhpcy0+dmFsdWUpICk7Ly9UT0RPIHNob3VsZG4ndCBuZWVkIHRvIHRyaW0sIHdlIHNob3VsZG4ndCBncmFiIHRoZSBcbgoJfQoKCXB1YmxpYyBmdW5jdGlvbiB0b0NTUygpewoJCXJldHVybiBMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ2NvbXByZXNzJ10gPyAnJyA6ICR0aGlzLT52YWx1ZTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gaXNTaWxlbnQoKXsKCQkkaXNSZWZlcmVuY2UgPSAoJHRoaXMtPmN1cnJlbnRGaWxlSW5mbyAmJiBpc3NldCgkdGhpcy0+Y3VycmVudEZpbGVJbmZvWydyZWZlcmVuY2UnXSkgJiYgKCFpc3NldCgkdGhpcy0+aXNSZWZlcmVuY2VkKSB8fCAhJHRoaXMtPmlzUmVmZXJlbmNlZCkgKTsKCQkkaXNDb21wcmVzc2VkID0gTGVzc19QYXJzZXI6OiRvcHRpb25zWydjb21wcmVzcyddICYmICFwcmVnX21hdGNoKCcvXlwvXCohLycsICR0aGlzLT52YWx1ZSk7CgkJcmV0dXJuICR0aGlzLT5zaWxlbnQgfHwgJGlzUmVmZXJlbmNlIHx8ICRpc0NvbXByZXNzZWQ7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoKXsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIG1hcmtSZWZlcmVuY2VkKCl7CgkJJHRoaXMtPmlzUmVmZXJlbmNlZCA9IHRydWU7Cgl9Cgp9CiAKCi8qKgogKiBDb25kaXRpb24KICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfQ29uZGl0aW9uIGV4dGVuZHMgTGVzc19UcmVlewoKCXB1YmxpYyAkb3A7CglwdWJsaWMgJGx2YWx1ZTsKCXB1YmxpYyAkcnZhbHVlOwoJcHVibGljICRpbmRleDsKCXB1YmxpYyAkbmVnYXRlOwoJcHVibGljICR0eXBlID0gJ0NvbmRpdGlvbic7CgoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRvcCwgJGwsICRyLCAkaSA9IDAsICRuZWdhdGUgPSBmYWxzZSkgewoJCSR0aGlzLT5vcCA9IHRyaW0oJG9wKTsKCQkkdGhpcy0+bHZhbHVlID0gJGw7CgkJJHRoaXMtPnJ2YWx1ZSA9ICRyOwoJCSR0aGlzLT5pbmRleCA9ICRpOwoJCSR0aGlzLT5uZWdhdGUgPSAkbmVnYXRlOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoJHZpc2l0b3IpewoJCSR0aGlzLT5sdmFsdWUgPSAkdmlzaXRvci0+dmlzaXRPYmooICR0aGlzLT5sdmFsdWUgKTsKCQkkdGhpcy0+cnZhbHVlID0gJHZpc2l0b3ItPnZpc2l0T2JqKCAkdGhpcy0+cnZhbHVlICk7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoJGVudikgewoJCSRhID0gJHRoaXMtPmx2YWx1ZS0+Y29tcGlsZSgkZW52KTsKCQkkYiA9ICR0aGlzLT5ydmFsdWUtPmNvbXBpbGUoJGVudik7CgoJCXN3aXRjaCggJHRoaXMtPm9wICl7CgkJCWNhc2UgJ2FuZCc6CgkJCQkkcmVzdWx0ID0gJGEgJiYgJGI7CgkJCWJyZWFrOwoKCQkJY2FzZSAnb3InOgoJCQkJJHJlc3VsdCA9ICRhIHx8ICRiOwoJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQlpZiggTGVzc19QYXJzZXI6OmlzX21ldGhvZCgkYSwgJ2NvbXBhcmUnKSApewoJCQkJCSRyZXN1bHQgPSAkYS0+Y29tcGFyZSgkYik7CgkJCQl9ZWxzZWlmKCBMZXNzX1BhcnNlcjo6aXNfbWV0aG9kKCRiLCAnY29tcGFyZScpICl7CgkJCQkJJHJlc3VsdCA9ICRiLT5jb21wYXJlKCRhKTsKCQkJCX1lbHNlewoJCQkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcignVW5hYmxlIHRvIHBlcmZvcm0gY29tcGFyaXNvbicsIG51bGwsICR0aGlzLT5pbmRleCk7CgkJCQl9CgoJCQkJc3dpdGNoICgkcmVzdWx0KSB7CgkJCQkJY2FzZSAtMToKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPm9wID09PSAnPCcgfHwgJHRoaXMtPm9wID09PSAnPTwnIHx8ICR0aGlzLT5vcCA9PT0gJzw9JzsKCQkJCQlicmVhazsKCgkJCQkJY2FzZSAgMDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPm9wID09PSAnPScgfHwgJHRoaXMtPm9wID09PSAnPj0nIHx8ICR0aGlzLT5vcCA9PT0gJz08JyB8fCAkdGhpcy0+b3AgPT09ICc8PSc7CgkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgIDE6CgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5vcCA9PT0gJz4nIHx8ICR0aGlzLT5vcCA9PT0gJz49JzsKCQkJCQlicmVhazsKCQkJCX0KCQkJYnJlYWs7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPm5lZ2F0ZSA/ICEkcmVzdWx0IDogJHJlc3VsdDsKICAgIH0KCn0KIAoKLyoqCiAqIERlZmF1bHRGdW5jCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdHJlZQogKi8KY2xhc3MgTGVzc19UcmVlX0RlZmF1bHRGdW5jewoKCXN0YXRpYyAkZXJyb3JfOwoJc3RhdGljICR2YWx1ZV87CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb21waWxlKCl7CgkJaWYoIHNlbGY6OiRlcnJvcl8gKXsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzZWxmOjokZXJyb3JfKTsKCQl9CgkJaWYoIHNlbGY6OiR2YWx1ZV8gIT09IG51bGwgKXsKCQkJcmV0dXJuIHNlbGY6OiR2YWx1ZV8gPyBuZXcgTGVzc19UcmVlX0tleXdvcmQoJ3RydWUnKSA6IG5ldyBMZXNzX1RyZWVfS2V5d29yZCgnZmFsc2UnKTsKCQl9Cgl9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWx1ZSggJHYgKXsKCQlzZWxmOjokdmFsdWVfID0gJHY7Cgl9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlcnJvciggJGUgKXsKCQlzZWxmOjokZXJyb3JfID0gJGU7Cgl9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXNldCgpewoJCXNlbGY6OiR2YWx1ZV8gPSBzZWxmOjokZXJyb3JfID0gbnVsbDsKCX0KfSAKCi8qKgogKiBEZXRhY2hlZFJ1bGVzZXQKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfRGV0YWNoZWRSdWxlc2V0IGV4dGVuZHMgTGVzc19UcmVlewoKCXB1YmxpYyAkcnVsZXNldDsKCXB1YmxpYyAkZnJhbWVzOwoJcHVibGljICR0eXBlID0gJ0RldGFjaGVkUnVsZXNldCc7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkcnVsZXNldCwgJGZyYW1lcyA9IG51bGwgKXsKCQkkdGhpcy0+cnVsZXNldCA9ICRydWxlc2V0OwoJCSR0aGlzLT5mcmFtZXMgPSAkZnJhbWVzOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoJHZpc2l0b3IpIHsKCQkkdGhpcy0+cnVsZXNldCA9ICR2aXNpdG9yLT52aXNpdE9iaigkdGhpcy0+cnVsZXNldCk7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoJGVudil7CgkJaWYoICR0aGlzLT5mcmFtZXMgKXsKCQkJJGZyYW1lcyA9ICR0aGlzLT5mcmFtZXM7CgkJfWVsc2V7CgkJCSRmcmFtZXMgPSAkZW52LT5mcmFtZXM7CgkJfQoJCXJldHVybiBuZXcgTGVzc19UcmVlX0RldGFjaGVkUnVsZXNldCgkdGhpcy0+cnVsZXNldCwgJGZyYW1lcyk7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIGNhbGxFdmFsKCRlbnYpIHsKCQlpZiggJHRoaXMtPmZyYW1lcyApewoJCQlyZXR1cm4gJHRoaXMtPnJ1bGVzZXQtPmNvbXBpbGUoICRlbnYtPmNvcHlFdmFsRW52KCBhcnJheV9tZXJnZSgkdGhpcy0+ZnJhbWVzLCRlbnYtPmZyYW1lcykgKSApOwoJCX0KCQlyZXR1cm4gJHRoaXMtPnJ1bGVzZXQtPmNvbXBpbGUoICRlbnYgKTsKCX0KfQoKIAoKLyoqCiAqIERpbWVuc2lvbgogKgogKiBAcGFja2FnZSBMZXNzCiAqIEBzdWJwYWNrYWdlIHRyZWUKICovCmNsYXNzIExlc3NfVHJlZV9EaW1lbnNpb24gZXh0ZW5kcyBMZXNzX1RyZWV7CgoJcHVibGljICR2YWx1ZTsKCXB1YmxpYyAkdW5pdDsKCXB1YmxpYyAkdHlwZSA9ICdEaW1lbnNpb24nOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmFsdWUsICR1bml0ID0gbnVsbCl7CiAgICAgICAgJHRoaXMtPnZhbHVlID0gZmxvYXR2YWwoJHZhbHVlKTsKCgkJaWYoICR1bml0ICYmICgkdW5pdCBpbnN0YW5jZW9mIExlc3NfVHJlZV9Vbml0KSApewoJCQkkdGhpcy0+dW5pdCA9ICR1bml0OwoJCX1lbHNlaWYoICR1bml0ICl7CgkJCSR0aGlzLT51bml0ID0gbmV3IExlc3NfVHJlZV9Vbml0KCBhcnJheSgkdW5pdCkgKTsKCQl9ZWxzZXsKCQkJJHRoaXMtPnVuaXQgPSBuZXcgTGVzc19UcmVlX1VuaXQoICk7CgkJfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoICR2aXNpdG9yICl7CgkJJHRoaXMtPnVuaXQgPSAkdmlzaXRvci0+dmlzaXRPYmooICR0aGlzLT51bml0ICk7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoKXsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHRvQ29sb3IoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBMZXNzX1RyZWVfQ29sb3IoYXJyYXkoJHRoaXMtPnZhbHVlLCAkdGhpcy0+dmFsdWUsICR0aGlzLT52YWx1ZSkpOwogICAgfQoKICAgIC8qKgogICAgICogQHNlZSBMZXNzX1RyZWU6OmdlbkNTUwogICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2VuQ1NTKCAkb3V0cHV0ICl7CgoJCWlmKCBMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ3N0cmljdFVuaXRzJ10gJiYgISR0aGlzLT51bml0LT5pc1Npbmd1bGFyKCkgKXsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCJNdWx0aXBsZSB1bml0cyBpbiBkaW1lbnNpb24uIENvcnJlY3QgdGhlIHVuaXRzIG9yIHVzZSB0aGUgdW5pdCBmdW5jdGlvbi4gQmFkIHVuaXQ6ICIuJHRoaXMtPnVuaXQtPnRvU3RyaW5nKCkpOwoJCX0KCgkJJHZhbHVlID0gTGVzc19GdW5jdGlvbnM6OmZyb3VuZCggJHRoaXMtPnZhbHVlICk7CgkJJHN0clZhbHVlID0gKHN0cmluZykkdmFsdWU7CgoJCWlmKCAkdmFsdWUgIT09IDAgJiYgJHZhbHVlIDwgMC4wMDAwMDEgJiYgJHZhbHVlID4gLTAuMDAwMDAxICl7CgkJCS8vIHdvdWxkIGJlIG91dHB1dCAxZS02IGV0Yy4KCQkJJHN0clZhbHVlID0gbnVtYmVyX2Zvcm1hdCgkc3RyVmFsdWUsMTApOwoJCQkkc3RyVmFsdWUgPSBwcmVnX3JlcGxhY2UoJy9cLj8wKyQvJywnJywgJHN0clZhbHVlKTsKCQl9CgoJCWlmKCBMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ2NvbXByZXNzJ10gKXsKCQkJLy8gWmVybyB2YWx1ZXMgZG9lc24ndCBuZWVkIGEgdW5pdAoJCQlpZiggJHZhbHVlID09PSAwICYmICR0aGlzLT51bml0LT5pc0xlbmd0aCgpICl7CgkJCQkkb3V0cHV0LT5hZGQoICRzdHJWYWx1ZSApOwoJCQkJcmV0dXJuICRzdHJWYWx1ZTsKCQkJfQoKCQkJLy8gRmxvYXQgdmFsdWVzIGRvZXNuJ3QgbmVlZCBhIGxlYWRpbmcgemVybwoJCQlpZiggJHZhbHVlID4gMCAmJiAkdmFsdWUgPCAxICYmICRzdHJWYWx1ZVswXSA9PT0gJzAnICl7CgkJCQkkc3RyVmFsdWUgPSBzdWJzdHIoJHN0clZhbHVlLDEpOwoJCQl9CgkJfQoKCQkkb3V0cHV0LT5hZGQoICRzdHJWYWx1ZSApOwoJCSR0aGlzLT51bml0LT5nZW5DU1MoICRvdXRwdXQgKTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpewogICAgICAgIHJldHVybiAkdGhpcy0+dG9DU1MoKTsKICAgIH0KCiAgICAvLyBJbiBhbiBvcGVyYXRpb24gYmV0d2VlbiB0d28gRGltZW5zaW9ucywKICAgIC8vIHdlIGRlZmF1bHQgdG8gdGhlIGZpcnN0IERpbWVuc2lvbidzIHVuaXQsCiAgICAvLyBzbyBgMXB4ICsgMmVtYCB3aWxsIHlpZWxkIGAzcHhgLgoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkb3AKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG9wZXJhdGUoICRvcCwgJG90aGVyKXsKCgkJJHZhbHVlID0gTGVzc19GdW5jdGlvbnM6Om9wZXJhdGUoICRvcCwgJHRoaXMtPnZhbHVlLCAkb3RoZXItPnZhbHVlKTsKCQkkdW5pdCA9IGNsb25lICR0aGlzLT51bml0OwoKCQlpZiggJG9wID09PSAnKycgfHwgJG9wID09PSAnLScgKXsKCgkJCWlmKCAhJHVuaXQtPm51bWVyYXRvciAmJiAhJHVuaXQtPmRlbm9taW5hdG9yICl7CgkJCQkkdW5pdC0+bnVtZXJhdG9yID0gJG90aGVyLT51bml0LT5udW1lcmF0b3I7CgkJCQkkdW5pdC0+ZGVub21pbmF0b3IgPSAkb3RoZXItPnVuaXQtPmRlbm9taW5hdG9yOwoJCQl9ZWxzZWlmKCAhJG90aGVyLT51bml0LT5udW1lcmF0b3IgJiYgISRvdGhlci0+dW5pdC0+ZGVub21pbmF0b3IgKXsKCQkJCS8vIGRvIG5vdGhpbmcKCQkJfWVsc2V7CgkJCQkkb3RoZXIgPSAkb3RoZXItPmNvbnZlcnRUbyggJHRoaXMtPnVuaXQtPnVzZWRVbml0cygpKTsKCgkJCQlpZiggTGVzc19QYXJzZXI6OiRvcHRpb25zWydzdHJpY3RVbml0cyddICYmICRvdGhlci0+dW5pdC0+dG9TdHJpbmcoKSAhPT0gJHVuaXQtPnRvQ1NTKCkgKXsKCQkJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoIkluY29tcGF0aWJsZSB1bml0cy4gQ2hhbmdlIHRoZSB1bml0cyBvciB1c2UgdGhlIHVuaXQgZnVuY3Rpb24uIEJhZCB1bml0czogJyIuJHVuaXQtPnRvU3RyaW5nKCkgLiAiJyBhbmQgIi4kb3RoZXItPnVuaXQtPnRvU3RyaW5nKCkrIicuIik7CgkJCQl9CgoJCQkJJHZhbHVlID0gTGVzc19GdW5jdGlvbnM6Om9wZXJhdGUoICRvcCwgJHRoaXMtPnZhbHVlLCAkb3RoZXItPnZhbHVlKTsKCQkJfQoJCX1lbHNlaWYoICRvcCA9PT0gJyonICl7CgkJCSR1bml0LT5udW1lcmF0b3IgPSBhcnJheV9tZXJnZSgkdW5pdC0+bnVtZXJhdG9yLCAkb3RoZXItPnVuaXQtPm51bWVyYXRvcik7CgkJCSR1bml0LT5kZW5vbWluYXRvciA9IGFycmF5X21lcmdlKCR1bml0LT5kZW5vbWluYXRvciwgJG90aGVyLT51bml0LT5kZW5vbWluYXRvcik7CgkJCXNvcnQoJHVuaXQtPm51bWVyYXRvcik7CgkJCXNvcnQoJHVuaXQtPmRlbm9taW5hdG9yKTsKCQkJJHVuaXQtPmNhbmNlbCgpOwoJCX1lbHNlaWYoICRvcCA9PT0gJy8nICl7CgkJCSR1bml0LT5udW1lcmF0b3IgPSBhcnJheV9tZXJnZSgkdW5pdC0+bnVtZXJhdG9yLCAkb3RoZXItPnVuaXQtPmRlbm9taW5hdG9yKTsKCQkJJHVuaXQtPmRlbm9taW5hdG9yID0gYXJyYXlfbWVyZ2UoJHVuaXQtPmRlbm9taW5hdG9yLCAkb3RoZXItPnVuaXQtPm51bWVyYXRvcik7CgkJCXNvcnQoJHVuaXQtPm51bWVyYXRvcik7CgkJCXNvcnQoJHVuaXQtPmRlbm9taW5hdG9yKTsKCQkJJHVuaXQtPmNhbmNlbCgpOwoJCX0KCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9EaW1lbnNpb24oICR2YWx1ZSwgJHVuaXQpOwogICAgfQoKCXB1YmxpYyBmdW5jdGlvbiBjb21wYXJlKCRvdGhlcikgewoJCWlmICgkb3RoZXIgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRGltZW5zaW9uKSB7CgoJCQlpZiggJHRoaXMtPnVuaXQtPmlzRW1wdHkoKSB8fCAkb3RoZXItPnVuaXQtPmlzRW1wdHkoKSApewoJCQkJJGEgPSAkdGhpczsKCQkJCSRiID0gJG90aGVyOwoJCQl9IGVsc2UgewoJCQkJJGEgPSAkdGhpcy0+dW5pZnkoKTsKCQkJCSRiID0gJG90aGVyLT51bmlmeSgpOwoJCQkJaWYoICRhLT51bml0LT5jb21wYXJlKCRiLT51bml0KSAhPT0gMCApewoJCQkJCXJldHVybiAtMTsKCQkJCX0KCQkJfQoJCQkkYVZhbHVlID0gJGEtPnZhbHVlOwoJCQkkYlZhbHVlID0gJGItPnZhbHVlOwoKCQkJaWYgKCRiVmFsdWUgPiAkYVZhbHVlKSB7CgkJCQlyZXR1cm4gLTE7CgkJCX0gZWxzZWlmICgkYlZhbHVlIDwgJGFWYWx1ZSkgewoJCQkJcmV0dXJuIDE7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gMDsKCQkJfQoJCX0gZWxzZSB7CgkJCXJldHVybiAtMTsKCQl9Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIHVuaWZ5KCkgewoJCXJldHVybiAkdGhpcy0+Y29udmVydFRvKGFycmF5KCdsZW5ndGgnPT4gJ3B4JywgJ2R1cmF0aW9uJz0+ICdzJywgJ2FuZ2xlJyA9PiAncmFkJyApKTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29udmVydFRvKCRjb252ZXJzaW9ucykgewoJCSR2YWx1ZSA9ICR0aGlzLT52YWx1ZTsKCQkkdW5pdCA9IGNsb25lICR0aGlzLT51bml0OwoKCQlpZiggaXNfc3RyaW5nKCRjb252ZXJzaW9ucykgKXsKCQkJJGRlcml2ZWRDb252ZXJzaW9ucyA9IGFycmF5KCk7CgkJCWZvcmVhY2goIExlc3NfVHJlZV9Vbml0Q29udmVyc2lvbnM6OiRncm91cHMgYXMgJGkgKXsKCQkJCWlmKCBpc3NldChMZXNzX1RyZWVfVW5pdENvbnZlcnNpb25zOjokeyRpfVskY29udmVyc2lvbnNdKSApewoJCQkJCSRkZXJpdmVkQ29udmVyc2lvbnMgPSBhcnJheSggJGkgPT4gJGNvbnZlcnNpb25zKTsKCQkJCX0KCQkJfQoJCQkkY29udmVyc2lvbnMgPSAkZGVyaXZlZENvbnZlcnNpb25zOwoJCX0KCgoJCWZvcmVhY2goJGNvbnZlcnNpb25zIGFzICRncm91cE5hbWUgPT4gJHRhcmdldFVuaXQpewoJCQkkZ3JvdXAgPSBMZXNzX1RyZWVfVW5pdENvbnZlcnNpb25zOjokeyRncm91cE5hbWV9OwoKCQkJLy9udW1lcmF0b3IKCQkJZm9yZWFjaCgkdW5pdC0+bnVtZXJhdG9yIGFzICRpID0+ICRhdG9taWNVbml0KXsKCQkJCSRhdG9taWNVbml0ID0gJHVuaXQtPm51bWVyYXRvclskaV07CgkJCQlpZiggIWlzc2V0KCRncm91cFskYXRvbWljVW5pdF0pICl7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJJHZhbHVlID0gJHZhbHVlICogKCRncm91cFskYXRvbWljVW5pdF0gLyAkZ3JvdXBbJHRhcmdldFVuaXRdKTsKCgkJCQkkdW5pdC0+bnVtZXJhdG9yWyRpXSA9ICR0YXJnZXRVbml0OwoJCQl9CgoJCQkvL2Rlbm9taW5hdG9yCgkJCWZvcmVhY2goJHVuaXQtPmRlbm9taW5hdG9yIGFzICRpID0+ICRhdG9taWNVbml0KXsKCQkJCSRhdG9taWNVbml0ID0gJHVuaXQtPmRlbm9taW5hdG9yWyRpXTsKCQkJCWlmKCAhaXNzZXQoJGdyb3VwWyRhdG9taWNVbml0XSkgKXsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkkdmFsdWUgPSAkdmFsdWUgLyAoJGdyb3VwWyRhdG9taWNVbml0XSAvICRncm91cFskdGFyZ2V0VW5pdF0pOwoKCQkJCSR1bml0LT5kZW5vbWluYXRvclskaV0gPSAkdGFyZ2V0VW5pdDsKCQkJfQoJCX0KCgkJJHVuaXQtPmNhbmNlbCgpOwoKCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9EaW1lbnNpb24oICR2YWx1ZSwgJHVuaXQpOwogICAgfQp9CiAKCi8qKgogKiBEaXJlY3RpdmUKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfRGlyZWN0aXZlIGV4dGVuZHMgTGVzc19UcmVlewoKCXB1YmxpYyAkbmFtZTsKCXB1YmxpYyAkdmFsdWU7CglwdWJsaWMgJHJ1bGVzOwoJcHVibGljICRpbmRleDsKCXB1YmxpYyAkaXNSZWZlcmVuY2VkOwoJcHVibGljICRjdXJyZW50RmlsZUluZm87CglwdWJsaWMgJGRlYnVnSW5mbzsKCXB1YmxpYyAkdHlwZSA9ICdEaXJlY3RpdmUnOwoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbmFtZSwgJHZhbHVlID0gbnVsbCwgJHJ1bGVzLCAkaW5kZXggPSBudWxsLCAkY3VycmVudEZpbGVJbmZvID0gbnVsbCwgJGRlYnVnSW5mbyA9IG51bGwgKXsKCQkkdGhpcy0+bmFtZSA9ICRuYW1lOwoJCSR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKCQlpZiggJHJ1bGVzICl7CgkJCSR0aGlzLT5ydWxlcyA9ICRydWxlczsKCQkJJHRoaXMtPnJ1bGVzLT5hbGxvd0ltcG9ydHMgPSB0cnVlOwoJCX0KCgkJJHRoaXMtPmluZGV4ID0gJGluZGV4OwoJCSR0aGlzLT5jdXJyZW50RmlsZUluZm8gPSAkY3VycmVudEZpbGVJbmZvOwoJCSR0aGlzLT5kZWJ1Z0luZm8gPSAkZGVidWdJbmZvOwoJfQoKCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCAkdmlzaXRvciApewoJCWlmKCAkdGhpcy0+cnVsZXMgKXsKCQkJJHRoaXMtPnJ1bGVzID0gJHZpc2l0b3ItPnZpc2l0T2JqKCAkdGhpcy0+cnVsZXMgKTsKCQl9CgkJaWYoICR0aGlzLT52YWx1ZSApewoJCQkkdGhpcy0+dmFsdWUgPSAkdmlzaXRvci0+dmlzaXRPYmooICR0aGlzLT52YWx1ZSApOwoJCX0KCX0KCgogICAgLyoqCiAgICAgKiBAc2VlIExlc3NfVHJlZTo6Z2VuQ1NTCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZW5DU1MoICRvdXRwdXQgKXsKCQkkdmFsdWUgPSAkdGhpcy0+dmFsdWU7CgkJJHJ1bGVzID0gJHRoaXMtPnJ1bGVzOwoJCSRvdXRwdXQtPmFkZCggJHRoaXMtPm5hbWUsICR0aGlzLT5jdXJyZW50RmlsZUluZm8sICR0aGlzLT5pbmRleCApOwoJCWlmKCAkdGhpcy0+dmFsdWUgKXsKCQkJJG91dHB1dC0+YWRkKCcgJyk7CgkJCSR0aGlzLT52YWx1ZS0+Z2VuQ1NTKCRvdXRwdXQpOwoJCX0KCQlpZiggJHRoaXMtPnJ1bGVzICl7CgkJCUxlc3NfVHJlZTo6b3V0cHV0UnVsZXNldCggJG91dHB1dCwgYXJyYXkoJHRoaXMtPnJ1bGVzKSk7CgkJfSBlbHNlIHsKCQkJJG91dHB1dC0+YWRkKCc7Jyk7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRlbnYpewoKCQkkdmFsdWUgPSAkdGhpcy0+dmFsdWU7CgkJJHJ1bGVzID0gJHRoaXMtPnJ1bGVzOwoJCWlmKCAkdmFsdWUgKXsKCQkJJHZhbHVlID0gJHZhbHVlLT5jb21waWxlKCRlbnYpOwoJCX0KCgkJaWYoICRydWxlcyApewoJCQkkcnVsZXMgPSAkcnVsZXMtPmNvbXBpbGUoJGVudik7CgkJCSRydWxlcy0+cm9vdCA9IHRydWU7CgkJfQoKCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9EaXJlY3RpdmUoICR0aGlzLT5uYW1lLCAkdmFsdWUsICRydWxlcywgJHRoaXMtPmluZGV4LCAkdGhpcy0+Y3VycmVudEZpbGVJbmZvLCAkdGhpcy0+ZGVidWdJbmZvICk7Cgl9CgoKCXB1YmxpYyBmdW5jdGlvbiB2YXJpYWJsZSgkbmFtZSl7CgkJaWYoICR0aGlzLT5ydWxlcyApewoJCQlyZXR1cm4gJHRoaXMtPnJ1bGVzLT52YXJpYWJsZSgkbmFtZSk7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBmaW5kKCRzZWxlY3Rvcil7CgkJaWYoICR0aGlzLT5ydWxlcyApewoJCQlyZXR1cm4gJHRoaXMtPnJ1bGVzLT5maW5kKCRzZWxlY3RvciwgJHRoaXMpOwoJCX0KCX0KCgkvL3J1bGVzZXRzOiBmdW5jdGlvbiAoKSB7IGlmICh0aGlzLnJ1bGVzKSByZXR1cm4gdHJlZS5SdWxlc2V0LnByb3RvdHlwZS5ydWxlc2V0cy5hcHBseSh0aGlzLnJ1bGVzKTsgfSwKCglwdWJsaWMgZnVuY3Rpb24gbWFya1JlZmVyZW5jZWQoKXsKCQkkdGhpcy0+aXNSZWZlcmVuY2VkID0gdHJ1ZTsKCQlpZiggJHRoaXMtPnJ1bGVzICl7CgkJCUxlc3NfVHJlZTo6UmVmZXJlbmNlZEFycmF5KCR0aGlzLT5ydWxlcy0+cnVsZXMpOwoJCX0KCX0KCn0KIAoKLyoqCiAqIEVsZW1lbnQKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfRWxlbWVudCBleHRlbmRzIExlc3NfVHJlZXsKCglwdWJsaWMgJGNvbWJpbmF0b3IgPSAnJzsKCXB1YmxpYyAkdmFsdWUgPSAnJzsKCXB1YmxpYyAkaW5kZXg7CglwdWJsaWMgJGN1cnJlbnRGaWxlSW5mbzsKCXB1YmxpYyAkdHlwZSA9ICdFbGVtZW50JzsKCglwdWJsaWMgJHZhbHVlX2lzX29iamVjdCA9IGZhbHNlOwoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkY29tYmluYXRvciwgJHZhbHVlLCAkaW5kZXggPSBudWxsLCAkY3VycmVudEZpbGVJbmZvID0gbnVsbCApewoKCQkkdGhpcy0+dmFsdWUgPSAkdmFsdWU7CgkJJHRoaXMtPnZhbHVlX2lzX29iamVjdCA9IGlzX29iamVjdCgkdmFsdWUpOwoKCQlpZiggJGNvbWJpbmF0b3IgKXsKCQkJJHRoaXMtPmNvbWJpbmF0b3IgPSAkY29tYmluYXRvcjsKCQl9CgoJCSR0aGlzLT5pbmRleCA9ICRpbmRleDsKCQkkdGhpcy0+Y3VycmVudEZpbGVJbmZvID0gJGN1cnJlbnRGaWxlSW5mbzsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCAkdmlzaXRvciApewoJCWlmKCAkdGhpcy0+dmFsdWVfaXNfb2JqZWN0ICl7IC8vb2JqZWN0IG9yIHN0cmluZwoJCQkkdGhpcy0+dmFsdWUgPSAkdmlzaXRvci0+dmlzaXRPYmooICR0aGlzLT52YWx1ZSApOwoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkZW52KXsKCgkJaWYoIExlc3NfRW52aXJvbm1lbnQ6OiRtaXhpbl9zdGFjayApewoJCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9FbGVtZW50KCR0aGlzLT5jb21iaW5hdG9yLCAoJHRoaXMtPnZhbHVlX2lzX29iamVjdCA/ICR0aGlzLT52YWx1ZS0+Y29tcGlsZSgkZW52KSA6ICR0aGlzLT52YWx1ZSksICR0aGlzLT5pbmRleCwgJHRoaXMtPmN1cnJlbnRGaWxlSW5mbyApOwoJCX0KCgkJaWYoICR0aGlzLT52YWx1ZV9pc19vYmplY3QgKXsKCQkJJHRoaXMtPnZhbHVlID0gJHRoaXMtPnZhbHVlLT5jb21waWxlKCRlbnYpOwoJCX0KCgkJcmV0dXJuICR0aGlzOwoJfQoKICAgIC8qKgogICAgICogQHNlZSBMZXNzX1RyZWU6OmdlbkNTUwogICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2VuQ1NTKCAkb3V0cHV0ICl7CgkJJG91dHB1dC0+YWRkKCAkdGhpcy0+dG9DU1MoKSwgJHRoaXMtPmN1cnJlbnRGaWxlSW5mbywgJHRoaXMtPmluZGV4ICk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHRvQ1NTKCl7CgoJCWlmKCAkdGhpcy0+dmFsdWVfaXNfb2JqZWN0ICl7CgkJCSR2YWx1ZSA9ICR0aGlzLT52YWx1ZS0+dG9DU1MoKTsKCQl9ZWxzZXsKCQkJJHZhbHVlID0gJHRoaXMtPnZhbHVlOwoJCX0KCgoJCWlmKCAkdmFsdWUgPT09ICcnICYmICR0aGlzLT5jb21iaW5hdG9yICYmICR0aGlzLT5jb21iaW5hdG9yID09PSAnJicgKXsKCQkJcmV0dXJuICcnOwoJCX0KCgoJCXJldHVybiBMZXNzX0Vudmlyb25tZW50OjokX291dHB1dE1hcFskdGhpcy0+Y29tYmluYXRvcl0gLiAkdmFsdWU7Cgl9Cgp9CiAKCi8qKgogKiBFeHByZXNzaW9uCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdHJlZQogKi8KY2xhc3MgTGVzc19UcmVlX0V4cHJlc3Npb24gZXh0ZW5kcyBMZXNzX1RyZWV7CgoJcHVibGljICR2YWx1ZSA9IGFycmF5KCk7CglwdWJsaWMgJHBhcmVucyA9IGZhbHNlOwoJcHVibGljICRwYXJlbnNJbk9wID0gZmFsc2U7CglwdWJsaWMgJHR5cGUgPSAnRXhwcmVzc2lvbic7CgoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkdmFsdWUsICRwYXJlbnMgPSBudWxsICl7CgkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoJCSR0aGlzLT5wYXJlbnMgPSAkcGFyZW5zOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoICR2aXNpdG9yICl7CgkJJHRoaXMtPnZhbHVlID0gJHZpc2l0b3ItPnZpc2l0QXJyYXkoICR0aGlzLT52YWx1ZSApOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRlbnYpIHsKCgkJJGRvdWJsZVBhcmVuID0gZmFsc2U7CgoJCWlmKCAkdGhpcy0+cGFyZW5zICYmICEkdGhpcy0+cGFyZW5zSW5PcCApewoJCQlMZXNzX0Vudmlyb25tZW50OjokcGFyZW5zU3RhY2srKzsKCQl9CgoJCSRyZXR1cm5WYWx1ZSA9IG51bGw7CgkJaWYoICR0aGlzLT52YWx1ZSApewoKCQkJJGNvdW50ID0gY291bnQoJHRoaXMtPnZhbHVlKTsKCgkJCWlmKCAkY291bnQgPiAxICl7CgoJCQkJJHJldCA9IGFycmF5KCk7CgkJCQlmb3JlYWNoKCR0aGlzLT52YWx1ZSBhcyAkZSl7CgkJCQkJJHJldFtdID0gJGUtPmNvbXBpbGUoJGVudik7CgkJCQl9CgkJCQkkcmV0dXJuVmFsdWUgPSBuZXcgTGVzc19UcmVlX0V4cHJlc3Npb24oJHJldCk7CgoJCQl9ZWxzZXsKCgkJCQlpZiggKCR0aGlzLT52YWx1ZVswXSBpbnN0YW5jZW9mIExlc3NfVHJlZV9FeHByZXNzaW9uKSAmJiAkdGhpcy0+dmFsdWVbMF0tPnBhcmVucyAmJiAhJHRoaXMtPnZhbHVlWzBdLT5wYXJlbnNJbk9wICl7CgkJCQkJJGRvdWJsZVBhcmVuID0gdHJ1ZTsKCQkJCX0KCgkJCQkkcmV0dXJuVmFsdWUgPSAkdGhpcy0+dmFsdWVbMF0tPmNvbXBpbGUoJGVudik7CgkJCX0KCgkJfSBlbHNlIHsKCQkJJHJldHVyblZhbHVlID0gJHRoaXM7CgkJfQoKCQlpZiggJHRoaXMtPnBhcmVucyApewoJCQlpZiggISR0aGlzLT5wYXJlbnNJbk9wICl7CgkJCQlMZXNzX0Vudmlyb25tZW50OjokcGFyZW5zU3RhY2stLTsKCgkJCX1lbHNlaWYoICFMZXNzX0Vudmlyb25tZW50Ojppc01hdGhPbigpICYmICEkZG91YmxlUGFyZW4gKXsKCQkJCSRyZXR1cm5WYWx1ZSA9IG5ldyBMZXNzX1RyZWVfUGFyZW4oJHJldHVyblZhbHVlKTsKCgkJCX0KCQl9CgkJcmV0dXJuICRyZXR1cm5WYWx1ZTsKCX0KCiAgICAvKioKICAgICAqIEBzZWUgTGVzc19UcmVlOjpnZW5DU1MKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdlbkNTUyggJG91dHB1dCApewoJCSR2YWxfbGVuID0gY291bnQoJHRoaXMtPnZhbHVlKTsKCQlmb3IoICRpID0gMDsgJGkgPCAkdmFsX2xlbjsgJGkrKyApewoJCQkkdGhpcy0+dmFsdWVbJGldLT5nZW5DU1MoICRvdXRwdXQgKTsKCQkJaWYoICRpICsgMSA8ICR2YWxfbGVuICl7CgkJCQkkb3V0cHV0LT5hZGQoICcgJyApOwoJCQl9CgkJfQoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB0aHJvd0F3YXlDb21tZW50cygpIHsKCgkJaWYoIGlzX2FycmF5KCR0aGlzLT52YWx1ZSkgKXsKCQkJJG5ld192YWx1ZSA9IGFycmF5KCk7CgkJCWZvcmVhY2goJHRoaXMtPnZhbHVlIGFzICR2KXsKCQkJCWlmKCAkdiBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db21tZW50ICl7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQkkbmV3X3ZhbHVlW10gPSAkdjsKCQkJfQoJCQkkdGhpcy0+dmFsdWUgPSAkbmV3X3ZhbHVlOwoJCX0KCX0KfQogCgovKioKICogRXh0ZW5kCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdHJlZQogKi8KY2xhc3MgTGVzc19UcmVlX0V4dGVuZCBleHRlbmRzIExlc3NfVHJlZXsKCglwdWJsaWMgJHNlbGVjdG9yOwoJcHVibGljICRvcHRpb247CglwdWJsaWMgJGluZGV4OwoJcHVibGljICRzZWxmU2VsZWN0b3JzID0gYXJyYXkoKTsKCXB1YmxpYyAkYWxsb3dCZWZvcmU7CglwdWJsaWMgJGFsbG93QWZ0ZXI7CglwdWJsaWMgJGZpcnN0RXh0ZW5kT25UaGlzU2VsZWN0b3JQYXRoOwoJcHVibGljICR0eXBlID0gJ0V4dGVuZCc7CglwdWJsaWMgJHJ1bGVzZXQ7CgoKCXB1YmxpYyAkb2JqZWN0X2lkOwoJcHVibGljICRwYXJlbnRfaWRzID0gYXJyYXkoKTsKCgkvKioKCSAqIEBwYXJhbSBpbnRlZ2VyICRpbmRleAoJICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHNlbGVjdG9yLCAkb3B0aW9uLCAkaW5kZXgpewoJCXN0YXRpYyAkaSA9IDA7CgkJJHRoaXMtPnNlbGVjdG9yID0gJHNlbGVjdG9yOwoJCSR0aGlzLT5vcHRpb24gPSAkb3B0aW9uOwoJCSR0aGlzLT5pbmRleCA9ICRpbmRleDsKCgkJc3dpdGNoKCRvcHRpb24pewoJCQljYXNlICJhbGwiOgoJCQkJJHRoaXMtPmFsbG93QmVmb3JlID0gdHJ1ZTsKCQkJCSR0aGlzLT5hbGxvd0FmdGVyID0gdHJ1ZTsKCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQkkdGhpcy0+YWxsb3dCZWZvcmUgPSBmYWxzZTsKCQkJCSR0aGlzLT5hbGxvd0FmdGVyID0gZmFsc2U7CgkJCWJyZWFrOwoJCX0KCgkJJHRoaXMtPm9iamVjdF9pZCA9ICRpKys7CgkJJHRoaXMtPnBhcmVudF9pZHMgPSBhcnJheSgkdGhpcy0+b2JqZWN0X2lkKTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCAkdmlzaXRvciApewoJCSR0aGlzLT5zZWxlY3RvciA9ICR2aXNpdG9yLT52aXNpdE9iaiggJHRoaXMtPnNlbGVjdG9yICk7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoICRlbnYgKXsKCQlMZXNzX1BhcnNlcjo6JGhhc19leHRlbmRzID0gdHJ1ZTsKCQkkdGhpcy0+c2VsZWN0b3IgPSAkdGhpcy0+c2VsZWN0b3ItPmNvbXBpbGUoJGVudik7CgkJcmV0dXJuICR0aGlzOwoJCS8vcmV0dXJuIG5ldyBMZXNzX1RyZWVfRXh0ZW5kKCAkdGhpcy0+c2VsZWN0b3ItPmNvbXBpbGUoJGVudiksICR0aGlzLT5vcHRpb24sICR0aGlzLT5pbmRleCk7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIGZpbmRTZWxmU2VsZWN0b3JzKCAkc2VsZWN0b3JzICl7CgkJJHNlbGZFbGVtZW50cyA9IGFycmF5KCk7CgoKCQlmb3IoICRpID0gMCwgJHNlbGVjdG9yc19sZW4gPSBjb3VudCgkc2VsZWN0b3JzKTsgJGkgPCAkc2VsZWN0b3JzX2xlbjsgJGkrKyApewoJCQkkc2VsZWN0b3JFbGVtZW50cyA9ICRzZWxlY3RvcnNbJGldLT5lbGVtZW50czsKCQkJLy8gZHVwbGljYXRlIHRoZSBsb2dpYyBpbiBnZW5DU1MgZnVuY3Rpb24gaW5zaWRlIHRoZSBzZWxlY3RvciBub2RlLgoJCQkvLyBmdXR1cmUgVE9ETyAtIG1vdmUgYm90aCBsb2dpY3MgaW50byB0aGUgc2VsZWN0b3Igam9pbmVyIHZpc2l0b3IKCQkJaWYoICRpICYmICRzZWxlY3RvckVsZW1lbnRzICYmICRzZWxlY3RvckVsZW1lbnRzWzBdLT5jb21iaW5hdG9yID09PSAiIikgewoJCQkJJHNlbGVjdG9yRWxlbWVudHNbMF0tPmNvbWJpbmF0b3IgPSAnICc7CgkJCX0KCQkJJHNlbGZFbGVtZW50cyA9IGFycmF5X21lcmdlKCAkc2VsZkVsZW1lbnRzLCAkc2VsZWN0b3JzWyRpXS0+ZWxlbWVudHMgKTsKCQl9CgoJCSR0aGlzLT5zZWxmU2VsZWN0b3JzID0gYXJyYXkobmV3IExlc3NfVHJlZV9TZWxlY3Rvcigkc2VsZkVsZW1lbnRzKSk7Cgl9Cgp9IAoKLyoqCiAqIENTUyBAaW1wb3J0IG5vZGUKICoKICogVGhlIGdlbmVyYWwgc3RyYXRlZ3kgaGVyZSBpcyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gd2FpdAogKiBmb3IgdGhlIHBhcnNpbmcgdG8gYmUgY29tcGxldGVkLCBiZWZvcmUgd2Ugc3RhcnQgaW1wb3J0aW5nCiAqIHRoZSBmaWxlLiBUaGF0J3MgYmVjYXVzZSBpbiB0aGUgY29udGV4dCBvZiBhIGJyb3dzZXIsCiAqIG1vc3Qgb2YgdGhlIHRpbWUgd2lsbCBiZSBzcGVudCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIHJlc3BvbmQuCiAqCiAqIE9uIGNyZWF0aW9uLCB3ZSBwdXNoIHRoZSBpbXBvcnQgcGF0aCB0byBvdXIgaW1wb3J0IHF1ZXVlLCB0aG91Z2gKICogYGltcG9ydCxwdXNoYCwgd2UgYWxzbyBwYXNzIGl0IGEgY2FsbGJhY2ssIHdoaWNoIGl0J2xsIGNhbGwgb25jZQogKiB0aGUgZmlsZSBoYXMgYmVlbiBmZXRjaGVkLCBhbmQgcGFyc2VkLgogKgogKiBAcGFja2FnZSBMZXNzCiAqIEBzdWJwYWNrYWdlIHRyZWUKICovCmNsYXNzIExlc3NfVHJlZV9JbXBvcnQgZXh0ZW5kcyBMZXNzX1RyZWV7CgoJcHVibGljICRvcHRpb25zOwoJcHVibGljICRpbmRleDsKCXB1YmxpYyAkcGF0aDsKCXB1YmxpYyAkZmVhdHVyZXM7CglwdWJsaWMgJGN1cnJlbnRGaWxlSW5mbzsKCXB1YmxpYyAkY3NzOwoJcHVibGljICRza2lwOwoJcHVibGljICRyb290OwoJcHVibGljICR0eXBlID0gJ0ltcG9ydCc7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwYXRoLCAkZmVhdHVyZXMsICRvcHRpb25zLCAkaW5kZXgsICRjdXJyZW50RmlsZUluZm8gPSBudWxsICl7CgkJJHRoaXMtPm9wdGlvbnMgPSAkb3B0aW9uczsKCQkkdGhpcy0+aW5kZXggPSAkaW5kZXg7CgkJJHRoaXMtPnBhdGggPSAkcGF0aDsKCQkkdGhpcy0+ZmVhdHVyZXMgPSAkZmVhdHVyZXM7CgkJJHRoaXMtPmN1cnJlbnRGaWxlSW5mbyA9ICRjdXJyZW50RmlsZUluZm87CgoJCWlmKCBpc19hcnJheSgkb3B0aW9ucykgKXsKCQkJJHRoaXMtPm9wdGlvbnMgKz0gYXJyYXkoJ2lubGluZSc9PmZhbHNlKTsKCgkJCWlmKCBpc3NldCgkdGhpcy0+b3B0aW9uc1snbGVzcyddKSB8fCAkdGhpcy0+b3B0aW9uc1snaW5saW5lJ10gKXsKCQkJCSR0aGlzLT5jc3MgPSAhaXNzZXQoJHRoaXMtPm9wdGlvbnNbJ2xlc3MnXSkgfHwgISR0aGlzLT5vcHRpb25zWydsZXNzJ10gfHwgJHRoaXMtPm9wdGlvbnNbJ2lubGluZSddOwoJCQl9IGVsc2UgewoJCQkJJHBhdGhWYWx1ZSA9ICR0aGlzLT5nZXRQYXRoKCk7CgkJCQlpZiggJHBhdGhWYWx1ZSAmJiBwcmVnX21hdGNoKCcvY3NzKFtcPztdLiopPyQvJywkcGF0aFZhbHVlKSApewoJCQkJCSR0aGlzLT5jc3MgPSB0cnVlOwoJCQkJfQoJCQl9CgkJfQoJfQoKLy8KLy8gVGhlIGFjdHVhbCBpbXBvcnQgbm9kZSBkb2Vzbid0IHJldHVybiBhbnl0aGluZywgd2hlbiBjb252ZXJ0ZWQgdG8gQ1NTLgovLyBUaGUgcmVhc29uIGlzIHRoYXQgaXQncyB1c2VkIGF0IHRoZSBldmFsdWF0aW9uIHN0YWdlLCBzbyB0aGF0IHRoZSBydWxlcwovLyBpdCBpbXBvcnRzIGNhbiBiZSB0cmVhdGVkIGxpa2UgYW55IG90aGVyIHJ1bGVzLgovLwovLyBJbiBgZXZhbGAsIHdlIG1ha2Ugc3VyZSBhbGwgSW1wb3J0IG5vZGVzIGdldCBldmFsdWF0ZWQsIHJlY3Vyc2l2ZWx5LCBzbwovLyB3ZSBlbmQgdXAgd2l0aCBhIGZsYXQgc3RydWN0dXJlLCB3aGljaCBjYW4gZWFzaWx5IGJlIGltcG9ydGVkIGluIHRoZSBwYXJlbnQKLy8gcnVsZXNldC4KLy8KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCR2aXNpdG9yKXsKCgkJaWYoICR0aGlzLT5mZWF0dXJlcyApewoJCQkkdGhpcy0+ZmVhdHVyZXMgPSAkdmlzaXRvci0+dmlzaXRPYmooJHRoaXMtPmZlYXR1cmVzKTsKCQl9CgkJJHRoaXMtPnBhdGggPSAkdmlzaXRvci0+dmlzaXRPYmooJHRoaXMtPnBhdGgpOwoKCQlpZiggISR0aGlzLT5vcHRpb25zWydpbmxpbmUnXSAmJiAkdGhpcy0+cm9vdCApewoJCQkkdGhpcy0+cm9vdCA9ICR2aXNpdG9yLT52aXNpdCgkdGhpcy0+cm9vdCk7CgkJfQoJfQoKICAgIC8qKgogICAgICogQHNlZSBMZXNzX1RyZWU6OmdlbkNTUwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2VuQ1NTKCAkb3V0cHV0ICl7CgkJaWYoICR0aGlzLT5jc3MgKXsKCgkJCSRvdXRwdXQtPmFkZCggJ0BpbXBvcnQgJywgJHRoaXMtPmN1cnJlbnRGaWxlSW5mbywgJHRoaXMtPmluZGV4ICk7CgoJCQkkdGhpcy0+cGF0aC0+Z2VuQ1NTKCAkb3V0cHV0ICk7CgkJCWlmKCAkdGhpcy0+ZmVhdHVyZXMgKXsKCQkJCSRvdXRwdXQtPmFkZCggJyAnICk7CgkJCQkkdGhpcy0+ZmVhdHVyZXMtPmdlbkNTUyggJG91dHB1dCApOwoJCQl9CgkJCSRvdXRwdXQtPmFkZCggJzsnICk7CgkJfQoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB0b0NTUygpewoJCSRmZWF0dXJlcyA9ICR0aGlzLT5mZWF0dXJlcyA/ICcgJyAuICR0aGlzLT5mZWF0dXJlcy0+dG9DU1MoKSA6ICcnOwoKCQlpZiAoJHRoaXMtPmNzcykgewoJCQlyZXR1cm4gIkBpbXBvcnQgIiAuICR0aGlzLT5wYXRoLT50b0NTUygpIC4gJGZlYXR1cmVzIC4gIjtcbiI7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICIiOwoJCX0KCX0KCgkvKioKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQYXRoKCl7CgkJaWYgKCR0aGlzLT5wYXRoIGluc3RhbmNlb2YgTGVzc19UcmVlX1F1b3RlZCkgewoJCQkkcGF0aCA9ICR0aGlzLT5wYXRoLT52YWx1ZTsKCQkJJHBhdGggPSAoIGlzc2V0KCR0aGlzLT5jc3MpIHx8IHByZWdfbWF0Y2goJy8oXC5bYS16XSokKXwoW1w/O10uKikkLycsJHBhdGgpKSA/ICRwYXRoIDogJHBhdGggLiAnLmxlc3MnOwoJCX0gZWxzZSBpZiAoJHRoaXMtPnBhdGggaW5zdGFuY2VvZiBMZXNzX1RyZWVfVVJMKSB7CgkJCSRwYXRoID0gJHRoaXMtPnBhdGgtPnZhbHVlLT52YWx1ZTsKCQl9ZWxzZXsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQkvL3JlbW92ZSBxdWVyeSBzdHJpbmcgYW5kIGZyYWdtZW50CgkJcmV0dXJuIHByZWdfcmVwbGFjZSgnL1tcPyNdW15cP10qJC8nLCcnLCRwYXRoKTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGlsZUZvckltcG9ydCggJGVudiApewoJCXJldHVybiBuZXcgTGVzc19UcmVlX0ltcG9ydCggJHRoaXMtPnBhdGgtPmNvbXBpbGUoJGVudiksICR0aGlzLT5mZWF0dXJlcywgJHRoaXMtPm9wdGlvbnMsICR0aGlzLT5pbmRleCwgJHRoaXMtPmN1cnJlbnRGaWxlSW5mbyk7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBpbGVQYXRoKCRlbnYpIHsKCQkkcGF0aCA9ICR0aGlzLT5wYXRoLT5jb21waWxlKCRlbnYpOwoJCSRyb290cGF0aCA9ICcnOwoJCWlmKCAkdGhpcy0+Y3VycmVudEZpbGVJbmZvICYmICR0aGlzLT5jdXJyZW50RmlsZUluZm9bJ3Jvb3RwYXRoJ10gKXsKCQkJJHJvb3RwYXRoID0gJHRoaXMtPmN1cnJlbnRGaWxlSW5mb1sncm9vdHBhdGgnXTsKCQl9CgoKCQlpZiggISgkcGF0aCBpbnN0YW5jZW9mIExlc3NfVHJlZV9VUkwpICl7CgkJCWlmKCAkcm9vdHBhdGggKXsKCQkJCSRwYXRoVmFsdWUgPSAkcGF0aC0+dmFsdWU7CgkJCQkvLyBBZGQgdGhlIGJhc2UgcGF0aCBpZiB0aGUgaW1wb3J0IGlzIHJlbGF0aXZlCgkJCQlpZiggJHBhdGhWYWx1ZSAmJiBMZXNzX0Vudmlyb25tZW50Ojppc1BhdGhSZWxhdGl2ZSgkcGF0aFZhbHVlKSApewoJCQkJCSRwYXRoLT52YWx1ZSA9ICR0aGlzLT5jdXJyZW50RmlsZUluZm9bJ3VyaV9yb290J10uJHBhdGhWYWx1ZTsKCQkJCX0KCQkJfQoJCQkkcGF0aC0+dmFsdWUgPSBMZXNzX0Vudmlyb25tZW50Ojpub3JtYWxpemVQYXRoKCRwYXRoLT52YWx1ZSk7CgkJfQoKCgoJCXJldHVybiAkcGF0aDsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSggJGVudiApewoKCQkkZXZhbGQgPSAkdGhpcy0+Y29tcGlsZUZvckltcG9ydCgkZW52KTsKCgkJLy9nZXQgcGF0aCAmIHVyaQoJCSRwYXRoX2FuZF91cmkgPSBudWxsOwoJCWlmKCBpc19jYWxsYWJsZShMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ2ltcG9ydF9jYWxsYmFjayddKSApewoJCQkkcGF0aF9hbmRfdXJpID0gY2FsbF91c2VyX2Z1bmMoTGVzc19QYXJzZXI6OiRvcHRpb25zWydpbXBvcnRfY2FsbGJhY2snXSwkZXZhbGQpOwoJCX0KCgkJaWYoICEkcGF0aF9hbmRfdXJpICl7CgkJCSRwYXRoX2FuZF91cmkgPSAkZXZhbGQtPlBhdGhBbmRVcmkoKTsKCQl9CgoJCWlmKCAkcGF0aF9hbmRfdXJpICl7CgkJCWxpc3QoJGZ1bGxfcGF0aCwgJHVyaSkgPSAkcGF0aF9hbmRfdXJpOwoJCX1lbHNlewoJCQkkZnVsbF9wYXRoID0gJHVyaSA9ICRldmFsZC0+Z2V0UGF0aCgpOwoJCX0KCgoJCS8vaW1wb3J0IG9uY2UKCQlpZiggJGV2YWxkLT5za2lwKCAkZnVsbF9wYXRoLCAkZW52KSApewoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9CgoJCWlmKCAkdGhpcy0+b3B0aW9uc1snaW5saW5lJ10gKXsKCQkJLy90b2RvIG5lZWRzIHRvIHJlZmVyZW5jZSBjc3MgZmlsZSBub3QgaW1wb3J0CgkJCS8vJGNvbnRlbnRzID0gbmV3IExlc3NfVHJlZV9Bbm9ueW1vdXMoJHRoaXMtPnJvb3QsIDAsIGFycmF5KCdmaWxlbmFtZSc9PiR0aGlzLT5pbXBvcnRlZEZpbGVuYW1lKSwgdHJ1ZSApOwoKCQkJTGVzc19QYXJzZXI6OkFkZFBhcnNlZEZpbGUoJGZ1bGxfcGF0aCk7CgkJCSRjb250ZW50cyA9IG5ldyBMZXNzX1RyZWVfQW5vbnltb3VzKCBmaWxlX2dldF9jb250ZW50cygkZnVsbF9wYXRoKSwgMCwgYXJyYXkoKSwgdHJ1ZSApOwoKCQkJaWYoICR0aGlzLT5mZWF0dXJlcyApewoJCQkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfTWVkaWEoIGFycmF5KCRjb250ZW50cyksICR0aGlzLT5mZWF0dXJlcy0+dmFsdWUgKTsKCQkJfQoKCQkJcmV0dXJuIGFycmF5KCAkY29udGVudHMgKTsKCQl9CgoKCQkvLyBjc3MgPwoJCWlmKCAkZXZhbGQtPmNzcyApewoJCQkkZmVhdHVyZXMgPSAoICRldmFsZC0+ZmVhdHVyZXMgPyAkZXZhbGQtPmZlYXR1cmVzLT5jb21waWxlKCRlbnYpIDogbnVsbCApOwoJCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9JbXBvcnQoICR0aGlzLT5jb21waWxlUGF0aCggJGVudiksICRmZWF0dXJlcywgJHRoaXMtPm9wdGlvbnMsICR0aGlzLT5pbmRleCk7CgkJfQoKCgkJcmV0dXJuICR0aGlzLT5QYXJzZUltcG9ydCggJGZ1bGxfcGF0aCwgJHVyaSwgJGVudiApOwoJfQoKCgkvKioKCSAqIFVzaW5nIHRoZSBpbXBvcnQgZGlyZWN0b3JpZXMsIGdldCB0aGUgZnVsbCBhYnNvbHV0ZSBwYXRoIGFuZCB1cmkgb2YgdGhlIGltcG9ydAoJICoKCSAqIEBwYXJhbSBMZXNzX1RyZWVfSW1wb3J0ICRldmFsZAoJICovCiAgICBwdWJsaWMgZnVuY3Rpb24gUGF0aEFuZFVyaSgpewoKCQkkZXZhbGRfcGF0aCA9ICR0aGlzLT5nZXRQYXRoKCk7CgoJCWlmKCAkZXZhbGRfcGF0aCApewoKCQkJJGltcG9ydF9kaXJzID0gYXJyYXkoKTsKCgkJCWlmKCBMZXNzX0Vudmlyb25tZW50Ojppc1BhdGhSZWxhdGl2ZSgkZXZhbGRfcGF0aCkgKXsKCQkJCS8vaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUsIHRoZSBmaWxlIHNob3VsZCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKCQkJCSRpbXBvcnRfZGlyc1sgJHRoaXMtPmN1cnJlbnRGaWxlSW5mb1snY3VycmVudERpcmVjdG9yeSddIF0gPSAkdGhpcy0+Y3VycmVudEZpbGVJbmZvWyd1cmlfcm9vdCddOwoKCQkJfWVsc2V7CgkJCQkvL290aGVyd2lzZSwgdGhlIGZpbGUgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBzZXJ2ZXIgcm9vdAoJCQkJJGltcG9ydF9kaXJzWyAkdGhpcy0+Y3VycmVudEZpbGVJbmZvWydlbnRyeVBhdGgnXSBdID0gJHRoaXMtPmN1cnJlbnRGaWxlSW5mb1snZW50cnlVcmknXTsKCgkJCQkvL2lmIHRoZSB1c2VyIHN1cHBsaWVkIGVudHJ5UGF0aCBpc24ndCB0aGUgYWN0dWFsIHJvb3QKCQkJCSRpbXBvcnRfZGlyc1sgJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXSBdID0gJyc7CgoJCQl9CgoJCQkvLyBhbHdheXMgbG9vayBpbiB1c2VyIHN1cHBsaWVkIGltcG9ydCBkaXJlY3RvcmllcwoJCQkkaW1wb3J0X2RpcnMgPSBhcnJheV9tZXJnZSggJGltcG9ydF9kaXJzLCBMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ2ltcG9ydF9kaXJzJ10gKTsKCgoJCQlmb3JlYWNoKCAkaW1wb3J0X2RpcnMgYXMgJHJvb3RwYXRoID0+ICRyb290dXJpKXsKCQkJCWlmKCBpc19jYWxsYWJsZSgkcm9vdHVyaSkgKXsKCQkJCQlsaXN0KCRwYXRoLCAkdXJpKSA9IGNhbGxfdXNlcl9mdW5jKCRyb290dXJpLCAkZXZhbGRfcGF0aCk7CgkJCQkJaWYoIGlzX3N0cmluZygkcGF0aCkgKXsKCQkJCQkJJGZ1bGxfcGF0aCA9ICRwYXRoOwoJCQkJCQlyZXR1cm4gYXJyYXkoICRmdWxsX3BhdGgsICR1cmkgKTsKCQkJCQl9CgkJCQl9ZWxzZWlmKCAhZW1wdHkoJHJvb3RwYXRoKSApewoKCgkJCQkJaWYoICRyb290dXJpICl7CgkJCQkJCWlmKCBzdHJwb3MoJGV2YWxkX3BhdGgsJHJvb3R1cmkpID09PSAwICl7CgkJCQkJCQkkZXZhbGRfcGF0aCA9IHN1YnN0ciggJGV2YWxkX3BhdGgsIHN0cmxlbigkcm9vdHVyaSkgKTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJJHBhdGggPSBydHJpbSgkcm9vdHBhdGgsJy9cXCcpLicvJy5sdHJpbSgkZXZhbGRfcGF0aCwnL1xcJyk7CgoJCQkJCWlmKCBmaWxlX2V4aXN0cygkcGF0aCkgKXsKCQkJCQkJJGZ1bGxfcGF0aCA9IExlc3NfRW52aXJvbm1lbnQ6Om5vcm1hbGl6ZVBhdGgoJHBhdGgpOwoJCQkJCQkkdXJpID0gTGVzc19FbnZpcm9ubWVudDo6bm9ybWFsaXplUGF0aChkaXJuYW1lKCRyb290dXJpLiRldmFsZF9wYXRoKSk7CgkJCQkJCXJldHVybiBhcnJheSggJGZ1bGxfcGF0aCwgJHVyaSApOwoJCQkJCX0gZWxzZWlmKCBmaWxlX2V4aXN0cygkcGF0aC4nLmxlc3MnKSApewoJCQkJCQkkZnVsbF9wYXRoID0gTGVzc19FbnZpcm9ubWVudDo6bm9ybWFsaXplUGF0aCgkcGF0aC4nLmxlc3MnKTsKCQkJCQkJJHVyaSA9IExlc3NfRW52aXJvbm1lbnQ6Om5vcm1hbGl6ZVBhdGgoZGlybmFtZSgkcm9vdHVyaS4kZXZhbGRfcGF0aC4nLmxlc3MnKSk7CgkJCQkJCXJldHVybiBhcnJheSggJGZ1bGxfcGF0aCwgJHVyaSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCgoJLyoqCgkgKiBQYXJzZSB0aGUgaW1wb3J0IHVybCBhbmQgcmV0dXJuIHRoZSBydWxlcwoJICoKCSAqIEByZXR1cm4gTGVzc19UcmVlX01lZGlhfGFycmF5CgkgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBQYXJzZUltcG9ydCggJGZ1bGxfcGF0aCwgJHVyaSwgJGVudiApewoKCQkkaW1wb3J0X2VudiA9IGNsb25lICRlbnY7CgkJaWYoIChpc3NldCgkdGhpcy0+b3B0aW9uc1sncmVmZXJlbmNlJ10pICYmICR0aGlzLT5vcHRpb25zWydyZWZlcmVuY2UnXSkgfHwgaXNzZXQoJHRoaXMtPmN1cnJlbnRGaWxlSW5mb1sncmVmZXJlbmNlJ10pICl7CgkJCSRpbXBvcnRfZW52LT5jdXJyZW50RmlsZUluZm9bJ3JlZmVyZW5jZSddID0gdHJ1ZTsKCQl9CgoJCWlmKCAoaXNzZXQoJHRoaXMtPm9wdGlvbnNbJ211bHRpcGxlJ10pICYmICR0aGlzLT5vcHRpb25zWydtdWx0aXBsZSddKSApewoJCQkkaW1wb3J0X2Vudi0+aW1wb3J0TXVsdGlwbGUgPSB0cnVlOwoJCX0KCgkJJHBhcnNlciA9IG5ldyBMZXNzX1BhcnNlcigkaW1wb3J0X2Vudik7CgkJJHJvb3QgPSAkcGFyc2VyLT5wYXJzZUZpbGUoJGZ1bGxfcGF0aCwgJHVyaSwgdHJ1ZSk7CgoKCQkkcnVsZXNldCA9IG5ldyBMZXNzX1RyZWVfUnVsZXNldChhcnJheSgpLCAkcm9vdC0+cnVsZXMgKTsKCQkkcnVsZXNldC0+ZXZhbEltcG9ydHMoJGltcG9ydF9lbnYpOwoKCQlyZXR1cm4gJHRoaXMtPmZlYXR1cmVzID8gbmV3IExlc3NfVHJlZV9NZWRpYSgkcnVsZXNldC0+cnVsZXMsICR0aGlzLT5mZWF0dXJlcy0+dmFsdWUpIDogJHJ1bGVzZXQtPnJ1bGVzOwoJfQoKCgkvKioKCSAqIFNob3VsZCB0aGUgaW1wb3J0IGJlIHNraXBwZWQ/CgkgKgoJICogQHJldHVybiBib29sZWFufG51bGwKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBTa2lwKCRwYXRoLCAkZW52KXsKCgkJJHBhdGggPSBMZXNzX1BhcnNlcjo6d2luUGF0aChyZWFscGF0aCgkcGF0aCkpOwoKCQlpZiggJHBhdGggJiYgTGVzc19QYXJzZXI6OkZpbGVQYXJzZWQoJHBhdGgpICl7CgoJCQlpZiggaXNzZXQoJHRoaXMtPmN1cnJlbnRGaWxlSW5mb1sncmVmZXJlbmNlJ10pICl7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoKCQkJcmV0dXJuICFpc3NldCgkdGhpcy0+b3B0aW9uc1snbXVsdGlwbGUnXSkgJiYgISRlbnYtPmltcG9ydE11bHRpcGxlOwoJCX0KCgl9Cn0KCiAKCi8qKgogKiBKYXZhc2NyaXB0CiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdHJlZQogKi8KY2xhc3MgTGVzc19UcmVlX0phdmFzY3JpcHQgZXh0ZW5kcyBMZXNzX1RyZWV7CgoJcHVibGljICR0eXBlID0gJ0phdmFzY3JpcHQnOwoJcHVibGljICRlc2NhcGVkOwoJcHVibGljICRleHByZXNzaW9uOwoJcHVibGljICRpbmRleDsKCgkvKioKCSAqIEBwYXJhbSBib29sZWFuICRpbmRleAoJICogQHBhcmFtIGJvb2xlYW4gJGVzY2FwZWQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdHJpbmcsICRpbmRleCwgJGVzY2FwZWQpewoJCSR0aGlzLT5lc2NhcGVkID0gJGVzY2FwZWQ7CgkJJHRoaXMtPmV4cHJlc3Npb24gPSAkc3RyaW5nOwoJCSR0aGlzLT5pbmRleCA9ICRpbmRleDsKCX0KCglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgpewoJCXJldHVybiBuZXcgTGVzc19UcmVlX0Fub255bW91cygnLyogU29ycnksIGNhbiBub3QgZG8gSmF2YVNjcmlwdCBldmFsdWF0aW9uIGluIFBIUC4uLiA6KCAqLycpOwoJfQoKfQogCgovKioKICogS2V5d29yZAogKgogKiBAcGFja2FnZSBMZXNzCiAqIEBzdWJwYWNrYWdlIHRyZWUKICovCmNsYXNzIExlc3NfVHJlZV9LZXl3b3JkIGV4dGVuZHMgTGVzc19UcmVlewoKCXB1YmxpYyAkdmFsdWU7CglwdWJsaWMgJHR5cGUgPSAnS2V5d29yZCc7CgoJLyoqCgkgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHZhbHVlKXsKCQkkdGhpcy0+dmFsdWUgPSAkdmFsdWU7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoKXsKCQlyZXR1cm4gJHRoaXM7Cgl9CgogICAgLyoqCiAgICAgKiBAc2VlIExlc3NfVHJlZTo6Z2VuQ1NTCiAgICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZW5DU1MoICRvdXRwdXQgKXsKCgkJaWYoICR0aGlzLT52YWx1ZSA9PT0gJyUnKSB7CgkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcigiSW52YWxpZCAlIHdpdGhvdXQgbnVtYmVyIik7CgkJfQoKCQkkb3V0cHV0LT5hZGQoICR0aGlzLT52YWx1ZSApOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBjb21wYXJlKCRvdGhlcikgewoJCWlmICgkb3RoZXIgaW5zdGFuY2VvZiBMZXNzX1RyZWVfS2V5d29yZCkgewoJCQlyZXR1cm4gJG90aGVyLT52YWx1ZSA9PT0gJHRoaXMtPnZhbHVlID8gMCA6IDE7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIC0xOwoJCX0KCX0KfQogCgovKioKICogTWVkaWEKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfTWVkaWEgZXh0ZW5kcyBMZXNzX1RyZWV7CgoJcHVibGljICRmZWF0dXJlczsKCXB1YmxpYyAkcnVsZXM7CglwdWJsaWMgJGluZGV4OwoJcHVibGljICRjdXJyZW50RmlsZUluZm87CglwdWJsaWMgJGlzUmVmZXJlbmNlZDsKCXB1YmxpYyAkdHlwZSA9ICdNZWRpYSc7CgoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR2YWx1ZSA9IGFycmF5KCksICRmZWF0dXJlcyA9IGFycmF5KCksICRpbmRleCA9IG51bGwsICRjdXJyZW50RmlsZUluZm8gPSBudWxsICl7CgoJCSR0aGlzLT5pbmRleCA9ICRpbmRleDsKCQkkdGhpcy0+Y3VycmVudEZpbGVJbmZvID0gJGN1cnJlbnRGaWxlSW5mbzsKCgkJJHNlbGVjdG9ycyA9ICR0aGlzLT5lbXB0eVNlbGVjdG9ycygpOwoKCQkkdGhpcy0+ZmVhdHVyZXMgPSBuZXcgTGVzc19UcmVlX1ZhbHVlKCRmZWF0dXJlcyk7CgoJCSR0aGlzLT5ydWxlcyA9IGFycmF5KG5ldyBMZXNzX1RyZWVfUnVsZXNldCgkc2VsZWN0b3JzLCAkdmFsdWUpKTsKCQkkdGhpcy0+cnVsZXNbMF0tPmFsbG93SW1wb3J0cyA9IHRydWU7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdCggJHZpc2l0b3IgKXsKCQkkdGhpcy0+ZmVhdHVyZXMgPSAkdmlzaXRvci0+dmlzaXRPYmooJHRoaXMtPmZlYXR1cmVzKTsKCQkkdGhpcy0+cnVsZXMgPSAkdmlzaXRvci0+dmlzaXRBcnJheSgkdGhpcy0+cnVsZXMpOwoJfQoKICAgIC8qKgogICAgICogQHNlZSBMZXNzX1RyZWU6OmdlbkNTUwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2VuQ1NTKCAkb3V0cHV0ICl7CgoJCSRvdXRwdXQtPmFkZCggJ0BtZWRpYSAnLCAkdGhpcy0+Y3VycmVudEZpbGVJbmZvLCAkdGhpcy0+aW5kZXggKTsKCQkkdGhpcy0+ZmVhdHVyZXMtPmdlbkNTUyggJG91dHB1dCApOwoJCUxlc3NfVHJlZTo6b3V0cHV0UnVsZXNldCggJG91dHB1dCwgJHRoaXMtPnJ1bGVzKTsKCgl9CgoJcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoJGVudikgewoKCQkkbWVkaWEgPSBuZXcgTGVzc19UcmVlX01lZGlhKGFycmF5KCksIGFycmF5KCksICR0aGlzLT5pbmRleCwgJHRoaXMtPmN1cnJlbnRGaWxlSW5mbyApOwoKCQkkc3RyaWN0TWF0aEJ5cGFzcyA9IGZhbHNlOwoJCWlmKCBMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ3N0cmljdE1hdGgnXSA9PT0gZmFsc2UpIHsKCQkJJHN0cmljdE1hdGhCeXBhc3MgPSB0cnVlOwoJCQlMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ3N0cmljdE1hdGgnXSA9IHRydWU7CgkJfQoKCQkkbWVkaWEtPmZlYXR1cmVzID0gJHRoaXMtPmZlYXR1cmVzLT5jb21waWxlKCRlbnYpOwoKCQlpZiggJHN0cmljdE1hdGhCeXBhc3MgKXsKCQkJTGVzc19QYXJzZXI6OiRvcHRpb25zWydzdHJpY3RNYXRoJ10gPSBmYWxzZTsKCQl9CgoJCSRlbnYtPm1lZGlhUGF0aFtdID0gJG1lZGlhOwoJCSRlbnYtPm1lZGlhQmxvY2tzW10gPSAkbWVkaWE7CgoJCWFycmF5X3Vuc2hpZnQoJGVudi0+ZnJhbWVzLCAkdGhpcy0+cnVsZXNbMF0pOwoJCSRtZWRpYS0+cnVsZXMgPSBhcnJheSgkdGhpcy0+cnVsZXNbMF0tPmNvbXBpbGUoJGVudikpOwoJCWFycmF5X3NoaWZ0KCRlbnYtPmZyYW1lcyk7CgoJCWFycmF5X3BvcCgkZW52LT5tZWRpYVBhdGgpOwoKCQlyZXR1cm4gISRlbnYtPm1lZGlhUGF0aCA/ICRtZWRpYS0+Y29tcGlsZVRvcCgkZW52KSA6ICRtZWRpYS0+Y29tcGlsZU5lc3RlZCgkZW52KTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdmFyaWFibGUoJG5hbWUpIHsKCQlyZXR1cm4gJHRoaXMtPnJ1bGVzWzBdLT52YXJpYWJsZSgkbmFtZSk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGZpbmQoJHNlbGVjdG9yKSB7CgkJcmV0dXJuICR0aGlzLT5ydWxlc1swXS0+ZmluZCgkc2VsZWN0b3IsICR0aGlzKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZW1wdHlTZWxlY3RvcnMoKXsKCQkkZWwgPSBuZXcgTGVzc19UcmVlX0VsZW1lbnQoJycsJyYnLCAkdGhpcy0+aW5kZXgsICR0aGlzLT5jdXJyZW50RmlsZUluZm8gKTsKCQkkc2VscyA9IGFycmF5KCBuZXcgTGVzc19UcmVlX1NlbGVjdG9yKGFycmF5KCRlbCksIGFycmF5KCksIG51bGwsICR0aGlzLT5pbmRleCwgJHRoaXMtPmN1cnJlbnRGaWxlSW5mbykgKTsKCQkkc2Vsc1swXS0+bWVkaWFFbXB0eSA9IHRydWU7CiAgICAgICAgcmV0dXJuICRzZWxzOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBtYXJrUmVmZXJlbmNlZCgpewoJCSR0aGlzLT5ydWxlc1swXS0+bWFya1JlZmVyZW5jZWQoKTsKCQkkdGhpcy0+aXNSZWZlcmVuY2VkID0gdHJ1ZTsKCQlMZXNzX1RyZWU6OlJlZmVyZW5jZWRBcnJheSgkdGhpcy0+cnVsZXNbMF0tPnJ1bGVzKTsKCX0KCgkvLyBldmFsdG9wCglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZVRvcCgkZW52KSB7CgkJJHJlc3VsdCA9ICR0aGlzOwoKCQlpZiAoY291bnQoJGVudi0+bWVkaWFCbG9ja3MpID4gMSkgewoJCQkkc2VsZWN0b3JzID0gJHRoaXMtPmVtcHR5U2VsZWN0b3JzKCk7CgkJCSRyZXN1bHQgPSBuZXcgTGVzc19UcmVlX1J1bGVzZXQoJHNlbGVjdG9ycywgJGVudi0+bWVkaWFCbG9ja3MpOwoJCQkkcmVzdWx0LT5tdWx0aU1lZGlhID0gdHJ1ZTsKCQl9CgoJCSRlbnYtPm1lZGlhQmxvY2tzID0gYXJyYXkoKTsKCQkkZW52LT5tZWRpYVBhdGggPSBhcnJheSgpOwoKCQlyZXR1cm4gJHJlc3VsdDsKCX0KCglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZU5lc3RlZCgkZW52KSB7CgkJJHBhdGggPSBhcnJheV9tZXJnZSgkZW52LT5tZWRpYVBhdGgsIGFycmF5KCR0aGlzKSk7CgoJCS8vIEV4dHJhY3QgdGhlIG1lZGlhLXF1ZXJ5IGNvbmRpdGlvbnMgc2VwYXJhdGVkIHdpdGggYCxgIChPUikuCgkJZm9yZWFjaCAoJHBhdGggYXMgJGtleSA9PiAkcCkgewoJCQkkdmFsdWUgPSAkcC0+ZmVhdHVyZXMgaW5zdGFuY2VvZiBMZXNzX1RyZWVfVmFsdWUgPyAkcC0+ZmVhdHVyZXMtPnZhbHVlIDogJHAtPmZlYXR1cmVzOwoJCQkkcGF0aFska2V5XSA9IGlzX2FycmF5KCR2YWx1ZSkgPyAkdmFsdWUgOiBhcnJheSgkdmFsdWUpOwoJCX0KCgkJLy8gVHJhY2UgYWxsIHBlcm11dGF0aW9ucyB0byBnZW5lcmF0ZSB0aGUgcmVzdWx0aW5nIG1lZGlhLXF1ZXJ5LgoJCS8vCgkJLy8gKGEsIGIgYW5kIGMpIHdpdGggbmVzdGVkIChkLCBlKSAtPgoJCS8vCWEgYW5kIGQKCQkvLwlhIGFuZCBlCgkJLy8JYiBhbmQgYyBhbmQgZAoJCS8vCWIgYW5kIGMgYW5kIGUKCgkJJHBlcm11dGVkID0gJHRoaXMtPnBlcm11dGUoJHBhdGgpOwoJCSRleHByZXNzaW9ucyA9IGFycmF5KCk7CgkJZm9yZWFjaCgkcGVybXV0ZWQgYXMgJHBhdGgpewoKCQkJZm9yKCAkaT0wLCAkbGVuPWNvdW50KCRwYXRoKTsgJGkgPCAkbGVuOyAkaSsrKXsKCQkJCSRwYXRoWyRpXSA9IExlc3NfUGFyc2VyOjppc19tZXRob2QoJHBhdGhbJGldLCAndG9DU1MnKSA/ICRwYXRoWyRpXSA6IG5ldyBMZXNzX1RyZWVfQW5vbnltb3VzKCRwYXRoWyRpXSk7CgkJCX0KCgkJCWZvciggJGkgPSBjb3VudCgkcGF0aCkgLSAxOyAkaSA+IDA7ICRpLS0gKXsKCQkJCWFycmF5X3NwbGljZSgkcGF0aCwgJGksIDAsIGFycmF5KG5ldyBMZXNzX1RyZWVfQW5vbnltb3VzKCdhbmQnKSkpOwoJCQl9CgoJCQkkZXhwcmVzc2lvbnNbXSA9IG5ldyBMZXNzX1RyZWVfRXhwcmVzc2lvbigkcGF0aCk7CgkJfQoJCSR0aGlzLT5mZWF0dXJlcyA9IG5ldyBMZXNzX1RyZWVfVmFsdWUoJGV4cHJlc3Npb25zKTsKCgoKCQkvLyBGYWtlIGEgdHJlZS1ub2RlIHRoYXQgZG9lc24ndCBvdXRwdXQgYW55dGhpbmcuCgkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfUnVsZXNldChhcnJheSgpLCBhcnJheSgpKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gcGVybXV0ZSgkYXJyKSB7CgkJaWYgKCEkYXJyKQoJCQlyZXR1cm4gYXJyYXkoKTsKCgkJaWYgKGNvdW50KCRhcnIpID09IDEpCgkJCXJldHVybiAkYXJyWzBdOwoKCQkkcmVzdWx0ID0gYXJyYXkoKTsKCQkkcmVzdCA9ICR0aGlzLT5wZXJtdXRlKGFycmF5X3NsaWNlKCRhcnIsIDEpKTsKCQlmb3JlYWNoICgkcmVzdCBhcyAkcikgewoJCQlmb3JlYWNoICgkYXJyWzBdIGFzICRhKSB7CgkJCQkkcmVzdWx0W10gPSBhcnJheV9tZXJnZSgKCQkJCQlpc19hcnJheSgkYSkgPyAkYSA6IGFycmF5KCRhKSwKCQkJCQlpc19hcnJheSgkcikgPyAkciA6IGFycmF5KCRyKQoJCQkJKTsKCQkJfQoJCX0KCgkJcmV0dXJuICRyZXN1bHQ7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIGJ1YmJsZVNlbGVjdG9ycygkc2VsZWN0b3JzKSB7CgoJCWlmKCAhJHNlbGVjdG9ycykgcmV0dXJuOwoKCQkkdGhpcy0+cnVsZXMgPSBhcnJheShuZXcgTGVzc19UcmVlX1J1bGVzZXQoICRzZWxlY3RvcnMsIGFycmF5KCR0aGlzLT5ydWxlc1swXSkpKTsKCX0KCn0KIAoKLyoqCiAqIEEgc2ltcGxlIGNzcyBuYW1lLXZhbHVlIHBhaXIKICogZXg6IHdpZHRoOjEwMHB4OwogKgogKiBJbiBib290c3RyYXAsIHRoZXJlIGFyZSBhYm91dCA2MDAtMSwwMDAgc2ltcGxlIG5hbWUtdmFsdWUgcGFpcnMgKGRlcGVuZGluZyBvbiBob3cgZm9yZ2l2aW5nIHRoZSBtYXRjaCBpcykgLXZzLSA2LDAyMCBkeW5hbWljIHJ1bGVzIChMZXNzX1RyZWVfUnVsZSkKICogVXNpbmcgdGhlIG5hbWUtdmFsdWUgb2JqZWN0IGNhbiBzcGVlZCB1cCBib290c3RyYXAgY29tcGlsYXRpb24gc2xpZ2h0bHksIGJ1dCBpdCBicmVha3MgY29sb3Iga2V5d29yZCBpbnRlcnByZXRhdGlvbjogY29sb3I6cmVkIC0+IGNvbG9yOiNGRjAwMDA7CiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdHJlZQogKi8KY2xhc3MgTGVzc19UcmVlX05hbWVWYWx1ZSBleHRlbmRzIExlc3NfVHJlZXsKCglwdWJsaWMgJG5hbWU7CglwdWJsaWMgJHZhbHVlOwoJcHVibGljICRpbmRleDsKCXB1YmxpYyAkY3VycmVudEZpbGVJbmZvOwoJcHVibGljICR0eXBlID0gJ05hbWVWYWx1ZSc7CgoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRuYW1lLCAkdmFsdWUgPSBudWxsLCAkaW5kZXggPSBudWxsLCAkY3VycmVudEZpbGVJbmZvID0gbnVsbCApewoJCSR0aGlzLT5uYW1lID0gJG5hbWU7CgkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoJCSR0aGlzLT5pbmRleCA9ICRpbmRleDsKCQkkdGhpcy0+Y3VycmVudEZpbGVJbmZvID0gJGN1cnJlbnRGaWxlSW5mbzsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2VuQ1NTKCAkb3V0cHV0ICl7CgoJCSRvdXRwdXQtPmFkZCgKCQkJJHRoaXMtPm5hbWUKCQkJLiBMZXNzX0Vudmlyb25tZW50OjokX291dHB1dE1hcFsnOiAnXQoJCQkuICR0aGlzLT52YWx1ZQoJCQkuICgoKExlc3NfRW52aXJvbm1lbnQ6OiRsYXN0UnVsZSAmJiBMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ2NvbXByZXNzJ10pKSA/ICIiIDogIjsiKQoJCQksICR0aGlzLT5jdXJyZW50RmlsZUluZm8sICR0aGlzLT5pbmRleCk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUgKCRlbnYpewoJCXJldHVybiAkdGhpczsKCX0KfQogCgovKioKICogTmVnYXRpdmUKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfTmVnYXRpdmUgZXh0ZW5kcyBMZXNzX1RyZWV7CgoJcHVibGljICR2YWx1ZTsKCXB1YmxpYyAkdHlwZSA9ICdOZWdhdGl2ZSc7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRub2RlKXsKCQkkdGhpcy0+dmFsdWUgPSAkbm9kZTsKCX0KCgkvL2Z1bmN0aW9uIGFjY2VwdCgkdmlzaXRvcikgewoJLy8JJHRoaXMtPnZhbHVlID0gJHZpc2l0b3ItPnZpc2l0KCR0aGlzLT52YWx1ZSk7CgkvL30KCiAgICAvKioKICAgICAqIEBzZWUgTGVzc19UcmVlOjpnZW5DU1MKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdlbkNTUyggJG91dHB1dCApewoJCSRvdXRwdXQtPmFkZCggJy0nICk7CgkJJHRoaXMtPnZhbHVlLT5nZW5DU1MoICRvdXRwdXQgKTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkZW52KSB7CgkJaWYoIExlc3NfRW52aXJvbm1lbnQ6OmlzTWF0aE9uKCkgKXsKCQkJJHJldCA9IG5ldyBMZXNzX1RyZWVfT3BlcmF0aW9uKCcqJywgYXJyYXkoIG5ldyBMZXNzX1RyZWVfRGltZW5zaW9uKC0xKSwgJHRoaXMtPnZhbHVlICkgKTsKCQkJcmV0dXJuICRyZXQtPmNvbXBpbGUoJGVudik7CgkJfQoJCXJldHVybiBuZXcgTGVzc19UcmVlX05lZ2F0aXZlKCAkdGhpcy0+dmFsdWUtPmNvbXBpbGUoJGVudikgKTsKCX0KfSAKCi8qKgogKiBPcGVyYXRpb24KICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfT3BlcmF0aW9uIGV4dGVuZHMgTGVzc19UcmVlewoKCXB1YmxpYyAkb3A7CglwdWJsaWMgJG9wZXJhbmRzOwoJcHVibGljICRpc1NwYWNlZDsKCXB1YmxpYyAkdHlwZSA9ICdPcGVyYXRpb24nOwoKCS8qKgoJICogQHBhcmFtIHN0cmluZyAkb3AKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRvcCwgJG9wZXJhbmRzLCAkaXNTcGFjZWQgPSBmYWxzZSl7CgkJJHRoaXMtPm9wID0gdHJpbSgkb3ApOwoJCSR0aGlzLT5vcGVyYW5kcyA9ICRvcGVyYW5kczsKCQkkdGhpcy0+aXNTcGFjZWQgPSAkaXNTcGFjZWQ7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgkdmlzaXRvcikgewoJCSR0aGlzLT5vcGVyYW5kcyA9ICR2aXNpdG9yLT52aXNpdEFycmF5KCR0aGlzLT5vcGVyYW5kcyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoJGVudil7CgkJJGEgPSAkdGhpcy0+b3BlcmFuZHNbMF0tPmNvbXBpbGUoJGVudik7CgkJJGIgPSAkdGhpcy0+b3BlcmFuZHNbMV0tPmNvbXBpbGUoJGVudik7CgoKCQlpZiggTGVzc19FbnZpcm9ubWVudDo6aXNNYXRoT24oKSApewoKCQkJaWYoICRhIGluc3RhbmNlb2YgTGVzc19UcmVlX0RpbWVuc2lvbiAmJiAkYiBpbnN0YW5jZW9mIExlc3NfVHJlZV9Db2xvciApewoJCQkJJGEgPSAkYS0+dG9Db2xvcigpOwoKCQkJfWVsc2VpZiggJGIgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRGltZW5zaW9uICYmICRhIGluc3RhbmNlb2YgTGVzc19UcmVlX0NvbG9yICl7CgkJCQkkYiA9ICRiLT50b0NvbG9yKCk7CgoJCQl9CgoJCQlpZiggIW1ldGhvZF9leGlzdHMoJGEsJ29wZXJhdGUnKSApewoJCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCJPcGVyYXRpb24gb24gYW4gaW52YWxpZCB0eXBlIik7CgkJCX0KCgkJCXJldHVybiAkYS0+b3BlcmF0ZSggJHRoaXMtPm9wLCAkYik7CgkJfQoKCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9PcGVyYXRpb24oJHRoaXMtPm9wLCBhcnJheSgkYSwgJGIpLCAkdGhpcy0+aXNTcGFjZWQgKTsKCX0KCgogICAgLyoqCiAgICAgKiBAc2VlIExlc3NfVHJlZTo6Z2VuQ1NTCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZW5DU1MoICRvdXRwdXQgKXsKCQkkdGhpcy0+b3BlcmFuZHNbMF0tPmdlbkNTUyggJG91dHB1dCApOwoJCWlmKCAkdGhpcy0+aXNTcGFjZWQgKXsKCQkJJG91dHB1dC0+YWRkKCAiICIgKTsKCQl9CgkJJG91dHB1dC0+YWRkKCAkdGhpcy0+b3AgKTsKCQlpZiggJHRoaXMtPmlzU3BhY2VkICl7CgkJCSRvdXRwdXQtPmFkZCggJyAnICk7CgkJfQoJCSR0aGlzLT5vcGVyYW5kc1sxXS0+Z2VuQ1NTKCAkb3V0cHV0ICk7Cgl9Cgp9CiAKCi8qKgogKiBQYXJlbgogKgogKiBAcGFja2FnZSBMZXNzCiAqIEBzdWJwYWNrYWdlIHRyZWUKICovCmNsYXNzIExlc3NfVHJlZV9QYXJlbiBleHRlbmRzIExlc3NfVHJlZXsKCglwdWJsaWMgJHZhbHVlOwoJcHVibGljICR0eXBlID0gJ1BhcmVuJzsKCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHZhbHVlKSB7CgkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoJHZpc2l0b3IpewoJCSR0aGlzLT52YWx1ZSA9ICR2aXNpdG9yLT52aXNpdE9iaigkdGhpcy0+dmFsdWUpOwoJfQoKICAgIC8qKgogICAgICogQHNlZSBMZXNzX1RyZWU6OmdlbkNTUwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2VuQ1NTKCAkb3V0cHV0ICl7CgkJJG91dHB1dC0+YWRkKCAnKCcgKTsKCQkkdGhpcy0+dmFsdWUtPmdlbkNTUyggJG91dHB1dCApOwoJCSRvdXRwdXQtPmFkZCggJyknICk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoJGVudikgewoJCXJldHVybiBuZXcgTGVzc19UcmVlX1BhcmVuKCR0aGlzLT52YWx1ZS0+Y29tcGlsZSgkZW52KSk7Cgl9Cgp9CiAKCi8qKgogKiBRdW90ZWQKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfUXVvdGVkIGV4dGVuZHMgTGVzc19UcmVlewoJcHVibGljICRlc2NhcGVkOwoJcHVibGljICR2YWx1ZTsKCXB1YmxpYyAkcXVvdGU7CglwdWJsaWMgJGluZGV4OwoJcHVibGljICRjdXJyZW50RmlsZUluZm87CglwdWJsaWMgJHR5cGUgPSAnUXVvdGVkJzsKCgkvKioKCSAqIEBwYXJhbSBzdHJpbmcgJHN0cgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHN0ciwgJGNvbnRlbnQgPSAnJywgJGVzY2FwZWQgPSBmYWxzZSwgJGluZGV4ID0gZmFsc2UsICRjdXJyZW50RmlsZUluZm8gPSBudWxsICl7CgkJJHRoaXMtPmVzY2FwZWQgPSAkZXNjYXBlZDsKCQkkdGhpcy0+dmFsdWUgPSAkY29udGVudDsKCQlpZiggJHN0ciApewoJCQkkdGhpcy0+cXVvdGUgPSAkc3RyWzBdOwoJCX0KCQkkdGhpcy0+aW5kZXggPSAkaW5kZXg7CgkJJHRoaXMtPmN1cnJlbnRGaWxlSW5mbyA9ICRjdXJyZW50RmlsZUluZm87Cgl9CgogICAgLyoqCiAgICAgKiBAc2VlIExlc3NfVHJlZTo6Z2VuQ1NTCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZW5DU1MoICRvdXRwdXQgKXsKCQlpZiggISR0aGlzLT5lc2NhcGVkICl7CgkJCSRvdXRwdXQtPmFkZCggJHRoaXMtPnF1b3RlLCAkdGhpcy0+Y3VycmVudEZpbGVJbmZvLCAkdGhpcy0+aW5kZXggKTsKICAgICAgICB9CiAgICAgICAgJG91dHB1dC0+YWRkKCAkdGhpcy0+dmFsdWUgKTsKICAgICAgICBpZiggISR0aGlzLT5lc2NhcGVkICl7CgkJCSRvdXRwdXQtPmFkZCggJHRoaXMtPnF1b3RlICk7CiAgICAgICAgfQogICAgfQoKCXB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRlbnYpewoKCQkkdmFsdWUgPSAkdGhpcy0+dmFsdWU7CgkJaWYoIHByZWdfbWF0Y2hfYWxsKCcvYChbXmBdKylgLycsICR0aGlzLT52YWx1ZSwgJG1hdGNoZXMpICl7CgkJCWZvcmVhY2goJG1hdGNoZXMgYXMgJGkgPT4gJG1hdGNoKXsKCQkJCSRqcyA9IG5ldyBMZXNzX1RyZWVfSmF2YVNjcmlwdCgkbWF0Y2hlc1sxXSwgJHRoaXMtPmluZGV4LCB0cnVlKTsKCQkJCSRqcyA9ICRqcy0+Y29tcGlsZSgpLT52YWx1ZTsKCQkJCSR2YWx1ZSA9IHN0cl9yZXBsYWNlKCRtYXRjaGVzWzBdWyRpXSwgJGpzLCAkdmFsdWUpOwoJCQl9CgkJfQoKCQlpZiggcHJlZ19tYXRjaF9hbGwoJy9AXHsoW1x3LV0rKVx9LycsJHZhbHVlLCRtYXRjaGVzKSApewoJCQlmb3JlYWNoKCRtYXRjaGVzWzFdIGFzICRpID0+ICRtYXRjaCl7CgkJCQkkdiA9IG5ldyBMZXNzX1RyZWVfVmFyaWFibGUoJ0AnIC4gJG1hdGNoLCAkdGhpcy0+aW5kZXgsICR0aGlzLT5jdXJyZW50RmlsZUluZm8gKTsKCQkJCSR2ID0gJHYtPmNvbXBpbGUoJGVudik7CgkJCQkkdiA9ICgkdiBpbnN0YW5jZW9mIExlc3NfVHJlZV9RdW90ZWQpID8gJHYtPnZhbHVlIDogJHYtPnRvQ1NTKCk7CgkJCQkkdmFsdWUgPSBzdHJfcmVwbGFjZSgkbWF0Y2hlc1swXVskaV0sICR2LCAkdmFsdWUpOwoJCQl9CgkJfQoKCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9RdW90ZWQoJHRoaXMtPnF1b3RlIC4gJHZhbHVlIC4gJHRoaXMtPnF1b3RlLCAkdmFsdWUsICR0aGlzLT5lc2NhcGVkLCAkdGhpcy0+aW5kZXgsICR0aGlzLT5jdXJyZW50RmlsZUluZm8pOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb21wYXJlKCR4KSB7CgoJCWlmKCAhTGVzc19QYXJzZXI6OmlzX21ldGhvZCgkeCwgJ3RvQ1NTJykgKXsKCQkJcmV0dXJuIC0xOwoJCX0KCgkJJGxlZnQgPSAkdGhpcy0+dG9DU1MoKTsKCQkkcmlnaHQgPSAkeC0+dG9DU1MoKTsKCgkJaWYgKCRsZWZ0ID09PSAkcmlnaHQpIHsKCQkJcmV0dXJuIDA7CgkJfQoKCQlyZXR1cm4gJGxlZnQgPCAkcmlnaHQgPyAtMSA6IDE7Cgl9Cn0KIAoKLyoqCiAqIFJ1bGUKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfUnVsZSBleHRlbmRzIExlc3NfVHJlZXsKCglwdWJsaWMgJG5hbWU7CglwdWJsaWMgJHZhbHVlOwoJcHVibGljICRpbXBvcnRhbnQ7CglwdWJsaWMgJG1lcmdlOwoJcHVibGljICRpbmRleDsKCXB1YmxpYyAkaW5saW5lOwoJcHVibGljICR2YXJpYWJsZTsKCXB1YmxpYyAkY3VycmVudEZpbGVJbmZvOwoJcHVibGljICR0eXBlID0gJ1J1bGUnOwoKCS8qKgoJICogQHBhcmFtIHN0cmluZyAkaW1wb3J0YW50CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbmFtZSwgJHZhbHVlID0gbnVsbCwgJGltcG9ydGFudCA9IG51bGwsICRtZXJnZSA9IG51bGwsICRpbmRleCA9IG51bGwsICRjdXJyZW50RmlsZUluZm8gPSBudWxsLCAgJGlubGluZSA9IGZhbHNlKXsKCQkkdGhpcy0+bmFtZSA9ICRuYW1lOwoJCSR0aGlzLT52YWx1ZSA9ICgkdmFsdWUgaW5zdGFuY2VvZiBMZXNzX1RyZWVfVmFsdWUgfHwgJHZhbHVlIGluc3RhbmNlb2YgTGVzc19UcmVlX1J1bGVzZXQpID8gJHZhbHVlIDogbmV3IExlc3NfVHJlZV9WYWx1ZShhcnJheSgkdmFsdWUpKTsKCQkkdGhpcy0+aW1wb3J0YW50ID0gJGltcG9ydGFudCA/ICcgJyAuIHRyaW0oJGltcG9ydGFudCkgOiAnJzsKCQkkdGhpcy0+bWVyZ2UgPSAkbWVyZ2U7CgkJJHRoaXMtPmluZGV4ID0gJGluZGV4OwoJCSR0aGlzLT5jdXJyZW50RmlsZUluZm8gPSAkY3VycmVudEZpbGVJbmZvOwoJCSR0aGlzLT5pbmxpbmUgPSAkaW5saW5lOwoJCSR0aGlzLT52YXJpYWJsZSA9ICggaXNfc3RyaW5nKCRuYW1lKSAmJiAkbmFtZVswXSA9PT0gJ0AnKTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCR2aXNpdG9yKSB7CgkJJHRoaXMtPnZhbHVlID0gJHZpc2l0b3ItPnZpc2l0T2JqKCAkdGhpcy0+dmFsdWUgKTsKCX0KCiAgICAvKioKICAgICAqIEBzZWUgTGVzc19UcmVlOjpnZW5DU1MKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdlbkNTUyggJG91dHB1dCApewoKCQkkb3V0cHV0LT5hZGQoICR0aGlzLT5uYW1lIC4gTGVzc19FbnZpcm9ubWVudDo6JF9vdXRwdXRNYXBbJzogJ10sICR0aGlzLT5jdXJyZW50RmlsZUluZm8sICR0aGlzLT5pbmRleCk7CgkJdHJ5ewoJCQkkdGhpcy0+dmFsdWUtPmdlbkNTUyggJG91dHB1dCk7CgoJCX1jYXRjaCggTGVzc19FeGNlcHRpb25fUGFyc2VyICRlICl7CgkJCSRlLT5pbmRleCA9ICR0aGlzLT5pbmRleDsKCQkJJGUtPmN1cnJlbnRGaWxlID0gJHRoaXMtPmN1cnJlbnRGaWxlSW5mbzsKCQkJdGhyb3cgJGU7CgkJfQoJCSRvdXRwdXQtPmFkZCggJHRoaXMtPmltcG9ydGFudCAuICgoJHRoaXMtPmlubGluZSB8fCAoTGVzc19FbnZpcm9ubWVudDo6JGxhc3RSdWxlICYmIExlc3NfUGFyc2VyOjokb3B0aW9uc1snY29tcHJlc3MnXSkpID8gIiIgOiAiOyIpLCAkdGhpcy0+Y3VycmVudEZpbGVJbmZvLCAkdGhpcy0+aW5kZXgpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBjb21waWxlICgkZW52KXsKCgkJJG5hbWUgPSAkdGhpcy0+bmFtZTsKCQlpZiggaXNfYXJyYXkoJG5hbWUpICl7CgkJCS8vIGV4cGFuZCAncHJpbWl0aXZlJyBuYW1lIGRpcmVjdGx5IHRvIGdldAoJCQkvLyB0aGluZ3MgZmFzdGVyICh+MTAlIGZvciBiZW5jaG1hcmsubGVzcyk6CgkJCWlmKCBjb3VudCgkbmFtZSkgPT09IDEgJiYgJG5hbWVbMF0gaW5zdGFuY2VvZiBMZXNzX1RyZWVfS2V5d29yZCApewoJCQkJJG5hbWUgPSAkbmFtZVswXS0+dmFsdWU7CgkJCX1lbHNlewoJCQkJJG5hbWUgPSAkdGhpcy0+Q29tcGlsZU5hbWUoJGVudiwkbmFtZSk7CgkJCX0KCQl9CgoJCSRzdHJpY3RNYXRoQnlwYXNzID0gTGVzc19QYXJzZXI6OiRvcHRpb25zWydzdHJpY3RNYXRoJ107CgkJaWYoICRuYW1lID09PSAiZm9udCIgJiYgIUxlc3NfUGFyc2VyOjokb3B0aW9uc1snc3RyaWN0TWF0aCddICl7CgkJCUxlc3NfUGFyc2VyOjokb3B0aW9uc1snc3RyaWN0TWF0aCddID0gdHJ1ZTsKCQl9CgoJCXRyeSB7CgkJCSRldmFsZFZhbHVlID0gJHRoaXMtPnZhbHVlLT5jb21waWxlKCRlbnYpOwoKCQkJaWYoICEkdGhpcy0+dmFyaWFibGUgJiYgJGV2YWxkVmFsdWUtPnR5cGUgPT09ICJEZXRhY2hlZFJ1bGVzZXQiKSB7CgkJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoIlJ1bGVzZXRzIGNhbm5vdCBiZSBldmFsdWF0ZWQgb24gYSBwcm9wZXJ0eS4iLCBudWxsLCAkdGhpcy0+aW5kZXgsICR0aGlzLT5jdXJyZW50RmlsZUluZm8pOwoJCQl9CgoJCQlpZiggTGVzc19FbnZpcm9ubWVudDo6JG1peGluX3N0YWNrICl7CgkJCQkkcmV0dXJuID0gbmV3IExlc3NfVHJlZV9SdWxlKCRuYW1lLCAkZXZhbGRWYWx1ZSwgJHRoaXMtPmltcG9ydGFudCwgJHRoaXMtPm1lcmdlLCAkdGhpcy0+aW5kZXgsICR0aGlzLT5jdXJyZW50RmlsZUluZm8sICR0aGlzLT5pbmxpbmUpOwoJCQl9ZWxzZXsKCQkJCSR0aGlzLT5uYW1lID0gJG5hbWU7CgkJCQkkdGhpcy0+dmFsdWUgPSAkZXZhbGRWYWx1ZTsKCQkJCSRyZXR1cm4gPSAkdGhpczsKCQkJfQoKCQl9Y2F0Y2goIExlc3NfRXhjZXB0aW9uX1BhcnNlciAkZSApewoJCQlpZiggIWlzX251bWVyaWMoJGUtPmluZGV4KSApewoJCQkJJGUtPmluZGV4ID0gJHRoaXMtPmluZGV4OwoJCQkJJGUtPmN1cnJlbnRGaWxlID0gJHRoaXMtPmN1cnJlbnRGaWxlSW5mbzsKCQkJfQoJCQl0aHJvdyAkZTsKCQl9CgoJCUxlc3NfUGFyc2VyOjokb3B0aW9uc1snc3RyaWN0TWF0aCddID0gJHN0cmljdE1hdGhCeXBhc3M7CgoJCXJldHVybiAkcmV0dXJuOwoJfQoKCiAgICBwdWJsaWMgZnVuY3Rpb24gQ29tcGlsZU5hbWUoICRlbnYsICRuYW1lICl7CgkJJG91dHB1dCA9IG5ldyBMZXNzX091dHB1dCgpOwoJCWZvcmVhY2goJG5hbWUgYXMgJG4pewoJCQkkbi0+Y29tcGlsZSgkZW52KS0+Z2VuQ1NTKCRvdXRwdXQpOwoJCX0KCQlyZXR1cm4gJG91dHB1dC0+dG9TdHJpbmcoKTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbWFrZUltcG9ydGFudCgpewoJCXJldHVybiBuZXcgTGVzc19UcmVlX1J1bGUoJHRoaXMtPm5hbWUsICR0aGlzLT52YWx1ZSwgJyFpbXBvcnRhbnQnLCAkdGhpcy0+bWVyZ2UsICR0aGlzLT5pbmRleCwgJHRoaXMtPmN1cnJlbnRGaWxlSW5mbywgJHRoaXMtPmlubGluZSk7Cgl9Cgp9CiAKCi8qKgogKiBSdWxlc2V0CiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdHJlZQogKi8KY2xhc3MgTGVzc19UcmVlX1J1bGVzZXQgZXh0ZW5kcyBMZXNzX1RyZWV7CgoJcHJvdGVjdGVkICRsb29rdXBzOwoJcHVibGljICRfdmFyaWFibGVzOwoJcHVibGljICRfcnVsZXNldHM7CgoJcHVibGljICRzdHJpY3RJbXBvcnRzOwoKCXB1YmxpYyAkc2VsZWN0b3JzOwoJcHVibGljICRydWxlczsKCXB1YmxpYyAkcm9vdDsKCXB1YmxpYyAkYWxsb3dJbXBvcnRzOwoJcHVibGljICRwYXRoczsKCXB1YmxpYyAkZmlyc3RSb290OwoJcHVibGljICR0eXBlID0gJ1J1bGVzZXQnOwoJcHVibGljICRtdWx0aU1lZGlhOwoJcHVibGljICRhbGxFeHRlbmRzOwoKCXB1YmxpYyAkcnVsZXNldF9pZDsKCXB1YmxpYyAkb3JpZ2luYWxSdWxlc2V0OwoKCXB1YmxpYyAkZmlyc3Rfb2VsZW1lbnRzOwoKCXB1YmxpYyBmdW5jdGlvbiBTZXRSdWxlc2V0SW5kZXgoKXsKCQkkdGhpcy0+cnVsZXNldF9pZCA9IExlc3NfUGFyc2VyOjokbmV4dF9pZCsrOwoJCSR0aGlzLT5vcmlnaW5hbFJ1bGVzZXQgPSAkdGhpcy0+cnVsZXNldF9pZDsKCgkJaWYoICR0aGlzLT5zZWxlY3RvcnMgKXsKCQkJZm9yZWFjaCgkdGhpcy0+c2VsZWN0b3JzIGFzICRzZWwpewoJCQkJaWYoICRzZWwtPl9vZWxlbWVudHMgKXsKCQkJCQkkdGhpcy0+Zmlyc3Rfb2VsZW1lbnRzWyRzZWwtPl9vZWxlbWVudHNbMF1dID0gdHJ1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHNlbGVjdG9ycywgJHJ1bGVzLCAkc3RyaWN0SW1wb3J0cyA9IG51bGwpewoJCSR0aGlzLT5zZWxlY3RvcnMgPSAkc2VsZWN0b3JzOwoJCSR0aGlzLT5ydWxlcyA9ICRydWxlczsKCQkkdGhpcy0+bG9va3VwcyA9IGFycmF5KCk7CgkJJHRoaXMtPnN0cmljdEltcG9ydHMgPSAkc3RyaWN0SW1wb3J0czsKCQkkdGhpcy0+U2V0UnVsZXNldEluZGV4KCk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGFjY2VwdCggJHZpc2l0b3IgKXsKCQlpZiggJHRoaXMtPnBhdGhzICl7CgkJCSRwYXRoc19sZW4gPSBjb3VudCgkdGhpcy0+cGF0aHMpOwoJCQlmb3IoJGkgPSAwLCRwYXRoc19sZW47ICRpIDwgJHBhdGhzX2xlbjsgJGkrKyApewoJCQkJJHRoaXMtPnBhdGhzWyRpXSA9ICR2aXNpdG9yLT52aXNpdEFycmF5KCR0aGlzLT5wYXRoc1skaV0pOwoJCQl9CgkJfWVsc2VpZiggJHRoaXMtPnNlbGVjdG9ycyApewoJCQkkdGhpcy0+c2VsZWN0b3JzID0gJHZpc2l0b3ItPnZpc2l0QXJyYXkoJHRoaXMtPnNlbGVjdG9ycyk7CgkJfQoKCQlpZiggJHRoaXMtPnJ1bGVzICl7CgkJCSR0aGlzLT5ydWxlcyA9ICR2aXNpdG9yLT52aXNpdEFycmF5KCR0aGlzLT5ydWxlcyk7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRlbnYpewoKCQkkcnVsZXNldCA9ICR0aGlzLT5QcmVwYXJlUnVsZXNldCgkZW52KTsKCgoJCS8vIFN0b3JlIHRoZSBmcmFtZXMgYXJvdW5kIG1peGluIGRlZmluaXRpb25zLAoJCS8vIHNvIHRoZXkgY2FuIGJlIGV2YWx1YXRlZCBsaWtlIGNsb3N1cmVzIHdoZW4gdGhlIHRpbWUgY29tZXMuCgkJJHJzUnVsZUNudCA9IGNvdW50KCRydWxlc2V0LT5ydWxlcyk7CgkJZm9yKCAkaSA9IDA7ICRpIDwgJHJzUnVsZUNudDsgJGkrKyApewoJCQlpZiggJHJ1bGVzZXQtPnJ1bGVzWyRpXSBpbnN0YW5jZW9mIExlc3NfVHJlZV9NaXhpbl9EZWZpbml0aW9uIHx8ICRydWxlc2V0LT5ydWxlc1skaV0gaW5zdGFuY2VvZiBMZXNzX1RyZWVfRGV0YWNoZWRSdWxlc2V0ICl7CgkJCQkkcnVsZXNldC0+cnVsZXNbJGldID0gJHJ1bGVzZXQtPnJ1bGVzWyRpXS0+Y29tcGlsZSgkZW52KTsKCQkJfQoJCX0KCgkJJG1lZGlhQmxvY2tDb3VudCA9IDA7CgkJaWYoICRlbnYgaW5zdGFuY2VvZiBMZXNzX0Vudmlyb25tZW50ICl7CgkJCSRtZWRpYUJsb2NrQ291bnQgPSBjb3VudCgkZW52LT5tZWRpYUJsb2Nrcyk7CgkJfQoKCQkvLyBFdmFsdWF0ZSBtaXhpbiBjYWxscy4KCQkkdGhpcy0+RXZhbE1peGluQ2FsbHMoICRydWxlc2V0LCAkZW52LCAkcnNSdWxlQ250ICk7CgoKCQkvLyBFdmFsdWF0ZSBldmVyeXRoaW5nIGVsc2UKCQlmb3IoICRpPTA7ICRpPCRyc1J1bGVDbnQ7ICRpKysgKXsKCQkJaWYoISAoJHJ1bGVzZXQtPnJ1bGVzWyRpXSBpbnN0YW5jZW9mIExlc3NfVHJlZV9NaXhpbl9EZWZpbml0aW9uIHx8ICRydWxlc2V0LT5ydWxlc1skaV0gaW5zdGFuY2VvZiBMZXNzX1RyZWVfRGV0YWNoZWRSdWxlc2V0KSApewoJCQkJJHJ1bGVzZXQtPnJ1bGVzWyRpXSA9ICRydWxlc2V0LT5ydWxlc1skaV0tPmNvbXBpbGUoJGVudik7CgkJCX0KCQl9CgogICAgICAgIC8vIEV2YWx1YXRlIGV2ZXJ5dGhpbmcgZWxzZQoJCWZvciggJGk9MDsgJGk8JHJzUnVsZUNudDsgJGkrKyApewoJCQkkcnVsZSA9ICRydWxlc2V0LT5ydWxlc1skaV07CgogICAgICAgICAgICAvLyBmb3IgcnVsZXNldHMsIGNoZWNrIGlmIGl0IGlzIGEgY3NzIGd1YXJkIGFuZCBjYW4gYmUgcmVtb3ZlZAoJCQlpZiggJHJ1bGUgaW5zdGFuY2VvZiBMZXNzX1RyZWVfUnVsZXNldCAmJiAkcnVsZS0+c2VsZWN0b3JzICYmIGNvdW50KCRydWxlLT5zZWxlY3RvcnMpID09PSAxICl7CgogICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQgY2FuIGJlIGZvbGRlZCBpbiAoZS5nLiAmIHdoZXJlKQoJCQkJaWYoICRydWxlLT5zZWxlY3RvcnNbMF0tPmlzSnVzdFBhcmVudFNlbGVjdG9yKCkgKXsKCQkJCQlhcnJheV9zcGxpY2UoJHJ1bGVzZXQtPnJ1bGVzLCRpLS0sMSk7CgkJCQkJJHJzUnVsZUNudC0tOwoKCQkJCQlmb3IoJGogPSAwOyAkaiA8IGNvdW50KCRydWxlLT5ydWxlcyk7ICRqKysgKXsKCQkJCQkJJHN1YlJ1bGUgPSAkcnVsZS0+cnVsZXNbJGpdOwoJCQkJCQlpZiggISgkc3ViUnVsZSBpbnN0YW5jZW9mIExlc3NfVHJlZV9SdWxlKSB8fCAhJHN1YlJ1bGUtPnZhcmlhYmxlICl7CgkJCQkJCQlhcnJheV9zcGxpY2UoJHJ1bGVzZXQtPnJ1bGVzLCArKyRpLCAwLCBhcnJheSgkc3ViUnVsZSkpOwoJCQkJCQkJJHJzUnVsZUNudCsrOwoJCQkJCQl9CgkJCQkJfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCgoJCS8vIFBvcCB0aGUgc3RhY2sKCQkkZW52LT5zaGlmdEZyYW1lKCk7CgoJCWlmICgkbWVkaWFCbG9ja0NvdW50KSB7CgkJCSRsZW4gPSBjb3VudCgkZW52LT5tZWRpYUJsb2Nrcyk7CgkJCWZvcigkaSA9ICRtZWRpYUJsb2NrQ291bnQ7ICRpIDwgJGxlbjsgJGkrKyApewoJCQkJJGVudi0+bWVkaWFCbG9ja3NbJGldLT5idWJibGVTZWxlY3RvcnMoJHJ1bGVzZXQtPnNlbGVjdG9ycyk7CgkJCX0KCQl9CgoJCXJldHVybiAkcnVsZXNldDsKCX0KCgkvKioKCSAqIENvbXBpbGUgTGVzc19UcmVlX01peGluX0NhbGwgb2JqZWN0cwoJICoKCSAqIEBwYXJhbSBMZXNzX1RyZWVfUnVsZXNldCAkcnVsZXNldAoJICogQHBhcmFtIGludGVnZXIgJHJzUnVsZUNudAoJICovCglwcml2YXRlIGZ1bmN0aW9uIEV2YWxNaXhpbkNhbGxzKCAkcnVsZXNldCwgJGVudiwgJiRyc1J1bGVDbnQgKXsKCQlmb3IoJGk9MDsgJGkgPCAkcnNSdWxlQ250OyAkaSsrKXsKCQkJJHJ1bGUgPSAkcnVsZXNldC0+cnVsZXNbJGldOwoKCQkJaWYoICRydWxlIGluc3RhbmNlb2YgTGVzc19UcmVlX01peGluX0NhbGwgKXsKCQkJCSRydWxlID0gJHJ1bGUtPmNvbXBpbGUoJGVudik7CgoJCQkJJHRlbXAgPSBhcnJheSgpOwoJCQkJZm9yZWFjaCgkcnVsZSBhcyAkcil7CgkJCQkJaWYoICgkciBpbnN0YW5jZW9mIExlc3NfVHJlZV9SdWxlKSAmJiAkci0+dmFyaWFibGUgKXsKCQkJCQkJLy8gZG8gbm90IHBvbGx1dGUgdGhlIHNjb3BlIGlmIHRoZSB2YXJpYWJsZSBpcwoJCQkJCQkvLyBhbHJlYWR5IHRoZXJlLiBjb25zaWRlciByZXR1cm5pbmcgZmFsc2UgaGVyZQoJCQkJCQkvLyBidXQgd2UgbmVlZCBhIHdheSB0byAicmV0dXJuIiB2YXJpYWJsZSBmcm9tIG1peGlucwoJCQkJCQlpZiggISRydWxlc2V0LT52YXJpYWJsZSgkci0+bmFtZSkgKXsKCQkJCQkJCSR0ZW1wW10gPSAkcjsKCQkJCQkJfQoJCQkJCX1lbHNlewoJCQkJCQkkdGVtcFtdID0gJHI7CgkJCQkJfQoJCQkJfQoJCQkJJHRlbXBfY291bnQgPSBjb3VudCgkdGVtcCktMTsKCQkJCWFycmF5X3NwbGljZSgkcnVsZXNldC0+cnVsZXMsICRpLCAxLCAkdGVtcCk7CgkJCQkkcnNSdWxlQ250ICs9ICR0ZW1wX2NvdW50OwoJCQkJJGkgKz0gJHRlbXBfY291bnQ7CgkJCQkkcnVsZXNldC0+cmVzZXRDYWNoZSgpOwoKCQkJfWVsc2VpZiggJHJ1bGUgaW5zdGFuY2VvZiBMZXNzX1RyZWVfUnVsZXNldENhbGwgKXsKCgkJCQkkcnVsZSA9ICRydWxlLT5jb21waWxlKCRlbnYpOwoJCQkJJHJ1bGVzID0gYXJyYXkoKTsKCQkJCWZvcmVhY2goJHJ1bGUtPnJ1bGVzIGFzICRyKXsKCQkJCQlpZiggKCRyIGluc3RhbmNlb2YgTGVzc19UcmVlX1J1bGUpICYmICRyLT52YXJpYWJsZSApewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQkJJHJ1bGVzW10gPSAkcjsKCQkJCX0KCgkJCQlhcnJheV9zcGxpY2UoJHJ1bGVzZXQtPnJ1bGVzLCAkaSwgMSwgJHJ1bGVzKTsKCQkJCSR0ZW1wX2NvdW50ID0gY291bnQoJHJ1bGVzKTsKCQkJCSRyc1J1bGVDbnQgKz0gJHRlbXBfY291bnQgLSAxOwoJCQkJJGkgKz0gJHRlbXBfY291bnQtMTsKCQkJCSRydWxlc2V0LT5yZXNldENhY2hlKCk7CgkJCX0KCgkJfQoJfQoKCgkvKioKCSAqIENvbXBpbGUgdGhlIHNlbGVjdG9ycyBhbmQgY3JlYXRlIGEgbmV3IHJ1bGVzZXQgb2JqZWN0IGZvciB0aGUgY29tcGlsZSgpIG1ldGhvZAoJICoKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBQcmVwYXJlUnVsZXNldCgkZW52KXsKCgkJJGhhc09uZVBhc3NpbmdTZWxlY3RvciA9IGZhbHNlOwoJCSRzZWxlY3RvcnMgPSBhcnJheSgpOwoJCWlmKCAkdGhpcy0+c2VsZWN0b3JzICl7CgkJCUxlc3NfVHJlZV9EZWZhdWx0RnVuYzo6ZXJyb3IoIml0IGlzIGN1cnJlbnRseSBvbmx5IGFsbG93ZWQgaW4gcGFyYW1ldHJpYyBtaXhpbiBndWFyZHMsIik7CgoJCQlmb3JlYWNoKCR0aGlzLT5zZWxlY3RvcnMgYXMgJHMpewoJCQkJJHNlbGVjdG9yID0gJHMtPmNvbXBpbGUoJGVudik7CgkJCQkkc2VsZWN0b3JzW10gPSAkc2VsZWN0b3I7CgkJCQlpZiggJHNlbGVjdG9yLT5ldmFsZENvbmRpdGlvbiApewoJCQkJCSRoYXNPbmVQYXNzaW5nU2VsZWN0b3IgPSB0cnVlOwoJCQkJfQoJCQl9CgoJCQlMZXNzX1RyZWVfRGVmYXVsdEZ1bmM6OnJlc2V0KCk7CgkJfSBlbHNlIHsKCQkJJGhhc09uZVBhc3NpbmdTZWxlY3RvciA9IHRydWU7CgkJfQoKCQlpZiggJHRoaXMtPnJ1bGVzICYmICRoYXNPbmVQYXNzaW5nU2VsZWN0b3IgKXsKCQkJJHJ1bGVzID0gJHRoaXMtPnJ1bGVzOwoJCX1lbHNlewoJCQkkcnVsZXMgPSBhcnJheSgpOwoJCX0KCgkJJHJ1bGVzZXQgPSBuZXcgTGVzc19UcmVlX1J1bGVzZXQoJHNlbGVjdG9ycywgJHJ1bGVzLCAkdGhpcy0+c3RyaWN0SW1wb3J0cyk7CgoJCSRydWxlc2V0LT5vcmlnaW5hbFJ1bGVzZXQgPSAkdGhpcy0+cnVsZXNldF9pZDsKCgkJJHJ1bGVzZXQtPnJvb3QgPSAkdGhpcy0+cm9vdDsKCQkkcnVsZXNldC0+Zmlyc3RSb290ID0gJHRoaXMtPmZpcnN0Um9vdDsKCQkkcnVsZXNldC0+YWxsb3dJbXBvcnRzID0gJHRoaXMtPmFsbG93SW1wb3J0czsKCgoJCS8vIHB1c2ggdGhlIGN1cnJlbnQgcnVsZXNldCB0byB0aGUgZnJhbWVzIHN0YWNrCgkJJGVudi0+dW5zaGlmdEZyYW1lKCRydWxlc2V0KTsKCgoJCS8vIEV2YWx1YXRlIGltcG9ydHMKCQlpZiggJHJ1bGVzZXQtPnJvb3QgfHwgJHJ1bGVzZXQtPmFsbG93SW1wb3J0cyB8fCAhJHJ1bGVzZXQtPnN0cmljdEltcG9ydHMgKXsKCQkJJHJ1bGVzZXQtPmV2YWxJbXBvcnRzKCRlbnYpOwoJCX0KCgkJcmV0dXJuICRydWxlc2V0OwoJfQoKCWZ1bmN0aW9uIGV2YWxJbXBvcnRzKCRlbnYpIHsKCgkJJHJ1bGVzX2xlbiA9IGNvdW50KCR0aGlzLT5ydWxlcyk7CgkJZm9yKCRpPTA7ICRpIDwgJHJ1bGVzX2xlbjsgJGkrKyl7CgkJCSRydWxlID0gJHRoaXMtPnJ1bGVzWyRpXTsKCgkJCWlmKCAkcnVsZSBpbnN0YW5jZW9mIExlc3NfVHJlZV9JbXBvcnQgKXsKCQkJCSRydWxlcyA9ICRydWxlLT5jb21waWxlKCRlbnYpOwoJCQkJaWYoIGlzX2FycmF5KCRydWxlcykgKXsKCQkJCQlhcnJheV9zcGxpY2UoJHRoaXMtPnJ1bGVzLCAkaSwgMSwgJHJ1bGVzKTsKCQkJCQkkdGVtcF9jb3VudCA9IGNvdW50KCRydWxlcyktMTsKCQkJCQkkaSArPSAkdGVtcF9jb3VudDsKCQkJCQkkcnVsZXNfbGVuICs9ICR0ZW1wX2NvdW50OwoJCQkJfWVsc2V7CgkJCQkJYXJyYXlfc3BsaWNlKCR0aGlzLT5ydWxlcywgJGksIDEsIGFycmF5KCRydWxlcykpOwoJCQkJfQoKCQkJCSR0aGlzLT5yZXNldENhY2hlKCk7CgkJCX0KCQl9Cgl9CgoJZnVuY3Rpb24gbWFrZUltcG9ydGFudCgpewoKCQkkaW1wb3J0YW50X3J1bGVzID0gYXJyYXkoKTsKCQlmb3JlYWNoKCR0aGlzLT5ydWxlcyBhcyAkcnVsZSl7CgkJCWlmKCAkcnVsZSBpbnN0YW5jZW9mIExlc3NfVHJlZV9SdWxlIHx8ICRydWxlIGluc3RhbmNlb2YgTGVzc19UcmVlX1J1bGVzZXQgKXsKCQkJCSRpbXBvcnRhbnRfcnVsZXNbXSA9ICRydWxlLT5tYWtlSW1wb3J0YW50KCk7CgkJCX1lbHNlewoJCQkJJGltcG9ydGFudF9ydWxlc1tdID0gJHJ1bGU7CgkJCX0KCQl9CgoJCXJldHVybiBuZXcgTGVzc19UcmVlX1J1bGVzZXQoJHRoaXMtPnNlbGVjdG9ycywgJGltcG9ydGFudF9ydWxlcywgJHRoaXMtPnN0cmljdEltcG9ydHMgKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gbWF0Y2hBcmdzKCRhcmdzKXsKCQlyZXR1cm4gISRhcmdzOwoJfQoKCS8vIGxldHMgeW91IGNhbGwgYSBjc3Mgc2VsZWN0b3Igd2l0aCBhIGd1YXJkCglwdWJsaWMgZnVuY3Rpb24gbWF0Y2hDb25kaXRpb24oICRhcmdzLCAkZW52ICl7CgkJJGxhc3RTZWxlY3RvciA9IGVuZCgkdGhpcy0+c2VsZWN0b3JzKTsKCgkJaWYoICEkbGFzdFNlbGVjdG9yLT5ldmFsZENvbmRpdGlvbiApewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWlmKCAkbGFzdFNlbGVjdG9yLT5jb25kaXRpb24gJiYgISRsYXN0U2VsZWN0b3ItPmNvbmRpdGlvbi0+Y29tcGlsZSggJGVudi0+Y29weUV2YWxFbnYoICRlbnYtPmZyYW1lcyApICkgKXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCglmdW5jdGlvbiByZXNldENhY2hlKCl7CgkJJHRoaXMtPl9ydWxlc2V0cyA9IG51bGw7CgkJJHRoaXMtPl92YXJpYWJsZXMgPSBudWxsOwoJCSR0aGlzLT5sb29rdXBzID0gYXJyYXkoKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdmFyaWFibGVzKCl7CgkJJHRoaXMtPl92YXJpYWJsZXMgPSBhcnJheSgpOwoJCWZvcmVhY2goICR0aGlzLT5ydWxlcyBhcyAkcil7CgkJCWlmICgkciBpbnN0YW5jZW9mIExlc3NfVHJlZV9SdWxlICYmICRyLT52YXJpYWJsZSA9PT0gdHJ1ZSkgewoJCQkJJHRoaXMtPl92YXJpYWJsZXNbJHItPm5hbWVdID0gJHI7CgkJCX0KCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHZhcmlhYmxlKCRuYW1lKXsKCgkJaWYoIGlzX251bGwoJHRoaXMtPl92YXJpYWJsZXMpICl7CgkJCSR0aGlzLT52YXJpYWJsZXMoKTsKCQl9CgkJcmV0dXJuIGlzc2V0KCR0aGlzLT5fdmFyaWFibGVzWyRuYW1lXSkgPyAkdGhpcy0+X3ZhcmlhYmxlc1skbmFtZV0gOiBudWxsOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBmaW5kKCAkc2VsZWN0b3IsICRzZWxmID0gbnVsbCApewoKCQkka2V5ID0gaW1wbG9kZSgnICcsJHNlbGVjdG9yLT5fb2VsZW1lbnRzKTsKCgkJaWYoICFpc3NldCgkdGhpcy0+bG9va3Vwc1ska2V5XSkgKXsKCgkJCWlmKCAhJHNlbGYgKXsKCQkJCSRzZWxmID0gJHRoaXMtPnJ1bGVzZXRfaWQ7CgkJCX0KCgkJCSR0aGlzLT5sb29rdXBzWyRrZXldID0gYXJyYXkoKTsKCgkJCSRmaXJzdF9vZWxlbWVudCA9ICRzZWxlY3Rvci0+X29lbGVtZW50c1swXTsKCgkJCWZvcmVhY2goJHRoaXMtPnJ1bGVzIGFzICRydWxlKXsKCQkJCWlmKCAkcnVsZSBpbnN0YW5jZW9mIExlc3NfVHJlZV9SdWxlc2V0ICYmICRydWxlLT5ydWxlc2V0X2lkICE9ICRzZWxmICl7CgoJCQkJCWlmKCBpc3NldCgkcnVsZS0+Zmlyc3Rfb2VsZW1lbnRzWyRmaXJzdF9vZWxlbWVudF0pICl7CgoJCQkJCQlmb3JlYWNoKCAkcnVsZS0+c2VsZWN0b3JzIGFzICRydWxlU2VsZWN0b3IgKXsKCQkJCQkJCSRtYXRjaCA9ICRzZWxlY3Rvci0+bWF0Y2goJHJ1bGVTZWxlY3Rvcik7CgkJCQkJCQlpZiggJG1hdGNoICl7CgkJCQkJCQkJaWYoICRzZWxlY3Rvci0+ZWxlbWVudHNfbGVuID4gJG1hdGNoICl7CgkJCQkJCQkJCSR0aGlzLT5sb29rdXBzWyRrZXldID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmxvb2t1cHNbJGtleV0sICRydWxlLT5maW5kKCBuZXcgTGVzc19UcmVlX1NlbGVjdG9yKGFycmF5X3NsaWNlKCRzZWxlY3Rvci0+ZWxlbWVudHMsICRtYXRjaCkpLCAkc2VsZikpOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCSR0aGlzLT5sb29rdXBzWyRrZXldW10gPSAkcnVsZTsKCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiAkdGhpcy0+bG9va3Vwc1ska2V5XTsKCX0KCgoJLyoqCgkgKiBAc2VlIExlc3NfVHJlZTo6Z2VuQ1NTCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZW5DU1MoICRvdXRwdXQgKXsKCgkJaWYoICEkdGhpcy0+cm9vdCApewoJCQlMZXNzX0Vudmlyb25tZW50OjokdGFiTGV2ZWwrKzsKCQl9CgoJCSR0YWJSdWxlU3RyID0gJHRhYlNldFN0ciA9ICcnOwoJCWlmKCAhTGVzc19QYXJzZXI6OiRvcHRpb25zWydjb21wcmVzcyddICl7CgkJCWlmKCBMZXNzX0Vudmlyb25tZW50OjokdGFiTGV2ZWwgKXsKCQkJCSR0YWJSdWxlU3RyID0gIlxuIi5zdHJfcmVwZWF0KCAnICAnICwgTGVzc19FbnZpcm9ubWVudDo6JHRhYkxldmVsICk7CgkJCQkkdGFiU2V0U3RyID0gIlxuIi5zdHJfcmVwZWF0KCAnICAnICwgTGVzc19FbnZpcm9ubWVudDo6JHRhYkxldmVsLTEgKTsKCQkJfWVsc2V7CgkJCQkkdGFiU2V0U3RyID0gJHRhYlJ1bGVTdHIgPSAiXG4iOwoJCQl9CgkJfQoKCgkJJHJ1bGVOb2RlcyA9IGFycmF5KCk7CgkJJHJ1bGVzZXROb2RlcyA9IGFycmF5KCk7CgkJZm9yZWFjaCgkdGhpcy0+cnVsZXMgYXMgJHJ1bGUpewoKCQkJJGNsYXNzID0gZ2V0X2NsYXNzKCRydWxlKTsKCQkJaWYoICgkY2xhc3MgPT09ICdMZXNzX1RyZWVfTWVkaWEnKSB8fCAoJGNsYXNzID09PSAnTGVzc19UcmVlX0RpcmVjdGl2ZScpIHx8ICgkdGhpcy0+cm9vdCAmJiAkY2xhc3MgPT09ICdMZXNzX1RyZWVfQ29tbWVudCcpIHx8ICgkY2xhc3MgPT09ICdMZXNzX1RyZWVfUnVsZXNldCcgJiYgJHJ1bGUtPnJ1bGVzKSApewoJCQkJJHJ1bGVzZXROb2Rlc1tdID0gJHJ1bGU7CgkJCX1lbHNlewoJCQkJJHJ1bGVOb2Rlc1tdID0gJHJ1bGU7CgkJCX0KCQl9CgoJCS8vIElmIHRoaXMgaXMgdGhlIHJvb3Qgbm9kZSwgd2UgZG9uJ3QgcmVuZGVyCgkJLy8gYSBzZWxlY3Rvciwgb3Ige30uCgkJaWYoICEkdGhpcy0+cm9vdCApewoKCQkJLyoKCQkJZGVidWdJbmZvID0gdHJlZS5kZWJ1Z0luZm8oZW52LCB0aGlzLCB0YWJTZXRTdHIpOwoKCQkJaWYgKGRlYnVnSW5mbykgewoJCQkJb3V0cHV0LmFkZChkZWJ1Z0luZm8pOwoJCQkJb3V0cHV0LmFkZCh0YWJTZXRTdHIpOwoJCQl9CgkJCSovCgoJCQkkcGF0aHNfbGVuID0gY291bnQoJHRoaXMtPnBhdGhzKTsKCQkJZm9yKCAkaSA9IDA7ICRpIDwgJHBhdGhzX2xlbjsgJGkrKyApewoJCQkJJHBhdGggPSAkdGhpcy0+cGF0aHNbJGldOwoJCQkJJGZpcnN0U2VsZWN0b3IgPSB0cnVlOwoKCQkJCWZvcmVhY2goJHBhdGggYXMgJHApewoJCQkJCSRwLT5nZW5DU1MoICRvdXRwdXQsICRmaXJzdFNlbGVjdG9yICk7CgkJCQkJJGZpcnN0U2VsZWN0b3IgPSBmYWxzZTsKCQkJCX0KCgkJCQlpZiggJGkgKyAxIDwgJHBhdGhzX2xlbiApewoJCQkJCSRvdXRwdXQtPmFkZCggJywnIC4gJHRhYlNldFN0ciApOwoJCQkJfQoJCQl9CgoJCQkkb3V0cHV0LT5hZGQoIChMZXNzX1BhcnNlcjo6JG9wdGlvbnNbJ2NvbXByZXNzJ10gPyAneycgOiAiIHsiKSAuICR0YWJSdWxlU3RyICk7CgkJfQoKCQkvLyBDb21waWxlIHJ1bGVzIGFuZCBydWxlc2V0cwoJCSRydWxlTm9kZXNfbGVuID0gY291bnQoJHJ1bGVOb2Rlcyk7CgkJJHJ1bGVzZXROb2Rlc19sZW4gPSBjb3VudCgkcnVsZXNldE5vZGVzKTsKCQlmb3IoICRpID0gMDsgJGkgPCAkcnVsZU5vZGVzX2xlbjsgJGkrKyApewoJCQkkcnVsZSA9ICRydWxlTm9kZXNbJGldOwoKCQkJLy8gQHBhZ2V7IGRpcmVjdGl2ZSBlbmRzIHVwIHdpdGggcm9vdCBlbGVtZW50cyBpbnNpZGUgaXQsIGEgbWl4IG9mIHJ1bGVzIGFuZCBydWxlc2V0cwoJCQkvLyBJbiB0aGlzIGluc3RhbmNlIHdlIGRvIG5vdCBrbm93IHdoZXRoZXIgaXQgaXMgdGhlIGxhc3QgcHJvcGVydHkKCQkJaWYoICRpICsgMSA9PT0gJHJ1bGVOb2Rlc19sZW4gJiYgKCEkdGhpcy0+cm9vdCB8fCAkcnVsZXNldE5vZGVzX2xlbiA9PT0gMCB8fCAkdGhpcy0+Zmlyc3RSb290ICkgKXsKCQkJCUxlc3NfRW52aXJvbm1lbnQ6OiRsYXN0UnVsZSA9IHRydWU7CgkJCX0KCgkJCSRydWxlLT5nZW5DU1MoICRvdXRwdXQgKTsKCgkJCWlmKCAhTGVzc19FbnZpcm9ubWVudDo6JGxhc3RSdWxlICl7CgkJCQkkb3V0cHV0LT5hZGQoICR0YWJSdWxlU3RyICk7CgkJCX1lbHNlewoJCQkJTGVzc19FbnZpcm9ubWVudDo6JGxhc3RSdWxlID0gZmFsc2U7CgkJCX0KCQl9CgoJCWlmKCAhJHRoaXMtPnJvb3QgKXsKCQkJJG91dHB1dC0+YWRkKCAkdGFiU2V0U3RyIC4gJ30nICk7CgkJCUxlc3NfRW52aXJvbm1lbnQ6OiR0YWJMZXZlbC0tOwoJCX0KCgkJJGZpcnN0UnVsZXNldCA9IHRydWU7CgkJJHNwYWNlID0gKCR0aGlzLT5yb290ID8gJHRhYlJ1bGVTdHIgOiAkdGFiU2V0U3RyKTsKCQlmb3IoICRpID0gMDsgJGkgPCAkcnVsZXNldE5vZGVzX2xlbjsgJGkrKyApewoKCQkJaWYoICRydWxlTm9kZXNfbGVuICYmICRmaXJzdFJ1bGVzZXQgKXsKCQkJCSRvdXRwdXQtPmFkZCggJHNwYWNlICk7CgkJCX1lbHNlaWYoICEkZmlyc3RSdWxlc2V0ICl7CgkJCQkkb3V0cHV0LT5hZGQoICRzcGFjZSApOwoJCQl9CgkJCSRmaXJzdFJ1bGVzZXQgPSBmYWxzZTsKCQkJJHJ1bGVzZXROb2Rlc1skaV0tPmdlbkNTUyggJG91dHB1dCk7CgkJfQoKCQlpZiggIUxlc3NfUGFyc2VyOjokb3B0aW9uc1snY29tcHJlc3MnXSAmJiAkdGhpcy0+Zmlyc3RSb290ICl7CgkJCSRvdXRwdXQtPmFkZCggIlxuIiApOwoJCX0KCgl9CgoKCWZ1bmN0aW9uIG1hcmtSZWZlcmVuY2VkKCl7CgkJaWYoICEkdGhpcy0+c2VsZWN0b3JzICl7CgkJCXJldHVybjsKCQl9CgkJZm9yZWFjaCgkdGhpcy0+c2VsZWN0b3JzIGFzICRzZWxlY3Rvcil7CgkJCSRzZWxlY3Rvci0+bWFya1JlZmVyZW5jZWQoKTsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGpvaW5TZWxlY3RvcnMoICRjb250ZXh0LCAkc2VsZWN0b3JzICl7CgkJJHBhdGhzID0gYXJyYXkoKTsKCQlpZiggaXNfYXJyYXkoJHNlbGVjdG9ycykgKXsKCQkJZm9yZWFjaCgkc2VsZWN0b3JzIGFzICRzZWxlY3RvcikgewoJCQkJJHRoaXMtPmpvaW5TZWxlY3RvciggJHBhdGhzLCAkY29udGV4dCwgJHNlbGVjdG9yKTsKCQkJfQoJCX0KCQlyZXR1cm4gJHBhdGhzOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBqb2luU2VsZWN0b3IoICYkcGF0aHMsICRjb250ZXh0LCAkc2VsZWN0b3IpewoKCQkkaGFzUGFyZW50U2VsZWN0b3IgPSBmYWxzZTsKCgkJZm9yZWFjaCgkc2VsZWN0b3ItPmVsZW1lbnRzIGFzICRlbCkgewoJCQlpZiggJGVsLT52YWx1ZSA9PT0gJyYnKSB7CgkJCQkkaGFzUGFyZW50U2VsZWN0b3IgPSB0cnVlOwoJCQl9CgkJfQoKCQlpZiggISRoYXNQYXJlbnRTZWxlY3RvciApewoJCQlpZiggJGNvbnRleHQgKXsKCQkJCWZvcmVhY2goJGNvbnRleHQgYXMgJGNvbnRleHRfZWwpewoJCQkJCSRwYXRoc1tdID0gYXJyYXlfbWVyZ2UoJGNvbnRleHRfZWwsIGFycmF5KCRzZWxlY3RvcikgKTsKCQkJCX0KCQkJfWVsc2UgewoJCQkJJHBhdGhzW10gPSBhcnJheSgkc2VsZWN0b3IpOwoJCQl9CgkJCXJldHVybjsKCQl9CgoKCQkvLyBUaGUgcGF0aHMgYXJlIFtbU2VsZWN0b3JdXQoJCS8vIFRoZSBmaXJzdCBsaXN0IGlzIGEgbGlzdCBvZiBjb21tYSBzZXBlcmF0ZWQgc2VsZWN0b3JzCgkJLy8gVGhlIGlubmVyIGxpc3QgaXMgYSBsaXN0IG9mIGluaGVyaXRhbmNlIHNlcGVyYXRlZCBzZWxlY3RvcnMKCQkvLyBlLmcuCgkJLy8gLmEsIC5iIHsKCQkvLyAgIC5jIHsKCQkvLyAgIH0KCQkvLyB9CgkJLy8gPT0gW1suYV0gWy5jXV0gW1suYl0gWy5jXV0KCQkvLwoKCQkvLyB0aGUgZWxlbWVudHMgZnJvbSB0aGUgY3VycmVudCBzZWxlY3RvciBzbyBmYXIKCQkkY3VycmVudEVsZW1lbnRzID0gYXJyYXkoKTsKCQkvLyB0aGUgY3VycmVudCBsaXN0IG9mIG5ldyBzZWxlY3RvcnMgdG8gYWRkIHRvIHRoZSBwYXRoLgoJCS8vIFdlIHdpbGwgYnVpbGQgaXQgdXAuIFdlIGluaXRpYXRlIGl0IHdpdGggb25lIGVtcHR5IHNlbGVjdG9yIGFzIHdlICJtdWx0aXBseSIgdGhlIG5ldyBzZWxlY3RvcnMKCQkvLyBieSB0aGUgcGFyZW50cwoJCSRuZXdTZWxlY3RvcnMgPSBhcnJheShhcnJheSgpKTsKCgoJCWZvcmVhY2goICRzZWxlY3Rvci0+ZWxlbWVudHMgYXMgJGVsKXsKCgkJCS8vIG5vbiBwYXJlbnQgcmVmZXJlbmNlIGVsZW1lbnRzIGp1c3QgZ2V0IGFkZGVkCgkJCWlmKCAkZWwtPnZhbHVlICE9PSAnJicgKXsKCQkJCSRjdXJyZW50RWxlbWVudHNbXSA9ICRlbDsKCQkJfSBlbHNlIHsKCQkJCS8vIHRoZSBuZXcgbGlzdCBvZiBzZWxlY3RvcnMgdG8gYWRkCgkJCQkkc2VsZWN0b3JzTXVsdGlwbGllZCA9IGFycmF5KCk7CgoJCQkJLy8gbWVyZ2UgdGhlIGN1cnJlbnQgbGlzdCBvZiBub24gcGFyZW50IHNlbGVjdG9yIGVsZW1lbnRzCgkJCQkvLyBvbiB0byB0aGUgY3VycmVudCBsaXN0IG9mIHNlbGVjdG9ycyB0byBhZGQKCQkJCWlmKCAkY3VycmVudEVsZW1lbnRzICl7CgkJCQkJJHRoaXMtPm1lcmdlRWxlbWVudHNPblRvU2VsZWN0b3JzKCAkY3VycmVudEVsZW1lbnRzLCAkbmV3U2VsZWN0b3JzKTsKCQkJCX0KCgkJCQkvLyBsb29wIHRocm91Z2ggb3VyIGN1cnJlbnQgc2VsZWN0b3JzCgkJCQlmb3JlYWNoKCRuZXdTZWxlY3RvcnMgYXMgJHNlbCl7CgoJCQkJCS8vIGlmIHdlIGRvbid0IGhhdmUgYW55IHBhcmVudCBwYXRocywgdGhlICYgbWlnaHQgYmUgaW4gYSBtaXhpbiBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkCgkJCQkJLy8gd2hldGhlciB0aGVyZSBhcmUgcGFyZW50cyBvciBub3QKCQkJCQlpZiggISRjb250ZXh0ICl7CgkJCQkJCS8vIHRoZSBjb21iaW5hdG9yIHVzZWQgb24gZWwgc2hvdWxkIG5vdyBiZSBhcHBsaWVkIHRvIHRoZSBuZXh0IGVsZW1lbnQgaW5zdGVhZCBzbyB0aGF0CgkJCQkJCS8vIGl0IGlzIG5vdCBsb3N0CgkJCQkJCWlmKCAkc2VsICl7CgkJCQkJCQkkc2VsWzBdLT5lbGVtZW50cyA9IGFycmF5X3NsaWNlKCRzZWxbMF0tPmVsZW1lbnRzLDApOwoJCQkJCQkJJHNlbFswXS0+ZWxlbWVudHNbXSA9IG5ldyBMZXNzX1RyZWVfRWxlbWVudCgkZWwtPmNvbWJpbmF0b3IsICcnLCAkZWwtPmluZGV4LCAkZWwtPmN1cnJlbnRGaWxlSW5mbyApOwoJCQkJCQl9CgkJCQkJCSRzZWxlY3RvcnNNdWx0aXBsaWVkW10gPSAkc2VsOwoJCQkJCX1lbHNlIHsKCgkJCQkJCS8vIGFuZCB0aGUgcGFyZW50IHNlbGVjdG9ycwoJCQkJCQlmb3JlYWNoKCRjb250ZXh0IGFzICRwYXJlbnRTZWwpewoJCQkJCQkJLy8gV2UgbmVlZCB0byBwdXQgdGhlIGN1cnJlbnQgc2VsZWN0b3JzCgkJCQkJCQkvLyB0aGVuIGpvaW4gdGhlIGxhc3Qgc2VsZWN0b3IncyBlbGVtZW50cyBvbiB0byB0aGUgcGFyZW50cyBzZWxlY3RvcnMKCgkJCQkJCQkvLyBvdXIgbmV3IHNlbGVjdG9yIHBhdGgKCQkJCQkJCSRuZXdTZWxlY3RvclBhdGggPSBhcnJheSgpOwoJCQkJCQkJLy8gc2VsZWN0b3JzIGZyb20gdGhlIHBhcmVudCBhZnRlciB0aGUgam9pbgoJCQkJCQkJJGFmdGVyUGFyZW50Sm9pbiA9IGFycmF5KCk7CgkJCQkJCQkkbmV3Sm9pbmVkU2VsZWN0b3JFbXB0eSA9IHRydWU7CgoJCQkJCQkJLy9jb25zdHJ1Y3QgdGhlIGpvaW5lZCBzZWxlY3RvciAtIGlmICYgaXMgdGhlIGZpcnN0IHRoaW5nIHRoaXMgd2lsbCBiZSBlbXB0eSwKCQkJCQkJCS8vIGlmIG5vdCBuZXdKb2luZWRTZWxlY3RvciB3aWxsIGJlIHRoZSBsYXN0IHNldCBvZiBlbGVtZW50cyBpbiB0aGUgc2VsZWN0b3IKCQkJCQkJCWlmKCAkc2VsICl7CgkJCQkJCQkJJG5ld1NlbGVjdG9yUGF0aCA9ICRzZWw7CgkJCQkJCQkJJGxhc3RTZWxlY3RvciA9IGFycmF5X3BvcCgkbmV3U2VsZWN0b3JQYXRoKTsKCQkJCQkJCQkkbmV3Sm9pbmVkU2VsZWN0b3IgPSAkc2VsZWN0b3ItPmNyZWF0ZURlcml2ZWQoIGFycmF5X3NsaWNlKCRsYXN0U2VsZWN0b3ItPmVsZW1lbnRzLDApICk7CgkJCQkJCQkJJG5ld0pvaW5lZFNlbGVjdG9yRW1wdHkgPSBmYWxzZTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UgewoJCQkJCQkJCSRuZXdKb2luZWRTZWxlY3RvciA9ICRzZWxlY3Rvci0+Y3JlYXRlRGVyaXZlZChhcnJheSgpKTsKCQkJCQkJCX0KCgkJCQkJCQkvL3B1dCB0b2dldGhlciB0aGUgcGFyZW50IHNlbGVjdG9ycyBhZnRlciB0aGUgam9pbgoJCQkJCQkJaWYgKCBjb3VudCgkcGFyZW50U2VsKSA+IDEpIHsKCQkJCQkJCQkkYWZ0ZXJQYXJlbnRKb2luID0gYXJyYXlfbWVyZ2UoJGFmdGVyUGFyZW50Sm9pbiwgYXJyYXlfc2xpY2UoJHBhcmVudFNlbCwxKSApOwoJCQkJCQkJfQoKCQkJCQkJCWlmICggJHBhcmVudFNlbCApewoJCQkJCQkJCSRuZXdKb2luZWRTZWxlY3RvckVtcHR5ID0gZmFsc2U7CgoJCQkJCQkJCS8vIGpvaW4gdGhlIGVsZW1lbnRzIHNvIGZhciB3aXRoIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBwYXJlbnQKCQkJCQkJCQkkbmV3Sm9pbmVkU2VsZWN0b3ItPmVsZW1lbnRzW10gPSBuZXcgTGVzc19UcmVlX0VsZW1lbnQoICRlbC0+Y29tYmluYXRvciwgJHBhcmVudFNlbFswXS0+ZWxlbWVudHNbMF0tPnZhbHVlLCAkZWwtPmluZGV4LCAkZWwtPmN1cnJlbnRGaWxlSW5mbyk7CgoJCQkJCQkJCSRuZXdKb2luZWRTZWxlY3Rvci0+ZWxlbWVudHMgPSBhcnJheV9tZXJnZSggJG5ld0pvaW5lZFNlbGVjdG9yLT5lbGVtZW50cywgYXJyYXlfc2xpY2UoJHBhcmVudFNlbFswXS0+ZWxlbWVudHMsIDEpICk7CgkJCQkJCQl9CgoJCQkJCQkJaWYgKCEkbmV3Sm9pbmVkU2VsZWN0b3JFbXB0eSkgewoJCQkJCQkJCS8vIG5vdyBhZGQgdGhlIGpvaW5lZCBzZWxlY3RvcgoJCQkJCQkJCSRuZXdTZWxlY3RvclBhdGhbXSA9ICRuZXdKb2luZWRTZWxlY3RvcjsKCQkJCQkJCX0KCgkJCQkJCQkvLyBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBhcmVudAoJCQkJCQkJJG5ld1NlbGVjdG9yUGF0aCA9IGFycmF5X21lcmdlKCRuZXdTZWxlY3RvclBhdGgsICRhZnRlclBhcmVudEpvaW4pOwoKCQkJCQkJCS8vIGFkZCB0aGF0IHRvIG91ciBuZXcgc2V0IG9mIHNlbGVjdG9ycwoJCQkJCQkJJHNlbGVjdG9yc011bHRpcGxpZWRbXSA9ICRuZXdTZWxlY3RvclBhdGg7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgoJCQkJLy8gb3VyIG5ldyBzZWxlY3RvcnMgaGFzIGJlZW4gbXVsdGlwbGllZCwgc28gcmVzZXQgdGhlIHN0YXRlCgkJCQkkbmV3U2VsZWN0b3JzID0gJHNlbGVjdG9yc011bHRpcGxpZWQ7CgkJCQkkY3VycmVudEVsZW1lbnRzID0gYXJyYXkoKTsKCQkJfQoJCX0KCgkJLy8gaWYgd2UgaGF2ZSBhbnkgZWxlbWVudHMgbGVmdCBvdmVyIChlLmcuIC5hJiAuYiA9PSAuYikKCQkvLyBhZGQgdGhlbSBvbiB0byBhbGwgdGhlIGN1cnJlbnQgc2VsZWN0b3JzCgkJaWYoICRjdXJyZW50RWxlbWVudHMgKXsKCQkJJHRoaXMtPm1lcmdlRWxlbWVudHNPblRvU2VsZWN0b3JzKCRjdXJyZW50RWxlbWVudHMsICRuZXdTZWxlY3RvcnMpOwoJCX0KCQlmb3JlYWNoKCAkbmV3U2VsZWN0b3JzIGFzICRuZXdfc2VsKXsKCQkJaWYoICRuZXdfc2VsICl7CgkJCQkkcGF0aHNbXSA9ICRuZXdfc2VsOwoJCQl9CgkJfQoJfQoKCWZ1bmN0aW9uIG1lcmdlRWxlbWVudHNPblRvU2VsZWN0b3JzKCAkZWxlbWVudHMsICYkc2VsZWN0b3JzKXsKCgkJaWYoICEkc2VsZWN0b3JzICl7CgkJCSRzZWxlY3RvcnNbXSA9IGFycmF5KCBuZXcgTGVzc19UcmVlX1NlbGVjdG9yKCRlbGVtZW50cykgKTsKCQkJcmV0dXJuOwoJCX0KCgoJCWZvcmVhY2goICRzZWxlY3RvcnMgYXMgJiRzZWwpewoKCQkJLy8gaWYgdGhlIHByZXZpb3VzIHRoaW5nIGluIHNlbCBpcyBhIHBhcmVudCB0aGlzIG5lZWRzIHRvIGpvaW4gb24gdG8gaXQKCQkJaWYoICRzZWwgKXsKCQkJCSRsYXN0ID0gY291bnQoJHNlbCktMTsKCQkJCSRzZWxbJGxhc3RdID0gJHNlbFskbGFzdF0tPmNyZWF0ZURlcml2ZWQoIGFycmF5X21lcmdlKCRzZWxbJGxhc3RdLT5lbGVtZW50cywgJGVsZW1lbnRzKSApOwoJCQl9ZWxzZXsKCQkJCSRzZWxbXSA9IG5ldyBMZXNzX1RyZWVfU2VsZWN0b3IoICRlbGVtZW50cyApOwoJCQl9CgkJfQoJfQp9CiAKCi8qKgogKiBSdWxlc2V0Q2FsbAogKgogKiBAcGFja2FnZSBMZXNzCiAqIEBzdWJwYWNrYWdlIHRyZWUKICovCmNsYXNzIExlc3NfVHJlZV9SdWxlc2V0Q2FsbCBleHRlbmRzIExlc3NfVHJlZXsKCglwdWJsaWMgJHZhcmlhYmxlOwoJcHVibGljICR0eXBlID0gIlJ1bGVzZXRDYWxsIjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHZhcmlhYmxlKXsKCQkkdGhpcy0+dmFyaWFibGUgPSAkdmFyaWFibGU7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgkdmlzaXRvcikge30KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSggJGVudiApewoJCSR2YXJpYWJsZSA9IG5ldyBMZXNzX1RyZWVfVmFyaWFibGUoJHRoaXMtPnZhcmlhYmxlKTsKCQkkZGV0YWNoZWRSdWxlc2V0ID0gJHZhcmlhYmxlLT5jb21waWxlKCRlbnYpOwoJCXJldHVybiAkZGV0YWNoZWRSdWxlc2V0LT5jYWxsRXZhbCgkZW52KTsKCX0KfQoKIAoKLyoqCiAqIFNlbGVjdG9yCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdHJlZQogKi8KY2xhc3MgTGVzc19UcmVlX1NlbGVjdG9yIGV4dGVuZHMgTGVzc19UcmVlewoKCXB1YmxpYyAkZWxlbWVudHM7CglwdWJsaWMgJGNvbmRpdGlvbjsKCXB1YmxpYyAkZXh0ZW5kTGlzdCA9IGFycmF5KCk7CglwdWJsaWMgJF9jc3M7CglwdWJsaWMgJGluZGV4OwoJcHVibGljICRldmFsZENvbmRpdGlvbiA9IGZhbHNlOwoJcHVibGljICR0eXBlID0gJ1NlbGVjdG9yJzsKCXB1YmxpYyAkY3VycmVudEZpbGVJbmZvID0gYXJyYXkoKTsKCXB1YmxpYyAkaXNSZWZlcmVuY2VkOwoJcHVibGljICRtZWRpYUVtcHR5OwoKCXB1YmxpYyAkZWxlbWVudHNfbGVuID0gMDsKCglwdWJsaWMgJF9vZWxlbWVudHM7CglwdWJsaWMgJF9vZWxlbWVudHNfbGVuOwoJcHVibGljICRjYWNoZWFibGUgPSB0cnVlOwoKCS8qKgoJICogQHBhcmFtIGJvb2xlYW4gJGlzUmVmZXJlbmNlZAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRlbGVtZW50cywgJGV4dGVuZExpc3QgPSBhcnJheSgpICwgJGNvbmRpdGlvbiA9IG51bGwsICRpbmRleD1udWxsLCAkY3VycmVudEZpbGVJbmZvPW51bGwsICRpc1JlZmVyZW5jZWQ9bnVsbCApewoKCQkkdGhpcy0+ZWxlbWVudHMgPSAkZWxlbWVudHM7CgkJJHRoaXMtPmVsZW1lbnRzX2xlbiA9IGNvdW50KCRlbGVtZW50cyk7CgkJJHRoaXMtPmV4dGVuZExpc3QgPSAkZXh0ZW5kTGlzdDsKCQkkdGhpcy0+Y29uZGl0aW9uID0gJGNvbmRpdGlvbjsKCQlpZiggJGN1cnJlbnRGaWxlSW5mbyApewoJCQkkdGhpcy0+Y3VycmVudEZpbGVJbmZvID0gJGN1cnJlbnRGaWxlSW5mbzsKCQl9CgkJJHRoaXMtPmlzUmVmZXJlbmNlZCA9ICRpc1JlZmVyZW5jZWQ7CgkJaWYoICEkY29uZGl0aW9uICl7CgkJCSR0aGlzLT5ldmFsZENvbmRpdGlvbiA9IHRydWU7CgkJfQoKCQkkdGhpcy0+Q2FjaGVFbGVtZW50cygpOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoJHZpc2l0b3IpIHsKCQkkdGhpcy0+ZWxlbWVudHMgPSAkdmlzaXRvci0+dmlzaXRBcnJheSgkdGhpcy0+ZWxlbWVudHMpOwoJCSR0aGlzLT5leHRlbmRMaXN0ID0gJHZpc2l0b3ItPnZpc2l0QXJyYXkoJHRoaXMtPmV4dGVuZExpc3QpOwoJCWlmKCAkdGhpcy0+Y29uZGl0aW9uICl7CgkJCSR0aGlzLT5jb25kaXRpb24gPSAkdmlzaXRvci0+dmlzaXRPYmooJHRoaXMtPmNvbmRpdGlvbik7CgkJfQoKCQlpZiggJHZpc2l0b3IgaW5zdGFuY2VvZiBMZXNzX1Zpc2l0b3JfZXh0ZW5kRmluZGVyICl7CgkJCSR0aGlzLT5DYWNoZUVsZW1lbnRzKCk7CgkJfQoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjcmVhdGVEZXJpdmVkKCAkZWxlbWVudHMsICRleHRlbmRMaXN0ID0gbnVsbCwgJGV2YWxkQ29uZGl0aW9uID0gbnVsbCApewoJCSRuZXdTZWxlY3RvciA9IG5ldyBMZXNzX1RyZWVfU2VsZWN0b3IoICRlbGVtZW50cywgKCRleHRlbmRMaXN0ID8gJGV4dGVuZExpc3QgOiAkdGhpcy0+ZXh0ZW5kTGlzdCksIG51bGwsICR0aGlzLT5pbmRleCwgJHRoaXMtPmN1cnJlbnRGaWxlSW5mbywgJHRoaXMtPmlzUmVmZXJlbmNlZCk7CgkJJG5ld1NlbGVjdG9yLT5ldmFsZENvbmRpdGlvbiA9ICRldmFsZENvbmRpdGlvbiA/ICRldmFsZENvbmRpdGlvbiA6ICR0aGlzLT5ldmFsZENvbmRpdGlvbjsKCQlyZXR1cm4gJG5ld1NlbGVjdG9yOwoJfQoKCglwdWJsaWMgZnVuY3Rpb24gbWF0Y2goICRvdGhlciApewoKCQlpZiggISRvdGhlci0+X29lbGVtZW50cyB8fCAoJHRoaXMtPmVsZW1lbnRzX2xlbiA8ICRvdGhlci0+X29lbGVtZW50c19sZW4pICl7CgkJCXJldHVybiAwOwoJCX0KCgkJZm9yKCAkaSA9IDA7ICRpIDwgJG90aGVyLT5fb2VsZW1lbnRzX2xlbjsgJGkrKyApewoJCQlpZiggJHRoaXMtPmVsZW1lbnRzWyRpXS0+dmFsdWUgIT09ICRvdGhlci0+X29lbGVtZW50c1skaV0pIHsKCQkJCXJldHVybiAwOwoJCQl9CgkJfQoKCQlyZXR1cm4gJG90aGVyLT5fb2VsZW1lbnRzX2xlbjsgLy8gcmV0dXJuIG51bWJlciBvZiBtYXRjaGVkIGVsZW1lbnRzCgl9CgoKCXB1YmxpYyBmdW5jdGlvbiBDYWNoZUVsZW1lbnRzKCl7CgoJCSR0aGlzLT5fb2VsZW1lbnRzID0gYXJyYXkoKTsKCQkkY3NzID0gJyc7CgoJCWZvcmVhY2goJHRoaXMtPmVsZW1lbnRzIGFzICR2KXsKCgkJCSRjc3MgLj0gJHYtPmNvbWJpbmF0b3I7CgkJCWlmKCAhJHYtPnZhbHVlX2lzX29iamVjdCApewoJCQkJJGNzcyAuPSAkdi0+dmFsdWU7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYoICFwcm9wZXJ0eV9leGlzdHMoJHYtPnZhbHVlLCd2YWx1ZScpIHx8ICFpc19zdHJpbmcoJHYtPnZhbHVlLT52YWx1ZSkgKXsKCQkJCSR0aGlzLT5jYWNoZWFibGUgPSBmYWxzZTsKCQkJCXJldHVybjsKCQkJfQoJCQkkY3NzIC49ICR2LT52YWx1ZS0+dmFsdWU7CgkJfQoKCQkkdGhpcy0+X29lbGVtZW50c19sZW4gPSBwcmVnX21hdGNoX2FsbCgnL1ssJiNcLlx3LV0oPzpbXHctXXwoPzpcXFxcLikpKi8nLCAkY3NzLCAkbWF0Y2hlcyk7CgkJaWYoICR0aGlzLT5fb2VsZW1lbnRzX2xlbiApewoJCQkkdGhpcy0+X29lbGVtZW50cyA9ICRtYXRjaGVzWzBdOwoKCQkJaWYoICR0aGlzLT5fb2VsZW1lbnRzWzBdID09PSAnJicgKXsKCQkJCWFycmF5X3NoaWZ0KCR0aGlzLT5fb2VsZW1lbnRzKTsKCQkJCSR0aGlzLT5fb2VsZW1lbnRzX2xlbi0tOwoJCQl9CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBpc0p1c3RQYXJlbnRTZWxlY3RvcigpewoJCXJldHVybiAhJHRoaXMtPm1lZGlhRW1wdHkgJiYKCQkJY291bnQoJHRoaXMtPmVsZW1lbnRzKSA9PT0gMSAmJgoJCQkkdGhpcy0+ZWxlbWVudHNbMF0tPnZhbHVlID09PSAnJicgJiYKCQkJKCR0aGlzLT5lbGVtZW50c1swXS0+Y29tYmluYXRvciA9PT0gJyAnIHx8ICR0aGlzLT5lbGVtZW50c1swXS0+Y29tYmluYXRvciA9PT0gJycpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRlbnYpIHsKCgkJJGVsZW1lbnRzID0gYXJyYXkoKTsKCQlmb3JlYWNoKCR0aGlzLT5lbGVtZW50cyBhcyAkZWwpewoJCQkkZWxlbWVudHNbXSA9ICRlbC0+Y29tcGlsZSgkZW52KTsKCQl9CgoJCSRleHRlbmRMaXN0ID0gYXJyYXkoKTsKCQlmb3JlYWNoKCR0aGlzLT5leHRlbmRMaXN0IGFzICRlbCl7CgkJCSRleHRlbmRMaXN0W10gPSAkZWwtPmNvbXBpbGUoJGVsKTsKCQl9CgoJCSRldmFsZENvbmRpdGlvbiA9IGZhbHNlOwoJCWlmKCAkdGhpcy0+Y29uZGl0aW9uICl7CgkJCSRldmFsZENvbmRpdGlvbiA9ICR0aGlzLT5jb25kaXRpb24tPmNvbXBpbGUoJGVudik7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPmNyZWF0ZURlcml2ZWQoICRlbGVtZW50cywgJGV4dGVuZExpc3QsICRldmFsZENvbmRpdGlvbiApOwoJfQoKCgkvKioKCSAqIEBzZWUgTGVzc19UcmVlOjpnZW5DU1MKCSAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdlbkNTUyggJG91dHB1dCwgJGZpcnN0U2VsZWN0b3IgPSB0cnVlICl7CgoJCWlmKCAhJGZpcnN0U2VsZWN0b3IgJiYgJHRoaXMtPmVsZW1lbnRzWzBdLT5jb21iaW5hdG9yID09PSAiIiApewoJCQkkb3V0cHV0LT5hZGQoJyAnLCAkdGhpcy0+Y3VycmVudEZpbGVJbmZvLCAkdGhpcy0+aW5kZXgpOwoJCX0KCgkJZm9yZWFjaCgkdGhpcy0+ZWxlbWVudHMgYXMgJGVsZW1lbnQpewoJCQkkZWxlbWVudC0+Z2VuQ1NTKCAkb3V0cHV0ICk7CgkJfQoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtYXJrUmVmZXJlbmNlZCgpewoJCSR0aGlzLT5pc1JlZmVyZW5jZWQgPSB0cnVlOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJc1JlZmVyZW5jZWQoKXsKCQlyZXR1cm4gIWlzc2V0KCR0aGlzLT5jdXJyZW50RmlsZUluZm9bJ3JlZmVyZW5jZSddKSB8fCAhJHRoaXMtPmN1cnJlbnRGaWxlSW5mb1sncmVmZXJlbmNlJ10gfHwgJHRoaXMtPmlzUmVmZXJlbmNlZDsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SXNPdXRwdXQoKXsKCQlyZXR1cm4gJHRoaXMtPmV2YWxkQ29uZGl0aW9uOwoJfQoKfQogCgovKioKICogVW5pY29kZURlc2NyaXB0b3IKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfVW5pY29kZURlc2NyaXB0b3IgZXh0ZW5kcyBMZXNzX1RyZWV7CgoJcHVibGljICR2YWx1ZTsKCXB1YmxpYyAkdHlwZSA9ICdVbmljb2RlRGVzY3JpcHRvcic7CgoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR2YWx1ZSl7CgkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoJfQoKICAgIC8qKgogICAgICogQHNlZSBMZXNzX1RyZWU6OmdlbkNTUwogICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2VuQ1NTKCAkb3V0cHV0ICl7CgkJJG91dHB1dC0+YWRkKCAkdGhpcy0+dmFsdWUgKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgpewoJCXJldHVybiAkdGhpczsKCX0KfQoKIAoKLyoqCiAqIFVuaXQKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfVW5pdCBleHRlbmRzIExlc3NfVHJlZXsKCgl2YXIgJG51bWVyYXRvciA9IGFycmF5KCk7Cgl2YXIgJGRlbm9taW5hdG9yID0gYXJyYXkoKTsKCXB1YmxpYyAkYmFja3VwVW5pdDsKCXB1YmxpYyAkdHlwZSA9ICdVbml0JzsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG51bWVyYXRvciA9IGFycmF5KCksICRkZW5vbWluYXRvciA9IGFycmF5KCksICRiYWNrdXBVbml0ID0gbnVsbCApewoJCSR0aGlzLT5udW1lcmF0b3IgPSAkbnVtZXJhdG9yOwoJCSR0aGlzLT5kZW5vbWluYXRvciA9ICRkZW5vbWluYXRvcjsKCQkkdGhpcy0+YmFja3VwVW5pdCA9ICRiYWNrdXBVbml0OwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCl7Cgl9CgogICAgLyoqCiAgICAgKiBAc2VlIExlc3NfVHJlZTo6Z2VuQ1NTCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZW5DU1MoICRvdXRwdXQgKXsKCgkJaWYoICR0aGlzLT5udW1lcmF0b3IgKXsKCQkJJG91dHB1dC0+YWRkKCAkdGhpcy0+bnVtZXJhdG9yWzBdICk7CgkJfWVsc2VpZiggJHRoaXMtPmRlbm9taW5hdG9yICl7CgkJCSRvdXRwdXQtPmFkZCggJHRoaXMtPmRlbm9taW5hdG9yWzBdICk7CgkJfWVsc2VpZiggIUxlc3NfUGFyc2VyOjokb3B0aW9uc1snc3RyaWN0VW5pdHMnXSAmJiAkdGhpcy0+YmFja3VwVW5pdCApewoJCQkkb3V0cHV0LT5hZGQoICR0aGlzLT5iYWNrdXBVbml0ICk7CgkJCXJldHVybiA7CgkJfQoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpewoJCSRyZXR1cm5TdHIgPSBpbXBsb2RlKCcqJywkdGhpcy0+bnVtZXJhdG9yKTsKCQlmb3JlYWNoKCR0aGlzLT5kZW5vbWluYXRvciBhcyAkZCl7CgkJCSRyZXR1cm5TdHIgLj0gJy8nLiRkOwoJCX0KCQlyZXR1cm4gJHJldHVyblN0cjsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpewoJCXJldHVybiAkdGhpcy0+dG9TdHJpbmcoKTsKCX0KCgoJLyoqCgkgKiBAcGFyYW0gTGVzc19UcmVlX1VuaXQgJG90aGVyCgkgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb21wYXJlKCRvdGhlcikgewoJCXJldHVybiAkdGhpcy0+aXMoICRvdGhlci0+dG9TdHJpbmcoKSApID8gMCA6IC0xOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpcygkdW5pdFN0cmluZyl7CgkJcmV0dXJuICR0aGlzLT50b1N0cmluZygpID09PSAkdW5pdFN0cmluZzsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNMZW5ndGgoKXsKCQkkY3NzID0gJHRoaXMtPnRvQ1NTKCk7CgkJcmV0dXJuICEhcHJlZ19tYXRjaCgnL3B4fGVtfCV8aW58Y218bW18cGN8cHR8ZXgvJywkY3NzKTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNBbmdsZSgpIHsKCQlyZXR1cm4gaXNzZXQoIExlc3NfVHJlZV9Vbml0Q29udmVyc2lvbnM6OiRhbmdsZVskdGhpcy0+dG9DU1MoKV0gKTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpewoJCXJldHVybiAhJHRoaXMtPm51bWVyYXRvciAmJiAhJHRoaXMtPmRlbm9taW5hdG9yOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc1Npbmd1bGFyKCkgewoJCXJldHVybiBjb3VudCgkdGhpcy0+bnVtZXJhdG9yKSA8PSAxICYmICEkdGhpcy0+ZGVub21pbmF0b3I7Cgl9CgoKICAgIHB1YmxpYyBmdW5jdGlvbiB1c2VkVW5pdHMoKXsKCQkkcmVzdWx0ID0gYXJyYXkoKTsKCgkJZm9yZWFjaChMZXNzX1RyZWVfVW5pdENvbnZlcnNpb25zOjokZ3JvdXBzIGFzICRncm91cE5hbWUpewoJCQkkZ3JvdXAgPSBMZXNzX1RyZWVfVW5pdENvbnZlcnNpb25zOjokeyRncm91cE5hbWV9OwoKCQkJZm9yZWFjaCgkdGhpcy0+bnVtZXJhdG9yIGFzICRhdG9taWNVbml0KXsKCQkJCWlmKCBpc3NldCgkZ3JvdXBbJGF0b21pY1VuaXRdKSAmJiAhaXNzZXQoJHJlc3VsdFskZ3JvdXBOYW1lXSkgKXsKCQkJCQkkcmVzdWx0WyRncm91cE5hbWVdID0gJGF0b21pY1VuaXQ7CgkJCQl9CgkJCX0KCgkJCWZvcmVhY2goJHRoaXMtPmRlbm9taW5hdG9yIGFzICRhdG9taWNVbml0KXsKCQkJCWlmKCBpc3NldCgkZ3JvdXBbJGF0b21pY1VuaXRdKSAmJiAhaXNzZXQoJHJlc3VsdFskZ3JvdXBOYW1lXSkgKXsKCQkJCQkkcmVzdWx0WyRncm91cE5hbWVdID0gJGF0b21pY1VuaXQ7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiAkcmVzdWx0OwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjYW5jZWwoKXsKCQkkY291bnRlciA9IGFycmF5KCk7CgkJJGJhY2t1cCA9IG51bGw7CgoJCWZvcmVhY2goJHRoaXMtPm51bWVyYXRvciBhcyAkYXRvbWljVW5pdCl7CgkJCWlmKCAhJGJhY2t1cCApewoJCQkJJGJhY2t1cCA9ICRhdG9taWNVbml0OwoJCQl9CgkJCSRjb3VudGVyWyRhdG9taWNVbml0XSA9ICggaXNzZXQoJGNvdW50ZXJbJGF0b21pY1VuaXRdKSA/ICRjb3VudGVyWyRhdG9taWNVbml0XSA6IDApICsgMTsKCQl9CgoJCWZvcmVhY2goJHRoaXMtPmRlbm9taW5hdG9yIGFzICRhdG9taWNVbml0KXsKCQkJaWYoICEkYmFja3VwICl7CgkJCQkkYmFja3VwID0gJGF0b21pY1VuaXQ7CgkJCX0KCQkJJGNvdW50ZXJbJGF0b21pY1VuaXRdID0gKCBpc3NldCgkY291bnRlclskYXRvbWljVW5pdF0pID8gJGNvdW50ZXJbJGF0b21pY1VuaXRdIDogMCkgLSAxOwoJCX0KCgkJJHRoaXMtPm51bWVyYXRvciA9IGFycmF5KCk7CgkJJHRoaXMtPmRlbm9taW5hdG9yID0gYXJyYXkoKTsKCgkJZm9yZWFjaCgkY291bnRlciBhcyAkYXRvbWljVW5pdCA9PiAkY291bnQpewoJCQlpZiggJGNvdW50ID4gMCApewoJCQkJZm9yKCAkaSA9IDA7ICRpIDwgJGNvdW50OyAkaSsrICl7CgkJCQkJJHRoaXMtPm51bWVyYXRvcltdID0gJGF0b21pY1VuaXQ7CgkJCQl9CgkJCX1lbHNlaWYoICRjb3VudCA8IDAgKXsKCQkJCWZvciggJGkgPSAwOyAkaSA8IC0kY291bnQ7ICRpKysgKXsKCQkJCQkkdGhpcy0+ZGVub21pbmF0b3JbXSA9ICRhdG9taWNVbml0OwoJCQkJfQoJCQl9CgkJfQoKCQlpZiggISR0aGlzLT5udW1lcmF0b3IgJiYgISR0aGlzLT5kZW5vbWluYXRvciAmJiAkYmFja3VwICl7CgkJCSR0aGlzLT5iYWNrdXBVbml0ID0gJGJhY2t1cDsKCQl9CgoJCXNvcnQoJHRoaXMtPm51bWVyYXRvcik7CgkJc29ydCgkdGhpcy0+ZGVub21pbmF0b3IpOwoJfQoKCn0KCiAKCi8qKgogKiBVbml0Q29udmVyc2lvbnMKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB0cmVlCiAqLwpjbGFzcyBMZXNzX1RyZWVfVW5pdENvbnZlcnNpb25zewoKCXB1YmxpYyBzdGF0aWMgJGdyb3VwcyA9IGFycmF5KCdsZW5ndGgnLCdkdXJhdGlvbicsJ2FuZ2xlJyk7CgoJcHVibGljIHN0YXRpYyAkbGVuZ3RoID0gYXJyYXkoCgkJJ20nPT4gMSwKCQknY20nPT4gMC4wMSwKCQknbW0nPT4gMC4wMDEsCgkJJ2luJz0+IDAuMDI1NCwKCQkncHgnPT4gMC4wMDAyNjQ1ODMsIC8vIDAuMDI1NCAvIDk2LAoJCSdwdCc9PiAwLjAwMDM1Mjc3OCwgLy8gMC4wMjU0IC8gNzIsCgkJJ3BjJz0+IDAuMDA0MjMzMzMzLCAvLyAwLjAyNTQgLyA3MiAqIDEyCgkJKTsKCglwdWJsaWMgc3RhdGljICRkdXJhdGlvbiA9IGFycmF5KAoJCSdzJz0+IDEsCgkJJ21zJz0+IDAuMDAxCgkJKTsKCglwdWJsaWMgc3RhdGljICRhbmdsZSA9IGFycmF5KAoJCSdyYWQnID0+IDAuMTU5MTU0OTQzMDkxOSwJLy8gMS8oMipNX1BJKSwKCQknZGVnJyA9PiAwLjAwMjc3Nzc3OCwgCQkvLyAxLzM2MCwKCQknZ3JhZCc9PiAwLjAwMjUsCQkJLy8gMS80MDAsCgkJJ3R1cm4nPT4gMQoJCSk7Cgp9IAoKLyoqCiAqIFVybAogKgogKiBAcGFja2FnZSBMZXNzCiAqIEBzdWJwYWNrYWdlIHRyZWUKICovCmNsYXNzIExlc3NfVHJlZV9VcmwgZXh0ZW5kcyBMZXNzX1RyZWV7CgoJcHVibGljICRhdHRyczsKCXB1YmxpYyAkdmFsdWU7CglwdWJsaWMgJGN1cnJlbnRGaWxlSW5mbzsKCXB1YmxpYyAkaXNFdmFsZDsKCXB1YmxpYyAkdHlwZSA9ICdVcmwnOwoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmFsdWUsICRjdXJyZW50RmlsZUluZm8gPSBudWxsLCAkaXNFdmFsZCA9IG51bGwpewoJCSR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKCQkkdGhpcy0+Y3VycmVudEZpbGVJbmZvID0gJGN1cnJlbnRGaWxlSW5mbzsKCQkkdGhpcy0+aXNFdmFsZCA9ICRpc0V2YWxkOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoICR2aXNpdG9yICl7CgkJJHRoaXMtPnZhbHVlID0gJHZpc2l0b3ItPnZpc2l0T2JqKCR0aGlzLT52YWx1ZSk7Cgl9CgogICAgLyoqCiAgICAgKiBAc2VlIExlc3NfVHJlZTo6Z2VuQ1NTCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZW5DU1MoICRvdXRwdXQgKXsKCQkkb3V0cHV0LT5hZGQoICd1cmwoJyApOwoJCSR0aGlzLT52YWx1ZS0+Z2VuQ1NTKCAkb3V0cHV0ICk7CgkJJG91dHB1dC0+YWRkKCAnKScgKTsKCX0KCgkvKioKCSAqIEBwYXJhbSBMZXNzX0Z1bmN0aW9ucyAkY3R4CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRjdHgpewoJCSR2YWwgPSAkdGhpcy0+dmFsdWUtPmNvbXBpbGUoJGN0eCk7CgoJCWlmKCAhJHRoaXMtPmlzRXZhbGQgKXsKCQkJLy8gQWRkIHRoZSBiYXNlIHBhdGggaWYgdGhlIFVSTCBpcyByZWxhdGl2ZQoJCQlpZiggTGVzc19QYXJzZXI6OiRvcHRpb25zWydyZWxhdGl2ZVVybHMnXQoJCQkJJiYgJHRoaXMtPmN1cnJlbnRGaWxlSW5mbwoJCQkJJiYgaXNfc3RyaW5nKCR2YWwtPnZhbHVlKQoJCQkJJiYgTGVzc19FbnZpcm9ubWVudDo6aXNQYXRoUmVsYXRpdmUoJHZhbC0+dmFsdWUpCgkJCSl7CgkJCQkkcm9vdHBhdGggPSAkdGhpcy0+Y3VycmVudEZpbGVJbmZvWyd1cmlfcm9vdCddOwoJCQkJaWYgKCAhJHZhbC0+cXVvdGUgKXsKCQkJCQkkcm9vdHBhdGggPSBwcmVnX3JlcGxhY2UoJy9bXChcKVwnIlxzXS8nLCAnXFwkMScsICRyb290cGF0aCApOwoJCQkJfQoJCQkJJHZhbC0+dmFsdWUgPSAkcm9vdHBhdGggLiAkdmFsLT52YWx1ZTsKCQkJfQoKCQkJJHZhbC0+dmFsdWUgPSBMZXNzX0Vudmlyb25tZW50Ojpub3JtYWxpemVQYXRoKCAkdmFsLT52YWx1ZSk7CgkJfQoKCQkvLyBBZGQgY2FjaGUgYnVzdGVyIGlmIGVuYWJsZWQKCQlpZiggTGVzc19QYXJzZXI6OiRvcHRpb25zWyd1cmxBcmdzJ10gKXsKCQkJaWYoICFwcmVnX21hdGNoKCcvXlxzKmRhdGE6LycsJHZhbC0+dmFsdWUpICl7CgkJCQkkZGVsaW1pdGVyID0gc3RycG9zKCR2YWwtPnZhbHVlLCc/JykgPT09IGZhbHNlID8gJz8nIDogJyYnOwoJCQkJJHVybEFyZ3MgPSAkZGVsaW1pdGVyIC4gTGVzc19QYXJzZXI6OiRvcHRpb25zWyd1cmxBcmdzJ107CgkJCQkkaGFzaF9wb3MgPSBzdHJwb3MoJHZhbC0+dmFsdWUsJyMnKTsKCQkJCWlmKCAkaGFzaF9wb3MgIT09IGZhbHNlICl7CgkJCQkJJHZhbC0+dmFsdWUgPSBzdWJzdHJfcmVwbGFjZSgkdmFsLT52YWx1ZSwkdXJsQXJncywgJGhhc2hfcG9zLCAwKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHZhbC0+dmFsdWUgLj0gJHVybEFyZ3M7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBuZXcgTGVzc19UcmVlX1VSTCgkdmFsLCAkdGhpcy0+Y3VycmVudEZpbGVJbmZvLCB0cnVlKTsKCX0KCn0KIAoKLyoqCiAqIFZhbHVlCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdHJlZQogKi8KY2xhc3MgTGVzc19UcmVlX1ZhbHVlIGV4dGVuZHMgTGVzc19UcmVlewoKCXB1YmxpYyAkdHlwZSA9ICdWYWx1ZSc7CglwdWJsaWMgJHZhbHVlOwoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmFsdWUpewoJCSR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCR2aXNpdG9yKSB7CgkJJHRoaXMtPnZhbHVlID0gJHZpc2l0b3ItPnZpc2l0QXJyYXkoJHRoaXMtPnZhbHVlKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkZW52KXsKCgkJJHJldCA9IGFycmF5KCk7CgkJJGkgPSAwOwoJCWZvcmVhY2goJHRoaXMtPnZhbHVlIGFzICRpID0+ICR2KXsKCQkJJHJldFtdID0gJHYtPmNvbXBpbGUoJGVudik7CgkJfQoJCWlmKCAkaSA+IDAgKXsKCQkJcmV0dXJuIG5ldyBMZXNzX1RyZWVfVmFsdWUoJHJldCk7CgkJfQoJCXJldHVybiAkcmV0WzBdOwoJfQoKICAgIC8qKgogICAgICogQHNlZSBMZXNzX1RyZWU6OmdlbkNTUwogICAgICovCglmdW5jdGlvbiBnZW5DU1MoICRvdXRwdXQgKXsKCQkkbGVuID0gY291bnQoJHRoaXMtPnZhbHVlKTsKCQlmb3IoJGkgPSAwOyAkaSA8ICRsZW47ICRpKysgKXsKCQkJJHRoaXMtPnZhbHVlWyRpXS0+Z2VuQ1NTKCAkb3V0cHV0ICk7CgkJCWlmKCAkaSsxIDwgJGxlbiApewoJCQkJJG91dHB1dC0+YWRkKCBMZXNzX0Vudmlyb25tZW50OjokX291dHB1dE1hcFsnLCddICk7CgkJCX0KCQl9Cgl9Cgp9CiAKCi8qKgogKiBWYXJpYWJsZQogKgogKiBAcGFja2FnZSBMZXNzCiAqIEBzdWJwYWNrYWdlIHRyZWUKICovCmNsYXNzIExlc3NfVHJlZV9WYXJpYWJsZSBleHRlbmRzIExlc3NfVHJlZXsKCglwdWJsaWMgJG5hbWU7CglwdWJsaWMgJGluZGV4OwoJcHVibGljICRjdXJyZW50RmlsZUluZm87CglwdWJsaWMgJGV2YWx1YXRpbmcgPSBmYWxzZTsKCXB1YmxpYyAkdHlwZSA9ICdWYXJpYWJsZSc7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbmFtZSwgJGluZGV4ID0gbnVsbCwgJGN1cnJlbnRGaWxlSW5mbyA9IG51bGwpIHsKICAgICAgICAkdGhpcy0+bmFtZSA9ICRuYW1lOwogICAgICAgICR0aGlzLT5pbmRleCA9ICRpbmRleDsKCQkkdGhpcy0+Y3VycmVudEZpbGVJbmZvID0gJGN1cnJlbnRGaWxlSW5mbzsKICAgIH0KCglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkZW52KSB7CgoJCWlmKCAkdGhpcy0+bmFtZVsxXSA9PT0gJ0AnICl7CgkJCSR2ID0gbmV3IExlc3NfVHJlZV9WYXJpYWJsZShzdWJzdHIoJHRoaXMtPm5hbWUsIDEpLCAkdGhpcy0+aW5kZXggKyAxLCAkdGhpcy0+Y3VycmVudEZpbGVJbmZvKTsKCQkJJG5hbWUgPSAnQCcgLiAkdi0+Y29tcGlsZSgkZW52KS0+dmFsdWU7CgkJfWVsc2V7CgkJCSRuYW1lID0gJHRoaXMtPm5hbWU7CgkJfQoKCQlpZiAoJHRoaXMtPmV2YWx1YXRpbmcpIHsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCJSZWN1cnNpdmUgdmFyaWFibGUgZGVmaW5pdGlvbiBmb3IgIiAuICRuYW1lLCBudWxsLCAkdGhpcy0+aW5kZXgsICR0aGlzLT5jdXJyZW50RmlsZUluZm8pOwoJCX0KCgkJJHRoaXMtPmV2YWx1YXRpbmcgPSB0cnVlOwoKCQlmb3JlYWNoKCRlbnYtPmZyYW1lcyBhcyAkZnJhbWUpewoJCQlpZiggJHYgPSAkZnJhbWUtPnZhcmlhYmxlKCRuYW1lKSApewoJCQkJJHIgPSAkdi0+dmFsdWUtPmNvbXBpbGUoJGVudik7CgkJCQkkdGhpcy0+ZXZhbHVhdGluZyA9IGZhbHNlOwoJCQkJcmV0dXJuICRyOwoJCQl9CgkJfQoKCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoInZhcmlhYmxlICIgLiAkbmFtZSAuICIgaXMgdW5kZWZpbmVkIGluIGZpbGUgIi4kdGhpcy0+Y3VycmVudEZpbGVJbmZvWyJmaWxlbmFtZSJdLCBudWxsLCAkdGhpcy0+aW5kZXgsICR0aGlzLT5jdXJyZW50RmlsZUluZm8pOwoJfQoKfQogCgoKY2xhc3MgTGVzc19UcmVlX01peGluX0NhbGwgZXh0ZW5kcyBMZXNzX1RyZWV7CgoJcHVibGljICRzZWxlY3RvcjsKCXB1YmxpYyAkYXJndW1lbnRzOwoJcHVibGljICRpbmRleDsKCXB1YmxpYyAkY3VycmVudEZpbGVJbmZvOwoKCXB1YmxpYyAkaW1wb3J0YW50OwoJcHVibGljICR0eXBlID0gJ01peGluQ2FsbCc7CgoJLyoqCgkgKiBsZXNzLmpzOiB0cmVlLm1peGluLkNhbGwKCSAqCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZWxlbWVudHMsICRhcmdzLCAkaW5kZXgsICRjdXJyZW50RmlsZUluZm8sICRpbXBvcnRhbnQgPSBmYWxzZSl7CgkJJHRoaXMtPnNlbGVjdG9yID0gbmV3IExlc3NfVHJlZV9TZWxlY3RvcigkZWxlbWVudHMpOwoJCSR0aGlzLT5hcmd1bWVudHMgPSAkYXJnczsKCQkkdGhpcy0+aW5kZXggPSAkaW5kZXg7CgkJJHRoaXMtPmN1cnJlbnRGaWxlSW5mbyA9ICRjdXJyZW50RmlsZUluZm87CgkJJHRoaXMtPmltcG9ydGFudCA9ICRpbXBvcnRhbnQ7Cgl9CgoJLy9mdW5jdGlvbiBhY2NlcHQoJHZpc2l0b3IpewoJLy8JJHRoaXMtPnNlbGVjdG9yID0gJHZpc2l0b3ItPnZpc2l0KCR0aGlzLT5zZWxlY3Rvcik7CgkvLwkkdGhpcy0+YXJndW1lbnRzID0gJHZpc2l0b3ItPnZpc2l0KCR0aGlzLT5hcmd1bWVudHMpOwoJLy99CgoKCXB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRlbnYpewoKCQkkcnVsZXMgPSBhcnJheSgpOwoJCSRtYXRjaCA9IGZhbHNlOwoJCSRpc09uZUZvdW5kID0gZmFsc2U7CgkJJGNhbmRpZGF0ZXMgPSBhcnJheSgpOwoJCSRkZWZhdWx0VXNlZCA9IGZhbHNlOwoJCSRjb25kaXRpb25SZXN1bHQgPSBhcnJheSgpOwoKCQkkYXJncyA9IGFycmF5KCk7CgkJZm9yZWFjaCgkdGhpcy0+YXJndW1lbnRzIGFzICRhKXsKCQkJJGFyZ3NbXSA9IGFycmF5KCduYW1lJz0+ICRhWyduYW1lJ10sICd2YWx1ZScgPT4gJGFbJ3ZhbHVlJ10tPmNvbXBpbGUoJGVudikgKTsKCQl9CgoJCWZvcmVhY2goJGVudi0+ZnJhbWVzIGFzICRmcmFtZSl7CgoJCQkkbWl4aW5zID0gJGZyYW1lLT5maW5kKCR0aGlzLT5zZWxlY3Rvcik7CgoJCQlpZiggISRtaXhpbnMgKXsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkkaXNPbmVGb3VuZCA9IHRydWU7CgkJCSRkZWZOb25lID0gMDsKCQkJJGRlZlRydWUgPSAxOwoJCQkkZGVmRmFsc2UgPSAyOwoKCQkJLy8gVG8gbWFrZSBgZGVmYXVsdCgpYCBmdW5jdGlvbiBpbmRlcGVuZGVudCBvZiBkZWZpbml0aW9uIG9yZGVyIHdlIGhhdmUgdHdvICJzdWJwYXNzZXMiIGhlcmUuCgkJCS8vIEF0IGZpcnN0IHdlIGV2YWx1YXRlIGVhY2ggZ3VhcmQgKnR3aWNlKiAod2l0aCBgZGVmYXVsdCgpID09IHRydWVgIGFuZCBgZGVmYXVsdCgpID09IGZhbHNlYCksCgkJCS8vIGFuZCBidWlsZCBjYW5kaWRhdGUgbGlzdCB3aXRoIGNvcnJlc3BvbmRpbmcgZmxhZ3MuIFRoZW4sIHdoZW4gd2Uga25vdyBhbGwgcG9zc2libGUgbWF0Y2hlcywKCQkJLy8gd2UgbWFrZSBhIGZpbmFsIGRlY2lzaW9uLgoKCQkJJG1peGluc19sZW4gPSBjb3VudCgkbWl4aW5zKTsKCQkJZm9yKCAkbSA9IDA7ICRtIDwgJG1peGluc19sZW47ICRtKysgKXsKCQkJCSRtaXhpbiA9ICRtaXhpbnNbJG1dOwoKCQkJCWlmKCAkdGhpcy0+SXNSZWN1cnNpdmUoICRlbnYsICRtaXhpbiApICl7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJaWYoICRtaXhpbi0+bWF0Y2hBcmdzKCRhcmdzLCAkZW52KSApewoKCQkJCQkkY2FuZGlkYXRlID0gYXJyYXkoJ21peGluJyA9PiAkbWl4aW4sICdncm91cCcgPT4gJGRlZk5vbmUpOwoKCQkJCQlpZiggJG1peGluIGluc3RhbmNlb2YgTGVzc19UcmVlX1J1bGVzZXQgKXsKCgkJCQkJCWZvciggJGYgPSAwOyAkZiA8IDI7ICRmKysgKXsKCQkJCQkJCUxlc3NfVHJlZV9EZWZhdWx0RnVuYzo6dmFsdWUoJGYpOwoJCQkJCQkJJGNvbmRpdGlvblJlc3VsdFskZl0gPSAkbWl4aW4tPm1hdGNoQ29uZGl0aW9uKCAkYXJncywgJGVudik7CgkJCQkJCX0KCQkJCQkJaWYoICRjb25kaXRpb25SZXN1bHRbMF0gfHwgJGNvbmRpdGlvblJlc3VsdFsxXSApewoJCQkJCQkJaWYoICRjb25kaXRpb25SZXN1bHRbMF0gIT0gJGNvbmRpdGlvblJlc3VsdFsxXSApewoJCQkJCQkJCSRjYW5kaWRhdGVbJ2dyb3VwJ10gPSAkY29uZGl0aW9uUmVzdWx0WzFdID8gJGRlZlRydWUgOiAkZGVmRmFsc2U7CgkJCQkJCQl9CgoJCQkJCQkJJGNhbmRpZGF0ZXNbXSA9ICRjYW5kaWRhdGU7CgkJCQkJCX0KCQkJCQl9ZWxzZXsKCQkJCQkJJGNhbmRpZGF0ZXNbXSA9ICRjYW5kaWRhdGU7CgkJCQkJfQoKCQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJfQoJCQl9CgoJCQlMZXNzX1RyZWVfRGVmYXVsdEZ1bmM6OnJlc2V0KCk7CgoKCQkJJGNvdW50ID0gYXJyYXkoMCwgMCwgMCk7CgkJCWZvciggJG0gPSAwOyAkbSA8IGNvdW50KCRjYW5kaWRhdGVzKTsgJG0rKyApewoJCQkJJGNvdW50WyAkY2FuZGlkYXRlc1skbV1bJ2dyb3VwJ10gXSsrOwoJCQl9CgoJCQlpZiggJGNvdW50WyRkZWZOb25lXSA+IDAgKXsKCQkJCSRkZWZhdWx0UmVzdWx0ID0gJGRlZkZhbHNlOwoJCQl9IGVsc2UgewoJCQkJJGRlZmF1bHRSZXN1bHQgPSAkZGVmVHJ1ZTsKCQkJCWlmKCAoJGNvdW50WyRkZWZUcnVlXSArICRjb3VudFskZGVmRmFsc2VdKSA+IDEgKXsKCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCAnQW1iaWd1b3VzIHVzZSBvZiBgZGVmYXVsdCgpYCBmb3VuZCB3aGVuIG1hdGNoaW5nIGZvciBgJy4gJHRoaXMtPmZvcm1hdCgkYXJncykgKyAnYCcgKTsKCQkJCX0KCQkJfQoKCgkJCSRjYW5kaWRhdGVzX2xlbmd0aCA9IGNvdW50KCRjYW5kaWRhdGVzKTsKCQkJJGxlbmd0aF8xID0gKCRjYW5kaWRhdGVzX2xlbmd0aCA9PSAxKTsKCgkJCWZvciggJG0gPSAwOyAkbSA8ICRjYW5kaWRhdGVzX2xlbmd0aDsgJG0rKyl7CgkJCQkkY2FuZGlkYXRlID0gJGNhbmRpZGF0ZXNbJG1dWydncm91cCddOwoJCQkJaWYoICgkY2FuZGlkYXRlID09PSAkZGVmTm9uZSkgfHwgKCRjYW5kaWRhdGUgPT09ICRkZWZhdWx0UmVzdWx0KSApewoJCQkJCXRyeXsKCQkJCQkJJG1peGluID0gJGNhbmRpZGF0ZXNbJG1dWydtaXhpbiddOwoJCQkJCQlpZiggISgkbWl4aW4gaW5zdGFuY2VvZiBMZXNzX1RyZWVfTWl4aW5fRGVmaW5pdGlvbikgKXsKCQkJCQkJCSRtaXhpbiA9IG5ldyBMZXNzX1RyZWVfTWl4aW5fRGVmaW5pdGlvbignJywgYXJyYXkoKSwgJG1peGluLT5ydWxlcywgbnVsbCwgZmFsc2UpOwoJCQkJCQkJJG1peGluLT5vcmlnaW5hbFJ1bGVzZXQgPSAkbWl4aW5zWyRtXS0+b3JpZ2luYWxSdWxlc2V0OwoJCQkJCQl9CgkJCQkJCSRydWxlcyA9IGFycmF5X21lcmdlKCRydWxlcywgJG1peGluLT5ldmFsQ2FsbCgkZW52LCAkYXJncywgJHRoaXMtPmltcG9ydGFudCktPnJ1bGVzKTsKCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKCQkJCQkJLy90aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoJGUtPmdldE1lc3NhZ2UoKSwgJGUtPmluZGV4LCBudWxsLCAkdGhpcy0+Y3VycmVudEZpbGVJbmZvWydmaWxlbmFtZSddKTsKCQkJCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCRlLT5nZXRNZXNzYWdlKCksIG51bGwsIG51bGwsICR0aGlzLT5jdXJyZW50RmlsZUluZm8pOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJaWYoICRtYXRjaCApewoJCQkJaWYoICEkdGhpcy0+Y3VycmVudEZpbGVJbmZvIHx8ICFpc3NldCgkdGhpcy0+Y3VycmVudEZpbGVJbmZvWydyZWZlcmVuY2UnXSkgfHwgISR0aGlzLT5jdXJyZW50RmlsZUluZm9bJ3JlZmVyZW5jZSddICl7CgkJCQkJTGVzc19UcmVlOjpSZWZlcmVuY2VkQXJyYXkoJHJ1bGVzKTsKCQkJCX0KCgkJCQlyZXR1cm4gJHJ1bGVzOwoJCQl9CgkJfQoKCQlpZiggJGlzT25lRm91bmQgKXsKCQkJdGhyb3cgbmV3IExlc3NfRXhjZXB0aW9uX0NvbXBpbGVyKCdObyBtYXRjaGluZyBkZWZpbml0aW9uIHdhcyBmb3VuZCBmb3IgYCcuJHRoaXMtPkZvcm1hdCggJGFyZ3MgKS4nYCcsIG51bGwsICR0aGlzLT5pbmRleCwgJHRoaXMtPmN1cnJlbnRGaWxlSW5mbyk7CgoJCX1lbHNlewoJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIodHJpbSgkdGhpcy0+c2VsZWN0b3ItPnRvQ1NTKCkpIC4gIiBpcyB1bmRlZmluZWQgaW4gIi4kdGhpcy0+Y3VycmVudEZpbGVJbmZvWydmaWxlbmFtZSddLCBudWxsLCAkdGhpcy0+aW5kZXgpOwoJCX0KCgl9CgoJLyoqCgkgKiBGb3JtYXQgdGhlIGFyZ3MgZm9yIHVzZSBpbiBleGNlcHRpb24gbWVzc2FnZXMKCSAqCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gRm9ybWF0KCRhcmdzKXsKCQkkbWVzc2FnZSA9IGFycmF5KCk7CgkJaWYoICRhcmdzICl7CgkJCWZvcmVhY2goJGFyZ3MgYXMgJGEpewoJCQkJJGFyZ1ZhbHVlID0gJyc7CgkJCQlpZiggJGFbJ25hbWUnXSApewoJCQkJCSRhcmdWYWx1ZSArPSAkYVsnbmFtZSddKyc6JzsKCQkJCX0KCQkJCWlmKCBpc19vYmplY3QoJGFbJ3ZhbHVlJ10pICl7CgkJCQkJJGFyZ1ZhbHVlICs9ICRhWyd2YWx1ZSddLT50b0NTUygpOwoJCQkJfWVsc2V7CgkJCQkJJGFyZ1ZhbHVlICs9ICc/Pz8nOwoJCQkJfQoJCQkJJG1lc3NhZ2VbXSA9ICRhcmdWYWx1ZTsKCQkJfQoJCX0KCQlyZXR1cm4gaW1wbG9kZSgnLCAnLCRtZXNzYWdlKTsKCX0KCgoJLyoqCgkgKiBBcmUgd2UgaW4gYSByZWN1cnNpdmUgbWl4aW4gY2FsbD8KCSAqCgkgKiBAcmV0dXJuIGJvb2wKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBJc1JlY3Vyc2l2ZSggJGVudiwgJG1peGluICl7CgoJCWZvcmVhY2goJGVudi0+ZnJhbWVzIGFzICRyZWN1cl9mcmFtZSl7CgkJCWlmKCAhKCRtaXhpbiBpbnN0YW5jZW9mIExlc3NfVHJlZV9NaXhpbl9EZWZpbml0aW9uKSApewoKCQkJCWlmKCAkbWl4aW4gPT09ICRyZWN1cl9mcmFtZSApewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoKCQkJCWlmKCBpc3NldCgkcmVjdXJfZnJhbWUtPm9yaWdpbmFsUnVsZXNldCkgJiYgJG1peGluLT5ydWxlc2V0X2lkID09PSAkcmVjdXJfZnJhbWUtPm9yaWdpbmFsUnVsZXNldCApewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9Cgp9CgoKIAoKY2xhc3MgTGVzc19UcmVlX01peGluX0RlZmluaXRpb24gZXh0ZW5kcyBMZXNzX1RyZWVfUnVsZXNldHsKCXB1YmxpYyAkbmFtZTsKCXB1YmxpYyAkc2VsZWN0b3JzOwoJcHVibGljICRwYXJhbXM7CglwdWJsaWMgJGFyaXR5CQk9IDA7CglwdWJsaWMgJHJ1bGVzOwoJcHVibGljICRsb29rdXBzCQk9IGFycmF5KCk7CglwdWJsaWMgJHJlcXVpcmVkCT0gMDsKCXB1YmxpYyAkZnJhbWVzCQk9IGFycmF5KCk7CglwdWJsaWMgJGNvbmRpdGlvbjsKCXB1YmxpYyAkdmFyaWFkaWM7CglwdWJsaWMgJHR5cGUJCT0gJ01peGluRGVmaW5pdGlvbic7CgoKCS8vIGxlc3MuanMgOiAvbGliL2xlc3MvdHJlZS9taXhpbi5qcyA6IHRyZWUubWl4aW4uRGVmaW5pdGlvbgoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRuYW1lLCAkcGFyYW1zLCAkcnVsZXMsICRjb25kaXRpb24sICR2YXJpYWRpYyA9IGZhbHNlLCAkZnJhbWVzID0gYXJyYXkoKSApewoJCSR0aGlzLT5uYW1lID0gJG5hbWU7CgkJJHRoaXMtPnNlbGVjdG9ycyA9IGFycmF5KG5ldyBMZXNzX1RyZWVfU2VsZWN0b3IoYXJyYXkoIG5ldyBMZXNzX1RyZWVfRWxlbWVudChudWxsLCAkbmFtZSkpKSk7CgoJCSR0aGlzLT5wYXJhbXMgPSAkcGFyYW1zOwoJCSR0aGlzLT5jb25kaXRpb24gPSAkY29uZGl0aW9uOwoJCSR0aGlzLT52YXJpYWRpYyA9ICR2YXJpYWRpYzsKCQkkdGhpcy0+cnVsZXMgPSAkcnVsZXM7CgoJCWlmKCAkcGFyYW1zICl7CgkJCSR0aGlzLT5hcml0eSA9IGNvdW50KCRwYXJhbXMpOwoJCQlmb3JlYWNoKCAkcGFyYW1zIGFzICRwICl7CgkJCQlpZiAoISBpc3NldCgkcFsnbmFtZSddKSB8fCAoJHBbJ25hbWUnXSAmJiAhaXNzZXQoJHBbJ3ZhbHVlJ10pKSkgewoJCQkJCSR0aGlzLT5yZXF1aXJlZCsrOwoJCQkJfQoJCQl9CgkJfQoKCQkkdGhpcy0+ZnJhbWVzID0gJGZyYW1lczsKCQkkdGhpcy0+U2V0UnVsZXNldEluZGV4KCk7Cgl9CgoKCgkvL2Z1bmN0aW9uIGFjY2VwdCggJHZpc2l0b3IgKXsKCS8vCSR0aGlzLT5wYXJhbXMgPSAkdmlzaXRvci0+dmlzaXQoJHRoaXMtPnBhcmFtcyk7CgkvLwkkdGhpcy0+cnVsZXMgPSAkdmlzaXRvci0+dmlzaXQoJHRoaXMtPnJ1bGVzKTsKCS8vCSR0aGlzLT5jb25kaXRpb24gPSAkdmlzaXRvci0+dmlzaXQoJHRoaXMtPmNvbmRpdGlvbik7CgkvL30KCgoJcHVibGljIGZ1bmN0aW9uIHRvQ1NTKCl7CgkJcmV0dXJuICcnOwoJfQoKCS8vIGxlc3MuanMgOiAvbGliL2xlc3MvdHJlZS9taXhpbi5qcyA6IHRyZWUubWl4aW4uRGVmaW5pdGlvbi5ldmFsUGFyYW1zCglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZVBhcmFtcygkZW52LCAkbWl4aW5GcmFtZXMsICRhcmdzID0gYXJyYXkoKSAsICYkZXZhbGRBcmd1bWVudHMgPSBhcnJheSgpICl7CgkJJGZyYW1lID0gbmV3IExlc3NfVHJlZV9SdWxlc2V0KG51bGwsIGFycmF5KCkpOwoJCSRwYXJhbXMgPSAkdGhpcy0+cGFyYW1zOwoJCSRtaXhpbkVudiA9IG51bGw7CgkJJGFyZ3NMZW5ndGggPSAwOwoKCQlpZiggJGFyZ3MgKXsKCQkJJGFyZ3NMZW5ndGggPSBjb3VudCgkYXJncyk7CgkJCWZvcigkaSA9IDA7ICRpIDwgJGFyZ3NMZW5ndGg7ICRpKysgKXsKCQkJCSRhcmcgPSAkYXJnc1skaV07CgoJCQkJaWYoICRhcmcgJiYgJGFyZ1snbmFtZSddICl7CgkJCQkJJGlzTmFtZWRGb3VuZCA9IGZhbHNlOwoKCQkJCQlmb3JlYWNoKCRwYXJhbXMgYXMgJGogPT4gJHBhcmFtKXsKCQkJCQkJaWYoICFpc3NldCgkZXZhbGRBcmd1bWVudHNbJGpdKSAmJiAkYXJnWyduYW1lJ10gPT09ICRwYXJhbXNbJGpdWyduYW1lJ10pIHsKCQkJCQkJCSRldmFsZEFyZ3VtZW50c1skal0gPSAkYXJnWyd2YWx1ZSddLT5jb21waWxlKCRlbnYpOwoJCQkJCQkJYXJyYXlfdW5zaGlmdCgkZnJhbWUtPnJ1bGVzLCBuZXcgTGVzc19UcmVlX1J1bGUoICRhcmdbJ25hbWUnXSwgJGFyZ1sndmFsdWUnXS0+Y29tcGlsZSgkZW52KSApICk7CgkJCQkJCQkkaXNOYW1lZEZvdW5kID0gdHJ1ZTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWlmICgkaXNOYW1lZEZvdW5kKSB7CgkJCQkJCWFycmF5X3NwbGljZSgkYXJncywgJGksIDEpOwoJCQkJCQkkaS0tOwoJCQkJCQkkYXJnc0xlbmd0aC0tOwoJCQkJCQljb250aW51ZTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoIk5hbWVkIGFyZ3VtZW50IGZvciAiIC4gJHRoaXMtPm5hbWUgLicgJy4kYXJnc1skaV1bJ25hbWUnXSAuICcgbm90IGZvdW5kJyk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQkkYXJnSW5kZXggPSAwOwoJCWZvcmVhY2goJHBhcmFtcyBhcyAkaSA9PiAkcGFyYW0pewoKCQkJaWYgKCBpc3NldCgkZXZhbGRBcmd1bWVudHNbJGldKSApeyBjb250aW51ZTsgfQoKCQkJJGFyZyA9IG51bGw7CgkJCWlmKCBpc3NldCgkYXJnc1skYXJnSW5kZXhdKSApewoJCQkJJGFyZyA9ICRhcmdzWyRhcmdJbmRleF07CgkJCX0KCgkJCWlmIChpc3NldCgkcGFyYW1bJ25hbWUnXSkgJiYgJHBhcmFtWyduYW1lJ10pIHsKCgkJCQlpZiggaXNzZXQoJHBhcmFtWyd2YXJpYWRpYyddKSApewoJCQkJCSR2YXJhcmdzID0gYXJyYXkoKTsKCQkJCQlmb3IgKCRqID0gJGFyZ0luZGV4OyAkaiA8ICRhcmdzTGVuZ3RoOyAkaisrKSB7CgkJCQkJCSR2YXJhcmdzW10gPSAkYXJnc1skal1bJ3ZhbHVlJ10tPmNvbXBpbGUoJGVudik7CgkJCQkJfQoJCQkJCSRleHByZXNzaW9uID0gbmV3IExlc3NfVHJlZV9FeHByZXNzaW9uKCR2YXJhcmdzKTsKCQkJCQlhcnJheV91bnNoaWZ0KCRmcmFtZS0+cnVsZXMsIG5ldyBMZXNzX1RyZWVfUnVsZSgkcGFyYW1bJ25hbWUnXSwgJGV4cHJlc3Npb24tPmNvbXBpbGUoJGVudikpKTsKCQkJCX1lbHNlewoJCQkJCSR2YWwgPSAoJGFyZyAmJiAkYXJnWyd2YWx1ZSddKSA/ICRhcmdbJ3ZhbHVlJ10gOiBmYWxzZTsKCgkJCQkJaWYgKCR2YWwpIHsKCQkJCQkJJHZhbCA9ICR2YWwtPmNvbXBpbGUoJGVudik7CgkJCQkJfSBlbHNlIGlmICggaXNzZXQoJHBhcmFtWyd2YWx1ZSddKSApIHsKCgkJCQkJCWlmKCAhJG1peGluRW52ICl7CgkJCQkJCQkkbWl4aW5FbnYgPSBuZXcgTGVzc19FbnZpcm9ubWVudCgpOwoJCQkJCQkJJG1peGluRW52LT5mcmFtZXMgPSBhcnJheV9tZXJnZSggYXJyYXkoJGZyYW1lKSwgJG1peGluRnJhbWVzKTsKCQkJCQkJfQoKCQkJCQkJJHZhbCA9ICRwYXJhbVsndmFsdWUnXS0+Y29tcGlsZSgkbWl4aW5FbnYpOwoJCQkJCQkkZnJhbWUtPnJlc2V0Q2FjaGUoKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0aHJvdyBuZXcgTGVzc19FeGNlcHRpb25fQ29tcGlsZXIoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yICIgLiAkdGhpcy0+bmFtZSAuICIgKCIgLiAkYXJnc0xlbmd0aCAuICcgZm9yICcgLiAkdGhpcy0+YXJpdHkgLiAiKSIpOwoJCQkJCX0KCgkJCQkJYXJyYXlfdW5zaGlmdCgkZnJhbWUtPnJ1bGVzLCBuZXcgTGVzc19UcmVlX1J1bGUoJHBhcmFtWyduYW1lJ10sICR2YWwpKTsKCQkJCQkkZXZhbGRBcmd1bWVudHNbJGldID0gJHZhbDsKCQkJCX0KCQkJfQoKCQkJaWYgKCBpc3NldCgkcGFyYW1bJ3ZhcmlhZGljJ10pICYmICRhcmdzKSB7CgkJCQlmb3IgKCRqID0gJGFyZ0luZGV4OyAkaiA8ICRhcmdzTGVuZ3RoOyAkaisrKSB7CgkJCQkJJGV2YWxkQXJndW1lbnRzWyRqXSA9ICRhcmdzWyRqXVsndmFsdWUnXS0+Y29tcGlsZSgkZW52KTsKCQkJCX0KCQkJfQoJCQkkYXJnSW5kZXgrKzsKCQl9CgoJCWtzb3J0KCRldmFsZEFyZ3VtZW50cyk7CgkJJGV2YWxkQXJndW1lbnRzID0gYXJyYXlfdmFsdWVzKCRldmFsZEFyZ3VtZW50cyk7CgoJCXJldHVybiAkZnJhbWU7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoJGVudikgewoJCWlmKCAkdGhpcy0+ZnJhbWVzICl7CgkJCXJldHVybiBuZXcgTGVzc19UcmVlX01peGluX0RlZmluaXRpb24oJHRoaXMtPm5hbWUsICR0aGlzLT5wYXJhbXMsICR0aGlzLT5ydWxlcywgJHRoaXMtPmNvbmRpdGlvbiwgJHRoaXMtPnZhcmlhZGljLCAkdGhpcy0+ZnJhbWVzICk7CgkJfQoJCXJldHVybiBuZXcgTGVzc19UcmVlX01peGluX0RlZmluaXRpb24oJHRoaXMtPm5hbWUsICR0aGlzLT5wYXJhbXMsICR0aGlzLT5ydWxlcywgJHRoaXMtPmNvbmRpdGlvbiwgJHRoaXMtPnZhcmlhZGljLCAkZW52LT5mcmFtZXMgKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZXZhbENhbGwoJGVudiwgJGFyZ3MgPSBOVUxMLCAkaW1wb3J0YW50ID0gTlVMTCkgewoKCQlMZXNzX0Vudmlyb25tZW50OjokbWl4aW5fc3RhY2srKzsKCgkJJF9hcmd1bWVudHMgPSBhcnJheSgpOwoKCQlpZiggJHRoaXMtPmZyYW1lcyApewoJCQkkbWl4aW5GcmFtZXMgPSBhcnJheV9tZXJnZSgkdGhpcy0+ZnJhbWVzLCAkZW52LT5mcmFtZXMpOwoJCX1lbHNlewoJCQkkbWl4aW5GcmFtZXMgPSAkZW52LT5mcmFtZXM7CgkJfQoKCQkkZnJhbWUgPSAkdGhpcy0+Y29tcGlsZVBhcmFtcygkZW52LCAkbWl4aW5GcmFtZXMsICRhcmdzLCAkX2FyZ3VtZW50cyk7CgoJCSRleCA9IG5ldyBMZXNzX1RyZWVfRXhwcmVzc2lvbigkX2FyZ3VtZW50cyk7CgkJYXJyYXlfdW5zaGlmdCgkZnJhbWUtPnJ1bGVzLCBuZXcgTGVzc19UcmVlX1J1bGUoJ0Bhcmd1bWVudHMnLCAkZXgtPmNvbXBpbGUoJGVudikpKTsKCgoJCSRydWxlc2V0ID0gbmV3IExlc3NfVHJlZV9SdWxlc2V0KG51bGwsICR0aGlzLT5ydWxlcyk7CgkJJHJ1bGVzZXQtPm9yaWdpbmFsUnVsZXNldCA9ICR0aGlzLT5ydWxlc2V0X2lkOwoKCgkJJHJ1bGVTZXRFbnYgPSBuZXcgTGVzc19FbnZpcm9ubWVudCgpOwoJCSRydWxlU2V0RW52LT5mcmFtZXMgPSBhcnJheV9tZXJnZSggYXJyYXkoJHRoaXMsICRmcmFtZSksICRtaXhpbkZyYW1lcyApOwoJCSRydWxlc2V0ID0gJHJ1bGVzZXQtPmNvbXBpbGUoICRydWxlU2V0RW52ICk7CgoJCWlmKCAkaW1wb3J0YW50ICl7CgkJCSRydWxlc2V0ID0gJHJ1bGVzZXQtPm1ha2VJbXBvcnRhbnQoKTsKCQl9CgoJCUxlc3NfRW52aXJvbm1lbnQ6OiRtaXhpbl9zdGFjay0tOwoKCQlyZXR1cm4gJHJ1bGVzZXQ7Cgl9CgoKCXB1YmxpYyBmdW5jdGlvbiBtYXRjaENvbmRpdGlvbigkYXJncywgJGVudikgewoKCQlpZiggISR0aGlzLT5jb25kaXRpb24gKXsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkvLyBzZXQgYXJyYXkgdG8gcHJldmVudCBlcnJvciBvbiBhcnJheV9tZXJnZQoJCWlmKCFpc19hcnJheSgkdGhpcy0+ZnJhbWVzKSkgewogICAgICAgICAgICAgJHRoaXMtPmZyYW1lcyA9IGFycmF5KCk7CiAgICAgICAgfQoKCQkkZnJhbWUgPSAkdGhpcy0+Y29tcGlsZVBhcmFtcygkZW52LCBhcnJheV9tZXJnZSgkdGhpcy0+ZnJhbWVzLCRlbnYtPmZyYW1lcyksICRhcmdzICk7CgoJCSRjb21waWxlX2VudiA9IG5ldyBMZXNzX0Vudmlyb25tZW50KCk7CgkJJGNvbXBpbGVfZW52LT5mcmFtZXMgPSBhcnJheV9tZXJnZSgKCQkJCWFycmF5KCRmcmFtZSkJCS8vIHRoZSBwYXJhbWV0ZXIgdmFyaWFibGVzCgkJCQksICR0aGlzLT5mcmFtZXMJCS8vIHRoZSBwYXJlbnQgbmFtZXNwYWNlL21peGluIGZyYW1lcwoJCQkJLCAkZW52LT5mcmFtZXMJCS8vIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGZyYW1lcwoJCQkpOwoKCQkkY29tcGlsZV9lbnYtPmZ1bmN0aW9ucyA9ICRlbnYtPmZ1bmN0aW9uczsKCgkJcmV0dXJuIChib29sKSR0aGlzLT5jb25kaXRpb24tPmNvbXBpbGUoJGNvbXBpbGVfZW52KTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gbWF0Y2hBcmdzKCRhcmdzLCAkZW52ID0gTlVMTCl7CgkJJGFyZ3NMZW5ndGggPSBjb3VudCgkYXJncyk7CgoJCWlmKCAhJHRoaXMtPnZhcmlhZGljICl7CgkJCWlmKCAkYXJnc0xlbmd0aCA8ICR0aGlzLT5yZXF1aXJlZCApewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWlmKCAkYXJnc0xlbmd0aCA+IGNvdW50KCR0aGlzLT5wYXJhbXMpICl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9ZWxzZXsKCQkJaWYoICRhcmdzTGVuZ3RoIDwgKCR0aGlzLT5yZXF1aXJlZCAtIDEpKXsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCgkJJGxlbiA9IG1pbigkYXJnc0xlbmd0aCwgJHRoaXMtPmFyaXR5KTsKCgkJZm9yKCAkaSA9IDA7ICRpIDwgJGxlbjsgJGkrKyApewoJCQlpZiggIWlzc2V0KCR0aGlzLT5wYXJhbXNbJGldWyduYW1lJ10pICYmICFpc3NldCgkdGhpcy0+cGFyYW1zWyRpXVsndmFyaWFkaWMnXSkgKXsKCQkJCWlmKCAkYXJnc1skaV1bJ3ZhbHVlJ10tPmNvbXBpbGUoJGVudiktPnRvQ1NTKCkgIT0gJHRoaXMtPnBhcmFtc1skaV1bJ3ZhbHVlJ10tPmNvbXBpbGUoJGVudiktPnRvQ1NTKCkgKXsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB0cnVlOwoJfQoKfQogCgovKioKICogRXh0ZW5kIEZpbmRlciBWaXNpdG9yCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdmlzaXRvcgogKi8KY2xhc3MgTGVzc19WaXNpdG9yX2V4dGVuZEZpbmRlciBleHRlbmRzIExlc3NfVmlzaXRvcnsKCglwdWJsaWMgJGNvbnRleHRzID0gYXJyYXkoKTsKCXB1YmxpYyAkYWxsRXh0ZW5kc1N0YWNrOwoJcHVibGljICRmb3VuZEV4dGVuZHM7CgoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCl7CgkJJHRoaXMtPmNvbnRleHRzID0gYXJyYXkoKTsKCQkkdGhpcy0+YWxsRXh0ZW5kc1N0YWNrID0gYXJyYXkoYXJyYXkoKSk7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCgpOwoJfQoKCS8qKgoJICogQHBhcmFtIExlc3NfVHJlZV9SdWxlc2V0ICRyb290CgkgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBydW4oJHJvb3QpewoJCSRyb290ID0gJHRoaXMtPnZpc2l0T2JqKCRyb290KTsKCQkkcm9vdC0+YWxsRXh0ZW5kcyA9JiAkdGhpcy0+YWxsRXh0ZW5kc1N0YWNrWzBdOwoJCXJldHVybiAkcm9vdDsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRSdWxlKCRydWxlTm9kZSwgJiR2aXNpdERlZXBlciApewoJCSR2aXNpdERlZXBlciA9IGZhbHNlOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE1peGluRGVmaW5pdGlvbiggJG1peGluRGVmaW5pdGlvbk5vZGUsICYkdmlzaXREZWVwZXIgKXsKCQkkdmlzaXREZWVwZXIgPSBmYWxzZTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRSdWxlc2V0KCRydWxlc2V0Tm9kZSl7CgoJCWlmKCAkcnVsZXNldE5vZGUtPnJvb3QgKXsKCQkJcmV0dXJuOwoJCX0KCgkJJGFsbFNlbGVjdG9yc0V4dGVuZExpc3QgPSBhcnJheSgpOwoKCQkvLyBnZXQgJjpleHRlbmQoLmEpOyBydWxlcyB3aGljaCBhcHBseSB0byBhbGwgc2VsZWN0b3JzIGluIHRoaXMgcnVsZXNldAoJCWlmKCAkcnVsZXNldE5vZGUtPnJ1bGVzICl7CgkJCWZvcmVhY2goJHJ1bGVzZXROb2RlLT5ydWxlcyBhcyAkcnVsZSl7CgkJCQlpZiggJHJ1bGUgaW5zdGFuY2VvZiBMZXNzX1RyZWVfRXh0ZW5kICl7CgkJCQkJJGFsbFNlbGVjdG9yc0V4dGVuZExpc3RbXSA9ICRydWxlOwoJCQkJCSRydWxlc2V0Tm9kZS0+ZXh0ZW5kT25FdmVyeVBhdGggPSB0cnVlOwoJCQkJfQoJCQl9CgkJfQoKCgkJLy8gbm93IGZpbmQgZXZlcnkgc2VsZWN0b3IgYW5kIGFwcGx5IHRoZSBleHRlbmRzIHRoYXQgYXBwbHkgdG8gYWxsIGV4dGVuZHMKCQkvLyBhbmQgdGhlIG9uZXMgd2hpY2ggYXBwbHkgdG8gYW4gaW5kaXZpZHVhbCBleHRlbmQKCQlmb3JlYWNoKCRydWxlc2V0Tm9kZS0+cGF0aHMgYXMgJHNlbGVjdG9yUGF0aCl7CgkJCSRzZWxlY3RvciA9IGVuZCgkc2VsZWN0b3JQYXRoKTsgLy8kc2VsZWN0b3JQYXRoWyBjb3VudCgkc2VsZWN0b3JQYXRoKS0xXTsKCgkJCSRqID0gMDsKCQkJZm9yZWFjaCgkc2VsZWN0b3ItPmV4dGVuZExpc3QgYXMgJGV4dGVuZCl7CgkJCQkkdGhpcy0+YWxsRXh0ZW5kc1N0YWNrUHVzaCgkcnVsZXNldE5vZGUsICRzZWxlY3RvclBhdGgsICRleHRlbmQsICRqKTsKCQkJfQoJCQlmb3JlYWNoKCRhbGxTZWxlY3RvcnNFeHRlbmRMaXN0IGFzICRleHRlbmQpewoJCQkJJHRoaXMtPmFsbEV4dGVuZHNTdGFja1B1c2goJHJ1bGVzZXROb2RlLCAkc2VsZWN0b3JQYXRoLCAkZXh0ZW5kLCAkaik7CgkJCX0KCQl9CgoJCSR0aGlzLT5jb250ZXh0c1tdID0gJHJ1bGVzZXROb2RlLT5zZWxlY3RvcnM7Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIGFsbEV4dGVuZHNTdGFja1B1c2goJHJ1bGVzZXROb2RlLCAkc2VsZWN0b3JQYXRoLCAkZXh0ZW5kLCAmJGopewoJCSR0aGlzLT5mb3VuZEV4dGVuZHMgPSB0cnVlOwoJCSRleHRlbmQgPSBjbG9uZSAkZXh0ZW5kOwoJCSRleHRlbmQtPmZpbmRTZWxmU2VsZWN0b3JzKCAkc2VsZWN0b3JQYXRoICk7CgkJJGV4dGVuZC0+cnVsZXNldCA9ICRydWxlc2V0Tm9kZTsKCQlpZiggJGogPT09IDAgKXsKCQkJJGV4dGVuZC0+Zmlyc3RFeHRlbmRPblRoaXNTZWxlY3RvclBhdGggPSB0cnVlOwoJCX0KCgkJJGVuZF9rZXkgPSBjb3VudCgkdGhpcy0+YWxsRXh0ZW5kc1N0YWNrKS0xOwoJCSR0aGlzLT5hbGxFeHRlbmRzU3RhY2tbJGVuZF9rZXldW10gPSAkZXh0ZW5kOwoJCSRqKys7Cgl9CgoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFJ1bGVzZXRPdXQoICRydWxlc2V0Tm9kZSApewoJCWlmKCAhaXNfb2JqZWN0KCRydWxlc2V0Tm9kZSkgfHwgISRydWxlc2V0Tm9kZS0+cm9vdCApewoJCQlhcnJheV9wb3AoJHRoaXMtPmNvbnRleHRzKTsKCQl9Cgl9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0TWVkaWEoICRtZWRpYU5vZGUgKXsKCQkkbWVkaWFOb2RlLT5hbGxFeHRlbmRzID0gYXJyYXkoKTsKCQkkdGhpcy0+YWxsRXh0ZW5kc1N0YWNrW10gPSYgJG1lZGlhTm9kZS0+YWxsRXh0ZW5kczsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRNZWRpYU91dCgpewoJCWFycmF5X3BvcCgkdGhpcy0+YWxsRXh0ZW5kc1N0YWNrKTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXREaXJlY3RpdmUoICRkaXJlY3RpdmVOb2RlICl7CgkJJGRpcmVjdGl2ZU5vZGUtPmFsbEV4dGVuZHMgPSBhcnJheSgpOwoJCSR0aGlzLT5hbGxFeHRlbmRzU3RhY2tbXSA9JiAkZGlyZWN0aXZlTm9kZS0+YWxsRXh0ZW5kczsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXREaXJlY3RpdmVPdXQoKXsKCQlhcnJheV9wb3AoJHRoaXMtPmFsbEV4dGVuZHNTdGFjayk7Cgl9Cn0KCgogCgovKgpjbGFzcyBMZXNzX1Zpc2l0b3JfaW1wb3J0IGV4dGVuZHMgTGVzc19WaXNpdG9yUmVwbGFjaW5newoKCXB1YmxpYyAkX3Zpc2l0b3I7CglwdWJsaWMgJF9pbXBvcnRlcjsKCXB1YmxpYyAkaW1wb3J0Q291bnQ7CgoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRldmFsRW52ICl7CgkJJHRoaXMtPmVudiA9ICRldmFsRW52OwoJCSR0aGlzLT5pbXBvcnRDb3VudCA9IDA7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCgpOwoJfQoKCglmdW5jdGlvbiBydW4oICRyb290ICl7CgkJJHJvb3QgPSAkdGhpcy0+dmlzaXRPYmooJHJvb3QpOwoJCSR0aGlzLT5pc0ZpbmlzaGVkID0gdHJ1ZTsKCgkJLy9pZiggJHRoaXMtPmltcG9ydENvdW50ID09PSAwKSB7CgkJLy8JJHRoaXMtPl9maW5pc2goKTsKCQkvL30KCX0KCglmdW5jdGlvbiB2aXNpdEltcG9ydCgkaW1wb3J0Tm9kZSwgJiR2aXNpdERlZXBlciApewoJCSRpbXBvcnRWaXNpdG9yID0gJHRoaXM7CgkJJGlubGluZUNTUyA9ICRpbXBvcnROb2RlLT5vcHRpb25zWydpbmxpbmUnXTsKCgkJaWYoICEkaW1wb3J0Tm9kZS0+Y3NzIHx8ICRpbmxpbmVDU1MgKXsKCQkJJGV2YWxkSW1wb3J0Tm9kZSA9ICRpbXBvcnROb2RlLT5jb21waWxlRm9ySW1wb3J0KCR0aGlzLT5lbnYpOwoKCQkJaWYoICRldmFsZEltcG9ydE5vZGUgJiYgKCEkZXZhbGRJbXBvcnROb2RlLT5jc3MgfHwgJGlubGluZUNTUykgKXsKCQkJCSRpbXBvcnROb2RlID0gJGV2YWxkSW1wb3J0Tm9kZTsKCQkJCSR0aGlzLT5pbXBvcnRDb3VudCsrOwoJCQkJJGVudiA9IGNsb25lICR0aGlzLT5lbnY7CgoJCQkJaWYoIChpc3NldCgkaW1wb3J0Tm9kZS0+b3B0aW9uc1snbXVsdGlwbGUnXSkgJiYgJGltcG9ydE5vZGUtPm9wdGlvbnNbJ211bHRpcGxlJ10pICl7CgkJCQkJJGVudi0+aW1wb3J0TXVsdGlwbGUgPSB0cnVlOwoJCQkJfQoKCQkJCS8vZ2V0IHBhdGggJiB1cmkKCQkJCSRwYXRoX2FuZF91cmkgPSBudWxsOwoJCQkJaWYoIGlzX2NhbGxhYmxlKExlc3NfUGFyc2VyOjokb3B0aW9uc1snaW1wb3J0X2NhbGxiYWNrJ10pICl7CgkJCQkJJHBhdGhfYW5kX3VyaSA9IGNhbGxfdXNlcl9mdW5jKExlc3NfUGFyc2VyOjokb3B0aW9uc1snaW1wb3J0X2NhbGxiYWNrJ10sJGltcG9ydE5vZGUpOwoJCQkJfQoKCQkJCWlmKCAhJHBhdGhfYW5kX3VyaSApewoJCQkJCSRwYXRoX2FuZF91cmkgPSAkaW1wb3J0Tm9kZS0+UGF0aEFuZFVyaSgpOwoJCQkJfQoKCQkJCWlmKCAkcGF0aF9hbmRfdXJpICl7CgkJCQkJbGlzdCgkZnVsbF9wYXRoLCAkdXJpKSA9ICRwYXRoX2FuZF91cmk7CgkJCQl9ZWxzZXsKCQkJCQkkZnVsbF9wYXRoID0gJHVyaSA9ICRpbXBvcnROb2RlLT5nZXRQYXRoKCk7CgkJCQl9CgoKCQkJCS8vaW1wb3J0IG9uY2UKCQkJCWlmKCAkaW1wb3J0Tm9kZS0+c2tpcCggJGZ1bGxfcGF0aCwgJGVudikgKXsKCQkJCQlyZXR1cm4gYXJyYXkoKTsKCQkJCX0KCgkJCQlpZiggJGltcG9ydE5vZGUtPm9wdGlvbnNbJ2lubGluZSddICl7CgkJCQkJLy90b2RvIG5lZWRzIHRvIHJlZmVyZW5jZSBjc3MgZmlsZSBub3QgaW1wb3J0CgkJCQkJLy8kY29udGVudHMgPSBuZXcgTGVzc19UcmVlX0Fub255bW91cygkaW1wb3J0Tm9kZS0+cm9vdCwgMCwgYXJyYXkoJ2ZpbGVuYW1lJz0+JGltcG9ydE5vZGUtPmltcG9ydGVkRmlsZW5hbWUpLCB0cnVlICk7CgoJCQkJCUxlc3NfUGFyc2VyOjpBZGRQYXJzZWRGaWxlKCRmdWxsX3BhdGgpOwoJCQkJCSRjb250ZW50cyA9IG5ldyBMZXNzX1RyZWVfQW5vbnltb3VzKCBmaWxlX2dldF9jb250ZW50cygkZnVsbF9wYXRoKSwgMCwgYXJyYXkoKSwgdHJ1ZSApOwoKCQkJCQlpZiggJGltcG9ydE5vZGUtPmZlYXR1cmVzICl7CgkJCQkJCXJldHVybiBuZXcgTGVzc19UcmVlX01lZGlhKCBhcnJheSgkY29udGVudHMpLCAkaW1wb3J0Tm9kZS0+ZmVhdHVyZXMtPnZhbHVlICk7CgkJCQkJfQoKCQkJCQlyZXR1cm4gYXJyYXkoICRjb250ZW50cyApOwoJCQkJfQoKCgkJCQkvLyBjc3MgPwoJCQkJaWYoICRpbXBvcnROb2RlLT5jc3MgKXsKCQkJCQkkZmVhdHVyZXMgPSAoICRpbXBvcnROb2RlLT5mZWF0dXJlcyA/ICRpbXBvcnROb2RlLT5mZWF0dXJlcy0+Y29tcGlsZSgkZW52KSA6IG51bGwgKTsKCQkJCQlyZXR1cm4gbmV3IExlc3NfVHJlZV9JbXBvcnQoICRpbXBvcnROb2RlLT5jb21waWxlUGF0aCggJGVudiksICRmZWF0dXJlcywgJGltcG9ydE5vZGUtPm9wdGlvbnMsICR0aGlzLT5pbmRleCk7CgkJCQl9CgoJCQkJcmV0dXJuICRpbXBvcnROb2RlLT5QYXJzZUltcG9ydCggJGZ1bGxfcGF0aCwgJHVyaSwgJGVudiApOwoJCQl9CgoJCX0KCgkJJHZpc2l0RGVlcGVyID0gZmFsc2U7CgkJcmV0dXJuICRpbXBvcnROb2RlOwoJfQoKCglmdW5jdGlvbiB2aXNpdFJ1bGUoICRydWxlTm9kZSwgJiR2aXNpdERlZXBlciApewoJCSR2aXNpdERlZXBlciA9IGZhbHNlOwoJCXJldHVybiAkcnVsZU5vZGU7Cgl9CgoJZnVuY3Rpb24gdmlzaXREaXJlY3RpdmUoJGRpcmVjdGl2ZU5vZGUsICR2aXNpdEFyZ3MpewoJCWFycmF5X3Vuc2hpZnQoJHRoaXMtPmVudi0+ZnJhbWVzLCRkaXJlY3RpdmVOb2RlKTsKCQlyZXR1cm4gJGRpcmVjdGl2ZU5vZGU7Cgl9CgoJZnVuY3Rpb24gdmlzaXREaXJlY3RpdmVPdXQoJGRpcmVjdGl2ZU5vZGUpIHsKCQlhcnJheV9zaGlmdCgkdGhpcy0+ZW52LT5mcmFtZXMpOwoJfQoKCWZ1bmN0aW9uIHZpc2l0TWl4aW5EZWZpbml0aW9uKCRtaXhpbkRlZmluaXRpb25Ob2RlLCAkdmlzaXRBcmdzKSB7CgkJYXJyYXlfdW5zaGlmdCgkdGhpcy0+ZW52LT5mcmFtZXMsJG1peGluRGVmaW5pdGlvbk5vZGUpOwoJCXJldHVybiAkbWl4aW5EZWZpbml0aW9uTm9kZTsKCX0KCglmdW5jdGlvbiB2aXNpdE1peGluRGVmaW5pdGlvbk91dCgkbWl4aW5EZWZpbml0aW9uTm9kZSkgewoJCWFycmF5X3NoaWZ0KCR0aGlzLT5lbnYtPmZyYW1lcyk7Cgl9CgoJZnVuY3Rpb24gdmlzaXRSdWxlc2V0KCRydWxlc2V0Tm9kZSwgJHZpc2l0QXJncykgewoJCWFycmF5X3Vuc2hpZnQoJHRoaXMtPmVudi0+ZnJhbWVzLCRydWxlc2V0Tm9kZSk7CgkJcmV0dXJuICRydWxlc2V0Tm9kZTsKCX0KCglmdW5jdGlvbiB2aXNpdFJ1bGVzZXRPdXQoJHJ1bGVzZXROb2RlKSB7CgkJYXJyYXlfc2hpZnQoJHRoaXMtPmVudi0+ZnJhbWVzKTsKCX0KCglmdW5jdGlvbiB2aXNpdE1lZGlhKCRtZWRpYU5vZGUsICR2aXNpdEFyZ3MpIHsKCQlhcnJheV91bnNoaWZ0KCR0aGlzLT5lbnYtPmZyYW1lcywgJG1lZGlhTm9kZS0+cnVsZXNldCk7CgkJcmV0dXJuICRtZWRpYU5vZGU7Cgl9CgoJZnVuY3Rpb24gdmlzaXRNZWRpYU91dCgkbWVkaWFOb2RlKSB7CgkJYXJyYXlfc2hpZnQoJHRoaXMtPmVudi0+ZnJhbWVzKTsKCX0KCn0KKi8KCgogCgovKioKICogSm9pbiBTZWxlY3RvciBWaXNpdG9yCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdmlzaXRvcgogKi8KY2xhc3MgTGVzc19WaXNpdG9yX2pvaW5TZWxlY3RvciBleHRlbmRzIExlc3NfVmlzaXRvcnsKCglwdWJsaWMgJGNvbnRleHRzID0gYXJyYXkoIGFycmF5KCkgKTsKCgkvKioKCSAqIEBwYXJhbSBMZXNzX1RyZWVfUnVsZXNldCAkcm9vdAoJICovCglwdWJsaWMgZnVuY3Rpb24gcnVuKCAkcm9vdCApewoJCXJldHVybiAkdGhpcy0+dmlzaXRPYmooJHJvb3QpOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFJ1bGUoICRydWxlTm9kZSwgJiR2aXNpdERlZXBlciApewoJCSR2aXNpdERlZXBlciA9IGZhbHNlOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE1peGluRGVmaW5pdGlvbiggJG1peGluRGVmaW5pdGlvbk5vZGUsICYkdmlzaXREZWVwZXIgKXsKCQkkdmlzaXREZWVwZXIgPSBmYWxzZTsKCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRSdWxlc2V0KCAkcnVsZXNldE5vZGUgKXsKCgkJJHBhdGhzID0gYXJyYXkoKTsKCgkJaWYoICEkcnVsZXNldE5vZGUtPnJvb3QgKXsKCQkJJHNlbGVjdG9ycyA9IGFycmF5KCk7CgoJCQlpZiggJHJ1bGVzZXROb2RlLT5zZWxlY3RvcnMgJiYgJHJ1bGVzZXROb2RlLT5zZWxlY3RvcnMgKXsKCQkJCWZvcmVhY2goJHJ1bGVzZXROb2RlLT5zZWxlY3RvcnMgYXMgJHNlbGVjdG9yKXsKCQkJCQlpZiggJHNlbGVjdG9yLT5nZXRJc091dHB1dCgpICl7CgkJCQkJCSRzZWxlY3RvcnNbXSA9ICRzZWxlY3RvcjsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmKCAhJHNlbGVjdG9ycyApewoJCQkJJHJ1bGVzZXROb2RlLT5zZWxlY3RvcnMgPSBudWxsOwoJCQkJJHJ1bGVzZXROb2RlLT5ydWxlcyA9IG51bGw7CgkJCX1lbHNlewoJCQkJJGNvbnRleHQgPSBlbmQoJHRoaXMtPmNvbnRleHRzKTsgLy8kY29udGV4dCA9ICR0aGlzLT5jb250ZXh0c1sgY291bnQoJHRoaXMtPmNvbnRleHRzKSAtIDFdOwoJCQkJJHBhdGhzID0gJHJ1bGVzZXROb2RlLT5qb2luU2VsZWN0b3JzKCAkY29udGV4dCwgJHNlbGVjdG9ycyk7CgkJCX0KCgkJCSRydWxlc2V0Tm9kZS0+cGF0aHMgPSAkcGF0aHM7CgkJfQoKCQkkdGhpcy0+Y29udGV4dHNbXSA9ICRwYXRoczsgLy9kaWZmZXJlbnQgZnJvbSBsZXNzLmpzLiBQbGFjZWQgYWZ0ZXIgam9pblNlbGVjdG9ycygpIHNvIHRoYXQgJHRoaXMtPmNvbnRleHRzIHdpbGwgZ2V0IGNvcnJlY3QgJHBhdGhzCgl9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0UnVsZXNldE91dCgpewoJCWFycmF5X3BvcCgkdGhpcy0+Y29udGV4dHMpOwoJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE1lZGlhKCRtZWRpYU5vZGUpIHsKCQkkY29udGV4dCA9IGVuZCgkdGhpcy0+Y29udGV4dHMpOyAvLyRjb250ZXh0ID0gJHRoaXMtPmNvbnRleHRzWyBjb3VudCgkdGhpcy0+Y29udGV4dHMpIC0gMV07CgoJCWlmKCAhY291bnQoJGNvbnRleHQpIHx8IChpc19vYmplY3QoJGNvbnRleHRbMF0pICYmICRjb250ZXh0WzBdLT5tdWx0aU1lZGlhKSApewoJCQkkbWVkaWFOb2RlLT5ydWxlc1swXS0+cm9vdCA9IHRydWU7CgkJfQoJfQoKfQoKIAoKLyoqCiAqIFByb2Nlc3MgRXh0ZW5kcyBWaXNpdG9yCiAqCiAqIEBwYWNrYWdlIExlc3MKICogQHN1YnBhY2thZ2UgdmlzaXRvcgogKi8KY2xhc3MgTGVzc19WaXNpdG9yX3Byb2Nlc3NFeHRlbmRzIGV4dGVuZHMgTGVzc19WaXNpdG9yewoKCXB1YmxpYyAkYWxsRXh0ZW5kc1N0YWNrOwoKCS8qKgoJICogQHBhcmFtIExlc3NfVHJlZV9SdWxlc2V0ICRyb290CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBydW4oICRyb290ICl7CgkJJGV4dGVuZEZpbmRlciA9IG5ldyBMZXNzX1Zpc2l0b3JfZXh0ZW5kRmluZGVyKCk7CgkJJGV4dGVuZEZpbmRlci0+cnVuKCAkcm9vdCApOwoJCWlmKCAhJGV4dGVuZEZpbmRlci0+Zm91bmRFeHRlbmRzKXsKCQkJcmV0dXJuICRyb290OwoJCX0KCgkJJHJvb3QtPmFsbEV4dGVuZHMgPSAkdGhpcy0+ZG9FeHRlbmRDaGFpbmluZyggJHJvb3QtPmFsbEV4dGVuZHMsICRyb290LT5hbGxFeHRlbmRzKTsKCgkJJHRoaXMtPmFsbEV4dGVuZHNTdGFjayA9IGFycmF5KCk7CgkJJHRoaXMtPmFsbEV4dGVuZHNTdGFja1tdID0gJiRyb290LT5hbGxFeHRlbmRzOwoKCQlyZXR1cm4gJHRoaXMtPnZpc2l0T2JqKCAkcm9vdCApOwoJfQoKCXByaXZhdGUgZnVuY3Rpb24gZG9FeHRlbmRDaGFpbmluZyggJGV4dGVuZHNMaXN0LCAkZXh0ZW5kc0xpc3RUYXJnZXQsICRpdGVyYXRpb25Db3VudCA9IDApewoJCS8vCgkJLy8gY2hhaW5pbmcgaXMgZGlmZmVyZW50IGZyb20gbm9ybWFsIGV4dGVuc2lvbi4uIGlmIHdlIGV4dGVuZCBhbiBleHRlbmQgdGhlbiB3ZSBhcmUgbm90IGp1c3QgY29weWluZywgYWx0ZXJpbmcgYW5kIHBhc3RpbmcKCQkvLyB0aGUgc2VsZWN0b3Igd2Ugd291bGQgZG8gbm9ybWFsbHksIGJ1dCB3ZSBhcmUgYWxzbyBhZGRpbmcgYW4gZXh0ZW5kIHdpdGggdGhlIHNhbWUgdGFyZ2V0IHNlbGVjdG9yCgkJLy8gdGhpcyBtZWFucyB0aGlzIG5ldyBleHRlbmQgY2FuIHRoZW4gZ28gYW5kIGFsdGVyIG90aGVyIGV4dGVuZHMKCQkvLwoJCS8vIHRoaXMgbWV0aG9kIGRlYWxzIHdpdGggYWxsIHRoZSBjaGFpbmluZyB3b3JrIC0gd2l0aG91dCBpdCwgZXh0ZW5kIGlzIGZsYXQgYW5kIGRvZXNuJ3Qgd29yayBvbiBvdGhlciBleHRlbmQgc2VsZWN0b3JzCgkJLy8gdGhpcyBpcyBhbHNvIHRoZSBtb3N0IGV4cGVuc2l2ZS4uIGFuZCBhIG1hdGNoIG9uIG9uZSBzZWxlY3RvciBjYW4gY2F1c2UgYW4gZXh0ZW5zaW9uIG9mIGEgc2VsZWN0b3Igd2UgaGFkIGFscmVhZHkgcHJvY2Vzc2VkIGlmCgkJLy8gd2UgbG9vayBhdCBlYWNoIHNlbGVjdG9yIGF0IGEgdGltZSwgYXMgaXMgZG9uZSBpbiB2aXNpdFJ1bGVzZXQKCgkJJGV4dGVuZHNUb0FkZCA9IGFycmF5KCk7CgoKCQkvL2xvb3AgdGhyb3VnaCBjb21wYXJpbmcgZXZlcnkgZXh0ZW5kIHdpdGggZXZlcnkgdGFyZ2V0IGV4dGVuZC4KCQkvLyBhIHRhcmdldCBleHRlbmQgaXMgdGhlIG9uZSBvbiB0aGUgcnVsZXNldCB3ZSBhcmUgbG9va2luZyBhdCBjb3B5L2VkaXQvcGFzdGluZyBpbiBwbGFjZQoJCS8vIGUuZy4gLmE6ZXh0ZW5kKC5iKSB7fSBhbmQgLmI6ZXh0ZW5kKC5jKSB7fSB0aGVuIHRoZSBmaXJzdCBleHRlbmQgZXh0ZW5kcyB0aGUgc2Vjb25kIG9uZQoJCS8vIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSB0YXJnZXQuCgkJLy8gdGhlIHNlcGVyYXRpb24gaW50byB0d28gbGlzdHMgYWxsb3dzIHVzIHRvIHByb2Nlc3MgYSBzdWJzZXQgb2YgY2hhaW5zIHdpdGggYSBiaWdnZXIgc2V0LCBhcyBpcyB0aGUKCQkvLyBjYXNlIHdoZW4gcHJvY2Vzc2luZyBtZWRpYSBxdWVyaWVzCgkJZm9yKCAkZXh0ZW5kSW5kZXggPSAwLCAkZXh0ZW5kc0xpc3RfbGVuID0gY291bnQoJGV4dGVuZHNMaXN0KTsgJGV4dGVuZEluZGV4IDwgJGV4dGVuZHNMaXN0X2xlbjsgJGV4dGVuZEluZGV4KysgKXsKCQkJZm9yKCAkdGFyZ2V0RXh0ZW5kSW5kZXggPSAwOyAkdGFyZ2V0RXh0ZW5kSW5kZXggPCBjb3VudCgkZXh0ZW5kc0xpc3RUYXJnZXQpOyAkdGFyZ2V0RXh0ZW5kSW5kZXgrKyApewoKCQkJCSRleHRlbmQgPSAkZXh0ZW5kc0xpc3RbJGV4dGVuZEluZGV4XTsKCQkJCSR0YXJnZXRFeHRlbmQgPSAkZXh0ZW5kc0xpc3RUYXJnZXRbJHRhcmdldEV4dGVuZEluZGV4XTsKCgkJCQkvLyBsb29rIGZvciBjaXJjdWxhciByZWZlcmVuY2VzCgkJCQlpZiggaW5fYXJyYXkoJHRhcmdldEV4dGVuZC0+b2JqZWN0X2lkLCAkZXh0ZW5kLT5wYXJlbnRfaWRzLHRydWUpICl7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJLy8gZmluZCBhIG1hdGNoIGluIHRoZSB0YXJnZXQgZXh0ZW5kcyBzZWxmIHNlbGVjdG9yICh0aGUgYml0IGJlZm9yZSA6ZXh0ZW5kKQoJCQkJJHNlbGVjdG9yUGF0aCA9IGFycmF5KCAkdGFyZ2V0RXh0ZW5kLT5zZWxmU2VsZWN0b3JzWzBdICk7CgkJCQkkbWF0Y2hlcyA9ICR0aGlzLT5maW5kTWF0Y2goICRleHRlbmQsICRzZWxlY3RvclBhdGgpOwoKCgkJCQlpZiggJG1hdGNoZXMgKXsKCgkJCQkJLy8gd2UgZm91bmQgYSBtYXRjaCwgc28gZm9yIGVhY2ggc2VsZiBzZWxlY3Rvci4uCgkJCQkJZm9yZWFjaCgkZXh0ZW5kLT5zZWxmU2VsZWN0b3JzIGFzICRzZWxmU2VsZWN0b3IgKXsKCgoJCQkJCQkvLyBwcm9jZXNzIHRoZSBleHRlbmQgYXMgdXN1YWwKCQkJCQkJJG5ld1NlbGVjdG9yID0gJHRoaXMtPmV4dGVuZFNlbGVjdG9yKCAkbWF0Y2hlcywgJHNlbGVjdG9yUGF0aCwgJHNlbGZTZWxlY3Rvcik7CgoJCQkJCQkvLyBidXQgbm93IHdlIGNyZWF0ZSBhIG5ldyBleHRlbmQgZnJvbSBpdAoJCQkJCQkkbmV3RXh0ZW5kID0gbmV3IExlc3NfVHJlZV9FeHRlbmQoICR0YXJnZXRFeHRlbmQtPnNlbGVjdG9yLCAkdGFyZ2V0RXh0ZW5kLT5vcHRpb24sIDApOwoJCQkJCQkkbmV3RXh0ZW5kLT5zZWxmU2VsZWN0b3JzID0gJG5ld1NlbGVjdG9yOwoKCQkJCQkJLy8gYWRkIHRoZSBleHRlbmQgb250byB0aGUgbGlzdCBvZiBleHRlbmRzIGZvciB0aGF0IHNlbGVjdG9yCgkJCQkJCWVuZCgkbmV3U2VsZWN0b3IpLT5leHRlbmRMaXN0ID0gYXJyYXkoJG5ld0V4dGVuZCk7CgkJCQkJCS8vJG5ld1NlbGVjdG9yWyBjb3VudCgkbmV3U2VsZWN0b3IpLTFdLT5leHRlbmRMaXN0ID0gYXJyYXkoJG5ld0V4dGVuZCk7CgoJCQkJCQkvLyByZWNvcmQgdGhhdCB3ZSBuZWVkIHRvIGFkZCBpdC4KCQkJCQkJJGV4dGVuZHNUb0FkZFtdID0gJG5ld0V4dGVuZDsKCQkJCQkJJG5ld0V4dGVuZC0+cnVsZXNldCA9ICR0YXJnZXRFeHRlbmQtPnJ1bGVzZXQ7CgoJCQkJCQkvL3JlbWVtYmVyIGl0cyBwYXJlbnRzIGZvciBjaXJjdWxhciByZWZlcmVuY2VzCgkJCQkJCSRuZXdFeHRlbmQtPnBhcmVudF9pZHMgPSBhcnJheV9tZXJnZSgkbmV3RXh0ZW5kLT5wYXJlbnRfaWRzLCR0YXJnZXRFeHRlbmQtPnBhcmVudF9pZHMsJGV4dGVuZC0+cGFyZW50X2lkcyk7CgoJCQkJCQkvLyBvbmx5IHByb2Nlc3MgdGhlIHNlbGVjdG9yIG9uY2UuLiBpZiB3ZSBoYXZlIDpleHRlbmQoLmEsLmIpIHRoZW4gbXVsdGlwbGUKCQkJCQkJLy8gZXh0ZW5kcyB3aWxsIGxvb2sgYXQgdGhlIHNhbWUgc2VsZWN0b3IgcGF0aCwgc28gd2hlbiBleHRlbmRpbmcKCQkJCQkJLy8gd2Uga25vdyB0aGF0IGFueSBvdGhlcnMgd2lsbCBiZSBkdXBsaWNhdGVzIGluIHRlcm1zIG9mIHdoYXQgaXMgYWRkZWQgdG8gdGhlIGNzcwoJCQkJCQlpZiggJHRhcmdldEV4dGVuZC0+Zmlyc3RFeHRlbmRPblRoaXNTZWxlY3RvclBhdGggKXsKCQkJCQkJCSRuZXdFeHRlbmQtPmZpcnN0RXh0ZW5kT25UaGlzU2VsZWN0b3JQYXRoID0gdHJ1ZTsKCQkJCQkJCSR0YXJnZXRFeHRlbmQtPnJ1bGVzZXQtPnBhdGhzW10gPSAkbmV3U2VsZWN0b3I7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCWlmKCAkZXh0ZW5kc1RvQWRkICl7CgkJCS8vIHRyeSB0byBkZXRlY3QgY2lyY3VsYXIgcmVmZXJlbmNlcyB0byBzdG9wIGEgc3RhY2sgb3ZlcmZsb3cuCgkJCS8vIG1heSBubyBsb25nZXIgYmUgbmVlZGVkLgkJCSR0aGlzLT5leHRlbmRDaGFpbkNvdW50Kys7CgkJCWlmKCAkaXRlcmF0aW9uQ291bnQgPiAxMDApIHsKCgkJCQl0cnl7CgkJCQkJJHNlbGVjdG9yT25lID0gJGV4dGVuZHNUb0FkZFswXS0+c2VsZlNlbGVjdG9yc1swXS0+dG9DU1MoKTsKCQkJCQkkc2VsZWN0b3JUd28gPSAkZXh0ZW5kc1RvQWRkWzBdLT5zZWxlY3Rvci0+dG9DU1MoKTsKCQkJCX1jYXRjaChFeGNlcHRpb24gJGUpewoJCQkJCSRzZWxlY3Rvck9uZSA9ICJ7dW5hYmxlIHRvIGNhbGN1bGF0ZX0iOwoJCQkJCSRzZWxlY3RvclR3byA9ICJ7dW5hYmxlIHRvIGNhbGN1bGF0ZX0iOwoJCQkJfQoKCQkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9QYXJzZXIoImV4dGVuZCBjaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQuIE9uZSBvZiB0aGUgY2lyY3VsYXIgZXh0ZW5kcyBpcyBjdXJyZW50bHk6Iiskc2VsZWN0b3JPbmUrIjpleHRlbmQoIiArICRzZWxlY3RvclR3bysiKSIpOwoJCQl9CgoJCQkvLyBub3cgcHJvY2VzcyB0aGUgbmV3IGV4dGVuZHMgb24gdGhlIGV4aXN0aW5nIHJ1bGVzIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBhIGV4dGVuZGluZyBiIGV4dGVuZGluZyBjIGVjdGVuZGluZyBkIGV4dGVuZGluZyBlLi4uCgkJCSRleHRlbmRzVG9BZGQgPSAkdGhpcy0+ZG9FeHRlbmRDaGFpbmluZyggJGV4dGVuZHNUb0FkZCwgJGV4dGVuZHNMaXN0VGFyZ2V0LCAkaXRlcmF0aW9uQ291bnQrMSk7CgkJfQoKCQlyZXR1cm4gYXJyYXlfbWVyZ2UoJGV4dGVuZHNMaXN0LCAkZXh0ZW5kc1RvQWRkKTsKCX0KCgoJcHJvdGVjdGVkIGZ1bmN0aW9uIHZpc2l0UnVsZSggJHJ1bGVOb2RlLCAmJHZpc2l0RGVlcGVyICl7CgkJJHZpc2l0RGVlcGVyID0gZmFsc2U7Cgl9CgoJcHJvdGVjdGVkIGZ1bmN0aW9uIHZpc2l0TWl4aW5EZWZpbml0aW9uKCAkbWl4aW5EZWZpbml0aW9uTm9kZSwgJiR2aXNpdERlZXBlciApewoJCSR2aXNpdERlZXBlciA9IGZhbHNlOwoJfQoKCXByb3RlY3RlZCBmdW5jdGlvbiB2aXNpdFNlbGVjdG9yKCAkc2VsZWN0b3JOb2RlLCAmJHZpc2l0RGVlcGVyICl7CgkJJHZpc2l0RGVlcGVyID0gZmFsc2U7Cgl9CgoJcHJvdGVjdGVkIGZ1bmN0aW9uIHZpc2l0UnVsZXNldCgkcnVsZXNldE5vZGUpewoKCgkJaWYoICRydWxlc2V0Tm9kZS0+cm9vdCApewoJCQlyZXR1cm47CgkJfQoKCQkkYWxsRXh0ZW5kcwk9IGVuZCgkdGhpcy0+YWxsRXh0ZW5kc1N0YWNrKTsKCQkkcGF0aHNfbGVuID0gY291bnQoJHJ1bGVzZXROb2RlLT5wYXRocyk7CgoJCS8vIGxvb2sgYXQgZWFjaCBzZWxlY3RvciBwYXRoIGluIHRoZSBydWxlc2V0LCBmaW5kIGFueSBleHRlbmQgbWF0Y2hlcyBhbmQgdGhlbiBjb3B5LCBmaW5kIGFuZCByZXBsYWNlCgkJZm9yZWFjaCgkYWxsRXh0ZW5kcyBhcyAkYWxsRXh0ZW5kKXsKCQkJZm9yKCRwYXRoSW5kZXggPSAwOyAkcGF0aEluZGV4IDwgJHBhdGhzX2xlbjsgJHBhdGhJbmRleCsrICl7CgoJCQkJLy8gZXh0ZW5kaW5nIGV4dGVuZHMgaGFwcGVucyBpbml0aWFsbHksIGJlZm9yZSB0aGUgbWFpbiBwYXNzCgkJCQlpZiggaXNzZXQoJHJ1bGVzZXROb2RlLT5leHRlbmRPbkV2ZXJ5UGF0aCkgJiYgJHJ1bGVzZXROb2RlLT5leHRlbmRPbkV2ZXJ5UGF0aCApewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoKCQkJCSRzZWxlY3RvclBhdGggPSAkcnVsZXNldE5vZGUtPnBhdGhzWyRwYXRoSW5kZXhdOwoKCQkJCWlmKCBlbmQoJHNlbGVjdG9yUGF0aCktPmV4dGVuZExpc3QgKXsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkkdGhpcy0+RXh0ZW5kTWF0Y2goICRydWxlc2V0Tm9kZSwgJGFsbEV4dGVuZCwgJHNlbGVjdG9yUGF0aCk7CgoJCQl9CgkJfQoJfQoKCglwcml2YXRlIGZ1bmN0aW9uIEV4dGVuZE1hdGNoKCAkcnVsZXNldE5vZGUsICRleHRlbmQsICRzZWxlY3RvclBhdGggKXsKCQkkbWF0Y2hlcyA9ICR0aGlzLT5maW5kTWF0Y2goJGV4dGVuZCwgJHNlbGVjdG9yUGF0aCk7CgoJCWlmKCAkbWF0Y2hlcyApewoJCQlmb3JlYWNoKCRleHRlbmQtPnNlbGZTZWxlY3RvcnMgYXMgJHNlbGZTZWxlY3RvciApewoJCQkJJHJ1bGVzZXROb2RlLT5wYXRoc1tdID0gJHRoaXMtPmV4dGVuZFNlbGVjdG9yKCRtYXRjaGVzLCAkc2VsZWN0b3JQYXRoLCAkc2VsZlNlbGVjdG9yKTsKCQkJfQoJCX0KCX0KCgoKCXByaXZhdGUgZnVuY3Rpb24gZmluZE1hdGNoKCRleHRlbmQsICRoYXlzdGFja1NlbGVjdG9yUGF0aCApewoKCgkJaWYoICEkdGhpcy0+SGFzTWF0Y2hlcygkZXh0ZW5kLCAkaGF5c3RhY2tTZWxlY3RvclBhdGgpICl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoKCQkvLwoJCS8vIGxvb2sgdGhyb3VnaCB0aGUgaGF5c3RhY2sgc2VsZWN0b3IgcGF0aCB0byB0cnkgYW5kIGZpbmQgdGhlIG5lZWRsZSAtIGV4dGVuZC5zZWxlY3RvcgoJCS8vIHJldHVybnMgYW4gYXJyYXkgb2Ygc2VsZWN0b3IgbWF0Y2hlcyB0aGF0IGNhbiB0aGVuIGJlIHJlcGxhY2VkCgkJLy8KCQkkbmVlZGxlRWxlbWVudHMgPSAkZXh0ZW5kLT5zZWxlY3Rvci0+ZWxlbWVudHM7CgkJJHBvdGVudGlhbE1hdGNoZXMgPSBhcnJheSgpOwoJCSRwb3RlbnRpYWxNYXRjaGVzX2xlbiA9IDA7CgkJJHBvdGVudGlhbE1hdGNoID0gbnVsbDsKCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgoKCgkJLy8gbG9vcCB0aHJvdWdoIHRoZSBoYXlzdGFjayBlbGVtZW50cwoJCSRoYXlzdGFja19wYXRoX2xlbiA9IGNvdW50KCRoYXlzdGFja1NlbGVjdG9yUGF0aCk7CgkJZm9yKCRoYXlzdGFja1NlbGVjdG9ySW5kZXggPSAwOyAkaGF5c3RhY2tTZWxlY3RvckluZGV4IDwgJGhheXN0YWNrX3BhdGhfbGVuOyAkaGF5c3RhY2tTZWxlY3RvckluZGV4KysgKXsKCQkJJGhhY2tzdGFja1NlbGVjdG9yID0gJGhheXN0YWNrU2VsZWN0b3JQYXRoWyRoYXlzdGFja1NlbGVjdG9ySW5kZXhdOwoKCQkJJGhheXN0YWNrX2VsZW1lbnRzX2xlbiA9IGNvdW50KCRoYWNrc3RhY2tTZWxlY3Rvci0+ZWxlbWVudHMpOwoJCQlmb3IoJGhhY2tzdGFja0VsZW1lbnRJbmRleCA9IDA7ICRoYWNrc3RhY2tFbGVtZW50SW5kZXggPCAkaGF5c3RhY2tfZWxlbWVudHNfbGVuOyAkaGFja3N0YWNrRWxlbWVudEluZGV4KysgKXsKCgkJCQkkaGF5c3RhY2tFbGVtZW50ID0gJGhhY2tzdGFja1NlbGVjdG9yLT5lbGVtZW50c1skaGFja3N0YWNrRWxlbWVudEluZGV4XTsKCgkJCQkvLyBpZiB3ZSBhbGxvdyBlbGVtZW50cyBiZWZvcmUgb3VyIG1hdGNoIHdlIGNhbiBhZGQgYSBwb3RlbnRpYWwgbWF0Y2ggZXZlcnkgdGltZS4gb3RoZXJ3aXNlIG9ubHkgYXQgdGhlIGZpcnN0IGVsZW1lbnQuCgkJCQlpZiggJGV4dGVuZC0+YWxsb3dCZWZvcmUgfHwgKCRoYXlzdGFja1NlbGVjdG9ySW5kZXggPT09IDAgJiYgJGhhY2tzdGFja0VsZW1lbnRJbmRleCA9PT0gMCkgKXsKCQkJCQkkcG90ZW50aWFsTWF0Y2hlc1tdID0gYXJyYXkoJ3BhdGhJbmRleCc9PiAkaGF5c3RhY2tTZWxlY3RvckluZGV4LCAnaW5kZXgnPT4gJGhhY2tzdGFja0VsZW1lbnRJbmRleCwgJ21hdGNoZWQnPT4gMCwgJ2luaXRpYWxDb21iaW5hdG9yJz0+ICRoYXlzdGFja0VsZW1lbnQtPmNvbWJpbmF0b3IpOwoJCQkJCSRwb3RlbnRpYWxNYXRjaGVzX2xlbisrOwoJCQkJfQoKCQkJCWZvcigkaSA9IDA7ICRpIDwgJHBvdGVudGlhbE1hdGNoZXNfbGVuOyAkaSsrICl7CgoJCQkJCSRwb3RlbnRpYWxNYXRjaCA9ICYkcG90ZW50aWFsTWF0Y2hlc1skaV07CgkJCQkJJHBvdGVudGlhbE1hdGNoID0gJHRoaXMtPlBvdGVudGlhbE1hdGNoKCAkcG90ZW50aWFsTWF0Y2gsICRuZWVkbGVFbGVtZW50cywgJGhheXN0YWNrRWxlbWVudCwgJGhhY2tzdGFja0VsZW1lbnRJbmRleCApOwoKCgkJCQkJLy8gaWYgd2UgYXJlIHN0aWxsIHZhbGlkIGFuZCBoYXZlIGZpbmlzaGVkLCB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBlbGVtZW50cyBhZnRlciBhbmQgd2hldGhlciB0aGVzZSBhcmUgYWxsb3dlZAoJCQkJCWlmKCAkcG90ZW50aWFsTWF0Y2ggJiYgJHBvdGVudGlhbE1hdGNoWydtYXRjaGVkJ10gPT09ICRleHRlbmQtPnNlbGVjdG9yLT5lbGVtZW50c19sZW4gKXsKCQkJCQkJJHBvdGVudGlhbE1hdGNoWydmaW5pc2hlZCddID0gdHJ1ZTsKCgkJCQkJCWlmKCAhJGV4dGVuZC0+YWxsb3dBZnRlciAmJiAoJGhhY2tzdGFja0VsZW1lbnRJbmRleCsxIDwgJGhheXN0YWNrX2VsZW1lbnRzX2xlbiB8fCAkaGF5c3RhY2tTZWxlY3RvckluZGV4KzEgPCAkaGF5c3RhY2tfcGF0aF9sZW4pICl7CgkJCQkJCQkkcG90ZW50aWFsTWF0Y2ggPSBudWxsOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBpZiBudWxsIHdlIHJlbW92ZSwgaWYgbm90LCB3ZSBhcmUgc3RpbGwgdmFsaWQsIHNvIGVpdGhlciBwdXNoIGFzIGEgdmFsaWQgbWF0Y2ggb3IgY29udGludWUKCQkJCQlpZiggJHBvdGVudGlhbE1hdGNoICl7CgkJCQkJCWlmKCAkcG90ZW50aWFsTWF0Y2hbJ2ZpbmlzaGVkJ10gKXsKCQkJCQkJCSRwb3RlbnRpYWxNYXRjaFsnbGVuZ3RoJ10gPSAkZXh0ZW5kLT5zZWxlY3Rvci0+ZWxlbWVudHNfbGVuOwoJCQkJCQkJJHBvdGVudGlhbE1hdGNoWydlbmRQYXRoSW5kZXgnXSA9ICRoYXlzdGFja1NlbGVjdG9ySW5kZXg7CgkJCQkJCQkkcG90ZW50aWFsTWF0Y2hbJ2VuZFBhdGhFbGVtZW50SW5kZXgnXSA9ICRoYWNrc3RhY2tFbGVtZW50SW5kZXggKyAxOyAvLyBpbmRleCBhZnRlciBlbmQgb2YgbWF0Y2gKCQkJCQkJCSRwb3RlbnRpYWxNYXRjaGVzID0gYXJyYXkoKTsgLy8gd2UgZG9uJ3QgYWxsb3cgbWF0Y2hlcyB0byBvdmVybGFwLCBzbyBzdGFydCBtYXRjaGluZyBhZ2FpbgoJCQkJCQkJJHBvdGVudGlhbE1hdGNoZXNfbGVuID0gMDsKCQkJCQkJCSRtYXRjaGVzW10gPSAkcG90ZW50aWFsTWF0Y2g7CgkJCQkJCX0KCQkJCQkJY29udGludWU7CgkJCQkJfQoKCQkJCQlhcnJheV9zcGxpY2UoJHBvdGVudGlhbE1hdGNoZXMsICRpLCAxKTsKCQkJCQkkcG90ZW50aWFsTWF0Y2hlc19sZW4tLTsKCQkJCQkkaS0tOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gJG1hdGNoZXM7Cgl9CgoKCS8vIEJlZm9yZSBnb2luZyB0aHJvdWdoIGFsbCB0aGUgbmVzdGVkIGxvb3BzLCBsZXRzIGNoZWNrIHRvIHNlZSBpZiBhIG1hdGNoIGlzIHBvc3NpYmxlCgkvLyBSZWR1Y2VzIEJvb3RzdHJhcCAzLjEgY29tcGlsZSB0aW1lIGZyb20gfjYuNXMgdG8gfjUuNnMKCXByaXZhdGUgZnVuY3Rpb24gSGFzTWF0Y2hlcygkZXh0ZW5kLCAkaGF5c3RhY2tTZWxlY3RvclBhdGgpewoKCQlpZiggISRleHRlbmQtPnNlbGVjdG9yLT5jYWNoZWFibGUgKXsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkkZmlyc3RfZWwgPSAkZXh0ZW5kLT5zZWxlY3Rvci0+X29lbGVtZW50c1swXTsKCgkJZm9yZWFjaCgkaGF5c3RhY2tTZWxlY3RvclBhdGggYXMgJGhhY2tzdGFja1NlbGVjdG9yKXsKCQkJaWYoICEkaGFja3N0YWNrU2VsZWN0b3ItPmNhY2hlYWJsZSApewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCgkJCWlmKCBpbl9hcnJheSgkZmlyc3RfZWwsICRoYWNrc3RhY2tTZWxlY3Rvci0+X29lbGVtZW50cykgKXsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9CgoKCS8qKgoJICogQHBhcmFtIGludGVnZXIgJGhhY2tzdGFja0VsZW1lbnRJbmRleAoJICovCglwcml2YXRlIGZ1bmN0aW9uIFBvdGVudGlhbE1hdGNoKCAkcG90ZW50aWFsTWF0Y2gsICRuZWVkbGVFbGVtZW50cywgJGhheXN0YWNrRWxlbWVudCwgJGhhY2tzdGFja0VsZW1lbnRJbmRleCApewoKCgkJaWYoICRwb3RlbnRpYWxNYXRjaFsnbWF0Y2hlZCddID4gMCApewoKCQkJLy8gc2VsZWN0b3JzIGFkZCAiICIgb250byB0aGUgZmlyc3QgZWxlbWVudC4gV2hlbiB3ZSB1c2UgJiBpdCBqb2lucyB0aGUgc2VsZWN0b3JzIHRvZ2V0aGVyLCBidXQgaWYgd2UgZG9uJ3QKCQkJLy8gdGhlbiBlYWNoIHNlbGVjdG9yIGluIGhheXN0YWNrU2VsZWN0b3JQYXRoIGhhcyBhIHNwYWNlIGJlZm9yZSBpdCBhZGRlZCBpbiB0aGUgdG9DU1MgcGhhc2UuIHNvIHdlIG5lZWQgdG8gd29yayBvdXQKCQkJLy8gd2hhdCB0aGUgcmVzdWx0aW5nIGNvbWJpbmF0b3Igd2lsbCBiZQoJCQkkdGFyZ2V0Q29tYmluYXRvciA9ICRoYXlzdGFja0VsZW1lbnQtPmNvbWJpbmF0b3I7CgkJCWlmKCAkdGFyZ2V0Q29tYmluYXRvciA9PT0gJycgJiYgJGhhY2tzdGFja0VsZW1lbnRJbmRleCA9PT0gMCApewoJCQkJJHRhcmdldENvbWJpbmF0b3IgPSAnICc7CgkJCX0KCgkJCWlmKCAkbmVlZGxlRWxlbWVudHNbICRwb3RlbnRpYWxNYXRjaFsnbWF0Y2hlZCddIF0tPmNvbWJpbmF0b3IgIT09ICR0YXJnZXRDb21iaW5hdG9yICl7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoJCX0KCgkJLy8gaWYgd2UgZG9uJ3QgbWF0Y2gsIG51bGwgb3VyIG1hdGNoIHRvIGluZGljYXRlIGZhaWx1cmUKCQlpZiggISR0aGlzLT5pc0VsZW1lbnRWYWx1ZXNFcXVhbCggJG5lZWRsZUVsZW1lbnRzWyRwb3RlbnRpYWxNYXRjaFsnbWF0Y2hlZCddIF0tPnZhbHVlLCAkaGF5c3RhY2tFbGVtZW50LT52YWx1ZSkgKXsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQkkcG90ZW50aWFsTWF0Y2hbJ2ZpbmlzaGVkJ10gPSBmYWxzZTsKCQkkcG90ZW50aWFsTWF0Y2hbJ21hdGNoZWQnXSsrOwoKCQlyZXR1cm4gJHBvdGVudGlhbE1hdGNoOwoJfQoKCglwcml2YXRlIGZ1bmN0aW9uIGlzRWxlbWVudFZhbHVlc0VxdWFsKCAkZWxlbWVudFZhbHVlMSwgJGVsZW1lbnRWYWx1ZTIgKXsKCgkJaWYoICRlbGVtZW50VmFsdWUxID09PSAkZWxlbWVudFZhbHVlMiApewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCWlmKCBpc19zdHJpbmcoJGVsZW1lbnRWYWx1ZTEpIHx8IGlzX3N0cmluZygkZWxlbWVudFZhbHVlMikgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmKCAkZWxlbWVudFZhbHVlMSBpbnN0YW5jZW9mIExlc3NfVHJlZV9BdHRyaWJ1dGUgKXsKCQkJcmV0dXJuICR0aGlzLT5pc0F0dHJpYnV0ZVZhbHVlc0VxdWFsKCAkZWxlbWVudFZhbHVlMSwgJGVsZW1lbnRWYWx1ZTIgKTsKCQl9CgoJCSRlbGVtZW50VmFsdWUxID0gJGVsZW1lbnRWYWx1ZTEtPnZhbHVlOwoJCWlmKCAkZWxlbWVudFZhbHVlMSBpbnN0YW5jZW9mIExlc3NfVHJlZV9TZWxlY3RvciApewoJCQlyZXR1cm4gJHRoaXMtPmlzU2VsZWN0b3JWYWx1ZXNFcXVhbCggJGVsZW1lbnRWYWx1ZTEsICRlbGVtZW50VmFsdWUyICk7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9CgoKCS8qKgoJICogQHBhcmFtIExlc3NfVHJlZV9TZWxlY3RvciAkZWxlbWVudFZhbHVlMQoJICovCglwcml2YXRlIGZ1bmN0aW9uIGlzU2VsZWN0b3JWYWx1ZXNFcXVhbCggJGVsZW1lbnRWYWx1ZTEsICRlbGVtZW50VmFsdWUyICl7CgoJCSRlbGVtZW50VmFsdWUyID0gJGVsZW1lbnRWYWx1ZTItPnZhbHVlOwoJCWlmKCAhKCRlbGVtZW50VmFsdWUyIGluc3RhbmNlb2YgTGVzc19UcmVlX1NlbGVjdG9yKSB8fCAkZWxlbWVudFZhbHVlMS0+ZWxlbWVudHNfbGVuICE9PSAkZWxlbWVudFZhbHVlMi0+ZWxlbWVudHNfbGVuICl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWZvciggJGkgPSAwOyAkaSA8ICRlbGVtZW50VmFsdWUxLT5lbGVtZW50c19sZW47ICRpKysgKXsKCgkJCWlmKCAkZWxlbWVudFZhbHVlMS0+ZWxlbWVudHNbJGldLT5jb21iaW5hdG9yICE9PSAkZWxlbWVudFZhbHVlMi0+ZWxlbWVudHNbJGldLT5jb21iaW5hdG9yICl7CgkJCQlpZiggJGkgIT09IDAgfHwgKCRlbGVtZW50VmFsdWUxLT5lbGVtZW50c1skaV0tPmNvbWJpbmF0b3IgfHwgJyAnKSAhPT0gKCRlbGVtZW50VmFsdWUyLT5lbGVtZW50c1skaV0tPmNvbWJpbmF0b3IgfHwgJyAnKSApewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoKCQkJaWYoICEkdGhpcy0+aXNFbGVtZW50VmFsdWVzRXF1YWwoJGVsZW1lbnRWYWx1ZTEtPmVsZW1lbnRzWyRpXS0+dmFsdWUsICRlbGVtZW50VmFsdWUyLT5lbGVtZW50c1skaV0tPnZhbHVlKSApewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KCgoJLyoqCgkgKiBAcGFyYW0gTGVzc19UcmVlX0F0dHJpYnV0ZSAkZWxlbWVudFZhbHVlMQoJICovCglwcml2YXRlIGZ1bmN0aW9uIGlzQXR0cmlidXRlVmFsdWVzRXF1YWwoICRlbGVtZW50VmFsdWUxLCAkZWxlbWVudFZhbHVlMiApewoKCQlpZiggJGVsZW1lbnRWYWx1ZTEtPm9wICE9PSAkZWxlbWVudFZhbHVlMi0+b3AgfHwgJGVsZW1lbnRWYWx1ZTEtPmtleSAhPT0gJGVsZW1lbnRWYWx1ZTItPmtleSApewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiggISRlbGVtZW50VmFsdWUxLT52YWx1ZSB8fCAhJGVsZW1lbnRWYWx1ZTItPnZhbHVlICl7CgkJCWlmKCAkZWxlbWVudFZhbHVlMS0+dmFsdWUgfHwgJGVsZW1lbnRWYWx1ZTItPnZhbHVlICkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJJGVsZW1lbnRWYWx1ZTEgPSAoJGVsZW1lbnRWYWx1ZTEtPnZhbHVlLT52YWx1ZSA/ICRlbGVtZW50VmFsdWUxLT52YWx1ZS0+dmFsdWUgOiAkZWxlbWVudFZhbHVlMS0+dmFsdWUgKTsKCQkkZWxlbWVudFZhbHVlMiA9ICgkZWxlbWVudFZhbHVlMi0+dmFsdWUtPnZhbHVlID8gJGVsZW1lbnRWYWx1ZTItPnZhbHVlLT52YWx1ZSA6ICRlbGVtZW50VmFsdWUyLT52YWx1ZSApOwoKCQlyZXR1cm4gJGVsZW1lbnRWYWx1ZTEgPT09ICRlbGVtZW50VmFsdWUyOwoJfQoKCglwcml2YXRlIGZ1bmN0aW9uIGV4dGVuZFNlbGVjdG9yKCRtYXRjaGVzLCAkc2VsZWN0b3JQYXRoLCAkcmVwbGFjZW1lbnRTZWxlY3Rvcil7CgoJCS8vZm9yIGEgc2V0IG9mIG1hdGNoZXMsIHJlcGxhY2UgZWFjaCBtYXRjaCB3aXRoIHRoZSByZXBsYWNlbWVudCBzZWxlY3RvcgoKCQkkY3VycmVudFNlbGVjdG9yUGF0aEluZGV4ID0gMDsKCQkkY3VycmVudFNlbGVjdG9yUGF0aEVsZW1lbnRJbmRleCA9IDA7CgkJJHBhdGggPSBhcnJheSgpOwoJCSRzZWxlY3RvclBhdGhfbGVuID0gY291bnQoJHNlbGVjdG9yUGF0aCk7CgoJCWZvcigkbWF0Y2hJbmRleCA9IDAsICRtYXRjaGVzX2xlbiA9IGNvdW50KCRtYXRjaGVzKTsgJG1hdGNoSW5kZXggPCAkbWF0Y2hlc19sZW47ICRtYXRjaEluZGV4KysgKXsKCgoJCQkkbWF0Y2ggPSAkbWF0Y2hlc1skbWF0Y2hJbmRleF07CgkJCSRzZWxlY3RvciA9ICRzZWxlY3RvclBhdGhbICRtYXRjaFsncGF0aEluZGV4J10gXTsKCgkJCSRmaXJzdEVsZW1lbnQgPSBuZXcgTGVzc19UcmVlX0VsZW1lbnQoCgkJCQkkbWF0Y2hbJ2luaXRpYWxDb21iaW5hdG9yJ10sCgkJCQkkcmVwbGFjZW1lbnRTZWxlY3Rvci0+ZWxlbWVudHNbMF0tPnZhbHVlLAoJCQkJJHJlcGxhY2VtZW50U2VsZWN0b3ItPmVsZW1lbnRzWzBdLT5pbmRleCwKCQkJCSRyZXBsYWNlbWVudFNlbGVjdG9yLT5lbGVtZW50c1swXS0+Y3VycmVudEZpbGVJbmZvCgkJCSk7CgoJCQlpZiggJG1hdGNoWydwYXRoSW5kZXgnXSA+ICRjdXJyZW50U2VsZWN0b3JQYXRoSW5kZXggJiYgJGN1cnJlbnRTZWxlY3RvclBhdGhFbGVtZW50SW5kZXggPiAwICl7CgkJCQkkbGFzdF9wYXRoID0gZW5kKCRwYXRoKTsKCQkJCSRsYXN0X3BhdGgtPmVsZW1lbnRzID0gYXJyYXlfbWVyZ2UoICRsYXN0X3BhdGgtPmVsZW1lbnRzLCBhcnJheV9zbGljZSggJHNlbGVjdG9yUGF0aFskY3VycmVudFNlbGVjdG9yUGF0aEluZGV4XS0+ZWxlbWVudHMsICRjdXJyZW50U2VsZWN0b3JQYXRoRWxlbWVudEluZGV4KSk7CgkJCQkkY3VycmVudFNlbGVjdG9yUGF0aEVsZW1lbnRJbmRleCA9IDA7CgkJCQkkY3VycmVudFNlbGVjdG9yUGF0aEluZGV4Kys7CgkJCX0KCgkJCSRuZXdFbGVtZW50cyA9IGFycmF5X21lcmdlKAoJCQkJYXJyYXlfc2xpY2UoJHNlbGVjdG9yLT5lbGVtZW50cywgJGN1cnJlbnRTZWxlY3RvclBhdGhFbGVtZW50SW5kZXgsICgkbWF0Y2hbJ2luZGV4J10gLSAkY3VycmVudFNlbGVjdG9yUGF0aEVsZW1lbnRJbmRleCkgKSAvLyBsYXN0IHBhcmFtZXRlciBvZiBhcnJheV9zbGljZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgbGFzdCBwYXJhbWV0ZXIgb2YgamF2YXNjcmlwdCdzIHNsaWNlCgkJCQksIGFycmF5KCRmaXJzdEVsZW1lbnQpCgkJCQksIGFycmF5X3NsaWNlKCRyZXBsYWNlbWVudFNlbGVjdG9yLT5lbGVtZW50cywxKQoJCQkJKTsKCgkJCWlmKCAkY3VycmVudFNlbGVjdG9yUGF0aEluZGV4ID09PSAkbWF0Y2hbJ3BhdGhJbmRleCddICYmICRtYXRjaEluZGV4ID4gMCApewoJCQkJJGxhc3Rfa2V5ID0gY291bnQoJHBhdGgpLTE7CgkJCQkkcGF0aFskbGFzdF9rZXldLT5lbGVtZW50cyA9IGFycmF5X21lcmdlKCRwYXRoWyRsYXN0X2tleV0tPmVsZW1lbnRzLCRuZXdFbGVtZW50cyk7CgkJCX1lbHNlewoJCQkJJHBhdGggPSBhcnJheV9tZXJnZSggJHBhdGgsIGFycmF5X3NsaWNlKCAkc2VsZWN0b3JQYXRoLCAkY3VycmVudFNlbGVjdG9yUGF0aEluZGV4LCAkbWF0Y2hbJ3BhdGhJbmRleCddICkpOwoJCQkJJHBhdGhbXSA9IG5ldyBMZXNzX1RyZWVfU2VsZWN0b3IoICRuZXdFbGVtZW50cyApOwoJCQl9CgoJCQkkY3VycmVudFNlbGVjdG9yUGF0aEluZGV4ID0gJG1hdGNoWydlbmRQYXRoSW5kZXgnXTsKCQkJJGN1cnJlbnRTZWxlY3RvclBhdGhFbGVtZW50SW5kZXggPSAkbWF0Y2hbJ2VuZFBhdGhFbGVtZW50SW5kZXgnXTsKCQkJaWYoICRjdXJyZW50U2VsZWN0b3JQYXRoRWxlbWVudEluZGV4ID49IGNvdW50KCRzZWxlY3RvclBhdGhbJGN1cnJlbnRTZWxlY3RvclBhdGhJbmRleF0tPmVsZW1lbnRzKSApewoJCQkJJGN1cnJlbnRTZWxlY3RvclBhdGhFbGVtZW50SW5kZXggPSAwOwoJCQkJJGN1cnJlbnRTZWxlY3RvclBhdGhJbmRleCsrOwoJCQl9CgkJfQoKCQlpZiggJGN1cnJlbnRTZWxlY3RvclBhdGhJbmRleCA8ICRzZWxlY3RvclBhdGhfbGVuICYmICRjdXJyZW50U2VsZWN0b3JQYXRoRWxlbWVudEluZGV4ID4gMCApewoJCQkkbGFzdF9wYXRoID0gZW5kKCRwYXRoKTsKCQkJJGxhc3RfcGF0aC0+ZWxlbWVudHMgPSBhcnJheV9tZXJnZSggJGxhc3RfcGF0aC0+ZWxlbWVudHMsIGFycmF5X3NsaWNlKCRzZWxlY3RvclBhdGhbJGN1cnJlbnRTZWxlY3RvclBhdGhJbmRleF0tPmVsZW1lbnRzLCAkY3VycmVudFNlbGVjdG9yUGF0aEVsZW1lbnRJbmRleCkpOwoJCQkkY3VycmVudFNlbGVjdG9yUGF0aEluZGV4Kys7CgkJfQoKCQkkc2xpY2VfbGVuID0gJHNlbGVjdG9yUGF0aF9sZW4gLSAkY3VycmVudFNlbGVjdG9yUGF0aEluZGV4OwoJCSRwYXRoID0gYXJyYXlfbWVyZ2UoJHBhdGgsIGFycmF5X3NsaWNlKCRzZWxlY3RvclBhdGgsICRjdXJyZW50U2VsZWN0b3JQYXRoSW5kZXgsICRzbGljZV9sZW4pKTsKCgkJcmV0dXJuICRwYXRoOwoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gdmlzaXRNZWRpYSggJG1lZGlhTm9kZSApewoJCSRuZXdBbGxFeHRlbmRzID0gYXJyYXlfbWVyZ2UoICRtZWRpYU5vZGUtPmFsbEV4dGVuZHMsIGVuZCgkdGhpcy0+YWxsRXh0ZW5kc1N0YWNrKSApOwoJCSR0aGlzLT5hbGxFeHRlbmRzU3RhY2tbXSA9ICR0aGlzLT5kb0V4dGVuZENoYWluaW5nKCRuZXdBbGxFeHRlbmRzLCAkbWVkaWFOb2RlLT5hbGxFeHRlbmRzKTsKCX0KCglwcm90ZWN0ZWQgZnVuY3Rpb24gdmlzaXRNZWRpYU91dCgpewoJCWFycmF5X3BvcCggJHRoaXMtPmFsbEV4dGVuZHNTdGFjayApOwoJfQoKCXByb3RlY3RlZCBmdW5jdGlvbiB2aXNpdERpcmVjdGl2ZSggJGRpcmVjdGl2ZU5vZGUgKXsKCQkkbmV3QWxsRXh0ZW5kcyA9IGFycmF5X21lcmdlKCAkZGlyZWN0aXZlTm9kZS0+YWxsRXh0ZW5kcywgZW5kKCR0aGlzLT5hbGxFeHRlbmRzU3RhY2spICk7CgkJJHRoaXMtPmFsbEV4dGVuZHNTdGFja1tdID0gJHRoaXMtPmRvRXh0ZW5kQ2hhaW5pbmcoJG5ld0FsbEV4dGVuZHMsICRkaXJlY3RpdmVOb2RlLT5hbGxFeHRlbmRzKTsKCX0KCglwcm90ZWN0ZWQgZnVuY3Rpb24gdmlzaXREaXJlY3RpdmVPdXQoKXsKCQlhcnJheV9wb3AoJHRoaXMtPmFsbEV4dGVuZHNTdGFjayk7Cgl9Cgp9IAoKLyoqCiAqIHRvQ1NTIFZpc2l0b3IKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB2aXNpdG9yCiAqLwpjbGFzcyBMZXNzX1Zpc2l0b3JfdG9DU1MgZXh0ZW5kcyBMZXNzX1Zpc2l0b3JSZXBsYWNpbmd7CgoJcHJpdmF0ZSAkY2hhcnNldDsKCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCk7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gTGVzc19UcmVlX1J1bGVzZXQgJHJvb3QKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJ1biggJHJvb3QgKXsKCQlyZXR1cm4gJHRoaXMtPnZpc2l0T2JqKCRyb290KTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdmlzaXRSdWxlKCAkcnVsZU5vZGUgKXsKCQlpZiggJHJ1bGVOb2RlLT52YXJpYWJsZSApewoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9CgkJcmV0dXJuICRydWxlTm9kZTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdmlzaXRNaXhpbkRlZmluaXRpb24oJG1peGluTm9kZSl7CgkJLy8gbWl4aW4gZGVmaW5pdGlvbnMgZG8gbm90IGdldCBldmFsJ2QgLSB0aGlzIG1lYW5zIHRoZXkga2VlcCBzdGF0ZQoJCS8vIHNvIHdlIGhhdmUgdG8gY2xlYXIgdGhhdCBzdGF0ZSBoZXJlIHNvIGl0IGlzbid0IHVzZWQgaWYgdG9DU1MgaXMgY2FsbGVkIHR3aWNlCgkJJG1peGluTm9kZS0+ZnJhbWVzID0gYXJyYXkoKTsKCQlyZXR1cm4gYXJyYXkoKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdmlzaXRFeHRlbmQoKXsKCQlyZXR1cm4gYXJyYXkoKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdmlzaXRDb21tZW50KCAkY29tbWVudE5vZGUgKXsKCQlpZiggJGNvbW1lbnROb2RlLT5pc1NpbGVudCgpICl7CgkJCXJldHVybiBhcnJheSgpOwoJCX0KCQlyZXR1cm4gJGNvbW1lbnROb2RlOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiB2aXNpdE1lZGlhKCAkbWVkaWFOb2RlLCAmJHZpc2l0RGVlcGVyICl7CgkJJG1lZGlhTm9kZS0+YWNjZXB0KCR0aGlzKTsKCQkkdmlzaXREZWVwZXIgPSBmYWxzZTsKCgkJaWYoICEkbWVkaWFOb2RlLT5ydWxlcyApewoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9CgkJcmV0dXJuICRtZWRpYU5vZGU7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHZpc2l0RGlyZWN0aXZlKCAkZGlyZWN0aXZlTm9kZSApewoJCWlmKCBpc3NldCgkZGlyZWN0aXZlTm9kZS0+Y3VycmVudEZpbGVJbmZvWydyZWZlcmVuY2UnXSkgJiYgKCFwcm9wZXJ0eV9leGlzdHMoJGRpcmVjdGl2ZU5vZGUsJ2lzUmVmZXJlbmNlZCcpIHx8ICEkZGlyZWN0aXZlTm9kZS0+aXNSZWZlcmVuY2VkKSApewoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9CgkJaWYoICRkaXJlY3RpdmVOb2RlLT5uYW1lID09PSAnQGNoYXJzZXQnICl7CgkJCS8vIE9ubHkgb3V0cHV0IHRoZSBkZWJ1ZyBpbmZvIHRvZ2V0aGVyIHdpdGggc3Vic2VxdWVudCBAY2hhcnNldCBkZWZpbml0aW9ucwoJCQkvLyBhIGNvbW1lbnQgKG9yIEBtZWRpYSBzdGF0ZW1lbnQpIGJlZm9yZSB0aGUgYWN0dWFsIEBjaGFyc2V0IGRpcmVjdGl2ZSB3b3VsZAoJCQkvLyBiZSBjb25zaWRlcmVkIGlsbGVnYWwgY3NzIGFzIGl0IGhhcyB0byBiZSBvbiB0aGUgZmlyc3QgbGluZQoJCQlpZiggaXNzZXQoJHRoaXMtPmNoYXJzZXQpICYmICR0aGlzLT5jaGFyc2V0ICl7CgoJCQkJLy9pZiggJGRpcmVjdGl2ZU5vZGUtPmRlYnVnSW5mbyApewoJCQkJLy8JJGNvbW1lbnQgPSBuZXcgTGVzc19UcmVlX0NvbW1lbnQoJy8qICcgLiBzdHJfcmVwbGFjZSgiXG4iLCcnLCRkaXJlY3RpdmVOb2RlLT50b0NTUygpKS4iICovXG4iKTsKCQkJCS8vCSRjb21tZW50LT5kZWJ1Z0luZm8gPSAkZGlyZWN0aXZlTm9kZS0+ZGVidWdJbmZvOwoJCQkJLy8JcmV0dXJuICR0aGlzLT52aXNpdCgkY29tbWVudCk7CgkJCQkvL30KCgoJCQkJcmV0dXJuIGFycmF5KCk7CgkJCX0KCQkJJHRoaXMtPmNoYXJzZXQgPSB0cnVlOwoJCX0KCQlyZXR1cm4gJGRpcmVjdGl2ZU5vZGU7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGNoZWNrUHJvcGVydGllc0luUm9vdCggJHJ1bGVzZXROb2RlICl7CgoJCWlmKCAhJHJ1bGVzZXROb2RlLT5maXJzdFJvb3QgKXsKCQkJcmV0dXJuOwoJCX0KCgkJZm9yZWFjaCgkcnVsZXNldE5vZGUtPnJ1bGVzIGFzICRydWxlTm9kZSl7CgkJCWlmKCAkcnVsZU5vZGUgaW5zdGFuY2VvZiBMZXNzX1RyZWVfUnVsZSAmJiAhJHJ1bGVOb2RlLT52YXJpYWJsZSApewoJCQkJJG1zZyA9ICJwcm9wZXJ0aWVzIG11c3QgYmUgaW5zaWRlIHNlbGVjdG9yIGJsb2NrcywgdGhleSBjYW5ub3QgYmUgaW4gdGhlIHJvb3QuIEluZGV4ICIuJHJ1bGVOb2RlLT5pbmRleC4oJHJ1bGVOb2RlLT5jdXJyZW50RmlsZUluZm8gPyAoJyBGaWxlbmFtZTogJy4kcnVsZU5vZGUtPmN1cnJlbnRGaWxlSW5mb1snZmlsZW5hbWUnXSkgOiBudWxsKTsKCQkJCXRocm93IG5ldyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlcigkbXNnKTsKCQkJfQoJCX0KCX0KCgoJcHVibGljIGZ1bmN0aW9uIHZpc2l0UnVsZXNldCggJHJ1bGVzZXROb2RlLCAmJHZpc2l0RGVlcGVyICl7CgoJCSR2aXNpdERlZXBlciA9IGZhbHNlOwoKCQkkdGhpcy0+Y2hlY2tQcm9wZXJ0aWVzSW5Sb290KCAkcnVsZXNldE5vZGUgKTsKCgkJaWYoICRydWxlc2V0Tm9kZS0+cm9vdCApewoJCQlyZXR1cm4gJHRoaXMtPnZpc2l0UnVsZXNldFJvb3QoICRydWxlc2V0Tm9kZSApOwoJCX0KCgkJJHJ1bGVzZXRzID0gYXJyYXkoKTsKCQkkcnVsZXNldE5vZGUtPnBhdGhzID0gJHRoaXMtPnZpc2l0UnVsZXNldFBhdGhzKCRydWxlc2V0Tm9kZSk7CgoKCQkvLyBDb21waWxlIHJ1bGVzIGFuZCBydWxlc2V0cwoJCSRub2RlUnVsZUNudCA9IGNvdW50KCRydWxlc2V0Tm9kZS0+cnVsZXMpOwoJCWZvciggJGkgPSAwOyAkaSA8ICRub2RlUnVsZUNudDsgKXsKCQkJJHJ1bGUgPSAkcnVsZXNldE5vZGUtPnJ1bGVzWyRpXTsKCgkJCWlmKCBwcm9wZXJ0eV9leGlzdHMoJHJ1bGUsJ3J1bGVzJykgKXsKCQkJCS8vIHZpc2l0IGJlY2F1c2Ugd2UgYXJlIG1vdmluZyB0aGVtIG91dCBmcm9tIGJlaW5nIGEgY2hpbGQKCQkJCSRydWxlc2V0c1tdID0gJHRoaXMtPnZpc2l0T2JqKCRydWxlKTsKCQkJCWFycmF5X3NwbGljZSgkcnVsZXNldE5vZGUtPnJ1bGVzLCRpLDEpOwoJCQkJJG5vZGVSdWxlQ250LS07CgkJCQljb250aW51ZTsKCQkJfQoJCQkkaSsrOwoJCX0KCgoJCS8vIGFjY2VwdCB0aGUgdmlzaXRvciB0byByZW1vdmUgcnVsZXMgYW5kIHJlZmFjdG9yIGl0c2VsZgoJCS8vIHRoZW4gd2UgY2FuIGRlY2lkZSBub3cgd2hldGhlciB3ZSB3YW50IGl0IG9yIG5vdAoJCWlmKCAkbm9kZVJ1bGVDbnQgPiAwICl7CgkJCSRydWxlc2V0Tm9kZS0+YWNjZXB0KCR0aGlzKTsKCgkJCWlmKCAkcnVsZXNldE5vZGUtPnJ1bGVzICl7CgoJCQkJaWYoIGNvdW50KCRydWxlc2V0Tm9kZS0+cnVsZXMpID4gIDEgKXsKCQkJCQkkdGhpcy0+X21lcmdlUnVsZXMoICRydWxlc2V0Tm9kZS0+cnVsZXMgKTsKCQkJCQkkdGhpcy0+X3JlbW92ZUR1cGxpY2F0ZVJ1bGVzKCAkcnVsZXNldE5vZGUtPnJ1bGVzICk7CgkJCQl9CgoJCQkJLy8gbm93IGRlY2lkZSB3aGV0aGVyIHdlIGtlZXAgdGhlIHJ1bGVzZXQKCQkJCWlmKCAkcnVsZXNldE5vZGUtPnBhdGhzICl7CgkJCQkJLy9hcnJheV91bnNoaWZ0KCRydWxlc2V0cywgJHJ1bGVzZXROb2RlKTsKCQkJCQlhcnJheV9zcGxpY2UoJHJ1bGVzZXRzLDAsMCxhcnJheSgkcnVsZXNldE5vZGUpKTsKCQkJCX0KCQkJfQoKCQl9CgoKCQlpZiggY291bnQoJHJ1bGVzZXRzKSA9PT0gMSApewoJCQlyZXR1cm4gJHJ1bGVzZXRzWzBdOwoJCX0KCQlyZXR1cm4gJHJ1bGVzZXRzOwoJfQoKCgkvKioKCSAqIEhlbHBlciBmdW5jdGlvbiBmb3IgdmlzaXRpUnVsZXNldAoJICoKCSAqIHJldHVybiBhcnJheXxMZXNzX1RyZWVfUnVsZXNldAoJICovCglwcml2YXRlIGZ1bmN0aW9uIHZpc2l0UnVsZXNldFJvb3QoICRydWxlc2V0Tm9kZSApewoJCSRydWxlc2V0Tm9kZS0+YWNjZXB0KCAkdGhpcyApOwoJCWlmKCAkcnVsZXNldE5vZGUtPmZpcnN0Um9vdCB8fCAkcnVsZXNldE5vZGUtPnJ1bGVzICl7CgkJCXJldHVybiAkcnVsZXNldE5vZGU7CgkJfQoJCXJldHVybiBhcnJheSgpOwoJfQoKCgkvKioKCSAqIEhlbHBlciBmdW5jdGlvbiBmb3IgdmlzaXRSdWxlc2V0KCkKCSAqCgkgKiBAcmV0dXJuIGFycmF5CgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gdmlzaXRSdWxlc2V0UGF0aHMoJHJ1bGVzZXROb2RlKXsKCgkJJHBhdGhzID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRydWxlc2V0Tm9kZS0+cGF0aHMgYXMgJHApewoJCQlpZiggJHBbMF0tPmVsZW1lbnRzWzBdLT5jb21iaW5hdG9yID09PSAnICcgKXsKCQkJCSRwWzBdLT5lbGVtZW50c1swXS0+Y29tYmluYXRvciA9ICcnOwoJCQl9CgoJCQlmb3JlYWNoKCRwIGFzICRwaSl7CgkJCQlpZiggJHBpLT5nZXRJc1JlZmVyZW5jZWQoKSAmJiAkcGktPmdldElzT3V0cHV0KCkgKXsKCQkJCQkkcGF0aHNbXSA9ICRwOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gJHBhdGhzOwoJfQoKCXByb3RlY3RlZCBmdW5jdGlvbiBfcmVtb3ZlRHVwbGljYXRlUnVsZXMoICYkcnVsZXMgKXsKCQkvLyByZW1vdmUgZHVwbGljYXRlcwoJCSRydWxlQ2FjaGUgPSBhcnJheSgpOwoJCWZvciggJGkgPSBjb3VudCgkcnVsZXMpLTE7ICRpID49IDAgOyAkaS0tICl7CgkJCSRydWxlID0gJHJ1bGVzWyRpXTsKCQkJaWYoICRydWxlIGluc3RhbmNlb2YgTGVzc19UcmVlX1J1bGUgfHwgJHJ1bGUgaW5zdGFuY2VvZiBMZXNzX1RyZWVfTmFtZVZhbHVlICl7CgoJCQkJaWYoICFpc3NldCgkcnVsZUNhY2hlWyRydWxlLT5uYW1lXSkgKXsKCQkJCQkkcnVsZUNhY2hlWyRydWxlLT5uYW1lXSA9ICRydWxlOwoJCQkJfWVsc2V7CgkJCQkJJHJ1bGVMaXN0ID0mICRydWxlQ2FjaGVbJHJ1bGUtPm5hbWVdOwoKCQkJCQlpZiggJHJ1bGVMaXN0IGluc3RhbmNlb2YgTGVzc19UcmVlX1J1bGUgfHwgJHJ1bGVMaXN0IGluc3RhbmNlb2YgTGVzc19UcmVlX05hbWVWYWx1ZSApewoJCQkJCQkkcnVsZUxpc3QgPSAkcnVsZUNhY2hlWyRydWxlLT5uYW1lXSA9IGFycmF5KCAkcnVsZUNhY2hlWyRydWxlLT5uYW1lXS0+dG9DU1MoKSApOwoJCQkJCX0KCgkJCQkJJHJ1bGVDU1MgPSAkcnVsZS0+dG9DU1MoKTsKCQkJCQlpZiggYXJyYXlfc2VhcmNoKCRydWxlQ1NTLCRydWxlTGlzdCkgIT09IGZhbHNlICl7CgkJCQkJCWFycmF5X3NwbGljZSgkcnVsZXMsJGksMSk7CgkJCQkJfWVsc2V7CgkJCQkJCSRydWxlTGlzdFtdID0gJHJ1bGVDU1M7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXByb3RlY3RlZCBmdW5jdGlvbiBfbWVyZ2VSdWxlcyggJiRydWxlcyApewoJCSRncm91cHMgPSBhcnJheSgpOwoKCQkvL29iaigkcnVsZXMpOwoKCQkkcnVsZXNfbGVuID0gY291bnQoJHJ1bGVzKTsKCQlmb3IoICRpID0gMDsgJGkgPCAkcnVsZXNfbGVuOyAkaSsrICl7CgkJCSRydWxlID0gJHJ1bGVzWyRpXTsKCgkJCWlmKCAoJHJ1bGUgaW5zdGFuY2VvZiBMZXNzX1RyZWVfUnVsZSkgJiYgJHJ1bGUtPm1lcmdlICl7CgoJCQkJJGtleSA9ICRydWxlLT5uYW1lOwoJCQkJaWYoICRydWxlLT5pbXBvcnRhbnQgKXsKCQkJCQkka2V5IC49ICcsISc7CgkJCQl9CgoJCQkJaWYoICFpc3NldCgkZ3JvdXBzWyRrZXldKSApewoJCQkJCSRncm91cHNbJGtleV0gPSBhcnJheSgpOwoJCQkJfWVsc2V7CgkJCQkJYXJyYXlfc3BsaWNlKCRydWxlcywgJGktLSwgMSk7CgkJCQkJJHJ1bGVzX2xlbi0tOwoJCQkJfQoKCQkJCSRncm91cHNbJGtleV1bXSA9ICRydWxlOwoJCQl9CgkJfQoKCgkJZm9yZWFjaCgkZ3JvdXBzIGFzICRwYXJ0cyl7CgoJCQlpZiggY291bnQoJHBhcnRzKSA+IDEgKXsKCQkJCSRydWxlID0gJHBhcnRzWzBdOwoJCQkJJHNwYWNlZEdyb3VwcyA9IGFycmF5KCk7CgkJCQkkbGFzdFNwYWNlZEdyb3VwID0gYXJyYXkoKTsKCQkJCSRwYXJ0c19tYXBwZWQgPSBhcnJheSgpOwoJCQkJZm9yZWFjaCgkcGFydHMgYXMgJHApewoJCQkJCWlmKCAkcC0+bWVyZ2UgPT09ICcrJyApewoJCQkJCQlpZiggJGxhc3RTcGFjZWRHcm91cCApewoJCQkJCQkJJHNwYWNlZEdyb3Vwc1tdID0gc2VsZjo6dG9FeHByZXNzaW9uKCRsYXN0U3BhY2VkR3JvdXApOwoJCQkJCQl9CgkJCQkJCSRsYXN0U3BhY2VkR3JvdXAgPSBhcnJheSgpOwoJCQkJCX0KCQkJCQkkbGFzdFNwYWNlZEdyb3VwW10gPSAkcDsKCQkJCX0KCgkJCQkkc3BhY2VkR3JvdXBzW10gPSBzZWxmOjp0b0V4cHJlc3Npb24oJGxhc3RTcGFjZWRHcm91cCk7CgkJCQkkcnVsZS0+dmFsdWUgPSBzZWxmOjp0b1ZhbHVlKCRzcGFjZWRHcm91cHMpOwoJCQl9CgkJfQoKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRvRXhwcmVzc2lvbigkdmFsdWVzKXsKCQkkbWFwcGVkID0gYXJyYXkoKTsKCQlmb3JlYWNoKCR2YWx1ZXMgYXMgJHApewoJCQkkbWFwcGVkW10gPSAkcC0+dmFsdWU7CgkJfQoJCXJldHVybiBuZXcgTGVzc19UcmVlX0V4cHJlc3Npb24oICRtYXBwZWQgKTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRvVmFsdWUoJHZhbHVlcyl7CgkJLy9yZXR1cm4gbmV3IExlc3NfVHJlZV9WYWx1ZSgkdmFsdWVzKTsgPz8KCgkJJG1hcHBlZCA9IGFycmF5KCk7CgkJZm9yZWFjaCgkdmFsdWVzIGFzICRwKXsKCQkJJG1hcHBlZFtdID0gJHA7CgkJfQoJCXJldHVybiBuZXcgTGVzc19UcmVlX1ZhbHVlKCRtYXBwZWQpOwoJfQp9CgogDQoNCi8qKg0KICogUGFyc2VyIEV4Y2VwdGlvbg0KICoNCiAqIEBwYWNrYWdlIExlc3MNCiAqIEBzdWJwYWNrYWdlIGV4Y2VwdGlvbg0KICovDQpjbGFzcyBMZXNzX0V4Y2VwdGlvbl9QYXJzZXIgZXh0ZW5kcyBFeGNlcHRpb257DQoNCgkvKioNCgkgKiBUaGUgY3VycmVudCBmaWxlDQoJICoNCgkgKiBAdmFyIExlc3NfSW1wb3J0ZWRGaWxlDQoJICovDQoJcHVibGljICRjdXJyZW50RmlsZTsNCg0KCS8qKg0KCSAqIFRoZSBjdXJyZW50IHBhcnNlciBpbmRleA0KCSAqDQoJICogQHZhciBpbnRlZ2VyDQoJICovDQoJcHVibGljICRpbmRleDsNCg0KCXByb3RlY3RlZCAkaW5wdXQ7DQoNCglwcm90ZWN0ZWQgJGRldGFpbHMgPSBhcnJheSgpOw0KDQoNCgkvKioNCgkgKiBDb25zdHJ1Y3Rvcg0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkbWVzc2FnZQ0KCSAqIEBwYXJhbSBFeGNlcHRpb24gJHByZXZpb3VzIFByZXZpb3VzIGV4Y2VwdGlvbg0KCSAqIEBwYXJhbSBpbnRlZ2VyICRpbmRleCBUaGUgY3VycmVudCBwYXJzZXIgaW5kZXgNCgkgKiBAcGFyYW0gTGVzc19GaWxlSW5mb3xzdHJpbmcgJGN1cnJlbnRGaWxlIFRoZSBmaWxlDQoJICogQHBhcmFtIGludGVnZXIgJGNvZGUgVGhlIGV4Y2VwdGlvbiBjb2RlDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgRXhjZXB0aW9uICRwcmV2aW91cyA9IG51bGwsICRpbmRleCA9IG51bGwsICRjdXJyZW50RmlsZSA9IG51bGwsICRjb2RlID0gMCl7DQoNCgkJaWYgKFBIUF9WRVJTSU9OX0lEIDwgNTAzMDApIHsNCgkJCSR0aGlzLT5wcmV2aW91cyA9ICRwcmV2aW91czsNCgkJCXBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsNCgkJfSBlbHNlIHsNCgkJCXBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlLCAkcHJldmlvdXMpOw0KCQl9DQoNCgkJJHRoaXMtPmN1cnJlbnRGaWxlID0gJGN1cnJlbnRGaWxlOw0KCQkkdGhpcy0+aW5kZXggPSAkaW5kZXg7DQoNCgkJJHRoaXMtPmdlbk1lc3NhZ2UoKTsNCgl9DQoNCg0KCXByb3RlY3RlZCBmdW5jdGlvbiBnZXRJbnB1dCgpew0KDQoJCWlmKCAhJHRoaXMtPmlucHV0ICYmICR0aGlzLT5jdXJyZW50RmlsZSAmJiAkdGhpcy0+Y3VycmVudEZpbGVbJ2ZpbGVuYW1lJ10gJiYgZmlsZV9leGlzdHMoJHRoaXMtPmN1cnJlbnRGaWxlWydmaWxlbmFtZSddKSApew0KCQkJJHRoaXMtPmlucHV0ID0gZmlsZV9nZXRfY29udGVudHMoICR0aGlzLT5jdXJyZW50RmlsZVsnZmlsZW5hbWUnXSApOw0KCQl9DQoJfQ0KDQoNCg0KCS8qKg0KCSAqIENvbnZlcnRzIHRoZSBleGNlcHRpb24gdG8gc3RyaW5nDQoJICoNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZW5NZXNzYWdlKCl7DQoNCgkJaWYoICR0aGlzLT5jdXJyZW50RmlsZSAmJiAkdGhpcy0+Y3VycmVudEZpbGVbJ2ZpbGVuYW1lJ10gKXsNCgkJCSR0aGlzLT5tZXNzYWdlIC49ICcgaW4gJy5iYXNlbmFtZSgkdGhpcy0+Y3VycmVudEZpbGVbJ2ZpbGVuYW1lJ10pOw0KCQl9DQoNCgkJaWYoICR0aGlzLT5pbmRleCAhPT0gbnVsbCApew0KCQkJJHRoaXMtPmdldElucHV0KCk7DQoJCQlpZiggJHRoaXMtPmlucHV0ICl7DQoJCQkJJGxpbmUgPSBzZWxmOjpnZXRMaW5lTnVtYmVyKCk7DQoJCQkJJHRoaXMtPm1lc3NhZ2UgLj0gJyBvbiBsaW5lICcuJGxpbmUuJywgY29sdW1uICcuc2VsZjo6Z2V0Q29sdW1uKCk7DQoNCgkJCQkkbGluZXMgPSBleHBsb2RlKCJcbiIsJHRoaXMtPmlucHV0KTsNCg0KCQkJCSRjb3VudCA9IGNvdW50KCRsaW5lcyk7DQoJCQkJJHN0YXJ0X2xpbmUgPSBtYXgoMCwgJGxpbmUtMyk7DQoJCQkJJGxhc3RfbGluZSA9IG1pbigkY291bnQsICRzdGFydF9saW5lKzYpOw0KCQkJCSRudW1fbGVuID0gc3RybGVuKCRsYXN0X2xpbmUpOw0KCQkJCWZvciggJGkgPSAkc3RhcnRfbGluZTsgJGkgPCAkbGFzdF9saW5lOyAkaSsrICl7DQoJCQkJCSR0aGlzLT5tZXNzYWdlIC49ICJcbiIuc3RyX3BhZCgkaSsxLCRudW1fbGVuLCcwJyxTVFJfUEFEX0xFRlQpLid8ICcuJGxpbmVzWyRpXTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCX0NCg0KCS8qKg0KCSAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyIHRoZSBlcnJvciB3YXMgZW5jb3VudGVyZWQNCgkgKg0KCSAqIEByZXR1cm4gaW50ZWdlcg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRMaW5lTnVtYmVyKCl7DQoJCWlmKCAkdGhpcy0+aW5kZXggKXsNCgkJCS8vIGh0dHBzOi8vYnVncy5waHAubmV0L2J1Zy5waHA/aWQ9NDk3OTANCgkJCWlmIChpbmlfZ2V0KCJtYnN0cmluZy5mdW5jX292ZXJsb2FkIikpIHsNCgkJCQlyZXR1cm4gc3Vic3RyX2NvdW50KHN1YnN0cigkdGhpcy0+aW5wdXQsIDAsICR0aGlzLT5pbmRleCksICJcbiIpICsgMTsNCgkJCX0gZWxzZSB7DQoJCQkJcmV0dXJuIHN1YnN0cl9jb3VudCgkdGhpcy0+aW5wdXQsICJcbiIsIDAsICR0aGlzLT5pbmRleCkgKyAxOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAxOw0KCX0NCg0KDQoJLyoqDQoJICogUmV0dXJucyB0aGUgY29sdW1uIHRoZSBlcnJvciB3YXMgZW5jb3VudGVyZWQNCgkgKg0KCSAqIEByZXR1cm4gaW50ZWdlcg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRDb2x1bW4oKXsNCg0KCQkkcGFydCA9IHN1YnN0cigkdGhpcy0+aW5wdXQsIDAsICR0aGlzLT5pbmRleCk7DQoJCSRwb3MgPSBzdHJycG9zKCRwYXJ0LCJcbiIpOw0KCQlyZXR1cm4gJHRoaXMtPmluZGV4IC0gJHBvczsNCgl9DQoNCn0NCiANCg0KLyoqDQogKiBDaHVuayBFeGNlcHRpb24NCiAqDQogKiBAcGFja2FnZSBMZXNzDQogKiBAc3VicGFja2FnZSBleGNlcHRpb24NCiAqLw0KY2xhc3MgTGVzc19FeGNlcHRpb25fQ2h1bmsgZXh0ZW5kcyBMZXNzX0V4Y2VwdGlvbl9QYXJzZXJ7DQoNCg0KCXByb3RlY3RlZCAkcGFyc2VyQ3VycmVudEluZGV4ID0gMDsNCg0KCXByb3RlY3RlZCAkZW1pdEZyb20gPSAwOw0KDQoJcHJvdGVjdGVkICRpbnB1dF9sZW47DQoNCg0KCS8qKg0KCSAqIENvbnN0cnVjdG9yDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRpbnB1dA0KCSAqIEBwYXJhbSBFeGNlcHRpb24gJHByZXZpb3VzIFByZXZpb3VzIGV4Y2VwdGlvbg0KCSAqIEBwYXJhbSBpbnRlZ2VyICRpbmRleCBUaGUgY3VycmVudCBwYXJzZXIgaW5kZXgNCgkgKiBAcGFyYW0gTGVzc19GaWxlSW5mb3xzdHJpbmcgJGN1cnJlbnRGaWxlIFRoZSBmaWxlDQoJICogQHBhcmFtIGludGVnZXIgJGNvZGUgVGhlIGV4Y2VwdGlvbiBjb2RlDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbnB1dCwgRXhjZXB0aW9uICRwcmV2aW91cyA9IG51bGwsICRpbmRleCA9IG51bGwsICRjdXJyZW50RmlsZSA9IG51bGwsICRjb2RlID0gMCl7DQoNCgkJJHRoaXMtPm1lc3NhZ2UgPSAnUGFyc2VFcnJvcjogVW5leHBlY3RlZCBpbnB1dCc7IC8vZGVmYXVsdCBtZXNzYWdlDQoNCgkJJHRoaXMtPmluZGV4ID0gJGluZGV4Ow0KDQoJCSR0aGlzLT5jdXJyZW50RmlsZSA9ICRjdXJyZW50RmlsZTsNCg0KCQkkdGhpcy0+aW5wdXQgPSAkaW5wdXQ7DQoJCSR0aGlzLT5pbnB1dF9sZW4gPSBzdHJsZW4oJGlucHV0KTsNCg0KCQkkdGhpcy0+Q2h1bmtzKCk7DQoJCSR0aGlzLT5nZW5NZXNzYWdlKCk7DQoJfQ0KDQoNCgkvKioNCgkgKiBTZWUgbGVzcy5qcyBjaHVua3MoKQ0KCSAqIFdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdGhlIGNodW5rcw0KCSAqDQoJICovDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIENodW5rcygpew0KCQkkbGV2ZWwgPSAwOw0KCQkkcGFyZW5MZXZlbCA9IDA7DQoJCSRsYXN0TXVsdGlDb21tZW50RW5kQnJhY2UgPSBudWxsOw0KCQkkbGFzdE9wZW5pbmcgPSBudWxsOw0KCQkkbGFzdE11bHRpQ29tbWVudCA9IG51bGw7DQoJCSRsYXN0UGFyZW4gPSBudWxsOw0KDQoJCWZvciggJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleCA9IDA7ICR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXggPCAkdGhpcy0+aW5wdXRfbGVuOyAkdGhpcy0+cGFyc2VyQ3VycmVudEluZGV4KysgKXsNCgkJCSRjYyA9ICR0aGlzLT5DaGFyQ29kZSgkdGhpcy0+cGFyc2VyQ3VycmVudEluZGV4KTsNCgkJCWlmICgoKCRjYyA+PSA5NykgJiYgKCRjYyA8PSAxMjIpKSB8fCAoJGNjIDwgMzQpKSB7DQoJCQkJLy8gYS16IG9yIHdoaXRlc3BhY2UNCgkJCQljb250aW51ZTsNCgkJCX0NCg0KCQkJc3dpdGNoICgkY2MpIHsNCg0KCQkJCS8vICgNCgkJCQljYXNlIDQwOg0KCQkJCQkkcGFyZW5MZXZlbCsrOw0KCQkJCQkkbGFzdFBhcmVuID0gJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleDsNCgkJCQkJY29udGludWU7DQoNCgkJCQkvLyApDQoJCQkJY2FzZSA0MToNCgkJCQkJJHBhcmVuTGV2ZWwtLTsNCgkJCQkJaWYoICRwYXJlbkxldmVsIDwgMCApew0KCQkJCQkJcmV0dXJuICR0aGlzLT5mYWlsKCJtaXNzaW5nIG9wZW5pbmcgYChgIik7DQoJCQkJCX0NCgkJCQkJY29udGludWU7DQoNCgkJCQkvLyA7DQoJCQkJY2FzZSA1OToNCgkJCQkJLy9pZiAoISRwYXJlbkxldmVsKSB7ICR0aGlzLT5lbWl0Q2h1bmsoKTsJfQ0KCQkJCQljb250aW51ZTsNCg0KCQkJCS8vIHsNCgkJCQljYXNlIDEyMzoNCgkJCQkJJGxldmVsKys7DQoJCQkJCSRsYXN0T3BlbmluZyA9ICR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXg7DQoJCQkJCWNvbnRpbnVlOw0KDQoJCQkJLy8gfQ0KCQkJCWNhc2UgMTI1Og0KCQkJCQkkbGV2ZWwtLTsNCgkJCQkJaWYoICRsZXZlbCA8IDAgKXsNCgkJCQkJCXJldHVybiAkdGhpcy0+ZmFpbCgibWlzc2luZyBvcGVuaW5nIGB7YCIpOw0KDQoJCQkJCX0NCgkJCQkJLy9pZiAoISRsZXZlbCAmJiAhJHBhcmVuTGV2ZWwpIHsgJHRoaXMtPmVtaXRDaHVuaygpOyB9DQoJCQkJCWNvbnRpbnVlOw0KCQkJCS8vIFwNCgkJCQljYXNlIDkyOg0KCQkJCQlpZiAoJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleCA8ICR0aGlzLT5pbnB1dF9sZW4gLSAxKSB7ICR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXgrKzsgY29udGludWU7IH0NCgkJCQkJcmV0dXJuICR0aGlzLT5mYWlsKCJ1bmVzY2FwZWQgYFxcYCIpOw0KDQoJCQkJLy8gIiwgJyBhbmQgYA0KCQkJCWNhc2UgMzQ6DQoJCQkJY2FzZSAzOToNCgkJCQljYXNlIDk2Og0KCQkJCQkkbWF0Y2hlZCA9IDA7DQoJCQkJCSRjdXJyZW50Q2h1bmtTdGFydEluZGV4ID0gJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleDsNCgkJCQkJZm9yICgkdGhpcy0+cGFyc2VyQ3VycmVudEluZGV4ID0gJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleCArIDE7ICR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXggPCAkdGhpcy0+aW5wdXRfbGVuOyAkdGhpcy0+cGFyc2VyQ3VycmVudEluZGV4KyspIHsNCgkJCQkJCSRjYzIgPSAkdGhpcy0+Q2hhckNvZGUoJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleCk7DQoJCQkJCQlpZiAoJGNjMiA+IDk2KSB7IGNvbnRpbnVlOyB9DQoJCQkJCQlpZiAoJGNjMiA9PSAkY2MpIHsgJG1hdGNoZWQgPSAxOyBicmVhazsgfQ0KCQkJCQkJaWYgKCRjYzIgPT0gOTIpIHsgICAgICAgIC8vIFwNCgkJCQkJCQlpZiAoJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleCA9PSAkdGhpcy0+aW5wdXRfbGVuIC0gMSkgew0KCQkJCQkJCQlyZXR1cm4gJHRoaXMtPmZhaWwoInVuZXNjYXBlZCBgXFxgIik7DQoJCQkJCQkJfQ0KCQkJCQkJCSR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXgrKzsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQlpZiAoJG1hdGNoZWQpIHsgY29udGludWU7IH0NCgkJCQkJcmV0dXJuICR0aGlzLT5mYWlsKCJ1bm1hdGNoZWQgYCIgKyBjaHIoJGNjKSArICJgIiwgJGN1cnJlbnRDaHVua1N0YXJ0SW5kZXgpOw0KDQoJCQkJLy8gLywgY2hlY2sgZm9yIGNvbW1lbnQNCgkJCQljYXNlIDQ3Og0KCQkJCQlpZiAoJHBhcmVuTGV2ZWwgfHwgKCR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXggPT0gJHRoaXMtPmlucHV0X2xlbiAtIDEpKSB7IGNvbnRpbnVlOyB9DQoJCQkJCSRjYzIgPSAkdGhpcy0+Q2hhckNvZGUoJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleCsxKTsNCgkJCQkJaWYgKCRjYzIgPT0gNDcpIHsNCgkJCQkJCS8vIC8vLCBmaW5kIGxuZmVlZA0KCQkJCQkJZm9yICgkdGhpcy0+cGFyc2VyQ3VycmVudEluZGV4ID0gJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleCArIDI7ICR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXggPCAkdGhpcy0+aW5wdXRfbGVuOyAkdGhpcy0+cGFyc2VyQ3VycmVudEluZGV4KyspIHsNCgkJCQkJCQkkY2MyID0gJHRoaXMtPkNoYXJDb2RlKCR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXgpOw0KCQkJCQkJCWlmICgoJGNjMiA8PSAxMykgJiYgKCgkY2MyID09IDEwKSB8fCAoJGNjMiA9PSAxMykpKSB7IGJyZWFrOyB9DQoJCQkJCQl9DQoJCQkJCX0gZWxzZSBpZiAoJGNjMiA9PSA0Mikgew0KCQkJCQkJLy8gLyosIGZpbmQgKi8NCgkJCQkJCSRsYXN0TXVsdGlDb21tZW50ID0gJGN1cnJlbnRDaHVua1N0YXJ0SW5kZXggPSAkdGhpcy0+cGFyc2VyQ3VycmVudEluZGV4Ow0KCQkJCQkJZm9yICgkdGhpcy0+cGFyc2VyQ3VycmVudEluZGV4ID0gJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleCArIDI7ICR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXggPCAkdGhpcy0+aW5wdXRfbGVuIC0gMTsgJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleCsrKSB7DQoJCQkJCQkJJGNjMiA9ICR0aGlzLT5DaGFyQ29kZSgkdGhpcy0+cGFyc2VyQ3VycmVudEluZGV4KTsNCgkJCQkJCQlpZiAoJGNjMiA9PSAxMjUpIHsgJGxhc3RNdWx0aUNvbW1lbnRFbmRCcmFjZSA9ICR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXg7IH0NCgkJCQkJCQlpZiAoJGNjMiAhPSA0MikgeyBjb250aW51ZTsgfQ0KCQkJCQkJCWlmICgkdGhpcy0+Q2hhckNvZGUoJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleCsxKSA9PSA0NykgeyBicmVhazsgfQ0KCQkJCQkJfQ0KCQkJCQkJaWYgKCR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXggPT0gJHRoaXMtPmlucHV0X2xlbiAtIDEpIHsNCgkJCQkJCQlyZXR1cm4gJHRoaXMtPmZhaWwoIm1pc3NpbmcgY2xvc2luZyBgKi9gIiwgJGN1cnJlbnRDaHVua1N0YXJ0SW5kZXgpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWNvbnRpbnVlOw0KDQoJCQkJLy8gKiwgY2hlY2sgZm9yIHVubWF0Y2hlZCAqLw0KCQkJCWNhc2UgNDI6DQoJCQkJCWlmICgoJHRoaXMtPnBhcnNlckN1cnJlbnRJbmRleCA8ICR0aGlzLT5pbnB1dF9sZW4gLSAxKSAmJiAoJHRoaXMtPkNoYXJDb2RlKCR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXgrMSkgPT0gNDcpKSB7DQoJCQkJCQlyZXR1cm4gJHRoaXMtPmZhaWwoInVubWF0Y2hlZCBgLypgIik7DQoJCQkJCX0NCgkJCQkJY29udGludWU7DQoJCQl9DQoJCX0NCg0KCQlpZiggJGxldmVsICE9PSAwICl7DQoJCQlpZiggKCRsYXN0TXVsdGlDb21tZW50ID4gJGxhc3RPcGVuaW5nKSAmJiAoJGxhc3RNdWx0aUNvbW1lbnRFbmRCcmFjZSA+ICRsYXN0TXVsdGlDb21tZW50KSApew0KCQkJCXJldHVybiAkdGhpcy0+ZmFpbCgibWlzc2luZyBjbG9zaW5nIGB9YCBvciBgKi9gIiwgJGxhc3RPcGVuaW5nKTsNCgkJCX0gZWxzZSB7DQoJCQkJcmV0dXJuICR0aGlzLT5mYWlsKCJtaXNzaW5nIGNsb3NpbmcgYH1gIiwgJGxhc3RPcGVuaW5nKTsNCgkJCX0NCgkJfSBlbHNlIGlmICggJHBhcmVuTGV2ZWwgIT09IDAgKXsNCgkJCXJldHVybiAkdGhpcy0+ZmFpbCgibWlzc2luZyBjbG9zaW5nIGApYCIsICRsYXN0UGFyZW4pOw0KCQl9DQoNCg0KCQkvL2NodW5rIGRpZG4ndCBmYWlsDQoNCg0KCQkvLyR0aGlzLT5lbWl0Q2h1bmsodHJ1ZSk7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIENoYXJDb2RlKCRwb3Mpew0KCQlyZXR1cm4gb3JkKCR0aGlzLT5pbnB1dFskcG9zXSk7DQoJfQ0KDQoNCglwdWJsaWMgZnVuY3Rpb24gZmFpbCggJG1zZywgJGluZGV4ID0gbnVsbCApew0KDQoJCWlmKCAhJGluZGV4ICl7DQoJCQkkdGhpcy0+aW5kZXggPSAkdGhpcy0+cGFyc2VyQ3VycmVudEluZGV4Ow0KCQl9ZWxzZXsNCgkJCSR0aGlzLT5pbmRleCA9ICRpbmRleDsNCgkJfQ0KCQkkdGhpcy0+bWVzc2FnZSA9ICdQYXJzZUVycm9yOiAnLiRtc2c7DQoJfQ0KDQoNCgkvKg0KCWZ1bmN0aW9uIGVtaXRDaHVuayggJGZvcmNlID0gZmFsc2UgKXsNCgkJJGxlbiA9ICR0aGlzLT5wYXJzZXJDdXJyZW50SW5kZXggLSAkdGhpcy0+ZW1pdEZyb207DQoJCWlmICgoKCRsZW4gPCA1MTIpICYmICEkZm9yY2UpIHx8ICEkbGVuKSB7DQoJCQlyZXR1cm47DQoJCX0NCgkJJGNodW5rc1tdID0gc3Vic3RyKCR0aGlzLT5pbnB1dCwgJHRoaXMtPmVtaXRGcm9tLCAkdGhpcy0+cGFyc2VyQ3VycmVudEluZGV4ICsgMSAtICR0aGlzLT5lbWl0RnJvbSApOw0KCQkkdGhpcy0+ZW1pdEZyb20gPSAkdGhpcy0+cGFyc2VyQ3VycmVudEluZGV4ICsgMTsNCgl9DQoJKi8NCg0KfQ0KIA0KDQovKioNCiAqIENvbXBpbGVyIEV4Y2VwdGlvbg0KICoNCiAqIEBwYWNrYWdlIExlc3MNCiAqIEBzdWJwYWNrYWdlIGV4Y2VwdGlvbg0KICovDQpjbGFzcyBMZXNzX0V4Y2VwdGlvbl9Db21waWxlciBleHRlbmRzIExlc3NfRXhjZXB0aW9uX1BhcnNlcnsNCg0KfSANCg0KLyoqDQogKiBQYXJzZXIgb3V0cHV0IHdpdGggc291cmNlIG1hcA0KICoNCiAqIEBwYWNrYWdlIExlc3MNCiAqIEBzdWJwYWNrYWdlIE91dHB1dA0KICovDQpjbGFzcyBMZXNzX091dHB1dF9NYXBwZWQgZXh0ZW5kcyBMZXNzX091dHB1dCB7DQoNCgkvKioNCgkgKiBUaGUgc291cmNlIG1hcCBnZW5lcmF0b3INCgkgKg0KCSAqIEB2YXIgTGVzc19Tb3VyY2VNYXBfR2VuZXJhdG9yDQoJICovDQoJcHJvdGVjdGVkICRnZW5lcmF0b3I7DQoNCgkvKioNCgkgKiBDdXJyZW50IGxpbmUNCgkgKg0KCSAqIEB2YXIgaW50ZWdlcg0KCSAqLw0KCXByb3RlY3RlZCAkbGluZU51bWJlciA9IDA7DQoNCgkvKioNCgkgKiBDdXJyZW50IGNvbHVtbg0KCSAqDQoJICogQHZhciBpbnRlZ2VyDQoJICovDQoJcHJvdGVjdGVkICRjb2x1bW4gPSAwOw0KDQoJLyoqDQoJICogQXJyYXkgb2YgY29udGVudHMgbWFwIChmaWxlIGFuZCBpdHMgY29udGVudCkNCgkgKg0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcm90ZWN0ZWQgJGNvbnRlbnRzTWFwID0gYXJyYXkoKTsNCg0KCS8qKg0KCSAqIENvbnN0cnVjdG9yDQoJICoNCgkgKiBAcGFyYW0gYXJyYXkgJGNvbnRlbnRzTWFwIEFycmF5IG9mIGZpbGVuYW1lIHRvIGNvbnRlbnRzIG1hcA0KCSAqIEBwYXJhbSBMZXNzX1NvdXJjZU1hcF9HZW5lcmF0b3IgJGdlbmVyYXRvcg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY29udGVudHNNYXAsICRnZW5lcmF0b3Ipew0KCQkkdGhpcy0+Y29udGVudHNNYXAgPSAkY29udGVudHNNYXA7DQoJCSR0aGlzLT5nZW5lcmF0b3IgPSAkZ2VuZXJhdG9yOw0KCX0NCg0KCS8qKg0KCSAqIEFkZHMgYSBjaHVuayB0byB0aGUgc3RhY2sNCgkgKiBUaGUgJGluZGV4IGZvciBsZXNzLnBocCBtYXkgYmUgZGlmZmVyZW50IGZyb20gbGVzcy5qcyBzaW5jZSBsZXNzLnBocCBkb2VzIG5vdCBjaHVua2lmeSBpbnB1dHMNCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgJGNodW5rDQoJICogQHBhcmFtIHN0cmluZyAkZmlsZUluZm8NCgkgKiBAcGFyYW0gaW50ZWdlciAkaW5kZXgNCgkgKiBAcGFyYW0gbWl4ZWQgJG1hcExpbmVzDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZCgkY2h1bmssICRmaWxlSW5mbyA9IG51bGwsICRpbmRleCA9IDAsICRtYXBMaW5lcyA9IG51bGwpew0KDQoJCS8vaWdub3JlIGFkZGluZyBlbXB0eSBzdHJpbmdzDQoJCWlmKCAkY2h1bmsgPT09ICcnICl7DQoJCQlyZXR1cm47DQoJCX0NCg0KDQoJCSRzb3VyY2VMaW5lcyA9IGFycmF5KCk7DQoJCSRzb3VyY2VDb2x1bW5zID0gJyAnOw0KDQoNCgkJaWYoICRmaWxlSW5mbyApew0KDQoJCQkkdXJsID0gJGZpbGVJbmZvWydjdXJyZW50VXJpJ107DQoNCgkJCWlmKCBpc3NldCgkdGhpcy0+Y29udGVudHNNYXBbJHVybF0pICl7DQoJCQkJJGlucHV0U291cmNlID0gc3Vic3RyKCR0aGlzLT5jb250ZW50c01hcFskdXJsXSwgMCwgJGluZGV4KTsNCgkJCQkkc291cmNlTGluZXMgPSBleHBsb2RlKCJcbiIsICRpbnB1dFNvdXJjZSk7DQoJCQkJJHNvdXJjZUNvbHVtbnMgPSBlbmQoJHNvdXJjZUxpbmVzKTsNCgkJCX1lbHNlew0KCQkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0ZpbGVuYW1lICcuJHVybC4nIG5vdCBpbiBjb250ZW50c01hcCcpOw0KCQkJfQ0KDQoJCX0NCg0KCQkkbGluZXMgPSBleHBsb2RlKCJcbiIsICRjaHVuayk7DQoJCSRjb2x1bW5zID0gZW5kKCRsaW5lcyk7DQoNCgkJaWYoJGZpbGVJbmZvKXsNCg0KCQkJaWYoISRtYXBMaW5lcyl7DQoJCQkJJHRoaXMtPmdlbmVyYXRvci0+YWRkTWFwcGluZygNCgkJCQkJCSR0aGlzLT5saW5lTnVtYmVyICsgMSwJCQkJCS8vIGdlbmVyYXRlZF9saW5lDQoJCQkJCQkkdGhpcy0+Y29sdW1uLAkJCQkJCQkvLyBnZW5lcmF0ZWRfY29sdW1uDQoJCQkJCQljb3VudCgkc291cmNlTGluZXMpLAkJCQkJLy8gb3JpZ2luYWxfbGluZQ0KCQkJCQkJc3RybGVuKCRzb3VyY2VDb2x1bW5zKSwJCQkJCS8vIG9yaWdpbmFsX2NvbHVtbg0KCQkJCQkJJGZpbGVJbmZvDQoJCQkJKTsNCgkJCX1lbHNlew0KCQkJCWZvcigkaSA9IDAsICRjb3VudCA9IGNvdW50KCRsaW5lcyk7ICRpIDwgJGNvdW50OyAkaSsrKXsNCgkJCQkJJHRoaXMtPmdlbmVyYXRvci0+YWRkTWFwcGluZygNCgkJCQkJCSR0aGlzLT5saW5lTnVtYmVyICsgJGkgKyAxLAkJCQkvLyBnZW5lcmF0ZWRfbGluZQ0KCQkJCQkJJGkgPT09IDAgPyAkdGhpcy0+Y29sdW1uIDogMCwJCQkvLyBnZW5lcmF0ZWRfY29sdW1uDQoJCQkJCQljb3VudCgkc291cmNlTGluZXMpICsgJGksCQkJCS8vIG9yaWdpbmFsX2xpbmUNCgkJCQkJCSRpID09PSAwID8gc3RybGVuKCRzb3VyY2VDb2x1bW5zKSA6IDAsIAkvLyBvcmlnaW5hbF9jb2x1bW4NCgkJCQkJCSRmaWxlSW5mbw0KCQkJCQkpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCWlmKGNvdW50KCRsaW5lcykgPT09IDEpew0KCQkJJHRoaXMtPmNvbHVtbiArPSBzdHJsZW4oJGNvbHVtbnMpOw0KCQl9ZWxzZXsNCgkJCSR0aGlzLT5saW5lTnVtYmVyICs9IGNvdW50KCRsaW5lcykgLSAxOw0KCQkJJHRoaXMtPmNvbHVtbiA9IHN0cmxlbigkY29sdW1ucyk7DQoJCX0NCg0KCQkvLyBhZGQgb25seSBjaHVuaw0KCQlwYXJlbnQ6OmFkZCgkY2h1bmspOw0KCX0NCg0KfSAKCi8qKgogKiBFbmNvZGUgLyBEZWNvZGUgQmFzZTY0IFZMUS4KICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSBTb3VyY2VNYXAKICovCmNsYXNzIExlc3NfU291cmNlTWFwX0Jhc2U2NFZMUSB7CgoJLyoqCgkgKiBTaGlmdAoJICoKCSAqIEB2YXIgaW50ZWdlcgoJICovCglwcml2YXRlICRzaGlmdCA9IDU7CgoJLyoqCgkgKiBNYXNrCgkgKgoJICogQHZhciBpbnRlZ2VyCgkgKi8KCXByaXZhdGUgJG1hc2sgPSAweDFGOyAvLyA9PSAoMSA8PCBzaGlmdCkgPT0gMGIwMDAxMTExMQoKCS8qKgoJICogQ29udGludWF0aW9uIGJpdAoJICoKCSAqIEB2YXIgaW50ZWdlcgoJICovCglwcml2YXRlICRjb250aW51YXRpb25CaXQgPSAweDIwOyAvLyA9PSAobWFzayAtIDEgKSA9PSAwYjAwMTAwMDAwCgoJLyoqCgkgKiBDaGFyIHRvIGludGVnZXIgbWFwCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcml2YXRlICRjaGFyVG9JbnRNYXAgPSBhcnJheSgKCQknQScgPT4gMCwgJ0InID0+IDEsICdDJyA9PiAyLCAnRCcgPT4gMywgJ0UnID0+IDQsICdGJyA9PiA1LCAnRycgPT4gNiwKCQknSCcgPT4gNywnSScgPT4gOCwgJ0onID0+IDksICdLJyA9PiAxMCwgJ0wnID0+IDExLCAnTScgPT4gMTIsICdOJyA9PiAxMywKCQknTycgPT4gMTQsICdQJyA9PiAxNSwgJ1EnID0+IDE2LCAnUicgPT4gMTcsICdTJyA9PiAxOCwgJ1QnID0+IDE5LCAnVScgPT4gMjAsCgkJJ1YnID0+IDIxLCAnVycgPT4gMjIsICdYJyA9PiAyMywgJ1knID0+IDI0LCAnWicgPT4gMjUsICdhJyA9PiAyNiwgJ2InID0+IDI3LAoJCSdjJyA9PiAyOCwgJ2QnID0+IDI5LCAnZScgPT4gMzAsICdmJyA9PiAzMSwgJ2cnID0+IDMyLCAnaCcgPT4gMzMsICdpJyA9PiAzNCwKCQknaicgPT4gMzUsICdrJyA9PiAzNiwgJ2wnID0+IDM3LCAnbScgPT4gMzgsICduJyA9PiAzOSwgJ28nID0+IDQwLCAncCcgPT4gNDEsCgkJJ3EnID0+IDQyLCAncicgPT4gNDMsICdzJyA9PiA0NCwgJ3QnID0+IDQ1LCAndScgPT4gNDYsICd2JyA9PiA0NywgJ3cnID0+IDQ4LAoJCSd4JyA9PiA0OSwgJ3knID0+IDUwLCAneicgPT4gNTEsIDAgPT4gNTIsIDEgPT4gNTMsIDIgPT4gNTQsIDMgPT4gNTUsIDQgPT4gNTYsCgkJNSA9PiA1NywJNiA9PiA1OCwgNyA9PiA1OSwgOCA9PiA2MCwgOSA9PiA2MSwgJysnID0+IDYyLCAnLycgPT4gNjMsCgkpOwoKCS8qKgoJICogSW50ZWdlciB0byBjaGFyIG1hcAoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJpdmF0ZSAkaW50VG9DaGFyTWFwID0gYXJyYXkoCgkJMCA9PiAnQScsIDEgPT4gJ0InLCAyID0+ICdDJywgMyA9PiAnRCcsIDQgPT4gJ0UnLCA1ID0+ICdGJywgNiA9PiAnRycsCgkJNyA9PiAnSCcsIDggPT4gJ0knLCA5ID0+ICdKJywgMTAgPT4gJ0snLCAxMSA9PiAnTCcsIDEyID0+ICdNJywgMTMgPT4gJ04nLAoJCTE0ID0+ICdPJywgMTUgPT4gJ1AnLCAxNiA9PiAnUScsIDE3ID0+ICdSJywgMTggPT4gJ1MnLCAxOSA9PiAnVCcsIDIwID0+ICdVJywKCQkyMSA9PiAnVicsIDIyID0+ICdXJywgMjMgPT4gJ1gnLCAyNCA9PiAnWScsIDI1ID0+ICdaJywgMjYgPT4gJ2EnLCAyNyA9PiAnYicsCgkJMjggPT4gJ2MnLCAyOSA9PiAnZCcsIDMwID0+ICdlJywgMzEgPT4gJ2YnLCAzMiA9PiAnZycsIDMzID0+ICdoJywgMzQgPT4gJ2knLAoJCTM1ID0+ICdqJywgMzYgPT4gJ2snLCAzNyA9PiAnbCcsIDM4ID0+ICdtJywgMzkgPT4gJ24nLCA0MCA9PiAnbycsIDQxID0+ICdwJywKCQk0MiA9PiAncScsIDQzID0+ICdyJywgNDQgPT4gJ3MnLCA0NSA9PiAndCcsIDQ2ID0+ICd1JywgNDcgPT4gJ3YnLCA0OCA9PiAndycsCgkJNDkgPT4gJ3gnLCA1MCA9PiAneScsIDUxID0+ICd6JywgNTIgPT4gJzAnLCA1MyA9PiAnMScsIDU0ID0+ICcyJywgNTUgPT4gJzMnLAoJCTU2ID0+ICc0JywgNTcgPT4gJzUnLCA1OCA9PiAnNicsIDU5ID0+ICc3JywgNjAgPT4gJzgnLCA2MSA9PiAnOScsIDYyID0+ICcrJywKCQk2MyA9PiAnLycsCgkpOwoKCS8qKgoJICogQ29uc3RydWN0b3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCl7CgkJLy8gSSBsZWF2ZSBpdCBoZXJlIGZvciBmdXR1cmUgcmVmZXJlbmNlCgkJLy8gZm9yZWFjaChzdHJfc3BsaXQoJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nKSBhcyAkaSA9PiAkY2hhcikKCQkvLyB7CgkJLy8JICR0aGlzLT5jaGFyVG9JbnRNYXBbJGNoYXJdID0gJGk7CgkJLy8JICR0aGlzLT5pbnRUb0NoYXJNYXBbJGldID0gJGNoYXI7CgkJLy8gfQoJfQoKCS8qKgoJICogQ29udmVydCBmcm9tIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgdG8gYSB2YWx1ZSB3aGVyZSB0aGUgc2lnbiBiaXQgaXMKCSAqIGlzIHBsYWNlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LglGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6CgkgKgkgMSBiZWNvbWVzIDIgKDEwIGJpbmFyeSksIC0xIGJlY29tZXMgMyAoMTEgYmluYXJ5KQoJICoJIDIgYmVjb21lcyA0ICgxMDAgYmluYXJ5KSwgLTIgYmVjb21lcyA1ICgxMDEgYmluYXJ5KQoJICogV2UgZ2VuZXJhdGUgdGhlIHZhbHVlIGZvciAzMiBiaXQgbWFjaGluZXMsIGhlbmNlIC0yMTQ3NDgzNjQ4IGJlY29tZXMgMSwgbm90IDQyOTQ5NjcyOTcsCgkgKiBldmVuIG9uIGEgNjQgYml0IG1hY2hpbmUuCgkgKiBAcGFyYW0gc3RyaW5nICRhVmFsdWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRvVkxRU2lnbmVkKCRhVmFsdWUpewoJCXJldHVybiAweGZmZmZmZmZmICYgKCRhVmFsdWUgPCAwID8gKCgtJGFWYWx1ZSkgPDwgMSkgKyAxIDogKCRhVmFsdWUgPDwgMSkgKyAwKTsKCX0KCgkvKioKCSAqIENvbnZlcnQgdG8gYSB0d28tY29tcGxlbWVudCB2YWx1ZSBmcm9tIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzCgkgKiBpcyBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gRm9yIGV4YW1wbGUsIGFzIGRlY2ltYWxzOgoJICoJIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTEKCSAqCSA0ICgxMDAgYmluYXJ5KSBiZWNvbWVzIDIsIDUgKDEwMSBiaW5hcnkpIGJlY29tZXMgLTIKCSAqIFdlIGFzc3VtZSB0aGF0IHRoZSB2YWx1ZSB3YXMgZ2VuZXJhdGVkIHdpdGggYSAzMiBiaXQgbWFjaGluZSBpbiBtaW5kLgoJICogSGVuY2UKCSAqCSAxIGJlY29tZXMgLTIxNDc0ODM2NDgKCSAqIGV2ZW4gb24gYSA2NCBiaXQgbWFjaGluZS4KCSAqIEBwYXJhbSBpbnRlZ2VyICRhVmFsdWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGZyb21WTFFTaWduZWQoJGFWYWx1ZSl7CgkJcmV0dXJuICRhVmFsdWUgJiAxID8gJHRoaXMtPnplcm9GaWxsKH4kYVZhbHVlICsgMiwgMSkgfCAoLTEgLSAweDdmZmZmZmZmKSA6ICR0aGlzLT56ZXJvRmlsbCgkYVZhbHVlLCAxKTsKCX0KCgkvKioKCSAqIFJldHVybiB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRhVmFsdWUgVGhlIHZhbHVlIHRvIGVuY29kZQoJICogQHJldHVybiBzdHJpbmcgVGhlIGVuY29kZWQgdmFsdWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGVuY29kZSgkYVZhbHVlKXsKCQkkZW5jb2RlZCA9ICcnOwoJCSR2bHEgPSAkdGhpcy0+dG9WTFFTaWduZWQoJGFWYWx1ZSk7CgkJZG8KCQl7CgkJCSRkaWdpdCA9ICR2bHEgJiAkdGhpcy0+bWFzazsKCQkJJHZscSA9ICR0aGlzLT56ZXJvRmlsbCgkdmxxLCAkdGhpcy0+c2hpZnQpOwoJCQlpZigkdmxxID4gMCl7CgkJCQkkZGlnaXQgfD0gJHRoaXMtPmNvbnRpbnVhdGlvbkJpdDsKCQkJfQoJCQkkZW5jb2RlZCAuPSAkdGhpcy0+YmFzZTY0RW5jb2RlKCRkaWdpdCk7CgkJfSB3aGlsZSgkdmxxID4gMCk7CgoJCXJldHVybiAkZW5jb2RlZDsKCX0KCgkvKioKCSAqIFJldHVybiB0aGUgdmFsdWUgZGVjb2RlZCBmcm9tIGJhc2UgNjQgVkxRLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGVuY29kZWQgVGhlIGVuY29kZWQgdmFsdWUgdG8gZGVjb2RlCgkgKiBAcmV0dXJuIGludGVnZXIgVGhlIGRlY29kZWQgdmFsdWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRlY29kZSgkZW5jb2RlZCl7CgkJJHZscSA9IDA7CgkJJGkgPSAwOwoJCWRvCgkJewoJCQkkZGlnaXQgPSAkdGhpcy0+YmFzZTY0RGVjb2RlKCRlbmNvZGVkWyRpXSk7CgkJCSR2bHEgfD0gKCRkaWdpdCAmICR0aGlzLT5tYXNrKSA8PCAoJGkgKiAkdGhpcy0+c2hpZnQpOwoJCQkkaSsrOwoJCX0gd2hpbGUoJGRpZ2l0ICYgJHRoaXMtPmNvbnRpbnVhdGlvbkJpdCk7CgoJCXJldHVybiAkdGhpcy0+ZnJvbVZMUVNpZ25lZCgkdmxxKTsKCX0KCgkvKioKCSAqIFJpZ2h0IHNoaWZ0IHdpdGggemVybyBmaWxsLgoJICoKCSAqIEBwYXJhbSBpbnRlZ2VyICRhIG51bWJlciB0byBzaGlmdAoJICogQHBhcmFtIGludGVnZXIgJGIgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQKCSAqIEByZXR1cm4gaW50ZWdlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gemVyb0ZpbGwoJGEsICRiKXsKCQlyZXR1cm4gKCRhID49IDApID8gKCRhID4+ICRiKSA6ICgkYSA+PiAkYikgJiAoUEhQX0lOVF9NQVggPj4gKCRiIC0gMSkpOwoJfQoKCS8qKgoJICogRW5jb2RlIHNpbmdsZSA2LWJpdCBkaWdpdCBhcyBiYXNlNjQuCgkgKgoJICogQHBhcmFtIGludGVnZXIgJG51bWJlcgoJICogQHJldHVybiBzdHJpbmcKCSAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIHRoZSBudW1iZXIgaXMgaW52YWxpZAoJICovCglwdWJsaWMgZnVuY3Rpb24gYmFzZTY0RW5jb2RlKCRudW1iZXIpewoJCWlmKCRudW1iZXIgPCAwIHx8ICRudW1iZXIgPiA2Myl7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oc3ByaW50ZignSW52YWxpZCBudW1iZXIgIiVzIiBnaXZlbi4gTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYzLicsICRudW1iZXIpKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5pbnRUb0NoYXJNYXBbJG51bWJlcl07Cgl9CgoJLyoqCgkgKiBEZWNvZGUgc2luZ2xlIDYtYml0IGRpZ2l0IGZyb20gYmFzZTY0CgkgKgoJICogQHBhcmFtIHN0cmluZyAkY2hhcgoJICogQHJldHVybiBudW1iZXIKCSAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIHRoZSBudW1iZXIgaXMgaW52YWxpZAoJICovCglwdWJsaWMgZnVuY3Rpb24gYmFzZTY0RGVjb2RlKCRjaGFyKXsKCQlpZighYXJyYXlfa2V5X2V4aXN0cygkY2hhciwgJHRoaXMtPmNoYXJUb0ludE1hcCkpewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgYmFzZSA2NCBkaWdpdCAiJXMiIGdpdmVuLicsICRjaGFyKSk7CgkJfQoJCXJldHVybiAkdGhpcy0+Y2hhclRvSW50TWFwWyRjaGFyXTsKCX0KCn0KIA0KDQovKioNCiAqIFNvdXJjZSBtYXAgZ2VuZXJhdG9yDQogKg0KICogQHBhY2thZ2UgTGVzcw0KICogQHN1YnBhY2thZ2UgT3V0cHV0DQogKi8NCmNsYXNzIExlc3NfU291cmNlTWFwX0dlbmVyYXRvciBleHRlbmRzIExlc3NfQ29uZmlndXJhYmxlIHsNCg0KCS8qKg0KCSAqIFdoYXQgdmVyc2lvbiBvZiBzb3VyY2UgbWFwIGRvZXMgdGhlIGdlbmVyYXRvciBnZW5lcmF0ZT8NCgkgKi8NCgljb25zdCBWRVJTSU9OID0gMzsNCg0KCS8qKg0KCSAqIEFycmF5IG9mIGRlZmF1bHQgb3B0aW9ucw0KCSAqDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByb3RlY3RlZCAkZGVmYXVsdE9wdGlvbnMgPSBhcnJheSgNCgkJCS8vIGFuIG9wdGlvbmFsIHNvdXJjZSByb290LCB1c2VmdWwgZm9yIHJlbG9jYXRpbmcgc291cmNlIGZpbGVzDQoJCQkvLyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlICdzb3VyY2VzJyBlbnRyeS4NCgkJCS8vIFRoaXMgdmFsdWUgaXMgcHJlcGVuZGVkIHRvIHRoZSBpbmRpdmlkdWFsIGVudHJpZXMgaW4gdGhlICdzb3VyY2UnIGZpZWxkLg0KCQkJJ3NvdXJjZVJvb3QnCQkJPT4gJycsDQoNCgkJCS8vIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIHRoYXQgdGhpcyBzb3VyY2UgbWFwIGlzIGFzc29jaWF0ZWQgd2l0aC4NCgkJCSdzb3VyY2VNYXBGaWxlbmFtZScJCT0+IG51bGwsDQoNCgkJCS8vIHVybCBvZiB0aGUgbWFwDQoJCQknc291cmNlTWFwVVJMJwkJCT0+IG51bGwsDQoNCgkJCS8vIGFic29sdXRlIHBhdGggdG8gYSBmaWxlIHRvIHdyaXRlIHRoZSBtYXAgdG8NCgkJCSdzb3VyY2VNYXBXcml0ZVRvJwkJPT4gbnVsbCwNCg0KCQkJLy8gb3V0cHV0IHNvdXJjZSBjb250ZW50cz8NCgkJCSdvdXRwdXRTb3VyY2VGaWxlcycJCT0+IGZhbHNlLA0KDQoJCQkvLyBiYXNlIHBhdGggZm9yIGZpbGVuYW1lIG5vcm1hbGl6YXRpb24NCgkJCSdzb3VyY2VNYXBSb290cGF0aCcJCT0+ICcnLA0KDQoJCQkvLyBiYXNlIHBhdGggZm9yIGZpbGVuYW1lIG5vcm1hbGl6YXRpb24NCgkJCSdzb3VyY2VNYXBCYXNlcGF0aCcgICA9PiAnJw0KCSk7DQoNCgkvKioNCgkgKiBUaGUgYmFzZTY0IFZMUSBlbmNvZGVyDQoJICoNCgkgKiBAdmFyIExlc3NfU291cmNlTWFwX0Jhc2U2NFZMUQ0KCSAqLw0KCXByb3RlY3RlZCAkZW5jb2RlcjsNCg0KCS8qKg0KCSAqIEFycmF5IG9mIG1hcHBpbmdzDQoJICoNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJvdGVjdGVkICRtYXBwaW5ncyA9IGFycmF5KCk7DQoNCgkvKioNCgkgKiBUaGUgcm9vdCBub2RlDQoJICoNCgkgKiBAdmFyIExlc3NfVHJlZV9SdWxlc2V0DQoJICovDQoJcHJvdGVjdGVkICRyb290Ow0KDQoJLyoqDQoJICogQXJyYXkgb2YgY29udGVudHMgbWFwDQoJICoNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJvdGVjdGVkICRjb250ZW50c01hcCA9IGFycmF5KCk7DQoNCgkvKioNCgkgKiBGaWxlIHRvIGNvbnRlbnQgbWFwDQoJICoNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJvdGVjdGVkICRzb3VyY2VzID0gYXJyYXkoKTsNCglwcm90ZWN0ZWQgJHNvdXJjZV9rZXlzID0gYXJyYXkoKTsNCg0KCS8qKg0KCSAqIENvbnN0cnVjdG9yDQoJICoNCgkgKiBAcGFyYW0gTGVzc19UcmVlX1J1bGVzZXQgJHJvb3QgVGhlIHJvb3Qgbm9kZQ0KCSAqIEBwYXJhbSBhcnJheSAkb3B0aW9ucyBBcnJheSBvZiBvcHRpb25zDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KExlc3NfVHJlZV9SdWxlc2V0ICRyb290LCAkY29udGVudHNNYXAsICRvcHRpb25zID0gYXJyYXkoKSl7DQoJCSR0aGlzLT5yb290ID0gJHJvb3Q7DQoJCSR0aGlzLT5jb250ZW50c01hcCA9ICRjb250ZW50c01hcDsNCgkJJHRoaXMtPmVuY29kZXIgPSBuZXcgTGVzc19Tb3VyY2VNYXBfQmFzZTY0VkxRKCk7DQoNCgkJJHRoaXMtPlNldE9wdGlvbnMoJG9wdGlvbnMpOw0KCQkNCgkJJHRoaXMtPm9wdGlvbnNbJ3NvdXJjZU1hcFJvb3RwYXRoJ10gPSAkdGhpcy0+Zml4V2luZG93c1BhdGgoJHRoaXMtPm9wdGlvbnNbJ3NvdXJjZU1hcFJvb3RwYXRoJ10sIHRydWUpOw0KCQkkdGhpcy0+b3B0aW9uc1snc291cmNlTWFwQmFzZXBhdGgnXSA9ICR0aGlzLT5maXhXaW5kb3dzUGF0aCgkdGhpcy0+b3B0aW9uc1snc291cmNlTWFwQmFzZXBhdGgnXSwgdHJ1ZSk7DQoJfQ0KDQoJLyoqDQoJICogR2VuZXJhdGVzIHRoZSBDU1MNCgkgKg0KCSAqIEByZXR1cm4gc3RyaW5nDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlQ1NTKCl7DQoJCSRvdXRwdXQgPSBuZXcgTGVzc19PdXRwdXRfTWFwcGVkKCR0aGlzLT5jb250ZW50c01hcCwgJHRoaXMpOw0KDQoJCS8vIGNhdGNoIHRoZSBvdXRwdXQNCgkJJHRoaXMtPnJvb3QtPmdlbkNTUygkb3V0cHV0KTsNCg0KDQoJCSRzb3VyY2VNYXBVcmwJCQkJPSAkdGhpcy0+Z2V0T3B0aW9uKCdzb3VyY2VNYXBVUkwnKTsNCgkJJHNvdXJjZU1hcEZpbGVuYW1lCQkJPSAkdGhpcy0+Z2V0T3B0aW9uKCdzb3VyY2VNYXBGaWxlbmFtZScpOw0KCQkkc291cmNlTWFwQ29udGVudAkJCT0gJHRoaXMtPmdlbmVyYXRlSnNvbigpOw0KCQkkc291cmNlTWFwV3JpdGVUbwkJCT0gJHRoaXMtPmdldE9wdGlvbignc291cmNlTWFwV3JpdGVUbycpOw0KDQoJCWlmKCAhJHNvdXJjZU1hcFVybCAmJiAkc291cmNlTWFwRmlsZW5hbWUgKXsNCgkJCSRzb3VyY2VNYXBVcmwgPSAkdGhpcy0+bm9ybWFsaXplRmlsZW5hbWUoJHNvdXJjZU1hcEZpbGVuYW1lKTsNCgkJfQ0KDQoJCS8vIHdyaXRlIG1hcCB0byBhIGZpbGUNCgkJaWYoICRzb3VyY2VNYXBXcml0ZVRvICl7DQoJCQkkdGhpcy0+c2F2ZU1hcCgkc291cmNlTWFwV3JpdGVUbywgJHNvdXJjZU1hcENvbnRlbnQpOw0KCQl9DQoNCgkJLy8gaW5saW5lIHRoZSBtYXANCgkJaWYoICEkc291cmNlTWFwVXJsICl7DQoJCQkkc291cmNlTWFwVXJsID0gc3ByaW50ZignZGF0YTphcHBsaWNhdGlvbi9qc29uLCVzJywgTGVzc19GdW5jdGlvbnM6OmVuY29kZVVSSUNvbXBvbmVudCgkc291cmNlTWFwQ29udGVudCkpOw0KCQl9DQoNCgkJaWYoICRzb3VyY2VNYXBVcmwgKXsNCgkJCSRvdXRwdXQtPmFkZCggc3ByaW50ZignLyojIHNvdXJjZU1hcHBpbmdVUkw9JXMgKi8nLCAkc291cmNlTWFwVXJsKSApOw0KCQl9DQoNCgkJcmV0dXJuICRvdXRwdXQtPnRvU3RyaW5nKCk7DQoJfQ0KDQoJLyoqDQoJICogU2F2ZXMgdGhlIHNvdXJjZSBtYXAgdG8gYSBmaWxlDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRmaWxlIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgZmlsZQ0KCSAqIEBwYXJhbSBzdHJpbmcgJGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gd3JpdGUNCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgc2F2ZWQNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gc2F2ZU1hcCgkZmlsZSwgJGNvbnRlbnQpew0KCQkkZGlyID0gZGlybmFtZSgkZmlsZSk7DQoJCS8vIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdA0KCQlpZiggIWlzX2RpcigkZGlyKSApew0KCQkJLy8gRklYTUU6IGNyZWF0ZSB0aGUgZGlyIGF1dG9tYXRpY2FsbHk/DQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHNwcmludGYoJ1RoZSBkaXJlY3RvcnkgIiVzIiBkb2VzIG5vdCBleGlzdC4gQ2Fubm90IHNhdmUgdGhlIHNvdXJjZSBtYXAuJywgJGRpcikpOw0KCQl9DQoJCS8vIEZJWE1FOiBwcm9wZXIgc2F2aW5nLCB3aXRoIGRpciB3cml0ZSBjaGVjayENCgkJaWYoZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRjb250ZW50KSA9PT0gZmFsc2Upew0KCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzcHJpbnRmKCdDYW5ub3Qgc2F2ZSB0aGUgc291cmNlIG1hcCB0byAiJXMiJywgJGZpbGUpKTsNCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCgkvKioNCgkgKiBOb3JtYWxpemVzIHRoZSBmaWxlbmFtZQ0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBub3JtYWxpemVGaWxlbmFtZSgkZmlsZW5hbWUpew0KDQoJCSRmaWxlbmFtZSA9ICR0aGlzLT5maXhXaW5kb3dzUGF0aCgkZmlsZW5hbWUpOw0KDQoJCSRyb290cGF0aCA9ICR0aGlzLT5nZXRPcHRpb24oJ3NvdXJjZU1hcFJvb3RwYXRoJyk7DQoJCSRiYXNlUGF0aCA9ICR0aGlzLT5nZXRPcHRpb24oJ3NvdXJjZU1hcEJhc2VwYXRoJyk7DQoNCgkJLy8gIlRyaW0iIHRoZSAnc291cmNlTWFwQmFzZXBhdGgnIGZyb20gdGhlIG91dHB1dCBmaWxlbmFtZS4NCgkJaWYgKHN0cnBvcygkZmlsZW5hbWUsICRiYXNlUGF0aCkgPT09IDApIHsNCgkJCSRmaWxlbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUsIHN0cmxlbigkYmFzZVBhdGgpKTsNCgkJfQ0KDQoJCS8vIFJlbW92ZSBleHRyYSBsZWFkaW5nIHBhdGggc2VwYXJhdG9ycy4NCgkJaWYoc3RycG9zKCRmaWxlbmFtZSwgJ1xcJykgPT09IDAgfHwgc3RycG9zKCRmaWxlbmFtZSwgJy8nKSA9PT0gMCl7DQoJCQkkZmlsZW5hbWUgPSBzdWJzdHIoJGZpbGVuYW1lLCAxKTsNCgkJfQ0KDQoJCXJldHVybiAkcm9vdHBhdGggLiAkZmlsZW5hbWU7DQoJfQ0KDQoJLyoqDQoJICogQWRkcyBhIG1hcHBpbmcNCgkgKg0KCSAqIEBwYXJhbSBpbnRlZ2VyICRnZW5lcmF0ZWRMaW5lIFRoZSBsaW5lIG51bWJlciBpbiBnZW5lcmF0ZWQgZmlsZQ0KCSAqIEBwYXJhbSBpbnRlZ2VyICRnZW5lcmF0ZWRDb2x1bW4gVGhlIGNvbHVtbiBudW1iZXIgaW4gZ2VuZXJhdGVkIGZpbGUNCgkgKiBAcGFyYW0gaW50ZWdlciAkb3JpZ2luYWxMaW5lIFRoZSBsaW5lIG51bWJlciBpbiBvcmlnaW5hbCBmaWxlDQoJICogQHBhcmFtIGludGVnZXIgJG9yaWdpbmFsQ29sdW1uIFRoZSBjb2x1bW4gbnVtYmVyIGluIG9yaWdpbmFsIGZpbGUNCgkgKiBAcGFyYW0gc3RyaW5nICRzb3VyY2VGaWxlIFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhZGRNYXBwaW5nKCRnZW5lcmF0ZWRMaW5lLCAkZ2VuZXJhdGVkQ29sdW1uLCAkb3JpZ2luYWxMaW5lLCAkb3JpZ2luYWxDb2x1bW4sICRmaWxlSW5mbyApew0KDQoJCSR0aGlzLT5tYXBwaW5nc1tdID0gYXJyYXkoDQoJCQknZ2VuZXJhdGVkX2xpbmUnID0+ICRnZW5lcmF0ZWRMaW5lLA0KCQkJJ2dlbmVyYXRlZF9jb2x1bW4nID0+ICRnZW5lcmF0ZWRDb2x1bW4sDQoJCQknb3JpZ2luYWxfbGluZScgPT4gJG9yaWdpbmFsTGluZSwNCgkJCSdvcmlnaW5hbF9jb2x1bW4nID0+ICRvcmlnaW5hbENvbHVtbiwNCgkJCSdzb3VyY2VfZmlsZScgPT4gJGZpbGVJbmZvWydjdXJyZW50VXJpJ10NCgkJKTsNCg0KCQkkdGhpcy0+c291cmNlc1skZmlsZUluZm9bJ2N1cnJlbnRVcmknXV0gPSAkZmlsZUluZm9bJ2ZpbGVuYW1lJ107DQoJfQ0KDQoNCgkvKioNCgkgKiBHZW5lcmF0ZXMgdGhlIEpTT04gc291cmNlIG1hcA0KCSAqDQoJICogQHJldHVybiBzdHJpbmcNCgkgKiBAc2VlIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMVUxUkdBZWhRd1J5cFVUb3ZGMUtSbHBpT0Z6ZTBiLV8yZ2M2ZkFIMEtZMGsvZWRpdCMNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVKc29uKCl7DQoNCgkJJHNvdXJjZU1hcCA9IGFycmF5KCk7DQoJCSRtYXBwaW5ncyA9ICR0aGlzLT5nZW5lcmF0ZU1hcHBpbmdzKCk7DQoNCgkJLy8gRmlsZSB2ZXJzaW9uIChhbHdheXMgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBvYmplY3QpIGFuZCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4NCgkJJHNvdXJjZU1hcFsndmVyc2lvbiddID0gc2VsZjo6VkVSU0lPTjsNCg0KDQoJCS8vIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIHRoYXQgdGhpcyBzb3VyY2UgbWFwIGlzIGFzc29jaWF0ZWQgd2l0aC4NCgkJJGZpbGUgPSAkdGhpcy0+Z2V0T3B0aW9uKCdzb3VyY2VNYXBGaWxlbmFtZScpOw0KCQlpZiggJGZpbGUgKXsNCgkJCSRzb3VyY2VNYXBbJ2ZpbGUnXSA9ICRmaWxlOw0KCQl9DQoNCg0KCQkvLyBBbiBvcHRpb25hbCBzb3VyY2Ugcm9vdCwgdXNlZnVsIGZvciByZWxvY2F0aW5nIHNvdXJjZSBmaWxlcyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlICdzb3VyY2VzJyBlbnRyeS4JVGhpcyB2YWx1ZSBpcyBwcmVwZW5kZWQgdG8gdGhlIGluZGl2aWR1YWwgZW50cmllcyBpbiB0aGUgJ3NvdXJjZScgZmllbGQuDQoJCSRyb290ID0gJHRoaXMtPmdldE9wdGlvbignc291cmNlUm9vdCcpOw0KCQlpZiggJHJvb3QgKXsNCgkJCSRzb3VyY2VNYXBbJ3NvdXJjZVJvb3QnXSA9ICRyb290Ow0KCQl9DQoNCg0KCQkvLyBBIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcyB1c2VkIGJ5IHRoZSAnbWFwcGluZ3MnIGVudHJ5Lg0KCQkkc291cmNlTWFwWydzb3VyY2VzJ10gPSBhcnJheSgpOw0KCQlmb3JlYWNoKCR0aGlzLT5zb3VyY2VzIGFzICRzb3VyY2VfdXJpID0+ICRzb3VyY2VfZmlsZW5hbWUpew0KCQkJJHNvdXJjZU1hcFsnc291cmNlcyddW10gPSAkdGhpcy0+bm9ybWFsaXplRmlsZW5hbWUoJHNvdXJjZV9maWxlbmFtZSk7DQoJCX0NCg0KDQoJCS8vIEEgbGlzdCBvZiBzeW1ib2wgbmFtZXMgdXNlZCBieSB0aGUgJ21hcHBpbmdzJyBlbnRyeS4NCgkJJHNvdXJjZU1hcFsnbmFtZXMnXSA9IGFycmF5KCk7DQoNCgkJLy8gQSBzdHJpbmcgd2l0aCB0aGUgZW5jb2RlZCBtYXBwaW5nIGRhdGEuDQoJCSRzb3VyY2VNYXBbJ21hcHBpbmdzJ10gPSAkbWFwcGluZ3M7DQoNCgkJaWYoICR0aGlzLT5nZXRPcHRpb24oJ291dHB1dFNvdXJjZUZpbGVzJykgKXsNCgkJCS8vIEFuIG9wdGlvbmFsIGxpc3Qgb2Ygc291cmNlIGNvbnRlbnQsIHVzZWZ1bCB3aGVuIHRoZSAnc291cmNlJyBjYW4ndCBiZSBob3N0ZWQuDQoJCQkvLyBUaGUgY29udGVudHMgYXJlIGxpc3RlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgc291cmNlcyBhYm92ZS4NCgkJCS8vICdudWxsJyBtYXkgYmUgdXNlZCBpZiBzb21lIG9yaWdpbmFsIHNvdXJjZXMgc2hvdWxkIGJlIHJldHJpZXZlZCBieSBuYW1lLg0KCQkJJHNvdXJjZU1hcFsnc291cmNlc0NvbnRlbnQnXSA9ICR0aGlzLT5nZXRTb3VyY2VzQ29udGVudCgpOw0KCQl9DQoNCgkJLy8gbGVzcy5qcyBjb21wYXQgZml4ZXMNCgkJaWYoIGNvdW50KCRzb3VyY2VNYXBbJ3NvdXJjZXMnXSkgJiYgZW1wdHkoJHNvdXJjZU1hcFsnc291cmNlUm9vdCddKSApew0KCQkJdW5zZXQoJHNvdXJjZU1hcFsnc291cmNlUm9vdCddKTsNCgkJfQ0KDQoJCXJldHVybiBqc29uX2VuY29kZSgkc291cmNlTWFwKTsNCgl9DQoNCgkvKioNCgkgKiBSZXR1cm5zIHRoZSBzb3VyY2VzIGNvbnRlbnRzDQoJICoNCgkgKiBAcmV0dXJuIGFycmF5fG51bGwNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0U291cmNlc0NvbnRlbnQoKXsNCgkJaWYoZW1wdHkoJHRoaXMtPnNvdXJjZXMpKXsNCgkJCXJldHVybjsNCgkJfQ0KCQkkY29udGVudCA9IGFycmF5KCk7DQoJCWZvcmVhY2goJHRoaXMtPnNvdXJjZXMgYXMgJHNvdXJjZUZpbGUpew0KCQkJJGNvbnRlbnRbXSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRzb3VyY2VGaWxlKTsNCgkJfQ0KCQlyZXR1cm4gJGNvbnRlbnQ7DQoJfQ0KDQoJLyoqDQoJICogR2VuZXJhdGVzIHRoZSBtYXBwaW5ncyBzdHJpbmcNCgkgKg0KCSAqIEByZXR1cm4gc3RyaW5nDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlTWFwcGluZ3MoKXsNCg0KCQlpZiggIWNvdW50KCR0aGlzLT5tYXBwaW5ncykgKXsNCgkJCXJldHVybiAnJzsNCgkJfQ0KDQoJCSR0aGlzLT5zb3VyY2Vfa2V5cyA9IGFycmF5X2ZsaXAoYXJyYXlfa2V5cygkdGhpcy0+c291cmNlcykpOw0KDQoNCgkJLy8gZ3JvdXAgbWFwcGluZ3MgYnkgZ2VuZXJhdGVkIGxpbmUgbnVtYmVyLg0KCQkkZ3JvdXBlZE1hcCA9ICRncm91cGVkTWFwRW5jb2RlZCA9IGFycmF5KCk7DQoJCWZvcmVhY2goJHRoaXMtPm1hcHBpbmdzIGFzICRtKXsNCgkJCSRncm91cGVkTWFwWyRtWydnZW5lcmF0ZWRfbGluZSddXVtdID0gJG07DQoJCX0NCgkJa3NvcnQoJGdyb3VwZWRNYXApOw0KDQoJCSRsYXN0R2VuZXJhdGVkTGluZSA9ICRsYXN0T3JpZ2luYWxJbmRleCA9ICRsYXN0T3JpZ2luYWxMaW5lID0gJGxhc3RPcmlnaW5hbENvbHVtbiA9IDA7DQoNCgkJZm9yZWFjaCgkZ3JvdXBlZE1hcCBhcyAkbGluZU51bWJlciA9PiAkbGluZV9tYXApew0KCQkJd2hpbGUoKyskbGFzdEdlbmVyYXRlZExpbmUgPCAkbGluZU51bWJlcil7DQoJCQkJJGdyb3VwZWRNYXBFbmNvZGVkW10gPSAnOyc7DQoJCQl9DQoNCgkJCSRsaW5lTWFwRW5jb2RlZCA9IGFycmF5KCk7DQoJCQkkbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7DQoNCgkJCWZvcmVhY2goJGxpbmVfbWFwIGFzICRtKXsNCgkJCQkkbWFwRW5jb2RlZCA9ICR0aGlzLT5lbmNvZGVyLT5lbmNvZGUoJG1bJ2dlbmVyYXRlZF9jb2x1bW4nXSAtICRsYXN0R2VuZXJhdGVkQ29sdW1uKTsNCgkJCQkkbGFzdEdlbmVyYXRlZENvbHVtbiA9ICRtWydnZW5lcmF0ZWRfY29sdW1uJ107DQoNCgkJCQkvLyBmaW5kIHRoZSBpbmRleA0KCQkJCWlmKCAkbVsnc291cmNlX2ZpbGUnXSApew0KCQkJCQkkaW5kZXggPSAkdGhpcy0+ZmluZEZpbGVJbmRleCgkbVsnc291cmNlX2ZpbGUnXSk7DQoJCQkJCWlmKCAkaW5kZXggIT09IGZhbHNlICl7DQoJCQkJCQkkbWFwRW5jb2RlZCAuPSAkdGhpcy0+ZW5jb2Rlci0+ZW5jb2RlKCRpbmRleCAtICRsYXN0T3JpZ2luYWxJbmRleCk7DQoJCQkJCQkkbGFzdE9yaWdpbmFsSW5kZXggPSAkaW5kZXg7DQoNCgkJCQkJCS8vIGxpbmVzIGFyZSBzdG9yZWQgMC1iYXNlZCBpbiBTb3VyY2VNYXAgc3BlYyB2ZXJzaW9uIDMNCgkJCQkJCSRtYXBFbmNvZGVkIC49ICR0aGlzLT5lbmNvZGVyLT5lbmNvZGUoJG1bJ29yaWdpbmFsX2xpbmUnXSAtIDEgLSAkbGFzdE9yaWdpbmFsTGluZSk7DQoJCQkJCQkkbGFzdE9yaWdpbmFsTGluZSA9ICRtWydvcmlnaW5hbF9saW5lJ10gLSAxOw0KDQoJCQkJCQkkbWFwRW5jb2RlZCAuPSAkdGhpcy0+ZW5jb2Rlci0+ZW5jb2RlKCRtWydvcmlnaW5hbF9jb2x1bW4nXSAtICRsYXN0T3JpZ2luYWxDb2x1bW4pOw0KCQkJCQkJJGxhc3RPcmlnaW5hbENvbHVtbiA9ICRtWydvcmlnaW5hbF9jb2x1bW4nXTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCSRsaW5lTWFwRW5jb2RlZFtdID0gJG1hcEVuY29kZWQ7DQoJCQl9DQoNCgkJCSRncm91cGVkTWFwRW5jb2RlZFtdID0gaW1wbG9kZSgnLCcsICRsaW5lTWFwRW5jb2RlZCkgLiAnOyc7DQoJCX0NCg0KCQlyZXR1cm4gcnRyaW0oaW1wbG9kZSgkZ3JvdXBlZE1hcEVuY29kZWQpLCAnOycpOw0KCX0NCg0KCS8qKg0KCSAqIEZpbmRzIHRoZSBpbmRleCBmb3IgdGhlIGZpbGVuYW1lDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZQ0KCSAqIEByZXR1cm4gaW50ZWdlcnxmYWxzZQ0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBmaW5kRmlsZUluZGV4KCRmaWxlbmFtZSl7DQoJCXJldHVybiAkdGhpcy0+c291cmNlX2tleXNbJGZpbGVuYW1lXTsNCgl9DQoNCgkvKioNCgkgKiBmaXggd2luZG93cyBwYXRocw0KCSAqIEBwYXJhbSAgc3RyaW5nICRwYXRoDQoJICogQHJldHVybiBzdHJpbmcgICAgICANCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZml4V2luZG93c1BhdGgoJHBhdGgsICRhZGRFbmRTbGFzaCA9IGZhbHNlKXsNCgkJJHNsYXNoID0gKCRhZGRFbmRTbGFzaCkgPyAnLycgOiAnJzsNCgkJaWYoICFlbXB0eSgkcGF0aCkgKXsNCgkJCSRwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcGF0aCk7DQoJCQkkcGF0aCA9IHJ0cmltKCRwYXRoLCcvJykgLiAkc2xhc2g7DQoJCX0NCg0KCQlyZXR1cm4gJHBhdGg7DQoJfQ0KDQp9IA==]]></data>
	</file>
	<file>
	  <filename>/extra/lessphp_oyejorge/Version.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBSZWxlYXNlIG51bWJlcnMKICoKICogQHBhY2thZ2UgTGVzcwogKiBAc3VicGFja2FnZSB2ZXJzaW9uCiAqLwpjbGFzcyBMZXNzX1ZlcnNpb257CgoJY29uc3QgdmVyc2lvbiA9ICcxLjcuMC45JzsJCQkvLyBUaGUgY3VycmVudCBidWlsZCBudW1iZXIgb2YgbGVzcy5waHAKCWNvbnN0IGxlc3NfdmVyc2lvbiA9ICcxLjcnOwkJCS8vIFRoZSBsZXNzLmpzIHZlcnNpb24gdGhhdCB0aGlzIGJ1aWxkIHNob3VsZCBiZSBjb21wYXRpYmxlIHdpdGgKICAgIGNvbnN0IGNhY2hlX3ZlcnNpb24gPSAnMTcwJzsJCS8vIFRoZSBwYXJzZXIgY2FjaGUgdmVyc2lvbgoKfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/bin/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/bin/pscss</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgcGhwCjw/cGhwCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDE1IExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL2xlYWZvLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKCmlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjQnKSA8IDApIHsKICAgIGRpZSgnUmVxdWlyZXMgUEhQIDUuNCBvciBhYm92ZScpOwp9CgppbmNsdWRlIF9fRElSX18gLiAnLy4uL3Njc3MuaW5jLnBocCc7Cgp1c2UgTGVhZm9cU2Nzc1BocFxDb21waWxlcjsKdXNlIExlYWZvXFNjc3NQaHBcUGFyc2VyOwp1c2UgTGVhZm9cU2Nzc1BocFxWZXJzaW9uOwoKJHN0eWxlID0gbnVsbDsKJGxvYWRQYXRocyA9IG51bGw7CiRwcmVjaXNpb24gPSBudWxsOwokZHVtcFRyZWUgPSBmYWxzZTsKJGlucHV0RmlsZSA9IG51bGw7CiRjaGFuZ2VEaXIgPSBmYWxzZTsKJGRlYnVnSW5mbyA9IGZhbHNlOwokbGluZU51bWJlcnMgPSBmYWxzZTsKCi8qKgogKiBQYXJzZSBhcmd1bWVudAogKgogKiBAcGFyYW0gaW50ZWdlciAkaQogKiBAcGFyYW0gYXJyYXkgJG9wdGlvbnMKICoKICogQHJldHVybiBzdHJpbmd8bnVsbAogKi8KZnVuY3Rpb24gcGFyc2VBcmd1bWVudCgmJGksICRvcHRpb25zKSB7CiAgICBnbG9iYWwgJGFyZ2M7CiAgICBnbG9iYWwgJGFyZ3Y7CgogICAgaWYgKCEgcHJlZ19tYXRjaCgnL14oPzonIC4gaW1wbG9kZSgnfCcsIChhcnJheSkgJG9wdGlvbnMpIC4gJyk9PyguKikvJywgJGFyZ3ZbJGldLCAkbWF0Y2hlcykpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHN0cmxlbigkbWF0Y2hlc1sxXSkpIHsKICAgICAgICByZXR1cm4gJG1hdGNoZXNbMV07CiAgICB9CgogICAgaWYgKCRpICsgMSA8ICRhcmdjKSB7CiAgICAgICAgJGkrKzsKCiAgICAgICAgcmV0dXJuICRhcmd2WyRpXTsKICAgIH0KfQoKZm9yICgkaSA9IDE7ICRpIDwgJGFyZ2M7ICRpKyspIHsKICAgIGlmICgkYXJndlskaV0gPT09ICctaCcgfHwgJGFyZ3ZbJGldID09PSAnLS1oZWxwJykgewogICAgICAgICRleGUgPSAkYXJndlswXTsKCiAgICAgICAgJEhFTFAgPSA8PDxFT1QKVXNhZ2U6ICRleGUgW29wdGlvbnNdIFtpbnB1dC1maWxlXQoKT3B0aW9ucyBpbmNsdWRlOgoKICAgIC0tZGVidWctaW5mbyAgIEFubm90YXRlIHNlbGVjdG9ycyB3aXRoIENTUyByZWZlcnJpbmcgdG8gdGhlIHNvdXJjZSBmaWxlIGFuZCBsaW5lIG51bWJlcgogICAgLWgsIC0taGVscCAgICAgU2hvdyB0aGlzIG1lc3NhZ2UKICAgIC1mPWZvcm1hdCAgICAgIFNldCB0aGUgb3V0cHV0IGZvcm1hdCAoY29tcGFjdCwgY29tcHJlc3NlZCwgY3J1bmNoZWQsIGV4cGFuZGVkLCBvciBuZXN0ZWQpCiAgICAtaT1wYXRoICAgICAgICBTZXQgaW1wb3J0IHBhdGgKICAgIC0tbGluZS1udW1iZXJzIEFubm90YXRlIHNlbGVjdG9ycyB3aXRoIGNvbW1lbnRzIHJlZmVycmluZyB0byB0aGUgc291cmNlIGZpbGUgYW5kIGxpbmUgbnVtYmVyCiAgICAtcD1wcmVjaXNpb24gICBTZXQgZGVjaW1hbCBudW1iZXIgcHJlY2lzaW9uIChkZWZhdWx0IDUpCiAgICAtVCAgICAgICAgICAgICBEdW1wIGZvcm1hdHRlZCBwYXJzZSB0cmVlCiAgICAtdiwgLS12ZXJzaW9uICBQcmludCB0aGUgdmVyc2lvbgoKRU9UOwogICAgICAgIGV4aXQoJEhFTFApOwogICAgfQoKICAgIGlmICgkYXJndlskaV0gPT09ICctdicgfHwgJGFyZ3ZbJGldID09PSAnLS12ZXJzaW9uJykgewogICAgICAgIGV4aXQoVmVyc2lvbjo6VkVSU0lPTiAuICJcbiIpOwogICAgfQoKICAgIGlmICgkYXJndlskaV0gPT09ICctLWRlYnVnLWluZm8nKSB7CiAgICAgICAgJGRlYnVnSW5mbyA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKCRhcmd2WyRpXSA9PT0gJy0tbGluZS1udW1iZXJzJyB8fCAkYXJndlskaV0gPT09ICctLWxpbmUtY29tbWVudHMnKSB7CiAgICAgICAgJGxpbmVOdW1iZXJzID0gdHJ1ZTsKICAgICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAoJGFyZ3ZbJGldID09PSAnLVQnKSB7CiAgICAgICAgJGR1bXBUcmVlID0gdHJ1ZTsKICAgICAgICBjb250aW51ZTsKICAgIH0KCiAgICAkdmFsdWUgPSBwYXJzZUFyZ3VtZW50KCRpLCBhcnJheSgnLWYnLCAnLS1zdHlsZScpKTsKCiAgICBpZiAoaXNzZXQoJHZhbHVlKSkgewogICAgICAgICRzdHlsZSA9ICR2YWx1ZTsKICAgICAgICBjb250aW51ZTsKICAgIH0KCiAgICAkdmFsdWUgPSBwYXJzZUFyZ3VtZW50KCRpLCBhcnJheSgnLWknLCAnLS1sb2FkX3BhdGhzJykpOwoKICAgIGlmIChpc3NldCgkdmFsdWUpKSB7CiAgICAgICAgJGxvYWRQYXRocyA9ICR2YWx1ZTsKICAgICAgICBjb250aW51ZTsKICAgIH0KCiAgICAkdmFsdWUgPSBwYXJzZUFyZ3VtZW50KCRpLCBhcnJheSgnLXAnLCAnLS1wcmVjaXNpb24nKSk7CgogICAgaWYgKGlzc2V0KCR2YWx1ZSkpIHsKICAgICAgICAkcHJlY2lzaW9uID0gJHZhbHVlOwogICAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGlmIChmaWxlX2V4aXN0cygkYXJndlskaV0pKSB7CiAgICAgICAgJGlucHV0RmlsZSA9ICRhcmd2WyRpXTsKICAgICAgICBjb250aW51ZTsKICAgIH0KfQoKCmlmICgkaW5wdXRGaWxlKSB7CiAgICAkZGF0YSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRpbnB1dEZpbGUpOwoKICAgICRuZXdXb3JraW5nRGlyID0gZGlybmFtZShyZWFscGF0aCgkaW5wdXRGaWxlKSk7CiAgICAkb2xkV29ya2luZ0RpciA9IGdldGN3ZCgpOwoKICAgIGlmICgkb2xkV29ya2luZ0RpciAhPT0gJG5ld1dvcmtpbmdEaXIpIHsKICAgICAgICAkY2hhbmdlRGlyID0gY2hkaXIoJG5ld1dvcmtpbmdEaXIpOwogICAgICAgICRpbnB1dEZpbGUgPSBiYXNlbmFtZSgkaW5wdXRGaWxlKTsKICAgIH0KfSBlbHNlIHsKICAgICRkYXRhID0gJyc7CgogICAgd2hpbGUgKCEgZmVvZihTVERJTikpIHsKICAgICAgICAkZGF0YSAuPSBmcmVhZChTVERJTiwgODE5Mik7CiAgICB9Cn0KCmlmICgkZHVtcFRyZWUpIHsKICAgICRwYXJzZXIgPSBuZXcgUGFyc2VyKCRpbnB1dEZpbGUpOwoKICAgIHByaW50X3IoanNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJHBhcnNlci0+cGFyc2UoJGRhdGEpKSwgdHJ1ZSkpOwoKICAgIGV4aXQoKTsKfQoKJHNjc3MgPSBuZXcgQ29tcGlsZXIoKTsKCmlmICgkZGVidWdJbmZvICYmICRpbnB1dEZpbGUpIHsKICAgICRzY3NzLT5zZXRMaW5lTnVtYmVyU3R5bGUoQ29tcGlsZXI6OkRFQlVHX0lORk8pOwp9CgppZiAoJGxpbmVOdW1iZXJzICYmICRpbnB1dEZpbGUpIHsKICAgICRzY3NzLT5zZXRMaW5lTnVtYmVyU3R5bGUoQ29tcGlsZXI6OkxJTkVfQ09NTUVOVFMpOwp9CgppZiAoJGxvYWRQYXRocykgewogICAgJHNjc3MtPnNldEltcG9ydFBhdGhzKGV4cGxvZGUoUEFUSF9TRVBBUkFUT1IsICRsb2FkUGF0aHMpKTsKfQoKaWYgKCRwcmVjaXNpb24pIHsKICAgICRzY3NzLT5zZXROdW1iZXJQcmVjaXNpb24oJHByZWNpc2lvbik7Cn0KCmlmICgkc3R5bGUpIHsKICAgICRzY3NzLT5zZXRGb3JtYXR0ZXIoJ0xlYWZvXFxTY3NzUGhwXFxGb3JtYXR0ZXJcXCcgLiB1Y2ZpcnN0KCRzdHlsZSkpOwp9CgplY2hvICRzY3NzLT5jb21waWxlKCRkYXRhLCAkaW5wdXRGaWxlKTsKCmlmICgkY2hhbmdlRGlyKSB7CiAgICBjaGRpcigkb2xkV29ya2luZ0Rpcik7Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/composer.json</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ewogICAgIm5hbWUiOiAibGVhZm8vc2Nzc3BocCIsCiAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICJkZXNjcmlwdGlvbiI6ICJzY3NzcGhwIGlzIGEgY29tcGlsZXIgZm9yIFNDU1Mgd3JpdHRlbiBpbiBQSFAuIiwKICAgICJrZXl3b3JkcyI6IFsiY3NzIiwgInN0eWxlc2hlZXQiLCAic2NzcyIsICJzYXNzIiwgImxlc3MiXSwKICAgICJob21lcGFnZSI6ICJodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAvIiwKICAgICJsaWNlbnNlIjogWwogICAgICAgICJNSVQiCiAgICBdLAogICAgImF1dGhvcnMiOiBbCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJMZWFmIENvcmNvcmFuIiwKICAgICAgICAgICAgImVtYWlsIjogImxlYWZvdEBnbWFpbC5jb20iLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL2xlYWZvLm5ldCIKICAgICAgICB9CiAgICBdLAogICAgImF1dG9sb2FkIjogewogICAgICAgICJwc3ItNCI6IHsgIkxlYWZvXFxTY3NzUGhwXFwiOiAic3JjLyIgfQogICAgfSwKICAgICJhdXRvbG9hZC1kZXYiOiB7CiAgICAgICAgInBzci00IjogeyAiTGVhZm9cXFNjc3NQaHBcXFRlc3RcXCI6ICJ0ZXN0cy8iIH0KICAgIH0sCiAgICAicmVxdWlyZSI6IHsKICAgICAgICAicGhwIjogIj49NS40LjAiCiAgICB9LAogICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICJzcXVpemxhYnMvcGhwX2NvZGVzbmlmZmVyIjogIn4yLjMiLAogICAgICAgICJwaHB1bml0L3BocHVuaXQiOiAifjMuNyIsCiAgICAgICAgImtoZXJnZS9ib3giOiAifjIuNSIKICAgIH0sCiAgICAiYmluIjogWyJiaW4vcHNjc3MiXSwKICAgICJhcmNoaXZlIjogewogICAgICAgICJleGNsdWRlIjogWwogICAgICAgICAgICAiL01ha2VmaWxlIiwKICAgICAgICAgICAgIi8uZ2l0YXR0cmlidXRlcyIsCiAgICAgICAgICAgICIvLmdpdGlnbm9yZSIsCiAgICAgICAgICAgICIvLnRyYXZpcy55bWwiLAogICAgICAgICAgICAiL2JveC5qc29uLmRpc3QiLAogICAgICAgICAgICAiL3BocHVuaXQueG1sLmRpc3QiLAogICAgICAgICAgICAiL3Rlc3RzIgogICAgICAgIF0KICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/LICENSE.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDE1IExlYWYgQ29yY29yYW4sIGh0dHA6Ly9sZWFmby5naXRodWIuaW8vc2Nzc3BocAogClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwphIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwp3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCmRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwpwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCmluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELApFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQpMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCk9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgpXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/README.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBzY3NzcGhwCiMjIyA8aHR0cDovL2xlYWZvLmdpdGh1Yi5pby9zY3NzcGhwPgoKWyFbQnVpbGRdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9sZWFmby9zY3NzcGhwLnN2Zz9icmFuY2g9bWFzdGVyKV0oaHR0cDovL3RyYXZpcy1jaS5vcmcvbGVhZm8vc2Nzc3BocCkKWyFbTGljZW5zZV0oaHR0cHM6Ly9wb3Nlci5wdWd4Lm9yZy9sZWFmby9zY3NzcGhwL2xpY2Vuc2Uuc3ZnKV0oaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL3BhY2thZ2VzL2xlYWZvL3Njc3NwaHApCgpgc2Nzc3BocGAgaXMgYSBjb21waWxlciBmb3IgU0NTUyB3cml0dGVuIGluIFBIUC4KCkNoZWNrb3V0IHRoZSBob21lcGFnZSwgPGh0dHA6Ly9sZWFmby5naXRodWIuaW8vc2Nzc3BocD4sIGZvciBkaXJlY3Rpb25zIG9uIGhvdyB0byB1c2UuCgojIyBSdW5uaW5nIFRlc3RzCgpgc2Nzc3BocGAgdXNlcyBbUEhQVW5pdF0oaHR0cHM6Ly9naXRodWIuY29tL3NlYmFzdGlhbmJlcmdtYW5uL3BocHVuaXQpIGZvciB0ZXN0aW5nLgoKUnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmcm9tIHRoZSByb290IGRpcmVjdG9yeSB0byBydW4gZXZlcnkgdGVzdDoKCiAgICB2ZW5kb3IvYmluL3BocHVuaXQgdGVzdHMKClRoZXJlIGFyZSBzZXZlcmFsIHRlc3RzIGluIHRoZSBgdGVzdHMvYCBkaXJlY3Rvcnk6CgoqIGBBcGlUZXN0LnBocGAgY29udGFpbnMgdmFyaW91cyB1bml0IHRlc3RzIHRoYXQgdGVzdCB0aGUgUEhQIGludGVyZmFjZS4KKiBgRXhjZXB0aW9uVGVzdC5waHBgIGNvbnRhaW5zIHVuaXQgdGVzdHMgdGhhdCB0ZXN0IGZvciBleGNlcHRpb25zIHRocm93biBieSB0aGUgcGFyc2VyIGFuZCBjb21waWxlci4KKiBgRmFpbGluZ1Rlc3QucGhwYCBjb250YWlucyB0ZXN0cyByZXBvcnRlZCBpbiBHaXRodWIgaXNzdWVzIHRoYXQgZGVtb25zdHJhdGUgY29tcGF0aWJpbGl0eSBidWdzLgoqIGBJbnB1dFRlc3QucGhwYCBjb21waWxlcyBldmVyeSBgLnNjc3NgIGZpbGUgaW4gdGhlIGB0ZXN0cy9pbnB1dHNgIGRpcmVjdG9yeQogIHRoZW4gY29tcGFyZXMgdG8gdGhlIHJlc3BlY3RpdmUgYC5jc3NgIGZpbGUgaW4gdGhlIGB0ZXN0cy9vdXRwdXRzYCBkaXJlY3RvcnkuCiogYFNjc3NUZXN0LnBocGAgZXh0cmFjdHMgKHJ1YnkpIGBzY3NzYCB0ZXN0cyBmcm9tIHRoZSBgdGVzdHMvc2Nzc190ZXN0LnJiYCBmaWxlLgoqIGBTZXJ2ZXJUZXN0LnBocGAgY29udGFpbnMgZnVuY3Rpb25hbCB0ZXN0cyBmb3IgdGhlIGBTZXJ2ZXJgIGNsYXNzLgoKV2hlbiBjaGFuZ2luZyBhbnkgb2YgdGhlIHRlc3RzIGluIGB0ZXN0cy9pbnB1dHNgLCB0aGUgdGVzdHMgd2lsbCBtb3N0IGxpa2VseQpmYWlsIGJlY2F1c2UgdGhlIG91dHB1dCBoYXMgY2hhbmdlZC4gT25jZSB5b3UgdmVyaWZ5IHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0CnlvdSBjYW4gcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB0byByZWJ1aWxkIGFsbCB0aGUgdGVzdHM6CgogICAgQlVJTEQ9MSB2ZW5kb3IvYmluL3BocHVuaXQgdGVzdHMKClRoaXMgd2lsbCBjb21waWxlIGFsbCB0aGUgdGVzdHMsIGFuZCBzYXZlIHJlc3VsdHMgaW50byBgdGVzdHMvb3V0cHV0c2AuCgpUbyBlbmFibGUgdGhlIGBzY3NzYCBjb21wYXRpYmlsaXR5IHRlc3RzOgoKICAgIFRFU1RfU0NTU19DT01QQVQ9MSB2ZW5kb3IvYmluL3BocHVuaXQgdGVzdHMKCiMjIENvZGluZyBTdGFuZGFyZAoKYHNjc3NwaHBgIHNvdXJjZSBjb25mb3JtcyB0byBbUFNSMl0oaHR0cDovL3d3dy5waHAtZmlnLm9yZy9wc3IvcHNyLTIvKS4KClJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQgZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gY2hlY2sgdGhlIGNvZGUgZm9yICJzbmlmZnMiLgoKICAgIHZlbmRvci9iaW4vcGhwY3MgLS1zdGFuZGFyZD1QU1IyIGJpbiBzcmMgdGVzdHMK]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/scss.inc.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuNCcpIDwgMCkgewogICAgZGllKCdSZXF1aXJlcyBQSFAgNS40IG9yIGFib3ZlJyk7Cn0KCmlmICghIGNsYXNzX2V4aXN0cygnc2Nzc2MnLCBmYWxzZSkpIHsKICAgIGluY2x1ZGVfb25jZSBfX0RJUl9fIC4gJy9zcmMvQmFzZS9SYW5nZS5waHAnOwogICAgaW5jbHVkZV9vbmNlIF9fRElSX18gLiAnL3NyYy9CbG9jay5waHAnOwogICAgaW5jbHVkZV9vbmNlIF9fRElSX18gLiAnL3NyYy9Db2xvcnMucGhwJzsKICAgIGluY2x1ZGVfb25jZSBfX0RJUl9fIC4gJy9zcmMvQ29tcGlsZXIucGhwJzsKICAgIGluY2x1ZGVfb25jZSBfX0RJUl9fIC4gJy9zcmMvQ29tcGlsZXIvRW52aXJvbm1lbnQucGhwJzsKICAgIGluY2x1ZGVfb25jZSBfX0RJUl9fIC4gJy9zcmMvRm9ybWF0dGVyLnBocCc7CiAgICBpbmNsdWRlX29uY2UgX19ESVJfXyAuICcvc3JjL0Zvcm1hdHRlci9Db21wYWN0LnBocCc7CiAgICBpbmNsdWRlX29uY2UgX19ESVJfXyAuICcvc3JjL0Zvcm1hdHRlci9Db21wcmVzc2VkLnBocCc7CiAgICBpbmNsdWRlX29uY2UgX19ESVJfXyAuICcvc3JjL0Zvcm1hdHRlci9DcnVuY2hlZC5waHAnOwogICAgaW5jbHVkZV9vbmNlIF9fRElSX18gLiAnL3NyYy9Gb3JtYXR0ZXIvRGVidWcucGhwJzsKICAgIGluY2x1ZGVfb25jZSBfX0RJUl9fIC4gJy9zcmMvRm9ybWF0dGVyL0V4cGFuZGVkLnBocCc7CiAgICBpbmNsdWRlX29uY2UgX19ESVJfXyAuICcvc3JjL0Zvcm1hdHRlci9OZXN0ZWQucGhwJzsKICAgIGluY2x1ZGVfb25jZSBfX0RJUl9fIC4gJy9zcmMvRm9ybWF0dGVyL091dHB1dEJsb2NrLnBocCc7CiAgICBpbmNsdWRlX29uY2UgX19ESVJfXyAuICcvc3JjL05vZGUucGhwJzsKICAgIGluY2x1ZGVfb25jZSBfX0RJUl9fIC4gJy9zcmMvTm9kZS9OdW1iZXIucGhwJzsKICAgIGluY2x1ZGVfb25jZSBfX0RJUl9fIC4gJy9zcmMvUGFyc2VyLnBocCc7CiAgICBpbmNsdWRlX29uY2UgX19ESVJfXyAuICcvc3JjL1R5cGUucGhwJzsKICAgIGluY2x1ZGVfb25jZSBfX0RJUl9fIC4gJy9zcmMvVXRpbC5waHAnOwogICAgaW5jbHVkZV9vbmNlIF9fRElSX18gLiAnL3NyYy9WZXJzaW9uLnBocCc7CiAgICBpbmNsdWRlX29uY2UgX19ESVJfXyAuICcvc3JjL1NlcnZlci5waHAnOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Base/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Base/Range.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDE1IExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL2xlYWZvLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIExlYWZvXFNjc3NQaHBcQmFzZTsKCi8qKgogKiBSYW5nZSBjbGFzcwogKgogKiBAYXV0aG9yIEFudGhvbiBQYW5nIDxhbnRob24ucGFuZ0BnbWFpbC5jb20+CiAqLwpjbGFzcyBSYW5nZQp7CiAgICBwdWJsaWMgJGZpcnN0OwogICAgcHVibGljICRsYXN0OwoKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZSByYW5nZQogICAgICoKICAgICAqIEBwYXJhbSBpbnRlZ2VyfGZsb2F0ICRmaXJzdAogICAgICogQHBhcmFtIGludGVnZXJ8ZmxvYXQgJGxhc3QKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRmaXJzdCwgJGxhc3QpCiAgICB7CiAgICAgICAgJHRoaXMtPmZpcnN0ID0gJGZpcnN0OwogICAgICAgICR0aGlzLT5sYXN0ID0gJGxhc3Q7CiAgICB9CgogICAgLyoqCiAgICAgKiBUZXN0IGZvciBpbmNsdXNpb24gaW4gcmFuZ2UKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ZWdlcnxmbG9hdCAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGluY2x1ZGVzKCR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJHZhbHVlID49ICR0aGlzLT5maXJzdCAmJiAkdmFsdWUgPD0gJHRoaXMtPmxhc3Q7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Block.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocDsKCi8qKgogKiBTQ1NTIGJsb2NrCiAqCiAqIEBhdXRob3IgQW50aG9uIFBhbmcgPGFudGhvbi5wYW5nQGdtYWlsLmNvbT4KICovCmNsYXNzIEJsb2NrCnsKICAgIC8qKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICR0eXBlOwoKICAgIC8qKgogICAgICogQHZhciBcTGVhZm9cU2Nzc1BocFxCbG9jawogICAgICovCiAgICBwdWJsaWMgJHBhcmVudDsKCiAgICAvKioKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICovCiAgICBwdWJsaWMgJHNvdXJjZVBvc2l0aW9uOwoKICAgIC8qKgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkc291cmNlSW5kZXg7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkc2VsZWN0b3JzOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICBwdWJsaWMgJGNvbW1lbnRzOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICBwdWJsaWMgJGNoaWxkcmVuOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Colors.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocDsKCi8qKgogKiBDU1MgQ29sb3JzCiAqCiAqIEBhdXRob3IgTGVhZiBDb3Jjb3JhbiA8bGVhZm90QGdtYWlsLmNvbT4KICovCmNsYXNzIENvbG9ycwp7CiAgICAvKioKICAgICAqIENTUyBDb2xvcnMKICAgICAqCiAgICAgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IKICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgJGNzc0NvbG9ycyA9IGFycmF5KAogICAgICAgICdhbGljZWJsdWUnID0+ICcyNDAsMjQ4LDI1NScsCiAgICAgICAgJ2FudGlxdWV3aGl0ZScgPT4gJzI1MCwyMzUsMjE1JywKICAgICAgICAnYXF1YScgPT4gJzAsMjU1LDI1NScsCiAgICAgICAgJ2FxdWFtYXJpbmUnID0+ICcxMjcsMjU1LDIxMicsCiAgICAgICAgJ2F6dXJlJyA9PiAnMjQwLDI1NSwyNTUnLAogICAgICAgICdiZWlnZScgPT4gJzI0NSwyNDUsMjIwJywKICAgICAgICAnYmlzcXVlJyA9PiAnMjU1LDIyOCwxOTYnLAogICAgICAgICdibGFjaycgPT4gJzAsMCwwJywKICAgICAgICAnYmxhbmNoZWRhbG1vbmQnID0+ICcyNTUsMjM1LDIwNScsCiAgICAgICAgJ2JsdWUnID0+ICcwLDAsMjU1JywKICAgICAgICAnYmx1ZXZpb2xldCcgPT4gJzEzOCw0MywyMjYnLAogICAgICAgICdicm93bicgPT4gJzE2NSw0Miw0MicsCiAgICAgICAgJ2J1cmx5d29vZCcgPT4gJzIyMiwxODQsMTM1JywKICAgICAgICAnY2FkZXRibHVlJyA9PiAnOTUsMTU4LDE2MCcsCiAgICAgICAgJ2NoYXJ0cmV1c2UnID0+ICcxMjcsMjU1LDAnLAogICAgICAgICdjaG9jb2xhdGUnID0+ICcyMTAsMTA1LDMwJywKICAgICAgICAnY29yYWwnID0+ICcyNTUsMTI3LDgwJywKICAgICAgICAnY29ybmZsb3dlcmJsdWUnID0+ICcxMDAsMTQ5LDIzNycsCiAgICAgICAgJ2Nvcm5zaWxrJyA9PiAnMjU1LDI0OCwyMjAnLAogICAgICAgICdjcmltc29uJyA9PiAnMjIwLDIwLDYwJywKICAgICAgICAnY3lhbicgPT4gJzAsMjU1LDI1NScsCiAgICAgICAgJ2RhcmtibHVlJyA9PiAnMCwwLDEzOScsCiAgICAgICAgJ2RhcmtjeWFuJyA9PiAnMCwxMzksMTM5JywKICAgICAgICAnZGFya2dvbGRlbnJvZCcgPT4gJzE4NCwxMzQsMTEnLAogICAgICAgICdkYXJrZ3JheScgPT4gJzE2OSwxNjksMTY5JywKICAgICAgICAnZGFya2dyZWVuJyA9PiAnMCwxMDAsMCcsCiAgICAgICAgJ2RhcmtncmV5JyA9PiAnMTY5LDE2OSwxNjknLAogICAgICAgICdkYXJra2hha2knID0+ICcxODksMTgzLDEwNycsCiAgICAgICAgJ2RhcmttYWdlbnRhJyA9PiAnMTM5LDAsMTM5JywKICAgICAgICAnZGFya29saXZlZ3JlZW4nID0+ICc4NSwxMDcsNDcnLAogICAgICAgICdkYXJrb3JhbmdlJyA9PiAnMjU1LDE0MCwwJywKICAgICAgICAnZGFya29yY2hpZCcgPT4gJzE1Myw1MCwyMDQnLAogICAgICAgICdkYXJrcmVkJyA9PiAnMTM5LDAsMCcsCiAgICAgICAgJ2RhcmtzYWxtb24nID0+ICcyMzMsMTUwLDEyMicsCiAgICAgICAgJ2RhcmtzZWFncmVlbicgPT4gJzE0MywxODgsMTQzJywKICAgICAgICAnZGFya3NsYXRlYmx1ZScgPT4gJzcyLDYxLDEzOScsCiAgICAgICAgJ2RhcmtzbGF0ZWdyYXknID0+ICc0Nyw3OSw3OScsCiAgICAgICAgJ2RhcmtzbGF0ZWdyZXknID0+ICc0Nyw3OSw3OScsCiAgICAgICAgJ2Rhcmt0dXJxdW9pc2UnID0+ICcwLDIwNiwyMDknLAogICAgICAgICdkYXJrdmlvbGV0JyA9PiAnMTQ4LDAsMjExJywKICAgICAgICAnZGVlcHBpbmsnID0+ICcyNTUsMjAsMTQ3JywKICAgICAgICAnZGVlcHNreWJsdWUnID0+ICcwLDE5MSwyNTUnLAogICAgICAgICdkaW1ncmF5JyA9PiAnMTA1LDEwNSwxMDUnLAogICAgICAgICdkaW1ncmV5JyA9PiAnMTA1LDEwNSwxMDUnLAogICAgICAgICdkb2RnZXJibHVlJyA9PiAnMzAsMTQ0LDI1NScsCiAgICAgICAgJ2ZpcmVicmljaycgPT4gJzE3OCwzNCwzNCcsCiAgICAgICAgJ2Zsb3JhbHdoaXRlJyA9PiAnMjU1LDI1MCwyNDAnLAogICAgICAgICdmb3Jlc3RncmVlbicgPT4gJzM0LDEzOSwzNCcsCiAgICAgICAgJ2Z1Y2hzaWEnID0+ICcyNTUsMCwyNTUnLAogICAgICAgICdnYWluc2Jvcm8nID0+ICcyMjAsMjIwLDIyMCcsCiAgICAgICAgJ2dob3N0d2hpdGUnID0+ICcyNDgsMjQ4LDI1NScsCiAgICAgICAgJ2dvbGQnID0+ICcyNTUsMjE1LDAnLAogICAgICAgICdnb2xkZW5yb2QnID0+ICcyMTgsMTY1LDMyJywKICAgICAgICAnZ3JheScgPT4gJzEyOCwxMjgsMTI4JywKICAgICAgICAnZ3JlZW4nID0+ICcwLDEyOCwwJywKICAgICAgICAnZ3JlZW55ZWxsb3cnID0+ICcxNzMsMjU1LDQ3JywKICAgICAgICAnZ3JleScgPT4gJzEyOCwxMjgsMTI4JywKICAgICAgICAnaG9uZXlkZXcnID0+ICcyNDAsMjU1LDI0MCcsCiAgICAgICAgJ2hvdHBpbmsnID0+ICcyNTUsMTA1LDE4MCcsCiAgICAgICAgJ2luZGlhbnJlZCcgPT4gJzIwNSw5Miw5MicsCiAgICAgICAgJ2luZGlnbycgPT4gJzc1LDAsMTMwJywKICAgICAgICAnaXZvcnknID0+ICcyNTUsMjU1LDI0MCcsCiAgICAgICAgJ2toYWtpJyA9PiAnMjQwLDIzMCwxNDAnLAogICAgICAgICdsYXZlbmRlcicgPT4gJzIzMCwyMzAsMjUwJywKICAgICAgICAnbGF2ZW5kZXJibHVzaCcgPT4gJzI1NSwyNDAsMjQ1JywKICAgICAgICAnbGF3bmdyZWVuJyA9PiAnMTI0LDI1MiwwJywKICAgICAgICAnbGVtb25jaGlmZm9uJyA9PiAnMjU1LDI1MCwyMDUnLAogICAgICAgICdsaWdodGJsdWUnID0+ICcxNzMsMjE2LDIzMCcsCiAgICAgICAgJ2xpZ2h0Y29yYWwnID0+ICcyNDAsMTI4LDEyOCcsCiAgICAgICAgJ2xpZ2h0Y3lhbicgPT4gJzIyNCwyNTUsMjU1JywKICAgICAgICAnbGlnaHRnb2xkZW5yb2R5ZWxsb3cnID0+ICcyNTAsMjUwLDIxMCcsCiAgICAgICAgJ2xpZ2h0Z3JheScgPT4gJzIxMSwyMTEsMjExJywKICAgICAgICAnbGlnaHRncmVlbicgPT4gJzE0NCwyMzgsMTQ0JywKICAgICAgICAnbGlnaHRncmV5JyA9PiAnMjExLDIxMSwyMTEnLAogICAgICAgICdsaWdodHBpbmsnID0+ICcyNTUsMTgyLDE5MycsCiAgICAgICAgJ2xpZ2h0c2FsbW9uJyA9PiAnMjU1LDE2MCwxMjInLAogICAgICAgICdsaWdodHNlYWdyZWVuJyA9PiAnMzIsMTc4LDE3MCcsCiAgICAgICAgJ2xpZ2h0c2t5Ymx1ZScgPT4gJzEzNSwyMDYsMjUwJywKICAgICAgICAnbGlnaHRzbGF0ZWdyYXknID0+ICcxMTksMTM2LDE1MycsCiAgICAgICAgJ2xpZ2h0c2xhdGVncmV5JyA9PiAnMTE5LDEzNiwxNTMnLAogICAgICAgICdsaWdodHN0ZWVsYmx1ZScgPT4gJzE3NiwxOTYsMjIyJywKICAgICAgICAnbGlnaHR5ZWxsb3cnID0+ICcyNTUsMjU1LDIyNCcsCiAgICAgICAgJ2xpbWUnID0+ICcwLDI1NSwwJywKICAgICAgICAnbGltZWdyZWVuJyA9PiAnNTAsMjA1LDUwJywKICAgICAgICAnbGluZW4nID0+ICcyNTAsMjQwLDIzMCcsCiAgICAgICAgJ21hZ2VudGEnID0+ICcyNTUsMCwyNTUnLAogICAgICAgICdtYXJvb24nID0+ICcxMjgsMCwwJywKICAgICAgICAnbWVkaXVtYXF1YW1hcmluZScgPT4gJzEwMiwyMDUsMTcwJywKICAgICAgICAnbWVkaXVtYmx1ZScgPT4gJzAsMCwyMDUnLAogICAgICAgICdtZWRpdW1vcmNoaWQnID0+ICcxODYsODUsMjExJywKICAgICAgICAnbWVkaXVtcHVycGxlJyA9PiAnMTQ3LDExMiwyMTknLAogICAgICAgICdtZWRpdW1zZWFncmVlbicgPT4gJzYwLDE3OSwxMTMnLAogICAgICAgICdtZWRpdW1zbGF0ZWJsdWUnID0+ICcxMjMsMTA0LDIzOCcsCiAgICAgICAgJ21lZGl1bXNwcmluZ2dyZWVuJyA9PiAnMCwyNTAsMTU0JywKICAgICAgICAnbWVkaXVtdHVycXVvaXNlJyA9PiAnNzIsMjA5LDIwNCcsCiAgICAgICAgJ21lZGl1bXZpb2xldHJlZCcgPT4gJzE5OSwyMSwxMzMnLAogICAgICAgICdtaWRuaWdodGJsdWUnID0+ICcyNSwyNSwxMTInLAogICAgICAgICdtaW50Y3JlYW0nID0+ICcyNDUsMjU1LDI1MCcsCiAgICAgICAgJ21pc3R5cm9zZScgPT4gJzI1NSwyMjgsMjI1JywKICAgICAgICAnbW9jY2FzaW4nID0+ICcyNTUsMjI4LDE4MScsCiAgICAgICAgJ25hdmFqb3doaXRlJyA9PiAnMjU1LDIyMiwxNzMnLAogICAgICAgICduYXZ5JyA9PiAnMCwwLDEyOCcsCiAgICAgICAgJ29sZGxhY2UnID0+ICcyNTMsMjQ1LDIzMCcsCiAgICAgICAgJ29saXZlJyA9PiAnMTI4LDEyOCwwJywKICAgICAgICAnb2xpdmVkcmFiJyA9PiAnMTA3LDE0MiwzNScsCiAgICAgICAgJ29yYW5nZScgPT4gJzI1NSwxNjUsMCcsCiAgICAgICAgJ29yYW5nZXJlZCcgPT4gJzI1NSw2OSwwJywKICAgICAgICAnb3JjaGlkJyA9PiAnMjE4LDExMiwyMTQnLAogICAgICAgICdwYWxlZ29sZGVucm9kJyA9PiAnMjM4LDIzMiwxNzAnLAogICAgICAgICdwYWxlZ3JlZW4nID0+ICcxNTIsMjUxLDE1MicsCiAgICAgICAgJ3BhbGV0dXJxdW9pc2UnID0+ICcxNzUsMjM4LDIzOCcsCiAgICAgICAgJ3BhbGV2aW9sZXRyZWQnID0+ICcyMTksMTEyLDE0NycsCiAgICAgICAgJ3BhcGF5YXdoaXAnID0+ICcyNTUsMjM5LDIxMycsCiAgICAgICAgJ3BlYWNocHVmZicgPT4gJzI1NSwyMTgsMTg1JywKICAgICAgICAncGVydScgPT4gJzIwNSwxMzMsNjMnLAogICAgICAgICdwaW5rJyA9PiAnMjU1LDE5MiwyMDMnLAogICAgICAgICdwbHVtJyA9PiAnMjIxLDE2MCwyMjEnLAogICAgICAgICdwb3dkZXJibHVlJyA9PiAnMTc2LDIyNCwyMzAnLAogICAgICAgICdwdXJwbGUnID0+ICcxMjgsMCwxMjgnLAogICAgICAgICdyZWQnID0+ICcyNTUsMCwwJywKICAgICAgICAncm9zeWJyb3duJyA9PiAnMTg4LDE0MywxNDMnLAogICAgICAgICdyb3lhbGJsdWUnID0+ICc2NSwxMDUsMjI1JywKICAgICAgICAnc2FkZGxlYnJvd24nID0+ICcxMzksNjksMTknLAogICAgICAgICdzYWxtb24nID0+ICcyNTAsMTI4LDExNCcsCiAgICAgICAgJ3NhbmR5YnJvd24nID0+ICcyNDQsMTY0LDk2JywKICAgICAgICAnc2VhZ3JlZW4nID0+ICc0NiwxMzksODcnLAogICAgICAgICdzZWFzaGVsbCcgPT4gJzI1NSwyNDUsMjM4JywKICAgICAgICAnc2llbm5hJyA9PiAnMTYwLDgyLDQ1JywKICAgICAgICAnc2lsdmVyJyA9PiAnMTkyLDE5MiwxOTInLAogICAgICAgICdza3libHVlJyA9PiAnMTM1LDIwNiwyMzUnLAogICAgICAgICdzbGF0ZWJsdWUnID0+ICcxMDYsOTAsMjA1JywKICAgICAgICAnc2xhdGVncmF5JyA9PiAnMTEyLDEyOCwxNDQnLAogICAgICAgICdzbGF0ZWdyZXknID0+ICcxMTIsMTI4LDE0NCcsCiAgICAgICAgJ3Nub3cnID0+ICcyNTUsMjUwLDI1MCcsCiAgICAgICAgJ3NwcmluZ2dyZWVuJyA9PiAnMCwyNTUsMTI3JywKICAgICAgICAnc3RlZWxibHVlJyA9PiAnNzAsMTMwLDE4MCcsCiAgICAgICAgJ3RhbicgPT4gJzIxMCwxODAsMTQwJywKICAgICAgICAndGVhbCcgPT4gJzAsMTI4LDEyOCcsCiAgICAgICAgJ3RoaXN0bGUnID0+ICcyMTYsMTkxLDIxNicsCiAgICAgICAgJ3RvbWF0bycgPT4gJzI1NSw5OSw3MScsCiAgICAgICAgJ3RyYW5zcGFyZW50JyA9PiAnMCwwLDAsMCcsCiAgICAgICAgJ3R1cnF1b2lzZScgPT4gJzY0LDIyNCwyMDgnLAogICAgICAgICd2aW9sZXQnID0+ICcyMzgsMTMwLDIzOCcsCiAgICAgICAgJ3doZWF0JyA9PiAnMjQ1LDIyMiwxNzknLAogICAgICAgICd3aGl0ZScgPT4gJzI1NSwyNTUsMjU1JywKICAgICAgICAnd2hpdGVzbW9rZScgPT4gJzI0NSwyNDUsMjQ1JywKICAgICAgICAneWVsbG93JyA9PiAnMjU1LDI1NSwwJywKICAgICAgICAneWVsbG93Z3JlZW4nID0+ICcxNTQsMjA1LDUwJwogICAgKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Compiler.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocDsKCnVzZSBMZWFmb1xTY3NzUGhwXEJhc2VcUmFuZ2U7CnVzZSBMZWFmb1xTY3NzUGhwXEJsb2NrOwp1c2UgTGVhZm9cU2Nzc1BocFxDb2xvcnM7CnVzZSBMZWFmb1xTY3NzUGhwXENvbXBpbGVyXEVudmlyb25tZW50Owp1c2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2s7CnVzZSBMZWFmb1xTY3NzUGhwXE5vZGU7CnVzZSBMZWFmb1xTY3NzUGhwXFR5cGU7CnVzZSBMZWFmb1xTY3NzUGhwXFBhcnNlcjsKdXNlIExlYWZvXFNjc3NQaHBcVXRpbDsKCi8qKgogKiBUaGUgc2NzcyBjb21waWxlciBhbmQgcGFyc2VyLgogKgogKiBDb252ZXJ0aW5nIFNDU1MgdG8gQ1NTIGlzIGEgdGhyZWUgc3RhZ2UgcHJvY2Vzcy4gVGhlIGluY29taW5nIGZpbGUgaXMgcGFyc2VkCiAqIGJ5IGBQYXJzZXJgIGludG8gYSBzeW50YXggdHJlZSwgdGhlbiBpdCBpcyBjb21waWxlZCBpbnRvIGFub3RoZXIgdHJlZQogKiByZXByZXNlbnRpbmcgdGhlIENTUyBzdHJ1Y3R1cmUgYnkgYENvbXBpbGVyYC4gVGhlIENTUyB0cmVlIGlzIGZlZCBpbnRvIGEKICogZm9ybWF0dGVyLCBsaWtlIGBGb3JtYXR0ZXJgIHdoaWNoIHRoZW4gb3V0cHV0cyBDU1MgYXMgYSBzdHJpbmcuCiAqCiAqIER1cmluZyB0aGUgZmlyc3QgY29tcGlsZSwgYWxsIHZhbHVlcyBhcmUgKnJlZHVjZWQqLCB3aGljaCBtZWFucyB0aGF0IHRoZWlyCiAqIHR5cGVzIGFyZSBicm91Z2h0IHRvIHRoZSBsb3dlc3QgZm9ybSBiZWZvcmUgYmVpbmcgZHVtcCBhcyBzdHJpbmdzLiBUaGlzCiAqIGhhbmRsZXMgbWF0aCBlcXVhdGlvbnMsIHZhcmlhYmxlIGRlcmVmZXJlbmNlcywgYW5kIHRoZSBsaWtlLgogKgogKiBUaGUgYGNvbXBpbGVgIGZ1bmN0aW9uIG9mIGBDb21waWxlcmAgaXMgdGhlIGVudHJ5IHBvaW50LgogKgogKiBJbiBzdW1tYXJ5OgogKgogKiBUaGUgYENvbXBpbGVyYCBjbGFzcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBwYXJzZXIsIGZlZWRzIGl0IFNDU1MgY29kZSwKICogdGhlbiB0cmFuc2Zvcm1zIHRoZSByZXN1bHRpbmcgdHJlZSB0byBhIENTUyB0cmVlLiBUaGlzIGNsYXNzIGFsc28gaG9sZHMgdGhlCiAqIGV2YWx1YXRpb24gY29udGV4dCwgc3VjaCBhcyBhbGwgYXZhaWxhYmxlIG1peGlucyBhbmQgdmFyaWFibGVzIGF0IGFueSBnaXZlbgogKiB0aW1lLgogKgogKiBUaGUgYFBhcnNlcmAgY2xhc3MgaXMgb25seSBjb25jZXJuZWQgd2l0aCBwYXJzaW5nIGl0cyBpbnB1dC4KICoKICogVGhlIGBGb3JtYXR0ZXJgIHRha2VzIGEgQ1NTIHRyZWUsIGFuZCBkdW1wcyBpdCB0byBhIGZvcm1hdHRlZCBzdHJpbmcsCiAqIGhhbmRsaW5nIHRoaW5ncyBsaWtlIGluZGVudGF0aW9uLgogKi8KCi8qKgogKiBTQ1NTIGNvbXBpbGVyCiAqCiAqIEBhdXRob3IgTGVhZiBDb3Jjb3JhbiA8bGVhZm90QGdtYWlsLmNvbT4KICovCmNsYXNzIENvbXBpbGVyCnsKICAgIGNvbnN0IExJTkVfQ09NTUVOVFMgPSAxOwogICAgY29uc3QgREVCVUdfSU5GTyAgICA9IDI7CgogICAgY29uc3QgV0lUSF9SVUxFICAgICA9IDE7CiAgICBjb25zdCBXSVRIX01FRElBICAgID0gMjsKICAgIGNvbnN0IFdJVEhfU1VQUE9SVFMgPSA0OwogICAgY29uc3QgV0lUSF9BTEwgICAgICA9IDc7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHN0YXRpYyBwcm90ZWN0ZWQgJG9wZXJhdG9yTmFtZXMgPSBhcnJheSgKICAgICAgICAnKycgICA9PiAnYWRkJywKICAgICAgICAnLScgICA9PiAnc3ViJywKICAgICAgICAnKicgICA9PiAnbXVsJywKICAgICAgICAnLycgICA9PiAnZGl2JywKICAgICAgICAnJScgICA9PiAnbW9kJywKCiAgICAgICAgJz09JyAgPT4gJ2VxJywKICAgICAgICAnIT0nICA9PiAnbmVxJywKICAgICAgICAnPCcgICA9PiAnbHQnLAogICAgICAgICc+JyAgID0+ICdndCcsCgogICAgICAgICc8PScgID0+ICdsdGUnLAogICAgICAgICc+PScgID0+ICdndGUnLAogICAgICAgICc8PT4nID0+ICdjbXAnLAogICAgKTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgc3RhdGljIHByb3RlY3RlZCAkbmFtZXNwYWNlcyA9IGFycmF5KAogICAgICAgICdzcGVjaWFsJyAgPT4gJyUnLAogICAgICAgICdtaXhpbicgICAgPT4gJ0AnLAogICAgICAgICdmdW5jdGlvbicgPT4gJ14nLAogICAgKTsKCiAgICBzdGF0aWMgcHVibGljICR0cnVlID0gYXJyYXkoVHlwZTo6VF9LRVlXT1JELCAndHJ1ZScpOwogICAgc3RhdGljIHB1YmxpYyAkZmFsc2UgPSBhcnJheShUeXBlOjpUX0tFWVdPUkQsICdmYWxzZScpOwogICAgc3RhdGljIHB1YmxpYyAkbnVsbCA9IGFycmF5KFR5cGU6OlRfTlVMTCk7CiAgICBzdGF0aWMgcHVibGljICRudWxsU3RyaW5nID0gYXJyYXkoVHlwZTo6VF9TVFJJTkcsICcnLCBhcnJheSgpKTsKICAgIHN0YXRpYyBwdWJsaWMgJGRlZmF1bHRWYWx1ZSA9IGFycmF5KFR5cGU6OlRfS0VZV09SRCwgJycpOwogICAgc3RhdGljIHB1YmxpYyAkc2VsZlNlbGVjdG9yID0gYXJyYXkoVHlwZTo6VF9TRUxGKTsKICAgIHN0YXRpYyBwdWJsaWMgJGVtcHR5TGlzdCA9IGFycmF5KFR5cGU6OlRfTElTVCwgJycsIGFycmF5KCkpOwogICAgc3RhdGljIHB1YmxpYyAkZW1wdHlNYXAgPSBhcnJheShUeXBlOjpUX01BUCwgYXJyYXkoKSwgYXJyYXkoKSk7CiAgICBzdGF0aWMgcHVibGljICRlbXB0eVN0cmluZyA9IGFycmF5KFR5cGU6OlRfU1RSSU5HLCAnIicsIGFycmF5KCkpOwogICAgc3RhdGljIHB1YmxpYyAkd2l0aCA9IGFycmF5KFR5cGU6OlRfS0VZV09SRCwgJ3dpdGgnKTsKICAgIHN0YXRpYyBwdWJsaWMgJHdpdGhvdXQgPSBhcnJheShUeXBlOjpUX0tFWVdPUkQsICd3aXRob3V0Jyk7CgogICAgcHJvdGVjdGVkICRpbXBvcnRQYXRocyA9IGFycmF5KCcnKTsKICAgIHByb3RlY3RlZCAkaW1wb3J0Q2FjaGUgPSBhcnJheSgpOwogICAgcHJvdGVjdGVkICRpbXBvcnRlZEZpbGVzID0gYXJyYXkoKTsKICAgIHByb3RlY3RlZCAkdXNlckZ1bmN0aW9ucyA9IGFycmF5KCk7CiAgICBwcm90ZWN0ZWQgJHJlZ2lzdGVyZWRWYXJzID0gYXJyYXkoKTsKICAgIHByb3RlY3RlZCAkcmVnaXN0ZXJlZEZlYXR1cmVzID0gYXJyYXkoCiAgICAgICAgJ2V4dGVuZC1zZWxlY3Rvci1wc2V1ZG9jbGFzcycgPT4gZmFsc2UsCiAgICAgICAgJ2F0LWVycm9yJyAgICAgICAgICAgICAgICAgICAgPT4gdHJ1ZSwKICAgICAgICAndW5pdHMtbGV2ZWwtMycgICAgICAgICAgICAgICA9PiBmYWxzZSwKICAgICAgICAnZ2xvYmFsLXZhcmlhYmxlLXNoYWRvd2luZycgICA9PiBmYWxzZSwKICAgICk7CgogICAgcHJvdGVjdGVkICRsaW5lTnVtYmVyU3R5bGUgPSBudWxsOwoKICAgIHByb3RlY3RlZCAkZm9ybWF0dGVyID0gJ0xlYWZvXFNjc3NQaHBcRm9ybWF0dGVyXE5lc3RlZCc7CgogICAgcHJvdGVjdGVkICRyb290RW52OwogICAgcHJvdGVjdGVkICRyb290QmxvY2s7CgogICAgcHJpdmF0ZSAkaW5kZW50TGV2ZWw7CiAgICBwcml2YXRlICRjb21tZW50c1NlZW47CiAgICBwcml2YXRlICRleHRlbmRzOwogICAgcHJpdmF0ZSAkZXh0ZW5kc01hcDsKICAgIHByaXZhdGUgJHBhcnNlZEZpbGVzOwogICAgcHJpdmF0ZSAkZW52OwogICAgcHJpdmF0ZSAkc2NvcGU7CiAgICBwcml2YXRlICRwYXJzZXI7CiAgICBwcml2YXRlICRzb3VyY2VQb3M7CiAgICBwcml2YXRlICRzb3VyY2VQYXJzZXJzOwogICAgcHJpdmF0ZSAkc291cmNlSW5kZXg7CiAgICBwcml2YXRlICRzdG9yZUVudjsKICAgIHByaXZhdGUgJGNoYXJzZXRTZWVuOwogICAgcHJpdmF0ZSAkc3RkZXJyOwogICAgcHJpdmF0ZSAkc2hvdWxkRXZhbHVhdGU7CgogICAgLyoqCiAgICAgKiBDb21waWxlIHNjc3MKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkY29kZQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRjb2RlLCAkcGF0aCA9IG51bGwpCiAgICB7CiAgICAgICAgJGxvY2FsZSA9IHNldGxvY2FsZShMQ19OVU1FUklDLCAwKTsKICAgICAgICBzZXRsb2NhbGUoTENfTlVNRVJJQywgJ0MnKTsKCiAgICAgICAgJHRoaXMtPmluZGVudExldmVsICAgPSAtMTsKICAgICAgICAkdGhpcy0+Y29tbWVudHNTZWVuICA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmV4dGVuZHMgICAgICAgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5leHRlbmRzTWFwICAgID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+cGFyc2VkRmlsZXMgICA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPnNvdXJjZVBhcnNlcnMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5zb3VyY2VJbmRleCAgID0gbnVsbDsKICAgICAgICAkdGhpcy0+ZW52ICAgICAgICAgICA9IG51bGw7CiAgICAgICAgJHRoaXMtPnNjb3BlICAgICAgICAgPSBudWxsOwogICAgICAgICR0aGlzLT5zdG9yZUVudiAgICAgID0gbnVsbDsKICAgICAgICAkdGhpcy0+c3RkZXJyICAgICAgICA9IGZvcGVuKCdwaHA6Ly9zdGRlcnInLCAndycpOwoKICAgICAgICAkdGhpcy0+cGFyc2VyID0gJHRoaXMtPnBhcnNlckZhY3RvcnkoJHBhdGgpOwogICAgICAgICR0cmVlID0gJHRoaXMtPnBhcnNlci0+cGFyc2UoJGNvZGUpOwoKICAgICAgICAkdGhpcy0+Zm9ybWF0dGVyID0gbmV3ICR0aGlzLT5mb3JtYXR0ZXIoKTsKCiAgICAgICAgJHRoaXMtPnJvb3RFbnYgPSAkdGhpcy0+cHVzaEVudigkdHJlZSk7CiAgICAgICAgJHRoaXMtPmluamVjdFZhcmlhYmxlcygkdGhpcy0+cmVnaXN0ZXJlZFZhcnMpOwogICAgICAgICR0aGlzLT5jb21waWxlUm9vdCgkdHJlZSk7CiAgICAgICAgJHRoaXMtPnBvcEVudigpOwoKICAgICAgICAkb3V0ID0gJHRoaXMtPmZvcm1hdHRlci0+Zm9ybWF0KCR0aGlzLT5zY29wZSk7CgogICAgICAgIHNldGxvY2FsZShMQ19OVU1FUklDLCAkbG9jYWxlKTsKCiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBJbnN0YW50aWF0ZSBwYXJzZXIKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoCiAgICAgKgogICAgICogQHJldHVybiBcTGVhZm9cU2Nzc1BocFxQYXJzZXIKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZXJGYWN0b3J5KCRwYXRoKQogICAgewogICAgICAgICRwYXJzZXIgPSBuZXcgUGFyc2VyKCRwYXRoLCBjb3VudCgkdGhpcy0+c291cmNlUGFyc2VycykpOwoKICAgICAgICAkdGhpcy0+c291cmNlUGFyc2Vyc1tdID0gJHBhcnNlcjsKICAgICAgICAkdGhpcy0+YWRkUGFyc2VkRmlsZSgkcGF0aCk7CgogICAgICAgIHJldHVybiAkcGFyc2VyOwogICAgfQoKICAgIC8qKgogICAgICogSXMgc2VsZiBleHRlbmQ/CiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICR0YXJnZXQKICAgICAqIEBwYXJhbSBhcnJheSAkb3JpZ2luCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpc1NlbGZFeHRlbmQoJHRhcmdldCwgJG9yaWdpbikKICAgIHsKICAgICAgICBmb3JlYWNoICgkb3JpZ2luIGFzICRzZWwpIHsKICAgICAgICAgICAgaWYgKGluX2FycmF5KCR0YXJnZXQsICRzZWwpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUHVzaCBleHRlbmRzCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICR0YXJnZXQKICAgICAqIEBwYXJhbSBhcnJheSAkb3JpZ2luCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwdXNoRXh0ZW5kcygkdGFyZ2V0LCAkb3JpZ2luKQogICAgewogICAgICAgIGlmICgkdGhpcy0+aXNTZWxmRXh0ZW5kKCR0YXJnZXQsICRvcmlnaW4pKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRpID0gY291bnQoJHRoaXMtPmV4dGVuZHMpOwogICAgICAgICR0aGlzLT5leHRlbmRzW10gPSBhcnJheSgkdGFyZ2V0LCAkb3JpZ2luKTsKCiAgICAgICAgZm9yZWFjaCAoJHRhcmdldCBhcyAkcGFydCkgewogICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPmV4dGVuZHNNYXBbJHBhcnRdKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4dGVuZHNNYXBbJHBhcnRdW10gPSAkaTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5leHRlbmRzTWFwWyRwYXJ0XSA9IGFycmF5KCRpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIE1ha2Ugb3V0cHV0IGJsb2NrCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdHlwZQogICAgICogQHBhcmFtIGFycmF5ICAkc2VsZWN0b3JzCiAgICAgKgogICAgICogQHJldHVybiBcTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1ha2VPdXRwdXRCbG9jaygkdHlwZSwgJHNlbGVjdG9ycyA9IG51bGwpCiAgICB7CiAgICAgICAgJG91dCA9IG5ldyBPdXRwdXRCbG9jazsKICAgICAgICAkb3V0LT50eXBlICAgICAgPSAkdHlwZTsKICAgICAgICAkb3V0LT5saW5lcyAgICAgPSBhcnJheSgpOwogICAgICAgICRvdXQtPmNoaWxkcmVuICA9IGFycmF5KCk7CiAgICAgICAgJG91dC0+cGFyZW50ICAgID0gJHRoaXMtPnNjb3BlOwogICAgICAgICRvdXQtPnNlbGVjdG9ycyA9ICRzZWxlY3RvcnM7CiAgICAgICAgJG91dC0+ZGVwdGggICAgID0gJHRoaXMtPmVudi0+ZGVwdGg7CgogICAgICAgIHJldHVybiAkb3V0OwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSByb290CiAgICAgKgogICAgICogQHBhcmFtIFxMZWFmb1xTY3NzUGhwXEJsb2NrICRyb290QmxvY2sKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBpbGVSb290KEJsb2NrICRyb290QmxvY2spCiAgICB7CiAgICAgICAgJHRoaXMtPnJvb3RCbG9jayA9ICR0aGlzLT5zY29wZSA9ICR0aGlzLT5tYWtlT3V0cHV0QmxvY2soVHlwZTo6VF9ST09UKTsKCiAgICAgICAgJHRoaXMtPmNvbXBpbGVDaGlsZHJlbk5vUmV0dXJuKCRyb290QmxvY2stPmNoaWxkcmVuLCAkdGhpcy0+c2NvcGUpOwogICAgICAgICR0aGlzLT5mbGF0dGVuU2VsZWN0b3JzKCR0aGlzLT5zY29wZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGbGF0dGVuIHNlbGVjdG9ycwogICAgICoKICAgICAqIEBwYXJhbSBcTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sgJGJsb2NrCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJlbnRLZXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZsYXR0ZW5TZWxlY3RvcnMoT3V0cHV0QmxvY2sgJGJsb2NrLCAkcGFyZW50S2V5ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGJsb2NrLT5zZWxlY3RvcnMpIHsKICAgICAgICAgICAgJHNlbGVjdG9ycyA9IGFycmF5KCk7CgogICAgICAgICAgICBmb3JlYWNoICgkYmxvY2stPnNlbGVjdG9ycyBhcyAkcykgewogICAgICAgICAgICAgICAgJHNlbGVjdG9yc1tdID0gJHM7CgogICAgICAgICAgICAgICAgaWYgKCEgaXNfYXJyYXkoJHMpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2hlY2sgZXh0ZW5kcwogICAgICAgICAgICAgICAgaWYgKCEgZW1wdHkoJHRoaXMtPmV4dGVuZHNNYXApKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoRXh0ZW5kcygkcywgJHNlbGVjdG9ycyk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBkdXBsaWNhdGVzCiAgICAgICAgICAgICAgICAgICAgYXJyYXlfd2Fsaygkc2VsZWN0b3JzLCBmdW5jdGlvbiAoJiR2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSBzZXJpYWxpemUoJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJHNlbGVjdG9ycyA9IGFycmF5X3VuaXF1ZSgkc2VsZWN0b3JzKTsKCiAgICAgICAgICAgICAgICAgICAgYXJyYXlfd2Fsaygkc2VsZWN0b3JzLCBmdW5jdGlvbiAoJiR2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSB1bnNlcmlhbGl6ZSgkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkYmxvY2stPnNlbGVjdG9ycyA9IGFycmF5KCk7CiAgICAgICAgICAgICRwbGFjZWhvbGRlclNlbGVjdG9yID0gZmFsc2U7CgogICAgICAgICAgICBmb3JlYWNoICgkc2VsZWN0b3JzIGFzICRzZWxlY3RvcikgewogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5oYXNTZWxlY3RvclBsYWNlaG9sZGVyKCRzZWxlY3RvcikpIHsKICAgICAgICAgICAgICAgICAgICAkcGxhY2Vob2xkZXJTZWxlY3RvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGJsb2NrLT5zZWxlY3RvcnNbXSA9ICR0aGlzLT5jb21waWxlU2VsZWN0b3IoJHNlbGVjdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRwbGFjZWhvbGRlclNlbGVjdG9yICYmIDAgPT09IGNvdW50KCRibG9jay0+c2VsZWN0b3JzKSAmJiBudWxsICE9PSAkcGFyZW50S2V5KSB7CiAgICAgICAgICAgICAgICB1bnNldCgkYmxvY2stPnBhcmVudC0+Y2hpbGRyZW5bJHBhcmVudEtleV0pOwoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGJsb2NrLT5jaGlsZHJlbiBhcyAka2V5ID0+ICRjaGlsZCkgewogICAgICAgICAgICAkdGhpcy0+ZmxhdHRlblNlbGVjdG9ycygkY2hpbGQsICRrZXkpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIE1hdGNoIGV4dGVuZHMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICAkc2VsZWN0b3IKICAgICAqIEBwYXJhbSBhcnJheSAgICRvdXQKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRmcm9tCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkaW5pdGlhbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbWF0Y2hFeHRlbmRzKCRzZWxlY3RvciwgJiRvdXQsICRmcm9tID0gMCwgJGluaXRpYWwgPSB0cnVlKQogICAgewogICAgICAgIGZvcmVhY2ggKCRzZWxlY3RvciBhcyAkaSA9PiAkcGFydCkgewogICAgICAgICAgICBpZiAoJGkgPCAkZnJvbSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+bWF0Y2hFeHRlbmRzU2luZ2xlKCRwYXJ0LCAkb3JpZ2luKSkgewogICAgICAgICAgICAgICAgJGJlZm9yZSA9IGFycmF5X3NsaWNlKCRzZWxlY3RvciwgMCwgJGkpOwogICAgICAgICAgICAgICAgJGFmdGVyID0gYXJyYXlfc2xpY2UoJHNlbGVjdG9yLCAkaSArIDEpOwogICAgICAgICAgICAgICAgJHMgPSBjb3VudCgkYmVmb3JlKTsKCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkb3JpZ2luIGFzICRuZXcpIHsKICAgICAgICAgICAgICAgICAgICAkayA9IDA7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzaGFyZWQgcGFydHMKICAgICAgICAgICAgICAgICAgICBpZiAoJGluaXRpYWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRrIDwgJHMgJiYgaXNzZXQoJG5ld1ska10pICYmICRiZWZvcmVbJGtdID09PSAkbmV3WyRrXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGsrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgICAgICAgICAkYmVmb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAkayA+IDAgPyBhcnJheV9zbGljZSgkbmV3LCAkaykgOiAkbmV3LAogICAgICAgICAgICAgICAgICAgICAgICAkYWZ0ZXIKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCA9PT0gJHNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJG91dFtdID0gJHJlc3VsdDsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2hlY2sgZm9yIG1vcmUgbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaEV4dGVuZHMoJHJlc3VsdCwgJG91dCwgJGksIGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0b3Igc2VxdWVuY2UgbWVyZ2luZwogICAgICAgICAgICAgICAgICAgIGlmICghIGVtcHR5KCRiZWZvcmUpICYmIGNvdW50KCRuZXcpID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0MiA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfc2xpY2UoJG5ldywgMCwgLTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGsgPiAwID8gYXJyYXlfc2xpY2UoJGJlZm9yZSwgJGspIDogJGJlZm9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3NsaWNlKCRuZXcsIC0xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhZnRlcgogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJG91dFtdID0gJHJlc3VsdDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogTWF0Y2ggZXh0ZW5kcyBzaW5nbGUKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHJhd1NpbmdsZQogICAgICogQHBhcmFtIGFycmF5ICRvdXRPcmlnaW4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1hdGNoRXh0ZW5kc1NpbmdsZSgkcmF3U2luZ2xlLCAmJG91dE9yaWdpbikKICAgIHsKICAgICAgICAkY291bnRzID0gYXJyYXkoKTsKICAgICAgICAkc2luZ2xlID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJHJhd1NpbmdsZSBhcyAkcGFydCkgewogICAgICAgICAgICAvLyBtYXRjaGVzIE51bWJlcgogICAgICAgICAgICBpZiAoISBpc19zdHJpbmcoJHBhcnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghIHByZWdfbWF0Y2goJy9eW1xbLjojJV0vJywgJHBhcnQpICYmIGNvdW50KCRzaW5nbGUpKSB7CiAgICAgICAgICAgICAgICAkc2luZ2xlW2NvdW50KCRzaW5nbGUpIC0gMV0gLj0gJHBhcnQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2luZ2xlW10gPSAkcGFydDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJHNpbmdsZSBhcyAkcGFydCkgewogICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPmV4dGVuZHNNYXBbJHBhcnRdKSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmV4dGVuZHNNYXBbJHBhcnRdIGFzICRpZHgpIHsKICAgICAgICAgICAgICAgICAgICAkY291bnRzWyRpZHhdID0gaXNzZXQoJGNvdW50c1skaWR4XSkgPyAkY291bnRzWyRpZHhdICsgMSA6IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRvdXRPcmlnaW4gPSBhcnJheSgpOwogICAgICAgICRmb3VuZCA9IGZhbHNlOwoKICAgICAgICBmb3JlYWNoICgkY291bnRzIGFzICRpZHggPT4gJGNvdW50KSB7CiAgICAgICAgICAgIGxpc3QoJHRhcmdldCwgJG9yaWdpbikgPSAkdGhpcy0+ZXh0ZW5kc1skaWR4XTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGNvdW50CiAgICAgICAgICAgIGlmICgkY291bnQgIT09IGNvdW50KCR0YXJnZXQpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJlbSA9IGFycmF5X2RpZmYoJHNpbmdsZSwgJHRhcmdldCk7CgogICAgICAgICAgICBmb3JlYWNoICgkb3JpZ2luIGFzICRqID0+ICRuZXcpIHsKICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgaW5maW5pdGUgbG9vcCB3aGVuIHRhcmdldCBleHRlbmRzIGl0c2VsZgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc1NlbGZFeHRlbmQoJHNpbmdsZSwgJG9yaWdpbikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJG9yaWdpblskal1bY291bnQoJG9yaWdpblskal0pIC0gMV0gPSAkdGhpcy0+Y29tYmluZVNlbGVjdG9yU2luZ2xlKGVuZCgkbmV3KSwgJHJlbSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRvdXRPcmlnaW4gPSBhcnJheV9tZXJnZSgkb3V0T3JpZ2luLCAkb3JpZ2luKTsKCiAgICAgICAgICAgICRmb3VuZCA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGZvdW5kOwogICAgfQoKICAgIC8qKgogICAgICogQ29tYmluZSBzZWxlY3RvciBzaW5nbGUKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGJhc2UKICAgICAqIEBwYXJhbSBhcnJheSAkb3RoZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21iaW5lU2VsZWN0b3JTaW5nbGUoJGJhc2UsICRvdGhlcikKICAgIHsKICAgICAgICAkdGFnID0gbnVsbDsKICAgICAgICAkb3V0ID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoYXJyYXkoJGJhc2UsICRvdGhlcikgYXMgJHNpbmdsZSkgewogICAgICAgICAgICBmb3JlYWNoICgkc2luZ2xlIGFzICRwYXJ0KSB7CiAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15bXlxbLiM6XS8nLCAkcGFydCkpIHsKICAgICAgICAgICAgICAgICAgICAkdGFnID0gJHBhcnQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRvdXRbXSA9ICRwYXJ0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRhZykgewogICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRvdXQsICR0YWcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIG1lZGlhCiAgICAgKgogICAgICogQHBhcmFtIFxMZWFmb1xTY3NzUGhwXEJsb2NrICRtZWRpYQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZU1lZGlhKEJsb2NrICRtZWRpYSkKICAgIHsKICAgICAgICAkdGhpcy0+cHVzaEVudigkbWVkaWEpOwoKICAgICAgICAkbWVkaWFRdWVyeSA9ICR0aGlzLT5jb21waWxlTWVkaWFRdWVyeSgkdGhpcy0+bXVsdGlwbHlNZWRpYSgkdGhpcy0+ZW52KSk7CgogICAgICAgIGlmICghIGVtcHR5KCRtZWRpYVF1ZXJ5KSkgewogICAgICAgICAgICAkdGhpcy0+c2NvcGUgPSAkdGhpcy0+bWFrZU91dHB1dEJsb2NrKFR5cGU6OlRfTUVESUEsIGFycmF5KCRtZWRpYVF1ZXJ5KSk7CgogICAgICAgICAgICAkcGFyZW50U2NvcGUgPSAkdGhpcy0+bWVkaWFQYXJlbnQoJHRoaXMtPnNjb3BlKTsKICAgICAgICAgICAgJHBhcmVudFNjb3BlLT5jaGlsZHJlbltdID0gJHRoaXMtPnNjb3BlOwoKICAgICAgICAgICAgLy8gdG9wIGxldmVsIHByb3BlcnRpZXMgaW4gYSBtZWRpYSBjYXVzZSBpdCB0byBiZSB3cmFwcGVkCiAgICAgICAgICAgICRuZWVkc1dyYXAgPSBmYWxzZTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRtZWRpYS0+Y2hpbGRyZW4gYXMgJGNoaWxkKSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9ICRjaGlsZFswXTsKCiAgICAgICAgICAgICAgICBpZiAoJHR5cGUgIT09IFR5cGU6OlRfQkxPQ0sgJiYKICAgICAgICAgICAgICAgICAgICAkdHlwZSAhPT0gVHlwZTo6VF9NRURJQSAmJgogICAgICAgICAgICAgICAgICAgICR0eXBlICE9PSBUeXBlOjpUX0RJUkVDVElWRSAmJgogICAgICAgICAgICAgICAgICAgICR0eXBlICE9PSBUeXBlOjpUX0lNUE9SVAogICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgJG5lZWRzV3JhcCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbmVlZHNXcmFwKSB7CiAgICAgICAgICAgICAgICAkd3JhcHBlZCA9IG5ldyBCbG9jazsKICAgICAgICAgICAgICAgICR3cmFwcGVkLT5zZWxlY3RvcnMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgJHdyYXBwZWQtPmNoaWxkcmVuICA9ICRtZWRpYS0+Y2hpbGRyZW47CgogICAgICAgICAgICAgICAgJG1lZGlhLT5jaGlsZHJlbiA9IGFycmF5KGFycmF5KFR5cGU6OlRfQkxPQ0ssICR3cmFwcGVkKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5jb21waWxlQ2hpbGRyZW5Ob1JldHVybigkbWVkaWEtPmNoaWxkcmVuLCAkdGhpcy0+c2NvcGUpOwoKICAgICAgICAgICAgJHRoaXMtPnNjb3BlID0gJHRoaXMtPnNjb3BlLT5wYXJlbnQ7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+cG9wRW52KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNZWRpYSBwYXJlbnQKICAgICAqCiAgICAgKiBAcGFyYW0gXExlYWZvXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrICRzY29wZQogICAgICoKICAgICAqIEByZXR1cm4gXExlYWZvXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBtZWRpYVBhcmVudChPdXRwdXRCbG9jayAkc2NvcGUpCiAgICB7CiAgICAgICAgd2hpbGUgKCEgZW1wdHkoJHNjb3BlLT5wYXJlbnQpKSB7CiAgICAgICAgICAgIGlmICghIGVtcHR5KCRzY29wZS0+dHlwZSkgJiYgJHNjb3BlLT50eXBlICE9PSBUeXBlOjpUX01FRElBKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNjb3BlID0gJHNjb3BlLT5wYXJlbnQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHNjb3BlOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSBkaXJlY3RpdmUKICAgICAqCiAgICAgKiBAcGFyYW0gXExlYWZvXFNjc3NQaHBcQmxvY2sgJGJsb2NrCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlRGlyZWN0aXZlKEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICAkcyA9ICdAJyAuICRibG9jay0+bmFtZTsKCiAgICAgICAgaWYgKCEgZW1wdHkoJGJsb2NrLT52YWx1ZSkpIHsKICAgICAgICAgICAgJHMgLj0gJyAnIC4gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkYmxvY2stPnZhbHVlKTsKICAgICAgICB9CgogICAgICAgIGlmICgkYmxvY2stPm5hbWUgPT09ICdrZXlmcmFtZXMnIHx8IHN1YnN0cigkYmxvY2stPm5hbWUsIC0xMCkgPT09ICcta2V5ZnJhbWVzJykgewogICAgICAgICAgICAkdGhpcy0+Y29tcGlsZUtleWZyYW1lQmxvY2soJGJsb2NrLCBhcnJheSgkcykpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5jb21waWxlTmVzdGVkQmxvY2soJGJsb2NrLCBhcnJheSgkcykpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENvbXBpbGUgYXQtcm9vdAogICAgICoKICAgICAqIEBwYXJhbSBcTGVhZm9cU2Nzc1BocFxCbG9jayAkYmxvY2sKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBpbGVBdFJvb3QoQmxvY2sgJGJsb2NrKQogICAgewogICAgICAgICRlbnYgICAgID0gJHRoaXMtPnB1c2hFbnYoJGJsb2NrKTsKICAgICAgICAkZW52cyAgICA9ICR0aGlzLT5jb21wYWN0RW52KCRlbnYpOwogICAgICAgICR3aXRob3V0ID0gaXNzZXQoJGJsb2NrLT53aXRoKSA/ICR0aGlzLT5jb21waWxlV2l0aCgkYmxvY2stPndpdGgpIDogc2VsZjo6V0lUSF9SVUxFOwoKICAgICAgICAvLyB3cmFwIGlubGluZSBzZWxlY3RvcgogICAgICAgIGlmICgkYmxvY2stPnNlbGVjdG9yKSB7CiAgICAgICAgICAgICR3cmFwcGVkID0gbmV3IEJsb2NrOwogICAgICAgICAgICAkd3JhcHBlZC0+cGFyZW50ICAgICAgICAgPSAkYmxvY2s7CiAgICAgICAgICAgICR3cmFwcGVkLT5zb3VyY2VQb3NpdGlvbiA9ICRibG9jay0+c291cmNlUG9zaXRpb247CiAgICAgICAgICAgICR3cmFwcGVkLT5zb3VyY2VJbmRleCAgICA9ICRibG9jay0+c291cmNlSW5kZXg7CiAgICAgICAgICAgICR3cmFwcGVkLT5zZWxlY3RvcnMgICAgICA9ICRibG9jay0+c2VsZWN0b3I7CiAgICAgICAgICAgICR3cmFwcGVkLT5jb21tZW50cyAgICAgICA9IGFycmF5KCk7CiAgICAgICAgICAgICR3cmFwcGVkLT5jaGlsZHJlbiAgICAgICA9ICRibG9jay0+Y2hpbGRyZW47CgogICAgICAgICAgICAkYmxvY2stPmNoaWxkcmVuID0gYXJyYXkoYXJyYXkoVHlwZTo6VF9CTE9DSywgJHdyYXBwZWQpKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5lbnYgPSAkdGhpcy0+ZmlsdGVyV2l0aG91dCgkZW52cywgJHdpdGhvdXQpOwogICAgICAgICRuZXdCbG9jayAgPSAkdGhpcy0+c3BsaWNlVHJlZSgkZW52cywgJGJsb2NrLCAkd2l0aG91dCk7CgogICAgICAgICRzYXZlU2NvcGUgICA9ICR0aGlzLT5zY29wZTsKICAgICAgICAkdGhpcy0+c2NvcGUgPSAkdGhpcy0+cm9vdEJsb2NrOwoKICAgICAgICAkdGhpcy0+Y29tcGlsZUNoaWxkKCRuZXdCbG9jaywgJHRoaXMtPnNjb3BlKTsKCiAgICAgICAgJHRoaXMtPnNjb3BlID0gJHNhdmVTY29wZTsKICAgICAgICAkdGhpcy0+ZW52ICAgPSAkdGhpcy0+ZXh0cmFjdEVudigkZW52cyk7CgogICAgICAgICR0aGlzLT5wb3BFbnYoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNwbGljZSBwYXJzZSB0cmVlCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICAgICAgICAgICAgICAgICRlbnZzCiAgICAgKiBAcGFyYW0gXExlYWZvXFNjc3NQaHBcQmxvY2sgJGJsb2NrCiAgICAgKiBAcGFyYW0gaW50ZWdlciAgICAgICAgICAgICAgJHdpdGhvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gc3BsaWNlVHJlZSgkZW52cywgQmxvY2sgJGJsb2NrLCAkd2l0aG91dCkKICAgIHsKICAgICAgICAkbmV3QmxvY2sgPSBudWxsOwoKICAgICAgICBmb3JlYWNoICgkZW52cyBhcyAkZSkgewogICAgICAgICAgICBpZiAoISBpc3NldCgkZS0+YmxvY2spKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzc2V0KCRlLT5ibG9jaykgJiYgJGUtPmJsb2NrID09PSAkYmxvY2spIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNzZXQoJGUtPmJsb2NrLT50eXBlKSAmJiAkZS0+YmxvY2stPnR5cGUgPT09IFR5cGU6OlRfQVRfUk9PVCkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgoJHdpdGhvdXQgJiBzZWxmOjpXSVRIX1JVTEUpICYmIGlzc2V0KCRlLT5ibG9jay0+c2VsZWN0b3JzKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgoJHdpdGhvdXQgJiBzZWxmOjpXSVRIX01FRElBKSAmJgogICAgICAgICAgICAgICAgaXNzZXQoJGUtPmJsb2NrLT50eXBlKSAmJiAkZS0+YmxvY2stPnR5cGUgPT09IFR5cGU6OlRfTUVESUEKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCgkd2l0aG91dCAmIHNlbGY6OldJVEhfU1VQUE9SVFMpICYmCiAgICAgICAgICAgICAgICBpc3NldCgkZS0+YmxvY2stPnR5cGUpICYmICRlLT5ibG9jay0+dHlwZSA9PT0gVHlwZTo6VF9ESVJFQ1RJVkUgJiYKICAgICAgICAgICAgICAgIGlzc2V0KCRlLT5ibG9jay0+bmFtZSkgJiYgJGUtPmJsb2NrLT5uYW1lID09PSAnc3VwcG9ydHMnCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRiID0gbmV3IEJsb2NrOwoKICAgICAgICAgICAgaWYgKGlzc2V0KCRlLT5ibG9jay0+c291cmNlUG9zaXRpb24pKSB7CiAgICAgICAgICAgICAgICAkYi0+c291cmNlUG9zaXRpb24gPSAkZS0+YmxvY2stPnNvdXJjZVBvc2l0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNzZXQoJGUtPmJsb2NrLT5zb3VyY2VJbmRleCkpIHsKICAgICAgICAgICAgICAgICRiLT5zb3VyY2VJbmRleCA9ICRlLT5ibG9jay0+c291cmNlSW5kZXg7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRiLT5zZWxlY3RvcnMgPSBhcnJheSgpOwoKICAgICAgICAgICAgaWYgKGlzc2V0KCRlLT5ibG9jay0+Y29tbWVudHMpKSB7CiAgICAgICAgICAgICAgICAkYi0+Y29tbWVudHMgPSAkZS0+YmxvY2stPmNvbW1lbnRzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNzZXQoJGUtPmJsb2NrLT50eXBlKSkgewogICAgICAgICAgICAgICAgJGItPnR5cGUgPSAkZS0+YmxvY2stPnR5cGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc3NldCgkZS0+YmxvY2stPm5hbWUpKSB7CiAgICAgICAgICAgICAgICAkYi0+bmFtZSA9ICRlLT5ibG9jay0+bmFtZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzc2V0KCRlLT5ibG9jay0+cXVlcnlMaXN0KSkgewogICAgICAgICAgICAgICAgJGItPnF1ZXJ5TGlzdCA9ICRlLT5ibG9jay0+cXVlcnlMaXN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNzZXQoJGUtPmJsb2NrLT52YWx1ZSkpIHsKICAgICAgICAgICAgICAgICRiLT52YWx1ZSA9ICRlLT5ibG9jay0+dmFsdWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbmV3QmxvY2spIHsKICAgICAgICAgICAgICAgICR0eXBlID0gaXNzZXQoJG5ld0Jsb2NrLT50eXBlKSA/ICRuZXdCbG9jay0+dHlwZSA6IFR5cGU6OlRfQkxPQ0s7CgogICAgICAgICAgICAgICAgJGItPmNoaWxkcmVuID0gYXJyYXkoYXJyYXkoJHR5cGUsICRuZXdCbG9jaykpOwoKICAgICAgICAgICAgICAgICRuZXdCbG9jay0+cGFyZW50ID0gJGI7CiAgICAgICAgICAgIH0gZWxzZWlmIChjb3VudCgkYmxvY2stPmNoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGJsb2NrLT5jaGlsZHJlbiBhcyAkY2hpbGQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGNoaWxkWzBdID09PSBUeXBlOjpUX0JMT0NLKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaGlsZFsxXS0+cGFyZW50ID0gJGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRiLT5jaGlsZHJlbiA9ICRibG9jay0+Y2hpbGRyZW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRiLT5wYXJlbnQgPSBudWxsOwoKICAgICAgICAgICAgJG5ld0Jsb2NrID0gJGI7CiAgICAgICAgfQoKICAgICAgICAkdHlwZSA9IGlzc2V0KCRuZXdCbG9jay0+dHlwZSkgPyAkbmV3QmxvY2stPnR5cGUgOiBUeXBlOjpUX0JMT0NLOwoKICAgICAgICByZXR1cm4gYXJyYXkoJHR5cGUsICRuZXdCbG9jayk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIEBhdC1yb290J3Mgd2l0aDogaW5jbHVzaW9uIC8gd2l0aG91dDogZXhjbHVzaW9uIGludG8gZmlsdGVyIGZsYWdzCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICR3aXRoCiAgICAgKgogICAgICogQHJldHVybiBpbnRlZ2VyCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gY29tcGlsZVdpdGgoJHdpdGgpCiAgICB7CiAgICAgICAgc3RhdGljICRtYXBwaW5nID0gYXJyYXkoCiAgICAgICAgICAgICdydWxlJyAgICAgPT4gc2VsZjo6V0lUSF9SVUxFLAogICAgICAgICAgICAnbWVkaWEnICAgID0+IHNlbGY6OldJVEhfTUVESUEsCiAgICAgICAgICAgICdzdXBwb3J0cycgPT4gc2VsZjo6V0lUSF9TVVBQT1JUUywKICAgICAgICAgICAgJ2FsbCcgICAgICA9PiBzZWxmOjpXSVRIX0FMTCwKICAgICAgICApOwoKICAgICAgICAvLyBleGNsdWRlIHNlbGVjdG9ycyBieSBkZWZhdWx0CiAgICAgICAgJHdpdGhvdXQgPSBzZWxmOjpXSVRIX1JVTEU7CgogICAgICAgIGlmICgkdGhpcy0+bGliTWFwSGFzS2V5KGFycmF5KCR3aXRoLCBzZWxmOjokd2l0aCkpKSB7CiAgICAgICAgICAgICR3aXRob3V0ID0gc2VsZjo6V0lUSF9BTEw7CgogICAgICAgICAgICAkbGlzdCA9ICR0aGlzLT5jb2VyY2VMaXN0KCR0aGlzLT5saWJNYXBHZXQoYXJyYXkoJHdpdGgsIHNlbGY6OiR3aXRoKSkpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGxpc3RbMl0gYXMgJGl0ZW0pIHsKICAgICAgICAgICAgICAgICRrZXl3b3JkID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCR0aGlzLT5jb2VyY2VTdHJpbmcoJGl0ZW0pKTsKCiAgICAgICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygka2V5d29yZCwgJG1hcHBpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgJHdpdGhvdXQgJj0gfigkbWFwcGluZ1ska2V5d29yZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmxpYk1hcEhhc0tleShhcnJheSgkd2l0aCwgc2VsZjo6JHdpdGhvdXQpKSkgewogICAgICAgICAgICAkd2l0aG91dCA9IDA7CgogICAgICAgICAgICAkbGlzdCA9ICR0aGlzLT5jb2VyY2VMaXN0KCR0aGlzLT5saWJNYXBHZXQoYXJyYXkoJHdpdGgsIHNlbGY6OiR3aXRob3V0KSkpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGxpc3RbMl0gYXMgJGl0ZW0pIHsKICAgICAgICAgICAgICAgICRrZXl3b3JkID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCR0aGlzLT5jb2VyY2VTdHJpbmcoJGl0ZW0pKTsKCiAgICAgICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygka2V5d29yZCwgJG1hcHBpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgJHdpdGhvdXQgfD0gJG1hcHBpbmdbJGtleXdvcmRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHdpdGhvdXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaWx0ZXIgZW52IHN0YWNrCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICAgJGVudnMKICAgICAqIEBwYXJhbSBpbnRlZ2VyICR3aXRob3V0CiAgICAgKgogICAgICogQHJldHVybiBcTGVhZm9cU2Nzc1BocFxDb21waWxlclxFbnZpcm9ubWVudAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGZpbHRlcldpdGhvdXQoJGVudnMsICR3aXRob3V0KQogICAgewogICAgICAgICRmaWx0ZXJlZCA9IGFycmF5KCk7CgogICAgICAgIGZvcmVhY2ggKCRlbnZzIGFzICRlKSB7CiAgICAgICAgICAgIGlmICgoJHdpdGhvdXQgJiBzZWxmOjpXSVRIX1JVTEUpICYmIGlzc2V0KCRlLT5ibG9jay0+c2VsZWN0b3JzKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgoJHdpdGhvdXQgJiBzZWxmOjpXSVRIX01FRElBKSAmJgogICAgICAgICAgICAgICAgaXNzZXQoJGUtPmJsb2NrLT50eXBlKSAmJiAkZS0+YmxvY2stPnR5cGUgPT09IFR5cGU6OlRfTUVESUEKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCgkd2l0aG91dCAmIHNlbGY6OldJVEhfU1VQUE9SVFMpICYmCiAgICAgICAgICAgICAgICBpc3NldCgkZS0+YmxvY2stPnR5cGUpICYmICRlLT5ibG9jay0+dHlwZSA9PT0gVHlwZTo6VF9ESVJFQ1RJVkUgJiYKICAgICAgICAgICAgICAgIGlzc2V0KCRlLT5ibG9jay0+bmFtZSkgJiYgJGUtPmJsb2NrLT5uYW1lID09PSAnc3VwcG9ydHMnCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRmaWx0ZXJlZFtdID0gJGU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmV4dHJhY3RFbnYoJGZpbHRlcmVkKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbXBpbGUga2V5ZnJhbWUgYmxvY2sKICAgICAqCiAgICAgKiBAcGFyYW0gXExlYWZvXFNjc3NQaHBcQmxvY2sgJGJsb2NrCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAgICAgICAgJHNlbGVjdG9ycwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZUtleWZyYW1lQmxvY2soQmxvY2sgJGJsb2NrLCAkc2VsZWN0b3JzKQogICAgewogICAgICAgICRlbnYgPSAkdGhpcy0+cHVzaEVudigkYmxvY2spOwoKICAgICAgICAkZW52cyA9ICR0aGlzLT5jb21wYWN0RW52KCRlbnYpOwoKICAgICAgICAkdGhpcy0+ZW52ID0gJHRoaXMtPmV4dHJhY3RFbnYoYXJyYXlfZmlsdGVyKCRlbnZzLCBmdW5jdGlvbiAoJGUpIHsKICAgICAgICAgICAgcmV0dXJuICEgaXNzZXQoJGUtPmJsb2NrLT5zZWxlY3RvcnMpOwogICAgICAgIH0pKTsKCiAgICAgICAgJHRoaXMtPnNjb3BlID0gJHRoaXMtPm1ha2VPdXRwdXRCbG9jaygkYmxvY2stPnR5cGUsICRzZWxlY3RvcnMpOwogICAgICAgICR0aGlzLT5zY29wZS0+ZGVwdGggPSAxOwogICAgICAgICR0aGlzLT5zY29wZS0+cGFyZW50LT5jaGlsZHJlbltdID0gJHRoaXMtPnNjb3BlOwoKICAgICAgICAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuTm9SZXR1cm4oJGJsb2NrLT5jaGlsZHJlbiwgJHRoaXMtPnNjb3BlKTsKCiAgICAgICAgJHRoaXMtPnNjb3BlID0gJHRoaXMtPnNjb3BlLT5wYXJlbnQ7CiAgICAgICAgJHRoaXMtPmVudiAgID0gJHRoaXMtPmV4dHJhY3RFbnYoJGVudnMpOwoKICAgICAgICAkdGhpcy0+cG9wRW52KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIG5lc3RlZCBibG9jawogICAgICoKICAgICAqIEBwYXJhbSBcTGVhZm9cU2Nzc1BocFxCbG9jayAkYmxvY2sKICAgICAqIEBwYXJhbSBhcnJheSAgICAgICAgICAgICAgICAkc2VsZWN0b3JzCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlTmVzdGVkQmxvY2soQmxvY2sgJGJsb2NrLCAkc2VsZWN0b3JzKQogICAgewogICAgICAgICR0aGlzLT5wdXNoRW52KCRibG9jayk7CgogICAgICAgICR0aGlzLT5zY29wZSA9ICR0aGlzLT5tYWtlT3V0cHV0QmxvY2soJGJsb2NrLT50eXBlLCAkc2VsZWN0b3JzKTsKICAgICAgICAkdGhpcy0+c2NvcGUtPnBhcmVudC0+Y2hpbGRyZW5bXSA9ICR0aGlzLT5zY29wZTsKCiAgICAgICAgJHRoaXMtPmNvbXBpbGVDaGlsZHJlbk5vUmV0dXJuKCRibG9jay0+Y2hpbGRyZW4sICR0aGlzLT5zY29wZSk7CgogICAgICAgICR0aGlzLT5zY29wZSA9ICR0aGlzLT5zY29wZS0+cGFyZW50OwoKICAgICAgICAkdGhpcy0+cG9wRW52KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWN1cnNpdmVseSBjb21waWxlcyBhIGJsb2NrLgogICAgICoKICAgICAqIEEgYmxvY2sgaXMgYW5hbG9nb3VzIHRvIGEgQ1NTIGJsb2NrIGluIG1vc3QgY2FzZXMuIEEgc2luZ2xlIFNDU1MgZG9jdW1lbnQKICAgICAqIGlzIGVuY2Fwc3VsYXRlZCBpbiBhIGJsb2NrIHdoZW4gcGFyc2VkLCBidXQgaXQgZG9lcyBub3QgaGF2ZSBwYXJlbnQgdGFncwogICAgICogc28gYWxsIG9mIGl0cyBjaGlsZHJlbiBhcHBlYXIgb24gdGhlIHJvb3QgbGV2ZWwgd2hlbiBjb21waWxlZC4KICAgICAqCiAgICAgKiBCbG9ja3MgYXJlIG1hZGUgdXAgb2Ygc2VsZWN0b3JzIGFuZCBjaGlsZHJlbi4KICAgICAqCiAgICAgKiBUaGUgY2hpbGRyZW4gb2YgYSBibG9jayBhcmUganVzdCBhbGwgdGhlIGJsb2NrcyB0aGF0IGFyZSBkZWZpbmVkIHdpdGhpbi4KICAgICAqCiAgICAgKiBDb21waWxpbmcgdGhlIGJsb2NrIGludm9sdmVzIHB1c2hpbmcgYSBmcmVzaCBlbnZpcm9ubWVudCBvbiB0aGUgc3RhY2ssCiAgICAgKiBhbmQgaXRlcmF0aW5nIHRocm91Z2ggdGhlIHByb3BzLCBjb21waWxpbmcgZWFjaCBvbmUuCiAgICAgKgogICAgICogQHNlZSBDb21waWxlcjo6Y29tcGlsZUNoaWxkKCkKICAgICAqCiAgICAgKiBAcGFyYW0gXExlYWZvXFNjc3NQaHBcQmxvY2sgJGJsb2NrCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlQmxvY2soQmxvY2sgJGJsb2NrKQogICAgewogICAgICAgICRlbnYgPSAkdGhpcy0+cHVzaEVudigkYmxvY2spOwogICAgICAgICRlbnYtPnNlbGVjdG9ycyA9ICR0aGlzLT5ldmFsU2VsZWN0b3JzKCRibG9jay0+c2VsZWN0b3JzKTsKCiAgICAgICAgJG91dCA9ICR0aGlzLT5tYWtlT3V0cHV0QmxvY2sobnVsbCk7CgogICAgICAgIGlmIChpc3NldCgkdGhpcy0+bGluZU51bWJlclN0eWxlKSAmJiBjb3VudCgkZW52LT5zZWxlY3RvcnMpICYmIGNvdW50KCRibG9jay0+Y2hpbGRyZW4pKSB7CiAgICAgICAgICAgICRhbm5vdGF0aW9uID0gJHRoaXMtPm1ha2VPdXRwdXRCbG9jayhUeXBlOjpUX0NPTU1FTlQpOwogICAgICAgICAgICAkYW5ub3RhdGlvbi0+ZGVwdGggPSAwOwoKICAgICAgICAgICAgJHBhcnNlciA9ICR0aGlzLT5zb3VyY2VQYXJzZXJzWyRibG9jay0+c291cmNlSW5kZXhdOwogICAgICAgICAgICAkZmlsZSA9ICRwYXJzZXItPmdldFNvdXJjZU5hbWUoKTsKICAgICAgICAgICAgJGxpbmUgPSAkcGFyc2VyLT5nZXRMaW5lTm8oJGJsb2NrLT5zb3VyY2VQb3NpdGlvbik7CgogICAgICAgICAgICBzd2l0Y2ggKCR0aGlzLT5saW5lTnVtYmVyU3R5bGUpIHsKICAgICAgICAgICAgICAgIGNhc2Ugc2VsZjo6TElORV9DT01NRU5UUzoKICAgICAgICAgICAgICAgICAgICAkYW5ub3RhdGlvbi0+bGluZXNbXSA9ICcvKiBsaW5lICcgLiAkbGluZSAuICcsICcgLiAkZmlsZSAuICcgKi8nOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2Ugc2VsZjo6REVCVUdfSU5GTzoKICAgICAgICAgICAgICAgICAgICAkYW5ub3RhdGlvbi0+bGluZXNbXSA9ICdAbWVkaWEgLXNhc3MtZGVidWctaW5mb3tmaWxlbmFtZXtmb250LWZhbWlseToiJyAuICRmaWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnIn1saW5le2ZvbnQtZmFtaWx5OicgLiAkbGluZSAuICd9fSc7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zY29wZS0+Y2hpbGRyZW5bXSA9ICRhbm5vdGF0aW9uOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNjb3BlLT5jaGlsZHJlbltdID0gJG91dDsKCiAgICAgICAgaWYgKGNvdW50KCRibG9jay0+Y2hpbGRyZW4pKSB7CiAgICAgICAgICAgICRvdXQtPnNlbGVjdG9ycyA9ICR0aGlzLT5tdWx0aXBseVNlbGVjdG9ycygkZW52KTsKCiAgICAgICAgICAgICR0aGlzLT5jb21waWxlQ2hpbGRyZW5Ob1JldHVybigkYmxvY2stPmNoaWxkcmVuLCAkb3V0KTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5mb3JtYXR0ZXItPnN0cmlwU2VtaWNvbG9uKCRvdXQtPmxpbmVzKTsKCiAgICAgICAgJHRoaXMtPnBvcEVudigpOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSByb290IGxldmVsIGNvbW1lbnQKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGJsb2NrCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlQ29tbWVudCgkYmxvY2spCiAgICB7CiAgICAgICAgJG91dCA9ICR0aGlzLT5tYWtlT3V0cHV0QmxvY2soVHlwZTo6VF9DT01NRU5UKTsKICAgICAgICAkb3V0LT5saW5lc1tdID0gJGJsb2NrWzFdOwogICAgICAgICR0aGlzLT5zY29wZS0+Y2hpbGRyZW5bXSA9ICRvdXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBFdmFsdWF0ZSBzZWxlY3RvcnMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHNlbGVjdG9ycwogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGV2YWxTZWxlY3RvcnMoJHNlbGVjdG9ycykKICAgIHsKICAgICAgICAkdGhpcy0+c2hvdWxkRXZhbHVhdGUgPSBmYWxzZTsKCiAgICAgICAgJHNlbGVjdG9ycyA9IGFycmF5X21hcChhcnJheSgkdGhpcywgJ2V2YWxTZWxlY3RvcicpLCAkc2VsZWN0b3JzKTsKCiAgICAgICAgLy8gYWZ0ZXIgZXZhbHVhdGluZyBpbnRlcnBvbGF0ZXMsIHdlIG1pZ2h0IG5lZWQgYSBzZWNvbmQgcGFzcwogICAgICAgIGlmICgkdGhpcy0+c2hvdWxkRXZhbHVhdGUpIHsKICAgICAgICAgICAgJGJ1ZmZlciA9ICR0aGlzLT5jb2xsYXBzZVNlbGVjdG9ycygkc2VsZWN0b3JzKTsKICAgICAgICAgICAgJHBhcnNlciA9ICR0aGlzLT5wYXJzZXJGYWN0b3J5KF9fTUVUSE9EX18pOwoKICAgICAgICAgICAgaWYgKCRwYXJzZXItPnBhcnNlU2VsZWN0b3IoJGJ1ZmZlciwgJG5ld1NlbGVjdG9ycykpIHsKICAgICAgICAgICAgICAgICRzZWxlY3RvcnMgPSBhcnJheV9tYXAoYXJyYXkoJHRoaXMsICdldmFsU2VsZWN0b3InKSwgJG5ld1NlbGVjdG9ycyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkc2VsZWN0b3JzOwogICAgfQoKICAgIC8qKgogICAgICogRXZhbHVhdGUgc2VsZWN0b3IKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHNlbGVjdG9yCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXZhbFNlbGVjdG9yKCRzZWxlY3RvcikKICAgIHsKICAgICAgICByZXR1cm4gYXJyYXlfbWFwKGFycmF5KCR0aGlzLCAnZXZhbFNlbGVjdG9yUGFydCcpLCAkc2VsZWN0b3IpOwogICAgfQoKICAgIC8qKgogICAgICogRXZhbHVhdGUgc2VsZWN0b3IgcGFydDsgcmVwbGFjZXMgYWxsIHRoZSBpbnRlcnBvbGF0ZXMsIHN0cmlwcGluZyBxdW90ZXMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHBhcnQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBldmFsU2VsZWN0b3JQYXJ0KCRwYXJ0KQogICAgewogICAgICAgIGZvcmVhY2ggKCRwYXJ0IGFzICYkcCkgewogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHApICYmICgkcFswXSA9PT0gVHlwZTo6VF9JTlRFUlBPTEFURSB8fCAkcFswXSA9PT0gVHlwZTo6VF9TVFJJTkcpKSB7CiAgICAgICAgICAgICAgICAkcCA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHApOwoKICAgICAgICAgICAgICAgIC8vIGZvcmNlIHJlLWV2YWx1YXRpb24KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJHAsICcmJykgIT09IGZhbHNlIHx8IHN0cnBvcygkcCwgJywnKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2hvdWxkRXZhbHVhdGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoaXNfc3RyaW5nKCRwKSAmJiBzdHJsZW4oJHApID49IDIgJiYKICAgICAgICAgICAgICAgICgkZmlyc3QgPSAkcFswXSkgJiYgKCRmaXJzdCA9PT0gJyInIHx8ICRmaXJzdCA9PT0gIiciKSAmJgogICAgICAgICAgICAgICAgc3Vic3RyKCRwLCAtMSkgPT09ICRmaXJzdAogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRwID0gc3Vic3RyKCRwLCAxLCAtMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+ZmxhdHRlblNlbGVjdG9yU2luZ2xlKCRwYXJ0KTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbGxhcHNlIHNlbGVjdG9ycwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkc2VsZWN0b3JzCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbGxhcHNlU2VsZWN0b3JzKCRzZWxlY3RvcnMpCiAgICB7CiAgICAgICAgJHBhcnRzID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJHNlbGVjdG9ycyBhcyAkc2VsZWN0b3IpIHsKICAgICAgICAgICAgJG91dHB1dCA9ICcnOwoKICAgICAgICAgICAgYXJyYXlfd2Fsa19yZWN1cnNpdmUoCiAgICAgICAgICAgICAgICAkc2VsZWN0b3IsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoJHZhbHVlLCAka2V5KSB1c2UgKCYkb3V0cHV0KSB7CiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCAuPSAkdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkcGFydHNbXSA9ICRvdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW1wbG9kZSgnLCAnLCAkcGFydHMpOwogICAgfQoKICAgIC8qKgogICAgICogRmxhdHRlbiBzZWxlY3RvciBzaW5nbGU7IGpvaW5zIHRvZ2V0aGVyIC5jbGFzc2VzIGFuZCAjaWRzCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRzaW5nbGUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBmbGF0dGVuU2VsZWN0b3JTaW5nbGUoJHNpbmdsZSkKICAgIHsKICAgICAgICAkam9pbmVkID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJHNpbmdsZSBhcyAkcGFydCkgewogICAgICAgICAgICBpZiAoZW1wdHkoJGpvaW5lZCkgfHwKICAgICAgICAgICAgICAgICEgaXNfc3RyaW5nKCRwYXJ0KSB8fAogICAgICAgICAgICAgICAgcHJlZ19tYXRjaCgnL1tcWy46IyVdLycsICRwYXJ0KQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRqb2luZWRbXSA9ICRwYXJ0OwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc19hcnJheShlbmQoJGpvaW5lZCkpKSB7CiAgICAgICAgICAgICAgICAkam9pbmVkW10gPSAkcGFydDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRqb2luZWRbY291bnQoJGpvaW5lZCkgLSAxXSAuPSAkcGFydDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRqb2luZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIHNlbGVjdG9yIHRvIHN0cmluZzsgc2VsZigmKSBzaG91bGQgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IG5vdwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkc2VsZWN0b3IKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZVNlbGVjdG9yKCRzZWxlY3RvcikKICAgIHsKICAgICAgICBpZiAoISBpc19hcnJheSgkc2VsZWN0b3IpKSB7CiAgICAgICAgICAgIHJldHVybiAkc2VsZWN0b3I7IC8vIG1lZGlhIGFuZCB0aGUgbGlrZQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGltcGxvZGUoCiAgICAgICAgICAgICcgJywKICAgICAgICAgICAgYXJyYXlfbWFwKAogICAgICAgICAgICAgICAgYXJyYXkoJHRoaXMsICdjb21waWxlU2VsZWN0b3JQYXJ0JyksCiAgICAgICAgICAgICAgICAkc2VsZWN0b3IKICAgICAgICAgICAgKQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIHNlbGVjdG9yIHBhcnQKICAgICAqCiAgICAgKiBAcGFyYW0gYXJhcnkgJHBpZWNlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBpbGVTZWxlY3RvclBhcnQoJHBpZWNlKQogICAgewogICAgICAgIGZvcmVhY2ggKCRwaWVjZSBhcyAmJHApIHsKICAgICAgICAgICAgaWYgKCEgaXNfYXJyYXkoJHApKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3dpdGNoICgkcFswXSkgewogICAgICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1NFTEY6CiAgICAgICAgICAgICAgICAgICAgJHAgPSAnJic7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAkcCA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHApOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW1wbG9kZSgkcGllY2UpOwogICAgfQoKICAgIC8qKgogICAgICogSGFzIHNlbGVjdG9yIHBsYWNlaG9sZGVyPwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkc2VsZWN0b3IKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc1NlbGVjdG9yUGxhY2Vob2xkZXIoJHNlbGVjdG9yKQogICAgewogICAgICAgIGlmICghIGlzX2FycmF5KCRzZWxlY3RvcikpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJHNlbGVjdG9yIGFzICRwYXJ0cykgewogICAgICAgICAgICBmb3JlYWNoICgkcGFydHMgYXMgJHBhcnQpIHsKICAgICAgICAgICAgICAgIGlmICgnJScgPT09ICRwYXJ0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbXBpbGUgY2hpbGRyZW4gYW5kIHJldHVybiByZXN1bHQKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdG1zCiAgICAgKiBAcGFyYW0gXExlYWZvXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlQ2hpbGRyZW4oJHN0bXMsIE91dHB1dEJsb2NrICRvdXQpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHN0bXMgYXMgJHN0bSkgewogICAgICAgICAgICAkcmV0ID0gJHRoaXMtPmNvbXBpbGVDaGlsZCgkc3RtLCAkb3V0KTsKCiAgICAgICAgICAgIGlmIChpc3NldCgkcmV0KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRyZXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIGNoaWxkcmVuIGFuZCB0aHJvdyBleGNlcHRpb24gaWYgdW5leHBlY3RlZCBAcmV0dXJuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RtcwogICAgICogQHBhcmFtIFxMZWFmb1xTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jayAkb3V0CiAgICAgKgogICAgICogQHRocm93cyBcRXhjZXB0aW9uCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlQ2hpbGRyZW5Ob1JldHVybigkc3RtcywgT3V0cHV0QmxvY2sgJG91dCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkc3RtcyBhcyAkc3RtKSB7CiAgICAgICAgICAgICRyZXQgPSAkdGhpcy0+Y29tcGlsZUNoaWxkKCRzdG0sICRvdXQpOwoKICAgICAgICAgICAgaWYgKGlzc2V0KCRyZXQpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+dGhyb3dFcnJvcignQHJldHVybiBtYXkgb25seSBiZSB1c2VkIHdpdGhpbiBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIG1lZGlhIHF1ZXJ5CiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRxdWVyeUxpc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZU1lZGlhUXVlcnkoJHF1ZXJ5TGlzdCkKICAgIHsKICAgICAgICAkb3V0ID0gJ0BtZWRpYSc7CiAgICAgICAgJGZpcnN0ID0gdHJ1ZTsKCiAgICAgICAgZm9yZWFjaCAoJHF1ZXJ5TGlzdCBhcyAkcXVlcnkpIHsKICAgICAgICAgICAgJHR5cGUgPSBudWxsOwogICAgICAgICAgICAkcGFydHMgPSBhcnJheSgpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJHF1ZXJ5IGFzICRxKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKCRxWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlOjpUX01FRElBX1RZUEU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUgPSAkdGhpcy0+bWVyZ2VNZWRpYVR5cGVzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X21hcChhcnJheSgkdGhpcywgJ2NvbXBpbGVWYWx1ZScpLCBhcnJheV9zbGljZSgkcSwgMSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdHlwZSkpIHsgLy8gbWVyZ2UgZmFpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHlwZSA9IGFycmF5X21hcChhcnJheSgkdGhpcywgJ2NvbXBpbGVWYWx1ZScpLCBhcnJheV9zbGljZSgkcSwgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGU6OlRfTUVESUFfRVhQUkVTU0lPTjoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRxWzJdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnRzW10gPSAnKCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICR0aGlzLT5jb21waWxlVmFsdWUoJHFbMV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkdGhpcy0+Zm9ybWF0dGVyLT5hc3NpZ25TZXBhcmF0b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICR0aGlzLT5jb21waWxlVmFsdWUoJHFbMl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnKSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICcoJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkcVsxXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcpJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlOjpUX01FRElBX1ZBTFVFOgogICAgICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHFbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0eXBlKSB7CiAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRwYXJ0cywgaW1wbG9kZSgnICcsIGFycmF5X2ZpbHRlcigkdHlwZSkpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEgZW1wdHkoJHBhcnRzKSkgewogICAgICAgICAgICAgICAgaWYgKCRmaXJzdCkgewogICAgICAgICAgICAgICAgICAgICRmaXJzdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICRvdXQgLj0gJyAnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkb3V0IC49ICR0aGlzLT5mb3JtYXR0ZXItPnRhZ1NlcGFyYXRvcjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkb3V0IC49IGltcGxvZGUoJyBhbmQgJywgJHBhcnRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBNZXJnZSBtZWRpYSB0eXBlcwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkdHlwZTEKICAgICAqIEBwYXJhbSBhcnJheSAkdHlwZTIKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fG51bGwKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1lcmdlTWVkaWFUeXBlcygkdHlwZTEsICR0eXBlMikKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJHR5cGUxKSkgewogICAgICAgICAgICByZXR1cm4gJHR5cGUyOwogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCR0eXBlMikpIHsKICAgICAgICAgICAgcmV0dXJuICR0eXBlMTsKICAgICAgICB9CgogICAgICAgICRtMSA9ICcnOwogICAgICAgICR0MSA9ICcnOwoKICAgICAgICBpZiAoY291bnQoJHR5cGUxKSA+IDEpIHsKICAgICAgICAgICAgJG0xPSBzdHJ0b2xvd2VyKCR0eXBlMVswXSk7CiAgICAgICAgICAgICR0MT0gc3RydG9sb3dlcigkdHlwZTFbMV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0MSA9IHN0cnRvbG93ZXIoJHR5cGUxWzBdKTsKICAgICAgICB9CgogICAgICAgICRtMiA9ICcnOwogICAgICAgICR0MiA9ICcnOwoKICAgICAgICBpZiAoY291bnQoJHR5cGUyKSA+IDEpIHsKICAgICAgICAgICAgJG0yID0gc3RydG9sb3dlcigkdHlwZTJbMF0pOwogICAgICAgICAgICAkdDIgPSBzdHJ0b2xvd2VyKCR0eXBlMlsxXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHQyID0gc3RydG9sb3dlcigkdHlwZTJbMF0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCgkbTEgPT09IFR5cGU6OlRfTk9UKSBeICgkbTIgPT09IFR5cGU6OlRfTk9UKSkgewogICAgICAgICAgICBpZiAoJHQxID09PSAkdDIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICAgICAkbTEgPT09IFR5cGU6OlRfTk9UID8gJG0yIDogJG0xLAogICAgICAgICAgICAgICAgJG0xID09PSBUeXBlOjpUX05PVCA/ICR0MiA6ICR0MSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkbTEgPT09IFR5cGU6OlRfTk9UICYmICRtMiA9PT0gVHlwZTo6VF9OT1QpIHsKICAgICAgICAgICAgLy8gQ1NTIGhhcyBubyB3YXkgb2YgcmVwcmVzZW50aW5nICJuZWl0aGVyIHNjcmVlbiBub3IgcHJpbnQiCiAgICAgICAgICAgIGlmICgkdDEgIT09ICR0MikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX05PVCwgJHQxKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdDEgIT09ICR0MikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIHQxID09IHQyLCBuZWl0aGVyIG0xIG5vciBtMiBhcmUgIm5vdCIKICAgICAgICByZXR1cm4gYXJyYXkoZW1wdHkoJG0xKT8gJG0yIDogJG0xLCAkdDEpOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSBpbXBvcnQ7IHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIHNvbWV0aGluZyB0aGF0IGNvdWxkIGJlIGltcG9ydGVkCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICAgJHJhd1BhdGgKICAgICAqIEBwYXJhbSBhcnJheSAgICRvdXQKICAgICAqIEBwYXJhbSBib29sZWFuICRvbmNlCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlSW1wb3J0KCRyYXdQYXRoLCAkb3V0LCAkb25jZSA9IGZhbHNlKQogICAgewogICAgICAgIGlmICgkcmF3UGF0aFswXSA9PT0gVHlwZTo6VF9TVFJJTkcpIHsKICAgICAgICAgICAgJHBhdGggPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHJhd1BhdGgpOwoKICAgICAgICAgICAgaWYgKCRwYXRoID0gJHRoaXMtPmZpbmRJbXBvcnQoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICBpZiAoISAkb25jZSB8fCAhIGluX2FycmF5KCRwYXRoLCAkdGhpcy0+aW1wb3J0ZWRGaWxlcykpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW1wb3J0RmlsZSgkcGF0aCwgJG91dCk7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmltcG9ydGVkRmlsZXNbXSA9ICRwYXRoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHJhd1BhdGhbMF0gPT09IFR5cGU6OlRfTElTVCkgewogICAgICAgICAgICAvLyBoYW5kbGUgYSBsaXN0IG9mIHN0cmluZ3MKICAgICAgICAgICAgaWYgKGNvdW50KCRyYXdQYXRoWzJdKSA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoICgkcmF3UGF0aFsyXSBhcyAkcGF0aCkgewogICAgICAgICAgICAgICAgaWYgKCRwYXRoWzBdICE9PSBUeXBlOjpUX1NUUklORykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yZWFjaCAoJHJhd1BhdGhbMl0gYXMgJHBhdGgpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5jb21waWxlSW1wb3J0KCRwYXRoLCAkb3V0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIGNoaWxkOyByZXR1cm5zIGEgdmFsdWUgdG8gaGFsdCBleGVjdXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGlsZAogICAgICogQHBhcmFtIFxMZWFmb1xTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jayAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZUNoaWxkKCRjaGlsZCwgT3V0cHV0QmxvY2sgJG91dCkKICAgIHsKICAgICAgICAkdGhpcy0+c291cmNlSW5kZXggPSBpc3NldCgkY2hpbGRbUGFyc2VyOjpTT1VSQ0VfSU5ERVhdKSA/ICRjaGlsZFtQYXJzZXI6OlNPVVJDRV9JTkRFWF0gOiBudWxsOwogICAgICAgICR0aGlzLT5zb3VyY2VQb3MgPSBpc3NldCgkY2hpbGRbUGFyc2VyOjpTT1VSQ0VfUE9TSVRJT05dKSA/ICRjaGlsZFtQYXJzZXI6OlNPVVJDRV9QT1NJVElPTl0gOiAtMTsKCiAgICAgICAgc3dpdGNoICgkY2hpbGRbMF0pIHsKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1NDU1NQSFBfSU1QT1JUX09OQ0U6CiAgICAgICAgICAgICAgICBsaXN0KCwgJHJhd1BhdGgpID0gJGNoaWxkOwoKICAgICAgICAgICAgICAgICRyYXdQYXRoID0gJHRoaXMtPnJlZHVjZSgkcmF3UGF0aCk7CgogICAgICAgICAgICAgICAgaWYgKCEgJHRoaXMtPmNvbXBpbGVJbXBvcnQoJHJhd1BhdGgsICRvdXQsIHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJG91dC0+bGluZXNbXSA9ICdAaW1wb3J0ICcgLiAkdGhpcy0+Y29tcGlsZVZhbHVlKCRyYXdQYXRoKSAuICc7JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0lNUE9SVDoKICAgICAgICAgICAgICAgIGxpc3QoLCAkcmF3UGF0aCkgPSAkY2hpbGQ7CgogICAgICAgICAgICAgICAgJHJhd1BhdGggPSAkdGhpcy0+cmVkdWNlKCRyYXdQYXRoKTsKCiAgICAgICAgICAgICAgICBpZiAoISAkdGhpcy0+Y29tcGlsZUltcG9ydCgkcmF3UGF0aCwgJG91dCkpIHsKICAgICAgICAgICAgICAgICAgICAkb3V0LT5saW5lc1tdID0gJ0BpbXBvcnQgJyAuICR0aGlzLT5jb21waWxlVmFsdWUoJHJhd1BhdGgpIC4gJzsnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRElSRUNUSVZFOgogICAgICAgICAgICAgICAgJHRoaXMtPmNvbXBpbGVEaXJlY3RpdmUoJGNoaWxkWzFdKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0FUX1JPT1Q6CiAgICAgICAgICAgICAgICAkdGhpcy0+Y29tcGlsZUF0Um9vdCgkY2hpbGRbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfTUVESUE6CiAgICAgICAgICAgICAgICAkdGhpcy0+Y29tcGlsZU1lZGlhKCRjaGlsZFsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9CTE9DSzoKICAgICAgICAgICAgICAgICR0aGlzLT5jb21waWxlQmxvY2soJGNoaWxkWzFdKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0NIQVJTRVQ6CiAgICAgICAgICAgICAgICBpZiAoISAkdGhpcy0+Y2hhcnNldFNlZW4pIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y2hhcnNldFNlZW4gPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAkb3V0LT5saW5lc1tdID0gJ0BjaGFyc2V0ICcgLiAkdGhpcy0+Y29tcGlsZVZhbHVlKCRjaGlsZFsxXSkgLiAnOyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9BU1NJR046CiAgICAgICAgICAgICAgICBsaXN0KCwgJG5hbWUsICR2YWx1ZSkgPSAkY2hpbGQ7CgogICAgICAgICAgICAgICAgaWYgKCRuYW1lWzBdID09PSBUeXBlOjpUX1ZBUklBQkxFKSB7CiAgICAgICAgICAgICAgICAgICAgJGZsYWcgPSBpc3NldCgkY2hpbGRbM10pID8gJGNoaWxkWzNdIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAkaXNEZWZhdWx0ID0gJGZsYWcgPT09ICchZGVmYXVsdCc7CiAgICAgICAgICAgICAgICAgICAgJGlzR2xvYmFsID0gJGZsYWcgPT09ICchZ2xvYmFsJzsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRpc0dsb2JhbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0KCRuYW1lWzFdLCAkdGhpcy0+cmVkdWNlKCR2YWx1ZSksIGZhbHNlLCAkdGhpcy0+cm9vdEVudik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHNob3VsZFNldCA9ICRpc0RlZmF1bHQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKCgkcmVzdWx0ID0gJHRoaXMtPmdldCgkbmFtZVsxXSwgZmFsc2UpKSA9PT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICB8fCAkcmVzdWx0ID09PSBzZWxmOjokbnVsbCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghICRpc0RlZmF1bHQgfHwgJHNob3VsZFNldCkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0KCRuYW1lWzFdLCAkdGhpcy0+cmVkdWNlKCR2YWx1ZSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkY29tcGlsZWROYW1lID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkbmFtZSk7CgogICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNob3J0aGFuZCBzeW50YXg6IHNpemUgLyBsaW5lLWhlaWdodAogICAgICAgICAgICAgICAgaWYgKCRjb21waWxlZE5hbWUgPT09ICdmb250JykgewogICAgICAgICAgICAgICAgICAgIGlmICgkdmFsdWVbMF0gPT09IFR5cGU6OlRfRVhQUkVTU0lPTiAmJiAkdmFsdWVbMV0gPT09ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+ZXhwVG9TdHJpbmcoJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHZhbHVlWzBdID09PSBUeXBlOjpUX0xJU1QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlWzJdIGFzICYkaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRpdGVtWzBdID09PSBUeXBlOjpUX0VYUFJFU1NJT04gJiYgJGl0ZW1bMV0gPT09ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtID0gJHRoaXMtPmV4cFRvU3RyaW5nKCRpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgcmVkdWNlcyB0byBudWxsIGZyb20gc29tZXRoaW5nIGVsc2UgdGhlbgogICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5IHNob3VsZCBiZSBkaXNjYXJkZWQKICAgICAgICAgICAgICAgIGlmICgkdmFsdWVbMF0gIT09IFR5cGU6OlRfTlVMTCkgewogICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5yZWR1Y2UoJHZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCR2YWx1ZVswXSA9PT0gVHlwZTo6VF9OVUxMIHx8ICR2YWx1ZSA9PT0gc2VsZjo6JG51bGxTdHJpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRjb21waWxlZFZhbHVlID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkdmFsdWUpOwoKICAgICAgICAgICAgICAgICRvdXQtPmxpbmVzW10gPSAkdGhpcy0+Zm9ybWF0dGVyLT5wcm9wZXJ0eSgKICAgICAgICAgICAgICAgICAgICAkY29tcGlsZWROYW1lLAogICAgICAgICAgICAgICAgICAgICRjb21waWxlZFZhbHVlCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfQ09NTUVOVDoKICAgICAgICAgICAgICAgIGlmICgkb3V0LT50eXBlID09PSBUeXBlOjpUX1JPT1QpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y29tcGlsZUNvbW1lbnQoJGNoaWxkKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkb3V0LT5saW5lc1tdID0gJGNoaWxkWzFdOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfTUlYSU46CiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9GVU5DVElPTjoKICAgICAgICAgICAgICAgIGxpc3QoLCAkYmxvY2spID0gJGNoaWxkOwoKICAgICAgICAgICAgICAgICR0aGlzLT5zZXQoc2VsZjo6JG5hbWVzcGFjZXNbJGJsb2NrLT50eXBlXSAuICRibG9jay0+bmFtZSwgJGJsb2NrKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0VYVEVORDoKICAgICAgICAgICAgICAgIGxpc3QoLCAkc2VsZWN0b3JzKSA9ICRjaGlsZDsKCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkc2VsZWN0b3JzIGFzICRzZWwpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0cyA9ICR0aGlzLT5ldmFsU2VsZWN0b3JzKGFycmF5KCRzZWwpKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHJlc3VsdHMgYXMgJHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHVzZSB0aGUgZmlyc3Qgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBjdXJyZW50KCRyZXN1bHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnB1c2hFeHRlbmRzKCRyZXN1bHQsICRvdXQtPnNlbGVjdG9ycyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfSUY6CiAgICAgICAgICAgICAgICBsaXN0KCwgJGlmKSA9ICRjaGlsZDsKCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmlzVHJ1dGh5KCR0aGlzLT5yZWR1Y2UoJGlmLT5jb25kLCB0cnVlKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmNvbXBpbGVDaGlsZHJlbigkaWYtPmNoaWxkcmVuLCAkb3V0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkaWYtPmNhc2VzIGFzICRjYXNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRjYXNlLT50eXBlID09PSBUeXBlOjpUX0VMU0UgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJGNhc2UtPnR5cGUgPT09IFR5cGU6OlRfRUxTRUlGICYmICR0aGlzLT5pc1RydXRoeSgkdGhpcy0+cmVkdWNlKCRjYXNlLT5jb25kKSkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jb21waWxlQ2hpbGRyZW4oJGNhc2UtPmNoaWxkcmVuLCAkb3V0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9FQUNIOgogICAgICAgICAgICAgICAgbGlzdCgsICRlYWNoKSA9ICRjaGlsZDsKCiAgICAgICAgICAgICAgICAkbGlzdCA9ICR0aGlzLT5jb2VyY2VMaXN0KCR0aGlzLT5yZWR1Y2UoJGVhY2gtPmxpc3QpKTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+cHVzaEVudigpOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0WzJdIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50KCRlYWNoLT52YXJzKSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0KCRlYWNoLT52YXJzWzBdLCAkaXRlbSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgsLCAkdmFsdWVzKSA9ICR0aGlzLT5jb2VyY2VMaXN0KCRpdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRlYWNoLT52YXJzIGFzICRpID0+ICR2YXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXQoJHZhciwgaXNzZXQoJHZhbHVlc1skaV0pID8gJHZhbHVlc1skaV0gOiBzZWxmOjokbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRyZXQgPSAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuKCRlYWNoLT5jaGlsZHJlbiwgJG91dCk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkcmV0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcmV0WzBdICE9PSBUeXBlOjpUX0NPTlRST0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wb3BFbnYoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJldDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyZXRbMV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0aGlzLT5wb3BFbnYoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1dISUxFOgogICAgICAgICAgICAgICAgbGlzdCgsICR3aGlsZSkgPSAkY2hpbGQ7CgogICAgICAgICAgICAgICAgd2hpbGUgKCR0aGlzLT5pc1RydXRoeSgkdGhpcy0+cmVkdWNlKCR3aGlsZS0+Y29uZCwgdHJ1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5jb21waWxlQ2hpbGRyZW4oJHdoaWxlLT5jaGlsZHJlbiwgJG91dCk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkcmV0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcmV0WzBdICE9PSBUeXBlOjpUX0NPTlRST0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmV0OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJldFsxXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9GT1I6CiAgICAgICAgICAgICAgICBsaXN0KCwgJGZvcikgPSAkY2hpbGQ7CgogICAgICAgICAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnJlZHVjZSgkZm9yLT5zdGFydCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAkc3RhcnQgPSAkc3RhcnRbMV07CiAgICAgICAgICAgICAgICAkZW5kID0gJHRoaXMtPnJlZHVjZSgkZm9yLT5lbmQsIHRydWUpOwogICAgICAgICAgICAgICAgJGVuZCA9ICRlbmRbMV07CiAgICAgICAgICAgICAgICAkZCA9ICRzdGFydCA8ICRlbmQgPyAxIDogLTE7CgogICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKCEgJGZvci0+dW50aWwgJiYgJHN0YXJ0IC0gJGQgPT0gJGVuZCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKCRmb3ItPnVudGlsICYmICRzdGFydCA9PSAkZW5kKQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXQoJGZvci0+dmFyLCBuZXcgTm9kZVxOdW1iZXIoJHN0YXJ0LCAnJykpOwogICAgICAgICAgICAgICAgICAgICRzdGFydCArPSAkZDsKCiAgICAgICAgICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5jb21waWxlQ2hpbGRyZW4oJGZvci0+Y2hpbGRyZW4sICRvdXQpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHJldCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJldFswXSAhPT0gVHlwZTo6VF9DT05UUk9MKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJldDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyZXRbMV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfQlJFQUs6CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoVHlwZTo6VF9DT05UUk9MLCB0cnVlKTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9DT05USU5VRToKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX0NPTlRST0wsIGZhbHNlKTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9SRVRVUk46CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlZHVjZSgkY2hpbGRbMV0sIHRydWUpOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX05FU1RFRF9QUk9QRVJUWToKICAgICAgICAgICAgICAgIGxpc3QoLCAkcHJvcCkgPSAkY2hpbGQ7CgogICAgICAgICAgICAgICAgJHByZWZpeGVkID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICRwcmVmaXggPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCRwcm9wLT5wcmVmaXgpIC4gJy0nOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRwcm9wLT5jaGlsZHJlbiBhcyAkY2hpbGQpIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRjaGlsZFswXSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGU6OlRfQVNTSUdOOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkY2hpbGRbMV1bMl0sICRwcmVmaXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGU6OlRfTkVTVEVEX1BST1BFUlRZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkY2hpbGRbMV0tPnByZWZpeFsyXSwgJHByZWZpeCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRwcmVmaXhlZFtdID0gJGNoaWxkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0aGlzLT5jb21waWxlQ2hpbGRyZW5Ob1JldHVybigkcHJlZml4ZWQsICRvdXQpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfSU5DTFVERToKICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBhIG1peGluCiAgICAgICAgICAgICAgICBsaXN0KCwgJG5hbWUsICRhcmdWYWx1ZXMsICRjb250ZW50KSA9ICRjaGlsZDsKCiAgICAgICAgICAgICAgICAkbWl4aW4gPSAkdGhpcy0+Z2V0KHNlbGY6OiRuYW1lc3BhY2VzWydtaXhpbiddIC4gJG5hbWUsIGZhbHNlKTsKCiAgICAgICAgICAgICAgICBpZiAoISAkbWl4aW4pIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dGhyb3dFcnJvcigiVW5kZWZpbmVkIG1peGluICRuYW1lIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGNhbGxpbmdTY29wZSA9ICR0aGlzLT5nZXRTdG9yZUVudigpOwoKICAgICAgICAgICAgICAgIC8vIHB1c2ggc2NvcGUsIGFwcGx5IGFyZ3MKICAgICAgICAgICAgICAgICR0aGlzLT5wdXNoRW52KCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZW52LT5kZXB0aC0tOwoKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkY29udGVudCkpIHsKICAgICAgICAgICAgICAgICAgICAkY29udGVudC0+c2NvcGUgPSAkY2FsbGluZ1Njb3BlOwoKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0UmF3KHNlbGY6OiRuYW1lc3BhY2VzWydzcGVjaWFsJ10gLiAnY29udGVudCcsICRjb250ZW50LCAkdGhpcy0+Z2V0U3RvcmVFbnYoKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRtaXhpbi0+YXJncykpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YXBwbHlBcmd1bWVudHMoJG1peGluLT5hcmdzLCAkYXJnVmFsdWVzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW52LT5tYXJrZXIgPSAnbWl4aW4nOwoKICAgICAgICAgICAgICAgICR0aGlzLT5jb21waWxlQ2hpbGRyZW5Ob1JldHVybigkbWl4aW4tPmNoaWxkcmVuLCAkb3V0KTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+cG9wRW52KCk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9NSVhJTl9DT05URU5UOgogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSAkdGhpcy0+Z2V0KHNlbGY6OiRuYW1lc3BhY2VzWydzcGVjaWFsJ10gLiAnY29udGVudCcsIGZhbHNlLCAkdGhpcy0+Z2V0U3RvcmVFbnYoKSk7CgogICAgICAgICAgICAgICAgaWYgKCEgJGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dGhyb3dFcnJvcignRXhwZWN0ZWQgQGNvbnRlbnQgaW5zaWRlIG9mIG1peGluJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCEgaXNzZXQoJGNvbnRlbnQtPmNoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRzdG9yZUVudiA9ICR0aGlzLT5zdG9yZUVudjsKICAgICAgICAgICAgICAgICR0aGlzLT5zdG9yZUVudiA9ICRjb250ZW50LT5zY29wZTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuTm9SZXR1cm4oJGNvbnRlbnQtPmNoaWxkcmVuLCAkb3V0KTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+c3RvcmVFbnYgPSAkc3RvcmVFbnY7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9ERUJVRzoKICAgICAgICAgICAgICAgIGxpc3QoLCAkdmFsdWUpID0gJGNoaWxkOwoKICAgICAgICAgICAgICAgICRsaW5lID0gJHRoaXMtPnBhcnNlci0+Z2V0TGluZU5vKCR0aGlzLT5zb3VyY2VQb3MpOwogICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkdGhpcy0+cmVkdWNlKCR2YWx1ZSwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgZndyaXRlKCR0aGlzLT5zdGRlcnIsICJMaW5lICRsaW5lIERFQlVHOiAkdmFsdWVcbiIpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfV0FSTjoKICAgICAgICAgICAgICAgIGxpc3QoLCAkdmFsdWUpID0gJGNoaWxkOwoKICAgICAgICAgICAgICAgICRsaW5lID0gJHRoaXMtPnBhcnNlci0+Z2V0TGluZU5vKCR0aGlzLT5zb3VyY2VQb3MpOwogICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkdGhpcy0+cmVkdWNlKCR2YWx1ZSwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgZWNobyAiTGluZSAkbGluZSBXQVJOOiAkdmFsdWVcbiI7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9FUlJPUjoKICAgICAgICAgICAgICAgIGxpc3QoLCAkdmFsdWUpID0gJGNoaWxkOwoKICAgICAgICAgICAgICAgICRsaW5lID0gJHRoaXMtPnBhcnNlci0+Z2V0TGluZU5vKCR0aGlzLT5zb3VyY2VQb3MpOwogICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkdGhpcy0+cmVkdWNlKCR2YWx1ZSwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgJHRoaXMtPnRocm93RXJyb3IoIkxpbmUgJGxpbmUgRVJST1I6ICR2YWx1ZVxuIik7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9DT05UUk9MOgogICAgICAgICAgICAgICAgJHRoaXMtPnRocm93RXJyb3IoJ0BicmVhay9AY29udGludWUgbm90IHBlcm1pdHRlZCBpbiB0aGlzIHNjb3BlJyk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAkdGhpcy0+dGhyb3dFcnJvcigidW5rbm93biBjaGlsZCB0eXBlOiAkY2hpbGRbMF0iKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWR1Y2UgZXhwcmVzc2lvbiB0byBzdHJpbmcKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGV4cAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGV4cFRvU3RyaW5nKCRleHApCiAgICB7CiAgICAgICAgbGlzdCgsICRvcCwgJGxlZnQsICRyaWdodCwgJGluUGFyZW5zLCAkd2hpdGVMZWZ0LCAkd2hpdGVSaWdodCkgPSAkZXhwOwoKICAgICAgICAkY29udGVudCA9IGFycmF5KCR0aGlzLT5yZWR1Y2UoJGxlZnQpKTsKCiAgICAgICAgaWYgKCR3aGl0ZUxlZnQpIHsKICAgICAgICAgICAgJGNvbnRlbnRbXSA9ICcgJzsKICAgICAgICB9CgogICAgICAgICRjb250ZW50W10gPSAkb3A7CgogICAgICAgIGlmICgkd2hpdGVSaWdodCkgewogICAgICAgICAgICAkY29udGVudFtdID0gJyAnOwogICAgICAgIH0KCiAgICAgICAgJGNvbnRlbnRbXSA9ICR0aGlzLT5yZWR1Y2UoJHJpZ2h0KTsKCiAgICAgICAgcmV0dXJuIGFycmF5KFR5cGU6OlRfU1RSSU5HLCAnJywgJGNvbnRlbnQpOwogICAgfQoKICAgIC8qKgogICAgICogSXMgdHJ1dGh5PwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpc1RydXRoeSgkdmFsdWUpCiAgICB7CiAgICAgICAgcmV0dXJuICR2YWx1ZSAhPT0gc2VsZjo6JGZhbHNlICYmICR2YWx1ZSAhPT0gc2VsZjo6JG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBTaG91bGQgJHZhbHVlIGNhdXNlIGl0cyBvcGVyYW5kIHRvIGV2YWwKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzaG91bGRFdmFsKCR2YWx1ZSkKICAgIHsKICAgICAgICBzd2l0Y2ggKCR2YWx1ZVswXSkgewogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRVhQUkVTU0lPTjoKICAgICAgICAgICAgICAgIGlmICgkdmFsdWVbMV0gPT09ICcvJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2hvdWxkRXZhbCgkdmFsdWVbMl0sICR2YWx1ZVszXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZmFsbC10aHJ1CiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9WQVJJQUJMRToKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0ZVTkNUSU9OX0NBTEw6CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlZHVjZSB2YWx1ZQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAgICR2YWx1ZQogICAgICogQHBhcmFtIGJvb2xlYW4gJGluRXhwCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcmVkdWNlKCR2YWx1ZSwgJGluRXhwID0gZmFsc2UpCiAgICB7CiAgICAgICAgbGlzdCgkdHlwZSkgPSAkdmFsdWU7CgogICAgICAgIHN3aXRjaCAoJHR5cGUpIHsKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0VYUFJFU1NJT046CiAgICAgICAgICAgICAgICBsaXN0KCwgJG9wLCAkbGVmdCwgJHJpZ2h0LCAkaW5QYXJlbnMpID0gJHZhbHVlOwoKICAgICAgICAgICAgICAgICRvcE5hbWUgPSBpc3NldChzZWxmOjokb3BlcmF0b3JOYW1lc1skb3BdKSA/IHNlbGY6OiRvcGVyYXRvck5hbWVzWyRvcF0gOiAkb3A7CiAgICAgICAgICAgICAgICAkaW5FeHAgPSAkaW5FeHAgfHwgJHRoaXMtPnNob3VsZEV2YWwoJGxlZnQpIHx8ICR0aGlzLT5zaG91bGRFdmFsKCRyaWdodCk7CgogICAgICAgICAgICAgICAgJGxlZnQgPSAkdGhpcy0+cmVkdWNlKCRsZWZ0LCB0cnVlKTsKCiAgICAgICAgICAgICAgICBpZiAoJG9wICE9PSAnYW5kJyAmJiAkb3AgIT09ICdvcicpIHsKICAgICAgICAgICAgICAgICAgICAkcmlnaHQgPSAkdGhpcy0+cmVkdWNlKCRyaWdodCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBsb29rcyBsaWtlIGNzcyBzaG9ydGhhbmQKICAgICAgICAgICAgICAgIGlmICgkb3BOYW1lID09ICdkaXYnICYmICEgJGluUGFyZW5zICYmICEgJGluRXhwICYmIGlzc2V0KCRyaWdodFsyXSkKICAgICAgICAgICAgICAgICAgICAmJiAoKCRyaWdodFswXSAhPT0gVHlwZTo6VF9OVU1CRVIgJiYgJHJpZ2h0WzJdICE9ICcnKQogICAgICAgICAgICAgICAgICAgIHx8ICgkcmlnaHRbMF0gPT09IFR5cGU6OlRfTlVNQkVSICYmICEgJHJpZ2h0LT51bml0bGVzcygpKSkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZXhwVG9TdHJpbmcoJHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkbGVmdCA9ICR0aGlzLT5jb2VyY2VGb3JFeHByZXNzaW9uKCRsZWZ0KTsKICAgICAgICAgICAgICAgICRyaWdodCA9ICR0aGlzLT5jb2VyY2VGb3JFeHByZXNzaW9uKCRyaWdodCk7CgogICAgICAgICAgICAgICAgJGx0eXBlID0gJGxlZnRbMF07CiAgICAgICAgICAgICAgICAkcnR5cGUgPSAkcmlnaHRbMF07CgogICAgICAgICAgICAgICAgJHVjT3BOYW1lID0gdWNmaXJzdCgkb3BOYW1lKTsKICAgICAgICAgICAgICAgICR1Y0xUeXBlICA9IHVjZmlyc3QoJGx0eXBlKTsKICAgICAgICAgICAgICAgICR1Y1JUeXBlICA9IHVjZmlyc3QoJHJ0eXBlKTsKCiAgICAgICAgICAgICAgICAvLyB0aGlzIHRyaWVzOgogICAgICAgICAgICAgICAgLy8gMS4gb3Bbb3AgbmFtZV1bbGVmdCB0eXBlXVtyaWdodCB0eXBlXQogICAgICAgICAgICAgICAgLy8gMi4gb3BbbGVmdCB0eXBlXVtyaWdodCB0eXBlXSAocGFzc2luZyB0aGUgb3AgYXMgZmlyc3QgYXJnCiAgICAgICAgICAgICAgICAvLyAzLiBvcFtvcCBuYW1lXQogICAgICAgICAgICAgICAgJGZuID0gIm9wJHt1Y09wTmFtZX0ke3VjTFR5cGV9JHt1Y1JUeXBlfSI7CgogICAgICAgICAgICAgICAgaWYgKGlzX2NhbGxhYmxlKGFycmF5KCR0aGlzLCAkZm4pKSB8fAogICAgICAgICAgICAgICAgICAgICgoJGZuID0gIm9wJHt1Y0xUeXBlfSR7dWNSVHlwZX0iKSAmJgogICAgICAgICAgICAgICAgICAgICAgICBpc19jYWxsYWJsZShhcnJheSgkdGhpcywgJGZuKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgJHBhc3NPcCA9IHRydWUpIHx8CiAgICAgICAgICAgICAgICAgICAgKCgkZm4gPSAib3Ake3VjT3BOYW1lfSIpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NhbGxhYmxlKGFycmF5KCR0aGlzLCAkZm4pKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAkZ2VuT3AgPSB0cnVlKQogICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvZXJjZVVuaXQgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCEgaXNzZXQoJGdlbk9wKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAkbGVmdFswXSA9PT0gVHlwZTo6VF9OVU1CRVIgJiYgJHJpZ2h0WzBdID09PSBUeXBlOjpUX05VTUJFUgogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAkY29lcmNlVW5pdCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRvcE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ211bCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldFVuaXQgPSAkbGVmdFsyXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHJpZ2h0WzJdIGFzICR1bml0ID0+ICRleHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldFVuaXRbJHVuaXRdID0gKGlzc2V0KCR0YXJnZXRVbml0WyR1bml0XSkgPyAkdGFyZ2V0VW5pdFskdW5pdF0gOiAwKSArICRleHA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rpdic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldFVuaXQgPSAkbGVmdFsyXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHJpZ2h0WzJdIGFzICR1bml0ID0+ICRleHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldFVuaXRbJHVuaXRdID0gKGlzc2V0KCR0YXJnZXRVbml0WyR1bml0XSkgPyAkdGFyZ2V0VW5pdFskdW5pdF0gOiAwKSAtICRleHA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21vZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldFVuaXQgPSAkbGVmdFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXRVbml0ID0gJGxlZnQtPnVuaXRsZXNzKCkgPyAkcmlnaHRbMl0gOiAkbGVmdFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgJGxlZnQtPnVuaXRsZXNzKCkgJiYgISAkcmlnaHQtPnVuaXRsZXNzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZWZ0ID0gJGxlZnQtPm5vcm1hbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJpZ2h0ID0gJHJpZ2h0LT5ub3JtYWxpemUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHNob3VsZEV2YWwgPSAkaW5QYXJlbnMgfHwgJGluRXhwOwoKICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHBhc3NPcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG91dCA9ICR0aGlzLT4kZm4oJG9wLCAkbGVmdCwgJHJpZ2h0LCAkc2hvdWxkRXZhbCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG91dCA9ICR0aGlzLT4kZm4oJGxlZnQsICRyaWdodCwgJHNob3VsZEV2YWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRvdXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY29lcmNlVW5pdCAmJiAkb3V0WzBdID09PSBUeXBlOjpUX05VTUJFUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG91dCA9ICRvdXQtPmNvZXJjZSgkdGFyZ2V0VW5pdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkb3V0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmV4cFRvU3RyaW5nKCR2YWx1ZSk7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfVU5BUlk6CiAgICAgICAgICAgICAgICBsaXN0KCwgJG9wLCAkZXhwLCAkaW5QYXJlbnMpID0gJHZhbHVlOwoKICAgICAgICAgICAgICAgICRpbkV4cCA9ICRpbkV4cCB8fCAkdGhpcy0+c2hvdWxkRXZhbCgkZXhwKTsKICAgICAgICAgICAgICAgICRleHAgPSAkdGhpcy0+cmVkdWNlKCRleHApOwoKICAgICAgICAgICAgICAgIGlmICgkZXhwWzBdID09PSBUeXBlOjpUX05VTUJFUikgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoJG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJysnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlXE51bWJlcigkZXhwWzFdLCAkZXhwWzJdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlXE51bWJlcigtJGV4cFsxXSwgJGV4cFsyXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkb3AgPT09ICdub3QnKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRpbkV4cCB8fCAkaW5QYXJlbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRleHAgPT09IHNlbGY6OiRmYWxzZSB8fCAkZXhwID09PSBzZWxmOjokbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OiR0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6JGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJG9wID0gJG9wIC4gJyAnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX1NUUklORywgJycsIGFycmF5KCRvcCwgJGV4cCkpOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1ZBUklBQkxFOgogICAgICAgICAgICAgICAgbGlzdCgsICRuYW1lKSA9ICR2YWx1ZTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlZHVjZSgkdGhpcy0+Z2V0KCRuYW1lKSk7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfTElTVDoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR2YWx1ZVsyXSBhcyAmJGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAkaXRlbSA9ICR0aGlzLT5yZWR1Y2UoJGl0ZW0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfTUFQOgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlWzFdIGFzICYkaXRlbSkgewogICAgICAgICAgICAgICAgICAgICRpdGVtID0gJHRoaXMtPnJlZHVjZSgkaXRlbSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlWzJdIGFzICYkaXRlbSkgewogICAgICAgICAgICAgICAgICAgICRpdGVtID0gJHRoaXMtPnJlZHVjZSgkaXRlbSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9TVFJJTkc6CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdmFsdWVbMl0gYXMgJiRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRpdGVtKSB8fCAkaXRlbSBpbnN0YW5jZW9mIFxBcnJheUFjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbSA9ICR0aGlzLT5yZWR1Y2UoJGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJHZhbHVlOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0lOVEVSUE9MQVRFOgogICAgICAgICAgICAgICAgJHZhbHVlWzFdID0gJHRoaXMtPnJlZHVjZSgkdmFsdWVbMV0pOwoKICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRlVOQ1RJT05fQ0FMTDoKICAgICAgICAgICAgICAgIGxpc3QoLCAkbmFtZSwgJGFyZ1ZhbHVlcykgPSAkdmFsdWU7CgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5mbmNhbGwoJG5hbWUsICRhcmdWYWx1ZXMpOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRnVuY3Rpb24gY2FsbGVyCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICogQHBhcmFtIGFycmF5ICAkYXJnVmFsdWVzCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZm5jYWxsKCRuYW1lLCAkYXJnVmFsdWVzKQogICAgewogICAgICAgIC8vIFNDU1MgQGZ1bmN0aW9uCiAgICAgICAgaWYgKCR0aGlzLT5jYWxsU2Nzc0Z1bmN0aW9uKCRuYW1lLCAkYXJnVmFsdWVzLCAkcmV0dXJuVmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmV0dXJuVmFsdWU7CiAgICAgICAgfQoKICAgICAgICAvLyBuYXRpdmUgUEhQIGZ1bmN0aW9ucwogICAgICAgIGlmICgkdGhpcy0+Y2FsbE5hdGl2ZUZ1bmN0aW9uKCRuYW1lLCAkYXJnVmFsdWVzLCAkcmV0dXJuVmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmV0dXJuVmFsdWU7CiAgICAgICAgfQoKICAgICAgICAvLyBmb3IgQ1NTIGZ1bmN0aW9ucywgc2ltcGx5IGZsYXR0ZW4gdGhlIGFyZ3VtZW50cyBpbnRvIGEgbGlzdAogICAgICAgICRsaXN0QXJncyA9IGFycmF5KCk7CgogICAgICAgIGZvcmVhY2ggKChhcnJheSkgJGFyZ1ZhbHVlcyBhcyAkYXJnKSB7CiAgICAgICAgICAgIGlmIChlbXB0eSgkYXJnWzBdKSkgewogICAgICAgICAgICAgICAgJGxpc3RBcmdzW10gPSAkdGhpcy0+cmVkdWNlKCRhcmdbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXkoVHlwZTo6VF9GVU5DVElPTiwgJG5hbWUsIGFycmF5KFR5cGU6OlRfTElTVCwgJywnLCAkbGlzdEFyZ3MpKTsKICAgIH0KCiAgICAvKioKICAgICAqIE5vcm1hbGl6ZSBuYW1lCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBub3JtYWxpemVOYW1lKCRuYW1lKQogICAgewogICAgICAgIHJldHVybiBzdHJfcmVwbGFjZSgnLScsICdfJywgJG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogTm9ybWFsaXplIHZhbHVlCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICR2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKCR2YWx1ZSkKICAgIHsKICAgICAgICAkdmFsdWUgPSAkdGhpcy0+Y29lcmNlRm9yRXhwcmVzc2lvbigkdGhpcy0+cmVkdWNlKCR2YWx1ZSkpOwogICAgICAgIGxpc3QoJHR5cGUpID0gJHZhbHVlOwoKICAgICAgICBzd2l0Y2ggKCR0eXBlKSB7CiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9MSVNUOgogICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPmV4dHJhY3RJbnRlcnBvbGF0aW9uKCR2YWx1ZSk7CgogICAgICAgICAgICAgICAgaWYgKCR2YWx1ZVswXSAhPT0gVHlwZTo6VF9MSVNUKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KFR5cGU6OlRfS0VZV09SRCwgJHRoaXMtPmNvbXBpbGVWYWx1ZSgkdmFsdWUpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdmFsdWVbMl0gYXMgJGtleSA9PiAkaXRlbSkgewogICAgICAgICAgICAgICAgICAgICR2YWx1ZVsyXVska2V5XSA9ICR0aGlzLT5ub3JtYWxpemVWYWx1ZSgkaXRlbSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9TVFJJTkc6CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJHR5cGUsICciJywgYXJyYXkoJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCR2YWx1ZSkpKTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9OVU1CRVI6CiAgICAgICAgICAgICAgICByZXR1cm4gJHZhbHVlLT5ub3JtYWxpemUoKTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9JTlRFUlBPTEFURToKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX0tFWVdPUkQsICR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlKSk7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgbnVtYmVycwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG9wQWRkTnVtYmVyTnVtYmVyKCRsZWZ0LCAkcmlnaHQpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBOb2RlXE51bWJlcigkbGVmdFsxXSArICRyaWdodFsxXSwgJGxlZnRbMl0pOwogICAgfQoKICAgIC8qKgogICAgICogTXVsdGlwbHkgbnVtYmVycwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG9wTXVsTnVtYmVyTnVtYmVyKCRsZWZ0LCAkcmlnaHQpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBOb2RlXE51bWJlcigkbGVmdFsxXSAqICRyaWdodFsxXSwgJGxlZnRbMl0pOwogICAgfQoKICAgIC8qKgogICAgICogU3VidHJhY3QgbnVtYmVycwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG9wU3ViTnVtYmVyTnVtYmVyKCRsZWZ0LCAkcmlnaHQpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBOb2RlXE51bWJlcigkbGVmdFsxXSAtICRyaWdodFsxXSwgJGxlZnRbMl0pOwogICAgfQoKICAgIC8qKgogICAgICogRGl2aWRlIG51bWJlcnMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGxlZnQKICAgICAqIEBwYXJhbSBhcnJheSAkcmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcERpdk51bWJlck51bWJlcigkbGVmdCwgJHJpZ2h0KQogICAgewogICAgICAgIGlmICgkcmlnaHRbMV0gPT0gMCkgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoVHlwZTo6VF9TVFJJTkcsICcnLCBhcnJheSgkbGVmdFsxXSAuICRsZWZ0WzJdIC4gJy8nIC4gJHJpZ2h0WzFdIC4gJHJpZ2h0WzJdKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IE5vZGVcTnVtYmVyKCRsZWZ0WzFdIC8gJHJpZ2h0WzFdLCAkbGVmdFsyXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNb2QgbnVtYmVycwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG9wTW9kTnVtYmVyTnVtYmVyKCRsZWZ0LCAkcmlnaHQpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBOb2RlXE51bWJlcigkbGVmdFsxXSAlICRyaWdodFsxXSwgJGxlZnRbMl0pOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIHN0cmluZ3MKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGxlZnQKICAgICAqIEBwYXJhbSBhcnJheSAkcmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcEFkZCgkbGVmdCwgJHJpZ2h0KQogICAgewogICAgICAgIGlmICgkc3RyTGVmdCA9ICR0aGlzLT5jb2VyY2VTdHJpbmcoJGxlZnQpKSB7CiAgICAgICAgICAgIGlmICgkcmlnaHRbMF0gPT09IFR5cGU6OlRfU1RSSU5HKSB7CiAgICAgICAgICAgICAgICAkcmlnaHRbMV0gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHN0ckxlZnRbMl1bXSA9ICRyaWdodDsKCiAgICAgICAgICAgIHJldHVybiAkc3RyTGVmdDsKICAgICAgICB9CgogICAgICAgIGlmICgkc3RyUmlnaHQgPSAkdGhpcy0+Y29lcmNlU3RyaW5nKCRyaWdodCkpIHsKICAgICAgICAgICAgaWYgKCRsZWZ0WzBdID09PSBUeXBlOjpUX1NUUklORykgewogICAgICAgICAgICAgICAgJGxlZnRbMV0gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkc3RyUmlnaHRbMl0sICRsZWZ0KTsKCiAgICAgICAgICAgIHJldHVybiAkc3RyUmlnaHQ7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQm9vbGVhbiBhbmQKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICAgJHJpZ2h0CiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkc2hvdWxkRXZhbAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG9wQW5kKCRsZWZ0LCAkcmlnaHQsICRzaG91bGRFdmFsKQogICAgewogICAgICAgIGlmICghICRzaG91bGRFdmFsKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkbGVmdCAhPT0gc2VsZjo6JGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVkdWNlKCRyaWdodCwgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGxlZnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBCb29sZWFuIG9yCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICAgJGxlZnQKICAgICAqIEBwYXJhbSBhcnJheSAgICRyaWdodAogICAgICogQHBhcmFtIGJvb2xlYW4gJHNob3VsZEV2YWwKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcE9yKCRsZWZ0LCAkcmlnaHQsICRzaG91bGRFdmFsKQogICAgewogICAgICAgIGlmICghICRzaG91bGRFdmFsKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkbGVmdCAhPT0gc2VsZjo6JGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiAkbGVmdDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+cmVkdWNlKCRyaWdodCwgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIGNvbG9ycwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG9wCiAgICAgKiBAcGFyYW0gYXJyYXkgICRsZWZ0CiAgICAgKiBAcGFyYW0gYXJyYXkgICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG9wQ29sb3JDb2xvcigkb3AsICRsZWZ0LCAkcmlnaHQpCiAgICB7CiAgICAgICAgJG91dCA9IGFycmF5KFR5cGU6OlRfQ09MT1IpOwoKICAgICAgICBmb3JlYWNoIChhcnJheSgxLCAyLCAzKSBhcyAkaSkgewogICAgICAgICAgICAkbHZhbCA9IGlzc2V0KCRsZWZ0WyRpXSkgPyAkbGVmdFskaV0gOiAwOwogICAgICAgICAgICAkcnZhbCA9IGlzc2V0KCRyaWdodFskaV0pID8gJHJpZ2h0WyRpXSA6IDA7CgogICAgICAgICAgICBzd2l0Y2ggKCRvcCkgewogICAgICAgICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgICAgICAgICAgJG91dFtdID0gJGx2YWwgKyAkcnZhbDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICctJzoKICAgICAgICAgICAgICAgICAgICAkb3V0W10gPSAkbHZhbCAtICRydmFsOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJyonOgogICAgICAgICAgICAgICAgICAgICRvdXRbXSA9ICRsdmFsICogJHJ2YWw7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnJSc6CiAgICAgICAgICAgICAgICAgICAgJG91dFtdID0gJGx2YWwgJSAkcnZhbDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICcvJzoKICAgICAgICAgICAgICAgICAgICBpZiAoJHJ2YWwgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dGhyb3dFcnJvcigiY29sb3I6IENhbid0IGRpdmlkZSBieSB6ZXJvIik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkb3V0W10gPSAoaW50KSAoJGx2YWwgLyAkcnZhbCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnPT0nOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b3BFcSgkbGVmdCwgJHJpZ2h0KTsKCiAgICAgICAgICAgICAgICBjYXNlICchPSc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vcE5lcSgkbGVmdCwgJHJpZ2h0KTsKCiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICR0aGlzLT50aHJvd0Vycm9yKCJjb2xvcjogdW5rbm93biBvcCAkb3AiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCRsZWZ0WzRdKSkgewogICAgICAgICAgICAkb3V0WzRdID0gJGxlZnRbNF07CiAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRyaWdodFs0XSkpIHsKICAgICAgICAgICAgJG91dFs0XSA9ICRyaWdodFs0XTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+Zml4Q29sb3IoJG91dCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIGNvbG9yIGFuZCBudW1iZXIKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvcAogICAgICogQHBhcmFtIGFycmF5ICAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICAkcmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcENvbG9yTnVtYmVyKCRvcCwgJGxlZnQsICRyaWdodCkKICAgIHsKICAgICAgICAkdmFsdWUgPSAkcmlnaHRbMV07CgogICAgICAgIHJldHVybiAkdGhpcy0+b3BDb2xvckNvbG9yKAogICAgICAgICAgICAkb3AsCiAgICAgICAgICAgICRsZWZ0LAogICAgICAgICAgICBhcnJheShUeXBlOjpUX0NPTE9SLCAkdmFsdWUsICR2YWx1ZSwgJHZhbHVlKQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIG51bWJlciBhbmQgY29sb3IKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvcAogICAgICogQHBhcmFtIGFycmF5ICAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICAkcmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcE51bWJlckNvbG9yKCRvcCwgJGxlZnQsICRyaWdodCkKICAgIHsKICAgICAgICAkdmFsdWUgPSAkbGVmdFsxXTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5vcENvbG9yQ29sb3IoCiAgICAgICAgICAgICRvcCwKICAgICAgICAgICAgYXJyYXkoVHlwZTo6VF9DT0xPUiwgJHZhbHVlLCAkdmFsdWUsICR2YWx1ZSksCiAgICAgICAgICAgICRyaWdodAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIG51bWJlcjEgPT0gbnVtYmVyMgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG9wRXEoJGxlZnQsICRyaWdodCkKICAgIHsKICAgICAgICBpZiAoKCRsU3RyID0gJHRoaXMtPmNvZXJjZVN0cmluZygkbGVmdCkpICYmICgkclN0ciA9ICR0aGlzLT5jb2VyY2VTdHJpbmcoJHJpZ2h0KSkpIHsKICAgICAgICAgICAgJGxTdHJbMV0gPSAnJzsKICAgICAgICAgICAgJHJTdHJbMV0gPSAnJzsKCiAgICAgICAgICAgICRsZWZ0ID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkbFN0cik7CiAgICAgICAgICAgICRyaWdodCA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHJTdHIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT50b0Jvb2woJGxlZnQgPT09ICRyaWdodCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIG51bWJlcjEgIT0gbnVtYmVyMgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG9wTmVxKCRsZWZ0LCAkcmlnaHQpCiAgICB7CiAgICAgICAgaWYgKCgkbFN0ciA9ICR0aGlzLT5jb2VyY2VTdHJpbmcoJGxlZnQpKSAmJiAoJHJTdHIgPSAkdGhpcy0+Y29lcmNlU3RyaW5nKCRyaWdodCkpKSB7CiAgICAgICAgICAgICRsU3RyWzFdID0gJyc7CiAgICAgICAgICAgICRyU3RyWzFdID0gJyc7CgogICAgICAgICAgICAkbGVmdCA9ICR0aGlzLT5jb21waWxlVmFsdWUoJGxTdHIpOwogICAgICAgICAgICAkcmlnaHQgPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCRyU3RyKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+dG9Cb29sKCRsZWZ0ICE9PSAkcmlnaHQpOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGFyZSBudW1iZXIxID49IG51bWJlcjIKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGxlZnQKICAgICAqIEBwYXJhbSBhcnJheSAkcmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcEd0ZU51bWJlck51bWJlcigkbGVmdCwgJHJpZ2h0KQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dG9Cb29sKCRsZWZ0WzFdID49ICRyaWdodFsxXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIG51bWJlcjEgPiBudW1iZXIyCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRsZWZ0CiAgICAgKiBAcGFyYW0gYXJyYXkgJHJpZ2h0CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gb3BHdE51bWJlck51bWJlcigkbGVmdCwgJHJpZ2h0KQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dG9Cb29sKCRsZWZ0WzFdID4gJHJpZ2h0WzFdKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbXBhcmUgbnVtYmVyMSA8PSBudW1iZXIyCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRsZWZ0CiAgICAgKiBAcGFyYW0gYXJyYXkgJHJpZ2h0CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gb3BMdGVOdW1iZXJOdW1iZXIoJGxlZnQsICRyaWdodCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvQm9vbCgkbGVmdFsxXSA8PSAkcmlnaHRbMV0pOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGFyZSBudW1iZXIxIDwgbnVtYmVyMgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG9wTHROdW1iZXJOdW1iZXIoJGxlZnQsICRyaWdodCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvQm9vbCgkbGVmdFsxXSA8ICRyaWdodFsxXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaHJlZS13YXkgY29tcGFyaXNvbiwgYWthIHNwYWNlc2hpcCBvcGVyYXRvcgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG9wQ21wTnVtYmVyTnVtYmVyKCRsZWZ0LCAkcmlnaHQpCiAgICB7CiAgICAgICAgJG4gPSAkbGVmdFsxXSAtICRyaWdodFsxXTsKCiAgICAgICAgcmV0dXJuIG5ldyBOb2RlXE51bWJlcigkbiA/ICRuIC8gYWJzKCRuKSA6IDAsICcnKTsKICAgIH0KCiAgICAvKioKICAgICAqIENhc3QgdG8gYm9vbGVhbgogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHRoaW5nCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdG9Cb29sKCR0aGluZykKICAgIHsKICAgICAgICByZXR1cm4gJHRoaW5nID8gc2VsZjo6JHRydWUgOiBzZWxmOjokZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlcyBhIHByaW1pdGl2ZSB2YWx1ZSBpbnRvIGEgQ1NTIHByb3BlcnR5IHZhbHVlLgogICAgICoKICAgICAqIFZhbHVlcyBpbiBzY3NzcGhwIGFyZSB0eXBlZCBieSBiZWluZyB3cmFwcGVkIGluIGFycmF5cywgdGhlaXIgZm9ybWF0IGlzCiAgICAgKiB0eXBpY2FsbHk6CiAgICAgKgogICAgICogICAgIGFycmF5KHR5cGUsIGNvbnRlbnRzIFssIGFkZGl0aW9uYWxfY29udGVudHNdKikKICAgICAqCiAgICAgKiBUaGUgaW5wdXQgaXMgZXhwZWN0ZWQgdG8gYmUgcmVkdWNlZC4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB3b3JrIG9uCiAgICAgKiB0aGluZ3MgbGlrZSBleHByZXNzaW9ucyBhbmQgdmFyaWFibGVzLgogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBpbGVWYWx1ZSgkdmFsdWUpCiAgICB7CiAgICAgICAgJHZhbHVlID0gJHRoaXMtPnJlZHVjZSgkdmFsdWUpOwoKICAgICAgICBsaXN0KCR0eXBlKSA9ICR2YWx1ZTsKCiAgICAgICAgc3dpdGNoICgkdHlwZSkgewogICAgICAgICAgICBjYXNlIFR5cGU6OlRfS0VZV09SRDoKICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWVbMV07CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfQ09MT1I6CiAgICAgICAgICAgICAgICAvLyBbMV0gLSByZWQgY29tcG9uZW50IChlaXRoZXIgbnVtYmVyIGZvciBhICUpCiAgICAgICAgICAgICAgICAvLyBbMl0gLSBncmVlbiBjb21wb25lbnQKICAgICAgICAgICAgICAgIC8vIFszXSAtIGJsdWUgY29tcG9uZW50CiAgICAgICAgICAgICAgICAvLyBbNF0gLSBvcHRpb25hbCBhbHBoYSBjb21wb25lbnQKICAgICAgICAgICAgICAgIGxpc3QoLCAkciwgJGcsICRiKSA9ICR2YWx1ZTsKCiAgICAgICAgICAgICAgICAkciA9IHJvdW5kKCRyKTsKICAgICAgICAgICAgICAgICRnID0gcm91bmQoJGcpOwogICAgICAgICAgICAgICAgJGIgPSByb3VuZCgkYik7CgogICAgICAgICAgICAgICAgaWYgKGNvdW50KCR2YWx1ZSkgPT09IDUgJiYgJHZhbHVlWzRdICE9PSAxKSB7IC8vIHJnYmEKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3JnYmEoJyAuICRyIC4gJywgJyAuICRnIC4gJywgJyAuICRiIC4gJywgJyAuICR2YWx1ZVs0XSAuICcpJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkaCA9IHNwcmludGYoJyMlMDJ4JTAyeCUwMngnLCAkciwgJGcsICRiKTsKCiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIGhleCBjb2xvciB0byBzaG9ydCBub3RhdGlvbiAoZS5nLiAjMDAzMzk5IHRvICMwMzkpCiAgICAgICAgICAgICAgICBpZiAoJGhbMV0gPT09ICRoWzJdICYmICRoWzNdID09PSAkaFs0XSAmJiAkaFs1XSA9PT0gJGhbNl0pIHsKICAgICAgICAgICAgICAgICAgICAkaCA9ICcjJyAuICRoWzFdIC4gJGhbM10gLiAkaFs1XTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJGg7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfTlVNQkVSOgogICAgICAgICAgICAgICAgcmV0dXJuICR2YWx1ZS0+b3V0cHV0KCR0aGlzKTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9TVFJJTkc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHZhbHVlWzFdIC4gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCR2YWx1ZSkgLiAkdmFsdWVbMV07CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRlVOQ1RJT046CiAgICAgICAgICAgICAgICAkYXJncyA9ICEgZW1wdHkoJHZhbHVlWzJdKSA/ICR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlWzJdKSA6ICcnOwoKICAgICAgICAgICAgICAgIHJldHVybiAiJHZhbHVlWzFdKCRhcmdzKSI7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfTElTVDoKICAgICAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5leHRyYWN0SW50ZXJwb2xhdGlvbigkdmFsdWUpOwoKICAgICAgICAgICAgICAgIGlmICgkdmFsdWVbMF0gIT09IFR5cGU6OlRfTElTVCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y29tcGlsZVZhbHVlKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGlzdCgsICRkZWxpbSwgJGl0ZW1zKSA9ICR2YWx1ZTsKCiAgICAgICAgICAgICAgICBpZiAoJGRlbGltICE9PSAnICcpIHsKICAgICAgICAgICAgICAgICAgICAkZGVsaW0gLj0gJyAnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRmaWx0ZXJlZCA9IGFycmF5KCk7CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRpdGVtWzBdID09PSBUeXBlOjpUX05VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkZmlsdGVyZWRbXSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJGl0ZW0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBpbXBsb2RlKCIkZGVsaW0iLCAkZmlsdGVyZWQpOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX01BUDoKICAgICAgICAgICAgICAgICRrZXlzID0gJHZhbHVlWzFdOwogICAgICAgICAgICAgICAgJHZhbHVlcyA9ICR2YWx1ZVsyXTsKICAgICAgICAgICAgICAgICRmaWx0ZXJlZCA9IGFycmF5KCk7CgogICAgICAgICAgICAgICAgZm9yICgkaSA9IDAsICRzID0gY291bnQoJGtleXMpOyAkaSA8ICRzOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgJGZpbHRlcmVkWyR0aGlzLT5jb21waWxlVmFsdWUoJGtleXNbJGldKV0gPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCR2YWx1ZXNbJGldKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBhcnJheV93YWxrKCRmaWx0ZXJlZCwgZnVuY3Rpb24gKCYkdmFsdWUsICRrZXkpIHsKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAka2V5IC4gJzogJyAuICR2YWx1ZTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHJldHVybiAnKCcgLiBpbXBsb2RlKCcsICcsICRmaWx0ZXJlZCkgLiAnKSc7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfSU5URVJQT0xBVEVEOgogICAgICAgICAgICAgICAgLy8gbm9kZSBjcmVhdGVkIGJ5IGV4dHJhY3RJbnRlcnBvbGF0aW9uCiAgICAgICAgICAgICAgICBsaXN0KCwgJGludGVycG9sYXRlLCAkbGVmdCwgJHJpZ2h0KSA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgIGxpc3QoLCwgJHdoaXRlTGVmdCwgJHdoaXRlUmlnaHQpID0gJGludGVycG9sYXRlOwoKICAgICAgICAgICAgICAgICRsZWZ0ID0gY291bnQoJGxlZnRbMl0pID4gMCA/CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvbXBpbGVWYWx1ZSgkbGVmdCkgLiAkd2hpdGVMZWZ0IDogJyc7CgogICAgICAgICAgICAgICAgJHJpZ2h0ID0gY291bnQoJHJpZ2h0WzJdKSA+IDAgPwogICAgICAgICAgICAgICAgICAgICR3aGl0ZVJpZ2h0IC4gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkcmlnaHQpIDogJyc7CgogICAgICAgICAgICAgICAgcmV0dXJuICRsZWZ0IC4gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkaW50ZXJwb2xhdGUpIC4gJHJpZ2h0OwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0lOVEVSUE9MQVRFOgogICAgICAgICAgICAgICAgLy8gcmF3IHBhcnNlIG5vZGUKICAgICAgICAgICAgICAgIGxpc3QoLCAkZXhwKSA9ICR2YWx1ZTsKCiAgICAgICAgICAgICAgICAvLyBzdHJpcCBxdW90ZXMgaWYgaXQncyBhIHN0cmluZwogICAgICAgICAgICAgICAgJHJlZHVjZWQgPSAkdGhpcy0+cmVkdWNlKCRleHApOwoKICAgICAgICAgICAgICAgIHN3aXRjaCAoJHJlZHVjZWRbMF0pIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGU6OlRfU1RSSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAkcmVkdWNlZCA9IGFycmF5KFR5cGU6OlRfS0VZV09SRCwgJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCRyZWR1Y2VkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGU6OlRfTlVMTDoKICAgICAgICAgICAgICAgICAgICAgICAgJHJlZHVjZWQgPSBhcnJheShUeXBlOjpUX0tFWVdPUkQsICcnKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkcmVkdWNlZCk7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfTlVMTDoKICAgICAgICAgICAgICAgIHJldHVybiAnbnVsbCc7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgJHRoaXMtPnRocm93RXJyb3IoInVua25vd24gdmFsdWUgdHlwZTogJHR5cGUiKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGbGF0dGVuIGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGxpc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmxhdHRlbkxpc3QoJGxpc3QpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb21waWxlVmFsdWUoJGxpc3QpOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSBzdHJpbmcgY29udGVudAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkc3RyaW5nCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBpbGVTdHJpbmdDb250ZW50KCRzdHJpbmcpCiAgICB7CiAgICAgICAgJHBhcnRzID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJHN0cmluZ1syXSBhcyAkcGFydCkgewogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHBhcnQpIHx8ICRwYXJ0IGluc3RhbmNlb2YgXEFycmF5QWNjZXNzKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHBhcnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkcGFydDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGltcGxvZGUoJHBhcnRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEV4dHJhY3QgaW50ZXJwb2xhdGlvbjsgaXQgZG9lc24ndCBuZWVkIHRvIGJlIHJlY3Vyc2l2ZSwgY29tcGlsZVZhbHVlIHdpbGwgaGFuZGxlIHRoYXQKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGxpc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0SW50ZXJwb2xhdGlvbigkbGlzdCkKICAgIHsKICAgICAgICAkaXRlbXMgPSAkbGlzdFsyXTsKCiAgICAgICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpID0+ICRpdGVtKSB7CiAgICAgICAgICAgIGlmICgkaXRlbVswXSA9PT0gVHlwZTo6VF9JTlRFUlBPTEFURSkgewogICAgICAgICAgICAgICAgJGJlZm9yZSA9IGFycmF5KFR5cGU6OlRfTElTVCwgJGxpc3RbMV0sIGFycmF5X3NsaWNlKCRpdGVtcywgMCwgJGkpKTsKICAgICAgICAgICAgICAgICRhZnRlciAgPSBhcnJheShUeXBlOjpUX0xJU1QsICRsaXN0WzFdLCBhcnJheV9zbGljZSgkaXRlbXMsICRpICsgMSkpOwoKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX0lOVEVSUE9MQVRFRCwgJGl0ZW0sICRiZWZvcmUsICRhZnRlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkbGlzdDsKICAgIH0KCiAgICAvKioKICAgICAqIEZpbmQgdGhlIGZpbmFsIHNldCBvZiBzZWxlY3RvcnMKICAgICAqCiAgICAgKiBAcGFyYW0gXExlYWZvXFNjc3NQaHBcQ29tcGlsZXJcRW52aXJvbm1lbnQgJGVudgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG11bHRpcGx5U2VsZWN0b3JzKEVudmlyb25tZW50ICRlbnYpCiAgICB7CiAgICAgICAgJGVudnMgICAgICAgICAgICA9ICR0aGlzLT5jb21wYWN0RW52KCRlbnYpOwogICAgICAgICRzZWxlY3RvcnMgICAgICAgPSBhcnJheSgpOwogICAgICAgICRwYXJlbnRTZWxlY3RvcnMgPSBhcnJheShhcnJheSgpKTsKCiAgICAgICAgd2hpbGUgKCRlbnYgPSBhcnJheV9wb3AoJGVudnMpKSB7CiAgICAgICAgICAgIGlmIChlbXB0eSgkZW52LT5zZWxlY3RvcnMpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNlbGVjdG9ycyA9IGFycmF5KCk7CgogICAgICAgICAgICBmb3JlYWNoICgkZW52LT5zZWxlY3RvcnMgYXMgJHNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcGFyZW50U2VsZWN0b3JzIGFzICRwYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAkc2VsZWN0b3JzW10gPSAkdGhpcy0+am9pblNlbGVjdG9ycygkcGFyZW50LCAkc2VsZWN0b3IpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkcGFyZW50U2VsZWN0b3JzID0gJHNlbGVjdG9yczsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkc2VsZWN0b3JzOwogICAgfQoKICAgIC8qKgogICAgICogSm9pbiBzZWxlY3RvcnM7IGxvb2tzIGZvciAmIHRvIHJlcGxhY2UsIG9yIGFwcGVuZCBwYXJlbnQgYmVmb3JlIGNoaWxkCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRwYXJlbnQKICAgICAqIEBwYXJhbSBhcnJheSAkY2hpbGQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBqb2luU2VsZWN0b3JzKCRwYXJlbnQsICRjaGlsZCkKICAgIHsKICAgICAgICAkc2V0U2VsZiA9IGZhbHNlOwogICAgICAgICRvdXQgPSBhcnJheSgpOwoKICAgICAgICBmb3JlYWNoICgkY2hpbGQgYXMgJHBhcnQpIHsKICAgICAgICAgICAgJG5ld1BhcnQgPSBhcnJheSgpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJHBhcnQgYXMgJHApIHsKICAgICAgICAgICAgICAgIGlmICgkcCA9PT0gc2VsZjo6JHNlbGZTZWxlY3RvcikgewogICAgICAgICAgICAgICAgICAgICRzZXRTZWxmID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHBhcmVudCBhcyAkaSA9PiAkcGFyZW50UGFydCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3V0W10gPSAkbmV3UGFydDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZXdQYXJ0ID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHBhcmVudFBhcnQgYXMgJHBwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbmV3UGFydFtdID0gJHBwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbmV3UGFydFtdID0gJHA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRvdXRbXSA9ICRuZXdQYXJ0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzZXRTZWxmID8gJG91dCA6IGFycmF5X21lcmdlKCRwYXJlbnQsICRjaGlsZCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNdWx0aXBseSBtZWRpYQogICAgICoKICAgICAqIEBwYXJhbSBcTGVhZm9cU2Nzc1BocFxDb21waWxlclxFbnZpcm9ubWVudCAkZW52CiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoaWxkUXVlcmllcwogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG11bHRpcGx5TWVkaWEoRW52aXJvbm1lbnQgJGVudiA9IG51bGwsICRjaGlsZFF1ZXJpZXMgPSBudWxsKQogICAgewogICAgICAgIGlmICghIGlzc2V0KCRlbnYpIHx8CiAgICAgICAgICAgICEgZW1wdHkoJGVudi0+YmxvY2stPnR5cGUpICYmICRlbnYtPmJsb2NrLT50eXBlICE9PSBUeXBlOjpUX01FRElBCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAkY2hpbGRRdWVyaWVzOwogICAgICAgIH0KCiAgICAgICAgLy8gcGxhaW4gb2xkIGJsb2NrLCBza2lwCiAgICAgICAgaWYgKGVtcHR5KCRlbnYtPmJsb2NrLT50eXBlKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm11bHRpcGx5TWVkaWEoJGVudi0+cGFyZW50LCAkY2hpbGRRdWVyaWVzKTsKICAgICAgICB9CgogICAgICAgICRwYXJlbnRRdWVyaWVzID0gaXNzZXQoJGVudi0+YmxvY2stPnF1ZXJ5TGlzdCkKICAgICAgICAgICAgPyAkZW52LT5ibG9jay0+cXVlcnlMaXN0CiAgICAgICAgICAgIDogYXJyYXkoYXJyYXkoYXJyYXkoVHlwZTo6VF9NRURJQV9WQUxVRSwgJGVudi0+YmxvY2stPnZhbHVlKSkpOwoKICAgICAgICBpZiAoJGNoaWxkUXVlcmllcyA9PT0gbnVsbCkgewogICAgICAgICAgICAkY2hpbGRRdWVyaWVzID0gJHBhcmVudFF1ZXJpZXM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG9yaWdpbmFsUXVlcmllcyA9ICRjaGlsZFF1ZXJpZXM7CiAgICAgICAgICAgICRjaGlsZFF1ZXJpZXMgPSBhcnJheSgpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJHBhcmVudFF1ZXJpZXMgYXMgJHBhcmVudFF1ZXJ5KSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkb3JpZ2luYWxRdWVyaWVzIGFzICRjaGlsZFF1ZXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgJGNoaWxkUXVlcmllcyBbXT0gYXJyYXlfbWVyZ2UoJHBhcmVudFF1ZXJ5LCAkY2hpbGRRdWVyeSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+bXVsdGlwbHlNZWRpYSgkZW52LT5wYXJlbnQsICRjaGlsZFF1ZXJpZXMpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBlbnYgbGlua2VkIGxpc3QgdG8gc3RhY2sKICAgICAqCiAgICAgKiBAcGFyYW0gXExlYWZvXFNjc3NQaHBcQ29tcGlsZXJcRW52aXJvbm1lbnQgJGVudgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBjb21wYWN0RW52KEVudmlyb25tZW50ICRlbnYpCiAgICB7CiAgICAgICAgZm9yICgkZW52cyA9IGFycmF5KCk7ICRlbnY7ICRlbnYgPSAkZW52LT5wYXJlbnQpIHsKICAgICAgICAgICAgJGVudnNbXSA9ICRlbnY7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGVudnM7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0IGVudiBzdGFjayB0byBzaW5nbHkgbGlua2VkIGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGVudnMKICAgICAqCiAgICAgKiBAcmV0dXJuIFxMZWFmb1xTY3NzUGhwXENvbXBpbGVyXEVudmlyb25tZW50CiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdEVudigkZW52cykKICAgIHsKICAgICAgICBmb3IgKCRlbnYgPSBudWxsOyAkZSA9IGFycmF5X3BvcCgkZW52cyk7KSB7CiAgICAgICAgICAgICRlLT5wYXJlbnQgPSAkZW52OwogICAgICAgICAgICAkZW52ID0gJGU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGVudjsKICAgIH0KCiAgICAvKioKICAgICAqIFB1c2ggZW52aXJvbm1lbnQKICAgICAqCiAgICAgKiBAcGFyYW0gXExlYWZvXFNjc3NQaHBcQmxvY2sgJGJsb2NrCiAgICAgKgogICAgICogQHJldHVybiBcTGVhZm9cU2Nzc1BocFxDb21waWxlclxFbnZpcm9ubWVudAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcHVzaEVudihCbG9jayAkYmxvY2sgPSBudWxsKQogICAgewogICAgICAgICRlbnYgPSBuZXcgRW52aXJvbm1lbnQ7CiAgICAgICAgJGVudi0+cGFyZW50ID0gJHRoaXMtPmVudjsKICAgICAgICAkZW52LT5zdG9yZSAgPSBhcnJheSgpOwogICAgICAgICRlbnYtPmJsb2NrICA9ICRibG9jazsKICAgICAgICAkZW52LT5kZXB0aCAgPSBpc3NldCgkdGhpcy0+ZW52LT5kZXB0aCkgPyAkdGhpcy0+ZW52LT5kZXB0aCArIDEgOiAwOwoKICAgICAgICAkdGhpcy0+ZW52ID0gJGVudjsKCiAgICAgICAgcmV0dXJuICRlbnY7CiAgICB9CgogICAgLyoqCiAgICAgKiBQb3AgZW52aXJvbm1lbnQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHBvcEVudigpCiAgICB7CiAgICAgICAgJHRoaXMtPmVudiA9ICR0aGlzLT5lbnYtPnBhcmVudDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBzdG9yZSBlbnZpcm9ubWVudAogICAgICoKICAgICAqIEByZXR1cm4gXExlYWZvXFNjc3NQaHBcQ29tcGlsZXJcRW52aXJvbm1lbnQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFN0b3JlRW52KCkKICAgIHsKICAgICAgICByZXR1cm4gaXNzZXQoJHRoaXMtPnN0b3JlRW52KSA/ICR0aGlzLT5zdG9yZUVudiA6ICR0aGlzLT5lbnY7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdmFyaWFibGUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWUKICAgICAqIEBwYXJhbSBtaXhlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUKICAgICAqIEBwYXJhbSBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2hhZG93CiAgICAgKiBAcGFyYW0gXExlYWZvXFNjc3NQaHBcQ29tcGlsZXJcRW52aXJvbm1lbnQgJGVudgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0KCRuYW1lLCAkdmFsdWUsICRzaGFkb3cgPSBmYWxzZSwgRW52aXJvbm1lbnQgJGVudiA9IG51bGwpCiAgICB7CiAgICAgICAgJG5hbWUgPSAkdGhpcy0+bm9ybWFsaXplTmFtZSgkbmFtZSk7CgogICAgICAgIGlmICghIGlzc2V0KCRlbnYpKSB7CiAgICAgICAgICAgICRlbnYgPSAkdGhpcy0+Z2V0U3RvcmVFbnYoKTsKICAgICAgICB9CgogICAgICAgIGlmICgkc2hhZG93KSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRSYXcoJG5hbWUsICR2YWx1ZSwgJGVudik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPnNldEV4aXN0aW5nKCRuYW1lLCAkdmFsdWUsICRlbnYpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCBleGlzdGluZyB2YXJpYWJsZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbmFtZQogICAgICogQHBhcmFtIG1peGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZQogICAgICogQHBhcmFtIFxMZWFmb1xTY3NzUGhwXENvbXBpbGVyXEVudmlyb25tZW50ICRlbnYKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldEV4aXN0aW5nKCRuYW1lLCAkdmFsdWUsIEVudmlyb25tZW50ICRlbnYpCiAgICB7CiAgICAgICAgJHN0b3JlRW52ID0gJGVudjsKCiAgICAgICAgJGhhc05hbWVzcGFjZSA9ICRuYW1lWzBdID09PSAnXicgfHwgJG5hbWVbMF0gPT09ICdAJyB8fCAkbmFtZVswXSA9PT0gJyUnOwoKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRuYW1lLCAkZW52LT5zdG9yZSkpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoISAkaGFzTmFtZXNwYWNlICYmIGlzc2V0KCRlbnYtPm1hcmtlcikpIHsKICAgICAgICAgICAgICAgICRlbnYgPSAkc3RvcmVFbnY7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEgaXNzZXQoJGVudi0+cGFyZW50KSkgewogICAgICAgICAgICAgICAgJGVudiA9ICRzdG9yZUVudjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZW52ID0gJGVudi0+cGFyZW50OwogICAgICAgIH0KCiAgICAgICAgJGVudi0+c3RvcmVbJG5hbWVdID0gJHZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHJhdyB2YXJpYWJsZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbmFtZQogICAgICogQHBhcmFtIG1peGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZQogICAgICogQHBhcmFtIFxMZWFmb1xTY3NzUGhwXENvbXBpbGVyXEVudmlyb25tZW50ICRlbnYKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldFJhdygkbmFtZSwgJHZhbHVlLCBFbnZpcm9ubWVudCAkZW52KQogICAgewogICAgICAgICRlbnYtPnN0b3JlWyRuYW1lXSA9ICR2YWx1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCB2YXJpYWJsZQogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWUKICAgICAqIEBwYXJhbSBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2hvdWxkVGhyb3cKICAgICAqIEBwYXJhbSBcTGVhZm9cU2Nzc1BocFxDb21waWxlclxFbnZpcm9ubWVudCAkZW52CiAgICAgKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0KCRuYW1lLCAkc2hvdWxkVGhyb3cgPSB0cnVlLCBFbnZpcm9ubWVudCAkZW52ID0gbnVsbCkKICAgIHsKICAgICAgICAkbmFtZSA9ICR0aGlzLT5ub3JtYWxpemVOYW1lKCRuYW1lKTsKCiAgICAgICAgaWYgKCEgaXNzZXQoJGVudikpIHsKICAgICAgICAgICAgJGVudiA9ICR0aGlzLT5nZXRTdG9yZUVudigpOwogICAgICAgIH0KCiAgICAgICAgJGhhc05hbWVzcGFjZSA9ICRuYW1lWzBdID09PSAnXicgfHwgJG5hbWVbMF0gPT09ICdAJyB8fCAkbmFtZVswXSA9PT0gJyUnOwoKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRuYW1lLCAkZW52LT5zdG9yZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkZW52LT5zdG9yZVskbmFtZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghICRoYXNOYW1lc3BhY2UgJiYgaXNzZXQoJGVudi0+bWFya2VyKSkgewogICAgICAgICAgICAgICAgJGVudiA9ICR0aGlzLT5yb290RW52OwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghIGlzc2V0KCRlbnYtPnBhcmVudCkpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZW52ID0gJGVudi0+cGFyZW50OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRzaG91bGRUaHJvdykgewogICAgICAgICAgICAkdGhpcy0+dGhyb3dFcnJvcigiVW5kZWZpbmVkIHZhcmlhYmxlIFwkJG5hbWUiKTsKICAgICAgICB9CgogICAgICAgIC8vIGZvdW5kIG5vdGhpbmcKICAgIH0KCiAgICAvKioKICAgICAqIEhhcyB2YXJpYWJsZT8KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWUKICAgICAqIEBwYXJhbSBcTGVhZm9cU2Nzc1BocFxDb21waWxlclxFbnZpcm9ubWVudCAkZW52CiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBoYXMoJG5hbWUsIEVudmlyb25tZW50ICRlbnYgPSBudWxsKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0KCRuYW1lLCBmYWxzZSwgJGVudikgIT09IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBJbmplY3QgdmFyaWFibGVzCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRhcmdzCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbmplY3RWYXJpYWJsZXMoYXJyYXkgJGFyZ3MpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRhcmdzKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkcGFyc2VyID0gJHRoaXMtPnBhcnNlckZhY3RvcnkoX19NRVRIT0RfXyk7CgogICAgICAgIGZvcmVhY2ggKCRhcmdzIGFzICRuYW1lID0+ICRzdHJWYWx1ZSkgewogICAgICAgICAgICBpZiAoJG5hbWVbMF0gPT09ICckJykgewogICAgICAgICAgICAgICAgJG5hbWUgPSBzdWJzdHIoJG5hbWUsIDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoISAkcGFyc2VyLT5wYXJzZVZhbHVlKCRzdHJWYWx1ZSwgJHZhbHVlKSkgewogICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPmNvZXJjZVZhbHVlKCRzdHJWYWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZXQoJG5hbWUsICR2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2V0IHZhcmlhYmxlcwogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHZhcmlhYmxlcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VmFyaWFibGVzKGFycmF5ICR2YXJpYWJsZXMpCiAgICB7CiAgICAgICAgJHRoaXMtPnJlZ2lzdGVyZWRWYXJzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPnJlZ2lzdGVyZWRWYXJzLCAkdmFyaWFibGVzKTsKICAgIH0KCiAgICAvKioKICAgICAqIFVuc2V0IHZhcmlhYmxlCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVuc2V0VmFyaWFibGUoJG5hbWUpCiAgICB7CiAgICAgICAgdW5zZXQoJHRoaXMtPnJlZ2lzdGVyZWRWYXJzWyRuYW1lXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGxpc3Qgb2YgdmFyaWFibGVzCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFZhcmlhYmxlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yZWdpc3RlcmVkVmFyczsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZHMgdG8gbGlzdCBvZiBwYXJzZWQgZmlsZXMKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkUGFyc2VkRmlsZSgkcGF0aCkKICAgIHsKICAgICAgICBpZiAoaXNzZXQoJHBhdGgpICYmIGZpbGVfZXhpc3RzKCRwYXRoKSkgewogICAgICAgICAgICAkdGhpcy0+cGFyc2VkRmlsZXNbcmVhbHBhdGgoJHBhdGgpXSA9IGZpbGVtdGltZSgkcGF0aCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBsaXN0IG9mIHBhcnNlZCBmaWxlcwogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQYXJzZWRGaWxlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wYXJzZWRGaWxlczsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBpbXBvcnQgcGF0aAogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRJbXBvcnRQYXRoKCRwYXRoKQogICAgewogICAgICAgIGlmICghIGluX2FycmF5KCRwYXRoLCAkdGhpcy0+aW1wb3J0UGF0aHMpKSB7CiAgICAgICAgICAgICR0aGlzLT5pbXBvcnRQYXRoc1tdID0gJHBhdGg7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2V0IGltcG9ydCBwYXRocwogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nfGFycmF5ICRwYXRoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRJbXBvcnRQYXRocygkcGF0aCkKICAgIHsKICAgICAgICAkdGhpcy0+aW1wb3J0UGF0aHMgPSAoYXJyYXkpICRwYXRoOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IG51bWJlciBwcmVjaXNpb24KICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGludGVnZXIgJG51bWJlclByZWNpc2lvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TnVtYmVyUHJlY2lzaW9uKCRudW1iZXJQcmVjaXNpb24pCiAgICB7CiAgICAgICAgTm9kZVxOdW1iZXI6OiRwcmVjaXNpb24gPSAkbnVtYmVyUHJlY2lzaW9uOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IGZvcm1hdHRlcgogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmb3JtYXR0ZXJOYW1lCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXR0ZXIoJGZvcm1hdHRlck5hbWUpCiAgICB7CiAgICAgICAgJHRoaXMtPmZvcm1hdHRlciA9ICRmb3JtYXR0ZXJOYW1lOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IGxpbmUgbnVtYmVyIHN0eWxlCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxpbmVOdW1iZXJTdHlsZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TGluZU51bWJlclN0eWxlKCRsaW5lTnVtYmVyU3R5bGUpCiAgICB7CiAgICAgICAgJHRoaXMtPmxpbmVOdW1iZXJTdHlsZSA9ICRsaW5lTnVtYmVyU3R5bGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWdpc3RlciBmdW5jdGlvbgogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgJG5hbWUKICAgICAqIEBwYXJhbSBjYWxsYWJsZSAkZnVuYwogICAgICogQHBhcmFtIGFycmF5ICAgICRwcm90b3R5cGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyRnVuY3Rpb24oJG5hbWUsICRmdW5jLCAkcHJvdG90eXBlID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+dXNlckZ1bmN0aW9uc1skdGhpcy0+bm9ybWFsaXplTmFtZSgkbmFtZSldID0gYXJyYXkoJGZ1bmMsICRwcm90b3R5cGUpOwogICAgfQoKICAgIC8qKgogICAgICogVW5yZWdpc3RlciBmdW5jdGlvbgogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB1bnJlZ2lzdGVyRnVuY3Rpb24oJG5hbWUpCiAgICB7CiAgICAgICAgdW5zZXQoJHRoaXMtPnVzZXJGdW5jdGlvbnNbJHRoaXMtPm5vcm1hbGl6ZU5hbWUoJG5hbWUpXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgZmVhdHVyZQogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRGZWF0dXJlKCRuYW1lKQogICAgewogICAgICAgICR0aGlzLT5yZWdpc3RlcmVkRmVhdHVyZXNbJG5hbWVdID0gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEltcG9ydCBmaWxlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aAogICAgICogQHBhcmFtIGFycmF5ICAkb3V0CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbXBvcnRGaWxlKCRwYXRoLCAkb3V0KQogICAgewogICAgICAgIC8vIHNlZSBpZiB0cmVlIGlzIGNhY2hlZAogICAgICAgICRyZWFsUGF0aCA9IHJlYWxwYXRoKCRwYXRoKTsKCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5pbXBvcnRDYWNoZVskcmVhbFBhdGhdKSkgewogICAgICAgICAgICAkdGhpcy0+aGFuZGxlSW1wb3J0TG9vcCgkcmVhbFBhdGgpOwoKICAgICAgICAgICAgJHRyZWUgPSAkdGhpcy0+aW1wb3J0Q2FjaGVbJHJlYWxQYXRoXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkY29kZSAgID0gZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwogICAgICAgICAgICAkcGFyc2VyID0gJHRoaXMtPnBhcnNlckZhY3RvcnkoJHBhdGgpOwogICAgICAgICAgICAkdHJlZSAgID0gJHBhcnNlci0+cGFyc2UoJGNvZGUpOwoKICAgICAgICAgICAgJHRoaXMtPmltcG9ydENhY2hlWyRyZWFsUGF0aF0gPSAkdHJlZTsKICAgICAgICB9CgogICAgICAgICRwaSA9IHBhdGhpbmZvKCRwYXRoKTsKICAgICAgICBhcnJheV91bnNoaWZ0KCR0aGlzLT5pbXBvcnRQYXRocywgJHBpWydkaXJuYW1lJ10pOwogICAgICAgICR0aGlzLT5jb21waWxlQ2hpbGRyZW5Ob1JldHVybigkdHJlZS0+Y2hpbGRyZW4sICRvdXQpOwogICAgICAgIGFycmF5X3NoaWZ0KCR0aGlzLT5pbXBvcnRQYXRocyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGZpbGUgcGF0aCBmb3IgYW4gaW1wb3J0IHVybCBpZiBpdCBleGlzdHMKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdXJsCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmd8bnVsbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZmluZEltcG9ydCgkdXJsKQogICAgewogICAgICAgICR1cmxzID0gYXJyYXkoKTsKCiAgICAgICAgLy8gZm9yICJub3JtYWwiIHNjc3MgaW1wb3J0cyAoaWdub3JlIHZhbmlsbGEgY3NzIGFuZCBleHRlcm5hbCByZXF1ZXN0cykKICAgICAgICBpZiAoISBwcmVnX21hdGNoKCcvXC5jc3MkfF5odHRwcz86XC9cLy8nLCAkdXJsKSkgewogICAgICAgICAgICAvLyB0cnkgYm90aCBub3JtYWwgYW5kIHRoZSBfcGFydGlhbCBmaWxlbmFtZQogICAgICAgICAgICAkdXJscyA9IGFycmF5KCR1cmwsIHByZWdfcmVwbGFjZSgnL1teXC9dKyQvJywgJ19cMCcsICR1cmwpKTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5pbXBvcnRQYXRocyBhcyAkZGlyKSB7CiAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJGRpcikpIHsKICAgICAgICAgICAgICAgIC8vIGNoZWNrIHVybHMgZm9yIG5vcm1hbCBpbXBvcnQgcGF0aHMKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR1cmxzIGFzICRmdWxsKSB7CiAgICAgICAgICAgICAgICAgICAgJGZ1bGwgPSAkZGlyCiAgICAgICAgICAgICAgICAgICAgICAgIC4gKCEgZW1wdHkoJGRpcikgJiYgc3Vic3RyKCRkaXIsIC0xKSAhPT0gJy8nID8gJy8nIDogJycpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJGZ1bGw7CgogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZmlsZUV4aXN0cygkZmlsZSA9ICRmdWxsIC4gJy5zY3NzJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZpbGVFeGlzdHMoJGZpbGUgPSAkZnVsbCkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlaWYgKGlzX2NhbGxhYmxlKCRkaXIpKSB7CiAgICAgICAgICAgICAgICAvLyBjaGVjayBjdXN0b20gY2FsbGJhY2sgZm9yIGltcG9ydCBwYXRoCiAgICAgICAgICAgICAgICAkZmlsZSA9IGNhbGxfdXNlcl9mdW5jKCRkaXIsICR1cmwpOwoKICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaHJvdyBlcnJvciAoZXhjZXB0aW9uKQogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtc2cgTWVzc2FnZSB3aXRoIG9wdGlvbmFsIHNwcmludGYoKS1zdHlsZSB2YXJhcmcgcGFyYW1ldGVycwogICAgICoKICAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdGhyb3dFcnJvcigkbXNnKQogICAgewogICAgICAgIGlmIChmdW5jX251bV9hcmdzKCkgPiAxKSB7CiAgICAgICAgICAgICRtc2cgPSBjYWxsX3VzZXJfZnVuY19hcnJheSgnc3ByaW50ZicsIGZ1bmNfZ2V0X2FyZ3MoKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPnNvdXJjZVBvcyA+PSAwICYmIGlzc2V0KCR0aGlzLT5zb3VyY2VJbmRleCkpIHsKICAgICAgICAgICAgJHBhcnNlciA9ICR0aGlzLT5zb3VyY2VQYXJzZXJzWyR0aGlzLT5zb3VyY2VJbmRleF07CiAgICAgICAgICAgICRwYXJzZXItPnRocm93UGFyc2VFcnJvcigkbXNnLCAkdGhpcy0+c291cmNlUG9zKTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBcRXhjZXB0aW9uKCRtc2cpOwogICAgfQoKICAgIC8qKgogICAgICogSGFuZGxlIGltcG9ydCBsb29wCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICoKICAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZUltcG9ydExvb3AoJG5hbWUpCiAgICB7CiAgICAgICAgZm9yICgkZW52ID0gJHRoaXMtPmVudjsgJGVudjsgJGVudiA9ICRlbnYtPnBhcmVudCkgewogICAgICAgICAgICAkcGFyc2VyID0gJHRoaXMtPnNvdXJjZVBhcnNlcnNbJGVudi0+YmxvY2stPnNvdXJjZUluZGV4XTsKICAgICAgICAgICAgJGZpbGUgPSAkcGFyc2VyLT5nZXRTb3VyY2VOYW1lKCk7CgogICAgICAgICAgICBpZiAocmVhbHBhdGgoJGZpbGUpID09PSAkbmFtZSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnRocm93RXJyb3IoJ0FuIEBpbXBvcnQgbG9vcCBoYXMgYmVlbiBmb3VuZDogJXMgaW1wb3J0cyAlcycsICRmaWxlLCBiYXNlbmFtZSgkZmlsZSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRG9lcyBmaWxlIGV4aXN0PwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZpbGVFeGlzdHMoJG5hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuIGlzX2ZpbGUoJG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogQ2FsbCBTQ1NTIEBmdW5jdGlvbgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEBwYXJhbSBhcnJheSAgJGFyZ3MKICAgICAqIEBwYXJhbSBhcnJheSAgJHJldHVyblZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuIFJldHVybnMgdHJ1ZSBpZiByZXR1cm5WYWx1ZSBpcyBzZXQ7IG90aGVyd2lzZSwgZmFsc2UKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNhbGxTY3NzRnVuY3Rpb24oJG5hbWUsICRhcmdWYWx1ZXMsICYkcmV0dXJuVmFsdWUpCiAgICB7CiAgICAgICAgJGZ1bmMgPSAkdGhpcy0+Z2V0KHNlbGY6OiRuYW1lc3BhY2VzWydmdW5jdGlvbiddIC4gJG5hbWUsIGZhbHNlKTsKCiAgICAgICAgaWYgKCEgJGZ1bmMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnB1c2hFbnYoKTsKCiAgICAgICAgLy8gc2V0IHRoZSBhcmdzCiAgICAgICAgaWYgKGlzc2V0KCRmdW5jLT5hcmdzKSkgewogICAgICAgICAgICAkdGhpcy0+YXBwbHlBcmd1bWVudHMoJGZ1bmMtPmFyZ3MsICRhcmdWYWx1ZXMpOwogICAgICAgIH0KCiAgICAgICAgLy8gdGhyb3cgYXdheSBsaW5lcyBhbmQgY2hpbGRyZW4KICAgICAgICAkdG1wID0gbmV3IE91dHB1dEJsb2NrOwogICAgICAgICR0bXAtPmxpbmVzICAgID0gYXJyYXkoKTsKICAgICAgICAkdG1wLT5jaGlsZHJlbiA9IGFycmF5KCk7CgogICAgICAgICR0aGlzLT5lbnYtPm1hcmtlciA9ICdmdW5jdGlvbic7CgogICAgICAgICRyZXQgPSAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuKCRmdW5jLT5jaGlsZHJlbiwgJHRtcCk7CgogICAgICAgICR0aGlzLT5wb3BFbnYoKTsKCiAgICAgICAgJHJldHVyblZhbHVlID0gISBpc3NldCgkcmV0KSA/IHNlbGY6OiRkZWZhdWx0VmFsdWUgOiAkcmV0OwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGwgYnVpbHQtaW4gYW5kIHJlZ2lzdGVyZWQgKFBIUCkgZnVuY3Rpb25zCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICogQHBhcmFtIGFycmF5ICAkYXJncwogICAgICogQHBhcmFtIGFycmF5ICAkcmV0dXJuVmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJucyB0cnVlIGlmIHJldHVyblZhbHVlIGlzIHNldDsgb3RoZXJ3aXNlLCBmYWxzZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY2FsbE5hdGl2ZUZ1bmN0aW9uKCRuYW1lLCAkYXJncywgJiRyZXR1cm5WYWx1ZSkKICAgIHsKICAgICAgICAvLyB0cnkgYSBsaWIgZnVuY3Rpb24KICAgICAgICAkbmFtZSA9ICR0aGlzLT5ub3JtYWxpemVOYW1lKCRuYW1lKTsKCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT51c2VyRnVuY3Rpb25zWyRuYW1lXSkpIHsKICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiBmaW5kIGEgdXNlciBmdW5jdGlvbgogICAgICAgICAgICBsaXN0KCRmLCAkcHJvdG90eXBlKSA9ICR0aGlzLT51c2VyRnVuY3Rpb25zWyRuYW1lXTsKICAgICAgICB9IGVsc2VpZiAoKCRmID0gJHRoaXMtPmdldEJ1aWx0aW5GdW5jdGlvbigkbmFtZSkpICYmIGlzX2NhbGxhYmxlKCRmKSkgewogICAgICAgICAgICAkbGliTmFtZSAgID0gJGZbMV07CiAgICAgICAgICAgICRwcm90b3R5cGUgPSBpc3NldChzZWxmOjokJGxpYk5hbWUpID8gc2VsZjo6JCRsaWJOYW1lIDogbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBsaXN0KCRzb3J0ZWQsICRrd2FyZ3MpID0gJHRoaXMtPnNvcnRBcmdzKCRwcm90b3R5cGUsICRhcmdzKTsKCiAgICAgICAgaWYgKCRuYW1lICE9PSAnaWYnICYmICRuYW1lICE9PSAnY2FsbCcpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHNvcnRlZCBhcyAmJHZhbCkgewogICAgICAgICAgICAgICAgJHZhbCA9ICR0aGlzLT5yZWR1Y2UoJHZhbCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRyZXR1cm5WYWx1ZSA9IGNhbGxfdXNlcl9mdW5jKCRmLCAkc29ydGVkLCAka3dhcmdzKTsKCiAgICAgICAgaWYgKCEgaXNzZXQoJHJldHVyblZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkcmV0dXJuVmFsdWUgPSAkdGhpcy0+Y29lcmNlVmFsdWUoJHJldHVyblZhbHVlKTsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYnVpbHQtaW4gZnVuY3Rpb24KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIE5vcm1hbGl6ZWQgbmFtZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEJ1aWx0aW5GdW5jdGlvbigkbmFtZSkKICAgIHsKICAgICAgICAkbGliTmFtZSA9ICdsaWInIC4gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKAogICAgICAgICAgICAnL18oLikvJywKICAgICAgICAgICAgZnVuY3Rpb24gKCRtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdWNmaXJzdCgkbVsxXSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHVjZmlyc3QoJG5hbWUpCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIGFycmF5KCR0aGlzLCAkbGliTmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTb3J0cyBrZXl3b3JkIGFyZ3VtZW50cwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkcHJvdG90eXBlCiAgICAgKiBAcGFyYW0gYXJyYXkgJGFyZ3MKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzb3J0QXJncygkcHJvdG90eXBlLCAkYXJncykKICAgIHsKICAgICAgICAka2V5QXJncyA9IGFycmF5KCk7CiAgICAgICAgJHBvc0FyZ3MgPSBhcnJheSgpOwoKICAgICAgICAvLyBzZXBhcmF0ZSBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cwogICAgICAgIGZvcmVhY2ggKCRhcmdzIGFzICRhcmcpIHsKICAgICAgICAgICAgbGlzdCgka2V5LCAkdmFsdWUpID0gJGFyZzsKCiAgICAgICAgICAgICRrZXkgPSAka2V5WzFdOwoKICAgICAgICAgICAgaWYgKGVtcHR5KCRrZXkpKSB7CiAgICAgICAgICAgICAgICAkcG9zQXJnc1tdID0gJHZhbHVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGtleUFyZ3NbJGtleV0gPSAkdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghIGlzc2V0KCRwcm90b3R5cGUpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgkcG9zQXJncywgJGtleUFyZ3MpOwogICAgICAgIH0KCiAgICAgICAgLy8gY29weSBwb3NpdGlvbmFsIGFyZ3MKICAgICAgICAkZmluYWxBcmdzID0gYXJyYXlfcGFkKCRwb3NBcmdzLCBjb3VudCgkcHJvdG90eXBlKSwgbnVsbCk7CgogICAgICAgIC8vIG92ZXJ3cml0ZSBwb3NpdGlvbmFsIGFyZ3Mgd2l0aCBrZXl3b3JkIGFyZ3MKICAgICAgICBmb3JlYWNoICgkcHJvdG90eXBlIGFzICRpID0+ICRuYW1lcykgewogICAgICAgICAgICBmb3JlYWNoICgoYXJyYXkpICRuYW1lcyBhcyAkbmFtZSkgewogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRrZXlBcmdzWyRuYW1lXSkpIHsKICAgICAgICAgICAgICAgICAgICAkZmluYWxBcmdzWyRpXSA9ICRrZXlBcmdzWyRuYW1lXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFycmF5KCRmaW5hbEFyZ3MsICRrZXlBcmdzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGx5IGFyZ3VtZW50IHZhbHVlcyBwZXIgZGVmaW5pdGlvbgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkYXJnRGVmCiAgICAgKiBAcGFyYW0gYXJyYXkgJGFyZ1ZhbHVlcwogICAgICoKICAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXBwbHlBcmd1bWVudHMoJGFyZ0RlZiwgJGFyZ1ZhbHVlcykKICAgIHsKICAgICAgICAkc3RvcmVFbnYgPSAkdGhpcy0+Z2V0U3RvcmVFbnYoKTsKCiAgICAgICAgJGVudiA9IG5ldyBFbnZpcm9ubWVudDsKICAgICAgICAkZW52LT5zdG9yZSA9ICRzdG9yZUVudi0+c3RvcmU7CgogICAgICAgICRoYXNWYXJpYWJsZSA9IGZhbHNlOwogICAgICAgICRhcmdzID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJGFyZ0RlZiBhcyAkaSA9PiAkYXJnKSB7CiAgICAgICAgICAgIGxpc3QoJG5hbWUsICRkZWZhdWx0LCAkaXNWYXJpYWJsZSkgPSAkYXJnRGVmWyRpXTsKCiAgICAgICAgICAgICRhcmdzWyRuYW1lXSA9IGFycmF5KCRpLCAkbmFtZSwgJGRlZmF1bHQsICRpc1ZhcmlhYmxlKTsKICAgICAgICAgICAgJGhhc1ZhcmlhYmxlIHw9ICRpc1ZhcmlhYmxlOwogICAgICAgIH0KCiAgICAgICAgJGtleXdvcmRBcmdzID0gYXJyYXkoKTsKICAgICAgICAkZGVmZXJyZWRLZXl3b3JkQXJncyA9IGFycmF5KCk7CiAgICAgICAgJHJlbWFpbmluZyA9IGFycmF5KCk7CgogICAgICAgIC8vIGFzc2lnbiB0aGUga2V5d29yZCBhcmdzCiAgICAgICAgZm9yZWFjaCAoKGFycmF5KSAkYXJnVmFsdWVzIGFzICRhcmcpIHsKICAgICAgICAgICAgaWYgKCEgZW1wdHkoJGFyZ1swXSkpIHsKICAgICAgICAgICAgICAgIGlmICghIGlzc2V0KCRhcmdzWyRhcmdbMF1bMV1dKSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkaGFzVmFyaWFibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRlZmVycmVkS2V5d29yZEFyZ3NbJGFyZ1swXVsxXV0gPSAkYXJnWzFdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50aHJvd0Vycm9yKCJNaXhpbiBvciBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgYW4gYXJndW1lbnQgbmFtZWQgJCVzLiIsICRhcmdbMF1bMV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkYXJnc1skYXJnWzBdWzFdXVswXSA8IGNvdW50KCRyZW1haW5pbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRocm93RXJyb3IoIlRoZSBhcmd1bWVudCAkJXMgd2FzIHBhc3NlZCBib3RoIGJ5IHBvc2l0aW9uIGFuZCBieSBuYW1lLiIsICRhcmdbMF1bMV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAka2V5d29yZEFyZ3NbJGFyZ1swXVsxXV0gPSAkYXJnWzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoY291bnQoJGtleXdvcmRBcmdzKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnRocm93RXJyb3IoJ1Bvc2l0aW9uYWwgYXJndW1lbnRzIG11c3QgY29tZSBiZWZvcmUga2V5d29yZCBhcmd1bWVudHMuJyk7CiAgICAgICAgICAgIH0gZWxzZWlmICgkYXJnWzJdID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAkdmFsID0gJHRoaXMtPnJlZHVjZSgkYXJnWzFdLCB0cnVlKTsKCiAgICAgICAgICAgICAgICBpZiAoJHZhbFswXSA9PT0gVHlwZTo6VF9MSVNUKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHZhbFsyXSBhcyAkbmFtZSA9PiAkaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBpc19udW1lcmljKCRuYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGtleXdvcmRBcmdzWyRuYW1lXSA9ICRpdGVtOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlbWFpbmluZ1tdID0gJGl0ZW07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHZhbFswXSA9PT0gVHlwZTo6VF9NQVApIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkdmFsWzFdIGFzICRpID0+ICRuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCR0aGlzLT5jb2VyY2VTdHJpbmcoJG5hbWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW0gPSAkdmFsWzJdWyRpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGlzX251bWVyaWMoJG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAka2V5d29yZEFyZ3NbJG5hbWVdID0gJGl0ZW07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVtYWluaW5nW10gPSAkaXRlbTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHJlbWFpbmluZ1tdID0gJHZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZW1haW5pbmdbXSA9ICRhcmdbMV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCRhcmdzIGFzICRhcmcpIHsKICAgICAgICAgICAgbGlzdCgkaSwgJG5hbWUsICRkZWZhdWx0LCAkaXNWYXJpYWJsZSkgPSAkYXJnOwoKICAgICAgICAgICAgaWYgKCRpc1ZhcmlhYmxlKSB7CiAgICAgICAgICAgICAgICAkdmFsID0gYXJyYXkoVHlwZTo6VF9MSVNULCAnLCcsIGFycmF5KCksICRpc1ZhcmlhYmxlKTsKCiAgICAgICAgICAgICAgICBmb3IgKCRjb3VudCA9IGNvdW50KCRyZW1haW5pbmcpOyAkaSA8ICRjb3VudDsgJGkrKykgewogICAgICAgICAgICAgICAgICAgICR2YWxbMl1bXSA9ICRyZW1haW5pbmdbJGldOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkZWZlcnJlZEtleXdvcmRBcmdzIGFzICRpdGVtTmFtZSA9PiAkaXRlbSkgewogICAgICAgICAgICAgICAgICAgICR2YWxbMl1bJGl0ZW1OYW1lXSA9ICRpdGVtOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoaXNzZXQoJHJlbWFpbmluZ1skaV0pKSB7CiAgICAgICAgICAgICAgICAkdmFsID0gJHJlbWFpbmluZ1skaV07CiAgICAgICAgICAgIH0gZWxzZWlmIChpc3NldCgka2V5d29yZEFyZ3NbJG5hbWVdKSkgewogICAgICAgICAgICAgICAgJHZhbCA9ICRrZXl3b3JkQXJnc1skbmFtZV07CiAgICAgICAgICAgIH0gZWxzZWlmICghIGVtcHR5KCRkZWZhdWx0KSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+dGhyb3dFcnJvcigiTWlzc2luZyBhcmd1bWVudCAkbmFtZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2V0KCRuYW1lLCAkdGhpcy0+cmVkdWNlKCR2YWwsIHRydWUpLCB0cnVlLCAkZW52KTsKICAgICAgICB9CgogICAgICAgICRzdG9yZUVudi0+c3RvcmUgPSAkZW52LT5zdG9yZTsKCiAgICAgICAgZm9yZWFjaCAoJGFyZ3MgYXMgJGFyZykgewogICAgICAgICAgICBsaXN0KCRpLCAkbmFtZSwgJGRlZmF1bHQsICRpc1ZhcmlhYmxlKSA9ICRhcmc7CgogICAgICAgICAgICBpZiAoJGlzVmFyaWFibGUgfHwgaXNzZXQoJHJlbWFpbmluZ1skaV0pIHx8IGlzc2V0KCRrZXl3b3JkQXJnc1skbmFtZV0pIHx8IGVtcHR5KCRkZWZhdWx0KSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZXQoJG5hbWUsICR0aGlzLT5yZWR1Y2UoJGRlZmF1bHQsIHRydWUpLCB0cnVlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDb2VyY2UgYSBwaHAgdmFsdWUgaW50byBhIHNjc3Mgb25lCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICR2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBjb2VyY2VWYWx1ZSgkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKGlzX2FycmF5KCR2YWx1ZSkgfHwgJHZhbHVlIGluc3RhbmNlb2YgXEFycmF5QWNjZXNzKSB7CiAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNfYm9vbCgkdmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dG9Cb29sKCR2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgICR2YWx1ZSA9IHNlbGY6OiRudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzX251bWVyaWMoJHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVcTnVtYmVyKCR2YWx1ZSwgJycpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR2YWx1ZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OiRlbXB0eVN0cmluZzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX0tFWVdPUkQsICR2YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb2VyY2Ugc29tZXRoaW5nIHRvIG1hcAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkaXRlbQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvZXJjZU1hcCgkaXRlbSkKICAgIHsKICAgICAgICBpZiAoJGl0ZW1bMF0gPT09IFR5cGU6OlRfTUFQKSB7CiAgICAgICAgICAgIHJldHVybiAkaXRlbTsKICAgICAgICB9CgogICAgICAgIGlmICgkaXRlbSA9PT0gc2VsZjo6JGVtcHR5TGlzdCkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6JGVtcHR5TWFwOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFycmF5KFR5cGU6OlRfTUFQLCBhcnJheSgkaXRlbSksIGFycmF5KHNlbGY6OiRudWxsKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb2VyY2Ugc29tZXRoaW5nIHRvIGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGl0ZW0KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb2VyY2VMaXN0KCRpdGVtLCAkZGVsaW0gPSAnLCcpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCRpdGVtKSAmJiAkaXRlbVswXSA9PT0gVHlwZTo6VF9MSVNUKSB7CiAgICAgICAgICAgIHJldHVybiAkaXRlbTsKICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkaXRlbSkgJiYgJGl0ZW1bMF0gPT09IFR5cGU6OlRfTUFQKSB7CiAgICAgICAgICAgICRrZXlzID0gJGl0ZW1bMV07CiAgICAgICAgICAgICR2YWx1ZXMgPSAkaXRlbVsyXTsKICAgICAgICAgICAgJGxpc3QgPSBhcnJheSgpOwoKICAgICAgICAgICAgZm9yICgkaSA9IDAsICRzID0gY291bnQoJGtleXMpOyAkaSA8ICRzOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAka2V5ID0gJGtleXNbJGldOwogICAgICAgICAgICAgICAgJHZhbHVlID0gJHZhbHVlc1skaV07CgogICAgICAgICAgICAgICAgJGxpc3RbXSA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgIFR5cGU6OlRfTElTVCwKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICBhcnJheShhcnJheShUeXBlOjpUX0tFWVdPUkQsICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkdGhpcy0+Y29lcmNlU3RyaW5nKCRrZXkpKSksICR2YWx1ZSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX0xJU1QsICcsJywgJGxpc3QpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFycmF5KFR5cGU6OlRfTElTVCwgJGRlbGltLCAhIGlzc2V0KCRpdGVtKSA/IGFycmF5KCk6IGFycmF5KCRpdGVtKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb2VyY2UgY29sb3IgZm9yIGV4cHJlc3Npb24KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb2VyY2VGb3JFeHByZXNzaW9uKCR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoJGNvbG9yID0gJHRoaXMtPmNvZXJjZUNvbG9yKCR2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuICRjb2xvcjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb2VyY2UgdmFsdWUgdG8gY29sb3IKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb2VyY2VDb2xvcigkdmFsdWUpCiAgICB7CiAgICAgICAgc3dpdGNoICgkdmFsdWVbMF0pIHsKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0NPTE9SOgogICAgICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9LRVlXT1JEOgogICAgICAgICAgICAgICAgJG5hbWUgPSBzdHJ0b2xvd2VyKCR2YWx1ZVsxXSk7CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KENvbG9yczo6JGNzc0NvbG9yc1skbmFtZV0pKSB7CiAgICAgICAgICAgICAgICAgICAgJHJnYmEgPSBleHBsb2RlKCcsJywgQ29sb3JzOjokY3NzQ29sb3JzWyRuYW1lXSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc3NldCgkcmdiYVszXSkKICAgICAgICAgICAgICAgICAgICAgICAgPyBhcnJheShUeXBlOjpUX0NPTE9SLCAoaW50KSAkcmdiYVswXSwgKGludCkgJHJnYmFbMV0sIChpbnQpICRyZ2JhWzJdLCAoaW50KSAkcmdiYVszXSkKICAgICAgICAgICAgICAgICAgICAgICAgOiBhcnJheShUeXBlOjpUX0NPTE9SLCAoaW50KSAkcmdiYVswXSwgKGludCkgJHJnYmFbMV0sIChpbnQpICRyZ2JhWzJdKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQ29lcmNlIHZhbHVlIHRvIHN0cmluZwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fG51bGwKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvZXJjZVN0cmluZygkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCR2YWx1ZVswXSA9PT0gVHlwZTo6VF9TVFJJTkcpIHsKICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX1NUUklORywgJycsIGFycmF5KCR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlKSkpOwogICAgfQoKICAgIC8qKgogICAgICogQ29lcmNlIHZhbHVlIHRvIGEgcGVyY2VudGFnZQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGludGVnZXJ8ZmxvYXQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvZXJjZVBlcmNlbnQoJHZhbHVlKQogICAgewogICAgICAgIGlmICgkdmFsdWVbMF0gPT09IFR5cGU6OlRfTlVNQkVSKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkdmFsdWVbMl1bJyUnXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWVbMV0gLyAxMDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkdmFsdWVbMV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc2VydCB2YWx1ZSBpcyBhIG1hcAogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICoKICAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0TWFwKCR2YWx1ZSkKICAgIHsKICAgICAgICAkdmFsdWUgPSAkdGhpcy0+Y29lcmNlTWFwKCR2YWx1ZSk7CgogICAgICAgIGlmICgkdmFsdWVbMF0gIT09IFR5cGU6OlRfTUFQKSB7CiAgICAgICAgICAgICR0aGlzLT50aHJvd0Vycm9yKCdleHBlY3RpbmcgbWFwJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogQXNzZXJ0IHZhbHVlIGlzIGEgbGlzdAogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICoKICAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0TGlzdCgkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCR2YWx1ZVswXSAhPT0gVHlwZTo6VF9MSVNUKSB7CiAgICAgICAgICAgICR0aGlzLT50aHJvd0Vycm9yKCdleHBlY3RpbmcgbGlzdCcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc2VydCB2YWx1ZSBpcyBhIGNvbG9yCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKgogICAgICogQHRocm93cyBcRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRDb2xvcigkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCRjb2xvciA9ICR0aGlzLT5jb2VyY2VDb2xvcigkdmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiAkY29sb3I7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+dGhyb3dFcnJvcignZXhwZWN0aW5nIGNvbG9yJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBc3NlcnQgdmFsdWUgaXMgYSBudW1iZXIKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICR2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ZWdlcnxmbG9hdAogICAgICoKICAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0TnVtYmVyKCR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlWzBdICE9PSBUeXBlOjpUX05VTUJFUikgewogICAgICAgICAgICAkdGhpcy0+dGhyb3dFcnJvcignZXhwZWN0aW5nIG51bWJlcicpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR2YWx1ZVsxXTsKICAgIH0KCiAgICAvKioKICAgICAqIE1ha2Ugc3VyZSBhIGNvbG9yJ3MgY29tcG9uZW50cyBkb24ndCBnbyBvdXQgb2YgYm91bmRzCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRjCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZml4Q29sb3IoJGMpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoYXJyYXkoMSwgMiwgMykgYXMgJGkpIHsKICAgICAgICAgICAgaWYgKCRjWyRpXSA8IDApIHsKICAgICAgICAgICAgICAgICRjWyRpXSA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkY1skaV0gPiAyNTUpIHsKICAgICAgICAgICAgICAgICRjWyRpXSA9IDI1NTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRjOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBSR0IgdG8gSFNMCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRyZWQKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRncmVlbgogICAgICogQHBhcmFtIGludGVnZXIgJGJsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0b0hTTCgkcmVkLCAkZ3JlZW4sICRibHVlKQogICAgewogICAgICAgICRtaW4gPSBtaW4oJHJlZCwgJGdyZWVuLCAkYmx1ZSk7CiAgICAgICAgJG1heCA9IG1heCgkcmVkLCAkZ3JlZW4sICRibHVlKTsKCiAgICAgICAgJGwgPSAkbWluICsgJG1heDsKICAgICAgICAkZCA9ICRtYXggLSAkbWluOwoKICAgICAgICBpZiAoKGludCkgJGQgPT09IDApIHsKICAgICAgICAgICAgJGggPSAkcyA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRsIDwgMjU1KSB7CiAgICAgICAgICAgICAgICAkcyA9ICRkIC8gJGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcyA9ICRkIC8gKDUxMCAtICRsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRyZWQgPT0gJG1heCkgewogICAgICAgICAgICAgICAgJGggPSA2MCAqICgkZ3JlZW4gLSAkYmx1ZSkgLyAkZDsKICAgICAgICAgICAgfSBlbHNlaWYgKCRncmVlbiA9PSAkbWF4KSB7CiAgICAgICAgICAgICAgICAkaCA9IDYwICogKCRibHVlIC0gJHJlZCkgLyAkZCArIDEyMDsKICAgICAgICAgICAgfSBlbHNlaWYgKCRibHVlID09ICRtYXgpIHsKICAgICAgICAgICAgICAgICRoID0gNjAgKiAoJHJlZCAtICRncmVlbikgLyAkZCArIDI0MDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFycmF5KFR5cGU6OlRfSFNMLCBmbW9kKCRoLCAzNjApLCAkcyAqIDEwMCwgJGwgLyA1LjEpOwogICAgfQoKICAgIC8qKgogICAgICogSHVlIHRvIFJHQiBoZWxwZXIKICAgICAqCiAgICAgKiBAcGFyYW0gZmxvYXQgJG0xCiAgICAgKiBAcGFyYW0gZmxvYXQgJG0yCiAgICAgKiBAcGFyYW0gZmxvYXQgJGgKICAgICAqCiAgICAgKiBAcmV0dXJuIGZsb2F0CiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gaHVlVG9SR0IoJG0xLCAkbTIsICRoKQogICAgewogICAgICAgIGlmICgkaCA8IDApIHsKICAgICAgICAgICAgJGggKz0gMTsKICAgICAgICB9IGVsc2VpZiAoJGggPiAxKSB7CiAgICAgICAgICAgICRoIC09IDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGggKiA2IDwgMSkgewogICAgICAgICAgICByZXR1cm4gJG0xICsgKCRtMiAtICRtMSkgKiAkaCAqIDY7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGggKiAyIDwgMSkgewogICAgICAgICAgICByZXR1cm4gJG0yOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRoICogMyA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuICRtMSArICgkbTIgLSAkbTEpICogKDIvMyAtICRoKSAqIDY7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG0xOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBIU0wgdG8gUkdCCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRodWUgICAgICAgIEggZnJvbSAwIHRvIDM2MAogICAgICogQHBhcmFtIGludGVnZXIgJHNhdHVyYXRpb24gUyBmcm9tIDAgdG8gMTAwCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbGlnaHRuZXNzICBMIGZyb20gMCB0byAxMDAKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0b1JHQigkaHVlLCAkc2F0dXJhdGlvbiwgJGxpZ2h0bmVzcykKICAgIHsKICAgICAgICBpZiAoJGh1ZSA8IDApIHsKICAgICAgICAgICAgJGh1ZSArPSAzNjA7CiAgICAgICAgfQoKICAgICAgICAkaCA9ICRodWUgLyAzNjA7CiAgICAgICAgJHMgPSBtaW4oMTAwLCBtYXgoMCwgJHNhdHVyYXRpb24pKSAvIDEwMDsKICAgICAgICAkbCA9IG1pbigxMDAsIG1heCgwLCAkbGlnaHRuZXNzKSkgLyAxMDA7CgogICAgICAgICRtMiA9ICRsIDw9IDAuNSA/ICRsICogKCRzICsgMSkgOiAkbCArICRzIC0gJGwgKiAkczsKICAgICAgICAkbTEgPSAkbCAqIDIgLSAkbTI7CgogICAgICAgICRyID0gJHRoaXMtPmh1ZVRvUkdCKCRtMSwgJG0yLCAkaCArIDEvMykgKiAyNTU7CiAgICAgICAgJGcgPSAkdGhpcy0+aHVlVG9SR0IoJG0xLCAkbTIsICRoKSAqIDI1NTsKICAgICAgICAkYiA9ICR0aGlzLT5odWVUb1JHQigkbTEsICRtMiwgJGggLSAxLzMpICogMjU1OwoKICAgICAgICAkb3V0ID0gYXJyYXkoVHlwZTo6VF9DT0xPUiwgJHIsICRnLCAkYik7CgogICAgICAgIHJldHVybiAkb3V0OwogICAgfQoKICAgIC8vIEJ1aWx0IGluIGZ1bmN0aW9ucwoKICAgIC8vcHJvdGVjdGVkIHN0YXRpYyAkbGliQ2FsbCA9IGFycmF5KCduYW1lJywgJ2FyZ3MuLi4nKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJDYWxsKCRhcmdzLCAka3dhcmdzKQogICAgewogICAgICAgICRuYW1lID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCR0aGlzLT5jb2VyY2VTdHJpbmcoJHRoaXMtPnJlZHVjZShhcnJheV9zaGlmdCgkYXJncyksIHRydWUpKSk7CgogICAgICAgICRhcmdzID0gYXJyYXlfbWFwKAogICAgICAgICAgICBmdW5jdGlvbiAoJGEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheShudWxsLCAkYSwgZmFsc2UpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAkYXJncwogICAgICAgICk7CgogICAgICAgIGlmIChjb3VudCgka3dhcmdzKSkgewogICAgICAgICAgICBmb3JlYWNoICgka3dhcmdzIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAkYXJnc1tdID0gYXJyYXkoYXJyYXkoVHlwZTo6VF9WQVJJQUJMRSwgJGtleSksICR2YWx1ZSwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPnJlZHVjZShhcnJheShUeXBlOjpUX0ZVTkNUSU9OX0NBTEwsICRuYW1lLCAkYXJncykpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYklmID0gYXJyYXkoJ2NvbmRpdGlvbicsICdpZi10cnVlJywgJ2lmLWZhbHNlJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliSWYoJGFyZ3MpCiAgICB7CiAgICAgICAgbGlzdCgkY29uZCwgJHQsICRmKSA9ICRhcmdzOwoKICAgICAgICBpZiAoISAkdGhpcy0+aXNUcnV0aHkoJHRoaXMtPnJlZHVjZSgkY29uZCwgdHJ1ZSkpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVkdWNlKCRmLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+cmVkdWNlKCR0LCB0cnVlKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJJbmRleCA9IGFycmF5KCdsaXN0JywgJ3ZhbHVlJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliSW5kZXgoJGFyZ3MpCiAgICB7CiAgICAgICAgbGlzdCgkbGlzdCwgJHZhbHVlKSA9ICRhcmdzOwoKICAgICAgICBpZiAoJHZhbHVlWzBdID09PSBUeXBlOjpUX01BUCkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6JG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGxpc3RbMF0gPT09IFR5cGU6OlRfTUFQIHx8CiAgICAgICAgICAgICRsaXN0WzBdID09PSBUeXBlOjpUX1NUUklORyB8fAogICAgICAgICAgICAkbGlzdFswXSA9PT0gVHlwZTo6VF9LRVlXT1JEIHx8CiAgICAgICAgICAgICRsaXN0WzBdID09PSBUeXBlOjpUX0lOVEVSUE9MQVRFCiAgICAgICAgKSB7CiAgICAgICAgICAgICRsaXN0ID0gJHRoaXMtPmNvZXJjZUxpc3QoJGxpc3QsICcgJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGxpc3RbMF0gIT09IFR5cGU6OlRfTElTVCkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6JG51bGw7CiAgICAgICAgfQoKICAgICAgICAkdmFsdWVzID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJGxpc3RbMl0gYXMgJGl0ZW0pIHsKICAgICAgICAgICAgJHZhbHVlc1tdID0gJHRoaXMtPm5vcm1hbGl6ZVZhbHVlKCRpdGVtKTsKICAgICAgICB9CgogICAgICAgICRrZXkgPSBhcnJheV9zZWFyY2goJHRoaXMtPm5vcm1hbGl6ZVZhbHVlKCR2YWx1ZSksICR2YWx1ZXMpOwoKICAgICAgICByZXR1cm4gZmFsc2UgPT09ICRrZXkgPyBzZWxmOjokbnVsbCA6ICRrZXkgKyAxOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlJnYiA9IGFycmF5KCdyZWQnLCAnZ3JlZW4nLCAnYmx1ZScpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlJnYigkYXJncykKICAgIHsKICAgICAgICBsaXN0KCRyLCAkZywgJGIpID0gJGFyZ3M7CgogICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX0NPTE9SLCAkclsxXSwgJGdbMV0sICRiWzFdKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJSZ2JhID0gYXJyYXkoCiAgICAgICAgYXJyYXkoJ3JlZCcsICdjb2xvcicpLAogICAgICAgICdncmVlbicsICdibHVlJywgJ2FscGhhJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliUmdiYSgkYXJncykKICAgIHsKICAgICAgICBpZiAoJGNvbG9yID0gJHRoaXMtPmNvZXJjZUNvbG9yKCRhcmdzWzBdKSkgewogICAgICAgICAgICAkbnVtID0gISBpc3NldCgkYXJnc1sxXSkgPyAkYXJnc1szXSA6ICRhcmdzWzFdOwogICAgICAgICAgICAkYWxwaGEgPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCRudW0pOwogICAgICAgICAgICAkY29sb3JbNF0gPSAkYWxwaGE7CgogICAgICAgICAgICByZXR1cm4gJGNvbG9yOwogICAgICAgIH0KCiAgICAgICAgbGlzdCgkciwgJGcsICRiLCAkYSkgPSAkYXJnczsKCiAgICAgICAgcmV0dXJuIGFycmF5KFR5cGU6OlRfQ09MT1IsICRyWzFdLCAkZ1sxXSwgJGJbMV0sICRhWzFdKTsKICAgIH0KCiAgICAvLyBoZWxwZXIgZnVuY3Rpb24gZm9yIGFkanVzdF9jb2xvciwgY2hhbmdlX2NvbG9yLCBhbmQgc2NhbGVfY29sb3IKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhbHRlckNvbG9yKCRhcmdzLCAkZm4pCiAgICB7CiAgICAgICAgJGNvbG9yID0gJHRoaXMtPmFzc2VydENvbG9yKCRhcmdzWzBdKTsKCiAgICAgICAgZm9yZWFjaCAoYXJyYXkoMSwgMiwgMywgNykgYXMgJGkpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRhcmdzWyRpXSkpIHsKICAgICAgICAgICAgICAgICR2YWwgPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCRhcmdzWyRpXSk7CiAgICAgICAgICAgICAgICAkaWkgPSAkaSA9PT0gNyA/IDQgOiAkaTsgLy8gYWxwaGEKICAgICAgICAgICAgICAgICRjb2xvclskaWldID0gY2FsbF91c2VyX2Z1bmMoJGZuLCBpc3NldCgkY29sb3JbJGlpXSkgPyAkY29sb3JbJGlpXSA6IDAsICR2YWwsICRpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCRhcmdzWzRdKSB8fCBpc3NldCgkYXJnc1s1XSkgfHwgaXNzZXQoJGFyZ3NbNl0pKSB7CiAgICAgICAgICAgICRoc2wgPSAkdGhpcy0+dG9IU0woJGNvbG9yWzFdLCAkY29sb3JbMl0sICRjb2xvclszXSk7CgogICAgICAgICAgICBmb3JlYWNoIChhcnJheSg0LCA1LCA2KSBhcyAkaSkgewogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRhcmdzWyRpXSkpIHsKICAgICAgICAgICAgICAgICAgICAkdmFsID0gJHRoaXMtPmFzc2VydE51bWJlcigkYXJnc1skaV0pOwogICAgICAgICAgICAgICAgICAgICRoc2xbJGkgLSAzXSA9IGNhbGxfdXNlcl9mdW5jKCRmbiwgJGhzbFskaSAtIDNdLCAkdmFsLCAkaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyZ2IgPSAkdGhpcy0+dG9SR0IoJGhzbFsxXSwgJGhzbFsyXSwgJGhzbFszXSk7CgogICAgICAgICAgICBpZiAoaXNzZXQoJGNvbG9yWzRdKSkgewogICAgICAgICAgICAgICAgJHJnYls0XSA9ICRjb2xvcls0XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGNvbG9yID0gJHJnYjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkY29sb3I7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliQWRqdXN0Q29sb3IgPSBhcnJheSgKICAgICAgICAnY29sb3InLCAncmVkJywgJ2dyZWVuJywgJ2JsdWUnLAogICAgICAgICdodWUnLCAnc2F0dXJhdGlvbicsICdsaWdodG5lc3MnLCAnYWxwaGEnCiAgICApOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkFkanVzdENvbG9yKCRhcmdzKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWx0ZXJDb2xvcigkYXJncywgZnVuY3Rpb24gKCRiYXNlLCAkYWx0ZXIsICRpKSB7CiAgICAgICAgICAgIHJldHVybiAkYmFzZSArICRhbHRlcjsKICAgICAgICB9KTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJDaGFuZ2VDb2xvciA9IGFycmF5KAogICAgICAgICdjb2xvcicsICdyZWQnLCAnZ3JlZW4nLCAnYmx1ZScsCiAgICAgICAgJ2h1ZScsICdzYXR1cmF0aW9uJywgJ2xpZ2h0bmVzcycsICdhbHBoYScKICAgICk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliQ2hhbmdlQ29sb3IoJGFyZ3MpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hbHRlckNvbG9yKCRhcmdzLCBmdW5jdGlvbiAoJGJhc2UsICRhbHRlciwgJGkpIHsKICAgICAgICAgICAgcmV0dXJuICRhbHRlcjsKICAgICAgICB9KTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJTY2FsZUNvbG9yID0gYXJyYXkoCiAgICAgICAgJ2NvbG9yJywgJ3JlZCcsICdncmVlbicsICdibHVlJywKICAgICAgICAnaHVlJywgJ3NhdHVyYXRpb24nLCAnbGlnaHRuZXNzJywgJ2FscGhhJwogICAgKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJTY2FsZUNvbG9yKCRhcmdzKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWx0ZXJDb2xvcigkYXJncywgZnVuY3Rpb24gKCRiYXNlLCAkc2NhbGUsICRpKSB7CiAgICAgICAgICAgIC8vIDEsIDIsIDMgLSByZ2IKICAgICAgICAgICAgLy8gNCwgNSwgNiAtIGhzbAogICAgICAgICAgICAvLyA3IC0gYQogICAgICAgICAgICBzd2l0Y2ggKCRpKSB7CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgJG1heCA9IDI1NTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgJG1heCA9IDM2MDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgJG1heCA9IDE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAkbWF4ID0gMTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkc2NhbGUgPSAkc2NhbGUgLyAxMDA7CgogICAgICAgICAgICBpZiAoJHNjYWxlIDwgMCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRiYXNlICogJHNjYWxlICsgJGJhc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAoJG1heCAtICRiYXNlKSAqICRzY2FsZSArICRiYXNlOwogICAgICAgIH0pOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkllSGV4U3RyID0gYXJyYXkoJ2NvbG9yJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliSWVIZXhTdHIoJGFyZ3MpCiAgICB7CiAgICAgICAgJGNvbG9yID0gJHRoaXMtPmNvZXJjZUNvbG9yKCRhcmdzWzBdKTsKICAgICAgICAkY29sb3JbNF0gPSBpc3NldCgkY29sb3JbNF0pID8gcm91bmQoMjU1ICogJGNvbG9yWzRdKSA6IDI1NTsKCiAgICAgICAgcmV0dXJuIHNwcmludGYoJyMlMDJYJTAyWCUwMlglMDJYJywgJGNvbG9yWzRdLCAkY29sb3JbMV0sICRjb2xvclsyXSwgJGNvbG9yWzNdKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJSZWQgPSBhcnJheSgnY29sb3InKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJSZWQoJGFyZ3MpCiAgICB7CiAgICAgICAgJGNvbG9yID0gJHRoaXMtPmNvZXJjZUNvbG9yKCRhcmdzWzBdKTsKCiAgICAgICAgcmV0dXJuICRjb2xvclsxXTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJHcmVlbiA9IGFycmF5KCdjb2xvcicpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkdyZWVuKCRhcmdzKQogICAgewogICAgICAgICRjb2xvciA9ICR0aGlzLT5jb2VyY2VDb2xvcigkYXJnc1swXSk7CgogICAgICAgIHJldHVybiAkY29sb3JbMl07CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliQmx1ZSA9IGFycmF5KCdjb2xvcicpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkJsdWUoJGFyZ3MpCiAgICB7CiAgICAgICAgJGNvbG9yID0gJHRoaXMtPmNvZXJjZUNvbG9yKCRhcmdzWzBdKTsKCiAgICAgICAgcmV0dXJuICRjb2xvclszXTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJBbHBoYSA9IGFycmF5KCdjb2xvcicpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkFscGhhKCRhcmdzKQogICAgewogICAgICAgIGlmICgkY29sb3IgPSAkdGhpcy0+Y29lcmNlQ29sb3IoJGFyZ3NbMF0pKSB7CiAgICAgICAgICAgIHJldHVybiBpc3NldCgkY29sb3JbNF0pID8gJGNvbG9yWzRdIDogMTsKICAgICAgICB9CgogICAgICAgIC8vIHRoaXMgbWlnaHQgYmUgdGhlIElFIGZ1bmN0aW9uLCBzbyByZXR1cm4gdmFsdWUgdW5jaGFuZ2VkCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliT3BhY2l0eSA9IGFycmF5KCdjb2xvcicpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYk9wYWNpdHkoJGFyZ3MpCiAgICB7CiAgICAgICAgJHZhbHVlID0gJGFyZ3NbMF07CgogICAgICAgIGlmICgkdmFsdWVbMF0gPT09IFR5cGU6OlRfTlVNQkVSKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5saWJBbHBoYSgkYXJncyk7CiAgICB9CgogICAgLy8gbWl4IHR3byBjb2xvcnMKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYk1peCA9IGFycmF5KCdjb2xvci0xJywgJ2NvbG9yLTInLCAnd2VpZ2h0Jyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliTWl4KCRhcmdzKQogICAgewogICAgICAgIGxpc3QoJGZpcnN0LCAkc2Vjb25kLCAkd2VpZ2h0KSA9ICRhcmdzOwoKICAgICAgICAkZmlyc3QgPSAkdGhpcy0+YXNzZXJ0Q29sb3IoJGZpcnN0KTsKICAgICAgICAkc2Vjb25kID0gJHRoaXMtPmFzc2VydENvbG9yKCRzZWNvbmQpOwoKICAgICAgICBpZiAoISBpc3NldCgkd2VpZ2h0KSkgewogICAgICAgICAgICAkd2VpZ2h0ID0gMC41OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR3ZWlnaHQgPSAkdGhpcy0+Y29lcmNlUGVyY2VudCgkd2VpZ2h0KTsKICAgICAgICB9CgogICAgICAgICRmaXJzdEFscGhhID0gaXNzZXQoJGZpcnN0WzRdKSA/ICRmaXJzdFs0XSA6IDE7CiAgICAgICAgJHNlY29uZEFscGhhID0gaXNzZXQoJHNlY29uZFs0XSkgPyAkc2Vjb25kWzRdIDogMTsKCiAgICAgICAgJHcgPSAkd2VpZ2h0ICogMiAtIDE7CiAgICAgICAgJGEgPSAkZmlyc3RBbHBoYSAtICRzZWNvbmRBbHBoYTsKCiAgICAgICAgJHcxID0gKCgkdyAqICRhID09PSAtMSA/ICR3IDogKCR3ICsgJGEpIC8gKDEgKyAkdyAqICRhKSkgKyAxKSAvIDIuMDsKICAgICAgICAkdzIgPSAxLjAgLSAkdzE7CgogICAgICAgICRuZXcgPSBhcnJheShUeXBlOjpUX0NPTE9SLAogICAgICAgICAgICAkdzEgKiAkZmlyc3RbMV0gKyAkdzIgKiAkc2Vjb25kWzFdLAogICAgICAgICAgICAkdzEgKiAkZmlyc3RbMl0gKyAkdzIgKiAkc2Vjb25kWzJdLAogICAgICAgICAgICAkdzEgKiAkZmlyc3RbM10gKyAkdzIgKiAkc2Vjb25kWzNdLAogICAgICAgICk7CgogICAgICAgIGlmICgkZmlyc3RBbHBoYSAhPSAxLjAgfHwgJHNlY29uZEFscGhhICE9IDEuMCkgewogICAgICAgICAgICAkbmV3W10gPSAkZmlyc3RBbHBoYSAqICR3ZWlnaHQgKyAkc2Vjb25kQWxwaGEgKiAoJHdlaWdodCAtIDEpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5maXhDb2xvcigkbmV3KTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJIc2wgPSBhcnJheSgnaHVlJywgJ3NhdHVyYXRpb24nLCAnbGlnaHRuZXNzJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliSHNsKCRhcmdzKQogICAgewogICAgICAgIGxpc3QoJGgsICRzLCAkbCkgPSAkYXJnczsKCiAgICAgICAgcmV0dXJuICR0aGlzLT50b1JHQigkaFsxXSwgJHNbMV0sICRsWzFdKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJIc2xhID0gYXJyYXkoJ2h1ZScsICdzYXR1cmF0aW9uJywgJ2xpZ2h0bmVzcycsICdhbHBoYScpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkhzbGEoJGFyZ3MpCiAgICB7CiAgICAgICAgbGlzdCgkaCwgJHMsICRsLCAkYSkgPSAkYXJnczsKCiAgICAgICAgJGNvbG9yID0gJHRoaXMtPnRvUkdCKCRoWzFdLCAkc1sxXSwgJGxbMV0pOwogICAgICAgICRjb2xvcls0XSA9ICRhWzFdOwoKICAgICAgICByZXR1cm4gJGNvbG9yOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkh1ZSA9IGFycmF5KCdjb2xvcicpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkh1ZSgkYXJncykKICAgIHsKICAgICAgICAkY29sb3IgPSAkdGhpcy0+YXNzZXJ0Q29sb3IoJGFyZ3NbMF0pOwogICAgICAgICRoc2wgPSAkdGhpcy0+dG9IU0woJGNvbG9yWzFdLCAkY29sb3JbMl0sICRjb2xvclszXSk7CgogICAgICAgIHJldHVybiBuZXcgTm9kZVxOdW1iZXIoJGhzbFsxXSwgJ2RlZycpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlNhdHVyYXRpb24gPSBhcnJheSgnY29sb3InKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJTYXR1cmF0aW9uKCRhcmdzKQogICAgewogICAgICAgICRjb2xvciA9ICR0aGlzLT5hc3NlcnRDb2xvcigkYXJnc1swXSk7CiAgICAgICAgJGhzbCA9ICR0aGlzLT50b0hTTCgkY29sb3JbMV0sICRjb2xvclsyXSwgJGNvbG9yWzNdKTsKCiAgICAgICAgcmV0dXJuIG5ldyBOb2RlXE51bWJlcigkaHNsWzJdLCAnJScpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkxpZ2h0bmVzcyA9IGFycmF5KCdjb2xvcicpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkxpZ2h0bmVzcygkYXJncykKICAgIHsKICAgICAgICAkY29sb3IgPSAkdGhpcy0+YXNzZXJ0Q29sb3IoJGFyZ3NbMF0pOwogICAgICAgICRoc2wgPSAkdGhpcy0+dG9IU0woJGNvbG9yWzFdLCAkY29sb3JbMl0sICRjb2xvclszXSk7CgogICAgICAgIHJldHVybiBuZXcgTm9kZVxOdW1iZXIoJGhzbFszXSwgJyUnKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWRqdXN0SHNsKCRjb2xvciwgJGlkeCwgJGFtb3VudCkKICAgIHsKICAgICAgICAkaHNsID0gJHRoaXMtPnRvSFNMKCRjb2xvclsxXSwgJGNvbG9yWzJdLCAkY29sb3JbM10pOwogICAgICAgICRoc2xbJGlkeF0gKz0gJGFtb3VudDsKICAgICAgICAkb3V0ID0gJHRoaXMtPnRvUkdCKCRoc2xbMV0sICRoc2xbMl0sICRoc2xbM10pOwoKICAgICAgICBpZiAoaXNzZXQoJGNvbG9yWzRdKSkgewogICAgICAgICAgICAkb3V0WzRdID0gJGNvbG9yWzRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliQWRqdXN0SHVlID0gYXJyYXkoJ2NvbG9yJywgJ2RlZ3JlZXMnKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJBZGp1c3RIdWUoJGFyZ3MpCiAgICB7CiAgICAgICAgJGNvbG9yID0gJHRoaXMtPmFzc2VydENvbG9yKCRhcmdzWzBdKTsKICAgICAgICAkZGVncmVlcyA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJGFyZ3NbMV0pOwoKICAgICAgICByZXR1cm4gJHRoaXMtPmFkanVzdEhzbCgkY29sb3IsIDEsICRkZWdyZWVzKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJMaWdodGVuID0gYXJyYXkoJ2NvbG9yJywgJ2Ftb3VudCcpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkxpZ2h0ZW4oJGFyZ3MpCiAgICB7CiAgICAgICAgJGNvbG9yID0gJHRoaXMtPmFzc2VydENvbG9yKCRhcmdzWzBdKTsKICAgICAgICAkYW1vdW50ID0gVXRpbDo6Y2hlY2tSYW5nZSgnYW1vdW50JywgbmV3IFJhbmdlKDAsIDEwMCksICRhcmdzWzFdLCAnJScpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPmFkanVzdEhzbCgkY29sb3IsIDMsICRhbW91bnQpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkRhcmtlbiA9IGFycmF5KCdjb2xvcicsICdhbW91bnQnKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJEYXJrZW4oJGFyZ3MpCiAgICB7CiAgICAgICAgJGNvbG9yID0gJHRoaXMtPmFzc2VydENvbG9yKCRhcmdzWzBdKTsKICAgICAgICAkYW1vdW50ID0gVXRpbDo6Y2hlY2tSYW5nZSgnYW1vdW50JywgbmV3IFJhbmdlKDAsIDEwMCksICRhcmdzWzFdLCAnJScpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPmFkanVzdEhzbCgkY29sb3IsIDMsIC0kYW1vdW50KTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJTYXR1cmF0ZSA9IGFycmF5KCdjb2xvcicsICdhbW91bnQnKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJTYXR1cmF0ZSgkYXJncykKICAgIHsKICAgICAgICAkdmFsdWUgPSAkYXJnc1swXTsKCiAgICAgICAgaWYgKCR2YWx1ZVswXSA9PT0gVHlwZTo6VF9OVU1CRVIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkY29sb3IgPSAkdGhpcy0+YXNzZXJ0Q29sb3IoJHZhbHVlKTsKICAgICAgICAkYW1vdW50ID0gMTAwICogJHRoaXMtPmNvZXJjZVBlcmNlbnQoJGFyZ3NbMV0pOwoKICAgICAgICByZXR1cm4gJHRoaXMtPmFkanVzdEhzbCgkY29sb3IsIDIsICRhbW91bnQpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkRlc2F0dXJhdGUgPSBhcnJheSgnY29sb3InLCAnYW1vdW50Jyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliRGVzYXR1cmF0ZSgkYXJncykKICAgIHsKICAgICAgICAkY29sb3IgPSAkdGhpcy0+YXNzZXJ0Q29sb3IoJGFyZ3NbMF0pOwogICAgICAgICRhbW91bnQgPSAxMDAgKiAkdGhpcy0+Y29lcmNlUGVyY2VudCgkYXJnc1sxXSk7CgogICAgICAgIHJldHVybiAkdGhpcy0+YWRqdXN0SHNsKCRjb2xvciwgMiwgLSRhbW91bnQpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkdyYXlzY2FsZSA9IGFycmF5KCdjb2xvcicpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkdyYXlzY2FsZSgkYXJncykKICAgIHsKICAgICAgICAkdmFsdWUgPSAkYXJnc1swXTsKCiAgICAgICAgaWYgKCR2YWx1ZVswXSA9PT0gVHlwZTo6VF9OVU1CRVIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmFkanVzdEhzbCgkdGhpcy0+YXNzZXJ0Q29sb3IoJHZhbHVlKSwgMiwgLTEwMCk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliQ29tcGxlbWVudCA9IGFycmF5KCdjb2xvcicpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkNvbXBsZW1lbnQoJGFyZ3MpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGp1c3RIc2woJHRoaXMtPmFzc2VydENvbG9yKCRhcmdzWzBdKSwgMSwgMTgwKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJJbnZlcnQgPSBhcnJheSgnY29sb3InKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJJbnZlcnQoJGFyZ3MpCiAgICB7CiAgICAgICAgJHZhbHVlID0gJGFyZ3NbMF07CgogICAgICAgIGlmICgkdmFsdWVbMF0gPT09IFR5cGU6OlRfTlVNQkVSKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJGNvbG9yID0gJHRoaXMtPmFzc2VydENvbG9yKCR2YWx1ZSk7CiAgICAgICAgJGNvbG9yWzFdID0gMjU1IC0gJGNvbG9yWzFdOwogICAgICAgICRjb2xvclsyXSA9IDI1NSAtICRjb2xvclsyXTsKICAgICAgICAkY29sb3JbM10gPSAyNTUgLSAkY29sb3JbM107CgogICAgICAgIHJldHVybiAkY29sb3I7CiAgICB9CgogICAgLy8gaW5jcmVhc2VzIG9wYWNpdHkgYnkgYW1vdW50CiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJPcGFjaWZ5ID0gYXJyYXkoJ2NvbG9yJywgJ2Ftb3VudCcpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYk9wYWNpZnkoJGFyZ3MpCiAgICB7CiAgICAgICAgJGNvbG9yID0gJHRoaXMtPmFzc2VydENvbG9yKCRhcmdzWzBdKTsKICAgICAgICAkYW1vdW50ID0gJHRoaXMtPmNvZXJjZVBlcmNlbnQoJGFyZ3NbMV0pOwoKICAgICAgICAkY29sb3JbNF0gPSAoaXNzZXQoJGNvbG9yWzRdKSA/ICRjb2xvcls0XSA6IDEpICsgJGFtb3VudDsKICAgICAgICAkY29sb3JbNF0gPSBtaW4oMSwgbWF4KDAsICRjb2xvcls0XSkpOwoKICAgICAgICByZXR1cm4gJGNvbG9yOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkZhZGVJbiA9IGFycmF5KCdjb2xvcicsICdhbW91bnQnKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJGYWRlSW4oJGFyZ3MpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5saWJPcGFjaWZ5KCRhcmdzKTsKICAgIH0KCiAgICAvLyBkZWNyZWFzZXMgb3BhY2l0eSBieSBhbW91bnQKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlRyYW5zcGFyZW50aXplID0gYXJyYXkoJ2NvbG9yJywgJ2Ftb3VudCcpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlRyYW5zcGFyZW50aXplKCRhcmdzKQogICAgewogICAgICAgICRjb2xvciA9ICR0aGlzLT5hc3NlcnRDb2xvcigkYXJnc1swXSk7CiAgICAgICAgJGFtb3VudCA9ICR0aGlzLT5jb2VyY2VQZXJjZW50KCRhcmdzWzFdKTsKCiAgICAgICAgJGNvbG9yWzRdID0gKGlzc2V0KCRjb2xvcls0XSkgPyAkY29sb3JbNF0gOiAxKSAtICRhbW91bnQ7CiAgICAgICAgJGNvbG9yWzRdID0gbWluKDEsIG1heCgwLCAkY29sb3JbNF0pKTsKCiAgICAgICAgcmV0dXJuICRjb2xvcjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJGYWRlT3V0ID0gYXJyYXkoJ2NvbG9yJywgJ2Ftb3VudCcpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkZhZGVPdXQoJGFyZ3MpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5saWJUcmFuc3BhcmVudGl6ZSgkYXJncyk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliVW5xdW90ZSA9IGFycmF5KCdzdHJpbmcnKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJVbnF1b3RlKCRhcmdzKQogICAgewogICAgICAgICRzdHIgPSAkYXJnc1swXTsKCiAgICAgICAgaWYgKCRzdHJbMF0gPT09IFR5cGU6OlRfU1RSSU5HKSB7CiAgICAgICAgICAgICRzdHJbMV0gPSAnJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkc3RyOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlF1b3RlID0gYXJyYXkoJ3N0cmluZycpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlF1b3RlKCRhcmdzKQogICAgewogICAgICAgICR2YWx1ZSA9ICRhcmdzWzBdOwoKICAgICAgICBpZiAoJHZhbHVlWzBdID09PSBUeXBlOjpUX1NUUklORyAmJiAhIGVtcHR5KCR2YWx1ZVsxXSkpIHsKICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX1NUUklORywgJyInLCBhcnJheSgkdmFsdWUpKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJQZXJjZW50YWdlID0gYXJyYXkoJ3ZhbHVlJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliUGVyY2VudGFnZSgkYXJncykKICAgIHsKICAgICAgICByZXR1cm4gbmV3IE5vZGVcTnVtYmVyKCR0aGlzLT5jb2VyY2VQZXJjZW50KCRhcmdzWzBdKSAqIDEwMCwgJyUnKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJSb3VuZCA9IGFycmF5KCd2YWx1ZScpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlJvdW5kKCRhcmdzKQogICAgewogICAgICAgICRudW0gPSAkYXJnc1swXTsKICAgICAgICAkbnVtWzFdID0gcm91bmQoJG51bVsxXSk7CgogICAgICAgIHJldHVybiAkbnVtOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkZsb29yID0gYXJyYXkoJ3ZhbHVlJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliRmxvb3IoJGFyZ3MpCiAgICB7CiAgICAgICAgJG51bSA9ICRhcmdzWzBdOwogICAgICAgICRudW1bMV0gPSBmbG9vcigkbnVtWzFdKTsKCiAgICAgICAgcmV0dXJuICRudW07CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliQ2VpbCA9IGFycmF5KCd2YWx1ZScpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkNlaWwoJGFyZ3MpCiAgICB7CiAgICAgICAgJG51bSA9ICRhcmdzWzBdOwogICAgICAgICRudW1bMV0gPSBjZWlsKCRudW1bMV0pOwoKICAgICAgICByZXR1cm4gJG51bTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJBYnMgPSBhcnJheSgndmFsdWUnKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJBYnMoJGFyZ3MpCiAgICB7CiAgICAgICAgJG51bSA9ICRhcmdzWzBdOwogICAgICAgICRudW1bMV0gPSBhYnMoJG51bVsxXSk7CgogICAgICAgIHJldHVybiAkbnVtOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJNaW4oJGFyZ3MpCiAgICB7CiAgICAgICAgJG51bWJlcnMgPSAkdGhpcy0+Z2V0Tm9ybWFsaXplZE51bWJlcnMoJGFyZ3MpOwogICAgICAgICRtaW4gPSBudWxsOwoKICAgICAgICBmb3JlYWNoICgkbnVtYmVycyBhcyAka2V5ID0+ICRudW1iZXIpIHsKICAgICAgICAgICAgaWYgKG51bGwgPT09ICRtaW4gfHwgJG51bWJlclsxXSA8PSAkbWluWzFdKSB7CiAgICAgICAgICAgICAgICAkbWluID0gYXJyYXkoJGtleSwgJG51bWJlclsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkYXJnc1skbWluWzBdXTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliTWF4KCRhcmdzKQogICAgewogICAgICAgICRudW1iZXJzID0gJHRoaXMtPmdldE5vcm1hbGl6ZWROdW1iZXJzKCRhcmdzKTsKICAgICAgICAkbWF4ID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJG51bWJlcnMgYXMgJGtleSA9PiAkbnVtYmVyKSB7CiAgICAgICAgICAgIGlmIChudWxsID09PSAkbWF4IHx8ICRudW1iZXJbMV0gPj0gJG1heFsxXSkgewogICAgICAgICAgICAgICAgJG1heCA9IGFycmF5KCRrZXksICRudW1iZXJbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGFyZ3NbJG1heFswXV07CiAgICB9CgogICAgLyoqCiAgICAgKiBIZWxwZXIgdG8gbm9ybWFsaXplIGFyZ3MgY29udGFpbmluZyBudW1iZXJzCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRhcmdzCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Tm9ybWFsaXplZE51bWJlcnMoJGFyZ3MpCiAgICB7CiAgICAgICAgJHVuaXQgPSBudWxsOwogICAgICAgICRvcmlnaW5hbFVuaXQgPSBudWxsOwogICAgICAgICRudW1iZXJzID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJGFyZ3MgYXMgJGtleSA9PiAkaXRlbSkgewogICAgICAgICAgICBpZiAoJGl0ZW1bMF0gIT09IFR5cGU6OlRfTlVNQkVSKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+dGhyb3dFcnJvcignJXMgaXMgbm90IGEgbnVtYmVyJywgJGl0ZW1bMF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbnVtYmVyID0gJGl0ZW0tPm5vcm1hbGl6ZSgpOwoKICAgICAgICAgICAgaWYgKG51bGwgPT09ICR1bml0KSB7CiAgICAgICAgICAgICAgICAkdW5pdCA9ICRudW1iZXJbMl07CiAgICAgICAgICAgICAgICAkb3JpZ2luYWxVbml0ID0gJGl0ZW0tPnVuaXRTdHIoKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCR1bml0ICE9PSAkbnVtYmVyWzJdKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+dGhyb3dFcnJvcignSW5jb21wYXRpYmxlIHVuaXRzOiAiJXMiIGFuZCAiJXMiLicsICRvcmlnaW5hbFVuaXQsICRpdGVtLT51bml0U3RyKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbnVtYmVyc1ska2V5XSA9ICRudW1iZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG51bWJlcnM7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliTGVuZ3RoID0gYXJyYXkoJ2xpc3QnKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJMZW5ndGgoJGFyZ3MpCiAgICB7CiAgICAgICAgJGxpc3QgPSAkdGhpcy0+Y29lcmNlTGlzdCgkYXJnc1swXSk7CgogICAgICAgIHJldHVybiBjb3VudCgkbGlzdFsyXSk7CiAgICB9CgogICAgLy8gVE9ETzogbmVlZCBhIHdheSB0byBkZWNsYXJlIHRoaXMgYnVpbHQtaW4gYXMgdmFyYXJncwogICAgLy9wcm90ZWN0ZWQgc3RhdGljICRsaWJMaXN0U2VwYXJhdG9yID0gYXJyYXkoJ2xpc3QuLi4nKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJMaXN0U2VwYXJhdG9yKCRhcmdzKQogICAgewogICAgICAgIGlmIChjb3VudCgkYXJncykgPiAxKSB7CiAgICAgICAgICAgIHJldHVybiAnY29tbWEnOwogICAgICAgIH0KCiAgICAgICAgJGxpc3QgPSAkdGhpcy0+Y29lcmNlTGlzdCgkYXJnc1swXSk7CgogICAgICAgIGlmIChjb3VudCgkbGlzdFsyXSkgPD0gMSkgewogICAgICAgICAgICByZXR1cm4gJ3NwYWNlJzsKICAgICAgICB9CgogICAgICAgIGlmICgkbGlzdFsxXSA9PT0gJywnKSB7CiAgICAgICAgICAgIHJldHVybiAnY29tbWEnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICdzcGFjZSc7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliTnRoID0gYXJyYXkoJ2xpc3QnLCAnbicpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYk50aCgkYXJncykKICAgIHsKICAgICAgICAkbGlzdCA9ICR0aGlzLT5jb2VyY2VMaXN0KCRhcmdzWzBdKTsKICAgICAgICAkbiA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJGFyZ3NbMV0pOwoKICAgICAgICBpZiAoJG4gPiAwKSB7CiAgICAgICAgICAgICRuLS07CiAgICAgICAgfSBlbHNlaWYgKCRuIDwgMCkgewogICAgICAgICAgICAkbiArPSBjb3VudCgkbGlzdFsyXSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaXNzZXQoJGxpc3RbMl1bJG5dKSA/ICRsaXN0WzJdWyRuXSA6IHNlbGY6OiRkZWZhdWx0VmFsdWU7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU2V0TnRoID0gYXJyYXkoJ2xpc3QnLCAnbicsICd2YWx1ZScpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlNldE50aCgkYXJncykKICAgIHsKICAgICAgICAkbGlzdCA9ICR0aGlzLT5jb2VyY2VMaXN0KCRhcmdzWzBdKTsKICAgICAgICAkbiA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJGFyZ3NbMV0pOwoKICAgICAgICBpZiAoJG4gPiAwKSB7CiAgICAgICAgICAgICRuLS07CiAgICAgICAgfSBlbHNlaWYgKCRuIDwgMCkgewogICAgICAgICAgICAkbiArPSBjb3VudCgkbGlzdFsyXSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISBpc3NldCgkbGlzdFsyXVskbl0pKSB7CiAgICAgICAgICAgICR0aGlzLT50aHJvd0Vycm9yKCdJbnZhbGlkIGFyZ3VtZW50IGZvciAibiInKTsKICAgICAgICB9CgogICAgICAgICRsaXN0WzJdWyRuXSA9ICRhcmdzWzJdOwoKICAgICAgICByZXR1cm4gJGxpc3Q7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliTWFwR2V0ID0gYXJyYXkoJ21hcCcsICdrZXknKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJNYXBHZXQoJGFyZ3MpCiAgICB7CiAgICAgICAgJG1hcCA9ICR0aGlzLT5hc3NlcnRNYXAoJGFyZ3NbMF0pOwogICAgICAgICRrZXkgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHRoaXMtPmNvZXJjZVN0cmluZygkYXJnc1sxXSkpOwoKICAgICAgICBmb3IgKCRpID0gY291bnQoJG1hcFsxXSkgLSAxOyAkaSA+PSAwOyAkaS0tKSB7CiAgICAgICAgICAgIGlmICgka2V5ID09PSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHRoaXMtPmNvZXJjZVN0cmluZygkbWFwWzFdWyRpXSkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJG1hcFsyXVskaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjokbnVsbDsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJNYXBLZXlzID0gYXJyYXkoJ21hcCcpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYk1hcEtleXMoJGFyZ3MpCiAgICB7CiAgICAgICAgJG1hcCA9ICR0aGlzLT5hc3NlcnRNYXAoJGFyZ3NbMF0pOwogICAgICAgICRrZXlzID0gJG1hcFsxXTsKCiAgICAgICAgcmV0dXJuIGFycmF5KFR5cGU6OlRfTElTVCwgJywnLCAka2V5cyk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliTWFwVmFsdWVzID0gYXJyYXkoJ21hcCcpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYk1hcFZhbHVlcygkYXJncykKICAgIHsKICAgICAgICAkbWFwID0gJHRoaXMtPmFzc2VydE1hcCgkYXJnc1swXSk7CiAgICAgICAgJHZhbHVlcyA9ICRtYXBbMl07CgogICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX0xJU1QsICcsJywgJHZhbHVlcyk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliTWFwUmVtb3ZlID0gYXJyYXkoJ21hcCcsICdrZXknKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJNYXBSZW1vdmUoJGFyZ3MpCiAgICB7CiAgICAgICAgJG1hcCA9ICR0aGlzLT5hc3NlcnRNYXAoJGFyZ3NbMF0pOwogICAgICAgICRrZXkgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHRoaXMtPmNvZXJjZVN0cmluZygkYXJnc1sxXSkpOwoKICAgICAgICBmb3IgKCRpID0gY291bnQoJG1hcFsxXSkgLSAxOyAkaSA+PSAwOyAkaS0tKSB7CiAgICAgICAgICAgIGlmICgka2V5ID09PSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHRoaXMtPmNvZXJjZVN0cmluZygkbWFwWzFdWyRpXSkpKSB7CiAgICAgICAgICAgICAgICBhcnJheV9zcGxpY2UoJG1hcFsxXSwgJGksIDEpOwogICAgICAgICAgICAgICAgYXJyYXlfc3BsaWNlKCRtYXBbMl0sICRpLCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtYXA7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliTWFwSGFzS2V5ID0gYXJyYXkoJ21hcCcsICdrZXknKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJNYXBIYXNLZXkoJGFyZ3MpCiAgICB7CiAgICAgICAgJG1hcCA9ICR0aGlzLT5hc3NlcnRNYXAoJGFyZ3NbMF0pOwogICAgICAgICRrZXkgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHRoaXMtPmNvZXJjZVN0cmluZygkYXJnc1sxXSkpOwoKICAgICAgICBmb3IgKCRpID0gY291bnQoJG1hcFsxXSkgLSAxOyAkaSA+PSAwOyAkaS0tKSB7CiAgICAgICAgICAgIGlmICgka2V5ID09PSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHRoaXMtPmNvZXJjZVN0cmluZygkbWFwWzFdWyRpXSkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYk1hcE1lcmdlID0gYXJyYXkoJ21hcC0xJywgJ21hcC0yJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliTWFwTWVyZ2UoJGFyZ3MpCiAgICB7CiAgICAgICAgJG1hcDEgPSAkdGhpcy0+YXNzZXJ0TWFwKCRhcmdzWzBdKTsKICAgICAgICAkbWFwMiA9ICR0aGlzLT5hc3NlcnRNYXAoJGFyZ3NbMV0pOwoKICAgICAgICByZXR1cm4gYXJyYXkoVHlwZTo6VF9NQVAsIGFycmF5X21lcmdlKCRtYXAxWzFdLCAkbWFwMlsxXSksIGFycmF5X21lcmdlKCRtYXAxWzJdLCAkbWFwMlsyXSkpOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaXN0U2VwYXJhdG9yRm9ySm9pbigkbGlzdDEsICRzZXApCiAgICB7CiAgICAgICAgaWYgKCEgaXNzZXQoJHNlcCkpIHsKICAgICAgICAgICAgcmV0dXJuICRsaXN0MVsxXTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAoJHRoaXMtPmNvbXBpbGVWYWx1ZSgkc2VwKSkgewogICAgICAgICAgICBjYXNlICdjb21tYSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJywnOwoKICAgICAgICAgICAgY2FzZSAnc3BhY2UnOgogICAgICAgICAgICAgICAgcmV0dXJuICcnOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAkbGlzdDFbMV07CiAgICAgICAgfQogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkpvaW4gPSBhcnJheSgnbGlzdDEnLCAnbGlzdDInLCAnc2VwYXJhdG9yJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliSm9pbigkYXJncykKICAgIHsKICAgICAgICBsaXN0KCRsaXN0MSwgJGxpc3QyLCAkc2VwKSA9ICRhcmdzOwoKICAgICAgICAkbGlzdDEgPSAkdGhpcy0+Y29lcmNlTGlzdCgkbGlzdDEsICcgJyk7CiAgICAgICAgJGxpc3QyID0gJHRoaXMtPmNvZXJjZUxpc3QoJGxpc3QyLCAnICcpOwogICAgICAgICRzZXAgPSAkdGhpcy0+bGlzdFNlcGFyYXRvckZvckpvaW4oJGxpc3QxLCAkc2VwKTsKCiAgICAgICAgcmV0dXJuIGFycmF5KFR5cGU6OlRfTElTVCwgJHNlcCwgYXJyYXlfbWVyZ2UoJGxpc3QxWzJdLCAkbGlzdDJbMl0pKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJBcHBlbmQgPSBhcnJheSgnbGlzdCcsICd2YWwnLCAnc2VwYXJhdG9yJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliQXBwZW5kKCRhcmdzKQogICAgewogICAgICAgIGxpc3QoJGxpc3QxLCAkdmFsdWUsICRzZXApID0gJGFyZ3M7CgogICAgICAgICRsaXN0MSA9ICR0aGlzLT5jb2VyY2VMaXN0KCRsaXN0MSwgJyAnKTsKICAgICAgICAkc2VwID0gJHRoaXMtPmxpc3RTZXBhcmF0b3JGb3JKb2luKCRsaXN0MSwgJHNlcCk7CgogICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX0xJU1QsICRzZXAsIGFycmF5X21lcmdlKCRsaXN0MVsyXSwgYXJyYXkoJHZhbHVlKSkpOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJaaXAoJGFyZ3MpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJGFyZ3MgYXMgJGFyZykgewogICAgICAgICAgICAkdGhpcy0+YXNzZXJ0TGlzdCgkYXJnKTsKICAgICAgICB9CgogICAgICAgICRsaXN0cyA9IGFycmF5KCk7CiAgICAgICAgJGZpcnN0TGlzdCA9IGFycmF5X3NoaWZ0KCRhcmdzKTsKCiAgICAgICAgZm9yZWFjaCAoJGZpcnN0TGlzdFsyXSBhcyAka2V5ID0+ICRpdGVtKSB7CiAgICAgICAgICAgICRsaXN0ID0gYXJyYXkoVHlwZTo6VF9MSVNULCAnJywgYXJyYXkoJGl0ZW0pKTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRhcmdzIGFzICRhcmcpIHsKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkYXJnWzJdWyRrZXldKSkgewogICAgICAgICAgICAgICAgICAgICRsaXN0WzJdW10gPSAkYXJnWzJdWyRrZXldOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBicmVhayAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkbGlzdHNbXSA9ICRsaXN0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFycmF5KFR5cGU6OlRfTElTVCwgJywnLCAkbGlzdHMpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlR5cGVPZiA9IGFycmF5KCd2YWx1ZScpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlR5cGVPZigkYXJncykKICAgIHsKICAgICAgICAkdmFsdWUgPSAkYXJnc1swXTsKCiAgICAgICAgc3dpdGNoICgkdmFsdWVbMF0pIHsKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0tFWVdPUkQ6CiAgICAgICAgICAgICAgICBpZiAoJHZhbHVlID09PSBzZWxmOjokdHJ1ZSB8fCAkdmFsdWUgPT09IHNlbGY6OiRmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnYm9vbCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5jb2VyY2VDb2xvcigkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdjb2xvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZmFsbC10aHJ1CiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9GVU5DVElPTjoKICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJzsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9MSVNUOgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YWx1ZVszXSkgJiYgJHZhbHVlWzNdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdhcmdsaXN0JzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmYWxsLXRocnUKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWVbMF07CiAgICAgICAgfQogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlVuaXQgPSBhcnJheSgnbnVtYmVyJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliVW5pdCgkYXJncykKICAgIHsKICAgICAgICAkbnVtID0gJGFyZ3NbMF07CgogICAgICAgIGlmICgkbnVtWzBdID09PSBUeXBlOjpUX05VTUJFUikgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoVHlwZTo6VF9TVFJJTkcsICciJywgYXJyYXkoJG51bS0+dW5pdFN0cigpKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliVW5pdGxlc3MgPSBhcnJheSgnbnVtYmVyJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliVW5pdGxlc3MoJGFyZ3MpCiAgICB7CiAgICAgICAgJHZhbHVlID0gJGFyZ3NbMF07CgogICAgICAgIHJldHVybiAkdmFsdWVbMF0gPT09IFR5cGU6OlRfTlVNQkVSICYmICR2YWx1ZS0+dW5pdGxlc3MoKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJDb21wYXJhYmxlID0gYXJyYXkoJ251bWJlci0xJywgJ251bWJlci0yJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliQ29tcGFyYWJsZSgkYXJncykKICAgIHsKICAgICAgICBsaXN0KCRudW1iZXIxLCAkbnVtYmVyMikgPSAkYXJnczsKCiAgICAgICAgaWYgKCEgaXNzZXQoJG51bWJlcjFbMF0pIHx8ICRudW1iZXIxWzBdICE9PSBUeXBlOjpUX05VTUJFUiB8fAogICAgICAgICAgICAhIGlzc2V0KCRudW1iZXIyWzBdKSB8fCAkbnVtYmVyMlswXSAhPT0gVHlwZTo6VF9OVU1CRVIKICAgICAgICApIHsKICAgICAgICAgICAgJHRoaXMtPnRocm93RXJyb3IoJ0ludmFsaWQgYXJndW1lbnQocykgZm9yICJjb21wYXJhYmxlIicpOwogICAgICAgIH0KCiAgICAgICAgJG51bWJlcjEgPSAkbnVtYmVyMS0+bm9ybWFsaXplKCk7CiAgICAgICAgJG51bWJlcjIgPSAkbnVtYmVyMi0+bm9ybWFsaXplKCk7CgogICAgICAgIHJldHVybiAkbnVtYmVyMVsyXSA9PT0gJG51bWJlcjJbMl0gfHwgJG51bWJlcjEtPnVuaXRsZXNzKCkgfHwgJG51bWJlcjItPnVuaXRsZXNzKCk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU3RySW5kZXggPSBhcnJheSgnc3RyaW5nJywgJ3N1YnN0cmluZycpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlN0ckluZGV4KCRhcmdzKQogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+Y29lcmNlU3RyaW5nKCRhcmdzWzBdKTsKICAgICAgICAkc3RyaW5nQ29udGVudCA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkc3RyaW5nKTsKCiAgICAgICAgJHN1YnN0cmluZyA9ICR0aGlzLT5jb2VyY2VTdHJpbmcoJGFyZ3NbMV0pOwogICAgICAgICRzdWJzdHJpbmdDb250ZW50ID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCRzdWJzdHJpbmcpOwoKICAgICAgICAkcmVzdWx0ID0gc3RycG9zKCRzdHJpbmdDb250ZW50LCAkc3Vic3RyaW5nQ29udGVudCk7CgogICAgICAgIHJldHVybiAkcmVzdWx0ID09PSBmYWxzZSA/IHNlbGY6OiRudWxsIDogbmV3IE5vZGVcTnVtYmVyKCRyZXN1bHQgKyAxLCAnJyk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU3RySW5zZXJ0ID0gYXJyYXkoJ3N0cmluZycsICdpbnNlcnQnLCAnaW5kZXgnKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJTdHJJbnNlcnQoJGFyZ3MpCiAgICB7CiAgICAgICAgJHN0cmluZyA9ICR0aGlzLT5jb2VyY2VTdHJpbmcoJGFyZ3NbMF0pOwogICAgICAgICRzdHJpbmdDb250ZW50ID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCRzdHJpbmcpOwoKICAgICAgICAkaW5zZXJ0ID0gJHRoaXMtPmNvZXJjZVN0cmluZygkYXJnc1sxXSk7CiAgICAgICAgJGluc2VydENvbnRlbnQgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJGluc2VydCk7CgogICAgICAgIGxpc3QoLCAkaW5kZXgpID0gJGFyZ3NbMl07CgogICAgICAgICRzdHJpbmdbMl0gPSBhcnJheShzdWJzdHJfcmVwbGFjZSgkc3RyaW5nQ29udGVudCwgJGluc2VydENvbnRlbnQsICRpbmRleCAtIDEsIDApKTsKCiAgICAgICAgcmV0dXJuICRzdHJpbmc7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU3RyTGVuZ3RoID0gYXJyYXkoJ3N0cmluZycpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlN0ckxlbmd0aCgkYXJncykKICAgIHsKICAgICAgICAkc3RyaW5nID0gJHRoaXMtPmNvZXJjZVN0cmluZygkYXJnc1swXSk7CiAgICAgICAgJHN0cmluZ0NvbnRlbnQgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHN0cmluZyk7CgogICAgICAgIHJldHVybiBuZXcgTm9kZVxOdW1iZXIoc3RybGVuKCRzdHJpbmdDb250ZW50KSwgJycpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlN0clNsaWNlID0gYXJyYXkoJ3N0cmluZycsICdzdGFydC1hdCcsICdlbmQtYXQnKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJTdHJTbGljZSgkYXJncykKICAgIHsKICAgICAgICBpZiAoaXNzZXQoJGFyZ3NbMl0pICYmICRhcmdzWzJdWzFdID09IDApIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OiRudWxsU3RyaW5nOwogICAgICAgIH0KCiAgICAgICAgJHN0cmluZyA9ICR0aGlzLT5jb2VyY2VTdHJpbmcoJGFyZ3NbMF0pOwogICAgICAgICRzdHJpbmdDb250ZW50ID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCRzdHJpbmcpOwoKICAgICAgICAkc3RhcnQgPSAoaW50KSAkYXJnc1sxXVsxXTsKCiAgICAgICAgaWYgKCRzdGFydCA+IDApIHsKICAgICAgICAgICAgJHN0YXJ0LS07CiAgICAgICAgfQoKICAgICAgICAkZW5kICAgID0gKGludCkgJGFyZ3NbMl1bMV07CiAgICAgICAgJGxlbmd0aCA9ICRlbmQgPCAwID8gJGVuZCArIDEgOiAoJGVuZCA+IDAgPyAkZW5kIC0gJHN0YXJ0IDogJGVuZCk7CgogICAgICAgICRzdHJpbmdbMl0gPSAkbGVuZ3RoCiAgICAgICAgICAgID8gYXJyYXkoc3Vic3RyKCRzdHJpbmdDb250ZW50LCAkc3RhcnQsICRsZW5ndGgpKQogICAgICAgICAgICA6IGFycmF5KHN1YnN0cigkc3RyaW5nQ29udGVudCwgJHN0YXJ0KSk7CgogICAgICAgIHJldHVybiAkc3RyaW5nOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlRvTG93ZXJDYXNlID0gYXJyYXkoJ3N0cmluZycpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlRvTG93ZXJDYXNlKCRhcmdzKQogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+Y29lcmNlU3RyaW5nKCRhcmdzWzBdKTsKICAgICAgICAkc3RyaW5nQ29udGVudCA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkc3RyaW5nKTsKCiAgICAgICAgJHN0cmluZ1syXSA9IGFycmF5KG1iX3N0cnRvbG93ZXIoJHN0cmluZ0NvbnRlbnQpKTsKCiAgICAgICAgcmV0dXJuICRzdHJpbmc7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliVG9VcHBlckNhc2UgPSBhcnJheSgnc3RyaW5nJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliVG9VcHBlckNhc2UoJGFyZ3MpCiAgICB7CiAgICAgICAgJHN0cmluZyA9ICR0aGlzLT5jb2VyY2VTdHJpbmcoJGFyZ3NbMF0pOwogICAgICAgICRzdHJpbmdDb250ZW50ID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCRzdHJpbmcpOwoKICAgICAgICAkc3RyaW5nWzJdID0gYXJyYXkobWJfc3RydG91cHBlcigkc3RyaW5nQ29udGVudCkpOwoKICAgICAgICByZXR1cm4gJHN0cmluZzsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJGZWF0dXJlRXhpc3RzID0gYXJyYXkoJ2ZlYXR1cmUnKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJGZWF0dXJlRXhpc3RzKCRhcmdzKQogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+Y29lcmNlU3RyaW5nKCRhcmdzWzBdKTsKICAgICAgICAkbmFtZSA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkc3RyaW5nKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT50b0Jvb2woCiAgICAgICAgICAgIGFycmF5X2tleV9leGlzdHMoJG5hbWUsICR0aGlzLT5yZWdpc3RlcmVkRmVhdHVyZXMpID8gJHRoaXMtPnJlZ2lzdGVyZWRGZWF0dXJlc1skbmFtZV0gOiBmYWxzZQogICAgICAgICk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliRnVuY3Rpb25FeGlzdHMgPSBhcnJheSgnbmFtZScpOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkZ1bmN0aW9uRXhpc3RzKCRhcmdzKQogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+Y29lcmNlU3RyaW5nKCRhcmdzWzBdKTsKICAgICAgICAkbmFtZSA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkc3RyaW5nKTsKCiAgICAgICAgLy8gdXNlciBkZWZpbmVkIGZ1bmN0aW9ucwogICAgICAgIGlmICgkdGhpcy0+aGFzKHNlbGY6OiRuYW1lc3BhY2VzWydmdW5jdGlvbiddIC4gJG5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJG5hbWUgPSAkdGhpcy0+bm9ybWFsaXplTmFtZSgkbmFtZSk7CgogICAgICAgIGlmIChpc3NldCgkdGhpcy0+dXNlckZ1bmN0aW9uc1skbmFtZV0pKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gYnVpbHQtaW4gZnVuY3Rpb25zCiAgICAgICAgJGYgPSAkdGhpcy0+Z2V0QnVpbHRpbkZ1bmN0aW9uKCRuYW1lKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT50b0Jvb2woaXNfY2FsbGFibGUoJGYpKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJHbG9iYWxWYXJpYWJsZUV4aXN0cyA9IGFycmF5KCduYW1lJyk7CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliR2xvYmFsVmFyaWFibGVFeGlzdHMoJGFyZ3MpCiAgICB7CiAgICAgICAgJHN0cmluZyA9ICR0aGlzLT5jb2VyY2VTdHJpbmcoJGFyZ3NbMF0pOwogICAgICAgICRuYW1lID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCRzdHJpbmcpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPmhhcygkbmFtZSwgJHRoaXMtPnJvb3RFbnYpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYk1peGluRXhpc3RzID0gYXJyYXkoJ25hbWUnKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJNaXhpbkV4aXN0cygkYXJncykKICAgIHsKICAgICAgICAkc3RyaW5nID0gJHRoaXMtPmNvZXJjZVN0cmluZygkYXJnc1swXSk7CiAgICAgICAgJG5hbWUgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHN0cmluZyk7CgogICAgICAgIHJldHVybiAkdGhpcy0+aGFzKHNlbGY6OiRuYW1lc3BhY2VzWydtaXhpbiddIC4gJG5hbWUpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlZhcmlhYmxlRXhpc3RzID0gYXJyYXkoJ25hbWUnKTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJWYXJpYWJsZUV4aXN0cygkYXJncykKICAgIHsKICAgICAgICAkc3RyaW5nID0gJHRoaXMtPmNvZXJjZVN0cmluZygkYXJnc1swXSk7CiAgICAgICAgJG5hbWUgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHN0cmluZyk7CgogICAgICAgIHJldHVybiAkdGhpcy0+aGFzKCRuYW1lKTsKICAgIH0KCiAgICAvKioKICAgICAqIFdvcmthcm91bmQgSUU3J3MgY29udGVudCBjb3VudGVyIGJ1Zy4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGFyZ3MKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkNvdW50ZXIoJGFyZ3MpCiAgICB7CiAgICAgICAgJGxpc3QgPSBhcnJheV9tYXAoYXJyYXkoJHRoaXMsICdjb21waWxlVmFsdWUnKSwgJGFyZ3MpOwoKICAgICAgICByZXR1cm4gYXJyYXkoVHlwZTo6VF9TVFJJTkcsICcnLCBhcnJheSgnY291bnRlcignIC4gaW1wbG9kZSgnLCcsICRsaXN0KSAuICcpJykpOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJSYW5kb20oJGFyZ3MpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCRhcmdzWzBdKSkgewogICAgICAgICAgICAkbiA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJGFyZ3NbMF0pOwoKICAgICAgICAgICAgaWYgKCRuIDwgMSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnRocm93RXJyb3IoImxpbWl0IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlXE51bWJlcihtdF9yYW5kKDEsICRuKSwgJycpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBOb2RlXE51bWJlcihtdF9yYW5kKDEsIG10X2dldHJhbmRtYXgoKSksICcnKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliVW5pcXVlSWQoKQogICAgewogICAgICAgIHN0YXRpYyAkaWQ7CgogICAgICAgIGlmICghIGlzc2V0KCRpZCkpIHsKICAgICAgICAgICAgJGlkID0gbXRfcmFuZCgwLCBwb3coMzYsIDgpKTsKICAgICAgICB9CgogICAgICAgICRpZCArPSBtdF9yYW5kKDAsIDEwKSArIDE7CgogICAgICAgIHJldHVybiBhcnJheShUeXBlOjpUX1NUUklORywgJycsIGFycmF5KCd1JyAuIHN0cl9wYWQoYmFzZV9jb252ZXJ0KCRpZCwgMTAsIDM2KSwgOCwgJzAnLCBTVFJfUEFEX0xFRlQpKSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Compiler/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Compiler/Environment.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocFxDb21waWxlcjsKCnVzZSBMZWFmb1xTY3NzUGhwXEJsb2NrOwoKLyoqCiAqIFNDU1MgY29tcGlsZXIgZW52aXJvbm1lbnQKICoKICogQGF1dGhvciBBbnRob24gUGFuZyA8YW50aG9uLnBhbmdAZ21haWwuY29tPgogKi8KY2xhc3MgRW52aXJvbm1lbnQKewogICAgLyoqCiAgICAgKiBAdmFyIFxMZWFmb1xTY3NzUGhwXEJsb2NrCiAgICAgKi8KICAgIHB1YmxpYyAkYmxvY2s7CgogICAgLyoqCiAgICAgKiBAdmFyIFxMZWFmb1xTY3NzUGhwXENvbXBpbGVyXEVudmlyb25tZW50CiAgICAgKi8KICAgIHB1YmxpYyAkcGFyZW50OwoKICAgIC8qKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICBwdWJsaWMgJHN0b3JlOwoKICAgIC8qKgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkZGVwdGg7Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Formatter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocDsKCnVzZSBMZWFmb1xTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jazsKCi8qKgogKiBTQ1NTIGJhc2UgZm9ybWF0dGVyCiAqCiAqIEBhdXRob3IgTGVhZiBDb3Jjb3JhbiA8bGVhZm90QGdtYWlsLmNvbT4KICovCmFic3RyYWN0IGNsYXNzIEZvcm1hdHRlcgp7CiAgICAvKioKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICovCiAgICBwdWJsaWMgJGluZGVudExldmVsOwoKICAgIC8qKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRpbmRlbnRDaGFyOwoKICAgIC8qKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRicmVhazsKCiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkb3BlbjsKCiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkY2xvc2U7CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJHRhZ1NlcGFyYXRvcjsKCiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkYXNzaWduU2VwYXJhdG9yOwoKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZSBmb3JtYXR0ZXIKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKi8KICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpOwoKICAgIC8qKgogICAgICogUmV0dXJuIGluZGVudGF0aW9uICh3aGl0ZXNwYWNlKQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbmRlbnRTdHIoKQogICAgewogICAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiBwcm9wZXJ0eSBhc3NpZ25tZW50CiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEBwYXJhbSBtaXhlZCAgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHByb3BlcnR5KCRuYW1lLCAkdmFsdWUpCiAgICB7CiAgICAgICAgcmV0dXJuIHJ0cmltKCRuYW1lKSAuICR0aGlzLT5hc3NpZ25TZXBhcmF0b3IgLiAkdmFsdWUgLiAnOyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBTdHJpcCBzZW1pLWNvbG9uIGFwcGVuZGVkIGJ5IHByb3BlcnR5KCk7IGl0J3MgYSBzZXBhcmF0b3IsIG5vdCBhIHRlcm1pbmF0b3IKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRsaW5lcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc3RyaXBTZW1pY29sb24oJiRsaW5lcykKICAgIHsKICAgIH0KCiAgICAvKioKICAgICAqIE91dHB1dCBsaW5lcyBpbnNpZGUgYSBibG9jawogICAgICoKICAgICAqIEBwYXJhbSBcTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sgJGJsb2NrCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBibG9ja0xpbmVzKE91dHB1dEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICAkaW5uZXIgPSAkdGhpcy0+aW5kZW50U3RyKCk7CgogICAgICAgICRnbHVlID0gJHRoaXMtPmJyZWFrIC4gJGlubmVyOwoKICAgICAgICBlY2hvICRpbm5lciAuIGltcGxvZGUoJGdsdWUsICRibG9jay0+bGluZXMpOwoKICAgICAgICBpZiAoISBlbXB0eSgkYmxvY2stPmNoaWxkcmVuKSkgewogICAgICAgICAgICBlY2hvICR0aGlzLT5icmVhazsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBPdXRwdXQgYmxvY2sgc2VsZWN0b3JzCiAgICAgKgogICAgICogQHBhcmFtIFxMZWFmb1xTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jayAkYmxvY2sKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrU2VsZWN0b3JzKE91dHB1dEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICAkaW5uZXIgPSAkdGhpcy0+aW5kZW50U3RyKCk7CgogICAgICAgIGVjaG8gJGlubmVyCiAgICAgICAgICAgIC4gaW1wbG9kZSgkdGhpcy0+dGFnU2VwYXJhdG9yLCAkYmxvY2stPnNlbGVjdG9ycykKICAgICAgICAgICAgLiAkdGhpcy0+b3BlbiAuICR0aGlzLT5icmVhazsKICAgIH0KCiAgICAvKioKICAgICAqIE91dHB1dCBibG9jayBjaGlsZHJlbgogICAgICoKICAgICAqIEBwYXJhbSBcTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sgJGJsb2NrCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBibG9ja0NoaWxkcmVuKE91dHB1dEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICBmb3JlYWNoICgkYmxvY2stPmNoaWxkcmVuIGFzICRjaGlsZCkgewogICAgICAgICAgICAkdGhpcy0+YmxvY2soJGNoaWxkKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBPdXRwdXQgbm9uLWVtcHR5IGJsb2NrCiAgICAgKgogICAgICogQHBhcmFtIFxMZWFmb1xTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jayAkYmxvY2sKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrKE91dHB1dEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJGJsb2NrLT5saW5lcykgJiYgZW1wdHkoJGJsb2NrLT5jaGlsZHJlbikpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHByZSA9ICR0aGlzLT5pbmRlbnRTdHIoKTsKCiAgICAgICAgaWYgKCEgZW1wdHkoJGJsb2NrLT5zZWxlY3RvcnMpKSB7CiAgICAgICAgICAgICR0aGlzLT5ibG9ja1NlbGVjdG9ycygkYmxvY2spOwoKICAgICAgICAgICAgJHRoaXMtPmluZGVudExldmVsKys7CiAgICAgICAgfQoKICAgICAgICBpZiAoISBlbXB0eSgkYmxvY2stPmxpbmVzKSkgewogICAgICAgICAgICAkdGhpcy0+YmxvY2tMaW5lcygkYmxvY2spOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEgZW1wdHkoJGJsb2NrLT5jaGlsZHJlbikpIHsKICAgICAgICAgICAgJHRoaXMtPmJsb2NrQ2hpbGRyZW4oJGJsb2NrKTsKICAgICAgICB9CgogICAgICAgIGlmICghIGVtcHR5KCRibG9jay0+c2VsZWN0b3JzKSkgewogICAgICAgICAgICAkdGhpcy0+aW5kZW50TGV2ZWwtLTsKCiAgICAgICAgICAgIGlmIChlbXB0eSgkYmxvY2stPmNoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgZWNobyAkdGhpcy0+YnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVjaG8gJHByZSAuICR0aGlzLT5jbG9zZSAuICR0aGlzLT5icmVhazsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBFbnRyeSBwb2ludCB0byBmb3JtYXR0aW5nIGEgYmxvY2sKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIFxMZWFmb1xTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jayAkYmxvY2sgQW4gYWJzdHJhY3Qgc3ludGF4IHRyZWUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZm9ybWF0KE91dHB1dEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICBvYl9zdGFydCgpOwoKICAgICAgICAkdGhpcy0+YmxvY2soJGJsb2NrKTsKCiAgICAgICAgJG91dCA9IG9iX2dldF9jbGVhbigpOwoKICAgICAgICByZXR1cm4gJG91dDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Formatter/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Formatter/Compact.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7Cgp1c2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7CgovKioKICogU0NTUyBjb21wYWN0IGZvcm1hdHRlcgogKgogKiBAYXV0aG9yIExlYWYgQ29yY29yYW4gPGxlYWZvdEBnbWFpbC5jb20+CiAqLwpjbGFzcyBDb21wYWN0IGV4dGVuZHMgRm9ybWF0dGVyCnsKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgICR0aGlzLT5pbmRlbnRMZXZlbCA9IDA7CiAgICAgICAgJHRoaXMtPmluZGVudENoYXIgPSAnJzsKICAgICAgICAkdGhpcy0+YnJlYWsgPSAnJzsKICAgICAgICAkdGhpcy0+b3BlbiA9ICcgeyc7CiAgICAgICAgJHRoaXMtPmNsb3NlID0gIn1cblxuIjsKICAgICAgICAkdGhpcy0+dGFnU2VwYXJhdG9yID0gJywnOwogICAgICAgICR0aGlzLT5hc3NpZ25TZXBhcmF0b3IgPSAnOic7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmRlbnRTdHIoKQogICAgewogICAgICAgIHJldHVybiAnICc7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Formatter/Compressed.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7Cgp1c2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7CnVzZSBMZWFmb1xTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jazsKCi8qKgogKiBTQ1NTIGNvbXByZXNzZWQgZm9ybWF0dGVyCiAqCiAqIEBhdXRob3IgTGVhZiBDb3Jjb3JhbiA8bGVhZm90QGdtYWlsLmNvbT4KICovCmNsYXNzIENvbXByZXNzZWQgZXh0ZW5kcyBGb3JtYXR0ZXIKewogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgJHRoaXMtPmluZGVudExldmVsID0gMDsKICAgICAgICAkdGhpcy0+aW5kZW50Q2hhciA9ICcgICc7CiAgICAgICAgJHRoaXMtPmJyZWFrID0gJyc7CiAgICAgICAgJHRoaXMtPm9wZW4gPSAneyc7CiAgICAgICAgJHRoaXMtPmNsb3NlID0gJ30nOwogICAgICAgICR0aGlzLT50YWdTZXBhcmF0b3IgPSAnLCc7CiAgICAgICAgJHRoaXMtPmFzc2lnblNlcGFyYXRvciA9ICc6JzsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHN0cmlwU2VtaWNvbG9uKCYkbGluZXMpCiAgICB7CiAgICAgICAgaWYgKCgkY291bnQgPSBjb3VudCgkbGluZXMpKQogICAgICAgICAgICAmJiBzdWJzdHIoJGxpbmVzWyRjb3VudCAtIDFdLCAtMSkgPT09ICc7JwogICAgICAgICkgewogICAgICAgICAgICAkbGluZXNbJGNvdW50IC0gMV0gPSBzdWJzdHIoJGxpbmVzWyRjb3VudCAtIDFdLCAwLCAtMSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYmxvY2tMaW5lcyhPdXRwdXRCbG9jayAkYmxvY2spCiAgICB7CiAgICAgICAgJGlubmVyID0gJHRoaXMtPmluZGVudFN0cigpOwoKICAgICAgICAkZ2x1ZSA9ICR0aGlzLT5icmVhayAuICRpbm5lcjsKCiAgICAgICAgZm9yZWFjaCAoJGJsb2NrLT5saW5lcyBhcyAkaW5kZXggPT4gJGxpbmUpIHsKICAgICAgICAgICAgaWYgKHN1YnN0cigkbGluZSwgMCwgMikgPT09ICcvKicgJiYgc3Vic3RyKCRsaW5lLCAyLCAxKSAhPT0gJyEnKSB7CiAgICAgICAgICAgICAgICB1bnNldCgkYmxvY2stPmxpbmVzWyRpbmRleF0pOwogICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCRsaW5lLCAwLCAzKSA9PT0gJy8qIScpIHsKICAgICAgICAgICAgICAgICRibG9jay0+bGluZXNbJGluZGV4XSA9ICcvKicgLiBzdWJzdHIoJGxpbmUsIDMpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBlY2hvICRpbm5lciAuIGltcGxvZGUoJGdsdWUsICRibG9jay0+bGluZXMpOwoKICAgICAgICBpZiAoISBlbXB0eSgkYmxvY2stPmNoaWxkcmVuKSkgewogICAgICAgICAgICBlY2hvICR0aGlzLT5icmVhazsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXR9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBmb3JtYXQoT3V0cHV0QmxvY2sgJGJsb2NrKQogICAgewogICAgICAgIHJldHVybiBwYXJlbnQ6OmZvcm1hdCgkYmxvY2spOwoKICAgICAgICAvLyBUT0RPOiB3ZSBuZWVkIHRvIGZpeCB0aGUgMiAiY29tcHJlc3NlZCIgdGVzdHMgd2hlcmUgdGhlICJjbG9zZSIgaXMgYXBwbGllZAogICAgICAgIHJldHVybiB0cmltKHN0cl9yZXBsYWNlKCc7fScsICd9JywgcGFyZW50Ojpmb3JtYXQoJGJsb2NrKSkpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Formatter/Crunched.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7Cgp1c2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7CnVzZSBMZWFmb1xTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jazsKCi8qKgogKiBTQ1NTIGNydW5jaGVkIGZvcm1hdHRlcgogKgogKiBAYXV0aG9yIEFudGhvbiBQYW5nIDxhbnRob24ucGFuZ0BnbWFpbC5jb20+CiAqLwpjbGFzcyBDcnVuY2hlZCBleHRlbmRzIEZvcm1hdHRlcgp7CiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgICAgICAkdGhpcy0+aW5kZW50TGV2ZWwgPSAwOwogICAgICAgICR0aGlzLT5pbmRlbnRDaGFyID0gJyAgJzsKICAgICAgICAkdGhpcy0+YnJlYWsgPSAnJzsKICAgICAgICAkdGhpcy0+b3BlbiA9ICd7JzsKICAgICAgICAkdGhpcy0+Y2xvc2UgPSAnfSc7CiAgICAgICAgJHRoaXMtPnRhZ1NlcGFyYXRvciA9ICcsJzsKICAgICAgICAkdGhpcy0+YXNzaWduU2VwYXJhdG9yID0gJzonOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc3RyaXBTZW1pY29sb24oJiRsaW5lcykKICAgIHsKICAgICAgICBpZiAoKCRjb3VudCA9IGNvdW50KCRsaW5lcykpCiAgICAgICAgICAgICYmIHN1YnN0cigkbGluZXNbJGNvdW50IC0gMV0sIC0xKSA9PT0gJzsnCiAgICAgICAgKSB7CiAgICAgICAgICAgICRsaW5lc1skY291bnQgLSAxXSA9IHN1YnN0cigkbGluZXNbJGNvdW50IC0gMV0sIDAsIC0xKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBibG9ja0xpbmVzKE91dHB1dEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICAkaW5uZXIgPSAkdGhpcy0+aW5kZW50U3RyKCk7CgogICAgICAgICRnbHVlID0gJHRoaXMtPmJyZWFrIC4gJGlubmVyOwoKICAgICAgICBmb3JlYWNoICgkYmxvY2stPmxpbmVzIGFzICRpbmRleCA9PiAkbGluZSkgewogICAgICAgICAgICBpZiAoc3Vic3RyKCRsaW5lLCAwLCAyKSA9PT0gJy8qJykgewogICAgICAgICAgICAgICAgdW5zZXQoJGJsb2NrLT5saW5lc1skaW5kZXhdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZWNobyAkaW5uZXIgLiBpbXBsb2RlKCRnbHVlLCAkYmxvY2stPmxpbmVzKTsKCiAgICAgICAgaWYgKCEgZW1wdHkoJGJsb2NrLT5jaGlsZHJlbikpIHsKICAgICAgICAgICAgZWNobyAkdGhpcy0+YnJlYWs7CiAgICAgICAgfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Formatter/Debug.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7Cgp1c2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7CnVzZSBMZWFmb1xTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jazsKCi8qKgogKiBTQ1NTIGRlYnVnIGZvcm1hdHRlcgogKgogKiBAYXV0aG9yIEFudGhvbiBQYW5nIDxhbnRob24ucGFuZ0BnbWFpbC5jb20+CiAqLwpjbGFzcyBEZWJ1ZyBleHRlbmRzIEZvcm1hdHRlcgp7CiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgICAgICAkdGhpcy0+aW5kZW50TGV2ZWwgPSAwOwogICAgICAgICR0aGlzLT5pbmRlbnRDaGFyID0gJyc7CiAgICAgICAgJHRoaXMtPmJyZWFrID0gIlxuIjsKICAgICAgICAkdGhpcy0+b3BlbiA9ICcgeyc7CiAgICAgICAgJHRoaXMtPmNsb3NlID0gJyB9JzsKICAgICAgICAkdGhpcy0+dGFnU2VwYXJhdG9yID0gJywgJzsKICAgICAgICAkdGhpcy0+YXNzaWduU2VwYXJhdG9yID0gJzogJzsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGluZGVudFN0cigpCiAgICB7CiAgICAgICAgcmV0dXJuIHN0cl9yZXBlYXQoJyAgJywgJHRoaXMtPmluZGVudExldmVsKTsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrTGluZXMoT3V0cHV0QmxvY2sgJGJsb2NrKQogICAgewogICAgICAgICRpbmRlbnQgPSAkdGhpcy0+aW5kZW50U3RyKCk7CgogICAgICAgIGlmIChlbXB0eSgkYmxvY2stPmxpbmVzKSkgewogICAgICAgICAgICBlY2hvICJ7JGluZGVudH1ibG9jay0+bGluZXM6IFtdXG4iOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGJsb2NrLT5saW5lcyBhcyAkaW5kZXggPT4gJGxpbmUpIHsKICAgICAgICAgICAgZWNobyAieyRpbmRlbnR9YmxvY2stPmxpbmVzW3skaW5kZXh9XTogJGxpbmVcbiI7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tTZWxlY3RvcnMoT3V0cHV0QmxvY2sgJGJsb2NrKQogICAgewogICAgICAgICRpbmRlbnQgPSAkdGhpcy0+aW5kZW50U3RyKCk7CgogICAgICAgIGlmIChlbXB0eSgkYmxvY2stPnNlbGVjdG9ycykpIHsKICAgICAgICAgICAgZWNobyAieyRpbmRlbnR9YmxvY2stPnNlbGVjdG9yczogW11cbiI7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkYmxvY2stPnNlbGVjdG9ycyBhcyAkaW5kZXggPT4gJHNlbGVjdG9yKSB7CiAgICAgICAgICAgIGVjaG8gInskaW5kZW50fWJsb2NrLT5zZWxlY3RvcnNbeyRpbmRleH1dOiAkc2VsZWN0b3JcbiI7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tDaGlsZHJlbihPdXRwdXRCbG9jayAkYmxvY2spCiAgICB7CiAgICAgICAgJGluZGVudCA9ICR0aGlzLT5pbmRlbnRTdHIoKTsKCiAgICAgICAgaWYgKGVtcHR5KCRibG9jay0+Y2hpbGRyZW4pKSB7CiAgICAgICAgICAgIGVjaG8gInskaW5kZW50fWJsb2NrLT5jaGlsZHJlbjogW11cbiI7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+aW5kZW50TGV2ZWwrKzsKCiAgICAgICAgZm9yZWFjaCAoJGJsb2NrLT5jaGlsZHJlbiBhcyAkaSA9PiAkY2hpbGQpIHsKICAgICAgICAgICAgJHRoaXMtPmJsb2NrKCRjaGlsZCk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+aW5kZW50TGV2ZWwtLTsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrKE91dHB1dEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICAkaW5kZW50ID0gJHRoaXMtPmluZGVudFN0cigpOwoKICAgICAgICBlY2hvICJ7JGluZGVudH1ibG9jay0+dHlwZTogeyRibG9jay0+dHlwZX1cbiIgLgogICAgICAgICAgICAgInskaW5kZW50fWJsb2NrLT5kZXB0aDogeyRibG9jay0+ZGVwdGh9XG4iOwoKICAgICAgICAkdGhpcy0+YmxvY2tTZWxlY3RvcnMoJGJsb2NrKTsKICAgICAgICAkdGhpcy0+YmxvY2tMaW5lcygkYmxvY2spOwogICAgICAgICR0aGlzLT5ibG9ja0NoaWxkcmVuKCRibG9jayk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Formatter/Expanded.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7Cgp1c2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7CnVzZSBMZWFmb1xTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jazsKCi8qKgogKiBTQ1NTIGV4cGFuZGVkIGZvcm1hdHRlcgogKgogKiBAYXV0aG9yIExlYWYgQ29yY29yYW4gPGxlYWZvdEBnbWFpbC5jb20+CiAqLwpjbGFzcyBFeHBhbmRlZCBleHRlbmRzIEZvcm1hdHRlcgp7CiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgICAgICAkdGhpcy0+aW5kZW50TGV2ZWwgPSAwOwogICAgICAgICR0aGlzLT5pbmRlbnRDaGFyID0gJyAgJzsKICAgICAgICAkdGhpcy0+YnJlYWsgPSAiXG4iOwogICAgICAgICR0aGlzLT5vcGVuID0gJyB7JzsKICAgICAgICAkdGhpcy0+Y2xvc2UgPSAnfSc7CiAgICAgICAgJHRoaXMtPnRhZ1NlcGFyYXRvciA9ICcsICc7CiAgICAgICAgJHRoaXMtPmFzc2lnblNlcGFyYXRvciA9ICc6ICc7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbmRlbnRTdHIoKQogICAgewogICAgICAgIHJldHVybiBzdHJfcmVwZWF0KCR0aGlzLT5pbmRlbnRDaGFyLCAkdGhpcy0+aW5kZW50TGV2ZWwpOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tMaW5lcyhPdXRwdXRCbG9jayAkYmxvY2spCiAgICB7CiAgICAgICAgJGlubmVyID0gJHRoaXMtPmluZGVudFN0cigpOwoKICAgICAgICAkZ2x1ZSA9ICR0aGlzLT5icmVhayAuICRpbm5lcjsKCiAgICAgICAgZm9yZWFjaCAoJGJsb2NrLT5saW5lcyBhcyAkaW5kZXggPT4gJGxpbmUpIHsKICAgICAgICAgICAgaWYgKHN1YnN0cigkbGluZSwgMCwgMikgPT09ICcvKicpIHsKICAgICAgICAgICAgICAgICRibG9jay0+bGluZXNbJGluZGV4XSA9IHByZWdfcmVwbGFjZSgnLyhccnxcbikrLycsICRnbHVlLCAkbGluZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVjaG8gJGlubmVyIC4gaW1wbG9kZSgkZ2x1ZSwgJGJsb2NrLT5saW5lcyk7CgogICAgICAgIGlmIChlbXB0eSgkYmxvY2stPnNlbGVjdG9ycykgfHwgISBlbXB0eSgkYmxvY2stPmNoaWxkcmVuKSkgewogICAgICAgICAgICBlY2hvICR0aGlzLT5icmVhazsKICAgICAgICB9CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Formatter/Nested.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7Cgp1c2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7CnVzZSBMZWFmb1xTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jazsKCi8qKgogKiBTQ1NTIG5lc3RlZCBmb3JtYXR0ZXIKICoKICogQGF1dGhvciBMZWFmIENvcmNvcmFuIDxsZWFmb3RAZ21haWwuY29tPgogKi8KY2xhc3MgTmVzdGVkIGV4dGVuZHMgRm9ybWF0dGVyCnsKICAgIC8qKgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHByaXZhdGUgJGRlcHRoOwoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgICR0aGlzLT5pbmRlbnRMZXZlbCA9IDA7CiAgICAgICAgJHRoaXMtPmluZGVudENoYXIgPSAnICAnOwogICAgICAgICR0aGlzLT5icmVhayA9ICJcbiI7CiAgICAgICAgJHRoaXMtPm9wZW4gPSAnIHsnOwogICAgICAgICR0aGlzLT5jbG9zZSA9ICcgfSc7CiAgICAgICAgJHRoaXMtPnRhZ1NlcGFyYXRvciA9ICcsICc7CiAgICAgICAgJHRoaXMtPmFzc2lnblNlcGFyYXRvciA9ICc6ICc7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbmRlbnRTdHIoKQogICAgewogICAgICAgICRuID0gJHRoaXMtPmRlcHRoIC0gMTsKCiAgICAgICAgcmV0dXJuIHN0cl9yZXBlYXQoJHRoaXMtPmluZGVudENoYXIsIG1heCgkdGhpcy0+aW5kZW50TGV2ZWwgKyAkbiwgMCkpOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tMaW5lcyhPdXRwdXRCbG9jayAkYmxvY2spCiAgICB7CiAgICAgICAgJGlubmVyID0gJHRoaXMtPmluZGVudFN0cigpOwoKICAgICAgICAkZ2x1ZSA9ICR0aGlzLT5icmVhayAuICRpbm5lcjsKCiAgICAgICAgZm9yZWFjaCAoJGJsb2NrLT5saW5lcyBhcyAkaW5kZXggPT4gJGxpbmUpIHsKICAgICAgICAgICAgaWYgKHN1YnN0cigkbGluZSwgMCwgMikgPT09ICcvKicpIHsKICAgICAgICAgICAgICAgICRibG9jay0+bGluZXNbJGluZGV4XSA9IHByZWdfcmVwbGFjZSgnLyhccnxcbikrLycsICRnbHVlLCAkbGluZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVjaG8gJGlubmVyIC4gaW1wbG9kZSgkZ2x1ZSwgJGJsb2NrLT5saW5lcyk7CgogICAgICAgIGlmICghIGVtcHR5KCRibG9jay0+Y2hpbGRyZW4pKSB7CiAgICAgICAgICAgIGVjaG8gJHRoaXMtPmJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrU2VsZWN0b3JzKE91dHB1dEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICAkaW5uZXIgPSAkdGhpcy0+aW5kZW50U3RyKCk7CgogICAgICAgIGVjaG8gJGlubmVyCiAgICAgICAgICAgIC4gaW1wbG9kZSgkdGhpcy0+dGFnU2VwYXJhdG9yLCAkYmxvY2stPnNlbGVjdG9ycykKICAgICAgICAgICAgLiAkdGhpcy0+b3BlbiAuICR0aGlzLT5icmVhazsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrQ2hpbGRyZW4oT3V0cHV0QmxvY2sgJGJsb2NrKQogICAgewogICAgICAgIGZvcmVhY2ggKCRibG9jay0+Y2hpbGRyZW4gYXMgJGkgPT4gJGNoaWxkKSB7CiAgICAgICAgICAgICR0aGlzLT5ibG9jaygkY2hpbGQpOwoKICAgICAgICAgICAgaWYgKCRpIDwgY291bnQoJGJsb2NrLT5jaGlsZHJlbikgLSAxKSB7CiAgICAgICAgICAgICAgICBlY2hvICR0aGlzLT5icmVhazsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGJsb2NrLT5jaGlsZHJlblskaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICRuZXh0ID0gJGJsb2NrLT5jaGlsZHJlblskaSArIDFdOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJG5leHQtPmRlcHRoID09PSBtYXgoJGJsb2NrLT5kZXB0aCwgMSkgJiYgJGNoaWxkLT5kZXB0aCA+PSAkbmV4dC0+ZGVwdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkdGhpcy0+YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2soT3V0cHV0QmxvY2sgJGJsb2NrKQogICAgewogICAgICAgIGlmICgkYmxvY2stPnR5cGUgPT09ICdyb290JykgewogICAgICAgICAgICAkdGhpcy0+YWRqdXN0QWxsQ2hpbGRyZW4oJGJsb2NrKTsKICAgICAgICB9CgogICAgICAgIGlmIChlbXB0eSgkYmxvY2stPmxpbmVzKSAmJiBlbXB0eSgkYmxvY2stPmNoaWxkcmVuKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZGVwdGggPSAkYmxvY2stPmRlcHRoOwoKICAgICAgICBpZiAoISBlbXB0eSgkYmxvY2stPnNlbGVjdG9ycykpIHsKICAgICAgICAgICAgJHRoaXMtPmJsb2NrU2VsZWN0b3JzKCRibG9jayk7CgogICAgICAgICAgICAkdGhpcy0+aW5kZW50TGV2ZWwrKzsKICAgICAgICB9CgogICAgICAgIGlmICghIGVtcHR5KCRibG9jay0+bGluZXMpKSB7CiAgICAgICAgICAgICR0aGlzLT5ibG9ja0xpbmVzKCRibG9jayk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISBlbXB0eSgkYmxvY2stPmNoaWxkcmVuKSkgewogICAgICAgICAgICAkdGhpcy0+YmxvY2tDaGlsZHJlbigkYmxvY2spOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEgZW1wdHkoJGJsb2NrLT5zZWxlY3RvcnMpKSB7CiAgICAgICAgICAgICR0aGlzLT5pbmRlbnRMZXZlbC0tOwoKICAgICAgICAgICAgZWNobyAkdGhpcy0+Y2xvc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGJsb2NrLT50eXBlID09PSAncm9vdCcpIHsKICAgICAgICAgICAgZWNobyAkdGhpcy0+YnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQWRqdXN0IHRoZSBkZXB0aHMgb2YgYWxsIGNoaWxkcmVuLCBkZXB0aCBmaXJzdAogICAgICoKICAgICAqIEBwYXJhbSBcTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sgJGJsb2NrCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gYWRqdXN0QWxsQ2hpbGRyZW4oT3V0cHV0QmxvY2sgJGJsb2NrKQogICAgewogICAgICAgIC8vIGZsYXR0ZW4gZW1wdHkgbmVzdGVkIGJsb2NrcwogICAgICAgICRjaGlsZHJlbiA9IGFycmF5KCk7CgogICAgICAgIGZvcmVhY2ggKCRibG9jay0+Y2hpbGRyZW4gYXMgJGkgPT4gJGNoaWxkKSB7CiAgICAgICAgICAgIGlmIChlbXB0eSgkY2hpbGQtPmxpbmVzKSAmJiBlbXB0eSgkY2hpbGQtPmNoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRibG9jay0+Y2hpbGRyZW5bJGkgKyAxXSkpIHsKICAgICAgICAgICAgICAgICAgICAkYmxvY2stPmNoaWxkcmVuWyRpICsgMV0tPmRlcHRoID0gJGNoaWxkLT5kZXB0aDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGNoaWxkcmVuW10gPSAkY2hpbGQ7CiAgICAgICAgfQoKICAgICAgICAkY291bnQgPSBjb3VudCgkY2hpbGRyZW4pOwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkY291bnQ7ICRpKyspIHsKICAgICAgICAgICAgJGRlcHRoID0gJGNoaWxkcmVuWyRpXS0+ZGVwdGg7CiAgICAgICAgICAgICRqID0gJGkgKyAxOwoKICAgICAgICAgICAgaWYgKGlzc2V0KCRjaGlsZHJlblskal0pICYmICRkZXB0aCA8ICRjaGlsZHJlblskal0tPmRlcHRoKSB7CiAgICAgICAgICAgICAgICAkY2hpbGREZXB0aCA9ICRjaGlsZHJlblskal0tPmRlcHRoOwoKICAgICAgICAgICAgICAgIGZvciAoOyAkaiA8ICRjb3VudDsgJGorKykgewogICAgICAgICAgICAgICAgICAgIGlmICgkZGVwdGggPCAkY2hpbGRyZW5bJGpdLT5kZXB0aCAmJiAkY2hpbGREZXB0aCA+PSAkY2hpbGRyZW5bJGpdLT5kZXB0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAkY2hpbGRyZW5bJGpdLT5kZXB0aCA9ICRkZXB0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkYmxvY2stPmNoaWxkcmVuID0gJGNoaWxkcmVuOwoKICAgICAgICAvLyBtYWtlIHJlbGF0aXZlIHRvIHBhcmVudAogICAgICAgIGZvcmVhY2ggKCRibG9jay0+Y2hpbGRyZW4gYXMgJGNoaWxkKSB7CiAgICAgICAgICAgICR0aGlzLT5hZGp1c3RBbGxDaGlsZHJlbigkY2hpbGQpOwoKICAgICAgICAgICAgJGNoaWxkLT5kZXB0aCA9ICRjaGlsZC0+ZGVwdGggLSAkYmxvY2stPmRlcHRoOwogICAgICAgIH0KICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Formatter/OutputBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocFxGb3JtYXR0ZXI7CgovKioKICogU0NTUyBvdXRwdXQgYmxvY2sKICoKICogQGF1dGhvciBBbnRob24gUGFuZyA8YW50aG9uLnBhbmdAZ21haWwuY29tPgogKi8KY2xhc3MgT3V0cHV0QmxvY2sKewogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJHR5cGU7CgogICAgLyoqCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgcHVibGljICRkZXB0aDsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHVibGljICRzZWxlY3RvcnM7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkbGluZXM7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkY2hpbGRyZW47CgogICAgLyoqCiAgICAgKiBAdmFyIFxMZWFmb1xTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jawogICAgICovCiAgICBwdWJsaWMgJHBhcmVudDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Node.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocDsKCi8qKgogKiBTQ1NTIG5vZGUKICoKICogQGF1dGhvciBBbnRob24gUGFuZyA8YW50aG9uLnBhbmdAZ21haWwuY29tPgogKi8KYWJzdHJhY3QgY2xhc3MgTm9kZQp7CiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkdHlwZTsKCiAgICAvKioKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICovCiAgICBwdWJsaWMgJHNvdXJjZVBvc2l0aW9uOwoKICAgIC8qKgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkc291cmNlSW5kZXg7Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Node/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Node/Number.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocFxOb2RlOwoKdXNlIExlYWZvXFNjc3NQaHBcQ29tcGlsZXI7CnVzZSBMZWFmb1xTY3NzUGhwXE5vZGU7CnVzZSBMZWFmb1xTY3NzUGhwXFR5cGU7CgovKioKICogU0NTUyBkaW1lbnNpb24gKyBvcHRpb25hbCB1bml0cwogKgogKiB7QGludGVybmFsCiAqICAgICBUaGlzIGlzIGEgd29yay1pbi1wcm9ncmVzcy4KICoKICogICAgIFRoZSBcQXJyYXlBY2Nlc3MgaW50ZXJmYWNlIGlzIHRlbXBvcmFyeSB1bnRpbCB0aGUgbWlncmF0aW9uIGlzIGNvbXBsZXRlLgogKiB9fQogKgogKiBAYXV0aG9yIEFudGhvbiBQYW5nIDxhbnRob24ucGFuZ0BnbWFpbC5jb20+CiAqLwpjbGFzcyBOdW1iZXIgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgXEFycmF5QWNjZXNzCnsKICAgIC8qKgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHN0YXRpYyBwdWJsaWMgJHByZWNpc2lvbiA9IDU7CgogICAgLyoqCiAgICAgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTIvV0QtY3NzMy12YWx1ZXMtMjAxMjAzMDgvCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICBzdGF0aWMgcHJvdGVjdGVkICR1bml0VGFibGUgPSBhcnJheSgKICAgICAgICAnaW4nID0+IGFycmF5KAogICAgICAgICAgICAnaW4nID0+IDEsCiAgICAgICAgICAgICdwYycgPT4gNiwKICAgICAgICAgICAgJ3B0JyA9PiA3MiwKICAgICAgICAgICAgJ3B4JyA9PiA5NiwKICAgICAgICAgICAgJ2NtJyA9PiAyLjU0LAogICAgICAgICAgICAnbW0nID0+IDI1LjQsCiAgICAgICAgICAgICdxJyAgPT4gMTAxLjYsCiAgICAgICAgKSwKICAgICAgICAndHVybicgPT4gYXJyYXkoCiAgICAgICAgICAgICdkZWcnICA9PiAzNjAsCiAgICAgICAgICAgICdncmFkJyA9PiA0MDAsCiAgICAgICAgICAgICdyYWQnICA9PiA2LjI4MzE4NTMwNzE3OTU4NjQ3NjkyNTI4Njc2LCAvLyAyICogTV9QSQogICAgICAgICAgICAndHVybicgPT4gMSwKICAgICAgICApLAogICAgICAgICdzJyA9PiBhcnJheSgKICAgICAgICAgICAgJ3MnICA9PiAxLAogICAgICAgICAgICAnbXMnID0+IDEwMDAsCiAgICAgICAgKSwKICAgICAgICAnSHonID0+IGFycmF5KAogICAgICAgICAgICAnSHonICA9PiAxLAogICAgICAgICAgICAna0h6JyA9PiAwLjAwMSwKICAgICAgICApLAogICAgICAgICdkcGknID0+IGFycmF5KAogICAgICAgICAgICAnZHBpJyAgPT4gMSwKICAgICAgICAgICAgJ2RwY20nID0+IDIuNTQsCiAgICAgICAgICAgICdkcHB4JyA9PiA5NiwKICAgICAgICApLAogICAgKTsKCiAgICAvKioKICAgICAqIEB2YXIgaW50ZWdlcnxmbG9hdAogICAgICovCiAgICBwdWJsaWMgJGRpbWVuc2lvbjsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHVibGljICR1bml0czsKCiAgICAvKioKICAgICAqIEluaXRpYWxpemUgbnVtYmVyCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICRkaW1lbnNpb24KICAgICAqIEBwYXJhbSBtaXhlZCAkaW5pdGlhbFVuaXQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRkaW1lbnNpb24sICRpbml0aWFsVW5pdCkKICAgIHsKICAgICAgICAkdGhpcy0+dHlwZSAgICAgID0gVHlwZTo6VF9OVU1CRVI7CiAgICAgICAgJHRoaXMtPmRpbWVuc2lvbiA9ICRkaW1lbnNpb247CiAgICAgICAgJHRoaXMtPnVuaXRzICAgICA9IGlzX2FycmF5KCRpbml0aWFsVW5pdCkKICAgICAgICAgICAgPyAkaW5pdGlhbFVuaXQKICAgICAgICAgICAgOiAoJGluaXRpYWxVbml0ID8gYXJyYXkoJGluaXRpYWxVbml0ID0+IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFycmF5KCkpOwogICAgfQoKICAgIC8qKgogICAgICogQ29lcmNlIG51bWJlciB0byB0YXJnZXQgdW5pdHMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHVuaXRzCiAgICAgKgogICAgICogQHJldHVybiBcTGVhZm9cU2Nzc1BocFxOb2RlXE51bWJlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29lcmNlKCR1bml0cykKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnVuaXRsZXNzKCkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXIoJHRoaXMtPmRpbWVuc2lvbiwgJHVuaXRzKTsKICAgICAgICB9CgogICAgICAgICRkaW1lbnNpb24gPSAkdGhpcy0+ZGltZW5zaW9uOwoKICAgICAgICBmb3JlYWNoIChzZWxmOjokdW5pdFRhYmxlWydpbiddIGFzICR1bml0ID0+ICRjb252KSB7CiAgICAgICAgICAgICRmcm9tICAgICAgID0gaXNzZXQoJHRoaXMtPnVuaXRzWyR1bml0XSkgPyAkdGhpcy0+dW5pdHNbJHVuaXRdIDogMDsKICAgICAgICAgICAgJHRvICAgICAgICAgPSBpc3NldCgkdW5pdHNbJHVuaXRdKSA/ICR1bml0c1skdW5pdF0gOiAwOwogICAgICAgICAgICAkZmFjdG9yICAgICA9IHBvdygkY29udiwgJGZyb20gLSAkdG8pOwogICAgICAgICAgICAkZGltZW5zaW9uIC89ICRmYWN0b3I7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IE51bWJlcigkZGltZW5zaW9uLCAkdW5pdHMpOwogICAgfQoKICAgIC8qKgogICAgICogTm9ybWFsaXplIG51bWJlcgogICAgICoKICAgICAqIEByZXR1cm4gXExlYWZvXFNjc3NQaHBcTm9kZVxOdW1iZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG5vcm1hbGl6ZSgpCiAgICB7CiAgICAgICAgJGRpbWVuc2lvbiA9ICR0aGlzLT5kaW1lbnNpb247CiAgICAgICAgJHVuaXRzICAgICA9IGFycmF5KCk7CgogICAgICAgICR0aGlzLT5ub3JtYWxpemVVbml0cygkZGltZW5zaW9uLCAkdW5pdHMsICdpbicpOwoKICAgICAgICByZXR1cm4gbmV3IE51bWJlcigkZGltZW5zaW9uLCAkdW5pdHMpOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gb2Zmc2V0RXhpc3RzKCRvZmZzZXQpCiAgICB7CiAgICAgICAgaWYgKCRvZmZzZXQgPT09IC0yKSB7CiAgICAgICAgICAgIHJldHVybiAkc291cmNlSW5kZXggIT09IG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG9mZnNldCA9PT0gLTEKICAgICAgICAgICAgfHwgJG9mZnNldCA9PT0gMAogICAgICAgICAgICB8fCAkb2Zmc2V0ID09PSAxCiAgICAgICAgICAgIHx8ICRvZmZzZXQgPT09IDIKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBvZmZzZXRHZXQoJG9mZnNldCkKICAgIHsKICAgICAgICBzd2l0Y2ggKCRvZmZzZXQpIHsKICAgICAgICAgICAgY2FzZSAtMjoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c291cmNlSW5kZXg7CgogICAgICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zb3VyY2VQb3NpdGlvbjsKCiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dHlwZTsKCiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZGltZW5zaW9uOwoKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT51bml0czsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBvZmZzZXRTZXQoJG9mZnNldCwgJHZhbHVlKQogICAgewogICAgICAgIGlmICgkb2Zmc2V0ID09PSAxKSB7CiAgICAgICAgICAgICR0aGlzLT5kaW1lbnNpb24gPSAkdmFsdWU7CiAgICAgICAgfSBlbHNlaWYgKCRvZmZzZXQgPT09IDIpIHsKICAgICAgICAgICAgJHRoaXMtPnVuaXRzID0gJHZhbHVlOwogICAgICAgIH0gZWxzZWlmICgkb2Zmc2V0ID09IC0xKSB7CiAgICAgICAgICAgICR0aGlzLT5zb3VyY2VQb3NpdGlvbiA9ICR2YWx1ZTsKICAgICAgICB9IGVsc2VpZiAoJG9mZnNldCA9PSAtMikgewogICAgICAgICAgICAkdGhpcy0+c291cmNlSW5kZXggPSAkdmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gb2Zmc2V0VW5zZXQoJG9mZnNldCkKICAgIHsKICAgICAgICBpZiAoJG9mZnNldCA9PT0gMSkgewogICAgICAgICAgICAkdGhpcy0+ZGltZW5zaW9uID0gbnVsbDsKICAgICAgICB9IGVsc2VpZiAoJG9mZnNldCA9PT0gMikgewogICAgICAgICAgICAkdGhpcy0+dW5pdHMgPSBudWxsOwogICAgICAgIH0gZWxzZWlmICgkb2Zmc2V0ID09PSAtMSkgewogICAgICAgICAgICAkdGhpcy0+c291cmNlUG9zaXRpb24gPSBudWxsOwogICAgICAgIH0gZWxzZWlmICgkb2Zmc2V0ID09PSAtMikgewogICAgICAgICAgICAkdGhpcy0+c291cmNlSW5kZXggPSBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyIGlzIHVuaXRsZXNzCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB1bml0bGVzcygpCiAgICB7CiAgICAgICAgcmV0dXJuICEgYXJyYXlfc3VtKCR0aGlzLT51bml0cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHVuaXQocykgYXMgdGhlIHByb2R1Y3Qgb2YgbnVtZXJhdG9yIHVuaXRzIGRpdmlkZWQgYnkgdGhlIHByb2R1Y3Qgb2YgZGVub21pbmF0b3IgdW5pdHMKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdW5pdFN0cigpCiAgICB7CiAgICAgICAgJG51bWVyYXRvcnMgPSBhcnJheSgpOwogICAgICAgICRkZW5vbWluYXRvcnMgPSBhcnJheSgpOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+dW5pdHMgYXMgJHVuaXQgPT4gJHVuaXRTaXplKSB7CiAgICAgICAgICAgIGlmICgkdW5pdFNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAkbnVtZXJhdG9ycyA9IGFycmF5X3BhZCgkbnVtZXJhdG9ycywgY291bnQoJG51bWVyYXRvcnMpICsgJHVuaXRTaXplLCAkdW5pdCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR1bml0U2l6ZSA8IDApIHsKICAgICAgICAgICAgICAgICRkZW5vbWluYXRvcnMgPSBhcnJheV9wYWQoJGRlbm9taW5hdG9ycywgY291bnQoJGRlbm9taW5hdG9ycykgKyAkdW5pdFNpemUsICR1bml0KTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW1wbG9kZSgnKicsICRudW1lcmF0b3JzKSAuIChjb3VudCgkZGVub21pbmF0b3JzKSA/ICcvJyAuIGltcGxvZGUoJyonLCAkZGVub21pbmF0b3JzKSA6ICcnKTsKICAgIH0KCiAgICAvKioKICAgICAqIE91dHB1dCBudW1iZXIKICAgICAqCiAgICAgKiBAcGFyYW0gXExlYWZvXFNjc3NQaHBcQ29tcGlsZXIgJGNvbXBpbGVyCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG91dHB1dChDb21waWxlciAkY29tcGlsZXIgPSBudWxsKQogICAgewogICAgICAgICRkaW1lbnNpb24gPSByb3VuZCgkdGhpcy0+ZGltZW5zaW9uLCBzZWxmOjokcHJlY2lzaW9uKTsKCiAgICAgICAgJHVuaXRzID0gYXJyYXlfZmlsdGVyKCR0aGlzLT51bml0cywgZnVuY3Rpb24gKCR1bml0U2l6ZSkgewogICAgICAgICAgICByZXR1cm4gJHVuaXRTaXplOwogICAgICAgIH0pOwoKICAgICAgICAvLyBAdG9kbyByZWZhY3RvciBub3JtYWxpemUoKQogICAgICAgIGlmIChjb3VudCgkdW5pdHMpID4gMSAmJiBhcnJheV9zdW0oJHVuaXRzKSA9PT0gMCkgewogICAgICAgICAgICAkZGltZW5zaW9uID0gJHRoaXMtPmRpbWVuc2lvbjsKICAgICAgICAgICAgJHVuaXRzICAgICA9IGFycmF5KCk7CgogICAgICAgICAgICAkdGhpcy0+bm9ybWFsaXplVW5pdHMoJGRpbWVuc2lvbiwgJHVuaXRzLCAnaW4nKTsKCiAgICAgICAgICAgICRkaW1lbnNpb24gPSByb3VuZCgkZGltZW5zaW9uLCBzZWxmOjokcHJlY2lzaW9uKTsKICAgICAgICAgICAgJHVuaXRzICAgICA9IGFycmF5X2ZpbHRlcigkdW5pdHMsIGZ1bmN0aW9uICgkdW5pdFNpemUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdW5pdFNpemU7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJHVuaXRTaXplID0gYXJyYXlfc3VtKCR1bml0cyk7CgogICAgICAgIGlmICgkY29tcGlsZXIgJiYgKCR1bml0U2l6ZSA+IDEgfHwgJHVuaXRTaXplIDwgMCB8fCBjb3VudCgkdW5pdHMpID4gMSkpIHsKICAgICAgICAgICAgJGNvbXBpbGVyLT50aHJvd0Vycm9yKChzdHJpbmcpICRkaW1lbnNpb24gLiAkdGhpcy0+dW5pdFN0cigpIC4gIiBpc24ndCBhIHZhbGlkIENTUyB2YWx1ZS4iKTsKICAgICAgICB9CgogICAgICAgIHJlc2V0KCR1bml0cyk7CiAgICAgICAgbGlzdCgkdW5pdCwgKSA9IGVhY2goJHVuaXRzKTsKCiAgICAgICAgcmV0dXJuIChzdHJpbmcpICRkaW1lbnNpb24gLiAkdW5pdDsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+b3V0cHV0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBOb3JtYWxpemUgdW5pdHMKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ZWdlcnxmbG9hdCAkZGltZW5zaW9uCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAkdW5pdHMKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgICRiYXNlVW5pdAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXRzKCYkZGltZW5zaW9uLCAmJHVuaXRzLCAkYmFzZVVuaXQgPSAnaW4nKQogICAgewogICAgICAgICRkaW1lbnNpb24gPSAkdGhpcy0+ZGltZW5zaW9uOwogICAgICAgICR1bml0cyA9IGFycmF5KCk7CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT51bml0cyBhcyAkdW5pdCA9PiAkZXhwKSB7CiAgICAgICAgICAgIGlmIChpc3NldChzZWxmOjokdW5pdFRhYmxlWyRiYXNlVW5pdF1bJHVuaXRdKSkgewogICAgICAgICAgICAgICAgJGZhY3RvciA9IHBvdyhzZWxmOjokdW5pdFRhYmxlWyRiYXNlVW5pdF1bJHVuaXRdLCAkZXhwKTsKCiAgICAgICAgICAgICAgICAkdW5pdCA9ICRiYXNlVW5pdDsKICAgICAgICAgICAgICAgICRkaW1lbnNpb24gLz0gJGZhY3RvcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHVuaXRzWyR1bml0XSA9ICRleHAgKyAoaXNzZXQoJHVuaXRzWyR1bml0XSkgPyAkdW5pdHNbJHVuaXRdIDogMCk7CiAgICAgICAgfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Parser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocDsKCnVzZSBMZWFmb1xTY3NzUGhwXEJsb2NrOwp1c2UgTGVhZm9cU2Nzc1BocFxDb21waWxlcjsKdXNlIExlYWZvXFNjc3NQaHBcTm9kZTsKdXNlIExlYWZvXFNjc3NQaHBcVHlwZTsKCi8qKgogKiBTQ1NTIHBhcnNlcgogKgogKiBAYXV0aG9yIExlYWYgQ29yY29yYW4gPGxlYWZvdEBnbWFpbC5jb20+CiAqLwpjbGFzcyBQYXJzZXIKewogICAgY29uc3QgU09VUkNFX0lOREVYICAgID0gLTE7CiAgICBjb25zdCBTT1VSQ0VfUE9TSVRJT04gPSAtMjsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIHN0YXRpYyAkcHJlY2VkZW5jZSA9IGFycmF5KAogICAgICAgICc9JyAgID0+IDAsCiAgICAgICAgJ29yJyAgPT4gMSwKICAgICAgICAnYW5kJyA9PiAyLAogICAgICAgICc9PScgID0+IDMsCiAgICAgICAgJyE9JyAgPT4gMywKICAgICAgICAnPD0+JyA9PiAzLAogICAgICAgICc8PScgID0+IDQsCiAgICAgICAgJz49JyAgPT4gNCwKICAgICAgICAnPCcgICA9PiA0LAogICAgICAgICc+JyAgID0+IDQsCiAgICAgICAgJysnICAgPT4gNSwKICAgICAgICAnLScgICA9PiA1LAogICAgICAgICcqJyAgID0+IDYsCiAgICAgICAgJy8nICAgPT4gNiwKICAgICAgICAnJScgICA9PiA2LAogICAgKTsKCiAgICBwcm90ZWN0ZWQgc3RhdGljICRjb21tZW50UGF0dGVybjsKICAgIHByb3RlY3RlZCBzdGF0aWMgJG9wZXJhdG9yUGF0dGVybjsKICAgIHByb3RlY3RlZCBzdGF0aWMgJHdoaXRlUGF0dGVybjsKCiAgICBwcml2YXRlICRzb3VyY2VOYW1lOwogICAgcHJpdmF0ZSAkc291cmNlSW5kZXg7CiAgICBwcml2YXRlICRjaGFyc2V0OwogICAgcHJpdmF0ZSAkY291bnQ7CiAgICBwcml2YXRlICRlbnY7CiAgICBwcml2YXRlICRpblBhcmVuczsKICAgIHByaXZhdGUgJGVhdFdoaXRlRGVmYXVsdDsKICAgIHByaXZhdGUgJGJ1ZmZlcjsKCiAgICAvKioKICAgICAqIENvbnN0cnVjdG9yCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICRzb3VyY2VOYW1lCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkc291cmNlSW5kZXgKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzb3VyY2VOYW1lLCAkc291cmNlSW5kZXggPSAwKQogICAgewogICAgICAgICR0aGlzLT5zb3VyY2VOYW1lICA9ICRzb3VyY2VOYW1lID86ICcoc3RkaW4pJzsKICAgICAgICAkdGhpcy0+c291cmNlSW5kZXggPSAkc291cmNlSW5kZXg7CiAgICAgICAgJHRoaXMtPmNoYXJzZXQgICAgID0gbnVsbDsKCiAgICAgICAgaWYgKGVtcHR5KHNlbGY6OiRvcGVyYXRvclBhdHRlcm4pKSB7CiAgICAgICAgICAgIHNlbGY6OiRvcGVyYXRvclBhdHRlcm4gPSAnKFsqXC8lKy1dfFshPV1cPXxcPlw9P3xcPFw9XD58XDxcPT98YW5kfG9yKSc7CgogICAgICAgICAgICAkY29tbWVudFNpbmdsZSAgICAgID0gJ1wvXC8nOwogICAgICAgICAgICAkY29tbWVudE11bHRpTGVmdCAgID0gJ1wvXConOwogICAgICAgICAgICAkY29tbWVudE11bHRpUmlnaHQgID0gJ1wqXC8nOwoKICAgICAgICAgICAgc2VsZjo6JGNvbW1lbnRQYXR0ZXJuID0gJGNvbW1lbnRNdWx0aUxlZnQgLiAnLio/JyAuICRjb21tZW50TXVsdGlSaWdodDsKICAgICAgICAgICAgc2VsZjo6JHdoaXRlUGF0dGVybiA9ICcvJyAuICRjb21tZW50U2luZ2xlIC4gJ1teXG5dKlxzKnwoJyAuIHNlbGY6OiRjb21tZW50UGF0dGVybiAuICcpXHMqfFxzKy9BaXMnOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEdldCBzb3VyY2UgZmlsZSBuYW1lCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VOYW1lKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNvdXJjZU5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgc291cmNlIGxpbmUgbnVtYmVyIChnaXZlbiBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlcikKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGludGVnZXIgJHBvcwogICAgICoKICAgICAqIEByZXR1cm4gaW50ZWdlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGluZU5vKCRwb3MpCiAgICB7CiAgICAgICAgcmV0dXJuIDEgKyBzdWJzdHJfY291bnQoc3Vic3RyKCR0aGlzLT5idWZmZXIsIDAsICRwb3MpLCAiXG4iKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRocm93IHBhcnNlciBlcnJvcgogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAkbXNnCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkY291bnQKICAgICAqCiAgICAgKiBAdGhyb3dzIFxFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRocm93UGFyc2VFcnJvcigkbXNnID0gJ3BhcnNlIGVycm9yJywgJGNvdW50ID0gbnVsbCkKICAgIHsKICAgICAgICAkY291bnQgPSAhIGlzc2V0KCRjb3VudCkgPyAkdGhpcy0+Y291bnQgOiAkY291bnQ7CgogICAgICAgICRsaW5lID0gJHRoaXMtPmdldExpbmVObygkY291bnQpOwoKICAgICAgICBpZiAoISBlbXB0eSgkdGhpcy0+c291cmNlTmFtZSkpIHsKICAgICAgICAgICAgJGxvYyA9ICIkdGhpcy0+c291cmNlTmFtZSBvbiBsaW5lICRsaW5lIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbG9jID0gImxpbmU6ICRsaW5lIjsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+cGVlaygiKC4qPykoXG58JCkiLCAkbSwgJGNvdW50KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXEV4Y2VwdGlvbigiJG1zZzogZmFpbGVkIGF0IGAkbVsxXWAgJGxvYyIpOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFxFeGNlcHRpb24oIiRtc2c6ICRsb2MiKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlciBidWZmZXIKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkYnVmZmVyCiAgICAgKgogICAgICogQHJldHVybiBcTGVhZm9cU2Nzc1BocFxCbG9jawogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2UoJGJ1ZmZlcikKICAgIHsKICAgICAgICAkdGhpcy0+Y291bnQgICAgICAgICAgID0gMDsKICAgICAgICAkdGhpcy0+ZW52ICAgICAgICAgICAgID0gbnVsbDsKICAgICAgICAkdGhpcy0+aW5QYXJlbnMgICAgICAgID0gZmFsc2U7CiAgICAgICAgJHRoaXMtPmVhdFdoaXRlRGVmYXVsdCA9IHRydWU7CiAgICAgICAgJHRoaXMtPmJ1ZmZlciAgICAgICAgICA9IHJ0cmltKCRidWZmZXIsICJceDAwLi5ceDFmIik7CgogICAgICAgICR0aGlzLT5wdXNoQmxvY2sobnVsbCk7IC8vIHJvb3QgYmxvY2sKCiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAkdGhpcy0+cHVzaEJsb2NrKG51bGwpOwogICAgICAgICR0aGlzLT5wb3BCbG9jaygpOwoKICAgICAgICB3aGlsZSAoJHRoaXMtPnBhcnNlQ2h1bmsoKSkgewogICAgICAgICAgICA7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmNvdW50ICE9PSBzdHJsZW4oJHRoaXMtPmJ1ZmZlcikpIHsKICAgICAgICAgICAgJHRoaXMtPnRocm93UGFyc2VFcnJvcigpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEgZW1wdHkoJHRoaXMtPmVudi0+cGFyZW50KSkgewogICAgICAgICAgICAkdGhpcy0+dGhyb3dQYXJzZUVycm9yKCd1bmNsb3NlZCBibG9jaycpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5jaGFyc2V0KSB7CiAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJHRoaXMtPmVudi0+Y2hpbGRyZW4sICR0aGlzLT5jaGFyc2V0KTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5lbnYtPmlzUm9vdCAgICA9IHRydWU7CgogICAgICAgIHJldHVybiAkdGhpcy0+ZW52OwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgYSB2YWx1ZSBvciB2YWx1ZSBsaXN0CiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZmZlcgogICAgICogQHBhcmFtIHN0cmluZyAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwYXJzZVZhbHVlKCRidWZmZXIsICYkb3V0KQogICAgewogICAgICAgICR0aGlzLT5jb3VudCAgICAgICAgICAgPSAwOwogICAgICAgICR0aGlzLT5lbnYgICAgICAgICAgICAgPSBudWxsOwogICAgICAgICR0aGlzLT5pblBhcmVucyAgICAgICAgPSBmYWxzZTsKICAgICAgICAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0ID0gdHJ1ZTsKICAgICAgICAkdGhpcy0+YnVmZmVyICAgICAgICAgID0gKHN0cmluZykgJGJ1ZmZlcjsKCiAgICAgICAgcmV0dXJuICR0aGlzLT52YWx1ZUxpc3QoJG91dCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhIHNlbGVjdG9yIG9yIHNlbGVjdG9yIGxpc3QKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkYnVmZmVyCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHBhcnNlU2VsZWN0b3IoJGJ1ZmZlciwgJiRvdXQpCiAgICB7CiAgICAgICAgJHRoaXMtPmNvdW50ICAgICAgICAgICA9IDA7CiAgICAgICAgJHRoaXMtPmVudiAgICAgICAgICAgICA9IG51bGw7CiAgICAgICAgJHRoaXMtPmluUGFyZW5zICAgICAgICA9IGZhbHNlOwogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSB0cnVlOwogICAgICAgICR0aGlzLT5idWZmZXIgICAgICAgICAgPSAoc3RyaW5nKSAkYnVmZmVyOwoKICAgICAgICByZXR1cm4gJHRoaXMtPnNlbGVjdG9ycygkb3V0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGEgc2luZ2xlIGNodW5rIG9mZiB0aGUgaGVhZCBvZiB0aGUgYnVmZmVyIGFuZCBhcHBlbmQgaXQgdG8gdGhlCiAgICAgKiBjdXJyZW50IHBhcnNlIGVudmlyb25tZW50LgogICAgICoKICAgICAqIFJldHVybnMgZmFsc2Ugd2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5LCBvciB3aGVuIHRoZXJlIGlzIGFuIGVycm9yLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgdGhlIGVudGlyZSBkb2N1bWVudCBpcwogICAgICogcGFyc2VkLgogICAgICoKICAgICAqIFRoaXMgcGFyc2VyIGlzIG1vc3Qgc2ltaWxhciB0byBhIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlci4gU2luZ2xlCiAgICAgKiBmdW5jdGlvbnMgcmVwcmVzZW50IGRpc2NyZXRlIGdyYW1tYXRpY2FsIHJ1bGVzIGZvciB0aGUgbGFuZ3VhZ2UsIGFuZAogICAgICogdGhleSBhcmUgYWJsZSB0byBjYXB0dXJlIHRoZSB0ZXh0IHRoYXQgcmVwcmVzZW50cyB0aG9zZSBydWxlcy4KICAgICAqCiAgICAgKiBDb25zaWRlciB0aGUgZnVuY3Rpb24gQ29tcGlsZXI6OmtleXdvcmQoKS4gKEFsbCBwYXJzZSBmdW5jdGlvbnMgYXJlCiAgICAgKiBzdHJ1Y3R1cmVkIHRoZSBzYW1lLikKICAgICAqCiAgICAgKiBUaGUgZnVuY3Rpb24gdGFrZXMgYSBzaW5nbGUgcmVmZXJlbmNlIGFyZ3VtZW50LiBXaGVuIGNhbGxpbmcgdGhlCiAgICAgKiBmdW5jdGlvbiBpdCB3aWxsIGF0dGVtcHQgdG8gbWF0Y2ggYSBrZXl3b3JkIG9uIHRoZSBoZWFkIG9mIHRoZSBidWZmZXIuCiAgICAgKiBJZiBpdCBpcyBzdWNjZXNzZnVsLCBpdCB3aWxsIHBsYWNlIHRoZSBrZXl3b3JkIGluIHRoZSByZWZlcmVuY2VkCiAgICAgKiBhcmd1bWVudCwgYWR2YW5jZSB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciwgYW5kIHJldHVybiB0cnVlLiBJZiBpdAogICAgICogZmFpbHMgdGhlbiBpdCB3b24ndCBhZHZhbmNlIHRoZSBidWZmZXIgYW5kIGl0IHdpbGwgcmV0dXJuIGZhbHNlLgogICAgICoKICAgICAqIEFsbCBvZiB0aGVzZSBwYXJzZSBmdW5jdGlvbnMgYXJlIHBvd2VyZWQgYnkgQ29tcGlsZXI6Om1hdGNoKCksIHdoaWNoIGJlaGF2ZXMKICAgICAqIHRoZSBzYW1lIHdheSwgYnV0IHRha2VzIGEgbGl0ZXJhbCByZWd1bGFyIGV4cHJlc3Npb24uIFNvbWV0aW1lcyBpdCBpcwogICAgICogbW9yZSBjb252ZW5pZW50IHRvIHVzZSBtYXRjaCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IGZ1bmN0aW9uLgogICAgICoKICAgICAqIEJlY2F1c2Ugb2YgdGhlIGZvcm1hdCBvZiB0aGUgZnVuY3Rpb25zLCB0byBwYXJzZSBhbiBlbnRpcmUgc3RyaW5nIG9mCiAgICAgKiBncmFtbWF0aWNhbCBydWxlcywgeW91IGNhbiBjaGFpbiB0aGVtIHRvZ2V0aGVyIHVzaW5nICYmLgogICAgICoKICAgICAqIEJ1dCwgaWYgc29tZSBvZiB0aGUgcnVsZXMgaW4gdGhlIGNoYWluIHN1Y2NlZWQgYmVmb3JlIG9uZSBmYWlscywgdGhlbgogICAgICogdGhlIGJ1ZmZlciBwb3NpdGlvbiB3aWxsIGJlIGxlZnQgYXQgYW4gaW52YWxpZCBzdGF0ZS4gSW4gb3JkZXIgdG8KICAgICAqIGF2b2lkIHRoaXMsIENvbXBpbGVyOjpzZWVrKCkgaXMgdXNlZCB0byByZW1lbWJlciBhbmQgc2V0IGJ1ZmZlciBwb3NpdGlvbnMuCiAgICAgKgogICAgICogQmVmb3JlIHBhcnNpbmcgYSBjaGFpbiwgdXNlICRzID0gJHRoaXMtPnNlZWsoKSB0byByZW1lbWJlciB0aGUgY3VycmVudAogICAgICogcG9zaXRpb24gaW50byAkcy4gVGhlbiBpZiBhIGNoYWluIGZhaWxzLCB1c2UgJHRoaXMtPnNlZWsoJHMpIHRvCiAgICAgKiBnbyBiYWNrIHdoZXJlIHdlIHN0YXJ0ZWQuCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZUNodW5rKCkKICAgIHsKICAgICAgICAkcyA9ICR0aGlzLT5zZWVrKCk7CgogICAgICAgIC8vIHRoZSBkaXJlY3RpdmVzCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5idWZmZXJbJHRoaXMtPmNvdW50XSkgJiYgJHRoaXMtPmJ1ZmZlclskdGhpcy0+Y291bnRdID09PSAnQCcpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCdAYXQtcm9vdCcpICYmCiAgICAgICAgICAgICAgICAoJHRoaXMtPnNlbGVjdG9ycygkc2VsZWN0b3IpIHx8IHRydWUpICYmCiAgICAgICAgICAgICAgICAoJHRoaXMtPm1hcCgkd2l0aCkgfHwgdHJ1ZSkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCd7JykKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkYXRSb290ID0gJHRoaXMtPnB1c2hTcGVjaWFsQmxvY2soVHlwZTo6VF9BVF9ST09ULCAkcyk7CiAgICAgICAgICAgICAgICAkYXRSb290LT5zZWxlY3RvciA9ICRzZWxlY3RvcjsKICAgICAgICAgICAgICAgICRhdFJvb3QtPndpdGggPSAkd2l0aDsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCdAbWVkaWEnKSAmJiAkdGhpcy0+bWVkaWFRdWVyeUxpc3QoJG1lZGlhUXVlcnlMaXN0KSAmJiAkdGhpcy0+bGl0ZXJhbCgneycpKSB7CiAgICAgICAgICAgICAgICAkbWVkaWEgPSAkdGhpcy0+cHVzaFNwZWNpYWxCbG9jayhUeXBlOjpUX01FRElBLCAkcyk7CiAgICAgICAgICAgICAgICAkbWVkaWEtPnF1ZXJ5TGlzdCA9ICRtZWRpYVF1ZXJ5TGlzdFsyXTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCdAbWl4aW4nKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmtleXdvcmQoJG1peGluTmFtZSkgJiYKICAgICAgICAgICAgICAgICgkdGhpcy0+YXJndW1lbnREZWYoJGFyZ3MpIHx8IHRydWUpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgneycpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJG1peGluID0gJHRoaXMtPnB1c2hTcGVjaWFsQmxvY2soVHlwZTo6VF9NSVhJTiwgJHMpOwogICAgICAgICAgICAgICAgJG1peGluLT5uYW1lID0gJG1peGluTmFtZTsKICAgICAgICAgICAgICAgICRtaXhpbi0+YXJncyA9ICRhcmdzOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJ0BpbmNsdWRlJykgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5rZXl3b3JkKCRtaXhpbk5hbWUpICYmCiAgICAgICAgICAgICAgICAoJHRoaXMtPmxpdGVyYWwoJygnKSAmJgogICAgICAgICAgICAgICAgICAgICgkdGhpcy0+YXJnVmFsdWVzKCRhcmdWYWx1ZXMpIHx8IHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJyknKSB8fCB0cnVlKSAmJgogICAgICAgICAgICAgICAgKCR0aGlzLT5lbmQoKSB8fAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCd7JykgJiYgJGhhc0Jsb2NrID0gdHJ1ZSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkY2hpbGQgPSBhcnJheShUeXBlOjpUX0lOQ0xVREUsCiAgICAgICAgICAgICAgICAgICAgJG1peGluTmFtZSwgaXNzZXQoJGFyZ1ZhbHVlcykgPyAkYXJnVmFsdWVzIDogbnVsbCwgbnVsbCk7CgogICAgICAgICAgICAgICAgaWYgKCEgZW1wdHkoJGhhc0Jsb2NrKSkgewogICAgICAgICAgICAgICAgICAgICRpbmNsdWRlID0gJHRoaXMtPnB1c2hTcGVjaWFsQmxvY2soVHlwZTo6VF9JTkNMVURFLCAkcyk7CiAgICAgICAgICAgICAgICAgICAgJGluY2x1ZGUtPmNoaWxkID0gJGNoaWxkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKCRjaGlsZCwgJHMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJ0BzY3NzcGhwLWltcG9ydC1vbmNlJykgJiYKICAgICAgICAgICAgICAgICR0aGlzLT52YWx1ZUxpc3QoJGltcG9ydFBhdGgpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5kKCkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKGFycmF5KFR5cGU6OlRfU0NTU1BIUF9JTVBPUlRfT05DRSwgJGltcG9ydFBhdGgpLCAkcyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnQGltcG9ydCcpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+dmFsdWVMaXN0KCRpbXBvcnRQYXRoKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmVuZCgpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZChhcnJheShUeXBlOjpUX0lNUE9SVCwgJGltcG9ydFBhdGgpLCAkcyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnQGltcG9ydCcpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+dXJsKCRpbXBvcnRQYXRoKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmVuZCgpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZChhcnJheShUeXBlOjpUX0lNUE9SVCwgJGltcG9ydFBhdGgpLCAkcyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnQGV4dGVuZCcpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+c2VsZWN0b3JzKCRzZWxlY3RvcikgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5lbmQoKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmQoYXJyYXkoVHlwZTo6VF9FWFRFTkQsICRzZWxlY3RvciksICRzKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCdAZnVuY3Rpb24nKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmtleXdvcmQoJGZuTmFtZSkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5hcmd1bWVudERlZigkYXJncykgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCd7JykKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkZnVuYyA9ICR0aGlzLT5wdXNoU3BlY2lhbEJsb2NrKFR5cGU6OlRfRlVOQ1RJT04sICRzKTsKICAgICAgICAgICAgICAgICRmdW5jLT5uYW1lID0gJGZuTmFtZTsKICAgICAgICAgICAgICAgICRmdW5jLT5hcmdzID0gJGFyZ3M7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnQGJyZWFrJykgJiYgJHRoaXMtPmVuZCgpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKGFycmF5KFR5cGU6OlRfQlJFQUspLCAkcyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnQGNvbnRpbnVlJykgJiYgJHRoaXMtPmVuZCgpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKGFycmF5KFR5cGU6OlRfQ09OVElOVUUpLCAkcyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCgogICAgICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJ0ByZXR1cm4nKSAmJiAoJHRoaXMtPnZhbHVlTGlzdCgkcmV0VmFsKSB8fCB0cnVlKSAmJiAkdGhpcy0+ZW5kKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmQoYXJyYXkoVHlwZTo6VF9SRVRVUk4sIGlzc2V0KCRyZXRWYWwpID8gJHJldFZhbCA6IGFycmF5KFR5cGU6OlRfTlVMTCkpLCAkcyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnQGVhY2gnKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmdlbmVyaWNMaXN0KCR2YXJOYW1lcywgJ3ZhcmlhYmxlJywgJywnLCBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCdpbicpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+dmFsdWVMaXN0KCRsaXN0KSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ3snKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRlYWNoID0gJHRoaXMtPnB1c2hTcGVjaWFsQmxvY2soVHlwZTo6VF9FQUNILCAkcyk7CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHZhck5hbWVzWzJdIGFzICR2YXJOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgJGVhY2gtPnZhcnNbXSA9ICR2YXJOYW1lWzFdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRlYWNoLT5saXN0ID0gJGxpc3Q7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnQHdoaWxlJykgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5leHByZXNzaW9uKCRjb25kKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ3snKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICR3aGlsZSA9ICR0aGlzLT5wdXNoU3BlY2lhbEJsb2NrKFR5cGU6OlRfV0hJTEUsICRzKTsKICAgICAgICAgICAgICAgICR3aGlsZS0+Y29uZCA9ICRjb25kOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJ0Bmb3InKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPnZhcmlhYmxlKCR2YXJOYW1lKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ2Zyb20nKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmV4cHJlc3Npb24oJHN0YXJ0KSAmJgogICAgICAgICAgICAgICAgKCR0aGlzLT5saXRlcmFsKCd0aHJvdWdoJykgfHwKICAgICAgICAgICAgICAgICAgICAoJGZvclVudGlsID0gdHJ1ZSAmJiAkdGhpcy0+bGl0ZXJhbCgndG8nKSkpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZXhwcmVzc2lvbigkZW5kKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ3snKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRmb3IgPSAkdGhpcy0+cHVzaFNwZWNpYWxCbG9jayhUeXBlOjpUX0ZPUiwgJHMpOwogICAgICAgICAgICAgICAgJGZvci0+dmFyID0gJHZhck5hbWVbMV07CiAgICAgICAgICAgICAgICAkZm9yLT5zdGFydCA9ICRzdGFydDsKICAgICAgICAgICAgICAgICRmb3ItPmVuZCA9ICRlbmQ7CiAgICAgICAgICAgICAgICAkZm9yLT51bnRpbCA9IGlzc2V0KCRmb3JVbnRpbCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnQGlmJykgJiYgJHRoaXMtPnZhbHVlTGlzdCgkY29uZCkgJiYgJHRoaXMtPmxpdGVyYWwoJ3snKSkgewogICAgICAgICAgICAgICAgJGlmID0gJHRoaXMtPnB1c2hTcGVjaWFsQmxvY2soVHlwZTo6VF9JRiwgJHMpOwogICAgICAgICAgICAgICAgJGlmLT5jb25kID0gJGNvbmQ7CiAgICAgICAgICAgICAgICAkaWYtPmNhc2VzID0gYXJyYXkoKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCdAZGVidWcnKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPnZhbHVlTGlzdCgkdmFsdWUpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5kKCkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKGFycmF5KFR5cGU6OlRfREVCVUcsICR2YWx1ZSksICRzKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCdAd2FybicpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+dmFsdWVMaXN0KCR2YWx1ZSkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5lbmQoKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmQoYXJyYXkoVHlwZTo6VF9XQVJOLCAkdmFsdWUpLCAkcyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnQGVycm9yJykgJiYKICAgICAgICAgICAgICAgICR0aGlzLT52YWx1ZUxpc3QoJHZhbHVlKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmVuZCgpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZChhcnJheShUeXBlOjpUX0VSUk9SLCAkdmFsdWUpLCAkcyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnQGNvbnRlbnQnKSAmJiAkdGhpcy0+ZW5kKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmQoYXJyYXkoVHlwZTo6VF9NSVhJTl9DT05URU5UKSwgJHMpOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICAkbGFzdCA9ICR0aGlzLT5sYXN0KCk7CgogICAgICAgICAgICBpZiAoaXNzZXQoJGxhc3QpICYmICRsYXN0WzBdID09PSBUeXBlOjpUX0lGKSB7CiAgICAgICAgICAgICAgICBsaXN0KCwgJGlmKSA9ICRsYXN0OwoKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnQGVsc2UnKSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgneycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRlbHNlID0gJHRoaXMtPnB1c2hTcGVjaWFsQmxvY2soVHlwZTo6VF9FTFNFLCAkcyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5saXRlcmFsKCdpZicpICYmICR0aGlzLT52YWx1ZUxpc3QoJGNvbmQpICYmICR0aGlzLT5saXRlcmFsKCd7JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGVsc2UgPSAkdGhpcy0+cHVzaFNwZWNpYWxCbG9jayhUeXBlOjpUX0VMU0VJRiwgJHMpOwogICAgICAgICAgICAgICAgICAgICAgICAkZWxzZS0+Y29uZCA9ICRjb25kOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRlbHNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZWxzZS0+ZG9udEFwcGVuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICRpZi0+Y2FzZXNbXSA9ICRlbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb25seSByZXRhaW4gdGhlIGZpcnN0IEBjaGFyc2V0IGRpcmVjdGl2ZSBlbmNvdW50ZXJlZAogICAgICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJ0BjaGFyc2V0JykgJiYKICAgICAgICAgICAgICAgICR0aGlzLT52YWx1ZUxpc3QoJGNoYXJzZXQpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5kKCkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBpZiAoISBpc3NldCgkdGhpcy0+Y2hhcnNldCkpIHsKICAgICAgICAgICAgICAgICAgICAkc3RhdGVtZW50ID0gYXJyYXkoVHlwZTo6VF9DSEFSU0VULCAkY2hhcnNldCk7CgogICAgICAgICAgICAgICAgICAgICRzdGF0ZW1lbnRbc2VsZjo6U09VUkNFX1BPU0lUSU9OXSA9ICRzOwogICAgICAgICAgICAgICAgICAgICRzdGF0ZW1lbnRbc2VsZjo6U09VUkNFX0lOREVYXSA9ICR0aGlzLT5zb3VyY2VJbmRleDsKCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNoYXJzZXQgPSAkc3RhdGVtZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICAvLyBkb2Vzbid0IG1hdGNoIGJ1aWx0IGluIGRpcmVjdGl2ZSwgZG8gZ2VuZXJpYyBvbmUKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCdAJywgZmFsc2UpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+a2V5d29yZCgkZGlyTmFtZSkgJiYKICAgICAgICAgICAgICAgICgkdGhpcy0+dmFyaWFibGUoJGRpclZhbHVlKSB8fCAkdGhpcy0+b3BlblN0cmluZygneycsICRkaXJWYWx1ZSkgfHwgdHJ1ZSkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCd7JykKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBpZiAoJGRpck5hbWUgPT09ICdtZWRpYScpIHsKICAgICAgICAgICAgICAgICAgICAkZGlyZWN0aXZlID0gJHRoaXMtPnB1c2hTcGVjaWFsQmxvY2soVHlwZTo6VF9NRURJQSwgJHMpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkZGlyZWN0aXZlID0gJHRoaXMtPnB1c2hTcGVjaWFsQmxvY2soVHlwZTo6VF9ESVJFQ1RJVkUsICRzKTsKICAgICAgICAgICAgICAgICAgICAkZGlyZWN0aXZlLT5uYW1lID0gJGRpck5hbWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRkaXJWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAkZGlyZWN0aXZlLT52YWx1ZSA9ICRkaXJWYWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gcHJvcGVydHkgc2hvcnRjdXQKICAgICAgICAvLyBjYXB0dXJlcyBtb3N0IHByb3BlcnRpZXMgYmVmb3JlIGhhdmluZyB0byBwYXJzZSBhIHNlbGVjdG9yCiAgICAgICAgaWYgKCR0aGlzLT5rZXl3b3JkKCRuYW1lLCBmYWxzZSkgJiYKICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJzogJykgJiYKICAgICAgICAgICAgJHRoaXMtPnZhbHVlTGlzdCgkdmFsdWUpICYmCiAgICAgICAgICAgICR0aGlzLT5lbmQoKQogICAgICAgICkgewogICAgICAgICAgICAkbmFtZSA9IGFycmF5KFR5cGU6OlRfU1RSSU5HLCAnJywgYXJyYXkoJG5hbWUpKTsKICAgICAgICAgICAgJHRoaXMtPmFwcGVuZChhcnJheShUeXBlOjpUX0FTU0lHTiwgJG5hbWUsICR2YWx1ZSksICRzKTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAvLyB2YXJpYWJsZSBhc3NpZ25zCiAgICAgICAgaWYgKCR0aGlzLT52YXJpYWJsZSgkbmFtZSkgJiYKICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJzonKSAmJgogICAgICAgICAgICAkdGhpcy0+dmFsdWVMaXN0KCR2YWx1ZSkgJiYKICAgICAgICAgICAgJHRoaXMtPmVuZCgpCiAgICAgICAgKSB7CiAgICAgICAgICAgIC8vIGNoZWNrIGZvciAnIWZsYWcnCiAgICAgICAgICAgICRhc3NpZ25tZW50RmxhZyA9ICR0aGlzLT5zdHJpcEFzc2lnbm1lbnRGbGFnKCR2YWx1ZSk7CiAgICAgICAgICAgICR0aGlzLT5hcHBlbmQoYXJyYXkoVHlwZTo6VF9BU1NJR04sICRuYW1lLCAkdmFsdWUsICRhc3NpZ25tZW50RmxhZyksICRzKTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAvLyBtaXNjCiAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCctLT4nKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8vIG9wZW5pbmcgY3NzIGJsb2NrCiAgICAgICAgaWYgKCR0aGlzLT5zZWxlY3RvcnMoJHNlbGVjdG9ycykgJiYgJHRoaXMtPmxpdGVyYWwoJ3snKSkgewogICAgICAgICAgICAkYiA9ICR0aGlzLT5wdXNoQmxvY2soJHNlbGVjdG9ycywgJHMpOwoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgIC8vIHByb3BlcnR5IGFzc2lnbiwgb3IgbmVzdGVkIGFzc2lnbgogICAgICAgIGlmICgkdGhpcy0+cHJvcGVydHlOYW1lKCRuYW1lKSAmJiAkdGhpcy0+bGl0ZXJhbCgnOicpKSB7CiAgICAgICAgICAgICRmb3VuZFNvbWV0aGluZyA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT52YWx1ZUxpc3QoJHZhbHVlKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZChhcnJheShUeXBlOjpUX0FTU0lHTiwgJG5hbWUsICR2YWx1ZSksICRzKTsKICAgICAgICAgICAgICAgICRmb3VuZFNvbWV0aGluZyA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgneycpKSB7CiAgICAgICAgICAgICAgICAkcHJvcEJsb2NrID0gJHRoaXMtPnB1c2hTcGVjaWFsQmxvY2soVHlwZTo6VF9ORVNURURfUFJPUEVSVFksICRzKTsKICAgICAgICAgICAgICAgICRwcm9wQmxvY2stPnByZWZpeCA9ICRuYW1lOwogICAgICAgICAgICAgICAgJGZvdW5kU29tZXRoaW5nID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlaWYgKCRmb3VuZFNvbWV0aGluZykgewogICAgICAgICAgICAgICAgJGZvdW5kU29tZXRoaW5nID0gJHRoaXMtPmVuZCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGZvdW5kU29tZXRoaW5nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAvLyBjbG9zaW5nIGEgYmxvY2sKICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJ30nKSkgewogICAgICAgICAgICAkYmxvY2sgPSAkdGhpcy0+cG9wQmxvY2soKTsKCiAgICAgICAgICAgIGlmIChpc3NldCgkYmxvY2stPnR5cGUpICYmICRibG9jay0+dHlwZSA9PT0gVHlwZTo6VF9JTkNMVURFKSB7CiAgICAgICAgICAgICAgICAkaW5jbHVkZSA9ICRibG9jay0+Y2hpbGQ7CiAgICAgICAgICAgICAgICB1bnNldCgkYmxvY2stPmNoaWxkKTsKICAgICAgICAgICAgICAgICRpbmNsdWRlWzNdID0gJGJsb2NrOwogICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZCgkaW5jbHVkZSwgJHMpOwogICAgICAgICAgICB9IGVsc2VpZiAoZW1wdHkoJGJsb2NrLT5kb250QXBwZW5kKSkgewogICAgICAgICAgICAgICAgJHR5cGUgPSBpc3NldCgkYmxvY2stPnR5cGUpID8gJGJsb2NrLT50eXBlIDogVHlwZTo6VF9CTE9DSzsKICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmQoYXJyYXkoJHR5cGUsICRibG9jayksICRzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBleHRyYSBzdHVmZgogICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnOycpIHx8CiAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCc8IS0tJykKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQdXNoIGJsb2NrIG9udG8gcGFyc2UgdHJlZQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAgICRzZWxlY3RvcnMKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRwb3MKICAgICAqCiAgICAgKiBAcmV0dXJuIFxMZWFmb1xTY3NzUGhwXEJsb2NrCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwdXNoQmxvY2soJHNlbGVjdG9ycywgJHBvcyA9IDApCiAgICB7CiAgICAgICAgJGIgPSBuZXcgQmxvY2s7CiAgICAgICAgJGItPnBhcmVudCAgICAgICAgID0gJHRoaXMtPmVudjsKICAgICAgICAkYi0+c291cmNlUG9zaXRpb24gPSAkcG9zOwogICAgICAgICRiLT5zb3VyY2VJbmRleCAgICA9ICR0aGlzLT5zb3VyY2VJbmRleDsKICAgICAgICAkYi0+c2VsZWN0b3JzICAgICAgPSAkc2VsZWN0b3JzOwogICAgICAgICRiLT5jb21tZW50cyAgICAgICA9IGFycmF5KCk7CgogICAgICAgIGlmICghICR0aGlzLT5lbnYpIHsKICAgICAgICAgICAgJGItPmNoaWxkcmVuID0gYXJyYXkoKTsKICAgICAgICB9IGVsc2VpZiAoZW1wdHkoJHRoaXMtPmVudi0+Y2hpbGRyZW4pKSB7CiAgICAgICAgICAgICR0aGlzLT5lbnYtPmNoaWxkcmVuID0gJHRoaXMtPmVudi0+Y29tbWVudHM7CiAgICAgICAgICAgICRiLT5jaGlsZHJlbiA9IGFycmF5KCk7CiAgICAgICAgICAgICR0aGlzLT5lbnYtPmNvbW1lbnRzID0gYXJyYXkoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYi0+Y2hpbGRyZW4gPSAkdGhpcy0+ZW52LT5jb21tZW50czsKICAgICAgICAgICAgJHRoaXMtPmVudi0+Y29tbWVudHMgPSBhcnJheSgpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmVudiA9ICRiOwoKICAgICAgICByZXR1cm4gJGI7CiAgICB9CgogICAgLyoqCiAgICAgKiBQdXNoIHNwZWNpYWwgKG5hbWVkKSBibG9jayBvbnRvIHBhcnNlIHRyZWUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAkdHlwZQogICAgICogQHBhcmFtIGludGVnZXIgJHBvcwogICAgICoKICAgICAqIEByZXR1cm4gXExlYWZvXFNjc3NQaHBcQmxvY2sKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHB1c2hTcGVjaWFsQmxvY2soJHR5cGUsICRwb3MpCiAgICB7CiAgICAgICAgJGJsb2NrID0gJHRoaXMtPnB1c2hCbG9jayhudWxsLCAkcG9zKTsKICAgICAgICAkYmxvY2stPnR5cGUgPSAkdHlwZTsKCiAgICAgICAgcmV0dXJuICRibG9jazsKICAgIH0KCiAgICAvKioKICAgICAqIFBvcCBzY29wZSBhbmQgcmV0dXJuIGxhc3QgYmxvY2sKICAgICAqCiAgICAgKiBAcmV0dXJuIFxMZWFmb1xTY3NzUGhwXEJsb2NrCiAgICAgKgogICAgICogQHRocm93cyBcRXhjZXB0aW9uCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwb3BCbG9jaygpCiAgICB7CiAgICAgICAgJGJsb2NrID0gJHRoaXMtPmVudjsKCiAgICAgICAgaWYgKGVtcHR5KCRibG9jay0+cGFyZW50KSkgewogICAgICAgICAgICAkdGhpcy0+dGhyb3dQYXJzZUVycm9yKCd1bmV4cGVjdGVkIH0nKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5lbnYgPSAkYmxvY2stPnBhcmVudDsKICAgICAgICB1bnNldCgkYmxvY2stPnBhcmVudCk7CgogICAgICAgICRjb21tZW50cyA9ICRibG9jay0+Y29tbWVudHM7CiAgICAgICAgaWYgKGNvdW50KCRjb21tZW50cykpIHsKICAgICAgICAgICAgJHRoaXMtPmVudi0+Y29tbWVudHMgPSAkY29tbWVudHM7CiAgICAgICAgICAgIHVuc2V0KCRibG9jay0+Y29tbWVudHMpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRibG9jazsKICAgIH0KCiAgICAvKioKICAgICAqIFBlZWsgaW5wdXQgc3RyZWFtCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgJHJlZ2V4CiAgICAgKiBAcGFyYW0gYXJyYXkgICAkb3V0CiAgICAgKiBAcGFyYW0gaW50ZWdlciAkZnJvbQogICAgICoKICAgICAqIEByZXR1cm4gaW50ZWdlcgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcGVlaygkcmVnZXgsICYkb3V0LCAkZnJvbSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCEgaXNzZXQoJGZyb20pKSB7CiAgICAgICAgICAgICRmcm9tID0gJHRoaXMtPmNvdW50OwogICAgICAgIH0KCiAgICAgICAgJHIgPSAnLycgLiAkcmVnZXggLiAnL0Fpcyc7CiAgICAgICAgJHJlc3VsdCA9IHByZWdfbWF0Y2goJHIsICR0aGlzLT5idWZmZXIsICRvdXQsIG51bGwsICRmcm9tKTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZWVrIHRvIHBvc2l0aW9uIGluIGlucHV0IHN0cmVhbSAob3IgcmV0dXJuIGN1cnJlbnQgcG9zaXRpb24gaW4gaW5wdXQgc3RyZWFtKQogICAgICoKICAgICAqIEBwYXJhbSBpbnRlZ2VyICR3aGVyZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ZWdlcgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2Vlaygkd2hlcmUgPSBudWxsKQogICAgewogICAgICAgIGlmICgkd2hlcmUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jb3VudDsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5jb3VudCA9ICR3aGVyZTsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYXRjaCBzdHJpbmcgbG9va2luZyBmb3IgZWl0aGVyIGVuZGluZyBkZWxpbSwgZXNjYXBlLCBvciBzdHJpbmcgaW50ZXJwb2xhdGlvbgogICAgICoKICAgICAqIHtAaW50ZXJuYWwgVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHByZWdfbWF0Y2gncyAyNTBLIHN0cmluZyBtYXRjaCBsaW1pdC4gfX0KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICRtICAgICBNYXRjaGVzIChwYXNzZWQgYnkgcmVmZXJlbmNlKQogICAgICogQHBhcmFtIHN0cmluZyAkZGVsaW0gRGVsaW1ldGVyCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuIFRydWUgaWYgbWF0Y2g7IGZhbHNlIG90aGVyd2lzZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbWF0Y2hTdHJpbmcoJiRtLCAkZGVsaW0pCiAgICB7CiAgICAgICAgJHRva2VuID0gbnVsbDsKCiAgICAgICAgJGVuZCA9IHN0cmxlbigkdGhpcy0+YnVmZmVyKTsKCiAgICAgICAgLy8gbG9vayBmb3IgZWl0aGVyIGVuZGluZyBkZWxpbSwgZXNjYXBlLCBvciBzdHJpbmcgaW50ZXJwb2xhdGlvbgogICAgICAgIGZvcmVhY2ggKGFycmF5KCcjeycsICdcXCcsICRkZWxpbSkgYXMgJGxvb2thaGVhZCkgewogICAgICAgICAgICAkcG9zID0gc3RycG9zKCR0aGlzLT5idWZmZXIsICRsb29rYWhlYWQsICR0aGlzLT5jb3VudCk7CgogICAgICAgICAgICBpZiAoJHBvcyAhPT0gZmFsc2UgJiYgJHBvcyA8ICRlbmQpIHsKICAgICAgICAgICAgICAgICRlbmQgPSAkcG9zOwogICAgICAgICAgICAgICAgJHRva2VuID0gJGxvb2thaGVhZDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCEgaXNzZXQoJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkbWF0Y2ggPSBzdWJzdHIoJHRoaXMtPmJ1ZmZlciwgJHRoaXMtPmNvdW50LCAkZW5kIC0gJHRoaXMtPmNvdW50KTsKICAgICAgICAkbSA9IGFycmF5KAogICAgICAgICAgICAkbWF0Y2ggLiAkdG9rZW4sCiAgICAgICAgICAgICRtYXRjaCwKICAgICAgICAgICAgJHRva2VuCiAgICAgICAgKTsKICAgICAgICAkdGhpcy0+Y291bnQgPSAkZW5kICsgc3RybGVuKCR0b2tlbik7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogVHJ5IHRvIG1hdGNoIHNvbWV0aGluZyBvbiBoZWFkIG9mIGJ1ZmZlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICRyZWdleAogICAgICogQHBhcmFtIGFycmF5ICAgJG91dAogICAgICogQHBhcmFtIGJvb2xlYW4gJGVhdFdoaXRlc3BhY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1hdGNoKCRyZWdleCwgJiRvdXQsICRlYXRXaGl0ZXNwYWNlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoISBpc3NldCgkZWF0V2hpdGVzcGFjZSkpIHsKICAgICAgICAgICAgJGVhdFdoaXRlc3BhY2UgPSAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0OwogICAgICAgIH0KCiAgICAgICAgJHIgPSAnLycgLiAkcmVnZXggLiAnL0Fpcyc7CgogICAgICAgIGlmIChwcmVnX21hdGNoKCRyLCAkdGhpcy0+YnVmZmVyLCAkb3V0LCBudWxsLCAkdGhpcy0+Y291bnQpKSB7CiAgICAgICAgICAgICR0aGlzLT5jb3VudCArPSBzdHJsZW4oJG91dFswXSk7CgogICAgICAgICAgICBpZiAoJGVhdFdoaXRlc3BhY2UpIHsKICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogTWF0Y2ggbGl0ZXJhbCBzdHJpbmcKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAkd2hhdAogICAgICogQHBhcmFtIGJvb2xlYW4gJGVhdFdoaXRlc3BhY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpdGVyYWwoJHdoYXQsICRlYXRXaGl0ZXNwYWNlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoISBpc3NldCgkZWF0V2hpdGVzcGFjZSkpIHsKICAgICAgICAgICAgJGVhdFdoaXRlc3BhY2UgPSAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0OwogICAgICAgIH0KCiAgICAgICAgLy8gc2hvcnRjdXQgb24gc2luZ2xlIGxldHRlcgogICAgICAgIGlmICghIGlzc2V0KCR3aGF0WzFdKSAmJiBpc3NldCgkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudF0pKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudF0gPT09ICR3aGF0KSB7CiAgICAgICAgICAgICAgICBpZiAoISAkZWF0V2hpdGVzcGFjZSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb3VudCsrOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBnb2VzIGJlbG93Li4uCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+bWF0Y2goJHRoaXMtPnByZWdRdW90ZSgkd2hhdCksICRtLCAkZWF0V2hpdGVzcGFjZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYXRjaCBzb21lIHdoaXRlc3BhY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHdoaXRlc3BhY2UoKQogICAgewogICAgICAgICRnb3RXaGl0ZSA9IGZhbHNlOwoKICAgICAgICB3aGlsZSAocHJlZ19tYXRjaChzZWxmOjokd2hpdGVQYXR0ZXJuLCAkdGhpcy0+YnVmZmVyLCAkbSwgbnVsbCwgJHRoaXMtPmNvdW50KSkgewogICAgICAgICAgICBpZiAoaXNzZXQoJG1bMV0pICYmIGVtcHR5KCR0aGlzLT5jb21tZW50c1NlZW5bJHRoaXMtPmNvdW50XSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmRDb21tZW50KGFycmF5KFR5cGU6OlRfQ09NTUVOVCwgJG1bMV0pKTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+Y29tbWVudHNTZWVuWyR0aGlzLT5jb3VudF0gPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+Y291bnQgKz0gc3RybGVuKCRtWzBdKTsKICAgICAgICAgICAgJGdvdFdoaXRlID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkZ290V2hpdGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBBcHBlbmQgY29tbWVudCB0byBjdXJyZW50IGJsb2NrCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRjb21tZW50CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhcHBlbmRDb21tZW50KCRjb21tZW50KQogICAgewogICAgICAgICRjb21tZW50WzFdID0gc3Vic3RyKHByZWdfcmVwbGFjZShhcnJheSgnL15ccysvbScsICcvXiguKS9tJyksIGFycmF5KCcnLCAnIFwxJyksICRjb21tZW50WzFdKSwgMSk7CgogICAgICAgICR0aGlzLT5lbnYtPmNvbW1lbnRzW10gPSAkY29tbWVudDsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGVuZCBzdGF0ZW1lbnQgdG8gY3VycmVudCBibG9jawogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAgICRzdGF0ZW1lbnQKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRwb3MKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFwcGVuZCgkc3RhdGVtZW50LCAkcG9zID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHBvcyAhPT0gbnVsbCkgewogICAgICAgICAgICAkc3RhdGVtZW50W3NlbGY6OlNPVVJDRV9QT1NJVElPTl0gPSAkcG9zOwogICAgICAgICAgICAkc3RhdGVtZW50W3NlbGY6OlNPVVJDRV9JTkRFWF0gICAgPSAkdGhpcy0+c291cmNlSW5kZXg7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZW52LT5jaGlsZHJlbltdID0gJHN0YXRlbWVudDsKCiAgICAgICAgJGNvbW1lbnRzID0gJHRoaXMtPmVudi0+Y29tbWVudHM7CgogICAgICAgIGlmIChjb3VudCgkY29tbWVudHMpKSB7CiAgICAgICAgICAgICR0aGlzLT5lbnYtPmNoaWxkcmVuID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmVudi0+Y2hpbGRyZW4sICRjb21tZW50cyk7CiAgICAgICAgICAgICR0aGlzLT5lbnYtPmNvbW1lbnRzID0gYXJyYXkoKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGxhc3QgY2hpbGQgd2FzIGFwcGVuZGVkCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsYXN0KCkKICAgIHsKICAgICAgICAkaSA9IGNvdW50KCR0aGlzLT5lbnYtPmNoaWxkcmVuKSAtIDE7CgogICAgICAgIGlmIChpc3NldCgkdGhpcy0+ZW52LT5jaGlsZHJlblskaV0pKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZW52LT5jaGlsZHJlblskaV07CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgbWVkaWEgcXVlcnkgbGlzdAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBtZWRpYVF1ZXJ5TGlzdCgmJG91dCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdlbmVyaWNMaXN0KCRvdXQsICdtZWRpYVF1ZXJ5JywgJywnLCBmYWxzZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBtZWRpYSBxdWVyeQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBtZWRpYVF1ZXJ5KCYkb3V0KQogICAgewogICAgICAgICRzID0gJHRoaXMtPnNlZWsoKTsKCiAgICAgICAgJGV4cHJlc3Npb25zID0gbnVsbDsKICAgICAgICAkcGFydHMgPSBhcnJheSgpOwoKICAgICAgICBpZiAoKCR0aGlzLT5saXRlcmFsKCdvbmx5JykgJiYgKCRvbmx5ID0gdHJ1ZSkgfHwgJHRoaXMtPmxpdGVyYWwoJ25vdCcpICYmICgkbm90ID0gdHJ1ZSkgfHwgdHJ1ZSkgJiYKICAgICAgICAgICAgJHRoaXMtPm1peGVkS2V5d29yZCgkbWVkaWFUeXBlKQogICAgICAgICkgewogICAgICAgICAgICAkcHJvcCA9IGFycmF5KFR5cGU6OlRfTUVESUFfVFlQRSk7CgogICAgICAgICAgICBpZiAoaXNzZXQoJG9ubHkpKSB7CiAgICAgICAgICAgICAgICAkcHJvcFtdID0gYXJyYXkoVHlwZTo6VF9LRVlXT1JELCAnb25seScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNzZXQoJG5vdCkpIHsKICAgICAgICAgICAgICAgICRwcm9wW10gPSBhcnJheShUeXBlOjpUX0tFWVdPUkQsICdub3QnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG1lZGlhID0gYXJyYXkoVHlwZTo6VF9MSVNULCAnJywgYXJyYXkoKSk7CgogICAgICAgICAgICBmb3JlYWNoICgoYXJyYXkpJG1lZGlhVHlwZSBhcyAkdHlwZSkgewogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCR0eXBlKSkgewogICAgICAgICAgICAgICAgICAgICRtZWRpYVsyXVtdID0gJHR5cGU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRtZWRpYVsyXVtdID0gYXJyYXkoVHlwZTo6VF9LRVlXT1JELCAkdHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRwcm9wW10gID0gJG1lZGlhOwogICAgICAgICAgICAkcGFydHNbXSA9ICRwcm9wOwogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCRwYXJ0cykgfHwgJHRoaXMtPmxpdGVyYWwoJ2FuZCcpKSB7CiAgICAgICAgICAgICR0aGlzLT5nZW5lcmljTGlzdCgkZXhwcmVzc2lvbnMsICdtZWRpYUV4cHJlc3Npb24nLCAnYW5kJywgZmFsc2UpOwoKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRleHByZXNzaW9ucykpIHsKICAgICAgICAgICAgICAgICRwYXJ0cyA9IGFycmF5X21lcmdlKCRwYXJ0cywgJGV4cHJlc3Npb25zWzJdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJG91dCA9ICRwYXJ0czsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBtZWRpYSBleHByZXNzaW9uCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1lZGlhRXhwcmVzc2lvbigmJG91dCkKICAgIHsKICAgICAgICAkcyA9ICR0aGlzLT5zZWVrKCk7CiAgICAgICAgJHZhbHVlID0gbnVsbDsKCiAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCcoJykgJiYKICAgICAgICAgICAgJHRoaXMtPmV4cHJlc3Npb24oJGZlYXR1cmUpICYmCiAgICAgICAgICAgICgkdGhpcy0+bGl0ZXJhbCgnOicpICYmICR0aGlzLT5leHByZXNzaW9uKCR2YWx1ZSkgfHwgdHJ1ZSkgJiYKICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJyknKQogICAgICAgICkgewogICAgICAgICAgICAkb3V0ID0gYXJyYXkoVHlwZTo6VF9NRURJQV9FWFBSRVNTSU9OLCAkZmVhdHVyZSk7CgogICAgICAgICAgICBpZiAoJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAkb3V0W10gPSAkdmFsdWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhcmd1bWVudCB2YWx1ZXMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXJnVmFsdWVzKCYkb3V0KQogICAgewogICAgICAgIGlmICgkdGhpcy0+Z2VuZXJpY0xpc3QoJGxpc3QsICdhcmdWYWx1ZScsICcsJywgZmFsc2UpKSB7CiAgICAgICAgICAgICRvdXQgPSAkbGlzdFsyXTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgYXJndW1lbnQgdmFsdWUKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXJnVmFsdWUoJiRvdXQpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+c2VlaygpOwoKICAgICAgICAka2V5d29yZCA9IG51bGw7CgogICAgICAgIGlmICghICR0aGlzLT52YXJpYWJsZSgka2V5d29yZCkgfHwgISAkdGhpcy0+bGl0ZXJhbCgnOicpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKICAgICAgICAgICAgJGtleXdvcmQgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5nZW5lcmljTGlzdCgkdmFsdWUsICdleHByZXNzaW9uJykpIHsKICAgICAgICAgICAgJG91dCA9IGFycmF5KCRrZXl3b3JkLCAkdmFsdWUsIGZhbHNlKTsKICAgICAgICAgICAgJHMgPSAkdGhpcy0+c2VlaygpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCcuLi4nKSkgewogICAgICAgICAgICAgICAgJG91dFsyXSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgY29tbWEgc2VwYXJhdGVkIHZhbHVlIGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbHVlTGlzdCgmJG91dCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdlbmVyaWNMaXN0KCRvdXQsICdzcGFjZUxpc3QnLCAnLCcpOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2Ugc3BhY2Ugc2VwYXJhdGVkIHZhbHVlIGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc3BhY2VMaXN0KCYkb3V0KQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2VuZXJpY0xpc3QoJG91dCwgJ2V4cHJlc3Npb24nKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGdlbmVyaWMgbGlzdAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAgICAkb3V0CiAgICAgKiBAcGFyYW0gY2FsbGFibGUgJHBhcnNlSXRlbQogICAgICogQHBhcmFtIHN0cmluZyAgICRkZWxpbQogICAgICogQHBhcmFtIGJvb2xlYW4gICRmbGF0dGVuCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmljTGlzdCgmJG91dCwgJHBhcnNlSXRlbSwgJGRlbGltID0gJycsICRmbGF0dGVuID0gdHJ1ZSkKICAgIHsKICAgICAgICAkcyA9ICR0aGlzLT5zZWVrKCk7CiAgICAgICAgJGl0ZW1zID0gYXJyYXkoKTsKCiAgICAgICAgd2hpbGUgKCR0aGlzLT4kcGFyc2VJdGVtKCR2YWx1ZSkpIHsKICAgICAgICAgICAgJGl0ZW1zW10gPSAkdmFsdWU7CgogICAgICAgICAgICBpZiAoJGRlbGltKSB7CiAgICAgICAgICAgICAgICBpZiAoISAkdGhpcy0+bGl0ZXJhbCgkZGVsaW0pKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChjb3VudCgkaXRlbXMpID09PSAwKSB7CiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkZmxhdHRlbiAmJiBjb3VudCgkaXRlbXMpID09PSAxKSB7CiAgICAgICAgICAgICRvdXQgPSAkaXRlbXNbMF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG91dCA9IGFycmF5KFR5cGU6OlRfTElTVCwgJGRlbGltLCAkaXRlbXMpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBleHByZXNzaW9uCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGV4cHJlc3Npb24oJiRvdXQpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+c2VlaygpOwoKICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJygnKSkgewogICAgICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJyknKSkgewogICAgICAgICAgICAgICAgJG91dCA9IGFycmF5KFR5cGU6OlRfTElTVCwgJycsIGFycmF5KCkpOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHRoaXMtPnZhbHVlTGlzdCgkb3V0KSAmJiAkdGhpcy0+bGl0ZXJhbCgnKScpICYmICRvdXRbMF0gPT09IFR5cGU6OlRfTElTVCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bWFwKCRvdXQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT52YWx1ZSgkbGhzKSkgewogICAgICAgICAgICAkb3V0ID0gJHRoaXMtPmV4cEhlbHBlcigkbGhzLCAwKTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgbGVmdC1oYW5kIHNpZGUgb2Ygc3ViZXhwcmVzc2lvbgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAgICRsaHMKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRtaW5QCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXhwSGVscGVyKCRsaHMsICRtaW5QKQogICAgewogICAgICAgICRvcGVyYXRvcnMgPSBzZWxmOjokb3BlcmF0b3JQYXR0ZXJuOwoKICAgICAgICAkc3MgPSAkdGhpcy0+c2VlaygpOwogICAgICAgICR3aGl0ZUJlZm9yZSA9IGlzc2V0KCR0aGlzLT5idWZmZXJbJHRoaXMtPmNvdW50IC0gMV0pICYmCiAgICAgICAgICAgIGN0eXBlX3NwYWNlKCR0aGlzLT5idWZmZXJbJHRoaXMtPmNvdW50IC0gMV0pOwoKICAgICAgICB3aGlsZSAoJHRoaXMtPm1hdGNoKCRvcGVyYXRvcnMsICRtLCBmYWxzZSkgJiYgc2VsZjo6JHByZWNlZGVuY2VbJG1bMV1dID49ICRtaW5QKSB7CiAgICAgICAgICAgICR3aGl0ZUFmdGVyID0gaXNzZXQoJHRoaXMtPmJ1ZmZlclskdGhpcy0+Y291bnRdKSAmJgogICAgICAgICAgICAgICAgY3R5cGVfc3BhY2UoJHRoaXMtPmJ1ZmZlclskdGhpcy0+Y291bnRdKTsKICAgICAgICAgICAgJHZhckFmdGVyID0gaXNzZXQoJHRoaXMtPmJ1ZmZlclskdGhpcy0+Y291bnRdKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlclskdGhpcy0+Y291bnRdID09PSAnJCc7CgogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAgICAgJG9wID0gJG1bMV07CgogICAgICAgICAgICAvLyBkb24ndCB0dXJuIG5lZ2F0aXZlIG51bWJlcnMgaW50byBleHByZXNzaW9ucwogICAgICAgICAgICBpZiAoJG9wID09PSAnLScgJiYgJHdoaXRlQmVmb3JlICYmICEgJHdoaXRlQWZ0ZXIgJiYgISAkdmFyQWZ0ZXIpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoISAkdGhpcy0+dmFsdWUoJHJocykpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBwZWVrIGFuZCBzZWUgaWYgcmhzIGJlbG9uZ3MgdG8gbmV4dCBvcGVyYXRvcgogICAgICAgICAgICBpZiAoJHRoaXMtPnBlZWsoJG9wZXJhdG9ycywgJG5leHQpICYmIHNlbGY6OiRwcmVjZWRlbmNlWyRuZXh0WzFdXSA+IHNlbGY6OiRwcmVjZWRlbmNlWyRvcF0pIHsKICAgICAgICAgICAgICAgICRyaHMgPSAkdGhpcy0+ZXhwSGVscGVyKCRyaHMsIHNlbGY6OiRwcmVjZWRlbmNlWyRuZXh0WzFdXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRsaHMgPSBhcnJheShUeXBlOjpUX0VYUFJFU1NJT04sICRvcCwgJGxocywgJHJocywgJHRoaXMtPmluUGFyZW5zLCAkd2hpdGVCZWZvcmUsICR3aGl0ZUFmdGVyKTsKICAgICAgICAgICAgJHNzID0gJHRoaXMtPnNlZWsoKTsKICAgICAgICAgICAgJHdoaXRlQmVmb3JlID0gaXNzZXQoJHRoaXMtPmJ1ZmZlclskdGhpcy0+Y291bnQgLSAxXSkgJiYKICAgICAgICAgICAgICAgIGN0eXBlX3NwYWNlKCR0aGlzLT5idWZmZXJbJHRoaXMtPmNvdW50IC0gMV0pOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHNzKTsKCiAgICAgICAgcmV0dXJuICRsaHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSB2YWx1ZQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB2YWx1ZSgmJG91dCkKICAgIHsKICAgICAgICAkcyA9ICR0aGlzLT5zZWVrKCk7CgogICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnbm90JywgZmFsc2UpICYmICR0aGlzLT53aGl0ZXNwYWNlKCkgJiYgJHRoaXMtPnZhbHVlKCRpbm5lcikpIHsKICAgICAgICAgICAgJG91dCA9IGFycmF5KFR5cGU6OlRfVU5BUlksICdub3QnLCAkaW5uZXIsICR0aGlzLT5pblBhcmVucyk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCdub3QnLCBmYWxzZSkgJiYgJHRoaXMtPnBhcmVuVmFsdWUoJGlubmVyKSkgewogICAgICAgICAgICAkb3V0ID0gYXJyYXkoVHlwZTo6VF9VTkFSWSwgJ25vdCcsICRpbm5lciwgJHRoaXMtPmluUGFyZW5zKTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJysnKSAmJiAkdGhpcy0+dmFsdWUoJGlubmVyKSkgewogICAgICAgICAgICAkb3V0ID0gYXJyYXkoVHlwZTo6VF9VTkFSWSwgJysnLCAkaW5uZXIsICR0aGlzLT5pblBhcmVucyk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgLy8gbmVnYXRpb24KICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJy0nLCBmYWxzZSkgJiYKICAgICAgICAgICAgKCR0aGlzLT52YXJpYWJsZSgkaW5uZXIpIHx8CiAgICAgICAgICAgICR0aGlzLT51bml0KCRpbm5lcikgfHwKICAgICAgICAgICAgJHRoaXMtPnBhcmVuVmFsdWUoJGlubmVyKSkKICAgICAgICApIHsKICAgICAgICAgICAgJG91dCA9IGFycmF5KFR5cGU6OlRfVU5BUlksICctJywgJGlubmVyLCAkdGhpcy0+aW5QYXJlbnMpOwoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgIGlmICgkdGhpcy0+cGFyZW5WYWx1ZSgkb3V0KSB8fAogICAgICAgICAgICAkdGhpcy0+aW50ZXJwb2xhdGlvbigkb3V0KSB8fAogICAgICAgICAgICAkdGhpcy0+dmFyaWFibGUoJG91dCkgfHwKICAgICAgICAgICAgJHRoaXMtPmNvbG9yKCRvdXQpIHx8CiAgICAgICAgICAgICR0aGlzLT51bml0KCRvdXQpIHx8CiAgICAgICAgICAgICR0aGlzLT5zdHJpbmcoJG91dCkgfHwKICAgICAgICAgICAgJHRoaXMtPmZ1bmMoJG91dCkgfHwKICAgICAgICAgICAgJHRoaXMtPnByb2dpZCgkb3V0KQogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+a2V5d29yZCgka2V5d29yZCkpIHsKICAgICAgICAgICAgaWYgKCRrZXl3b3JkID09PSAnbnVsbCcpIHsKICAgICAgICAgICAgICAgICRvdXQgPSBhcnJheShUeXBlOjpUX05VTEwpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG91dCA9IGFycmF5KFR5cGU6OlRfS0VZV09SRCwgJGtleXdvcmQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIHBhcmVudGhlc2l6ZWQgdmFsdWUKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyZW5WYWx1ZSgmJG91dCkKICAgIHsKICAgICAgICAkcyA9ICR0aGlzLT5zZWVrKCk7CgogICAgICAgICRpblBhcmVucyA9ICR0aGlzLT5pblBhcmVuczsKCiAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCcoJykpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCcpJykpIHsKICAgICAgICAgICAgICAgICRvdXQgPSBhcnJheShUeXBlOjpUX0xJU1QsICcnLCBhcnJheSgpKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPmluUGFyZW5zID0gdHJ1ZTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhwcmVzc2lvbigkZXhwKSAmJiAkdGhpcy0+bGl0ZXJhbCgnKScpKSB7CiAgICAgICAgICAgICAgICAkb3V0ID0gJGV4cDsKICAgICAgICAgICAgICAgICR0aGlzLT5pblBhcmVucyA9ICRpblBhcmVuczsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmluUGFyZW5zID0gJGluUGFyZW5zOwogICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgInByb2dpZDoiCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHByb2dpZCgmJG91dCkKICAgIHsKICAgICAgICAkcyA9ICR0aGlzLT5zZWVrKCk7CgogICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgncHJvZ2lkOicsIGZhbHNlKSAmJgogICAgICAgICAgICAkdGhpcy0+b3BlblN0cmluZygnKCcsICRmbikgJiYKICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJygnKQogICAgICAgICkgewogICAgICAgICAgICAkdGhpcy0+b3BlblN0cmluZygnKScsICRhcmdzLCAnKCcpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCcpJykpIHsKICAgICAgICAgICAgICAgICRvdXQgPSBhcnJheShUeXBlOjpUX1NUUklORywgJycsIGFycmF5KAogICAgICAgICAgICAgICAgICAgICdwcm9naWQ6JywgJGZuLCAnKCcsICRhcmdzLCAnKScKICAgICAgICAgICAgICAgICkpOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGZ1bmN0aW9uIGNhbGwKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZnVuYygmJGZ1bmMpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+c2VlaygpOwoKICAgICAgICBpZiAoJHRoaXMtPmtleXdvcmQoJG5hbWUsIGZhbHNlKSAmJgogICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgnKCcpCiAgICAgICAgKSB7CiAgICAgICAgICAgIGlmICgkbmFtZSA9PT0gJ2FscGhhJyAmJiAkdGhpcy0+YXJndW1lbnRMaXN0KCRhcmdzKSkgewogICAgICAgICAgICAgICAgJGZ1bmMgPSBhcnJheShUeXBlOjpUX0ZVTkNUSU9OLCAkbmFtZSwgYXJyYXkoVHlwZTo6VF9TVFJJTkcsICcnLCAkYXJncykpOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJG5hbWUgIT09ICdleHByZXNzaW9uJyAmJiAhIHByZWdfbWF0Y2goJy9eKC1bYS16XSstKT9jYWxjJC8nLCAkbmFtZSkpIHsKICAgICAgICAgICAgICAgICRzcyA9ICR0aGlzLT5zZWVrKCk7CgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5hcmdWYWx1ZXMoJGFyZ3MpICYmICR0aGlzLT5saXRlcmFsKCcpJykpIHsKICAgICAgICAgICAgICAgICAgICAkZnVuYyA9IGFycmF5KFR5cGU6OlRfRlVOQ1RJT05fQ0FMTCwgJG5hbWUsICRhcmdzKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHNzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCgkdGhpcy0+b3BlblN0cmluZygnKScsICRzdHIsICcoJykgfHwgdHJ1ZSApICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgnKScpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJGFyZ3MgPSBhcnJheSgpOwoKICAgICAgICAgICAgICAgIGlmICghIGVtcHR5KCRzdHIpKSB7CiAgICAgICAgICAgICAgICAgICAgJGFyZ3NbXSA9IGFycmF5KG51bGwsIGFycmF5KFR5cGU6OlRfU1RSSU5HLCAnJywgYXJyYXkoJHN0cikpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkZnVuYyA9IGFycmF5KFR5cGU6OlRfRlVOQ1RJT05fQ0FMTCwgJG5hbWUsICRhcmdzKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBmdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXJndW1lbnRMaXN0KCYkb3V0KQogICAgewogICAgICAgICRzID0gJHRoaXMtPnNlZWsoKTsKICAgICAgICAkdGhpcy0+bGl0ZXJhbCgnKCcpOwoKICAgICAgICAkYXJncyA9IGFycmF5KCk7CgogICAgICAgIHdoaWxlICgkdGhpcy0+a2V5d29yZCgkdmFyKSkgewogICAgICAgICAgICAkc3MgPSAkdGhpcy0+c2VlaygpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCc9JykgJiYgJHRoaXMtPmV4cHJlc3Npb24oJGV4cCkpIHsKICAgICAgICAgICAgICAgICRhcmdzW10gPSBhcnJheShUeXBlOjpUX1NUUklORywgJycsIGFycmF5KCR2YXIgLiAnPScpKTsKICAgICAgICAgICAgICAgICRhcmcgPSAkZXhwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRhcmdzW10gPSAkYXJnOwoKICAgICAgICAgICAgaWYgKCEgJHRoaXMtPmxpdGVyYWwoJywnKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRhcmdzW10gPSBhcnJheShUeXBlOjpUX1NUUklORywgJycsIGFycmF5KCcsICcpKTsKICAgICAgICB9CgogICAgICAgIGlmICghICR0aGlzLT5saXRlcmFsKCcpJykgfHwgISBjb3VudCgkYXJncykpIHsKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJG91dCA9ICRhcmdzOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIG1peGluL2Z1bmN0aW9uIGRlZmluaXRpb24gIGFyZ3VtZW50IGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXJndW1lbnREZWYoJiRvdXQpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+c2VlaygpOwogICAgICAgICR0aGlzLT5saXRlcmFsKCcoJyk7CgogICAgICAgICRhcmdzID0gYXJyYXkoKTsKCiAgICAgICAgd2hpbGUgKCR0aGlzLT52YXJpYWJsZSgkdmFyKSkgewogICAgICAgICAgICAkYXJnID0gYXJyYXkoJHZhclsxXSwgbnVsbCwgZmFsc2UpOwoKICAgICAgICAgICAgJHNzID0gJHRoaXMtPnNlZWsoKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnOicpICYmICR0aGlzLT5nZW5lcmljTGlzdCgkZGVmYXVsdFZhbCwgJ2V4cHJlc3Npb24nKSkgewogICAgICAgICAgICAgICAgJGFyZ1sxXSA9ICRkZWZhdWx0VmFsOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHNzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNzID0gJHRoaXMtPnNlZWsoKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnLi4uJykpIHsKICAgICAgICAgICAgICAgICRzc3MgPSAkdGhpcy0+c2VlaygpOwoKICAgICAgICAgICAgICAgIGlmICghICR0aGlzLT5saXRlcmFsKCcpJykpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dGhyb3dQYXJzZUVycm9yKCcuLi4gaGFzIHRvIGJlIGFmdGVyIHRoZSBmaW5hbCBhcmd1bWVudCcpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRhcmdbMl0gPSB0cnVlOwogICAgICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHNzcyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Vlaygkc3MpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYXJnc1tdID0gJGFyZzsKCiAgICAgICAgICAgIGlmICghICR0aGlzLT5saXRlcmFsKCcsJykpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoISAkdGhpcy0+bGl0ZXJhbCgnKScpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRvdXQgPSAkYXJnczsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBtYXAKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbWFwKCYkb3V0KQogICAgewogICAgICAgICRzID0gJHRoaXMtPnNlZWsoKTsKCiAgICAgICAgaWYgKCEgJHRoaXMtPmxpdGVyYWwoJygnKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAka2V5cyA9IGFycmF5KCk7CiAgICAgICAgJHZhbHVlcyA9IGFycmF5KCk7CgogICAgICAgIHdoaWxlICgkdGhpcy0+Z2VuZXJpY0xpc3QoJGtleSwgJ2V4cHJlc3Npb24nKSAmJiAkdGhpcy0+bGl0ZXJhbCgnOicpICYmCiAgICAgICAgICAgICR0aGlzLT5nZW5lcmljTGlzdCgkdmFsdWUsICdleHByZXNzaW9uJykKICAgICAgICApIHsKICAgICAgICAgICAgJGtleXNbXSA9ICRrZXk7CiAgICAgICAgICAgICR2YWx1ZXNbXSA9ICR2YWx1ZTsKCiAgICAgICAgICAgIGlmICghICR0aGlzLT5saXRlcmFsKCcsJykpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoISBjb3VudCgka2V5cykgfHwgISAkdGhpcy0+bGl0ZXJhbCgnKScpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRvdXQgPSBhcnJheShUeXBlOjpUX01BUCwgJGtleXMsICR2YWx1ZXMpOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGNvbG9yCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbG9yKCYkb3V0KQogICAgewogICAgICAgICRjb2xvciA9IGFycmF5KFR5cGU6OlRfQ09MT1IpOwoKICAgICAgICBpZiAoJHRoaXMtPm1hdGNoKCcoIyhbMC05YS1mXXs2fSl8IyhbMC05YS1mXXszfSkpJywgJG0pKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkbVszXSkpIHsKICAgICAgICAgICAgICAgICRudW0gPSBoZXhkZWMoJG1bM10pOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5KDMsIDIsIDEpIGFzICRpKSB7CiAgICAgICAgICAgICAgICAgICAgJHQgPSAkbnVtICYgMHhmOwogICAgICAgICAgICAgICAgICAgICRjb2xvclskaV0gPSAkdCA8PCA0IHwgJHQ7CiAgICAgICAgICAgICAgICAgICAgJG51bSA+Pj0gNDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRudW0gPSBoZXhkZWMoJG1bMl0pOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5KDMsIDIsIDEpIGFzICRpKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbG9yWyRpXSA9ICRudW0gJiAweGZmOwogICAgICAgICAgICAgICAgICAgICRudW0gPj49IDg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRvdXQgPSAkY29sb3I7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIG51bWJlciB3aXRoIHVuaXQKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gdW5pdCgmJHVuaXQpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5tYXRjaCgnKFswLTldKihcLik/WzAtOV0rKShbJWEtekEtWl0rKT8nLCAkbSkpIHsKICAgICAgICAgICAgJHVuaXQgPSBuZXcgTm9kZVxOdW1iZXIoJG1bMV0sIGVtcHR5KCRtWzNdKSA/ICcnIDogJG1bM10pOwoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBzdHJpbmcKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc3RyaW5nKCYkb3V0KQogICAgewogICAgICAgICRzID0gJHRoaXMtPnNlZWsoKTsKCiAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCciJywgZmFsc2UpKSB7CiAgICAgICAgICAgICRkZWxpbSA9ICciJzsKICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPmxpdGVyYWwoJ1wnJywgZmFsc2UpKSB7CiAgICAgICAgICAgICRkZWxpbSA9ICdcJyc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJGNvbnRlbnQgPSBhcnJheSgpOwogICAgICAgICRvbGRXaGl0ZSA9ICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQ7CiAgICAgICAgJHRoaXMtPmVhdFdoaXRlRGVmYXVsdCA9IGZhbHNlOwoKICAgICAgICB3aGlsZSAoJHRoaXMtPm1hdGNoU3RyaW5nKCRtLCAkZGVsaW0pKSB7CiAgICAgICAgICAgICRjb250ZW50W10gPSAkbVsxXTsKCiAgICAgICAgICAgIGlmICgkbVsyXSA9PT0gJyN7JykgewogICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50IC09IHN0cmxlbigkbVsyXSk7CgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pbnRlcnBvbGF0aW9uKCRpbnRlciwgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnRbXSA9ICRpbnRlcjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50ICs9IHN0cmxlbigkbVsyXSk7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnRbXSA9ICcjeyc7IC8vIGlnbm9yZSBpdAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoJG1bMl0gPT09ICdcXCcpIHsKICAgICAgICAgICAgICAgICRjb250ZW50W10gPSAkbVsyXTsKCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJGRlbGltLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgICAgICAkY29udGVudFtdID0gJGRlbGltOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50IC09IHN0cmxlbigkZGVsaW0pOwogICAgICAgICAgICAgICAgYnJlYWs7IC8vIGRlbGltCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSAkb2xkV2hpdGU7CgogICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgkZGVsaW0pKSB7CiAgICAgICAgICAgICRvdXQgPSBhcnJheShUeXBlOjpUX1NUUklORywgJGRlbGltLCAkY29udGVudCk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2Uga2V5d29yZCBvciBpbnRlcnBvbGF0aW9uCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1peGVkS2V5d29yZCgmJG91dCkKICAgIHsKICAgICAgICAkcyA9ICR0aGlzLT5zZWVrKCk7CgogICAgICAgICRwYXJ0cyA9IGFycmF5KCk7CgogICAgICAgICRvbGRXaGl0ZSA9ICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQ7CiAgICAgICAgJHRoaXMtPmVhdFdoaXRlRGVmYXVsdCA9IGZhbHNlOwoKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+a2V5d29yZCgka2V5KSkgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAka2V5OwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+aW50ZXJwb2xhdGlvbigkaW50ZXIpKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICRpbnRlcjsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSAkb2xkV2hpdGU7CgogICAgICAgIGlmIChjb3VudCgkcGFydHMpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0KSB7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgfQoKICAgICAgICAkb3V0ID0gJHBhcnRzOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGFuIHVuYm91bmRlZCBzdHJpbmcgc3RvcHBlZCBieSAkZW5kCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZW5kCiAgICAgKiBAcGFyYW0gYXJyYXkgICRvdXQKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5lc3RpbmdPcGVuCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcGVuU3RyaW5nKCRlbmQsICYkb3V0LCAkbmVzdGluZ09wZW4gPSBudWxsKQogICAgewogICAgICAgICRvbGRXaGl0ZSA9ICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQ7CiAgICAgICAgJHRoaXMtPmVhdFdoaXRlRGVmYXVsdCA9IGZhbHNlOwoKICAgICAgICAkcGF0dCA9ICcoLio/KShbXCciXXwjXHt8JyAuICR0aGlzLT5wcmVnUXVvdGUoJGVuZCkgLiAnfCcgLiBzZWxmOjokY29tbWVudFBhdHRlcm4gLiAnKSc7CgogICAgICAgICRuZXN0aW5nTGV2ZWwgPSAwOwoKICAgICAgICAkY29udGVudCA9IGFycmF5KCk7CgogICAgICAgIHdoaWxlICgkdGhpcy0+bWF0Y2goJHBhdHQsICRtLCBmYWxzZSkpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRtWzFdKSAmJiAkbVsxXSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICRjb250ZW50W10gPSAkbVsxXTsKCiAgICAgICAgICAgICAgICBpZiAoJG5lc3RpbmdPcGVuKSB7CiAgICAgICAgICAgICAgICAgICAgJG5lc3RpbmdMZXZlbCArPSBzdWJzdHJfY291bnQoJG1bMV0sICRuZXN0aW5nT3Blbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0b2sgPSAkbVsyXTsKCiAgICAgICAgICAgICR0aGlzLT5jb3VudC09IHN0cmxlbigkdG9rKTsKCiAgICAgICAgICAgIGlmICgkdG9rID09PSAkZW5kICYmICEgJG5lc3RpbmdMZXZlbC0tKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCgkdG9rID09PSAnXCcnIHx8ICR0b2sgPT09ICciJykgJiYgJHRoaXMtPnN0cmluZygkc3RyKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnRbXSA9ICRzdHI7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0b2sgPT09ICcjeycgJiYgJHRoaXMtPmludGVycG9sYXRpb24oJGludGVyKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnRbXSA9ICRpbnRlcjsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkY29udGVudFtdID0gJHRvazsKICAgICAgICAgICAgJHRoaXMtPmNvdW50Kz0gc3RybGVuKCR0b2spOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmVhdFdoaXRlRGVmYXVsdCA9ICRvbGRXaGl0ZTsKCiAgICAgICAgaWYgKGNvdW50KCRjb250ZW50KSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyB0cmltIHRoZSBlbmQKICAgICAgICBpZiAoaXNfc3RyaW5nKGVuZCgkY29udGVudCkpKSB7CiAgICAgICAgICAgICRjb250ZW50W2NvdW50KCRjb250ZW50KSAtIDFdID0gcnRyaW0oZW5kKCRjb250ZW50KSk7CiAgICAgICAgfQoKICAgICAgICAkb3V0ID0gYXJyYXkoVHlwZTo6VF9TVFJJTkcsICcnLCAkY29udGVudCk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2VyIGludGVycG9sYXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICAkb3V0CiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkbG9va1doaXRlIHNhdmUgaW5mb3JtYXRpb24gYWJvdXQgd2hpdGVzcGFjZSBiZWZvcmUgYW5kIGFmdGVyCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbnRlcnBvbGF0aW9uKCYkb3V0LCAkbG9va1doaXRlID0gdHJ1ZSkKICAgIHsKICAgICAgICAkb2xkV2hpdGUgPSAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0OwogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSB0cnVlOwoKICAgICAgICAkcyA9ICR0aGlzLT5zZWVrKCk7CgogICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnI3snKSAmJiAkdGhpcy0+dmFsdWVMaXN0KCR2YWx1ZSkgJiYgJHRoaXMtPmxpdGVyYWwoJ30nLCBmYWxzZSkpIHsKICAgICAgICAgICAgLy8gVE9ETzogZG9uJ3QgZXJyb3IgaWYgb3V0IG9mIGJvdW5kcwoKICAgICAgICAgICAgaWYgKCRsb29rV2hpdGUpIHsKICAgICAgICAgICAgICAgICRsZWZ0ID0gcHJlZ19tYXRjaCgnL1xzLycsICR0aGlzLT5idWZmZXJbJHMgLSAxXSkgPyAnICcgOiAnJzsKICAgICAgICAgICAgICAgICRyaWdodCA9IHByZWdfbWF0Y2goJy9ccy8nLCAkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudF0pID8gJyAnOiAnJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRsZWZ0ID0gJHJpZ2h0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRvdXQgPSBhcnJheShUeXBlOjpUX0lOVEVSUE9MQVRFLCAkdmFsdWUsICRsZWZ0LCAkcmlnaHQpOwogICAgICAgICAgICAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0ID0gJG9sZFdoaXRlOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5lYXRXaGl0ZURlZmF1bHQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSAkb2xkV2hpdGU7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIHByb3BlcnR5IG5hbWUgKGFzIGFuIGFycmF5IG9mIHBhcnRzIG9yIGEgc3RyaW5nKQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwcm9wZXJ0eU5hbWUoJiRvdXQpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+c2VlaygpOwogICAgICAgICRwYXJ0cyA9IGFycmF5KCk7CgogICAgICAgICRvbGRXaGl0ZSA9ICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQ7CiAgICAgICAgJHRoaXMtPmVhdFdoaXRlRGVmYXVsdCA9IGZhbHNlOwoKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+aW50ZXJwb2xhdGlvbigkaW50ZXIpKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICRpbnRlcjsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHRoaXMtPmtleXdvcmQoJHRleHQpKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICR0ZXh0OwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChjb3VudCgkcGFydHMpID09PSAwICYmICR0aGlzLT5tYXRjaCgnWzouI10nLCAkbSwgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAvLyBjc3MgaGFja3MKICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJG1bMF07CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0ID0gJG9sZFdoaXRlOwoKICAgICAgICBpZiAoY291bnQoJHBhcnRzKSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBtYXRjaCBjb21tZW50IGhhY2sKICAgICAgICBpZiAocHJlZ19tYXRjaCgKICAgICAgICAgICAgc2VsZjo6JHdoaXRlUGF0dGVybiwKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlciwKICAgICAgICAgICAgJG0sCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICR0aGlzLT5jb3VudAogICAgICAgICkpIHsKICAgICAgICAgICAgaWYgKCEgZW1wdHkoJG1bMF0pKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICRtWzBdOwogICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50ICs9IHN0cmxlbigkbVswXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7IC8vIGdldCBhbnkgZXh0cmEgd2hpdGVzcGFjZQoKICAgICAgICAkb3V0ID0gYXJyYXkoVHlwZTo6VF9TVFJJTkcsICcnLCAkcGFydHMpOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGNvbW1hIHNlcGFyYXRlZCBzZWxlY3RvciBsaXN0CiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbGVjdG9ycygmJG91dCkKICAgIHsKICAgICAgICAkcyA9ICR0aGlzLT5zZWVrKCk7CiAgICAgICAgJHNlbGVjdG9ycyA9IGFycmF5KCk7CgogICAgICAgIHdoaWxlICgkdGhpcy0+c2VsZWN0b3IoJHNlbCkpIHsKICAgICAgICAgICAgJHNlbGVjdG9yc1tdID0gJHNlbDsKCiAgICAgICAgICAgIGlmICghICR0aGlzLT5saXRlcmFsKCcsJykpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGlsZSAoJHRoaXMtPmxpdGVyYWwoJywnKSkgewogICAgICAgICAgICAgICAgOyAvLyBpZ25vcmUgZXh0cmEKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGNvdW50KCRzZWxlY3RvcnMpID09PSAwKSB7CiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRvdXQgPSAkc2VsZWN0b3JzOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIHNlbGVjdG9yIGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2VsZWN0b3IoJiRvdXQpCiAgICB7CiAgICAgICAgJHNlbGVjdG9yID0gYXJyYXkoKTsKCiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoJHRoaXMtPm1hdGNoKCdbPit+XSsnLCAkbSkpIHsKICAgICAgICAgICAgICAgICRzZWxlY3RvcltdID0gYXJyYXkoJG1bMF0pOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+c2VsZWN0b3JTaW5nbGUoJHBhcnQpKSB7CiAgICAgICAgICAgICAgICAkc2VsZWN0b3JbXSA9ICRwYXJ0OwogICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoKCdccysnLCAkbSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0aGlzLT5tYXRjaCgnXC9bXlwvXStcLycsICRtKSkgewogICAgICAgICAgICAgICAgJHNlbGVjdG9yW10gPSBhcnJheSgkbVswXSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoY291bnQoJHNlbGVjdG9yKSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkb3V0ID0gJHNlbGVjdG9yOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgdGhlIHBhcnRzIHRoYXQgbWFrZSB1cCBhIHNlbGVjdG9yCiAgICAgKgogICAgICoge0BpbnRlcm5hbAogICAgICogICAgIGRpdlt5ZXM9bm9dI3NvbWV0aGluZy5oZWxsby53b3JsZDpudGgtY2hpbGQoLTJuKzEpJXBsYWNlaG9sZGVyCiAgICAgKiB9fQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZWxlY3RvclNpbmdsZSgmJG91dCkKICAgIHsKICAgICAgICAkb2xkV2hpdGUgPSAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0OwogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSBmYWxzZTsKCiAgICAgICAgJHBhcnRzID0gYXJyYXkoKTsKCiAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCcqJywgZmFsc2UpKSB7CiAgICAgICAgICAgICRwYXJ0c1tdID0gJyonOwogICAgICAgIH0KCiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHN0b3AgZWFybHkKICAgICAgICAgICAgaWYgKCR0aGlzLT5tYXRjaCgnXHMqW3ssXScsICRtKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50LS07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHMgPSAkdGhpcy0+c2VlaygpOwoKICAgICAgICAgICAgLy8gc2VsZgogICAgICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJyYnLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gQ29tcGlsZXI6OiRzZWxmU2VsZWN0b3I7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCcuJywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICcuJzsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJ3wnLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJ3wnOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+bWF0Y2goJ1xcXFxcUycsICRtKSkgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkbVswXTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmb3Iga2V5ZnJhbWVzCiAgICAgICAgICAgIGlmICgkdGhpcy0+dW5pdCgkdW5pdCkpIHsKICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJHVuaXQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0aGlzLT5rZXl3b3JkKCRuYW1lKSkgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkbmFtZTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHRoaXMtPmludGVycG9sYXRpb24oJGludGVyKSkgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkaW50ZXI7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCclJywgZmFsc2UpICYmICR0aGlzLT5wbGFjZWhvbGRlcigkcGxhY2Vob2xkZXIpKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICclJzsKICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJHBsYWNlaG9sZGVyOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnIycsIGZhbHNlKSkgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAnIyc7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYSBwc2V1ZG8gc2VsZWN0b3IKICAgICAgICAgICAgaWYgKCR0aGlzLT5tYXRjaCgnOjo/JywgJG0pICYmICR0aGlzLT5taXhlZEtleXdvcmQoJG5hbWVQYXJ0cykpIHsKICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJG1bMF07CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJG5hbWVQYXJ0cyBhcyAkc3ViKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkc3ViOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRzcyA9ICR0aGlzLT5zZWVrKCk7CgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCcoJykgJiYKICAgICAgICAgICAgICAgICAgICAoJHRoaXMtPm9wZW5TdHJpbmcoJyknLCAkc3RyLCAnKCcpIHx8IHRydWUgKSAmJgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCcpJykKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJygnOwoKICAgICAgICAgICAgICAgICAgICBpZiAoISBlbXB0eSgkc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICRzdHI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICcpJzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHNzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgLy8gYXR0cmlidXRlIHNlbGVjdG9yCiAgICAgICAgICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCBvcGVuIHN0cmluZz8KICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCdbJywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAkYXR0clBhcnRzID0gYXJyYXkoJ1snKTsKCiAgICAgICAgICAgICAgICAvLyBrZXl3b3JkLCBzdHJpbmcsIG9wZXJhdG9yCiAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCddJywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb3VudC0tOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZ2V0IG91dCBlYXJseQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5tYXRjaCgnXHMrJywgJG0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhdHRyUGFydHNbXSA9ICcgJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnN0cmluZygkc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYXR0clBhcnRzW10gPSAkc3RyOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+a2V5d29yZCgkd29yZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGF0dHJQYXJ0c1tdID0gJHdvcmQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pbnRlcnBvbGF0aW9uKCRpbnRlciwgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhdHRyUGFydHNbXSA9ICRpbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBvcGVyYXRvciwgaGFuZGxlcyBhdHRyIG5hbWVzcGFjZSB0b28KICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPm1hdGNoKCdbfC1+XCRcKlxePV0rJywgJG0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhdHRyUGFydHNbXSA9ICRtWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnXScsIGZhbHNlKSkgewogICAgICAgICAgICAgICAgICAgICRhdHRyUGFydHNbXSA9ICddJzsKCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGF0dHJQYXJ0cyBhcyAkcGFydCkgewogICAgICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICRwYXJ0OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwogICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIGp1c3QgYnJlYWsgaGVyZT8KICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0ID0gJG9sZFdoaXRlOwoKICAgICAgICBpZiAoY291bnQoJHBhcnRzKSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkb3V0ID0gJHBhcnRzOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGEgdmFyaWFibGUKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gdmFyaWFibGUoJiRvdXQpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+c2VlaygpOwoKICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJyQnLCBmYWxzZSkgJiYgJHRoaXMtPmtleXdvcmQoJG5hbWUpKSB7CiAgICAgICAgICAgICRvdXQgPSBhcnJheShUeXBlOjpUX1ZBUklBQkxFLCAkbmFtZSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgYSBrZXl3b3JkCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgJHdvcmQKICAgICAqIEBwYXJhbSBib29sZWFuICRlYXRXaGl0ZXNwYWNlCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBrZXl3b3JkKCYkd29yZCwgJGVhdFdoaXRlc3BhY2UgPSBudWxsKQogICAgewogICAgICAgIGlmICgkdGhpcy0+bWF0Y2goCiAgICAgICAgICAgICcoKFtcd19cLVwqISJcJ118W1xcXFxdLikoW1x3XC1fIlwnXXxbXFxcXF0uKSopJywKICAgICAgICAgICAgJG0sCiAgICAgICAgICAgICRlYXRXaGl0ZXNwYWNlCiAgICAgICAgKSkgewogICAgICAgICAgICAkd29yZCA9ICRtWzFdOwoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhIHBsYWNlaG9sZGVyCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcGxhY2Vob2xkZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHBsYWNlaG9sZGVyKCYkcGxhY2Vob2xkZXIpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5tYXRjaCgnKFtcd1wtX10rfCNbe11bJF1bXHdcLV9dK1t9XSknLCAkbSkpIHsKICAgICAgICAgICAgJHBsYWNlaG9sZGVyID0gJG1bMV07CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGEgdXJsCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHVybCgmJG91dCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPm1hdGNoKCcodXJsXChccyooWyJcJ10/KShbXildKylcMlxzKlwpKScsICRtKSkgewogICAgICAgICAgICAkb3V0ID0gYXJyYXkoVHlwZTo6VF9TVFJJTkcsICcnLCBhcnJheSgndXJsKCcgLiAkbVsyXSAuICRtWzNdIC4gJG1bMl0gLiAnKScpKTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZSBhbiBlbmQgb2Ygc3RhdGVtZW50IGRlbGltaXRlcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZW5kKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJzsnKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+Y291bnQgPT09IHN0cmxlbigkdGhpcy0+YnVmZmVyKSB8fCAkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudF0gPT09ICd9JykgewogICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBlbmQgb2YgZmlsZSBvciBhIGNsb3NpbmcgYmxvY2sgbmV4dCB0aGVuIHdlIGRvbid0IG5lZWQgYSA7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogU3RyaXAgYXNzaWdubWVudCBmbGFnIGZyb20gdGhlIGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHN0cmlwQXNzaWdubWVudEZsYWcoJiR2YWx1ZSkKICAgIHsKICAgICAgICAkdG9rZW4gPSAmJHZhbHVlOwoKICAgICAgICBmb3IgKCR0b2tlbiA9ICYkdmFsdWU7ICR0b2tlblswXSA9PT0gVHlwZTo6VF9MSVNUICYmICgkcyA9IGNvdW50KCR0b2tlblsyXSkpOyAkdG9rZW4gPSAmJGxhc3ROb2RlKSB7CiAgICAgICAgICAgICRsYXN0Tm9kZSA9ICYkdG9rZW5bMl1bJHMgLSAxXTsKCiAgICAgICAgICAgIGlmICgkbGFzdE5vZGVbMF0gPT09IFR5cGU6OlRfS0VZV09SRCAmJiBpbl9hcnJheSgkbGFzdE5vZGVbMV0sIGFycmF5KCchZGVmYXVsdCcsICchZ2xvYmFsJykpKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wb3AoJHRva2VuWzJdKTsKCiAgICAgICAgICAgICAgICAkdG9rZW4gPSAkdGhpcy0+ZmxhdHRlbkxpc3QoJHRva2VuKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJGxhc3ROb2RlWzFdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBUdXJuIGxpc3Qgb2YgbGVuZ3RoIDEgaW50byB2YWx1ZSB0eXBlCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICR2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZsYXR0ZW5MaXN0KCR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlWzBdID09PSBUeXBlOjpUX0xJU1QgJiYgY291bnQoJHZhbHVlWzJdKSA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmZsYXR0ZW5MaXN0KCR2YWx1ZVsyXVswXSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqCiAgICAgKiB7QGludGVybmFsCiAgICAgKiAgICAgYWR2YW5jZSBjb3VudGVyIHRvIG5leHQgb2NjdXJyZW5jZSBvZiAkd2hhdAogICAgICogICAgICR1bnRpbCAtIGRvbid0IGluY2x1ZGUgJHdoYXQgaW4gYWR2YW5jZQogICAgICogICAgICRhbGxvd05ld2xpbmUsIGlmIHN0cmluZywgd2lsbCBiZSB1c2VkIGFzIHZhbGlkIGNoYXIgc2V0CiAgICAgKiB9fQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gdG8oJHdoYXQsICYkb3V0LCAkdW50aWwgPSBmYWxzZSwgJGFsbG93TmV3bGluZSA9IGZhbHNlKQogICAgewogICAgICAgIGlmIChpc19zdHJpbmcoJGFsbG93TmV3bGluZSkpIHsKICAgICAgICAgICAgJHZhbGlkQ2hhcnMgPSAkYWxsb3dOZXdsaW5lOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR2YWxpZENoYXJzID0gJGFsbG93TmV3bGluZSA/ICcuJyA6ICJbXlxuXSI7CiAgICAgICAgfQoKICAgICAgICBpZiAoISAkdGhpcy0+bWF0Y2goJygnIC4gJHZhbGlkQ2hhcnMgLiAnKj8pJyAuICR0aGlzLT5wcmVnUXVvdGUoJHdoYXQpLCAkbSwgISAkdW50aWwpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdW50aWwpIHsKICAgICAgICAgICAgJHRoaXMtPmNvdW50IC09IHN0cmxlbigkd2hhdCk7IC8vIGdpdmUgYmFjayAkd2hhdAogICAgICAgIH0KCiAgICAgICAgJG91dCA9ICRtWzFdOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzaG93KCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnBlZWsoIiguKj8pKFxufCQpIiwgJG0sICR0aGlzLT5jb3VudCkpIHsKICAgICAgICAgICAgcmV0dXJuICRtWzFdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICcnOwogICAgfQoKICAgIC8qKgogICAgICogUXVvdGUgcmVndWxhciBleHByZXNzaW9uCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkd2hhdAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gcHJlZ1F1b3RlKCR3aGF0KQogICAgewogICAgICAgIHJldHVybiBwcmVnX3F1b3RlKCR3aGF0LCAnLycpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Server.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocDsKCnVzZSBMZWFmb1xTY3NzUGhwXENvbXBpbGVyOwp1c2UgTGVhZm9cU2Nzc1BocFxWZXJzaW9uOwoKLyoqCiAqIFNDU1Mgc2VydmVyCiAqCiAqIEBhdXRob3IgTGVhZiBDb3Jjb3JhbiA8bGVhZm90QGdtYWlsLmNvbT4KICovCmNsYXNzIFNlcnZlcgp7CiAgICAvKioKICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICBwcml2YXRlICRzaG93RXJyb3JzQXNDU1M7CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlICRkaXI7CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlICRjYWNoZURpcjsKCiAgICAvKioKICAgICAqIEB2YXIgXExlYWZvXFNjc3NQaHBcQ29tcGlsZXIKICAgICAqLwogICAgcHJpdmF0ZSAkc2NzczsKCiAgICAvKioKICAgICAqIEpvaW4gcGF0aCBjb21wb25lbnRzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbGVmdCAgUGF0aCBjb21wb25lbnQsIGxlZnQgb2YgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IKICAgICAqIEBwYXJhbSBzdHJpbmcgJHJpZ2h0IFBhdGggY29tcG9uZW50LCByaWdodCBvZiB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvcgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBqb2luKCRsZWZ0LCAkcmlnaHQpCiAgICB7CiAgICAgICAgcmV0dXJuIHJ0cmltKCRsZWZ0LCAnL1xcJykgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gbHRyaW0oJHJpZ2h0LCAnL1xcJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgbmFtZSBvZiByZXF1ZXN0ZWQgLnNjc3MgZmlsZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nfG51bGwKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGlucHV0TmFtZSgpCiAgICB7CiAgICAgICAgc3dpdGNoICh0cnVlKSB7CiAgICAgICAgICAgIGNhc2UgaXNzZXQoJF9HRVRbJ3AnXSk6CiAgICAgICAgICAgICAgICByZXR1cm4gJF9HRVRbJ3AnXTsKICAgICAgICAgICAgY2FzZSBpc3NldCgkX1NFUlZFUlsnUEFUSF9JTkZPJ10pOgogICAgICAgICAgICAgICAgcmV0dXJuICRfU0VSVkVSWydQQVRIX0lORk8nXTsKICAgICAgICAgICAgY2FzZSBpc3NldCgkX1NFUlZFUlsnRE9DVU1FTlRfVVJJJ10pOgogICAgICAgICAgICAgICAgcmV0dXJuIHN1YnN0cigkX1NFUlZFUlsnRE9DVU1FTlRfVVJJJ10sIHN0cmxlbigkX1NFUlZFUlsnU0NSSVBUX05BTUUnXSkpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEdldCBwYXRoIHRvIHJlcXVlc3RlZCAuc2NzcyBmaWxlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZpbmRJbnB1dCgpCiAgICB7CiAgICAgICAgaWYgKCgkaW5wdXQgPSAkdGhpcy0+aW5wdXROYW1lKCkpCiAgICAgICAgICAgICYmIHN0cnBvcygkaW5wdXQsICcuLicpID09PSBmYWxzZQogICAgICAgICAgICAmJiBzdWJzdHIoJGlucHV0LCAtNSkgPT09ICcuc2NzcycKICAgICAgICApIHsKICAgICAgICAgICAgJG5hbWUgPSAkdGhpcy0+am9pbigkdGhpcy0+ZGlyLCAkaW5wdXQpOwoKICAgICAgICAgICAgaWYgKGlzX2ZpbGUoJG5hbWUpICYmIGlzX3JlYWRhYmxlKCRuYW1lKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRuYW1lOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgcGF0aCB0byBjYWNoZWQgLmNzcyBmaWxlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNhY2hlTmFtZSgkZm5hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5qb2luKCR0aGlzLT5jYWNoZURpciwgbWQ1KCRmbmFtZSkgLiAnLmNzcycpOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IHBhdGggdG8gbWV0YSBkYXRhCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1ldGFkYXRhTmFtZSgkb3V0KQogICAgewogICAgICAgIHJldHVybiAkb3V0IC4gJy5tZXRhJzsKICAgIH0KCiAgICAvKioKICAgICAqIERldGVybWluZSB3aGV0aGVyIC5zY3NzIGZpbGUgbmVlZHMgdG8gYmUgcmUtY29tcGlsZWQuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkaW4gICBJbnB1dCBwYXRoCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvdXQgIE91dHB1dCBwYXRoCiAgICAgKiBAcGFyYW0gc3RyaW5nICRldGFnIEVUYWcKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBjb21waWxlIHJlcXVpcmVkLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbmVlZHNDb21waWxlKCRpbiwgJG91dCwgJiRldGFnKQogICAgewogICAgICAgIGlmICghIGlzX2ZpbGUoJG91dCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkbXRpbWUgPSBmaWxlbXRpbWUoJG91dCk7CgogICAgICAgICRtZXRhZGF0YU5hbWUgPSAkdGhpcy0+bWV0YWRhdGFOYW1lKCRvdXQpOwoKICAgICAgICBpZiAoaXNfcmVhZGFibGUoJG1ldGFkYXRhTmFtZSkpIHsKICAgICAgICAgICAgJG1ldGFkYXRhID0gdW5zZXJpYWxpemUoZmlsZV9nZXRfY29udGVudHMoJG1ldGFkYXRhTmFtZSkpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJG1ldGFkYXRhWydpbXBvcnRzJ10gYXMgJGltcG9ydCA9PiAkb3JpZ2luYWxNdGltZSkgewogICAgICAgICAgICAgICAgJGN1cnJlbnRNdGltZSA9IGZpbGVtdGltZSgkaW1wb3J0KTsKCiAgICAgICAgICAgICAgICBpZiAoJGN1cnJlbnRNdGltZSAhPT0gJG9yaWdpbmFsTXRpbWUgfHwgJGN1cnJlbnRNdGltZSA+ICRtdGltZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkbWV0YVZhcnMgPSBjcmMzMihzZXJpYWxpemUoJHRoaXMtPnNjc3MtPmdldFZhcmlhYmxlcygpKSk7CgogICAgICAgICAgICBpZiAoJG1ldGFWYXJzICE9PSAkbWV0YWRhdGFbJ3ZhcnMnXSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRldGFnID0gJG1ldGFkYXRhWydldGFnJ107CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBJZi1Nb2RpZmllZC1TaW5jZSBoZWFkZXIgZnJvbSBjbGllbnQgcmVxdWVzdAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nfG51bGwKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldElmTW9kaWZpZWRTaW5jZUhlYWRlcigpCiAgICB7CiAgICAgICAgJG1vZGlmaWVkU2luY2UgPSBudWxsOwoKICAgICAgICBpZiAoaXNzZXQoJF9TRVJWRVJbJ0hUVFBfSUZfTU9ESUZJRURfU0lOQ0UnXSkpIHsKICAgICAgICAgICAgJG1vZGlmaWVkU2luY2UgPSAkX1NFUlZFUlsnSFRUUF9JRl9NT0RJRklFRF9TSU5DRSddOwoKICAgICAgICAgICAgaWYgKGZhbHNlICE9PSAoJHNlbWljb2xvblBvcyA9IHN0cnBvcygkbW9kaWZpZWRTaW5jZSwgJzsnKSkpIHsKICAgICAgICAgICAgICAgICRtb2RpZmllZFNpbmNlID0gc3Vic3RyKCRtb2RpZmllZFNpbmNlLCAwLCAkc2VtaWNvbG9uUG9zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtb2RpZmllZFNpbmNlOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IElmLU5vbmUtTWF0Y2ggaGVhZGVyIGZyb20gY2xpZW50IHJlcXVlc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRJZk5vbmVNYXRjaEhlYWRlcigpCiAgICB7CiAgICAgICAgJG5vbmVNYXRjaCA9IG51bGw7CgogICAgICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9JRl9OT05FX01BVENIJ10pKSB7CiAgICAgICAgICAgICRub25lTWF0Y2ggPSAkX1NFUlZFUlsnSFRUUF9JRl9OT05FX01BVENIJ107CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG5vbmVNYXRjaDsKICAgIH0KCiAgICAvKioKICAgICAqIENvbXBpbGUgLnNjc3MgZmlsZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGluICBJbnB1dCBwYXRoICguc2NzcykKICAgICAqIEBwYXJhbSBzdHJpbmcgJG91dCBPdXRwdXQgcGF0aCAoLmNzcykKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlKCRpbiwgJG91dCkKICAgIHsKICAgICAgICAkc3RhcnQgICA9IG1pY3JvdGltZSh0cnVlKTsKICAgICAgICAkY3NzICAgICA9ICR0aGlzLT5zY3NzLT5jb21waWxlKGZpbGVfZ2V0X2NvbnRlbnRzKCRpbiksICRpbik7CiAgICAgICAgJGVsYXBzZWQgPSByb3VuZCgobWljcm90aW1lKHRydWUpIC0gJHN0YXJ0KSwgNCk7CgogICAgICAgICR2ICAgID0gVmVyc2lvbjo6VkVSU0lPTjsKICAgICAgICAkdCAgICA9IEBkYXRlKCdyJyk7CiAgICAgICAgJGNzcyAgPSAiLyogY29tcGlsZWQgYnkgc2Nzc3BocCAkdiBvbiAkdCAoJHtlbGFwc2VkfXMpICovXG5cbiIgLiAkY3NzOwogICAgICAgICRldGFnID0gbWQ1KCRjc3MpOwoKICAgICAgICBmaWxlX3B1dF9jb250ZW50cygkb3V0LCAkY3NzKTsKICAgICAgICBmaWxlX3B1dF9jb250ZW50cygKICAgICAgICAgICAgJHRoaXMtPm1ldGFkYXRhTmFtZSgkb3V0KSwKICAgICAgICAgICAgc2VyaWFsaXplKGFycmF5KAogICAgICAgICAgICAgICAgJ2V0YWcnICAgID0+ICRldGFnLAogICAgICAgICAgICAgICAgJ2ltcG9ydHMnID0+ICR0aGlzLT5zY3NzLT5nZXRQYXJzZWRGaWxlcygpLAogICAgICAgICAgICAgICAgJ3ZhcnMnICAgID0+IGNyYzMyKHNlcmlhbGl6ZSgkdGhpcy0+c2Nzcy0+Z2V0VmFyaWFibGVzKCkpKSwKICAgICAgICAgICAgKSkKICAgICAgICApOwoKICAgICAgICByZXR1cm4gYXJyYXkoJGNzcywgJGV0YWcpOwogICAgfQoKICAgIC8qKgogICAgICogRm9ybWF0IGVycm9yIGFzIGEgcHNldWRvLWVsZW1lbnQgaW4gQ1NTCiAgICAgKgogICAgICogQHBhcmFtIFxFeGNlcHRpb24gJGVycm9yCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZUVycm9yQ1NTKCRlcnJvcikKICAgIHsKICAgICAgICAkbWVzc2FnZSA9IHN0cl9yZXBsYWNlKAogICAgICAgICAgICBhcnJheSgiJyIsICJcbiIpLAogICAgICAgICAgICBhcnJheSgiXFwnIiwgIlxcQSIpLAogICAgICAgICAgICAkZXJyb3ItPmdldGZpbGUoKSAuICI6XG5cbiIgLiAkZXJyb3ItPmdldE1lc3NhZ2UoKQogICAgICAgICk7CgogICAgICAgIHJldHVybiAiYm9keSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQogICAgICAgICAgICAgICAgaHRtbDphZnRlciB7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICckbWVzc2FnZSc7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogbW9ubzsKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgICAgICAgICAgICAgIH0iOwogICAgfQoKICAgIC8qKgogICAgICogUmVuZGVyIGVycm9ycyBhcyBhIHBzZXVkby1lbGVtZW50IHdpdGhpbiB2YWxpZCBDU1MsIGRpc3BsYXlpbmcgdGhlIGVycm9ycyBvbiBhbnkKICAgICAqIHBhZ2UgdGhhdCBpbmNsdWRlcyB0aGlzIENTUy4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkc2hvdwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2hvd0Vycm9yc0FzQ1NTKCRzaG93ID0gdHJ1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+c2hvd0Vycm9yc0FzQ1NTID0gJHNob3c7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIC5zY3NzIGZpbGUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRpbiAgSW5wdXQgZmlsZSAoLnNjc3MpCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvdXQgT3V0cHV0IGZpbGUgKC5jc3MpIG9wdGlvbmFsCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmd8Ym9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGlsZUZpbGUoJGluLCAkb3V0ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoISBpc19yZWFkYWJsZSgkaW4pKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcRXhjZXB0aW9uKCdsb2FkIGVycm9yOiBmYWlsZWQgdG8gZmluZCAnIC4gJGluKTsKICAgICAgICB9CgogICAgICAgICRwaSA9IHBhdGhpbmZvKCRpbik7CgogICAgICAgICR0aGlzLT5zY3NzLT5hZGRJbXBvcnRQYXRoKCRwaVsnZGlybmFtZSddIC4gJy8nKTsKCiAgICAgICAgJGNvbXBpbGVkID0gJHRoaXMtPnNjc3MtPmNvbXBpbGUoZmlsZV9nZXRfY29udGVudHMoJGluKSwgJGluKTsKCiAgICAgICAgaWYgKCRvdXQgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZpbGVfcHV0X2NvbnRlbnRzKCRvdXQsICRjb21waWxlZCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGNvbXBpbGVkOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgaWYgZmlsZSBuZWVkIGNvbXBpbGluZwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGluICBJbnB1dCBmaWxlICguc2NzcykKICAgICAqIEBwYXJhbSBzdHJpbmcgJG91dCBPdXRwdXQgZmlsZSAoLmNzcykKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNoZWNrZWRDb21waWxlKCRpbiwgJG91dCkKICAgIHsKICAgICAgICBpZiAoISBpc19maWxlKCRvdXQpIHx8IGZpbGVtdGltZSgkaW4pID4gZmlsZW10aW1lKCRvdXQpKSB7CiAgICAgICAgICAgICR0aGlzLT5jb21waWxlRmlsZSgkaW4sICRvdXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIHJlcXVlc3RlZCBzY3NzIGFuZCBzZXJ2ZSBjc3MuICBPdXRwdXRzIEhUVFAgcmVzcG9uc2UuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2FsdCBQcmVmaXggYSBzdHJpbmcgdG8gdGhlIGZpbGVuYW1lIGZvciBjcmVhdGluZyB0aGUgY2FjaGUgbmFtZSBoYXNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgkc2FsdCA9ICcnKQogICAgewogICAgICAgICRwcm90b2NvbCA9IGlzc2V0KCRfU0VSVkVSWydTRVJWRVJfUFJPVE9DT0wnXSkKICAgICAgICAgICAgPyAkX1NFUlZFUlsnU0VSVkVSX1BST1RPQ09MJ10KICAgICAgICAgICAgOiAnSFRUUC8xLjAnOwoKICAgICAgICBpZiAoJGlucHV0ID0gJHRoaXMtPmZpbmRJbnB1dCgpKSB7CiAgICAgICAgICAgICRvdXRwdXQgPSAkdGhpcy0+Y2FjaGVOYW1lKCRzYWx0IC4gJGlucHV0KTsKICAgICAgICAgICAgJGV0YWcgPSAkbm9uZU1hdGNoID0gdHJpbSgkdGhpcy0+Z2V0SWZOb25lTWF0Y2hIZWFkZXIoKSwgJyInKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bmVlZHNDb21waWxlKCRpbnB1dCwgJG91dHB1dCwgJGV0YWcpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGxpc3QoJGNzcywgJGV0YWcpID0gJHRoaXMtPmNvbXBpbGUoJGlucHV0LCAkb3V0cHV0KTsKCiAgICAgICAgICAgICAgICAgICAgJGxhc3RNb2RpZmllZCA9IGdtZGF0ZSgnRCwgZCBNIFkgSDppOnMnLCBmaWxlbXRpbWUoJG91dHB1dCkpIC4gJyBHTVQnOwoKICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0xhc3QtTW9kaWZpZWQ6ICcgLiAkbGFzdE1vZGlmaWVkKTsKICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtdHlwZTogdGV4dC9jc3MnKTsKICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0VUYWc6ICInIC4gJGV0YWcgLiAnIicpOwoKICAgICAgICAgICAgICAgICAgICBlY2hvICRjc3M7CgogICAgICAgICAgICAgICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+c2hvd0Vycm9yc0FzQ1NTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC10eXBlOiB0ZXh0L2NzcycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkdGhpcy0+Y3JlYXRlRXJyb3JDU1MoJGUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcigkcHJvdG9jb2wgLiAnIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LXR5cGU6IHRleHQvcGxhaW4nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJ1BhcnNlIGVycm9yOiAnIC4gJGUtPmdldE1lc3NhZ2UoKSAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGhlYWRlcignWC1TQ1NTLUNhY2hlOiB0cnVlJyk7CiAgICAgICAgICAgIGhlYWRlcignQ29udGVudC10eXBlOiB0ZXh0L2NzcycpOwogICAgICAgICAgICBoZWFkZXIoJ0VUYWc6ICInIC4gJGV0YWcgLiAnIicpOwoKICAgICAgICAgICAgaWYgKCRldGFnID09PSAkbm9uZU1hdGNoKSB7CiAgICAgICAgICAgICAgICBoZWFkZXIoJHByb3RvY29sIC4gJyAzMDQgTm90IE1vZGlmaWVkJyk7CgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbW9kaWZpZWRTaW5jZSA9ICR0aGlzLT5nZXRJZk1vZGlmaWVkU2luY2VIZWFkZXIoKTsKICAgICAgICAgICAgJG10aW1lID0gZmlsZW10aW1lKCRvdXRwdXQpOwoKICAgICAgICAgICAgaWYgKEBzdHJ0b3RpbWUoJG1vZGlmaWVkU2luY2UpID09PSAkbXRpbWUpIHsKICAgICAgICAgICAgICAgIGhlYWRlcigkcHJvdG9jb2wgLiAnIDMwNCBOb3QgTW9kaWZpZWQnKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRsYXN0TW9kaWZpZWQgID0gZ21kYXRlKCdELCBkIE0gWSBIOmk6cycsICRtdGltZSkgLiAnIEdNVCc7CiAgICAgICAgICAgIGhlYWRlcignTGFzdC1Nb2RpZmllZDogJyAuICRsYXN0TW9kaWZpZWQpOwoKICAgICAgICAgICAgZWNobyBmaWxlX2dldF9jb250ZW50cygkb3V0cHV0KTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGhlYWRlcigkcHJvdG9jb2wgLiAnIDQwNCBOb3QgRm91bmQnKTsKICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtdHlwZTogdGV4dC9wbGFpbicpOwoKICAgICAgICAkdiA9IFZlcnNpb246OlZFUlNJT047CiAgICAgICAgZWNobyAiLyogSU5QVVQgTk9UIEZPVU5EIHNjc3MgJHYgKi9cbiI7CiAgICB9CgogICAgLyoqCiAgICAgKiBCYXNlZCBvbiBleHBsaWNpdCBpbnB1dC9vdXRwdXQgZmlsZXMgZG9lcyBhIGZ1bGwgY2hhbmdlIGNoZWNrIG9uIGNhY2hlIGJlZm9yZSBjb21waWxpbmcuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgJGluCiAgICAgKiBAcGFyYW0gc3RyaW5nICAkb3V0CiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkZm9yY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyBDb21waWxlZCBDU1MgcmVzdWx0cwogICAgICoKICAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY2hlY2tlZENhY2hlZENvbXBpbGUoJGluLCAkb3V0LCAkZm9yY2UgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoISBpc19maWxlKCRpbikgfHwgISBpc19yZWFkYWJsZSgkaW4pKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcRXhjZXB0aW9uKCdJbnZhbGlkIG9yIHVucmVhZGFibGUgaW5wdXQgZmlsZSBzcGVjaWZpZWQuJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNfZGlyKCRvdXQpIHx8ICEgaXNfd3JpdGFibGUoZmlsZV9leGlzdHMoJG91dCkgPyAkb3V0IDogZGlybmFtZSgkb3V0KSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxFeGNlcHRpb24oJ0ludmFsaWQgb3IgdW53cml0YWJsZSBvdXRwdXQgZmlsZSBzcGVjaWZpZWQuJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGZvcmNlIHx8ICR0aGlzLT5uZWVkc0NvbXBpbGUoJGluLCAkb3V0LCAkZXRhZykpIHsKICAgICAgICAgICAgbGlzdCgkY3NzLCAkZXRhZykgPSAkdGhpcy0+Y29tcGlsZSgkaW4sICRvdXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRjc3MgPSBmaWxlX2dldF9jb250ZW50cygkb3V0KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkY3NzOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3RydWN0b3IKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAkZGlyICAgICAgUm9vdCBkaXJlY3RvcnkgdG8gLnNjc3MgZmlsZXMKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICRjYWNoZURpciBDYWNoZSBkaXJlY3RvcnkKICAgICAqIEBwYXJhbSBcTGVhZm9cU2Nzc1BocFxDb21waWxlcnxudWxsICRzY3NzICAgICBTQ1NTIGNvbXBpbGVyIGluc3RhbmNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZGlyLCAkY2FjaGVEaXIgPSBudWxsLCAkc2NzcyA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPmRpciA9ICRkaXI7CgogICAgICAgIGlmICghIGlzc2V0KCRjYWNoZURpcikpIHsKICAgICAgICAgICAgJGNhY2hlRGlyID0gJHRoaXMtPmpvaW4oJGRpciwgJ3Njc3NfY2FjaGUnKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5jYWNoZURpciA9ICRjYWNoZURpcjsKCiAgICAgICAgaWYgKCEgaXNfZGlyKCR0aGlzLT5jYWNoZURpcikpIHsKICAgICAgICAgICAgbWtkaXIoJHRoaXMtPmNhY2hlRGlyLCAwNzU1LCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIGlmICghIGlzc2V0KCRzY3NzKSkgewogICAgICAgICAgICAkc2NzcyA9IG5ldyBDb21waWxlcigpOwogICAgICAgICAgICAkc2Nzcy0+c2V0SW1wb3J0UGF0aHMoJHRoaXMtPmRpcik7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2NzcyA9ICRzY3NzOwogICAgICAgICR0aGlzLT5zaG93RXJyb3JzQXNDU1MgPSBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIEhlbHBlciBtZXRob2QgdG8gc2VydmUgY29tcGlsZWQgc2NzcwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggUm9vdCBwYXRoCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2VydmVGcm9tKCRwYXRoKQogICAgewogICAgICAgICRzZXJ2ZXIgPSBuZXcgc2VsZigkcGF0aCk7CiAgICAgICAgJHNlcnZlci0+c2VydmUoKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Type.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocDsKCi8qKgogKiBTQ1NTIGJsb2NrL25vZGUgdHlwZXMKICoKICogQGF1dGhvciBBbnRob24gUGFuZyA8YW50aG9uLnBhbmdAZ21haWwuY29tPgogKi8KY2xhc3MgVHlwZQp7CiAgICBjb25zdCBUX0FTU0lHTiA9ICdhc3NpZ24nOwogICAgY29uc3QgVF9BVF9ST09UID0gJ2F0LXJvb3QnOwogICAgY29uc3QgVF9CTE9DSyA9ICdibG9jayc7CiAgICBjb25zdCBUX0JSRUFLID0gJ2JyZWFrJzsKICAgIGNvbnN0IFRfQ0hBUlNFVCA9ICdjaGFyc2V0JzsKICAgIGNvbnN0IFRfQ09MT1IgPSAnY29sb3InOwogICAgY29uc3QgVF9DT01NRU5UID0gJ2NvbW1lbnQnOwogICAgY29uc3QgVF9DT05USU5VRSA9ICdjb250aW51ZSc7CiAgICBjb25zdCBUX0NPTlRST0wgPSAnY29udHJvbCc7CiAgICBjb25zdCBUX0RFQlVHID0gJ2RlYnVnJzsKICAgIGNvbnN0IFRfRElSRUNUSVZFID0gJ2RpcmVjdGl2ZSc7CiAgICBjb25zdCBUX0VBQ0ggPSAnZWFjaCc7CiAgICBjb25zdCBUX0VMU0UgPSAnZWxzZSc7CiAgICBjb25zdCBUX0VMU0VJRiA9ICdlbHNlaWYnOwogICAgY29uc3QgVF9FUlJPUiA9ICdlcnJvcic7CiAgICBjb25zdCBUX0VYUFJFU1NJT04gPSAnZXhwJzsKICAgIGNvbnN0IFRfRVhURU5EID0gJ2V4dGVuZCc7CiAgICBjb25zdCBUX0ZPUiA9ICdmb3InOwogICAgY29uc3QgVF9GVU5DVElPTiA9ICdmdW5jdGlvbic7CiAgICBjb25zdCBUX0ZVTkNUSU9OX0NBTEwgPSAnZm5jYWxsJzsKICAgIGNvbnN0IFRfSFNMID0gJ2hzbCc7CiAgICBjb25zdCBUX0lGID0gJ2lmJzsKICAgIGNvbnN0IFRfSU1QT1JUID0gJ2ltcG9ydCc7CiAgICBjb25zdCBUX0lOQ0xVREUgPSAnaW5jbHVkZSc7CiAgICBjb25zdCBUX0lOVEVSUE9MQVRFID0gJ2ludGVycG9sYXRlJzsKICAgIGNvbnN0IFRfSU5URVJQT0xBVEVEID0gJ2ludGVycG9sYXRlZCc7CiAgICBjb25zdCBUX0tFWVdPUkQgPSAna2V5d29yZCc7CiAgICBjb25zdCBUX0xJU1QgPSAnbGlzdCc7CiAgICBjb25zdCBUX01BUCA9ICdtYXAnOwogICAgY29uc3QgVF9NRURJQSA9ICdtZWRpYSc7CiAgICBjb25zdCBUX01FRElBX0VYUFJFU1NJT04gPSAnbWVkaWFFeHAnOwogICAgY29uc3QgVF9NRURJQV9UWVBFID0gJ21lZGlhVHlwZSc7CiAgICBjb25zdCBUX01FRElBX1ZBTFVFID0gJ21lZGlhVmFsdWUnOwogICAgY29uc3QgVF9NSVhJTiA9ICdtaXhpbic7CiAgICBjb25zdCBUX01JWElOX0NPTlRFTlQgPSAnbWl4aW5fY29udGVudCc7CiAgICBjb25zdCBUX05FU1RFRF9QUk9QRVJUWSA9ICduZXN0ZWRwcm9wJzsKICAgIGNvbnN0IFRfTk9UID0gJ25vdCc7CiAgICBjb25zdCBUX05VTEwgPSAnbnVsbCc7CiAgICBjb25zdCBUX05VTUJFUiA9ICdudW1iZXInOwogICAgY29uc3QgVF9SRVRVUk4gPSAncmV0dXJuJzsKICAgIGNvbnN0IFRfUk9PVCA9ICdyb290JzsKICAgIGNvbnN0IFRfU0NTU1BIUF9JTVBPUlRfT05DRSA9ICdzY3NzcGhwLWltcG9ydC1vbmNlJzsKICAgIGNvbnN0IFRfU0VMRiA9ICdzZWxmJzsKICAgIGNvbnN0IFRfU1RSSU5HID0gJ3N0cmluZyc7CiAgICBjb25zdCBUX1VOQVJZID0gJ3VuYXJ5JzsKICAgIGNvbnN0IFRfVkFSSUFCTEUgPSAndmFyJzsKICAgIGNvbnN0IFRfV0FSTiA9ICd3YXJuJzsKICAgIGNvbnN0IFRfV0hJTEUgPSAnd2hpbGUnOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Util.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocDsKCnVzZSBMZWFmb1xTY3NzUGhwXEJhc2VcUmFuZ2U7CgovKioKICogU0NTUyB1dGlsdGllcwogKgogKiBAYXV0aG9yIEFudGhvbiBQYW5nIDxhbnRob24ucGFuZ0BnbWFpbC5jb20+CiAqLwpjbGFzcyBVdGlsCnsKICAgIC8qKgogICAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgZmFsbHMgd2l0aGluIGByYW5nZWAgKGluY2x1c2l2ZSksIGxlYXZpbmcKICAgICAqIHJvb20gZm9yIHNsaWdodCBmbG9hdGluZy1wb2ludCBlcnJvcnMuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgVGhlIG5hbWUgb2YgdGhlIHZhbHVlLiBVc2VkIGluIHRoZSBlcnJvciBtZXNzYWdlLgogICAgICogQHBhcmFtIFJhbmdlICAkcmFuZ2UgUmFuZ2Ugb2YgdmFsdWVzLgogICAgICogQHBhcmFtIGFycmF5ICAkdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHBhcmFtIHN0cmluZyAkdW5pdCAgVGhlIHVuaXQgb2YgdGhlIHZhbHVlLiBVc2VkIGluIGVycm9yIHJlcG9ydGluZy4KICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkIGB2YWx1ZWAgYWRqdXN0ZWQgdG8gZmFsbCB3aXRoaW4gcmFuZ2UsIGlmIGl0IHdhcyBvdXRzaWRlIGJ5IGEgZmxvYXRpbmctcG9pbnQgbWFyZ2luLgogICAgICoKICAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrUmFuZ2UoJG5hbWUsIFJhbmdlICRyYW5nZSwgJHZhbHVlLCAkdW5pdCA9ICcnKQogICAgewogICAgICAgICR2YWwgPSAkdmFsdWVbMV07CiAgICAgICAgJGdyYWNlID0gbmV3IFJhbmdlKC0wLjAwMDAxLCAwLjAwMDAxKTsKCiAgICAgICAgaWYgKCRyYW5nZS0+aW5jbHVkZXMoJHZhbCkpIHsKICAgICAgICAgICAgcmV0dXJuICR2YWw7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGdyYWNlLT5pbmNsdWRlcygkdmFsIC0gJHJhbmdlLT5maXJzdCkpIHsKICAgICAgICAgICAgcmV0dXJuICRyYW5nZS0+Zmlyc3Q7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGdyYWNlLT5pbmNsdWRlcygkdmFsIC0gJHJhbmdlLT5sYXN0KSkgewogICAgICAgICAgICByZXR1cm4gJHJhbmdlLT5sYXN0OwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFxFeGNlcHRpb24oIiRuYW1lIHskdmFsfSBtdXN0IGJlIGJldHdlZW4geyRyYW5nZS0+Zmlyc3R9IGFuZCB7JHJhbmdlLT5sYXN0fSR1bml0Iik7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp_leafo/src/Version.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNDU1NQSFAKICoKICogQGNvcHlyaWdodCAyMDEyLTIwMTUgTGVhZiBDb3Jjb3JhbgogKgogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVAogKgogKiBAbGluayBodHRwOi8vbGVhZm8uZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgTGVhZm9cU2Nzc1BocDsKCi8qKgogKiBTQ1NTUEhQIHZlcnNpb24KICoKICogQGF1dGhvciBMZWFmIENvcmNvcmFuIDxsZWFmb3RAZ21haWwuY29tPgogKi8KY2xhc3MgVmVyc2lvbgp7CiAgICBjb25zdCBWRVJTSU9OID0gJ3YwLjUuMSc7Cn0K]]></data>
	</file>
	<file>
	  <filename>/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/js/jquery.tablednd.0.8.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCQpe3ZhciBoYXNUb3VjaD0ib250b3VjaHN0YXJ0IiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsc3RhcnRFdmVudD1oYXNUb3VjaD8idG91Y2hzdGFydCI6Im1vdXNlZG93biIsbW92ZUV2ZW50PWhhc1RvdWNoPyJ0b3VjaG1vdmUiOiJtb3VzZW1vdmUiLGVuZEV2ZW50PWhhc1RvdWNoPyJ0b3VjaGVuZCI6Im1vdXNldXAiO2lmKGhhc1RvdWNoKXskLmVhY2goInRvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGksbmFtZSl7alF1ZXJ5LmV2ZW50LmZpeEhvb2tzW25hbWVdPWpRdWVyeS5ldmVudC5tb3VzZUhvb2tzfSl9alF1ZXJ5LnRhYmxlRG5EPXtjdXJyZW50VGFibGU6bnVsbCxkcmFnT2JqZWN0Om51bGwsbW91c2VPZmZzZXQ6bnVsbCxvbGRZOjAsYnVpbGQ6ZnVuY3Rpb24ob3B0aW9ucyl7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy50YWJsZURuRENvbmZpZz1qUXVlcnkuZXh0ZW5kKHtvbkRyYWdTdHlsZTpudWxsLG9uRHJvcFN0eWxlOm51bGwsb25EcmFnQ2xhc3M6InREbkRfd2hpbGVEcmFnIixvbkRyb3A6bnVsbCxvbkRyYWdTdGFydDpudWxsLHNjcm9sbEFtb3VudDo1LHNlcmlhbGl6ZVJlZ2V4cDovW15cLV0qJC8sc2VyaWFsaXplUGFyYW1OYW1lOm51bGwsZHJhZ0hhbmRsZTpudWxsfSxvcHRpb25zfHx7fSk7alF1ZXJ5LnRhYmxlRG5ELm1ha2VEcmFnZ2FibGUodGhpcyl9KTtyZXR1cm4gdGhpc30sbWFrZURyYWdnYWJsZTpmdW5jdGlvbih0YWJsZSl7dmFyIGNvbmZpZz10YWJsZS50YWJsZURuRENvbmZpZztpZihjb25maWcuZHJhZ0hhbmRsZSl7dmFyIGNlbGxzPWpRdWVyeSh0YWJsZS50YWJsZURuRENvbmZpZy5kcmFnSGFuZGxlLHRhYmxlKTtjZWxscy5lYWNoKGZ1bmN0aW9uKCl7alF1ZXJ5KHRoaXMpLmJpbmQoc3RhcnRFdmVudCxmdW5jdGlvbihldil7alF1ZXJ5LnRhYmxlRG5ELmluaXRpYWxpc2VEcmFnKGpRdWVyeSh0aGlzKS5wYXJlbnRzKCJ0ciIpWzBdLHRhYmxlLHRoaXMsZXYsY29uZmlnKTtyZXR1cm4gZmFsc2V9KX0pfWVsc2V7dmFyIHJvd3M9alF1ZXJ5KCJ0ciIsdGFibGUpO3Jvd3MuZWFjaChmdW5jdGlvbigpe3ZhciByb3c9alF1ZXJ5KHRoaXMpO2lmKCFyb3cuaGFzQ2xhc3MoIm5vZHJhZyIpKXtyb3cuYmluZChzdGFydEV2ZW50LGZ1bmN0aW9uKGV2KXtpZihldi50YXJnZXQudGFnTmFtZT09IlREIil7alF1ZXJ5LnRhYmxlRG5ELmluaXRpYWxpc2VEcmFnKHRoaXMsdGFibGUsdGhpcyxldixjb25maWcpO3JldHVybiBmYWxzZX19KS5jc3MoImN1cnNvciIsIm1vdmUiKX19KX19LGluaXRpYWxpc2VEcmFnOmZ1bmN0aW9uKGRyYWdPYmplY3QsdGFibGUsdGFyZ2V0LGV2bnQsY29uZmlnKXtqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdD1kcmFnT2JqZWN0O2pRdWVyeS50YWJsZURuRC5jdXJyZW50VGFibGU9dGFibGU7alF1ZXJ5LnRhYmxlRG5ELm1vdXNlT2Zmc2V0PWpRdWVyeS50YWJsZURuRC5nZXRNb3VzZU9mZnNldCh0YXJnZXQsZXZudCk7alF1ZXJ5LnRhYmxlRG5ELm9yaWdpbmFsT3JkZXI9alF1ZXJ5LnRhYmxlRG5ELnNlcmlhbGl6ZSgpO2pRdWVyeShkb2N1bWVudCkuYmluZChtb3ZlRXZlbnQsalF1ZXJ5LnRhYmxlRG5ELm1vdXNlbW92ZSkuYmluZChlbmRFdmVudCxqUXVlcnkudGFibGVEbkQubW91c2V1cCk7aWYoY29uZmlnLm9uRHJhZ1N0YXJ0KXtjb25maWcub25EcmFnU3RhcnQodGFibGUsdGFyZ2V0KX19LHVwZGF0ZVRhYmxlczpmdW5jdGlvbigpe3RoaXMuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMudGFibGVEbkRDb25maWcpe2pRdWVyeS50YWJsZURuRC5tYWtlRHJhZ2dhYmxlKHRoaXMpfX0pfSxtb3VzZUNvb3JkczpmdW5jdGlvbihldil7aWYoZXYucGFnZVh8fGV2LnBhZ2VZKXtyZXR1cm57eDpldi5wYWdlWCx5OmV2LnBhZ2VZfX1yZXR1cm57eDpldi5jbGllbnRYK2RvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdC1kb2N1bWVudC5ib2R5LmNsaWVudExlZnQseTpldi5jbGllbnRZK2RvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLWRvY3VtZW50LmJvZHkuY2xpZW50VG9wfX0sZ2V0TW91c2VPZmZzZXQ6ZnVuY3Rpb24odGFyZ2V0LGV2KXtldj1ldnx8d2luZG93LmV2ZW50O3ZhciBkb2NQb3M9dGhpcy5nZXRQb3NpdGlvbih0YXJnZXQpO3ZhciBtb3VzZVBvcz10aGlzLm1vdXNlQ29vcmRzKGV2KTtyZXR1cm57eDptb3VzZVBvcy54LWRvY1Bvcy54LHk6bW91c2VQb3MueS1kb2NQb3MueX19LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3ZhciBsZWZ0PTA7dmFyIHRvcD0wO2lmKGUub2Zmc2V0SGVpZ2h0PT0wKXtlPWUuZmlyc3RDaGlsZH13aGlsZShlLm9mZnNldFBhcmVudCl7bGVmdCs9ZS5vZmZzZXRMZWZ0O3RvcCs9ZS5vZmZzZXRUb3A7ZT1lLm9mZnNldFBhcmVudH1sZWZ0Kz1lLm9mZnNldExlZnQ7dG9wKz1lLm9mZnNldFRvcDtyZXR1cm57eDpsZWZ0LHk6dG9wfX0sbW91c2Vtb3ZlOmZ1bmN0aW9uKGV2KXtpZihqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdD09bnVsbCl7cmV0dXJufWlmKGV2LnR5cGU9PSJ0b3VjaG1vdmUiKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpfXZhciBkcmFnT2JqPWpRdWVyeShqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCk7dmFyIGNvbmZpZz1qUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlLnRhYmxlRG5EQ29uZmlnO3ZhciBtb3VzZVBvcz1qUXVlcnkudGFibGVEbkQubW91c2VDb29yZHMoZXYpO3ZhciB5PW1vdXNlUG9zLnktalF1ZXJ5LnRhYmxlRG5ELm1vdXNlT2Zmc2V0Lnk7dmFyIHlPZmZzZXQ9d2luZG93LnBhZ2VZT2Zmc2V0O2lmKGRvY3VtZW50LmFsbCl7aWYodHlwZW9mIGRvY3VtZW50LmNvbXBhdE1vZGUhPSJ1bmRlZmluZWQiJiZkb2N1bWVudC5jb21wYXRNb2RlIT0iQmFja0NvbXBhdCIpe3lPZmZzZXQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcH1lbHNle2lmKHR5cGVvZiBkb2N1bWVudC5ib2R5IT0idW5kZWZpbmVkIil7eU9mZnNldD1kb2N1bWVudC5ib2R5LnNjcm9sbFRvcH19fWlmKG1vdXNlUG9zLnkteU9mZnNldDxjb25maWcuc2Nyb2xsQW1vdW50KXt3aW5kb3cuc2Nyb2xsQnkoMCwtY29uZmlnLnNjcm9sbEFtb3VudCl9ZWxzZXt2YXIgd2luZG93SGVpZ2h0PXdpbmRvdy5pbm5lckhlaWdodD93aW5kb3cuaW5uZXJIZWlnaHQ6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodD9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O2lmKHdpbmRvd0hlaWdodC0obW91c2VQb3MueS15T2Zmc2V0KTxjb25maWcuc2Nyb2xsQW1vdW50KXt3aW5kb3cuc2Nyb2xsQnkoMCxjb25maWcuc2Nyb2xsQW1vdW50KX19aWYoeSE9alF1ZXJ5LnRhYmxlRG5ELm9sZFkpe3ZhciBtb3ZpbmdEb3duPXk+alF1ZXJ5LnRhYmxlRG5ELm9sZFk7alF1ZXJ5LnRhYmxlRG5ELm9sZFk9eTtpZihjb25maWcub25EcmFnQ2xhc3Mpe2RyYWdPYmouYWRkQ2xhc3MoY29uZmlnLm9uRHJhZ0NsYXNzKX1lbHNle2RyYWdPYmouY3NzKGNvbmZpZy5vbkRyYWdTdHlsZSl9dmFyIGN1cnJlbnRSb3c9alF1ZXJ5LnRhYmxlRG5ELmZpbmREcm9wVGFyZ2V0Um93KGRyYWdPYmoseSk7aWYoY3VycmVudFJvdyl7aWYobW92aW5nRG93biYmalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QhPWN1cnJlbnRSb3cpe2pRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0LGN1cnJlbnRSb3cubmV4dFNpYmxpbmcpfWVsc2V7aWYoIW1vdmluZ0Rvd24mJmpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0IT1jdXJyZW50Um93KXtqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCxjdXJyZW50Um93KX19fX1yZXR1cm4gZmFsc2V9LGZpbmREcm9wVGFyZ2V0Um93OmZ1bmN0aW9uKGRyYWdnZWRSb3cseSl7dmFyIHJvd3M9alF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZS5yb3dzO2Zvcih2YXIgaT0wO2k8cm93cy5sZW5ndGg7aSsrKXt2YXIgcm93PXJvd3NbaV07dmFyIHJvd1k9dGhpcy5nZXRQb3NpdGlvbihyb3cpLnk7dmFyIHJvd0hlaWdodD1wYXJzZUludChyb3cub2Zmc2V0SGVpZ2h0KS8yO2lmKHJvdy5vZmZzZXRIZWlnaHQ9PTApe3Jvd1k9dGhpcy5nZXRQb3NpdGlvbihyb3cuZmlyc3RDaGlsZCkueTtyb3dIZWlnaHQ9cGFyc2VJbnQocm93LmZpcnN0Q2hpbGQub2Zmc2V0SGVpZ2h0KS8yfWlmKCh5PnJvd1ktcm93SGVpZ2h0KSYmKHk8KHJvd1krcm93SGVpZ2h0KSkpe2lmKHJvdz09ZHJhZ2dlZFJvdyl7cmV0dXJuIG51bGx9dmFyIGNvbmZpZz1qUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlLnRhYmxlRG5EQ29uZmlnO2lmKGNvbmZpZy5vbkFsbG93RHJvcCl7aWYoY29uZmlnLm9uQWxsb3dEcm9wKGRyYWdnZWRSb3cscm93KSl7cmV0dXJuIHJvd31lbHNle3JldHVybiBudWxsfX1lbHNle3ZhciBub2Ryb3A9alF1ZXJ5KHJvdykuaGFzQ2xhc3MoIm5vZHJvcCIpO2lmKCFub2Ryb3Ape3JldHVybiByb3d9ZWxzZXtyZXR1cm4gbnVsbH19cmV0dXJuIHJvd319cmV0dXJuIG51bGx9LG1vdXNldXA6ZnVuY3Rpb24oZSl7aWYoalF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZSYmalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3Qpe2pRdWVyeShkb2N1bWVudCkudW5iaW5kKG1vdmVFdmVudCxqUXVlcnkudGFibGVEbkQubW91c2Vtb3ZlKS51bmJpbmQoZW5kRXZlbnQsalF1ZXJ5LnRhYmxlRG5ELm1vdXNldXApO3ZhciBkcm9wcGVkUm93PWpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0O3ZhciBjb25maWc9alF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZS50YWJsZURuRENvbmZpZztpZihjb25maWcub25EcmFnQ2xhc3Mpe2pRdWVyeShkcm9wcGVkUm93KS5yZW1vdmVDbGFzcyhjb25maWcub25EcmFnQ2xhc3MpfWVsc2V7alF1ZXJ5KGRyb3BwZWRSb3cpLmNzcyhjb25maWcub25Ecm9wU3R5bGUpfWpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0PW51bGw7dmFyIG5ld09yZGVyPWpRdWVyeS50YWJsZURuRC5zZXJpYWxpemUoKTtpZihjb25maWcub25Ecm9wJiYoalF1ZXJ5LnRhYmxlRG5ELm9yaWdpbmFsT3JkZXIhPW5ld09yZGVyKSl7Y29uZmlnLm9uRHJvcChqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlLGRyb3BwZWRSb3cpfWpRdWVyeS50YWJsZURuRC5jdXJyZW50VGFibGU9bnVsbH19LGpzb25pemU6ZnVuY3Rpb24oKXtpZihqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlKXtyZXR1cm4galF1ZXJ5LnRhYmxlRG5ELmpzb25pemVUYWJsZShqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlKX1lbHNle3JldHVybiJFcnJvcjogTm8gVGFibGUgaWQgc2V0LCB5b3UgbmVlZCB0byBzZXQgYW4gaWQgb24geW91ciB0YWJsZSBhbmQgZXZlcnkgcm93In19LGpzb25pemVUYWJsZTpmdW5jdGlvbih0YWJsZSl7dmFyIHJlc3VsdD0ieyI7dmFyIHRhYmxlSWQ9dGFibGUuaWQ7dmFyIHJvd3M9dGFibGUucm93cztyZXN1bHQrPSciJyt0YWJsZUlkKyciIDogWyc7Zm9yKHZhciBpPTA7aTxyb3dzLmxlbmd0aDtpKyspe3ZhciByb3dJZD1yb3dzW2ldLmlkO2lmKHJvd0lkJiZyb3dJZCYmdGFibGUudGFibGVEbkRDb25maWcmJnRhYmxlLnRhYmxlRG5EQ29uZmlnLnNlcmlhbGl6ZVJlZ2V4cCl7cm93SWQ9cm93SWQubWF0Y2godGFibGUudGFibGVEbkRDb25maWcuc2VyaWFsaXplUmVnZXhwKVswXX1yZXN1bHQrPSciJytyb3dJZCsnIic7aWYoaTxyb3dzLmxlbmd0aC0xKXtyZXN1bHQrPSIsIn19cmVzdWx0Kz0iXX0iO3JldHVybiByZXN1bHR9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe2lmKGpRdWVyeS50YWJsZURuRC5jdXJyZW50VGFibGUpe3JldHVybiBqUXVlcnkudGFibGVEbkQuc2VyaWFsaXplVGFibGUoalF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZSl9ZWxzZXtyZXR1cm4iRXJyb3I6IE5vIFRhYmxlIGlkIHNldCwgeW91IG5lZWQgdG8gc2V0IGFuIGlkIG9uIHlvdXIgdGFibGUgYW5kIGV2ZXJ5IHJvdyJ9fSxzZXJpYWxpemVUYWJsZTpmdW5jdGlvbih0YWJsZSl7dmFyIHJlc3VsdD0iIjt2YXIgcGFyYW1OYW1lPXRhYmxlLnRhYmxlRG5EQ29uZmlnLnNlcmlhbGl6ZVBhcmFtTmFtZXx8dGFibGUuaWQ7dmFyIHJvd3M9dGFibGUucm93cztmb3IodmFyIGk9MDtpPHJvd3MubGVuZ3RoO2krKyl7aWYocmVzdWx0Lmxlbmd0aD4wKXtyZXN1bHQrPSImIn12YXIgcm93SWQ9cm93c1tpXS5pZDtpZihyb3dJZCYmdGFibGUudGFibGVEbkRDb25maWcmJnRhYmxlLnRhYmxlRG5EQ29uZmlnLnNlcmlhbGl6ZVJlZ2V4cCl7cm93SWQ9cm93SWQubWF0Y2godGFibGUudGFibGVEbkRDb25maWcuc2VyaWFsaXplUmVnZXhwKVswXX1yZXN1bHQrPXBhcmFtTmFtZSsiW109Iityb3dJZH1yZXR1cm4gcmVzdWx0fSxzZXJpYWxpemVUYWJsZXM6ZnVuY3Rpb24oKXt2YXIgcmVzdWx0PSIiO3RoaXMuZWFjaChmdW5jdGlvbigpe3Jlc3VsdCs9alF1ZXJ5LnRhYmxlRG5ELnNlcmlhbGl6ZVRhYmxlKHRoaXMpfSk7cmV0dXJuIHJlc3VsdH19O2pRdWVyeS5mbi5leHRlbmQoe3RhYmxlRG5EOmpRdWVyeS50YWJsZURuRC5idWlsZCx0YWJsZURuRFVwZGF0ZTpqUXVlcnkudGFibGVEbkQudXBkYXRlVGFibGVzLHRhYmxlRG5EU2VyaWFsaXplOmpRdWVyeS50YWJsZURuRC5zZXJpYWxpemVUYWJsZXN9KX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICJFeGFDU1MiOw0KJGxhbmdbJ2FkbWluZGVzY3JpcHRpb24nXSA9ICJUaGlzIG1vZHVsZSBhbGxvd3MgeW91IHRvIGVkaXQgQ1NTIHdpdGggdGhlIENTUyBwcmVwcm9jZXNzb3Igb2YgeW91ciBjaG9pY2UuIjsNCiRsYW5nWydhc2tfdW5pbnN0YWxsJ10gPSAiQXJlIHlvdSBzdXJlIHdhbnQgdG8gdW5pbnN0YWxsIEV4YUNTUyA/IjsNCg0KJGxhbmdbJ2Rhc2hib2FyZF90YWJfaGVhZGVyJ10gPSAiRGFzaGJvYXJkIjsNCg0KJGxhbmdbJ3NldHRpbmdfdGFiX2hlYWRlciddID0gIlNldHRpbmdzIjsNCg0KJGxhbmdbJ3NldHRpbmdfdGFiX2RvbmF0aW9uJ10gPSAiRG9uYXRpb24iOw0KJGxhbmdbJ2RvbmF0aW9uX2ludHJvZHVjdGlvbiddID0gIlRoaXMgbW9kdWxlIGlzIGRpc3RyaWJ1dGVkIGZvciBmcmVlIGFuZA0KICAgIGNvbnRpbnVlIHRvIGJlLjxici8+SG93ZXZlciwgaWYgeW91IHdhbnQgdG8gbWFrZSBhIGRvbmF0aW9uIG9mIGFueSBhbW91bnQNCiAgICBvZiB5b3VyIGNob2ljZSBiZWNhdXNlIHlvdSBmZWVsIHRoYXQgdGhpcyBtb2R1bGUgbWVyaXQsIEknbGwgbGV0IHlvdSBkbw0KICAgIDotKSI7DQogICAgDQokbGFuZ1snbm9fcmVzdWx0X2Zvcl90aGlzX2lkJ10gPSAiTm8gcmVzdWx0cyBmb3IgdGhpcyBJRCEiOw0KJGxhbmdbJ3ByZXByb2Nlc3Nvcl9lcnJvciddID0gIlByZXByb2Nlc3NvciBSdW50aW1lIEVycm9yISI7DQokbGFuZ1sncHJlcHJvY2Vzc29yJ10gPSAiUHJlcHJvY2Vzc29yIjsNCiRsYW5nWydmaWxlX3RvX2ltcG9ydCddID0gIkZpbGUgdG8gaW1wb3J0IjsNCg0KJGxhbmdbJ2l0ZW1fbGlzdF9lbXB0eSddID0gIk5vIGl0ZW0iOw0KJGxhbmdbJ3ByZXByb2Nlc3Nvcl9jaGFuZ2VkJ10gPSAiUHJlcHJvY2Vzc29yIGNoYW5nZWQiOw0KDQokbGFuZ1snYWRkJ10gPSAiQWRkIjsNCiRsYW5nWydpdGVtX2FkZCddID0gIkFkZCBhbiBpdGVtIjsNCiRsYW5nWydpdGVtX2FkZGVkJ10gPSAiSXRlbSBhZGRlZCI7DQokbGFuZ1snaXRlbV9lZGl0ZWQnXSA9ICJJdGVtIGVkaXRlZCI7DQokbGFuZ1snaXRlbV9kZWxldGVkJ10gPSAiSXRlbSBkZWxldGVkIjsNCiRsYW5nWydpdGVtX3NvcnRfZWRpdGVkJ10gPSAiT3JkZXIgbW9kaWZpZWQiOw0KJGxhbmdbJ2VkaXQnXSA9ICJFZGl0IjsNCiRsYW5nWyduYW1lJ10gPSAiTmFtZSI7DQokbGFuZ1snY29udGVudCddID0gIkNvbnRlbnQiOw0KJGxhbmdbJ2RhdGVfY3JlYXRpb24nXSA9ICJDcmVhdGlvbiI7DQokbGFuZ1snZGF0ZV9tb2RpZmljYXRpb24nXSA9ICJNb2RpZmljYXRpb24iOw0KJGxhbmdbJ3N0YXR1cyddID0gIlN0YXR1cyI7DQokbGFuZ1snc3RhdHVzX2NoYW5nZSddID0gIkNoYW5nZSBzdGF0dXMiOw0KJGxhbmdbJ2V4cG9ydCddID0gIkV4cG9ydCI7DQokbGFuZ1snZGVsZXRlJ10gPSAiRGVsZXRlIjsNCiRsYW5nWydzb3J0X3NhdmUnXSA9ICJDaGFuZ2Ugb3JkZXIiOw0KDQokbGFuZ1snc2F2ZSddID0gIlNhdmUiOw0KJGxhbmdbJ2FwcGx5J10gPSAiQXBwbHkiOw0KJGxhbmdbJ2NhbmNlbCddID0gIkNhbmNlbCI7DQokbGFuZ1snaW1wb3J0J10gPSAiSW1wb3J0IjsNCg0KJGxhbmdbJ2l0ZW1fZGVsZXRlX2NvbmZpcm0nXSA9ICJBcmUgeW91IHN1cmUgKGUpIHdhbnQgdG8gZGVsZXRlIHRoaXMgaXRlbT8iOw0KDQokbGFuZ1snZXJyb3JfZmlsZV90cmFuc2ZlciddID0gIkVycm9yIHRyYW5zZmVycmluZyBmaWxlIjsNCiRsYW5nWydlcnJvcl9kYXRlX21vZGlmaWNhdGlvbl9zZWFyY2gnXSA9ICJFcnJvciBpbiBzZWFyY2ggb2YgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUhIjsNCiRsYW5nWydlcnJvcl9maWxlX25vdF94bWwnXSA9ICJUaGUgZmlsZSBpcyBub3QgaW4gWE1MIGZvcm1hdCEiOw0KJGxhbmdbJ2Vycm9yX2ZpbGVfbm90X2V4YWNzc194bWwnXSA9ICJUaGUgZmlsZSBpcyBub3QgYW4gWE1MIGZpbGUgZXhwb3J0ZWQgYnkgRXhhQ1NTISI7DQokbGFuZ1snZXJyb3JfZHVyaW5nX2ltcG9ydGF0aW9uJ10gPSAiRXJyb3Igd2hpbGUgaW1wb3J0aW5nISI7DQoNCiRsYW5nWydpbXBvcnRfc3VjY2VzcyddID0gIkltcG9ydGF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhIjsNCg0KJGxhbmdbJ2V4YWV4dGVybmFsaXplciddID0gIkV4YUV4dGVybmFsaXplciI7DQokbGFuZ1snZXhhZXh0ZXJuYWxpemVyX25vdF9hdmFpbGFibGUnXSA9ICJFeGFFeHRlcm5hbGl6ZXIgbm90IGF2YWlsYWJsZSEiOw0KJGxhbmdbJ2V4YWV4dGVybmFsaXplcl9jb21wYXRpYmlsaXR5J10gPSAiQ29tcGF0aWJpbGl0eSB3aXRoIEV4YUV4dGVybmFsaXplciI7DQokbGFuZ1snc2V0dGluZ19zYXZlZCddID0gIlNldHRpbmcgc2F2ZWQiOw0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICJFeGFDU1MiOw0KJGxhbmdbJ2FkbWluZGVzY3JpcHRpb24nXSA9ICJDZSBtb2R1bGUgcGVybWV0IGQnw6lkaXRlciBsZSBDU1MgYXZlYyB1biBwcsOpcHJvY2Vzc2V1ciBhdSBjaG9peC4iOw0KJGxhbmdbJ2Fza191bmluc3RhbGwnXSA9ICLDinRlcy12b3VzIGNlcnRhaW4oZSkgZGUgdm91bG9pciBkw6lzaW5zdGFsbGVyIGxlIG1vZHVsZSBFeGFDU1MgPyI7DQoNCiRsYW5nWydkYXNoYm9hcmRfdGFiX2hlYWRlciddID0gIlRhYmxlYXUgZGUgYm9yZCI7DQoNCiRsYW5nWydzZXR0aW5nX3RhYl9oZWFkZXInXSA9ICJQYXJhbcOodHJlcyI7DQoNCiRsYW5nWydzZXR0aW5nX3RhYl9kb25hdGlvbiddID0gIkRvbiI7DQokbGFuZ1snZG9uYXRpb25faW50cm9kdWN0aW9uJ10gPSAiQ2UgbW9kdWxlIGVzdCBkaXN0cmlidcOpIGdyYXR1aXRlbWVudCBldA0KICAgIGNvbnRpbmVyYSDDoCBsJ8OqdHJlLjxici8+Q2VwZW5kYW50LCBzaSB2b3VzIHNvdWhhaXRleiBlZmZlY3R1ZXIgdW4gZG9uIGR1DQogICAgbW9udGFudCBkZSB2b3RyZSBjaG9peCBwYXJjZSBxdWUgdm91cyBlc3RpbWV6IHF1ZSBjZSBtb2R1bGUgbGUgbcOpcml0ZSwgamUNCiAgICB2b3VzIGxhaXNzZSBmYWlyZSA6LSkiOw0KICAgIA0KJGxhbmdbJ25vX3Jlc3VsdF9mb3JfdGhpc19pZCddID0gIkF1Y3VuIHLDqXN1bHRhdCBwb3VyIGNldCBJRCAhIjsNCiRsYW5nWydwcmVwcm9jZXNzb3JfZXJyb3InXSA9ICJFcnJldXIgZCdleMOpY3V0aW9uIGR1IHByw6lwcm9jZXNzZXVyICEiOw0KJGxhbmdbJ3ByZXByb2Nlc3NvciddID0gIlByw6lwcm9jZXNzZXVyIjsNCiRsYW5nWydmaWxlX3RvX2ltcG9ydCddID0gIkZpY2hpZXIgw6AgaW1wb3J0ZXIiOw0KDQokbGFuZ1snaXRlbV9saXN0X2VtcHR5J10gPSAiQXVjdW4gaXRlbSI7DQokbGFuZ1sncHJlcHJvY2Vzc29yX2NoYW5nZWQnXSA9ICJQcsOpcHJvY2Vzc2V1ciBtb2RpZmnDqSI7DQoNCiRsYW5nWydhZGQnXSA9ICJBam91dGVyIjsNCiRsYW5nWydpdGVtX2FkZCddID0gIkFqb3V0ZXIgdW4gaXRlbSI7DQokbGFuZ1snaXRlbV9hZGRlZCddID0gIkl0ZW0gYWpvdXTDqSI7DQokbGFuZ1snaXRlbV9lZGl0ZWQnXSA9ICJJdGVtIMOpZGl0w6kiOw0KJGxhbmdbJ2l0ZW1fZGVsZXRlZCddID0gIkl0ZW0gc3VwcHJpbcOpIjsNCiRsYW5nWydpdGVtX3NvcnRfZWRpdGVkJ10gPSAiT3JkcmUgZGUgbCdpdGVtIG1vZGlmacOpIjsNCiRsYW5nWydlZGl0J10gPSAiw4lkaXRlciI7DQokbGFuZ1snbmFtZSddID0gIk5vbSI7DQokbGFuZ1snY29udGVudCddID0gIkNvbnRlbnUiOw0KJGxhbmdbJ2RhdGVfY3JlYXRpb24nXSA9ICJEYXRlIGRlIGNyw6lhdGlvbiI7DQokbGFuZ1snZGF0ZV9tb2RpZmljYXRpb24nXSA9ICJEYXRlIGRlIG1vZGlmaWNhdGlvbiI7DQokbGFuZ1snc3RhdHVzJ10gPSAiw4l0YXQiOw0KJGxhbmdbJ3N0YXR1c19jaGFuZ2UnXSA9ICJDaGFuZ2VyIGwnw6l0YXQiOw0KJGxhbmdbJ2V4cG9ydCddID0gIkV4cG9ydGVyIjsNCiRsYW5nWydkZWxldGUnXSA9ICJTdXBwcmltZXIiOw0KJGxhbmdbJ3NvcnRfc2F2ZSddID0gIkVucmVnaXN0cmVyIGwnb3JkcmUiOw0KDQokbGFuZ1snc2F2ZSddID0gIkVucmVnaXN0cmVyIjsNCiRsYW5nWydhcHBseSddID0gIkFwcGxpcXVlciI7DQokbGFuZ1snY2FuY2VsJ10gPSAiQW5udWxlciI7DQokbGFuZ1snaW1wb3J0J10gPSAiSW1wb3J0ZXIiOw0KDQokbGFuZ1snaXRlbV9kZWxldGVfY29uZmlybSddID0gIsOKdGVzLXZvdXMgc8O7cihlKSBkZSB2b3Vsb2lyIHN1cHByaW1lciBjZXQgaXRlbSA/IjsNCg0KJGxhbmdbJ2Vycm9yX2ZpbGVfdHJhbnNmZXInXSA9ICJFcnJldXIgbG9ycyBkdSB0cmFuc2ZlcnQgZHUgZmljaGllciI7DQokbGFuZ1snZXJyb3JfZGF0ZV9tb2RpZmljYXRpb25fc2VhcmNoJ10gPSAiRXJyZXVyIGRhbnMgbGEgcmVjaGVyY2hlIGRlIGxhIGRhdGUgZGUgZGVybmnDqHJlIG1vZGlmaWNhdGlvbiAhIjsNCiRsYW5nWydlcnJvcl9maWxlX25vdF94bWwnXSA9ICJMZSBmaWNoaWVyIG4nZXN0IHBhcyBhdSBmb3JtYXQgWE1MICEiOw0KJGxhbmdbJ2Vycm9yX2ZpbGVfbm90X2V4YWNzc194bWwnXSA9ICJMZSBmaWNoaWVyIG4nZXN0IHBhcyB1biBmaWNoaWVyIFhNTCBleHBvcnTDqSBwYXIgRXhhQ1NTICEiOw0KJGxhbmdbJ2Vycm9yX2R1cmluZ19pbXBvcnRhdGlvbiddID0gIkVycmV1ciBsb3JzIGRlIGwnaW1wb3J0YXRpb24gISI7DQoNCiRsYW5nWydpbXBvcnRfc3VjY2VzcyddID0gIkltcG9ydGF0aW9uIHLDqWFsaXPDqWUgYXZlYyBzdWNjw6hzICEiOw0KDQokbGFuZ1snZXhhZXh0ZXJuYWxpemVyJ10gPSAiRXhhRXh0ZXJuYWxpemVyIjsNCiRsYW5nWydleGFleHRlcm5hbGl6ZXJfbm90X2F2YWlsYWJsZSddID0gIkV4YUV4dGVybmFsaXplciBub24gZGlzcG9uaWJsZSAhIjsNCiRsYW5nWydleGFleHRlcm5hbGl6ZXJfY29tcGF0aWJpbGl0eSddID0gIkNvbXBhdGliaWxpdMOpIGF2ZWMgRXhhRXh0ZXJuYWxpemVyIjsNCiRsYW5nWydzZXR0aW5nX3NhdmVkJ10gPSAiUGFyYW3DqHRyZSBlbnJlZ2lzdHLDqSI7DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.Cache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KbmFtZXNwYWNlIEV4YUNTUzsNCg0KY2xhc3MgQ2FjaGUNCnsNCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgR2V0IGZpbGVuYW1lDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGdldEZpbGVuYW1lKCkgew0KICAgIA0KICAgICRtb2QgPSBcY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFeGFDU1MnKTsNCiAgICAkcHJlcHJvY2Vzc29yID0gJG1vZC0+R2V0UHJlZmVyZW5jZSgncHJlcHJvY2Vzc29yJywgJycpOw0KICAgICRsYXN0X21vZGlmaWNhdGlvbiA9IHNlbGY6OmdldExhc3RNb2RpZmljYXRpb24oKTsNCiAgICANCiAgICAkZmlsZW5hbWUgPSAnZXhhY3NzXycubWQ1KCRwcmVwcm9jZXNzb3IuJGxhc3RfbW9kaWZpY2F0aW9uKS4nLmNzcyc7DQogICAgDQogICAgcmV0dXJuICRmaWxlbmFtZTsNCiAgICANCn0NCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgR2V0IHBhdGgNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gZ2V0UGF0aCgpIHsNCiAgICANCiAgICAkY29uZmlnID0gY21zbXMoKS0+R2V0Q29uZmlnKCkgOw0KDQogICAgJHBhdGggPSAkY29uZmlnWydjc3NfcGF0aCddOw0KICAgIA0KICAgIHJldHVybiAkcGF0aDsNCiAgICANCn0NCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgR2V0IFVSTA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRVcmwoKSB7DQogICAgDQogICAgJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOw0KICAgIA0KICAgICRtb2QgPSBcY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFeGFDU1MnKTsNCiAgICAkcHJlcHJvY2Vzc29yID0gJG1vZC0+R2V0UHJlZmVyZW5jZSgncHJlcHJvY2Vzc29yJywgJycpOw0KICAgICRsYXN0X21vZGlmaWNhdGlvbiA9IHNlbGY6OmdldExhc3RNb2RpZmljYXRpb24oKTsNCiAgICANCiAgICAkdXJsID0gJGNvbmZpZ1snY3NzX3VybCddOw0KICAgICR1cmwgPSBwcmVnX3JlcGxhY2UoJyNeaHR0cHM/OiMnLCAnJywgJHVybCk7DQogICAgJGZpbGVuYW1lID0gc2VsZjo6Z2V0RmlsZW5hbWUoJHByZXByb2Nlc3NvciwgJGxhc3RfbW9kaWZpY2F0aW9uKTsNCiAgICANCiAgICByZXR1cm4gJHVybCAuICRmaWxlbmFtZTsNCiAgICANCn0NCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgR2V0IGxhc3QgbW9kaWZpY2F0aW9uDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldExhc3RNb2RpZmljYXRpb24oKSB7DQogICAgDQogICAgJG1vZCA9IFxjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0V4YUNTUycpOw0KICAgICRsYXN0X21vZGlmaWNhdGlvbiA9IE5VTEwgOw0KDQogICAgJHJlc3VsdCA9IFxFeGFDU1NcSXRlbTo6Z2V0KFsNCiAgICAgICAgJ2ZpZWxkcycgPT4gIk1BWChkYXRlX21vZGlmaWNhdGlvbikgbGFzdF9tb2RpZmljYXRpb24iLA0KICAgICAgICAnd2hlcmUnID0+ICJzdGF0dXMgPSB0cnVlIg0KICAgICAgICBdKSA7DQoNCiAgICBpZiAoISRyZXN1bHQpOg0KICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCRtb2QtPkxhbmcoJ2Vycm9yX2RhdGVfbW9kaWZpY2F0aW9uX3NlYXJjaCcpKTsNCiAgICBlbHNlaWYgKCRyZXN1bHQtPnJlc3VsdCA9PSBmYWxzZSk6DQogICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJHJlc3VsdC0+bWVzc2FnZSk7DQogICAgZW5kaWY7DQoNCiAgICAkbGFzdF9tb2RpZmljYXRpb24gPSAkcmVzdWx0LT5yZWNvcmRbMF1bJ2xhc3RfbW9kaWZpY2F0aW9uJ107DQogICAgDQogICAgcmV0dXJuICRsYXN0X21vZGlmaWNhdGlvbjsNCiAgICANCn0NCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgSXMgY2FjaGVkID8NClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNDYWNoZWQoKSB7DQoNCiAgICAkcmV0dXJuID0gZmFsc2U7DQoNCiAgICAkZmlsZW5hbWUgPSBzZWxmOjpnZXRGaWxlbmFtZSgpOw0KICAgICRwYXRoID0gc2VsZjo6Z2V0UGF0aCgpOw0KDQogICAgaWYgKGZpbGVfZXhpc3RzKGNtc19qb2luX3BhdGgoJHBhdGgsJGZpbGVuYW1lKSkpOg0KICAgICAgICAkcmV0dXJuID0gdHJ1ZTsNCiAgICBlbmRpZjsNCiAgICANCiAgICByZXR1cm4gJHJldHVybjsNCiAgICANCn0NCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgV3JpdGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gd3JpdGUoJGNvbnRlbnQpIHsNCiAgICANCiAgICAkcmV0dXJuID0gZmFsc2U7DQogICAgDQogICAgJHBhdGggPSBzZWxmOjpnZXRQYXRoKCk7DQogICAgJGZpbGVuYW1lID0gc2VsZjo6Z2V0RmlsZW5hbWUoKTsNCiAgICANCiAgICBpZiAoIWVtcHR5KCRjb250ZW50KSk6DQoJCSRmaCA9IGZvcGVuKGNtc19qb2luX3BhdGgoJHBhdGgsJGZpbGVuYW1lKSwndycpOw0KCQlmd3JpdGUoJGZoLCAkY29udGVudCk7DQoJCWZjbG9zZSgkZmgpOw0KCWVuZGlmOw0KICAgIA0KICAgICRyZXR1cm4gPSB0cnVlOw0KICAgIA0KICAgIHJldHVybiAkcmV0dXJuOw0KICAgIA0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBEZWxldGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVsZXRlKCkgew0KICAgIA0KICAgICRyZXR1cm4gPSBmYWxzZTsNCiAgICANCiAgICAkcGF0aCA9IHNlbGY6OmdldFBhdGgoKTsNCg0KICAgICRmaWxlcyA9IGdsb2IoY21zX2pvaW5fcGF0aCgkcGF0aCwnZXhhY3NzXyonKSk7DQogICAgaWYgKGNvdW50KCRmaWxlcykgPiAwKToNCiAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICRmKToNCiAgICAgICAgICAgIHVubGluaygkZik7DQogICAgICAgIGVuZGZvcmVhY2g7DQogICAgZW5kaWY7DQogICAgDQogICAgJHJldHVybiA9IHRydWU7DQogICAgDQogICAgcmV0dXJuICRyZXR1cm47DQogICAgDQp9DQoNCg0KDQoNCg0KDQoNCg0KDQp9DQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.ExaExternalizer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KbmFtZXNwYWNlIEV4YUNTUzsNCg0KY2xhc3MgRXhhRXh0ZXJuYWxpemVyDQp7DQogICAgDQogICAgDQogICAgDQogICAgDQogICAgDQogICAgDQogICAgDQogICAgDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgRXhwb3J0DQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGV4cG9ydCgpIHsNCiAgICANCiAgICAvLyBUZXN0IGRlIGxhIHBy6XNlbmNlIGQnRXhhRXh0ZXJuYWxpemVyDQogICAgJGV4YWV4dGVybmFsaXplcl9pbnN0YWxsZWQgPSBcY21zX3V0aWxzOjptb2R1bGVfYXZhaWxhYmxlKCdFeGFFeHRlcm5hbGl6ZXInKTsNCg0KICAgIGlmICgkZXhhZXh0ZXJuYWxpemVyX2luc3RhbGxlZCA9PSBmYWxzZSk6DQogICAgICAgIHJldHVybjsNCiAgICBlbmRpZjsNCiAgICANCiAgICAkbW9kID0gXGNtc191dGlsczo6Z2V0X21vZHVsZSgnRXhhQ1NTJyk7DQoNCiAgICAvLyBS6WN1cOlyYXRpb24gZGVzIGl0ZW1zDQogICAgJHJlc3VsdCA9IFxFeGFDU1NcSXRlbTo6Z2V0KCk7DQogICAgJGl0ZW1fbGlzdCA9ICRyZXN1bHQtPnJlY29yZDsNCg0KICAgICRmb2xkZXIgPSAkbW9kLT5HZXROYW1lKCk7DQogICAgJEV4YUV4dGVybmFsaXplciA9IFxjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0V4YUV4dGVybmFsaXplcicpOw0KICAgICRzdHlsZXNoZWV0X2V4dGVuc2lvbiA9ICRFeGFFeHRlcm5hbGl6ZXItPkdldFByZWZlcmVuY2UoJ3N0eWxlc2hlZXRfZXh0ZW5zaW9uJyk7DQoNCiAgICAvLyBDculhdGlvbiBkdSBkb3NzaWVyIGQnZXhwb3J0YXRpb24NCiAgICBcRXhhRXh0ZXJuYWxpemVyXEZpbGVTeXN0ZW06OmNyZWF0ZUZvbGRlcigkZm9sZGVyKTsNCg0KICAgIGZvcmVhY2ggKCRpdGVtX2xpc3QgYXMgJiRpdGVtKToNCg0KICAgICAgICBcRXhhRXh0ZXJuYWxpemVyXEZpbGVTeXN0ZW06OmNyZWF0ZUZpbGUoJGZvbGRlciwgJGl0ZW1bJ25hbWUnXSAuICIgWyIgLiAkaXRlbVsnaWQnXSAuICJdIiwgJHN0eWxlc2hlZXRfZXh0ZW5zaW9uLCAkaXRlbVsnY29udGVudCddLCBzdHJ0b3RpbWUoJGl0ZW1bJ2RhdGVfbW9kaWZpY2F0aW9uJ10pKTsNCg0KICAgIGVuZGZvcmVhY2g7DQogICAgDQp9DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgSW1wb3J0ZXIgbGVzIGl0ZW1zDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbXBvcnQoKQ0Kew0KICAgIA0KICAgIC8vIFRlc3QgZGUgbGEgcHLpc2VuY2UgZCdFeGFFeHRlcm5hbGl6ZXINCiAgICAkZXhhZXh0ZXJuYWxpemVyX2luc3RhbGxlZCA9IFxjbXNfdXRpbHM6Om1vZHVsZV9hdmFpbGFibGUoJ0V4YUV4dGVybmFsaXplcicpOw0KDQogICAgaWYgKCRleGFleHRlcm5hbGl6ZXJfaW5zdGFsbGVkID09IGZhbHNlKToNCiAgICAgICAgcmV0dXJuOw0KICAgIGVuZGlmOw0KICAgIA0KICAgICRtb2QgPSBcY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFeGFDU1MnKTsNCiAgICANCiAgICAkcmV0dXJuID0gbmV3IFxzdGRDbGFzcygpOw0KICAgICRyZXR1cm4tPnJlc3VsdCA9IGZhbHNlOw0KICAgICRyZXR1cm4tPm1lc3NhZ2UgPSAnJzsNCiAgICANCiAgICAvLyBWYXJpYWJsZXMNCiAgICAkY2FjaGVfcGF0aCA9IFxFeGFFeHRlcm5hbGl6ZXJcQ2FjaGU6OmdldFBhdGgoKTsNCiAgICAkRXhhRXh0ZXJuYWxpemVyID0gXGNtc191dGlsczo6Z2V0X21vZHVsZSgnRXhhRXh0ZXJuYWxpemVyJyk7DQogICAgJHN0eWxlc2hlZXRfZXh0ZW5zaW9uID0gJEV4YUV4dGVybmFsaXplci0+R2V0UHJlZmVyZW5jZSgnc3R5bGVzaGVldF9leHRlbnNpb24nKTsNCiAgICAkZm9sZGVyID0gJG1vZC0+R2V0TmFtZSgpOw0KICAgICRmb2xkZXJfcGF0aCA9IGNtc19qb2luX3BhdGgoJGNhY2hlX3BhdGgsICRmb2xkZXIpOw0KDQoNCiAgICAvLyBQYXJjb3VyaXIgY2hhcXVlIGZldWlsbGUgZGUgc3R5bGVzDQogICAgJHJlc3VsdCA9IFxFeGFDU1NcSXRlbTo6Z2V0KCk7DQogICAgaWYgKGNvdW50KCRyZXN1bHQtPnJlY29yZCkgPiAwKToNCg0KICAgICAgICAkaXRlbV9yZWNvcmQgPSAkcmVzdWx0LT5yZWNvcmQ7DQoNCiAgICAgICAgZm9yZWFjaCAoJGl0ZW1fcmVjb3JkIGFzICRpdGVtKToNCg0KICAgICAgICAgICAgJGZpbGVuYW1lID0gXEV4YUV4dGVybmFsaXplclxGaWxlU3lzdGVtOjplc2NhcGVGaWxlbmFtZSgkaXRlbVsnbmFtZSddKTsNCiAgICAgICAgICAgICRmaWxlbmFtZSA9IGNtc19qb2luX3BhdGgoJGZvbGRlcl9wYXRoLCAkZmlsZW5hbWUgLiAiIFsiIC4gJGl0ZW1bJ2lkJ10gLiAiXSIgLiAnLicgLiAkc3R5bGVzaGVldF9leHRlbnNpb24pOw0KDQogICAgICAgICAgICAvLyBTaSBsZSBmaWNoaWVyIG4nZXhpc3RlIHBhcw0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkZmlsZW5hbWUpKToNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIGVuZGlmOw0KDQogICAgICAgICAgICAvLyBTaSBsZSBmaWNoaWVyIG4nYSBwYXMg6XTpIG1vZGlmaekNCiAgICAgICAgICAgICRmaWxldGltZSA9IEBmaWxlbXRpbWUoJGZpbGVuYW1lKTsNCiAgICAgICAgICAgIGlmICgkZmlsZXRpbWUgPD0gc3RydG90aW1lKCRpdGVtWydkYXRlX21vZGlmaWNhdGlvbiddKSk6DQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICBlbmRpZjsNCg0KICAgICAgICAgICAgLy8gTGVjdHVyZSBkdSBjb250ZW51DQogICAgICAgICAgICAkY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlbmFtZSk7DQoNCiAgICAgICAgICAgIC8vIFNhdXZlZ2FyZGUgZHUgY29udGVudQ0KICAgICAgICAgICAgJHJlc3VsdCA9IFxFeGFDU1NcSXRlbTo6c2V0KFsNCiAgICAgICAgICAgICAgICAnaWQnID0+ICRpdGVtWydpZCddLA0KICAgICAgICAgICAgICAgICdjb250ZW50JyA9PiAkY29udGVudCwNCiAgICAgICAgICAgICAgICAnZGF0ZV9tb2RpZmljYXRpb24nID0+IGRhdGUoIlktbS1kIEg6aTpzIiwgJGZpbGV0aW1lKQ0KICAgICAgICAgICAgICAgIF0pOw0KDQogICAgICAgICAgICAvLyBNaXNlIOAgeulybyBkdSB0aW1lb3V0DQogICAgICAgICAgICBcRXhhRXh0ZXJuYWxpemVyXFRpbWVPdXQ6OnJlc2V0KCk7DQoNCiAgICAgICAgZW5kZm9yZWFjaDsNCg0KICAgIGVuZGlmOw0KICAgIA0KICAgICRyZXR1cm4tPnJlc3VsdCA9IHRydWU7DQogICAgDQogICAgcmV0dXJuICRyZXR1cm47DQogICANCn0NCg0KDQoNCg0KDQoNCg0KDQoNCn0NCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.Item.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KbmFtZXNwYWNlIEV4YUNTUzsNCg0KY2xhc3MgSXRlbQ0Kew0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBWYXJpYWJsZXMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBzdGF0aWMgJGZpZWxkcyA9IFsNCiAgICAnaWQnLA0KICAgICduYW1lJywNCiAgICAnY29udGVudCcsDQogICAgJ3NvcnQnLA0KICAgICdkYXRlX2NyZWF0aW9uJywNCiAgICAnZGF0ZV9tb2RpZmljYXRpb24nLA0KICAgICdzdGF0dXMnDQogICAgXTsNCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgR2V0DQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldCgkb3B0aW9ucz1bXSkgew0KICAgIA0KICAgICRkYiA9IFxjbXNfdXRpbHM6OmdldF9kYigpOw0KICAgIA0KICAgICRyZXR1cm4gPSBuZXcgXHN0ZENsYXNzKCk7DQogICAgJHJldHVybi0+cmVzdWx0ID0gZmFsc2U7DQogICAgJHJldHVybi0+bWVzc2FnZSA9ICcnOw0KICAgICRyZXR1cm4tPmNvdW50ID0gbnVsbDsNCiAgICAkcmV0dXJuLT5yZWNvcmQgPSBbXTsNCiAgICANCiAgICAvLyBEZWZhdWx0IG9wdGlvbnMNCiAgICAkZGVmYXVsdCA9IFsNCiAgICAgICAgJ2ZpZWxkcycgPT4gJyonLA0KICAgICAgICAnd2hlcmUnID0+IG51bGwsDQogICAgICAgICdvcmRlcicgPT4gbnVsbCwNCiAgICAgICAgJ2xpbWl0JyA9PiBudWxsLA0KICAgICAgICAnb2Zmc2V0JyA9PiBudWxsDQogICAgICAgIF07DQogICAgICANCiAgICAvLyBGaWx0ZXIgb3B0aW9ucw0KICAgIGZvcmVhY2ggKCRvcHRpb25zIGFzICRrZXkgPT4gJHZhbCk6DQogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkZGVmYXVsdCkpOg0KICAgICAgICAgICAgdW5zZXQoJG9wdGlvbnNbJGtleV0pOw0KICAgICAgICBlbmRpZjsNCiAgICBlbmRmb3JlYWNoOw0KICAgICRvcHRpb25zID0gYXJyYXlfbWVyZ2UoJGRlZmF1bHQsICRvcHRpb25zKTsNCiAgICANCiAgICAvLyBRdWVyeQ0KICAgICRzcWwgPSAiU0VMRUNUIHskb3B0aW9uc1snZmllbGRzJ119IEZST00gIiAuIENNU19EQl9QUkVGSVggLiAibW9kdWxlX2V4YWNzc19pdGVtIjsNCiAgICAkc3FsIC49ICghZW1wdHkoJG9wdGlvbnNbJ3doZXJlJ10pKSA/ICIgV0hFUkUgeyRvcHRpb25zWyd3aGVyZSddfSIgOiAnJzsNCiAgICAkc3FsIC49ICghZW1wdHkoJG9wdGlvbnNbJ29yZGVyJ10pKSA/ICIgT1JERVIgQlkgeyRvcHRpb25zWydvcmRlciddfSIgOiAnJzsNCiAgICAkc3FsIC49ICghZW1wdHkoJG9wdGlvbnNbJ2xpbWl0J10pKSA/ICIgTElNSVQgeyRvcHRpb25zWydsaW1pdCddfSIgOiAnJzsNCiAgICAkc3FsIC49ICghZW1wdHkoJG9wdGlvbnNbJ29mZnNldCddKSkgPyAiIE9GRlNFVCB7JG9wdGlvbnNbJ29mZnNldCddfSIgOiAnJzsNCiAgICANCiAgICAkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRzcWwpOw0KICAgIA0KICAgIGlmICghJHJlc3VsdCk6DQogICAgICAgICRyZXR1cm4tPm1lc3NhZ2UgPSAkZGItPkVycm9yTXNnKCk7DQogICAgICAgIHJldHVybiAkcmV0dXJuOw0KICAgIGVuZGlmOw0KICAgIA0KICAgICRyZXR1cm4tPmNvdW50ID0gJHJlc3VsdC0+UmVjb3JkQ291bnQoKTsNCiAgICAkcmV0dXJuLT5yZWNvcmQgPSAkcmVzdWx0LT5HZXRBbGwoKTsNCiAgICAkcmV0dXJuLT5yZXN1bHQgPSB0cnVlOw0KICAgIA0KICAgIHJldHVybiAkcmV0dXJuOw0KICAgIA0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBTZXQNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0KCRvcHRpb25zPVtdKSB7DQogICAgDQogICAgLy8gUHLDqXBhcmF0aW9uIGRlcyBvcHRpb25zDQogICAgZm9yZWFjaCAoJG9wdGlvbnMgYXMgJGtleSA9PiAkdmFsKToNCiAgICAgICAgDQogICAgICAgIC8vIEZpbHRyYWdlDQogICAgICAgIGlmICghaW5fYXJyYXkoJGtleSwgc2VsZjo6JGZpZWxkcykpOg0KICAgICAgICAgICAgdW5zZXQoJG9wdGlvbnNbJGtleV0pOw0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIGVuZGlmOw0KDQogICAgICAgIC8vIE9wdGltaXNhdGlvbg0KICAgICAgICBpZiAoJHZhbCA9PSAnJyk6DQogICAgICAgICAgICAkb3B0aW9uc1ska2V5XSA9IE5VTEw7DQogICAgICAgIGVuZGlmOw0KICAgICAgICANCiAgICAgICAgc3dpdGNoICgka2V5KToNCiAgICAgICAgICAgIGNhc2UgJ2lkJzoNCiAgICAgICAgICAgIGNhc2UgJ3NvcnQnOg0KICAgICAgICAgICAgICAgICRvcHRpb25zWyRrZXldID0gKGludCkgJHZhbDsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ25hbWUnOg0KICAgICAgICAgICAgY2FzZSAnc3RhdHVzJzoNCiAgICAgICAgICAgICAgICAkb3B0aW9uc1ska2V5XSA9IHRyaW0oJHZhbCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGVuZHN3aXRjaDsNCiAgICAgICAgDQogICAgZW5kZm9yZWFjaDsNCiAgICANCiAgICAvLyBJbnNlcnRpb24gb3UgbWlzZSDDoCBqb3VyDQogICAgaWYgKCFlbXB0eSgkb3B0aW9uc1snaWQnXSkgQU5EICRvcHRpb25zWydpZCddID4gMCk6DQogICAgICAgICRyZXR1cm4gPSBzZWxmOjp1cGRhdGUoJG9wdGlvbnMpOw0KICAgIGVsc2U6DQogICAgICAgICRyZXR1cm4gPSBzZWxmOjppbnNlcnQoJG9wdGlvbnMpOw0KICAgIGVuZGlmOw0KICAgIA0KICAgIHJldHVybiAkcmV0dXJuOw0KDQp9DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIEluc2VydA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBpbnNlcnQoJG9wdGlvbnMpIHsNCiAgICANCiAgICAkbW9kID0gXGNtc191dGlsczo6Z2V0X21vZHVsZSgnRXhhQ1NTJyk7DQogICAgJGRiID0gXGNtc191dGlsczo6Z2V0X2RiKCk7DQogICAgDQogICAgJHJldHVybiA9IG5ldyBcc3RkQ2xhc3MoKTsNCiAgICAkcmV0dXJuLT5yZXN1bHQgPSBmYWxzZTsNCiAgICAkcmV0dXJuLT5tZXNzYWdlID0gJyc7DQogICAgJHJldHVybi0+aW5zZXJ0SWQgPSBudWxsOw0KICAgIA0KICAgICR0aW1lU3RhbXAgPSB0aW1lKCk7DQogICAgJHRpbWVOb3cgPSBkYXRlKCJZLW0tZCBIOmk6cyIsJHRpbWVTdGFtcCk7DQogICAgDQogICAgLy8gVsOpcmlmaWNhdGlvbiBkZXMgdmFsZXVycw0KICAgIGlmIChlbXB0eSgkb3B0aW9uc1snbmFtZSddKSk6DQogICAgICAgICRyZXR1cm4tPm1lc3NhZ2UgPSAiTm8gbmFtZSEiOw0KICAgICAgICByZXR1cm4gJHJldHVybjsNCiAgICBlbmRpZjsNCiAgICANCiAgICAvLyBQcsOpcGFyYXRpb24gZGVzIHZhbGV1cnMNCiAgICAkb3B0aW9uc1snc29ydCddID0gKGVtcHR5KCRvcHRpb25zWydzb3J0J10pKSA/ICR0aW1lU3RhbXAgOiAkb3B0aW9uc1snc29ydCddOw0KICAgICRvcHRpb25zWydkYXRlX2NyZWF0aW9uJ10gPSAoZW1wdHkoJG9wdGlvbnNbJ2RhdGVfY3JlYXRpb24nXSkpID8gJHRpbWVOb3cgOiAkb3B0aW9uc1snZGF0ZV9jcmVhdGlvbiddOw0KICAgICRvcHRpb25zWydkYXRlX21vZGlmaWNhdGlvbiddID0gKGVtcHR5KCRvcHRpb25zWydkYXRlX21vZGlmaWNhdGlvbiddKSkgPyAkdGltZU5vdyA6ICRvcHRpb25zWydkYXRlX21vZGlmaWNhdGlvbiddOw0KDQogICAgLy8gUHLDqXBhcmF0aW9uIGR1IFNFVA0KICAgICRzZXQgPSAnJzsNCiAgICBmb3JlYWNoICgkb3B0aW9ucyBhcyAka2V5ID0+ICR2YWwpOg0KICAgICAgICAkc2V0IC49ICRrZXkgLiAnID0gPyc7DQogICAgICAgIGVuZCgkb3B0aW9ucyk7DQogICAgICAgIGlmICgka2V5ICE9IGtleSgkb3B0aW9ucykpOg0KICAgICAgICAgICAgJHNldCAuPSAnLCAnOw0KICAgICAgICBlbmRpZjsNCiAgICBlbmRmb3JlYWNoOw0KICAgIA0KICAgIC8vIFJlcXXDqnRlDQogICAgJHF1ZXJ5ID0gIg0KICAgICAgICBJTlNFUlQgSU5UTyAiIC4gQ01TX0RCX1BSRUZJWCAuICJtb2R1bGVfZXhhY3NzX2l0ZW0NCiAgICAgICAgU0VUIHskc2V0fQ0KICAgICAgICAiOw0KICAgIA0KICAgICRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5LCAkb3B0aW9ucyk7DQogICAgDQogICAgaWYgKCEkcmVzdWx0KToNCiAgICAgICAgJHJldHVybi0+bWVzc2FnZSA9ICRkYi0+RXJyb3JNc2coKTsNCiAgICAgICAgcmV0dXJuICRyZXR1cm47DQogICAgZW5kaWY7DQogICAgDQogICAgJHJldHVybi0+cmVzdWx0ID0gdHJ1ZTsNCiAgICAkcmV0dXJuLT5pbnNlcnRJZCA9ICRkYi0+SW5zZXJ0X0lEKCk7DQogICAgJHJldHVybi0+bWVzc2FnZSA9ICRtb2QtPkxhbmcoJ2l0ZW1fYWRkZWQnKTsNCiAgICANCiAgICByZXR1cm4gJHJldHVybjsNCiAgICANCn0NCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgVXBkYXRlDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIHVwZGF0ZSgkb3B0aW9ucykgew0KICAgIA0KICAgICRtb2QgPSBcY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFeGFDU1MnKTsNCiAgICAkZGIgPSBcY21zX3V0aWxzOjpnZXRfZGIoKTsNCiAgICANCiAgICAkcmV0dXJuID0gbmV3IFxzdGRDbGFzcygpOw0KICAgICRyZXR1cm4tPnJlc3VsdCA9IGZhbHNlOw0KICAgICRyZXR1cm4tPm1lc3NhZ2UgPSAnJzsNCiAgICANCiAgICAkdGltZVN0YW1wID0gdGltZSgpOw0KICAgICR0aW1lTm93ID0gZGF0ZSgiWS1tLWQgSDppOnMiLCR0aW1lU3RhbXApOw0KICAgIA0KICAgIC8vIFByw6lwYXJhdGlvbiBkZXMgdmFsZXVycw0KICAgICRvcHRpb25zWydkYXRlX21vZGlmaWNhdGlvbiddID0gKGVtcHR5KCRvcHRpb25zWydkYXRlX21vZGlmaWNhdGlvbiddKSkgPyAkdGltZU5vdyA6ICRvcHRpb25zWydkYXRlX21vZGlmaWNhdGlvbiddOw0KDQogICAgLy8gUHLDqXBhcmF0aW9uIGR1IFNFVA0KICAgICRzZXQgPSAnJzsNCiAgICBmb3JlYWNoICgkb3B0aW9ucyBhcyAka2V5ID0+ICR2YWwpOg0KICAgICAgICAkc2V0IC49ICRrZXkgLiAnID0gPyc7DQogICAgICAgIGVuZCgkb3B0aW9ucyk7DQogICAgICAgIGlmICgka2V5ICE9IGtleSgkb3B0aW9ucykpOg0KICAgICAgICAgICAgJHNldCAuPSAnLCAnOw0KICAgICAgICBlbmRpZjsNCiAgICBlbmRmb3JlYWNoOw0KICAgIA0KICAgIC8vIFJlcXXDqnRlDQogICAgJHF1ZXJ5ID0gIg0KICAgICAgICBVUERBVEUgIiAuIENNU19EQl9QUkVGSVggLiAibW9kdWxlX2V4YWNzc19pdGVtDQogICAgICAgIFNFVCB7JHNldH0NCiAgICAgICAgV0hFUkUgaWQgPSB7JG9wdGlvbnNbJ2lkJ119DQogICAgICAgICI7DQogICAgDQogICAgJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnksICRvcHRpb25zKTsNCiAgICANCiAgICBpZiAoISRyZXN1bHQpOg0KICAgICAgICAkcmV0dXJuLT5tZXNzYWdlID0gJGRiLT5FcnJvck1zZygpOw0KICAgICAgICByZXR1cm4gJHJldHVybjsNCiAgICBlbmRpZjsNCiAgICANCiAgICAkcmV0dXJuLT5yZXN1bHQgPSB0cnVlOw0KICAgICRyZXR1cm4tPm1lc3NhZ2UgPSAkbW9kLT5MYW5nKCdpdGVtX2VkaXRlZCcpOw0KICAgIA0KICAgIHJldHVybiAkcmV0dXJuOw0KICAgIA0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBEZWxldGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVsZXRlKCRpdGVtX2lkKSB7DQoNCiAgICAkbW9kID0gXGNtc191dGlsczo6Z2V0X21vZHVsZSgnRXhhQ1NTJyk7DQogICAgJGRiID0gXGNtc191dGlsczo6Z2V0X2RiKCk7DQogICAgDQogICAgJHJldHVybiA9IG5ldyBcc3RkQ2xhc3MoKTsNCiAgICAkcmV0dXJuLT5yZXN1bHQgPSBmYWxzZTsNCiAgICAkcmV0dXJuLT5tZXNzYWdlID0gJyc7DQogICAgDQogICAgLy8gUmVxdcOqdGUNCiAgICAkcXVlcnkgPSAiDQogICAgICAgIERFTEVURSBGUk9NICIgLiBDTVNfREJfUFJFRklYIC4gIm1vZHVsZV9leGFjc3NfaXRlbQ0KICAgICAgICBXSEVSRSBpZCA9ID8NCiAgICAgICAgIjsNCiAgICANCiAgICAkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeSwgWyRpdGVtX2lkXSk7DQogICAgDQogICAgaWYgKCEkcmVzdWx0KToNCiAgICAgICAgJHJldHVybi0+bWVzc2FnZSA9ICRkYi0+RXJyb3JNc2coKTsNCiAgICAgICAgcmV0dXJuICRyZXR1cm47DQogICAgZW5kaWY7DQogICAgDQogICAgJHJldHVybi0+cmVzdWx0ID0gdHJ1ZTsNCiAgICAkcmV0dXJuLT5tZXNzYWdlID0gJG1vZC0+TGFuZygnaXRlbV9kZWxldGVkJyk7DQogICAgDQogICAgcmV0dXJuICRyZXR1cm47DQoNCn0NCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgU29ydA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzb3J0KCRpdGVtX2lkLCAkc29ydCkgew0KICAgIA0KICAgICRtb2QgPSBcY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFeGFDU1MnKTsNCiAgICAkZGIgPSBcY21zX3V0aWxzOjpnZXRfZGIoKTsNCiAgICANCiAgICAkcmV0dXJuID0gbmV3IFxzdGRDbGFzcygpOw0KICAgICRyZXR1cm4tPnJlc3VsdCA9IGZhbHNlOw0KICAgICRyZXR1cm4tPm1lc3NhZ2UgPSAnJzsNCiAgICANCiAgICAvLyBWw6lyaWZpY2F0aW9uDQogICAgaWYgKCFpc19udW1lcmljKCRpdGVtX2lkKSBPUiAhaXNfbnVtZXJpYygkc29ydCkpOg0KICAgICAgICAkcmV0dXJuLT5tZXNzYWdlID0gIkVycmV1ciBsb3JzIGRlIGxhIHRlbnRhdGl2ZSBkZSBtb2RpZmljYXRpb24gZGUgbCdvcmRyZSBkZSBsJ2l0ZW0gISI7DQogICAgICAgIHJldHVybiAkcmV0dXJuOw0KICAgIGVuZGlmOw0KDQogICAgLy8gUmVxdcOqdGUNCiAgICAkcXVlcnkgPSAiDQogICAgICAgIFVQREFURSAiIC4gQ01TX0RCX1BSRUZJWCAuICJtb2R1bGVfZXhhY3NzX2l0ZW0NCiAgICAgICAgU0VUDQogICAgICAgICAgICBzb3J0ID0gPw0KICAgICAgICBXSEVSRQ0KICAgICAgICAgICAgaWQgPSA/DQogICAgICAgICI7DQogICAgICAgIA0KICAgICRvcHRpb25zID0gWw0KICAgICAgICAkc29ydCwNCiAgICAgICAgJGl0ZW1faWQNCiAgICAgICAgXTsNCg0KICAgICRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5LCAkb3B0aW9ucyk7DQogICAgDQogICAgaWYgKCEkcmVzdWx0KToNCiAgICAgICAgJHJldHVybi0+bWVzc2FnZSA9ICRkYi0+RXJyb3JNc2coKTsNCiAgICAgICAgcmV0dXJuICRyZXR1cm47DQogICAgZW5kaWY7DQogICAgDQogICAgJHJldHVybi0+cmVzdWx0ID0gdHJ1ZTsNCiAgICAkcmV0dXJuLT5tZXNzYWdlID0gJG1vZC0+TGFuZygnaXRlbV9zb3J0X2VkaXRlZCcpOw0KICAgIA0KICAgIHJldHVybiAkcmV0dXJuOw0KICAgIA0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBJbXBvcnQNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW1wb3J0KCRmaWxlKSB7DQogICAgDQogICAgJG1vZCA9IFxjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0V4YUNTUycpOw0KICAgIA0KICAgICRyZXR1cm4gPSBuZXcgXHN0ZENsYXNzKCk7DQogICAgJHJldHVybi0+cmVzdWx0ID0gZmFsc2U7DQogICAgJHJldHVybi0+bWVzc2FnZSA9ICcnOw0KICAgIA0KICAgIC8vIFbDqXJpZmljYXRpb24gZCdlcnJldXIgc3VyIGxlIHRyYW5zZmVydA0KICAgIGlmICgkZmlsZVsnZXJyb3InXSAhPSAwKToNCiAgICAgICAgJHJldHVybi0+bWVzc2FnZSA9ICRtb2QtPkxhbmcoJ2Vycm9yX2ZpbGVfdHJhbnNmZXInKSAuICIgKCIgLiAkZmlsZVsnZXJyb3InXSAuICIpIjsNCiAgICAgICAgcmV0dXJuICRyZXR1cm47DQogICAgZW5kaWY7DQogICAgDQogICAgLy8gRMOpdGVybWluZSBzJ2lsIHMnYWdpdCBkJ3VuIGZpY2hpZXIgWE1MDQoJJHhtbCA9IG5ldyBcRG9tRG9jdW1lbnQoKSA7DQoJJHhtbF9sb2FkID0gQCR4bWwtPmxvYWQoJGZpbGVbJ3RtcF9uYW1lJ10pOw0KCQ0KCWlmICgkeG1sX2xvYWQgPT0gZmFsc2UpOg0KCQkkcmV0dXJuLT5tZXNzYWdlID0gJG1vZC0+TGFuZygnZXJyb3JfZmlsZV9ub3RfeG1sJyk7DQogICAgICAgIHJldHVybiAkcmV0dXJuOw0KCWVuZGlmOw0KCQ0KCS8vIETDqXRlcm1pbmUgcydpbCBzJ2FnaXQgYmllbiBkJ3VuIGZpY2hpZXIgWE1MIGQnRXhhQ1NTDQoJJHN4bWwgPSBzaW1wbGV4bWxfaW1wb3J0X2RvbSgkeG1sKTsNCglpZiAoIWlzc2V0KCRzeG1sLT5uYW1lKSBPUg0KCQkhaXNzZXQoJHN4bWwtPmNvbnRlbnQpIE9SDQoJCSFpc3NldCgkc3htbC0+c29ydCkgT1INCgkJIWlzc2V0KCRzeG1sLT5kYXRlX2NyZWF0aW9uKSBPUg0KCQkhaXNzZXQoJHN4bWwtPmRhdGVfbW9kaWZpY2F0aW9uKSBPUg0KCQkhaXNzZXQoJHN4bWwtPnN0YXR1cykpOg0KCQkkcmV0dXJuLT5tZXNzYWdlID0gJG1vZC0+TGFuZygnZXJyb3JfZmlsZV9ub3RfZXhhY3NzX3htbCcpOw0KICAgICAgICByZXR1cm4gJHJldHVybjsNCgllbmRpZjsNCgkNCgkvLyBJbXBvcnRhdGlvbg0KCSRyZXN1bHQgPSBzZWxmOjpzZXQoWw0KICAgICAgICAnbmFtZScgPT4gKHN0cmluZykgJHN4bWwtPm5hbWUsDQogICAgICAgICdjb250ZW50JyA9PiAoc3RyaW5nKSAkc3htbC0+Y29udGVudCwNCiAgICAgICAgJ3NvcnQnID0+IChpbnQpICRzeG1sLT5zb3J0LA0KICAgICAgICAnZGF0ZV9jcmVhdGlvbicgPT4gKHN0cmluZykgJHN4bWwtPmRhdGVfY3JlYXRpb24sDQogICAgICAgICdkYXRlX21vZGlmaWNhdGlvbicgPT4gKHN0cmluZykgJHN4bWwtPmRhdGVfbW9kaWZpY2F0aW9uLA0KICAgICAgICAnc3RhdHVzJyA9PiAoaW50KSAkc3htbC0+c3RhdHVzDQogICAgICAgIF0pOw0KCQ0KCWlmICgkcmVzdWx0LT5yZXN1bHQgPT0gZmFsc2UpOg0KCQkkcmV0dXJuLT5tZXNzYWdlID0gJG1vZC0+TGFuZygnZXJyb3JfZHVyaW5nX2ltcG9ydGF0aW9uJyk7DQogICAgICAgIHJldHVybiAkcmV0dXJuOw0KCWVuZGlmOw0KDQogICAgJHJldHVybi0+bWVzc2FnZSA9ICRtb2QtPkxhbmcoJ2ltcG9ydF9zdWNjZXNzJyk7DQoJJHJldHVybi0+cmVzdWx0ID0gdHJ1ZTsNCiAgICANCiAgICByZXR1cm4gJHJldHVybjsNCiAgICANCn0NCg0KDQoNCg0KDQoNCg0KDQoNCn0NCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.Preprocessor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KbmFtZXNwYWNlIEV4YUNTUzsNCg0KY2xhc3MgUHJlcHJvY2Vzc29yDQp7DQogICAgDQogICAgDQogICAgDQogICAgDQogICAgDQogICAgDQogICAgDQogICAgDQogICAgDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFZhcmlhYmxlcw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIHN0YXRpYyAkZmllbGRzID0gWw0KICAgICdpZCcsDQogICAgJ25hbWUnLA0KICAgICdhbGlhcycsDQogICAgJ3VybCcsDQogICAgJ3NvcnQnLA0KICAgICdzdGF0dXMnDQogICAgXTsNCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgR2V0DQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldCgkb3B0aW9ucykgew0KICAgIA0KICAgICRkYiA9IFxjbXNfdXRpbHM6OmdldF9kYigpOw0KICAgIA0KICAgICRyZXR1cm4gPSBuZXcgXHN0ZENsYXNzKCk7DQogICAgJHJldHVybi0+cmVzdWx0ID0gZmFsc2U7DQogICAgJHJldHVybi0+bWVzc2FnZSA9ICcnOw0KICAgICRyZXR1cm4tPmNvdW50ID0gbnVsbDsNCiAgICAkcmV0dXJuLT5yZWNvcmQgPSBbXTsNCiAgICANCiAgICAvLyBEZWZhdWx0IG9wdGlvbnMNCiAgICAkZGVmYXVsdCA9IFsNCiAgICAgICAgJ2ZpZWxkcycgPT4gJyonLA0KICAgICAgICAnd2hlcmUnID0+IG51bGwsDQogICAgICAgICdvcmRlcicgPT4gbnVsbCwNCiAgICAgICAgJ2xpbWl0JyA9PiBudWxsLA0KICAgICAgICAnb2Zmc2V0JyA9PiBudWxsDQogICAgICAgIF07DQogICAgICANCiAgICAvLyBGaWx0ZXIgb3B0aW9ucw0KICAgIGZvcmVhY2ggKCRvcHRpb25zIGFzICRrZXkgPT4gJHZhbCk6DQogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkZGVmYXVsdCkpOg0KICAgICAgICAgICAgdW5zZXQoJG9wdGlvbnNbJGtleV0pOw0KICAgICAgICBlbmRpZjsNCiAgICBlbmRmb3JlYWNoOw0KICAgICRvcHRpb25zID0gYXJyYXlfbWVyZ2UoJGRlZmF1bHQsICRvcHRpb25zKTsNCiAgICANCiAgICAvLyBRdWVyeQ0KICAgICRzcWwgPSAiU0VMRUNUIHskb3B0aW9uc1snZmllbGRzJ119IEZST00gIiAuIENNU19EQl9QUkVGSVggLiAibW9kdWxlX2V4YWNzc19wcmVwcm9jZXNzb3IiOw0KICAgICRzcWwgLj0gKCFlbXB0eSgkb3B0aW9uc1snd2hlcmUnXSkpID8gIiBXSEVSRSB7JG9wdGlvbnNbJ3doZXJlJ119IiA6ICcnOw0KICAgICRzcWwgLj0gKCFlbXB0eSgkb3B0aW9uc1snb3JkZXInXSkpID8gIiBPUkRFUiBCWSB7JG9wdGlvbnNbJ29yZGVyJ119IiA6ICcnOw0KICAgICRzcWwgLj0gKCFlbXB0eSgkb3B0aW9uc1snbGltaXQnXSkpID8gIiBMSU1JVCB7JG9wdGlvbnNbJ2xpbWl0J119IiA6ICcnOw0KICAgICRzcWwgLj0gKCFlbXB0eSgkb3B0aW9uc1snb2Zmc2V0J10pKSA/ICIgT0ZGU0VUIHskb3B0aW9uc1snb2Zmc2V0J119IiA6ICcnOw0KICAgIA0KICAgICRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHNxbCk7DQogICAgDQogICAgaWYgKCEkcmVzdWx0KToNCiAgICAgICAgJHJldHVybi0+bWVzc2FnZSA9ICRkYi0+RXJyb3JNc2coKTsNCiAgICAgICAgcmV0dXJuICRyZXR1cm47DQogICAgZW5kaWY7DQogICAgDQogICAgJHJldHVybi0+Y291bnQgPSAkcmVzdWx0LT5SZWNvcmRDb3VudCgpOw0KICAgICRyZXR1cm4tPnJlY29yZCA9ICRyZXN1bHQtPkdldEFsbCgpOw0KICAgICRyZXR1cm4tPnJlc3VsdCA9IHRydWU7DQogICAgDQogICAgcmV0dXJuICRyZXR1cm47DQogICAgDQp9DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFNldA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXQoJG9wdGlvbnMpIHsNCiAgICANCiAgICAvLyBQcsOpcGFyYXRpb24gZGVzIG9wdGlvbnMNCiAgICBmb3JlYWNoICgkb3B0aW9ucyBhcyAka2V5ID0+ICR2YWwpOg0KICAgICAgICANCiAgICAgICAgLy8gRmlsdHJhZ2UNCiAgICAgICAgaWYgKCFpbl9hcnJheSgka2V5LCBzZWxmOjokZmllbGRzKSk6DQogICAgICAgICAgICB1bnNldCgkb3B0aW9uc1ska2V5XSk7DQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgZW5kaWY7DQoNCiAgICAgICAgLy8gT3B0aW1pc2F0aW9uDQogICAgICAgIGlmICgkdmFsID09ICcnKToNCiAgICAgICAgICAgICRvcHRpb25zWyRrZXldID0gTlVMTDsNCiAgICAgICAgZW5kaWY7DQogICAgICAgIA0KICAgICAgICBzd2l0Y2ggKCRrZXkpOg0KICAgICAgICAgICAgY2FzZSAnaWQnOg0KICAgICAgICAgICAgY2FzZSAnc29ydCc6DQogICAgICAgICAgICAgICAgJG9wdGlvbnNbJGtleV0gPSAoaW50KSAkdmFsOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnbmFtZSc6DQogICAgICAgICAgICBjYXNlICdzdGF0dXMnOg0KICAgICAgICAgICAgICAgICRvcHRpb25zWyRrZXldID0gdHJpbSgkdmFsKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgZW5kc3dpdGNoOw0KICAgICAgICANCiAgICBlbmRmb3JlYWNoOw0KICAgIA0KICAgIC8vIEluc2VydGlvbiBvdSBtaXNlIMOgIGpvdXINCiAgICBpZiAoIWVtcHR5KCRvcHRpb25zWydpZCddKSBBTkQgJG9wdGlvbnNbJ2lkJ10gPiAwKToNCiAgICAgICAgJHJldHVybiA9IHNlbGY6OnVwZGF0ZSgkb3B0aW9ucyk7DQogICAgZWxzZToNCiAgICAgICAgJHJldHVybiA9IHNlbGY6Omluc2VydCgkb3B0aW9ucyk7DQogICAgZW5kaWY7DQogICAgDQogICAgcmV0dXJuICRyZXR1cm47DQoNCn0NCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgSW5zZXJ0DQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGluc2VydCgkb3B0aW9ucykgew0KICAgIA0KICAgICRkYiA9IFxjbXNfdXRpbHM6OmdldF9kYigpOw0KICAgIA0KICAgICRyZXR1cm4gPSBuZXcgXHN0ZENsYXNzKCk7DQogICAgJHJldHVybi0+cmVzdWx0ID0gZmFsc2U7DQogICAgJHJldHVybi0+bWVzc2FnZSA9ICcnOw0KICAgICRyZXR1cm4tPmluc2VydElkID0gbnVsbDsNCiAgICANCiAgICAvLyBWw6lyaWZpY2F0aW9uIGRlcyB2YWxldXJzDQogICAgaWYgKGVtcHR5KCRvcHRpb25zWyduYW1lJ10pKToNCiAgICAgICAgJHJldHVybi0+bWVzc2FnZSA9ICJObyBuYW1lISI7DQogICAgICAgIHJldHVybiAkcmV0dXJuOw0KICAgIGVuZGlmOw0KICAgIA0KICAgIGlmIChlbXB0eSgkb3B0aW9uc1snYWxpYXMnXSkpOg0KICAgICAgICAkcmV0dXJuLT5tZXNzYWdlID0gIk5vIGFsaWFzISI7DQogICAgICAgIHJldHVybiAkcmV0dXJuOw0KICAgIGVuZGlmOw0KICAgIA0KICAgIC8vIFByw6lwYXJhdGlvbiBkZXMgdmFsZXVycw0KICAgICRvcHRpb25zWydzb3J0J10gPSAoZW1wdHkoJG9wdGlvbnNbJ3NvcnQnXSkpID8gJHRpbWVTdGFtcCA6ICRvcHRpb25zWydzb3J0J107DQogICAgDQogICAgLy8gUHLDqXBhcmF0aW9uIGR1IFNFVA0KICAgICRzZXQgPSAnJzsNCiAgICBmb3JlYWNoICgkb3B0aW9ucyBhcyAka2V5ID0+ICR2YWwpOg0KICAgICAgICAkc2V0IC49ICRrZXkgLiAnID0gPyc7DQogICAgICAgIGVuZCgkb3B0aW9ucyk7DQogICAgICAgIGlmICgka2V5ICE9IGtleSgkb3B0aW9ucykpOg0KICAgICAgICAgICAgJHNldCAuPSAnLCAnOw0KICAgICAgICBlbmRpZjsNCiAgICBlbmRmb3JlYWNoOw0KICAgIA0KICAgIC8vIFJlcXXDqnRlDQogICAgJHF1ZXJ5ID0gIg0KICAgICAgICBJTlNFUlQgSU5UTyAiIC4gQ01TX0RCX1BSRUZJWCAuICJtb2R1bGVfZXhhY3NzX3ByZXByb2Nlc3Nvcg0KICAgICAgICBTRVQgeyRzZXR9DQogICAgICAgICI7DQogICAgDQogICAgJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnksICRvcHRpb25zKTsNCiAgICANCiAgICBpZiAoISRyZXN1bHQpOg0KICAgICAgICAkcmV0dXJuLT5tZXNzYWdlID0gJGRiLT5FcnJvck1zZygpOw0KICAgICAgICByZXR1cm4gJHJldHVybjsNCiAgICBlbmRpZjsNCiAgICANCiAgICAkcmV0dXJuLT5yZXN1bHQgPSB0cnVlOw0KICAgICRyZXR1cm4tPmluc2VydElkID0gJGRiLT5JbnNlcnRfSUQoKTsNCiAgICAkcmV0dXJuLT5tZXNzYWdlID0gIlByw6lwcm9jZXNzZXVyIGFqb3V0w6kiOw0KICAgIA0KICAgIHJldHVybiAkcmV0dXJuOw0KICAgIA0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBVcGRhdGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gdXBkYXRlKCRvcHRpb25zKSB7DQogICAgDQogICAgJGRiID0gXGNtc191dGlsczo6Z2V0X2RiKCk7DQogICAgDQogICAgJHJldHVybiA9IG5ldyBcc3RkQ2xhc3MoKTsNCiAgICAkcmV0dXJuLT5yZXN1bHQgPSBmYWxzZTsNCiAgICAkcmV0dXJuLT5tZXNzYWdlID0gJyc7DQogICAgDQogICAgLy8gUHLDqXBhcmF0aW9uIGR1IFNFVA0KICAgICRzZXQgPSAnJzsNCiAgICBmb3JlYWNoICgkb3B0aW9ucyBhcyAka2V5ID0+ICR2YWwpOg0KICAgICAgICAkc2V0IC49ICRrZXkgLiAnID0gPyc7DQogICAgICAgIGVuZCgkb3B0aW9ucyk7DQogICAgICAgIGlmICgka2V5ICE9IGtleSgkb3B0aW9ucykpOg0KICAgICAgICAgICAgJHNldCAuPSAnLCAnOw0KICAgICAgICBlbmRpZjsNCiAgICBlbmRmb3JlYWNoOw0KICAgIA0KICAgIC8vIFJlcXXDqnRlDQogICAgJHF1ZXJ5ID0gIg0KICAgICAgICBVUERBVEUgIiAuIENNU19EQl9QUkVGSVggLiAibW9kdWxlX2V4YWNzc19wcmVwcm9jZXNzb3INCiAgICAgICAgU0VUIHskc2V0fQ0KICAgICAgICBXSEVSRSBpZCA9IHskb3B0aW9uc1snaWQnXX0NCiAgICAgICAgIjsNCiAgICANCiAgICAkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeSwgJG9wdGlvbnMpOw0KICAgIA0KICAgIGlmICghJHJlc3VsdCk6DQogICAgICAgICRyZXR1cm4tPm1lc3NhZ2UgPSAkZGItPkVycm9yTXNnKCk7DQogICAgICAgIHJldHVybiAkcmV0dXJuOw0KICAgIGVuZGlmOw0KICAgIA0KICAgICRyZXR1cm4tPnJlc3VsdCA9IHRydWU7DQogICAgJHJldHVybi0+bWVzc2FnZSA9ICJJdGVtIMOpZGl0w6kiOw0KICAgIA0KICAgIHJldHVybiAkcmV0dXJuOw0KICAgIA0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBEZWxldGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVsZXRlKCRpdGVtX2lkKSB7DQoNCiAgICAkZGIgPSBcY21zX3V0aWxzOjpnZXRfZGIoKTsNCiAgICANCiAgICAkcmV0dXJuID0gbmV3IFxzdGRDbGFzcygpOw0KICAgICRyZXR1cm4tPnJlc3VsdCA9IGZhbHNlOw0KICAgICRyZXR1cm4tPm1lc3NhZ2UgPSAnJzsNCiAgICANCiAgICAvLyBSZXF1w6p0ZQ0KICAgICRxdWVyeSA9ICINCiAgICAgICAgREVMRVRFIEZST00gIiAuIENNU19EQl9QUkVGSVggLiAibW9kdWxlX2V4YWNzc19wcmVwcm9jZXNzb3INCiAgICAgICAgV0hFUkUgaWQgPSA/DQogICAgICAgICI7DQogICAgDQogICAgJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnksIFskaXRlbV9pZF0pOw0KICAgIA0KICAgIGlmICghJHJlc3VsdCk6DQogICAgICAgICRyZXR1cm4tPm1lc3NhZ2UgPSAkZGItPkVycm9yTXNnKCk7DQogICAgICAgIHJldHVybiAkcmV0dXJuOw0KICAgIGVuZGlmOw0KICAgIA0KICAgICRyZXR1cm4tPnJlc3VsdCA9IHRydWU7DQogICAgJHJldHVybi0+bWVzc2FnZSA9ICJQcsOpcHJvY2Vzc2V1ciBzdXBwcmltw6kiOw0KICAgIA0KICAgIHJldHVybiAkcmV0dXJuOw0KDQp9DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIEV4ZWN1dGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXhlY3V0ZSgpIHsNCiAgICANCiAgICAkcmV0dXJuID0gbmV3IFxzdGRDbGFzcygpOw0KICAgICRyZXR1cm4tPnJlc3VsdCA9IGZhbHNlOw0KICAgICRyZXR1cm4tPm1lc3NhZ2UgPSAnJzsNCiAgICANCiAgICAkbW9kID0gXGNtc191dGlsczo6Z2V0X21vZHVsZSgnRXhhQ1NTJyk7DQogICAgJHByZXByb2Nlc3NvciA9ICRtb2QtPkdldFByZWZlcmVuY2UoJ3ByZXByb2Nlc3NvcicsICcnKTsNCiAgICANCiAgICAkY29udGVudCA9ICcnOw0KICAgIA0KICAgIC8vIFLDqWN1cMOpcmF0aW9uIGRlcyBpdGVtcw0KICAgICRyZXN1bHQgPSBcRXhhQ1NTXEl0ZW06OmdldChbDQogICAgICAgICd3aGVyZScgPT4gInN0YXR1cyA9IHRydWUiLA0KICAgICAgICAnb3JkZXInID0+ICJzb3J0IEFTQyINCiAgICAgICAgXSk7DQogICAgICAgIA0KICAgIGlmICghJHJlc3VsdCBPUiAkcmVzdWx0LT5yZXN1bHQgPT0gZmFsc2UpOg0KICAgICAgICAkcmV0dXJuLT5tZXNzYWdlID0gJ0VycmV1ciBpbmNvbm51ZSc7DQogICAgICAgIHJldHVybiAkcmV0dXJuOw0KICAgIGVuZGlmOw0KICAgDQogICAgJGl0ZW1fbGlzdCA9ICRyZXN1bHQtPnJlY29yZDsNCg0KICAgIC8vIENvbmNhdMOpbmF0aW9uIGRlcyBpdGVtcw0KICAgIGlmICgkcmVzdWx0LT5jb3VudCA+IDApOg0KICAgICAgICANCiAgICAgICAgZm9yZWFjaCAoJGl0ZW1fbGlzdCBhcyAkaXRlbSk6DQogICAgICAgIA0KICAgICAgICAgICAgJGNvbnRlbnQgLj0gJGl0ZW1bJ2NvbnRlbnQnXSAuICJcblxuIjsNCiAgICAgICAgDQogICAgICAgIGVuZGZvcmVhY2g7DQogICAgICAgIA0KICAgIGVuZGlmOw0KICAgIA0KICAgIC8vIEV4w6ljdXRpb24gZGUgU21hcnR5DQogICAgJGNvbnRlbnQgPSBzZWxmOjpzbWFydHkoJGNvbnRlbnQpOw0KDQogICAgLy8gRXjDqWN1dGlvbiBkdSBwcsOpcHJvY2Vzc2V1cg0KICAgIHN3aXRjaCAoJHByZXByb2Nlc3Nvcik6DQogICAgICAgIGNhc2UgImxlc3NwaHBfb3llam9yZ2UiOg0KICAgICAgICAgICAgJGNvbnRlbnQgPSBzZWxmOjpsZXNzcGhwX295ZWpvcmdlKCRjb250ZW50KTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICJzY3NzcGhwX2xlYWZvIjoNCiAgICAgICAgICAgICRjb250ZW50ID0gc2VsZjo6c2Nzc3BocF9sZWFmbygkY29udGVudCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIGVuZHN3aXRjaDsNCiAgICANCiAgICAvLyBNaW5pZmljYXRpb24gZHUgY29udGVudQ0KICAgICRjb250ZW50ID0gc2VsZjo6bWluaWZ5KCRjb250ZW50KTsNCiAgICANCiAgICAvLyBTdXBwcmVzc2lvbiBkdSBjYWNoZSBFeGFDU1MNCiAgICAkcmVzdWx0ID0gXEV4YUNTU1xDYWNoZTo6ZGVsZXRlKCk7DQogICAgDQogICAgLy8gRWNyaXR1cmUgZHUgY2FjaGUgQ1NTDQogICAgJHJlc3VsdCA9IFxFeGFDU1NcQ2FjaGU6OndyaXRlKCRjb250ZW50KTsNCiAgICANCiAgICAkcmV0dXJuLT5yZXN1bHQgPSB0cnVlOw0KICAgIA0KICAgIHJldHVybiAkcmV0dXJuOw0KICAgIA0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBTbWFydHkNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gc21hcnR5KCRjb250ZW50KSB7DQogICAgDQogICAgJHNtYXJ0eSA9IGNtc21zKCktPkdldFNtYXJ0eSgpOw0KICAgIA0KICAgICRzbWFydHktPmxlZnRfZGVsaW1pdGVyID0gJ1tbJzsNCiAgICAkc21hcnR5LT5yaWdodF9kZWxpbWl0ZXIgPSAnXV0nOw0KICAgICR0bXAgPSAkc21hcnR5LT5mb3JjZV9jb21waWxlOw0KICAgICRzbWFydHktPmZvcmNlX2NvbXBpbGUgPSAxOw0KICAgICRjb250ZW50ID0gJHNtYXJ0eS0+ZmV0Y2goJ3N0cmluZzonLiRjb250ZW50KTsNCiAgICAkc21hcnR5LT5mb3JjZV9jb21waWxlID0gJHRtcDsNCiAgICAkc21hcnR5LT5sZWZ0X2RlbGltaXRlciA9ICd7JzsNCiAgICAkc21hcnR5LT5yaWdodF9kZWxpbWl0ZXIgPSAnfSc7DQogICAgDQogICAgcmV0dXJuICRjb250ZW50Ow0KICAgIA0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBNaW5pZnkNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gbWluaWZ5KCRjb250ZW50KSB7DQogICAgDQogICAgLy8gU3VwcHJlc3Npb24gZGVzIHByw6lmaXhlcyBodHRwKHMpDQogICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJyNodHRwcz86IycsICcnLCAkY29udGVudCk7DQogICAgDQoJLy8gU3VwcHJlc3Npb24gZGVzIGNvbW1lbnRhaXJlcw0KCSRjb250ZW50ID0gcHJlZ19yZXBsYWNlKCchL1wqW14qXSpcKisoW14vXVteKl0qXCorKSovIScsICcnLCAkY29udGVudCk7DQoNCgkvLyBTdXBwcmVzc2lvbiBkZXMgdGFidWxhdGlvbnMsIGVzcGFjZXMgbXVsdGlwbGVzLCByZXRvdXJzIMOgIGxhIGxpZ25lLCBldGMuDQoJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZShhcnJheSgiXHJcbiIsICJcciIsICJcbiIsICJcdCIpLCAnICcsICRjb250ZW50KTsNCgkkY29udGVudCA9IHByZWdfcmVwbGFjZSgiIVsgXSshIiwgIiAiLCAkY29udGVudCk7DQoNCgkvLyBTdXBwcmVzc2lvbiBkZXMgZGVybmllcnMgZXNwYWNlcyBpbnV0aWxlcw0KCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoYXJyYXkoJyB7ICcsJyB7JywneyAnKSwgJ3snLCAkY29udGVudCk7DQoJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZShhcnJheSgnIH0gJywnIH0nLCd9ICcpLCAnfScsICRjb250ZW50KTsNCgkkY29udGVudCA9IHN0cl9yZXBsYWNlKGFycmF5KCcgOiAnLCcgOicsJzogJyksICc6JywgJGNvbnRlbnQpOw0KCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoYXJyYXkoJyA7ICcsJyA7JywnOyAnKSwgJzsnLCAkY29udGVudCk7DQogICAgJGNvbnRlbnQgPSB0cmltKCRjb250ZW50KTsNCgkNCglyZXR1cm4gJGNvbnRlbnQgOw0KICAgIA0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBsZXNzcGhwX295ZWpvcmdlDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGxlc3NwaHBfb3llam9yZ2UoJGNvbnRlbnQpIHsNCiAgICANCiAgICAkbW9kID0gXGNtc191dGlsczo6Z2V0X21vZHVsZSgnRXhhQ1NTJyk7DQogICAgDQogICAgdHJ5IHsNCiAgICAgICAgcmVxdWlyZV9vbmNlKCRtb2QtPkdldE1vZHVsZVBhdGgoKS4nL2V4dHJhL2xlc3NwaHBfb3llam9yZ2UvTGVzcy5waHAnKTsNCiAgICAgICAgJHBhcnNlciA9IG5ldyBcTGVzc19QYXJzZXIoKTsNCiAgICAgICAgJHBhcnNlci0+cGFyc2UoJGNvbnRlbnQpOw0KICAgICAgICAkY29udGVudCA9ICRwYXJzZXItPmdldENzcygpOw0KICAgIH0NCiAgICBjYXRjaCAoRXhjZXB0aW9uICRlKSB7DQogICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJGUtPmdldE1lc3NhZ2UoKSk7DQogICAgfQ0KICAgIA0KICAgIHJldHVybiAkY29udGVudDsNCiAgICANCn0NCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgbGVzc3BocF9veWVqb3JnZQ0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBzY3NzcGhwX2xlYWZvKCRjb250ZW50KSB7DQogICAgDQogICAgJG1vZCA9IFxjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0V4YUNTUycpOw0KICAgIA0KICAgIHRyeSB7DQogICAgICAgIHJlcXVpcmVfb25jZSgkbW9kLT5HZXRNb2R1bGVQYXRoKCkuJy9leHRyYS9zY3NzcGhwX2xlYWZvL3Njc3MuaW5jLnBocCcpOw0KICAgICAgICAkc2NzcyA9IG5ldyBcTGVhZm9cU2Nzc1BocFxDb21waWxlcigpOw0KICAgICAgICAkY29udGVudCA9ICRzY3NzLT5jb21waWxlKCRjb250ZW50KTsNCiAgICB9DQogICAgY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgew0KICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCRlLT5nZXRNZXNzYWdlKCkpOw0KICAgIH0NCiAgICANCiAgICByZXR1cm4gJGNvbnRlbnQ7DQogICAgDQp9DQoNCg0KDQoNCg0KDQoNCg0KDQp9DQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmKCAhZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSApIGV4aXQ7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUGVybWlzc2lvbnMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKEV4YUNTUzo6UEVSTV9VU0UsJ0V4YUNTUyAtIFVzZScpOw0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFRhYmxlIFByZXByb2Nlc3Nvcg0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHRhYmxlWydtb2R1bGVfZXhhY3NzX3ByZXByb2Nlc3NvciddID0gIg0KICAgIGlkIEkgS0VZIEFVVE8sDQogICAgbmFtZSBDKDI1NSksDQogICAgYWxpYXMgQygyNTUpLA0KICAgIHVybCBDKDI1NSksDQogICAgc29ydCBJLA0KICAgIHN0YXR1cyBMDQogICAgIjsNCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBUYWJsZSBJdGVtDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KICAgIA0KJHRhYmxlWydtb2R1bGVfZXhhY3NzX2l0ZW0nXSA9ICINCiAgICBpZCBJIEtFWSBBVVRPLA0KICAgIG5hbWUgQygyNTUpLA0KICAgIGNvbnRlbnQgWDIsDQogICAgc29ydCBJLA0KICAgIGRhdGVfY3JlYXRpb24gIiAuIENNU19BRE9EQl9EVCAuICIsDQogICAgZGF0ZV9tb2RpZmljYXRpb24gIiAuIENNU19BRE9EQl9EVCAuICIsDQogICAgc3RhdHVzIEwNCiAgICAiOw0KICAgIA0KICAgIA0KICAgIA0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIENyw6lhdGlvbiBkZXMgdGFibGVzDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokZGIgPSAkdGhpcy0+R2V0RGIoKTsNCiRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoJGRiKTsNCg0KZm9yZWFjaCAoJHRhYmxlIGFzICRrZXkgPT4gJHZhbCk6DQogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKENNU19EQl9QUkVGSVguJGtleSwkdmFsLFsnbXlzcWwnID0+ICdUWVBFPU15SVNBTSddKTsNCiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7DQplbmRmb3JlYWNoOw0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFRhYmxlIFByZXByb2Nlc3NvciAtIEluc2VydGlvbg0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHF1ZXJ5ID0gIg0KCUlOU0VSVCBJTlRPICIgLiBDTVNfREJfUFJFRklYIC4gIm1vZHVsZV9leGFjc3NfcHJlcHJvY2Vzc29yDQoJU0VUDQoJCW5hbWUgPSA/LA0KCQlhbGlhcyA9ID8sDQoJCXVybCA9ID8sDQoJCXNvcnQgPSA/LA0KCQlzdGF0dXMgPSA/DQoJIiA7DQoJDQokdmFsdWVzID0gYXJyYXkoJ05vbmUnLCAnJywgJycsIDAsIDEpIDsNCiRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5LCAkdmFsdWVzKTsNCg0KJHZhbHVlcyA9IGFycmF5KCdMZXNzLnBocCAob3llam9yZ2UpJywgJ2xlc3NwaHBfb3llam9yZ2UnLCAnaHR0cDovL2xlc3NwaHAuZ3BlYXN5LmNvbS8nLCAxLCAxKSA7DQokcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeSwgJHZhbHVlcyk7DQoNCiR2YWx1ZXMgPSBhcnJheSgnc2Nzc3BocCAoTGVhZm8pJywgJ3Njc3NwaHBfbGVhZm8nLCAnaHR0cDovL2xlYWZvLmdpdGh1Yi5pby9zY3NzcGhwLycsIDEsIDEpIDsNCiRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5LCAkdmFsdWVzKTsNCg0KDQoNCg0KDQoNCg0KDQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmKCAhZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSApIGV4aXQ7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUGVybWlzc2lvbnMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKEV4YUNTUzo6UEVSTV9VU0UpOw0KDQoNCg0KDQoNCg0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFByw6lmw6lyZW5jZXMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCk7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgw4l2w6huZW1lbnRzDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokdGhpcy0+UmVtb3ZlRXZlbnRIYW5kbGVyKCdFeGFFeHRlcm5hbGl6ZXInLCAnRXhwb3J0Jyk7DQokdGhpcy0+UmVtb3ZlRXZlbnRIYW5kbGVyKCdFeGFFeHRlcm5hbGl6ZXInLCAnSW1wb3J0Jyk7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgU3VwcHJlc3Npb24gZGVzIHRhYmxlcw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJGRiID0gJHRoaXMtPkdldERiKCk7DQokZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7DQoNCiR0YWJsZSA9IFsNCiAgICAibW9kdWxlX2V4YWNzc19wcmVwcm9jZXNzb3IiLA0KICAgICJtb2R1bGVfZXhhY3NzX2l0ZW0iDQogICAgXTsNCiAgICANCmZvcmVhY2ggKCR0YWJsZSBhcyAkaXRlbSk6DQogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTChDTVNfREJfUFJFRklYLiRpdGVtKTsNCiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7DQplbmRmb3JlYWNoOw0KDQoNCg0KDQoNCg0KDQoNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmKCAhZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSApIGV4aXQ7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgVmFyaWFibGVzDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokZGIgPSAkdGhpcy0+R2V0RGIoKTsNCiRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoJGRiKTsNCiRjdXJyZW50X3ZlcnNpb24gPSAkb2xkdmVyc2lvbjsNCg0KDQoNCg0KDQoNCg0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBTd2l0Y2hlcg0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0Kc3dpdGNoKCRjdXJyZW50X3ZlcnNpb24pOg0KICAgIA0KICAgIGNhc2UgJzEuMCc6DQoJY2FzZSAnMS4wLjEnOg0KCWNhc2UgJzEuMC4yJzoNCiAgICAgICAgdXBncmFkZV8xXzEoKTsNCiAgICAgICAgDQogICAgY2FzZSAnMS4xJzoNCgljYXNlICcxLjEuMSc6DQoJY2FzZSAnMS4yJzoNCiAgICBjYXNlICcxLjIuMSc6DQogICAgY2FzZSAnMS4yLjInOg0KICAgIGNhc2UgJzEuMyc6DQogICAgICAgIHVwZ3JhZGVfMV8zXzEoKTsNCiAgICAgICAgIA0KICAgIGNhc2UgJzEuMy4xJzoNCiAgICBjYXNlICcxLjQnOg0KICAgICAgICB1cGdyYWRlXzJfMCgpOw0KICAgIA0KICAgIGNhc2UgJzIuMCc6DQogICAgY2FzZSAnMi4wLjEnOg0KICAgIGNhc2UgJzIuMC4yJzoNCiAgICAgICAgYnJlYWs7DQogICAgDQplbmRzd2l0Y2g7DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgVXBncmFkZSAxLjENClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCmZ1bmN0aW9uIHVwZ3JhZGVfMV8xKCkgew0KICAgIA0KICAgIC8vIEFqb3V0IGR1IHByw6lwcm9jZXNzZXVyIHNjc3NwaHANCiAgICAkcmVzdWx0ID0gXEV4YUNTU1xQcmVwcm9jZXNzb3I6OnNldChbDQogICAgICAgICduYW1lJyA9PiAnc2Nzc3BocCcsDQogICAgICAgICdhbGlhcycgPT4gJ3Njc3NwaHAnLA0KICAgICAgICAndXJsJyA9PiAnaHR0cDovL2xlYWZvLm5ldC9zY3NzcGhwLycsDQogICAgICAgICdzb3J0JyA9PiAnMicsDQogICAgICAgICdzdGF0dXMnID0+ICcxJw0KICAgICAgICBdKTsNCiAgICANCiAgICAvLyBBam91dCBkdSBwcsOpcHJvY2Vzc2V1ciBDU1MtQ3J1c2gNCiAgICAkcmVzdWx0ID0gXEV4YUNTU1xQcmVwcm9jZXNzb3I6OnNldChbDQogICAgICAgICduYW1lJyA9PiAnQ1NTLUNydXNoJywNCiAgICAgICAgJ2FsaWFzJyA9PiAnY3NzLWNydXNoJywNCiAgICAgICAgJ3VybCcgPT4gJ2h0dHA6Ly90aGUtZWNob3BsZXgubmV0L2Nzc2NydXNoLycsDQogICAgICAgICdzb3J0JyA9PiAnMycsDQogICAgICAgICdzdGF0dXMnID0+ICcxJw0KICAgICAgICBdKTsNCiAgICANCiAgICAvLyBGaW4gZGUgbGEgbWlzZSDDoCBqb3VyDQogICAgJGN1cnJlbnRfdmVyc2lvbiA9ICIxLjEiOw0KDQp9DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgVXBncmFkZSAxLjMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCmZ1bmN0aW9uIHVwZ3JhZGVfMV8zKCkgew0KICAgIA0KICAgIC8vIFLDqWN1cMOpcmF0aW9uIGR1IHByw6lwcm9jZXNzZXVyIGxlc3NwaHAgKGxlYWZvKQ0KICAgICRyZXN1bHQgPSBcRXhhQ1NTXFByZXByb2Nlc3Nvcjo6Z2V0KFsNCiAgICAgICAgJ3doZXJlJyA9PiAiYWxpYXMgPSAnbGVzc3BocCciDQogICAgICAgIF0pOw0KICAgICAgICANCiAgICAkbGVzc3BocF9sZWFmbyA9ICRyZXN1bHQtPnJlc3VsdFswXTsNCiAgICANCiAgICAvLyBNaXNlIMOgIGpvdXIgZHUgcHLDqXByb2Nlc3NldXIgbGVzc3BocCAobGVhZm8pDQogICAgJHJlc3VsdCA9IFxFeGFDU1NcUHJlcHJvY2Vzc29yOjpzZXQoWw0KICAgICAgICAnaWQnID0+ICRsZXNzcGhwX2xlYWZvWydpZCddLA0KICAgICAgICAnbmFtZScgPT4gImxlc3NwaHAgKGxlYWZvKSIsDQogICAgICAgICdhbGlhcycgPT4gImxlc3NwaHBfbGVhZm8iDQogICAgICAgIF0pOw0KDQogICAgJHByZXByb2Nlc3Nvcl9hY3RpdmUgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncHJlcHJvY2Vzc29yJywgJycpOw0KICAgIGlmICgkcHJlcHJvY2Vzc29yX2FjdGl2ZSA9PSAnbGVzc3BocCcpOg0KICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncHJlcHJvY2Vzc29yJywgJ2xlc3NwaHBfbGVhZm8nKTsNCiAgICBlbmRpZjsNCg0KICAgIC8vIEFqb3V0IGR1IHByw6lwcm9jZXNzZXVyIExlc3MucGhwIChveWVqb3JnZSkNCiAgICAkcmVzdWx0ID0gXEV4YUNTU1xQcmVwcm9jZXNzb3I6OnNldChbDQogICAgICAgICduYW1lJyA9PiAiTGVzcy5waHAgKG95ZWpvcmdlKSIsDQogICAgICAgICdhbGlhcycgPT4gImxlc3NwaHBfb3llam9yZ2UiLA0KICAgICAgICAndXJsJyA9PiAiaHR0cDovL2xlc3NwaHAuZ3BlYXN5LmNvbS8iLA0KICAgICAgICAnc29ydCcgPT4gIjQiLA0KICAgICAgICAnc3RhdHVzJyA9PiAiMSINCiAgICAgICAgXSk7DQoNCiAgICAvLyBGaW4gZGUgbGEgbWlzZSDDoCBqb3VyDQogICAgJGN1cnJlbnRfdmVyc2lvbiA9ICIxLjMiOw0KDQp9DQoNCg0KDQoNCg0KDQoNCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgVXBncmFkZSAyLjANClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCmZ1bmN0aW9uIHVwZ3JhZGVfMl8wKCkgew0KICAgIA0KICAgIC8vIFLDqWN1cMOpcmF0aW9uIGRlcyBwcsOpcHJvY2Vzc2V1cnMNCiAgICAkcmVzdWx0ID0gXEV4YUNTU1xQcmVwcm9jZXNzb3I6OmdldCgpOw0KICAgICRwcmVwcm9jZXNzb3JfbGlzdCA9ICRyZXN1bHQtPnJlY29yZDsNCiAgICANCiAgICAvLyBTdXBwcmVzc2lvbiBkZXMgcHLDqXByb2Nlc3NldXJzDQogICAgZm9yZWFjaCAoJHByZXByb2Nlc3Nvcl9saXN0IGFzICRwcmVwcm9jZXNzb3IpOg0KICAgIA0KICAgICAgICAkcmVzdWx0ID0gXEV4YUNTU1xQcmVwcm9jZXNzb3I6OmRlbGV0ZSgkcHJlcHJvY2Vzc29yWydpZCddKTsNCiAgICANCiAgICBlbmRmb3JlYWNoOw0KICAgIA0KICAgIC8vIEluc3RhbGxhdGlvbiBkdSBwcsOpcHJvY2Vzc2V1ciBOb25lDQogICAgJHJlc3VsdCA9IFxFeGFDU1NcUHJlcHJvY2Vzc29yOjpzZXQoWw0KICAgICAgICAnbmFtZScgPT4gIk5vbmUiLA0KICAgICAgICAnYWxpYXMnID0+ICIiLA0KICAgICAgICAndXJsJyA9PiAiIiwNCiAgICAgICAgJ3NvcnQnID0+ICIwIiwNCiAgICAgICAgJ3N0YXR1cycgPT4gIjEiDQogICAgICAgIF0pOw0KICAgIA0KICAgIC8vIEluc3RhbGxhdGlvbiBkdSBwcsOpcHJvY2Vzc2V1ciBMZXNzLnBocCAob3llam9yZ2UpDQogICAgJHJlc3VsdCA9IFxFeGFDU1NcUHJlcHJvY2Vzc29yOjpzZXQoWw0KICAgICAgICAnbmFtZScgPT4gIkxlc3MucGhwIChveWVqb3JnZSkiLA0KICAgICAgICAnYWxpYXMnID0+ICJsZXNzcGhwX295ZWpvcmdlIiwNCiAgICAgICAgJ3VybCcgPT4gImh0dHA6Ly9sZXNzcGhwLmdwZWFzeS5jb20vIiwNCiAgICAgICAgJ3NvcnQnID0+ICIxIiwNCiAgICAgICAgJ3N0YXR1cycgPT4gIjEiDQogICAgICAgIF0pOw0KDQogICAgLy8gSW5zdGFsbGF0aW9uIGR1IHByw6lwcm9jZXNzZXVyIHNjc3NwaHAgKExlYWZvKQ0KICAgICRyZXN1bHQgPSBcRXhhQ1NTXFByZXByb2Nlc3Nvcjo6c2V0KFsNCiAgICAgICAgJ25hbWUnID0+ICJzY3NzcGhwIChMZWFmbykiLA0KICAgICAgICAnYWxpYXMnID0+ICJzY3NzcGhwX2xlYWZvIiwNCiAgICAgICAgJ3VybCcgPT4gImh0dHA6Ly9sZWFmby5naXRodWIuaW8vc2Nzc3BocC8iLA0KICAgICAgICAnc29ydCcgPT4gIjEiLA0KICAgICAgICAnc3RhdHVzJyA9PiAiMSINCiAgICAgICAgXSk7DQogICAgDQogICAgLy8gTWlzZSDDoCBqb3VyIGR1IHByw6lwcm9jZXNzZXVyIGFjdGlmIHNpIG7DqWNlc3NhaXJlDQogICAgJHByZXByb2Nlc3NvciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdwcmVwcm9jZXNzb3InLCAnJyk7DQogICAgc3dpdGNoICgkcHJlcHJvY2Vzc29yKToNCiAgICAgICAgY2FzZSAnbGVzc3BocF9sZWFmbyc6DQogICAgICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncHJlcHJvY2Vzc29yJywgJ2xlc3NwaHBfb3llam9yZ2UnKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdzY3NzcGhwJzoNCiAgICAgICAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwcmVwcm9jZXNzb3InLCAnc2Nzc3BocF9sZWFmbycpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJyc6DQogICAgICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncHJlcHJvY2Vzc29yJywgJycpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgZW5kc3dpdGNoOw0KICAgIA0KICAgIC8vIENyw6lhdGlvbiBkZSBsYSB0YWJsZSBpdGVtDQogICAgJGZpZWxkcyA9ICINCiAgICAgICAgaWQgSSBLRVkgQVVUTywNCiAgICAgICAgbmFtZSBDKDI1NSksDQogICAgICAgIGNvbnRlbnQgWDIsDQogICAgICAgIHNvcnQgSSwNCiAgICAgICAgZGF0ZV9jcmVhdGlvbiAiIC4gQ01TX0FET0RCX0RUIC4gIiwNCiAgICAgICAgZGF0ZV9tb2RpZmljYXRpb24gIiAuIENNU19BRE9EQl9EVCAuICIsDQogICAgICAgIHN0YXR1cyBMDQogICAgICAgICI7DQogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKENNU19EQl9QUkVGSVguIm1vZHVsZV9leGFjc3NfaXRlbSIsJGZpZWxkcyxbJ215c3FsJyA9PiAnVFlQRT1NeUlTQU0nXSk7DQogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOw0KDQogICAgLy8gQ29waWUgZGVzIG1peGlucyB2ZXJzIGxlcyBpdGVtcw0KICAgICRxdWVyeSA9ICINCiAgICAgICAgSU5TRVJUICIuQ01TX0RCX1BSRUZJWC4ibW9kdWxlX2V4YWNzc19pdGVtDQogICAgICAgIFNFTEVDVCAqIEZST00gIi5DTVNfREJfUFJFRklYLiJtb2R1bGVfZXhhY3NzX21peGluDQogICAgICAgICI7DQogICAgJGRiLT5FeGVjdXRlKCRxdWVyeSk7DQogICAgDQogICAgLy8gU3VwcHJlc3Npb24gZGVzIG1peGlucw0KICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoQ01TX0RCX1BSRUZJWC4nbW9kdWxlX2V4YWNzc19taXhpbicpOw0KICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsNCiAgICANCiAgICAvLyBDb3BpZSBkZXMgdmFyaWFibGVzIHZlcnMgbGVzIGl0ZW1zDQogICAgJHF1ZXJ5ID0gIg0KICAgICAgICBJTlNFUlQgIi5DTVNfREJfUFJFRklYLiJtb2R1bGVfZXhhY3NzX2l0ZW0NCiAgICAgICAgU0VMRUNUICogRlJPTSAiLkNNU19EQl9QUkVGSVguIm1vZHVsZV9leGFjc3NfdmFyaWFibGUNCiAgICAgICAgIjsNCiAgICAkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsNCiAgICANCiAgICAvLyBTdXBwcmVzc2lvbiBkZXMgdmFyaWFibGVzDQogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTChDTVNfREJfUFJFRklYLidtb2R1bGVfZXhhY3NzX3ZhcmlhYmxlJyk7DQogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOw0KICAgIA0KICAgIC8vIENvcGllIGRlcyBzdHlsZXNoZWV0cyB2ZXJzIGxlcyBpdGVtcw0KICAgICRxdWVyeSA9ICINCiAgICAgICAgSU5TRVJUICIuQ01TX0RCX1BSRUZJWC4ibW9kdWxlX2V4YWNzc19pdGVtDQogICAgICAgIFNFTEVDVCAqIEZST00gIi5DTVNfREJfUFJFRklYLiJtb2R1bGVfZXhhY3NzX3N0eWxlc2hlZXQNCiAgICAgICAgIjsNCiAgICAkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsNCiAgICANCiAgICAvLyBTdXBwcmVzc2lvbiBkZXMgc3R5bGVzaGVldHMNCiAgICAkc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKENNU19EQl9QUkVGSVguJ21vZHVsZV9leGFjc3Nfc3R5bGVzaGVldCcpOw0KICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsNCiAgICANCiAgICAvLyBTdXBwcmVzc2lvbiBkZXMgcGVybWlzc2lvbnMNCiAgICAkdGhpcy0+UmVtb3ZlUGVybWlzc2lvbigpOw0KICAgIA0KICAgIC8vIEFqb3V0IGRlIGxhIHBlcm1pc3Npb24NCiAgICAkdGhpcy0+Q3JlYXRlUGVybWlzc2lvbihFeGFDU1M6OlBFUk1fVVNFLCdFeGFDU1MgLSBVc2UnKTsNCiAgICANCiAgICAvLyBGaW4gZGUgbGEgbWlzZSDDoCBqb3VyDQogICAgJGN1cnJlbnRfdmVyc2lvbiA9ICIyLjAiOw0KICAgIA0KfQ0KDQoNCg0KDQoNCg0KDQoNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/moduleinfo.ini</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[W21vZHVsZV0KbmFtZSA9IEV4YUNTUwp2ZXJzaW9uID0gMi4wLjIKZGVzY3JpcHRpb24gPSAKYXV0aG9yID0gSm9jZWx5biBMdXNzZWF1IC0gRXhhY29yZQphdXRob3JlbWFpbCA9IGluZm9AZXhhY29yZS5mcgptaW5jbXN2ZXJzaW9uID0gMgoxMQ==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/admin_item_edit.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmIGVtcHR5KCRpdGVtKX0NCiAgICB7JHRhYl9oZWFkZXI9JG1vZC0+TGFuZygnYWRkJyl9DQp7ZWxzZX0NCiAgICB7JHRhYl9oZWFkZXI9JG1vZC0+TGFuZygnZWRpdCcpfQ0Key9pZn0NCg0Ke3RhYl9oZWFkZXIgbmFtZT0nZWRpdCcgbGFiZWw9JHRhYl9oZWFkZXJ9DQp7dGFiX3N0YXJ0IG5hbWU9J2VkaXQnfQ0KDQp7Zm9ybV9zdGFydCBpdGVtX2lkPSRpdGVtLmlkfGRlZmF1bHQ6Jyd9DQoNCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnbmFtZScpfTwvcD4NCiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4NCiAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9bmFtZSIgdmFsdWU9InskaXRlbS5uYW1lfGRlZmF1bHQ6Jyd9Ij4NCiAgICA8L3A+DQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskbW9kLT5MYW5nKCdjb250ZW50Jyl9PC9wPg0KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgICAgICB7Y21zX3RleHRhcmVhIHByZWZpeD0kYWN0aW9uaWQgbmFtZT1jb250ZW50IHZhbHVlPSRpdGVtLmNvbnRlbnR8ZGVmYXVsdDonJyBlbmFibGV3eXNpd3lnPWZhbHNlfQ0KICAgIDwvcD4NCjwvZGl2Pg0KDQp7aWYgIWVtcHR5KCRpdGVtLmRhdGVfY3JlYXRpb24pfQ0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskbW9kLT5MYW5nKCdkYXRlX2NyZWF0aW9uJyl9PC9wPg0KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgICAgICB7JGl0ZW0uZGF0ZV9jcmVhdGlvbn0NCiAgICA8L3A+DQo8L2Rpdj4NCnsvaWZ9DQoNCntpZiAhZW1wdHkoJGl0ZW0uZGF0ZV9tb2RpZmljYXRpb24pfQ0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskbW9kLT5MYW5nKCdkYXRlX21vZGlmaWNhdGlvbicpfTwvcD4NCiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4NCiAgICAgICAgeyRpdGVtLmRhdGVfbW9kaWZpY2F0aW9ufQ0KICAgIDwvcD4NCjwvZGl2Pg0Key9pZn0NCg0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskbW9kLT5MYW5nKCdzdGF0dXMnKX08L3A+DQogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InskYWN0aW9uaWR9c3RhdHVzIiB2YWx1ZT0iMCI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ieyRhY3Rpb25pZH1zdGF0dXMiIHZhbHVlPSIxIiB7aWYgIWVtcHR5KCRpdGVtKSBBTkQgJGl0ZW0uc3RhdHVzID09IHRydWV9Y2hlY2tlZHsvaWZ9Pg0KICAgIDwvcD4NCjwvZGl2Pg0KDQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JGFjdGlvbmlkfXN1Ym1pdF9zYXZlIiB2YWx1ZT0ieyRtb2QtPkxhbmcoJ3NhdmUnKX0iPg0KICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JGFjdGlvbmlkfXN1Ym1pdF9hcHBseSIgdmFsdWU9InskbW9kLT5MYW5nKCdhcHBseScpfSI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InskYWN0aW9uaWR9c3VibWl0X2NhbmNlbCIgdmFsdWU9InskbW9kLT5MYW5nKCdjYW5jZWwnKX0iPg0KICAgIDwvcD4NCjwvZGl2Pg0KDQp7Zm9ybV9lbmR9DQp7dGFiX2VuZH0=]]></data>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPg0KICAgIDxsaT4NCiAgICAgICAgPHN0cm9uZz5WZXJzaW9uIDIuMC4yPC9zdHJvbmc+DQogICAgICAgIDx1bD4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICBNaW5vciBidWcgZml4DQogICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIEZpeCAjMTA3NjkNCiAgICAgICAgICAgIDwvbGk+DQogICAgICAgIDwvdWw+DQogICAgPC9saT4NCiAgICA8bGk+DQogICAgICAgIFZlcnNpb24gMi4wLjENCiAgICAgICAgPHVsPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIE1pc3NpbmcgdHJhbnNsYXRpb25zDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdoZW4gY3JlYXRpbmcgYW4gaXRlbSBhbmQgc2F2aW5nIGl0IGJ5IHVzaW5nIHRoZQ0KICAgICAgICAgICAgICAgICJBcHBseSIgYnV0dG9uDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIFJlbW92aW5nIHRoZSAiQ2hhbmdlIG9yZGVyIiBidXR0b24gaWYgdGhlcmUgaXMgb25seSBvbmUgaXRlbQ0KICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICBDb21wYXRpYmlsaXR5IHdpdGggRXhhRXh0ZXJuYWxpemVyDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICA8L3VsPg0KICAgIDwvbGk+DQogICAgPGxpPg0KICAgICAgICBWZXJzaW9uIDIuMA0KICAgICAgICA8dWw+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgU3VwcG9ydCBDTVNNUyAyLjAuMSsNCiAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgUmVwbGFjZSBsZXNzcGhwIChsZWFmbykgd2l0aCBMZXNzLnBocCAob3llam9yZ2UpDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIFJlbW92ZSBDU1MgQ3J1c2ggc3VwcG9ydA0KICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICBVcGRhdGUgTGVzcy5waHAgKG95ZWpvcmdlKSB0byB2ZXJzaW9uIDEuNy4wLjkNCiAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgVXBkYXRlIGRlIHNjc3NwaHAgKGxlYWZvKSB0byB2ZXJzaW9uIDAuNS4xDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICA8L3VsPg0KICAgIDwvbGk+DQo8L3VsPg==]]></data>
	</file>
	<file>
	  <filename>/templates/defaultadmin.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e3RhYl9oZWFkZXIgbmFtZT0nZGFzaGJvYXJkJyBsYWJlbD0kbW9kLT5MYW5nKCdkYXNoYm9hcmRfdGFiX2hlYWRlcicpfQ0Ke3RhYl9oZWFkZXIgbmFtZT0nc2V0dGluZycgbGFiZWw9JG1vZC0+TGFuZygnc2V0dGluZ190YWJfaGVhZGVyJyl9DQp7dGFiX2hlYWRlciBuYW1lPSdkb25hdGlvbicgbGFiZWw9JG1vZC0+TGFuZygnc2V0dGluZ190YWJfZG9uYXRpb24nKX0NCg0Ke3RhYl9zdGFydCBuYW1lPSdkYXNoYm9hcmQnfQ0Ke2luY2x1ZGUgZmlsZT0nbW9kdWxlX2ZpbGVfdHBsOkV4YUNTUztkZWZhdWx0YWRtaW5fdGFiX2Rhc2hib2FyZC50cGwnIHNjb3BlPSdyb290J30NCg0Ke3RhYl9zdGFydCBuYW1lPSdzZXR0aW5nJ30NCntpbmNsdWRlIGZpbGU9J21vZHVsZV9maWxlX3RwbDpFeGFDU1M7ZGVmYXVsdGFkbWluX3RhYl9zZXR0aW5nLnRwbCcgc2NvcGU9J3Jvb3QnfQ0KDQp7dGFiX3N0YXJ0IG5hbWU9J2RvbmF0aW9uJ30NCntpbmNsdWRlIGZpbGU9J21vZHVsZV9maWxlX3RwbDpFeGFDU1M7ZGVmYXVsdGFkbWluX3RhYl9kb25hdGlvbi50cGwnIHNjb3BlPSdyb290J30NCg0Ke3RhYl9lbmR9]]></data>
	</file>
	<file>
	  <filename>/templates/defaultadmin_tab_dashboard.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmICRpdGVtX2xpc3R9DQoNCjx0YWJsZSBpZD0iaXRlbV9saXN0IiBjbGFzcz0icGFnZXRhYmxlIHNvcnRfdGFibGUiPg0KDQoJPHRoZWFkPg0KCQ0KCQk8dHI+DQoNCgkJCTx0aD4NCgkJCQl7JG1vZC0+TGFuZygnbmFtZScpfQ0KCQkJPC90aD4NCgkJCQ0KCQkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+DQoJCQkJeyRtb2QtPkxhbmcoJ3N0YXR1cycpfQ0KCQkJPC90aD4NCgkJCQ0KCQkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+DQoJCQk8L3RoPg0KICAgICAgICAgICAgDQogICAgICAgICAgICA8dGggY2xhc3M9InBhZ2VpY29uIj4NCgkJCTwvdGg+DQoJCQkNCgkJCTx0aCBjbGFzcz0icGFnZWljb24iPg0KCQkJPC90aD4NCg0KCQk8L3RyPg0KCQ0KCTwvdGhlYWQ+DQoJDQoJPHRib2R5Pg0KCQ0KCXtmb3JlYWNoICRpdGVtX2xpc3QgYXMgJGl0ZW19DQoNCgkJe2N5Y2xlIHZhbHVlcz0icm93MSxyb3cyIiBhc3NpZ249cm93Y2xhc3N9DQoJCTx0ciBpZD0iaXRlbV97JGl0ZW0uaWR9IiBjbGFzcz0ieyRyb3djbGFzc30iPg0KCQkNCgkJCTx0ZD4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJ7Y21zX2FjdGlvbl91cmwgYWN0aW9uPSJhZG1pbl9pdGVtX2VkaXQiIGl0ZW1faWQ9JGl0ZW0uaWR9IiB0aXRsZT0ieyRtb2QtPkxhbmcoJ2VkaXQnKX0iPg0KICAgICAgICAgICAgICAgICAgICB7JGl0ZW0ubmFtZX0NCiAgICAgICAgICAgICAgICA8L2E+DQoJCQk8L3RkPg0KCQkJDQoJCQk8dGQgY2xhc3M9InBhZ2Vwb3MiPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9IntjbXNfYWN0aW9uX3VybCBhY3Rpb249ImFkbWluX2l0ZW1fdG9nZ2xlIiBpdGVtX2lkPSRpdGVtLmlkfSIgdGl0bGU9InskbW9kLT5MYW5nKCdzdGF0dXNfY2hhbmdlJyl9Ij4NCiAgICAgICAgICAgICAgICAgICAge2lmICRpdGVtLnN0YXR1cyA9PSB0cnVlfQ0KICAgICAgICAgICAgICAgICAgICAgICAge2FkbWluX2ljb24gaWNvbj0ndHJ1ZS5naWYnfQ0KICAgICAgICAgICAgICAgICAgICB7ZWxzZX0NCiAgICAgICAgICAgICAgICAgICAgICAgIHthZG1pbl9pY29uIGljb249J2ZhbHNlLmdpZid9DQogICAgICAgICAgICAgICAgICAgIHsvaWZ9DQogICAgICAgICAgICAgICAgPC9hPg0KCQkJPC90ZD4NCgkJCQ0KCQkJPHRkIGNsYXNzPSJwYWdlcG9zIj4NCgkJCQk8YSBocmVmPSJ7Y21zX2FjdGlvbl91cmwgYWN0aW9uPSJhZG1pbl9pdGVtX2VkaXQiIGl0ZW1faWQ9JGl0ZW0uaWR9IiB0aXRsZT0ieyRtb2QtPkxhbmcoJ2VkaXQnKX0iPg0KICAgICAgICAgICAgICAgICAgICB7YWRtaW5faWNvbiBpY29uPSdlZGl0LmdpZid9DQogICAgICAgICAgICAgICAgPC9hPg0KCQkJPC90ZD4NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgPHRkIGNsYXNzPSJwYWdlcG9zIj4NCgkJCQk8YSBocmVmPSJ7Y21zX2FjdGlvbl91cmwgYWN0aW9uPSJhZG1pbl9pdGVtX2V4cG9ydCIgaXRlbV9pZD0kaXRlbS5pZH0iIHRpdGxlPSJ7JG1vZC0+TGFuZygnZXhwb3J0Jyl9Ij4NCiAgICAgICAgICAgICAgICAgICAge2FkbWluX2ljb24gaWNvbj0nZXhwb3J0LmdpZid9DQogICAgICAgICAgICAgICAgPC9hPg0KCQkJPC90ZD4NCgkJCQ0KCQkJPHRkIGNsYXNzPSJwYWdlcG9zIj4NCgkJCQk8YSBjbGFzcz0iaXRlbV9kZWxldGUiIGhyZWY9IntjbXNfYWN0aW9uX3VybCBhY3Rpb249ImFkbWluX2l0ZW1fZGVsZXRlIiBpdGVtX2lkPSRpdGVtLmlkfSIgdGl0bGU9InskbW9kLT5MYW5nKCdkZWxldGUnKX0iPg0KICAgICAgICAgICAgICAgICAgICB7YWRtaW5faWNvbiBpY29uPSdkZWxldGUuZ2lmJ30NCiAgICAgICAgICAgICAgICA8L2E+DQoJCQk8L3RkPg0KCQkJDQoJCTwvdHI+DQoNCgl7L2ZvcmVhY2h9DQoNCgk8L3Rib2R5Pg0KDQo8L3RhYmxlPg0KDQp7aWYgJGl0ZW1fbGlzdHxAY291bnQgPiAxfQ0Ke2Zvcm1fc3RhcnQgYWN0aW9uPSJhZG1pbl9pdGVtX3NvcnQiIGl0ZW1fc29ydD0iIn0NCiAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JGFjdGlvbmlkfXN1Ym1pdF9zb3J0IiB2YWx1ZT0ieyRtb2QtPkxhbmcoJ3NvcnRfc2F2ZScpfSI+DQp7Zm9ybV9lbmR9DQp7L2lmfQ0KDQp7ZWxzZX0NCg0KPHA+DQoJeyRtb2QtPkxhbmcoJ2l0ZW1fbGlzdF9lbXB0eScpfQ0KPC9wPg0KDQp7L2lmfQ0KDQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCTxwPg0KCQk8YSBocmVmPSJ7Y21zX2FjdGlvbl91cmwgYWN0aW9uPSJhZG1pbl9pdGVtX2VkaXQifSIgdGl0bGU9InskbW9kLT5MYW5nKCdhZGQnKX0iPg0KICAgICAgICAgICAge2FkbWluX2ljb24gaWNvbj0nbmV3b2JqZWN0LmdpZid9IHskbW9kLT5MYW5nKCdpdGVtX2FkZCcpfQ0KICAgICAgICA8L2E+DQoJPC9wPg0KPC9kaXY+DQoNCntpZiAkaXRlbV9saXN0fEBjb3VudCA+IDB9DQp7bGl0ZXJhbH0NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpew0KICAgIA0KICAgICAgICAkKCdhLml0ZW1fZGVsZXRlJykuY2xpY2soZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHJldHVybiBjb25maXJtKCd7L2xpdGVyYWx9eyRtb2QtPkxhbmcoJ2l0ZW1fZGVsZXRlX2NvbmZpcm0nKX17bGl0ZXJhbH0nKTsNCiAgICAgICAgfSkNCiAgICAgICAgDQogICAgICAgICQoIiNpdGVtX2xpc3Quc29ydF90YWJsZSIpLnRhYmxlRG5EKHsNCiAgICAgICAgICAgIG9uRHJhZ0NsYXNzOiAicm93MWhvdmVyIiwNCiAgICAgICAgICAgIG9uRHJvcDogZnVuY3Rpb24odGFibGUsIHJvdykgew0KICAgICAgICAgICAgICAgICQoIiNpdGVtX2xpc3QiKS5maW5kKCJ0Ym9keSB0ciIpLnJlbW92ZUNsYXNzKCk7DQogICAgICAgICAgICAgICAgJCgiI2l0ZW1fbGlzdCIpLmZpbmQoInRib2R5IHRyOm50aC1jaGlsZCgybisxKSIpLmFkZENsYXNzKCJyb3cxIik7DQogICAgICAgICAgICAgICAgJCgiI2l0ZW1fbGlzdCIpLmZpbmQoInRib2R5IHRyOm50aC1jaGlsZCgybikiKS5hZGRDbGFzcygicm93MiIpOw0KICAgICAgICAgICAgICAgIHZhciByb3dzID0gdGFibGUudEJvZGllc1swXS5yb3dzOw0KICAgICAgICAgICAgdmFyIHNvcnRzZXEgPSAnJyA7DQogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8cm93cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHNvcnRzZXEgKz0gcm93c1tpXS5pZCsifCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJCgnaW5wdXRbbmFtZT17L2xpdGVyYWx9eyRhY3Rpb25pZH17bGl0ZXJhbH1pdGVtX3NvcnRdJykudmFsKHNvcnRzZXEpIDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgIH0pOw0KPC9zY3JpcHQ+DQp7L2xpdGVyYWx9DQp7L2lmfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/defaultadmin_tab_donation.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4NCiAgICAgICAgeyRtb2QtPkxhbmcoJ2RvbmF0aW9uX2ludHJvZHVjdGlvbicpfQ0KICAgIDwvcD4NCjwvZGl2Pg0KDQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgICAgICA8Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSJfYmxhbmsiPg0KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY21kIiB2YWx1ZT0iX3MteGNsaWNrIj4NCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImVuY3J5cHRlZCIgdmFsdWU9Ii0tLS0tQkVHSU4gUEtDUzctLS0tLU1JSUhQd1lKS29aSWh2Y05BUWNFb0lJSE1EQ0NCeXdDQVFFeGdnRXdNSUlCTEFJQkFEQ0JsRENCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjBDQVFBd0RRWUpLb1pJaHZjTkFRRUJCUUFFZ1lCeDgvTU9sbG11WUk4TGl3dkQvOUpQMjA0dmNRNnF4Um5UZ056K2JDdXpVUWxvZVhEZXExU1h4WTVaTWlwei9TWXFHRTBJc1dFMzZPUDM5YmxWNzBoZDZwMlpqM0E2RUExN0ZaeGpUZTRmeEUrcmxCQ0xpK1dERXQ5QjZ5Rmd1bktHUEwvOHVXbU5mSXhFbmV4VUJ1aUh3VWExa0lvMmdUSnZRV1FLOUNJYlNqRUxNQWtHQlNzT0F3SWFCUUF3Z2J3R0NTcUdTSWIzRFFFSEFUQVVCZ2dxaGtpRzl3MERCd1FJRDBpU3ZYdXhMdDJBZ1pqSzFCV2Vnc3poUy9lVUhQeXlZTXlGU0VLaWFUT01nckRocUVZckdZOGpJQnYzazV1clNEdHJneklkQzRWRU5aeDlBbnFtcTFTQlBFRmc3S1Nva0FpcUlRZHY4eVpCdUVqalBreStOczYreGhVbzRSKzA3NTZQa1Y1dXNIYVQ3ZThtdXY2R3pQMnJ2SFFQSFQxN3gzSnVhTzg0TTJwMlBKelpkQjlWV25rN3AzYmhnNjYvNGIwNmZDRlo5ZFI2TUY5WEhsT2FyYjgzSHFDQ0E0Y3dnZ09ETUlJQzdLQURBZ0VDQWdFQU1BMEdDU3FHU0liM0RRRUJCUVVBTUlHT01Rc3dDUVlEVlFRR0V3SlZVekVMTUFrR0ExVUVDQk1DUTBFeEZqQVVCZ05WQkFjVERVMXZkVzUwWVdsdUlGWnBaWGN4RkRBU0JnTlZCQW9UQzFCaGVWQmhiQ0JKYm1NdU1STXdFUVlEVlFRTEZBcHNhWFpsWDJObGNuUnpNUkV3RHdZRFZRUURGQWhzYVhabFgyRndhVEVjTUJvR0NTcUdTSWIzRFFFSkFSWU5jbVZBY0dGNWNHRnNMbU52YlRBZUZ3MHdOREF5TVRNeE1ERXpNVFZhRncwek5UQXlNVE14TURFek1UVmFNSUdPTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNCTUNRMEV4RmpBVUJnTlZCQWNURFUxdmRXNTBZV2x1SUZacFpYY3hGREFTQmdOVkJBb1RDMUJoZVZCaGJDQkpibU11TVJNd0VRWURWUVFMRkFwc2FYWmxYMk5sY25Sek1SRXdEd1lEVlFRREZBaHNhWFpsWDJGd2FURWNNQm9HQ1NxR1NJYjNEUUVKQVJZTmNtVkFjR0Y1Y0dGc0xtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBd1VkTzNmeEV6RXRjbkk3WktaTDQxMlh2WlB1Z29uaTdpN0Q3cHJDZTBBdGFIVGM5N0NZZ203TnNBdEp5eE5MaXhtaExWOHB5SUVhaUhYV0FoOGZQS1crUjAxNytFbVhycjlFYXF1UG1zVnZUeXdBQUUxUE1OT0txbzJrbDRHeGl6OXpacUlhak9tMWZaR1djR1MwZjVKUTJrQnFOYnZiZzIvWmErR0ovcXdVQ0F3RUFBYU9CN2pDQjZ6QWRCZ05WSFE0RUZnUVVscDk4dThadkY3MVpQMUxYQ2h2c0VOWmtsR3N3Z2JzR0ExVWRJd1NCc3pDQnNJQVVscDk4dThadkY3MVpQMUxYQ2h2c0VOWmtsR3VoZ1pTa2daRXdnWTR4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkRRVEVXTUJRR0ExVUVCeE1OVFc5MWJuUmhhVzRnVm1sbGR6RVVNQklHQTFVRUNoTUxVR0Y1VUdGc0lFbHVZeTR4RXpBUkJnTlZCQXNVQ214cGRtVmZZMlZ5ZEhNeEVUQVBCZ05WQkFNVUNHeHBkbVZmWVhCcE1Sd3dHZ1lKS29aSWh2Y05BUWtCRmcxeVpVQndZWGx3WVd3dVkyOXRnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUFnVjg2VnBxQVd1WHZYNk9ybzRxSjF0WVZJVDVEZ1dwRTY5MkFnNDIySDd5UklyLzlqL2lLRzRUaGlhL09mbHg0VGRMK0lGSkJBeVBLOXY2elpOWnRCZ1BCeW5YYjA0OGhzUDE2bDJ2aTBrNVEySktpUERzRWZCaEdJK0hueExYRWFVV0FjVmZDc1FGdmQyQTFzeFJyNjdpcDV5Mnd3QmVsVWVjUDNBakorWWN4Z2dHYU1JSUJsZ0lCQVRDQmxEQ0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkJNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0ExVUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVFQXhRSWJHbDJaVjloY0dreEhEQWFCZ2txaGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIyMENBUUF3Q1FZRkt3NERBaG9GQUtCZE1CZ0dDU3FHU0liM0RRRUpBekVMQmdrcWhraUc5dzBCQndFd0hBWUpLb1pJaHZjTkFRa0ZNUThYRFRFMU1URXlNekV6TkRZMU1Wb3dJd1lKS29aSWh2Y05BUWtFTVJZRUZHOVhnbnhXMVFQZUJnMGFZOTNMYjBEUlJ0MlJNQTBHQ1NxR1NJYjNEUUVCQVFVQUJJR0FPakNDd21zWWpnaGQ1QTNHcDVIRUp5MmQ5QU9ZanJlaDNRMGVqa3hxSkhMUXB2MzhpTDRsL2ZCSW9LVm13NmRDUUR5WnR3elVnZ3J1QnZqbllCSG9SMUYyZkZNbzFqcWxaa1lUNXdvb21oNEpoQ1B5dTdoSlNYUHdzNWJuanlodXpyY3lyUGpLN1c0d1I2RGdGOUkxM0gxd3V1MitjMjZOL2JmU2ZwTUtpOEE9LS0tLS1FTkQgUEtDUzctLS0tLSI+DQogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsb2JqZWN0cy5jb20vZnJfRlIvRlIvaS9idG4vYnRuX2RvbmF0ZUNDX0xHLmdpZiIgYm9yZGVyPSIwIiBuYW1lPSJzdWJtaXQiIGFsdD0iUGF5UGFsLCBsZSByw6lmbGV4ZSBzw6ljdXJpdMOpIHBvdXIgcGF5ZXIgZW4gbGlnbmUiPg0KICAgICAgICAgICAgPGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBzcmM9Imh0dHBzOi8vd3d3LnBheXBhbG9iamVjdHMuY29tL2ZyX0ZSL2kvc2NyL3BpeGVsLmdpZiIgd2lkdGg9IjEiIGhlaWdodD0iMSI+DQogICAgICAgIDwvZm9ybT4NCiAgICA8L3A+DQo8L2Rpdj4=]]></data>
	</file>
	<file>
	  <filename>/templates/defaultadmin_tab_setting.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGZpZWxkc2V0Pg0KDQogICAgPGxlZ2VuZD4NCiAgICAgICAgeyRtb2QtPkxhbmcoJ3ByZXByb2Nlc3NvcicpfQ0KICAgIDwvbGVnZW5kPg0KICAgIA0KICAgIHtmb3JtX3N0YXJ0fQ0KICAgIA0KICAgIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygncHJlcHJvY2Vzc29yJyl9PC9wPg0KICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgICAgICAgIDxzZWxlY3QgbmFtZT0ieyRhY3Rpb25pZH1wcmVwcm9jZXNzb3IiPg0KICAgICAgICAgICAge2ZvcmVhY2ggJHByZXByb2Nlc3Nvcl9saXN0IGFzICRwcmVwcm9jZXNzb3J9DQogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ieyRwcmVwcm9jZXNzb3IuYWxpYXN9IiB7aWYgJHNldHRpbmcucHJlcHJvY2Vzc29yID09ICRwcmVwcm9jZXNzb3IuYWxpYXN9c2VsZWN0ZWR7L2lmfT57JHByZXByb2Nlc3Nvci5uYW1lfTwvb3B0aW9uPg0KICAgICAgICAgICAgey9mb3JlYWNofQ0KICAgICAgICAgIDwvc2VsZWN0Pg0KICAgICAgIDwvcD4NCiAgICA8L2Rpdj4NCg0KICAgIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQogICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ieyRhY3Rpb25pZH1zdWJtaXRfcHJlcHJvY2Vzc29yIiB2YWx1ZT0ieyRtb2QtPkxhbmcoJ3NhdmUnKX0iPg0KICAgICAgIDwvcD4NCiAgICA8L2Rpdj4NCg0KICAgIHtmb3JtX2VuZH0NCiAgICANCjwvZmllbGRzZXQ+DQoNCjxmaWVsZHNldD4NCg0KICAgIDxsZWdlbmQ+DQogICAgICAgIEltcG9ydGF0aW9uDQogICAgPC9sZWdlbmQ+DQogICAgDQogICAge2Zvcm1fc3RhcnR9DQogICAgDQogICAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgICAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskbW9kLT5MYW5nKCdmaWxlX3RvX2ltcG9ydCcpfTwvcD4NCiAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4NCiAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0ieyRhY3Rpb25pZH1maWxlIj4NCiAgICAgICA8L3A+DQogICAgPC9kaXY+DQoNCiAgICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InskYWN0aW9uaWR9c3VibWl0X2ltcG9ydCIgdmFsdWU9InskbW9kLT5MYW5nKCdpbXBvcnQnKX0iPg0KICAgICAgIDwvcD4NCiAgICA8L2Rpdj4NCg0KICAgIHtmb3JtX2VuZH0NCiAgICANCjwvZmllbGRzZXQ+DQoNCntpZiAkc2V0dGluZy5leGFleHRlcm5hbGl6ZXJfYXZhaWxhYmxlfQ0KPGZpZWxkc2V0Pg0KDQogICAgPGxlZ2VuZD4NCiAgICAgICAgeyRtb2QtPkxhbmcoJ2V4YWV4dGVybmFsaXplcicpfQ0KICAgIDwvbGVnZW5kPg0KICAgIA0KICAgIHtmb3JtX3N0YXJ0fQ0KICAgIA0KICAgIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnZXhhZXh0ZXJuYWxpemVyX2NvbXBhdGliaWxpdHknKX08L3A+DQogICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ7JGFjdGlvbmlkfWV4YWV4dGVybmFsaXplcl9jb21wYXRpYmlsaXR5IiB2YWx1ZT0iMCI+DQogICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InskYWN0aW9uaWR9ZXhhZXh0ZXJuYWxpemVyX2NvbXBhdGliaWxpdHkiIHZhbHVlPSIxIiB7aWYgJHNldHRpbmcuZXhhZXh0ZXJuYWxpemVyX2NvbXBhdGliaWxpdHkgPT0gdHJ1ZX1jaGVja2Vkey9pZn0+DQogICAgICAgPC9wPg0KICAgIDwvZGl2Pg0KDQogICAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4NCiAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JGFjdGlvbmlkfXN1Ym1pdF9leGFleHRlcm5hbGl6ZXIiIHZhbHVlPSJ7JG1vZC0+TGFuZygnc2F2ZScpfSI+DQogICAgICAgPC9wPg0KICAgIDwvZGl2Pg0KDQogICAge2Zvcm1fZW5kfQ0KICAgIA0KPC9maWVsZHNldD4NCnsvaWZ9]]></data>
	</file>
</module>
